golly-3.3-src/0000755000175000017500000000000013543257427010307 500000000000000golly-3.3-src/gollybase/0000755000175000017500000000000013543257426012267 500000000000000golly-3.3-src/gollybase/ghashbase.cpp0000644000175000017500000016231413543255652014646 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /* * jvn 0.99 by Radical Eye Software. * * All good ideas here were originated by Gosper or Bell or others, I'm * sure, and all bad ones by yours truly. * * The main reason I wrote this program was to attempt to push out the * evaluation of metacatacryst as far as I could. So this program * really does very little other than compute life as far into the * future as possible, using as little memory as possible (and reusing * it if necessary). No UI, few options. */ #include "ghashbase.h" #include "util.h" #include #include using namespace std ; /* * Power of two hash sizes work fine. */ #ifdef PRIMEMOD #define HASHMOD(a) ((a)%hashprime) static g_uintptr_t nexthashsize(g_uintptr_t i) { g_uintptr_t j ; i |= 1 ; for (;; i+=2) { for (j=3; j*j<=i; j+=2) if (i % j == 0) break ; if (j*j > i) return i ; } } #else #define HASHMOD(a) ((a)&(hashmask)) static g_uintptr_t nexthashsize(g_uintptr_t i) { while ((i & (i - 1))) i += (i & (1 + ~i)) ; // i & - i is more idiomatic but generates warning return i ; } #endif /* * We do now support garbage collection, but there are some routines we * call frequently to help us. */ #ifdef PRIMEMOD #define ghnode_hash(a,b,c,d) (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) #else g_uintptr_t ghnode_hash(void *a, void *b, void *c, void *d) { g_uintptr_t r = (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) ; r += (r >> 11) ; return r ; } #endif #define ghleaf_hash(a,b,c,d) (65537*(d)+257*(c)+17*(b)+5*(a)) /* * Resize the hash. The max load factor defined here does not actually * yield the maximum load factor the hash will see, because when we * do the last resize before exhausting memory, we may find we are * not permitted (while keeping total memory consumption below the * limit) to do the resize, so the actual max load factor may be * somewhat higher. Conversely, because we double the hash size * each time, the actual final max load factor may be less than this. * Additional code can be added to manage this, but after some * experimentation, it has been found that the impact is tiny, so * we are keeping the code simple. Nonetheless, this factor can be * tweaked in the case where you absolutely want as many nodes as * possible in memory, and are willing to use a large load factor to * permit this; with the move-to-front heuristic, the code actually * handles a large load factor fairly well. */ double ghashbase::maxloadfactor = 0.7 ; void ghashbase::resize() { #ifndef NOGCBEFORERESIZE if (okaytogc) { do_gc(0) ; } #endif g_uintptr_t i, nhashprime = nexthashsize(2 * hashprime) ; ghnode *p, **nhashtab ; if (hashprime > (totalthings >> 2)) { if (alloced > maxmem || nhashprime * sizeof(ghnode *) > (maxmem - alloced)) { hashlimit = G_MAX ; return ; } } if (verbose) { sprintf(statusline, "Resizing hash to %" PRIuPTR "...", nhashprime) ; lifestatus(statusline) ; } nhashtab = (ghnode **)calloc(nhashprime, sizeof(ghnode *)) ; if (nhashtab == 0) { lifewarning("Out of memory; running in a somewhat slower mode; " "try reducing the hash memory limit after restarting.") ; hashlimit = G_MAX ; return ; } alloced += sizeof(ghnode *) * (nhashprime - hashprime) ; g_uintptr_t ohashprime = hashprime ; hashprime = nhashprime ; #ifndef PRIMEMOD hashmask = hashprime - 1 ; #endif for (i=0; inext ; g_uintptr_t h ; if (is_ghnode(p)) { h = ghnode_hash(p->nw, p->ne, p->sw, p->se) ; } else { ghleaf *l = (ghleaf *)p ; h = ghleaf_hash(l->nw, l->ne, l->sw, l->se) ; } h = HASHMOD(h) ; p->next = nhashtab[h] ; nhashtab[h] = p ; p = np ; } } free(hashtab) ; hashtab = nhashtab ; hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * These next two routines are (nearly) our only hash table access * routines; we simply look up the passed in information. If we * find it in the hash table, we return it; otherwise, we build a * new ghnode and store it in the hash table, and return that. */ ghnode *ghashbase::find_ghnode(ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) { ghnode *p ; g_uintptr_t h = ghnode_hash(nw,ne,sw,se) ; ghnode *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newghnode() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; save(p) ; if (hashpop > hashlimit) resize() ; return p ; } ghleaf *ghashbase::find_ghleaf(state nw, state ne, state sw, state se) { ghleaf *p ; ghleaf *pred = 0 ; g_uintptr_t h = ghleaf_hash(nw, ne, sw, se) ; h = HASHMOD(h) ; for (p=(ghleaf *)hashtab[h]; p; p = (ghleaf *)p->next) { if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se && !is_ghnode(p)) { if (pred) { pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = (ghnode *)p ; } return (ghleaf *)save((ghnode *)p) ; } pred = p ; } p = newghleaf() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->leafpop = bigint((short)((nw != 0) + (ne != 0) + (sw != 0) + (se != 0))) ; p->isghnode = 0 ; p->next = hashtab[h] ; hashtab[h] = (ghnode *)p ; hashpop++ ; save((ghnode *)p) ; if (hashpop > hashlimit) resize() ; return p ; } /* * The following routine does the same, but first it checks to see if * the cached result is any good. If it is, it directly returns that. * Otherwise, it figures out whether to call the ghleaf routine or the * non-ghleaf routine by whether two ghnodes down is a ghleaf ghnode or not. * (We'll understand why this is a bit later.) All the sp stuff is * stack pointer and garbage collection stuff. */ ghnode *ghashbase::getres(ghnode *n, int depth) { if (n->res) return n->res ; ghnode *res = 0 ; /** * This routine be the only place we assign to res. We use * the fact that the poll routine is *sticky* to allow us to * manage unwinding the stack without munging our data * structures. Note that there may be many find_ghnodes * and getres called before we finally actually exit from * here, because the stack is deep and we don't want to * put checks throughout the code. Instead we need two * calls here, one to prevent us going deeper, and another * to prevent us from destroying the cache field. */ if (poller->poll() || softinterrupt) return zeroghnode(depth-1) ; int sp = gsp ; if (running_hperf.fastinc(depth, ngens < depth)) running_hperf.report(inc_hperf, verbose) ; depth-- ; if (ngens >= depth) { if (is_ghnode(n->nw)) { res = dorecurs(n->nw, n->ne, n->sw, n->se, depth) ; } else { res = (ghnode *)dorecurs_ghleaf((ghleaf *)n->nw, (ghleaf *)n->ne, (ghleaf *)n->sw, (ghleaf *)n->se) ; } } else { if (is_ghnode(n->nw)) { res = dorecurs_half(n->nw, n->ne, n->sw, n->se, depth) ; } else { lifefatal("! can't happen") ; } } pop(sp) ; if (softinterrupt || poller->isInterrupted()) // don't assign this to the cache field! res = zeroghnode(depth) ; else { if (ngens < depth && halvesdone < 1000) halvesdone++ ; n->res = res ; } return res ; } #ifdef USEPREFETCH void ghashbase::setupprefetch(ghsetup_t &su, ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) { su.h = ghnode_hash(nw,ne,sw,se) ; su.nw = nw ; su.ne = ne ; su.sw = sw ; su.se = se ; su.prefetch(hashtab + HASHMOD(su.h)) ; } ghnode *ghashbase::find_ghnode(ghsetup_t &su) { ghnode *p ; ghnode *pred = 0 ; g_uintptr_t h = HASHMOD(su.h) ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (su.nw == p->nw && su.ne == p->ne && su.sw == p->sw && su.se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newghnode() ; p->nw = su.nw ; p->ne = su.ne ; p->sw = su.sw ; p->se = su.se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; save(p) ; if (hashpop > hashlimit) resize() ; return p ; } ghnode *ghashbase::dorecurs(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) { int sp = gsp ; ghsetup_t su[5] ; setupprefetch(su[2], n->se, ne->sw, t->ne, e->nw) ; setupprefetch(su[0], n->ne, ne->nw, n->se, ne->sw) ; setupprefetch(su[1], ne->sw, ne->se, e->nw, e->ne) ; setupprefetch(su[3], n->sw, n->se, t->nw, t->ne) ; setupprefetch(su[4], t->ne, e->nw, t->se, e->sw) ; ghnode *t00 = getres(n, depth), *t01 = getres(find_ghnode(su[0]), depth), *t02 = getres(ne, depth), *t12 = getres(find_ghnode(su[1]), depth), *t11 = getres(find_ghnode(su[2]), depth), *t10 = getres(find_ghnode(su[3]), depth), *t20 = getres(t, depth), *t21 = getres(find_ghnode(su[4]), depth), *t22 = getres(e, depth) ; setupprefetch(su[0], t11, t12, t21, t22) ; setupprefetch(su[1], t10, t11, t20, t21) ; setupprefetch(su[2], t00, t01, t10, t11) ; setupprefetch(su[3], t01, t02, t11, t12) ; ghnode *t44 = getres(find_ghnode(su[0]), depth), *t43 = getres(find_ghnode(su[1]), depth), *t33 = getres(find_ghnode(su[2]), depth), *t34 = getres(find_ghnode(su[3]), depth) ; n = find_ghnode(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } #else /* * So let's say the cached way failed. How do we do it the slow way? * Recursively, of course. For an n-square (composed of the four * n/2-squares passed in, compute the n/2-square that is n/4 * generations ahead. * * This routine works exactly the same as the ghleafres() routine, only * instead of working on an 8-square, we're working on an n-square, * returning an n/2-square, and we build that n/2-square by first building * 9 n/4-squares, use those to calculate 4 more n/4-squares, and * then put these together into a new n/2-square. Simple, eh? */ ghnode *ghashbase::dorecurs(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) { int sp = gsp ; ghnode *t11 = getres(find_ghnode(n->se, ne->sw, t->ne, e->nw), depth), *t00 = getres(n, depth), *t01 = getres(find_ghnode(n->ne, ne->nw, n->se, ne->sw), depth), *t02 = getres(ne, depth), *t12 = getres(find_ghnode(ne->sw, ne->se, e->nw, e->ne), depth), *t10 = getres(find_ghnode(n->sw, n->se, t->nw, t->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_ghnode(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth), *t44 = getres(find_ghnode(t11, t12, t21, t22), depth), *t43 = getres(find_ghnode(t10, t11, t20, t21), depth), *t33 = getres(find_ghnode(t00, t01, t10, t11), depth), *t34 = getres(find_ghnode(t01, t02, t11, t12), depth) ; n = find_ghnode(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } #endif /* * Same as above, but we only do one step instead of 2. */ ghnode *ghashbase::dorecurs_half(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) { int sp = gsp ; if (depth > 1) { ghnode *t00 = find_ghnode(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw), *t01 = find_ghnode(n->ne->se, ne->nw->sw, n->se->ne, ne->sw->nw), *t02 = find_ghnode(ne->nw->se, ne->ne->sw, ne->sw->ne, ne->se->nw), *t10 = find_ghnode(n->sw->se, n->se->sw, t->nw->ne, t->ne->nw), *t11 = find_ghnode(n->se->se, ne->sw->sw, t->ne->ne, e->nw->nw), *t12 = find_ghnode(ne->sw->se, ne->se->sw, e->nw->ne, e->ne->nw), *t20 = find_ghnode(t->nw->se, t->ne->sw, t->sw->ne, t->se->nw), *t21 = find_ghnode(t->ne->se, e->nw->sw, t->se->ne, e->sw->nw), *t22 = find_ghnode(e->nw->se, e->ne->sw, e->sw->ne, e->se->nw) ; n = find_ghnode(getres(find_ghnode(t00, t01, t10, t11), depth), getres(find_ghnode(t01, t02, t11, t12), depth), getres(find_ghnode(t10, t11, t20, t21), depth), getres(find_ghnode(t11, t12, t21, t22), depth)) ; } else { ghnode *t00 = getres(n, depth), *t01 = getres(find_ghnode(n->ne, ne->nw, n->se, ne->sw), depth), *t10 = getres(find_ghnode(n->sw, n->se, t->nw, t->ne), depth), *t11 = getres(find_ghnode(n->se, ne->sw, t->ne, e->nw), depth), *t02 = getres(ne, depth), *t12 = getres(find_ghnode(ne->sw, ne->se, e->nw, e->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_ghnode(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth) ; n = find_ghnode((ghnode *)find_ghleaf(((ghleaf *)t00)->se, ((ghleaf *)t01)->sw, ((ghleaf *)t10)->ne, ((ghleaf *)t11)->nw), (ghnode *)find_ghleaf(((ghleaf *)t01)->se, ((ghleaf *)t02)->sw, ((ghleaf *)t11)->ne, ((ghleaf *)t12)->nw), (ghnode *)find_ghleaf(((ghleaf *)t10)->se, ((ghleaf *)t11)->sw, ((ghleaf *)t20)->ne, ((ghleaf *)t21)->nw), (ghnode *)find_ghleaf(((ghleaf *)t11)->se, ((ghleaf *)t12)->sw, ((ghleaf *)t21)->ne, ((ghleaf *)t22)->nw)) ; } pop(sp) ; return save(n) ; } /* * If the ghnode is a 16-ghnode, then the constituents are leaves, so we * need a very similar but still somewhat different subroutine. Since * we do not (yet) garbage collect leaves, we don't need all that * save/pop mumbo-jumbo. */ ghleaf *ghashbase::dorecurs_ghleaf(ghleaf *nw, ghleaf *ne, ghleaf *sw, ghleaf *se) { return find_ghleaf( slowcalc(nw->nw, nw->ne, ne->nw, nw->sw, nw->se, ne->sw, sw->nw, sw->ne, se->nw), slowcalc(nw->ne, ne->nw, ne->ne, nw->se, ne->sw, ne->se, sw->ne, se->nw, se->ne), slowcalc(nw->sw, nw->se, ne->sw, sw->nw, sw->ne, se->nw, sw->sw, sw->se, se->sw), slowcalc(nw->se, ne->sw, ne->se, sw->ne, se->nw, se->ne, sw->se, se->sw, se->se)) ; } /* * We keep free ghnodes in a linked list for allocation, and we allocate * them 1000 at a time. */ ghnode *ghashbase::newghnode() { ghnode *r ; if (freeghnodes == 0) { int i ; freeghnodes = (ghnode *)calloc(1001, sizeof(ghnode)) ; if (freeghnodes == 0) lifefatal("Out of memory; try reducing the hash memory limit.") ; alloced += 1001 * sizeof(ghnode) ; freeghnodes->next = ghnodeblocks ; ghnodeblocks = freeghnodes++ ; for (i=0; i<999; i++) { freeghnodes[1].next = freeghnodes ; freeghnodes++ ; } totalthings += 1000 ; } if (freeghnodes->next == 0 && alloced + 1000 * sizeof(ghnode) > maxmem && okaytogc) { do_gc(0) ; } r = freeghnodes ; freeghnodes = freeghnodes->next ; return r ; } /* * Leaves are the same. */ ghleaf *ghashbase::newghleaf() { ghleaf *r = (ghleaf *)newghnode() ; new(&(r->leafpop))bigint ; return r ; } /* * Sometimes we want the new ghnode or ghleaf to be automatically cleared * for us. */ ghnode *ghashbase::newclearedghnode() { return (ghnode *)memset(newghnode(), 0, sizeof(ghnode)) ; } ghleaf *ghashbase::newclearedghleaf() { ghleaf *r = (ghleaf *)newclearedghnode() ; new(&(r->leafpop))bigint ; return r ; } ghashbase::ghashbase() { hashprime = nexthashsize(1000) ; #ifndef PRIMEMOD hashmask = hashprime - 1 ; #endif hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; hashpop = 0 ; hashtab = (ghnode **)calloc(hashprime, sizeof(ghnode *)) ; if (hashtab == 0) lifefatal("Out of memory (1).") ; alloced = hashprime * sizeof(ghnode *) ; ngens = 0 ; stacksize = 0 ; halvesdone = 0 ; nzeros = 0 ; stack = 0 ; gsp = 0 ; maxmem = 256 * 1024 * 1024 ; freeghnodes = 0 ; okaytogc = 0 ; totalthings = 0 ; ghnodeblocks = 0 ; zeroghnodea = 0 ; /* * We initialize our universe to be a 16-square. We are in drawing * mode at this point. */ root = (ghnode *)newclearedghnode() ; population = 0 ; generation = 0 ; increment = 1 ; setincrement = 1 ; nonpow2 = 1 ; pow2step = 1 ; llsize = 0 ; depth = 1 ; hashed = 0 ; popValid = 0 ; needPop = 0 ; inGC = 0 ; cacheinvalid = 0 ; gccount = 0 ; gcstep = 0 ; running_hperf.clear() ; inc_hperf = running_hperf ; step_hperf = running_hperf ; softinterrupt = 0 ; } /** * Destructor frees memory. */ ghashbase::~ghashbase() { free(hashtab) ; while (ghnodeblocks) { ghnode *r = ghnodeblocks ; ghnodeblocks = ghnodeblocks->next ; free(r) ; } if (zeroghnodea) free(zeroghnodea) ; if (stack) free(stack) ; if (llsize) { delete [] llxb ; delete [] llyb ; } } /** * Set increment. */ void ghashbase::setIncrement(bigint inc) { if (inc < increment) softinterrupt = 1 ; increment = inc ; } /** * Do a step. */ void ghashbase::step() { poller->bailIfCalculating() ; // we use while here because the increment may be changed while we are // doing the hashtable sweep; if that happens, we may need to sweep // again. while (1) { int cleareddownto = 1000000000 ; softinterrupt = 0 ; while (increment != setincrement) { bigint pendingincrement = increment ; int newpow2 = 0 ; bigint t = pendingincrement ; while (t > 0 && t.even()) { newpow2++ ; t.div2() ; } nonpow2 = t.low31() ; if (t != nonpow2) lifefatal("bad increment") ; int downto = newpow2 ; if (ngens < newpow2) downto = ngens ; if (newpow2 != ngens && cleareddownto > downto) { new_ngens(newpow2) ; cleareddownto = downto ; } else { ngens = newpow2 ; } setincrement = pendingincrement ; pow2step = 1 ; while (newpow2--) pow2step += pow2step ; } gcstep = 0 ; running_hperf.genval = generation.todouble() ; for (int i=0; iisInterrupted()) // we *were* interrupted break ; popValid = 0 ; root = newroot ; depth = ghnode_depth(root) ; } running_hperf.reportStep(step_hperf, inc_hperf, generation.todouble(), verbose) ; if (poller->isInterrupted() || !softinterrupt) break ; } } void ghashbase::setcurrentstate(void *n) { if (root != (ghnode *)n) { root = (ghnode *)n ; depth = ghnode_depth(root) ; popValid = 0 ; } } /* * Set the max memory */ void ghashbase::setMaxMemory(int newmemlimit) { if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (alloced > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmem = newlimit ; hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; } /** * Clear everything. */ void ghashbase::clearall() { lifefatal("clearall not implemented yet") ; } /* * This routine expands our universe by a factor of two, maintaining * centering. We use four new ghnodes, and *reuse* the root so this cannot * be called after we've started hashing. */ void ghashbase::pushroot_1() { ghnode *t ; t = newclearedghnode() ; t->se = root->nw ; root->nw = t ; t = newclearedghnode() ; t->sw = root->ne ; root->ne = t ; t = newclearedghnode() ; t->ne = root->sw ; root->sw = t ; t = newclearedghnode() ; t->nw = root->se ; root->se = t ; depth++ ; } /* * Return the depth of this ghnode (2 is 8x8). */ int ghashbase::ghnode_depth(ghnode *n) { int depth = 0 ; while (is_ghnode(n)) { depth++ ; n = n->nw ; } return depth ; } /* * This routine returns the canonical clear space ghnode at a particular * depth. */ ghnode *ghashbase::zeroghnode(int depth) { while (depth >= nzeros) { int nnzeros = 2 * nzeros + 10 ; zeroghnodea = (ghnode **)realloc(zeroghnodea, nnzeros * sizeof(ghnode *)) ; if (zeroghnodea == 0) lifefatal("Out of memory (2).") ; alloced += (nnzeros - nzeros) * sizeof(ghnode *) ; while (nzeros < nnzeros) zeroghnodea[nzeros++] = 0 ; } if (zeroghnodea[depth] == 0) { if (depth == 0) { zeroghnodea[depth] = (ghnode *)find_ghleaf(0, 0, 0, 0) ; } else { ghnode *z = zeroghnode(depth-1) ; zeroghnodea[depth] = find_ghnode(z, z, z, z) ; } } return zeroghnodea[depth] ; } /* * Same, but with hashed ghnodes. */ ghnode *ghashbase::pushroot(ghnode *n) { int depth = ghnode_depth(n) ; zeroghnode(depth+1) ; // ensure zeros are deep enough ghnode *z = zeroghnode(depth-1) ; return find_ghnode(find_ghnode(z, z, z, n->nw), find_ghnode(z, z, n->ne, z), find_ghnode(z, n->sw, z, z), find_ghnode(n->se, z, z, z)) ; } /* * Here is our recursive routine to set a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. We allocate new ghnodes and * leaves on our way down. * * Note that at this point our universe lives outside the hash table * and has not been canonicalized, and that many of the pointers in * the ghnodes can be null. We'll patch this up in due course. */ ghnode *ghashbase::gsetbit(ghnode *n, int x, int y, int newstate, int depth) { if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (hashed) { state nw = l->nw ; state sw = l->sw ; state ne = l->ne ; state se = l->se ; if (x < 0) if (y < 0) sw = (state)newstate ; else nw = (state)newstate ; else if (y < 0) se = (state)newstate ; else ne = (state)newstate ; return save((ghnode *)find_ghleaf(nw, ne, sw, se)) ; } if (x < 0) if (y < 0) l->sw = (state)newstate ; else l->nw = (state)newstate ; else if (y < 0) l->se = (state)newstate ; else l->ne = (state)newstate ; return (ghnode *)l ; } else { unsigned int w = 0, wh = 0 ; if (depth > 31) { if (depth == 32) wh = 0x80000000 ; w = 0 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } depth-- ; ghnode **nptr ; if (depth+1 == this->depth || depth < 31) { if (x < 0) { if (y < 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y < 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } } else { if (x >= 0) { if (y >= 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y >= 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } } if (*nptr == 0) { if (depth == 0) *nptr = (ghnode *)newclearedghleaf() ; else *nptr = newclearedghnode() ; } ghnode *s = gsetbit(*nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, newstate, depth) ; if (hashed) { ghnode *nw = (nptr == &(n->nw) ? s : n->nw) ; ghnode *sw = (nptr == &(n->sw) ? s : n->sw) ; ghnode *ne = (nptr == &(n->ne) ? s : n->ne) ; ghnode *se = (nptr == &(n->se) ? s : n->se) ; if (x < 0) { if (y < 0) sw = s ; else nw = s ; } else { if (y < 0) se = s ; else ne = s ; } n = save(find_ghnode(nw, ne, sw, se)) ; } else { *nptr = s ; } return n ; } } /* * Here is our recursive routine to get a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int ghashbase::getbit(ghnode *n, int x, int y, int depth) { struct ghnode tnode ; while (depth >= 32) { tnode.nw = n->nw->se ; tnode.ne = n->ne->sw ; tnode.sw = n->sw->ne ; tnode.se = n->se->nw ; n = &tnode ; depth-- ; } if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (x < 0) if (y < 0) return l->sw ; else return l->nw ; else if (y < 0) return l->se ; else return l->ne ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 32) { if (depth == 32) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } ghnode *nptr ; depth-- ; if (x < 0) { if (y < 0) nptr = n->sw ; else nptr = n->nw ; } else { if (y < 0) nptr = n->se ; else nptr = n->ne ; } if (nptr == 0 || nptr == zeroghnode(depth)) return 0 ; return getbit(nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, depth) ; } } /* * Here is our recursive routine to get the next bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int ghashbase::nextbit(ghnode *n, int x, int y, int depth, int &v) { if (n == 0 || n == zeroghnode(depth)) return -1 ; if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (y < 0) { if (x < 0 && l->sw) { v = l->sw ; return 0 ; } if (l->se) { v = l->se ; return -x ; } } else { if (x < 0 && l->nw) { v = l->nw ; return 0 ; } if (l->ne) { v = l->ne ; return -x ; } } return -1 ; // none found } else { unsigned int w = 1 << depth ; unsigned int wh = w >> 1 ; ghnode *lft, *rght ; depth-- ; if (y < 0) { lft = n->sw ; rght = n->se ; } else { lft = n->nw ; rght = n->ne ; } int r = 0 ; if (x < 0) { int t = nextbit(lft, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth, v) ; if (t >= 0) return t ; r = -x ; x = 0 ; } int t = nextbit(rght, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth, v) ; if (t >= 0) return r + t ; return -1 ; } } /* * Our nonrecurse top-level bit setting routine simply expands the * universe as necessary to encompass the passed-in coordinates, and * then invokes the recursive setbit. Right now it works hashed or * unhashed (but it's faster when unhashed). We also turn on the inGC * flag to inhibit popcount. */ int ghashbase::setcell(int x, int y, int newstate) { if (newstate < 0 || newstate >= maxCellStates) return -1 ; if (hashed) { clearstack() ; save(root) ; okaytogc = 1 ; } inGC = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } root = gsetbit(root, x, y, newstate, depth) ; if (hashed) { okaytogc = 0 ; } return 0 ; } /* * Our nonrecurse top-level bit getting routine. */ int ghashbase::getcell(int x, int y) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } if (sx > 0 || sx < -1 || sy > 0 || sy < -1) return 0 ; return getbit(root, x, y, depth) ; } /* * A recursive bit getting routine, but this one returns the * number of pixels to the right to the next set cell in the * current universe, or -1 if none set to the right, or if * the next set pixel is out of range. */ int ghashbase::nextcell(int x, int y, int &v) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } if (depth > 30) { struct ghnode tghnode = *root ; int mdepth = depth ; while (mdepth > 30) { tghnode.nw = tghnode.nw->se ; tghnode.ne = tghnode.ne->sw ; tghnode.sw = tghnode.sw->ne ; tghnode.se = tghnode.se->nw ; mdepth-- ; } return nextbit(&tghnode, x, y, mdepth, v) ; } return nextbit(root, x, y, depth, v) ; } /* * Canonicalize a universe by filling in the null pointers and then * invoking find_ghnode on each ghnode. Drops the original universe on * the floor [big deal, it's probably small anyway]. */ ghnode *ghashbase::hashpattern(ghnode *root, int depth) { ghnode *r ; if (root == 0) { r = zeroghnode(depth) ; } else if (depth == 0) { ghleaf *n = (ghleaf *)root ; r = (ghnode *)find_ghleaf(n->nw, n->ne, n->sw, n->se) ; n->next = freeghnodes ; freeghnodes = root ; } else { depth-- ; r = find_ghnode(hashpattern(root->nw, depth), hashpattern(root->ne, depth), hashpattern(root->sw, depth), hashpattern(root->se, depth)) ; root->next = freeghnodes ; freeghnodes = root ; } return r ; } void ghashbase::endofpattern() { poller->bailIfCalculating() ; if (!hashed) { root = hashpattern(root, depth) ; zeroghnode(depth) ; hashed = 1 ; } popValid = 0 ; needPop = 0 ; inGC = 0 ; } void ghashbase::ensure_hashed() { if (!hashed) endofpattern() ; } /* * Pop off any levels we don't need. */ ghnode *ghashbase::popzeros(ghnode *n) { int depth = ghnode_depth(n) ; while (depth > 1) { ghnode *z = zeroghnode(depth-2) ; if (n->nw->nw == z && n->nw->ne == z && n->nw->sw == z && n->ne->nw == z && n->ne->ne == z && n->ne->se == z && n->sw->nw == z && n->sw->sw == z && n->sw->se == z && n->se->ne == z && n->se->sw == z && n->se->se == z) { depth-- ; n = find_ghnode(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw) ; } else { break ; } } return n ; } /* * A lot of the routines from here on down traverse the universe, hanging * information off the ghnodes. The way they generally do so is by using * (or abusing) the cache (res) field, and the least significant bit of * the hash next field (as a visited bit). */ #define marked(n) (1 & (g_uintptr_t)(n)->next) #define mark(n) ((n)->next = (ghnode *)(1 | (g_uintptr_t)(n)->next)) #define clearmark(n) ((n)->next = (ghnode *)(~1 & (g_uintptr_t)(n)->next)) #define clearmarkbit(p) ((ghnode *)(~1 & (g_uintptr_t)(p))) /* * Sometimes we want to use *res* instead of next to mark. You cannot * do this to leaves, though. */ #define marked2(n) (3 & (g_uintptr_t)(n)->res) #define mark2(n) ((n)->res = (ghnode *)(1 | (g_uintptr_t)(n)->res)) #define mark2v(n, v) ((n)->res = (ghnode *)(v | (g_uintptr_t)(n)->res)) #define clearmark2(n) ((n)->res = (ghnode *)(~3 & (g_uintptr_t)(n)->res)) void ghashbase::unhash_ghnode(ghnode *n) { ghnode *p ; g_uintptr_t h = ghnode_hash(n->nw,n->ne,n->sw,n->se) ; ghnode *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; (!is_ghnode(p) || !marked2(p)) && p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find ghnode to unhash") ; } void ghashbase::unhash_ghnode2(ghnode *n) { ghnode *p ; g_uintptr_t h = ghnode_hash(n->nw,n->ne,n->sw,n->se) ; ghnode *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find ghnode to unhash") ; } void ghashbase::rehash_ghnode(ghnode *n) { g_uintptr_t h = ghnode_hash(n->nw,n->ne,n->sw,n->se) ; h = HASHMOD(h) ; n->next = hashtab[h] ; hashtab[h] = n ; } /* * This recursive routine calculates the population by hanging the * population on marked ghnodes. */ const bigint &ghashbase::calcpop(ghnode *root, int depth) { if (root == zeroghnode(depth)) return bigint::zero ; if (depth == 0) return ((ghleaf *)root)->leafpop ; if (marked2(root)) return *(bigint*)&(root->next) ; depth-- ; if (root->next == 0) mark2v(root, 3) ; else { unhash_ghnode(root) ; mark2(root) ; } /** * We use the memory in root->next as a value bigint. But we want to * make sure the copy constructor doesn't "clean up" something that * doesn't exist. So we clear it to zero here. */ new(&(root->next))bigint( calcpop(root->nw, depth), calcpop(root->ne, depth), calcpop(root->sw, depth), calcpop(root->se, depth)) ; return *(bigint *)&(root->next) ; } /* * Call this after doing something that unhashes ghnodes in order to * use the next field as a temp pointer. */ void ghashbase::aftercalcpop2(ghnode *root, int depth) { if (depth == 0 || root == zeroghnode(depth)) return ; int v = marked2(root) ; if (v) { clearmark2(root) ; depth-- ; if (depth > 0) { aftercalcpop2(root->nw, depth) ; aftercalcpop2(root->ne, depth) ; aftercalcpop2(root->sw, depth) ; aftercalcpop2(root->se, depth) ; } ((bigint *)&(root->next))->~bigint() ; if (v == 3) root->next = 0 ; else rehash_ghnode(root) ; } } /* * Call this after doing something that unhashes ghnodes in order to * use the next field as a temp pointer. */ void ghashbase::afterwritemc(ghnode *root, int depth) { if (root == zeroghnode(depth)) return ; if (depth == 0) { root->nw = 0 ; // all these bigints are guaranteed to be small return ; } if (marked2(root)) { clearmark2(root) ; depth-- ; afterwritemc(root->nw, depth) ; afterwritemc(root->ne, depth) ; afterwritemc(root->sw, depth) ; afterwritemc(root->se, depth) ; rehash_ghnode(root) ; } } /* * This top level routine calculates the population of a universe. */ void ghashbase::calcPopulation() { int depth ; ensure_hashed() ; depth = ghnode_depth(root) ; population = calcpop(root, depth) ; aftercalcpop2(root, depth) ; } /* * Is the universe empty? */ int ghashbase::isEmpty() { ensure_hashed() ; return root == zeroghnode(depth) ; } /* * This routine marks a ghnode as needed to be saved. */ ghnode *ghashbase::save(ghnode *n) { if (gsp >= stacksize) { int nstacksize = stacksize * 2 + 100 ; alloced += sizeof(ghnode *)*(nstacksize-stacksize) ; stack = (ghnode **)realloc(stack, nstacksize * sizeof(ghnode *)) ; if (stack == 0) lifefatal("Out of memory (3).") ; stacksize = nstacksize ; } stack[gsp++] = n ; return n ; } /* * This routine pops the stack back to a previous depth. */ void ghashbase::pop(int n) { gsp = n ; } /* * This routine clears the stack altogether. */ void ghashbase::clearstack() { gsp = 0 ; } /* * Do a gc. Walk down from all ghnodes reachable on the stack, saveing * them by setting the odd bit on the next link. Then, walk the hash, * eliminating the res from everything that's not saveed, and moving * the ghnodes from the hash to the freelist as appropriate. Finally, * walk the hash again, clearing the low order bits in the next pointers. */ void ghashbase::gc_mark(ghnode *root, int invalidate) { if (!marked(root)) { mark(root) ; if (is_ghnode(root)) { gc_mark(root->nw, invalidate) ; gc_mark(root->ne, invalidate) ; gc_mark(root->sw, invalidate) ; gc_mark(root->se, invalidate) ; if (root->res) { if (invalidate) root->res = 0 ; else gc_mark(root->res, invalidate) ; } } } } /** * If the invalidate flag is set, we want to kill *all* cache entries * and recalculate all leaves. */ void ghashbase::do_gc(int invalidate) { int i ; g_uintptr_t freed_ghnodes=0 ; ghnode *p, *pp ; inGC = 1 ; gccount++ ; gcstep++ ; if (verbose) { if (gcstep > 1) sprintf(statusline, "GC #%d(%d)", gccount, gcstep) ; else sprintf(statusline, "GC #%d", gccount) ; lifestatus(statusline) ; } for (i=nzeros-1; i>=0; i--) if (zeroghnodea[i] != 0) break ; if (i >= 0) gc_mark(zeroghnodea[i], 0) ; // never invalidate zeroghnode if (root != 0) gc_mark(root, invalidate) ; // pick up the root for (i=0; ipoll() ; gc_mark((ghnode *)stack[i], invalidate) ; } for (i=0; inext) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) { if (marked(pp)) { g_uintptr_t h = 0 ; if (pp->nw) { /* yes, it's a ghnode */ h = HASHMOD(ghnode_hash(pp->nw, pp->ne, pp->sw, pp->se)) ; } else { ghleaf *lp = (ghleaf *)pp ; h = HASHMOD(ghleaf_hash(lp->nw, lp->ne, lp->sw, lp->se)) ; } pp->next = hashtab[h] ; hashtab[h] = pp ; hashpop++ ; } else { pp->next = freeghnodes ; freeghnodes = pp ; freed_ghnodes++ ; } } } inGC = 0 ; if (verbose) { double perc = (double)freed_ghnodes / (double)totalthings * 100.0 ; sprintf(statusline+strlen(statusline), " freed %g percent (%" PRIuPTR ").", perc, freed_ghnodes) ; lifestatus(statusline) ; } if (needPop) { calcPopulation() ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } } /* * Clear the cache bits down to the appropriate level, marking the * ghnodes we've handled. */ void ghashbase::clearcache(ghnode *n, int depth, int clearto) { if (!marked(n)) { mark(n) ; if (depth > 1) { depth-- ; poller->poll() ; clearcache(n->nw, depth, clearto) ; clearcache(n->ne, depth, clearto) ; clearcache(n->sw, depth, clearto) ; clearcache(n->se, depth, clearto) ; if (n->res) clearcache(n->res, depth, clearto) ; } if (depth >= clearto) n->res = 0 ; } } /* * Mark the nodes we need to clear the result from. */ void ghashbase::clearcache_p1(ghnode *n, int depth, int clearto) { if (depth < clearto || marked(n)) return ; mark(n) ; if (depth > clearto) { depth-- ; poller->poll() ; clearcache_p1(n->nw, depth, clearto) ; clearcache_p1(n->ne, depth, clearto) ; clearcache_p1(n->sw, depth, clearto) ; clearcache_p1(n->se, depth, clearto) ; if (n->res) clearcache_p1(n->res, depth, clearto) ; } } /* * Unmark the nodes and clear the cached result. */ void ghashbase::clearcache_p2(ghnode *n, int depth, int clearto) { if (depth < clearto || !marked(n)) return ; clearmark(n) ; if (depth > clearto) { depth-- ; poller->poll() ; clearcache_p2(n->nw, depth, clearto) ; clearcache_p2(n->ne, depth, clearto) ; clearcache_p2(n->sw, depth, clearto) ; clearcache_p2(n->se, depth, clearto) ; if (n->res) clearcache_p2(n->res, depth, clearto) ; } if (n->res) n->res = 0 ; } /* * Clear the entire cache of everything, and recalculate all leaves. * This can be very expensive. */ void ghashbase::clearcache() { cacheinvalid = 1 ; } /* * Change the ngens value. Requires us to walk the hash, clearing * the cache fields of any ghnodes that do not have the appropriate * values. */ void ghashbase::new_ngens(int newval) { g_uintptr_t i ; ghnode *p, *pp ; int clearto = ngens ; if (newval > ngens && halvesdone == 0) { ngens = newval ; return ; } #ifndef NOGCBEFOREINC do_gc(0) ; #endif if (verbose) { strcpy(statusline, "Changing increment...") ; lifestatus(statusline) ; } if (newval < clearto) clearto = newval ; clearto++ ; /* clear this depth and above */ if (clearto < 1) clearto = 1 ; ngens = newval ; inGC = 1 ; for (i=0; inext)) if (is_ghnode(p) && !marked(p)) clearcache(p, ghnode_depth(p), clearto) ; for (p=ghnodeblocks; p; p=p->next) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) clearmark(pp) ; } halvesdone = 0 ; inGC = 0 ; if (needPop) { calcPopulation() ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * Return log2. */ int ghashbase::log2(unsigned int n) { int r = 0 ; while ((n & 1) == 0) { n >>= 1 ; r++ ; } if (n != 1) { lifefatal("Expected power of two!") ; } return r ; } static bigint negone = -1 ; const bigint &ghashbase::getPopulation() { // note: if called during gc, then we cannot call calcPopulation // since that will mess up the gc. if (!popValid) { if (inGC) { needPop = 1 ; return negone ; } else if (poller->isCalculating()) { // AKT: avoid calling poller->bailIfCalculating return negone ; } else { calcPopulation() ; popValid = 1 ; needPop = 0 ; } } return population ; } /* * Finally, we get to run the pattern. We first ensure that all * clearspace ghnodes and the input pattern is never garbage * collected; we turn on garbage collection, and then we invoke our * magic top-level routine passing in clearspace borders that are * guaranteed large enough. */ ghnode *ghashbase::runpattern() { ghnode *n = root ; save(root) ; // do this in case we interrupt generation ensure_hashed() ; okaytogc = 1 ; if (cacheinvalid) { do_gc(1) ; // invalidate the entire cache and recalc leaves cacheinvalid = 0 ; } int depth = ghnode_depth(n) ; ghnode *n2 ; n = pushroot(n) ; depth++ ; n = pushroot(n) ; depth++ ; while (ngens + 2 > depth) { n = pushroot(n) ; depth++ ; } save(zeroghnode(nzeros-1)) ; save(n) ; n2 = getres(n, depth) ; okaytogc = 0 ; clearstack() ; if (halvesdone == 1 && n->res != 0) { n->res = 0 ; halvesdone = 0 ; } if (poller->isInterrupted() || softinterrupt) return 0 ; // indicate it was interrupted n = popzeros(n2) ; generation += pow2step ; return n ; } const char *ghashbase::readmacrocell(char *line) { int n=0 ; g_uintptr_t i=1, nw=0, ne=0, sw=0, se=0, indlen=0 ; int r, d ; ghnode **ind = 0 ; root = 0 ; while (getline(line, 10000)) { if (i >= indlen) { g_uintptr_t nlen = i + indlen + 10 ; ind = (ghnode **)realloc(ind, sizeof(ghnode*) * nlen) ; if (ind == 0) lifefatal("Out of memory (4).") ; while (indlen < nlen) ind[indlen++] = 0 ; } if (line[0] == '#') { char *p, *pp ; const char *err ; switch (line[1]) { case 'R': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; err = setrule(p); if (err) return err; break ; case 'G': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp >= '0' && *pp <= '9') pp++ ; *pp = 0 ; generation = bigint(p) ; break ; // either: // #FRAMES count base inc // or // #FRAME index node case 'F': if (strncmp(line, "#FRAMES ", 8) == 0) { p = line + 8 ; while (*p && *p <= ' ') p++ ; long cnt = atol(p) ; if (cnt < 0 || cnt > MAX_FRAME_COUNT) return "Bad FRAMES line" ; destroytimeline() ; while ('0' <= *p && *p <= '9') p++ ; while (*p && *p <= ' ') p++ ; pp = p ; while ((*pp >= '0' && *pp <= '9') || *pp == ',') pp++ ; if (*pp == 0) return "Bad FRAMES line" ; *pp = 0 ; timeline.start = bigint(p) ; timeline.end = timeline.start ; timeline.next = timeline.end ; p = pp + 1 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; if (strchr(p, '^')) { int tbase=0, texpo=0 ; if (sscanf(p, "%d^%d", &tbase, &texpo) != 2 || tbase < 2 || texpo < 0) return "Bad FRAMES line" ; timeline.base = tbase ; timeline.expo = texpo ; timeline.inc = 1 ; while (texpo--) timeline.inc.mul_smallint(tbase) ; } else { timeline.inc = bigint(p) ; // if it's a power of two, we're good int texpo = timeline.inc.lowbitset() ; int tbase = 2 ; bigint test = 1 ; for (int i=0; i MAX_FRAME_COUNT || frameind < 0 || nodeind > i || timeline.framecount != frameind) return "Bad FRAME line" ; timeline.frames.push_back(ind[nodeind]) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } break ; } } else { n = sscanf(line, "%d %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %d", &d, &nw, &ne, &sw, &se, &r) ; if (n < 0) // blank line; permit continue ; if (n == 0) { // conversion error in first argument; we allow only if the only // content on the line is whitespace. char *ws = line ; while (*ws && *ws <= ' ') ws++ ; if (*ws > 0) return "Parse error in macrocell format." ; continue ; } if (n < 5) // best not to use lifefatal here because user won't see any // error message when reading clipboard data starting with "[..." return "Parse error in readmacrocell." ; if (d < 1) return "Oops; bad depth in readmacrocell." ; if (d == 1) { if (nw >= (g_uintptr_t)maxCellStates || ne >= (g_uintptr_t)maxCellStates || sw >= (g_uintptr_t)maxCellStates || se >= (g_uintptr_t)maxCellStates) return "Cell state values too high for this algorithm." ; root = ind[i++] = (ghnode *)find_ghleaf((state)nw, (state)ne, (state)sw, (state)se) ; depth = d - 1 ; } else { ind[0] = zeroghnode(d-2) ; /* allow zeros to work right */ if (nw >= i || ind[nw] == 0 || ne >= i || ind[ne] == 0 || sw >= i || ind[sw] == 0 || se >= i || ind[se] == 0) { return "Node out of range in readmacrocell." ; } clearstack() ; root = ind[i++] = find_ghnode(ind[nw], ind[ne], ind[sw], ind[se]) ; depth = d - 1 ; } } } if (ind) free(ind) ; if (root == 0) { // allow empty macrocell pattern; note that endofpattern() // will be called soon so don't set hashed here // return "Invalid macrocell file: no ghnodes." ; return 0 ; } hashed = 1 ; return 0 ; } const char *ghashbase::setrule(const char *) { poller->bailIfCalculating() ; clearcache() ; return 0 ; } /** * Write out the native macrocell format. This is the one we use when * we're not interactive and displaying a progress dialog. */ g_uintptr_t ghashbase::writecell(std::ostream &os, ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_ghnode2(root) ; mark2(root) ; } thiscell = ++cellcounter ; if (depth == 0) { ghleaf *n = (ghleaf *)root ; root->nw = (ghnode *)thiscell ; os << 1 << ' ' << int(n->nw) << ' ' << int(n->ne) << ' ' << int(n->sw) << ' ' << int(n->se) << '\n' ; } else { g_uintptr_t nw = writecell(os, root->nw, depth-1) ; g_uintptr_t ne = writecell(os, root->ne, depth-1) ; g_uintptr_t sw = writecell(os, root->sw, depth-1) ; g_uintptr_t se = writecell(os, root->se, depth-1) ; root->next = (ghnode *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n' ; } return thiscell ; } /** * This new two-pass method works by doing a prepass that numbers the * ghnodes and counts the number of ghnodes that should be sent, so we can * display an accurate progress dialog. */ g_uintptr_t ghashbase::writecell_2p1(ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_ghnode2(root) ; mark2(root) ; } if (depth == 0) { thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->nw = (ghnode *)thiscell ; } else { writecell_2p1(root->nw, depth-1) ; writecell_2p1(root->ne, depth-1) ; writecell_2p1(root->sw, depth-1) ; writecell_2p1(root->se, depth-1) ; thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->next = (ghnode *)thiscell ; } return thiscell ; } /** * This one writes the cells, but assuming they've already been * numbered, and displaying a progress dialog. */ static char progressmsg[80] ; g_uintptr_t ghashbase::writecell_2p2(std::ostream &os, ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (cellcounter + 1 != (g_uintptr_t)(root->nw)) return (g_uintptr_t)(root->nw) ; thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp() ; sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } ghleaf *n = (ghleaf *)root ; root->nw = (ghnode *)thiscell ; os << 1 << ' ' << int(n->nw) << ' ' << int(n->ne) << ' ' << int(n->sw) << ' ' << int(n->se) << '\n'; } else { if (cellcounter + 1 > (g_uintptr_t)(root->next) || isaborted()) return (g_uintptr_t)(root->next) ; g_uintptr_t nw = writecell_2p2(os, root->nw, depth-1) ; g_uintptr_t ne = writecell_2p2(os, root->ne, depth-1) ; g_uintptr_t sw = writecell_2p2(os, root->sw, depth-1) ; g_uintptr_t se = writecell_2p2(os, root->se, depth-1) ; if (!isaborted() && cellcounter + 1 != (g_uintptr_t)(root->next)) { // this should never happen lifefatal("Internal in writecell_2p2") ; return (g_uintptr_t)(root->next) ; } thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp() ; sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } root->next = (ghnode *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n' ; } return thiscell ; } #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg const char *ghashbase::writeNativeFormat(std::ostream &os, char *comments) { int depth = ghnode_depth(root) ; os << "[M2] (golly " STRINGIFY(VERSION) ")\n" ; // AKT: always write out explicit rule os << "#R " << getrule() << '\n' ; if (generation > bigint::zero) { // write non-zero gen count os << "#G " << generation.tostring('\0') << '\n' ; } if (comments) { // write given comment line(s), but we can't just do "os << comments" because the // lines might not start with #C (eg. if they came from the end of a .rle file), // so we must ensure that each comment line in the .mc file starts with #C char *p = comments; while (*p != '\0') { char *line = p; // note that readcomments() in readpattern.cpp ensures each line ends with \n while (*p != '\n') p++; if (line[0] != '#' || line[1] != 'C') { os << "#C "; } if (line != p) { *p = '\0'; os << line; *p = '\n'; } os << '\n'; p++; } } inGC = 1 ; /* this is the old way: cellcounter = 0 ; writecell(os, root, depth) ; */ /* this is the new two-pass way */ cellcounter = 0 ; vector depths(timeline.framecount) ; int framestosave = timeline.framecount ; if (timeline.savetimeline == 0) framestosave = 0 ; if (framestosave) { for (int i=0; inext << '\n' ; } } writecell_2p2(os, root, depth) ; /* end new two-pass way */ if (framestosave) { for (int i=0; i #include #include #include #ifdef ZLIB #include #include #endif #ifdef __APPLE__ #define BUFFSIZE 4096 // 4K is best for Mac OS X #else #define BUFFSIZE 8192 // 8K is best for Windows and other platforms??? #endif // globals for writing RLE files static char outbuff[BUFFSIZE]; static size_t outpos; // current write position in outbuff static bool badwrite; // fwrite failed? // using buffered putchar instead of fputc is about 20% faster on Mac OS X static void putchar(char ch, std::ostream &os) { if (badwrite) return; if (outpos == BUFFSIZE) { if (!os.write(outbuff, outpos)) badwrite = true; outpos = 0; } outbuff[outpos] = ch; outpos++; } const int WRLE_NONE = -3 ; const int WRLE_EOP = -2 ; const int WRLE_NEWLINE = -1 ; // output of RLE pattern data is channelled thru here to make it easier to // ensure all lines have <= 70 characters void AddRun(std::ostream &f, int state, // in: state of cell to write int multistate, // true if #cell states > 2 unsigned int &run, // in and out unsigned int &linelen) // ditto { unsigned int i, numlen; char numstr[32]; if ( run > 1 ) { sprintf(numstr, "%u", run); numlen = (int)strlen(numstr); } else { numlen = 0; // no run count shown if 1 } if ( linelen + numlen + 1 + multistate > 70 ) { putchar('\n', f); linelen = 0; } i = 0; while (i < numlen) { putchar(numstr[i], f); i++; } if (multistate) { if (state <= 0) putchar(".$!"[-state], f) ; else { if (state > 24) { int hi = (state - 25) / 24 ; putchar((char)(hi + 'p'), f) ; linelen++ ; state -= (hi + 1) * 24 ; } putchar((char)('A' + state - 1), f) ; } } else putchar("!$bo"[state+2], f) ; linelen += numlen + 1; run = 0; // reset run count } // write current pattern to file using extended RLE format const char *writerle(std::ostream &os, char *comments, lifealgo &imp, int top, int left, int bottom, int right, bool xrle) { badwrite = false; if (xrle) { // write out #CXRLE line; note that the XRLE indicator is prefixed // with #C so apps like Life32 and MCell will ignore the line os << "#CXRLE Pos=" << left << ',' << top; if (imp.getGeneration() > bigint::zero) os << " Gen=" << imp.getGeneration().tostring('\0'); os << '\n'; } char *endcomms = NULL; if (comments && comments[0]) { // write given comment line(s) -- can't just do fputs(comments,f) // because comments might include arbitrary text after the "!" char *p = comments; while (*p == '#') { while (*p != '\n') p++; p++; } if (p != comments) { char savech = *p; *p = '\0'; os << comments; *p = savech; } // any comment lines not starting with # will be written after "!" if (*p != '\0') endcomms = p; } if ( imp.isEmpty() || top > bottom || left > right ) { // empty pattern os << "x = 0, y = 0, rule = " << imp.getrule() << "\n!\n"; } else { // do header line unsigned int wd = right - left + 1; unsigned int ht = bottom - top + 1; sprintf(outbuff, "x = %u, y = %u, rule = %s\n", wd, ht, imp.getrule()); outpos = strlen(outbuff); // do RLE data unsigned int linelen = 0; unsigned int brun = 0; unsigned int orun = 0; unsigned int dollrun = 0; int laststate = WRLE_NONE ; int multistate = imp.NumCellStates() > 2 ; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = imp.getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; int v = 0 ; for ( cy=top; cy<=bottom; cy++ ) { // set lastchar to anything except 'o' or 'b' laststate = WRLE_NONE ; currcount++; for ( cx=left; cx<=right; cx++ ) { int skip = imp.nextcell(cx, cy, v); if (skip + cx > right) skip = -1; // pretend we found no more live cells if (skip > 0) { // have exactly "skip" dead cells here if (laststate == 0) { brun += skip; } else { if (orun > 0) { // output current run of live cells AddRun(os, laststate, multistate, orun, linelen); } laststate = 0 ; brun = skip; } } if (skip >= 0) { // found next live cell in this row cx += skip; if (laststate == v) { orun++; } else { if (dollrun > 0) // output current run of $ chars AddRun(os, WRLE_NEWLINE, multistate, dollrun, linelen); if (brun > 0) // output current run of dead cells AddRun(os, 0, multistate, brun, linelen); if (orun > 0) AddRun(os, laststate, multistate, orun, linelen) ; laststate = v ; orun = 1; } currcount++; } else { cx = right + 1; // done this row } if (currcount > 1024) { char msg[128]; accumcount += currcount; currcount = 0; sprintf(msg, "File size: %.2f MB", os.tellp() / 1048576.0); if (lifeabortprogress(accumcount / maxcount, msg)) break; } } // end of current row if (isaborted()) break; if (laststate == 0) // forget dead cells at end of row brun = 0; else if (laststate >= 0) // output current run of live cells AddRun(os, laststate, multistate, orun, linelen); dollrun++; } // terminate RLE data dollrun = 1; AddRun(os, WRLE_EOP, multistate, dollrun, linelen); putchar('\n', os); // flush outbuff if (outpos > 0 && !badwrite && !os.write(outbuff, outpos)) badwrite = true; } if (endcomms) os << endcomms; if (badwrite) return "Failed to write output buffer!"; else return 0; } const char *writemacrocell(std::ostream &os, char *comments, lifealgo &imp) { if (imp.hyperCapable()) return imp.writeNativeFormat(os, comments); else return "Not yet implemented."; } #ifdef ZLIB class gzbuf : public std::streambuf { public: gzbuf() : file(NULL) { } gzbuf(const char *path) : file(NULL) { open(path); } ~gzbuf() { close(); } gzbuf *open(const char *path) { if (file) return NULL; file = gzopen(path, "wb"); return file ? this : NULL; } gzbuf *close() { if (!file) return NULL; int res = gzclose(file); file = NULL; return res == Z_OK ? this : NULL; } bool is_open() const { return file!=NULL; } int overflow(int c=EOF) { if (c == EOF) return c ; return gzputc(file, c) ; } std::streamsize xsputn(const char_type *s, std::streamsize n) { return gzwrite(file, s, (unsigned int)n); } int sync() { return gzflush(file, Z_SYNC_FLUSH) == Z_OK ? 0 : -1; } pos_type seekoff(off_type off, std::ios_base::seekdir way, std::ios_base::openmode which) { if (file && off == 0 && way == std::ios_base::cur && which == std::ios_base::out) { #if ZLIB_VERNUM >= 0x1240 // gzoffset is only available in zlib 1.2.4 or later return pos_type(gzoffset(file)); #else // return an approximation of file size (only used in progress dialog) z_off_t offset = gztell(file); if (offset > 0) offset /= 4; return pos_type(offset); #endif } return pos_type(off_type(-1)); } private: gzFile file; }; #endif const char *writepattern(const char *filename, lifealgo &imp, pattern_format format, output_compression compression, int top, int left, int bottom, int right) { // extract any comments if file exists so we can copy them to new file char *commptr = NULL; FILE *f = fopen(filename, "r"); if (f) { fclose(f); const char *err = readcomments(filename, &commptr); if (err) { if (commptr) free(commptr); return err; } } // skip past any old #CXRLE lines at start of existing XRLE file char *comments = commptr; if (comments) { while (strncmp(comments, "#CXRLE", 6) == 0) { while (*comments != '\n') comments++; comments++; } } // open output stream std::streambuf *streambuf = NULL; std::filebuf filebuf; #ifdef ZLIB gzbuf gzbuf; #endif switch (compression) { default: /* no output compression */ streambuf = filebuf.open(filename, std::ios_base::out); break; case gzip_compression: #ifdef ZLIB streambuf = gzbuf.open(filename); break; #else if (commptr) free(commptr); return "GZIP compression not supported"; #endif } if (!streambuf) { if (commptr) free(commptr); return "Can't create pattern file!"; } std::ostream os(streambuf); lifebeginprogress("Writing pattern file"); const char *errmsg = NULL; switch (format) { case RLE_format: errmsg = writerle(os, comments, imp, top, left, bottom, right, false); break; case XRLE_format: errmsg = writerle(os, comments, imp, top, left, bottom, right, true); break; case MC_format: // macrocell format ignores given edges errmsg = writemacrocell(os, comments, imp); break; default: errmsg = "Unsupported pattern format!"; } if (errmsg == NULL && !os.flush()) errmsg = "Error occurred writing file; maybe disk is full?"; lifeendprogress(); if (commptr) free(commptr); if (isaborted()) return "File contains truncated pattern."; else return errmsg; } golly-3.3-src/gollybase/liferules.cpp0000755000175000017500000010160713230774246014712 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "liferules.h" #include "util.h" #include #include #include #include #if defined(WIN32) || defined(WIN64) #define strncasecmp _strnicmp #endif liferules::liferules() { int i ; // base64 encoding characters base64_characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ; // all valid rule letters valid_rule_letters = "012345678ceaiknjqrytwz-" ; // rule letters per neighbor count rule_letters[0] = "ce" ; rule_letters[1] = "ceaikn" ; rule_letters[2] = "ceaiknjqry" ; rule_letters[3] = "ceaiknjqrytwz" ; // isotropic neighborhoods per neighbor count static int entry0[2] = { 1, 2 } ; static int entry1[6] = { 5, 10, 3, 40, 33, 68 } ; static int entry2[10] = { 69, 42, 11, 7, 98, 13, 14, 70, 41, 97 } ; static int entry3[13] = { 325, 170, 15, 45, 99, 71, 106, 102, 43, 101, 105, 78, 108 } ; rule_neighborhoods[0] = entry0 ; rule_neighborhoods[1] = entry1 ; rule_neighborhoods[2] = entry2 ; rule_neighborhoods[3] = entry3 ; // bit offset for suvival part of rule survival_offset = 9 ; // bit in letter bit mask indicating negative negative_bit = 13 ; // maximum number of letters per neighbor count max_letters[0] = 0 ; max_letters[1] = (int) strlen(rule_letters[0]) ; max_letters[2] = (int) strlen(rule_letters[1]) ; max_letters[3] = (int) strlen(rule_letters[2]) ; max_letters[4] = (int) strlen(rule_letters[3]) ; max_letters[5] = max_letters[3] ; max_letters[6] = max_letters[2] ; max_letters[7] = max_letters[1] ; max_letters[8] = max_letters[0] ; for (i = 0 ; i < survival_offset ; i++) { max_letters[i + survival_offset] = max_letters[i] ; } // canonical letter order per neighbor count static int order0[1] = { 0 } ; static int order1[2] = { 0, 1 } ; static int order2[6] = { 2, 0, 1, 3, 4, 5 } ; static int order3[10] = { 2, 0, 1, 3, 6, 4, 5, 7, 8, 9 } ; static int order4[13] = { 2, 0, 1, 3, 6, 4, 5, 7, 8, 10, 11, 9, 12 } ; order_letters[0] = order0 ; order_letters[1] = order1 ; order_letters[2] = order2 ; order_letters[3] = order3 ; order_letters[4] = order4 ; order_letters[5] = order3 ; order_letters[6] = order2 ; order_letters[7] = order1 ; order_letters[8] = order0 ; for (i = 0 ; i < survival_offset ; i++) { order_letters[i + survival_offset] = order_letters[i] ; } // initialize initRule() ; } liferules::~liferules() { } // returns a count of the number of bits set in given int static int bitcount(int v) { int r = 0 ; while (v) { r++ ; v &= v - 1 ; } return r ; } // initialize void liferules::initRule() { // default to Moore neighbourhood totalistic rule neighbormask = MOORE ; neighbors = 8 ; wolfram = -1 ; totalistic = true ; using_map = false ; // one bit for each neighbor count // s = survival, b = birth // bit: 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 // meaning: s8 s7 s6 s5 s4 s3 s2 s1 s0 b8 b7 b6 b5 b4 b3 b2 b1 b0 rulebits = 0 ; // one bit for each letter per neighbor count // N = negative bit // bit: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 // meaning: N z w t y r q j n k i a e c memset(letter_bits, 0, sizeof(letter_bits)) ; // two 4x4 rule maps (second used for B0-not-Smax rule emulation) memset(rule0, 0, sizeof(rule0)) ; memset(rule1, 0, sizeof(rule1)) ; // 3x3 rule map memset(rule3x3, 0, sizeof(rule3x3)) ; // canonical rule string memset(canonrule, 0, sizeof(canonrule)) ; } // set 3x3 grid based on totalistic value void liferules::setTotalistic(int value, bool survival) { int mask = 0 ; int nbrs = 0 ; int nhood = 0 ; int i = 0 ; int j = 0 ; int offset = 0 ; // check if this value has already been processed if (survival) { offset = survival_offset ; } if ((rulebits & (1 << (value + offset))) == 0) { // update the rulebits rulebits |= 1 << (value + offset) ; // update the mask if survival if (survival) { mask = 0x10 ; } // fill the array based on totalistic value for (i = 0 ; i < ALL3X3 ; i += 32) { for (j = 0 ; j < 16 ; j++) { nbrs = 0 ; nhood = (i+j) & neighbormask ; while (nhood > 0) { nbrs += (nhood & 1) ; nhood >>= 1 ; } if (value == nbrs) { rule3x3[i+j+mask] = 1 ; } } } } } // flip bits int liferules::flipBits(int x) { return ((x & 0x07) << 6) | ((x & 0x1c0) >> 6) | (x & 0x38) ; } // rotate 90 int liferules::rotateBits90Clockwise(int x) { return ((x & 0x4) << 6) | ((x & 0x20) << 2) | ((x & 0x100) >> 2) | ((x & 0x2) << 4) | (x & 0x10) | ((x & 0x80) >> 4) | ((x & 0x1) << 2) | ((x & 0x8) >> 2) | ((x & 0x40) >> 6) ; } // set symmetrical neighborhood into 3x3 map void liferules::setSymmetrical512(int x, int b) { int y = x ; int i = 0 ; // process each of the 4 rotations for (i = 0 ; i < 4 ; i++) { rule3x3[y] = (char) b ; y = rotateBits90Clockwise(y) ; } // flip y = flipBits(y) ; // process each of the 4 rotations for (i = 0 ; i < 4 ; i++) { rule3x3[y] = (char) b ; y = rotateBits90Clockwise(y) ; } } // set symmetrical neighborhood void liferules::setSymmetrical(int value, bool survival, int lindex, int normal) { int xorbit = 0 ; int nindex = value - 1 ; int x = 0 ; int offset = 0 ; // check for homogeneous bits if (value == 0 || value == 8) { setTotalistic(value, survival) ; } else { // update the rulebits if (survival) { offset = survival_offset ; } rulebits |= 1 << (value + offset) ; // reflect the index if in second half if (nindex > 3) { nindex = 6 - nindex ; xorbit = 0x1ef ; } // update the letterbits letter_bits[value + offset] |= 1 << lindex ; if (!normal) { // set the negative bit letter_bits[value + offset] |= 1 << negative_bit ; } // lookup the neighborhood x = rule_neighborhoods[nindex][lindex] ^ xorbit ; if (survival) { x |= 0x10 ; } setSymmetrical512(x, normal) ; } } // set totalistic birth or survival rule from a string void liferules::setTotalisticRuleFromString(const char *rule, bool survival) { char current ; // process each character in the rule string while ( *rule ) { current = *rule ; rule++ ; // convert the digit to an integer current -= '0' ; // set totalistic setTotalistic(current, survival) ; } } // set rule from birth or survival string void liferules::setRuleFromString(const char *rule, bool survival) { // current and next character char current ; char next ; // whether character normal or inverted int normal = 1 ; // letter index char *letterindex = 0 ; int lindex = 0 ; int nindex = 0 ; // process each character while ( *rule ) { current = *rule ; rule++ ; // find the index in the valid character list letterindex = strchr((char*) valid_rule_letters, current) ; lindex = letterindex ? int(letterindex - valid_rule_letters) : -1 ; // check if it is a digit if (lindex >= 0 && lindex <= 8) { // determine what follows the digit next = *rule ; nindex = -1 ; if (next) { letterindex = strchr((char*) rule_letters[3], next) ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } } // is the next character a digit or minus? if (nindex == -1) { setTotalistic(lindex, survival) ; } // check for inversion normal = 1 ; if (next == '-') { rule++ ; next = *rule ; // invert following character meanings normal = 0 ; } // process non-totalistic characters if (next) { letterindex = strchr((char*) rule_letters[3], next) ; nindex = -1 ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } while (nindex >= 0) { // set symmetrical setSymmetrical(lindex, survival, nindex, normal) ; // get next character rule++ ; next = *rule ; nindex = -1 ; if (next) { letterindex = strchr((char*) rule_letters[3], next) ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } } } } } } } // create the rule map from Wolfram number void liferules::createWolframMap() { int i = 0 ; // clear the rule array memset(rule3x3, 0, ALL3X3) ; // set in the 3x3 map for (i = 0 ; i < ALL3X3 ; i++) { if ((wolfram & (1 << (i & 7))) || (i & 16)) { rule3x3[i] = 1 ; } } } // create the rule map from the base64 encoded map void liferules::createRuleMapFromMAP(const char *base64) { // set the number of characters to read int power2 = 1 << (neighbors + 1) ; int fullchars = power2 / 6 ; int remainbits = power2 % 6 ; // create an array to read the MAP bits char bits[ALL3X3] ; // decode the base64 string int i = 0 ; char c = 0 ; int j = 0 ; const char *index = 0 ; for (i = 0 ; i < fullchars ; i++) { // convert character to base64 index index = strchr(base64_characters, *base64) ; base64++ ; c = index ? (char)(index - base64_characters) : 0 ; // decode the character bits[j] = c >> 5 ; j++ ; bits[j] = (c >> 4) & 1 ; j++ ; bits[j] = (c >> 3) & 1 ; j++ ; bits[j] = (c >> 2) & 1 ; j++ ; bits[j] = (c >> 1) & 1 ; j++ ; bits[j] = c & 1 ; j++ ; } // decode remaining bits from final character if (remainbits > 0) { index = strchr(base64_characters, *base64) ; c = index ? (char)(index - base64_characters) : 0 ; int b = 5 ; while (remainbits > 0) { bits[j] = (c >> b) & 1 ; b-- ; j++ ; remainbits-- ; } } // copy into rule array using the neighborhood mask int k, m ; for (i = 0 ; i < ALL3X3 ; i++) { k = 0 ; m = neighbors ; for (j = 8 ; j >= 0 ; j--) { if (neighbormask & (1 << j)) { if (i & (1 << j)) { k |= (1 << m) ; } m-- ; } } rule3x3[i] = bits[k] ; } } // create the rule map from birth and survival strings void liferules::createRuleMap(const char *birth, const char *survival) { // clear the rule array memset(rule3x3, 0, ALL3X3) ; // check for totalistic rule if (totalistic) { // set the totalistic birth rule setTotalisticRuleFromString(birth, false) ; // set the totalistic surivival rule setTotalisticRuleFromString(survival, true) ; } else { // set the non-totalistic birth rule setRuleFromString(birth, false) ; // set the non-totalistic survival rule setRuleFromString(survival, true) ; } } // add canonical letter representation int liferules::addLetters(int count, int p) { int bits ; // bitmask of letters defined at this count int negative = 0 ; // whether negative int setbits ; // how many bits are defined int maxbits ; // maximum number of letters at this count int letter = 0 ; int j ; // check if letters are defined for this neighbor count if (letter_bits[count]) { // get the bit mask bits = letter_bits[count] ; // check for negative if (bits & (1 << negative_bit)) { // letters are negative negative = 1 ; bits &= ~(1 << negative_bit) ; } // compute the number of bits set setbits = bitcount(bits) ; // get the maximum number of allowed letters at this neighbor count maxbits = max_letters[count] ; // do not invert if not negative and seven letters if (!(!negative && setbits == 7 && maxbits == 13)) { // if maximum letters minus number used is greater than number used then invert if (setbits + negative > (maxbits >> 1)) { // invert maximum letters for this count bits = ~bits & ((1 << maxbits) - 1) ; if (bits) { negative = !negative ; } } } // if negative and no letters then remove neighborhood count if (negative && !bits) { canonrule[p] = 0 ; p-- ; } else { // check whether to output minus if (negative) { canonrule[p++] = '-' ; } // add defined letters for (j = 0 ; j < maxbits ; j++) { // lookup the letter in order letter = order_letters[count][j] ; if (bits & (1 << letter)) { canonrule[p++] = rule_letters[3][letter] ; } } } } return p ; } // AKT: store valid rule in canonical format for getrule() void liferules::createCanonicalName(lifealgo *algo, const char *base64) { int p = 0 ; int np = 0 ; int i = 0 ; // the canonical version of a rule containing letters // might be simply totalistic bool stillnontotalistic = false ; // check for wolfram rule if (wolfram >= 0) { sprintf(canonrule, "W%d", wolfram) ; while (canonrule[p]) p++ ; } else { // check for map rule if (using_map) { // output map header canonrule[p++] = 'M' ; canonrule[p++] = 'A' ; canonrule[p++] = 'P' ; // compute number of base64 characters int power2 = 1 << (neighbors + 1) ; int fullchars = power2 / 6 ; int remainbits = power2 % 6 ; // copy base64 part for (i = 0 ; i < fullchars ; i++) { if (*base64) { canonrule[p++] = *base64 ; base64++ ; } } // copy final bits of last character if (*base64) { const char *index = strchr(base64_characters, *base64) ; int c = index ? (char)(index - base64_characters) : 0 ; int k = 0 ; int m = 5 ; for (i = 0 ; i < remainbits ; i++) { k |= c & (1 << m) ; m-- ; } canonrule[p++] = base64_characters[c] ; } } else { // output birth part canonrule[p++] = 'B' ; for (i = 0 ; i <= neighbors ; i++) { if (rulebits & (1 << i)) { canonrule[p++] = '0' + (char)i ; // check for non-totalistic if (!totalistic) { // add any defined letters np = addLetters(i, p) ; // check if letters were added if (np != p) { if (np > p) { stillnontotalistic = true ; } p = np ; // confident? } } } } // add slash canonrule[p++] = '/' ; // output survival part canonrule[p++] = 'S' ; for (i = 0 ; i <= neighbors ; i++) { if (rulebits & (1 << (survival_offset+i))) { canonrule[p++] = '0' + (char)i ; // check for non-totalistic if (!totalistic) { // add any defined letters np = addLetters(survival_offset + i, p) ; // check if letters were added if (np != p) { if (np > p) { stillnontotalistic = true ; } p = np ; } } } } // check if non-totalistic became totalistic if (!totalistic && !stillnontotalistic) { totalistic = true ; } // add neighborhood if (neighbormask == HEXAGONAL) canonrule[p++] = 'H' ; if (neighbormask == VON_NEUMANN) canonrule[p++] = 'V' ; } } // check for bounded grid if (algo->gridwd > 0 || algo->gridht > 0) { // algo->setgridsize() was successfully called above, so append suffix const char* bounds = algo->canonicalsuffix() ; i = 0 ; while (bounds[i]) canonrule[p++] = bounds[i++] ; } // null terminate canonrule[p] = 0 ; } // convert the 3x3 map to the 4x4 map void liferules::convertTo4x4Map(char *which) { int i = 0 ; int v = 0 ; // create every possible cell combination for 4x4 for (i = 0 ; i < ALL4X4 ; i ++) { // perform 4 lookups in the 3x3 map to create the 4x4 entry // 15 14 13 x 7 6 5 // 11 10 9 x -> 11 10 9 -> 10' x 0 0 x x // 7 6 5 x 15 14 13 // x x x x v = rule3x3[((i & 57344) >> 13) | ((i & 3584) >> 6) | ((i & 224) << 1)] << 5 ; // x 14 13 12 6 5 4 // x 10 9 8 -> 10 9 8 -> x 9' 0 0 x x // x 6 5 4 14 13 12 // x x x x v |= rule3x3[((i & 28672) >> 12) | ((i & 1792) >> 5) | ((i & 112) << 2)] << 4 ; // x x x x // 11 10 9 x -> 3 2 1 -> x x 0 0 6' x // 7 6 5 x 7 6 5 // 3 2 1 x 11 10 9 v |= rule3x3[((i & 3584) >> 9) | ((i & 224) >> 2) | ((i & 14) << 5)] << 1 ; // x x x x // x 10 9 8 -> 2 1 0 -> x x 0 0 x 5' // x 6 5 4 6 5 4 // x 2 1 0 10 9 8 v |= rule3x3[((i & 1792) >> 8) | ((i & 112) >> 1) | ((i & 7) << 6)] ; // save the entry which[i] = (char) v ; } } // save the rule (and handle B0) void liferules::saveRule() { int i = 0 ; char tmp ; if (wolfram == -1) { // check for B0 if (rule3x3[0]) { // check for Smax if (rule3x3[ALL3X3 - 1]) { // B0 with Smax: rule -> NOT(reverse(bits)) for (i = 0 ; i < ALL3X3 / 2 ; i++) { tmp = rule3x3[i] ; rule3x3[i] = 1 - rule3x3[ALL3X3 - i - 1] ; rule3x3[ALL3X3 - i - 1] = 1 - tmp ; } } else { // B0 without Smax needs two rules: one for odd and one for even generations alternate_rules = true ; // odd rule -> reverse(bits) for (i = 0 ; i < ALL3X3 / 2 ; i++) { tmp = rule3x3[i] ; rule3x3[i] = rule3x3[ALL3X3 - i - 1] ; rule3x3[ALL3X3 - i - 1] = tmp ; } convertTo4x4Map(rule1) ; // even rule -> NOT(bits) for (i = 0 ; i < ALL3X3 / 2 ; i++) { tmp = rule3x3[i] ; // need to reverse then invert due to even rule above rule3x3[i] = 1 - rule3x3[ALL3X3 - i - 1] ; rule3x3[ALL3X3 - i - 1] = 1 - tmp ; } } } } // convert to 4x4 map convertTo4x4Map(rule0) ; } // remove character from a string in place void liferules::removeChar(char *string, char skip) { int src = 0 ; int dst = 0 ; char c = string[src++] ; // copy characters other than skip while ( c ) { if (c != skip) { string[dst++] = c ; } c = string[src++] ; } // ensure null terminated string[dst] = 0 ; } // check whether non-totalistic letters are valid for defined neighbor counts bool liferules::lettersValid(const char *part) { char c ; int nindex = 0 ; int currentCount = -1 ; // get next character while ( *part ) { c = *part ; if (c >= '0' && c <= '8') { currentCount = c - '0' ; nindex = currentCount - 1 ; if (nindex > 3) { nindex = 6 - nindex ; } } else { // ignore minus if (c != '-') { // not valid if 0 or 8 if (currentCount == 0 || currentCount == 8) { return false ; } // check against valid rule letters for this neighbor count if (strchr((char*) rule_letters[nindex], c) == 0) { return false ; } } } part++ ; } return true ; } // set rule const char *liferules::setrule(const char *rulestring, lifealgo *algo) { char *r = (char *)rulestring ; char tidystring[MAXRULESIZE] ; // tidy version of rule string char *t = (char *)tidystring ; char *end = r + strlen(r) ; // end of rule string char c ; char *charpos = 0 ; int digit ; int maxdigit = 0 ; // maximum digit value found char *colonpos = 0 ; // position of colon char *slashpos = 0 ; // position of slash char *underscorepos = 0 ; // position of underscore char *bpos = 0 ; // position of b char *spos = 0 ; // position of s // initialize rule type initRule() ; // we might need to emulate B0 rule by using two different rules for odd/even gens alternate_rules = false ; // check if rule is too long if (strlen(rulestring) > (size_t) MAXRULESIZE) { return "Rule name is too long." ; } // check for colon colonpos = strchr(r, ':') ; if (colonpos) { // only process up to the colon end = colonpos ; } // skip any whitespace while (*r == ' ') { r++ ; } // check for map if (strncasecmp(r, "map", 3) == 0) { // attempt to decode map r += 3 ; bpos = r ; // terminate at the colon if one is present if (colonpos) *colonpos = 0 ; // check the length of the map int maplen = (int) strlen(r) ; // replace the colon if one was present if (colonpos) *colonpos = ':' ; // check if there is base64 padding if (maplen > 2 && !strncmp(r + maplen - 2, "==", 2)) { // remove padding maplen -= 2 ; } // check if the map length is valid for Moore, Hexagonal or von Neumann neighborhoods if (!(maplen == MAP512LENGTH || maplen == MAP128LENGTH || maplen == MAP32LENGTH)) { return "MAP rule needs 6, 22 or 86 base64 characters." ; } // validate the characters spos = r + maplen ; while (r < spos) { if (!strchr(base64_characters, *r)) { return "MAP contains illegal base64 character." ; } r++ ; } // set the neighborhood based on the map length if (maplen == MAP128LENGTH) { neighbormask = HEXAGONAL ; neighbors = 6 ; } else { if (maplen == MAP32LENGTH) { neighbormask = VON_NEUMANN ; neighbors = 4 ; } } // map looks valid using_map = true ; } else { // create lower case version of rule name without spaces while (r < end) { // get the next character and convert to lowercase c = (char) tolower(*r) ; // process the character switch (c) { // birth case 'b': if (bpos) { // multiple b found return "Only one B allowed." ; } bpos = t ; *t = c ; t++ ; break ; // survival case 's': if (spos) { // multiple s found return "Only one S allowed." ; } spos = t ; *t = c ; t++ ; break ; // slash case '/': if (slashpos) { // multiple slashes found return "Only one slash allowed." ; } slashpos = t ; *t = c ; t++ ; break ; // underscore case '_': if (underscorepos) { // multiple underscores found return "Only one underscore allowed." ; } underscorepos = t ; *t = c ; t++ ; break ; // hex case 'h': if (neighbormask != MOORE || wolfram != -1) { // multiple neighborhoods specified return "Only one neighborhood allowed." ; } neighbormask = HEXAGONAL ; neighbors = 6 ; *t = c ; t++ ; break ; // von neumann case 'v': if (neighbormask != MOORE || wolfram != -1) { // multiple neighborhoods specified return "Only one neighborhood allowed." ; } neighbormask = VON_NEUMANN ; neighbors = 4 ; *t = c ; t++ ; break ; // wolfram case 'w': // check if at beginning of string if (t == tidystring) { if (neighbormask != MOORE || wolfram != -1) { // multiple neighborhoods specified return "Only one neighborhood allowed." ; } wolfram = 0 ; } else { // copy character *t = c ; t++ ; totalistic = false ; } break ; // minus case '-': // check if previous character is a digit if (t == tidystring || *(t-1) < '0' || *(t-1) > '8') { // minus can only follow a digit return "Minus can only follow a digit." ; } *t = c ; t++ ; totalistic = false ; break ; // other characters default: // ignore space if (c != ' ') { // check character is valid charpos = strchr((char*) valid_rule_letters, c) ; if (charpos) { // copy character *t = c ; t++ ; // check if totalistic (i.e. found a valid non-digit) digit = int(charpos - valid_rule_letters) ; if (digit > 8) { totalistic = false ; } else { // update maximum digit found if (digit > maxdigit) { maxdigit = digit ; } } } else if (wolfram == 0 && c == '9') { *t = c ; t++ ; } else { return "Bad character found."; } } break ; } // next character r++ ; } // ensure null terminated *t = 0 ; // don't allow empty rule string t = tidystring ; if (*t == 0) { return "Rule cannot be empty string." ; } // can't have slash and underscore if (underscorepos && slashpos) { return "Can't have slash and underscore." ; } // underscore only valid for non-totalistic rules if (underscorepos && totalistic) { return "Underscore not valid for totalistic rules, use slash." ; } // if underscore defined then set the slash position if (underscorepos) { slashpos = underscorepos ; } // check for Wolfram if (wolfram == 0) { // parse Wolfram 1D rule while (*t >= '0' && *t <= '9') { wolfram = 10 * wolfram + *t - '0' ; t++ ; } if (wolfram < 0 || wolfram > 254 || wolfram & 1) { return "Wolfram rule must be an even number from 0 to 254." ; } if (*t) { return "Bad character in Wolfram rule." ; } } else { // if neighborhood specified then must be last character if (neighbormask != MOORE) { size_t len = strlen(t) ; if (len) { c = t[len - 1] ; if (!((c == 'h') || (c == 'v'))) { return "Neighborhood must be at end of rule." ; } // remove character t[len - 1] = 0 ; } } // at least one of slash, b or s must be present if (!(slashpos || bpos || spos)) { return "Rule must contain a slash or B or S." ; } // digits can not be greater than the number of neighbors for the defined neighborhood if (maxdigit > neighbors) { return "Digit greater than neighborhood allows." ; } // if slash present and both b and s then one must be each side of the slash if (slashpos && bpos && spos) { if ((bpos < slashpos && spos < slashpos) || (bpos > slashpos && spos > slashpos)) { return "B and S must be either side of slash." ; } } // check if there was a slash to divide birth from survival if (!slashpos) { // check if both b and s exist if (bpos && spos) { // determine whether b or s is first if (bpos < spos) { // skip b and cut the string using s bpos++ ; *spos = 0 ; spos++ ; } else { // skip s and cut the string using b spos++ ; *bpos = 0 ; bpos++ ; } } else { // just bpos if (bpos) { bpos = t ; removeChar(bpos, 'b') ; spos = bpos + strlen(bpos) ; } else { // just spos spos = t ; removeChar(spos, 's') ; bpos = spos + strlen(spos) ; } } } else { // slash exists so set determine which part is b and which is s *slashpos = 0 ; // check if b or s are defined if (bpos || spos) { // check for birth first if ((bpos && bpos < slashpos) || (spos && spos > slashpos)) { // birth then survival bpos = t ; spos = slashpos + 1 ; } else { // survival then birth bpos = slashpos + 1 ; spos = t ; } // remove b or s from rule parts removeChar(bpos, 'b') ; removeChar(spos, 's') ; } else { // no b or s so survival first spos = t ; bpos = slashpos + 1 ; } } // if not totalistic and a part exists it must start with a digit if (!totalistic) { // check birth c = *bpos ; if (c && (c < '0' || c > '8')) { return "Non-totalistic birth must start with a digit." ; } // check survival c = *spos ; if (c && (c < '0' || c > '8')) { return "Non-totalistic survival must start with a digit." ; } } // if not totalistic then neighborhood must be Moore if (!totalistic && neighbormask != MOORE) { return "Non-totalistic only supported with Moore neighborhood." ; } // validate letters used against each specified neighbor count if (!lettersValid(bpos)) { return "Letter not valid for birth neighbor count." ; } if (!lettersValid(spos)) { return "Letter not valid for survival neighbor count." ; } } } // AKT: check for rule suffix like ":T200,100" to specify a bounded universe if (colonpos) { const char* err = algo->setgridsize(colonpos) ; if (err) return err ; } else { // universe is unbounded algo->gridwd = 0 ; algo->gridht = 0 ; } // create the rule map if (wolfram >= 0) { // create the 3x3 map from the wolfram code createWolframMap() ; } else { // check for map if (using_map) { // generate the 3x3 map from the supplied MAP string createRuleMapFromMAP(bpos) ; } else { // generate the 3x3 map from the birth and survival rules createRuleMap(bpos, spos) ; } } // save the canonical rule name createCanonicalName(algo, bpos) ; // save the rule saveRule() ; // exit with success return 0 ; } const char* liferules::getrule() { return canonrule ; } // B3/S23 -> (1 << 3) + (1 << (9 + 2)) + (1 << (9 + 3)) = 0x1808 bool liferules::isRegularLife() { return (neighbormask == MOORE && totalistic && rulebits == 0x1808 && wolfram < 0) ; } golly-3.3-src/gollybase/hlifealgo.h0000644000175000017500000003152213247734027014313 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef HLIFEALGO_H #define HLIFEALGO_H #include "lifealgo.h" #include "liferules.h" #include "util.h" /* * Into instances of this node structure is where almost all of the * memory allocated by this program goes. Thus, it is imperative we * keep it as small as possible so we can explore patterns as large * and as deep as possible. * * But first, how does this program even work? Well, there are * two major tricks that are used. * * The first trick is to represent the 2D space `symbolically' * (in the sense that a binary decision diagram is a symbolic * representation of a boolean predicate). This can be thought * of as a sort of compression. We break up space into a grid of * squares, each containing 8x8 cells. And we `canonicalize' * each square; that is, all the squares with no cells set are * represented by a single actual instance of an empty square; * all squares with only the upper-left-most cell set are * represented by yet another instance, and so on. A single pointer * to the single instance of each square takes less space than * representing the actual cell bits themselves. * * Where do we store these pointers? At first, one might envision * a large two-dimensional array of pointers, each one pointing * to one of the square instances. But instead, we group the * squares (we'll call them 8-squares) into larger squares 16 * cells on a side; these are 16-squares. Each 16-square contains * four 8-squares, so each 16-square is represented by four * pointers, each to an 8-square. And we canonicalize these as * well, so for a particular set of values for a 16 by 16 array * of cells, we'll only have a single 16-square. * * And so on up; we canonicalize 32-squares out of 16-squares, and * on up to some limit. Now the limit need not be very large; * having just 20 levels of nodes gives us a universe that is * 4 * 2**20 or about 4M cells on a side. Having 100 levels of * nodes (easily within the limits of this program) gives us a * universe that is 4 * 2**100 or about 5E30 cells on a side. * I've run universes that expand well beyond 1E50 on a side with * this program. * * [A nice thing about this representation is that there are no * coordinate values anywhere, which means that there are no * limits to the coordinate values or complex multidimensional * arithmetic needed.] * * [Note that this structure so far is very similar to the octtrees * used in 3D simulation and rendering programs. It's different, * however, in that we canonicalize the nodes, and also, of course, * in that it is 2D rather than 3D.] * * I mentioned there were two tricks, and that's only the first. * The second trick is to cache the `results' of the LIFE calculation, * but in a way that looks ahead farther in time as you go higher * in the tree, much like the tree nodes themselves scan larger * distances in space. This trick is just a little subtle, but it * is where the bulk of the power of the program comes from. * * Consider once again the 8-squares. We want to cache the result * of executing LIFE on that area. We could cache the result of * looking ahead just one generation; that would yield a 6x6 square. * (Note that we cannot calculate an 8-square, because we are * using the single instance of the 8-square to represent all the * different places that 8x8 arrangement occurs, and those different * places might be surrounded by different border cells. But we * can say for sure that the central 6-square will evolve in a * unique way in the next generation.) * * We could also calculate the 4-square that is two generations * hence, and the 3-square that is three generations hence, and * the 2-square that is four generations hence. We choose the * 4-square that is two generations hence; why will be clear in * a moment. * * Now let's consider the 16-square. We would like to look farther * ahead for this square (if we always only looked two generations * ahead, our runtime would be at *least* linear in the number of * generations, and we want to beat that.) So let's look 4 generations * ahead, and cache the resulting 8-square. So we do. * * Where do we cache the results? Well, we cache the results in the * same node structure we are using to store the pointers to the * smaller squares themselves. And since we're hashing them all * together, we want a next pointer for the hash chain. Put all of * this together, and you get the following structure for the 16-squares * and larger: */ struct node { node *next ; /* hash link */ node *nw, *ne, *sw, *se ; /* constant; nw != 0 means nonleaf */ node *res ; /* cache */ } ; /* * For the 8-squares, we do not have `children', we have actual data * values. We still break up the 8-square into 4-squares, but the * 4-squares only have 16 cells in them, so we represent them directly * by an unsigned short (in this case, the direct value itself takes * less memory than the pointer we might replace it with). * * One minor trick about the following structure. We did lie above * somewhat; sometimes the struct node * points to an actual struct * node, and sometimes it points to a struct leaf. So we need a way * to tell if the thing we are pointing at is a node or a leaf. We * could add another bit to the node structure, but this would grow * it, and we want it to stay as small as possible. Now, notice * that, in all valid struct nodes, all four pointers (nw, ne, sw, * and se) must contain a live non-zero value. We simply ensure * that the struct leaf contains a zero where the first (nw) pointer * field would be in a struct node. * * Each short represents a 4-square in normal, left-to-right then top-down * order from the most significant bit. So bit 0x8000 is the upper * left (or northwest) bit, and bit 0x1000 is the upper right bit, and * so on. */ struct leaf { node *next ; /* hash link */ node *isnode ; /* must always be zero for leaves */ unsigned short nw, ne, sw, se ; /* constant */ bigint leafpop ; /* how many set bits */ unsigned short res1, res2 ; /* constant */ } ; /* * If it is a struct node, this returns a non-zero value, otherwise it * returns a zero value. */ #define is_node(n) (((node *)(n))->nw) /* * For explicit prefetching we retain some state on our lookup * calculations. */ #ifdef USEPREFETCH struct setup_t { g_uintptr_t h ; struct node *nw, *ne, *sw, *se ; void prefetch(node **addr) const { PREFETCH(addr) ; } } ; #endif /** * Our hlifealgo class. */ class hlifealgo : public lifealgo { public: hlifealgo() ; virtual ~hlifealgo() ; // note that for hlifealgo, clearall() releases no memory; it retains // the full cache information but just sets the current pattern to // the empty pattern. virtual void clearall() ; // not implemented virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &state) ; virtual void endofpattern() ; virtual void setIncrement(bigint inc) ; virtual void setIncrement(int inc) { setIncrement(bigint(inc)) ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; virtual int hyperCapable() { return 1 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmem >> 20) ; } virtual const char *setrule(const char *s) ; virtual const char *getrule() { return hliferules.getrule() ; } virtual void step() ; virtual void* getcurrentstate() { return root ; } virtual void setcurrentstate(void *n) ; /* * The contract of draw() is that it render every pixel in the * viewport precisely once. This allows us to eliminate all * flashing. Later we'll make this be damage-specific. */ virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *readmacrocell(char *line) ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: /* * Some globals representing our universe. The root is the * real root of the universe, and the depth is the depth of the * tree where 2 means that root is a leaf, and 3 means that the * children of root are leaves, and so on. The center of the * root is always coordinate position (0,0), so at startup the * x and y coordinates range from -4..3; in general, * -(2**depth)..(2**depth)-1. The zeronodea is an * array of canonical `empty-space' nodes at various depths. * The ngens is an input parameter which is the second power of * the number of generations to run. */ node *root ; int depth ; node **zeronodea ; int nzeros ; /* * Finally, our gc routine. We keep a `stack' of all the `roots' * we want to preserve. Nodes not reachable from here, we allow to * be freed. Same with leaves. */ node **stack ; int stacksize ; g_uintptr_t hashpop, hashlimit, hashprime ; #ifndef PRIMEMOD g_uintptr_t hashmask ; #endif static double maxloadfactor ; node **hashtab ; int halvesdone ; int gsp ; g_uintptr_t alloced, maxmem ; node *freenodes ; int okaytogc ; g_uintptr_t totalthings ; node *nodeblocks ; char *ruletable ; bigint population ; bigint setincrement ; bigint pow2step ; // greatest power of two in increment int nonpow2 ; // increment / pow2step int ngens ; // log2(pow2step) int popValid, needPop, inGC ; /* * When rendering we store the relevant bits here rather than * passing them deep into recursive subroutines. */ liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag ; int llbits, llsize ; char *llxb, *llyb ; int hashed ; int cacheinvalid ; g_uintptr_t cellcounter ; // used when writing g_uintptr_t writecells ; // how many to write int gccount ; // how many gcs total this pattern int gcstep ; // how many gcs this step hperf running_hperf, step_hperf, inc_hperf ; int softinterrupt ; static char statusline[] ; // void leafres(leaf *n) ; void resize() ; node *find_node(node *nw, node *ne, node *sw, node *se) ; #ifdef USEPREFETCH node *find_node(setup_t &su) ; void setupprefetch(setup_t &su, node *nw, node *ne, node *sw, node *se) ; #endif void unhash_node(node *n) ; void unhash_node2(node *n) ; void rehash_node(node *n) ; leaf *find_leaf(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se) ; node *getres(node *n, int depth) ; node *dorecurs(node *n, node *ne, node *t, node *e, int depth) ; node *dorecurs_half(node *n, node *ne, node *t, node *e, int depth) ; leaf *dorecurs_leaf(leaf *n, leaf *ne, leaf *t, leaf *e) ; leaf *dorecurs_leaf_half(leaf *n, leaf *ne, leaf *t, leaf *e) ; leaf *dorecurs_leaf_quarter(leaf *n, leaf *ne, leaf *t, leaf *e) ; node *newnode() ; leaf *newleaf() ; node *newclearednode() ; leaf *newclearedleaf() ; void pushroot_1() ; int node_depth(node *n) ; node *zeronode(int depth) ; node *pushroot(node *n) ; node *gsetbit(node *n, int x, int y, int newstate, int depth) ; int getbit(node *n, int x, int y, int depth) ; int nextbit(node *n, int x, int y, int depth) ; node *hashpattern(node *root, int depth) ; node *popzeros(node *n) ; const bigint &calcpop(node *root, int depth) ; void aftercalcpop2(node *root, int depth) ; void afterwritemc(node *root, int depth) ; void calcPopulation() ; node *save(node *n) ; void pop(int n) ; void clearstack() ; void clearcache() ; void gc_mark(node *root, int invalidate) ; void do_gc(int invalidate) ; void clearcache(node *n, int depth, int clearto) ; void clearcache_p1(node *n, int depth, int clearto) ; void clearcache_p2(node *n, int depth, int clearto) ; void new_ngens(int newval) ; int log2(unsigned int n) ; node *runpattern() ; void renderbm(int x, int y) ; void fill_ll(int d) ; void drawnode(node *n, int llx, int lly, int depth, node *z) ; void ensure_hashed() ; g_uintptr_t writecell(std::ostream &os, node *root, int depth) ; g_uintptr_t writecell_2p1(node *root, int depth) ; g_uintptr_t writecell_2p2(std::ostream &os, node *root, int depth) ; void unpack8x8(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se, unsigned int *top, unsigned int *bot) ; liferules hliferules ; } ; #endif golly-3.3-src/gollybase/ruleloaderalgo.h0000644000175000017500000000212713145740437015360 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef RULELOADERALGO_H #define RULELOADERALGO_H #include "ghashbase.h" #include "ruletable_algo.h" #include "ruletreealgo.h" /** * This algorithm loads rule data from external files. */ class ruleloaderalgo : public ghashbase { public: ruleloaderalgo(); virtual ~ruleloaderalgo(); virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se); virtual const char* setrule(const char* s); virtual const char* getrule(); virtual const char* DefaultRule(); virtual int NumCellStates(); static void doInitializeAlgoInfo(staticAlgoInfo &); protected: ruletable_algo* LocalRuleTable; // local instance of RuleTable algo ruletreealgo* LocalRuleTree; // local instance of RuleTree algo enum RuleTypes {TABLE, TREE} rule_type; void SetAlgoVariables(RuleTypes ruletype); const char* LoadTableOrTree(FILE* rulefile, const char* rule); }; extern const char* noTABLEorTREE; #endif golly-3.3-src/gollybase/ruletable_algo.h0000644000175000017500000000363313145740437015343 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef RULETABLE_ALGO_H #define RULETABLE_ALGO_H #include "ghashbase.h" #include #include #include /** * An algo that takes a rule table. */ class ruletable_algo : public ghashbase { public: ruletable_algo() ; virtual ~ruletable_algo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; // these two methods are needed for RuleLoader algo bool IsDefaultRule(const char* rulename); const char* LoadTable(FILE* rulefile, int lineno, char endchar, const char* s); protected: std::string LoadRuleTable(std::string filename); void PackTransitions(const std::string& symmetries, int n_inputs, const std::vector< std::pair< std::vector< std::vector >, state> > & transition_table); void PackTransition(const std::vector< std::vector > & inputs, state output); protected: std::string current_rule; unsigned int n_states; enum TNeighborhood { vonNeumann, Moore, hexagonal, oneDimensional } neighborhood; static const int N_SUPPORTED_NEIGHBORHOODS = 4; static const std::string neighborhood_value_keywords[N_SUPPORTED_NEIGHBORHOODS]; // we use a lookup table to match inputs to outputs: typedef unsigned long long int TBits; // we can use unsigned int if we hit portability issues (not much slower) std::vector< std::vector< std::vector > > lut; // TBits lut[neighbourhood_size][n_states][n_compressed_rules]; unsigned int n_compressed_rules; std::vector output; // state output[n_rules]; }; #endif golly-3.3-src/gollybase/ltldraw.cpp0000644000175000017500000003320113247734027014361 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "ltlalgo.h" #include "util.h" #include // for memset and memcpy // ----------------------------------------------------------------------------- // A 256x256 pixmap is good for OpenGL and matches the size // used in qlifedraw.cpp and hlifedraw.cpp. // Note that logpmsize *must* be 8 in iOS 9.x to avoid drawing problems // in my iPad (probably due to a bug in the OpenGL ES 2 driver). const int logpmsize = 8; // 8=256x256 const int pmsize = (1< 0) { pmag = 1 << view.getmag(); mag = 0; } else { pmag = 1; mag = -view.getmag(); } // get pixel position in view of grid's top left cell pair ltpxl = view.screenPosOf(gridleft, gridtop, this); if (renderer.justState() || pmag > 1) { if (unbounded) { // simply display the entire grid -- ie. no need to use pixbuf int x = ltpxl.first; // already multiplied by pmag int y = ltpxl.second; // ditto int wd = gwd * pmag; int ht = ght * pmag; if (renderer.justState()) renderer.stateblit(x, y, wd, ht, currgrid) ; else renderer.pixblit(x, y, wd, ht, currgrid, pmag); } else { // the universe is bounded so we need to include the outer border bigint outerleft = gridleft; bigint outertop = gridtop; outerleft -= border; outertop -= border; ltpxl = view.screenPosOf(outerleft, outertop, this); int x = ltpxl.first; int y = ltpxl.second; int wd = outerwd * pmag; int ht = outerht * pmag; if (renderer.justState()) renderer.stateblit(x, y, wd, ht, outergrid1) ; else renderer.pixblit(x, y, wd, ht, outergrid1, pmag); } } else { // pmag is 1 so first fill pixbuf with dead cells killpixels(); if (mag == 0) { // divide grid into pmsize * pmsize blocks and draw them at scale 1:1 for (int row = 0; row < ght; row += pmsize) { for (int col = 0; col < gwd; col += pmsize) { // don't go beyond bottom/right edges of grid int jmax = row + pmsize <= ght ? pmsize : pmsize - (row + pmsize - ght); int imax = col + pmsize <= gwd ? pmsize : pmsize - (col + pmsize - gwd); // check if this block is visible in view int x = ltpxl.first + col; int y = ltpxl.second + row; if (x >= vieww || y >= viewh || x+imax <= 0 || y+jmax <= 0) { // not visible } else { // get cell at top left corner of this block unsigned char* cellptr = currgrid + row * outerwd + col; // find live cells in this block and store their RGBA data in pixbuf for (int j = 0; j < jmax; j++) { unsigned char* p = cellptr; int pixrow = j * pmsize; for (int i = 0; i < imax; i++) { if (*p > 0) pixRGBAbuf[pixrow + i] = cellRGBA[*p]; p++; } cellptr += outerwd; } // draw this block renderer.pixblit(x, y, pmsize, pmsize, pixbuf, 1); killpixels(); } } } } else { // mag > 0 (actually zoomed out); // divide grid into pmsize*(2^mag) * pmsize*(2^mag) blocks, shrinking them down // to pmsize * pmsize, and draw all non-zero cells using the state 1 color unsigned int state1RGBA = cellRGBA[1]; // check if grid shrinks to 1 pixel if ((gwd >> mag) == 0 && (ght >> mag) == 0) { pixRGBAbuf[0] = state1RGBA; // there is at least 1 live cell in grid int x = ltpxl.first; int y = ltpxl.second; renderer.pixblit(x, y, pmsize, pmsize, pixbuf, 1); pixRGBAbuf[0] = cellRGBA[0]; return; } // above check should avoid overflow in blocksize calc, but play safe if (mag > 20) mag = 20; pmag = 1 << mag; int blocksize = pmsize * pmag; for (int row = 0; row < ght; row += blocksize) { for (int col = 0; col < gwd; col += blocksize) { // check if shrunken block is visible in view int x = ltpxl.first + (col >> mag); int y = ltpxl.second + (row >> mag); if (x >= vieww || y >= viewh || x+pmsize <= 0 || y+pmsize <= 0) { // not visible } else { // get cell at top left corner of this big block unsigned char* cellptr = currgrid + row * outerwd + col; // avoid going way beyond bottom/right edges of grid int jmax = row + blocksize <= ght ? blocksize : blocksize - (row + blocksize - ght); int imax = col + blocksize <= gwd ? blocksize : blocksize - (col + blocksize - gwd); for (int j = 0; j < jmax; j += pmag) { unsigned char* p = cellptr; int sqtop = row + j; for (int i = 0; i < imax; i += pmag) { // shrink pmag*pmag cells in grid down to 1 pixel in pixbuf int sqleft = col + i; for (int r = 0; r < pmag; r++) { if (sqtop + r < ght) { unsigned char* topleft = p + r * outerwd; for (int c = 0; c < pmag; c++) { if (sqleft + c < gwd) { unsigned char* q = topleft + c; if (*q > 0) { pixRGBAbuf[(j >> mag) * pmsize + (i >> mag)] = state1RGBA; // no need to keep looking in this square goto found1; } } } } } found1: p += pmag; } cellptr += outerwd * pmag; } // draw the shrunken block renderer.pixblit(x, y, pmsize, pmsize, pixbuf, 1); killpixels(); } } } } } } // ----------------------------------------------------------------------------- void ltlalgo::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { if (population == 0) { // return impossible edges to indicate an empty pattern; // not really a problem because caller should check first *ptop = 1; *pleft = 1; *pbottom = 0; *pright = 0; return; } // the code in ltlalgo.cpp maintains a boundary of live cells in // minx,miny,maxx,maxy but it might not be the minimal boundary // (eg. if user deleted some live cells) // find the top edge (miny) for (int row = miny; row <= maxy; row++) { unsigned char* cellptr = currgrid + row * outerwd + minx; for (int col = minx; col <= maxx; col++) { if (*cellptr > 0) { miny = row; goto found_top; } cellptr++; } } // should never get here if population > 0 lifefatal("Bug detected in ltlalgo::findedges!"); found_top: // find the bottom edge (maxy) for (int row = maxy; row >= miny; row--) { unsigned char* cellptr = currgrid + row * outerwd + minx; for (int col = minx; col <= maxx; col++) { if (*cellptr > 0) { maxy = row; goto found_bottom; } cellptr++; } } found_bottom: // find the left edge (minx) for (int col = minx; col <= maxx; col++) { unsigned char* cellptr = currgrid + miny * outerwd + col; for (int row = miny; row <= maxy; row++) { if (*cellptr > 0) { minx = col; goto found_left; } cellptr += outerwd; } } found_left: // find the right edge (maxx) for (int col = maxx; col >= minx; col--) { unsigned char* cellptr = currgrid + miny * outerwd + col; for (int row = miny; row <= maxy; row++) { if (*cellptr > 0) { maxx = col; goto found_right; } cellptr += outerwd; } } found_right: // set pattern edges (in cell coordinates) *ptop = int(miny + gtop); *pleft = int(minx + gleft); *pbottom = int(maxy + gtop); *pright = int(maxx + gleft); } // ----------------------------------------------------------------------------- void ltlalgo::fit(viewport &view, int force) { if (population == 0) { view.center(); view.setmag(MAX_MAG); return; } bigint top, left, bottom, right; findedges(&top, &left, &bottom, &right); if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(left, top) && view.contains(right, bottom)) return; } bigint midx = right; midx -= left; midx += bigint::one; midx.div2(); midx += left; bigint midy = bottom; midy -= top; midy += bigint::one; midy.div2(); midy += top; int mag = MAX_MAG; for (;;) { view.setpositionmag(midx, midy, mag); if (view.contains(left, top) && view.contains(right, bottom)) break; mag--; } } // ----------------------------------------------------------------------------- void ltlalgo::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return; x >>= -mag; x <<= -mag; y -= 1; y >>= -mag; y <<= -mag; y += 1; } golly-3.3-src/gollybase/liferender.h0000644000175000017500000000511213247734027014474 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * Encapsulate a class capable of rendering a life universe. * Note that we only use blitbit calls (no setpixel). * Coordinates are in the same coordinate system as the * viewport min/max values. * * Also note that the render is responsible for deciding how * to scale bits up as necessary, whether using the graphics * hardware or the CPU. Blits will only be called with * reasonable bitmaps (32x32 or larger, probably) so the * overhead should not be horrible. Also, the bitmap must * have zeros for all pixels to the left and right of those * requested to be rendered (just for simplicity). * * If clipping is needed, it's the responsibility of these * routines, *not* the caller (although the caller should make * every effort to not call these routines with out of bound * values). */ #ifndef LIFERENDER_H #define LIFERENDER_H class liferender { public: liferender() : juststate(0) {} liferender(int state) : juststate(state) {} int justState() { return juststate ; } virtual ~liferender() ; // First two methods (pixblit/getcolors) only called for normal // display renderers. For "getstate" renderers, these will never // be called. // pixblit is used to draw a pixel map by passing data in two formats: // If pmscale == 1 then pm data contains 4*w*h bytes where each // byte quadruplet contains the RGBA values for the corresponding pixel. // If pmscale > 1 then pm data contains (w/pmscale)*(h/pmscale) bytes // where each byte is a cell state (0..255). This allows the rendering // code to display either icons or colors. virtual void pixblit(int x, int y, int w, int h, unsigned char* pm, int pmscale) ; // the drawing code needs access to the current layer's colors, // and to the transparency values for dead pixels and live pixels virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b, unsigned char* dead_alpha, unsigned char* live_alpha) ; // for state renderers, this just copies the cell state; no scaling is // supported. Only called for juststate renderers. virtual void stateblit(int x, int y, int w, int h, unsigned char* pm) ; private: int juststate ; } ; class staterender : public liferender { public: staterender(unsigned char *_buf, int _vw, int _vh) : liferender(1), buf(_buf), vw(_vw), vh(_vh) {} virtual void stateblit(int x, int y, int w, int h, unsigned char* pm) ; private: unsigned char *buf ; int vw, vh ; } ; #endif golly-3.3-src/gollybase/ltlalgo.h0000755000175000017500000001427313543255652014027 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. // This is the code for the "Larger than Life" family of rules. #ifndef LTLALGO_H #define LTLALGO_H #include "lifealgo.h" #include "liferules.h" // for MAXRULESIZE #include class ltlalgo : public lifealgo { public: ltlalgo(); virtual ~ltlalgo(); virtual void clearall(); virtual int setcell(int x, int y, int newstate); virtual int getcell(int x, int y); virtual int nextcell(int x, int y, int& v); virtual void endofpattern(); virtual void setIncrement(bigint inc) { increment = inc; } virtual void setIncrement(int inc) { increment = inc; } virtual void setGeneration(bigint gen) { generation = gen; } virtual const bigint& getPopulation(); virtual int isEmpty(); virtual int hyperCapable() { return 0; } virtual void setMaxMemory(int m) {} virtual int getMaxMemory() { return 0; } virtual const char* setrule(const char* s); virtual const char* getrule(); virtual const char* DefaultRule(); virtual int NumCellStates(); virtual int NumRandomizedCellStates() { return 2 ; } virtual void step(); virtual void* getcurrentstate() { return 0; } virtual void setcurrentstate(void*) {} virtual void draw(viewport& view, liferender& renderer); virtual void fit(viewport& view, int force); virtual void lowerRightPixel(bigint& x, bigint& y, int mag); virtual void findedges(bigint* t, bigint* l, bigint* b, bigint* r); virtual const char* writeNativeFormat(std::ostream&, char*) { return "No native format for ltlalgo."; } static void doInitializeAlgoInfo(staticAlgoInfo&); private: char canonrule[MAXRULESIZE]; // canonical version of valid rule passed into setrule int population; // number of non-zero cells in current generation int gwd, ght; // width and height of grid (in cells) int gwdm1, ghtm1; // gwd-1, ght-1 (bottom right corner of grid) unsigned char* currgrid; // points to gwd*ght cells for current generation unsigned char* nextgrid; // points to gwd*ght cells for next generation int minx, miny, maxx, maxy; // boundary of live cells (in grid coordinates) int gtop, gleft, gbottom, gright; // cell coordinates of grid edges vector cell_list; // used by save_cells and restore_cells bool show_warning; // flag used to avoid multiple warning dialogs int* colcounts; // cumulative column counts of state-1 cells // bounded grids are surrounded by a border of cells (with thickness = range+1) // so we can calculate neighborhood counts without checking for edge conditions; // note that in an unbounded universe outerwd = gwd, outerht = ght, // currgrid = outergrid1, nextgrid = outergrid2 int border; // border thickness in cells (depends on range) int outerwd, outerht; // width and height of bounded grids (including border) int outerbytes; // outerwd*outerht unsigned char* outergrid1; // points to outerwd*outerht cells for current generation unsigned char* outergrid2; // points to outerwd*outerht cells for next generation int *shape ; // for shaped neighborhoods, this is the shape // these variables are used in getcount and faster_Neumann_* int ccht; // height of colcounts array when ntype = N int halfccwd; // half width of colcounts array when ntype = N int nrows, ncols; // size of rectangle being processed // rule parameters (set by setrule) int range; // neighborhood radius int rangec; // squared radius of circle int totalistic; // include middle cell in neighborhood count? (1 or 0) int minS, maxS; // limits for survival int minB, maxB; // limits for birth char ntype; // extended neighborhood type (M = Moore, N = von Neumann, C = shaped (circle)) char topology; // grid topology (T = torus, P = plane) void create_grids(int wd, int ht); // create a bounded universe of given width and height void allocate_colcounts(); // allocate the colcounts array void empty_boundaries(); // set minx, miny, maxx, maxy when population is 0 void save_cells(); // save current pattern in cell_list void restore_cells(); // restore pattern from cell_list void do_bounded_gen(); // calculate the next generation in a bounded universe bool do_unbounded_gen(); // calculate the next generation in an unbounded universe int getcount(int i, int j); // used in faster_Neumann_* const char* resize_grids(int up, int down, int left, int right); // try to resize an unbounded universe by the given amounts (possibly -ve); // if it fails then return a suitable error message void fast_Moore(int mincol, int minrow, int maxcol, int maxrow); void faster_Moore_bounded(int mincol, int minrow, int maxcol, int maxrow); void faster_Moore_bounded2(int mincol, int minrow, int maxcol, int maxrow); void faster_Moore_unbounded(int mincol, int minrow, int maxcol, int maxrow); void faster_Moore_unbounded2(int mincol, int minrow, int maxcol, int maxrow); void fast_Neumann(int mincol, int minrow, int maxcol, int maxrow); void faster_Neumann_bounded(int mincol, int minrow, int maxcol, int maxrow); void faster_Neumann_unbounded(int mincol, int minrow, int maxcol, int maxrow); void fast_Shaped(int mincol, int minrow, int maxcol, int maxrow); // these routines are called from do_*_gen to process a rectangular region of cells void update_current_grid(unsigned char &state, int ncount); void update_next_grid(int x, int y, int xyoffset, int ncount); // called from each of the fast* routines to set the state of the x,y cell // in nextgrid based on the given neighborhood count }; #endif golly-3.3-src/gollybase/readpattern.cpp0000644000175000017500000007720513441044674015233 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "readpattern.h" #include "lifealgo.h" #include "liferules.h" // for MAXRULESIZE #include "util.h" // for lifewarning and *progress calls #include #ifdef ZLIB #include #endif #include #include #define LINESIZE 20000 #define CR 13 #define LF 10 bool getedges = false; // find pattern edges? bigint top, left, bottom, right; // the pattern edges #ifdef __APPLE__ #define BUFFSIZE 4096 // 4K is best for Mac OS X #else #define BUFFSIZE 8192 // 8K is best for Windows and other platforms??? #endif #ifdef ZLIB gzFile zinstream ; #else FILE *pattfile ; #endif char filebuff[BUFFSIZE]; int buffpos, bytesread, prevchar; long filesize; // length of file in bytes // use buffered getchar instead of slow fgetc // don't override the "getchar" name which is likely to be a macro int mgetchar() { if (buffpos == BUFFSIZE) { double filepos; #ifdef ZLIB bytesread = gzread(zinstream, filebuff, BUFFSIZE); #if ZLIB_VERNUM >= 0x1240 // gzoffset is only available in zlib 1.2.4 or later filepos = gzoffset(zinstream); #else // use an approximation of file position if file is compressed filepos = gztell(zinstream); if (filepos > 0 && gzdirect(zinstream) == 0) filepos /= 4; #endif #else bytesread = fread(filebuff, 1, BUFFSIZE, pattfile); filepos = ftell(pattfile); #endif buffpos = 0; lifeabortprogress(filepos / filesize, ""); } if (buffpos >= bytesread) return EOF; return filebuff[buffpos++]; } // use getline instead of fgets so we can handle DOS/Mac/Unix line endings char *getline(char *line, int maxlinelen) { int i = 0; while (i < maxlinelen) { int ch = mgetchar(); if (isaborted()) return NULL; switch (ch) { case CR: prevchar = CR; line[i] = 0; return line; case LF: if (prevchar != CR) { prevchar = LF; line[i] = 0; return line; } // if CR+LF (DOS) then ignore the LF break; case EOF: if (i == 0) return NULL; line[i] = 0; return line; default: prevchar = ch; line[i++] = (char) ch; break; } } line[i] = 0; // silently truncate long line return line; } const char *SETCELLERROR = "Impossible; set cell error for state 1" ; // Read a text pattern like "...ooo$$$ooo" where '.', ',' and chars <= ' ' // represent dead cells, '$' represents 10 dead cells, and all other chars // represent live cells. const char *readtextpattern(lifealgo &imp, char *line) { int x=0, y=0; char *p; do { for (p = line; *p; p++) { if (*p == '.' || *p == ',' || *p <= ' ') { x++; } else if (*p == '$') { x += 10; } else { if (imp.setcell(x, y, 1) < 0) { return SETCELLERROR ; } x++; } } y++ ; if (getedges && right.toint() < x - 1) right = x - 1; x = 0; } while (getline(line, LINESIZE)); if (getedges) bottom = y - 1; return 0 ; } /* * Parse "#CXRLE key=value key=value ..." line and extract values. */ void ParseXRLELine(char *line, int *xoff, int *yoff, bool *sawpos, bigint &gen) { char *key = line; while (key) { // set key to start of next key word while (*key && *key != ' ') key++; while (*key == ' ') key++; if (*key == 0) return; // set value to pos of char after next '=' char *value = key; while (*value && *value != '=') value++; if (*value == 0) return; value++; if (strncmp(key, "Pos", 3) == 0) { // extract Pos=int,int sscanf(value, "%d,%d", xoff, yoff); *sawpos = true; } else if (strncmp(key, "Gen", 3) == 0) { // extract Gen=bigint char *p = value; while (*p >= '0' && *p <= '9') p++; char savech = *p; *p = 0; gen = bigint(value); *p = savech; value = p; } key = value; } } /* * Read an RLE pattern into given life algorithm implementation. */ const char *readrle(lifealgo &imp, char *line) { int n=0, x=0, y=0 ; char *p ; char *ruleptr; const char *errmsg; int wd=0, ht=0, xoff=0, yoff=0; bigint gen = bigint::zero; bool sawpos = false; // xoff and yoff set in ParseXRLELine? bool sawrule = false; // saw explicit rule? // parse any #CXRLE line(s) at start while (strncmp(line, "#CXRLE", 6) == 0) { ParseXRLELine(line, &xoff, &yoff, &sawpos, gen); imp.setGeneration(gen); if (getline(line, LINESIZE) == NULL) return 0; } do { if (line[0] == '#') { if (line[1] == 'r') { ruleptr = line; ruleptr += 2; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } // there's a slight ambiguity here for extended RLE when a line // starts with 'x'; we only treat it as a dimension line if the // next char is whitespace or '=', since 'x' will only otherwise // occur as a two-char token followed by an upper case alphabetic. } else if (line[0] == 'x' && (line[1] <= ' ' || line[1] == '=')) { // extract wd and ht p = line; while (*p && *p != '=') p++; p++; sscanf(p, "%d", &wd); while (*p && *p != '=') p++; p++; sscanf(p, "%d", &ht); while (*p && *p != 'r') p++; if (strncmp(p, "rule", 4) == 0) { p += 4; while (*p && (*p <= ' ' || *p == '=')) p++; ruleptr = p; while (*p > ' ') p++; // remove any comma at end of rule if (p[-1] == ',') p--; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; } // imp.setrule() has set imp.gridwd and imp.gridht if (!sawpos && (imp.gridwd > 0 || imp.gridht > 0)) { if (wd > 0 && (wd <= (int)imp.gridwd || imp.gridwd == 0) && ht > 0 && (ht <= (int)imp.gridht || imp.gridht == 0)) { // pattern size is known and fits within the bounded grid // so position pattern in the middle of the grid xoff = -int(wd / 2); yoff = -int(ht / 2); } else { // position pattern at top left corner of bounded grid // to try and ensure the entire pattern will fit xoff = -int(imp.gridwd / 2); yoff = -int(imp.gridht / 2); } } if (getedges) { top = yoff; left = xoff; bottom = yoff + ht - 1; right = xoff + wd - 1; } } else { int gwd = (int)imp.gridwd; int ght = (int)imp.gridht; for (p=line; *p; p++) { char c = *p ; if ('0' <= c && c <= '9') { n = n * 10 + c - '0' ; } else { if (n == 0) n = 1 ; if (c == 'b' || c == '.') { x += n ; } else if (c == '$') { x = 0 ; y += n ; } else if (c == '!') { return 0; } else if (('o' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { int state = -1 ; if (c == 'o') state = 1 ; else if (c < 'o') { state = c - 'A' + 1 ; } else { state = 24 * (c - 'p' + 1) ; p++ ; c = *p ; if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1 ; } else { // return "Illegal multi-char state" ; // be more forgiving so we can read non-standard rle files like // those at http://home.interserv.com/~mniemiec/lifepage.htm state = 1 ; p-- ; } } // write run of cells to grid checking cells are within any bounded grid if (ght == 0 || y < ght) { while (n-- > 0) { if (gwd == 0 || x < gwd) { if (imp.setcell(xoff + x, yoff + y, state) < 0) return "Cell state out of range for this algorithm" ; } x++; } } } n = 0 ; } } } } while (getline(line, LINESIZE)); return 0; } /* * This ugly bit of code will go undocumented. It reads Alan Hensel's * PC Life format, either 1.05 or 1.06. */ const char *readpclife(lifealgo &imp, char *line) { int x=0, y=0 ; int leftx = x ; char *p ; char *ruleptr; const char *errmsg; bool sawrule = false; // saw explicit rule? do { if (line[0] == '#') { if (line[1] == 'P') { if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; // in case there are many #P lines } sscanf(line + 2, " %d %d", &x, &y) ; leftx = x ; } else if (line[1] == 'N') { errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; } else if (line[1] == 'R') { ruleptr = line; ruleptr += 2; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } } else if (line[0] == '-' || ('0' <= line[0] && line[0] <= '9')) { sscanf(line, "%d %d", &x, &y) ; if (imp.setcell(x, y, 1) < 0) return SETCELLERROR ; } else if (line[0] == '.' || line[0] == '*') { for (p = line; *p; p++) { if (*p == '*') { if (imp.setcell(x, y, 1) < 0) return SETCELLERROR ; } x++ ; } x = leftx ; y++ ; } } while (getline(line, LINESIZE)); return 0; } /* * This routine reads David Bell's dblife format. */ const char *readdblife(lifealgo &imp, char *line) { int n=0, x=0, y=0; char *p; while (getline(line, LINESIZE)) { if (line[0] != '!') { // parse line like "23.O15.3O15.3O15.O4.4O" n = x = 0; for (p=line; *p; p++) { if ('0' <= *p && *p <= '9') { n = n * 10 + *p - '0'; } else { if (n == 0) n = 1; if (*p == '.') { x += n; } else if (*p == 'O') { while (n-- > 0) if (imp.setcell(x++, y, 1) < 0) return SETCELLERROR ; } else { // ignore dblife commands like "5k10h@" } n = 0; } } y++; } } return 0; } // // Read Mirek Wojtowicz's MCell format. // See http://psoup.math.wisc.edu/mcell/ca_files_formats.html for details. // const char *readmcell(lifealgo &imp, char *line) { int x = 0, y = 0; int wd = 0, ht = 0; // bounded if > 0 int wrapped = 0; // plane if 0, torus if 1 char *p; const char *errmsg; bool sawrule = false; // saw explicit rule? bool extendedHL = false; // special-case rule translation for extended HistoricalLife rules bool useltl = false; // using a Larger than Life rule? char ltlrule[MAXRULESIZE]; // the Larger than Life rule (without any suffix) int defwd = 0, defht = 0; // default grid size for Larger than Life int Lcount = 0; // number of #L lines seen while (getline(line, LINESIZE)) { if (line[0] == '#') { if (line[1] == 'L' && line[2] == ' ') { if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; } Lcount++; if (Lcount == 1 && useltl) { // call setrule again with correct width and height so we don't need // yet another setrule call at the end char rule[MAXRULESIZE]; if (wd == 0 && ht == 0) { // no #BOARD line was seen so use default size saved earlier wd = defwd; ht = defht; } if (wrapped) sprintf(rule, "%s:T%d,%d", ltlrule, wd, ht); else sprintf(rule, "%s:P%d,%d", ltlrule, wd, ht); errmsg = imp.setrule(rule); if (errmsg) return errmsg; } int n = 0; for (p=line+3; *p; p++) { char c = *p; if ('0' <= c && c <= '9') { n = n * 10 + c - '0'; } else if (c > ' ') { if (n == 0) n = 1; if (c == '.') { x += n; } else if (c == '$') { x = -(wd/2); y += n; } else { int state = 0; if ('a' <= c && c <= 'j') { state = 24 * (c - 'a' + 1); p++; c = *p; } if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1; if (extendedHL) { // adjust marked states for LifeHistory if (state == 8) state = 4; else if (state == 3) state = 5; else if (state == 5) state = 3; } } else { return "Illegal multi-char state"; } while (n-- > 0) { if (imp.setcell(x, y, state) < 0) { // instead of returning an error message like "Cell state out of range" // it's nicer to convert the state to 1 (this is what MCell seems to do // for patterns like Bug1.mcl in its LtL collection) imp.setcell(x, y, 1); } x++; } } n = 0; } } // look for Larger than Life } else if (strncmp(line, "#GAME Larger than Life", 22) == 0) { useltl = true; // look for bounded universe } else if (strncmp(line, "#BOARD ", 7) == 0) { sscanf(line + 7, "%dx%d", &wd, &ht); // write pattern in top left corner initially // (pattern will be shifted to middle of grid below) x = -(wd/2); y = -(ht/2); // look for topology } else if (strncmp(line, "#WRAP ", 6) == 0) { sscanf(line + 6, "%d", &wrapped); // we allow lines like "#GOLLY WireWorld" } else if (!sawrule && (strncmp(line, "#GOLLY", 6) == 0 || strncmp(line, "#RULE", 5) == 0) ) { if (strncmp(line, "#RULE 1,0,1,0,0,0,1,0,0,0,0,0,0,2,2,1,1,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2", 69) == 0) { // standard HistoricalLife rule -- all states transfer directly to LifeHistory if (strncmp(line, "#RULE 1,0,1,0,0,0,1,0,0,0,0,0,0,2,2,1,1,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,", 70) == 0) { // special case: Brice Due's extended HistoricalLife rules have // non-contiguous states (State 8 but no State 4, 6, or 7) // that need translating to work in LifeHistory) extendedHL = true; } errmsg = imp.setrule("LifeHistory"); if (errmsg) return errmsg; sawrule = true; } else if (strncmp(line, "#RULE 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1", 40) == 0) { errmsg = imp.setrule("B3/S23"); if (errmsg) errmsg = imp.setrule("Life"); if (errmsg) return errmsg; sawrule = true; } else { char *ruleptr = line; // skip "#GOLLY" or "#RULE" ruleptr += line[1] == 'G' ? 6 : 5; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; if (useltl) { // save suffix-less rule string for later use when we see first #L line sprintf(ltlrule, "%s", ruleptr); // also save default grid size in case there is no #BOARD line defwd = imp.gridwd; defht = imp.gridht; } sawrule = true; } } } } if (wd > 0 || ht > 0) { if (useltl) { // setrule has already been called above } else { // grid is bounded, so append suitable suffix to rule char rule[MAXRULESIZE]; if (wrapped) sprintf(rule, "%s:T%d,%d", imp.getrule(), wd, ht); else sprintf(rule, "%s:P%d,%d", imp.getrule(), wd, ht); errmsg = imp.setrule(rule); if (errmsg) { // should never happen lifewarning("Bug in readmcell code!"); return errmsg; } } // shift pattern to middle of bounded grid imp.endofpattern(); if (!imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right); // pattern is currently in top left corner so shift down and right // (note that we add 1 to wd and ht to get same position as MCell) int shiftx = (wd + 1 - (right.toint() - left.toint() + 1)) / 2; int shifty = (ht + 1 - (bottom.toint() - top.toint() + 1)) / 2; if (shiftx > 0 || shifty > 0) { for (y = bottom.toint(); y >= top.toint(); y--) { for (x = right.toint(); x >= left.toint(); x--) { int state = imp.getcell(x, y); if (state > 0) { imp.setcell(x, y, 0); imp.setcell(x+shiftx, y+shifty, state); } } } } } } return 0; } long getfilesize(const char *filename) { long flen = 0; FILE *f = fopen(filename, "r"); if (f != 0) { fseek(f, 0L, SEEK_END); flen = ftell(f); fclose(f); } return flen; } // This function guesses whether `line' is the start of a headerless Life RLE // pattern. It is used to distinguish headerless RLE from plain text patterns. static bool isplainrle(const char *line) { // Find end of line, or terminating '!' character, whichever comes first: const char *end = line; while (*end && *end != '!') ++end; // Verify that '!' (if present) is the final printable character: if (*end == '!') { for (const char *p = end + 1; *p; ++p) { if ((unsigned)*p > ' ') { return false; } } } // Ensure line consists of valid tokens: bool prev_digit = false, have_digit = false; for (const char *p = line; p != end; ++p) { if ((unsigned)*p <= ' ') { if (prev_digit) return false; // space inside token! } else if (*p >= '0' && *p <= '9') { prev_digit = have_digit = true; } else if (*p == 'b' || *p == 'o' || *p == '$') { prev_digit = false; } else { return false; // unsupported printable character encountered! } } if (prev_digit) return false; // end of line inside token! // Everything seems parseable; assume this is RLE if either we saw some // digits, or the pattern ends with a '!', both of which are unlikely to // occur in plain text patterns: return have_digit || *end == '!'; } const char *loadpattern(lifealgo &imp) { char line[LINESIZE + 1] ; const char *errmsg = 0; // set rule to Conway's Life (default if explicit rule isn't supplied, // such as a text pattern like "...ooo$$$ooo") const char *err = imp.setrule("B3/S23") ; if (err) { // try "Life" in case given algo is RuleLoader and a // Life.rule file exists (nicer for loading lexicon patterns) err = imp.setrule("Life"); if (err) { // if given algo doesn't support B3/S23 or Life then the only sensible // choice left is to use the algo's default rule imp.setrule( imp.DefaultRule() ) ; } } if (getedges) lifebeginprogress("Reading from clipboard"); else lifebeginprogress("Reading pattern file"); // skip any blank lines at start to avoid problem when copying pattern // from Internet Explorer while (getline(line, LINESIZE) && line[0] == 0) ; // test for 'i' to cater for #LLAB comment in LifeLab file if (line[0] == '#' && line[1] == 'L' && line[2] == 'i') { errmsg = readpclife(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else if (line[0] == '#' && line[1] == 'P' && line[2] == ' ') { // WinLifeSearch creates clipboard patterns similar to // Life 1.05 format but without the header line errmsg = readpclife(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else if (line[0] == '#' && line[1] == 'M' && line[2] == 'C' && line[3] == 'e' && line[4] == 'l' && line[5] == 'l' ) { errmsg = readmcell(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else if (line[0] == '#' || line[0] == 'x') { errmsg = readrle(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { // readrle has set top,left,bottom,right based on the info given in // the header line and possibly a "#CXRLE Pos=..." line, but in case // that info is incorrect we find the true pattern edges and expand // top/left/bottom/right if necessary to avoid truncating the pattern bigint t, l, b, r ; imp.findedges(&t, &l, &b, &r) ; if (t < top) top = t ; if (l < left) left = l ; if (b > bottom) bottom = b ; if (r > right) right = r ; } } } else if (line[0] == '!') { errmsg = readdblife(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else if (line[0] == '[') { errmsg = imp.readmacrocell(line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else if (isplainrle(line)) { errmsg = readrle(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } } else { // read a text pattern like "...ooo$$$ooo" errmsg = readtextpattern(imp, line) ; if (errmsg == 0) { imp.endofpattern() ; // if getedges is true then readtextpattern has set top,left,bottom,right } } lifeendprogress(); return errmsg ; } const char *build_err_str(const char *filename) { static char file_err_str[2048]; sprintf(file_err_str, "Can't open pattern file:\n%s", filename); return file_err_str; } const char *readpattern(const char *filename, lifealgo &imp) { filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return build_err_str(filename) ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return build_err_str(filename) ; #endif buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call const char *errmsg = loadpattern(imp) ; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return errmsg ; } const char *readclipboard(const char *filename, lifealgo &imp, bigint *t, bigint *l, bigint *b, bigint *r) { filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return "Can't open clipboard file!" ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return "Can't open clipboard file!" ; #endif buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call top = 0; left = 0; bottom = 0; right = 0; getedges = true; const char *errmsg = loadpattern(imp); getedges = false; *t = top; *l = left; *b = bottom; *r = right; // make sure we return a valid rect if (bottom < top) *b = top; if (right < left) *r = left; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return errmsg ; } const char *readcomments(const char *filename, char **commptr) { // allocate a 128K buffer for storing comment data (big enough // for the comments in Dean Hickerson's stamp collection) const int maxcommlen = 128 * 1024; *commptr = (char *)malloc(maxcommlen); if (*commptr == NULL) { return "Not enough memory for comments!"; } char *cptr = *commptr; cptr[0] = 0; // safer to init to empty string filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return build_err_str(filename) ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return build_err_str(filename) ; #endif char line[LINESIZE + 1] ; buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call int commlen = 0; // loading comments is likely to be quite fast so no real need to // display the progress dialog, but getchar calls lifeabortprogress // so safer just to assume the progress dialog might appear lifebeginprogress("Loading comments"); // skip any blank lines at start to avoid problem when copying pattern // from Internet Explorer while (getline(line, LINESIZE) && line[0] == 0) ; // test for 'i' to cater for #LLAB comment in LifeLab file if (line[0] == '#' && line[1] == 'L' && line[2] == 'i') { // extract comment lines from Life 1.05/1.06 file int linecount = 0; while (linecount < 10000) { linecount++; if (line[0] == '#' && !(line[1] == 'P' && line[2] == ' ') && !(line[1] == 'N' && line[2] == 0)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } if (getline(line, LINESIZE) == NULL) break; } } else if (line[0] == '#' && line[1] == 'M' && line[2] == 'C' && line[3] == 'e' && line[4] == 'l' && line[5] == 'l' ) { // extract "#D ..." lines from MCell file while (getline(line, LINESIZE)) { if (line[0] != '#') break; if (line[1] == 'L' && line[2] == ' ') break; if (line[1] == 'D' && (line[2] == ' ' || line[2] == 0)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } else if (line[0] == '#' || line[0] == 'x') { // extract comment lines from RLE file while (line[0] == '#') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; if (getline(line, LINESIZE) == NULL) break; } // also look for any lines after "!" but only if file is < 1MB // (ZLIB doesn't seem to provide a fast way to go to eof) if (filesize < 1024*1024) { bool foundexcl = false; while (getline(line, LINESIZE)) { if (strrchr(line, '!')) { foundexcl = true; break; } } if (foundexcl) { while (getline(line, LINESIZE)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } } else if (line[0] == '!') { // extract "!..." lines from dblife file while (line[0] == '!') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; if (getline(line, LINESIZE) == NULL) break; } } else if (line[0] == '[') { // extract "#C..." lines from macrocell file while (getline(line, LINESIZE)) { if (line[0] != '#') break; if (line[1] == 'C') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } else { // no comments in text pattern file } lifeendprogress(); if (commlen == maxcommlen) commlen--; cptr[commlen] = 0; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return 0 ; } golly-3.3-src/gollybase/readpattern.h0000644000175000017500000000163513145740437014673 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef READPATTERN_H #define READPATTERN_H #include "bigint.h" class lifealgo ; /* * Read pattern file into given life algorithm implementation. */ const char *readpattern(const char *filename, lifealgo &imp) ; /* * Get next line from current pattern file. */ char *getline(char *line, int maxlinelen) ; /* * Similar to readpattern but we return the pattern edges * (not necessarily the minimal bounding box; eg. if an * RLE pattern is empty or has empty borders). */ const char *readclipboard(const char *filename, lifealgo &imp, bigint *t, bigint *l, bigint *b, bigint *r) ; /* * Extract comments from pattern file and store in given buffer. * It is the caller's job to free commptr when done (if not NULL). */ const char *readcomments(const char *filename, char **commptr) ; #endif golly-3.3-src/gollybase/ruleloaderalgo.cpp0000644000175000017500000001663113145740437015720 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "ruleloaderalgo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifefatal #include // for strcmp, strchr #include // for std::string const char* noTABLEorTREE = "No @TABLE or @TREE section found in .rule file."; int ruleloaderalgo::NumCellStates() { if (rule_type == TABLE) return LocalRuleTable->NumCellStates(); else // rule_type == TREE return LocalRuleTree->NumCellStates(); } static FILE* OpenRuleFile(std::string& rulename, const char* dir) { // try to open rulename.rule in given dir std::string path = dir; int istart = (int)path.size(); path += rulename + ".rule"; // change "dangerous" characters to underscores for (unsigned int i=istart; iNumCellStates(); grid_type = LocalRuleTable->getgridtype(); gridwd = LocalRuleTable->gridwd; gridht = LocalRuleTable->gridht; gridleft = LocalRuleTable->gridleft; gridright = LocalRuleTable->gridright; gridtop = LocalRuleTable->gridtop; gridbottom = LocalRuleTable->gridbottom; boundedplane = LocalRuleTable->boundedplane; sphere = LocalRuleTable->sphere; htwist = LocalRuleTable->htwist; vtwist = LocalRuleTable->vtwist; hshift = LocalRuleTable->hshift; vshift = LocalRuleTable->vshift; } else { // rule_type == TREE maxCellStates = LocalRuleTree->NumCellStates(); grid_type = LocalRuleTree->getgridtype(); gridwd = LocalRuleTree->gridwd; gridht = LocalRuleTree->gridht; gridleft = LocalRuleTree->gridleft; gridright = LocalRuleTree->gridright; gridtop = LocalRuleTree->gridtop; gridbottom = LocalRuleTree->gridbottom; boundedplane = LocalRuleTree->boundedplane; sphere = LocalRuleTree->sphere; htwist = LocalRuleTree->htwist; vtwist = LocalRuleTree->vtwist; hshift = LocalRuleTree->hshift; vshift = LocalRuleTree->vshift; } // need to clear cache ghashbase::setrule("not used"); } const char* ruleloaderalgo::LoadTableOrTree(FILE* rulefile, const char* rule) { const char *err; const int MAX_LINE_LEN = 4096; char line_buffer[MAX_LINE_LEN+1]; int lineno = 0; linereader lr(rulefile); // find line starting with @TABLE or @TREE while (lr.fgets(line_buffer,MAX_LINE_LEN) != 0) { lineno++; if (strcmp(line_buffer, "@TABLE") == 0) { err = LocalRuleTable->LoadTable(rulefile, lineno, '@', rule); // err is the result of setrule(rule) if (err == NULL) { SetAlgoVariables(TABLE); } // LoadTable has closed rulefile so don't do lr.close() return err; } if (strcmp(line_buffer, "@TREE") == 0) { err = LocalRuleTree->LoadTree(rulefile, lineno, '@', rule); // err is the result of setrule(rule) if (err == NULL) { SetAlgoVariables(TREE); } // LoadTree has closed rulefile so don't do lr.close() return err; } } lr.close(); return noTABLEorTREE; } const char* ruleloaderalgo::setrule(const char* s) { const char *err; const char *colonptr = strchr(s,':'); std::string rulename(s); if (colonptr) rulename.assign(s,colonptr); // first check if rulename is the default rule for RuleTable or RuleTree // in which case there is no need to look for a .rule/table/tree file if (LocalRuleTable->IsDefaultRule(rulename.c_str())) { err = LocalRuleTable->setrule(s); if (err) return err; SetAlgoVariables(TABLE); return NULL; } if (LocalRuleTree->IsDefaultRule(rulename.c_str())) { err = LocalRuleTree->setrule(s); if (err) return err; SetAlgoVariables(TREE); return NULL; } // look for .rule file in user's rules dir then in Golly's rules dir bool inuser = true; FILE* rulefile = OpenRuleFile(rulename, lifegetuserrules()); if (!rulefile) { inuser = false; rulefile = OpenRuleFile(rulename, lifegetrulesdir()); } if (rulefile) { err = LoadTableOrTree(rulefile, s); if (inuser && err && (strcmp(err, noTABLEorTREE) == 0)) { // if .rule file was found in user's rules dir but had no // @TABLE or @TREE section then we look in Golly's rules dir // (this lets user override the colors/icons in a supplied .rule // file without having to copy the entire file) rulefile = OpenRuleFile(rulename, lifegetrulesdir()); if (rulefile) err = LoadTableOrTree(rulefile, s); } return err; } // no .rule file so try to load .table file err = LocalRuleTable->setrule(s); if (err == NULL) { SetAlgoVariables(TABLE); return NULL; } // no .table file so try to load .tree file err = LocalRuleTree->setrule(s); if (err == NULL) { SetAlgoVariables(TREE); return NULL; } // make sure we show given rule string in final error msg (probably "File not found") static std::string badrule; badrule = err; badrule += "\nGiven rule: "; badrule += s; return badrule.c_str(); } const char* ruleloaderalgo::getrule() { if (rule_type == TABLE) return LocalRuleTable->getrule(); else // rule_type == TREE return LocalRuleTree->getrule(); } const char* ruleloaderalgo::DefaultRule() { // use RuleTree's default rule (B3/S23) return LocalRuleTree->DefaultRule(); } ruleloaderalgo::ruleloaderalgo() { LocalRuleTable = new ruletable_algo(); LocalRuleTree = new ruletreealgo(); // initialize rule_type LocalRuleTree->setrule( LocalRuleTree->DefaultRule() ); SetAlgoVariables(TREE); } ruleloaderalgo::~ruleloaderalgo() { delete LocalRuleTable; delete LocalRuleTree; } state ruleloaderalgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { if (rule_type == TABLE) return LocalRuleTable->slowcalc(nw, n, ne, w, c, e, sw, s, se); else // rule_type == TREE return LocalRuleTree->slowcalc(nw, n, ne, w, c, e, sw, s, se); } static lifealgo* creator() { return new ruleloaderalgo(); } void ruleloaderalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai); ai.setAlgorithmName("RuleLoader"); ai.setAlgorithmCreator(&creator); ai.minstates = 2; ai.maxstates = 256; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-3.3-src/gollybase/jvnalgo.cpp0000644000175000017500000021014513145740437014353 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "jvnalgo.h" // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #endif #include using namespace std ; // this algorithm supports three rules: const char* RULE_STRINGS[] = { "JvN29", "Nobili32", "Hutton32" }; const int N_STATES[] = { 29, 32, 32 }; int jvnalgo::NumCellStates() { return N_STATES[current_rule]; } const char* jvnalgo::setrule(const char *s) { const char* colonptr = strchr(s,':'); string rule_name(s); if(colonptr) rule_name.assign(s,colonptr); // check the requested string against the named rules, and deprecated versions if (stricmp(rule_name.c_str(), RULE_STRINGS[JvN29]) == 0 || stricmp(rule_name.c_str(), "JvN-29") == 0) current_rule = JvN29; else if (stricmp(rule_name.c_str(), RULE_STRINGS[Nobili32]) == 0 || stricmp(rule_name.c_str(), "JvN-32") == 0) current_rule = Nobili32; else if (stricmp(rule_name.c_str(), RULE_STRINGS[Hutton32]) == 0 || stricmp(rule_name.c_str(), "modJvN-32") == 0) current_rule = Hutton32; else { return "This algorithm only supports these rules:\nJvN29, Nobili32, Hutton32."; } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } maxCellStates = N_STATES[current_rule]; ghashbase::setrule(RULE_STRINGS[current_rule]); return NULL; } const char* jvnalgo::getrule() { // return canonical rule string static char canonrule[MAXRULESIZE]; sprintf(canonrule, "%s", RULE_STRINGS[current_rule]); if (gridwd > 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix int len = (int)strlen(canonrule); const char* bounds = canonicalsuffix(); int i = 0; while (bounds[i]) canonrule[len++] = bounds[i++]; canonrule[len] = 0; } return canonrule; } const char* jvnalgo::DefaultRule() { return RULE_STRINGS[JvN29]; } const int NORTH = 1 ; const int SOUTH = 3 ; const int EAST = 0 ; const int WEST = 2 ; const int FLIPDIR = 2 ; const int DIRMASK = 3 ; const int CONF = 0x10 ; const int OTRANS = 0x20 ; const int STRANS = 0x40 ; const int TEXC = 0x80 ; const int CDEXC = 0x80 ; const int CROSSEXC = 6 ; const int CEXC = 1 ; const int BIT_ONEXC = 1 ; const int BIT_OEXC_EW = 2 ; const int BIT_OEXC_NS = 4 ; const int BIT_OEXC = BIT_OEXC_NS | BIT_OEXC_EW ; const int BIT_SEXC = 8 ; const int BIT_CEXC = 16 ; const int BIT_NS_IN = 32 ; const int BIT_EW_IN = 64 ; const int BIT_NS_OUT = 128 ; const int BIT_EW_OUT = 256 ; const int BIT_CROSS = (BIT_NS_IN | BIT_EW_IN | BIT_NS_OUT | BIT_EW_OUT) ; const int BIT_ANY_OUT = (BIT_NS_OUT | BIT_EW_OUT) ; const int BIT_OEXC_OTHER = 512 ; const int BIT_SEXC_OTHER = 1024 ; static state compress[256] ; /** * These are the legal *internal* states. */ static state uncompress[] = { 0, /* dead */ 1, 2, 3, 4, 5, 6, 7, 8, /* construction states */ 32, 33, 34, 35, /* ordinary */ 160, 161, 162, 163, /* ordinary active */ 64, 65, 66, 67, /* special */ 192, 193, 194, 195, /* special active */ 16, 144, /* confluent states */ 17, 145, /* more confluent states */ 146, 148, 150 /* crossing confluent states */ } ; /** * The behavior of the confluent states under the extended * rules was verified empirically by the wjvn executable, * because I could not interpret the paper sufficiently to * cover some cases I thought were ambiguous, or where the * simulator seemed to contradict the transition rules in the * paper. -tgr */ static int bits(state mcode, state code, state dir) { if ((code & (TEXC | OTRANS | STRANS | CONF | CEXC)) == 0) return 0 ; if (code & CONF) { if ((mcode & (OTRANS | STRANS)) && ((mcode & DIRMASK) ^ FLIPDIR) == dir) return 0 ; if ((code & 2) && !(dir & 1)) return BIT_CEXC ; if ((code & 4) && (dir & 1)) return BIT_CEXC ; if (code & 1) return BIT_CEXC ; return 0 ; } if ((code & (OTRANS | STRANS)) == 0) return 0 ; int r = 0 ; if ((code & DIRMASK) == dir) { if (code & OTRANS) { if (dir & 1) { r |= BIT_NS_IN ; if (code & TEXC) r |= BIT_OEXC_NS ; else r |= BIT_ONEXC ; } else { r |= BIT_EW_IN ; if (code & TEXC) r |= BIT_OEXC_EW ; else r |= BIT_ONEXC ; } } else if ((code & (STRANS | TEXC)) == (STRANS | TEXC)) r |= BIT_SEXC ; if ((mcode & (OTRANS | STRANS)) && (dir ^ (mcode & DIRMASK)) == 2) { // don't permit these bits to propogate; head to head } else { if (r & BIT_OEXC) r |= BIT_OEXC_OTHER ; if (r & BIT_SEXC) r |= BIT_SEXC_OTHER ; } } else { if (dir & 1) r |= BIT_NS_OUT ; else r |= BIT_EW_OUT ; } return r ; } static state cres[] = {0x22, 0x23, 0x40, 0x41, 0x42, 0x43, 0x10, 0x20, 0x21} ; jvnalgo::jvnalgo() { for (int i=0; i<256; i++) compress[i] = 255 ; for (unsigned int i=0; i 8) c = cres[c-9] ; } else if (c & CONF) { if (mbits & BIT_SEXC) c = 0 ; else if (current_rule == Nobili32 && (mbits & BIT_CROSS) == BIT_CROSS) { if (mbits & BIT_OEXC) c = (state)((mbits & BIT_OEXC) + CONF + 0x80) ; else c = CONF ; } else { if (c & CROSSEXC) {// was a cross, is no more c = (c & ~(CROSSEXC | CDEXC)) ; } if ((mbits & BIT_OEXC) && !(mbits & BIT_ONEXC)) c = ((c & CDEXC) >> 7) + (CDEXC | CONF) ; else if ((mbits & BIT_ANY_OUT) || current_rule == JvN29) c = ((c & CDEXC) >> 7) + CONF ; else /* no change */ ; } } else { if (((c & OTRANS) && (mbits & BIT_SEXC)) || ((c & STRANS) && (mbits & BIT_OEXC))) c = 0 ; else if (mbits & (BIT_SEXC_OTHER | BIT_OEXC_OTHER | BIT_CEXC)) c |= 128 ; else c &= 127 ; } return compress[c] ; } else // Hutton32 return slowcalc_Hutton32(c,n,s,e,w); } // XPM data for the 31 7x7 icons used in JvN algo static const char* jvn7x7[] = { // width height ncolors chars_per_pixel "7 217 4 1", // colors ". c #000000", // black will be transparent "D c #404040", "E c #E0E0E0", "W c #FFFFFF", // white // pixels ".DEWED.", "DWWWWWD", "EWWWWWE", "WWWWWWW", "EWWWWWE", "DWWWWWD", ".DEWED.", "..WWW..", ".WWWWW.", "WWWWWWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWWWWWW", ".WWWWW.", "..WWW..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWW.WWW", "WWW.WWW", "WWW.WWW", "..W.WWW", ".WW.WWW", "WWW.WWW", ".......", "WWW.WWW", "WWW.WW.", "WWW.W..", "WWW.W..", "WWW.WW.", "WWW.WWW", ".......", "WWW.WWW", ".WW.WWW", "..W.WWW", "WWW.WWW", "WWW.WWW", "WWW.WWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WW.WW.", "WW...WW", ".WW.WW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WW.WW.", "WW...WW", ".WW.WW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WWWWW.", "WWW.WWW", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WWWWW.", "WWWWWWW", ".WWWWW.", "..WWW..", "...W...", "...W...", "..W.W..", ".WW.WW.", "WWW.WWW", ".WW.WW.", "..W.W..", "...W...", "...W...", "..WWW..", ".WWWWW.", "W.....W", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".W.W.W.", "WWW.WWW", ".W.W.W.", "..WWW..", "...W..."}; // XPM data for the 31 15x15 icons used in JvN algo static const char* jvn15x15[] = { // width height ncolors chars_per_pixel "15 465 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............", "....DBWWWBD....", "...BWWWWWWWB...", "..BWWWWWWWWWB..", ".DWWWWWWWWWWWD.", ".BWWWWWWWWWWWB.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".BWWWWWWWWWWWB.", ".DWWWWWWWWWWWD.", "..BWWWWWWWWWB..", "...BWWWWWWWB...", "....DBWWWBD....", "...............", "...............", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", "...............", "......W.WWWWWW.", ".....WW.WWWWWW.", "....WWW.WWWWWW.", "...WWWW.WWWWWW.", "..WWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWW..", ".WWWWWW.WWWW...", ".WWWWWW.WWW....", ".WWWWWW.WW.....", ".WWWWWW.W......", "...............", "...............", ".WWWWWW.W......", ".WWWWWW.WW.....", ".WWWWWW.WWW....", ".WWWWWW.WWWW...", ".WWWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWWW.", "...WWWW.WWWWWW.", "....WWW.WWWWWW.", ".....WW.WWWWWW.", "......W.WWWWWW.", "...............", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWW.WWWW...", "..WWWW...WWWW..", ".WWWW.....WWWW.", "..WWWW...WWWW..", "...WWWW.WWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWW.WWWW...", "..WWWW...WWWW..", ".WWWW.....WWWW.", "..WWWW...WWWW..", "...WWWW.WWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWW...WWWW..", ".WWWWW...WWWWW.", "..WWWW...WWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....W...W.....", "....WW...WW....", "...WWW...WWW...", "..WWWW...WWWW..", ".WWWWW...WWWWW.", "..WWWW...WWWW..", "...WWW...WWW...", "....WW...WW....", ".....W...W.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..W.........W..", ".WW.........WW.", "..W.........W..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....W.WWW.W....", "...W...W...W...", "..WWW.....WWW..", ".WWWWW...WWWWW.", "..WWW.....WWW..", "...W...W...W...", "....W.WWW.W....", ".....WWWWW.....", "......WWW......", ".......W.......", "..............."}; // XPM data for the 31 31x31 icons used in JvN algo static const char* jvn31x31[] = { // width height ncolors chars_per_pixel "31 961 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............................", "...............................", "..........DCBWWWWWBCD..........", ".........CWWWWWWWWWWWC.........", ".......DWWWWWWWWWWWWWWWD.......", "......BWWWWWWWWWWWWWWWWWB......", ".....BWWWWWWWWWWWWWWWWWWWB.....", "....DWWWWWWWWWWWWWWWWWWWWWD....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "....WWWWWWWWWWWWWWWWWWWWWWW....", "....DWWWWWWWWWWWWWWWWWWWWWD....", ".....BWWWWWWWWWWWWWWWWWWWB.....", "......BWWWWWWWWWWWWWWWWWB......", ".......DWWWWWWWWWWWWWWWD.......", ".........CWWWWWWWWWWWC.........", "..........DCBWWWWWBCD..........", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "...............................", "...............................", "...............................", "..............W.WWWWWWWWWWWWW..", ".............WW.WWWWWWWWWWWWW..", "............WWW.WWWWWWWWWWWWW..", "...........WWWW.WWWWWWWWWWWWW..", "..........WWWWW.WWWWWWWWWWWWW..", ".........WWWWWW.WWWWWWWWWWWWW..", "........WWWWWWW.WWWWWWWWWWWWW..", ".......WWWWWWWW.WWWWWWWWWWWWW..", "......WWWWWWWWW.WWWWWWWWWWWWW..", ".....WWWWWWWWWW.WWWWWWWWWWWWW..", "....WWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWW....", "..WWWWWWWWWWWWW.WWWWWWWWWW.....", "..WWWWWWWWWWWWW.WWWWWWWWW......", "..WWWWWWWWWWWWW.WWWWWWWW.......", "..WWWWWWWWWWWWW.WWWWWWW........", "..WWWWWWWWWWWWW.WWWWWW.........", "..WWWWWWWWWWWWW.WWWWW..........", "..WWWWWWWWWWWWW.WWWW...........", "..WWWWWWWWWWWWW.WWW............", "..WWWWWWWWWWWWW.WW.............", "..WWWWWWWWWWWWW.W..............", "...............................", "...............................", "...............................", "...............................", "..WWWWWWWWWWWWW.W..............", "..WWWWWWWWWWWWW.WW.............", "..WWWWWWWWWWWWW.WWW............", "..WWWWWWWWWWWWW.WWWW...........", "..WWWWWWWWWWWWW.WWWWW..........", "..WWWWWWWWWWWWW.WWWWWW.........", "..WWWWWWWWWWWWW.WWWWWWW........", "..WWWWWWWWWWWWW.WWWWWWWW.......", "..WWWWWWWWWWWWW.WWWWWWWWW......", "..WWWWWWWWWWWWW.WWWWWWWWWW.....", "..WWWWWWWWWWWWW.WWWWWWWWWWW....", "..WWWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWWW..", "....WWWWWWWWWWW.WWWWWWWWWWWWW..", ".....WWWWWWWWWW.WWWWWWWWWWWWW..", "......WWWWWWWWW.WWWWWWWWWWWWW..", ".......WWWWWWWW.WWWWWWWWWWWWW..", "........WWWWWWW.WWWWWWWWWWWWW..", ".........WWWWWW.WWWWWWWWWWWWW..", "..........WWWWW.WWWWWWWWWWWWW..", "...........WWWW.WWWWWWWWWWWWW..", "............WWW.WWWWWWWWWWWWW..", ".............WW.WWWWWWWWWWWWW..", "..............W.WWWWWWWWWWWWW..", "...............................", "...............................", "...............................", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWW...WWWWWWWW......", ".....WWWWWWWW.....WWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWW.........WWWWWWWW...", "..WWWWWWWW...........WWWWWWWW..", ".WWWWWWWW.............WWWWWWWW.", "..WWWWWWWW...........WWWWWWWW..", "...WWWWWWWW.........WWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWW.....WWWWWWWW.....", "......WWWWWWWW...WWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWW...WWWWWWWW......", ".....WWWWWWWW.....WWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWW.........WWWWWWWW...", "..WWWWWWWW...........WWWWWWWW..", ".WWWWWWWW.............WWWWWWWW.", "..WWWWWWWW...........WWWWWWWW..", "...WWWWWWWW.........WWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWW.....WWWWWWWW.....", "......WWWWWWWW...WWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWWW.......WWWWWWWWW...", "..WWWWWWWWWW.......WWWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWWW.......WWWWWWWWWW..", "...WWWWWWWWW.......WWWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWW.", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWW.......WWWW........", ".......WWWWW.......WWWWW.......", "......WWWWWW.......WWWWWW......", ".....WWWWWWW.......WWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWWW.......WWWWWWWWW...", "..WWWWWWWWWW.......WWWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWWW.......WWWWWWWWWW..", "...WWWWWWWWW.......WWWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWW.......WWWWWWW.....", "......WWWWWW.......WWWWWW......", ".......WWWWW.......WWWWW.......", "........WWWW.......WWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWW...............WWWW....", "...WWWWW...............WWWWW...", "..WWWWWW...............WWWWWW..", ".WWWWWWW...............WWWWWWW.", "..WWWWWW...............WWWWWW..", "...WWWWW...............WWWWW...", "....WWWW...............WWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWW.WWWWWWW.WWW........", ".......WWW...WWWWW...WWW.......", "......WWW.....WWW.....WWW......", ".....WWW.......W.......WWW.....", "....WWWWW.............WWWWW....", "...WWWWWWW...........WWWWWWW...", "..WWWWWWWWW.........WWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWW.........WWWWWWWWW..", "...WWWWWWW...........WWWWWWW...", "....WWWWW.............WWWWW....", ".....WWW.......W.......WWW.....", "......WWW.....WWW.....WWW......", ".......WWW...WWWWW...WWW.......", "........WWW.WWWWWWW.WWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "..............................."}; // colors for each cell state (we try to match colors used in icons) static unsigned char jvncolors[] = { 48, 48, 48, // 0 dark gray 255, 0, 0, // 1 red 255, 125, 0, // 2 orange (to match red and yellow) 255, 150, 25, // 3 lighter 255, 175, 50, // 4 lighter 255, 200, 75, // 5 lighter 255, 225, 100, // 6 lighter 255, 250, 125, // 7 lighter 251, 255, 0, // 8 yellow 89, 89, 255, // 9 blue 106, 106, 255, // 10 lighter 122, 122, 255, // 11 lighter 139, 139, 255, // 12 lighter 27, 176, 27, // 13 green 36, 200, 36, // 14 lighter 73, 255, 73, // 15 lighter 106, 255, 106, // 16 lighter 235, 36, 36, // 17 red 255, 56, 56, // 18 lighter 255, 73, 73, // 19 lighter 255, 89, 89, // 20 lighter 185, 56, 255, // 21 purple 191, 73, 255, // 22 lighter 197, 89, 255, // 23 lighter 203, 106, 255, // 24 lighter 0, 255, 128, // 25 light green 255, 128, 64, // 26 light orange 255, 255, 128, // 27 light yellow 33, 215, 215, // 28 cyan 27, 176, 176, // 29 darker 24, 156, 156, // 30 darker 21, 137, 137 // 31 darker }; static lifealgo *creator() { return new jvnalgo() ; } void jvnalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("JvN") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 29 ; ai.maxstates = 32 ; // init default color scheme ai.defgradient = false; ai.defr1 = ai.defg1 = ai.defb1 = 255; // start color = white ai.defr2 = ai.defg2 = ai.defb2 = 128; // end color = gray int numcolors = sizeof(jvncolors) / (sizeof(jvncolors[0])*3); unsigned char* rgbptr = jvncolors; for (int i = 0; i < numcolors; i++) { ai.defr[i] = *rgbptr++; ai.defg[i] = *rgbptr++; ai.defb[i] = *rgbptr++; } // init default icon data ai.defxpm7x7 = jvn7x7; ai.defxpm15x15 = jvn15x15; ai.defxpm31x31 = jvn31x31; } // ------------------- beginning of Hutton32 section ----------------------- /*** Motivation: In the original von Neumann transition rules, lines of transmission states can extend themselves by writing out binary signal trains, e.g. 10000 for extend with a right-directed ordinary transmission state (OTS). But for construction, a dual-stranded construction arm (c-arm) is needed, simply because the arm must be retracted after each write. I noticed that there was room to add the needed write-and-retract operation by modifying the transition rules slightly. This allows the machine to be greatly reduced in size and speed of replication. Another modification was made when it was noticed that the construction could be made rotationally invariant simply by basing the orientation of the written cell on the orientation of the one writing it. Instead of "write an up arrow" we have "turn left". This allows us to spawn offspring in different directions and to fill up the space with more and more copies in a manner inspired by Langton's Loops. A single OTS line can now act as a c-arm in any direction. Below are the signal trains: 100000 : move forward (write an OTS arrow in the same direction) 100010 : turn left 10100 : turn right 100001 : write a forward-directed OTS and retract 100011 : write a left-directed OTS and retract 10011 : write a reverse-directed OTS and retract 10101 : write a right-directed OTS and retract 101101 : write a forward-directed special transmission state (STS) and retract 110001 : write a left-directed STS and retract 110101 : write a reverse-directed STS and retract 111001 : write a right-directed STS and retract 1111 : write a confluent state and retract 101111 : retract Achieving these features without adding new states required making some slight changes elsewhere, though hopefully these don't affect the computation- or construction-universality of the CA. The most important effects are listed here: 1) OTS's cannot destroy STS's. This functionality was used in von Neumann's construction and read-write arms but isn't needed for the logic organs, as far as I know. The opposite operation is still enabled. 2) STS lines can only construct one cell type: an OTS in the forward direction. Some logic organs will need to be redesigned. Under this modified JvN rule, a self-replicator can be much smaller, consisting only of a tape contained within a repeater-emitter loop. One early example consisted of 5521 cells in total, and replicates in 44,201 timesteps, compared with 8 billion timesteps for the smallest known JvN-32 replicator. This became possible because the construction process runs at the same speed as a moving signal, allowing the tape to be simply stored in a repeater-emitter loop. The machine simply creates a loop of the right size (by counting tape circuits) before allowing the tape contents to fill up their new home. The rotational invariance allows the machine to make multiple copies oriented in different directions. The population growth starts off as exponential but soons slows down as the long tapes obstruct the new copies. Some context for these modifications to von Neumann's rule table: Codd simplified vN's CA to a rotationally-invariant 8 states. Langton modified this to make a self-replicating repeater-emitter, his 'loops'. Other loops were made by Sayama, Perrier, Tempesti, Byl, Chou-Reggia, and others. So there are other CA derived from vN's that support faster replication than that achieveable here, and some of them retain the computation- and construction-universality that von Neumann was considering. Our modifications are mostly a historical exploration of the possibility space around vN's CA, to explore the questions of why he made the design decisions he did. In particular, why didn't von Neumann design for a tape loop stored within a repeater-emitter? It would have made his machine much simpler from the beginning. Why didn't he consider write-and-retraction instead of designing a complicated c-arm procedure? Of course this is far from criticism of vN - his untimely death interrupted his work in this area. Some explanation of the details of the modifications is given below: The transition rules are as in Nobili32 (or JvN29), except the following: 1) The end of an OTS wire, when writing a new cell, adopts one of two states: excited OTS and excited STS, standing for bits 1 and 0 respectively. After writing the cell reverts to being an OTS. 2) A sensitized cell that is about to revert to an arrow bases its direction upon that of the excited arrow that is pointing to it. 3) A TS 'c', with a sensitized state 's' on its output that will become an OTS next (based on the state of 'c'), reverts to the ground state if any of 'c's input is 1, else it quiesces. 4) A TS 'c', with a sensitized state 's' on its output that will become a confluent state next (based on the state of 'c'), reverts to the first sensitized state S is any of 'c's input is one, else it reverts to the ground state. 5) A TS 'c', with an STS on its output, reverts to the ground state if any of 'c's input is 1. Tim Hutton , 2008 ***/ bool is_OTS(state c) { return c>=9 && c<=16; } bool is_STS(state c) { return c>=17 && c<=24; } bool is_TS(state c) { return is_OTS(c) || is_STS(c); } bool is_sensitized(state c) { return c>=1 && c<=8; } bool is_east(state c) { return c==9 || c==13 || c==17 || c==21; } bool is_north(state c) { return c==10 || c==14 || c==18 || c==22; } bool is_west(state c) { return c==11 || c==15 || c==19 || c==23; } bool is_south(state c) { return c==12 || c==16 || c==20 || c==24; } bool is_excited(state c) { return (c>=13 && c<=16) || (c>=21 && c<=24); } state dir(state c) { // return 0,1,2,3 encoding the direction of 'c': right,up,left,down return (c-9)%4; } state output(state c,state n,state s,state e,state w) // what is the state of the cell we are pointing to? { if(is_east(c)) return e; else if(is_north(c)) return n; else if(is_west(c)) return w; else if(is_south(c)) return s; else return 0; // error } state input(state n,state s,state e,state w) // what is the state of the excited cell pointing at us? { if(is_east(w) && is_excited(w)) return w; else if(is_north(s) && is_excited(s)) return s; else if(is_west(e) && is_excited(e)) return e; else if(is_south(n) && is_excited(n)) return n; else return 0; // error } bool output_will_become_OTS(state c,state n,state s,state e,state w) { return output(c,n,s,e,w)==8 || (output(c,n,s,e,w)==4 && is_excited(c)) || (output(c,n,s,e,w)==5 && !is_excited(c)); } bool output_will_become_confluent(state c,state n,state s,state e,state w) { return output(c,n,s,e,w)==7 && is_excited(c); } bool output_will_become_sensitized(state c,state n,state s,state e,state w) { int out=output(c,n,s,e,w); return ((out==0 && is_excited(c)) || out==1 || out==2 || out==3 || (out==4 && !is_OTS(c))); } bool excited_arrow_to_us(state n,state s,state e,state w) { return n==16 || n==24 || s==14 || s==22 || e==15 || e==23 || w==13 || w==21; } bool excited_OTS_to_us(state c,state n,state s,state e,state w) { // is there an excited OTS state that will hit us next? return ((n==16 || n==27 || n==28 || n==30 || n==31) && !(c==14 || c==10)) || ((s==14 || s==27 || s==28 || s==30 || s==31) && !(c==16 || c==12)) || ((e==15 || e==27 || e==28 || e==29 || e==31) && !(c==13 || c==9)) || ((w==13 || w==27 || w==28 || w==29 || w==31) && !(c==15 || c==11)); } bool excited_OTS_arrow_to_us(state c,state n,state s,state e,state w) { // is there an excited OTS arrow pointing at us? return (n==16 && !(c==14 || c==10)) || (s==14 && !(c==16 || c==12)) || (e==15 && !(c==13 || c==9)) || (w==13 && !(c==15 || c==11)); } bool OTS_arrow_to_us(state n,state s,state e,state w) { // is there an OTS arrow pointing at us? return (is_OTS(n) && is_south(n)) || (is_OTS(s) && is_north(s)) || (is_OTS(e) && is_west(e)) || (is_OTS(w) && is_east(w)); } bool excited_STS_to_us(state c,state n,state s,state e,state w) { // is there an excited STS state that will hit us next? return ((n==24 || n==27 || n==28 || n==30 || n==31) && !(c==22 || c==18)) || ((s==22 || s==27 || s==28 || s==30 || s==31) && !(c==24 || c==20)) || ((e==23 || e==27 || e==28 || e==29 || e==31) && !(c==21 || c==17)) || ((w==21 || w==27 || w==28 || w==29 || w==31) && !(c==23 || c==19)); } bool excited_STS_arrow_to_us(state c,state n,state s,state e,state w) { // is there an excited STS arrow pointing at us? return (n==24 && !(c==22 || c==18)) || (s==22 && !(c==24 || c==20)) || (e==23 && !(c==21 || c==17)) || (w==21 && !(c==23 || c==19)); } bool all_inputs_on(state n,state s,state e,state w) { return (!(n==12 || s==10 || e==11 || w==9)) && (n==16 || s==14 || e==15 || w==13); } bool is_crossing(state n,state s,state e,state w) { int n_inputs=0; if(is_south(n)) n_inputs++; if(is_east(w)) n_inputs++; if(is_west(e)) n_inputs++; if(is_north(s)) n_inputs++; int n_outputs=0; if(is_TS(n) && !is_south(n)) n_outputs++; if(is_TS(w) && !is_east(w)) n_outputs++; if(is_TS(e) && !is_west(e)) n_outputs++; if(is_TS(s) && !is_north(s)) n_outputs++; return n_inputs==2 && n_outputs==2; } state quiesce(state c) { if(((c>=13 && c<=16) || (c>=21 && c<=24))) return c-4; else if(c>=26 && c<=31) return 25; else return c; } // the update function itself state slowcalc_Hutton32(state c,state n,state s,state e,state w) { if(is_OTS(c)) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(excited_OTS_to_us(c,n,s,e,w)) { if(output_will_become_OTS(c,n,s,e,w) || (is_STS(output(c,n,s,e,w)) && !is_excited(output(c,n,s,e,w)))) return 0; // we become the ground state (retraction) else if(output_will_become_confluent(c,n,s,e,w)) return 1; // we become sensitized by the next input (after retraction) else return quiesce(c)+4; // we become excited (usual OTS transmission) } else if(output_will_become_confluent(c,n,s,e,w)) return 0; // we become the ground state (retraction) else if(is_excited(c) && output_will_become_sensitized(c,n,s,e,w)) return quiesce(c)+12; // we become excited STS (special for end-of-wire: // means quiescent OTS, used to mark which cell is the sensitized cell's input) else return quiesce(c); } else if(is_STS(c)) { if(is_excited(c) && is_sensitized(output(c,n,s,e,w)) && OTS_arrow_to_us(n,s,e,w)) { // this cell is the special mark at the end of an OTS wire, so it behaves differently // if output is about to finalize, we revert to ground or quiescent OTS, depending on next signal // if output will remain sensitized, we change to excited OTS if next signal is 1 if(output_will_become_sensitized(c,n,s,e,w)) { if(excited_OTS_arrow_to_us(c,n,s,e,w)) return c-8; else return c; } else { if(excited_OTS_arrow_to_us(c,n,s,e,w)) return 0; // write-and-retract else return quiesce(c)-8; // revert to quiescent OTS } } else if(is_excited(c) && output(c,n,s,e,w)==0) if(excited_STS_arrow_to_us(c,n,s,e,w)) return c; // we remain excited else return quiesce(c); // we quiesce else if(excited_OTS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited OTS else if(excited_STS_to_us(c,n,s,e,w)) return quiesce(c)+4; // we become excited (usual STS transmission) else return quiesce(c); // we quiesce (usual STS transmission) } else if(c==0) { if(excited_OTS_arrow_to_us(c,n,s,e,w)) // (excludes e.g. excited confluent states) return 1; // we become sensitized else if(excited_STS_arrow_to_us(c,n,s,e,w)) return quiesce(input(n,s,e,w))-8; // directly become 'forward' OTS else return c; } else if(c==1) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 2; // 10 else return 3; // 11 } else if(c==2) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 4; // 100 else return 5; // 101 } else if(c==3) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 6; // 110 else return 7; // 111 } else if(c==4) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 8; // 1000 else return ( (quiesce(input(n,s,e,w))-9+2) % 4 )+9; // 1001: reverse } else if(c==5) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+3) % 4 )+9; // 1010: turn right else return quiesce(input(n,s,e,w))+8; // 1011: STS forward } else if(c==6) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+1) % 4 )+17; // 1100: STS turn left else return ( (quiesce(input(n,s,e,w))-9+2) % 4 )+17; // 1101: STS reverse } else if(c==7) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+3) % 4 )+17; // 1110: STS turn left else return 25; // 1111 } else if(c==8) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 9+dir(input(n,s,e,w)); // 10000: move forward else return 9+dir(input(n,s,e,w)+1); // 10001: turn left } else if(c==25) // quiescent confluent state { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(is_crossing(n,s,e,w)) // for JvN-32 crossings { if((n==16||s==14)&&(e==15||w==13)) return 31; // double crossing else if(n==16||s==14) return 30; // vertical crossing else if(e==15||w==13) return 29; // horizontal crossing else return 25; // nothing happening } else if(all_inputs_on(n,s,e,w)) return 26; else return 25; } else if(c==26) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 28; else return 27; } else if(c==27) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 26; else return 25; } else if(c==28) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 28; else return 27; } else if(c==29 || c==30 || c==31) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if((n==16||s==14)&&(e==15||w==13)) return 31; // double crossing else if(n==16||s==14) return 30; // vertical crossing else if(e==15||w==13) return 29; // horizontal crossing else return 25; // revert to quiescent confluent state } else return c; // error - should be no more states } // ------------------ end of Hutton32 section ------------------------- golly-3.3-src/gollybase/ruletable_algo.cpp0000644000175000017500000007734713145740437015713 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "ruletable_algo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifewarning // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include #include #include using namespace std; const string ruletable_algo::neighborhood_value_keywords[N_SUPPORTED_NEIGHBORHOODS] = {"vonNeumann","Moore","hexagonal","oneDimensional"}; // (keep in sync with TNeighborhood) bool ruletable_algo::IsDefaultRule(const char* rulename) { return (strcmp(rulename, DefaultRule()) == 0); } static FILE* static_rulefile = NULL; static int static_lineno = 0; static char static_endchar = 0; const char* ruletable_algo::LoadTable(FILE* rulefile, int lineno, char endchar, const char* s) { // set static vars so LoadRuleTable() will load table data from .rule file static_rulefile = rulefile; static_lineno = lineno; static_endchar = endchar; const char* err = setrule(s); // calls LoadRuleTable // reset static vars static_rulefile = NULL; static_lineno = 0; static_endchar = 0; return err; } int ruletable_algo::NumCellStates() { return this->n_states; } bool starts_with(const string& line,const string& keyword) { return strnicmp(line.c_str(),keyword.c_str(),keyword.length())==0; } const char* ruletable_algo::setrule(const char* s) { const char *colonptr = strchr(s, ':'); string rule_name(s); if (colonptr) rule_name.assign(s,colonptr); static string ret; // NOTE: don't initialize this statically! ret = LoadRuleTable(rule_name.c_str()); if(!ret.empty()) { // if the file exists and we've got an error then it must be a file format issue if(!starts_with(ret,"Failed to open file: ")) lifewarning(ret.c_str()); return ret.c_str(); } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } // set canonical rule string returned by getrule() this->current_rule = rule_name.c_str(); if (gridwd > 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix string bounds = canonicalsuffix(); this->current_rule += bounds; } maxCellStates = this->n_states; ghashbase::setrule(rule_name.c_str()); return NULL; } vector tokenize(const string& str,const string& delimiters) { vector tokens; // skip delimiters at beginning. string::size_type lastPos = str.find_first_not_of(delimiters, 0); // find first "non-delimiter". string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { // found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } return tokens; } string trim_right(const string & s, const string & t = " \t\r\n") { string d (s); string::size_type i (d.find_last_not_of (t)); if (i == string::npos) return ""; else return d.erase (d.find_last_not_of (t) + 1); } string trim_left(const string & s, const string & t = " \t\r\n") { string d (s); return d.erase (0, s.find_first_not_of (t)); } string trim(const string & s, const string & t = " \t\r\n") { string d (s); return trim_left (trim_right (d, t), t); } const char *defaultRuleData[] = { "n_states:8", "neighborhood:vonNeumann", "symmetries:rotate4", "000000", "000012", "000020", "000030", "000050", "000063", "000071", "000112", "000122", "000132", "000212", "000220", "000230", "000262", "000272", "000320", "000525", "000622", "000722", "001022", "001120", "002020", "002030", "002050", "002125", "002220", "002322", "005222", "012321", "012421", "012525", "012621", "012721", "012751", "014221", "014321", "014421", "014721", "016251", "017221", "017255", "017521", "017621", "017721", "025271", "100011", "100061", "100077", "100111", "100121", "100211", "100244", "100277", "100511", "101011", "101111", "101244", "101277", "102026", "102121", "102211", "102244", "102263", "102277", "102327", "102424", "102626", "102644", "102677", "102710", "102727", "105427", "111121", "111221", "111244", "111251", "111261", "111277", "111522", "112121", "112221", "112244", "112251", "112277", "112321", "112424", "112621", "112727", "113221", "122244", "122277", "122434", "122547", "123244", "123277", "124255", "124267", "125275", "200012", "200022", "200042", "200071", "200122", "200152", "200212", "200222", "200232", "200242", "200250", "200262", "200272", "200326", "200423", "200517", "200522", "200575", "200722", "201022", "201122", "201222", "201422", "201722", "202022", "202032", "202052", "202073", "202122", "202152", "202212", "202222", "202272", "202321", "202422", "202452", "202520", "202552", "202622", "202722", "203122", "203216", "203226", "203422", "204222", "205122", "205212", "205222", "205521", "205725", "206222", "206722", "207122", "207222", "207422", "207722", "211222", "211261", "212222", "212242", "212262", "212272", "214222", "215222", "216222", "217222", "222272", "222442", "222462", "222762", "222772", "300013", "300022", "300041", "300076", "300123", "300421", "300622", "301021", "301220", "302511", "401120", "401220", "401250", "402120", "402221", "402326", "402520", "403221", "500022", "500215", "500225", "500232", "500272", "500520", "502022", "502122", "502152", "502220", "502244", "502722", "512122", "512220", "512422", "512722", "600011", "600021", "602120", "612125", "612131", "612225", "700077", "701120", "701220", "701250", "702120", "702221", "702251", "702321", "702525", "702720", 0 }; static FILE *OpenTableFile(string &rule, const char *dir, string &path) { // look for rule.table in given dir and set path path = dir; int istart = (int)path.size(); path += rule + ".table"; // change "dangerous" characters to underscores for (unsigned int i=istart; i > available_symmetries; { const string vonNeumann_available_symmetries[5] = {"none","rotate4","rotate4reflect","reflect_horizontal","permute"}; available_symmetries["vonNeumann"].assign(vonNeumann_available_symmetries,vonNeumann_available_symmetries+5); const string Moore_available_symmetries[7] = {"none","rotate4","rotate8","rotate4reflect","rotate8reflect","reflect_horizontal","permute"}; available_symmetries["Moore"].assign(Moore_available_symmetries,Moore_available_symmetries+7); const string hexagonal_available_symmetries[6] = {"none","rotate2","rotate3","rotate6","rotate6reflect","permute"}; available_symmetries["hexagonal"].assign(hexagonal_available_symmetries,hexagonal_available_symmetries+6); const string oneDimensional_available_symmetries[3] = {"none","reflect","permute"}; available_symmetries["oneDimensional"].assign(oneDimensional_available_symmetries,oneDimensional_available_symmetries+3); } string line; const int MAX_LINE_LEN=1000; char line_buffer[MAX_LINE_LEN]; FILE *in = 0; linereader line_reader(0); int lineno = 0; string full_filename; bool isDefaultRule = IsDefaultRule(rule.c_str()); if (isDefaultRule) { // no need to read table data from a file } else if (static_rulefile) { // read table data from currently open .rule file line_reader.setfile(static_rulefile); line_reader.setcloseonfree(); lineno = static_lineno; full_filename = rule + ".rule"; } else { // look for rule.table in user's rules dir then in Golly's rules dir in = OpenTableFile(rule, lifegetuserrules(), full_filename); if (!in) in = OpenTableFile(rule, lifegetrulesdir(), full_filename); if (!in) return "Failed to open file: "+full_filename; line_reader.setfile(in); line_reader.setcloseonfree(); // make sure it goes away if we return with an error } string symmetries = "rotate4"; // default TNeighborhood neighborhood = vonNeumann; // default unsigned int n_states = 8; // default map< string, vector > variables; vector< pair< vector< vector >, state > > transition_table; unsigned int n_inputs=0; // these line must have been read before the rest of the file bool n_states_parsed=false,neighborhood_parsed=false,symmetries_parsed=false; for (;;) { if (isDefaultRule) { if (defaultRuleData[lineno] == 0) break; line = defaultRuleData[lineno]; } else { if (!line_reader.fgets(line_buffer,MAX_LINE_LEN)) break; if (static_rulefile && line_buffer[0] == static_endchar) break; line = line_buffer; } lineno++; // snip off any trailing comment if(line.find('#')!=string::npos) line.assign(line.begin(),line.begin()+line.find('#')); // trim any leading/trailing whitespace line = trim(line); // try each of the allowed forms for this line: if(line.empty()) continue; // line was blank or just had a comment else if(starts_with(line,n_states_keyword)) { // parse the rest of the line if(sscanf(line.c_str()+n_states_keyword.length(),"%d",&n_states)!=1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } if(n_states<2 || n_states>256) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": n_states out of range (min 2, max 256)"; return oss.str(); } n_states_parsed = true; } else if(starts_with(line,neighborhood_keyword)) { // parse the rest of the line string remaining(line.begin()+neighborhood_keyword.length(),line.end()); remaining = trim(remaining); // (allow for space between : and value) const string* found = find(this->neighborhood_value_keywords, this->neighborhood_value_keywords+N_SUPPORTED_NEIGHBORHOODS,remaining); if(found == this->neighborhood_value_keywords+N_SUPPORTED_NEIGHBORHOODS) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": unsupported neighborhood"; return oss.str(); } neighborhood = (TNeighborhood)(found - this->neighborhood_value_keywords); switch(neighborhood) { default: case vonNeumann: n_inputs=5; grid_type=VN_GRID; break; case Moore: n_inputs=9; grid_type=SQUARE_GRID; break; case hexagonal: n_inputs=7; grid_type=HEX_GRID; break; case oneDimensional: n_inputs=3; grid_type=SQUARE_GRID; break; } neighborhood_parsed = true; } else if(starts_with(line,symmetries_keyword)) { if(!neighborhood_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": neighborhood must be declared before symmetries"; return oss.str(); } string remaining(line.begin()+symmetries_keyword.length(),line.end()); remaining = trim(remaining); // (allow for space between : and value) string neighborhood_as_string = this->neighborhood_value_keywords[neighborhood]; vector::const_iterator found = find( available_symmetries[neighborhood_as_string].begin(), available_symmetries[neighborhood_as_string].end(), remaining ); if(found == available_symmetries[neighborhood_as_string].end()) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": unsupported symmetries"; return oss.str(); } symmetries = remaining; symmetries_parsed = true; } else if(starts_with(line,variable_keyword)) { if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing\nbefore first variable"; return oss.str(); } // parse the rest of the line for the variable vector tokens = tokenize(line,"= {,}"); string variable_name = tokens[1]; vector states; if(tokens.size()<3) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } for(unsigned int i=2;i=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state value out of range"; return oss.str(); } states.push_back((state)s); } } variables[variable_name] = states; } else { // must be a transitions line if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing\nbefore first transition"; return oss.str(); } if(n_states<=10 && variables.empty() && line.find(',')==string::npos) { // if there are only single-digit states and no variables then can use comma-free form: // e.g. 012345 for 0,1,2,3,4 -> 5 vector< vector > inputs; state output; if(line.length() < n_inputs+1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - too few entries"; return oss.str(); } for(unsigned int i=0;i'9') { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } inputs.push_back(vector(1,c-'0')); } unsigned char c = line[n_inputs]; if(c<'0' || c>'9') { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } output = c-'0'; if (output >= n_states) // AKT: avoid later crash in PackTransition { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state out of range"; return oss.str(); } transition_table.push_back(make_pair(inputs,output)); } else // transition line with commas { vector tokens = tokenize(line,", #\t"); if(tokens.size() < n_inputs+1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - too few entries"; return oss.str(); } // first pass: which variables appear more than once? these are "bound" (must take the same value each time they appear in this transition) vector bound_variables; for(map< string, vector >::const_iterator var_it=variables.begin();var_it!=variables.end();var_it++) if(count(tokens.begin(),tokens.begin()+n_inputs+1,var_it->first)>1) bound_variables.push_back(var_it->first); unsigned int n_bound_variables = (unsigned int)bound_variables.size(); // second pass: iterate through the possible states for the bound variables, adding a transition for each combination vector< vector > inputs(n_inputs); state output; map bound_variable_indices; // each is an index into vector of 'variables' map for(unsigned int i=0;i(1,variables[tokens[i]][bound_variable_indices[tokens[i]]]); // this input is a bound variable else if(variables.find(tokens[i])!=variables.end()) inputs[i] = variables[tokens[i]]; // this input is an unbound variable else { unsigned int s=0; if(sscanf(tokens[i].c_str(),"%u",&s)!=1) // this input is a state { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } if(s>=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state out of range"; return oss.str(); } inputs[i] = vector(1,(state)s); } } // collect the output if(!bound_variables.empty() && find(bound_variables.begin(),bound_variables.end(),tokens[n_inputs])!=bound_variables.end()) output = variables[tokens[n_inputs]][bound_variable_indices[tokens[n_inputs]]]; else { unsigned int s; if(variables.find(tokens[n_inputs])!=variables.end() && variables[tokens[n_inputs]].size()==1) { // single-state variables are permitted as the output s = variables[tokens[n_inputs]][0]; } else if(sscanf(tokens[n_inputs].c_str(),"%u",&s)!=1) // if not a bound variable, output must be a state { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - output must be state, single-state variable or bound variable"; return oss.str(); } if(s>=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state out of range"; return oss.str(); } output = (state)s; } transition_table.push_back(make_pair(inputs,output)); // move on to the next value of bound variables { unsigned int iChanging=0; for(;iChanging=n_bound_variables) break; } } } } } // (finished reading lines from the file) if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing"; return oss.str(); } this->neighborhood = neighborhood; this->n_states = n_states; PackTransitions(symmetries,n_inputs,transition_table); return string(""); // success } // convert transition table to bitmask lookup void ruletable_algo::PackTransitions(const string& symmetries, int n_inputs, const vector< pair< vector< vector >, state > >& transition_table) { // cumbersome initialization of a remap array for the different symmetries map< string, vector< vector > > symmetry_remap[N_SUPPORTED_NEIGHBORHOODS]; { int vn_rotate4[4][6] = {{0,1,2,3,4,5},{0,2,3,4,1,5},{0,3,4,1,2,5},{0,4,1,2,3,5}}; for(int i=0;i<4;i++) symmetry_remap[vonNeumann]["rotate4"].push_back(vector(vn_rotate4[i],vn_rotate4[i]+6)); int vn_rotate4reflect[8][6] = {{0,1,2,3,4,5},{0,2,3,4,1,5},{0,3,4,1,2,5},{0,4,1,2,3,5}, {0,4,3,2,1,5},{0,3,2,1,4,5},{0,2,1,4,3,5},{0,1,4,3,2,5}}; for(int i=0;i<8;i++) symmetry_remap[vonNeumann]["rotate4reflect"].push_back(vector(vn_rotate4reflect[i],vn_rotate4reflect[i]+6)); int vn_reflect_horizontal[2][6] = {{0,1,2,3,4,5},{0,1,4,3,2,5}}; for(int i=0;i<2;i++) symmetry_remap[vonNeumann]["reflect_horizontal"].push_back(vector(vn_reflect_horizontal[i],vn_reflect_horizontal[i]+6)); int moore_rotate4[4][10] = {{0,1,2,3,4,5,6,7,8,9},{0,3,4,5,6,7,8,1,2,9},{0,5,6,7,8,1,2,3,4,9},{0,7,8,1,2,3,4,5,6,9}}; for(int i=0;i<4;i++) symmetry_remap[Moore]["rotate4"].push_back(vector(moore_rotate4[i],moore_rotate4[i]+10)); int moore_rotate8[8][10] = {{0,1,2,3,4,5,6,7,8,9},{0,2,3,4,5,6,7,8,1,9},{0,3,4,5,6,7,8,1,2,9},{0,4,5,6,7,8,1,2,3,9}, {0,5,6,7,8,1,2,3,4,9},{0,6,7,8,1,2,3,4,5,9},{0,7,8,1,2,3,4,5,6,9},{0,8,1,2,3,4,5,6,7,9}}; for(int i=0;i<8;i++) symmetry_remap[Moore]["rotate8"].push_back(vector(moore_rotate8[i],moore_rotate8[i]+10)); int moore_rotate4reflect[8][10] = {{0,1,2,3,4,5,6,7,8,9},{0,3,4,5,6,7,8,1,2,9},{0,5,6,7,8,1,2,3,4,9},{0,7,8,1,2,3,4,5,6,9}, {0,1,8,7,6,5,4,3,2,9},{0,7,6,5,4,3,2,1,8,9},{0,5,4,3,2,1,8,7,6,9},{0,3,2,1,8,7,6,5,4,9}}; for(int i=0;i<8;i++) symmetry_remap[Moore]["rotate4reflect"].push_back(vector(moore_rotate4reflect[i],moore_rotate4reflect[i]+10)); int moore_rotate8reflect[16][10] = {{0,1,2,3,4,5,6,7,8,9},{0,2,3,4,5,6,7,8,1,9},{0,3,4,5,6,7,8,1,2,9},{0,4,5,6,7,8,1,2,3,9}, {0,5,6,7,8,1,2,3,4,9},{0,6,7,8,1,2,3,4,5,9},{0,7,8,1,2,3,4,5,6,9},{0,8,1,2,3,4,5,6,7,9}, {0,8,7,6,5,4,3,2,1,9},{0,7,6,5,4,3,2,1,8,9},{0,6,5,4,3,2,1,8,7,9},{0,5,4,3,2,1,8,7,6,9}, {0,4,3,2,1,8,7,6,5,9},{0,3,2,1,8,7,6,5,4,9},{0,2,1,8,7,6,5,4,3,9},{0,1,8,7,6,5,4,3,2,9}}; for(int i=0;i<16;i++) symmetry_remap[Moore]["rotate8reflect"].push_back(vector(moore_rotate8reflect[i],moore_rotate8reflect[i]+10)); int moore_reflect_horizontal[2][10] = {{0,1,2,3,4,5,6,7,8,9},{0,1,8,7,6,5,4,3,2,9}}; for(int i=0;i<2;i++) symmetry_remap[Moore]["reflect_horizontal"].push_back(vector(moore_reflect_horizontal[i],moore_reflect_horizontal[i]+10)); int oneDimensional_reflect[2][4] = {{0,1,2,3},{0,2,1,3}}; for(int i=0;i<2;i++) symmetry_remap[oneDimensional]["reflect"].push_back(vector(oneDimensional_reflect[i],oneDimensional_reflect[i]+4)); int hex_rotate2[2][8] = {{0,1,2,3,4,5,6,7},{0,4,5,6,1,2,3,7}}; for(int i=0;i<2;i++) symmetry_remap[hexagonal]["rotate2"].push_back(vector(hex_rotate2[i],hex_rotate2[i]+8)); int hex_rotate3[3][8] = {{0,1,2,3,4,5,6,7},{0,3,4,5,6,1,2,7},{0,5,6,1,2,3,4,7}}; for(int i=0;i<3;i++) symmetry_remap[hexagonal]["rotate3"].push_back(vector(hex_rotate3[i],hex_rotate3[i]+8)); int hex_rotate6[6][8] = {{0,1,2,3,4,5,6,7},{0,2,3,4,5,6,1,7},{0,3,4,5,6,1,2,7}, {0,4,5,6,1,2,3,7},{0,5,6,1,2,3,4,7},{0,6,1,2,3,4,5,7}}; for(int i=0;i<6;i++) symmetry_remap[hexagonal]["rotate6"].push_back(vector(hex_rotate6[i],hex_rotate6[i]+8)); int hex_rotate6reflect[12][8] = {{0,1,2,3,4,5,6,7},{0,2,3,4,5,6,1,7},{0,3,4,5,6,1,2,7}, {0,4,5,6,1,2,3,7},{0,5,6,1,2,3,4,7},{0,6,1,2,3,4,5,7}, {0,6,5,4,3,2,1,7},{0,5,4,3,2,1,6,7},{0,4,3,2,1,6,5,7}, {0,3,2,1,6,5,4,7},{0,2,1,6,5,4,3,7},{0,1,6,5,4,3,2,7}}; for(int i=0;i<12;i++) symmetry_remap[hexagonal]["rotate6reflect"].push_back(vector(hex_rotate6reflect[i],hex_rotate6reflect[i]+8)); } // initialize the packed transition table this->lut.assign(n_inputs,vector< vector >(this->n_states)); this->output.clear(); this->n_compressed_rules = 0; // each transition rule looks like: e.g. 1,[2,3,5],4,[0,1],3 -> 0 vector< vector > permuted_inputs(n_inputs); for(vector< pair< vector< vector >, state> >::const_iterator rule_it = transition_table.begin(); rule_it!=transition_table.end(); rule_it++) { const vector< vector > & inputs = rule_it->first; state output = rule_it->second; if(symmetries=="none") { PackTransition(inputs,output); } else if(symmetries=="permute") { // work through the permutations of all but the centre cell permuted_inputs = inputs; sort(permuted_inputs.begin()+1,permuted_inputs.end()); // (must sort before permuting) do { PackTransition(permuted_inputs,output); } while(next_permutation(permuted_inputs.begin()+1,permuted_inputs.end())); // (skips duplicates) } else { const vector< vector > & remap = symmetry_remap[this->neighborhood][symmetries]; for(int iSymm=0;iSymm<(int)remap.size();iSymm++) { for(int i=0;i > & inputs, state output) { int n_inputs = (int)inputs.size(); const unsigned int n_bits = (unsigned int)(sizeof(TBits)*8); this->output.push_back(output); int iRule = (int)(this->output.size()-1); int iBit = iRule % n_bits; unsigned int iRuleC = (iRule-iBit)/n_bits; // the compressed index of the rule // add a new compressed rule if required if(iRuleC >= this->n_compressed_rules) { for(int iInput=0;iInputlut[iInput][iState].push_back(0); this->n_compressed_rules++; } TBits mask = (TBits)1 << iBit; // (cast needed to ensure this is a 64-bit shift, not a 32-bit shift) for(int iNbor=0;iNbor & possibles = inputs[iNbor]; for(vector::const_iterator poss_it=possibles.begin();poss_it!=possibles.end();poss_it++) { // add the bits this->lut[iNbor][*poss_it][iRuleC] |= mask; } } } const char* ruletable_algo::getrule() { return this->current_rule.c_str(); } const char* ruletable_algo::DefaultRule() { return "Langtons-Loops"; } ruletable_algo::ruletable_algo() : n_states(8), neighborhood(vonNeumann), n_compressed_rules(0) { maxCellStates = n_states; } ruletable_algo::~ruletable_algo() { } // --- the update function --- state ruletable_algo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { TBits is_match = 0; // AKT: explicitly initialized to avoid gcc warning for(unsigned int iRuleC=0;iRuleCn_compressed_rules;iRuleC++) { // is there a match for any of the (e.g.) 64 rules within iRuleC? // (we don't have to worry about symmetries here since they were expanded out in PackTransitions) switch(this->neighborhood) { case vonNeumann: // c,n,e,s,w is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][e][iRuleC] & this->lut[3][s][iRuleC] & this->lut[4][w][iRuleC]; break; case Moore: // c,n,ne,e,se,s,sw,w,nw is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][ne][iRuleC] & this->lut[3][e][iRuleC] & this->lut[4][se][iRuleC] & this->lut[5][s][iRuleC] & this->lut[6][sw][iRuleC] & this->lut[7][w][iRuleC] & this->lut[8][nw][iRuleC]; break; case hexagonal: // c,n,e,se,s,w,nw is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][e][iRuleC] & this->lut[3][se][iRuleC] & this->lut[4][s][iRuleC] & this->lut[5][w][iRuleC] & this->lut[6][nw][iRuleC]; break; case oneDimensional: // c,w,e is_match = this->lut[0][c][iRuleC] & this->lut[1][w][iRuleC] & this->lut[2][e][iRuleC]; break; } // if any of them matched, return the output of the first if(is_match) { // find the least significant bit of is_match unsigned int iBit=0; TBits mask=1; while(!(is_match&mask)) { ++iBit; mask <<= 1; } return this->output[ iRuleC*sizeof(TBits)*8 + iBit ]; // find the uncompressed rule index } } return c; // default: no change } static lifealgo *creator() { return new ruletable_algo(); } void ruletable_algo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai); ai.setAlgorithmName("RuleTable"); ai.setAlgorithmCreator(&creator); ai.minstates = 2; ai.maxstates = 256; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-3.3-src/gollybase/writepattern.h0000644000175000017500000000141713145740437015110 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef WRITEPATTERN_H #define WRITEPATTERN_H class lifealgo; typedef enum { RLE_format, // run length encoded XRLE_format, // extended RLE MC_format // macrocell (native hashlife format) } pattern_format; typedef enum { no_compression, // write uncompressed data gzip_compression // write gzip compressed data } output_compression; /* * Save current pattern to a file. */ const char *writepattern(const char *filename, lifealgo &imp, pattern_format format, output_compression compression, int top, int left, int bottom, int right); #endif golly-3.3-src/gollybase/hlifedraw.cpp0000644000175000017500000005742313247734027014671 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This file is where we figure out how to draw hlife structures, * no matter what the magnification or renderer. */ #include "hlifealgo.h" #include #include #include #include using namespace std ; const int logbmsize = 8 ; // 8=256x256 const int bmsize = (1<> 3)] |= (128 >> (x & 7)) ; } /* * Draw a 4x4 area yielding 1x1, 2x2, or 4x4 pixels. */ void draw4x4_1(unsigned short sw, unsigned short se, unsigned short nw, unsigned short ne, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int bit = 128 >> ((-llx) & 0x7) ; if (sw) *p |= bit ; if (se) *p |= (bit >> 1) ; p -= byteoff ; if (nw) *p |= bit ; if (ne) *p |= (bit >> 1) ; } void draw4x4_1(node *n, node *z, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int bit = 128 >> ((-llx) & 0x7) ; if (n->sw != z) *p |= bit ; if (n->se != z) *p |= (bit >> 1) ; p -= byteoff ; if (n->nw != z) *p |= bit ; if (n->ne != z) *p |= (bit >> 1) ; } static unsigned char compress4x4[256] ; static bool inited = false; void draw4x4_2(unsigned short bits1, unsigned short bits2, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int mask = (((-llx) & 0x4) ? 0x0f : 0xf0) ; int db = ((bits1 | (bits1 << 4)) & 0xf0f0) + ((bits2 | (bits2 >> 4)) & 0x0f0f) ; p[0] |= mask & compress4x4[db & 255] ; p[-byteoff] |= mask & compress4x4[db >> 8] ; } void draw4x4_4(unsigned short bits1, unsigned short bits2, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; p[0] = (unsigned char)(((bits1 << 4) & 0xf0) + (bits2 & 0xf)) ; p[-byteoff] = (unsigned char)((bits1 & 0xf0) + ((bits2 >> 4) & 0xf)) ; p[-2*byteoff] = (unsigned char)(((bits1 >> 4) & 0xf0) + ((bits2 >> 8) & 0xf)) ; p[-3*byteoff] = (unsigned char)(((bits1 >> 8) & 0xf0) + ((bits2 >> 12) & 0xf)) ; } void hlifealgo::renderbm(int x, int y) { // x,y is lower left corner int rx = x ; int ry = y ; int rw = bmsize ; int rh = bmsize ; if (pmag > 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; unsigned char *bigptr = bigbuf; if (renderer->justState() || pmag > 1) { // convert each bigbuf byte into 8 bytes of state data unsigned char *pixptr = pixbuf; for (int i = 0; i < ibufsize * 4; i++) { unsigned char byte = *bigptr++; *pixptr++ = (byte & 128) ? 1 : 0; *pixptr++ = (byte & 64) ? 1 : 0; *pixptr++ = (byte & 32) ? 1 : 0; *pixptr++ = (byte & 16) ? 1 : 0; *pixptr++ = (byte & 8) ? 1 : 0; *pixptr++ = (byte & 4) ? 1 : 0; *pixptr++ = (byte & 2) ? 1 : 0; *pixptr++ = (byte & 1); // no condition needed } } else { // convert each bigbuf byte into 32 bytes of pixel data (8 * RGBA) // get RGBA view of pixel buffer unsigned int *pixptr = (unsigned int *)pixbuf; for (int i = 0; i < ibufsize * 4; i++) { unsigned char byte = *bigptr++; *pixptr++ = (byte & 128) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 64) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 32) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 16) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 8) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 4) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 2) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 1) ? liveRGBA : deadRGBA; } } if (renderer->justState()) renderer->stateblit(rx, ry, rw, rh, pixbuf) ; else renderer->pixblit(rx, ry, rw, rh, pixbuf, pmag); memset(bigbuf, 0, sizeof(ibigbuf)) ; } /* * Here, llx and lly are coordinates in screen pixels describing * where the lower left pixel of the screen is. Draw one node. * This is our main recursive routine. */ void hlifealgo::drawnode(node *n, int llx, int lly, int depth, node *z) { int sw = 1 << (depth - mag + 1) ; if (sw >= bmsize && (llx + vieww <= 0 || lly + viewh <= 0 || llx >= sw || lly >= sw)) return ; if (n == z) { // don't do anything } else if (depth > 2 && sw > 2) { z = z->nw ; sw >>= 1 ; depth-- ; if (sw == (bmsize >> 1)) { drawnode(n->sw, 0, 0, depth, z) ; drawnode(n->se, -(bmsize/2), 0, depth, z) ; drawnode(n->nw, 0, -(bmsize/2), depth, z) ; drawnode(n->ne, -(bmsize/2), -(bmsize/2), depth, z) ; renderbm(-llx, -lly) ; } else { drawnode(n->sw, llx, lly, depth, z) ; drawnode(n->se, llx-sw, lly, depth, z) ; drawnode(n->nw, llx, lly-sw, depth, z) ; drawnode(n->ne, llx-sw, lly-sw, depth, z) ; } } else if (depth > 2 && sw == 2) { draw4x4_1(n, z->nw, llx, lly) ; } else if (sw == 1) { drawpixel(-llx, -lly) ; } else { struct leaf *l = (struct leaf *)n ; sw >>= 1 ; if (sw == 1) { draw4x4_1(l->sw, l->se, l->nw, l->ne, llx, lly) ; } else if (sw == 2) { draw4x4_2(l->sw, l->se, llx, lly) ; draw4x4_2(l->nw, l->ne, llx, lly-sw) ; } else { draw4x4_4(l->sw, l->se, llx, lly) ; draw4x4_4(l->nw, l->ne, llx, lly-sw) ; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void hlifealgo::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; bigint s = 1 ; s <<= d ; coor.first += s ; coor.second += s ; int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } static void init_compress4x4() { int i; for (i=0; i<8; i++) compress4x4[((size_t)1)<> 1)) ; for (i=0; i<256; i++) if (i & (i-1)) compress4x4[i] = compress4x4[i & (i-1)] | compress4x4[i & -i] ; } /* * This is the top-level draw routine that takes the root node. * It maintains four nodes onto which the screen fits and uses the * high bits of llx/lly to project those four nodes as far down * the tree as possible, so we know we can get away with just * 32-bit arithmetic in the above recursive routine. This way * we don't need any high-precision addition or subtraction to * display an image. */ void hlifealgo::draw(viewport &viewarg, liferender &rendererarg) { if (!inited) { init_compress4x4() ; inited = true; } memset(bigbuf, 0, sizeof(ibigbuf)) ; ensure_hashed() ; renderer = &rendererarg ; if (!renderer->justState()) { // AKT: get cell colors and alpha values for dead and live pixels unsigned char *r, *g, *b; renderer->getcolors(&r, &g, &b, &deada, &livea); deadr = r[0]; deadg = g[0]; deadb = b[0]; liver = r[1]; liveg = g[1]; liveb = b[1]; // create RGBA live color unsigned char *colptr = (unsigned char *)&liveRGBA; *colptr++ = liver; *colptr++ = liveg; *colptr++ = liveb; *colptr++ = livea; // create RGBA dead color colptr = (unsigned char *)&deadRGBA; *colptr++ = deadr; *colptr++ = deadg; *colptr++ = deadb; *colptr++ = deada; } view = &viewarg ; if (renderer->justState()) { if (view->getmag() != 0) lifefatal("Can only call getstate renderer with mag of 0") ; } uvieww = view->getwidth() ; uviewh = view->getheight() ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag - 1) ; } else { mag = (-view->getmag()) ; pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } int d = depth ; fill_ll(d) ; int maxd = vieww ; int i ; node *z = zeronode(d) ; node *sw = root, *nw = z, *ne = z, *se = z ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ for (i=llbits-1; i>d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { goto bail ; } } /* Find the lowest four we need to examine */ while (d > 2 && d - mag >= 0 && (d - mag > 28 || (1 << (d - mag)) > 2 * maxd)) { llx = (llx << 1) + llxb[d] ; lly = (lly << 1) + llyb[d] ; if (llx >= 1) { if (lly >= 1) { ne = ne->sw ; nw = nw->se ; se = se->nw ; sw = sw->ne ; lly-- ; } else { ne = se->nw ; nw = sw->ne ; se = se->sw ; sw = sw->se ; } llx-- ; } else { if (lly >= 1) { ne = nw->se ; nw = nw->sw ; se = sw->ne ; sw = sw->nw ; lly-- ; } else { ne = sw->ne ; nw = sw->nw ; se = sw->se ; sw = sw->sw ; } } if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { goto bail ; } d-- ; } /* At this point we know we can use 32-bit arithmetic. */ for (i=d; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* clear the border *around* the universe if necessary */ if (d + 1 <= mag) { node *z = zeronode(d) ; if (llx > 0 || lly > 0 || llx + vieww <= 0 || lly + viewh <= 0 || (sw == z && se == z && nw == z && ne == z)) { // no live cells } else { drawpixel(0, 0) ; renderbm(-llx, -lly) ; } } else { z = zeronode(d) ; maxd = 1 << (d - mag + 2) ; if (maxd <= bmsize) { maxd >>= 1 ; drawnode(sw, 0, 0, d, z) ; drawnode(se, -maxd, 0, d, z) ; drawnode(nw, 0, -maxd, d, z) ; drawnode(ne, -maxd, -maxd, d, z) ; renderbm(-llx, -lly) ; } else { maxd >>= 1 ; drawnode(sw, llx, lly, d, z) ; drawnode(se, llx-maxd, lly, d, z) ; drawnode(nw, llx, lly-maxd, d, z) ; drawnode(ne, llx-maxd, lly-maxd, d, z) ; } } bail: renderer = 0 ; view = 0 ; } int getbitsfromleaves(const vector &v) { unsigned short nw=0, ne=0, sw=0, se=0 ; int i; for (i=0; i<(int)v.size(); i++) { leaf *p = (leaf *)v[i] ; nw |= p->nw ; ne |= p->ne ; sw |= p->sw ; se |= p->se ; } int r = 0 ; // horizontal bits are least significant ones unsigned short w = nw | sw ; unsigned short e = ne | se ; // vertical bits are next 8 unsigned short n = nw | ne ; unsigned short s = sw | se ; for (i=0; i<4; i++) { if (w & (0x1111 << i)) r |= 0x1000 << i ; if (e & (0x1111 << i)) r |= 0x100 << i ; if (n & (0xf << (4 * i))) r |= 0x10 << i ; if (s & (0xf << (4 * i))) r |= 0x1 << i ; } return r ; } /** * Copy the vector, but sort it and uniquify it so we don't have a ton * of duplicate nodes. */ void sortunique(vector &dest, vector &src) { swap(src, dest) ; // note: this is superfast sort(dest.begin(), dest.end()) ; vector::iterator new_end = unique(dest.begin(), dest.end()) ; dest.erase(new_end, dest.end()) ; src.clear() ; } void hlifealgo::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // AKT: following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int currdepth = depth ; int i; if (root == zeronode(currdepth)) { // AKT: return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == 1) { // we have leaf nodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth <= 1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; } else { leftbm >>= (sz >> 1) ; } } else { node *z = 0 ; if (hashed) z = zeronode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { node *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(top, newv) ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { node *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } sortunique(bottom, newv) ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; } outer = 0 ; for (i=0; i<(int)right.size(); i++) { node *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } sortunique(right, newv) ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { node *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(left, newv) ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; } } } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 1) ; ymin <<= (currdepth + 1) ; xmax <<= (currdepth + 1) ; ymax <<= (currdepth + 1) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void hlifealgo::fit(viewport &view, int force) { ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int xgoal = view.getwidth() ; int ygoal = view.getheight() ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 2 ; int ysize = 2 ; int currdepth = depth ; int i; if (root == zeronode(currdepth)) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == 1) { // we have leaf nodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth <= 1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; ysize-- ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; ysize-- ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; xsize-- ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; xsize-- ; } else { leftbm >>= (sz >> 1) ; } xsize <<= 1 ; ysize <<= 1 ; } else { node *z = 0 ; if (hashed) z = zeronode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { node *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } top = newv ; newv.clear() ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; ysize-- ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { node *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } bottom = newv ; newv.clear() ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; ysize-- ; } ysize *= 2 ; outer = 0 ; for (i=0; i<(int)right.size(); i++) { node *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } right = newv ; newv.clear() ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; xsize-- ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { node *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } left = newv ; newv.clear() ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; xsize-- ; } xsize *= 2 ; } if (xsize > xgoal || ysize > ygoal) break ; } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 1) ; ymin <<= (currdepth + 1) ; xmax <<= (currdepth + 1) ; ymax <<= (currdepth + 1) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } int mag = - currdepth - 1 ; while (xsize <= xgoal && ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } view.setpositionmag(xmin, xmax, ymin, ymax, mag) ; } void hlifealgo::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x >>= -mag ; x <<= -mag ; y -= 1 ; y >>= -mag ; y <<= -mag ; y += 1 ; } golly-3.3-src/gollybase/ghashdraw.cpp0000644000175000017500000005660313247734027014673 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This file is where we figure out how to draw ghashbase structures, * no matter what the magnification or renderer. */ #include "ghashbase.h" #include "util.h" #include #include #include #include using namespace std ; // AKT: a 256x256 pixmap is good for OpenGL and matches the size // used in qlifedraw.cpp and hlifedraw.cpp; // note that logpmsize *must* be 8 in iOS 9.x to avoid drawing problems // in my iPad (probably due to a bug in the OpenGL ES 2 driver) const int logpmsize = 8; // 8=256x256 const int pmsize = (1<justState() || pmag > 1) { // store state info pixbuf[i] = sw; pixbuf[i+1] = se; i -= pmsize; pixbuf[i] = nw; pixbuf[i+1] = ne; } else { // store RGBA info if (sw) { pixRGBAbuf[i] = cellRGBA[sw] ; } if (se) { pixRGBAbuf[i+1] = cellRGBA[se] ; } i -= pmsize ; if (nw) { pixRGBAbuf[i] = cellRGBA[nw] ; } if (ne) { pixRGBAbuf[i+1] = cellRGBA[ne] ; } } } void ghashbase::draw4x4_1(ghnode *n, ghnode *z, int llx, int lly) { // AKT: draw all live cells using state 1 color // pmag == 1, so store RGBA info int i = (pmsize-1+lly) * pmsize - llx; if (n->sw != z) { pixRGBAbuf[i] = state1RGBA; } if (n->se != z) { pixRGBAbuf[i+1] = state1RGBA; } i -= pmsize; if (n->nw != z) { pixRGBAbuf[i] = state1RGBA; } if (n->ne != z) { pixRGBAbuf[i+1] = state1RGBA; } } // AKT: kill all cells in pixbuf void ghashbase::killpixels() { if (renderer->justState() || pmag > 1) { // pixblit assumes pixbuf contains pmsize*pmsize bytes where each byte // is a cell state, so it's easy to kill all cells memset(pixbuf, 0, pmsize*pmsize); } else { // pixblit assumes pixbuf contains 4 bytes (RGBA) for each pixel if (deada == 0) { // dead cells are 100% transparent so we can use fast method // (RGB values are irrelevant if alpha is 0) memset(pixbuf, 0, sizeof(ipixbuf)); } else { // use slower method unsigned int deadRGBA = cellRGBA[0]; unsigned int *rgbabuf = pixRGBAbuf; // fill the first row with the dead pixel state for (int i = 0 ; i < pmsize; i++) { *rgbabuf++ = deadRGBA; } // copy 1st row to remaining rows for (int i = rowoff; i < ibufsize; i += rowoff) { memcpy(&pixbuf[i], pixbuf, rowoff); } } } } void ghashbase::renderbm(int x, int y) { // x,y is lower left corner int rx = x ; int ry = y ; int rw = pmsize ; int rh = pmsize ; if (pmag > 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; if (renderer->justState()) renderer->stateblit(rx, ry, rw, rh, pixbuf) ; else renderer->pixblit(rx, ry, rw, rh, pixbuf, pmag); killpixels(); } /* * Here, llx and lly are coordinates in screen pixels describing * where the lower left pixel of the screen is. Draw one ghnode. * This is our main recursive routine. */ void ghashbase::drawghnode(ghnode *n, int llx, int lly, int depth, ghnode *z) { int sw = 1 << (depth - mag + 1) ; if (sw >= pmsize && (llx + vieww <= 0 || lly + viewh <= 0 || llx >= sw || lly >= sw)) return ; if (n == z) { // don't do anything } else if (depth > 0 && sw > 2) { z = z->nw ; sw >>= 1 ; depth-- ; if (sw == (pmsize >> 1)) { drawghnode(n->sw, 0, 0, depth, z) ; drawghnode(n->se, -(pmsize/2), 0, depth, z) ; drawghnode(n->nw, 0, -(pmsize/2), depth, z) ; drawghnode(n->ne, -(pmsize/2), -(pmsize/2), depth, z) ; renderbm(-llx, -lly) ; } else { drawghnode(n->sw, llx, lly, depth, z) ; drawghnode(n->se, llx-sw, lly, depth, z) ; drawghnode(n->nw, llx, lly-sw, depth, z) ; drawghnode(n->ne, llx-sw, lly-sw, depth, z) ; } } else if (depth > 0 && sw == 2) { draw4x4_1(n, z->nw, llx, lly) ; } else if (sw == 1) { drawpixel(-llx, -lly) ; } else { struct ghleaf *l = (struct ghleaf *)n ; sw >>= 1 ; if (sw == 1) { draw4x4_1(l->sw, l->se, l->nw, l->ne, llx, lly) ; } else { lifefatal("Can't happen") ; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void ghashbase::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; bigint s = 1 ; s <<= d ; coor.first += s ; coor.second += s ; int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } /* * This is the top-level draw routine that takes the root ghnode. * It maintains four ghnodes onto which the screen fits and uses the * high bits of llx/lly to project those four ghnodes as far down * the tree as possible, so we know we can get away with just * 32-bit arithmetic in the above recursive routine. This way * we don't need any high-precision addition or subtraction to * display an image. */ void ghashbase::draw(viewport &viewarg, liferender &rendererarg) { /* AKT: call killpixels below memset(pixbuf, 0, sizeof(ipixbuf)) ; */ ensure_hashed() ; renderer = &rendererarg ; if (!renderer->justState()) { // AKT: get cell colors and alpha values for dead and live pixels renderer->getcolors(&cellred, &cellgreen, &cellblue, &deada, &livea); // rowett: create RGBA view unsigned char *rgbaptr = (unsigned char *)cellRGBA; // create dead color *rgbaptr++ = cellred[0]; *rgbaptr++ = cellgreen[0]; *rgbaptr++ = cellblue[0]; *rgbaptr++ = deada; // create live colors unsigned int livestates = NumCellStates() - 1; for (unsigned int ui = 1; ui <= livestates; ui++) { *rgbaptr++ = cellred[ui]; *rgbaptr++ = cellgreen[ui]; *rgbaptr++ = cellblue[ui]; *rgbaptr++ = livea; } // remember the live state 1 color state1RGBA = cellRGBA[1]; } view = &viewarg ; uvieww = view->getwidth() ; uviewh = view->getheight() ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag - 1) ; } else { mag = (-view->getmag()) ; pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } // AKT: must call killpixels after setting pmag killpixels(); int d = depth ; fill_ll(d) ; int maxd = vieww ; int i ; ghnode *z = zeroghnode(d) ; ghnode *sw = root, *nw = z, *ne = z, *se = z ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ for (i=llbits-1; i>d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { goto bail ; } } /* Find the lowest four we need to examine */ while (d > 0 && d - mag >= 0 && (d - mag > 28 || (1 << (d - mag)) > 2 * maxd)) { llx = (llx << 1) + llxb[d] ; lly = (lly << 1) + llyb[d] ; if (llx >= 1) { if (lly >= 1) { ne = ne->sw ; nw = nw->se ; se = se->nw ; sw = sw->ne ; lly-- ; } else { ne = se->nw ; nw = sw->ne ; se = se->sw ; sw = sw->se ; } llx-- ; } else { if (lly >= 1) { ne = nw->se ; nw = nw->sw ; se = sw->ne ; sw = sw->nw ; lly-- ; } else { ne = sw->ne ; nw = sw->nw ; se = sw->se ; sw = sw->sw ; } } if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { goto bail ; } d-- ; } /* At this point we know we can use 32-bit arithmetic. */ for (i=d; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* clear the border *around* the universe if necessary */ if (d + 1 <= mag) { ghnode *z = zeroghnode(d) ; if (llx > 0 || lly > 0 || llx + vieww <= 0 || lly + viewh <= 0 || (sw == z && se == z && nw == z && ne == z)) { // no live cells } else { drawpixel(0, 0) ; renderbm(-llx, -lly) ; } } else { z = zeroghnode(d) ; maxd = 1 << (d - mag + 2) ; if (maxd <= pmsize) { maxd >>= 1 ; drawghnode(sw, 0, 0, d, z) ; drawghnode(se, -maxd, 0, d, z) ; drawghnode(nw, 0, -maxd, d, z) ; drawghnode(ne, -maxd, -maxd, d, z) ; renderbm(-llx, -lly) ; } else { maxd >>= 1 ; drawghnode(sw, llx, lly, d, z) ; drawghnode(se, llx-maxd, lly, d, z) ; drawghnode(nw, llx, lly-maxd, d, z) ; drawghnode(ne, llx-maxd, lly-maxd, d, z) ; } } bail: renderer = 0 ; view = 0 ; } static int getbitsfromleaves(const vector &v) { unsigned short nw=0, ne=0, sw=0, se=0 ; int i; for (i=0; i<(int)v.size(); i++) { ghleaf *p = (ghleaf *)v[i] ; nw |= p->nw ; ne |= p->ne ; sw |= p->sw ; se |= p->se ; } int r = 0 ; // horizontal bits are least significant ones unsigned short w = nw | sw ; unsigned short e = ne | se ; // vertical bits are next 8 unsigned short n = nw | ne ; unsigned short s = sw | se ; if (w) r |= 512 ; if (e) r |= 256 ; if (n) r |= 2 ; if (s) r |= 1 ; return r ; } /** * Copy the vector, but sort it and uniquify it so we don't have a ton * of duplicate ghnodes. */ static void sortunique(vector &dest, vector &src) { swap(src, dest) ; // note: this is superfast sort(dest.begin(), dest.end()) ; vector::iterator new_end = unique(dest.begin(), dest.end()) ; dest.erase(new_end, dest.end()) ; src.clear() ; } using namespace std ; void ghashbase::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int currdepth = depth ; int i; if (root == zeroghnode(currdepth)) { // return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= -2) { currdepth-- ; if (currdepth == -1) { // we have ghleaf ghnodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth == -1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; } else { leftbm >>= (sz >> 1) ; } } else if (currdepth >= 0) { ghnode *z = 0 ; if (hashed) z = zeroghnode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { ghnode *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(top, newv) ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { ghnode *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } sortunique(bottom, newv) ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; } outer = 0 ; for (i=0; i<(int)right.size(); i++) { ghnode *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } sortunique(right, newv) ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { ghnode *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(left, newv) ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; } } } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 3) ; ymin <<= (currdepth + 3) ; xmax <<= (currdepth + 3) ; ymax <<= (currdepth + 3) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void ghashbase::fit(viewport &view, int force) { ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int xgoal = view.getwidth() ; int ygoal = view.getheight() ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 2 ; int ysize = 2 ; int currdepth = depth ; int i; if (root == zeroghnode(currdepth)) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == -1) { // we have ghleaf ghnodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth == -1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; ysize-- ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; ysize-- ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; xsize-- ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; xsize-- ; } else { leftbm >>= (sz >> 1) ; } xsize <<= 1 ; ysize <<= 1 ; } else if (currdepth >= 0) { ghnode *z = 0 ; if (hashed) z = zeroghnode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { ghnode *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } top = newv ; newv.clear() ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; ysize-- ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { ghnode *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } bottom = newv ; newv.clear() ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; ysize-- ; } ysize *= 2 ; outer = 0 ; for (i=0; i<(int)right.size(); i++) { ghnode *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } right = newv ; newv.clear() ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; xsize-- ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { ghnode *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } left = newv ; newv.clear() ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; xsize-- ; } xsize *= 2 ; } if (xsize > xgoal || ysize > ygoal) break ; } if (currdepth < 0){ xmin >>= -currdepth ; ymin >>= -currdepth ; xmax >>= -currdepth ; ymax >>= -currdepth ; } else { xmin <<= currdepth ; ymin <<= currdepth ; xmax <<= currdepth ; ymax <<= currdepth ; } xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } int mag = - currdepth - 1 ; while (xsize <= xgoal && ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } view.setpositionmag(xmin, xmax, ymin, ymax, mag) ; } void ghashbase::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x >>= -mag ; x <<= -mag ; y -= 1 ; y >>= -mag ; y <<= -mag ; y += 1 ; } golly-3.3-src/gollybase/bigint.cpp0000644000175000017500000004332713230774246014175 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include #include #include #include #include #include "util.h" #undef SLOWCHECK using namespace std ; /** * Static data. */ static const int MAX_SIMPLE = 0x3fffffff ; static const int MIN_SIMPLE = -0x40000000 ; char *bigint::printbuf ; int *bigint::work ; int bigint::printbuflen ; int bigint::workarrlen ; char bigint::sepchar = ',' ; int bigint::sepcount = 3 ; /** * Routines. */ bigint::bigint(G_INT64 i) { if (i <= INT_MAX && i >= INT_MIN) fromint((int)i) ; else { v.i = 0 ; vectorize(0) ; v.p[0] = 3 ; v.p[1] = (int)(i & 0x7fffffff) ; v.p[2] = (int)((i >> 31) & 0x7fffffff) ; v.p[3] = 0 ; ripple((int)(i >> 62), 3) ; } } // we can parse ####, 2^###, -##### // AKT: we ignore all non-digits (except for leading '-') // so we can parse strings like "1,234" or "+1.234"; // it is up to caller to impose smarter restrictions bigint::bigint(const char *s) { if (*s == '2' && s[1] == '^') { long x = atol(s+2) ; if (x < 31) fromint(1 << x) ; else { int sz = 2 + int((x + 1) / 31) ; int asz = sz ; while (asz & (asz - 1)) asz &= asz - 1 ; asz *= 2 ; v.p = new int[asz] ; v.p[0] = sz ; for (int i=1; i<=sz; i++) v.p[i] = 0 ; v.p[sz-1] = 1 << (x % 31) ; } } else { int neg = 0 ; if (*s == '-') { neg = 1 ; s++ ; } fromint(0) ; while (*s) { // AKT: was *s != sepchar if (*s >= '0' && *s <= '9') { mul_smallint(10) ; if (neg) add_smallint('0'-*s) ; else add_smallint(*s-'0') ; } s++ ; } } } static int *copyarr(int *p) { int sz = *p ; while (sz & (sz - 1)) sz &= sz - 1 ; sz *= 2 ; int *r = new int[sz] ; memcpy(r, p, sizeof(int) * (p[0] + 1)) ; #ifdef SLOWCHECK for (int i=p[0]+1; i printbuflen) { if (printbuf) delete [] printbuf ; printbuf = new char[2 * lenreq] ; printbuflen = 2 * lenreq ; } int sz = 1 ; if (0 == (v.i & 1)) sz = size() ; ensurework(sz) ; int neg = sign() < 0 ; if (v.i & 1) { if (neg) work[0] = -(v.i >> 1) ; else work[0] = v.i >> 1 ; } else { if (neg) { int carry = 1 ; for (int i=0; i+1> 31) & 1 ; } work[sz-1] = carry + ~v.p[sz] ; } else { for (int i=0; i=0; i--) { G_INT64 c = carry * G_MAKEINT64(0x80000000) + work[i] ; carry = (int)(c % bigradix) ; work[i] = (int)(c / bigradix) ; allbits |= work[i] ; } for (i=0; i<9; i++) { // put the nine digits in *p++ = (char)(carry % 10 + '0') ; carry /= 10 ; } if (allbits == 0) break ; } while (p > printbuf + 1 && *(p-1) == '0') p-- ; char *r = p ; if (neg) *r++ = '-' ; for (int i=(int)(p-printbuf-1); i>=0; i--) { *r++ = printbuf[i] ; if (i && sep && (i % sepcount == 0)) *r++ = sep ; } *r++ = 0 ; return p ; } void bigint::grow(int osz, int nsz) { int bdiffs = osz ^ nsz ; if (bdiffs > osz) { while (bdiffs & (bdiffs - 1)) bdiffs &= bdiffs - 1 ; int *nv = new int[2*bdiffs] ; for (int i=0; i<=osz; i++) nv[i] = v.p[i] ; #ifdef SLOWCHECK for (int i=osz+1; i<2*bdiffs; i++) nv[i] = 0xdeadbeef ; #endif delete [] v.p ; v.p = nv ; } int av = v.p[osz] ; while (osz < nsz) { v.p[osz] = av & 0x7fffffff ; osz++ ; } v.p[nsz] = av ; v.p[0] = nsz ; } bigint& bigint::operator+=(const bigint &a) { if (a.v.i & 1) add_smallint(a.v.i >> 1) ; else { if (v.i & 1) vectorize(v.i >> 1) ; ripple(a, 0) ; } return *this ; } bigint& bigint::operator-=(const bigint &a) { if (a.v.i & 1) add_smallint(-(a.v.i >> 1)) ; else { if (v.i & 1) vectorize(v.i >> 1) ; ripplesub(a, 1) ; } return *this ; } int bigint::sign() const { int si = v.i ; if (0 == (si & 1)) si = v.p[size()] ; if (si > 0) return 1 ; if (si < 0) return -1 ; return 0 ; } int bigint::size() const { return v.p[0] ; } void bigint::add_smallint(int a) { if (v.i & 1) fromint((v.i >> 1) + a) ; else ripple(a, 1) ; } // do we need to shrink it to keep it canonical? void bigint::shrink(int pos) { while (pos > 1 && ((v.p[pos] - v.p[pos-1]) & 0x7fffffff) == 0) { pos-- ; v.p[pos] = v.p[pos+1] ; v.p[0] = pos ; } if (pos == 1) { int c = v.p[1] ; delete [] v.p ; v.i = 1 | (c << 1) ; } else if (pos == 2 && ((v.p[2] ^ v.p[1]) & 0x40000000) == 0) { int c = v.p[1] + (v.p[2] << 31) ; delete [] v.p ; v.i = 1 | (c << 1) ; } } void grow(int osz, int nsz) ; // note: carry may be any legal 31-bit int, *or* positive 2^30 // note: may only be called on arrayed bigints void bigint::ripple(int carry, int pos) { int c ; int sz = size() ; while (pos < sz) { c = v.p[pos] + (carry & 0x7fffffff) ; carry = ((c >> 31) & 1) + (carry >> 31) ; v.p[pos++] = c & 0x7fffffff; } c = v.p[pos] + carry ; if (c == 0 || c == -1) { // see if we can make it smaller v.p[pos] = c ; shrink(pos) ; } else { // need to extend if (0 == (sz & (sz + 1))) { // grow array (oops) grow(sz, sz+1) ; } else v.p[0] = sz + 1 ; v.p[pos] = c & 0x7fffffff ; v.p[pos+1] = -((c >> 31) & 1) ; } } void bigint::ripple(const bigint &a, int carry) { int asz = a.size() ; int tsz = size() ; int pos = 1 ; if (tsz < asz) { // gotta resize grow(tsz, asz) ; tsz = asz ; } while (pos < asz) { int c = v.p[pos] + a.v.p[pos] + carry ; carry = (c >> 31) & 1 ; v.p[pos++] = c & 0x7fffffff; } ripple(carry + a.v.p[pos], pos) ; } void bigint::ripplesub(const bigint &a, int carry) { int asz = a.size() ; int tsz = size() ; int pos = 1 ; if (tsz < asz) { // gotta resize grow(tsz, asz) ; tsz = asz ; } while (pos < asz) { int c = v.p[pos] + (0x7fffffff ^ a.v.p[pos]) + carry ; carry = (c >> 31) & 1 ; v.p[pos++] = c & 0x7fffffff; } ripple(carry + ~a.v.p[pos], pos) ; } // make sure it's in vector form; may leave it not canonical! void bigint::vectorize(int i) { v.p = new int[4] ; v.p[0] = 2 ; v.p[1] = i & 0x7fffffff ; if (i < 0) v.p[2] = -1 ; else v.p[2] = 0 ; #ifdef SLOWCHECK v.p[3] = 0xdeadbeef ; #endif } void bigint::fromint(int i) { if (i <= MAX_SIMPLE && i >= MIN_SIMPLE) v.i = (i << 1) | 1 ; else vectorize(i) ; } void bigint::ensurework(int sz) const { sz += 3 ; if (sz > workarrlen) { if (work) delete [] work ; work = new int[sz * 2] ; workarrlen = sz * 2 ; } } void bigint::mul_smallint(int a) { int c ; if (a == 0) { *this = 0 ; return ; } if (v.i & 1) { if ((v.i >> 1) <= MAX_SIMPLE / a) { c = (v.i >> 1) * a ; fromint((v.i >> 1) * a) ; return ; } vectorize(v.i >> 1) ; } int sz = size() ; int carry = 0 ; int pos = 1 ; while (pos < sz) { int clo = (v.p[pos] & 0xffff) * a + carry ; int chi = (v.p[pos] >> 16) * a + (clo >> 16) ; carry = chi >> 15 ; v.p[pos++] = (clo & 0xffff) + ((chi & 0x7fff) << 16) ; } c = v.p[pos] * a + carry ; if (c == 0 || c == -1) { // see if we can make it smaller v.p[pos] = c ; shrink(pos) ; } else { // need to extend if (0 == (sz & (sz + 1))) { // grow array (oops) grow(sz, sz+1) ; } else v.p[0] = sz + 1 ; v.p[pos] = c & 0x7fffffff ; v.p[pos+1] = -((c >> 31) & 1) ; } } void bigint::div_smallint(int a) { if (v.i & 1) { int r = (v.i >> 1) / a ; fromint(r) ; return ; } if (v.p[v.p[0]] < 0) lifefatal("we don't support divsmallint when negative yet") ; int carry = 0 ; int pos = v.p[0] ; while (pos > 0) { G_INT64 t = ((G_INT64)carry << G_MAKEINT64(31)) + v.p[pos] ; carry = (int)(t % a) ; v.p[pos] = (int)(t / a) ; pos-- ; } shrink(v.p[0]) ; } int bigint::mod_smallint(int a) { if (v.i & 1) return (((v.i >> 1) % a) + a) % a ; int pos = v.p[0] ; int mm = (2 * ((1 << 30) % a) % a) ; int r = 0 ; while (pos > 0) { r = (mm * r + v.p[pos]) % a ; pos-- ; } return (r + a) % a ; } void bigint::div2() { if (v.i & 1) { v.i = ((v.i >> 1) | 1) ; return ; } int sz = v.p[0] ; int carry = -v.p[sz] ; for (int i=sz-1; i>0; i--) { int c = (v.p[i] >> 1) + (carry << 30) ; carry = v.p[i] & 1 ; v.p[i] = c ; } shrink(v.p[0]) ; } bigint& bigint::operator>>=(int i) { if (v.i & 1) { if (i > 31) v.i = ((v.i >> 31) | 1) ; else v.i = ((v.i >> i) | 1) ; return *this ; } int bigsh = i / 31 ; if (bigsh) { if (bigsh >= v.p[0]) { v.p[1] = v.p[v.p[0]] ; v.p[0] = 1 ; } else { for (int j=1; j+bigsh<=v.p[0]; j++) v.p[j] = v.p[j+bigsh] ; v.p[0] -= bigsh ; } i -= bigsh * 31 ; } int carry = v.p[v.p[0]] ; if (i) { for (int j=v.p[0]-1; j>0; j--) { int c = ((v.p[j] >> i) | (carry << (31-i))) & 0x7fffffff ; carry = v.p[j] ; v.p[j] = c ; } } shrink(v.p[0]) ; return *this ; } bigint& bigint::operator<<=(int i) { if (v.i & 1) { if (v.i == 1) return *this ; if (i < 30 && (v.i >> 31) == (v.i >> (31 - i))) { v.i = ((v.i & ~1) << i) | 1 ; return *this ; } vectorize(v.i >> 1) ; } int bigsh = i / 31 ; int nsize = v.p[0] + bigsh + 1 ; // how big we need it to be, worst case grow(v.p[0], nsize) ; if (bigsh) { int j ; for (j=v.p[0]-1; j>bigsh; j--) v.p[j] = v.p[j-bigsh] ; for (j=bigsh; j>0; j--) v.p[j] = 0 ; i -= bigsh * 31 ; } int carry = 0 ; if (i) { for (int j=1; j> (31-i))) & 0x7fffffff ; carry = v.p[j] ; v.p[j] = c ; } } shrink(v.p[0]) ; return *this ; } void bigint::mulpow2(int p) { if (p > 0) *this <<= p ; else if (p < 0) *this >>= -p ; } int bigint::even() const { if (v.i & 1) return 1-((v.i >> 1) & 1) ; else return 1-(v.p[1] & 1) ; } int bigint::odd() const { if (v.i & 1) return ((v.i >> 1) & 1) ; else return (v.p[1] & 1) ; } int bigint::low31() const { if (v.i & 1) return ((v.i >> 1) & 0x7fffffff) ; else return v.p[1] ; } int bigint::operator==(const bigint &b) const { if ((b.v.i - v.i) & 1) return 0 ; if (v.i & 1) return v.i == b.v.i ; if (b.v.p[0] != v.p[0]) return 0 ; return memcmp(v.p, b.v.p, sizeof(int) * (v.p[0] + 1)) == 0 ; } int bigint::operator!=(const bigint &b) const { return !(*this == b) ; } int bigint::operator<(const bigint &b) const { if (b.v.i & 1) if (v.i & 1) return v.i < b.v.i ; else return v.p[v.p[0]] < 0 ; else if (v.i & 1) return b.v.p[b.v.p[0]] >= 0 ; int d = v.p[v.p[0]] - b.v.p[b.v.p[0]] ; if (d < 0) return 1 ; if (d > 0) return 0 ; if (v.p[0] > b.v.p[0]) return v.p[v.p[0]] < 0 ; else if (v.p[0] < b.v.p[0]) return v.p[v.p[0]] >= 0 ; for (int i=v.p[0]; i>0; i--) if (v.p[i] < b.v.p[i]) return 1 ; else if (v.p[i] > b.v.p[i]) return 0 ; return 0 ; } int bigint::operator<=(const bigint &b) const { if (b.v.i & 1) if (v.i & 1) return v.i <= b.v.i ; else return v.p[v.p[0]] < 0 ; else if (v.i & 1) return b.v.p[b.v.p[0]] >= 0 ; int d = v.p[v.p[0]] - b.v.p[b.v.p[0]] ; if (d < 0) return 1 ; if (d > 0) return 0 ; if (v.p[0] > b.v.p[0]) return v.p[v.p[0]] < 0 ; else if (v.p[0] < b.v.p[0]) return v.p[v.p[0]] >= 0 ; for (int i=v.p[0]; i>0; i--) if (v.p[i] < b.v.p[i]) return 1 ; else if (v.p[i] > b.v.p[i]) return 0 ; return 1 ; } int bigint::operator>(const bigint &b) const { return !(*this <= b) ; } int bigint::operator>=(const bigint &b) const { return !(*this < b) ; } static double mybpow(int n) { double r = 1 ; double s = 65536.0 * 32768.0 ; while (n) { if (n & 1) r *= s ; s *= s ; n >>= 1 ; } return r ; } /** * Turn this bigint into a double. */ double bigint::todouble() const { if (v.i & 1) return (double)(v.i >> 1) ; double r = 0 ; double m = 1 ; int lim = 1 ; if (v.p[0] > 4) { lim = v.p[0] - 3 ; m = mybpow(lim-1) ; } for (int i=lim; i<=v.p[0]; i++) { r = r + m * v.p[i] ; m *= 65536 * 32768.0 ; } return r ; } /** * Turn this bigint into a double in a way that preserves huge exponents. * Here are some examples: * * To represent * the quantity We return the value * 27 1.27 * -6.02e23 -23.602 * 6.02e23 23.602 * 9.99e299 299.999 * 1.0e300 300.1 * 1.0e1000 1000.1 This would normally overflow * 6.7e12345 12345.67 */ double bigint::toscinot() const { double mant, exponent; double k_1_10 = 0.1; double k_1_10000 = 0.0001; double k_base = 65536.0 * 32768.0; exponent = 0; if (v.i & 1) { /* small integer */ mant = (double)(v.i >> 1) ; } else { /* big integer: a string of 31-bit chunks */ mant = 0 ; double m = 1 ; for (int i=1; i<=v.p[0]; i++) { mant = mant + m * v.p[i] ; m *= k_base ; while (m >= 100000.0) { m *= k_1_10000; mant *= k_1_10000; exponent += 4.0; } } } /* Add the last few powers of 10 back into the mantissa */ while(((mant < 0.5) && (mant > -0.5)) && (exponent > 0.0)) { mant *= 10.0; exponent -= 1.0; } /* Mantissa might be greater than 1 at this point */ while((mant >= 1.0) || (mant <= -1.0)) { mant *= k_1_10; exponent += 1.0; } if (mant >= 0) { // Normal case: 6.02e23 -> 23.602 return(exponent + mant); } // Negative case: -6.02e23 -> -23.602 // In this example mant will be -0.602 and exponent will be 23.0 return(mant - exponent); } /** * Return an int. */ int bigint::toint() const { if (v.i & 1) return (v.i >> 1) ; return (v.p[v.p[0]] << 31) | v.p[1] ; } /** * How many bits required to represent this, approximately? * Should overestimate but not by too much. */ int bigint::bitsreq() const { if (v.i & 1) return 31 ; return v.p[0] * 31 ; } /** * Find the lowest bit set. */ int bigint::lowbitset() const { int r = 0 ; if (v.i & 1) { if (v.i == 1) return -1 ; for (int i=1; i<32; i++) if ((v.i >> i) & 1) return i-1 ; } int o = 1 ; while (v.p[o] == 0) { o++ ; r += 31 ; } for (int i=0; i<32; i++) if ((v.p[o] >> i) & 1) return i + r ; return -1 ; } /** * Fill a character array with the bits. Top one is always * the sign bit. */ void bigint::tochararr(char *fillme, int n) const { int at = 0 ; while (n > 0) { int w = 0 ; if (v.i & 1) { if (at == 0) w = v.i >> 1 ; else w = v.i >> 31 ; } else { if (at < v.p[0]) w = v.p[at+1] ; else w = v.p[v.p[0]] ; } int lim = 31 ; if (n < 31) lim = n ; for (int i=0; i>= 1 ; } n -= 31 ; at++ ; } } /** * Manifests. */ const bigint bigint::zero(0) ; const bigint bigint::one(1) ; const bigint bigint::two(2) ; const bigint bigint::three(3) ; const bigint bigint::maxint(INT_MAX) ; const bigint bigint::minint(INT_MIN) ; // most editing operations are limited to absolute coordinates <= 10^9, // partly because getcell and setcell only take int parameters, but mostly // to avoid ridiculously long cut/copy/paste/rotate/etc operations const bigint bigint::min_coord(-1000000000) ; const bigint bigint::max_coord(+1000000000) ; golly-3.3-src/gollybase/lifepoll.h0000755000175000017500000000622013145740437014166 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This interface is called every so often by lifealgo routines to * make sure events are processed and the screen is redrawn in a * timely manner. The default class does nothing (no actual * callbacks); the user of this class should override checkevents() * to do the right thing. */ #ifndef LIFEPOLL_H #define LIFEPOLL_H /** * How frequently to invoke the heavyweight event checker, as a * count of inner-loop polls. */ const int POLLINTERVAL = 1000 ; class lifepoll { public: lifepoll() ; /** * This is what should be overridden; it should check events, * and return 0 if all is okay or 1 if the existing calculation * should be interrupted. */ virtual int checkevents() ; /** * Was an interrupt requested? */ int isInterrupted() { return interrupted ; } /** * Before a calculation begins, call this to reset the * interrupted flag. */ void resetInterrupted() { interrupted = 0 ; } /** * Call this to stop the current calculation. */ void setInterrupted() { interrupted = 1 ; } /** * This is the routine called by the life algorithms at various * points. It calls checkevents() and stashes the result. * * This routine may happen to go in the inner loop where it * could be called a million times a second or more. Checking * for events might be a moderately heavyweight operation that * could take microseconds, significantly slowing down the * calculation. To solve this, we use a countdown variable * and only actually check when the countdown gets low * enough (and we put it inline). We assume a derating of * 1000 is sufficient to alleviate the slowdown without * significantly impacting event response time. Even so, the * poll positions should be carefully selected to be *not* * millions of times a second. */ inline int poll() { return (countdown-- > 0) ? interrupted : inner_poll() ; } int inner_poll() ; /** * Sometimes we do a lengthy operation that we *don't* poll * during. After such operations, this function resets the * poll countdown back to zero so we get very quick response. */ void reset_countdown() { countdown = 0 ; } /** * Some routines should not be called during a poll() such as ones * that would modify the state of the algorithm process. Some * can be safely called but should be deferred. This routine lets * us know if we are called from the callback or not. */ int isCalculating() { return calculating ; } void bailIfCalculating() ; /** * Sometimes getPopulation is called when hashlife is in a state * where we just can't calculate it at that point in time. So * hashlife remembers that the population was requested, and * when the GC is finished, calcs the pop and executes this * callback to update the status window. */ virtual void updatePop() ; private: int interrupted ; int calculating ; int countdown ; } ; extern lifepoll default_poller ; #endif golly-3.3-src/gollybase/qlifealgo.h0000644000175000017500000002764213441044674014332 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This is the fast "conventional" life algorithm code. */ #ifndef QLIFEALGO_H #define QLIFEALGO_H #include "lifealgo.h" #include "liferules.h" #include /* * The smallest unit of the universe is the `slice', which is a * 4 (horizontal) by 8 (vertical) chunk of the world. Each slice * is stored in a 32-bit word. The most significant bit of the * word is the upper left bit; the remaining bits go across * horizontally then down vertically. * * We always recompute in units of a slice. This is smaller than the * 8x8 in some programs, and in this particular case adds to the * efficiency. * * This arrangment of bits was selected to minimize the bit * twiddling needed for lookup; in general, we use a lookup table * that takes a 4x4 current-generation and figures out the values * of the inner 2x2 cells. * * A `brick' is composed of eight slices for the even generation and * eight slices for the odd generation. This is a total of 16 * 32-bit words. The slices are concatenated horizontally so each * brick contains two generations of a 32x8 section of the universe. * * No other data is stored directly into the bricks; various flags are * stored in the next level up. We try and minimize the size of the * data for a given universe so that we can minimize the number of * data cache misses and TLB misses. For almost all universes, the * bulk of the allocated data is in these 64-byte bricks. * * We use a stagger-step type algorithm to minimize the number of * neighbors that need to be examined (thanks, Alan!) for each slice. * Thus, a brick that holds (0,0)-(31,7) for the even generation would * hold (1,1)-(32,8) in the odd generations. */ struct brick { /* 64 bytes */ unsigned int d[16] ; } ; /* * A tile contains the flags for four bricks, and pointers to the bricks * themselves. These pointers are never null; if the portion of the * universe is completely empty, they point to a unique allocated * `emptybrick'. This means that we do not need to check if the pointers * are null; we can simply always dereference and get valid data. Thus, * each tile corresponds to a 32x32 section of the universe. * * The c flags indicate that, in the previous computation, * the data was found to change in some slice or * subslice. The least significant bit in each c01 flag corresponds * to the last (8th) slice for phase 0->1, and to the first slice for * phase 1->0. * * There are ten valid bits in c flags 1-4, one for each slice, * one most significant one that indicates that the rightmost (leftmost) * two columns of the first (eighth) slice changed in phase 0->1 (1->0) * (and thus, the next brick to the left (right) needs to be recomputed). * The tenth bit is just the ninth bit from the previous generation. * * For c flags 0 and 5, we only have the first nine bits as above. * * We need six flags; four for the slices themselves, and one indicating * that the top two rows of a particular slice has changed, and thus * the next brick up needs to be recomputed, and one indicating that the * bottom two rows of a particular slice has changed. * * In all cases, tiles only contain data about what has happened completely * within their borders; indicating that the next slice over needs to be * recomputed is handled by always inspecting the neighboring slices * *before* a recomputation. * * The flags int is divided into two 12-bit fields, each holding a population * count, and one eight-bit field, holding dirty flags. * * Note that tiles only point `down' to bricks, never to each other or to * higher-level supertiles. * * Tiles are numbered as level `0' of the universe tree. * * The tiles are 32 bytes each; they can hold up to four bricks, so the * memory consumption of the tiles tends to be small. */ struct tile { /* 32 bytes */ struct brick *b[4] ; short c[6] ; int flags ; } ; /* * Supertiles hold pointers to eight subtiles, which can either be * tiles or supertiles themselves. Supertiles are numbered as levels `1' on * up of the universe tree. * * Odd levels stack their subtiles horizontally; even levels stack their * subtiles vertically. Thus, each supertile at level 1 corresponds to * a 256x32 section of the universe. Each supertile at level 2 corresponds * to a 256x256 section of the universe. And so on. * * Levels are never skipped (that is, each pointer in a supertile at * level `n' points to a valid supertile or tile at level `n-1'). * * The c flag indicates that changes have happened in the subtiles. * The least significant eight bits indicate that changes have occurred * anywhere in the subtile; the least significant bit (bit 0) is associated * with the first subtile for phase 0->1 and the eighth subtile for phase * 1->0, and bit 7 is associated with other. Bit number 8 indicates that * some bits on the right (left) edge of the eighth (first) subtile have * changed for phase 0->1 (1->0). Bits numbered 9 through 16 indicate that * bits on the bottom (top) of the corresponding subtile have changed, and * bit number 17 indicates that a bit in the lower right (upper left) corner * of the eighth (first) subtile has changed. * * Bit 18 through 27 correspond to the previous generation's bits 8 through * 17. Bits 28 through 31 are the dirty bits; we currently use three of * them. * * The above description corresponds to odd levels. For even levels, * since tiles are stacked vertically instead of horizontally, change * `lower' to `right' and `right' to `lower'. * * The dirty flags again are used to indicate that this tile needed to * be recomputed since the last time the dirty bit was cleared. * * The two pop values hold a population count, if the appropriate dirty * bit is clear. These counts will never hold values greater than * 500M, so that a sum of the eight in unsigned arithmetic is guaranteed * to never overflow. * * This completes the universe data structures. Note that there is no * limit (other than the size of a pointer and memory constraints) on * the size of the universe. For instance, using these data structures * we can easily build a universe with elements separated by 2^200 * pixels. * * The supertiles are 44 bytes each; they correspond to at least a * 256x32 chunk of the universe, so the total memory consumption due to * supertiles tends to be small. */ struct supertile { /* 44 bytes */ struct supertile *d[8] ; int flags ; int pop[2] ; } ; /* * This is a common header for chunks of memory linked together. */ struct linkedmem { struct linkedmem *next ; } ; /* * This structure contains all of our variables that pertain to a * particular universe. (Thus, we support multiple universes.) * * The minx, miny, maxx, and maxy values describe the borders of * the universe dictated by the level of the root supertile. If * ever during computation these bounds are found to be too tight, * another supertile is added on top of the root, expanding these * bounds. * * These bounds currently limit the size of the universe to 2^32 in * each direction; however, they are only used during the set call * (when initially setting up the universe). Changing them to * doubles or 64-bit ints will relax this limitation. For now we * leave them as is. * * The rootlev variable contains the supertile level of the root node. * * The tilelist, supertilelist, and bricklist are freelists for the * appropriate type of structure. * * The memused is a linked list of all memory blocks allocated; this * enables us to free the universe and all of its memory without actually * walking the entire life tree. * * The emptybrick pointer points to the unique brick that is guaranteed * to always be empty. The emptytile pointer is similar. * * Finally, root is the top of the current life tree. Nullroot is the * topmost empty supertile allocated, and nullroots[] holds the empty * supertiles at each level. Setting this to 40 limits the number of * levels to 40, which is sufficient for a 2^65x2^62 universe. */ class qlifealgo : public lifealgo { public: qlifealgo() ; virtual ~qlifealgo() ; virtual void clearall() ; virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &v) ; // call after setcell/clearcell calls virtual void endofpattern() { // AKT: unnecessary (and prevents shrinking selection while generating) // poller->bailIfCalculating() ; popValid = 0 ; } virtual void setIncrement(bigint inc) { increment = inc ; } virtual void setIncrement(int inc) { increment = inc ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; // can we do the gen count doubling? only hashlife virtual int hyperCapable() { return 0 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmemory >> 20) ; } virtual const char *setrule(const char *s) ; virtual const char *getrule() { return qliferules.getrule() ; } virtual void step() ; virtual void* getcurrentstate() { return 0 ; } virtual void setcurrentstate(void *) {} virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *writeNativeFormat(std::ostream &, char *) { return "No native format for qlifealgo yet." ; } static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: linkedmem *filllist(int size) ; brick *newbrick() ; tile *newtile() ; supertile *newsupertile(int lev) ; void uproot() ; int doquad01(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) ; int doquad10(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) ; int p01(tile *p, tile *pr, tile *pd, tile *prd) ; int p10(tile *plu, tile *pu, tile *pl, tile *p) ; G_INT64 find_set_bits(supertile *p, int lev, int gm1) ; int isEmpty(supertile *p, int lev, int gm1) ; supertile *mdelete(supertile *p, int lev) ; G_INT64 popcount() ; int uproot_needed() ; void dogen() ; void renderbm(int x, int y) ; void renderbm(int x, int y, int xsize, int ysize) ; void BlitCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) ; void ShrinkCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) ; int nextcell(int x, int y, supertile *n, int lev) ; void fill_ll(int d) ; int lowsub(vector &src, vector &dst, int lev) ; int highsub(vector &src, vector &dst, int lev) ; void allsub(vector &src, vector &dst, int lev) ; int gethbitsfromleaves(vector v) ; int getvbitsfromleaves(vector v) ; supertile *markglobalchange(supertile *, int, int &) ; void markglobalchange() ; // call if the rule changes /* data elements */ int min, max, rootlev ; int minlow32 ; bigint bmin, bmax ; bigint population ; int popValid ; linkedmem *tilelist, *supertilelist, *bricklist ; linkedmem *memused ; brick *emptybrick ; tile *emptytile ; supertile *root, *nullroot, *nullroots[40] ; int cleandowncounter ; g_uintptr_t maxmemory, usedmemory ; char *ruletable ; // when drawing, these are used liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag, kadd ; int oddgen ; int bmleft, bmtop, bmlev, shbmsize, logshbmsize ; int quickb, deltaforward ; int llbits, llsize ; char *llxb, *llyb ; liferules qliferules ; } ; #endif golly-3.3-src/gollybase/ruletreealgo.h0000644000175000017500000000171413145740437015052 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef RULETREEALGO_H #define RULETREEALGO_H #include "ghashbase.h" /** * An algorithm that uses an n-dary decision diagram. */ class ruletreealgo : public ghashbase { public: ruletreealgo() ; virtual ~ruletreealgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; // these two methods are needed for RuleLoader algo bool IsDefaultRule(const char* rulename); const char* LoadTree(FILE* rulefile, int lineno, char endchar, const char* s); private: int *a, base ; state *b ; int num_neighbors, num_states, num_nodes ; char rule[MAXRULESIZE] ; }; #endif golly-3.3-src/gollybase/qlifedraw.cpp0000644000175000017500000010000313247734027014661 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "qlifealgo.h" #include #include #include "util.h" const int logbmsize = 8 ; // *must* be 8 in this code const int bmsize = (1< 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; unsigned char *bigptr = bigbuf; if (renderer->justState() || pmag > 1) { // convert each bigbuf byte into 8 bytes of state data unsigned char *pixptr = pixbuf; for (int i = 0; i < ibufsize * 4; i++) { unsigned char byte = *bigptr++; *pixptr++ = (byte & 128) ? 1 : 0; *pixptr++ = (byte & 64) ? 1 : 0; *pixptr++ = (byte & 32) ? 1 : 0; *pixptr++ = (byte & 16) ? 1 : 0; *pixptr++ = (byte & 8) ? 1 : 0; *pixptr++ = (byte & 4) ? 1 : 0; *pixptr++ = (byte & 2) ? 1 : 0; *pixptr++ = (byte & 1); // no condition needed } } else { // convert each bigbuf byte into 32 bytes of pixel data (8 * RGBA) // get RGBA view of pixel buffer unsigned int *pixptr = (unsigned int *)pixbuf; for (int i = 0; i < ibufsize * 4; i++) { unsigned char byte = *bigptr++; *pixptr++ = (byte & 128) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 64) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 32) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 16) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 8) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 4) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 2) ? liveRGBA : deadRGBA; *pixptr++ = (byte & 1) ? liveRGBA : deadRGBA; } } if (renderer->justState()) renderer->stateblit(rx, ry, rw, rh, pixbuf) ; else renderer->pixblit(rx, ry, rw, rh, pixbuf, pmag); memset(bigbuf, 0, sizeof(ibigbuf)) ; } static int minlevel; /* * We cheat for now; we assume we can use 32-bit ints. We can below * a certain level; we'll deal with higher levels later. */ void qlifealgo::BlitCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) { int i, xinc=0, yinc=0, ypos, x, yy; int liveseen = 0 ; if (xoff >= vieww || xoff + wd < 0 || yoff >= viewh || yoff + ht < 0) // no part of this supertile is visible return; if (p == nullroots[lev]) { return; } // do recursion until we get to level 2 (256x256 supertile) if (lev > 2) { if (lev & 1) { // odd level -- 8 subtiles are stacked horizontally xinc = wd = ht; } else { // even level -- 8 subtiles are stacked vertically yinc = ht = (ht >> 3); } for (i=0; i<8; i++) { BlitCells(p->d[i], xoff, yoff, wd, ht, lev-1); xoff += xinc; yoff += yinc; } return; } // walk a (probably) non-empty 256x256 supertile, finding all the 1 bits and // setting corresponding bits in the bitmap (bigbuf) liveseen = 0 ; ypos = yoff; // examine the 8 vertically stacked subtiles in this 256x256 supertile (at level 2) for (yy=0; yy<8; yy++) { if (p->d[yy] != nullroots[1] && ypos < viewh && ypos + 32 >= 0) { supertile *psub = p->d[yy]; x = xoff; // examine the 8 tiles in this 256x32 supertile (at level 1) for (i=0; i<8; i++) { if (psub->d[i] != nullroots[0] && x < vieww && x + 32 >= 0) { tile *t = (tile *)psub->d[i]; int j, k, y = ypos; // examine the 4 bricks in this 32x32 tile (at level 0) for (j=0; j<4; j++) { if (t->b[j] != emptybrick && y < viewh && y + 8 >= 0) { brick *b = t->b[j]; // examine the 8 slices (2 at a time) in the appropriate half-brick for (k=0; k<8; k+=2) { unsigned int v1 = b->d[k+kadd]; unsigned int v2 = b->d[k+kadd+1]; if (v1|v2) { // do an 8x8 set of bits (2 adjacent slices) int xd = (i<<2)+(k>>1); int yd = (7 - yy) << 10; // 1024 bytes in 256x32 supertile unsigned char *p = bigbuf + yd + xd + ((3 - j) << 8); unsigned int v3 = (((v1 & 0x0f0f0f0f) << 4) | (v2 & 0x0f0f0f0f)); v2 = ((v1 & 0xf0f0f0f0) | ((v2 >> 4) & 0x0f0f0f0f)); *p = (unsigned char)v3; p[32] = (unsigned char)v2; p[64] = (unsigned char)(v3 >> 8); p[96] = (unsigned char)(v2 >> 8); p[128] = (unsigned char)(v3 >> 16); p[160] = (unsigned char)(v2 >> 16); p[192] = (unsigned char)(v3 >> 24); p[224] = (unsigned char)(v2 >> 24); liveseen |= (1 << yy) ; } } } y += 8; // down to next brick } } x += 32; // across to next tile } } ypos += 32; // down to next subtile } if (liveseen == 0) { return; // no live cells seen } // performance: if we want, liveseen now contains eight bits // corresponding to whether those respective 256x32 rectangles // contain set pixels or not. We should trim the bitmap // to only render those portions that need to be rendered // (using this information). -tom // // draw the non-empty bitmap, scaling up if pmag > 1 renderbm(xoff, yoff) ; } // This pattern drawing routine is used when mag > 0. // We go down to a level where what we're going to draw maps to one // of 256x256, 128x128, or 64x64. // // We no longer rely on popcount having been called; instead we invoke // the popcount child if needed. void qlifealgo::ShrinkCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) { int i ; if (lev >= bmlev) { if (xoff >= vieww || xoff + wd < 0 || yoff >= viewh || yoff + ht < 0) // no part of this supertile/tile is visible return ; if (p == nullroots[lev]) { return ; } if (lev == bmlev) { bmleft = xoff ; bmtop = yoff ; } } else { if (p == nullroots[lev]) return ; } int bminc = -1 << (logshbmsize-3) ; unsigned char *bm = bigbuf + (((shbmsize-1)-yoff+bmtop) << (logshbmsize-3)) + ((xoff-bmleft) >> 3) ; int bit = 128 >> ((xoff-bmleft) & 7) ; // do recursion until we get to minimum level (which depends on mag) if (lev > minlevel) { int xinc = 0, yinc = 0 ; if (lev & 1) { // odd level -- 8 subtiles are stacked horizontally xinc = wd ; wd = ht ; } else { // even level -- 8 subtiles are stacked vertically yinc = ht ; ht = (ht >> 3); } int xxinc = 0 ; int yyinc = 0 ; if (yinc <= 8 && xinc == 0) { // This is a case where we need to traverse multiple nodes for a // single pixel. This can be really slow, especially if we have // to examine 4x4=16 nodes just for a single pixel! To help // mitigate that, we special-case this and do the entire square, // tracking which pixels are set and not traversing when we // would set a pixel again. xinc = yinc ; int sh = 0 ; if (xinc == 8) sh = 0 ; else if (xinc == 4) sh = 1 ; else if (xinc == 2) sh = 2 ; for (i=0; i<8; i++) { if (p->d[i] != nullroots[lev-1]) { supertile *pp = p->d[i] ; int bbit = bit ; for (int j=0; j<8; j++) { if (pp->d[j] != nullroots[lev-2]) { if (0 == (*bm & bbit)) { supertile *ppp = pp->d[j] ; if (lev > 2) { if ( ppp->pop[oddgen] != 0 ) *bm |= bbit ; } else { tile *t = (tile *)ppp ; if (t->flags & quickb) *bm |= bbit ; } } } if ((j ^ (j + 1)) >> sh) bbit >>= 1 ; } } if ((i ^ (i + 1)) >> sh) bm += bminc ; } return ; } else { for (i=0; i<8; i++) { ShrinkCells(p->d[i], xoff + (xxinc >> 3), yoff + (yyinc >> 3), wd, ht, lev-1); xxinc += xinc ; yyinc += yinc ; } if (lev == bmlev) renderbm(bmleft, bmtop, shbmsize, shbmsize) ; } } else if (mag > 4) { if (lev > 0) { // mag >= 8 if ( p->pop[oddgen] != 0 ) *bm |= bit ; } else { // mag = 5..7 tile *t = (tile *)p; if (t->flags & quickb) *bm |= bit ; } } else { switch (mag) { case 4: { // shrink 32x32 tile to 2x2 pixels tile *t = (tile *)p; if ((t->b[0] != emptybrick || t->b[1] != emptybrick) ) { brick *bt = t->b[0]; brick *bb = t->b[1]; // examine the top left 16x16 cells if ( bt->d[kadd+0] | bt->d[kadd+1] | bt->d[kadd+2] | bt->d[kadd+3] | bb->d[kadd+0] | bb->d[kadd+1] | bb->d[kadd+2] | bb->d[kadd+3] ) // shrink 16x16 cells to 1 pixel *bm |= bit ; // examine the top right 16x16 cells if ( bt->d[kadd+4] | bt->d[kadd+5] | bt->d[kadd+6] | bt->d[kadd+7] | bb->d[kadd+4] | bb->d[kadd+5] | bb->d[kadd+6] | bb->d[kadd+7] ) // shrink 16x16 cells to 1 pixel *bm |= bit >> 1 ; } bm += bminc ; if (t->b[2] != emptybrick || t->b[3] != emptybrick) { brick *bt = t->b[2]; brick *bb = t->b[3]; // examine the bottom left 16x16 cells if ( bt->d[kadd+0] | bt->d[kadd+1] | bt->d[kadd+2] | bt->d[kadd+3] | bb->d[kadd+0] | bb->d[kadd+1] | bb->d[kadd+2] | bb->d[kadd+3] ) // shrink 16x16 cells to 1 pixel *bm |= bit ; // examine the bottom right 16x16 cells if ( bt->d[kadd+4] | bt->d[kadd+5] | bt->d[kadd+6] | bt->d[kadd+7] | bb->d[kadd+4] | bb->d[kadd+5] | bb->d[kadd+6] | bb->d[kadd+7] ) // shrink 16x16 cells to 1 pixel *bm |= bit >> 1 ; } } break; case 3: { // mag = 3 so shrink 32x32 tile to 4x4 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; // examine the 8 slices (2 at a time) in the appropriate half-brick int bbit = bit; for (k=0; k<8; k += 2) { if ( (b->d[k+kadd] | b->d[k+kadd+1]) ) *bm |= bbit ; bbit >>= 1 ; } } bm += bminc ; } } break; case 2: { // mag = 2 so shrink 32x32 tile to 8x8 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; bit = 128 ; // examine the 8 slices in the appropriate half-brick for (k=0; k<8; k++) { unsigned int s = b->d[k+kadd]; // s represents a 4x8 slice so examine top and bottom halves if (s) { if (s & 0xFFFF0000) *bm |= bit ; if (s & 0x0000FFFF) bm[bminc] |= bit ; } bit >>= 1 ; } } bm += 2 * bminc ; } } break; case 1: { // mag = 1 so shrink 32x32 tile to 16x16 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile unsigned char *bmm = bm ; for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; bit = 128 ; // examine the 8 slices in the appropriate half-brick for (k=0; k<8; k++) { unsigned int s = b->d[k+kadd]; if (s) { // s is a non-empty 4x8 slice so shrink each 2x2 section to 1 pixel if (s & 0xCC000000) *bmm |= bit ; if (s & 0x00CC0000) bmm[bminc] |= bit ; if (s & 0x0000CC00) bmm[bminc+bminc] |= bit ; if (s & 0x000000CC) bmm[bminc+bminc+bminc] |= bit ; bit >>= 1 ; if (s & 0x33000000) *bmm |= bit ; if (s & 0x00330000) bmm[bminc] |= bit ; if (s & 0x00003300) bmm[bminc+bminc] |= bit ; if (s & 0x00000033) bmm[bminc+bminc+bminc] |= bit ; bit >>= 1 ; } else { bit >>= 2 ; } if (bit < 1) { bmm++ ; bit = 128 ; } } bmm -= 2 ; } bmm += 4 * bminc ; } } break; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void qlifealgo::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; coor.first -= bmin ; coor.second -= bmin ; if (oddgen) { coor.first -= 1 ; coor.second -= 1 ; } int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } void qlifealgo::draw(viewport &viewarg, liferender &renderarg) { memset(bigbuf, 0, sizeof(ibigbuf)) ; renderer = &renderarg ; if (!renderer->justState()) { // AKT: get cell colors and alpha values for dead and live pixels unsigned char *r, *g, *b; renderer->getcolors(&r, &g, &b, &deada, &livea); deadr = r[0]; deadg = g[0]; deadb = b[0]; liver = r[1]; liveg = g[1]; liveb = b[1]; // create RGBA live color unsigned char *colptr = (unsigned char *)&liveRGBA; *colptr++ = liver; *colptr++ = liveg; *colptr++ = liveb; *colptr++ = livea; // create RGBA dead color colptr = (unsigned char *)&deadRGBA; *colptr++ = deadr; *colptr++ = deadg; *colptr++ = deadb; *colptr++ = deada; } view = &viewarg ; uvieww = view->getwidth() ; uviewh = view->getheight() ; oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; int xoff, yoff ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag-1) ; } else { mag = (-view->getmag()) ; // cheat for now since unzoom is broken pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } if (root == nullroots[rootlev]) { renderer = 0 ; view = 0 ; return ; } int d = 5 + (rootlev + 1) / 2 * 3 ; fill_ll(d) ; int maxd = vieww ; supertile *sw = root, *nw = nullroots[rootlev], *ne = nullroots[rootlev], *se = nullroots[rootlev] ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ int i; for (i=llbits-1; i>=d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { renderer = 0 ; view = 0 ; return ; } } /* Find the lowest four we need to examine */ int curlev = rootlev ; while (d > 8 && d - mag > 2 && (d - mag > 28 || (1 << (d - mag)) > 32 * maxd)) { // d is 5 + 3 * i for some positive i llx = (llx << 3) + (llxb[d-1] << 2) + (llxb[d-2] << 1) + llxb[d-3] ; lly = (lly << 3) + (llyb[d-1] << 2) + (llyb[d-2] << 1) + llyb[d-3] ; int xp = llx ; if (xp < 0) xp = 0 ; else if (xp > 7) xp = 7 ; int yp = lly ; if (yp < 0) yp = 0 ; else if (yp > 7) yp = 7 ; if (xp == 7) { if (yp == 7) { ne = ne->d[0]->d[0] ; se = se->d[7]->d[0] ; nw = nw->d[0]->d[7] ; sw = sw->d[7]->d[7] ; } else { ne = se->d[yp+1]->d[0] ; se = se->d[yp]->d[0] ; nw = sw->d[yp+1]->d[7] ; sw = sw->d[yp]->d[7] ; } } else { if (yp == 7) { ne = nw->d[0]->d[xp+1] ; se = sw->d[7]->d[xp+1] ; nw = nw->d[0]->d[xp] ; sw = sw->d[7]->d[xp] ; } else { ne = sw->d[yp+1]->d[xp+1] ; se = sw->d[yp]->d[xp+1] ; nw = sw->d[yp+1]->d[xp] ; sw = sw->d[yp]->d[xp] ; } } llx -= xp ; lly -= yp ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { renderer = 0 ; view = 0 ; return ; } d -= 3 ; curlev -= 2 ; } find_set_bits(nw, curlev, oddgen) ; find_set_bits(ne, curlev, oddgen) ; find_set_bits(sw, curlev, oddgen) ; find_set_bits(se, curlev, oddgen) ; // getPopulation() ; /* At this point we know we can use 32-bit arithmetic. */ for (i=d-1; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* now, we have four nodes to draw. the ll point in screen coordinates is given by llx/lly. the ur point in screen coordinates is given by that plus 2 << (d-mag). */ xoff = -llx ; yoff = -lly ; int wd = 2 ; if (d >= mag) wd = 2 << (d-mag) ; int yoffuht = yoff + wd ; int xoffuwd = xoff + wd ; if (yoff >= viewh || xoff >= vieww || yoffuht < 0 || xoffuwd < 0) { renderer = 0 ; view = 0 ; return ; } int levsize = wd / 2 ; // do recursive drawing quickb = 0xfff << (8 + oddgen * 12) ; if (mag > 0) { bmlev = (1 + mag / 3) * 2 ; logshbmsize = 8 - (mag % 3) ; shbmsize = 1 << logshbmsize ; if (mag < 5) { // recurse down to 32x32 tiles minlevel = 0; } else { // if mag = 5..7 minlevel = 0 (32x32 tiles) // if mag = 8..10 minlevel = 2 (256x256 supertiles) // if mag = 11..13 minlevel = 4 (2048x2048 supertiles) etc... minlevel = ((mag - 5) / 3) * 2; } bmleft = xoff ; bmtop = yoff ; ShrinkCells(sw, xoff, yoff, levsize, levsize, curlev); ShrinkCells(se, xoff+levsize, yoff, levsize, levsize, curlev); ShrinkCells(nw, xoff, yoff+levsize, levsize, levsize, curlev); ShrinkCells(ne, xoff+levsize, yoff+levsize, levsize, levsize, curlev); if (bmlev > curlev) renderbm(bmleft, bmtop, shbmsize, shbmsize) ; } else { // recurse down to 256x256 supertiles and use bitmap blitting BlitCells(sw, xoff, yoff, levsize, levsize, curlev); BlitCells(se, xoff+levsize, yoff, levsize, levsize, curlev); BlitCells(nw, xoff, yoff+levsize, levsize, levsize, curlev); BlitCells(ne, xoff+levsize, yoff+levsize, levsize, levsize, curlev); } renderer = 0 ; view = 0 ; } /** * Find the subsupertiles with the smallest indices. */ int qlifealgo::lowsub(vector &src, vector &dst, int lev) { int lowlev = 7 ; dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; jd[j] != z && (p->d[j]->pop[oddgen])) { lowlev = j ; dst.clear() ; } if (p->d[lowlev] != z && (p->d[lowlev]->pop[oddgen])) dst.push_back(p->d[lowlev]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; jd[j] != z && (((tile *)(p->d[j]))->flags & quickb)) { lowlev = j ; dst.clear() ; } if (p->d[lowlev] != z && (((tile *)(p->d[lowlev]))->flags & quickb)) dst.push_back(p->d[lowlev]) ; } } return lowlev ; } /** * Find the subsupertiles with the highest indices. */ int qlifealgo::highsub(vector &src, vector &dst, int lev) { int highlev = 0 ; dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=7; j>highlev; j--) if (p->d[j] != z && (p->d[j]->pop[oddgen])) { highlev = j ; dst.clear() ; } if (p->d[highlev] != z && (p->d[highlev]->pop[oddgen])) dst.push_back(p->d[highlev]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=7; j>highlev; j--) if (p->d[j] != z && (((tile *)(p->d[j]))->flags & quickb)) { highlev = j ; dst.clear() ; } if (p->d[highlev] != z && (((tile *)(p->d[highlev]))->flags & quickb)) dst.push_back(p->d[highlev]) ; } } return highlev ; } /** * Find all nonzero sub-supertiles. */ void qlifealgo::allsub(vector &src, vector &dst, int lev) { dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; j<8; j++) if (p->d[j] != z && (p->d[j]->pop[oddgen])) dst.push_back(p->d[j]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; j<8; j++) if (p->d[j] != z && (((tile *)(p->d[j]))->flags & quickb)) dst.push_back(p->d[j]) ; } } } int qlifealgo::gethbitsfromleaves(vector v) { int h[8] ; int i; for (i=0; i<8; i++) h[i] = 0 ; for (i=0; i<(int)v.size(); i++) { tile *p = (tile *)v[i] ; for (int j=0; j<4; j++) if (p->b[j] != emptybrick) for (int k=0; k<8; k++) h[k] |= p->b[j]->d[k+kadd] ; } int r = 0 ; for (i=0; i<8; i++) { int v = h[i] ; v |= (v >> 16) ; v |= (v >> 8) ; v |= (v >> 4) ; r = (r << 4) | (v & 15) ; } return r ; } int qlifealgo::getvbitsfromleaves(vector vec) { int v[4] ; int i; for (i=0; i<4; i++) v[i] = 0 ; for (i=0; i<(int)vec.size(); i++) { tile *p = (tile *)vec[i] ; for (int j=0; j<4; j++) if (p->b[j] != emptybrick) for (int k=0; k<8; k++) v[j] |= p->b[j]->d[k+kadd] ; } int r = 0 ; for (i=3; i>=0; i--) { int vv = v[i] ; for (int j=0; j<8; j++) { r += r ; if (vv & (0xf << (4 * j))) r++ ; } } return r ; } void qlifealgo::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // AKT: following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges bigint xmin = 0 ; bigint xmax = 1 ; bigint ymin = 0 ; bigint ymax = 1 ; getPopulation() ; // make sure pop values are valid oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; quickb = 0xfff << (8 + oddgen * 12) ; int currdepth = rootlev ; if (root == nullroots[currdepth] || root->pop[oddgen] == 0) { // AKT: return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; int bitval = (currdepth + 1) / 2 * 3 + 5 ; while (bitval > 0) { if (bitval == 5) { // we have leaf nodes; turn them into bitmasks topbm = getvbitsfromleaves(top) ; bottombm = getvbitsfromleaves(bottom) ; leftbm = gethbitsfromleaves(left) ; rightbm = gethbitsfromleaves(right) ; } if (bitval <= 5) { int sz = 1 << bitval ; int masklo = (1 << (sz >> 1)) - 1 ; int maskhi = ~masklo ; ymax += ymax ; xmax += xmax ; ymin += ymin ; xmin += xmin ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-1) ; } else { topbm = (topbm >> (sz >> 1)) & masklo ; } if ((bottombm & masklo) == 0) { ymin.add_smallint(1) ; bottombm = (bottombm >> (sz >> 1)) & masklo ; } if ((rightbm & masklo) == 0) { xmax.add_smallint(-1) ; rightbm = (rightbm >> (sz >> 1)) & masklo ; } if ((leftbm & maskhi) == 0) { xmin.add_smallint(1) ; } else { leftbm = (leftbm >> (sz >> 1)) & masklo ; } bitval-- ; } else { vector newv ; int outer = highsub(top, newv, currdepth) ; allsub(newv, top, currdepth-1) ; ymax <<= 3 ; ymax -= (7 - outer) ; outer = lowsub(bottom, newv, currdepth) ; allsub(newv, bottom, currdepth-1) ; ymin <<= 3 ; ymin += outer ; allsub(left, newv, currdepth) ; outer = lowsub(newv, left, currdepth-1) ; xmin <<= 3 ; xmin += outer ; allsub(right, newv, currdepth) ; outer = highsub(newv, right, currdepth-1) ; xmax <<= 3 ; xmax -= (7-outer) ; currdepth -= 2 ; bitval -= 3 ; } } if (bitval > 0) { xmin <<= bitval ; ymin <<= bitval ; xmax <<= bitval ; ymax <<= bitval ; } if (oddgen) { xmin += 1 ; ymin += 1 ; xmax += 1 ; ymax += 1 ; } xmin += bmin ; ymin += bmin ; xmax += bmin ; ymax += bmin ; ymax -= 1 ; xmax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void qlifealgo::fit(viewport &view, int force) { bigint xmin = 0 ; bigint xmax = 1 ; bigint ymin = 0 ; bigint ymax = 1 ; getPopulation() ; // make sure pop values are valid oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; quickb = 0xfff << (8 + oddgen * 12) ; int xgoal = view.getwidth() ; int ygoal = view.getheight() ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 1 ; int ysize = 1 ; int currdepth = rootlev ; if (root == nullroots[currdepth] || root->pop[oddgen] == 0) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; int bitval = (currdepth + 1) / 2 * 3 + 5 ; while (bitval > 0) { if (bitval == 5) { // we have leaf nodes; turn them into bitmasks topbm = getvbitsfromleaves(top) ; bottombm = getvbitsfromleaves(bottom) ; leftbm = gethbitsfromleaves(left) ; rightbm = gethbitsfromleaves(right) ; } if (bitval <= 5) { int sz = 1 << bitval ; int masklo = (1 << (sz >> 1)) - 1 ; int maskhi = ~masklo ; ymax += ymax ; xmax += xmax ; ymin += ymin ; xmin += xmin ; xsize <<= 1 ; ysize <<= 1 ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-1) ; ysize-- ; } else { topbm = (topbm >> (sz >> 1)) & masklo ; } if ((bottombm & masklo) == 0) { ymin.add_smallint(1) ; ysize-- ; bottombm = (bottombm >> (sz >> 1)) & masklo ; } if ((rightbm & masklo) == 0) { xmax.add_smallint(-1) ; xsize-- ; rightbm = (rightbm >> (sz >> 1)) & masklo ; } if ((leftbm & maskhi) == 0) { xmin.add_smallint(1) ; xsize-- ; } else { leftbm = (leftbm >> (sz >> 1)) & masklo ; } bitval-- ; } else { vector newv ; ysize <<= 3 ; int outer = highsub(top, newv, currdepth) ; allsub(newv, top, currdepth-1) ; ymax <<= 3 ; ymax -= (7 - outer) ; ysize -= (7 - outer) ; outer = lowsub(bottom, newv, currdepth) ; allsub(newv, bottom, currdepth-1) ; ymin <<= 3 ; ymin += outer ; ysize -= outer ; xsize <<= 3 ; allsub(left, newv, currdepth) ; outer = lowsub(newv, left, currdepth-1) ; xmin <<= 3 ; xmin += outer ; xsize -= outer ; allsub(right, newv, currdepth) ; outer = highsub(newv, right, currdepth-1) ; xmax <<= 3 ; xmax -= (7-outer) ; xsize -= (7-outer) ; currdepth -= 2 ; bitval -= 3 ; } if (xsize > xgoal || ysize > ygoal) break ; } if (bitval > 0) { xmin <<= bitval ; ymin <<= bitval ; xmax <<= bitval ; ymax <<= bitval ; } if (oddgen) { xmin += 1 ; ymin += 1 ; xmax += 1 ; ymax += 1 ; } xmin += bmin ; ymin += bmin ; xmax += bmin ; ymax += bmin ; ymax -= 1 ; xmax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } int mag = - bitval ; while (2 * xsize <= xgoal && 2 * ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } while (xsize > xgoal || ysize > ygoal) { mag-- ; xsize /= 2 ; ysize /= 2 ; } view.setpositionmag(xmin, xmax, ymin, ymax, mag) ; } /** * Fixed for qlife. */ void qlifealgo::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x -= oddgen ; x -= bmin ; x >>= -mag ; x <<= -mag ; x += bmin ; x += oddgen ; y -= 1 ; y += bmin ; y += oddgen ; y >>= -mag ; y <<= -mag ; y -= bmin ; y += 1 ; y -= oddgen ; } golly-3.3-src/gollybase/qlifealgo.cpp0000644000175000017500000011677713441044674014675 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /* * Inspired by Alan Hensel's Life applet and also by xlife. Tries to * improve the cache, TLB, and branching behavior for modern CPUs. */ #include "qlifealgo.h" #include "liferules.h" #include "util.h" #include #include #include #include using namespace std ; /* * The ai array is used to figure out the index number of the bit set in * the set [1, 2, 4, 8, 16, 32, 64, 128]. Also, for the value 0, it * returns the result 4, to eliminate a conditional in some obscure piece * of code. */ static unsigned char ai[129] ; /* * This define is the size of memory to ask for at one time. 8K is a good * size; we drop 16 bits because malloc overhead is probably near this. * * Values much smaller than this will be impacted by malloc overhead (both * speed and space); values much larger than this will occupy excessive * memory for small universes. */ #define MEMCHUNK (8192-16) /* * When we need a bunch more structures of a particular size, we call this. * This code allocates the memory, adds it to our universe memory allocated * list, tries to maximize the cache alignment of the structures, and then * links all the substructures together into a linked list which is then * returned. */ /* * This preprocessor directive is used to work around a bug in * register allocation when using function inlining (-O3 or * better) and gcc 3.4.2, which is very common having shipped with * Fedora Core 3. */ #ifdef __GNUC__ __attribute__((noinline)) #endif linkedmem *qlifealgo::filllist(int size) { usedmemory += MEMCHUNK ; if (maxmemory != 0 && usedmemory > maxmemory) lifefatal("exceeded user-specified memory limit") ; linkedmem *p, *safep, *r = (linkedmem *)calloc(MEMCHUNK, 1) ; int i = size & - size ; if (r == 0) lifefatal("No memory.") ; r->next = memused ; memused = r ; safep = p = (linkedmem *)((((g_uintptr_t)(r+1))+i-1)&-i) ; while (((g_uintptr_t)p) + 2 * size <= MEMCHUNK+(g_uintptr_t)r) { p->next = (linkedmem *)(size + (g_uintptr_t)p) ; p = (linkedmem *)(size + (g_uintptr_t)p) ; } return safep ; } #ifdef STATS static int bricks, tiles, supertiles, rcc, dq, ds, rccs, dqs, dss ; #define STAT(a) a #else #define STAT(a) #endif /* * If we need a new empty brick, we call this. This structure is guaranteed * to be all zeros. */ brick *qlifealgo::newbrick() { brick *r ; if (bricklist == 0) bricklist = filllist(sizeof(brick)) ; r = (brick *)(bricklist) ; bricklist = bricklist->next ; memset(r, 0, sizeof(brick)) ; STAT(bricks++) ; return r ; } /* * If we need a new tile, we call this. The structure is also initialized * appropriately, with all the pointers pointing to the empty brick. */ tile *qlifealgo::newtile() { tile *r ; if (tilelist == 0) tilelist = filllist(sizeof(tile)) ; r = (tile *)(tilelist) ; tilelist = tilelist->next ; r->b[0] = r->b[1] = r->b[2] = r->b[3] = emptybrick ; r->flags = -1 ; STAT(tiles++) ; return r ; } /* * Finally, a new supertile is provided by this routine. It initializes * all the subtiles to point to the next level down's empty tile. */ supertile *qlifealgo::newsupertile(int lev) { supertile *r ; if (supertilelist == 0) supertilelist = filllist(sizeof(supertile)) ; r = (supertile *)supertilelist ; supertilelist = supertilelist->next ; r->d[0] = r->d[1] = r->d[2] = r->d[3] = r->d[4] = r->d[5] = r->d[6] = r->d[7] = nullroots[lev-1] ; STAT(supertiles++) ; return r ; } /* * This short little subroutine plays a very important role. It takes bits * set up according to the c01 or c10 fields of supertiles, and translates * these bits into the impact on the next level up. Essentially, it swaps * the parallel bits (bits 9 through 16), any of them set, with the edge * bit (bit 8), in a way that requires no conditional branches. On a * slower older processor without large branch penalties, it might be * faster to use a conditional variation that executes fewer instructions, * but actually this code is not totally performance critical. */ static int upchanging(int x) { int a = (x & 0x1feff) + 0x1feff ; return ((a >> 8) & 1) | ((a >> 16) & 2) | ((x << 1) & 0x200) | ((x >> 7) & 0x400) ; } /* * If it is determined that the universe is not large enough, this * subroutine adds another level to it, expanding it by a factor of 8 * in one dimension, depending on whether the level is even or odd. * * It also allocates a new emptytile at the appropriate level. * * The old root is always placed at position 4. This allows expansion * in both positive and negative directions. * * The sequence of sizes is as follows: * * 0 31 * -128 127 * -1,152 895 * -9,344 7,039 * -74,880 56,191 * -599,168 449,407 * -4,793,472 3,595,135 * -38,347,904 28,760,959 * -306,783,360 230,087,551 * INT_MIN 1,840,700,287 * INT_MIN INT_MAX * * Remember these are only relevant for set() calls and have nothing * to do with rendering or generation. */ void qlifealgo::uproot() { if (min < -100000000) min = INT_MIN ; else min = 8 * min - 128 ; if (max > 500000000) max = INT_MAX ; else max = 8 * max - 121 ; bmin <<= 3 ; bmin -= 128 ; bmax <<= 3 ; bmax -= 121 ; minlow32 = 8 * minlow32 - 4 ; if (rootlev >= 38) lifefatal("internal: push too deep for qlifealgo") ; for (int i=0; i<2; i++) { supertile *oroot = root ; rootlev++ ; root = newsupertile(rootlev) ; if (rootlev > 1) root->flags = 0xf0000000 | (upchanging(oroot->flags) << (3 + (generation.odd()))) ; root->d[4] = oroot ; if (oroot != nullroot) { nullroots[rootlev] = nullroot = newsupertile(rootlev) ; } else { nullroots[rootlev] = nullroot = root ; } } // Need to clear this because we don't have valid population values // in the new root. popValid = 0 ; } /* * This subroutine allocates a new empty universe. The universe starts * out as a 256x256 universe. */ qlifealgo::qlifealgo() { int test = (INT_MAX != 0x7fffffff) ; if (test) lifefatal("bad platform for this program") ; memused = 0 ; maxmemory = 0 ; clearall() ; } /* * Clear everything. This one also frees memory. */ static int bc[256] ; // popcount void qlifealgo::clearall() { poller->bailIfCalculating() ; while (memused) { linkedmem *nu = memused->next ; free(memused) ; memused = nu ; } generation = 0 ; increment = 1 ; tilelist = 0 ; supertilelist = 0 ; bricklist = 0 ; rootlev = 0 ; cleandowncounter = 63 ; usedmemory = 0 ; deltaforward = 0 ; ai[0] = 4 ; ai[1] = 0 ; ai[2] = 1 ; ai[4] = 2 ; ai[8] = 3 ; ai[16] = 4 ; ai[32] = 5 ; ai[64] = 6 ; ai[128] = 7 ; minlow32 = min = 0 ; max = 31 ; bmin = 0 ; bmax = 31 ; emptybrick = newbrick() ; nullroots[0] = nullroot = root = (supertile *)(emptytile = newtile()) ; uproot() ; popValid = 0 ; llxb = 0 ; llyb = 0 ; llbits = 0 ; llsize = 0 ; if (bc[255] == 0) for (int i=1; i<256; i++) bc[i] = bc[i & (i-1)] + 1 ; } /* * This subroutine frees a universe. */ qlifealgo::~qlifealgo() { while (memused) { linkedmem *nu = memused->next ; free(memused) ; memused = nu ; } } /* * Set the max memory */ void qlifealgo::setMaxMemory(int newmemlimit) { // AKT: allow setting maxmemory to 0 if (newmemlimit == 0) { maxmemory = 0 ; return; } if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (usedmemory > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmemory = newlimit ; } /* * Finally, our first generation subroutine! This one handles supertiles * for even to odd generation (0->1). What is passed in is the universe * itself, the tile (this) to focus on, its three neighbor tiles (the * one `parallel' to it [by the way the subtiles are stacked], the one * past it, and the corner one. * * The way we walk down the tree in this subroutine is one of the major * keys to cache and TLB performance. We walk the universe in a * spatially local way, always doing an entire 32x32 tile before * moving on, always doing a 256x32 supertile before moving on, always * doing a 256x256 supertile, etc. That is, if we need to access a * particular brick four times in recomputing four bricks, chances are * good that those four times will occur closely in time since we do * spatially adjacent bricks near each other. * * Another trick is to do the universe from bottom to top in phase 0->1 * and from top to bottom in phase 1->0; this also helps cut down on * those cache misses. */ int qlifealgo::doquad01(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) { /* * First we figure out which subtiles we need to recalculate. There will * always be at least one if we got into this subroutine (except for the * case of a static universe and at the root level). To do this, we * use the edge bits from the parallel supertile, and one bit each from * the other two neighbor tiles, blending them into a single 8-bit * recalculate int. * * Note that the parallel and corner have already been recomputed so * their changing bits are shifted up 10 positions in c. */ poller->poll() ; int changing = (zis->flags | (par->flags >> 19) | (((edge->flags >> 18) | (cor->flags >> 27)) & 1)) & 0xff ; int x, b, nchanging = (zis->flags & 0x3ff00) << 10 ; supertile *p, *pf, *pu, *pfu ; STAT(ds++) ; /* * Only if the first subtile needs to be recomputed do we actually need to * `visit' the edge and corner neighbors. We always keep track of the * subtiles one level down. */ if (changing & 1) { x = 7 ; b = 1 ; pf = edge->d[0] ; pfu = cor->d[0] ; } else { /* * Otherwise, we compute which tile we need to examine first with the help * of the ai array. */ b = (changing & - changing) ; x = 7 - ai[b] ; pf = zis->d[x + 1] ; pfu = par->d[x + 1] ; } for (;;) { p = zis->d[x] ; pu = par->d[x] ; /* * Do we need to recompute this subtile? */ if (changing & b) { /* * If so, is it the canonical empty supertile for this level? If so, * allocate a new empty supertile and set the void bits appropriately. */ if (zis->d[x] == nullroots[lev-1]) p = zis->d[x] = (lev == 1 ? (supertile *)newtile() : newsupertile(lev-1)) ; /* * If it's level 1, call the tile handler, else call the next level down of * the supertile handler. The return value is the changing indicators that * should be propogated up. */ nchanging |= ((lev == 1) ? p01((tile *)p, (tile *)pf, (tile *)pu, (tile *)pfu) : doquad01(p, pu, pf, pfu, lev-1)) << x ; changing -= b ; } else if (changing == 0) break ; b <<= 1 ; x-- ; pfu = pu ; pf = p ; } zis->flags = nchanging | 0xf0000000 ; return upchanging(nchanging) ; } /* * This is for odd to even generations, and the documentation is pretty * much the same as for the previous subroutine. */ int qlifealgo::doquad10(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) { poller->poll() ; int changing = (zis->flags | (par->flags >> 19) | (((edge->flags >> 18) | (cor->flags >> 27)) & 1)) & 0xff ; int x, b, nchanging = (zis->flags & 0x3ff00) << 10 ; supertile *p, *pf, *pu, *pfu ; STAT(ds++) ; if (changing & 1) { x = 0 ; b = 1 ; pf = edge->d[7] ; pfu = cor->d[7] ; } else { b = (changing & - changing) ; x = ai[b] ; pf = zis->d[x - 1] ; pfu = par->d[x - 1] ; } for (;;) { p = zis->d[x] ; pu = par->d[x] ; if (changing & b) { if (zis->d[x] == nullroots[lev-1]) p = zis->d[x] = (lev == 1 ? (supertile *)newtile() : newsupertile(lev-1)) ; nchanging |= ((lev == 1) ? p10((tile *)pfu, (tile *)pu, (tile *)pf, (tile *)p) : doquad10(p, pu, pf, pfu, lev-1)) << (7-x) ; changing -= b ; } else if (changing == 0) break ; b <<= 1 ; x++ ; pfu = pu ; pf = p ; } zis->flags = nchanging | 0xf0000000 ; return upchanging(nchanging) ; } /* * This is our monster subroutine that, with its mirror below, accounts for * about 90% of the runtime. It handles recomputation for a 32x32 tile. * Passed in are the neighbor tiles: pr (to the right), pd (down), and * prd (down and to the right). */ int qlifealgo::p01(tile *p, tile *pr, tile *pd, tile *prd) { brick *db = pd->b[0], *rdb = prd->b[0] ; /* * Do we need to recompute the fourth brick? This happens here because its * the only place we need to pull in changing from the down and corner * neighbor. */ int i, recomp = (p->c[4] | pd->c[0] | (pr->c[4] >> 9) | (prd->c[0] >> 8)) & 0xff ; STAT(dq++) ; p->c[5] = 0 ; p->flags |= 0xfff00000 ; /* * For each brick . . . */ for (i=3; i>=0; i--) { brick *b = p->b[i], *rb = pr->b[i] ; /* * Do we need to recompute? */ if (recomp) { unsigned int traildata, trailunderdata ; int j, cdelta = 0, maska, maskb, maskprev = 0 ; /* * If so, set the dirty bit. Also, if this brick is the canonical empty * brick, get a new one. */ p->flags |= 1 << i ; if (b == emptybrick) p->b[i] = b = newbrick() ; /* * If we need to recompute the end slice, now is a good time to get the * right neighbor's data. */ if (recomp & 1) { j = 7 ; traildata = rb->d[0] ; trailunderdata = rdb->d[0] ; } else { /* * Otherwise we use the ai[] array to figure out where to begin in this * brick. */ j = ai[recomp & - recomp] ; recomp >>= j ; j = 7 - j ; traildata = b->d[j+1] ; trailunderdata = db->d[j+1] ; } trailunderdata = (traildata << 8) + (trailunderdata >> 24) ; for (;;) { /* * At all times here, we have traildata (the data from the slice to the * right) and trailunderdata (24 bits of traildata and eight bits from * the slice under and to the right). * * Do we need to recompute this slice? */ if (recomp & 1) { /* * Our main recompute chunk recomputes a single slice. */ unsigned int zisdata = b->d[j] ; unsigned int underdata = (zisdata << 8) + (db->d[j] >> 24) ; unsigned int otherdata = ((zisdata << 2) & 0xcccccccc) + ((traildata >> 2) & 0x33333333) ; unsigned int otherunderdata = ((underdata << 2) & 0xcccccccc) + ((trailunderdata >> 2) & 0x33333333) ; int newv = (ruletable[zisdata >> 16] << 26) + (ruletable[underdata >> 16] << 18) + (ruletable[zisdata & 0xffff] << 10) + (ruletable[underdata & 0xffff] << 2) + (ruletable[otherdata >> 16] << 24) + (ruletable[otherunderdata >> 16] << 16) + (ruletable[otherdata & 0xffff] << 8) + ruletable[otherunderdata & 0xffff] ; /* * Has anything changed? * Keep track of what has changed in the entire cell, the rightmost * two columns, the lowest two rows, and the lowest rightmost 2x2 cell, into * the maskprev int. Do all of this without conditionals. */ int delta = (b->d[j + 8] ^ newv) | deltaforward ; STAT(rcc++) ; b->d[j + 8] = newv ; maska = cdelta | (delta & 0x33333333) ; maskb = maska | -maska ; maskprev = (maskprev << 1) | ((maskb >> 9) & 0x400000) | (maskb & 0x80) ; cdelta = delta ; traildata = zisdata ; trailunderdata = underdata ; } else { /* * No need to recompute? Well, maintain our necessary invariants and bail * if we're done. */ maskb = cdelta | -cdelta ; maskprev = (maskprev << 1) | ((maskb >> 9) & 0x400000) | (maskb & 0x80) ; if (recomp == 0) break ; ; cdelta = 0 ; traildata = b->d[j] ; trailunderdata = (traildata << 8) + (db->d[j] >> 24) ; } recomp >>= 1 ; j-- ; } /* * Finally done with that brick! Update our changing for the next * call to p10, and or-in any changes to the lower two rows that we saw * into the next brick down's changing variable. */ p->c[i+2] |= (maskprev >> (6 - j)) & 0x1ff ; p->c[i+1] = (short)(((p->c[i+1] & 0x100) << 1) | (maskprev >> (21 - j))) ; } else p->c[i+1] = 0 ; /* * Calculate recomp for the next row down. */ recomp = (p->c[i] | (pr->c[i] >> 9)) & 0xff ; db = b ; rdb = rb ; } /* * Propogate the changing information for this tile to the supertile on * the next level up. */ recomp = p->c[5] ; i = recomp | p->c[0] | p->c[1] | p->c[2] | p->c[3] | p->c[4] ; if (recomp) return 0x201 | ((recomp & 0x100) << 2) | ((i & 0x100) >> 7) ; else return i ? ((i & 0x100) >> 7) | 1 : 0 ; } /* * This subroutine is the mirror of the one above, used for odd to even * generations. */ int qlifealgo::p10(tile *plu, tile *pu, tile *pl, tile *p) { brick *ub = pu->b[3], *lub = plu->b[3] ; int i, recomp = (p->c[1] | pu->c[5] | (pl->c[1] >> 9) | (plu->c[5] >> 8)) & 0xff ; STAT(dq++) ; p->c[0] = 0 ; p->flags |= 0x000fff00 ; for (i=0; i<=3; i++) { brick *b = p->b[i], *lb = pl->b[i] ; if (recomp) { int maska, maskprev = 0, j, cdelta = 0 ; unsigned int traildata, trailoverdata ; p->flags |= 1 << i ; if (b == emptybrick) p->b[i] = b = newbrick() ; if (recomp & 1) { j = 0 ; traildata = lb->d[15] ; trailoverdata = lub->d[15] ; } else { j = ai[recomp & - recomp] ; traildata = b->d[j+7] ; trailoverdata = ub->d[j+7] ; recomp >>= j ; } trailoverdata = (traildata >> 8) + (trailoverdata << 24) ; for (;;) { if (recomp & 1) { unsigned int zisdata = b->d[j + 8] ; unsigned int overdata = (zisdata >> 8) + (ub->d[j + 8] << 24) ; unsigned int otherdata = ((zisdata >> 2) & 0x33333333) + ((traildata << 2) & 0xcccccccc) ; unsigned int otheroverdata = ((overdata >> 2) & 0x33333333) + ((trailoverdata << 2) & 0xcccccccc) ; int newv = (ruletable[otheroverdata >> 16] << 26) + (ruletable[otherdata >> 16] << 18) + (ruletable[otheroverdata & 0xffff] << 10) + (ruletable[otherdata & 0xffff] << 2) + (ruletable[overdata >> 16] << 24) + (ruletable[zisdata >> 16] << 16) + (ruletable[overdata & 0xffff] << 8) + ruletable[zisdata & 0xffff] ; int delta = (b->d[j] ^ newv) | deltaforward ; STAT(rcc++) ; maska = cdelta | (delta & 0xcccccccc) ; maskprev = (maskprev << 1) | (((maska | - maska) >> 9) & 0x400000) | ((((maska >> 24) | 0x100) - 1) & 0x100) ; b->d[j] = newv ; cdelta = delta ; traildata = zisdata ; trailoverdata = overdata ; } else { maskprev = (maskprev << 1) | (((cdelta | - cdelta) >> 9) & 0x400000) | ((((cdelta >> 24) | 0x100) - 1) & 0x100) ; if (recomp == 0) break ; cdelta = 0 ; traildata = b->d[j + 8] ; trailoverdata = (traildata >> 8) + (ub->d[j + 8] << 24) ; } recomp >>= 1 ; j++ ; } p->c[i+1] = (short)(((p->c[i+1] & 0x100) << 1) | (maskprev >> (14 + j))) ; p->c[i] |= (maskprev >> j) & 0x1ff ; } else p->c[i+1] = 0 ; recomp = (p->c[i+2] | (pl->c[i+2] >> 9)) & 0xff ; ub = b ; lub = lb ; } recomp = p->c[0] ; i = recomp | p->c[1] | p->c[2] | p->c[3] | p->c[4] | p->c[5] ; if (recomp) return 0x201 | ((recomp & 0x100) << 2) | ((i & 0x100) >> 7) ; else return i ? ((i & 0x100) >> 7) | 1 : 0 ; } /** * Mark a node and its subnodes as changed. We really * only mark those nodes that have any cells set at all. * And we remove all empty nodes, to prevent quadratic * expansion if setrule() or something similar is called * too frequently. */ supertile *qlifealgo::markglobalchange(supertile *p, int lev, int &bits) { int i ; bits = 0 ; if (lev == 0) { tile *pp = (tile *)p ; if (pp != emptytile) { int s = 0 ; for (int i=0; i<4; i++) for (int j=0; j<16; j++) s |= pp->b[i]->d[j] ; if (s) { pp->c[0] = pp->c[5] = 0x1ff ; pp->c[1] = pp->c[2] = pp->c[3] = pp->c[4] = 0x3ff ; bits = 0x603 ; return p ; } bits = 0 ; for (int i=0; i<4; i++) if (pp->b[i] != emptybrick) { STAT(bricks--) ; ((linkedmem *)(pp->b[i]))->next = bricklist ; bricklist = (linkedmem *)(pp->b[i]) ; } STAT(tiles--) ; memset(pp, 0, sizeof(tile)) ; ((linkedmem *)pp)->next = tilelist ; tilelist = (linkedmem *)pp ; return (supertile *)emptytile ; } return p ; } else { if (p != nullroots[lev]) { int nchanging = 0 ; int nbits ; if (generation.odd()) { for (i=0; i<8; i++) { p->d[i] = markglobalchange(p->d[i], lev-1, nbits) ; nchanging |= nbits << i ; } } else { for (i=0; i<8; i++) { p->d[i] = markglobalchange(p->d[i], lev-1, nbits) ; nchanging |= nbits << (7-i) ; } } if (nchanging != 0 || p == root) { p->flags |= nchanging | 0xf0000000 ; bits = upchanging(nchanging) ; return p ; } else { STAT(supertiles--) ; memset(p, 0, sizeof(supertile)) ; ((linkedmem *)p)->next = supertilelist ; supertilelist = (linkedmem *)p ; return nullroots[lev] ; } } return p ; } } void qlifealgo::markglobalchange() { int bits = 0 ; markglobalchange(root, rootlev, bits) ; deltaforward = 0xffffffff ; } /* * This subroutine sets a bit at a particular location. * * We walk down the tree to the particular bit, setting changing flags as * we go. */ int qlifealgo::setcell(int x, int y, int newstate) { if (newstate & ~1) return -1 ; y = - y ; supertile *b ; tile *p ; int lev ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; int xc = x - (minlow32 << 5) ; int yc = y - (minlow32 << 5) ; if (root == nullroot) root = newsupertile(rootlev) ; b = root ; lev = rootlev ; while (lev > 0) { int i, d = 1 ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; s = (1 << (s + 5)) - 2 ; if ((xc & s) == ((odd) ? s : 0)) d += 2 ; if ((yc & s) == ((odd) ? s : 0)) d += d << 9 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; s = (1 << (s + 5)) - 2 ; if ((yc & s) == ((odd) ? s : 0)) d += 2 ; s |= s << 3 ; if ((xc & s) == ((odd) ? s : 0)) d += d << 9 ; } if (odd) b->flags |= (d << i) | 0xf0000000 ; else b->flags |= (d << (7 - i)) | 0xf0000000 ; if (b->d[i] == nullroots[lev-1]) b->d[i] = (lev==1 ? (supertile *)newtile() : newsupertile(lev-1)) ; lev -= 1 ; b = b->d[i] ; } x &= 31 ; y &= 31 ; p = (tile *)b ; if (p->b[(y >> 3) & 0x3] == emptybrick) p->b[(y >> 3) & 0x3] = newbrick() ; if (odd) { int mor = ((x & 2) ? 3 : 1) << ((x >> 2) & 0x7) ; p->c[((y >> 3) & 0x3) + 1] |= mor ; p->flags = -1 ; if ((y & 6) == 6) p->c[((y >> 3) & 0x3) + 2] |= mor ; if (newstate) p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] |= (1 << (31 - (y & 7) * 4 - (x & 3))) ; else p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] &= ~(1 << (31 - (y & 7) * 4 - (x & 3))) ; } else { int mor = ((x & 2) ? 1 : 3) << (7 - ((x >> 2) & 0x7)) ; p->c[((y >> 3) & 0x3) + 1] |= mor ; p->flags = -1 ; if ((y & 6) == 0) p->c[((y >> 3) & 0x3)] |= mor ; if (newstate) p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] |= (1 << (31 - (y & 7) * 4 - (x & 3))) ; else p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] &= ~(1 << (31 - (y & 7) * 4 - (x & 3))) ; } deltaforward = 0xffffffff ; return 0 ; } /* * This subroutine gets a bit at a particular location. */ int qlifealgo::getcell(int x, int y) { y = - y ; supertile *b ; tile *p ; int lev ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; if (x < min || x > max || y < min || y > max) return 0 ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; if (root == nullroot) return 0 ; b = root ; lev = rootlev ; while (lev > 0) { int i ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; } if (b->d[i] == nullroots[lev-1]) return 0 ; lev -= 1 ; b = b->d[i] ; } x &= 31 ; y &= 31 ; p = (tile *)b ; if (p->b[(y >> 3) & 0x3] == emptybrick) return 0 ; if (odd) { if (p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] & (1 << (31 - (y & 7) * 4 - (x & 3)))) return 1 ; else return 0 ; } else { if (p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] & (1 << (31 - (y & 7) * 4 - (x & 3)))) return 1 ; else return 0 ; } } /** * Similar but returns the distance to the next set cell horizontally. */ int qlifealgo::nextcell(int x, int y, int &v) { v = 1 ; y = - y ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; if (x > max || x < min || y < min || y > max) return -1 ; return nextcell(x, y, root, rootlev) ; } int qlifealgo::nextcell(int x, int y, supertile *n, int lev) { if (lev > 0) { if (n == nullroots[lev]) return -1 ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; int i ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; int r = 0 ; int off = (x & 31) + ((xdel & ((1 << s) - 1)) << 5) ; while (i < 8) { int t = nextcell(x, y, n->d[i], lev-1) ; if (t < 0) { r += (32 << s) - off ; x += (32 << s) - off ; off = 0 ; } else { return r + t ; } i++ ; } return -1 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; return nextcell(x, y, n->d[i], lev-1) ; } } x &= 31 ; y &= 31 ; tile *p = (tile *)n ; brick *br = (brick *)(p->b[(y>>3) & 3]) ; if (br == emptybrick) return -1 ; int i = ((x >> 2) & 7) ; int add = (generation.odd() ? 8 : 0) ; int sh = (7 - (y & 7)) * 4 ; int r = 0 ; x &= 3 ; int m = 15 >> x ; while (i < 8) { int t = (br->d[i+add] >> sh) & m ; if (t) { if (t & 8) return r - x ; if (t & 4) return r + 1 - x ; if (t & 2) return r + 2 - x ; return r + 3 - x ; } r += (4 - x) ; x = 0 ; m = 15 ; i++ ; } return -1 ; } /* * This subroutine calculates the population count of the universe. It * uses dirty bits number 1 and 2 of supertiles. */ G_INT64 qlifealgo::find_set_bits(supertile *p, int lev, int gm1) { G_INT64 pop = 0 ; int i, j, b ; if (lev == 0) { tile *pp = (tile *)p ; b = 8 + gm1 * 12 ; pop = (pp->flags >> b) & 0xfff ; if (pop > 0x800) { pop = 0 ; for (i=0; i<4; i++) { if (pp->b[i] != emptybrick) { for (j=0; j<8; j++) { #ifdef FASTPOPCOUNT pop += FASTPOPCOUNT(pp->b[i]->d[j+gm1*8]) ; #else int k = pp->b[i]->d[j+gm1*8] ; if (k) pop += bc[k & 255] + bc[(k >> 8) & 255] + bc[(k >> 16) & 255] + bc[(k >> 24) & 255] ; #endif } } } pp->flags = (long)((pp->flags & ~(0xfff << b)) | (pop << b)) ; } } else { if (p->flags & (0x20000000 << gm1)) { for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) pop += find_set_bits(p->d[i], lev-1, gm1) ; if (pop < 500000000) { p->pop[gm1] = (int)pop ; p->flags &= ~(0x20000000 << gm1) ; } else { p->pop[gm1] = 0xfffffff ; // placeholder; *some* bits are set } } else { pop = p->pop[gm1] ; } } return pop ; } /** * A variation that tries to quickly answer: *any* bits set? */ int qlifealgo::isEmpty(supertile *p, int lev, int gm1) { int i, j, k, b ; if (lev == 0) { tile *pp = (tile *)p ; b = 8 + gm1 * 12 ; int pop = (pp->flags >> b) & 0xfff ; if (pop > 0x800) { pop = 0 ; for (i=0; i<4; i++) { if (pp->b[i] != emptybrick) { for (j=0; j<8; j++) { k = pp->b[i]->d[j+gm1*8] ; if (k) return 0 ; } } } } return pop ? 0 : 1 ; } else { if (p->flags & (0x20000000 << gm1)) { for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) if (!isEmpty(p->d[i], lev-1, gm1)) return 0 ; return 1 ; } else { return p->pop[gm1] ? 0 : 1 ; } } } /* * Another critical subroutine, this one cleans up the empty bricks, * tiles, and supertiles as the generations go by. This speeds things * up by not using too much memory (minimizing cache misses and TLB * misses). We only try to delete bricks, tiles, and supertiles from * regions of the universe that have been active since we last attempted * to delete tiles. We delete all possible tiles, even those near active * regions; if necessary, * * We use dirty bit number 0 of supertiles, and dirty bits 0..3 of * tiles. */ supertile *qlifealgo::mdelete(supertile *p, int lev) { int i ; if (lev == 0) { tile *pp = (tile *)p ; if (pp->flags & 0xf) { int seen = 0 ; for (i=0; i<4; i++) { brick *b = pp->b[i] ; if (b != emptybrick) { if ((pp->flags & (1 << i))) { if (b->d[0] | b->d[1] | b->d[2] | b->d[3] | b->d[4] | b->d[5] | b->d[6] | b->d[7] | b->d[8] | b->d[9] | b->d[10] | b->d[11] | b->d[12] | b->d[13] | b->d[14] | b->d[15]) { seen++ ; } else { STAT(bricks--) ; ((linkedmem *)b)->next = bricklist ; bricklist = (linkedmem *)b ; pp->b[i] = emptybrick ; } } else seen++ ; } } if (seen || ((pp->c[1] | pp->c[2] | pp->c[3] | pp->c[4]) & 0xff) || ((generation.odd()) ? pp->c[5] : pp->c[0])) pp->flags &= 0xfffffff0 ; else { STAT(tiles--) ; memset(pp, 0, sizeof(tile)) ; ((linkedmem *)pp)->next = tilelist ; tilelist = (linkedmem *)pp ; return nullroots[lev] ; } } } else { if (p->flags & 0x10000000) { int keep = 0 ; for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) if ((p->d[i] = mdelete(p->d[i], lev-1)) != nullroots[lev-1]) keep++ ; if (keep || p == root || (p->flags & 0x3ffff)) p->flags &= 0xefffffff ; else { STAT(supertiles--) ; memset(p, 0, sizeof(supertile)) ; ((linkedmem *)p)->next = supertilelist ; supertilelist = (linkedmem *)p ; return nullroots[lev] ; } } } return p ; } G_INT64 qlifealgo::popcount() { return find_set_bits(root, rootlev, generation.odd()) ; } const bigint &qlifealgo::getPopulation() { if (!popValid) { population = bigint(popcount()) ; popValid = 1 ; poller->reset_countdown() ; } return population ; } int qlifealgo::isEmpty() { return isEmpty(root, rootlev, generation.odd()) ; } /* * Here we look at the root node and see if activity is getting * uncomfortably close to the current edges. If so, we add another * level onto the top. */ int qlifealgo::uproot_needed() { int i ; if (root->d[0] != nullroots[rootlev-1] || root->d[7] != nullroots[rootlev-1]) return 1 ; for (i=1; i<7; i++) if (root->d[i]->d[0] != nullroots[rootlev-2] || root->d[i]->d[7] != nullroots[rootlev-2]) return 1 ; return 0 ; } /* * The new generation code is simple. We uproot if needed. Then, we call * the appropriate top-level slice code depending on the generation number. * Finally, if we are generations 64, 128, 192, and so on, we clean up * the tree. * * Note that this 64 was carefully chosen to balance extraneous bricks left * behind by gliders against the computational cost of deletion. */ void qlifealgo::dogen() { poller->reset_countdown() ; #ifdef STATS ds = 0 ; dq = 0 ; rcc = 0 ; #endif // AKT: if grid is bounded then we should never need to call uproot() here // because setrule() has already expanded the universe to enclose the grid if (gridwd == 0 || gridht == 0) { while (uproot_needed()) uproot() ; } if (generation.odd()) doquad10(root, nullroot, nullroot, nullroot, rootlev) ; else doquad01(root, nullroot, nullroot, nullroot, rootlev) ; deltaforward = 0 ; generation += bigint::one ; popValid = 0 ; if (--cleandowncounter == 0) { cleandowncounter = 63 ; mdelete(root, rootlev) ; } #ifdef STATS dss += ds ; dqs += dq ; rccs += rcc ; #endif } /** * Step. Do increment generations. */ void qlifealgo::step() { poller->bailIfCalculating() ; bigint t = increment ; while (t != 0) { if (qliferules.alternate_rules) { // emulate B0-not-Smax rule by changing rule table depending on gen parity if (generation.odd()) ruletable = qliferules.rule1 ; else ruletable = qliferules.rule0 ; } else { ruletable = qliferules.rule0 ; } dogen() ; if (poller->isInterrupted()) break ; t -= 1 ; if (t > increment) // might change; make it happen now t = increment ; } } // Flip bits in given rule table. // This is a tad tricky because we want to turn both the input // and the output of this table upside down. static void fliprule(char *rptr) { for (int i=0; i<65536; i++) { int j = ((i & 0xf) << 12) + ((i & 0xf0) << 4) + ((i & 0xf00) >> 4) + ((i & 0xf000) >> 12) ; if (i <= j) { char fi = rptr[i] ; char fj = rptr[j] ; fi = ((fi & 0x30) >> 4) + ((fi & 0x3) << 4) ; fj = ((fj & 0x30) >> 4) + ((fj & 0x3) << 4) ; rptr[i] = fj ; rptr[j] = fi ; } } } /** * If we change the rule we need to mark everything dirty. */ const char *qlifealgo::setrule(const char *s) { const char* err = qliferules.setrule(s, this); if (err) return err; markglobalchange() ; // AKT: qlifealgo has an opposite interpretation of the orientation of // a rule table assumed by qliferules.setrule. For vertically symmetrical // rules such as the Moore or von Neumann neighborhoods this doesn't matter, // but for hexagonal rules and Wolfram rules we need to flip the rule table(s) // upside down. if ( qliferules.isHexagonal() || qliferules.isWolfram() ) { if (qliferules.alternate_rules) { // hex rule has B0 but not S6 so we'll be using rule1 for odd gens fliprule(qliferules.rule1); } fliprule(qliferules.rule0); } // ruletable is set in step(), but play safe ruletable = qliferules.rule0 ; if (qliferules.isHexagonal()) grid_type = HEX_GRID; else if (qliferules.isVonNeumann()) grid_type = VN_GRID; else grid_type = SQUARE_GRID; // AKT: if the grid is bounded then call uproot() if necessary so that // dogen() never needs to call it if (gridwd > 0 && gridht > 0) { // use the top left and bottom right corners of the grid, but expanded by 2 // to allow for growth in the borders when the grid edges are joined int xmin = -int(gridwd/2) - 2; int ymin = -int(gridht/2) - 2; int xmax = xmin + gridwd + 3; int ymax = ymin + gridht + 3; // duplicate the expansion code in setcell() ymin = -ymin; ymax = -ymax; if (generation.odd()) { xmin--; ymin--; xmax--; ymax--; } // min is -ve, max is +ve, xmin is -ve, xmax is +ve, ymin is +ve, ymax is -ve while (xmin < min || xmax > max || ymin > max || ymax < min) uproot(); } return 0; } static lifealgo *creator() { return new qlifealgo() ; } void qlifealgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ai.setAlgorithmName("QuickLife") ; ai.setAlgorithmCreator(&creator) ; ai.setDefaultBaseStep(10) ; ai.setDefaultMaxMem(0) ; ai.minstates = 2 ; ai.maxstates = 2 ; // init default color scheme ai.defgradient = false; ai.defr1 = ai.defg1 = ai.defb1 = 255; // start color = white ai.defr2 = ai.defg2 = ai.defb2 = 255; // end color = white ai.defr[0] = ai.defg[0] = ai.defb[0] = 48; // 0 state = dark gray ai.defr[1] = ai.defg[1] = ai.defb[1] = 255; // 1 state = white } golly-3.3-src/gollybase/ltlalgo.cpp0000755000175000017500000024333613543255652014366 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. // Implementation code for the "Larger than Life" family of rules. // See Help/Algorithms/Larger_than_Life.html for more info. #include "ltlalgo.h" #include "liferules.h" #include "util.h" #include // for malloc, free, etc #include // for INT_MIN and INT_MAX #include // for memset and strchr // ----------------------------------------------------------------------------- // set default rule to match Life static const char *DEFAULTRULE = "R1,C0,M0,S2..3,B3..3,NM"; #define MAXRANGE 500 #define DEFAULTSIZE 400 // must be >= 2 // maximum number of columns in a cell's neighborhood (used in fast_Moore) static const int MAXNCOLS = 2 * MAXRANGE + 1; // maximum number of cells in grid must be < 2^31 so population can't overflow #define MAXCELLS 100000000.0 // faster_Neumann_* calls are much slower than fast_Neumann when the // range is 1 or 2, similar when 5, but much faster when 10 or above #define SMALL_NN_RANGE 4 // ----------------------------------------------------------------------------- // Create a new empty universe. ltlalgo::ltlalgo() { shape = NULL ; // create a bounded universe with the default grid size, range and neighborhood unbounded = false; range = 1; ntype = 'M'; colcounts = NULL; create_grids(DEFAULTSIZE, DEFAULTSIZE); generation = 0; increment = 1; show_warning = true; } // ----------------------------------------------------------------------------- // Destroy the universe. ltlalgo::~ltlalgo() { free(outergrid1); if (outergrid2) free(outergrid2); if (colcounts) free(colcounts); if (shape) free(shape) ; } // ----------------------------------------------------------------------------- void ltlalgo::allocate_colcounts() { // allocate the array used for cumulative column counts of state-1 cells if (colcounts) free(colcounts); if (ntype == 'M') { colcounts = (int*) malloc(outerbytes * sizeof(int)); // if NULL then use fast_Moore, otherwise faster_Moore_* } else if (ntype == 'N') { if (range <= SMALL_NN_RANGE) { // use fast_Neumann (faster than faster_Neumann_* for small ranges) colcounts = NULL; } else { // additional rows are needed to calculate counts in faster_Neumann_* colcounts = (int*) malloc(outerwd * (outerht + (outerwd-1)/2) * sizeof(int)); // if NULL then use fast_Neumann } } else if (ntype == 'C') { colcounts = NULL ; // use fast_Shaped } else { lifefatal("Unexpected ntype!"); } } // ----------------------------------------------------------------------------- void ltlalgo::create_grids(int wd, int ht) { // create a bounded universe of given width and height gwd = wd; ght = ht; border = range + 1; // the extra 1 is needed by faster_Moore_* outerwd = gwd + border * 2; // add left and right border outerht = ght + border * 2; // add top and bottom border outerbytes = outerwd * outerht; allocate_colcounts(); // allocate memory for grid int offset = border * outerwd + border; outergrid1 = (unsigned char*) calloc(outerbytes, sizeof(unsigned char)); if (outergrid1 == NULL) lifefatal("Not enough memory for LtL grid!"); // point currgrid to top left non-border cells within outergrid1 currgrid = outergrid1 + offset; // if using fast_Moore or fast_Neumann we need to allocate outergrid2 if (colcounts == NULL) { outergrid2 = (unsigned char*) calloc(outerbytes, sizeof(unsigned char)); if (outergrid2 == NULL) lifefatal("Not enough memory for LtL grids!"); // point nextgrid to top left non-border cells within outergrid2 nextgrid = outergrid2 + offset; } else { // faster_* calls don't use outergrid2 outergrid2 = NULL; nextgrid = NULL; } // set grid coordinates of cell at bottom right corner of inner grid gwdm1 = gwd - 1; ghtm1 = ght - 1; // set cell coordinates of inner grid edges (middle of grid is 0,0) gtop = -int(ght / 2); gleft = -int(gwd / 2); gbottom = gtop + ghtm1; gright = gleft + gwdm1; // set bigint versions of inner grid edges (used by GUI code) gridtop = gtop; gridleft = gleft; gridbottom = gbottom; gridright = gright; // the universe is empty population = 0; // init boundaries so next birth will change them empty_boundaries(); } // ----------------------------------------------------------------------------- void ltlalgo::empty_boundaries() { minx = INT_MAX; miny = INT_MAX; maxx = INT_MIN; maxy = INT_MIN; } // ----------------------------------------------------------------------------- void ltlalgo::clearall() { lifefatal("clearall is not implemented"); } // ----------------------------------------------------------------------------- int ltlalgo::NumCellStates() { return maxCellStates; } // ----------------------------------------------------------------------------- void ltlalgo::endofpattern() { show_warning = true; } // ----------------------------------------------------------------------------- const char* ltlalgo::resize_grids(int up, int down, int left, int right) { // try to resize an unbounded universe by given amounts (possibly -ve) int newwd = gwd + left + right; int newht = ght + up + down; if ((float)newwd * (float)newht > MAXCELLS) { return "Sorry, but the universe can't be expanded that far."; } // check if new grid edges would be outside editing limits int newtop = gtop - up; int newleft = gleft - left; int newbottom = newtop + newht - 1; int newright = newleft + newwd - 1; if (newtop < -1000000000 || newleft < -1000000000 || newbottom > 1000000000 || newright > 1000000000) { return "Sorry, but the grid edges can't be outside the editing limits."; } int newbytes = newwd * newht; unsigned char* newcurr = (unsigned char*) calloc(newbytes, sizeof(unsigned char)); unsigned char* newnext = (unsigned char*) calloc(newbytes, sizeof(unsigned char)); if (newcurr == NULL || newnext == NULL) { if (newcurr) free(newcurr); if (newnext) free(newnext); return "Not enough memory to resize universe!"; } // resize succeeded so copy pattern from currgrid into newcurr if (population > 0) { unsigned char* src = currgrid + miny * outerwd + minx; unsigned char* dest = newcurr + (miny + up) * newwd + minx + left; int xbytes = maxx - minx + 1; for (int row = miny; row <= maxy; row++) { memcpy(dest, src, xbytes); src += outerwd; dest += newwd; } // shift pattern boundaries minx += left; maxx += left; miny += up; maxy += up; } free(outergrid1); if (outergrid2) free(outergrid2); outergrid1 = currgrid = newcurr; outergrid2 = nextgrid = newnext; outerwd = gwd = newwd; outerht = ght = newht; outerbytes = newbytes; // set grid coordinates of cell at bottom right corner of grid gwdm1 = gwd - 1; ghtm1 = ght - 1; // adjust cell coordinates of grid edges gtop -= up; gleft -= left; gbottom = gtop + ghtm1; gright = gleft + gwdm1; // set bigint versions of grid edges (used by GUI code) gridtop = gtop; gridleft = gleft; gridbottom = gbottom; gridright = gright; allocate_colcounts(); if (colcounts) { // faster_* calls don't use outergrid2 free(outergrid2); outergrid2 = NULL; nextgrid = NULL; } return NULL; // success } // ----------------------------------------------------------------------------- // Set the cell at the given location to the given state. int ltlalgo::setcell(int x, int y, int newstate) { if (newstate < 0 || newstate >= maxCellStates) return -1; if (unbounded) { // check if universe needs to be expanded if (x < gleft || x > gright || y < gtop || y > gbottom) { if (population == 0) { // no need to resize empty grids; // just adjust grid edges so that x,y is in middle of grid gtop = y - int(ght / 2); gleft = x - int(gwd / 2); gbottom = gtop + ghtm1; gright = gleft + gwdm1; // set bigint versions of grid edges (used by GUI code) gridtop = gtop; gridleft = gleft; gridbottom = gbottom; gridright = gright; } else { int up = y < gtop ? gtop - y : 0; int down = y > gbottom ? y - gbottom : 0; int left = x < gleft ? gleft - x : 0; int right = x > gright ? x - gright : 0; // if the down or right amount is 1 then it's likely a pattern file // is being loaded, so increase the amount to reduce the number of // resize_grids calls and speed up the loading time if (down == 1) down = 10; if (right == 1) right = 10; const char* errmsg = resize_grids(up, down, left, right); if (errmsg) { if (show_warning) lifewarning(errmsg); // prevent further warning messages until endofpattern is called // (this avoids user having to close thousands of dialog boxes // if they attempted to paste a large pattern) show_warning = false; return -1; } } } } else { // check if x,y is outside bounded universe if (x < gleft || x > gright) return -1; if (y < gtop || y > gbottom) return -1; } // set x,y cell in currgrid int gx = x - gleft; int gy = y - gtop; unsigned char* cellptr = currgrid + gy * outerwd + gx; int oldstate = *cellptr; if (newstate != oldstate) { *cellptr = (unsigned char)newstate; // population might change if (oldstate == 0 && newstate > 0) { population++; if (gx < minx) minx = gx; if (gx > maxx) maxx = gx; if (gy < miny) miny = gy; if (gy > maxy) maxy = gy; } else if (oldstate > 0 && newstate == 0) { population--; if (population == 0) empty_boundaries(); } } return 0; } // ----------------------------------------------------------------------------- // Get the state of the cell at the given location. int ltlalgo::getcell(int x, int y) { if (unbounded) { // cell outside grid is dead if (x < gleft || x > gright) return 0; if (y < gtop || y > gbottom) return 0; } else { // error if x,y is outside bounded universe if (x < gleft || x > gright) return -1; if (y < gtop || y > gbottom) return -1; } // get x,y cell in currgrid unsigned char* cellptr = currgrid + (y - gtop) * outerwd + (x - gleft); return *cellptr; } // ----------------------------------------------------------------------------- // Return the distance to the next non-zero cell in the given row, // or -1 if there is none. int ltlalgo::nextcell(int x, int y, int& v) { if (population == 0) return -1; // check if y is outside grid if (y < gtop || y > gbottom) return -1; // check if x is outside right edge if (x > gright) return -1; // init distance int d = 0; // if x is outside left edge then set it to gleft and increase d // (this is necessary in case the user makes a selection outside // gleft when the universe is unbounded) if (x < gleft) { d = gleft - x; x = gleft; } // get x,y cell in currgrid unsigned char* cellptr = currgrid + (y - gtop) * outerwd + (x - gleft); do { v = *cellptr; if (v > 0) return d; // found a non-zero cell d++; cellptr++; x++; } while (x <= gright); return -1; } // ----------------------------------------------------------------------------- static bigint bigpop; const bigint& ltlalgo::getPopulation() { bigpop = population; return bigpop; } // ----------------------------------------------------------------------------- int ltlalgo::isEmpty() { return population == 0 ? 1 : 0; } // ----------------------------------------------------------------------------- void ltlalgo::update_current_grid(unsigned char &state, int ncount) { // return the state of the cell based on the neighbor count if (state == 0) { // this cell is dead if (ncount >= minB && ncount <= maxB) { // new cell is born state = 1; population++; } } else if (state == 1) { // this cell is alive if (ncount < minS || ncount > maxS) { // this cell doesn't survive if (maxCellStates > 2) { // cell decays to state 2 state = 2; } else { // cell dies state = 0; population--; if (population == 0) empty_boundaries(); } } } else { // state is > 1 so this cell will eventually die if (state + 1 < maxCellStates) { state++; } else { // cell dies state = 0; population--; if (population == 0) empty_boundaries(); } } } // ----------------------------------------------------------------------------- void ltlalgo::update_next_grid(int x, int y, int xyoffset, int ncount) { // x,y cell in nextgrid might change based on the given neighborhood count unsigned char state = *(currgrid + xyoffset); if (state == 0) { // this cell is dead if (ncount >= minB && ncount <= maxB) { // new cell is born in nextgrid unsigned char* nextcell = nextgrid + xyoffset; *nextcell = 1; population++; if (x < minx) minx = x; if (x > maxx) maxx = x; if (y < miny) miny = y; if (y > maxy) maxy = y; } } else if (state == 1) { // this cell is alive if (ncount >= minS && ncount <= maxS) { // cell survives so copy into nextgrid unsigned char* nextcell = nextgrid + xyoffset; *nextcell = 1; // population doesn't change but pattern limits in nextgrid might if (x < minx) minx = x; if (x > maxx) maxx = x; if (y < miny) miny = y; if (y > maxy) maxy = y; } else if (maxCellStates > 2) { // cell decays to state 2 unsigned char* nextcell = nextgrid + xyoffset; *nextcell = 2; // population doesn't change but pattern limits in nextgrid might if (x < minx) minx = x; if (x > maxx) maxx = x; if (y < miny) miny = y; if (y > maxy) maxy = y; } else { // cell dies population--; if (population == 0) empty_boundaries(); } } else { // state is > 1 so this cell will eventually die if (state + 1 < maxCellStates) { unsigned char* nextcell = nextgrid + xyoffset; *nextcell = state + 1; // population doesn't change but pattern limits in nextgrid might if (x < minx) minx = x; if (x > maxx) maxx = x; if (y < miny) miny = y; if (y > maxy) maxy = y; } else { // cell dies population--; if (population == 0) empty_boundaries(); } } } // ----------------------------------------------------------------------------- void ltlalgo::faster_Moore_bounded(int mincol, int minrow, int maxcol, int maxrow) { // use Adam P. Goucher's algorithm to calculate Moore neighborhood counts // in a bounded universe; note that currgrid is surrounded by a border that // might contain live cells (the border is range+1 cells thick and the // outermost cells are always dead) // the given limits are relative to currgrid so we need to add border // so they are relative to outergrid1, and then expand them by range int bmr = border - range; int bpr = border + range; minrow += bmr; mincol += bmr; maxrow += bpr; maxcol += bpr; // calculate cumulative counts for each column and store in colcounts unsigned char* cellptr = outergrid1 + minrow * outerwd + mincol; int* ccptr = colcounts + minrow * outerwd + mincol; int *prevptr = NULL; int width = (maxcol - mincol + 1); int nextrow = outerwd - width; int rowcount = 0; for (int j = mincol; j <= maxcol; j++) { if (*cellptr == 1) rowcount++; *ccptr = rowcount; cellptr++; ccptr++; } cellptr += nextrow; ccptr += nextrow; prevptr = ccptr - outerwd; for (int i = minrow + 1; i <= maxrow; i++) { rowcount = 0; for (int j = mincol; j <= maxcol; j++) { if (*cellptr == 1) rowcount++; *ccptr = *prevptr + rowcount; cellptr++; ccptr++; prevptr++; } cellptr += nextrow; ccptr += nextrow; prevptr += nextrow; } // restore given limits (necessary for update_current_grid calls) minrow -= bmr; mincol -= bmr; maxrow -= bpr; maxcol -= bpr; // calculate final neighborhood counts using values in colcounts // and update the corresponding cells in current grid int* colptr = colcounts + (minrow + bpr) * outerwd; ccptr = colptr + mincol + bpr; unsigned char* stateptr = currgrid + minrow*outerwd+mincol; unsigned char state = *stateptr; update_current_grid(state, *ccptr); *stateptr = state; if (state) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool rowchanged = false; int bmrm1 = border - range - 1; stateptr = currgrid + minrow*outerwd + mincol+1; for (int j = mincol+1; j <= maxcol; j++) { // do i == minrow int* ccptr1 = colptr + (j + bpr); int* ccptr2 = colptr + (j + bmrm1); state = *stateptr; update_current_grid(state, *ccptr1 - *ccptr2); *stateptr++ = state; if (state) { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } if (rowchanged) { if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool colchanged = false; colptr = colcounts + mincol + bpr; stateptr = currgrid + (minrow+1)*outerwd + mincol; for (int i = minrow+1; i <= maxrow; i++) { // do j == mincol int* ccptr1 = colptr + (i + bpr) * outerwd; int* ccptr2 = colptr + (i + bmrm1) * outerwd; state = *stateptr; update_current_grid(state, *ccptr1 - *ccptr2); *stateptr = state; stateptr += outerwd; if (state) { if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } if (colchanged) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; } rowchanged = false; for (int i = minrow+1; i <= maxrow; i++) { int* ipr = colcounts + (i + bpr) * outerwd; int* imrm1 = colcounts + (i + bmrm1) * outerwd; stateptr = currgrid + i*outerwd + mincol+1; for (int j = mincol+1; j <= maxcol; j++) { int jpr = j + bpr; int jmrm1 = j + bmrm1; int* ccptr1 = ipr + jpr; int* ccptr2 = imrm1 + jmrm1; int* ccptr3 = ipr + jmrm1; int* ccptr4 = imrm1 + jpr; state = *stateptr; update_current_grid(state, *ccptr1 + *ccptr2 - *ccptr3 - *ccptr4); *stateptr++ = state; if (state) { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } if (rowchanged) { if (i < miny) miny = i; if (i > maxy) maxy = i; rowchanged = false; } } } // ----------------------------------------------------------------------------- void ltlalgo::faster_Moore_bounded2(int mincol, int minrow, int maxcol, int maxrow) { // use Adam P. Goucher's algorithm to calculate Moore neighborhood counts // in a bounded universe; note that currgrid is surrounded by a border that // might contain live cells (the border is range+1 cells thick and the // outermost cells are always dead) // the given limits are relative to currgrid so we need to add border // so they are relative to outergrid1, and then expand them by range int bmr = border - range; int bpr = border + range; minrow += bmr; mincol += bmr; maxrow += bpr; maxcol += bpr; // calculate cumulative counts for each column and store in colcounts unsigned char* cellptr = outergrid1 + minrow * outerwd + mincol; int* ccptr = colcounts + minrow * outerwd + mincol; int *prevptr = NULL; int width = (maxcol - mincol + 1); int nextrow = outerwd - width; int rowcount = 0; // compute 4 cell offset int offset = (4 - ((g_uintptr_t)cellptr & 3)) & 3; if (offset > width) offset = width; // process in 4 cell chunks int chunks = (width - offset) >> 2; int remainder = (width - offset) - (chunks << 2); int j = 0; // process cells in the first row // process cells up to the first 4 cell chunk for (j = 0; j < offset; j++) { rowcount += *cellptr++; *ccptr++ = rowcount; } // process any 4 cell chunks unsigned int *lcellptr = (unsigned int*)cellptr; for (j = 0; j < chunks; j++) { if (*lcellptr++) { rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; } else { *ccptr++ = rowcount; *ccptr++ = rowcount; *ccptr++ = rowcount; *ccptr++ = rowcount; cellptr += 4; } } // process any remaining cells for (j = 0; j < remainder; j++) { rowcount += *cellptr++; *ccptr++ = rowcount; } cellptr += nextrow; ccptr += nextrow; prevptr = ccptr - outerwd; // process the remaining rows of cells for (int i = minrow + 1; i <= maxrow; i++) { rowcount = 0; // compute 4 cell offset offset = (4 - ((g_uintptr_t)cellptr & 3)) & 3; if (offset > width) offset = width; // process in 4 cell chunks chunks = (width - offset) >> 2; remainder = (width - offset) - (chunks << 2); // process cells up to the first 4 cell chunk for (j = 0; j < offset; j++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } lcellptr = (unsigned int*)cellptr; // process any 4 cell chunks for (j = 0; j < chunks; j++) { // check if any of the cells are alive if (*lcellptr++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } else { *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; cellptr += 4; } } // process any remaining cells for (j = 0; j < remainder; j++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } // next row cellptr += nextrow; ccptr += nextrow; prevptr += nextrow; } // restore given limits (necessary for update_current_grid calls) minrow -= bmr; mincol -= bmr; maxrow -= bpr; maxcol -= bpr; // calculate final neighborhood counts using values in colcounts // and update the corresponding cells in current grid int* colptr = colcounts + (minrow + bpr) * outerwd; ccptr = colptr + mincol + bpr; unsigned char* stateptr = currgrid + minrow*outerwd+mincol; int ncount = *ccptr; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; minx = mincol; maxx = mincol; miny = minrow; maxy = minrow; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { minx = mincol; maxx = maxcol; miny = minrow; maxy = maxrow; } } bool rowchanged = false; int bmrm1 = border - range - 1; stateptr = currgrid + minrow*outerwd + mincol+1; int* ccptr1 = colptr + (mincol+1 + bpr); int* ccptr2 = colptr + (mincol+1 + bmrm1); for (j = mincol+1; j <= maxcol; j++) { // do i == minrow ncount = *ccptr1++ - *ccptr2++; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } stateptr++; } if (rowchanged) { if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool colchanged = false; colptr = colcounts + mincol + bpr; stateptr = currgrid + (minrow+1)*outerwd + mincol; ccptr1 = colptr + (minrow+1 + bpr) * outerwd; ccptr2 = colptr + (minrow+1 + bmrm1) * outerwd; for (int i = minrow+1; i <= maxrow; i++) { // do j == mincol ncount = *ccptr1 - *ccptr2; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } stateptr += outerwd; ccptr1 += outerwd; ccptr2 += outerwd; } if (colchanged) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; } rowchanged = false; for (int i = minrow+1; i <= maxrow; i++) { int* ipr = colcounts + (i + bpr) * outerwd; int* imrm1 = colcounts + (i + bmrm1) * outerwd; int jpr = mincol+1 + bpr; int jmrm1 = mincol+1 + bmrm1; ccptr1 = ipr + jpr; ccptr2 = imrm1 + jmrm1; int* ccptr3 = ipr + jmrm1; int* ccptr4 = imrm1 + jpr; stateptr = currgrid + i*outerwd + mincol+1; for (j = mincol+1; j <= maxcol; j++) { ncount = *ccptr1++ + *ccptr2++ - *ccptr3++ - *ccptr4++; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } stateptr++; } if (rowchanged) { if (i < miny) miny = i; if (i > maxy) maxy = i; rowchanged = false; } } if (population == 0) empty_boundaries(); } // ----------------------------------------------------------------------------- void ltlalgo::faster_Moore_unbounded(int mincol, int minrow, int maxcol, int maxrow) { // use Adam P. Goucher's algorithm to calculate Moore neighborhood counts // in an unbounded universe; note that we can safely assume there is at least // a 2*range border of dead cells surrounding the pattern // temporarily expand the given limits minrow -= range; mincol -= range; maxrow += range; maxcol += range; int r2 = range * 2; int minrowpr2 = minrow+r2; int mincolpr2 = mincol+r2; // put zeros in top 2*range rows of colcounts for (int i = minrow; i < minrowpr2; i++) { int* ccptr = colcounts + i * outerwd + mincol; for (int j = mincol; j <= maxcol; j++) { *ccptr++ = 0; } } // put zeros in left 2*range columns of colcounts for (int j = mincol; j < mincolpr2; j++) { int* ccptr = colcounts + minrowpr2 * outerwd + j; for (int i = minrowpr2; i <= maxrow; i++) { *ccptr = 0; ccptr += outerwd; } } unsigned char* cellptr = currgrid + minrowpr2 * outerwd + mincolpr2; int* ccptr = colcounts + minrowpr2 * outerwd + mincolpr2; int* prevptr = ccptr - outerwd; int width = (maxcol - mincolpr2 + 1); int nextrow = outerwd - width; int rowcount = 0; int j = 0; for (int i = minrowpr2; i <= maxrow; i++) { rowcount = 0; for (j = mincolpr2; j <= maxcol; j++) { if (*cellptr == 1) rowcount++; *ccptr = *prevptr + rowcount; cellptr++; ccptr++; prevptr++; } cellptr += nextrow; ccptr += nextrow; prevptr += nextrow; } // restore given limits minrow += range; mincol += range; maxrow -= range; maxcol -= range; // calculate final neighborhood counts using values in colcounts // and update the corresponding cells in current grid int* colptr = colcounts + (minrow + range) * outerwd; ccptr = colptr + mincol + range; unsigned char* stateptr = currgrid + minrow*outerwd+mincol; unsigned char state = *stateptr; update_current_grid(state, *ccptr); *stateptr = state; if (state) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool rowchanged = false; int rangep1 = range + 1; stateptr = currgrid + minrow*outerwd + mincol+1; for (j = mincol+1; j <= maxcol; j++) { // do i == minrow int* ccptr1 = colptr + (j+range); int* ccptr2 = colptr + (j-rangep1); state = *stateptr; update_current_grid(state, *ccptr1 - *ccptr2); *stateptr++ = state; if (state) { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } if (rowchanged) { if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool colchanged = false; colptr = colcounts + mincol + range; stateptr = currgrid + (minrow+1)*outerwd + mincol; for (int i = minrow+1; i <= maxrow; i++) { // do j == mincol int* ccptr1 = colptr + (i+range) * outerwd; int* ccptr2 = colptr + (i-rangep1) * outerwd; state = *stateptr; update_current_grid(state, *ccptr1 - *ccptr2); *stateptr = state; stateptr += outerwd; if (state) { if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } if (colchanged) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; } rowchanged = false; for (int i = minrow+1; i <= maxrow; i++) { int* ipr = colcounts + (i+range) * outerwd; int* imrm1 = colcounts + (i-rangep1) * outerwd; stateptr = currgrid + i*outerwd + mincol+1; for (j = mincol+1; j <= maxcol; j++) { int jpr = j+range; int jmrm1 = j-rangep1; int* ccptr1 = ipr + jpr; int* ccptr2 = imrm1 + jmrm1; int* ccptr3 = ipr + jmrm1; int* ccptr4 = imrm1 + jpr; state = *stateptr; update_current_grid(state, *ccptr1 + *ccptr2 - *ccptr3 - *ccptr4); *stateptr++ = state; if (state) { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } if (rowchanged) { if (i < miny) miny = i; if (i > maxy) maxy = i; rowchanged = false; } } } // ----------------------------------------------------------------------------- void ltlalgo::faster_Moore_unbounded2(int mincol, int minrow, int maxcol, int maxrow) { // use Adam P. Goucher's algorithm to calculate Moore neighborhood counts // in an unbounded universe; note that we can safely assume there is at least // a 2*range border of dead cells surrounding the pattern // temporarily expand the given limits minrow -= range; mincol -= range; maxrow += range; maxcol += range; int r2 = range * 2; int minrowpr2 = minrow+r2; int mincolpr2 = mincol+r2; // put zeros in top 2*range rows of colcounts for (int i = minrow; i < minrowpr2; i++) { int* ccptr = colcounts + i * outerwd + mincol; for (int j = mincol; j <= maxcol; j++) { *ccptr++ = 0; } } // put zeros in left 2*range columns of colcounts for (int j = mincol; j < mincolpr2; j++) { int* ccptr = colcounts + minrowpr2 * outerwd + j; for (int i = minrowpr2; i <= maxrow; i++) { *ccptr = 0; ccptr += outerwd; } } // calculate cumulative counts for each column and store in colcounts unsigned char* cellptr = currgrid + minrowpr2 * outerwd + mincolpr2; int* ccptr = colcounts + minrowpr2 * outerwd + mincolpr2; int* prevptr = ccptr - outerwd; int width = (maxcol - mincolpr2 + 1); int nextrow = outerwd - width; int rowcount = 0; // compute 4 cell offset int offset = (4 - ((g_uintptr_t)cellptr & 3)) & 3; if (offset > width) offset = width; // process in 4 cell chunks int chunks = (width - offset) >> 2; int remainder = (width - offset) - (chunks << 2); int j = 0; // process cells in the first row // process cells up to the first 4 cell chunk for (j = 0; j < offset; j++) { rowcount += *cellptr++; *ccptr++ = rowcount; } // process any 4 cell chunks unsigned int *lcellptr = (unsigned int*)cellptr; for (j = 0; j < chunks; j++) { if (*lcellptr++) { rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; rowcount += *cellptr++; *ccptr++ = rowcount; } else { *ccptr++ = rowcount; *ccptr++ = rowcount; *ccptr++ = rowcount; *ccptr++ = rowcount; cellptr += 4; } } // process any remaining cells for (j = 0; j < remainder; j++) { rowcount += *cellptr++; *ccptr++ = rowcount; } cellptr += nextrow; ccptr += nextrow; prevptr = ccptr - outerwd; // process the remaining rows of cells for (int i = minrowpr2 + 1; i <= maxrow; i++) { rowcount = 0; // compute 4 cell offset offset = (4 - ((g_uintptr_t)cellptr & 3)) & 3; if (offset > width) offset = width; // process in 4 cell chunks chunks = (width - offset) >> 2; remainder = (width - offset) - (chunks << 2); // process cells up to the first 4 cell chunk for (j = 0; j < offset; j++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } lcellptr = (unsigned int*)cellptr; // process any 4 cell chunks for (j = 0; j < chunks; j++) { // check if any of the cells are alive if (*lcellptr++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } else { *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; *ccptr++ = *prevptr++ + rowcount; cellptr += 4; } } // process any remaining cells for (j = 0; j < remainder; j++) { rowcount += *cellptr++; *ccptr++ = *prevptr++ + rowcount; } // next row cellptr += nextrow; ccptr += nextrow; prevptr += nextrow; } // restore given limits minrow += range; mincol += range; maxrow -= range; maxcol -= range; // calculate final neighborhood counts using values in colcounts // and update the corresponding cells in current grid int* colptr = colcounts + (minrow + range) * outerwd; ccptr = colptr + mincol + range; unsigned char* stateptr = currgrid + minrow*outerwd+mincol; int ncount = *ccptr; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; minx = mincol; maxx = mincol; miny = minrow; maxy = minrow; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { minx = mincol; maxx = maxcol; miny = minrow; maxy = maxrow; } } bool rowchanged = false; int rangep1 = range + 1; stateptr = currgrid + minrow*outerwd + mincol+1; int* ccptr1 = colptr + (mincol+1 + range); int* ccptr2 = colptr + (mincol+1 - rangep1); for (j = mincol+1; j <= maxcol; j++) { // do i == minrow ncount = *ccptr1++ - *ccptr2++; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } stateptr++; } if (rowchanged) { if (minrow < miny) miny = minrow; if (minrow > maxy) maxy = minrow; } bool colchanged = false; colptr = colcounts + mincol + range; stateptr = currgrid + (minrow+1)*outerwd + mincol; ccptr1 = colptr + (minrow+1+range) * outerwd; ccptr2 = colptr + (minrow+1-rangep1) * outerwd; for (int i = minrow+1; i <= maxrow; i++) { // do j == mincol ncount = *ccptr1 - *ccptr2; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (i < miny) miny = i; if (i > maxy) maxy = i; colchanged = true; } } stateptr += outerwd; ccptr1 += outerwd; ccptr2 += outerwd; } if (colchanged) { if (mincol < minx) minx = mincol; if (mincol > maxx) maxx = mincol; } rowchanged = false; for (int i = minrow+1; i <= maxrow; i++) { int* ipr = colcounts + (i+range) * outerwd; int* imrm1 = colcounts + (i-rangep1) * outerwd; int jpr = mincol+1+range; int jmrm1 = mincol+1-rangep1; ccptr1 = ipr + jpr; ccptr2 = imrm1 + jmrm1; int* ccptr3 = ipr + jmrm1; int* ccptr4 = imrm1 + jpr; stateptr = currgrid + i*outerwd + mincol+1; for (j = mincol+1; j <= maxcol; j++) { ncount = *ccptr1++ + *ccptr2++ - *ccptr3++ - *ccptr4++; if (*stateptr == 0) { if (ncount >= minB && ncount <= maxB) { *stateptr = 1; population++; if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } else { if (ncount < minS || ncount > maxS) { *stateptr = 0; population--; } else { if (j < minx) minx = j; if (j > maxx) maxx = j; rowchanged = true; } } stateptr++; } if (rowchanged) { if (i < miny) miny = i; if (i > maxy) maxy = i; rowchanged = false; } } if (population == 0) empty_boundaries(); } // ----------------------------------------------------------------------------- void ltlalgo::fast_Moore(int mincol, int minrow, int maxcol, int maxrow) { if (range == 1) { for (int y = minrow; y <= maxrow; y++) { int yoffset = y * outerwd; unsigned char* topy = currgrid + (y - 1) * outerwd; for (int x = mincol; x <= maxcol; x++) { // count the state-1 neighbors within the current range // using the extended Moore neighborhood with no edge checks int ncount = 0; unsigned char* cellptr = topy + (x - 1); if (*cellptr++ == 1) ncount++; if (*cellptr++ == 1) ncount++; if (*cellptr == 1) ncount++; cellptr += outerwd; if (*cellptr == 1) ncount++; if (*--cellptr == 1) ncount++; if (*--cellptr == 1) ncount++; cellptr += outerwd; if (*cellptr++ == 1) ncount++; if (*cellptr++ == 1) ncount++; if (*cellptr == 1) ncount++; update_next_grid(x, y, yoffset+x, ncount); } } } else { // range > 1 int rightcol = 2 * range; for (int y = minrow; y <= maxrow; y++) { int yoffset = y * outerwd; int ymrange = y - range; int yprange = y + range; unsigned char* topy = currgrid + ymrange * outerwd; // for the 1st cell in this row we count the state-1 cells in the // extended Moore neighborhood and remember the column counts int colcount[MAXNCOLS]; int xmrange = mincol - range; int xprange = mincol + range; int ncount = 0; for (int i = xmrange; i <= xprange; i++) { unsigned char* cellptr = topy + i; int col = i - xmrange; colcount[col] = 0; for (int j = ymrange; j <= yprange; j++) { if (*cellptr == 1) colcount[col]++; cellptr += outerwd; } ncount += colcount[col]; } // we now have the neighborhood counts in each column; // eg. 7 columns if range == 3: // --------------- // | | | | | | | | // | | | | | | | | // |0|1|2|3|4|5|6| // | | | | | | | | // | | | | | | | | // --------------- update_next_grid(mincol, y, yoffset+mincol, ncount); // for the remaining cells in this row we only need to update // the count in the right column of the new neighborhood // and shift the other column counts to the left topy += range; for (int x = mincol+1; x <= maxcol; x++) { // get count in right column int rcount = 0; unsigned char* cellptr = topy + x; for (int j = ymrange; j <= yprange; j++) { if (*cellptr == 1) rcount++; cellptr += outerwd; } ncount = rcount; for (int i = 1; i <= rightcol; i++) { ncount += colcount[i]; colcount[i-1] = colcount[i]; } colcount[rightcol] = rcount; update_next_grid(x, y, yoffset+x, ncount); } } } } // ----------------------------------------------------------------------------- void ltlalgo::fast_Shaped(int mincol, int minrow, int maxcol, int maxrow) { for (int y = minrow; y <= maxrow; y++) { int yoffset = y * outerwd; int ymrange = y - range; int yprange = y + range; // for the 1st cell in this row we count the state-1 cells in the // shaped neighborhood and remember the column counts int ncount = 0; unsigned char* cellptr = currgrid + ymrange * outerwd ; for (int j = ymrange; j <= yprange; j++, cellptr += outerwd) { int xmrange = mincol - shape[j-ymrange] ; int xprange = mincol + shape[j-ymrange] ; for (int i = xmrange; i <= xprange; i++) if (cellptr[i] == 1) ncount++ ; } update_next_grid(mincol, y, yoffset+mincol, ncount); // for the remaining cells in this row we only need subtract // points in relevant rows and add points in other relevant // rows according to the shape. cellptr = currgrid + ymrange * outerwd ; for (int x = mincol+1; x <= maxcol; x++) { unsigned char* cp = cellptr ; for (int j = ymrange; j <= yprange; j++, cp += outerwd) { int xmrange = x - shape[j-ymrange] ; int xprange = x + shape[j-ymrange] ; if (cp[xmrange-1] == 1) ncount-- ; if (cp[xprange] == 1) ncount++ ; } update_next_grid(x, y, yoffset+x, ncount); } } } // ----------------------------------------------------------------------------- int ltlalgo::getcount(int i, int j) { // From Dean Hickerson: // C[i][j] is the sum of G[i'][j'] for all cells between northwest and northeast from // (i,j) with i'+j' == i+j (mod 2). I.e. the sum of these: // // ... ... ... // G[i-3][j-3] G[i-3][j-1] G[i-3][j+1] G[i-3][j+3] // G[i-2][j-2] G[i-2][j] G[i-2][j+2] // G[i-1][j-1] G[i-1][j+1] // G[i][j] // // We only need to compute and store C[i][j] for 0 <= i < ncols, 0 <= j < nrows + floor((ncols-1)/2); // other values that we need are equal to one of these, as given by this function. // if (i < 0 || i+j < 0 || j-i >= ncols) { return 0; } if (j < 0 && i+j < ccht) { // return C[i+j][0] return *(colcounts + (i+j) * outerwd); } if (j >= ncols && j-i >= ncols-ccht) { // return C[i+ncols-1-j][ncols-1] return *(colcounts + (i+ncols-1-j) * outerwd + (ncols-1)); } if (i < ccht) { // return C[i][j] return *(colcounts + i * outerwd + j); } if ((i-ccht+1)+j <= halfccwd) { // return C[ccht-1][i-ccht+1+j] return *(colcounts + (ccht-1) * outerwd + (i-ccht+1+j)); } if (j-(i-ccht+1) >= halfccwd) { // return C[ccht-1][j-(i-ccht+1)] return *(colcounts + (ccht-1) * outerwd + (j-(i-ccht+1))); } // return C[ccht-1][halfccwd + ((i+j+ccht+halfccwd+1) % 2)] return *(colcounts + (ccht-1) * outerwd + (halfccwd + ((i+j+ccht+halfccwd+1) % 2))); } // ----------------------------------------------------------------------------- void ltlalgo::faster_Neumann_bounded(int mincol, int minrow, int maxcol, int maxrow) { // use Dean Hickerson's algorithm (based on Adam P. Goucher's algorithm for the // Moore neighborhood) to calculate extended von Neumann neighborhood counts // in a bounded universe; note that currgrid is surrounded by a border that // might contain live cells (the border is range+1 cells thick and the // outermost cells are always dead) // the given limits are relative to currgrid so we need to add border // so they are relative to outergrid1, and then expand them by range int bmr = border - range; int bpr = border + range; minrow += bmr; mincol += bmr; maxrow += bpr; maxcol += bpr; // set variables used below and in getcount nrows = maxrow - minrow + 1; ncols = maxcol - mincol + 1; ccht = nrows + (ncols-1)/2; halfccwd = ncols/2; // calculate cumulative counts in top left corner of colcounts for (int i = 0; i < ccht; i++) { int* Coffset = colcounts + i * outerwd; unsigned char* Goffset = outergrid1 + (i + minrow) * outerwd; int im1 = i - 1; int im2 = im1 - 1; for (int j = 0; j < ncols; j++) { int* Cij = Coffset + j; *Cij = getcount(im1,j-1) + getcount(im1,j+1) - getcount(im2,j); if (i < nrows) { unsigned char* Gij = Goffset + j + mincol; if (*Gij == 1) *Cij += *Gij; } } } // set minrow and mincol for update_current_grid calls minrow -= border; mincol -= border; // calculate final neighborhood counts and update the corresponding cells in the grid bool rowchanged = false; for (int i = range; i < nrows-range; i++) { int im1 = i - 1; int ipr = i + range; int iprm1 = ipr - 1; int imrm1 = i - range - 1; int imrm2 = imrm1 - 1; int ipminrow = i + minrow; unsigned char* stateptr = currgrid + ipminrow*outerwd + range + mincol; for (int j = range; j < ncols-range; j++) { int jpr = j + range; int jmr = j - range; int n = getcount(ipr,j) - getcount(im1,jpr+1) - getcount(im1,jmr-1) + getcount(imrm2,j) + getcount(iprm1,j) - getcount(im1,jpr) - getcount(im1,jmr) + getcount(imrm1,j); unsigned char state = *stateptr; update_current_grid(state, n); *stateptr++ = state; if (state) { int jpmincol = j + mincol; if (jpmincol < minx) minx = jpmincol; if (jpmincol > maxx) maxx = jpmincol; rowchanged = true; } } if (rowchanged) { if (ipminrow < miny) miny = ipminrow; if (ipminrow > maxy) maxy = ipminrow; rowchanged = false; } } } // ----------------------------------------------------------------------------- void ltlalgo::faster_Neumann_unbounded(int mincol, int minrow, int maxcol, int maxrow) { // use Dean Hickerson's algorithm (based on Adam P. Goucher's algorithm for the // Moore neighborhood) to calculate extended von Neumann neighborhood counts // in an unbounded universe; note that we can safely assume there is at least // a 2*range border of dead cells surrounding the pattern // set variables used below and in getcount nrows = maxrow - minrow + 1; ncols = maxcol - mincol + 1; ccht = nrows + (ncols-1)/2; halfccwd = ncols/2; // calculate cumulative counts in top left corner of colcounts for (int i = 0; i < ccht; i++) { int* Coffset = colcounts + i * outerwd; unsigned char* Goffset = outergrid1 + (i + minrow) * outerwd; int im1 = i - 1; int im2 = im1 - 1; for (int j = 0; j < ncols; j++) { int* Cij = Coffset + j; *Cij = getcount(im1,j-1) + getcount(im1,j+1) - getcount(im2,j); if (i < nrows) { unsigned char* Gij = Goffset + j + mincol; if (*Gij == 1) *Cij += *Gij; } } } // calculate final neighborhood counts and update the corresponding cells in the grid bool rowchanged = false; for (int i = 0; i < nrows; i++) { int im1 = i - 1; int ipr = i + range; int iprm1 = ipr - 1; int imrm1 = i - range - 1; int imrm2 = imrm1 - 1; int ipminrow = i + minrow; unsigned char* stateptr = currgrid + ipminrow*outerwd + mincol; for (int j = 0; j < ncols; j++) { int jpr = j + range; int jmr = j - range; int n = getcount(ipr,j) - getcount(im1,jpr+1) - getcount(im1,jmr-1) + getcount(imrm2,j) + getcount(iprm1,j) - getcount(im1,jpr) - getcount(im1,jmr) + getcount(imrm1,j); unsigned char state = *stateptr; update_current_grid(state, n); *stateptr++ = state; if (state) { int jpmincol = j + mincol; if (jpmincol < minx) minx = jpmincol; if (jpmincol > maxx) maxx = jpmincol; rowchanged = true; } } if (rowchanged) { if (ipminrow < miny) miny = ipminrow; if (ipminrow > maxy) maxy = ipminrow; rowchanged = false; } } } // ----------------------------------------------------------------------------- void ltlalgo::fast_Neumann(int mincol, int minrow, int maxcol, int maxrow) { if (range == 1) { int outerwd2 = outerwd * 2; for (int y = minrow; y <= maxrow; y++) { int yoffset = y * outerwd; unsigned char* topy = currgrid + yoffset; for (int x = mincol; x <= maxcol; x++) { // count the state-1 neighbors within the current range // using the extended von Neumann neighborhood with no edge checks // (at range 1 a diamond is a cross: +) int ncount = 0; unsigned char* cellptr = topy + (x - 1); if (*cellptr++ == 1) ncount++; if (*cellptr++ == 1) ncount++; if (*cellptr == 1) ncount++; cellptr -= outerwd; if (*--cellptr == 1) ncount++; cellptr += outerwd2; if (*cellptr == 1) ncount++; update_next_grid(x, y, yoffset+x, ncount); } } } else { // range > 1 for (int y = minrow; y <= maxrow; y++) { int yoffset = y * outerwd; int ymrange = y - range; int yprange = y + range; unsigned char* topy = currgrid + ymrange * outerwd; for (int x = mincol; x <= maxcol; x++) { // count the state-1 neighbors within the current range // using the extended von Neumann neighborhood (diamond) with no edge checks int ncount = 0; int xoffset = 0; unsigned char* rowptr = topy; for (int j = ymrange; j < y; j++) { unsigned char* cellptr = rowptr + (x - xoffset); int len = 2 * xoffset + 1; for (int i = 0; i < len; i++) { if (*cellptr++ == 1) ncount++; } xoffset++; // 0, 1, 2, ..., range rowptr += outerwd; } // xoffset == range for (int j = y; j <= yprange; j++) { unsigned char* cellptr = rowptr + (x - xoffset); int len = 2 * xoffset + 1; for (int i = 0; i < len; i++) { if (*cellptr++ == 1) ncount++; } xoffset--; // range-1, ..., 2, 1, 0 rowptr += outerwd; } update_next_grid(x, y, yoffset+x, ncount); } } } } // ----------------------------------------------------------------------------- void ltlalgo::do_bounded_gen() { // limit processing to rectangle where births/deaths can occur int mincol, minrow, maxcol, maxrow; bool torus = topology == 'T'; if (minB == 0) { // birth in every dead cell so process entire grid mincol = 0; minrow = 0; maxcol = gwdm1; maxrow = ghtm1; } else { mincol = minx - range; minrow = miny - range; maxcol = maxx + range; maxrow = maxy + range; // check if the limits are outside the grid edges if (mincol < 0) { mincol = 0; if (torus) maxcol = gwdm1; } if (maxcol > gwdm1) { maxcol = gwdm1; if (torus) mincol = 0; } if (minrow < 0) { minrow = 0; if (torus) maxrow = ghtm1; } if (maxrow > ghtm1) { maxrow = ghtm1; if (torus) minrow = 0; } } // save pattern limits for clearing border cells at end int sminx = minx; int smaxx = maxx; int sminy = miny; int smaxy = maxy; if (torus) { // If a pattern edge is within range of a grid edge then copy cells // into appropriate border cells next to the opposite grid edge, // as illustrated in this example of a grid with range 1 (so border = 2). // The live cells at "a" will be copied to the "A" locations and the // live cell at corner "b" will be copied to the three "B" locations: // // <-------------- outerwd --------------> // o-------------------------------------- ^ o = outergrid1 // | | | // | <------------- gwd -------------> | | // | c-------------------------------- | | c = currgrid // | B| aa ^ b| | | // | | | | | | // | | ght | |outerht // | | | | | | // | | v | | | // | --------------------------------- | | // | B AA B | | // | | | // --------------------------------------- v // if (miny < range) { // copy cells near top edge of currgrid to bottom border int numrows = range - miny; int numcols = maxx - minx + 1; unsigned char* src = currgrid + miny * outerwd + minx; unsigned char* dest = src + ght * outerwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } if (minx < range) { // copy cells near top left corner of currgrid to bottom right border numcols = range - minx; src = currgrid + miny * outerwd + minx; dest = src + ght * outerwd + gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } } } if (maxy + range > ghtm1) { // copy cells near bottom edge of currgrid to top border int numrows = maxy + range - ghtm1; int numcols = maxx - minx + 1; unsigned char* src = currgrid + (ght - range) * outerwd + minx; unsigned char* dest = src - ght * outerwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } if (maxx + range > gwdm1) { // copy cells near bottom right corner of currgrid to top left border numcols = maxx + range - gwdm1; src = currgrid + (ght - range) * outerwd + gwd - range; dest = src - ght * outerwd - gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } } } if (minx < range) { // copy cells near left edge of currgrid to right border int numrows = maxy - miny + 1; int numcols = range - minx; unsigned char* src = currgrid + miny * outerwd + minx; unsigned char* dest = src + gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } if (maxy + range > ghtm1) { // copy cells near bottom left corner of currgrid to top right border numrows = maxy + range - ghtm1; src = currgrid + (ght - range) * outerwd + minx; dest = src - ght * outerwd + gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } } } if (maxx + range > gwdm1) { // copy cells near right edge of currgrid to left border int numrows = maxy - miny + 1; int numcols = maxx + range - gwdm1; unsigned char* src = currgrid + miny * outerwd + gwd - range; unsigned char* dest = src - gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } if (miny < range) { // copy cells near top right corner of currgrid to bottom left border numrows = range - miny; src = currgrid + miny * outerwd + gwd - range; dest = src + ght * outerwd - gwd; for (int row = 0; row < numrows; row++) { memcpy(dest, src, numcols); src += outerwd; dest += outerwd; } } } } // reset minx,miny,maxx,maxy for first birth or survivor in nextgrid empty_boundaries(); // create next generation if (ntype == 'M') { if (colcounts) { if (maxCellStates == 2) { faster_Moore_bounded2(mincol, minrow, maxcol, maxrow); } else { faster_Moore_bounded(mincol, minrow, maxcol, maxrow); } } else { fast_Moore(mincol, minrow, maxcol, maxrow); } } else if (ntype == 'N') { if (colcounts) { faster_Neumann_bounded(mincol, minrow, maxcol, maxrow); } else { fast_Neumann(mincol, minrow, maxcol, maxrow); } } else { fast_Shaped(mincol, minrow, maxcol, maxrow); } // if using one grid with a torus then clear border cells copied above if (colcounts && torus) { if (sminy < range) { // clear cells in bottom border int numrows = range - sminy; int numcols = smaxx - sminx + 1; unsigned char* src = currgrid + sminy * outerwd + sminx; unsigned char* dest = src + ght * outerwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } if (sminx < range) { // clear cells in bottom right border numcols = range - sminx; src = currgrid + sminy * outerwd + sminx; dest = src + ght * outerwd + gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } } } if (smaxy + range > ghtm1) { // clear cells in top border int numrows = smaxy + range - ghtm1; int numcols = smaxx - sminx + 1; unsigned char* src = currgrid + (ght - range) * outerwd + sminx; unsigned char* dest = src - ght * outerwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } if (smaxx + range > gwdm1) { // clear cells in top left border numcols = smaxx + range - gwdm1; src = currgrid + (ght - range) * outerwd + gwd - range; dest = src - ght * outerwd - gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } } } if (sminx < range) { // clear cells in right border int numrows = smaxy - sminy + 1; int numcols = range - sminx; unsigned char* src = currgrid + sminy * outerwd + sminx; unsigned char* dest = src + gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } if (smaxy + range > ghtm1) { // clear cells in top right border numrows = smaxy + range - ghtm1; src = currgrid + (ght - range) * outerwd + sminx; dest = src - ght * outerwd + gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } } } if (smaxx + range > gwdm1) { // clear cells in left border int numrows = smaxy - sminy + 1; int numcols = smaxx + range - gwdm1; unsigned char* src = currgrid + sminy * outerwd + gwd - range; unsigned char* dest = src - gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } if (sminy < range) { // clear cells in bottom left border numrows = range - sminy; src = currgrid + sminy * outerwd + gwd - range; dest = src + ght * outerwd - gwd; for (int row = 0; row < numrows; row++) { memset(dest, 0, numcols); dest += outerwd; } } } } } // ----------------------------------------------------------------------------- bool ltlalgo::do_unbounded_gen() { int mincol = minx - range; int minrow = miny - range; int maxcol = maxx + range; int maxrow = maxy + range; if (mincol < range || maxcol > gwdm1-range || minrow < range || maxrow > ghtm1-range) { // pattern boundary is too close to a grid edge so expand the universe in that // direction, and possibly shrink the universe in the opposite direction int inc = MAXRANGE * 2; int up = minrow < range ? inc : 0; int down = maxrow > ghtm1-range ? inc : 0; int left = mincol < range ? inc : 0; int right = maxcol > gwdm1-range ? inc : 0; // check for possible shrinkage (pattern might be a spaceship) if (up > 0 && down == 0 && maxrow < ghtm1-range) down = -(ghtm1-maxrow-range); if (down > 0 && up == 0 && minrow > range) up = -(minrow-range); if (left > 0 && right == 0 && maxcol < gwdm1-range) right = -(gwdm1-maxcol-range); if (right > 0 && left == 0 && mincol > range) left = -(mincol-range); const char* errmsg = resize_grids(up, down, left, right); if (errmsg) { lifewarning(errmsg); // no need to check show_warning here return false; // stop generating } mincol = minx - range; minrow = miny - range; maxcol = maxx + range; maxrow = maxy + range; } // reset minx,miny,maxx,maxy for first birth or survivor in nextgrid empty_boundaries(); if (ntype == 'M') { if (colcounts) { if (maxCellStates == 2) { faster_Moore_unbounded2(mincol, minrow, maxcol, maxrow); } else { faster_Moore_unbounded(mincol, minrow, maxcol, maxrow); } } else { fast_Moore(mincol, minrow, maxcol, maxrow); } } else if (ntype == 'N') { if (colcounts) { faster_Neumann_unbounded(mincol, minrow, maxcol, maxrow); } else { fast_Neumann(mincol, minrow, maxcol, maxrow); } } else { fast_Shaped(mincol, minrow, maxcol, maxrow); } return true; } // ----------------------------------------------------------------------------- // Do increment generations. void ltlalgo::step() { bigint t = increment; while (t != 0) { if (population > 0 || minB == 0) { int prevpop = population; // calculate the next generation in nextgrid if (unbounded) { if (!do_unbounded_gen()) { // failed to resize universe so stop generating poller->setInterrupted(); return; } } else { do_bounded_gen(); } // swap outergrid1 and outergrid2 if using fast_* algo if (outergrid2) { unsigned char* temp = outergrid1; outergrid1 = outergrid2; outergrid2 = temp; // swap currgrid and nextgrid temp = currgrid; currgrid = nextgrid; nextgrid = temp; // kill all cells in outergrid2 if (prevpop > 0) memset(outergrid2, 0, outerbytes); } } generation += bigint::one; // this is a safe place to check for user events if (poller->inner_poll()) return; t -= 1; // user might have changed increment if (t > increment) t = increment; } } // ----------------------------------------------------------------------------- void ltlalgo::save_cells() { for (int y = miny; y <= maxy; y++) { int yoffset = y * outerwd; for (int x = minx; x <= maxx; x++) { unsigned char* currcell = currgrid + yoffset + x; if (*currcell) { cell_list.push_back(x + gleft); cell_list.push_back(y + gtop); cell_list.push_back(*currcell); } } } } // ----------------------------------------------------------------------------- void ltlalgo::restore_cells() { clipped_cells.clear(); for (size_t i = 0; i < cell_list.size(); i += 3) { int x = cell_list[i]; int y = cell_list[i+1]; int s = cell_list[i+2]; // check if x,y is outside grid if (x < gleft || x > gright || y < gtop || y > gbottom) { // store clipped cells so that GUI code (eg. ClearOutsideGrid) // can remember them in case this rule change is undone clipped_cells.push_back(x); clipped_cells.push_back(y); clipped_cells.push_back(s); } else { setcell(x, y, s); } } cell_list.clear(); } // ----------------------------------------------------------------------------- // Switch to the given rule if it is valid. const char *ltlalgo::setrule(const char *s) { int r, c, m, s1, s2, b1, b2, endpos; char n; if (sscanf(s, "R%d,C%d,M%d,S%d..%d,B%d..%d,N%c%n", &r, &c, &m, &s1, &s2, &b1, &b2, &n, &endpos) != 8) { // try alternate LtL syntax as defined by Kellie Evans; // eg: 5,34,45,34,58 is equivalent to R5,C0,M1,S34..58,B34..45,NM if (sscanf(s, "%d,%d,%d,%d,%d%n", &r, &b1, &b2, &s1, &s2, &endpos) == 5) { c = 0; m = 1; n = 'M'; } else { return "bad syntax in Larger than Life rule"; } } if (r < 1) return "R value is too small"; int r2 = r*r+r ; if (r > MAXRANGE) return "R value is too big"; if (c < 0 || c > 256) return "C value must be from 0 to 256"; if (m < 0 || m > 1) return "M value must be 0 or 1"; if (s1 > s2) return "S minimum must be <= S maximum"; if (b1 > b2) return "B minimum must be <= B maximum"; if (n != 'M' && n != 'N' && n != 'C') return "N must be followed by M or N or C"; int maxn = n == 'M' ? (2*r+1)*(2*r+1) : 2*r*(r+1)+1; int tshape[2*MAXRANGE+1] ; if (n == 'C') { int cnt = 0 ; for (int i=-r; i<=r; i++) { int w = 0 ; while ((w + 1) * (w + 1) + (i * i) <= r2) w++ ; tshape[i+r] = w ; cnt += 2 * w + 1 ; } maxn = cnt ; } maxn -= (1 - m); // adjust max neighbors by middle cell setting if (s1 < 0 || s1 > maxn || s2 < 0 || s2 > maxn) return "S value must be from 0 to max neighbors"; if (b1 < 0 || b1 > maxn || b2 < 0 || b2 > maxn) return "B value must be from 0 to max neighbors"; if (s[endpos] != 0 && s[endpos] != ':') return "bad suffix"; char t = 'T'; int newwd = DEFAULTSIZE; int newht = DEFAULTSIZE; // check for explicit suffix like ":T200,100" const char *suffix = strchr(s, ':'); if (suffix && suffix[1] != 0) { if (suffix[1] == 'T' || suffix[1] == 't') { t = 'T'; } else if (suffix[1] == 'P' || suffix[1] == 'p') { t = 'P'; } else { return "bad topology in suffix (must be torus or plane)"; } if (suffix[2] != 0) { bool oneval = false; if (sscanf(suffix+2, "%d,%d%n", &newwd, &newht, &endpos) != 2) { if (sscanf(suffix+2, "%d%n", &newwd, &endpos) != 1) { return "bad grid size"; } else { newht = newwd; oneval = true; if (suffix[endpos+2] != 0) { if (suffix[endpos+2] == ',' && suffix[endpos+3] == 0) { // allow dangling comma after width to be consistent with lifealgo::setgridsize } else { return "unexpected character in suffix"; } } } } if (!oneval && suffix[endpos+2] != 0) return "unexpected character in suffix"; } if ((float)newwd * (float)newht > MAXCELLS) return "grid size is too big"; } if (!suffix) { // no suffix given so universe is unbounded if (b1 == 0) return "B0 is not allowed if universe is unbounded"; } // the given rule is valid int oldrange = range; char oldtype = ntype; int scount = c; range = r; rangec = r2; totalistic = m; minS = s1; maxS = s2; minB = b1; maxB = b2; ntype = n; topology = t; if (shape) free(shape) ; shape = (int *)calloc(sizeof(int), 2*r+1) ; for (int i=0; i<2*r+1; i++) { shape[i] = tshape[i] ; } // set the grid_type so the GUI code can display circles or diamonds in icon mode // (no circular grid, so adopt a square grid for now) #define CIRC_GRID SQUARE_GRID grid_type = ntype == 'M' ? SQUARE_GRID : (ntype == 'N' ? VN_GRID : CIRC_GRID) ; if (suffix) { // use a bounded universe int minsize = 2 * range; if (newwd < minsize) newwd = minsize; if (newht < minsize) newht = minsize; // if the new size is different or range has changed or ntype has changed // or the old universe is unbounded then we need to create new grids if (gwd != newwd || ght != newht || range != oldrange || ntype != oldtype || unbounded) { if (population > 0) { save_cells(); // store the current pattern in cell_list } // free the current grids and allocate new ones free(outergrid1); if (outergrid2) { free(outergrid2); outergrid2 = NULL; } create_grids(newwd, newht); if (cell_list.size() > 0) { // restore the pattern (if the new grid is smaller then any live cells // outside the grid will be saved in clipped_cells) restore_cells(); } } // tell GUI code not to call CreateBorderCells and DeleteBorderCells unbounded = false; // set bounded grid dimensions used by GUI code gridwd = gwd; gridht = ght; } else { // no suffix given so use an unbounded universe unbounded = true; // set unbounded grid dimensions used by GUI code gridwd = 0; gridht = 0; // check if previous universe was bounded if (gwd < outerwd) { // we could call resize_grids(-border,-border,-border,-border) // to remove the outer border but there's a (slight) danger // the call will fail due to lack of memory, so safer to use // the current grids and just shift the pattern position if (population > 0) { // shift pattern boundaries minx += border; maxx += border; miny += border; maxy += border; } currgrid = outergrid1; nextgrid = outergrid2; gwd = outerwd; ght = outerht; // set grid coordinates of cell at bottom right corner of grid gwdm1 = gwd - 1; ghtm1 = ght - 1; // adjust cell coordinates of grid edges gtop -= border; gleft -= border; gbottom = gtop + ghtm1; gright = gleft + gwdm1; // set bigint versions of grid edges (used by GUI code) gridtop = gtop; gridleft = gleft; gridbottom = gbottom; gridright = gright; } // reallocate colcounts if ntype has changed if (ntype != oldtype) { allocate_colcounts(); } if (colcounts == NULL && outergrid2 == NULL) { // this can happen if previous rule used NM and was unbounded, // and new rule uses NN and is unbounded and range <= SMALL_NN_RANGE outergrid2 = (unsigned char*) calloc(outerbytes, sizeof(unsigned char)); if (outergrid2 == NULL) lifefatal("Not enough memory for nextgrid!"); nextgrid = outergrid2; } if (colcounts && outergrid2) { // faster_* calls don't use outergrid2, so we deallocate it and // reset it to NULL (also necessary for test in step() loop) free(outergrid2); outergrid2 = NULL; nextgrid = NULL; } } // set the number of cell states if (scount > 2) { // show history maxCellStates = scount; } else { maxCellStates = 2; scount = 0; // show C0 in canonical rule } // set the canonical rule if (unbounded) { sprintf(canonrule, "R%d,C%d,M%d,S%d..%d,B%d..%d,N%c", range, scount, totalistic, minS, maxS, minB, maxB, ntype); } else { sprintf(canonrule, "R%d,C%d,M%d,S%d..%d,B%d..%d,N%c:%c%d,%d", range, scount, totalistic, minS, maxS, minB, maxB, ntype, topology, gwd, ght); } // adjust the survival range if the center cell is not included if (totalistic == 0) { minS++; maxS++; } return 0; } // ----------------------------------------------------------------------------- const char* ltlalgo::getrule() { return canonrule; } // ----------------------------------------------------------------------------- const char* ltlalgo::DefaultRule() { return DEFAULTRULE; } // ----------------------------------------------------------------------------- static lifealgo *creator() { return new ltlalgo(); } void ltlalgo::doInitializeAlgoInfo(staticAlgoInfo& ai) { ai.setAlgorithmName("Larger than Life"); ai.setAlgorithmCreator(&creator); ai.setDefaultBaseStep(10); ai.setDefaultMaxMem(0); ai.minstates = 2; ai.maxstates = 256; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = yellow ai.defg1 = 255; ai.defb1 = 0; ai.defr2 = 255; // end color = red ai.defg2 = 0; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-3.3-src/gollybase/util.h0000644000175000017500000000576513273534663013353 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * Basic utility classes for things like fatal errors. */ #ifndef UTIL_H #define UTIL_H #include // for FILE * void lifefatal(const char *s) ; void lifewarning(const char *s) ; void lifestatus(const char *s) ; void lifebeginprogress(const char *dlgtitle) ; bool lifeabortprogress(double fracdone, const char *newmsg) ; void lifeendprogress() ; const char *lifegetuserrules() ; const char *lifegetrulesdir() ; bool isaborted() ; FILE *getdebugfile() ; /** * Sick of line ending woes. This class takes care of this for us. */ class linereader { public: linereader(FILE *f) ; char *fgets(char *buf, int maxlen) ; void setfile(FILE *f) ; void setcloseonfree() ; int close() ; ~linereader() ; private: int lastchar ; int closeonfree ; FILE *fp ; } ; /** * To substitute your own routines, use the following class. */ class lifeerrors { public: virtual void fatal(const char *s) = 0 ; virtual void warning(const char *s) = 0 ; virtual void status(const char *s) = 0 ; virtual void beginprogress(const char *dlgtitle) = 0 ; virtual bool abortprogress(double fracdone, const char *newmsg) = 0 ; virtual void endprogress() = 0 ; virtual const char *getuserrules() = 0 ; virtual const char *getrulesdir() = 0 ; static void seterrorhandler(lifeerrors *obj) ; bool aborted ; } ; /** * If a fast popcount routine is available, this macro indicates its * availability. The popcount should be a 32-bit popcount. The * __builtin_popcount by gcc and clang works fine on any platform. * The __popcount intrinsic on Visual Studio does *not* without a * CPUID check, so we don't do fast popcounts yet on Windows. */ #ifdef __GNUC__ #define FASTPOPCOUNT __builtin_popcount #endif #ifdef __clang__ #define FASTPOPCOUNT __builtin_popcount #endif /** * A routine to get the number of seconds elapsed since an arbitrary * point, as a double. */ double gollySecondCount() ; /* * Performance data. We keep running values here. We can copy this * to "mark" variables, and then report performance for deltas. */ struct hperf { void clear() { fastNodeInc = 0 ; nodesCalculated = 0 ; depthSum = 0 ; timeStamp = gollySecondCount() ; genval = 0 ; frames = 0 ; halfNodes = 0 ; } void report(hperf&, int verbose) ; void reportStep(hperf&, hperf&, double genval, int verbose) ; int fastinc(int depth, int half) { depthSum += depth ; if (half) halfNodes++ ; if ((++fastNodeInc & reportMask) == 0) return 1 ; else return 0 ; } double getReportInterval() { return reportInterval ; } void setReportInterval(double v) { reportInterval = v ; } int fastNodeInc ; double frames ; double nodesCalculated ; double halfNodes ; double depthSum ; double timeStamp ; double genval ; static int reportMask ; static double reportInterval ; } ; #endif golly-3.3-src/gollybase/jvnalgo.h0000644000175000017500000000124713145740437014021 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef JVNALGO_H #define JVNALGO_H #include "ghashbase.h" /** * Our JvN algo class. */ class jvnalgo : public ghashbase { public: jvnalgo() ; virtual ~jvnalgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: enum { JvN29, Nobili32, Hutton32 } current_rule ; }; #endif golly-3.3-src/gollybase/ghashbase.h0000644000175000017500000001763513247734027014317 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef GHASHBASE_H #define GHASHBASE_H #include "lifealgo.h" #include "liferules.h" #include "util.h" /* * This class forms the basis of all hashlife-type algorithms except * the highly-optimized hlifealgo (which is most appropriate for * simple two-state automata). This more generalized class is used * for multi-state algorithms. */ /** * The size of a state. Unsigned char works for now. */ typedef unsigned char state ; /** * Nodes, like the standard hlifealgo nodes. */ struct ghnode { ghnode *next ; /* hash link */ ghnode *nw, *ne, *sw, *se ; /* constant; nw != 0 means nonjleaf */ ghnode *res ; /* cache */ } ; /* * Leaves, like the standard hlifealgo leaves. */ struct ghleaf { ghnode *next ; /* hash link */ ghnode *isghnode ; /* must always be zero for leaves */ state nw, ne, sw, se ; /* constant */ bigint leafpop ; /* how many set bits */ } ; /* * If it is a struct ghnode, this returns a non-zero value, otherwise it * returns a zero value. */ #define is_ghnode(n) (((ghnode *)(n))->nw) /* * For explicit prefetching we retain some state for our lookup * routines. */ #ifdef USEPREFETCH struct ghsetup_t { g_uintptr_t h ; struct ghnode *nw, *ne, *sw, *se ; void prefetch(struct ghnode **addr) const { PREFETCH(addr) ; } } ; #endif /** * Our ghashbase class. Note that this is an abstract class; you need * to expand specific methods to specialize it for a particular multi-state * automata. */ class ghashbase : public lifealgo { public: ghashbase() ; virtual ~ghashbase() ; // This is the method that computes the next generation, slowly. // This should be overridden by a deriving class. virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) = 0 ; // note that for ghashbase, clearall() releases no memory; it retains // the full cache information but just sets the current pattern to // the empty pattern. virtual void clearall() ; virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &v) ; virtual void endofpattern() ; virtual void setIncrement(bigint inc) ; virtual void setIncrement(int inc) { setIncrement(bigint(inc)) ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; virtual int hyperCapable() { return 1 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmem >> 20) ; } virtual const char *setrule(const char *) ; virtual const char *getrule() { return "" ; } virtual void step() ; virtual void* getcurrentstate() { return root ; } virtual void setcurrentstate(void *n) ; /* * The contract of draw() is that it render every pixel in the * viewport precisely once. This allows us to eliminate all * flashing. Later we'll make this be damage-specific. */ virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *readmacrocell(char *line) ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: /* * Some globals representing our universe. The root is the * real root of the universe, and the depth is the depth of the * tree where 2 means that root is a ghleaf, and 3 means that the * children of root are leaves, and so on. The center of the * root is always coordinate position (0,0), so at startup the * x and y coordinates range from -4..3; in general, * -(2**depth)..(2**depth)-1. The zeroghnodea is an * array of canonical `empty-space' ghnodes at various depths. * The ngens is an input parameter which is the second power of * the number of generations to run. */ ghnode *root ; int depth ; ghnode **zeroghnodea ; int nzeros ; /* * Finally, our gc routine. We keep a `stack' of all the `roots' * we want to preserve. Nodes not reachable from here, we allow to * be freed. Same with leaves. */ ghnode **stack ; int stacksize ; g_uintptr_t hashpop, hashlimit, hashprime ; #ifndef PRIMEMOD g_uintptr_t hashmask ; #endif static double maxloadfactor ; ghnode **hashtab ; int halvesdone ; int gsp ; g_uintptr_t alloced, maxmem ; ghnode *freeghnodes ; int okaytogc ; g_uintptr_t totalthings ; ghnode *ghnodeblocks ; bigint population ; bigint setincrement ; bigint pow2step ; // greatest power of two in increment int nonpow2 ; // increment / pow2step int ngens ; // log2(pow2step) int popValid, needPop, inGC ; /* * When rendering we store the relevant bits here rather than * passing them deep into recursive subroutines. */ liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag ; int llbits, llsize ; char *llxb, *llyb ; int hashed ; int cacheinvalid ; g_uintptr_t cellcounter ; // used when writing g_uintptr_t writecells ; // how many to write int gccount ; // how many gcs total this pattern int gcstep ; // how many gcs this step hperf running_hperf, step_hperf, inc_hperf ; int softinterrupt ; static char statusline[] ; // void resize() ; ghnode *find_ghnode(ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) ; #ifdef USEPREFETCH ghnode *find_ghnode(ghsetup_t &su) ; void setupprefetch(ghsetup_t &su, ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) ; #endif void unhash_ghnode(ghnode *n) ; void unhash_ghnode2(ghnode *n) ; void rehash_ghnode(ghnode *n) ; ghleaf *find_ghleaf(state nw, state ne, state sw, state se) ; ghnode *getres(ghnode *n, int depth) ; ghnode *dorecurs(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) ; ghnode *dorecurs_half(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) ; ghleaf *dorecurs_ghleaf(ghleaf *n, ghleaf *ne, ghleaf *t, ghleaf *e) ; ghnode *newghnode() ; ghleaf *newghleaf() ; ghnode *newclearedghnode() ; ghleaf *newclearedghleaf() ; void pushroot_1() ; int ghnode_depth(ghnode *n) ; ghnode *zeroghnode(int depth) ; ghnode *pushroot(ghnode *n) ; ghnode *gsetbit(ghnode *n, int x, int y, int newstate, int depth) ; int getbit(ghnode *n, int x, int y, int depth) ; int nextbit(ghnode *n, int x, int y, int depth, int &v) ; ghnode *hashpattern(ghnode *root, int depth) ; ghnode *popzeros(ghnode *n) ; const bigint &calcpop(ghnode *root, int depth) ; void aftercalcpop2(ghnode *root, int depth) ; void afterwritemc(ghnode *root, int depth) ; void calcPopulation() ; ghnode *save(ghnode *n) ; void pop(int n) ; void clearstack() ; void clearcache() ; void gc_mark(ghnode *root, int invalidate) ; void do_gc(int invalidate) ; void clearcache(ghnode *n, int depth, int clearto) ; void clearcache_p1(ghnode *n, int depth, int clearto) ; void clearcache_p2(ghnode *n, int depth, int clearto) ; void new_ngens(int newval) ; int log2(unsigned int n) ; ghnode *runpattern() ; void renderbm(int x, int y) ; void fill_ll(int d) ; void drawghnode(ghnode *n, int llx, int lly, int depth, ghnode *z) ; void ensure_hashed() ; g_uintptr_t writecell(std::ostream &os, ghnode *root, int depth) ; g_uintptr_t writecell_2p1(ghnode *root, int depth) ; g_uintptr_t writecell_2p2(std::ostream &os, ghnode *root, int depth) ; void drawpixel(int x, int y); void draw4x4_1(state sw, state se, state nw, state ne, int llx, int lly) ; void draw4x4_1(ghnode *n, ghnode *z, int llx, int lly) ; // AKT: set all pixels to background color void killpixels(); } ; #endif golly-3.3-src/gollybase/hlifealgo.cpp0000644000175000017500000017767713543255652014675 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /* * hlife 0.99 by Radical Eye Software. * * All good ideas here were originated by Gosper or Bell or others, I'm * sure, and all bad ones by yours truly. * * The main reason I wrote this program was to attempt to push out the * evaluation of metacatacryst as far as I could. So this program * really does very little other than compute life as far into the * future as possible, using as little memory as possible (and reusing * it if necessary). No UI, few options. */ #include "hlifealgo.h" #include "util.h" #include #include #include using namespace std ; /* * Power of two hash sizes work fine. */ #ifdef PRIMEMOD #define HASHMOD(a) ((a)%hashprime) static g_uintptr_t nexthashsize(g_uintptr_t i) { g_uintptr_t j ; i |= 1 ; for (;; i+=2) { for (j=3; j*j<=i; j+=2) if (i % j == 0) break ; if (j*j > i) return i ; } } #else #define HASHMOD(a) ((a)&(hashmask)) static g_uintptr_t nexthashsize(g_uintptr_t i) { while ((i & (i - 1))) i += (i & (1 + ~i)) ; // i & - i is more idiomatic but generates warning return i ; } #endif /* * Note that all the places we represent 4-squares by short, we use * unsigned shorts; this is so we can directly index into these arrays. */ static unsigned char shortpop[65536] ; /* * The cached result of an 8-square is a new 4-square representing * two generations into the future. This subroutine calculates that * future, assuming ruletable is calculated (see below). The code * that it uses is similar to code you'll see again, so we explain * what's going on in some detail. * * Each time we build a leaf node, we compute the result, because it * is reasonably quick. * * The first generation result of an 8-square is a 6-square, which * we represent as nine 2-squares. The nine 2-squares are called * t00 through t22, and are arranged in a matrix: * * t00 t01 t02 * t10 t11 t12 * t20 t21 t22 * * To compute each of these, we need to extract the relevant bits * from the four 4-square values n->nw, n->ne, n->sw, and n->ne. * We can use these values to directly index into the ruletable * array. * * Then, given the nine values, we can compute a resulting 4-square * by computing four 2-square results, and combining these into a * single 4-square. * * It's a bit intricate, but it's not really overwhelming. */ #define combine9(t00,t01,t02,t10,t11,t12,t20,t21,t22) \ ((t00) << 15) | ((t01) << 13) | (((t02) << 11) & 0x1000) | \ (((t10) << 7) & 0x880) | ((t11) << 5) | (((t12) << 3) & 0x110) | \ (((t20) >> 1) & 0x8) | ((t21) >> 3) | ((t22) >> 5) void hlifealgo::leafres(leaf *n) { unsigned short t00 = ruletable[n->nw], t01 = ruletable[((n->nw << 2) & 0xcccc) | ((n->ne >> 2) & 0x3333)], t02 = ruletable[n->ne], t10 = ruletable[((n->nw << 8) & 0xff00) | ((n->sw >> 8) & 0x00ff)], t11 = ruletable[((n->nw << 10) & 0xcc00) | ((n->ne << 6) & 0x3300) | ((n->sw >> 6) & 0x00cc) | ((n->se >> 10) & 0x0033)], t12 = ruletable[((n->ne << 8) & 0xff00) | ((n->se >> 8) & 0x00ff)], t20 = ruletable[n->sw], t21 = ruletable[((n->sw << 2) & 0xcccc) | ((n->se >> 2) & 0x3333)], t22 = ruletable[n->se] ; n->res1 = combine9(t00,t01,t02,t10,t11,t12,t20,t21,t22) ; n->res2 = (ruletable[(t00 << 10) | (t01 << 8) | (t10 << 2) | t11] << 10) | (ruletable[(t01 << 10) | (t02 << 8) | (t11 << 2) | t12] << 8) | (ruletable[(t10 << 10) | (t11 << 8) | (t20 << 2) | t21] << 2) | ruletable[(t11 << 10) | (t12 << 8) | (t21 << 2) | t22] ; n->leafpop = bigint((short)(shortpop[n->nw] + shortpop[n->ne] + shortpop[n->sw] + shortpop[n->se])) ; } /* * We do now support garbage collection, but there are some routines we * call frequently to help us. */ #ifdef PRIMEMOD #define node_hash(a,b,c,d) (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) #else g_uintptr_t node_hash(void *a, void *b, void *c, void *d) { g_uintptr_t r = (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) ; r += (r >> 11) ; return r ; } #endif #define leaf_hash(a,b,c,d) (65537*(d)+257*(c)+17*(b)+5*(a)) /* * Resize the hash. The max load factor defined here does not actually * yield the maximum load factor the hash will see, because when we * do the last resize before exhausting memory, we may find we are * not permitted (while keeping total memory consumption below the * limit) to do the resize, so the actual max load factor may be * somewhat higher. Conversely, because we double the hash size * each time, the actual final max load factor may be less than this. * Additional code can be added to manage this, but after some * experimentation, it has been found that the impact is tiny, so * we are keeping the code simple. Nonetheless, this factor can be * tweaked in the case where you absolutely want as many nodes as * possible in memory, and are willing to use a large load factor to * permit this; with the move-to-front heuristic, the code actually * handles a large load factor fairly well. */ double hlifealgo::maxloadfactor = 0.7 ; void hlifealgo::resize() { #ifndef NOGCBEFORERESIZE if (okaytogc) { do_gc(0) ; // faster resizes if we do a gc first } #endif g_uintptr_t i, nhashprime = nexthashsize(2 * hashprime) ; node *p, **nhashtab ; if (hashprime > (totalthings >> 2)) { if (alloced > maxmem || nhashprime * sizeof(node *) > (maxmem - alloced)) { hashlimit = G_MAX ; return ; } } if (verbose) { sprintf(statusline, "Resizing hash to %" PRIuPTR "...", nhashprime) ; lifestatus(statusline) ; } nhashtab = (node **)calloc(nhashprime, sizeof(node *)) ; if (nhashtab == 0) { lifewarning("Out of memory; running in a somewhat slower mode; " "try reducing the hash memory limit after restarting.") ; hashlimit = G_MAX ; return ; } alloced += sizeof(node *) * (nhashprime - hashprime) ; g_uintptr_t ohashprime = hashprime ; hashprime = nhashprime ; #ifndef PRIMEMOD hashmask = hashprime - 1 ; #endif for (i=0; inext ; g_uintptr_t h ; if (is_node(p)) { h = node_hash(p->nw, p->ne, p->sw, p->se) ; } else { leaf *l = (leaf *)p ; h = leaf_hash(l->nw, l->ne, l->sw, l->se) ; } h = HASHMOD(h) ; p->next = nhashtab[h] ; nhashtab[h] = p ; p = np ; } } free(hashtab) ; hashtab = nhashtab ; hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * These next two routines are (nearly) our only hash table access * routines; we simply look up the passed in information. If we * find it in the hash table, we return it; otherwise, we build a * new node and store it in the hash table, and return that. */ node *hlifealgo::find_node(node *nw, node *ne, node *sw, node *se) { node *p ; g_uintptr_t h = node_hash(nw,ne,sw,se) ; node *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newnode() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; save(p) ; if (hashpop > hashlimit) resize() ; return p ; } leaf *hlifealgo::find_leaf(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se) { leaf *p ; leaf *pred = 0 ; g_uintptr_t h = leaf_hash(nw, ne, sw, se) ; h = HASHMOD(h) ; for (p=(leaf *)hashtab[h]; p; p = (leaf *)p->next) { if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se && !is_node(p)) { if (pred) { pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = (node *)p ; } return (leaf *)save((node *)p) ; } pred = p ; } p = newleaf() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; leafres(p) ; p->isnode = 0 ; p->next = hashtab[h] ; hashtab[h] = (node *)p ; hashpop++ ; save((node *)p) ; if (hashpop > hashlimit) resize() ; return p ; } /* * The following routine does the same, but first it checks to see if * the cached result is any good. If it is, it directly returns that. * Otherwise, it figures out whether to call the leaf routine or the * non-leaf routine by whether two nodes down is a leaf node or not. * (We'll understand why this is a bit later.) All the sp stuff is * stack pointer and garbage collection stuff. */ node *hlifealgo::getres(node *n, int depth) { if (n->res) return n->res ; node *res = 0 ; /** * This routine be the only place we assign to res. We use * the fact that the poll routine is *sticky* to allow us to * manage unwinding the stack without munging our data * structures. Note that there may be many find_nodes * and getres called before we finally actually exit from * here, because the stack is deep and we don't want to * put checks throughout the code. Instead we need two * calls here, one to prevent us going deeper, and another * to prevent us from destroying the cache field. */ if (poller->poll() || softinterrupt) return zeronode(depth-1) ; int sp = gsp ; if (running_hperf.fastinc(depth, ngens < depth)) running_hperf.report(inc_hperf, verbose) ; depth-- ; if (ngens >= depth) { if (is_node(n->nw)) { res = dorecurs(n->nw, n->ne, n->sw, n->se, depth) ; } else { res = (node *)dorecurs_leaf((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } } else { if (is_node(n->nw)) { res = dorecurs_half(n->nw, n->ne, n->sw, n->se, depth) ; } else if (ngens == 0) { res = (node *)dorecurs_leaf_quarter((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } else { res = (node *)dorecurs_leaf_half((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } } pop(sp) ; if (softinterrupt || poller->isInterrupted()) // don't assign this to the cache field! res = zeronode(depth) ; else { if (ngens < depth && halvesdone < 1000) halvesdone++ ; n->res = res ; } return res ; } #ifdef USEPREFETCH void hlifealgo::setupprefetch(setup_t &su, node *nw, node *ne, node *sw, node *se) { su.h = node_hash(nw,ne,sw,se) ; su.nw = nw ; su.ne = ne ; su.sw = sw ; su.se = se ; su.prefetch(hashtab + HASHMOD(su.h)) ; } node *hlifealgo::find_node(setup_t &su) { node *p ; node *pred = 0 ; g_uintptr_t h = HASHMOD(su.h) ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (su.nw == p->nw && su.ne == p->ne && su.sw == p->sw && su.se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newnode() ; p->nw = su.nw ; p->ne = su.ne ; p->sw = su.sw ; p->se = su.se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; save(p) ; if (hashpop > hashlimit) resize() ; return p ; } node *hlifealgo::dorecurs(node *n, node *ne, node *t, node *e, int depth) { int sp = gsp ; setup_t su[5] ; setupprefetch(su[2], n->se, ne->sw, t->ne, e->nw) ; setupprefetch(su[0], n->ne, ne->nw, n->se, ne->sw) ; setupprefetch(su[1], ne->sw, ne->se, e->nw, e->ne) ; setupprefetch(su[3], n->sw, n->se, t->nw, t->ne) ; setupprefetch(su[4], t->ne, e->nw, t->se, e->sw) ; node *t00 = getres(n, depth), *t01 = getres(find_node(su[0]), depth), *t02 = getres(ne, depth), *t12 = getres(find_node(su[1]), depth), *t11 = getres(find_node(su[2]), depth), *t10 = getres(find_node(su[3]), depth), *t20 = getres(t, depth), *t21 = getres(find_node(su[4]), depth), *t22 = getres(e, depth) ; setupprefetch(su[0], t11, t12, t21, t22) ; setupprefetch(su[1], t10, t11, t20, t21) ; setupprefetch(su[2], t00, t01, t10, t11) ; setupprefetch(su[3], t01, t02, t11, t12) ; node *t44 = getres(find_node(su[0]), depth), *t43 = getres(find_node(su[1]), depth), *t33 = getres(find_node(su[2]), depth), *t34 = getres(find_node(su[3]), depth) ; n = find_node(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } #else /* * So let's say the cached way failed. How do we do it the slow way? * Recursively, of course. For an n-square (composed of the four * n/2-squares passed in, compute the n/2-square that is n/4 * generations ahead. * * This routine works exactly the same as the leafres() routine, only * instead of working on an 8-square, we're working on an n-square, * returning an n/2-square, and we build that n/2-square by first building * 9 n/4-squares, use those to calculate 4 more n/4-squares, and * then put these together into a new n/2-square. Simple, eh? */ node *hlifealgo::dorecurs(node *n, node *ne, node *t, node *e, int depth) { int sp = gsp ; node *t11 = getres(find_node(n->se, ne->sw, t->ne, e->nw), depth), *t00 = getres(n, depth), *t01 = getres(find_node(n->ne, ne->nw, n->se, ne->sw), depth), *t02 = getres(ne, depth), *t12 = getres(find_node(ne->sw, ne->se, e->nw, e->ne), depth), *t10 = getres(find_node(n->sw, n->se, t->nw, t->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_node(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth), *t44 = getres(find_node(t11, t12, t21, t22), depth), *t43 = getres(find_node(t10, t11, t20, t21), depth), *t33 = getres(find_node(t00, t01, t10, t11), depth), *t34 = getres(find_node(t01, t02, t11, t12), depth) ; n = find_node(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } #endif /* * Same as above, but we only do one step instead of 2. */ node *hlifealgo::dorecurs_half(node *n, node *ne, node *t, node *e, int depth) { int sp = gsp ; node *t00 = getres(n, depth), *t01 = getres(find_node(n->ne, ne->nw, n->se, ne->sw), depth), *t10 = getres(find_node(n->sw, n->se, t->nw, t->ne), depth), *t11 = getres(find_node(n->se, ne->sw, t->ne, e->nw), depth), *t02 = getres(ne, depth), *t12 = getres(find_node(ne->sw, ne->se, e->nw, e->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_node(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth) ; if (depth > 3) { n = find_node(find_node(t00->se, t01->sw, t10->ne, t11->nw), find_node(t01->se, t02->sw, t11->ne, t12->nw), find_node(t10->se, t11->sw, t20->ne, t21->nw), find_node(t11->se, t12->sw, t21->ne, t22->nw)) ; } else { n = find_node((node *)find_leaf(((leaf *)t00)->se, ((leaf *)t01)->sw, ((leaf *)t10)->ne, ((leaf *)t11)->nw), (node *)find_leaf(((leaf *)t01)->se, ((leaf *)t02)->sw, ((leaf *)t11)->ne, ((leaf *)t12)->nw), (node *)find_leaf(((leaf *)t10)->se, ((leaf *)t11)->sw, ((leaf *)t20)->ne, ((leaf *)t21)->nw), (node *)find_leaf(((leaf *)t11)->se, ((leaf *)t12)->sw, ((leaf *)t21)->ne, ((leaf *)t22)->nw)) ; } pop(sp) ; return save(n) ; } /* * If the node is a 16-node, then the constituents are leaves, so we * need a very similar but still somewhat different subroutine. Since * we do not (yet) garbage collect leaves, we don't need all that * save/pop mumbo-jumbo. */ leaf *hlifealgo::dorecurs_leaf(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res2, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res2, t02 = ne->res2, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res2, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res2, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res2, t20 = t->res2, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res2, t22 = e->res2 ; return find_leaf(find_leaf(t00, t01, t10, t11)->res2, find_leaf(t01, t02, t11, t12)->res2, find_leaf(t10, t11, t20, t21)->res2, find_leaf(t11, t12, t21, t22)->res2) ; } /* * Same as above but we only do two generations. */ #define combine4(t00,t01,t10,t11) (unsigned short)\ ((((t00)<<10)&0xcc00)|(((t01)<<6)&0x3300)|(((t10)>>6)&0xcc)|(((t11)>>10)&0x33)) leaf *hlifealgo::dorecurs_leaf_half(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res2, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res2, t02 = ne->res2, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res2, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res2, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res2, t20 = t->res2, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res2, t22 = e->res2 ; return find_leaf(combine4(t00, t01, t10, t11), combine4(t01, t02, t11, t12), combine4(t10, t11, t20, t21), combine4(t11, t12, t21, t22)) ; } /* * Same as above but we only do one generation. */ leaf *hlifealgo::dorecurs_leaf_quarter(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res1, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res1, t02 = ne->res1, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res1, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res1, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res1, t20 = t->res1, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res1, t22 = e->res1 ; return find_leaf(combine4(t00, t01, t10, t11), combine4(t01, t02, t11, t12), combine4(t10, t11, t20, t21), combine4(t11, t12, t21, t22)) ; } /* * We keep free nodes in a linked list for allocation, and we allocate * them 1000 at a time. */ node *hlifealgo::newnode() { node *r ; if (freenodes == 0) { int i ; freenodes = (node *)calloc(1001, sizeof(node)) ; if (freenodes == 0) lifefatal("Out of memory; try reducing the hash memory limit.") ; alloced += 1001 * sizeof(node) ; freenodes->next = nodeblocks ; nodeblocks = freenodes++ ; for (i=0; i<999; i++) { freenodes[1].next = freenodes ; freenodes++ ; } totalthings += 1000 ; } if (freenodes->next == 0 && alloced + 1000 * sizeof(node) > maxmem && okaytogc) { do_gc(0) ; } r = freenodes ; freenodes = freenodes->next ; return r ; } /* * Leaves are the same. */ leaf *hlifealgo::newleaf() { leaf *r = (leaf *)newnode() ; new(&(r->leafpop))bigint ; return r ; } /* * Sometimes we want the new node or leaf to be automatically cleared * for us. */ node *hlifealgo::newclearednode() { return (node *)memset(newnode(), 0, sizeof(node)) ; } leaf *hlifealgo::newclearedleaf() { leaf *r = (leaf *)newclearednode() ; new(&(r->leafpop))bigint ; return r ; } hlifealgo::hlifealgo() { int i ; /* * The population of one-bits in an integer is one more than the * population of one-bits in the integer with one fewer bit set, * and we can turn off a bit by anding an integer with the next * lower integer. */ if (shortpop[1] == 0) for (i=1; i<65536; i++) shortpop[i] = shortpop[i & (i - 1)] + 1 ; hashprime = nexthashsize(1000) ; #ifndef PRIMEMOD hashmask = hashprime - 1 ; #endif hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; hashpop = 0 ; hashtab = (node **)calloc(hashprime, sizeof(node *)) ; if (hashtab == 0) lifefatal("Out of memory (1).") ; alloced = hashprime * sizeof(node *) ; ngens = 0 ; stacksize = 0 ; halvesdone = 0 ; nzeros = 0 ; stack = 0 ; gsp = 0 ; maxmem = 256 * 1024 * 1024 ; freenodes = 0 ; okaytogc = 0 ; totalthings = 0 ; nodeblocks = 0 ; zeronodea = 0 ; ruletable = hliferules.rule0 ; /* * We initialize our universe to be a 16-square. We are in drawing * mode at this point. */ root = (node *)newclearednode() ; population = 0 ; generation = 0 ; increment = 1 ; setincrement = 1 ; nonpow2 = 1 ; pow2step = 1 ; llsize = 0 ; depth = 3 ; hashed = 0 ; popValid = 0 ; needPop = 0 ; inGC = 0 ; cacheinvalid = 0 ; gccount = 0 ; gcstep = 0 ; running_hperf.clear() ; inc_hperf = running_hperf ; step_hperf = running_hperf ; softinterrupt = 0 ; } /** * Destructor frees memory. */ hlifealgo::~hlifealgo() { free(hashtab) ; while (nodeblocks) { node *r = nodeblocks ; nodeblocks = nodeblocks->next ; free(r) ; } if (zeronodea) free(zeronodea) ; if (stack) free(stack) ; if (llsize) { delete [] llxb ; delete [] llyb ; } } /** * Set increment. */ void hlifealgo::setIncrement(bigint inc) { if (inc < increment) softinterrupt = 1 ; increment = inc ; } /** * Do a step. */ void hlifealgo::step() { poller->bailIfCalculating() ; // we use while here because the increment may be changed while we are // doing the hashtable sweep; if that happens, we may need to sweep // again. while (1) { int cleareddownto = 1000000000 ; softinterrupt = 0 ; while (increment != setincrement) { bigint pendingincrement = increment ; int newpow2 = 0 ; bigint t = pendingincrement ; while (t > 0 && t.even()) { newpow2++ ; t.div2() ; } nonpow2 = t.low31() ; if (t != nonpow2) lifefatal("bad increment") ; int downto = newpow2 ; if (ngens < newpow2) downto = ngens ; if (newpow2 != ngens && cleareddownto > downto) { new_ngens(newpow2) ; cleareddownto = downto ; } else { ngens = newpow2 ; } setincrement = pendingincrement ; pow2step = 1 ; while (newpow2--) pow2step += pow2step ; } gcstep = 0 ; running_hperf.genval = generation.todouble() ; for (int i=0; iisInterrupted()) // we *were* interrupted break ; popValid = 0 ; root = newroot ; depth = node_depth(root) ; } running_hperf.reportStep(step_hperf, inc_hperf, generation.todouble(), verbose) ; if (poller->isInterrupted() || !softinterrupt) break ; } } void hlifealgo::setcurrentstate(void *n) { if (root != (node *)n) { root = (node *)n ; depth = node_depth(root) ; popValid = 0 ; } } /* * Set the max memory */ void hlifealgo::setMaxMemory(int newmemlimit) { if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (alloced > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmem = newlimit ; hashlimit = (g_uintptr_t)(maxloadfactor * hashprime) ; } /** * Clear everything. */ void hlifealgo::clearall() { lifefatal("clearall not implemented yet") ; } /* * This routine expands our universe by a factor of two, maintaining * centering. We use four new nodes, and *reuse* the root so this cannot * be called after we've started hashing. */ void hlifealgo::pushroot_1() { node *t ; t = newclearednode() ; t->se = root->nw ; root->nw = t ; t = newclearednode() ; t->sw = root->ne ; root->ne = t ; t = newclearednode() ; t->ne = root->sw ; root->sw = t ; t = newclearednode() ; t->nw = root->se ; root->se = t ; depth++ ; } /* * Return the depth of this node (2 is 8x8). */ int hlifealgo::node_depth(node *n) { int depth = 2 ; while (is_node(n)) { depth++ ; n = n->nw ; } return depth ; } /* * This routine returns the canonical clear space node at a particular * depth. */ node *hlifealgo::zeronode(int depth) { while (depth >= nzeros) { int nnzeros = 2 * nzeros + 10 ; zeronodea = (node **)realloc(zeronodea, nnzeros * sizeof(node *)) ; if (zeronodea == 0) lifefatal("Out of memory (2).") ; alloced += (nnzeros - nzeros) * sizeof(node *) ; while (nzeros < nnzeros) zeronodea[nzeros++] = 0 ; } if (zeronodea[depth] == 0) { if (depth == 2) { zeronodea[depth] = (node *)find_leaf(0, 0, 0, 0) ; } else { node *z = zeronode(depth-1) ; zeronodea[depth] = find_node(z, z, z, z) ; } } return zeronodea[depth] ; } /* * Same, but with hashed nodes. */ node *hlifealgo::pushroot(node *n) { int depth = node_depth(n) ; zeronode(depth+1) ; // ensure enough zero nodes for rendering node *z = zeronode(depth-1) ; return find_node(find_node(z, z, z, n->nw), find_node(z, z, n->ne, z), find_node(z, n->sw, z, z), find_node(n->se, z, z, z)) ; } /* * Here is our recursive routine to set a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. We allocate new nodes and * leaves on our way down. * * Note that at this point our universe lives outside the hash table * and has not been canonicalized, and that many of the pointers in * the nodes can be null. We'll patch this up in due course. */ node *hlifealgo::gsetbit(node *n, int x, int y, int newstate, int depth) { if (depth == 2) { leaf *l = (leaf *)n ; if (hashed) { unsigned short nw = l->nw ; unsigned short sw = l->sw ; unsigned short ne = l->ne ; unsigned short se = l->se ; if (newstate) { if (x < 0) if (y < 0) sw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else nw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 0) se |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else ne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; } else { if (x < 0) if (y < 0) sw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else nw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else if (y < 0) se &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else ne &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; } return save((node *)find_leaf(nw, ne, sw, se)) ; } if (newstate) { if (x < 0) if (y < 0) l->sw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else l->nw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 0) l->se |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else l->ne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; } else { if (x < 0) if (y < 0) l->sw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else l->nw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else if (y < 0) l->se &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else l->ne &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; } return (node *)l ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 32) { if (depth == 32) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } depth-- ; node **nptr ; if (depth+1 == this->depth || depth < 31) { if (x < 0) { if (y < 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y < 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } } else { if (x >= 0) { if (y >= 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y >= 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } } if (*nptr == 0) { if (depth == 2) *nptr = (node *)newclearedleaf() ; else *nptr = newclearednode() ; } node *s = gsetbit(*nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, newstate, depth) ; if (hashed) { node *nw = (nptr == &(n->nw) ? s : n->nw) ; node *sw = (nptr == &(n->sw) ? s : n->sw) ; node *ne = (nptr == &(n->ne) ? s : n->ne) ; node *se = (nptr == &(n->se) ? s : n->se) ; n = save(find_node(nw, ne, sw, se)) ; } else { *nptr = s ; } return n ; } } /* * Here is our recursive routine to get a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int hlifealgo::getbit(node *n, int x, int y, int depth) { struct node tnode ; while (depth >= 32) { tnode.nw = n->nw->se ; tnode.ne = n->ne->sw ; tnode.sw = n->sw->ne ; tnode.se = n->se->nw ; n = &tnode ; depth-- ; } if (depth == 2) { leaf *l = (leaf *)n ; int test = 0 ; if (x < 0) if (y < 0) test = (l->sw & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else test = (l->nw & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else if (y < 0) test = (l->se & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else test = (l->ne & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; if (test) return 1 ; return 0 ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 32) { if (depth == 32) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } depth-- ; node *nptr ; if (x < 0) { if (y < 0) nptr = n->sw ; else nptr = n->nw ; } else { if (y < 0) nptr = n->se ; else nptr = n->ne ; } if (nptr == 0 || nptr == zeronode(depth)) return 0 ; return getbit(nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, depth) ; } } /* * Here is our recursive routine to get the next bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int hlifealgo::nextbit(node *n, int x, int y, int depth) { if (n == 0 || n == zeronode(depth)) return -1 ; if (depth == 2) { leaf *l = (leaf *)n ; int test = 0 ; if (y < 0) test = (((l->sw >> (4 * (y & 3))) & 15) << 4) | ((l->se >> (4 * (y & 3))) & 15) ; else test = (((l->nw >> (4 * (y & 3))) & 15) << 4) | ((l->ne >> (4 * (y & 3))) & 15) ; test &= (1 << (4 - x)) - 1 ; if (test) { int r = 0 ; int b = 1 << (3 - x) ; while ((test & b) == 0) { r++ ; b >>= 1 ; } return r ; } return -1 ; // none found } else { unsigned int w = 0, wh = 0 ; w = 1 << depth ; wh = 1 << (depth - 1) ; node *lft, *rght ; depth-- ; if (y < 0) { lft = n->sw ; rght = n->se ; } else { lft = n->nw ; rght = n->ne ; } int r = 0 ; if (x < 0) { int t = nextbit(lft, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth) ; if (t >= 0) return t ; r = -x ; x = 0 ; } int t = nextbit(rght, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth) ; if (t >= 0) return r + t ; return -1 ; } } /* * Our nonrecurse top-level bit setting routine simply expands the * universe as necessary to encompass the passed-in coordinates, and * then invokes the recursive setbit. Right now it works hashed or * unhashed (but it's faster when unhashed). We also turn on the inGC * flag to inhibit popcount. */ int hlifealgo::setcell(int x, int y, int newstate) { if (newstate & ~1) return -1 ; if (hashed) { clearstack() ; save(root) ; okaytogc = 1 ; } inGC = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } root = gsetbit(root, x, y, newstate, depth) ; if (hashed) { okaytogc = 0 ; } return 0 ; } /* * Our nonrecurse top-level bit getting routine. */ int hlifealgo::getcell(int x, int y) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } if (sx > 0 || sx < -1 || sy > 0 || sy < -1) return 0 ; return getbit(root, x, y, depth) ; } /* * A recursive bit getting routine, but this one returns the * number of pixels to the right to the next set cell in the * current universe, or -1 if none set to the right, or if * the next set pixel is out of range. */ int hlifealgo::nextcell(int x, int y, int &v) { v = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } if (depth > 30) { struct node tnode = *root ; int mdepth = depth ; while (mdepth > 30) { tnode.nw = tnode.nw->se ; tnode.ne = tnode.ne->sw ; tnode.sw = tnode.sw->ne ; tnode.se = tnode.se->nw ; mdepth-- ; } return nextbit(&tnode, x, y, mdepth) ; } return nextbit(root, x, y, depth) ; } /* * Canonicalize a universe by filling in the null pointers and then * invoking find_node on each node. Drops the original universe on * the floor [big deal, it's probably small anyway]. */ node *hlifealgo::hashpattern(node *root, int depth) { node *r ; if (root == 0) { r = zeronode(depth) ; } else if (depth == 2) { leaf *n = (leaf *)root ; r = (node *)find_leaf(n->nw, n->ne, n->sw, n->se) ; n->next = freenodes ; freenodes = root ; } else { depth-- ; r = find_node(hashpattern(root->nw, depth), hashpattern(root->ne, depth), hashpattern(root->sw, depth), hashpattern(root->se, depth)) ; root->next = freenodes ; freenodes = root ; } return r ; } void hlifealgo::endofpattern() { poller->bailIfCalculating() ; if (!hashed) { root = hashpattern(root, depth) ; zeronode(depth) ; hashed = 1 ; } popValid = 0 ; needPop = 0 ; inGC = 0 ; } void hlifealgo::ensure_hashed() { if (!hashed) endofpattern() ; } /* * Pop off any levels we don't need. */ node *hlifealgo::popzeros(node *n) { int depth = node_depth(n) ; while (depth > 3) { node *z = zeronode(depth-2) ; if (n->nw->nw == z && n->nw->ne == z && n->nw->sw == z && n->ne->nw == z && n->ne->ne == z && n->ne->se == z && n->sw->nw == z && n->sw->sw == z && n->sw->se == z && n->se->ne == z && n->se->sw == z && n->se->se == z) { depth-- ; n = find_node(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw) ; } else { break ; } } return n ; } /* * A lot of the routines from here on down traverse the universe, hanging * information off the nodes. The way they generally do so is by using * (or abusing) the cache (res) field, and the least significant bit of * the hash next field (as a visited bit). */ #define marked(n) (1 & (g_uintptr_t)(n)->next) #define mark(n) ((n)->next = (node *)(1 | (g_uintptr_t)(n)->next)) #define clearmark(n) ((n)->next = (node *)(~1 & (g_uintptr_t)(n)->next)) #define clearmarkbit(p) ((node *)(~1 & (g_uintptr_t)(p))) /* * Sometimes we want to use *res* instead of next to mark. You cannot * do this to leaves, though. */ #define marked2(n) (3 & (g_uintptr_t)(n)->res) #define mark2(n) ((n)->res = (node *)(1 | (g_uintptr_t)(n)->res)) #define mark2v(n,v) ((n)->res = (node *)(v | (g_uintptr_t)(n)->res)) #define clearmark2(n) ((n)->res = (node *)(~3 & (g_uintptr_t)(n)->res)) void hlifealgo::unhash_node(node *n) { node *p ; g_uintptr_t h = node_hash(n->nw,n->ne,n->sw,n->se) ; node *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; (!is_node(p) || !marked2(p)) && p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find node to unhash") ; } void hlifealgo::unhash_node2(node *n) { node *p ; g_uintptr_t h = node_hash(n->nw,n->ne,n->sw,n->se) ; node *pred = 0 ; h = HASHMOD(h) ; for (p=hashtab[h]; p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find node to unhash 2") ; } void hlifealgo::rehash_node(node *n) { g_uintptr_t h = node_hash(n->nw,n->ne,n->sw,n->se) ; h = HASHMOD(h) ; n->next = hashtab[h] ; hashtab[h] = n ; } /* * This recursive routine calculates the population by hanging the * population on marked nodes. */ const bigint &hlifealgo::calcpop(node *root, int depth) { if (root == zeronode(depth)) return bigint::zero ; if (depth == 2) return ((leaf *)root)->leafpop ; if (marked2(root)) return *(bigint*)&(root->next) ; depth-- ; if (root->next == 0) mark2v(root, 3) ; else { unhash_node(root) ; mark2(root) ; } /** * We use allocate-in-place bigint constructor here to initialize the * node. This should compile to a single instruction. */ new(&(root->next))bigint( calcpop(root->nw, depth), calcpop(root->ne, depth), calcpop(root->sw, depth), calcpop(root->se, depth)) ; return *(bigint *)&(root->next) ; } /* * Call this after doing something that unhashes nodes in order to * use the next field as a temp pointer. */ void hlifealgo::aftercalcpop2(node *root, int depth) { if (depth == 2 || root == zeronode(depth)) return ; int v = marked2(root) ; if (v) { clearmark2(root) ; depth-- ; if (depth > 2) { aftercalcpop2(root->nw, depth) ; aftercalcpop2(root->ne, depth) ; aftercalcpop2(root->sw, depth) ; aftercalcpop2(root->se, depth) ; } ((bigint *)&(root->next))->~bigint() ; if (v == 3) root->next = 0 ; else rehash_node(root) ; } } /* * Call this after writing macrocell. */ void hlifealgo::afterwritemc(node *root, int depth) { if (root == zeronode(depth)) return ; if (depth == 2) { root->nw = 0 ; return ; } if (marked2(root)) { clearmark2(root) ; depth-- ; afterwritemc(root->nw, depth) ; afterwritemc(root->ne, depth) ; afterwritemc(root->sw, depth) ; afterwritemc(root->se, depth) ; rehash_node(root) ; } } /* * This top level routine calculates the population of a universe. */ void hlifealgo::calcPopulation() { int depth ; ensure_hashed() ; depth = node_depth(root) ; population = calcpop(root, depth) ; aftercalcpop2(root, depth) ; } /* * Is the universe empty? */ int hlifealgo::isEmpty() { ensure_hashed() ; return root == zeronode(depth) ; } /* * This routine marks a node as needed to be saved. */ node *hlifealgo::save(node *n) { if (gsp >= stacksize) { int nstacksize = stacksize * 2 + 100 ; alloced += sizeof(node *)*(nstacksize-stacksize) ; stack = (node **)realloc(stack, nstacksize * sizeof(node *)) ; if (stack == 0) lifefatal("Out of memory (3).") ; stacksize = nstacksize ; } stack[gsp++] = n ; return n ; } /* * This routine pops the stack back to a previous depth. */ void hlifealgo::pop(int n) { gsp = n ; } /* * This routine clears the stack altogether. */ void hlifealgo::clearstack() { gsp = 0 ; } /* * Do a gc. Walk down from all nodes reachable on the stack, saveing * them by setting the odd bit on the next link. Then, walk the hash, * eliminating the res from everything that's not saveed, and moving * the nodes from the hash to the freelist as appropriate. Finally, * walk the hash again, clearing the low order bits in the next pointers. */ void hlifealgo::gc_mark(node *root, int invalidate) { if (!marked(root)) { mark(root) ; if (is_node(root)) { gc_mark(root->nw, invalidate) ; gc_mark(root->ne, invalidate) ; gc_mark(root->sw, invalidate) ; gc_mark(root->se, invalidate) ; if (root->res) { if (invalidate) root->res = 0 ; else gc_mark(root->res, invalidate) ; } } } } /** * If the invalidate flag is set, we want to kill *all* cache entries * and recalculate all leaves. */ void hlifealgo::do_gc(int invalidate) { int i ; g_uintptr_t freed_nodes=0 ; node *p, *pp ; inGC = 1 ; gccount++ ; gcstep++ ; if (verbose) { if (gcstep > 1) sprintf(statusline, "GC #%d(%d)", gccount, gcstep) ; else sprintf(statusline, "GC #%d", gccount) ; lifestatus(statusline) ; } for (i=nzeros-1; i>=0; i--) if (zeronodea[i] != 0) break ; if (i >= 0) gc_mark(zeronodea[i], 0) ; // never invalidate zeronode if (root != 0) gc_mark(root, invalidate) ; // pick up the root for (i=0; ipoll() ; gc_mark(stack[i], invalidate) ; } for (i=0; inext) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) { if (marked(pp)) { g_uintptr_t h = 0 ; if (pp->nw) { /* yes, it's a node */ h = HASHMOD(node_hash(pp->nw, pp->ne, pp->sw, pp->se)) ; } else { leaf *lp = (leaf *)pp ; if (invalidate) leafres(lp) ; h = HASHMOD(leaf_hash(lp->nw, lp->ne, lp->sw, lp->se)) ; } pp->next = hashtab[h] ; hashtab[h] = pp ; hashpop++ ; } else { pp->next = freenodes ; freenodes = pp ; freed_nodes++ ; } } } inGC = 0 ; if (verbose) { double perc = (double)freed_nodes / (double)totalthings * 100.0 ; sprintf(statusline+strlen(statusline), " freed %g percent (%" PRIuPTR ").", perc, freed_nodes) ; lifestatus(statusline) ; } if (needPop) { calcPopulation() ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } } /* * Clear the cache bits down to the appropriate level, marking the * nodes we've handled. */ void hlifealgo::clearcache(node *n, int depth, int clearto) { if (!marked(n)) { mark(n) ; if (depth > 3) { depth-- ; poller->poll() ; clearcache(n->nw, depth, clearto) ; clearcache(n->ne, depth, clearto) ; clearcache(n->sw, depth, clearto) ; clearcache(n->se, depth, clearto) ; if (n->res) clearcache(n->res, depth, clearto) ; } if (depth >= clearto) n->res = 0 ; } } /* * Clear the entire cache of everything, and recalculate all leaves. * This can be very expensive. */ void hlifealgo::clearcache() { cacheinvalid = 1 ; } /* * Change the ngens value. Requires us to walk the hash, clearing * the cache fields of any nodes that do not have the appropriate * values. */ void hlifealgo::new_ngens(int newval) { g_uintptr_t i ; node *p, *pp ; int clearto = ngens ; if (newval > ngens && halvesdone == 0) { ngens = newval ; return ; } #ifndef NOGCBEFOREINC do_gc(0) ; #endif if (verbose) { strcpy(statusline, "Changing increment...") ; lifestatus(statusline) ; } if (newval < clearto) clearto = newval ; clearto++ ; /* clear this depth and above */ if (clearto < 3) clearto = 3 ; ngens = newval ; inGC = 1 ; for (i=0; inext)) if (is_node(p) && !marked(p)) clearcache(p, node_depth(p), clearto) ; for (p=nodeblocks; p; p=p->next) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) clearmark(pp) ; } halvesdone = 0 ; inGC = 0 ; if (needPop) { calcPopulation() ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * Return log2. */ int hlifealgo::log2(unsigned int n) { int r = 0 ; while ((n & 1) == 0) { n >>= 1 ; r++ ; } if (n != 1) { lifefatal("Expected power of two!") ; } return r ; } static bigint negone = -1 ; const bigint &hlifealgo::getPopulation() { // note: if called during gc, then we cannot call calcPopulation // since that will mess up the gc. if (!popValid) { if (inGC) { needPop = 1 ; return negone ; } else if (poller->isCalculating()) { // AKT: avoid calling poller->bailIfCalculating return negone ; } else { calcPopulation() ; popValid = 1 ; needPop = 0 ; } } return population ; } /* * Finally, we get to run the pattern. We first ensure that all * clearspace nodes and the input pattern is never garbage * collected; we turn on garbage collection, and then we invoke our * magic top-level routine passing in clearspace borders that are * guaranteed large enough. */ node *hlifealgo::runpattern() { node *n = root ; save(root) ; // do this in case we interrupt generation ensure_hashed() ; okaytogc = 1 ; if (cacheinvalid) { do_gc(1) ; // invalidate the entire cache and recalc leaves cacheinvalid = 0 ; } int depth = node_depth(n) ; node *n2 ; n = pushroot(n) ; depth++ ; n = pushroot(n) ; depth++ ; while (ngens + 2 > depth) { n = pushroot(n) ; depth++ ; } save(zeronode(nzeros-1)) ; save(n) ; n2 = getres(n, depth) ; okaytogc = 0 ; clearstack() ; if (halvesdone == 1 && n->res != 0) { n->res = 0 ; halvesdone = 0 ; } if (poller->isInterrupted() || softinterrupt) return 0 ; // indicate it was interrupted n = popzeros(n2) ; generation += pow2step ; return n ; } const char *hlifealgo::readmacrocell(char *line) { int n=0 ; g_uintptr_t i=1, nw=0, ne=0, sw=0, se=0, indlen=0 ; int r, d ; node **ind = 0 ; root = 0 ; while (getline(line, 10000)) { if (i >= indlen) { g_uintptr_t nlen = i + indlen + 10 ; ind = (node **)realloc(ind, sizeof(node*) * nlen) ; if (ind == 0) lifefatal("Out of memory (4).") ; while (indlen < nlen) ind[indlen++] = 0 ; } if (line[0] == '.' || line[0] == '*' || line[0] == '$') { int x=0, y=7 ; unsigned short lnw=0, lne=0, lsw=0, lse=0 ; char *p = 0 ; for (p=line; *p > ' '; p++) { switch(*p) { case '*': if (x > 7 || y < 0) return "Illegal coordinates in readmacrocell." ; if (x < 4) if (y < 4) lsw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else lnw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 4) lse |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else lne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; /* note: fall through here */ case '.': x++ ; break ; case '$': x = 0 ; y-- ; break ; default: return "Illegal character in readmacrocell." ; } } clearstack() ; ind[i++] = (node *)find_leaf(lnw, lne, lsw, lse) ; } else if (line[0] == '#') { char *p, *pp ; const char *err ; switch (line[1]) { case 'R': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; // AKT: need to check for B0-not-Smax rule err = hliferules.setrule(p, this); if (err) return err; if (hliferules.alternate_rules) return "B0-not-Smax rules are not allowed in HashLife."; break ; case 'G': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp >= '0' && *pp <= '9') pp++ ; *pp = 0 ; generation = bigint(p) ; break ; // either: // #FRAMES count base inc // or // #FRAME index node case 'F': if (strncmp(line, "#FRAMES ", 8) == 0) { p = line + 8 ; while (*p && *p <= ' ') p++ ; long cnt = atol(p) ; if (cnt < 0 || cnt > MAX_FRAME_COUNT) return "Bad FRAMES line" ; destroytimeline() ; while ('0' <= *p && *p <= '9') p++ ; while (*p && *p <= ' ') p++ ; pp = p ; while ((*pp >= '0' && *pp <= '9') || *pp == ',') pp++ ; if (*pp == 0) return "Bad FRAMES line" ; *pp = 0 ; timeline.start = bigint(p) ; timeline.end = timeline.start ; timeline.next = timeline.start ; p = pp + 1 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; if (strchr(p, '^')) { int tbase=0, texpo=0 ; if (sscanf(p, "%d^%d", &tbase, &texpo) != 2 || tbase < 2 || texpo < 0) return "Bad FRAMES line" ; timeline.base = tbase ; timeline.expo = texpo ; timeline.inc = 1 ; while (texpo--) timeline.inc.mul_smallint(tbase) ; } else { timeline.inc = bigint(p) ; // if it's a power of two, we're good int texpo = timeline.inc.lowbitset() ; int tbase = 2 ; bigint test = 1 ; for (int i=0; i MAX_FRAME_COUNT || frameind < 0 || nodeind > i || timeline.framecount != frameind) return "Bad FRAME line" ; timeline.frames.push_back(ind[nodeind]) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } break ; } } else { n = sscanf(line, "%d %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %d", &d, &nw, &ne, &sw, &se, &r) ; if (n < 0) // blank line; permit continue ; if (n == 0) { // conversion error in first argument; we allow only if the only // content on the line is whitespace. char *ws = line ; while (*ws && *ws <= ' ') ws++ ; if (*ws > 0) return "Parse error in macrocell format." ; continue ; } if (n < 5) // AKT: best not to use lifefatal here because user won't see any // error message when reading clipboard data starting with "[..." return "Parse error in readmacrocell." ; if (d < 4) return "Oops; bad depth in readmacrocell." ; ind[0] = zeronode(d-2) ; /* allow zeros to work right */ if (nw >= i || ind[nw] == 0 || ne >= i || ind[ne] == 0 || sw >= i || ind[sw] == 0 || se >= i || ind[se] == 0) { return "Node out of range in readmacrocell." ; } clearstack() ; root = ind[i++] = find_node(ind[nw], ind[ne], ind[sw], ind[se]) ; depth = d - 1 ; } } if (ind) free(ind) ; if (root == 0) { // AKT: allow empty macrocell pattern; note that endofpattern() // will be called soon so don't set hashed here // return "Invalid macrocell file: no nodes." ; return 0 ; } hashed = 1 ; return 0 ; } // Flip bits in given rule table. static void fliprule(char *rptr) { for (int i=0; i<65536; i++) { int j = ((i & 0xf) << 12) + ((i & 0xf0) << 4) + ((i & 0xf00) >> 4) + ((i & 0xf000) >> 12) ; if (i <= j) { char fi = rptr[i] ; char fj = rptr[j] ; fi = ((fi & 0x30) >> 4) + ((fi & 0x3) << 4) ; fj = ((fj & 0x30) >> 4) + ((fj & 0x3) << 4) ; rptr[i] = fj ; rptr[j] = fi ; } } } const char *hlifealgo::setrule(const char *s) { poller->bailIfCalculating() ; const char* err = hliferules.setrule(s, this); if (err) return err; // invert orientation if not hex or Wolfram if (!(hliferules.isHexagonal() || hliferules.isWolfram())) { fliprule(hliferules.rule0); } clearcache() ; if (hliferules.alternate_rules) return "B0-not-Smax rules are not allowed in HashLife."; if (hliferules.isHexagonal()) grid_type = HEX_GRID; else if (hliferules.isVonNeumann()) grid_type = VN_GRID; else grid_type = SQUARE_GRID; return 0 ; } void hlifealgo::unpack8x8(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se, unsigned int *top, unsigned int *bot) { *top = ((nw & 0xf000) << 16) | (((ne & 0xf000) | (nw & 0xf00)) << 12) | (((ne & 0xf00) | (nw & 0xf0)) << 8) | (((ne & 0xf0) | (nw & 0xf)) << 4) | (ne & 0xf) ; *bot = ((sw & 0xf000) << 16) | (((se & 0xf000) | (sw & 0xf00)) << 12) | (((se & 0xf00) | (sw & 0xf0)) << 8) | (((se & 0xf0) | (sw & 0xf)) << 4) | (se & 0xf) ; } /** * Write out the native macrocell format. This is the one we use when * we're not interactive and displaying a progress dialog. */ g_uintptr_t hlifealgo::writecell(std::ostream &os, node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_node2(root) ; mark2(root) ; } if (depth == 2) { int i, j ; unsigned int top, bot ; leaf *n = (leaf *)root ; thiscell = ++cellcounter ; root->nw = (node *)thiscell ; unpack8x8(n->nw, n->ne, n->sw, n->se, &top, &bot) ; for (j=7; (top | bot) && j>=0; j--) { int bits = (top >> 24) ; top = (top << 8) | (bot >> 24) ; bot = (bot << 8) ; for (i=0; bits && i<8; i++, bits = (bits << 1) & 255) if (bits & 128) os << '*' ; else os << '.' ; os << '$' ; } os << '\n' ; } else { g_uintptr_t nw = writecell(os, root->nw, depth-1) ; g_uintptr_t ne = writecell(os, root->ne, depth-1) ; g_uintptr_t sw = writecell(os, root->sw, depth-1) ; g_uintptr_t se = writecell(os, root->se, depth-1) ; thiscell = ++cellcounter ; root->next = (node *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n'; } return thiscell ; } /** * This new two-pass method works by doing a prepass that numbers the * nodes and counts the number of nodes that should be sent, so we can * display an accurate progress dialog. */ g_uintptr_t hlifealgo::writecell_2p1(node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_node2(root) ; mark2(root) ; } if (depth == 2) { thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->nw = (node *)thiscell ; } else { writecell_2p1(root->nw, depth-1) ; writecell_2p1(root->ne, depth-1) ; writecell_2p1(root->sw, depth-1) ; writecell_2p1(root->se, depth-1) ; thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->next = (node *)thiscell ; } return thiscell ; } /** * This one writes the cells, but assuming they've already been * numbered, and displaying a progress dialog. */ static char progressmsg[80] ; g_uintptr_t hlifealgo::writecell_2p2(std::ostream &os, node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (cellcounter + 1 != (g_uintptr_t)(root->nw)) return (g_uintptr_t)(root->nw) ; thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp(); sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } int i, j ; unsigned int top, bot ; leaf *n = (leaf *)root ; root->nw = (node *)thiscell ; unpack8x8(n->nw, n->ne, n->sw, n->se, &top, &bot) ; for (j=7; (top | bot) && j>=0; j--) { int bits = (top >> 24) ; top = (top << 8) | (bot >> 24) ; bot = (bot << 8) ; for (i=0; bits && i<8; i++, bits = (bits << 1) & 255) if (bits & 128) os << '*' ; else os << '.' ; os << '$' ; } os << '\n' ; } else { if (cellcounter + 1 > (g_uintptr_t)(root->next) || isaborted()) return (g_uintptr_t)(root->next) ; g_uintptr_t nw = writecell_2p2(os, root->nw, depth-1) ; g_uintptr_t ne = writecell_2p2(os, root->ne, depth-1) ; g_uintptr_t sw = writecell_2p2(os, root->sw, depth-1) ; g_uintptr_t se = writecell_2p2(os, root->se, depth-1) ; if (!isaborted() && cellcounter + 1 != (g_uintptr_t)(root->next)) { // this should never happen lifefatal("Internal in writecell_2p2") ; return (g_uintptr_t)(root->next) ; } thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp(); sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } root->next = (node *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n'; } return thiscell ; } #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg const char *hlifealgo::writeNativeFormat(std::ostream &os, char *comments) { int depth = node_depth(root) ; os << "[M2] (golly " STRINGIFY(VERSION) ")\n" ; // AKT: always write out explicit rule os << "#R " << hliferules.getrule() << '\n' ; if (generation > bigint::zero) { // write non-zero gen count os << "#G " << generation.tostring('\0') << '\n' ; } if (comments) { // write given comment line(s), but we can't just do "os << comments" because the // lines might not start with #C (eg. if they came from the end of a .rle file), // so we must ensure that each comment line in the .mc file starts with #C char *p = comments; while (*p != '\0') { char *line = p; // note that readcomments() in readpattern.cpp ensures each line ends with \n while (*p != '\n') p++; if (line[0] != '#' || line[1] != 'C') { os << "#C "; } if (line != p) { *p = '\0'; os << line; *p = '\n'; } os << '\n'; p++; } } inGC = 1 ; /* this is the old way: cellcounter = 0 ; writecell(f, root, depth) ; */ /* this is the new two-pass way */ cellcounter = 0 ; vector depths(timeline.framecount) ; int framestosave = timeline.framecount ; if (timeline.savetimeline == 0) framestosave = 0 ; if (framestosave) { for (int i=0; inext << '\n' ; } } writecell_2p2(os, root, depth) ; /* end new two-pass way */ if (framestosave) { for (int i=0; i>=(int i) ; bigint& operator<<=(int i) ; void mulpow2(int p) ; int operator==(const bigint &b) const ; int operator!=(const bigint &b) const ; int operator<=(const bigint &b) const ; int operator>=(const bigint &b) const ; int operator<(const bigint &b) const ; int operator>(const bigint &b) const ; int even() const ; int odd() const ; int low31() const ; // return the low 31 bits quickly int lowbitset() const ; // return the index of the lowest set bit const char *tostring(char sep=sepchar) const ; int sign() const ; // note: a should be a small positive int, say 1..10,000 void mul_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 void div_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 int mod_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 void div2() ; // note: a may only be a *31* bit int, not just 0 or 1 // note: may only be called on arrayed bigints void add_smallint(int a) ; double todouble() const ; double toscinot() const ; int toint() const ; // static values predefined static const bigint zero, one, two, three, minint, maxint ; // editing limits static const bigint min_coord, max_coord ; // how many bits required to represent this (approximately)? int bitsreq() const ; // fill in one bit per char, up to n. void tochararr(char *ar, int siz) const ; private: // note: may only be called on arrayed bigints int size() const ; // do we need to shrink it to keep it canonical? void shrink(int pos) ; void grow(int osz, int nsz) ; // note: carry may be any legal 31-bit int // note: may only be called on arrayed bigints void ripple(int carry, int pos) ; void ripple(const bigint &a, int carry) ; void ripplesub(const bigint &a, int carry) ; // make sure it's in vector form; may leave it not canonical! void vectorize(int i) ; void fromint(int i) ; void ensurework(int sz) const ; union { int i ; int *p ; } v ; static char *printbuf ; static int *work ; static int printbuflen ; static int workarrlen ; static char sepchar ; static int sepcount ; } ; #endif golly-3.3-src/gollybase/generationsalgo.cpp0000644000175000017500000007664013441044674016105 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "generationsalgo.h" #include #include #include #if defined(WIN32) || defined(WIN64) #define strncasecmp _strnicmp #endif using namespace std ; int generationsalgo::NumCellStates() { return maxCellStates ; } static const char *DEFAULTRULE = "12/34/3" ; const char* generationsalgo::DefaultRule() { return DEFAULTRULE ; } state generationsalgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { // result state result = 0 ; // get the lookup table char *lookup = rule3x3 ; // create array index int index = ((nw == 1) ? 256 : 0) | ((n == 1) ? 128 : 0) | ((ne == 1) ? 64 : 0) | ((w == 1) ? 32 : 0) | ((c == 1) ? 16 : 0) | ((e == 1) ? 8 : 0) | ((sw == 1) ? 4 : 0) | ((s == 1) ? 2 : 0) | ((se == 1) ? 1 : 0) ; // lookup the next generation if (c <= 1 && lookup[index]) { result = 1 ; } else { if (c > 0 && c + 1 < maxCellStates) { result = c + 1 ; } else { result = 0 ; } } return result ; } static lifealgo *creator() { return new generationsalgo() ; } void generationsalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("Generations") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 2 ; ai.maxstates = 256 ; // init default color scheme ai.defgradient = true ; // use gradient ai.defr1 = 255 ; // start color = red ai.defg1 = 0 ; ai.defb1 = 0 ; ai.defr2 = 255 ; // end color = yellow ai.defg2 = 255 ; ai.defb2 = 0 ; // if not using gradient then set all states to white for (int i=0 ; i<256 ; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255 ; } } generationsalgo::generationsalgo() { int i ; // base64 encoding characters base64_characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ; // all valid rule letters valid_rule_letters = "012345678ceaiknjqrytwz-" ; // rule letters per neighbor count rule_letters[0] = "ce" ; rule_letters[1] = "ceaikn" ; rule_letters[2] = "ceaiknjqry" ; rule_letters[3] = "ceaiknjqrytwz" ; // isotropic neighborhoods per neighbor count static int entry0[2] = { 1, 2 } ; static int entry1[6] = { 5, 10, 3, 40, 33, 68 } ; static int entry2[10] = { 69, 42, 11, 7, 98, 13, 14, 70, 41, 97 } ; static int entry3[13] = { 325, 170, 15, 45, 99, 71, 106, 102, 43, 101, 105, 78, 108 } ; rule_neighborhoods[0] = entry0 ; rule_neighborhoods[1] = entry1 ; rule_neighborhoods[2] = entry2 ; rule_neighborhoods[3] = entry3 ; // bit offset for suvival part of rule survival_offset = 9 ; // bit in letter bit mask indicating negative negative_bit = 13 ; // maximum number of letters per neighbor count max_letters[0] = 0 ; max_letters[1] = (int) strlen(rule_letters[0]) ; max_letters[2] = (int) strlen(rule_letters[1]) ; max_letters[3] = (int) strlen(rule_letters[2]) ; max_letters[4] = (int) strlen(rule_letters[3]) ; max_letters[5] = max_letters[3] ; max_letters[6] = max_letters[2] ; max_letters[7] = max_letters[1] ; max_letters[8] = max_letters[0] ; for (i = 0 ; i < survival_offset ; i++) { max_letters[i + survival_offset] = max_letters[i] ; } // canonical letter order per neighbor count static int order0[1] = { 0 } ; static int order1[2] = { 0, 1 } ; static int order2[6] = { 2, 0, 1, 3, 4, 5 } ; static int order3[10] = { 2, 0, 1, 3, 6, 4, 5, 7, 8, 9 } ; static int order4[13] = { 2, 0, 1, 3, 6, 4, 5, 7, 8, 10, 11, 9, 12 } ; order_letters[0] = order0 ; order_letters[1] = order1 ; order_letters[2] = order2 ; order_letters[3] = order3 ; order_letters[4] = order4 ; order_letters[5] = order3 ; order_letters[6] = order2 ; order_letters[7] = order1 ; order_letters[8] = order0 ; for (i = 0 ; i < survival_offset ; i++) { order_letters[i + survival_offset] = order_letters[i] ; } // initialize initRule() ; } generationsalgo::~generationsalgo() { } // returns a count of the number of bits set in given int static int bitcount(int v) { int r = 0 ; while (v) { r++ ; v &= v - 1 ; } return r ; } // initialize void generationsalgo::initRule() { // default to Moore neighbourhood totalistic rule neighbormask = MOORE ; neighbors = 8 ; totalistic = true ; using_map = false ; // we may need this to be >2 here so it's recognized as multistate maxCellStates = 3 ; // one bit for each neighbor count // s = survival, b = birth // bit: 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 // meaning: s8 s7 s6 s5 s4 s3 s2 s1 s0 b8 b7 b6 b5 b4 b3 b2 b1 b0 rulebits = 0 ; // one bit for each letter per neighbor count // N = negative bit // bit: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 // meaning: N z w t y r q j n k i a e c memset(letter_bits, 0, sizeof(letter_bits)) ; // canonical rule string memset(canonrule, 0, sizeof(canonrule)) ; } // set 3x3 grid based on totalistic value void generationsalgo::setTotalistic(int value, bool survival) { int mask = 0 ; int nbrs = 0 ; int nhood = 0 ; int i = 0 ; int j = 0 ; int offset = 0 ; // check if this value has already been processed if (survival) { offset = survival_offset ; } if ((rulebits & (1 << (value + offset))) == 0) { // update the rulebits rulebits |= 1 << (value + offset) ; // update the mask if survival if (survival) { mask = 0x10 ; } // fill the array based on totalistic value for (i = 0 ; i < ALL3X3 ; i += 32) { for (j = 0 ; j < 16 ; j++) { nbrs = 0 ; nhood = (i+j) & neighbormask ; while (nhood > 0) { nbrs += (nhood & 1) ; nhood >>= 1 ; } if (value == nbrs) { rule3x3[i+j+mask] = 1 ; } } } } } // flip bits int generationsalgo::flipBits(int x) { return ((x & 0x07) << 6) | ((x & 0x1c0) >> 6) | (x & 0x38) ; } // rotate 90 int generationsalgo::rotateBits90Clockwise(int x) { return ((x & 0x4) << 6) | ((x & 0x20) << 2) | ((x & 0x100) >> 2) | ((x & 0x2) << 4) | (x & 0x10) | ((x & 0x80) >> 4) | ((x & 0x1) << 2) | ((x & 0x8) >> 2) | ((x & 0x40) >> 6) ; } // set symmetrical neighborhood into 3x3 map void generationsalgo::setSymmetrical512(int x, int b) { int y = x ; int i = 0 ; // process each of the 4 rotations for (i = 0 ; i < 4 ; i++) { rule3x3[y] = (char) b ; y = rotateBits90Clockwise(y) ; } // flip y = flipBits(y) ; // process each of the 4 rotations for (i = 0 ; i < 4 ; i++) { rule3x3[y] = (char) b ; y = rotateBits90Clockwise(y) ; } } // set symmetrical neighborhood void generationsalgo::setSymmetrical(int value, bool survival, int lindex, int normal) { int xorbit = 0 ; int nindex = value - 1 ; int x = 0 ; int offset = 0 ; // check for homogeneous bits if (value == 0 || value == 8) { setTotalistic(value, survival) ; } else { // update the rulebits if (survival) { offset = survival_offset ; } rulebits |= 1 << (value + offset) ; // reflect the index if in second half if (nindex > 3) { nindex = 6 - nindex ; xorbit = 0x1ef ; } // update the letterbits letter_bits[value + offset] |= 1 << lindex ; if (!normal) { // set the negative bit letter_bits[value + offset] |= 1 << negative_bit ; } // lookup the neighborhood x = rule_neighborhoods[nindex][lindex] ^ xorbit ; if (survival) { x |= 0x10 ; } setSymmetrical512(x, normal) ; } } // set totalistic birth or survival rule from a string void generationsalgo::setTotalisticRuleFromString(const char *rule, bool survival) { char current ; // process each character in the rule string while ( *rule ) { current = *rule ; rule++ ; // convert the digit to an integer current -= '0' ; // set totalistic setTotalistic(current, survival) ; } } // set rule from birth or survival string void generationsalgo::setRuleFromString(const char *rule, bool survival) { // current and next character char current ; char next ; // whether character normal or inverted int normal = 1 ; // letter index char *letterindex = 0 ; int lindex = 0 ; int nindex = 0 ; // process each character while ( *rule ) { current = *rule ; rule++ ; // find the index in the valid character list letterindex = strchr((char*) valid_rule_letters, current) ; lindex = letterindex ? int(letterindex - valid_rule_letters) : -1 ; // check if it is a digit if (lindex >= 0 && lindex <= 8) { // determine what follows the digit next = *rule ; nindex = -1 ; if (next) { letterindex = strchr((char*) rule_letters[3], next) ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } } // is the next character a digit or minus? if (nindex == -1) { setTotalistic(lindex, survival) ; } // check for inversion normal = 1 ; if (next == '-') { rule++ ; next = *rule ; // invert following character meanings normal = 0 ; } // process non-totalistic characters if (next) { letterindex = strchr((char*) rule_letters[3], next) ; nindex = -1 ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } while (nindex >= 0) { // set symmetrical setSymmetrical(lindex, survival, nindex, normal) ; // get next character rule++ ; next = *rule ; nindex = -1 ; if (next) { letterindex = strchr((char*) rule_letters[3], next) ; if (letterindex) { nindex = int(letterindex - rule_letters[3]) ; } } } } } } } // create the rule map from the base64 encoded map void generationsalgo::createRuleMapFromMAP(const char *base64) { // set the number of characters to read int power2 = 1 << (neighbors + 1) ; int fullchars = power2 / 6 ; int remainbits = power2 % 6 ; // create an array to read the MAP bits char bits[ALL3X3] ; // decode the base64 string int i = 0 ; char c = 0 ; int j = 0 ; const char *index = 0 ; for (i = 0 ; i < fullchars ; i++) { // convert character to base64 index index = strchr(base64_characters, *base64) ; base64++ ; c = index ? (char)(index - base64_characters) : 0 ; // decode the character bits[j] = c >> 5 ; j++ ; bits[j] = (c >> 4) & 1 ; j++ ; bits[j] = (c >> 3) & 1 ; j++ ; bits[j] = (c >> 2) & 1 ; j++ ; bits[j] = (c >> 1) & 1 ; j++ ; bits[j] = c & 1 ; j++ ; } // decode remaining bits from final character if (remainbits > 0) { index = strchr(base64_characters, *base64) ; c = index ? (char)(index - base64_characters) : 0 ; int b = 5 ; while (remainbits > 0) { bits[j] = (c >> b) & 1 ; b-- ; j++ ; remainbits-- ; } } // copy into rule array using the neighborhood mask int k, m ; for (i = 0 ; i < ALL3X3 ; i++) { k = 0 ; m = neighbors ; for (j = 8 ; j >= 0 ; j--) { if (neighbormask & (1 << j)) { if (i & (1 << j)) { k |= (1 << m) ; } m-- ; } } rule3x3[i] = bits[k] ; } } // create the rule map from birth and survival strings void generationsalgo::createRuleMap(const char *birth, const char *survival) { // clear the rule array memset(rule3x3, 0, ALL3X3) ; // check for totalistic rule if (totalistic) { // set the totalistic birth rule setTotalisticRuleFromString(birth, false) ; // set the totalistic surivival rule setTotalisticRuleFromString(survival, true) ; } else { // set the non-totalistic birth rule setRuleFromString(birth, false) ; // set the non-totalistic survival rule setRuleFromString(survival, true) ; } } // add canonical letter representation int generationsalgo::addLetters(int count, int p) { int bits ; // bitmask of letters defined at this count int negative = 0 ; // whether negative int setbits ; // how many bits are defined int maxbits ; // maximum number of letters at this count int letter = 0 ; int j ; // check if letters are defined for this neighbor count if (letter_bits[count]) { // get the bit mask bits = letter_bits[count] ; // check for negative if (bits & (1 << negative_bit)) { // letters are negative negative = 1 ; bits &= ~(1 << negative_bit) ; } // compute the number of bits set setbits = bitcount(bits) ; // get the maximum number of allowed letters at this neighbor count maxbits = max_letters[count] ; // do not invert if not negative and seven letters if (!(!negative && setbits == 7 && maxbits == 13)) { // if maximum letters minus number used is greater than number used then invert if (setbits + negative > (maxbits >> 1)) { // invert maximum letters for this count bits = ~bits & ((1 << maxbits) - 1) ; if (bits) { negative = !negative ; } } } // if negative and no letters then remove neighborhood count if (negative && !bits) { canonrule[p] = 0 ; p-- ; } else { // check whether to output minus if (negative) { canonrule[p++] = '-' ; } // add defined letters for (j = 0 ; j < maxbits ; j++) { // lookup the letter in order letter = order_letters[count][j] ; if (bits & (1 << letter)) { canonrule[p++] = rule_letters[3][letter] ; } } } } return p ; } // AKT: store valid rule in canonical format for getrule() void generationsalgo::createCanonicalName(const char *base64) { int p = 0 ; int np = 0 ; int i = 0 ; // the canonical version of a rule containing letters // might be simply totalistic bool stillnontotalistic = false ; // check for map rule if (using_map) { // output map header canonrule[p++] = 'M' ; canonrule[p++] = 'A' ; canonrule[p++] = 'P' ; // compute number of base64 characters int power2 = 1 << (neighbors + 1) ; int fullchars = power2 / 6 ; int remainbits = power2 % 6 ; // copy base64 part for (i = 0 ; i < fullchars ; i++) { if (*base64) { canonrule[p++] = *base64 ; base64++ ; } } // copy final bits of last character if (*base64) { const char *index = strchr(base64_characters, *base64) ; int c = index ? (char)(index - base64_characters) : 0 ; int k = 0 ; int m = 5 ; for (i = 0 ; i < remainbits ; i++) { k |= c & (1 << m) ; m-- ; } canonrule[p++] = base64_characters[c] ; } } else { // output survival part for (i = 0 ; i <= neighbors ; i++) { if (rulebits & (1 << (survival_offset+i))) { canonrule[p++] = '0' + (char)i ; // check for non-totalistic if (!totalistic) { // add any defined letters np = addLetters(survival_offset + i, p) ; // check if letters were added if (np != p) { if (np > p) { stillnontotalistic = true ; } p = np ; } } } } // add slash canonrule[p++] = '/' ; // output birth part for (i = 0 ; i <= neighbors ; i++) { if (rulebits & (1 << i)) { canonrule[p++] = '0' + (char)i ; // check for non-totalistic if (!totalistic) { // add any defined letters np = addLetters(i, p) ; // check if letters were added if (np != p) { if (np > p) { stillnontotalistic = true ; } p = np ; } } } } } // add slash canonrule[p++] = '/' ; // output state count char states[4] ; memset(states, 0, sizeof(states)) ; sprintf(states, "%d", maxCellStates) ; i = 0 ; while (states[i]) canonrule[p++] = states[i++] ; // check if non-totalistic became totalistic if (!totalistic && !stillnontotalistic) { totalistic = true ; } // add neighborhood if not MAP rule if (!using_map) { if (neighbormask == HEXAGONAL) canonrule[p++] = 'H' ; if (neighbormask == VON_NEUMANN) canonrule[p++] = 'V' ; } // check for bounded grid if (gridwd > 0 || gridht > 0) { // algo->setgridsize() was successfully called above, so append suffix const char* bounds = canonicalsuffix() ; i = 0 ; while (bounds[i]) canonrule[p++] = bounds[i++] ; } // null terminate canonrule[p] = 0 ; // set canonical rule ghashbase::setrule(canonrule) ; } // remove character from a string in place void generationsalgo::removeChar(char *string, char skip) { int src = 0 ; int dst = 0 ; char c = string[src++] ; // copy characters other than skip while ( c ) { if (c != skip) { string[dst++] = c ; } c = string[src++] ; } // ensure null terminated string[dst] = 0 ; } // check whether non-totalistic letters are valid for defined neighbor counts bool generationsalgo::lettersValid(const char *part) { char c ; int nindex = 0 ; int currentCount = -1 ; // get next character while ( *part ) { c = *part ; if (c >= '0' && c <= '8') { currentCount = c - '0' ; nindex = currentCount - 1 ; if (nindex > 3) { nindex = 6 - nindex ; } } else { // ignore minus if (c != '-') { // not valid if 0 or 8 if (currentCount == 0 || currentCount == 8) { return false ; } // check against valid rule letters for this neighbor count if (strchr((char*) rule_letters[nindex], c) == 0) { return false ; } } } part++ ; } return true ; } // set rule const char *generationsalgo::setrule(const char *rulestring) { char *r = (char *)rulestring ; char tidystring[MAXRULESIZE] ; // tidy version of rule string char *t = (char *)tidystring ; char *end = r + strlen(r) ; // end of rule string char c ; char *charpos = 0 ; int digit ; int maxdigit = 0 ; // maximum digit value found char *colonpos = 0 ; // position of colon char *slashpos = 0 ; // position of first slash char *slashpos2 = 0 ; // position of second slash char *bpos = 0 ; // position of b char *spos = 0 ; // position of s bool underscore_used = false ; // whether underscore used int num_states = 0 ; // number of cell states // initialize rule type initRule() ; // check if rule is too long if (strlen(rulestring) > (size_t) MAXRULESIZE) { return "Rule name is too long." ; } // check for colon colonpos = strchr(r, ':') ; if (colonpos) { // only process up to the colon end = colonpos ; } // skip any whitespace while (*r == ' ') { r++ ; } // check for map if (strncasecmp(r, "map", 3) == 0) { // attempt to decode map r += 3 ; bpos = r ; // terminate at the colon if one is present if (colonpos) *colonpos = 0 ; // check the length of the map int maplen = (int) strlen(r) ; // find the last slash char *lastslash = strrchr(r, '/') ; // replace the colon if one was present if (colonpos) *colonpos = ':' ; // check if there was a final slash if (lastslash == NULL) { return "Generations rule needs number of states." ; } // length is up to the final slash maplen = (int) (lastslash - r) ; // check if there is base64 padding if (maplen > 2 && !strncmp(r + maplen - 2, "==", 2)) { // remove padding maplen -= 2 ; } // check if the map length is valid for Moore, Hexagonal or von Neumann neighborhoods if (!(maplen == MAP512LENGTH || maplen == MAP128LENGTH || maplen == MAP32LENGTH)) { return "MAP rule needs 6, 22 or 86 base64 characters." ; } // validate the characters spos = r + maplen ; while (r < spos) { if (!strchr(base64_characters, *r)) { return "MAP contains illegal base64 character." ; } r++ ; } // set the neighborhood based on the map length if (maplen == MAP128LENGTH) { neighbormask = HEXAGONAL ; neighbors = 6 ; } else { if (maplen == MAP32LENGTH) { neighbormask = VON_NEUMANN ; neighbors = 4 ; } } // read number of states r = lastslash + 1 ; c = *r ; while (c) { if (c >= '0' && c <= '9') { num_states = num_states * 10 + (c - '0') ; r++ ; c = *r ; } else { c = 0 ; } } // check number of cell states is valid if (num_states < 2) { return "Number of states too low in Generations rule." ; } if (num_states > 256) { return "Number of states too high in Generations rule." ; } // check for trailing characters if (*r && r != colonpos) { return "Illegal trailing characters after MAP." ; } // set the number of cell states maxCellStates = num_states ; // map looks valid using_map = true ; } else { // create lower case version of rule name without spaces while (r < end) { // get the next character and convert to lowercase c = (char) tolower(*r) ; // process the character switch (c) { // birth case 'b': if (bpos) { // multiple b found return "Only one B allowed." ; } bpos = t ; *t = c ; t++ ; break ; // survival case 's': if (spos) { // multiple s found return "Only one S allowed." ; } spos = t ; *t = c ; t++ ; break ; // underscore case '_': underscore_used = true ; // fall through... // slash case '/': if (slashpos) { // multiple slashes found if (slashpos2) { return "Only two slashes allowed." ; } else { slashpos2 = t ; *t = c ; t++ ; } } else { slashpos = t ; *t = c ; t++ ; } break ; // hex case 'h': if (neighbormask != MOORE) { // multiple neighborhoods specified return "Only one neighborhood allowed." ; } neighbormask = HEXAGONAL ; grid_type = HEX_GRID ; neighbors = 6 ; *t = c ; t++ ; break ; // von neumann case 'v': if (neighbormask != MOORE) { // multiple neighborhoods specified return "Only one neighborhood allowed." ; } neighbormask = VON_NEUMANN ; grid_type = VN_GRID ; neighbors = 4 ; *t = c ; t++ ; break ; // minus case '-': // check if previous character is a digit if (t == tidystring || *(t-1) < '0' || *(t-1) > '8') { // minus can only follow a digit return "Minus can only follow a digit." ; } *t = c ; t++ ; totalistic = false ; break ; // other characters default: // ignore space if (c != ' ') { // check for state count after final slash if (slashpos2) { if (c >= '0' && c <= '9') { num_states = num_states * 10 + (c - '0') ; } else { return "Bad character found." ; } } else { // check character is valid charpos = strchr((char*) valid_rule_letters, c) ; if (charpos) { // copy character *t = c ; t++ ; // check if totalistic (i.e. found a valid non-digit) digit = int(charpos - valid_rule_letters) ; if (digit > 8) { totalistic = false ; } else { // update maximum digit found if (digit > maxdigit) { maxdigit = digit ; } } } else { return "Bad character found." ; } } } break ; } // next character r++ ; } // ensure null terminated *t = 0 ; // don't allow empty rule string t = tidystring ; if (*t == 0) { return "Rule cannot be empty string." ; } // check for two slashes if (!slashpos || !slashpos2) { return "Rule must contain two slashes." ; } // check number of cell states is valid if (num_states < 2) { return "Number of states too low in Generations rule." ; } if (num_states > 256) { return "Number of states too high in Generations rule." ; } // set the number of cell states maxCellStates = num_states ; // underscore only valid for non-totalistic rules if (underscore_used && totalistic) { return "Underscore not valid for totalistic rules, use slash." ; } // if neighborhood specified then must be last character if (neighbormask != MOORE) { size_t len = strlen(t) ; if (len) { c = t[len - 1] ; if (!((c == 'h') || (c == 'v'))) { return "Neighborhood must be at end of rule." ; } // remove character t[len - 1] = 0 ; } } // digits can not be greater than the number of neighbors for the defined neighborhood if (maxdigit > neighbors) { return "Digit greater than neighborhood allows." ; } // terminate the rule string at the second slash *slashpos2 = 0 ; // if slash present and both b and s then one must be each side of the slash if (slashpos && bpos && spos) { if ((bpos < slashpos && spos < slashpos) || (bpos > slashpos && spos > slashpos)) { return "B and S must be either side of slash." ; } } // check if there was a slash to divide birth from survival if (!slashpos) { // check if both b and s exist if (bpos && spos) { // determine whether b or s is first if (bpos < spos) { // skip b and cut the string using s bpos++ ; *spos = 0 ; spos++ ; } else { // skip s and cut the string using b spos++ ; *bpos = 0 ; bpos++ ; } } else { // just bpos if (bpos) { bpos = t ; removeChar(bpos, 'b') ; spos = bpos + strlen(bpos) ; } else { // just spos spos = t ; removeChar(spos, 's') ; bpos = spos + strlen(spos) ; } } } else { // slash exists so set determine which part is b and which is s *slashpos = 0 ; // check if b or s are defined if (bpos || spos) { // check for birth first if ((bpos && bpos < slashpos) || (spos && spos > slashpos)) { // birth then survival bpos = t ; spos = slashpos + 1 ; } else { // survival then birth bpos = slashpos + 1 ; spos = t ; } // remove b or s from rule parts removeChar(bpos, 'b') ; removeChar(spos, 's') ; } else { // no b or s so survival first spos = t ; bpos = slashpos + 1 ; } } // if not totalistic and a part exists it must start with a digit if (!totalistic) { // check birth c = *bpos ; if (c && (c < '0' || c > '8')) { return "Non-totalistic birth must start with a digit." ; } // check survival c = *spos ; if (c && (c < '0' || c > '8')) { return "Non-totalistic survival must start with a digit." ; } } // if not totalistic then neighborhood must be Moore if (!totalistic && neighbormask != MOORE) { return "Non-totalistic only supported with Moore neighborhood." ; } // validate letters used against each specified neighbor count if (!lettersValid(bpos)) { return "Letter not valid for birth neighbor count." ; } if (!lettersValid(spos)) { return "Letter not valid for survival neighbor count." ; } } // AKT: check for rule suffix like ":T200,100" to specify a bounded universe if (colonpos) { const char* err = setgridsize(colonpos) ; if (err) return err ; } else { // universe is unbounded gridwd = 0 ; gridht = 0 ; } // check for map if (using_map) { // generate the 3x3 map from the 512bit map createRuleMapFromMAP(bpos) ; } else { // generate the 3x3 map from the birth and survival rules createRuleMap(bpos, spos) ; } // check for B0 rules if (rule3x3[0]) { return "Generations does not support B0." ; } // save the canonical rule name createCanonicalName(bpos) ; // exit with success return 0 ; } const char* generationsalgo::getrule() { return canonrule ; } golly-3.3-src/gollybase/lifealgo.h0000644000175000017500000002126413273534663014150 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This is the pure abstract class any life calculation algorithm * must support. As long as a life algorithm implements this * interface, it can be invoked by our driver code. */ #ifndef LIFEALGO_H #define LIFEALGO_H #include "bigint.h" #include "viewport.h" #include "liferender.h" #include "lifepoll.h" #include "readpattern.h" #include "platform.h" #include // moving the include vector *before* platform.h breaks compilation #ifdef _MSC_VER #pragma warning(disable:4702) // disable "unreachable code" warnings from MSVC #endif #include #ifdef _MSC_VER #pragma warning(default:4702) // enable "unreachable code" warnings #endif using std::vector; #include // this must not be increased beyond 32767, because we use a bigint // multiply that only supports multiplicands up to that size. const int MAX_FRAME_COUNT = 32000 ; /** * Timeline support is pretty generic. */ class timeline_t { public: timeline_t() : recording(0), framecount(0), savetimeline(1), start(0), inc(0), next(0), end(0), frames() {} int recording, framecount, base, expo, savetimeline ; bigint start, inc, next, end ; vector frames ; } ; class lifealgo { public: lifealgo() : generation(0), increment(0), timeline(), grid_type(SQUARE_GRID) { poller = &default_poller ; gridwd = gridht = 0 ; // default is an unbounded universe unbounded = true ; // most algorithms use an unbounded universe } virtual ~lifealgo() ; virtual void clearall() = 0 ; // returns <0 if error virtual int setcell(int x, int y, int newstate) = 0 ; virtual int getcell(int x, int y) = 0 ; virtual int nextcell(int x, int y, int &v) = 0 ; void getcells(unsigned char *buf, int x, int y, int w, int h) ; // call after setcell/clearcell calls virtual void endofpattern() = 0 ; virtual void setIncrement(bigint inc) = 0 ; virtual void setIncrement(int inc) = 0 ; virtual void setGeneration(bigint gen) = 0 ; const bigint &getIncrement() { return increment ; } const bigint &getGeneration() { return generation ; } virtual const bigint &getPopulation() = 0 ; virtual int isEmpty() = 0 ; // can we do the gen count doubling? only hashlife virtual int hyperCapable() = 0 ; virtual void setMaxMemory(int m) = 0 ; // never alloc more than this virtual int getMaxMemory() = 0 ; virtual const char *setrule(const char *) = 0 ; // new rules; returns err msg virtual const char *getrule() = 0 ; // get current rule set virtual void step() = 0 ; // do inc gens virtual void draw(viewport &view, liferender &renderer) = 0 ; virtual void fit(viewport &view, int force) = 0 ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) = 0 ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) = 0 ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) = 0 ; void setpoll(lifepoll *pollerarg) { poller = pollerarg ; } virtual const char *readmacrocell(char *) { return "Cannot read macrocell format." ; } // Verbosity crosses algorithms. We need to embed this sort of option // into some global shared thing or something rather than use static. static void setVerbose(int v) { verbose = v ; } static int getVerbose() { return verbose ; } virtual const char* DefaultRule() { return "B3/S23"; } // return number of cell states in this universe (2..256) virtual int NumCellStates() { return 2; } // return number of states to use when setting random cells virtual int NumRandomizedCellStates() { return NumCellStates() ; } // timeline support virtual void* getcurrentstate() = 0 ; virtual void setcurrentstate(void *) = 0 ; int startrecording(int base, int expo) ; pair stoprecording() ; pair getbaseexpo() { return make_pair(timeline.base, timeline.expo) ; } void extendtimeline() ; void pruneframes() ; const bigint &gettimelinestart() { return timeline.start ; } const bigint &gettimelineend() { return timeline.end ; } const bigint &gettimelineinc() { return timeline.inc ; } int getframecount() { return timeline.framecount ; } int isrecording() { return timeline.recording ; } int gotoframe(int i) ; void destroytimeline() ; void savetimelinewithframe(int yesno) { timeline.savetimeline = yesno ; } // support for a bounded universe with various topologies: // plane, cylinder, torus, Klein bottle, cross-surface, sphere unsigned int gridwd, gridht ; // bounded universe if either is > 0 bigint gridleft, gridright ; // undefined if gridwd is 0 bigint gridtop, gridbottom ; // undefined if gridht is 0 bool boundedplane ; // topology is a bounded plane? bool sphere ; // topology is a sphere? bool htwist, vtwist ; // Klein bottle if either is true, // or cross-surface if both are true int hshift, vshift ; // torus with horizontal or vertical shift const char* setgridsize(const char* suffix) ; // use in setrule() to parse a suffix like ":T100,200" and set // the above parameters const char* canonicalsuffix() ; // use in setrule() to return the canonical version of suffix; // eg. ":t0020" would be converted to ":T20,0" bool CreateBorderCells() ; bool DeleteBorderCells() ; // the above routines can be called around step() to create the // illusion of a bounded universe (note that increment must be 1); // they return false if the pattern exceeds the editing limits bool unbounded; // algorithms that uses a finite universe should set this flag false // so the GUI code won't call CreateBorderCells or DeleteBorderCells vector clipped_cells; // algorithms that uses a finite universe need to save live cells // that might be clipped when a setrule call reduces the size of // the universe (this allows the GUI code to restore the cells // if the rule change is undone) enum TGridType { SQUARE_GRID, TRI_GRID, HEX_GRID, VN_GRID } ; TGridType getgridtype() const { return grid_type ; } protected: lifepoll *poller ; static int verbose ; int maxCellStates ; // keep up to date; setcell depends on it bigint generation ; bigint increment ; timeline_t timeline ; TGridType grid_type ; private: // following are called by CreateBorderCells() to join edges in various ways void JoinTwistedEdges() ; void JoinTwistedAndShiftedEdges() ; void JoinShiftedEdges() ; void JoinAdjacentEdges(int pt, int pl, int pb, int pr) ; void JoinEdges(int pt, int pl, int pb, int pr) ; // following is called by DeleteBorderCells() void ClearRect(int top, int left, int bottom, int right) ; } ; /** * If you need any static information from a lifealgo, this class can be * called (or overridden) to set up all that data. Right now the * functions do nothing; override if you need that info. These are * called one by one by a static method in the algorithm itself, * if that information is available. The ones marked optional need * not be called. */ class staticAlgoInfo { public: staticAlgoInfo() ; virtual ~staticAlgoInfo() { } ; // mandatory void setAlgorithmName(const char *s) { algoName = s ; } void setAlgorithmCreator(lifealgo *(*f)()) { creator = f ; } // optional; override if you want to retain this data virtual void setDefaultBaseStep(int) {} virtual void setDefaultMaxMem(int) {} // minimum and maximum number of cell states supported by this algorithm; // both must be within 2..256 int minstates; int maxstates; // default color scheme bool defgradient; // use color gradient? unsigned char defr1, defg1, defb1; // color at start of gradient unsigned char defr2, defg2, defb2; // color at end of gradient // if defgradient is false then use these colors for each cell state unsigned char defr[256], defg[256], defb[256]; // default icon data (in XPM format) const char **defxpm7x7; // 7x7 icons const char **defxpm15x15; // 15x15 icons const char **defxpm31x31; // 31x31 icons // basic data const char *algoName ; lifealgo *(*creator)() ; int id ; // my index staticAlgoInfo *next ; // support: give me sequential algorithm IDs static int getNumAlgos() { return nextAlgoId ; } static int nextAlgoId ; static staticAlgoInfo &tick() ; static staticAlgoInfo *head ; static staticAlgoInfo *byName(const char *s) ; static int nameToIndex(const char *s) ; } ; #endif golly-3.3-src/gollybase/generationsalgo.h0000644000175000017500000000552113145740437015541 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef GENERALGO_H #define GENERALGO_H #include "ghashbase.h" /** * Our Generations algo class. */ class generationsalgo : public ghashbase { public: generationsalgo() ; virtual ~generationsalgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; enum neighborhood_masks { MOORE = 0x1ff, // all 8 neighbors HEXAGONAL = 0x1bb, // ignore NE and SW neighbors VON_NEUMANN = 0x0ba // 4 orthogonal neighbors } ; bool isHexagonal() const { return neighbormask == HEXAGONAL ; } bool isVonNeumann() const { return neighbormask == VON_NEUMANN ; } private: char canonrule[MAXRULESIZE] ; // canonical version of valid rule passed into setrule neighborhood_masks neighbormask ; // neighborhood masks in 3x3 table bool totalistic ; // is rule totalistic? bool using_map ; // is rule a map? int neighbors ; // number of neighbors int rulebits ; // bitmask of neighbor counts used (9 birth, 9 survival) int letter_bits[18] ; // bitmask for non-totalistic letters used int negative_bit ; // bit in letters bits mask indicating negative int survival_offset ; // bit offset in rulebits for survival int max_letters[18] ; // maximum number of letters per neighbor count const int *order_letters[18] ; // canonical letter order per neighbor count const char *valid_rule_letters ; // all valid letters const char *rule_letters[4] ; // valid rule letters per neighbor count const int *rule_neighborhoods[4] ; // isotropic neighborhoods per neighbor count char rule3x3[ALL3X3] ; // all 3x3 cell mappings 012345678->4' const char *base64_characters ; // base 64 encoding characters void initRule() ; void setTotalistic(int value, bool survival) ; int flipBits(int x) ; int rotateBits90Clockwise(int x) ; void setSymmetrical512(int x, int b) ; void setSymmetrical(int value, bool survival, int lindex, int normal) ; void setTotalisticRuleFromString(const char *rule, bool survival) ; void setRuleFromString(const char *rule, bool survival) ; void createRuleMapFromMAP(const char *base64) ; void createRuleMap(const char *birth, const char *survival) ; void createCanonicalName(const char *base64) ; void removeChar(char *string, char skip) ; bool lettersValid(const char *part) ; int addLetters(int count, int p) ; } ; #endif golly-3.3-src/gollybase/platform.h0000644000175000017500000000330113230774246014176 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This file holds things that are platform-dependent such as * dependencies on 64-bitness, help for when the platform does not * have inttypes.h, and things like that. * * We need to convert pointers to integers and back for two * reasons. First, hlife structures use the address of a node * as its label, and we need to hash these labels. Secondly, * we use bit tricks for garbage collection and need to set and * clear low-order bits in a pointer. Normally the typedef * below is all we need, but if your platform doesn't have * uintptr_t you can change that here. We also need this type * for anything that might hold the *count* of nodes, since * this might be larger than an int. If inttypes does not * exist, and you're compiling for a 64-bit platform, you may * need to make some changes here. */ #include #if defined(_WIN64) #define PRIuPTR "I64u" typedef uintptr_t g_uintptr_t ; #define G_MAX SIZE_MAX #define GOLLY64BIT (1) #elif defined(__LP64__) || defined(__amd64__) #define __STDC_FORMAT_MACROS #define __STDC_LIMIT_MACROS #include #include typedef uintptr_t g_uintptr_t ; #define G_MAX SIZE_MAX #define GOLLY64BIT (1) #else #define PRIuPTR "u" typedef unsigned int g_uintptr_t ; #define G_MAX UINT_MAX #undef GOLLY64BIT #endif #define USEPREFETCH (1) // note that _WIN32 is also defined when compiling for 64-bit Windows #ifdef _WIN32 #include #include #define PREFETCH(a) _mm_prefetch((const char *)a, _MM_HINT_T0) #else #define PREFETCH(a) __builtin_prefetch(a) #endif golly-3.3-src/gollybase/lifepoll.cpp0000755000175000017500000000160513145740437014523 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "lifepoll.h" #include "util.h" lifepoll::lifepoll() { interrupted = 0 ; calculating = 0 ; countdown = POLLINTERVAL ; } int lifepoll::checkevents() { return 0 ; } int lifepoll::inner_poll() { // AKT: bailIfCalculating() ; if (isCalculating()) { // AKT: nicer to simply ignore user event // lifefatal("recursive poll called.") ; return interrupted ; } countdown = POLLINTERVAL ; calculating++ ; if (!interrupted) interrupted = checkevents() ; calculating-- ; return interrupted ; } void lifepoll::bailIfCalculating() { if (isCalculating()) { // AKT: nicer not to call lifefatal // lifefatal("recursive poll called.") ; lifewarning("Illegal operation while calculating.") ; interrupted = 1 ; } } void lifepoll::updatePop() {} lifepoll default_poller ; golly-3.3-src/gollybase/util.cpp0000644000175000017500000001420113230774246013663 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "util.h" #include #include #ifdef _WIN32 #include #else #include #endif /** * For now error just uses stderr. */ class baselifeerrors : public lifeerrors { public: virtual void fatal(const char *s) { fprintf(stderr, "%s\n", s) ; exit(10) ; } virtual void warning(const char *s) { fprintf(stderr, "%s\n", s) ; } virtual void status(const char *s) { fprintf(stderr, "%s\n", s) ; } virtual void beginprogress(const char *) { aborted = false ; } virtual bool abortprogress(double, const char *) { return false ; } virtual void endprogress() { // do nothing } virtual const char *getuserrules() { return "" ; } virtual const char *getrulesdir() { return "" ; } } ; baselifeerrors baselifeerrors ; lifeerrors *errorhandler = &baselifeerrors ; void lifeerrors::seterrorhandler(lifeerrors *o) { if (o == 0) errorhandler = &baselifeerrors ; else errorhandler = o ; } void lifefatal(const char *s) { errorhandler->fatal(s) ; } void lifewarning(const char *s) { errorhandler->warning(s) ; } void lifestatus(const char *s) { errorhandler->status(s) ; } void lifebeginprogress(const char *dlgtitle) { errorhandler->beginprogress(dlgtitle) ; } bool lifeabortprogress(double fracdone, const char *newmsg) { return errorhandler->aborted |= errorhandler->abortprogress(fracdone, newmsg) ; } bool isaborted() { return errorhandler->aborted ; } void lifeendprogress() { errorhandler->endprogress() ; } const char *lifegetuserrules() { return errorhandler->getuserrules() ; } const char *lifegetrulesdir() { return errorhandler->getrulesdir() ; } static FILE *f ; FILE *getdebugfile() { if (f == 0) f = fopen("trace.txt", "w") ; return f ; } /** * Manage reading lines from a FILE* without worrying about * line terminates. Note that the fgets() routine does not * insert any line termination characters at all. */ linereader::linereader(FILE *f) { setfile(f) ; } void linereader::setfile(FILE *f) { fp = f ; lastchar = 0 ; closeonfree = 0 ; // AKT: avoid crash on Linux } void linereader::setcloseonfree() { closeonfree = 1 ; } int linereader::close() { if (fp) { int r = fclose(fp) ; fp = 0 ; return r ; } return 0 ; } linereader::~linereader() { if (closeonfree) close() ; } const int LF = 10 ; const int CR = 13 ; char *linereader::fgets(char *buf, int maxlen) { int i = 0 ; for (;;) { if (i+1 >= maxlen) { buf[i] = 0 ; return buf ; } int c = getc(fp) ; switch (c) { case EOF: if (i == 0) return 0 ; buf[i] = 0 ; return buf ; case LF: if (lastchar != CR) { lastchar = LF ; buf[i] = 0 ; return buf ; } break ; case CR: lastchar = CR ; buf[i] = 0 ; return buf ; default: lastchar = c ; buf[i++] = (char)c ; break ; } } } #ifdef _WIN32 static double freq = 0.0; double gollySecondCount() { LARGE_INTEGER now; if (freq == 0.0) { LARGE_INTEGER f; QueryPerformanceFrequency(&f); freq = (double)f.QuadPart; if (freq <= 0.0) freq = 1.0; // play safe and avoid div by 0 } QueryPerformanceCounter(&now); return (now.QuadPart) / freq; } #else double gollySecondCount() { struct timeval tv ; gettimeofday(&tv, 0) ; return tv.tv_sec + 0.000001 * tv.tv_usec ; } #endif /* * Reporting. * The node count listed here wants to be big to reduce the number * of "get times" we do (which can be fairly expensive on some systems), * but it wants to be small in case something is going wrong like swapping * and we want to tell the user that the node rate has dropped. * A value of 65K is a reasonable compromise. */ int hperf::reportMask = ((1<<16)-1) ; // node count between checks /* * How frequently do we update the status bar? Every two seconds * should be reasonable. If we set this to zero, then that disables * performance reporting. */ double hperf::reportInterval = 2 ; // time between reports /* * Static buffer for status updates. */ char perfstatusline[200] ; void hperf::report(hperf &mark, int verbose) { double ts = gollySecondCount() ; double elapsed = ts - mark.timeStamp ; if (reportInterval == 0 || elapsed < reportInterval) return ; timeStamp = ts ; nodesCalculated += fastNodeInc ; fastNodeInc = 0 ; if (verbose) { double nodeCount = nodesCalculated - mark.nodesCalculated ; double halfFrac = 0 ; if (nodeCount > 0) halfFrac = (halfNodes - mark.halfNodes) / nodeCount ; double depthDelta = depthSum - mark.depthSum ; sprintf(perfstatusline, "RATE noderate %g depth %g half %g", nodeCount/elapsed, 1+depthDelta/nodeCount, halfFrac) ; lifestatus(perfstatusline) ; } mark = *this ; } void hperf::reportStep(hperf &mark, hperf &ratemark, double newGen, int verbose) { nodesCalculated += fastNodeInc ; fastNodeInc = 0 ; frames++ ; timeStamp = gollySecondCount() ; double elapsed = timeStamp - mark.timeStamp ; if (reportInterval == 0 || elapsed < reportInterval) return ; if (verbose) { double inc = newGen - mark.genval ; if (inc == 0) inc = 1e30 ; double nodeCount = nodesCalculated - mark.nodesCalculated ; double halfFrac = 0 ; if (nodeCount > 0) halfFrac = (halfNodes - mark.halfNodes) / nodeCount ; double depthDelta = depthSum - mark.depthSum ; double genspersec = inc / elapsed ; double nodespergen = nodeCount / inc ; double fps = (frames - mark.frames) / elapsed ; sprintf(perfstatusline, "PERF gps %g nps %g fps %g depth %g half %g npg %g nodes %g", genspersec, nodeCount/elapsed, fps, 1+depthDelta/nodeCount, halfFrac, nodespergen, nodeCount) ; lifestatus(perfstatusline) ; } genval = newGen ; mark = *this ; ratemark = *this ; } golly-3.3-src/gollybase/liferules.h0000755000175000017500000001071413145740437014355 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /** * This class implements the rules supported by QuickLife and HashLife. * A rule lookup table is used for computing a new 2x2 grid from * a provided 4x4 grid (two tables are used to emulate B0-not-Smax rules). * The input is a 16-bit integer, with the most significant bit the * upper left corner, bits going horizontally and then down. The output * is a 6-bit integer, with the top two bits indicating the top row of * the 2x2 output grid and the least significant two bits indicating the * bottom row. The middle two bits are always zero. */ #ifndef LIFERULES_H #define LIFERULES_H #include "lifealgo.h" const int MAXRULESIZE = 500 ; // maximum number of characters in a rule const int ALL3X3 = 512 ; // all possible 3x3 cell combinations const int ALL4X4 = 65536 ; // all possible 4x4 cell combinations const int MAP512LENGTH = 86 ; // number of base64 characters to encode 512bit map for Moore neighborhood const int MAP128LENGTH = 22 ; // number of base64 characters to encode 128bit map for Hex neighborhood const int MAP32LENGTH = 6 ; // number of base64 characters to encode 32bit map for von Neumann neighborhood class liferules { public: liferules() ; ~liferules() ; // string returned by setrule is any error const char *setrule(const char *s, lifealgo *algo) ; const char *getrule() ; // AKT: we need 2 tables to support B0-not-Smax rule emulation // where max is 8, 6 or 4 depending on the neighborhood char rule0[ALL4X4] ; // rule table for even gens if rule has B0 but not Smax, // or for all gens if rule has no B0, or it has B0 *and* Smax char rule1[ALL4X4] ; // rule table for odd gens if rule has B0 but not Smax bool alternate_rules ; // set by setrule; true if rule has B0 but not Smax // AKT: support for various neighborhoods // rowett: support for non-totalistic isotropic rules enum neighborhood_masks { MOORE = 0x1ff, // all 8 neighbors HEXAGONAL = 0x0fe, // ignore NE and SW neighbors VON_NEUMANN = 0x0ba // 4 orthogonal neighbors } ; bool isRegularLife() ; // is this B3/S23? bool isHexagonal() const { return neighbormask == HEXAGONAL ; } bool isVonNeumann() const { return neighbormask == VON_NEUMANN ; } bool isWolfram() const { return wolfram >= 0 ; } private: char canonrule[MAXRULESIZE] ; // canonical version of valid rule passed into setrule neighborhood_masks neighbormask ; // neighborhood masks in 3x3 table bool totalistic ; // is rule totalistic? bool using_map ; // is rule a map? int neighbors ; // number of neighbors int rulebits ; // bitmask of neighbor counts used (9 birth, 9 survival) int letter_bits[18] ; // bitmask for non-totalistic letters used int negative_bit ; // bit in letters bits mask indicating negative int wolfram ; // >= 0 if Wn rule (n is even and <= 254) int survival_offset ; // bit offset in rulebits for survival int max_letters[18] ; // maximum number of letters per neighbor count const int *order_letters[18] ; // canonical letter order per neighbor count const char *valid_rule_letters ; // all valid letters const char *rule_letters[4] ; // valid rule letters per neighbor count const int *rule_neighborhoods[4] ; // isotropic neighborhoods per neighbor count char rule3x3[ALL3X3] ; // all 3x3 cell mappings 012345678->4' const char *base64_characters ; // base 64 encoding characters void initRule() ; void setTotalistic(int value, bool survival) ; int flipBits(int x) ; int rotateBits90Clockwise(int x) ; void setSymmetrical512(int x, int b) ; void setSymmetrical(int value, bool survival, int lindex, int normal) ; void setTotalisticRuleFromString(const char *rule, bool survival) ; void setRuleFromString(const char *rule, bool survival) ; void createWolframMap() ; void createRuleMapFromMAP(const char *base64) ; void createRuleMap(const char *birth, const char *survival) ; void convertTo4x4Map(char *which) ; void saveRule() ; void createCanonicalName(lifealgo *algo, const char *base64) ; void removeChar(char *string, char skip) ; bool lettersValid(const char *part) ; int addLetters(int count, int p) ; } ; #endif golly-3.3-src/gollybase/ruletreealgo.cpp0000644000175000017500000002067013145740437015407 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "ruletreealgo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifewarning #include // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #endif #include #include #include using namespace std ; bool ruletreealgo::IsDefaultRule(const char* rulename) { // nicer to check for different versions of default rule return (stricmp(rulename, "B3/S23") == 0 || stricmp(rulename, "B3S23") == 0 || strcmp(rulename, "23/3") == 0); } static FILE* static_rulefile = NULL; static int static_lineno = 0; static char static_endchar = 0; const char* ruletreealgo::LoadTree(FILE* rulefile, int lineno, char endchar, const char* s) { // set static vars so setrule() will load tree data from .rule file static_rulefile = rulefile; static_lineno = lineno; static_endchar = endchar; const char* err = setrule(s); // reset static vars static_rulefile = NULL; static_lineno = 0; static_endchar = 0; return err; } int ruletreealgo::NumCellStates() { return num_states ; } const int MAXFILELEN = 4096 ; /* provide the ability to load the default rule without requiring a file */ static const char *defaultRuleData[] = { "num_states=2", "num_neighbors=8", "num_nodes=32", "1 0 0", "2 0 0", "1 0 1", "2 0 2", "3 1 3", "1 1 1", "2 2 5", "3 3 6", "4 4 7", "2 5 0", "3 6 9", "4 7 10", "5 8 11", "3 9 1", "4 10 13", "5 11 14", "6 12 15", "3 1 1", "4 13 17", "5 14 18", "6 15 19", "7 16 20", "4 17 17", "5 18 22", "6 19 23", "7 20 24", "8 21 25", "5 22 22", "6 23 27", "7 24 28", "8 25 29", "9 26 30", 0 } ; static FILE *OpenTreeFile(const char *rule, const char *dir, char *path) { // look for rule.tree in given dir and set path if (strlen(dir) + strlen(rule) + 15 > (unsigned int)MAXFILELEN) { lifewarning("Path too long") ; return NULL ; } sprintf(path, "%s%s.tree", dir, rule) ; // change "dangerous" characters to underscores for (char *p=path + strlen(dir); *p; p++) if (*p == '/' || *p == '\\') *p = '_' ; return fopen(path, "r") ; } const char* ruletreealgo::setrule(const char* s) { const char *colonptr = strchr(s, ':'); string rule_name(s); if (colonptr) rule_name.assign(s,colonptr); char strbuf[MAXFILELEN+1] ; FILE *f = 0 ; linereader lr(0) ; int lineno = 0 ; bool isDefaultRule = IsDefaultRule(rule_name.c_str()) ; if (isDefaultRule) { // no need to read tree data from a file } else if (static_rulefile) { // read tree data from currently open .rule file lr.setfile(static_rulefile); lr.setcloseonfree(); lineno = static_lineno; } else { if (strlen(rule_name.c_str()) >= (unsigned int)MAXRULESIZE) { return "Rule length too long" ; } // look for rule.tree in user's rules dir then in Golly's rules dir f = OpenTreeFile(rule_name.c_str(), lifegetuserrules(), strbuf); if (f == 0) f = OpenTreeFile(rule_name.c_str(), lifegetrulesdir(), strbuf); if (f == 0) { return "File not found" ; } lr.setfile(f) ; lr.setcloseonfree() ; } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } int mnum_states=-1, mnum_neighbors=-1, mnum_nodes=-1 ; vector dat ; vector datb ; vector noff ; vector nodelev ; int lev = 1000 ; for (;;) { if (isDefaultRule) { if (defaultRuleData[lineno] == 0) break ; strcpy(strbuf, defaultRuleData[lineno]) ; } else { if (lr.fgets(strbuf, MAXFILELEN) == 0) break ; if (static_rulefile && strbuf[0] == static_endchar) break; } lineno++ ; if (strbuf[0] != '#' && strbuf[0] != 0 && sscanf(strbuf, " num_states = %d", &mnum_states) != 1 && sscanf(strbuf, " num_neighbors = %d", &mnum_neighbors) != 1 && sscanf(strbuf, " num_nodes = %d", &mnum_nodes) != 1) { if (mnum_states < 2 || mnum_states > 256 || (mnum_neighbors != 4 && mnum_neighbors != 8) || mnum_nodes < mnum_neighbors || mnum_nodes > 100000000) { return "Bad basic values" ; } if (strbuf[0] < '1' || strbuf[0] > '0' + 1 + mnum_neighbors) { return "Bad line in tree data 1" ; } lev = strbuf[0] - '0' ; int vcnt = 0 ; char *p = strbuf + 1 ; if (lev == 1) noff.push_back((int)(datb.size())) ; else noff.push_back((int)(dat.size())) ; nodelev.push_back(lev) ; while (*p) { while (*p && *p <= ' ') p++ ; int v = 0 ; while (*p > ' ') { if (*p < '0' || *p > '9') { return "Bad line in tree data 2" ; } v = v * 10 + *p++ - '0' ; } if (lev == 1) { if (v < 0 || v >= mnum_states) { return "Bad state value in tree data" ; } datb.push_back((state)v) ; } else { if (v < 0 || ((unsigned int)v) >= noff.size()) { return "Bad node value in tree data" ; } if (nodelev[v] != lev - 1) { return "Bad node pointer does not point to one level down" ; } dat.push_back(noff[v]) ; } vcnt++ ; } if (vcnt != mnum_states) { return "Bad number of values on tree data line" ; } } } if (dat.size() + datb.size() != (unsigned int)(mnum_nodes * mnum_states)) return "Bad count of values in tree data" ; if (lev != mnum_neighbors + 1) return "Bad last node (wrong level)" ; int *na = (int*)calloc(sizeof(int), dat.size()) ; state *nb = (state*)calloc(sizeof(state), datb.size()) ; if (na == 0 || nb == 0) return "Out of memory in tree allocation" ; if (a) free(a) ; if (b) free(b) ; num_nodes = mnum_nodes ; num_states = mnum_states ; num_neighbors = mnum_neighbors ; for (unsigned int i=0; i 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix int len = (int)strlen(rule) ; const char* bounds = canonicalsuffix() ; int i = 0 ; while (bounds[i]) rule[len++] = bounds[i++] ; rule[len] = 0 ; } return 0 ; } const char* ruletreealgo::getrule() { return rule ; } const char* ruletreealgo::DefaultRule() { return "B3/S23" ; } ruletreealgo::ruletreealgo() : ghashbase(), a(0), base(0), b(0), num_neighbors(0), num_states(0), num_nodes(0) { rule[0] = 0 ; } ruletreealgo::~ruletreealgo() { if (a != 0) { free(a) ; a = 0 ; } if (b != 0) { free(b) ; b = 0 ; } } state ruletreealgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { if (num_neighbors == 4) return b[a[a[a[a[base+n]+w]+e]+s]+c] ; else return b[a[a[a[a[a[a[a[a[base+nw]+ne]+sw]+se]+n]+w]+e]+s]+c] ; } static lifealgo *creator() { return new ruletreealgo() ; } void ruletreealgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("RuleTree") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 2 ; ai.maxstates = 256 ; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } golly-3.3-src/gollybase/viewport.h0000644000175000017500000000403313145740437014234 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef VIEWPORT_H #define VIEWPORT_H #include "bigint.h" #include using std::pair; using std::make_pair; class lifealgo ; /** * This class holds information on where in space the user's window is. * It provides the functions to zoom, unzoom, move, etc. * * The reason we need a whole class is because doing this in a universe * that may be billions of billions of cells on a side, but we still * want single cell precision, is a bit tricky. */ class viewport { public: viewport(int width, int height) { init() ; resize(width, height) ; } void zoom() ; void zoom(int x, int y) ; void unzoom() ; void unzoom(int x, int y) ; void center() ; pair at(int x, int y) ; pair atf(int x, int y) ; pair screenPosOf(bigint x, bigint y, lifealgo *algo) ; void resize(int newwidth, int newheight) ; void move(int dx, int dy) ; // dx and dy are given in pixels int getmag() const { return mag ; } void setmag(int magarg) { mag = magarg ; reposition() ; } void setpositionmag(const bigint &xarg, const bigint &yarg, int magarg) ; void setpositionmag(const bigint &xlo, const bigint &xhi, const bigint &ylo, const bigint &yhi, int magarg) ; int getwidth() const { return width ; } int getheight() const { return height ; } int getxmax() const { return width-1 ; } int getymax() const { return height-1 ; } int contains(const bigint &x, const bigint &y) ; bigint x, y ; // cell at center of viewport private: void init() ; void reposition() ; // recalculate *0* and *m* values int width, height ; int mag ; // plus is zoom in; neg is zoom out bigint x0, y0 ; double x0f, y0f ; double xymf ; // always = 2**-mag } ; extern int MAX_MAG; // maximum cell size is 2^MAX_MAG (default is 2^4, but devices with // high-resolution screens will probably want a bigger cell size) #endif golly-3.3-src/gollybase/viewport.cpp0000644000175000017500000001271713145740437014577 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "viewport.h" #include "lifealgo.h" #include int MAX_MAG = 4 ; // default maximum cell size is 2^4 using namespace std ; void viewport::init() { x = 0 ; y = 0 ; height = width = 8 ; mag = 0 ; x0 = 0 ; y0 = 0 ; x0f = 0 ; y0f = 0 ; xymf = 0 ; } void viewport::zoom() { if (mag >= MAX_MAG) return ; mag++ ; reposition() ; } void viewport::zoom(int xx, int yy) { if (mag >= MAX_MAG) return ; pair oldpos = at(xx, yy); // save cell pos for use below int x2c = xx * 2 - getxmax() ; bigint o = x2c ; o.mulpow2(-mag-2) ; x += o ; int y2c = yy * 2 - getymax() ; o = y2c ; o.mulpow2(-mag-2) ; y += o ; mag++ ; reposition() ; // adjust cell position if necessary to avoid any drift if (mag >= 0) { pair newpos = at(xx, yy); bigint xdrift = newpos.first; bigint ydrift = newpos.second; xdrift -= oldpos.first; ydrift -= oldpos.second; // drifts will be -1, 0 or 1 if (xdrift != 0) move(-xdrift.toint() << mag, 0); if (ydrift != 0) move(0, -ydrift.toint() << mag); } } void viewport::unzoom() { mag-- ; reposition() ; } void viewport::unzoom(int xx, int yy) { pair oldpos = at(xx, yy); // save cell pos for use below mag-- ; int x2c = xx * 2 - getxmax() ; bigint o = x2c ; o.mulpow2(-mag-2) ; x -= o ; int y2c = yy * 2 - getymax() ; o = y2c ; o.mulpow2(-mag-2) ; y -= o ; reposition() ; if (mag >= 0) { // adjust cell position if necessary to avoid any drift pair newpos = at(xx, yy); bigint xdrift = newpos.first; bigint ydrift = newpos.second; xdrift -= oldpos.first; ydrift -= oldpos.second; // drifts will be -1, 0 or 1 if (xdrift != 0) move(-xdrift.toint() << mag, 0); if (ydrift != 0) move(0, -ydrift.toint() << mag); } } pair viewport::at(int x, int y) { bigint rx = x ; bigint ry = y ; rx.mulpow2(-mag) ; ry.mulpow2(-mag) ; rx += x0 ; ry += y0 ; return pair(rx, ry) ; } pair viewport::atf(int x, int y) { return pair(x0f + x * xymf, y0f + y * xymf) ; } /** * Returns the screen position of a particular pixel. Note that this * is a tiny bit more complicated than you might expect, because it * has to take into account exactly how a life algorithm compresses * multiple pixels into a single pixel (which depends not only on the * lifealgo, but in the case of qlifealgo, *also* depends on the * generation count). In the case of mag < 0, it always returns * the upper left pixel; it's up to the caller to adjust when * mag<0. */ pair viewport::screenPosOf(bigint x, bigint y, lifealgo *algo) { if (mag < 0) { bigint xx0 = x0 ; bigint yy0 = y0 ; algo->lowerRightPixel(xx0, yy0, mag) ; y -= yy0 ; x -= xx0 ; } else { x -= x0 ; y -= y0 ; } x.mulpow2(mag) ; y.mulpow2(mag) ; int xx = 0 ; int yy = 0 ; /* AKT: don't do this clipping as it makes it harder to calculate an accurate paste rectangle if (x < 0) xx = -1 ; else if (x > getxmax()) xx = getxmax() + 1 ; else xx = x.toint() ; if (y < 0) yy = -1 ; else if (y > getymax()) yy = getymax() + 1 ; else yy = y.toint() ; */ if (x > bigint::maxint) xx = INT_MAX ; else if (x < bigint::minint) xx = INT_MIN ; else xx = x.toint() ; if (y > bigint::maxint) yy = INT_MAX ; else if (y < bigint::minint) yy = INT_MIN ; else yy = y.toint() ; return pair(xx,yy) ; } void viewport::move(int dx, int dy) { // dx and dy are in pixels if (mag > 0) { dx /= (1 << mag) ; dy /= (1 << mag) ; } bigint addx = dx ; bigint addy = dy ; if (mag < 0) { addx <<= -mag ; addy <<= -mag ; } x += addx ; y += addy ; reposition() ; } void viewport::resize(int newwidth, int newheight) { width = newwidth ; height = newheight ; reposition() ; } void viewport::center() { x = 0 ; y = 0 ; reposition() ; } void viewport::reposition() { xymf = pow(2.0, -mag) ; bigint w = 1 + getxmax() ; w.mulpow2(-mag) ; w >>= 1 ; x0 = x ; x0 -= w ; w = 1 + getymax() ; w.mulpow2(-mag) ; w >>= 1 ; y0 = y ; y0 -= w ; y0f = y0.todouble() ; x0f = x0.todouble() ; } void viewport::setpositionmag(const bigint &xarg, const bigint &yarg, int magarg) { x = xarg ; y = yarg ; mag = magarg ; reposition() ; } /* * This is only called by fit. We find an x/y location that * centers things optimally. */ void viewport::setpositionmag(const bigint &xmin, const bigint &xmax, const bigint &ymin, const bigint &ymax, int magarg) { mag = magarg ; x = xmax ; x += xmin ; x += 1 ; x >>= 1 ; y = ymax ; y += ymin ; y += 1 ; y >>= 1 ; reposition() ; } int viewport::contains(const bigint &xarg, const bigint &yarg) { if (xarg < x0 || yarg < y0) return 0 ; bigint t = getxmax() ; t += 1 ; t.mulpow2(-mag) ; t -= 1 ; t += x0 ; if (xarg > t) return 0 ; t = getymax() ; t += 1 ; t.mulpow2(-mag) ; t -= 1 ; t += y0 ; if (yarg > t) return 0 ; return 1 ; } golly-3.3-src/gollybase/lifealgo.cpp0000644000175000017500000007236213247734027014505 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "lifealgo.h" #include "util.h" // for lifestatus #include "string.h" using namespace std ; lifealgo::~lifealgo() { poller = 0 ; maxCellStates = 2 ; } int lifealgo::verbose ; /* * Right now, the base/expo should match the current increment. * We do not check this. */ int lifealgo::startrecording(int basearg, int expoarg) { if (timeline.framecount) { // already have a timeline; skip to its end gotoframe(timeline.framecount-1) ; } else { // use the current frame and increment to start a new timeline void *now = getcurrentstate() ; if (now == 0) return 0 ; timeline.base = basearg ; timeline.expo = expoarg ; timeline.frames.push_back(now) ; timeline.framecount = 1 ; timeline.end = timeline.start = generation ; timeline.inc = increment ; } timeline.next = timeline.end ; timeline.next += timeline.inc ; timeline.recording = 1 ; return timeline.framecount ; } pair lifealgo::stoprecording() { timeline.recording = 0 ; timeline.next = 0 ; return make_pair(timeline.base, timeline.expo) ; } void lifealgo::extendtimeline() { if (timeline.recording && generation == timeline.next) { void *now = getcurrentstate() ; if (now && timeline.framecount < MAX_FRAME_COUNT) { timeline.frames.push_back(now) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } } } /* * Note that this *also* changes inc, so don't call unless this is * what you want to do. It does not update or change the base or * expo if the base != 2, so they can get out of sync. * * Currently this is only used by bgolly, and it will only work * properly if the increment argument is a power of two. */ void lifealgo::pruneframes() { if (timeline.framecount > 1) { for (int i=2; i> 1] = timeline.frames[i] ; timeline.framecount = (timeline.framecount + 1) >> 1 ; timeline.frames.resize(timeline.framecount) ; timeline.inc += timeline.inc ; timeline.end = timeline.inc ; timeline.end.mul_smallint(timeline.framecount-1) ; timeline.end += timeline.start ; timeline.next = timeline.end ; timeline.next += timeline.inc ; if (timeline.base == 2) timeline.expo++ ; } } int lifealgo::gotoframe(int i) { if (i < 0 || i >= timeline.framecount) return 0 ; setcurrentstate(timeline.frames[i]) ; // AKT: avoid mul_smallint(i) crashing with divide-by-zero if i is 0 if (i > 0) { generation = timeline.inc ; generation.mul_smallint(i) ; } else { generation = 0; } generation += timeline.start ; return timeline.framecount ; } void lifealgo::destroytimeline() { timeline.frames.clear() ; timeline.recording = 0 ; timeline.framecount = 0 ; timeline.end = 0 ; timeline.start = 0 ; timeline.inc = 0 ; timeline.next = 0 ; } // ----------------------------------------------------------------------------- // AKT: the following routines provide support for a bounded universe const char* lifealgo::setgridsize(const char* suffix) { // parse a rule suffix like ":T100,200" and set the various grid parameters; // note that we allow any legal partial suffix -- this lets people type a // suffix into the Set Rule dialog without the algorithm changing to UNKNOWN const char *p = suffix; char topology = 0; gridwd = gridht = 0; hshift = vshift = 0; htwist = vtwist = false; boundedplane = false; sphere = false; p++; if (*p == 0) return 0; // treat ":" like ":T0,0" if (*p == 't' || *p == 'T') { // torus or infinite tube topology = 'T'; } else if (*p == 'p' || *p == 'P') { boundedplane = true; topology = 'P'; } else if (*p == 's' || *p == 'S') { sphere = true; topology = 'S'; } else if (*p == 'k' || *p == 'K') { // Klein bottle (either htwist or vtwist should become true) topology = 'K'; } else if (*p == 'c' || *p == 'C') { // cross-surface htwist = vtwist = true; topology = 'C'; } else { return "Unknown grid topology."; } p++; if (*p == 0) return 0; // treat ":" like ":T0,0" while ('0' <= *p && *p <= '9') { if (gridwd >= 200000000) { gridwd = 2000000000; // keep width within editable limits } else { gridwd = 10 * gridwd + *p - '0'; } p++; } if (*p == '*') { if (topology != 'K') return "Only specify a twist for a Klein bottle."; htwist = true; p++; } if (*p == '+' || *p == '-') { if (topology == 'P') return "Plane can't have a shift."; if (topology == 'S') return "Sphere can't have a shift."; if (topology == 'C') return "Cross-surface can't have a shift."; if (topology == 'K' && !htwist) return "Shift must be on twisted edges."; if (gridwd == 0) return "Can't shift infinite width."; int sign = *p == '+' ? 1 : -1; p++; while ('0' <= *p && *p <= '9') { hshift = 10 * hshift + *p - '0'; p++; } if (hshift >= (int)gridwd) hshift = hshift % (int)gridwd; hshift *= sign; } if (*p == ',' && topology != 'S') { p++; } else if (*p) { return "Unexpected stuff after grid width."; } // gridwd has been set if ((topology == 'K' || topology == 'C' || topology == 'S') && gridwd == 0) { return "Given topology can't have an infinite width."; } if (*p == 0) { // grid height is not specified so set it to grid width; // ie. treat ":T100" like ":T100,100"; // this also allows us to have ":S100" rather than ":S100,100" gridht = gridwd; } else { while ('0' <= *p && *p <= '9') { if (gridht >= 200000000) { gridht = 2000000000; // keep height within editable limits } else { gridht = 10 * gridht + *p - '0'; } p++; } if (*p == '*') { if (topology != 'K') return "Only specify a twist for a Klein bottle."; if (htwist) return "Klein bottle can't have both horizontal and vertical twists."; vtwist = true; p++; } if (*p == '+' || *p == '-') { if (topology == 'P') return "Plane can't have a shift."; if (topology == 'C') return "Cross-surface can't have a shift."; if (topology == 'K' && !vtwist) return "Shift must be on twisted edges."; if (hshift != 0) return "Can't have both horizontal and vertical shifts."; if (gridht == 0) return "Can't shift infinite height."; int sign = *p == '+' ? 1 : -1; p++; while ('0' <= *p && *p <= '9') { vshift = 10 * vshift + *p - '0'; p++; } if (vshift >= (int)gridht) vshift = vshift % (int)gridht; vshift *= sign; } if (*p) return "Unexpected stuff after grid height."; } // gridht has been set if ((topology == 'K' || topology == 'C') && gridht == 0) { return "Klein bottle or cross-surface can't have an infinite height."; } if (topology == 'K' && !(htwist || vtwist)) { // treat ":K10,20" like ":K10,20*" vtwist = true; } if ((hshift != 0 || vshift != 0) && (gridwd == 0 || gridht == 0)) { return "Shifting is not allowed if either grid dimension is unbounded."; } // now ok to set grid edges if (gridwd > 0) { gridleft = -int(gridwd) / 2; gridright = int(gridwd) - 1; gridright += gridleft; } else { // play safe and set these to something gridleft = bigint::zero; gridright = bigint::zero; } if (gridht > 0) { gridtop = -int(gridht) / 2; gridbottom = int(gridht) - 1; gridbottom += gridtop; } else { // play safe and set these to something gridtop = bigint::zero; gridbottom = bigint::zero; } return 0; } const char* lifealgo::canonicalsuffix() { if (gridwd > 0 || gridht > 0) { static char bounds[64]; if (boundedplane) { sprintf(bounds, ":P%u,%u", gridwd, gridht); } else if (sphere) { // sphere requires a square grid (gridwd == gridht) sprintf(bounds, ":S%u", gridwd); } else if (htwist && vtwist) { // cross-surface if both horizontal and vertical edges are twisted sprintf(bounds, ":C%u,%u", gridwd, gridht); } else if (htwist) { // Klein bottle if only horizontal edges are twisted if (hshift != 0 && (gridwd & 1) == 0) { // twist and shift is only possible if gridwd is even and hshift is 1 sprintf(bounds, ":K%u*+1,%u", gridwd, gridht); } else { sprintf(bounds, ":K%u*,%u", gridwd, gridht); } } else if (vtwist) { // Klein bottle if only vertical edges are twisted if (vshift != 0 && (gridht & 1) == 0) { // twist and shift is only possible if gridht is even and vshift is 1 sprintf(bounds, ":K%u,%u*+1", gridwd, gridht); } else { sprintf(bounds, ":K%u,%u*", gridwd, gridht); } } else if (hshift < 0) { // torus with -ve horizontal shift sprintf(bounds, ":T%u%d,%u", gridwd, hshift, gridht); } else if (hshift > 0) { // torus with +ve horizontal shift sprintf(bounds, ":T%u+%d,%u", gridwd, hshift, gridht); } else if (vshift < 0) { // torus with -ve vertical shift sprintf(bounds, ":T%u,%u%d", gridwd, gridht, vshift); } else if (vshift > 0) { // torus with +ve vertical shift sprintf(bounds, ":T%u,%u+%d", gridwd, gridht, vshift); } else { // unshifted torus, or an infinite tube sprintf(bounds, ":T%u,%u", gridwd, gridht); } return bounds; } else { // unbounded universe return 0; } } void lifealgo::JoinTwistedEdges() { // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (htwist && vtwist) { // cross-surface // eg. :C4,3 // a l k j i d // l A B C D i // h E F G H e // d I J K L a // i d c b a l for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = getcell(twistedx, gt); if (state > 0) setcell(x, bb, state); state = getcell(twistedx, gb); if (state > 0) setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = getcell(gl, twistedy); if (state > 0) setcell(br, y, state); state = getcell(gr, twistedy); if (state > 0) setcell(bl, y, state); } // copy grid's corner cells to SAME corners in border // (these cells are topologically different to non-corner cells) setcell(bl, bt, getcell(gl, gt)); setcell(br, bt, getcell(gr, gt)); setcell(br, bb, getcell(gr, gb)); setcell(bl, bb, getcell(gl, gb)); } else if (htwist) { // Klein bottle with top and bottom edges twisted 180 degrees // eg. :K4*,3 // i l k j i l // d A B C D a // h E F G H e // l I J K L i // a d c b a d for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = getcell(twistedx, gt); if (state > 0) setcell(x, bb, state); state = getcell(twistedx, gb); if (state > 0) setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist int state = getcell(gl, y); if (state > 0) setcell(br, y, state); state = getcell(gr, y); if (state > 0) setcell(bl, y, state); } // do corner cells setcell(bl, bt, getcell(gl, gb)); setcell(br, bt, getcell(gr, gb)); setcell(bl, bb, getcell(gl, gt)); setcell(br, bb, getcell(gr, gt)); } else { // vtwist // Klein bottle with left and right edges twisted 180 degrees // eg. :K4,3* // d i j k l a // l A B C D i // h E F G H e // d I J K L a // l a b c d i for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist int state = getcell(x, gt); if (state > 0) setcell(x, bb, state); state = getcell(x, gb); if (state > 0) setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = getcell(gl, twistedy); if (state > 0) setcell(br, y, state); state = getcell(gr, twistedy); if (state > 0) setcell(bl, y, state); } // do corner cells setcell(bl, bt, getcell(gr, gt)); setcell(br, bt, getcell(gl, gt)); setcell(bl, bb, getcell(gr, gb)); setcell(br, bb, getcell(gl, gb)); } } void lifealgo::JoinTwistedAndShiftedEdges() { // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (hshift != 0) { // Klein bottle with shift by 1 on twisted horizontal edge (with even number of cells) // eg. :K4*+1,3 // j i l k j i // d A B C D a // h E F G H e // l I J K L i // b a d c b a int state, twistedx, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a twist and then shift by 1 twistedx = gr - x + gl; shiftedx = twistedx - 1; if (shiftedx < gl) shiftedx = gr; state = getcell(shiftedx, gb); if (state > 0) setcell(x, bt, state); state = getcell(shiftedx, gt); if (state > 0) setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist or shift state = getcell(gl, y); if (state > 0) setcell(br, y, state); state = getcell(gr, y); if (state > 0) setcell(bl, y, state); } // do corner cells shiftedx = gl - 1; if (shiftedx < gl) shiftedx = gr; setcell(bl, bt, getcell(shiftedx, gb)); setcell(bl, bb, getcell(shiftedx, gt)); shiftedx = gr - 1; if (shiftedx < gl) shiftedx = gr; setcell(br, bt, getcell(shiftedx, gb)); setcell(br, bb, getcell(shiftedx, gt)); } else { // vshift != 0 // Klein bottle with shift by 1 on twisted vertical edge (with even number of cells) // eg. :K3,4*+1 // f j k l d // c A B C a // l D E F j // i G H I g // f J K L d // c a b c a int state, twistedy, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist or shift state = getcell(x, gt); if (state > 0) setcell(x, bb, state); state = getcell(x, gb); if (state > 0) setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a twist and then shift by 1 twistedy = gb - y + gt; shiftedy = twistedy - 1; if (shiftedy < gt) shiftedy = gb; state = getcell(gr, shiftedy); if (state > 0) setcell(bl, y, state); state = getcell(gl, shiftedy); if (state > 0) setcell(br, y, state); } // do corner cells shiftedy = gt - 1; if (shiftedy < gt) shiftedy = gb; setcell(bl, bt, getcell(gr, shiftedy)); setcell(br, bt, getcell(gl, shiftedy)); shiftedy = gb - 1; if (shiftedy < gt) shiftedy = gb; setcell(bl, bb, getcell(gr, shiftedy)); setcell(br, bb, getcell(gl, shiftedy)); } } void lifealgo::JoinShiftedEdges() { // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (hshift != 0) { // torus with horizontal shift // eg. :T4+1,3 // k l i j k l // d A B C D a // h E F G H e // l I J K L i // a b c d a b int state, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a horizontal shift shiftedx = x - hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; state = getcell(shiftedx, gb); if (state > 0) setcell(x, bt, state); shiftedx = x + hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; state = getcell(shiftedx, gt); if (state > 0) setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no shift state = getcell(gl, y); if (state > 0) setcell(br, y, state); state = getcell(gr, y); if (state > 0) setcell(bl, y, state); } // do corner cells shiftedx = gr - hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; setcell(bl, bt, getcell(shiftedx, gb)); shiftedx = gl - hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; setcell(br, bt, getcell(shiftedx, gb)); shiftedx = gr + hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; setcell(bl, bb, getcell(shiftedx, gt)); shiftedx = gl + hshift; if (shiftedx < gl) shiftedx += gridwd; else if (shiftedx > gr) shiftedx -= gridwd; setcell(br, bb, getcell(shiftedx, gt)); } else { // vshift != 0 // torus with vertical shift // eg. :T4,3+1 // h i j k l a // l A B C D e // d E F G H i // h I J K L a // l a b c d e int state, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no shift state = getcell(x, gt); if (state > 0) setcell(x, bb, state); state = getcell(x, gb); if (state > 0) setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a vertical shift shiftedy = y - vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; state = getcell(gr, shiftedy); if (state > 0) setcell(bl, y, state); shiftedy = y + vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; state = getcell(gl, shiftedy); if (state > 0) setcell(br, y, state); } // do corner cells shiftedy = gb - vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; setcell(bl, bt, getcell(gr, shiftedy)); shiftedy = gb + vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; setcell(br, bt, getcell(gl, shiftedy)); shiftedy = gt - vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; setcell(bl, bb, getcell(gr, shiftedy)); shiftedy = gt + vshift; if (shiftedy < gt) shiftedy += gridht; else if (shiftedy > gb) shiftedy -= gridht; setcell(br, bb, getcell(gl, shiftedy)); } } void lifealgo::JoinAdjacentEdges(int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; // sphere // eg. :S3 // a a d g c // a A B C g // b D E F h // c G H I i // g c f i i // copy live cells in top edge to left border for (int x = pl; x <= pr; x++) { int state; int skip = nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) setcell(bl, gt + (x - gl), state); } // copy live cells in left edge to top border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = getcell(gl, y); if (state > 0) setcell(gl + (y - gt), bt, state); } // copy live cells in bottom edge to right border for (int x = pl; x <= pr; x++) { int state; int skip = nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) setcell(br, gt + (x - gl), state); } // copy live cells in right edge to bottom border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = getcell(gr, y); if (state > 0) setcell(gl + (y - gt), bb, state); } // copy grid's corner cells to SAME corners in border setcell(bl, bt, getcell(gl, gt)); setcell(br, bt, getcell(gr, gt)); setcell(br, bb, getcell(gr, gb)); setcell(bl, bb, getcell(gl, gb)); } void lifealgo::JoinEdges(int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (gridht > 0) { // copy live cells in top edge to bottom border for (int x = pl; x <= pr; x++) { int state; int skip = nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) setcell(x, bb, state); } // copy live cells in bottom edge to top border for (int x = pl; x <= pr; x++) { int state; int skip = nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) setcell(x, bt, state); } } if (gridwd > 0) { // copy live cells in left edge to right border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = getcell(gl, y); if (state > 0) setcell(br, y, state); } // copy live cells in right edge to left border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = getcell(gr, y); if (state > 0) setcell(bl, y, state); } } if (gridwd > 0 && gridht > 0) { // copy grid's corner cells to opposite corners in border setcell(bl, bt, getcell(gr, gb)); setcell(br, bt, getcell(gl, gb)); setcell(br, bb, getcell(gl, gt)); setcell(bl, bb, getcell(gr, gt)); } } bool lifealgo::CreateBorderCells() { // no need to do anything if there is no pattern or if the grid is a bounded plane if (isEmpty() || boundedplane) return true; bigint top, left, bottom, right; findedges(&top, &left, &bottom, &right); // no need to do anything if pattern is completely inside grid edges if ( (gridwd == 0 || (gridleft < left && gridright > right)) && (gridht == 0 || (gridtop < top && gridbottom > bottom)) ) { return true; } // if grid has infinite width or height then pattern might be too big to use setcell/getcell if ( (gridwd == 0 || gridht == 0) && (top < bigint::min_coord || left < bigint::min_coord || bottom > bigint::max_coord || right > bigint::max_coord) ) { lifestatus("Pattern is beyond editing limit!"); // return false so caller can exit step() loop return false; } if (sphere) { // to get a sphere we join top edge with left edge, and right edge with bottom edge; // note that grid must be square (gridwd == gridht) int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinAdjacentEdges(pt, pl, pb, pr); } else if (htwist || vtwist) { // Klein bottle or cross-surface if ( (htwist && hshift != 0 && (gridwd & 1) == 0) || (vtwist && vshift != 0 && (gridht & 1) == 0) ) { // Klein bottle with shift is only possible if the shift is on the // twisted edge and that edge has an even number of cells JoinTwistedAndShiftedEdges(); } else { JoinTwistedEdges(); } } else if (hshift != 0 || vshift != 0) { // torus with horizontal or vertical shift JoinShiftedEdges(); } else { // unshifted torus or infinite tube int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinEdges(pt, pl, pb, pr); } endofpattern(); return true; } void lifealgo::ClearRect(int top, int left, int bottom, int right) { int cx, cy, v; for ( cy = top; cy <= bottom; cy++ ) { for ( cx = left; cx <= right; cx++ ) { int skip = nextcell(cx, cy, v); if (skip + cx > right) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so delete it cx += skip; setcell(cx, cy, 0); } else { cx = right + 1; // done this row } } } } bool lifealgo::DeleteBorderCells() { // no need to do anything if there is no pattern if (isEmpty()) return true; // need to find pattern edges because pattern may have expanded beyond grid // (typically by 2 cells, but could be more if rule allows births in empty space) bigint top, left, bottom, right; findedges(&top, &left, &bottom, &right); // no need to do anything if grid encloses entire pattern if ( (gridwd == 0 || (gridleft <= left && gridright >= right)) && (gridht == 0 || (gridtop <= top && gridbottom >= bottom)) ) { return true; } // set pattern edges int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); // set grid edges int gl = gridleft.toint(); int gt = gridtop.toint(); int gr = gridright.toint(); int gb = gridbottom.toint(); if (gridht > 0 && pt < gt) { // delete live cells above grid ClearRect(pt, pl, gt-1, pr); pt = gt; // reduce size of rect below } if (gridht > 0 && pb > gb) { // delete live cells below grid ClearRect(gb+1, pl, pb, pr); pb = gb; // reduce size of rect below } if (gridwd > 0 && pl < gl) { // delete live cells left of grid ClearRect(pt, pl, pb, gl-1); } if (gridwd > 0 && pr > gr) { // delete live cells right of grid ClearRect(pt, gr+1, pb, pr); } endofpattern(); // do this test AFTER clearing border if ( top < bigint::min_coord || left < bigint::min_coord || bottom > bigint::max_coord || right > bigint::max_coord ) { lifestatus("Pattern exceeded editing limit!"); // return false so caller can exit step() loop return false; } return true; } void lifealgo::getcells(unsigned char *buf, int x, int y, int w, int h) { viewport vp(w, h) ; vp.setpositionmag(x+(w>>1), y+(h>>1), 0) ; staterender hsr(buf, w, h) ; memset(buf, 0, w*h) ; draw(vp, hsr) ; } // ----------------------------------------------------------------------------- int staticAlgoInfo::nextAlgoId = 0 ; staticAlgoInfo *staticAlgoInfo::head = 0 ; staticAlgoInfo::staticAlgoInfo() { id = nextAlgoId++ ; next = head ; head = this ; // init default icon data defxpm7x7 = NULL; defxpm15x15 = NULL; defxpm31x31 = NULL; } staticAlgoInfo *staticAlgoInfo::byName(const char *s) { for (staticAlgoInfo *i=head; i; i=i->next) if (strcmp(i->algoName, s) == 0) return i ; return 0 ; } int staticAlgoInfo::nameToIndex(const char *s) { staticAlgoInfo *r = byName(s) ; if (r == 0) return -1 ; return r->id ; } staticAlgoInfo &staticAlgoInfo::tick() { return *(new staticAlgoInfo()) ; } golly-3.3-src/docs/0000755000175000017500000000000013451370074011227 500000000000000golly-3.3-src/docs/ReadMe.html0000644000175000017500000000467513125321675013207 00000000000000 Read Me for Golly

Welcome to Golly, a sophisticated tool for exploring Conway's Game of Life and many other types of cellular automata.

Key features:

  • Free, open source and cross-platform (Windows, Mac, Linux).
  • Supports both bounded and unbounded universes.
  • Supports various topologies (plane, torus, Klein bottle, etc.).
  • Supports multi-state universes (cells can have up to 256 states).
  • Includes QuickLife, a fast, memory-efficient algorithm.
  • Use the HashLife algorithm to see large patterns evolve at huge time scales.
  • Supports many different rules, including Wolfram's 1D rules, WireWorld, Generations, Larger than Life, and John von Neumann's 29-state CA.
  • Use the RuleLoader algorithm to load your own rules.
  • Responsive even while generating or garbage collecting.
  • Reads RLE, macrocell, Life 1.05/1.06, dblife, and MCell files.
  • Can also read common graphic formats: BMP, PNG, GIF, TIFF.
  • Can extract patterns, scripts and rules from zip files.
  • Download files from online archives.
  • Includes a state-of-the-art pattern collection.
  • Fast loading of large patterns.
  • Paste in patterns from the clipboard.
  • Unlimited undo/redo.
  • Unbounded zooming out for astronomical patterns.
  • Auto fit option keeps a generating pattern within view.
  • Full screen option (no menu/status/tool/scroll bars).
  • Supports multiple layers, including cloned layers.
  • HTML-based help with an integrated Life Lexicon.
  • Scriptable via Lua or Python.
  • User-configurable keyboard shortcuts.

The Golly application can be installed anywhere you like, but make sure you move the whole folder because the various subfolders must be kept with the application.

We also provide bgolly, a GUI-less version of Golly that can be run from the command line.

The latest information is available at the Golly web site:

http://golly.sourceforge.net/

Now go forth and generate!

Andrew Trevorrow (andrew@trevorrow.com)
Tom Rokicki (rokicki@gmail.com)
(on behalf of The Golly Gang)

golly-3.3-src/docs/License.html0000644000175000017500000007765313451370074013441 00000000000000 License info for Golly

Golly is an open source, cross-platform application for exploring
John Conway's Game of Life and many other types of cellular automata.

Copyright (C) 2005-2019 The Golly Gang (Andrew Trevorrow, Tomas Rokicki,
Tim Hutton, Dave Greene, Jason Summers, Maks Verver, Robert Munafo,
Brenton Bostick, Chris Rowett).

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License (see below), or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Web site:  http://sourceforge.net/projects/golly
Contacts:  rokicki@gmail.com  andrew@trevorrow.com

======================================================================

		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    
    Copyright (C)   

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  , 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.

======================================================================

Golly uses an embedded Python interpreter for its scripting language.
Here is the official license for the Python 2.4 release:

A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.2             2.1.1       2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2.1           2.2         2002        PSF         yes
    2.2.2           2.2.1       2002        PSF         yes
    2.2.3           2.2.2       2003        PSF         yes
    2.3             2.2.2       2002-2003   PSF         yes
    2.3.1           2.3         2002-2003   PSF         yes
    2.3.2           2.3.1       2002-2003   PSF         yes
    2.3.3           2.3.2       2002-2003   PSF         yes
    2.3.4           2.3.3       2004        PSF         yes
    2.3.5           2.3.4       2005        PSF         yes
    2.4             2.3         2004        PSF         yes
    2.4.1           2.4         2005        PSF         yes
    2.4.2           2.4.1       2005        PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PSF LICENSE AGREEMENT FOR PYTHON 2.4
------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using Python 2.4 software in source or binary form and its
associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 2.4
alone or in any derivative version, provided, however, that PSF's
License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved"
are retained in Python 2.4 alone or in any derivative version prepared
by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 2.4 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 2.4.

4. PSF is making Python 2.4 available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
2.4 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python 2.4, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
golly-3.3-src/docs/Build.html0000644000175000017500000005533513451370074013107 00000000000000 How to build Golly

This document contains instructions for how to build the desktop version of Golly.

Contents

How to install wxWidgets
      On Windows
      On Mac OS X
      On Linux
How to install Python
How to build Golly
      On Windows
      On Mac OS X
      On Linux
Building Golly using configure
How to install optional sound with irrKlang
How to build bgolly
Source code road map
      Directory structure
      High-level GUI code
      Low-level base code

How to install wxWidgets

If you want to build Golly from source code then you'll have to install wxWidgets first. Visit http://www.wxwidgets.org/downloads and grab the appropriate source archive for your platform:

  • On Windows, get the wxMSW source installer.
  • On Mac OS X or Linux, get the source archive for the latest stable release.

Golly should compile with wxWidgets 2.8.0 or later, but it's best to use the latest stable version (3.0.2 at time of writing). Mac users should definitely get 3.1 or later if you have Mac OS 10.9+.

On Windows

If your wxWidgets version is earlier than 3.0 then you need to enable OpenGL. Edit \wxWidgets\include\wx\msw\setup.h, find the line "#define wxUSE_GLCANVAS 0" and change the value to 1. If you've previously built wxWidgets 2.x without OpenGL enabled then you might also need to edit \wxWidgets\lib\vc_lib\mswu\wx\setup.h, change wxUSE_GLCANVAS to 1, then run "nmake -f makefile.vc clean" before running "nmake -f makefile.vc".

If you only want to build one wxWidgets configuration (e.g. a 32-bit release) then it's a good idea to edit \wxWidgets\build\msw\config.vc and set all these options:

   BUILD=release
   DEBUG_INFO=0
   DEBUG_FLAG=0
   UNICODE=1             (already 1 in wxWidgets 3.0+)
   USE_OPENGL=1          (already 1 in wxWidgets 3.0+)
   TARGET_CPU=X64        (only if you want a 64-bit build)
   RUNTIME_LIBS=static

Then you can build wxWidgets very simply:

   cd \wxWidgets\build\msw
   nmake -f makefile.vc

If you don't edit config.vc then you'll need to pass all the options to nmake, like so:

For a 64-bit release build, open a x64 Visual Studio command prompt (e.g. VS2012 x64 Cross Tools Command Prompt) and type:

   cd \wxWidgets\build\msw
   nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static DEBUG_INFO=0 DEBUG_FLAG=0 TARGET_CPU=X64
                        UNICODE=1 USE_OPENGL=1

For a 32-bit release build, open a x32 Visual Studio command prompt (e.g. Developer Command Prompt for VS2012) and type:

   cd \wxWidgets\build\msw
   nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static DEBUG_INFO=0 DEBUG_FLAG=0
                        UNICODE=1 USE_OPENGL=1

On Mac OS X

Unpack the wxWidgets source archive wherever you like. Before building wxWidgets you need to make a couple of small but important changes to the source code:

  1. Open src/osx/nonownedwnd_osx.cpp and edit the wxNonOwnedWindow::Update routine so that it looks like this:
    void wxNonOwnedWindow::Update()
    {
        m_nowpeer->Update();
    }
    

    This routine is called whenever a Golly script wants to update the viewport. Without this change, scripts like heisenburp.lua will run way too fast.

  2. Open src/osx/cocoa/scrolbar.mm and edit the wxOSXScrollBarCocoaImpl::mouseEvent routine so that it begins like this:
    static bool in_mouseEvent = false;
    void wxOSXScrollBarCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd)
    {
        // avoid crash due to possible re-entrancy
        if (in_mouseEvent) return;
        in_mouseEvent = true;
        wxWidgetCocoaImpl::mouseEvent(event, slf, _cmd);
        in_mouseEvent = false;
    

Now you're ready to build wxWidgets. If you're using Mac OS 10.9 or later then start up Terminal and type these commands (using the correct path and version number):

   cd /path/to/wxWidgets-3.1.0
   mkdir build-osx
   cd build-osx
   ../configure --with-osx_cocoa --disable-shared --enable-unicode --with-macosx-version-min=10.9
                --disable-mediactrl
   make

If your Mac OS is older than 10.9 then these commands should work (again, use the correct path and version number):

   cd /path/to/wxWidgets-3.0.2
   mkdir build-osx
   cd build-osx
   ../configure --with-osx_cocoa --disable-shared --enable-unicode
   make

On Linux

Before building the wxWidgets libraries you might need to install some packages for OpenGL development. For example, on Ubuntu:

   sudo apt-get install mesa-common-dev
   sudo apt-get install freeglut3-dev

Unpack the wxWidgets source archive wherever you like, start up a terminal session and type these commands (using the correct version number):

   cd /path/to/wxWidgets-3.0.2
   mkdir build-gtk
   cd build-gtk
   ../configure --with-gtk --disable-shared --enable-unicode --with-opengl
   make
   sudo make install
   sudo ldconfig

This installs the wx libraries in a suitable directory. It also installs the wx-config program which will be called by makefile-gtk to set the appropriate compile and link options for building Golly.

How to install Python

Golly uses Python 2.x for scripting, so you'll need to make sure a suitable version of Python is installed (note that Python 3.x is NOT supported). Mac OS X users don't have to do anything because Python 2.7 is already installed. Windows and Linux users can download a Python 2.7 installer from http://www.python.org/download.

How to build Golly

Once wxWidgets and Python are installed, building Golly should be relatively easy:

On Windows

First, locate local-win-template.mk in the gui-wx folder and copy it to a new file called local-win.mk. This file is included by makefile-win. Edit local-win.mk and specify where wxWidgets is installed by changing the WX_DIR path near the start of the file. Also make sure WX_RELEASE specifies the first two digits of your wxWidgets version. The headers for Python must also be included, so change the path for PYTHON_INCLUDE if necessary. Now you're ready to build Golly.

If you edited config.vc to set all the options then it's simple:

   cd \path\to\golly\gui-wx
   nmake -f makefile-win

Otherwise you'll need to specify all the same options that were used to build wxWidgets:

For a 64-bit build:

   nmake -f makefile-win BUILD=release RUNTIME_LIBS=static DEBUG_INFO=0 DEBUG_FLAG=0 TARGET_CPU=X64
                         UNICODE=1 USE_OPENGL=1

For a 32-bit build:

   nmake -f makefile-win BUILD=release RUNTIME_LIBS=static DEBUG_INFO=0 DEBUG_FLAG=0
                         UNICODE=1 USE_OPENGL=1

On Mac OS X

Go to the gui-wx folder and make a copy of makefile-mac called makefile. Edit makefile and specify where wxWidgets is installed by changing the WX_DIR path near the start of the file. Also make sure WX_RELEASE specifies the first two digits of your wxWidgets version.

On Mac OS 10.6 or later you can then build a 64-bit Cocoa version of Golly by opening a Terminal window and doing:

   cd /path/to/golly/gui-wx
   make

On Linux

You will probably need to add some development packages first. For example, from a default Ubuntu install (at the time of writing) you will need to install the following packages for GTK-2 and Python 2.7:

   sudo apt-get install libgtk2.0-dev
   sudo apt-get install python2.7-dev

Then you can build the golly executable:

   cd /path/to/golly/gui-wx
   make -f makefile-gtk

Note that the CXXFLAGS and LDFLAGS environmental variables may be used to append to (and override) the package default flags. Additionally, GOLLYDIR specifies an absolute directory path to look for the application data files. For system-wide installation, it probably makes sense to set GOLLYDIR to /usr/share/golly and install the Help, Patterns, Scripts and Rules directories in there.

Building Golly using configure

Golly can be built using the standard GNU build tools. If you obtained the Golly source code from the Git repository instead of a source release, you need to generate the configure script first:

   cd /path/to/golly/gui-wx/configure
   ./autogen.sh

This requires that autoconf and automake are installed.

The configure script offers various options to customize building and installation. For an overview of the available options, run:

   ./configure --help

Run the configure script to create an appropriate Makefile for your operating system and then run make to build Golly. For example, for a system-wide installation, you could do this:

   cd /path/to/golly/gui-wx/configure
   ./configure
   make
   make install

To avoid mixing the source code with the build artifacts, you can create a separate build directory and call the configure script from there:

   mkdir golly-build
   cd golly-build
   /path/to/golly/gui-wx/configure
   make
   # etc.
To clean up the build artifacts after installation, simply remove the build directory (e.g., with rm -R golly-build).

How to install optional sound with irrKlang

Golly can use the irrKlang library to play sounds. The Overlay has a sound command that can be used in Lua scripts to do this.

You can download the irrKlang library from http://www.ambiera.com/irrklang/downloads.html. Make sure you get the correct version, 32-bit or 64-bit, to match the build of Golly you want to do. The download is a zip file containing the libraries for Windows, Mac OS and Linux. Golly has been tested with irrKlang 1.5 and 1.6.

Unzip the download file. You then need to edit the makefile for your platform to enable sound and then build Golly.

On Windows

Edit local-win.mk and uncomment the line:
ENABLE_SOUND = 1
Change the path for IRRKLANGDIR to the full path of where you unzipped the irrKlang zip file.

On Mac OS X

Edit makefile-mac and uncomment the line:
ENABLE_SOUND = 1
Change the path for IRRKLANGDIR to match where you unzipped the irrKlang zip file.

On Linux

Edit makefile-gtk and uncomment the line:
ENABLE_SOUND = 1
Change the path for IRRKLANGDIR to match where you unzipped the irrKlang zip file.

How to build bgolly

The above make/nmake commands will also create bgolly, a simple "batch mode" version of Golly without any GUI. To build bgolly separately, just specify bgolly as the target of the make/nmake command. For example, on Linux:

   make -f makefile-gtk bgolly

You don't need to install wxWidgets or Python to build bgolly.

Source code road map

If you'd like to modify Golly then the following information should help you get started.

Directory structure

Golly's source code can be downloaded from Sourceforge as a Git repository or as a .tar.gz file. You should see the following directories:

cmdline

Contains source code for bgolly and RuleTableToTree (the latter program is no longer included in the binary distribution).

docs

Contains documentation in the form of .html files.

gollybase

Contains the low-level source code used by the client code in cmdline and the various gui-* directories. See below for a description of the various files.

gui-android

Contains source code and resources for the Android version of Golly.

gui-common

Contains the GUI code and help files shared by the Android and iPad versions of Golly.

gui-ios

Contains source code and resources for the iPad version of Golly.

gui-web

Contains source code and resources for a web version of Golly.

gui-wx

Contains the high-level wxWidgets code for the desktop version of Golly (see below for more details). Also contains other files and resources needed to build Golly (make files, bitmap files, icon files, etc).

lua

Contains the source code for Lua.

Help

Contains various .html files that are accessed from Golly's Help menu.

Patterns

Contains a state-of-the-art pattern collection.

Rules

Contains various .rule files. These files contain table/tree data (loaded by the RuleLoader algorithm) and optional color/icon data (used by the GUI code to render patterns).

Scripts

Contains Lua and Python scripts that can be run by Golly.

Note that the executables (Golly and bgolly) are created in the same location as the above directories. This means you can test a new Golly build without having to copy it somewhere else because the required directories (Help, Patterns, Rules and Scripts) are in the correct location.

High-level GUI code

The desktop version of Golly uses wxWidgets to implement the graphical user interface. All the GUI code is stored in the gui-wx directory in a number of wx* files. Each module is described in (roughly) top-down order, and some key routines are mentioned:

wxgolly.*

Defines the GollyApp class.
GollyApp::OnInit() is where it all starts.

wxmain.*

Defines the MainFrame class for the main window.
MainFrame::OnMenu() handles all menu commands.
MainFrame::UpdateEverything() updates all parts of the GUI.

wxfile.cpp

Implements various File menu functions.
MainFrame::NewPattern() creates a new, empty universe.
MainFrame::LoadPattern() reads in a pattern file.

wxcontrol.cpp

Implements various Control menu functions.
MainFrame::StartGenerating() starts generating a pattern.
MainFrame::ChangeAlgorithm() switches to a new algorithm.

wxtimeline.*

Users can record/play a sequence of steps called a "timeline".
CreateTimelineBar() creates timeline bar below the viewport window.
StartStopRecording() starts or stops recording a timeline.
DeleteTimeline() deletes an existing timeline.

wxrule.*

Users can change the current rule.
ChangeRule() opens the Set Rule dialog.

wxedit.*

Implements edit bar functions.
CreateEditBar() creates the edit bar above the viewport window.
ToggleEditBar() shows/hides the edit bar.

wxselect.*

Defines the Selection class for operations on selections.
Selection::CopyToClipboard() copies the selection to the clipboard.
Selection::RandomFill() randomly fills the current selection.
Selection::Rotate() rotates the current selection.
Selection::Flip() flips the current selection.

wxview.*

Defines the PatternView class for the viewport window.
PatternView::ProcessKey() processes keyboard shortcuts.
PatternView::ProcessClick() processes mouse clicks.

wxrender.*

Implements routines for rendering the viewport using OpenGL.
DrawView() draws the pattern, grid lines, selection, etc.

wxalgos.*

Implements support for multiple algorithms.
InitAlgorithms() initializes all algorithms and algoinfo data.
CreateNewUniverse() creates a new universe of given type.

wxlayer.*

Defines the Layer class and implements Layer menu functions.
AddLayer() adds a new, empty layer.
DeleteLayer() deletes the current layer.
SetLayerColors() lets user change the current layer's colors.

wxundo.*

Defines the UndoRedo class for unlimited undo/redo.
UndoRedo::RememberCellChanges() saves cell state changes.
UndoRedo::UndoChange() undoes a recent change.
UndoRedo::RedoChange() redoes an undone change.

wxstatus.*

Implements a status bar at the top of the main window.
StatusBar::DrawStatusBar() shows gen count, pop count, etc.
StatusBar::DisplayMessage() shows message in bottom line.

wxhelp.*

Implements a modeless help window.
ShowHelp() displays a given .html file.

wxinfo.*

Implements a modeless info window.
ShowInfo() displays the comments in a given pattern file.

wxscript.*

Implements the high-level scripting interface.
RunScript() runs a given script file.

wxlua.*

Implements Lua script support.
RunLuaScript() runs a given .lua file.

wxoverlay.*

Implements the overlay commands.
DoOverlayCommand() is where it all starts.

wxperl.*

Implements Perl script support if ENABLE_PERL is defined.
No longer officially supported.

wxpython.*

Implements Python script support.
RunPythonScript() runs a given .py file.

wxprefs.*

Routines for loading, saving and changing user preferences.
GetPrefs() loads data from GollyPrefs file.
SavePrefs() writes data to GollyPrefs file.
ChangePrefs() opens the Preferences dialog.

wxutils.*

Implements various utility routines.
Warning() displays message in modal dialog.
Fatal() displays message and exits the app.

Low-level base code

The gollybase directory contains low-level code used by all the various clients (desktop Golly, bgolly, and the Android/iPad/web versions):

platform.h

Platform specific defines (eg. 64-bit changes).

lifealgo.*

Defines abstract Life algorithm operations:
lifealgo::setcell() sets given cell to given state.
lifealgo::getcell() gets state of given cell.
lifealgo::nextcell() finds next live cell in current row.
lifealgo::step() advances pattern by current increment.
lifealgo::fit() fits pattern within given viewport.
lifealgo::draw() renders pattern in given viewport.

liferules.*

Defines routines for setting/getting rules.
liferules::setrule() parses and validates a given rule string.
liferules::getrule() returns the current rule in canonical form.

lifepoll.*

Allows lifealgo routines to do event processing.
lifepoll::checkevents() processes any pending events.

viewport.*

Defines abstract viewport operations:
viewport::zoom() zooms into a given location.
viewport::unzoom() zooms out from a given location.
viewport::setmag() sets the magnification.
viewport::move() scrolls view by given number of pixels.

liferender.*

Defines abstract routines for rendering a pattern:
liferender::pixblit() draws an area with at least one live cell.

qlifealgo.*

Implements QuickLife, a fast, conventional algorithm.

hlifealgo.*

Implements HashLife, a super fast hashing algorithm.

ghashbase.*

Defines an abstract class so other algorithms can use hashlife in a multi-state universe.

generationsalgo.*

Implements the Generations family of rules.

ltlalgo.*

Implements the Larger than Life family of rules.
Currently the only algorithm that uses a finite universe.

jvnalgo.*

Implements John von Neumann's 29-state CA and 32-state variants by Renato Nobili and Tim Hutton.

ruleloaderalgo.*

Implements the RuleLoader algorithm which loads externally specified rules stored in .rule files.

ruletable_algo.*

Used by the RuleLoader algorithm to load table data.

ruletreealgo.*

Used by the RuleLoader algorithm to load tree data.

qlifedraw.cpp

Implements rendering routines for QuickLife.

hlifedraw.cpp

Implements rendering routines for HashLife.

ghashdraw.cpp

Implements rendering routines for all algos that use ghashbase.

ltldraw.cpp

Implements rendering routines for Larger than Life.

readpattern.*

Reads pattern files in a variety of formats.
readpattern() loads a pattern into the given universe.
readcomments() extracts comments from the given file.

writepattern.*

Saves the current pattern in a file.
writepattern() saves the pattern in a specified format.

bigint.*

Implements operations on arbitrarily large integers.

util.*

Utilities for displaying errors and progress info.
warning() displays error message.
fatal() displays error message and exits.

Have fun, and please let us know if you make any changes!

Andrew Trevorrow (andrew@trevorrow.com)
Tom Rokicki (rokicki@gmail.com)
(on behalf of The Golly Gang)

golly-3.3-src/docs/ToDo.html0000644000175000017500000000753212675334101012707 00000000000000 To-do notes for Golly
Andrew's list:
==============

- Add a new check box to Prefs > Layer: "Automatically show/hide layer bar".
  If ticked then layer bar is automatically shown whenever the number of
  layers becomes > 1, and automatically hidden when the number drops to 1.
  Only need to check in a few places (esp. after a script ends).

- Auto stop script if it creates too many temp files (for undo).
  This can happen if a long-running script doesn't call new/open
  when it probably should.  See my email to Nathaniel with subject
  "Re: Golly methuselah search script".

- Stop generating if pattern becomes empty, constant or p2 (qlife only)
  and display suitable message in status bar.  Or maybe just add
  Gabriel's oscillation detection as an option (see oscar.py).

- Allow non-rectangular (and disjoint) selections.

- Add simple methuselah/spaceship/osc/still-life searches as in LifeLab???

- Add case studies to BUILD file: how to add a new menu item, how to add
  a new algorithm, etc.


Tom's list:
===========

File I/O

- Have hlifealgo .mc compatible with ghashbase .mc
- Generalized RLE in MC?

Algos

- Unzoom color merging
- Better status reports (% of hashtable full)

Scripting

- Tape construction script for replicator

Samples

- Small JVN examples

Fun

- htreebase
- hgridbase (finite universe; torus, etc.)
- allow (base) x (slow) algorithm "multiplication"
- pluggability of externally-defined algos
- perl/python slowcalc callbacks
- cache of slowcalc
- generational gc
- 32-bit indexed hashlife on 64-bit platforms

Other

- Improve batchmode.

- Fix qlifealgo::lowerRightPixel to prevent off-by-one error when
  selecting large pattern like caterpillar.


User suggestions:
=================

Nick Gotts:
- Need a way to copy exact gen/pop counts to clipboard.
  [No longer necessary now that a script can get this info.]

Jason Summers:
- For better viewing of patterns that move, have a way to automatically
  move the view X cells horizontally and Y cells vertically every Z gens.
  [Could be done quite easily via a script that prompts for X,Y,Z.]
- Allow diagonal selection rectangles.

Dave Greene:
- Provide a way to click-and-drag a selection to move it around.
- Make page and arrow scrolling amounts configurable (in Prefs > View).
- Add a getview() script command that returns current viewport rect
  and a setview(rect) command to change viewport size and location.
- Make info window a floating window and keep it open (but update
  its contents) when user loads another pattern.

H. Koenig:
- Multiple windows.  [No real need now that we have multiple layers.]

Gabriel Nivasch:
- Add a Default button to each Preferences pane (at bottom left?).

Bill Gosper:
- Modify info window so it can be used to edit and save comments.
- For scales > 1:1 make the pixel color depend on lg(# of ones in it).

Brice Due:
- Provide MCell-like editing capabilities.
- Provide a thumbnail option as an alternative to tiled layers;
  ie. the current layer would be displayed in a large "focal" viewport.
  All layers would be displayed as small, active thumbnails (at left
  or top edge of focal viewport, depending on aspect ratio?).
- Allow mc files to set step base and/or exponent via comment line like
  #X stepbase=8 stepexp=3
  [No need now that zip files can contain pattern + script?]

Tim Hutton:
- Add a script command to save comments in a pattern file.  Add optional
  param to existing save() command?

William R. Buckley:
- Provide an option to increase spacing between buttons.

Dean Hickerson:
- Make Duplicate Layer faster by writing current pattern to temp file
  and reading it into new layer.

tod222:
- Allow a command line argument (-minimize?) to start up with the
  main window in minimized state.  Should be possible in OnInit.
golly-3.3-src/Scripts/0000755000175000017500000000000013543257425011734 500000000000000golly-3.3-src/Scripts/Python/0000755000175000017500000000000013543257426013216 500000000000000golly-3.3-src/Scripts/Python/density.py0000644000175000017500000000066412026730263015163 00000000000000# Calculates the density of live cells in the current pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. from glife import rect import golly as g bbox = rect( g.getrect() ) if bbox.empty: g.exit("The pattern is empty.") d = float( g.getpop() ) / ( float(bbox.wd) * float(bbox.ht) ) if d < 0.000001: g.show("Density = %.1e" % d) else: g.show("Density = %.6f" % d) golly-3.3-src/Scripts/Python/invert.py0000644000175000017500000000133312026730263015005 00000000000000# Invert all cell states in the current selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jun 2006. # Updated to use exit command, Nov 2006. # Updated to use numstates command, Jun 2008. from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 for row in xrange(r.top, r.top + r.height): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for col in xrange(r.left, r.left + r.width): g.setcell(col, row, maxstate - g.getcell(col, row)) if not r.visible(): g.fitsel() golly-3.3-src/Scripts/Python/move-object.py0000644000175000017500000002412413011772276015720 00000000000000# Allow user to move a connected group of live cells. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g from glife import rect, getminbox ncells = [] # list of neighboring live cells # set edges of bounded grid for later use if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 # -------------------------------------------------------------------- def showhelp(): g.note( """Alt-clicking on an object allows you to COPY it to another location (the original object is not deleted). While dragging the object the following keys can be used: x - flip object left-right y - flip object top-bottom > - rotate object clockwise < - rotate object anticlockwise escape - abort and restore the object""") # ------------------------------------------------------------------------------ def getstate(x, y): # first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr): return 0 if g.getheight() > 0 and (y < gridt or y > gridb): return 0 return g.getcell(x, y) # ------------------------------------------------------------------------------ def findlivecell(x, y): if g.getcell(x, y) > 0: return [x, y] # spiral outwards from x,y looking for a nearby live cell; # the smaller the scale the smaller the area searched maxd = 10 mag = g.getmag() if mag > 0: # mag can be 1..5 (ie. scales 1:2 to 1:32) maxd = 2 * (6 - mag) # 10, 8, 6, 4, 2 d = 1 while d <= maxd: x -= 1 y -= 1 for i in xrange(2*d): x += 1 # move east if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): y += 1 # move south if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): x -= 1 # move west if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): y -= 1 # move north if getstate(x, y) > 0: return [x, y] d += 1 return [] # failed to find a live cell # ------------------------------------------------------------------------------ def checkneighbor(x, y): # first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr): return if g.getheight() > 0 and (y < gridt or y > gridb): return if g.getcell(x, y) == 0: return # no need for next test because we kill cell after adding it to ncells # if (x, y) in ncells: return False ncells.append( (x, y, g.getcell(x,y)) ) g.setcell(x, y, 0) # ------------------------------------------------------------------------------ def getobject(x, y): object = [] ncells.append( (x, y, g.getcell(x,y)) ) g.setcell(x, y, 0) while len(ncells) > 0: # remove cell from end of ncells and append to object x, y, s = ncells.pop() object.append(x) object.append(y) object.append(s) # add any live neighbors to ncells checkneighbor(x , y+1) checkneighbor(x , y-1) checkneighbor(x+1, y ) checkneighbor(x-1, y ) checkneighbor(x+1, y+1) checkneighbor(x+1, y-1) checkneighbor(x-1, y+1) checkneighbor(x-1, y-1) # append padding int if necessary if len(object) > 0 and (len(object) & 1) == 0: object.append(0) g.putcells(object) return object # ------------------------------------------------------------------------------ def underneath(object): # return list of live cells underneath given object (a multi-state list) cells = [] objlen = len(object) if objlen % 3 == 1: objlen -= 1 # ignore padding int i = 0 while i < objlen: x = object[i] y = object[i+1] s = g.getcell(x, y) if s > 0: cells.append(x) cells.append(y) cells.append(s) i += 3 # append padding int if necessary if len(cells) > 0 and (len(cells) & 1) == 0: cells.append(0) return cells # ------------------------------------------------------------------------------ def rectingrid(r): # return True if all of given rectangle is inside grid if g.getwidth() > 0 and (r[0] < gridl or r[0] + r[2] - 1 > gridr): return False if g.getheight() > 0 and (r[1] < gridt or r[1] + r[3] - 1 > gridb): return False return True # ------------------------------------------------------------------------------ def lookforkeys(event): global oldcells, object # look for keys used to flip/rotate object if event == "key x none" or event == "key y none": # flip floating object left-right or top-bottom g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) obox = getminbox(object) if event == "key x none": # translate object so that bounding box doesn't change xshift = 2 * (obox.left + int(obox.wd/2)) if obox.wd % 2 == 0: xshift -= 1 object = g.transform(object, xshift, 0, -1, 0, 0, 1) else: # translate object so that bounding box doesn't change yshift = 2 * (obox.top + int(obox.ht/2)) if obox.ht % 2 == 0: yshift -= 1 object = g.transform(object, 0, yshift, 1, 0, 0, -1) oldcells = underneath(object) g.putcells(object) g.update() return if event == "key > none" or event == "key < none": # rotate floating object clockwise or anticlockwise # about the center of the object's bounding box obox = getminbox(object) midx = obox.left + int(obox.wd/2) midy = obox.top + int(obox.ht/2) newleft = midx + obox.top - midy newtop = midy + obox.left - midx rotrect = [ newleft, newtop, obox.ht, obox.wd ] if not rectingrid(rotrect): g.show("Rotation is not allowed if object would be outside grid.") return g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) if event == "key > none": # rotate clockwise object = g.transform(object, 0, 0, 0, -1, 1, 0) else: # rotate anticlockwise object = g.transform(object, 0, 0, 0, 1, -1, 0) # shift rotated object to same position as rotrect obox = getminbox(object) object = g.transform(object, newleft - obox.left, newtop - obox.top) oldcells = underneath(object) g.putcells(object) g.update() return if event == "key h none": # best not to show Help window while dragging object! return g.doevent(event) # ------------------------------------------------------------------------------ def moveobject(): global oldcells, object, object1 # wait for click in or near a live cell while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() result = findlivecell(int(xstr), int(ystr)) if len(result) > 0: prevx = int(xstr) prevy = int(ystr) oldmouse = xstr + ' ' + ystr g.show("Extracting object...") x, y = result object = getobject(x, y) object1 = list(object) # save in case user aborts script if mods == "alt": # don't delete object oldcells = list(object) break else: g.warn("Click on or near a live cell belonging to the desired object.") elif event == "key h none": showhelp() else: g.doevent(event) # wait for mouse-up while moving object g.show("Move mouse and release button...") mousedown = True while mousedown: event = g.getevent() if event.startswith("mup"): mousedown = False elif len(event) > 0: lookforkeys(event) mousepos = g.getxy() if len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so move object g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) xstr, ystr = mousepos.split() x = int(xstr) y = int(ystr) if g.getwidth() > 0: # ensure object doesn't move beyond left/right edge of grid obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.left < gridl: x += gridl - obox.left elif obox.right > gridr: x -= obox.right - gridr if g.getheight() > 0: # ensure object doesn't move beyond top/bottom edge of grid obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.top < gridt: y += gridt - obox.top elif obox.bottom > gridb: y -= obox.bottom - gridb object = g.transform(object, x - prevx, y - prevy) oldcells = underneath(object) g.putcells(object) prevx = x prevy = y oldmouse = mousepos g.update() # ------------------------------------------------------------------------------ if len(g.getrect()) == 0: g.exit("There are no objects.") g.show("Click on or near live cell, move mouse and release button... (hit 'h' for help)") oldcursor = g.getcursor() g.setcursor("Move") oldcells = [] # cells under moved object object = [] # cells in moving object object1 = [] # cells in initial object try: aborted = True moveobject() aborted = False finally: g.setcursor(oldcursor) if aborted: # erase object if it moved if len(object) > 0: g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") if len(oldcells) > 0: g.putcells(oldcells) if len(object1) > 0: g.putcells(object1) else: g.show(" ") golly-3.3-src/Scripts/Python/pd-glider.py0000644000175000017500000000063112026730263015345 00000000000000# Creates a large set of pentadecathlon + glider collisions. # Based on pd_glider.py from PLife (http://plife.sourceforge.net/). from glife.base import * rule("B3/S23") def collision (i, j): return pentadecathlon + glider[i + 11] (-8 + j, -10, flip) all = pattern () for i in xrange (-7, 8): for j in xrange (-9, 10): all += collision (i, j) (100 * i, 100 * j) all.display ("pd-glider") golly-3.3-src/Scripts/Python/goto_expression.py0000644000175000017500000003212012677364330016735 00000000000000# Go to a requested generation. The given generation can be: # # * an absolute number like 1,000,000 (commas are optional) # * a number relative to the current generation like +9 or -6 # * an expression like "17*(2^(3*143)+2^(2*3*27))" # * an expression starting with + or -, indicating a relative move # * any of the above preceded by "f" (fast). This wil set the base # step to 2 and provide less visual feedback of progress # # If the target generation is less than the current generation then # we go back to the starting generation (normally 0) and advance to # the target. # # If the input is preceded by F "fast" or q "quick" then we use the # algorithm of goto-fast.py, which sets the base to 2 and jumps by # powers of 2. # # Authors: # Original goto.py by Andrew Trevorrow and Dave Greene, April 2006. # Updated Sept-Oct 2006 -- XRLE support and reusable default value. # Updated April 2010 -- much faster, thanks to PM 2Ring. # goto-expression.py by Robert Munafo, using regexp expression # evaluation like Hypercalc (mrob.com/pub/perl/hypercalc.html) # 20111103 First stand-alone version of "expr.py" written as an # exercise to learn me some Python # 20111105 Add expr_2 using re.sub (a cleaner implementation) # 20120624 Remove whitespace before evaluating # 20130213 Move expr_2 code to "goto-expression.py" for Golly. # 20130214 Fix precedednce bugs, add expr_3 # 20130215 Remove redundant g.getstep and g.setstep calls. Full handling # of scientific notation and leading signs (like "300+-3") # # TODO: # Allow decimal point in EE notation, so "6.02e23" would work (right # now you have to do "602e21") # Make - and / associate left-to-right, so 100-10+1 gives 91 instead of 89 # Remove use of deprecated string.find and string.replace functions # Why is it much faster when you start from gen 0? For example, start # with puffer-train.rle, use this script to goto 10^100 then goto 2*10^100 # it's much faster if you start from gen 0 and go directly to 2*10^100 # Given that gofast saves and restores the base, should we use it always? # Note that patterns with a lot of period-P oscillators run more # efficiently when the base is set to P or a factor of P, so this # is not a simple decision. from glife import validint from time import time import golly as g import re # -------------------------------------------------------------------- # Regexp-based expression evaluator. The main loop contains match # cases for each type of operation, and performs one operation per # loop until there are none left to match. We use re.sub and pass # functions for the repl parameter. See: # http://docs.python.org/2/library/re.html#re.sub # http://docs.python.org/2/library/re.html#re.MatchObject.group p_whitespace = re.compile('[ \t]+') p_paren = re.compile('\((\d+)\)') p_parexp = re.compile('\((\d+[*/+-^][^()]*\d)\)') p_exp = re.compile('(\d+)\^(\d+)') p_mul = re.compile('(\d+)([*/])(n?\d+)') p_add = re.compile('(\d+)([-+])(n?\d+)') p_ee = re.compile('([.0-9]+)e([+-]?\d+)') p_mantissa = re.compile('^n?\d*\.?\d+$') p_leadn = re.compile('^n') p_digits = re.compile('^[+-]?\d+$') p_dot = re.compile('\.') p_plusminus = re.compile('([-+])([-+])') # erf = expression replace function def erf_paren(match): "Remove parentheses: (123) -> 123" a = match.group(1) return a # ee_approx - Python-like integer approximation of a number in scientific # notation. The mantissa and exponent are given separately and # may be either numeric or string. (the caller is expected to # generate them separately, e.g. by using a regexp to match # parts of a string). The exponent must be an integer or an # equivalent string; more flexibility is available for the # mantissa (see examples) # All of the following examples evaluate to True: # ee_approx(2.0, 20) == 2*10**20 # ee_approx('2.', 20) == 2*10**20 # ee_approx('12000', -3) == 12 # ee_approx(12e+03, '-3') == 12 # The following return 0 because of an error: # ee_approx(2.3, 4.0) # Exponent may not be a float # ee_approx(6.02, '23.') # Exponent may not contain '.' # The following evaluate to False because of roundoff error: # ee_approx('.02', 22) == 2*10**20 def ee_approx(m, e): "Integer approximation of m*10^e given m and e" m = str(m) # Make sure mantissa matches its pattern if p_dot.search(m): m = m + '0' else: m = m + '.0' if not p_mantissa.search(m): return 0 m = float(m) m = int(m * float(2**64) * (1.0+2.0**-52.0)) e = str(e) if not p_digits.search(e): return 0 e = int(e) if e<0: e = 10**(-e) return m/(e*2**64) else: e = 10**e return (m*e)/(2**64) def erf_ee(match): "Scientific notation: 1.2e5 -> 120000" a = match.group(1) b = match.group(2) return str(ee_approx(a,b)) def erf_exp(match): "Exponentiation: 2^24 -> 16777216" a = int(match.group(1)) b = int(match.group(2)) return str(a**b) def erf_mul(match): "Multiplication and (integer) division" a = int(match.group(1)) # match.group(2) is operator b = match.group(3) # Check for leading 'n' if p_leadn.search(b): b = p_leadn.sub('-', b) b = int(b) if(match.group(2) == '*'): return str(a*b) else: return str(a//b) def erf_add(match): "Addition and subtraction" a = int(match.group(1)) # match.group(2) is operator b = match.group(3) # Check for leading 'n' if p_leadn.search(b): b = p_leadn.sub('-', b) b = int(b) if(match.group(2) == '+'): return str(a+b) else: return str(a-b) """ Evaluate an expression without parentheses, like 2+3*4^5 = 3074 The precedence is: If we match something like "6.02e23", expand it Else if we match something like "4^5", expand it Else if we match something like "3*17", expand it Else if we match something like "2+456", expand it Else return It loops in all cases but the last """ def expr_2(p): going = 1 # print 'e2:', p while going: if p_ee.search(p): p = p_ee.sub(erf_ee, p, count=1) # print 'e2 ee, got:', p elif p_exp.search(p): p = p_exp.sub(erf_exp, p, count=1) # print 'e2 exp, got:', p elif p_mul.search(p): p = p_mul.sub(erf_mul, p, count=1) # print 'e2 mul, got:', p elif p_add.search(p): p = p_add.sub(erf_add, p, count=1) # print 'e2 add, got:', p else: # print 'e2 done' going = 0 # print 'e2 return:', p return p def erf_e2(match): "Parenthesized bare expression" a = expr_2(match.group(1)) return str(a) def erf_plusminus(match): "--, -+, +-, or ++" if match.group(2) == '-': return match.group(1)+'n' return match.group(1) """ Evaluate an expression possibly including parenthesized sub-expressions and numbers in scientific notation, like 17*4^((7^2-3)*6^2+2e6)+602e21 The precedence is: If we match something like "6.02e23", expand it Else if we match something like "(3+4*5)", expand it using expr_2 Else if we match something like "(23456)", remove the parens Else expand the whole string using expr_2 and return It loops in all cases but the last """ def expr_3(p): p = p_whitespace.sub('', p) if p_plusminus.search(p): p = p_plusminus.sub(erf_plusminus, p) going = 1 while going: if p_ee.search(p): p = p_ee.sub(erf_ee, p, count=1) elif p_parexp.search(p): p = p_parexp.sub(erf_e2, p, count=1) elif p_paren.search(p): p = p_paren.sub(erf_paren, p, count=1) else: p = expr_2(p) going = 0 return p # -------------------------------------------------------------------- """ gt_setup computes how many generations to move forwards. If we need to move backwards, it rewinds as far as possible, then returns the number of generations we need to move forwards. """ def gt_setup(gen): currgen = int(g.getgen()) # Remove leading '+' or '-' if any, and convert rest to int or long if gen[0] == '+': n = int(gen[1:]) newgen = currgen + n elif gen[0] == '-': n = int(gen[1:]) if currgen > n: newgen = currgen - n else: newgen = 0 else: newgen = int(gen) if newgen < currgen: # try to go back to starting gen (not necessarily 0) and # then forwards to newgen; note that reset() also restores # algorithm and/or rule, so too bad if user changed those # after the starting info was saved; # first save current location and scale midx, midy = g.getpos() mag = g.getmag() g.reset() # restore location and scale g.setpos(midx, midy) g.setmag(mag) # current gen might be > 0 if user loaded a pattern file # that set the gen count currgen = int(g.getgen()) if newgen < currgen: g.error("Can't go back any further; pattern was saved " + "at generation " + str(currgen) + ".") return 0 return newgen - currgen elif newgen > currgen: return newgen - currgen else: return 0 # -------------------------------------------------------------------- def intbase(n, b): # convert integer n >= 0 to a base b digit list (thanks to PM 2Ring) digits = [] while n > 0: digits += [n % b] n //= b return digits or [0] def goto(newgen, delay): g.show("goto running, hit escape to abort...") oldsecs = time() # before stepping we advance by 1 generation, for two reasons: # 1. if we're at the starting gen then the *current* step size # will be saved (and restored upon Reset/Undo) rather than a # possibly very large step size # 2. it increases the chances the user will see updates and so # get some idea of how long the script will take to finish # (otherwise if the base is 10 and a gen like 1,000,000,000 # is given then only a single step() of 10^9 would be done) if delay <= 1.0: g.run(1) newgen -= 1 # use fast stepping (thanks to PM 2Ring) for i, d in enumerate(intbase(newgen, g.getbase())): if d > 0: g.setstep(i) for j in xrange(d): if g.empty(): g.show("Pattern is empty.") return g.step() newsecs = time() if newsecs - oldsecs >= delay: # time to do an update? oldsecs = newsecs g.update() g.show("") # -------------------------------------------------------------------- # This is the "fast goto" algorithm from goto-fast.py that uses # binary stepsizes and does not do that initial step by 1 generation. def intbits(n): ''' Convert integer n to a bit list ''' bits = [] while n: bits += [n & 1] n >>= 1 return bits def gofast(newgen, delay): ''' Fast goto ''' #Save current settings oldbase = g.getbase() # oldhash = g.setoption("hashing", True) g.show('gofast running, hit escape to abort') oldsecs = time() #Advance by binary powers, to maximize advantage of hashing g.setbase(2) for i, b in enumerate(intbits(newgen)): if b: g.setstep(i) g.step() g.dokey(g.getkey()) newsecs = time() if newsecs - oldsecs >= delay: # do an update every sec oldsecs = newsecs g.update() if g.empty(): break g.show('') #Restore settings # g.setoption("hashing", oldhash) g.setbase(oldbase) # -------------------------------------------------------------------- def savegen(filename, gen): try: f = open(filename, 'w') f.write(gen) f.close() except: g.warn("Unable to save given gen in file:\n" + filename) # -------------------------------------------------------------------- # use same file name as in goto.lua GotoINIFileName = g.getdir("data") + "goto.ini" previousgen = "" try: f = open(GotoINIFileName, 'r') previousgen = f.readline() f.close() if not validint(previousgen): previousgen = "" except: # should only happen 1st time (GotoINIFileName doesn't exist) pass gen = g.getstring("Enter the desired generation number as an\n" + "expression, prepend -/+ for relative\n" + "move back/forwards, prepend f to use faster\n" "powers-of-2 steps:", previousgen, "Go to generation") # Evaluate the expression. This leaves leading "f" and/or "+/-" # intact. gen = expr_3(gen) # Find out if they want to get there quickly # %%% TODO: Use re instead of string.find and string.replace (which are # deprecated in later versions of Python) fastmode = 0 if(gen.find("f") == 0): gen = gen.replace("f","") fastmode = 1 if len(gen) == 0: g.exit() elif gen == "+" or gen == "-": # clear the default savegen(GotoINIFileName, "") elif not validint(gen): g.exit('Sorry, but "' + gen + '" is not a valid integer.') else: # best to save given gen now in case user aborts script savegen(GotoINIFileName, gen) oldstep = g.getstep() # %%% TODO: Use re instead of string.replace to remove the commas newgen = gt_setup(gen.replace(",","")) if newgen > 0: if fastmode: gofast(newgen, 10.0) else: goto(newgen, 1.0) g.setstep(oldstep) golly-3.3-src/Scripts/Python/p1100-MWSS-gun.py0000644000175000017500000001037312026730263015621 00000000000000# Bill Gosper's pure-period p1100 double MWSS gun, circa 1984. import golly as g from glife import * g.new("P1100 gun") g.setalgo("HashLife") g.setrule("B3/S23") # update status bar now so we don't see different colors when # g.show is called g.update() glider = pattern("bo$bbo$3o!") block = pattern("oo$oo!") eater = pattern("oo$bo$bobo$bboo!") bhept = pattern("bbo$boo$oo$boo!") twobits = eater + bhept(8,3) half = twobits + twobits[1](51,0,flip_x) centinal = half + half(0,16,flip_y) passthrough = centinal[1](16,3,rcw) + centinal[19](52,0,rcw) \ + centinal[81](55,51,rccw) + centinal[99](91,54,rccw) # build the source signal -- the most compact set of gliders # from which all other gliders and spaceships can be generated MWSSrecipes = glider(5759,738,rccw) + glider(6325,667,flip_x) \ + glider[3](5824,896,flip_x) + glider[2](5912,1264) \ + glider[2](6135,1261,flip_x) + glider[1](5912,1490,flip_y) \ + glider(6229,4717,flip_x) + glider[1](6229,5029,flip) \ + glider[1](5920,5032,flip_y) + glider(6230,5188,flip) \ + glider[3](6230,5306,flip) + glider[3](5959,5309,flip_y) # suppress output MWSSes as long as gliders are being added MWSSrecipes += pattern("o!",6095,-65) + pattern("o!",6075,228) # add the first four centinals to guide the recipe gliders all = centinal[44](6185,5096,flip_x) + centinal[73](5897,1066) all += centinal[42](5782,690) + centinal[25](5793,897,rcw) # generate the MWSSes for the glider-fanout ladder for i in range(7): g.show("Building rung " + str(i+1) + " of ladder...") all = (all + MWSSrecipes)[1100] # add the actual glider-fanout ladder -- six rungs for i in range(6): all += glider(6030,1706+550*i,swap_xy_flip) \ + centinal[15](6102,1585+550*i) \ + block(6029,1721+550*i) + centinal[34](5996,1725+550*i,rccw) \ + block(6087,1747+550*i) + centinal[87](6122,1745+550*i,rcw) \ # add the rest of the centinals to guide the ladder's output gliders g.show("Adding centinal reflectors...") all += centinal[88](5704,0) + centinal[29](6423,295,flip_x) \ + centinal[74](5616,298) + centinal[40](6361,613,rcw) \ + centinal[23](6502,620,flip_x) + centinal[36](5636,986) \ + centinal[38](6370,1008,rcw) + centinal[19](5747,1347,rcw) \ + centinal[67](5851,1516) + centinal(4061,2605,rccw) \ + centinal[10](5376,3908,rccw) + centinal[77](8191,4407,flip_x) \ + centinal[6](4988,4606) + centinal[34](6357,4608,flip_x) \ + centinal[27](8129,4621,flip_x) + centinal[92](5159,5051) \ + centinal[53](7991,5201,flip_x) + centinal[94](7038,5370,rccw) \ + centinal[13](5591,5379,rccw) + centinal[3](5858,5428,rccw) \ + centinal[87](7805,5511,flip_x) + centinal[98](401,5557,rccw) \ + centinal[14](955,5561,rccw) + centinal[8](6592,5584,rccw) \ + centinal[39](6933,5698,flip_x) + centinal[32](6230,5881) \ + centinal[47](11676,5854,rccw) + centinal[68](0,5748,rccw) \ + centinal[89](6871,5912,flip_x) + centinal[45](12095,6027,rccw) \ + centinal[86](6209,6134) + centinal[55](6868,6357,flip_x) \ + centinal[95](9939,6491,rccw) + centinal[23](8782,6548,rccw) \ + centinal[58](3066,6572,rccw) + centinal[21](9326,6596,rccw) \ + centinal[80](3628,6626,rccw) + centinal[45](6821,6528,flip_x) \ + centinal[33](10373,6649,rccw) + centinal[16](2587,6685,rccw) # to change behavior at center, comment out one of the lines below all += eater(6018,5924,rccw) + eater(6037,5943,rccw) # true p1100 gun # all += block(6018,6787) # synch center to recreate original p1100x5 center = block(1081,6791) + block(2731,6791) + block(3831,6791) \ + block(9108,6791) + block(10208,6791) + block(11308,6791) \ + passthrough(8475,6737) + passthrough[39](3365,6737,flip_x) \ + passthrough(9575,6737) + passthrough[39](2265,6737,flip_x) \ + passthrough(10675,6737) + passthrough[39](1715,6737,flip_x) # add asymmetric Equator to mirror-symmetric North and South MWSSrecipes += MWSSrecipes(0,13583,flip_y) all += all(0,13583,flip_y) + center g.putcells(all) g.fit() # Different glider paths are different lengths, so incomplete # glider recipes must be overwritten for a while to prevent disaster. for i in range(46): g.show("Filling glider tracks -- " \ + str(49500 - i*1100) + " ticks left.") g.update() g.putcells(MWSSrecipes) g.run(1100) g.show("") # reset gen count to 0 g.setgen("0") golly-3.3-src/Scripts/Python/Margolus/0000755000175000017500000000000013543257426015007 500000000000000golly-3.3-src/Scripts/Python/Margolus/import.py0000644000175000017500000000077412026730263016611 00000000000000# Change the selected area from N states to emulated-Margolus states: # s -> 1+2s (if in the top-left of the partition) # s -> 2+2s (if not) from glife import rect import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") for row in xrange(r.top, r.top + r.height): for col in xrange(r.left, r.left + r.width): if (col%2) and (row%2): g.setcell(col, row, 1+g.getcell(col,row)*2) else: g.setcell(col, row, 2+g.getcell(col,row)*2) golly-3.3-src/Scripts/Python/Margolus/export.py0000644000175000017500000000053212026730263016610 00000000000000# Change the entire pattern from emulated-Margolus states to N-state: from glife import rect import golly as g r = rect( g.getrect() ) if r.empty: g.exit("There is no pattern.") for row in xrange(r.top, r.top + r.height): for col in xrange(r.left, r.left + r.width): s = g.getcell(col,row) g.setcell(col, row, (s+s%2)/2-1) golly-3.3-src/Scripts/Python/Margolus/convert-MCell-string.py0000644000175000017500000000537312112261643021252 00000000000000# We owe a lot to MCell's implementation of the Margolus neighbourhood. Thanks Mirek! # # Tim Hutton import os import golly from glife.ReadRuleTable import * from glife.EmulateMargolus import * # ask the user for the MCell string to convert (comma-separated works too) s = golly.getstring( '''Enter a specification string. This can either be an MCell format Margolus string or just a comma-separated list of the 16 case indices. See: http://psoup.math.wisc.edu/mcell/rullex_marg.html ''', "MS,D0;8;4;3;2;5;9;7;1;6;10;11;12;13;14;15","Enter Margolus specification") # defaults to BBM # pull out the 16 numeric tokens that tell us what each partition becomes becomes = map(int,s.replace('M',' ').replace('S',' ').replace(',',' ').replace('D',' ').replace(';',' ').split()) # write straight into the user's rules folder, so we can call setrule immediately folder = golly.getdir('rules') # construct a rule_name from next case indices rule_name = 'Margolus-' + '-'.join(map(str,becomes)) # ask the user to confirm this name or suggest a more readable one (e.g. "BBM") rule_name = golly.getstring("Enter a name for the rule:",rule_name,"Enter rule name") # todo: detect slashes and tildes, tell user that can't change dir like that # open the rule table file for writing tablepath = folder + rule_name + '.table' f = open(tablepath,'w') # write the initial descriptors and some variables f.write('# Emulation of Margolus neighbourhood for MCell string:\n# %s\n\n'%s) f.write('# (see: http://psoup.math.wisc.edu/mcell/rullex_marg.html )\n') f.write('#\n') f.write('# Rule table produced by convert-MCell-string.py, which can\n') f.write('# convert any MCell Margolus specification into a rule table.\n') f.write('#\n') f.write('n_states:2\nneighborhood:Margolus\nsymmetries:none\n\n') # the 16 cases of the (two-state) Margolus partition are: dot = (0,0,0,0),(1,0,0,0),(0,1,0,0),(1,1,0,0),(0,0,1,0),(1,0,1,0),(0,1,1,0),(1,1,1,0),\ (0,0,0,1),(1,0,0,1),(0,1,0,1),(1,1,0,1),(0,0,1,1),(1,0,1,1),(0,1,1,1),(1,1,1,1) # cell order: 1 2 # 3 4 # (see: http://psoup.math.wisc.edu/mcell/rullex_marg.html ) for i in range(16): if not i==becomes[i]: # (we can skip no-change transitions) f.write(','.join(map(str,dot[i]))+' : '+\ ','.join(map(str,dot[becomes[i]]))+\ ' # '+str(i)+' -> '+str(becomes[i])+'\n') f.flush() f.close() # emulate the rule table with tree data in a .rule file n_states, neighborhood, transitions = ReadRuleTable(tablepath) golly.show("Building rule...") rule_name = EmulateMargolus(neighborhood, n_states, transitions, tablepath) os.remove(tablepath) golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/glife/0000755000175000017500000000000013543257426014304 500000000000000golly-3.3-src/Scripts/Python/glife/gun24.py0000644000175000017500000000140312026730263015521 00000000000000from glife import * # an aligned gun shooting SE: gun24 = pattern (""" 23bo2bo$21b6o$17b2obo8bo$13b2obobobob8o2bo$11b3ob2o3bobo7b3o$10bo 4b3o2bo3bo3b2o$11b3o3b2ob4obo3bob2o$12bobo3bo5bo4bo2bo4b2obo$10b o8bob2o2b2o2b2o5bob2obo$10b5ob4obo4b3o7bo4bo$15b2o4bo4bob3o2b2ob ob2ob2o$12b5ob3o4b2ob2o3bobobobobo$11bo5b2o4b2obob2o5bo5bo$12b5o 6b2obo3bo3bobob2ob2o$2ob2o9b2o2bo5bobo4bo2b3obobo$bobobobob2o3b3o bo6bo2bobo4b3o2bo$o2bo7bo6b2o3b3o8bobob2o$3o2bo4b2o11bo10bo$5b4o bo17b2o4b2o$2b2obo6bo14bo3bo2b2o$bo4bo3bo16bo6b2o$b3obo4bo16bo3b o2bo$11bo2bo3bo9b2o4bobob2o$b3obo4bo8b2o3bo10b3o2bo$bo4bo3bo7bo6b o8b3obobo$2b2obo6bo10b3o8bobob2ob2o$5b4obo24bo5bo$3o2bo4b2o21bob obobobo$o2bo7bo9b2o10b2obob2ob2o$bobobobob2o10bo8bo5bo4bo$2ob2o17b 3o6bo4bob2obo$24bo4b3o5b2obo!""", -32, -32) golly-3.3-src/Scripts/Python/glife/EmulateOneDimensional.py0000644000175000017500000000117012112261643021001 00000000000000import os from glife.RuleTree import * def EmulateOneDimensional(neighborhood,n_states,transitions,input_filename): '''Emulate a oneDimensional neighborhood rule table with a vonNeumann neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] tree = RuleTree(n_states,4) for t in transitions: tree.add_rule([t[0],range(n_states),t[2],t[1],range(n_states)],t[3][0]) # C,S,E,W,N,C' tree.write( golly.getdir('rules')+rule_name+".tree" ) # use rule_name.tree to create rule_name.rule (no icon info) ConvertTreeToRule(rule_name, n_states, []) return rule_name golly-3.3-src/Scripts/Python/glife/WriteRuleTable.py0000644000175000017500000000401112026730263017452 00000000000000from copy import deepcopy def WriteRuleTable(neighborhood,n_states,transitions,output_filename): '''Write a rule table format file for the given rule.''' def toName(i,output=''): '''Convert [0,1,2,...,26,...] to ['a','b','c',...,'aa',...].''' output = chr(ord('a')+i%26) + output if i<26: return output return toName(i//26-1,output) f = open(output_filename,'w') f.write('neighborhood:'+neighborhood+'\n') f.write('symmetries:none\n') # our transitions list is expanded for symmetries f.write('n_states:'+str(n_states)+'\n\n') vars = {} # e.g. (0,1,2):['aa','bf'] (need multiple names to avoid binding) iNextName = 0 # pass 1: collect and output the variables, replacing inputs with strings transitions_with_strings = deepcopy(transitions) # don't want to change our input list for t in transitions_with_strings: for i,inputs in enumerate(t): if len(inputs)==1: t[i]=str(inputs[0]) else: # do we need to make a new variable for this input? ok = False if tuple(inputs) in vars: for var_name in vars[tuple(inputs)]: if not var_name in t: ok = True # can use an existing variable break if not ok: # must make a new variable var_name = toName(iNextName) iNextName += 1 if tuple(inputs) in vars: vars[tuple(inputs)] += [var_name] else: vars[tuple(inputs)] = [var_name] f.write('var '+var_name+'={'+','.join(map(str,inputs))+'}\n') t[i] = var_name # pass 2: output the transitions f.write('\n') for t in transitions_with_strings: f.write(','.join(t)+'\n') f.flush() f.close() golly-3.3-src/Scripts/Python/glife/__init__.pyc0000644000175000017500000002330312026743720016471 00000000000000ó ³°[Pc@s,ddlZddlZddlZdZdefd„ƒYZdZdZdZdZ dZ dZ dZ dZ dZd Zd Zd Zd ZdZdZdZdZdZdZdZd Zd d„Zd„Zd„Zdefd„ƒYZd„Zd„Z d„Z!d„Z"d„Z#d„Z$dS(!iÿÿÿÿNs$High-level scripting aids for Golly.trectcBs#eZdZd„Zgd„ZRS(s:A simple class to make it easier to manipulate rectangles.cCs%tj|j|j|j|jgƒS(s6Return true if rect is completely visible in viewport.(tgollytvisrecttxtytwdtht(tself((s0/home/akt/golly/Scripts/Python/glife/__init__.pytvisiblescCst|ƒdkrt|_nät|ƒdkröt|_|d|_|_|d|_|_|d|_|_ |d|_ |_ |jdkr§t dƒ‚n|j dkrÅt dƒ‚n|j|jd|_ |j|j d|_n tdƒ‚tj||ƒdS( Niiiiisrect width must be > 0srect height must be > 0s"rect arg must be [] or [x,y,wd,ht](tlentTruetemptytFalseRtleftRttopRtwidthRtheightt ValueErrortrighttbottomt TypeErrortlistt__init__(RtR((s0/home/akt/golly/Scripts/Python/glife/__init__.pyRs    (t__name__t __module__t__doc__RR(((s0/home/akt/golly/Scripts/Python/glife/__init__.pyR s iitDrawtPicktSelecttMovesZoom InsZoom OutsB3/S23cCstj|ƒdS(s› Set the rule for the Game of Life. Although it affects subsequent calls to pattern.evolve(), only the last call to this function matters for the viewer.N(Rtsetrule(ts((s0/home/akt/golly/Scripts/Python/glife/__init__.pytruleQscCs'x |jdƒD]}dG|GHqWdS(s2Supply a textual description to the whole pattern.s s#DN(tsplit(R tline((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt descriptionZsc Csõ|d}|d}|d}|d}|d}|d}||d||d|||d||d||d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|dffS(sì Return the composition of two transformations S and T. A transformation is a tuple of the form (x, y, A), which denotes multiplying by matrix A and then translating by vector (x, y). These tuples can be passed to pattern.__call__().iiii((tStTRRtAR tttB((s0/home/akt/golly/Scripts/Python/glife/__init__.pytcomposeas  6>tpatterncBseZdZd„Zd„Zed„Zd„Zd„Zdded„Z ddded „Z d d „Z d „Z gdded „ZRS(s"This class represents a cell list.cCsttj||ƒƒS(sJoin patterns.(R+Rtjoin(Rtq((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt__add__rscCs |j|ƒS(sy The __getitem__() function is an alias to evolve(). It allows to access the pattern's phases as elements of an array.(tevolve(RtN((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt __getitem__vscCsttj||||ŒƒS(s'The same as 'apply(A).translate(x, y)'.(R+Rt transform(RRRR'((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt__call__|scCs |||ƒS(sTranslate the pattern.((RRR((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt translate€scCs|dd|ƒS(sÁ Apply a matrix transformation to the pattern. Predefined matrices are: identity, flip, flip_x, flip_y, swap_xy, swap_xy_flip, rcw (rotate clockwise) and rccw (rotate counter-clockwise).i((RR'((s0/home/akt/golly/Scripts/Python/glife/__init__.pytapply„sicCstj||||ŒdS(s$Paste pattern into current universe.N(Rtputcells(RRRR'((s0/home/akt/golly/Scripts/Python/glife/__init__.pytputŒstuntitledcCs>tj|ƒtj||||ŒtjƒtjtƒdS(s3Paste pattern into new universe and display it all.N(RtnewR6tfitt setcursortzoomin(RttitleRRR'((s0/home/akt/golly/Scripts/Python/glife/__init__.pytdisplays  cCstj|||ƒdS(s] Save the pattern to file 'fn' in RLE format. An optional description 'desc' may be given.N(Rtstore(Rtfntdesc((s0/home/akt/golly/Scripts/Python/glife/__init__.pytsave—scCs¯|dkrtdƒ‚n|jj|ƒr8|j|Sd}x<|jjƒD]+}||kok|knrN|}qNqNWttj|j|||ƒƒ}|j|<|S(s· Return N-th generation of the pattern. Once computed, the N-th generation is remembered and quickly accessible. It is also the base for computing generations subsequent to N-th.isbackward evolving requested(Rt_pattern__phasesthas_keytkeysR+RR/(RR0tMtktp((s0/home/akt/golly/Scripts/Python/glife/__init__.pyR/s   .cCs°tƒ|_t|ƒtkr1tj||ƒnnt|ƒtkr\tj|t|ƒƒnCt|ƒtkr“tj|tj||||Œƒn t dƒ‚||jdtNoneRBR/R(((s0/home/akt/golly/Scripts/Python/glife/__init__.pyR+os       cCsttj|ƒƒS(N(R+Rtload(R@((s0/home/akt/golly/Scripts/Python/glife/__init__.pyRRÎsc CsNtj}tj }tj}tj }t|ƒ}t|ƒ}d}|d@dkrzd}|ddkrz|d8}qznxTtd||ƒD]@}|||kr°||}n|||kr||}qqWxTtd||ƒD]@} || |kr|| }n|| |krä|| }qäqäWt||||d||dgƒS(Niiii(tsystmaxintRR txrangeR( tpatttminxtmaxxtminytmaxytclisttclentincRR((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt getminboxÔs,        cCs_t|ƒdkrtS|jddƒ}|ddksH|ddkrU|d}n|jƒS(Nit,tt+t-i(R R treplacetisdigit(R ((s0/home/akt/golly/Scripts/Python/glife/__init__.pytvalidintñs  cCs(tjƒ\}}t|ƒt|ƒfS(N(Rtgetpostint(RR((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt getposintúscCs tjt|ƒt|ƒƒdS(N(RtsetposRK(RR((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt setposintscCs"tjddƒtjdƒdS(Ns1Change the script to use the getstring() command s"from golly rather than from glife.R`(Rtwarntexit(tprompt((s0/home/akt/golly/Scripts/Python/glife/__init__.pyt getstrings (iiii(iÿÿÿÿiiiÿÿÿÿ(iÿÿÿÿiii(iiiiÿÿÿÿ(iiii(iiÿÿÿÿiÿÿÿÿi(iiÿÿÿÿii(iiiÿÿÿÿi(%RRSttimeRRRtinsidetoutsidet left_rightt top_bottomtup_downt clockwiset anticlockwisetdrawtpicktselecttmoveR<tzoomoutRPtfliptflip_xtflip_ytswap_xyt swap_xy_fliptrcwtrccwR!R$R*R+RRR^ReRhRjRn(((s0/home/akt/golly/Scripts/Python/glife/__init__.pytsF     _    golly-3.3-src/Scripts/Python/glife/BuiltinIcons.pyc0000644000175000017500000002431212146035037017333 00000000000000ó —9˜Qc@sdZdZdZdZdS(sy XPM /* width height num_colors chars_per_pixel */ "31 31 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 6 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" "F c #E0E0E0" /* icon for state 1 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." sí XPM /* width height num_colors chars_per_pixel */ "31 31 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." ".........BBBBBBBBBBBBB........." "........BBBBBBBBBBBBBBB........" ".......BBBBBBBBBBBBBBBBB......." "......BBBBBBBBBBBBBBBBBBB......" ".....BBBBBBBBBBBBBBBBBBBBB....." "....BBBBBBBBBBBBBBBBBBBBBBB...." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "..BBBBBBBBBBBBBBBBBBBBBBBBBBB.." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "....BBBBBBBBBBBBBBBBBBBBBBB...." ".....BBBBBBBBBBBBBBBBBBBBB....." "......BBBBBBBBBBBBBBBBBBB......" ".......BBBBBBBBBBBBBBBBB......." "........BBBBBBBBBBBBBBB........" ".........BBBBBBBBBBBBB........." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." ".......B......." "......BBB......" ".....BBBBB....." "....BBBBBBB...." "...BBBBBBBBB..." "..BBBBBBBBBBB.." ".BBBBBBBBBBBBB." "..BBBBBBBBBBB.." "...BBBBBBBBB..." "....BBBBBBB...." ".....BBBBB....." "......BBB......" ".......B......." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "...B..." "..BBB.." ".BBBBB." "BBBBBBB" ".BBBBB." "..BBB.." "...B..." s XPM /* width height num_colors chars_per_pixel */ "31 31 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".....BBC......................." "....BBBBBC....................." "...BBBBBBBBC..................." "..BBBBBBBBBBBC................." ".BBBBBBBBBBBBBBC..............." "BBBBBBBBBBBBBBBBBC............." "BBBBBBBBBBBBBBBBBBBC..........." "CBBBBBBBBBBBBBBBBBBBBC........." ".BBBBBBBBBBBBBBBBBBBBBB........" ".CBBBBBBBBBBBBBBBBBBBBBC......." "..BBBBBBBBBBBBBBBBBBBBBB......." "..CBBBBBBBBBBBBBBBBBBBBBC......" "...BBBBBBBBBBBBBBBBBBBBBB......" "...CBBBBBBBBBBBBBBBBBBBBBC....." "....BBBBBBBBBBBBBBBBBBBBBB....." "....CBBBBBBBBBBBBBBBBBBBBBC...." ".....BBBBBBBBBBBBBBBBBBBBBB...." ".....CBBBBBBBBBBBBBBBBBBBBBC..." "......BBBBBBBBBBBBBBBBBBBBBB..." "......CBBBBBBBBBBBBBBBBBBBBBC.." ".......BBBBBBBBBBBBBBBBBBBBBB.." ".......CBBBBBBBBBBBBBBBBBBBBBC." "........BBBBBBBBBBBBBBBBBBBBBB." ".........CBBBBBBBBBBBBBBBBBBBBC" "...........CBBBBBBBBBBBBBBBBBBB" ".............CBBBBBBBBBBBBBBBBB" "...............CBBBBBBBBBBBBBB." ".................CBBBBBBBBBBB.." "...................CBBBBBBBB..." ".....................CBBBBB...." ".......................CBB....." XPM /* width height num_colors chars_per_pixel */ "15 15 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ "...BBC........." "..BBBBBC......." ".BBBBBBBBC....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "CBBBBBBBBBBBC.." ".BBBBBBBBBBBB.." ".CBBBBBBBBBBBC." "..BBBBBBBBBBBB." "..CBBBBBBBBBBBC" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....CBBBBBBBB." ".......CBBBBB.." ".........CBB..." XPM /* width height num_colors chars_per_pixel */ "7 7 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".BBC..." "BBBBB.." "BBBBBB." "CBBBBBC" ".BBBBBB" "..BBBBB" "...CBB." s\ XPM /* width height num_colors chars_per_pixel */ "31 93 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "B.............................." "BB............................." "BBB............................" "BBBB..........................." "BBBBB.........................." "BBBBBB........................." "BBBBBBB........................" "BBBBBBBB......................." "BBBBBBBBB......................" "BBBBBBBBBB....................." "BBBBBBBBBBB...................." "BBBBBBBBBBBB..................." "BBBBBBBBBBBBB.................." "BBBBBBBBBBBBBB................." "BBBBBBBBBBBBBBB................" "BBBBBBBBBBBBBBBB..............." "BBBBBBBBBBBBBBBBB.............." "BBBBBBBBBBBBBBBBBB............." "BBBBBBBBBBBBBBBBBBB............" "BBBBBBBBBBBBBBBBBBBB..........." "BBBBBBBBBBBBBBBBBBBBB.........." "BBBBBBBBBBBBBBBBBBBBBB........." "BBBBBBBBBBBBBBBBBBBBBBB........" "BBBBBBBBBBBBBBBBBBBBBBBB......." "BBBBBBBBBBBBBBBBBBBBBBBBB......" "BBBBBBBBBBBBBBBBBBBBBBBBBB....." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBBB..." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "..BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "...BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" ".....BBBBBBBBBBBBBBBBBBBBBBBBBB" "......BBBBBBBBBBBBBBBBBBBBBBBBB" ".......BBBBBBBBBBBBBBBBBBBBBBBB" "........BBBBBBBBBBBBBBBBBBBBBBB" ".........BBBBBBBBBBBBBBBBBBBBBB" "..........BBBBBBBBBBBBBBBBBBBBB" "...........BBBBBBBBBBBBBBBBBBBB" "............BBBBBBBBBBBBBBBBBBB" ".............BBBBBBBBBBBBBBBBBB" "..............BBBBBBBBBBBBBBBBB" "...............BBBBBBBBBBBBBBBB" "................BBBBBBBBBBBBBBB" ".................BBBBBBBBBBBBBB" "..................BBBBBBBBBBBBB" "...................BBBBBBBBBBBB" "....................BBBBBBBBBBB" ".....................BBBBBBBBBB" "......................BBBBBBBBB" ".......................BBBBBBBB" "........................BBBBBBB" ".........................BBBBBB" "..........................BBBBB" "...........................BBBB" "............................BBB" ".............................BB" "..............................B" "..............................." /* icon for state 3 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "B.BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BB.BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBB.BBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBB.BBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBB.BBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBB.BBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBB.BBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBB.BBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBB.BBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBB.BBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBB.BBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBB.BBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBB.BBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBB.BBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB.BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBB.BBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBB.BBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBB.BBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBB.BBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBB.BBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBB.BBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBB.BBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBB.BBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBB.BBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBB.BBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBB.BBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBB.BBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBB.BB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.B" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "15 45 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 3 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "7 21 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "B......" "BB....." "BBB...." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 2 */ ".BBBBBB" "..BBBBB" "...BBBB" "....BBB" ".....BB" "......B" "......." /* icon for state 3 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BBB.BBB" "BBBB.BB" "BBBBB.B" "BBBBBB." N(tcirclestdiamondsthexagonst triangles(((s4/home/akt/golly/Scripts/Python/glife/BuiltinIcons.pyt\sOR¿golly-3.3-src/Scripts/Python/glife/gun46.pyc0000644000175000017500000000071512026743720015677 00000000000000ó ³°[Pc@s“ddlTeƒeddeƒeddeƒeddƒeddƒZeddƒed deƒZed d d ƒed deƒZd S(iÿÿÿÿ(t*iiiþÿÿÿiiüÿÿÿiiiøÿÿÿiiùÿÿÿióÿÿÿN( t glife.basetrulet bheptominotflip_xtfliptblockt__halft gun46_doubletgun46(((s-/home/akt/golly/Scripts/Python/glife/gun46.pyts <golly-3.3-src/Scripts/Python/glife/text.pyc0000644000175000017500000001740512115617164015725 00000000000000ó ³°[Pc@sr ddlTddlTeƒZedddƒedƒedsb3o$o3bo$4bo$2b2o$2bo2$2bo!t?sb3o$o3bo$ob3o$obobo$ob2o$o$b3o!t@s b3o$o3bo$o3bo$5o$o3bo$o3bo$o3bo!tAs4o$o3bo$o3bo$4o$o3bo$o3bo$4o!tBsb3o$o3bo$o$o$o$o3bo$b3o!tCs4o$o3bo$o3bo$o3bo$o3bo$o3bo$4o!tDs5o$o$o$3o$o$o$5o!tEs5o$o$o$3o$o$o$o!tFsb3o$o3bo$o$o2b2o$o3bo$o3bo$b3o!tGs!o3bo$o3bo$o3bo$5o$o3bo$o3bo$o3bo!tHsb3o$2bo$2bo$2bo$2bo$2bo$b3o!tIs2b3o$3bo$3bo$3bo$3bo$o2bo$b2o!tJso3bo$o2bo$obo$2o$obo$o2bo$o3bo!tKso$o$o$o$o$o$5o!tLs&o3bo$2ob2o$obobo$obobo$o3bo$o3bo$o3bo!tMs&o3bo$2o2bo$obobo$o2b2o$o3bo$o3bo$o3bo!tNs!b3o$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!tOs4o$o3bo$o3bo$4o$o$o$o!tPs$b3o$o3bo$o3bo$o3bo$obobo$o2bo$b2obo!tQs4o$o3bo$o3bo$4o$o2bo$o3bo$o3bo!tRsb3o$o3bo$o$b3o$4bo$o3bo$b3o!tSs5o$2bo$2bo$2bo$2bo$2bo$2bo!tTs"o3bo$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!tUs"o3bo$o3bo$o3bo$o3bo$o3bo$bobo$2bo!tVs&o3bo$o3bo$o3bo$obobo$obobo$2ob2o$o3bo!tWs"o3bo$o3bo$bobo$2bo$bobo$o3bo$o3bo!tXso3bo$o3bo$bobo$2bo$2bo$2bo$2bo!tYs5o$4bo$3bo$2bo$bo$o$5o!tZs2b2o$2bo$2bo$2bo$2bo$2bo$2b2o!t[sbo$bo$2bo$2bo$2bo$3bo$3bo!s\sb2o$2bo$2bo$2bo$2bo$2bo$b2o!t]s2bo$bobo$o3bo!t^s6$5o!t_so$bo!t`s2$b4o$o3bo$o3bo$o3bo$b4o!taso$o$4o$o3bo$o3bo$o3bo$4o!tbs2$b4o$o$o$o$b4o!tcs4bo$4bo$b4o$o3bo$o3bo$o3bo$b4o!tds2$b3o$o3bo$5o$o$b4o!tes2b2o$bo2bo$bo$3o$bo$bo$bo!tfs!2$b3o$o3bo$o3bo$o3bo$b4o$4bo$b3o!tgso$o$ob2o$2o2bo$o3bo$o3bo$o3bo!ths$2bo2$2bo$2bo$2bo$2b2o!tis$3bo2$3bo$3bo$3bo$3bo$o2bo$b2o!tjso$o$o2bo$obo$3o$o2bo$o3bo!tksb2o$2bo$2bo$2bo$2bo$2bo$2b2o!tls2$bobo$obobo$obobo$o3bo$o3bo!tms2$4o$o3bo$o3bo$o3bo$o3bo!tns2$b3o$o3bo$o3bo$o3bo$b3o!tos2$4o$o3bo$o3bo$o3bo$4o$o$o!tps!2$b4o$o3bo$o3bo$o3bo$b4o$4bo$4bo!tqs2$ob2o$2o2bo$o$o$o!trs2$b4o$o$b3o$4bo$4o!tss$2bo$5o$2bo$2bo$2bo$3b2o!tts2$o3bo$o3bo$o3bo$o3bo$b4o!tus2$o3bo$o3bo$o3bo$bobo$2bo!tvs2$o3bo$o3bo$obobo$2ob2o$o3bo!tws2$o3bo$bobo$2bo$bobo$o3bo!txs"2$o3bo$o3bo$o3bo$o3bo$b4o$4bo$b3o!tys2$5o$3bo$2bo$bo$5o!tzs3bo$2bo$2bo$bo$2bo$2bo$3bo!t{s2bo$2bo$2bo$2bo$2bo$2bo$2bo!t|sbo$2bo$2bo$3bo$2bo$2bo$bo!t}s2$bo$obobo$3bo!t~isY2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!iòÿÿÿi s#2o$bo$o$2o2$2o$bo$o$2o2$2o$bo$o$2o!isG2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o!sB2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o!isI2o3b2o$2o3b2o2$2o3b2o$obobobo$2bobo$b2obo$5b2o$6bo$5bo$5b2o$6bo$5bo$5b2o!i sG2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!sN2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!s9ob2o$2obo$4b2o$5bo$4bo$4b2o$2b2o$3bo$2bo$2b2o$2o$bo$o$2o!s\2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!sU2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!s 2obo$ob2o!iøÿÿÿtSnakialcCs¸tƒ}d}t|d ƒdkr4t}d}n-t|ƒdkrUt}d}n t}d}xP|D]H}|j|ƒs†|}n||}|||dƒ7}||j7}qhW|S(NiiteaR tmonoR(tpatterntlowert__eafontt__mfontt__sfontthas_keytwidth(tstringtfontRORWREtunknownRBtsymbol((s,/home/akt/golly/Scripts/Python/glife/text.pyt make_text¡s"      N( tglifeRhtdictRcRaRgRdtkeyReRl(((s,/home/akt/golly/Scripts/Python/glife/text.pyts(                             golly-3.3-src/Scripts/Python/glife/base.pyc0000644000175000017500000001117412026743720015647 00000000000000ó ³°[Pc@sddlTedƒZedddƒZedƒZedƒZedƒZedƒZed ƒZZ ed ƒZ ed ƒZ ed ƒZ ed ddƒZ edƒZedƒZedddƒZedddƒZedƒZedƒZedƒZedddƒZedƒZedƒZedƒZedddƒZedƒZedddƒZedƒZedd d ƒZed!ƒZed"ddƒZed#ƒZ ed$ƒZ!ed%ddƒZ"ed&ƒZ#ed'ƒZ$ed(d)dƒZ%ed*ƒZ&ed+ƒZ'ed,ƒZ(d-S(.iÿÿÿÿ(t*s ** ** s***is .** **. ..* s ****. *...* *.... .*..* s$ *****. *....* *..... .*...* ...*.. s) ******. *.....* *...... .*....* ...**.. s ** * .*** ...* s$ **.. ..*. ...* ...* ...* ..*. **.. s ***. .*.. .*** s **. .** **. *.. s .*. *.* .*. s **. *.* .*. s **. *.* .*.* ..* s **. *.* .** s .**. *..* .**. s .**. *..* *.*. .*.. s *.** **.* s **.. *..* ..** s· ......*...... .....*.*..... .....*.*..... ......*...... ............. .**.......**. *..*.....*..* .**.......**. ............. ......*...... .....*.*..... .....*.*..... ......*...... iúÿÿÿs **.. *... ...* ..** s8 ......*.*. .....*.... **..*....* **.*..*.** ....**.... s ..*. **.. ..** .*.. s¦ ........*. .......*.* ......**.. .........* .....*...* ..*..*.... .*.*..**** *..*...... .*.*..**** ..*..*.... .....*...* .........* ......**.. .......*.* ........*. iùÿÿÿs+ ***... ***... ***... ...*** ...*** ...*** s ...*******... .***.***.***. *....***....* .****.*.***.* ...........*. *.**.*.*.*... **.*.*.*.**.. ....*..*.*... .....**..*... .........**.. sÀ .........*.......................... ........*.*......................... ......***.*......................... .....*....**.*...................... .....*.**...**......**.............. ....**.*.**.........*.*............. .........*.*****......*..*.**....... ..*.**.**.*.....*....**.*.**.*...... .....**.....****........*....*...... *...*.*..*...*.*....**.*.****.**.... *...*.*..**.*.**.**....*.*....*.*... .....**...***.**.*.***.*..***...*... ..*.**.**.**.............*.*..*.*.** ...........*......*.*.*.*..**.*.*.*. ....**.*.*.**......**.*.*.*...*.*.*. .....*.**.*..*.......*.**..****.**.. .....*....*.*........*...**......... ....**....**........**...*..*....... ...........................**....... s[ ******.** ******.** .......** **.....** **.....** **.....** **....... **.****** **.****** iüÿÿÿsâ ...**......... ...*.*........ ...*.......... **.*.......... *....*........ *.**......***. .....***....** ......***.*.*. .............* ......*.*..... .....**.*..... ......*....... ....**.*...... .......*...... .....**....... s" ..*....*.. **.****.** ..*....*.. s *** *.* *.* s .**. *..* *..* .**. s· ..***...***.. ............. *....*.*....* *....*.*....* *....*.*....* ..***...***.. ............. ..***...***.. *....*.*....* *....*.*....* *....*.*....* ............. ..***...***.. s .** ** .* s *...*** ***..*. .*..... sá .........*.......*......... ...**.*.*.**...**.*.*.**... ***.*.***.........***.*.*** *...*.*.....*.*.....*.*...* ....**......*.*......**.... .**.........*.*.........**. .**.**...............**.**. .....*...............*..... ióÿÿÿs ...**..**... .***.**.***. *..........* .****..****. ....*..*.... .**......**. .*..*..*..*. ..***..***.. ............ ****.**.**** *..**..**..* sI ..**.... ....*.** *..*..** *.*..... .*...... ........ .**..... .**..... sÒ ..................*........... .................*.**......... .................*.**......... ..................**.......... .............................. .......**............**....... .......**............**....... .............................. .............................. ......*.*..................... .....*..................**.... **..*....*..........**.*..*.** **.*..*.**..........**..*....* ....**...................*.... ..........................*.*. N()tglifetpatterntblocktblinkertglidertlwsstmwssthwssteaterthooktqueenbeetherschelt bheptominottubtboatt long_boattshiptbeehivetloaftsnaketaircraft_carriert honeyfarmtbeacontblockertclocktdartt big_beacontmiddleweight_volcanotheavyweight_volcanotgalaxytoriontpentadecathlontpitpondtpulsart rpentominotrabbitstspidertlightweight_volcanotunixt biblocker(((s,/home/akt/golly/Scripts/Python/glife/base.pyts–                              golly-3.3-src/Scripts/Python/glife/EmulateTriangular.py0000644000175000017500000004602312112261643020213 00000000000000# Inspired by Andrew Trevorrow's work on TriLife.py try: set except NameError: # use sets module if Python version is < 2.4 from sets import Set as set import golly import os from glife.RuleTree import * # We support two emulation methods: # 1) square-splitting: each square holds two triangles: one up, one down # 2) checkerboard: each square holds one triangle, either up or down # # The first method has better appearance but requires N*N states. The second requires only 2N # states but user must respect the checkerboard when drawing. For triangularMoore emulation, only # the first is possible (since Golly only natively supports vonNeumann and Moore). Thus we choose # the first where possible, only using the second for triangularVonNeumann when N>16. # # 1) Square-splitting emulation: (following Andrew Trevorrow's TriLife.py) # # triangularVonNeumann -> vonNeumann: # # lower upper # +--+ +--+ # |\ | |\ | # | \| |2\| (any rotation would work too) # +--+--+--+ +--+--+--+ # |\3|\1|\ | |\ |\0|\ | # | \|0\| \| | \|1\|3\| # +--+--+--+ +--+--+--+ # |\2| |\ | # | \| | \| # +--+ +--+ # # triangularMoore -> Moore: # # lower upper # +--+--+--+ +--+--+--+ # |\B|\ |\ | |\6|\7|\ | where A=10, B=11, C=12 # |A\|C\| \| |5\|2\|8\| # +--+--+--+ +--+--+--+ # |\3|\1|\ | |\4|\0|\9| # |9\|0\|4\| | \|1\|3\| # +--+--+--+ +--+--+--+ # |\8|\2|\5| |\ |\C|\A| # | \|7\|6\| | \| \|B\| # +--+--+--+ +--+--+--+ # # 2) Checkerboard emulation: (drawn using A and V to represent triangles in two orientations) # # A V A V A V A V where each A has 3 V neighbors: V A V # V A V A V A V A V # A V A V A V A V # V A V A V A V A and each V has 3 A neighbors: A # A V A V A V A V A V A # V A V A V A V A def TriangularTransitionsToRuleTree_SplittingMethod(neighborhood,n_states,transitions_list,rule_name): # each square cell is j*N+i where i is the lower triangle, j is the upper triangle # each i,j in (0,N] # (lower and upper are lists) def encode(lower,upper): return [ up*n_states+low for up in upper for low in lower ] # what neighbors of the lower triangle overlap neighbors of the upper triangle? lower2upper = { "triangularVonNeumann": [(0,1),(1,0)], "triangularMoore": [(0,1),(1,0),(2,12),(3,4),(4,3),(5,10),(6,11),(10,5),(11,6),(12,2)], } numNeighbors = { "triangularVonNeumann":4, "triangularMoore":8 } # convert transitions to list of list of sets for speed transitions = [[set(e) for e in t] for t in transitions_list] tree = RuleTree(n_states*n_states,numNeighbors[neighborhood]) # for each transition pair, see if we can apply them both at once to a square for i,t1 in enumerate(transitions): # as lower golly.show("Building rule tree... (pass 1 of 2: "+str(100*i/len(transitions))+"%)") for t2 in transitions: # as upper # we can only apply both rules at once if they overlap to some extent ### AKT: any() and isdisjoint() are not available in Python 2.3: ### if any( t1[j].isdisjoint(t2[k]) for j,k in lower2upper[neighborhood] ): ### continue any_disjoint = False for j,k in lower2upper[neighborhood]: if len(t1[j] & t2[k]) == 0: any_disjoint = True break if any_disjoint: continue # take the intersection of their inputs if neighborhood=="triangularVonNeumann": tree.add_rule( [ encode(t1[0]&t2[1],t1[1]&t2[0]), # C encode(range(n_states),t1[2]), # S encode(t2[3],range(n_states)), # E encode(range(n_states),t1[3]), # W encode(t2[2],range(n_states)) ], # N encode(t1[4],t2[4])[0] ) # C' elif neighborhood=="triangularMoore": tree.add_rule( [ encode(t1[0]&t2[1],t1[1]&t2[0]), # C encode(t1[7],t1[2]&t2[12]), # S encode(t1[4]&t2[3],t2[9]), # E encode(t1[9],t1[3]&t2[4]), # W encode(t1[12]&t2[2],t2[7]), # N encode(t1[6]&t2[11],t1[5]&t2[10]), # SE encode(range(n_states),t1[8]), # SW encode(t2[8],range(n_states)), # NE encode(t1[10]&t2[5],t1[11]&t2[6]) ], # NW encode(t1[13],t2[13])[0] ) # C' # apply each transition to an individual triangle, leaving the other unchanged for i,t in enumerate(transitions): golly.show("Building rule tree... (pass 2 of 2: "+str(100*i/len(transitions))+"%)") for t_1 in t[1]: if neighborhood=="triangularVonNeumann": # as lower triangle: tree.add_rule( [ encode(t[0],[t_1]), # C encode(range(n_states),t[2]), # S range(n_states*n_states), # E encode(range(n_states),t[3]), # W range(n_states*n_states) ], # N encode(t[4],[t_1])[0] ) # C' # as upper triangle: tree.add_rule( [ encode([t_1],t[0]), # C range(n_states*n_states), # S encode(t[3],range(n_states)), # E range(n_states*n_states), # W encode(t[2],range(n_states)) ], # N encode([t_1],t[4])[0] ) # C' elif neighborhood=="triangularMoore": # as lower triangle: tree.add_rule( [encode(t[0],[t_1]), # C encode(t[7],t[2]), # S encode(t[4],range(n_states)), # E encode(t[9],t[3]), # W encode(t[12],range(n_states)), # N encode(t[6],t[5]), # SE encode(range(n_states),t[8]), # SW range(n_states*n_states), # NE encode(t[10],t[11]) ], # NW encode(t[13],[t_1])[0] ) # C' # as upper triangle: tree.add_rule( [encode([t_1],t[0]), encode(range(n_states),t[12]), # S encode(t[3],t[9]), # E encode(range(n_states),t[4]), # W encode(t[2],t[7]), # N encode(t[11],t[10]), # SE range(n_states*n_states), # SW encode(t[8],range(n_states)), # NE encode(t[5],t[6]) ], # NW encode([t_1],t[13])[0] ) # C' # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') def TriangularTransitionsToRuleTree_CheckerboardMethod(neighborhood,n_states,transitions,rule_name): # Background state 0 has no checkerboard, we infer it from its neighboring cells. def encode_lower(s): return s def encode_upper(s): ### AKT: this code causes syntax error in Python 2.3: ### return [0 if se==0 else n_states+se-1 for se in s] temp = [] for se in s: if se==0: temp.append(0) else: temp.append(n_states+se-1) return temp total_states = n_states*2 - 1 if total_states>256: golly.warn("Number of states exceeds Golly's limit of 256!") golly.exit() tree = RuleTree(total_states,4) for t in transitions: # as lower tree.add_rule([encode_lower(t[0]), # C encode_upper(t[2]), # S encode_upper(t[1]), # E encode_upper(t[3]), # W range(total_states)], # N encode_lower(t[4])[0]) # C' # as upper tree.add_rule([encode_upper(t[0]), # C range(total_states), # S encode_lower(t[3]), # E encode_lower(t[1]), # W encode_lower(t[2])], # N encode_upper(t[4])[0]) # C' # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') def MakeTriangularIcons_SplittingMethod(n_states,colors,force_background,rule_name): width = 31*(n_states*n_states-1) if force_background and n_states>2: width+=31 height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] for row in range(height): for column in range(width): if force_background and n_states>2 and column>=width-31: # add extra 'icon' filled with the intended background color pixels[row][column] = background_color else: # decide if this pixel is a lower or upper triangle iState = int(column/31) upper = int((iState+1) / n_states) lower = (iState+1) - upper*n_states is_upper = False is_lower = False if row<31: # 31x31 icon if (column-iState*31) > row: is_upper = True elif (column-iState*31) < row: is_lower = True elif row<46 and (column-iState*31)<15: # 15x15 icon if (column-iState*31) > row-31: is_upper = True elif (column-iState*31) < row-31: is_lower = True elif (column-iState*31)<7: # 7x7 icon if (column-iState*31) > row-46: is_upper = True elif (column-iState*31) < row-46: is_lower = True if is_upper: pixels[row][column] = colors[upper] elif is_lower: pixels[row][column] = colors[lower] else: pixels[row][column] = 0,0,0 return pixels def MakeTriangularIcons_CheckerboardMethod(n_states,colors,force_background,rule_name): width = 31*(n_states*2-1) if force_background and n_states>2: width+=31 height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] lower31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] lower15x15 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] lower7x7 = [[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,1,1,0,0], [0,1,1,1,1,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]] if force_background: bg_color = colors[0] else: bg_color = (0,0,0) for i in range(1,n_states): fg_color = colors[i] # draw 31x31 icons for row in range(31): for column in range(31): # draw lower triangle icons pixels[row][31*(i-1) + column] = [bg_color,fg_color][lower31x31[row][column]] # draw upper triangle icons pixels[row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower31x31[28-row][column]] # draw 15x15 icons for row in range(15): for column in range(15): # draw lower triangle icons pixels[31+row][31*(i-1) + column] = [bg_color,fg_color][lower15x15[row][column]] # draw upper triangle icons pixels[31+row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower15x15[13-row][column]] # draw 7x7 icons for row in range(7): for column in range(7): # draw lower triangle icons pixels[46+row][31*(i-1) + column] = [bg_color,fg_color][lower7x7[row][column]] # draw upper triangle icons pixels[46+row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower7x7[6-row][column]] return pixels def EmulateTriangular(neighborhood,n_states,transitions_list,input_filename): '''Emulate a triangularVonNeumann or triangularMoore neighborhood rule table with a rule tree.''' input_rulename = os.path.splitext(os.path.split(input_filename)[1])[0] # read rule_name+'.colors' file if it exists force_background = False background_color = [0,0,0] cfn = os.path.split(input_filename)[0] + "/" + input_rulename + ".colors" try: cf = open(cfn,'r') except IOError: # use Golly's default random colours random_colors=[[0,0,0],[0,255,127],[127,0,255],[148,148,148],[128,255,0],[255,0,128],[0,128,255],[1,159,0], [159,0,1],[255,254,96],[0,1,159],[96,255,254],[254,96,255],[126,125,21],[21,126,125],[125,21,126], [255,116,116],[116,255,116],[116,116,255],[228,227,0],[28,255,27],[255,27,28],[0,228,227], [227,0,228],[27,28,255],[59,59,59],[234,195,176],[175,196,255],[171,194,68],[194,68,171], [68,171,194],[72,184,71],[184,71,72],[71,72,184],[169,255,188],[252,179,63],[63,252,179], [179,63,252],[80,9,0],[0,80,9],[9,0,80],[255,175,250],[199,134,213],[115,100,95],[188,163,0], [0,188,163],[163,0,188],[203,73,0],[0,203,73],[73,0,203],[94,189,0],[189,0,94]] colors = dict(zip(range(len(random_colors)),random_colors)) else: # read from the .colors file colors = {0:[0,0,0]} # background is black for line in cf: if line[0:6]=='color ': entries = map(int,line[6:].replace('=',' ').replace('\n',' ').split()) if len(entries)<4: continue # too few entries, ignore if entries[0]==0: force_background = True background_color = [entries[1],entries[2],entries[3]] else: colors.update({entries[0]:[entries[1],entries[2],entries[3]]}) # (we don't support gradients in .colors) rule_name = input_rulename + '_emulated' # (we use a special suffix to avoid picking up any existing .colors or .icons) # make a rule tree and some icons if n_states <= 16: TriangularTransitionsToRuleTree_SplittingMethod(neighborhood,n_states,transitions_list,rule_name) pixels = MakeTriangularIcons_SplittingMethod(n_states,colors,force_background,rule_name) total_states = n_states * n_states elif neighborhood=='triangularVonNeumann' and n_states <= 128: TriangularTransitionsToRuleTree_CheckerboardMethod(neighborhood,n_states,transitions_list,rule_name) pixels = MakeTriangularIcons_CheckerboardMethod(n_states,colors,force_background,rule_name) total_states = n_states * 2 - 1 else: golly.warn('Only support triangularMoore with 16 states or fewer, and triangularVonNeumann\n'+\ 'with 128 states or fewer.') golly.exit() if n_states==2: # the icons we wrote are monochrome, so we need a .colors file to avoid # them all having different colors or similar from Golly's preferences c = open(golly.getdir('rules')+rule_name+".colors",'w') if force_background: c.write('color = 0 '+' '.join(map(str,background_color))+'\n') for i in range(1,total_states): c.write('color = '+str(i)+' '+' '.join(map(str,colors[1]))+'\n') c.flush() c.close() # use rule_name.tree and rule_name.colors and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) return rule_name golly-3.3-src/Scripts/Python/glife/EmulateMargolus.py0000644000175000017500000001671312112261643017677 00000000000000# We emulate Margolus and related partitioning neighborhoods by making a 2-layer CA, with a # background layer (0,1) that alternates a sort-of-checker pattern, and the normal states on top. # # For the Margolus neighborhood there is only one 'phase'; one background pattern, that alternates # between top-left and bottom-right of a 2x2 region. # # For the square4_* neighborhoods we need two phases since the background shifts in different # directions to make a figure-8 or cyclic pattern. # # By looking at the nearby background states, each cell can work out where in the partition it is # and what the current phase is. It can therefore update the cell states layer correctly, and also # update the background layer for the next phase. import golly import os from glife.RuleTree import * # state s (0,N-1) on background state b (0,1) becomes 1+b+2s with 0 = off-grid def encode(s,b): # (s is a list) return [ 1+b+2*se for se in s ] # The BackgroundInputs array tells us where we are in the block: # # Phase 1: 0 1 (the lone 0 is the top-left of the block to be updated) # 1 1 # # Phase 2: 1 0 (the lone 1 is the top-left of the block to be updated) # 0 0 # # (imagine the blocks stacked together to see why this gives the values below) # BackgroundInputs = [ # each C,S,E,W,N,SE,SW,NE,NW [0,1,1,1,1,1,1,1,1], # this pattern of background states means that this is top-left, phase 1 [1,1,0,0,1,1,1,1,1], # top-right, phase 1 [1,0,1,1,0,1,1,1,1], # bottom-left, phase 1 [1,1,1,1,1,0,0,0,0], # bottom-right, phase 1 [1,0,0,0,0,0,0,0,0], # top-left, phase 2 [0,0,1,1,0,0,0,0,0], # top-right, phase 2 [0,1,0,0,1,0,0,0,0], # bottom-left, phase 2 [0,0,0,0,0,1,1,1,1], # bottom-right, phase 2 ] # The BackgroundOutputs array tells us how the background pattern changes: # # Margolus: 0 1 become 1 1 (block moves diagonally) # 1 1 1 0 # # square4_figure8v: 0 1 becomes 0 0 (block moves diagonally) # 1 1 0 1 # # 1 0 becomes 1 0 (block moves horizontally) # 0 0 1 1 # # square4_figure8h: 0 1 becomes 0 0 (block moves diagonally) # 1 1 0 1 # # 1 0 becomes 1 1 (block moves vertically) # 0 0 0 1 # # square4_cyclic : 0 1 becomes 0 0 (block moves vertically) # 1 1 1 0 # # 1 0 becomes 1 0 (block moves horizontally) # 0 0 1 1 # # (Following Tim Tyler: http://www.cell-auto.com/neighbourhood/square4/index.html) # BackgroundOutputs = { # (top-left, top-right, bottom-left, bottom-right)*2 (or *1 for Margolus) "Margolus": [1,1,1,0], # phase 1 -> phase 1 "square4_figure8v":[0,0,0,1,1,0,1,1], # phase 1 <--> phase 2 "square4_figure8h":[0,0,0,1,1,1,0,1], # phase 1 <--> phase 2 "square4_cyclic": [0,0,1,0,1,0,1,1], # phase 1 <--> phase 2 } # The ForegroundInputs array tells us, for each of the 4 positions (0=top-left, 1=top-right, # 2=bottom-left, 3=bottom-right), where the other positions are found in our Moore neighborhood # e.g. if we're 0 (top-left) then the first row tells us that to our South is position 2 (bottom-left) # and to our South-East is position 3 (bottom-right). # (N.B. these values don't depend on the phase or the background pattern) ForegroundInputs = [ [0,2,1,-1,-1,3,-1,-1,-1], # what surrounds this entry? [1,3,-1,0,-1,-1,2,-1,-1], # (C,S,E,W,N,SE,SW,NE,NW) [2,-1,3,-1,0,-1,-1,1,-1], # (-1 = anything) [3,-1,-1,2,1,-1,-1,-1,0] # (0,1,2,3 = index of Margolus input) ] def EmulateMargolus(neighborhood,n_states,transitions,input_filename): '''Emulate a Margolus or square4_* neighborhood rule table with a Moore neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] total_states = 1+2*n_states tree = RuleTree(total_states,8) # now work through the transitions for tr in transitions: for iOutput,background_output in enumerate(BackgroundOutputs[neighborhood]): bg_inputs = BackgroundInputs[iOutput] iEntry = iOutput % 4 # (0=top-left, 1=top-right, 2=bottom-left, 3=bottom-right) rule_inputs = [] for i in range(9): if ForegroundInputs[iEntry][i]==-1: rule_inputs.append(encode( range(n_states), bg_inputs[i] ) + [0]) # wildcard else: rule_inputs.append(encode( tr[ForegroundInputs[iEntry][i]], bg_inputs[i] )) tree.add_rule( rule_inputs, encode( tr[iEntry+4], background_output )[0] ) # supply default behaviour: background still changes even if the state doesn't for iState in range(n_states): for iOutput,background_output in enumerate(BackgroundOutputs[neighborhood]): bg_inputs = BackgroundInputs[iOutput] tree.add_rule( [ encode( [iState], bg_inputs[0] ) ] + [ encode( range(n_states), bg_inputs[i] )+[0] for i in range(1,9) ], # wildcard encode( [iState], background_output )[0] ) # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') # also save a .colors file golly.show("Generating colors...") # read rule_name+'.colors' file if it exists cfn = os.path.split(input_filename)[0] + '/' + os.path.splitext(os.path.split(input_filename)[1])[0] + ".colors" try: cf = open(cfn,'r') except IOError: # use Golly's default random colours random_colors=[[90,90,90],[0,255,127],[127,0,255],[148,148,148],[128,255,0],[255,0,128],[0,128,255],[1,159,0], [159,0,1],[255,254,96],[0,1,159],[96,255,254],[254,96,255],[126,125,21],[21,126,125],[125,21,126], [255,116,116],[116,255,116],[116,116,255],[228,227,0],[28,255,27],[255,27,28],[0,228,227], [227,0,228],[27,28,255],[59,59,59],[234,195,176],[175,196,255],[171,194,68],[194,68,171], [68,171,194],[72,184,71],[184,71,72],[71,72,184],[169,255,188],[252,179,63],[63,252,179], [179,63,252],[80,9,0],[0,80,9],[9,0,80],[255,175,250],[199,134,213],[115,100,95],[188,163,0], [0,188,163],[163,0,188],[203,73,0],[0,203,73],[73,0,203],[94,189,0],[189,0,94]] colors = dict(zip(range(len(random_colors)),random_colors)) else: # read from the .colors file colors = {} for line in cf: if line[0:5]=='color': entries = map(int,line[5:].replace('=',' ').replace('\n',' ').split()) if len(entries)<4: continue # too few entries, ignore colors.update({entries[0]:[entries[1],entries[2],entries[3]]}) # (TODO: support gradients in .colors) # provide a deep blue background if none provided if not 0 in colors: colors.update({0:[0,0,120]}) c = open(golly.getdir('rules')+rule_name+".colors",'w') for col in colors.items()[:n_states]: c.write('color='+str(col[0]*2+1)+' '+' '.join(map(str,col[1]))+'\n') c.write('color='+str(col[0]*2+2)+' '+' '.join([ str(int(x*0.7)) for x in col[1] ])+'\n') # (darken slightly) c.flush() c.close() # use rule_name.tree and rule_name.colors to create rule_name.rule (no icon info) ConvertTreeToRule(rule_name, total_states, []) return rule_name golly-3.3-src/Scripts/Python/glife/ReadRuleTable.py0000644000175000017500000002532412026730263017245 00000000000000try: set except NameError: # use sets module if Python version is < 2.4 from sets import Set as set import golly # generate permutations where the input list may have duplicates # e.g. [1,2,1] -> [[1, 2, 1], [1, 1, 2], [2, 1, 1]] # (itertools.permutations would yield 6 and removing duplicates afterwards is less efficient) # http://code.activestate.com/recipes/496819/ (PSF license) def permu2(xs): if len(xs)<2: yield xs else: h = [] for x in xs: h.append(x) if x in h[:-1]: continue ts = xs[:]; ts.remove(x) for ps in permu2(ts): yield [x]+ps # With some neighborhoods we permute after building each transition, to avoid # creating lots of copies of the same rule. The others are permuted explicitly # because we haven't worked out how to permute the Margolus neighborhood while # allowing for duplicates. PermuteLater = ['vonNeumann','Moore','hexagonal','triangularVonNeumann', 'triangularMoore','oneDimensional'] SupportedSymmetries = { "vonNeumann": { 'none':[[0,1,2,3,4,5]], 'rotate4':[[0,1,2,3,4,5],[0,2,3,4,1,5],[0,3,4,1,2,5],[0,4,1,2,3,5]], 'rotate4reflect':[[0,1,2,3,4,5],[0,2,3,4,1,5],[0,3,4,1,2,5],[0,4,1,2,3,5], [0,4,3,2,1,5],[0,3,2,1,4,5],[0,2,1,4,3,5],[0,1,4,3,2,5]], 'reflect_horizontal':[[0,1,2,3,4,5],[0,1,4,3,2,5]], 'permute':[[0,1,2,3,4,5]], # (gets done later) }, "Moore": { 'none':[[0,1,2,3,4,5,6,7,8,9]], 'rotate4':[[0,1,2,3,4,5,6,7,8,9],[0,3,4,5,6,7,8,1,2,9],[0,5,6,7,8,1,2,3,4,9],[0,7,8,1,2,3,4,5,6,9]], 'rotate8':[[0,1,2,3,4,5,6,7,8,9],[0,2,3,4,5,6,7,8,1,9],[0,3,4,5,6,7,8,1,2,9],[0,4,5,6,7,8,1,2,3,9],\ [0,5,6,7,8,1,2,3,4,9],[0,6,7,8,1,2,3,4,5,9],[0,7,8,1,2,3,4,5,6,9],[0,8,1,2,3,4,5,6,7,9]], 'rotate4reflect':[[0,1,2,3,4,5,6,7,8,9],[0,3,4,5,6,7,8,1,2,9],[0,5,6,7,8,1,2,3,4,9],[0,7,8,1,2,3,4,5,6,9],\ [0,1,8,7,6,5,4,3,2,9],[0,7,6,5,4,3,2,1,8,9],[0,5,4,3,2,1,8,7,6,9],[0,3,2,1,8,7,6,5,4,9]], 'rotate8reflect':[[0,1,2,3,4,5,6,7,8,9],[0,2,3,4,5,6,7,8,1,9],[0,3,4,5,6,7,8,1,2,9],[0,4,5,6,7,8,1,2,3,9],\ [0,5,6,7,8,1,2,3,4,9],[0,6,7,8,1,2,3,4,5,9],[0,7,8,1,2,3,4,5,6,9],[0,8,1,2,3,4,5,6,7,9],\ [0,8,7,6,5,4,3,2,1,9],[0,7,6,5,4,3,2,1,8,9],[0,6,5,4,3,2,1,8,7,9],[0,5,4,3,2,1,8,7,6,9],\ [0,4,3,2,1,8,7,6,5,9],[0,3,2,1,8,7,6,5,4,9],[0,2,1,8,7,6,5,4,3,9],[0,1,8,7,6,5,4,3,2,9]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7,8,9],[0,1,8,7,6,5,4,3,2,9]], 'permute':[[0,1,2,3,4,5,6,7,8,9]] # (gets done later) }, "Margolus": { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_figure8v": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_figure8h": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_cyclic": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "triangularVonNeumann": { 'none':[[0,1,2,3,4]], 'rotate':[[0,1,2,3,4],[0,3,1,2,4],[0,2,3,1,4]], 'rotate_reflect':[[0,1,2,3,4],[0,3,1,2,4],[0,2,3,1,4],[0,3,2,1,4],[0,1,3,2,4],[0,2,1,3,4]], 'permute':[[0,1,2,3,4]] # (gets done later) }, "triangularMoore": { 'none':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13]], 'rotate':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13], [0,2,3,1,7,8,9,10,11,12,4,5,6,13], [0,3,1,2,10,11,12,4,5,6,7,8,9,13]], 'rotate_reflect':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13], [0,2,3,1,7,8,9,10,11,12,4,5,6,13], [0,3,1,2,10,11,12,4,5,6,7,8,9,13], [0,3,2,1,9,8,7,6,5,4,12,11,10,13], [0,2,1,3,6,5,4,12,11,10,9,8,7,13], [0,1,3,2,12,11,10,9,8,7,6,5,4,13]], 'permute':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13]], # (gets done later) }, "oneDimensional": { 'none':[[0,1,2,3]], 'reflect':[[0,1,2,3],[0,2,1,3]], 'permute':[[0,1,2,3]], # (gets done later) }, "hexagonal": { 'none':[[0,1,2,3,4,5,6,7]], 'rotate2':[[0,1,2,3,4,5,6,7],[0,4,5,6,1,2,3,7]], 'rotate3':[[0,1,2,3,4,5,6,7],[0,3,4,5,6,1,2,7],[0,5,6,1,2,3,4,7]], 'rotate6':[[0,1,2,3,4,5,6,7],[0,2,3,4,5,6,1,7],[0,3,4,5,6,1,2,7], [0,4,5,6,1,2,3,7],[0,5,6,1,2,3,4,7],[0,6,1,2,3,4,5,7]], 'rotate6reflect':[[0,1,2,3,4,5,6,7],[0,2,3,4,5,6,1,7],[0,3,4,5,6,1,2,7], [0,4,5,6,1,2,3,7],[0,5,6,1,2,3,4,7],[0,6,1,2,3,4,5,7], [0,6,5,4,3,2,1,7],[0,5,4,3,2,1,6,7],[0,4,3,2,1,6,5,7], [0,3,2,1,6,5,4,7],[0,2,1,6,5,4,3,7],[0,1,6,5,4,3,2,7]], 'permute':[[0,1,2,3,4,5,6,7]], # (gets done later) }, } def ReadRuleTable(filename): ''' Return n_states, neighborhood, transitions e.g. 2, "vonNeumann", [[0],[0,1],[0],[0],[1],[1]] Transitions are expanded for symmetries and bound variables. ''' f=open(filename,'r') vars={} symmetry_string = '' symmetry = [] n_states = 0 neighborhood = '' transitions = [] numParams = 0 for line in f: if line[0]=='#' or line.strip()=='': pass elif line[0:9]=='n_states:': n_states = int(line[9:]) if n_states<0 or n_states>256: golly.warn('n_states out of range: '+n_states) golly.exit() elif line[0:13]=='neighborhood:': neighborhood = line[13:].strip() if not neighborhood in SupportedSymmetries: golly.warn('Unknown neighborhood: '+neighborhood) golly.exit() numParams = len(SupportedSymmetries[neighborhood].items()[0][1][0]) elif line[0:11]=='symmetries:': symmetry_string = line[11:].strip() if not symmetry_string in SupportedSymmetries[neighborhood]: golly.warn('Unknown symmetry: '+symmetry_string) golly.exit() symmetry = SupportedSymmetries[neighborhood][symmetry_string] elif line[0:4]=='var ': line = line[4:] # strip var keyword if '#' in line: line = line[:line.find('#')] # strip any trailing comment # read each variable into a dictionary mapping string to list of ints entries = line.replace('=',' ').replace('{',' ').replace(',',' ').\ replace(':',' ').replace('}',' ').replace('\n','').split() vars[entries[0]] = [] for e in entries[1:]: if e in vars: vars[entries[0]] += vars[e] # vars allowed in later vars else: vars[entries[0]].append(int(e)) else: # assume line is a transition if '#' in line: line = line[:line.find('#')] # strip any trailing comment if ',' in line: entries = line.replace('\n','').replace(',',' ').replace(':',' ').split() else: entries = list(line.strip()) # special no-comma format if not len(entries)==numParams: golly.warn('Wrong number of entries on line: '+line+' (expected '+str(numParams)+')') golly.exit() # retrieve the variables that repeat within the transition, these are 'bound' bound_vars = [ e for e in set(entries) if entries.count(e)>1 and e in vars ] # iterate through all the possible values of each bound variable var_val_indices = dict(zip(bound_vars,[0]*len(bound_vars))) while True: ### AKT: this code causes syntax error in Python 2.3: ### transition = [ [vars[e][var_val_indices[e]]] if e in bound_vars \ ### else vars[e] if e in vars \ ### else [int(e)] \ ### for e in entries ] transition = [] for e in entries: if e in bound_vars: transition.append([vars[e][var_val_indices[e]]]) elif e in vars: transition.append(vars[e]) else: transition.append([int(e)]) if symmetry_string=='permute' and neighborhood in PermuteLater: # permute all but C,C' (first and last entries) for permuted_section in permu2(transition[1:-1]): permuted_transition = [transition[0]]+permuted_section+[transition[-1]] if not permuted_transition in transitions: transitions.append(permuted_transition) else: # expand for symmetry using the explicit list for s in symmetry: tran = [transition[i] for i in s] if not tran in transitions: transitions.append(tran) # increment the variable values (or break out if done) var_val_to_change = 0 while var_val_to_change= len(bound_vars): break f.close() return n_states, neighborhood, transitions golly-3.3-src/Scripts/Python/glife/base.py0000644000175000017500000001041712026730263015501 00000000000000from glife import * block = pattern (""" ** ** """) blinker = pattern ("***", -1, 0) glider = pattern (""" .** **. ..* """) lwss = pattern (""" ****. *...* *.... .*..* """) mwss = pattern (""" *****. *....* *..... .*...* ...*.. """) hwss = pattern (""" ******. *.....* *...... .*....* ...**.. """) eater = hook = pattern (""" ** * .*** ...* """) queenbee = pattern (""" **.. ..*. ...* ...* ...* ..*. **.. """) herschel = pattern (""" ***. .*.. .*** """) bheptomino = pattern (""" **. .** **. *.. """) tub = pattern (""" .*. *.* .*. """, -1, -1) boat = pattern (""" **. *.* .*. """) long_boat = pattern (""" **. *.* .*.* ..* """) ship = pattern (""" **. *.* .** """, -1, -1) beehive = pattern (""" .**. *..* .**. """, 0, -1) loaf = pattern (""" .**. *..* *.*. .*.. """) snake = pattern (""" *.** **.* """) aircraft_carrier = pattern (""" **.. *..* ..** """) honeyfarm = pattern (""" ......*...... .....*.*..... .....*.*..... ......*...... ............. .**.......**. *..*.....*..* .**.......**. ............. ......*...... .....*.*..... .....*.*..... ......*...... """, -6, -6) beacon = pattern (""" **.. *... ...* ..** """) blocker = pattern (""" ......*.*. .....*.... **..*....* **.*..*.** ....**.... """) clock = pattern (""" ..*. **.. ..** .*.. """) dart = pattern (""" ........*. .......*.* ......**.. .........* .....*...* ..*..*.... .*.*..**** *..*...... .*.*..**** ..*..*.... .....*...* .........* ......**.. .......*.* ........*. """, 0, -7) big_beacon = pattern (""" ***... ***... ***... ...*** ...*** ...*** """) middleweight_volcano = pattern (""" ...*******... .***.***.***. *....***....* .****.*.***.* ...........*. *.**.*.*.*... **.*.*.*.**.. ....*..*.*... .....**..*... .........**.. """, -6, 0) heavyweight_volcano = pattern (""" .........*.......................... ........*.*......................... ......***.*......................... .....*....**.*...................... .....*.**...**......**.............. ....**.*.**.........*.*............. .........*.*****......*..*.**....... ..*.**.**.*.....*....**.*.**.*...... .....**.....****........*....*...... *...*.*..*...*.*....**.*.****.**.... *...*.*..**.*.**.**....*.*....*.*... .....**...***.**.*.***.*..***...*... ..*.**.**.**.............*.*..*.*.** ...........*......*.*.*.*..**.*.*.*. ....**.*.*.**......**.*.*.*...*.*.*. .....*.**.*..*.......*.**..****.**.. .....*....*.*........*...**......... ....**....**........**...*..*....... ...........................**....... """) galaxy = pattern (""" ******.** ******.** .......** **.....** **.....** **.....** **....... **.****** **.****** """, -4, -4) orion = pattern (""" ...**......... ...*.*........ ...*.......... **.*.......... *....*........ *.**......***. .....***....** ......***.*.*. .............* ......*.*..... .....**.*..... ......*....... ....**.*...... .......*...... .....**....... """) pentadecathlon = pattern (""" ..*....*.. **.****.** ..*....*.. """, 0, -1) pi = pattern (""" *** *.* *.* """) pond = pattern (""" .**. *..* *..* .**. """) pulsar = pattern (""" ..***...***.. ............. *....*.*....* *....*.*....* *....*.*....* ..***...***.. ............. ..***...***.. *....*.*....* *....*.*....* *....*.*....* ............. ..***...***.. """, -6, -6) rpentomino = pattern (""" .** ** .* """) rabbits = pattern (""" *...*** ***..*. .*..... """) spider = pattern (""" .........*.......*......... ...**.*.*.**...**.*.*.**... ***.*.***.........***.*.*** *...*.*.....*.*.....*.*...* ....**......*.*......**.... .**.........*.*.........**. .**.**...............**.**. .....*...............*..... """, -13, 0) lightweight_volcano = pattern (""" ...**..**... .***.**.***. *..........* .****..****. ....*..*.... .**......**. .*..*..*..*. ..***..***.. ............ ****.**.**** *..**..**..* """) unix = pattern (""" ..**.... ....*.** *..*..** *.*..... .*...... ........ .**..... .**..... """) biblocker = pattern (""" ..................*........... .................*.**......... .................*.**......... ..................**.......... .............................. .......**............**....... .......**............**....... .............................. .............................. ......*.*..................... .....*..................**.... **..*....*..........**.*..*.** **.*..*.**..........**..*....* ....**...................*.... ..........................*.*. """) golly-3.3-src/Scripts/Python/glife/__init__.py0000644000175000017500000002045512026730263016331 00000000000000# Initialization script executed by using "import glife". # Based on python/life/__init__.py in Eugene Langvagen's PLife. import golly import sys import time __doc__ = """High-level scripting aids for Golly."""; # -------------------------------------------------------------------- class rect(list): """A simple class to make it easier to manipulate rectangles.""" def visible(self): """Return true if rect is completely visible in viewport.""" return golly.visrect( [self.x, self.y, self.wd, self.ht] ) def __init__(self, R = []): if len(R) == 0: self.empty = True elif len(R) == 4: self.empty = False self.x = self.left = R[0] self.y = self.top = R[1] self.wd = self.width = R[2] self.ht = self.height = R[3] if self.wd <= 0: raise ValueError("rect width must be > 0") if self.ht <= 0: raise ValueError("rect height must be > 0") self.right = self.left + self.wd - 1 self.bottom = self.top + self.ht - 1 else: raise TypeError("rect arg must be [] or [x,y,wd,ht]") list.__init__(self, R) # -------------------------------------------------------------------- # Define some useful synonyms: # for golly.clear and golly.advance inside = 0 outside = 1 # for golly.flip left_right = 0 top_bottom = 1 up_down = 1 # for golly.rotate clockwise = 0 anticlockwise = 1 # for golly.setcursor (must match strings in Cursor Mode submenu) draw = "Draw" pick = "Pick" select = "Select" move = "Move" zoomin = "Zoom In" zoomout = "Zoom Out" # -------------------------------------------------------------------- # Define some transformation matrices: identity = ( 1, 0, 0, 1) flip = (-1, 0, 0, -1) flip_x = (-1, 0, 0, 1) flip_y = ( 1, 0, 0, -1) swap_xy = ( 0, 1, 1, 0) swap_xy_flip = ( 0, -1, -1, 0) # Rotation: rcw = ( 0, -1, 1, 0) rccw = ( 0, 1, -1, 0) # -------------------------------------------------------------------- def rule(s = "B3/S23"): """\ Set the rule for the Game of Life. Although it affects subsequent calls to pattern.evolve(), only the last call to this function matters for the viewer.""" golly.setrule(s) # -------------------------------------------------------------------- def description(s): """Supply a textual description to the whole pattern.""" for line in s.split("\n"): print "#D", line # -------------------------------------------------------------------- def compose(S, T): """\ Return the composition of two transformations S and T. A transformation is a tuple of the form (x, y, A), which denotes multiplying by matrix A and then translating by vector (x, y). These tuples can be passed to pattern.__call__().""" x = S[0]; y = S[1]; A = S[2] s = T[0]; t = T[1]; B = T[2] return (x * B[0] + y * B[1] + s, x * B[2] + y * B[3] + t, (A[0] * B[0] + A[2] * B[1], A[1] * B[0] + A[3] * B[1], A[0] * B[2] + A[2] * B[3], A[1] * B[2] + A[3] * B[3])) # -------------------------------------------------------------------- class pattern(list): """This class represents a cell list.""" def __add__(self, q): """Join patterns.""" return pattern(golly.join(self, q)) def __getitem__(self, N): """\ The __getitem__() function is an alias to evolve(). It allows to access the pattern's phases as elements of an array.""" return self.evolve(N) def __call__(self, x, y, A = identity): """The same as 'apply(A).translate(x, y)'.""" return pattern(golly.transform(self, x, y, *A)) def translate(self, x, y): """Translate the pattern.""" return self(x, y) def apply(self, A): """\ Apply a matrix transformation to the pattern. Predefined matrices are: identity, flip, flip_x, flip_y, swap_xy, swap_xy_flip, rcw (rotate clockwise) and rccw (rotate counter-clockwise).""" return self(0, 0, A) def put(self, x = 0, y = 0, A = identity): """Paste pattern into current universe.""" golly.putcells(self, x, y, *A) def display(self, title = "untitled", x = 0, y = 0, A = identity): """Paste pattern into new universe and display it all.""" golly.new(title) golly.putcells(self, x, y, *A) golly.fit() golly.setcursor(zoomin) def save(self, fn, desc = None): """\ Save the pattern to file 'fn' in RLE format. An optional description 'desc' may be given.""" golly.store(self, fn, desc) def evolve(self, N): """\ Return N-th generation of the pattern. Once computed, the N-th generation is remembered and quickly accessible. It is also the base for computing generations subsequent to N-th.""" if N < 0: raise ValueError("backward evolving requested") if self.__phases.has_key(N): return self.__phases[N] M = 0 for k in self.__phases.keys(): if M < k < N: M = k p = self.__phases[N] = pattern(golly.evolve(self.__phases[M], N - M)) return p def __init__(self, P = [], x0 = 0, y0 = 0, A = identity): """\ Initialize a pattern from argument P. P may be another pattern, a cell list, or a multi-line string. A cell list should look like [x1, y1, x2, y2, ...]; a string may be in one of the two autodetected formats: 'visual' or 'RLE'. o 'visual' format means that the pattern is represented in a visual way using symbols '*' (on cell), '.' (off cell) and '\\n' (newline), just like in Life 1.05 format. (Note that an empty line should contain at least one dot). o 'RLE' format means that a string is Run-Length Encoded. The format uses 'o' for on-cells, 'b' for off-cells and '$' for newlines. Moreover, any of these symbols may be prefixed by a number, to denote that symbol repeated that number of times. When P is a string, an optional transformation (x0, y0, A) may be specified. """ self.__phases = dict() if type(P) == list: list.__init__(self, P) elif type(P) == pattern: list.__init__(self, list(P)) elif type(P) == str: list.__init__(self, golly.parse(P, x0, y0, *A)) else: raise TypeError("list or string is required here") self.__phases[0] = self # -------------------------------------------------------------------- def load(fn): # note that top left cell of bounding box will be at 0,0 return pattern(golly.load(fn)) # -------------------------------------------------------------------- def getminbox(patt): # return a rect which is the minimal bounding box of given pattern; # note that if the pattern is a multi-state list then any dead cells # are included in the bounding box minx = sys.maxint maxx = -sys.maxint miny = sys.maxint maxy = -sys.maxint clist = list(patt) clen = len(clist) inc = 2 if clen & 1 == 1: # multi-state list (3 ints per cell) inc = 3 # ignore padding int if it is present if clen % 3 == 1: clen -= 1 for x in xrange(0, clen, inc): if clist[x] < minx: minx = clist[x] if clist[x] > maxx: maxx = clist[x] for y in xrange(1, clen, inc): if clist[y] < miny: miny = clist[y] if clist[y] > maxy: maxy = clist[y] return rect( [ minx, miny, maxx - minx + 1, maxy - miny + 1 ] ) # -------------------------------------------------------------------- def validint(s): # return True if given string represents a valid integer if len(s) == 0: return False s = s.replace(",","") if s[0] == '+' or s[0] == '-': s = s[1:] return s.isdigit() # -------------------------------------------------------------------- def getposint(): # return current viewport position as integer coords x, y = golly.getpos() return int(x), int(y) # -------------------------------------------------------------------- def setposint(x,y): # convert integer coords to strings and set viewport position golly.setpos(str(x), str(y)) # -------------------------------------------------------------------- def getstring(prompt): # this routine is deprecated golly.warn("Change the script to use the getstring() command\n"+ "from golly rather than from glife.") golly.exit("") golly-3.3-src/Scripts/Python/glife/WriteBMP.py0000644000175000017500000000603612026730263016222 00000000000000# Just to save the user having to install PIL. # BMP code from: http://pseentertainmentcorp.com/smf/index.php?topic=2034.0 # Distributed with kind permission from James Main import struct def WriteBMP(pixels,filename): ''' Write a BMP to filename from the (r,g,b) triples in pixels[row][column]. Usage example: WriteBMP( [[(255,0,0),(0,255,0),(255,255,0)],[(0,0,255),(0,0,0),(0,255,255)]], "test.bmp" ) ''' # Here is a minimal dictionary with header values. d = { 'mn1':66, 'mn2':77, 'filesize':0, 'undef1':0, 'undef2':0, 'offset':54, 'headerlength':40, 'width':len(pixels[0]), 'height':len(pixels), 'colorplanes':1, 'colordepth':24, 'compression':0, 'imagesize':0, 'res_hor':0, 'res_vert':0, 'palette':0, 'importantcolors':0 } # Build the byte array. This code takes the height # and width values from the dictionary above and # generates the pixels row by row. The row_mod and padding # stuff is necessary to ensure that the byte count for each # row is divisible by 4. This is part of the specification. bytes = '' for row in range(d['height']-1,-1,-1): # (BMPs are encoded left-to-right from the bottom-left) for column in range(d['width']): r,g,b = pixels[row][column] pixel = struct.pack('s 47golly-3.3-src/Scripts/Python/glife/gun46.py0000644000175000017500000000046012026730263015527 00000000000000from glife.base import * rule() # use Life rule to evolve phases __half = bheptomino (0, 2, flip_x) + bheptomino (0, -2, flip) + block (16, -4) + block (16, 3) gun46_double = __half (7, -2) + __half (-8, 2, flip_x) gun46 = __half[1] (1, -7) + __half (-13, -4, flip_x) # aligned version shooting SE golly-3.3-src/Scripts/Python/glife/gun256.py0000644000175000017500000000042112026730263015607 00000000000000from glife.herschel import * __c64 = hc64 (9, 0) __stub = eater (4, -16, rccw) gun256_full = herschel (9, 0) + __c64 + __c64.apply (rcw) + __c64.apply (flip) + __c64.apply (rccw) gun256 = (gun256_full + __stub + __stub.apply (rccw) + __stub.apply (flip)) (-25, -12) golly-3.3-src/Scripts/Python/glife/gun30.py0000644000175000017500000000065112026730263015522 00000000000000from glife.base import * rule() # use Life rule to evolve phases __gun30 = queenbee + block (12, 2) + (queenbee[5] + block (12, 2)) (-9, 2, flip_x) __gun30_asym = queenbee + eater (10, 1, rccw) + (queenbee[5] + block (12, 2)) (-9, 2, flip_x) gun30 = __gun30 (1, -7) # aligned gun shooting SE gun30_a = __gun30_asym (1, -7) # aligned gun shooting SE gun60 = gun30 + gun30_a[26] (-4, 11, flip_y) golly-3.3-src/Scripts/Python/glife/text.py0000644000175000017500000001751412651666400015565 00000000000000from glife import * from string import lower # each symbol is a pattern with an additional field .width # Eric Angelini integer font __eafont = dict () __eafont['0'] = pattern ("3o$obo$obo$obo$3o!", 0, -5) __eafont['0'].width = 4 __eafont['1'] = pattern ("o$o$o$o$o!", 0, -5) __eafont['1'].width = 2 __eafont['2'] = pattern ("3o$2bo$3o$o$3o!", 0, -5) __eafont['2'].width = 4 __eafont['3'] = pattern ("3o$2bo$3o$2bo$3o!", 0, -5) __eafont['3'].width = 4 __eafont['4'] = pattern ("obo$obo$3o$2bo$2bo!", 0, -5) __eafont['4'].width = 4 __eafont['5'] = pattern ("3o$o$3o$2bo$3o!", 0, -5) __eafont['5'].width = 4 __eafont['6'] = pattern ("3o$o$3o$obo$3o!", 0, -5) __eafont['6'].width = 4 __eafont['7'] = pattern ("3o$2bo$2bo$2bo$2bo!", 0, -5) __eafont['7'].width = 4 __eafont['8'] = pattern ("3o$obo$3o$obo$3o!", 0, -5) __eafont['8'].width = 4 __eafont['9'] = pattern ("3o$obo$3o$2bo$3o!", 0, -5) __eafont['9'].width = 4 __eafont[' '] = pattern ("", 0, 0) __eafont[' '].width=2 # allow spaces to mark unknown characters __eafont['-'] = pattern ("", 0, 0) __eafont['-'].width=0 # # Mono-spaced ASCII font __mfont = dict() __mfont[' '] = pattern("") __mfont['!'] = pattern("2bo$2bo$2bo$2bo$2bo2$2bo!") __mfont['"'] = pattern("bobo$bobo$bobo!") __mfont['#'] = pattern("bobo$bobo$5o$bobo$5o$bobo$bobo!") __mfont['$'] = pattern("b3o$obobo$obo$b3o$2bobo$obobo$b3o!") __mfont['%'] = pattern("2o2bo$2o2bo$3bo$2bo$bo$o2b2o$o2b2o!") __mfont['&'] = pattern("b2o$o2bo$o2bo$b2o$o2bo$o2bo$b2obo!") __mfont['\''] = pattern("2bo$2bo$2bo!") __mfont['('] = pattern("3bo$2bo$2bo$2bo$2bo$2bo$3bo!") __mfont[')'] = pattern("bo$2bo$2bo$2bo$2bo$2bo$bo!") __mfont['*'] = pattern("$obobo$b3o$5o$b3o$obobo!") __mfont['+'] = pattern("$2bo$2bo$5o$2bo$2bo!") __mfont[','] = pattern("6$2bo$2bo$bo!") __mfont['-'] = pattern("3$5o!") __mfont['.'] = pattern("6$2bo!") __mfont['/'] = pattern("3bo$3bo$2bo$2bo$2bo$bo$bo!") __mfont['0'] = pattern("b3o$o3bo$o2b2o$obobo$2o2bo$o3bo$b3o!") __mfont['1'] = pattern("2bo$b2o$2bo$2bo$2bo$2bo$b3o!") __mfont['2'] = pattern("b3o$o3bo$4bo$3bo$2bo$bo$5o!") __mfont['3'] = pattern("b3o$o3bo$4bo$2b2o$4bo$o3bo$b3o!") __mfont['4'] = pattern("3bo$2b2o$bobo$o2bo$5o$3bo$3bo!") __mfont['5'] = pattern("5o$o$o$b3o$4bo$o3bo$b3o!") __mfont['6'] = pattern("b3o$o$o$4o$o3bo$o3bo$b3o!") __mfont['7'] = pattern("5o$4bo$3bo$2bo$bo$o$o!") __mfont['8'] = pattern("b3o$o3bo$o3bo$b3o$o3bo$o3bo$b3o!") __mfont['9'] = pattern("b3o$o3bo$o3bo$b4o$4bo$4bo$b3o!") __mfont[':'] = pattern("2$2bo4$2bo!") __mfont[';'] = pattern("2$2bo4$2bo$2bo$bo!") __mfont['<'] = pattern("$3bo$2bo$bo$2bo$3bo!") __mfont['='] = pattern("2$5o2$5o!") __mfont['>'] = pattern("$bo$2bo$3bo$2bo$bo!") __mfont['?'] = pattern("b3o$o3bo$4bo$2b2o$2bo2$2bo!") __mfont['@'] = pattern("b3o$o3bo$ob3o$obobo$ob2o$o$b3o!") __mfont['A'] = pattern("b3o$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") __mfont['B'] = pattern("4o$o3bo$o3bo$4o$o3bo$o3bo$4o!") __mfont['C'] = pattern("b3o$o3bo$o$o$o$o3bo$b3o!") __mfont['D'] = pattern("4o$o3bo$o3bo$o3bo$o3bo$o3bo$4o!") __mfont['E'] = pattern("5o$o$o$3o$o$o$5o!") __mfont['F'] = pattern("5o$o$o$3o$o$o$o!") __mfont['G'] = pattern("b3o$o3bo$o$o2b2o$o3bo$o3bo$b3o!") __mfont['H'] = pattern("o3bo$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") __mfont['I'] = pattern("b3o$2bo$2bo$2bo$2bo$2bo$b3o!") __mfont['J'] = pattern("2b3o$3bo$3bo$3bo$3bo$o2bo$b2o!") __mfont['K'] = pattern("o3bo$o2bo$obo$2o$obo$o2bo$o3bo!") __mfont['L'] = pattern("o$o$o$o$o$o$5o!") __mfont['M'] = pattern("o3bo$2ob2o$obobo$obobo$o3bo$o3bo$o3bo!") __mfont['N'] = pattern("o3bo$2o2bo$obobo$o2b2o$o3bo$o3bo$o3bo!") __mfont['O'] = pattern("b3o$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") __mfont['P'] = pattern("4o$o3bo$o3bo$4o$o$o$o!") __mfont['Q'] = pattern("b3o$o3bo$o3bo$o3bo$obobo$o2bo$b2obo!") __mfont['R'] = pattern("4o$o3bo$o3bo$4o$o2bo$o3bo$o3bo!") __mfont['S'] = pattern("b3o$o3bo$o$b3o$4bo$o3bo$b3o!") __mfont['T'] = pattern("5o$2bo$2bo$2bo$2bo$2bo$2bo!") __mfont['U'] = pattern("o3bo$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") __mfont['V'] = pattern("o3bo$o3bo$o3bo$o3bo$o3bo$bobo$2bo!") __mfont['W'] = pattern("o3bo$o3bo$o3bo$obobo$obobo$2ob2o$o3bo!") __mfont['X'] = pattern("o3bo$o3bo$bobo$2bo$bobo$o3bo$o3bo!") __mfont['Y'] = pattern("o3bo$o3bo$bobo$2bo$2bo$2bo$2bo!") __mfont['Z'] = pattern("5o$4bo$3bo$2bo$bo$o$5o!") __mfont['['] = pattern("2b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") __mfont['\\'] = pattern("bo$bo$2bo$2bo$2bo$3bo$3bo!") __mfont[']'] = pattern("b2o$2bo$2bo$2bo$2bo$2bo$b2o!") __mfont['^'] = pattern("2bo$bobo$o3bo!") __mfont['_'] = pattern("6$5o!") __mfont['`'] = pattern("o$bo!") __mfont['a'] = pattern("2$b4o$o3bo$o3bo$o3bo$b4o!") __mfont['b'] = pattern("o$o$4o$o3bo$o3bo$o3bo$4o!") __mfont['c'] = pattern("2$b4o$o$o$o$b4o!") __mfont['d'] = pattern("4bo$4bo$b4o$o3bo$o3bo$o3bo$b4o!") __mfont['e'] = pattern("2$b3o$o3bo$5o$o$b4o!") __mfont['f'] = pattern("2b2o$bo2bo$bo$3o$bo$bo$bo!") __mfont['g'] = pattern("2$b3o$o3bo$o3bo$o3bo$b4o$4bo$b3o!") __mfont['h'] = pattern("o$o$ob2o$2o2bo$o3bo$o3bo$o3bo!") __mfont['i'] = pattern("$2bo2$2bo$2bo$2bo$2b2o!") __mfont['j'] = pattern("$3bo2$3bo$3bo$3bo$3bo$o2bo$b2o!") __mfont['k'] = pattern("o$o$o2bo$obo$3o$o2bo$o3bo!") __mfont['l'] = pattern("b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") __mfont['m'] = pattern("2$bobo$obobo$obobo$o3bo$o3bo!") __mfont['n'] = pattern("2$4o$o3bo$o3bo$o3bo$o3bo!") __mfont['o'] = pattern("2$b3o$o3bo$o3bo$o3bo$b3o!") __mfont['p'] = pattern("2$4o$o3bo$o3bo$o3bo$4o$o$o!") __mfont['q'] = pattern("2$b4o$o3bo$o3bo$o3bo$b4o$4bo$4bo!") __mfont['r'] = pattern("2$ob2o$2o2bo$o$o$o!") __mfont['s'] = pattern("2$b4o$o$b3o$4bo$4o!") __mfont['t'] = pattern("$2bo$5o$2bo$2bo$2bo$3b2o!") __mfont['u'] = pattern("2$o3bo$o3bo$o3bo$o3bo$b4o!") __mfont['v'] = pattern("2$o3bo$o3bo$o3bo$bobo$2bo!") __mfont['w'] = pattern("2$o3bo$o3bo$obobo$2ob2o$o3bo!") __mfont['x'] = pattern("2$o3bo$bobo$2bo$bobo$o3bo!") __mfont['y'] = pattern("2$o3bo$o3bo$o3bo$o3bo$b4o$4bo$b3o!") __mfont['z'] = pattern("2$5o$3bo$2bo$bo$5o!") __mfont['{'] = pattern("3bo$2bo$2bo$bo$2bo$2bo$3bo!") __mfont['|'] = pattern("2bo$2bo$2bo$2bo$2bo$2bo$2bo!") __mfont['}'] = pattern("bo$2bo$2bo$3bo$2bo$2bo$bo!") __mfont['~'] = pattern("2$bo$obobo$3bo!") for key in __mfont: __mfont[key].width = 6 # Snakial font (all chars are stable Life patterns) __sfont = dict () __sfont['0'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['0'].width = 10 __sfont['1'] = pattern ("2o$bo$o$2o2$2o$bo$o$2o2$2o$bo$o$2o!", 1, -14) __sfont['1'].width = 6 __sfont['2'] = pattern ("2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o!", 0, -14) __sfont['2'].width = 10 __sfont['3'] = pattern ("2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o!", 0, -14) __sfont['3'].width = 8 __sfont['4'] = pattern ("2o3b2o$2o3b2o2$2o3b2o$obobobo$2bobo$b2obo$5b2o$6bo$5bo$5b2o$6bo$5bo$5b2o!", 0, -14) __sfont['4'].width = 9 __sfont['5'] = pattern ("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) __sfont['5'].width = 10 __sfont['6'] = pattern ("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['6'].width = 10 __sfont['7'] = pattern ("ob2o$2obo$4b2o$5bo$4bo$4b2o$2b2o$3bo$2bo$2b2o$2o$bo$o$2o!", 0, -14) __sfont['7'].width = 8 __sfont['8'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['8'].width = 10 __sfont['9'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) __sfont['9'].width = 10 __sfont['-'] = pattern ("2obo$ob2o!", 0, -8) __sfont['-'].width = 6 def make_text (string, font='Snakial'): p = pattern () x = 0 if lower(font[:2]) == "ea": f = __eafont unknown = '-' elif lower(font) == "mono": f = __mfont unknown = '?' else: f = __sfont unknown = '-' for c in string: if not f.has_key (c): c = unknown symbol = f[c] p += symbol (x, 0) x += symbol.width return p golly-3.3-src/Scripts/Python/glife/BuiltinIcons.py0000644000175000017500000002523512146034627017201 00000000000000# This module defines strings containing XPM data that matches # Golly's built-in icons (see the XPM data in wxalgos.cpp). # The strings are used by icon-importer.py and icon_exporter.py. circles = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 6 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" "F c #E0E0E0" /* icon for state 1 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." ''' diamonds = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." ".........BBBBBBBBBBBBB........." "........BBBBBBBBBBBBBBB........" ".......BBBBBBBBBBBBBBBBB......." "......BBBBBBBBBBBBBBBBBBB......" ".....BBBBBBBBBBBBBBBBBBBBB....." "....BBBBBBBBBBBBBBBBBBBBBBB...." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "..BBBBBBBBBBBBBBBBBBBBBBBBBBB.." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "....BBBBBBBBBBBBBBBBBBBBBBB...." ".....BBBBBBBBBBBBBBBBBBBBB....." "......BBBBBBBBBBBBBBBBBBB......" ".......BBBBBBBBBBBBBBBBB......." "........BBBBBBBBBBBBBBB........" ".........BBBBBBBBBBBBB........." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." ".......B......." "......BBB......" ".....BBBBB....." "....BBBBBBB...." "...BBBBBBBBB..." "..BBBBBBBBBBB.." ".BBBBBBBBBBBBB." "..BBBBBBBBBBB.." "...BBBBBBBBB..." "....BBBBBBB...." ".....BBBBB....." "......BBB......" ".......B......." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "...B..." "..BBB.." ".BBBBB." "BBBBBBB" ".BBBBB." "..BBB.." "...B..." ''' hexagons = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".....BBC......................." "....BBBBBC....................." "...BBBBBBBBC..................." "..BBBBBBBBBBBC................." ".BBBBBBBBBBBBBBC..............." "BBBBBBBBBBBBBBBBBC............." "BBBBBBBBBBBBBBBBBBBC..........." "CBBBBBBBBBBBBBBBBBBBBC........." ".BBBBBBBBBBBBBBBBBBBBBB........" ".CBBBBBBBBBBBBBBBBBBBBBC......." "..BBBBBBBBBBBBBBBBBBBBBB......." "..CBBBBBBBBBBBBBBBBBBBBBC......" "...BBBBBBBBBBBBBBBBBBBBBB......" "...CBBBBBBBBBBBBBBBBBBBBBC....." "....BBBBBBBBBBBBBBBBBBBBBB....." "....CBBBBBBBBBBBBBBBBBBBBBC...." ".....BBBBBBBBBBBBBBBBBBBBBB...." ".....CBBBBBBBBBBBBBBBBBBBBBC..." "......BBBBBBBBBBBBBBBBBBBBBB..." "......CBBBBBBBBBBBBBBBBBBBBBC.." ".......BBBBBBBBBBBBBBBBBBBBBB.." ".......CBBBBBBBBBBBBBBBBBBBBBC." "........BBBBBBBBBBBBBBBBBBBBBB." ".........CBBBBBBBBBBBBBBBBBBBBC" "...........CBBBBBBBBBBBBBBBBBBB" ".............CBBBBBBBBBBBBBBBBB" "...............CBBBBBBBBBBBBBB." ".................CBBBBBBBBBBB.." "...................CBBBBBBBB..." ".....................CBBBBB...." ".......................CBB....." XPM /* width height num_colors chars_per_pixel */ "15 15 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ "...BBC........." "..BBBBBC......." ".BBBBBBBBC....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "CBBBBBBBBBBBC.." ".BBBBBBBBBBBB.." ".CBBBBBBBBBBBC." "..BBBBBBBBBBBB." "..CBBBBBBBBBBBC" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....CBBBBBBBB." ".......CBBBBB.." ".........CBB..." XPM /* width height num_colors chars_per_pixel */ "7 7 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".BBC..." "BBBBB.." "BBBBBB." "CBBBBBC" ".BBBBBB" "..BBBBB" "...CBB." ''' triangles = ''' XPM /* width height num_colors chars_per_pixel */ "31 93 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "B.............................." "BB............................." "BBB............................" "BBBB..........................." "BBBBB.........................." "BBBBBB........................." "BBBBBBB........................" "BBBBBBBB......................." "BBBBBBBBB......................" "BBBBBBBBBB....................." "BBBBBBBBBBB...................." "BBBBBBBBBBBB..................." "BBBBBBBBBBBBB.................." "BBBBBBBBBBBBBB................." "BBBBBBBBBBBBBBB................" "BBBBBBBBBBBBBBBB..............." "BBBBBBBBBBBBBBBBB.............." "BBBBBBBBBBBBBBBBBB............." "BBBBBBBBBBBBBBBBBBB............" "BBBBBBBBBBBBBBBBBBBB..........." "BBBBBBBBBBBBBBBBBBBBB.........." "BBBBBBBBBBBBBBBBBBBBBB........." "BBBBBBBBBBBBBBBBBBBBBBB........" "BBBBBBBBBBBBBBBBBBBBBBBB......." "BBBBBBBBBBBBBBBBBBBBBBBBB......" "BBBBBBBBBBBBBBBBBBBBBBBBBB....." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBBB..." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "..BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "...BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" ".....BBBBBBBBBBBBBBBBBBBBBBBBBB" "......BBBBBBBBBBBBBBBBBBBBBBBBB" ".......BBBBBBBBBBBBBBBBBBBBBBBB" "........BBBBBBBBBBBBBBBBBBBBBBB" ".........BBBBBBBBBBBBBBBBBBBBBB" "..........BBBBBBBBBBBBBBBBBBBBB" "...........BBBBBBBBBBBBBBBBBBBB" "............BBBBBBBBBBBBBBBBBBB" ".............BBBBBBBBBBBBBBBBBB" "..............BBBBBBBBBBBBBBBBB" "...............BBBBBBBBBBBBBBBB" "................BBBBBBBBBBBBBBB" ".................BBBBBBBBBBBBBB" "..................BBBBBBBBBBBBB" "...................BBBBBBBBBBBB" "....................BBBBBBBBBBB" ".....................BBBBBBBBBB" "......................BBBBBBBBB" ".......................BBBBBBBB" "........................BBBBBBB" ".........................BBBBBB" "..........................BBBBB" "...........................BBBB" "............................BBB" ".............................BB" "..............................B" "..............................." /* icon for state 3 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "B.BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BB.BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBB.BBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBB.BBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBB.BBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBB.BBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBB.BBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBB.BBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBB.BBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBB.BBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBB.BBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBB.BBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBB.BBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBB.BBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB.BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBB.BBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBB.BBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBB.BBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBB.BBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBB.BBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBB.BBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBB.BBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBB.BBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBB.BBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBB.BBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBB.BBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBB.BBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBB.BB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.B" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "15 45 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 3 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "7 21 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "B......" "BB....." "BBB...." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 2 */ ".BBBBBB" "..BBBBB" "...BBBB" "....BBB" ".....BB" "......B" "......." /* icon for state 3 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BBB.BBB" "BBBB.BB" "BBBBB.B" "BBBBBB." ''' golly-3.3-src/Scripts/Python/glife/EmulateHexagonal.py0000644000175000017500000001171012112261643020004 00000000000000import os from glife.RuleTree import * def HexagonalTransitionsToRuleTree(neighborhood,n_states,transitions,rule_name): '''Convert a set of hexagonal neighborhood transitions to a Moore neighborhood rule tree.''' tree = RuleTree(n_states,8) for t in transitions: # C,S,E,W,N,SE,(SW),(NE),NW tree.add_rule([t[0],t[4],t[2],t[5],t[1],t[3],range(n_states),range(n_states),t[6]],t[7][0]) tree.write( golly.getdir('rules')+rule_name+".tree" ) def MakePlainHexagonalIcons(n_states,rule_name): '''Make some monochrome hexagonal icons.''' width = 31*(n_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]] big = [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]] small = [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,1,1,1,0], [0,1,1,1,1,1,0], [0,1,1,1,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]] fg = (255,255,255) bg = (0,0,0) for s in range(1,n_states): for row in range(31): for column in range(31): pixels[row][(s-1)*31+column] = [bg,fg][huge[row][column]] for row in range(15): for column in range(15): pixels[31+row][(s-1)*31+column] = [bg,fg][big[row][column]] for row in range(7): for column in range(7): pixels[46+row][(s-1)*31+column] = [bg,fg][small[row][column]] return pixels def EmulateHexagonal(neighborhood,n_states,transitions,input_filename): '''Emulate a hexagonal neighborhood rule table with a Moore neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] HexagonalTransitionsToRuleTree(neighborhood,n_states,transitions,rule_name) pixels = MakePlainHexagonalIcons(n_states,rule_name) # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, n_states, pixels) return rule_name golly-3.3-src/Scripts/Python/glife/herschel.py0000644000175000017500000000324112026730263016361 00000000000000from glife.base import * herschel_ghost = pattern (""" *** . .*.* """) # A Herschel conduit is represented by its pattern and # the transformation it applies to the Herschel. # Hence the additional .transform field. hc64 = block (14, -8) + block (9, -13) + block (13, -15) + block (7, -19) hc64.transform = (-9, -9, rccw) hc77 = block (9, -13) + eater (10, 0, swap_xy) + eater (-7, -12, swap_xy_flip) hc77.transform = (10, -25, flip_x) hc112 = block (16, -10) + block (-3, -11) + aircraft_carrier (13, -3, swap_xy) + \ eater (10, 1) + eater (-3, -14, flip) + eater (9, -16, flip_y) hc112.transform = (35, -12, rcw) hc117 = eater (10, 1) + eater (13, -9, swap_xy) + eater (0, -12, swap_xy_flip) + block (8, -22) + snake (15, -19) hc117.transform = (6, -40, identity) hc119 = block (-14, -3) + block (-13, -8) + block (-19, -9) + eater (-17, -2, rcw) hc119.transform = (-12, -20, flip_x) hc156 = eater (10, 0, swap_xy) + eater (12, -9, swap_xy) + eater (0, -12, swap_xy_flip) + eater (17, -21, flip_y) + \ snake (21, -5, rccw) + block (24, -15) + tub (11, -24) hc156.transform = (43, -17, rcw) hc158 = eater (-2, -13, flip) + eater (-3, -8, rcw) + eater (20, -19, rccw) + pattern (""" .....** .....*.* .......* .......*.*.** ..**.*.*.**.* ..**.**.* ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** """, 14, -12) hc158.transform = (7, -27, flip_x) hc190 = eater (-3, -8, rcw) + eater (-10, -12, swap_xy) + eater (-3, -12, swap_xy_flip) + \ eater (-8, -17) + eater (11, -27, flip_y) + block (2, -25) + snake (5, -31, rccw) + \ pattern (""" ..**.* ..**.*** ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** """, 14, -8) hc190.transform = (-16, -22, rccw) golly-3.3-src/Scripts/Python/glife/gun24.pyc0000644000175000017500000000161312026743720015671 00000000000000ó ³°[Pc@s ddlTedddƒZdS(iÿÿÿÿ(t*s­ 23bo2bo$21b6o$17b2obo8bo$13b2obobobob8o2bo$11b3ob2o3bobo7b3o$10bo 4b3o2bo3bo3b2o$11b3o3b2ob4obo3bob2o$12bobo3bo5bo4bo2bo4b2obo$10b o8bob2o2b2o2b2o5bob2obo$10b5ob4obo4b3o7bo4bo$15b2o4bo4bob3o2b2ob ob2ob2o$12b5ob3o4b2ob2o3bobobobobo$11bo5b2o4b2obob2o5bo5bo$12b5o 6b2obo3bo3bobob2ob2o$2ob2o9b2o2bo5bobo4bo2b3obobo$bobobobob2o3b3o bo6bo2bobo4b3o2bo$o2bo7bo6b2o3b3o8bobob2o$3o2bo4b2o11bo10bo$5b4o bo17b2o4b2o$2b2obo6bo14bo3bo2b2o$bo4bo3bo16bo6b2o$b3obo4bo16bo3b o2bo$11bo2bo3bo9b2o4bobob2o$b3obo4bo8b2o3bo10b3o2bo$bo4bo3bo7bo6b o8b3obobo$2b2obo6bo10b3o8bobob2ob2o$5b4obo24bo5bo$3o2bo4b2o21bob obobobo$o2bo7bo9b2o10b2obob2ob2o$bobobobob2o10bo8bo5bo4bo$2ob2o17b 3o6bo4bob2obo$24bo4b3o5b2obo!iàÿÿÿN(tglifetpatterntgun24(((s-/home/akt/golly/Scripts/Python/glife/gun24.pyts  golly-3.3-src/Scripts/Python/glife/RuleTree.py0000644000175000017500000004276712115547511016334 00000000000000# Only the neighborhoods supported by ruletree_algo are supported: # a) vonNeumann: 4 neighbors: C,S,E,W,N, # b) Moore: 8 neighbors: C,S,E,W,N,SE,SW,NE,NW # # This file contains two ways of building rule trees: # # 1) RuleTree Usage example: # # tree = RuleTree(14,4) # 14 states, 4 neighbors = von Neumann neighborhood # tree.add_rule([[1],[1,2,3],[3],[0,1],[2]],7) # inputs: [C,S,E,W,N], output # tree.write("Test.tree") # # 2) MakeRuleTreeFromTransitionFunction usage example: # # MakeRuleTreeFromTransitionFunction( 2, 4, lambda a:(a[0]+a[1]+a[2])%2, 'Parity.tree' ) # import golly import os from tempfile import mkstemp from shutil import move # ------------------------------------------------------------------------------ class RuleTree: ''' Usage example: tree = RuleTree(14,4) # 14 states, 4 neighbors = von Neumann neighborhood tree.add_rule([[1],[1,2,3],[3],[0,1],[2]],7) # inputs: [C,S,E,W,N], output tree.write("Test.tree") For vonNeumann neighborhood, inputs are: C,S,E,W,N For Moore neighborhood, inputs are: C,S,E,W,N,SE,SW,NE,NW ''' def __init__(self,numStates,numNeighbors): self.numParams = numNeighbors + 1 ; self.world = {} # dictionary mapping node tuples to node index (for speedy access by value) self.seq = [] # same node tuples but stored in a list (for access by index) # each node tuple is ( depth, index0, index1, .. index(numStates-1) ) # where each index is an index into self.seq self.nodeSeq = 0 self.curndd = -1 self.numStates = numStates self.numNeighbors = numNeighbors self.cache = {} self.shrinksize = 100 self._init_tree() def _init_tree(self): self.curndd = -1 for i in range(self.numParams): node = tuple( [i+1] + [self.curndd]*self.numStates ) self.curndd = self._getNode(node) def _getNode(self,node): if node in self.world: return self.world[node] else: iNewNode = self.nodeSeq self.nodeSeq += 1 self.seq.append(node) self.world[node] = iNewNode return iNewNode def _add(self,inputs,output,nddr,at): if at == 0: # this is a leaf node if nddr<0: return output # return the output of the transition else: return nddr # return the node index if nddr in self.cache: return self.cache[nddr] # replace the node entry at each input with the index of the node from a recursive call to the next level down ### AKT: this code causes syntax error in Python 2.3: ### node = tuple( [at] + [ self._add(inputs,output,self.seq[nddr][i+1],at-1) if i in inputs[at-1] \ ### else self.seq[nddr][i+1] for i in range(self.numStates) ] ) temp = [] for i in range(self.numStates): if i in inputs[at-1]: temp.append( self._add(inputs,output,self.seq[nddr][i+1],at-1) ) else: temp.append( self.seq[nddr][i+1] ) node = tuple( [at] + temp ) r = self._getNode(node) self.cache[nddr] = r return r def _recreate(self,oseq,nddr,lev): if lev == 0: return nddr if nddr in self.cache: return self.cache[nddr] # each node entry is the node index retrieved from a recursive call to the next level down node = tuple( [lev] + [ self._recreate(oseq,oseq[nddr][i+1],lev-1) for i in range(self.numStates) ] ) r = self._getNode(node) self.cache[nddr] = r return r def _shrink(self): self.world = {} oseq = self.seq self.seq = [] self.cache = {} self.nodeSeq = 0 ; self.curndd = self._recreate(oseq, self.curndd, self.numParams) self.shrinksize = len(self.seq) * 2 def add_rule(self,inputs,output): self.cache = {} self.curndd = self._add(inputs,output,self.curndd,self.numParams) if self.nodeSeq > self.shrinksize: self._shrink() def _setdefaults(self,nddr,off,at): if at == 0: if nddr<0: return off else: return nddr if nddr in self.cache: return self.cache[nddr] # each node entry is the node index retrieved from a recursive call to the next level down node = tuple( [at] + [ self._setdefaults(self.seq[nddr][i+1],i,at-1) for i in range(self.numStates) ] ) node_index = self._getNode(node) self.cache[nddr] = node_index return node_index def _setDefaults(self): self.cache = {} self.curndd = self._setdefaults(self.curndd, -1, self.numParams) def write(self,filename): self._setDefaults() self._shrink() out = open(filename,'w') out.write("num_states=" + str(self.numStates)+'\n') out.write("num_neighbors=" + str(self.numNeighbors)+'\n') out.write("num_nodes=" + str(len(self.seq))+'\n') for rule in self.seq: out.write(' '.join(map(str,rule))+'\n') out.flush() out.close() # ------------------------------------------------------------------------------ class MakeRuleTreeFromTransitionFunction: ''' Usage example: MakeRuleTreeFromTransitionFunction( 2, 4, lambda a:(a[0]+a[1]+a[2])%2, 'Parity.tree' ) For vonNeumann neighborhood, inputs are: N,W,E,S,C For Moore neighborhood, inputs are NW,NE,SW,SE,N,W,E,S,C ''' def __init__(self,numStates,numNeighbors,f,filename): self.numParams = numNeighbors + 1 ; self.numStates = numStates self.numNeighbors = numNeighbors self.world = {} self.seq = [] self.params = [0]*self.numParams self.nodeSeq = 0 self.f = f self._recur(self.numParams) self._write(filename) def _getNode(self,node): if node in self.world: return self.world[node] else: iNewNode = self.nodeSeq self.nodeSeq += 1 self.seq.append(node) self.world[node] = iNewNode return iNewNode def _recur(self,at): if at == 0: return self.f(self.params) node = tuple([at]) for i in range(self.numStates): self.params[self.numParams-at] = i node += tuple( [self._recur(at-1)] ) return self._getNode(node) def _write(self,filename): out = open(filename,'w') out.write("num_states=" + str(self.numStates)+'\n') out.write("num_neighbors=" + str(self.numNeighbors)+'\n') out.write("num_nodes=" + str(len(self.seq))+'\n') for rule in self.seq: out.write(' '.join(map(str,rule))+'\n') out.flush() out.close() # ------------------------------------------------------------------------------ def ReplaceTreeSection(rulepath, newtree): # replace @TREE section in existing .rule file with new tree data try: rulefile = open(rulepath,'r') except: golly.exit('Failed to open existing .rule file: '+rulepath) # create a temporary file for writing new rule info temphdl, temppath = mkstemp() tempfile = open(temppath,'w') skiplines = False for line in rulefile: if line.startswith('@TREE'): tempfile.write('@TREE\n\n') tempfile.write(newtree) skiplines = True elif skiplines and line.startswith('@'): tempfile.write('\n') skiplines = False if not skiplines: tempfile.write(line) # close files rulefile.close() tempfile.flush() tempfile.close() os.close(temphdl) # remove original .rule file and rename temporary file os.remove(rulepath) move(temppath, rulepath) # ------------------------------------------------------------------------------ def GetColors(icon_pixels, wd, ht): colors = [] multi_colored = False for row in xrange(ht): for col in xrange(wd): R,G,B = icon_pixels[row][col] if R != G or G != B: multi_colored = True # not grayscale found = False index = 0 for count, RGB in colors: if (R,G,B) == RGB: found = True break index += 1 if found: colors[index][0] += 1 else: colors.append([1, (R,G,B)]) return colors, multi_colored # ------------------------------------------------------------------------------ def hex2(i): # convert number from 0..255 into 2 hex digits hexdigit = "0123456789ABCDEF" result = hexdigit[i / 16] result += hexdigit[i % 16] return result # ------------------------------------------------------------------------------ def CreateXPMIcons(colors, icon_pixels, iconsize, yoffset, xoffset, numicons, rulefile): # write out the XPM data for given icon size rulefile.write("\nXPM\n") cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" numcolors = len(colors) charsperpixel = 1 if numcolors > 26: charsperpixel = 2 # AABA..PA, ABBB..PB, ... , APBP..PP rulefile.write("/* width height num_colors chars_per_pixel */\n") rulefile.write("\"" + str(iconsize) + " " + str(iconsize*numicons) + " " + \ str(numcolors) + " " + str(charsperpixel) + "\"\n") rulefile.write("/* colors */\n") n = 0 for count, RGB in colors: R,G,B = RGB if R == 0 and G == 0 and B == 0: # nicer to show . or .. for black pixels rulefile.write("\".") if charsperpixel == 2: rulefile.write(".") rulefile.write(" c #000000\"\n") else: hexcolor = "#" + hex2(R) + hex2(G) + hex2(B) rulefile.write("\"") if charsperpixel == 1: rulefile.write(cindex[n]) else: rulefile.write(cindex[n % 16] + cindex[n / 16]) rulefile.write(" c " + hexcolor + "\"\n") n += 1 for i in xrange(numicons): rulefile.write("/* icon for state " + str(i+1) + " */\n") for row in xrange(iconsize): rulefile.write("\"") for col in xrange(iconsize): R,G,B = icon_pixels[row + yoffset][col + xoffset*i] if R == 0 and G == 0 and B == 0: # nicer to show . or .. for black pixels rulefile.write(".") if charsperpixel == 2: rulefile.write(".") else: n = 0 thisRGB = (R,G,B) for count, RGB in colors: if thisRGB == RGB: break n += 1 if charsperpixel == 1: rulefile.write(cindex[n]) else: rulefile.write(cindex[n % 16] + cindex[n / 16]) rulefile.write("\"\n") # ------------------------------------------------------------------------------ def ConvertTreeToRule(rule_name, total_states, icon_pixels): ''' Convert rule_name.tree to rule_name.rule and delete the .tree file. If rule_name.colors exists then use it to create an @COLORS section and delete the .colors file. If icon_pixels is supplied then add an @ICONS section. Format of icon_pixels (in this example there are 4 icons at each size): --------------------------------------------------------- | | | | | | | | | | | 31x31 | 31x31 | 31x31 | 31x31 | | | | | | | | | | | --------------------------------------------------------- | |.....| |.....| |.....| |.....| | 15x15 |.....| 15x15 |.....| 15x15 |.....| 15x15 |.....| | |.....| |.....| |.....| |.....| --------------------------------------------------------- |7x7|.........|7x7|.........|7x7|.........|7x7|.........| --------------------------------------------------------- The top layer of 31x31 icons is optional -- if not supplied (ie. the height is 22) then there are no gaps between the 15x15 icons. ''' rulepath = golly.getdir('rules')+rule_name+'.rule' treepath = golly.getdir('rules')+rule_name+'.tree' colorspath = golly.getdir('rules')+rule_name+'.colors' # get contents of .tree file try: treefile = open(treepath,'r') treedata = treefile.read() treefile.close() except: golly.exit('Failed to open .tree file: '+treepath) # if the .rule file already exists then only replace the @TREE section # so we don't clobber any other info added by the user if os.path.isfile(rulepath): ReplaceTreeSection(rulepath, treedata) os.remove(treepath) if os.path.isfile(colorspath): os.remove(colorspath) return # create a new .rule file rulefile = open(rulepath,'w') rulefile.write('@RULE '+rule_name+'\n\n') rulefile.write('@TREE\n\n') # append contents of .tree file, then delete that file rulefile.write(treedata) os.remove(treepath) # if .colors file exists then append @COLORS section and delete file if os.path.isfile(colorspath): colorsfile = open(colorspath,'r') rulefile.write('\n@COLORS\n\n') for line in colorsfile: if line.startswith('color') or line.startswith('gradient'): # strip off everything before 1st digit line = line.lstrip('colorgadient= \t') rulefile.write(line) colorsfile.close() os.remove(colorspath) # if icon pixels are supplied then append @ICONS section if len(icon_pixels) > 0: wd = len(icon_pixels[0]) ht = len(icon_pixels) iconsize = 15 # size of icons in top row if ht > 22: iconsize = 31 # 31x31 icons are present numicons = wd / iconsize # get colors used in all icons (we assume each icon size uses the same set of colors) colors, multi_colored = GetColors(icon_pixels, wd, ht) if len(colors) > 256: golly.warn('Icons use more than 256 colors!') rulefile.flush() rulefile.close() return if multi_colored: # create @COLORS section using color info in icon_pixels (not grayscale) rulefile.write('\n@COLORS\n\n') if numicons >= total_states: # extra icon is present so use top right pixel to set the color of state 0 R,G,B = icon_pixels[0][wd-1] rulefile.write('0 ' + str(R) + ' ' + str(G) + ' ' + str(B) + '\n') numicons -= 1 # set colors for each live state to the average of the non-black pixels # in each icon on top row (note we've skipped the extra icon detected above) for i in xrange(numicons): nbcount = 0 totalR = 0 totalG = 0 totalB = 0 for row in xrange(iconsize): for col in xrange(iconsize): R,G,B = icon_pixels[row][col + i*iconsize] if R > 0 or G > 0 or B > 0: nbcount += 1 totalR += R totalG += G totalB += B if nbcount > 0: rulefile.write(str(i+1) + ' ' + str(totalR / nbcount) + ' ' \ + str(totalG / nbcount) + ' ' \ + str(totalB / nbcount) + '\n') else: # avoid div by zero rulefile.write(str(i+1) + ' 0 0 0\n') # create @ICONS section using (r,g,b) triples in icon_pixels[row][col] rulefile.write('\n@ICONS\n') if ht > 22: # top row of icons is 31x31 CreateXPMIcons(colors, icon_pixels, 31, 0, 31, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 15, 31, 31, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 7, 46, 31, numicons, rulefile) else: # top row of icons is 15x15 CreateXPMIcons(colors, icon_pixels, 15, 0, 15, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 7, 15, 15, numicons, rulefile) rulefile.flush() rulefile.close() # ------------------------------------------------------------------------------ def ConvertRuleTableTransitionsToRuleTree(neighborhood,n_states,transitions,input_filename): '''Convert a set of vonNeumann or Moore transitions directly to a rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] remap = { "vonNeumann":[0,3,2,4,1], # CNESW->CSEWN "Moore":[0,5,3,7,1,4,6,2,8] # C,N,NE,E,SE,S,SW,W,NW -> C,S,E,W,N,SE,SW,NE,NW } numNeighbors = len(remap[neighborhood])-1 tree = RuleTree(n_states,numNeighbors) for i,t in enumerate(transitions): golly.show("Building rule tree... ("+str(100*i/len(transitions))+"%)") tree.add_rule([ t[j] for j in remap[neighborhood] ],t[-1][0]) tree.write(golly.getdir('rules')+rule_name+".tree" ) # use rule_name.tree to create rule_name.rule (no icons) ConvertTreeToRule(rule_name, n_states, []) return rule_name golly-3.3-src/Scripts/Python/make-Codd-constructor.py0000644000175000017500000000440113151213347017643 00000000000000# Make a pattern from states 1 and 0, select it and then # run this script to make a Codd CA pattern that will then # construct the pattern. The constructor will then attempt # to inject sheathing and triggering signals to a point one # up from the pattern's bottom-left corner. # # See example: Patterns/Self-Rep/Codd/golly-constructor.rle # # Tim Hutton from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 # these are the commands: extend = '70116011' extend_left = '4011401150116011' extend_right = '5011501140116011' retract = '4011501160116011' retract_left = '5011601160116011' retract_right = '4011601160116011' mark = '701160114011501170116011' erase = '601170114011501160116011' sense = '70117011' cap = '40116011' inject_sheath = '701150116011' inject_trigger = '60117011701160116011' # (sometimes you don't need two blanks after each command but I haven't analysed this fully) # we first write the commands to a string, and then to the grid # (we start off facing right, at the bottom-left of the construction area) # write the cells that are in state 1 (can ignore the zeros) # (still plenty of room for optimisation here) tape = '11' for row in xrange(r.top, r.top + r.height): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for col in xrange(r.left, r.left + r.width): if g.getcell(col, row)==1: tape += extend*(4+col-r.left) + extend_left + extend*(r.top+r.height-row) tape += mark tape += retract*(r.top+r.height-row) + retract_left + retract*(4+col-r.left) elif g.getcell(col,row)!=0: g.exit('Cells in the selected area must be in states 0 or 1 only.') # finally we sheath and trigger and retract tape += extend_left + extend*4 + extend_right + extend tape += inject_sheath + '1'*50 + inject_trigger tape += retract*2 + retract_right + retract*4 + retract_left # now write the tape out x = r.left+r.width+10 y = r.top+r.height+10 g.setcell(x+1,y,2) for i in tape: g.setcell(x,y-1,2) g.setcell(x,y,int(i)) g.setcell(x,y+1,2) x-=1 golly-3.3-src/Scripts/Python/slide-show.py0000644000175000017500000000452012706123635015561 00000000000000# Display all patterns in Golly's Patterns folder. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. import golly as g import os from os.path import join from time import sleep # ------------------------------------------------------------------------------ def slideshow (): oldalgo = g.getalgo() oldrule = g.getrule() message = "Hit space to continue or escape to exit the slide show..." g.show(message) for root, dirs, files in os.walk(g.getdir("app") + "Patterns"): for name in files: if name.startswith("."): # ignore hidden files (like .DS_Store on Mac) pass else: g.new("") g.setalgo("QuickLife") # nicer to start from this algo fullname = join(root, name) g.open(fullname, False) # don't add file to Open/Run Recent submenu g.update() if name.endswith(".lua") or name.endswith(".py"): # reshow message in case it was changed by script g.show(message) while True: event = g.getevent() if event == "key space none": break g.doevent(event) # allow keyboard/mouse interaction sleep(0.01) # avoid hogging cpu # if all patterns have been displayed then restore original algo and rule # (don't do this if user hits escape in case they want to explore pattern) g.new("untitled") g.setalgo(oldalgo) g.setrule(oldrule) # ------------------------------------------------------------------------------ # show status bar but hide other info to maximize viewport oldstatus = g.setoption("showstatusbar", True) oldtoolbar = g.setoption("showtoolbar", False) oldlayerbar = g.setoption("showlayerbar", False) oldeditbar = g.setoption("showeditbar", False) oldfiles = g.setoption("showfiles", False) try: slideshow() finally: # this code is always executed, even after escape/error; # clear message line in case there was no escape/error g.show("") # restore original state g.setoption("showstatusbar", oldstatus) g.setoption("showtoolbar", oldtoolbar) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) g.setoption("showfiles", oldfiles) golly-3.3-src/Scripts/Python/heisenburp.py0000644000175000017500000005720212651666400015655 00000000000000# Stable pseudo-Heisenburp device. # Show several views of a multi-stage signal-processing circuit, # optionally using Golly 1.2+'s layer-cloning system. # Author: Dave Greene, 27 February 2007. # Latest changes: # - corrected timing of signal-tracking selection highlight # - switched to three spaces per indent # - replaced long instruction message with Help note # - added rule() to be sure to run in the right universe (B3/S23) # - removed "x = ..." lines from pattern strings import golly as g from glife import * from time import sleep import os import sys def burp(): test_signal=pattern(""" 40bo$41bo$39b3o17$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o 2b3o3$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo 4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo4bo4bo4bo$41b o4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$bo38bo4bo4bo4bo4bo18bo$2bo38bo4bo 4bo4bo4bo18bo$3o36b3o2b3o2b3o2b3o2b3o16b3o37$40bo$41bo$39b3o!""") prepare_burp() ticks=0 tickstep=5 last_signal=-99999 viewport_speed=16 sel_speed=0.0 delta_sel=0.0 delay=-1.0 run_flag=False ch="" selx=600.0 sely=365.0 place_signal=3 helpstring="""Use ENTER and SPACE to run or halt the pattern; use + and - to change the step size or delay value; use arrow keys and mouse tools to pan and zoom in any pane; T toggles between a tiled view and a single-pane view; S creates another signal fleet near the detection mechanism; R resets the Heisenburp device to its initial state; Q quits out of the script and restores original settings.""" instr="Press H for help. " g.show(instr + str(tickstep)) g.select([selx,sely,50,50]) # keyboard handling while ch<>"q": if place_signal>0: if ticks-last_signal>1846: test_signal.put(-150,60) last_signal=ticks place_signal-=1 if place_signal>0 and run_flag==True: show_status_text("Next signal placement in " \ + str(1847 - ticks + last_signal) + " ticks. " + instr, delay, tickstep) else: show_status_text(instr,delay,tickstep) event = g.getevent() if event.startswith("key"): evt, ch, mods = event.split() else: ch = "" if ch=="r": prepare_burp() ticks=0 last_signal=-99999 viewport_speed=16 sel_speed=0 run_flag=False selx=600.0 sely=365.0 place_signal=3 g.select([selx,sely,50,50]) elif ch=="h": g.note(helpstring) elif ch=="t": g.setoption("tilelayers",1-g.getoption("tilelayers")) elif ch=="=" or ch=="+": if delay>.01: delay/=2 elif delay==.01: delay=-1 else: if tickstep==1: tickstep=3 elif tickstep<250: tickstep=(tickstep-1)*2+1 elif ch=="-" or ch=="_": if delay==-1: if tickstep==1: delay=.01 else: if tickstep==3: tickstep=1 else: tickstep=(tickstep-1)/2+1 else: if delay<1: delay*=2 elif ch=="space": run_flag=False elif ch=="return": run_flag=not run_flag elif ch=="s": place_signal+=1 else: # just pass any other keyboard/mouse event through to Golly g.doevent(event) # generation and selection speed handling if ch=="space" or run_flag==True: g.run(tickstep) currlayer = g.getlayer() if currlayer != 4: # user has switched layer so temporarily change it back # so we only change location of bottom right layer g.check(False) g.setlayer(4) x, y = getposint() oldticks=ticks ticks+=tickstep delta_view=int(ticks/viewport_speed) - int(oldticks/viewport_speed) if delta_view <> 0: # assumes diagonal motion for now setposint(x + delta_view, y + delta_view) sel = g.getselrect() if len(sel)<>0: x, y, w, h = sel if int(selx)<>x: # user changed selection # prepare to move new selection instead (!?!) # -- use floating-point selx, sely to account for fractional speeds selx=x sely=y else: selx+=sel_speed*tickstep sely+=sel_speed*tickstep g.select([selx, sely, w, h]) else: g.select([selx, sely, 50, 50]) if currlayer != 4: g.setlayer(currlayer) g.check(True) # change viewport speed at appropriate times to follow the action if oldticks<4570 and ticks>=4570: sel_speed=.666667 # one-time correction to catch up with the signal at high sim speeds g.select([600+(ticks-4570)*1.5, 365+(ticks-4570)*1.5, w, h]) if selx>2125: sel_speed=0 g.select([2125, sely+2125-selx, w, h]) if oldticks<4750 and ticks>=4750: viewport_speed=1.5 if oldticks<6125 and ticks>=6125: viewport_speed=16 if oldticks>=11995: viewport_speed=99999.9 # stop automatically after the last signal passes through the device if oldticks - last_signal<8705 and ticks - last_signal>=8705: run_flag=False if run_flag==True and delay>0: sleep(delay) g.update() # ----------------------------------------------------- def prepare_burp(): highway_robber=pattern(""" 143bo$143b3o$146bo$145b2o2$126bo42bo$126b3o38b3o$129bo36bo$128b2o11b2o 23b2o7b2o$141b2o32bo$108bo64bobo$108b3o6b2o54b2o$111bo5b2o$110b2o3$ 111b2o$111b2o3b2o$116b2o35b2o23bo$154bo22bobo$151b3o8b2o14bo$151bo11bo $98bo7bo53b3o$86bo11b3o5b3o51bo$84b3o14bo7bo32b2o$68bo14bo16b2o6b2o32b obo30b2o$68b3o12b2o59bo30bobo$71bo72b2o31bo$70b2o105b2o$159bob2o$159b 2obo$71b2o$71b2o17b2o76b2o$90b2o76b2o5$104b2o$87b2o14bobo$87bo15bo74b 2o$88b3o11b2o74bo$90bo85bobo$84b2o90b2o$84bo$85b3o$87bo2$158b2o$159bo$ 68b2o89bobo$67bobo90b2o$67bo25b2o$66b2o25bo$74b2o15bobo$74b2o15b2o98b 2o6bo$187bobo2bo4b3o$185b3ob2o5bo$184bo11b2o$185b3ob2o$177b2o8bob2o$ 177b2o2$161b2o32b2o3b2o$161b2o32b2o3b2o$153b2o$88b2o2b2ob2o57bo18b2ob 2o$73b2o13bobo2bobo58bobo16b2obo$72bobo16b2o3bo58b2o21bo26bo$72bo19bob 2o76bob5o25bobo$71b2o16bo2bobo77b2o31bo$88bobobobo80b2o$89b2ob2o82bo$ 173b3o$173bo33bo$171bobo31b3o$171b2o31bo$187b2o14bobo$187b2o15bo$83b2o $83b2o$202b2o$202b2o2$175b2o$175b2o$72b2o123b2o$73bo19b2o102bo$73bobo 17bo76b2o26b3o$74b2o15bobo60b2o14b2o28bo$86bo4b2o62bo$85bobo64b3o$54bo 30bobo64bo$54b3o17b2o10bo$57bo15bobo$56b2o15bo116b2o$72b2o116bo$36b2o 49b2o102b3o$29b2o5b2o49bo105bo$29b2o57b3o6bo$90bo4b3o$94bo$31b2o17b2o 29b2o11b2o14b2o$31b2o17bo30b2o27b2o$25b2o21bobo$25b2o21b2o$116b2o$116b 2o36b2o$112b2o41bo$112b2o41bobo$156b2o$56b2o122b2o$56b2o11b2o109b2o$ 69bo47b2o$70b3o44b2o$72bo2$22bo$22b3o55b2o96b2o$25bo53bobo96bo$24b2o 47b2o4bo99b3o$73b2o3b2o101bo$179b2o$76b4o99bo$75bo3bo97bobo$75b2o100b 2o$53b2o33bo22b2o$19b2o32b2o33b3o20bo$20bo70bo20b3o$20bobo67b2o22bo44b o$21b2o136b3o$162bo$115bo45b2o$35b2o28b2o46b3o$35bobo27b2o45bo$37bo41b 2o6b2o23b2o$37b2o40b2o6bo2b2o$83b2o3b2obo$83b2o4bo89b2o$17bob2o68bo89b o$17b2obo67b2obob2o18b2o62bobo$87bo2b2ob2o18bobo61b2o$26b2o60bo26bo$ 26b2o33b2o26b3ob2o20b2o$60bo2bo27bobo66b2o$61bobo29bo66b2o15b2o$62bo 29b2ob2o80bobo$94bobo82bo$94bo84b2o$93b2o3$160b2o$160bo$158bobo$158b2o 2$16bo$16b3o$19bo33bo121b2obo$18b2o33b3o53b2o64bob2o$56bo52b2o$11bo43b obo110b2o$11b3o42bo111b2o$14bo123bo$13b2o121b3o$57b2o19bo56bo$57b2o17b 3o19b2o20bo14b2o$75bo23bo19bobo$75b2o22bobo17bobo$100b2o15bobobobo34b 2o$10b2o19b2o79bo4b2o3b2o10bo24bo$10b2o19b2o47b2o29bobo19bobo23bobo$ 80b2o29bobo19bobo24b2o$4bo95b2o10bo21bo4b2o$4b3o25b2o65bobo20b2o15bobo $2o5bo24bo57b2o7bo21bobo17bo$bo4b2o25b3o54bo7b2o21bo19b2o36bo$bobo31bo 52bobo22b2o5b2o55b3o$2b2o29b2o53b2o23bo62bo$33bo17b2o61b3o28b2o29b2o$ 31bobo4bo11bobo63bo28bo$31b2o3b3o11bo92bobo$35bo13b2o92b2o$35b2o94b2o$ 61b2o68b2o$61b2o$b2o178b2o$b2o178bo$36b2o141bobo$36b2o141b2o3$27b2o37b 2o97b2o$27b2o36bobo51b2o43bobo$65bo54bo43bo$64b2o54bobo40b2o$121b2o2$ 181b2obo$181bob2o2$40bo133b2o$38b3o133b2o$37bo$37b2o$138b2o$138b2o$42b 2o$42b2o78b2o$122b2o$114b2o$52b2o61bo18b2ob2o$52bo62bobo16b2obo$50bobo 63b2o21bo$50b2o81bob5o$13b2o118b2o$12bobo121b2o$12bo124bo$11b2o99bobo 19b3o$112b2obo18bo$23b2o90b3o$23b2o87b2o4bo$112bob5o$114bo$113bo3b2o$ 108bo3bo3bobo$106b3o3b2o3bo$105bo$28b2o75b2o29b2o39b2o$27bobo106b2o38b o2bo$27bo149b2o$26b2o2$131b2o$131b2o$135b2o$14b2o119b2o$14b2o35bo$49b 3o$48bo80b2o$48b2o63b2o14b2o$79bo33bo$68b2o7b3o34b3o$69bo6bo39bo$69bob o4b2o$70b2o$109b2o$109bobo$111bo$111b2o7$103b2o$103bo$104b3o$106bo$13b o19b2o$12bobo10b2o6bo5b2o41b2o$11bo2bo10bo8b3obobo41bo$12b2o9bobo10bob o7b2o28b2obo3b3o$23b2o12b2o7b2o28b2ob4o2bo$82bo$64b2o6b2o2b2ob2o$63bob o6bo4bobo$63bo9b4o2bo$62b2o7bobo2bobo$71b2o4bo!""") connecting_neck=pattern(""" 24bo$22b3o$21bo$21b2o$6b2o$7bo$7bobo$8b2o10bo$19bobo$19bobo$20bo4b2o$ 8b2o15bobo$7bobo17bo$7bo19b2o$6b2o6$17b2o$17b2o7$23b2ob2o$22bobobobo$ 5b2o16bo2bobo$6bo19bob2o$6bobo16b2o3bo$7b2o13bobo2bobo$22b2o2b2ob2o11$ 8b2o15b2o$8b2o15bobo$2o25bo$bo25b2o$bobo$2b2o4$21bo107bo$19b3o106bobo$ 18bo109bobo$18b2o106b3ob2o$24bo100bo$22b3o12bo84bo2b4ob2o$21bo15b3o82b 3o3bob2o$21b2o17bo84bo$39b2o83b2o26b2o$152bo$150bobo$150b2o2$24b2o$5b 2o17b2o76bo$5b2o95b3o6b2o$105bo5b2o41b2obo$104b2o48bob2o$4b2o$5bo141b 2o$2b3o12b2o86b2o40b2o$2bo14bo16b2o6b2o61b2o3b2o$18b3o14bo7bo66b2o$20b o11b3o5b3o$32bo7bo$78bo51b2o3b2o$76b3o13bo38bo3bo$75bo16b3o33b3o5b3o$ 50b2o23b2o18bo32bo9bo$45b2o3b2o42b2o42bobo$45b2o92b2o3$44b2o76b2o$45bo 5b2o69b2o$42b3o6b2o104b2o$42bo41b2o71bo$84b2o69bobo$61b2o92b2o$60bobo 62bo$60bo62b3o$59b2o10b2o49bo$72bo48bobo$69b3o9b2o39bo43b2o$69bo11bo 19b2o56b2o6bo$82bo17bobo56bo6bo$81b2o17bo19b2o35bobo6b2o$99b2o19b2o35b 2o$116b2o$116bo$117b3o24b2o$119bo23bobo$143bo25b2o$142b2o25b2o4$146b2o $145bobo$145bo4b2o$144b2o5bo$148b3o5bo$148bo6bobo$156bo!""") transmitter2c3=pattern(""" 180b2o$180b2o$219bo$219b3o$178b2o42bo$116bo61b2o41b2o$115bobo47b2o99b 2o14bo$116bo49bo74b2o24bo14b3o$166bobo73bo13b2o6b3o18bo$167b2o73bobo 11b2o6bo19b2o12bo$110b2o51b2o78b2o53b3o$110b2o23b2o26b2o136bo$102b2o 31bo164b2o$103bo29bobo$103bobo27b2o$104b2o4b2o$110b2o162b2o$274b2o$ 144b2o30b2o$102b2o40bo31b2o$102bo39bobo$104bob2o34b2o43b2o144b2o$103b 2ob2o78bo2bo143b2o$124b2o60bobo23b2o57b2o$103b2ob2o16b2o61bo20bo3b2o 57bo20b2o$104bobo100bobo26b2o14b2o3b2o13bo20bo$104bobo99bobo21b2o5bo 15bo3bo13b2o17b3o61b2o$105bo100bo23bobob3o13b3o5b3o29bo63b2o5b2o$205b 2o16b2o7bobo15bo9bo100b2o$223b2o7b2o152b2o6bo$169b2o125b2o84bobo2bo4b 3o$169b2o124bobo61b2o19b3ob2o5bo$295bo63b2o18bo11b2o$294b2o69b2o13b3ob 2o$365b2o15bob2o$131b2o151bo$131b2o149b3o12b2o$281bo16bo91b2o3b2o$271b 2o8b2o12b3o92b2o3b2o$272bo22bo$272bobo27b2o30b2o$273b2o28bo17b2o11b2o$ 39bo82bo136bo27b2o11b3o19bo77bo$38bobo79b3o136b3o25b2o11bo18b3o77bobo$ 39bo79bo142bo56bo80bo$108bo10b2o140b2o$37b5o65bobo228b2o$37bo4bo64bobo 177b2o50bo28b2o$40bo2bo61b3ob2o20bo155b2o47b3o29bo$12bo27b2obo60bo24b 3o204bo29bobo$12b3o10b2o10bo5bob2obo49bo6b3ob2o17bo104bo132b2o$15bo9b 2o9bobo4bobob2o49b3o6bob2o17b2o103b3o146b2o$4b2o8b2o20bo2bo2b2obo30b2o 23bo134bo145b2o$5bo31b2o6bo31bo6b2o14b2o133b2o11b2o13b2o$5bobo37b3o29b obo4b2o39b2o121b2o13b2o$6b2o40bo23b2o4b2o44bo2bo87bo73b2o$47b2o23bobo 50b2o88b3o5b2o64bo$70bobob3o141bo4b2o62bobo$66b2o2b2o5bo139b2o68b2o81b 2o$4bob2o58b2o8b2o292b2o$2b3ob2o384b2o$bo216b2o172bo$2b3ob2o80b2o128b 2o3b2o123b2o15b2o26b3o$4bobo30b2o49b2o23b2o108b2o122bobo15b2o28bo$4bob o30b2o74bo233bo$5bo108b3o229b2o$116bo77b2o7b2o$100b2o24b2o66b2o7bobo$ 28b2o66bo3b2o24bo30b2o42bobob3o$28b2o65bobo29b3o2b2o24bo42b2o5bo40b2o 18b2obo112b2o$34b2o58bobo32bo3bo13b2o6b3o49b2o40bobo17bob2o112bo$34bo 19b2o38bo38bobo11b2o6bo95bo134b3o$30bo5bo16bobo37b2o24b2o13b2o115b2o 135bo$29bobo3b2o16bo65b2o164b2obo$30bo21b2o231bob2o$31b3o$33bo79b2o 163b2o$113b2o163b2o$117b2o46b2o$66b2o49b2o46b2o$66b2o$349b2o$350bo$71b 2o39b2o98b2o136bobo$70bobo39b2o99bo54b2o81b2o$70bo91b2o46b3o56bo105b2o $69b2o91bo47bo58bobo103b2o$143b2o3b2o13bo106b2o$82b2o60bo3bo13b2o$82b 2o57b3o5b3o$141bo9bo40b2o$193bo$27bo162b3o180b2o$26bobo161bo182bo$26bo 2bo262b2o80b3o$27b2o263bo83bo$118b2o22bo147bobo81b2o$119bo20b3o99bo18b o28b2ob2o79bo$116b3o20bo102b3o7b2o5b3o31bobo76bobo$116bo22b2o104bo6b2o 4bo34bobo76b2o$5b2o237b2o12b2o10b2o20b2ob2o$5b2o264bo24bo$9b2o104bo 155bobo18b2obo$9b2o104b3o139b2o13b2o18b2obobo56bo$23b2o93bo133b2o3b2o 37b2o56b3o$23b2o92b2o23b2o108b2o103bo$139b2o2bo212b2o28b2o$139bob2o71b 2o56b2o112bo$141bo71bobo55bobo110bobo$141bo71bo49bo7bo108b2o2b2o$116b 2o18b2obob2o69b2o47b3o5b3o108b2o$35b2o78bobo18b2ob2o2bo116bo7bo$35b2o 78bo26bo117b2o6b2o$13b2o99b2o20b2ob3o$14bo122bobo239b2o4b2o$11b3o123bo 241b2o4b2o$11bo90b2o30b2ob2o$102bo31bobo$100bobo5b2o26bo$99bobo6b2o26b 2o140b2o$95b2o3bo177b2o72b2o35bo$95b2o254bobo33b3o$20b2o69b2o194b2o62b o34bo$21bo70bo194bo62b2o34b2o$18b3o71bobo193b3o63b2o$18bo74b2o195bo63b 2o3bo$233bo47b2o75bobo6b2o$233b3o46bo76bobo5b2o$236bo44bo79bo$235bobo 43b2o78b2o$120b2o4b2o108bo30bo$120b2o4b2o139b3o$270bo$237b2o30b2o8b2o 74bo$237b2o40bo61bo13b3o35b2o$121b2o154bobo59b3o16bo34b2o$121b2o2b2o 150b2o59bo18b2o$125bobo93bo41b2o73b2o$127bo92bobo40b2o26b2o$97b2o28b2o 91bobo68bo23bo72b2o$98bo119b3ob2o65bobo23b3o70b2o$95b3o119bo71b2o27bo 73b2o$95bo118bo2b4ob2o39b2o52b2o73b2o$214b3o3bob2o39b2o$217bo130b2o$ 175bo40b2o26b2o102b2o36b2o$113b2o60b3o66bo126b2o13b2o$113bobo46b2o3b2o 9bo14b2o47bobo126bobo$77bo37bo2bo2bo40b2o3b2o8b2o15bo47b2o43b2o84bo$ 77b3o35b7o71bo93b2o72b2o10b2o$80bo112b2o113b2o51bo$38b2o39b2o36b5o33b 2o151b2o41b2o9b3o$38b2o77bo4bo2b2o29bo174b2o19bo11bo$120bo2bo2bo29bobo 87b2obo81bobo17bo$120b2obobo31b2o87bob2o83bo17b2o$117bo5bob2o194b2o10b 2o$105b2o9bobo4bo72b2o41b2o80bo$105b2o9bo2bo2b2o72b2o41b2o70b2o9b3o$ 117b2o193bo11bo$96b2obo211bo$96bob2o211b2o$160b2o$61b2o98bo60b2o3b2o$ 61b2o8b2o85b3o28b2o32bo3bo$72bo85bo31bo15b2o12b3o5b3o29b2o$69b3o117bo 17bo12bo9bo28bobo$47b2o20bo119b2o13b3o23bobo26bo$48bo155bo26b2o25b2o 14b2o$10b2o33b3o70b2o153bo2bo$10b2o33bo29b2o41b2o154b2o$6bo50b2o15bobo $6b3o48bo16bo98b2o$9bo48b3o12b2o98b2o54b2o$8b2o11bo38bo103b2o64bo$20bo bo7b2o131bobo51b2o11bobo$20bobo7b2o44b2o85bo54bo12b2o$21bo55bo84b2o54b obo$74b3o142b2o2b2o$74bo148b2o$81b2o34b2o$82bo34bobo$18b2o59b3o37bo$ 18b2o59bo39b2o97b2o4b2o$4b2o212b2o4b2o$4b2o$2o$2o162bo$107bob2o3b2o48b 3o$105b3ob2o3bo52bo$104bo10b3o48b2o$105b3ob2o6bo101b2o$107b2o2bo106bob o$110b2o106bo$217b2o2$164b2o$164b2o$188b2o$188bobo$190bo$24b2o164b2o$ 23bobo$24bo4$132bo4b2o$131bobo2bobo7b2o$130bo2b4o9bo$26b2obo100bobo4bo 6bobo$26bob2o99b2ob2o2b2o6b2o$127bo$19b2o103bo2b4ob2o$19b2o103b3o3bob 2o$127bo40b2o$126b2o39bobo$52b2o103bo9bo$52b2o49b2o52b3o5b3o54b2o$104b o55bo3bo57b2o$91bo11bo55b2o3b2o$9b2o39b2o39b3o9b2o$10bo39b2o42bo$10bob o24b2o42b2o10b2o$11b2o25bo43bo150b2o$38bobo41bobo91b2o55bo$39b2o42b2o 91b2o53bobo$35b2o69b2o123b2o$35b2o69b2o75bob2o$29b2o152b2obo$29bo188b 2o$27bobo187bobo$27b2o109b2o77bo$132b2o4bobo75b2o$133bo6bo38b2o$48b2o 66b2o12b3o7b2o37bobo$48b2o47b2o18bo12bo50bo$97bo16b3o36b2o26b2o$59b2o 37b3o13bo39bo$58bo2bo38bo50b3o3bob2o59b2o$58bobo23b2o65bo2b4ob2o58bobo $59bo20bo3b2o68bo64bo$79bobo73b3ob2o57b2o$7b2o69bobo76b2o2bo$7b2o17b2o 50bo81b2o84bo$26b2o49b2o165b3o$243bo$41b2o200b2o$41b2o2$219bo$219b3o$ 222bo$221b2o23b2o$243b2o2bo$243bob2o$245bo$245bo$220b2o18b2obob2o$219b obo18b2ob2o2bo$219bo26bo$218b2o20b2ob3o$241bobo$51bo189bo$12b2o35b3o 186b2ob2o$12b2o34bo189bobo$48b2o190bo$81bo158b2o$81b3o$17b2o65bo$17b2o 64b2o$13b2o$13b2o2$57b2o159b2o$19b2o36b2o158bobo$19b2o13b2o181bo$33bob o180b2o$33bo181bo$32b2o10b2o74bo94b3o$45bo72b3o97bo$42b3o9b2o61bo99b2o $42bo11bo20b2o40b2o17bo39bo$55bo20bo59b3o37b3o$54b2o17b3o63bo39bo$73bo 64b2o38b2o12bo$192b3o$159bo35bo19b2o$79b2o78b3o32b2o19b2o$78bobo81bo 76b2o$78bo82b2o11b2o63bobo$77b2o95b2o65bo$241b2o2$80b2o$81bo$78b3o$78b o$85b2o30b2o$86bo17b2o11b2o$83b3o19bo80b2o$83bo18b3o82bo$102bo81b3o$ 184bo2$153b2o$147b2o5bo20b2o13b2o$147bobob3o21bobo11bobo$140b2o7bobo 25bo11bo$140b2o7b2o26b2o9b2o3$191b2o$192bo$189b3o19b2o21b2o$189bo20bob o21b2o$196b2o12bo17b2o$197bo11b2o17b2o$194b3o$194bo$230b2o$223b2o5b2o$ 223b2o5$89b2o$89b2o8$63bo$62bobo$62bobo$61b2ob2o16b2o$82b2o$61b2ob2o$ 62bob2o34b2o$60bo39bobo$60b2o40bo$102b2o2$68b2o$62b2o4b2o$61bobo27b2o$ 61bo29bobo$60b2o31bo$68b2o23b2o$68b2o$86b2o$82bo3b2o$74bo6bobo$73bobo 4bobo$74bo5bo$79b2o!""") head2c3=pattern("8b2o$3bo2bo2bo$3b6o2$3b6o$2bo6bo$2bo2b5o$obobo$2o2bo$4bo$3b2o!") body2c3=pattern("6bo$b6o$o$o2b6o$obo6bo$obo2b5o$b2obo$4bo$4bo$3b2o!") tail2c3=pattern("5b2o$5b2o2$b6o$o5bo$o2b3o$obo$o2bo$b2o!") wire2c3=head2c3(625,388) + tail2c3(2143,1905) for i in range(631,2142,6): # 251 body segments wire2c3+=body2c3(i,i-236) # first one at (631, 395) receiver2c3=pattern(""" 208bo$207bobo$208bo3$213b2o$188b2o23b2o$189bo31b2o$189bobo29bo$190b2o 27bobo$213b2o4b2o$213b2o2$179b2o$180bo40b2o$180bobo39bo$181b2o34b2obo$ 217b2ob2o$199b2o$199b2o16b2ob2o$218bobo$218bobo$219bo8$192b2o$192b2o8$ 55b2o$48b2o5b2o$48b2o$85bo$83b3o$50b2o17b2o11bo$50b2o17bo12b2o$44b2o 21bobo20bo$44b2o21b2o19b3o$87bo$87b2o3$90b2o9b2o26b2o7b2o$90bo11bo25bo bo7b2o$88bobo11bobo21b3obobo$88b2o13b2o20bo5b2o39bo$125b2o45b3o$175bo 14bo$95bo78b2o12b3o$41bo51b3o91bo$41b3o48bo94b2o$44bo47b2o$43b2o$186b 2o$167b2o17b2o$167b2o3$61b2o$61bo$59bobo42b2o$59b2o43b2o11b2o51b2o$ 117bo53bo$84b2o32b3o48bo$42b2o40bo35bo48b2o$42b2o15b2o24b3o85b2o$59bob o25bo12b2o38b2o32bo$61bo38bo39bo30b3o$61b2o38b3o37b3o27bo$103bo39bo3$ 42b2o$42bo$40bobo$40b2o4$57b2obo$57bob2o2$50b2o$50b2o122b2o$173bobo$ 173bo29b2o$172b2o29bobo$205bo$178b2o25b2o$177bobo4b2o$40b2o135bo7bo$ 41bo134b2o4b3o$41bobo138bo$42b2o146b2o$189bobo$189bo$188b2o$61bo$59b3o $58bo$58b2o$206b2o$182bo23bobo$63b2o117b3o23bo$63b2o120bo22b2o$184b2o 14b2o$200b2o$73b2o$73bo$71bobo$71b2o$34b2o$33bobo$33bo$32b2o2$44b2o$ 44b2o$160b2o7b2o30b2o$92b2o66b2o7bobo29bobo$92b2o45bo27bobob3o29bo$ 139b3o25b2o5bo28b2o$142bo30b2o$90b2o49b2o$49b2o39b2o$48bobo26b2o43bo$ 48bo29bo43b3o$47b2o29bobo44bo$79b2o43b2o11b2o$75b2o60b2o$75b2o4$177b2o 21b2o$66b2o108bobo21b2o$66bo109bo17b2o$64bobo21b2o85b2o17b2o$48b2o14b 2o22b2o$48b2o93b2o$52bo46b2o39b2o2bo2b2o47b2o$48b2o2b3o43bo2bo38b2obo 3bo41b2o5b2o$48b2o5bo42bobo23b2o17bobobo10b2o29b2o$54b2o43bo20bo3b2o 14b2obob2o12bo$119bobo12b2o4bo2bo12b3o$118bobo13b2o6b2o12bo$67b2o49bo$ 66bobo48b2o$67bo$81b2o$81b2o4$47b2o$47b2o5$49bo$19b2o28b3o$12b2o5b2o 31bo92bo$12b2o37b2o90b3o11bo$47b2o93bo14b3o$47bo94b2o16bo14bo$14b2o33b o109b2o12b3o$14b2o32b2o69bo52bo$8b2o109b3o50b2o$8b2o112bo$121b2o$171b 2o$152b2o17b2o$45b2o105b2o$45b2o17b2o$64b2o3$65b2o$65bo89b2o$52b2o12b 3o41bo23b2o20bo$35b2o16bo14bo40bobo22bo19bo$35bo14b3o57bo14b2o8b3o16b 2o$28bo7b3o11bo74bo11bo20b2o$26b3o9bo87b3o30bo$25bo102bo27b3o$25b2o 129bo$17b2o93b2o$17b2o92bobo$111bo$110b2o62b2o$126b2obo44bobo$126bob2o 46bo$176b2o$34b2o83b2o$34bo84b2o$32bobo$32b2o3$166b2o$166b2o2$157b2obo $157bob2o2$36b2o$36bobo$38bo91b2o44b2o$38b2o90bo44bobo$28b2o98bobo44bo $28b2o98b2o44b2o$9bob2o$9b2obo2$18b2o135b2o$18b2o136bo$156bobo$157b2o 15b2o$114b2o58b2o$114bo2b2o$115b2obo$116bo40b2o$28b2o86bobo4b2o31bobo$ 28bo88b2o5bo31bo$26bobo94bo31b2o$26b2o68b2o25b2o$70bo25bo$58bo11b3o21b obo$56b3o14bo20b2o$40bo14bo16b2o$40b3o12b2o70b2o44b2o$43bo58b2o24bo44b o$4b2o36b2o59bo13b2o6b3o46b3o$5bo97bobo11b2o6bo50bo$5bobo96b2o$3b2ob2o 35b2o$2bobo38b2o17b2o$2bobo57b2o$b2ob2o20b2o$bo24bo$2bob2o18bobo108b2o $obob2o18b2o109b2o$2o$59b2o32b2o$59bo20b2o11b2o$24b2o35bo19bo67b2o21b 2o$24bobo33b2o16b3o67bobo21b2o$26bo29b2o20bo53b2o14bo17b2o$26b3o27bo 75bo14b2o17b2o$29bo27b3o37b2o14b2o3b2o13bo$28b2o29bo38bo15bo3bo13b2o$ 95b3o13b3o5b3o46b2o$95bo15bo9bo39b2o5b2o$161b2o4$18b2o$18b2o2$9b2o$10b o$7b3o45b2o$7bo47b2o$15b2o32b2o$15bo33b2o$16bo$15b2o$51b2o$44b2o5b2o$ 44b2o!""") inserter2c3=pattern(""" 51bo$49b3o$23b2o23bo$24bo23b2o$24bobo$25b2o2b2o37bo$29b2o35b3o15bo9bo$ 65bo18b3o5b3o$52b2o11b2o20bo3bo$52b2o32b2o3b2o8$23b2o52b2o$22bobo16b2o 34b2o$22bo18bobo45b2o$21b2o20bo44bo2bo$37b2o4b2o44b2o4b2o$37bo2bo54bob o$39b2o56bo$30b2o65b2o$30b2o20b2o33b2o$53bo34bo$50b3o32b3o$50bo34bo2$ 19bo$19b3o$22bo$21b2o2$85b2o$85bo$86b3o$88bo2$40b2o$40bo$38bobo$38b2o 12$20b2o15b2o$19bobo15b2o$19bo$18b2o6$25bo$25b3o$28bo$27b2o28b2o$57bo$ 55bobo$51b2o2b2o$51b2o4$50b2o4b2o$50b2o4b2o5$23b2o35bo$22bobo33b3o$22b o34bo$21b2o34b2o$25b2o$25b2o3bo$29bobo6b2o$30bobo5b2o$32bo$32b2o$24b2o $25bo$25bobo$26b2o2b2o$30b2o32b2o$64b2o4$59b2o$59b2o$63b2o$63b2o3$24b 2o31b2o$23bobo16b2o13b2o$23bo18bobo$22b2o20bo$38b2o4b2o$38bo2bo$40b2o$ 31b2o$31b2o7$21b2o$22bo$22bobo$23b2o$39bo$37b3o$36bo$36b2o3$10b2o$10b 2o7$43b2o$43b2o4$38b2o$38b2o$2o40b2o$2o40b2o3$36b2o$21b2o13b2o$21bobo$ 23bo$23b2o!""") all=highway_robber(86,0) + connecting_neck(195,262) + transmitter2c3(347,219) \ + wire2c3 + receiver2c3(2103,1763) + inserter2c3(2024,2042) while g.numlayers()>1: g.dellayer() all.display("Stable Pseudo-Heisenburp Device") g.setmag(0) setposint(120,200) g.setname("Highway Robber") g.clone() g.setname("2c/3 Transmitter") setposint(500,400) g.clone() g.setname("2c/3 Receiver") setposint(2175,2000) g.clone() g.setname("Stable Pseudo-Heisenburp Device") g.clone() g.setname("Glider Fleet") setposint(330,290) # since the tiles change size depending on how many layers have been created, # have to create all five layers before checking visibility of components -- # now go back and check that the critical areas are all visible: g.setlayer(0) while not g.visrect([100,100,150,175]): g.setmag(g.getmag()-1) g.setlayer(1) while not g.visrect([350,225,400,350]): g.setmag(g.getmag()-1) g.setlayer(2) while not g.visrect([2100,1750,225,300]): g.setmag(g.getmag()-1) g.setlayer(3) g.fit() g.setlayer(4) while not g.visrect([0,200,300,400]): g.setmag(g.getmag()-1) g.update() # ----------------------------------------------------- def show_status_text(s, d, t): if d==-1: if t==1: g.show(s + "Speed is " + str(t) + " tick per step.") else: g.show(s + "Speed is " + str(t) + " ticks per step.") else: g.show(s + "Delay between ticks is " + str(d) + " seconds.") # ----------------------------------------------------- # if there are multiple layers, get permission to remove them if g.numlayers() > 1: answer = g.getstring("All existing layers will be removed. OK?") if lower(answer[:1]) == "n": g.exit() oldswitch = g.setoption("switchlayers", True) # allow user to switch layers oldtile = g.setoption("tilelayers", True) rule() try: burp() finally: # remove the cloned layers added by the script while g.numlayers() > 1: g.dellayer() g.setname("Stable Pseudo-Heisenburp Device") g.setoption("tilelayers", oldtile) g.setoption("switchlayers", oldswitch) g.show("") golly-3.3-src/Scripts/Python/life-integer-gun30.py0000644000175000017500000000315212026730263017003 00000000000000# Based on text_test.py from PLife (http://plife.sourceforge.net/). # Universal* font described by Eric Angelini on SeqFan list # Construction universality* demonstrated by Dean Hickerson # # Integers can be written in this font that stabilize into # (almost*) any Life pattern known to be glider-constructible. # # * Possible caveats involve a very small percentage # (possibly zero percent!) of glider constructions -- in # particular, constructions that require large numbers # of very closely spaced gliders. The existence of objects # whose constructions require non-integer-constructable # closely-packed fleets of gliders is an open question; # no such objects are currently known. from glife.text import * rule() all = make_text (""" 411-31041653546-11-31041653546-1144444444444444444444444444444 31041653546-11-31041653546-11444444444444444-31041653546-11 31041653546-11444444444444444444-31041653546-11-31041653546 111444444444444-15073-114444-5473-11444444444-2474640508-444444 2474640508-444444444444444444444-2474640508-444444-2474640508-4444 2474640508-444444-2474640508-4444444444444444444444-2474640508 444444-2474640508-414-7297575-114-9471155613-414444444444 31041653546-11-2534474376-1-9471155613-414444444444-31041653546-114 7297575-114-9471155613-414444444444-31041653546-114-7297575-118 9471155613-414444444444-31041653546-18-6703-1444-107579-1114444 2474640508-51-947742-414444444441-947742-414444444444-2474640508 51-947742-414444444441-947742-41444-2474640508-51-947742-414 2474640508-414444444444444-2474640508-51-947742-414444444441 947742-414""","EAlvetica") all.display ("Eric Angelini integer glider gun") golly-3.3-src/Scripts/Python/Rule-Generators/0000755000175000017500000000000013543257426016234 500000000000000golly-3.3-src/Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py0000644000175000017500000003266112112261643022420 00000000000000# Generator for AbsoluteTurmites rules. Also known as 2D Turing machines. # # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * dirs=['N','E','S','W'] opposite_dirs = [ 2, 3, 0, 1 ] prefix = 'AbsoluteTurmite' # N.B. All 'relative' Turmites (including Langton's ant and the n-Color family) # can be expressed as Absolute Turmites but require 4n states instead of n. # e.g. {{{1,'E',1},{0,'W',3}},{{1,'S',2},{0,'N',0}},{{1,'W',3},{0,'E',1}},{{1,'N',0},{0,'S',2}}} # is a 4-state 2-color Absolute Turmite that matches Langton's ant # Likewise all normal 1D Turing machines can be expressed as Absolute Turmites in a # straightforward fashion. # e.g. {{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}} # is a 2-state 2-color busy beaver # In both cases the opposite transform is usually not possible. Thus Absolute Turmites # are a deeper generalization. # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] example_spec = "{{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}}" # Generate a random rule, filtering out the most boring import random ns = 3 nc = 2 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_state = random.randint(0,ns-1) new_color = random.randint(0,nc-1) dir_to_move = dirs[random.randint(0,3)] example_spec += '{' + str(new_color) + ",'" + dir_to_move + "'," + str(new_state) + '}' example_spec += '}' example_spec += '}' # is rule acceptable? is_rule_acceptable = True action_table = eval(example_spec.replace('{','[').replace('}',']')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # 1-move lookahead: will turmite zip off when placed on 0? for state in range(ns): if action_table[state][0][2] == state: is_rule_acceptable = False # turmite must write each colour at least once for color in range(nc): if not "{"+str(color)+"," in example_spec: is_rule_acceptable = False # does turmite move in all directions? for dir in dirs: if not "'"+dir+"'" in example_spec: is_rule_acceptable = False if is_rule_acceptable: break spec = golly.getstring( '''This script will create an AbsoluteTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the turmite to move: 'NESW' c: the new internal state of the turmite Example: {{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}} (example pattern #1) Has 2 states and 2 colors. The triple {1,'W',0} says: 1. set the color of the square to 1 2. move West 3. adopt state 0 and move forward one square This is a 1D busy beaver Enter specification string: (default is a random example)''', example_spec, 'Enter Absolute Turmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('{','[').replace('}',']')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of turmites is given by the # "encoding" section below.) n_dirs = 4 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s): # turmite on color c in state s return n_colors + n_states*c + s # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(str,flatten(action_table)))) # (ambiguous but we have to try something) rule_name = prefix+'_'+spec_string remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): moveset = action_table[state][color][1] for iMove,move in enumerate(dirs): if not move in moveset: not_arriving_from_here[opposite_dirs[iMove]] += [encode(color,state)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state)] tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: moveset = action_table[state][color][1] if dirs[opposite_dirs[dir]] in moveset: # e.g. is there one to the S about to move N inputs += [encode(color,state)] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) tree.write(golly.getdir('rules')+rule_name+'.tree') # Write some colour icons so we can see what the turmite is doing # A simple ball drawing, with specular highlights (2) and anti-aliasing (3): icon31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0], [0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,3,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0], [0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] icon15x15 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,3,3,3,0,0,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,3,0,0,0,0], [0,0,0,3,1,1,1,1,1,1,1,3,0,0,0], [0,0,3,1,1,2,1,1,1,1,1,1,3,0,0], [0,0,1,1,2,1,1,1,1,1,1,1,1,0,0], [0,3,1,1,2,1,1,1,1,1,1,1,1,3,0], [0,3,1,1,1,1,1,1,1,1,1,1,1,3,0], [0,3,1,1,1,1,1,1,1,1,1,1,1,3,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,0,3,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,0,3,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,0,0,3,3,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] icon7x7 = [ [0,0,3,3,3,0,0], [0,3,1,1,1,3,0], [3,1,2,1,1,1,3], [3,1,1,1,1,1,3], [3,1,1,1,1,1,3], [0,3,1,1,1,3,0], [0,0,3,3,3,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] highlight=(255,255,255) pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for row in range(31): for column in range(31): pixels[row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon31x31[row][column]] for row in range(15): for column in range(15): pixels[31+row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon15x15[row][column]] for row in range(7): for column in range(7): pixels[46+row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon7x7[row][column]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # now we can switch to the new rule golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/HexTurmite-gen.py0000644000175000017500000007504712112261643021373 00000000000000# Generator for Hexagonal Turmite rules import golly import random import string from glife.EmulateHexagonal import * from glife.WriteRuleTable import * # AKT: Python 2.3 doesn't have "set" built-in try: set except NameError: from sets import Set as set prefix = 'HexTurmite' turns = [1,2,4,8,16,32] # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) example_spec = '{{{1, 2, 0}, {0, 1, 0}}}' import random ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = turns[random.randint(0,len(turns)-1)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(string.replace(string.replace(example_spec,'}',']'),'{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][1] in [1,32]: # forward, u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==32 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break ''' Some interesting rules, mostly discovered through random search: 1-state 2-color: In search of Langton's ant: {{{1,4,0},{0,2,0}}} : with gentle turns we get the same as on the triangular grid (symmetric) # (by only allowing gentle turns of course a hex grid is the same as a tri grid) {{{1,16,0},{0,8,0}}} : with sharp turns we get a period-8 glider {{{1,16,0},{0,2,0}}} : with one sharp and one gentle turn we get a pleasing chaos, with a highway after ~5million steps {{{1,4,0},{0,8,0}}} : the other way round. You'd think it would be the same but no highway so far (30million steps) 2-state 2-color rules: {{{1,8,1},{1,1,0}},{{1,8,0},{1,2,0}}} - iceskater makes a thick highway after 40k its {{{1,2,1},{1,1,0}},{{1,4,1},{1,16,0}}} - loose loopy growth {{{1,2,0},{1,16,1}},{{1,1,0},{1,1,1}}} - frustrated space filler {{{1,4,1},{1,1,0}},{{1,1,0},{1,1,1}}} - katana: a 2-speed twin-highway {{{1,4,0},{1,8,1}},{{1,2,0},{1,16,0}}} - highway after 300k its 3-state 2-color rules: {{{1,1,2},{1,4,2}},{{1,2,0},{1,1,2}},{{1,32,0},{1,1,1}}} - shuriken iceskater makes a twin-highway after a few false starts {{{1,16,2},{1,2,2}},{{1,8,0},{1,1,1}},{{1,2,1},{1,4,0}}} - similar 2-state 3-color rules: {{{2,16,1},{2,16,0},{1,8,1}},{{1,32,1},{2,4,0},{1,2,0}}} - loose growth {{{1,1,1},{2,32,1},{1,8,1}},{{2,8,0},{2,16,1},{1,1,0}}} - loose geode growth ''' spec = golly.getstring( '''This script will create a HexTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=Forward, 2=Left, 4=Right, 8=Back-left, 16=Back-right, 32=U-turn) c: the new internal state of the Turmite Example: {{{1, 4, 0}, {0, 2, 0}}} Has 1 state and 2 colors. The triple {1,4,0} says: 1. set the color of the square to 1 2. turn right (4) 3. adopt state 0 and move forward one square This is the equivalent of Langton's Ant. Enter string: ''', example_spec, 'Enter HexTurmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(string.replace(string.replace(spec,'}',']'),'{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 6 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing away from direction d return n_colors + n_dirs*(n_states*c + s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = '_'.join(map(str,flatten(action_table))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[0,1,2,3,4,5], # forward 2:[1,2,3,4,5,0], # left 4:[5,0,1,2,3,4], # right 8:[2,3,4,5,0,1], # back-left 16:[4,5,0,1,2,3], # back-right 32:[3,4,5,0,1,2], # u-turn } not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in turns: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) \ for turn in turns if turn&turnset] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s,dir)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s,dir)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table: #WriteRuleTable('hexagonal',total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') HexagonalTransitionsToRuleTree('hexagonal',total_states,transitions,rule_name) # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] width = 31*(total_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]]] big = [[[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,2,1,2,1,2,1,1,1,1,1], [0,0,0,0,1,1,2,2,2,1,1,1,1,1,1], [0,0,0,0,0,0,1,2,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,2,1,1,1,1,1,1,1,0,0,0], [0,1,1,2,1,1,1,1,1,1,1,1,1,0,0], [0,0,2,2,2,2,2,2,2,1,1,1,1,0,0], [0,0,1,2,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,2,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,2,2,2,2,1,1,1,0,0,0,0,0,0], [1,1,2,2,1,1,1,1,1,1,1,0,0,0,0], [1,1,2,1,2,1,1,1,1,1,1,1,0,0,0], [0,1,2,1,1,2,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,2,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,2,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,2,1,0,0,0,0,0,0], [1,1,1,1,1,1,2,2,2,1,1,0,0,0,0], [1,1,1,1,1,2,1,2,1,2,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,2,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,2,1,0,0], [0,0,1,1,1,1,2,2,2,2,2,2,2,0,0], [0,0,1,1,1,1,1,1,1,1,1,2,1,1,0], [0,0,0,1,1,1,1,1,1,1,2,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,2,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,2,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,2,1,1,2,1,0], [0,0,0,1,1,1,1,1,1,1,2,1,2,1,1], [0,0,0,0,1,1,1,1,1,1,1,2,2,1,1], [0,0,0,0,0,0,1,1,1,2,2,2,2,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]]] small = [[[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,2,1,1,0], [0,1,1,2,1,1,0], [0,1,2,2,2,1,1], [0,0,1,2,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,1,1,1,0], [0,2,2,2,2,1,0], [0,1,2,1,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,2,2,1,1,0,0], [1,2,2,1,1,1,0], [0,1,1,2,1,1,0], [0,1,1,1,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,2,1,0,0], [1,1,2,2,2,1,0], [0,1,1,2,1,1,0], [0,1,1,2,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,1,2,1,0], [0,1,2,2,2,2,0], [0,1,1,1,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,1,1,1,0], [0,1,1,2,1,1,0], [0,1,1,1,2,2,1], [0,0,1,1,2,2,1], [0,0,0,0,1,1,0]]] for color in range(n_colors): bg = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = [palette[0],bg,bg][huge[0][row][column]] for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = [palette[0],bg,bg][big[0][row][column]] for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = [palette[0],bg,bg][small[0][row][column]] for state in range(n_states): fg = palette[n_colors+state] for dir in range(n_dirs): # draw the 31x31 icon for row in range(31): for column in range(31): pixels[row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][huge[dir][row][column]] # draw the 15x15 icon for row in range(15): for column in range(15): pixels[31+row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][big[dir][row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): pixels[46+row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][small[dir][row][column]] # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # -- select the new rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/Langtons-Ant-gen.py0000644000175000017500000002563312112261643021576 00000000000000# generator for Langton's Ant rules # inspired by Aldoaldoz: http://www.youtube.com/watch?v=1X-gtr4pEBU # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * opposite_dirs=[2,3,0,1] # index of opposite direction # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing direction d return n_colors + n_dirs*(n_states*c+s) + d prefix = 'LangtonsAnt' # (We choose a different name to the inbuilt Langtons-Ant rule to avoid # name collision between the rules we output and the existing icons.) spec = golly.getstring( '''This script will create a Langton's Ant CA for a given string of actions. The string specifies which way to turn when standing on a square of each state. Examples: RL (Langton's Ant), RLR (Chaos), LLRR (Cardioid), LRRL (structure) Permitted moves: 'L':Left, 'R':Right, 'U':U-turn, 'N':No turn Enter string:''', 'RL', 'Enter string:') n_colors = len(spec) d={'R':'2','L':'8','U':'4','N':'1'} # 1=noturn, 2=right, 4=u-turn, 8=left turmite_spec = "{{"+','.join(['{'+str((i+1)%n_colors)+','+d[spec[i]]+',0}' for i in range(n_colors)])+"}}" rule_name = prefix+'_'+spec action_table = eval(turmite_spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_dirs=4 # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) total_states = n_colors+n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states>255: golly.warn("Number of states required exceeds Golly's limit of 255\n\nMaximum 51 turns allowed.") golly.exit() # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,3,0,1], # no turn 2:[1,2,3,0], # right 4:[0,1,2,3], # u-turn 8:[3,0,1,2], # left } remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4,8]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) for turn in [1,2,4,8] if turn&turnset] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s,opposite_dirs[dir]) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) tree.write(golly.getdir('rules')+rule_name+'.tree') # Create some multi-colour icons so we can see what the ant is doing # Andrew's ant drawing: (with added eyes (2) and anti-aliasing (3)) ant31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,2,2,1,1,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,3,1,1,1,3,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant15x15 = [[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,2,1,2,0,0,0,0,0,0], [0,0,0,1,0,0,1,1,1,0,0,1,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,0,0,0,1,0,0,0,1,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,1,0,0,3,1,3,0,0,1,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant7x7 = [ [0,1,0,0,0,1,0], [0,0,2,1,2,0,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] eyes = (255,255,255) rotate4 = [ [[1,0],[0,1]], [[0,-1],[1,0]], [[-1,0],[0,-1]], [[0,1],[-1,0]] ] offset4 = [ [0,0], [1,0], [1,1], [0,1] ] pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): for dir in range(n_dirs): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for x in range(31): for y in range(31): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*30 row = rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*30 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant31x31[y][x]] for x in range(15): for y in range(15): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*14 row = 31 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*14 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant15x15[y][x]] for x in range(7): for y in range(7): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*6 row = 46 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*6 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant7x7[y][x]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # now we can switch to the new rule golly.new(rule_name+' demo') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,n_colors+3) # start with an ant facing west golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/icon-importer.py0000644000175000017500000004635412146034627021323 00000000000000# Import any icons for the current rule so the user can edit them # and when finished run icon-exporter.py. # Author: Andrew Trevorrow (andrew@trevorrow.com), Feb 2013. import golly as g from glife import getminbox, pattern from glife.text import make_text from glife.BuiltinIcons import circles, diamonds, hexagons, triangles from colorsys import hsv_to_rgb import os iconinfo31 = [] # info for 31x31 icons iconinfo15 = [] # info for 15x15 icons iconinfo7 = [] # info for 7x7 icons iconcolors = [] # list of (r,g,b) colors used in ALL icon sizes colorstate = {} # dictionary for mapping (r,g,b) colors to cell states # -------------------------------------------------------------------- def parse_hex(hexstr): # parse a string like "FF00EE" or "FFFF0000EEEE" R, G, B = (0, 0, 0) if len(hexstr) == 6: R = int(hexstr[0:2],16) G = int(hexstr[2:4],16) B = int(hexstr[4:6],16) elif len(hexstr) == 12: # only use upper 2 hex digits R = int(hexstr[0:2],16) G = int(hexstr[4:6],16) B = int(hexstr[8:10],16) else: g.warn("Unexpected hex string: " + hexstr) return (R,G,B) # -------------------------------------------------------------------- def use_builtin_icons(shape): global iconinfo31, iconinfo15, iconinfo7, iconcolors if shape == "circles": lines = circles.split('\n') if shape == "diamonds": lines = diamonds.split('\n') if shape == "hexagons": lines = hexagons.split('\n') if shape == "triangles": lines = triangles.split('\n') xpmcount = 0 width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 iconinfo = [] colordict = {} iconcolors = [] for line in lines: if line == "XPM": xpmcount = 1 iconinfo = [] colordict = {} elif xpmcount > 0 and line[0] == "\"": # extract the stuff inside double quotes, ignoring anything after 2nd one line = line.lstrip("\"").split("\"")[0] if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) iconinfo.append(width) iconinfo.append(height) iconinfo.append(num_colors) iconinfo.append(chars_per_pixel) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) if not rgb in iconcolors: iconcolors.append(rgb) colordict[key] = rgb if xpmcount == 1 + num_colors: iconinfo.append(colordict) elif xpmcount <= 1 + num_colors + height: # simply append pixel data in line like "......AAA......" iconinfo.append(line) if xpmcount == 1 + num_colors + height: if width == 31: iconinfo31 = iconinfo if width == 15: iconinfo15 = iconinfo if width == 7: iconinfo7 = iconinfo xpmcount = 0 # skip any extra lines else: xpmcount += 1 # -------------------------------------------------------------------- def import_icons(rulename): global iconinfo31, iconinfo15, iconinfo7, iconcolors # replace any illegal filename chars with underscores rulename = rulename.replace("/","_").replace("\\","_") rulepath = g.getdir("rules") + rulename + ".rule" if not os.path.isfile(rulepath): rulepath = g.getdir("app") + "Rules/" + rulename + ".rule" if not os.path.isfile(rulepath): # there is no .rule file return try: # open in universal newline mode to handle LF, CR, or CR+LF rulefile = open(rulepath,"rU") except: g.exit("Failed to open .rule file: " + rulepath) foundicons = False xpmcount = 0 width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 iconinfo = [] colordict = {} iconcolors = [] # WARNING: The code below must agree with how Golly looks for icon info # (see LoadRuleInfo and ParseIcons in wxlayer.cpp). In particular, if # there are multiple @ICONS sections then only the 1st one is used. for line in rulefile: if foundicons and line.startswith("@"): # start of another section (possibly another @ICONS section) break line = line.rstrip("\n") if line == "@ICONS": foundicons = True elif foundicons and line == "XPM": xpmcount = 1 iconinfo = [] colordict = {} elif foundicons and line in ("circles","diamonds","hexagons","triangles"): use_builtin_icons(line) # don't break (agrees with Golly) elif xpmcount > 0 and line[0] == "\"": # extract the stuff inside double quotes, ignoring anything after 2nd one line = line.lstrip("\"").split("\"")[0] if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) iconinfo.append(width) iconinfo.append(height) iconinfo.append(num_colors) iconinfo.append(chars_per_pixel) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) if not rgb in iconcolors: iconcolors.append(rgb) colordict[key] = rgb if xpmcount == 1 + num_colors: iconinfo.append(colordict) elif xpmcount <= 1 + num_colors + height: # simply append pixel data in line like "......AAA......" iconinfo.append(line) if xpmcount == 1 + num_colors + height: if width == 31: iconinfo31 = iconinfo if width == 15: iconinfo15 = iconinfo if width == 7: iconinfo7 = iconinfo xpmcount = 0 # skip any extra lines else: xpmcount += 1 rulefile.close() # -------------------------------------------------------------------- def check_for_shared_rule(rulename): # rulename has at least one hyphen so get all chars before the last hyphen prefix = rulename.rsplit('-',1)[0] # replace any illegal filename chars with underscores filename = prefix.replace("/","_").replace("\\","_") + "-shared.rule" rulepath = g.getdir("rules") + filename if not os.path.isfile(rulepath): rulepath = g.getdir("app") + "Rules/" + filename if not os.path.isfile(rulepath): # there is no prefix-shared.rule file return "" # ask user if they would prefer to edit icons in shared file sharedname = prefix + "-shared" try: answer = g.getstring("There are no icons in " + rulename + ".rule.\n" + "Would you prefer to edit the icons in " + sharedname + ".rule?", "Yes", "Edit icons in shared rule?") except: # user hit Cancel (which would normally abort script) return "" if len(answer) == 0 or (answer[0] != "Y" and answer[0] != "y"): return "" return sharedname # user said Yes # -------------------------------------------------------------------- def draw_line(x1, y1, x2, y2, state = 1): # draw a line of cells in given state from x1,y1 to x2,y2 g.setcell(x1, y1, state) if x1 == x2 and y1 == y2: return dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: g.setcell(x1, y1, state) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: g.setcell(x1, y1, state) if d >= 0: x1 += sx d -= ay y1 += sy d += ax g.setcell(x2, y2, state) # -------------------------------------------------------------------- def color_text(string, extrastate): t = make_text(string, "mono") bbox = getminbox(t) # convert two-state pattern to multi-state and set state to extrastate mlist = [] tlist = list(t) for i in xrange(0, len(tlist), 2): mlist.append(tlist[i]) mlist.append(tlist[i+1]) mlist.append(extrastate) if len(mlist) % 2 == 0: mlist.append(0) p = pattern(mlist) return p, bbox.wd, bbox.ht # -------------------------------------------------------------------- def init_colors(): global iconcolors, colorstate if len(iconcolors) > 240: g.exit("The imported icons use too many colors!") # start with gradient from white to black (this makes it easier to # copy grayscale icons from one rule to another rule) s = 1 g.setcolors([s,255,255,255]) colorstate[(255,255,255)] = s s += 1 graylevel = 256 while graylevel > 0: graylevel -= 32 g.setcolors([s, graylevel, graylevel, graylevel]) colorstate[(graylevel, graylevel, graylevel)] = s s += 1 # now add all the colors used in the imported icons (unless added above) for rgb in iconcolors: if not rgb in colorstate: R,G,B = rgb g.setcolors([s,R,G,B]) colorstate[rgb] = s s += 1 # finally add rainbow colors in various shades (bright, pale, dark) for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 1.0, 1.0) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 0.5, 1.0) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 1.0, 0.5) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 # return the 50% gray state (used for drawing boxes and text) return colorstate[(128,128,128)] # -------------------------------------------------------------------- def draw_icon_boxes(numicons, linestate): for i in xrange(numicons): x = -1 + i*32 y = -1 # draw boxes for 31x31 icons draw_line(x, y, x, y+32, linestate) draw_line(x, y, x+32, y, linestate) draw_line(x+32, y, x+32, y+32, linestate) draw_line(x, y+32, x+32, y+32, linestate) # draw boxes for 15x15 icons draw_line(x, y+32, x, y+32+16, linestate) draw_line(x, y+32+16, x+16, y+32+16, linestate) draw_line(x+16, y+32, x+16, y+32+16, linestate) # draw boxes for 7x7 icons draw_line(x, y+32+16, x, y+32+16+8, linestate) draw_line(x, y+32+16+8, x+8, y+32+16+8, linestate) draw_line(x+8, y+32+16, x+8, y+32+16+8, linestate) # show state number above top row of icons t, twd, tht = color_text(str(i+1), linestate) t.put(x + 32/2 - twd/2, y - 2 - tht) # -------------------------------------------------------------------- def draw_icons(iconinfo, transparent): global colorstate if len(iconinfo) == 0: return width = iconinfo[0] height = iconinfo[1] num_colors = iconinfo[2] chars_per_pixel = iconinfo[3] colordict = iconinfo[4] pos = 5 numicons = height/width for i in xrange(numicons): x = i*32 y = 0 if width == 15: y = 32 if width == 7: y = 48 for row in xrange(width): pxls = iconinfo[pos] pos += 1 for col in xrange(width): offset = col*chars_per_pixel key = pxls[offset : offset + chars_per_pixel] if not key in colordict: g.exit("Unexpected key in icon data: " + key) rgb = colordict[key] if rgb != transparent: g.setcell(x+col, y+row, colorstate[rgb]) # -------------------------------------------------------------------- def create31x31icons(): # scale up the 15x15 bitmaps into 31x31 bitmaps using a simple # algorithm that conserves any vertical or horizontal symmetry global iconinfo15 width = 15 middle = 7 # middle row or column in 15x15 icon height = iconinfo15[1] numicons = height/width for i in xrange(numicons): x = i*32 y = 32 for row in xrange(width): for col in xrange(width): state = g.getcell(x+col, y+row) if state > 0: if row == middle and col == middle: # expand middle cell into 9 cells xx = i*32+15 yy = 15 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx, yy-1, state) g.setcell(xx+1, yy, state) g.setcell(xx-1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx+1, yy-1, state) g.setcell(xx-1, yy+1, state) g.setcell(xx-1, yy-1, state) elif row == middle: # expand cell in middle row into 6 cells xx = i*32+col*2 yy = row*2 if col > middle: xx += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx, yy+2, state) g.setcell(xx+1, yy+2, state) elif col == middle: # expand cell in middle column into 6 cells xx = i*32+col*2 yy = row*2 if row > middle: yy += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx+2, yy, state) g.setcell(xx+2, yy+1, state) else: # expand all other cells into 4 cells xx = i*32+col*2 yy = row*2 if col > middle: xx += 1 if row > middle: yy += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) # -------------------------------------------------------------------- def create_smaller_icons(big, small): # scale down the big x big bitmaps into small x small bitmaps # using a simple sampling algorithm global iconinfo15, iconinfo31 if big == 15: numicons = iconinfo15[1] / 15 ybig = 32 else: # big = 31 numicons = iconinfo31[1] / 31 ybig = 0 if small == 7: y = 48 else: # small = 15 y = 32 sample = big / small offset = sample / 2 for i in xrange(numicons): x = i*32 for row in xrange(small): for col in xrange(small): state = g.getcell(x + offset + col*sample, ybig + offset + row*sample) if state > 0: g.setcell(x+col, y+row, state) # -------------------------------------------------------------------- def multi_color_icons(iconcolors): # return True if at least one icon color isn't a shade of gray for R,G,B in iconcolors: if R != G or G != B: return True # grayscale return False # -------------------------------------------------------------------- # check that a layer is available if g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # WARNING: changing this prefix will require same change in icon-exporter.py layerprefix = "imported icons for " if g.getname().startswith(layerprefix): g.exit("You probably meant to run icon-exporter.py.") g.addlayer() rulename = g.getrule().split(":")[0] # search for rulename.rule and import any icon data (also builds iconcolors) import_icons(rulename) if len(iconcolors) == 0 and ("-" in rulename) and not (rulename.endswith("-shared")): # rulename.rule has no icons and rulename contains a hyphen, so # check if prefix-shared.rule exists and ask user if they want to edit # the icons in that file sharedname = check_for_shared_rule(rulename) if len(sharedname) > 0: rulename = sharedname import_icons(rulename) iconnote = "" if len(iconcolors) == 0: iconnote = "There are currently no icons for this rule.\n\n" # check if icons are grayscale grayscale_icons = not multi_color_icons(iconcolors) g.new(layerprefix + rulename) livestates = g.numstates() - 1 deadcolor = g.getcolors(0) deadrgb = (deadcolor[1], deadcolor[2], deadcolor[3]) # switch to a Generations rule so we can have lots of colors g.setrule("//256") if grayscale_icons and deadrgb == (255,255,255): # if icons are grayscale and state 0 color was white then switch # to black background to avoid confusion (ie. we want black pixels # to be transparent) g.setcolors([0,0,0,0]) else: g.setcolors(deadcolor) graystate = init_colors() # if icons are grayscale then change deadrgb to black so that draw_icons # will treat black pixels as transparent if grayscale_icons: deadrgb = (0,0,0) draw_icon_boxes(livestates, graystate) draw_icons(iconinfo31, deadrgb) draw_icons(iconinfo15, deadrgb) draw_icons(iconinfo7, deadrgb) # create missing icons by scaling up/down the existing icons if len(iconinfo31) == 0 and len(iconinfo15) > 0: create31x31icons() iconnote += "The 31x31 icons were created by scaling up the 15x15 icons.\n\n" if len(iconinfo15) == 0 and len(iconinfo31) > 0: create_smaller_icons(31, 15) iconnote += "The 15x15 icons were created by scaling down the 31x31 icons.\n\n" if len(iconinfo7) == 0: if len(iconinfo15) > 0: create_smaller_icons(15, 7) iconnote += "The 7x7 icons were created by scaling down the 15x15 icons.\n\n" elif len(iconinfo31) > 0: create_smaller_icons(31, 7) iconnote += "The 7x7 icons were created by scaling down the 31x31 icons.\n\n" g.setoption("showlayerbar",True) g.setoption("showallstates",True) g.setoption("showicons",False) g.fit() g.update() g.note(iconnote + "Edit the icons and then run icon-exporter.py.") golly-3.3-src/Scripts/Python/Rule-Generators/RuleTableToTree.py0000644000175000017500000000316012112261643021513 00000000000000import golly import os from glife.ReadRuleTable import * from glife.RuleTree import * from glife.EmulateTriangular import * from glife.EmulateMargolus import * from glife.EmulateOneDimensional import * from glife.EmulateHexagonal import * # ask user to select .table file filename = golly.opendialog('Open a rule table to convert:', 'Rule tables (*.table)|*.table', golly.getdir('rules')) if len(filename) == 0: golly.exit() # user hit Cancel # add new converters here as they become available: Converters = { "vonNeumann":ConvertRuleTableTransitionsToRuleTree, "Moore":ConvertRuleTableTransitionsToRuleTree, "triangularVonNeumann":EmulateTriangular, "triangularMoore":EmulateTriangular, "Margolus":EmulateMargolus, "square4_figure8v":EmulateMargolus, "square4_figure8h":EmulateMargolus, "square4_cyclic":EmulateMargolus, "oneDimensional":EmulateOneDimensional, "hexagonal":EmulateHexagonal, } golly.show("Reading from rule table file...") n_states, neighborhood, transitions = ReadRuleTable(filename) if not neighborhood in Converters: golly.warn("Unsupported neighborhood: "+neighborhood) golly.show('') golly.exit() # all converters now create a .rule file golly.show("Building rule...") rule_name = Converters[neighborhood]( neighborhood, n_states, transitions, filename ) golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/make-ruletree.py0000644000175000017500000000414412112261643021256 00000000000000# Generates a rule tree using a given Python transition function # passed in via the clipboard. # Here's an example function for Conway's Life # (copy all the lines between the triple quotes): ''' # B3/S23: name = "LifeTest" n_states = 2 n_neighbors = 8 # order for 8 neighbors is NW, NE, SW, SE, N, W, E, S, C def transition_function(a): n = a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7] if n==2 and a[8]==1: return 1 if n==3: return 1 return 0 ''' # Another example, but using the vonNeumann neighborhood: ''' name = "ParityNWE" n_states = 5 n_neighbors = 4 # order for 4 neighbors is N, W, E, S, C def transition_function ( s ) : return ( s[0] + s[1] + s[2] ) % 5 ''' import golly from glife.RuleTree import * # exec() only works if all lines end with LF, so we need to convert # any Win line endings (CR+LF) or Mac line endings (CR) to LF CR = chr(13) LF = chr(10) try: exec(golly.getclipstr().replace(CR+LF,LF).replace(CR,LF)) MakeRuleTreeFromTransitionFunction( n_states, n_neighbors, transition_function, golly.getdir("rules")+name+".tree" ) # use name.tree to create name.rule (with no icons); # note that if name.rule already exists then we only replace the info in # the @TREE section to avoid clobbering any other info added by the user ConvertTreeToRule(name, n_states, []) golly.setalgo("RuleLoader") golly.setrule(name) golly.show("Created "+golly.getdir("rules")+name+".rule and switched to that rule.") except: import sys import traceback exception, msg, tb = sys.exc_info() golly.warn(\ '''To use this script, copy a Python format rule definition into the clipboard, e.g.: name = "ParityNWE" n_states = 5 n_neighbors = 4 # order for 4 neighbors is N, W, E, S, C def transition_function ( s ) : return ( s[0] + s[1] + s[2] ) % 5 For more examples, see the script file (right-click on it). ____________________________________________________ A problem was encountered with the supplied rule: '''+ '\n'.join(traceback.format_exception(exception, msg, tb))) golly.exit() golly-3.3-src/Scripts/Python/Rule-Generators/Turmite-gen.py0000644000175000017500000006706012112261643020722 00000000000000# Generator for Turmite rules # # Following work of Ed Pegg Jr. # specifically the Mathematica notebook linked-to from here: # http://www.mathpuzzle.com/26Mar03.html # # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * dirs=['N','E','S','W'] opposite_dirs=[2,3,0,1] # index of opposite direction turn={ # index of new direction 1:[0,1,2,3], # no turn 2:[1,2,3,0], # right 4:[2,3,0,1], # u-turn 8:[3,0,1,2], # left } prefix = 'Turmite' # N.B. Translating from Langtons-Ant-nColor to Turmite is easy: # e.g. LLRR is (1 state, 4 color) {{{1,8,0},{2,8,0},{3,2,0},{0,2,0}}} # but translating the other way is only possible if the Turmite has # exactly 1 state and only moves left or right EdPeggJrTurmiteLibrary = [ # source: http://demonstrations.wolfram.com/Turmites/ # Translated into his later notation: 1=noturn, 2=right, 4=u-turn, 8=left # (old notation was: 0=noturn,1=right,-1=left) # (all these are 2-color patterns) "{{{1, 2, 0}, {0, 8, 0}}}", # 1: Langton's ant "{{{1, 2, 0}, {0, 1, 0}}}", # 2: binary counter "{{{0, 8, 1}, {1, 2, 1}}, {{1, 1, 0}, {1, 1, 1}}}", # 3: (filled triangle) "{{{0, 1, 1}, {0, 8, 1}}, {{1, 2, 0}, {0, 1, 1}}}", # 4: spiral in a box "{{{0, 2, 1}, {0, 8, 0}}, {{1, 8, 1}, {0, 2, 0}}}", # 5: stripe-filled spiral "{{{0, 2, 1}, {0, 8, 0}}, {{1, 8, 1}, {1, 1, 0}}}", # 6: stepped pyramid "{{{0, 2, 1}, {0, 1, 1}}, {{1, 2, 1}, {1, 8, 0}}}", # 7: contoured island "{{{0, 2, 1}, {0, 2, 1}}, {{1, 1, 0}, {0, 2, 1}}}", # 8: woven placemat "{{{0, 2, 1}, {1, 2, 1}}, {{1, 8, 1}, {1, 8, 0}}}", # 9: snowflake-ish (mimics Jordan's ice-skater) "{{{1, 8, 0}, {0, 1, 1}}, {{0, 8, 0}, {0, 8, 1}}}", # 10: slow city builder "{{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 0}, {0, 8, 1}}}", # 11: framed computer art "{{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 1}, {1, 8, 0}}}", # 12: balloon bursting (makes a spreading highway) "{{{1, 8, 1}, {0, 8, 0}}, {{1, 1, 0}, {0, 1, 0}}}", # 13: makes a horizontal highway "{{{1, 8, 1}, {0, 8, 0}}, {{1, 2, 1}, {1, 2, 0}}}", # 14: makes a 45 degree highway "{{{1, 8, 1}, {0, 8, 1}}, {{1, 2, 1}, {0, 8, 0}}}", # 15: makes a 45 degree highway "{{{1, 8, 1}, {0, 1, 0}}, {{1, 1, 0}, {1, 2, 0}}}", # 16: spiral in a filled box "{{{1, 8, 1}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 17: glaciers "{{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}}", # 18: golden rectangle! "{{{1, 8, 1}, {1, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 19: fizzy spill "{{{1, 8, 1}, {1, 2, 1}}, {{1, 1, 0}, {0, 1, 1}}}", # 20: nested cabinets "{{{1, 1, 1}, {0, 8, 1}}, {{1, 2, 0}, {1, 1, 1}}}", # 21: (cross) "{{{1, 1, 1}, {0, 1, 0}}, {{0, 2, 0}, {1, 8, 0}}}", # 22: saw-tipped growth "{{{1, 1, 1}, {0, 1, 1}}, {{1, 2, 1}, {0, 1, 0}}}", # 23: curves in blocks growth "{{{1, 1, 1}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 24: textured growth "{{{1, 1, 1}, {0, 2, 1}}, {{1, 8, 0}, {1, 2, 0}}}", # 25: (diamond growth) "{{{1, 1, 1}, {1, 8, 0}}, {{1, 2, 1}, {0, 1, 0}}}", # 26: coiled rope "{{{1, 2, 0}, {0, 8, 1}}, {{1, 8, 0}, {0, 1, 1}}}", # 27: (growth) "{{{1, 2, 0}, {0, 8, 1}}, {{1, 8, 0}, {0, 2, 1}}}", # 28: (square spiral) "{{{1, 2, 0}, {1, 2, 1}}, {{0, 1, 0}, {0, 1, 1}}}", # 29: loopy growth with holes "{{{1, 2, 1}, {0, 8, 1}}, {{1, 1, 0}, {0, 1, 0}}}", # 30: Langton's Ant drawn with squares "{{{1, 2, 1}, {0, 2, 0}}, {{0, 8, 1}, {1, 8, 0}}}", # 31: growth with curves and blocks "{{{1, 2, 1}, {0, 2, 0}}, {{0, 1, 0}, {1, 2, 1}}}", # 32: distracted spiral builder "{{{1, 2, 1}, {0, 2, 1}}, {{1, 1, 0}, {1, 1, 1}}}", # 33: cauliflower stalk (45 deg highway) "{{{1, 2, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 2, 0}}}", # 34: worm trails (eventually turns cyclic!) "{{{1, 2, 1}, {1, 1, 0}}, {{1, 1, 0}, {0, 1, 1}}}", # 35: eventually makes a two-way highway! "{{{1, 2, 1}, {1, 2, 0}}, {{0, 1, 0}, {0, 1, 0}}}", # 36: almost symmetric mould bloom "{{{1, 2, 1}, {1, 2, 0}}, {{0, 2, 0}, {1, 1, 1}}}", # 37: makes a 1 in 2 gradient highway "{{{1, 2, 1}, {1, 2, 1}}, {{1, 8, 1}, {0, 2, 0}}}", # 38: immediately makes a 1 in 3 highway "{{{0, 2, 1}, {1, 2, 1}}, {{0, 8, 2}, {0, 8, 0}}, {{1, 2, 2}, {1, 8, 0}}}", # 39: squares and diagonals growth "{{{1, 8, 1}, {0, 1, 0}}, {{0, 2, 2}, {1, 8, 0}}, {{1, 2, 1}, {1, 1, 0}}}", # 40: streak at approx. an 8.1 in 1 gradient "{{{1, 8, 1}, {0, 1, 2}}, {{0, 2, 2}, {1, 1, 1}}, {{1, 2, 1}, {1, 1, 0}}}", # 41: streak at approx. a 1.14 in 1 gradient "{{{1, 8, 1}, {1, 8, 1}}, {{1, 1, 0}, {0, 1, 2}}, {{0, 8, 1}, {1, 1, 1}}}", # 42: maze-like growth "{{{1, 8, 2}, {0, 2, 0}}, {{1, 8, 0}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 1}}}", # 43: growth by cornices "{{{1, 2, 0}, {0, 2, 2}}, {{0, 8, 0}, {0, 2, 0}}, {{0, 1, 1}, {1, 8, 0}}}", # 44: makes a 1 in 7 highway "{{{1, 2, 1}, {0, 8, 0}}, {{1, 2, 2}, {0, 1, 0}}, {{1, 8, 0}, {0, 8, 0}}}", # 45: makes a 4 in 1 highway # source: http://www.mathpuzzle.com/Turmite5.nb # via: http://www.mathpuzzle.com/26Mar03.html # "I wondered what would happen if a turmite could split as an action... say Left and Right. # In addition, I added the rule that when two turmites met, they annihilated each other. # Some interesting patterns came out from my initial study. My main interest is finding # turmites that will grow for a long time, then self-annihilate." "{{{1, 8, 0}, {1, 2, 1}}, {{0, 10, 0}, {0, 8, 1}}}", # 46: stops at 11 gens "{{{1, 8, 0}, {1, 2, 1}}, {{1, 10, 0}, {1, 8, 1}}}", # 47: stops at 12 gens "{{{1, 15, 0}, {0, 2, 1}}, {{0, 10, 0}, {0, 8, 1}}}", # 48: snowflake-like growth "{{{1, 2, 0}, {0, 15, 0}}}", # 49: blob growth "{{{1, 3, 0}, {0, 3, 0}}}", # 50: (spiral) - like SDSR-Loop on a macro level "{{{1, 3, 0}, {0, 1, 0}}}", # 51: (spiral) "{{{1, 10, 0}, {0, 1, 0}}}", # 52: snowflake-like growth "{{{1, 10, 1}, {0, 1, 1}}, {{0, 2, 0}, {0, 0, 0}}}", # 53: interesting square growth "{{{1, 10, 1}, {0, 5, 1}}, {{1, 2, 0}, {0, 8, 0}}}", # 54: interesting square growth "{{{1, 2, 0}, {0, 1, 1}}, {{1, 2, 0}, {0, 6, 0}}}", # 55: growth "{{{1, 2, 0}, {1, 1, 1}}, {{0, 2, 0}, {0, 11, 0}}}", # 56: wedge growth with internal snakes "{{{1, 2, 1}, {0, 2, 1}}, {{1, 15, 0}, {1, 8, 0}}}", # 57: divided square growth "{{{1, 2, 0}, {2, 8, 2}, {1, 1, 1}}, {{1, 1, 2}, {0, 2, 1}, {2, 8, 1}}, {{0, 11, 0}, {1, 1, 1}, {0, 2, 2}}}", # 58: semi-chaotic growth with spikes "{{{1, 2, 0}, {2, 8, 2}, {2, 1, 1}}, {{1, 1, 2}, {1, 1, 1}, {1, 8, 1}}, {{2, 10, 0}, {2, 8, 1}, {2, 8, 2}}}" # 59: halts after 204 gens (256 non-zero cells written) ] # N.B. the images in the demonstration project http://demonstrations.wolfram.com/Turmites/ # are mirrored - e.g. Langton's ant turns left instead of right. # (Also example #45 isn't easily accessed in the demonstration, you need to open both 'advanced' controls, # then type 45 in the top text edit box, then click in the bottom one.) # just some discoveries of my own, discovered through random search TimHuttonTurmiteLibrary = [ # One-turmite effects: "{{{1,2,1},{0,4,1}},{{1,1,0},{0,8,0}}}", # makes a period-12578 gradient 23 in 29 speed c/340 highway (what is the highest period highway?) "{{{0,2,1},{0,8,0}},{{1,8,1},{1,4,0}}}", # makes a period-68 (speed c/34) glider (what is the highest period glider?) # (or alternatively, what are the *slowest* highways and gliders?) "{{{1,4,1},{1,2,1}},{{1,8,0},{1,1,1}}}", # another ice-skater rule, makes H-fractal-like shapes "{{{1,1,1},{0,2,1}},{{0,2,1},{1,8,0}}}", # period-9 glider "{{{1,2,1},{0,8,1}},{{1,4,0},{1,8,0}}}", # another ice-skater "{{{1,4,1},{1,8,1}},{{1,4,0},{0,1,0}}}", # Langton's ant (rot 45) on a 1 background but maze-like on a 0 background "{{{0,2,1},{0,8,1}},{{1,1,0},{1,8,1}}}", # slow ice-skater makes furry shape "{{{1,8,0},{1,1,1}},{{1,8,0},{0,2,1}}}", # busy beaver (goes cyclic) <50k "{{{0,8,1},{1,8,1}},{{1,2,1},{0,2,0}}}", # interesting texture "{{{1,1,1},{0,1,0}},{{1,2,0},{1,2,1}}}", # period-17 1 in 3 gradient highway (but needs debris to get started...) "{{{0,2,1},{1,8,1}},{{1,4,0},{0,2,1}}}", # period-56 speed-28 horizontal highway "{{{1,8,0},{0,1,1}},{{1,2,0},{1,8,0}}}", # somewhat loose growth # Some two-turmite rules below: (ones that are dull with 1 turmite but fun with 2) # Guessing this behaviour may be quite common, because turmites alternate between black-and-white squares # on a checkerboard. To discover these I use a turmite testbed which includes a set of turmite pairs as # starting conditions. "{{{1,4,0},{0,1,1}},{{1,4,1},{0,2,0}}}", # loose loopy growth (but only works with two ants together, e.g. 2,2) "{{{0,1,1},{0,4,0}},{{1,2,0},{1,8,1}}}", # spiral growth on its own but changing density + structure with 2 turmites, e.g. 2,2 "{{{1,2,1},{1,1,0}},{{1,1,0},{0,2,1}}}", # extender on its own but mould v. aerials with 2, e.g. 2,3 "{{{1,1,1},{0,8,1}},{{1,8,0},{0,8,0}}}", # together they build a highway ] ''' We can scale any tumite by a factor of N: (need n_states+N new states) e.g. for the turmite: "{{{1,2,0},{0,1,0}}}", # normal binary counter "{{{1,2,1},{0,1,1}},{{0,1,0},{0,0,0}}}", # scale 2 binary counter (sparse version) (Takes twice as long.) "{{{1,2,1},{0,1,1}},{{0,1,2},{0,0,0}},{{0,1,0},{0,0,0}}}", # scale 3 binary counter, etc. (Takes three times as long.) Note that the state 1+ color 1+ transitions are never used if started on a zero background - we set them to {0,0,0} (die) simply to make this clear. Or you can step these cells. Or redraw them. e.g. for Langton's ant: "{{{1, 2, 0}, {0, 8, 0}}}", # normal Langton's ant "{{{1,2,1},{0,8,1}},{{0,1,0},{0,0,0}}}", # Langton's Ant at scale 2 (sparse version) (See also Ed Pegg Jr.'s rule #30.) This is a bit like Langton's original formulation of his ants, only using 2 colors instead of 3, and with states to keep track of when to turn instead of using color for this. We can rotate any turmites too: (need e.g. 2*n_states states for 45 degree rotation) e.g. for the binary counter: "{{{1,2,0},{0,1,0}}}", # normal binary counter "{{{1,1,1},{0,8,1}},{{0,2,0},{0,0,0}}}", # diagonal counter (turning right on off-steps) "{{{1,4,1},{0,2,1}},{{0,8,0},{0,0,0}}}", # diagonal counter (turning left on off-steps) e.g. for Langton's ant: "{{{1,2,0},{0,8,0}}}", # normal Langton's ant "{{{1,1,1},{0,4,1}},{{0,2,0},{0,0,0}}}", # Langton's ant at 45 degrees (turning right on off-steps) "{{{1,4,1},{0,1,1}},{{0,8,0},{0,0,0}}}", # Langton's ant at 45 degrees (turning left on off-steps) (These take twice as long as the normal versions.) "{{{1,1,1},{0,4,1}},{{0,2,2},{0,0,0}},{{0,1,0},{0,0,0}}}", # knight's move rotated "{{{1,1,1},{0,4,1}},{{0,1,2},{0,0,0}},{{0,2,0},{0,0,0}}}", # knight's move rotated v2 (These take three times as long.) We can increase the number of straight-ahead steps to achieve any angle of highway we want, e.g. "{{{1,1,1},{0,4,1}},{{0,2,2},{0,0,0}},{{0,1,3},{0,0,0}},{{0,1,0},{0,0,0}}}", # long knight's move rotated We can rotate twice, for fun: "{{{1,8,1},{0,2,1}},{{0,2,2},{0,0,0}},{{0,1,3},{0,0,0}},{{0,2,0},{0,0,0}}}", # rotated twice (expanded version) (same as scale 2 version) (These take four times as long.) "{{{1,8,1},{0,2,1}},{{0,2,2},{1,2,2}},{{0,2,0},{1,2,0}}}", # rotated twice (compact version) Note that with the compact version we have to walk over 'live' cells without changing them - we can't set those transitions to 'die'. This makes exactly the same pattern as Langtons Ant but takes 3 times as long. For turmites with more states, e.g.: "{{{1,8,0},{1,2,1}},{{0,2,0},{0,8,1}}}", # 11: framed computer art "{{{1,4,2},{1,1,3}},{{0,1,2},{0,4,3}},{{0,2,0},{0,0,0}},{{0,2,1},{0,0,0}}}", # framed computer art rotated # 2 states become 4 states for 45 degree rotation # (sparse version, turning right on off-steps: hence turns N becomes L,L->U,R->N,U->R) # here the new states are used as off-step storage of the old states: state 2 says I will become state 0, # state 3 says I will become state 1 Can we detect when a smaller version of a turmite is possible - can we apply it in reverse? 1=noturn, 2=right, 4=u-turn, 8=left ''' # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] example_spec = "{{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}}" # Generate a random rule, filtering out the most boring ones. # TODO: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) ns = 2 nc = 2 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_state = random.randint(0,ns-1) new_color = random.randint(0,nc-1) dir_to_turn = [1,2,4,8][random.randint(0,3)] # (we don't consider splitting and dying here) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(example_spec.replace('}',']').replace('{','[')) # will turmite zip off? if on color 0 with state s the turmite does (?,1,s) then rule is bad for state in range(ns): if action_table[state][0][1]==1 and action_table[state][0][2]==state: is_rule_acceptable = False # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] in [1,4]: # forward or u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==4 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create a Turmite CA for a given specification. Enter a number (1-59) for an example Turmite from Ed Pegg Jr.'s (extended) library. (see http://demonstrations.wolfram.com/Turmites/ or the code of this script) Otherwise enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=noturn, 2=right, 4=u-turn, 8=left) c: the new internal state of the Turmite Example: {{{1, 2, 0}, {0, 8, 0}}} (example pattern #1) Has 1 state and 2 colors. The triple {1,2,0} says: 1. set the color of the square to 1 2. turn right (2) 3. adopt state 0 (no change) and move forward one square This is Langton's Ant. Enter integer or string: (default is a random example)''', example_spec, 'Enter Turmite specification:') if spec.isdigit(): spec = EdPeggJrTurmiteLibrary[int(spec)-1] # (his demonstration project UI is 1-based) # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs=4 # TODO: check table is full and valid total_states = n_colors+n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing direction d return n_colors + n_dirs*(n_states*c+s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(lambda x:hex(x)[2:],flatten(action_table)))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,3,0,1], # no turn 2:[1,2,3,0], # right 4:[0,1,2,3], # u-turn 8:[3,0,1,2], # left } remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4,8]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] #golly.warn(str(not_arriving_from_here)) # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) for turn in [1,2,4,8] if turn&turnset] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s,opposite_dirs[dir]) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) rule_name = prefix+'_'+spec_string tree.write(golly.getdir('rules')+rule_name+'.tree') # Create some multi-colour icons so we can see what the turmite is doing # Andrew's ant drawing: (with added eyes (2) and anti-aliasing (3)) ant31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,2,2,1,1,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,3,1,1,1,3,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant15x15 = [[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,2,1,2,0,0,0,0,0,0], [0,0,0,1,0,0,1,1,1,0,0,1,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,0,0,0,1,0,0,0,1,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,1,0,0,3,1,3,0,0,1,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant7x7 = [ [0,1,0,0,0,1,0], [0,0,2,1,2,0,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] eyes = (255,255,255) rotate4 = [ [[1,0],[0,1]], [[0,-1],[1,0]], [[-1,0],[0,-1]], [[0,1],[-1,0]] ] offset4 = [ [0,0], [1,0], [1,1], [0,1] ] pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): for dir in range(n_dirs): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for x in range(31): for y in range(31): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*30 row = rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*30 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant31x31[y][x]] for x in range(15): for y in range(15): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*14 row = 31 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*14 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant15x15[y][x]] for x in range(7): for y in range(7): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*6 row = 46 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*6 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant7x7[y][x]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # switch to the new rule golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') ''' # we make a turmite testbed so we don't miss interesting behaviour # create an area of random initial configuration with a few turmites for x in range(-300,-100): for y in range(-100,100): if x%50==0 and y%50==0: golly.setcell(x,y,n_colors) # start with a turmite facing N else: golly.setcell(x,y,random.randint(0,n_colors-1)) # create a totally random area (many turmites) for x in range(-200,-100): for y in range(200,300): golly.setcell(x,y,random.randint(0,total_states-1)) # also start with some pairs of turmites # (because of checkerboard rule, sometimes turmites work in pairs) pair_separation = 30 x=0 y=100 for t1 in range(n_colors,total_states): for t2 in range(n_colors,total_states): golly.setcell(x,y,t1) golly.setcell(x+1,y,t2) x += pair_separation x = 0 y += pair_separation # also start with a filled-in area of a color for color in range(n_colors): for x in range(color*200,color*200+100): for y in range(-50,50): if x==color*200+50 and y==0: golly.setcell(x,y,encode(color,0,0)) # start with a turmite facing N else: golly.setcell(x,y,color) golly.fit() ''' golly-3.3-src/Scripts/Python/Rule-Generators/TriTurmite-gen.py0000644000175000017500000006105512112261643021377 00000000000000# Generator for Triangular Turmite rules import golly import random import string from glife.EmulateTriangular import * from glife.WriteRuleTable import * prefix = 'TriTurmite' # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) example_spec = '{{{1, 2, 0}, {0, 1, 0}}}' import random ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = [1,2,4][random.randint(0,2)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(string.replace(string.replace(example_spec,'}',']'),'{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] in [4]: # u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==4 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create a TriTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=Left, 2=Right, 4=U-turn) c: the new internal state of the Turmite Example: {{{1, 2, 0}, {0, 1, 0}}} Has 1 state and 2 colors. The triple {1,2,0} says: 1. set the color of the square to 1 2. turn right (2) 3. adopt state 0 (no change) and move forward one square This is the equivalent of Langton's Ant. Enter string: ''', example_spec, 'Enter TriTurmite specification:') '''Some interesting rule found with this script: {{{2,4,0},{2,4,0},{1,2,1}},{{1,2,1},{2,1,0},{1,4,1}}} - lightning cloud {{{1,1,1},{1,2,0},{2,1,1}},{{2,2,1},{2,2,1},{1,4,0}}} - makes a highway (seems to be rarer in tri grids compared to square grids?) {{{2,2,1},{1,2,0},{1,1,1}},{{1,2,0},{2,1,0},{1,4,1}}} - data pyramid {{{2,1,0},{1,4,1},{1,1,0}},{{2,4,0},{2,2,1},{1,1,1}}} - a filled version of the tri-grid Langton's ant {{{1,1,0},{2,2,1},{1,1,0}},{{1,4,0},{2,2,0},{2,2,0}}} - hypnodisc ''' # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(string.replace(string.replace(spec,'}',']'),'{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 3 # TODO: check table is full and valid total_states = n_colors+n_colors*n_states*3 # problem if we try to export more than 255 states if total_states > 128: # max allowed using checkerboard emulation (see EmulateTriangular) golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing away from direction d return n_colors + 3*(n_states*c+s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(lambda x:hex(x)[2:],flatten(action_table)))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,0,1], # left 2:[1,2,0], # right 4:[0,1,2], # u-turn } not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) \ for turn in [1,2,4] if turn&turnset] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s,dir)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s,dir)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table (can use RuleTableToTree.py to load it): #WriteRuleTable("triangularVonNeumann",total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] if total_states<=16: TriangularTransitionsToRuleTree_SplittingMethod("triangularVonNeumann",total_states,transitions,rule_name) width = 15*(total_states*total_states-1) + 15 # we set the background color height = 22 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] # turmite icons: 0=black, 1=background color, 2=turmite color turmite_big = [[[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,0,1,1,1,1,1,1,2,2,2,2,1,1], [1,1,1,0,1,1,1,1,1,1,1,2,2,1,1], [1,1,1,1,0,1,1,1,1,1,2,1,2,1,1], [1,1,1,1,1,0,1,1,1,2,1,1,2,1,1], [1,1,1,1,1,1,0,1,2,1,1,1,1,1,1], [1,1,1,1,1,1,1,0,1,1,1,1,1,1,1], [1,1,1,1,1,1,2,1,0,1,1,1,1,1,1], [1,1,2,1,1,2,1,1,1,0,1,1,1,1,1], [1,1,2,1,2,1,1,1,1,1,0,1,1,1,1], [1,1,2,2,1,1,1,1,1,1,1,0,1,1,1], [1,1,2,2,2,2,1,1,1,1,1,1,0,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1,1,2,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,2,1,1,1,1,1,1], [1,1,0,1,1,1,1,1,1,2,1,1,1,1,1], [1,1,1,0,1,1,1,1,1,2,1,1,1,1,1], [1,1,1,1,0,1,1,1,1,1,2,1,1,1,1], [1,1,2,1,1,0,1,1,1,1,2,1,2,1,1], [1,1,2,2,1,1,0,1,1,1,1,2,2,1,1], [1,1,2,2,2,1,1,0,1,1,2,2,2,1,1], [1,1,2,2,1,1,1,1,0,1,1,2,2,1,1], [1,1,2,1,2,1,1,1,1,0,1,1,2,1,1], [1,1,1,1,2,1,1,1,1,1,0,1,1,1,1], [1,1,1,1,1,2,1,1,1,1,1,0,1,1,1], [1,1,1,1,1,2,1,1,1,1,1,1,0,1,1], [1,1,1,1,1,1,2,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,2,1,1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,0,1,1,2,2,2,2,2,1,1,1,1,1], [1,1,1,0,1,1,2,2,2,1,1,1,1,1,1], [1,1,1,1,0,1,1,2,1,2,2,1,1,1,1], [1,1,1,1,1,0,1,1,1,1,1,2,2,1,1], [1,1,1,1,1,1,0,1,1,1,1,1,1,2,2], [1,1,1,1,1,1,1,0,1,1,1,1,1,1,1], [2,2,1,1,1,1,1,1,0,1,1,1,1,1,1], [1,1,2,2,1,1,1,1,1,0,1,1,1,1,1], [1,1,1,1,2,2,1,2,1,1,0,1,1,1,1], [1,1,1,1,1,1,2,2,2,1,1,0,1,1,1], [1,1,1,1,1,2,2,2,2,2,1,1,0,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]]] turmite_small = [[[0,1,1,1,1,1,1], [1,0,1,2,2,2,1], [1,1,0,1,1,2,1], [1,2,1,0,1,2,1], [1,2,1,1,0,1,1], [1,2,2,2,1,0,1], [1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1], [1,0,1,1,1,2,1], [1,1,0,1,2,2,1], [1,2,1,0,1,2,1], [1,2,2,1,0,1,1], [1,2,1,1,1,0,1], [1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1], [1,0,1,2,2,2,1], [1,1,0,1,2,1,1], [1,1,1,0,1,1,1], [1,1,2,1,0,1,1], [1,2,2,2,1,0,1], [1,1,1,1,1,1,0]]] # TODO: do something about this horrible code for lc in range(n_colors): for uc in range(n_colors): '''draw the cells with no turmites''' golly_state = uc * total_states + lc for row in range(15): for column in range(15): if column>row: # upper pixels[row][(golly_state-1)*15+column] = palette[uc] elif columnrow: # upper pixels[15+row][(golly_state-1)*15+column] = palette[uc] elif columnrow: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ud][row][column]] elif columnrow: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ud][row][column]] elif columncolumn: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ld][row][column]] elif column>row: # upper pixels[row][(golly_state-1)*15+column] = palette[uc] for row in range(7): for column in range(7): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ld][row][column]] elif column>row: # upper pixels[15+row][(golly_state-1)*15+column] = palette[uc] '''draw the cells with a turmite in both halves''' for us in range(n_states): for ud in range(n_dirs): upper = encode(uc,us,ud) golly_state = upper * total_states + lower for row in range(15): for column in range(15): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ld][row][column]] elif column>row: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ud][row][column]] for row in range(7): for column in range(7): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ld][row][column]] elif column>row: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ud][row][column]] ConvertTreeToRule(rule_name, total_states, pixels) elif total_states<=128: TriangularTransitionsToRuleTree_CheckerboardMethod("triangularVonNeumann",total_states,transitions,rule_name) width = 15*(total_states*2-2) + 15 # we set the background color height = 22 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] # turmite icons: 0=black, 1=background color, 2=turmite color lower = [[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,0,0,0,0], [0,0,0,1,1,1,1,1,2,2,1,1,0,0,0], [0,0,1,1,2,1,2,2,1,1,1,1,1,0,0], [0,1,1,2,2,2,1,1,1,1,1,1,1,1,0], [1,1,2,2,2,2,2,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]], [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,2,1,1,1,0,0,0,0], [0,0,0,1,1,1,2,2,2,1,1,1,0,0,0], [0,0,1,1,1,2,2,2,2,2,1,1,1,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,1,0], [1,1,1,1,1,1,1,2,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,2,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]], [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,1,2,2,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,2,2,1,2,1,1,0,0], [0,1,1,1,1,1,1,1,1,2,2,2,1,1,0], [1,1,1,1,1,1,1,1,2,2,2,2,2,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]] lower7x7 = [[[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,1,1,0,0], [0,1,2,2,1,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]], [[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,2,1,0,0], [0,1,2,1,2,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]], [[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,1,1,0,0], [0,1,1,2,2,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]]] # (we invert the lower triangle to get the upper triangle) for color in range(n_colors): bg_color = palette[color] # draw the 15x15 icon for row in range(15): for column in range(15): # lower triangle pixels[row][(color-1)*15+column] = \ [palette[0],bg_color,bg_color][lower[0][row][column]] # upper triangle pixels[row][(color+total_states-2)*15+column] = \ [palette[0],bg_color,bg_color][lower[0][13-row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): # lower triangle pixels[15+row][(color-1)*15+column] = \ [palette[0],bg_color,bg_color][lower7x7[0][row][column]] # upper triangle pixels[15+row][(color+total_states-2)*15+column] = \ [palette[0],bg_color,bg_color][lower7x7[0][6-row][column]] for state in range(n_states): fg_color = palette[n_colors+state] for dir in range(n_dirs): # draw the 15x15 icon for row in range(15): for column in range(15): # lower triangle pixels[row][(encode(color,state,dir)-1)*15+column] = \ [palette[0],bg_color,fg_color][lower[dir][row][column]] # upper triangle pixels[row][(encode(color,state,dir)+total_states-2)*15+column] = \ [palette[0],bg_color,fg_color][lower[2-dir][13-row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): # lower triangle pixels[15+row][(encode(color,state,dir)-1)*15+column] = \ [palette[0],bg_color,fg_color][lower7x7[dir][row][column]] # upper triangle pixels[15+row][(encode(color,state,dir)+total_states-2)*15+column] = \ [palette[0],bg_color,fg_color][lower7x7[2-dir][6-row][column]] ConvertTreeToRule(rule_name, total_states, pixels) else: golly.warn('Too many states!') golly.exit() # -- select the rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/AbsoluteHexTurmite-gen.py0000644000175000017500000003077212112261643023066 00000000000000# Generator for Absolute-movement Hexagonal Turmite rules import golly import random from glife.EmulateHexagonal import * from glife.WriteRuleTable import * # AKT: Python 2.3 doesn't have "set" built-in try: set except NameError: from sets import Set as set prefix = 'AbsoluteHexTurmite' dirs = ['A','B','C','D','E','F'] opposite_dirs = [3,4,5,0,1,2] # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) example_spec = "{{{1, 'A', 0}, {0, 'B', 0}}}" ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = dirs[random.randint(0,len(dirs)-1)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + ",'" + dir_to_turn + "'," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(example_spec.replace('}',']').replace('{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create an Absolute-movement HexTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to move ('A', 'B', .. , 'F') c: the new internal state of the Turmite Example: {{{1, 'A', 0}, {0, 'B', 0}}} Has 1 state and 2 colors. The triple {1,'A',0} says: 1. set the color of the square to 1 2. move in direction 'A' 3. adopt state 0 Enter string: ''', example_spec, 'Enter AbsoluteHexTurmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 6 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states if total_states > 256: golly.warn("Number of states required exceeds Golly's limit of 256.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s): # turmite on color c in state s return n_colors + n_states*c + s # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = '_'.join(map(str,flatten(action_table))) # (ambiguous but we have to try something) not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): moveset = action_table[state][color][1] for iMove,move in enumerate(dirs): if not move in moveset: # didn't turn this way not_arriving_from_here[opposite_dirs[iMove]] += [encode(color,state)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state)] # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: if dirs[opposite_dirs[dir]] in action_table[state][color][1]: inputs += [encode(color,state)] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table: #WriteRuleTable('hexagonal',total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') HexagonalTransitionsToRuleTree('hexagonal',total_states,transitions,rule_name) # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] width = 31*(total_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0]] big = [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,2,2,2,1,1,1,0,0,0], [0,1,1,1,1,2,2,2,2,2,1,1,0,0,0], [0,1,1,1,2,2,2,2,2,2,2,1,1,0,0], [0,0,1,1,2,2,2,2,2,2,2,1,1,0,0], [0,0,1,1,2,2,2,2,2,2,2,1,1,1,0], [0,0,0,1,1,2,2,2,2,2,1,1,1,1,0], [0,0,0,1,1,1,2,2,2,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]] small = [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,2,2,1,0], [0,1,2,2,2,1,0], [0,1,2,2,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]] for color in range(n_colors): bg = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = [palette[0],bg,bg][huge[row][column]] for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = [palette[0],bg,bg][big[row][column]] for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = [palette[0],bg,bg][small[row][column]] for state in range(n_states): fg = palette[n_colors+state] # draw the 31x31 icon for row in range(31): for column in range(31): pixels[row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][huge[row][column]] # draw the 15x15 icon for row in range(15): for column in range(15): pixels[31+row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][big[row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): pixels[46+row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][small[row][column]] # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # -- select the new rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/Rule-Generators/icon-exporter.py0000644000175000017500000002752712146034627021333 00000000000000# Extract icon images in current layer (created by icon-importer.py) # and either create or update the appropriate .rule file. # Author: Andrew Trevorrow (andrew@trevorrow.com), Feb 2013. import golly as g from glife import getminbox, pattern from glife.BuiltinIcons import circles, diamonds, hexagons, triangles import os from tempfile import mkstemp from shutil import move iconcolors = [] # list of (r,g,b) colors used in all icons allcolors = g.getcolors() deadrgb = (allcolors[1], allcolors[2], allcolors[3]) # this flag becomes True only if an icon uses a non-gray color (ignoring deadrgb) multi_color_icons = False # grayscale # ------------------------------------------------------------------------------ def hex2(i): # convert number from 0..255 into 2 hex digits hexdigit = "0123456789ABCDEF" result = hexdigit[i / 16] result += hexdigit[i % 16] return result # -------------------------------------------------------------------- def extract_icons(iconsize): global iconcolors, allcolors, deadrgb, multi_color_icons # do 1st pass to determine the colors used and the number of icons numicons = 0 while True: blank = True x = numicons*32 y = 0 if iconsize == 15: y = 32 if iconsize == 7: y = 48 for row in xrange(iconsize): for col in xrange(iconsize): state = g.getcell(x+col, y+row) rgb = (allcolors[state*4+1], allcolors[state*4+2], allcolors[state*4+3]) if not rgb in iconcolors: iconcolors.append(rgb) if rgb != deadrgb: R,G,B = rgb if R != G or G != B: multi_color_icons = True if state > 0: blank = False if blank: break numicons += 1 if numicons == 0: return "" # build string of lines suitable for @ICONS section charsperpixel = 1 numcolors = len(iconcolors) if numcolors > 26: charsperpixel = 2 icondata = "\nXPM\n" icondata += "/* width height num_colors chars_per_pixel */\n" icondata += "\"" + str(iconsize) + " " + str(iconsize*numicons) + " " + \ str(numcolors) + " " + str(charsperpixel) + "\"\n" icondata += "/* colors */\n" cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" n = 0 for RGB in iconcolors: R,G,B = RGB hexcolor = "#" + hex2(R) + hex2(G) + hex2(B) if RGB == deadrgb: # use . or .. for background color icondata += "\"." if charsperpixel == 2: icondata += "." if not multi_color_icons: # grayscale icons so specify black as the background color hexcolor = "#000000" else: icondata += "\"" if charsperpixel == 1: icondata += cindex[n] else: icondata += cindex[n % 16] + cindex[n / 16] icondata += " c " + hexcolor + "\"\n" n += 1 for i in xrange(numicons): icondata += "/* icon for state " + str(i+1) + " */\n" x = i*32 y = 0 if iconsize == 15: y = 32 if iconsize == 7: y = 48 for row in xrange(iconsize): icondata += "\"" for col in xrange(iconsize): state = g.getcell(x+col, y+row) if state == 0: # show . or .. for background color icondata += "." if charsperpixel == 2: icondata += "." else: rgb = (allcolors[state*4+1], allcolors[state*4+2], allcolors[state*4+3]) n = 0 for RGB in iconcolors: if rgb == RGB: break n += 1 if charsperpixel == 1: icondata += cindex[n] else: icondata += cindex[n % 16] + cindex[n / 16] icondata += "\"\n" return icondata # -------------------------------------------------------------------- def parse_hex(hexstr): # parse a string like "FF00EE" or "FFFF0000EEEE" R, G, B = (0, 0, 0) if len(hexstr) == 6: R = int(hexstr[0:2],16) G = int(hexstr[2:4],16) B = int(hexstr[4:6],16) elif len(hexstr) == 12: # only use upper 2 hex digits R = int(hexstr[0:2],16) G = int(hexstr[4:6],16) B = int(hexstr[8:10],16) else: g.warn("Unexpected hex string: " + hexstr) return (R,G,B) # -------------------------------------------------------------------- def create_average_colors(iconsection): global deadrgb colordata = "@COLORS\n\n" R, G, B = deadrgb colordata += "0 " + str(R) + " " + str(G) + " " + str(B) + "\n" width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 xpmcount = 0 colordict = {} row = 0 state = 0 nbcount = 0 totalR = 0 totalG = 0 totalB = 0 for line in iconsection.splitlines(): if len(line) > 0 and line[0] == "\"": # extract the stuff inside double quotes line = line.lstrip("\"").rstrip("\"") xpmcount += 1 if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) colordict[key] = rgb elif xpmcount <= 1 + num_colors + height: # parse pixel data in line like "......AAA......" for col in xrange(width): offset = col*chars_per_pixel key = line[offset : offset + chars_per_pixel] if not key in colordict: g.warn("Unexpected key in icon data: " + key) return colordata if key[0] != ".": R, G, B = colordict[key] nbcount += 1 totalR += R totalG += G totalB += B row += 1 if row == width: # we've done this icon state += 1 if nbcount > 0: colordata += str(state) + " " + str(totalR / nbcount) + " " \ + str(totalG / nbcount) + " " \ + str(totalB / nbcount) + "\n" else: # avoid div by zero colordata += str(state) + " 0 0 0\n" # reset counts for next icon row = 0 nbcount = 0 totalR = 0 totalG = 0 totalB = 0 if xpmcount == 1 + num_colors + height: break colordata += "\n" return colordata # -------------------------------------------------------------------- def get_color_section(rulepath): colordata = "" rulefile = open(rulepath,"rU") copylines = False for line in rulefile: if line.startswith("@COLORS"): copylines = True elif copylines and line.startswith("@"): break if copylines: colordata += line rulefile.close() return colordata # -------------------------------------------------------------------- def export_icons(iconsection, rulename): global multi_color_icons if multi_color_icons: # prepend a new @COLORS section with the average colors in each icon iconsection = create_average_colors(iconsection) + iconsection # replace any illegal filename chars with underscores filename = rulename.replace("/","_").replace("\\","_") # we will only create/update a .rule file in the user's rules folder # (ie. we don't modify the supplied Rules folder) rulepath = g.getdir("rules") + filename + ".rule" fileexists = os.path.isfile(rulepath) if fileexists: # .rule file already exists so replace or add @ICONS section rulefile = open(rulepath,"rU") # create a temporary file for writing new rule info temphdl, temppath = mkstemp() tempfile = open(temppath,"w") wroteicons = False skiplines = False for line in rulefile: if line.startswith("@ICONS"): # replace the existing @ICONS section tempfile.write(iconsection) wroteicons = True skiplines = True elif line.startswith("@COLORS") and multi_color_icons: # skip the existing @COLORS section # (iconsection contains a new @COLORS section) skiplines = True elif skiplines and line.startswith("@"): if wroteicons: tempfile.write("\n") skiplines = False if not skiplines: tempfile.write(line) if not wroteicons: # .rule file had no @ICONS section tempfile.write("\n") tempfile.write(iconsection) # close files rulefile.close() tempfile.flush() tempfile.close() os.close(temphdl) # remove original .rule file and rename temporary file os.remove(rulepath) move(temppath, rulepath) else: # .rule file doesn't exist so create it rulefile = open(rulepath,"w") rulefile.write("@RULE " + filename + "\n\n") if not multi_color_icons: # grayscale icons, so check if Rules/filename.rule exists # and if so copy any existing @COLORS section suppliedrule = g.getdir("app") + "Rules/" + filename + ".rule" if os.path.isfile(suppliedrule): colordata = get_color_section(suppliedrule) if len(colordata) > 0: rulefile.write(colordata) rulefile.write(iconsection) rulefile.flush() rulefile.close() # create another layer for displaying the new icons if g.numlayers() < g.maxlayers(): g.addlayer() g.new("icon test") g.setrule(rulename) for i in xrange(g.numstates()-1): g.setcell(i, 0, i+1) g.fit() g.setoption("showicons",True) g.update() if fileexists: g.note("Updated the icon data in " + rulepath) else: g.note("Created " + rulepath) # -------------------------------------------------------------------- # WARNING: changing this prefix will require same change in icon-importer.py layerprefix = "imported icons for " # check that the current layer was created by icon-importer.py layername = g.getname() if not layername.startswith(layerprefix): g.exit("The current layer wasn't created by icon-importer.py.") # get the original rule rulename = layername.split(" for ")[1] icondata = extract_icons(31) icondata += extract_icons(15) icondata += extract_icons(7) if len(icondata) == 0: g.exit("There are no icon images to export.") if not multi_color_icons: # check if the icon data matches Golly's built-in grayscale icons if icondata == circles: icondata = "\ncircles\n" elif icondata == diamonds: icondata = "\ndiamonds\n" elif icondata == hexagons: icondata = "\nhexagons\n" elif icondata == triangles: icondata = "\ntriangles\n" export_icons("@ICONS\n" + icondata, rulename) golly-3.3-src/Scripts/Python/Rule-Generators/FredkinModN-gen.py0000644000175000017500000000466612112261643021434 00000000000000import golly import random import time from glife.EmulateHexagonal import * from glife.EmulateTriangular import * from glife.RuleTree import * # AKT: itertools.product is new in Python 2.6 try: from itertools import product except ImportError: # see http://docs.python.org/library/itertools.html#itertools.product def product(*args, **kwds): pools = map(tuple, args) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod) spec = golly.getstring( '''This script will write and select the rule "Fredkin-mod-n", for a given N. This rule is the Winograd extension of the Fredkin Replicator rule (the parity rule): c,{s} -> sum(s)%N (where N=2 for the original parity rule) If N is prime, this will result in any pattern being replicated at N^m timesteps (if the pattern is small enough that it doesn't overlap its copies). Specify the neighborhood (N = von Neumann, M = Moore, T = triangular von Neumann, H = hexagonal, TM = triangular Moore) and the value of N (2-255). e.g. H2, N7 (Larger values of N can take a long time.) ''', 'N3', 'Enter specification:') # work out what the string meant nhood = '' nhoods = {'N':'vonNeumann','TM':'triangularMoore','M':'Moore', 'T':'triangularVonNeumann','H':'hexagonal'} for nh in nhoods.keys(): if nh in spec: nhood = nhoods[nh] n = int(spec.replace(nh,'')) break if nhood=='': golly.exit('Unsupported string: '+spec) if n<2 or n>255: golly.exit('Value of N must lie between 2 and 255.') # assemble the transitions nbors = {'vonNeumann':4,'Moore':8,'hexagonal':6,'triangularVonNeumann':3, 'triangularMoore':12} transitions = [] for sl in product(range(n),repeat=nbors[nhood]): transitions += [ [range(n)] + [[s] for s in sl] + [[sum(sl)%n]] ] rule_name = 'Fredkin_mod'+str(n)+'_'+nhood Converters = { "vonNeumann":ConvertRuleTableTransitionsToRuleTree, "Moore":ConvertRuleTableTransitionsToRuleTree, "triangularVonNeumann":EmulateTriangular, "triangularMoore":EmulateTriangular, "hexagonal":EmulateHexagonal, } golly.show("Building rule...") rule_name = Converters[nhood]( nhood, n, transitions, rule_name+'.tree' ) golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-3.3-src/Scripts/Python/tile.py0000644000175000017500000000757712026730263014453 00000000000000# Tile current selection with pattern inside selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. # Updated to handle multi-state patterns, Aug 2008. from glife import * import golly as g selrect = rect( g.getselrect() ) if selrect.empty: g.exit("There is no selection.") selpatt = pattern( g.getcells(g.getselrect()) ) if len(selpatt) == 0: g.exit("No pattern in selection.") # determine if selpatt is one-state or multi-state inc = 2 if len(selpatt) & 1 == 1: inc = 3 # ------------------------------------------------------------------------------ def clip_left (patt, left): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 while x < len(clist): if clist[x] < left: clist[x : x+inc] = [] # remove cell from list else: x += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_right (patt, right): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 while x < len(clist): if clist[x] > right: clist[x : x+inc] = [] # remove cell from list else: x += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_top (patt, top): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() y = 1 while y < len(clist): if clist[y] < top: clist[y-1 : y-1+inc] = [] # remove cell from list else: y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_bottom (patt, bottom): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() y = 1 while y < len(clist): if clist[y] > bottom: clist[y-1 : y-1+inc] = [] # remove cell from list else: y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ # find selpatt's minimal bounding box bbox = getminbox(selpatt) # first tile selpatt horizontally, clipping where necessary left = bbox.left i = 0 while left > selrect.left: left -= bbox.width i += 1 if left >= selrect.left: selpatt.put(-bbox.width * i, 0) else: clip_left( selpatt(-bbox.width * i, 0), selrect.left ).put() right = bbox.right i = 0 while right < selrect.right: right += bbox.width i += 1 if right <= selrect.right: selpatt.put(bbox.width * i, 0) else: clip_right( selpatt(bbox.width * i, 0), selrect.right ).put() # get new selection pattern and tile vertically, clipping where necessary selpatt = pattern( g.getcells(g.getselrect()) ) bbox = getminbox(selpatt) top = bbox.top i = 0 while top > selrect.top: top -= bbox.height i += 1 if top >= selrect.top: selpatt.put(0, -bbox.height * i) else: clip_top( selpatt(0, -bbox.height * i), selrect.top ).put() bottom = bbox.bottom i = 0 while bottom < selrect.bottom: bottom += bbox.height i += 1 if bottom <= selrect.bottom: selpatt.put(0, bbox.height * i) else: clip_bottom( selpatt(0, bbox.height * i), selrect.bottom ).put() if not selrect.visible(): g.fitsel() golly-3.3-src/Scripts/Python/bricklayer.py0000644000175000017500000000145712026730263015634 00000000000000# Based on bricklayer.py from PLife (http://plife.sourceforge.net/). from glife import * rule () # Life p22_half = pattern("2o$bo$bobo$2b2o3bo$6bob2o$5bo4bo$6bo3bo$7b3o!") p22 = p22_half + p22_half(26, 9, flip) gun22 = p22 + p22[1](-18, 11) gun154 = gun22[27] + gun22[5](49, 12, rcw) + gun22(5, 53, flip_y) p7_reflector = pattern(""" 2b2o5b2o$2b2o5bo$7bobo$7b2o$3b2o$3bobo$4bo3$13bo$10bo2b3o3b2o$3b5o 2b3o3bo2bo$b3obob3o4b2obobo$o4bo4b4obobo2b2o$2ob2ob4o3bobob2obo$ 4bobobobobo2bo2bobo$4bobobo2bo2bob3ob2o$3b2obob4o6bobo$7bo4b6o2b o$9bo2bo2bo4b2o$8b2o!""") pre_lom = pattern("2bo$2ob2o$2ob2o2$b2ob2o$b2ob2o$3bo!") all = gun154[210](-52, -38) + gun154[254](52, -38, flip_x) + p7_reflector(8, 23) \ + pre_lom(-3, 30) ### all.save ("bricklayer.lif", "David Bell, 29 Sep 2002") all.display("bricklayer") golly-3.3-src/Scripts/Python/goto.py0000644000175000017500000001040712706123635014454 00000000000000# Go to a requested generation. The given generation can be an # absolute number like 1,000,000 (commas are optional) or a number # relative to the current generation like +9 or -6. If the target # generation is less than the current generation then we go back # to the starting generation (normally 0) and advance to the target. # Authors: Andrew Trevorrow and Dave Greene, April 2006. # Updated Sept-Oct 2006 -- XRLE support and reusable default value. # Updated April 2010 -- much faster, thanks to PM 2Ring. from glife import validint from time import time import golly as g # -------------------------------------------------------------------- def intbase(n, b): # convert integer n >= 0 to a base b digit list (thanks to PM 2Ring) digits = [] while n > 0: digits += [n % b] n //= b return digits or [0] # -------------------------------------------------------------------- def goto(gen): currgen = int(g.getgen()) if gen[0] == '+': n = int(gen[1:]) newgen = currgen + n elif gen[0] == '-': n = int(gen[1:]) if currgen > n: newgen = currgen - n else: newgen = 0 else: newgen = int(gen) if newgen < currgen: # try to go back to starting gen (not necessarily 0) and # then forwards to newgen; note that reset() also restores # algorithm and/or rule, so too bad if user changed those # after the starting info was saved; # first save current location and scale midx, midy = g.getpos() mag = g.getmag() g.reset() # restore location and scale g.setpos(midx, midy) g.setmag(mag) # current gen might be > 0 if user loaded a pattern file # that set the gen count currgen = int(g.getgen()) if newgen < currgen: g.error("Can't go back any further; pattern was saved " + "at generation " + str(currgen) + ".") return if newgen == currgen: return g.show("Hit escape to abort...") oldsecs = time() # before stepping we advance by 1 generation, for two reasons: # 1. if we're at the starting gen then the *current* step size # will be saved (and restored upon Reset/Undo) rather than a # possibly very large step size # 2. it increases the chances the user will see updates and so # get some idea of how long the script will take to finish # (otherwise if the base is 10 and a gen like 1,000,000,000 # is given then only a single step() of 10^9 would be done) g.run(1) currgen += 1 # use fast stepping (thanks to PM 2Ring) for i, d in enumerate(intbase(newgen - currgen, g.getbase())): if d > 0: g.setstep(i) for j in xrange(d): if g.empty(): g.show("Pattern is empty.") return g.step() newsecs = time() if newsecs - oldsecs >= 1.0: # do an update every sec oldsecs = newsecs g.update() g.show("") # -------------------------------------------------------------------- def savegen(filename, gen): try: f = open(filename, 'w') f.write(gen) f.close() except: g.warn("Unable to save given gen in file:\n" + filename) # -------------------------------------------------------------------- # use same file name as in goto.lua GotoINIFileName = g.getdir("data") + "goto.ini" previousgen = "" try: f = open(GotoINIFileName, 'r') previousgen = f.readline() f.close() if not validint(previousgen): previousgen = "" except: # should only happen 1st time (GotoINIFileName doesn't exist) pass gen = g.getstring("Enter the desired generation number,\n" + "or -n/+n to go back/forwards by n:", previousgen, "Go to generation") if len(gen) == 0: g.exit() elif gen == "+" or gen == "-": # clear the default savegen(GotoINIFileName, "") elif not validint(gen): g.exit('Sorry, but "' + gen + '" is not a valid integer.') else: # best to save given gen now in case user aborts script savegen(GotoINIFileName, gen) oldstep = g.getstep() goto(gen.replace(",","")) g.setstep(oldstep) golly-3.3-src/Scripts/Python/metafier.py0000644000175000017500000012357012707765343015317 00000000000000# metafier.py: # Uses the current selection to build a Brice Due metapixel pattern. # See http://otcametapixel.blogspot.com for more info. # Original author: Dave Greene, 12 June 2006. # # Dave Greene, 23 June 2006: added non-Conway's-Life rule support. # Also reduced the script size by a factor of six, at the expense of # adding a moderate-sized [constant] performance hit at the start # [due to composing the base tiles from smaller subpatterns.] # # The delay is almost all due to running CellCenter[3680] at the end # to produce the large filled area for the ONcell. Subpatterns are # generally (with some exceptions) defined to match the labeled slides at # http://otcametapixel.blogspot.com/2006/05/how-does-it-work.html . # # It's still possible to simplify the script by another factor of # two or more, by replacing the four main types of P46 oscillators # [which are often quoted as flat patterns] with predefined library # versions in the correct phase; see samples in the slide-24 section. # # 24 June 2006: the script now saves a reference copy of the OFFcell # and (particularly) the slow-to-construct ONcell, so these only have # to be constructed from scratch once, the first time the script runs. # # If metapixel-ON.rle and metapixel-OFF.rle become corrupted, they # should be deleted so the script can re-generate them. # # 3 July 2007: added code to avoid errors in rules like Seeds, # where the Golly canonical form of the rule doesn't include a '/' # # Modified by Andrew Trevorrow, 20 July 2006 (faster, simpler and # doesn't change the current clipboard). # # Modified by Andrew Trevorrow, 5 October 2007 (metafied pattern is # created in a separate layer so we don't clobber the selection). import os import golly as g from glife import * selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") # check that a layer is available for the metafied pattern; # if metafied layer already exists then we'll use that layername = "metafied" metalayer = -1 for i in xrange(g.numlayers()): if g.getname(i) == layername: metalayer = i break if metalayer < 0 and g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # note that getrule returns canonical rule string rulestr = g.getrule().split(":")[0] if (not rulestr.startswith("B")) or (rulestr.find("/S") == -1): g.exit("This script only works with B*/S* rules.") # get the current selection slist = g.getcells(selrect) selwidth = selrect[2] selheight = selrect[3] # create a 2D list of 0s and 1s representing entire selection livecell = [[0 for y in xrange(selheight)] for x in xrange(selwidth)] for i in xrange(0, len(slist), 2): livecell[slist[i] - selrect[0]][slist[i+1] - selrect[1]] = 1 # build a patch pattern based on the current rule # that fixes the appropriate broken eaters in the rules table r1, r2 = rulestr.split("/") if r1[:1] == "B": Bvalues, Svalues = r1.replace("B",""), r2.replace("S","") elif r1[:1] == "S": Svalues, Bvalues = r1.replace("S",""), r2.replace("B","") else: Svalues, Bvalues = r1, r2 # create metafied pattern in separate layer if metalayer >= 0: g.setlayer(metalayer) # switch to existing layer else: metalayer = g.addlayer() # create new layer # set rule to Life rule() Brle = Srle = "b10$b10$b26$b10$b10$b26$b10$b10$b!" for ch in Bvalues: ind = 32-int(ch)*4 # because B and S values are highest at the top! Brle = Brle[:ind] + "o" + Brle[ind+1:] for ch in Svalues: ind = 32-int(ch)*4 Srle = Srle[:ind] + "o" + Srle[ind+1:] RuleBits = pattern(Brle, 148, 1404) + pattern(Srle, 162, 1406) # load or generate the OFFcell tile: OFFcellFileName = g.getdir("data") + "metapixel-OFF.rle" ONcellFileName = g.getdir("data") + "metapixel-ON.rle" if os.access(OFFcellFileName, os.R_OK) and os.access(ONcellFileName, os.R_OK): g.show("Opening metapixel-OFF and metapixel-ON from saved pattern file.") OFFcell = pattern(g.transform(g.load(OFFcellFileName),-5,-5,1,0,0,1)) ONcell = pattern(g.transform(g.load(ONcellFileName),-5,-5,1,0,0,1)) else: g.show("Building OFF metacell definition...") # slide #21: programmables -------------------- LWSS = pattern("b4o$o3bo$4bo$o2bo!", 8, 0) DiagProximityFuse = pattern(""" bo$obo$bo2$4b2o$4b2o$59b2o$59b2o3$58b2o2b2o$9b2o3bo5bo5bo5bo5bo5bo5bo 7b2o2b2o$9bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo$10bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo$11bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo5b2o$ 12bo5bo5bo5bo5bo5bo5bo5bo3bobo$55bo2bo$56bobo$57bo! """, -5, -5) OrthoProximityFuse = pattern("2o41b2o$2o41bo$41bobo$41b2o!", 1001, 0) ProximityFuses = LWSS + DiagProximityFuse + OrthoProximityFuse AllFuses = pattern() for i in range(0,4): # place four sets of fuses around cell perimeter AllFuses = AllFuses(2047, 0, rcw) + ProximityFuses temp = pattern("o$3o$3bo$2bo!") # broken eater temp += temp(0, 10) + temp(0, 20) temp += temp(0, 46) + temp(0, 92) TableEaters = temp(145, 1401) + temp(165, 1521, flip) HoneyBitsB = pattern(""" bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$ob o$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo! """, 123, 1384) HoneyBitsS = HoneyBitsB(57, 34) temp = pattern("2bobo2$obobo2$obo2$obo2$2bobo4$obo2$obobo2$2bobo!") S = temp + temp(10, 16, flip) # just practicing... B = S + pattern("o6$8bobo2$o2$obo6$o!") # ditto temp = pattern("2bobo2$obobo2$obo2$obo2$obo2$obo2$obo2$obobo2$2bobo!") O = temp + temp(10, 16, flip) temp = pattern("obo2$obo2$obobo2$obobo2$obo2bo2$obo2$obo2$obo2$obo!") N = temp + temp(10, 16, flip) temp = pattern("obobobobo2$obobobobo2$obo2$obo2$obo2$obo!") F = temp + temp(0,6) # overlap, just to try it out... Eatr = pattern("4bobo2$" * 2 + "obo2$" * 2 \ + "4bobobobobobo2$" * 2 + "12bobo2$"*2) Eater = Eatr + pattern("obo2$"*2) LabelDigits = pattern(""" obobo2$o3bo2$obobo2$o3bo2$obobo5$obobo2$4bo2$4bo2$4bo2$4bo5$obobo2$o2$ obobo2$o3bo2$obobo12$obobo2$o2$obobo2$4bo2$obobo5$o3bo2$o3bo2$obobo2$ 4bo2$4bo5$obobo2$4bo2$obobo2$4bo2$obobo12$obobo2$4bo2$obobo2$o2$obobo 5$2bo2$2bo2$2bo2$2bo2$2bo5$obobo2$o3bo2$o3bo2$o3bo2$obobo!""") VLine = pattern("o2$" * 25) VLine2 = pattern("o2$" * 71) HLine = pattern("ob" * 38) TableLabels = VLine(18, 1440) + VLine(96, 1440) + Eater(77, 1446) \ + HLine(20, 1440) + HLine(20, 1488) + O(39, 1444) + N(55, 1444) \ + O(23, 1468) + F(39, 1468) + F(55, 1468) + Eatr(77, 1470) TableLabels += pattern("ob" * 29 + "8bobobo", 120, 1533) \ + HLine(118, 1391) + VLine2(118, 1393) + VLine2(192, 1393) \ + B(123, 1410) + B(123, 1456) + B(123, 1502) \ + S(177, 1398) + S(177, 1444) + S(177, 1490) \ + LabelDigits(138, 1396) + LabelDigits(168, 1401) all = AllFuses + TableEaters + TableLabels + HoneyBitsB + HoneyBitsS # slide 22: linear clock -------------------- LinearClockGun = pattern(""" 19bo$17b3o$16bo$16b2o$30bo$28b3o$27bo$27b2o$13b3o$12bo2b2o$11bo3b2o$ 12b3o$12b2o$15bo$13b2o$13b2o$2b2o5b2o2b2o$bobo9b2o8b2o$bo6b3o12b2o$2o 8b4o$12b3o$12bob2o$11b2o2bo$11b2ob2o$12bobo$13bo2$6b2o$5bobo$5bo$4b2o$ 10b2o36bo6b2o$11bo37b2o4b2o$8b3o37b2o$8bo$57bo$15b2o39bobo$14bobo15b2o 23bo$13b2obo15b2o24b3o63b2o$8bo5b2o44bo63b2o$6b3o6bo$5bo112bo5bo$6b3o 6bo15b2o84b3o3b3o$8bo5b2o15b2o20b2o62bo2bobo2bo$13b2obo35b2ob2o62b2ob 2o$14bobo18b3o15b4o$15b2o18bobo16b2o$35bobo$36bobo78bo7bo$38bo79bobobo bo$70bo47bobobobo$70b3o44bob2ob2obo$37bo35bo43b2o5b2o$37bo34b2o20b2o$ 59bo35bo$59b3o33bobo$62bo33b2o$61b2o4$28b2o7b2o11bo24bo$28bob2o3b2obo 10b3o22b3o$28bo3bobo3bo9b2obo21b2o2bo41b2ob2o$28b2o2bobo2b2o9b3o21b2o 3b2o11b2o28bobo$29b3o3b3o11b2o19bobo2bobo13bo10b3o8b2o5bobo$30bo5bo33b 2o3b2o9b2o3bobo7bo2bo4bo3b2o6bo$65b2o19bobo3b2o6bo3bo3bobo$65b2o21bo 11bo7bobo$25b2o13b2o46b2o13bo$25b2o2b2o5b2o2b2o58b2obo$29b2o5b2o$121b 2o$103bob2o14bobo$103b3o17bo$40bo63bo18b2o$40bo2b2o72b2o$39bo5bo36b2o 33bo$40bobo2b2o35bobo33b3o$27bo12bo3b2o38bo35bo$25b3o14b3o39b2o20b2o$ 24bo41b2o10b2o26bo$25b3o14b3o20bo2bo9bo28b3o$27bo12bo3b2o20b2o11b3o27b o$40bobo2b2o4b2o28bo$39bo5bo5b2o$40bo2b2o$40bo! """, 46, 1924) Gap = "3bo7bo7bo$b3o5b3o5b3o$o7bo7bo$2o6b2o6b2o21$" # string, not pattern! LinearClockEaters = pattern("3bo$b3o$o$2o5$" * 36 + Gap \ + "3bo$b3o$o$2o5$" * 10 + "24$" + "3bo$b3o$o$2o5$" * 17 \ + Gap + "3bo$b3o$o$2o5$" * 42 + Gap \ + "3bo$b3o$o$2o5$3bo7bo$b3o5b3o$o7bo$2o6b2o13$" \ + "3bo$b3o$o$2o5$" * 30 + "8$" + "3bo$b3o$o$2o5$" * 2 + Gap + "16$" \ + "3bo$b3o$o$2o5$" * 11 + "8$" + "3bo$b3o$o$2o5$" * 19, 101, 422) LinearClockCap = pattern(""" 3b2o13bo7bo$2bo2bo10b3o5b3o$bobobo9bo7bo14b2o$3obo10b2o6b2o13bobo$3o 29bo6b3o$30b2ob2ob3ob2o$30b2ob2ob5o$32bo5bo$2b2o29b2ob2o$2b2o3$32bo5bo $31b2o5b2o$30bob2o3b2obo$30bob2o3b2obo$31b3o3b3o$31b3o3b3o10$33b2ob2o$ 34bobo$34bobo$35bo! """, 83, 401) all += LinearClockGun[1840] + LinearClockEaters + LinearClockCap # slide 23: MWSS track -------------------- MWSS = pattern("b5o$o4bo$5bo$o3bo$2bo!", 521, 1973) P46Osc = pattern(""" 40bo$31b2o5b3o$10b3o14b2o3bo4bo$10bo3bo12b2o3bobo3bo$3bo6bo4bo17bobo3b o$b3o7bo3bo18bo3b2o$o$b3o7bo3bo7b3o$3bo6bo4bo5b2obob2o$10bo3bo5bo5b2o$ 10b3o8b2obob2o$23b3o!""") P46Gun = pattern(""" 31b2o$30b2o$31b5o9bo$16b3o13b4o9b3o$14bo3bo29bo$3bo9bo4bo13b4o9b3o$b3o 9bo3bo13b5o9bo$o29b2o$b3o9bo3bo13b2o$3bo9bo4bo$14bo3bo$16b3o!""") GliderToMWSS = P46Osc(449, 1963) + P46Gun(474, 1981) # exact match would be P46Gun[46](474, 1981), but that glider is absorbed StateBit = pattern("b2o$obo$bo!", 569, 1970) Snake = pattern("2o$o$bo$2o!", 570, 1965) BitKeeper = pattern(""" 15bobo2b2o19b2o$14bo3bob3o19bo$15bo6b2o15b3o$3bo12b5obo16bo$b3o15b3o$o $b3o15b3o$3bo12b5obo$15bo6b2o3b2o$14bo3bob3o4b2o$15bobo2b2o! """, 524, 1982) GliderFromTheBlue = pattern(""" 23b2o$23bo2bobo$25b2ob3o$31bo$25b2ob3o$12bo3bo8b2obo$11bo5bo$17bo$3bo 8bo3b2o$b3o9b3o$o$b3o9b3o19bo$3bo8bo3b2o7bo7b3o$17bo4bo2bob2o3bo$11bo 5bo10bo4bo$12bo3bo10bo4b2o2$23b5o$24b4o$26bo!""") GliderToLWSS = pattern(""" 3bo$2bobo$bo3bo3b2o$b5o3b2o$obobobo$bo3bo2$bo3bo$obobobo$b5o$bo3bo$2bo bo$3bo6$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2bo3bo2bo$2b3o 3b3o4$4b2ob2o$5bobo$5bobo$6bo!""", 663, 1931) # P46Osc really ReflectLWSS = pattern(""" b2o$b2o8$b3o3b3o$o2bo3bo2bo$2obo3bob2o14$3b2ob2o$4bobo$4bobo$5bo! """, 589, 1940) ReflectLWSS2 = pattern(""" 15b2o3bo$15b3obob2o4b2o$15b3o4bo4b2o$3bo14bo3bo$b3o15b3o$o$b3o15b3o$3b o14bo3bo$15b3o4bo$15b3obob2o$15b2o3bo!""", 573, 1884) # P46Osc really LWSStoBoat = pattern(""" 2o14b2o9b2o$2o15b2o8b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b5o$b2o3b2o9b2o 8b2o$2bobob2o8b2o9b2o$3b2o!""", 821, 1883) # P46Osc really ReflectMWSS = pattern(""" 22b2o5b2o$18b2o2b2o5b2o2b2o$18b2o2b2o5b2o2b2o$22b3o3b3o$21bo2bo3bo2bo$ 25bobo$21b2o7b2o$21b2o7b2o$24bo3bo$24b2ob2o$22b3o3b3o$22b2o5b2o$22bo7b o10$b2o27b2o$b2o25b2ob2o$26bo2bobo$6bo3b2o14bo$2o2b2obob3o14bo4bo$2o2b o4b3o15bo3bo$4bo3bo15b2o2b3o$5b3o16b2o2$5b3o$4bo3bo$2o2bo4b3o13b2o$2o 2b2obob3o13b2o$6bo3b2o2$b2o$b2o!""") HoneyBit = pattern("b2o$o2bo$b2o!") CornerSignalSystem = pattern() CornerSignalSystem += pattern(""" 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o! """, 70, 9) # P46OscAlt1 really # include stopper for pattern corners, destroyed in the interior of # multi-cell metapatterns by the tub-LWSS-fuse combination CornerSignalSystem += pattern("5b2o$5b2o3$2o2b2o$2o2b2o!", 86, 1) CornerSignalSystem += pattern(""" 11b2o$11b2o12$4b3o3b3o$4b3o3b3o$3bob2o3b2obo$3bob2o3b2obo$4b2o5b2o$5bo 5bo6$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o!""", 159, 0) # P46OscAlt1 really SignalSystem = pattern() for i in range(0,3): # place three sets of mechanisms to signal neighbors SignalSystem = SignalSystem[32](2047, 0, rcw) \ + HoneyBit(42, 111, rcw) + ReflectMWSS(38, 46) + GliderFromTheBlue(73, 52) \ + CornerSignalSystem + HoneyBit(964, 40) + GliderFromTheBlue[12](953, 52) # need to add the fourth (west) side separately because signal stops there, # so two-thirds of the pieces are customized or in slighly different locations # (could have started in SW corner and used range(0,4) for some of it, # but I happened to start in the NW corner and now I'm feeling lazy) # west edge: SignalSystem += HoneyBit(48, 1086, rcw) + pattern(""" 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o$4bo$b2o2bo7bo$2bo2bo 7bobo$o8b3o$2o9b3o2bo$9b2o4b2o$13b2o6$8bo3bo$8bo3bo3$5b2obo3bob2o$6b3o 3b3o$7bo5bo6$8b2ob2o$9bobo$9bobo$10bo!""", 52, 1059) # GliderFromTheBlue really # southwest corner: SignalSystem += pattern(""" 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o2$b2ob2o7b3o$2bob2o6bo 2bo$o13b2o$2o9bo3bo$11bo2b2o$13bob2o9$5b2o7b2o$5bob2o3b2obo$5bo3bobo3b o$5b2o2bobo2b2o$6b3o3b3o$7bo5bo4$8b2ob2o$9bobo6b2o$9bobo7bo$10bo5b3o$ 16bo!""", 52, 1885) # GliderFromTheBlue plus a terminating eater really SignalSystem += pattern(""" 24b2o$24b2o3$2o14b3o6b2o$2o12bo3bo6b2o$13bo4bo$13bo3bo2$3b3o7bo3bo$b2o bob2o5bo4bo$b2o5bo5bo3bo6b2o$b2obob2o8b3o6b2o$3b3o2$24b2o$24b2o! """, 0, 1818) # P46OscAlt1 really -- lengthened version of CornerSignalSystem SignalSystem += pattern("2o$2o2b2o$4b2o3$4b2o$4b2o!", 1, 1955) + pattern(""" 24b2o$24b2o2$14b3o$13bo4bo6b2o$12bo5bo6b2o$13bo$14b2o2$14b2o$13bo$2o 10bo5bo6b2o$2o11bo4bo6b2o$14b3o2$24b2o$24b2o!""", 9, 1961) # P46OscAlt1 really all += SignalSystem + GliderToMWSS + MWSS + Snake + BitKeeper all += GliderFromTheBlue(607, 1953) + GliderToLWSS + ReflectLWSS \ + ReflectLWSS2 + LWSStoBoat # all += StateBit # do this later on, when defining OFFcell and ONcell # slide 24: LWSS track -------------------- # [phase adjusters and a bunch of honeybits] PhaseAdjuster = P46Gun(2, 11, flip_y) + P46Gun[12](0, 32) \ + pattern("o$3o$3bo$2b2o!", 0, 13) \ + pattern("2b2o$bobo$bo$2o!", 2, 26) # eaters really all += PhaseAdjuster[43](1772,10) + PhaseAdjuster[26](2037, 1772, rcw) all += PhaseAdjuster[43](269, 2037, flip) + PhaseAdjuster[9](58, 1203, swap_xy_flip) # the third adjuster was a different shape in the original metacell, # but one of the same shape could be substituted with no ill effects LWSSPacketGun = pattern(""" 50b2o$52bo$37b2o10b2o2bo$37b2o11bo2bo$51bobo8bo$51b2o9b3o$65bo$40b2o9b 2o9b3o$38bo3b2o7bobo8bo$38bo4bo6bo2bo$38bo3b2o5b2o2bo$40b2o10bo$50b2o 5$52bo$52b3o$55bo$54b2o$41bo$41b3o$b2o5b2o34bo$b2o5b2o33b2o3$45b2o$43b o3bo5b2o9b2o$42bo5bo3bo2bo4b3o2bo$42bo4bo5bo4bo2b5o$42bo2bo7bo2b4o$43b obo8bob2o3bo$44bo8b2obob3o7b2o$55bo3bo8bobo$52b3o15bo$53bo16b2o$bo7bo$ b2o5b2o$b3o3b3o$3b2ob2o45b2o$3bo3bo22b2o21b2o$2o7b2o20bo$2o7b2o17b3o$ 4bobo21bo35b2o$o2bo3bo2bo53bobo$b3o3b3o56bo$66b2o$60b2o$60bo$b2o25b2o 31b3o$b2o25b2o33bo2$19b2o$17b2o2bo7b2o$17b6o6b2o$17b4o4$17b4o$17b6o6b 2o$17b2o2bo7b2o$19b2o2$28b2o$12bobo13b2o$13b2o$13bo5$17b2o$17b2o19$49b o3b3o$48bobo2b5o3b2o$48bo3b2o3b2o2b2o$49bo2bo3b2o$50b3o3bo2$50b3o3bo$ 49bo2bo3b2o$34b2o12bo3b2o3b2o2b2o$34b2o12bobo2b5o3b2o$49bo3b3o5$39bo$ 17b3o19b3o$17bo2bo21bo$17bo23b2o$17bo10bo$18bobo7b3o$31bo$30b2o$43bo3b o$42b5obo$41b3o4b2o$41b2ob5o$43b3o2$45bo$41bo2b3o$40b2obo3bo7b2o$34b2o 3b2ob3obo2b2o4bobo$34b2o3b3ob2o4b2o6bo$39b3o15b2o4$41bo$41bob3o$42bo3b o$13b2o3b2o8bo17bo$12bo2bobo2bo7bo2b2o10b2obo4b2o$11bo9bo5bo5bo11bo5bo bo$10b2o9b2o5bobo2b2o18bo$11bo9bo6bo3b2o3bo15b2o$12bo2bobo2bo9b3o4b3o 7b2o$13b2o3b2o20bo6bo$30b3o4b3o8b3o$28bo3b2o3bo12bo$12b2o14bobo2b2o$ 12b2o13bo5bo$28bo2b2o$28bo!""", 108, 710) all += LWSSPacketGun + pattern(""" b2o$b2o$7b3o$6bo3bo$6b2ob2o2$6b2ob2o$8bo4$bo7bo$o2bo3bo2bo$4bobo$4bobo $4bobo$o2bo3bo2bo$b3o3b3o8$3b2ob2o$4bobo$4bobo$5bo!""", 18, 725) # P46Osc really P46OscAlt1 = pattern(""" b2o$b2o2$6bo3b2o$2o2b2obob3o13b2o$2o2bo4b3o13b2o$4bo3bo$5b3o$19b2o3b2o $5b3o10b3o3b3o$4bo3bo7b3o7b3o$2o2bo4b3o4b3o7b3o$2o2b2obob3o4b3o7b3o$6b o3b2o6b3o3b3o$19b2o3b2o$b2o$b2o!""") all += P46OscAlt1(4, 24) + P46OscAlt1[12](224, 67, swap_xy_flip) P46OscAlt2 = pattern(""" 2o8b3o14b2o$2o8bo3bo12b2o$10bo4bo$11bo3bo2$11bo3bo7b3o$10bo4bo5b2obob 2o$2o8bo3bo5bo5b2o$2o8b3o8b2obob2o$23b3o!""") all += P46OscAlt2(179, 19) + P46OscAlt1[29](2023, 4, rcw) # got impatient here, started throwing in placeholders instead of true definitions -- # NE corner along E edge: all += pattern(""" b2o$b2o2$8b2o9b2o3b2o$2o5bobo8bob2ob2obo$2o4b2obo8bo7bo$7b2o9bob2ob2ob o$8bo10b2o3b2o2$8bo$7b2o$2o4b2obo15b2o$2o5bobo15b2o$8b2o2$b2o$b2o! """, 1980, 208) + pattern(""" 2b2o5b2o$2b2o5b2o15$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2b o3bo2bo$2b3o3b3o6$9b2o$9b2o!""", 2018, 179) # both P46OscAlt really # SE corner: all += pattern(""" 24b2o$24b2o$14bo$13bo2bo$12b5o8b2o$11b2ob3o8b2o$12bob2o$13b2o2$13b2o$ 12bob2o$2o9b2ob3o8b2o$2o10b5o8b2o$13bo2bo$14bo$24b2o$24b2o! """, 2017, 2007) # P46OscAlt really # SE corner along S edge: all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o10$4bo7bo$3bobo5bobo$6bo3bo$3bo2bo3bo2b o$4bobo3bobo$6b2ob2o$3b2ob2ob2ob2o$3b2o2bobo2b2o$4b3o3b3o$5bo5bo4$4b2o $4b2o!""", 1823, 1980) + pattern(""" 20bo$15bo3bo$14bo8b2o2b2o$14bo2b2o5bo2b2o$15b2o5bobo$16b3o3b2o2$16b3o 3b2o$15b2o5bobo$2o12bo2b2o5bo2b2o$2o12bo8b2o2b2o$15bo3bo$20bo! """, 1840, 2018) # both P46OscAlt really # SW corner: all += pattern(""" 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o! """, 24, 2017) # P46OscAlt really # SW corner along W edge: all += pattern(""" 24b2o$24b2o3$2o14b2o7b2o$2o15b2o6b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b 5o$b2o3b2o9b2o6b2o$2bobob2o8b2o7b2o$3b2o2$24b2o$24b2o! """, 41, 1769) + pattern(""" b2o5bo$b2o4bobo$6bo3bo$6bo3bo$5b3ob3o$6bo3bo$6b2ob2o$7bobo$8bo5$3bo3bo $3bo3bo3$2obo3bob2o$b3o3b3o$2bo5bo8$b2o5b2o$b2o5b2o! """, 6, 1786) # both P46OscAlt really # LWSS -> G -> LWSS timing adjustment, middle of W edge: all += pattern(""" b2o5b2o$b2o5b2o16$3o5b3o$o2b2ob2o2bo$b3o3b3o$2bo5bo7$b2o$b2o! """, 10, 1217) + pattern(""" 4bo$2b5o10bo$bo2bob2o9b2o8b2o$o7bo9b2o7b2o$bo2bob2o5b2o2b2o$2b5o$4bo2$ 13b2o2b2o$2o16b2o7b2o$2o15b2o8b2o$17bo! """, 35, 1269) # both P46OscAlt really # final LWSS reflector, middle of W edge: all += pattern(""" 15bo$14b2o$13b3obo9b2o$12b2o13b2o$3bo9b2o$b3o10bo$o$b3o10bo10bo$3bo9b 2o8b2obo$12b2o8b2ob3o$13b3obo5bo2bo$14b2o8b2o$15bo! """, 8, 973) # P46Osc really # slide 25: decode -------------------- # sync buffer: all += pattern(""" b2o5b2o$b2o5b2o7$2bo5bo$b3o3b3o$o2b2ob2o2bo$3o5b3o9$b3o$o3bo$2ob2o$bob o2$bobo$2ob2o$o3bo3b2o$b3o4b2o!""", 150, 958) # P46OscAlt3 really all += pattern(""" 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o$8bo2bo$8bo2bo15b 2o$8b2ob2o14b2o$10b2o!""", 155, 998) # P46OscAlt3 really all += pattern(""" 15bobo2b2o$2o12bo3bob3o4b2o$2o13bo6b2o3b2o$16b5obo$19b3o2$19b3o$16b5ob o$2o13bo6b2o$2o12bo3bob3o$15bobo2b2o!""", 114, 1008) # P46OscAlt3 really all += pattern(""" b2o$b2o11$2bo5bo$bobo3bobo$o3bobo3bo$o3bobo3bo$o9bo2$b2o5b2o3$3b2ob2o$ 4bobo$3b2ob2o$4bobo$3b2ob2o$4bobo$4bobo$5bo!""", 141, 1024) # P46OscAlt3 really # P46 to P40 converter: all += pattern(""" 14bo$14b3o$17bo$16b2o50bo$10b2o54b3o$11bo53bo$11bobo51b2o$12b2o57b2o$ 48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o10b2o$36bo$35b2o2$6b2o$7bo 22bo$7bobo19b2o$8b2o10bo4bo49b2o$19b2o3b2o30bo18bo$18b2o3b2o29b4o15bob o$19b2o4bo27b2o3b2o13b2o$20b2o34bo3bo$56bo3bo$56bo2b2o$54bo3bo2$33b2o$ 33bo$34b3o$36bo11b2o$22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$ 16bo43bo$16b2o39b3o8bo$30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b 2o21bo$17b2ob2o26bo20bobo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$24b2o10bo $24b2o9b2o21b2o$58b2o$16b2o$2b2o11b2obo15bo$bobo12bob4o13bo$bo15bo2b3o 10b3o39b2o$2o16bo3bo52bo$18b4o51bobo$20bo8b3o34b2o5b2o$31bo21b3o7bo2b 3o$17b2o11bo21b2ob2o2b4o2bo2bo$17b2o15b2o15bo4b2ob4ob2o2bo$34b2o16b6o 6b2obo$53b2o2bo8bo$6b2o49b2obo$5bobo50bobo$5bo52bo$4b2o42b2o$10b2o37bo $11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$7bo2$19b2o $19b2o4$2b2o13b2o$3bo11bo2bo$3bobo9bo2bo$4b2o8b2ob2o$13b2ob2o$12b2o3b 2o$13b3o2bo$18bo$15bobo15b2o$16bo16bobo$35bo$35b2o$29b2o$29bo$30b3o$ 32bo$18b2o$18bo$14bo4b3o$14b3o4bo$17bo$16b2o50bo$10b2o54b3o$11bo53bo$ 11bobo51b2o$12b2o57b2o$48b2o21bo$48bo20bobo$23b2o8bo12bobo20b2o$23b2o 8b3o10b2o$36bo$35b2o21b2o$58b2o$6b2o16bo$7bo15b3o$7bobo8bo3bo$8b2o7b3o bob2o8bo41b2o$16bo3b2obo8bobo19bo20bo$18b4o2bo7bo2bo17bobo3bobo4bo6bob o$12b5o2bo4bo5bo4bo16bo3b3obobo2bobo5b2o$12bo2b3o4bo2bo3bo5bo15b2o2bo 4bobobo3b2o$12b2o9b2o5bo3bo15b2ob3o5bo3b2o$31b2o16bo4bo$50b4o6b2o4bo2b o$51b2o6bo6bobo$33b2o24b3o4b2o$33bo24b2o$34b3o21bo$36bo11b2o$14bo7b2o 25bo$14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b 3o5bo$11bobo43bo7b2o$12b2o57b2o$48b2o21bo$18b2o28bo20bobo$18b2o13bo12b obo20b2o$33b3o10b2o$20bo15bo26b2o$14b3o3b2ob2o10b2o26b2o$14b2o5bobobo 32bo$6b2o8bo4bob2o31b2obo$7bo12b3o37bo5b2o$7bobo6b2o2bobo33b2o2bo5b2o$ 8b2o6b6o37bob2o12b2o$16b3o4b2o32bobob2o3b2o7bo$23b2o34bo2bo3b2o5bobo$ 57bob2o12b2o$59bob2o$60b2o4$33b2o$33bo$34b3o$36bo11b2o$14bo7b2o25bo$ 14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b3o5bo $11bobo43bo7b2o$12b2o57b2o$48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o 10b2o$36bo$35b2o2$6b2o$7bo10b3o8b2o$7bobo7bo2bo4bo3b2o$8b2o6bo3bo3bobo 48b2o$16bo7bobo25bo22bo$19bo32b2o19bobo$16b2obo37bo4bo10b2o$57b2o3b2o$ 58b2o3b2o$19bob2o34bo4b2o$19b3o39b2o$20bo$33b2o$33bo$34b3o$36bo11b2o$ 22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$16bo43bo$16b2o39b3o8bo$ 30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b2o21bo$17b2ob2o26bo20bo bo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$16b2o6b2o10bo$14bo3bo5b2o9b2o21b 2o$13bo4b2o38b2o$13bo5bo$2b2o$bobo10bo4bo$bo12b2obob2obo34b3o15b2o$2o 30bo2b3o19b4o14bo$31bo3bobo14b2o3b2ob2o3b2o6bobo$32bob3o14bo7bo5b3o5b 2o$49bo2bo5b3o3bob3o$49bo2bo5b2obo2b2obo$34b2o12bo3bo8b2ob2obo$34b2o 13b3o7bobo3bobo$60bo4bo2bo$6b2o57b3o$5bobo50b2o6bo$5bo52b2o$4b2o42b2o$ 10b2o37bo$11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$ 7bo2$19b2o$19b2o4$2b2o$3bo$3bobo$4b2o4b4o$9b2o2bo5b2o$8b2o2bo4bobob2o$ 9bo2bo2b2o5bo$10b2o6bo3bo$15bo5bo11b2o$16b4o13bobo$18bo16bo$35b2o$29b 2o$29bo$30b3o$32bo$18b2o$18bo$19b3o$21bo!""", 116, 1059) # really 14 p184 guns # logic core latches: all += pattern(""" 24bo2bo$14b3o7bo$13bo4bo9bo$12bo5bo8b2o$3bo9bo8bo$b3o10b2o8b2o$o$b3o 10b2o8b2o$3bo9bo8bo3bo$12bo5bo4bo2bo$13bo4bo4bo2bo$14b3o7b2o! """, 33, 1332) # P46Osc really all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o2$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$4bo 2bobo2bo$6bo3bo$4b2o5b2o$3b3o5b3o$3b3o5b3o5$10b3o$10b3o$9b5o$8b2o3b2o$ 8b2o3b2o4$8b2o3b2o$4b2o2b2o3b2o$4b2o3b5o$10b3o$10b3o!""", 35, 1348) # P46OscAlt1 really all += pattern(""" b2o$b2o2$13bobo2b2o$2o10bo3bob3o$2o11bo6b2o$14b5obo$17b3o2$17b3o$14b5o bo$2o11bo6b2o3b2o$2o10bo3bob3o4b2o$13bobo2b2o2$b2o$b2o! """, 24, 1661) # P46OscAlt1 really all += pattern(""" b2o$b2o12$b3o3b3o$b3o3b3o$ob2o3b2obo$ob2o3b2obo$b2o5b2o$2bo5bo3$3b2ob 2o$4bobo$4bobo$4bobo$3b2ob2o$4bobo$4bobo$5bo!""", 49, 1679) # P46Osc really all += pattern(""" b2o$o2bo$o7bo$o2bo3bobo$2ob2ob2ob2o$4bobo$3b2ob2o5$b3o3b3o$o9bo$o3bobo 3bo$b3o3b3o$2bo5bo10$3b2ob2o$4bobo$4bobo$5bo!""", 140, 1546) # P46Osc really all += pattern(""" 2b3o$2b3o4b2o$bo3bo3b2o$o5bo$b2ob2o2$b2ob2o$o5bo$bo3bo$2b3o$2b3o7$b2o 7b2o$bob2o3b2obo$bo3bobo3bo$b2o2bobo2b2o$2b3o3b3o$3bo5bo6$2b2o5b2o$2b 2o5b2o!""", 184, 1538) # P46OscAlt3 really all += pattern("2o$o$b3o$3bo!", 159, 1537) # eater really # slide 26: read B/S table -------------------- # most of the B/S logic latches -- missing some reflectors off to the left (?) # TODO: take this apart and integrate with missing pieces all += pattern(""" 34bo$33bobo$33bobo$32b2ob2o11$30bo7bo22b2o5b2o$29bobo5bobo21b2o5b2o$ 32bo3bo$29bo2bo3bo2bo$30bobo3bobo$32b2ob2o$29b2ob2ob2ob2o$29b2o2bobo2b 2o$30b3o3b3o$31bo5bo23b3o3b3o$60bo2bo3bo2bo$60b2obo3bob2o2$37b2o$37b2o 6$62bo$60b2ob2o$60b2ob2o15b2o5b2o$80b2o5b2o$59bobobobo2$60b2ob2o$61b3o 4b2o$62bo5b2o4$81bo5bo$80b3o3b3o$80bob2ob2obo$82b2ob2o$82b2ob2o$82b2ob 2o6$80b3o$80b3o2$79b2ob2o$79bo3bo$80b3o$81bo5b2o$87b2o199$51bo$50bobo$ 50bobo$49b2ob2o13$47bo7bo$46b4o3b4o$46bo3bobo3bo$47bo2bobo2bo$47b3o3b 3o7$47b2o$47b2o9$62b3ob3o9b2o$61bob2ob2obo7b2ob2o6b2o$60b2o7b2o7bo2bo 6b2o$61bob2ob2obo8bo2bo$62b3ob3o10b2o2$79b2o$78bo2bo$61b2o15bo2bo6b2o$ 61b2o14b2ob2o6b2o$78b2o5$80b2o5b2o$80b2o5b2o11$81bo5bo$80bobo3bobo$79b o3bobo3bo$79bo3bobo3bo$79bo9bo2$80b2o5b2o4$82bo3bo$80b2o$79bo3bobo3b2o $79bo3bobo$80b3o$87bo2bo$87b2o12$8b2o$8b2o13$b2o5b2o$o2bo3bo2bo$bo2bob o2bo$4bobo$2b3ob3o$3o5b3o$2o7b2o$2o7b2o$bob2ob2obo$bob2ob2obo2$3b2ob2o $4bobo$4bobo$5bo26$9bo$8bobo$8bobo$7b2ob2o11$5b2o5b2o$4bo2bo3bo2bo$7b 2ob2o$6bobobobo$6bobobobo$4bo9bo$3bo11bo2$7b2ob2o$5bo2bobo2bo$5b3o3b3o 3$5b2o$5b2o38$10bo$9bobo28bo$9bobo21b2o4bobo$8b2ob2o20bo5bobo$31bobo4b 2ob2o$18b2o11b2o$19bo18b2ob2o$19bobo$20b2o16b2ob2o3$23b2o$22bobo11bo7b o$24bo$6b2o5b2o19b3o7b3o$5bo2bo3bo2bo19b2ob2ob2ob2o$6bo2bobo2bo15b2o4b 3o3b3o$9bobo18bobo4bo5bo$7b3ob3o16bo$5b3o5b3o$5b2o7b2o$5b2o7b2o$6bob2o b2obo$6b3o3b3o$7bo5bo$9b3o3b3o$8bo2bo3bo2bo$12bobo$8b2o7b2o$8b2o7b2o$ 11bo3bo$11b2ob2o$9b3o3b3o$9b2o5b2o16bo5bo$9bo7bo15bobo3bobo$32bo3bobo 3bo$32bo3bobo3bo$32bo9bo2$33b2o5b2o3$35b2ob2o$36bobo$35b2ob2o$11b2ob2o 20bobo$12bobo20b2ob2o$12bobo21bobo$13bo22bobo$37bo3$52b2o$51b5o$35b2o 14bo4bo5b2o$35b2o14b3o2bo5b2o$52bo2b2o$53b2o$37bo3bo$35b2obobob2o9b2o$ 34bob2o3b2obo7bo2b2o$33bo2bo5bo2bo5b3o2bo5b2o$34bob2o3b2obo6bo4bo5b2o$ 35b2obobob2o7b5o$37bo3bo10b2o8$19b2o$18bo2bo$18bobo2bo$19bo$20b2obo$ 22bo3$21b2o$21b2o4b3o$27b3o$26bo3bo$26b2ob2o$26bo3bo$27bobo$27bobo$28b o5$23b2ob2o$22bo5bo2$21bo7bo$21bo2bobo2bo$21b3o3b3o9$21b2o5b2o$21b2o5b 2o23$9bo2bo$12bo7b3o$8bo9bo4bo$8b2o8bo5bo35bo$14bo8bo36b2o$11b2o8b2o 24b2o9bob3o$47b2o13b2o$11b2o8b2o38b2o$14bo8bo37bo$8b2o8bo5bo10b2o$8bo 9bo4bo11b2o24bo$12bo7b3o38b2o$9bo2bo34b2o13b2o10b2o$47b2o9bob3o11b2o$ 60b2o$60bo!""", 108, 1317) # slide 27: boat logic -------------------- all += pattern(""" 32b4o$31b2o2bo$30b2o2bo$26bo4bo2bo25b2o$24b3o5b2o25b2ob2o$23bo36bo2bo$ 24b3o5b2o26bo2bo4bo$26bo4bo2bo26b2o5b3o$30b2o2bo36bo$31b2o2bo25b2o5b3o $32b4o7bo16bo2bo4bo$41b2o17bo2bo$42b2o15b2ob2o$60b2o3$b2o$b2o2$14b4o$ 2o12bo2b2o$2o13bo2b2o$15bo2bo$16b2o2$16b2o15b2ob2o$15bo2bo12bobo3bo$2o 13bo2b2o5b2o3bobo3bo$2o12bo2b2o6b2o3bo4bo$14b4o11b2o5b3o$38bo$b2o$b2o! """, 209, 1852) # P46Osc plus P46Gun plus custom eater really # boat-logic: need to add outlying pieces to west, break up into 12 all += pattern(""" 119bo$35b2o81b2ob2o$34b5o11b2o54b2o10b2o2bo3b2o217b2o$34bo4bo11bo53bo 2bo11bob2o3bo217bo7b3o5b4o$34b3o2bo10bo49bo4bo2b2o9bo2bo3bo219bo6bo7b 2obo$21bo13bo2b2o11b3o43bo3bo3bo2bo11b2o5b3o213b3o7b2obo7bo10bo$19b3o 14b2o15bo41b7o5bo12bo8bo213bo11b2o5b2o11b3o$18bo75bo283bo$19b3o14b2o 57b7o5bo247b2o5b2o11b3o$21bo13bo2b2o57bo3bo3bo2bo246b2o7bo10bo$34b3o2b o60bo4bo2b2o251b2obo$34bo4bo65bo2bo252b4o$34b5o4b2obo59b2o11b2obo227bo $35b2o6b2ob3o70b2ob3o223b6o$49bo75bo221bo4bo$43b2ob3o70b2ob3o223b3ob2o $41bo2bobo70bo2bobo227bobo2bo$41b2o74b2o235b2o11$53bo37b2o$48bo3bo28b 2o7bobo187bo3bo$47bo7bo25b2o6b2obo186bo5bo$47bo2b2o5bo32b2o14bo107bobo 2b2o58bo$36bo11b2o5b2obo32bo14b3o90b2o12bo3bob3o4b2o43bo7b2o3bo8bo$34b 3o12b3o3b2ob3o48bo89b2o13bo6b2o3b2o41b3o9b3o9b3o$33bo27bo29bo14b3o106b 5obo46bo27bo$34b3o12b3o3b2ob3o29b2o14bo111b3o48b3o9b3o9b3o$36bo11b2o5b 2obo30b2obo17bo88bobo3bobo63bo7b2o3bo8bo$47bo2b2o5bo32bobo17b3o88bo3bo 12b3o58bo$47bo7bo35b2o20bo83bo11bo5b5obo57bo5bo$48bo3bo59b2o82bo3bo5bo 3bo3bo6b2o3b2o52bo3bo$53bo143bo11bo3bo3bob3o4b2o$201bo3bo8bobo2b2o$ 199bobo3bobo12$2b2o5b2o$2b2o5b2o$59bo229bob2o$58b2o228bo2b2o2b3o$57b2o 229bo6b2o$51bo6b2o2b2o9bo101b2o109b4o3b3o12bo$49b3o21b3o99bo108b3o3bo 3bo13b3o$48bo27bo99b3o70bo33bo27bo$49b3o21b3o102bo70b3o32b3o3bo3bo13b 3o$51bo6b2o2b2o9bo178bo33b4o3b3o12bo$57b2o192b2o35bo6b2o$58b2o228bo2b 2o2b3o$59bo229bob2o$2b3o3b3o$2b3o3b3o$bob2o3b2obo$bob2o3b2obo$2b2o5b2o $3bo5bo4$4b2ob2o$3bo5bo$b5ob2ob2o$2ob3ob2ob2o$3o6bo$bobo$2b2o263b4o5b 6o$212b6o5b4o40bob2o7b4o$212b4o7b2obo40bo7bob2o$76b2o46b2o89b2obo7bo 41b2o5b2o$75bo2bo44bo2bo90b2o5b2o$76b2o46b2o142b2o5b2o$217b2o5b2o41bo 7bob2o$215b2obo7bo26b2o12bob2o7b4o$212b4o7b2obo12b2o12b2o12b4o5b6o$ 212b6o5b4o12b2o!""", 679, 1875) # P46Osc1-4 boat logic # mystery stuff along bottom edge that needs a home in a slide: all += pattern(""" b2o5b2o$b2o5b2o14$3o5b3o$3o5b3o$b2o5b2o$3bo3bo$bo2bobo2bo$o3bobo3bo$bo 2bobo2bo$b3o3b3o5$8b2o$8b2o!""", 514, 1887) # P46OscAlt3 really all += pattern(""" 4bo7b2o$3b2o6bo2bo$2bo8bo2b2o$3b2obo4bo2bo10bo$4b3o6bo11b3o$28bo$4b3o 6bo11b3o$bob2obo4bo2bo10bo$o10bo2b2o$o3bo6bo2bo$b4o7b2o! """, 791, 1929) # P46Osc really all += pattern(""" 8bo$9bo3bo$2o2b2o8bo$2o2bo5b2o2bo$4bobo5b2o11bo$5b2o3b3o12b3o$28bo$5b 2o3b3o12b3o$4bobo5b2o11bo$4bo5b2o2bo$4b2o8bo$9bo3bo$8bo! """, 845, 1905) # P46Osc really all += pattern(""" 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o10b3ob3o$8bo2bo8bo b2ob2obo$2o6bo2bo7b2o7b2o$2o6b2ob2o7bob2ob2obo$10b2o9b3ob3o! """, 1050, 1903) # P46OscAlt2 really all += pattern(""" 9b2o$9b2o11$2b3o3b3o$bo3bobo3bo$o3b2ob2o3bo$ob2o5b2obo$2bo7bo11$2b2o5b 2o$2b2o5b2o!""", 1088, 1920) # P46OscAlt2 really all += pattern(""" 11bo$10b4o9bo$2b2o4b2o3bo9bo2b2o$2bo5b2o12bo5bo$3bo4b3o12bobo2b2o$3o 20bo3b2o3bo$o24b3o4b3o$35bo$25b3o4b3o$23bo3b2o3bo$23bobo2b2o$22bo5bo$ 7bob2o12bo2b2o$5b3ob2o12bo$4bo$5b3ob2o$7bobo2bo$11b2o! """, 1106, 1875) # P46OscAlt4 (boat-bit catcher?) really [not defined yet] all += pattern(""" 25bobo$26bo$17b2o13b2o$16b2ob2o12bo$17bo2bo11bo$3bo13bo2bo4b2o6b3o$b3o 14b2o15bo$o$b3o14b2o$3bo13bo2bo$17bo2bo$16b2ob2o$17b2o6b2obo$25b2ob3o$ 31bo$25b2ob3o$23bo2bobo$23b2o!""", 1227, 1875) # P46OscAlt4 really all += pattern("2o$obo$2bo$2b2o!", 1281, 1873) # eater all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o4$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$3b4o 3b4o$4bo7bo7$5bo$4b3o$3bo3bo$3b2ob2o$3b2ob2o2$3b2ob2o$3b2ob2o$3bo3bo3b 2o$4b3o4b2o$5bo!""", 1375, 1980) # P46OscAlt1 really # slide 28: clean up and start over -------------------- LWSSToGlider = pattern(""" 4b2o5b2o$2obobo5bobob2o$2ob2o7b2ob2o$2b6ob6o$4bob2ob2obo2$2bo11bo$3bo 9bo$5bobobobo$5bobobobo$6b2ob2o$3bo2bo3bo2bo$4b2o5b2o13$4b2o$4b2o! """, 443, 1980) # slide 29: toggle dist [not sure what that means, actually] -------------------- BoatLatchNE = pattern(""" 78b2o5b2o$78b2o5b2o15$77b2o7b2o$77bob2o3b2obo$77bo3bobo3bo$46b2o5b2o 22b2o2bobo2b2o$46b2o5b2o23b3o3b3o$79bo5bo4$47bo5bo$46b3o3b3o$45bo2b2ob 2o2bo22b2o$45bo3bobo3bo22b2o$47bobobobo2$44b2ob2o3b2ob2o$46bo7bo5$47bo $46b3o$45bo3bo$44bo5bo$44bo5bo$45bo3bo2$45bo3bo$44bo5bo$44bo5bo2b2o$ 45bo3bo3b2o$46b3o$47bo7$45b2o$45bo$46b3o$48bo20$13b2o$15bo$2o10b2o2bo 10b2o$2o11bo2bo10b2o$14bobo$14b2o2$14b2o$14bobo$2o11bo2bo$2o10b2o2bo$ 15bo$13b2o12$47b4o$46b2o2bo14b2o$45b2o2bo15b2o$46bo2bo$47b2o2$47b2o$ 46bo2bo$38b2o5b2o2bo15b2o$38b2o6b2o2bo14b2o$47b4o!""", 120, 232) # four P46osc really BoatLatchSW = pattern(""" 76bo$75bo2bo$74b5o10b2o$73b2ob3o10b2o$74bob2o$75b2o72b2o5b2o$145b2o3bo 5bo3b2o$75b2o68bo15bo$74bob2o68bo13bo$62b2o9b2ob3o10b2o$62b2o10b5o10b 2o$75bo2bo$76bo2$149b2o5b2o$149b2obobob2o$73b2o74bo2bobo2bo$73b2o74b3o 3b3o2$82b2o$72b2o7bo2b2o11b2o$57b2o5b2o6b2o6b6o11b2o$53b2o2b2o5b2o2b2o 12b4o77b2o89bo$53b2o13b2o93b2o84bo3bo$173bo60b2o12bo8b2o2b2o$173b2o59b 2o12bo2b2o5bo2b2o$6bo75b4o76b2o7bob3o11b2o60b2o5bobo$5bobo64b2o6b6o76b 2o11b2o10b2o61b3o3b2o$5bobo64b2o7bo2b2o88b2o$4b2ob2o73b2o90bo75b3o3b2o $156b2o64b2o25b2o5bobo$57b3o3b3o7b2o81b2o16bo48bo24bo2b2o5bo2b2o$56bo 3bobo3bo6b2o99b2o47bobo22bo8b2o2b2o$55bo3b2ob2o3bo94b2o11b2o47b2o23bo 3bo$55bob2o5b2obo94b2o7bob3o78bo$57bo7bo107b2o$173bo$163b2o$163b2o3$ 57b3o$b3o5b3o45bobo$2ob2o3b2ob2o43bo3bo$2obobobobob2o43bo3bo$bo3bobo3b o$bo2bo3bo2bo45b3o4b2o$2b3o3b3o53b2o6$2b2o$2b2o37$27b2o90b2o$27b2o81b 2o7b2o79b2o$110b2o88b2o$47b3o53b3o25bobo2b2o$26b2o6b3o8b2obob2o50bo3bo 11b2o10bo3bob3o$26b2o6bo3bo5bo5b2o50b2ob2o11b2o11bo6b2o54bo5bo$34bo4bo 5b2obob2o80b5obo54b3o3b3o$35bo3bo7b3o52b2ob2o28b3o55bob2ob2obo$104bo 87b2o7b2o$35bo3bo95b3o54b2o7b2o$34bo4bo92b5obo53b3o5b3o$26b2o6bo3bo12b 2o65b2o11bo6b2o3b2o49b3ob3o$26b2o6b3o14b2o50bo7bo6b2o10bo3bob3o4b2o51b obo$102bo2bo3bo2bo18bobo2b2o55bo2bobo2bo$106bobo83bo2bo3bo2bo$27b2o77b obo10b2o72b2o5b2o$27b2o77bobo10b2o$102bo2bo3bo2bo$103b3o3b3o7$99b2o13b 2o73b2o13b2o$99b2o2b2o5b2o2b2o73b2o2b2o5b2o2b2o$103b2o5b2o81b2o5b2o! """, 1534, 1849) # really eleven P45OscAlt1 plus an eater all += BoatLatchNE + BoatLatchSW + pattern(""" 273b2o$272bo2bo$140b2o130bobobo10b2o2bobo$140b2o131bo2bo3b2o4b3obo3bo 12b2o$277bo2b2o3b2o6bo13b2o$274bobo9bob5o$287b3o2$287b3o$286bob5o$285b 2o6bo13b2o$286b3obo3bo12b2o$287b2o2bobo3$175b2o$140b3o3b3o22bobo2bo$ 140bo2bobo2bo20b3ob2o79b2o$140b2obobob2o19bo84bo2bo$140b2o5b2o20b4o80b o7bo$171bob2o13bo64bo2bo3bobo$188b2o63b2ob2ob2ob2o$189b2o66bobo$184b2o 2b2o6bo42b2o15b2ob2o$142b2ob2o28bobo18b3o40b2o$140bo2bobo2bo26bobo21bo 3bo$140bobo3bobo15bo10b2o19b3o4b3o5b2o11b4o$140b3o3b3o15b3o9bo7b2o2b2o 6bo9bo4bo3b2o6b2o2bo12b2o$140b2o5b2o18bo5b2obobo10b2o14bo3bobo3b2o5b2o 2bo13b2o12b3o3b3o$140b2o5b2o17bo11bo9b2o14bo3bobo12bo2bo26bo9bo$140b2o 5b2o17b2o6bo2bo10bo15b2ob2o15b2o27bo3bobo3bo$176b2o76b3o3b3o$224b2o29b o5bo$223bo2bo$222b2o2bo13b2o$223b2o2bo12b2o$224b4o2$11b2o226b2o$10bobo 226b2o$10bo30b2o$9b2o30b2o226b2o5b2o$33b2o4bo13bo3b3o55b2o63b2o74b2ob 2o4b2obobo5bobob2o$33bo3b3o12bobo2b5o53bo7b3o5b4o35b2o6b2ob2o15b2o57bo bo5b2ob2o7b2ob2o$34bo3bobo11bo3b2o58bo6bo7b2obo35b2o6bo2bo17b2o34b2o5b 2o13bobo7b6ob6o$31b3o5b2o12bo2bo3b2obo49b3o7b2obo7bo10bo32bo2bo16bo7b 4o21b2o2b2o5b2o2b2o10bo10bob2ob2obo$31bo22b3o3b2ob3o47bo11b2o5b2o11b3o 31b2o25bo2b2o20b2o13b2o$66bo81bo58bo2b2o55bo11bo$54b3o3b2ob3o59b2o5b2o 11b3o31b2o26bo2bo4bo52bo9bo$53bo2bo3b2obo61b2o7bo10bo32bo2bo26b2o5b3o 52bobobobo$52bo3b2o73b2obo35b2o6bo2bo36bo51bobobobo$52bobo2b5o69b4o35b 2o6b2ob2o25b2o5b3o53b2ob2o$38bob2o11bo3b3o60bo59b2o25bo2bo4bo52bo2bo3b o2bo$36b3ob2o76b6o83bo2b2o23bo7bo25b2o5b2o$35bo81bo4bo83bo2b2o$36b3ob 2o76b3ob2o82b4o23b3o7b3o$38bobo2bo76bobo2bo108b2ob2ob2ob2o$42b2o80b2o 109b3o3b3o$236bo5bo2$114bo$10b2o9b3ob3o82b2o2bo$8b2ob2o7bob2ob2obo80bo 5bo$8bo2bo7b2o7b2o78b2o2bobo$3bo4bo2bo8bob2ob2obo80b2o3bo12bo$b3o5b2o 10b3ob3o82b3o14b3o$o129bo138b2o$b3o5b2o99b3o14b3o107b2ob2o27b2o$3bo4bo 2bo97b2o3bo12bo110bobo$8bo2bo15b2o73b2o4b2o2bobo123bobo$8b2ob2o14b2o 73b2o5bo5bo123bo$10b2o98b2o2bo$114bo13$170b2o2b2o4bo2b2o12b2o$170b2ob 2o6b2obo12b2o$174bobo6bo$175b2o4b3o2$175b2o4b3o$174bobo6bo$170b2ob2o6b 2obo$170b2o2b2o4bo2b2o!""", 178, 1939) # really P46Guns and Oscs, etc. all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o8$5bo5bo$4b3o3b3o$3b2ob2ob2ob2o$2b3o7b 3o2$4bo7bo5$5bo$4b3o$3bo2bo$3bobobo$4b3o$5bo5b2o$11b2o! """, 557, 1931) # P46OscAlt1 really # this particular one reflects a B signal from the above sync-buffer circuitry; # the resulting LWSS is converted to a glider which is stored as a boat-bit. # a few more outlying LWSS reflectors: all += pattern(""" 12b3o$10bo4bo11b2o$10bo5bo10b2o$3bobobo7bo$b7o5b2o$o$b7o5b2o$3bobobo7b o$10bo5bo$10bo4bo$12b3o!""", 257,1840) + pattern(""" 15b2o$13b2o2bo$13b6o$13b4o4bo3bo$21b7o$28bo$21b7o$13b4o4bo3bo$2o11b6o$ 2o11b2o2bo$15b2o!""", 885, 2033) # both P46Osc really # slide 30: HWSS control -------------------- HWSSGun = pattern(""" 21b2o23b2o$22bo22bobo$22bobo$23b2o$36b4o8bo$36bob2o7b2o$36bo$37b2o2$ 37b2o$36bo$7b2o2bobo22bob2o7b2o$2o4b3obo3bo21b4o8bo$2o3b2o6bo$6bob5o$ 7b3o35bobo$46b2o$7b3o$6bob5o14b2o$2o3b2o6bo8bo5bo$2o4b3obo3bo7bo4bo4b 2o$7b2o2bobo12b3o3b2o$23bob2ob2o$25bo$22bo2b3o11b2o$2b2o18b2o2b2o9bo4b o$2b2o20bo2bo15bo$24b3o10bo5bo$16b2o20b6o$b2o13bobo$b2o13bob2o$17b2o$ 17bo13b2o$30bobo$17bo13bo67b2o$17b2o80b2o$b2o13bob2o29b2o2bo4b2o16b2o 3b2o8bo$b2o13bobo30bob2o6b2o14bo2bobo2bo7bo2b2o$16b2o20bo11bo6bobo14bo 9bo5bo5bo3b2o$36b3o11b3o4b2o14b2o9b2o5bobo2b2o2b2o$2b2o31bo38bo9bo6bo 3b2o$2b2o32b3o11b3o4b2o16bo2bobo2bo9b3o$38bo11bo6bobo16b2o3b2o$24bo24b ob2o6b2o32b3o$23b3o23b2o2bo4b2o31bo3b2o$23bob2o35bo12b2o14bobo2b2o2b2o $24b3o11b2o22b2o11b2o13bo5bo3b2o$24b3o11bobo20bobo27bo2b2o$20b3ob3o13b o50bo$24b3o11b3o5bo52b2o$24b2o20b3o50b2o$2b2o45bo$2b2o19bo22b3o$11bo 10bo15b3o5bo$7b2o2bo10bo17bo$b2o3bo5bo25bobo$b2o2b2o2bobo12bo13b2o$6b 2o3bo38b2o$7b3o41b2o$50bo$7b3o$6b2o3bo$b2o2b2o2bobo$b2o3bo5bo48b2o$7b 2o2bo13b2o34b2o$11bo13bobo$2b2o23bo16b3o3bo$2b2o23b2o13b5o2bobo10b2o$ 41b2o3b2o3bo10b2o$42b2o3bo2bo$43bo3b3o2$43bo3b3o$42b2o3bo2bo$41b2o3b2o 3bo10b2o$42b5o2bobo10b2o$42bob3o3bo$40b2o$34b2o4b3o18b2o$34b2o3bo3bo 17b2o$38bo5bo$39b2ob2o2$39b2ob2o$38bo5bo$39bo3bo$40b3o$40b3o7$33b2o7b 2o$33bob2o3b2obo$33bo3bobo3bo$33b2o2bobo2b2o$34b3o3b3o$35bo5bo6$34b2o 5b2o$34b2o5b2o3$40bo2bo$30b3o7bo$16b2o11bo4bo9bo$16b2o10bo5bo8b2o$29bo 8bo$30b2o8b2o2$30b2o8b2o$29bo8bo3bo$16b2o10bo5bo4bo2bo$16b2o11bo4bo4bo 2bo$30b3o7b2o4$79b2o$78bo2bo$73bo7bo$72bobo3bo2bo$22bo48b2ob2ob2ob2o$ 20b3o52bobo$19bo54b2ob2o$19b2o$33bo$31b3o$14b2o14bo$15bo14b2o40b3o3b3o $15b2obo17b2o33bo9bo$18bo17bo34bo3bobo3bo$19b2o13bobo35b3o3b3o$15b3o2b 2o12b2o37bo5bo$17b2o$15bo2bo4bo$14bobobo3bo$13bo4bo$5b2o6bo2bob3o5bo$ 4bobo7bo3b3ob2o3bo$4bo10b2o5bo4bo$3b2o10b2o3b2o2bobo$15bo4bo$20b3o51b 2ob2o$16b2o57bobo$75bobo$12b2o2b3o57bo$13bobobo$14b4o$9b2o4bo$8bobo$8b o$7b2o7bobo$17b2o$17bo3$7b2o$8bo$8bobo$9b2o2$13bob2o$13bob2o2$22bo$12b 2o4bob2obo$12b2o2bo5bo$3b2o11bo5bo$4bo7b2o6b2o4b2o$4bobo5b2o4bobo5b2o$ 5b2o11b2o5$34b2o$34bobo$36bo$36b2o$30b2o$30bo$31b3o$33bo$19b2o$19bo$ 20b3o$22bo$34b2o7b2o$32b2o2bo6b2o$32b6o4bo2bo$22bo9b4o5bob2o$20b3o18bo b2o$19bo$20b3o18bob2o$22bo9b4o5bob2o14b2o$32b6o4b3ob2o11bo$32b2o2bo6bo bobo12b3o$34b2o7b4o15bo$44b2o!""") # TODO: take this apart further LWSSFromTheBlue = pattern(""" 27b2o5b2o$23b2o2b2o5b2o2b2o$23b2o13b2o2$28bo5bo$27b3o3b3o$26bo2b2ob2o 2bo$26bo3bobo3bo$28bobobobo2$25b2ob2o3b2ob2o$27bo7bo8$10b2o$8b2ob2o$8b o2bo$3bo4bo2bo$b3o5b2o15bo$o21b5o$b3o5b2o10bo2b3o7b2o$3bo4bo2bo10b2o 10b2o$8bo2bo$8b2ob2o$10b2o$25bo$25bo!""") # P46Osc really RowOfLWSSFTB = pattern("o$3o$3bo$2b2o!", 1737, 24) for i in range(43): RowOfLWSSFTB += LWSSFromTheBlue[(i*12) % 46](40*i, 0) HWSSHalfControl = HWSSGun(106, 87) + RowOfLWSSFTB(188, 79) CellCenter = HWSSHalfControl + HWSSHalfControl(2047, 2047, swap_xy_flip) OFFcell = all + CellCenter + StateBit # The metafier-OFF and -ON files technically should not exist (we just checked # at the beginning of the script). Shouldn't do any harm to check again, though: if os.access(OFFcellFileName, os.W_OK) or not os.access(OFFcellFileName, os.F_OK): try: OFFcell.save (OFFcellFileName, "Metapixel OFF cell: Brice Due, Spring 2006") except: # if tile can't be saved, it will be rebuilt next time -- # no need for an annoying error, just a note in the status bar g.show("Failed to save file version of OFF cell: " + OFFcellFileName) os.remove (OFFcellFileName) # slide 31: display on -------------------- g.show("Building ON metacell definition...") # switch on the HWSS guns: CellCenter += pattern("2o$2o!", 171, 124) + pattern("2o$2o!", 1922, 1875) # now generate the ONcell HWSSs and LWSSs # add rest of pattern after the center area is filled in # and p184 HWSS guns are in the same phase (3680 = 184 * 40) ONcell = all + CellCenter[3680] if os.access(ONcellFileName, os.W_OK) or not os.access(ONcellFileName, os.F_OK): try: ONcell.save (ONcellFileName, "Metapixel ON cell: Brice Due, Spring 2006") except: g.show("Failed to save file version of ON cell: " + ONcellFileName) os.remove(ONcellFileName) OFFcell += RuleBits ONcell += RuleBits g.new(layername) g.setalgo("QuickLife") # qlife's setcell is faster for j in xrange(selheight): for i in xrange(selwidth): golly.show("Placing (" + str(i+1) + "," + str(j+1) + ") tile" + " in a " + str(selwidth) + " by " + str(selheight) + " rectangle.") if livecell[i][j]: ONcell.put(2048 * i - 5, 2048 * j - 5) else: OFFcell.put(2048 * i - 5, 2048 * j - 5) g.fit() g.update() g.show("") g.setalgo("HashLife") # no point running a metapattern without hashing g.setoption("hyperspeed", False) # avoid going too fast g.setbase(8) g.setstep(4) g.step() # save start and populate hash tables # g.run(35328) # run one full cycle (can lock up Golly if construction has failed) # # Note that the first cycle is abnormal, since it does not advance the metapattern by # one metageneration: the first set of communication signals to adjacent cells is # generated during this first cycle. Thus at the end of 35328 ticks, the pattern # is ready to start its first "normal" metageneration (where cell states may change). # # It should be possible to define a version of ONcell that is not fully populated # with LWSSs and HWSSs until the end of the first full cycle. This would be much # quicker to generate from a script definition, and so it wouldn't be necessary to # save it to a file. The only disadvantage is that ONcells would be visually # indistinguishable from OFFcells until after the initial construction phase. golly-3.3-src/Scripts/Python/flood-fill.py0000644000175000017500000001116312706123635015533 00000000000000# Fill clicked region with current drawing state. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g from time import time # avoid an unbounded fill if g.empty(): if g.getwidth() == 0 or g.getheight() == 0: g.exit("You cannot fill an empty universe that is unbounded!") else: # set fill limits to the pattern's bounding box # (these will be extended below if the grid is bounded) r = g.getrect() minx = r[0] miny = r[1] maxx = minx + r[2] - 1 maxy = miny + r[3] - 1 # allow filling to extend to the edges of bounded grid if g.getwidth() > 0: minx = -int(g.getwidth()/2) maxx = minx + g.getwidth() - 1 if g.getheight() > 0: miny = -int(g.getheight()/2) maxy = miny + g.getheight() - 1 # ------------------------------------------------------------------------------ def checkneighbor(x, y, oldstate): # first check if x,y is outside fill limits if x < minx or x > maxx: return False if y < miny or y > maxy: return False return g.getcell(x, y) == oldstate # ------------------------------------------------------------------------------ def floodfill(): newstate = g.getoption("drawingstate") oldstate = newstate # wait for user to click a cell g.show("Click the region you wish to fill... (hit escape to abort)") while oldstate == newstate: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() x = int(xstr) y = int(ystr) if x < minx or x > maxx or y < miny or y > maxy: # click is outside pattern's bounding box in unbounded universe g.warn("Click within the pattern's bounding box\n"+ "otherwise the fill will be unbounded.") else: # note that user might have changed drawing state newstate = g.getoption("drawingstate") oldstate = g.getcell(x, y) if oldstate == newstate: g.warn("The clicked cell must have a different state\n"+ "to the current drawing state.") else: g.doevent(event) # tell Golly to handle all further keyboard/mouse events g.getevent(False) # do flood fill starting with clicked cell g.show("Filling clicked region... (hit escape to stop)") clist = [ (x,y) ] g.setcell(x, y, newstate) oldsecs = time() while len(clist) > 0: # remove cell from start of clist x, y = clist.pop(0) newsecs = time() if newsecs - oldsecs >= 0.5: # show changed pattern every half second oldsecs = newsecs g.update() # check if any orthogonal neighboring cells are in oldstate if checkneighbor( x, y-1, oldstate): g.setcell( x, y-1, newstate) clist.append( (x, y-1) ) if checkneighbor( x, y+1, oldstate): g.setcell( x, y+1, newstate) clist.append( (x, y+1) ) if checkneighbor( x+1, y, oldstate): g.setcell( x+1, y, newstate) clist.append( (x+1, y) ) if checkneighbor( x-1, y, oldstate): g.setcell( x-1, y, newstate) clist.append( (x-1, y) ) # diagonal neighbors are more complicated because we don't # want to cross a diagonal line of live cells if checkneighbor( x+1, y+1, oldstate) and (g.getcell(x, y+1) == 0 or g.getcell(x+1, y) == 0): g.setcell( x+1, y+1, newstate) clist.append( (x+1, y+1) ) if checkneighbor( x+1, y-1, oldstate) and (g.getcell(x, y-1) == 0 or g.getcell(x+1, y) == 0): g.setcell( x+1, y-1, newstate) clist.append( (x+1, y-1) ) if checkneighbor( x-1, y+1, oldstate) and (g.getcell(x, y+1) == 0 or g.getcell(x-1, y) == 0): g.setcell( x-1, y+1, newstate) clist.append( (x-1, y+1) ) if checkneighbor( x-1, y-1, oldstate) and (g.getcell(x, y-1) == 0 or g.getcell(x-1, y) == 0): g.setcell( x-1, y-1, newstate) clist.append( (x-1, y-1) ) # ------------------------------------------------------------------------------ oldcursor = g.getcursor() g.setcursor("Draw") try: floodfill() finally: g.setcursor(oldcursor) g.show(" ") golly-3.3-src/Scripts/Python/gun-demo.py0000644000175000017500000000252312026730263015213 00000000000000# Glider guns used in this script are 'aligned', which means gliders start in the # origin and go SE. # Based on gun_demo.py from PLife (http://plife.sourceforge.net/). from glife.base import * from glife.gun24 import * from glife.gun30 import * from glife.gun46 import * rule () # Life def mirror_gun (glider_gun): """mirror an 'aligned' glider gun and preserve its timing""" return glider_gun[2] (-1, 0, swap_xy) def compose_lwss_gun (glider_gun, A = -1, B = -1, C = -1): """construct an lwss gun using 3 copies of an 'aligned' glider gun. A, B and C are distances from the glider collision point to NE, NW and SW guns respectively""" if (A < 0): A = 40 if (B < 0): B = A; if (C < 0): C = A; m = min (A, B, C) a = A - m b = B - m c = C - m return \ glider_gun[4 * a] ( A, -A - 3, flip_x) + \ glider_gun[4 * b] (-B + 2, -B + 1) + \ glider_gun[4 * c + 1] (-C + 6, C, flip_y) lwss_eater = eater (4, 2, swap_xy) all = \ compose_lwss_gun (mirror_gun (gun24), 12, 11, 12) (0, -100) + lwss_eater (100, -100) + \ compose_lwss_gun (gun24, 11, 13, 4) + lwss_eater (100, 0) + \ compose_lwss_gun (gun30, 13, 11, 4) (0, 70) + lwss_eater (100, 70) + \ compose_lwss_gun (gun46, 22, 13, 3) (0, 130) + lwss_eater (100, 130) all.display ("gun-demo") golly-3.3-src/Scripts/Python/shift.py0000644000175000017500000000477012677364330014635 00000000000000# Shift current selection by given x y amounts using optional mode. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2006. # Updated to use exit command, Nov 2006. # Updated to check for bounded grid, Oct 2010. from glife import validint, inside from string import lower import golly as g selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") # use same file name as in shift.lua INIFileName = g.getdir("data") + "shift.ini" oldparams = "0 0 or" try: f = open(INIFileName, 'r') oldparams = f.readline() f.close() except: # should only happen 1st time (INIFileName doesn't exist) pass answer = g.getstring("Enter x y shift amounts and an optional mode\n" + "(valid modes are copy/or/xor, default is or):", oldparams, "Shift selection") xym = answer.split() # extract x and y amounts if len(xym) == 0: g.exit() if len(xym) == 1: g.exit("Supply x and y amounts separated by a space.") if not validint(xym[0]): g.exit("Bad x value: " + xym[0]) if not validint(xym[1]): g.exit("Bad y value: " + xym[1]) x = int(xym[0]) y = int(xym[1]) # extract optional mode if len(xym) > 2: mode = lower(xym[2]) if mode=="c": mode="copy" if mode=="o": mode="or" if mode=="x": mode="xor" if not (mode == "copy" or mode == "or" or mode == "xor"): g.exit("Unknown mode: " + xym[2] + " (must be copy/or/xor)") else: mode = "or" # given parameters are valid so save them for next run try: f = open(INIFileName, 'w') f.write(answer) f.close() except: g.warn("Unable to save given parameters in file:\n" + INIFileName) # abort shift if the new selection would be outside a bounded grid if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 newl = selrect[0] + x newr = newl + selrect[2] - 1 if newl < gridl or newr > gridr: g.exit("New selection would be outside grid.") if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 newt = selrect[1] + y newb = newt + selrect[3] - 1 if newt < gridt or newb > gridb: g.exit("New selection would be outside grid.") # do the shift by cutting the current selection and pasting it into # the new position without changing the current clipboard pattern selcells = g.getcells(selrect) g.clear(inside) selrect[0] += x selrect[1] += y g.select(selrect) if mode == "copy": g.clear(inside) g.putcells(selcells, x, y, 1, 0, 0, 1, mode) if not g.visrect(selrect): g.fitsel() golly-3.3-src/Scripts/Python/draw-lines.py0000644000175000017500000000764712026730263015561 00000000000000# Allow user to draw one or more straight lines by clicking end points. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g # ------------------------------------------------------------------------------ def drawline(x1, y1, x2, y2): # draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm; # we also return the old cells in the line so we can erase line later oldcells = [] # note that x1,y1 has already been drawn # oldcells.append( (x1, y1, g.getcell(x1, y1)) ) # g.setcell(x1, y1, drawstate) if x1 == x2 and y1 == y2: g.update() return oldcells dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: oldcells.append( (x1, y1, g.getcell(x1, y1)) ) g.setcell(x1, y1, drawstate) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: oldcells.append( (x1, y1, g.getcell(x1, y1)) ) g.setcell(x1, y1, drawstate) if d >= 0: x1 += sx d -= ay y1 += sy d += ax oldcells.append( (x2, y2, g.getcell(x2, y2)) ) g.setcell(x2, y2, drawstate) g.update() return oldcells # ------------------------------------------------------------------------------ def eraseline(oldcells): for t in oldcells: x, y, s = t g.setcell(x, y, s) # ------------------------------------------------------------------------------ def drawlines(): global oldline, firstcell started = False oldmouse = "" while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left altctrlshift" evt, x, y, butt, mods = event.split() oldmouse = x + ' ' + y if started: # draw permanent line from start pos to end pos endx = int(x) endy = int(y) drawline(startx, starty, endx, endy) # this is also the start of another line startx = endx starty = endy oldline = [] firstcell = [] else: # start first line startx = int(x) starty = int(y) firstcell = [ startx, starty, g.getcell(startx, starty) ] g.setcell(startx, starty, drawstate) g.update() started = True g.show("Click where to end this line (and start another line)...") else: # event might be "" or "key m none" if len(event) > 0: g.doevent(event) mousepos = g.getxy() if started and len(mousepos) == 0: # erase old line if mouse is not over grid if len(oldline) > 0: eraseline(oldline) oldline = [] g.update() elif started and len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so erase old line (if any) and draw new line if len(oldline) > 0: eraseline(oldline) x, y = mousepos.split() oldline = drawline(startx, starty, int(x), int(y)) oldmouse = mousepos # ------------------------------------------------------------------------------ g.show("Click where to start line...") oldcursor = g.getcursor() g.setcursor("Draw") drawstate = g.getoption("drawingstate") oldline = [] firstcell = [] # pos and state of the 1st cell clicked try: drawlines() finally: g.setcursor(oldcursor) if len(oldline) > 0: eraseline(oldline) if len(firstcell) > 0: x, y, s = firstcell g.setcell(x, y, s) golly-3.3-src/Scripts/Python/oscar.py0000644000175000017500000001346013127300132014600 00000000000000# Oscar is an OSCillation AnalyzeR for use with Golly. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Modified to handle B0-and-not-S8 rules, August 2009. # This script uses Gabriel Nivasch's "keep minima" algorithm. # For each generation, calculate a hash value for the pattern. Keep all of # the record-breaking minimal hashes in a list, with the oldest first. # For example, after 5 generations the saved hash values might be: # # 8 12 16 24 25, # # If the next hash goes down to 13 then the list can be shortened: # # 8 12 13. # # When the current hash matches one of the saved hashes, it is highly likely # the pattern is oscillating. By keeping a corresponding list of generation # counts we can calculate the period. We also keep lists of population # counts and bounding boxes; they are used to reduce the chance of spurious # oscillator detection due to hash collisions. The bounding box info also # allows us to detect moving oscillators (spaceships/knightships). import golly as g from glife import rect, pattern from time import time # -------------------------------------------------------------------- # initialize lists hashlist = [] # for pattern hash values genlist = [] # corresponding generation counts poplist = [] # corresponding population counts boxlist = [] # corresponding bounding boxes # -------------------------------------------------------------------- def show_spaceship_speed(period, deltax, deltay): # we found a moving oscillator if (deltax == deltay) or (deltax == 0) or (deltay == 0): speed = "" if (deltax == 0) or (deltay == 0): # orthogonal spaceship if (deltax > 1) or (deltay > 1): speed += str(deltax + deltay) else: # diagonal spaceship (deltax == deltay) if deltax > 1: speed += str(deltax) if period == 1: g.show("Spaceship detected (speed = " + speed + "c)") else: g.show("Spaceship detected (speed = " + speed + "c/" +str(period) + ")") else: # deltax != deltay and both > 0 speed = str(deltay) + "," + str(deltax) if period == 1: g.show("Knightship detected (speed = " + speed + "c)") else: g.show("Knightship detected (speed = " + speed + "c/" + str(period) + ")") # -------------------------------------------------------------------- def oscillating(): # return True if the pattern is empty, stable or oscillating # first get current pattern's bounding box prect = g.getrect() pbox = rect(prect) if pbox.empty: g.show("The pattern is empty.") return True # get current pattern and create hash of "normalized" version -- ie. shift # its top left corner to 0,0 -- so we can detect spaceships and knightships ## currpatt = pattern( g.getcells(prect) ) ## h = hash( tuple( currpatt(-pbox.left, -pbox.top) ) ) # use Golly's hash command (3 times faster than above code) h = g.hash(prect) # check if outer-totalistic rule has B0 but not S8 rule = g.getrule().split(":")[0] hasB0notS8 = rule.startswith("B0") and (rule.find("/") > 1) and not rule.endswith("8") # determine where to insert h into hashlist pos = 0 listlen = len(hashlist) while pos < listlen: if h > hashlist[pos]: pos += 1 elif h < hashlist[pos]: # shorten lists and append info below del hashlist[pos : listlen] del genlist[pos : listlen] del poplist[pos : listlen] del boxlist[pos : listlen] break else: # h == hashlist[pos] so pattern is probably oscillating, but just in # case this is a hash collision we also compare pop count and box size if (int(g.getpop()) == poplist[pos]) and \ (pbox.wd == boxlist[pos].wd) and \ (pbox.ht == boxlist[pos].ht): period = int(g.getgen()) - genlist[pos] if hasB0notS8 and (period % 2 > 0) and (pbox == boxlist[pos]): # ignore this hash value because B0-and-not-S8 rules are # emulated by using different rules for odd and even gens, # so it's possible to have identical patterns at gen G and # gen G+p if p is odd return False if pbox == boxlist[pos]: # pattern hasn't moved if period == 1: g.show("The pattern is stable.") else: g.show("Oscillator detected (period = " + str(period) + ")") else: deltax = abs(boxlist[pos].x - pbox.x) deltay = abs(boxlist[pos].y - pbox.y) show_spaceship_speed(period, deltax, deltay) return True else: # look at next matching hash value or insert if no more pos += 1 # store hash/gen/pop/box info at same position in various lists hashlist.insert(pos, h) genlist.insert(pos, int(g.getgen())) poplist.insert(pos, int(g.getpop())) boxlist.insert(pos, pbox) return False # -------------------------------------------------------------------- def fit_if_not_visible(): # fit pattern in viewport if not empty and not completely visible r = rect(g.getrect()) if (not r.empty) and (not r.visible()): g.fit() # -------------------------------------------------------------------- g.show("Checking for oscillation... (hit escape to abort)") oldsecs = time() while not oscillating(): g.run(1) newsecs = time() if newsecs - oldsecs >= 1.0: # show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() fit_if_not_visible() golly-3.3-src/Scripts/Python/pop-plot.py0000644000175000017500000001164613125321675015264 00000000000000# Run the current pattern for a given number of steps (using current # step size) and create a plot of population vs time in separate layer. # Author: Andrew Trevorrow (andrew@trevorrow.com), May 2007. import golly as g from glife import getminbox, rect, rccw from glife.text import make_text from time import time # -------------------------------------------------------------------- # size of plot xlen = 500 # length of x axis ylen = 500 # length of y axis # -------------------------------------------------------------------- # draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm def draw_line(x1, y1, x2, y2): g.setcell(x1, y1, 1) if x1 == x2 and y1 == y2: return dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: g.setcell(x1, y1, 1) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: g.setcell(x1, y1, 1) if d >= 0: x1 += sx d -= ay y1 += sy d += ax g.setcell(x2, y2, 1) # -------------------------------------------------------------------- # fit pattern in viewport if not empty and not completely visible def fit_if_not_visible(): try: r = rect(g.getrect()) if (not r.empty) and (not r.visible()): g.fit() except: # getrect failed because pattern is too big g.fit() # -------------------------------------------------------------------- if g.empty(): g.exit("There is no pattern.") # check that a layer is available for population plot layername = "population plot" poplayer = -1 for i in xrange(g.numlayers()): if g.getname(i) == layername: poplayer = i break if poplayer == -1 and g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # prompt user for number of steps numsteps = xlen s = g.getstring("Enter the number of steps:", str(numsteps), "Population plotter") if len(s) > 0: numsteps = int(s) if numsteps <= 0: g.exit() # generate pattern for given number of steps poplist = [ int(g.getpop()) ] genlist = [ int(g.getgen()) ] oldsecs = time() for i in xrange(numsteps): g.step() poplist.append( int(g.getpop()) ) genlist.append( int(g.getgen()) ) newsecs = time() if newsecs - oldsecs >= 1.0: # show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() g.show("Step %i of %i" % (i+1, numsteps)) fit_if_not_visible() # save some info before we switch layers stepsize = "%i^%i" % (g.getbase(), g.getstep()) pattname = g.getname() # create population plot in separate layer g.setoption("stacklayers", 0) g.setoption("tilelayers", 0) g.setoption("showlayerbar", 1) if poplayer == -1: poplayer = g.addlayer() else: g.setlayer(poplayer) g.new(layername) # use QuickLife with an unbounded grid g.setalgo("QuickLife") g.setrule("B3/S23") deadr, deadg, deadb = g.getcolor("deadcells") if (deadr + deadg + deadb) / 3 > 128: # use black if light background g.setcolors([1,0,0,0]) else: # use white if dark background g.setcolors([1,255,255,255]) minpop = min(poplist) maxpop = max(poplist) if minpop == maxpop: # avoid division by zero minpop -= 1 popscale = float(maxpop - minpop) / float(ylen) mingen = min(genlist) maxgen = max(genlist) genscale = float(maxgen - mingen) / float(xlen) # draw axes with origin at 0,0 draw_line(0, 0, xlen, 0) draw_line(0, 0, 0, -ylen) # add annotation using mono-spaced ASCII font t = make_text(pattname.upper(), "mono") bbox = getminbox(t) t.put((xlen - bbox.wd) / 2, -ylen - 10 - bbox.ht) t = make_text("POPULATION", "mono") bbox = getminbox(t) t.put(-10 - bbox.ht, -(ylen - bbox.wd) / 2, rccw) t = make_text(str(minpop), "mono") bbox = getminbox(t) t.put(-bbox.wd - 10, -bbox.ht / 2) t = make_text(str(maxpop), "mono") bbox = getminbox(t) t.put(-bbox.wd - 10, -ylen - bbox.ht / 2) t = make_text("GENERATION (step=%s)" % stepsize, "mono") bbox = getminbox(t) t.put((xlen - bbox.wd) / 2, 10) t = make_text(str(mingen), "mono") bbox = getminbox(t) t.put(-bbox.wd / 2, 10) t = make_text(str(maxgen), "mono") bbox = getminbox(t) t.put(xlen - bbox.wd / 2, 10) # display result at scale 1:1 g.fit() g.setmag(0) g.show("") # plot the data (do last because it could take a while if numsteps is huge) x = int(float(genlist[0] - mingen) / genscale) y = int(float(poplist[0] - minpop) / popscale) oldsecs = time() for i in xrange(numsteps): newx = int(float(genlist[i+1] - mingen) / genscale) newy = int(float(poplist[i+1] - minpop) / popscale) draw_line(x, -y, newx, -newy) x = newx y = newy newsecs = time() if newsecs - oldsecs >= 1.0: # update plot every second oldsecs = newsecs g.update() golly-3.3-src/Scripts/Python/tile-with-clip.py0000644000175000017500000000362412026730263016336 00000000000000# Tile current selection with clipboard pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. # Updated to handle multi-state patterns, Aug 2008. from glife import * import golly as g # assume one-state cell list (may change below) inc = 2 # ------------------------------------------------------------------------------ def clip_rb (patt, right, bottom): # remove any cells outside given right and bottom edges clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 y = 1 while x < len(clist): if (clist[x] > right) or (clist[y] > bottom): # remove cell from list clist[x : x+inc] = [] else: x += inc y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ selrect = rect( g.getselrect() ) if selrect.empty: g.exit("There is no selection.") cliplist = g.getclip() # 1st 2 items are wd,ht pbox = rect( [0, 0] + cliplist[0 : 2] ) cliplist[0 : 2] = [] # remove wd,ht p = pattern( cliplist ) if len(cliplist) & 1 == 1: inc = 3 # multi-state? g.clear(inside) if len(cliplist) > 0: # tile selrect with p, clipping right & bottom edges if necessary y = selrect.top while y <= selrect.bottom: bottom = y + pbox.height - 1 x = selrect.left while x <= selrect.right: right = x + pbox.width - 1 if (right <= selrect.right) and (bottom <= selrect.bottom): p.put(x, y) else: clip_rb( p(x, y), selrect.right, selrect.bottom ).put() x += pbox.width y += pbox.height if not selrect.visible(): g.fitsel() golly-3.3-src/Scripts/Python/move-selection.py0000644000175000017500000001567513011772276016452 00000000000000# Allow user to move the current selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g # set edges of bounded grid for later use if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 # -------------------------------------------------------------------- def showhelp(): g.note( """Alt-clicking in the selection allows you to COPY it to another location (the original selection is not deleted). While moving the selection the following keys can be used: x - flip selection left-right y - flip selection top-bottom > - rotate selection clockwise < - rotate selection anticlockwise h - show this help escape - abort and restore the selection""") # ------------------------------------------------------------------------------ def cellinrect(x, y, r): # return True if given cell position is inside given rectangle if x < r[0] or x >= r[0] + r[2]: return False if y < r[1] or y >= r[1] + r[3]: return False return True # ------------------------------------------------------------------------------ def rectingrid(r): # return True if all of given rectangle is inside grid if g.getwidth() > 0 and (r[0] < gridl or r[0] + r[2] - 1 > gridr): return False if g.getheight() > 0 and (r[1] < gridt or r[1] + r[3] - 1 > gridb): return False return True # ------------------------------------------------------------------------------ def lookforkeys(event, deltax, deltay): global oldcells, selrect, selpatt # look for keys used to flip/rotate selection if event == "key x none" or event == "key y none": # flip floating selection left-right or top-bottom if len(oldcells) > 0: g.clear(0) g.putcells(selpatt, deltax, deltay) if " x " in event: g.flip(0) else: g.flip(1) selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key > none" or event == "key < none": # rotate floating selection clockwise or anticlockwise; # because we use g.rotate below we have to use the exact same # calculation (see Selection::Rotate in wxselect.cpp) for rotrect: midx = selrect[0] + int((selrect[2]-1)/2) midy = selrect[1] + int((selrect[3]-1)/2) newleft = midx + selrect[1] - midy newtop = midy + selrect[0] - midx rotrect = [ newleft, newtop, selrect[3], selrect[2] ] if not rectingrid(rotrect): g.show("Rotation is not allowed if selection would be outside grid.") return g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) oldcells = g.join(oldcells, g.getcells(rotrect)) g.clear(0) g.select(rotrect) g.clear(0) g.select(selrect) g.putcells(selpatt, deltax, deltay) if " > " in event: g.rotate(0) else: g.rotate(1) selrect = g.getselrect() selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key h none": # best not to show Help window while dragging selection! return g.doevent(event) # ------------------------------------------------------------------------------ def moveselection(): global oldcells, selrect, selpatt # wait for click in selection while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() x = int(xstr) y = int(ystr) if cellinrect(x, y, selrect): oldmouse = xstr + ' ' + ystr firstx = x firsty = y xoffset = firstx - selrect[0] yoffset = firsty - selrect[1] if mods == "alt": # don't delete pattern in selection oldcells = g.getcells(selrect) break elif event == "key h none": showhelp() else: g.doevent(event) # wait for mouse-up while moving selection g.show("Move mouse and release button...") mousedown = True while mousedown: event = g.getevent() if event.startswith("mup"): mousedown = False elif len(event) > 0: lookforkeys(event, x - firstx, y - firsty) # update xoffset,yoffset in case selection was rotated xoffset = x - selrect[0] yoffset = y - selrect[1] mousepos = g.getxy() if len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so move selection rect and pattern g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) xstr, ystr = mousepos.split() x = int(xstr) y = int(ystr) selrect[0] = x - xoffset selrect[1] = y - yoffset if g.getwidth() > 0: # ensure selrect doesn't move beyond left/right edge of grid if selrect[0] < gridl: selrect[0] = gridl x = selrect[0] + xoffset elif selrect[0] + selrect[2] - 1 > gridr: selrect[0] = gridr + 1 - selrect[2] x = selrect[0] + xoffset if g.getheight() > 0: # ensure selrect doesn't move beyond top/bottom edge of grid if selrect[1] < gridt: selrect[1] = gridt y = selrect[1] + yoffset elif selrect[1] + selrect[3] - 1 > gridb: selrect[1] = gridb + 1 - selrect[3] y = selrect[1] + yoffset g.select(selrect) oldcells = g.getcells(selrect) g.putcells(selpatt, x - firstx, y - firsty) oldmouse = mousepos g.update() # ------------------------------------------------------------------------------ selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") selpatt = g.getcells(selrect) # remember initial selection in case user aborts script firstrect = g.getselrect() firstpatt = g.getcells(selrect) g.show("Click anywhere in selection, move mouse and release button... (hit 'h' for help)") oldcursor = g.getcursor() g.setcursor("Move") oldcells = [] try: aborted = True moveselection() aborted = False finally: g.setcursor(oldcursor) if aborted: g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) g.putcells(firstpatt) g.select(firstrect) else: g.show(" ") golly-3.3-src/Scripts/Python/envelope.py0000644000175000017500000000767312026730263015330 00000000000000# Use multiple layers to create a history of the current pattern. # The "envelope" layer remembers all live cells. # Author: Andrew Trevorrow (andrew@trevorrow.com), December 2006. # Updated for better compatibility with envelope.pl, June 2007. # Updated to use new setcolors command, September 2008. import golly as g if g.empty(): g.exit("There is no pattern.") currindex = g.getlayer() startindex = 0 envindex = 0 startname = "starting pattern" envname = "envelope" if currindex > 1 and g.getname(currindex - 1) == startname \ and g.getname(currindex - 2) == envname : # continue from where we left off startindex = currindex - 1 envindex = currindex - 2 elif currindex + 2 < g.numlayers() \ and g.getname(currindex + 1) == startname \ and g.getname(currindex) == envname : # switch from envelope layer to current layer and continue currindex += 2 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 elif currindex + 1 < g.numlayers() \ and g.getname(currindex) == startname \ and g.getname(currindex - 1) == envname : # switch from starting layer to current layer and continue currindex += 1 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 else: # start a new envelope using pattern in current layer if g.numlayers() + 1 > g.maxlayers(): g.exit("You need to delete a couple of layers.") if g.numlayers() + 2 > g.maxlayers(): g.exit("You need to delete a layer.") # get current layer's starting pattern startpatt = g.getcells(g.getrect()) envindex = g.addlayer() # create layer for remembering all live cells g.setcolors([-1,100,100,100]) # set all states to darkish gray g.putcells(startpatt) # copy starting pattern into this layer startindex = g.addlayer() # create layer for starting pattern g.setcolors([-1,0,255,0]) # set all states to green g.putcells(startpatt) # copy starting pattern into this layer # move currindex to above the envelope and starting pattern g.movelayer(currindex, envindex) g.movelayer(envindex, startindex) currindex = startindex startindex = currindex - 1 envindex = currindex - 2 # name the starting and envelope layers so user can run script # again and continue from where it was stopped g.setname(startname, startindex) g.setname(envname, envindex) # ------------------------------------------------------------------------------ def envelope (): # draw stacked layers using same location and scale g.setoption("stacklayers", 1) g.show("Hit escape key to stop script...") while True: g.run(1) if g.empty(): g.show("Pattern died out.") break # copy current pattern to envelope layer; # we temporarily disable event checking so thumb scrolling # and other mouse events won't cause confusing changes currpatt = g.getcells(g.getrect()) g.check(0) g.setlayer(envindex) g.putcells(currpatt) g.setlayer(currindex) g.check(1) step = 1 exp = g.getstep() if exp > 0: step = g.getbase()**exp if int(g.getgen()) % step == 0: # display all 3 layers (envelope, start, current) g.update() # ------------------------------------------------------------------------------ # show status bar but hide layer & edit bars (faster, and avoids flashing) oldstatus = g.setoption("showstatusbar", True) oldlayerbar = g.setoption("showlayerbar", False) oldeditbar = g.setoption("showeditbar", False) try: envelope() finally: # this code is always executed, even after escape/error; # restore original state of status/layer/edit bars g.setoption("showstatusbar", oldstatus) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) golly-3.3-src/Scripts/Python/make-Devore-tape.py0000644000175000017500000004301712026730263016571 00000000000000# ================================================= # A Golly script to write the program and data # tapes for the Devore UCC. Load Devore-body.rle # and run this script, then set the machine running. # # Tape length: 105k # Rep period: 1.02 x 10^11 (102 billion) timesteps # # Script license: public domain # # Contact: tim.hutton@gmail.com # Thanks to Ron Hightower and John Devore # ================================================= import golly as g program_tape_x = 322 program_tape_y = 233 data_tape_x = 330 data_tape_y = 8 # range from start to stop (either direction) # twoway_range(0,10,2)==[0,2,4,6,8] # twoway_range(0,-10,2)==[0,-2,-4,-6,-8] def twoway_range(start,stop,step=1): return range(start,stop,(-1 if (stop-start)<0 else 1)*abs(step)) # range from start to stop including both end points (either direction) # inclusive_range(0,10,2)==[0,2,4,6,8,10] # inclusive_range(10,0,2)==[10,8,6,4,2,0] # inclusive_range(0,-10,2)==[0,-2,-4,-6,-8,-10] def inclusive_range(start,stop,step=1): return twoway_range(start,stop+(-1 if (stop-start)<0 else 1)*abs(step),step) ''' Devore instruction set: (the program tape) 0000 goto (following bits give destination) 0001 move data head (D) left 0010 move data head right 0011 jump_if_one [from whichever path is open] (following bits give destination) 0100 m (mark_if_zero) [affects whichever path is open] 0101 e (erase_if_one) [affects whichever path is open] 0110 switch between construction path and data path [D open by default] 0111 x (extend) [all these below only affect C] 1000 xl 1001 xr 1010 r (retract) 1011 rl 1100 rr 1101 i (inject sheath) # legacy from Codd, don't use this! (see below) 1110 j (inject trigger) 1111 stop Destination bits: first is sign (0=backwards, 1=forwards), followed by unary count of marks and zero terminator. E.g. 111110=+4, 011110=-4 Marks lie 6 cells below the program tape, and appear on the column before the start of the command they mark. Not every command needs a mark, just those jumped-to. Destination says how many marks forward or backwards to jump. Exception is when a goto is immediately followed by a mark - in this case the goto destination is decremented because the next mark is skipped over anyway. For injection, use the pattern: 1 1 1 1 1 1 1 1 1 Approach from the left into the receiver, then retract. This injects the sheathing signal. Then call the inject_trigger command. You can then safely retract away. The inject_sheath command was used by Codd but is now redundant, it appears. ''' goto = '0000' toggle_C_or_D = '0110' data_head_left = '0001' data_head_right = '0010' extend = '0111' extend_left = '1000' extend_right = '1001' retract = '1010' retract_left = '1011' retract_right = '1100' mark = '0100' erase = '0101' jump_if_one = '0011' inject_sheath = '1101' inject_trigger = '1110' stop = '1111' def write_string(s): global program_tape_x, program_tape_y for c in s: if c=='1': g.setcell(program_tape_x,program_tape_y,1) program_tape_x += 1 def write_data_string(s): global data_tape_x, data_tape_y for c in s: if c=='1': g.setcell(data_tape_x,data_tape_y,1) data_tape_x += 1 def write_program(program): global program_tape_x, program_tape_y # find all the labels labels = [c[:-1] for c in program if c[-1]==':'] iCurrentLabel=0 for i,c in enumerate(program): if 'jump_if_one:' in c: write_string(jump_if_one) jump = labels.index(c[c.index(':')+1:])+1-iCurrentLabel if jump<1: jump-=1 if jump>1 and program[i+1][-1]==':': jump -= 1 # (if next command is a label we don't need to jump so far) if jump<0: write_string('0') else: write_string('1') write_string('1'*abs(jump)+'0') elif 'goto:' in c: write_string(goto) jump = labels.index(c[c.index(':')+1:])+1-iCurrentLabel if jump<1: jump-=1 if jump>1 and program[i+1][-1]==':': jump -= 1 # (if next command is a label we don't need to jump so far) if jump<0: write_string('0') else: write_string('1') write_string('1'*abs(jump)+'0') elif c[-1]==':': # a label, make a mark on the marker tape g.setcell(program_tape_x-1,program_tape_y-6,1) iCurrentLabel+=1 else: # a normal command write_string(c) # ------------------------------------ # create the program: # ------------------------------------ program = [ # ---------- data tape copying phase: ------------------------ 'goto:extendup', 'write1:', # == 1 == extend_right,toggle_C_or_D,mark,toggle_C_or_D,retract_right,extend, 'nextread:', data_head_left, 'jump_if_one:write1', # 0: extend, data_head_left, 'jump_if_one:write1', # == 00 == extend, data_head_left, 'jump_if_one:write1', # == 000 == # -- end of copy -- data_head_right, # we overshot (first data entry is 01) toggle_C_or_D, # open C 'retractcopy:', retract,extend_left,extend,'jump_if_one:retractdown', retract,retract_left,'goto:retractcopy', # ---------- construction phase: ------------------------ 'rowstart:', # move into writing position extend_right,extend,extend,extend, # (make a mark at the start of the row for retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'nextcolumn:', data_head_right, 'jump_if_one:1', # 0: data_head_right, 'jump_if_one:01', # == 00 == data_head_right, 'jump_if_one:001', # == 000 == # (assume came immediately after start of a new row) extend_left,extend,toggle_C_or_D,erase,retract,retract_left, retract,retract,retract,retract_right, 'retractcolumn:', extend_left,extend,'jump_if_one:doneretractcolumn', retract,retract_left,retract,'goto:retractcolumn', 'doneretractcolumn:',erase,retract,retract_left, 'goto:inject', '001:', # == 001 == # -- retract row -- toggle_C_or_D, # open C 'retractrow:', retract,extend_left,extend,'jump_if_one:doneretractrow', retract,retract_left,'goto:retractrow', 'doneretractrow:', erase,retract,retract_left,toggle_C_or_D,retract,retract,retract,retract_right, extend, 'goto:rowstart', '01:', # == 01 == # -- write N 0's -- extend,extend,extend, 'goto:nextcolumn', '1:', data_head_right, 'jump_if_one:11', # == 10 == # -- write a 0 -- extend, 'goto:nextcolumn', '11:', # == 11 == # -- write a 1 -- extend_right, toggle_C_or_D, # open C mark, toggle_C_or_D, # close C retract_right, extend, 'goto:nextcolumn', # ------------------------ subroutines (here for speed): ----------------- 'extendup:', # move the construction arm into the starting position extend_right,extend,extend,extend,extend,extend,extend,extend,extend, # move up to the right height extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend, # move into writing position extend_right,extend,extend,extend, # (make a mark at the start of the copy for retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'goto:nextread', 'retractdown:', erase,retract,retract_left,toggle_C_or_D,retract,retract,retract,retract_right, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract, extend_left, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend, extend_right,extend,extend,extend,extend,extend,extend,extend,extend, # (make a mark at the bottom-left for final retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'goto:rowstart', # -- end of construction: retract and inject sheath+trigger -- 'inject:', retract,extend_right,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend, retract,inject_trigger, retract,retract,retract, stop ] # -------------------------------- # now write the tapes: # -------------------------------- # Our data tape contains coded construction instructions: # 11 : write a 1 # 10 : write a 0 # 01 : write n 0's (where n is the value below) # 001 : end of row # 000 : end of construction # # Each row is scanned from the left edge to the last 1. (A temporary marker # is used at the beginning for retraction, so rows can be any length.) Because # each row ends with a 1, we know that the sequence 000 cannot appear on the # data tape until the very end. This allows us to detect (reading backwards) # the 000 sequence, in order to know when to stop copying. # # For retracting vertically after construction another temporary marker is used. # # Following Ron Hightower's work (thanks Ron!) we copy the data tape first and # then read it from the far end. The data read head is made slightly prominent # to allow the 000 to be skipped (else it would be detected during tape-copy and # would cause it to end), but read correctly from the blank space at the end of # the data tape nearest the machine. # # The instruction set above was just one that I tried. I'm quite sure it is # possible to do this more efficiently. n=3 # found through experiment to give the shortest data tape # must match the "write N 0's" section of the program above # (I would have expected 10 or so to be better but anyway.) # first we write the program and marker tapes # then we encode the whole pattern onto the data tape # (program length is mostly unrelated to machine size, so it all works) write_program(program) # write the data tape data_tape = '' rect = g.getrect() # copy everything within the bounding rectangle width = rect[2] height = rect[3] x = rect[0] y = rect[1] for row in inclusive_range(y+height-1,y): far_right = x+width-1 while g.getcell(far_right,row)==0: far_right -= 1 if far_right 0: g.putcells(selcells, newx - x, newy - y) g.fitsel() golly-3.3-src/Scripts/Python/make-Banks-IV-constructor.py0000644000175000017500000001120113151213347020340 00000000000000# Make a pattern from states 3 and 0, select it and then # run this script to make a Banks-IV CA pattern that will then # construct the pattern. # # The machine will attempt to activate the pattern by injecting # a signal at a special trigger point. # See: Patterns/Self-Rep/Banks/Banks-IV-constructor.rle.gz # # You may need to change trigger_row for your pattern, or disable # triggering. # # Tim Hutton from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 top_tape = '00' bottom_tape = '00' # write a state 3 to the required position, relative to the centre of the face def write_cell(x,y): global top_tape global bottom_tape # delay one of the tapes, to select the correct row if y<0: top_tape += '00'*abs(y) elif y>0: bottom_tape += '00'*y # send out a write arm to the right length arm_length=2 while arm_length < x: top_tape += '120' + '00'*arm_length + '12000' bottom_tape += '120' + '00'*arm_length + '12000' arm_length += 1 # send an erasing wing down the arm, to write a cell at the end top_tape += '120' + '00'*(arm_length-3) + '120000' bottom_tape += '120' + '00'*(arm_length-3) + '120000' # undo the delay on the tapes (could just add the difference but this is simpler) if y<0: bottom_tape += '00'*abs(y) elif y>0: top_tape += '00'*y # we first write the commands to 2 strings, and then to the grid H_OFFSET = 10 # how far from the construction face should the new pattern be? half_height = (r.height-(r.height%2))/2 # write the cells that are in state 1 (can ignore the zeros) # (still plenty of room for optimisation here) for col in xrange(r.left + r.width-1, r.left-1,-1): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for row in xrange(r.top, r.top + r.height): if g.getcell(col,row)==3: write_cell(H_OFFSET + col-r.left,row - r.top - half_height) # trigger trigger_row = 3 # from the vertical middle write_cell(H_OFFSET + 2,trigger_row) # (optional) restore the trigger input write_cell(H_OFFSET-3, trigger_row-1) write_cell(H_OFFSET-2, trigger_row+2) write_cell(H_OFFSET-2, trigger_row+1) # actually just sends an erasing wing write_cell(H_OFFSET, trigger_row-2) write_cell(H_OFFSET, trigger_row+2) fx = r.left-20 # constructing face fy = r.top+r.height*2 # centre of constructing face half_height += 10 # draw the constructing face for cy in range(fy-(half_height-6),fy+(half_height-6)+1): g.setcell(fx,cy,3) # draw the top shoulder g.setcell(fx,fy-half_height,3) g.setcell(fx,fy-half_height-3,3) g.setcell(fx-1,fy-half_height-3,3) g.setcell(fx+1,fy-half_height-3,3) g.setcell(fx-1,fy-half_height-2,3) g.setcell(fx+1,fy-half_height-2,3) g.setcell(fx+1,fy-half_height-1,3) g.setcell(fx+1,fy-half_height+1,3) g.setcell(fx+1,fy-half_height+2,3) g.setcell(fx+1,fy-half_height+3,3) g.setcell(fx+1,fy-half_height+4,3) g.setcell(fx+1,fy-half_height+5,3) g.setcell(fx-1,fy-half_height+2,3) g.setcell(fx-1,fy-half_height+3,3) g.setcell(fx-1,fy-half_height+4,3) g.setcell(fx-1,fy-half_height+5,3) g.setcell(fx+2,fy-half_height-1,3) g.setcell(fx+3,fy-half_height-1,3) g.setcell(fx+3,fy-half_height,3) g.setcell(fx+2,fy-half_height+1,3) g.setcell(fx+3,fy-half_height+1,3) g.setcell(fx+2,fy-half_height+4,3) g.setcell(fx-2,fy-half_height+5,3) # draw the bottom shoulder g.setcell(fx,fy+half_height,3) g.setcell(fx,fy+half_height+3,3) g.setcell(fx-1,fy+half_height+3,3) g.setcell(fx+1,fy+half_height+3,3) g.setcell(fx-1,fy+half_height+2,3) g.setcell(fx+1,fy+half_height+2,3) g.setcell(fx+1,fy+half_height+1,3) g.setcell(fx+1,fy+half_height-1,3) g.setcell(fx+1,fy+half_height-2,3) g.setcell(fx+1,fy+half_height-3,3) g.setcell(fx+1,fy+half_height-4,3) g.setcell(fx+1,fy+half_height-5,3) g.setcell(fx-1,fy+half_height-2,3) g.setcell(fx-1,fy+half_height-3,3) g.setcell(fx-1,fy+half_height-4,3) g.setcell(fx-1,fy+half_height-5,3) g.setcell(fx+2,fy+half_height-1,3) g.setcell(fx+3,fy+half_height-1,3) g.setcell(fx+3,fy+half_height,3) g.setcell(fx+2,fy+half_height+1,3) g.setcell(fx+3,fy+half_height+1,3) g.setcell(fx+2,fy+half_height-4,3) g.setcell(fx-2,fy+half_height-5,3) # draw the tapes x = fx-1 for c in range(0,len(top_tape)): g.setcell(x,fy-half_height-1,3) g.setcell(x,fy-half_height,int(top_tape[c])) g.setcell(x,fy-half_height+1,3) x -= 1 x = fx-1 for c in range(0,len(bottom_tape)): g.setcell(x,fy+half_height-1,3) g.setcell(x,fy+half_height,int(bottom_tape[c])) g.setcell(x,fy+half_height+1,3) x -= 1 golly-3.3-src/Scripts/Lua/0000755000175000017500000000000013543257426012456 500000000000000golly-3.3-src/Scripts/Lua/p1100-MWSS-gun.lua0000644000175000017500000001122012706123635015206 00000000000000-- Bill Gosper's pure-period p1100 double MWSS gun, circa 1984. local g = golly() local gp = require "gplus" local pattern = gp.pattern local flip = gp.flip local flip_x = gp.flip_x local flip_y = gp.flip_y local rccw = gp.rccw local rcw = gp.rcw local swap_xy_flip = gp.swap_xy_flip g.new("P1100 gun") g.setalgo("HashLife") g.setrule("B3/S23") -- update status bar now so we don't see different colors when g.show is called g.update() local glider = pattern("bo$bbo$3o!") local block = pattern("oo$oo!") local eater = pattern("oo$bo$bobo$bboo!") local bhept = pattern("bbo$boo$oo$boo!") local twobits = eater + bhept.t(8,3) local half = twobits + twobits[1].t(51,0,flip_x) local centinal = half + half.t(0,16,flip_y) local passthrough = centinal[1].t(16,3,rcw) + centinal[19].t(52,0,rcw) + centinal[81].t(55,51,rccw) + centinal[99].t(91,54,rccw) -- build the source signal -- the most compact set of gliders -- from which all other gliders and spaceships can be generated local MWSSrecipes = glider.t(5759,738,rccw) + glider.t(6325,667,flip_x) + glider[3].t(5824,896,flip_x) + glider[2].t(5912,1264) + glider[2].t(6135,1261,flip_x) + glider[1].t(5912,1490,flip_y) + glider.t(6229,4717,flip_x) + glider[1].t(6229,5029,flip) + glider[1].t(5920,5032,flip_y) + glider.t(6230,5188,flip) + glider[3].t(6230,5306,flip) + glider[3].t(5959,5309,flip_y) -- suppress output MWSSes as long as gliders are being added MWSSrecipes = MWSSrecipes + pattern("o!",6095,-65) + pattern("o!",6075,228) -- add the first four centinals to guide the recipe gliders local all = centinal[44].t(6185,5096,flip_x) + centinal[73].t(5897,1066) all = all + centinal[42].t(5782,690) + centinal[25].t(5793,897,rcw) -- generate the MWSSes for the glider-fanout ladder for i = 1, 7 do g.show("Building rung " .. i .. " of ladder...") all = (all + MWSSrecipes)[1100] end -- add the actual glider-fanout ladder -- six rungs for i = 0, 5 do all = all + glider.t(6030,1706+550*i,swap_xy_flip) + centinal[15].t(6102,1585+550*i) + block.t(6029,1721+550*i) + centinal[34].t(5996,1725+550*i,rccw) + block.t(6087,1747+550*i) + centinal[87].t(6122,1745+550*i,rcw) end -- add the rest of the centinals to guide the ladder's output gliders g.show("Adding centinal reflectors...") all = all + centinal[88].t(5704,0) + centinal[29].t(6423,295,flip_x) + centinal[74].t(5616,298) + centinal[40].t(6361,613,rcw) + centinal[23].t(6502,620,flip_x) + centinal[36].t(5636,986) + centinal[38].t(6370,1008,rcw) + centinal[19].t(5747,1347,rcw) + centinal[67].t(5851,1516) + centinal.t(4061,2605,rccw) + centinal[10].t(5376,3908,rccw) + centinal[77].t(8191,4407,flip_x) + centinal[6].t(4988,4606) + centinal[34].t(6357,4608,flip_x) + centinal[27].t(8129,4621,flip_x) + centinal[92].t(5159,5051) + centinal[53].t(7991,5201,flip_x) + centinal[94].t(7038,5370,rccw) + centinal[13].t(5591,5379,rccw) + centinal[3].t(5858,5428,rccw) + centinal[87].t(7805,5511,flip_x) + centinal[98].t(401,5557,rccw) + centinal[14].t(955,5561,rccw) + centinal[8].t(6592,5584,rccw) + centinal[39].t(6933,5698,flip_x) + centinal[32].t(6230,5881) + centinal[47].t(11676,5854,rccw) + centinal[68].t(0,5748,rccw) + centinal[89].t(6871,5912,flip_x) + centinal[45].t(12095,6027,rccw) + centinal[86].t(6209,6134) + centinal[55].t(6868,6357,flip_x) + centinal[95].t(9939,6491,rccw) + centinal[23].t(8782,6548,rccw) + centinal[58].t(3066,6572,rccw) + centinal[21].t(9326,6596,rccw) + centinal[80].t(3628,6626,rccw) + centinal[45].t(6821,6528,flip_x) + centinal[33].t(10373,6649,rccw) + centinal[16].t(2587,6685,rccw) -- to change behavior at center, comment out one of the lines below all = all + eater.t(6018,5924,rccw) + eater.t(6037,5943,rccw) -- true p1100 gun -- all = all + block.t(6018,6787) -- synch center to recreate original p1100x5 local center = block.t(1081,6791) + block.t(2731,6791) + block.t(3831,6791) + block.t(9108,6791) + block.t(10208,6791) + block.t(11308,6791) + passthrough.t(8475,6737) + passthrough[39].t(3365,6737,flip_x) + passthrough.t(9575,6737) + passthrough[39].t(2265,6737,flip_x) + passthrough.t(10675,6737) + passthrough[39].t(1715,6737,flip_x) -- add asymmetric Equator to mirror-symmetric North and South MWSSrecipes = MWSSrecipes + MWSSrecipes.t(0,13583,flip_y) all = all + all.t(0,13583,flip_y) + center all.put() g.fit() -- Different glider paths are different lengths, so incomplete -- glider recipes must be overwritten for a while to prevent disaster. for i = 0, 45 do g.show("Filling glider tracks -- " .. (49500 - i*1100) .. " ticks left.") g.update() MWSSrecipes.put() g.run(1100) end g.show("") -- reset gen count to 0 g.setgen("0") golly-3.3-src/Scripts/Lua/giffer.lua0000644000175000017500000001543413043333474014343 00000000000000-- Run the current selection for a given number of steps and -- create an animated GIF file using the current layer's colors. -- Based on giffer.pl by Tony Smith. -- Conversion to Lua by Andrew Trevorrow and Scorbie. local g = golly() local gp = require "gplus" local getcell = g.getcell local int = gp.int local chr = string.char local r = g.getselrect() if #r == 0 then g.exit("There is no selection.") end local x, y, width, height = table.unpack(r) if width >= 65536 or height >= 65536 then g.exit("The width and height of the selection must be less than 65536.") end -- get the parameters given last time local inifilename = g.getdir("data").."giffer.ini" local oldparams = "100 1" local f = io.open(inifilename, "r") if f then oldparams = f:read("*l") or "" f:close() end local prompt = [[ Enter the number of frames, and the pause time between each frame (in centisecs): ]] local answer = g.getstring(prompt, oldparams, "Create animated GIF") local frames, pause = gp.split(answer) -- validate given parameters frames = frames or 100 pause = pause or 1 if not gp.validint(frames) then g.exit("Bad frames value: "..frames) end if not gp.validint(pause) then g.exit("Bad pause value: "..pause) end frames = tonumber(frames) pause = tonumber(pause) -- given parameters are valid so save them for next run f = io.open(inifilename, "w") if f then f:write(answer) f:close() end local depth = g.numstates() local bitdepth = 0 while depth > 2^(bitdepth+1) do bitdepth = bitdepth + 1 end local codesize = 2 if bitdepth > 0 then codesize = bitdepth + 1 end -------------------------------------------------------------------------------- local function getframedata() local data = {} for row = y, y+height-1 do for col = x, x+width-1 do data[#data+1] = chr( getcell(col, row) ) end end return data end -------------------------------------------------------------------------------- local function compress(data) local t = {} for i = 0, depth-1 do t[chr(i)] = i end local curr = 2^codesize local cc = 2^codesize local used = cc + 1 local bits = codesize + 1 local size = codesize + 1 local mask = 2^size - 1 local output = "" local code = "" for _, nextch in ipairs(data) do if t[code .. nextch] then code = code .. nextch else used = used + 1 t[code .. nextch] = used curr = curr + (t[code] << bits) bits = bits + size while bits >= 8 do output = output .. chr(curr & 255) curr = curr >> 8 bits = bits - 8 end if used > mask then if size < 12 then size = size + 1 mask = mask*2 + 1 else curr = curr + (cc << bits) bits = bits + size while bits >= 8 do output = output .. chr(curr & 255) curr = curr >> 8 bits = bits - 8 end -- reset t t = {} for j = 0, depth-1 do t[chr(j)] = j end used = cc + 1 size = codesize + 1 mask = 2^size - 1 end end code = nextch end end curr = curr + (t[code] << bits) bits = bits + size while bits >= 8 do output = output .. chr(curr & 255) curr = curr >> 8 bits = bits - 8 end output = output .. chr(curr) local subbed = "" while #output > 255 do subbed = subbed .. chr(255) .. output:sub(1,255) output = output:sub(256) end return subbed .. chr(#output) .. output .. chr(0) end -------------------------------------------------------------------------------- -- This function packs a list of +ve integers into a binary string using -- little-endian ordering. The format parameter is a string composed of -- ASCII digits which specify the size in bytes of the corresponding value. -- Based on code at http://lua-users.org/wiki/ReadWriteFormat. local function mypack(format, ...) local result = "" local values = {...} for i = 1, #format do local size = tonumber(format:sub(i,i)) local value = values[i] local str = "" for j = 1, size do str = str .. chr(value % 256) value = math.floor(value / 256) end result = result .. str end return result end -------------------------------------------------------------------------------- -- For information on GIF format: -- http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp local function savegiffile(gifpath) local header = "GIF89a" local screendesc = mypack("22111", width, height, 0xF0 + bitdepth, 0, 0) local colortable = "" for state = 0, depth-1 do local s, r, g, b = table.unpack(g.getcolors(state)) colortable = colortable .. mypack("111", r, g, b) end local fullength = 6 * 2^bitdepth while #colortable < fullength do colortable = colortable .. mypack("111", 0, 0, 0) end -- this application extension allows looping local applicext = "\x21\xFF\x0BNETSCAPE2.0" .. mypack("1121", 3, 1, 0, 0) local controlext = "\x21\xF9" .. mypack("11211", 4, 0, pause, 0, 0) local imagedesc = "," .. mypack("222211", 0, 0, width, height, 0, codesize) local gif = io.open(gifpath,"wb") if not gif then g.exit("Unable to create GIF file: "..gifpath) end gif:write(header) gif:write(screendesc) gif:write(colortable) gif:write(applicext) for f = 1, frames do -- write the data for this frame gif:write(controlext) gif:write(imagedesc) gif:write(compress(getframedata())) g.show("Frame: "..f.."/".. frames) g.step() g.update() end gif:write("\x3B") gif:close() g.show("GIF animation saved in "..gifpath) end -------------------------------------------------------------------------------- -- set initial directory for the save dialog local initdir = g.getdir("app") local savedirfile = g.getdir("data").."gifdir.ini" local f = io.open(savedirfile, "r") if f then initdir = f:read("*l") or "" f:close() end -- remove any existing extension from layer name and append .gif local initfile = gp.split(g.getname(),"%.")..".gif" -- prompt for file name and location local gifpath = g.savedialog("Save as GIF file", "GIF (*.gif)|*.gif", initdir, initfile) if #gifpath == 0 then g.exit() end -- save directory for next time f = io.open(savedirfile, "w") if f then local pathsep = g.getdir("app"):sub(-1) f:write(gifpath:gsub("[^"..pathsep.."]+$","")) f:close() end savegiffile(gifpath) golly-3.3-src/Scripts/Lua/pd-glider.lua0000755000175000017500000000120312706123635014741 00000000000000-- Creates a large set of pentadecathlon + glider collisions. -- Based on pd_glider.py from PLife (http://plife.sourceforge.net/). local g = golly() local gp = require "gplus" local gpo = require "gplus.objects" g.new("pd-glider") -- best to create empty universe before setting rule -- to avoid converting an existing pattern (slow if large) g.setrule("B3/S23") local function collision(i, j) return gpo.pentadecathlon + gpo.glider[i + 11].t(-8 + j, -10, gp.flip) end local all = gp.pattern() for i = -7, 7 do for j = -9, 9 do all = all + collision(i, j).t(100 * i, 100 * j) end end all.display("") -- don't change name golly-3.3-src/Scripts/Lua/browse-patterns.lua0000755000175000017500000006765713317135606016262 00000000000000-- Browse through patterns in a folder (and optionally subfolders) -- -- Keyboard shortcuts: -- Page Down - next pattern -- Page Up - previous pattern -- Home - select a new folder to browse -- O - toggle options display -- Control-I - toggle pattern information display -- Control-T - toggle autofit -- Esc - exit at current pattern -- -- Author: -- Chris Rowett (crowett@gmail.com) local build = 26 -- build number local g = golly() local gp = require "gplus" local floor = math.floor local op = require "oplus" -- require "gplus.strict" -- overlay local ov = g.overlay local ovt = g.ovtable local viewwd, viewht = g.getview(g.getlayer()) local overlaycreated = false local pathsep = g.getdir("app"):sub(-1) local controls = "[Page Up] previous, [Page Down] next, [Home] select folder, [O] options, [Esc] exit." -- pattern list local patterns = {} -- Array of patterns local numpatterns = 0 -- Number of patterns local numsubs = 0 -- Number of subdirectories local whichpattern = 1 -- Current pattern index -- settings are saved in this file local settingsfile = g.getdir("data").."browse-patterns.ini" -- gui buttons local prevbutton -- Previous button local nextbutton -- Next button local folderbutton -- Folder button local exitbutton -- Exit button local helpbutton -- Help button local startcheck -- AutoStart checkbox local fitcheck -- AutoFit checkbox local speedslider -- AutoAdvance speed slider local optionsbutton -- Options button local subdircheck -- Include subdirectories checkbox local keepspeedcheck -- Keep speed checkbox local loopcheck -- Loop checkbox local infocheck -- Show Info checkbox -- position local guiht = 32 -- height of toolbar local guiwd = 0 -- computed width of toolbar (from control widths) local optht = 0 -- height of options panel local gapx = 10 -- horitzonal gap between controls local gapy = 4 -- vertical gap between controls local maxsliderval = 22 -- maxmimum slider value local sliderpower = 1.32 -- slider power local textrect = "textrect" -- clip name for clipping info text -- style local toolbarbgcolor = "0 0 0 192" -- flags local loadnew = false -- whether to load a new pattern local exitnow = false -- whether to exit local showoptions = false -- whether options are displayed local refreshgui = true -- whether the gui needs to be refreshed -- settings local autostart = 0 -- whether to autostart playback on pattern load local autofit = 0 -- whether to switch on autofit on pattern load local keepspeed = 0 -- whether to maintain speed between patterns local subdirs = 1 -- whether to include subdirectories local looping = 1 -- whether to loop pattern list local advancespeed = 0 -- advance speed (0 for manual) local showinfo = 0 -- show info if present local currentstep = g.getstep() -- current step local patternloadtime = 0 -- pattern load time (ms) -- pattern information local infonum = 0 -- number of info clips local infowd = {} -- width of pattern info clips local infoht = {} -- height of pattern info clips local infox = 0 -- info text x coordinate local infoclip = "info" -- info clip prefix name local infotime = 0 -- time last information frame drawn local infochunk = 256 -- number of characters per info clip local infowdtotal = 0 -- total width of info clips local infospeed = 9 -- scrolling speed (ms to move one pixel) -- file extensions to load local matchlist = { rle = true, mcl = true, mc = true, lif = true, gz = true } -- remaining time before auto advance local remaintime = 0 -- temporary file path local temppath = g.getdir("temp") -------------------------------------------------------------------------------- local function setfont() op.textfont = "font 10 default-bold" if g.os() == "Mac" then op.yoffset = -1 end if g.os() == "Linux" then op.textfont = "font 10 default" end ov(op.textfont) end -------------------------------------------------------------------------------- local function savesettings() local f = io.open(settingsfile, "w") if f then f:write(tostring(autostart).."\n") f:write(tostring(autofit).."\n") f:write(tostring(keepspeed).."\n") f:write(tostring(subdirs).."\n") f:write(tostring(looping).."\n") f:write(tostring(advancespeed).."\n") f:write(tostring(showinfo).."\n") f:close() end end -------------------------------------------------------------------------------- local function loadsettings() local f = io.open(settingsfile, "r") if f then autostart = tonumber(f:read("*l")) or 0 autofit = tonumber(f:read("*l")) or 0 keepspeed = tonumber(f:read("*l")) or 0 subdirs = tonumber(f:read("*l")) or 1 looping = tonumber(f:read("*l")) or 1 advancespeed = tonumber(f:read("*l")) or 0 showinfo = tonumber(f:read("*l")) or 0 f:close() end end -------------------------------------------------------------------------------- local function findpatterns(dir) g.show("Searching for patterns in "..dir) g.update() local files = g.getfiles(dir) for _, name in ipairs(files) do if name:sub(1,1) == "." then -- ignore hidden files (like .DS_Store on Mac) elseif name:sub(-1) == pathsep then -- name is a subdirectory numsubs = numsubs + 1 if subdirs == 1 then findpatterns(dir..name) end else -- check the file is the right type to display local index = name:match'^.*()%.' if index then if matchlist[name:sub(index+1):lower()] then -- add to list of patterns numpatterns = numpatterns + 1 patterns[numpatterns] = dir..name end end end end end -------------------------------------------------------------------------------- local function getpatternlist(dir) local result = true -- save current list local currentpatterns = numpatterns -- search for patterns in the specified folder numpatterns = 0 numsubs = 0 findpatterns(dir) if numpatterns == 0 then if numsubs == 0 or subdirs == 1 then g.note("No patterns found in:\n\n"..dir) else g.note("Only subdirectories found in:\n\n"..dir.."\n\nInclude subdirectories option not selected.") end -- restore current list numpatterns = currentpatterns result = false end return result end -------------------------------------------------------------------------------- local function getremainingtime() local time = sliderpower ^ (maxsliderval - advancespeed) local remain = remaintime / 1000 return time, remain end -------------------------------------------------------------------------------- local function updatenextbutton() if advancespeed > 0 then local time, remain = getremainingtime() local clipname = "nextcopy" local x = nextbutton.x local y = nextbutton.y local ht = nextbutton.ht local wd = floor(nextbutton.wd * ((time - remain) / time)) if wd > 0 then if wd > nextbutton.wd then wd = nextbutton.wd end -- shade a proportion of the next button in green ov("copy "..x.." "..y.." "..wd.." "..ht.." "..clipname) ov("target "..clipname) ov("rgba 40 192 0 255") ov("replace 40 128 255 255") ov("target") ov("blend 0") ovt{"paste", x, y, clipname} end end end -------------------------------------------------------------------------------- local function drawspeed(x, y) -- convert speed into labael local message = "Manual" if advancespeed > 0 then -- convert the slider position into minutes and seconds local time, remain = getremainingtime() if time < 60 then if time < 10 then message = string.format("%.1f", time).."s" else message = floor(time).."s" end else message = floor(time / 60).."m"..floor(time % 60).."s" end -- convert remaining ms into minutes and seconds message = message.." (next in " if remain >= 60 then message = message..floor(remain / 60).."m"..floor(remain % 60).."s" else if remain < 10 then remain = floor(remaintime / 100) / 10 if remain < 0 then remain = 0 end message = message..string.format("%.1f", remain).."s" else if remain < 0 then remain = 0 end message = message..floor(remain).."s" end end message = message..")" end -- update the label if showoptions then op.maketext(message, "label", op.white, 2, 2, op.black) ov("blend 1") op.pastetext(x, y, op.identity, "label") ov("blend 0") end end -------------------------------------------------------------------------------- local function drawinfo() -- move the first option page control down since it won't have moved if show info -- in on and the first viewed pattern didn't have any pattern comments startcheck.y = guiht + guiht + gapy -- compute how far to move the text based on time since last update local now = g.millisecs() local dx = now - infotime infotime = now infox = infox - dx / infospeed if infox < -infowdtotal then infox = guiwd end -- draw the info text ov("target "..textrect) ov("blend 0") ov("rgba "..toolbarbgcolor) ovt{"fill"} ov("blend 1") local x = floor(infox) local y = infoht[1] for i = 1, infonum do op.pastetext(x, floor((guiht - y) / 2), op.identity, infoclip..i) x = x + infowd[i] - 2 -- make subsequent clips overlap slightly to remove text gap end ov("target") ov("blend 0") ovt{"paste", 0, guiht, textrect} end -------------------------------------------------------------------------------- local function drawgui() -- check whether to draw info if showinfo == 1 and infowdtotal ~= 0 then drawinfo() end -- check if the gui needs to be refreshed if refreshgui or (showoptions and advancespeed > 0) then -- mark gui as refreshed refreshgui = false -- draw toolbar background ov("blend 0") ov("rgba "..toolbarbgcolor) ovt{"fill", 0, 0, guiwd, guiht} -- draw main buttons local y = floor((guiht - prevbutton.ht) / 2) local x = gapx prevbutton.show(x, y) x = x + prevbutton.wd + gapx nextbutton.show(x, y) x = x + nextbutton.wd + gapx folderbutton.show(x, y) x = x + folderbutton.wd + gapx optionsbutton.show(x, y) x = x + optionsbutton.wd + gapx helpbutton.show(x, y) x = x + helpbutton.wd + gapx exitbutton.show(x, y) -- compute offset for options if info is displayed local infoy = 0 if showinfo == 1 and infowdtotal ~= 0 then infoy = guiht end -- check for options if showoptions then -- draw options background ovt{"fill", 0, (guiht + infoy), guiwd, optht} ov("rgba 0 0 0 0") ovt{"fill", 0, (guiht + infoy + optht), guiwd, infoy} -- draw option controls x = gapx y = guiht + gapy + infoy if autostart == 1 then startcheck.show(x, y, true) else startcheck.show(x, y, false) end y = y + startcheck.ht + gapy if autofit == 1 then fitcheck.show(x, y, true) else fitcheck.show(x, y, false) end y = y + fitcheck.ht + gapy if showinfo == 1 then infocheck.show(x, y, true) else infocheck.show(x, y, false) end y = y + infocheck.ht + gapy if subdirs == 1 then subdircheck.show(x, y, true) else subdircheck.show(x, y, false) end y = y + subdircheck.ht + gapy speedslider.show(x, y, advancespeed) x = x + speedslider.wd + gapx drawspeed(x, y) y = y + speedslider.ht + gapy x = gapx if looping == 1 then loopcheck.show(x, y, true) else loopcheck.show(x, y, false) end y = y + loopcheck.ht + gapy if keepspeed == 1 then keepspeedcheck.show(x, y, true) else keepspeedcheck.show(x, y, false) end else -- not showing options so clear the area under the toolbar local oldrgba = ov("rgba 0 0 0 0") ovt{"fill", 0, (guiht + infoy), guiwd, optht} ov("rgba "..oldrgba) end end -- update the next button updatenextbutton() end -------------------------------------------------------------------------------- local function showhelp() local helptext = "Pattern Browser build "..build.."\n" helptext = helptext.. [[ Features: - Browse through patterns in a folder manually by clicking the "Next" or "Previous" buttons. - Select a new folder to browse by clicking the "Folder" button. - Starts in the current pattern's folder or prompts for a starting folder. Options: - Automatically advance to the next pattern after a given amount of time. - Start running each pattern as it loads. - Fit the pattern to the display while it runs. - Show scrolling pattern information. - Include patterns in subdirectories. - Loop back to the first pattern after the last pattern. - Maintain the step speed across patterns. Note that options are saved across sessions. Special keys and their actions: Page Down - next pattern Page Up - previous pattern Home - select new folder to browse O - toggle options display ? - display this help information Esc - exit pattern browser Ctrl-I - toggle scrolling pattern information Ctrl-T - toggle autofit during playback (click or hit any key to close help) ]] -- draw help text ov("font 11 mono-bold") ov(op.black) local w, h = gp.split(ov("text temp "..helptext)) w = tonumber(w) + 20 h = tonumber(h) + 20 local x = floor((viewwd - w) / 2) local y = floor((viewht - h) / 2) ov(op.gray) ovt{"fill", x, y, w, h} ov("rgba 255 253 217 255") -- pale yellow (matches Help window) ovt{"fill", (x+2), (y+2), (w-4), (h-4)} local oldblend = ov("blend 1") ovt{"paste", (x+10), (y+10), "temp"} ov("blend "..oldblend) ov("update") -- save current time local now = g.millisecs() -- wait for a key or click while true do local event = g.getevent() if event:find("^key") or event:find("^oclick") then break end end -- clear help ov("rgba 0 0 0 0") ov("blend 0") ovt{"fill", x, y, w, h} refreshgui = true -- reset font setfont() -- ensure scrolling info continues from where it paused infotime = g.millisecs() -- adjust pattern load time patternloadtime = patternloadtime + (g.millisecs() - now) end -------------------------------------------------------------------------------- local function previouspattern() local new = whichpattern - 1 if new < 1 then if looping == 1 then new = numpatterns else new = 1 end end if new ~= whichpattern then whichpattern = new loadnew = true end end -------------------------------------------------------------------------------- local function nextpattern() local new = whichpattern + 1 if new > numpatterns then if looping == 1 then new = 1 else new = numpatterns end end if new ~= whichpattern then whichpattern = new loadnew = true end end -------------------------------------------------------------------------------- local function exitbrowser() loadnew = true exitnow = true end -------------------------------------------------------------------------------- local function toggleautostart() autostart = 1 - autostart savesettings() end -------------------------------------------------------------------------------- local function toggleautofit() autofit = 1 - autofit savesettings() refreshgui = true end -------------------------------------------------------------------------------- local function selectfolder() -- remove the filename from the supplied path local current = patterns[whichpattern] local dirname = current:sub(1, current:find(pathsep.."[^"..pathsep.."/]*$")) -- ask for a folder dirname = g.opendialog("Choose a folder", "dir", dirname) if dirname ~= "" then if getpatternlist(dirname) then whichpattern = 1 loadnew = true else g.show("Pattern "..whichpattern.." of "..numpatterns..". "..controls) end end end -------------------------------------------------------------------------------- local function togglespeed() keepspeed = 1 - keepspeed savesettings() end -------------------------------------------------------------------------------- local function toggleloop() looping = 1 - looping savesettings() end -------------------------------------------------------------------------------- local function togglesubdirs() subdirs = 1 - subdirs savesettings() end -------------------------------------------------------------------------------- local function toggleoptions() showoptions = not showoptions if showoptions then optionsbutton.setlabel("Close", false) else optionsbutton.setlabel("Options", false) end refreshgui = true end -------------------------------------------------------------------------------- local function toggleinfo() showinfo = 1 - showinfo savesettings() refreshgui = true drawgui() -- need to refresh again since options panel will move if open refreshgui = true end -------------------------------------------------------------------------------- local function updatespeed(newval) advancespeed = newval savesettings() patternloadtime = g.millisecs() local targettime = (sliderpower ^ (maxsliderval - advancespeed)) * 1000 remaintime = targettime - (g.millisecs() - patternloadtime) refreshgui = true drawgui() end -------------------------------------------------------------------------------- local function createoverlay() -- create overlay for gui ov("create "..viewwd.." "..viewht) overlaycreated = true op.buttonht = 20 op.textgap = 8 -- set font setfont() -- create gui buttons op.textshadowx = 2 op.textshadowy = 2 prevbutton = op.button("Previous", previouspattern) nextbutton = op.button("Next", nextpattern) exitbutton = op.button("X", exitbrowser) helpbutton = op.button("?", showhelp) folderbutton = op.button("Folder", selectfolder) startcheck = op.checkbox("Start playback on pattern load", op.white, toggleautostart) fitcheck = op.checkbox("Fit pattern to display", op.white, toggleautofit) speedslider = op.slider("Advance: ", op.white, 81, 0, maxsliderval, updatespeed) optionsbutton = op.button("Options", toggleoptions) subdircheck = op.checkbox("Include subdirectories", op.white, togglesubdirs) keepspeedcheck = op.checkbox("Maintain step speed across patterns", op.white, togglespeed) loopcheck = op.checkbox("Loop pattern list", op.white, toggleloop) infocheck = op.checkbox("Show pattern information", op.white, toggleinfo) -- get the size of the gui controls optht = startcheck.ht + fitcheck.ht + infocheck.ht + subdircheck.ht + speedslider.ht optht = optht + loopcheck.ht + keepspeedcheck.ht + 8 * gapy guiwd = prevbutton.wd + nextbutton.wd + folderbutton.wd + optionsbutton.wd + helpbutton.wd + exitbutton.wd + 7 * gapx -- create the clip for clipping info text ov("create "..guiwd.." "..guiht.." "..textrect) -- draw the overlay drawgui() end -------------------------------------------------------------------------------- local function loadinfo() -- clear pattern info infowdtotal = 0 refreshgui = true -- load pattern info local info = g.getinfo() if info ~= "" then -- format into a single line local clean = info:gsub("#CXRLE.-\n", ""):gsub("#[CDNO ]? *", ""):gsub(" +", " "):gsub(" *\n", " ") if clean ~= "" then -- split into a number of clips due to bitmap width limits infonum = floor((clean:len() - 1) / infochunk) + 1 ov("blend 0") -- create the text clips for i = 1, infonum do local i1 = (i - 1) * infochunk + 1 local i2 = i1 + infochunk - 1 infowd[i], infoht[i] = op.maketext(clean:sub(i1, i2), infoclip..i, op.white, 2, 2, op.black) infowdtotal = infowdtotal + infowd[i] end infox = guiwd end end infotime = g.millisecs() end -------------------------------------------------------------------------------- local function checkforresize() local newwd, newht = g.getview(g.getlayer()) if newwd ~= viewwd or newht ~= viewht then -- hide controls so show draws correct background prevbutton.hide() nextbutton.hide() folderbutton.hide() exitbutton.hide() helpbutton.hide() startcheck.hide() fitcheck.hide() speedslider.hide() optionsbutton.hide() subdircheck.hide() keepspeedcheck.hide() loopcheck.hide() infocheck.hide() -- resize overlay if newwd < 1 then newwd = 1 end if newht < 1 then newht = 1 end viewwd = newwd viewht = newht ov("resize "..viewwd.." "..viewht) refreshgui = true end end -------------------------------------------------------------------------------- local function browsepatterns(startpattern) local generating local now = g.millisecs() local target = 15 local delay -- if start pattern is supplied then find it in the list whichpattern = 1 if startpattern ~= "" then local i = 1 while i <= numpatterns do if patterns[i] == startpattern then whichpattern = i break end i = i + 1 end end -- loop until escape pressed or exit clicked exitnow = false while not exitnow do -- load the pattern currentstep = g.getstep() g.new("") g.setalgo("QuickLife") -- nicer to start from this algo local fullname = patterns[whichpattern] g.open(fullname, false) -- don't add file to Open/Run Recent submenu loadinfo() g.show("Pattern "..whichpattern.." of "..numpatterns..". "..controls) g.update() generating = autostart -- reset pattern load time patternloadtime = g.millisecs() -- restore playback speed if requested if keepspeed == 1 then g.setstep(currentstep) end -- decode key presses loadnew = false while not loadnew do -- check for window reisze checkforresize() -- check for event local event = op.process(g.getevent()) -- process key events if event == "key pagedown none" then nextpattern() elseif event == "key pageup none" then previouspattern() elseif event == "key home none" then selectfolder() elseif event == "key return none" then generating = 1 - generating elseif event == "key o none" then toggleoptions() elseif event == "key i ctrl" then toggleinfo() elseif event == "key t ctrl" then toggleautofit() elseif event == "key space none" then if generating == 1 then generating = 0 else g.run(1) end elseif event == "key r ctrl" then generating = 0 g.reset() elseif event == "key tab none" then if generating == 1 then generating = 0 else g.step() end elseif event == "key ? none" then showhelp() else -- pass event to Golly for processing g.doevent(event) end -- run the pattern if generating == 1 then currentstep = g.getstep() if currentstep < 0 then -- convert negative steps into delays delay = sliderpower ^ -currentstep * 125 currentstep = 0 else delay = 15 end if delay ~= target then target = delay end local t = g.millisecs() if t - now > target then g.run(g.getbase() ^ currentstep) now = t target = delay end -- check for autofit when running if autofit == 1 then -- get pattern bounding box local rect = g.getrect() if #rect ~= 0 then -- check if entire bounding box is visible in the viewport if not g.visrect(rect) then g.fit() end end end end -- check for auto advance remaintime = 0 if advancespeed > 0 then local targettime = (sliderpower ^ (maxsliderval - advancespeed)) * 1000 remaintime = targettime - (g.millisecs() - patternloadtime) if remaintime < 0 then nextpattern() patternloadtime = g.millisecs() end end drawgui() g.update() end end end -------------------------------------------------------------------------------- local function browse() -- try to get the current open pattern folder local pathname = g.getpath() local dirname -- check for no saved pattern or a pattern from the clipboard if pathname == "" or pathname:sub(1, pathname:find(pathsep.."[^"..pathsep.."/]*$")) == temppath then -- ask for a folder dirname = g.opendialog("Choose a folder", "dir", g.getdir("app")) else -- remove the file name dirname = pathname:sub(1, pathname:find(pathsep.."[^"..pathsep.."/]*$")) end if dirname ~= "" then loadsettings() if getpatternlist(dirname) then -- display gui createoverlay() -- browse patterns browsepatterns(pathname) end end end -------------------------------------------------------------------------------- local status, err = xpcall(browse, gp.trace) if err then g.continue(err) end -- this code is always executed, even after escape/error; -- clear message line in case there was no escape/error g.check(false) g.show("") if overlaycreated then ov("delete") end golly-3.3-src/Scripts/Lua/move-selection.lua0000644000175000017500000001730313107435536016032 00000000000000-- Allow user to move the current selection. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2011. local g = golly() local gp = require "gplus" local split = gp.split -- set edges of bounded grid for later use local gridl, gridr, gridt, gridb if g.getwidth() > 0 then gridl = -gp.int(g.getwidth() / 2) gridr = gridl + g.getwidth() - 1 end if g.getheight() > 0 then gridt = -gp.int(g.getheight() / 2) gridb = gridt + g.getheight() - 1 end local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end local selpatt = g.getcells(selrect) local oldcells = {} -------------------------------------------------------------------------------- local function showhelp() g.note([[ Alt-clicking in the selection allows you to COPY it to another location (the original selection is not deleted). While moving the selection the following keys can be used: x - flip selection left-right y - flip selection top-bottom > - rotate selection clockwise < - rotate selection anticlockwise escape - abort and restore the selection]]) end -------------------------------------------------------------------------------- local function cellinrect(x, y, r) -- return true if given cell position is inside given rectangle if x < r[1] or x >= r[1] + r[3] then return false end if y < r[2] or y >= r[2] + r[4] then return false end return true end -------------------------------------------------------------------------------- local function rectingrid(r) -- return true if all of given rectangle is inside grid if g.getwidth() > 0 and (r[1] < gridl or r[1] + r[3] - 1 > gridr) then return false end if g.getheight() > 0 and (r[2] < gridt or r[2] + r[4] - 1 > gridb) then return false end return true end -------------------------------------------------------------------------------- local function lookforkeys(event, deltax, deltay) -- look for keys used to flip/rotate selection if event == "key x none" or event == "key y none" then -- flip floating selection left-right or top-bottom if #oldcells > 0 then g.clear(0) g.putcells(selpatt, deltax, deltay) end if event == "key x none" then g.flip(0) else g.flip(1) end selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if #oldcells > 0 then g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) end g.update() return end if event == "key > none" or event == "key < none" then -- rotate floating selection clockwise or anticlockwise; -- because we use g.rotate below we have to use the exact same -- calculation (see Selection::Rotate in wxselect.cpp) for rotrect local midx = selrect[1] + gp.int((selrect[3]-1) / 2) local midy = selrect[2] + gp.int((selrect[4]-1) / 2) local newleft = midx + selrect[2] - midy local newtop = midy + selrect[1] - midx local rotrect = { newleft, newtop, selrect[4], selrect[3] } if not rectingrid(rotrect) then g.show("Rotation is not allowed if selection would be outside grid.") return end g.clear(0) if #oldcells > 0 then g.putcells(oldcells) end oldcells = g.join(oldcells, g.getcells(rotrect)) g.clear(0) g.select(rotrect) g.clear(0) g.select(selrect) g.putcells(selpatt, deltax, deltay) if event == "key > none" then g.rotate(0) else g.rotate(1) end selrect = g.getselrect() selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if #oldcells > 0 then g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) end g.update() return end if event == "key h none" then -- best not to show Help window while dragging selection! return end g.doevent(event) end -------------------------------------------------------------------------------- function moveselection() local x, y, firstx, firsty, xoffset, yoffset, oldmouse -- wait for click in selection while true do local event = g.getevent() if event:find("^click") then -- event is a string like "click 10 20 left none" local evt, xstr, ystr, butt, mods = split(event) x = tonumber(xstr) y = tonumber(ystr) if cellinrect(x, y, selrect) then oldmouse = xstr .. ' ' .. ystr firstx = x firsty = y xoffset = firstx - selrect[1] yoffset = firsty - selrect[2] if mods == "alt" then -- don't delete pattern in selection oldcells = g.getcells(selrect) end break end elseif event == "key h none" then showhelp() else g.doevent(event) end end -- wait for mouse-up while moving selection g.show("Move mouse and release button...") local mousedown = true local mousepos while mousedown do local event = g.getevent() if event:find("^mup") then mousedown = false elseif #event > 0 then lookforkeys(event, x - firstx, y - firsty) -- update xoffset,yoffset in case selection was rotated xoffset = x - selrect[1] yoffset = y - selrect[2] end mousepos = g.getxy() if #mousepos > 0 and mousepos ~= oldmouse then -- mouse has moved, so move selection rect and pattern g.clear(0) if #oldcells > 0 then g.putcells(oldcells) end local xstr, ystr = split(mousepos) x = tonumber(xstr) y = tonumber(ystr) selrect[1] = x - xoffset selrect[2] = y - yoffset if g.getwidth() > 0 then -- ensure selrect doesn't move beyond left/right edge of grid if selrect[1] < gridl then selrect[1] = gridl x = selrect[1] + xoffset elseif selrect[1] + selrect[3] - 1 > gridr then selrect[1] = gridr + 1 - selrect[3] x = selrect[1] + xoffset end end if g.getheight() > 0 then -- ensure selrect doesn't move beyond top/bottom edge of grid if selrect[2] < gridt then selrect[2] = gridt y = selrect[2] + yoffset elseif selrect[2] + selrect[4] - 1 > gridb then selrect[2] = gridb + 1 - selrect[4] y = selrect[2] + yoffset end end g.select(selrect) oldcells = g.getcells(selrect) g.putcells(selpatt, x - firstx, y - firsty) oldmouse = mousepos g.update() end end end -------------------------------------------------------------------------------- -- remember initial selection in case user aborts script local firstrect = g.getselrect() local firstpatt = g.getcells(selrect) g.show("Click anywhere in selection, move mouse and release button... (hit 'h' for help)") local oldcursor = g.getcursor() g.setcursor("Move") local aborted = true local status, err = xpcall(function () moveselection() aborted = false end, gp.trace) if err then g.continue(err) end g.setcursor(oldcursor) if aborted then g.clear(0) if #oldcells > 0 then g.putcells(oldcells) end g.putcells(firstpatt) g.select(firstrect) else g.show(" ") end golly-3.3-src/Scripts/Lua/toLife.lua0000644000175000017500000000301613151213347014310 00000000000000-- Fast LifeHistory to Life converter by Michael Simkin, -- intended to be mapped to a keyboard shortcut, e.g., Alt+J -- Sanity checks and Lua translation by Dave Greene, May 2017 -- Creates special rule and runs it for one generation, then switches to Life -- Replace 2k + 1-> 1 and 2k -> 0 -- Preserves step and generation count local g = golly() local rule = g.getrule() -- No effect if already in B3/S23 rule if g.getrule()=="B3/S23" or string.sub(g.getrule(),1,7)=="B3/S23:" then g.exit() end -- If not in LifeHistory, assume that it's a similar rule with even-numbered OFF states -- (Edit > Undo will be available to return to the original rule if needed) if string.sub(g.getrule(),1,11)~="LifeHistory" then g.setrule("LifeHistory") end ruletext = [[@RULE LifeHistoryToLife @TABLE n_states:7 neighborhood:oneDimensional symmetries:none var a={0,1,2,3,4,5,6} var b={a} var c={2,4,6} var d={3,5} c,a,b,0 d,a,b,1]] local function CreateRule() local fname = g.getdir("rules").."LifeHistoryToLife.rule" local f=io.open(fname,"r") if f~=nil then io.close(f) -- rule already exists else local f = io.open(fname, "w") if f then f:write(ruletext) f:close() else g.warn("Can't save LifeHistoryToLife rule in filename:\n"..filename) end end end CreateRule() g.setrule("LifeHistoryToLife") g.run(1) step = g.getstep() g.setrule("Life") g.setalgo("HashLife") g.setstep(step) g.setgen("-1")golly-3.3-src/Scripts/Lua/toChangeState.lua0000755000175000017500000001164413543255652015642 00000000000000-- toChangeState.lua -- adapted in August 2019 from change-state.py by Andrew Trevorrow, -- and toChangeColors.py by Dave Greene -- Switch all cells of a clicked-on color in the selected pattern to the current brush color local g = golly() local gp = require "gplus" local split = gp.split local oldsecs local newsecs local oldeditbar = g.setoption("showeditbar",1) local function savestate(filename, state) local f = io.open(filename, "w") if f then f:write(state) f:close() else g.warn("Can't save target state in filename:\n"..filename) end end local ChangeStateINIFileName = g.getdir("data").."changestate.ini" local targetstate = "0" local f = io.open(ChangeStateINIFileName, "r") if f then targetstate = f:read("*l") or "" f:close() end if targetstate==nil then targetstate = "0" savestate(ChangeStateINIFileName, targetstate) end limits = "selection" seltype = " selected" r = g.getselrect() if #r==0 then limits = "pattern's bounding box" seltype = "" r = g.getrect() if #r==0 then g.exit("No pattern to change.") end end -- set fill limits to the chosen rectangle minx, miny, sizex, sizey = table.unpack(r) maxx = minx + sizex - 1 maxy = miny + sizey - 1 area = g.getcells(r) if g.numstates() == 2 then g.exit("Rule must be multistate. Use 'Clear' editing tools and invert.lua for cell changes in two-state patterns.") end saveoldstate = g.setoption("drawingstate",targetstate) newstate = targetstate oldstate = newstate -- wait for user to click a cell g.show("Click a cell to change all" .. seltype .. " cells of that type to target state "..newstate.. ". Change drawing state on Edit toolbar to adjust target state. Esc to cancel.") while true do event = g.getevent() -- user may change drawing state at any time newstate = g.getoption("drawingstate") if newstate ~= oldstate then g.show("Click a cell to change all" .. seltype .. " cells of that type to target state "..newstate.. ". Change drawing state on Edit toolbar to adjust target state. Esc to cancel.") oldstate = newstate savestate(ChangeStateINIFileName, newstate) end if event:sub(1,5)==("click") then -- event is a string like "click 10 20 left none" evt, xstr, ystr, button, mods = split(event) x = tonumber(xstr) y = tonumber(ystr) if x < minx or x > maxx or y < miny or y > maxy then g.warn("Click inside the "..limits..". To change the region affected by the script, hit Esc to cancel, then adjust the selection.") else oldstate = g.getcell(x, y) if oldstate == newstate then g.warn("The clicked cell must have a different state\n" .."from the current drawing state, "..newstate..".") else break end end else g.doevent(event) end end -- tell Golly to handle all further keyboard/mouse events g.getevent(false) if oldstate == 0 then -- special handling for state-0 cells, which don't show up in cell lists -- so they must be tested individually by scanning the entire bounding box changed = 0 total = sizex * sizey oldsecs = os.clock() for row = miny, maxy do -- might be large pattern so show percentage done each second newsecs = os.clock() if newsecs - oldsecs >= 1.0 then oldsecs = newsecs g.show("Changing cell states: "..string.format("%.1f", 100 * (row - miny) * sizex / total).."%") g.update() end -- allow keyboard interaction g.doevent( g.getevent() ) for col = minx, maxx do if g.getcell(col, row) == oldstate then g.setcell(col, row, newstate) end changed = changed + 1 end end g.show("Changed "..changed.." state "..oldstate.." cells to state "..newstate..".") else -- faster handling for changing nonzero states to another state (including zero) oldsecs = os.clock() numcellsx3 = #area count = 0 for i=1, numcellsx3-2, 3 do -- might be large pattern so show percentage done each second newsecs = os.clock() if newsecs - oldsecs >= 1.0 then oldsecs = newsecs g.show("Changing cell states: "..string.format("%.1f",100 * i / numcellsx3).."%") g.update() end -- allow keyboard interaction g.doevent( g.getevent() ) if area[i+2]==oldstate then g.setcell(area[i],area[i+1],newstate) count = count + 1 end end g.show("Changed "..count.." state "..oldstate.." cells to state "..newstate..".") end -- return to previous Edit Bar setting g.setoption("showeditbar", oldeditbar) golly-3.3-src/Scripts/Lua/gun-demo.lua0000644000175000017500000000335513171233731014610 00000000000000-- Based on gun_demo.py from PLife (http://plife.sourceforge.net/). local g = golly() local gp = require "gplus" local gpo = require "gplus.objects" -- best to create empty universe before setting rule -- to avoid converting an existing pattern (slow if large) g.new("gun-demo") g.setrule("B3/S23") -- load gplus.guns AFTER setting rule to Life (for evolving phases) local gpg = require "gplus.guns" local gun24 = gpg.gun24 local gun30 = gpg.gun30 local gun46 = gpg.gun46 -------------------------------------------------------------------------------- local function mirror_gun(glider_gun) -- mirror an 'aligned' glider gun and preserve its timing return glider_gun[2].t(-1, 0, gp.swap_xy) end -------------------------------------------------------------------------------- local function compose_lwss_gun(glider_gun, A, B, C) -- construct an lwss gun using 3 copies of an 'aligned' glider gun -- where A, B and C are distances from the glider collision point to -- NE, NW and SW guns respectively local m = math.min(A, B, C) local a = A - m local b = B - m local c = C - m return glider_gun[4 * a].t( A, -A - 3, gp.flip_x) + glider_gun[4 * b].t(-B + 2, -B + 1) + glider_gun[4 * c + 1].t(-C + 6, C, gp.flip_y) end -------------------------------------------------------------------------------- local lwss_eater = gpo.eater.t(4, 2, gp.swap_xy) local all = compose_lwss_gun(mirror_gun(gun24), 12, 11, 12).t(0, -100) + lwss_eater.t(100, -100) + compose_lwss_gun(gun24, 11, 13, 4) + lwss_eater.t(100, 0) + compose_lwss_gun(gun30, 13, 11, 4).t(0, 70) + lwss_eater.t(100, 70) + compose_lwss_gun(gun46, 22, 13, 3).t(0, 130) + lwss_eater.t(100, 130) all.display("") -- don't change name golly-3.3-src/Scripts/Lua/breakout.lua0000755000175000017500000023101113441044674014712 00000000000000-- Breakout for Golly -- Author: Chris Rowett (crowett@gmail.com), November 2016 -- Use F12 to save a screenshot local build = 84 local g = golly() -- require "gplus.strict" local gp = require "gplus" local split = gp.split local op = require "oplus" local ov = g.overlay local ovt = g.ovtable local rand = math.random local maketext = op.maketext local pastetext = op.pastetext math.randomseed(os.time()) -- init seed for math.random -- text alignment local text = { alignleft = 0, aligncenter = 1, alignright = 2, aligntop = 3, alignbottom = 4, fontscale = 1 } -- overlay width and height local wd, ht = g.getview(g.getlayer()) local minwd = 400 local minht = 400 local edgegapl = 0 local edgegapr = 0 -- background settings local bgclip = "bg" -- shadow settings local shadow = { x = -wd // 100, y = ht // 100, alpha = 128, -- default alpha for shadows delta = 8, -- brick fade rate when hit txtx = -2, txty = 2, } shadow.color = {"rgba", 0, 0, 0, shadow.alpha} shadow.fadecolor = {"rgba", 0, 0, 0, shadow.alpha} -- colors as tables local colors = { white = {"rgba", 255, 255, 255, 255}, black = {"rgba", 0, 0, 0, 255}, red = {"rgba", 255, 0, 0, 255}, green = {"rgba", 0, 255, 0, 255}, blue = {"rgba", 0, 0, 255, 255}, cyan = {"rgba", 0, 255, 255, 255}, magenta = {"rgba", 255, 0, 255, 255}, yellow = {"rgba", 255, 255, 0, 255} } -- brick settings local brick = { numrows = 6, numcols = 20, rows = {}, wd, ht = ht // 40, maxoffsety = 20, offsety = 0, startoffset = 0, movedown = 0, movesteps = 24, cols = { [1] = colors.red, [2] = colors.yellow, [3] = colors.magenta, [4] = colors.green, [5] = colors.cyan, [6] = colors.blue }, bricksleft = 0, totalbricks = 0, x = 0, y = 0, fading = {}, fadecols = {} } brick.wd = wd // brick.numcols brick.bricksleft = brick.numrows * brick.numcols brick.totalbricks = brick.bricksleft -- bat settings local bat = { x = 0, y = 0, wd = wd // 10, ht = brick.ht, lastx = 0, fade = 128 } -- ball settings local ball = { size = wd // 80, x = 0, y = 0, numsteps = 80 } -- particle settings local particle = { particles = {}, brickparticles = brick.wd * brick.ht // 10, ballparticles = 1, ballpartchance = 0.25, wallparticles = 20, batparticles = 20, highparticles = 4, comboparticles = 4, bonusparticles = 4, lostparticles = 1024, bonusparticlesg = 6, bonusparticlesy = 3 } -- points settings local points = {} -- game settings local game = { level = 1, newball = true, pause = false, hiscore = 0, score = 0, combo = 1, combomult = 1, combofact = 1.04, comboraw = 0, comboextra = 0, gamecombo = 1, maxcombo = 2, balls = 3, newhigh = false, newcombo = false, newbonus = false, offoverlay = false, finished = false, again = true } -- timing settings local timing = { times = {}, timenum = 1, numtimes = 8, framemult = 1, framecap = 100, sixtyhz = 16.7 } -- game options local options = { brickscore = 1, showtiming = 0, showparticles = 1, autopause = 0, autostart = 0, showmouse = 1, showshadows = 1, confirmquit = 0, showoptions = false, confirming = false, comboscore = 1, soundvol = 1, musicvol = 1, fullscreen = 0 } -- settings are saved in this file local settingsfile = g.getdir("data").."breakout.ini" -- notifications local notification = { duration = 300, trans = 20, current = 0, message = "" } -- bonus level local bonus = { bricks = { 805203, 699732, 830290, 698705, 698705, 805158 }, level = false, interval = 3, time = 60, current = 0, green = 10, yellow = 20, best = 0 } -- key highlight color and names local keys = "keys" local buttons = "buttons" local keycolor = {"rgba", 32, 32, 32, 255} local mousecolor = {"rgba", 48, 0, 0, 255} local keynames = { [keys] = { "Esc", "Tab", "Enter" }, [buttons] = { "Click", "Right Click", "Mouse" } } local keycols = { [keys] = keycolor, [buttons] = mousecolor } -- static messages and clip names local optcol = {"rgba", 192, 192, 192, 255} local messages = { ["gameover"] = { text = "Game Over", size = 30, color = colors.red }, ["newball"] = { text = "Click or Enter to launch ball", size = 10, color = colors.white }, ["control"] = { text = "Mouse to move bat", size = 10, color = colors.white }, ["askquit"] = { text = "Quit Game?", size = 15, color = colors.yellow }, ["pause"] = { text = "Paused", size = 15, color = colors.yellow }, ["askleft"] = { text = "Click or Enter to Confirm", size = 10, color = colors.white }, ["askright"] = { text = "Right Click to Cancel", size = 10, color = colors.white }, ["resume"] = { text = "Click or Enter to continue", size = 10, color = colors.white }, ["focus"] = { text = "Move mouse onto game window to continue", size = 10, color = colors.white }, ["manfocus"] = { text = "Move mouse onto game window and", size = 10, color = colors.white }, ["quitgame"] = { text = "Right Click to quit game", size = 10, color = colors.white }, ["option"] = { text = "Tab for Game Settings", size = 10, color = colors.white }, ["restart"] = { text = "Click or Enter to start again", size = 10, color = colors.white }, ["quit"] = { text = "Right Click or Esc to exit", size = 10, color = colors.white }, ["continue"] = { text = "Click or Enter for next level", size = 10, color = colors.white }, ["newhigh"] = { text = "New High Score!", size = 10, color = colors.green }, ["newcombo"] = { text = "New Best Combo!", size = 10, color = colors.green }, ["newbonus"] = { text = "New Best Bonus!", size = 10, color = colors.green }, ["close"] = { text = "Click or Tab to close Game Settings", size = 10, color = colors.white }, ["autopause"] = { text = "Autopause", size = 10, color = optcol }, ["brickscore"] = { text = "Brick Score", size = 10, color = optcol }, ["comboscore"] = { text = "Combo Score", size = 10, color = optcol }, ["shadows"] = { text = "Shadows", size = 10, color = optcol }, ["mouse"] = { text = "Mouse Pointer", size = 10, color = optcol }, ["particles"] = { text = "Particles", size = 10, color = optcol }, ["confirm"] = { text = "Confirm Quit", size = 10, color = optcol }, ["autostart"] = { text = "Autostart", size = 10, color = optcol }, ["timing"] = { text = "Timing", size = 10, color = optcol }, ["fullscreen"] = { text = "Fullscreen", size = 10, color = optcol }, ["function"] = { text = "Function", size = 10, color = colors.white }, ["on"] = { text = "On", size = 10, color = colors.green }, ["off"] = { text = "Off", size = 10, color = colors.red }, ["state"] = { text = "State", size = 10, color = colors.white }, ["key"] = { text = "Key", size = 10, color = colors.white }, ["a"] = { text = "A", size = 10, color = optcol }, ["b"] = { text = "B", size = 10, color = optcol }, ["c"] = { text = "C", size = 10, color = optcol }, ["d"] = { text = "D", size = 10, color = optcol }, ["m"] = { text = "M", size = 10, color = optcol }, ["p"] = { text = "P", size = 10, color = optcol }, ["q"] = { text = "Q", size = 10, color = optcol }, ["s"] = { text = "S", size = 10, color = optcol }, ["t"] = { text = "T", size = 10, color = optcol }, ["f11"] = { text = "F11", size = 10, color = optcol }, ["-"] = { text = "-", size = 10, color = optcol }, ["="] = { text = "+", size = 10, color = optcol }, ["["] = { text = "[", size = 10, color = optcol }, ["]"] = { text = "]", size = 10, color = optcol }, ["sound"] = { text = "Sound Volume", size = 10, color = optcol }, ["music"] = { text = "Music Volume", size = 10, color = optcol }, ["fxvol"] = { text = "100%", size = 10, color = colors.green }, ["musicvol"] = { text = "100%", size = 10, color = colors.green }, ["level"] = { text = "Level ", size = 15, color = colors.white }, ["bonus"] = { text = "Bonus Level", size = 15, color = colors.white }, ["bcomplete"] = { text = "Bonus Level Complete", size = 15, color = colors.white }, ["remain"] = { text = "Bricks left", size = 10, color = colors.green }, ["time"] = { text = "Time", size = 15, color = colors.green }, ["left"] = { text = "3 balls left", size = 15, color = colors.yellow }, ["score"] = { text = "Score", size = 10, color = colors.white }, ["high"] = { text = "High Score", size = 10, color = colors.white }, ["balls"] = { text = "Balls", size = 10, color = colors.white }, ["combo"] = { text = "Combo", size = 10, color = colors.white }, ["notify"] = { text = "Notify", size = 7, color = colors.white }, ["ms"] = { text = "1 ms", size = 7, color = colors.white }, ["complete"] = { text = "Level Complete", size = 20, color = colors.green }, ["awarded"] = { text = "No Bonus", size = 15, color = colors.red } } -- music local music = { currenttrack = "", fade = 1, faderate = -0.01, gameovertime = 1000 * 64, folder = "oplus/sounds/breakout/" } -------------------------------------------------------------------------------- local function showcursor() if options.showmouse == 0 then ov("cursor hidden") else ov("cursor arrow") end end -------------------------------------------------------------------------------- local function setfullscreen() g.setoption("fullscreen", options.fullscreen) showcursor() end -------------------------------------------------------------------------------- local function readsettings() local f = io.open(settingsfile, "r") if f then game.hiscore = tonumber(f:read("*l")) or 0 options.fullscreen = tonumber(f:read("*l")) or 0 options.showtiming = tonumber(f:read("*l")) or 0 options.showparticles = tonumber(f:read("*l")) or 1 options.autopause = tonumber(f:read("*l")) or 0 options.autostart = tonumber(f:read("*l")) or 0 options.showmouse = tonumber(f:read("*l")) or 1 options.showshadows = tonumber(f:read("*l")) or 1 game.maxcombo = tonumber(f:read("*l")) or 2 options.brickscore = tonumber(f:read("*l")) or 1 options.confirmquit = tonumber(f:read("*l")) or 1 bonus.best = tonumber(f:read("*l")) or 0 options.comboscore = tonumber(f:read("*l")) or 1 options.soundvol = tonumber(f:read("*l")) or 100 options.musicvol = tonumber(f:read("*l")) or 70 f:close() if options.soundvol == 1 then options.soundvol = 100 end if options.musicvol == 1 then options.musicvol = 100 end end end -------------------------------------------------------------------------------- local function writesettings() local f = io.open(settingsfile, "w") if f then f:write(tostring(game.hiscore).."\n") f:write(tostring(options.fullscreen).."\n") f:write(tostring(options.showtiming).."\n") f:write(tostring(options.showparticles).."\n") f:write(tostring(options.autopause).."\n") f:write(tostring(options.autostart).."\n") f:write(tostring(options.showmouse).."\n") f:write(tostring(options.showshadows).."\n") f:write(tostring(game.maxcombo).."\n") f:write(tostring(options.brickscore).."\n") f:write(tostring(options.confirmquit).."\n") f:write(tostring(bonus.best).."\n") f:write(tostring(options.comboscore).."\n") f:write(tostring(options.soundvol).."\n") f:write(tostring(options.musicvol).."\n") f:close() end end -------------------------------------------------------------------------------- local function updatemessage(name, s, color) -- lookup the message local message = messages[name] if color ~= nil then message.color = color end -- get the font size for this message ov("font "..((message.size * text.fontscale) // 1 | 0)) -- create the text message clips message.text = s local textcol = message.color if type(textcol) == "table" then textcol = table.concat(textcol, " ") end local w, h = maketext(message.text, name, textcol, shadow.txtx, shadow.txty) -- save the clip width and height message.width = w message.height = h end -------------------------------------------------------------------------------- local function createstatictext() -- create each static text clip for clipname, message in pairs(messages) do updatemessage(clipname, message.text) end end -------------------------------------------------------------------------------- local function soundstate(sound) return ov("sound state "..music.folder..sound..".ogg") end -------------------------------------------------------------------------------- local function setvolume(sound, vol) ov("sound volume "..music.folder..sound..".ogg "..vol) end -------------------------------------------------------------------------------- local function setchannelvolume(channel, vol) if vol == 0 then updatemessage(channel.."vol", "Off", colors.red) else updatemessage(channel.."vol", vol.."%", colors.green) end -- update the music volume immediately since it may be playing if channel == "music" then if music.currenttrack ~= "" then setvolume(music.currenttrack, (options.musicvol * music.fade / 100)) end end end -------------------------------------------------------------------------------- local function stopallsound() ov("sound stop") end -------------------------------------------------------------------------------- local function stopmusic() if music.currenttrack ~= "" then ov("sound stop "..music.folder..music.currenttrack..".ogg") end end -------------------------------------------------------------------------------- local function playsound(name, loop) if options.soundvol > 0 then loop = loop or false if loop then ov("sound loop "..music.folder..name..".ogg "..(options.soundvol / 100)) else ov("sound play "..music.folder..name..".ogg "..(options.soundvol / 100)) end end end -------------------------------------------------------------------------------- local function playmusic(name, loop) loop = loop or false stopmusic() music.currenttrack = name if loop then ov("sound loop "..music.folder..name..".ogg "..(options.musicvol / 100)) else ov("sound play "..music.folder..name..".ogg "..(options.musicvol / 100)) end end -------------------------------------------------------------------------------- local function updatelevel(value) game.level = value updatemessage("level", "Level "..game.level) updatemessage("complete", "Level "..game.level.." complete!") end -------------------------------------------------------------------------------- local function updatescore(value) game.score = value updatemessage("score", "Score "..game.score) end -------------------------------------------------------------------------------- local function updatehighscore(value) local color = colors.white if game.newhigh then color = colors.green end game.hiscore = value updatemessage("high", "High Score "..game.hiscore, color) end -------------------------------------------------------------------------------- local function updateballs(value) game.balls = value local color = colors.white if game.balls == 1 then updatemessage("left", "Last ball!", colors.red) color = colors.red elseif game.balls == 2 then color = colors.yellow updatemessage("left", game.balls.." balls left", colors.yellow) else updatemessage("left", game.balls.." balls left", colors.green) end updatemessage("balls", "Balls "..game.balls, color) end -------------------------------------------------------------------------------- local function updatecombo(value) local color = colors.white game.combo = value if game.combo == game.maxcombo then color = colors.green end updatemessage("combo", "Combo x"..game.combo - 1, color) end -------------------------------------------------------------------------------- local function highlightkey(textstr, x, y, w, h, token, color) local t1, t2 = textstr:find(token) if t1 ~= nil then local charw = w / textstr:len() local x1 = x + (t1 - 1) * charw local oldblend = ov("blend 0") local oldrgba = ovt(colors.black) ovt{"fill", x1 + shadow.txtx, y + shadow.txty, (charw * (t2 - t1 + 1) + 5), h - 4} ovt(color) ovt{"fill", x1, y, (charw * (t2 - t1 + 1) + 5), h - 4} ovt(oldrgba) ov("blend "..oldblend) end end -------------------------------------------------------------------------------- local function drawtextclip(name, x, y, xalign, yalign, highlight) xalign = xalign or text.alignleft yalign = yalign or text.aligntop highlight = highlight or false -- lookup the message local message = messages[name] local w = message.width local h = message.height local xoffset = 0 local yoffset = 0 if xalign == text.aligncenter then xoffset = (wd - w) / 2 elseif xalign == text.alignright then xoffset = wd - w - edgegapr - edgegapl end if yalign == text.aligncenter then yoffset = (ht - h) / 2 elseif yalign == text.alignbottom then yoffset = ht - h end -- check for highlight text if highlight == true then for colkey, list in pairs(keynames) do for _, textstr in pairs(list) do highlightkey(message.text, x + xoffset + edgegapl, y + yoffset, w, h, textstr, keycols[colkey]) end end end -- draw the text clip pastetext(x + xoffset + edgegapl, y + yoffset, nil, name) -- return clip dimensions return w, h end -------------------------------------------------------------------------------- local function updatenotification() -- check if there is a message to display if notification.message ~= "" then local y -- check if notification finished if notification.current >= notification.duration then notification.message = "" notification.current = 0 else -- check which phase if notification.current < notification.trans then -- appear y = (notification.current / notification.trans) * (8 * text.fontscale) elseif notification.current > notification.duration - notification.trans then -- disappear y = (notification.duration - notification.current) / notification.trans * (8 * text.fontscale) else -- hold y = (8 * text.fontscale) end -- draw notification drawtextclip("notify", 4, (8 * text.fontscale) - y, text.alignleft, text.alignbottom) notification.current = notification.current + timing.framemult end end end -------------------------------------------------------------------------------- local function notify(message, flag) flag = flag or -1 notification.message = message if flag == 0 then notification.message = message.." off" elseif flag == 1 then notification.message = message.." on" end -- create the text clip updatemessage("notify", notification.message) if notification.current ~= 0 then notification.current = notification.trans end end -------------------------------------------------------------------------------- local function initparticles() particle.particles = {} end -------------------------------------------------------------------------------- local function createparticles(x, y, areawd, areaht, howmany, color) color = color or colors.white -- find the first free slot local i = 1 while i <= #particle.particles and particle.particles[i].alpha > 0 do i = i + 1 end for _ = 1, howmany do local item = { alpha = 255, x = x - rand(areawd // 1), y = y + rand(areaht // 1), dx = rand() - 0.5, dy = rand() - 0.5, color = color } particle.particles[i] = item i = i + 1 -- find the next free slot while i <= #particle.particles and particle.particles[i].alpha > 0 do i = i + 1 end end end -------------------------------------------------------------------------------- local function drawparticles() ov("blend 2") local xy = {"fill"} local m = 2 local color = {"rgba", 0, 0, 0, -1} for i = 1, #particle.particles do local item = particle.particles[i] local scale = ht / 1000 -- check if particle is still alive local alpha = item.alpha if alpha > 0 then if options.showparticles ~= 0 then local itemcol = item.color -- check if this item has a different color than the current batch if alpha ~= color[5] or itemcol[2] ~= color[2] or itemcol[3] ~= color[3] or itemcol[4] ~= color[4] then -- draw the current batch if m > 2 then ovt(xy) m = 2 xy = {"fill"} end -- start a new batch with the new color color = {"rgba", itemcol[2], itemcol[3], itemcol[4], alpha} ovt(color) end -- add the item to the batch to draw xy[m] = item.x xy[m + 1] = item.y xy[m + 2] = 2 xy[m + 3] = 2 m = m + 4 end -- fade item alpha = alpha - 4 * timing.framemult if alpha < 0 then alpha = 0 end item.alpha = alpha item.x = item.x + item.dx * timing.framemult * scale item.y = item.y + item.dy * timing.framemult * scale item.dx = item.dx * 0.99 if item.dy < 0 then item.dy = item.dy + 0.05 else item.dy = (item.dy + 0.02) * 1.02 end end end -- draw any unfinished batch if m > 2 then ovt(xy) end end -------------------------------------------------------------------------------- local function initpoints() points = {} end -------------------------------------------------------------------------------- local function createpoints(x, y, value) -- find the first free slot local i = 1 while i <= #points and points[i].duration > 0 do i = i + 1 end -- create the clip ov("font "..((7 * text.fontscale) // 1 | 0).." mono") local w, h = maketext(value, "point"..i, op.white, shadow.txtx, shadow.txty) -- save the item local item = { duration = 60, x = (x + brick.wd / 2 - w / 2), y = (y + brick.ht / 2 - h / 2) } points[i] = item end -------------------------------------------------------------------------------- local function drawpoints() ov("blend 2") for i = 1, #points do local item = points[i] -- check if item is still alive if item.duration > 0 then if options.brickscore == 1 then local y = item.y + brick.offsety * brick.ht if item.duration < 8 then -- fade out by replacing clip alpha ov("target point"..i) ov("replace *# *# *# *#-16") ov("target") end -- draw item ovt{"paste", item.x, y, "point"..i} end item.duration = item.duration - 1 * timing.framemult if item.duration < 0 then item.duration = 0 end end end end -------------------------------------------------------------------------------- local function createfadingbrick(x, y) local fading = brick.fading local i = 1 while i <= #fading and fading[i].alpha > 0 do i = i + 1 end fading[i] = { alpha = shadow.alpha, x = x, y = y } end -------------------------------------------------------------------------------- local function drawfadingbricks(pass, xoff, yoff) ov("blend 2") -- get the list of fading bricks local fading = brick.fading local fadecols = brick.fadecols local fadecolor = shadow.fadecolor for i = 1, #fading do local alpha = fading[i].alpha -- find each shadow that hasn't fully faded if alpha > 0 then -- increase transparency if this is the brick (not shadow) if pass == 2 then alpha = alpha - shadow.delta if alpha < 0 then alpha = 0 end fading[i].alpha = alpha end if alpha > 0 then -- draw brick or shadow local fy = fading[i].y local y = (fy + brick.offsety) * brick.ht local x = (fading[i].x - 1) * brick.wd + edgegapl -- pick the color depending on drawing brick or shadow if (pass == 1) then fadecolor[5] = alpha ovt(fadecolor) else fadecols[fy][5] = alpha * 2 ovt(fadecols[fy]) end ovt{"fill", (x + xoff), (y + yoff), (brick.wd - 1), (brick.ht - 1)} end end end end -------------------------------------------------------------------------------- local function createbackground() -- create background clip ov("create "..wd.." "..ht.." "..bgclip) ov("target "..bgclip) -- create background gradient ov("blend 0") local c local level = 96 local cmd = {"line", 0, 0, wd - 1, 0} for y = 0, ht - 1 do c = (y * level) // ht ovt{"rgba", 0, (level - c), c, 255} cmd[3] = y cmd[5] = y ovt(cmd) end -- add borders if required if edgegapl > 0 then ovt(colors.black) ovt{"fill", 0, 0, edgegapl, (ht - 1)} end if edgegapr > 0 then ovt(colors.black) ovt{"fill", (wd - edgegapr), 0 , edgegapr, (ht - 1)} end -- reset target ov("target") end -------------------------------------------------------------------------------- local function drawbackground() ov("blend 0") ovt{"paste", 0, 0, bgclip} end -------------------------------------------------------------------------------- local function drawbricks() local xoff = shadow.x local yoff = shadow.y local bwd = brick.wd local bht = brick.ht local bwdm1 = bwd - 1 local bhtm1 = bht - 1 local ncols = brick.numcols local startpass = 1 -- check whether to draw shadows if options.showshadows == 0 then startpass = 2 xoff = 0 yoff = 0 end for pass = startpass, 2 do drawfadingbricks(pass, xoff, yoff) if pass == 1 then ov("blend 2") ovt(shadow.color) else ov("blend 0") end for y = 1, brick.numrows do local bricks = brick.rows[y] if pass == 2 then ovt(brick.cols[y]) end local by = ((y + brick.offsety) * bht) // 1 + yoff local bx = edgegapl + xoff for x = 1, ncols do if bricks[x] then ovt{"fill", bx, by, bwdm1, bhtm1} end bx = bx + bwd end end xoff = 0 yoff = 0 end end -------------------------------------------------------------------------------- local function drawball() local oldwidth = ov("lineoption width "..(ball.size // 2)) ov("blend 2") if options.showshadows == 1 then ovt(shadow.color) ov("ellipse "..(((ball.x - ball.size // 2) + shadow.x) // 1 | 0).." "..(((ball.y - ball.size // 2) + shadow.y) // 1 | 0).." "..ball.size.." "..ball.size) end ovt(colors.white) ov("ellipse "..((ball.x - ball.size // 2) // 1 | 0).." "..((ball.y - ball.size // 2) // 1 | 0).." "..ball.size.." "..ball.size) if rand() < particle.ballpartchance * timing.framemult then createparticles(ball.x + ball.size // 2, ball.y - ball.size // 2, ball.size, ball.size, particle.ballparticles) end ov("lineoption width "..oldwidth) end -------------------------------------------------------------------------------- local function drawbat(alpha) alpha = alpha or 256 ov("blend 2") if options.showshadows == 1 then shadow.fadecolor[5] = alpha // 2 ovt(shadow.fadecolor) ovt{"fill", bat.x + shadow.x, bat.y + shadow.y, bat.wd, bat.ht} end -- draw the bat in red if mouse is off the overlay if game.offoverlay then ovt(colors.red) else if alpha == 256 then alpha = 255 end ovt{"rgba", 192, 192, 192, alpha} end ovt{"fill", bat.x, bat.y, bat.wd, bat.ht} end -------------------------------------------------------------------------------- local function initbricks() brick.rows = {} brick.wd = wd // brick.numcols brick.ht = ht // 40 brick.bricksleft = 0 brick.totalbricks = 0 brick.offsety = game.level + 1 if brick.offsety > brick.maxoffsety then brick.offsety = brick.maxoffsety end brick.movedown = 0 -- check for bonus level bonus.current = bonus.time bonus.level = false if (game.level % bonus.interval) == 0 then bonus.level = true end -- distribute any gap left and right local edgegap = wd - brick.wd * brick.numcols edgegapl = edgegap // 2 edgegapr = edgegap - edgegapl -- clear the fading bricks (used when brick hit) brick.fading = {} -- create the brick fade colors from the brick colors for i = 1, #brick.cols do local col = brick.cols[i] brick.fadecols[i] = {"rgba", col[2], col[3], col[4], col[5]} end -- set the required bricks alive local match for y = 1, brick.numrows do local bricks = {} if bonus.level then local bonusrow = bonus.bricks[y] match = 1 for x = brick.numcols - 1, 0, -1 do if (bonusrow & match) == match then bricks[x + 1] = true brick.bricksleft = brick.bricksleft + 1 else bricks[x + 1] = false end match = match + match end else for x = 1, brick.numcols do bricks[x] = true brick.bricksleft = brick.bricksleft + 1 end end brick.rows[y] = bricks end brick.totalbricks = brick.bricksleft end -------------------------------------------------------------------------------- local function initbat() bat.wd = wd // 10 bat.x = (wd - bat.wd) // 2 bat.ht = brick.ht bat.y = ht - bat.ht * 4 end -------------------------------------------------------------------------------- local function initball() ball.size = wd // 80 ball.x = (wd - ball.size) / 2 ball.y = bat.y - ball.size end -------------------------------------------------------------------------------- local function initshadow() shadow.x = -wd // 100 shadow.y = ht // 100 shadow.color = {"rgba", 0, 0, 0, shadow.alpha} end -------------------------------------------------------------------------------- local function togglefullscreen() options.fullscreen = 1 - options.fullscreen writesettings() setfullscreen() initpoints() end -------------------------------------------------------------------------------- local function toggletiming() options.showtiming = 1 - options.showtiming writesettings() notify("Timing", options.showtiming) end -------------------------------------------------------------------------------- local function toggleparticles() options.showparticles = 1 - options.showparticles writesettings() notify("Particles", options.showparticles) end -------------------------------------------------------------------------------- local function toggleautopause() options.autopause = 1 - options.autopause writesettings() notify("Autopause", options.autopause) end -------------------------------------------------------------------------------- local function toggleautostart() options.autostart = 1 - options.autostart writesettings() notify("Autostart", options.autostart) end -------------------------------------------------------------------------------- local function togglemouse() options.showmouse = 1 - options.showmouse writesettings() showcursor() notify("Mouse pointer", options.showmouse) end -------------------------------------------------------------------------------- local function toggleshadowdisplay() options.showshadows = 1 - options.showshadows writesettings() notify("Shadows", options.showshadows) end -------------------------------------------------------------------------------- local function togglebrickscore() options.brickscore = 1 - options.brickscore writesettings() notify("Brick Score", options.brickscore) end -------------------------------------------------------------------------------- local function savescreenshot() local filename = g.getdir("data").."shot"..os.date("%y%m%d%H%M%S", os.time())..".png" ov("save 0 0 0 0 "..filename) notify("Saved screenshot "..filename) end -------------------------------------------------------------------------------- local function toggleconfirmquit() options.confirmquit = 1 - options.confirmquit writesettings() notify("Confirm Quit", options.confirmquit) end -------------------------------------------------------------------------------- local function togglecomboscore() options.comboscore = 1 - options.comboscore writesettings() notify("Combo Score", options.comboscore) end -------------------------------------------------------------------------------- local function adjustsoundvol(delta) options.soundvol = options.soundvol + delta if options.soundvol > 100 then options.soundvol = 100 end if options.soundvol < 0 then options.soundvol = 0 end writesettings() notify("Sound Volume "..options.soundvol.."%") setchannelvolume("fx", options.soundvol) end -------------------------------------------------------------------------------- local function adjustmusicvol(delta) options.musicvol = options.musicvol + delta if options.musicvol > 100 then options.musicvol = 100 end if options.musicvol < 0 then options.musicvol = 0 end writesettings() notify("Music Volume "..options.musicvol.."%") setchannelvolume("music", options.musicvol) end -------------------------------------------------------------------------------- local function processstandardkeys(event) if event:find("^key") then if event == "key f11 none" then -- toggle fullscreen togglefullscreen() elseif event == "key a none" then -- toggle autopause when mouse moves off overlay toggleautopause() elseif event == "key b none" then -- toggle brick score display togglebrickscore() elseif event == "key c none" then -- toggle combo score display togglecomboscore() elseif event == "key d none" then -- toggle shadow display toggleshadowdisplay() elseif event == "key = none" then -- increase sound volume adjustsoundvol(10) elseif event == "key - none" then -- decrease sound volume adjustsoundvol(-10) elseif event == "key m none" then -- toggle mouse cursor display when not fullscreen togglemouse() elseif event == "key p none" then -- toggle particle display toggleparticles() elseif event == "key q none" then -- toggle confirm quit toggleconfirmquit() elseif event == "key s none" then -- toggle autostart when mouse moves onto overlay toggleautostart() elseif event == "key t none" then -- toggle timing display toggletiming() elseif event == "key [ none" then -- decrease music volume adjustmusicvol(-10) elseif event == "key ] none" then -- increase music volume adjustmusicvol(10) elseif event == "key tab none" then -- show options options.showoptions = not options.showoptions elseif event == "key f12 none" then -- save screenshot savescreenshot() end end end -------------------------------------------------------------------------------- local function pausegame(paused) if paused ~= game.pause then game.pause = paused if music.currenttrack ~= "" then if game.pause then music.fade = 1 music.faderate = -0.05 else music.faderate = 0.05 ov("sound resume") end end end end -------------------------------------------------------------------------------- local function updatemusic() if music.currenttrack ~= "" then if game.pause then if music.fade > 0 then music.fade = music.fade + music.faderate if music.fade <= 0 then music.fade = 0 ov("sound pause") else setvolume(music.currenttrack, (options.musicvol * music.fade / 100)) end end else if music.fade < 1 then music.fade = music.fade + music.faderate if music.fade > 1 then music.fade = 1 end setvolume(music.currenttrack, (options.musicvol * music.fade / 100)) end end end end -------------------------------------------------------------------------------- local function processinput() -- check for click, enter or return local event = g.getevent() if #event > 0 then local button, _ button = "" if event:find("^oclick") then _, _, _, button, _= split(event) end -- right click quits game if button == "right" then if options.confirmquit == 0 then updateballs(0) options.showoptions = false else options.confirming = not options.confirming end elseif button == "left" or event == "key return none" or event == "key space none" then -- left click, enter or space starts game, toggles pause or dismisses settings if options.confirming then updateballs(0) options.showoptions = false options.confirming = false elseif options.showoptions then options.showoptions = false elseif game.newball then if bonus.level then playmusic("bonusloop", true) else playmusic("gameloop", true) end game.newball = false pausegame(false) else -- do not unpause if off overlay if not (game.pause and game.offoverlay and options.autopause ~= 0) then pausegame(not game.pause) end end else processstandardkeys(event) end end end -------------------------------------------------------------------------------- local function processendinput() local event = g.getevent() if #event > 0 then local button, _ button = "" if event:find("^oclick") then _, _, _, button, _ = split(event) end -- right click quits application if button == "right" then -- quit application game.again = false game.finished = true options.showoptions = false elseif button == "left" or event == "key return none" or event == "key space none" then -- left click, enter or space restarts game or dismisses settings if options.showoptions then options.showoptions = false else game.finished = true end else processstandardkeys(event) end end end -------------------------------------------------------------------------------- local function resizegame(newwd, newht) -- check minimum size if newwd < minwd then newwd = minwd end if newht < minht then newht = minht end local xscale = newwd / wd local yscale = newht / ht wd = newwd ht = newht text.fontscale = wd / minwd if (ht / minht) < text.fontscale then text.fontscale = ht / minht end -- scale bat, ball and bricks brick.wd = wd // brick.numcols brick.ht = ht // 40 particle.brickparticles = brick.wd * brick.ht // 10 bat.wd = wd // 10 bat.ht = brick.ht ball.size = wd // 80 local edgegap = wd - brick.wd * brick.numcols edgegapl = edgegap // 2 edgegapr = edgegap - edgegapl -- reposition the bat and ball bat.x = bat.x * xscale bat.y = ht - bat.ht * 4 ball.x = ball.x * xscale ball.y = ball.y * yscale -- reposition particles for i = 1, #particle.particles do local item = particle.particles[i] item.x = item.x * xscale item.y = item.y * yscale end -- resize shadow initshadow() -- recreate background createbackground() -- recreate static text createstatictext() -- resize overlay ov("resize "..wd.." "..ht) end -------------------------------------------------------------------------------- local function drawscoreline() ov("blend 2") drawtextclip("score", 4, 4, text.alignleft) drawtextclip("balls", -4, 4, text.alignright) drawtextclip("high", 0, 4, text.aligncenter) if game.combo > 2 then drawtextclip("combo", 0, 0, text.aligncenter, text.alignbottom) end if not game.newball and not game.pause and not options.showoptions and bonus.level and bonus.current >= 0 then local color = colors.green if bonus.current < 10 then color = colors.red elseif bonus.current < 20 then color = colors.yellow end updatemessage("time", "Time "..string.format("%.1f", bonus.current), color) drawtextclip("time", 0, ht / 2, text.aligncenter) color = colors.green if brick.bricksleft > bonus.yellow then color = colors.red elseif brick.bricksleft > bonus.green then color = colors.yellow end updatemessage("remain", "Bricks left "..brick.bricksleft, color) drawtextclip("remain", 0, ht / 2 + 25 * text.fontscale, text.aligncenter) end end -------------------------------------------------------------------------------- local function drawgameover() ov("blend 2") if game.newhigh then local highscorew = drawtextclip("newhigh", 0, ht / 2 + 96 * text.fontscale, text.aligncenter) createparticles(edgegapl + (wd / 2 + highscorew / 2), (ht / 2 + 96 * text.fontscale), highscorew, 1, particle.highparticles) end updatecombo(game.gamecombo) if game.newcombo then local combow = drawtextclip("newcombo", 0, ht / 2 + 118 * text.fontscale, text.aligncenter) createparticles(edgegapl + (wd / 2 + combow / 2), (ht / 2 + 118 * text.fontscale), combow, 1, particle.comboparticles) end drawtextclip("gameover", 0, ht / 2 - 30 * text.fontscale, text.aligncenter) drawtextclip("restart", 0, ht / 2 + 30 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quit", 0, ht / 2 + 52 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 74 * text.fontscale, text.aligncenter, nil, true) if bat.fade > 0 then bat.fade = bat.fade - shadow.delta if bat.fade < 0 then bat.fade = 0 end drawbat(bat.fade) end end -------------------------------------------------------------------------------- local function drawlevelcomplete() ov("blend 2") drawtextclip("complete", 0, ht / 2 - 30 * text.fontscale, text.aligncenter) drawtextclip("continue", 0, ht / 2 + 30 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quitgame", 0, ht / 2 + 52 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 74 * text.fontscale, text.aligncenter, nil, true) end -------------------------------------------------------------------------------- local function drawbonuscomplete() ov("blend 2") drawtextclip("bcomplete", 0, ht / 2 - 30 * text.fontscale, text.aligncenter) local w = drawtextclip("awarded", 0, ht / 2, text.aligncenter) if brick.bricksleft <= bonus.green then createparticles(edgegapl + (wd / 2 + w / 2), ht / 2, w, 1, particle.bonusparticlesg) elseif brick.bricksleft <= bonus.yellow then createparticles(edgegapl + (wd / 2 + w / 2), ht / 2, w, 1, particle.bonusparticlesy) end drawtextclip("continue", 0, ht / 2 + 30 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quitgame", 0, ht / 2 + 52 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 74 * text.fontscale, text.aligncenter, nil, true) if game.newbonus then local bonusw = drawtextclip("newbonus", 0, ht / 2 + 96 * text.fontscale, text.aligncenter) createparticles(edgegapl + (wd / 2 + bonusw / 2), (ht / 2 + 96 * text.fontscale), bonusw, 1, particle.bonusparticles) end end -------------------------------------------------------------------------------- local function drawconfirm() ov("blend 2") drawtextclip("askquit", 0, ht / 2 - 15 * text.fontscale, text.aligncenter, nil, true) drawtextclip("askleft", 0, ht / 2 + 22 * text.fontscale, text.aligncenter, nil, true) drawtextclip("askright", 0, ht / 2 + 44 * text.fontscale, text.aligncenter, nil, true) end -------------------------------------------------------------------------------- local function drawpause() ov("blend 2") drawtextclip("pause", 0, ht / 2 - 15 * text.fontscale, text.aligncenter) if game.offoverlay and options.autopause ~= 0 then if options.autostart ~= 0 then drawtextclip("focus", 0, ht / 2 + 22 * text.fontscale, text.aligncenter) else drawtextclip("manfocus", 0, ht / 2 + 22 * text.fontscale, text.aligncenter) drawtextclip("resume", 0, ht / 2 + 44 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quitgame", 0, ht / 2 + 66 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 88 * text.fontscale, text.aligncenter, nil, true) end else drawtextclip("resume", 0, ht / 2 + 22 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quitgame", 0, ht / 2 + 44 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 66 * text.fontscale, text.aligncenter, nil, true) end end -------------------------------------------------------------------------------- local function drawnewball() ov("blend 2") drawtextclip("newball", 0, ht / 2 + 22 * text.fontscale, text.aligncenter, nil, true) drawtextclip("control", 0, ht / 2 + 44 * text.fontscale, text.aligncenter, nil, true) drawtextclip("quitgame", 0, ht / 2 + 66 * text.fontscale, text.aligncenter, nil, true) drawtextclip("option", 0, ht / 2 + 88 * text.fontscale, text.aligncenter, nil, true) drawtextclip("left", 0, ht / 2 - 15 * text.fontscale, text.aligncenter) if bonus.level then drawtextclip("bonus", 0, ht / 2 - 52 * text.fontscale, text.aligncenter) else drawtextclip("level", 0, ht / 2 - 52 * text.fontscale, text.aligncenter) end end -------------------------------------------------------------------------------- local function drawtiming(t) timing.times[timing.timenum] = t timing.timenum = timing.timenum + 1 if timing.timenum > timing.numtimes then timing.timenum = 1 end local average = 0 for i = 1, #timing.times do average = average + timing.times[i] end average = average / #timing.times local oldblend = ov("blend 2") updatemessage("ms", string.format("%.1fms", average)) drawtextclip("ms", -4, 0, text.alignright, text.alignbottom) ov("blend "..oldblend) end -------------------------------------------------------------------------------- local function drawoption(key, setting, state, leftx, h, y) if key ~= "key" then ovt(colors.black) ovt{"fill", (leftx + edgegapl + shadow.txtx), (y + shadow.txty), (messages[key].width + 3), (messages[key].height - 4)} ovt(keycolor) ovt{"fill", (leftx + edgegapl), y, (messages[key].width + 3), (messages[key].height - 4)} end drawtextclip(key, leftx, y, text.alignleft) drawtextclip(setting, 0, y, text.aligncenter) drawtextclip(state, -leftx, y, text.alignright) return y + h end -------------------------------------------------------------------------------- local function drawpercent(downkey, upkey, setting, valname, leftx, h, y) local width = messages[downkey].width local height = messages[downkey].height ovt(colors.black) ovt{"fill", (leftx + edgegapl + shadow.txtx), (y + shadow.txty), (width + 3), (height - 4)} ovt{"fill", (leftx + width * 2 + edgegapl + shadow.txtx), (y + shadow.txty), (width + 3), (height - 4)} ovt(keycolor) ovt{"fill", (leftx + edgegapl), y, (width + 3), (height - 4)} ovt{"fill", (leftx + width * 2 + edgegapl), y, (width + 3), (height - 4)} drawtextclip(downkey, leftx, y, text.alignleft) drawtextclip(upkey, leftx + width * 2, y, text.alignleft) drawtextclip(setting, 0, y, text.aligncenter) drawtextclip(valname, -leftx, y, text.alignright) return y + h end -------------------------------------------------------------------------------- local function drawoptions() local leftx = wd // 6 local state = {[0] = "off", [1] = "on"} -- draw header ov("blend 2") local h = messages["key"].height local y = (ht - 14 * h) // 2 y = drawoption("key", "function", "state", leftx, h, y) -- draw options y = drawoption("a", "autopause", state[options.autopause], leftx, h, y) y = drawoption("b", "brickscore", state[options.brickscore], leftx, h, y) y = drawoption("c", "comboscore", state[options.comboscore], leftx, h, y) y = drawoption("d", "shadows", state[options.showshadows], leftx, h, y) y = drawoption("m", "mouse", state[options.showmouse], leftx, h, y) y = drawoption("p", "particles", state[options.showparticles], leftx, h, y) y = drawoption("q", "confirm", state[options.confirmquit], leftx, h, y) y = drawoption("s", "autostart", state[options.autostart], leftx, h, y) y = drawoption("t", "timing", state[options.showtiming], leftx, h, y) y = drawoption("f11", "fullscreen", state[options.fullscreen], leftx, h, y) y = drawpercent("-", "=", "sound", "fxvol", leftx, h, y) y = drawpercent("[", "]", "music", "musicvol", leftx, h, y) -- draw close options drawtextclip("close", 0, y + h, text.aligncenter, nil, true) if game.balls == 0 then drawtextclip("quit", 0, y + h * 2.5, text.aligncenter, nil, true) else drawtextclip("quitgame", 0, y + h * 2.5, text.aligncenter, nil, true) end end -------------------------------------------------------------------------------- local function checkforsystemevent() -- check for resize local newwd, newht = g.getview(g.getlayer()) if newwd ~= wd or newht ~= ht then resizegame(newwd, newht) end -- check for overlay hidden if not game.pause then if g.getoption("showoverlay") == 0 then pausegame(true) end end end -------------------------------------------------------------------------------- local function updatebatposition() local mousepos = ov("xy") if mousepos ~= "" then local mousex, _ = split(mousepos) if mousex ~= bat.lastx then bat.lastx = mousex bat.x = tonumber(mousex) - bat.wd / 2 if bat.x < edgegapl then bat.x = edgegapl elseif bat.x > wd - edgegapr - bat.wd then bat.x = wd - edgegapr - bat.wd end end -- check if mouse was off overlay if game.offoverlay then -- check if paused if game.pause and options.autostart ~= 0 and options.autopause ~= 0 then pausegame(false) end end game.offoverlay = false else -- mouse off overlay game.offoverlay = true -- check for autopause if in game if options.autopause ~= 0 and not game.newball then pausegame(true) end end end -------------------------------------------------------------------------------- local function clearbonusbricks() local bricks local clearparticles = particle.brickparticles / 4 for y = 1, brick.numrows do bricks = brick.rows[y] for x = 1, brick.numcols do if bricks[x] then bricks[x] = false createparticles(x * brick.wd + edgegapl, ((y + brick.offsety) * brick.ht), brick.wd, brick.ht, clearparticles, brick.cols[y]) createfadingbrick(x, y) end end end end -------------------------------------------------------------------------------- local function computebonus() local bonusscore = 0 if brick.bricksleft <= bonus.green then bonusscore = (brick.totalbricks - brick.bricksleft) * (100 + (game.level - 1) * 10) updatemessage("awarded", "Bricks left "..brick.bricksleft.." = "..bonusscore, colors.green) elseif brick.bricksleft <= bonus.yellow then bonusscore = (brick.totalbricks - brick.bricksleft) * (50 + (game.level - 1) * 10) updatemessage("awarded", "Bricks left "..brick.bricksleft.." = "..bonusscore, colors.yellow) else updatemessage("awarded", "Bricks left "..brick.bricksleft.." = ".."No Bonus", colors.red) end playmusic("levelcompleteloop", true) updatescore(game.score + bonusscore) if game.score > game.hiscore then game.newhigh = true updatehighscore(game.score) end if bonusscore > bonus.best then game.newbonus = true bonus.best = bonusscore end end -------------------------------------------------------------------------------- local function resetcombo() updatecombo(1) game.combomult = 1 game.comboraw = 0 game.comboextra = 0 end -------------------------------------------------------------------------------- local function playexit() local box = {} local n = 1 local tx, ty local tilesize = wd // 32 ov("blend 0") -- copy the screen into tiles for y = 0, ht, tilesize do for x = 0, wd, tilesize do tx = x + rand(0, wd // 8) - wd / 16 ty = ht + rand(0, ht // 2) local entry = {} entry[1] = x entry[2] = y entry[3] = tx entry[4] = ty box[n] = entry ov("copy "..x.." "..y.." "..tilesize.." "..tilesize.." sprite"..n) n = n + 1 end end local fadestart = music.fade ovt(colors.black) for i = 0, 100 do local t = g.millisecs() local a = i / 100 local x, y ovt{"fill"} -- update each tile for j = 1, #box do x = box[j][1] y = box[j][2] tx = box[j][3] ty = box[j][4] ovt{"paste", (x * (1 - a) + tx * a), (y * (1 - a) + ty * a), "sprite"..j} end -- draw timing if on if options.showtiming == 1 then drawtiming(g.millisecs() - t) end -- fade the music music.fade = fadestart * ((100 - i) / 100) setvolume(music.currenttrack, (options.musicvol * music.fade / 100)) ov("update") while g.millisecs() - t < 15 do end end -- delete tiles for i = 1, #box do ov("delete sprite"..i) end end -------------------------------------------------------------------------------- local function breakout() -- set font local oldfont = ov("font 16 mono") local oldbg = ov("textoption background 0 0 0 0") local oldblend = ov("blend 0") local oldcursor = ov("cursor arrow") -- read saved settings readsettings() setfullscreen() -- set sound and music volume setchannelvolume("fx", options.soundvol) setchannelvolume("music", options.musicvol) -- play games until finished game.balls = 3 game.score = 0 game.level = 1 game.again = true game.newhigh = false game.newcombo = false game.newbonus = false -- initialise the bat and ball initbat() initball() -- welcome message notify("Golly Breakout build "..build) -- create static text createstatictext() -- initialize dynamic text updatescore(game.score) updatehighscore(game.hiscore) updateballs(game.balls) updatelevel(game.level) -- main loop while game.again do music.fade = 1 -- initialize the bricks initbricks() -- create the background createbackground() -- intiialize the bat local bathits = 0 local maxhits = 7 bat.lastx = -1 -- initialize the ball local balldx = 0.5 local balldy = -1 local maxspeed = 2.2 + (game.level - 1) * 0.1 if maxspeed > 3 then maxspeed = 3 end local speedinc = 0.02 local speeddef = 1 + (game.level - 1) * speedinc * 4 if speeddef > maxspeed then speeddef = maxspeed end local ballspeed = speeddef local speeddiv = 3 -- initialize shadow initshadow() -- initialize particles initparticles() -- initialise points initpoints() -- whether alive game.newball = true options.confirming = false pausegame(false) -- whether mouse off overlay game.offoverlay = false -- reset combo resetcombo() -- game loop playmusic("gamestart") while game.balls > 0 and brick.bricksleft > 0 and bonus.current > 0 do -- time frame local frametime = g.millisecs() -- check for mouse click or key press processinput() -- check if size of overlay has changed or overlay is hidden checkforsystemevent() -- draw the background drawbackground() -- process next game step unless paused or game finished due to user quit if not game.pause and not options.confirming and not options.showoptions and bonus.current > 0 and game.balls > 0 then -- check for new ball if not game.newball then -- update ball position incrementally local framesteps = (ball.numsteps * timing.framemult) // 1 local i = 1 while i <= framesteps and not game.newball do i = i + 1 local stepx = ((balldx * ballspeed * ball.size) / speeddiv) / ball.numsteps local stepy = ((balldy * ballspeed * ball.size) / speeddiv) / ball.numsteps ball.x = ball.x + stepx ball.y = ball.y + stepy -- check for ball hitting left or right boundary if ball.x < ball.size / 2 + edgegapl or ball.x >= wd - edgegapr - ball.size / 2 then createparticles(ball.x, ball.y, 1, 1, particle.wallparticles) -- invert x direction balldx = -balldx ball.x = ball.x - stepx playsound("edge") end -- check for ball hitting top boundary if ball.y < ball.size / 2 then createparticles(ball.x, (ball.y - ball.size / 2), 1, 1, particle.wallparticles) -- ball hit top so speed up a little bit balldy = -balldy ball.y = ball.y - stepy ballspeed = ballspeed + speedinc / 2 if ballspeed > maxspeed then ballspeed = maxspeed end playsound("top") -- check for ball hitting bottom boundary elseif ball.y >= ht then -- check for bonus level if bonus.level then -- end bonus level bonus.current = 0 else -- ball lost! updateballs(game.balls - 1) balldy = -1 balldx = 0.5 ballspeed = speeddef game.newball = true -- reset combo if game.comboextra - game.comboraw > 0 then if options.comboscore == 1 then notify("Combo x "..(game.combo - 1).." Score "..game.comboextra - game.comboraw.." (+"..(((100 * game.comboextra // game.comboraw) - 100) // 1 | 0).."%)") end end resetcombo() playmusic("lostball") end -- exit loop i = framesteps + 1 -- check for ball hitting bat elseif ball.y >= bat.y and ball.y <= bat.y + bat.ht - 1 and ball.x >= bat.x and ball.x < bat.x + bat.wd then -- set dx from where ball hit bat balldx = (3 * (ball.x - bat.x) / bat.wd) - 1.5 if balldx >= 0 and balldx < 0.1 then balldx = 0.1 end if balldx > -0.1 and balldx <= 0 then balldx = -0.1 end balldy = -balldy ball.y = bat.y bathits = bathits + 1 -- move the bricks down after a number of bat hits if bathits == maxhits then bathits = 0 if brick.offsety < brick.maxoffsety then brick.movedown = brick.movesteps brick.startoffset = brick.offsety end end createparticles(ball.x, ball.y - ball.size / 2, 1, 1, particle.batparticles) -- reset combo if game.comboextra - game.comboraw > 0 then if options.comboscore == 1 then notify("Combo x "..(game.combo - 1).." Score "..game.comboextra - game.comboraw.." (+"..(((100 * game.comboextra / game.comboraw) - 100) // 1 | 0).."%)") end end resetcombo() playsound("bat") end -- check for ball hitting brick brick.y = (ball.y - (brick.offsety * brick.ht)) // brick.ht if brick.y >= 1 and brick.y <= brick.numrows then brick.x = ((ball.x - edgegapl) // brick.wd) + 1 if brick.rows[brick.y][brick.x] then -- hit a brick! brick.rows[brick.y][brick.x] = false -- adjust score local pointval = ((game.level + 9) * (brick.numrows - brick.y + 1) * game.combomult) // 1 | 0 local rawpoints = ((game.level + 9) * (brick.numrows - brick.y + 1)) // 1 | 0 if game.combo > 1 then game.comboraw = game.comboraw + rawpoints game.comboextra = game.comboextra + pointval end updatescore(game.score + pointval) if game.score > game.hiscore then game.newhigh = true updatehighscore(game.score) end createpoints((brick.x - 1) * brick.wd + edgegapl, brick.y * brick.ht, pointval) createfadingbrick(brick.x, brick.y) -- increment combo game.combomult = game.combomult * game.combofact if game.combo + 1 > game.maxcombo then game.maxcombo = game.combo + 1 game.newcombo = true end updatecombo(game.combo + 1) if game.combo > game.gamecombo then game.gamecombo = game.combo end -- work out which axis to invert local lastbricky = ((ball.y - stepy) - (brick.offsety * brick.ht)) // brick.ht if lastbricky == brick.y then balldx = -balldx else balldy = -balldy end -- speed the ball up ballspeed = ballspeed + speedinc if ballspeed > maxspeed then ballspeed = maxspeed end -- create particles createparticles(brick.x * brick.wd + edgegapl, ((brick.y + brick.offsety) * brick.ht), brick.wd, brick.ht, particle.brickparticles, brick.cols[brick.y]) -- one less brick brick.bricksleft = brick.bricksleft - 1 playsound("brick"..(brick.y | 0)) end end end end end -- update brick position if brick.movedown > 0 then brick.movedown = brick.movedown - 1 brick.offsety = brick.offsety + (1 / brick.movesteps) if brick.movedown <= 0 then brick.movedown = 0 brick.offsety = brick.startoffset + 1 end end -- update bat position updatebatposition() -- if new ball then set ball to sit on bat if game.newball then ball.x = bat.x + bat.wd / 2 ball.y = bat.y - ball.size end -- draw the particles drawparticles() -- draw the bricks drawbricks() -- draw the points drawpoints() -- draw the ball if game.balls > 0 then drawball() end -- draw the bat drawbat() -- draw the score, high score and lives drawscoreline() -- check for text overlay if options.confirming then drawconfirm() elseif options.showoptions then drawoptions() elseif game.pause then drawpause() elseif game.newball and game.balls > 0 then drawnewball() end -- update music volume (used for pause fade/resume) updatemusic() -- draw timing if on if options.showtiming == 1 then drawtiming(g.millisecs() - frametime) end -- update notification updatenotification() -- update the display ov("update") -- pause until frame time reached while g.millisecs() - frametime < 16 do end -- check what the actual frame time was and scale speed accordingly timing.framemult = 1 local finaltime = g.millisecs() - frametime if finaltime > timing.sixtyhz then -- cap to maximum frame time in case external event took control for a long time if finaltime > timing.framecap then finaltime = timing.framecap end timing.framemult = finaltime / timing.sixtyhz end -- update bonus time if on bonus level if bonus.level and not game.pause and not game.newball and not options.showoptions then bonus.current = bonus.current - (finaltime / 1000) end end -- check for bonus level complete if bonus.level then computebonus() clearbonusbricks() else if brick.bricksleft == 0 then playmusic("levelcompleteloop", true) end end -- save high score, max combo and best bonus if game.newhigh or game.newcombo or game.newbonus then writesettings() end -- if game is over destroy bat and display best game combo if game.balls == 0 then -- destroy bat createparticles(bat.x + bat.wd, bat.y, bat.wd, bat.ht, particle.lostparticles) bat.fade = shadow.alpha notify("Best Combo x"..game.maxcombo - 1) end -- loop until mouse button clicked or enter pressed bonus.current = -1 game.finished = false local fading = false local musicplaytime = g.millisecs() while not game.finished do -- time frame local frametime = g.millisecs() -- check if size of overlay has changed or overlay hidden checkforsystemevent() -- draw background drawbackground() -- update bat position if game is not over if game.balls > 0 then updatebatposition() end -- draw particles drawparticles() -- draw bricks drawbricks() -- draw brick score drawpoints() -- check why game finished if options.showoptions then drawoptions() else if game.balls == 0 then -- game over drawgameover() else -- draw bat drawbat() if bonus.level then -- end of bonus level drawbonuscomplete() else -- level complete drawlevelcomplete() end end end -- handle music during game over if game.balls == 0 then if fading then -- fade music after one play through if frametime - musicplaytime > music.gameovertime then music.fade = music.fade + music.faderate if music.fade < 0 then music.fade = 0 end setvolume("gamelostloop", (options.musicvol * music.fade / 100)) end else -- wait for ball lost music to finish if soundstate("lostball") ~= "playing" then fading = true musicplaytime = g.millisecs() music.fade = 1 music.faderate = -0.001 playmusic("gamelostloop", true) else updatemusic() end end end -- draw score line drawscoreline() -- get key or mouse event processendinput() -- draw timing if on if options.showtiming == 1 then drawtiming(g.millisecs() - frametime) end -- update notification updatenotification() -- update the display ov("update") -- pause until frame time reached while g.millisecs() - frametime < 16 do end -- check what the actual frame time was and scale speed accordingly timing.framemult = 1 local finaltime = g.millisecs() - frametime if finaltime > timing.sixtyhz then -- cap to maximum frame time in case external event took control for a long time if finaltime > timing.framecap then finaltime = timing.framecap end timing.framemult = finaltime / timing.sixtyhz end end -- check why game finished if game.balls == 0 then -- reset updatescore(0) updateballs(3) updatelevel(1) game.newhigh = false updatehighscore(game.hiscore) game.newcombo = false game.gamecombo = 1 else -- level complete updatelevel(game.level + 1) end game.newbonus = false end -- exit animation playexit() -- free clips and restore settings ov("delete "..bgclip) ov("blend "..oldblend) ov("font "..oldfont) ov("textoption background "..oldbg) ov("cursor "..oldcursor) end -------------------------------------------------------------------------------- local function main() -- get size of overlay wd, ht = g.getview(g.getlayer()) if wd < minwd then wd = minwd end if ht < minht then ht = minht end -- create overlay ov("create "..wd.." "..ht) text.fontscale = wd / minwd if (ht / minht) < text.fontscale then text.fontscale = ht / minht end -- run breakout breakout() end -------------------------------------------------------------------------------- local oldoverlay = g.setoption("showoverlay", 1) local oldbuttons = g.setoption("showbuttons", 0) -- disable translucent buttons local oldscroll = g.setoption("showscrollbars", 0) local oldfs = g.getoption("fullscreen") local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed g.check(false) stopallsound() ov("delete") g.setoption("showoverlay", oldoverlay) g.setoption("showbuttons", oldbuttons) g.setoption("showscrollbars", oldscroll) g.setoption("fullscreen", oldfs) golly-3.3-src/Scripts/Lua/invert.lua0000755000175000017500000000151112706123635014403 00000000000000-- Invert all cell states in the current selection. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016. local g = golly() local gp = require "gplus" -- re-assigning inner loop functions results in a 10% speed up local setcell = g.setcell local getcell = g.getcell local r = gp.rect(g.getselrect()) if r.empty then g.exit("There is no selection.") end -- local t1 = os.clock() local oldsecs = os.clock() local maxstate = g.numstates() - 1 for row = r.top, r.bottom do -- if large selection then give some indication of progress local newsecs = os.clock() if newsecs - oldsecs >= 1.0 then oldsecs = newsecs g.update() end for col = r.left, r.right do setcell(col, row, maxstate - getcell(col, row)) end end if not r.visible() then g.fitsel() end -- g.show(""..(os.clock()-t1)) golly-3.3-src/Scripts/Lua/move-object.lua0000644000175000017500000002636313125321675015317 00000000000000-- Allow user to move a connected group of live cells. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. local g = golly() local gp = require "gplus" local int = gp.int local split = gp.split local rect = gp.rect local getminbox = gp.getminbox -- set edges of bounded grid for later use local gridl, gridr, gridt, gridb if g.getwidth() > 0 then gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 end if g.getheight() > 0 then gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 end local ncells = {} -- list of neighboring live cells local oldcells = {} -- cells under moved object local object = {} -- cells in moving object local object1 = {} -- cells in initial object -------------------------------------------------------------------------------- local function showhelp() g.note([[ Alt-clicking on an object allows you to COPY it to another location (the original object is not deleted). While dragging the object the following keys can be used: x - flip object left-right y - flip object top-bottom > - rotate object clockwise < - rotate object anticlockwise escape - abort and restore the object]]) end -------------------------------------------------------------------------------- local function getstate(x, y) -- first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr) then return 0 end if g.getheight() > 0 and (y < gridt or y > gridb) then return 0 end return g.getcell(x, y) end -------------------------------------------------------------------------------- local function findlivecell(x, y) if g.getcell(x, y) > 0 then return {x, y} end -- spiral outwards from x,y looking for a nearby live cell; -- the smaller the scale the smaller the area searched local maxd = 10 local mag = g.getmag() if mag > 0 then -- mag can be 1..5 (ie. scales 1:2 to 1:32) maxd = 2 * (6 - mag) -- 10, 8, 6, 4, 2 end local d = 1 while d <= maxd do x = x - 1 y = y - 1 for i = 1, 2*d do x = x + 1 -- move east if getstate(x, y) > 0 then return {x, y} end end for i = 1, 2*d do y = y + 1 -- move south if getstate(x, y) > 0 then return {x, y} end end for i = 1, 2*d do x = x - 1 -- move west if getstate(x, y) > 0 then return {x, y} end end for i = 1, 2*d do y = y - 1 -- move north if getstate(x, y) > 0 then return {x, y} end end d = d + 1 end return {} -- failed to find a live cell end -------------------------------------------------------------------------------- local function checkneighbor(x, y) -- first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr) then return end if g.getheight() > 0 and (y < gridt or y > gridb) then return end if g.getcell(x, y) == 0 then return end ncells[#ncells + 1] = {x, y, g.getcell(x,y)} g.setcell(x, y, 0) end -------------------------------------------------------------------------------- local function getobject(x, y) local object = {} ncells[#ncells + 1] = {x, y, g.getcell(x,y)} g.setcell(x, y, 0) while #ncells > 0 do -- remove cell from end of ncells and append to object local x, y, s = table.unpack( table.remove(ncells) ) object[#object + 1] = x object[#object + 1] = y object[#object + 1] = s -- add any live neighbors to ncells checkneighbor(x , y+1) checkneighbor(x , y-1) checkneighbor(x+1, y ) checkneighbor(x-1, y ) checkneighbor(x+1, y+1) checkneighbor(x+1, y-1) checkneighbor(x-1, y+1) checkneighbor(x-1, y-1) end -- append padding int if necessary if #object > 0 and (#object & 1) == 0 then object[#object + 1] = 0 end g.putcells(object) return object end -------------------------------------------------------------------------------- local function underneath(object) -- return array of live cells underneath given object (a multi-state array) local cells = {} local objlen = #object if objlen % 3 == 1 then objlen = objlen - 1 end -- ignore padding int local i = 1 while i <= objlen do local x = object[i] local y = object[i+1] local s = g.getcell(x, y) if s > 0 then cells[#cells + 1] = x cells[#cells + 1] = y cells[#cells + 1] = s end i = i + 3 end -- append padding int if necessary if #cells > 0 and (#cells & 1) == 0 then cells[#cells + 1] = 0 end return cells end -------------------------------------------------------------------------------- local function rectingrid(r) -- return true if all of given rectangle is inside grid if g.getwidth() > 0 and (r[1] < gridl or r[1] + r[3] - 1 > gridr) then return false end if g.getheight() > 0 and (r[2] < gridt or r[2] + r[4] - 1 > gridb) then return false end return true end -------------------------------------------------------------------------------- local function lookforkeys(event) -- look for keys used to flip/rotate object if event == "key x none" or event == "key y none" then -- flip floating object left-right or top-bottom g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") -- erase object if #oldcells > 0 then g.putcells(oldcells) end local obox = getminbox(object) if event == "key x none" then -- translate object so that bounding box doesn't change local xshift = 2 * (obox.left + int(obox.wd/2)) if obox.wd % 2 == 0 then xshift = xshift - 1 end object = g.transform(object, xshift, 0, -1, 0, 0, 1) else -- translate object so that bounding box doesn't change local yshift = 2 * (obox.top + int(obox.ht/2)) if obox.ht % 2 == 0 then yshift = yshift - 1 end object = g.transform(object, 0, yshift, 1, 0, 0, -1) end oldcells = underneath(object) g.putcells(object) g.update() return end if event == "key > none" or event == "key < none" then -- rotate floating object clockwise or anticlockwise -- about the center of the object's bounding box local obox = getminbox(object) local midx = obox.left + int(obox.wd/2) local midy = obox.top + int(obox.ht/2) local newleft = midx + obox.top - midy local newtop = midy + obox.left - midx local rotrect = { newleft, newtop, obox.ht, obox.wd } if not rectingrid(rotrect) then g.show("Rotation is not allowed if object would be outside grid.") return end g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") -- erase object if #oldcells > 0 then g.putcells(oldcells) end if event == "key > none" then -- rotate clockwise object = g.transform(object, 0, 0, 0, -1, 1, 0) else -- rotate anticlockwise object = g.transform(object, 0, 0, 0, 1, -1, 0) end -- shift rotated object to same position as rotrect obox = getminbox(object) object = g.transform(object, newleft - obox.left, newtop - obox.top) oldcells = underneath(object) g.putcells(object) g.update() return end if event == "key h none" then -- best not to show Help window while dragging object! return end g.doevent(event) end -------------------------------------------------------------------------------- function moveobject() local oldmouse, mousepos, prevx, prevy -- wait for click in or near a live cell while true do local event = g.getevent() if event:find("^click") then -- event is a string like "click 10 20 left none" local evt, xstr, ystr, butt, mods = split(event) local result = findlivecell(tonumber(xstr), tonumber(ystr)) if #result > 0 then prevx = tonumber(xstr) prevy = tonumber(ystr) oldmouse = xstr .. ' ' .. ystr g.show("Extracting object...") local x, y = table.unpack(result) object = getobject(x, y) object1 = g.join({},object) -- save in case user aborts script if mods == "alt" then -- don't delete object oldcells = g.join({},object) end break else g.warn("Click on or near a live cell belonging to the desired object.") end elseif event == "key h none" then showhelp() else g.doevent(event) end end -- wait for mouse-up while moving object g.show("Move mouse and release button...") local mousedown = true while mousedown do local event = g.getevent() if event:find("^mup") then mousedown = false elseif #event > 0 then lookforkeys(event) end mousepos = g.getxy() if #mousepos > 0 and mousepos ~= oldmouse then -- mouse has moved, so move object g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") -- erase object if #oldcells > 0 then g.putcells(oldcells) end local xstr, ystr = split(mousepos) local x = tonumber(xstr) local y = tonumber(ystr) if g.getwidth() > 0 then -- ensure object doesn't move beyond left/right edge of grid local obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.left < gridl then x = x + gridl - obox.left elseif obox.right > gridr then x = x - (obox.right - gridr) end end if g.getheight() > 0 then -- ensure object doesn't move beyond top/bottom edge of grid local obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.top < gridt then y = y + gridt - obox.top elseif obox.bottom > gridb then y = y - (obox.bottom - gridb) end end object = g.transform(object, x - prevx, y - prevy) oldcells = underneath(object) g.putcells(object) prevx = x prevy = y oldmouse = mousepos g.update() end end end -------------------------------------------------------------------------------- if #g.getrect() == 0 then g.exit("There are no objects.") end g.show("Click on or near a live cell, move mouse and release button... (hit 'h' for help)") local oldcursor = g.getcursor() g.setcursor("Move") local aborted = true local status, err = xpcall(function () moveobject() aborted = false end, gp.trace) if err then g.continue(err) end g.setcursor(oldcursor) if aborted then -- erase object if it moved if #object > 0 then g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") end if #oldcells > 0 then g.putcells(oldcells) end if #object1 > 0 then g.putcells(object1) end else g.show(" ") end golly-3.3-src/Scripts/Lua/oplus/0000755000175000017500000000000013543257426013620 500000000000000golly-3.3-src/Scripts/Lua/oplus/init.lua~0000755000175000017500000004470512774571122015416 00000000000000-- This module is loaded if a script calls require "oplus". -- It provides a high-level interface to the overlay commands. local g = golly() -- require "gplus.strict" local gp = require "gplus" local int = gp.int local rect = gp.rect local ov = g.overlay local m = {} -------------------------------------------------------------------------------- local button_tables = {} -- for detecting click in a button local checkbox_tables = {} -- for detecting click in a check box local slider_tables = {} -- for detecting click in a slider -- some adjustable parameters: local buttonht = 24 -- height of buttons (also used for check boxes and sliders) local sliderwd = 16 -- width of slider button (keep even) local halfslider = int(sliderwd/2) local labelgap = 5 -- gap between check box button and its label local textgap = 10 -- gap between edge of button and label local normalbutton = "rgba 40 128 255 " -- light blue buttons (alpha is appended) local darkerbutton = "rgba 20 64 255 " -- darker blue when buttons are clicked local textrgba = "rgba 255 255 255 255" -- white button labels and tick mark on check box local labelfont = "font 12 default-bold" -- font for labels local yoffset = -1 -- for better y position of labels if g.os() == "Linux" then yoffset = 0 labelfont = "font 12 default" end local darken_button = false -- tell draw_button to use darkerbutton local darken_slider = false -- tell draw_slider to darken the slider button -------------------------------------------------------------------------------- -- synonyms for some common overlay commands: -- opaque colors m.white = "rgba 255 255 255 255" m.black = "rgba 0 0 0 255" m.red = "rgba 255 0 0 255" m.green = "rgba 0 255 0 255" m.blue = "rgba 0 0 255 255" m.cyan = "rgba 0 255 255 255" m.magenta = "rgba 255 0 255 255" m.yellow = "rgba 255 255 0 255" -- affine transformations m.identity = "transform 1 0 0 1" m.flip = "transform -1 0 0 -1" m.flip_x = "transform -1 0 0 1" m.flip_y = "transform 1 0 0 -1" m.swap_xy = "transform 0 1 1 0" m.swap_xy_flip = "transform 0 -1 -1 0" m.rcw = "transform 0 -1 1 0" m.rccw = "transform 0 1 -1 0" m.racw = m.rccw m.r180 = m.flip -------------------------------------------------------------------------------- local function draw_button(x, y, w, h) local oldblend = ov("blend 0") local buttrect = " "..x.." "..y.." "..w.." "..h -- copy rect under button to temp_bg ov("copy"..buttrect.." temp_bg") -- clear rect under button local oldrgba = ov("rgba 0 0 0 0") ov("fill"..buttrect) local buttonrgb = normalbutton if darken_button then buttonrgb = darkerbutton end -- draw button with rounded corners ov(buttonrgb.."255") -- opaque ov("fill"..buttrect) -- draw one rounded corner then copy and paste with flips to draw the rest ov("rgba 0 0 0 0") ov("set "..x.." "..y) ov(buttonrgb.."48") ov("set "..(x+1).." "..y) ov("set "..x.." "..(y+1)) ov(buttonrgb.."128") ov("set "..(x+2).." "..y) ov("set "..x.." "..(y+2)) ov(buttonrgb.."200") ov("set "..(x+1).." "..(y+1)) ov("copy "..x.." "..y.." 3 3 temp_corner") ov(m.flip_x) ov("paste "..(x+w-1).." "..y.." temp_corner") ov(m.flip_y) ov("paste "..x.." "..(y+h-1).." temp_corner") ov(m.flip) ov("paste "..(x+w-1).." "..(y+h-1).." temp_corner") ov(m.identity) -- copy rect to temp_button ov("copy"..buttrect.." temp_button") -- paste temp_bg back to rect ov("paste "..x.." "..y.." ".." temp_bg") -- turn on blending and paste temp_button ov("blend 1") ov("paste "..x.." "..y.." ".." temp_button") ov("rgba "..oldrgba) ov("blend "..oldblend) end -------------------------------------------------------------------------------- function m.button(label, onclick) -- return a table that makes it easier to create and use buttons local b = {} if type(label) ~= "string" then error("1st arg of button must be a string", 2) end if type(onclick) ~= "function" then error("2nd arg of button must be a function", 2) end -- create text for label with a unique clip name b.clipname = tostring(b).."+button" b.clipname = string.gsub(b.clipname, " ", "") -- remove any spaces local oldrgba = ov(textrgba) local oldfont = ov(labelfont) local w, h = gp.split(ov("text "..b.clipname.." "..label)) ov("font "..oldfont) ov("rgba "..oldrgba) -- use label size to set button size b.labelwd = tonumber(w); b.labelht = tonumber(h); b.wd = b.labelwd + 2*textgap; b.ht = buttonht; b.onclick = onclick -- remember click handler b.shown = false -- b.show hasn't been called b.show = function (x, y) b.x = x b.y = y if b.shown then -- remove old button in case it is moving to new position b.hide() end -- remember position and save background pixels b.background = b.clipname.."+bg" ov("copy "..b.x.." "..b.y.." "..b.wd.." "..b.ht.." "..b.background) -- draw the button at the given location draw_button(x, y, b.wd, b.ht) -- draw the label local oldblend = ov("blend 1") ov("paste "..(x+textgap).." "..int(y+yoffset+(b.ht-b.labelht)/2).." "..b.clipname) ov("blend "..oldblend) -- store this table using the button's rectangle as key b.rect = rect({b.x, b.y, b.wd, b.ht}) button_tables[b.rect] = b b.shown = true end b.hide = function () if b.shown then -- restore background pixels saved in b.show local oldblend = ov("blend 0") ov("paste "..b.x.." "..b.y.." "..b.background) ov("blend "..oldblend) -- remove the table entry button_tables[b.rect] = nil b.shown = false end end b.refresh = function () -- redraw button b.show(b.x, b.y) g.update() end return b end -------------------------------------------------------------------------------- local function draw_checkbox(x, y, w, h, ticked) draw_button(x, y, w, h) if ticked then -- draw a tick mark (needs improvement!!!) local oldrgba = ov(textrgba) ov("line "..int(x+w/2).." "..(y+h-5).." "..(x+6).." "..(y+h-8)) ov("line "..int(x+w/2).." "..(y+h-5).." "..(x+w-6).." "..(y+5)) ov("rgba 255 255 255 128") local oldblend = ov("blend 1") ov("line "..int(x+w/2).." "..(y+h-6).." "..(x+6).." "..(y+h-9)) ov("line "..int(x+w/2).." "..(y+h-6).." "..(x+6).." "..(y+h-10)) ov("line "..int(x+w/2-1).." "..(y+h-5).." "..(x+w-7).." "..(y+5)) ov("line "..int(x+w/2+1).." "..(y+h-6).." "..(x+w-5).." "..(y+5)) ov("rgba "..oldrgba) ov("blend "..oldblend) end end -------------------------------------------------------------------------------- function m.checkbox(label, labelrgba, onclick) -- return a table that makes it easier to create and use check boxes local c = {} if type(label) ~= "string" then error("1st arg of checkbox must be a string", 2) end if type(labelrgba) ~= "string" then error("2nd arg of checkbox must be a string", 2) end if type(onclick) ~= "function" then error("3rd arg of checkbox must be a function", 2) end -- create text for label with a unique clip name c.clipname = tostring(c).."+checkbox" c.clipname = string.gsub(c.clipname, " ", "") -- remove any spaces local oldrgba = ov(labelrgba) local oldfont = ov(labelfont) local w, h = gp.split(ov("text "..c.clipname.." "..label)) ov("font "..oldfont) ov("rgba "..oldrgba) -- use label size to set check box size c.labelwd = tonumber(w); c.labelht = tonumber(h); c.wd = buttonht + labelgap + c.labelwd; c.ht = buttonht; c.onclick = onclick -- remember click handler c.shown = false -- c.show hasn't been called c.show = function (x, y, ticked) c.x = x c.y = y c.ticked = ticked if c.shown then -- remove old check box in case it is moving to new position c.hide() end -- remember position and save background pixels c.background = c.clipname.."+bg" ov("copy "..c.x.." "..c.y.." "..c.wd.." "..c.ht.." "..c.background) -- draw the check box (excluding label) at the given location draw_checkbox(x+1, y+1, c.ht-2, c.ht-2, ticked) -- draw the label local oldblend = ov("blend 1") ov("paste "..(x+c.ht+labelgap).." "..int(y+yoffset+(c.ht-c.labelht)/2).." "..c.clipname) ov("blend "..oldblend) -- store this table using the check box's rectangle as key c.rect = rect({c.x, c.y, c.wd, c.ht}) checkbox_tables[c.rect] = c c.shown = true end c.hide = function () if c.shown then -- restore background pixels saved in c.show local oldblend = ov("blend 0") ov("paste "..c.x.." "..c.y.." "..c.background) ov("blend "..oldblend) -- remove the table entry checkbox_tables[c.rect] = nil c.shown = false end end c.refresh = function () -- redraw checkbox c.show(c.x, c.y, c.ticked) g.update() end return c end -------------------------------------------------------------------------------- local function draw_slider(s, barpos) local x = s.startbar local y = s.y local w = s.barwidth local h = s.ht -- draw horizontal bar local oldrgba = ov("rgba 100 100 100 255") local midy = int(y+h/2) ov("fill "..x.." "..(midy-3).." "..w.." 6") ov("rgba 110 110 110 255") ov("fill "..(x+1).." "..(midy-2).." "..(w-2).." 1") ov("rgba 120 120 120 255") ov("fill "..(x+1).." "..(midy-1).." "..(w-2).." 1") ov("rgba 130 130 130 255") ov("fill "..(x+1).." "..midy.." "..(w-2).." 1") ov("rgba 140 140 140 255") ov("fill "..(x+1).." "..(midy+1).." "..(w-2).." 1") if darken_slider then darken_button = true end -- draw slider button on top of horizontal bar draw_button(x + barpos - halfslider, y, sliderwd, h) ov("rgba "..oldrgba) if darken_slider then darken_button = false end -- draw the label local oldblend = ov("blend 1") ov("paste "..s.x.." "..int(y+yoffset+(h-s.labelht)/2).." "..s.clipname) ov("blend "..oldblend) end -------------------------------------------------------------------------------- function m.slider(label, labelrgba, barwidth, minval, maxval, onclick) -- return a table that makes it easier to create and use sliders local s = {} if type(label) ~= "string" then error("1st arg of slider must be a string", 2) end if type(labelrgba) ~= "string" then error("2nd arg of slider must be a string", 2) end if type(onclick) ~= "function" then error("6th arg of slider must be a function", 2) end if barwidth <= 0 then error("slider width must be > 0", 2) end if minval >= maxval then error("minimum slider value must be < maximum value", 2) end s.barwidth = barwidth -- width of the slider bar s.minval = minval s.maxval = maxval -- create text for label with a unique clip name s.clipname = tostring(s).."+slider" s.clipname = string.gsub(s.clipname, " ", "") -- remove any spaces local oldrgba = ov(labelrgba) local oldfont = ov(labelfont) local w, h = gp.split(ov("text "..s.clipname.." "..label)) ov("font "..oldfont) ov("rgba "..oldrgba) -- set total slider size (including label) s.labelwd = tonumber(w); s.labelht = tonumber(h); s.wd = s.labelwd + sliderwd + s.barwidth; s.ht = buttonht; s.onclick = onclick -- remember click handler s.shown = false -- s.show hasn't been called s.show = function (x, y, pos) s.pos = int(pos) if s.pos < s.minval then s.pos = s.minval end if s.pos > s.maxval then s.pos = s.maxval end if s.shown then -- remove old slider in case it is moving to new position s.hide() end -- remember slider location and save background pixels s.x = x s.y = y s.background = s.clipname.."+bg" ov("copy "..s.x.." "..s.y.." "..s.wd.." "..s.ht.." "..s.background) -- draw the slider and label at the given location s.startbar = x + s.labelwd + halfslider local barpos = int(s.barwidth * (s.pos - s.minval) / (s.maxval - s.minval)) draw_slider(s, barpos) -- store this table using the slider button's rectangle as key s.rect = rect({s.startbar+barpos-halfslider, s.y, sliderwd, s.ht}) slider_tables[s.rect] = s s.shown = true end s.hide = function () if s.shown then -- restore background pixels saved in previous s.show local oldblend = ov("blend 0") ov("paste "..s.x.." "..s.y.." "..s.background) ov("blend "..oldblend) -- remove the table entry slider_tables[s.rect] = nil s.shown = false end end s.refresh = function () -- redraw slider s.show(s.x, s.y, s.pos) g.update() end return s end -------------------------------------------------------------------------------- local function release_in_rect(r, t) -- return true if mouse button is released while in given rect local inrect = true -- draw darkened button darken_button = true t.refresh() while true do local event = g.getevent() if event:find("^mup left") then break end local xy = ov("xy") local wasinrect = inrect if #xy == 0 then inrect = false -- mouse is outside overlay else local x, y = gp.split(xy) x = tonumber(x) y = tonumber(y) inrect = x >= r.left and x <= r.right and y >= r.top and y <= r.bottom end if inrect ~= wasinrect then -- mouse has moved in/out of r darken_button = inrect t.refresh() end end if inrect then -- undarken button darken_button = false t.refresh() end return inrect end -------------------------------------------------------------------------------- local function click_in_button(x, y) for r, button in pairs(button_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then if release_in_rect(r, button) then -- call this button's handler button.onclick() end return true end end return false end -------------------------------------------------------------------------------- local function click_in_checkbox(x, y) for r, checkbox in pairs(checkbox_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then if release_in_rect(r, checkbox) then checkbox.show(checkbox.x, checkbox.y, not checkbox.ticked) -- call this checkbox's handler checkbox.onclick() end return true end end return false end -------------------------------------------------------------------------------- local function click_in_slider(x, y) for r, slider in pairs(slider_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then -- draw darkened slider button darken_slider = true slider.show(slider.x, slider.y, slider.pos) g.update() local prevx = x local range = slider.maxval - slider.minval local maxx = slider.startbar + slider.barwidth -- track horizontal movement of mouse until button is released while true do local event = g.getevent() if event:find("^mup left") then break end local xy = ov("xy") if #xy > 0 then local x, _ = gp.split(xy) -- check if slider position needs to change x = tonumber(x) if x < slider.startbar then x = slider.startbar end if x > maxx then x = maxx end if x ~= prevx then -- draw new position of slider button immediately; -- first restore background pixels saved in previous slider.show local oldblend = ov("blend 0") ov("paste "..slider.x.." "..slider.y.." "..slider.background) ov("blend "..oldblend) draw_slider(slider, x - slider.startbar) g.update() -- now check if slider value has to change local newpos = int(slider.minval + range * (x - slider.startbar) / slider.barwidth) if newpos < slider.minval then newpos = slider.minval end if newpos > slider.maxval then newpos = slider.maxval end if slider.pos ~= newpos then slider.pos = newpos -- call this slider's handler slider.onclick(newpos) end prevx = x end end end -- undarken slider button darken_slider = false slider.show(slider.x, slider.y, slider.pos) g.update() return true end end return false end -------------------------------------------------------------------------------- function m.process(event) if #event > 0 then if event:find("^oclick") then local _, x, y, butt, mods = gp.split(event) if butt == "left" and mods == "none" then if click_in_button(tonumber(x), tonumber(y)) then return "" end if click_in_checkbox(tonumber(x), tonumber(y)) then return "" end if click_in_slider(tonumber(x), tonumber(y)) then return "" end end end end return event end -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/oplus/init.lua0000755000175000017500000016406213543255652015221 00000000000000-- This module is loaded if a script calls require "oplus". -- It provides a high-level interface to the overlay commands. local g = golly() -- require "gplus.strict" local ov = g.overlay local ovt = g.ovtable local gp = require "gplus" local int = gp.int local rect = gp.rect local split = gp.split local m = {} -------------------------------------------------------------------------------- -- synonyms for some common overlay commands: -- opaque colors m.white = "rgba 255 255 255 255" m.gray = "rgba 128 128 128 255" m.black = "rgba 0 0 0 255" m.red = "rgba 255 0 0 255" m.green = "rgba 0 255 0 255" m.blue = "rgba 0 0 255 255" m.cyan = "rgba 0 255 255 255" m.magenta = "rgba 255 0 255 255" m.yellow = "rgba 255 255 0 255" -- opaque colors for ovtable command m.twhite = {"rgba", 255, 255, 255, 255} m.tgray = {"rgba", 128, 128, 128, 255} m.tblack = {"rgba", 0, 0, 0, 255} m.tred = {"rgba", 255, 0, 0, 255} m.tgreen = {"rgba", 0, 255, 0, 255} m.tblue = {"rgba", 0, 0, 255, 255} m.tcyan = {"rgba", 0, 255, 255, 255} m.tmagenta = {"rgba", 255, 0, 255, 255} m.tyellow = {"rgba", 255, 255, 0, 255} -- affine transformations m.identity = "transform 1 0 0 1" m.flip = "transform -1 0 0 -1" m.flip_x = "transform -1 0 0 1" m.flip_y = "transform 1 0 0 -1" m.swap_xy = "transform 0 1 1 0" m.swap_xy_flip = "transform 0 -1 -1 0" m.rcw = "transform 0 -1 1 0" m.rccw = "transform 0 1 -1 0" m.racw = m.rccw m.r180 = m.flip -- themes m.theme0 = "theme 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0" m.theme1 = "theme 0 255 255 255 255 255 0 0 255 0 0 47 0 0 0" m.theme2 = "theme 255 144 0 255 255 0 160 0 0 32 0 0 0 0 0" m.theme3 = "theme 0 255 255 255 255 255 0 128 0 0 24 0 0 0 0" m.theme4 = "theme 255 255 0 255 255 255 128 0 128 0 47 0 0 32 128" m.theme5 = "theme 176 176 176 255 255 255 104 104 104 16 16 16 0 0 0" m.theme6 = "theme 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255" m.theme7 = "theme 0 0 255 0 0 0 0 255 255 240 240 240 255 255 255" m.theme8 = "theme 240 240 240 240 240 240 240 240 240 240 240 240 0 0 0" m.theme9 = "theme 240 240 240 240 240 240 160 0 0 160 0 0 0 0 0" m.themes = { [-1] = "theme -1", [0] = m.theme0, [1] = m.theme1, [2] = m.theme2, [3] = m.theme3, [4] = m.theme4, [5] = m.theme5, [6] = m.theme6, [7] = m.theme7, [8] = m.theme8, [9] = m.theme9 } -------------------------------------------------------------------------------- -- scripts can adjust these parameters: -- check boxes and radio buttons are collectively known as select buttons m.buttonht = 24 -- height of buttons (also used for select buttons and sliders) m.sliderwd = 16 -- width of slider button (best if even) m.selectgap = 5 -- gap between select button and its label m.textgap = 10 -- gap between edge of button and its label m.radius = 3 -- curvature of button corners m.border = 0 -- thickness of button border (no border if 0) m.buttonrgba = "rgba 40 128 255 255" -- light blue buttons m.darkerrgba = "rgba 20 64 255 255" -- darker blue when buttons are clicked m.borderrgba = m.white -- white border around buttons (if m.border > 0) m.textrgba = m.white -- white button labels, marks on select buttons m.distext = "rgba 100 192 255 255" -- lighter blue for disabled button labels and marks on select buttons m.textfont = "font 12 default-bold" -- font for labels m.textshadowx = 0 -- label shadow x offset m.textshadowy = 0 -- label shadow y offset m.textshadowrgba = m.black -- black label shadow color m.buttonshadowx = 0 -- button shadow x offset m.buttonshadowy = 0 -- button shadow y offset m.buttonshadowrgba = m.black -- black button shadow color m.yoffset = 0 -- for better y position of labels m.menubg = "rgba 40 128 255 255" -- light blue background for menu bar and items m.selcolor = "rgba 20 64 255 255" -- darker background for selected menu/item m.discolor = "rgba 100 192 255 255" -- lighter blue for disabled items and separator lines m.menufont = "font 12 default-bold" -- font for menu and item labels m.menutext = m.white -- white text for menu and item labels m.menugap = 10 -- horizontal space around each menu label m.itemgap = 2 -- vertical space above and below item labels if g.os() == "Windows" then m.yoffset = -1 end if g.os() == "Linux" then m.textfont = "font 12 default" m.menufont = "font 12 default" end -------------------------------------------------------------------------------- local darken_button = false -- tell draw_button to use m.darkerrgba local darken_slider = false -- tell draw_slider to darken the slider button local button_tables = {} -- for detecting click in a button local selectbutton_tables = {} -- for detecting click in a select button local slider_tables = {} -- for detecting click in a slider local menubar_tables = {} -- for detecting click in a menu bar local selmenu = 0 -- index of selected menu (if > 0) local selitem = 0 -- index of selected item in selmenu (if > 0) local textclip = "textclip" -- default clip name for m.maketext and m.pastetext local item_normal = 1 -- normal menu item local item_tick = 2 -- tick (multi-select) menu item local item_radio = 3 -- radio (single-select) menu item -------------------------------------------------------------------------------- function m.pastetext(x, y, transform, clipname) -- set optional parameter defaults transform = transform or m.identity clipname = clipname or textclip -- apply transform and paste text clip local oldtransform = ov(transform) ovt{"paste", x, y, clipname} -- restore settings ov("transform "..oldtransform) return clipname end -------------------------------------------------------------------------------- function m.maketext(s, clipname, textcol, shadowx, shadowy, shadowcol) local oldrgba = ov(m.white) -- set optional parameter defaults clipname = clipname or textclip textcol = textcol or "rgba "..oldrgba shadowx = shadowx or 0 shadowy = shadowy or 0 shadowcol = shadowcol or m.black local w, h, d -- check if shadow required if shadowx == 0 and shadowy == 0 then ov(textcol) w, h, d = split(ov("text "..clipname.." "..s)) else -- build shadow clip ov(shadowcol) local oldbg = ov("textoption background 0 0 0 0") local oldblend if oldbg == "0 0 0 0" then oldblend = ov("blend 1") else oldblend = ov("blend 0") ov("textoption background "..oldbg) end local tempclip = clipname.."_temp" w, h, d = split(ov("text "..tempclip.." "..s)) -- compute paste location based on shadow offset local tx = 0 local ty = 0 local sx = 0 local sy = 0 if shadowx < 0 then tx = -shadowx else sx = shadowx end if shadowy < 0 then ty = -shadowy else sy = shadowy end -- size result clip to fit text and shadow w = tonumber(w) + math.abs(shadowx) h = tonumber(h) + math.abs(shadowy) ov("create ".." "..w.." "..h.." "..clipname) -- paste shadow onto result local oldtarget = ov("target "..clipname) if oldbg ~= "0 0 0 0" then ov("rgba "..oldbg) ovt{"fill"} end m.pastetext(sx, sy, nil, tempclip) -- build normal text clip ov(textcol) if oldbg ~= "0 0 0 0" then ov("textoption background 0 0 0 0") ov("blend 1") end ov("text "..tempclip.." "..s) -- paste normal onto result m.pastetext(tx, ty, nil, tempclip) -- restore settings ov("textoption background "..oldbg) ov("delete "..tempclip) ov("target "..oldtarget) ov("blend "..oldblend) end -- add index ov("optimize "..clipname) -- restore color ov("rgba "..oldrgba) return tonumber(w), tonumber(h), tonumber(d) end -------------------------------------------------------------------------------- function m.fill_ellipse(x, y, w, h, borderwd, fillrgba) -- draw an ellipse with the given border width (if > 0) using the current color -- and fill it with the given color (if fillrgba isn't "") if borderwd == 0 then if #fillrgba > 0 then -- just draw solid anti-aliased ellipse using fillrgba local oldwidth = ov("lineoption width "..int(math.min(w,h)/2 + 0.5)) local oldblend = ov("blend 1") local oldrgba = ov(fillrgba) ov("ellipse "..x.." "..y.." "..w.." "..h) ov("rgba "..oldrgba) ov("blend "..oldblend) ov("lineoption width "..oldwidth) end return end if w <= borderwd*2 or h <= borderwd*2 then -- no room to fill so just draw anti-aliased ellipse using current color local oldwidth = ov("lineoption width "..int(math.min(w,h)/2 + 0.5)) local oldblend = ov("blend 1") ov("ellipse "..x.." "..y.." "..w.." "..h) ov("blend "..oldblend) ov("lineoption width "..oldwidth) return end local oldblend = ov("blend 1") if #fillrgba > 0 then -- draw smaller filled ellipse using fillrgba local oldrgba = ov(fillrgba) local smallw = w - borderwd*2 local smallh = h - borderwd*2 local oldwidth = ov("lineoption width "..int(math.min(smallw,smallh)/2 + 0.5)) ov("ellipse "..(x+borderwd).." "..(y+borderwd).." "..smallw.." "..smallh) ov("rgba "..oldrgba) ov("lineoption width "..oldwidth) end -- draw outer ellipse using given borderwd local oldwidth = ov("lineoption width "..borderwd) ov("ellipse "..x.." "..y.." "..w.." "..h) -- restore line width and blend state ov("lineoption width "..oldwidth) ov("blend "..oldblend) end -------------------------------------------------------------------------------- function m.draw_line(x1, y1, x2, y2) ovt{"line", x1, y1, x2, y2} end -------------------------------------------------------------------------------- function m.fill_rect(x, y, wd, ht) ovt{"fill", x, y, wd, ht} end -------------------------------------------------------------------------------- function m.round_rect(x, y, w, h, radius, borderwd, fillrgba) -- draw a rounded rectangle using the given radius for the corners -- with a border in the current color using the given width (if > 0) -- and filled with the given color (if fillrgba isn't "") if radius == 0 then -- draw a non-rounded rectangle (possibly translucent) local oldblend = ov("blend 1") if borderwd > 0 then -- draw border lines using current color ovt{"fill", x, y, w, borderwd} ovt{"fill", x, (y+h-borderwd), w, borderwd} ovt{"fill", x, (y+borderwd), borderwd, (h-borderwd*2)} ovt{"fill", (x+w-borderwd), (y+borderwd), borderwd, (h-borderwd*2)} end if #fillrgba > 0 then -- draw interior of rectangle local oldrgba = ov(fillrgba) ovt{"fill", (x+borderwd), (y+borderwd), (w-borderwd*2), (h-borderwd*2)} ov("rgba "..oldrgba) end ov("blend "..oldblend) return end if radius > w/2 then radius = int(w/2) end if radius > h/2 then radius = int(h/2) end -- construct rounded rectangle in top left corner of overlay ov("copy 0 0 "..w.." "..h.." rectbg") local oldrgba = ov("rgba 0 0 0 0") local oldblend = ov("blend 0") ovt{"fill", 0, 0, w, h} ov("rgba "..oldrgba) -- create bottom right quarter circle in top left corner of overlay m.fill_ellipse(-radius, -radius, radius*2, radius*2, borderwd, fillrgba) ov("copy 0 0 "..radius.." "..radius.." qcircle") -- draw corners ovt{"paste", (w-radius), (h-radius), "qcircle"} ov(m.flip_y) ovt{"paste", (w-radius), (radius-1), "qcircle"} ov(m.flip_x) ovt{"paste", (radius-1), (h-radius), "qcircle"} ov(m.flip) ovt{"paste", (radius-1), (radius-1), "qcircle"} ov(m.identity) ov("delete qcircle") if #fillrgba > 0 then -- draw non-corner portions of rectangle ov(fillrgba) if radius < w/2 then ovt{"fill", radius, 0, (w-radius*2), h} end if radius < h/2 then ovt{"fill", 0, radius, radius, (h-radius*2)} ovt{"fill", (w-radius), radius, radius, (h-radius*2)} end ov("rgba "..oldrgba) end if borderwd > 0 then -- draw border lines using current color if radius < w/2 then ovt{"fill", radius, 0, (w-radius*2), borderwd} ovt{"fill", radius, (h-borderwd), (w-radius*2), borderwd} end if radius < h/2 then ovt{"fill", 0, radius, borderwd, (h-radius*2)} ovt{"fill", (w-borderwd), radius, borderwd, (h-radius*2)} end end -- save finished rectangle in a clip ov("copy 0 0 "..w.." "..h.." roundedrect") -- restore top left corner of overlay and draw rounded rectangle ovt{"paste", 0, 0, "rectbg"} ov("delete rectbg") ov("blend 1") ovt{"paste", x, y, "roundedrect"} ov("delete roundedrect") -- restore blend setting ov("blend "..oldblend) end -------------------------------------------------------------------------------- local function draw_buttonlayer(x, y, w, h, color) local oldblend = ov("blend 0") local buttrect = " "..x.." "..y.." "..w.." "..h -- copy rect under button to temp_bg ov("copy"..buttrect.." temp_bg") -- clear rect under button local oldrgba = ov("rgba 0 0 0 0") ovt{"fill", x, y, w, h} -- draw button with rounded corners if m.border > 0 then ov(m.borderrgba) end m.round_rect(x, y, w, h, m.radius, m.border, color) -- copy rect to temp_button ov("copy"..buttrect.." temp_button") -- paste temp_bg back to rect ovt{"paste", x, y, "temp_bg"} -- turn on blending and paste temp_button ov("blend 1") ovt{"paste", x, y, "temp_button"} ov("rgba "..oldrgba) ov("blend "..oldblend) end -------------------------------------------------------------------------------- local function draw_button(x, y, w, h, color, darkcolor) if m.buttonshadowx ~= 0 or m.buttonshadowy ~= 0 then draw_buttonlayer(x + m.buttonshadowx, y + m.buttonshadowy, w, h, m.buttonshadowrgba) end local butt_rgba = color or m.buttonrgba if darken_button then butt_rgba = darkcolor or m.darkerrgba end draw_buttonlayer(x, y, w, h, butt_rgba) end -------------------------------------------------------------------------------- function m.button(label, onclick) -- return a table that makes it easy to create and use buttons local b = {} if type(label) ~= "string" then error("1st arg of button must be a string", 2) end if type(onclick) ~= "function" then error("2nd arg of button must be a function", 2) end b.onclick = onclick -- remember click handler b.shown = false -- b.show hasn't been called b.enabled = true b.ht = m.buttonht; b.customcolor = nil b.darkcustomcolor = nil b.setlabel = function (newlabel, changesize) local oldfont = ov(m.textfont) local oldtextbg = ov("textoption background 0 0 0 0") local w, h if b.enabled then w, h = m.maketext(newlabel, b.labelclip, m.textrgba, m.textshadowx, m.textshadowy, m.textshadowrgba) else w, h = m.maketext(newlabel, b.labelclip, m.distext) -- no shadow if disabled end ov("textoption background "..oldtextbg) ov("font "..oldfont) b.labelwd = tonumber(w); b.labelht = tonumber(h); if changesize then -- use label size to set button width b.wd = b.labelwd + 2*m.textgap; end b.savetextrgba = m.textrgba b.savetextfont = m.textfont b.savelabel = newlabel end -- create text for label with a unique clip name b.labelclip = tostring(b).."+button" b.labelclip = string.gsub(b.labelclip, " ", "") -- remove any spaces b.setlabel(label, true) b.show = function (x, y) b.x = x b.y = y if b.shown then -- remove old button from button_tables b.hide() end -- remember position and save background pixels b.background = b.labelclip.."+bg" ov("copy "..b.x.." "..b.y.." "..b.wd.." "..b.ht.." "..b.background) -- draw the button at the given location draw_button(x, y, b.wd, b.ht, b.customcolor, b.darkcustomcolor) -- if m.textrgba or m.textfont has changed then recreate b.labelclip if b.savetextrgba ~= m.textrgba or b.savetextfont ~= m.textfont then b.setlabel(b.savelabel, false) end -- draw the label local oldblend = ov("blend 1") x = int(x + (b.wd - b.labelwd) / 2) y = int(y + m.yoffset + (b.ht - b.labelht) / 2) ovt{"paste", x, y, b.labelclip} ov("blend "..oldblend) -- store this table using the button's rectangle as key b.rect = rect({b.x, b.y, b.wd, b.ht}) button_tables[b.rect] = b b.shown = true end b.hide = function () if b.shown then -- restore background pixels saved in b.show local oldblend = ov("blend 0") ovt{"paste", b.x, b.y, b.background} ov("blend "..oldblend) -- remove the table entry button_tables[b.rect] = nil b.shown = false end end b.enable = function (bool) if b.enabled ~= bool then b.enabled = bool b.setlabel(b.savelabel, false) end end b.refresh = function () -- redraw button b.show(b.x, b.y) g.update() end return b end -------------------------------------------------------------------------------- local function draw_selectbutton(x, y, w, h, ticked, enabled, multi) draw_button(x, y, w, h) if multi then -- draw a radio button local optcol = m.distext if ticked and enabled then optcol = m.textrgba end local x1 = int(x+w/6) local y1 = int(y+w/6) local w1 = w - int(w/3) local h1 = h - int(h/3) if enabled and (m.textshadowx > 0 or m.textshadowy > 0) then m.fill_ellipse(x1+m.textshadowx, y1+m.textshadowy, w1, h1, 0, m.textshadowrgba) end if enabled or ticked then m.fill_ellipse(x1, y1, w1, h1, 0, optcol) end else if ticked then -- draw a tick mark local oldrgba if enabled then oldrgba = ov(m.textrgba) else oldrgba = ov(m.distext) end local oldblend = ov("blend 1") local oldwidth = ov("lineoption width 4") local x1 = int(x+w/2) local y1 = int(y+h*0.75) local x2 = int(x+w*0.75) local y2 = int(y+h*0.25) local x3 = int(x+w/2+1) local y3 = int(y+h*0.75) local x4 = int(x+w*0.25) local y4 = int(y+h*0.6) if enabled and (m.textshadowx > 0 or m.textshadowy > 0) then local oldcol = ov(m.textshadowrgba) ovt{"line", x1+m.textshadowx, y1+m.textshadowy, x2+m.textshadowx, y2+m.textshadowy} ovt{"line", x3+m.textshadowx, y3+m.textshadowy, x4+m.textshadowx, y4+m.textshadowy} ov("rgba "..oldcol) end ovt{"line", x1, y1, x2, y2} ovt{"line", x3, y3, x4, y4} ov("lineoption width "..oldwidth) ov("blend "..oldblend) ov("rgba "..oldrgba) end end end -------------------------------------------------------------------------------- function m.radiobutton(label, labelrgba, onclick) return m.selectbutton(label, labelrgba, onclick, true) end -------------------------------------------------------------------------------- function m.checkbox(label, labelrgba, onclick) return m.selectbutton(label, labelrgba, onclick, false) end -------------------------------------------------------------------------------- function m.selectbutton(label, labelrgba, onclick, multi) -- return a table that makes it easy to create and use check boxes and radio buttons local c = {} local what if multi then what = "checkbox" else what = "radiobutton" end if type(label) ~= "string" then error("1st arg of "..what.." must be a string", 2) end if type(labelrgba) ~= "string" then error("2nd arg of "..what.." must be a string", 2) end if type(onclick) ~= "function" then error("3rd arg of "..what.." must be a function", 2) end -- create text for label with a unique clip name c.clipname = tostring(c).."+"..what c.clipname = string.gsub(c.clipname, " ", "") -- remove any spaces local oldfont = ov(m.textfont) local oldtextbg = ov("textoption background 0 0 0 0") local w, h = m.maketext(label, c.clipname, labelrgba, m.textshadowx, m.textshadowy, m.textshadowrgba) ov("textoption background "..oldtextbg) ov("font "..oldfont) -- use label size to set select button size c.labelwd = tonumber(w); c.labelht = tonumber(h); c.wd = m.buttonht + m.selectgap + c.labelwd; c.ht = m.buttonht; c.onclick = onclick -- remember click handler c.shown = false -- c.show hasn't been called c.enabled = true c.multi = multi c.show = function (x, y, ticked) c.x = x c.y = y c.ticked = ticked if c.shown then -- remove old select button from selectbutton_tables c.hide() end -- remember position and save background pixels c.background = c.clipname.."+bg" ov("copy "..c.x.." "..c.y.." "..c.wd.." "..c.ht.." "..c.background) -- draw the select button (excluding label) at the given location draw_selectbutton(x+1, y+1, c.ht-2, c.ht-2, ticked, c.enabled, c.multi) -- draw the label local oldblend = ov("blend 1") ovt{"paste", (x+c.ht+m.selectgap), int(y+m.yoffset+(c.ht-c.labelht)/2), c.clipname} ov("blend "..oldblend) -- store this table using the select button's rectangle as key c.rect = rect({c.x, c.y, c.wd, c.ht}) selectbutton_tables[c.rect] = c c.shown = true end c.hide = function () if c.shown then -- restore background pixels saved in c.show local oldblend = ov("blend 0") ovt{"paste", c.x, c.y, c.background} ov("blend "..oldblend) -- remove the table entry selectbutton_tables[c.rect] = nil c.shown = false end end c.enable = function (bool) c.enabled = bool end c.refresh = function () -- redraw checkbox c.show(c.x, c.y, c.ticked) g.update() end return c end -------------------------------------------------------------------------------- local function draw_slider(s, barpos) local x = s.startbar local y = s.y local w = s.barwidth local h = s.ht -- draw horizontal bar local oldrgba = ov("rgba 100 100 100 255") local midy = int(y+h/2) ovt{"fill", x, (midy-3), w, 6} ov("rgba 110 110 110 255") ovt{"fill", (x+1), (midy-2), (w-2), 1} ov("rgba 120 120 120 255") ovt{"fill", (x+1), (midy-1), (w-2), 1} ov("rgba 130 130 130 255") ovt{"fill", (x+1), midy, (w-2), 1} ov("rgba 140 140 140 255") ovt{"fill", (x+1), (midy+1), (w-2), 1} if darken_slider then darken_button = true end -- draw slider button on top of horizontal bar draw_button(x + barpos - int(m.sliderwd/2), y, m.sliderwd, h) ov("rgba "..oldrgba) if darken_slider then darken_button = false end -- draw the label local oldblend = ov("blend 1") ovt{"paste", s.x, int(y+m.yoffset+(h-s.labelht)/2), s.clipname} ov("blend "..oldblend) end -------------------------------------------------------------------------------- function m.slider(label, labelrgba, barwidth, minval, maxval, onclick) -- return a table that makes it easy to create and use sliders local s = {} if type(label) ~= "string" then error("1st arg of slider must be a string", 2) end if type(labelrgba) ~= "string" then error("2nd arg of slider must be a string", 2) end if type(onclick) ~= "function" then error("6th arg of slider must be a function", 2) end if barwidth <= 0 then error("slider width must be > 0", 2) end if minval >= maxval then error("minimum slider value must be < maximum value", 2) end s.barwidth = barwidth -- width of the slider bar s.minval = minval s.maxval = maxval -- create text for label with a unique clip name s.clipname = tostring(s).."+slider" s.clipname = string.gsub(s.clipname, " ", "") -- remove any spaces local oldfont = ov(m.textfont) local oldtextbg = ov("textoption background 0 0 0 0") local w, h if #label == 0 then w, h = split(ov("text "..s.clipname.." "..label.." ")) w, h = m.maketext(label.." ", s.clipname, labelrgba, m.textshadowx, m.textshadowy, m.textshadowrgba) w = 0 else w, h = m.maketext(label, s.clipname, labelrgba, m.textshadowx, m.textshadowy, m.textshadowrgba) end ov("textoption background "..oldtextbg) ov("font "..oldfont) -- set total slider size (including label) s.labelwd = tonumber(w); s.labelht = tonumber(h); s.wd = s.labelwd + m.sliderwd + s.barwidth; s.ht = m.buttonht; s.onclick = onclick -- remember click handler s.shown = false -- s.show hasn't been called s.show = function (x, y, pos) s.pos = int(pos) if s.pos < s.minval then s.pos = s.minval end if s.pos > s.maxval then s.pos = s.maxval end if s.shown then -- remove old slider from slider_tables s.hide() end -- remember slider location and save background pixels s.x = x s.y = y s.background = s.clipname.."+bg" ov("copy "..s.x.." "..s.y.." "..s.wd.." "..s.ht.." "..s.background) -- draw the slider and label at the given location s.startbar = x + s.labelwd + int(m.sliderwd/2) local barpos = int(s.barwidth * (s.pos - s.minval) / (s.maxval - s.minval)) draw_slider(s, barpos) -- store this table using the slider bar's rectangle as key, including -- overlap of half button width at left and right edges of bar s.rect = rect({s.startbar-int(m.sliderwd/2), s.y, s.barwidth+m.sliderwd, s.ht}) slider_tables[s.rect] = s s.shown = true end s.hide = function () if s.shown then -- restore background pixels saved in previous s.show local oldblend = ov("blend 0") ovt{"paste", s.x, s.y, s.background} ov("blend "..oldblend) -- remove the table entry slider_tables[s.rect] = nil s.shown = false end end s.refresh = function () -- redraw slider s.show(s.x, s.y, s.pos) g.update() end return s end -------------------------------------------------------------------------------- local function release_in_rect(r, t) -- return true if mouse button is released while in given rect local inrect = true -- draw darkened button darken_button = true t.refresh() local t0 = g.millisecs() while true do local event = g.getevent() if event == "mup left" then break end local xy = ov("xy") local wasinrect = inrect if #xy == 0 then inrect = false -- mouse is outside overlay else local x, y = split(xy) x = tonumber(x) y = tonumber(y) inrect = x >= r.left and x <= r.right and y >= r.top and y <= r.bottom end if inrect ~= wasinrect then -- mouse has moved in/out of r darken_button = inrect t.refresh() end end -- pause to ensure darkened button is seen while g.millisecs() - t0 < 16 do end if inrect then -- undarken button darken_button = false t.refresh() end return inrect end -------------------------------------------------------------------------------- local function click_in_button(x, y) for r, button in pairs(button_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then if button.enabled and release_in_rect(r, button) then -- call this button's handler button.onclick() end return true end end return false end -------------------------------------------------------------------------------- local function click_in_checkbox(x, y) for r, checkbox in pairs(selectbutton_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then if checkbox.enabled and release_in_rect(r, checkbox) then checkbox.show(checkbox.x, checkbox.y, not checkbox.ticked) -- call this checkbox's handler checkbox.onclick() end return true end end return false end -------------------------------------------------------------------------------- local function click_in_slider(x, y) for r, slider in pairs(slider_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then -- draw darkened slider button darken_slider = true slider.show(slider.x, slider.y, slider.pos) g.update() local prevx = x local range = slider.maxval - slider.minval + 1 local maxx = slider.startbar + slider.barwidth -- check if click is outside slider button local barpos = int(slider.barwidth * (slider.pos - slider.minval) / (slider.maxval - slider.minval)) local buttrect = rect({slider.startbar+barpos-int(m.sliderwd/2), slider.y, m.sliderwd, slider.ht}) if not (x >= buttrect.left and x <= buttrect.right and y >= buttrect.top and y <= buttrect.bottom) then -- move button to clicked position immediately prevx = math.maxinteger end -- track horizontal movement of mouse until button is released repeat local xy = ov("xy") if #xy > 0 then local x, _ = split(xy) -- check if slider position needs to change x = tonumber(x) if x < slider.startbar then x = slider.startbar end if x > maxx then x = maxx end if x ~= prevx then -- draw new position of slider button immediately; -- first restore background pixels saved in previous slider.show local oldblend = ov("blend 0") ovt{"paste", slider.x, slider.y, slider.background} ov("blend "..oldblend) draw_slider(slider, x - slider.startbar) g.update() -- now check if slider value has to change local newpos = int(slider.minval + range * (x - slider.startbar) / slider.barwidth) if newpos < slider.minval then newpos = slider.minval end if newpos > slider.maxval then newpos = slider.maxval end if slider.pos ~= newpos then slider.pos = newpos -- call this slider's handler slider.onclick(newpos) g.update() end prevx = x end end until g.getevent() == "mup left" -- undarken slider button darken_slider = false slider.show(slider.x, slider.y, slider.pos) g.update() return true end end return false end -------------------------------------------------------------------------------- local function DrawMenuBar(mbar) local oldrgba = ov(m.menubg) m.fill_rect(mbar.r.x, mbar.r.y, mbar.r.wd, mbar.r.ht) local oldblend = ov("blend 1") local xpos = mbar.r.x + m.menugap local ypos = mbar.r.y + m.yoffset + (mbar.r.ht - mbar.labelht) // 2 for i = 1, #mbar.menus do local menu = mbar.menus[i] if i == selmenu then ov(m.selcolor) m.fill_rect(xpos, mbar.r.y, menu.labelwd + m.menugap*2, mbar.r.ht) end xpos = xpos + m.menugap ovt{"paste", xpos, ypos, menu.labelclip} xpos = xpos + menu.labelwd + m.menugap end ov("blend "..oldblend) ov("rgba "..oldrgba) end -------------------------------------------------------------------------------- function m.menubar() -- return a table that makes it easy to create and use a menu bar local mbar = {} mbar.menus = {} mbar.r = {} -- menu bar's bounding rectangle mbar.labelht = 0 -- height of label text mbar.itemht = 0 -- height of a menu item mbar.shown = false -- mbar.show hasn't been called mbar.addmenu = function (menuname) -- append a menu to the menu bar local index = #mbar.menus+1 local clipname = string.gsub(tostring(mbar)..index," ","") local oldfont = ov(m.menufont) local oldblend = ov("blend 1") local oldtextbg = ov("textoption background 0 0 0 0") local wd, ht = m.maketext(menuname, clipname, m.menutext, m.textshadowx, m.textshadowy, m.textshadowrgba) ov("textoption background "..oldtextbg) ov("blend "..oldblend) ov("font "..oldfont) mbar.labelht = ht mbar.itemht = ht + m.itemgap*2 mbar.menus[index] = { labelwd=wd, labelclip=clipname, items={}, maxwd=0 } end local function check_width(menuindex, itemname) local oldfont = ov(m.menufont) local oldblend = ov("blend 1") local wd, _ = m.maketext(itemname, nil, m.menutext, m.textshadowx, m.textshadowy, m.textshadowrgba) ov("blend "..oldblend) ov("font "..oldfont) local itemwd = wd + m.menugap*2 + 20 if itemwd > mbar.menus[menuindex].maxwd then mbar.menus[menuindex].maxwd = itemwd end end mbar.additem = function (menuindex, itemname, onclick, args) -- append an item to given menu args = args or {} check_width(menuindex, itemname) local items = mbar.menus[menuindex].items items[#items+1] = { name=itemname, f=onclick, fargs=args, enabled=(onclick ~= nil), type=item_normal, value=false } end mbar.setitem = function (menuindex, itemindex, newname) -- change name of given menu item check_width(menuindex, newname) mbar.menus[menuindex].items[itemindex].name = newname end mbar.enableitem = function (menuindex, itemindex, bool) mbar.menus[menuindex].items[itemindex].enabled = bool end mbar.tickitem = function (menuindex, itemindex, bool) -- tick/untick the given menu item mbar.menus[menuindex].items[itemindex].type = item_tick mbar.menus[menuindex].items[itemindex].value = bool end mbar.radioitem = function (menuindex, itemindex, bool) -- mark menu item as a radio item and set its value mbar.menus[menuindex].items[itemindex].type = item_radio mbar.menus[menuindex].items[itemindex].value = bool end mbar.show = function (x, y, wd, ht) if wd > 0 and ht > 0 then if mbar.shown then mbar.hide() -- set menubar_tables[mbar.r] to nil end mbar.r = rect({x, y, wd, ht}) DrawMenuBar(mbar) menubar_tables[mbar.r] = mbar mbar.shown = true end end mbar.hide = function () if mbar.shown then menubar_tables[mbar.r] = nil mbar.shown = false end end mbar.refresh = function () -- redraw menu bar mbar.show(mbar.r.x, mbar.r.y, mbar.r.wd, mbar.r.ht) g.update() end return mbar end -------------------------------------------------------------------------------- local function GetMenu(x, y, oldmenu, mbar) -- return menu index depending on given mouse location if y < mbar.r.y then return oldmenu end if y > mbar.r.y + mbar.r.ht - 1 then return oldmenu end if x < mbar.r.x + m.menugap then return 0 end if x > mbar.r.x + mbar.r.wd - 1 then return 0 end local endmenu = mbar.r.x + m.menugap for i = 1, #mbar.menus do endmenu = endmenu + mbar.menus[i].labelwd + m.menugap*2 if x < endmenu then return i end end return 0 end -------------------------------------------------------------------------------- local function GetItem(x, y, menuindex, mbar) -- return index of menu item at given mouse location if menuindex == 0 then return 0 end if y < mbar.r.y + mbar.r.ht then return 0 end local numitems = #mbar.menus[menuindex].items local ht = numitems * mbar.itemht if y > mbar.r.y + mbar.r.ht + ht then return 0 end local mleft = mbar.r.x + m.menugap for i = 2, menuindex do mleft = mleft + mbar.menus[i-1].labelwd + m.menugap*2 end if x < mleft then return 0 end if x > mleft + mbar.menus[menuindex].maxwd then return 0 end -- x,y is somewhere in a menu item local itemindex = math.floor( (y - (mbar.r.y + mbar.r.ht)) / mbar.itemht ) + 1 if itemindex > numitems then itemindex = numitems end return itemindex end -------------------------------------------------------------------------------- local function DrawMenuItems(mbar) -- draw drop-down window showing all items in the currently selected menu local numitems = #mbar.menus[selmenu].items if numitems == 0 then return end local oldrgba = ov(m.menubg) local x = mbar.r.x + m.menugap for i = 2, selmenu do x = x + mbar.menus[i-1].labelwd + m.menugap*2 end local ht = numitems * mbar.itemht + 1 local wd = mbar.menus[selmenu].maxwd local y = mbar.r.y + mbar.r.ht m.fill_rect(x, y, wd, ht) local oldfont = ov(m.menufont) local oldblend = ov("blend 1") -- draw translucent gray shadows ov("rgba 48 48 48 128") local shadowsize = 3 m.fill_rect(x+shadowsize, y+ht, wd-shadowsize, shadowsize) m.fill_rect(x+wd, y, shadowsize, ht+shadowsize) x = x + m.menugap y = y + m.yoffset for i = 1, numitems do local item = mbar.menus[selmenu].items[i] if item.f == nil then -- item is a separator ov(m.discolor) m.draw_line(x-m.menugap, y+mbar.itemht//2, x-m.menugap+wd-1, y+mbar.itemht//2) else if i == selitem and item.enabled then ov(m.selcolor) m.fill_rect(x-m.menugap, y, wd, mbar.itemht) end local oldtextbg = ov("textoption background 0 0 0 0") if item.enabled then m.maketext(item.name, nil, m.menutext, m.textshadowx, m.textshadowy, m.textshadowrgba) m.pastetext(x, y + m.itemgap) ov(m.menutext) else m.maketext(item.name, nil, m.discolor) -- no shadow if disabled m.pastetext(x, y + m.itemgap) ov(m.discolor) end ov("textoption background "..oldtextbg) if item.type == item_tick then if item.value then -- draw tick mark at right edge local x1 = x - m.menugap + wd - m.menugap local y1 = y + 6 local x2 = x1 - 6 local y2 = y + mbar.itemht - 8 local oldwidth = ov("lineoption width 4") if item.enabled and (m.textshadowx > 0 or m.textshadowy > 0) then local oldcolor = ov(m.textshadowrgba) m.draw_line(x1+m.textshadowx, y1+m.textshadowy, x2+m.textshadowx, y2+m.textshadowy) m.draw_line(x2+m.textshadowx, y2+m.textshadowy, x2+m.textshadowx-5, y2+m.textshadowy-3) ov("rgba "..oldcolor) end m.draw_line(x1, y1, x2, y2) m.draw_line(x2, y2, x2-5, y2-3) ov("lineoption width "..oldwidth) end elseif item.type == item_radio then -- draw radio button at right edge local size = mbar.itemht - 12 local x1 = x - m.menugap + wd - m.menugap - size local y1 = y + 6 if item.enabled and (m.textshadowx > 0 or m.textshadowy > 0) then m.fill_ellipse(x1+m.textshadowx, y1+m.textshadowy, size, size, 0, m.textshadowrgba) end local optcol = m.distext if item.value and item.enabled then optcol = m.textrgba end if item.enabled or item.value then m.fill_ellipse(x1, y1, size, size, 0, optcol) end end end y = y + mbar.itemht end ov("blend "..oldblend) ov("font "..oldfont) ov("rgba "..oldrgba) end -------------------------------------------------------------------------------- local function release_in_item(x, y, mbar) -- user clicked given point in menu bar so return the selected menu item -- on release, or nil if the item is disabled or no item is selected local t0 = g.millisecs() local MacOS = g.os() == "Mac" selitem = 0 selmenu = GetMenu(x, y, 0, mbar) if selmenu == 0 and not MacOS then -- if initial click is not in any menu then ignore it on Windows/Linux return nil end -- save entire overlay (including menu bar) in bgclip local bgclip = string.gsub(tostring(mbar).."bg"," ","") ov("copy 0 0 0 0 "..bgclip) if selmenu > 0 then DrawMenuBar(mbar) -- highlight selected menu DrawMenuItems(mbar) g.update() end local prevx = x local prevy = y local menuitem = nil -- on Windows/Linux we loop until an enabled item is clicked; -- on Mac we loop until an enabled or disabled item is clicked while true do -- loop until click or keypress while true do local event = g.getevent() if event == "mup left" then if g.millisecs() - t0 > 500 then local oldmenu = selmenu selmenu = GetMenu(x, y, selmenu, mbar) if selmenu == 0 and not MacOS then selmenu = oldmenu end break end elseif event:find("^oclick") then local _, sx, sy, butt, mods = split(event) if butt == "left" and mods == "none" then x = tonumber(sx) y = tonumber(sy) local oldmenu = selmenu selmenu = GetMenu(x, y, selmenu, mbar) if selmenu == 0 and not MacOS then selmenu = oldmenu end break end elseif event == "key enter none" or event == "key return none" then break end local xy = ov("xy") if #xy > 0 then x, y = split(xy) x = tonumber(x) y = tonumber(y) if x ~= prevx or y ~= prevy then -- check if mouse moved into or out of a menu/item local oldmenu = selmenu local olditem = selitem selmenu = GetMenu(x, y, selmenu, mbar) if selmenu == 0 and not MacOS then selmenu = oldmenu end selitem = GetItem(x, y, selmenu, mbar) if selmenu ~= oldmenu or selitem ~= olditem then ovt{"paste", 0, 0, bgclip} DrawMenuBar(mbar) if MacOS then if selmenu > 0 then DrawMenuItems(mbar) end else DrawMenuItems(mbar) end g.update() end prevx = x prevy = y end end end if MacOS then -- on Mac we can return nil if user clicked a disabled item menuitem = nil if selmenu > 0 then selitem = GetItem(x, y, selmenu, mbar) if selitem > 0 and mbar.menus[selmenu].items[selitem].enabled then menuitem = mbar.menus[selmenu].items[selitem] end end break else -- Windows/Linux if selmenu > 0 then selitem = GetItem(x, y, selmenu, mbar) if selitem > 0 and mbar.menus[selmenu].items[selitem].enabled then menuitem = mbar.menus[selmenu].items[selitem] break elseif selitem == 0 then break end end end end -- restore overlay and menu bar ovt{"paste", 0, 0, bgclip} g.update() ov("delete "..bgclip) selmenu = 0 return menuitem end -------------------------------------------------------------------------------- local function click_in_menubar(x, y) for r, mbar in pairs(menubar_tables) do if x >= r.left and x <= r.right and y >= r.top and y <= r.bottom then local menuitem = release_in_item(x, y, mbar) if menuitem and menuitem.f then -- call this menu item's handler menuitem.f( table.unpack(menuitem.fargs) ) end return true end end return false end -------------------------------------------------------------------------------- local function DrawPopUpMenu(p, chosenitem) -- draw pop-up window showing all items local numitems = #p.items if numitems == 0 then return end local oldfont = ov(m.menufont) local oldblend = ov("blend 1") local oldrgba = ov(p.bgcolor) local ht = p.menuht + 1 local wd = p.menuwd local x = p.x local y = p.y m.fill_rect(x, y, wd, ht) -- draw translucent gray shadows ov("rgba 48 48 48 128") local shadowsize = 3 m.fill_rect(x+shadowsize, y+ht, wd-shadowsize, shadowsize) m.fill_rect(x+wd, y+shadowsize, shadowsize, ht) x = x + m.menugap y = y + m.yoffset for i = 1, numitems do local item = p.items[i] if item.f == nil then -- item is a separator ov(p.discolor) m.draw_line(x-m.menugap, y+p.itemht//2, x-m.menugap+wd-1, y+p.itemht//2) else if i == chosenitem and item.enabled then ov(p.selcolor) m.fill_rect(x-m.menugap, y, wd, p.itemht) end local oldtextbg = ov("textoption background 0 0 0 0") if item.enabled then m.maketext(item.name, nil, m.menutext, m.textshadowx, m.textshadowy, m.textshadowrgba) m.pastetext(x, y + m.itemgap) ov(m.menutext) else m.maketext(item.name, nil, p.discolor) -- no shadow if disabled m.pastetext(x, y + m.itemgap) ov(p.discolor) end ov("textoption background "..oldtextbg) if item.type == item_tick then if item.value then -- draw tick mark at right edge local x1 = x - m.menugap + wd - m.menugap local y1 = y + 6 local x2 = x1 - 6 local y2 = y + p.itemht - 8 local oldwidth = ov("lineoption width 4") if item.enabled and (m.textshadowx > 0 or m.textshadowy > 0) then local oldcolor = ov(m.textshadowrgba) m.draw_line(x1+m.textshadowx, y1+m.textshadowy, x2+m.textshadowx, y2+m.textshadowy) m.draw_line(x2+m.textshadowx, y2+m.textshadowy, x2+m.textshadowx-5, y2+m.textshadowy-3) ov("rgba "..oldcolor) end m.draw_line(x1, y1, x2, y2) m.draw_line(x2, y2, x2-5, y2-3) ov("lineoption width "..oldwidth) end elseif item.type == item_radio then -- draw radio button at right edge local size = p.itemht - 12 local x1 = x - m.menugap + wd - m.menugap - size local y1 = y + 6 if item.enabled and (m.textshadowx > 0 or m.textshadowy > 0) then m.fill_ellipse(x1+m.textshadowx, y1+m.textshadowy, size, size, 0, m.textshadowrgba) end local optcol = m.distext if item.value and item.enabled then optcol = m.textrgba end if item.enabled or item.value then m.fill_ellipse(x1, y1, size, size, 0, optcol) end end end y = y + p.itemht end ov("blend "..oldblend) ov("font "..oldfont) ov("rgba "..oldrgba) end -------------------------------------------------------------------------------- local function GetPopUpItem(x, y, p) -- return index of item at given mouse location if x <= p.x or y <= p.y then return 0 end local numitems = #p.items if y > p.y + p.menuht then return 0 end if x > p.x + p.menuwd then return 0 end -- x,y is somewhere in a menu item local itemindex = math.floor((y - p.y) / p.itemht) + 1 if itemindex > numitems then itemindex = numitems end return itemindex end -------------------------------------------------------------------------------- local function choose_popup_item(p) -- return a chosen item from the given pop-up menu -- or nil if the item is disabled or no item is selected local t0 = g.millisecs() -- save entire overlay in bgclip local bgclip = string.gsub(tostring(p).."bg"," ","") ov("copy 0 0 0 0 "..bgclip) local chosenitem = 0 DrawPopUpMenu(p, chosenitem) g.update() local x = p.x local y = p.y local prevx = x local prevy = y while true do local event = g.getevent() if event:find("^mup") then if g.millisecs() - t0 > 500 then break end elseif event:find("^oclick") then local _, sx, sy, butt, mods = split(event) if butt == "left" and mods == "none" then x = tonumber(sx) y = tonumber(sy) break end elseif event == "key enter none" or event == "key return none" then break end local xy = ov("xy") if #xy > 0 then x, y = split(xy) x = tonumber(x) y = tonumber(y) if x ~= prevx or y ~= prevy then -- check if mouse moved into or out of an item local olditem = chosenitem chosenitem = GetPopUpItem(x, y, p) if chosenitem ~= olditem then ovt{"paste", 0, 0, bgclip} DrawPopUpMenu(p, chosenitem) g.update() end prevx = x prevy = y end end end chosenitem = GetPopUpItem(x, y, p) -- restore overlay ovt{"paste", 0, 0, bgclip} g.update() ov("delete "..bgclip) return chosenitem end -------------------------------------------------------------------------------- function m.popupmenu() -- return a table that makes it easy to create and use a pop-up menu local p = {} p.items = {} -- array of items p.labelht = 0 -- height of label text p.itemht = 0 -- height of an item p.menuwd = 0 -- width of pop-up menu p.menuht = 0 -- height of pop-up menu p.x, p.y = 0, 0 -- top left location of pop-up menu -- default to menu bar colors p.bgcolor = m.menubg p.selcolor = m.selcolor p.discolor = m.discolor local function check_width(itemname) local oldfont = ov(m.menufont) local oldblend = ov("blend 1") local wd, ht = m.maketext(itemname, nil, m.menutext, m.textshadowx, m.textshadowy, m.textshadowrgba) ov("blend "..oldblend) ov("font "..oldfont) p.labelht = ht p.itemht = ht + m.itemgap*2 local itemwd = wd + m.menugap*2 + 20 if itemwd > p.menuwd then p.menuwd = itemwd end end p.additem = function (itemname, onselect, args) args = args or {} check_width(itemname) p.items[#p.items+1] = { name=itemname, f=onselect, fargs=args, enabled=(onselect ~= nil), type=item_normal, value=false } p.menuht = #p.items * p.itemht end p.enableitem = function (itemindex, bool) -- enable/disable the given item p.items[itemindex].enabled = bool end p.tickitem = function (itemindex, bool) -- tick/untick the given item p.items[itemindex].type = item_tick p.items[itemindex].value = bool end p.radioitem = function (itemindex, bool) -- set/clear the given item option -- mark menu item as radio item and set its value p.items[itemindex].type = item_radio p.items[itemindex].value = bool end p.setbgcolor = function (rgba) p.bgcolor = rgba local _,R,G,B,A = split(rgba) R = tonumber(R) G = tonumber(G) B = tonumber(B) A = tonumber(A) -- use a darker color when item is selected p.selcolor = "rgba "..math.max(0,R-48).." "..math.max(0,G-48).." "..math.max(0,B-48).." "..A -- use lighter color for disabled items and separator lines p.discolor = "rgba "..math.min(255,R+48).." "..math.min(255,G+48).." "..math.min(255,B+48).." "..A end p.show = function (x, y, ovwd, ovht) if x + p.menuwd > ovwd then x = x - p.menuwd - 2 end if y + p.menuht > ovht then y = ovht - p.menuht end p.x = x p.y = y local itemindex = choose_popup_item(p) if itemindex > 0 then local item = p.items[itemindex] if item and item.f and item.enabled then -- call this item's handler item.f( table.unpack(item.fargs) ) end end end return p end -------------------------------------------------------------------------------- function m.process(event) if #event > 0 then if event:find("^oclick") then local _, x, y, butt, mods = split(event) if butt == "left" and mods == "none" then x = tonumber(x) y = tonumber(y) if click_in_button(x, y) then return "" end if click_in_checkbox(x, y) then return "" end if click_in_slider(x, y) then return "" end if click_in_menubar(x, y) then return "" end end end end return event end -------------------------------------------------------------------------------- function m.hexrule() -- return true if the current rule uses a hexagonal neighborhood local rule = g.getrule() rule = rule:match("^(.+):") or rule -- remove any ":*" suffix local algo = g.getalgo() if algo == "QuickLife" or algo == "HashLife" or algo == "Generations" then return (rule:sub(1, 3) == "MAP" and rule:len() == 25) or rule:sub(-1) == "H" elseif algo == "RuleLoader" then return rule:lower():find("hex") ~= nil -- or maybe look in the .rule file and see if the TABLE section specifies -- neighborhood:hexagonal or the ICONS section specifies hexagons??? end return false end -------------------------------------------------------------------------------- function m.minbox(clipname, wd, ht) -- find the minimal bounding box of non-transparent pixels in given clip local xmin, ymin, xmax, ymax, minwd, minht -- find the top edge (ymin) local oldtarget = ov("target "..clipname) for row = 0, ht-1 do for col = 0, wd-1 do local _, _, _, a = ovt{"get", col, row} if a ~= 0 then ymin = row goto found_top end end end -- only get here if clip has no non-transparent pixels xmin, ymin, minwd, minht = 0, 0, 0, 0 goto finish ::found_top:: -- get here if clip has at least one non-transparent pixel -- find the bottom edge (ymax) for row = ht-1, ymin, -1 do for col = 0, wd-1 do local _, _, _, a = ovt{"get", col, row} if a ~= 0 then ymax = row goto found_bottom end end end ::found_bottom:: -- find the left edge (xmin) for col = 0, wd-1 do for row = ymin, ymax do local _, _, _, a = ovt{"get", col, row} if a ~= 0 then xmin = col goto found_left end end end ::found_left:: -- find the right edge (xmax) for col = wd-1, xmin, -1 do for row = ymin, ymax do local _, _, _, a = ovt{"get", col, row} if a ~= 0 then xmax = col goto found_right end end end ::found_right:: -- all edges have been found minwd = xmax - xmin + 1 minht = ymax - ymin + 1 ::finish:: -- return the bounding box info ov("target "..oldtarget) return xmin, ymin, minwd, minht end -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/oplus/images/0000755000175000017500000000000013543257426015065 500000000000000golly-3.3-src/Scripts/Lua/oplus/images/lifeviewer.png0000644000175000017500000000440713043333474017652 00000000000000‰PNG  IHDR(­•+tRNSn¦‘¼IDATxœí;oÛH€‡ë 9P®PanTPW©SÈý´›4ç?p€\¤ ]¤KyÝ’‹+$à*R¹‰ô ¤âê ʼn…šNá"b±½‚4¹|¿vÉår>¤ˆ)rwgf9³Y AA‘Ã0¸^Gʇ·Méë;Û† 5€⻢(J %WUoÓ „”#~i‰DZx¼Òña Úz›ƒ¢(>—Íăó(³¦üTu„ –ïàW~”רªÞ¦zæ DZøùŽx¯QU½MõÌ ˆÌðði¼FUõ6 Ô3'00 ’ÃÖw¤÷UÕÛ4PÏ<ˆTAU ʺ¡Çd.¤ˆÔ2õ*K'Ž8¬6ZËñÕË ›“‚Ô[~Féd2)¹Æ <Ò´ÄLý˾ä‰Ûã©×«û )Øìôô aû/_ËSŠÃDÏiÊ©ªãIžcÞöM^J·4ž|úaëÇÙ–)ˆ¹i‚4´{ ‚H©¡$ª1Ò²p#|Ök‡¬K@¹ˆDÛ6ið™ Q²³"k7F%Ésò¹Éá•ëÜ( óÕ¤M1‹,šâ¤ï0ÂvûjÉÿ•M Ì;PA?ÎÁ_Œ R&EÏ1H¹ÎîCzk!]‘F¶'ë>!“!ÃöÎävìIZ[OÚq·.Çã>™wÃ>Û#$ê#ëÙ=BúdÝ£µ;œ$Ý3Ý9Ù½R¾Ì²×V:ÁŒÃ‹7ã®ê½¤êûDßÀYh†â%€@ ã,¬ÏG"œc¨ª¾¿†ëaõÀîœô4÷Ö¾<€ÃÏÆ*øœXöÊ7O$²Ätd-–I3‚V%~ɤ‡•¼¹+ʯáá䀽ùÜ?ª~ ·vFõÚõ q…µÇï¤?åÈs¯ÝŒ!S'ÉûÎÆ´Ü™1PŸÚ q´äQšm²„Q¿m£xûï*ÇÁi*}ýWbÔÑ?Ò”ÖþʸÕÔLY›Ý>9nùøçÕ¨ÝwΛã{±?‡½õÒŽu¦î»ê¼E–¤ÒD¸¢QF¿è*€¹=„gô¹2>Ÿ.À<¿>²f@¶WÚ›[B­{CßRƒû„\ÞŽ³·!Z÷É£ùÓ\–˜ªéö«÷÷&¨;/é«jûd÷Æ`£(›§ÉD,!ö5^mBí{ùÛǾ¾@åØwo® ^ß•T÷ðÀ›Ê¸ÕÚ:Y?|v¬‚ùáûjv»Ð^çð5Ý9Ù×Ý©{K_ú†f1|±æ‡ï¾5‰ÙQÀï¨ÍjýÃs³ 3…NªŠÕî’¦,õõ™OiLpÕzSÍýÒ :LW¼µ=8‹éÓ¶ æãGëïÙíÀêK™æ¦,ìK¯DEÙ¿D‘ë…\ºØ^-´Ý„—pu38Üšw§Êf`Ü'Ï50·‡ÊFQ6‡ç M]hzùkËó·;ö·ÆàÿLÜÀÃùáFQ6ÊÑÖó„íÂlyO 7ÉR y~­(EÙ(§w-ý]T„~jÕé¨ú/,ôì[«dPb*¨°aEJÊ¡oìnÖÜ4å:g˜}¯ÆcjŽåJWľ¼ƒ¢(òíEËD­­“¾ñí“ãhÓ>!ý©×=õ*.þ²gî+ãÛ`ç…9Nÿ{H{«yÿ>d«Ó/ï îÒ•f;… Ÿtª¾o;¯i`ðs¸þßì X{LÍDÏt‡aÚó7 %õQl®ÂâÔ;¨_Ý hE©ÝeŠ¥³,öý}ó*är:û² u å´ŸÇ!†¬eÖÔLYšmç#yȵšTVŸh¯nO-¾Õö2°æ %ÎR„•ñÙµNT°¤ï±ïë³3æöeêhJeCwÿr´¡vöÊÖ`kÖì.b(7 ð®&ÙÿoOÞR+­«kªkŒ¦½µgúO+KáÃí¤ÆÓä¾'–Ù×s:S —&ºïôVä#^¼ò¶')÷’ ôyI%*X{no?Œv5€ÇO™õ…¥O!ú¼µÁîì Xî>%Ù—Í9!tÍK®ZïÓ&Âû·s’µ›YëHÞ;ó÷íÕ¢§i×#˜}|4TèLIþxgJúoϯÆ·…ÞÓÔî’¸S g&^ Ÿæƒ¶H#²?+qó÷…9îªài°ÅBûÃ8ؽPéÔu7ÏýÕÙ… -Õ+o‘s +KZžsÑ<¿ŽHÂié˾îÞöµGI23»º›jUß'º{1¸¥ ^û†´ï€­X¯}/þ;¦±¯s‚Á9†ì*I kELV¤"Þ )‡DqXÉ[ZE`çäùöô¨¼='û›½‘7Ÿ/1É$]5HPFfÝi~ìÖ0Œ°“¾tÆ!ÎÈä}Ê—Jاëe–®šIoy•œñCÞ¼€¬ùWåÙ×KÔûÉ Ëæª—Õý‰…äkoµ”@¼8¬äM,G2­Æ“•à5ü¡f‡Ý2é­¦½‹·}ó,%ɺp”†‹KÌ2ÜÐvM©Éý ɇ˜=¹Fd øŠZœ¸É°Ë!YÁ>Sœ´uDÊ­i¡bƒô½.( ô"G3û¢H¹Ñ\K’ÓUeJBå|úDAš $.0Èçòø‘UW"p‹¡r»3o“iP¾ÍöJê• ÍÉzHý>"!ÄûË „ÝÀÅ—\I½%&Ùˆö{ „ÑïÁ°*‡-h_aƒ/ÿµ´Â«ª7H ÓUsâ¤ù UxÛ”ïï1 ˆ80³;¤ÙŸ¯ªÞ¦zæDZxx ‹xßQU½MõÌ ˆœðóQ¾£ªz›ê™+l¾DA„~±n [osF&z–É;ü DBø½Ìñ%WUoÓ(M¨vAø;ƒr÷Æ$ IEND®B`‚golly-3.3-src/Scripts/Lua/oplus/sounds/0000755000175000017500000000000013543257426015133 500000000000000golly-3.3-src/Scripts/Lua/oplus/sounds/README.txt0000644000175000017500000000162113317135606016543 00000000000000audio files Sound effects and music are available for breakout.lua and overlay-demo.lua. You need two things: 1. A build of Golly that is compiled with sound support (see the Makefiles for ENABLE_SOUND) 2. The audio files which can be downloaded as zip file from: http://lazyslug.no-ip.biz/lifeview/audio/audio.zip The zip file contains the following: breakout/ breakout/bat.ogg breakout/bonusloop.ogg breakout/brick1.ogg breakout/brick2.ogg breakout/brick3.ogg breakout/brick4.ogg breakout/brick5.ogg breakout/brick6.ogg breakout/edge.ogg breakout/gameloop.ogg breakout/gamelostloop.ogg breakout/gamestart.ogg breakout/levelcompleteloop.ogg breakout/lostball.ogg breakout/top.ogg overlay-demo/animation.ogg The zip file must be extracted to /Scripts/Lua/oplus/sounds For example the path to bat.ogg should be /Scripts/Lua/oplus/sounds/breakout/bat.ogg golly-3.3-src/Scripts/Lua/heisenburp.lua0000755000175000017500000006111513111767235015247 00000000000000-- Stable pseudo-Heisenburp device. -- Show several views of a multi-stage signal-processing circuit. -- Author: Dave Greene, 27 February 2007. Lua version 1 April 2016. local g = golly() local gp = require "gplus" local split = gp.split local clock = os.clock local ticks=0 local tickstep=5 local last_signal=-99999 local viewport_speed=16 local sel_speed=0 local delta_sel=0 local delay=-1 local run_flag=0 local ch="" local selx=600 local sely=365 local place_signal=3 local helpstring=[[ Use ENTER and SPACE to run or halt the pattern; use + and - to change the step size or delay value; use arrow keys and mouse tools to pan and zoom in any pane; T toggles between a tiled view and a single-pane view; S creates another signal fleet near the detection mechanism; R resets the Heisenburp device to its initial state; Q quits out of the script and restores original settings.]] local instr="Press H for help. " ------------------------------------------------------- local function sleep(n) -- n is seconds (with precision in hundredths of a second) local t0 = clock() while clock() - t0 <= n do g.doevent("") -- no-op, but allows user to abort script here end end ------------------------------------------------------- local function show_status_text(s, d, t) if d==-1 then if t==1 then g.show(s.."Speed is "..t.." tick per step.") else g.show(s.."Speed is "..t.." ticks per step.") end else g.show(s.."Delay between ticks is "..d.." seconds.") end end ------------------------------------------------------- local function prepare_burp() while g.numlayers()>1 do g.dellayer() end local highway_robber=g.parse([[143bo$143b3o$146bo$145b2o2$126bo42bo$126b3o38b3o$129bo36bo$128b2o11b2o 23b2o7b2o$141b2o32bo$108bo64bobo$108b3o6b2o54b2o$111bo5b2o$110b2o3$ 111b2o$111b2o3b2o$116b2o35b2o23bo$154bo22bobo$151b3o8b2o14bo$151bo11bo $98bo7bo53b3o$86bo11b3o5b3o51bo$84b3o14bo7bo32b2o$68bo14bo16b2o6b2o32b obo30b2o$68b3o12b2o59bo30bobo$71bo72b2o31bo$70b2o105b2o$159bob2o$159b 2obo$71b2o$71b2o17b2o76b2o$90b2o76b2o5$104b2o$87b2o14bobo$87bo15bo74b 2o$88b3o11b2o74bo$90bo85bobo$84b2o90b2o$84bo$85b3o$87bo2$158b2o$159bo$ 68b2o89bobo$67bobo90b2o$67bo25b2o$66b2o25bo$74b2o15bobo$74b2o15b2o98b 2o6bo$187bobo2bo4b3o$185b3ob2o5bo$184bo11b2o$185b3ob2o$177b2o8bob2o$ 177b2o2$161b2o32b2o3b2o$161b2o32b2o3b2o$153b2o$88b2o2b2ob2o57bo18b2ob 2o$73b2o13bobo2bobo58bobo16b2obo$72bobo16b2o3bo58b2o21bo26bo$72bo19bob 2o76bob5o25bobo$71b2o16bo2bobo77b2o31bo$88bobobobo80b2o$89b2ob2o82bo$ 173b3o$173bo33bo$171bobo31b3o$171b2o31bo$187b2o14bobo$187b2o15bo$83b2o $83b2o$202b2o$202b2o2$175b2o$175b2o$72b2o123b2o$73bo19b2o102bo$73bobo 17bo76b2o26b3o$74b2o15bobo60b2o14b2o28bo$86bo4b2o62bo$85bobo64b3o$54bo 30bobo64bo$54b3o17b2o10bo$57bo15bobo$56b2o15bo116b2o$72b2o116bo$36b2o 49b2o102b3o$29b2o5b2o49bo105bo$29b2o57b3o6bo$90bo4b3o$94bo$31b2o17b2o 29b2o11b2o14b2o$31b2o17bo30b2o27b2o$25b2o21bobo$25b2o21b2o$116b2o$116b 2o36b2o$112b2o41bo$112b2o41bobo$156b2o$56b2o122b2o$56b2o11b2o109b2o$ 69bo47b2o$70b3o44b2o$72bo2$22bo$22b3o55b2o96b2o$25bo53bobo96bo$24b2o 47b2o4bo99b3o$73b2o3b2o101bo$179b2o$76b4o99bo$75bo3bo97bobo$75b2o100b 2o$53b2o33bo22b2o$19b2o32b2o33b3o20bo$20bo70bo20b3o$20bobo67b2o22bo44b o$21b2o136b3o$162bo$115bo45b2o$35b2o28b2o46b3o$35bobo27b2o45bo$37bo41b 2o6b2o23b2o$37b2o40b2o6bo2b2o$83b2o3b2obo$83b2o4bo89b2o$17bob2o68bo89b o$17b2obo67b2obob2o18b2o62bobo$87bo2b2ob2o18bobo61b2o$26b2o60bo26bo$ 26b2o33b2o26b3ob2o20b2o$60bo2bo27bobo66b2o$61bobo29bo66b2o15b2o$62bo 29b2ob2o80bobo$94bobo82bo$94bo84b2o$93b2o3$160b2o$160bo$158bobo$158b2o 2$16bo$16b3o$19bo33bo121b2obo$18b2o33b3o53b2o64bob2o$56bo52b2o$11bo43b obo110b2o$11b3o42bo111b2o$14bo123bo$13b2o121b3o$57b2o19bo56bo$57b2o17b 3o19b2o20bo14b2o$75bo23bo19bobo$75b2o22bobo17bobo$100b2o15bobobobo34b 2o$10b2o19b2o79bo4b2o3b2o10bo24bo$10b2o19b2o47b2o29bobo19bobo23bobo$ 80b2o29bobo19bobo24b2o$4bo95b2o10bo21bo4b2o$4b3o25b2o65bobo20b2o15bobo $2o5bo24bo57b2o7bo21bobo17bo$bo4b2o25b3o54bo7b2o21bo19b2o36bo$bobo31bo 52bobo22b2o5b2o55b3o$2b2o29b2o53b2o23bo62bo$33bo17b2o61b3o28b2o29b2o$ 31bobo4bo11bobo63bo28bo$31b2o3b3o11bo92bobo$35bo13b2o92b2o$35b2o94b2o$ 61b2o68b2o$61b2o$b2o178b2o$b2o178bo$36b2o141bobo$36b2o141b2o3$27b2o37b 2o97b2o$27b2o36bobo51b2o43bobo$65bo54bo43bo$64b2o54bobo40b2o$121b2o2$ 181b2obo$181bob2o2$40bo133b2o$38b3o133b2o$37bo$37b2o$138b2o$138b2o$42b 2o$42b2o78b2o$122b2o$114b2o$52b2o61bo18b2ob2o$52bo62bobo16b2obo$50bobo 63b2o21bo$50b2o81bob5o$13b2o118b2o$12bobo121b2o$12bo124bo$11b2o99bobo 19b3o$112b2obo18bo$23b2o90b3o$23b2o87b2o4bo$112bob5o$114bo$113bo3b2o$ 108bo3bo3bobo$106b3o3b2o3bo$105bo$28b2o75b2o29b2o39b2o$27bobo106b2o38b o2bo$27bo149b2o$26b2o2$131b2o$131b2o$135b2o$14b2o119b2o$14b2o35bo$49b 3o$48bo80b2o$48b2o63b2o14b2o$79bo33bo$68b2o7b3o34b3o$69bo6bo39bo$69bob o4b2o$70b2o$109b2o$109bobo$111bo$111b2o7$103b2o$103bo$104b3o$106bo$13b o19b2o$12bobo10b2o6bo5b2o41b2o$11bo2bo10bo8b3obobo41bo$12b2o9bobo10bob o7b2o28b2obo3b3o$23b2o12b2o7b2o28b2ob4o2bo$82bo$64b2o6b2o2b2ob2o$63bob o6bo4bobo$63bo9b4o2bo$62b2o7bobo2bobo$71b2o4bo!]]) local connecting_neck=g.parse([[24bo$22b3o$21bo$21b2o$6b2o$7bo$7bobo$8b2o10bo$19bobo$19bobo$20bo4b2o$ 8b2o15bobo$7bobo17bo$7bo19b2o$6b2o6$17b2o$17b2o7$23b2ob2o$22bobobobo$ 5b2o16bo2bobo$6bo19bob2o$6bobo16b2o3bo$7b2o13bobo2bobo$22b2o2b2ob2o11$ 8b2o15b2o$8b2o15bobo$2o25bo$bo25b2o$bobo$2b2o4$21bo107bo$19b3o106bobo$ 18bo109bobo$18b2o106b3ob2o$24bo100bo$22b3o12bo84bo2b4ob2o$21bo15b3o82b 3o3bob2o$21b2o17bo84bo$39b2o83b2o26b2o$152bo$150bobo$150b2o2$24b2o$5b 2o17b2o76bo$5b2o95b3o6b2o$105bo5b2o41b2obo$104b2o48bob2o$4b2o$5bo141b 2o$2b3o12b2o86b2o40b2o$2bo14bo16b2o6b2o61b2o3b2o$18b3o14bo7bo66b2o$20b o11b3o5b3o$32bo7bo$78bo51b2o3b2o$76b3o13bo38bo3bo$75bo16b3o33b3o5b3o$ 50b2o23b2o18bo32bo9bo$45b2o3b2o42b2o42bobo$45b2o92b2o3$44b2o76b2o$45bo 5b2o69b2o$42b3o6b2o104b2o$42bo41b2o71bo$84b2o69bobo$61b2o92b2o$60bobo 62bo$60bo62b3o$59b2o10b2o49bo$72bo48bobo$69b3o9b2o39bo43b2o$69bo11bo 19b2o56b2o6bo$82bo17bobo56bo6bo$81b2o17bo19b2o35bobo6b2o$99b2o19b2o35b 2o$116b2o$116bo$117b3o24b2o$119bo23bobo$143bo25b2o$142b2o25b2o4$146b2o $145bobo$145bo4b2o$144b2o5bo$148b3o5bo$148bo6bobo$156bo!]]) local transmitter2c3=g.parse([[180b2o$180b2o$219bo$219b3o$178b2o42bo$116bo61b2o41b2o$115bobo47b2o99b 2o14bo$116bo49bo74b2o24bo14b3o$166bobo73bo13b2o6b3o18bo$167b2o73bobo 11b2o6bo19b2o12bo$110b2o51b2o78b2o53b3o$110b2o23b2o26b2o136bo$102b2o 31bo164b2o$103bo29bobo$103bobo27b2o$104b2o4b2o$110b2o162b2o$274b2o$ 144b2o30b2o$102b2o40bo31b2o$102bo39bobo$104bob2o34b2o43b2o144b2o$103b 2ob2o78bo2bo143b2o$124b2o60bobo23b2o57b2o$103b2ob2o16b2o61bo20bo3b2o 57bo20b2o$104bobo100bobo26b2o14b2o3b2o13bo20bo$104bobo99bobo21b2o5bo 15bo3bo13b2o17b3o61b2o$105bo100bo23bobob3o13b3o5b3o29bo63b2o5b2o$205b 2o16b2o7bobo15bo9bo100b2o$223b2o7b2o152b2o6bo$169b2o125b2o84bobo2bo4b 3o$169b2o124bobo61b2o19b3ob2o5bo$295bo63b2o18bo11b2o$294b2o69b2o13b3ob 2o$365b2o15bob2o$131b2o151bo$131b2o149b3o12b2o$281bo16bo91b2o3b2o$271b 2o8b2o12b3o92b2o3b2o$272bo22bo$272bobo27b2o30b2o$273b2o28bo17b2o11b2o$ 39bo82bo136bo27b2o11b3o19bo77bo$38bobo79b3o136b3o25b2o11bo18b3o77bobo$ 39bo79bo142bo56bo80bo$108bo10b2o140b2o$37b5o65bobo228b2o$37bo4bo64bobo 177b2o50bo28b2o$40bo2bo61b3ob2o20bo155b2o47b3o29bo$12bo27b2obo60bo24b 3o204bo29bobo$12b3o10b2o10bo5bob2obo49bo6b3ob2o17bo104bo132b2o$15bo9b 2o9bobo4bobob2o49b3o6bob2o17b2o103b3o146b2o$4b2o8b2o20bo2bo2b2obo30b2o 23bo134bo145b2o$5bo31b2o6bo31bo6b2o14b2o133b2o11b2o13b2o$5bobo37b3o29b obo4b2o39b2o121b2o13b2o$6b2o40bo23b2o4b2o44bo2bo87bo73b2o$47b2o23bobo 50b2o88b3o5b2o64bo$70bobob3o141bo4b2o62bobo$66b2o2b2o5bo139b2o68b2o81b 2o$4bob2o58b2o8b2o292b2o$2b3ob2o384b2o$bo216b2o172bo$2b3ob2o80b2o128b 2o3b2o123b2o15b2o26b3o$4bobo30b2o49b2o23b2o108b2o122bobo15b2o28bo$4bob o30b2o74bo233bo$5bo108b3o229b2o$116bo77b2o7b2o$100b2o24b2o66b2o7bobo$ 28b2o66bo3b2o24bo30b2o42bobob3o$28b2o65bobo29b3o2b2o24bo42b2o5bo40b2o 18b2obo112b2o$34b2o58bobo32bo3bo13b2o6b3o49b2o40bobo17bob2o112bo$34bo 19b2o38bo38bobo11b2o6bo95bo134b3o$30bo5bo16bobo37b2o24b2o13b2o115b2o 135bo$29bobo3b2o16bo65b2o164b2obo$30bo21b2o231bob2o$31b3o$33bo79b2o 163b2o$113b2o163b2o$117b2o46b2o$66b2o49b2o46b2o$66b2o$349b2o$350bo$71b 2o39b2o98b2o136bobo$70bobo39b2o99bo54b2o81b2o$70bo91b2o46b3o56bo105b2o $69b2o91bo47bo58bobo103b2o$143b2o3b2o13bo106b2o$82b2o60bo3bo13b2o$82b 2o57b3o5b3o$141bo9bo40b2o$193bo$27bo162b3o180b2o$26bobo161bo182bo$26bo 2bo262b2o80b3o$27b2o263bo83bo$118b2o22bo147bobo81b2o$119bo20b3o99bo18b o28b2ob2o79bo$116b3o20bo102b3o7b2o5b3o31bobo76bobo$116bo22b2o104bo6b2o 4bo34bobo76b2o$5b2o237b2o12b2o10b2o20b2ob2o$5b2o264bo24bo$9b2o104bo 155bobo18b2obo$9b2o104b3o139b2o13b2o18b2obobo56bo$23b2o93bo133b2o3b2o 37b2o56b3o$23b2o92b2o23b2o108b2o103bo$139b2o2bo212b2o28b2o$139bob2o71b 2o56b2o112bo$141bo71bobo55bobo110bobo$141bo71bo49bo7bo108b2o2b2o$116b 2o18b2obob2o69b2o47b3o5b3o108b2o$35b2o78bobo18b2ob2o2bo116bo7bo$35b2o 78bo26bo117b2o6b2o$13b2o99b2o20b2ob3o$14bo122bobo239b2o4b2o$11b3o123bo 241b2o4b2o$11bo90b2o30b2ob2o$102bo31bobo$100bobo5b2o26bo$99bobo6b2o26b 2o140b2o$95b2o3bo177b2o72b2o35bo$95b2o254bobo33b3o$20b2o69b2o194b2o62b o34bo$21bo70bo194bo62b2o34b2o$18b3o71bobo193b3o63b2o$18bo74b2o195bo63b 2o3bo$233bo47b2o75bobo6b2o$233b3o46bo76bobo5b2o$236bo44bo79bo$235bobo 43b2o78b2o$120b2o4b2o108bo30bo$120b2o4b2o139b3o$270bo$237b2o30b2o8b2o 74bo$237b2o40bo61bo13b3o35b2o$121b2o154bobo59b3o16bo34b2o$121b2o2b2o 150b2o59bo18b2o$125bobo93bo41b2o73b2o$127bo92bobo40b2o26b2o$97b2o28b2o 91bobo68bo23bo72b2o$98bo119b3ob2o65bobo23b3o70b2o$95b3o119bo71b2o27bo 73b2o$95bo118bo2b4ob2o39b2o52b2o73b2o$214b3o3bob2o39b2o$217bo130b2o$ 175bo40b2o26b2o102b2o36b2o$113b2o60b3o66bo126b2o13b2o$113bobo46b2o3b2o 9bo14b2o47bobo126bobo$77bo37bo2bo2bo40b2o3b2o8b2o15bo47b2o43b2o84bo$ 77b3o35b7o71bo93b2o72b2o10b2o$80bo112b2o113b2o51bo$38b2o39b2o36b5o33b 2o151b2o41b2o9b3o$38b2o77bo4bo2b2o29bo174b2o19bo11bo$120bo2bo2bo29bobo 87b2obo81bobo17bo$120b2obobo31b2o87bob2o83bo17b2o$117bo5bob2o194b2o10b 2o$105b2o9bobo4bo72b2o41b2o80bo$105b2o9bo2bo2b2o72b2o41b2o70b2o9b3o$ 117b2o193bo11bo$96b2obo211bo$96bob2o211b2o$160b2o$61b2o98bo60b2o3b2o$ 61b2o8b2o85b3o28b2o32bo3bo$72bo85bo31bo15b2o12b3o5b3o29b2o$69b3o117bo 17bo12bo9bo28bobo$47b2o20bo119b2o13b3o23bobo26bo$48bo155bo26b2o25b2o 14b2o$10b2o33b3o70b2o153bo2bo$10b2o33bo29b2o41b2o154b2o$6bo50b2o15bobo $6b3o48bo16bo98b2o$9bo48b3o12b2o98b2o54b2o$8b2o11bo38bo103b2o64bo$20bo bo7b2o131bobo51b2o11bobo$20bobo7b2o44b2o85bo54bo12b2o$21bo55bo84b2o54b obo$74b3o142b2o2b2o$74bo148b2o$81b2o34b2o$82bo34bobo$18b2o59b3o37bo$ 18b2o59bo39b2o97b2o4b2o$4b2o212b2o4b2o$4b2o$2o$2o162bo$107bob2o3b2o48b 3o$105b3ob2o3bo52bo$104bo10b3o48b2o$105b3ob2o6bo101b2o$107b2o2bo106bob o$110b2o106bo$217b2o2$164b2o$164b2o$188b2o$188bobo$190bo$24b2o164b2o$ 23bobo$24bo4$132bo4b2o$131bobo2bobo7b2o$130bo2b4o9bo$26b2obo100bobo4bo 6bobo$26bob2o99b2ob2o2b2o6b2o$127bo$19b2o103bo2b4ob2o$19b2o103b3o3bob 2o$127bo40b2o$126b2o39bobo$52b2o103bo9bo$52b2o49b2o52b3o5b3o54b2o$104b o55bo3bo57b2o$91bo11bo55b2o3b2o$9b2o39b2o39b3o9b2o$10bo39b2o42bo$10bob o24b2o42b2o10b2o$11b2o25bo43bo150b2o$38bobo41bobo91b2o55bo$39b2o42b2o 91b2o53bobo$35b2o69b2o123b2o$35b2o69b2o75bob2o$29b2o152b2obo$29bo188b 2o$27bobo187bobo$27b2o109b2o77bo$132b2o4bobo75b2o$133bo6bo38b2o$48b2o 66b2o12b3o7b2o37bobo$48b2o47b2o18bo12bo50bo$97bo16b3o36b2o26b2o$59b2o 37b3o13bo39bo$58bo2bo38bo50b3o3bob2o59b2o$58bobo23b2o65bo2b4ob2o58bobo $59bo20bo3b2o68bo64bo$79bobo73b3ob2o57b2o$7b2o69bobo76b2o2bo$7b2o17b2o 50bo81b2o84bo$26b2o49b2o165b3o$243bo$41b2o200b2o$41b2o2$219bo$219b3o$ 222bo$221b2o23b2o$243b2o2bo$243bob2o$245bo$245bo$220b2o18b2obob2o$219b obo18b2ob2o2bo$219bo26bo$218b2o20b2ob3o$241bobo$51bo189bo$12b2o35b3o 186b2ob2o$12b2o34bo189bobo$48b2o190bo$81bo158b2o$81b3o$17b2o65bo$17b2o 64b2o$13b2o$13b2o2$57b2o159b2o$19b2o36b2o158bobo$19b2o13b2o181bo$33bob o180b2o$33bo181bo$32b2o10b2o74bo94b3o$45bo72b3o97bo$42b3o9b2o61bo99b2o $42bo11bo20b2o40b2o17bo39bo$55bo20bo59b3o37b3o$54b2o17b3o63bo39bo$73bo 64b2o38b2o12bo$192b3o$159bo35bo19b2o$79b2o78b3o32b2o19b2o$78bobo81bo 76b2o$78bo82b2o11b2o63bobo$77b2o95b2o65bo$241b2o2$80b2o$81bo$78b3o$78b o$85b2o30b2o$86bo17b2o11b2o$83b3o19bo80b2o$83bo18b3o82bo$102bo81b3o$ 184bo2$153b2o$147b2o5bo20b2o13b2o$147bobob3o21bobo11bobo$140b2o7bobo 25bo11bo$140b2o7b2o26b2o9b2o3$191b2o$192bo$189b3o19b2o21b2o$189bo20bob o21b2o$196b2o12bo17b2o$197bo11b2o17b2o$194b3o$194bo$230b2o$223b2o5b2o$ 223b2o5$89b2o$89b2o8$63bo$62bobo$62bobo$61b2ob2o16b2o$82b2o$61b2ob2o$ 62bob2o34b2o$60bo39bobo$60b2o40bo$102b2o2$68b2o$62b2o4b2o$61bobo27b2o$ 61bo29bobo$60b2o31bo$68b2o23b2o$68b2o$86b2o$82bo3b2o$74bo6bobo$73bobo 4bobo$74bo5bo$79b2o!]]) local head2c3=g.parse("8b2o$3bo2bo2bo$3b6o2$3b6o$2bo6bo$2bo2b5o$obobo$2o2bo$4bo$3b2o!") local body2c3=g.parse("6bo$b6o$o$o2b6o$obo6bo$obo2b5o$b2obo$4bo$4bo$3b2o!") local tail2c3=g.parse("5b2o$5b2o2$b6o$o5bo$o2b3o$obo$o2bo$b2o!") local wire2c3=g.join(g.transform(head2c3,625,388), g.transform(tail2c3,2143,1905)) -- 251 body segments, first one at (631, 395) for i=631,2142,6 do wire2c3=g.join(wire2c3,g.transform(body2c3,i,i-236)) end local receiver2c3=g.parse([[208bo$207bobo$208bo3$213b2o$188b2o23b2o$189bo31b2o$189bobo29bo$190b2o 27bobo$213b2o4b2o$213b2o2$179b2o$180bo40b2o$180bobo39bo$181b2o34b2obo$ 217b2ob2o$199b2o$199b2o16b2ob2o$218bobo$218bobo$219bo8$192b2o$192b2o8$ 55b2o$48b2o5b2o$48b2o$85bo$83b3o$50b2o17b2o11bo$50b2o17bo12b2o$44b2o 21bobo20bo$44b2o21b2o19b3o$87bo$87b2o3$90b2o9b2o26b2o7b2o$90bo11bo25bo bo7b2o$88bobo11bobo21b3obobo$88b2o13b2o20bo5b2o39bo$125b2o45b3o$175bo 14bo$95bo78b2o12b3o$41bo51b3o91bo$41b3o48bo94b2o$44bo47b2o$43b2o$186b 2o$167b2o17b2o$167b2o3$61b2o$61bo$59bobo42b2o$59b2o43b2o11b2o51b2o$ 117bo53bo$84b2o32b3o48bo$42b2o40bo35bo48b2o$42b2o15b2o24b3o85b2o$59bob o25bo12b2o38b2o32bo$61bo38bo39bo30b3o$61b2o38b3o37b3o27bo$103bo39bo3$ 42b2o$42bo$40bobo$40b2o4$57b2obo$57bob2o2$50b2o$50b2o122b2o$173bobo$ 173bo29b2o$172b2o29bobo$205bo$178b2o25b2o$177bobo4b2o$40b2o135bo7bo$ 41bo134b2o4b3o$41bobo138bo$42b2o146b2o$189bobo$189bo$188b2o$61bo$59b3o $58bo$58b2o$206b2o$182bo23bobo$63b2o117b3o23bo$63b2o120bo22b2o$184b2o 14b2o$200b2o$73b2o$73bo$71bobo$71b2o$34b2o$33bobo$33bo$32b2o2$44b2o$ 44b2o$160b2o7b2o30b2o$92b2o66b2o7bobo29bobo$92b2o45bo27bobob3o29bo$ 139b3o25b2o5bo28b2o$142bo30b2o$90b2o49b2o$49b2o39b2o$48bobo26b2o43bo$ 48bo29bo43b3o$47b2o29bobo44bo$79b2o43b2o11b2o$75b2o60b2o$75b2o4$177b2o 21b2o$66b2o108bobo21b2o$66bo109bo17b2o$64bobo21b2o85b2o17b2o$48b2o14b 2o22b2o$48b2o93b2o$52bo46b2o39b2o2bo2b2o47b2o$48b2o2b3o43bo2bo38b2obo 3bo41b2o5b2o$48b2o5bo42bobo23b2o17bobobo10b2o29b2o$54b2o43bo20bo3b2o 14b2obob2o12bo$119bobo12b2o4bo2bo12b3o$118bobo13b2o6b2o12bo$67b2o49bo$ 66bobo48b2o$67bo$81b2o$81b2o4$47b2o$47b2o5$49bo$19b2o28b3o$12b2o5b2o 31bo92bo$12b2o37b2o90b3o11bo$47b2o93bo14b3o$47bo94b2o16bo14bo$14b2o33b o109b2o12b3o$14b2o32b2o69bo52bo$8b2o109b3o50b2o$8b2o112bo$121b2o$171b 2o$152b2o17b2o$45b2o105b2o$45b2o17b2o$64b2o3$65b2o$65bo89b2o$52b2o12b 3o41bo23b2o20bo$35b2o16bo14bo40bobo22bo19bo$35bo14b3o57bo14b2o8b3o16b 2o$28bo7b3o11bo74bo11bo20b2o$26b3o9bo87b3o30bo$25bo102bo27b3o$25b2o 129bo$17b2o93b2o$17b2o92bobo$111bo$110b2o62b2o$126b2obo44bobo$126bob2o 46bo$176b2o$34b2o83b2o$34bo84b2o$32bobo$32b2o3$166b2o$166b2o2$157b2obo $157bob2o2$36b2o$36bobo$38bo91b2o44b2o$38b2o90bo44bobo$28b2o98bobo44bo $28b2o98b2o44b2o$9bob2o$9b2obo2$18b2o135b2o$18b2o136bo$156bobo$157b2o 15b2o$114b2o58b2o$114bo2b2o$115b2obo$116bo40b2o$28b2o86bobo4b2o31bobo$ 28bo88b2o5bo31bo$26bobo94bo31b2o$26b2o68b2o25b2o$70bo25bo$58bo11b3o21b obo$56b3o14bo20b2o$40bo14bo16b2o$40b3o12b2o70b2o44b2o$43bo58b2o24bo44b o$4b2o36b2o59bo13b2o6b3o46b3o$5bo97bobo11b2o6bo50bo$5bobo96b2o$3b2ob2o 35b2o$2bobo38b2o17b2o$2bobo57b2o$b2ob2o20b2o$bo24bo$2bob2o18bobo108b2o $obob2o18b2o109b2o$2o$59b2o32b2o$59bo20b2o11b2o$24b2o35bo19bo67b2o21b 2o$24bobo33b2o16b3o67bobo21b2o$26bo29b2o20bo53b2o14bo17b2o$26b3o27bo 75bo14b2o17b2o$29bo27b3o37b2o14b2o3b2o13bo$28b2o29bo38bo15bo3bo13b2o$ 95b3o13b3o5b3o46b2o$95bo15bo9bo39b2o5b2o$161b2o4$18b2o$18b2o2$9b2o$10b o$7b3o45b2o$7bo47b2o$15b2o32b2o$15bo33b2o$16bo$15b2o$51b2o$44b2o5b2o$ 44b2o!]]) local inserter2c3=g.parse([[51bo$49b3o$23b2o23bo$24bo23b2o$24bobo$25b2o2b2o37bo$29b2o35b3o15bo9bo$ 65bo18b3o5b3o$52b2o11b2o20bo3bo$52b2o32b2o3b2o8$23b2o52b2o$22bobo16b2o 34b2o$22bo18bobo45b2o$21b2o20bo44bo2bo$37b2o4b2o44b2o4b2o$37bo2bo54bob o$39b2o56bo$30b2o65b2o$30b2o20b2o33b2o$53bo34bo$50b3o32b3o$50bo34bo2$ 19bo$19b3o$22bo$21b2o2$85b2o$85bo$86b3o$88bo2$40b2o$40bo$38bobo$38b2o 12$20b2o15b2o$19bobo15b2o$19bo$18b2o6$25bo$25b3o$28bo$27b2o28b2o$57bo$ 55bobo$51b2o2b2o$51b2o4$50b2o4b2o$50b2o4b2o5$23b2o35bo$22bobo33b3o$22b o34bo$21b2o34b2o$25b2o$25b2o3bo$29bobo6b2o$30bobo5b2o$32bo$32b2o$24b2o $25bo$25bobo$26b2o2b2o$30b2o32b2o$64b2o4$59b2o$59b2o$63b2o$63b2o3$24b 2o31b2o$23bobo16b2o13b2o$23bo18bobo$22b2o20bo$38b2o4b2o$38bo2bo$40b2o$ 31b2o$31b2o7$21b2o$22bo$22bobo$23b2o$39bo$37b3o$36bo$36b2o3$10b2o$10b 2o7$43b2o$43b2o4$38b2o$38b2o$2o40b2o$2o40b2o3$36b2o$21b2o13b2o$21bobo$ 23bo$23b2o!]]) local all = g.join(g.transform(highway_robber,86,0), g.join(g.transform(connecting_neck,195,262), g.join(g.transform(transmitter2c3,347,219), g.join(wire2c3, g.join(g.transform(receiver2c3,2103,1763), g.transform(inserter2c3,2024,2042)))))) g.new("Stable Pseudo-Heisenburp Device") -- ??? g.setalgo("HashLife") g.setrule("B3/S23") g.putcells(all) g.setmag(0) g.setpos("120","200") g.setname("Highway Robber") g.clone() g.setname("2c/3 Transmitter") g.setpos("500","400") g.clone() g.setname("2c/3 Receiver") g.setpos("2175","2000") g.clone() g.setname("Stable Pseudo-Heisenburp Device") g.clone() g.setname("Glider Fleet") g.setpos("330","290") -- since the tiles change size depending on how many layers have been created, -- have to create all five layers before checking visibility of components -- -- now go back and check that the critical areas are all visible. -- Could instead select each key rectangle, use g.fitsel(), then unselect. g.setlayer(0) while not g.visrect( {100,100,150,175} ) do g.setmag(g.getmag()-1) end g.setlayer(1) while not g.visrect( {350,225,400,350} ) do g.setmag(g.getmag()-1) end g.setlayer(2) while not g.visrect( {2100,1750,225,300} ) do g.setmag(g.getmag()-1) end g.setlayer(3) g.fit() g.setlayer(4) while not g.visrect( {0,200,300,400} ) do g.setmag(g.getmag()-1) end g.update() end ------------------------------------------------------- function burp() local test_signal=g.parse([[40bo$41bo$39b3o17$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o 2b3o3$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo 4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo4bo4bo4bo$41b o4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$bo38bo4bo4bo4bo4bo18bo$2bo38bo4bo 4bo4bo4bo18bo$3o36b3o2b3o2b3o2b3o2b3o16b3o37$40bo$41bo$39b3o!]]) prepare_burp() g.show(instr..tickstep) g.select( {selx,sely,50,50} ) -- keyboard handling local ch = "" while ch~="q" do if place_signal>0 then if ticks-last_signal>1846 then g.putcells(test_signal,-150,60) last_signal=ticks place_signal=place_signal-1 end end local status_text=instr if place_signal>0 and run_flag==1 then status_text="Next signal placement in "..(1847 - ticks + last_signal).." ticks. " local plural="s" if place_signal==2 then plural="" end if place_signal>1 then status_text=status_text..(place_signal-1).." more signal"..plural.." requested after that. " end status_text=status_text..instr end show_status_text(status_text,delay,tickstep) local event = g.getevent() if event:find("key") == 1 then _, ch, _ = split(event) else ch = "" end if ch=="r" then prepare_burp() ticks=0 last_signal=-99999 viewport_speed=16 sel_speed=0 run_flag=0 selx=600.0 sely=365.0 place_signal=3 g.select({selx,sely,50,50}) elseif ch=="h" then g.note(helpstring) elseif ch=="t" then g.setoption("tilelayers",1-g.getoption("tilelayers")) elseif ch=="=" or ch=="+" then if delay>.01 then delay=delay/2 elseif delay==.01 then delay=-1 else if tickstep==1 then tickstep=3 elseif tickstep<250 then tickstep=(tickstep-1)*2+1 end end elseif ch=="-" or ch=="_" then if delay==-1 then if tickstep==1 then delay=.01 else if tickstep==3 then tickstep=1 else tickstep=math.floor((tickstep-1)/2)+1 end end else if delay<1 then delay=delay*2 end end elseif ch=="space" then run_flag=0 elseif ch=="return" then run_flag=1-run_flag elseif ch=="s" then place_signal=place_signal+1 if run_flag==0 then run_flag=1 end else g.doevent(event) end -- generation and selection speed handling if ch=="space" or run_flag==1 then g.run(tickstep) currlayer = g.getlayer() if currlayer ~= 4 then -- user has switched layer so temporarily change it back -- so we only change location of bottom right layer g.check(false) g.setlayer(4) end x, y = g.getpos() x, y = tonumber(x), tonumber(y) oldticks=ticks ticks=ticks+tickstep delta_view=math.floor(ticks/viewport_speed) - math.floor(oldticks/viewport_speed) if delta_view ~= 0 then g.setpos(tostring(x + delta_view), tostring(y + delta_view)) end sel = g.getselrect() if #sel ~= 0 then x, y, w, h = table.unpack(sel) if math.floor(selx)~=x then selx,sely=x,y else selx=selx+sel_speed*tickstep sely=sely+sel_speed*tickstep g.select( {math.floor(selx), math.floor(sely), w, h} ) end else g.select({math.floor(selx), math.floor(sely), 50, 50}) end if currlayer ~= 4 then g.setlayer(currlayer) g.check(true) end -- change viewport speed at appropriate times to follow the action if oldticks<4570 and ticks>=4570 then sel_speed=.666667 -- one-time correction to catch up with the signal at high sim speeds g.select( {math.floor(600+(ticks-4570)*1.5), math.floor(365+(ticks-4570)*1.5), w, h} ) end if selx>2125 then sel_speed=0 g.select( {2125, math.floor(sely+2125-selx), w, h} ) end if oldticks<4750 and ticks>=4750 then viewport_speed=1.5 end if oldticks<6125 and ticks>=6125 then viewport_speed=16 end if oldticks>=11995 then viewport_speed=99999.9 end -- stop automatically after the last signal passes through the device if oldticks-last_signal<8705 and ticks-last_signal>=8705 then run_flag=0 end if run_flag==1 and delay>0 then sleep(delay) end g.update() end end end ------------------------------------------------------- -- if there's more than one existing layer, the layout won't work correctly if g.numlayers() > 1 then local answer = g.getstring("All existing layers will be removed. OK?") if string.lower(string.sub(answer,1,1)) == "n" then g.exit() end end local oldswitch = g.setoption("switchlayers", 1) -- allow user to switch layers local oldtile = g.setoption("tilelayers", 1) local status, err = xpcall(burp, gp.trace) if err then g.continue(err) end -- the following code is executed even if error occurred or user aborted script -- remove the cloned layers added by the script while g.numlayers() > 1 do g.dellayer() end g.setname("Stable Pseudo-Heisenburp Device") g.setoption("tilelayers", oldtile) g.setoption("switchlayers", oldswitch) g.show("") golly-3.3-src/Scripts/Lua/oscar.lua0000755000175000017500000001376613441044674014224 00000000000000-- Oscar is an OSCillation AnalyzeR for use with Golly. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016. -- -- This script uses Gabriel Nivasch's "keep minima" algorithm. -- For each generation, calculate a hash value for the pattern. Keep all of -- the record-breaking minimal hashes in a list, with the oldest first. -- For example, after 5 generations the saved hash values might be: -- -- 8 12 16 24 25, -- -- If the next hash goes down to 13 then the list can be shortened: -- -- 8 12 13. -- -- If the current hash matches one of the saved hashes, it is highly likely -- the pattern is oscillating. By keeping a corresponding list of generation -- counts we can calculate the period. We also keep lists of population -- counts and bounding boxes to reduce the chance of spurious oscillator -- detection due to hash collisions. The bounding box info also allows us -- to detect moving oscillators (spaceships/knightships). local g = golly() -- initialize lists local hashlist = {} -- for pattern hash values local genlist = {} -- corresponding generation counts local poplist = {} -- corresponding population counts local boxlist = {} -- corresponding bounding boxes -- check if outer-totalistic rule has B0 but not S8 local r = g.getrule() r = string.match(r, "^(.+):") or r local hasB0notS8 = r:find("B0") == 1 and r:find("/") > 1 and r:sub(-1,-1) ~= "8" -------------------------------------------------------------------------------- local function show_spaceship_speed(period, deltax, deltay) -- we found a moving oscillator if deltax == deltay or deltax == 0 or deltay == 0 then local speed = "" if deltax == 0 or deltay == 0 then -- orthogonal spaceship if deltax > 1 or deltay > 1 then speed = speed..(deltax + deltay) end else -- diagonal spaceship (deltax == deltay) if deltax > 1 then speed = speed..deltax end end if period == 1 then g.show("Spaceship detected (speed = "..speed.."c)") else g.show("Spaceship detected (speed = "..speed.."c/"..period..")") end else -- deltax != deltay and both > 0 local speed = deltay..","..deltax if period == 1 then g.show("Knightship detected (speed = "..speed.."c)") else g.show("Knightship detected (speed = "..speed.."c/"..period..")") end end end -------------------------------------------------------------------------------- local function oscillating() -- return true if the pattern is empty, stable or oscillating -- first get current pattern's bounding box local pbox = g.getrect() if #pbox == 0 then g.show("The pattern is empty.") return true end local h = g.hash(pbox) -- determine where to insert h into hashlist local pos = 1 local listlen = #hashlist while pos <= listlen do if h > hashlist[pos] then pos = pos + 1 elseif h < hashlist[pos] then -- shorten lists and append info below for i = 1, listlen - pos + 1 do table.remove(hashlist) table.remove(genlist) table.remove(poplist) table.remove(boxlist) end break else -- h == hashlist[pos] so pattern is probably oscillating, but just in -- case this is a hash collision we also compare pop count and box size local rect = boxlist[pos] if tonumber(g.getpop()) == poplist[pos] and pbox[3] == rect[3] and pbox[4] == rect[4] then local period = tonumber(g.getgen()) - genlist[pos] if hasB0notS8 and (period % 2) > 0 and pbox[1] == rect[1] and pbox[2] == rect[2] and pbox[3] == rect[3] and pbox[4] == rect[4] then -- ignore this hash value because B0-and-not-S8 rules are -- emulated by using different rules for odd and even gens, -- so it's possible to have identical patterns at gen G and -- gen G+p if p is odd return false end if pbox[1] == rect[1] and pbox[2] == rect[2] and pbox[3] == rect[3] and pbox[4] == rect[4] then -- pattern hasn't moved if period == 1 then g.show("The pattern is stable.") else g.show("Oscillator detected (period = "..period..")") end else local deltax = math.abs(rect[1] - pbox[1]) local deltay = math.abs(rect[2] - pbox[2]) show_spaceship_speed(period, deltax, deltay) end return true else -- look at next matching hash value or insert if no more pos = pos + 1 end end end -- store hash/gen/pop/box info at same position in various lists table.insert(hashlist, pos, h) table.insert(genlist, pos, tonumber(g.getgen())) table.insert(poplist, pos, tonumber(g.getpop())) table.insert(boxlist, pos, pbox) return false end -------------------------------------------------------------------------------- local function fit_if_not_visible() -- fit pattern in viewport if not empty and not completely visible local r = g.getrect() if #r > 0 and not g.visrect(r) then g.fit() end end -------------------------------------------------------------------------------- g.show("Checking for oscillation... (hit escape to abort)") local oldsecs = os.clock() while not oscillating() do g.run(1) local newsecs = os.clock() if newsecs - oldsecs >= 1.0 then -- show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() end end fit_if_not_visible() golly-3.3-src/Scripts/Lua/pop-plot.lua0000755000175000017500000002540213451370074014652 00000000000000-- Run the current pattern for a given number of steps (using current -- step size) and create a plot of population vs time in an overlay -- that can be saved in a PNG file. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Oct 2016. local g = golly() -- require "gplus.strict" local gp = require "gplus" local int = gp.int local min = gp.min local max = gp.max local op = require "oplus" local ov = g.overlay local ovt = g.ovtable local opacity = 80 -- initial opacity for bgcolor (as a percentage) local bgcolor = "rgba 255 255 255 " -- white background (alpha will be appended) local axiscolor = "rgba 0 0 0 255" -- black axes local textcolor = "rgba 0 0 0 255" -- black text local plotcolor = "rgba 0 0 255 255" -- blue plot lines local xlen = 500 -- length of x axis local ylen = 500 -- length of y axis local tborder = 40 -- border above plot local bborder = 80 -- border below plot local lborder = 80 -- border left of plot local rborder = 80 -- border right of plot -- width and height of overlay local owd = xlen + lborder + rborder local oht = ylen + tborder + bborder local pops = {} -- store population counts local gens = {} -- store generation counts local numsteps = xlen local stepsize = string.format("%d^%d", g.getbase(), g.getstep()) local pattname = g.getname() -- offsets to origin of axes local originx = lborder local originy = tborder + ylen local lines = true -- draw connected lines -- these controls are created in create_overlay local sbutt, cbutt -- Save and Cancel buttons local lbox -- check box for toggling lines local oslider -- slider for adjusting opacity local controlht -- height of area containing the controls -- initial directory for the save dialog local initdir = g.getdir("data") -- user settings are stored in this file local settingsfile = g.getdir("data").."pop-plot.ini" -------------------------------------------------------------------------------- local function read_settings() local f = io.open(settingsfile, "r") if f then -- must match order in write_settings numsteps = tonumber(f:read("*l")) or xlen opacity = tonumber(f:read("*l")) or 80 lines = (f:read("*l") or "true") == "true" initdir = f:read("*l") or g.getdir("data") f:close() end end -------------------------------------------------------------------------------- local function write_settings() local f = io.open(settingsfile, "w") if f then -- must match order in read_settings f:write(tostring(numsteps).."\n") f:write(tostring(opacity).."\n") f:write(tostring(lines).."\n") f:write(initdir.."\n") f:close() end end -------------------------------------------------------------------------------- local function maketext(s) -- convert given string to text in default font and return -- its width and height for later use by pastetext local wd, ht = gp.split(ov("text textclip "..s)) return tonumber(wd), tonumber(ht) end -------------------------------------------------------------------------------- local function pastetext(x, y, transform) transform = transform or op.identity -- text background is transparent so paste needs to use alpha blending ov("blend 1") ov(transform) ovt{"paste", x+originx, y+originy, "textclip"} ov(op.identity) ov("blend 0") end -------------------------------------------------------------------------------- local function fit_if_not_visible() -- fit pattern in viewport if not empty and not completely visible local r = g.getrect() if #r > 0 and not g.visrect(r) then g.fit() end end -------------------------------------------------------------------------------- local function drawline(x1, y1, x2, y2) ovt{"line", x1+originx, y1+originy, x2+originx, y2+originy} end -------------------------------------------------------------------------------- local function drawdot(x, y) -- draw a small "+" mark x = x + originx y = y + originy ovt{"set", x, y, x-1, y, x+1, y, x, y-1, x, y+1} end -------------------------------------------------------------------------------- local function run_pattern() if g.empty() then g.exit("There is no pattern.") end -- prompt user for number of steps local s = g.getstring("Enter the number of steps:", numsteps, "Population plotter") if #s == 0 then g.exit() end s = tonumber(s) if s and s > 0 then numsteps = int(s) else g.exit("Number of steps must be > zero.") end -- generate pattern for given number of steps pops[#pops+1] = tonumber(g.getpop()) gens[#gens+1] = tonumber(g.getgen()) local oldsecs = os.clock() for i = 1, numsteps do g.step() pops[#pops+1] = tonumber(g.getpop()) gens[#gens+1] = tonumber(g.getgen()) local newsecs = os.clock() if newsecs - oldsecs >= 1.0 then -- show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() g.show(string.format("Step %d of %d", i, numsteps)) end end fit_if_not_visible() g.show(" ") end -------------------------------------------------------------------------------- local function draw_plot() -- fill area above control bar with background color ov(bgcolor..int(255*opacity/100+0.5)) ovt{"fill", 0, 0, owd, (oht-controlht)} local minpop = min(pops) local maxpop = max(pops) if minpop == maxpop then -- avoid division by zero minpop = minpop - 1 end local popscale = (maxpop - minpop) / ylen local mingen = min(gens) local maxgen = max(gens) local genscale = (maxgen - mingen) / xlen -- draw axes ov(axiscolor) drawline(0, 0, xlen, 0) drawline(0, 0, 0, -ylen) -- add annotation using the overlay's default font ov(textcolor) local wd, ht = maketext(string.upper(pattname)) pastetext(int((xlen - wd) / 2), -ylen - 10 - ht) wd, ht = maketext("POPULATION") -- rotate this text 90 degrees anticlockwise pastetext(-10 - ht, int(-(ylen - wd) / 2), op.racw) wd, ht = maketext(""..minpop) pastetext(-wd - 10, int(-ht / 2)) wd, ht = maketext(""..maxpop) pastetext(-wd - 10, -ylen - int(ht / 2)) wd, ht = maketext("GENERATION (step="..stepsize..")") pastetext(int((xlen - wd) / 2), 10) wd, ht = maketext(""..mingen) pastetext(int(-wd / 2), 10) wd, ht = maketext(""..maxgen) pastetext(xlen - int(wd / 2), 10) -- plot the data (it could take a while if numsteps is huge) ov(plotcolor) local x = int((gens[1] - mingen) / genscale) local y = int((pops[1] - minpop) / popscale) local oldsecs = os.clock() for i = 1, numsteps do local newx = int((gens[i+1] - mingen) / genscale) local newy = int((pops[i+1] - minpop) / popscale) if lines then drawline(x, -y, newx, -newy) else drawdot(newx, -newy) end x = newx y = newy local newsecs = os.clock() if newsecs - oldsecs >= 1.0 then -- update plot every second oldsecs = newsecs g.update() end end g.update() end -------------------------------------------------------------------------------- local function do_save() -- called if Save button is clicked -- remove any existing extension from pattern name and append .png local initfile = gp.split(pattname,"%.")..".png" -- prompt for file name and location local pngpath = g.savedialog("Save as PNG file", "PNG (*.png)|*.png", initdir, initfile) if #pngpath > 0 then -- save overlay (minus controls) in given file ov("save 0 0 "..owd.." "..(oht-controlht).." "..pngpath) g.show("Population plot was saved in "..pngpath) -- update initdir by stripping off the file name local pathsep = g.getdir("app"):sub(-1) initdir = pngpath:gsub("[^"..pathsep.."]+$","") end end -------------------------------------------------------------------------------- local function toggle_lines() -- called if check box is clicked lines = not lines draw_plot() end -------------------------------------------------------------------------------- local function show_opacity() -- show opacity % at right end of slider ov(textcolor) local wd, ht = maketext(""..opacity.."%") ov(bgcolor..255) local x = oslider.x + oslider.wd + 2 local y = oht-oslider.ht-10 + int((oslider.ht-ht)/2) ovt{"fill", x, y, 50, ht} pastetext(x - originx, y - originy) end -------------------------------------------------------------------------------- local function do_slider(newval) -- called if oslider position has changed opacity = newval show_opacity() draw_plot() end -------------------------------------------------------------------------------- local function create_overlay() -- create overlay in middle of current layer ov("create "..owd.." "..oht) ov("position middle") -- create the Save and Cancel buttons op.textshadowx = 2 op.textshadowy = 2 sbutt = op.button("Save as PNG", do_save) cbutt = op.button("Cancel", g.exit) -- create a check box for showing lines or dots op.textshadowx = 0 op.textshadowy = 0 lbox = op.checkbox("Lines", op.black, toggle_lines) -- create a slider for adjusting opacity of background oslider = op.slider("Opacity:", op.black, 101, 0, 100, do_slider) controlht = 20 + sbutt.ht end -------------------------------------------------------------------------------- local function draw_controls() ov(bgcolor..255) ovt{"fill", 0, (oht-controlht), owd, controlht} -- show the Save and Cancel buttons at bottom right corner of overlay sbutt.show(owd-cbutt.wd-sbutt.wd-20, oht-sbutt.ht-10) cbutt.show(owd-cbutt.wd-10, oht-cbutt.ht-10) -- show the check box at bottom left corner of overlay lbox.show(10, oht-lbox.ht-10, lines) -- show slider to right of check box oslider.show(10+lbox.wd+70, oht-oslider.ht-10, opacity) show_opacity() end -------------------------------------------------------------------------------- function main() read_settings() run_pattern() create_overlay() draw_controls() draw_plot() -- wait for user to hit escape or click Cancel button while true do local event = op.process( g.getevent() ) -- event is empty if op.process handled the given event (eg. button click) if #event > 0 then g.doevent(event) end end end -------------------------------------------------------------------------------- local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed ov("delete") write_settings() golly-3.3-src/Scripts/Lua/tile-with-clip.lua0000755000175000017500000000400712773066602015736 00000000000000-- Tile current selection with clipboard pattern. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016. local g = golly() local gp = require "gplus" -- assume one-state cell array (may change below) local multistate = false -------------------------------------------------------------------------------- local function clip_rb(cells, right, bottom) -- set given cells except those outside given right and bottom edges local len = #cells local x = 1 local y = 2 if multistate then -- ignore padding int if present if len % 3 == 1 then len = len - 1 end while x <= len do if (cells[x] <= right) and (cells[y] <= bottom) then g.setcell(cells[x], cells[y], cells[x+2]) end x = x + 3 y = y + 3 end else while x <= len do if (cells[x] <= right) and (cells[y] <= bottom) then g.setcell(cells[x], cells[y], 1) end x = x + 2 y = y + 2 end end end -------------------------------------------------------------------------------- local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end -- get selection edges local selleft, seltop, selright, selbottom = gp.getedges(selrect) local pwidth, pheight, p = g.getclip() if #p & 1 == 1 then multistate = true end g.clear(0) if #p > 0 then -- tile selrect with p, clipping right & bottom edges if necessary local y = seltop while y <= selbottom do local bottom = y + pheight - 1 local x = selleft while x <= selright do local right = x + pwidth - 1 if (right <= selright) and (bottom <= selbottom) then g.putcells(p, x, y) else local tempcells = g.transform(p, x, y) clip_rb(tempcells, selright, selbottom) end x = x + pwidth end y = y + pheight end end if not g.visrect(selrect) then g.fitsel() end golly-3.3-src/Scripts/Lua/tile.lua0000755000175000017500000001107212773066602014040 00000000000000-- Tile current selection with pattern inside selection. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016. local g = golly() local gp = require "gplus" local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end local selpatt = g.getcells(selrect) if #selpatt == 0 then g.exit("No pattern in selection.") end -- determine if selpatt is one-state or multi-state local inc = 2 if (#selpatt & 1) == 1 then inc = 3 end -------------------------------------------------------------------------------- local function clip_left(cells, left) local len = #cells local x = 1 if inc == 3 then -- ignore padding int if present if len % 3 == 1 then len = len - 1 end while x <= len do if cells[x] >= left then g.setcell(cells[x], cells[x+1], cells[x+2]) end x = x + 3 end else while x <= len do if cells[x] >= left then g.setcell(cells[x], cells[x+1], 1) end x = x + 2 end end end -------------------------------------------------------------------------------- local function clip_right(cells, right) local len = #cells local x = 1 if inc == 3 then -- ignore padding int if present if len % 3 == 1 then len = len - 1 end while x <= len do if cells[x] <= right then g.setcell(cells[x], cells[x+1], cells[x+2]) end x = x + 3 end else while x <= len do if cells[x] <= right then g.setcell(cells[x], cells[x+1], 1) end x = x + 2 end end end -------------------------------------------------------------------------------- local function clip_top(cells, top) local len = #cells local y = 2 if inc == 3 then -- ignore padding int if present if len % 3 == 1 then len = len - 1 end while y <= len do if cells[y] >= top then g.setcell(cells[y-1], cells[y], cells[y+1]) end y = y + 3 end else while y <= len do if cells[y] >= top then g.setcell(cells[y-1], cells[y], 1) end y = y + 2 end end end -------------------------------------------------------------------------------- local function clip_bottom(cells, bottom) local len = #cells local y = 2 if inc == 3 then -- ignore padding int if present if len % 3 == 1 then len = len - 1 end while y <= len do if cells[y] <= bottom then g.setcell(cells[y-1], cells[y], cells[y+1]) end y = y + 3 end else while y <= len do if cells[y] <= bottom then g.setcell(cells[y-1], cells[y], 1) end y = y + 2 end end end -------------------------------------------------------------------------------- -- get selection edges local selleft, seltop, selright, selbottom = gp.getedges(selrect) -- find selpatt's minimal bounding box local bbox = gp.getminbox(selpatt) local i -- first tile selpatt horizontally, clipping where necessary local left = bbox.x local right = left + bbox.wd - 1 i = 0 while left > selleft do left = left - bbox.wd i = i + 1 if left >= selleft then g.putcells(selpatt, -bbox.wd * i, 0) else local tempcells = g.transform(selpatt, -bbox.wd * i, 0) clip_left(tempcells, selleft) end end i = 0 while right < selright do right = right + bbox.wd i = i + 1 if right <= selright then g.putcells(selpatt, bbox.wd * i, 0) else local tempcells = g.transform(selpatt, bbox.wd * i, 0) clip_right(tempcells, selright) end end -- get new selection pattern and tile vertically, clipping where necessary selpatt = g.getcells(selrect) bbox = gp.getminbox(selpatt) local top = bbox.y local bottom = top + bbox.ht - 1 i = 0 while top > seltop do top = top - bbox.ht i = i + 1 if top >= seltop then g.putcells(selpatt, 0, -bbox.ht * i) else local tempcells = g.transform(selpatt, 0, -bbox.ht * i) clip_top(tempcells, seltop) end end i = 0 while bottom < selbottom do bottom = bottom + bbox.ht i = i + 1 if bottom <= selbottom then g.putcells(selpatt, 0, bbox.ht * i) else local tempcells = g.transform(selpatt, 0, bbox.ht * i) clip_bottom(tempcells, selbottom) end end if not g.visrect(selrect) then g.fitsel() end golly-3.3-src/Scripts/Lua/density.lua0000755000175000017500000000061412706123635014556 00000000000000-- Calculates the density of live cells in the current pattern. -- Author: Andrew Trevorrow (andrew@trevorrow.com), March 2016. local g = golly() local bbox = g.getrect() if #bbox == 0 then g.exit("The pattern is empty.") end local d = g.getpop() / (bbox[3] * bbox[4]) if d < 0.000001 then g.show(string.format("Density = %.1e", d)) else g.show(string.format("Density = %.6f", d)) end golly-3.3-src/Scripts/Lua/3D.lua0000755000175000017500000104231213543255652013354 00000000000000--[[ This script lets people explore three-dimensional cellular automata using Golly. Inspired by the work of Carter Bays and his colleagues (see http://www.cse.sc.edu/~bays/d4d4d4/). The 3D drawing is based on code in "Macintosh Graphics in Modula-2" by Russell L. Schnapp. Note that orthographic projection is used to speed up rendering (because all live cells look the same at a given scale and rotation). Author: Andrew Trevorrow (andrew@trevorrow.com), Feb 2018. Thanks to Tom Rokicki for optimizing the generating code. Thanks to Chris Rowett for optimizing the rendering code and many other improvements. This script uses custom purpose ovtable commmands for increased performance when computing the next generation and displaying cells: nextgen3d compute next generation setrule3d set the rule for next generation calculation setsize3d set the grid size setstep3d set the step size modulus settrans3d set the transformation matrix displaycells3d display current grid setcelltype3d set the cell shape for drawing setdepthshading3d set whether depth shading should be used setpattern3d set the current pattern setselpasact3d set the select, paste and active grids sethistory3d set the cell history display mode --]] local g = golly() -- require "gplus.strict" local gp = require "gplus" local int = gp.int local round = gp.round local validint = gp.validint local split = gp.split local ov = g.overlay local ovt = g.ovtable local op = require "oplus" local DrawLine = op.draw_line local sin = math.sin local cos = math.cos local sqrt = math.sqrt local rand = math.random local abs = math.abs local min = math.min local max = math.max local floor = math.floor math.randomseed(os.time()) -- init seed for math.random local N = 0 -- current grid size (N*N*N cells) local DEFAULTN = 30 -- default grid size local MINN = 3 -- minimum grid size local MAXN = 100 -- maximum grid size (must be even for BusyBoxes) local BORDER = 2 -- space around live cubes local MINSIZE = 1+BORDER*2 -- minimum size of empty cells local MAXSIZE = 100 -- maximum size of empty cells local CELLSIZE = 15 -- initial size of empty cells local ZOOMSIZE = CELLSIZE -- used for mouse wheel zoom local HALFCELL = CELLSIZE/2.0 -- for drawing mid points of cells local LEN = CELLSIZE-BORDER*2 -- edge length of live cubes local DEGTORAD = math.pi/180.0 -- converts degrees to radians local HISTORYOFF = 0 -- history off local DEFAULTHISTORY = 100 -- default history longevity local MINHISTORYALPHA = 12 -- minimum history alpha value when fading -- MIDGRID is used to ensure that rotation occurs about the -- mid point of the middle cube in the grid local MIDGRID = (N+1-(N%2))*HALFCELL local MIDCELL = HALFCELL-MIDGRID -- these global strings can be changed by a startup script to customize colors BACK_COLOR = "rgba 0 0 80 255" -- for background LINE_COLOR = "rgba 70 70 100 255" -- for lattice lines (should be close to BACK_COLOR) INFO_COLOR = op.white -- for info text MSG_COLOR = op.yellow -- for message text POINT_COLOR = op.white -- for drawing points SELPT_COLOR = "rgba 0 255 0 128" -- for selected points (should be translucent) PASTE_COLOR = "rgba 255 0 0 64" -- for paste pattern (must be translucent) SELECT_COLOR = "rgba 0 255 0 64" -- for selected cells (ditto) ACTIVE_COLOR = "rgba 0 0 255 48" -- for active plane (ditto) HISTORY_COLOR = "rgba 240 240 0 64" -- for history cells (ditto) PASTE_MENU = "rgba 176 48 48 255" -- for paste menu background (should match PASTE_COLOR) SELECT_MENU = "rgba 0 128 0 255" -- for select menu background (should match SELECT_COLOR) X_COLOR = op.red -- for front X axes Y_COLOR = op.green -- for front Y axes Z_COLOR = op.blue -- for front Z axes REARX_COLOR = "rgba 128 0 0 255" -- for rear X axes (should be darker than front axes) REARY_COLOR = "rgba 0 128 0 255" -- for rear Y axes (ditto) REARZ_COLOR = "rgba 0 0 128 255" -- for rear Z axes (ditto) START_COLOR = "rgba 0 150 0 255" -- for Start button's background SELSTART_COLOR = "rgba 0 90 0 255" -- for Start button's selected background STOP_COLOR = "rgba 210 0 0 255" -- for Stop button's background SELSTOP_COLOR = "rgba 150 0 0 255" -- for Stop button's selected background -- following are for BusyBoxes EVEN_COLOR = "rgba 255 180 255 255" -- for even cell points and spheres (pale magenta) ODD_COLOR = "rgba 140 255 255 255" -- for odd cell points and spheres (pale cyan) EVEN_CUBE = "replace *# *#-50 *# *#" -- for even cell cubes (change white to pale magenta) ODD_CUBE = "replace *#-110 *# *# *#" -- for odd cell cubes (change white to pale cyan) local xylattice = {} -- lattice lines between XY axes local xzlattice = {} -- lattice lines between XZ axes local yzlattice = {} -- lattice lines between YZ axes local xaxes = {} -- four X axes local yaxes = {} -- four Y axes local zaxes = {} -- four Z axes local update_grid = false -- need to call setpattern3d? local grid1 = {} -- sparse 3D matrix with up to N*N*N live cells local popcount = 0 -- number of live cells local pattname = "untitled" -- pattern name local currtitle = "" -- current window title local showaxes = true -- draw axes? local showlines = true -- draw lattice lines? local generating = false -- generate pattern? local gencount = 0 -- current generation count local stepsize = 1 -- display each generation local perc = 20 -- initial percentage for RandomPattern local randstring = "20" -- initial string for RandomPattern local message = nil -- text message displayed by Refresh if not nil local selcount = 0 -- number of selected cells (live or dead) local selected = {} -- grid positions of selected cells local pastecount = 0 -- number of cells in paste pattern local pastepatt = {} -- grid positions of cells in paste pattern local drawstate = 1 -- for drawing/erasing cells local selstate = true -- for selecting/deselecting cells local celltype = "cube" -- draw live cell as cube/sphere/point local depthshading = true -- whether using depth shading local depthlayers = 64 -- number of shading layers local depthrange = 224 -- rgb levels for depth shading local mindepth, maxdepth -- minimum and maximum depth (with corner pointing at screen) local xyline = { "lines" } -- coordinates for batch line draw local xyln = 2 -- index of next position in xyline local showhistory = HISTORYOFF -- cell history longevity: 0 = off, >0 = on local fadehistory = true -- whether to fade history cells local active = {} -- grid positions of cells in active plane local activeplane = "XY" -- orientation of active plane (XY/XZ/YZ) local activepos = 0 -- active plane's cell position along 3rd axis local activecell = "" -- "x,y,z" if mouse is inside an active cell local prevactive = "" -- previous activecell -- boundary grid coords for live cells (not always minimal) local minx, miny, minz local maxx, maxy, maxz local minimal_live_bounds = true -- becomes false if a live cell is deleted local liveedge = false -- becomes true if there is at least one cell on the grid edge -- boundary grid coords for selected cells (not always minimal) local minselx, minsely, minselz local maxselx, maxsely, maxselz local minimal_sel_bounds = true -- becomes false if a selected cell is deselected -- boundary grid coords for the active plane (always minimal) local minactivex, minactivey, minactivez local maxactivex, maxactivey, maxactivez -- boundary grid coords for the paste pattern (always minimal) local minpastex, minpastey, minpastez local maxpastex, maxpastey, maxpastez -- for undo/redo local undostack = {} -- stack of states that can be undone local redostack = {} -- stack of states that can be redone local startcount = 0 -- starting gencount (can be > 0) local startstate = {} -- starting state (used by Reset) local dirty = false -- pattern has been modified? local refcube = {} -- invisible reference cube local rotrefz = {} -- Z coords of refcube's rotated vertices local rotx = {} -- rotated X coords for 8 vertices local roty = {} -- rotated Y coords for 8 vertices local rotz = {} -- rotated Z coords for 8 vertices local projectedx = {} -- projected X coords for 8 vertices local projectedy = {} -- projected Y coords for 8 vertices -- current transformation matrix local xixo, yixo, zixo local xiyo, yiyo, ziyo local xizo, yizo, zizo local viewwd, viewht -- current size of viewport local ovwd, ovht -- current size of overlay local minwd, minht = 900, 400 -- minimum size of overlay local midx, midy -- overlay's middle pixel local mbar -- the menu bar local mbarht = 28 -- height of menu bar -- tool bar controls local ssbutton -- Start/Stop local s1button -- +1 local resetbutton -- Reset local fitbutton -- Fit local undobutton -- Undo local redobutton -- Redo local helpbutton -- ? local exitbutton -- X local drawbox -- radio button for draw mode local selectbox -- radio button for select mode local movebox -- radio button for move mode local stepslider -- slider for adjusting stepsize local pastemenu -- pop-up menu for choosing a paste action local selmenu -- pop-up menu for choosing a selection action local buttonht = 20 local gap = 10 -- space around buttons -- tool bar height includes menu bar local toolbarht = mbarht+buttonht+gap*2 local drawcursor = "pencil" -- cursor for drawing cells local selectcursor = "cross" -- cursor for selecting cells local movecursor = "hand" -- cursor for rotating grid local currcursor = movecursor -- current cursor local arrow_cursor = false -- true if cursor is in tool bar DEFAULT_RULE = "3D5..7/6" -- initial rule local rulestring = "" -- so very first Initialize calls ParseRule(DEFAULT_RULE) local survivals, births -- set by ParseRule local NextGeneration -- ditto (set to NextGenStandard or NextGenBusyBoxes) pattdir = g.getdir("data") -- initial directory for OpenPattern/SavePattern scriptdir = g.getdir("app") -- initial directory for RunScript local scriptlevel = 0 -- greater than 0 if a user script is running -- the default path for the script to run when 3D.lua starts up pathsep = g.getdir("app"):sub(-1) startup = g.getdir("app").."My-scripts"..pathsep.."3D-start.lua" -- user settings are stored in this file settingsfile = g.getdir("data").."3D.ini" -------------------------------------------------------------------------------- function AddCount(item, counts, maxcount, bcount) local mincount = 0 if bcount then mincount = 1 end local i = tonumber(item) if (i >= mincount) and (i <= maxcount) then counts[#counts+1] = i else if bcount then g.warn("Birth count ("..i..") must be from 1 to "..maxcount) else g.warn("Survival count ("..i..") must be from 0 to "..maxcount) end return false end return true end -------------------------------------------------------------------------------- function AddCountRange(low, high, counts, maxcount, bcount) local mincount = 0 local what = "Survival" if bcount then mincount = 1 what = "Birth" end local l = tonumber(low) local h = tonumber(high) -- check range is in ascending order if l > h then g.warn("End of "..what.." range ("..h..") must be higher than start ("..l..")") return false end -- check start of range is valid if (l < mincount or l > maxcount) then g.warn("Start of "..what.." range ("..l..") must be from "..mincount.." to "..maxcount) return false end -- check end of range is valid if (h < mincount or h > maxcount) then g.warn("End of "..what.." range ("..h..") must be from "..mincount.." to "..maxcount) return false end -- add range to counts for i = l, h do counts[#counts+1] = i end return true end -------------------------------------------------------------------------------- function AppendCounts(array, counts, maxcount, bcount) for _, item in ipairs(array) do if validint(item) then -- check for single number if not AddCount(item, counts, maxcount, bcount) then return false end else -- check for range e.g. 5..7 local l, h = split(item, "..") if h == nil then h = "" end if #l > 0 and #h > 0 and validint(l) and validint(h) then if not AddCountRange(l, h, counts, maxcount, bcount) then return false end else g.warn("Illegal number in rule: "..item) return false end end end return true end -------------------------------------------------------------------------------- function AddCanonicalPart(canonstr, startrun, i) if #canonstr > 0 then canonstr = canonstr.."," end -- add the start value canonstr = canonstr..startrun -- check for a run if i > startrun + 1 then if i == startrun + 2 then -- run of two becomes a,b canonstr = canonstr..","..i-1 else -- run of more than two becomes a..b canonstr = canonstr..".."..i-1 end end return canonstr end -------------------------------------------------------------------------------- function CanonicalForm(counts, maxcount) local result = "" local startrun = -1 for i = 0, maxcount do if counts[i] then if startrun == -1 then startrun = i end else if startrun ~= -1 then result = AddCanonicalPart(result, startrun, i) startrun = -1 end end end -- check for unfinished run if startrun ~= -1 then result = AddCanonicalPart(result, startrun, maxcount+1) end return result end -------------------------------------------------------------------------------- function ParseRule(newrule) -- parse newrule and if ok set rulestring, survivals, births and NextGeneration if #newrule == 0 then newrule = DEFAULT_RULE else newrule = newrule:upper() end -- first check for BusyBoxes or BusyBoxesM if newrule == "BUSYBOXES" or newrule == "BB" then rulestring = "BusyBoxes" -- survivals and births are not used NextGeneration = NextGenBusyBoxes ovt{"setrule3d", "BB"} return true elseif newrule == "BUSYBOXESW" or newrule == "BBW" then rulestring = "BusyBoxesW" -- survivals and births are not used NextGeneration = NextGenBusyBoxes ovt{"setrule3d", "BBW"} return true end if not newrule:find("^3D") then g.warn("Rule must start with 3D.") return false else -- strip off the 3D newrule = newrule:sub(3) end if not newrule:find("/") then g.warn("Rule must have a / separator.") return false end -- use 3D Moore neighborhood unless rule ends with a special letter local lastchar = newrule:sub(-1) local maxcount = 26 if lastchar == "F" or lastchar == "V" then -- 6-cell face neighborhood (aka von Neumann neighborhood) lastchar = "F" maxcount = 6 newrule = newrule:sub(1,-2) elseif lastchar == "C" then -- 8-cell corner neighborhood maxcount = 8 newrule = newrule:sub(1,-2) elseif lastchar == "E" then -- 12-cell edge neighborhood maxcount = 12 newrule = newrule:sub(1,-2) elseif lastchar == "H" then -- 12-cell hexahedral neighborhood maxcount = 12 newrule = newrule:sub(1,-2) else lastchar = "" -- for Moore neighborhood end local s, b = split(newrule,"/") if #s == 0 then s = {} else s = {split(s,",")} end if b == nil or #b == 0 then b = {} else b = {split(b,",")} end local news = {} local newb = {} if not AppendCounts(s, news, maxcount, false) then return false end if not AppendCounts(b, newb, maxcount, true) then return false end -- newrule is okay so set survivals and births survivals = {} births = {} for _, i in ipairs(news) do survivals[i] = true end for _, i in ipairs(newb) do births[i] = true end -- set the rule ovt{"setrule3d", lastchar, survivals, births} -- set rulestring to the canonical form rulestring = "3D"..CanonicalForm(survivals,maxcount).."/"..CanonicalForm(births,maxcount)..lastchar -- set NextGeneration to the standard function NextGeneration = NextGenStandard return true end -------------------------------------------------------------------------------- function ReadSettings() local f = io.open(settingsfile, "r") if f then while true do -- no need to worry about CRs here because file was created by WriteSettings local line = f:read("*l") if not line then break end local keyword, value = split(line,"=") -- look for a keyword used in WriteSettings if not value then -- ignore keyword elseif keyword == "startup" then startup = tostring(value) elseif keyword == "pattdir" then pattdir = tostring(value) elseif keyword == "scriptdir" then scriptdir = tostring(value) elseif keyword == "celltype" then SetCellTypeOnly(tostring(value)) elseif keyword == "perc" then randstring = tostring(value) elseif keyword == "axes" then showaxes = tostring(value) == "true" elseif keyword == "lines" then showlines = tostring(value) == "true" elseif keyword == "shading" then depthshading = tostring(value) == "true" elseif keyword == "history" then showhistory = tonumber(value) or HISTORYOFF if showhistory ~= HISTORYOFF and showhistory ~= DEFAULTHISTORY then showhistory = HISTORYOFF end elseif keyword == "fadehistory" then fadehistory = tostring(value) == "true" elseif keyword == "gridsize" then N = tonumber(value) or DEFAULTN if N < MINN then N = MINN end if N > MAXN then N = MAXN end elseif keyword == "rule" then rulestring = tostring(value) if not ParseRule(rulestring) then g.warn("Resetting bad rule ("..rulestring..") to default.", false) ParseRule(DEFAULT_RULE) end end end f:close() end end -------------------------------------------------------------------------------- function WriteSettings() local f = io.open(settingsfile, "w") if f then -- keywords must match those in ReadSettings (but order doesn't matter) f:write("startup=", startup, "\n") f:write("pattdir=", pattdir, "\n") f:write("scriptdir=", scriptdir, "\n") f:write("gridsize=", tostring(N), "\n") f:write("celltype=", celltype, "\n") f:write("rule=", rulestring, "\n") f:write("perc=", randstring, "\n") f:write("axes="..tostring(showaxes), "\n") f:write("lines="..tostring(showlines), "\n") f:write("shading="..tostring(depthshading), "\n") f:write("history="..tostring(showhistory), "\n") f:write("fadehistory="..tostring(fadehistory), "\n") f:close() end end -------------------------------------------------------------------------------- function SaveGollyState() local oldstate = {} oldstate.scroll = g.setoption("showscrollbars", 0) oldstate.time = g.setoption("showtimeline", 0) oldstate.tool = g.setoption("showtoolbar", 0) oldstate.status = g.setoption("showstatusbar", 0) oldstate.layer = g.setoption("showlayerbar", 0) oldstate.edit = g.setoption("showeditbar", 0) oldstate.tile = g.setoption("tilelayers", 0) oldstate.stack = g.setoption("stacklayers", 0) oldstate.files = g.setoption("showfiles", 0) oldstate.filesdir = g.getdir("files") return oldstate end -------------------------------------------------------------------------------- function RestoreGollyState(oldstate) ov("delete") g.setoption("showscrollbars", oldstate.scroll) g.setoption("showtimeline", oldstate.time) g.setoption("showtoolbar", oldstate.tool) g.setoption("showstatusbar", oldstate.status) g.setoption("showlayerbar", oldstate.layer) g.setoption("showeditbar", oldstate.edit) g.setoption("tilelayers", oldstate.tile) g.setoption("stacklayers", oldstate.stack) g.setoption("showfiles", oldstate.files) g.setdir("files", oldstate.filesdir) end -------------------------------------------------------------------------------- local function TransformPoint(point) -- rotate given 3D point local x, y, z = point[1], point[2], point[3] local newx = (x*xixo + y*xiyo + z*xizo) local newy = (x*yixo + y*yiyo + z*yizo) local newz = (x*zixo + y*ziyo + z*zizo) --[[ or do this to rotate about grid axes local newx = (x*xixo + y*yixo + z*zixo) local newy = (x*xiyo + y*yiyo + z*ziyo) local newz = (x*xizo + y*yizo + z*zizo) --]] return newx, newy, newz end -------------------------------------------------------------------------------- local function HorizontalLine(x1, x2, y) -- draw a horizontal line of pixels from x1,y to x2,y ovt{"line", x1, y, x2, y} end -------------------------------------------------------------------------------- local function DrawEdge(start, finish) DrawLine(projectedx[start], projectedy[start], projectedx[finish], projectedy[finish]) end -------------------------------------------------------------------------------- local function FillFace(ax, ay, bx, by, cx, cy, dx, dy, shade) -- fill given convex quadrilateral using modified code from here: -- http://www-users.mat.uni.torun.pl/~wrona/3d_tutor/tri_fillers.html -- relabel points so that ay <= by <= cy <= dy; -- note that given vertices are in cyclic order, so a is opposite c -- and b is opposite d if ay > cy then -- swap a and c (diagonally opposite) ax, cx = cx, ax ay, cy = cy, ay end if by > dy then -- swap b and d (diagonally opposite) bx, dx = dx, bx by, dy = dy, by end -- we now have ay <= cy and by <= dy if ay > by then -- swap a and b ax, bx = bx, ax ay, by = by, ay end if cy > dy then -- swap c and d cx, dx = dx, cx cy, dy = dy, cy end -- if top and/or bottom line is horizontal then we need to ensure -- that lines a->c and b->d don't intersect if ay == by then if (ax - bx) * (cx - dx) < 0 then -- swap ax and bx ax, bx = bx, ax end elseif cy == dy then if (ax - bx) * (cx - dx) < 0 then -- swap cx and dx cx, dx = dx, cx end end -- calculate deltas for interpolation local delta1 = 0.0 local delta2 = 0.0 local delta3 = 0.0 local delta4 = 0.0 if by-ay > 0 then delta1 = (bx-ax) / (by-ay) end if cy-ay > 0 then delta2 = (cx-ax) / (cy-ay) end if dy-by > 0 then delta3 = (dx-bx) / (dy-by) end if dy-cy > 0 then delta4 = (dx-cx) / (dy-cy) end -- draw horizontal segments from sx to ex (start and end X coords) ov(shade) local sx = ax local sy = ay local ex = sx while sy < by do HorizontalLine(round(sx), round(ex), sy) sy = sy + 1 sx = sx + delta1 ex = ex + delta2 end sx = bx while sy < cy do HorizontalLine(round(sx), round(ex), sy) sy = sy + 1 sx = sx + delta3 ex = ex + delta2 end ex = cx while sy < dy do HorizontalLine(round(sx), round(ex), sy) sy = sy + 1 sx = sx + delta3 ex = ex + delta4 end end -------------------------------------------------------------------------------- local function CheckFaces(f1v1, f1v2, f1v3, f1v4, f2v1, f2v2, f2v3, f2v4) local function ComputeShade(v1, v2) -- return a shade of gray assuming a light source in front of grid local x1, y1, z1 = rotx[v1], roty[v1], rotz[v1] local x2, y2, z2 = rotx[v2], roty[v2], rotz[v2] local costheta = (z1-z2) / sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) ) -- costheta ranges from -1.0 to 1.0 local shade = 255 - int((costheta + 1.0) / 2.0 * 128) return "rgba "..shade.." "..shade.." "..shade.." 255" end -- test rotated z coords to see which face is in front if rotz[f1v1] < rotz[f2v1] then FillFace(projectedx[f1v1], projectedy[f1v1], projectedx[f1v2], projectedy[f1v2], projectedx[f1v3], projectedy[f1v3], projectedx[f1v4], projectedy[f1v4], ComputeShade(f1v1, f2v1)) else FillFace(projectedx[f2v1], projectedy[f2v1], projectedx[f2v2], projectedy[f2v2], projectedx[f2v3], projectedy[f2v3], projectedx[f2v4], projectedy[f2v4], ComputeShade(f2v1, f1v1)) end end -------------------------------------------------------------------------------- local function CreateCube(x, y, z) -- create cube at given grid position x = x * CELLSIZE + BORDER - MIDGRID y = y * CELLSIZE + BORDER - MIDGRID z = z * CELLSIZE + BORDER - MIDGRID -- WARNING: vertex order used here is assumed by other code: -- vertices 1,3,5,7 and 2,4,6,8 are front and back faces, -- vertices 1,2,8,7 and 3,4,6,5 are bottom and top faces, -- vertices 1,2,4,3 and 7,8,6,5 are left and right faces -- -- +y -- | -- v4_________v6 -- /| /| -- / | / | -- v3__|______v5 | -- | | | | -- | v2_____|___v8___+x -- | / | / -- | / | / -- v1_________v7 -- / -- +z -- return { {x , y , z+LEN}, -- v1 {x , y , z }, -- v2 {x , y+LEN, z+LEN}, -- v3 {x , y+LEN, z }, -- v4 {x+LEN, y+LEN, z+LEN}, -- v5 {x+LEN, y+LEN, z }, -- v6 {x+LEN, y , z+LEN}, -- v7 {x+LEN, y , z } -- v8 } end -------------------------------------------------------------------------------- local function DisplayLine(startpt, endpt) -- use orthographic projection to transform line's start and end points local newx, newy = TransformPoint(startpt) local x1 = round(newx) + midx local y1 = round(newy) + midy newx, newy = TransformPoint(endpt) local x2 = round(newx) + midx local y2 = round(newy) + midy DrawLine(x1, y1, x2, y2) end ---------------------------------------------------------------------- local function AddLineToBatch(startpt, endpt) -- use orthographic projection to transform line's start and end points local x, y, z = startpt[1], startpt[2], startpt[3] xyline[xyln] = (x*xixo + y*xiyo + z*xizo) + midx xyline[xyln + 1] = (x*yixo + y*yiyo + z*yizo) + midy xyln = xyln + 2 x, y, z = endpt[1], endpt[2], endpt[3] xyline[xyln] = (x*xixo + y*xiyo + z*xizo) + midx xyline[xyln + 1] = (x*yixo + y*yiyo + z*yizo) + midy xyln = xyln + 2 end -------------------------------------------------------------------------------- local function DrawBatchLines() if xyln > 2 then xyline[xyln] = nil ovt(xyline) xyln = 2 end end -------------------------------------------------------------------------------- function DrawRearAxes() -- draw lattice lines and/or axes that are behind rotated reference cube -- assuming vertex order set in CreateCube local z1 = rotrefz[1] local z2 = rotrefz[2] local z3 = rotrefz[3] local z7 = rotrefz[7] if showlines then ov(LINE_COLOR) if z1 < z2 then -- front face of rotated refcube is visible for _, pt in ipairs(xylattice) do AddLineToBatch(pt[1], pt[2]) end end if z1 >= z7 then -- right face of rotated refcube is visible for _, pt in ipairs(yzlattice) do AddLineToBatch(pt[1], pt[2]) end end if z1 >= z3 then -- top face of rotated refcube is visible for _, pt in ipairs(xzlattice) do AddLineToBatch(pt[1], pt[2]) end end DrawBatchLines() end if showaxes then -- draw darker anti-aliased lines for rear axes ov("blend 1") ov("lineoption width 3") if z1 < z2 or z1 >= z3 then ov(REARX_COLOR); DisplayLine(xaxes[1], xaxes[2]) end if z1 < z2 or z1 >= z7 then ov(REARY_COLOR); DisplayLine(yaxes[1], yaxes[2]) end if z1 >= z7 or z1 >= z3 then ov(REARZ_COLOR); DisplayLine(zaxes[1], zaxes[2]) end if z1 < z2 or z1 < z3 then ov(REARX_COLOR); DisplayLine(xaxes[3], xaxes[4]) end if z1 >= z2 or z1 >= z7 then ov(REARY_COLOR); DisplayLine(yaxes[3], yaxes[4]) end if z1 < z7 or z1 >= z3 then ov(REARZ_COLOR); DisplayLine(zaxes[3], zaxes[4]) end if z1 >= z2 or z1 < z3 then ov(REARX_COLOR); DisplayLine(xaxes[5], xaxes[6]) end if z1 >= z2 or z1 < z7 then ov(REARY_COLOR); DisplayLine(yaxes[5], yaxes[6]) end if z1 < z3 or z1 < z7 then ov(REARZ_COLOR); DisplayLine(zaxes[5], zaxes[6]) end if z1 >= z2 or z1 >= z3 then ov(REARX_COLOR); DisplayLine(xaxes[7], xaxes[8]) end if z1 < z2 or z1 < z7 then ov(REARY_COLOR); DisplayLine(yaxes[7], yaxes[8]) end if z1 >= z7 or z1 < z3 then ov(REARZ_COLOR); DisplayLine(zaxes[7], zaxes[8]) end ov("lineoption width 1") ov("blend 0") end end -------------------------------------------------------------------------------- function DrawFrontAxes() -- draw lattice lines and/or axes that are in front of rotated reference cube -- assuming vertex order set in CreateCube local z1 = rotrefz[1] local z2 = rotrefz[2] local z3 = rotrefz[3] local z7 = rotrefz[7] if showlines then ov(LINE_COLOR) if z1 >= z2 then -- back face of rotated refcube is visible for _, pt in ipairs(xylattice) do AddLineToBatch(pt[1], pt[2]) end end if z1 < z7 then -- left face of rotated refcube is visible for _, pt in ipairs(yzlattice) do AddLineToBatch(pt[1], pt[2]) end end if z1 < z3 then -- bottom face of rotated refcube is visible for _, pt in ipairs(xzlattice) do AddLineToBatch(pt[1], pt[2]) end end DrawBatchLines() end if showaxes then -- draw brighter anti-aliased lines for front axes ov("blend 1") ov("lineoption width 3") if z1 >= z2 or z1 < z3 then ov(X_COLOR); DisplayLine(xaxes[1], xaxes[2]) end if z1 >= z2 or z1 < z7 then ov(Y_COLOR); DisplayLine(yaxes[1], yaxes[2]) end if z1 < z7 or z1 < z3 then ov(Z_COLOR); DisplayLine(zaxes[1], zaxes[2]) end if z1 >= z2 or z1 >= z3 then ov(X_COLOR); DisplayLine(xaxes[3], xaxes[4]) end if z1 < z2 or z1 < z7 then ov(Y_COLOR); DisplayLine(yaxes[3], yaxes[4]) end if z1 >= z7 or z1 < z3 then ov(Z_COLOR); DisplayLine(zaxes[3], zaxes[4]) end if z1 < z2 or z1 >= z3 then ov(X_COLOR); DisplayLine(xaxes[5], xaxes[6]) end if z1 < z2 or z1 >= z7 then ov(Y_COLOR); DisplayLine(yaxes[5], yaxes[6]) end if z1 >= z3 or z1 >= z7 then ov(Z_COLOR); DisplayLine(zaxes[5], zaxes[6]) end if z1 < z2 or z1 < z3 then ov(X_COLOR); DisplayLine(xaxes[7], xaxes[8]) end if z1 >= z2 or z1 >= z7 then ov(Y_COLOR); DisplayLine(yaxes[7], yaxes[8]) end if z1 < z7 or z1 >= z3 then ov(Z_COLOR); DisplayLine(zaxes[7], zaxes[8]) end ov("lineoption width 1") ov("blend 0") end end -------------------------------------------------------------------------------- function CreateAxes() -- create axes and lattice lines -- put axes origin at most -ve corner of grid local o = -MIDGRID local endpt = o + N*CELLSIZE xaxes = { {o,o,o}, {endpt,o,o}, {o,endpt,o}, {endpt,endpt,o}, {o,endpt,endpt}, {endpt,endpt,endpt}, {o,o,endpt}, {endpt,o,endpt} } yaxes = { {o,o,o}, {o,endpt,o}, {o,o,endpt}, {o,endpt,endpt}, {endpt,o,endpt}, {endpt,endpt,endpt}, {endpt,o,o}, {endpt,endpt,o} } zaxes = { {o,o,o}, {o,o,endpt}, {endpt,o,o}, {endpt,o,endpt}, {endpt,endpt,o}, {endpt,endpt,endpt}, {o,endpt,o}, {o,endpt,endpt} } xylattice = {} for i = 0, N do local offset = i*CELLSIZE xylattice[#xylattice+1] = {{o+offset,o,o}, {o+offset,endpt,o}} xylattice[#xylattice+1] = {{o,o+offset,o}, {endpt,o+offset,o}} end xzlattice = {} for i = 0, N do local offset = i*CELLSIZE xzlattice[#xzlattice+1] = {{o,o,o+offset}, {endpt,o,o+offset}} xzlattice[#xzlattice+1] = {{o+offset,o,o}, {o+offset,o,endpt}} end yzlattice = {} for i = 0, N do local offset = i*CELLSIZE yzlattice[#yzlattice+1] = {{o,o+offset,o}, {o,o+offset,endpt}} yzlattice[#yzlattice+1] = {{o,o,o+offset}, {o,endpt,o+offset}} end end -------------------------------------------------------------------------------- function CreateTranslucentCell(clipname, color) -- create a clip containing a translucent cube with given color ov("create "..(CELLSIZE*2).." "..(CELLSIZE*2).." "..clipname) ov("target "..clipname) ov(color) -- temporarily change BORDER and LEN so CreateCube fills cell local oldBORDER = BORDER local oldLEN = LEN BORDER = 1 LEN = CELLSIZE-2 - (CELLSIZE%2) local midpos = N//2 local cube = CreateCube(midpos, midpos, midpos) -- create cube's projected vertices (within clip) for i = 1, 8 do rotx[i], roty[i], rotz[i] = TransformPoint(cube[i]) projectedx[i] = round( rotx[i] ) + CELLSIZE projectedy[i] = round( roty[i] ) + CELLSIZE end -- draw outer edges of cube then flood from center if rotz[1] < rotz[2] then -- front face is visible if rotz[5] < rotz[3] then -- right face is visible DrawEdge(1,3) if rotz[5] < rotz[7] then -- top face is visible DrawEdge(3,4) DrawEdge(4,6) DrawEdge(6,8) DrawEdge(8,7) DrawEdge(7,1) else -- bottom face is visible DrawEdge(3,5) DrawEdge(5,6) DrawEdge(6,8) DrawEdge(8,2) DrawEdge(2,1) end else -- left face is visible DrawEdge(5,7) if rotz[5] < rotz[7] then -- top face is visible DrawEdge(7,1) DrawEdge(1,2) DrawEdge(2,4) DrawEdge(4,6) DrawEdge(6,5) else -- bottom face is visible DrawEdge(7,8) DrawEdge(8,2) DrawEdge(2,4) DrawEdge(4,3) DrawEdge(3,5) end end else -- back face is visible if rotz[5] < rotz[3] then -- right face is visible DrawEdge(5,7) if rotz[5] < rotz[7] then -- top face is visible DrawEdge(7,8) DrawEdge(8,2) DrawEdge(2,4) DrawEdge(4,3) DrawEdge(3,5) else -- bottom face is visible DrawEdge(7,1) DrawEdge(1,2) DrawEdge(2,4) DrawEdge(4,6) DrawEdge(6,5) end else -- left face is visible DrawEdge(1,3) if rotz[5] < rotz[7] then -- top face is visible DrawEdge(3,5) DrawEdge(5,6) DrawEdge(6,8) DrawEdge(8,2) DrawEdge(2,1) else -- bottom face is visible DrawEdge(3,4) DrawEdge(4,6) DrawEdge(6,8) DrawEdge(8,7) DrawEdge(7,1) end end end ov("flood "..CELLSIZE.." "..CELLSIZE) -- restore BORDER and LEN BORDER = oldBORDER LEN = oldLEN ov("optimize "..clipname) ov("target") end -------------------------------------------------------------------------------- function DrawCubeEdges() if LEN > 4 then -- draw anti-aliased edges around visible face(s) if LEN == 5 then ovt{"rgba", 150, 150, 150, 255} elseif LEN == 6 then ovt{"rgba", 110, 110, 110, 255} elseif LEN == 7 then ovt{"rgba", 80, 80, 80, 255} else ovt{"rgba", 60, 60, 60, 255} end ov("blend 1") ov("lineoption width "..(1 + int(LEN / 40.0))) if rotz[1] < rotz[2] then -- draw all edges around front face DrawEdge(1,3) DrawEdge(3,5) DrawEdge(5,7) DrawEdge(7,1) if rotz[1] < rotz[3] then -- draw remaining 3 edges around bottom face DrawEdge(1,2) DrawEdge(2,8) DrawEdge(8,7) if rotz[1] < rotz[7] then -- draw remaining 2 edges around left face DrawEdge(3,4) DrawEdge(4,2) else -- draw remaining 2 edges around right face DrawEdge(5,6) DrawEdge(6,8) end else -- draw 3 remaining edges around top face DrawEdge(3,4) DrawEdge(4,6) DrawEdge(6,5) if rotz[1] < rotz[7] then -- draw remaining 2 edges around left face DrawEdge(4,2) DrawEdge(2,1) else -- draw remaining 2 edges around right face DrawEdge(6,8) DrawEdge(8,7) end end else -- draw all edges around back face DrawEdge(2,4) DrawEdge(4,6) DrawEdge(6,8) DrawEdge(8,2) if rotz[1] < rotz[3] then -- draw remaining 3 edges around bottom face DrawEdge(2,1) DrawEdge(1,7) DrawEdge(7,8) if rotz[1] < rotz[7] then -- draw remaining 2 edges around left face DrawEdge(1,3) DrawEdge(3,4) else -- draw remaining 2 edges around right face DrawEdge(7,5) DrawEdge(5,6) end else -- draw 3 remaining edges around top face DrawEdge(6,5) DrawEdge(5,3) DrawEdge(3,4) if rotz[1] < rotz[7] then -- draw remaining 2 edges around left face DrawEdge(2,1) DrawEdge(1,3) else -- draw remaining 2 edges around right face DrawEdge(8,7) DrawEdge(7,5) end end end ov("lineoption width 1") ov("blend 0") end end -------------------------------------------------------------------------------- lastHistorySize = -1 function CreateHistoryCells(clip, color) -- only create bitmaps if cell size has changed if CELLSIZE == lastHistorySize then return end lastHistorySize = CELLSIZE -- create translucent history cell CreateTranslucentCell(clip, color) -- create alpha fading clips if required if fadehistory then local _, _, _, _, starta = split(color) local stopa = MINHISTORYALPHA local adjust = (starta - stopa + 1) / showhistory local alpha = starta ov("target "..clip) for i = 1, showhistory do ov("target "..clip) ov("copy 0 0 0 0 "..clip..i) ov("target "..clip..i) ovt{"rgba", 0, 0, 0, alpha} ov("replace !0# 0# 0# *") ov("optimize "..clip..i) alpha = alpha - adjust end ov("target") end end -------------------------------------------------------------------------------- function CreateLayers(clip) local adjust = depthrange / (maxdepth - mindepth + 1) local total = 0 local rgb ov("target "..clip) ov("copy 0 0 0 0 "..clip.."1") ov("target "..clip.."1") ov("optimize "..clip.."1") for i = 2, maxdepth do total = total + adjust rgb = floor(total) ov("target "..clip) ov("copy 0 0 0 0 "..clip..i) ov("target "..clip..i) ov("replace *#-"..rgb.." *#-"..rgb.." *#-"..rgb.." *#") ov("optimize "..clip..i) end total = 0 for i = 1, mindepth, -1 do total = total + adjust rgb = floor(total) ov("target "..clip) ov("copy 0 0 0 0 "..clip..i) ov("target "..clip..i) ov("replace *#+"..rgb.." *#+"..rgb.." *#+"..rgb.." *#") ov("optimize "..clip..i) end ov("target") end -------------------------------------------------------------------------------- local HALFCUBECLIP -- half the wd/ht of the clip containing a live cube lastCubeSize = -1 function CreateLiveCube() -- only create bitmaps if cell size has changed if CELLSIZE == lastCubeSize then return end lastCubeSize = CELLSIZE -- create a clip containing one rotated cube that will be used later -- to draw all live cells (this only works because all cubes are identical -- in appearance when using orthographic projection) -- largest size of a rotated cube with edge length L is sqrt(3)*L HALFCUBECLIP = round(sqrt(3) * LEN / 2.0) ov("create "..(HALFCUBECLIP*2).." "..(HALFCUBECLIP*2).." L") ov("target L") local midpos = N//2 local cube = CreateCube(midpos, midpos, midpos) -- create cube's projected vertices (within clip) for i = 1, 8 do rotx[i], roty[i], rotz[i] = TransformPoint(cube[i]) projectedx[i] = round( rotx[i] ) + HALFCUBECLIP projectedy[i] = round( roty[i] ) + HALFCUBECLIP end -- draw up to 3 visible faces of cube, using cyclic vertex order set in CreateCube CheckFaces(1,3,5,7, 2,4,6,8) -- front or back CheckFaces(1,2,8,7, 3,4,6,5) -- bottom or top CheckFaces(1,2,4,3, 7,8,6,5) -- left or right DrawCubeEdges() ov("optimize L") -- create faded versions of the clip if depth shading if depthshading then CreateLayers("L") end ov("target") end -------------------------------------------------------------------------------- lastSphereSize = -1 function CreateLiveSphere() -- only create bitmaps if cell size has changed if CELLSIZE == lastSphereSize then return end lastSphereSize = CELLSIZE -- create a clip containing one sphere that will be used later -- to draw all live cells local diameter = CELLSIZE+1 -- so orthogonally adjacent spheres touch ov("create "..diameter.." "..diameter.." L") ov("target L") ov("blend 1") local x = 0 local y = 0 local gray = 0 -- start with black outline local grayinc = 127 local r = (diameter+1)//2 if r > 2 then grayinc = 127/(r-2) end while true do local grayrgb = floor(gray) ovt{"rgba", grayrgb, grayrgb, grayrgb, 255} -- draw a solid circle by setting the line width to the radius ov("lineoption width "..r) ov("ellipse "..x.." "..y.." "..diameter.." "..diameter) diameter = diameter - 2 r = r - 1 if r < 2 then break end x = x + 1 y = y + 1 if gray == 0 then gray = 128 end gray = gray + grayinc if gray > 255 then gray = 255 end end ov("blend 0") ov("lineoption width 1") ov("optimize L") -- create faded versions of the clip if depth shading if depthshading then CreateLayers("L") end ov("target") end -------------------------------------------------------------------------------- function DisplayCells(editing) -- find the rotated reference cube vertex with maximum Z coordinate local z1 = rotrefz[1] local z2 = rotrefz[2] local z3 = rotrefz[3] local z4 = rotrefz[4] local z5 = rotrefz[5] local z6 = rotrefz[6] local z7 = rotrefz[7] local z8 = rotrefz[8] local maxZ = max(z1,z2,z3,z4,z5,z6,z7,z8) local testcell = editing or selcount > 0 or pastecount > 0 -- find the extended boundary of all live/active/selected/paste cells local MINX, MINY, MINZ, MAXX, MAXY, MAXZ = minx, miny, minz, maxx, maxy, maxz if testcell then if editing then if minactivex < MINX then MINX = minactivex end if minactivey < MINY then MINY = minactivey end if minactivez < MINZ then MINZ = minactivez end if maxactivex > MAXX then MAXX = maxactivex end if maxactivey > MAXY then MAXY = maxactivey end if maxactivez > MAXZ then MAXZ = maxactivez end end if selcount > 0 then if minselx < MINX then MINX = minselx end if minsely < MINY then MINY = minsely end if minselz < MINZ then MINZ = minselz end if maxselx > MAXX then MAXX = maxselx end if maxsely > MAXY then MAXY = maxsely end if maxselz > MAXZ then MAXZ = maxselz end end if pastecount > 0 then if minpastex < MINX then MINX = minpastex end if minpastey < MINY then MINY = minpastey end if minpastez < MINZ then MINZ = minpastez end if maxpastex > MAXX then MAXX = maxpastex end if maxpastey > MAXY then MAXY = maxpastey end if maxpastez > MAXZ then MAXZ = maxpastez end end end -- determine order to traverse x, y and z in the grid; -- note that we need to draw cells from back to front -- (assumes vertex order set in CreateCube) local fromz, toz, stepz, fromy, toy, stepy, fromx, tox, stepx if maxZ == z1 then fromx, fromy, fromz = MINX, MINY, MAXZ elseif maxZ == z2 then fromx, fromy, fromz = MINX, MINY, MINZ elseif maxZ == z3 then fromx, fromy, fromz = MINX, MAXY, MAXZ elseif maxZ == z4 then fromx, fromy, fromz = MINX, MAXY, MINZ elseif maxZ == z5 then fromx, fromy, fromz = MAXX, MAXY, MAXZ elseif maxZ == z6 then fromx, fromy, fromz = MAXX, MAXY, MINZ elseif maxZ == z7 then fromx, fromy, fromz = MAXX, MINY, MAXZ elseif maxZ == z8 then fromx, fromy, fromz = MAXX, MINY, MINZ end if (fromx == MINX) then tox, stepx = MAXX, 1 else tox, stepx = MINX, -1 end if (fromy == MINY) then toy, stepy = MAXY, 1 else toy, stepy = MINY, -1 end if (fromz == MINZ) then toz, stepz = MAXZ, 1 else toz, stepz = MINZ, -1 end -- update the select, paste and active plane if editing then ovt{"setselpasact3d", selected, pastepatt, active} else ovt{"setselpasact3d", selected, pastepatt, {}} end -- display the cells ovt{"displaycells3d", fromx, tox, stepx, fromy, toy, stepy, fromz, toz, stepz, CELLSIZE, editing, toolbarht} end -------------------------------------------------------------------------------- lastBusyCubeSize = {E = -1, O = -1} function CreateBusyCube(clipname) -- only create bitmaps if cell size has changed if CELLSIZE == lastBusyCubeSize[clipname] then return end lastBusyCubeSize[clipname] = CELLSIZE -- create a clip containing a cube for odd/even cells -- largest size of a rotated cube with edge length L is sqrt(3)*L HALFCUBECLIP = round(sqrt(3) * LEN / 2.0) ov("create "..(HALFCUBECLIP*2).." "..(HALFCUBECLIP*2).." "..clipname) ov("target "..clipname) local midpos = N//2 local cube = CreateCube(midpos, midpos, midpos) -- create cube's projected vertices (within clip) for i = 1, 8 do rotx[i], roty[i], rotz[i] = TransformPoint(cube[i]) projectedx[i] = round( rotx[i] ) + HALFCUBECLIP projectedy[i] = round( roty[i] ) + HALFCUBECLIP end -- draw up to 3 visible faces of cube, using cyclic vertex order set in CreateCube CheckFaces(1,3,5,7, 2,4,6,8) -- front or back CheckFaces(1,2,8,7, 3,4,6,5) -- bottom or top CheckFaces(1,2,4,3, 7,8,6,5) -- left or right -- adjust grayscale colors using the replace command if clipname == "E" then ov(EVEN_CUBE) else ov(ODD_CUBE) end DrawCubeEdges() ov("optimize "..clipname) -- create faded versions of the clip if depth shading if depthshading then CreateLayers(clipname) end ov("target") end -------------------------------------------------------------------------------- lastBusySphereSize = { E = -1, O = -1 } function CreateBusySphere(clipname) -- only create bitmaps if cell size has changed if CELLSIZE == lastBusySphereSize[clipname] then return end lastBusySphereSize[clipname] = CELLSIZE -- create a clip containing a sphere for odd/even cells local diameter = CELLSIZE+1 local d1 = diameter ov("create "..diameter.." "..diameter.." "..clipname) ov("target "..clipname) ov("blend 1") local R, G, B if clipname == "E" then local _, red, green, blue = split(EVEN_COLOR) R = tonumber(red) G = tonumber(green) B = tonumber(blue) else local _, red, green, blue = split(ODD_COLOR) R = tonumber(red) G = tonumber(green) B = tonumber(blue) end local x = 0 local y = 0 local inc = 3 if diameter < 50 then inc = 8 - diameter//10 end local r = (diameter+1)//2 while true do ovt{"rgba", R, G, B, 255} -- draw a solid circle by setting the line width to the radius ov("lineoption width "..r) ov("ellipse "..x.." "..y.." "..diameter.." "..diameter) diameter = diameter - 2 r = r - 1 if r < 2 then break end x = x + 1 y = y + 1 R = R + inc G = G + inc B = B + inc if R > 255 then R = 255 end if G > 255 then G = 255 end if B > 255 then B = 255 end end -- draw black outline ovt{"rgba", 0, 0, 0, 255} ov("lineoption width 1") ov("ellipse 0 0 "..d1.." "..d1) ov("blend 0") ov("optimize "..clipname) -- create faded versions of the clip if depth shading if depthshading then CreateLayers(clipname) end ov("target") end -------------------------------------------------------------------------------- function CreatePoint(clipname, color) ov("create 1 1 "..clipname) ov("target "..clipname) -- set pixel to the given color ov(color) ovt{"set", 0, 0} ov("target") end -------------------------------------------------------------------------------- function EnableControls(bool) -- disable/enable unsafe menu items so that user scripts can call op.process -- File menu: mbar.enableitem(1, 1, bool) -- New Pattern mbar.enableitem(1, 2, bool) -- Random Pattern mbar.enableitem(1, 3, bool) -- Open Pattern mbar.enableitem(1, 4, bool) -- Open Clipboard mbar.enableitem(1, 5, bool) -- Save Pattern mbar.enableitem(1, 7, bool) -- Run Script mbar.enableitem(1, 8, bool) -- Run Clipboard mbar.enableitem(1, 9, bool) -- Set Startup Script if bool then -- ExitScript will abort 3D.lua mbar.setitem(1, 11, "Exit 3D.lua") else -- ExitScript will abort the user script mbar.setitem(1, 11, "Exit Script") end -- Edit menu: mbar.enableitem(2, 1, bool) -- Undo mbar.enableitem(2, 2, bool) -- Redo mbar.enableitem(2, 4, bool) -- Cut mbar.enableitem(2, 5, bool) -- Copy mbar.enableitem(2, 6, bool) -- Paste mbar.enableitem(2, 7, bool) -- Cancel Paste mbar.enableitem(2, 8, bool) -- Clear mbar.enableitem(2, 9, bool) -- Clear Outside mbar.enableitem(2, 11, bool) -- Select All mbar.enableitem(2, 12, bool) -- Cancel Selection mbar.enableitem(2, 14, bool) -- Middle Pattern mbar.enableitem(2, 15, bool) -- Middle Selection mbar.enableitem(2, 16, bool) -- Middle Paste -- Control menu: mbar.enableitem(3, 1, bool) -- Start/Stop Generating mbar.enableitem(3, 2, bool) -- Next Generation mbar.enableitem(3, 3, bool) -- Next Step mbar.enableitem(3, 4, bool) -- Reset mbar.enableitem(3, 6, bool) -- Set Rule -- View menu: mbar.enableitem(4, 3, bool) -- Set Grid Size -- disable/enable unsafe buttons ssbutton.enable(bool) s1button.enable(bool) resetbutton.enable(bool) undobutton.enable(bool) redobutton.enable(bool) -- disable/enable unsafe radio buttons drawbox.enable(bool) selectbox.enable(bool) movebox.enable(bool) end -------------------------------------------------------------------------------- function DrawMenuBar() if scriptlevel == 0 then mbar.enableitem(2, 1, #undostack > 0) -- Undo mbar.enableitem(2, 2, #redostack > 0) -- Redo mbar.enableitem(2, 4, selcount > 0) -- Cut mbar.enableitem(2, 5, selcount > 0) -- Copy mbar.enableitem(2, 7, pastecount > 0) -- Cancel Paste mbar.enableitem(2, 8, selcount > 0) -- Clear mbar.enableitem(2, 9, selcount > 0) -- Clear Outside mbar.enableitem(2, 11, popcount > 0) -- Select All mbar.enableitem(2, 12, selcount > 0) -- Cancel Selection mbar.enableitem(2, 14, popcount > 0) -- Middle Pattern mbar.enableitem(2, 15, selcount > 0) -- Middle Selection mbar.enableitem(2, 16, pastecount > 0) -- Middle Paste mbar.enableitem(3, 1, popcount > 0) -- Start/Stop Generating mbar.enableitem(3, 2, popcount > 0) -- Next Generation mbar.enableitem(3, 3, popcount > 0) -- Next Step mbar.enableitem(3, 4, gencount > startcount) -- Reset end mbar.radioitem(4, 5, celltype == "cube") mbar.radioitem(4, 6, celltype == "sphere") mbar.radioitem(4, 7, celltype == "point") mbar.tickitem(4, 9, showaxes) mbar.tickitem(4, 10, showlines) mbar.tickitem(4, 11, depthshading) mbar.tickitem(4, 12, showhistory > 0) mbar.tickitem(4, 13, fadehistory) mbar.show(0, 0, ovwd, mbarht) end -------------------------------------------------------------------------------- function DrawToolBar() ovt{"rgba", 230, 230, 230, 255} ovt{"fill", 0, 0, ovwd, toolbarht} DrawMenuBar() -- draw line at bottom edge of tool bar ov(op.gray) DrawLine(0, toolbarht-1, ovwd-1, toolbarht-1) if scriptlevel == 0 then -- enable/disable buttons ssbutton.enable(popcount > 0) s1button.enable(popcount > 0) resetbutton.enable(gencount > startcount) undobutton.enable(#undostack > 0) redobutton.enable(#redostack > 0) end local x = gap local y = mbarht + gap local biggap = gap * 3 ssbutton.show(x, y) x = x + ssbutton.wd + gap s1button.show(x, y) x = x + s1button.wd + gap resetbutton.show(x, y) x = x + resetbutton.wd + gap fitbutton.show(x, y) x = x + fitbutton.wd + biggap undobutton.show(x, y) x = x + undobutton.wd + gap redobutton.show(x, y) x = x + redobutton.wd + biggap drawbox.show(x, y, currcursor == drawcursor) x = x + drawbox.wd + gap selectbox.show(x, y, currcursor == selectcursor) x = x + selectbox.wd + gap movebox.show(x, y, currcursor == movecursor) -- show step slider to right of radio buttons stepslider.show(x + movebox.wd + biggap, y, stepsize) -- show stepsize at right end of slider ov(op.black) local oldfont if g.os() == "Linux" then oldfont = ov("font 10 default") else oldfont = ov("font 10 default-bold") end local oldbg = ov("textoption background 230 230 230 255") local _, _ = op.maketext("Step="..stepsize) op.pastetext(stepslider.x + stepslider.wd + 2, y + 1) ov("textoption background "..oldbg) ov("font "..oldfont) -- last 2 buttons are at right end of tool bar x = ovwd - gap - exitbutton.wd exitbutton.show(x, y) x = x - gap - helpbutton.wd helpbutton.show(x, y) end -------------------------------------------------------------------------------- function UpdateWindowTitle() -- set window title if it has changed local newtitle = string.format("%s [%s]", pattname, rulestring) if dirty then newtitle = "*"..newtitle end if g.os() ~= "Mac" then newtitle = newtitle.." - Golly" end if newtitle ~= currtitle then g.settitle(newtitle) currtitle = newtitle end end -------------------------------------------------------------------------------- function Refresh(update) if scriptlevel > 0 and not update then -- user scripts need to call Update() when they want to refresh return end -- turn off event checking temporarily to avoid partial updates of overlay -- (eg. due to user resizing window while a pattern is generating) g.check(false) -- if the pattern has been modified then update if update_grid then ovt{"setpattern3d", grid1, false} update_grid = false end -- fill overlay with background color ov(BACK_COLOR) ovt{"fill"} -- get Z coordinates of the vertices of a rotated reference cube -- (for doing various depth tests) for i = 1, 8 do local _, _, z = TransformPoint(refcube[i]) rotrefz[i] = z end if showaxes or showlines then DrawRearAxes() end --[[ All types of cell are defined as named clips and are the same for Cubes, Spheres or Points. Only the clips required for the current settings need to be created (algo, history, depth shading, mode, etc.). Name Description a active plane (Draw or Select mode) h history cell h1..hn fading history cell hN history cell not in active plane (Draw or Select mode) p paste target cell s selected cell sN selected cell not in active plane (Draw or Select mode) Moore, Face, Corner, Edge and Hexahedral algos: L live cell without depth shading L1..Ln live cell with depth shading LN live cell not in active plane (Draw or Select mode) BusyBoxes algo: E live even cell without depth shading O live odd cell without depth shading E1..En live even cell with depth shading O1..En live odd cell with depth shading EN live even cell not in active plane (Draw or Select Mode) ON live odd cell not in active plane (Draw or Select Mode) ]] local editing = currcursor ~= movecursor if popcount > 0 or pastecount > 0 or selcount > 0 or editing then if showhistory > HISTORYOFF then -- history cells will be translucent CreateHistoryCells("h", HISTORY_COLOR) end if pastecount > 0 then -- paste cells will be translucent CreateTranslucentCell("p", PASTE_COLOR) end if selcount > 0 then -- selected cells will be translucent CreateTranslucentCell("s", SELECT_COLOR) end if editing then -- cells in active plane will be translucent CreateTranslucentCell("a", ACTIVE_COLOR) -- live cells not in active plane will be points if rulestring:find("^BusyBoxes") then CreatePoint("EN", EVEN_COLOR) CreatePoint("ON", ODD_COLOR) else CreatePoint("LN", POINT_COLOR) end -- selected cells not in active plane will be points CreatePoint("sN", SELPT_COLOR) -- history cells not in active plane will be points if showhistory > HISTORYOFF then CreatePoint("hN", HISTORY_COLOR) end end if rulestring:find("^BusyBoxes") then if celltype == "cube" then CreateBusyCube("E") CreateBusyCube("O") elseif celltype == "sphere" then CreateBusySphere("E") CreateBusySphere("O") else -- celltype == "point" CreatePoint("E", EVEN_COLOR) CreatePoint("O", ODD_COLOR) end else if celltype == "cube" then CreateLiveCube() elseif celltype == "sphere" then CreateLiveSphere() else -- celltype == "point" then CreatePoint("L", POINT_COLOR) end end DisplayCells(editing) end if showaxes or showlines then DrawFrontAxes() end -- show info in top left corner local info = "Generation = "..gencount.."\n".. "Population = "..popcount if selcount > 0 then info = info.."\nSelected cells = "..selcount end if editing then -- show cell coords of mouse if it's inside the active plane info = info.."\nx,y,z = "..activecell end ov(INFO_COLOR) local _, ht = op.maketext(info) op.pastetext(10, toolbarht + 10) if message then ov(MSG_COLOR) op.maketext(message) op.pastetext(10, toolbarht + 10 + ht + 10) end if toolbarht > 0 then DrawToolBar() end -- the overlay is 100% opaque and covers entire viewport -- so we can call ov("update") rather than slower g.update() ov("update") UpdateWindowTitle() g.check(true) -- restore event checking end -------------------------------------------------------------------------------- function RefreshIfNotGenerating() if not generating then Refresh() end end -------------------------------------------------------------------------------- function SetActivePlane(orientation, pos) -- set the active plane; default is an XY plane half way along the Z axis activeplane = orientation or "XY" activepos = pos or 0 active = {} local M = N-1 if activeplane == "XY" then local z = N//2 + activepos local zNN = z * N * N for y = 0, M do local yN = y * N for x = 0, M do active[ x + yN + zNN ] = true end end minactivex = 0 maxactivex = M minactivey = 0 maxactivey = M minactivez = z maxactivez = z elseif activeplane == "YZ" then local x = N//2 + activepos for z = 0, M do for y = 0, M do active[ x + N * (y + N * z) ] = true end end minactivex = x maxactivex = x minactivey = 0 maxactivey = M minactivez = 0 maxactivez = M else -- activeplane == "XZ" local y = N//2 + activepos for z = 0, M do for x = 0, M do active[ x + N * (y + N * z) ] = true end end minactivex = 0 maxactivex = M minactivey = y maxactivey = y minactivez = 0 maxactivez = M end end -------------------------------------------------------------------------------- function UpdateStartButton() -- change label in ssbutton without changing the button's width, -- and also update 1st item in Control menu if generating then ssbutton.customcolor = STOP_COLOR ssbutton.darkcustomcolor = SELSTOP_COLOR ssbutton.setlabel("Stop", false) mbar.setitem(3, 1, "Stop Generating") else ssbutton.customcolor = START_COLOR ssbutton.darkcustomcolor = SELSTART_COLOR ssbutton.setlabel("Start", false) mbar.setitem(3, 1, "Start Generating") end end -------------------------------------------------------------------------------- function StopGenerating() if generating then generating = false UpdateStartButton() end end -------------------------------------------------------------------------------- function SaveState() -- return a table containing current state local state = {} -- save current grid size state.saveN = N -- save current active plane state.saveplane = activeplane state.savepos = activepos -- save current cursor state.savecursor = currcursor -- save current rule state.saverule = rulestring -- save current step size state.savestep = stepsize -- save current pattern state.savedirty = dirty state.savename = pattname state.savegencount = gencount state.savepopcount = popcount state.savecells = {} if popcount > 0 then for k,_ in pairs(grid1) do state.savecells[k] = 1 end end state.saveminx = minx state.saveminy = miny state.saveminz = minz state.savemaxx = maxx state.savemaxy = maxy state.savemaxz = maxz state.saveminimallive = minimal_live_bounds -- save current selection state.saveselcount = selcount state.saveselected = {} if selcount > 0 then for k,_ in pairs(selected) do state.saveselected[k] = true end end state.saveminselx = minselx state.saveminsely = minsely state.saveminselz = minselz state.savemaxselx = maxselx state.savemaxsely = maxsely state.savemaxselz = maxselz state.saveminimalsel = minimal_sel_bounds -- save current paste pattern state.savepcount = pastecount state.savepaste = {} if pastecount > 0 then for k,_ in pairs(pastepatt) do state.savepaste[k] = true end end state.saveminpastex = minpastex state.saveminpastey = minpastey state.saveminpastez = minpastez state.savemaxpastex = maxpastex state.savemaxpastey = maxpastey state.savemaxpastez = maxpastez return state end -------------------------------------------------------------------------------- function RestoreState(state) -- restore state from given info (created earlier by SaveState) -- restore grid size and active plane if necessary if N ~= state.saveN then SetGridSizeOnly(state.saveN) CreateAxes() -- active plane also depends on N SetActivePlane(state.saveplane, state.savepos) elseif activeplane ~= state.saveplane or activepos ~= state.savepos then SetActivePlane(state.saveplane, state.savepos) end -- restore cursor (determines whether active plane is displayed) currcursor = state.savecursor if not arrow_cursor then ov("cursor "..currcursor) end -- restore rule if necessary if rulestring ~= state.saverule then ParseRule(state.saverule) end -- restore step size SetStepSize(state.savestep) -- restore pattern dirty = state.savedirty pattname = state.savename gencount = state.savegencount popcount = state.savepopcount grid1 = {} if popcount > 0 then for k,_ in pairs(state.savecells) do grid1[k] = 1 end end minx = state.saveminx miny = state.saveminy minz = state.saveminz maxx = state.savemaxx maxy = state.savemaxy maxz = state.savemaxz minimal_live_bounds = state.saveminimallive -- restore selection selcount = state.saveselcount selected = {} if selcount > 0 then for k,_ in pairs(state.saveselected) do selected[k] = true end end minselx = state.saveminselx minsely = state.saveminsely minselz = state.saveminselz maxselx = state.savemaxselx maxsely = state.savemaxsely maxselz = state.savemaxselz minimal_sel_bounds = state.saveminimalsel -- restore paste pattern pastecount = state.savepcount pastepatt = {} if pastecount > 0 then for k,_ in pairs(state.savepaste) do pastepatt[k] = true end end minpastex = state.saveminpastex minpastey = state.saveminpastey minpastez = state.saveminpastez maxpastex = state.savemaxpastex maxpastey = state.savemaxpastey maxpastez = state.savemaxpastez ovt{"setpattern3d", grid1, false} -- nicer not to clear history??? update_grid = false end -------------------------------------------------------------------------------- function SameState(state) -- return true if given state matches the current state if N ~= state.saveN then return false end if activeplane ~= state.saveplane then return false end if activepos ~= state.savepos then return false end if currcursor ~= state.savecursor then return false end if rulestring ~= state.saverule then return false end if dirty ~= state.savedirty then return false end if pattname ~= state.savename then return false end if gencount ~= state.savegencount then return false end if popcount ~= state.savepopcount then return false end if selcount ~= state.saveselcount then return false end if pastecount ~= state.savepcount then return false end -- note that we don't compare stepsize with state.savestep -- (we don't call RememberCurrentState when the user changes the step size) for k,_ in pairs(state.savecells) do if not grid1[k] then return false end end for k,_ in pairs(state.saveselected) do if not selected[k] then return false end end for k,_ in pairs(state.savepaste) do if not pastepatt[k] then return false end end return true end -------------------------------------------------------------------------------- function ClearUndoRedo() -- this might be called if a user script is running (eg. if it calls NewPattern) undostack = {} redostack = {} dirty = false end -------------------------------------------------------------------------------- function Undo() -- ignore if user script is running -- (scripts can call SaveState and RestoreState if they need to undo stuff) if scriptlevel > 0 then return end if #undostack > 0 then StopGenerating() -- push current state onto redostack redostack[#redostack+1] = SaveState() -- pop state off undostack and restore it RestoreState( table.remove(undostack) ) Refresh() end end -------------------------------------------------------------------------------- function Redo() -- ignore if user script is running if scriptlevel > 0 then return end if #redostack > 0 then StopGenerating() -- push current state onto undostack undostack[#undostack+1] = SaveState() -- pop state off redostack and restore it RestoreState( table.remove(redostack) ) Refresh() end end -------------------------------------------------------------------------------- function RememberCurrentState() -- ignore if user script is running if scriptlevel > 0 then return end redostack = {} undostack[#undostack+1] = SaveState() end -------------------------------------------------------------------------------- function CheckIfGenerating() if generating and popcount > 0 and gencount > startcount then -- NextGeneration will be called soon RememberCurrentState() end end -------------------------------------------------------------------------------- function InitLiveBoundary() -- check for cells on grid edge liveedge = (minx == 0 or miny == 0 or minz == 0 or maxx == N-1 or maxy == N-1 or maxz == N-1) -- reset boundary minx = math.maxinteger miny = math.maxinteger minz = math.maxinteger maxx = math.mininteger maxy = math.mininteger maxz = math.mininteger -- SetLiveCell/SetCellState/NextGeneration will update all values -- set the flag for MinimizeLiveBoundary minimal_live_bounds = true end -------------------------------------------------------------------------------- function MinimizeLiveBoundary() if popcount > 0 and not minimal_live_bounds then InitLiveBoundary() -- minimal_live_bounds is now true local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell local x = k % N local y = k % NN if x < minx then minx = x end if y < miny then miny = y end if k < minz then minz = k end if x > maxx then maxx = x end if y > maxy then maxy = y end if k > maxz then maxz = k end end miny = miny // N maxy = maxy // N minz = minz // NN maxz = maxz // NN end end -------------------------------------------------------------------------------- function InitSelectionBoundary() minselx = math.maxinteger minsely = math.maxinteger minselz = math.maxinteger maxselx = math.mininteger maxsely = math.mininteger maxselz = math.mininteger -- set the flag for MinimizeSelectionBoundary minimal_sel_bounds = true end -------------------------------------------------------------------------------- local function UpdateSelectionBoundary(x, y, z) if x < minselx then minselx = x end if y < minsely then minsely = y end if z < minselz then minselz = z end if x > maxselx then maxselx = x end if y > maxsely then maxsely = y end if z > maxselz then maxselz = z end end -------------------------------------------------------------------------------- function MinimizeSelectionBoundary() if selcount > 0 and not minimal_sel_bounds then -- find minimal bounding box of all selected cells InitSelectionBoundary() -- minimal_sel_bounds is now true local NN = N*N for k,_ in pairs(selected) do UpdateSelectionBoundary(k % N, (k // N) % N, k // NN) end end end -------------------------------------------------------------------------------- function ClearCells() grid1 = {} popcount = 0 InitLiveBoundary() -- remove selection selcount = 0 selected = {} InitSelectionBoundary() -- remove paste pattern pastecount = 0 pastepatt = {} collectgarbage() -- good place to force a gc end -------------------------------------------------------------------------------- function MoveActivePlane(newpos, refresh) if currcursor ~= movecursor then local mid = N//2 if newpos + mid < 0 then newpos = -mid elseif newpos + mid >= N then newpos = N-1-mid end if newpos == activepos then return end -- note that refresh is false if called from DragActivePlane -- (in which case RememberCurrentState has already been called -- by StartDraggingPlane) if refresh then RememberCurrentState() end -- use the same orientation SetActivePlane(activeplane, newpos) if refresh then CheckIfGenerating() Refresh() end end end -------------------------------------------------------------------------------- function CycleActivePlane() if currcursor ~= movecursor then RememberCurrentState() -- cycle to next orientation of active plane if activeplane == "XY" then SetActivePlane("YZ", activepos) elseif activeplane == "YZ" then SetActivePlane("XZ", activepos) else -- activeplane == "XZ" SetActivePlane("XY", activepos) end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- local function SetSelection(x, y, z, sel) local pos = x + N * (y + N * z) if sel then if not selected[pos] then selected[pos] = true selcount = selcount + 1 UpdateSelectionBoundary(x, y, z) end elseif selected[pos] then selected[pos] = nil selcount = selcount - 1 -- tell MinimizeSelectionBoundary that it needs to update the selection boundary minimal_sel_bounds = false end end -------------------------------------------------------------------------------- local function SetCellState(x, y, z, state) local pos = x + N * (y + N * z) if state > 0 then if not grid1[pos] then grid1[pos] = state popcount = popcount + 1 dirty = true update_grid = true -- boundary might expand if x < minx then minx = x end if y < miny then miny = y end if z < minz then minz = z end if x > maxx then maxx = x end if y > maxy then maxy = y end if z > maxz then maxz = z end end else -- state is 0 if grid1[pos] then -- kill a live cell grid1[pos] = nil popcount = popcount - 1 dirty = true update_grid = true -- tell MinimizeLiveBoundary that it needs to update the live boundary minimal_live_bounds = false end end end -------------------------------------------------------------------------------- local function SetLiveCell(x, y, z) -- this must only be called to create a live cell grid1[ x + N * (y + N * z) ] = 1 popcount = popcount + 1 dirty = true update_grid = true -- boundary might expand if x < minx then minx = x end if y < miny then miny = y end if z < minz then minz = z end if x > maxx then maxx = x end if y > maxy then maxy = y end if z > maxz then maxz = z end end -------------------------------------------------------------------------------- function SaveCells() -- return an array of live cell positions relative to mid cell local livecells = {} if popcount > 0 then local mid = N//2 local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell local x = k % N local y = (k // N) % N local z = k // NN livecells[#livecells+1] = {x-mid, y-mid, z-mid} end end return livecells end -------------------------------------------------------------------------------- function RestoreCells(livecells) -- restore pattern saved earlier by SaveCells -- (note that grid must currently be empty) if popcount > 0 then g.warn("Bug in RestoreCells: grid is not empty!") end local clipped = 0 local mid = N//2 for _, xyz in ipairs(livecells) do local x, y, z = xyz[1]+mid, xyz[2]+mid, xyz[3]+mid if x >= 0 and x < N and y >= 0 and y < N and z >= 0 and z < N then SetLiveCell(x, y, z) else clipped = clipped + 1 end end return clipped end -------------------------------------------------------------------------------- function AllDead() -- this function is called at the start of every NextGen* function if popcount == 0 then StopGenerating() message = "All cells are dead." Refresh() return true -- return from NextGen* else if gencount == startcount then -- remember starting state for later use in Reset() if scriptlevel > 0 then -- can't use undostack if user script is running startstate = SaveState() else -- starting state is on top of undostack startstate = undostack[#undostack] end end popcount = 0 -- incremented in NextGen* InitLiveBoundary() -- updated in NextGen* return false -- calculate the next generation end end -------------------------------------------------------------------------------- function NextGenStandard(single) if AllDead() then return end local oldstep = stepsize if single then SetStepSize(1) end grid1, popcount, gencount, minx, maxx, miny, maxy, minz, maxz = ovt{"nextgen3d", gencount, liveedge} if single then SetStepSize(oldstep) end if popcount == 0 then StopGenerating() end Refresh() end -------------------------------------------------------------------------------- function NextGenBusyBoxes(single) if N%2 == 1 then -- BusyBoxes requires an even number grid size SetGridSize(N+1) end if AllDead() then return end local oldstep = stepsize if single then SetStepSize(1) end grid1, popcount, gencount, minx, maxx, miny, maxy, minz, maxz = ovt{"nextgen3d", gencount} if single then SetStepSize(oldstep) end if popcount == 0 then StopGenerating() end Refresh() end -------------------------------------------------------------------------------- function NewPattern(title) pattname = title or "untitled" SetCursor(drawcursor) gencount = 0 startcount = 0 SetStepSize(1) StopGenerating() ClearCells() ClearUndoRedo() ovt{"setpattern3d", grid1, true} -- clear history update_grid = false -- avoid unnecessary work if user script calls NewPattern if scriptlevel == 0 then SetActivePlane() -- restore default active plane InitialView() -- calls Refresh end end -------------------------------------------------------------------------------- function ReadPattern(filepath) local f = io.open(filepath,"r") if not f then return "Failed to open file:\n"..filepath end -- Lua's f:read("*l") doesn't detect CR as EOL so we do this ugly stuff: -- read entire file and convert any CRs to LFs local all = f:read("*a"):gsub("\r", "\n").."\n" local nextline = all:gmatch("(.-)\n") f:close() local line = nextline() if line == nil or not line:find("^3D") then return "Invalid RLE3 file (first line must start with 3D)." end -- read pattern into a temporary grid in case an error occurs local tsize = MAXN local trule = DEFAULT_RULE local tgens = 0 local tpop = 0 local tminx = math.maxinteger local tminy = math.maxinteger local tminz = math.maxinteger local tmaxx = math.mininteger local tmaxy = math.mininteger local tmaxz = math.mininteger local tgrid = {} local x0, y0, z0 = 0, 0, 0 -- parse 1st line (format is "3D key=val key=val key=val ...") local keys_and_vals = { split(line) } -- keys_and_vals[1] == "3D" for i = 2, #keys_and_vals do local keyword, value = split(keys_and_vals[i],"=") if value == nil then -- ignore keyword elseif keyword == "version" then if value ~= "1" then return "Unexpected version: "..value end elseif keyword == "size" then tsize = tonumber(value) or MAXN if tsize < MINN then tsize = MINN end if tsize > MAXN then tsize = MAXN end elseif keyword == "pos" then x0, y0, z0 = split(value,",") x0 = tonumber(x0) or 0 y0 = tonumber(y0) or 0 z0 = tonumber(z0) or 0 elseif keyword == "gen" then tgens = tonumber(value) or 0 if tgens < 0 then tgens = 0 end end end local wd, ht, dp local x, y, z = 0, 0, 0 local runcount = 0 local comments = "" while true do line = nextline() if not line then break end local ch = line:sub(1,1) if #ch == 0 then -- ignore blank line elseif ch == "#" then comments = comments..line.."\n" elseif ch == "x" then -- parse header wd, ht, dp, trule = line:match("x=(.+) y=(.+) z=(.+) rule=(.+)$") wd = tonumber(wd) ht = tonumber(ht) dp = tonumber(dp) if wd and ht and dp then if max(wd, ht, dp) > tsize then return "The pattern size is bigger than the grid size!" end x = x0 y = y0 z = z0 -- check that pattern is positioned within given grid size if x < 0 or x + wd > tsize or y < 0 or y + ht > tsize or z < 0 or z + dp > tsize then return "The pattern is positioned outside the grid!" end else return "Bad number in header line:\n"..line end local saverule = rulestring if not ParseRule(trule) then return "Unknown rule: "..trule end trule = rulestring -- restore rulestring etc in case there is a later error -- or we're doing a paste and want to ignore the specified rule ParseRule(saverule) else -- parse RLE3 data for i = 1, #line do ch = line:sub(i,i) if ch >= "0" and ch <= "9" then runcount = runcount * 10 + tonumber(ch) else if runcount == 0 then runcount = 1 end if ch == "b" then x = x + runcount elseif ch == "o" then repeat tgrid[ x + tsize * (y + tsize * z) ] = 1 tpop = tpop + 1 -- update boundary if x < tminx then tminx = x end if y < tminy then tminy = y end if z < tminz then tminz = z end if x > tmaxx then tmaxx = x end if y > tmaxy then tmaxy = y end if z > tmaxz then tmaxz = z end x = x + 1 runcount = runcount - 1 until runcount == 0 elseif ch == "$" then x = x0 y = y + runcount elseif ch == "/" then x = x0 y = y0 z = z + runcount elseif ch == "!" then break else return "Unexpected character: "..ch end runcount = 0 end end end end -- success local newpattern = { newsize = tsize, newrule = trule, newgens = tgens, newpop = tpop, newminx = tminx, newminy = tminy, newminz = tminz, newmaxx = tmaxx, newmaxy = tmaxy, newmaxz = tmaxz, newgrid = tgrid } return nil, newpattern, comments end -------------------------------------------------------------------------------- function UpdateCurrentGrid(newpattern) -- called by OpenPattern/OpenClipboard SetGridSizeOnly(newpattern.newsize) CreateAxes() ClearCells() -- resets grid1, popcount and selection info grid1 = newpattern.newgrid popcount = newpattern.newpop minx = newpattern.newminx miny = newpattern.newminy minz = newpattern.newminz maxx = newpattern.newmaxx maxy = newpattern.newmaxy maxz = newpattern.newmaxz -- note that ClearCells has set minimal_live_bounds = true ParseRule(newpattern.newrule) -- sets rulestring, survivals, births, NextGeneration gencount = newpattern.newgens startcount = gencount -- for Reset SetStepSize(1) StopGenerating() SetCursor(movecursor) ClearUndoRedo() -- dirty = false ovt{"setpattern3d", grid1, true} -- clear history update_grid = false if scriptlevel == 0 then SetActivePlane() InitialView() -- calls Refresh end end -------------------------------------------------------------------------------- function OpenPattern(filepath) if filepath then local err, newpattern, comments = ReadPattern(filepath) if err then g.warn(err, false) else -- pattern ok so use info in newpattern to update current grid; -- set pattname to file name at end of filepath pattname = filepath:match("^.+"..pathsep.."(.+)$") if #comments > 0 then message = comments end UpdateCurrentGrid(newpattern) end else -- prompt user for a .rle3 file to open local filetype = "RLE3 file (*.rle3)|*.rle3" local path = g.opendialog("Open a pattern", filetype, pattdir, "") if #path > 0 then -- update pattdir by stripping off the file name pattdir = path:gsub("[^"..pathsep.."]+$","") -- open the chosen pattern OpenPattern(path) end end end -------------------------------------------------------------------------------- function CopyClipboardToFile() -- create a temporary file containing clipboard text local filepath = g.getdir("temp").."clipboard.rle3" local f = io.open(filepath,"w") if not f then g.warn("Failed to create temporary clipboard file!", false) return nil end -- NOTE: we can't do f:write(string.gsub(g.getclipstr(),"\r","\n")) -- because gsub returns 2 results and we'd get count appended to file! local clip = string.gsub(g.getclipstr(),"\r","\n") f:write(clip) f:close() return filepath end -------------------------------------------------------------------------------- function OpenClipboard() local filepath = CopyClipboardToFile() if filepath then local err, newpattern, comments = ReadPattern(filepath) if err then g.warn(err, false) else -- pattern ok so use info in newpattern to update current grid pattname = "clipboard" if #comments > 0 then message = comments end UpdateCurrentGrid(newpattern) end end end -------------------------------------------------------------------------------- function PatternHeader(xpos, ypos, zpos) -- return RLE3 header line local header = "3D version=1 size="..N if popcount > 0 and (xpos ~= 0 or ypos ~= 0 or zpos ~= 0) then header = header..string.format(" pos=%d,%d,%d", xpos, ypos, zpos) end if gencount > 0 then header = header.." gen="..gencount end -- note that we let caller append \n if necessary return header end -------------------------------------------------------------------------------- function WritePattern(filepath, comments) local f = io.open(filepath,"w") if not f then return "Failed to create RLE3 file:\n"..filepath end MinimizeLiveBoundary() f:write(PatternHeader(minx, miny, minz), "\n") if #comments > 0 then -- each comment line should start with # and end with \n f:write(comments) end if popcount == 0 then f:write(string.format("x=0 y=0 z=0 rule=%s\n", rulestring)) f:write("!\n") else local wd = maxx - minx + 1 local ht = maxy - miny + 1 local dp = maxz - minz + 1 f:write(string.format("x=%d y=%d z=%d rule=%s\n", wd, ht, dp, rulestring)) local line = "" local orun = 0 local brun = 0 local dollrun = 0 local slashrun = 0 local function AddRun(count, ch) if #line >= 67 then f:write(line,"\n"); line = "" end if count > 2 then line = line..count..ch elseif count == 2 then line = line..ch..ch else line = line..ch end end -- traverse all cells within live boundary sorted by Z,Y,X coords for z = minz, maxz do for y = miny, maxy do for x = minx, maxx do if grid1[ x + N * (y + N * z) ] then -- live cell orun = orun + 1 if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end if brun > 0 then AddRun(brun, "b") brun = 0 end else -- dead cell brun = brun + 1 if orun > 0 then if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end AddRun(orun, "o") orun = 0 end end end if orun > 0 then if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end AddRun(orun, "o") orun = 0 end brun = 0 dollrun = dollrun + 1 end dollrun = 0 if z < maxz then slashrun = slashrun + 1 else if #line >= 70 then f:write(line,"\n"); line = "" end line = line.."!" end end if #line > 0 then f:write(line,"\n") end end f:close() return nil -- success end -------------------------------------------------------------------------------- function GetComments(f) local comments = "" -- Lua's f:read("*l") doesn't detect CR as EOL so we do this ugly stuff: -- read entire file and convert any CRs to LFs local all = f:read("*a"):gsub("\r", "\n").."\n" local nextline = all:gmatch("(.-)\n") while true do local line = nextline() if not line then break end local ch = line:sub(1,1) if ch == "#" then comments = comments..line.."\n" elseif ch == "x" then -- end of RLE3 header info break end end return comments end -------------------------------------------------------------------------------- function SavePattern(filepath) if filepath then -- if filepath exists then extract any comment lines from the header -- info and copy them into the new file local comments = "" local f = io.open(filepath,"r") if f then comments = GetComments(f) f:close() end local err = WritePattern(filepath, comments) if err then g.warn(err, false) else -- set pattname to file name at end of filepath pattname = filepath:match("^.+"..pathsep.."(.+)$") dirty = false Refresh() end else -- prompt user for file name and location local filetype = "RLE3 file (*.rle3)|*.rle3" local path = g.savedialog("Save pattern", filetype, pattdir, pattname) if #path > 0 then -- update pattdir by stripping off the file name pattdir = path:gsub("[^"..pathsep.."]+$","") -- ensure file name ends with ".rle3" if not path:find("%.rle3$") then path = path..".rle3" end -- save the current pattern SavePattern(path) end end end -------------------------------------------------------------------------------- function CallScript(func, fromclip) -- avoid infinite recursion if scriptlevel == 100 then g.warn("Script is too recursive!", false) return end if scriptlevel == 0 then RememberCurrentState() -- #undostack is > 0 EnableControls(false) -- disable most menu items and buttons end scriptlevel = scriptlevel + 1 local status, err = pcall(func) scriptlevel = scriptlevel - 1 if scriptlevel == 0 then -- note that if the script called NewPattern/RandomPattern/OpenPattern -- or any other function that called ClearUndoRedo then the undostack -- is empty and dirty should be false if #undostack == 0 then -- a later SetCell call might have set dirty to true, so reset it dirty = false if gencount > startcount then -- script called Step after NewPattern/RandomPattern/OpenPattern -- so push startstate onto undostack so user can Reset/Undo undostack[1] = startstate startstate.savedirty = false end elseif SameState(undostack[#undostack]) then -- script didn't change the current state so pop undostack table.remove(undostack) end end if err then g.continue("") if err == "GOLLY: ABORT SCRIPT" then -- user hit escape message = "Script aborted." else if fromclip then g.warn("Runtime error in clipboard script:\n\n"..err, false) else g.warn("Runtime error in script:\n\n"..err, false) end end end if scriptlevel == 0 then EnableControls(true) -- enable menu items and buttons that were disabled above CheckIfGenerating() Refresh() -- calls DrawToolBar end end -------------------------------------------------------------------------------- function RunScript(filepath) if filepath then local f = io.open(filepath, "r") if f then -- Lua's f:read("*l") doesn't detect CR as EOL so we do this ugly stuff: -- read entire file and convert any CRs to LFs local all = f:read("*a"):gsub("\r", "\n").."\n" local nextline = all:gmatch("(.-)\n") local line1 = nextline() f:close() if not (line1 and line1:find("3D.lua")) then g.warn("3D.lua was not found on first line of script.", false) return end else g.warn("Script file could not be opened:\n"..filepath, false) return end local func, msg = loadfile(filepath) if func then CallScript(func, false) else g.warn("Syntax error in script:\n\n"..msg, false) end else -- prompt user for a .lua file to run local filetype = "Lua file (*.lua)|*.lua" local path = g.opendialog("Choose a Lua script", filetype, scriptdir, "") if #path > 0 then -- update scriptdir by stripping off the file name scriptdir = path:gsub("[^"..pathsep.."]+$","") -- run the chosen script RunScript(path) end end end -------------------------------------------------------------------------------- function RunClipboard() local cliptext = g.getclipstr() local eol = cliptext:find("[\n\r]") if not (eol and cliptext:sub(1,eol):find("3D.lua")) then g.warn("3D.lua was not found on first line of clipboard.", false) return end local func, msg = load(cliptext) if func then CallScript(func, true) else g.warn("Syntax error in clipboard script:\n\n"..msg, false) end end -------------------------------------------------------------------------------- function SetStartupScript() -- prompt user for a .lua file to run automatically when 3D.lua starts up local filetype = "Lua file (*.lua)|*.lua" local path = g.opendialog("Select your startup script", filetype, scriptdir, "") if #path > 0 then -- update scriptdir by stripping off the file name scriptdir = path:gsub("[^"..pathsep.."]+$","") startup = path -- the above path will be saved by WriteSettings end end -------------------------------------------------------------------------------- function RandomPattern(percentage, fill, sphere) local function getperc() local initstring = randstring ::try_again:: local s = g.getstring("Enter density as a percentage (from 0 to 100).\n".. "Append \"f\" to fill the grid.\n".. "Append \"s\" to create a sphere.", initstring, "Random pattern") initstring = s fill = s:find("f") sphere = s:find("s") s = s:gsub("[fs]","") if s:find("[^%d]") then g.warn("Only digits and the letters f and s are allowed.\nTry again.") goto try_again end if validint(s) and (tonumber(s) >= 0) and (tonumber(s) <= 100) then perc = tonumber(s) randstring = initstring else g.warn("Percentage must be an integer from 0 to 100.\nTry again.") goto try_again end end if percentage then perc = percentage if perc < 0 then perc = 0 end if perc > 100 then perc = 100 end else -- prompt user for the percentage and fill/sphere options; -- if user hits Cancel button we want to avoid aborting script local status, err = pcall(getperc) if err then g.continue("") -- don't show error when script finishes return end end pattname = "untitled" SetCursor(movecursor) gencount = 0 startcount = 0 SetStepSize(1) StopGenerating() ClearCells() local minval, maxval if fill or N < 8 then minval = 0 maxval = N-1 else minval = N//8 maxval = (N-1) - minval end if sphere then local mid = N//2 if N % 2 == 0 then mid = mid - 0.5 end -- ensure symmetry for even N local rsq = (maxval-minval+1)/2.0 rsq = round(rsq*rsq) for z = minval, maxval do local dz = z-mid local dz2 = round(dz*dz) for y = minval, maxval do local dy = y-mid local dy2 = round(dy*dy) for x = minval, maxval do local dx = x-mid local d = round(dx*dx) + dy2 + dz2 if d <= rsq and rand(0,99) < perc then SetLiveCell(x, y, z) end end end end else for z = minval, maxval do for y = minval, maxval do for x = minval, maxval do if rand(0,99) < perc then SetLiveCell(x, y, z) end end end end end ClearUndoRedo() ovt{"setpattern3d", grid1, true} -- clear history update_grid = false if scriptlevel == 0 then SetActivePlane() InitialView() -- calls Refresh end end -------------------------------------------------------------------------------- function GetSelectedCells() -- return an array of selected cell positions relative to mid cell local selcells = {} if selcount > 0 then local mid = N//2 local NN = N*N for k,_ in pairs(selected) do -- selected[k] is a selected cell local x = k % N local y = (k // N) % N local z = k // NN selcells[#selcells+1] = {x-mid, y-mid, z-mid} end end return selcells end -------------------------------------------------------------------------------- function GetSelectedLiveCells() -- return an array of selected *live* cell positions relative to mid cell local livecells = {} if selcount > 0 then local mid = N//2 local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell if selected[k] then local x = k % N local y = (k // N) % N local z = k // NN livecells[#livecells+1] = {x-mid, y-mid, z-mid} end end end return livecells end -------------------------------------------------------------------------------- function GetPasteCells() -- return an array of paste cell positions relative to mid cell local pcells = {} if pastecount > 0 then local mid = N//2 local NN = N*N for k,_ in pairs(pastepatt) do -- pastepatt[k] is in paste pattern local x = k % N local y = (k // N) % N local z = k // NN pcells[#pcells+1] = {x-mid, y-mid, z-mid} end end return pcells end -------------------------------------------------------------------------------- function SetTemporaryGridSize(newsize) N = newsize -- do not call ovt{"setsize3d", N} here as newsize can be > MAXN MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID end -------------------------------------------------------------------------------- function SetGridSizeOnly(newsize) N = newsize ovt{"setsize3d", N} MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID end -------------------------------------------------------------------------------- function SetGridSize(newsize) -- change grid size to newsize or prompt user if newsize is nil local function getsize() ::try_again:: local s = g.getstring("Enter the new size (from "..MINN.." to "..MAXN.."):", tostring(N), "Grid size") if validint(s) and (tonumber(s) >= MINN) and (tonumber(s) <= MAXN) then newsize = tonumber(s) else g.warn("Grid size must be an integer from "..MINN.." to "..MAXN..".") -- note that if user hit the Cancel button then the next g.* call -- (in this case g.getstring) will cause pcall to abort with an error goto try_again end end if newsize then if newsize < MINN then newsize = MINN end if newsize > MAXN then newsize = MAXN end else -- if user hits Cancel button we want to avoid aborting script local status, err = pcall(getsize) if err then g.continue("") -- don't show error when script finishes return end end if newsize == N then return end RememberCurrentState() -- save current pattern as an array of positions relative to mid cell local livecells = SaveCells() -- save any selected cells as an array of positions relative to mid cell local oldselcount = selcount local selcells = GetSelectedCells() -- save any paste cells as an array of positions relative to mid cell local oldpastecount = pastecount local pcells = GetPasteCells() SetGridSizeOnly(newsize) CreateAxes() -- active plane may need adjusting local mid = N//2 if (mid + activepos >= N) or (mid + activepos < 0) then activepos = 0 end SetActivePlane(activeplane, activepos) -- restore pattern, clipping any cells outside the new grid ClearCells() local olddirty = dirty local clipcount = RestoreCells(livecells) if clipcount > 0 then dirty = true update_grid = true else -- RestoreCells sets dirty true if there are live cells, -- but pattern hasn't really changed if no cells were clipped dirty = olddirty end -- restore selection, clipping any cells outside the new grid local selclipped = 0 selcount = 0 selected = {} InitSelectionBoundary() if oldselcount > 0 then for _, xyz in ipairs(selcells) do local x, y, z = xyz[1]+mid, xyz[2]+mid, xyz[3]+mid if x >= 0 and x < N and y >= 0 and y < N and z >= 0 and z < N then selected[ x + N * (y + N * z) ] = true selcount = selcount + 1 UpdateSelectionBoundary(x, y, z) else selclipped = selclipped + 1 end end end -- restore paste pattern, clipping any cells outside the new grid local pclipped = 0 pastecount = 0 pastepatt = {} minpastex = math.maxinteger minpastey = math.maxinteger minpastez = math.maxinteger maxpastex = math.mininteger maxpastey = math.mininteger maxpastez = math.mininteger if oldpastecount > 0 then for _, xyz in ipairs(pcells) do local x, y, z = xyz[1]+mid, xyz[2]+mid, xyz[3]+mid if x >= 0 and x < N and y >= 0 and y < N and z >= 0 and z < N then pastepatt[ x + N * (y + N * z) ] = true pastecount = pastecount + 1 if x < minpastex then minpastex = x end if y < minpastey then minpastey = y end if z < minpastez then minpastez = z end if x > maxpastex then maxpastex = x end if y > maxpastey then maxpastey = y end if z > maxpastez then maxpastez = z end else pclipped = pclipped + 1 end end end if clipcount > 0 or selclipped > 0 or pclipped > 0 then message = "" if clipcount > 0 then message = "Clipped live cells = "..clipcount.."\n" end if selclipped > 0 then message = message.."Clipped selection cells = "..selclipped.."\n" end if pclipped > 0 then message = message.."Clipped paste cells = "..pclipped end end -- reload the grid since it will have changed after resize ovt{"setpattern3d", grid1, true} -- also clear history update_grid = false CheckIfGenerating() FitGrid() -- calls Refresh end -------------------------------------------------------------------------------- function ChangeRule() -- let user enter new rule as a string of the form 3Ds,s,.../b,b,... -- (the notation used at http://www.cse.sc.edu/~bays/d4d4d4/) local function getrule() local newrule = rulestring ::try_again:: newrule = g.getstring("Enter the new rule in the form 3Ds,s,s,.../b,b,b,...\n" .. "where s values are the neighbor counts for survival\n" .. "and b values are the neighbor counts for birth.\n" .. "\n" .. "Contiguous counts can be specified as a range,\n" .. "so a rule like 3D4,5,6,7,9/4,5,7 can be entered as\n" .. "3D4..7,9/4,5,7 (this is the canonical version).\n" .. "\n" .. "Append F for the 6-cell face neighborhood,\n" .. "or C for the 8-cell corner neighborhood,\n" .. "or E for the 12-cell edge neighborhood,\n" .. "or H for the 12-cell hexahedral neighborhood.\n" .. "\n" .. "Another rule you might like to try is BusyBoxes\n" .. "(just enter \"bb\", or \"bbw\" to wrap edges).\n", newrule, "Set rule") if not ParseRule(newrule) then goto try_again end end local oldrule = rulestring -- if user hits Cancel button we want to avoid aborting script local status, err = pcall(getrule) if err then g.continue("") -- don't show error when script finishes return end if oldrule ~= rulestring then -- ParseRule has set rulestring so we need to temporarily switch -- it back to oldrule and call RememberCurrentState local newrule = rulestring rulestring = oldrule if newrule:find("^BusyBoxes") and N%2 == 1 then -- BusyBoxes requires an even numbered grid size SetGridSize(N+1) -- above calls RememberCurrentState() else RememberCurrentState() end rulestring = newrule CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function CreateRLE3Selection() -- convert selection to lines of RLE3 data -- (note that selcount > 0 and at least one live cell is selected) MinimizeSelectionBoundary() local wd = maxselx - minselx + 1 local ht = maxsely - minsely + 1 local dp = maxselz - minselz + 1 local lines = {} lines[1] = PatternHeader(minselx, minsely, minselz) lines[2] = string.format("x=%d y=%d z=%d rule=%s", wd, ht, dp, rulestring) local line = "" local orun = 0 local brun = 0 local dollrun = 0 local slashrun = 0 local function AddRun(count, ch) if #line >= 67 then lines[#lines+1] = line; line = "" end if count > 2 then line = line..count..ch elseif count == 2 then line = line..ch..ch else line = line..ch end end -- traverse selected cells sorted by Z,Y,X coords for z = minselz, maxselz do for y = minsely, maxsely do for x = minselx, maxselx do local pos = x + N * (y + N * z) if selected[pos] and grid1[pos] then -- this is a selected live cell orun = orun + 1 if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end if brun > 0 then AddRun(brun, "b") brun = 0 end else -- dead cell or unselected live cell brun = brun + 1 if orun > 0 then if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end AddRun(orun, "o") orun = 0 end end end if orun > 0 then if slashrun > 0 then AddRun(slashrun, "/") slashrun = 0 end if dollrun > 0 then AddRun(dollrun, "$") dollrun = 0 end AddRun(orun, "o") orun = 0 end brun = 0 dollrun = dollrun + 1 end dollrun = 0 if z < maxselz then slashrun = slashrun + 1 else if #line >= 70 then lines[#lines+1] = line; line = "" end line = line.."!" end end if #line > 0 then lines[#lines+1] = line end return lines end -------------------------------------------------------------------------------- function CopySelection() if selcount > 0 then -- save the selected live cells as an RLE3 pattern in clipboard, -- but only if there is at least one live cell selected local livecells = GetSelectedLiveCells() if #livecells == 0 then message = "There are no live cells selected." Refresh() return false end local lines = CreateRLE3Selection() -- append empty string so we get \n at end of last line lines[#lines+1] = "" g.setclipstr(table.concat(lines,"\n")) return true else return false end end -------------------------------------------------------------------------------- function ClearSelection() if selcount > 0 then RememberCurrentState() -- kill all selected live cells for k,_ in pairs(selected) do -- selected[k] is a selected cell (live or dead) if grid1[k] then grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function ClearOutside() if selcount > 0 then RememberCurrentState() -- kill all unselected live cells for k,_ in pairs(grid1) do -- grid1[k] is a live cell if not selected[k] then grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function CutSelection() if selcount > 0 then -- save the selected live cells as an RLE3 pattern in clipboard -- then kill them if CopySelection() then ClearSelection() -- calls RememberCurrentState and Refresh return true end end return false end -------------------------------------------------------------------------------- function CancelSelection() if selcount > 0 then RememberCurrentState() selcount = 0 selected = {} InitSelectionBoundary() CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function SelectAll() if popcount > 0 then RememberCurrentState() selcount = 0 selected = {} for k,_ in pairs(grid1) do selected[k] = true selcount = selcount + 1 end -- selection boundary matches live cell boundary minselx = minx minsely = miny minselz = minz maxselx = maxx maxsely = maxy maxselz = maxz minimal_sel_bounds = minimal_live_bounds CheckIfGenerating() Refresh() else -- there are no live cells so remove any existing selection CancelSelection() end end -------------------------------------------------------------------------------- function FlipSelectionX() if selcount > 0 then RememberCurrentState() -- reflect selected cells' X coords across YZ plane thru middle of selection MinimizeSelectionBoundary() local fmidx = minselx + (maxselx - minselx) / 2 local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {round(fmidx*2) - x, y, z, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} -- flip doesn't change selection boundary so no need to call -- InitSelectionBoundary and UpdateSelectionBoundary for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function FlipSelectionY() if selcount > 0 then RememberCurrentState() -- reflect selected cells' Y coords across XZ plane thru middle of selection MinimizeSelectionBoundary() local fmidy = minsely + (maxsely - minsely) / 2 local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, round(fmidy*2) - y, z, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} -- flip doesn't change selection boundary so no need to call -- InitSelectionBoundary and UpdateSelectionBoundary for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function FlipSelectionZ() if selcount > 0 then RememberCurrentState() -- reflect selected cells' Z coords across XY plane thru middle of selection MinimizeSelectionBoundary() local fmidz = minselz + (maxselz - minselz) / 2 local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, y, round(fmidz*2) - z, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} -- flip doesn't change selection boundary so no need to call -- InitSelectionBoundary and UpdateSelectionBoundary for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotateSelectionX() if selcount > 0 then RememberCurrentState() -- rotate selection clockwise about its X axis by 90 degrees MinimizeSelectionBoundary() local fmidy = minsely + (maxsely - minsely) // 2 local fmidz = minselz + (maxselz - minselz) // 2 local y0 = fmidy - fmidz local z0 = fmidz + fmidy + (maxselz - minselz) % 2 -- avoids drift local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, (y0+z) % N, (z0-y) % N, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} InitSelectionBoundary() for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true UpdateSelectionBoundary(x, y, z) if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotateSelectionY() if selcount > 0 then RememberCurrentState() -- rotate selection clockwise about its Y axis by 90 degrees MinimizeSelectionBoundary() local fmidx = minselx + (maxselx - minselx) // 2 local fmidz = minselz + (maxselz - minselz) // 2 local x0 = fmidx + fmidz + (maxselx - minselx) % 2 -- avoids drift local z0 = fmidz - fmidx local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {(x0-z) % N, y, (z0+x) % N, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} InitSelectionBoundary() for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true UpdateSelectionBoundary(x, y, z) if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotateSelectionZ() if selcount > 0 then RememberCurrentState() -- rotate selection clockwise about its Z axis by 90 degrees MinimizeSelectionBoundary() local fmidx = minselx + (maxselx - minselx) // 2 local fmidy = minsely + (maxsely - minsely) // 2 local x0 = fmidx - fmidy local y0 = fmidy + fmidx + (maxsely - minsely) % 2 -- avoids drift local cells = {} local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {(x0+y) % N, (y0-x) % N, z, grid1[k]} if grid1[k] then grid1[k] = nil popcount = popcount - 1 -- SetLiveCell below will set dirty = true minimal_live_bounds = false end end selected = {} InitSelectionBoundary() for _,xyzs in ipairs(cells) do local x, y, z, live = xyzs[1], xyzs[2], xyzs[3], xyzs[4] local k = x + N * (y + N * z) selected[k] = true UpdateSelectionBoundary(x, y, z) if live and not grid1[k] then -- best to use OR mode for selection actions SetLiveCell(x, y, z) end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function CancelPaste() if pastecount > 0 then RememberCurrentState() pastecount = 0 pastepatt = {} CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function Read2DPattern(filepath) -- call g.load via pcall to catch any error local cellarray local function loadcells() cellarray = g.load(filepath) -- if g.load detected an error then force pcall to abort g.doevent("") end local status, err = pcall(loadcells) if err then g.continue("") return err end -- copy cells from cellarray into a temporary grid local tsize = MAXN local trule = rulestring local tgens = 0 local tpop = 0 local tminx = math.maxinteger local tminy = math.maxinteger local tminz = 0 local tmaxx = math.mininteger local tmaxy = math.mininteger local tmaxz = 0 local tgrid = {} -- determine if cellarray is one-state or multi-state local len = #cellarray local inc = 2 if (len & 1) == 1 then inc = 3 -- ignore padding int if present if len % 3 == 1 then len = len - 1 end end local M = tsize-1 for i = 1, len, inc do local x = cellarray[i] local y = M - cellarray[i+1] -- invert y coord if x < 0 or x >= tsize or y < 0 or y >= tsize then return "too big" -- detected by caller end -- note that z is 0 tgrid[x + tsize * y] = 1 tpop = tpop + 1 -- update boundary (tminz = tmaxz = 0) if x < tminx then tminx = x end if y < tminy then tminy = y end if x > tmaxx then tmaxx = x end if y > tmaxy then tmaxy = y end end -- success local newpattern = { newsize = tsize, newrule = trule, newgens = tgens, newpop = tpop, newminx = tminx, newminy = tminy, newminz = tminz, newmaxx = tmaxx, newmaxy = tmaxy, newmaxz = tmaxz, newgrid = tgrid } return nil, newpattern end -------------------------------------------------------------------------------- function Paste() -- if a paste pattern already exists then cancel it local savedstate = false if pastecount > 0 then CancelPaste() savedstate = true end -- if the clipboard contains a valid RLE3 or 2D pattern then create a paste pattern local filepath = CopyClipboardToFile() if not filepath then return false end local err, newpattern = ReadPattern(filepath) if err then -- invalid RLE3 pattern so try loading a 2D pattern err, newpattern = Read2DPattern(filepath) if err then if err == "too big" then message = "2D pattern in clipboard is too big." else message = "Clipboard does not contain a valid pattern." end Refresh() return false end end if newpattern.newpop == 0 then message = "Clipboard pattern is empty." Refresh() return false end -- newpattern contains valid pattern, but might be too big local minpx = newpattern.newminx local minpy = newpattern.newminy local minpz = newpattern.newminz local pwd = newpattern.newmaxx - minpx + 1 local pht = newpattern.newmaxy - minpy + 1 local pdp = newpattern.newmaxz - minpz + 1 if pwd > N or pht > N or pdp > N then message = "Clipboard pattern is too big ("..pwd.." x "..pht.." x "..pdp..")." Refresh() return false end if not savedstate then RememberCurrentState() end -- set pastecount and pastepatt pastecount = newpattern.newpop pastepatt = {} minpastex = math.maxinteger minpastey = math.maxinteger minpastez = math.maxinteger maxpastex = math.mininteger maxpastey = math.mininteger maxpastez = math.mininteger local P = newpattern.newsize local PP = P*P if currcursor ~= movecursor and min(pwd,pht,pdp) == 1 then -- put 1-cell thick paste pattern in middle of active plane, -- rotating pattern if necessary to match orientation local xx, xy, xz = 1, 0, 0 local yx, yy, yz = 0, 1, 0 local zx, zy, zz = 0, 0, 1 local mid = N//2 local xoffset local yoffset local zoffset if pdp == 1 then if activeplane == "XY" then -- no rotation needed xoffset = (N - pwd + 1) // 2 yoffset = (N - pht + 1) // 2 zoffset = mid + activepos elseif activeplane == "YZ" then -- rotate pattern about its Y axis xx, xy, xz = 0, 0, 1 yx, yy, yz = 0, 1, 0 zx, zy, zz = -1, 0, 0 xoffset = mid + activepos yoffset = (N - pht + 1) // 2 zoffset = (N - pwd + 1) // 2 + pwd - 1 else -- activeplane == "XZ" -- rotate pattern about its X axis xx, xy, xz = 1, 0, 0 yx, yy, yz = 0, 0, -1 zx, zy, zz = 0, 1, 0 xoffset = (N - pwd + 1) // 2 yoffset = mid + activepos zoffset = (N - pht + 1) // 2 end elseif pht == 1 then if activeplane == "XY" then -- rotate pattern about its X axis xx, xy, xz = 1, 0, 0 yx, yy, yz = 0, 0, -1 zx, zy, zz = 0, 1, 0 xoffset = (N - pwd + 1) // 2 yoffset = (N - pdp + 1) // 2 + pdp - 1 zoffset = mid + activepos elseif activeplane == "YZ" then -- rotate pattern about its Z axis xx, xy, xz = 0, -1, 0 yx, yy, yz = 1, 0, 0 zx, zy, zz = 0, 0, 1 xoffset = mid + activepos yoffset = (N - pwd + 1) // 2 zoffset = (N - pdp + 1) // 2 else -- activeplane == "XZ" -- no rotation needed xoffset = (N - pwd + 1) // 2 yoffset = mid + activepos zoffset = (N - pdp + 1) // 2 end else -- pwd == 1 if activeplane == "XY" then -- rotate pattern about its Y axis xx, xy, xz = 0, 0, 1 yx, yy, yz = 0, 1, 0 zx, zy, zz = -1, 0, 0 xoffset = (N - pdp + 1) // 2 yoffset = (N - pht + 1) // 2 zoffset = mid + activepos elseif activeplane == "YZ" then -- no rotation needed xoffset = mid + activepos yoffset = (N - pht + 1) // 2 zoffset = (N - pdp + 1) // 2 else -- activeplane == "XZ" -- rotate pattern about its Z axis xx, xy, xz = 0, -1, 0 yx, yy, yz = 1, 0, 0 zx, zy, zz = 0, 0, 1 xoffset = (N - pht + 1) // 2 + pht - 1 yoffset = mid + activepos zoffset = (N - pdp + 1) // 2 end end for k,_ in pairs(newpattern.newgrid) do -- move pattern to origin local x = (k % P) - minpx local y = (k // P % P) - minpy local z = (k // PP) - minpz -- do the rotation (if any) local newx = x*xx + y*xy + z*xz local newy = x*yx + y*yy + z*yz local newz = x*zx + y*zy + z*zz -- now shift to middle of active plane x = newx + xoffset y = newy + yoffset z = newz + zoffset pastepatt[ x + N * (y + N * z) ] = 1 -- update paste boundary if x < minpastex then minpastex = x end if y < minpastey then minpastey = y end if z < minpastez then minpastez = z end if x > maxpastex then maxpastex = x end if y > maxpastey then maxpastey = y end if z > maxpastez then maxpastez = z end end else -- put paste pattern in middle of grid local xoffset = minpx - (N - pwd + 1) // 2 local yoffset = minpy - (N - pht + 1) // 2 local zoffset = minpz - (N - pdp + 1) // 2 for k,_ in pairs(newpattern.newgrid) do -- newpattern.newgrid[k] is a live cell local x = (k % P) - xoffset local y = (k // P % P) - yoffset local z = (k // PP) - zoffset pastepatt[ x + N * (y + N * z) ] = 1 -- update paste boundary if x < minpastex then minpastex = x end if y < minpastey then minpastey = y end if z < minpastez then minpastez = z end if x > maxpastex then maxpastex = x end if y > maxpastey then maxpastey = y end if z > maxpastez then maxpastez = z end end end CheckIfGenerating() Refresh() return true end -------------------------------------------------------------------------------- function PasteOR() if pastecount > 0 then RememberCurrentState() -- SetLiveCell will set dirty = true local NN = N*N for k,_ in pairs(pastepatt) do if not grid1[k] then SetLiveCell(k % N, (k // N) % N, k // NN) end end pastecount = 0 pastepatt = {} CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function PasteXOR() if pastecount > 0 then RememberCurrentState() local NN = N*N for k,_ in pairs(pastepatt) do if grid1[k] then grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false else SetLiveCell(k % N, (k // N) % N, k // NN) end end pastecount = 0 pastepatt = {} CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function FlipPasteX() if pastecount > 0 then RememberCurrentState() -- reflect X coords across YZ plane thru middle of paste pattern local fmidx = minpastex + (maxpastex - minpastex) / 2 local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {round(fmidx*2) - x, y, z} end -- flip doesn't change paste boundary pastepatt = {} for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function FlipPasteY() if pastecount > 0 then RememberCurrentState() -- reflect Y coords across XZ plane thru middle of paste pattern local fmidy = minpastey + (maxpastey - minpastey) / 2 local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, round(fmidy*2) - y, z} end -- flip doesn't change paste boundary pastepatt = {} for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function FlipPasteZ() if pastecount > 0 then RememberCurrentState() -- reflect Z coords across XY plane thru middle of paste pattern local fmidz = minpastez + (maxpastez - minpastez) / 2 local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, y, round(fmidz*2) - z} end -- flip doesn't change paste boundary pastepatt = {} for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotatePasteX() if pastecount > 0 then RememberCurrentState() -- rotate paste pattern clockwise about its X axis by 90 degrees local fmidy = minpastey + (maxpastey - minpastey) // 2 local fmidz = minpastez + (maxpastez - minpastez) // 2 local y0 = fmidy - fmidz local z0 = fmidz + fmidy + (maxpastez - minpastez) % 2 -- avoids drift local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {x, (y0+z) % N, (z0-y) % N} end pastepatt = {} -- minpastex, maxpastex don't change minpastey = math.maxinteger minpastez = math.maxinteger maxpastey = math.mininteger maxpastez = math.mininteger for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 if y < minpastey then minpastey = y end if y > maxpastey then maxpastey = y end if z < minpastez then minpastez = z end if z > maxpastez then maxpastez = z end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotatePasteY() if pastecount > 0 then RememberCurrentState() -- rotate paste pattern clockwise about its Y axis by 90 degrees local fmidx = minpastex + (maxpastex - minpastex) // 2 local fmidz = minpastez + (maxpastez - minpastez) // 2 local x0 = fmidx + fmidz + (maxpastex - minpastex) % 2 -- avoids drift local z0 = fmidz - fmidx local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {(x0-z) % N, y, (z0+x) % N} end pastepatt = {} -- minpastey, maxpastey don't change minpastex = math.maxinteger minpastez = math.maxinteger maxpastex = math.mininteger maxpastez = math.mininteger for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 if x < minpastex then minpastex = x end if x > maxpastex then maxpastex = x end if z < minpastez then minpastez = z end if z > maxpastez then maxpastez = z end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function RotatePasteZ() if pastecount > 0 then RememberCurrentState() -- rotate paste pattern clockwise about its Z axis by 90 degrees local fmidx = minpastex + (maxpastex - minpastex) // 2 local fmidy = minpastey + (maxpastey - minpastey) // 2 local x0 = fmidx - fmidy local y0 = fmidy + fmidx + (maxpastey - minpastey) % 2 -- avoids drift local cells = {} local NN = N*N for k,_ in pairs(pastepatt) do local x = k % N local y = (k // N) % N local z = k // NN cells[#cells+1] = {(x0+y) % N, (y0-x) % N, z} end pastepatt = {} -- minpastez, maxpastez don't change minpastex = math.maxinteger minpastey = math.maxinteger maxpastex = math.mininteger maxpastey = math.mininteger for _,xyz in ipairs(cells) do local x, y, z = xyz[1], xyz[2], xyz[3] pastepatt[x + N * (y + N * z)] = 1 if x < minpastex then minpastex = x end if x > maxpastex then maxpastex = x end if y < minpastey then minpastey = y end if y > maxpastey then maxpastey = y end end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function ChoosePasteAction(mousex, mousey) -- show red pop-up menu at mousex,mousey and let user choose a paste action pastemenu.setbgcolor(PASTE_MENU) pastemenu.show(mousex, mousey, ovwd, ovht) end -------------------------------------------------------------------------------- function ChooseSelectionAction(mousex, mousey) -- show green pop-up menu at mousex,mousey and let user choose a selection action selmenu.setbgcolor(SELECT_MENU) selmenu.show(mousex, mousey, ovwd, ovht) end -------------------------------------------------------------------------------- function ZoomDouble() if CELLSIZE < MAXSIZE then -- zoom in by doubling the cell size CELLSIZE = CELLSIZE*2 if CELLSIZE > MAXSIZE then CELLSIZE = MAXSIZE end ZOOMSIZE = CELLSIZE HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function ZoomHalf() if CELLSIZE > MINSIZE then -- zoom out by halving the cell size CELLSIZE = CELLSIZE//2 if CELLSIZE < MINSIZE then CELLSIZE = MINSIZE end ZOOMSIZE = CELLSIZE HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function ZoomIn() if CELLSIZE < MAXSIZE then -- zoom in by incrementing the cell size CELLSIZE = CELLSIZE+1 ZOOMSIZE = CELLSIZE HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function ZoomOut() if CELLSIZE > MINSIZE then -- zoom out by decrementing the cell size CELLSIZE = CELLSIZE-1 ZOOMSIZE = CELLSIZE HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function ZoomInPower() if CELLSIZE < MAXSIZE then -- zoom in by increasing the cell size by a percentage ZOOMSIZE = ZOOMSIZE * (1 + 1 / MINSIZE) if ZOOMSIZE > MAXSIZE then ZOOMSIZE = MAXSIZE end CELLSIZE = ZOOMSIZE // 1 | 0 HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function ZoomOutPower() if CELLSIZE > MINSIZE then -- zoom out by reducing the cell size by a percentage ZOOMSIZE = ZOOMSIZE / (1 + 1 / MINSIZE) if ZOOMSIZE < MINSIZE then ZOOMSIZE = MINSIZE end CELLSIZE = ZOOMSIZE // 1 | 0 HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function OpenFile(filepath) if filepath:find("%.rle3$") then OpenPattern(filepath) elseif filepath:find("%.lua$") then RunScript(filepath) else g.warn("Unexpected file:\n"..filepath.."\n\n".. "3D.lua can only handle files ending with .rle3 or .lua.", false) end end -------------------------------------------------------------------------------- function StartStop() generating = not generating UpdateStartButton() Refresh() if generating and popcount > 0 then RememberCurrentState() -- EventLoop will call NextGeneration end end -------------------------------------------------------------------------------- function Step1() if generating then StopGenerating() Refresh() else -- NextGeneration does nothing (except display a message) if popcount is 0 if popcount > 0 then RememberCurrentState() end NextGeneration(true) end end -------------------------------------------------------------------------------- function NextStep() if popcount == 0 or stepsize == 1 then Step1() else if generating then StopGenerating() Refresh() else -- NextGeneration does nothing (except display a message) if popcount is 0 if popcount > 0 then RememberCurrentState() end NextGeneration() end end end -------------------------------------------------------------------------------- function Faster() if stepsize < 100 then SetStepSize(stepsize + 1) RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function Slower() if stepsize > 1 then SetStepSize(stepsize - 1) RefreshIfNotGenerating() end end -------------------------------------------------------------------------------- function SetStepSize(newval) if newval >= 1 and newval <= 100 then stepsize = newval ovt{"setstep3d", stepsize} end end -------------------------------------------------------------------------------- function StepChange(newval) -- called if stepslider position has changed SetStepSize(newval) Refresh() end -------------------------------------------------------------------------------- function SetStepSizeTo1() SetStepSize(1) RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function Reset() if gencount > startcount then -- restore the starting state if scriptlevel > 0 then -- Reset was called by user script so don't modify undo/redo stacks RestoreState(startstate) else -- unwind undostack until gencount == startcount repeat -- push current state onto redostack redostack[#redostack+1] = SaveState() -- pop state off undostack and restore it RestoreState( table.remove(undostack) ) until gencount == startcount end StopGenerating() Refresh() end end -------------------------------------------------------------------------------- local function GetMidPoint(x, y, z) -- return mid point of cell at given grid position x = x * CELLSIZE + MIDCELL y = y * CELLSIZE + MIDCELL z = z * CELLSIZE + MIDCELL -- transform point local newx = (x*xixo + y*xiyo + z*xizo) local newy = (x*yixo + y*yiyo + z*yizo) -- use orthographic projection x = round(newx) + midx y = round(newy) + midy return x, y end -------------------------------------------------------------------------------- function FitGrid(display) if display == nil then display = true end local function Visible(x, y) -- return true if pixel at x,y is within area under tool bar if x < 0 or x >= ovwd then return false end if y <= toolbarht or y >= ovht then return false end return true end -- find largest CELLSIZE at which all corners of grid are visible CELLSIZE = MAXSIZE + 1 repeat CELLSIZE = CELLSIZE-1 HALFCELL = CELLSIZE/2.0 MIDGRID = (N+1-(N%2))*HALFCELL MIDCELL = HALFCELL-MIDGRID LEN = CELLSIZE-BORDER*2 CreateAxes() if CELLSIZE == MINSIZE then break end local x1, y1 = GetMidPoint(0, 0, 0) local x2, y2 = GetMidPoint(0, 0, N-1) local x3, y3 = GetMidPoint(0, N-1, 0) local x4, y4 = GetMidPoint(N-1, 0, 0) local x5, y5 = GetMidPoint(0, N-1, N-1) local x6, y6 = GetMidPoint(N-1, N-1, 0) local x7, y7 = GetMidPoint(N-1, 0, N-1) local x8, y8 = GetMidPoint(N-1, N-1, N-1) local xmin = min(x1,x2,x3,x4,x5,x6,x7,x8) - CELLSIZE local xmax = max(x1,x2,x3,x4,x5,x6,x7,x8) + CELLSIZE local ymin = min(y1,y2,y3,y4,y5,y6,y7,y8) - CELLSIZE local ymax = max(y1,y2,y3,y4,y5,y6,y7,y8) + CELLSIZE until Visible(xmin,ymin) and Visible(xmin,ymax) and Visible(xmax,ymin) and Visible(xmax,ymax) ZOOMSIZE = CELLSIZE if display then Refresh() end end -------------------------------------------------------------------------------- -- getters for user scripts function GetGeneration() return gencount end function GetGridSize() return N end function GetPercentage() return perc end function GetPopulation() return popcount end function GetRule() return rulestring end function GetCellType() return celltype end function GetStepSize() return stepsize end function GetBarHeight() return toolbarht end -------------------------------------------------------------------------------- -- for user scripts function GetCells(selectedonly) -- return an array of live cell coordinates; -- if selected is true then only selected live cells will be returned local cellarray = {} if popcount > 0 then if selectedonly then cellarray = GetSelectedLiveCells() else -- get all live cells local mid = N//2 local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell local x = k % N local y = (k // N) % N local z = k // NN cellarray[#cellarray+1] = {x-mid, y-mid, z-mid} end end end return cellarray end -------------------------------------------------------------------------------- -- for user scripts function PutCells(cellarray, xoffset, yoffset, zoffset) -- use given array of live cell coordinates and offsets to set cells in grid -- (any cells outside the grid are silently clipped) xoffset = xoffset or 0 yoffset = yoffset or 0 zoffset = zoffset or 0 local mid = N//2 local midxv = mid + xoffset local midyv = mid + yoffset local midzv = mid + zoffset for _, xyz in ipairs(cellarray) do local x = xyz[1] + midxv local y = xyz[2] + midyv local z = xyz[3] + midzv if x >= 0 and x < N and y >= 0 and y < N and z >= 0 and z < N then SetCellState(x, y, z, 1) end end end -------------------------------------------------------------------------------- -- for user scripts function GetBounds() if popcount > 0 then -- return the pattern's minimal bounding box MinimizeLiveBoundary() local mid = N//2 return { minx-mid, maxx-mid, miny-mid, maxy-mid, minz-mid, maxz-mid } else return {} end end -------------------------------------------------------------------------------- -- for user scripts function GetSelectionBounds() if selcount > 0 then -- return the selection's minimal bounding box MinimizeSelectionBoundary() local mid = N//2 return { minselx-mid, maxselx-mid, minsely-mid, maxsely-mid, minselz-mid, maxselz-mid } else return {} end end -------------------------------------------------------------------------------- -- for user scripts function GetPasteBounds() if pastecount > 0 then -- return the paste pattern's minimal bounding box local mid = N//2 return { minpastex-mid, maxpastex-mid, minpastey-mid, maxpastey-mid, minpastez-mid, maxpastez-mid } else return {} end end -------------------------------------------------------------------------------- -- for user scripts function Step(n) n = n or 1 -- script commands might have changed the pattern if update_grid then ovt{"setpattern3d", grid1, false} update_grid = false end while popcount > 0 and n > 0 do NextGeneration() n = n - 1 g.doevent("") -- null op to let user abort script end end -------------------------------------------------------------------------------- -- for user scripts function SetRule(newrule) newrule = newrule or DEFAULT_RULE if not ParseRule(newrule) then error("Bad rule in SetRule: "..newrule, 2) end end -------------------------------------------------------------------------------- -- for user scripts function GetCell(x, y, z) local mid = N//2 if grid1[ (x+mid) + N * ((y+mid) + N * (z+mid)) ] then return 1 else return 0 end end -------------------------------------------------------------------------------- -- for user scripts function SetCell(x, y, z, state) state = state or 1 -- default state is 1 local mid = N//2 SetCellState(x+mid, y+mid, z+mid, state) end -------------------------------------------------------------------------------- -- for user scripts function SelectCell(x, y, z) local mid = N//2 SetSelection(x+mid, y+mid, z+mid, true) end -------------------------------------------------------------------------------- -- for user scripts function SelectedCell(x, y, z) if selcount == 0 then return false else local mid = N//2 return selected[x+mid + N * (y+mid + N * (z+mid))] end end -------------------------------------------------------------------------------- -- for user scripts function DeselectCell(x, y, z) local mid = N//2 SetSelection(x+mid, y+mid, z+mid, false) end -------------------------------------------------------------------------------- -- for user scripts function SetMessage(msg) message = msg end -------------------------------------------------------------------------------- -- for user scripts function PasteExists() return pastecount > 0 end -------------------------------------------------------------------------------- -- for user scripts function SelectionExists() return selcount > 0 end -------------------------------------------------------------------------------- -- for user scripts function DoPaste(x, y, z, mode) if PasteExists() then -- move paste pattern to x,y,z local mid = N//2 local deltax = x+mid - minpastex local deltay = y+mid - minpastey local deltaz = z+mid - minpastez MovePastePattern(deltax, deltay, deltaz) -- now do the paste using the given mode if mode == "or" then PasteOR() elseif mode == "xor" then PasteXOR() else error("Bad mode in DoPaste!", 2) end end end -------------------------------------------------------------------------------- -- for user scripts function FlipPaste(coordinates) if coordinates == "x" then FlipPasteX() elseif coordinates == "y" then FlipPasteY() elseif coordinates == "z" then FlipPasteZ() else error("Bad coordinates in FlipPaste!", 2) end end -------------------------------------------------------------------------------- -- for user scripts function RotatePaste(axis) if axis == "x" then RotatePasteX() elseif axis == "y" then RotatePasteY() elseif axis == "z" then RotatePasteZ() else error("Bad axis in RotatePaste!", 2) end end -------------------------------------------------------------------------------- -- for user scripts function FlipSelection(coordinates) if coordinates == "x" then FlipSelectionX() elseif coordinates == "y" then FlipSelectionY() elseif coordinates == "z" then FlipSelectionZ() else error("Bad coordinates in FlipSelection!", 2) end end -------------------------------------------------------------------------------- -- for user scripts function RotateSelection(axis) if axis == "x" then RotateSelectionX() elseif axis == "y" then RotateSelectionY() elseif axis == "z" then RotateSelectionZ() else error("Bad axis in RotateSelection!", 2) end end -------------------------------------------------------------------------------- -- for user scripts function Update() Refresh(true) end -------------------------------------------------------------------------------- function ShowHelp() local htmldata = [[ Golly Help: 3D.lua

Introduction
Mouse controls
Keyboard shortcuts
Menus
     File menu
     Edit menu
     Control menu
     View menu
Running scripts
     Creating your own keyboard shortcuts
     Script functions
     Cell coordinates
Supported rules
     Moore neighborhood
     Face neighborhood
     Corner neighborhood
     Edge neighborhood
     Hexahedral neighborhood
     Busy Boxes
RLE3 file format
Credits and references


Introduction

3D.lua is a script that lets you explore three-dimensional cellular automata. The script uses overlay commands to completely replace Golly's usual interface (note that all your Golly settings will be restored when 3D.lua exits).


Mouse controls

If the Move option is ticked then you can use the hand cursor to rotate the view by clicking and dragging. Rotation occurs around the middle cell in the grid.

The hand cursor can also be used to move a paste pattern (red cells) or a selection (green cells) to a new location within the grid, but only within a certain plane, depending on where the initial click occurred. Imagine a box enclosing the paste pattern or all the selected cells. One of the faces of this box will contain the initial click. Movement is only allowed within the plane parallel to the clicked face.

It's also possible to do some editing with the hand cursor. You can alt-click on a live cell to erase it and any live cells behind it, as long as their mid points are within a half-cell radius of the mouse click. Or you can shift-click on a live cell to select it and any live cells behind it. This makes it easy to quickly erase or select isolated objects.

If the Draw option is ticked then you can use the pencil cursor to draw or erase cells in the active plane (shown as translucent blue). Note that any live cells outside the active plane are drawn as white points. Click and drag outside the active plane to rotate the view.

If the Select option is ticked then you can use the cross-hairs cursor to select or deselect cells in the active plane. Any selected cells outside the active plane are drawn as translucent green points. Click and drag outside the active plane to rotate the view.

To move the active plane to a different position, shift-click anywhere in the active plane and drag the mouse. Or you can hit the "," or "." keys. Hit shift-A to change the active plane's orientation.

If a paste pattern is visible (red cells) then you can control-click or right-click anywhere, using any cursor, to get a red pop-up menu that lets you choose various paste actions. The paste pattern can also be dragged to a different location using any cursor.

If a selection exists (green cells) then you can control-click or right-click to get a green pop-up menu with various selection actions. If a paste pattern and a selection both exist then the paste menu takes precedence.

Use the mouse wheel at any time to zoom in/out. The zoom is always centered on the middle cell in the grid.


Keyboard shortcuts

The following keyboard shortcuts are provided (but see below for how you can write a script to create new shortcuts or override any of the supplied shortcuts):

Keys    Actions
enter    start/stop generating pattern
space    advance pattern by one generation
tab    advance pattern to next multiple of step size
-    decrease step size
=    increase step size
1    reset step size to 1
arrows    rotate about X/Y screen axes
alt-arrows    rotate about Z screen axis
ctrl-N    create a new, empty pattern
5    create a new, random pattern
ctrl-O    open a selected pattern file
ctrl-S    save the current pattern in a file
shift-O    open pattern in clipboard
shift-R    run script in clipboard
ctrl-R    reset to the starting pattern
Z    undo
shift-Z    redo
ctrl-X    cut
ctrl-C    copy
ctrl-V    show paste pattern
alt-V    cancel paste pattern
ctrl-B    do the paste using OR mode
ctrl-shift-B    do the paste using XOR mode
delete    kill selected live cells
shift-delete    kill unselected live cells
A    select all
K    remove selection
B    back view (rotate 180 deg about Y axis)
I    restore initial view
F    fit entire grid within view
[    zoom out
]    zoom in
{    halve current zoom
}    double current zoom
P    cycle live cells (cubes/spheres/points)
L    toggle lattice lines
shift-L    toggle axes
alt-D    toggle depth shading
Y    toggle cell history
shift-Y    toggle history fade
T    toggle the menu bar and tool bar
G    change the grid size
R    change the rule
,    move active plane closer (in initial view)
.    move active plane further away (in initial view)
shift-A    cycle active plane's orientation (XY/XZ/YZ)
D    switch cursor to draw mode
S    switch cursor to select mode
M    switch cursor to move mode
C    cycle cursor mode (draw/select/move)
shift-M    move pattern to middle of grid
H    show this help
Q    quit 3D.lua


Menus

3D.lua has its own menu bar. It contains menus with items that are somewhat similar to those in Golly's menu bar.


File menu

New Pattern
Create a new, empty pattern. All undo/redo history is deleted and the step size is reset to 1. The active plane is displayed, ready to be edited using the pencil cursor.

Random Pattern...
Create a new pattern randomly filled with live cells at a given density. You have the option of filling the grid and creating a cube or a sphere. All undo/redo history is deleted and the step size is reset to 1.

Open Pattern...
Open a selected RLE3 pattern file. All undo/redo history is deleted and the step size is reset to 1.

Open Clipboard
Open the RLE3 pattern stored in the clipboard. All undo/redo history is deleted and the step size is reset to 1.

Save Pattern...
Save the current pattern in a .rle3 file.

Run Script...
Run a selected Lua script.

Run Clipboard
Run the Lua code stored in the clipboard.

Set Startup Script...
Select a Lua script that will be run automatically every time 3D.lua starts up.

Exit 3D.lua
Terminate 3D.lua. If there are any unsaved changes (indicated by an asterisk at the start of the pattern name) then you'll be asked if you want to save them. Note that hitting the escape key will immediately abort 3D.lua without doing any check for unsaved changes.


Edit menu

Undo
Undo the most recent change. This could be an editing change or a generating change.

Redo
Redo the most recently undone change.

Cut
Copy all selected live cells to the clipboard in RLE3 format, then delete those cells (but they remain selected).

Copy
Copy all selected live cells to the clipboard in RLE3 format.

Paste
If the clipboard contains a valid, non-empty pattern (RLE3 or 2D) that fits within the current grid then a paste pattern (comprised of red cells) will appear. If the active plane is visible and the clipboard pattern is one cell thick (in any direction) then the paste pattern appears in the middle of the active plane, otherwise it will appear in the middle of the grid. You can use any cursor to drag the paste pattern to any position within the grid, then control-click or right-click anywhere to get a pop-up menu that lets you flip/rotate the paste pattern or paste it into the grid using either OR mode or XOR mode.

Cancel Paste
Remove the paste pattern.

Clear
Delete all the selected live cells.

Clear Outside
Delete all the live cells that are not selected.

Select All
Select all the live cells. Selected cells appear green. Assuming there is no paste pattern, you can control-click or right-click anywhere to get a pop-up menu that lets you perform various actions on the selection.

Cancel Selection
Remove the selection.

Middle Pattern
Move the pattern to the middle of the grid.

Middle Selection
Move the selection to the middle of the grid.

Middle Paste
Move the paste pattern to the middle of the grid.


Control menu

Start/Stop Generating
Start or stop generating the current pattern. You can only start generating if there is at least one live cell. Generating stops automatically if the pattern dies out.

Next Generation
If the pattern isn't empty then advance to the next generation.

Next Step
Advance the pattern to the next multiple of the current step size, or until the pattern is empty. Only the final generation is displayed.

Reset
Restore the starting generation and step size.

Set Rule
Show a dialog box that lets you change the current rule.


View menu

Initial View
Restore the scale and rotation used when 3D.lua started up. Note that if you hit the up arrow 4 times and the right arrow 4 times then you'll see a single XY face parallel with the screen.

Fit Grid
Change the scale so the entire grid just fits within the window.

Set Grid Size
Show a dialog box that lets you change the grid size. If the current pattern doesn't fit inside the new size then you'll see a message stating how many live cells were clipped.

Cubes
If selected then live cells are displayed as cubes.

Spheres
If selected then live cells are displayed as spheres.

Points
If selected then live cells are displayed as points. Note that if the active plane is shown then any live cells outside that plane are always displayed as points.

Show Axes
If ticked then the edges of the grid are displayed (X axes are red, Y axes are green, Z axes are blue).

Show Lattice Lines
If ticked then lattice lines are displayed on the three faces of the grid that intersect at the corner with minimum cell coordinates (the far, bottom left corner in the initial view).

Use Depth Shading
If ticked then cubes and spheres are drawn slightly darker the further away they are from the front of the screen. Depth shading is not done when displaying points.

Show History
If ticked then history cells are shown.

Fade History
If ticked then history cells fade each generation. They do not fade away completely so you can always see where live cells have been.

Help
Show this help.


Running scripts

3D.lua can run other Lua scripts, either by selecting File > Run Script and choosing a .lua file, or by copying Lua code to the clipboard and selecting File > Run Clipboard. Try the latter method with this example that creates a small random pattern in the middle of the grid:

-- for 3D.lua (make sure you copy this line)
NewPattern("random pattern")
local perc = GetPercentage()
local quarter = GetGridSize()//4
for z = -quarter, quarter do
    for y = -quarter, quarter do
        for x = -quarter, quarter do
            if math.random(0,99) < perc then
                SetCell(x, y, z, 1)
            end
        end
    end
end
MoveMode() -- sets the hand cursor

Note that 3D.lua will only run a script if the clipboard or the file has "3D.lua" somewhere in the first line. This avoids nasty problems that can occur if you run a script not written for 3D.lua.

Any syntax or runtime errors in a script won't abort 3D.lua. The script will terminate and you'll get a warning message, hopefully with enough information that lets you fix the error.


Creating your own keyboard shortcuts

It's possible to override any of the global functions in 3D.lua. The following script shows how to override the HandleKey function to create a keyboard shortcut for running a particular script. Even more useful, you can get 3D.lua to run this script automatically when it starts up by going to File > Set Startup Script and selecting a .lua file containing this code:

-- a startup script for 3D.lua
local g = golly()
local gp = require "gplus"
local savedHandler = HandleKey
function HandleKey(event)
    local _, key, mods = gp.split(event)
    if key == "r" and mods == "alt" then
        RunScript(g.getdir("app").."My-scripts/3D/random-rule.lua")
    else
        -- pass the event to the original HandleKey function
        savedHandler(event)
    end
end


Script functions

Here is an alphabetical list of the various functions in 3D.lua you might want to call from your own scripts:

CancelPaste
CancelSelection
CheckWindowSize
ClearOutside
ClearSelection
CopySelection
CutSelection
DeselectCell
DoPaste
DrawMode
FitGrid
FlipPaste
FlipSelection
GetBarHeight
GetBounds
GetCell
GetCells
GetCellType
GetGeneration
GetGridSize
GetPasteBounds
GetPercentage
GetPopulation
GetRule
GetSelectionBounds
GetStepSize
HandleKey
InitialView
MoveMode
NewPattern
OpenPattern
Paste
PasteExists
PutCells
RandomPattern
Reset
RestoreState
Rotate
RotatePaste
RotateSelection
RunScript
SavePattern
SaveState
SelectAll
SelectCell
SelectedCell
SelectionExists
SelectMode
SetCell
SetCellType
SetGridSize
SetMessage
SetRule
SetStepSize
Step
Update
ZoomIn
ZoomOut

CancelPaste()
Remove any existing paste pattern.

CancelSelection()
Deselect all selected cells.

CheckWindowSize()
If the Golly window size has changed then this function resizes the overlay. Useful in scripts that allow user interaction.

ClearOutside()
Delete all live cells that are not selected.

ClearSelection()
Delete all live cells that are selected. Note that the cells remain selected.

CopySelection()
Return true if all the selected live cells can be saved in the clipboard as an RLE3 pattern. Return false if there are no selected live cells.

CutSelection()
Return true if all the selected live cells can be saved in the clipboard as an RLE3 pattern. If so then all the selected live cells are deleted. Return false if there are no selected live cells.

DeselectCell(x, y, z)
Deselect the given cell. The x,y,z coordinates are relative to the middle cell in the grid.

DoPaste(x, y, z, mode)
If a paste pattern exists then move it to the given position and paste it into the grid using the given mode ("or" or "xor"). The x,y,z coordinates are relative to the middle cell in the grid and specify the desired position of the paste boundary's minimum corner.

DrawMode()
Switch to the pencil cursor. The next Update call will display the active plane.

FitGrid()
Zoom in or out so that the entire grid will be visible. Call Update to see the result.

FlipPaste(coordinates)
If the paste pattern exists then flip the given coordinates ("x", "y" or "z"). For example, if given "x" then the X coordinates of all cells in the paste pattern will be reflected across the YZ plane running through the middle of the paste pattern.

FlipSelection(coordinates)
If a selection exists then flip the given coordinates ("x", "y" or "z"). For example, if given "x" then the X coordinates of all selected cells will be reflected across the YZ plane running through the middle of the selection.

GetBarHeight()
Return the combined height of the menu bar and tool bar. The value will be 0 if the user has turned them off (by hitting the "T" key) or switched to full screen mode. Useful in scripts that allow user interaction.

GetBounds()
Return {} if the pattern is empty, otherwise return the minimal bounding box of all live cells as an array with 6 values: {minx, maxx, miny, maxy, minz, maxz}. The boundary values are relative to the middle cell in the grid.

GetCell(x, y, z)
Return the state (0 or 1) of the given cell. The x,y,z coordinates are relative to the middle cell in the grid.

GetCells(selected)
Return an array of live cell coordinates in the format { {x1,y1,z1}, {x2,y2,z2}, ... {xn,yn,zn} }. All coordinates are relative to the middle cell in the grid. If there are no live cells then {} is returned. If selected is true then only the coordinates of selected live cells will be returned.

GetCellType()
Return the current cell type: "cube", "sphere" or "point".

GetGeneration()
Return the generation count.

GetGridSize()
Return the current grid size (3 to 100).

GetPasteBounds()
Return {} if there is no paste pattern, otherwise return its minimal bounding box as an array with 6 values: {minx, maxx, miny, maxy, minz, maxz}. The boundary values are relative to the middle cell in the grid.

GetPercentage()
Return the percentage (0 to 100) given in the most recent File > Random Pattern dialog.

GetPopulation()
Return the number of live cells in the current pattern.

GetRule()
Return the current rule.

GetSelectionBounds()
Return {} if there are no selected cells, otherwise return the minimal bounding box of all selected cells (live or dead) as an array with 6 values: {minx, maxx, miny, maxy, minz, maxz}. The boundary values are relative to the middle cell in the grid.

GetStepSize()
Return the current step size (1 to 100).

HandleKey(event)
Process the given keyboard event. Useful in scripts that allow user interaction.

InitialView()
Restore the initial view displayed by 3D.lua when it first starts up. Call Update to see the result.

MoveMode()
Switch to the hand cursor.

NewPattern(title)
Create a new, empty pattern. All undo/redo history is deleted and the step size is reset to 1. The given title string will appear in the title bar of the Golly window. If not supplied it is set to "untitled".

OpenPattern(filepath)
Open the specified RLE3 pattern file. If the filepath is not supplied then the user will be prompted to select a .rle3 file. All undo/redo history is deleted and the step size is reset to 1.

Paste()
Return true if the clipboard contains a valid, non-empty pattern (RLE3 or 2D) that fits within the current grid. If the active plane exists and the clipboard pattern is one cell thick (in any direction) then the paste pattern is located in the middle of the active plane, otherwise it is located in the middle of the grid. You can then call FlipPaste or RotatePaste to modify the paste pattern. Call DoPaste when you want to actually paste the pattern into the grid.

PasteExists()
Return true if a paste pattern exists.

PutCells(cellarray, xoffset, yoffset, zoffset)
Use the given array of live cell coordinates and offsets to set cells in the grid. The array must have the same format as the one returned by GetCells. Any cells outside the grid are silently clipped.

RandomPattern(percentage, fill, sphere)
Create a new, random pattern with the given percentage density (0 to 100) of live cells. If fill is true then the grid is filled, otherwise there will be a gap around the random object (this makes it easier to detect an explosive rule). If sphere is true then a spherical object is created rather than a cube. If no parameters are supplied then the user will be prompted for them. All undo/redo history is deleted and the step size is reset to 1.

Reset()
Restore the starting generation and step size.

RestoreState(state)
Restore the state saved earlier by SaveState.

Rotate(xdegrees, ydegrees, zdegrees)
Rotate the grid axes by the given amounts (integers from -359 to +359). Call Update to see the result.

RotatePaste(axis)
If the paste pattern exists then rotate it 90 degrees clockwise about the given axis ("x", "y" or "z").

RotateSelection(axis)
If a selection exists then rotate it 90 degrees clockwise about the given axis ("x", "y" or "z").

RunScript(filepath)
Run the specified .lua file, but only if the string "3D.lua" occurs somewhere in a comment on the first line of the file. If the filepath is not supplied then the user will be prompted to select a .lua file.

SavePattern(filepath)
Save the current pattern in a specified RLE3 file. If the filepath is not supplied then the user will be prompted for its name and location.

SaveState()
Return an object representing the current state. The object can be given later to RestoreState to restore the saved state. The saved information includes the grid size, the active plane's orientation and position, the cursor mode, the rule, the pattern and its generation count, the step size, the selection, and the paste pattern.

SelectAll()
Select all live cells. If there are no live cells then any existing selection is removed.

SelectCell(x, y, z)
Select the given cell. The x,y,z coordinates are relative to the middle cell in the grid.

SelectedCell(x, y, z)
Return true if the given cell is selected (live or dead).

SelectionExists()
Return true if at least one cell is selected (live or dead).

SelectMode()
Switch to the cross-hairs cursor. The next Update call will display the active plane.

SetCell(x, y, z, state)
Set the given cell to the given state (0 or 1). If the state is not supplied then it defaults to 1. The x,y,z coordinates are relative to the middle cell in the grid.

SetCellType(string)
Set the cell type to "cube", "sphere" or "point".

SetGridSize(newsize)
Change the grid size to the new value (3 to 100). If the newsize is not supplied then the user will be prompted for a value.

SetMessage(msg)
The given string will be displayed by the next Update call. Call SetMessage(nil) to clear the message.

SetRule(rule)
Switch to the given rule. If rule is not supplied the default rule is used (3D5..7/6).

SetStepSize(newsize)
Set the step size to the given value (1 to 100).

Step(n)
While the population is > 0 calculate the next n generations. If n is not supplied it defaults to 1.

Update()
Update the display. Note that 3D.lua automatically updates the display when a script finishes, so there's no need to call Update() at the end of a script.

ZoomIn()
Zoom in by incrementing the cell size. Useful in scripts that allow user interaction.

ZoomOut()
Zoom out by decrementing the cell size. Useful in scripts that allow user interaction.


Cell coordinates

Many of the above script functions accept or return cell coordinates. All coordinates are relative to the middle cell in the grid, so a call like SetCell(0,0,0,1) will turn on the middle cell. If N is the grid size then the minimum coordinate value is -floor(N/2) and the maximum coordinate value is floor((N-1)/2).

The following snippet creates a diagonal line of cells from the grid corner with the minimum cell coordinates to the corner with the maximum cell coordinates:

-- for 3D.lua
local N = GetGridSize()
for c = -(N//2), (N-1)//2 do
    SetCell(c, c, c, 1)
end


Supported rules

3D.lua supports rules that use a number of different neighborhoods:

  • The Moore neighborhood consists of the 26 cells that form a cube around a central cell.
  • The Face neighborhood consists of the 6 cells adjacent to the faces of a cube (this is the 3D version of the von Neumann neighborhood).
  • The Corner neighborhood consists of the 8 cells adjacent to the corners of a cube.
  • The Edge neighborhood consists of the 12 cells adjacent to the edges of a cube.
  • The Hexahedral neighborhood simulates 12 spheres packed around a central sphere (also known as the face-centred cubic lattice, or the rhombic dodecahedral honeycomb). Because it is simulating a hexahedral tessellation in a cubic grid, this neighborhood is not orthogonally symmetric, so flipping or rotating a pattern can change the way it evolves.
  • The Busy Boxes neighborhood is rather complicated. Follow the links below if you want to know all the gory details.

Use Control > Set Rule to change the current rule. You can quickly restore 3D.lua's default rule (3D5..7/6) by simply deleting the current rule and hitting OK.


Moore neighborhood

Rules in this neighborhood are strings of the form "3DS,S,S,.../B,B,B,...". The S values are the counts of neighboring live cells required for a live cell to survive in the next generation. The B values are the counts of neighboring live cells required for birth; ie. a dead cell will become a live cell in the next generation. Each cell has 26 neighbors so the S counts are from 0 to 26 and the B counts are from 1 to 26 (birth on 0 is not allowed). Note that the Moore neighborhood is the combination of the Face+Corner+Edge neighborhoods.

Contiguous counts can be specified as a range, so a rule like 3D4,5,6,7,9/4,5,7 can be entered as 3D4..7,9/4,5,7 (this is the canonical version).


Face neighborhood

Rules in this neighborhood use the same syntax as the Moore neighborhood but with "F" appended. For example: 3D0..6/1,3F. Each cell has 6 neighbors so the S counts are from 0 to 6 and the B counts are from 1 to 6 (again, birth on 0 is not allowed).


Corner neighborhood

Rules use the same syntax as the Moore neighborhood but with "C" appended. Each cell has 8 neighbors so the S counts are from 0 to 8 and the B counts are from 1 to 8.


Edge neighborhood

Rules use the same syntax as the Moore neighborhood but with "E" appended. Each cell has 12 neighbors so the S counts are from 0 to 12 and the B counts are from 1 to 12.


Hexahedral neighborhood

Rules use the same syntax as the Moore neighborhood but with "H" appended. Each cell has 12 neighbors so the S counts are from 0 to 12 and the B counts are from 1 to 12.


Busy Boxes

Busy Boxes is a 3D reversible CA created by Ed Fredkin and Daniel B. Miller. 3D.lua supports two rules: BusyBoxes and BusyBoxesW. The first rule uses a "mirror" mode where gliders are reflected back when they reach a grid boundary. The second rule is for "wrap" mode where gliders can cross a boundary and appear in the opposite side of the grid.

Each cell in the grid is either odd or even, depending on whether the sum of the cell's x,y,z coordinates is odd or even. 3D.lua uses cyan for odd cells and magenta for even cells (Fredkin and Miller use blue and red but these colors are used by 3D.lua to display paste patterns and the active plane).

Each generation of a Busy Boxes pattern is in one of six phases, numbered 0 to 5. In even phases, only even (magenta) cells can move. In odd phases, only odd (cyan) cells can move. In phases 0 and 3, movement can only occur in the XY plane. In phases 1 and 4 movement can only occur in the YZ plane. In phases 2 and 5, movement can only occur in the XZ plane. For each diagonally opposite pair of cells in the current plane, if a live cell exists at either of the pair's knight move positions, then the states of the two cells can be swapped. However, this only happens if there is no other possible swap for either cell.

For a pattern with a sparse or small population it's quite likely that no swaps are possible in a particular phase. Or the only valid swaps might be between two empty cells or two live cells. Either way, the pattern won't change. At each generation, a live cell can only move into a diagonally opposite empty cell (and only in the same orthogonal plane). This also means that the initial population never changes. For more details see the Busy Boxes FAQ and the papers listed in the references.


RLE3 file format

3D.lua can read and write patterns as text files with a .rle3 extension. The file format is known as RLE3 and is a simple extension of the well-known RLE format used by Golly:

  • The first line must start with "3D" and be followed by a number of "keyword=value" pairs separated by spaces. The valid keywords are:

    version=i   — specifies the file format version (currently 1)
    size=N   — specifies the grid dimensions (NxNxN)
    pos=x,y,z   — specifies the pattern's position within the grid
    gen=g   — specifies the generation number
     

  • If the pos and gen keywords are not present then their values are set to 0. Any unknown keywords are simply ignored.
  • The first line can be followed by optional comment lines starting with "#".
  • Then comes a line specifying the pattern's size and the 3D rule string:

    x=width y=height z=depth rule=string
     

  • The remaining lines contain the pattern data in a run-length encoded format. The only difference to the standard RLE format is the use of "/" to move to the next plane (ie. increase the z coordinate).
  • Any empty lines (after the first line) are ignored.

The following is a small example of the RLE3 file format. You can either save it in a .rle3 file, or copy it to the clipboard and type shift-O (after returning to the 3D.lua window):

3D version=1 size=40 pos=19,18,18
# A 10c/10 orthogonal spaceship.
# Found by Andrew Trevorrow in April, 2018.
x=2 y=4 z=4 rule=3D4,7/5,8
$bo$bo/bo$bo$bo$oo/oo$bo$bo$bo/$bo$bo!


Credits and references

3D.lua was inspired by the work of Carter Bays and his colleagues:

Candidates for the Game of Life in Three Dimensions
http://www.complex-systems.com/pdf/01-3-1.pdf

Patterns for Simple Cellular Automata in a Universe of Dense-Packed Spheres
http://www.complex-systems.com/pdf/01-5-1.pdf

Classification of Semitotalistic Cellular Automata in Three Dimensions
http://www.complex-systems.com/pdf/02-2-6.pdf

A Note on the Discovery of a New Game of Three-dimensional Life
http://www.complex-systems.com/pdf/02-3-1.pdf

The Discovery of a New Glider for the Game of Three-Dimensional Life
http://www.complex-systems.com/pdf/04-6-2.pdf

Further Notes on the Game of Three-Dimensional Life
http://www.complex-systems.com/pdf/08-1-4.pdf

A Note About the Discovery of Many New Rules for the Game of Three-Dimensional Life
http://wpmedia.wolfram.com/uploads/sites/13/2018/02/16-4-7.pdf

References for Busy Boxes:

Website: http://www.busyboxes.org

Two State, Reversible, Universal Cellular Automata In Three Dimensions
https://arxiv.org/ftp/nlin/papers/0501/0501022.pdf

Circular Motion of Strings in Cellular Automata, and Other Surprises
https://arxiv.org/abs/1206.2060 ]] if g.os() == "Mac" then htmldata = htmldata:gsub(" enter ", " return ") htmldata = htmldata:gsub(" alt", " option") htmldata = htmldata:gsub("ctrl", "cmd") end local htmlfile = g.getdir("temp").."3D.html" local f = io.open(htmlfile,"w") if not f then g.warn("Failed to create 3D.html!", false) return end f:write(htmldata) f:close() g.open(htmlfile) end -------------------------------------------------------------------------------- function SetCursor(cursor) if currcursor ~= cursor then RememberCurrentState() currcursor = cursor if not arrow_cursor then ov("cursor "..currcursor) end CheckIfGenerating() end end -------------------------------------------------------------------------------- function DrawMode() -- called when drawbox is clicked SetCursor(drawcursor) Refresh() end -------------------------------------------------------------------------------- function SelectMode() -- called when selectbox is clicked SetCursor(selectcursor) Refresh() end -------------------------------------------------------------------------------- function MoveMode() -- called when movebox is clicked SetCursor(movecursor) Refresh() end -------------------------------------------------------------------------------- function CycleCursor() -- cycle to next cursor mode if currcursor == drawcursor then SelectMode() elseif currcursor == selectcursor then MoveMode() else -- currcursor == movecursor DrawMode() end end -------------------------------------------------------------------------------- function SetCellTypeOnly(newtype) celltype = newtype ovt{"setcelltype3d", newtype} end -------------------------------------------------------------------------------- function CycleCellType() if celltype == "cube" then celltype = "sphere" elseif celltype == "sphere" then celltype = "point" else -- celltype == "point" celltype = "cube" end SetCellTypeOnly(celltype) ViewChanged(false) RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function SetCellType(newtype) SetCellTypeOnly(newtype) ViewChanged(false) RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function ToggleAxes() showaxes = not showaxes RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function ToggleLines() showlines = not showlines RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function ToggleDepthShading() depthshading = not depthshading InitDepthShading() ViewChanged(false) RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function UpdateHistory() ovt{"sethistory3d", showhistory, fadehistory} ViewChanged(false) end -------------------------------------------------------------------------------- function ToggleShowHistory() if showhistory == HISTORYOFF then showhistory = DEFAULTHISTORY else showhistory = HISTORYOFF end UpdateHistory() RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function ToggleFadeHistory() fadehistory = not fadehistory UpdateHistory() RefreshIfNotGenerating() end -------------------------------------------------------------------------------- function ToggleToolBar() if toolbarht > 0 then toolbarht = 0 midy = int(ovht/2) -- hide all the controls mbar.hide() ssbutton.hide() s1button.hide() resetbutton.hide() fitbutton.hide() undobutton.hide() redobutton.hide() drawbox.hide() selectbox.hide() movebox.hide() stepslider.hide() exitbutton.hide() helpbutton.hide() else toolbarht = mbarht+buttonht+gap*2 midy = int(ovht/2 + toolbarht/2) end Refresh() end -------------------------------------------------------------------------------- function ExitScript() if dirty and scriptlevel == 0 then local answer = g.savechanges("Save your changes?", "If you don't save, the changes will be lost.") if answer == "yes" then SavePattern() if dirty then -- error occurred or user hit Cancel in g.savedialog return end elseif answer == "no" then g.exit() else -- answer == "cancel" return end end g.exit() end -------------------------------------------------------------------------------- --[[ no longer used, but might come in handy local function PointInPolygon(x, y, vertices) -- return true if the given mouse position is inside the given polygon -- (see https://stackoverflow.com/questions/31730923/check-if-point-lies-in-polygon-lua) local inside = false local n = #vertices local j = n for i = 1, n do local pix = projectedx[ vertices[i] ] local piy = projectedy[ vertices[i] ] local pjx = projectedx[ vertices[j] ] local pjy = projectedy[ vertices[j] ] if (piy < y and pjy >= y) or (pjy < y and piy >= y) then if pix + (y - piy) / (pjy - piy) * (pjx - pix) < x then inside = not inside end end j = i end return inside end --]] -------------------------------------------------------------------------------- local function PointInTriangle(x, y, A, B, C) -- return true if x,y is inside the given triangle -- (see https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle) local ax, ay = projectedx[A], projectedy[A] local bx, by = projectedx[B], projectedy[B] local cx, cy = projectedx[C], projectedy[C] local as_x = x - ax local as_y = y - ay local s_ab = (bx-ax)*as_y - (by-ay)*as_x >= 0 if (cx-ax)*as_y - (cy-ay)*as_x > 0 == s_ab then return false end if (cx-bx)*(y-by) - (cy-by)*(x-bx) > 0 ~= s_ab then return false end return true end -------------------------------------------------------------------------------- local function PointInFace(x, y, P, Q, R, S) -- return true if x,y is inside the given face (a parallelogram) return PointInTriangle(x, y, P, Q, R) or PointInTriangle(x, y, R, S, P) end -------------------------------------------------------------------------------- local function IntersectionPoint(x1,y1, x2,y2, x3,y3, x4,y4) -- return the intersection point of 2 line segments -- (see http://paulbourke.net/geometry/pointlineplane/pdb.c) local denom = (y4-y3) * (x2-x1) - (x4-x3) * (y2-y1) local numera = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3) local numerb = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3) -- check if the lines are coincident if abs(numera) < 0.0001 and abs(numerb) < 0.0001 and abs(denom) < 0.0001 then return (x1 + x2) / 2, (y1 + y2) / 2 end local mua = numera / denom return x1 + mua * (x2 - x1), y1 + mua * (y2 - y1) end -------------------------------------------------------------------------------- local function FindActiveCell(x, y, face) -- return cell coordinates of the active cell containing x,y -- which is somewhere inside the given face local mid = N//2 local shift = N*CELLSIZE local hcells = N local vcells = N local xoffset = 0 local yoffset = 0 local zoffset = 0 local Pv, Qv, Sv local Px, Py, Qx, Qy, Sx, Sy local Ix, Iy, Jx, Jy local x1, y1, x2, y2 local A, B, a, b local cx, cy, cz local function CalculateAaBb() -- to find which cell contains x,y we need to calculate lengths A,a,B,b: -- (in this diagram hcells is 5 and vcells is 3, but for the given face -- the values are either 1 or N because the active plane is 1 cell thick) -- -- S ___________________________________ -- / / / / / / -- / / / / / / -- /______/______/______/______/______/ -- J /------/------/------/-*x,y / / -- / / / / / / / / -- / /______/______/______/_/____/______/ -- B // / / / / / / -- / b/ / / / / / / -- / //______/______/______/_/____/______/ -- P --a--- I Q -- ---------A------------ -- Px, Py = projectedx[Pv], projectedy[Pv] Qx, Qy = projectedx[Qv], projectedy[Qv] Sx, Sy = projectedx[Sv], projectedy[Sv] -- find intersection point of PQ and line containing x,y parallel to PS -- (we must ensure x1,y1 and x2,y2 are outside the face's edges) x1 = x - (Sx - Px) * shift y1 = y - (Sy - Py) * shift x2 = x + (Sx - Px) * shift y2 = y + (Sy - Py) * shift Ix, Iy = IntersectionPoint(Px, Py, Qx, Qy, x1, y1, x2, y2) -- find intersection point of PS and line containing x,y parallel to PQ -- (we must ensure x1,y1 and x2,y2 are outside the face's edges) x1 = x - (Qx - Px) * shift y1 = y - (Qy - Py) * shift x2 = x + (Qx - Px) * shift y2 = y + (Qy - Py) * shift Jx, Jy = IntersectionPoint(Px, Py, Sx, Sy, x1, y1, x2, y2) A = sqrt( (Ix-Px)^2 + (Iy-Py)^2 ) B = sqrt( (Jx-Px)^2 + (Jy-Py)^2 ) a = sqrt( (Qx-Px)^2 + (Qy-Py)^2 ) / hcells b = sqrt( (Sx-Px)^2 + (Sy-Py)^2 ) / vcells end if activeplane == "XY" then -- F and B faces have N*N cells, the other faces (TULR) have N cells; -- we only need to use 3 vertices in each face, but they have to be -- chosen carefully so that the vectors PQ and PS span the parallelogram if face == "F" then Pv, Qv, Sv = 1, 7, 3 -- front vertices of active plane elseif face == "B" then Pv, Qv, Sv = 2, 8, 4 -- back vertices elseif face == "T" then Pv, Qv, Sv = 3, 5, 4 -- top vertices vcells = 1 yoffset = N-1 elseif face == "U" then Pv, Qv, Sv = 1, 7, 2 -- underneath (ie. bottom) vertices vcells = 1 elseif face == "L" then Pv, Qv, Sv = 1, 2, 3 -- left vertices hcells = 1 elseif face == "R" then Pv, Qv, Sv = 7, 8, 5 -- right vertices hcells = 1 xoffset = N-1 end CalculateAaBb() cx = floor(A / a) + xoffset; if cx >= N then cx = N-1 end cy = floor(B / b) + yoffset; if cy >= N then cy = N-1 end cx = cx - mid cy = cy - mid cz = activepos elseif activeplane == "YZ" then -- L and R faces have N*N cells, the other faces (TUFB) have N cells if face == "L" then Pv, Qv, Sv = 2, 1, 4 -- left vertices elseif face == "R" then Pv, Qv, Sv = 8, 7, 6 -- right vertices elseif face == "T" then Pv, Qv, Sv = 6, 5, 4 -- top vertices vcells = 1 yoffset = N-1 elseif face == "U" then Pv, Qv, Sv = 8, 7, 2 -- underneath (ie. bottom) vertices vcells = 1 elseif face == "F" then Pv, Qv, Sv = 1, 7, 3 -- front vertices hcells = 1 zoffset = N-1 elseif face == "B" then Pv, Qv, Sv = 2, 8, 4 -- back vertices hcells = 1 end CalculateAaBb() cy = floor(B / b) + yoffset; if cy >= N then cy = N-1 end cz = floor(A / a) + zoffset; if cz >= N then cz = N-1 end cy = cy - mid cz = cz - mid cx = activepos else -- activeplane == "XZ" -- T and U faces have N*N cells, the other faces (FBLR) have N cells if face == "T" then Pv, Qv, Sv = 4, 6, 3 -- top vertices elseif face == "U" then Pv, Qv, Sv = 2, 8, 1 -- underneath (ie. bottom) vertices elseif face == "F" then Pv, Qv, Sv = 1, 7, 3 -- front vertices vcells = 1 zoffset = N-1 elseif face == "B" then Pv, Qv, Sv = 4, 6, 2 -- back vertices vcells = 1 elseif face == "L" then Pv, Qv, Sv = 4, 2, 3 -- left vertices hcells = 1 elseif face == "R" then Pv, Qv, Sv = 6, 8, 5 -- right vertices hcells = 1 xoffset = N-1 end CalculateAaBb() cx = floor(A / a) + xoffset; if cx >= N then cx = N-1 end cz = floor(B / b) + zoffset; if cz >= N then cz = N-1 end cx = cx - mid cz = cz - mid cy = activepos end -- return user coordinates (displayed later by Refresh) return cx, cy, cz end -------------------------------------------------------------------------------- function FindFace(mousex, mousey, box) -- create given box's rotated and projected vertices for i = 1, 8 do rotx[i], roty[i], rotz[i] = TransformPoint(box[i]) projectedx[i] = round( rotx[i] ) + midx projectedy[i] = round( roty[i] ) + midy end -- find which face of given box contains mousex,mousey (if any); -- note that up to 3 faces (all parallelograms) are visible local face = "" if rotz[1] < rotz[2] then -- front face is visible if PointInFace(mousex, mousey, 1,3,5,7) then face = "F" end else -- back face is visible if PointInFace(mousex, mousey, 8,6,4,2) then face = "B" end end if #face == 0 then -- not in front/back face, so try right and left if rotz[5] < rotz[3] then -- right face is visible if PointInFace(mousex, mousey, 5,6,8,7) then face = "R" end else -- left face is visible if PointInFace(mousex, mousey, 1,2,4,3) then face = "L" end end end if #face == 0 then -- not in front/back/right/left so try top and bottom if rotz[5] < rotz[7] then -- top face is visible if PointInFace(mousex, mousey, 5,3,4,6) then face = "T" end else -- bottom face is visible (use U for underneath; B is for back) if PointInFace(mousex, mousey, 1,7,8,2) then face = "U" end end end return face -- empty/F/B/R/L/T/U end -------------------------------------------------------------------------------- local function InsideActiveCell(mousex, mousey) -- if the given mouse position is inside the active plane then -- return a string containing the cell coords in the format "x,y,z" -- otherwise return an empty string -- create a box enclosing all active cells using same vertex order as CreateCube local x = minactivex * CELLSIZE - MIDGRID local y = minactivey * CELLSIZE - MIDGRID local z = minactivez * CELLSIZE - MIDGRID local xlen = (maxactivex - minactivex + 1) * CELLSIZE local ylen = (maxactivey - minactivey + 1) * CELLSIZE local zlen = (maxactivez - minactivez + 1) * CELLSIZE local activebox = { {x , y , z+zlen}, -- v1 {x , y , z }, -- v2 {x , y+ylen, z+zlen}, -- v3 {x , y+ylen, z }, -- v4 {x+xlen, y+ylen, z+zlen}, -- v5 {x+xlen, y+ylen, z }, -- v6 {x+xlen, y , z+zlen}, -- v7 {x+xlen, y , z } -- v8 } -- test if mousex,mousey is inside a visible face of activebox local face = FindFace(mousex, mousey, activebox) if #face > 0 then -- determine which active cell contains mousex,mousey local cx, cy, cz = FindActiveCell(mousex, mousey, face) return cx..","..cy..","..cz else return "" end end -------------------------------------------------------------------------------- function StartDrawing(mousex, mousey) local oldcell = activecell activecell = InsideActiveCell(mousex, mousey) if #activecell > 0 then RememberCurrentState() -- toggle the state of the clicked cell local x, y, z = split(activecell, ",") local mid = N//2 x = tonumber(x) + mid y = tonumber(y) + mid z = tonumber(z) + mid local pos = x + N * (y + N * z) if grid1[pos] then -- death grid1[pos] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false drawstate = 0 else -- birth SetLiveCell(x, y, z) -- sets dirty = true drawstate = 1 end Refresh() prevactive = activecell return true else if activecell ~= oldcell then Refresh() end return false end end -------------------------------------------------------------------------------- function StartSelecting(mousex, mousey) local oldcell = activecell activecell = InsideActiveCell(mousex, mousey) if #activecell > 0 then RememberCurrentState() -- toggle the selection state of the clicked cell local x, y, z = split(activecell, ",") local mid = N//2 x = tonumber(x) + mid y = tonumber(y) + mid z = tonumber(z) + mid local pos = x + N * (y + N * z) if selected[pos] then -- deselect selected[pos] = nil selcount = selcount - 1 minimal_sel_bounds = false selstate = false else selected[pos] = true selcount = selcount + 1 UpdateSelectionBoundary(x, y, z) selstate = true end Refresh() prevactive = activecell return true else if activecell ~= oldcell then Refresh() end return false end end -------------------------------------------------------------------------------- function SetLine(x1, y1, z1, x2, y2, z2, setfunction, state) -- draw/erase/select/deselect a line of cells from x1,y1,z1 to x2,y2,z2 -- using a 3D version of Bresenham's algorithm -- (note that x1,y1,z1 has already been set and x2,y2,z2 is a different cell) local dx = x2 - x1 local dy = y2 - y1 local dz = z2 - z1 local xinc = 1; if dx < 0 then xinc = -1 end local yinc = 1; if dy < 0 then yinc = -1 end local zinc = 1; if dz < 0 then zinc = -1 end local ax = abs(dx) local ay = abs(dy) local az = abs(dz) local dx2 = ax * 2 local dy2 = ay * 2 local dz2 = az * 2 if ax >= ay and ax >= az then local e1 = dy2 - ax local e2 = dz2 - ax while x1 ~= x2 do setfunction(x1, y1, z1, state) if e1 > 0 then y1 = y1 + yinc e1 = e1 - dx2 end if e2 > 0 then z1 = z1 + zinc e2 = e2 - dx2 end e1 = e1 + dy2 e2 = e2 + dz2 x1 = x1 + xinc end elseif ay >= ax and ay >= az then local e1 = dx2 - ay local e2 = dz2 - ay while y1 ~= y2 do setfunction(x1, y1, z1, state) if e1 > 0 then x1 = x1 + xinc e1 = e1 - dy2 end if e2 > 0 then z1 = z1 + zinc e2 = e2 - dy2 end e1 = e1 + dx2 e2 = e2 + dz2 y1 = y1 + yinc end else local e1 = dy2 - az local e2 = dx2 - az while z1 ~= z2 do setfunction(x1, y1, z1, state) if e1 > 0 then y1 = y1 + yinc e1 = e1 - dz2 end if e2 > 0 then x1 = x1 + xinc e2 = e2 - dz2 end e1 = e1 + dy2 e2 = e2 + dx2 z1 = z1 + zinc end end setfunction(x1, y1, z1, state) end -------------------------------------------------------------------------------- function DrawCells(mousex, mousey) -- draw/erase cells in active plane local oldcell = activecell activecell = InsideActiveCell(mousex, mousey) if #activecell > 0 and activecell ~= prevactive then -- mouse has moved to a different cell local mid = N//2 local x, y, z = split(activecell, ",") x = tonumber(x) + mid y = tonumber(y) + mid z = tonumber(z) + mid -- draw/erase a line of cells from prevactive to activecell local prevx, prevy, prevz = split(prevactive, ",") prevx = tonumber(prevx) + mid prevy = tonumber(prevy) + mid prevz = tonumber(prevz) + mid SetLine(prevx, prevy, prevz, x, y, z, SetCellState, drawstate) Refresh() prevactive = activecell else if activecell ~= oldcell then Refresh() end end end -------------------------------------------------------------------------------- function SelectCells(mousex, mousey) -- select/deselect cells in active plane local oldcell = activecell activecell = InsideActiveCell(mousex, mousey) if #activecell > 0 and activecell ~= prevactive then -- mouse has moved to a different cell local x, y, z = split(activecell, ",") local mid = N//2 x = tonumber(x) + mid y = tonumber(y) + mid z = tonumber(z) + mid -- select/deselect a line of cells from prevactive to activecell local prevx, prevy, prevz = split(prevactive, ",") prevx = tonumber(prevx) + mid prevy = tonumber(prevy) + mid prevz = tonumber(prevz) + mid SetLine(prevx, prevy, prevz, x, y, z, SetSelection, selstate) Refresh() prevactive = activecell else if activecell ~= oldcell then Refresh() end end end -------------------------------------------------------------------------------- function StartDraggingPaste(mousex, mousey) -- test if mouse click is in a paste cell local NN = N*N for k,_ in pairs(pastepatt) do local px, py = GetMidPoint(k%N, (k//N)%N, k//NN) if abs(px - mousex) < HALFCELL and abs(py - mousey) < HALFCELL then -- create a box enclosing all paste cells using same vertex order as CreateCube local x = minpastex * CELLSIZE - MIDGRID local y = minpastey * CELLSIZE - MIDGRID local z = minpastez * CELLSIZE - MIDGRID local xlen = (maxpastex - minpastex + 1) * CELLSIZE local ylen = (maxpastey - minpastey + 1) * CELLSIZE local zlen = (maxpastez - minpastez + 1) * CELLSIZE local pastebox = { {x , y , z+zlen}, -- v1 {x , y , z }, -- v2 {x , y+ylen, z+zlen}, -- v3 {x , y+ylen, z }, -- v4 {x+xlen, y+ylen, z+zlen}, -- v5 {x+xlen, y+ylen, z }, -- v6 {x+xlen, y , z+zlen}, -- v7 {x+xlen, y , z } -- v8 } -- return the face containing mousex,mousey return FindFace(mousex, mousey, pastebox) end end return "" end -------------------------------------------------------------------------------- function MovePastePattern(deltax, deltay, deltaz) -- move the paste pattern by the given amounts, if possible if minpastex + deltax < 0 then deltax = -minpastex end if minpastey + deltay < 0 then deltay = -minpastey end if minpastez + deltaz < 0 then deltaz = -minpastez end if maxpastex + deltax >= N then deltax = N-1 - maxpastex end if maxpastey + deltay >= N then deltay = N-1 - maxpastey end if maxpastez + deltaz >= N then deltaz = N-1 - maxpastez end if deltax == 0 and deltay == 0 and deltaz == 0 then return end minpastex = minpastex + deltax minpastey = minpastey + deltay minpastez = minpastez + deltaz maxpastex = maxpastex + deltax maxpastey = maxpastey + deltay maxpastez = maxpastez + deltaz local pcells = GetPasteCells() local mid = N//2 pastepatt = {} for _, xyz in ipairs(pcells) do local x = xyz[1] + mid + deltax local y = xyz[2] + mid + deltay local z = xyz[3] + mid + deltaz pastepatt[ x + N * (y + N * z) ] = true end Refresh() end -------------------------------------------------------------------------------- function DragPaste(mousex, mousey, prevx, prevy, face) -- create a large temporary active plane parallel to given face local oldN = N local oldplane = activeplane local oldpos = activepos SetTemporaryGridSize(N*3) if face == "F" or face == "B" then -- mouse in front/back face SetActivePlane("XY", 0) elseif face == "T" or face == "U" then -- mouse in top/bottom face SetActivePlane("XZ", 0) else -- mouse in left/right face SetActivePlane("YZ", 0) end -- find the cell locations of mousex,mousey and prevx,prevy in the temporary plane local oldcell = InsideActiveCell(prevx, prevy) local newcell = InsideActiveCell(mousex, mousey) -- restore the original active plane SetTemporaryGridSize(oldN) SetActivePlane(oldplane, oldpos) -- check if mouse stayed in same cell, or moved outside temporary plane if oldcell == newcell or #oldcell == 0 or #newcell == 0 then return end -- calculate how many cells the mouse has moved local oldx, oldy, oldz = split(oldcell,",") local newx, newy, newz = split(newcell,",") local deltax = tonumber(newx) - tonumber(oldx) local deltay = tonumber(newy) - tonumber(oldy) local deltaz = tonumber(newz) - tonumber(oldz) MovePastePattern(deltax, deltay, deltaz) end -------------------------------------------------------------------------------- local save_cells -- for restoring live cells under a moving selection local selxyz -- store x,y,z positions of selected cells local livexyz -- store x,y,z positions of selected live cells function StartDraggingSelection(mousex, mousey) -- test if mouse click is in a selected cell MinimizeSelectionBoundary() local NN = N*N for k,_ in pairs(selected) do local px, py = GetMidPoint(k%N, (k//N)%N, k//NN) if abs(px - mousex) < HALFCELL and abs(py - mousey) < HALFCELL then -- create a box enclosing all selected cells using same vertex order as CreateCube local x = minselx * CELLSIZE - MIDGRID local y = minsely * CELLSIZE - MIDGRID local z = minselz * CELLSIZE - MIDGRID local xlen = (maxselx - minselx + 1) * CELLSIZE local ylen = (maxsely - minsely + 1) * CELLSIZE local zlen = (maxselz - minselz + 1) * CELLSIZE local selbox = { {x , y , z+zlen}, -- v1 {x , y , z }, -- v2 {x , y+ylen, z+zlen}, -- v3 {x , y+ylen, z }, -- v4 {x+xlen, y+ylen, z+zlen}, -- v5 {x+xlen, y+ylen, z }, -- v6 {x+xlen, y , z+zlen}, -- v7 {x+xlen, y , z } -- v8 } local face = FindFace(mousex, mousey, selbox) if #face > 0 then -- initialize save_cells, selxyz and livexyz for use in MoveSelection save_cells = {} selxyz = {} livexyz = {} for k1,_ in pairs(selected) do -- selected[k1] is a selected cell local x1 = k1 % N local y1 = (k1 // N) % N local z1 = k1 // NN selxyz[#selxyz+1] = {x1, y1, z1} if grid1[k1] then -- selected cell is a live cell livexyz[#livexyz+1] = {x1, y1, z1} end end RememberCurrentState() end return face end end return "" end -------------------------------------------------------------------------------- function MoveSelection(deltax, deltay, deltaz) -- move all selected cells by the given amounts, if possible if minselx + deltax < 0 then deltax = -minselx end if minsely + deltay < 0 then deltay = -minsely end if minselz + deltaz < 0 then deltaz = -minselz end if maxselx + deltax >= N then deltax = N-1 - maxselx end if maxsely + deltay >= N then deltay = N-1 - maxsely end if maxselz + deltaz >= N then deltaz = N-1 - maxselz end if deltax == 0 and deltay == 0 and deltaz == 0 then return end -- RememberCurrentState was called in StartDraggingSelection minselx = minselx + deltax minsely = minsely + deltay minselz = minselz + deltaz maxselx = maxselx + deltax maxsely = maxsely + deltay maxselz = maxselz + deltaz -- kill all live cells in the current selection local savepop = popcount local NN = N*N for k,_ in pairs(selected) do if grid1[k] then grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false end end if popcount == 0 and selcount == savepop then -- all live cells (and only those cells) were selected -- so we can handle this common case much faster by simply -- putting the selected cells in their new positions selected = {} for i, xyz in ipairs(livexyz) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz local k = x + N * (y + N * z) selected[k] = true grid1[k] = 1 livexyz[i] = {x, y, z} end popcount = savepop -- new live boundary is same as new selection boundary -- (and minimal because StartDraggingSelection called MinimizeSelectionBoundary) minx = minselx miny = minsely minz = minselz maxx = maxselx maxy = maxsely maxz = maxselz minimal_live_bounds = true else -- avoid modifying any live cells under the moving selection -- by restoring the live cells in save_cells (if any) for k,_ in pairs(save_cells) do if not grid1[k] then grid1[k] = 1 popcount = popcount + 1 dirty = true update_grid = true -- boundary might expand local x = k % N local y = (k // N) % N local z = k // NN if x < minx then minx = x end if y < miny then miny = y end if z < minz then minz = z end if x > maxx then maxx = x end if y > maxy then maxy = y end if z > maxz then maxz = z end end end -- move the selected cells to their new positions -- and save any live cells in the new selection in save_cells save_cells = {} selected = {} for i, xyz in ipairs(selxyz) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz local k = x + N * (y + N * z) selected[k] = true selxyz[i] = {x, y, z} if grid1[k] then save_cells[k] = true end end -- put live cells saved in livexyz into their new positions for i, xyz in ipairs(livexyz) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz local k = x + N * (y + N * z) if not grid1[k] then grid1[k] = 1 popcount = popcount + 1 dirty = true update_grid = true -- boundary might expand if x < minx then minx = x end if y < miny then miny = y end if z < minz then minz = z end if x > maxx then maxx = x end if y > maxy then maxy = y end if z > maxz then maxz = z end end livexyz[i] = {x, y, z} end end Refresh() end -------------------------------------------------------------------------------- function DragSelection(mousex, mousey, prevx, prevy, face) -- create a large temporary active plane parallel to given face local oldN = N local oldplane = activeplane local oldpos = activepos SetTemporaryGridSize(N*3) if face == "F" or face == "B" then -- mouse in front/back face SetActivePlane("XY", 0) elseif face == "T" or face == "U" then -- mouse in top/bottom face SetActivePlane("XZ", 0) else -- mouse in left/right face SetActivePlane("YZ", 0) end -- find the cell locations of mousex,mousey and prevx,prevy in the temporary plane local oldcell = InsideActiveCell(prevx, prevy) local newcell = InsideActiveCell(mousex, mousey) -- restore the original active plane SetTemporaryGridSize(oldN) SetActivePlane(oldplane, oldpos) -- check if mouse stayed in same cell, or moved outside temporary plane if oldcell == newcell or #oldcell == 0 or #newcell == 0 then return end -- calculate how many cells the mouse has moved local oldx, oldy, oldz = split(oldcell,",") local newx, newy, newz = split(newcell,",") local deltax = tonumber(newx) - tonumber(oldx) local deltay = tonumber(newy) - tonumber(oldy) local deltaz = tonumber(newz) - tonumber(oldz) MoveSelection(deltax, deltay, deltaz) end -------------------------------------------------------------------------------- function StopDraggingSelection() save_cells = {} selxyz = {} livexyz = {} end -------------------------------------------------------------------------------- function StartDraggingPlane(mousex, mousey) local oldcell = activecell activecell = InsideActiveCell(mousex, mousey) if activecell ~= oldcell then Refresh() end if #activecell > 0 then RememberCurrentState() return true else return false end end -------------------------------------------------------------------------------- function DragActivePlane(mousex, mousey, prevx, prevy) -- create a box enclosing all active cells using same vertex order as CreateCube local x = minactivex * CELLSIZE - MIDGRID local y = minactivey * CELLSIZE - MIDGRID local z = minactivez * CELLSIZE - MIDGRID local xlen = (maxactivex - minactivex + 1) * CELLSIZE local ylen = (maxactivey - minactivey + 1) * CELLSIZE local zlen = (maxactivez - minactivez + 1) * CELLSIZE local activebox = { {x , y , z+zlen}, -- v1 {x , y , z }, -- v2 {x , y+ylen, z+zlen}, -- v3 {x , y+ylen, z }, -- v4 {x+xlen, y+ylen, z+zlen}, -- v5 {x+xlen, y+ylen, z }, -- v6 {x+xlen, y , z+zlen}, -- v7 {x+xlen, y , z } -- v8 } -- create activebox's rotated vertices for i = 1, 8 do rotx[i], roty[i], rotz[i] = TransformPoint(activebox[i]) end -- create a temporary active plane perpendicular to the nearest thin face -- and 3 times larger (to ensure all of the real active plane is enclosed) local oldN = N local oldplane = activeplane local oldpos = activepos SetTemporaryGridSize(N*3) if activeplane == "XY" then if (rotz[5] <= rotz[1] and rotz[5] <= rotz[3] and rotz[7] <= rotz[3]) or (rotz[4] <= rotz[8] and rotz[4] <= rotz[6] and rotz[2] <= rotz[6]) then -- right/left face is nearest SetActivePlane("YZ", 0) else -- top/bottom face is nearest SetActivePlane("XZ", 0) end elseif activeplane == "YZ" then if (rotz[5] <= rotz[8] and rotz[5] <= rotz[6] and rotz[7] <= rotz[6]) or (rotz[4] <= rotz[1] and rotz[4] <= rotz[3] and rotz[2] <= rotz[3]) then -- front/back face is nearest SetActivePlane("XY", 0) else -- top/bottom face is nearest SetActivePlane("XZ", 0) end else -- activeplane == "XZ" if (rotz[5] <= rotz[4] and rotz[5] <= rotz[6] and rotz[3] <= rotz[6]) or (rotz[4] <= rotz[5] and rotz[4] <= rotz[3] and rotz[6] <= rotz[3]) then -- front/back face is nearest SetActivePlane("XY", 0) else -- left/right face is nearest SetActivePlane("YZ", 0) end end -- find the cell locations of mousex,mousey and prevx,prevy in the temporary plane local oldcell = InsideActiveCell(prevx, prevy) local newcell = InsideActiveCell(mousex, mousey) -- restore the original active plane SetTemporaryGridSize(oldN) SetActivePlane(oldplane, oldpos) -- check if mouse stayed in same cell, or moved outside temporary plane if oldcell == newcell or #oldcell == 0 or #newcell == 0 then return end -- calculate how many cells the mouse has moved local oldx, oldy, oldz = split(oldcell,",") local newx, newy, newz = split(newcell,",") local deltax = tonumber(newx) - tonumber(oldx) local deltay = tonumber(newy) - tonumber(oldy) local deltaz = tonumber(newz) - tonumber(oldz) -- move the active plane by the appropriate delta but don't call Refresh yet if activeplane == "XY" then MoveActivePlane(activepos + deltaz, false) elseif activeplane == "YZ" then MoveActivePlane(activepos + deltax, false) else -- activeplane == "XZ" MoveActivePlane(activepos + deltay, false) end activecell = InsideActiveCell(mousex, mousey) Refresh() end -------------------------------------------------------------------------------- function MiddlePaste() -- move paste pattern to middle of grid if pastecount > 0 then -- calculate the delta amounts needed to move paste pattern to middle of grid local deltax = (N - (maxpastex - minpastex)) // 2 - minpastex local deltay = (N - (maxpastey - minpastey)) // 2 - minpastey local deltaz = (N - (maxpastez - minpastez)) // 2 - minpastez if deltax == 0 and deltay == 0 and deltaz == 0 then return end RememberCurrentState() local pcells = {} local NN = N*N for k,_ in pairs(pastepatt) do pcells[#pcells+1] = {k % N, (k // N) % N, k // NN} end pastepatt = {} for _,xyz in ipairs(pcells) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz pastepatt[x + N * (y + N * z)] = true end -- update the paste boundary minpastex = minpastex + deltax minpastey = minpastey + deltay minpastez = minpastez + deltaz maxpastex = maxpastex + deltax maxpastey = maxpastey + deltay maxpastez = maxpastez + deltaz CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function MiddleSelection() -- move selection to middle of grid if selcount > 0 then MinimizeSelectionBoundary() -- calculate the delta amounts needed to move selection to middle of grid local deltax = (N - (maxselx - minselx)) // 2 - minselx local deltay = (N - (maxsely - minsely)) // 2 - minsely local deltaz = (N - (maxselz - minselz)) // 2 - minselz if deltax == 0 and deltay == 0 and deltaz == 0 then return end RememberCurrentState() -- only set dirty = true if live cells are selected local selcells = {} local livecells = {} -- for live cells in selection local NN = N*N for k,_ in pairs(selected) do local x = k % N local y = (k // N) % N local z = k // NN selcells[#selcells+1] = {x, y, z} if grid1[k] then grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false livecells[#livecells+1] = {x, y, z} end end selected = {} for _,xyz in ipairs(selcells) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz selected[x + N * (y + N * z)] = true end -- move live cells that were selected for _,xyz in ipairs(livecells) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz local k = x + N * (y + N * z) if not grid1[k] then grid1[k] = 1 popcount = popcount + 1 -- dirty set to true above -- boundary might expand if x < minx then minx = x end if y < miny then miny = y end if z < minz then minz = z end if x > maxx then maxx = x end if y > maxy then maxy = y end if z > maxz then maxz = z end end end -- update the selection boundary minselx = minselx + deltax minsely = minsely + deltay minselz = minselz + deltaz maxselx = maxselx + deltax maxsely = maxsely + deltay maxselz = maxselz + deltaz -- MinimizeSelectionBoundary set minimal_sel_bounds to true CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function MiddlePattern() -- move pattern to middle of grid if popcount > 0 then MinimizeLiveBoundary() -- calculate the delta amounts needed to move pattern to middle of grid local deltax = (N - (maxx - minx)) // 2 - minx local deltay = (N - (maxy - miny)) // 2 - miny local deltaz = (N - (maxz - minz)) // 2 - minz if deltax == 0 and deltay == 0 and deltaz == 0 then return end RememberCurrentState() dirty = true update_grid = true local livecells = {} local NN = N*N for k,_ in pairs(grid1) do livecells[#livecells+1] = {k % N, (k // N) % N, k // NN} end grid1 = {} for _,xyz in ipairs(livecells) do local x = xyz[1] + deltax local y = xyz[2] + deltay local z = xyz[3] + deltaz grid1[x + N * (y + N * z)] = 1 end -- update the live cell boundary minx = minx + deltax miny = miny + deltay minz = minz + deltaz maxx = maxx + deltax maxy = maxy + deltay maxz = maxz + deltaz -- MinimizeLiveBoundary set minimal_live_bounds to true CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- -- use this flag in EraseLiveCells and SelectLiveCells to call -- RememberCurrentState just before the first change (if any) local firstchange = false function EraseLiveCells(mousex, mousey, firstcall) -- erase all live cells whose projected mid points are close to mousex,mousey if popcount > 0 then if firstcall then firstchange = false end local changes = 0 local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell local x = k % N local y = (k // N) % N local z = k // NN local px, py = GetMidPoint(x, y, z) if abs(px - mousex) < HALFCELL and abs(py - mousey) < HALFCELL then if not firstchange then RememberCurrentState() firstchange = true end grid1[k] = nil popcount = popcount - 1 dirty = true update_grid = true minimal_live_bounds = false changes = changes + 1 end end if changes > 0 then Refresh() end end end -------------------------------------------------------------------------------- function SelectLiveCells(mousex, mousey, firstcall) -- select all live cells whose projected mid points are close to mousex,mousey if popcount > 0 then if firstcall then firstchange = false end local changes = 0 local NN = N*N for k,_ in pairs(grid1) do -- grid1[k] is a live cell local x = k % N local y = (k // N) % N local z = k // NN local px, py = GetMidPoint(x, y, z) if abs(px - mousex) < HALFCELL and abs(py - mousey) < HALFCELL then if not selected[k] then if not firstchange then RememberCurrentState() firstchange = true end selected[k] = true selcount = selcount + 1 UpdateSelectionBoundary(x, y, z) changes = changes + 1 end end end if changes > 0 then Refresh() end end end -------------------------------------------------------------------------------- function CreateOverlay() -- overlay covers entire viewport (more if viewport is too small) viewwd, viewht = g.getview(g.getlayer()) ovwd, ovht = viewwd, viewht if ovwd < minwd then ovwd = minwd end if ovht < minht then ovht = minht end midx = int(ovwd/2) midy = int(ovht/2 + toolbarht/2) ov("create "..ovwd.." "..ovht) ov("cursor "..currcursor) ov("font 11 default-bold") -- font for info text -- set parameters for menu bar and tool bar buttons op.buttonht = buttonht op.textgap = 8 -- gap between edge of button and its label op.textfont = "font 10 default-bold" -- font for button labels op.menufont = "font 11 default-bold" -- font for menu and item labels op.textshadowx = 2 op.textshadowy = 2 if g.os() == "Mac" then op.yoffset = -1 end if g.os() == "Linux" then op.textfont = "font 10 default" op.menufont = "font 11 default" end end -------------------------------------------------------------------------------- function CreateMenuBar() -- create the menu bar and add some menus -- (note that changes to the order of menus or their items will require -- changes to DrawMenuBar and EnableControls) mbar = op.menubar() mbar.addmenu("File") mbar.addmenu("Edit") mbar.addmenu("Control") mbar.addmenu("View") -- add items to File menu mbar.additem(1, "New Pattern", NewPattern) mbar.additem(1, "Random Pattern...", RandomPattern) mbar.additem(1, "Open Pattern...", OpenPattern) mbar.additem(1, "Open Clipboard", OpenClipboard) mbar.additem(1, "Save Pattern...", SavePattern) mbar.additem(1, "---", nil) mbar.additem(1, "Run Script...", RunScript) mbar.additem(1, "Run Clipboard", RunClipboard) mbar.additem(1, "Set Startup Script...", SetStartupScript) mbar.additem(1, "---", nil) mbar.additem(1, "Exit 3D.lua", ExitScript) -- add items to Edit menu mbar.additem(2, "Undo", Undo) mbar.additem(2, "Redo", Redo) mbar.additem(2, "---", nil) mbar.additem(2, "Cut", CutSelection) mbar.additem(2, "Copy", CopySelection) mbar.additem(2, "Paste", Paste) mbar.additem(2, "Cancel Paste", CancelPaste) mbar.additem(2, "Clear", ClearSelection) mbar.additem(2, "Clear Outside", ClearOutside) mbar.additem(2, "---", nil) mbar.additem(2, "Select All", SelectAll) mbar.additem(2, "Cancel Selection", CancelSelection) mbar.additem(2, "---", nil) mbar.additem(2, "Middle Pattern", MiddlePattern) mbar.additem(2, "Middle Selection", MiddleSelection) mbar.additem(2, "Middle Paste", MiddlePaste) -- add items to Control menu mbar.additem(3, "Start Generating", StartStop) mbar.additem(3, "Next Generation", Step1) mbar.additem(3, "Next Step", NextStep) mbar.additem(3, "Reset", Reset) mbar.additem(3, "---", nil) mbar.additem(3, "Set Rule...", ChangeRule) -- add items to View menu mbar.additem(4, "Initial View", InitialView) mbar.additem(4, "Fit Grid", FitGrid) mbar.additem(4, "Set Grid Size...", SetGridSize) mbar.additem(4, "---", nil) mbar.additem(4, "Cubes", SetCellType, {"cube"}) mbar.additem(4, "Spheres", SetCellType, {"sphere"}) mbar.additem(4, "Points", SetCellType, {"point"}) mbar.additem(4, "---", nil) mbar.additem(4, "Show Axes", ToggleAxes) mbar.additem(4, "Show Lattice Lines", ToggleLines) mbar.additem(4, "Use Depth Shading", ToggleDepthShading) mbar.additem(4, "Show History", ToggleShowHistory) mbar.additem(4, "Fade History", ToggleFadeHistory) mbar.additem(4, "---", nil) mbar.additem(4, "Help", ShowHelp) end -------------------------------------------------------------------------------- function CreateToolBar() -- create tool bar buttons ssbutton = op.button("Start", StartStop) s1button = op.button("+1", Step1) resetbutton = op.button("Reset", Reset) fitbutton = op.button("Fit", FitGrid) undobutton = op.button("Undo", Undo) redobutton = op.button("Redo", Redo) helpbutton = op.button("?", ShowHelp) exitbutton = op.button("X", ExitScript) -- create radio buttons and slider (don't shadow text) op.textshadowx = 0 op.textshadowy = 0 drawbox = op.radiobutton("Draw", op.black, DrawMode) selectbox = op.radiobutton("Select", op.black, SelectMode) movebox = op.radiobutton("Move", op.black, MoveMode) -- create a slider for adjusting stepsize stepslider = op.slider("", op.black, 100, 1, 100, StepChange) end -------------------------------------------------------------------------------- function CreatePopUpMenus() -- text in pop-up menus is shadowed op.textshadowx = 2 op.textshadowy = 2 -- create a pop-up menu for paste actions pastemenu = op.popupmenu() pastemenu.additem("Paste OR", PasteOR) pastemenu.additem("Paste XOR", PasteXOR) pastemenu.additem("---", nil) pastemenu.additem("Flip X Coords", FlipPasteX) pastemenu.additem("Flip Y Coords", FlipPasteY) pastemenu.additem("Flip Z Coords", FlipPasteZ) pastemenu.additem("---", nil) pastemenu.additem("Rotate X Axis", RotatePasteX) pastemenu.additem("Rotate Y Axis", RotatePasteY) pastemenu.additem("Rotate Z Axis", RotatePasteZ) pastemenu.additem("---", nil) pastemenu.additem("Cancel Paste", CancelPaste) -- create a pop-up menu for selection actions selmenu = op.popupmenu() selmenu.additem("Cut", CutSelection) selmenu.additem("Copy", CopySelection) selmenu.additem("Clear", ClearSelection) selmenu.additem("Clear Outside", ClearOutside) selmenu.additem("---", nil) selmenu.additem("Flip X Coords", FlipSelectionX) selmenu.additem("Flip Y Coords", FlipSelectionY) selmenu.additem("Flip Z Coords", FlipSelectionZ) selmenu.additem("---", nil) selmenu.additem("Rotate X Axis", RotateSelectionX) selmenu.additem("Rotate Y Axis", RotateSelectionY) selmenu.additem("Rotate Z Axis", RotateSelectionZ) selmenu.additem("---", nil) selmenu.additem("Cancel Selection", CancelSelection) end -------------------------------------------------------------------------------- local showtoolbar = false -- restore tool bar? function CheckWindowSize() -- if viewport size has changed then resize the overlay local newwd, newht = g.getview(g.getlayer()) if newwd ~= viewwd or newht ~= viewht then viewwd, viewht = newwd, newht ovwd, ovht = viewwd, viewht if ovwd < minwd then ovwd = minwd end if ovht < minht then ovht = minht end local fullscreen = g.getoption("fullscreen") if fullscreen == 1 and toolbarht > 0 then -- hide tool bar but restore it when we exit full screen mode toolbarht = 0 showtoolbar = true elseif fullscreen == 0 and showtoolbar then if toolbarht == 0 then -- restore tool bar toolbarht = mbarht+buttonht+gap*2 end showtoolbar = false end midx = int(ovwd/2) midy = int(ovht/2 + toolbarht/2) ov("resize "..ovwd.." "..ovht) Refresh() end end -------------------------------------------------------------------------------- function CheckCursor(xy) local editing = currcursor ~= movecursor if #xy > 0 then -- update cursor if mouse moves in/out of tool bar local x, y = split(xy) x = tonumber(x) y = tonumber(y) if y < toolbarht then if not arrow_cursor then -- mouse moved inside tool bar ov("cursor arrow") arrow_cursor = true if #activecell > 0 and editing then activecell = "" Refresh() end end else if arrow_cursor then -- mouse moved outside tool bar ov("cursor "..currcursor) arrow_cursor = false end if editing then local oldcell = activecell activecell = InsideActiveCell(x, y) if activecell ~= oldcell then Refresh() end end end elseif #activecell > 0 and editing then activecell = "" Refresh() end end -------------------------------------------------------------------------------- function ViewChanged(rotate) -- cube needs recreating on rotate or depth shade toggle lastHistorySize = -1 lastCubeSize = -1 lastBusyCubeSize["E"] = -1 lastBusyCubeSize["O"] = -1 if not rotate then -- sphere only needs recreating on depth shade toggle lastSphereSize = -1 lastBusySphereSize["E"] = -1 lastBusySphereSize["O"] = -1 end end -------------------------------------------------------------------------------- function Rotate(xangle, yangle, zangle, display) if display == nil then display = true end local x = xangle * DEGTORAD local y = yangle * DEGTORAD local z = zangle * DEGTORAD local cosrx = cos(x) local sinrx = sin(x) local cosry = cos(y) local sinry = sin(y) local cosrz = cos(z) local sinrz = sin(z) -- calculate transformation matrix for rotation -- (note that rotation is about fixed *screen* axes) local a = cosry*cosrz local b = cosry*sinrz local c = -sinry local d = sinrx*sinry*cosrz - cosrx*sinrz local e = sinrx*sinry*sinrz + cosrx*cosrz local f = sinrx*cosry local g = cosrx*sinry*cosrz + sinrx*sinrz local h = cosrx*sinry*sinrz - sinrx*cosrz local i = cosrx*cosry -- rotate global matrix by new matrix local anew = a*xixo + b*yixo + c*zixo local bnew = a*xiyo + b*yiyo + c*ziyo local cnew = a*xizo + b*yizo + c*zizo local dnew = d*xixo + e*yixo + f*zixo local enew = d*xiyo + e*yiyo + f*ziyo local fnew = d*xizo + e*yizo + f*zizo local gnew = g*xixo + h*yixo + i*zixo local hnew = g*xiyo + h*yiyo + i*ziyo local inew = g*xizo + h*yizo + i*zizo -- check if the view changed if (xixo ~= anew) or (xiyo ~= bnew) or (xizo ~= cnew) or (yixo ~= dnew) or (yiyo ~= enew) or (yizo ~= fnew) or (zixo ~= gnew) or (ziyo ~= hnew) or (zizo ~= inew) then ViewChanged(true) end -- update the transformation matrix xixo = anew xiyo = bnew xizo = cnew yixo = dnew yiyo = enew yizo = fnew zixo = gnew ziyo = hnew zizo = inew ovt{"settrans3d", xixo, xiyo, xizo, yixo, yiyo, yizo, zixo, ziyo, zizo} if display then Refresh() end end -------------------------------------------------------------------------------- function InitialView(display) if display == nil then display = true end -- initialize the transformation matrix xixo = 1.0; yixo = 0.0; zixo = 0.0 xiyo = 0.0; yiyo = 1.0; ziyo = 0.0 xizo = 0.0; yizo = 0.0; zizo = 1.0 ovt{"settrans3d", xixo, xiyo, xizo, yixo, yiyo, yizo, zixo, ziyo, zizo} -- rotate to a nice view but don't call Refresh Rotate(160, 20, 0, false) -- user can hit the up arrow 4 times and the right arrow 4 times -- to see an untilted XY plane parallel with the screen FitGrid(display) -- calls Refresh if display is true end -------------------------------------------------------------------------------- function InitDepthShading() -- initialize each depth shading layer local extradepth = round(depthlayers * sqrt(3)) mindepth = -extradepth // 2 maxdepth = depthlayers + extradepth // 2 ovt{"setdepthshading3d", depthshading, depthlayers, mindepth, maxdepth} end -------------------------------------------------------------------------------- function Initialize() CreateOverlay() CreateMenuBar() CreateToolBar() CreatePopUpMenus() CreateAxes() InitDepthShading() UpdateHistory() if #rulestring == 0 then -- first call must initialize rulestring, survivals, births and NextGeneration ParseRule(DEFAULT_RULE) end if N == 0 then -- set grid size to default SetGridSizeOnly(DEFAULTN) else SetGridSizeOnly(N) end -- create reference cube (never displayed) refcube = CreateCube(0,0,0) ClearCells() if rulestring == DEFAULT_RULE then -- initial pattern is the Life-like glider in rule 3D5,6,7/6 local mid = N//2 SetLiveCell(mid, mid+1, mid) SetLiveCell(mid+1, mid, mid) SetLiveCell(mid-1, mid-1, mid) SetLiveCell(mid, mid-1, mid) SetLiveCell(mid+1, mid-1, mid) SetLiveCell(mid, mid+1, mid-1) SetLiveCell(mid+1, mid, mid-1) SetLiveCell(mid-1, mid-1, mid-1) SetLiveCell(mid, mid-1, mid-1) SetLiveCell(mid+1, mid-1, mid-1) dirty = false end SetActivePlane() InitialView(false) -- don't call Refresh now (we'll do it below) -- run the user's startup script if it exists local f = io.open(startup, "r") if f then f:close() RunScript(startup) ClearUndoRedo() -- don't want to undo startup script end -- note that startup script might have changed BACK_COLOR etc ov("textoption background "..BACK_COLOR:sub(6)) ssbutton.customcolor = START_COLOR ssbutton.darkcustomcolor = SELSTART_COLOR ovt{"setpattern3d", grid1, false} update_grid = false Refresh() end -------------------------------------------------------------------------------- function HandleKey(event) local CMDCTRL = "cmd" if g.os() ~= "Mac" then CMDCTRL = "ctrl" end local _, key, mods = split(event) if key == "return" and mods == "none" then StartStop() elseif key == "space" and mods == "none" then Step1() elseif key == "tab" and mods == "none" then NextStep() elseif key == "down" and mods == "none" then Rotate(-5, 0, 0) elseif key == "up" and mods == "none" then Rotate( 5, 0, 0) elseif key == "left" and mods == "none" then Rotate( 0, -5, 0) elseif key == "right" and mods == "none" then Rotate( 0, 5, 0) elseif key == "down" and mods == "alt" then Rotate( 0, 0, -5) elseif key == "right" and mods == "alt" then Rotate( 0, 0, -5) elseif key == "up" and mods == "alt" then Rotate( 0, 0, 5) elseif key == "left" and mods == "alt" then Rotate( 0, 0, 5) elseif key == "delete" and mods == "none" then ClearSelection() elseif key == "delete" and mods == "shift" then ClearOutside() elseif key == "=" and mods == "none" then Faster() elseif key == "-" and mods == "none" then Slower() elseif key == "1" and mods == "none" then SetStepSizeTo1() elseif key == "5" and mods == "none" then RandomPattern() elseif key == "n" and mods == CMDCTRL then NewPattern() elseif key == "o" and mods == CMDCTRL then OpenPattern() elseif key == "s" and mods == CMDCTRL then SavePattern() elseif key == "o" and mods == "shift" then OpenClipboard() elseif key == "r" and mods == "shift" then RunClipboard() elseif key == "r" and mods == CMDCTRL then Reset() elseif key == "r" and mods == "none" then ChangeRule() elseif key == "g" and (mods == "none" or mods == CMDCTRL) then SetGridSize() elseif key == "a" and (mods == "none" or mods == CMDCTRL) then SelectAll() elseif key == "k" and (mods == "none" or mods == CMDCTRL) then CancelSelection() elseif key == "z" and (mods == "none" or mods == CMDCTRL) then Undo() elseif key == "z" and (mods == "shift" or mods == CMDCTRL.."shift") then Redo() elseif key == "x" and mods == CMDCTRL then CutSelection() elseif key == "c" and mods == CMDCTRL then CopySelection() elseif key == "v" and (mods == "none" or mods == CMDCTRL) then Paste() elseif key == "v" and mods == "alt" then CancelPaste() elseif key == "b" and mods == CMDCTRL then PasteOR() elseif key == "b" and mods == CMDCTRL.."shift" then PasteXOR() elseif key == "b" and mods == "none" then Rotate(0, 180, 0) elseif key == "[" and mods == "none" then ZoomOut() elseif key == "]" and mods == "none" then ZoomIn() elseif key == "{" and mods == "none" then ZoomHalf() elseif key == "}" and mods == "none" then ZoomDouble() elseif key == "i" and mods == "none" then InitialView() elseif key == "f" and mods == "none" then FitGrid() elseif key == "p" and mods == "none" then CycleCellType() elseif key == "l" and mods == "none" then ToggleLines() elseif key == "l" and mods == "shift" then ToggleAxes() elseif key == "d" and mods == "alt" then ToggleDepthShading() elseif key == "t" and mods == "none" then ToggleToolBar() elseif key == "," and mods == "none" then MoveActivePlane(activepos+1, true) elseif key == "." and mods == "none" then MoveActivePlane(activepos-1, true) elseif key == "a" and mods == "shift" then CycleActivePlane() elseif key == "c" and mods == "none" then CycleCursor() elseif key == "d" and mods == "none" then DrawMode() elseif key == "s" and mods == "none" then SelectMode() elseif key == "m" and mods == "none" then MoveMode() elseif key == "m" and mods == "shift" then MiddlePattern() elseif key == "h" and mods == "none" then ShowHelp() elseif key == "y" and mods == "none" then ToggleShowHistory() elseif key == "y" and mods == "shift" then ToggleFadeHistory() elseif key == "q" then ExitScript() else -- could be a keyboard shortcut (eg. for full screen) g.doevent(event) end end -------------------------------------------------------------------------------- function MouseDown(x, y, mods, mouseinfo) -- mouse button has been pressed mouseinfo.mousedown = true mouseinfo.prevx = x mouseinfo.prevy = y if pastecount > 0 then -- paste pattern can be dragged using any cursor mouseinfo.dragface = StartDraggingPaste(x, y) mouseinfo.drag_paste = #mouseinfo.dragface > 0 end if mouseinfo.drag_paste then -- ignore currcursor RememberCurrentState() elseif currcursor == drawcursor then if mods == "none" then mouseinfo.drawing = StartDrawing(x, y) elseif mods == "shift" then mouseinfo.drag_active = StartDraggingPlane(x, y) end elseif currcursor == selectcursor then if mods == "none" then mouseinfo.selecting = StartSelecting(x, y) elseif mods == "shift" then mouseinfo.drag_active = StartDraggingPlane(x, y) end else -- currcursor == movecursor if mods == "none" then if selcount > 0 then mouseinfo.dragface = StartDraggingSelection(x, y) mouseinfo.drag_selection = #mouseinfo.dragface > 0 end elseif mods == "alt" then mouseinfo.hand_erase = true EraseLiveCells(x, y, true) elseif mods == "shift" then mouseinfo.hand_select = true SelectLiveCells(x, y, true) end end end -------------------------------------------------------------------------------- function MouseUp(mouseinfo) -- mouse button has been released mouseinfo.mousedown = false if mouseinfo.drawing then mouseinfo.drawing = false CheckIfGenerating() elseif mouseinfo.selecting then mouseinfo.selecting = false CheckIfGenerating() elseif mouseinfo.drag_paste then mouseinfo.drag_paste = false CheckIfGenerating() elseif mouseinfo.drag_selection then mouseinfo.drag_selection = false StopDraggingSelection() CheckIfGenerating() elseif mouseinfo.drag_active then mouseinfo.drag_active = false CheckIfGenerating() elseif mouseinfo.hand_erase then mouseinfo.hand_erase = false CheckIfGenerating() elseif mouseinfo.hand_select then mouseinfo.hand_select = false CheckIfGenerating() end end -------------------------------------------------------------------------------- function CheckMousePosition(mousepos, mouseinfo) if #mousepos > 0 then local x, y = split(mousepos) x = tonumber(x) y = tonumber(y) if x ~= mouseinfo.prevx or y ~= mouseinfo.prevy then -- mouse has moved if mouseinfo.drawing then DrawCells(x, y) elseif mouseinfo.selecting then SelectCells(x, y) elseif mouseinfo.drag_paste then DragPaste(x, y, mouseinfo.prevx, mouseinfo.prevy, mouseinfo.dragface) elseif mouseinfo.drag_selection then DragSelection(x, y, mouseinfo.prevx, mouseinfo.prevy, mouseinfo.dragface) elseif mouseinfo.drag_active then DragActivePlane(x, y, mouseinfo.prevx, mouseinfo.prevy) elseif mouseinfo.hand_erase then EraseLiveCells(x, y, false) elseif mouseinfo.hand_select then SelectLiveCells(x, y, false) else -- rotate the view local deltax = x - mouseinfo.prevx local deltay = y - mouseinfo.prevy Rotate(round(-deltay/2.0), round(deltax/2.0), 0) end mouseinfo.prevx = x mouseinfo.prevy = y end elseif #activecell > 0 and currcursor ~= movecursor then activecell = "" Refresh() end end -------------------------------------------------------------------------------- function EventLoop() -- best to call Initialize here so any error is caught by xpcall Initialize() local mouseinfo = { mousedown = false, -- mouse button is down? drawing = false, -- draw/erase cells with pencil cursor? selecting = false, -- (de)select cells with cross-hairs cursor? drag_paste = false, -- drag paste pattern with any cursor? drag_selection = false, -- drag selected cells with hand cursor? drag_active = false, -- drag active plane with pencil/cross-hairs? hand_erase = false, -- erase live cells with hand cursor? hand_select = false, -- select live cells with hand cursor? dragface = "", -- which paste/selection face is being dragged prevx = nil, prevy = nil -- previous mouse position } while true do local event = g.getevent() if #event == 0 then if not mouseinfo.mousedown then if not generating then g.sleep(5) -- don't hog the CPU when idle end CheckWindowSize() -- may need to resize the overlay end else if message and (event:find("^key") or event:find("^oclick") or event:find("^file")) then message = nil Refresh() -- remove the most recent message end event = op.process(event) if #event == 0 then -- op.process handled the given event elseif event:find("^key") then -- don't do key action if mouse button is down (can clobber undo history) if not mouseinfo.mousedown then HandleKey(event) end elseif event:find("^oclick") then local _, x, y, button, mods = split(event) x = tonumber(x) y = tonumber(y) if y > toolbarht then if (button == "right" and (mods == "none" or mods == "ctrl")) or (button == "left" and mods == "ctrl") then if pastecount > 0 then ChoosePasteAction(x, y) elseif selcount > 0 then ChooseSelectionAction(x, y) end elseif button == "left" then MouseDown(x, y, mods, mouseinfo) end end elseif event:find("^mup") then MouseUp(mouseinfo) elseif event:find("^ozoomout") then if not arrow_cursor then ZoomOutPower() end elseif event:find("^ozoomin") then if not arrow_cursor then ZoomInPower() end elseif event:find("^file") then OpenFile(event:sub(6)) end end local mousepos = ov("xy") if mouseinfo.mousedown then CheckMousePosition(mousepos, mouseinfo) else CheckCursor(mousepos) if generating then NextGeneration() end end end end -------------------------------------------------------------------------------- ReadSettings() oldstate = SaveGollyState() status, err = xpcall(EventLoop, gp.trace) if err then g.continue(err) end -- the following code is always executed -- ensure the following code *completes*, even if user quits Golly g.check(false) RestoreGollyState(oldstate) WriteSettings() golly-3.3-src/Scripts/Lua/slide-show.lua0000644000175000017500000000514613107435536015161 00000000000000-- Display all patterns in Golly's Patterns folder. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2016. local g = golly() local gp = require "gplus" local pathsep = g.getdir("app"):sub(-1) local message = "Hit space to continue or escape to exit the slide show..." -------------------------------------------------------------------------------- local function walk(dir) local files = g.getfiles(dir) for _, name in ipairs(files) do if name:sub(1,1) == "." then -- ignore hidden files (like .DS_Store on Mac) elseif name:sub(-1) == pathsep then -- name is a subdirectory walk(dir..name) else g.new("") g.setalgo("QuickLife") -- nicer to start from this algo local fullname = dir..name g.open(fullname, false) -- don't add file to Open/Run Recent submenu g.update() if name:sub(-4) == ".lua" or name:sub(-3) == ".py" then -- reshow message in case it was changed by script g.show(message) end while true do local event = g.getevent() if event == "key space none" then break end g.doevent(event) -- allow keyboard/mouse interaction end end end end -------------------------------------------------------------------------------- function slideshow() local oldalgo = g.getalgo() local oldrule = g.getrule() g.show(message) walk(g.getdir("app").."Patterns"..pathsep) -- if all patterns have been displayed then restore original algo and rule -- (don't do this if user hits escape in case they want to explore pattern) g.new("untitled") g.setalgo(oldalgo) g.setrule(oldrule) end -------------------------------------------------------------------------------- -- show status bar but hide other info to maximize viewport local oldstatus = g.setoption("showstatusbar", 1) local oldtoolbar = g.setoption("showtoolbar", 0) local oldlayerbar = g.setoption("showlayerbar", 0) local oldeditbar = g.setoption("showeditbar", 0) local oldfiles = g.setoption("showfiles", 0) local status, err = xpcall(slideshow, gp.trace) if err then g.continue(err) end -- this code is always executed, even after escape/error; -- clear message line in case there was no escape/error g.show("") -- restore original state g.setoption("showstatusbar", oldstatus) g.setoption("showtoolbar", oldtoolbar) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) g.setoption("showfiles", oldfiles) golly-3.3-src/Scripts/Lua/make-torus.lua0000755000175000017500000000135412773066602015174 00000000000000-- Use the current selection to create a toroidal universe. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2016. local g = golly() local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end local x, y, wd, ht = table.unpack(selrect) local selcells = g.getcells(selrect) if not g.empty() then g.clear(0) g.clear(1) end -- get current rule, remove any existing suffix, then add new suffix local rule = g.getrule() rule = rule:match("^(.+):") or rule g.setrule(string.format("%s:T%d,%d", rule, wd, ht)) local newx = -math.floor(wd/2) local newy = -math.floor(ht/2) selrect[1] = newx selrect[2] = newy g.select(selrect) if #selcells > 0 then g.putcells(selcells, newx - x, newy - y) end g.fitsel() golly-3.3-src/Scripts/Lua/metafier.lua0000644000175000017500000012652312707765343014711 00000000000000-- metafier.lua: -- Uses the current selection to build a Brice Due metapixel pattern. -- See http://otcametapixel.blogspot.com for more info. -- Original author: Dave Greene, 12 June 2006. -- -- Dave Greene, 23 June 2006: added non-Conway's-Life rule support. -- Also reduced the script size by a factor of six, at the expense of -- adding a moderate-sized [constant] performance hit at the start -- [due to composing the base tiles from smaller subpatterns.] -- -- The delay is almost all due to running CellCenter[3680] at the end -- to produce the large filled area for the ONcell. Subpatterns are -- generally (with some exceptions) defined to match the labeled slides at -- http://otcametapixel.blogspot.com/2006/05/how-does-it-work.html . -- -- It's still possible to simplify the script by another factor of -- two or more, by replacing the four main types of P46 oscillators -- [which are often quoted as flat patterns] with predefined library -- versions in the correct phase; see samples in the slide-24 section. -- -- 24 June 2006: the script now saves a reference copy of the OFFcell -- and (particularly) the slow-to-construct ONcell, so these only have -- to be constructed from scratch once, the first time the script runs. -- -- If metapixel-ON.rle and metapixel-OFF.rle become corrupted, they -- should be deleted so the script can re-generate them. -- -- 3 July 2007: added code to avoid errors in rules like Seeds, -- where the Golly canonical form of the rule doesn't include a '/' -- -- Modified by Andrew Trevorrow, 20 July 2006 (faster, simpler and -- doesn't change the current clipboard). -- -- Modified by Andrew Trevorrow, 5 October 2007 (metafied pattern is -- created in a separate layer so we don't clobber the selection). -- -- converted from Python to Lua by Dave Greene, 23 April 2016 local g = golly() local gp = require "gplus" local split = gp.split local pattern = gp.pattern local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end -- check that a layer is available for the metafied pattern; -- if metafied layer already exists then we'll use that local layername = "metafied" local metalayer = -1 local i for i= 0,g.numlayers()-1 do if g.getname(i) == layername then metalayer = i break end end if metalayer < 0 and g.numlayers() == g.maxlayers() then g.exit("Delete a layer.") end -- note that getrule returns canonical rule string rulestr, _ = split(g.getrule(),":") if string.sub(rulestr,1,1)~="B" or string.find(rulestr,"/S") == nil then g.exit("This script only works with B*/S* rules.") end -- get the current selection local slist = g.getcells(selrect) local selwidth = selrect[3] local selheight = selrect[4] -- create a sparse table of 0s and 1s representing entire selection livecell = {} for i=1, #slist, 2 do livecell[(slist[i] - selrect[1])..","..(slist[i+1] - selrect[2])] = 1 end local r1, r2 = split(rulestr,"/") -- build a patch pattern based on the current rule -- that fixes the appropriate broken eaters in the rules table if string.sub(r1,1,1) == "B" then Bvalues = string.sub(r1,2) Svalues = string.sub(r2,2) elseif string.sub(r1,1,1) == "S" then Svalues = string.sub(r1,2) Bvalues = string.sub(r2,2) else Svalues, Bvalues = r1, r2 end -- create metafied pattern in separate layer if metalayer >= 0 then g.setlayer(metalayer) -- switch to existing layer else metalayer = g.addlayer() -- create new layer end g.new(layername) -- clear any existing pattern g.setrule("Life") g.setalgo("QuickLife") -- qlife's setcell is faster local Brle = "b10$b10$b26$b10$b10$b26$b10$b10$b!" local Srle = Brle for i = 1, #Bvalues do ind=225-Bvalues:byte(i)*4 -- because B and S values are highest at the top! Brle=string.sub(Brle,1,ind-1).."o"..string.sub(Brle,ind+1) end for i = 1, #Svalues do ind=225-Svalues:byte(i)*4 -- ASCII byte value of '0' is 48, '8' is 56 Srle=string.sub(Srle,1,ind-1).."o"..string.sub(Srle,ind+1) end local RuleBits = pattern(Brle, 148, 1404) + pattern(Srle, 162, 1406) -- load or generate the OFFcell tile: local OFFcellFileName = g.getdir("data").."metapixel-OFF.rle" local ONcellFileName = g.getdir("data").."metapixel-ON.rle" local fOFF = io.open(OFFcellFileName, "r") local fON = io.open(OFFcellFileName, "r") local OFFcell, ONcell if fON and fOFF then g.show("Opening metapixel-OFF and metapixel-ON from saved pattern file.") OFFcell = pattern(g.transform(g.load(OFFcellFileName),-5,-5,1,0,0,1)) ONcell = pattern(g.transform(g.load(ONcellFileName),-5,-5,1,0,0,1)) fON:close() fOFF:close() else g.show("Building OFF metacell definition...") -- slide #21: programmables -------------------- local LWSS = pattern("b4o$o3bo$4bo$o2bo!", 8, 0) local DiagProximityFuse = pattern([[ bo$obo$bo2$4b2o$4b2o$59b2o$59b2o3$58b2o2b2o$9b2o3bo5bo5bo5bo5bo5bo5bo 7b2o2b2o$9bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo$10bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo$11bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo5b2o$ 12bo5bo5bo5bo5bo5bo5bo5bo3bobo$55bo2bo$56bobo$57bo!]], -5, -5) local OrthoProximityFuse = pattern("2o41b2o$2o41bo$41bobo$41b2o!", 1001, 0) local ProximityFuses = LWSS + DiagProximityFuse + OrthoProximityFuse local AllFuses = pattern() -- place four sets of fuses around cell perimeter for i=0,3 do AllFuses = AllFuses.t(2047, 0, gp.rcw) + ProximityFuses end local temp = pattern("o$3o$3bo$2bo!") -- broken eater temp = temp + temp.t(0, 10) + temp.t(0, 20) temp = temp + temp.t(0, 46) + temp.t(0, 92) local TableEaters = temp.t(145, 1401) + temp.t(165, 1521, gp.flip) -- 18 eaters in all local HoneyBitsB = pattern([[ bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$ob o$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo!]], 123, 1384) local HoneyBitsS = HoneyBitsB.t(57, 34) -- silly composition of letter labels out of subpatterns temp = pattern("2bobo2$obobo2$obo2$obo2$2bobo4$obo2$obobo2$2bobo!") local S = temp + temp.t(10, 16, gp.flip) local B = S + pattern("o6$8bobo2$o2$obo6$o!") temp = pattern("2bobo2$obobo2$obo2$obo2$obo2$obo2$obo2$obobo2$2bobo!") local O = temp + temp.t(10, 16, gp.flip) temp = pattern("obo2$obo2$obobo2$obobo2$obo2bo2$obo2$obo2$obo2$obo!") local N = temp + temp.t(10, 16, gp.flip) temp = pattern("obobobobo2$obobobobo2$obo2$obo2$obo2$obo!") local F = temp + temp.t(0,6) -- overlap, just to try it out... local Eatr = pattern("4bobo2$4bobo2$obo2$obo2$4bobobobobobo2$4bobobobobobo2$12bobo2$12bobo2$") local Eater = Eatr + pattern("obo2$obo2$") local LabelDigits = pattern([[ obobo2$o3bo2$obobo2$o3bo2$obobo5$obobo2$4bo2$4bo2$4bo2$4bo5$obobo2$o2$ obobo2$o3bo2$obobo12$obobo2$o2$obobo2$4bo2$obobo5$o3bo2$o3bo2$obobo2$ 4bo2$4bo5$obobo2$4bo2$obobo2$4bo2$obobo12$obobo2$4bo2$obobo2$o2$obobo 5$2bo2$2bo2$2bo2$2bo2$2bo5$obobo2$o3bo2$o3bo2$o3bo2$obobo!]]) local VLine = pattern(string.rep("o2$", 25)) local VLine2 = pattern(string.rep("o2$", 71)) local HLine = pattern(string.rep("ob", 38)) local TableLabels = VLine.t(18, 1440) + VLine.t(96, 1440) + Eater.t(77, 1446) + HLine.t(20, 1440) + HLine.t(20, 1488) + O.t(39, 1444) + N.t(55, 1444) + O.t(23, 1468) + F.t(39, 1468) + F.t(55, 1468) + Eatr.t(77, 1470) TableLabels = TableLabels + pattern(string.rep("ob",29).."8bobobo", 120, 1533) + HLine.t(118, 1391) + VLine2.t(118, 1393) + VLine2.t(192, 1393) + B.t(123, 1410) + B.t(123, 1456) + B.t(123, 1502) + S.t(177, 1398) + S.t(177, 1444) + S.t(177, 1490) + LabelDigits.t(138, 1396) + LabelDigits.t(168, 1401) local all = AllFuses + TableEaters + TableLabels + HoneyBitsB + HoneyBitsS -- slide 22: linear clock -------------------- LinearClockGun = pattern([[ 19bo$17b3o$16bo$16b2o$30bo$28b3o$27bo$27b2o$13b3o$12bo2b2o$11bo3b2o$ 12b3o$12b2o$15bo$13b2o$13b2o$2b2o5b2o2b2o$bobo9b2o8b2o$bo6b3o12b2o$2o 8b4o$12b3o$12bob2o$11b2o2bo$11b2ob2o$12bobo$13bo2$6b2o$5bobo$5bo$4b2o$ 10b2o36bo6b2o$11bo37b2o4b2o$8b3o37b2o$8bo$57bo$15b2o39bobo$14bobo15b2o 23bo$13b2obo15b2o24b3o63b2o$8bo5b2o44bo63b2o$6b3o6bo$5bo112bo5bo$6b3o 6bo15b2o84b3o3b3o$8bo5b2o15b2o20b2o62bo2bobo2bo$13b2obo35b2ob2o62b2ob 2o$14bobo18b3o15b4o$15b2o18bobo16b2o$35bobo$36bobo78bo7bo$38bo79bobobo bo$70bo47bobobobo$70b3o44bob2ob2obo$37bo35bo43b2o5b2o$37bo34b2o20b2o$ 59bo35bo$59b3o33bobo$62bo33b2o$61b2o4$28b2o7b2o11bo24bo$28bob2o3b2obo 10b3o22b3o$28bo3bobo3bo9b2obo21b2o2bo41b2ob2o$28b2o2bobo2b2o9b3o21b2o 3b2o11b2o28bobo$29b3o3b3o11b2o19bobo2bobo13bo10b3o8b2o5bobo$30bo5bo33b 2o3b2o9b2o3bobo7bo2bo4bo3b2o6bo$65b2o19bobo3b2o6bo3bo3bobo$65b2o21bo 11bo7bobo$25b2o13b2o46b2o13bo$25b2o2b2o5b2o2b2o58b2obo$29b2o5b2o$121b 2o$103bob2o14bobo$103b3o17bo$40bo63bo18b2o$40bo2b2o72b2o$39bo5bo36b2o 33bo$40bobo2b2o35bobo33b3o$27bo12bo3b2o38bo35bo$25b3o14b3o39b2o20b2o$ 24bo41b2o10b2o26bo$25b3o14b3o20bo2bo9bo28b3o$27bo12bo3b2o20b2o11b3o27b o$40bobo2b2o4b2o28bo$39bo5bo5b2o$40bo2b2o$40bo!]], 46, 1924) Gap = "3bo7bo7bo$b3o5b3o5b3o$o7bo7bo$2o6b2o6b2o21$" -- string, not pattern! LinearClockEaters = pattern(string.rep("3bo$b3o$o$2o5$", 36)..Gap ..string.rep("3bo$b3o$o$2o5$",10).."24$"..string.rep("3bo$b3o$o$2o5$",17) ..Gap..string.rep("3bo$b3o$o$2o5$",42)..Gap.."3bo$b3o$o$2o5$3bo7bo$b3o5b3o$o7bo$2o6b2o13$" ..string.rep("3bo$b3o$o$2o5$",30).."8$"..string.rep("3bo$b3o$o$2o5$",2)..Gap.."16$" ..string.rep("3bo$b3o$o$2o5$",11).."8$"..string.rep("3bo$b3o$o$2o5$",19), 101, 422) LinearClockCap = pattern([[ 3b2o13bo7bo$2bo2bo10b3o5b3o$bobobo9bo7bo14b2o$3obo10b2o6b2o13bobo$3o 29bo6b3o$30b2ob2ob3ob2o$30b2ob2ob5o$32bo5bo$2b2o29b2ob2o$2b2o3$32bo5bo $31b2o5b2o$30bob2o3b2obo$30bob2o3b2obo$31b3o3b3o$31b3o3b3o10$33b2ob2o$ 34bobo$34bobo$35bo!]], 83, 401) all = all + LinearClockGun[1840] + LinearClockEaters + LinearClockCap -- slide 23: MWSS track -------------------- local MWSS = pattern("b5o$o4bo$5bo$o3bo$2bo!", 521, 1973) local P46Osc = pattern([[ 40bo$31b2o5b3o$10b3o14b2o3bo4bo$10bo3bo12b2o3bobo3bo$3bo6bo4bo17bobo3b o$b3o7bo3bo18bo3b2o$o$b3o7bo3bo7b3o$3bo6bo4bo5b2obob2o$10bo3bo5bo5b2o$ 10b3o8b2obob2o$23b3o!]]) local P46Gun = pattern([[ 31b2o$30b2o$31b5o9bo$16b3o13b4o9b3o$14bo3bo29bo$3bo9bo4bo13b4o9b3o$b3o 9bo3bo13b5o9bo$o29b2o$b3o9bo3bo13b2o$3bo9bo4bo$14bo3bo$16b3o!]]) local GliderToMWSS = P46Osc.t(449, 1963) + P46Gun.t(474, 1981) -- exact match would be P46Gun[46](474, 1981), but that glider is absorbed local StateBit = pattern("b2o$obo$bo!", 569, 1970) local Snake = pattern("2o$o$bo$2o!", 570, 1965) local BitKeeper = pattern([[ 15bobo2b2o19b2o$14bo3bob3o19bo$15bo6b2o15b3o$3bo12b5obo16bo$b3o15b3o$o $b3o15b3o$3bo12b5obo$15bo6b2o3b2o$14bo3bob3o4b2o$15bobo2b2o!]], 524, 1982) local GliderFromTheBlue = pattern([[ 23b2o$23bo2bobo$25b2ob3o$31bo$25b2ob3o$12bo3bo8b2obo$11bo5bo$17bo$3bo 8bo3b2o$b3o9b3o$o$b3o9b3o19bo$3bo8bo3b2o7bo7b3o$17bo4bo2bob2o3bo$11bo 5bo10bo4bo$12bo3bo10bo4b2o2$23b5o$24b4o$26bo!]]) local GliderToLWSS = pattern([[ 3bo$2bobo$bo3bo3b2o$b5o3b2o$obobobo$bo3bo2$bo3bo$obobobo$b5o$bo3bo$2bo bo$3bo6$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2bo3bo2bo$2b3o 3b3o4$4b2ob2o$5bobo$5bobo$6bo!]], 663, 1931) -- P46Osc really local ReflectLWSS = pattern([[ b2o$b2o8$b3o3b3o$o2bo3bo2bo$2obo3bob2o14$3b2ob2o$4bobo$4bobo$5bo!]], 589, 1940) local ReflectLWSS2 = pattern([[ 15b2o3bo$15b3obob2o4b2o$15b3o4bo4b2o$3bo14bo3bo$b3o15b3o$o$b3o15b3o$3b o14bo3bo$15b3o4bo$15b3obob2o$15b2o3bo!]], 573, 1884) -- P46Osc really local LWSStoBoat = pattern([[ 2o14b2o9b2o$2o15b2o8b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b5o$b2o3b2o9b2o 8b2o$2bobob2o8b2o9b2o$3b2o!]], 821, 1883) -- P46Osc really local ReflectMWSS = pattern([[ 22b2o5b2o$18b2o2b2o5b2o2b2o$18b2o2b2o5b2o2b2o$22b3o3b3o$21bo2bo3bo2bo$ 25bobo$21b2o7b2o$21b2o7b2o$24bo3bo$24b2ob2o$22b3o3b3o$22b2o5b2o$22bo7b o10$b2o27b2o$b2o25b2ob2o$26bo2bobo$6bo3b2o14bo$2o2b2obob3o14bo4bo$2o2b o4b3o15bo3bo$4bo3bo15b2o2b3o$5b3o16b2o2$5b3o$4bo3bo$2o2bo4b3o13b2o$2o 2b2obob3o13b2o$6bo3b2o2$b2o$b2o!]]) local HoneyBit = pattern("b2o$o2bo$b2o!") local CornerSignalSystem = pattern([[ 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o!]], 70, 9) -- P46OscAlt1 really -- include stopper for pattern corners, destroyed in the interior of -- multi-cell metapatterns by the tub-LWSS-fuse combination CornerSignalSystem = CornerSignalSystem + pattern("5b2o$5b2o3$2o2b2o$2o2b2o!", 86, 1) + pattern([[ 11b2o$11b2o12$4b3o3b3o$4b3o3b3o$3bob2o3b2obo$3bob2o3b2obo$4b2o5b2o$5bo 5bo6$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o!]], 159, 0) -- P46OscAlt1 really local SignalSystem = pattern() for i=0,2 do -- place three sets of mechanisms to signal neighbors SignalSystem = SignalSystem[32].t(2047, 0, gp.rcw) + HoneyBit.t(42, 111, gp.rcw) + ReflectMWSS.t(38, 46) + GliderFromTheBlue.t(73, 52) + CornerSignalSystem + HoneyBit.t(964, 40) + GliderFromTheBlue[12].t(953, 52) end -- need to add the fourth (west) side separately because signal stops there, -- so two-thirds of the pieces are customized or in slighly different locations -- (could have started in SW corner and used range(0,4) for some of it, -- but I happened to start in the NW corner and now I'm feeling lazy) -- west edge: SignalSystem = SignalSystem + HoneyBit.t(48, 1086, gp.rcw) + pattern([[ 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o$4bo$b2o2bo7bo$2bo2bo 7bobo$o8b3o$2o9b3o2bo$9b2o4b2o$13b2o6$8bo3bo$8bo3bo3$5b2obo3bob2o$6b3o 3b3o$7bo5bo6$8b2ob2o$9bobo$9bobo$10bo!]], 52, 1059) -- GliderFromTheBlue really -- southwest corner: SignalSystem = SignalSystem + pattern([[ 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o2$b2ob2o7b3o$2bob2o6bo 2bo$o13b2o$2o9bo3bo$11bo2b2o$13bob2o9$5b2o7b2o$5bob2o3b2obo$5bo3bobo3b o$5b2o2bobo2b2o$6b3o3b3o$7bo5bo4$8b2ob2o$9bobo6b2o$9bobo7bo$10bo5b3o$ 16bo!]], 52, 1885) -- GliderFromTheBlue plus a terminating eater really SignalSystem = SignalSystem + pattern([[ 24b2o$24b2o3$2o14b3o6b2o$2o12bo3bo6b2o$13bo4bo$13bo3bo2$3b3o7bo3bo$b2o bob2o5bo4bo$b2o5bo5bo3bo6b2o$b2obob2o8b3o6b2o$3b3o2$24b2o$24b2o! ]], 0, 1818) -- P46OscAlt1 really -- lengthened version of CornerSignalSystem SignalSystem = SignalSystem + pattern("2o$2o2b2o$4b2o3$4b2o$4b2o!", 1, 1955) + pattern([[ 24b2o$24b2o2$14b3o$13bo4bo6b2o$12bo5bo6b2o$13bo$14b2o2$14b2o$13bo$2o 10bo5bo6b2o$2o11bo4bo6b2o$14b3o2$24b2o$24b2o!]], 9, 1961) -- P46OscAlt1 really all = all + SignalSystem + GliderToMWSS + MWSS + Snake + BitKeeper all = all + GliderFromTheBlue.t(607, 1953) + GliderToLWSS + ReflectLWSS + ReflectLWSS2 + LWSStoBoat -- StateBit will be added later on, when defining OFFcell and ONcell -- slide 24: LWSS track -------------------- -- [phase adjusters and a bunch of honeybits] local PhaseAdjuster = P46Gun.t(2, 11, gp.flip_y) + P46Gun[12].t(0, 32) + pattern("o$3o$3bo$2b2o!", 0, 13) + pattern("2b2o$bobo$bo$2o!", 2, 26) -- eaters really all = all + PhaseAdjuster[43].t(1772,10) + PhaseAdjuster[26].t(2037, 1772, gp.rcw) all = all + PhaseAdjuster[43].t(269, 2037, gp.flip) + PhaseAdjuster[9].t(58, 1203, gp.swap_xy_flip) -- the third adjuster was a different shape in the original metacell, -- but one of the same shape could be substituted with no ill effects local LWSSPacketGun = pattern([[ 50b2o$52bo$37b2o10b2o2bo$37b2o11bo2bo$51bobo8bo$51b2o9b3o$65bo$40b2o9b 2o9b3o$38bo3b2o7bobo8bo$38bo4bo6bo2bo$38bo3b2o5b2o2bo$40b2o10bo$50b2o 5$52bo$52b3o$55bo$54b2o$41bo$41b3o$b2o5b2o34bo$b2o5b2o33b2o3$45b2o$43b o3bo5b2o9b2o$42bo5bo3bo2bo4b3o2bo$42bo4bo5bo4bo2b5o$42bo2bo7bo2b4o$43b obo8bob2o3bo$44bo8b2obob3o7b2o$55bo3bo8bobo$52b3o15bo$53bo16b2o$bo7bo$ b2o5b2o$b3o3b3o$3b2ob2o45b2o$3bo3bo22b2o21b2o$2o7b2o20bo$2o7b2o17b3o$ 4bobo21bo35b2o$o2bo3bo2bo53bobo$b3o3b3o56bo$66b2o$60b2o$60bo$b2o25b2o 31b3o$b2o25b2o33bo2$19b2o$17b2o2bo7b2o$17b6o6b2o$17b4o4$17b4o$17b6o6b 2o$17b2o2bo7b2o$19b2o2$28b2o$12bobo13b2o$13b2o$13bo5$17b2o$17b2o19$49b o3b3o$48bobo2b5o3b2o$48bo3b2o3b2o2b2o$49bo2bo3b2o$50b3o3bo2$50b3o3bo$ 49bo2bo3b2o$34b2o12bo3b2o3b2o2b2o$34b2o12bobo2b5o3b2o$49bo3b3o5$39bo$ 17b3o19b3o$17bo2bo21bo$17bo23b2o$17bo10bo$18bobo7b3o$31bo$30b2o$43bo3b o$42b5obo$41b3o4b2o$41b2ob5o$43b3o2$45bo$41bo2b3o$40b2obo3bo7b2o$34b2o 3b2ob3obo2b2o4bobo$34b2o3b3ob2o4b2o6bo$39b3o15b2o4$41bo$41bob3o$42bo3b o$13b2o3b2o8bo17bo$12bo2bobo2bo7bo2b2o10b2obo4b2o$11bo9bo5bo5bo11bo5bo bo$10b2o9b2o5bobo2b2o18bo$11bo9bo6bo3b2o3bo15b2o$12bo2bobo2bo9b3o4b3o 7b2o$13b2o3b2o20bo6bo$30b3o4b3o8b3o$28bo3b2o3bo12bo$12b2o14bobo2b2o$ 12b2o13bo5bo$28bo2b2o$28bo!]], 108, 710) all = all + LWSSPacketGun + pattern([[ b2o$b2o$7b3o$6bo3bo$6b2ob2o2$6b2ob2o$8bo4$bo7bo$o2bo3bo2bo$4bobo$4bobo $4bobo$o2bo3bo2bo$b3o3b3o8$3b2ob2o$4bobo$4bobo$5bo!]], 18, 725) -- P46Osc really local P46OscAlt1 = pattern([[ b2o$b2o2$6bo3b2o$2o2b2obob3o13b2o$2o2bo4b3o13b2o$4bo3bo$5b3o$19b2o3b2o $5b3o10b3o3b3o$4bo3bo7b3o7b3o$2o2bo4b3o4b3o7b3o$2o2b2obob3o4b3o7b3o$6b o3b2o6b3o3b3o$19b2o3b2o$b2o$b2o!]]) all = all + P46OscAlt1.t(4, 24) + P46OscAlt1[12].t(224, 67, gp.swap_xy_flip) local P46OscAlt2 = pattern([[ 2o8b3o14b2o$2o8bo3bo12b2o$10bo4bo$11bo3bo2$11bo3bo7b3o$10bo4bo5b2obob 2o$2o8bo3bo5bo5b2o$2o8b3o8b2obob2o$23b3o!]]) all = all + P46OscAlt2.t(179, 19) + P46OscAlt1[29].t(2023, 4, gp.rcw) -- got impatient here, started throwing in placeholders instead of true definitions -- -- NE corner along E edge: all = all + pattern([[ b2o$b2o2$8b2o9b2o3b2o$2o5bobo8bob2ob2obo$2o4b2obo8bo7bo$7b2o9bob2ob2ob o$8bo10b2o3b2o2$8bo$7b2o$2o4b2obo15b2o$2o5bobo15b2o$8b2o2$b2o$b2o!]], 1980, 208) + pattern([[ 2b2o5b2o$2b2o5b2o15$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2b o3bo2bo$2b3o3b3o6$9b2o$9b2o!]], 2018, 179) -- both P46OscAlt really -- SE corner: all = all + pattern([[ 24b2o$24b2o$14bo$13bo2bo$12b5o8b2o$11b2ob3o8b2o$12bob2o$13b2o2$13b2o$ 12bob2o$2o9b2ob3o8b2o$2o10b5o8b2o$13bo2bo$14bo$24b2o$24b2o!]], 2017, 2007) -- P46OscAlt really -- SE corner along S edge: all = all + pattern([[ 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o10$4bo7bo$3bobo5bobo$6bo3bo$3bo2bo3bo2b o$4bobo3bobo$6b2ob2o$3b2ob2ob2ob2o$3b2o2bobo2b2o$4b3o3b3o$5bo5bo4$4b2o $4b2o!]], 1823, 1980) + pattern([[ 20bo$15bo3bo$14bo8b2o2b2o$14bo2b2o5bo2b2o$15b2o5bobo$16b3o3b2o2$16b3o 3b2o$15b2o5bobo$2o12bo2b2o5bo2b2o$2o12bo8b2o2b2o$15bo3bo$20bo!]], 1840, 2018) -- both P46OscAlt really -- SW corner: all = all + pattern([[ 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o!]], 24, 2017) -- P46OscAlt really -- SW corner along W edge: all = all + pattern([[ 24b2o$24b2o3$2o14b2o7b2o$2o15b2o6b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b 5o$b2o3b2o9b2o6b2o$2bobob2o8b2o7b2o$3b2o2$24b2o$24b2o!]], 41, 1769) + pattern([[ b2o5bo$b2o4bobo$6bo3bo$6bo3bo$5b3ob3o$6bo3bo$6b2ob2o$7bobo$8bo5$3bo3bo $3bo3bo3$2obo3bob2o$b3o3b3o$2bo5bo8$b2o5b2o$b2o5b2o!]], 6, 1786) -- both P46OscAlt really -- LWSS -> G -> LWSS timing adjustment, middle of W edge: all = all + pattern([[ b2o5b2o$b2o5b2o16$3o5b3o$o2b2ob2o2bo$b3o3b3o$2bo5bo7$b2o$b2o!]], 10, 1217) + pattern([[ 4bo$2b5o10bo$bo2bob2o9b2o8b2o$o7bo9b2o7b2o$bo2bob2o5b2o2b2o$2b5o$4bo2$ 13b2o2b2o$2o16b2o7b2o$2o15b2o8b2o$17bo!]], 35, 1269) -- both P46OscAlt really -- final LWSS reflector, middle of W edge: all = all + pattern([[ 15bo$14b2o$13b3obo9b2o$12b2o13b2o$3bo9b2o$b3o10bo$o$b3o10bo10bo$3bo9b 2o8b2obo$12b2o8b2ob3o$13b3obo5bo2bo$14b2o8b2o$15bo!]], 8, 973) -- P46Osc really -- slide 25: decode -------------------- -- sync buffer: all = all + pattern([[ b2o5b2o$b2o5b2o7$2bo5bo$b3o3b3o$o2b2ob2o2bo$3o5b3o9$b3o$o3bo$2ob2o$bob o2$bobo$2ob2o$o3bo3b2o$b3o4b2o!]], 150, 958) -- P46OscAlt3 really all = all + pattern([[ 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o$8bo2bo$8bo2bo15b 2o$8b2ob2o14b2o$10b2o!]], 155, 998) -- P46OscAlt3 really all = all + pattern([[ 15bobo2b2o$2o12bo3bob3o4b2o$2o13bo6b2o3b2o$16b5obo$19b3o2$19b3o$16b5ob o$2o13bo6b2o$2o12bo3bob3o$15bobo2b2o!]], 114, 1008) -- P46OscAlt3 really all = all + pattern([[ b2o$b2o11$2bo5bo$bobo3bobo$o3bobo3bo$o3bobo3bo$o9bo2$b2o5b2o3$3b2ob2o$ 4bobo$3b2ob2o$4bobo$3b2ob2o$4bobo$4bobo$5bo!]], 141, 1024) -- P46OscAlt3 really -- P46 to P40 converter: all = all + pattern([[ 14bo$14b3o$17bo$16b2o50bo$10b2o54b3o$11bo53bo$11bobo51b2o$12b2o57b2o$ 48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o10b2o$36bo$35b2o2$6b2o$7bo 22bo$7bobo19b2o$8b2o10bo4bo49b2o$19b2o3b2o30bo18bo$18b2o3b2o29b4o15bob o$19b2o4bo27b2o3b2o13b2o$20b2o34bo3bo$56bo3bo$56bo2b2o$54bo3bo2$33b2o$ 33bo$34b3o$36bo11b2o$22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$ 16bo43bo$16b2o39b3o8bo$30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b 2o21bo$17b2ob2o26bo20bobo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$24b2o10bo $24b2o9b2o21b2o$58b2o$16b2o$2b2o11b2obo15bo$bobo12bob4o13bo$bo15bo2b3o 10b3o39b2o$2o16bo3bo52bo$18b4o51bobo$20bo8b3o34b2o5b2o$31bo21b3o7bo2b 3o$17b2o11bo21b2ob2o2b4o2bo2bo$17b2o15b2o15bo4b2ob4ob2o2bo$34b2o16b6o 6b2obo$53b2o2bo8bo$6b2o49b2obo$5bobo50bobo$5bo52bo$4b2o42b2o$10b2o37bo $11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$7bo2$19b2o $19b2o4$2b2o13b2o$3bo11bo2bo$3bobo9bo2bo$4b2o8b2ob2o$13b2ob2o$12b2o3b 2o$13b3o2bo$18bo$15bobo15b2o$16bo16bobo$35bo$35b2o$29b2o$29bo$30b3o$ 32bo$18b2o$18bo$14bo4b3o$14b3o4bo$17bo$16b2o50bo$10b2o54b3o$11bo53bo$ 11bobo51b2o$12b2o57b2o$48b2o21bo$48bo20bobo$23b2o8bo12bobo20b2o$23b2o 8b3o10b2o$36bo$35b2o21b2o$58b2o$6b2o16bo$7bo15b3o$7bobo8bo3bo$8b2o7b3o bob2o8bo41b2o$16bo3b2obo8bobo19bo20bo$18b4o2bo7bo2bo17bobo3bobo4bo6bob o$12b5o2bo4bo5bo4bo16bo3b3obobo2bobo5b2o$12bo2b3o4bo2bo3bo5bo15b2o2bo 4bobobo3b2o$12b2o9b2o5bo3bo15b2ob3o5bo3b2o$31b2o16bo4bo$50b4o6b2o4bo2b o$51b2o6bo6bobo$33b2o24b3o4b2o$33bo24b2o$34b3o21bo$36bo11b2o$14bo7b2o 25bo$14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b 3o5bo$11bobo43bo7b2o$12b2o57b2o$48b2o21bo$18b2o28bo20bobo$18b2o13bo12b obo20b2o$33b3o10b2o$20bo15bo26b2o$14b3o3b2ob2o10b2o26b2o$14b2o5bobobo 32bo$6b2o8bo4bob2o31b2obo$7bo12b3o37bo5b2o$7bobo6b2o2bobo33b2o2bo5b2o$ 8b2o6b6o37bob2o12b2o$16b3o4b2o32bobob2o3b2o7bo$23b2o34bo2bo3b2o5bobo$ 57bob2o12b2o$59bob2o$60b2o4$33b2o$33bo$34b3o$36bo11b2o$14bo7b2o25bo$ 14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b3o5bo $11bobo43bo7b2o$12b2o57b2o$48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o 10b2o$36bo$35b2o2$6b2o$7bo10b3o8b2o$7bobo7bo2bo4bo3b2o$8b2o6bo3bo3bobo 48b2o$16bo7bobo25bo22bo$19bo32b2o19bobo$16b2obo37bo4bo10b2o$57b2o3b2o$ 58b2o3b2o$19bob2o34bo4b2o$19b3o39b2o$20bo$33b2o$33bo$34b3o$36bo11b2o$ 22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$16bo43bo$16b2o39b3o8bo$ 30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b2o21bo$17b2ob2o26bo20bo bo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$16b2o6b2o10bo$14bo3bo5b2o9b2o21b 2o$13bo4b2o38b2o$13bo5bo$2b2o$bobo10bo4bo$bo12b2obob2obo34b3o15b2o$2o 30bo2b3o19b4o14bo$31bo3bobo14b2o3b2ob2o3b2o6bobo$32bob3o14bo7bo5b3o5b 2o$49bo2bo5b3o3bob3o$49bo2bo5b2obo2b2obo$34b2o12bo3bo8b2ob2obo$34b2o 13b3o7bobo3bobo$60bo4bo2bo$6b2o57b3o$5bobo50b2o6bo$5bo52b2o$4b2o42b2o$ 10b2o37bo$11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$ 7bo2$19b2o$19b2o4$2b2o$3bo$3bobo$4b2o4b4o$9b2o2bo5b2o$8b2o2bo4bobob2o$ 9bo2bo2b2o5bo$10b2o6bo3bo$15bo5bo11b2o$16b4o13bobo$18bo16bo$35b2o$29b 2o$29bo$30b3o$32bo$18b2o$18bo$19b3o$21bo!]], 116, 1059) -- really 14 p184 guns -- logic core latches: all = all + pattern([[ 24bo2bo$14b3o7bo$13bo4bo9bo$12bo5bo8b2o$3bo9bo8bo$b3o10b2o8b2o$o$b3o 10b2o8b2o$3bo9bo8bo3bo$12bo5bo4bo2bo$13bo4bo4bo2bo$14b3o7b2o! ]], 33, 1332) -- P46Osc really all = all + pattern([[ 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o2$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$4bo 2bobo2bo$6bo3bo$4b2o5b2o$3b3o5b3o$3b3o5b3o5$10b3o$10b3o$9b5o$8b2o3b2o$ 8b2o3b2o4$8b2o3b2o$4b2o2b2o3b2o$4b2o3b5o$10b3o$10b3o!]], 35, 1348) -- P46OscAlt1 really all = all + pattern([[ b2o$b2o2$13bobo2b2o$2o10bo3bob3o$2o11bo6b2o$14b5obo$17b3o2$17b3o$14b5o bo$2o11bo6b2o3b2o$2o10bo3bob3o4b2o$13bobo2b2o2$b2o$b2o! ]], 24, 1661) -- P46OscAlt1 really all = all + pattern([[ b2o$b2o12$b3o3b3o$b3o3b3o$ob2o3b2obo$ob2o3b2obo$b2o5b2o$2bo5bo3$3b2ob 2o$4bobo$4bobo$4bobo$3b2ob2o$4bobo$4bobo$5bo!]], 49, 1679) -- P46Osc really all = all + pattern([[ b2o$o2bo$o7bo$o2bo3bobo$2ob2ob2ob2o$4bobo$3b2ob2o5$b3o3b3o$o9bo$o3bobo 3bo$b3o3b3o$2bo5bo10$3b2ob2o$4bobo$4bobo$5bo!]], 140, 1546) -- P46Osc really all = all + pattern([[ 2b3o$2b3o4b2o$bo3bo3b2o$o5bo$b2ob2o2$b2ob2o$o5bo$bo3bo$2b3o$2b3o7$b2o 7b2o$bob2o3b2obo$bo3bobo3bo$b2o2bobo2b2o$2b3o3b3o$3bo5bo6$2b2o5b2o$2b 2o5b2o!]], 184, 1538) -- P46OscAlt3 really all = all + pattern("2o$o$b3o$3bo!", 159, 1537) -- eater really -- slide 26: read B/S table -------------------- -- most of the B/S logic latches -- missing some reflectors off to the left (?) -- TODO: take this apart and integrate with missing pieces all = all + pattern([[ 34bo$33bobo$33bobo$32b2ob2o11$30bo7bo22b2o5b2o$29bobo5bobo21b2o5b2o$ 32bo3bo$29bo2bo3bo2bo$30bobo3bobo$32b2ob2o$29b2ob2ob2ob2o$29b2o2bobo2b 2o$30b3o3b3o$31bo5bo23b3o3b3o$60bo2bo3bo2bo$60b2obo3bob2o2$37b2o$37b2o 6$62bo$60b2ob2o$60b2ob2o15b2o5b2o$80b2o5b2o$59bobobobo2$60b2ob2o$61b3o 4b2o$62bo5b2o4$81bo5bo$80b3o3b3o$80bob2ob2obo$82b2ob2o$82b2ob2o$82b2ob 2o6$80b3o$80b3o2$79b2ob2o$79bo3bo$80b3o$81bo5b2o$87b2o199$51bo$50bobo$ 50bobo$49b2ob2o13$47bo7bo$46b4o3b4o$46bo3bobo3bo$47bo2bobo2bo$47b3o3b 3o7$47b2o$47b2o9$62b3ob3o9b2o$61bob2ob2obo7b2ob2o6b2o$60b2o7b2o7bo2bo 6b2o$61bob2ob2obo8bo2bo$62b3ob3o10b2o2$79b2o$78bo2bo$61b2o15bo2bo6b2o$ 61b2o14b2ob2o6b2o$78b2o5$80b2o5b2o$80b2o5b2o11$81bo5bo$80bobo3bobo$79b o3bobo3bo$79bo3bobo3bo$79bo9bo2$80b2o5b2o4$82bo3bo$80b2o$79bo3bobo3b2o $79bo3bobo$80b3o$87bo2bo$87b2o12$8b2o$8b2o13$b2o5b2o$o2bo3bo2bo$bo2bob o2bo$4bobo$2b3ob3o$3o5b3o$2o7b2o$2o7b2o$bob2ob2obo$bob2ob2obo2$3b2ob2o $4bobo$4bobo$5bo26$9bo$8bobo$8bobo$7b2ob2o11$5b2o5b2o$4bo2bo3bo2bo$7b 2ob2o$6bobobobo$6bobobobo$4bo9bo$3bo11bo2$7b2ob2o$5bo2bobo2bo$5b3o3b3o 3$5b2o$5b2o38$10bo$9bobo28bo$9bobo21b2o4bobo$8b2ob2o20bo5bobo$31bobo4b 2ob2o$18b2o11b2o$19bo18b2ob2o$19bobo$20b2o16b2ob2o3$23b2o$22bobo11bo7b o$24bo$6b2o5b2o19b3o7b3o$5bo2bo3bo2bo19b2ob2ob2ob2o$6bo2bobo2bo15b2o4b 3o3b3o$9bobo18bobo4bo5bo$7b3ob3o16bo$5b3o5b3o$5b2o7b2o$5b2o7b2o$6bob2o b2obo$6b3o3b3o$7bo5bo$9b3o3b3o$8bo2bo3bo2bo$12bobo$8b2o7b2o$8b2o7b2o$ 11bo3bo$11b2ob2o$9b3o3b3o$9b2o5b2o16bo5bo$9bo7bo15bobo3bobo$32bo3bobo 3bo$32bo3bobo3bo$32bo9bo2$33b2o5b2o3$35b2ob2o$36bobo$35b2ob2o$11b2ob2o 20bobo$12bobo20b2ob2o$12bobo21bobo$13bo22bobo$37bo3$52b2o$51b5o$35b2o 14bo4bo5b2o$35b2o14b3o2bo5b2o$52bo2b2o$53b2o$37bo3bo$35b2obobob2o9b2o$ 34bob2o3b2obo7bo2b2o$33bo2bo5bo2bo5b3o2bo5b2o$34bob2o3b2obo6bo4bo5b2o$ 35b2obobob2o7b5o$37bo3bo10b2o8$19b2o$18bo2bo$18bobo2bo$19bo$20b2obo$ 22bo3$21b2o$21b2o4b3o$27b3o$26bo3bo$26b2ob2o$26bo3bo$27bobo$27bobo$28b o5$23b2ob2o$22bo5bo2$21bo7bo$21bo2bobo2bo$21b3o3b3o9$21b2o5b2o$21b2o5b 2o23$9bo2bo$12bo7b3o$8bo9bo4bo$8b2o8bo5bo35bo$14bo8bo36b2o$11b2o8b2o 24b2o9bob3o$47b2o13b2o$11b2o8b2o38b2o$14bo8bo37bo$8b2o8bo5bo10b2o$8bo 9bo4bo11b2o24bo$12bo7b3o38b2o$9bo2bo34b2o13b2o10b2o$47b2o9bob3o11b2o$ 60b2o$60bo!]], 108, 1317) -- slide 27: boat logic -------------------- all = all + pattern([[ 32b4o$31b2o2bo$30b2o2bo$26bo4bo2bo25b2o$24b3o5b2o25b2ob2o$23bo36bo2bo$ 24b3o5b2o26bo2bo4bo$26bo4bo2bo26b2o5b3o$30b2o2bo36bo$31b2o2bo25b2o5b3o $32b4o7bo16bo2bo4bo$41b2o17bo2bo$42b2o15b2ob2o$60b2o3$b2o$b2o2$14b4o$ 2o12bo2b2o$2o13bo2b2o$15bo2bo$16b2o2$16b2o15b2ob2o$15bo2bo12bobo3bo$2o 13bo2b2o5b2o3bobo3bo$2o12bo2b2o6b2o3bo4bo$14b4o11b2o5b3o$38bo$b2o$b2o! ]], 209, 1852) -- P46Osc plus P46Gun plus custom eater really -- boat-logic: need to add outlying pieces to west, break up into 12 all = all + pattern([[ 119bo$35b2o81b2ob2o$34b5o11b2o54b2o10b2o2bo3b2o217b2o$34bo4bo11bo53bo 2bo11bob2o3bo217bo7b3o5b4o$34b3o2bo10bo49bo4bo2b2o9bo2bo3bo219bo6bo7b 2obo$21bo13bo2b2o11b3o43bo3bo3bo2bo11b2o5b3o213b3o7b2obo7bo10bo$19b3o 14b2o15bo41b7o5bo12bo8bo213bo11b2o5b2o11b3o$18bo75bo283bo$19b3o14b2o 57b7o5bo247b2o5b2o11b3o$21bo13bo2b2o57bo3bo3bo2bo246b2o7bo10bo$34b3o2b o60bo4bo2b2o251b2obo$34bo4bo65bo2bo252b4o$34b5o4b2obo59b2o11b2obo227bo $35b2o6b2ob3o70b2ob3o223b6o$49bo75bo221bo4bo$43b2ob3o70b2ob3o223b3ob2o $41bo2bobo70bo2bobo227bobo2bo$41b2o74b2o235b2o11$53bo37b2o$48bo3bo28b 2o7bobo187bo3bo$47bo7bo25b2o6b2obo186bo5bo$47bo2b2o5bo32b2o14bo107bobo 2b2o58bo$36bo11b2o5b2obo32bo14b3o90b2o12bo3bob3o4b2o43bo7b2o3bo8bo$34b 3o12b3o3b2ob3o48bo89b2o13bo6b2o3b2o41b3o9b3o9b3o$33bo27bo29bo14b3o106b 5obo46bo27bo$34b3o12b3o3b2ob3o29b2o14bo111b3o48b3o9b3o9b3o$36bo11b2o5b 2obo30b2obo17bo88bobo3bobo63bo7b2o3bo8bo$47bo2b2o5bo32bobo17b3o88bo3bo 12b3o58bo$47bo7bo35b2o20bo83bo11bo5b5obo57bo5bo$48bo3bo59b2o82bo3bo5bo 3bo3bo6b2o3b2o52bo3bo$53bo143bo11bo3bo3bob3o4b2o$201bo3bo8bobo2b2o$ 199bobo3bobo12$2b2o5b2o$2b2o5b2o$59bo229bob2o$58b2o228bo2b2o2b3o$57b2o 229bo6b2o$51bo6b2o2b2o9bo101b2o109b4o3b3o12bo$49b3o21b3o99bo108b3o3bo 3bo13b3o$48bo27bo99b3o70bo33bo27bo$49b3o21b3o102bo70b3o32b3o3bo3bo13b 3o$51bo6b2o2b2o9bo178bo33b4o3b3o12bo$57b2o192b2o35bo6b2o$58b2o228bo2b 2o2b3o$59bo229bob2o$2b3o3b3o$2b3o3b3o$bob2o3b2obo$bob2o3b2obo$2b2o5b2o $3bo5bo4$4b2ob2o$3bo5bo$b5ob2ob2o$2ob3ob2ob2o$3o6bo$bobo$2b2o263b4o5b 6o$212b6o5b4o40bob2o7b4o$212b4o7b2obo40bo7bob2o$76b2o46b2o89b2obo7bo 41b2o5b2o$75bo2bo44bo2bo90b2o5b2o$76b2o46b2o142b2o5b2o$217b2o5b2o41bo 7bob2o$215b2obo7bo26b2o12bob2o7b4o$212b4o7b2obo12b2o12b2o12b4o5b6o$ 212b6o5b4o12b2o!]], 679, 1875) -- P46Osc1-4 boat logic -- mystery stuff along bottom edge that needs a home in a slide: all = all + pattern([[ b2o5b2o$b2o5b2o14$3o5b3o$3o5b3o$b2o5b2o$3bo3bo$bo2bobo2bo$o3bobo3bo$bo 2bobo2bo$b3o3b3o5$8b2o$8b2o!]], 514, 1887) -- P46OscAlt3 really all = all + pattern([[ 4bo7b2o$3b2o6bo2bo$2bo8bo2b2o$3b2obo4bo2bo10bo$4b3o6bo11b3o$28bo$4b3o 6bo11b3o$bob2obo4bo2bo10bo$o10bo2b2o$o3bo6bo2bo$b4o7b2o! ]], 791, 1929) -- P46Osc really all = all + pattern([[ 8bo$9bo3bo$2o2b2o8bo$2o2bo5b2o2bo$4bobo5b2o11bo$5b2o3b3o12b3o$28bo$5b 2o3b3o12b3o$4bobo5b2o11bo$4bo5b2o2bo$4b2o8bo$9bo3bo$8bo! ]], 845, 1905) -- P46Osc really all = all + pattern([[ 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o10b3ob3o$8bo2bo8bo b2ob2obo$2o6bo2bo7b2o7b2o$2o6b2ob2o7bob2ob2obo$10b2o9b3ob3o! ]], 1050, 1903) -- P46OscAlt2 really all = all + pattern([[ 9b2o$9b2o11$2b3o3b3o$bo3bobo3bo$o3b2ob2o3bo$ob2o5b2obo$2bo7bo11$2b2o5b 2o$2b2o5b2o!]], 1088, 1920) -- P46OscAlt2 really all = all + pattern([[ 11bo$10b4o9bo$2b2o4b2o3bo9bo2b2o$2bo5b2o12bo5bo$3bo4b3o12bobo2b2o$3o 20bo3b2o3bo$o24b3o4b3o$35bo$25b3o4b3o$23bo3b2o3bo$23bobo2b2o$22bo5bo$ 7bob2o12bo2b2o$5b3ob2o12bo$4bo$5b3ob2o$7bobo2bo$11b2o! ]], 1106, 1875) -- P46OscAlt4 (boat-bit catcher?) really [not defined yet] all = all + pattern([[ 25bobo$26bo$17b2o13b2o$16b2ob2o12bo$17bo2bo11bo$3bo13bo2bo4b2o6b3o$b3o 14b2o15bo$o$b3o14b2o$3bo13bo2bo$17bo2bo$16b2ob2o$17b2o6b2obo$25b2ob3o$ 31bo$25b2ob3o$23bo2bobo$23b2o!]], 1227, 1875) -- P46OscAlt4 really all = all + pattern("2o$obo$2bo$2b2o!", 1281, 1873) -- eater all = all + pattern([[ 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o4$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$3b4o 3b4o$4bo7bo7$5bo$4b3o$3bo3bo$3b2ob2o$3b2ob2o2$3b2ob2o$3b2ob2o$3bo3bo3b 2o$4b3o4b2o$5bo!]], 1375, 1980) -- P46OscAlt1 really -- slide 28: clean up and start over -------------------- LWSSToGlider = pattern([[ 4b2o5b2o$2obobo5bobob2o$2ob2o7b2ob2o$2b6ob6o$4bob2ob2obo2$2bo11bo$3bo 9bo$5bobobobo$5bobobobo$6b2ob2o$3bo2bo3bo2bo$4b2o5b2o13$4b2o$4b2o!]], 443, 1980) -- slide 29: toggle dist [not sure what that means, actually] -------------------- BoatLatchNE = pattern([[ 78b2o5b2o$78b2o5b2o15$77b2o7b2o$77bob2o3b2obo$77bo3bobo3bo$46b2o5b2o 22b2o2bobo2b2o$46b2o5b2o23b3o3b3o$79bo5bo4$47bo5bo$46b3o3b3o$45bo2b2ob 2o2bo22b2o$45bo3bobo3bo22b2o$47bobobobo2$44b2ob2o3b2ob2o$46bo7bo5$47bo $46b3o$45bo3bo$44bo5bo$44bo5bo$45bo3bo2$45bo3bo$44bo5bo$44bo5bo2b2o$ 45bo3bo3b2o$46b3o$47bo7$45b2o$45bo$46b3o$48bo20$13b2o$15bo$2o10b2o2bo 10b2o$2o11bo2bo10b2o$14bobo$14b2o2$14b2o$14bobo$2o11bo2bo$2o10b2o2bo$ 15bo$13b2o12$47b4o$46b2o2bo14b2o$45b2o2bo15b2o$46bo2bo$47b2o2$47b2o$ 46bo2bo$38b2o5b2o2bo15b2o$38b2o6b2o2bo14b2o$47b4o!]], 120, 232) -- four P46osc really local BoatLatchSW = pattern([[ 76bo$75bo2bo$74b5o10b2o$73b2ob3o10b2o$74bob2o$75b2o72b2o5b2o$145b2o3bo 5bo3b2o$75b2o68bo15bo$74bob2o68bo13bo$62b2o9b2ob3o10b2o$62b2o10b5o10b 2o$75bo2bo$76bo2$149b2o5b2o$149b2obobob2o$73b2o74bo2bobo2bo$73b2o74b3o 3b3o2$82b2o$72b2o7bo2b2o11b2o$57b2o5b2o6b2o6b6o11b2o$53b2o2b2o5b2o2b2o 12b4o77b2o89bo$53b2o13b2o93b2o84bo3bo$173bo60b2o12bo8b2o2b2o$173b2o59b 2o12bo2b2o5bo2b2o$6bo75b4o76b2o7bob3o11b2o60b2o5bobo$5bobo64b2o6b6o76b 2o11b2o10b2o61b3o3b2o$5bobo64b2o7bo2b2o88b2o$4b2ob2o73b2o90bo75b3o3b2o $156b2o64b2o25b2o5bobo$57b3o3b3o7b2o81b2o16bo48bo24bo2b2o5bo2b2o$56bo 3bobo3bo6b2o99b2o47bobo22bo8b2o2b2o$55bo3b2ob2o3bo94b2o11b2o47b2o23bo 3bo$55bob2o5b2obo94b2o7bob3o78bo$57bo7bo107b2o$173bo$163b2o$163b2o3$ 57b3o$b3o5b3o45bobo$2ob2o3b2ob2o43bo3bo$2obobobobob2o43bo3bo$bo3bobo3b o$bo2bo3bo2bo45b3o4b2o$2b3o3b3o53b2o6$2b2o$2b2o37$27b2o90b2o$27b2o81b 2o7b2o79b2o$110b2o88b2o$47b3o53b3o25bobo2b2o$26b2o6b3o8b2obob2o50bo3bo 11b2o10bo3bob3o$26b2o6bo3bo5bo5b2o50b2ob2o11b2o11bo6b2o54bo5bo$34bo4bo 5b2obob2o80b5obo54b3o3b3o$35bo3bo7b3o52b2ob2o28b3o55bob2ob2obo$104bo 87b2o7b2o$35bo3bo95b3o54b2o7b2o$34bo4bo92b5obo53b3o5b3o$26b2o6bo3bo12b 2o65b2o11bo6b2o3b2o49b3ob3o$26b2o6b3o14b2o50bo7bo6b2o10bo3bob3o4b2o51b obo$102bo2bo3bo2bo18bobo2b2o55bo2bobo2bo$106bobo83bo2bo3bo2bo$27b2o77b obo10b2o72b2o5b2o$27b2o77bobo10b2o$102bo2bo3bo2bo$103b3o3b3o7$99b2o13b 2o73b2o13b2o$99b2o2b2o5b2o2b2o73b2o2b2o5b2o2b2o$103b2o5b2o81b2o5b2o! ]], 1534, 1849) -- really eleven P45OscAlt1 plus an eater all = all + BoatLatchNE + BoatLatchSW + pattern([[ 273b2o$272bo2bo$140b2o130bobobo10b2o2bobo$140b2o131bo2bo3b2o4b3obo3bo 12b2o$277bo2b2o3b2o6bo13b2o$274bobo9bob5o$287b3o2$287b3o$286bob5o$285b 2o6bo13b2o$286b3obo3bo12b2o$287b2o2bobo3$175b2o$140b3o3b3o22bobo2bo$ 140bo2bobo2bo20b3ob2o79b2o$140b2obobob2o19bo84bo2bo$140b2o5b2o20b4o80b o7bo$171bob2o13bo64bo2bo3bobo$188b2o63b2ob2ob2ob2o$189b2o66bobo$184b2o 2b2o6bo42b2o15b2ob2o$142b2ob2o28bobo18b3o40b2o$140bo2bobo2bo26bobo21bo 3bo$140bobo3bobo15bo10b2o19b3o4b3o5b2o11b4o$140b3o3b3o15b3o9bo7b2o2b2o 6bo9bo4bo3b2o6b2o2bo12b2o$140b2o5b2o18bo5b2obobo10b2o14bo3bobo3b2o5b2o 2bo13b2o12b3o3b3o$140b2o5b2o17bo11bo9b2o14bo3bobo12bo2bo26bo9bo$140b2o 5b2o17b2o6bo2bo10bo15b2ob2o15b2o27bo3bobo3bo$176b2o76b3o3b3o$224b2o29b o5bo$223bo2bo$222b2o2bo13b2o$223b2o2bo12b2o$224b4o2$11b2o226b2o$10bobo 226b2o$10bo30b2o$9b2o30b2o226b2o5b2o$33b2o4bo13bo3b3o55b2o63b2o74b2ob 2o4b2obobo5bobob2o$33bo3b3o12bobo2b5o53bo7b3o5b4o35b2o6b2ob2o15b2o57bo bo5b2ob2o7b2ob2o$34bo3bobo11bo3b2o58bo6bo7b2obo35b2o6bo2bo17b2o34b2o5b 2o13bobo7b6ob6o$31b3o5b2o12bo2bo3b2obo49b3o7b2obo7bo10bo32bo2bo16bo7b 4o21b2o2b2o5b2o2b2o10bo10bob2ob2obo$31bo22b3o3b2ob3o47bo11b2o5b2o11b3o 31b2o25bo2b2o20b2o13b2o$66bo81bo58bo2b2o55bo11bo$54b3o3b2ob3o59b2o5b2o 11b3o31b2o26bo2bo4bo52bo9bo$53bo2bo3b2obo61b2o7bo10bo32bo2bo26b2o5b3o 52bobobobo$52bo3b2o73b2obo35b2o6bo2bo36bo51bobobobo$52bobo2b5o69b4o35b 2o6b2ob2o25b2o5b3o53b2ob2o$38bob2o11bo3b3o60bo59b2o25bo2bo4bo52bo2bo3b o2bo$36b3ob2o76b6o83bo2b2o23bo7bo25b2o5b2o$35bo81bo4bo83bo2b2o$36b3ob 2o76b3ob2o82b4o23b3o7b3o$38bobo2bo76bobo2bo108b2ob2ob2ob2o$42b2o80b2o 109b3o3b3o$236bo5bo2$114bo$10b2o9b3ob3o82b2o2bo$8b2ob2o7bob2ob2obo80bo 5bo$8bo2bo7b2o7b2o78b2o2bobo$3bo4bo2bo8bob2ob2obo80b2o3bo12bo$b3o5b2o 10b3ob3o82b3o14b3o$o129bo138b2o$b3o5b2o99b3o14b3o107b2ob2o27b2o$3bo4bo 2bo97b2o3bo12bo110bobo$8bo2bo15b2o73b2o4b2o2bobo123bobo$8b2ob2o14b2o 73b2o5bo5bo123bo$10b2o98b2o2bo$114bo13$170b2o2b2o4bo2b2o12b2o$170b2ob 2o6b2obo12b2o$174bobo6bo$175b2o4b3o2$175b2o4b3o$174bobo6bo$170b2ob2o6b 2obo$170b2o2b2o4bo2b2o!]], 178, 1939) -- really P46Guns and Oscs, etc. all = all + pattern([[ 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o8$5bo5bo$4b3o3b3o$3b2ob2ob2ob2o$2b3o7b 3o2$4bo7bo5$5bo$4b3o$3bo2bo$3bobobo$4b3o$5bo5b2o$11b2o! ]], 557, 1931) -- P46OscAlt1 really -- this particular one reflects a B signal from the above sync-buffer circuitry; -- the resulting LWSS is converted to a glider which is stored as a boat-bit. -- a few more outlying LWSS reflectors: all = all + pattern([[ 12b3o$10bo4bo11b2o$10bo5bo10b2o$3bobobo7bo$b7o5b2o$o$b7o5b2o$3bobobo7b o$10bo5bo$10bo4bo$12b3o!]], 257,1840) + pattern([[ 15b2o$13b2o2bo$13b6o$13b4o4bo3bo$21b7o$28bo$21b7o$13b4o4bo3bo$2o11b6o$ 2o11b2o2bo$15b2o!]], 885, 2033) -- both P46Osc really -- slide 30: HWSS control -------------------- local HWSSGun = pattern([[ 21b2o23b2o$22bo22bobo$22bobo$23b2o$36b4o8bo$36bob2o7b2o$36bo$37b2o2$ 37b2o$36bo$7b2o2bobo22bob2o7b2o$2o4b3obo3bo21b4o8bo$2o3b2o6bo$6bob5o$ 7b3o35bobo$46b2o$7b3o$6bob5o14b2o$2o3b2o6bo8bo5bo$2o4b3obo3bo7bo4bo4b 2o$7b2o2bobo12b3o3b2o$23bob2ob2o$25bo$22bo2b3o11b2o$2b2o18b2o2b2o9bo4b o$2b2o20bo2bo15bo$24b3o10bo5bo$16b2o20b6o$b2o13bobo$b2o13bob2o$17b2o$ 17bo13b2o$30bobo$17bo13bo67b2o$17b2o80b2o$b2o13bob2o29b2o2bo4b2o16b2o 3b2o8bo$b2o13bobo30bob2o6b2o14bo2bobo2bo7bo2b2o$16b2o20bo11bo6bobo14bo 9bo5bo5bo3b2o$36b3o11b3o4b2o14b2o9b2o5bobo2b2o2b2o$2b2o31bo38bo9bo6bo 3b2o$2b2o32b3o11b3o4b2o16bo2bobo2bo9b3o$38bo11bo6bobo16b2o3b2o$24bo24b ob2o6b2o32b3o$23b3o23b2o2bo4b2o31bo3b2o$23bob2o35bo12b2o14bobo2b2o2b2o $24b3o11b2o22b2o11b2o13bo5bo3b2o$24b3o11bobo20bobo27bo2b2o$20b3ob3o13b o50bo$24b3o11b3o5bo52b2o$24b2o20b3o50b2o$2b2o45bo$2b2o19bo22b3o$11bo 10bo15b3o5bo$7b2o2bo10bo17bo$b2o3bo5bo25bobo$b2o2b2o2bobo12bo13b2o$6b 2o3bo38b2o$7b3o41b2o$50bo$7b3o$6b2o3bo$b2o2b2o2bobo$b2o3bo5bo48b2o$7b 2o2bo13b2o34b2o$11bo13bobo$2b2o23bo16b3o3bo$2b2o23b2o13b5o2bobo10b2o$ 41b2o3b2o3bo10b2o$42b2o3bo2bo$43bo3b3o2$43bo3b3o$42b2o3bo2bo$41b2o3b2o 3bo10b2o$42b5o2bobo10b2o$42bob3o3bo$40b2o$34b2o4b3o18b2o$34b2o3bo3bo 17b2o$38bo5bo$39b2ob2o2$39b2ob2o$38bo5bo$39bo3bo$40b3o$40b3o7$33b2o7b 2o$33bob2o3b2obo$33bo3bobo3bo$33b2o2bobo2b2o$34b3o3b3o$35bo5bo6$34b2o 5b2o$34b2o5b2o3$40bo2bo$30b3o7bo$16b2o11bo4bo9bo$16b2o10bo5bo8b2o$29bo 8bo$30b2o8b2o2$30b2o8b2o$29bo8bo3bo$16b2o10bo5bo4bo2bo$16b2o11bo4bo4bo 2bo$30b3o7b2o4$79b2o$78bo2bo$73bo7bo$72bobo3bo2bo$22bo48b2ob2ob2ob2o$ 20b3o52bobo$19bo54b2ob2o$19b2o$33bo$31b3o$14b2o14bo$15bo14b2o40b3o3b3o $15b2obo17b2o33bo9bo$18bo17bo34bo3bobo3bo$19b2o13bobo35b3o3b3o$15b3o2b 2o12b2o37bo5bo$17b2o$15bo2bo4bo$14bobobo3bo$13bo4bo$5b2o6bo2bob3o5bo$ 4bobo7bo3b3ob2o3bo$4bo10b2o5bo4bo$3b2o10b2o3b2o2bobo$15bo4bo$20b3o51b 2ob2o$16b2o57bobo$75bobo$12b2o2b3o57bo$13bobobo$14b4o$9b2o4bo$8bobo$8b o$7b2o7bobo$17b2o$17bo3$7b2o$8bo$8bobo$9b2o2$13bob2o$13bob2o2$22bo$12b 2o4bob2obo$12b2o2bo5bo$3b2o11bo5bo$4bo7b2o6b2o4b2o$4bobo5b2o4bobo5b2o$ 5b2o11b2o5$34b2o$34bobo$36bo$36b2o$30b2o$30bo$31b3o$33bo$19b2o$19bo$ 20b3o$22bo$34b2o7b2o$32b2o2bo6b2o$32b6o4bo2bo$22bo9b4o5bob2o$20b3o18bo b2o$19bo$20b3o18bob2o$22bo9b4o5bob2o14b2o$32b6o4b3ob2o11bo$32b2o2bo6bo bobo12b3o$34b2o7b4o15bo$44b2o!]]) -- TODO: take this apart further local LWSSFromTheBlue = pattern([[ 27b2o5b2o$23b2o2b2o5b2o2b2o$23b2o13b2o2$28bo5bo$27b3o3b3o$26bo2b2ob2o 2bo$26bo3bobo3bo$28bobobobo2$25b2ob2o3b2ob2o$27bo7bo8$10b2o$8b2ob2o$8b o2bo$3bo4bo2bo$b3o5b2o15bo$o21b5o$b3o5b2o10bo2b3o7b2o$3bo4bo2bo10b2o 10b2o$8bo2bo$8b2ob2o$10b2o$25bo$25bo!]]) -- P46Osc really local RowOfLWSSFTB = pattern("o$3o$3bo$2b2o!", 1737, 24) for i=0,42 do RowOfLWSSFTB =RowOfLWSSFTB + LWSSFromTheBlue[(i*12) % 46].t(40*i, 0) end local HWSSHalfControl = HWSSGun.t(106, 87) + RowOfLWSSFTB.t(188, 79) local CellCenter = HWSSHalfControl + HWSSHalfControl.t(2047, 2047, gp.swap_xy_flip) OFFcell = all + CellCenter + StateBit -- The metafier-OFF and -ON files technically should not exist (we just checked -- at the beginning of the script). Shouldn't do any harm to check again, though: if not fOFF then OFFcell.save(OFFcellFileName) end -- slide 31: display on -------------------- g.show("Building ON metacell definition...") -- switch on the HWSS guns: CellCenter = CellCenter + pattern("2o$2o!", 171, 124) + pattern("2o$2o!", 1922, 1875) -- now generate the ONcell HWSSs and LWSSs -- add rest of pattern after the center area is filled in -- and p184 HWSS guns are in the same phase (3680 = 184 * 40) ONcell = all + CellCenter[3680] if not fON then ONcell.save(ONcellFileName) end -- g.store(ONcell,ONcellFileName) -- doesn't work; would need to be ONcell.array end OFFcell = OFFcell + RuleBits ONcell = ONcell + RuleBits for j=0,selheight-1 do for i=0,selwidth-1 do g.show("Placing ("..(i+1)..","..(j+1)..") tile".. " in a "..selwidth.." by "..selheight.." rectangle.") if livecell[i..","..j]~=nil then ONcell.put(2048 * i - 5, 2048 * j - 5) else OFFcell.put(2048 * i - 5, 2048 * j - 5) end g.fit() g.update() end end g.show("") g.setalgo("HashLife") -- no point running a metapattern without hashing g.setoption("hyperspeed", 0) -- avoid going too fast g.setbase(8) g.setstep(4) g.step() -- save start and populate hash tables -- g.run(35328) -- run one full cycle (can lock up Golly if construction has failed) -- -- Note that the first cycle is abnormal, since it does not advance the metapattern by -- one metageneration: the first set of communication signals to adjacent cells is -- generated during this first cycle. Thus at the end of 35328 ticks, the pattern -- is ready to start its first "normal" metageneration (where cell states may change). -- -- It should be possible to define a version of ONcell that is not fully populated -- with LWSSs and HWSSs until the end of the first full cycle. This would be much -- quicker to generate from a script definition, and so it wouldn't be necessary to -- save it to a file. The only disadvantage is that ONcells would be visually -- indistinguishable from OFFcells until after the initial construction phase. golly-3.3-src/Scripts/Lua/bricklayer.lua0000755000175000017500000000177012706123635015232 00000000000000-- Based on bricklayer.py from PLife (http://plife.sourceforge.net/). local g = golly() local gp = require "gplus" local pattern = gp.pattern g.new("bricklayer") -- best to create empty universe before setting rule -- to avoid converting an existing pattern (slow if large) g.setrule("B3/S23") local p22_half = pattern("2o$bo$bobo$2b2o3bo$6bob2o$5bo4bo$6bo3bo$7b3o!") local p22 = p22_half + p22_half.t(26, 9, gp.flip) local gun22 = p22 + p22[1].t(-18, 11) local gun154 = gun22[27] + gun22[5].t(49, 12, gp.rcw) + gun22.t(5, 53, gp.flip_y) local p7_reflector = pattern([[ 2b2o5b2o$2b2o5bo$7bobo$7b2o$3b2o$3bobo$4bo3$13bo$10bo2b3o3b2o$3b5o 2b3o3bo2bo$b3obob3o4b2obobo$o4bo4b4obobo2b2o$2ob2ob4o3bobob2obo$ 4bobobobobo2bo2bobo$4bobobo2bo2bob3ob2o$3b2obob4o6bobo$7bo4b6o2b o$9bo2bo2bo4b2o$8b2o!]]) local pre_lom = pattern("2bo$2ob2o$2ob2o2$b2ob2o$b2ob2o$3bo!") local all = gun154[210].t(-52, -38) + gun154[254].t(52, -38, gp.flip_x) + p7_reflector.t(8, 23) + pre_lom.t(-3, 30) all.display("") -- don't change name golly-3.3-src/Scripts/Lua/lifeviewer.lua0000755000175000017500000016533013307733370015250 00000000000000-- LifeViewer for Golly (work in progress) -- Author: Chris Rowett (crowett@gmail.com), September 2016. -- -- LifeViewer is a scriptable pattern viewer featuring: -- - Rotation and smooth non-integer zoom. -- - Color themes with cell history and longevity. -- - Automatic hex grid display. -- - Pseudo 3D layers and stars. -- -- This is the Lua version of the Javascript/HTML5 LifeViewer -- used on the conwaylife.com forums and the LifeWiki. -- -- Press H after running lifeviewer.lua to display the list of -- supported keyboard shortcuts and script commands. -- -- To see some example LifeViewer script commands in action, open -- Patterns/Life/Rakes/c2-Cordership-rake.rle, then run lifeviewer.lua. -- build number local buildnumber = 30 local g = golly() local ov = g.overlay local gp = require "gplus" local op = require "oplus" local a = require "gplus.strict" local viewwd, viewht = g.getview(g.getlayer()) -- update flags local update = { docells = false, docamera = false, dorefresh = false, dostatus = false } -- textalert local textalert = { appear = 0, hold = 0, disappear = 0, color = "32 255 255 255", fontsize = 30, message = "", starttime = 0 } -- timing local timing = { updatecells = 0, drawcells = 0, drawmenu = 0, texttime = 0, show = false, extended = false, genstarttime = 0, framestarttime = 0, frameendtime = 0 } -- whether generating life local generating = false local autostart = false local loopgen = -1 local stopgen = -1 local currentgen = 0 -- view constants local viewconstants = { minzoom = 0.0625, -- 1/16 maxzoom = 32, minangle = 0, maxangle = 360, viewwidth = 2048, viewheight = 2048, mindepth = 0, maxdepth = 1, minlayers = 1, maxlayers = 10, zoomborder = 0.9, -- proportion of view to fill with fit zoom glidesteps = 40, -- steps to glide camera minstop = 1, minloop = 1, mintheme = 0, maxtheme = #op.themes, minpan = -4096, maxpan = 4096, mingps = 1, maxgps = 60, minstep = 1, maxstep = 50, decaysteps = 64, -- number of steps to decay after life finished mingridmajor = 0, maxgridmajor = 16, minviewerwidth = 480, maxviewerwidth = 4096, minviewerheight = 480, maxviewerheight = 4096 } viewconstants.mininvzoom = -1 / viewconstants.minzoom -- playback speed local defgps = 60 local defstep = 1 local gps = defgps local step = defstep -- smooth camera movement local startx local starty local startangle local startzoom local endx local endy local endangle local endzoom local camsteps = -1 -- camera defaults local defcamx = viewconstants.viewwidth / 2 local defcamy = viewconstants.viewheight / 2 local defcamangle = 0 local defcamlayers = 1 local defcamlayerdepth = 0.05 local deflinearzoom = 0.4 -- camera local camx = defcamx local camy = defcamy local camangle = defcamangle local camlayers = defcamlayers local camlayerdepth = defcamlayerdepth local autofit = false local historyfit = false local decay = 0 -- tracking local tracking = { east = 0, south = 0, west = 0, north = 0, period = 0, defined = false } local initialrect -- initial bounding box for pattern at gen 0 local initialzoom = 1 -- initial fit zoom value at gen 0 local histleftx -- used for autofit history mode local histrightx local histbottomy local histtopy -- origin local originx = 0 local originy = 0 local originz = 1 -- zoom is held as a value 0..1 for smooth linear zooms local linearzoom -- theme local themeon = true local theme = 1 -- mouse drag local lastmousex = 0 local lastmousey = 0 local mousedrag = false local clickx = 0 local clicky = 0 -- whether hex display is on local hexon = false -- grid local grid = false local gridmajoron = true local gridmajor = 10 -- stars local stars = false -- reset local hardreset = false -- menu button images local buttons = { ["play"] = "button0", ["pause"] = "button1", ["reset"] = "button2", ["menu"] = "button3", ["stepback"] = "button4", ["stepforward"] = "button5", ["autofit"] = "button6", ["fit"] = "button7", ["squaregrid"] = "button8", ["help"] = "button9", ["shrink"] = "button10", ["fps"] = "button11", ["hexgrid"] = "button12" } -- script tokens local tokens = {} local curtok = 1 local arguments local rawarguments -- the script text before conversion local commands = { scriptstartword = "[[", scriptendword = "]]", angleword = "ANGLE", autofitword = "AUTOFIT", autostartword = "AUTOSTART", depthword = "DEPTH", extendedtimingword = "EXTENDEDTIMING", gpsword = "GPS", gridword = "GRID", gridmajorword = "GRIDMAJOR", hardresetword = "HARDRESET", heightword = "HEIGHT", hexdisplayword = "HEXDISPLAY", historyfitword = "HISTORYFIT", layersword = "LAYERS", loopword = "LOOP", pauseword = "PAUSE", showtimingword = "SHOWTIMING", squaredisplayword = "SQUAREDISPLAY", starsword = "STARS", stepword = "STEP", stopword = "STOP", tword = "T", themeword = "THEME", trackword = "TRACK", trackboxword = "TRACKBOX", trackloopword = "TRACKLOOP", widthword = "WIDTH", xword = "X", yword = "Y", zoomword = "ZOOM", zword = "Z" } -- keyword decoding -- each argument has a type followed by constraint values -- "r" - float range -- "R" - int range -- "l" - float lower bound -- "L" - int lower bound local keywords = { [commands.angleword] = { "r", viewconstants.minangle, viewconstants.maxangle, "" }, [commands.autofitword] = { "" }, [commands.autostartword] = { "" }, [commands.depthword] = { "r", viewconstants.mindepth, viewconstants.maxdepth, "" }, [commands.extendedtimingword] = { "" }, [commands.gpsword] = { "r", viewconstants.mingps, viewconstants.maxgps, "" }, [commands.gridword] = { "" }, [commands.gridmajorword] = { "R", viewconstants.mingridmajor, viewconstants.maxgridmajor, "" }, [commands.hardresetword] = { "" }, [commands.heightword] = { "R", viewconstants.minviewerheight, viewconstants.maxviewerheight, "" }, [commands.hexdisplayword] = { "" }, [commands.historyfitword] = { "" }, [commands.layersword] = { "R", viewconstants.minlayers, viewconstants.maxlayers, "" }, [commands.loopword] = { "L", viewconstants.minloop, "" }, [commands.pauseword] = { "l", 0.0, "" }, [commands.showtimingword] = { "" }, [commands.squaredisplayword] = { "" }, [commands.starsword] = { "" }, [commands.stepword] = { "r", viewconstants.minstep, viewconstants.maxstep, "" }, [commands.stopword] = { "L", viewconstants.minstop, "" }, [commands.tword] = { "L", 0, "" }, [commands.themeword] = { "R", viewconstants.mintheme, viewconstants.maxtheme, "" }, [commands.trackword] = { "r", -1, 1, "r", -1, 1, "" }, [commands.trackboxword] = { "r", -1, 1, "r", -1, 1, "r", -1, 1, "r", -1, 1, "" }, [commands.trackloopword] = { "L", 1, "r", -1, 1, "r", -1, 1, "" }, [commands.widthword] = { "R", viewconstants.minviewerwidth, viewconstants.maxviewerwidth, "" }, [commands.xword] = { "r", viewconstants.minpan, viewconstants.maxpan, "" }, [commands.yword] = { "r", viewconstants.minpan, viewconstants.maxpan, "" }, [commands.zoomword] = { "r", viewconstants.mininvzoom, viewconstants.maxzoom, "" }, [commands.zword] = { "r", viewconstants.mininvzoom, viewconstants.maxzoom, "" } } -- pre-rendered text clips local clips = { timinglongfg = "tlongfg", timinglongshadow = "tlongshadow", shortht = 0, longht = 0 } -------------------------------------------------------------------------------- local function maketext(s, name) name = name or "temp" -- convert string to text in current font local w, h, descent = gp.split(ov("text "..name.." "..s)) return tonumber(w), tonumber(h), tonumber(descent) end -------------------------------------------------------------------------------- local function pastetext(x, y, name) name = name or "temp" ov("paste "..x.." "..y.." "..name) end -------------------------------------------------------------------------------- local function makeclips() local oldalign = ov("textoption align left") local oldtextbg = ov("textoption background 0 0 0 0") local label = "fps" local longlabel = "updatecells\ndrawcells\nmenu" ov(op.black) local w, h = maketext(longlabel, clips.timinglongshadow) clips.longht = h ov(op.white) w, h = maketext(label) clips.shortht = h maketext(longlabel, clips.timinglongfg) -- restore settings ov("textoption background "..oldtextbg) ov("textoption align "..oldalign) end -------------------------------------------------------------------------------- local function outputtiming(xoff, yoff, labelclip) -- draw labels ov("paste "..(viewwd - 140 + xoff).." "..(20 + yoff + clips.shortht).." "..labelclip) -- draw values local output = string.format("%.1fms", timing.updatecells) output = output.."\n"..string.format("%.1fms", timing.drawcells) output = output.."\n"..string.format("%.1fms", timing.drawmenu) ov("textoption align right") local w = maketext(output) pastetext(viewwd - w - 20 + xoff, 20 + yoff + clips.shortht) end -------------------------------------------------------------------------------- local function drawmenu() local y = 10 local i = 0 ov("blend 1") while i < 13 do -- TBD ov("paste "..(i * 50).." "..y.. "button"..i) i = i + 1 end ov("blend 0") end -------------------------------------------------------------------------------- local function drawtiming() local start = g.millisecs() local oldblend = ov("blend 1") local oldalign = ov("textoption align left") local oldtextbg = ov("textoption background 0 0 0 0") -- draw translucent rectangle local height = clips.shortht if timing.extended then height = height + clips.longht end ov("rgba 0 0 0 128") ov("fill "..(viewwd - 140).." 20 122 "..height) -- compute load local frametime = timing.frameendtime - timing.framestarttime local loadamount = frametime / 16 if loadamount > 1 then loadamount = 1 end if frametime < 16.666 then frametime = 16.666 end -- draw load background if (loadamount < 0.5) then -- fade from green to yellow ov("rgba "..math.floor(255 * loadamount * 2).." 255 0 144") else -- fade from yellow to red ov("rgba 255 "..math.floor(255 * (1 - (loadamount - 0.5) * 2)).." 0 144") end ov("fill "..(viewwd - 140).." 20 "..math.floor(122 * loadamount).." "..clips.shortht) -- draw fps and load ov(op.black) maketext(math.floor(1000 / frametime).."fps") pastetext(viewwd - 138, 22) local w = maketext(math.floor(100 * loadamount).."%") pastetext(viewwd - 18 - w, 22) ov(op.white) maketext(math.floor(1000 / frametime).."fps") pastetext(viewwd - 140, 20) maketext(math.floor(100 * loadamount).."%") pastetext(viewwd - w - 20, 20) -- draw extended timing if enabled local shadowclip, fgclip if timing.extended then shadowclip = clips.timinglongshadow fgclip = clips.timinglongfg ov(op.black) outputtiming(2, 2, shadowclip) ov(op.white) outputtiming(0, 0, fgclip) end -- restore settings ov("textoption background "..oldtextbg) ov("textoption align "..oldalign) ov("blend "..oldblend) timing.texttime = g.millisecs() - start end -------------------------------------------------------------------------------- local function alert(message, appear, hold, disappear) textalert.message = message textalert.appear = appear textalert.hold = hold textalert.disappear = disappear end -------------------------------------------------------------------------------- local function updatealert() if textalert.message ~= "" then end end -------------------------------------------------------------------------------- local function realtolinear(zoom) return math.log(zoom / viewconstants.minzoom) / math.log(viewconstants.maxzoom / viewconstants.minzoom) end -------------------------------------------------------------------------------- local function lineartoreal(zoom) return viewconstants.minzoom * math.pow(viewconstants.maxzoom / viewconstants.minzoom, zoom) end -------------------------------------------------------------------------------- local function updatestatus() -- convert zoom to actual value local zoom = lineartoreal(linearzoom) * originz if zoom < 0.99999 then zoom = -(1 / zoom) end -- convert x and y to display coordinates local x = camx - viewconstants.viewwidth / 2 + originx local y = camy - viewconstants.viewheight / 2 + originy if hexon then x = x + camy / 2 end -- convert theme to status local themestatus = "off" if themeon then themestatus = theme end -- convert autofit to status local autofitstatus = "off" if autofit then autofitstatus = "on" end -- convert hex mode to status local hexstatus = "square" if hexon then hexstatus = "hex" end -- convert grid to status local gridstatus = "off" if grid then gridstatus = "on" end -- convert angle to status local displayangle = camangle if hexon then displayangle = 0 end -- update status bar local status = "Hit escape to close." status = status.." Zoom "..string.format("%.1f", zoom).."x Angle "..displayangle status = status.." X "..string.format("%.1f", x).." Y "..string.format("%.1f", y) status = status.." Layers "..camlayers.." Depth "..string.format("%.2f",camlayerdepth) status = status.." GPS "..gps.." Step "..step.." Theme "..themestatus status = status.." Autofit "..autofitstatus.." Mode "..hexstatus.." Grid "..gridstatus if stopgen ~= -1 then status = status.." Stop "..stopgen end if loopgen ~= -1 then status = status.." Loop "..loopgen end g.show(status) end -------------------------------------------------------------------------------- local function refresh() local start = g.millisecs() local newx, newy, newz -- add the fractional part to the current generation if tracking.defined then local fractionalgen = (g.millisecs() - timing.genstarttime) / 1000 * gps if fractionalgen < 0 then fractionalgen = 0 else if fractionalgen > 1 then fractionalgen = 1 end end local gen = currentgen + fractionalgen -- compute the new origin originx = gen * (tracking.east + tracking.west) / 2 originy = gen * (tracking.south + tracking.north) / 2 -- compute the trackbox local leftx = initialrect[1] local bottomy = initialrect[2] local width = initialrect[3] local height = initialrect[4] local rightx = leftx + width local topy = bottomy + height leftx = leftx + gen * tracking.west rightx = rightx + gen * tracking.east bottomy = bottomy + gen * tracking.north topy = topy + gen * tracking.south width = rightx - leftx + 1 height = topy - bottomy + 1 -- check for hex if hexon then leftx = leftx - bottomy / 2 rightx = rightx - topy / 2 width = rightx - leftx + 1 end -- get the smallest zoom needed local zoom = viewwd / width if zoom > viewht / height then zoom = viewht / height end -- leave a border around the pattern zoom = zoom * viewconstants.zoomborder -- apply the origin to the camera originz = zoom / initialzoom newx = camx + originx newy = camy + originy newz = lineartoreal(linearzoom) * originz if newz > viewconstants.maxzoom then newz = viewconstants.maxzoom else if newz < viewconstants.minzoom then newz = viewconstants.minzoom end end -- set the new camera settings ov("camera xy "..newx.." "..newy) ov("camera zoom "..newz) -- update status because camera changed update.dostatus = true else originx = 0 originy = 0 originz = 1 end -- draw the cells ov("drawcells") timing.drawcells = g.millisecs() - start -- draw the menu local t1 = g.millisecs() drawmenu() timing.drawmenu = g.millisecs() - t1 -- end of frame time timing.frameendtime = g.millisecs() -- draw timing if on if timing.show then drawtiming() end -- update the overlay ov("update") end -------------------------------------------------------------------------------- local function setgridlines() if grid then ov("celloption grid 1") else ov("celloption grid 0") end if gridmajoron then ov("celloption gridmajor "..gridmajor) else ov("celloption gridmajor 0") end end -------------------------------------------------------------------------------- local function setstars() if stars then ov("celloption stars 1") else ov("celloption stars 0") end end -------------------------------------------------------------------------------- local function sethex() if hexon then ov("celloption hex 1") else ov("celloption hex 0") end ov("camera xy "..camx.." "..camy) end -------------------------------------------------------------------------------- local function checkhex() hexon = op.hexrule() sethex() end -------------------------------------------------------------------------------- local function showhelp() -- open help window g.open(g.getdir("app").."Help/lifeviewer.html") end -------------------------------------------------------------------------------- local function getmouseposition() local x = viewwd / 2 local y = viewht / 2 local mousepos = ov("xy") if mousepos ~= "" then x, y = gp.split(mousepos) x = tonumber(x) y = tonumber(y) end return x, y end -------------------------------------------------------------------------------- local function createoverlay() -- create overlay over entire viewport ov("create "..viewwd.." "..viewht) end -------------------------------------------------------------------------------- local function updatecells() local start = g.millisecs() ov("updatecells") timing.updatecells = g.millisecs() - start end -------------------------------------------------------------------------------- local function updatecamera() -- convert linear zoom to real zoom local camzoom = lineartoreal(linearzoom) ov("camera zoom "..camzoom) ov("camera angle "..camangle) ov("camera xy "..camx.." "..camy) ov("celloption layers "..camlayers) ov("celloption depth "..camlayerdepth) -- update status update.dostatus = true end -------------------------------------------------------------------------------- local function resetcamera() -- restore default camera settings camx = defcamx camy = defcamy camangle = defcamangle camlayers = defcamlayers camlayerdepth = defcamlayerdepth linearzoom = deflinearzoom update.docamera = true end -------------------------------------------------------------------------------- local function setdefaultcamera() defcamx = camx defcamy = camy defcamangle = camangle deflinearzoom = linearzoom defcamlayers = camlayers defcamlayerdepth = camlayerdepth end -------------------------------------------------------------------------------- local function togglehex() hexon = not hexon sethex() if hexon then camx = camx - camy / 2 defcamx = defcamx - camy / 2 else camx = camx + camy / 2 defcamx = defcamx + camy / 2 end update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function togglegrid() grid = not grid setgridlines() update.dostatus = true update.dorefresh = true end -------------------------------------------------------------------------------- local function togglegridmajor() gridmajoron = not gridmajoron setgridlines() update.dostatus = true update.dorefresh = true end -------------------------------------------------------------------------------- local function togglestars() stars = not stars setstars() update.dorefresh = true end -------------------------------------------------------------------------------- local function bezierx(t, x0, x1, x2, x3) local cX = 3 * (x1 - x0) local bX = 3 * (x2 - x1) - cX local aX = x3 - x0 - cX - bX -- compute x position local x = (aX * math.pow(t, 3)) + (bX * math.pow(t, 2)) + (cX * t) + x0 return x end -------------------------------------------------------------------------------- local function glidecamera() local linearcomplete = camsteps / viewconstants.glidesteps local beziercomplete = bezierx(linearcomplete, 0, 0, 1, 1) camx = startx + beziercomplete * (endx - startx) camy = starty + beziercomplete * (endy - starty) local camzoom = startzoom + beziercomplete * (endzoom - startzoom) linearzoom = realtolinear(camzoom) camsteps = camsteps + 1 if camsteps > viewconstants.glidesteps then camsteps = -1 camx = endx camy = endy linearzoom = realtolinear(endzoom) end update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function createcellview() ov("cellview "..math.floor(-viewconstants.viewwidth / 2).." "..math.floor(-viewconstants.viewheight / 2).. " "..viewconstants.viewwidth.." "..viewconstants.viewheight) end -------------------------------------------------------------------------------- local function fitzoom(immediate) local rect = g.getrect() if #rect > 0 then local leftx = rect[1] local bottomy = rect[2] local width = rect[3] local height = rect[4] local rightx = leftx + width local topy = bottomy + height -- check for historyfit if historyfit then -- update history bounding box if histleftx > leftx then histleftx = leftx end if histrightx < rightx then histrightx = rightx end if histbottomy > bottomy then histbottomy = bottomy end if histtopy < topy then histtopy = topy end leftx = histleftx rightx = histrightx bottomy = histbottomy topy = histtopy width = rightx - leftx + 1 height = topy - bottomy + 1 end -- check for hex if hexon then leftx = leftx - bottomy / 2 rightx = rightx - topy / 2 width = rightx - leftx + 1 end -- get the smallest zoom needed local zoom = viewwd / width if zoom > viewht / height then zoom = viewht / height end -- leave a border around the pattern zoom = zoom * viewconstants.zoomborder -- apply origin if tracking.defined then zoom = zoom / originz end -- ensure zoom in range if zoom < viewconstants.minzoom then zoom = viewconstants.minzoom else if zoom > viewconstants.maxzoom then zoom = viewconstants.maxzoom end end -- get new pan position local newx = viewconstants.viewwidth / 2 + leftx + width / 2 + originy local newy = viewconstants.viewheight / 2 + bottomy + height / 2 + originx if hexon then newx = newx - newy / 2 end -- check whether to fit immediately if immediate then camx = newx camy = newy linearzoom = realtolinear(zoom) update.docamera = true else -- setup start point startx = camx starty = camy startangle = camangle startzoom = lineartoreal(linearzoom) -- setup destination point endx = newx endy = newy endangle = camangle endzoom = zoom -- trigger start camsteps = 0 end end end -------------------------------------------------------------------------------- local function advance(singlestep) -- check if all cells are dead if g.empty() then generating = false if decay > 0 then update.docells = true update.dorefresh = true decay = decay - 1 end return end -- check for single step local remaining = step if singlestep then remaining = 1 end -- check if enough time has elapsed to advance local deltatime = (g.millisecs() - timing.genstarttime) / 1000 if deltatime > 1 / gps then while remaining > 0 do g.run(1) updatecells() if g.empty() then refresh() g.note("Life ended at generation "..tonumber(g.getgen())) remaining = 0 decay = viewconstants.decaysteps else remaining = remaining - 1 end end timing.genstarttime = g.millisecs() end currentgen = tonumber(g.getgen()) if autofit then fitzoom(true) end update.dorefresh = true end -------------------------------------------------------------------------------- local function rotate(amount) camangle = camangle + amount if camangle >= viewconstants.maxangle then camangle = camangle - viewconstants.maxangle else if camangle < viewconstants.minangle then camangle = camangle + viewconstants.maxangle end end update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function adjustzoom(amount, x, y) local newx = 0 local newy = 0 local newzoom -- get the current zoom as actual zoom local currentzoom = lineartoreal(linearzoom) -- compute new zoom and ensure it is in range linearzoom = linearzoom + amount if linearzoom < 0 then linearzoom = 0 else if linearzoom > 1 then linearzoom = 1 end end local sinangle = math.sin(-camangle / 180 * math.pi) local cosangle = math.cos(-camangle / 180 * math.pi) local dx = 0 local dy = 0 -- convert new zoom to actual zoom newzoom = lineartoreal(linearzoom) -- compute as an offset from the centre x = x - viewwd / 2 y = y - viewht / 2 -- compute position based on new zoom newx = x * (newzoom / currentzoom) newy = y * (newzoom / currentzoom) dx = (x - newx) / newzoom dy = -(y - newy) / newzoom -- apply pan camx = camx - dx * cosangle + dy * -sinangle camy = camy - dx * sinangle + dy * cosangle end -------------------------------------------------------------------------------- local function zoominto(event) local _, x, y = gp.split(event) adjustzoom(0.05, x, y) update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function zoomoutfrom(event) local _, x, y = gp.split(event) adjustzoom(-0.05, x, y) update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function zoomout() local x, y = getmouseposition() adjustzoom(-0.01, x, y) update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function zoomin() local x, y = getmouseposition() adjustzoom(0.01, x, y) update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function resetangle() camangle = 0 update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function setzoom(zoom) startx = camx starty = camy startzoom = lineartoreal(linearzoom) startangle = camangle endx = camx endy = camy endzoom = zoom endangle = camangle camsteps = 0 if tracking.defined then startzoom = startzoom / originz endzoom = endzoom / originz end end -------------------------------------------------------------------------------- local function integerzoom() local camzoom = lineartoreal(linearzoom) if camzoom >= 1 then camzoom = math.floor(camzoom + 0.5) else camzoom = 1 / math.floor(1 / camzoom + 0.5) end setzoom(camzoom) end -------------------------------------------------------------------------------- local function halvezoom() local camzoom = lineartoreal(linearzoom) camzoom = camzoom / 2 if camzoom < viewconstants.minzoom then camzoom = viewconstants.minzoom end setzoom(camzoom) end -------------------------------------------------------------------------------- local function doublezoom() local camzoom = lineartoreal(linearzoom) camzoom = camzoom * 2 if camzoom > viewconstants.maxzoom then camzoom = viewconstants.maxzoom end setzoom(camzoom) end -------------------------------------------------------------------------------- local function settheme() local index = -1 if themeon then index = theme end ov(op.themes[index]) update.docells = true update.dostatus = true end -------------------------------------------------------------------------------- local function cycletheme() if themeon then theme = theme + 1 if theme > viewconstants.maxtheme then theme = viewconstants.mintheme end else themeon = true end settheme() update.dorefresh = true end -------------------------------------------------------------------------------- local function toggletheme() themeon = not themeon settheme() update.dorefresh = true end -------------------------------------------------------------------------------- local function decreaselayerdepth() if camlayerdepth > viewconstants.mindepth then camlayerdepth = camlayerdepth - 0.01 if camlayerdepth < viewconstants.mindepth then camlayerdepth = viewconstants.mindepth end update.docamera = true update.dorefresh = true end end -------------------------------------------------------------------------------- local function increaselayerdepth() if camlayerdepth < viewconstants.maxdepth then camlayerdepth = camlayerdepth + 0.01 if camlayerdepth > viewconstants.maxdepth then camlayerdepth = viewconstants.maxdepth end update.docamera = true update.dorefresh = true end end -------------------------------------------------------------------------------- local function decreaselayers() if camlayers > viewconstants.minlayers then camlayers = camlayers - 1 update.docamera = true update.dorefresh = true end end -------------------------------------------------------------------------------- local function increaselayers() if camlayers < viewconstants.maxlayers then camlayers = camlayers + 1 update.docamera = true update.dorefresh = true end end -------------------------------------------------------------------------------- local function panview(dx, dy) local camzoom = lineartoreal(linearzoom) dx = dx / camzoom dy = dy / camzoom local angle = camangle if hexon then angle = 0 end local sinangle = math.sin(-angle / 180 * math.pi) local cosangle = math.cos(-angle / 180 * math.pi) camx = camx + (dx * cosangle + dy * -sinangle) camy = camy + (dx * sinangle + dy * cosangle) update.docamera = true update.dorefresh = true end -------------------------------------------------------------------------------- local function doclick(event) local _, x, y, button, mode = gp.split(event) -- start of drag lastmousex = tonumber(x) lastmousey = tonumber(y) mousedrag = true end -------------------------------------------------------------------------------- local function stopdrag() mousedrag = false end -------------------------------------------------------------------------------- local function checkdrag() local x, y -- check if a drag is in progress if mousedrag then -- get the mouse position local mousepos = ov("xy") if #mousepos > 0 then x, y = gp.split(mousepos) panview(lastmousex - tonumber(x), lastmousey - tonumber(y)) lastmousex = x lastmousey = y end end end -------------------------------------------------------------------------------- local function resethistory() histleftx = initialrect[1] histbottomy = initialrect[2] histrightx = histleftx + initialrect[3] - 1 histtopy = histbottomy + initialrect[4] - 1 end -------------------------------------------------------------------------------- local function reset(looping) -- reset the camera if at generation 0 local gen = tonumber(g.getgen()) if gen == 0 or looping or hardreset then resetcamera() if looping then generating = true else generating = autostart end else generating = false end -- reset historyfit resethistory() -- reset origin originx = 0 originy = 0 originz = 1 -- reset golly g.reset() g.update() currentgen = 0 -- if using theme then need to recreate the cell view to clear history if theme ~= -1 then createcellview() setstars() settheme() updatecamera() sethex() setgridlines() end -- update cell view from reset universe update.docells = true update.dorefresh = true end -------------------------------------------------------------------------------- local function toggleautofit() autofit = not autofit update.dostatus = true end -------------------------------------------------------------------------------- local function togglehistoryfit() historyfit = not historyfit update.dostatus = true end -------------------------------------------------------------------------------- local function readtokens() local comments = g.getinfo() local inscript = false -- build token list for token in comments:gsub("\n", " "):gmatch("([^ ]*)") do if token ~= "" then if token == commands.scriptendword then inscript = false end if inscript then table.insert(tokens, token) end if token == commands.scriptstartword then inscript = true end end end end -------------------------------------------------------------------------------- local function numberorfraction(argument) local result = nil -- search for a fraction local index = argument:find("/") if index == nil then -- simple number result = tonumber(argument) else -- possible fraction local left = argument:sub(1, index - 1) local right = argument:sub(index + 1) if tonumber(left) ~= nil and tonumber(right) ~= nil then result = left / right end end return result end -------------------------------------------------------------------------------- local function validatekeyword(token) local invalid = "" local keyword = keywords[token] local validation local index = 1 local lower, upper local argvalue local argnum = 1 local whicharg local arglist = "" if keyword == nil then invalid = "unknown script command" else -- check what sort of validation is required for this keyword arguments = {} rawarguments = {} validation = keyword[index] while validation ~= "" do -- need an argument whicharg = arglist if curtok >= #tokens then invalid = whicharg.."{{}}\nArgument "..argnum.." is missing" else -- get the argument curtok = curtok + 1 argvalue = tokens[curtok] whicharg = whicharg.." {{"..argvalue.."}}\nArgument "..argnum -- check which sort of validation to perform if validation == "l" then -- float lower bound argvalue = numberorfraction(argvalue) if argvalue == nil then invalid = whicharg.." must be a number" else index = index + 1 lower = keyword[index] if argvalue < lower then invalid = whicharg.." must be at least "..lower end end elseif validation == "L" then -- integer lower bound argvalue = tonumber(argvalue) if argvalue == nil then invalid = whicharg.." must be an integer" else if argvalue ~= math.floor(argvalue) then invalid = whicharg.." must be an integer" else index = index + 1 lower = keyword[index] if argvalue < lower then invalid = whicharg.." must be at least "..lower end end end elseif validation == "r" then -- float range argvalue = numberorfraction(argvalue) if argvalue == nil then invalid = whicharg.." must be a number" else index = index + 1 lower = keyword[index] index = index + 1 upper = keyword[index] if argvalue < lower or argvalue > upper then invalid = whicharg.." must be between "..lower.." and "..upper end end elseif validation == "R" then -- integer range argvalue = tonumber(argvalue) if argvalue == nil then invalid = whicharg.." must be an integer" else if argvalue ~= math.floor(argvalue) then invalid = whicharg.." must be an integer" else index = index + 1 lower = keyword[index] index = index + 1 upper = keyword[index] if argvalue < lower or argvalue > upper then invalid = whicharg.." must be between "..lower.." and "..upper end end end end end -- check if validation failed if invalid ~= "" then -- exit loop validation = "" else -- save the argument arguments[argnum] = argvalue rawarguments[argnum] = tokens[curtok] argnum = argnum + 1 arglist = arglist..tokens[curtok].." " -- get next argument to validation index = index + 1 validation = keyword[index] end end end return invalid end -------------------------------------------------------------------------------- local function checkscript() local invalid = "" local token -- read tokens readtokens() -- process any script comments if #tokens > 0 then curtok = 1 while curtok <= #tokens do -- get the next token token = tokens[curtok] -- check if it is a valid keyword invalid = validatekeyword(token) -- process command if valid if invalid == "" then if token == commands.angleword then camangle = arguments[1] elseif token == commands.autofitword then autofit = true elseif token == commands.autostartword then autostart = true generating = true elseif token == commands.depthword then camlayerdepth = arguments[1] elseif token == commands.extendedtimingword then timing.extended = true elseif token == commands.gpsword then gps = arguments[1] elseif token == commands.gridword then grid = true elseif token == gridmajor then gridmajor = arguments[1] elseif token == commands.hardresetword then hardreset = true elseif token == commands.heightword then -- ignored elseif token == commands.hexdisplayword then hexon = true elseif token == commands.layersword then camlayers = arguments[1] elseif token == commands.historyfitword then historyfit = true elseif token == commands.loopword then loopgen = arguments[1] elseif token == commands.showtimingword then timing.show = true elseif token == commands.squaredisplayword then hexon = false elseif token == commands.starsword then stars = true elseif token == commands.stepword then step = arguments[1] elseif token == commands.stopword then stopgen = arguments[1] elseif token == commands.themeword then theme = arguments[1] elseif token == commands.trackword then tracking.east = arguments[1] tracking.south = arguments[2] tracking.west = tracking.east tracking.north = tracking.south tracking.defined = true elseif token == commands.trackboxword then tracking.east = arguments[1] tracking.south = arguments[2] tracking.west = arguments[3] tracking.north = arguments[4] if tracking.west > tracking.east then invalid = "[["..rawarguments[1].."]] "..rawarguments[2].." [[" invalid = invalid..rawarguments[3].."]] "..rawarguments[4] invalid = invalid.."\nW is greater than E" else if tracking.north > tracking.south then invalid = rawarguments[1].." [["..rawarguments[2].."]] " invalid = invalid..rawarguments[3].." [["..rawarguments[4].."]]" invalid = invalid.."\nN is greater than S" else tracking.defined = true end end elseif token == commands.trackloopword then tracking.period = arguments[1] tracking.east = arguments[2] tracking.south = arguments[3] tracking.west = tracking.east tracking.north = tracking.south tracking.defined = true elseif token == commands.widthword then -- ignored elseif token == commands.xword then camx = arguments[1] elseif token == commands.yword then camy = arguments[1] elseif token == commands.zoomword or token == commands.zword then if arguments[1] < 0 then arguments[1] = -1 / arguments[1] end linearzoom = realtolinear(arguments[1]) end end -- abort script processing on error if invalid ~= "" then curtok = #tokens end curtok = curtok + 1 end -- check for trackloop if tracking.defined and tracking.period > 0 then if gridmajor > 0 then loopgen = tracking.period * gridmajor else loopgen = tracking.period end end setstars() sethex() if hexon then camx = camx - camy / 2 end setgridlines() update.docamera = true update.dorefresh = true if invalid ~= "" then g.note(token.." "..invalid) end end end -------------------------------------------------------------------------------- local function decreasespeed() if step > viewconstants.minstep then step = step - 1 else if gps > viewconstants.mingps then gps = gps - 1 end end update.dostatus = true end -------------------------------------------------------------------------------- local function increasespeed() if gps < viewconstants.maxgps then gps = gps + 1 else if step < viewconstants.maxstep then step = step + 1 end end update.dostatus = true end -------------------------------------------------------------------------------- local function setmaxspeed() if gps < viewconstants.maxgps then gps = viewconstants.maxgps else if step < viewconstants.maxstep then step = viewconstants.maxstep end end update.dostatus = true end -------------------------------------------------------------------------------- local function setminspeed() if step > viewconstants.minstep then step = viewconstants.minstep else if gps > viewconstants.mingps then gps = viewconstants.mingps end end update.dostatus = true end -------------------------------------------------------------------------------- local function increasestep() if step < viewconstants.maxstep then step = step + 1 update.dostatus = true end end -------------------------------------------------------------------------------- local function decreasestep() if step > viewconstants.minstep then step = step - 1 update.dostatus = true end end -------------------------------------------------------------------------------- local function setmaxstep() step = viewconstants.maxstep update.dostatus = true end -------------------------------------------------------------------------------- local function setminstep() step = viewconstants.minstep update.dostatus = true end -------------------------------------------------------------------------------- local function resetspeed() gps = defgps step = defstep update.dostatus = true end -------------------------------------------------------------------------------- local function togglehardreset() hardreset = not hardreset end -------------------------------------------------------------------------------- local function toggletiming() timing.show = not timing.show update.dorefresh = true end -------------------------------------------------------------------------------- local function toggleextendedtiming() timing.extended = not timing.extended update.dorefresh = true end -------------------------------------------------------------------------------- local function cbauto() toggleautofit() end -------------------------------------------------------------------------------- local function cbfit() if not autofit then fitzoom(false) end end -------------------------------------------------------------------------------- local function cbgrid() togglegrid() end -------------------------------------------------------------------------------- local function cbhelp() showhelp() end -------------------------------------------------------------------------------- local function cbreset() reset(false) end -------------------------------------------------------------------------------- local function cbplay() generating = not generating end -------------------------------------------------------------------------------- local function cbfps() toggletiming() end -------------------------------------------------------------------------------- local function createmenu() ov("blend 0") ov("create 1 1 menuclip") ov("target menuclip") -- load button images to get width and height local w, h = gp.split(ov("load 1 0 oplus/images/lifeviewer.png")) ov("resize "..w.." "..h.." menuclip") -- load buttons over the rectangle ov("load 0 0 oplus/images/lifeviewer.png") -- replace transparent background with semi-opaque ov("rgba 0 0 0 128") ov("replace *# *# *# 0") -- create clips from the images ov("rgba 32 255 255 255") local x = 0 while x < 13 do -- draw box around button ov("line "..(40 * x).." 0 "..(40 * x + 39).." 0") ov("line "..(40 * x).." 39 "..(40 * x + 39).." 39") ov("line "..(40 * x).." 0 "..(40 * x).." 39") ov("line "..(40 * x + 39).." 0 "..(40 * x + 39).." 39") -- create clip from button ov("copy "..(40 * x).." 0 40 40 button"..x) x = x + 1 end -- delete menuclip ov("target") ov("delete menuclip") end -------------------------------------------------------------------------------- local function setupoverlay() -- create overlay and cell view createoverlay() createcellview() -- create menu createmenu() -- make prerendered text clips makeclips() end -------------------------------------------------------------------------------- function main() -- check if there is a pattern if g.empty() then g.exit("There is no pattern.") end -- reset pattern if required currentgen = tonumber(g.getgen()) if currentgen ~= 0 then g.reset() end -- setup overlay setupoverlay() -- check for hex rules checkhex() -- reset the camera to default position fitzoom(true) -- get the initial bounding box and zoom initialrect = g.getrect() initialzoom = lineartoreal(linearzoom) -- reset history box resethistory() -- use Golly's colors if multi-state pattern if g.numstates() > 2 then themeon = false end -- check for script commands checkscript() -- save camera settings to use when reset setdefaultcamera() -- apply any script settings settheme() updatecamera() updatecells() refresh() updatestatus() -- start timing timing.genstarttime = g.millisecs() -- loop until quit while true do -- clear update flags update.dorefresh = false update.dostatus = false update.docamera = false update.docells = false -- check if size of layer has changed local newwd, newht = g.getview(g.getlayer()) if newwd ~= viewwd or newht ~= viewht then viewwd = newwd viewht = newht -- resize overlay ov("resize "..viewwd.." "..viewht) update.dorefresh = true end -- check for user input local event = op.process(g.getevent()) if event == "key return none" then generating = not generating if generating then timing.genstarttime = g.millisecs() end elseif event == "key space none" then advance(true) generating = false elseif event == "key tab none" then advance(false) generating = false elseif event == "key r none" then reset(false) elseif event == "key r shift" then togglehardreset() elseif event == "key - none" then decreasespeed() elseif event == "key = none" then increasespeed() elseif event == "key _ none" then setminspeed() elseif event == "key + none" then setmaxspeed() elseif event == "key d none" then decreasestep() elseif event == "key e none" then increasestep() elseif event == "key d shift" then setminstep() elseif event == "key e shift" then setmaxstep() elseif event == "key 0 none" then resetspeed() elseif event == "key f none" then if not autofit then fitzoom(false) end elseif event == "key f shift" then toggleautofit() elseif event == "key h shift" then togglehistoryfit() elseif event == "key [ none" then zoomout() elseif event == "key ] none" then zoomin() elseif event == "key { none" then halvezoom() elseif event == "key } none" then doublezoom() elseif event == "key , none" then rotate(-1) elseif event == "key < none" then rotate(-90) elseif event == "key . none" then rotate(1) elseif event == "key > none" then rotate(90) elseif event == "key 5 none" then resetangle() elseif event == "key 1 none" then setzoom(1) elseif event == "key ! none" then integerzoom() elseif event == "key 2 none" then setzoom(2) elseif event == "key \" none" then setzoom(1/2) elseif event == "key 4 none" then setzoom(4) elseif event == "key $ none" then setzoom(1/4) elseif event == "key 8 none" then setzoom(8) elseif event == "key * none" then setzoom(1/8) elseif event == "key 6 none" then setzoom(16) elseif event == "key ^ none" then setzoom(1/16) elseif event == "key 3 none" then setzoom(32) elseif event == "key c none" then cycletheme() elseif event == "key c shift" then toggletheme() elseif event == "key q none" then increaselayers() elseif event == "key a none" then decreaselayers() elseif event == "key p none" then increaselayerdepth() elseif event == "key l none" then decreaselayerdepth() elseif event == "key s none" then togglestars() elseif event == "key left none" then panview(-1, 0) elseif event == "key right none" then panview(1, 0) elseif event == "key up none" then panview(0, -1) elseif event == "key down none" then panview(0, 1) elseif event == "key left shift" then panview(-1, -1) elseif event == "key right shift" then panview(1, 1) elseif event == "key up shift" then panview(1, -1) elseif event == "key down shift" then panview(-1, 1) elseif event == "key h none" then showhelp() elseif event == "key / none" then togglehex() elseif event == "key x none" then togglegrid() elseif event == "key x shift" then togglegridmajor() elseif event == "key t none" then toggletiming() elseif event == "key t shift" then toggleextendedtiming() elseif event:find("^ozoomin") then zoominto(event) elseif event:find("^ozoomout") then zoomoutfrom(event) elseif event:find("^oclick") then doclick(event) elseif event:find("^mup") then stopdrag() else g.doevent(event) checkdrag() end -- start frame timer timing.framestarttime = g.millisecs() -- check if playing if generating then advance(false) -- check for stop or loop if stopgen == currentgen then generating = false g.note("STOP reached, Play to continue") end if loopgen == currentgen then reset(true) end else -- check if life ended but cells still decaying if decay > 0 then advance(false) end end -- check if camera still gliding to target if camsteps ~= -1 then glidecamera() end -- perform required updates if update.docamera then updatecamera() end if update.docells then updatecells() end if update.dorefresh then refresh() end if update.dostatus then updatestatus() end end end -------------------------------------------------------------------------------- local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed g.check(false) ov("delete") golly-3.3-src/Scripts/Lua/life-integer-gun30.lua0000644000175000017500000000326112706123635016401 00000000000000-- Based on text_test.py from PLife (http://plife.sourceforge.net/). -- -- Universal* font described by Eric Angelini on SeqFan list -- Construction universality* demonstrated by Dean Hickerson -- -- Integers can be written in this font that stabilize into -- (almost*) any Life pattern known to be glider-constructible. -- -- * Possible caveats involve a very small percentage -- (possibly zero percent!) of glider constructions -- in -- particular, constructions that require large numbers -- of very closely spaced gliders. The existence of objects -- whose constructions require non-integer-constructable -- closely-packed fleets of gliders is an open question; -- no such objects are currently known. local g = golly() local gpt = require "gplus.text" g.new("Eric Angelini integer glider gun") g.setrule("B3/S23") local all = gpt.maketext([[ 411-31041653546-11-31041653546-1144444444444444444444444444444 31041653546-11-31041653546-11444444444444444-31041653546-11 31041653546-11444444444444444444-31041653546-11-31041653546 111444444444444-15073-114444-5473-11444444444-2474640508-444444 2474640508-444444444444444444444-2474640508-444444-2474640508-4444 2474640508-444444-2474640508-4444444444444444444444-2474640508 444444-2474640508-414-7297575-114-9471155613-414444444444 31041653546-11-2534474376-1-9471155613-414444444444-31041653546-114 7297575-114-9471155613-414444444444-31041653546-114-7297575-118 9471155613-414444444444-31041653546-18-6703-1444-107579-1114444 2474640508-51-947742-414444444441-947742-414444444444-2474640508 51-947742-414444444441-947742-41444-2474640508-51-947742-414 2474640508-414444444444444-2474640508-51-947742-414444444441 947742-414]], "EAlvetica") all.display("") golly-3.3-src/Scripts/Lua/Margolus.lua0000755000175000017500000003431313543255652014700 00000000000000--[[ This script lets you explore rules using the Margolus neighborhood. Author: Andrew Trevorrow (andrew@trevorrow.com), May 2019. --]] local g = golly() local gp = require "gplus" local split = gp.split require "gplus.NewCA" SCRIPT_NAME = "Margolus" DEFAULT_RULE = "M0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15" -- BBM RULE_HELP = [[ This script lets you explore rules using the Margolus neighborhood. Rule strings are of the form Mn,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n where there must be 16 numbers with values from 0 to 15.

You can also enter rules using MCell's syntax (MS,Dn;n;n;n...). Or you can enter one of the following aliases (case must match):

Alias    Rule
bbm    M0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15
critters    M15,14,13,3,11,5,6,1,7,9,10,2,12,4,8,0
tron    M15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0

For more details about the Margolus neighborhood see this link:
http://www.mirekw.com/ca/rullex_marg.html ]] -- the following are non-local so a startup script can change them DEFWD, DEFHT = 500, 500 -- default grid size aliases = { bbm = "M0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15", critters = "M15,14,13,3,11,5,6,1,7,9,10,2,12,4,8,0", tron = "M15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0", } -------------------------------------------------------------------------------- NextPattern = function() end -- ParseRule sets this to SlowPattern or FastPattern local transition = {} -- transition table set by ParseRule and used in NextPattern local even_transition = {} -- transition table for even generations local odd_transition = {} -- transition table for odd generations local alternate_rules = false -- FastPattern uses even_transition and odd_transition? function ParseRule(newrule) -- Parse the given rule string. -- If valid then return nil, the canonical rule string, -- the width and height of the grid, and the number of states. -- If not valid then just return an appropriate error message. if #newrule == 0 then newrule = DEFAULT_RULE -- should be a valid rule! else -- check for a known alias local rule = aliases[newrule] if rule then newrule = rule elseif newrule:find(":") then -- try without the suffix local p, s = split(newrule,":") rule = aliases[p] if rule then newrule = rule..":"..s end end end local prefix, suffix = split(newrule:upper(),":") -- check for a valid prefix if prefix:sub(1,1) ~= "M" then return "Rule must start with M." end local blocknum = {} local i = 0 -- note that we append a comma to prefix to simplify the gmatch pattern for n in string.gmatch(prefix..",", "(%d+)[,;]") do if tonumber(n) > 15 then return "Bad number: "..n.." (must be from 0 to 15)." end blocknum[i] = tonumber(n) i = i + 1 if i > 16 then break end end if i ~= 16 then return "Rule must specify 16 comma-separated numbers from 0 to 15." end -- check for a valid suffix like T50 or T50,30 local wd, ht = DEFWD, DEFHT if suffix then if suffix:find(",") then wd, ht = suffix:match("^T(%d+),(%d+)$") else wd = suffix:match("^T(%d+)$") ht = wd end wd = tonumber(wd) ht = tonumber(ht) if wd == nil or ht == nil then return "Rule suffix must be Twd,ht or Twd." end end if wd < 8 then wd = 8 elseif wd > 1000 then wd = 1000 end if ht < 8 then ht = 8 elseif ht > 1000 then ht = 1000 end -- ensure wd and ht are multiples of 4 to simplify NextPattern logic wd = wd - (wd % 4) ht = ht - (ht % 4) -- given rule is valid -- create the transition table for use in NextPattern transition = {} for i = 0, 15 do transition[i] = blocknum[i] end -- create the canonical form of the given rule local canonrule = "M" for i = 0, 15 do canonrule = canonrule..blocknum[i] if i < 15 then canonrule = canonrule.."," end end canonrule = canonrule..":T"..wd..","..ht if transition[0] == 0 then NextPattern = FastPattern else NextPattern = SlowPattern end alternate_rules = false if transition[0] == 15 and transition[15] == 0 then -- for rules like Critters and Tron we can avoid strobing and use -- FastPattern with alternating transition tables, eg: -- i: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -- Critters: 15,14,13,3, 11,5, 6, 1, 7, 9, 10, 2, 12, 4, 8, 0 -- even gens: 0, 1, 2, 12,4, 10,9, 14,8, 6, 5, 13, 3, 11, 7, 15 -- odd gens: 0, 8, 4, 12,2, 10,9, 7, 1, 6, 5, 11, 3, 13, 14, 15 alternate_rules = true NextPattern = FastPattern even_transition = {} odd_transition = {} for i = 0, 15 do even_transition[i] = 15 - transition[i] -- inverse if i == transition[i] then odd_transition[i] = even_transition[i] elseif even_transition[i] == 0 then odd_transition[i] = 0 elseif even_transition[i] == 15 then odd_transition[i] = 15 elseif even_transition[i] == 1 then odd_transition[i] = 8 elseif even_transition[i] == 8 then odd_transition[i] = 1 elseif even_transition[i] == 2 then odd_transition[i] = 4 elseif even_transition[i] == 4 then odd_transition[i] = 2 elseif even_transition[i] == 3 then odd_transition[i] = 5 elseif even_transition[i] == 5 then odd_transition[i] = 3 elseif even_transition[i] == 6 then odd_transition[i] = 9 elseif even_transition[i] == 9 then odd_transition[i] = 6 elseif even_transition[i] == 7 then odd_transition[i] = 14 elseif even_transition[i] == 14 then odd_transition[i] = 7 elseif even_transition[i] == 10 then odd_transition[i] = 12 elseif even_transition[i] == 12 then odd_transition[i] = 10 elseif even_transition[i] == 11 then odd_transition[i] = 13 elseif even_transition[i] == 13 then odd_transition[i] = 11 end end end return nil, canonrule, wd, ht, 2 end -------------------------------------------------------------------------------- function FastPattern(currcells, minx, miny, maxx, maxy) -- Create the next pattern when transition[0] == 0 or when using -- alternating rules. local newcells = {} -- cell array for the new pattern (one-state) local newlen = 0 -- length of newcells local blocks = {} -- has all 2x2 blocks with at least 1 live cell local gridwd = maxx-minx+1 local get = g.getcell local oddgen = GetGenCount() & 1 == 1 if alternate_rules then if oddgen then transition = odd_transition else transition = even_transition end end for i = 1, #currcells, 2 do -- currcells is a one-state cell array local x = currcells[i] local y = currcells[i+1] -- find the top left cell in the 2x2 block to which this live cell belongs local n if oddgen then -- odd-numbered generation so top left cell in block must have odd coords local oddx = x & 1 == 1 local oddy = y & 1 == 1 if oddx and oddy then n = 1 elseif not oddx and oddy then n = 2 x = x-1 if x < minx then x = maxx end elseif oddx and not oddy then n = 4 y = y-1 if y < miny then y = maxy end else -- x,y both even n = 8 x = x-1 y = y-1 if x < minx then x = maxx end if y < miny then y = maxy end end else -- even-numbered generation so top left cell in block must have even coords -- (note that ParseRule ensures both grid dimensions are multiples of 4, -- so wrapping won't be needed and minx,miny are always even numbers) local evenx = x & 1 == 0 local eveny = y & 1 == 0 if evenx and eveny then n = 1 elseif not evenx and eveny then n = 2 x = x-1 elseif evenx and not eveny then n = 4 y = y-1 else -- x,y both odd n = 8 x = x-1 y = y-1 end end -- x,y is now the top left cell in a non-empty 2x2 block local k = (y-miny) * gridwd + (x-minx) blocks[k] = (blocks[k] or 0) + n end -- go thru all the 2x2 blocks created above and put the transitions in newcells for k,v in pairs(blocks) do local x = minx + (k % gridwd) local y = miny + (k // gridwd) -- x,y is the top left cell in this 2x2 block local xp1 = x+1 local yp1 = y+1 if oddgen then -- may need to wrap right and bottom edges if xp1 > maxx then xp1 = minx end if yp1 > maxy then yp1 = miny end end local n = transition[v] if n > 0 then if n & 1 == 1 then -- n is 1,3,5,7,9,11,13,15 newlen = newlen+1 ; newcells[newlen] = x newlen = newlen+1 ; newcells[newlen] = y end if n == 2 or n == 3 or n == 6 or n == 7 or n == 10 or n == 11 or n == 14 or n == 15 then newlen = newlen+1 ; newcells[newlen] = xp1 newlen = newlen+1 ; newcells[newlen] = y end if (n >= 4 and n <= 7) or (n >= 12 and n <= 15) then newlen = newlen+1 ; newcells[newlen] = x newlen = newlen+1 ; newcells[newlen] = yp1 end if n >= 8 then newlen = newlen+1 ; newcells[newlen] = xp1 newlen = newlen+1 ; newcells[newlen] = yp1 end end end -- delete the old pattern and add the new pattern g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(newcells) return newcells -- return the new pattern end -------------------------------------------------------------------------------- function SlowPattern(currcells, minx, miny, maxx, maxy) -- Create the next pattern when transition[0] > 0 and we have to examine -- every cell in the grid (so very slow). local newcells = {} -- cell array for the new pattern (one-state) local newlen = 0 -- length of newcells local get = g.getcell local oddgen = GetGenCount() & 1 == 1 local xfirst, yfirst, xlast, ylast if oddgen then -- odd-numbered generation xfirst = minx+1 yfirst = miny+1 xlast = maxx ylast = maxy else -- even-numbered generation (note that ParseRule ensures both grid -- dimensions are multiples of 4, so wrapping won't be needed and -- minx,miny are always even numbers) xfirst = minx yfirst = miny xlast = maxx-1 ylast = maxy-1 end for y = yfirst, ylast, 2 do local yp1 = y+1 -- may need to wrap bottom edge if oddgen and yp1 > maxy then yp1 = miny end for x = xfirst, xlast, 2 do local xp1 = x+1 -- may need to wrap right edge if oddgen and xp1 > maxx then xp1 = minx end local i = get(x, y) i = i + 2 * get(xp1, y) i = i + 4 * get(x, yp1) i = i + 8 * get(xp1, yp1) local n = transition[i] if n > 0 then if n & 1 == 1 then -- n is 1,3,5,7,9,11,13,15 newlen = newlen+1 ; newcells[newlen] = x newlen = newlen+1 ; newcells[newlen] = y end if n == 2 or n == 3 or n == 6 or n == 7 or n == 10 or n == 11 or n == 14 or n == 15 then newlen = newlen+1 ; newcells[newlen] = xp1 newlen = newlen+1 ; newcells[newlen] = y end if (n >= 4 and n <= 7) or (n >= 12 and n <= 15) then newlen = newlen+1 ; newcells[newlen] = x newlen = newlen+1 ; newcells[newlen] = yp1 end if n >= 8 then newlen = newlen+1 ; newcells[newlen] = xp1 newlen = newlen+1 ; newcells[newlen] = yp1 end end end end -- delete the old pattern and add the new pattern g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(newcells) return newcells -- return the new pattern end -------------------------------------------------------------------------------- -- override the SetColors function function SetColors() g.setcolors( {0,0,0,0} ) -- state 0 is black g.setcolors( {1,255,255,0} ) -- state 1 is yellow end -------------------------------------------------------------------------------- -- user's startup script might want to override this function RandomRule() local rand = math.random local rule = "M0," -- avoid strobing rules for i = 1, 14 do rule = rule..rand(0,15).."," end return rule..rand(0,15) end -------------------------------------------------------------------------------- -- allow alt-R to create a random pattern with a random rule local saveHandleKey = HandleKey function HandleKey(event) local _, key, mods = split(event) if key == "r" and mods == "alt" then SetRule(RandomRule()) RandomPattern() else -- pass the event to the original HandleKey saveHandleKey(event) end end -------------------------------------------------------------------------------- -- and away we go... StartNewCA() golly-3.3-src/Scripts/Lua/flood-fill.lua0000644000175000017500000000760713107435536015136 00000000000000-- Fill clicked region with current drawing state. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2016. local g = golly() local gp = require "gplus" -- avoid an unbounded fill local minx, miny, maxx, maxy if g.empty() then if g.getwidth() == 0 or g.getheight() == 0 then g.exit("You cannot fill an empty universe that is unbounded!") end else -- set fill limits to the pattern's bounding box -- (these will be extended below if the grid is bounded) minx, miny, maxx, maxy = gp.getedges(g.getrect()) end -- allow filling to extend to the edges of bounded grid if g.getwidth() > 0 then minx = -gp.int(g.getwidth() / 2) maxx = minx + g.getwidth() - 1 end if g.getheight() > 0 then miny = -gp.int(g.getheight() / 2) maxy = miny + g.getheight() - 1 end -------------------------------------------------------------------------------- function floodfill() local newstate = g.getoption("drawingstate") local oldstate = newstate local x, y -- wait for user to click a cell g.show("Click the region you wish to fill... (hit escape to abort)") while oldstate == newstate do local event = g.getevent() if event:find("click") == 1 then -- event is a string like "click 10 20 left none" local evt, xstr, ystr, butt, mods = gp.split(event) x = tonumber(xstr) y = tonumber(ystr) if x < minx or x > maxx or y < miny or y > maxy then -- click is outside pattern's bounding box in unbounded universe g.warn("Click within the pattern's bounding box\n".. "otherwise the fill will be unbounded.") else -- note that user might have changed drawing state newstate = g.getoption("drawingstate") oldstate = g.getcell(x, y) if oldstate == newstate then g.warn("The clicked cell must have a different state\n".. "to the current drawing state.") end end else g.doevent(event) end end -- tell Golly to handle all further keyboard/mouse events g.getevent(false) g.show("Filling clicked region... (hit escape to stop)") -- do flood fill starting with clicked cell using a scanline algorithm local oldsecs = os.clock() local clist = {} clist[1] = {x, y} while #clist > 0 do -- remove cell from end of clist (much faster than removing from start) x, y = table.unpack( table.remove(clist) ) local above = false local below = false while x >= minx and g.getcell(x, y) == oldstate do x = x-1 end x = x+1 while x <= maxx and g.getcell(x, y) == oldstate do g.setcell(x, y, newstate) if (not above) and y > miny and g.getcell(x, y-1) == oldstate then clist[#clist+1] = {x, y-1} above = true elseif above and y > miny and g.getcell(x, y-1) ~= oldstate then above = false end if (not below) and y < maxy and g.getcell(x, y+1) == oldstate then clist[#clist+1] = {x, y+1} below = true elseif below and y < maxy and g.getcell(x, y+1) ~= oldstate then below = false end x = x+1 end local newsecs = os.clock() if newsecs - oldsecs >= 0.5 then -- show changed pattern every half second oldsecs = newsecs g.update() end end end -------------------------------------------------------------------------------- oldcursor = g.getcursor() g.setcursor("Draw") local status, err = xpcall(floodfill, gp.trace) if err then g.continue(err) end -- the following code is executed even if error occurred or user aborted script g.setcursor(oldcursor) g.show(" ") golly-3.3-src/Scripts/Lua/hexgrid.lua0000755000175000017500000012750513317135606014542 00000000000000--[[ If the current rule uses a hexagonal neighborhood then create an overlay that shows the current pattern in a hexagonal grid. Much thanks to http://www.redblobgames.com/grids/hexagons/. Author: Andrew Trevorrow (andrew@trevorrow.com), August 2016. --]] local g = golly() -- require "gplus.strict" local gp = require "gplus" local op = require "oplus" local int = gp.int local round = gp.round local split = gp.split local draw_line = op.draw_line local ov = g.overlay local ovt = g.ovtable -- minor optimizations local abs = math.abs -- the following are set in create_overlay() local state_rgba = {} -- table of RGBA strings for each state local show_grid_rgba -- RGBA string for showing grid lines local hide_grid_rgba -- RGBA string for hiding grid lines local grid_rgba -- set to one of the above -- this array remembers which hexagons are alive local livehexagons = {} -- get pixel dimensions of current layer (used to create/resize overlay) local viewwd, viewht = g.getview(g.getlayer()) -- keep track of the layer's middle pixel for drawing the central hexagon local midx, midy = int(viewwd/2), int(viewht/2) -- keep track of the position of the current layer (the central cell) local xpos, ypos = gp.getposint() -- keep track of the magnification of the current layer local currmag = g.getmag() local edgelen -- current length of a hexagon edge (see set_hex_size) local minedge = 1 -- minimum edgelen local maxedge = 22 -- maximum edgelen local mingrid = 3 -- minimum edgelen at which to draw hexagonal grid -- this array is used to set edgelen when currmag is 1 to 5 (scale = 1:2 to 1:32) local hexsize = { 2, 3, 6, 11, maxedge } -- the following depend on edgelen and are set in create_hextile() local hextilewd -- width of tile used to draw hex grid local hextileht -- height of tile used to draw hex grid local hexwd -- width of 1 hexagon local hexht -- height of 1 hexagon local xrad -- x distances to each vertex local yrad -- y distances to each vertex local hextox -- used to find central x coord of a hexagon local hextoy -- used to find central y coord of a hexagon -- get width and height of the universe (in cells, bounded if either > 0) local gridwd = g.getwidth() local gridht = g.getheight() -- these controls are created in create_overlay local ssbutton -- Start/Stop button local sbutton -- Step button local s1button -- +1 button local rbutton -- Reset button local fbutton -- Fit button local hbutton -- ? button local ebutton -- X button local zslider -- slider for zooming in/out local toolbarht -- height of tool bar local generating = false -------------------------------------------------------------------------------- local function check_rule() -- check if the current rule uses a hexagonal neighborhood if not op.hexrule() then if g.getalgo() == "RuleLoader" then g.warn( [[If the current rule does not use a hexagonal neighborhood then the results will look a bit strange!]]) -- let user continue else g.exit("The current rule does not use a hexagonal neighborhood.") end end end -------------------------------------------------------------------------------- local function get_vertex(xc, yc, i) return int(xc + xrad[i] + 0.5), int(yc + yrad[i] + 0.5) end -------------------------------------------------------------------------------- local function create_hextile() --[[ initialize values that depend on the current edgelen and create a clip for tiling the background in draw_hex_grid() that contains one flat-topped hexagon (minus bottom edge) with a horizontal edge sticking out from the east vertex: ___ /4 5\ {3 0}--- \2 1/ --]] -- these arrays are used in get_vertex xrad = {} yrad = {} for i = 0, 5 do local angle_rad = math.pi / 180 * 60 * i xrad[i] = edgelen * math.cos(angle_rad) yrad[i] = edgelen * math.sin(angle_rad) end local x0, y0 = get_vertex(midx, midy, 0) -- E local x1, y1 = get_vertex(midx, midy, 1) -- SE local x2, y2 = get_vertex(midx, midy, 2) -- SW local x3, y3 = get_vertex(midx, midy, 3) -- W local x4, y4 = get_vertex(midx, midy, 4) -- NW local x5, y5 = get_vertex(midx, midy, 5) -- NE hexwd = x0 - x3 hexht = y1 - y5 -- these values are used to find the x,y coords of a hexagon's center hextox = edgelen * 3/2 hextoy = hexht -- create the clip hextilewd = hexwd + edgelen hextileht = hexht ov("rgba "..state_rgba[0]) ovt{"fill", x3, y4, hextilewd, hextileht} ov("rgba "..grid_rgba) draw_line(x0, y0, x1, y1) -- skip bottom edge -- draw_line(x1, y1, x2, y2) draw_line(x2, y2, x3, y3) draw_line(x3, y3, x4, y4) draw_line(x4, y4, x5, y5) draw_line(x5, y5, x0, y0) -- draw horizontal edge from right-most vertex draw_line(x0, y0, x0 + edgelen, y0) ov("copy "..x3.." "..y4.." "..hextilewd.." "..hextileht.." hextile") end -------------------------------------------------------------------------------- local function cube_round(x, y, z) local rx = round(x) local ry = round(y) local rz = round(z) local x_diff = abs(rx - x) local y_diff = abs(ry - y) local z_diff = abs(rz - z) if x_diff > y_diff and x_diff > z_diff then rx = -ry-rz elseif y_diff > z_diff then ry = -rx-rz else rz = -rx-ry end return rx, rz end -------------------------------------------------------------------------------- local function pixel_to_hex(x, y) local q = (x - midx) / hextox local r = (y - midy) / hextoy - q / 2 return cube_round(q, -q-r, r) end -------------------------------------------------------------------------------- local function get_visible_rect() -- get axial coords of corner hexagons local qmin, _ = pixel_to_hex(0, 0) local qmax, _ = pixel_to_hex(viewwd-1, viewht-1) local _, rmin = pixel_to_hex(viewwd-1, 0) local _, rmax = pixel_to_hex(0, viewht-1) -- convert axial coords to cell coords local minx = qmin + rmin + xpos local maxx = qmax + rmax + xpos local miny = rmin + ypos local maxy = rmax + ypos -- adjust limits if current layer's grid is bounded if gridwd > 0 then local bminx = -int(gridwd / 2) local bmaxx = bminx + gridwd - 1 if minx < bminx then minx = bminx end if maxx > bmaxx then maxx = bmaxx end end if gridht > 0 then local bminy = -int(gridht / 2) local bmaxy = bminy + gridht - 1 if miny < bminy then miny = bminy end if maxy > bmaxy then maxy = bmaxy end end return { minx, miny, maxx-minx+1, maxy-miny+1 } end -------------------------------------------------------------------------------- local function cell_to_hexagon(x, y) --[[ convert cell position x,y to axial coords q,r so that the pattern is rotated clockwise by 45 degrees; ie. the square cell at x,y = -1,-1 will be in the hexagonal cell at q,r = 0,-1 _________________ _____ | | | | / \ |-1,-1| 0,-1|+1,-1| -----{ 0,-1 }----- |_____|_____|_____| /-1,0 \_____/ +1,-1\ | | | | \ / \ / |-1,0 | 0,0 |+1,0 | ---> -----{ 0,0 }----{ |_____|_____|_____| /-1,+1 \_____/ +1,0 \ | | | | \ / \ / |-1,+1| 0,+1|+1,+1| -----{ 0,+1 }----- |_____|_____|_____| \_____/ --]] local r = y - ypos local q = x - xpos - r -- return central pixel position of corresponding hexagon in overlay x = int(hextox * q + midx + 0.5) y = int(hextoy * (r + q/2) + midy + 0.5) return x, y end -------------------------------------------------------------------------------- local function fill_hexagon(xc, yc, state) ov("rgba "..state_rgba[state]) if edgelen < mingrid then if edgelen == 1 then ovt{"set", xc, yc} else local x = int(xc - edgelen/2 + 0.5) local y = int(yc - edgelen/2 + 0.5) ovt{"fill", x, y, edgelen, edgelen} end else -- adjust xc and/or yc if they are outside overlay but hexagon is partially visible local check_pixel = false if xc < 0 then if xc + edgelen >= 0 then xc = 0 check_pixel = true else return end elseif xc >= viewwd then if xc - edgelen < viewwd then xc = viewwd-1 check_pixel = true else return end end if yc < toolbarht then if yc + hexht/2 >= toolbarht then yc = toolbarht check_pixel = true else return end elseif yc >= viewht then if yc - hexht/2 < viewht then yc = viewht-1 check_pixel = true else return end end if check_pixel then -- avoid filling grid line if ov("get "..xc.." "..yc) == grid_rgba then return end end ov("flood "..xc.." "..yc) end end -------------------------------------------------------------------------------- local function draw_live_cells() livehexagons = {} if g.empty() then return end -- get live cells that will be visible in current hex grid local cells = g.getcells( get_visible_rect() ) if #cells == 0 then return end local len = #cells local inc = 2 if len & 1 == 1 then -- multi-state cell array so set inc to 3 and ignore any padding int inc = 3 if len % 3 == 1 then len = len - 1 end end for i = 1, len, inc do local x = cells[i] local y = cells[i+1] local state = 1 if inc == 3 then state = cells[i+2] end -- calculate pixel at center of hexagon and fill it with current state local xc, yc = cell_to_hexagon(x, y) fill_hexagon(xc, yc, state) livehexagons[#livehexagons + 1] = {xc, yc} end end -------------------------------------------------------------------------------- local function kill_live_cells() for _, hexcell in ipairs(livehexagons) do local xc, yc = table.unpack(hexcell) fill_hexagon(xc, yc, 0) end livehexagons = nil end -------------------------------------------------------------------------------- local function draw_hex_grid() -- draw middle hexagon local x = int(midx - edgelen + 0.5) local y = int(midy - hextileht/2 + 0.5) local xy = {"paste"} local xyi = 2 xy[xyi] = x xy[xyi + 1] = y xyi = xyi + 2 -- draw middle row of hexagons while x > 0 do x = x - hextilewd xy[xyi] = x xy[xyi + 1] = y xyi = xyi + 2 end x = int(midx - edgelen + 0.5) + hextilewd while x < viewwd do xy[xyi] = x xy[xyi + 1] = y xyi = xyi + 2 x = x + hextilewd end xy[xyi] = "hextile" ovt(xy) -- copy middle row and paste above and below until overlay is tiled ov("copy 0 "..y.." "..viewwd.." "..hextileht.." row") xy = {"paste"} xyi = 2 while y > 0 do y = y - hextileht xy[xyi] = 0 xy[xyi + 1] = y xyi = xyi + 2 end y = int(midy - hextileht/2 + 0.5) + hextileht while y < viewht do xy[xyi] = 0 xy[xyi + 1] = y xyi = xyi + 2 y = y + hextileht end xy[xyi] = "row" ovt(xy) end -------------------------------------------------------------------------------- local function draw_boundary_line(x1, y1, x2, y2) x1, y1 = cell_to_hexagon(x1, y1) x2, y2 = cell_to_hexagon(x2, y2) ovt{"line", x1, y1, x2, y2} end -------------------------------------------------------------------------------- local function draw_outer_hexagon(xc, yc, toprow, bottomrow, leftcol, rightcol) local x0, y0 = get_vertex(xc, yc, 0) local x1, y1 = get_vertex(xc, yc, 1) local x2, y2 = get_vertex(xc, yc, 2) local x3, y3 = get_vertex(xc, yc, 3) local x4, y4 = get_vertex(xc, yc, 4) local x5, y5 = get_vertex(xc, yc, 5) if toprow then -- draw top edge and NE edge draw_line(x4, y4, x5, y5) draw_line(x5, y5, x0, y0) end if bottomrow then -- draw bottom edge and SW edge draw_line(x1, y1, x2, y2) draw_line(x2, y2, x3, y3) end if leftcol then -- draw NW edge draw_line(x3, y3, x4, y4) if not toprow then -- draw top edge draw_line(x4, y4, x5, y5) end end if rightcol then -- draw SE edge draw_line(x0, y0, x1, y1) if not bottomrow then -- draw bottom edge draw_line(x1, y1, x2, y2) end end end -------------------------------------------------------------------------------- local function draw_inner_hexagon(xc, yc, toprow, leftcol) local x0, y0 = get_vertex(xc, yc, 0) local x1, y1 = get_vertex(xc, yc, 1) local x2, y2 = get_vertex(xc, yc, 2) local x3, y3 = get_vertex(xc, yc, 3) local x4, y4 = get_vertex(xc, yc, 4) local x5, y5 = get_vertex(xc, yc, 5) draw_line(x0, y0, x1, y1) draw_line(x1, y1, x2, y2) draw_line(x2, y2, x3, y3) if leftcol then -- need to draw NW edge draw_line(x3, y3, x4, y4) end if toprow then -- need to draw top edge and NE edge draw_line(x4, y4, x5, y5) draw_line(x5, y5, x0, y0) elseif leftcol then -- need to draw top edge draw_line(x4, y4, x5, y5) end end -------------------------------------------------------------------------------- local function outside_grid(q, r) if gridwd == 0 and gridht == 0 then -- grid is unbounded return false end -- convert axial coords to cell coords local x = q + r + xpos local y = r + ypos if gridwd > 0 then local bminx = -int(gridwd / 2) local bmaxx = bminx + gridwd - 1 if x < bminx or x > bmaxx then return true end end if gridht > 0 then local bminy = -int(gridht / 2) local bmaxy = bminy + gridht - 1 if y < bminy or y > bmaxy then return true end end return false end -------------------------------------------------------------------------------- local function border_visible() -- return true if any corner hexagon is outside the bounded grid if outside_grid( pixel_to_hex(0,0) ) then return true end if outside_grid( pixel_to_hex(0,viewht-1) ) then return true end if outside_grid( pixel_to_hex(viewwd-1,0) ) then return true end if outside_grid( pixel_to_hex(viewwd-1,viewht-1) ) then return true end return false end -------------------------------------------------------------------------------- local function pixel_in_overlay(x, y) return x >= 0 and x < viewwd and y >= 0 and y < viewht end -------------------------------------------------------------------------------- local function draw_bounded_grid() local minx, miny, wd, ht = table.unpack( get_visible_rect() ) local maxx = minx+wd-1 local maxy = miny+ht-1 if edgelen < mingrid then -- fill bounded diamond or strip with state 0 color ov("rgba "..state_rgba[0]) local offset if edgelen == 2 and (gridht == 0 or gridwd == 0) then -- offset needs to be larger so strip is wider offset = 0.5 else offset = (edgelen - 1) / 3 end draw_boundary_line(minx-offset, miny-offset, maxx+offset, miny-offset) draw_boundary_line(maxx+offset, miny-offset, maxx+offset, maxy+offset) draw_boundary_line(maxx+offset, maxy+offset, minx-offset, maxy+offset) draw_boundary_line(minx-offset, maxy+offset, minx-offset, miny-offset) if edgelen > 1 or (edgelen == 1 and wd > 1 and ht > 1) then local xc, yc = cell_to_hexagon(minx + int(wd/2), miny + int(ht/2)) ov("flood "..xc.." "..yc) end else -- draw the outer edges of the outer hexagons ov("rgba "..grid_rgba) for y = miny, maxy do for x = minx, maxx do if x == minx or x == maxx or y == miny or y == maxy then local xc, yc = cell_to_hexagon(x, y) draw_outer_hexagon(xc, yc, y == miny, y == maxy, x == minx, x == maxx) end end end -- flood the interior with state 0 color ov("rgba "..state_rgba[0]) local xc, yc = cell_to_hexagon(minx + int(wd/2), miny + int(ht/2)) if pixel_in_overlay(xc, yc) then ov("flood "..xc.." "..yc) else -- central hexagon is not visible so search border hexagons for y = miny, maxy do for x = minx, maxx do if x == minx or x == maxx or y == miny or y == maxy then local xc, yc = cell_to_hexagon(x, y) if pixel_in_overlay(xc, yc) then ov("flood "..xc.." "..yc) goto done end end end end ::done:: end -- draw the inner hexagon edges ov("rgba "..grid_rgba) for y = miny, maxy do for x = minx, maxx do local xc, yc = cell_to_hexagon(x, y) draw_inner_hexagon(xc, yc, y == miny, x == minx) end end end end -------------------------------------------------------------------------------- local function draw_tool_bar() ov(op.white) ovt{"fill", 0, 0, viewwd, toolbarht} -- must draw line at bottom edge of tool bar in case a cell color is white ov("rgba "..show_grid_rgba) draw_line(0, toolbarht-1, viewwd-1, toolbarht-1) local gap = 10 local x = gap local y = int((toolbarht - ssbutton.ht) / 2) if y < 10 then return end if x >= viewwd then return end ssbutton.show(x, y) x = x + ssbutton.wd + gap if x >= viewwd then return end sbutton.show(x, y) x = x + sbutton.wd + gap if x >= viewwd then return end s1button.show(x, y) x = x + s1button.wd + gap if x >= viewwd then return end rbutton.show(x, y) x = x + rbutton.wd + gap if x >= viewwd then return end zslider.show(x, y, edgelen) x = x + zslider.wd + gap if x >= viewwd then return end fbutton.show(x, y) x = viewwd - gap - ebutton.wd if x >= viewwd then return end ebutton.show(x, y) x = x - gap - hbutton.wd if x >= viewwd then return end hbutton.show(x, y) end -------------------------------------------------------------------------------- local function refresh() create_hextile() if (gridwd > 0 or gridht > 0) and border_visible() then -- fill overlay with border color local br, bg, bb = g.getcolor("border") ovt{"rgba", br, bg, bb, 255} ovt{"fill"} draw_bounded_grid() else -- fill overlay with state 0 color ov("rgba "..state_rgba[0]) ovt{"fill"} if edgelen >= mingrid then draw_hex_grid() end end draw_live_cells() -- if selection exists then draw translucent selection color over selected cells???!!! draw_tool_bar() ov("update") end -------------------------------------------------------------------------------- local function set_hex_size() -- get current layer's magnification currmag = g.getmag() -- set edgelen so hexagons are roughly the same size as cells if currmag <= 0 then edgelen = 1 else -- currmag is 1 to 5 (scale is 2^mag) edgelen = hexsize[currmag] end end -------------------------------------------------------------------------------- local function sync_layer_scale() -- edgelen has been changed so set layer magnification accordingly for i = #hexsize, 1, -1 do if edgelen >= hexsize[i] then currmag = i g.setmag(currmag) return end end currmag = 0 g.setmag(currmag) end -------------------------------------------------------------------------------- local function fit_pattern() g.fit() -- update currmag and edgelen set_hex_size() if not g.empty() then -- may need to reduce edgelen further to see live cells at left/right edges local x, y, w, h = table.unpack(g.getrect()) while edgelen > minedge do -- need to update values that depend on edgelen create_hextile() -- also need to update xpos and ypos xpos, ypos = gp.getposint() local x1, y1 = cell_to_hexagon(x, y+h-1) local x2, y2 = cell_to_hexagon(x+w-1, y) if pixel_in_overlay(x1, y1) and pixel_in_overlay(x2, y2) then break end edgelen = edgelen - 1 sync_layer_scale() end end refresh() -- update the status bar to show scale g.update() end -------------------------------------------------------------------------------- local function zoom_in() if g.getoption("showoverlay") == 0 then -- zoom in to the current layer's central pixel -- (can't use midx and midy because they have been offset by toolbarht/2) g.doevent("zoomin "..int(viewwd/2).." "..int(viewht/2)) elseif edgelen < maxedge then -- draw bigger hexagons edgelen = edgelen + 1 refresh() sync_layer_scale() end end -------------------------------------------------------------------------------- local function zoom_out() if g.getoption("showoverlay") == 0 then -- zoom out from the current layer's central pixel -- (can't use midx and midy because they have been offset by toolbarht/2) g.doevent("zoomout "..int(viewwd/2).." "..int(viewht/2)) elseif edgelen > minedge then -- draw smaller hexagons edgelen = edgelen - 1 refresh() sync_layer_scale() end end -------------------------------------------------------------------------------- local function zoom_hexagons(event) local direction, x, y = split(event) x = tonumber(x) y = tonumber(y) if y < toolbarht then return end if direction == "ozoomin" then -- try to zoom in to hexagon at x,y???!!! zoom_in() else -- try to zoom out from hexagon at x,y???!!! zoom_out() end end -------------------------------------------------------------------------------- local function click_in_layer(event) -- process a mouse click in current layer like "click 100 20 left none" local _, x, y, button, mods = split(event) local state = g.getcell(x, y) if button ~= "left" then return end if mods ~= "none" and mods ~= "shift" then return end if g.getcursor() == "Draw" then local drawstate = g.getoption("drawingstate") if state == 0 and drawstate == 0 then -- no change else if state == drawstate then -- kill cell g.setcell(x, y, 0) else g.setcell(x, y, drawstate) end g.update() refresh() -- updates overlay (currently not shown) end elseif g.getcursor() == "Pick" then g.setoption("drawingstate", state) g.update() -- updates edit bar elseif g.getcursor() == "Select" then -- don't allow selections???!!! -- g.doevent(event) else -- g.getcursor() == "Move" or "Zoom In" or "Zoom Out" g.doevent(event) end end -------------------------------------------------------------------------------- local function edit_hexagons(x, y) -- get axial coords of hexagon containing clicked pixel local q, r = pixel_to_hex(x, y) -- check if hexagon is outside bounded grid if outside_grid(q, r) then return end -- update corresponding cell in current layer local xcell = q + r + xpos local ycell = r + ypos local state = g.getcell(xcell, ycell) local drawstate = g.getoption("drawingstate") if state == drawstate then -- kill cell g.setcell(xcell, ycell, 0) else g.setcell(xcell, ycell, drawstate) end -- get central pixel of hexagon local xc = int(hextox * q + midx + 0.5) local yc = int(hextoy * (r + q/2) + midy + 0.5) -- update hexagon if state == drawstate then -- erase hexagon fill_hexagon(xc, yc, 0) else fill_hexagon(xc, yc, drawstate) if drawstate > 0 then livehexagons[#livehexagons + 1] = {xc, yc} end end -- display overlay and show new population count in status bar g.update() end -------------------------------------------------------------------------------- local function get_state(color) -- search state_rgba array for color and return matching state for s, c in pairs(state_rgba) do if c == color then return s end end return -1 -- no match end -------------------------------------------------------------------------------- local function set_position(x, y) -- avoid error message from gp.setposint if grid is bounded if gridwd > 0 then local bminx = -int(gridwd / 2) local bmaxx = bminx + gridwd - 1 if x < bminx or x > bmaxx then return end end if gridht > 0 then local bminy = -int(gridht / 2) local bmaxy = bminy + gridht - 1 if y < bminy or y > bmaxy then return end end gp.setposint(x, y) end -------------------------------------------------------------------------------- local function check_position() -- refresh overlay if current layer's position has changed local x0, y0 = gp.getposint() if x0 ~= xpos or y0 ~= ypos then xpos = x0 ypos = y0 refresh() end end -------------------------------------------------------------------------------- local function check_position_and_scale() -- refresh overlay if current layer's position or scale has changed local call_refresh = false local x0, y0 = gp.getposint() if x0 ~= xpos or y0 ~= ypos then xpos = x0 ypos = y0 call_refresh = true end local newmag = g.getmag() if newmag ~= currmag then set_hex_size() call_refresh = true end if call_refresh then refresh() end end -------------------------------------------------------------------------------- local function move_hexagons(x, y) -- get axial coords of hexagon containing clicked pixel local q, r = pixel_to_hex(x, y) -- check if hexagon is outside bounded grid if outside_grid(q, r) then return end -- drag clicked hexagon to new position local prevq, prevr = q, r while true do local event = g.getevent() if event:find("^mup") then break end local xy = ov("xy") if #xy > 0 then x, y = split(xy) q, r = pixel_to_hex(tonumber(x), tonumber(y)) if q ~= prevq or r ~= prevr then if not outside_grid(q, r) then local deltaq = q - prevq local deltar = r - prevr --[[ ^ | move up/down if deltaq == 0 v }____{ _ / \ /| }-----{ q,r-1 }-----{ |/_ move NE/SW if deltaq == -deltar / \ / \ { q-1,r }----{ q+1,r-1 } \ / \ / }-----{ q,r }-----{ / \ / \ { q-1,r+1 }----{ q+1,r } \ / \ / _ }-----{ q,r+1 }-----{ |\ move NW/SE if deltar == 0 \ / _\| }----{ --]] if deltar ~= 0 and deltaq == 0 then -- move current layer diagonally to move hexagons up/down set_position(xpos - deltar, ypos - deltar) check_position() elseif deltaq ~= 0 and deltar == 0 then -- move current layer left/right to move hexagons NW/SE set_position(xpos - deltaq, ypos) check_position() elseif deltaq == -deltar then -- move current layer up/down to move hexagons NE/SW set_position(xpos, ypos + deltaq) check_position() else -- move hexagons NE/SW until prevr = r deltaq = prevr - r ypos = ypos + deltaq set_position(xpos, ypos) prevq = prevq + deltaq -- now move hexagons NW/SE until prevq = q deltaq = q - prevq set_position(xpos - deltaq, ypos) check_position() end end prevq, prevr = q, r end end end end -------------------------------------------------------------------------------- local function pan(event) -- user pressed an arrow key if g.getoption("showoverlay") == 0 then -- just pan the current layer (assuming the user hasn't changed -- the default actions for the arrow keys) g.doevent(event) else local _, key, mods = split(event) local amount = 1 if edgelen < mingrid then amount = 10 -- pan further at this scale end if mods == "none" then -- to pan overlay orthogonally we need to pan layer diagonally if key == "left" then set_position(xpos-amount, ypos+amount) elseif key == "right" then set_position(xpos+amount, ypos-amount) elseif key == "up" then set_position(xpos-amount, ypos-amount) elseif key == "down" then set_position(xpos+amount, ypos+amount) end elseif mods == "shift" then -- to pan overlay diagonally we need to pan layer orthogonally if key == "left" then set_position(xpos-amount, ypos) elseif key == "right" then set_position(xpos+amount, ypos) elseif key == "up" then set_position(xpos, ypos-amount) elseif key == "down" then set_position(xpos, ypos+amount) end end -- main loop will call check_position_and_scale() end end -------------------------------------------------------------------------------- local function click_in_overlay(event) -- process a mouse click in overlay like "oclick 100 20 left none" local _, x, y, button, mods = split(event) x = tonumber(x) y = tonumber(y) if y < toolbarht then return end if button ~= "left" then return end if mods ~= "none" and mods ~= "shift" then return end if g.getcursor() == "Draw" then edit_hexagons(x, y) elseif g.getcursor() == "Pick" then local state = get_state( ov("get "..x.." "..y) ) if state >= 0 then g.setoption("drawingstate", state) g.update() -- updates edit bar end elseif g.getcursor() == "Move" then move_hexagons(x, y) elseif g.getcursor() == "Select" then -- don't allow selections???!!! elseif g.getcursor() == "Zoom In" then -- zoom in to clicked hexagon zoom_hexagons("ozoomin "..x.." "..y) elseif g.getcursor() == "Zoom Out" then -- zoom out from clicked hexagon zoom_hexagons("ozoomout "..x.." "..y) end end -------------------------------------------------------------------------------- local function check_grid() if g.getoption("showgrid") == 1 then if grid_rgba ~= show_grid_rgba then grid_rgba = show_grid_rgba refresh() g.update() end else if grid_rgba ~= hide_grid_rgba then grid_rgba = hide_grid_rgba refresh() g.update() end end end -------------------------------------------------------------------------------- local function toggle_overlay() if g.getoption("showoverlay") == 1 then g.setoption("showoverlay", 0) g.update() else g.setoption("showoverlay", 1) -- force check_position_and_scale to call refresh currmag = 666 end end -------------------------------------------------------------------------------- local function toggle_grid() g.setoption("showgrid", 1 - g.getoption("showgrid")) -- main loop will call check_grid() to do the update end -------------------------------------------------------------------------------- local function check_layer_size() local newwd, newht = g.getview(g.getlayer()) if newwd ~= viewwd or newht ~= viewht then viewwd, viewht = newwd, newht if viewwd < 1 then viewwd = 1 end if viewht < 1 then viewht = 1 end midx, midy = int(viewwd/2), int(viewht/2 + toolbarht/2) ov("resize "..viewwd.." "..viewht) -- hide tool bar controls so show calls will use correct background ssbutton.hide() sbutton.hide() s1button.hide() rbutton.hide() fbutton.hide() hbutton.hide() ebutton.hide() zslider.hide() refresh() end end -------------------------------------------------------------------------------- local arrow_cursor = false local function check_cursor() local xy = ov("xy") if #xy > 0 then local x, y = split(xy) x = tonumber(x) y = tonumber(y) if y < toolbarht then -- mouse is inside tool bar if not arrow_cursor then ov("cursor arrow") arrow_cursor = true end else -- mouse is outside tool bar if arrow_cursor then ov("cursor current") arrow_cursor = false end end end end -------------------------------------------------------------------------------- local function update_start_button() -- change label in ssbutton without changing the button's width if generating then ssbutton.setlabel("Stop", false) else ssbutton.setlabel("Start", false) end draw_tool_bar() ov("update") end -------------------------------------------------------------------------------- local function advance(by1) if g.empty() then g.note("There are no live cells.") generating = false update_start_button() return end if by1 then g.run(1) else g.step() end -- erase live hexagons and draw new ones kill_live_cells() draw_live_cells() draw_tool_bar() g.update() end -------------------------------------------------------------------------------- local function step() advance(false) generating = false update_start_button() end -------------------------------------------------------------------------------- local function step1() advance(true) generating = false update_start_button() end -------------------------------------------------------------------------------- local function start_stop() generating = not generating update_start_button() end -------------------------------------------------------------------------------- local function reset() g.reset() -- erase live hexagons and draw new ones kill_live_cells() draw_live_cells() generating = false update_start_button() draw_tool_bar() g.update() end -------------------------------------------------------------------------------- local function zoom_slider(newval) -- called if zslider position has changed edgelen = newval refresh() sync_layer_scale() end -------------------------------------------------------------------------------- local function show_help() if g.getoption("showoverlay") == 0 then g.setoption("showoverlay", 1) g.update() end local helptext = [[ Features: - Allows toggling between hex layer and current layer. - Synchronizes hex layer's scale and position with current layer. - Allows simple editing in hex layer or current layer. - Allows pattern generation in hex layer or current layer. - Hex layer can be zoomed in/out, but only from middle hexagon. - Hex layer can be panned via arrow keys or via hand cursor. - Hex layer has a tool bar with buttons and a slider for zooming. Current limitations: - Doesn't allow editing multiple cells/hexagons via click and drag. - Doesn't show any selection, nor allow selection to be changed. - Doesn't support zooming in/out from a particular hexagon. - Hex layer can't be zoomed out beyond 1:1 scale. Special keys and their actions: enter/return - start/stop generating tab - advance by step size space - advance by 1 arrows - pan up/down/left/right shift-arrows - pan NE/SE/NW/SW f - fit pattern h - display this help l - show/hide grid lines o - show/hide overlay r - reset to starting pattern [ - zoom out ] - zoom in (click or hit any key to close help)]] ov("font 11 mono-bold") ov(op.black) local w, h = split(ov("text temp "..helptext)) w = tonumber(w) + 20 h = tonumber(h) + 20 local x = int((viewwd - w) / 2) local y = int((viewht - h) / 2) ov(op.gray) ovt{"fill", x, y, w, h} ov("rgba 255 253 217 255") -- pale yellow (matches Help window) ovt{"fill", (x+2), (y+2), (w-4), (h-4)} local oldblend = ov("blend 1") ovt{"paste", (x+10), (y+10), "temp"} ov("blend "..oldblend) ov("update") while true do local event = g.getevent() if event:find("^key") or event:find("^oclick") then break end end refresh() end -------------------------------------------------------------------------------- local function exit_script() g.show("") -- clear message g.exit() -- don't beep end -------------------------------------------------------------------------------- local function create_overlay() -- overlay covers entire viewport ov("create "..viewwd.." "..viewht) ov("cursor current") -- use current Golly cursor -- use smaller buttons in our tool bar op.buttonht = 20 -- height of buttons (also used for check boxes and sliders) op.sliderwd = 12 -- width of slider button (best if even) op.textgap = 8 -- gap between edge of button and its label op.textfont = "font 10 default-bold" -- font for labels op.textshadowx = 2 op.textshadowy = 2 if g.os() == "Mac" then op.yoffset = -1 end if g.os() == "Linux" then op.textfont = "font 10 default" end -- create tool bar buttons ssbutton = op.button("Start", start_stop) sbutton = op.button("Step", step) s1button = op.button("+1", step1) rbutton = op.button("Reset", reset) fbutton = op.button("Fit", fit_pattern) hbutton = op.button("?", show_help) ebutton = op.button("X", exit_script) -- create a slider for zooming in/out zslider = op.slider("", op.black, (maxedge-minedge+1)*3, minedge, maxedge, zoom_slider) toolbarht = 20 + ssbutton.ht midy = int(viewht/2 + toolbarht/2) local currcolors = g.getcolors() for i = 0, g.numstates()-1 do state_rgba[i] = currcolors[2+i*4].." "..currcolors[3+i*4].." "..currcolors[4+i*4].." 255" end -- set grid colors based on current background color local gridr, gridg, gridb = currcolors[2], currcolors[3], currcolors[4] local diff = 48 if (gridr + gridg + gridb) / 3 > 127 then -- light background so make grid lines slightly darker if gridr > diff then gridr = gridr - diff else gridr = 0 end if gridg > diff then gridg = gridg - diff else gridg = 0 end if gridb > diff then gridb = gridb - diff else gridb = 0 end else -- dark background so make grid lines slightly lighter if gridr + diff < 256 then gridr = gridr + diff else gridr = 255 end if gridg + diff < 256 then gridg = gridg + diff else gridg = 255 end if gridb + diff < 256 then gridb = gridb + diff else gridb = 255 end end show_grid_rgba = gridr.." "..gridg.." "..gridb.." 255" if currcolors[2] > 0 then -- hide_grid_rgba is the state 0 color with a slightly different red value -- (this allows fill_hexagon to draw a hexagon with a flood command) hide_grid_rgba = (currcolors[2]-1).." "..currcolors[3].." "..currcolors[4].." 255" else hide_grid_rgba = (currcolors[2]+1).." "..currcolors[3].." "..currcolors[4].." 255" end if g.getoption("showgrid") == 1 then grid_rgba = show_grid_rgba else grid_rgba = hide_grid_rgba end -- initialize edgelen set_hex_size() end -------------------------------------------------------------------------------- local function do_key(event) local key = event:sub(5) if key == "return none" then start_stop() elseif key == "space none" then step1() elseif key == "tab none" then step() elseif key:find("^up ") or key:find("^down ") or key:find("^left ") or key:find("^right ") then pan(event) elseif key == "f none" then fit_pattern() elseif key == "h none" then show_help() elseif key == "l none" then toggle_grid() elseif key == "o none" then toggle_overlay() elseif key == "r none" then reset() elseif key == "] none" then zoom_in() elseif key == "[ none" then zoom_out() else -- might be a user keyboard shortcut, so do it g.doevent(event) end end -------------------------------------------------------------------------------- function main() check_rule() create_overlay() refresh() g.show("Hit escape key to abort script...") while true do -- if size of layer has changed then resize the overlay check_layer_size() -- update cursor if mouse moves in/out of tool bar check_cursor() -- check for user input local event = op.process( g.getevent() ) -- event is empty if op.process handled the given event if #event > 0 then if event:find("^key") then do_key(event) elseif event:find("^click") then click_in_layer(event) elseif event:find("^oclick") then click_in_overlay(event) elseif event:find("^ozoomin") or event:find("^ozoomout") then zoom_hexagons(event) else -- eg. zoomin/zoomout event in current layer g.doevent(event) end end if g.getoption("showoverlay") == 1 then -- check if current layer's position or scale has changed check_position_and_scale() end -- check if user toggled grid lines (possibly via View menu) check_grid() if generating then advance(false) end end end -------------------------------------------------------------------------------- local oldstack = g.setoption("stacklayers", 0) local oldbuttons = g.setoption("showbuttons", 0) -- disable translucent buttons local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed ov("delete") g.setoption("stacklayers", oldstack) g.setoption("showbuttons", oldbuttons) golly-3.3-src/Scripts/Lua/toLifeHistory.lua0000644000175000017500000000021013151213347015663 00000000000000-- Life to LifeHistory converter, intended to be mapped to keyboard shortcut, e.g., Alt+H local g = golly() g.setrule("LifeHistory") golly-3.3-src/Scripts/Lua/overlay-demo.lua0000755000175000017500000023327213441044674015514 00000000000000--[[ This script demonstrates the overlay's capabilities. Authors: Andrew Trevorrow (andrew@trevorrow.com) and Chris Rowett (crowett@gmail.com). --]] local g = golly() -- require "gplus.strict" local gp = require "gplus" local split = gp.split local int = gp.int local op = require "oplus" local maketext = op.maketext local pastetext = op.pastetext local draw_line = op.draw_line local ov = g.overlay local ovt = g.ovtable math.randomseed(os.time()) -- init seed for math.random -- minor optimizations local rand = math.random local floor = math.floor local sin = math.sin local cos = math.cos local abs = math.abs local wd, ht -- overlay's current width and height local toggle = 0 -- for toggling alpha blending local align = "right" -- for text alignment local transbg = 0 -- for text transparent background local shadow = 0 -- for text shadow local demofont = "font 11 default-bold" -- buttons for main menu (created in create_menu_buttons) local batch_button local blend_button local cellview_button local copy_button local cursor_button local line_button local set_button local fill_button local mouse_button local multiline_button local pos_button local render_button local replace_button local save_button local scale_button local sound_button local text_button local transition_button local extra_layer = false local return_to_main_menu = false -- flag if sound is available local sound_enabled = false -- timing local tstart = gp.timerstart local tsave = gp.timersave local tvalueall = gp.timervalueall -------------------------------------------------------------------------------- local function create_overlay() ov("create 1000 1000") -- main_menu() will resize the overlay to just fit buttons and text end -------------------------------------------------------------------------------- local function demotext(x, y, text) local oldfont = ov(demofont) local oldblend = ov("blend 1") maketext(text) pastetext(x, y) ov("blend "..oldblend) ov("font "..oldfont) end -------------------------------------------------------------------------------- local function repeat_test(extratext, palebg) extratext = extratext or "" palebg = palebg or false -- explain how to repeat test or return to the main menu local text = "Hit the space bar to repeat this test"..extratext..".\n" if g.os() == "Mac" then text = text.."Click or hit the return key to return to the main menu." else text = text.."Click or hit the enter key to return to the main menu." end local oldfont = ov(demofont) local oldblend = ov("blend 1") if palebg then -- draw black text ov(op.black) local _, h = maketext(text) pastetext(10, ht - 10 - h) else -- draw white text with a black shadow ov(op.white) local _, h = maketext(text, nil, op.white, 2, 2) local x = 10 local y = ht - 10 - h pastetext(x, y) end ov("blend "..oldblend) ov("font "..oldfont) g.update() while true do local event = g.getevent() if event:find("^oclick") or event == "key return none" then -- return to main menu rather than repeat test return_to_main_menu = true return false elseif event == "key space none" then -- repeat current test return true else -- might be a keyboard shortcut g.doevent(event) end end end -------------------------------------------------------------------------------- local function ms(t) return string.format("%.2fms", t) end -------------------------------------------------------------------------------- local day = 1 local function test_transitions() -- create a clip from the menu screen local oldblend = ov("blend 0") ov(op.black) ovt{"line", 0, 0, (wd - 1), 0, (wd - 1), (ht - 1), 0, (ht - 1), 0, 0} ov("copy 0 0 "..wd.." "..ht.." bg") -- create the background clip ov(op.blue) ovt{"fill"} local oldfont = ov("font 100 mono") ov(op.yellow) local w,h = maketext("Golly") ov("blend 1") pastetext(floor((wd - w) / 2), floor((ht - h) / 2)) ov("copy 0 0 "..wd.." "..ht.." fg") ov("blend 0") local pause = 0 ::restart:: ovt{"paste", 0, 0, "bg"} ov("update") local t = g.millisecs() while g.millisecs() - t < pause do end -- monday: exit stage left if day == 1 then for x = 0, wd, 10 do t = g.millisecs() ovt{"paste", 0, 0, "fg"} ovt{"paste", -x, 0, "bg"} ov("update") while g.millisecs() - t < 15 do end end -- tuesday: duck and cover elseif day == 2 then ov(op.white) for y = 0, ht, 10 do t = g.millisecs() ovt{"paste", 0, 0, "fg"} ovt{"paste", 0, y, "bg"} ov("update") while g.millisecs() - t < 15 do end end -- wednesday: slide to the right elseif day == 3 then for y = 0, ht, 8 do ov("copy 0 "..y.." "..wd.." 8 bg"..y) end local d local p for x = 0, wd * 2, 20 do t = g.millisecs() ovt{"paste", 0, 0, "fg"} d = 0 for y = 0, ht, 8 do p = x + 10 * d - wd if p < 0 then p = 0 end ovt{"paste", p, y, "bg"..y} d = d + 1 end ov("update") while g.millisecs() - t < 15 do end end for y = 0, ht, 8 do ov("delete bg"..y) end -- thursday: as if by magic elseif day == 4 then ovt{"paste", 0, 0, "fg"} ov("copy 0 0 "..wd.." "..ht.." blend") for a = 0, 255, 5 do t = g.millisecs() ov("blend 0") ovt{"paste", 0, 0, "bg"} ov("blend 1") ovt{"rgba", 0, 0, 0, a} ov("target blend") ov("replace *r *g *b *") ov("target") ovt{"paste", 0, 0, "blend"} ov("update") while g.millisecs() - t < 15 do end end ov("delete blend") -- friday: you spin me round elseif day == 5 then local x, y, r local deg2rad = 57.3 for a = 0, 360, 6 do t = g.millisecs() r = wd / 360 * a x = floor(r * sin(a / deg2rad)) y = floor(r * cos(a / deg2rad)) ovt{"paste", 0, 0, "fg"} ovt{"paste", x, y, "bg"} ov("update") while g.millisecs() - t < 15 do end end -- saturday: through the square window elseif day == 6 then for x = 1, wd / 2, 4 do t = g.millisecs() local y = x * (ht / wd) ov("blend 0") ovt{"paste", 0, 0, "bg"} ovt{"rgba", 0, 0, 0, 0} ovt{"fill", floor(wd / 2 - x), floor(ht / 2 - y), (x * 2), floor(y * 2)} ov("copy 0 0 "..wd.." "..ht.." trans") ovt{"paste", 0, 0, "fg"} ov("blend 1") ovt{"paste", 0, 0, "trans"} ov("update") while g.millisecs() - t < 15 do end end ov("delete trans") -- sunday: people in glass houses elseif day == 7 then local box = {} local n = 1 local tx, ty for y = 0, ht, 16 do for x = 0, wd, 16 do tx = x + rand(0, floor(wd / 8)) - wd / 16 ty = ht + rand(0, floor(ht / 2)) local entry = {} entry[1] = x entry[2] = y entry[3] = tx entry[4] = ty box[n] = entry ov("copy "..x.." "..y.." 16 16 sprite"..n) n = n + 1 end end for i = 0, 100 do t = g.millisecs() local a = i / 100 local x, y ovt{"paste", 0, 0, "fg"} for j = 1, #box do x = box[j][1] y = box[j][2] tx = box[j][3] ty = box[j][4] ovt{"paste", floor(x * (1 - a) + tx * a), floor(y * (1 - a) + ty * a), "sprite"..j} end ov("update") while g.millisecs() - t < 15 do end end for i = 1, #box do ov("delete sprite"..i) end -- bonus day: objects in the mirror are closer than they appear elseif day == 8 then for x = 1, 100 do t = g.millisecs() ovt{"paste", 0, 0, "bg"} ov("scale best "..floor(wd / 2 - ((wd / 2) * x / 100)).." "..floor(ht / 2 - ((ht / 2) * x / 100)).." "..floor(wd * x / 100).." "..floor(ht * x / 100).." fg") ov("update") while g.millisecs() - t < 15 do end end end -- next day day = day + 1 if day == 9 then day = 1 end ovt{"paste", 0, 0, "fg"} ov("update") pause = 300 if repeat_test(" using a different transition", false) then goto restart end -- restore settings ov("blend "..oldblend) ov("font "..oldfont) ov("delete fg") ov("delete bg") end -------------------------------------------------------------------------------- local curs = 0 local function test_cursors() ::restart:: local cmd curs = curs + 1 if curs == 1 then cmd = "cursor pencil" end if curs == 2 then cmd = "cursor pick" end if curs == 3 then cmd = "cursor cross" end if curs == 4 then cmd = "cursor hand" end if curs == 5 then cmd = "cursor zoomin" end if curs == 6 then cmd = "cursor zoomout" end if curs == 7 then cmd = "cursor arrow" end if curs == 8 then cmd = "cursor current" end if curs == 9 then cmd = "cursor wait" end if curs == 10 then cmd = "cursor hidden" curs = 0 end ov(cmd) ov(op.white) ovt{"fill"} -- create a transparent hole ovt{"rgba", 0, 0, 0, 0} ovt{"fill", 100, 100, 100, 100} if cmd == "cursor current" then cmd = cmd.."\n\n".."The overlay cursor matches Golly's current cursor." else cmd = cmd.."\n\n".."The overlay cursor will change to Golly's current cursor\n".. "if it moves outside the overlay or over a transparent pixel:" end ov(op.black) demotext(10, 10, cmd) if repeat_test(" using a different cursor", true) then goto restart end curs = 0 end -------------------------------------------------------------------------------- local pos = 0 local function test_positions() ::restart:: pos = pos + 1 if pos == 1 then ov("position topleft") end if pos == 2 then ov("position topright") end if pos == 3 then ov("position bottomright") end if pos == 4 then ov("position bottomleft") end if pos == 5 then ov("position middle") pos = 0 end ov(op.white) ovt{"fill"} ovt{"rgba", 0, 0, 255, 128} ovt{"fill", 1, 1, -2, -2} local text = [[The overlay can be positioned in the middle of the current layer, or at any corner.]] local oldfont = ov(demofont) local oldblend = ov("blend 1") local w, h local fontsize = 30 ov(op.white) -- reduce fontsize until text nearly fills overlay width repeat fontsize = fontsize - 1 ov("font "..fontsize) w, h = maketext(text) until w <= wd - 10 ov(op.black) maketext(text, "shadow") local x = int((wd - w) / 2) local y = int((ht - h) / 2) pastetext(x+2, y+2, op.identity, "shadow") pastetext(x, y) ov("blend "..oldblend) ov("font "..oldfont) if repeat_test(" using a different position") then goto restart end pos = 0 end -------------------------------------------------------------------------------- local replace = 1 local replacements = { [1] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace 255 0 0 255", desc = "replace red pixels with yellow" }, [2] = { col = {"rgba", 255, 255, 0, 128}, cmd = "replace 0 0 0 255", desc = "replace black with semi-transparent yellow" }, [3] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace !255 0 0 255", desc = "replace non-red pixels with yellow" }, [4] = { col = {}, cmd = "replace *g *r *# *#", desc = "swap red and green components" }, [5] = { col = {"rgba", 0, 0, 0, 128}, cmd = "replace *# *# *# *", desc = "make all pixels semi-transparent" }, [6] = { col = {}, cmd = "replace *r- *g- *b- *#", desc = "invert clip r g b components" }, [7] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace 255 0 0 255-64", desc = "replace red pixels with rgba -64 alpha" }, [8] = { col = {}, cmd = "replace *# *# *# *#-", desc = "make transparent pixels opaque and vice versa" }, [9] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace * * * !255", desc = "replace non-opaque pixels with yellow" }, [10] = { col = {"rgba", 255, 255, 255, 255}, cmd = "replace *a *a *a *", desc = "convert alpha to grayscale" }, [11] = { col = {}, cmd = "replace *a *b *g *r", desc = "convert RGBA to ABGR" }, [12] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace 0 255 0 !255", desc = "replace non-opaque green with yellow" }, [13] = { col = {"rgba", 255, 255, 0, 255}, cmd = "replace * * * *", desc = "fill (replace any pixel with yellow)" }, [14] = { col = {}, cmd = "replace *# *# *# *#", desc = "no-op (replace pixels with clip pixels)" }, [15] = { col = {"rgba", 0, 0, 0, 128}, cmd = "replace *# *# *# *", desc = "make whole overlay semi-transparent", overlay = true }, [16] = { col = {}, cmd = "replace *#+64 *#+64 *#+64 *#", desc = "make pixels brighter" }, [17] = { col = {}, cmd = "replace *# *# *# *#-64", desc = "make pixels more transparent" }, [18] = { col = {}, cmd = "replace *#++ *#++ *#++ *#", desc = "fade to white using increment", overlay = true, loop = true }, [19] = { col = {}, cmd = "replace *#-4 *#-4 *#-4 *#", desc = "fast fade to black", overlay = true, loop = true } } local function test_replace() ::restart:: -- create clip local _ local oldblend = ov("blend 0") ovt{"rgba", 0, 0, 0, 0} ovt{"fill"} ov("blend 1") ov(op.black) ovt{"fill", 20, 20, 192, 256} ov(op.red) ovt{"fill", 84, 84, 128, 128} ov(op.blue) ovt{"fill", 148, 148, 64, 64} ovt{"rgba", 0, 255, 0, 128} ovt{"fill", 64, 64, 104, 104} ovt{"rgba", 255, 255, 255, 64} ovt{"fill", 212, 20, 64, 64} ovt{"rgba", 255, 255, 255, 128} ovt{"fill", 212, 84, 64, 64} ovt{"rgba", 255, 255, 255, 192} ovt{"fill", 212, 148, 64, 64} ovt{"rgba", 255, 255, 255, 255} ovt{"fill", 212, 212, 64, 64} ov("blend 0") ovt{"rgba", 255, 255, 0, 0} ovt{"fill", 84, 212, 64, 64} ovt{"rgba", 0, 255, 0, 128} ovt{"fill", 20, 212, 64, 64} ov("blend 1") ov(op.white) ovt{"line", 20, 20, 275, 20, 275, 275, 20, 275, 20, 20} ov("copy 20 20 256 256 clip") -- create the background with some text local oldfont = ov("font 24 mono") ovt{"rgba", 0, 0, 192, 255} ovt{"fill"} ovt{"rgba", 192, 192, 192, 255} local w, h = maketext("Golly") ov("blend 1") for y = 0, ht - 70, h do for x = 0, wd, w do pastetext(x, y) end end -- draw the clip ovt{"paste", 20, 20, "clip"} -- replace clip local drawcol = replacements[replace].col local replacecmd = replacements[replace].cmd if #drawcol ~= 0 then -- set RGBA color ovt(drawcol) end -- execute replace and draw clip local replaced local t1 = g.millisecs() if replacements[replace].overlay ~= true then ov("target clip") end if replacements[replace].loop == true then -- copy overlay to bigclip ov("copy 0 0 0 0 bigclip") replaced = 1 local count = 0 while replaced > 0 do local t = g.millisecs() count = count + 1 -- replace pixels in bigclip ov("target bigclip") replaced = tonumber(ov(replacecmd)) -- paste bigclip to the overlay ov("target") ovt{"paste", 0, 0, "bigclip"} -- draw test number over the bigclip ov("blend 1") ovt{"rgba", 0, 0, 0, 192} ovt{"fill", 0, 300, wd, 144} -- draw test name ov("font 14 mono") ov(op.white) local testname = "Test "..replace..": "..replacements[replace].desc w, _ = maketext(testname, nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 310) ov("font 22 mono") if #drawcol ~= 0 then ov(op.yellow) w, _ = maketext(table.concat(drawcol, " "), nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 340) end ov(op.yellow) w, _ = maketext(replacecmd, nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 390) -- update display g.show("Test "..replace..": pixels replaced in step "..count..": "..replaced) ov("update") while g.millisecs() - t < 15 do end end else replaced = tonumber(ov(replacecmd)) end t1 = g.millisecs() - t1 ov("target ") if replacements[replace].overlay ~= true then ovt{"paste", (wd - 276), 20, "clip"} end -- draw replacement text background if replacements[replace].loop ~= true then ov("blend 1") ovt{"rgba", 0, 0, 0, 192} ovt{"fill", 0, 300, wd, 144} -- draw test name ov("font 14 mono") ov(op.white) local testname = "Test "..replace..": "..replacements[replace].desc w, _ = maketext(testname, nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 310) -- draw test commands ov("font 22 mono") if #drawcol ~= 0 then ov(op.yellow) w, _ = maketext(table.concat(drawcol, " "), nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 340) end ov(op.yellow) w, _ = maketext(replacecmd, nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 390) end -- restore settings ov("blend "..oldblend) ov("font "..oldfont) -- display elapsed time if replacements[replace].loop ~= true then g.show("Time to replace: "..ms(t1).." Pixels replaced: "..replaced) else g.show("Time to replace: "..ms(t1)) end -- next replacement replace = replace + 1 if replace > #replacements then replace = 1 end if repeat_test(" with different options") then goto restart end ov("target") end -------------------------------------------------------------------------------- local function test_copy_paste() ::restart:: local t1 = g.millisecs() -- tile the overlay with a checkerboard pattern local sqsize = rand(5, 300) local tilesize = sqsize * 2 -- create the 1st tile (2x2 squares) in the top left corner ov(op.white) ovt{"fill", 0, 0, tilesize, tilesize} ov(op.red) ovt{"fill", 1, 1, (sqsize-1), (sqsize-1)} ovt{"fill", (sqsize+1), (sqsize+1), (sqsize-1), (sqsize-1)} ov(op.black) ovt{"fill", (sqsize+1), 1, (sqsize-1), (sqsize-1)} ovt{"fill", 1, (sqsize+1), (sqsize-1), (sqsize-1)} ov("copy 0 0 "..tilesize.." "..tilesize.." tile") -- tile the top row for x = tilesize, wd, tilesize do ovt{"paste", x, 0, "tile"} end -- copy the top row and use it to tile the remaining rows ov("copy 0 0 "..wd.." "..tilesize.." row") for y = tilesize, ht, tilesize do ovt{"paste", 0, y, "row"} end ov("delete tile") ov("delete row") g.show("Time to test copy and paste: "..ms(g.millisecs()-t1)) if repeat_test(" with different sized tiles") then goto restart end end -------------------------------------------------------------------------------- local function bezierx(t, x0, x1, x2, x3) local cX = 3 * (x1 - x0) local bX = 3 * (x2 - x1) - cX local aX = x3 - x0 - cX - bX -- compute x position local x = (aX * math.pow(t, 3)) + (bX * math.pow(t, 2)) + (cX * t) + x0 return x end -------------------------------------------------------------------------------- local themenum = 1 local function test_cellview() -- create a new layer g.addlayer() extra_layer = true g.setalgo("QuickLife") g.setrule("b3/s23") -- resize overlay to cover entire layer wd, ht = g.getview( g.getlayer() ) ov("resize "..wd.." "..ht) ov("position topleft") -- create a new layer with 50% random fill local size = 512 g.select( {0, 0, size, size} ) g.randfill(50) g.select( {} ) -- save settings local oldblend = ov("blend 0") local oldalign = ov("textoption align left") -- create text clips local exitclip = "exit" local oldfont = ov("font 16 roman") local exitw = maketext("Click or press any key to return to the main menu.", exitclip, op.white, 2, 2) ov("blend 1") -- create a cellview (width and height must be multiples of 16) local w16 = size & ~15 local h16 = size & ~15 ov("cellview 0 0 "..w16.." "..h16) -- set the theme ov(op.themes[themenum]) themenum = themenum + 1 if themenum > #op.themes then themenum = 0 end -- initialize the camera local angle = 0 local zoom = 6 local x = size / 2 local y = size / 2 local depth = 0 local startangle = angle local startzoom = zoom local startx = x local starty = y local startdepth = depth local targetangle = angle local targetzoom = zoom local targetx = x local targety = y local targetdepth = depth local anglesteps = 600 local zoomsteps = 400 local xysteps = 200 local depthsteps = 800 local anglestep = 0 local zoomstep = 0 local xystep = 0 local depthstep = 0 local firstdepth = true local firstxy = true local firstangle = true local firstzoom = true -- create the world view clip local worldsize = 256 ov("create "..worldsize.." "..worldsize.." world") -- animate the cells local running = true while running do local t1 = g.millisecs() tstart("frame") -- check for resize local newwd, newht = g.getview(g.getlayer()) if newwd ~= wd or newht ~= ht then -- resize overlay if newwd < 1 then newwd = 1 end if newht < 1 then newht = 1 end -- save new size wd = newwd ht = newht -- resize overlay ov("resize "..wd.." "..ht) end -- stop when key pressed or mouse button clicked local event = g.getevent() if event == "key f11 none" then g.doevent(event) else if event:find("^key") or event:find("^oclick") then running = false end end -- next generation tstart("run") g.run(1) tsave("run") -- update cell view from pattern tstart("cells") ov("updatecells") tsave("cells") -- set the camera ov("camera angle "..angle) ov("camera zoom "..zoom) ov("camera xy "..x.." "..y) -- set the layer depth and number of layers ov("celloption depth "..depth) ov("celloption layers 6") -- update the camera zoom if zoomstep == zoomsteps then zoomstep = 0 zoomsteps = rand(600, 800) startzoom = zoom if rand() > 0.25 or firstzoom then targetzoom = rand(2, 10) firstzoom = false else targetzoom = startzoom end else zoom = startzoom + bezierx(zoomstep / zoomsteps, 0, 0, 1, 1) * (targetzoom - startzoom) zoomstep = zoomstep + 1 end -- update the camera angle if anglestep == anglesteps then anglestep = 0 anglesteps = rand(600, 800) startangle = angle if rand() > 0.25 or firstangle then targetangle = rand(0, 359) firstangle = false else targetangle = startangle end else angle = startangle + bezierx(anglestep / anglesteps, 0, 0, 1, 1) * (targetangle - startangle) anglestep = anglestep + 1 end -- update the camera position if xystep == xysteps then xystep = 0 xysteps = rand(1000, 1200) startx = x starty = y if rand() > 0.25 or firstxy then targetx = rand(0, w16 - 1) targety = rand(0, h16 - 1) firstxy = false else targetx = startx targety = starty end else x = startx + bezierx(xystep / xysteps, 0, 0, 1, 1) * (targetx - startx) y = starty + bezierx(xystep / xysteps, 0, 0, 1, 1) * (targety - starty) xystep = xystep + 1 end -- update the layer depth if depthstep == depthsteps then depthstep = 0 depthsteps = rand(600, 800) startdepth = depth if rand() > 0.5 or firstdepth then targetdepth = rand() firstdepth = false else targetdepth = 0 end else depth = startdepth + bezierx(depthstep / depthsteps, 0, 0, 1, 1) * (targetdepth - startdepth) depthstep = depthstep + 1 end -- draw the cell view tstart("drawcells") ov("blend 0") ov("drawcells") tsave("drawcells") -- draw the world view ov("target world") ov("camera angle 0") ov("camera zoom 1") ov("camera xy "..floor(size / 2).." "..floor(size / 2)) ov("celloption layers 1") tstart("worldcells") ov("drawcells") tsave("worldcells") ovt{"rgba", 128, 128, 128, 255} ovt{"line", 0, 0, (worldsize - 1), 0} ovt{"line", 0, 0, 0, (worldsize - 1)} ov("target") ovt{"paste", (wd - worldsize), (ht - worldsize), "world"} -- draw exit message ov("blend 1") pastetext(floor((wd - exitw) / 2), 20, op.identity, exitclip) tsave("frame") g.show("Time to test cellview: "..tvalueall(2)) -- update the overlay ov("update") while g.millisecs() - t1 < 15 do end end -- free clips ov("delete world") ov("delete "..exitclip) -- restore settings ov("textoption align "..oldalign) ov("font "..oldfont) ov("blend "..oldblend) -- delete the layer g.dellayer() extra_layer = false return_to_main_menu = true end -------------------------------------------------------------------------------- local loaddir = g.getdir("app").."Help/images/" local function test_scale() local loaded = false local iw, ih local quality = "best" local minscale = 0.1 local maxscale = 8.0 local scale = 1.0 -- no scaling ::restart:: ov(op.yellow) ovt{"fill"} local text = "Hit the space bar to load another image.\n" if g.os() == "Mac" then text = text.."Click or hit the return key to return to the main menu." else text = text.."Click or hit the enter key to return to the main menu." end local oldfont = ov(demofont) local oldblend = ov("blend 1") ov(op.black) local _, h = maketext(text) pastetext(10, ht - 10 - h) maketext("Hit [ to scale down, ] to scale up, 1 to reset scale to 1.0, Q to toggle quality.") pastetext(10, 10) ov("font "..oldfont) if not loaded then -- prompt user to load a BMP/GIF/PNG/TIFF file g.update() local filetypes = "Image files (*.bmp;*.gif;*.png;*.tiff)|*.bmp;*.gif;*.png;*.tiff" local filepath = g.opendialog("Load an image file", filetypes, loaddir, "") if #filepath > 0 then -- update loaddir by stripping off the file name local pathsep = g.getdir("app"):sub(-1) loaddir = filepath:gsub("[^"..pathsep.."]+$","") -- center image in overlay by first loading the file completely outside it -- so we get the image dimensions without changing the overlay local imgsize = ov("load "..wd.." "..ht.." "..filepath) iw, ih = split(imgsize) iw = tonumber(iw) ih = tonumber(ih) -- now load image into a clip ov("create "..iw.." "..ih.." img") ov("target img") ov("load 0 0 "..filepath) ov("target") loaded = true end end if loaded then -- draw image at current scale local scaledw = int(iw*scale+0.5) local scaledh = int(ih*scale+0.5) local x = int((wd-scaledw)/2+0.5) local y = int((ht-scaledh)/2+0.5) local t1 = g.millisecs() ov("scale "..quality.." "..x.." "..y.." "..scaledw.." "..scaledh.." img") g.show("Image width and height: "..scaledw.." "..scaledh.. " scale: "..scale.." quality: "..quality.." time: "..ms(g.millisecs()-t1)) end ov("blend "..oldblend) g.update() while true do local event = g.getevent() if event == "key space none" then loaded = false scale = 1.0 goto restart elseif event == "key [ none" or event:find("^ozoomout") then if scale > minscale then scale = scale - 0.1 if scale < minscale then scale = minscale end goto restart end elseif event == "key ] none" or event:find("^ozoomin") then if scale < maxscale then scale = scale + 0.1 if scale > maxscale then scale = maxscale end goto restart end elseif event == "key 1 none" then scale = 1.0 goto restart elseif event == "key q none" then if quality == "fast" then quality = "best" else quality = "fast" end goto restart elseif event:find("^oclick") or event == "key return none" then return_to_main_menu = true return elseif #event > 0 then g.doevent(event) end end end -------------------------------------------------------------------------------- local savedir = g.getdir("data") local function test_save() ::restart:: -- create gradient from one random pale color to another local r1, g1, b1, r2, g2, b2 repeat r1 = rand(128,255) g1 = rand(128,255) b1 = rand(128,255) r2 = rand(128,255) g2 = rand(128,255) b2 = rand(128,255) until abs(r1-r2) + abs(g1-g2) + abs(b1-b2) > 128 local rfrac = (r2 - r1) / ht local gfrac = (g2 - g1) / ht local bfrac = (b2 - b1) / ht for y = 0, ht-1 do local rval = int(r1 + y * rfrac + 0.5) local gval = int(g1 + y * gfrac + 0.5) local bval = int(b1 + y * bfrac + 0.5) ovt{"rgba", rval, gval, bval, 255} ovt{"line", 0, y, wd, y} end -- create a transparent hole in the middle ovt{"rgba", 0, 0, 0, 0} ovt{"fill", int((wd-100)/2), int((ht-100)/2), 100, 100} g.update() -- prompt for file name and location local pngpath = g.savedialog("Save overlay as PNG file", "PNG (*.png)|*.png", savedir, "overlay.png") if #pngpath > 0 then -- save overlay in given file ov("save 0 0 "..wd.." "..ht.." "..pngpath) g.show("Overlay was saved in "..pngpath) -- update savedir by stripping off the file name local pathsep = g.getdir("app"):sub(-1) savedir = pngpath:gsub("[^"..pathsep.."]+$","") end if repeat_test(" and save a different overlay", true) then goto restart end end -------------------------------------------------------------------------------- local function test_set() local maxx = wd - 1 local maxy = ht - 1 local flakes = 10000 -- create the exit message local oldfont = ov(demofont) local text if g.os() == "Mac" then text = "Click or hit the return key to return to the main menu." else text = "Click or hit the enter key to return to the main menu." end local w, h = maketext(text, nil, op.white, 2, 2) -- create the golly text in yellow (which has no blue component for r g b) ov("font 100 mono") ov(op.yellow) local gw, gh = maketext("Golly", "gollyclip") -- fill the background with graduated blue to black local oldblend = ov("blend 0") local c for i = 0, ht - 1 do c = 128 * i // ht ovt{"rgba", 0, 0, c, 255} ovt{"line", 0, i, (wd - 1), i} end -- draw golly text ov("blend 1") local texty = ht - gh - h pastetext((wd - gw) // 2, texty, op.identity, "gollyclip") -- create the background clip ov("copy 0 0 "..wd.." "..ht.." bg") ov("update") -- read the screen local fullrow = {} for j = 0, wd -1 do fullrow[j] = true end local screen = {} for i = 0, ht - 1 do local row = {} if i < texty or i > texty + gh then -- ignore rows outside Golly text clip rows row = {table.unpack(fullrow)} else for j = 0, wd - 1 do -- ignore pixels that don't have a red component row[j] = (ovt{"get", j, i} == 0) end end screen[i] = row end -- initialize flake positions local yrange = 20 * maxy local maxpos = -yrange local x = {} local y = {} local dy = {} for i = 1, flakes do x[i] = rand(0, maxx) local yval = 0 for _ = 1, 10 do yval = yval + rand(0, yrange) end y[i] = -(yval // 10) if y[i] > maxpos then maxpos = y[i] end dy[i] = rand() / 5 + 0.8 end for i = 1, flakes do y[i] = y[i] - maxpos end -- initialize the drawing command (will have pixel coordinates added during update) local xy = {"set"} -- set white for flake colour ov(op.white) -- loop until key pressed or mouse clicked while not return_to_main_menu do tstart("frame") local event = g.getevent() if event:find("^oclick") or event == "key return none" then -- return to main menu return_to_main_menu = true end -- draw the background local t1 = g.millisecs() tstart("background") ov("blend 0") ovt{"paste", 0, 0, "bg"} tsave("background") -- update the pixel positions tstart("update") local lastx, lasty, newx, newy, diry -- index into drawing command for coordinates starts after "set" keyword local m = 2 -- no need to clear the coordinate list each frame since pixels are -- only ever added so it can be safely reused for i = 1, flakes do lastx = x[i] lasty = y[i] diry = dy[i] newx = lastx newy = lasty if lasty >= 0 and lasty < ht - 1 then if lasty // 1 == (lasty + diry) // 1 then newy = lasty + diry else if screen[(lasty + diry) // 1][lastx] then newy = lasty + diry else local r = rand() if r < 0.05 then local dx = 1 if r < 0.025 then dx = -1 end if lastx + dx >= 0 and lastx + dx < wd then if screen[(lasty + diry) // 1][lastx + dx] then newx = lastx + dx newy = lasty + diry end end end end screen[lasty // 1][lastx] = true screen[newy // 1][newx] = false end elseif lasty < 0 then newy = lasty + diry end x[i] = newx y[i] = newy if newy >= 0 and newy < ht then -- add pixel coordinates to list for drawing xy[m] = newx xy[m + 1] = newy m = m + 2 end end tsave("update") -- check if there are pixels to draw if m > 2 then tstart("draw") ovt(xy) tsave("draw") end -- draw the exit message ov("blend 1") pastetext((wd - w) // 2, 10) -- display elapsed time tsave("frame") local drawn = (m - 2) // 2 g.show("Time for "..drawn.." pixels: "..tvalueall(2)) -- wait for frame time while g.millisecs() - t1 < 15 do end -- update display ov("update") end -- free clips and restore settings ov("delete gollyclip") ov("delete bg") ov("blend "..oldblend) ov("font "..oldfont) end -------------------------------------------------------------------------------- local function dot(x, y) local oldrgba = ov(op.green) ovt{"set", x, y} ov("rgba "..oldrgba) end -------------------------------------------------------------------------------- local function draw_rect(x0, y0, x1, y1) local oldrgba = ov(op.red) local oldwidth = ov("lineoption width 1") ovt{"line", x0, y0, x1, y0, x1, y1, x0, y1, x0, y0} ov("rgba "..oldrgba) ov("lineoption width "..oldwidth) end -------------------------------------------------------------------------------- local function draw_ellipse(x, y, w, h) ov("ellipse "..x.." "..y.." "..w.." "..h) -- enable next call to check that ellipse is inside given rectangle --draw_rect(x, y, x+w-1, y+h-1) end -------------------------------------------------------------------------------- local function radial_lines(x0, y0, length) draw_line(x0, y0, x0+length, y0) draw_line(x0, y0, x0, y0+length) draw_line(x0, y0, x0, y0-length) draw_line(x0, y0, x0-length, y0) for angle = 15, 75, 15 do local rad = angle * math.pi/180 local xd = int(length * cos(rad)) local yd = int(length * sin(rad)) draw_line(x0, y0, x0+xd, y0+yd) draw_line(x0, y0, x0+xd, y0-yd) draw_line(x0, y0, x0-xd, y0+yd) draw_line(x0, y0, x0-xd, y0-yd) end end -------------------------------------------------------------------------------- local function vertical_lines(x, y) local oldwidth = ov("lineoption width 1") local len = 30 local gap = 15 for w = 1, 7 do ov("lineoption width "..w) draw_line(x, y, x, y+len) dot(x,y) dot(x,y+len) x = x+gap end ov("lineoption width "..oldwidth) end -------------------------------------------------------------------------------- local function diagonal_lines(x, y) local oldwidth = ov("lineoption width 1") local len = 30 local gap = 15 for w = 1, 7 do ov("lineoption width "..w) draw_line(x, y, x+len, y+len) dot(x,y) dot(x+len,y+len) x = x+gap end ov("lineoption width "..oldwidth) end -------------------------------------------------------------------------------- local function nested_ellipses(x, y) -- start with a circle local w = 91 local h = 91 draw_ellipse(x, y, w, h) for i = 1, 3 do draw_ellipse(x-i*10, y-i*15, w+i*20, h+i*30) draw_ellipse(x+i*10, y+i*15, w-i*20, h-i*30) end end -------------------------------------------------------------------------------- local function show_magnified_pixels(x, y) local radius = 5 local numcols = radius*2+1 local numrows = numcols local magsize = 14 local boxsize = (1+magsize)*numcols+1 -- get pixel colors local color = {} for i = 1, numrows do color[i] = {} for j = 1, numcols do color[i][j] = ov("get "..(x-radius-1+j).." "..(y-radius-1+i)) end end -- save area in top left corner big enough to draw the magnifying glass local outersize = int(math.sqrt(boxsize*boxsize+boxsize*boxsize) + 0.5) ov("copy 0 0 "..outersize.." "..outersize.." outer_bg") local oldrgba = ov("rgba 0 0 0 0") local oldblend = ov("blend 0") ov("fill 0 0 "..outersize.." "..outersize) -- draw gray background (ie. grid lines around pixels) ov(op.gray) local xpos = int((outersize-boxsize)/2) local ypos = int((outersize-boxsize)/2) ov("fill "..xpos.." "..ypos.." "..boxsize.." "..boxsize) -- draw magnified pixels for i = 1, numrows do for j = 1, numcols do if #color[i][j] > 0 then ov("rgba "..color[i][j]) local xv = xpos+1+(j-1)*(magsize+1) local yv = ypos+1+(i-1)*(magsize+1) ov("fill "..xv.." "..yv.." "..magsize.." "..magsize) end end end -- erase outer ring local oldwidth = ov("lineoption width "..int((outersize-boxsize)/2)) ov("rgba 0 0 0 0") draw_ellipse(0, 0, outersize, outersize) -- surround with a gray circle ov(op.gray) ov("lineoption width 4") ov("blend 1") draw_ellipse(xpos-2, ypos-2, boxsize+4, boxsize+4) ov("blend 0") ov("copy 0 0 "..outersize.." "..outersize.." mag_box") -- restore background saved above ov("paste 0 0 outer_bg") ov("delete outer_bg") -- draw magnified circle with center at x,y xpos = int(x-outersize/2) ypos = int(y-outersize/2) ov("blend 1") ov("paste "..xpos.." "..ypos.." mag_box") ov("delete mag_box") -- restore settings ov("rgba "..oldrgba) ov("blend "..oldblend) ov("lineoption width "..oldwidth) end -------------------------------------------------------------------------------- local function test_lines() -- this test requires a bigger overlay local owd = 800 local oht = 600 ov("resize "..owd.." "..oht) ov(op.white) ovt{"fill"} ov(op.black) local oldblend = ov("blend 0") local oldwidth = ov("lineoption width 1") local _ -- non-antialiased lines (line width = 1) radial_lines(80, 90, 45) -- antialiased lines ov("blend 1") radial_lines(200, 90, 45) ov("blend 0") -- thick non-antialiased lines (line width = 2) ov("lineoption width 2") radial_lines(80, 190, 45) -- thick antialiased lines ov("blend 1") radial_lines(200, 190, 45) ov("blend 0") -- thick non-antialiased lines (line width = 3) ov("lineoption width 3") radial_lines(80, 290, 45) -- thick antialiased lines ov("blend 1") radial_lines(200, 290, 45) ov("blend 0") -- non-antialiased lines with increasing thickness vertical_lines(30, 350) diagonal_lines(30, 390) -- antialiased lines with increasing thickness ov("blend 1") vertical_lines(150, 350) diagonal_lines(150, 390) ov("blend 0") -- non-antialiased ellipses (line width = 1) ov("lineoption width 1") nested_ellipses(350, 90) -- antialiased ellipses (line width = 1) ov("blend 1") nested_ellipses(520, 90) ov("blend 0") -- thick non-antialiased ellipses ov("lineoption width 3") nested_ellipses(350, 290) -- thick antialiased ellipses ov("blend 1") nested_ellipses(520, 290) ov("blend 0") ov("lineoption width 1") -- test overlapping translucent colors ov("blend 1") ov("lineoption width 20") local oldrgba = ov("rgba 0 255 0 128") draw_ellipse(50, 450, 100, 100) ovt{"rgba", 255, 0, 0, 128} draw_line(50, 450, 150, 550) ovt{"rgba", 0, 0, 255, 128} draw_line(150, 450, 50, 550) ov("blend 0") ov("lineoption width 1") ov("rgba "..oldrgba) -- draw filled ellipses using fill_ellipse function from oplus -- (no border if given border width is 0) op.fill_ellipse(370, 450, 50, 100, 0, "rgba 0 0 255 128") ovt{"rgba", 200, 200, 200, 128} -- translucent gray border op.fill_ellipse(300, 450, 100, 80, 15, op.green) ov("rgba "..oldrgba) op.fill_ellipse(200, 450, 140, 99, 2, "rgba 255 255 0 128") -- draw rounded rectangles using round_rect function from oplus op.round_rect(670, 50, 60, 40, 10, 3, "") op.round_rect(670, 100, 60, 40, 20, 0, "rgba 0 0 255 128") op.round_rect(670, 150, 60, 21, 3, 0, op.blue) ovt{"rgba", 200, 200, 200, 128} -- translucent gray border op.round_rect(700, 30, 70, 200, 35, 10, "rgba 255 255 0 128") ov("rgba "..oldrgba) -- draw some non-rounded rectangles (radius is 0) op.round_rect(670, 200, 10, 8, 0, 3, "") op.round_rect(670, 210, 10, 8, 0, 1, op.red) op.round_rect(670, 220, 10, 8, 0, 0, op.green) op.round_rect(670, 230, 10, 8, 0, 0, "") -- nothing is drawn -- draw solid circles (non-antialiased and antialiased) ov("lineoption width 10") draw_ellipse(450, 500, 20, 20) ov("blend 1") draw_ellipse(480, 500, 20, 20) ov("blend 0") ov("lineoption width 1") -- draw solid ellipses (non-antialiased and antialiased) ov("lineoption width 11") draw_ellipse(510, 500, 21, 40) ov("blend 1") draw_ellipse(540, 500, 21, 40) ov("blend 0") ov("lineoption width 1") -- create a circular hole with fuzzy edges ovt{"rgba", 255, 255, 255, 0} ov("blend 0") ov("lineoption width 25") local x, y, w, h = 670, 470, 50, 50 draw_ellipse(x, y, w, h) ov("lineoption width 1") local a = 0 for _ = 1, 63 do a = a + 4 ovt{"rgba", 255, 255, 255, a} -- we need to draw 2 offset ellipses to ensure all pixels are altered x = x-1 w = w+2 draw_ellipse(x, y, w, h) y = y-1 h = h+2 draw_ellipse(x, y, w, h) end ov("lineoption width 1") ov("rgba "..oldrgba) -- create and draw the exit message local oldfont = ov(demofont) ov("blend 1") local text if g.os() == "Mac" then text = "Click or hit the return key to return to the main menu." else text = "Click or hit the enter key to return to the main menu." end ov(op.black) _, h = maketext(text) pastetext(10, oht - h - 10) maketext("Hit the M key to toggle the magnifying glass.") pastetext(10, 10) ov("font "..oldfont) g.update() ov("blend 0") ov("copy 0 0 0 0 bg") local showing_magnifier = false local display_magnifier = true local prevx, prevy -- loop until enter/return key pressed or mouse clicked while true do local event = g.getevent() if event:find("^oclick") or event == "key return none" then -- tidy up and return to main menu ov("blend "..oldblend) ov("lineoption width "..oldwidth) ov("delete bg") return_to_main_menu = true return elseif event == "key m none" then -- toggle magnifier display_magnifier = not display_magnifier if showing_magnifier and not display_magnifier then ovt{"paste", 0, 0, "bg"} g.show("") g.update() showing_magnifier = false elseif display_magnifier and not showing_magnifier then -- force it to appear if mouse is in overlay prevx = -1 end else -- might be a keyboard shortcut g.doevent(event) end -- track mouse and magnify pixels under cursor local xy = ov("xy") if #xy > 0 then local xv, yv = split(xy) xv = tonumber(xv) yv = tonumber(yv) if xv ~= prevx or yv ~= prevy then prevx = xv prevy = yv ovt{"paste", 0, 0, "bg"} if display_magnifier then -- first show position and color of x,y pixel in status bar g.show("xy: "..xv.." "..yv.." rgba: "..ov("get "..xv.." "..yv)) show_magnified_pixels(xv, yv) g.update() showing_magnifier = true end end elseif showing_magnifier then ovt{"paste", 0, 0, "bg"} g.show("") g.update() showing_magnifier = false end end end -------------------------------------------------------------------------------- local function test_multiline_text() ::restart:: -- resize overlay to cover entire layer wd, ht = g.getview( g.getlayer() ) ov("resize "..wd.." "..ht) local oldfont = ov("font 10 mono-bold") -- use a mono-spaced font -- draw solid background local oldblend = ov("blend 0") ov(op.blue) ovt{"fill"} local textstr = [[ "To be or not to be, that is the question; Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing, end them. To die, to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to — 'tis a consummation Devoutly to be wish'd. To die, to sleep; To sleep, perchance to dream. Ay, there's the rub, For in that sleep of death what dreams may come, When we have shuffled off this mortal coil, Must give us pause. There's the respect That makes calamity of so long life, For who would bear the whips and scorns of time, Th'oppressor's wrong, the proud man's contumely, The pangs of despised love, the law's delay, The insolence of office, and the spurns That patient merit of th'unworthy takes, When he himself might his quietus make With a bare bodkin? who would fardels bear, To grunt and sweat under a weary life, But that the dread of something after death, The undiscovered country from whose bourn No traveller returns, puzzles the will, And makes us rather bear those ills we have Than fly to others that we know not of? Thus conscience does make cowards of us all, And thus the native hue of resolution Is sicklied o'er with the pale cast of thought, And enterprises of great pitch and moment With this regard their currents turn awry, And lose the name of action. Soft you now! The fair Ophelia! Nymph, In thy Orisons be all my sins remembered. Test non-ASCII: áàâäãåçéèêëíìîïñóòôöõúùûüæøœÿ ÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜÆØŒŸ ]] -- toggle the column alignments and transparency if align == "left" then align = "center" else if align == "center" then align = "right" else if align == "right" then align = "left" transbg = 2 - transbg if transbg == 2 then shadow = 1 - shadow end end end end -- set text alignment local oldalign = ov("textoption align "..align) -- set the text foreground color ov(op.white) -- set the text background color local oldbackground local transmsg if transbg == 2 then oldbackground = ov("textoption background 0 0 0 0") transmsg = "transparent background" else oldbackground = ov("textoption background 0 128 128 255") transmsg = "opaque background " end local t1 = g.millisecs() ov("blend "..transbg) -- create the text clip if shadow == 0 then maketext(textstr) else maketext(textstr, nil, nil, 2, 2) end -- paste the clip onto the overlay local t2 = g.millisecs() t1 = t2 - t1 pastetext(0, 0) -- output timing and drawing options local shadowmsg if shadow == 1 then shadowmsg = "on" else shadowmsg = "off" end g.show("Time to test multiline text: maketext "..ms(t1).. " pastetext "..ms(g.millisecs() - t2).. " align "..string.format("%-6s", align).. " "..transmsg.." shadow "..shadowmsg) -- restore old settings ov("textoption background "..oldbackground) ov("textoption align "..oldalign) ov("font "..oldfont) ov("blend "..oldblend) if repeat_test(" with different text options") then goto restart end end -------------------------------------------------------------------------------- local function test_text() ::restart:: local t1 = g.millisecs() local oldfont, oldblend, w, h, descent, nextx, _ oldblend = ov("blend 0") ov(op.white) -- white background ovt{"fill"} ov(op.black) -- black text ov("blend 1") maketext("FLIP Y") pastetext(20, 30) pastetext(20, 30, op.flip_y) maketext("FLIP X") pastetext(110, 30) pastetext(110, 30, op.flip_x) maketext("FLIP BOTH") pastetext(210, 30) pastetext(210, 30, op.flip) maketext("ROTATE CW") pastetext(20, 170) pastetext(20, 170, op.rcw) maketext("ROTATE ACW") pastetext(20, 140) pastetext(20, 140, op.racw) maketext("SWAP XY") pastetext(150, 170) pastetext(150, 170, op.swap_xy) maketext("SWAP XY FLIP") pastetext(150, 140) pastetext(150, 140, op.swap_xy_flip) oldfont = ov("font 7 default") w, h, descent = maketext("tiny") pastetext(300, 30 - h + descent) nextx = 300 + w + 5 ov("font "..oldfont) -- restore previous font w, h, descent = maketext("normal") pastetext(nextx, 30 - h + descent) nextx = nextx + w + 5 ov("font 20 default-bold") _, h, descent = maketext("Big") pastetext(nextx, 30 - h + descent) ov("font 10 default-bold") w = maketext("bold") pastetext(300, 40) nextx = 300 + w + 5 ov("font 10 default-italic") maketext("italic") pastetext(nextx, 40) ov("font 10 mono") w, h, descent = maketext("mono") pastetext(300, 80 - h + descent) nextx = 300 + w + 5 ov("font 12") -- just change font size _, h, descent = maketext("mono12") pastetext(nextx, 80 - h + descent) ov("font 10 mono-bold") maketext("mono-bold") pastetext(300, 90) ov("font 10 mono-italic") maketext("mono-italic") pastetext(300, 105) ov("font 10 roman") maketext("roman") pastetext(300, 130) ov("font 10 roman-bold") maketext("roman-bold") pastetext(300, 145) ov("font 10 roman-italic") maketext("roman-italic") pastetext(300, 160) ov("font "..oldfont) -- restore previous font ov(op.red) w, h, descent = maketext("RED") pastetext(300, 200 - h + descent) nextx = 300 + w + 5 ov(op.green) w, h, descent = maketext("GREEN") pastetext(nextx, 200 - h + descent) nextx = nextx + w + 5 ov(op.blue) _, h, descent = maketext("BLUE") pastetext(nextx, 200 - h + descent) ov(op.yellow) w, h = maketext("Yellow on black [] gjpqy") ov(op.black) ovt{"fill", 300, 210, w, h} pastetext(300, 210) ov("blend 0") ov(op.yellow) ovt{"fill", 0, 250, 100, 100} ov(op.cyan) ovt{"fill", 100, 250, 100, 100} ov(op.magenta) ovt{"fill", 200, 250, 100, 100} ovt{"rgba", 0, 0, 0, 0} ovt{"fill", 300, 250, 100, 100} ov("blend 1") ov(op.black) maketext("The quick brown fox jumps over 123 dogs.") pastetext(10, 270) ov(op.white) maketext("SPOOKY") pastetext(310, 270) oldfont = ov("font "..rand(10,150).." default-bold") ovt{"rgba", 255, 0, 0, 40} -- translucent red text w, h, descent = maketext("Golly") local gollyclip = pastetext(10, 10) -- draw box around text ovt{"line", 10, 10, (w-1+10), 10, (w+1+10), (h-1+10), 10, (h-1+10), 10, 10} -- show baseline ovt{"line", 10, (h-1+10-descent), (w-1+10), (h-1+10-descent)} -- draw minimal bounding rect over text local xoff, yoff, minwd, minht = op.minbox(gollyclip, w, h) ovt{"rgba", 0, 0, 255, 20} ovt{"fill", (xoff+10), (yoff+10), minwd, minht} -- restore blend state and font ov("blend "..oldblend) ov("font "..oldfont) ov(op.black) g.show("Time to test text: "..ms(g.millisecs()-t1)) if repeat_test(" with a different sized \"Golly\"", true) then goto restart end end -------------------------------------------------------------------------------- local function test_fill() ::restart:: ov(op.white) ovt{"fill"} toggle = toggle + 1 if toggle == 3 then toggle = 0 end ov("blend "..toggle) math.randomseed(531642) local maxx = wd-1 local maxy = ht-1 tstart() for _ = 1, 1000 do ovt{"rgba", rand(0,255), rand(0,255), rand(0,255), rand(0,255)} ovt{"fill", rand(0,maxx), rand(0,maxy), rand(100), rand(100)} end tsave() g.show("Time to fill one thousand rectangles: "..tvalueall(2).." blend "..toggle) ovt{"rgba", 0, 0, 0, 0} ovt{"fill", 10, 10, 100, 100} -- does nothing when alpha blending is on if toggle > 0 then ov("blend 0") -- turn off alpha blending end if repeat_test(" with a different blend setting") then goto restart end end -------------------------------------------------------------------------------- local target = 1 local function test_target() -- set overlay as the rendering target local oldtarget = ov("target") local oldfont = ov("font 16 mono") local oldblend = ov("blend 0") ::restart:: target = 1 - target -- fill the overlay with black ov("blend 0") ov(op.black) ovt{"fill"} -- create a 300x300 clip ov("create 300 300 clip") -- change the clip contents to yellow ov("target clip") ov(op.yellow) ovt{"fill"} -- either draw to the overlay or clip if target == 0 then ov("target clip") else ov("target") end -- draw red, green and blue squares ov(op.red) ovt{"fill", 0, 0, wd, 50} ov(op.green) ovt{"fill", 0, 50, wd, 50} ov(op.blue) ovt{"fill", 0, 100, wd, 50} -- draw circle ov("blend 1") ov(op.white) op.fill_ellipse(0, 0, 100, 100, 1, op.magenta) -- draw some lines ov(op.cyan) for x = 0, wd, 20 do ovt{"line", 0, 0 ,x, ht} end -- draw text label local textstring = "Clip" if target ~= 0 then textstring = "Overlay" end ov(op.black) maketext(textstring, nil, op.white, 2, 2) pastetext(0, 0) -- set overlay as the target ov("target") -- paste the clip ov("blend 0") ovt{"paste", 200, 0, "clip"} if repeat_test(" with a different target") then goto restart end -- free clip and restore previous target ov("delete clip") ov("target "..oldtarget) ov("font "..oldfont) ov("blend "..oldblend) end -------------------------------------------------------------------------------- local batchsize = 1 local maxbatch = 16384 local function test_batch() ::restart:: ov("blend 0") ov(op.black) ovt{"fill"} -- use fixed seed math.randomseed(1234) -- udpate the batch size batchsize = batchsize * 2 if batchsize > maxbatch then batchsize = 4 end -- random coordinates local xyset = { "set" } local xyline = { "line" } local xyfill = { "fill" } local xypaste = { "paste" } local items = batchsize local reps = maxbatch // batchsize -- points, rectangles, lines and pastes use the same random positions local m = 2 local n = 2 for _ = 1, items do -- points xyset[m] = rand(0, wd - 1) xyset[m + 1] = rand(0, ht - 1) -- lines xyline[m] = xyset[m] xyline[m + 1] = xyset[m + 1] -- pastes xypaste[m] = xyset[m] xypaste[m + 1] = xyset[m + 1] -- rectangles xyfill[n] = xyset[m] xyfill[n + 1] = xyset[m + 1] xyfill[n + 2] = 8 xyfill[n + 3] = 8 m = m + 2 n = n + 4 end xyline[m] = xyset[2] xyline[m + 1] = xyset[3] -- create paste clip local clipname = "testclip" ov("create 32 32 "..clipname) ov("target "..clipname) ov(op.blue) ovt{"fill"} ov("optimize "..clipname) ov("target") xypaste[#xypaste + 1] = clipname -- time paste one at a time tstart("paste") for _ = 1, reps do m = 2 for _ = 1, items do ov("paste "..xypaste[m].." "..xypaste[m + 1].." "..clipname) m = m + 2 end end tsave("paste") -- time paste one at a time with array local xy1 = {"paste", 0, 0, clipname} tstart("paste1array") for _ = 1, reps do m = 2 for _ = 1, items do xy1[2] = xypaste[m] xy1[3] = xypaste[m + 1] ovt(xy1) m = m + 2 end end tsave("paste1array") -- time drawing all at once tstart("pastearray") for _ = 1, reps do ovt(xypaste) end tsave("pastearray") -- draw random lines ov(op.green) -- time draw one at a time tstart("line") for _ = 1, reps do m = 2 for _ = 1, items do ov("line "..xyline[m].." "..xyline[m + 1].." "..xyline[m + 2].." "..xyline[m + 3]) m = m + 2 end end tsave("line") -- time draw one at a time with array xy1 = {"line", 0, 0, 0, 0} tstart("line1array") for _ = 1, reps do m = 2 for _ = 1, items do xy1[2] = xyline[m] xy1[3] = xyline[m + 1] xy1[4] = xyline[m + 2] xy1[5] = xyline[m + 3] ovt(xy1) m = m + 2 end end tsave("line1array") -- time drawing all at once tstart("linearray") for _ = 1, reps do ovt(xyline) end tsave("linearray") -- draw random rectangles ov(op.red) -- time draw one at a time tstart("rectangle") for _ = 1, reps do m = 2 for _ = 1, items do ov("fill "..xyfill[m].." "..xyfill[m + 1].." "..xyfill[m + 2].." "..xyfill[m + 3]) m = m + 4 end end tsave("rectangle") -- time draw one at a time with array xy1 = {"fill", 0, 0, 0, 0} tstart("rectangle1array") for _ = 1, reps do m = 2 for _ = 1, items do xy1[2] = xyfill[m] xy1[3] = xyfill[m + 1] xy1[4] = xyfill[m + 2] xy1[5] = xyfill[m + 3] ovt(xy1) m = m + 4 end end tsave("rectangle1array") -- time drawing all at once tstart("rectanglearray") for _ = 1, reps do ovt(xyfill) end tsave("rectanglearray") -- draw random pixels ov(op.white) -- time drawing one at a time tstart("pixel") for _ = 1, reps do m = 2 for _ = 1, items do ov("set "..xyset[m].." "..xyset[m + 1]) m = m + 2 end end tsave("pixel") -- time drawing one at a time with array xy1 = {"set", 0, 0} tstart("pixel1array") for _ = 1, reps do m = 2 for _ = 1, items do xy1[2] = xyset[m] xy1[3] = xyset[m + 1] ovt(xy1) m = m + 2 end end tsave("pixel1array") -- time drawing all at once tstart("pixelarray") for _ = 1, reps do ovt(xyset) end tsave("pixelarray") g.show("reps: "..reps.." items: "..items.." "..tvalueall(2)) -- delete the clip ov("delete "..clipname) -- create batch string if repeat_test(" with a different batch size") then goto restart end end -------------------------------------------------------------------------------- local function test_blending() ::restart:: ov(op.white) ovt{"fill"} toggle = 1 - toggle if toggle > 0 then ov("blend 1") -- turn on alpha blending end local oldfont = ov(demofont) local oldblend = ov("blend 1") ov(op.black) maketext("Alpha blending is turned on or off using the blend command:") pastetext(10, 10) maketext("blend "..oldblend) pastetext(40, 50) maketext("The blend command also controls antialiasing of lines and ellipses:") pastetext(10, 300) ov("blend "..oldblend) ov("font "..oldfont) ovt{"rgba", 0, 255, 0, 128} -- 50% translucent green ovt{"fill", 40, 70, 100, 100} ovt{"rgba", 255, 0, 0, 128} -- 50% translucent red ovt{"fill", 80, 110, 100, 100} ovt{"rgba", 0, 0, 255, 128} -- 50% translucent blue ovt{"fill", 120, 150, 100, 100} ov(op.black) radial_lines(100, 400, 50) draw_ellipse(200, 350, 200, 100) draw_ellipse(260, 360, 80, 80) draw_ellipse(290, 370, 20, 60) -- draw a solid circle by setting the line width to the radius local oldwidth = ov("lineoption width 50") draw_ellipse(450, 350, 100, 100) ov("lineoption width "..oldwidth) if toggle > 0 then ov("blend 0") -- turn off alpha blending end if repeat_test(" with a different blend setting", true) then goto restart end end -------------------------------------------------------------------------------- local volume = 70 local paused = false local function test_sound() local oldblend = ov("blend 0") ov("rgba 0 0 128 255") ovt{"fill"} -- draw exit message ov("blend 1") ov(op.white) local oldfont = ov(demofont) local exitw = maketext("Click or press enter to return to the main menu.", nil, nil, 2, 2) pastetext(floor((wd - exitw) / 2), 550) -- draw commands ov("font 22 mono") ov(op.yellow) local w, _ = maketext("sound play audio.wav", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 50) w, _ = maketext("sound loop audio.wav", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 140) w, _ = maketext("sound stop", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 230) -- draw controls ov("font 16 mono") ov(op.white) w, _ = maketext("Press P to play sound", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 20) w, _ = maketext("Press L to loop sound", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 110) w, _ = maketext("Press S to stop sound", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 200) w, _ = maketext("Press - or + to adjust volume", nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 290) -- update screen then copy background ov("update") local bgclip = "bg" ov("copy 0 0 0 0 "..bgclip) local soundname = "oplus/sounds/breakout/levelcompleteloop.ogg" local running = true -- main loop local result = "" local command = "stop" while running do -- check for input local event = g.getevent() if event:find("^oclick") or event == "key return none" then running = false elseif event == "key p none" then command = "play" result = ov("sound play "..soundname.." "..(volume / 100)) paused = false elseif event == "key l none" then command = "loop" result = ov("sound loop "..soundname.. " "..(volume / 100)) paused = false elseif event == "key s none" then command = "stop" ov("sound stop") result = "" elseif event == "key - none" then volume = volume - 10 if (volume < 0) then volume = 0 end command = "volume "..(volume / 100) ov("sound volume "..soundname.." "..(volume / 100)) elseif event == "key + none" or event == "key = none" then volume = volume + 10 if (volume > 100) then volume = 100 end command = "volume "..(volume / 100) ov("sound volume "..soundname.." "..(volume / 100)) elseif event == "key q none" then if paused then paused = false command = "resume" ov("sound resume "..soundname) else paused = true command = "pause" ov("sound pause "..soundname) end end -- draw background ov("blend 0") ovt{"paste", 0, 0, bgclip} -- draw pause or resume ov("font 16 mono") ov("blend 1") ov(op.white) if paused then w, _ = maketext("Press Q to resume playback", nil, nil, 2, 2) else w, _ = maketext("Press Q to pause playback", nil, nil, 2, 2) end pastetext(floor((wd - w) / 2), 380) ov(op.yellow) ov("font 22 mono") if paused then w, _ = maketext("sound resume audio.wav", nil, nil, 2, 2) else w, _ = maketext("sound pause audio.wav", nil, nil, 2, 2) end pastetext(floor((wd - w) / 2), 420) -- display volume ov("blend 1") w, _ = maketext("sound volume audio.wav "..(volume / 100), nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 320) -- draw last command ov("blend 1") ov(op.cyan) ov("font 16 mono") if (result ~= "" and result ~= nil) then w, _ = maketext("Last command: "..command.." ("..result..")", nil, nil, 2, 2) else w, _ = maketext("Last command: "..command, nil, nil, 2, 2) end pastetext(floor((wd - w) / 2), 480) -- draw status local state = ov("sound state "..soundname) w, _ = maketext("State: "..state, nil, nil, 2, 2) pastetext(floor((wd - w) / 2), 510) ov("update") end -- stop any sounds before exit ov("sound stop") -- no point calling repeat_test() return_to_main_menu = true ov("delete "..bgclip) ov("font "..oldfont) ov("blend "..oldblend) end -------------------------------------------------------------------------------- local function test_mouse() ::restart:: ov(op.black) ovt{"fill"} ov(op.white) local oldfont = ov(demofont) local oldblend = ov("blend 1") local _, h if g.os() == "Mac" then maketext("Click and drag to draw.\n".. "Option-click to flood.\n".. "Control-click or right-click to change the color.") _, h = maketext("Hit the space bar to restart this test.\n".. "Hit the return key to return to the main menu.", "botlines") else maketext("Click and drag to draw.\n".. "Alt-click to flood. ".. "Control-click or right-click to change the color.") _, h = maketext("Hit the space bar to restart this test.\n".. "Hit the enter key to return to the main menu.", "botlines") end pastetext(10, 10) pastetext(10, ht - 10 - h, op.identity, "botlines") ov("blend "..oldblend) ov("font "..oldfont) ov("cursor pencil") g.update() local mousedown = false local prevx, prevy while true do local event = g.getevent() if event == "key space none" then goto restart end if event == "key return none" then return_to_main_menu = true return end if event:find("^oclick") then local _, x, y, button, mods = split(event) if mods == "alt" then ov("flood "..x.." "..y) else if mods == "ctrl" or button == "right" then ovt{"rgba", rand(0,255), rand(0,255), rand(0,255), 255} end ovt{"set", x, y} mousedown = true prevx = x prevy = y end g.update() elseif event:find("^mup") then mousedown = false elseif #event > 0 then g.doevent(event) end local xy = ov("xy") if #xy > 0 then local x, y = split(xy) g.show("pixel at "..x..","..y.." = "..ov("get "..x.." "..y)) if mousedown and (x ~= prevx or y ~= prevy) then ovt{"line", prevx, prevy, x, y} prevx = x prevy = y g.update() end else g.show("mouse is outside overlay") end end end -------------------------------------------------------------------------------- local function create_menu_buttons() op.buttonht = 22 op.radius = 12 op.textgap = 15 op.textfont = "font 10 default-bold" if g.os() == "Mac" then op.yoffset = -1 end if g.os() == "Linux" then op.textfont = "font 10 default" end op.textshadowx = 2 op.textshadowy = 2 local longest = "Text and Transforms" blend_button = op.button( longest, test_blending) batch_button = op.button( longest, test_batch) cellview_button = op.button( longest, test_cellview) copy_button = op.button( longest, test_copy_paste) cursor_button = op.button( longest, test_cursors) set_button = op.button( longest, test_set) fill_button = op.button( longest, test_fill) line_button = op.button( longest, test_lines) mouse_button = op.button( longest, test_mouse) multiline_button = op.button( longest, test_multiline_text) pos_button = op.button( longest, test_positions) render_button = op.button( longest, test_target) replace_button = op.button( longest, test_replace) save_button = op.button( longest, test_save) scale_button = op.button( longest, test_scale) sound_button = op.button( longest, test_sound) text_button = op.button( longest, test_text) transition_button = op.button( longest, test_transitions) -- change labels without changing button widths blend_button.setlabel( "Alpha Blending", false) batch_button.setlabel( "Batch Draw", false) cellview_button.setlabel( "Cell View", false) copy_button.setlabel( "Copy and Paste", false) cursor_button.setlabel( "Cursors", false) set_button.setlabel( "Drawing Pixels", false) fill_button.setlabel( "Filling Rectangles", false) line_button.setlabel( "Lines and Ellipses", false) mouse_button.setlabel( "Mouse Tracking", false) multiline_button.setlabel( "Multi-line Text", false) pos_button.setlabel( "Overlay Positions", false) render_button.setlabel( "Render Target", false) replace_button.setlabel( "Replacing Pixels", false) save_button.setlabel( "Saving the Overlay", false) scale_button.setlabel( "Scaling Images", false) sound_button.setlabel( "Sounds", false) text_button.setlabel( "Text and Transforms", false) transition_button.setlabel( "Transitions", false) end -------------------------------------------------------------------------------- local function main_menu() local numbutts = 18 local buttwd = blend_button.wd local buttht = blend_button.ht local buttgap = 9 local hgap = 20 local textgap = 10 local oldfont = ov("font 24 default-bold") ov(op.black) local w1, h1 = maketext("Welcome to the overlay!", "bigtext") ov(demofont) local w2, h2 = maketext("Click on a button to see what's possible.", "smalltext") local textht = h1 + textgap + h2 -- check if sound is enabled if (sound_enabled == false) then numbutts = numbutts - 1 end -- resize overlay to fit buttons and text wd = hgap + buttwd + hgap + w1 + hgap ht = hgap + numbutts * buttht + (numbutts-1) * buttgap + hgap ov("resize "..wd.." "..ht) ov("position middle") ov("cursor arrow") ov(op.gray) ovt{"fill"} ov(op.white) ovt{"fill", 2, 2, -4, -4} local x = hgap local y = hgap blend_button.show(x, y) y = y + buttgap + buttht batch_button.show(x, y) y = y + buttgap + buttht cellview_button.show(x, y) y = y + buttgap + buttht copy_button.show(x, y) y = y + buttgap + buttht cursor_button.show(x, y) y = y + buttgap + buttht set_button.show(x, y) y = y + buttgap + buttht fill_button.show(x, y) y = y + buttgap + buttht line_button.show(x, y) y = y + buttgap + buttht mouse_button.show(x, y) y = y + buttgap + buttht multiline_button.show(x, y) y = y + buttgap + buttht pos_button.show(x, y) y = y + buttgap + buttht render_button.show(x, y) y = y + buttgap + buttht replace_button.show(x, y) y = y + buttgap + buttht save_button.show(x, y) y = y + buttgap + buttht scale_button.show(x, y) y = y + buttgap + buttht if (sound_enabled) then sound_button.show(x, y) y = y + buttgap + buttht end text_button.show(x, y) y = y + buttgap + buttht transition_button.show(x, y) local oldblend = ov("blend 1") x = hgap + buttwd + hgap y = int((ht - textht) / 2) pastetext(x, y, op.identity, "bigtext") x = x + int((w1 - w2) / 2) y = y + h1 + textgap pastetext(x, y, op.identity, "smalltext") ov("blend "..oldblend) ov("font "..oldfont) g.update() g.show(" ") -- clear any timing info -- wait for user to click a button return_to_main_menu = false while true do local event = op.process( g.getevent() ) if return_to_main_menu then return end if #event > 0 then -- might be a keyboard shortcut g.doevent(event) else g.sleep(5) -- don't hog the CPU when idle end end end -------------------------------------------------------------------------------- local function main() -- create overlay create_overlay() -- check if sound is available if (ov("sound") == "2") then sound_enabled = true end -- create menu create_menu_buttons() -- run main loop while true do main_menu() end end -------------------------------------------------------------------------------- local oldoverlay = g.setoption("showoverlay", 1) local oldbuttons = g.setoption("showbuttons", 0) -- disable translucent buttons local oldtile = g.setoption("tilelayers", 0) local oldstack = g.setoption("stacklayers", 0) local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed -- delete the overlay and restore settings saved above g.check(false) ov("delete") g.setoption("showoverlay", oldoverlay) g.setoption("showbuttons", oldbuttons) g.setoption("tilelayers", oldtile) g.setoption("stacklayers", oldstack) if extra_layer then g.dellayer() end golly-3.3-src/Scripts/Lua/gplus/0000755000175000017500000000000013543257426013610 500000000000000golly-3.3-src/Scripts/Lua/gplus/init.lua0000755000175000017500000003646113317135606015205 00000000000000-- This module is loaded if a script calls require "gplus". local g = golly() local floor = math.floor local ceil = math.ceil local abs = math.abs local mmin = math.min local mmax = math.max local millisecs = g.millisecs local m = {} m.timing = {} -- timing information m.timingorder = {} -- index to order timers m.timingstack = 0 -- used for grouping output into dependent timers -------------------------------------------------------------------------------- function m.timerstart(name) name = name or "" -- pause GC if running if collectgarbage("isrunning") then collectgarbage("stop") end local timing, timingorder = m.timing, m.timingorder if timing[name] == nil then timing[name] = { start=0, last=0, stack=m.timingstack } timingorder[#timingorder + 1] = name end m.timingstack = m.timingstack + 1 -- start the timer timing[name].start = millisecs() end -------------------------------------------------------------------------------- function m.timersave(name) name = name or "" -- return time in milliseconds since last request or timer start local timenow = millisecs() local timing = m.timing if timing[name] then m.timingstack = m.timingstack - 1 timing[name].last = timenow - timing[name].start timing[name].start = timenow timing[name].stack = m.timingstack return timing[name].last else -- if timer never started return 0 return 0 end end -------------------------------------------------------------------------------- function m.timervalue(name) name = name or "" -- return last measured value of the named timer in milliseconds local timing = m.timing if timing[name] then return timing[name].last else return 0 end end -------------------------------------------------------------------------------- function m.timerresetall() -- reset all timers m.timing = {} m.timingorder = {} m.timingstack = 0 -- restart GC if paused if not collectgarbage("isrunning") then collectgarbage("restart") collectgarbage() end end -------------------------------------------------------------------------------- function m.timervalueall(precision) precision = precision or 1 if precision < 0 then precision = 0 end -- return a string containing all timer name value pairs in the order they were created local timing, timingorder = m.timing, m.timingorder local result = {} local laststack = 0 local ntimers = #timingorder for i = 1, ntimers do local name = timingorder[i] local timer = timing[name] local output = "" if timer.stack > laststack then output = "{ " elseif timer.stack < laststack then output = "} " end laststack = timer.stack output = output..name.." "..string.format("%."..precision.."fms", timing[name].last) if i == ntimers then while laststack > 0 do output = output.." }" laststack = laststack - 1 end end result[#result + 1] = output end m.timerresetall() return table.concat(result, " ") end -------------------------------------------------------------------------------- function m.int(x) -- return integer part of given floating point number return x < 0 and ceil(x) or floor(x) end -------------------------------------------------------------------------------- function m.round(x) -- return same result as Python's round function if x >= 0 then return floor(x+0.5) else return ceil(x-0.5) end end -------------------------------------------------------------------------------- function m.min(a) -- return minimum value in given array local alen = #a if alen == 0 then return nil end if alen < 100000 then -- use faster math.min call return mmin( table.unpack(a) ) else -- slower code but no danger of exceeding stack limit local n = a[1] for i = 2, alen do if a[i] < n then n = a[i] end end return n end end -------------------------------------------------------------------------------- function m.max(a) -- return maximum value in given array local alen = #a if alen == 0 then return nil end if alen < 100000 then -- use faster math.max call return mmax( table.unpack(a) ) else -- slower code but no danger of exceeding stack limit local n = a[1] for i = 2, alen do if a[i] > n then n = a[i] end end return n end end -------------------------------------------------------------------------------- function m.drawline(x1, y1, x2, y2, state) -- draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm state = state or 1 g.setcell(x1, y1, state) if x1 == x2 and y1 == y2 then return end local dx = x2 - x1 local ax = abs(dx) * 2 local sx = 1 if dx < 0 then sx = -1 end local dy = y2 - y1 local ay = abs(dy) * 2 local sy = 1 if dy < 0 then sy = -1 end if ax > ay then local d = ay - (ax / 2) while x1 ~= x2 do g.setcell(x1, y1, state) if d >= 0 then y1 = y1 + sy d = d - ax end x1 = x1 + sx d = d + ay end else local d = ax - (ay / 2) while y1 ~= y2 do g.setcell(x1, y1, state) if d >= 0 then x1 = x1 + sx d = d - ay end y1 = y1 + sy d = d + ax end end g.setcell(x2, y2, state) end -------------------------------------------------------------------------------- function m.getedges(r) -- return left, top, right, bottom edges of given rect array return r[1], r[2], r[1]+r[3]-1, r[2]+r[4]-1 end -------------------------------------------------------------------------------- function m.getminbox(cells) -- return a rect with the minimal bounding box of given cell array or pattern if cells.array then -- arg is a pattern so get its cell array cells = cells.array end local len = #cells if len < 2 then return m.rect( {} ) end local minx = cells[1] local miny = cells[2] local maxx = minx local maxy = miny -- determine if cell array is one-state or multi-state local inc = 2 if (len & 1) == 1 then inc = 3 end -- ignore padding int if present if (inc == 3) and (len % 3 == 1) then len = len - 1 end for x = 1, len, inc do if cells[x] < minx then minx = cells[x] end if cells[x] > maxx then maxx = cells[x] end end for y = 2, len, inc do if cells[y] < miny then miny = cells[y] end if cells[y] > maxy then maxy = cells[y] end end return m.rect( {minx, miny, maxx - minx + 1, maxy - miny + 1} ) end -------------------------------------------------------------------------------- function m.validint(s) -- return true if given string represents a valid integer if #s == 0 then return false end s = s:gsub(",","") return s:match("^[+-]?%d+$") ~= nil end -------------------------------------------------------------------------------- function m.getposint() -- return current viewport position as integer coords local x, y = g.getpos() return tonumber(x), tonumber(y) end -------------------------------------------------------------------------------- function m.setposint(x,y) -- convert integer coords to strings and set viewport position g.setpos(tostring(x), tostring(y)) end -------------------------------------------------------------------------------- function m.split(s, sep) -- split given string into substrings that are separated by given sep -- (emulates Python's split function) sep = sep or " " local t = {} local start = 1 while true do local i = s:find(sep, start, true) -- find string, not pattern if i == nil then if start <= #s then t[#t+1] = s:sub(start, -1) end break end if i > start then t[#t+1] = s:sub(start, i-1) elseif i == start then t[#t+1] = "" end start = i + #sep end if #t == 0 then -- sep does not exist in s so return s return s else return table.unpack(t) end end -------------------------------------------------------------------------------- function m.equal(a1, a2) -- return true if given arrays have the same values if #a1 ~= #a2 then -- arrays are not the same length return false else -- both arrays are the same length (possibly 0) for i = 1, #a1 do if a1[i] ~= a2[i] then return false end end return true end end -------------------------------------------------------------------------------- function m.rect(a) -- return a table that makes it easier to manipulate rectangles -- (emulates glife's rect class) local r = {} if #a == 0 then r.empty = true elseif #a == 4 then r.empty = false r.x = a[1] r.y = a[2] r.wd = a[3] r.ht = a[4] r.left = r.x r.top = r.y r.width = r.wd r.height = r.ht if r.wd <= 0 then error("rect width must be > 0", 2) end if r.ht <= 0 then error("rect height must be > 0", 2) end r.right = r.left + r.wd - 1 r.bottom = r.top + r.ht - 1 r.visible = function () return g.visrect( {r.x, r.y, r.wd, r.ht} ) end else error("rect arg must be {} or {x,y,wd,ht}", 2) end return r end -------------------------------------------------------------------------------- -- create some useful synonyms: -- for g.clear and g.advance m.inside = 0 m.outside = 1 -- for g.flip m.left_right = 0 m.top_bottom = 1 m.up_down = 1 -- for g.rotate m.clockwise = 0 m.anticlockwise = 1 -- for g.setcursor (must match strings in Cursor Mode submenu) m.draw = "Draw" m.pick = "Pick" m.select = "Select" m.move = "Move" m.zoomin = "Zoom In" m.zoomout = "Zoom Out" -- transformation matrices m.identity = { 1, 0, 0, 1} m.flip = {-1, 0, 0, -1} m.flip_x = {-1, 0, 0, 1} m.flip_y = { 1, 0, 0, -1} m.swap_xy = { 0, 1, 1, 0} m.swap_xy_flip = { 0, -1, -1, 0} m.rcw = { 0, -1, 1, 0} m.rccw = { 0, 1, -1, 0} -------------------------------------------------------------------------------- function m.compose(S, T) -- Return the composition of two transformations S and T. -- A transformation is an array of the form {x, y, A}, which denotes -- multiplying by matrix A and then translating by vector (x, y). local x, y, A = table.unpack(S) local s, t, B = table.unpack(T) return { x * B[1] + y * B[2] + s, x * B[3] + y * B[4] + t, { A[1] * B[1] + A[3] * B[2], A[2] * B[1] + A[4] * B[2], A[1] * B[3] + A[3] * B[4], A[2] * B[3] + A[4] * B[4] } } end -------------------------------------------------------------------------------- -- create a metatable for all pattern tables local mtp = {} -------------------------------------------------------------------------------- function m.pattern(arg, x0, y0, A) -- return a table that makes it easier to manipulate patterns -- (emulates glife's pattern class) local p = {} setmetatable(p, mtp) arg = arg or {} x0 = x0 or 0 y0 = y0 or 0 A = A or m.identity if type(arg) == "table" then p.array = {} if getmetatable(arg) == mtp then -- arg is a pattern if #arg.array > 0 then p.array = g.join({},arg.array) end else -- assume arg is a cell array if #arg > 0 then p.array = g.join({},arg) end end elseif type(arg) == "string" then p.array = g.parse(arg, x0, y0, table.unpack(A)) else error("1st arg of pattern must be a cell array, a pattern, or a string", 2) end p.t = function (x, y, A) -- allow scripts to call patt.t(x,y,A) or patt.t({x,y,A}) if type(x) == "table" then x, y, A = table.unpack(x) end A = A or m.identity local newp = m.pattern() newp.array = g.transform(p.array, x, y, table.unpack(A)) return newp end -- there's no need to implement p.translate and p.apply as they -- are just trivial variants of p.t p.put = function (x, y, A, mode) -- paste pattern into current universe x = x or 0 y = y or 0 A = A or m.identity mode = mode or "or" local axx, axy, ayx, ayy = table.unpack(A) g.putcells(p.array, x, y, axx, axy, ayx, ayy, mode) end p.display = function (title, x, y, A, mode) -- paste pattern into new universe and display it all title = title or "untitled" x = x or 0 y = y or 0 A = A or m.identity mode = mode or "or" g.new(title) local axx, axy, ayx, ayy = table.unpack(A) g.putcells(p.array, x, y, axx, axy, ayx, ayy, mode) g.fit() g.setcursor(m.zoomin) end p.save = function (filepath) -- save the pattern to given file in RLE format g.store(p.array, filepath) end p.add = function (p1, p2) local newp = m.pattern() newp.array = g.join(p1.array, p2.array) return newp -- note that above code is about 15% faster than doing -- return m.pattern( g.join(p1.array, p2.array) ) -- because it avoids calling g.join again end p.evolve = function (p1, n) local newp = m.pattern() newp.array = g.evolve(p1.array, n) return newp end -- set metamethod so scripts can do pattern1 + pattern2 mtp.__add = p.add -- set metamethod so scripts can do pattern[10] to get evolved pattern mtp.__index = p.evolve return p end -------------------------------------------------------------------------------- -- avoid calling any g.* command in m.trace otherwise we'll get a Lua error -- message saying "error in error handling" if user aborts the script local Windows = g.os() == "Windows" function m.trace(msg) -- this function can be passed into xpcall so that a nice stack trace gets -- appended to a runtime error message if msg and #msg > 0 then -- append a stack trace starting with this function's caller (level 2) local result = msg.."\n\n"..debug.traceback(nil, 2) -- modify result to make it more readable result = result:gsub("\t", "") result = result:gsub("in upvalue ", "in function ") -- local function -- strip off paths that don't start with "." then remove ".\" or "./" if Windows then result = result:gsub("\n[^%.][^<\n]+\\", "\n") result = result:gsub("%.\\", "") else result = result:gsub("\n[^%.][^<\n]+/", "\n") result = result:gsub("%./", "") end -- following is nicer if a local function is passed into xpcall result = result:gsub("<.+:(%d+)>", "on line %1") return result else return msg end end -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/gplus/NewCA.lua0000755000175000017500000033622313543255652015203 00000000000000--[[ This module makes it easy to create a new cellular automaton that is not supported natively by Golly. It should be possible to implement almost any CA that uses square cells with up to 256 states on a finite grid. To implement a new CA you need to create a .lua file that looks something like this: local g = golly() require "gplus.NewCA" SCRIPT_NAME = "MyCA" -- must match the name of your .lua file DEFAULT_RULE = "XXX" -- must be a valid rule in your CA RULE_HELP = "HTML code describing the rules allowed by your CA." function ParseRule(newrule) -- Parse the given rule string. -- If valid then return nil, the canonical rule string, -- the width and height of the grid, and the number of states. -- If not valid then just return an appropriate error message. ... parsing code for your rule syntax ... return nil, canonrule, wd, ht, numstates -- Note that wd and ht must be from 4 to 4000, -- and numstates must be from 2 to 256. end function NextPattern(currcells, minx, miny, maxx, maxy) -- Create the next pattern using the given parameters: -- currcells is a non-empty cell array containing the current pattern. -- minx, miny, maxx, maxy are the cell coordinates of the grid edges. -- This function must return the new pattern as a cell array. local newcells = {} -- Note that currcells and newcells are one-state cell arrays if -- g.numstates() == 2, otherwise they are both multi-state. ... code to create the next pattern ... -- delete the old pattern and add the new pattern g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(newcells) return newcells end StartNewCA() Author: Andrew Trevorrow (andrew@trevorrow.com), May 2019. --]] local g = golly() -- require "gplus.strict" local gp = require "gplus" local op = require "oplus" local split = gp.split local int = gp.int local ov = g.overlay local ovt = g.ovtable local rand = math.random SCRIPT_NAME = nil -- must match the name of the new .lua file DEFAULT_RULE = nil -- default rule string (must be valid) RULE_HELP = nil -- HTML data for ShowHelp ParseRule = nil -- function to validate given rule string NextPattern = nil -- function to calculate the next pattern local current_rule = "" -- the current rule (set by CheckRule) local real_rule = "" -- the real rule used by the new layer's algo (set by CheckRule) local minx, miny, maxx, maxy -- cell coordinates of grid edges (set by CheckRule) local gridwd, gridht -- current dimensions of grid (set by CheckRule) local pattname = "untitled" -- initial pattern name local currtitle = "" -- current window title (set by UpdateWindowTitle) local currpattern = nil -- cell array with current pattern local generating = false -- generate pattern? local gencount = 0 -- current generation count local stopgen = 0 -- when to stop generating (if > 0) local stepsize = 1 -- current step size local perc = 50 -- initial percentage density for RandomPattern local drawstate = 1 -- for drawing/erasing cells local viewwd, viewht -- current size of viewport local ovwd, ovht -- current size of overlay local minwd, minht = 920, 500 -- minimum size of overlay local mbar -- the menu bar local mbarwd = 165 -- width of menu bar local mbarht = 32 -- height of menu bar (and tool bar) local buttonht = 20 -- height of buttons in tool bar local hgap = 10 -- horizontal space between buttons local vgap = 6 -- vertical space above buttons local currbarht = mbarht -- 0 if menu/tool bar is not shown (eg. fullscreen mode) local arrow_cursor = false -- true if cursor is in menu/tool bar local pastemenu -- pop-up menu for choosing a paste action local pasteclip = "pasteclip" -- clip with translucent paste pattern local pastecells = {} -- cell array with paste pattern local pastewd, pasteht -- dimensions of paste pattern (in cells) local pastemode = "or" -- initial paste mode local pastepos = "topleft" -- initial position of mouse in paste pattern local updatepaste = false -- paste pattern needs to be updated? local modeclip = "modeclip" -- clip with translucent paste mode local modeht -- height of modeclip (in pixels) local alpha1 = "rgba 0 0 0 1" -- area below tool bar will be mostly transparent -- tool bar controls local ssbutton -- Start/Stop local s1button -- +1 local stepbutton -- Step local resetbutton -- Reset local undobutton -- Undo local redobutton -- Redo local rulebutton -- Rule... local helpbutton -- ? local exitbutton -- X local stepslider -- slider for adjusting stepsize -- for undo/redo local undostack = {} -- stack of states that can be undone local redostack = {} -- stack of states that can be redone local startcount = 0 -- starting gencount (can be > 0) local startstate = {} -- starting state (used by Reset) local dirty = false -- pattern has been modified? local pattdir = g.getdir("data") -- initial directory for OpenPattern/SavePattern local scriptdir = g.getdir("app") -- initial directory for RunScript local scriptlevel = 0 -- greater than 0 if a user script is running local pathsep = g.getdir("app"):sub(-1) -- "/" on Mac and Linux, "\" on Windows -- the following paths depend on SCRIPT_NAME and so are initialized in SanityChecks local startup = "" -- path to the startup script local settingsfile = "" -- path to the settings file math.randomseed(os.time()) -- init seed for math.random -------------------------------------------------------------------------------- function SetColors() g.setcolors( {0,40,40,80} ) -- dark blue background g.setcolors( {255,255,0, 255,0,0} ) -- live states vary from yellow to red end -------------------------------------------------------------------------------- function CheckRule(newrule) -- call ParseRule and if valid set current_rule, real_rule, -- gridwd, gridht, minx, miny, maxx, maxy, -- then call SetColors() and return nil; -- if not valid then return the error message from ParseRule local err, canonrule, wd, ht, numstates = ParseRule(newrule) if err then return err end -- if any of these sanity checks fail we must exit because caller code needs to be fixed if #canonrule == 0 then g.exit("Canonical rule must not be empty!") elseif canonrule:find(" ") then g.exit("Canonical rule must not contain any spaces!") end if wd < 4 or wd > 4000 or ht < 4 or ht > 4000 then g.exit("Grid size must be from 4 to 4000!") end if numstates < 2 or numstates > 256 then g.exit("Number of states must be from 2 to 256!") end -- given rule is valid so set current_rule to its canonical form current_rule = canonrule -- set the real LtL rule for the desired number of states -- (note that it must be canonical for FixClipboardRule to work) if numstates > 2 then real_rule = "R1,C"..numstates..",M0,S1..1,B1..1,NM:T"..wd..","..ht else -- can't use C2 (not canonical) real_rule = "R1,C0,M0,S1..1,B1..1,NM:T"..wd..","..ht end g.setrule(real_rule) -- set grid dimensions and edge coordinates gridwd = wd gridht = ht minx = -(gridwd // 2) miny = -(gridht // 2) maxx = minx + gridwd - 1 maxy = miny + gridht - 1 SetColors() -- color scheme might depend on g.numstates() return nil -- success end -------------------------------------------------------------------------------- function NextGeneration() if g.empty() then StopGenerating() ShowError("All cells are dead.") Refresh() return end if gencount == startcount then -- remember starting state for later use in Reset() if scriptlevel > 0 then -- can't use undostack if user script is running startstate = SaveState() else -- starting state is on top of undostack startstate = undostack[#undostack] end end if currpattern == nil then -- currpattern needs to be updated currpattern = g.getcells( g.getrect() ) end currpattern = NextPattern(currpattern, minx, miny, maxx, maxy) gencount = gencount + 1 g.setgen(tostring(gencount)) -- for status bar if scriptlevel == 0 then if g.empty() or (stopgen > 0 and gencount == stopgen) then StopGenerating() Refresh() elseif stopgen == 0 and gencount % stepsize == 0 then Refresh() end end end -------------------------------------------------------------------------------- function ShowHelp() local htmldata = [[ Golly Help: SCRIPT_NAME.lua

Supported rules
Keyboard shortcuts
Menus
     File menu
     Edit menu
     View menu
Running scripts
     Creating your own keyboard shortcuts
     Script functions
Extra features


Supported rules

RULE_HELP


Keyboard shortcuts

The following keyboard shortcuts are provided (but see below for how you can write a script to create new shortcuts or override any of the supplied shortcuts):

Keys    Actions
ENTER    start/stop generating pattern
space    advance pattern by one generation
tab    advance pattern by the step size
-    decrease step size
=    increase step size
CTRL-N    create a new, empty pattern
CTRL-P    create a new, random pattern
CTRL-5    randomly fill the selection
D    set the density for Random Fill/Pattern
CTRL-O    open a selected pattern file
CTRL-S    save the current pattern in a file
shift-O    open pattern from clipboard
shift-R    run script from clipboard
CTRL-R    reset to the starting pattern
Z    undo
shift-Z    redo
CTRL-X    cut the selection
CTRL-C    copy the selection
CTRL-V    paste pattern from clipboard
delete    delete live cells inside selection
shift-delete    delete live cells outside selection
A    select all
K    remove selection
X    flip selection left-right
Y    flip selection top-bottom
>    rotate selection clockwise
<    rotate selection anticlockwise
F    fit pattern within view
shift-F    fit selection within view
T    toggle the tool bar
R    change the rule
M    move cell at 0,0 to middle of view
H    show this help
Q    quit SCRIPT_NAME.lua


Menus

SCRIPT_NAME.lua has its own menu bar. It contains menus with items that are somewhat similar to those in Golly's menu bar.


File menu

New Pattern
Create a new, empty pattern. All undo/redo history is deleted and the step size is reset to 1.

Random Pattern
Create a new pattern randomly filled with live cells using the density set by the most recent "Set Density..." command (in the Edit menu). All undo/redo history is deleted and the step size is reset to 1.

Open Pattern...
Open a selected pattern file. All undo/redo history is deleted and the step size is reset to 1.

Open Clipboard
Open the pattern stored in the clipboard. All undo/redo history is deleted and the step size is reset to 1.

Save Pattern...
Save the current pattern in a file.

Run Script...
Run a selected Lua script.

Run Clipboard
Run the Lua code stored in the clipboard.

Set Startup Script...
Select a Lua script that will be run automatically every time SCRIPT_NAME.lua starts up.

Exit SCRIPT_NAME.lua
Terminate SCRIPT_NAME.lua. If there are any unsaved changes (indicated by an asterisk at the start of the pattern name) then you'll be asked if you want to save them.


Edit menu

Undo
Undo the most recent change. This could be an editing change or a generating change.

Redo
Redo the most recently undone change.

Cut
Copy the selection to the clipboard in RLE format, then delete the cells inside the selection.

Copy
Copy the selection to the clipboard in RLE format.

Paste
If the clipboard contains a valid RLE pattern then a translucent paste pattern will appear. Just like Golly, you can use various keys: "X" to flip the paste pattern left-to-right, "Y" to flip top-to-bottom, ">" to rotate clockwise, "<" to rotate anticlockwise, "shift-M" to cycle the paste mode, "shift-L" to cycle the location of the mouse within the paste pattern. Click when you want to do the paste, or hit escape to cancel it. Unlike Golly, you can also control-click or right-click to see a pop-up menu with various paste actions.

Clear
Delete all the live cells that are inside the selection.

Clear Outside
Delete all the live cells that are outside the selection.

Select All
Select the entire pattern, assuming there are one or more live cells. If there are no live cells then any existing selection is removed.

Remove Selection
Remove the selection.

Shrink Selection
Reduce the size of the current selection to the smallest rectangle containing all of the selection's live cells.

Flip Top-Bottom
The cells in the current selection are reflected about its central horizontal axis.

Flip Left-Right
The cells in the current selection are reflected about its central vertical axis.

Rotate Clockwise
The current selection is rotated 90 degrees clockwise about its center.

Rotate Anticlockwise
As above, but the rotation is anticlockwise.

Random Fill
Randomly fill the selection using the density set by the most recent "Set Density..." command.

Set Density...
Set the percentage density for Random Fill and Random Pattern.


View menu

Fit Grid
Fit the entire grid so it just fits within the middle of the viewport.

Fit Pattern
Fit the pattern so it just fits within the middle of the viewport.

Fit Selection
Fit the selection so it just fits within the middle of the viewport.

Middle
Change the location so the cell at 0,0 is in the middle of the viewport.

Help
Show this help.


Running scripts

SCRIPT_NAME.lua can run other Lua scripts, either by selecting File > Run Script and choosing a .lua file, or by copying Lua code to the clipboard and selecting File > Run Clipboard. Try the latter method with this example which creates a small random pattern:

-- for SCRIPT_NAME.lua (make sure you copy this line)
local g = golly()
NewPattern("random pattern")
for y = 0, 19 do
    for x = 0, 19 do
        if math.random(0,99) < 50 then
            g.setcell(x, y, 1)
        end
    end
end
FitPattern()
g.setcursor("Move") -- sets the hand cursor

Note that SCRIPT_NAME.lua will only run a script if the clipboard or the file contains "SCRIPT_NAME.lua" or "NewCA.lua" somewhere in the first line. This avoids nasty problems that can occur if you run a script not written for SCRIPT_NAME.lua or NewCA.lua.

Any syntax or runtime errors in a script won't abort SCRIPT_NAME.lua. The script will terminate and you'll get a warning message, hopefully with enough information that lets you fix the error.


Creating your own keyboard shortcuts

SCRIPT_NAME.lua relies on many global functions defined in NewCA.lua. It's possible to override any of these functions in your own scripts. The following example shows how to override the HandleKey function to create a keyboard shortcut for running a particular script. You can get SCRIPT_NAME.lua to run this script automatically when it starts up by going to File > Set Startup Script and selecting a .lua file containing this code:

-- a startup script for SCRIPT_NAME.lua
local g = golly()
local gp = require "gplus"
local savedHandler = HandleKey
function HandleKey(event)
    local _, key, mods = gp.split(event)
    if key == "o" and mods == "alt" then
        RunScript(g.getdir("app").."My-scripts/SCRIPT_NAME/oscar.lua")
    else
        -- pass the event to the original HandleKey function
        savedHandler(event)
    end
end


Script functions

Here is an alphabetical list of the global functions in NewCA.lua you might want to call from your own scripts:

CheckCursor
CheckWindowSize
Exit
FitGrid
FitPattern
FitSelection
GetBarHeight
GetRule
HandleKey
HandlePasteKey
NewPattern
OpenPattern
RandomPattern
Reset
RestoreState
RunScript
SavePattern
SaveState
SetColors
SetRule
Step
Update

CheckCursor()
Changes the cursor to an arrow if the mouse moves over the tool bar. Useful in scripts that allow user interaction.

CheckWindowSize()
If the Golly window size has changed then this function resizes the overlay. Useful in scripts that allow user interaction.

Exit(message)
Display the given message in the status bar and exit the script. (Calling g.exit will also exit the script but its message will be overwritten by "Script aborted".)

FitGrid()
Fit the entire grid so it just fits within the middle of the viewport.

FitPattern()
Fit the pattern so it just fits within the middle of the viewport.

FitSelection()
Fit the selection so it just fits within the middle of the viewport.

GetBarHeight()
Return the height of the tool bar. The value will be 0 if the user has turned them off (by hitting the "T" key) or switched to full screen mode.

GetRule()
Return the current rule. WARNING: Do not use g.getrule()! It returns the rule used by the underlying layer.

HandleKey(event)
Process the given keyboard event. A startup script might want to modify how such events are handled.

HandlePasteKey(event)
Process the given keyboard event while waiting for a paste click. A startup script might want to modify these events.

NewPattern(title)
Create a new, empty pattern. All undo/redo history is deleted and the step size is reset to 1. The given title string will appear in the title bar of the Golly window. If not supplied it is set to "untitled".

OpenPattern(filepath)
Open the specified pattern file. If the filepath is not supplied then the user will be prompted to select a file. All undo/redo history is deleted and the step size is reset to 1.

RandomPattern(percentage, wd, ht)
Create a new, random pattern of the given width and height (100 if not supplied) and with the given percentage density (1 to 100) of live cells. All undo/redo history is deleted and the step size is reset to 1.

Reset()
Restore the starting generation and step size.

RestoreState(state)
Restore the state saved earlier by SaveState.

RunScript(filepath)
Run the specified .lua file, but only if "SCRIPT_NAME.lua" or "NewCA.lua" occurs somewhere in a comment on the first line of the file. If the filepath is not supplied then the user will be prompted to select a .lua file.

SavePattern(filepath)
Save the current pattern in a specified RLE file. If the filepath is not supplied then the user will be prompted for its name and location.

SaveState()
Return an object representing the current state. The object can be given later to RestoreState to restore the saved state. The saved information includes the cursor mode, the rule, the pattern, the generation count, the step size, and the selection.

SetColors()
Called in various places to set the colors for each state. A startup script can override this function to change the colors.

SetRule(rule)
Switch to the given rule. If rule is not supplied then the default rule is used. WARNING: Do not use g.setrule()! That will set the rule for the underlying layer.

Step(n)
While the population is > 0 calculate the next n generations. If n is not supplied it defaults to 1.

Update()
Update everything, including the viewport, the status bar, the edit bar, the tool bar, and the window's title bar. Note that g.update() only updates the viewport and the status bar. Update() is automatically called when a script finishes, so there's no need to call it at the end of a script.


Extra features

NewCA.lua provides a couple of additional features not available in Golly:

  • Drawing is allowed at scales up to 2^3:1.
  • When doing a paste you can control-click or right-click to get a pop-up menu with various paste actions.
]] htmldata = htmldata:gsub("SCRIPT_NAME", SCRIPT_NAME) htmldata = htmldata:gsub("RULE_HELP", RULE_HELP, 1) if g.os() == "Mac" then htmldata = htmldata:gsub("ENTER", "return") htmldata = htmldata:gsub("ALT", "option") htmldata = htmldata:gsub("CTRL", "cmd") else htmldata = htmldata:gsub("ENTER", "enter") htmldata = htmldata:gsub("ALT", "alt") htmldata = htmldata:gsub("CTRL", "ctrl") end local htmlfile = g.getdir("temp")..SCRIPT_NAME..".html" local f = io.open(htmlfile,"w") if not f then g.warn("Failed to create html file!", false) return end f:write(htmldata) f:close() g.open(htmlfile) end -------------------------------------------------------------------------------- function SanityChecks() -- ensure caller has defined the necessary strings and functions if type(SCRIPT_NAME) ~= "string" then g.warn("You need to set SCRIPT_NAME to the name of your script!") g.exit() end if type(DEFAULT_RULE) ~= "string" then g.warn("You need to set DEFAULT_RULE to a valid rule string!") g.exit() end if type(RULE_HELP) ~= "string" then g.warn("You need to set RULE_HELP to HTML data describing the supported rules!") g.exit() end if type(ParseRule) ~= "function" then g.warn("You need to write a ParseRule function!") g.exit() end if type(NextPattern) ~= "function" then g.warn("You need to write a NextPattern function!") g.exit() end -- now set the paths that depend on SCRIPT_NAME startup = g.getdir("app").."My-scripts"..pathsep..SCRIPT_NAME.."-start.lua" settingsfile = g.getdir("data")..SCRIPT_NAME..".ini" -- initialize current_rule for very 1st call (validated later in Main) current_rule = DEFAULT_RULE end -------------------------------------------------------------------------------- function AddNewLayer() -- create a new layer and set the algo to Larger than Life because it -- has faster g.getcell/setcell calls if g.numlayers() < g.maxlayers() then g.addlayer() g.setalgo("Larger than Life") -- note that this must be done BEFORE ReadSettings calls CheckRule else g.exit("Could not create a new layer!") end end -------------------------------------------------------------------------------- function ReadSettings() local f = io.open(settingsfile, "r") if f then while true do -- no need to worry about CRs here because file was created by WriteSettings local line = f:read("*l") if not line then break end local keyword, value = split(line,"=") -- look for a keyword used in WriteSettings if not value then -- ignore keyword elseif keyword == "rule" then current_rule = value -- validate later in Main elseif keyword == "perc" then perc = tonumber(value) elseif keyword == "startup" then startup = value elseif keyword == "pattdir" then pattdir = value elseif keyword == "scriptdir" then scriptdir = value elseif keyword == "pastemode" then pastemode = value elseif keyword == "pastepos" then pastepos = value end end f:close() end end -------------------------------------------------------------------------------- function WriteSettings() local f = io.open(settingsfile, "w") if f then -- keywords must match those in ReadSettings (but order doesn't matter) f:write("rule=", current_rule, "\n") f:write("perc=", tostring(perc), "\n") f:write("startup=", startup, "\n") f:write("pattdir=", pattdir, "\n") f:write("scriptdir=", scriptdir, "\n") f:write("pastemode=", pastemode, "\n") f:write("pastepos=", pastepos, "\n") f:close() end end -------------------------------------------------------------------------------- function SaveGollyState() local oldstate = {} oldstate.status = g.setoption("showstatusbar", 1) -- show status bar oldstate.edit = g.setoption("showeditbar", 1) -- show edit bar oldstate.time = g.setoption("showtimeline", 0) -- hide timeline bar oldstate.tool = g.setoption("showtoolbar", 0) -- hide tool bar oldstate.layer = g.setoption("showlayerbar", 0) -- hide layer bar oldstate.buttons = g.setoption("showbuttons", 0) -- hide translucent buttons oldstate.tile = g.setoption("tilelayers", 0) -- don't tile layers oldstate.stack = g.setoption("stacklayers", 0) -- don't stack layers oldstate.files = g.setoption("showfiles", 0) -- hide file panel oldstate.filesdir = g.getdir("files") -- save file directory -- save colors of grid border and status bar oldstate.br, oldstate.bg, oldstate.bb = g.getcolor("border") oldstate.sr, oldstate.sg, oldstate.sb = g.getcolor(g.getalgo()) return oldstate end -------------------------------------------------------------------------------- function RestoreGollyState(oldstate) -- restore settings saved by SaveGollyState g.setoption("showstatusbar", oldstate.status) g.setoption("showeditbar", oldstate.edit) g.setoption("showtimeline", oldstate.time) g.setoption("showtoolbar", oldstate.tool) g.setoption("showlayerbar", oldstate.layer) g.setoption("showbuttons", oldstate.buttons) g.setoption("tilelayers", oldstate.tile) g.setoption("stacklayers", oldstate.stack) g.setoption("showfiles", oldstate.files) g.setdir("files", oldstate.filesdir) g.setcolor("border", oldstate.br, oldstate.bg, oldstate.bb) g.setcolor(g.getalgo(), oldstate.sr, oldstate.sg, oldstate.sb) -- delete the overlay and the layer added by AddNewLayer ov("delete") g.dellayer() end -------------------------------------------------------------------------------- function EnableControls(bool) -- disable/enable unsafe menu items so user scripts can call op.process -- File menu: mbar.enableitem(1, 1, bool) -- New Pattern mbar.enableitem(1, 2, bool) -- Random Pattern mbar.enableitem(1, 3, bool) -- Open Pattern mbar.enableitem(1, 4, bool) -- Open Clipboard mbar.enableitem(1, 5, bool) -- Save Pattern mbar.enableitem(1, 7, bool) -- Run Script mbar.enableitem(1, 8, bool) -- Run Clipboard mbar.enableitem(1, 9, bool) -- Set Startup Script if bool then -- g.exit will abort SCRIPT_NAME.lua mbar.setitem(1, 11, "Exit "..SCRIPT_NAME..".lua") else -- g.exit will abort the user script mbar.setitem(1, 11, "Exit Script") end -- Edit menu: mbar.enableitem(2, 1, bool) -- Undo mbar.enableitem(2, 2, bool) -- Redo mbar.enableitem(2, 4, bool) -- Cut mbar.enableitem(2, 5, bool) -- Copy mbar.enableitem(2, 6, bool) -- Paste mbar.enableitem(2, 7, bool) -- Clear mbar.enableitem(2, 8, bool) -- Clear Outside mbar.enableitem(2, 10, bool) -- Select All mbar.enableitem(2, 11, bool) -- Remove Selection mbar.enableitem(2, 12, bool) -- Shrink Selection mbar.enableitem(2, 13, bool) -- Flip Top-Bottom mbar.enableitem(2, 14, bool) -- Flip Left-Right mbar.enableitem(2, 15, bool) -- Rotate Clockwise mbar.enableitem(2, 16, bool) -- Rotate Anticlockwise mbar.enableitem(2, 17, bool) -- Random Fill mbar.enableitem(2, 18, bool) -- Set Density... -- View menu: mbar.enableitem(3, 1, bool) -- Fit Grid mbar.enableitem(3, 2, bool) -- Fit Pattern mbar.enableitem(3, 3, bool) -- Fit Selection mbar.enableitem(3, 4, bool) -- Middle -- disable/enable unsafe buttons ssbutton.enable(bool) s1button.enable(bool) stepbutton.enable(bool) resetbutton.enable(bool) undobutton.enable(bool) redobutton.enable(bool) rulebutton.enable(bool) if currbarht > 0 and not bool then -- user script is about to be run so avoid enabling menu items and buttons DrawMenuBar(false) DrawToolBar(false) g.update() end end -------------------------------------------------------------------------------- function DrawMenuBar(update) if update then -- enable/disable some menu items local selexists = #g.getselrect() > 0 -- Edit menu: mbar.enableitem(2, 1, #undostack > 0) -- Undo mbar.enableitem(2, 2, #redostack > 0) -- Redo mbar.enableitem(2, 4, selexists) -- Cut mbar.enableitem(2, 5, selexists) -- Copy mbar.enableitem(2, 7, selexists) -- Clear mbar.enableitem(2, 8, selexists) -- Clear Outside mbar.enableitem(2, 10, not g.empty()) -- Select All mbar.enableitem(2, 11, selexists) -- Remove Selection mbar.enableitem(2, 12, selexists) -- Shrink Selection mbar.enableitem(2, 13, selexists) -- Flip Top-Bottom mbar.enableitem(2, 14, selexists) -- Flip Left-Right mbar.enableitem(2, 15, selexists) -- Rotate Clockwise mbar.enableitem(2, 16, selexists) -- Rotate Anticlockwise mbar.enableitem(2, 17, selexists) -- Random Fill -- View menu: mbar.enableitem(3, 3, selexists) -- Fit Selection end -- draw menu bar in top left corner of layer mbar.show(0, 0, mbarwd, mbarht) end -------------------------------------------------------------------------------- function DrawToolBar(update) -- draw tool bar to right of menu bar ov(op.menubg) ovt{"fill", mbarwd, 0, ovwd - mbarwd, mbarht} if update then -- enable/disable some buttons ssbutton.enable(not g.empty()) s1button.enable(not g.empty()) stepbutton.enable(not g.empty()) resetbutton.enable(gencount > startcount) undobutton.enable(#undostack > 0) redobutton.enable(#redostack > 0) end local x = mbarwd + hgap local y = vgap local biggap = hgap * 3 ssbutton.show(x, y) x = x + ssbutton.wd + hgap s1button.show(x, y) x = x + s1button.wd + hgap stepbutton.show(x, y) x = x + stepbutton.wd + hgap resetbutton.show(x, y) x = x + resetbutton.wd + biggap undobutton.show(x, y) x = x + undobutton.wd + hgap redobutton.show(x, y) x = x + redobutton.wd + biggap rulebutton.show(x, y) -- show slider to right of rule button stepslider.show(x + rulebutton.wd + biggap, y, stepsize) -- show stepsize at right end of slider op.pastetext(stepslider.x + stepslider.wd + 2, y + 1, op.identity, "stepclip") -- last 2 buttons are at right end of tool bar x = ovwd - hgap - exitbutton.wd exitbutton.show(x, y) x = x - hgap - helpbutton.wd helpbutton.show(x, y) end -------------------------------------------------------------------------------- function UpdateWindowTitle() -- set window title if it has changed local newtitle = string.format("%s [%s]", pattname, current_rule) if dirty then newtitle = "*"..newtitle end if g.os() ~= "Mac" then newtitle = newtitle.." - Golly" end if newtitle ~= currtitle then g.settitle(newtitle) currtitle = newtitle end end -------------------------------------------------------------------------------- function UpdateEditBar() if g.getoption("showeditbar") > 0 then -- force edit bar to update g.setcursor( g.getcursor() ) end end -------------------------------------------------------------------------------- function Refresh(update) if scriptlevel > 0 and not update then -- user scripts need to call Update() when they want to refresh everything -- (calling g.update() will only refresh the pattern and status bar) return end if currbarht > 0 then DrawMenuBar(true) DrawToolBar(true) end UpdateEditBar() UpdateWindowTitle() g.update() end ---------------------------------------------------------------------- -- for user scripts function Update() Refresh(true) end -------------------------------------------------------------------------------- function UpdateStartButton() -- change label in ssbutton without changing the button's width if generating then ssbutton.customcolor = "rgba 210 0 0 255" ssbutton.darkcustomcolor = "rgba 150 0 0 255" ssbutton.setlabel("Stop", false) else ssbutton.customcolor = "rgba 0 150 0 255" ssbutton.darkcustomcolor = "rgba 0 90 0 255" ssbutton.setlabel("Start", false) end end -------------------------------------------------------------------------------- function StopGenerating() if generating then generating = false UpdateStartButton() end end -------------------------------------------------------------------------------- function SaveState() -- return a table containing current state local state = {} -- save current rule state.saverule = current_rule -- save current pattern state.savecells = g.getcells( g.getrect() ) state.savedirty = dirty state.savename = pattname state.savegencount = gencount -- save current selection state.savesel = g.getselrect() -- save current cursor state.savecursor = g.getcursor() -- save current step size state.savestep = stepsize -- save current position and scale state.savex, state.savey = g.getpos() state.savemag = g.getmag() return state end -------------------------------------------------------------------------------- function RestoreState(state) -- restore state from given info (created earlier by SaveState) -- restore rule if necessary if current_rule ~= state.saverule then CheckRule(state.saverule) end -- restore pattern if not g.empty() then g.new("") end g.putcells(state.savecells) dirty = state.savedirty pattname = state.savename gencount = state.savegencount g.setgen(tostring(gencount)) -- call SetColors AFTER restoring gencount in case caller has overridden it -- to use different colors depending on gencount SetColors() -- restore selection g.select(state.savesel) -- restore cursor g.setcursor(state.savecursor) -- restore step size SetStepSize(state.savestep) -- restore position and scale g.setpos(state.savex, state.savey) g.setmag(state.savemag) end -------------------------------------------------------------------------------- function SameState(state) -- return true if given state matches the current state if g.getcursor() ~= state.savecursor then return false end if current_rule ~= state.saverule then return false end if dirty ~= state.savedirty then return false end if pattname ~= state.savename then return false end if gencount ~= state.savegencount then return false end if not gp.equal(g.getcells(g.getrect()), state.savecells) then return false end if not gp.equal(g.getselrect(), state.savesel) then return false end -- note that we don't check state.savestep, state.savex, state.savey or state.savemag -- (we don't call RememberCurrentState when the user changes the step size, position or scale) return true end -------------------------------------------------------------------------------- function ClearUndoRedo() -- this might be called if a user script is running (eg. if it calls NewPattern) undostack = {} redostack = {} dirty = false end -------------------------------------------------------------------------------- function Undo() -- ignore if user script is running -- (scripts can call SaveState and RestoreState if they need to undo stuff) if scriptlevel > 0 then return end if #undostack > 0 then StopGenerating() -- push current state onto redostack redostack[#redostack+1] = SaveState() -- pop state off undostack and restore it RestoreState( table.remove(undostack) ) Refresh() end end -------------------------------------------------------------------------------- function Redo() -- ignore if user script is running if scriptlevel > 0 then return end if #redostack > 0 then StopGenerating() -- push current state onto undostack undostack[#undostack+1] = SaveState() -- pop state off redostack and restore it RestoreState( table.remove(redostack) ) Refresh() end end -------------------------------------------------------------------------------- function RememberCurrentState() -- ignore if user script is running if scriptlevel > 0 then return end redostack = {} undostack[#undostack+1] = SaveState() -- pattern might be about to change so tell NextGeneration that currpattern needs to be updated currpattern = nil end -------------------------------------------------------------------------------- function ShowMessage(msg) -- don't show msg if user script is running or status bar is hidden if scriptlevel > 0 or g.getoption("showstatusbar") == 0 then return end g.show(msg) end -------------------------------------------------------------------------------- function ShowError(msg) -- don't show msg if user script is running if scriptlevel > 0 then return end -- best to show status bar so user sees error g.setoption("showstatusbar",1) g.error(msg) -- same as g.show but with a beep end -------------------------------------------------------------------------------- function CheckIfGenerating() if generating and not g.empty() and gencount > startcount then -- NextGeneration will be called soon RememberCurrentState() end end -------------------------------------------------------------------------------- function AdjustPosition() if currbarht > 0 then -- adjust vertical position to allow for tool bar local barcells if g.getmag() >= 0 then barcells = currbarht // int(2^g.getmag()) else barcells = currbarht * int(2^-g.getmag()) end local x, y = g.getpos() y = tonumber(y) - (barcells+1)//2 if y < miny then y = miny end if y > maxy then y = maxy end g.setpos(x, tostring(y)) end end -------------------------------------------------------------------------------- function FitGrid() local oldsel = g.getselrect() g.select( {minx, miny, gridwd, gridht} ) g.fitsel() g.select(oldsel) AdjustPosition() Refresh() end -------------------------------------------------------------------------------- function FitPattern() g.fit() AdjustPosition() Refresh() end -------------------------------------------------------------------------------- function FitSelection() if #g.getselrect() > 0 then g.fitsel() AdjustPosition() Refresh() end end -------------------------------------------------------------------------------- function MiddleView() g.setpos("0","0") AdjustPosition() Refresh() end -------------------------------------------------------------------------------- function NewPattern(title) pattname = title or "untitled" g.new(pattname) g.setcursor("Draw") gencount = 0 startcount = 0 SetStepSize(1) SetColors() StopGenerating() ClearUndoRedo() FitPattern() -- calls Refresh end -------------------------------------------------------------------------------- function ReadPattern(filepath, source) local f = io.open(filepath,"r") if not f then return "Failed to open file:\n"..filepath end local contents = f:read("*a") f:close() -- check that the file contains a valid RLE header line local wd, ht, rule = contents:match("x[= ]+(%d+)[, ]+y[= ]+(%d+)[, ]+rule[= ]+([^\n\r]+)") if wd and ht and rule then wd = tonumber(wd) ht = tonumber(ht) else return source.." does not contain a valid RLE header." end -- save current rule, pattern, etc local oldstate = SaveState() -- check that rule is valid if CheckRule(rule) ~= nil then return source.." contains an unsupported rule:\n"..rule end -- check for a comment line like "#CXRLE Pos=-6,-7 Gen=2" local xp, yp = contents:match("#CXRLE.+Pos=(%-?%d+),(%-?%d+)") if xp and yp then xp = tonumber(xp) yp = tonumber(yp) end local gens = contents:match("#CXRLE.+Gen=(%d+)") if gens then gens = tonumber(gens) else gens = 0 end -- create temporary file with same contents but replace rule with real_rule if rule:find("%-") then rule = rule:gsub("%-","%%-") -- need to escape hyphens end contents = contents:gsub("rule[= ]+"..rule, "rule = "..real_rule, 1) local temppath = g.getdir("temp").."temp.rle" f = io.open(temppath,"w") if not f then RestoreState(oldstate) return "Failed to create temporary file!" end f:write(contents) f:close() -- save current state, clear universe and use g.open to load temporary file local cellarray = {} g.new("") g.open(temppath) SetColors() cellarray = g.getcells(g.getrect()) -- success local newpattern = { rule = current_rule, -- set by above CheckRule width = wd, height = ht, xpos = xp, -- nil if no Pos info in #CXRLE line ypos = yp, -- ditto gen = gens, cells = cellarray } RestoreState(oldstate) -- restores rule, pattern, stepsize, etc return nil, newpattern end -------------------------------------------------------------------------------- function CreatePattern(newpattern) -- called by OpenPattern/OpenClipboard g.new(pattname) SetStepSize(1) g.setcursor("Move") CheckRule(newpattern.rule) -- sets current_rule and calls SetColors g.putcells(newpattern.cells) gencount = newpattern.gen g.setgen(tostring(gencount)) -- for status bar startcount = gencount -- for Reset StopGenerating() ClearUndoRedo() -- dirty = false FitPattern() -- calls Refresh end -------------------------------------------------------------------------------- function OpenPattern(filepath) if filepath then local err, newpattern = ReadPattern(filepath, "File") if err then g.warn(err, false) else -- pattern ok so use info in newpattern to create the new pattern; -- set pattname to file name at end of filepath pattname = filepath:match("^.+"..pathsep.."(.+)$") CreatePattern(newpattern) end else -- prompt user for a .rle file to open local filetype = "RLE file (*.rle)|*.rle" local path = g.opendialog("Open a pattern", filetype, pattdir, "") if #path > 0 then -- update pattdir by stripping off the file name pattdir = path:gsub("[^"..pathsep.."]+$","") -- open the chosen pattern OpenPattern(path) end end end -------------------------------------------------------------------------------- function CopyClipboardToFile() -- create a temporary file containing clipboard text local filepath = g.getdir("temp").."clipboard.rle" local f = io.open(filepath,"w") if not f then g.warn("Failed to create temporary clipboard file!", false) return nil end -- NOTE: we can't do f:write(string.gsub(g.getclipstr(),"\r","\n")) -- because gsub returns 2 results and we'd get count appended to file! local clip = string.gsub(g.getclipstr(),"\r","\n") f:write(clip) f:close() return filepath end -------------------------------------------------------------------------------- function OpenClipboard() local filepath = CopyClipboardToFile() if filepath then local err, newpattern = ReadPattern(filepath, "Clipboard") if err then g.warn(err, false) else -- pattern ok so use info in newpattern to create the new pattern pattname = "clipboard" CreatePattern(newpattern) end end end -------------------------------------------------------------------------------- function WritePattern(filepath) -- save current pattern as RLE file g.save(filepath,"rle") -- now modify the file, replacing real_rule with current_rule local f = io.open(filepath,"r") if not f then return "Failed to read RLE file:\n"..filepath end local newcontents = f:read("*a"):gsub("rule = "..real_rule, "rule = "..current_rule, 1) f:close() f = io.open(filepath,"w") if not f then return "Failed to fix rule in RLE file:\n"..filepath end f:write(newcontents) f:close() return nil -- success end -------------------------------------------------------------------------------- function SavePattern(filepath) if filepath then local err = WritePattern(filepath) if err then g.warn(err, false) else -- set pattname to file name at end of filepath pattname = filepath:match("^.+"..pathsep.."(.+)$") dirty = false Refresh() end else -- prompt user for file name and location local filetype = "RLE file (*.rle)|*.rle" local path = g.savedialog("Save pattern", filetype, pattdir, pattname) if #path > 0 then -- update pattdir by stripping off the file name pattdir = path:gsub("[^"..pathsep.."]+$","") -- ensure file name ends with ".rle" if not path:find("%.rle$") then path = path..".rle" end -- save the current pattern SavePattern(path) end end end -------------------------------------------------------------------------------- local Exit_called = false function Exit(message) -- user scripts should call this function rather than g.exit Exit_called = true g.exit(message) end -------------------------------------------------------------------------------- function CallScript(func, fromclip) -- avoid infinite recursion if scriptlevel == 100 then g.warn("Script is too recursive!", false) return end if scriptlevel == 0 then RememberCurrentState() -- #undostack is > 0 EnableControls(false) -- disable most menu items and buttons Exit_called = false end scriptlevel = scriptlevel + 1 local status, err = pcall(func) scriptlevel = scriptlevel - 1 if err then g.continue("") if err == "GOLLY: ABORT SCRIPT" then -- user hit escape or script called Exit(message); -- if the latter then don't clobber the message in the status bar if not Exit_called then ShowMessage("Script aborted.") end else if fromclip then g.warn("Runtime error in clipboard script:\n\n"..err, false) else g.warn("Runtime error in script:\n\n"..err, false) end end end if scriptlevel == 0 then -- note that if the script called NewPattern/RandomPattern/OpenPattern -- or any other function that called ClearUndoRedo then the undostack -- is empty and dirty should be false if #undostack == 0 then -- some call might have set dirty to true, so reset it dirty = false if gencount > startcount then -- script called Step after NewPattern/RandomPattern/OpenPattern -- so push startstate onto undostack so user can Reset/Undo undostack[1] = startstate startstate.savedirty = false end elseif SameState(undostack[#undostack]) then -- script didn't change the current state so pop undostack table.remove(undostack) end EnableControls(true) -- enable menu items and buttons that were disabled above CheckIfGenerating() Refresh() -- calls DrawMenuBar and DrawToolBar end end -------------------------------------------------------------------------------- function RunScript(filepath) if generating then StopGenerating() Refresh() end if filepath then local f = io.open(filepath, "r") if f then -- Lua's f:read("*l") doesn't detect CR as EOL so we do this ugly stuff: -- read entire file and convert any CRs to LFs local all = f:read("*a"):gsub("\r", "\n").."\n" local nextline = all:gmatch("(.-)\n") local line1 = nextline() f:close() if not (line1 and (line1:find(SCRIPT_NAME..".lua") or line1:find("NewCA.lua"))) then g.warn("First line of script must contain "..SCRIPT_NAME..".lua or NewCA.lua.", false) return end else g.warn("Script file could not be opened:\n"..filepath, false) return end local func, msg = loadfile(filepath) if func then CallScript(func, false) else g.warn("Syntax error in script:\n\n"..msg, false) end else -- prompt user for a .lua file to run local filetype = "Lua file (*.lua)|*.lua" local path = g.opendialog("Choose a Lua script", filetype, scriptdir, "") if #path > 0 then -- update scriptdir by stripping off the file name scriptdir = path:gsub("[^"..pathsep.."]+$","") -- run the chosen script RunScript(path) end end end -------------------------------------------------------------------------------- function RunClipboard() if generating then StopGenerating() Refresh() end local cliptext = g.getclipstr() local eol = cliptext:find("[\n\r]") if not (eol and (cliptext:sub(1,eol):find(SCRIPT_NAME..".lua") or cliptext:sub(1,eol):find("NewCA.lua"))) then g.warn("First line of clipboard must contain "..SCRIPT_NAME..".lua or NewCA.lua.", false) return end local func, msg = load(cliptext) if func then CallScript(func, true) else g.warn("Syntax error in clipboard script:\n\n"..msg, false) end end -------------------------------------------------------------------------------- function SetStartupScript() -- prompt user for a .lua file to run automatically when SCRIPT_NAME.lua starts up local filetype = "Lua file (*.lua)|*.lua" local path = g.opendialog("Select your startup script", filetype, scriptdir, "") if #path > 0 then -- update scriptdir by stripping off the file name scriptdir = path:gsub("[^"..pathsep.."]+$","") startup = path -- the above path will be saved by WriteSettings end end -------------------------------------------------------------------------------- function SetDensity(percentage) local function getperc() local initstring = tostring(perc) ::try_again:: local s = g.getstring("Enter density as a percentage from 1 to 100\n".. "(used by Random Pattern and Random Fill):\n", initstring, "Density") initstring = s if gp.validint(s) and (tonumber(s) >= 1) and (tonumber(s) <= 100) then perc = tonumber(s) else g.warn("Percentage must be an integer from 1 to 100.\nTry again.") goto try_again end end if percentage then perc = percentage if perc < 1 then perc = 1 end if perc > 100 then perc = 100 end else -- prompt user for the percentage; -- if user hits Cancel button we want to avoid aborting script local status, err = pcall(getperc) if err then g.continue("") -- don't show error when script finishes end end end -------------------------------------------------------------------------------- function RandomPattern(percentage, wd, ht) percentage = percentage or perc if percentage < 1 then percentage = 1 end if percentage > 100 then percentage = 100 end wd = wd or 100 ht = ht or 100 if wd > gridwd then wd = gridwd end if ht > gridht then ht = gridht end pattname = "random" g.new(pattname) g.setcursor("Move") gencount = 0 startcount = 0 SetStepSize(1) SetColors() StopGenerating() ClearUndoRedo() for y = -(ht//2), (ht//2)-1 do for x = -(wd//2), (wd//2)-1 do if rand(0,99) < percentage then g.setcell(x, y, rand(1,g.numstates()-1)) end end end FitGrid() -- calls Refresh end -------------------------------------------------------------------------------- function ChangeRule() local function getrule() local newrule = current_rule ::try_again:: newrule = g.getstring("Enter the new rule (with an optional suffix that\n".. "specifies the grid width and height):\n", newrule, "Set rule") local err = CheckRule(newrule) if err then g.warn(err) goto try_again end end RememberCurrentState() local oldrule = current_rule -- if user hits Cancel button we want to avoid aborting script local status, err = pcall(getrule) if err then g.continue("") -- don't show error when script finishes end if oldrule == current_rule then -- error or rule wasn't changed so pop undostack table.remove(undostack) else CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function CellToPixel(x, y) -- convert cell position to pixel position in overlay -- (assumes overlay is in top left corner of viewport) local viewmag = g.getmag() local negmagpow2 = 2^(-viewmag) local magpow2 = 2^viewmag -- get position of central cell in viewport local xc, yc = g.getpos() xc = tonumber(xc) yc = tonumber(yc) -- use method in viewport::reposition to calculate top left cell local x0 = xc - int(viewwd * negmagpow2) // 2 local y0 = yc - int(viewht * negmagpow2) // 2 -- use method in viewport::screenPosOf if viewmag < 0 then local xx0 = x0 local yy0 = y0 -- from ltlalgo::lowerRightPixel xx0 = int(xx0 // negmagpow2) xx0 = int(xx0 * negmagpow2) yy0 = yy0 - 1 yy0 = int(yy0 // negmagpow2) yy0 = int(yy0 * negmagpow2) yy0 = yy0 + 1 x = x - xx0 y = y - yy0 else x = x - x0 y = y - y0 end x = int(x * magpow2) y = int(y * magpow2) return x, y end -------------------------------------------------------------------------------- function PixelToCell(x, y) -- convert pixel position in overlay to cell position -- (which might be outside bounded grid) local viewmag = g.getmag() local negmagpow2 = 2^(-viewmag) -- get position of central cell in viewport local xc, yc = g.getpos() xc = tonumber(xc) yc = tonumber(yc) -- use method in viewport::reposition to calculate top left cell local x0 = xc - int(viewwd * negmagpow2) // 2 local y0 = yc - int(viewht * negmagpow2) // 2 -- use method in viewport::at to calculate cell position of x,y xc = int(x * negmagpow2) + x0 yc = int(y * negmagpow2) + y0 return xc, yc end -------------------------------------------------------------------------------- local function DrawPasteCell(xoff, yoff, viewmag) if viewmag == 0 then ovt{"set", xoff, yoff} elseif viewmag > 0 then local cellsize = int(2^viewmag) local x = xoff * cellsize local y = yoff * cellsize if cellsize > 2 then cellsize = cellsize - 1 end ovt{"fill", x, y, cellsize, cellsize} else -- viewmag < 0 ovt{"set", xoff // 2^(-viewmag), yoff // 2^(-viewmag)} end end -------------------------------------------------------------------------------- function CreatePastePattern() local viewmag = g.getmag() local wd, ht = pastewd, pasteht if viewmag > 0 then wd = wd * int(2^viewmag) ht = ht * int(2^viewmag) elseif viewmag < 0 then wd = wd // int(2^(-viewmag)) + 1 ht = ht // int(2^(-viewmag)) + 1 end -- create a translucent red rectangle in pasteclip ov("create "..wd.." "..ht.." "..pasteclip) ov("target "..pasteclip) ovt{"rgba", 255, 0, 0, 128} ovt{"fill", 0, 0, wd, ht} -- blend the live cells into the translucent rectangle ov("blend 1") local len = #pastecells if len % 2 == 0 then -- pastecells is a one-state cell array local S,R,G,B = table.unpack(g.getcolors(1)) ovt{"rgba", R, G, B, 128} for i = 1, len, 2 do DrawPasteCell(pastecells[i], pastecells[i+1], viewmag) end else -- pastecells is a multi-state cell array if len % 3 > 0 then len = len - 1 end local colors = g.getcolors() for i = 1, len, 3 do local Rpos = pastecells[i+2] * 4 + 2 ovt{"rgba", colors[Rpos], colors[Rpos+1], colors[Rpos+2], 128} DrawPasteCell(pastecells[i], pastecells[i+1], viewmag) end end ov("blend 0") ov("target") -- create black-on-white pastemode text in modeclip ov("rgba 0 0 0 255") wd, modeht = op.maketext(pastemode:upper()) wd = wd + 8 ov("create "..wd.." "..modeht.." "..modeclip) ov("target "..modeclip) ovt{"rgba", 255, 255, 255, 255} ovt{"fill", 0, 0, wd, modeht} ov("blend 1") op.pastetext(4, 0) ov("blend 0") ov("target") end -------------------------------------------------------------------------------- function ClearPastePattern() ov(alpha1) ovt{"fill", 0, currbarht, ovwd, ovht-currbarht} end -------------------------------------------------------------------------------- function DrawPastePattern(xc, yc) -- draw the translucent paste pattern with mouse at the given cell position -- adjust xc,yc if pastepos is not "topleft" if pastepos == "topright" then xc = xc - pastewd + 1 elseif pastepos == "bottomright" then xc = xc - pastewd + 1 yc = yc - pasteht + 1 elseif pastepos == "bottomleft" then yc = yc - pasteht + 1 elseif pastepos == "middle" then xc = xc - pastewd//2 yc = yc - pasteht//2 end local xp, yp = CellToPixel(xc, yc) ov("blend 1") ov("paste "..xp.." "..yp.." "..pasteclip) ov("paste "..xp.." "..(yp-modeht).." "..modeclip) ov("blend 0") if currbarht > 0 then -- may need to redraw menu/tool bar if yp-modeht <= currbarht then DrawMenuBar(false) DrawToolBar(false) end end end -------------------------------------------------------------------------------- function FlipPaste(leftright) if #pastecells > 0 then if leftright then pastecells = g.transform(pastecells, pastewd-1, 0, -1, 0, 0, 1) else pastecells = g.transform(pastecells, 0, pasteht-1, 1, 0, 0, -1) end updatepaste = true end end -------------------------------------------------------------------------------- function RotatePaste(clockwise) if #pastecells > 0 or pasteht ~= pastewd then if #pastecells > 0 then if clockwise then pastecells = g.transform(pastecells, pasteht-1, 0, 0, -1, 1, 0) else pastecells = g.transform(pastecells, 0, pastewd-1, 0, 1, -1, 0) end end pastewd, pasteht = pasteht, pastewd updatepaste = true end end -------------------------------------------------------------------------------- function SetPasteMode(mode) pastemode = mode updatepaste = true end -------------------------------------------------------------------------------- function CyclePasteMode() if pastemode == "and" then pastemode = "copy" elseif pastemode == "copy" then pastemode = "or" elseif pastemode == "or" then pastemode = "xor" elseif pastemode == "xor" then pastemode = "and" else -- should never happen but play safe pastemode = "or" end updatepaste = true end -------------------------------------------------------------------------------- function SetPasteLocation(location) pastepos = location updatepaste = true end -------------------------------------------------------------------------------- function CyclePasteLocation() if pastepos == "topleft" then pastepos = "topright" elseif pastepos == "topright" then pastepos = "bottomright" elseif pastepos == "bottomright" then pastepos = "bottomleft" elseif pastepos == "bottomleft" then pastepos = "middle" elseif pastepos == "middle" then pastepos = "topleft" else -- should never happen but play safe pastepos = "topleft" end updatepaste = true end -------------------------------------------------------------------------------- function HandlePasteKey(event) local _, key, mods = split(event) if key == "x" and mods == "none" then FlipPaste(true) elseif key == "y" and mods == "none" then FlipPaste(false) elseif key == ">" and mods == "none" then RotatePaste(true) elseif key == "<" and mods == "none" then RotatePaste(false) elseif key == "m" and mods == "shift" then CyclePasteMode() elseif key == "l" and mods == "shift" then CyclePasteLocation() elseif key == "t" and mods == "none" then ToggleToolBar() elseif key == "g" and mods == "none" then FitGrid() elseif key == "f" and mods == "none" then FitPattern() elseif key == "f" and mods == "shift" then FitSelection() elseif key == "m" and mods == "none" then MiddleView() elseif key == "h" and mods == "none" then ShowHelp() else -- allow keyboard shortcut to change scale etc g.doevent(event) end end -------------------------------------------------------------------------------- function DoPaste(x, y) -- adjust x,y if pastepos isn't "topleft" if pastepos == "topright" then x = x - pastewd + 1 elseif pastepos == "bottomright" then x = x - pastewd + 1 y = y - pasteht + 1 elseif pastepos == "bottomleft" then y = y - pasteht + 1 elseif pastepos == "middle" then x = x - pastewd//2 y = y - pasteht//2 end if pastemode == "copy" and not g.empty() then -- erase any live cells under paste pattern if x > maxx or x + pastewd - 1 < minx or y > maxy or y + pasteht - 1 < miny then -- paste pattern is completely outside bounded grid else local left = math.max(x, minx) local top = math.max(y, miny) local right = math.min(x + pastewd - 1, maxx) local bottom = math.min(y + pasteht - 1, maxy) local livecells = g.getcells( {left, top, right-left+1, bottom-top+1} ) g.putcells(livecells, 0, 0, 1, 0, 0, 1, "xor") end end -- silently clip any cells outside bounded grid (like Golly) -- by temporarily switching to an unbounded universe g.setrule( real_rule:sub(1,real_rule:find(":")-1) ) g.putcells(pastecells, x, y, 1, 0, 0, 1, pastemode) local oldsel = g.getselrect() g.select( {minx, miny, gridwd, gridht} ) g.clear(1) g.select(oldsel) g.setrule(real_rule) SetColors() end -------------------------------------------------------------------------------- function CreatePopUpMenu() -- create a pop-up menu with various paste actions pastemenu = op.popupmenu() pastemenu.additem("Flip Top-Bottom", FlipPaste, {false}) pastemenu.additem("Flip Left-Right", FlipPaste, {true}) pastemenu.additem("Rotate Clockwise", RotatePaste, {true}) pastemenu.additem("Rotate Anticlockwise", RotatePaste, {false}) pastemenu.additem("---", nil) pastemenu.additem("AND Mode", SetPasteMode, {"and"}) pastemenu.additem("COPY Mode", SetPasteMode, {"copy"}) pastemenu.additem("OR Mode", SetPasteMode, {"or"}) pastemenu.additem("XOR Mode", SetPasteMode, {"xor"}) pastemenu.additem("---", nil) pastemenu.additem("Top Left Location", SetPasteLocation, {"topleft"}) pastemenu.additem("Top Right Location", SetPasteLocation, {"topright"}) pastemenu.additem("Bottom Right Location", SetPasteLocation, {"bottomright"}) pastemenu.additem("Bottom Left Location", SetPasteLocation, {"bottomleft"}) pastemenu.additem("Middle Location", SetPasteLocation, {"middle"}) pastemenu.additem("---", nil) pastemenu.additem("Cancel Paste", g.exit) end -------------------------------------------------------------------------------- function ChoosePasteAction(x, y) -- show dark red pop-up menu and let user choose a paste action pastemenu.setbgcolor("rgba 128 0 0 255") ov("cursor arrow") pastemenu.show(x, y, viewwd, viewht) ov("cursor current") end -------------------------------------------------------------------------------- function WaitForPaste() -- create a translucent paste pattern in pasteclip CreatePastePattern() updatepaste = false local currwd, currht = viewwd, viewht local currmag = g.getmag() local prevx, prevy while true do local event = g.getevent() if #event == 0 then g.sleep(2) -- don't hog the CPU CheckWindowSize() -- scale or window size might have changed if currmag ~= g.getmag() or currwd ~= viewwd or currht ~= viewht or updatepaste then currwd, currht = viewwd, viewht currmag = g.getmag() -- need to recreate the translucent paste pattern CreatePastePattern() updatepaste = false prevx, prevy = nil, nil end local pixelpos = ov("xy") if #pixelpos == 0 then ClearPastePattern() g.update() else local x, y = split(pixelpos) x, y = tonumber(x), tonumber(y) local xc, yc = PixelToCell(x, y) if xc ~= prevx or yc ~= prevy then -- mouse has moved to a new cell (possibly outside bounded grid) ClearPastePattern() if y >= currbarht then DrawPastePattern(xc, yc) end g.update() prevx = xc prevy = yc end end elseif event:find("^key") then HandlePasteKey(event) -- updatepaste might be true elseif event:find("^oclick") then local _, x, y, button, mods = split(event) x, y = tonumber(x), tonumber(y) if y < currbarht then -- cancel paste if click in menu/tool bar g.exit() elseif (button == "right" and (mods == "none" or mods == "ctrl")) or (button == "left" and mods == "ctrl") then -- right-click or ctrl-click so display pop-up menu ChoosePasteAction(x, y) -- updatepaste might be true elseif button == "left" and mods == "none" then DoPaste( PixelToCell(x, y) ) break end elseif event:find("^ozoom") then -- remove the "o" and do the zoom g.doevent(event:sub(2)) end end return nil -- cells were successfully pasted end -------------------------------------------------------------------------------- function Paste() -- if the clipboard contains a valid pattern then create a paste pattern local filepath = CopyClipboardToFile() if not filepath then return end local err, newpattern = ReadPattern(filepath, "Clipboard") if err then g.warn(err, false) Refresh() return end if #newpattern.cells == 0 then -- clipboard pattern is empty pastewd = newpattern.width pasteht = newpattern.height pastecells = {} else -- find the pattern's minimal bounding box local bbox = gp.getminbox(newpattern.cells) pastewd = math.max(bbox.wd, newpattern.width) pasteht = math.max(bbox.ht, newpattern.height) if newpattern.xpos and newpattern.ypos then pastecells = g.transform(newpattern.cells, -newpattern.xpos, -newpattern.ypos) else -- g.open centered pattern pastecells = g.transform(newpattern.cells, newpattern.width//2, newpattern.height//2) end end RememberCurrentState() g.show("Click where you want to paste...") local oldcursor = g.setcursor("Select") -- call WaitForPaste via pcall so user can hit escape to cancel paste local status, err = xpcall(WaitForPaste, gp.trace) if err then g.continue("") if not err:find("^GOLLY: ABORT SCRIPT") then -- runtime error occurred somewhere inside WaitForPaste g.warn(err, false) end g.show("Paste aborted.") table.remove(undostack) else -- paste succeeded g.show("") dirty = true end g.setcursor(oldcursor) -- delete the clips and clear the paste pattern ov("delete "..pasteclip) ov("delete "..modeclip) ClearPastePattern() pastecells = {} CheckIfGenerating() Refresh() end -------------------------------------------------------------------------------- function RemoveSelection() if #g.getselrect() > 0 then -- remove the current selection RememberCurrentState() g.select({}) ShowMessage("") Refresh() end end -------------------------------------------------------------------------------- function SelectAll() local sel = g.getselrect() local r = g.getrect() if #r == 0 then if #sel > 0 then RemoveSelection() -- calls RememberCurrentState end ShowError("All cells are dead.") else -- pattern exists if #sel > 0 and r[1] == sel[1] and r[2] == sel[2] and r[3] == sel[3] and r[4] == sel[4] then -- selection rect won't change else RememberCurrentState() g.select(r) ShowMessage("Selection wd x ht = "..r[3].." x "..r[4]) Refresh() end end end -------------------------------------------------------------------------------- function ClearSelection() local sel = g.getselrect() if #sel > 0 then -- check if there are any live cells inside the selection local cells = g.getcells(sel) if #cells > 0 then -- there are live cells inside the selection RememberCurrentState() dirty = true g.clear(0) Refresh() end end end -------------------------------------------------------------------------------- function ClearOutside() local sel = g.getselrect() if #sel > 0 then -- check if there are any live cells outside the selection local r = g.getrect() if #r == 0 or ( r[1] >= sel[1] and r[2] >= sel[2] and r[1]+r[3]-1 <= sel[1]+sel[3]-1 and r[2]+r[4]-1 <= sel[2]+sel[4]-1 ) then -- there are no live cells outside the selection else RememberCurrentState() dirty = true g.clear(1) Refresh() end end end -------------------------------------------------------------------------------- function FixClipboardRule() -- get clipboard string and replace real_rule with current_rule local s = string.gsub(g.getclipstr(), "rule = "..real_rule, "rule = "..current_rule, 1) g.setclipstr(s) end -------------------------------------------------------------------------------- function CopySelection() if #g.getselrect() > 0 then -- copy selection to clipboard g.copy() FixClipboardRule() end end -------------------------------------------------------------------------------- function CutSelection() local sel = g.getselrect() if #sel > 0 then -- check if there are any live cells inside the selection local cells = g.getcells(sel) if #cells > 0 then -- there are live cells inside the selection RememberCurrentState() dirty = true end g.cut() -- saves selection in clipboard even if empty FixClipboardRule() Refresh() end end -------------------------------------------------------------------------------- function ShrinkSelection() local sel = g.getselrect() if #sel > 0 then -- check if there are any live cells inside the selection local cells = g.getcells(sel) if #cells == 0 then ShowError("There are no live cells in the selection.") else RememberCurrentState() g.shrink() Refresh() end end end -------------------------------------------------------------------------------- function FlipTopBottom() if #g.getselrect() > 0 then RememberCurrentState() dirty = true g.flip(1) Refresh() end end -------------------------------------------------------------------------------- function FlipLeftRight() if #g.getselrect() > 0 then RememberCurrentState() dirty = true g.flip(0) Refresh() end end -------------------------------------------------------------------------------- function InsideGrid(left, top, right, bottom) -- return true if all edges of given rectangle are inside grid if left < minx or right > maxx then return false end if top < miny or bottom > maxy then return false end return true end -------------------------------------------------------------------------------- function RotateClockwise() local sel = g.getselrect() if #sel > 0 then -- rotate selection clockwise about its center (the following method ensures -- the original selection will be restored after 4 such rotations) local selwd = sel[3] local selht = sel[4] local midx = sel[1] + (selwd - 1) // 2 local midy = sel[2] + (selht - 1) // 2 local newx = midx + sel[2] - midy local newy = midy + sel[1] - midx if not InsideGrid(newx, newy, newx+selht-1, newy+selwd-1) then ShowError("Rotation is not allowed if selection would be outside grid.") return end local selcells = g.getcells(sel) if #selcells > 0 or selht ~= selwd then RememberCurrentState() dirty = true g.rotate(0) Refresh() end end end -------------------------------------------------------------------------------- function RotateAnticlockwise() local sel = g.getselrect() if #sel > 0 then -- rotate selection anticlockwise about its center (the following method ensures -- the original selection will be restored after 4 such rotations) local selwd = sel[3] local selht = sel[4] local midx = sel[1] + (selwd - 1) // 2 local midy = sel[2] + (selht - 1) // 2 local newx = midx + sel[2] - midy local newy = midy + sel[1] - midx if not InsideGrid(newx, newy, newx+selht-1, newy+selwd-1) then ShowError("Rotation is not allowed if selection would be outside grid.") return end local selcells = g.getcells(sel) if #selcells > 0 or selht ~= selwd then RememberCurrentState() dirty = true g.rotate(1) Refresh() end end end -------------------------------------------------------------------------------- function RandomFill() if #g.getselrect() > 0 then RememberCurrentState() dirty = true g.randfill(perc) Refresh() end end -------------------------------------------------------------------------------- function OpenFile(filepath) if filepath:find("%.rle$") then OpenPattern(filepath) elseif filepath:find("%.lua$") then RunScript(filepath) else g.warn("Unexpected file:\n"..filepath.."\n\n".. "File extension must be .rle or .lua.", false) end end -------------------------------------------------------------------------------- function StartStop() generating = not generating UpdateStartButton() Refresh() if generating and not g.empty() then RememberCurrentState() stopgen = 0 -- EventLoop will call NextGeneration repeatedly end end -------------------------------------------------------------------------------- function Step1() if generating then StopGenerating() Refresh() else if not g.empty() then RememberCurrentState() end stopgen = gencount + 1 generating = true -- EventLoop will call NextGeneration once end end -------------------------------------------------------------------------------- function NextStep() if generating then StopGenerating() Refresh() else if not g.empty() then RememberCurrentState() end stopgen = gencount + stepsize generating = true -- EventLoop will call NextGeneration until gencount >= stopgen end end -------------------------------------------------------------------------------- MAX_STEP_SIZE = 100 -- startup script might want to change this function SetStepSize(n) if n > MAX_STEP_SIZE then n = MAX_STEP_SIZE end if n < 1 then n = 1 end stepsize = n -- show same step size in status bar if n == 1 then g.setbase(2) g.setstep(0) else g.setbase(n) g.setstep(1) end -- create clip with "Step=..." text for use in DrawToolBar local oldfont = ov(op.textfont) local oldbg = ov("textoption background "..op.menubg:sub(6)) op.maketext("Step="..stepsize, "stepclip", op.white, 2, 2) ov("textoption background "..oldbg) ov("font "..oldfont) end -------------------------------------------------------------------------------- function Faster() SetStepSize(stepsize + 1) Refresh() end -------------------------------------------------------------------------------- function Slower() SetStepSize(stepsize - 1) Refresh() end -------------------------------------------------------------------------------- function StepChange(newval) -- called if stepslider position has changed SetStepSize(newval) Refresh() end -------------------------------------------------------------------------------- function Reset() if gencount > startcount then -- restore the starting state if scriptlevel > 0 then -- Reset was called by user script so don't modify undo/redo stacks RestoreState(startstate) else -- push current state onto redostack redostack[#redostack+1] = SaveState() while true do -- unwind undostack until gencount == startcount local state = table.remove(undostack) if state.savegencount == startcount then -- restore starting state RestoreState(state) break else -- push state onto redostack redostack[#redostack+1] = state end end StopGenerating() Refresh() end end end -------------------------------------------------------------------------------- -- getters for user scripts function GetRule() return current_rule end function GetGenCount() return gencount end function GetStepSize() return stepsize end function GetBarHeight() return currbarht end function GetDensity() return perc end -------------------------------------------------------------------------------- -- for user scripts function Step(n) n = n or 1 while not g.empty() and n > 0 do NextGeneration() n = n - 1 end end -------------------------------------------------------------------------------- -- for user scripts function SetRule(newrule) newrule = newrule or DEFAULT_RULE local err = CheckRule(newrule) if err then error("Bad rule in SetRule!\n"..err, 2) end end -------------------------------------------------------------------------------- function ToggleToolBar() if currbarht > 0 then -- hide all the controls mbar.hide() ssbutton.hide() s1button.hide() stepbutton.hide() resetbutton.hide() undobutton.hide() redobutton.hide() rulebutton.hide() exitbutton.hide() helpbutton.hide() stepslider.hide() -- hide the menu bar and tool bar ov(alpha1) ovt{"fill", 0, 0, ovwd, currbarht} currbarht = 0 else currbarht = mbarht end Refresh() end -------------------------------------------------------------------------------- local startpop -- for saving population at start of drawing function StartDrawing(x, y) RememberCurrentState() dirty = true startpop = g.getpop() drawstate = g.getoption("drawingstate") if drawstate == g.getcell(x, y) then drawstate = 0 end g.setcell(x, y, drawstate) g.update() end -------------------------------------------------------------------------------- local anchorx, anchory -- initial cell clicked in StartSelecting local initsel = {} -- initial selection rectangle local modifysel = false -- modify current selection? local forceh = false -- only modify horizontal size? local forcev = false -- only modify vertical size? function StartSelecting(x, y, modify) RememberCurrentState() anchorx = x anchory = y initsel = g.getselrect() if #initsel > 0 and not modify then -- remove current selection g.select({}) Refresh() end modifysel = modify if modify then -- use same logic as Golly to modify existing selection forceh = false forcev = false local selleft = initsel[1] local seltop = initsel[2] local selwd = initsel[3] local selht = initsel[4] local selbottom = seltop + selht - 1 local selright = selleft + selwd - 1 if y <= seltop and x <= selleft then -- click is in or outside top left corner seltop = y selleft = x anchory = selbottom anchorx = selright elseif y <= seltop and x >= selright then -- click is in or outside top right corner seltop = y selright = x anchory = selbottom anchorx = selleft elseif y >= selbottom and x >= selright then -- click is in or outside bottom right corner selbottom = y selright = x anchory = seltop anchorx = selleft elseif y >= selbottom and x <= selleft then -- click is in or outside bottom left corner selbottom = y selleft = x anchory = seltop anchorx = selright elseif y <= seltop then -- click is in or above top edge forcev = true seltop = y anchory = selbottom elseif y >= selbottom then -- click is in or below bottom edge forcev = true selbottom = y anchory = seltop elseif x <= selleft then -- click is in or left of left edge forceh = true selleft = x anchorx = selright elseif x >= selright then -- click is in or right of right edge forceh = true selright = x anchorx = selleft else -- click is somewhere inside selection local onethirdx = selleft + selwd / 3.0 local twothirdx = selleft + selwd * 2.0 / 3.0 local onethirdy = seltop + selht / 3.0 local twothirdy = seltop + selht * 2.0 / 3.0 local midy = seltop + selht / 2.0 if y < onethirdy and x < onethirdx then -- click is near top left corner seltop = y selleft = x anchory = selbottom anchorx = selright elseif y < onethirdy and x > twothirdx then -- click is near top right corner seltop = y selright = x anchory = selbottom anchorx = selleft elseif y > twothirdy and x > twothirdx then -- click is near bottom right corner selbottom = y selright = x anchory = seltop anchorx = selleft elseif y > twothirdy and x < onethirdx then -- click is near bottom left corner selbottom = y selleft = x anchory = seltop anchorx = selright elseif x < onethirdx then -- click is near middle of left edge forceh = true selleft = x anchorx = selright elseif x > twothirdx then -- click is near middle of right edge forceh = true selright = x anchorx = selleft elseif y < midy then -- click is below middle section of top edge forcev = true seltop = y anchory = selbottom else -- click is above middle section of bottom edge forcev = true selbottom = y anchory = seltop end end -- crop selection if outside bounded grid if selleft < minx then selleft = minx end if seltop < miny then seltop = miny end if selright > maxx then selright = maxx end if selbottom > maxy then selbottom = maxy end selwd = selright-selleft+1 selht = selbottom-seltop+1 g.select( {selleft, seltop, selwd, selht} ) ShowMessage("Selection wd x ht = "..selwd.." x "..selht) g.update() end end -------------------------------------------------------------------------------- function UpdateSelection(x, y) local selx = math.min(anchorx, x) local sely = math.min(anchory, y) local selwd = math.abs(anchorx - x) + 1 local selht = math.abs(anchory - y) + 1 local selright = selx+selwd-1 local selbottom = sely+selht-1 if modifysel then -- use same logic as Golly to modify existing selection local selrect = g.getselrect() if forcev then -- only change vertical size selx = selrect[1] selright = selx + selrect[3] - 1 end if forceh then -- only change horizontal size sely = selrect[2] selbottom = sely + selrect[4] - 1 end selwd = selright-selx+1 selht = selbottom-sely+1 selright = selx+selwd-1 selbottom = sely+selht-1 end -- check if selection is completely outside grid if selx > maxx or selright < minx or sely > maxy or selbottom < miny then g.select({}) ShowMessage("") g.update() return end -- crop selection if necessary if selx < minx then selx = minx end if sely < miny then sely = miny end if selright > maxx then selright = maxx end if selbottom > maxy then selbottom = maxy end selwd = selright-selx+1 selht = selbottom-sely+1 g.select( {selx, sely, selwd, selht} ) ShowMessage("Selection wd x ht = "..selwd.." x "..selht) Refresh() end -------------------------------------------------------------------------------- function CreateOverlay() -- overlay covers entire viewport (more if viewport is too small) but is mostly -- transparent except for opaque menu bar and tool bar at top of viewport viewwd, viewht = g.getview(g.getlayer()) ovwd, ovht = viewwd, viewht if ovwd < minwd then ovwd = minwd end if ovht < minht then ovht = minht end ov("create "..ovwd.." "..ovht) ov("cursor current") -- we use a nearly transparent overlay so we can detect clicks outside the bounded grid ov(alpha1) ov("fill") -- set parameters for menu bar and tool bar buttons op.buttonht = buttonht op.textgap = 8 -- gap between edge of button and its label op.textfont = "font 10 default-bold" -- font for button labels op.menufont = "font 11 default-bold" -- font for menu and item labels op.textshadowx = 2 op.textshadowy = 2 if g.os() == "Linux" then op.textfont = "font 10 default" op.menufont = "font 11 default" end op.menubg = "rgba 160 160 160 255" -- gray background for menu bar and items op.selcolor = "rgba 110 110 110 255" -- darker gray for selected menu/item op.discolor = "rgba 210 210 210 255" -- lighter gray for disabled items and separator lines end -------------------------------------------------------------------------------- function CreateMenuBar() -- create the menu bar and add some menus; -- WARNING: changes to the order of menus or their items will require -- changes to DrawMenuBar and EnableControls mbar = op.menubar() mbar.addmenu("File") mbar.addmenu("Edit") mbar.addmenu("View") -- add items to File menu mbar.additem(1, "New Pattern", NewPattern) mbar.additem(1, "Random Pattern", RandomPattern) mbar.additem(1, "Open Pattern...", OpenPattern) mbar.additem(1, "Open Clipboard", OpenClipboard) mbar.additem(1, "Save Pattern...", SavePattern) mbar.additem(1, "---", nil) mbar.additem(1, "Run Script...", RunScript) mbar.additem(1, "Run Clipboard", RunClipboard) mbar.additem(1, "Set Startup Script...", SetStartupScript) mbar.additem(1, "---", nil) mbar.additem(1, "Exit "..SCRIPT_NAME..".lua", g.exit) -- add items to Edit menu mbar.additem(2, "Undo", Undo) mbar.additem(2, "Redo", Redo) mbar.additem(2, "---", nil) mbar.additem(2, "Cut", CutSelection) mbar.additem(2, "Copy", CopySelection) mbar.additem(2, "Paste", Paste) mbar.additem(2, "Clear", ClearSelection) mbar.additem(2, "Clear Outside", ClearOutside) mbar.additem(2, "---", nil) mbar.additem(2, "Select All", SelectAll) mbar.additem(2, "Remove Selection", RemoveSelection) mbar.additem(2, "Shrink Selection", ShrinkSelection) mbar.additem(2, "Flip Top-Bottom", FlipTopBottom) mbar.additem(2, "Flip Left-Right", FlipLeftRight) mbar.additem(2, "Rotate Clockwise", RotateClockwise) mbar.additem(2, "Rotate Anticlockwise", RotateAnticlockwise) mbar.additem(2, "Random Fill", RandomFill) mbar.additem(2, "Set Density...", SetDensity) -- add items to View menu mbar.additem(3, "Fit Grid", FitGrid) mbar.additem(3, "Fit Pattern", FitPattern) mbar.additem(3, "Fit Selection", FitSelection) mbar.additem(3, "Middle", MiddleView) mbar.additem(3, "---", nil) mbar.additem(3, "Help", ShowHelp) end -------------------------------------------------------------------------------- function CreateToolBar() -- create tool bar buttons ssbutton = op.button("Start", StartStop) s1button = op.button("+1", Step1) stepbutton = op.button("Step", NextStep) resetbutton = op.button("Reset", Reset) undobutton = op.button("Undo", Undo) redobutton = op.button("Redo", Redo) rulebutton = op.button("Rule...", ChangeRule) helpbutton = op.button("?", ShowHelp) exitbutton = op.button("X", g.exit) -- create the slider for adjusting stepsize stepslider = op.slider("", op.white, 100, 1, MAX_STEP_SIZE, StepChange) UpdateStartButton() end -------------------------------------------------------------------------------- local showbars = false -- restore menu bar and tool bar? function CheckWindowSize() -- if viewport size has changed then resize the overlay local newwd, newht = g.getview(g.getlayer()) if newwd ~= viewwd or newht ~= viewht then viewwd, viewht = newwd, newht ovwd, ovht = viewwd, viewht if ovwd < minwd then ovwd = minwd end if ovht < minht then ovht = minht end local fullscreen = g.getoption("fullscreen") if fullscreen == 1 and currbarht > 0 then -- hide menu bar and tool bar but restore them when we exit full screen mode currbarht = 0 showbars = true elseif fullscreen == 0 and showbars then if currbarht == 0 then -- restore menu bar and tool bar currbarht = mbarht end showbars = false end ov("resize "..ovwd.." "..ovht) ov(alpha1) ovt{"fill", 0, currbarht, ovwd, ovht-currbarht} if scriptlevel > 0 and currbarht > 0 then -- avoid enabling menu items and buttons DrawMenuBar(false) DrawToolBar(false) g.update() else Refresh() end end end -------------------------------------------------------------------------------- function CheckCursor() local pixelpos = ov("xy") if #pixelpos > 0 then -- update cursor if mouse moves in/out of menu/tool bar local x, y = split(pixelpos) x = tonumber(x) y = tonumber(y) if y < currbarht then if not arrow_cursor then -- mouse moved inside menu/tool bar ov("cursor arrow") arrow_cursor = true end else if arrow_cursor then -- mouse moved outside menu/tool bar ov("cursor current") arrow_cursor = false end end end end -------------------------------------------------------------------------------- function MouseDown(event, mouseinfo) -- mouse button has been pressed local _, x, y, button, mods = split(event) x, y = tonumber(x), tonumber(y) if y < currbarht then return end if button ~= "left" then return end local xc, yc = PixelToCell(x, y) mouseinfo.prevx = xc mouseinfo.prevy = yc mouseinfo.mousedown = true local curs = g.getcursor() if curs == "Draw" then if mods == "none" or mods == "shift" then if not InsideGrid(xc, yc, xc, yc) then ShowError("Drawing is not allowed outside bounded grid.") elseif g.getmag() < -3 then ShowError("Drawing is not allowed at scales beyond 2^3:1.") else mouseinfo.drawing = true StartDrawing(xc, yc) end end elseif curs == "Pick" then if not InsideGrid(xc, yc, xc, yc) then ShowError("Picking is not allowed outside bounded grid.") else g.setoption("drawingstate", g.getcell(xc, yc)) end g.update() elseif curs == "Select" then if mods == "none" then mouseinfo.selecting = true StartSelecting(xc, yc, false) elseif mods == "shift" then mouseinfo.selecting = true StartSelecting(xc, yc, #g.getselrect() > 0) end elseif curs == "Move" then g.doevent("click "..xc.." "..yc.." "..button.." "..mods) elseif curs == "Zoom In" or curs == "Zoom Out" then g.doevent("click "..xc.." "..yc.." "..button.." "..mods) end end -------------------------------------------------------------------------------- function MouseUp(mouseinfo) -- mouse button has been released mouseinfo.mousedown = false if mouseinfo.drawing then mouseinfo.drawing = false if drawstate == 0 and g.getpop() == startpop then -- no cells were deleted so pop undostack table.remove(undostack) end CheckIfGenerating() Refresh() elseif mouseinfo.selecting then mouseinfo.selecting = false if gp.equal(initsel, g.getselrect()) then -- selection wasn't changed so pop undostack table.remove(undostack) end CheckIfGenerating() Refresh() end end -------------------------------------------------------------------------------- function CheckMousePosition(mouseinfo) local pixelpos = ov("xy") if #pixelpos > 0 then local x, y = split(pixelpos) if tonumber(y) >= currbarht then local xc, yc = PixelToCell(tonumber(x), tonumber(y)) if xc ~= mouseinfo.prevx or yc ~= mouseinfo.prevy then -- mouse has moved if mouseinfo.drawing then -- check if xc,yc is outside bounded grid if xc < minx then xc = minx end if xc > maxx then xc = maxx end if yc < miny then yc = miny end if yc > maxy then yc = maxy end gp.drawline(mouseinfo.prevx, mouseinfo.prevy, xc, yc, drawstate) g.update() elseif mouseinfo.selecting then UpdateSelection(xc, yc) end mouseinfo.prevx = xc mouseinfo.prevy = yc end end end end -------------------------------------------------------------------------------- function HandleKey(event) local CMDCTRL = "cmd" if g.os() ~= "Mac" then CMDCTRL = "ctrl" end local _, key, mods = split(event) if key == "return" and mods == "none" then StartStop() elseif key == "space" and mods == "none" then Step1() elseif key == "tab" and mods == "none" then NextStep() elseif key == "delete" and mods == "none" then ClearSelection() elseif key == "delete" and mods == "shift" then ClearOutside() elseif key == "=" and mods == "none" then Faster() elseif key == "-" and mods == "none" then Slower() elseif key == "n" and mods == CMDCTRL then NewPattern() elseif key == "o" and mods == CMDCTRL then OpenPattern() elseif key == "s" and mods == CMDCTRL then SavePattern() elseif key == "o" and mods == "shift" then OpenClipboard() elseif key == "r" and mods == "shift" then RunClipboard() elseif key == "r" and mods == CMDCTRL then Reset() elseif key == "r" and mods == "none" then ChangeRule() elseif key == "a" and (mods == "none" or mods == CMDCTRL) then SelectAll() elseif key == "k" and (mods == "none" or mods == CMDCTRL) then RemoveSelection() elseif key == "z" and (mods == "none" or mods == CMDCTRL) then Undo() elseif key == "z" and (mods == "shift" or mods == CMDCTRL.."shift") then Redo() elseif key == "x" and mods == CMDCTRL then CutSelection() elseif key == "c" and mods == CMDCTRL then CopySelection() elseif key == "v" and (mods == "none" or mods == CMDCTRL) then Paste() elseif key == "x" and mods == "none" then FlipLeftRight() elseif key == "y" and mods == "none" then FlipTopBottom() elseif key == ">" and mods == "none" then RotateClockwise() elseif key == "<" and mods == "none" then RotateAnticlockwise() elseif key == "5" and mods == CMDCTRL then RandomFill() elseif key == "p" and mods == CMDCTRL then RandomPattern() elseif key == "d" and mods == "none" then SetDensity() elseif key == "t" and mods == "none" then ToggleToolBar() elseif key == "g" and mods == "none" then FitGrid() elseif key == "f" and mods == "none" then FitPattern() elseif key == "f" and mods == "shift" then FitSelection() elseif key == "m" and mods == "none" then MiddleView() elseif key == "h" and mods == "none" then ShowHelp() elseif key == "q" then g.exit() else -- could be a keyboard shortcut (eg. to toggle full screen mode) g.doevent(event) end end -------------------------------------------------------------------------------- function EventLoop() local mouseinfo = { mousedown = false, -- mouse button is down? drawing = false, -- draw/erase cells with pencil cursor? selecting = false, -- select/deselect cells with cross-hairs cursor? prevx = nil, prevy = nil -- previous mouse position } while true do local event = g.getevent() if #event == 0 then if not mouseinfo.mousedown then if not generating then g.sleep(5) -- don't hog the CPU when idle end CheckWindowSize() -- may need to resize the overlay end else if event:find("^key") or event:find("^oclick") then ShowMessage("") -- remove any recent message end event = op.process(event) if #event == 0 then -- op.process handled the given event (click in menu or button) elseif event:find("^key") then if mouseinfo.mousedown then -- allow arrow keys and other keyboard shortcuts while mouse pressed g.doevent(event) else HandleKey(event) end elseif event:find("^oclick") then MouseDown(event, mouseinfo) elseif event:find("^mup") then MouseUp(mouseinfo) elseif event:find("^ozoom") then -- remove the "o" and do the zoom g.doevent(event:sub(2)) elseif event:find("^file") then OpenFile(event:sub(6)) end end if mouseinfo.mousedown then CheckMousePosition(mouseinfo) else CheckCursor() if generating then NextGeneration() end end end end -------------------------------------------------------------------------------- local Main_called = false function Main() if Main_called then -- skip the initialization code EventLoop() return end Main_called = true CreateOverlay() CreateMenuBar() CreateToolBar() CreatePopUpMenu() -- validate current_rule local err = CheckRule(current_rule) if err then -- switch to DEFAULT_RULE and ensure it is valid err = CheckRule(DEFAULT_RULE) if err then g.warn("DEFAULT_RULE is not valid!\n"..err) g.exit() end end -- call NewPattern but without doing a Refresh local saveRefresh = Refresh Refresh = function() end NewPattern("untitled") Refresh = saveRefresh -- run the user's startup script if it exists local f = io.open(startup, "r") if f then f:close() RunScript(startup) ClearUndoRedo() -- don't want to undo startup script SetColors() -- startup script might override this end Refresh() EventLoop() end -------------------------------------------------------------------------------- function OkayToExit() if dirty then local answer = g.savechanges("Save your changes?", "If you don't save, the changes will be lost.") if answer == "yes" then SavePattern() if dirty then -- error occurred or user hit Cancel in g.savedialog return false end elseif answer == "no" then return true else -- answer == "cancel" return false end end return true end -------------------------------------------------------------------------------- function StartNewCA() SanityChecks() AddNewLayer() ReadSettings() local oldstate = SaveGollyState() ::call_Main_again:: g.check(true) local status, err = xpcall(Main, gp.trace) if err then g.continue(err) end -- the following code is always executed g.check(false) -- ensure the following code can't be interrupted -- err starts with "GOLLY: ABORT SCRIPT" if user hit escape or g.exit was called if err:find("^GOLLY: ABORT SCRIPT") then if not OkayToExit() then goto call_Main_again end end RestoreGollyState(oldstate) WriteSettings() end golly-3.3-src/Scripts/Lua/gplus/text.lua0000755000175000017500000002021012706123635015207 00000000000000-- This module is loaded if a script calls require "gplus.text". local g = golly() local gp = require "gplus" local m = {} -------------------------------------------------------------------------------- -- Eric Angelini integer font local eafont = {} eafont['0'] = g.parse("3o$obo$obo$obo$3o!", 0, -5) eafont['0'].width = 4 eafont['1'] = g.parse("o$o$o$o$o!", 0, -5) eafont['1'].width = 2 eafont['2'] = g.parse("3o$2bo$3o$o$3o!", 0, -5) eafont['2'].width = 4 eafont['3'] = g.parse("3o$2bo$3o$2bo$3o!", 0, -5) eafont['3'].width = 4 eafont['4'] = g.parse("obo$obo$3o$2bo$2bo!", 0, -5) eafont['4'].width = 4 eafont['5'] = g.parse("3o$o$3o$2bo$3o!", 0, -5) eafont['5'].width = 4 eafont['6'] = g.parse("3o$o$3o$obo$3o!", 0, -5) eafont['6'].width = 4 eafont['7'] = g.parse("3o$2bo$2bo$2bo$2bo!", 0, -5) eafont['7'].width = 4 eafont['8'] = g.parse("3o$obo$3o$obo$3o!", 0, -5) eafont['8'].width = 4 eafont['9'] = g.parse("3o$obo$3o$2bo$3o!", 0, -5) eafont['9'].width = 4 eafont[' '] = g.parse("", 0, 0) eafont[' '].width = 2 eafont['-'] = g.parse("", 0, 0) eafont['-'].width = 0 -------------------------------------------------------------------------------- -- Snakial font (all chars are stable Life patterns) local sfont = {} sfont['0'] = g.parse("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) sfont['0'].width = 10 sfont['1'] = g.parse("2o$bo$o$2o2$2o$bo$o$2o2$2o$bo$o$2o!", 1, -14) sfont['1'].width = 6 sfont['2'] = g.parse("2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o!", 0, -14) sfont['2'].width = 10 sfont['3'] = g.parse("2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o!", 0, -14) sfont['3'].width = 8 sfont['4'] = g.parse("2o3b2o$2o3b2o2$2o3b2o$obobobo$2bobo$b2obo$5b2o$6bo$5bo$5b2o$6bo$5bo$5b2o!", 0, -14) sfont['4'].width = 9 sfont['5'] = g.parse("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) sfont['5'].width = 10 sfont['6'] = g.parse("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) sfont['6'].width = 10 sfont['7'] = g.parse("ob2o$2obo$4b2o$5bo$4bo$4b2o$2b2o$3bo$2bo$2b2o$2o$bo$o$2o!", 0, -14) sfont['7'].width = 8 sfont['8'] = g.parse("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) sfont['8'].width = 10 sfont['9'] = g.parse("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) sfont['9'].width = 10 sfont['-'] = g.parse("2obo$ob2o!", 0, -8) sfont['-'].width = 6 -------------------------------------------------------------------------------- -- mono-spaced ASCII font local mfont = {} mfont[' '] = g.parse("") mfont['!'] = g.parse("2bo$2bo$2bo$2bo$2bo2$2bo!") mfont['"'] = g.parse("bobo$bobo$bobo!") mfont['#'] = g.parse("bobo$bobo$5o$bobo$5o$bobo$bobo!") mfont['$'] = g.parse("b3o$obobo$obo$b3o$2bobo$obobo$b3o!") mfont['%'] = g.parse("2o2bo$2o2bo$3bo$2bo$bo$o2b2o$o2b2o!") mfont['&'] = g.parse("b2o$o2bo$o2bo$b2o$o2bo$o2bo$b2obo!") mfont["'"] = g.parse("2bo$2bo$2bo!") mfont['('] = g.parse("3bo$2bo$2bo$2bo$2bo$2bo$3bo!") mfont[')'] = g.parse("bo$2bo$2bo$2bo$2bo$2bo$bo!") mfont['*'] = g.parse("$obobo$b3o$5o$b3o$obobo!") mfont['+'] = g.parse("$2bo$2bo$5o$2bo$2bo!") mfont[','] = g.parse("6$2bo$2bo$bo!") mfont['-'] = g.parse("3$5o!") mfont['.'] = g.parse("6$2bo!") mfont['/'] = g.parse("3bo$3bo$2bo$2bo$2bo$bo$bo!") mfont['0'] = g.parse("b3o$o3bo$o2b2o$obobo$2o2bo$o3bo$b3o!") mfont['1'] = g.parse("2bo$b2o$2bo$2bo$2bo$2bo$b3o!") mfont['2'] = g.parse("b3o$o3bo$4bo$3bo$2bo$bo$5o!") mfont['3'] = g.parse("b3o$o3bo$4bo$2b2o$4bo$o3bo$b3o!") mfont['4'] = g.parse("3bo$2b2o$bobo$o2bo$5o$3bo$3bo!") mfont['5'] = g.parse("5o$o$o$b3o$4bo$o3bo$b3o!") mfont['6'] = g.parse("b3o$o$o$4o$o3bo$o3bo$b3o!") mfont['7'] = g.parse("5o$4bo$3bo$2bo$bo$o$o!") mfont['8'] = g.parse("b3o$o3bo$o3bo$b3o$o3bo$o3bo$b3o!") mfont['9'] = g.parse("b3o$o3bo$o3bo$b4o$4bo$4bo$b3o!") mfont[':'] = g.parse("2$2bo4$2bo!") mfont[';'] = g.parse("2$2bo4$2bo$2bo$bo!") mfont['<'] = g.parse("$3bo$2bo$bo$2bo$3bo!") mfont['='] = g.parse("2$5o2$5o!") mfont['>'] = g.parse("$bo$2bo$3bo$2bo$bo!") mfont['?'] = g.parse("b3o$o3bo$4bo$2b2o$2bo2$2bo!") mfont['@'] = g.parse("b3o$o3bo$ob3o$obobo$ob2o$o$b3o!") mfont['A'] = g.parse("b3o$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") mfont['B'] = g.parse("4o$o3bo$o3bo$4o$o3bo$o3bo$4o!") mfont['C'] = g.parse("b3o$o3bo$o$o$o$o3bo$b3o!") mfont['D'] = g.parse("4o$o3bo$o3bo$o3bo$o3bo$o3bo$4o!") mfont['E'] = g.parse("5o$o$o$3o$o$o$5o!") mfont['F'] = g.parse("5o$o$o$3o$o$o$o!") mfont['G'] = g.parse("b3o$o3bo$o$o2b2o$o3bo$o3bo$b3o!") mfont['H'] = g.parse("o3bo$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") mfont['I'] = g.parse("b3o$2bo$2bo$2bo$2bo$2bo$b3o!") mfont['J'] = g.parse("2b3o$3bo$3bo$3bo$3bo$o2bo$b2o!") mfont['K'] = g.parse("o3bo$o2bo$obo$2o$obo$o2bo$o3bo!") mfont['L'] = g.parse("o$o$o$o$o$o$5o!") mfont['M'] = g.parse("o3bo$2ob2o$obobo$obobo$o3bo$o3bo$o3bo!") mfont['N'] = g.parse("o3bo$2o2bo$obobo$o2b2o$o3bo$o3bo$o3bo!") mfont['O'] = g.parse("b3o$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") mfont['P'] = g.parse("4o$o3bo$o3bo$4o$o$o$o!") mfont['Q'] = g.parse("b3o$o3bo$o3bo$o3bo$obobo$o2bo$b2obo!") mfont['R'] = g.parse("4o$o3bo$o3bo$4o$o2bo$o3bo$o3bo!") mfont['S'] = g.parse("b3o$o3bo$o$b3o$4bo$o3bo$b3o!") mfont['T'] = g.parse("5o$2bo$2bo$2bo$2bo$2bo$2bo!") mfont['U'] = g.parse("o3bo$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") mfont['V'] = g.parse("o3bo$o3bo$o3bo$o3bo$o3bo$bobo$2bo!") mfont['W'] = g.parse("o3bo$o3bo$o3bo$obobo$obobo$2ob2o$o3bo!") mfont['X'] = g.parse("o3bo$o3bo$bobo$2bo$bobo$o3bo$o3bo!") mfont['Y'] = g.parse("o3bo$o3bo$bobo$2bo$2bo$2bo$2bo!") mfont['Z'] = g.parse("5o$4bo$3bo$2bo$bo$o$5o!") mfont['['] = g.parse("2b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") mfont['\\'] = g.parse("bo$bo$2bo$2bo$2bo$3bo$3bo!") mfont[']'] = g.parse("b2o$2bo$2bo$2bo$2bo$2bo$b2o!") mfont['^'] = g.parse("2bo$bobo$o3bo!") mfont['_'] = g.parse("6$5o!") mfont['`'] = g.parse("o$bo!") mfont['a'] = g.parse("2$b4o$o3bo$o3bo$o3bo$b4o!") mfont['b'] = g.parse("o$o$4o$o3bo$o3bo$o3bo$4o!") mfont['c'] = g.parse("2$b4o$o$o$o$b4o!") mfont['d'] = g.parse("4bo$4bo$b4o$o3bo$o3bo$o3bo$b4o!") mfont['e'] = g.parse("2$b3o$o3bo$5o$o$b4o!") mfont['f'] = g.parse("2b2o$bo2bo$bo$3o$bo$bo$bo!") mfont['g'] = g.parse("2$b3o$o3bo$o3bo$o3bo$b4o$4bo$b3o!") mfont['h'] = g.parse("o$o$ob2o$2o2bo$o3bo$o3bo$o3bo!") mfont['i'] = g.parse("$2bo2$2bo$2bo$2bo$2b2o!") mfont['j'] = g.parse("$3bo2$3bo$3bo$3bo$3bo$o2bo$b2o!") mfont['k'] = g.parse("o$o$o2bo$obo$3o$o2bo$o3bo!") mfont['l'] = g.parse("b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") mfont['m'] = g.parse("2$bobo$obobo$obobo$o3bo$o3bo!") mfont['n'] = g.parse("2$4o$o3bo$o3bo$o3bo$o3bo!") mfont['o'] = g.parse("2$b3o$o3bo$o3bo$o3bo$b3o!") mfont['p'] = g.parse("2$4o$o3bo$o3bo$o3bo$4o$o$o!") mfont['q'] = g.parse("2$b4o$o3bo$o3bo$o3bo$b4o$4bo$4bo!") mfont['r'] = g.parse("2$ob2o$2o2bo$o$o$o!") mfont['s'] = g.parse("2$b4o$o$b3o$4bo$4o!") mfont['t'] = g.parse("$2bo$5o$2bo$2bo$2bo$3b2o!") mfont['u'] = g.parse("2$o3bo$o3bo$o3bo$o3bo$b4o!") mfont['v'] = g.parse("2$o3bo$o3bo$o3bo$bobo$2bo!") mfont['w'] = g.parse("2$o3bo$o3bo$obobo$2ob2o$o3bo!") mfont['x'] = g.parse("2$o3bo$bobo$2bo$bobo$o3bo!") mfont['y'] = g.parse("2$o3bo$o3bo$o3bo$o3bo$b4o$4bo$b3o!") mfont['z'] = g.parse("2$5o$3bo$2bo$bo$5o!") mfont['{'] = g.parse("3bo$2bo$2bo$bo$2bo$2bo$3bo!") mfont['|'] = g.parse("2bo$2bo$2bo$2bo$2bo$2bo$2bo!") mfont['}'] = g.parse("bo$2bo$2bo$3bo$2bo$2bo$bo!") mfont['~'] = g.parse("2$bo$obobo$3bo!") for key, _ in pairs(mfont) do mfont[key].width = 6 end -------------------------------------------------------------------------------- -- convert given string to a pattern using one of the above fonts function m.maketext(s, font) font = font or "Snakial" local p = gp.pattern() local x = 0 local f, unknown if string.lower(font) == "mono" then f = mfont unknown = '?' elseif string.lower(font:sub(1,2)) == "ea" then f = eafont unknown = '-' else f = sfont unknown = '-' end for ch in string.gmatch(s, ".[\128-\191]*") do if f[ch] == nil then ch = unknown end p = p + gp.pattern(g.transform(f[ch], x, 0)) x = x + f[ch].width end return p end -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/gplus/strict.lua0000644000175000017500000000173712706123635015545 00000000000000-- strict.lua -- checks uses of undeclared global variables -- All global variables must be 'declared' through a regular assignment -- (even assigning nil will do) in a main chunk before being used -- anywhere or assigned to inside a function. -- distributed under the Lua license: http://www.lua.org/license.html local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget local mt = getmetatable(_G) if mt == nil then mt = {} setmetatable(_G, mt) end mt.__declared = {} local function what () local d = getinfo(3, "S") return d and d.what or "C" end mt.__newindex = function (t, n, v) if not mt.__declared[n] then local w = what() if w ~= "main" and w ~= "C" then error("assign to undeclared variable '"..n.."'", 2) end mt.__declared[n] = true end rawset(t, n, v) end mt.__index = function (t, n) if not mt.__declared[n] and what() ~= "C" then error("variable '"..n.."' is not declared", 2) end return rawget(t, n) end golly-3.3-src/Scripts/Lua/gplus/objects.lua0000644000175000017500000001472612706123635015670 00000000000000-- This module is loaded if a script calls require "gplus.objects". local g = golly() local gp = require "gplus" local pattern = gp.pattern local m = {} m.block = pattern([[ ** ** ]]) m.blinker = pattern("***", -1, 0) m.glider = pattern([[ .** **. ..* ]]) m.lwss = pattern([[ ****. *...* *.... .*..* ]]) m.mwss = pattern([[ *****. *....* *..... .*...* ...*.. ]]) m.hwss = pattern([[ ******. *.....* *...... .*....* ...**.. ]]) m.eater = pattern([[ ** * .*** ...* ]]) m.hook = m.eater m.queenbee = pattern([[ **.. ..*. ...* ...* ...* ..*. **.. ]]) m.herschel = pattern([[ ***. .*.. .*** ]]) m.bheptomino = pattern([[ **. .** **. *.. ]]) m.tub = pattern([[ .*. *.* .*. ]], -1, -1) m.boat = pattern([[ **. *.* .*. ]]) m.long_boat = pattern([[ **. *.* .*.* ..* ]]) m.ship = pattern([[ **. *.* .** ]], -1, -1) m.beehive = pattern([[ .**. *..* .**. ]], 0, -1) m.loaf = pattern([[ .**. *..* *.*. .*.. ]]) m.snake = pattern([[ *.** **.* ]]) m.aircraft_carrier = pattern([[ **.. *..* ..** ]]) m.honeyfarm = pattern([[ ......*...... .....*.*..... .....*.*..... ......*...... ............. .**.......**. *..*.....*..* .**.......**. ............. ......*...... .....*.*..... .....*.*..... ......*...... ]], -6, -6) m.beacon = pattern([[ **.. *... ...* ..** ]]) m.blocker = pattern([[ ......*.*. .....*.... **..*....* **.*..*.** ....**.... ]]) m.clock = pattern([[ ..*. **.. ..** .*.. ]]) m.dart = pattern([[ ........*. .......*.* ......**.. .........* .....*...* ..*..*.... .*.*..**** *..*...... .*.*..**** ..*..*.... .....*...* .........* ......**.. .......*.* ........*. ]], 0, -7) m.big_beacon = pattern([[ ***... ***... ***... ...*** ...*** ...*** ]]) m.middleweight_volcano = pattern([[ ...*******... .***.***.***. *....***....* .****.*.***.* ...........*. *.**.*.*.*... **.*.*.*.**.. ....*..*.*... .....**..*... .........**.. ]], -6, 0) m.heavyweight_volcano = pattern([[ .........*.......................... ........*.*......................... ......***.*......................... .....*....**.*...................... .....*.**...**......**.............. ....**.*.**.........*.*............. .........*.*****......*..*.**....... ..*.**.**.*.....*....**.*.**.*...... .....**.....****........*....*...... *...*.*..*...*.*....**.*.****.**.... *...*.*..**.*.**.**....*.*....*.*... .....**...***.**.*.***.*..***...*... ..*.**.**.**.............*.*..*.*.** ...........*......*.*.*.*..**.*.*.*. ....**.*.*.**......**.*.*.*...*.*.*. .....*.**.*..*.......*.**..****.**.. .....*....*.*........*...**......... ....**....**........**...*..*....... ...........................**....... ]]) m.galaxy = pattern([[ ******.** ******.** .......** **.....** **.....** **.....** **....... **.****** **.****** ]], -4, -4) m.orion = pattern([[ ...**......... ...*.*........ ...*.......... **.*.......... *....*........ *.**......***. .....***....** ......***.*.*. .............* ......*.*..... .....**.*..... ......*....... ....**.*...... .......*...... .....**....... ]]) m.pentadecathlon = pattern([[ ..*....*.. **.****.** ..*....*.. ]], 0, -1) m.pi = pattern([[ *** *.* *.* ]]) m.pond = pattern([[ .**. *..* *..* .**. ]]) m.pulsar = pattern([[ ..***...***.. ............. *....*.*....* *....*.*....* *....*.*....* ..***...***.. ............. ..***...***.. *....*.*....* *....*.*....* *....*.*....* ............. ..***...***.. ]], -6, -6) m.rpentomino = pattern([[ .** ** .* ]]) m.rabbits = pattern([[ *...*** ***..*. .*..... ]]) m.spider = pattern([[ .........*.......*......... ...**.*.*.**...**.*.*.**... ***.*.***.........***.*.*** *...*.*.....*.*.....*.*...* ....**......*.*......**.... .**.........*.*.........**. .**.**...............**.**. .....*...............*..... ]], -13, 0) m.lightweight_volcano = pattern([[ ...**..**... .***.**.***. *..........* .****..****. ....*..*.... .**......**. .*..*..*..*. ..***..***.. ............ ****.**.**** *..**..**..* ]]) m.unix = pattern([[ ..**.... ....*.** *..*..** *.*..... .*...... ........ .**..... .**..... ]]) m.biblocker = pattern([[ ..................*........... .................*.**......... .................*.**......... ..................**.......... .............................. .......**............**....... .......**............**....... .............................. .............................. ......*.*..................... .....*..................**.... **..*....*..........**.*..*.** **.*..*.**..........**..*....* ....**...................*.... ..........................*.*. ]]) -------------------------------------------------------------------------------- -- this section emulates glife's herschel.py m.herschel_ghost = pattern([[ *** . .*.* ]]) -- A Herschel conduit is represented by its pattern and -- the transformation it applies to the Herschel. -- Hence the additional .transform field. local block = m.block local eater = m.eater local snake = m.snake m.hc64 = block.t(14, -8) + block.t(9, -13) + block.t(13, -15) + block.t(7, -19) m.hc64.transform = {-9, -9, gp.rccw} m.hc77 = block.t(9, -13) + eater.t(10, 0, gp.swap_xy) + eater.t(-7, -12, gp.swap_xy_flip) m.hc77.transform = {10, -25, gp.flip_x} m.hc112 = block.t(16, -10) + block.t(-3, -11) + m.aircraft_carrier.t(13, -3, gp.swap_xy) + eater.t(10, 1) + eater.t(-3, -14, gp.flip) + eater.t(9, -16, gp.flip_y) m.hc112.transform = {35, -12, gp.rcw} m.hc117 = eater.t(10, 1) + eater.t(13, -9, gp.swap_xy) + eater.t(0, -12, gp.swap_xy_flip) + block.t(8, -22) + snake.t(15, -19) m.hc117.transform = {6, -40, gp.identity} m.hc119 = block.t(-14, -3) + block.t(-13, -8) + block.t(-19, -9) + eater.t(-17, -2, gp.rcw) m.hc119.transform = {-12, -20, gp.flip_x} m.hc156 = eater.t(10, 0, gp.swap_xy) + eater.t(12, -9, gp.swap_xy) + eater.t(0, -12, gp.swap_xy_flip) + eater.t(17, -21, gp.flip_y) + snake.t(21, -5, gp.rccw) + block.t(24, -15) + m.tub.t(11, -24) m.hc156.transform = {43, -17, gp.rcw} m.hc158 = eater.t(-2, -13, gp.flip) + eater.t(-3, -8, gp.rcw) + eater.t(20, -19, gp.rccw) + pattern([[ .....** .....*.* .......* .......*.*.** ..**.*.*.**.* ..**.**.* ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** ]], 14, -12) m.hc158.transform = {7, -27, gp.flip_x} m.hc190 = eater.t(-3, -8, gp.rcw) + eater.t(-10, -12, gp.swap_xy) + eater.t(-3, -12, gp.swap_xy_flip) + eater.t(-8, -17) + eater.t(11, -27, gp.flip_y) + block.t(2, -25) + snake.t(5, -31, gp.rccw) + pattern([[ ..**.* ..**.*** ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** ]], 14, -8) m.hc190.transform = {-16, -22, gp.rccw} -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/gplus/guns.lua0000755000175000017500000000431412706123635015206 00000000000000-- This module is loaded if a script calls require "gplus.guns". local g = golly() local gp = require "gplus" local pattern = gp.pattern local flip = gp.flip local flip_x = gp.flip_x local flip_y = gp.flip_y local rccw = gp.rccw local gpo = require "gplus.objects" local block = gpo.block local eater = gpo.eater local queenbee = gpo.queenbee local bheptomino = gpo.bheptomino local m = {} -- better to assume that caller has set Life rule to evolve phases -- gp.setrule("B3/S23") -------------------------------------------------------------------------------- -- an aligned gun shooting SE: m.gun24 = pattern([[ 23bo2bo$21b6o$17b2obo8bo$13b2obobobob8o2bo$11b3ob2o3bobo7b3o$10bo 4b3o2bo3bo3b2o$11b3o3b2ob4obo3bob2o$12bobo3bo5bo4bo2bo4b2obo$10b o8bob2o2b2o2b2o5bob2obo$10b5ob4obo4b3o7bo4bo$15b2o4bo4bob3o2b2ob ob2ob2o$12b5ob3o4b2ob2o3bobobobobo$11bo5b2o4b2obob2o5bo5bo$12b5o 6b2obo3bo3bobob2ob2o$2ob2o9b2o2bo5bobo4bo2b3obobo$bobobobob2o3b3o bo6bo2bobo4b3o2bo$o2bo7bo6b2o3b3o8bobob2o$3o2bo4b2o11bo10bo$5b4o bo17b2o4b2o$2b2obo6bo14bo3bo2b2o$bo4bo3bo16bo6b2o$b3obo4bo16bo3b o2bo$11bo2bo3bo9b2o4bobob2o$b3obo4bo8b2o3bo10b3o2bo$bo4bo3bo7bo6b o8b3obobo$2b2obo6bo10b3o8bobob2ob2o$5b4obo24bo5bo$3o2bo4b2o21bob obobobo$o2bo7bo9b2o10b2obob2ob2o$bobobobob2o10bo8bo5bo4bo$2ob2o17b 3o6bo4bob2obo$24bo4b3o5b2obo!]], -32, -32) -------------------------------------------------------------------------------- local lgun30 = queenbee + block.t(12, 2) + (queenbee[5] + block.t(12, 2)).t(-9, 2, flip_x) local lgun30_asym = queenbee + eater.t(10, 1, rccw) + (queenbee[5] + block.t(12, 2)).t(-9, 2, flip_x) m.gun30 = lgun30.t(1, -7) -- aligned gun shooting SE m.gun30_a = lgun30_asym.t(1, -7) -- aligned gun shooting SE m.gun60 = m.gun30 + m.gun30_a[26].t(-4, 11, flip_y) -------------------------------------------------------------------------------- local lhalf = bheptomino.t(0, 2, flip_x) + bheptomino.t(0, -2, flip) + block.t(16, -4) + block.t(16, 3) m.gun46_double = lhalf.t(7, -2) + lhalf.t(-8, 2, flip_x) m.gun46 = lhalf[1].t(1, -7) + lhalf.t(-13, -4, flip_x) -- aligned version shooting SE -------------------------------------------------------------------------------- return m golly-3.3-src/Scripts/Lua/goto.lua0000755000175000017500000001103313441044674014046 00000000000000-- Go to a requested generation. The given generation can be an -- absolute number like 1,000,000 (commas are optional) or a number -- relative to the current generation like +9 or -6. If the target -- generation is less than the current generation then we go back -- to the starting generation (normally 0) and advance to the target. -- Authors: Andrew Trevorrow and Dave Greene, Apr 2016. local g = golly() local gp = require "gplus" local validint = gp.validint -------------------------------------------------------------------------------- local function intbase(n, b) -- convert integer n >= 0 to a base b digit array (thanks to PM 2Ring) digits = {} while n > 0 do digits[#digits + 1] = n % b n = math.floor(n / b) end if #digits == 0 then digits = {0} end return digits end -------------------------------------------------------------------------------- local function go_to(gen) local currgen = tonumber(g.getgen()) local newgen if gen:sub(1,1) == '+' then newgen = currgen + tonumber(gen:sub(2,-1)) elseif gen:sub(1,1) == '-' then local n = tonumber(gen:sub(2,-1)) if currgen > n then newgen = currgen - n else newgen = 0 end else newgen = tonumber(gen) end if newgen < currgen then -- try to go back to starting gen (not necessarily 0) and -- then forwards to newgen; note that reset() also restores -- algorithm and/or rule, so too bad if user changed those -- after the starting info was saved; -- first save current location and scale local midx, midy = g.getpos() local mag = g.getmag() g.reset() -- restore location and scale g.setpos(midx, midy) g.setmag(mag) -- current gen might be > 0 if user loaded a pattern file -- that set the gen count currgen = tonumber(g.getgen()) if newgen < currgen then g.error("Can't go back any further; pattern was saved ".. "at generation "..currgen..".") return end end if newgen == currgen then return end g.show("Hit escape to abort...") local oldsecs = os.clock() -- before stepping we advance by 1 generation, for two reasons: -- 1. if we're at the starting gen then the *current* step size -- will be saved (and restored upon Reset/Undo) rather than a -- possibly very large step size -- 2. it increases the chances the user will see updates and so -- get some idea of how long the script will take to finish -- (otherwise if the base is 10 and a gen like 1,000,000,000 -- is given then only a single step() of 10^9 would be done) g.run(1) currgen = currgen + 1 -- use fast stepping (thanks to PM 2Ring) for i, d in ipairs(intbase(newgen - currgen, g.getbase())) do if d > 0 then g.setstep(i-1) for j = 1, d do if g.empty() then g.show("Pattern is empty.") return end g.step() local newsecs = os.clock() if newsecs - oldsecs >= 1.0 then -- do an update every sec oldsecs = newsecs g.update() end end end end g.show("") end -------------------------------------------------------------------------------- local function savegen(filename, gen) local f = io.open(filename, "w") if f then f:write(gen) f:close() else g.warn("Can't save gen in filename:\n"..filename) end end -------------------------------------------------------------------------------- -- use same file name as in goto.py local GotoINIFileName = g.getdir("data").."goto.ini" local previousgen = "" local f = io.open(GotoINIFileName, "r") if f then previousgen = f:read("*l") or "" f:close() end local gen = g.getstring("Enter the desired generation number,\n".. "or -n/+n to go back/forwards by n:", previousgen, "Go to generation") if gen == "" then g.exit() elseif gen == '+' or gen == '-' then -- clear the default savegen(GotoINIFileName, "") elseif not validint(gen) then g.exit("Sorry, but \""..gen.."\" is not a valid integer.") else -- best to save given gen now in case user aborts script savegen(GotoINIFileName, gen) local oldstep = g.getstep() go_to(gen:gsub(",","")) g.setstep(oldstep) end golly-3.3-src/Scripts/Lua/shift.lua0000755000175000017500000000471312773066602014224 00000000000000-- Shift current selection by given x y amounts using optional mode. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016. local g = golly() local gp = require "gplus" local selrect = g.getselrect() if #selrect == 0 then g.exit("There is no selection.") end -- use same file name as in shift.py local inifilename = g.getdir("data").."shift.ini" local oldparams = "0 0 or" local f = io.open(inifilename, "r") if f then -- get the parameters given last time oldparams = f:read("*l") or "" f:close() end local s = g.getstring("Enter x y shift amounts and an optional mode\n".. "(valid modes are copy/or/xor, default is or):", oldparams, "Shift selection") local x, y, mode = gp.split(s) -- check x and y if y == nil then g.exit("Enter x and y amounts separated by a space.") end if not gp.validint(x) then g.exit("Bad x value: "..x) end if not gp.validint(y) then g.exit("Bad y value: "..y) end x = tonumber(x) y = tonumber(y) -- check optional mode if mode == nil then mode = "or" else mode = string.lower(mode) if mode == "c" then mode = "copy" end if mode == "o" then mode = "or" end if mode == "x" then mode = "xor" end if not (mode == "copy" or mode == "or" or mode == "xor") then g.exit("Unknown mode: "..mode.." (must be copy/or/xor)") end end -- given parameters are valid so save them for next run f = io.open(inifilename, "w") if f then f:write(s) f:close() end -- abort shift if the new selection would be outside a bounded grid if g.getwidth() > 0 then local gridl = -g.getwidth()/2 local gridr = gridl + g.getwidth() - 1 local newl = selrect[1] + x local newr = newl + selrect[3] - 1 if newl < gridl or newr > gridr then g.exit("New selection would be outside grid.") end end if g.getheight() > 0 then local gridt = -g.getheight()/2 local gridb = gridt + g.getheight() - 1 local newt = selrect[2] + y local newb = newt + selrect[4] - 1 if newt < gridt or newb > gridb then g.exit("New selection would be outside grid.") end end -- do the shift by cutting the current selection and pasting it into -- the new position without changing the current clipboard pattern local selcells = g.getcells(selrect) g.clear(0) selrect[1] = selrect[1] + x selrect[2] = selrect[2] + y g.select(selrect) if mode == "copy" then g.clear(0) end g.putcells(selcells, x, y, 1, 0, 0, 1, mode) if not g.visrect(selrect) then g.fitsel() end golly-3.3-src/Scripts/Lua/envelope.lua0000755000175000017500000001023713111767235014717 00000000000000-- Use multiple layers to create a history of the current pattern. -- The "envelope" layer remembers all live cells. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2016. local g = golly() local gp = require "gplus" if g.empty() then g.exit("There is no pattern.") end local currindex = g.getlayer() local startindex local envindex local startname = "starting pattern" local envname = "envelope" if currindex > 1 and g.getname(currindex - 1) == startname and g.getname(currindex - 2) == envname then -- continue from where we left off startindex = currindex - 1 envindex = currindex - 2 elseif (currindex + 2) < g.numlayers() and g.getname(currindex + 1) == startname and g.getname(currindex) == envname then -- switch from envelope layer to current layer and continue currindex = currindex + 2 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 elseif (currindex + 1) < g.numlayers() and g.getname(currindex) == startname and g.getname(currindex - 1) == envname then -- switch from starting layer to current layer and continue currindex = currindex + 1 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 else -- start a new envelope using pattern in current layer if g.numlayers() + 1 > g.maxlayers() then g.exit("You need to delete a couple of layers.") end if g.numlayers() + 2 > g.maxlayers() then g.exit("You need to delete a layer.") end -- get current layer's starting pattern local startpatt = g.getcells(g.getrect()) envindex = g.addlayer() -- create layer for remembering all live cells g.setcolors({-1,100,100,100}) -- set all live states to darkish gray g.putcells(startpatt) -- copy starting pattern into this layer startindex = g.addlayer() -- create layer for starting pattern g.setcolors({-1,0,255,0}) -- set all live states to green g.putcells(startpatt) -- copy starting pattern into this layer -- move currindex to above the envelope and starting pattern g.movelayer(currindex, envindex) g.movelayer(envindex, startindex) currindex = startindex startindex = currindex - 1 envindex = currindex - 2 -- name the starting and envelope layers so user can run script -- again and continue from where it was stopped g.setname(startname, startindex) g.setname(envname, envindex) end -------------------------------------------------------------------------------- function envelope() -- draw stacked layers using same location and scale g.setoption("stacklayers", 1) g.show("Hit escape key to stop script...") while true do g.run(1) if g.empty() then g.show("Pattern died out.") return end -- copy current pattern to envelope layer -- we temporarily disable event checking so thumb scrolling -- and other mouse events won't cause confusing changes local currpatt = g.getcells(g.getrect()) g.check(false) g.setlayer(envindex) g.putcells(currpatt) g.setlayer(currindex) g.check(true) local step = 1 local expo = g.getstep() if expo > 0 then step = g.getbase()^expo end if g.getgen() % step == 0 then -- display all 3 layers (envelope, start, current) g.update() end end end -------------------------------------------------------------------------------- -- show status bar but hide layer & edit bars (faster, and avoids flashing) local oldstatus = g.setoption("showstatusbar", 1) local oldlayerbar = g.setoption("showlayerbar", 0) local oldeditbar = g.setoption("showeditbar", 0) local status, err = xpcall(envelope, gp.trace) if err then g.continue(err) end -- the following code is executed even if error occurred or user aborted script -- restore original state of status/layer/edit bars g.setoption("showstatusbar", oldstatus) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) golly-3.3-src/Scripts/Lua/draw-lines.lua0000644000175000017500000001072413107435536015146 00000000000000-- Allow user to draw one or more straight lines by clicking end points. -- Author: Andrew Trevorrow (andrew@trevorrow.com), Apr 2016. local g = golly() local gp = require "gplus" local oldline = {} local firstcell = {} -- pos and state of the 1st cell clicked local drawstate = g.getoption("drawingstate") -------------------------------------------------------------------------------- local function drawline(x1, y1, x2, y2) -- draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm; -- we also return the old cells in the line so we can erase line later local oldcells = {} -- note that x1,y1 has already been drawn if x1 == x2 and y1 == y2 then g.update() return oldcells end local dx = x2 - x1 local ax = math.abs(dx) * 2 local sx = 1 if dx < 0 then sx = -1 end local dy = y2 - y1 local ay = math.abs(dy) * 2 local sy = 1 if dy < 0 then sy = -1 end if ax > ay then local d = ay - (ax / 2) while x1 ~= x2 do oldcells[#oldcells+1] = {x1, y1, g.getcell(x1, y1)} g.setcell(x1, y1, drawstate) if d >= 0 then y1 = y1 + sy d = d - ax end x1 = x1 + sx d = d + ay end else local d = ax - (ay / 2) while y1 ~= y2 do oldcells[#oldcells+1] = {x1, y1, g.getcell(x1, y1)} g.setcell(x1, y1, drawstate) if d >= 0 then x1 = x1 + sx d = d - ay end y1 = y1 + sy d = d + ax end end oldcells[#oldcells+1] = {x2, y2, g.getcell(x2, y2)} g.setcell(x2, y2, drawstate) g.update() return oldcells end -------------------------------------------------------------------------------- local function eraseline(oldcells) for _, t in ipairs(oldcells) do g.setcell( table.unpack(t) ) end end -------------------------------------------------------------------------------- function drawlines() local started = false local oldmouse = "" local startx, starty, endx, endy while true do local event = g.getevent() if event:find("click") == 1 then -- event is a string like "click 10 20 left altctrlshift" local evt, x, y, butt, mods = gp.split(event) oldmouse = x .. ' ' .. y if started then -- draw permanent line from start pos to end pos endx = tonumber(x) endy = tonumber(y) drawline(startx, starty, endx, endy) -- this is also the start of another line startx = endx starty = endy oldline = {} firstcell = {} else -- start first line startx = tonumber(x) starty = tonumber(y) firstcell = { startx, starty, g.getcell(startx, starty) } g.setcell(startx, starty, drawstate) g.update() started = true g.show("Click where to end this line (and start another line)...") end else -- event might be "" or "key m none" if #event > 0 then g.doevent(event) end local mousepos = g.getxy() if started and #mousepos == 0 then -- erase old line if mouse is not over grid if #oldline > 0 then eraseline(oldline) oldline = {} g.update() end elseif started and #mousepos > 0 and mousepos ~= oldmouse then -- mouse has moved, so erase old line (if any) and draw new line if #oldline > 0 then eraseline(oldline) end local x, y = gp.split(mousepos) oldline = drawline(startx, starty, tonumber(x), tonumber(y)) oldmouse = mousepos end end end end -------------------------------------------------------------------------------- g.show("Click where to start line...") local oldcursor = g.getcursor() g.setcursor("Draw") local status, err = xpcall(drawlines, gp.trace) if err then g.continue(err) end -- the following code is executed even if error occurred or user aborted script g.setcursor(oldcursor) if #oldline > 0 then eraseline(oldline) end if #firstcell > 0 then local x, y, s = table.unpack(firstcell) g.setcell(x, y, s) endgolly-3.3-src/Scripts/Lua/credits.lua0000755000175000017500000003045013441044674014537 00000000000000--[[ This script displays animated credits for Golly Author: Chris Rowett (crowett@gmail.com). --]] local g = golly() -- require "gplus.strict" local gp = require "gplus" local op = require "oplus" local maketext = op.maketext local pastetext = op.pastetext local ov = g.overlay local ovt = g.ovtable math.randomseed(os.time()) -- init seed for math.random -- minor optimizations local rand = math.random local floor = math.floor local sin = math.sin local wd, ht = g.getview(g.getlayer()) -- viewport width and height local sound_enabled = false -- flag if sound available local extra_layer = false -- whether the extra layer was created local minzoom = 1/16 local maxzoom = 32 -------------------------------------------------------------------------------- local function lineartoreal(zoom) return minzoom * math.pow(maxzoom / minzoom, zoom) end -------------------------------------------------------------------------------- local function bezierx(t, x0, x1, x2, x3) local cX = 3 * (x1 - x0) local bX = 3 * (x2 - x1) - cX local aX = x3 - x0 - cX - bX -- compute x position local x = (aX * math.pow(t, 3)) + (bX * math.pow(t, 2)) + (cX * t) + x0 return x end -------------------------------------------------------------------------------- local function create_anim_bg(clipname) local level -- create a clip the size of the overlay and make it the render target ov("create "..wd.." "..ht.." "..clipname) ov("target "..clipname) -- create the graduated background for y = 0, ht / 2 do level = 32 + floor(128 * (y * 2 / ht)) ovt{"rgba", 0, 0, level, 255} ovt{"line", 0, y, wd, y} ovt{"line", 0 , (ht - y), wd, (ht - y)} end -- make the overlay the render target ov("target") end -------------------------------------------------------------------------------- local function animate_credits() -- create the overlay ov("create "..wd.." "..ht) -- check if sound is available if (ov("sound") == "2") then sound_enabled = true end -- create a new layer g.addlayer() extra_layer = true g.setalgo("QuickLife") -- add the pattern g.open("../../Patterns/Life/Guns/golly-ticker.rle") g.setname("Credits") g.run(1024) -- create the cellview ov("cellview 1640 -138 1024 1024") ov("celloption grid 0") -- theme with opaque alive cells and transparent dead and unoccupied cells and border ov("theme 192 192 192 192 192 192 0 0 0 0 0 0 0 0 0 255 0 0 0") ov("create "..wd.." "..ht.." pattern") local zoomdelta = 0.0002 local camminzoom = 5/9 local cammaxzoom = 8/9 local camzoom = cammaxzoom local camhold = 1000 local camcount = camhold local smoothzoom -- update the pattern every n frames local patternupdateframe = 4 local gliderframe = patternupdateframe -- save settings local oldblend = ov("blend 0") local oldalign = ov("textoption align left") -- create text clips local exitclip = "exit" local oldfont = ov("font 12 roman") local exitw = maketext("Click or press any key to close.", exitclip, op.white, 2, 2) local gollyopaqueclip = "clip1" local gollytranslucentclip = "clip2" ov("font 200 mono") local bannertext = "Golly" ovt{"rgba", 255, 192, 32, 255} local w, h = maketext(bannertext, gollyopaqueclip) ovt{"rgba", 255, 192, 32, 144} maketext(bannertext, gollytranslucentclip) local creditstext = [[ © The Golly Gang: Tom Rokicki, Andrew Trevorrow, Tim Hutton, Dave Greene, Jason Summers, Maks Verver, Robert Munafo, Chris Rowett. CREDITS The Pioneers John Conway for creating the Game of Life Martin Gardner for popularizing the topic in Scientific American The Programmers Tom Rokicki for the complicated stuff Andrew Trevorrow for the cross-platform GUI and overlay Chris Rowett for rule, rendering and overlay improvements Tim Hutton for the RuleTable algorithm Dave Greene Jason Summers Maks Verver Robert Munafo The Beta Testers Thanks to all the bug hunters for their reports and suggestions, especially: Dave Greene Gabriel Nivasch Dean Hickerson Brice Due David Eppstein Tony Smith Alan Hensel Dennis Langdeau Bill Gosper Mark Jeronimus Eric Goldstein Arie Paap Thanks to Bill Gosper for the idea behind the HashLife algorithm Alan Hensel for QuickLife ideas and non-totalistic algorithm David Eppstein for the B0 rule emulation idea Adam P. Goucher and Dean Hickerson for clever ideas to speed up Larger than Life Eugene Langvagen for inspiring Golly's scripting capabilities Stephen Silver for the wonderful Life Lexicon Nathaniel Johnston for the brilliant LifeWiki and the online archive Julian Smart and all wxWidgets developers for wxWidgets Guido van Rossum for Python Roberto Ierusalimschy and all Lua developers for Lua ]] if sound_enabled then creditstext = creditstext.."\nNikolaus Gebhardt @ Ambiera\nfor irrKlang\n" end creditstext = creditstext.. [[ Pattern Collection Dave Greene and Alan Hensel Thanks to everybody who allowed us to distribute their fantastic patterns, especially: Nick Gotts Gabriel Nivasch David Eppstein Jason Summers Stephen Morley Dean Hickerson Brice Due William R. Buckley David Moore Mark Owen Tim Hutton Renato Nobili Adam P. Goucher David Bell Kenichi Morita ]] -- start music if sound enabled if sound_enabled then ov("sound loop oplus/sounds/overlay-demo/animation.ogg") creditstext = creditstext.."\n\n\n\nMusic\n\n\n'Contentment'\nWritten and performed by Chris Rowett" end -- create credits clip ov("textoption align center") ov("font 14 roman") local creditsclip = "credits" local credwidth, credheight = maketext(creditstext, creditsclip, "rgba 128 255 255 255", 2, 2) -- create graduated background local bgclip = "bg" create_anim_bg(bgclip) -- create stars local starx = {} local stary = {} local stard = {} local numstars = 800 for i = 1, numstars do starx[i] = rand(0, wd - 1) stary[i] = rand(0, ht - 1) stard[i] = floor((i - 1) / 10) / 100 end local textx = wd local texty local running = true local credity = ht local creditx = floor((wd - credwidth) / 2) local credpos local firsttime = true local starttime, endtime -- main loop while running do starttime = g.millisecs() -- check for resize local newwd, newht = g.getview(g.getlayer()) if newwd ~= wd or newht ~= ht then -- resize overlay if newwd < 1 then newwd = 1 end if newht < 1 then newht = 1 end -- scale stars for i = 1, numstars do starx[i] = floor(starx[i] * newwd / wd) stary[i] = floor(stary[i] * newht / ht) end -- save new size wd = newwd ht = newht -- resize overlay ov("resize "..wd.." "..ht) -- resize cellview pattern clip ov("resize "..wd.." "..ht.." pattern") -- recreate background create_anim_bg(bgclip) -- recenter credits text creditx = floor((wd - credwidth) / 2) end -- stop when key pressed or mouse button clicked local event = g.getevent() if event == "key f11 none" then g.doevent(event) else if event:find("^key") or event:find("^oclick") then running = false end end -- draw background ov("blend 0") ovt{"paste", 0, 0, bgclip} -- draw stars local level = 50 ovt{"rgba", level, level, level, 255} local lastd = stard[1] local coords = { "set" } local ci = 2 for i = 1, numstars do if (stard[i] ~= lastd) then if ci > 2 then ovt(coords) ci = 2 coords = { "set" } end ovt{"rgba", level, level, level, 255} level = level + 2 lastd = stard[i] end starx[i] = starx[i] + lastd if starx[i] > wd then starx[i] = 0 stary[i] = rand(0, ht - 1) end coords[ci] = starx[i] coords[ci + 1] = stary[i] ci = ci + 2 end if ci > 2 then ovt(coords) end -- update pattern every few frames if gliderframe == patternupdateframe then gliderframe = 1 g.run(1) ov("updatecells") end gliderframe = gliderframe + 1 -- update camera zoom if camcount < camhold then camcount = camcount + 1 else if zoomdelta < 0 then if camzoom > camminzoom then camzoom = camzoom + zoomdelta if camzoom < camminzoom then camzoom = camminzoom end else camcount = 1 zoomdelta = -zoomdelta end else if camzoom < cammaxzoom then camzoom = camzoom + zoomdelta if camzoom > cammaxzoom then camzoom = cammaxzoom end else camcount = 1 zoomdelta = -zoomdelta end end end smoothzoom = bezierx((camzoom - camminzoom) / (cammaxzoom - camminzoom), 0, 0, 1, 1) * (cammaxzoom - camminzoom) + camminzoom -- update cell view ov("target pattern") ov("camera zoom "..lineartoreal(smoothzoom)) ov("drawcells") -- paste the pattern onto the background ov("target") ov("blend 1") ovt{"paste", 0, 0, "pattern"} -- draw bouncing scrolling text ov("blend 2") texty = floor(((ht - h) / 2 - (100 * sin(textx / 100)))) pastetext(textx, texty, op.identity, gollyopaqueclip) texty = floor(((ht - h) / 2 + (100 * sin(textx / 100)))) pastetext(textx, texty, op.identity, gollytranslucentclip) -- draw credits credpos = floor(credity) pastetext(creditx, credpos, op.identity, creditsclip) credity = credity - .5 if credity < -credheight then credity = ht end -- draw exit message pastetext(floor((wd - exitw) / 2), 20, op.identity, exitclip) -- update display ov("update") if firsttime then firsttime = false g.update() end -- move text textx = textx - 2 if textx <= -w then textx = wd end -- wait until at least 15ms have elapsed endtime = g.millisecs() while (endtime - starttime < 15) do endtime = g.millisecs() end end -- free clips ov("delete pattern") ov("delete "..exitclip) ov("delete "..gollytranslucentclip) ov("delete "..gollyopaqueclip) ov("delete "..creditsclip) ov("delete "..bgclip) -- restore settings ov("textoption align "..oldalign) ov("font "..oldfont) ov("blend "..oldblend) -- stop music if sound_enabled then ov("sound stop") end -- delete the layer g.dellayer() extra_layer = false end -------------------------------------------------------------------------------- local function main() -- draw animated credits animate_credits() end -------------------------------------------------------------------------------- local oldoverlay = g.setoption("showoverlay", 1) local oldbuttons = g.setoption("showbuttons", 0) -- disable translucent buttons local oldscroll = g.setoption("showscrollbars", 0) local oldtile = g.setoption("tilelayers", 0) local oldstack = g.setoption("stacklayers", 0) local status, err = xpcall(main, gp.trace) if err then g.continue(err) end -- the following code is always executed -- delete the overlay and restore settings saved above g.check(false) ov("delete") g.setoption("showoverlay", oldoverlay) g.setoption("showbuttons", oldbuttons) g.setoption("showscrollbars", oldscroll) g.setoption("tilelayers", oldtile) g.setoption("stacklayers", oldstack) if extra_layer then g.dellayer() end golly-3.3-src/Scripts/Lua/1D.lua0000755000175000017500000003126613543255652013357 00000000000000--[[ This script lets you use Golly to explore one-dimensional rules. It supports all of Stephen Wolfram's 256 elementary rules, as well as totalistic rules with up to 4 states and a maximum range of 4. Author: Andrew Trevorrow (andrew@trevorrow.com), May 2019. --]] local g = golly() local gp = require "gplus" local split = gp.split require "gplus.NewCA" SCRIPT_NAME = "1D" DEFAULT_RULE = "W110" RULE_HELP = [[ This script lets you explore one-dimensional rules. Stephen Wolfram's elementary rules are strings of the form Wn where n is a number from 0 to 255.

Totalistic rules are strings of the form CcKkRr where c is a code number from 0 to k^((2r+1)k-2r)-1, k is the number of states (2 to 4), and r is the range (1 to 4).

More details can be found at these links:
http://mathworld.wolfram.com/ElementaryCellularAutomaton.html
http://mathworld.wolfram.com/TotalisticCellularAutomaton.html ]] -- the following are non-local so a startup script can change them DEFWD, DEFHT = 500, 500 -- default grid size aliases = {} -- none at the moment -------------------------------------------------------------------------------- NextPattern = function() end -- ParseRule sets this to NextElementary or NextTotalistic local birth = {} -- set by ParseRule (only if given rule is valid) local numstates = 2 -- ditto local range = 1 -- ditto local empty_row = false -- NextPattern created an empty row? function ParseRule(newrule) -- Parse the given rule string. -- If valid then return nil, the canonical rule string, -- the width and height of the grid, and the number of states. -- If not valid then just return an appropriate error message. if #newrule == 0 then newrule = DEFAULT_RULE -- should be a valid rule! else -- check for a known alias local rule = aliases[newrule] if rule then newrule = rule elseif newrule:find(":") then -- try without the suffix local p, s = split(newrule,":") rule = aliases[p] if rule then newrule = rule..":"..s end end end local prefix, suffix = split(newrule:upper(),":") -- check for a valid prefix local elementary = true local n, c, k, r if prefix:find("^W") then n = tonumber( prefix:match("^W(%d+)$") ) if n == nil or n > 255 then return "Rule syntax is Wn where n is from 0 to 255." end elseif prefix:find("^C") then c, k, r = prefix:match("^C(%d+)K([234])R([1234])$") c = tonumber(c) k = tonumber(k) r = tonumber(r) if not (c and k and r) then return "Rule syntax is CcKkRr where c is the code number,\n".. "k is the number of states (2 to 4), and r is the\n".. "range (1 to 4)." end local maxcode = math.floor(k^((2*r+1)*k-2*r)) - 1 if c > maxcode then return "Maximum code for K"..k.." and R"..r.." is "..maxcode.."." end elementary = false else return "Rule must start with W or C." end -- check for a valid suffix like T50 or T50,30 local wd, ht = DEFWD, DEFHT if suffix then if suffix:find(",") then wd, ht = suffix:match("^T(%d+),(%d+)$") else wd = suffix:match("^T(%d+)$") ht = wd end wd = tonumber(wd) ht = tonumber(ht) if wd == nil or ht == nil then return "Rule suffix must be Twd,ht or Twd." end end if wd < 10 then wd = 10 elseif wd > 4000 then wd = 4000 end if ht < 10 then ht = 10 elseif ht > 4000 then ht = 4000 end -- given rule is valid -- set birth table for use in NextPattern birth = {} if elementary then local bit = 1 for i = 0, 7 do if n & bit > 0 then birth[i] = 1 end bit = bit * 2 end else -- totalistic local code = c for i = 0, (2*r+1)*k-2*r-1 do if code == 0 then break end local s = code % k if s > 0 then birth[i] = s end code = code // k end end if birth[0] == nil then empty_row = false end -- set NextPattern, numstates, range, and create the canonical rule local canonrule if elementary then NextPattern = NextElementary numstates = 2 range = 1 canonrule = "W"..n..":T"..wd..","..ht else -- totalistic NextPattern = NextTotalistic numstates = k range = r canonrule = "C"..c.."K"..k.."R"..r..":T"..wd..","..ht end return nil, canonrule, wd, ht, numstates end -------------------------------------------------------------------------------- function NextElementary(currcells, minx, miny, maxx, maxy) -- Create the next elementary pattern. local newrow = {} -- cell array for the new row (one-state) local newlen = 0 -- length of newrow local get = g.getcell -- find the bottom row of the current pattern local bbox = g.getrect() local y = bbox[2] + bbox[4] - 1 if birth[0] then -- for odd-numbered rules we need to ensure the grid doesn't become empty -- when we wrap to the top row if y == maxy then -- save bottom row, erase current pattern and put bottom row in top row local gridwd = maxx-minx+1 local bottrow = g.getcells( {minx, maxy, gridwd, 1} ) g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(bottrow, 0, -(maxy-miny), 1, 0, 0, 1, "or") currcells = g.getcells( {minx, miny, gridwd, 1} ) y = miny elseif empty_row then -- if bottom row of current pattern is full then advance y by 1 local full = true for x = minx, maxx do if get(x, y) == 0 then full = false ; break end end if full then y = y + 1 end end end local newy = y + 1 -- y coordinates for newrow if newy > maxy then newy = miny -- wrap to top row end for x = minx, maxx do local xm1 = x-1 local xp1 = x+1 -- wrap left and right edges if xm1 < minx then xm1 = maxx end if xp1 > maxx then xp1 = minx end local i = get(xp1, y) if get(x, y) == 1 then i = i + 2 end if get(xm1, y) == 1 then i = i + 4 end if birth[i] then newlen = newlen+1 ; newrow[newlen] = x newlen = newlen+1 ; newrow[newlen] = newy end end empty_row = newlen == 0 -- for next call (only used if birth[0]) if newy == miny then -- erase current pattern and put newrow in top row g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(newrow) return newrow else -- append newrow to currcells (no need to erase current pattern) local currlen = #currcells for i = 1, newlen do currlen = currlen+1 ; currcells[currlen] = newrow[i] end g.putcells(newrow) return currcells end end -------------------------------------------------------------------------------- function NextTotalistic(currcells, minx, miny, maxx, maxy) -- Create the next totalistic pattern. local newrow = {} -- cell array for the new row (one-state or multi-state) local newlen = 0 -- length of newrow local get = g.getcell local multistate = numstates > 2 -- find the bottom row of the current pattern local bbox = g.getrect() local y = bbox[2] + bbox[4] - 1 if birth[0] then -- for odd-numbered rules we need to ensure the grid doesn't become empty -- when we wrap to the top row if y == maxy then -- save bottom row, erase current pattern and put bottom row in top row local gridwd = maxx-minx+1 local bottrow = g.getcells( {minx, maxy, gridwd, 1} ) g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(bottrow, 0, -(maxy-miny), 1, 0, 0, 1, "or") currcells = g.getcells( {minx, miny, gridwd, 1} ) y = miny elseif empty_row then -- if bottom row of current pattern is full then advance y by 1 local full = true for x = minx, maxx do if get(x, y) == 0 then full = false ; break end end if full then y = y + 1 end end end local newy = y + 1 -- y coordinates for newrow if newy > maxy then newy = miny -- wrap to top row end for x = minx, maxx do local total = get(x, y) for i = 1, range do local xmi = x-i local xpi = x+i -- wrap left and right edges if xmi < minx then xmi = maxx - (minx - xmi - 1) end if xpi > maxx then xpi = minx + (xpi - maxx - 1) end total = total + get(xmi, y) total = total + get(xpi, y) end if birth[total] then newlen = newlen+1 ; newrow[newlen] = x newlen = newlen+1 ; newrow[newlen] = newy if multistate then newlen = newlen+1 ; newrow[newlen] = birth[total] end end end if newlen > 0 and multistate then -- ensure length of newrow is odd if newlen & 1 == 0 then newlen = newlen+1 ; newrow[newlen] = 0 end end empty_row = newlen == 0 -- for next call (only used if birth[0]) if newy == miny then -- erase current pattern and put newrow in top row g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor") g.putcells(newrow) return newrow else -- append newrow to currcells (no need to erase current pattern) local currlen = #currcells if multistate then -- ignore any padding ints in currcells and newrow if currlen % 3 > 0 then currlen = currlen - 1 end if newlen % 3 > 0 then newlen = newlen - 1 end end for i = 1, newlen do currlen = currlen+1 ; currcells[currlen] = newrow[i] end if multistate then -- ensure length of currcells is odd if currlen & 1 == 0 then currcells[currlen+1] = 0 end end g.putcells(newrow) return currcells end end -------------------------------------------------------------------------------- -- override SetColors to use Wolfram's color scheme in ANKOS function SetColors() g.setcolors{0,255,255,255} -- state 0 is white if g.numstates() == 2 then -- state 1 is black g.setcolors{1,0,0,0} else -- live states vary from gray to black g.setcolors{128,128,128, 0,0,0} end g.setcolor("border", 190, 210, 230) -- light blue border around grid g.setcolor(g.getalgo(), 190, 210, 230) -- ditto for status bar background end -------------------------------------------------------------------------------- -- override RandomPattern to create a single row at the top of the grid function RandomPattern() local rand = math.random -- avoid flash due to Refresh call in NewPattern local savedRefresh = Refresh Refresh = function() end NewPattern("random") Refresh = savedRefresh local minx = -(g.getwidth() // 2) local miny = -(g.getheight() // 2) local maxx = minx + g.getwidth() - 1 local perc = GetDensity() for x = minx, maxx do if rand(0,99) < perc then g.setcell(x, miny, rand(1,g.numstates()-1)) end end FitGrid() -- calls Refresh end -------------------------------------------------------------------------------- -- user's startup script might want to override this function RandomRule() local rand = math.random -- create a random totalistic rule local k = rand(2,4) local r = rand(1,4) local c = rand(0,math.floor(k^((2*r+1)*k-2*r)) - 1) return "C"..c.."K"..k.."R"..r end -------------------------------------------------------------------------------- -- allow alt-R to create a random pattern with a random totalistic rule local saveHandleKey = HandleKey function HandleKey(event) local _, key, mods = split(event) if key == "r" and mods == "alt" then SetRule(RandomRule()) RandomPattern() else -- pass the event to the original HandleKey saveHandleKey(event) end end -------------------------------------------------------------------------------- -- and away we go... StartNewCA() golly-3.3-src/gui-common/0000755000175000017500000000000013543255652012357 500000000000000golly-3.3-src/gui-common/algos.h0000644000175000017500000001007313145740437013554 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _ALGOS_H_ #define _ALGOS_H_ #include "lifealgo.h" #include "utils.h" // for gColor // for storing icon info: typedef struct { int wd; int ht; unsigned char* pxldata; // RGBA data (size = wd * ht * 4) } gBitmap; typedef gBitmap* gBitmapPtr; // Golly supports multiple algorithms. The first algorithm // registered must *always* be qlifealgo. The second must // *always* be hlifealgo. The order of the rest does not matter. enum { QLIFE_ALGO, // QuickLife HLIFE_ALGO // HashLife }; const int MAX_ALGOS = 50; // maximum number of algorithms typedef int algo_type; // 0..MAX_ALGOS-1 // A class for all the static info we need about a particular algorithm: class AlgoData : public staticAlgoInfo { public: AlgoData(); virtual void setDefaultBaseStep(int v) { defbase = v; } // all hashing algos use maxhashmem and QuickLife uses 0 (unlimited) // virtual void setDefaultMaxMem(int v) { } static AlgoData& tick(); // static allocator // additional data bool canhash; // algo uses hashing? int defbase; // default base step gColor statusrgb; // status bar color gBitmapPtr* icons7x7; // icon bitmaps for scale 1:8 gBitmapPtr* icons15x15; // icon bitmaps for scale 1:16 gBitmapPtr* icons31x31; // icon bitmaps for scale 1:32 // default color scheme bool gradient; // use color gradient? gColor fromrgb; // color at start of gradient gColor torgb; // color at end of gradient // if gradient is false then use these colors for each cell state unsigned char algor[256]; unsigned char algog[256]; unsigned char algob[256]; }; extern AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm extern algo_type initalgo; // initial algorithm // the following bitmaps are grayscale icons that can be used with any rules // with any number of states extern gBitmapPtr* circles7x7; // circular icons for scale 1:8 extern gBitmapPtr* circles15x15; // circular icons for scale 1:16 extern gBitmapPtr* circles31x31; // circular icons for scale 1:32 extern gBitmapPtr* diamonds7x7; // diamond icons for scale 1:8 extern gBitmapPtr* diamonds15x15; // diamond icons for scale 1:16 extern gBitmapPtr* diamonds31x31; // diamond icons for scale 1:32 extern gBitmapPtr* hexagons7x7; // hexagonal icons for scale 1:8 extern gBitmapPtr* hexagons15x15; // hexagonal icons for scale 1:16 extern gBitmapPtr* hexagons31x31; // hexagonal icons for scale 1:32 // NOTE: the triangular icons are only suitable for a 4-state rule that // is emulating a triangular neighborhood with 2 triangles per cell extern gBitmapPtr* triangles7x7; // triangular icons for scale 1:8 extern gBitmapPtr* triangles15x15; // triangular icons for scale 1:16 extern gBitmapPtr* triangles31x31; // triangular icons for scale 1:32 void InitAlgorithms(); // Initialize above data. Must be called before reading the prefs file. void DeleteAlgorithms(); // Deallocate memory allocated in InitAlgorithms(). lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck = true); // Create a new universe of given type. If allowcheck is true then // event checking is allowed. const char* GetAlgoName(algo_type algotype); // Return name of given algorithm. This name appears in various places // and is also stored in the prefs file. int NumAlgos(); // Return current number of algorithms. gBitmapPtr* CreateIconBitmaps(const char** xpmdata, int maxstates); // Create icon bitmaps using the given XPM data. gBitmapPtr* ScaleIconBitmaps(gBitmapPtr* srcicons, int size); // Return icon bitmaps scaled to given size. void FreeIconBitmaps(gBitmapPtr* icons); // Free all the memory used by the given set of icons. bool MultiColorImage(gBitmapPtr image); // Return true if image contains at least one color that isn't a shade of gray. #endif golly-3.3-src/gui-common/view.cpp0000644000175000017500000015216613171233731013757 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, Fatal, YesNo, Beep, etc #include "prefs.h" // for showgridlines, etc #include "status.h" // for DisplayMessage, etc #include "render.h" // for InitPaste #include "undo.h" // for currlayer->undoredo->... #include "select.h" // for Selection #include "algos.h" // for algo_type, *_ALGO, CreateNewUniverse, etc #include "layer.h" // for currlayer, ResizeLayers, etc #include "control.h" // for generating, ChangeRule #include "file.h" // for GetTextFromClipboard #include "view.h" #include // for abs #ifdef ANDROID_GUI #include "jnicalls.h" // for UpdatePattern, BeginProgress, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for UpdatePattern, BeginProgress, etc #endif #ifdef IOS_GUI #import "PatternViewController.h" // for UpdatePattern, BeginProgress, etc #endif // ----------------------------------------------------------------------------- // exported data: const char* empty_selection = "There are no live cells in the selection."; const char* empty_outside = "There are no live cells outside the selection."; const char* no_selection = "There is no selection."; const char* selection_too_big = "Selection is outside +/- 10^9 boundary."; const char* pattern_too_big = "Pattern is outside +/- 10^9 boundary."; const char* origin_restored = "Origin restored."; bool widescreen = true; // is screen wide enough to show all info? (assume a tablet device; eg. iPad) bool fullscreen = false; // in full screen mode? bool nopattupdate = false; // disable pattern updates? bool waitingforpaste = false; // waiting for user to decide what to do with paste image? gRect pasterect; // bounding box of paste image int pastex, pastey; // where user wants to paste clipboard pattern bool drawingcells = false; // currently drawing cells? bool draw_pending = false; // delay drawing? int pendingx, pendingy; // start of delayed drawing // ----------------------------------------------------------------------------- // local data: static int cellx, celly; // current cell's 32-bit position static bigint bigcellx, bigcelly; // current cell's position static int initselx, initsely; // location of initial selection click static bool forceh; // resize selection horizontally? static bool forcev; // resize selection vertically? static bigint anchorx, anchory; // anchor cell of current selection static Selection prevsel; // previous selection static int drawstate; // new cell state (0..255) static Layer* pastelayer = NULL; // temporary layer with pattern to be pasted static gRect pastebox; // bounding box (in cells) for paste pattern static std::string oldrule; // rule before readclipboard is called static std::string newrule; // rule after readclipboard is called static bool pickingcells = false; // picking cell states by dragging finger? static bool selectingcells = false; // selecting cells by dragging finger? static bool movingview = false; // moving view by dragging finger? static bool movingpaste = false; // moving paste image by dragging finger? // ----------------------------------------------------------------------------- void UpdatePatternAndStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- void UpdateEverything() { UpdatePattern(); UpdateStatus(); UpdateEditBar(); } // ----------------------------------------------------------------------------- bool OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r) { return ( t < bigint::min_coord || l < bigint::min_coord || b > bigint::max_coord || r > bigint::max_coord ); } // ----------------------------------------------------------------------------- void TestAutoFit() { if (currlayer->autofit && generating) { // assume user no longer wants us to do autofitting currlayer->autofit = false; } } // ----------------------------------------------------------------------------- void FitInView(int force) { if (waitingforpaste && currlayer->algo->isEmpty()) { // fit paste image in viewport if there is no pattern // (note that pastelayer->algo->fit() won't work because paste image // might be bigger than paste pattern) int vwd = currlayer->view->getxmax(); int vht = currlayer->view->getymax(); int pwd, pht; int mag = MAX_MAG; while (true) { pwd = mag >= 0 ? (pastebox.width << mag) - 1 : (pastebox.width >> -mag); pht = mag >= 0 ? (pastebox.height << mag) - 1 : (pastebox.height >> -mag); if (vwd >= pwd && vht >= pht) { // all of paste image can fit within viewport at this mag break; } mag--; } // set mag and move viewport to origin currlayer->view->setpositionmag(bigint::zero, bigint::zero, mag); // move paste image to middle of viewport pastex = (vwd - pwd) / 2; pastey = (vht - pht) / 2; } else { // fit current pattern in viewport // (if no pattern this will set mag to MAX_MAG and move to origin) currlayer->algo->fit(*currlayer->view, force); } } // ----------------------------------------------------------------------------- bool PointInView(int x, int y) { return ( x >= 0 && x <= currlayer->view->getxmax() && y >= 0 && y <= currlayer->view->getymax() ); } // ----------------------------------------------------------------------------- bool PointInPasteImage(int x, int y) { return (x >= pasterect.x && x <= pasterect.x + pasterect.width-1 && y >= pasterect.y && y <= pasterect.y + pasterect.height-1); } // ----------------------------------------------------------------------------- bool PointInSelection(int x, int y) { pair cellpos = currlayer->view->at(x, y); int cx = cellpos.first.toint(); int cy = cellpos.second.toint(); return currlayer->currsel.ContainsCell(cx, cy); } // ----------------------------------------------------------------------------- bool CellInGrid(const bigint& x, const bigint& y) { // return true if cell at x,y is within bounded grid if (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft || x > currlayer->algo->gridright)) return false; if (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop || y > currlayer->algo->gridbottom)) return false; return true; } // ----------------------------------------------------------------------------- bool PointInGrid(int x, int y) { // is given viewport location also in grid? if (currlayer->algo->gridwd == 0 && currlayer->algo->gridht == 0) { // unbounded grid return true; } pair cellpos = currlayer->view->at(x, y); return CellInGrid(cellpos.first, cellpos.second); } // ----------------------------------------------------------------------------- void RememberOneCellChange(int cx, int cy, int oldstate, int newstate) { if (allowundo) { // remember this cell change for later undo/redo currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } } // ----------------------------------------------------------------------------- void DrawCells(int x, int y) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int currstate; int numchanged = 0; int newx = cellpos.first.toint(); int newy = cellpos.second.toint(); if ( newx != cellx || newy != celly ) { // draw a line of cells using Bresenham's algorithm int d, ii, jj, di, ai, si, dj, aj, sj; di = newx - cellx; ai = abs(di) << 1; si = (di < 0)? -1 : 1; dj = newy - celly; aj = abs(dj) << 1; sj = (dj < 0)? -1 : 1; ii = cellx; jj = celly; lifealgo* curralgo = currlayer->algo; if (ai > aj) { d = aj - (ai >> 1); while (ii != newx) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); RememberOneCellChange(ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { jj += sj; d -= ai; } ii += si; d += aj; } } else { d = ai - (aj >> 1); while (jj != newy) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); RememberOneCellChange(ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { ii += si; d -= aj; } jj += sj; d += ai; } } cellx = newx; celly = newy; currstate = curralgo->getcell(cellx, celly); if (currstate != drawstate) { curralgo->setcell(cellx, celly, drawstate); RememberOneCellChange(cellx, celly, currstate, drawstate); numchanged++; } } if (numchanged > 0) { currlayer->algo->endofpattern(); MarkLayerDirty(); UpdatePattern(); UpdateStatus(); } } // ----------------------------------------------------------------------------- void StartDrawingCells(int x, int y) { if (generating) { // temporarily stop generating when drawing cells (necessary for undo/redo) PauseGenerating(); if (event_checker > 0) { // delay drawing until after step() finishes in NextGeneration() draw_pending = true; pendingx = x; pendingy = y; return; } // NOTE: ResumeGenerating() is called in TouchEnded() } if (!PointInGrid(x, y)) { ErrorMessage("Drawing is not allowed outside grid."); return; } if (currlayer->view->getmag() < 0) { ErrorMessage("Drawing is not allowed at scales greater than 1 cell per pixel."); return; } // check that x,y is within getcell/setcell limits pair cellpos = currlayer->view->at(x, y); if ( OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { ErrorMessage("Drawing is not allowed outside +/- 10^9 boundary."); return; } drawingcells = true; // save dirty state now for later use by RememberCellChanges if (allowundo) currlayer->savedirty = currlayer->dirty; cellx = cellpos.first.toint(); celly = cellpos.second.toint(); int currstate = currlayer->algo->getcell(cellx, celly); // reset drawing state in case it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } if (currstate == currlayer->drawingstate) { drawstate = 0; } else { drawstate = currlayer->drawingstate; } if (currstate != drawstate) { currlayer->algo->setcell(cellx, celly, drawstate); currlayer->algo->endofpattern(); // remember this cell change for later undo/redo RememberOneCellChange(cellx, celly, currstate, drawstate); MarkLayerDirty(); UpdatePattern(); UpdateStatus(); // update population count } } // ----------------------------------------------------------------------------- void PickCell(int x, int y) { if (!PointInGrid(x, y)) return; pair cellpos = currlayer->view->at(x, y); if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int newx = cellpos.first.toint(); int newy = cellpos.second.toint(); if ( newx != cellx || newy != celly ) { cellx = newx; celly = newy; currlayer->drawingstate = currlayer->algo->getcell(cellx, celly); UpdateEditBar(); } } // ----------------------------------------------------------------------------- void StartPickingCells(int x, int y) { if (!PointInGrid(x, y)) { ErrorMessage("Picking is not allowed outside grid."); return; } if (currlayer->view->getmag() < 0) { ErrorMessage("Picking is not allowed at scales greater than 1 cell per pixel."); return; } cellx = INT_MAX; celly = INT_MAX; PickCell(x, y); pickingcells = true; } // ----------------------------------------------------------------------------- void SelectCells(int x, int y) { // only select cells within view if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); if ( abs(initselx - x) < 2 && abs(initsely - y) < 2 && !SelectionExists() ) { // avoid 1x1 selection if finger hasn't moved much return; } // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if (forceh && forcev) { // move selection bigint xdelta = cellpos.first; bigint ydelta = cellpos.second; xdelta -= bigcellx; ydelta -= bigcelly; if ( xdelta != bigint::zero || ydelta != bigint::zero ) { currlayer->currsel.Move(xdelta, ydelta); bigcellx = cellpos.first; bigcelly = cellpos.second; } } else { // change selection size if (!forcev) currlayer->currsel.SetLeftRight(cellpos.first, anchorx); if (!forceh) currlayer->currsel.SetTopBottom(cellpos.second, anchory); } if (currlayer->currsel != prevsel) { // selection has changed DisplaySelectionSize(); prevsel = currlayer->currsel; UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void StartSelectingCells(int x, int y) { TestAutoFit(); // make sure anchor cell is within bounded grid (x,y can be outside grid) pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } anchorx = cellpos.first; anchory = cellpos.second; bigcellx = anchorx; bigcelly = anchory; // save original selection for RememberNewSelection currlayer->savesel = currlayer->currsel; // reset previous selection prevsel.Deselect(); // for avoiding 1x1 selection if finger doesn't move much initselx = x; initsely = y; // allow changing size in any direction forceh = false; forcev = false; if (SelectionExists()) { if (PointInSelection(x, y)) { // modify current selection currlayer->currsel.Modify(x, y, anchorx, anchory, &forceh, &forcev); DisplaySelectionSize(); } else { // remove current selection currlayer->currsel.Deselect(); } UpdatePatternAndStatus(); } selectingcells = true; } // ----------------------------------------------------------------------------- void MoveView(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigint xdelta = bigcellx; bigint ydelta = bigcelly; xdelta -= cellpos.first; ydelta -= cellpos.second; int xamount, yamount; int mag = currlayer->view->getmag(); if (mag >= 0) { // move an integral number of cells xamount = xdelta.toint() << mag; yamount = ydelta.toint() << mag; } else { // convert cell deltas to screen pixels xdelta >>= -mag; ydelta >>= -mag; xamount = xdelta.toint(); yamount = ydelta.toint(); } if ( xamount != 0 || yamount != 0 ) { currlayer->view->move(xamount, yamount); cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; UpdatePattern(); UpdateStatus(); } } // ----------------------------------------------------------------------------- void StartMovingView(int x, int y) { TestAutoFit(); pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; movingview = true; } // ----------------------------------------------------------------------------- void MovePaste(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigint xdelta = bigcellx; bigint ydelta = bigcelly; xdelta -= cellpos.first; ydelta -= cellpos.second; int xamount, yamount; int mag = currlayer->view->getmag(); if (mag >= 0) { // move an integral number of cells xamount = xdelta.toint() << mag; yamount = ydelta.toint() << mag; } else { // convert cell deltas to screen pixels xdelta >>= -mag; ydelta >>= -mag; xamount = xdelta.toint(); yamount = ydelta.toint(); } if ( xamount != 0 || yamount != 0 ) { // shift location of pasterect pastex -= xamount; pastey -= yamount; cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; UpdatePattern(); } } // ----------------------------------------------------------------------------- void StartMovingPaste(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; movingpaste = true; } // ----------------------------------------------------------------------------- void TouchBegan(int x, int y) { if (waitingforpaste && PointInPasteImage(x, y)) { StartMovingPaste(x, y); } else if (currlayer->touchmode == drawmode) { StartDrawingCells(x, y); } else if (currlayer->touchmode == pickmode) { StartPickingCells(x, y); } else if (currlayer->touchmode == selectmode) { StartSelectingCells(x, y); } else if (currlayer->touchmode == movemode) { StartMovingView(x, y); } else if (currlayer->touchmode == zoominmode) { ZoomInPos(x, y); } else if (currlayer->touchmode == zoomoutmode) { ZoomOutPos(x, y); } } // ----------------------------------------------------------------------------- void TouchMoved(int x, int y) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); if ( drawingcells ) { DrawCells(x, y); } else if ( pickingcells ) { PickCell(x, y); } else if ( selectingcells ) { SelectCells(x, y); } else if ( movingview ) { MoveView(x, y); } else if ( movingpaste ) { MovePaste(x, y); } } // ----------------------------------------------------------------------------- void TouchEnded() { if (drawingcells && allowundo) { // MarkLayerDirty has set dirty flag, so we need to // pass in the flag state saved before drawing started currlayer->undoredo->RememberCellChanges("Drawing", currlayer->savedirty); UpdateEditBar(); // update various buttons } if (selectingcells) { if (allowundo) RememberNewSelection("Selection"); UpdateEditBar(); // update various buttons } drawingcells = false; pickingcells = false; selectingcells = false; movingview = false; movingpaste = false; ResumeGenerating(); } // ----------------------------------------------------------------------------- bool CopyRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const char* progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; // copy (and erase if requested) live cells from given rect // in source universe to same rect in destination universe BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; destalgo->setcell(cx, cy, v); if (erasesrc) srcalgo->setcell(cx, cy, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void CopyAllRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, const char* progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // copy all cells from given rect in srcalgo to same rect in destalgo BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { destalgo->setcell(cx, cy, srcalgo->getcell(cx, cy)); cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } destalgo->endofpattern(); EndProgress(); } // ----------------------------------------------------------------------------- bool SelectionExists() { return currlayer->currsel.Exists(); } // ----------------------------------------------------------------------------- void SelectAll() { SaveCurrentSelection(); if (SelectionExists()) { currlayer->currsel.Deselect(); UpdatePatternAndStatus(); } if (currlayer->algo->isEmpty()) { ErrorMessage("All cells are dead."); RememberNewSelection("Deselection"); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); currlayer->currsel.SetEdges(top, left, bottom, right); RememberNewSelection("Select All"); DisplaySelectionSize(); UpdateEverything(); } // ----------------------------------------------------------------------------- void RemoveSelection() { if (SelectionExists()) { SaveCurrentSelection(); currlayer->currsel.Deselect(); RememberNewSelection("Deselection"); UpdateEverything(); } } // ----------------------------------------------------------------------------- void FitSelection() { if (!SelectionExists()) return; currlayer->currsel.Fit(); TestAutoFit(); UpdateEverything(); } // ----------------------------------------------------------------------------- void DisplaySelectionSize() { currlayer->currsel.DisplaySize(); } // ----------------------------------------------------------------------------- void SaveCurrentSelection() { if (allowundo && !currlayer->stayclean) { currlayer->savesel = currlayer->currsel; } } // ----------------------------------------------------------------------------- void RememberNewSelection(const char* action) { if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberSelection(action); } } // ----------------------------------------------------------------------------- void ClearSelection() { currlayer->currsel.Clear(); } // ----------------------------------------------------------------------------- void ClearOutsideSelection() { currlayer->currsel.ClearOutside(); } // ----------------------------------------------------------------------------- void CutSelection() { currlayer->currsel.CopyToClipboard(true); } // ----------------------------------------------------------------------------- void CopySelection() { currlayer->currsel.CopyToClipboard(false); } // ----------------------------------------------------------------------------- void ShrinkSelection(bool fit) { currlayer->currsel.Shrink(fit); } // ----------------------------------------------------------------------------- void RandomFill() { currlayer->currsel.RandomFill(); } // ----------------------------------------------------------------------------- bool FlipSelection(bool topbottom, bool inundoredo) { return currlayer->currsel.Flip(topbottom, inundoredo); } // ----------------------------------------------------------------------------- bool RotateSelection(bool clockwise, bool inundoredo) { return currlayer->currsel.Rotate(clockwise, inundoredo); } // ----------------------------------------------------------------------------- bool GetClipboardPattern(Layer* templayer, bigint* t, bigint* l, bigint* b, bigint* r) { std::string data; if ( !GetTextFromClipboard(data) ) return false; // copy clipboard data to temporary file so we can handle all formats supported by readclipboard FILE* tmpfile = fopen(clipfile.c_str(), "w"); if (tmpfile) { if (fputs(data.c_str(), tmpfile) == EOF) { fclose(tmpfile); Warning("Could not write clipboard text to temporary file!"); return false; } } else { Warning("Could not create temporary file for clipboard data!"); return false; } fclose(tmpfile); // remember current rule oldrule = currlayer->algo->getrule(); const char* err = readclipboard(clipfile.c_str(), *templayer->algo, t, l, b, r); if (err) { // cycle thru all other algos until readclipboard succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { delete templayer->algo; templayer->algo = CreateNewUniverse(i); err = readclipboard(clipfile.c_str(), *templayer->algo, t, l, b, r); if (!err) { templayer->algtype = i; break; } } } } RemoveFile(clipfile); if (err) { // error probably due to bad rule string in clipboard data Warning("Could not load clipboard pattern\n(probably due to unknown rule)."); return false; } else { // set newrule for later use in PasteTemporaryToCurrent newrule = templayer->algo->getrule(); return true; } } // ----------------------------------------------------------------------------- bool ClipboardContainsRule() { std::string data; if (!GetTextFromClipboard(data)) return false; if (strncmp(data.c_str(), "@RULE ", 6) != 0) return false; // extract rule name std::string rulename; int i = 6; while (data[i] > ' ') { rulename += data[i]; i++; } // check if rulename.rule already exists in userrules std::string rulepath = userrules + rulename; rulepath += ".rule"; if (FileExists(rulepath)) { std::string question = "Do you want to replace the existing " + rulename; question += ".rule with the version in the clipboard?"; if (!YesNo(question.c_str())) { // don't overwrite existing .rule file return true; } } // create rulename.rule in userrules FILE* rulefile = fopen(rulepath.c_str(), "w"); if (rulefile) { if (fputs(data.c_str(), rulefile) == EOF) { fclose(rulefile); Warning("Could not write clipboard text to .rule file!"); return true; } } else { Warning("Could not open .rule file for writing!"); return true; } fclose(rulefile); #ifdef WEB_GUI // ensure the .rule file persists beyond the current session CopyRuleToLocalStorage(rulepath.c_str()); #endif // now switch to the newly created rule ChangeRule(rulename); std::string msg = "Created " + rulename + ".rule"; DisplayMessage(msg.c_str()); return true; } // ----------------------------------------------------------------------------- void PasteClipboard() { // if clipboard text starts with "@RULE rulename" then install rulename.rule // and switch to that rule if (ClipboardContainsRule()) return; // create a temporary layer for storing the clipboard pattern if (pastelayer) { Warning("Bug detected in PasteClipboard!"); delete pastelayer; // might as well continue } pastelayer = CreateTemporaryLayer(); if (!pastelayer) return; // read clipboard pattern into pastelayer bigint top, left, bottom, right; if ( GetClipboardPattern(pastelayer, &top, &left, &bottom, &right) ) { // make sure given edges are within getcell/setcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Clipboard pattern is too big."); } else { // temporarily set currlayer to pastelayer so we can update the // paste pattern's colors and icons Layer* savelayer = currlayer; currlayer = pastelayer; UpdateLayerColors(); currlayer = savelayer; #ifdef WEB_GUI DisplayMessage("Drag paste image to desired location then right-click on it."); #else // Android and iOS devices use a touch screen DisplayMessage("Drag paste image to desired location then tap Paste button."); #endif waitingforpaste = true; // set initial position of pasterect's top left corner to near top left corner // of viewport so all of paste image is likely to be visble and it isn't far // to move finger from Paste button pastex = 128; pastey = 64; // create image for drawing the pattern to be pasted; note that pastebox // is not necessarily the minimal bounding box because clipboard pattern // might have blank borders (in fact it could be empty) int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; SetRect(pastebox, ileft, itop, wd, ht); InitPaste(pastelayer, pastebox); } } // waitingforpaste will only be false if an error occurred if (!waitingforpaste) { delete pastelayer; pastelayer = NULL; } } // ----------------------------------------------------------------------------- void PasteTemporaryToCurrent(bigint top, bigint left, bigint wd, bigint ht) { // reset waitingforpaste now to avoid paste image being displayed prematurely waitingforpaste = false; bigint bottom = top; bottom += ht; bottom -= 1; bigint right = left; right += wd; right -= 1; // check that paste rectangle is within edit limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pasting is not allowed outside +/- 10^9 boundary."); return; } // set edges of pattern in pastelayer int itop = pastebox.y; int ileft = pastebox.x; int ibottom = pastebox.y + pastebox.height - 1; int iright = pastebox.x + pastebox.width - 1; // set pastex,pastey to top left cell of paste rectangle pastex = left.toint(); pastey = top.toint(); // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); // pasting clipboard pattern can cause a rule change int oldmaxstate = currlayer->algo->NumCellStates() - 1; if (canchangerule > 0 && currlayer->algo->isEmpty() && oldrule != newrule) { const char* err = currlayer->algo->setrule( newrule.c_str() ); // setrule can fail if readclipboard loaded clipboard pattern into // a different type of algo if (err) { // allow rule change to cause algo change ChangeAlgorithm(pastelayer->algtype, newrule.c_str()); } else { // if pattern exists and is at starting gen then ensure savestart is true // so that SaveStartingPattern will save pattern to suitable file // (and thus undo/reset will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } // use colors for new rule UpdateLayerColors(); if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); // don't paste cells outside bounded grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // copy pattern from temporary universe to current universe int tx, ty, cx, cy; double maxcount = wd.todouble() * ht.todouble(); int cntr = 0; bool abort = false; bool pattchanged = false; bool reduced = false; lifealgo* pastealgo = pastelayer->algo; lifealgo* curralgo = currlayer->algo; int maxstate = curralgo->NumCellStates() - 1; BeginProgress("Pasting pattern"); // we can speed up pasting sparse patterns by using nextcell in these cases: // - if using Or mode // - if current universe is empty // - if paste rect is outside current pattern edges bool usenextcell; if ( pmode == Or || curralgo->isEmpty() ) { usenextcell = true; } else { bigint ctop, cleft, cbottom, cright; curralgo->findedges(&ctop, &cleft, &cbottom, &cright); usenextcell = top > cbottom || bottom < ctop || left > cright || right < cleft; } if ( usenextcell && pmode == And ) { // current universe is empty or paste rect is outside current pattern edges // so don't change any cells } else if ( usenextcell ) { int newstate = 0; cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { int skip = pastealgo->nextcell(tx, ty, newstate); if (skip + tx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so paste it into current universe tx += skip; cx += skip; if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { int currstate = curralgo->getcell(cx, cy); if (currstate != newstate) { if (newstate > maxstate) { newstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } cx++; } else { tx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((ty - itop) * (double)(iright - ileft + 1) + (tx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; cy++; } } else { // have to use slower getcell/setcell calls int tempstate, currstate; int numstates = curralgo->NumCellStates(); cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { tempstate = pastealgo->getcell(tx, ty); currstate = curralgo->getcell(cx, cy); if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { switch (pmode) { case And: if (tempstate != currstate && currstate > 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } break; case Copy: if (tempstate != currstate) { if (tempstate > maxstate) { tempstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, tempstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, tempstate); } break; case Or: // Or mode is done using above nextcell loop; // we only include this case to avoid compiler warning break; case Xor: if (tempstate == currstate) { if (currstate != 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } } else { // tempstate != currstate int newstate = tempstate ^ currstate; // if xor overflows then don't change current state if (newstate >= numstates) newstate = currstate; if (currstate != newstate) { curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } break; } } cx++; cntr++; if ( (cntr % 4096) == 0 ) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; cy++; } } if (pattchanged) curralgo->endofpattern(); EndProgress(); // tidy up and display result ClearMessage(); if (pattchanged) { if (savecells) currlayer->undoredo->RememberCellChanges("Paste", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } if (reduced) ErrorMessage("Some cell states were reduced."); } // ----------------------------------------------------------------------------- void DoPaste(bool toselection) { bigint top, left; bigint wd = pastebox.width; bigint ht = pastebox.height; if (toselection) { // paste pattern into selection rectangle, if possible if (!SelectionExists()) { ErrorMessage("There is no selection."); return; } if (!currlayer->currsel.CanPaste(wd, ht, top, left)) { ErrorMessage("Clipboard pattern is bigger than selection."); return; } // top and left have been set to the selection's top left corner PasteTemporaryToCurrent(top, left, wd, ht); } else { // paste pattern into pasterect, if possible if ( // allow paste if any corner of pasterect is within grid !( PointInGrid(pastex, pastey) || PointInGrid(pastex+pasterect.width-1, pastey) || PointInGrid(pastex, pastey+pasterect.height-1) || PointInGrid(pastex+pasterect.width-1, pastey+pasterect.height-1) ) ) { ErrorMessage("Paste must be at least partially within grid."); return; } // get paste rectangle's top left cell coord pair cellpos = currlayer->view->at(pastex, pastey); top = cellpos.second; left = cellpos.first; PasteTemporaryToCurrent(top, left, wd, ht); } AbortPaste(); } // ----------------------------------------------------------------------------- void AbortPaste() { waitingforpaste = false; pastex = -1; pastey = -1; if (pastelayer) { delete pastelayer; pastelayer = NULL; } } // ----------------------------------------------------------------------------- bool FlipPastePattern(bool topbottom) { bool result; Selection pastesel(pastebox.y, pastebox.x, pastebox.y + pastebox.height - 1, pastebox.x + pastebox.width - 1); // flip the pattern in pastelayer lifealgo* savealgo = currlayer->algo; int savetype = currlayer->algtype; currlayer->algo = pastelayer->algo; currlayer->algtype = pastelayer->algtype; // pass in true for inundoredo parameter so flip won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated inscript = true; result = pastesel.Flip(topbottom, true); // currlayer->algo might point to a *different* universe pastelayer->algo = currlayer->algo; currlayer->algo = savealgo; currlayer->algtype = savetype; inscript = false; if (result) { InitPaste(pastelayer, pastebox); } return result; } // ----------------------------------------------------------------------------- bool RotatePastePattern(bool clockwise) { Selection pastesel(pastebox.y, pastebox.x, pastebox.y + pastebox.height - 1, pastebox.x + pastebox.width - 1); // check if pastelayer->algo uses a finite grid if (!pastelayer->algo->unbounded) { // readclipboard has loaded the pattern into top left corner of grid, // so if pastebox isn't square we need to expand the grid to avoid the // rotated pattern being clipped (WARNING: this assumes the algo won't // change the pattern's cell coordinates when setrule expands the grid) int x, y, wd, ht; pastesel.GetRect(&x, &y, &wd, &ht); if (wd != ht) { // better solution would be to check if pastebox is small enough for // pattern to be safely rotated after shifting to center of grid and only // expand grid if it can't!!!??? (must also update pastesel edges) int newwd, newht; if (wd > ht) { // expand grid vertically newht = pastelayer->algo->gridht + wd; newwd = pastelayer->algo->gridwd; } else { // wd < ht so expand grid horizontally newwd = pastelayer->algo->gridwd + ht; newht = pastelayer->algo->gridht; } char rule[MAXRULESIZE]; sprintf(rule, "%s", pastelayer->algo->getrule()); char topology = 'T'; char *suffix = strchr(rule, ':'); if (suffix) { topology = suffix[1]; suffix[0] = 0; } sprintf(rule, "%s:%c%d,%d", rule, topology, newwd, newht); if (pastelayer->algo->setrule(rule)) { // unlikely, but could happen if the new grid size is too big Warning("Sorry, but the clipboard pattern could not be rotated."); return false; } } } // rotate the pattern in pastelayer lifealgo* savealgo = currlayer->algo; int savetype = currlayer->algtype; currlayer->algo = pastelayer->algo; currlayer->algtype = pastelayer->algtype; // pass in true for inundoredo parameter so rotate won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated and selection size won't be displayed inscript = true; bool result = pastesel.Rotate(clockwise, true); // currlayer->algo might point to a *different* universe pastelayer->algo = currlayer->algo; currlayer->algo = savealgo; currlayer->algtype = savetype; inscript = false; if (result) { // get rotated selection and update pastebox int x, y, wd, ht; pastesel.GetRect(&x, &y, &wd, &ht); SetRect(pastebox, x, y, wd, ht); InitPaste(pastelayer, pastebox); } return result; } // ----------------------------------------------------------------------------- void ToggleCellColors() { InvertCellColors(); if (pastelayer) { // invert colors used to draw paste pattern for (int n = 0; n <= pastelayer->numicons; n++) { pastelayer->cellr[n] = 255 - pastelayer->cellr[n]; pastelayer->cellg[n] = 255 - pastelayer->cellg[n]; pastelayer->cellb[n] = 255 - pastelayer->cellb[n]; } InvertIconColors(pastelayer->atlas7x7, 8, pastelayer->numicons); InvertIconColors(pastelayer->atlas15x15, 16, pastelayer->numicons); InvertIconColors(pastelayer->atlas31x31, 32, pastelayer->numicons); } } // ----------------------------------------------------------------------------- void ZoomInPos(int x, int y) { // zoom in to given point if (currlayer->view->getmag() < MAX_MAG) { TestAutoFit(); currlayer->view->zoom(x, y); UpdateEverything(); } else { Beep(); // can't zoom in any further } } // ----------------------------------------------------------------------------- void ZoomOutPos(int x, int y) { // zoom out from given point TestAutoFit(); currlayer->view->unzoom(x, y); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanUp(int amount) { TestAutoFit(); currlayer->view->move(0, -amount); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanDown(int amount) { TestAutoFit(); currlayer->view->move(0, amount); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanLeft(int amount) { TestAutoFit(); currlayer->view->move(-amount, 0); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanRight(int amount) { TestAutoFit(); currlayer->view->move(amount, 0); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanNE() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(amount, -amount); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanNW() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(-amount, -amount); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanSE() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(amount, amount); UpdateEverything(); } // ----------------------------------------------------------------------------- void PanSW() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(-amount, amount); UpdateEverything(); } // ----------------------------------------------------------------------------- int SmallScroll(int xysize) { int amount; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll an integral number of cells (1 cell = 2^mag pixels) if (mag < 3) { amount = ((xysize >> mag) / 20) << mag; if (amount == 0) amount = 1 << mag; return amount; } else { // grid lines are visible so scroll by only 1 cell return 1 << mag; } } else { // scroll by approx 5% of current wd/ht amount = xysize / 20; if (amount == 0) amount = 1; return amount; } } // ----------------------------------------------------------------------------- int BigScroll(int xysize) { int amount; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll an integral number of cells (1 cell = 2^mag pixels) amount = ((xysize >> mag) * 9 / 10) << mag; if (amount == 0) amount = 1 << mag; return amount; } else { // scroll by approx 90% of current wd/ht amount = xysize * 9 / 10; if (amount == 0) amount = 1; return amount; } } golly-3.3-src/gui-common/prefs.h0000644000175000017500000001243513145740437013572 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _PREFS_H_ #define _PREFS_H_ #include // for std::string #include // for std::list #include "utils.h" // for gColor // Routines for loading and saving user preferences: void GetPrefs(); // Read preferences from prefsfile. void SavePrefs(); // Write preferences to prefsfile. // Various constants: const int minfontsize = 6; // minimum value of helpfontsize const int maxfontsize = 30; // maximum value of helpfontsize const int MAX_SPACING = 1000; // maximum value of boldspacing const int MAX_BASESTEP = 2000000000; // maximum base step const int MAX_DELAY = 5000; // maximum mindelay or maxdelay const int MAX_RECENT = 100; // maximum value of maxpatterns const int MIN_MEM_MB = 10; // minimum value of maxhashmem const int MAX_MEM_MB = 300; // maximum value of maxhashmem // These global paths must be set in platform-specific code before GetPrefs is called: extern std::string supplieddir; // path of parent directory for supplied help/patterns/rules extern std::string helpdir; // path of directory for supplied help extern std::string patternsdir; // path of directory for supplied patterns extern std::string rulesdir; // path of directory for supplied rules extern std::string userdir; // path of parent directory for user's rules/patterns/downloads extern std::string userrules; // path of directory for user's rules extern std::string savedir; // path of directory for user's saved patterns extern std::string downloaddir; // path of directory for user's downloaded files extern std::string tempdir; // path of directory for temporary data extern std::string clipfile; // path of temporary file for storing clipboard data extern std::string prefsfile; // path of file for storing user's preferences // Global preference data: extern int debuglevel; // for displaying debug info if > 0 extern int helpfontsize; // font size in help window extern char initrule[]; // initial rule extern bool initautofit; // initial autofit setting extern bool inithyperspeed; // initial hyperspeed setting extern bool initshowhashinfo; // initial showhashinfo setting extern bool savexrle; // save RLE file using XRLE format? extern bool showtool; // show tool bar? extern bool showlayer; // show layer bar? extern bool showedit; // show edit bar? extern bool showallstates; // show all cell states in edit bar? extern bool showstatus; // show status bar? extern bool showexact; // show exact numbers in status bar? extern bool showtimeline; // show timeline bar? extern bool showtiming; // show timing messages? extern bool showgridlines; // display grid lines? extern bool showicons; // display icons for cell states? extern bool swapcolors; // swap colors used for cell states? extern bool allowundo; // allow undo/redo? extern bool allowbeep; // okay to play beep sound? extern bool restoreview; // should reset/undo restore view? extern int canchangerule; // if > 0 then paste can change rule extern int randomfill; // random fill percentage extern int opacity; // percentage opacity of live cells in overlays extern int tileborder; // width of tiled window borders extern int mingridmag; // minimum mag to draw grid lines extern int boldspacing; // spacing of bold grid lines extern bool showboldlines; // show bold grid lines? extern bool mathcoords; // show Y values increasing upwards? extern bool syncviews; // synchronize viewports? extern bool syncmodes; // synchronize touch modes? extern bool stacklayers; // stack all layers? extern bool tilelayers; // tile all layers? extern bool asktosave; // ask to save changes? extern int newmag; // mag setting for new pattern extern bool newremovesel; // new pattern removes selection? extern bool openremovesel; // opening pattern removes selection? extern int mindelay; // minimum millisec delay extern int maxdelay; // maximum millisec delay extern int maxhashmem; // maximum memory (in MB) for hashlife-based algos // Recent patterns: extern int numpatterns; // current number of recent pattern files extern int maxpatterns; // maximum number of recent pattern files extern std::list recentpatterns; // list of recent pattern files // Colors: extern gColor borderrgb; // color for border around bounded grid extern gColor selectrgb; // color for selected cells extern gColor pastergb; // color for pattern to be pasted // Paste info: typedef enum { And, Copy, Or, Xor // logical paste modes } paste_mode; extern paste_mode pmode; // current paste mode const char* GetPasteMode(); // get pmode void SetPasteMode(const char* s); // set pmode #endif golly-3.3-src/gui-common/view.h0000644000175000017500000000537013145740437013425 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _VIEW_H_ #define _VIEW_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "utils.h" // for gRect // Data and routines for viewing and editing patterns: extern const char* empty_selection; extern const char* empty_outside; extern const char* no_selection; extern const char* selection_too_big; extern const char* pattern_too_big; extern const char* origin_restored; extern bool widescreen; // is screen wide enough to show all info? extern bool fullscreen; // in full screen mode? extern bool nopattupdate; // disable pattern updates? extern bool waitingforpaste; // waiting for user to decide what to do with paste image? extern gRect pasterect; // bounding box of paste image extern int pastex, pastey; // where user wants to paste clipboard pattern extern bool drawingcells; // currently drawing cells? extern bool draw_pending; // delay drawing? extern int pendingx, pendingy; // start of delayed drawing void UpdateEverything(); void UpdatePatternAndStatus(); bool OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r); void TestAutoFit(); void FitInView(int force); void TouchBegan(int x, int y); void TouchMoved(int x, int y); void TouchEnded(); bool CopyRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const char* progmsg); void CopyAllRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, const char* progmsg); bool SelectionExists(); void SelectAll(); void RemoveSelection(); void FitSelection(); void DisplaySelectionSize(); void SaveCurrentSelection(); void RememberNewSelection(const char* action); void CutSelection(); void CopySelection(); void ClearSelection(); void ClearOutsideSelection(); void ShrinkSelection(bool fit); void RandomFill(); bool FlipSelection(bool topbottom, bool inundoredo = false); bool RotateSelection(bool clockwise, bool inundoredo = false); bool ClipboardContainsRule(); void PasteClipboard(); bool FlipPastePattern(bool topbottom); bool RotatePastePattern(bool clockwise); void DoPaste(bool toselection); void AbortPaste(); void ToggleCellColors(); void ZoomInPos(int x, int y); void ZoomOutPos(int x, int y); bool PointInView(int x, int y); bool PointInPasteImage(int x, int y); bool PointInSelection(int x, int y); bool PointInGrid(int x, int y); bool CellInGrid(const bigint& x, const bigint& y); void PanUp(int amount); void PanDown(int amount); void PanLeft(int amount); void PanRight(int amount); void PanNE(); void PanNW(); void PanSE(); void PanSW(); int SmallScroll(int xysize); int BigScroll(int xysize); #endif golly-3.3-src/gui-common/status.cpp0000644000175000017500000001730613171233731014324 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "utils.h" // for Fatal, Beep #include "prefs.h" // for mindelay, maxdelay, etc #include "algos.h" // for algoinfo #include "layer.h" // for currlayer #include "view.h" // for nopattupdate, widescreen, PointInView, etc #include "status.h" #include // for fabs #ifdef ANDROID_GUI #include "jnicalls.h" // for UpdateStatus, GetRuleName #endif #ifdef WEB_GUI #include "webcalls.h" // for UpdateStatus, GetRuleName #endif #ifdef IOS_GUI #import "PatternViewController.h" // for UpdateStatus #import "RuleViewController.h" // for GetRuleName #endif // ----------------------------------------------------------------------------- std::string status1; // top line std::string status2; // middle line std::string status3; // bottom line // prefixes used when widescreen is true: const char* large_gen_prefix = "Generation="; const char* large_algo_prefix = " Algorithm="; const char* large_rule_prefix = " Rule="; const char* large_pop_prefix = " Population="; const char* large_scale_prefix = " Scale="; const char* large_step_prefix = " "; const char* large_xy_prefix = " XY="; // prefixes used when widescreen is false: const char* small_gen_prefix = "Gen="; const char* small_algo_prefix = " Algo="; const char* small_rule_prefix = " Rule="; const char* small_pop_prefix = " Pop="; const char* small_scale_prefix = " Scale="; const char* small_step_prefix = " "; const char* small_xy_prefix = " XY="; static bigint currx, curry; // cursor location in cell coords static bool showxy = false; // show cursor's XY location? // ----------------------------------------------------------------------------- void UpdateStatusLines() { std::string rule = currlayer->algo->getrule(); status1 = "Pattern="; if (currlayer->dirty) { // display asterisk to indicate pattern has been modified status1 += "*"; } status1 += currlayer->currname; status1 += widescreen ? large_algo_prefix : small_algo_prefix; status1 += GetAlgoName(currlayer->algtype); status1 += widescreen ? large_rule_prefix : small_rule_prefix; status1 += rule; // show rule name if one exists and is not same as rule // (best NOT to remove any suffix like ":T100,200" in case we allow // users to name "B3/S23:T100,200" as "Life on torus") std::string rulename = GetRuleName(rule); if (!rulename.empty() && rulename != rule) { status1 += " ["; status1 += rulename; status1 += "]"; } char scalestr[32]; int mag = currlayer->view->getmag(); if (mag < 0) { sprintf(scalestr, "2^%d:1", -mag); } else { sprintf(scalestr, "1:%d", 1 << mag); } char stepstr[32]; if (currlayer->currexpo < 0) { // show delay in secs sprintf(stepstr, "Delay=%gs", (double)GetCurrentDelay() / 1000.0); } else { sprintf(stepstr, "Step=%d^%d", currlayer->currbase, currlayer->currexpo); } status2 = widescreen ? large_gen_prefix : small_gen_prefix; if (nopattupdate) { status2 += "0"; } else { status2 += Stringify(currlayer->algo->getGeneration()); } status2 += widescreen ? large_pop_prefix : small_pop_prefix; if (nopattupdate) { status2 += "0"; } else { bigint popcount = currlayer->algo->getPopulation(); if (popcount.sign() < 0) { // getPopulation returns -1 if it can't be calculated status2 += "?"; } else { status2 += Stringify(popcount); } } status2 += widescreen ? large_scale_prefix : small_scale_prefix; status2 += scalestr; status2 += widescreen ? large_step_prefix : small_step_prefix; status2 += stepstr; status2 += widescreen ? large_xy_prefix : small_xy_prefix; #ifdef WEB_GUI // in web app we show the cursor's current cell location, // or nothing if the cursor is outside the viewport (ie. showxy is false) if (showxy) { bigint xo, yo; bigint xpos = currx; xpos -= currlayer->originx; bigint ypos = curry; ypos -= currlayer->originy; if (mathcoords) { // Y values increase upwards bigint temp = 0; temp -= ypos; ypos = temp; } status2 += Stringify(xpos); status2 += " "; status2 += Stringify(ypos); } #else // in iOS and Android apps we show location of the cell in middle of viewport status2 += Stringify(currlayer->view->x); status2 += " "; status2 += Stringify(currlayer->view->y); #endif } // ----------------------------------------------------------------------------- void ClearMessage() { if (status3.length() == 0) return; // no need to clear message status3.clear(); UpdateStatus(); } // ----------------------------------------------------------------------------- void DisplayMessage(const char* s) { status3 = s; UpdateStatus(); } // ----------------------------------------------------------------------------- void ErrorMessage(const char* s) { Beep(); DisplayMessage(s); } // ----------------------------------------------------------------------------- void SetMessage(const char* s) { // set message string without displaying it status3 = s; } // ----------------------------------------------------------------------------- int GetCurrentDelay() { int gendelay = mindelay * (1 << (-currlayer->currexpo - 1)); if (gendelay > maxdelay) gendelay = maxdelay; return gendelay; } // ----------------------------------------------------------------------------- char* Stringify(const bigint& b) { static char buf[32]; char* p = buf; double d = b.todouble(); if ( fabs(d) > 1000000000.0 ) { // use e notation for abs value > 10^9 (agrees with min & max_coord) sprintf(p, "%g", d); } else { // show exact value with commas inserted for readability if ( d < 0 ) { d = - d; *p++ = '-'; } sprintf(p, "%.f", d); int len = (int)strlen(p); int commas = ((len + 2) / 3) - 1; int dest = len + commas; int src = len; p[dest] = 0; while (commas > 0) { p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = ','; commas--; } if ( p[-1] == '-' ) p--; } return p; } // ----------------------------------------------------------------------------- void CheckMouseLocation(int x, int y) { // check if we need to update XY location in status bar bool mouse_in_grid = false; bigint xpos, ypos; if (PointInView(x, y)) { // get mouse location in cell coords pair cellpos = currlayer->view->at(x, y); xpos = cellpos.first; ypos = cellpos.second; // check if xpos,ypos is inside grid (possibly bounded) mouse_in_grid = CellInGrid(xpos, ypos); } if (mouse_in_grid) { if ( xpos != currx || ypos != curry ) { // show new XY location currx = xpos; curry = ypos; showxy = true; UpdateStatus(); } else if (!showxy) { // mouse moved from outside grid and back over currx,curry showxy = true; UpdateStatus(); } } else { // mouse is outside grid so clear XY location if necessary if (showxy) { showxy = false; UpdateStatus(); } } } golly-3.3-src/gui-common/render.cpp0000644000175000017500000011612213145740437014263 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. /* -------------------- Some notes on Golly's display code --------------------- The rectangular area used to display patterns is called the viewport. All drawing in the viewport is done in this module using OpenGL ES. The main rendering routine is DrawPattern() -- see the end of this module. DrawPattern() does the following tasks: - Calls currlayer->algo->draw() to draw the current pattern. It passes in renderer, an instance of golly_render (derived from liferender) which has these methods: - pixblit() draws a pixmap containing at least one live cell. - getcolors() provides access to the current layer's color arrays. Note that currlayer->algo->draw() does all the hard work of figuring out which parts of the viewport are dead and building all the pixmaps for the live parts. The pixmaps contain suitably shrunken images when the scale is < 1:1 (ie. mag < 0). - Calls DrawGridLines() to overlay grid lines if they are visible. - Calls DrawGridBorder() to draw border around a bounded universe. - Calls DrawSelection() to overlay a translucent selection rectangle if a selection exists and any part of it is visible. - If the user is doing a paste, DrawPasteImage() draws the paste pattern stored in pastelayer. ----------------------------------------------------------------------------- */ #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, Fatal, etc #include "prefs.h" // for showgridlines, mingridmag, swapcolors, etc #include "algos.h" // for gBitmapPtr #include "layer.h" // currlayer, GetLayer, etc #include "view.h" // nopattupdate, waitingforpaste, pasterect, pastex, pastey, etc #include "render.h" #ifdef ANDROID_GUI // the Android version uses OpenGL ES 1 #include #include "jnicalls.h" // for LOGI #endif #ifdef IOS_GUI // the iOS version uses OpenGL ES 1 #import #import #endif #ifdef WEB_GUI // the web version uses OpenGL ES 2 #include #endif // ----------------------------------------------------------------------------- // local data used in golly_render routines int currwd, currht; // current width and height of viewport, in pixels unsigned char dead_alpha = 255; // alpha value for dead pixels unsigned char live_alpha = 255; // alpha value for live pixels GLuint rgbatexture = 0; // texture name for drawing RGBA bitmaps unsigned char* iconatlas = NULL; // pointer to texture atlas for current set of icons Layer* pastelayer; // layer containing the paste pattern gRect pastebbox; // bounding box in cell coords (not necessarily minimal) // the pxldata array is used to render icons and magnified cells; // its size is chosen so that at scale 1:2 DrawMagnifiedCells will only need to call // DrawRGBAData once (assuming golly_render::pixblit passes in 256x256 bytes of state data) const int maxrows = 256 * 2; const int maxbytes = maxrows * maxrows * 4; // 4 bytes (RGBA) per pixel unsigned char pxldata[maxbytes]; // ----------------------------------------------------------------------------- #ifdef WEB_GUI // the following 2 macros convert x,y positions in Golly's preferred coordinate // system (where 0,0 is top left corner of viewport and bottom right corner is // currwd,currht) into OpenGL ES 2's normalized coordinates (where 0.0,0.0 is in // middle of viewport, top right corner is 1.0,1.0 and bottom left corner is -1.0,-1.0) #define XCOORD(x) (2.0 * (x) / float(currwd) - 1.0) #define YCOORD(y) -(2.0 * (y) / float(currht) - 1.0) #else // the following 2 macros don't need to do anything because we've already // changed the viewport coordinate system to what Golly wants #define XCOORD(x) x #define YCOORD(y) y // fixed texture coordinates used by glTexCoordPointer const GLshort texture_coordinates[] = { 0,0, 1,0, 0,1, 1,1 }; #endif // ----------------------------------------------------------------------------- #ifdef WEB_GUI static GLuint LoadShader(GLenum type, const char* shader_source) { // create a shader object, load the shader source, and compile the shader GLuint shader = glCreateShader(type); if (shader == 0) return 0; glShaderSource(shader, 1, &shader_source, NULL); glCompileShader(shader); // check the compile status GLint compiled; glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); if (!compiled) { Warning("Error compiling shader!"); glDeleteShader(shader); return 0; } return shader; } // ----------------------------------------------------------------------------- GLuint pointProgram; // program object for drawing lines and rects GLint positionLoc; // location of v_Position attribute GLint lineColorLoc; // location of LineColor uniform GLuint textureProgram; // program object for drawing 2D textures GLint texPosLoc; // location of a_Position attribute GLint texCoordLoc; // location of a_texCoord attribute GLint samplerLoc; // location of s_texture uniform bool InitOGLES2() { // initialize the shaders and program objects required by OpenGL ES 2 // (based on OpenGL's Hello_Triangle.c and Simple_Texture2D.c) // vertex shader used in pointProgram GLbyte v1ShaderStr[] = "attribute vec4 v_Position; \n" "void main() { \n" " gl_Position = v_Position;\n" "} \n"; // fragment shader used in pointProgram GLbyte f1ShaderStr[] = "uniform lowp vec4 LineColor; \n" "void main() { \n" " gl_FragColor = LineColor;\n" "} \n"; // vertex shader used in textureProgram GLbyte v2ShaderStr[] = "attribute vec4 a_Position; \n" "attribute vec2 a_texCoord; \n" "varying vec2 v_texCoord; \n" "void main() { \n" " gl_Position = a_Position;\n" " v_texCoord = a_texCoord; \n" "} \n"; // fragment shader used in textureProgram GLbyte f2ShaderStr[] = "precision mediump float; \n" "varying vec2 v_texCoord; \n" "uniform sampler2D s_texture; \n" "void main() \n" "{ \n" " gl_FragColor = texture2D(s_texture, v_texCoord);\n" "} \n"; GLuint vertex1Shader, fragment1Shader; GLuint vertex2Shader, fragment2Shader; // load the vertex/fragment shaders vertex1Shader = LoadShader(GL_VERTEX_SHADER, (const char*) v1ShaderStr); vertex2Shader = LoadShader(GL_VERTEX_SHADER, (const char*) v2ShaderStr); fragment1Shader = LoadShader(GL_FRAGMENT_SHADER, (const char*) f1ShaderStr); fragment2Shader = LoadShader(GL_FRAGMENT_SHADER, (const char*) f2ShaderStr); // create the program objects pointProgram = glCreateProgram(); if (pointProgram == 0) return false; textureProgram = glCreateProgram(); if (textureProgram == 0) return false; glAttachShader(pointProgram, vertex1Shader); glAttachShader(pointProgram, fragment1Shader); glAttachShader(textureProgram, vertex2Shader); glAttachShader(textureProgram, fragment2Shader); // link the program objects glLinkProgram(pointProgram); glLinkProgram(textureProgram); // check the link status GLint plinked; glGetProgramiv(pointProgram, GL_LINK_STATUS, &plinked); if (!plinked) { Warning("Error linking pointProgram!"); glDeleteProgram(pointProgram); return false; } GLint tlinked; glGetProgramiv(textureProgram, GL_LINK_STATUS, &tlinked); if (!tlinked) { Warning("Error linking textureProgram!"); glDeleteProgram(textureProgram); return false; } // get the attribute and uniform locations glUseProgram(pointProgram); positionLoc = glGetAttribLocation(pointProgram, "v_Position"); lineColorLoc = glGetUniformLocation(pointProgram, "LineColor"); if (positionLoc == -1 || lineColorLoc == -1) { Warning("Failed to get a location in pointProgram!"); glDeleteProgram(pointProgram); return false; } glUseProgram(textureProgram); texPosLoc = glGetAttribLocation(textureProgram, "a_Position"); texCoordLoc = glGetAttribLocation(textureProgram, "a_texCoord"); samplerLoc = glGetUniformLocation (textureProgram, "s_texture"); if (texPosLoc == -1 || texCoordLoc == -1 || samplerLoc == -1) { Warning("Failed to get a location in textureProgram!"); glDeleteProgram(textureProgram); return false; } // create buffer for vertex data (used for drawing lines and rects) GLuint vertexPosObject; glGenBuffers(1, &vertexPosObject); glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject); // create buffer for index data (used for drawing textures) // where each cell = 2 triangles with 2 shared vertices (0 and 2) // // 0 *---* 3 // | \ | // 1 *---* 2 // GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW); return true; } #endif // WEB_GUI // ----------------------------------------------------------------------------- static void SetColor(int r, int g, int b, int a) { #ifdef WEB_GUI GLfloat color[4]; color[0] = r/255.0; color[1] = g/255.0; color[2] = b/255.0; color[3] = a/255.0; glUniform4fv(lineColorLoc, 1, color); #else glColor4ub(r, g, b, a); #endif } // ----------------------------------------------------------------------------- static void FillRect(int x, int y, int wd, int ht) { GLfloat rect[] = { XCOORD(x), YCOORD(y+ht), // left, bottom XCOORD(x+wd), YCOORD(y+ht), // right, bottom XCOORD(x+wd), YCOORD(y), // right, top XCOORD(x), YCOORD(y), // left, top }; #ifdef WEB_GUI glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), rect, GL_DYNAMIC_DRAW); glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(positionLoc); #else glVertexPointer(2, GL_FLOAT, 0, rect); #endif glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } // ----------------------------------------------------------------------------- static void DisableTextures() { #ifdef WEB_GUI glUseProgram(pointProgram); #else if (glIsEnabled(GL_TEXTURE_2D)) { glDisable(GL_TEXTURE_2D); }; #endif } // ----------------------------------------------------------------------------- void DrawRGBAData(unsigned char* rgbadata, int x, int y, int w, int h, int scale = 1) { // called from golly_render::pixblit to draw RGBA data // create texture name once if (rgbatexture == 0) glGenTextures(1, &rgbatexture); #ifdef WEB_GUI glUseProgram(textureProgram); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, rgbatexture); glUniform1i(samplerLoc, 0); #else if (!glIsEnabled(GL_TEXTURE_2D)) { // restore texture color and enable textures SetColor(255, 255, 255, 255); glEnable(GL_TEXTURE_2D); // bind our texture glBindTexture(GL_TEXTURE_2D, rgbatexture); glTexCoordPointer(2, GL_SHORT, 0, texture_coordinates); } #endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // update the texture with the new RGBA data glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbadata); if (scale > 1) { // we only do this when drawing icons beyond 1:32 w *= scale; h *= scale; } #ifdef WEB_GUI GLfloat vertices[] = { XCOORD(x), YCOORD(y), // Position 0 = left,top 0.0, 0.0, // TexCoord 0 XCOORD(x), YCOORD(y + h), // Position 1 = left,bottom 0.0, 1.0, // TexCoord 1 XCOORD(x + w), YCOORD(y + h), // Position 2 = right,bottom 1.0, 1.0, // TexCoord 2 XCOORD(x + w), YCOORD(y), // Position 3 = right,top 1.0, 0.0 // TexCoord 3 }; glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); glVertexAttribPointer(texPosLoc, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (const GLvoid*)(0)); glVertexAttribPointer(texCoordLoc, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (const GLvoid*)(2 * sizeof(GL_FLOAT))); glEnableVertexAttribArray(texPosLoc); glEnableVertexAttribArray(texCoordLoc); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); #else GLfloat vertices[] = { x, y, x+w, y, x, y+h, x+w, y+h, }; glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); #endif } // ----------------------------------------------------------------------------- void DrawIcons(unsigned char* statedata, int x, int y, int w, int h, int pmscale, int stride) { // called from golly_render::pixblit to draw icons for each live cell // assume pmscale > 2 (should be 8, 16 or 32 -- if higher then the 31x31 icons will be scaled up) int iconsize = pmscale > 32 ? 32 : pmscale; int iconwd = (iconsize-1)*4; // allow for 1 pixel gap at right edge int atlas_rowbytes = iconsize * currlayer->numicons * 4; int rowbytes = w*iconsize*4; // probably best to bump rowbytes up to nearest power of 2 int pot = 1; while (pot < rowbytes) pot *= 2; rowbytes = pot; int stripht = h; #ifdef ANDROID_GUI // reduce chances of crashes (probably due to OpenGL ES bug, and only on some Nexus devices???) if (pmscale > 16) stripht = 1; #endif int numbytes = rowbytes*stripht*iconsize; while (numbytes > maxbytes) { // do 2 or more horizontal strips if (stripht == 1) { // LOGI("BUG in DrawIcons: rowbytes=%d pmscale=%d\n", rowbytes, pmscale); return; } stripht = (stripht+1) / 2; numbytes = rowbytes*stripht*iconsize; } int nextstrip = 0; do { memset(pxldata, 0, numbytes); // all pixels are initially transparent bool sawlivecell = false; // at least one icon needs to be displayed? for (int row = nextstrip; row < nextstrip+stripht && row < h; row++) { for (int col = 0; col < w; col++) { unsigned char state = statedata[row*stride + col]; if (state > 0) { // get position in pxldata of icon's top left pixel int pos = (row-nextstrip)*rowbytes*iconsize + col*iconsize*4; // copy pixel data for icon from appropriate place in iconatlas int ipos = (state-1)*iconsize*4; // subtract 1 from iconsize to allow for 1 pixel gap at bottom edge of icon for (int i = 0; i < iconsize-1; i ++) { memcpy(&pxldata[pos], &iconatlas[ipos], iconwd); pos += rowbytes; ipos += atlas_rowbytes; } sawlivecell = true; } } } if (sawlivecell) DrawRGBAData(pxldata, x, y, rowbytes/4, stripht*iconsize, pmscale/iconsize); y += stripht*pmscale; nextstrip += stripht; } while (nextstrip < h); } // ----------------------------------------------------------------------------- void DrawMagnifiedCells(unsigned char* statedata, int x, int y, int w, int h, int pmscale, int stride) { // called from golly_render::pixblit to draw cells magnified by pmscale (2, 4, ... 2^MAX_MAG) int rowbytes = w*pmscale*4; // probably best to bump rowbytes up to nearest power of 2 int pot = 1; while (pot < rowbytes) pot *= 2; rowbytes = pot; // if pmscale is > 2 then there is a 1 pixel gap at right and bottom edge of each cell int cellsize = pmscale > 2 ? (pmscale-1)*4 : pmscale*4; int rowtotal = pmscale > 2 ? (pmscale-1)*rowbytes : pmscale*rowbytes; int stripht = h; #ifdef ANDROID_GUI // reduce chances of crashes (probably due to OpenGL ES bug, and only on some Nexus devices???) if (pmscale > 16) stripht = 1; #endif int numbytes = rowbytes*stripht*pmscale; while (numbytes > maxbytes) { // do 2 or more horizontal strips if (stripht == 1) { // LOGI("BUG in DrawMagCells: rowbytes=%d pmscale=%d\n", rowbytes, pmscale); return; } stripht = (stripht+1) / 2; numbytes = rowbytes*stripht*pmscale; } int nextstrip = 0; do { memset(pxldata, 0, numbytes); // all pixels are initially transparent bool sawlivecell = false; // at least one live cell needs to be displayed? for (int row = nextstrip; row < nextstrip+stripht && row < h; row++) { for (int col = 0; col < w; col++) { unsigned char state = statedata[row*stride + col]; if (state > 0) { // set cell's top left pixel int pos = (row-nextstrip)*rowbytes*pmscale + col*pmscale*4; pxldata[pos] = currlayer->cellr[state]; pxldata[pos+1] = currlayer->cellg[state]; pxldata[pos+2] = currlayer->cellb[state]; pxldata[pos+3] = live_alpha; // copy 1st pixel to remaining pixels in 1st row for (int i = 4; i < cellsize; i += 4) { memcpy(&pxldata[pos+i], &pxldata[pos], 4); } // copy 1st row of pixels to remaining rows for (int i = rowbytes; i < rowtotal; i += rowbytes) { memcpy(&pxldata[pos+i], &pxldata[pos], cellsize); } sawlivecell = true; } } } if (sawlivecell) DrawRGBAData(pxldata, x, y, rowbytes/4, stripht*pmscale); y += stripht*pmscale; nextstrip += stripht; } while (nextstrip < h); } // ----------------------------------------------------------------------------- class golly_render : public liferender { public: golly_render() {} virtual ~golly_render() {} virtual void pixblit(int x, int y, int w, int h, unsigned char* pm, int pmscale); virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b, unsigned char* deada, unsigned char* livea); }; golly_render renderer; // create instance // ----------------------------------------------------------------------------- void golly_render::pixblit(int x, int y, int w, int h, unsigned char* pmdata, int pmscale) { if (x >= currwd || y >= currht) return; if (x + w <= 0 || y + h <= 0) return; // stride is the horizontal pixel width of the image data int stride = w/pmscale; // clip data outside viewport if (pmscale > 1) { // pmdata contains 1 byte per `pmscale' pixels, so we must be careful // and adjust x, y, w and h by multiples of `pmscale' only if (x < 0) { int dx = -x/pmscale*pmscale; pmdata += dx/pmscale; w -= dx; x += dx; } if (y < 0) { int dy = -y/pmscale*pmscale; pmdata += dy/pmscale*stride; h -= dy; y += dy; } if (x + w >= currwd + pmscale) w = (currwd - x + pmscale - 1)/pmscale*pmscale; if (y + h >= currht + pmscale) h = (currht - y + pmscale - 1)/pmscale*pmscale; } if (pmscale == 1) { // draw RGBA pixel data at scale 1:1 DrawRGBAData(pmdata, x, y, w, h); } else if (showicons && pmscale > 4 && iconatlas) { // draw icons at scales 1:8 and above DrawIcons(pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } else { // draw magnified cells, assuming pmdata contains (w/pmscale)*(h/pmscale) bytes // where each byte contains a cell state DrawMagnifiedCells(pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } } // ----------------------------------------------------------------------------- void golly_render::getcolors(unsigned char** r, unsigned char** g, unsigned char** b, unsigned char* deada, unsigned char* livea) { *r = currlayer->cellr; *g = currlayer->cellg; *b = currlayer->cellb; *deada = dead_alpha; *livea = live_alpha; } // ----------------------------------------------------------------------------- void DrawSelection(gRect& rect, bool active) { // draw semi-transparent rectangle DisableTextures(); if (active) { SetColor(selectrgb.r, selectrgb.g, selectrgb.b, 128); } else { // use light gray to indicate an inactive selection SetColor(160, 160, 160, 128); } FillRect(rect.x, rect.y, rect.width, rect.height); } // ----------------------------------------------------------------------------- void DrawGridBorder(int wd, int ht) { // universe is bounded so draw any visible border regions pair ltpxl = currlayer->view->screenPosOf(currlayer->algo->gridleft, currlayer->algo->gridtop, currlayer->algo); pair rbpxl = currlayer->view->screenPosOf(currlayer->algo->gridright, currlayer->algo->gridbottom, currlayer->algo); int left = ltpxl.first; int top = ltpxl.second; int right = rbpxl.first; int bottom = rbpxl.second; if (currlayer->algo->gridwd == 0) { left = 0; right = wd-1; } if (currlayer->algo->gridht == 0) { top = 0; bottom = ht-1; } // note that right and/or bottom might be INT_MAX so avoid adding to cause overflow if (currlayer->view->getmag() > 0) { // move to bottom right pixel of cell at gridright,gridbottom if (right < wd) right += (1 << currlayer->view->getmag()) - 1; if (bottom < ht) bottom += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() == 1) { // there are no gaps at scale 1:2 if (right < wd) right++; if (bottom < ht) bottom++; } } else { if (right < wd) right++; if (bottom < ht) bottom++; } if (left < 0 && right >= wd && top < 0 && bottom >= ht) { // border isn't visible (ie. grid fills viewport) return; } DisableTextures(); SetColor(borderrgb.r, borderrgb.g, borderrgb.b, 255); if (left >= wd || right < 0 || top >= ht || bottom < 0) { // no part of grid is visible so fill viewport with border FillRect(0, 0, wd, ht); return; } // avoid drawing overlapping rects below int rtop = 0; int rheight = ht; if (currlayer->algo->gridht > 0) { if (top > 0) { // top border is visible FillRect(0, 0, wd, top); // reduce size of rect below rtop = top; rheight -= top; } if (bottom < ht) { // bottom border is visible FillRect(0, bottom, wd, ht - bottom); // reduce size of rect below rheight -= ht - bottom; } } if (currlayer->algo->gridwd > 0) { if (left > 0) { // left border is visible FillRect(0, rtop, left, rheight); } if (right < wd) { // right border is visible FillRect(right, rtop, wd - right, rheight); } } } // ----------------------------------------------------------------------------- void InitPaste(Layer* player, gRect& bbox) { // set globals used in DrawPasteImage pastelayer = player; pastebbox = bbox; } // ----------------------------------------------------------------------------- int PixelsToCells(int pixels, int mag) { // convert given # of screen pixels to corresponding # of cells if (mag >= 0) { int cellsize = 1 << mag; return (pixels + cellsize - 1) / cellsize; } else { // mag < 0; no need to worry about overflow return pixels << -mag; } } // ----------------------------------------------------------------------------- void SetPasteRect(int wd, int ht) { int x, y, pastewd, pasteht; int mag = currlayer->view->getmag(); // find cell coord of current paste position pair pcell = currlayer->view->at(pastex, pastey); // determine bottom right cell bigint right = pcell.first; right += wd; right -= 1; bigint bottom = pcell.second; bottom += ht; bottom -= 1; // best to use same method as in Selection::Visible pair lt = currlayer->view->screenPosOf(pcell.first, pcell.second, currlayer->algo); pair rb = currlayer->view->screenPosOf(right, bottom, currlayer->algo); if (mag > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << mag) - 1; rb.second += (1 << mag) - 1; if (mag > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } } x = lt.first; y = lt.second; pastewd = rb.first - lt.first + 1; pasteht = rb.second - lt.second + 1; // this should never happen but play safe if (pastewd <= 0) pastewd = 1; if (pasteht <= 0) pasteht = 1; // don't let pasterect get too far beyond left/top edge of viewport if (x + pastewd < 64) { if (pastewd >= 64) x = 64 - pastewd; else if (x < 0) x = 0; pastex = x; } if (y + pasteht < 64) { if (pasteht >= 64) y = 64 - pasteht; else if (y < 0) y = 0; pastey = y; } SetRect(pasterect, x, y, pastewd, pasteht); // NSLog(@"pasterect: x=%d y=%d wd=%d ht=%d", pasterect.x, pasterect.y, pasterect.width, pasterect.height); } // ----------------------------------------------------------------------------- void DrawPasteImage() { // calculate pasterect SetPasteRect(pastebbox.width, pastebbox.height); int pastemag = currlayer->view->getmag(); gRect cellbox = pastebbox; // calculate intersection of pasterect and current viewport for use // as a temporary viewport int itop = pasterect.y; int ileft = pasterect.x; int ibottom = itop + pasterect.height - 1; int iright = ileft + pasterect.width - 1; if (itop < 0) { itop = 0; cellbox.y += PixelsToCells(-pasterect.y, pastemag); } if (ileft < 0) { ileft = 0; cellbox.x += PixelsToCells(-pasterect.x, pastemag); } if (ibottom > currht - 1) ibottom = currht - 1; if (iright > currwd - 1) iright = currwd - 1; int pastewd = iright - ileft + 1; int pasteht = ibottom - itop + 1; // set size of translucent rect before following adjustment int rectwd = pastewd; int rectht = pasteht; if (pastemag > 0) { // make sure pastewd/ht don't have partial cells int cellsize = 1 << pastemag; int gap = 1; // gap between cells if (pastemag == 1) gap = 0; // no gap at scale 1:2 if ((pastewd + gap) % cellsize > 0) pastewd += cellsize - ((pastewd + gap) % cellsize); if ((pasteht + gap) % cellsize != 0) pasteht += cellsize - ((pasteht + gap) % cellsize); } cellbox.width = PixelsToCells(pastewd, pastemag); cellbox.height = PixelsToCells(pasteht, pastemag); // set up viewport for drawing paste pattern pastelayer->view->resize(pastewd, pasteht); int midx, midy; if (pastemag > 1) { // allow for gap between cells midx = cellbox.x + (cellbox.width - 1) / 2; midy = cellbox.y + (cellbox.height - 1) / 2; } else { midx = cellbox.x + cellbox.width / 2; midy = cellbox.y + cellbox.height / 2; } pastelayer->view->setpositionmag(midx, midy, pastemag); // temporarily turn off grid lines bool saveshow = showgridlines; showgridlines = false; // temporarily change currwd and currht int savewd = currwd; int saveht = currht; currwd = pastelayer->view->getwidth(); currht = pastelayer->view->getheight(); #ifdef WEB_GUI // temporarily change OpenGL viewport's origin and size to match pastelayer->view glViewport(ileft, saveht-currht-itop, currwd, currht); #else glTranslatef(ileft, itop, 0); #endif // make dead pixels 100% transparent and live pixels 100% opaque dead_alpha = 0; live_alpha = 255; // temporarily set currlayer to pastelayer so golly_render routines // will use the paste pattern's color and icons Layer* savelayer = currlayer; currlayer = pastelayer; if (showicons && pastemag > 2) { // only show icons at scales 1:8 and above if (pastemag == 3) { iconatlas = currlayer->atlas7x7; } else if (pastemag == 4) { iconatlas = currlayer->atlas15x15; } else { iconatlas = currlayer->atlas31x31; } } // draw paste pattern pastelayer->algo->draw(*pastelayer->view, renderer); #ifdef WEB_GUI // restore OpenGL viewport's origin and size glViewport(0, 0, savewd, saveht); #else glTranslatef(-ileft, -itop, 0); #endif currlayer = savelayer; showgridlines = saveshow; currwd = savewd; currht = saveht; // overlay translucent rect to show paste area DisableTextures(); SetColor(pastergb.r, pastergb.g, pastergb.b, 64); FillRect(ileft, itop, rectwd, rectht); } // ----------------------------------------------------------------------------- void DrawGridLines(int wd, int ht) { int cellsize = 1 << currlayer->view->getmag(); int h, v, i, topbold, leftbold; if (showboldlines) { // ensure that origin cell stays next to bold lines; // ie. bold lines scroll when pattern is scrolled pair lefttop = currlayer->view->at(0, 0); leftbold = lefttop.first.mod_smallint(boldspacing); topbold = lefttop.second.mod_smallint(boldspacing); if (currlayer->originx != bigint::zero) { leftbold -= currlayer->originx.mod_smallint(boldspacing); } if (currlayer->originy != bigint::zero) { topbold -= currlayer->originy.mod_smallint(boldspacing); } if (mathcoords) topbold--; // show origin cell above bold line } else { // avoid gcc warning topbold = leftbold = 0; } DisableTextures(); glLineWidth(1.0); // set the stroke color depending on current bg color int r = currlayer->cellr[0]; int g = currlayer->cellg[0]; int b = currlayer->cellb[0]; int gray = (int) ((r + g + b) / 3.0); if (gray > 127) { // darker lines SetColor(r > 32 ? r - 32 : 0, g > 32 ? g - 32 : 0, b > 32 ? b - 32 : 0, 255); } else { // lighter lines SetColor(r + 32 < 256 ? r + 32 : 255, g + 32 < 256 ? g + 32 : 255, b + 32 < 256 ? b + 32 : 255, 255); } // draw all plain lines first; // note that we need to add/subtract 0.5 from coordinates to avoid uneven spacing i = showboldlines ? topbold : 1; v = 0; while (true) { v += cellsize; if (v > ht) break; if (showboldlines) i++; if (i % boldspacing != 0) { #ifdef WEB_GUI GLfloat points[] = { XCOORD( -0.5), YCOORD(v-0.5), XCOORD(wd+0.5), YCOORD(v-0.5) }; glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(GLfloat), points, GL_STATIC_DRAW); glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(positionLoc); #else GLfloat points[] = { -0.5, v-0.5, wd+0.5, v-0.5 }; glVertexPointer(2, GL_FLOAT, 0, points); #endif glDrawArrays(GL_LINES, 0, 2); } } i = showboldlines ? leftbold : 1; h = 0; while (true) { h += cellsize; if (h > wd) break; if (showboldlines) i++; if (i % boldspacing != 0) { #ifdef WEB_GUI GLfloat points[] = { XCOORD(h-0.5), YCOORD( -0.5), XCOORD(h-0.5), YCOORD(ht+0.5) }; glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(GLfloat), points, GL_STATIC_DRAW); glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(positionLoc); #else GLfloat points[] = { h-0.5, -0.5, h-0.5, ht+0.5 }; glVertexPointer(2, GL_FLOAT, 0, points); #endif glDrawArrays(GL_LINES, 0, 2); } } if (showboldlines) { // draw bold lines in slightly darker/lighter color if (gray > 127) { // darker lines SetColor(r > 64 ? r - 64 : 0, g > 64 ? g - 64 : 0, b > 64 ? b - 64 : 0, 255); } else { // lighter lines SetColor(r + 64 < 256 ? r + 64 : 255, g + 64 < 256 ? g + 64 : 255, b + 64 < 256 ? b + 64 : 255, 255); } i = topbold; v = 0; while (true) { v += cellsize; if (v > ht) break; i++; if (i % boldspacing == 0) { #ifdef WEB_GUI GLfloat points[] = { XCOORD( -0.5), YCOORD(v-0.5), XCOORD(wd+0.5), YCOORD(v-0.5) }; glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(GLfloat), points, GL_STATIC_DRAW); glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(positionLoc); #else GLfloat points[] = { -0.5, v-0.5, wd+0.5, v-0.5 }; glVertexPointer(2, GL_FLOAT, 0, points); #endif glDrawArrays(GL_LINES, 0, 2); } } i = leftbold; h = 0; while (true) { h += cellsize; if (h > wd) break; i++; if (i % boldspacing == 0) { #ifdef WEB_GUI GLfloat points[] = { XCOORD(h-0.5), YCOORD( -0.5), XCOORD(h-0.5), YCOORD(ht+0.5) }; glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(GLfloat), points, GL_STATIC_DRAW); glVertexAttribPointer(positionLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(positionLoc); #else GLfloat points[] = { h-0.5, -0.5, h-0.5, ht+0.5 }; glVertexPointer(2, GL_FLOAT, 0, points); #endif glDrawArrays(GL_LINES, 0, 2); } } } } // ----------------------------------------------------------------------------- void DrawPattern(int tileindex) { gRect r; int currmag = currlayer->view->getmag(); // fill the background with state 0 color glClearColor(currlayer->cellr[0]/255.0, currlayer->cellg[0]/255.0, currlayer->cellb[0]/255.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); // if grid is bounded then ensure viewport's central cell is not outside grid edges if ( currlayer->algo->gridwd > 0) { if ( currlayer->view->x < currlayer->algo->gridleft ) currlayer->view->setpositionmag(currlayer->algo->gridleft, currlayer->view->y, currmag); else if ( currlayer->view->x > currlayer->algo->gridright ) currlayer->view->setpositionmag(currlayer->algo->gridright, currlayer->view->y, currmag); } if ( currlayer->algo->gridht > 0) { if ( currlayer->view->y < currlayer->algo->gridtop ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridtop, currmag); else if ( currlayer->view->y > currlayer->algo->gridbottom ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridbottom, currmag); } if (nopattupdate) { // don't draw incomplete pattern, just draw grid lines and border currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); if ( showgridlines && currmag >= mingridmag ) { DrawGridLines(currwd, currht); } if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) { DrawGridBorder(currwd, currht); } return; } if (showicons && currmag > 2) { // only show icons at scales 1:8 and above if (currmag == 3) { iconatlas = currlayer->atlas7x7; } else if (currmag == 4) { iconatlas = currlayer->atlas15x15; } else { iconatlas = currlayer->atlas31x31; } } currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); // all pixels are initially opaque dead_alpha = 255; live_alpha = 255; // draw pattern using a sequence of pixblit calls currlayer->algo->draw(*currlayer->view, renderer); if ( showgridlines && currmag >= mingridmag ) { DrawGridLines(currwd, currht); } // if universe is bounded then draw border regions (if visible) if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) { DrawGridBorder(currwd, currht); } if ( currlayer->currsel.Visible(&r) ) { DrawSelection(r, true); } if (waitingforpaste) { DrawPasteImage(); } } golly-3.3-src/gui-common/algos.cpp0000644000175000017500000010366213145740437014116 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "generationsalgo.h" #include "ltlalgo.h" #include "jvnalgo.h" #include "ruleloaderalgo.h" #include "utils.h" // for Fatal, Warning, SetColor, Poller #include "prefs.h" // for maxhashmem #include "layer.h" // for currlayer #include "algos.h" #include // for std::map // ----------------------------------------------------------------------------- // exported data: algo_type initalgo = QLIFE_ALGO; // initial algorithm AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm gBitmapPtr* circles7x7; // circular icons for scale 1:8 gBitmapPtr* circles15x15; // circular icons for scale 1:16 gBitmapPtr* circles31x31; // circular icons for scale 1:32 gBitmapPtr* diamonds7x7; // diamond-shaped icons for scale 1:8 gBitmapPtr* diamonds15x15; // diamond-shaped icons for scale 1:16 gBitmapPtr* diamonds31x31; // diamond-shaped icons for scale 1:32 gBitmapPtr* hexagons7x7; // hexagonal icons for scale 1:8 gBitmapPtr* hexagons15x15; // hexagonal icons for scale 1:16 gBitmapPtr* hexagons31x31; // hexagonal icons for scale 1:32 gBitmapPtr* triangles7x7; // triangular icons for scale 1:8 gBitmapPtr* triangles15x15; // triangular icons for scale 1:16 gBitmapPtr* triangles31x31; // triangular icons for scale 1:32 // ----------------------------------------------------------------------------- // These default cell colors were generated by continuously finding the // color furthest in rgb space from the closest of the already selected // colors, black, and white. static unsigned char default_colors[] = { 48,48,48, // better if state 0 is dark gray (was 255,127,0) 0,255,127,127,0,255,148,148,148,128,255,0,255,0,128, 0,128,255,1,159,0,159,0,1,255,254,96,0,1,159,96,255,254, 254,96,255,126,125,21,21,126,125,125,21,126,255,116,116,116,255,116, 116,116,255,228,227,0,28,255,27,255,27,28,0,228,227,227,0,228, 27,28,255,59,59,59,234,195,176,175,196,255,171,194,68,194,68,171, 68,171,194,72,184,71,184,71,72,71,72,184,169,255,188,252,179,63, 63,252,179,179,63,252,80,9,0,0,80,9,9,0,80,255,175,250, 199,134,213,115,100,95,188,163,0,0,188,163,163,0,188,203,73,0, 0,203,73,73,0,203,94,189,0,189,0,94,0,94,189,187,243,119, 55,125,32,125,32,55,32,55,125,255,102,185,102,185,255,120,209,168, 208,166,119,135,96,192,182,255,41,83,153,130,247,88,55,89,247,55, 88,55,247,87,75,0,0,87,75,75,0,87,200,135,59,51,213,127, 255,255,162,255,37,182,37,182,255,228,57,117,142,163,210,57,117,228, 193,255,246,188,107,123,123,194,107,145,59,5,5,145,59,59,5,145, 119,39,198,40,197,23,197,23,40,23,40,197,178,199,158,255,201,121, 134,223,223,39,253,84,149,203,15,203,15,149,15,149,203,152,144,90, 143,75,139,71,97,132,224,65,219,65,219,224,255,255,40,218,223,69, 74,241,0,241,0,74,0,74,241,122,171,51,220,211,227,61,127,87, 90,124,176,36,39,13,165,142,255,255,38,255,38,255,255,83,50,107, 224,142,165,255,181,9,9,255,181,181,9,255,140,238,70,255,74,5, 74,5,255,138,84,51,31,172,101,177,115,17,221,0,0,0,221,0, 0,0,221,220,255,200,0,41,50,255,150,205,178,45,116,113,255,189, 47,0,44,40,119,171,205,107,255,177,115,172,133,73,236,109,0,168, 168,46,207,188,181,203,212,188,35,90,97,52,39,209,184,41,164,152, 227,46,70,46,70,227,211,156,255,98,146,222,136,56,95,102,54,152, 86,142,0,142,0,86,0,86,142,86,223,96,246,135,46,4,208,120, 212,233,158,177,92,214,104,147,88,149,240,147,227,93,148,72,255,133, 209,27,194,147,255,255,44,93,0,160,36,158,182,233,0,96,94,217, 218,103,88,163,154,38,118,114,139,94,0,43,113,164,174,168,188,114, 0,23,119,42,86,93,255,226,202,80,191,155,255,158,136,0,247,62, 234,146,88,0,183,229,110,212,36,0,143,161,105,191,210,133,164,0, 41,30,89,164,0,132,30,89,42,178,222,217,121,22,11,221,107,22, 69,151,255,45,158,3,158,3,45,3,45,158,86,42,29,9,122,22, 213,209,110,53,221,57,159,101,91,93,140,45,247,213,37,185,34,0, 0,185,34,34,0,185,236,0,172,210,180,78,231,107,221,162,49,43, 43,162,49,49,43,162,36,248,213,114,0,214,213,36,248,149,34,243, 185,158,167,144,122,224,34,245,149,255,31,98,31,98,255,152,200,193, 255,80,95,128,123,63,102,62,72,255,62,148,151,226,108,159,99,255, 226,255,126,98,223,136,80,95,255,225,153,15,73,41,211,212,71,41, 83,217,187,180,235,79,0,166,127,251,135,243,229,41,0,41,0,229, 82,255,216,141,174,249,249,215,255,167,31,79,31,79,167,213,102,185, 255,215,83,4,2,40,224,171,220,41,0,4,6,50,90,221,15,113, 15,113,221,33,0,115,108,23,90,182,215,36 }; // ----------------------------------------------------------------------------- // Note that all the default icons are grayscale bitmaps. // These icons are used for lots of different rules with different numbers // of states, and at rendering time we will replace the white pixels in each // icon with the cell's state color to avoid "color shock" when switching // between icon and non-icon view. Gray pixels are used to do anti-aliasing. // XPM data for default 7x7 icon static const char* default7x7[] = { // width height ncolors chars_per_pixel "7 7 4 1", // colors ". c #000000", // black will be transparent "D c #404040", "E c #E0E0E0", "W c #FFFFFF", // white // pixels ".DEWED.", "DWWWWWD", "EWWWWWE", "WWWWWWW", "EWWWWWE", "DWWWWWD", ".DEWED." }; // XPM data for default 15x15 icon static const char* default15x15[] = { // width height ncolors chars_per_pixel "15 15 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............", "....DBWWWBD....", "...BWWWWWWWB...", "..BWWWWWWWWWB..", ".DWWWWWWWWWWWD.", ".BWWWWWWWWWWWB.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".BWWWWWWWWWWWB.", ".DWWWWWWWWWWWD.", "..BWWWWWWWWWB..", "...BWWWWWWWB...", "....DBWWWBD....", "..............." }; // XPM data for default 31x31 icon static const char* default31x31[] = { // width height ncolors chars_per_pixel "31 31 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............................", "...............................", "..........DCBWWWWWBCD..........", ".........CWWWWWWWWWWWC.........", ".......DWWWWWWWWWWWWWWWD.......", "......BWWWWWWWWWWWWWWWWWB......", ".....BWWWWWWWWWWWWWWWWWWWB.....", "....DWWWWWWWWWWWWWWWWWWWWWD....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "....WWWWWWWWWWWWWWWWWWWWWWW....", "....DWWWWWWWWWWWWWWWWWWWWWD....", ".....BWWWWWWWWWWWWWWWWWWWB.....", "......BWWWWWWWWWWWWWWWWWB......", ".......DWWWWWWWWWWWWWWWD.......", ".........CWWWWWWWWWWWC.........", "..........DCBWWWWWBCD..........", "...............................", "..............................." }; // XPM data for the 7x7 icon used for hexagonal CA static const char* hex7x7[] = { // width height ncolors chars_per_pixel "7 7 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".WWC...", "WWWWW..", "WWWWWW.", "CWWWWWC", ".WWWWWW", "..WWWWW", "...CWW."}; // XPM data for the 15x15 icon used for hexagonal CA static const char* hex15x15[] = { // width height ncolors chars_per_pixel "15 15 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels "...WWC.........", "..WWWWWC.......", ".WWWWWWWWC.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "CWWWWWWWWWWWC..", ".WWWWWWWWWWWW..", ".CWWWWWWWWWWWC.", "..WWWWWWWWWWWW.", "..CWWWWWWWWWWWC", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....CWWWWWWWW.", ".......CWWWWW..", ".........CWW..."}; // XPM data for 31x31 icon used for hexagonal CA static const char* hex31x31[] = { // width height ncolors chars_per_pixel "31 31 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".....WWC.......................", "....WWWWWC.....................", "...WWWWWWWWC...................", "..WWWWWWWWWWWC.................", ".WWWWWWWWWWWWWWC...............", "WWWWWWWWWWWWWWWWWC.............", "WWWWWWWWWWWWWWWWWWWC...........", "CWWWWWWWWWWWWWWWWWWWWC.........", ".WWWWWWWWWWWWWWWWWWWWWW........", ".CWWWWWWWWWWWWWWWWWWWWWC.......", "..WWWWWWWWWWWWWWWWWWWWWW.......", "..CWWWWWWWWWWWWWWWWWWWWWC......", "...WWWWWWWWWWWWWWWWWWWWWW......", "...CWWWWWWWWWWWWWWWWWWWWWC.....", "....WWWWWWWWWWWWWWWWWWWWWW.....", "....CWWWWWWWWWWWWWWWWWWWWWC....", ".....WWWWWWWWWWWWWWWWWWWWWW....", ".....CWWWWWWWWWWWWWWWWWWWWWC...", "......WWWWWWWWWWWWWWWWWWWWWW...", "......CWWWWWWWWWWWWWWWWWWWWWC..", ".......WWWWWWWWWWWWWWWWWWWWWW..", ".......CWWWWWWWWWWWWWWWWWWWWWC.", "........WWWWWWWWWWWWWWWWWWWWWW.", ".........CWWWWWWWWWWWWWWWWWWWWC", "...........CWWWWWWWWWWWWWWWWWWW", ".............CWWWWWWWWWWWWWWWWW", "...............CWWWWWWWWWWWWWW.", ".................CWWWWWWWWWWW..", "...................CWWWWWWWW...", ".....................CWWWWW....", ".......................CWW....." }; // XPM data for the 7x7 icon used for von Neumann CA static const char* vn7x7[] = { // width height ncolors chars_per_pixel "7 7 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...W...", "..WWW..", ".WWWWW.", "WWWWWWW", ".WWWWW.", "..WWW..", "...W..." }; // XPM data for the 15x15 icon used for von Neumann CA static const char* vn15x15[] = { // width height ncolors chars_per_pixel "15 15 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "..............." }; // XPM data for 31x31 icon used for von Neumann CA static const char* vn31x31[] = { // width height ncolors chars_per_pixel "31 31 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "..............................." }; // XPM data for the 7x7 icons used by 4-state rules emulating a triangular neighborhood static const char* tri7x7[] = { // width height ncolors chars_per_pixel "7 21 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels for state 1 ".......", "W......", "WW.....", "WWW....", "WWWW...", "WWWWW..", "WWWWWW.", // pixels for state 2 ".WWWWWW", "..WWWWW", "...WWWW", "....WWW", ".....WW", "......W", ".......", // pixels for state 3 ".WWWWWW", "W.WWWWW", "WW.WWWW", "WWW.WWW", "WWWW.WW", "WWWWW.W", "WWWWWW." }; // XPM data for the 15x15 icons used by 4-state rules emulating a triangular neighborhood static const char* tri15x15[] = { // width height ncolors chars_per_pixel "15 45 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............", "W..............", "WW.............", "WWW............", "WWWW...........", "WWWWW..........", "WWWWWW.........", "WWWWWWW........", "WWWWWWWW.......", "WWWWWWWWW......", "WWWWWWWWWW.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "WWWWWWWWWWWWW..", "WWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWW", "..WWWWWWWWWWWWW", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....WWWWWWWWWW", "......WWWWWWWWW", ".......WWWWWWWW", "........WWWWWWW", ".........WWWWWW", "..........WWWWW", "...........WWWW", "............WWW", ".............WW", "..............W", "...............", // pixels for state 3 ".WWWWWWWWWWWWWW", "W.WWWWWWWWWWWWW", "WW.WWWWWWWWWWWW", "WWW.WWWWWWWWWWW", "WWWW.WWWWWWWWWW", "WWWWW.WWWWWWWWW", "WWWWWW.WWWWWWWW", "WWWWWWW.WWWWWWW", "WWWWWWWW.WWWWWW", "WWWWWWWWW.WWWWW", "WWWWWWWWWW.WWWW", "WWWWWWWWWWW.WWW", "WWWWWWWWWWWW.WW", "WWWWWWWWWWWWW.W", "WWWWWWWWWWWWWW." }; // XPM data for the 31x31 icons used by 4-state rules emulating a triangular neighborhood static const char* tri31x31[] = { // width height ncolors chars_per_pixel "31 93 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............................", "W..............................", "WW.............................", "WWW............................", "WWWW...........................", "WWWWW..........................", "WWWWWW.........................", "WWWWWWW........................", "WWWWWWWW.......................", "WWWWWWWWW......................", "WWWWWWWWWW.....................", "WWWWWWWWWWW....................", "WWWWWWWWWWWW...................", "WWWWWWWWWWWWW..................", "WWWWWWWWWWWWWW.................", "WWWWWWWWWWWWWWW................", "WWWWWWWWWWWWWWWW...............", "WWWWWWWWWWWWWWWWW..............", "WWWWWWWWWWWWWWWWWW.............", "WWWWWWWWWWWWWWWWWWW............", "WWWWWWWWWWWWWWWWWWWW...........", "WWWWWWWWWWWWWWWWWWWWW..........", "WWWWWWWWWWWWWWWWWWWWWW.........", "WWWWWWWWWWWWWWWWWWWWWWW........", "WWWWWWWWWWWWWWWWWWWWWWWW.......", "WWWWWWWWWWWWWWWWWWWWWWWWW......", "WWWWWWWWWWWWWWWWWWWWWWWWWW.....", "WWWWWWWWWWWWWWWWWWWWWWWWWWW....", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW...", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW..", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "..WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "...WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "....WWWWWWWWWWWWWWWWWWWWWWWWWWW", ".....WWWWWWWWWWWWWWWWWWWWWWWWWW", "......WWWWWWWWWWWWWWWWWWWWWWWWW", ".......WWWWWWWWWWWWWWWWWWWWWWWW", "........WWWWWWWWWWWWWWWWWWWWWWW", ".........WWWWWWWWWWWWWWWWWWWWWW", "..........WWWWWWWWWWWWWWWWWWWWW", "...........WWWWWWWWWWWWWWWWWWWW", "............WWWWWWWWWWWWWWWWWWW", ".............WWWWWWWWWWWWWWWWWW", "..............WWWWWWWWWWWWWWWWW", "...............WWWWWWWWWWWWWWWW", "................WWWWWWWWWWWWWWW", ".................WWWWWWWWWWWWWW", "..................WWWWWWWWWWWWW", "...................WWWWWWWWWWWW", "....................WWWWWWWWWWW", ".....................WWWWWWWWWW", "......................WWWWWWWWW", ".......................WWWWWWWW", "........................WWWWWWW", ".........................WWWWWW", "..........................WWWWW", "...........................WWWW", "............................WWW", ".............................WW", "..............................W", "...............................", // pixels for state 3 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "W.WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WW.WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWW.WWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWW.WWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWW.WWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWW.WWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWW.WWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWW.WWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWW.WWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWW.WWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWW.WWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWW.WWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWW.WWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWW.WWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWW.WWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWW.WWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWW.WWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWW.WWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWW.WWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWW.WWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWW.WWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWW.WWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWW.WWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWW.WWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWW.WWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWW.WWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWW.WWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW.WW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW.W", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW." }; // ----------------------------------------------------------------------------- gBitmapPtr* CreateIconBitmaps(const char** xpmdata, int maxstates) { if (xpmdata == NULL) return NULL; int wd, ht, numcolors, charsperpixel; sscanf(xpmdata[0], "%d %d %d %d", &wd, &ht, &numcolors, &charsperpixel); if (charsperpixel < 1 || charsperpixel > 2) { Warning("Error in XPM header data: chars_per_pixel must be 1 or 2"); return NULL; }; std::map colormap; std::map::iterator iterator; for (int i = 0; i < numcolors; i++) { std::string pixel; char ch1, ch2; int skip; if (charsperpixel == 1) { sscanf(xpmdata[i+1], "%c ", &ch1); pixel += ch1; skip = 2; } else { sscanf(xpmdata[i+1], "%c%c ", &ch1, &ch2); pixel += ch1; pixel += ch2; skip = 3; } if (strlen(xpmdata[i+1]) == (size_t)(skip+9)) { int rgb; sscanf(xpmdata[i+1]+skip, "c #%6x", &rgb); colormap[pixel] = rgb; } else { int r, g, b; sscanf(xpmdata[i+1]+skip, "c #%4x%4x%4x", &r, &g, &b); // only use top 8 bits of r,g,b colormap[pixel] = ((r>>8) << 16) | ((g>>8) << 8) | (b>>8); } } // allocate and clear memory for all icon bitmaps // (using calloc means black pixels will be transparent) unsigned char* rgba = (unsigned char*) calloc(wd * ht * 4, 1); if (rgba == NULL) return NULL; int pos = 0; for (int i = 0; i < ht; i++) { const char* rowstring = xpmdata[i+1+numcolors]; for (int j = 0; j < wd * charsperpixel; j = j + charsperpixel) { std::string pixel; pixel += rowstring[j]; if (charsperpixel == 2) pixel += rowstring[j+1]; // find the RGB color for this pixel iterator = colormap.find(pixel); int rgb = (iterator == colormap.end()) ? 0 : iterator->second; if (rgb == 0) { // pixel is black and alpha is 0 pos += 4; } else { rgba[pos] = (rgb & 0xFF0000) >> 16; pos++; // red rgba[pos] = (rgb & 0x00FF00) >> 8; pos++; // green rgba[pos] = (rgb & 0x0000FF); pos++; // blue rgba[pos] = 255; pos++; // alpha } } } int numicons = ht / wd; if (numicons > 255) numicons = 255; // play safe gBitmapPtr* iconptr = (gBitmapPtr*) malloc(256 * sizeof(gBitmapPtr)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; unsigned char* nexticon = rgba; int iconbytes = wd * wd * 4; for (int i = 0; i < numicons; i++) { gBitmapPtr icon = (gBitmapPtr) malloc(sizeof(gBitmap)); if (icon) { icon->wd = wd; icon->ht = wd; icon->pxldata = (unsigned char*) malloc(iconbytes); if (icon->pxldata) { memcpy(icon->pxldata, nexticon, iconbytes); } } // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = icon; nexticon += iconbytes; } if (numicons < maxstates-1 && iconptr[numicons]) { // duplicate last icon nexticon -= iconbytes; for (int i = numicons; i < maxstates-1; i++) { gBitmapPtr icon = (gBitmapPtr) malloc(sizeof(gBitmap)); if (icon) { icon->wd = wd; icon->ht = wd; icon->pxldata = (unsigned char*) malloc(iconbytes); if (icon->pxldata) { memcpy(icon->pxldata, nexticon, iconbytes); } } iconptr[i+1] = icon; } } } free(rgba); return iconptr; } // ----------------------------------------------------------------------------- static gBitmapPtr CreateSmallerIcon(unsigned char* indata, int insize, int outsize) { gBitmapPtr icon = (gBitmapPtr) malloc(sizeof(gBitmap)); if (icon) { icon->wd = outsize; icon->ht = outsize; icon->pxldata = (unsigned char*) malloc(outsize * outsize * 4); if (icon->pxldata) { // use same algorithm as in create_smaller_icons in icon-importer.py int sample = insize / outsize; int offset = sample / 2; int outpos = 0; for (int row = 0; row < outsize; row++) { for (int col = 0; col < outsize; col++) { int x = offset + col * sample; int y = offset + row * sample; int inpos = (y * insize * 4) + (x * 4); icon->pxldata[outpos++] = indata[inpos++]; icon->pxldata[outpos++] = indata[inpos++]; icon->pxldata[outpos++] = indata[inpos++]; icon->pxldata[outpos++] = indata[inpos++]; } } } } return icon; } // ----------------------------------------------------------------------------- #define SETPIXEL(x, y) \ outpos = (y) * outsize * 4 + (x) * 4; \ icon->pxldata[outpos++] = r; \ icon->pxldata[outpos++] = g; \ icon->pxldata[outpos++] = b; \ icon->pxldata[outpos++] = a; static gBitmapPtr CreateBiggerIcon(unsigned char* indata, int insize, int outsize) { if (insize != 15 || outsize != 31) { // we currently don't support scaling up 7x7 icons as it's highly unlikely // that a .rule file won't have 15x15 icons return NULL; } gBitmapPtr icon = (gBitmapPtr) malloc(sizeof(gBitmap)); if (icon) { icon->wd = outsize; icon->ht = outsize; icon->pxldata = (unsigned char*) calloc(outsize * outsize * 4, 1); if (icon->pxldata) { // use same algorithm as in create31x31icons in icon-importer.py // to scale up a 15x15 bitmap into a 31x31 bitmap using a simple // method that conserves any vertical or horizontal symmetry int inpos = 0; for (int row = 0; row < insize; row++) { for (int col = 0; col < insize; col++) { unsigned char r = indata[inpos++]; unsigned char g = indata[inpos++]; unsigned char b = indata[inpos++]; unsigned char a = indata[inpos++]; if (r || g || b) { // non-black pixel int outpos; if (row == 7 && col == 7) { // expand middle pixel into 9 pixels int x = 15; int y = 15; SETPIXEL(x, y); SETPIXEL(x, y+1); SETPIXEL(x, y-1); SETPIXEL(x+1, y); SETPIXEL(x-1, y); SETPIXEL(x+1, y+1); SETPIXEL(x+1, y-1); SETPIXEL(x-1, y+1); SETPIXEL(x-1, y-1); } else if (row == 7) { // expand pixel in middle row into 6 pixels int x = col * 2; int y = row * 2; if (col > 7) x++; SETPIXEL(x, y); SETPIXEL(x, y+1); SETPIXEL(x+1, y); SETPIXEL(x+1, y+1); SETPIXEL(x, y+2); SETPIXEL(x+1, y+2); } else if (col == 7) { // expand pixel in middle column into 6 pixels int x = col * 2; int y = row * 2; if (row > 7) y++; SETPIXEL(x, y); SETPIXEL(x, y+1); SETPIXEL(x+1, y); SETPIXEL(x+1, y+1); SETPIXEL(x+2, y); SETPIXEL(x+2, y+1); } else { // expand all other pixels into 4 pixels int x = col * 2; int y = row * 2; if (col > 7) x++; if (row > 7) y++; SETPIXEL(x, y); SETPIXEL(x, y+1); SETPIXEL(x+1, y); SETPIXEL(x+1, y+1); } } } } } } return icon; } // ----------------------------------------------------------------------------- gBitmapPtr* ScaleIconBitmaps(gBitmapPtr* srcicons, int size) { if (srcicons == NULL) return NULL; gBitmapPtr* iconptr = (gBitmapPtr*) malloc(256 * sizeof(gBitmapPtr)); if (iconptr) { for (int i = 0; i < 256; i++) { if (srcicons[i] == NULL) { iconptr[i] = NULL; } else { int insize = srcicons[i]->wd; if (insize > size) { iconptr[i] = CreateSmallerIcon(srcicons[i]->pxldata, insize, size); } else { // assume insize < size iconptr[i] = CreateBiggerIcon(srcicons[i]->pxldata, insize, size); } } } } return iconptr; } // ----------------------------------------------------------------------------- static void CreateDefaultIcons(AlgoData* ad) { if (ad->defxpm7x7 || ad->defxpm15x15 || ad->defxpm31x31) { // create icons using given algo's default XPM data ad->icons7x7 = CreateIconBitmaps(ad->defxpm7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(ad->defxpm15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(ad->defxpm31x31, ad->maxstates); // create scaled bitmaps if size(s) not supplied if (!ad->icons7x7) { if (ad->icons15x15) // scale down 15x15 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons15x15, 7); else // scale down 31x31 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons31x31, 7); } if (!ad->icons15x15) { if (ad->icons31x31) // scale down 31x31 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons31x31, 15); else // scale up 7x7 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons7x7, 15); } if (!ad->icons31x31) { if (ad->icons15x15) // scale up 15x15 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons15x15, 31); else // scale up 7x7 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons7x7, 31); } } else { // algo didn't supply any icons so use static XPM data defined above ad->icons7x7 = CreateIconBitmaps(default7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(default15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(default31x31, ad->maxstates); } } // ----------------------------------------------------------------------------- AlgoData::AlgoData() { defbase = 0; icons7x7 = NULL; icons15x15 = NULL; icons31x31 = NULL; } // ----------------------------------------------------------------------------- AlgoData& AlgoData::tick() { AlgoData* r = new AlgoData(); algoinfo[r->id] = r; return *r; } // ----------------------------------------------------------------------------- void InitAlgorithms() { // QuickLife must be 1st and HashLife must be 2nd qlifealgo::doInitializeAlgoInfo(AlgoData::tick()); hlifealgo::doInitializeAlgoInfo(AlgoData::tick()); // these algos can be in any order generationsalgo::doInitializeAlgoInfo(AlgoData::tick()); ltlalgo::doInitializeAlgoInfo(AlgoData::tick()); jvnalgo::doInitializeAlgoInfo(AlgoData::tick()); // RuleLoader must be last so we can display detailed error messages // (see LoadRule in file.cpp) ruleloaderalgo::doInitializeAlgoInfo(AlgoData::tick()); // init algoinfo array for (int i = 0; i < NumAlgos(); i++) { AlgoData* ad = algoinfo[i]; if (ad->algoName == 0 || ad->creator == 0) Fatal("Algorithm did not set name and/or creator"); // does algo use hashing? ad->canhash = ad->defbase == 8; // safer method needed??? // set status bar background by cycling thru a few pale colors switch (i % 9) { case 0: SetColor(ad->statusrgb, 255, 255, 206); break; // pale yellow case 1: SetColor(ad->statusrgb, 226, 250, 248); break; // pale blue case 2: SetColor(ad->statusrgb, 255, 233, 233); break; // pale pink case 3: SetColor(ad->statusrgb, 255, 227, 178); break; // pale orange case 4: SetColor(ad->statusrgb, 225, 255, 225); break; // pale green case 5: SetColor(ad->statusrgb, 243, 225, 255); break; // pale purple case 6: SetColor(ad->statusrgb, 200, 255, 255); break; // pale aqua case 7: SetColor(ad->statusrgb, 200, 200, 200); break; // pale gray case 8: SetColor(ad->statusrgb, 255, 255, 255); break; // white } // initialize default color scheme if (ad->defr[0] == ad->defr[1] && ad->defg[0] == ad->defg[1] && ad->defb[0] == ad->defb[1]) { // colors are nonsensical, probably unset, so use above defaults unsigned char* rgbptr = default_colors; for (int c = 0; c < ad->maxstates; c++) { ad->defr[c] = *rgbptr++; ad->defg[c] = *rgbptr++; ad->defb[c] = *rgbptr++; } } ad->gradient = ad->defgradient; SetColor(ad->fromrgb, ad->defr1, ad->defg1, ad->defb1); SetColor(ad->torgb, ad->defr2, ad->defg2, ad->defb2); for (int c = 0; c < ad->maxstates; c++) { ad->algor[c] = ad->defr[c]; ad->algog[c] = ad->defg[c]; ad->algob[c] = ad->defb[c]; } CreateDefaultIcons(ad); } circles7x7 = CreateIconBitmaps(default7x7,256); circles15x15 = CreateIconBitmaps(default15x15,256); circles31x31 = CreateIconBitmaps(default31x31,256); diamonds7x7 = CreateIconBitmaps(vn7x7,256); diamonds15x15 = CreateIconBitmaps(vn15x15,256); diamonds31x31 = CreateIconBitmaps(vn31x31,256); hexagons7x7 = CreateIconBitmaps(hex7x7,256); hexagons15x15 = CreateIconBitmaps(hex15x15,256); hexagons31x31 = CreateIconBitmaps(hex31x31,256); // these icons can only be used with 4-state rules triangles7x7 = CreateIconBitmaps(tri7x7,4); triangles15x15 = CreateIconBitmaps(tri15x15,4); triangles31x31 = CreateIconBitmaps(tri31x31,4); } // ----------------------------------------------------------------------------- void FreeIconBitmaps(gBitmapPtr* icons) { if (icons) { for (int i = 0; i < 256; i++) { if (icons[i]) { if (icons[i]->pxldata) free(icons[i]->pxldata); free(icons[i]); } } free(icons); } } // ----------------------------------------------------------------------------- void DeleteAlgorithms() { for (int i = 0; i < NumAlgos(); i++) { delete algoinfo[i]; } FreeIconBitmaps(circles7x7); FreeIconBitmaps(circles15x15); FreeIconBitmaps(circles31x31); FreeIconBitmaps(diamonds7x7); FreeIconBitmaps(diamonds15x15); FreeIconBitmaps(diamonds31x31); FreeIconBitmaps(hexagons7x7); FreeIconBitmaps(hexagons15x15); FreeIconBitmaps(hexagons31x31); FreeIconBitmaps(triangles7x7); FreeIconBitmaps(triangles15x15); FreeIconBitmaps(triangles31x31); } // ----------------------------------------------------------------------------- lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck) { lifealgo* newalgo = algoinfo[algotype]->creator(); if (newalgo == NULL) Fatal("Failed to create new universe!"); if (algoinfo[algotype]->canhash) { newalgo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting if (allowcheck) newalgo->setpoll(Poller()); return newalgo; } // ----------------------------------------------------------------------------- const char* GetAlgoName(algo_type algotype) { return algoinfo[algotype]->algoName; } // ----------------------------------------------------------------------------- int NumAlgos() { return staticAlgoInfo::getNumAlgos(); } // ----------------------------------------------------------------------------- bool MultiColorImage(gBitmapPtr image) { // return true if image contains at least one color that isn't a shade of gray if (image == NULL) return false; unsigned char* pxldata = image->pxldata; if (pxldata == NULL) return false; // play safe int numpixels = image->wd * image->ht; int byte = 0; for (int i = 0; i < numpixels; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; if (r != g || g != b) return true; // multi-color byte += 4; } return false; // grayscale } golly-3.3-src/gui-common/select.h0000644000175000017500000001323513145740437013731 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _SELECT_H_ #define _SELECT_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "utils.h" // for gRect // Most editing functions operate on the current selection. // The Selection class encapsulates all selection-related operations. class Selection { public: Selection(); Selection(int t, int l, int b, int r); ~Selection(); bool operator==(const Selection& sel) const; bool operator!=(const Selection& sel) const; bool Exists(); // return true if the selection exists void Deselect(); // remove the selection bool TooBig(); // return true if any selection edge is outside the editable limits void DisplaySize(); // display the selection's size in the status bar void SetRect(int x, int y, int wd, int ht); // set the selection to the given rectangle void GetRect(int* x, int* y, int* wd, int* ht); // return the selection rectangle void SetEdges(bigint& t, bigint& l, bigint& b, bigint& r); // set the selection using the given rectangle edges void CheckGridEdges(); // change selection edges if necessary to ensure they are inside a bounded grid bool Contains(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection encloses the given rectangle bool Outside(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection is completely outside the given rectangle bool ContainsCell(int x, int y); // return true if the given cell is within the selection void Advance(); // advance the pattern inside the selection by one generation void AdvanceOutside(); // advance the pattern outside the selection by one generation void Modify(const int x, const int y, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev); // modify the existing selection based on where the user tapped (inside) void Move(const bigint& xcells, const bigint& ycells); // move the selection by the given number of cells void SetLeftRight(const bigint& x, const bigint& anchorx); // set the selection's left and right edges void SetTopBottom(const bigint& y, const bigint& anchory); // set the selection's top and bottom edges void Fit(); // fit the selection inside the current viewport void Shrink(bool fit); // shrink the selection so it just encloses all the live cells // and optionally fit the new selection inside the current viewport bool Visible(gRect* visrect); // return true if the selection is visible in the current viewport // and, if visrect is not NULL, set it to the visible rectangle void Clear(); // kill all cells inside the selection void ClearOutside(); // kill all cells outside the selection void CopyToClipboard(bool cut); // copy the selection to the clipboard (using RLE format) and // optionally clear the selection if cut is true bool CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left); // return true if the selection fits inside a rectangle of size ht x wd; // if so then top and left are set to the selection's top left corner void RandomFill(); // randomly fill the selection bool Flip(bool topbottom, bool inundoredo); // return true if selection was successfully flipped bool Rotate(bool clockwise, bool inundoredo); // return true if selection was successfully rotated private: bool SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r); // remember live cells outside the selection void EmptyUniverse(); // kill all cells by creating a new, empty universe void AddRun(int state, int multistate, unsigned int &run, unsigned int &linelen, char* &chptr); void AddEOL(char* &chptr); // these routines are used by CopyToClipboard to create RLE data bool SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright); // compare same rectangle in the given universes and remember the differences // in cell states; return false only if user aborts lengthy comparison bool FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int top, int left, int bottom, int right); // called by Flip to flip given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy flip bool RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright); // called by Rotate to rotate given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy rotation bool RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo); // called by Rotate when the selection encloses the entire pattern; // return false only if user aborts lengthy rotation bigint seltop, selleft, selbottom, selright; // currently we only support a single rectangular selection // which is represented by these edges; eventually we might // support arbitrarily complex selection shapes by maintaining // a list or dynamic array of non-overlapping rectangles bool exists; // does the selection exist? }; #endif golly-3.3-src/gui-common/layer.cpp0000644000175000017500000021466113441044674014126 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "util.h" // for linereader #include "utils.h" // for gRect, Warning, etc #include "prefs.h" // for initrule, swapcolors, userrules, rulesdir, etc #include "algos.h" // for algo_type, initalgo, algoinfo, CreateNewUniverse, etc #include "control.h" // for generating #include "select.h" // for Selection #include "file.h" // for SetPatternTitle #include "view.h" // for OutsideLimits, CopyRect #include "undo.h" // for UndoRedo #include "layer.h" #include // for std::map #include // for std::replace // ----------------------------------------------------------------------------- bool inscript = false; // move to script.cpp if we ever support scripting!!! int numlayers = 0; // number of existing layers int numclones = 0; // number of cloned layers int currindex = -1; // index of current layer Layer* currlayer = NULL; // pointer to current layer Layer* layer[MAX_LAYERS]; // array of layers bool cloneavail[MAX_LAYERS]; // for setting unique cloneid bool cloning = false; // adding a cloned layer? bool duplicating = false; // adding a duplicated layer? algo_type oldalgo; // algorithm in old layer std::string oldrule; // rule in old layer int oldmag; // scale in old layer bigint oldx; // X position in old layer bigint oldy; // Y position in old layer TouchModes oldmode; // touch mode in old layer // ----------------------------------------------------------------------------- void CalculateTileRects(int bigwd, int bight) { // set tilerect in each layer gRect r; bool portrait = (bigwd <= bight); int rows, cols; // try to avoid the aspect ratio of each tile becoming too large switch (numlayers) { case 4: rows = 2; cols = 2; break; case 9: rows = 3; cols = 3; break; case 3: case 5: case 7: rows = portrait ? numlayers / 2 + 1 : 2; cols = portrait ? 2 : numlayers / 2 + 1; break; case 6: case 8: case 10: rows = portrait ? numlayers / 2 : 2; cols = portrait ? 2 : numlayers / 2; break; default: // numlayers == 2 or > 10 rows = portrait ? numlayers : 1; cols = portrait ? 1 : numlayers; break; } int tilewd = bigwd / cols; int tileht = bight / rows; if ( float(tilewd) > float(tileht) * 2.5 ) { rows = 1; cols = numlayers; tileht = bight; tilewd = bigwd / numlayers; } else if ( float(tileht) > float(tilewd) * 2.5 ) { cols = 1; rows = numlayers; tilewd = bigwd; tileht = bight / numlayers; } for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { r.x = j * tilewd; r.y = i * tileht; r.width = tilewd; r.height = tileht; if (i == rows - 1) { // may need to increase height of bottom-edge tile r.height += bight - (rows * tileht); } if (j == cols - 1) { // may need to increase width of right-edge tile r.width += bigwd - (cols * tilewd); } int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width += r.width; } else { layer[index]->tilerect = r; } } } if (tileborder > 0) { // make tilerects smaller to allow for equal-width tile borders for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width -= tileborder; } else { layer[index]->tilerect.x += tileborder; layer[index]->tilerect.y += tileborder; layer[index]->tilerect.width -= tileborder; layer[index]->tilerect.height -= tileborder; if (j == cols - 1) layer[index]->tilerect.width -= tileborder; if (i == rows - 1) layer[index]->tilerect.height -= tileborder; } } } } } // ----------------------------------------------------------------------------- void ResizeTiles(int bigwd, int bight) { // set tilerect for each layer so they tile bigview's client area CalculateTileRects(bigwd, bight); /*!!! // set size of each tile window for ( int i = 0; i < numlayers; i++ ) layer[i]->tilewin->SetSize( layer[i]->tilerect ); // set viewport size for each tile; this is currently the same as the // tilerect size because tile windows are created with wxNO_BORDER for ( int i = 0; i < numlayers; i++ ) { int wd, ht; layer[i]->tilewin->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; layer[i]->view->resize(wd, ht); } */ } // ----------------------------------------------------------------------------- void ResizeLayers(int wd, int ht) { // this is called whenever the size of the bigview window changes; // wd and ht are the dimensions of bigview's client area if (tilelayers && numlayers > 1) { ResizeTiles(wd, ht); } else { // resize viewport in each layer to bigview's client area for (int i = 0; i < numlayers; i++) layer[i]->view->resize(wd, ht); } } // ----------------------------------------------------------------------------- /*!!! void CreateTiles() { // create tile windows for ( int i = 0; i < numlayers; i++ ) { layer[i]->tilewin = new PatternView(bigview, // correct size will be set below by ResizeTiles 0, 0, 0, 0, // we draw our own tile borders wxNO_BORDER | // needed for wxGTK wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS); if (layer[i]->tilewin == NULL) Fatal(_("Failed to create tile window!")); // set tileindex >= 0; this must always match the layer index, so we'll need to // destroy and recreate all tiles whenever a tile is added, deleted or moved layer[i]->tilewin->tileindex = i; #if wxUSE_DRAG_AND_DROP // let user drop file onto any tile (but file will be loaded into current tile) layer[i]->tilewin->SetDropTarget(mainptr->NewDropTarget()); #endif } // init tilerects, tile window sizes and their viewport sizes int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; ResizeTiles(wd, ht); // change viewptr to tile window for current layer viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void DestroyTiles() { // reset viewptr to main viewport window viewptr = bigview; if (mainptr->IsActive()) viewptr->SetFocus(); // destroy all tile windows for ( int i = 0; i < numlayers; i++ ) delete layer[i]->tilewin; // resize viewport in each layer to bigview's client area int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; for ( int i = 0; i < numlayers; i++ ) layer[i]->view->resize(wd, ht); } !!!*/ // ----------------------------------------------------------------------------- void SyncClones() { if (numclones == 0) return; if (currlayer->cloneid > 0) { // make sure clone algo and most other settings are synchronized for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // universe might have been re-created, or algorithm changed cloneptr->algo = currlayer->algo; cloneptr->algtype = currlayer->algtype; cloneptr->rule = currlayer->rule; // no need to sync undo/redo history // cloneptr->undoredo = currlayer->undoredo; // along with view, don't sync these settings // cloneptr->autofit = currlayer->autofit; // cloneptr->hyperspeed = currlayer->hyperspeed; // cloneptr->showhashinfo = currlayer->showhashinfo; // cloneptr->drawingstate = currlayer->drawingstate; // cloneptr->touchmode = currlayer->touchmode; // cloneptr->originx = currlayer->originx; // cloneptr->originy = currlayer->originy; // cloneptr->currname = currlayer->currname; // sync various flags cloneptr->dirty = currlayer->dirty; cloneptr->savedirty = currlayer->savedirty; cloneptr->stayclean = currlayer->stayclean; // sync step size cloneptr->currbase = currlayer->currbase; cloneptr->currexpo = currlayer->currexpo; // sync selection info cloneptr->currsel = currlayer->currsel; cloneptr->savesel = currlayer->savesel; // sync the stuff needed to reset pattern cloneptr->startalgo = currlayer->startalgo; cloneptr->savestart = currlayer->savestart; cloneptr->startdirty = currlayer->startdirty; cloneptr->startrule = currlayer->startrule; cloneptr->startgen = currlayer->startgen; cloneptr->currfile = currlayer->currfile; cloneptr->startsel = currlayer->startsel; // clone can have different starting name, pos, scale, step // cloneptr->startname = currlayer->startname; // cloneptr->startx = currlayer->startx; // cloneptr->starty = currlayer->starty; // cloneptr->startmag = currlayer->startmag; // cloneptr->startbase = currlayer->startbase; // cloneptr->startexpo = currlayer->startexpo; // sync timeline settings cloneptr->currframe = currlayer->currframe; cloneptr->autoplay = currlayer->autoplay; cloneptr->tlspeed = currlayer->tlspeed; } } } } // ----------------------------------------------------------------------------- void SaveLayerSettings() { // set oldalgo and oldrule for use in CurrentLayerChanged oldalgo = currlayer->algtype; oldrule = currlayer->algo->getrule(); // we're about to change layer so remember current rule // in case we switch back to this layer currlayer->rule = oldrule; // synchronize clone info (do AFTER setting currlayer->rule) SyncClones(); if (syncviews) { // save scale and location for use in CurrentLayerChanged oldmag = currlayer->view->getmag(); oldx = currlayer->view->x; oldy = currlayer->view->y; } if (syncmodes) { // save touch mode for use in CurrentLayerChanged oldmode = currlayer->touchmode; } } // ----------------------------------------------------------------------------- bool RestoreRule(const char* rule) { const char* err = currlayer->algo->setrule(rule); if (err) { // this can happen if a .rule file was deleted // or it was edited and some sort of error introduced, so best to // use algo's default rule (which should never fail) currlayer->algo->setrule( currlayer->algo->DefaultRule() ); std::string msg = "The rule \""; msg += rule; msg += "\" is no longer valid!\nUsing the default rule instead."; Warning(msg.c_str()); return false; } return true; } // ----------------------------------------------------------------------------- /*!!! void CurrentLayerChanged() { // currlayer has changed since SaveLayerSettings was called; // update rule if the new currlayer uses a different algorithm or rule if ( currlayer->algtype != oldalgo || !currlayer->rule.IsSameAs(oldrule,false) ) { RestoreRule(currlayer->rule); } if (syncviews) currlayer->view->setpositionmag(oldx, oldy, oldmag); if (syncmodes) currlayer->touchmode = oldmode; // select current layer button (also deselects old button) layerbarptr->SelectButton(currindex, true); if (tilelayers && numlayers > 1) { // switch to new tile viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } if (allowundo) { // update Undo/Redo items so they show the correct action currlayer->undoredo->UpdateUndoRedoItems(); } else { // undo/redo is disabled so clear history; // this also removes action from Undo/Redo items currlayer->undoredo->ClearUndoRedo(); } mainptr->SetStepExponent(currlayer->currexpo); // SetStepExponent calls SetGenIncrement mainptr->SetPatternTitle(currlayer->currname); mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } !!!*/ // ----------------------------------------------------------------------------- static gBitmapPtr* CopyIcons(gBitmapPtr* srcicons, int maxstate) { gBitmapPtr* iconptr = (gBitmapPtr*) malloc(256 * sizeof(gBitmapPtr)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i <= maxstate; i++) { if (srcicons && srcicons[i]) { gBitmapPtr icon = (gBitmapPtr) malloc(sizeof(gBitmap)); if (icon) { icon->wd = srcicons[i]->wd; icon->ht = srcicons[i]->ht; if (srcicons[i]->pxldata == NULL) { icon->pxldata = NULL; } else { int iconbytes = icon->wd * icon->ht * 4; icon->pxldata = (unsigned char*) malloc(iconbytes); if (icon->pxldata) { memcpy(icon->pxldata, srcicons[i]->pxldata, iconbytes); } } } iconptr[i] = icon; } } } return iconptr; } // ----------------------------------------------------------------------------- static unsigned char* CreateIconAtlas(gBitmapPtr* srcicons, int iconsize) { bool multicolor = currlayer->multicoloricons; unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; if (swapcolors) { deadr = 255 - deadr; deadg = 255 - deadg; deadb = 255 - deadb; } // allocate enough memory for texture atlas to store RGBA pixels for a row of icons // (note that we use calloc so all alpha bytes are initially 0) int rowbytes = currlayer->numicons * iconsize * 4; unsigned char* atlasptr = (unsigned char*) calloc(rowbytes * iconsize, 1); if (atlasptr) { for (int state = 1; state <= currlayer->numicons; state++) { if (srcicons && srcicons[state]) { int wd = srcicons[state]->wd; // should be iconsize - 1 int ht = srcicons[state]->ht; // ditto unsigned char* icondata = srcicons[state]->pxldata; if (icondata) { unsigned char liver = currlayer->cellr[state]; unsigned char liveg = currlayer->cellg[state]; unsigned char liveb = currlayer->cellb[state]; if (swapcolors) { liver = 255 - liver; liveg = 255 - liveg; liveb = 255 - liveb; } // start at top left byte of icon int tpos = (state-1) * iconsize * 4; int ipos = 0; for (int row = 0; row < ht; row++) { int rowstart = tpos; for (int col = 0; col < wd; col++) { unsigned char r = icondata[ipos]; unsigned char g = icondata[ipos+1]; unsigned char b = icondata[ipos+2]; if (r || g || b) { // non-black pixel if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { atlasptr[tpos] = 255 - r; atlasptr[tpos+1] = 255 - g; atlasptr[tpos+2] = 255 - b; } else { atlasptr[tpos] = r; atlasptr[tpos+1] = g; atlasptr[tpos+2] = b; } } else { // grayscale icon (r = g = b) if (r == 255) { // replace white pixel with live cell color atlasptr[tpos] = liver; atlasptr[tpos+1] = liveg; atlasptr[tpos+2] = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)r / 255.0; atlasptr[tpos] = (int)(deadr + frac * (liver - deadr) + 0.5); atlasptr[tpos+1] = (int)(deadg + frac * (liveg - deadg) + 0.5); atlasptr[tpos+2] = (int)(deadb + frac * (liveb - deadb) + 0.5); } } atlasptr[tpos+3] = 255; // alpha channel is opaque } // move to next pixel tpos += 4; ipos += 4; } // move to next row tpos = rowstart + rowbytes; } } } } } return atlasptr; } // ----------------------------------------------------------------------------- Layer* CreateTemporaryLayer() { Layer* templayer = new Layer(); if (templayer == NULL) Warning("Failed to create temporary layer!"); return templayer; } // ----------------------------------------------------------------------------- void AddLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in AddLayer!"); if (numlayers == 0) { // creating the very first layer currindex = 0; } else { //!!! if (tilelayers && numlayers > 1) DestroyTiles(); SaveLayerSettings(); // insert new layer after currindex currindex++; if (currindex < numlayers) { // shift right one or more layers for (int i = numlayers; i > currindex; i--) layer[i] = layer[i-1]; } } Layer* oldlayer = NULL; if (cloning || duplicating) oldlayer = currlayer; currlayer = new Layer(); if (currlayer == NULL) Fatal("Failed to create new layer!"); layer[currindex] = currlayer; if (cloning || duplicating) { // copy old layer's colors to new layer currlayer->fromrgb = oldlayer->fromrgb; currlayer->torgb = oldlayer->torgb; currlayer->multicoloricons = oldlayer->multicoloricons; currlayer->numicons = oldlayer->numicons; for (int n = 0; n <= currlayer->numicons; n++) { currlayer->cellr[n] = oldlayer->cellr[n]; currlayer->cellg[n] = oldlayer->cellg[n]; currlayer->cellb[n] = oldlayer->cellb[n]; } if (cloning) { // use same icon pointers currlayer->icons7x7 = oldlayer->icons7x7; currlayer->icons15x15 = oldlayer->icons15x15; currlayer->icons31x31 = oldlayer->icons31x31; // use same atlas currlayer->atlas7x7 = oldlayer->atlas7x7; currlayer->atlas15x15 = oldlayer->atlas15x15; currlayer->atlas31x31 = oldlayer->atlas31x31; } else { // duplicate icons from old layer int maxstate = currlayer->algo->NumCellStates() - 1; currlayer->icons7x7 = CopyIcons(oldlayer->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(oldlayer->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(oldlayer->icons31x31, maxstate); // create icon texture atlases currlayer->atlas7x7 = CreateIconAtlas(oldlayer->icons7x7, 8); currlayer->atlas15x15 = CreateIconAtlas(oldlayer->icons15x15, 16); currlayer->atlas31x31 = CreateIconAtlas(oldlayer->icons31x31, 32); } } else { // set new layer's colors+icons to default colors+icons for current algo+rule UpdateLayerColors(); } numlayers++; if (numlayers > 1) { //!!! if (tilelayers && numlayers > 1) CreateTiles(); //!!! CurrentLayerChanged(); } } // ----------------------------------------------------------------------------- void CloneLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in CloneLayer!"); cloning = true; AddLayer(); cloning = false; } // ----------------------------------------------------------------------------- void DuplicateLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in DuplicateLayer!"); duplicating = true; AddLayer(); duplicating = false; } // ----------------------------------------------------------------------------- /*!!! void DeleteLayer() { if (numlayers <= 1) return; if (generating) Warning("Bug detected in DeleteLayer!"); // note that we don't need to ask to delete a clone if (currlayer->dirty && currlayer->cloneid == 0 && asktosave && !SaveCurrentLayer()) return; // numlayers > 1 if (tilelayers) DestroyTiles(); SaveLayerSettings(); delete currlayer; numlayers--; if (currindex < numlayers) { // shift left one or more layers for (int i = currindex; i < numlayers; i++) layer[i] = layer[i+1]; } if (currindex > 0) currindex--; currlayer = layer[currindex]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); layerbarptr->ResizeLayerButtons(); // remove item from end of Layer menu mainptr->RemoveLayerItem(); if (tilelayers && numlayers > 1) CreateTiles(); CurrentLayerChanged(); } // ----------------------------------------------------------------------------- void SetLayer(int index) { if (currindex == index) return; if (index < 0 || index >= numlayers) return; SaveLayerSettings(); currindex = index; currlayer = layer[currindex]; CurrentLayerChanged(); } // ----------------------------------------------------------------------------- bool CanSwitchLayer(int WXUNUSED(index)) { if (inscript) { // user can only switch layers if script has set the appropriate option return canswitch; } else { // user can switch to any layer return true; } } // ----------------------------------------------------------------------------- void SwitchToClickedTile(int index) { if (inscript && !CanSwitchLayer(index)) { Warning("You cannot switch to another layer while this script is running."); return; } // switch current layer to clicked tile SetLayer(index); if (inscript) { // update window title, viewport and status bar inscript = false; mainptr->SetPatternTitle(wxEmptyString); mainptr->UpdatePatternAndStatus(); inscript = true; } } // ----------------------------------------------------------------------------- void MoveLayer(int fromindex, int toindex) { if (fromindex == toindex) return; if (fromindex < 0 || fromindex >= numlayers) return; if (toindex < 0 || toindex >= numlayers) return; SaveLayerSettings(); if (fromindex > toindex) { Layer* savelayer = layer[fromindex]; for (int i = fromindex; i > toindex; i--) layer[i] = layer[i - 1]; layer[toindex] = savelayer; } else { // fromindex < toindex Layer* savelayer = layer[fromindex]; for (int i = fromindex; i < toindex; i++) layer[i] = layer[i + 1]; layer[toindex] = savelayer; } currindex = toindex; currlayer = layer[currindex]; if (tilelayers && numlayers > 1) { DestroyTiles(); CreateTiles(); } CurrentLayerChanged(); } // ----------------------------------------------------------------------------- void MoveLayerDialog() { if (numlayers <= 1) return; wxString msg = _("Move the current layer to a new position:"); if (currindex > 0) { msg += _("\n(enter 0 to make it the first layer)"); } int newindex; if ( GetInteger(_("Move Layer"), msg, currindex, 0, numlayers - 1, &newindex) ) { MoveLayer(currindex, newindex); } } // ----------------------------------------------------------------------------- void NameLayerDialog() { wxString oldname = currlayer->currname; wxString newname; if ( GetString("Name Layer", "Enter a new name for the current layer:", oldname, newname) && !newname.IsEmpty() && oldname != newname ) { // inscript is false so no need to call SavePendingChanges // if (allowundo) SavePendingChanges(); // show new name in main window's title bar; // also sets currlayer->currname and updates menu item mainptr->SetPatternTitle(newname); if (allowundo) { // note that currfile and savestart/dirty flags don't change here currlayer->undoredo->RememberNameChange(oldname, currlayer->currfile, currlayer->savestart, currlayer->dirty); } } } !!!*/ // ----------------------------------------------------------------------------- void DeleteOtherLayers() { if (inscript || numlayers <= 1) return; /*!!! if (asktosave) { // keep track of which unique clones have been seen; // we add 1 below to allow for cloneseen[0] (always false) const int maxseen = MAX_LAYERS/2 + 1; bool cloneseen[maxseen]; for (int i = 0; i < maxseen; i++) cloneseen[i] = false; // for each dirty layer, except current layer and all of its clones, // ask user if they want to save changes int cid = layer[currindex]->cloneid; if (cid > 0) cloneseen[cid] = true; int oldindex = currindex; for (int i = 0; i < numlayers; i++) { // only ask once for each unique clone (cloneid == 0 for non-clone) cid = layer[i]->cloneid; if (i != oldindex && !cloneseen[cid]) { if (cid > 0) cloneseen[cid] = true; if (layer[i]->dirty) { // temporarily turn off generating flag for SetLayer bool oldgen = mainptr->generating; mainptr->generating = false; SetLayer(i); if (!SaveCurrentLayer()) { // user hit Cancel so restore current layer and generating flag SetLayer(oldindex); mainptr->generating = oldgen; mainptr->UpdateUserInterface(mainptr->IsActive()); return; } SetLayer(oldindex); mainptr->generating = oldgen; } } } } // numlayers > 1 if (tilelayers) DestroyTiles(); SyncClones(); // delete all layers except current layer; // we need to do this carefully because ~Layer() requires numlayers // and the layer array to be correct when deleting a cloned layer int i = numlayers; while (numlayers > 1) { i--; if (i != currindex) { delete layer[i]; // ~Layer() is called numlayers--; // may need to shift the current layer left one place if (i < numlayers) layer[i] = layer[i+1]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); // remove item from end of Layer menu mainptr->RemoveLayerItem(); } } layerbarptr->ResizeLayerButtons(); currindex = 0; // currlayer doesn't change // update the only layer item mainptr->UpdateLayerItem(0); // update window title (may need to remove "=" prefix) mainptr->SetPatternTitle(wxEmptyString); // select LAYER_0 button (also deselects old button) layerbarptr->SelectButton(LAYER_0, true); mainptr->UpdateMenuItems(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); */ } // ----------------------------------------------------------------------------- void MarkLayerDirty() { // need to save starting pattern currlayer->savestart = true; // if script has reset dirty flag then don't change it; this makes sense // for scripts that call new() and then construct a pattern if (currlayer->stayclean) return; if (!currlayer->dirty) { currlayer->dirty = true; // pass in currname so UpdateLayerItem(currindex) gets called SetPatternTitle(currlayer->currname.c_str()); if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // set dirty flag and display asterisk in layer item cloneptr->dirty = true; //!!! UpdateLayerItem(i); } } } } } // ----------------------------------------------------------------------------- void MarkLayerClean(const char* title) { currlayer->dirty = false; // if script is resetting dirty flag -- eg. via new() -- then don't allow // dirty flag to be set true for the remainder of the script; this is // nicer for scripts that construct a pattern (ie. running such a script // is equivalent to loading a pattern file) if (inscript) currlayer->stayclean = true; if (title[0] == 0) { // pass in currname so UpdateLayerItem(currindex) gets called SetPatternTitle(currlayer->currname.c_str()); } else { // set currlayer->currname to title and call UpdateLayerItem(currindex) SetPatternTitle(title); } if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // reset dirty flag cloneptr->dirty = false; if (inscript) cloneptr->stayclean = true; // always allow clones to have different names // cloneptr->currname = currlayer->currname; // remove asterisk from layer name //!!! UpdateLayerItem(i); } } } } // ----------------------------------------------------------------------------- /*!!! void ToggleSyncViews() { syncviews = !syncviews; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleSyncModes() { syncmodes = !syncmodes; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleStackLayers() { stacklayers = !stacklayers; if (stacklayers && tilelayers) { tilelayers = false; layerbarptr->SelectButton(TILE_LAYERS, false); if (numlayers > 1) DestroyTiles(); } layerbarptr->SelectButton(STACK_LAYERS, stacklayers); mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void ToggleTileLayers() { tilelayers = !tilelayers; if (tilelayers && stacklayers) { stacklayers = false; layerbarptr->SelectButton(STACK_LAYERS, false); } layerbarptr->SelectButton(TILE_LAYERS, tilelayers); if (tilelayers) { if (numlayers > 1) CreateTiles(); } else { if (numlayers > 1) DestroyTiles(); } mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } !!!*/ // ----------------------------------------------------------------------------- static FILE* FindRuleFile(const std::string& rulename) { const std::string extn = ".rule"; std::string path; // first look for rulename.rule in userrules path = userrules + rulename; path += extn; FILE* f = fopen(path.c_str(), "r"); if (f) return f; // now look for rulename.rule in rulesdir path = rulesdir + rulename; path += extn; return fopen(path.c_str(), "r"); } // ----------------------------------------------------------------------------- static void CheckRuleHeader(char* linebuf, const std::string& rulename) { // check that 1st line of rulename.rule file contains "@RULE rulename" // where rulename must match the file name exactly (to avoid problems on // case-sensitive file systems) if (strncmp(linebuf, "@RULE ", 6) != 0) { std::string msg = "The first line in "; msg += rulename; msg += ".rule does not start with @RULE."; Warning(msg.c_str()); } else if (strcmp(linebuf+6, rulename.c_str()) != 0) { std::string msg = "The rule name on the first line in "; msg += rulename; msg += ".rule does not match the specified rule: "; msg += rulename; Warning(msg.c_str()); } } // ----------------------------------------------------------------------------- static void ParseColors(linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @COLORS section in currently open .rule file int state, r, g, b, r1, g1, b1, r2, g2, b2; int maxstate = currlayer->algo->NumCellStates() - 1; while (reader.fgets(linebuf, MAXLINELEN) != 0) { *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == 0) { // skip comment or empty line } else if (sscanf(linebuf, "%d%d%d%d%d%d", &r1, &g1, &b1, &r2, &g2, &b2) == 6) { // assume line is like this: // 255 0 0 0 0 255 use a gradient from red to blue SetColor(currlayer->fromrgb, r1, g1, b1); SetColor(currlayer->torgb, r2, g2, b2); CreateColorGradient(); } else if (sscanf(linebuf, "%d%d%d%d", &state, &r, &g, &b) == 4) { // assume line is like this: // 1 0 128 255 state 1 is light blue if (state >= 0 && state <= maxstate) { currlayer->cellr[state] = r; currlayer->cellg[state] = g; currlayer->cellb[state] = b; } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; return; } // ignore unexpected syntax (better for upward compatibility) } *eof = true; } // ----------------------------------------------------------------------------- static void DeleteXPMData(char** xpmdata, int numstrings) { if (xpmdata) { for (int i = 0; i < numstrings; i++) if (xpmdata[i]) free(xpmdata[i]); free(xpmdata); } } // ----------------------------------------------------------------------------- static void CopyBuiltinIcons(gBitmapPtr* i7x7, gBitmapPtr* i15x15, gBitmapPtr* i31x31) { int maxstate = currlayer->algo->NumCellStates() - 1; if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons7x7 = CopyIcons(i7x7, maxstate); currlayer->icons15x15 = CopyIcons(i15x15, maxstate); currlayer->icons31x31 = CopyIcons(i31x31, maxstate); } // ----------------------------------------------------------------------------- static void CreateIcons(const char** xpmdata, int size) { int maxstates = currlayer->algo->NumCellStates(); // we only need to call FreeIconBitmaps if .rule file has duplicate XPM data // (unlikely but best to play it safe) if (size == 7) { if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); currlayer->icons7x7 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 15) { if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); currlayer->icons15x15 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 31) { if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons31x31 = CreateIconBitmaps(xpmdata, maxstates); } } // ----------------------------------------------------------------------------- static void ParseIcons(const std::string& rulename, linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @ICONS section in currently open .rule file char** xpmdata = NULL; int xpmstarted = 0, xpmstrings = 0, maxstrings = 0; int wd = 0, ht = 0, numcolors = 0, chars_per_pixel = 0; std::map colormap; while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) { *eof = true; break; } *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == '/' || linebuf[0] == 0) { // skip comment or empty line } else if (linebuf[0] == '"') { if (xpmstarted) { // we have a "..." string containing XPM data if (xpmstrings == 0) { if (sscanf(linebuf, "\"%d%d%d%d\"", &wd, &ht, &numcolors, &chars_per_pixel) == 4 && wd > 0 && ht > 0 && numcolors > 0 && ht % wd == 0 && chars_per_pixel > 0 && chars_per_pixel < 3) { if (wd != 7 && wd != 15 && wd != 31) { // this version of Golly doesn't support the supplied icon size // so silently ignore the rest of this XPM data xpmstarted = 0; continue; } maxstrings = 1 + numcolors + ht; // create and initialize xpmdata xpmdata = (char**) malloc(maxstrings * sizeof(char*)); if (xpmdata) { for (int i = 0; i < maxstrings; i++) xpmdata[i] = NULL; } else { Warning("Failed to allocate memory for XPM icon data!"); *eof = true; return; } } else { char s[128]; sprintf(s, "The XPM header string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule is incorrect"; if (wd > 0 && ht > 0 && ht % wd != 0) msg += " (height must be a multiple of width)."; else if (chars_per_pixel < 1 || chars_per_pixel > 2) msg += " (chars_per_pixel must be 1 or 2)."; else msg += " (4 positive integers are required)."; Warning(msg.c_str()); *eof = true; return; } } // copy data inside "..." to next string in xpmdata int len = (int)strlen(linebuf); while (linebuf[len] != '"') len--; len--; if (xpmstrings > 0 && xpmstrings <= numcolors) { // build colormap so we can validate chars in pixel data std::string pixel; char ch1, ch2, ch3; bool badline = false; if (chars_per_pixel == 1) { badline = sscanf(linebuf+1, "%c%c", &ch1, &ch2) != 2 || ch2 != ' '; pixel += ch1; } else { badline = sscanf(linebuf+1, "%c%c%c", &ch1, &ch2, &ch3) != 3 || ch3 != ' '; pixel += ch1; pixel += ch2; } if (badline) { DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM data string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule is incorrect."; Warning(msg.c_str()); *eof = true; return; } colormap[pixel] = xpmstrings; } else if (xpmstrings > numcolors) { // check length of string containing pixel data if (len != wd * chars_per_pixel) { DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM data string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule has the wrong length."; Warning(msg.c_str()); *eof = true; return; } // now check that chars in pixel data are valid (ie. in colormap) for (int i = 1; i <= len; i += chars_per_pixel) { std::string pixel; pixel += linebuf[i]; if (chars_per_pixel > 1) pixel += linebuf[i+1]; if (colormap.find(pixel) == colormap.end()) { DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM data string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule has an unknown pixel: "; msg += pixel; Warning(msg.c_str()); *eof = true; return; } } } char* str = (char*) malloc(len+1); if (str) { strncpy(str, linebuf+1, len); str[len] = 0; xpmdata[xpmstrings] = str; } else { DeleteXPMData(xpmdata, maxstrings); Warning("Failed to allocate memory for XPM string!"); *eof = true; return; } xpmstrings++; if (xpmstrings == maxstrings) { // we've got all the data for this icon size CreateIcons((const char**)xpmdata, wd); DeleteXPMData(xpmdata, maxstrings); xpmdata = NULL; xpmstarted = 0; } } } else if (strcmp(linebuf, "XPM") == 0) { // start parsing XPM data on following lines if (xpmstarted) break; // handle error below xpmstarted = *linenum; xpmstrings = 0; } else if (strcmp(linebuf, "circles") == 0) { // use circular icons CopyBuiltinIcons(circles7x7, circles15x15, circles31x31); } else if (strcmp(linebuf, "diamonds") == 0) { // use diamond-shaped icons CopyBuiltinIcons(diamonds7x7, diamonds15x15, diamonds31x31); } else if (strcmp(linebuf, "hexagons") == 0) { // use hexagonal icons CopyBuiltinIcons(hexagons7x7, hexagons15x15, hexagons31x31); } else if (strcmp(linebuf, "triangles") == 0) { // use triangular icons if (currlayer->algo->NumCellStates() != 4) { char s[128]; sprintf(s, "The triangular icons specified on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule can only be used with a 4-state rule."; Warning(msg.c_str()); // don't return } else { CopyBuiltinIcons(triangles7x7, triangles15x15, triangles31x31); } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; break; } // ignore unexpected syntax (better for upward compatibility) } if (xpmstarted) { // XPM data was incomplete DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM icon data starting on line %d in ", xpmstarted); std::string msg(s); msg += rulename; msg += ".rule does not have enough strings."; Warning(msg.c_str()); *eof = true; return; } // create scaled bitmaps if size(s) not supplied if (!currlayer->icons7x7) { if (currlayer->icons15x15) { // scale down 15x15 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons15x15, 7); } else if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons31x31, 7); } } if (!currlayer->icons15x15) { if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons31x31, 15); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons7x7, 15); } } if (!currlayer->icons31x31) { if (currlayer->icons15x15) { // scale up 15x15 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons15x15, 31); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons7x7, 31); } } } // ----------------------------------------------------------------------------- static void LoadRuleInfo(FILE* rulefile, const std::string& rulename, bool* loadedcolors, bool* loadedicons) { // load any color/icon info from currently open .rule file const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; int linenum = 0; bool eof = false; bool skipget = false; // the linereader class handles all line endings (CR, CR+LF, LF) linereader reader(rulefile); while (true) { if (skipget) { // ParseColors/ParseIcons has stopped at next section // (ie. linebuf contains @...) so skip fgets call skipget = false; } else { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; linenum++; if (linenum == 1) CheckRuleHeader(linebuf, rulename); } // look for @COLORS or @ICONS section if (strcmp(linebuf, "@COLORS") == 0 && !*loadedcolors) { *loadedcolors = true; ParseColors(reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } else if (strcmp(linebuf, "@ICONS") == 0 && !*loadedicons) { *loadedicons = true; ParseIcons(rulename, reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } } reader.close(); // closes rulefile } // ----------------------------------------------------------------------------- static void DeleteIcons(Layer* layer) { // delete given layer's existing icons if (layer->icons7x7) { FreeIconBitmaps(layer->icons7x7); layer->icons7x7 = NULL; } if (layer->icons15x15) { FreeIconBitmaps(layer->icons15x15); layer->icons15x15 = NULL; } if (layer->icons31x31) { FreeIconBitmaps(layer->icons31x31); layer->icons31x31 = NULL; } // also delete icon texture atlases if (layer->atlas7x7) { free(layer->atlas7x7); layer->atlas7x7 = NULL; } if (layer->atlas15x15) { free(layer->atlas15x15); layer->atlas15x15 = NULL; } if (layer->atlas31x31) { free(layer->atlas31x31); layer->atlas31x31 = NULL; } } // ----------------------------------------------------------------------------- static void UseDefaultIcons(int maxstate) { // icons weren't specified so use default icons if (currlayer->algo->getgridtype() == lifealgo::HEX_GRID) { // use hexagonal icons currlayer->icons7x7 = CopyIcons(hexagons7x7, maxstate); currlayer->icons15x15 = CopyIcons(hexagons15x15, maxstate); currlayer->icons31x31 = CopyIcons(hexagons31x31, maxstate); } else if (currlayer->algo->getgridtype() == lifealgo::VN_GRID) { // use diamond-shaped icons for 4-neighbor von Neumann neighborhood currlayer->icons7x7 = CopyIcons(diamonds7x7, maxstate); currlayer->icons15x15 = CopyIcons(diamonds15x15, maxstate); currlayer->icons31x31 = CopyIcons(diamonds31x31, maxstate); } else { // otherwise use default icons from current algo AlgoData* ad = algoinfo[currlayer->algtype]; currlayer->icons7x7 = CopyIcons(ad->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(ad->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(ad->icons31x31, maxstate); } } // ----------------------------------------------------------------------------- void CreateColorGradient() { int maxstate = currlayer->algo->NumCellStates() - 1; unsigned char r1 = currlayer->fromrgb.r; unsigned char g1 = currlayer->fromrgb.g; unsigned char b1 = currlayer->fromrgb.b; unsigned char r2 = currlayer->torgb.r; unsigned char g2 = currlayer->torgb.g; unsigned char b2 = currlayer->torgb.b; // set cell colors for states 1..maxstate using a color gradient // starting with r1,g1,b1 and ending with r2,g2,b2 currlayer->cellr[1] = r1; currlayer->cellg[1] = g1; currlayer->cellb[1] = b1; if (maxstate > 2) { int N = maxstate - 1; double rfrac = (double)(r2 - r1) / (double)N; double gfrac = (double)(g2 - g1) / (double)N; double bfrac = (double)(b2 - b1) / (double)N; for (int n = 1; n < N; n++) { currlayer->cellr[n+1] = (int)(r1 + n * rfrac + 0.5); currlayer->cellg[n+1] = (int)(g1 + n * gfrac + 0.5); currlayer->cellb[n+1] = (int)(b1 + n * bfrac + 0.5); } } if (maxstate > 1) { currlayer->cellr[maxstate] = r2; currlayer->cellg[maxstate] = g2; currlayer->cellb[maxstate] = b2; } } // ----------------------------------------------------------------------------- void UpdateCurrentColors() { // set current layer's colors and icons according to current algo and rule AlgoData* ad = algoinfo[currlayer->algtype]; int maxstate = currlayer->algo->NumCellStates() - 1; // copy default colors from current algo currlayer->fromrgb = ad->fromrgb; currlayer->torgb = ad->torgb; if (ad->gradient) { CreateColorGradient(); // state 0 is not part of the gradient currlayer->cellr[0] = ad->algor[0]; currlayer->cellg[0] = ad->algog[0]; currlayer->cellb[0] = ad->algob[0]; } else { for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = ad->algor[n]; currlayer->cellg[n] = ad->algog[n]; currlayer->cellb[n] = ad->algob[n]; } } std::string rulename = currlayer->algo->getrule(); // replace any '\' and '/' chars with underscores; // ie. given 12/34/6 we look for 12_34_6.{colors|icons} std::replace(rulename.begin(), rulename.end(), '\\', '_'); std::replace(rulename.begin(), rulename.end(), '/', '_'); // strip off any suffix like ":T100,200" used to specify a bounded grid size_t colonpos = rulename.find(':'); if (colonpos != std::string::npos) rulename = rulename.substr(0, colonpos); // deallocate current layer's old icons DeleteIcons(currlayer); // this flag will change if any icon uses a non-grayscale color currlayer->multicoloricons = false; bool loadedcolors = false; bool loadedicons = false; // look for rulename.rule FILE* rulefile = FindRuleFile(rulename); if (rulefile) { LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); if (!loadedcolors || !loadedicons) { // if rulename has the form foo-* then look for foo-shared.rule // and load its colors and/or icons size_t hyphenpos = rulename.rfind('-'); if (hyphenpos != std::string::npos && rulename.rfind("-shared") == std::string::npos) { rulename = rulename.substr(0, hyphenpos) + "-shared"; rulefile = FindRuleFile(rulename); if (rulefile) LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); } } if (!loadedicons) UseDefaultIcons(maxstate); } else { // rulename.rule wasn't found so use default icons UseDefaultIcons(maxstate); } // use the smallest icons to check if they are multi-color if (currlayer->icons7x7) { for (int n = 1; n <= maxstate; n++) { if (MultiColorImage(currlayer->icons7x7[n])) { currlayer->multicoloricons = true; break; } } } // create icon texture atlases (used for rendering) currlayer->numicons = maxstate; currlayer->atlas7x7 = CreateIconAtlas(currlayer->icons7x7, 8); currlayer->atlas15x15 = CreateIconAtlas(currlayer->icons15x15, 16); currlayer->atlas31x31 = CreateIconAtlas(currlayer->icons31x31, 32); if (swapcolors) { // invert cell colors in current layer for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = 255 - currlayer->cellr[n]; currlayer->cellg[n] = 255 - currlayer->cellg[n]; currlayer->cellb[n] = 255 - currlayer->cellb[n]; } } } // ----------------------------------------------------------------------------- void UpdateCloneColors() { if (currlayer->cloneid > 0) { for (int i = 0; i < numlayers; i++) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->fromrgb = currlayer->fromrgb; cloneptr->torgb = currlayer->torgb; cloneptr->multicoloricons = currlayer->multicoloricons; cloneptr->numicons = currlayer->numicons; for (int n = 0; n <= currlayer->numicons; n++) { cloneptr->cellr[n] = currlayer->cellr[n]; cloneptr->cellg[n] = currlayer->cellg[n]; cloneptr->cellb[n] = currlayer->cellb[n]; } // use same icon pointers cloneptr->icons7x7 = currlayer->icons7x7; cloneptr->icons15x15 = currlayer->icons15x15; cloneptr->icons31x31 = currlayer->icons31x31; // use same atlas cloneptr->atlas7x7 = currlayer->atlas7x7; cloneptr->atlas15x15 = currlayer->atlas15x15; cloneptr->atlas31x31 = currlayer->atlas31x31; } } } } // ----------------------------------------------------------------------------- void UpdateLayerColors() { UpdateCurrentColors(); // above has created icon texture data so don't call UpdateIconColors here // if current layer has clones then update their colors UpdateCloneColors(); } // ----------------------------------------------------------------------------- void UpdateIconColors() { // delete current icon texture atlases if (currlayer->atlas7x7) { free(currlayer->atlas7x7); } if (currlayer->atlas15x15) { free(currlayer->atlas15x15); } if (currlayer->atlas31x31) { free(currlayer->atlas31x31); } // re-create icon texture atlases currlayer->atlas7x7 = CreateIconAtlas(currlayer->icons7x7, 8); currlayer->atlas15x15 = CreateIconAtlas(currlayer->icons15x15, 16); currlayer->atlas31x31 = CreateIconAtlas(currlayer->icons31x31, 32); } // ----------------------------------------------------------------------------- void InvertIconColors(unsigned char* atlasptr, int iconsize, int numicons) { if (atlasptr) { int numbytes = numicons * iconsize * iconsize * 4; int i = 0; while (i < numbytes) { if (atlasptr[i+3] == 0) { // ignore transparent pixel } else { // invert pixel color atlasptr[i] = 255 - atlasptr[i]; atlasptr[i+1] = 255 - atlasptr[i+1]; atlasptr[i+2] = 255 - atlasptr[i+2]; } i += 4; } } } // ----------------------------------------------------------------------------- void InvertCellColors() { bool clone_inverted[MAX_LAYERS] = {false}; // swapcolors has changed so invert cell colors in all layers for (int i = 0; i < numlayers; i++) { Layer* layerptr = layer[i]; // do NOT use layerptr->algo->... here -- it might not be correct // for a non-current layer (but we can use layerptr->algtype) int maxstate = algoinfo[layerptr->algtype]->maxstates - 1; for (int n = 0; n <= maxstate; n++) { layerptr->cellr[n] = 255 - layerptr->cellr[n]; layerptr->cellg[n] = 255 - layerptr->cellg[n]; layerptr->cellb[n] = 255 - layerptr->cellb[n]; } // clones share icon texture data so we must be careful to only invert them once if (layerptr->cloneid == 0 || !clone_inverted[layerptr->cloneid]) { // invert colors in icon texture atlases // (do NOT use maxstate here -- might be > layerptr->numicons) InvertIconColors(layerptr->atlas7x7, 8, layerptr->numicons); InvertIconColors(layerptr->atlas15x15, 16, layerptr->numicons); InvertIconColors(layerptr->atlas31x31, 32, layerptr->numicons); if (layerptr->cloneid > 0) clone_inverted[layerptr->cloneid] = true; } } } // ----------------------------------------------------------------------------- Layer* GetLayer(int index) { if (index < 0 || index >= numlayers) { Warning("Bad index in GetLayer!"); return NULL; } else { return layer[index]; } } // ----------------------------------------------------------------------------- int GetUniqueCloneID() { // find first available index (> 0) to use as cloneid for (int i = 1; i < MAX_LAYERS; i++) { if (cloneavail[i]) { cloneavail[i] = false; return i; } } // bug if we get here Warning("Bug in GetUniqueCloneID!"); return 1; } // ----------------------------------------------------------------------------- Layer::Layer() { if (!cloning) { // use a unique temporary file for saving starting patterns tempstart = CreateTempFileName("golly_start_"); } dirty = false; // user has not modified pattern savedirty = false; // in case script created layer stayclean = inscript; // if true then keep the dirty flag false // for the duration of the script savestart = false; // no need to save starting pattern startgen = 0; // initial starting generation currname = "untitled"; // initial window title currfile.clear(); // no pattern file has been loaded originx = 0; // no X origin offset originy = 0; // no Y origin offset icons7x7 = NULL; // no 7x7 icons icons15x15 = NULL; // no 15x15 icons icons31x31 = NULL; // no 31x31 icons atlas7x7 = NULL; // no texture atlas for 7x7 icons atlas15x15 = NULL; // no texture atlas for 15x15 icons atlas31x31 = NULL; // no texture atlas for 31x31 icons currframe = 0; // first frame in timeline autoplay = 0; // not playing tlspeed = 0; // default speed for autoplay // create viewport; the initial size is not important because it will soon change view = new viewport(100,100); if (view == NULL) Fatal("Failed to create viewport!"); if (numlayers == 0) { // creating very first layer (can't be a clone) cloneid = 0; // initialize cloneavail array (cloneavail[0] is never used) cloneavail[0] = false; for (int i = 1; i < MAX_LAYERS; i++) cloneavail[i] = true; // set some options using initial values stored in prefs file algtype = initalgo; hyperspeed = inithyperspeed; showhashinfo = initshowhashinfo; autofit = initautofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; // create empty universe algo = CreateNewUniverse(algtype); // set rule using initrule stored in prefs file const char* err = algo->setrule(initrule); if (err) { // user might have edited rule in prefs file, or deleted .rule file algo->setrule( algo->DefaultRule() ); } // don't need to remember rule here (SaveLayerSettings will do it) rule.clear(); // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal("Failed to create new undo/redo object!"); touchmode = drawmode; drawingstate = 1; } else { // adding a new layer after currlayer (see AddLayer) // inherit current universe type and other settings algtype = currlayer->algtype; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; autofit = currlayer->autofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; if (cloning) { if (currlayer->cloneid == 0) { // first time this universe is being cloned so need a unique cloneid cloneid = GetUniqueCloneID(); currlayer->cloneid = cloneid; // current layer also becomes a clone numclones += 2; } else { // we're cloning an existing clone cloneid = currlayer->cloneid; numclones++; } // clones share the same universe and undo/redo history algo = currlayer->algo; undoredo = currlayer->undoredo; // clones also share the same timeline currframe = currlayer->currframe; autoplay = currlayer->autoplay; tlspeed = currlayer->tlspeed; // clones use same name for starting file tempstart = currlayer->tempstart; } else { // this layer isn't a clone cloneid = 0; // create empty universe algo = CreateNewUniverse(algtype); // use current rule const char* err = algo->setrule(currlayer->algo->getrule()); if (err) { // .rule file might have been deleted algo->setrule( algo->DefaultRule() ); } // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal("Failed to create new undo/redo object!"); } // inherit current rule rule = currlayer->algo->getrule(); // inherit current viewport's size, scale and location view->resize( currlayer->view->getwidth(), currlayer->view->getheight() ); view->setpositionmag( currlayer->view->x, currlayer->view->y, currlayer->view->getmag() ); // inherit current touch mode and drawing state touchmode = currlayer->touchmode; drawingstate = currlayer->drawingstate; if (cloning || duplicating) { // duplicate all the other current settings currname = currlayer->currname; dirty = currlayer->dirty; savedirty = currlayer->savedirty; stayclean = currlayer->stayclean; currbase = currlayer->currbase; currexpo = currlayer->currexpo; autofit = currlayer->autofit; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; originx = currlayer->originx; originy = currlayer->originy; // duplicate selection info currsel = currlayer->currsel; savesel = currlayer->savesel; // duplicate the stuff needed to reset pattern currfile = currlayer->currfile; savestart = currlayer->savestart; startalgo = currlayer->startalgo; startdirty = currlayer->startdirty; startrule = currlayer->startrule; startx = currlayer->startx; starty = currlayer->starty; startbase = currlayer->startbase; startexpo = currlayer->startexpo; startmag = currlayer->startmag; startgen = currlayer->startgen; startsel = currlayer->startsel; startname = currlayer->startname; if (cloning) { // if clone is created after pattern has been generated // then we don't want a reset to change its name startname = currlayer->currname; } else { startname = currlayer->startname; } } if (duplicating) { // first set same gen count algo->setGeneration( currlayer->algo->getGeneration() ); // duplicate pattern if ( !currlayer->algo->isEmpty() ) { bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { Warning("Pattern is too big to duplicate."); } else { CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, algo, false, "Duplicating layer"); } } // tempstart file must remain unique in duplicate layer if ( FileExists(currlayer->tempstart) ) { if ( !CopyFile(currlayer->tempstart, tempstart) ) { Warning("Could not copy tempstart file!"); } } if (currlayer->currfile == currlayer->tempstart) { currfile = tempstart; } if (allowundo) { // duplicate current undo/redo history in new layer undoredo->DuplicateHistory(currlayer, this); } } } } // ----------------------------------------------------------------------------- Layer::~Layer() { // delete stuff allocated in ctor delete view; if (cloneid > 0) { // this layer is a clone, so count how many layers have the same cloneid int clonecount = 0; for (int i = 0; i < numlayers; i++) { if (layer[i]->cloneid == cloneid) clonecount++; // tell undo/redo which clone is being deleted if (this == layer[i]) undoredo->DeletingClone(i); } if (clonecount > 2) { // only delete this clone numclones--; } else { // first make this cloneid available for the next clone cloneavail[cloneid] = true; // reset the other cloneid to 0 (should only be one such clone) for (int i = 0; i < numlayers; i++) { // careful -- layer[i] might be this layer if (this != layer[i] && layer[i]->cloneid == cloneid) layer[i]->cloneid = 0; } numclones -= 2; } } else { // this layer is not a clone, so delete universe and undo/redo history delete algo; delete undoredo; // delete tempstart file if it exists if (FileExists(tempstart)) RemoveFile(tempstart); // delete any icons DeleteIcons(this); } } golly-3.3-src/gui-common/status.h0000644000175000017500000000220713145740437013772 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _STATUS_H_ #define _STATUS_H_ #include "bigint.h" #include // for std::string // The status bar area consists of 3 lines of text: extern std::string status1; // top line extern std::string status2; // middle line extern std::string status3; // bottom line void UpdateStatusLines(); // set status1 and status2 (SetMessage sets status3) void ClearMessage(); // erase bottom line of status bar void DisplayMessage(const char* s); // display given message on bottom line of status bar void ErrorMessage(const char* s); // beep and display given message on bottom line of status bar void SetMessage(const char* s); // set status3 without displaying it (until next update) int GetCurrentDelay(); // return current delay (in millisecs) char* Stringify(const bigint& b); // convert given number to string suitable for display void CheckMouseLocation(int x, int y); // on devices with a mouse we might need to update the // cursor's current XY cell location, where the given x,y // values are the cursor's viewport coordinates (in pixels) #endif golly-3.3-src/gui-common/layer.h0000644000175000017500000002323713145740437013571 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _LAYER_H_ #define _LAYER_H_ #include "bigint.h" // for bigint class #include "viewport.h" // for viewport class #include "utils.h" // for gColor, gRect #include "algos.h" // for algo_type, gBitmapPtr #include "select.h" // for Selection class class UndoRedo; // export from script.h if we ever support scripting!!! extern bool inscript; enum TouchModes { drawmode, pickmode, selectmode, movemode, zoominmode, zoomoutmode }; // Golly can support multiple layers. Each layer is a separate universe // (unless cloned) with its own algorithm, rule, viewport, pattern title, // selection, undo/redo history, etc. class Layer { public: Layer(); ~Layer(); // if this is a cloned layer then cloneid is > 0 and all the other clones // have the same cloneid int cloneid; lifealgo* algo; // this layer's universe (shared by clones) algo_type algtype; // type of universe (index into algoinfo) bool hyperspeed; // use acceleration while generating? bool showhashinfo; // show hashing info? bool autofit; // auto fit pattern while generating? bool dirty; // user has modified pattern? bool savedirty; // state of dirty flag before drawing/script change bool stayclean; // script has reset dirty flag? int currbase; // current base step int currexpo; // current step exponent int drawingstate; // current drawing state TouchModes touchmode; // current touch mode (drawing, selecting, etc) UndoRedo* undoredo; // undo/redo history (shared by clones) // each layer (cloned or not) has its own viewport for displaying patterns; // note that we use a pointer to the viewport to allow temporary switching viewport* view; // WARNING: this string is used to remember the current rule when // switching to another layer; to determine the current rule at any // time, use currlayer->algo->getrule() std::string rule; Selection currsel; // current selection Selection savesel; // for saving/restoring selection bigint originx; // X origin offset bigint originy; // Y origin offset std::string currfile; // full path of current pattern file std::string currname; // name used for Pattern=... // for saving and restoring starting pattern algo_type startalgo; // starting algorithm bool savestart; // need to save starting pattern? bool startdirty; // starting state of dirty flag std::string startname; // starting currname std::string startrule; // starting rule bigint startgen; // starting generation (>= 0) bigint startx, starty; // starting location int startbase; // starting base step int startexpo; // starting step exponent int startmag; // starting scale Selection startsel; // starting selection // temporary file used to restore starting pattern or to show comments; // each non-cloned layer uses a different temporary file std::string tempstart; // used when tilelayers is true //!!! PatternView* tilewin; // tile window gRect tilerect; // tile window's size and position // color scheme for this layer gColor fromrgb; // start of gradient gColor torgb; // end of gradient unsigned char cellr[256]; // red components for states 0..255 unsigned char cellg[256]; // green components for states 0..255 unsigned char cellb[256]; // blue components for states 0..255 // icons for this layer gBitmapPtr* icons7x7; // icons for scale 1:8 gBitmapPtr* icons15x15; // icons for scale 1:16 gBitmapPtr* icons31x31; // icons for scale 1:32 // texture atlases for rendering icons unsigned char* atlas7x7; // atlas for 7x7 icons unsigned char* atlas15x15; // atlas for 15x15 icons unsigned char* atlas31x31; // atlas for 31x31 icons int numicons; // number of icons (= number of live states) bool multicoloricons; // are icons multi-colored? (grayscale if not) // used if the layer has a timeline int currframe; // current frame in timeline int autoplay; // +ve = play forwards, -ve = play backwards, 0 = stop int tlspeed; // controls speed at which frames are played }; const int MAX_LAYERS = 10; // maximum number of layers extern int numlayers; // number of existing layers extern int numclones; // number of cloned layers extern int currindex; // index of current layer (0..numlayers-1) extern Layer* currlayer; // pointer to current layer Layer* GetLayer(int index); // Return a pointer to the layer specified by the given index. void AddLayer(); // Add a new layer (with an empty universe) and make it the current layer. // The first call creates the initial layer. Later calls insert the // new layer immediately after the old current layer. The new layer // inherits the same type of universe, the same rule, the same scale // and location, and the same touch mode. void CloneLayer(); // Like AddLayer but shares the same universe and undo/redo history // as the current layer. All the current layer's settings are duplicated // and most will be kept synchronized; ie. changing one clone changes all // the others, but each cloned layer has a separate viewport so the same // pattern can be viewed at different scales and locations. void SyncClones(); // If the current layer is a clone then this call ensures the universe // and settings in its other clones are correctly synchronized. void DuplicateLayer(); // Like AddLayer but makes a copy of the current layer's pattern. // Also duplicates all the current settings but, unlike a cloned layer, // the settings are not kept synchronized. void DeleteLayer(); // Delete the current layer. The current layer changes to the previous // index, unless layer 0 was deleted, in which case the current layer // is the new layer at index 0. void DeleteOtherLayers(); // Delete all layers except the current layer. void SetLayer(int index); // Set the current layer using the given index (0..numlayers-1). void MoveLayer(int fromindex, int toindex); // Move the layer at fromindex to toindex and make it the current layer. // This is called by MoveLayerDialog and the movelayer script command. void MoveLayerDialog(); // Bring up a dialog that allows the user to move the current layer // to a new index (which becomes the current layer). void NameLayerDialog(); // Bring up a dialog that allows the user to change the name of the // current layer. void MarkLayerDirty(); // Set dirty flag in current layer and any of its clones. // Also prefix pattern title and layer name(s) with an asterisk. void MarkLayerClean(const char* title); // Reset dirty flag in current layer and any of its clones. // Also set pattern title, removing asterisk from it and layer name(s). void ToggleSyncViews(); // Toggle the syncviews flag. When true, every layer uses the same // scale and location as the current layer. void ToggleSyncModes(); // Toggle the syncmodes flag. When true, every layer uses the same // touch mode as the current layer. void ToggleStackLayers(); // Toggle the stacklayers flag. When true, the rendering code displays // all layers using the same scale and location as the current layer. // Layer 0 is drawn first (100% opaque), then all the other layers // are drawn as overlays using an opacity set by the user. The colors // for the live cells in each layer can be set via the Prefs dialog. void ToggleTileLayers(); // Toggle the tilelayers flag. When true, the rendering code displays // all layers in tiled sub-windows. bool CanSwitchLayer(int index); // Return true if the user can switch to the given layer. void SwitchToClickedTile(int index); // If allowed, change current layer to clicked tile. void ResizeLayers(int wd, int ht); // Resize the viewport in all layers. bool RestoreRule(const char* rule); // Try to set the current layer's rule to a previously known rule. // If this succeeds return true, but if it fails then warn the user, // switch to the current algorithm's default rule, and return false. // The latter can happen if the given rule's table/tree file was // deleted or was edited and some sort of error introduced. Layer* CreateTemporaryLayer(); // Create a temporary layer with the same algo type as currlayer. // Color handling routines: void CreateColorGradient(); // Create a color gradient for the current layer using // currlayer->fromrgb and currlayer->torgb. void UpdateIconColors(); // Update the icon texture atlases for the current layer. // Must be called BEFORE calling UpdateCloneColors. void UpdateCloneColors(); // If current layer has clones then update their colors. void UpdateLayerColors(); // Update the cell colors and icons for the current layer (and its clones) // according to the current algo and rule. Must be called very soon // after any algo/rule change, and before the viewport is updated. void InvertCellColors(); // Invert the cell colors in all layers, including the dead cell color, // grid lines, and the colors in all icons. void InvertIconColors(unsigned char* atlasptr, int iconsize, int numicons); // Invert the icon colors in the given texture atlas. void SetLayerColors(); // Open a dialog to change the current layer's colors. #endif golly-3.3-src/gui-common/Help/0000755000175000017500000000000013451370074013241 500000000000000golly-3.3-src/gui-common/Help/settings-ios.html0000644000175000017500000000027412250742663016505 00000000000000

Settings Tab

The Settings tab lets you change various options. All of these should be pretty obvious. If not, let us know! golly-3.3-src/gui-common/Help/bounded.html0000644000175000017500000005566512250742662015512 00000000000000

Bounded Grids

Bounded grids with various topologies can be created by adding a special suffix to the usual rule string. For example, B3/S23:T30,20 creates a toroidal Life universe 30 cells wide and 20 cells high. The suffix syntax is best illustrated by these examples:

:P30,20 — plane with width 30 and height 20
:P30,0 — plane with width 30 and infinite height
:T0,20 — tube with infinite width and height 20
:T30,20 — torus with width 30 and height 20
:T30+5,20 — torus with a shift of +5 on the horizontal edges
:T30,20-2 — torus with a shift of -2 on the vertical edges
:K30*,20 — Klein bottle with the horizontal edges twisted
:K30,20* — Klein bottle with the vertical edges twisted
:K30*+1,20 — Klein bottle with a shift on the horizontal edges
:C30,20 — cross-surface (horizontal and vertical edges are twisted)
:S30 — sphere with width 30 and height 30 (must be equal)

Some notes:

  • The first letter indicating the topology can be entered in lowercase but is always uppercase in the canonical string returned by the getrule() script command.
  • If a bounded grid has width w and height h then the cell in the top left corner has coordinates -int(w/2),-int(h/2).
  • The maximum width or height of a bounded grid is 2,000,000,000.
  • Use 0 to specify an infinite width or height (but not possible for a Klein bottle, cross-surface or sphere). Shifting is not allowed if either dimension is infinite.
  • Pattern generation in a bounded grid is slower than in an unbounded grid. This is because all the current algorithms have been designed to work with unbounded grids, so Golly has to do extra work to create the illusion of a bounded grid.

The different topologies are described in the following sections.

Plane

A bounded plane is a simple, flat surface with no curvature. When generating patterns in a plane, Golly ensures that all the cells neighboring the edges are set to state 0 before applying the transition rules, as in this example of a 4 by 3 plane:

 0  0  0  0  0  0 
 0  A  B  C  D  0 
 0  E  F  G  H  0 
 0  I  J  K  L  0 
 0  0  0  0  0  0 
   rule suffix is :P4,3

Torus

If the opposite edges of a bounded plane are joined then the result is a donut-shaped surface called a torus. Before applying the transition rules at each generation, Golly copies the states of edge cells into appropriate neighboring cells outside the grid. The following diagram of a 4 by 3 torus shows how the edges are joined:

 L  I  J  K  L  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 D  A  B  C  D  A 
   rule suffix is :T4,3

A torus can have a shift on the horizontal edges or the vertical edges, but not both. These two examples show how shifted edges are joined:

 K  L  I  J  K  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  B  C  D  A  B 
   :T4+1,3
 H  I  J  K  L  A 
 L  A  B  C  D  E 
 D  E  F  G  H  I 
 H  I  J  K  L  A 
 L  A  B  C  D  E 
   :T4,3+1

Klein bottle

If one pair of opposite edges are twisted 180 degrees (ie. reversed) before being joined then the result is a Klein bottle. Here are examples of a horizontal twist and a vertical twist:

 I  L  K  J  I  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  D  C  B  A  D 
   :K4*,3   
 D  I  J  K  L  A 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 L  A  B  C  D  I 
   :K4,3*

A Klein bottle can only have a shift on the twisted edges and only if that dimension has an even number of cells. Also, all shift amounts are equivalent to a shift of 1. Here are two examples:

 J  I  L  K  J  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 B  A  D  C  B  A 
   :K4*+1,3
 F  J  K  L  D 
 C  A  B  C  A 
 L  D  E  F  J 
 I  G  H  I  G 
 F  J  K  L  D 
 C  A  B  C  A 
   :K3,4*+1

Cross-surface

If both pairs of opposite edges are twisted and joined then the result is a cross-surface (also known as a real projective plane, but Conway prefers the term cross-surface). Here's an example showing how the edges are joined:

 A  L  K  J  I  D 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 I  D  C  B  A  L 
   :C4,3

Note that the corner cells have themselves as one of their neighbors. Shifting is not possible.

Sphere

If adjacent edges are joined rather than opposite edges then the result is a sphere. By convention we join the top edge to the left edge and the right edge to the bottom edge, as shown in this 3 by 3 example:

 A  A  D  G  C 
 A  A  B  C  G 
 B  D  E  F  H 
 C  G  H  I  I 
 G  C  F  I  I 
   :S3

Note that the cells in the top left and bottom right corners (the "poles") have different neighborhoods to the cells in the top right and bottom left corners. Shifting is not possible.

Example patterns using the above topologies can be found in the Open tab's supplied patterns, especially in Generations and Life/Bounded-Grids. golly-3.3-src/gui-common/Help/help-ios.html0000644000175000017500000000321112250742663015567 00000000000000

Help Tab

The Help tab behaves like a simplified browser and is used to display HTML information on a variety of topics.

Special links

A number of Golly-specific links are used for various purposes:

  • edit:file
    Display the given file in a modal view.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the Help tab. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is displayed in a modal view.
    • A zip file's contents are displayed in the Help tab.
    • A rule file (.rule) is installed into Documents/Rules/ and Golly then switches to the corresponding rule.
    • A pattern file is loaded and displayed in the Pattern tab.
  • lexpatt:pattern
    Load the given Life Lexicon pattern and display it in the Pattern tab.
  • open:file
    Load the given pattern and display it in the Pattern tab.
  • rule:rulename
    Load the given rule and switch to the Pattern tab.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file and displays its contents in the Help tab.
golly-3.3-src/gui-common/Help/Lexicon/0000755000175000017500000000000013317135606014643 500000000000000golly-3.3-src/gui-common/Help/Lexicon/lex_p.htm0000644000175000017500000067762713317135606016435 00000000000000 Life Lexicon (P)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:p = period

:p1 Period 1, i.e., stable. In the context of logic circuitry, this tends to mean that a mechanism is constructed from Herschel conduits that contain only still lifes as catalysts. In the context of slow glider construction, a P1 slow salvo is one in which there are no constraints on the parity of gliders in the salvo, because the intermediate targets are all stable constellations. (The usual alternative is a "P2 slow salvo", where the relative timing between adjacent gliders can be increased arbitrarily, but only by multiples of two ticks.)

:p104 gun A glider gun with period 104, found by Noam Elkies on 21 March 1996. It is based on an R-pentomino shuttle reaction.

.OO........OO..........................
.OO.........O.......O..................
.OO.........O.OO...O.O............OO...
.O...........O......O.............OOO..
O.O......OO......O................OO.O.
O.OO.....OO....O....................O.O
................O..................O..O
....................................OO.
.OO....................................
.OO....................................
...............OO......................
................OO..................OO.
................O...................OO.
.OO......OOO........................OO.
O..O.......O........................O..
O.O.........................OO.....O.O.
.O.OO.......................OO.....O.OO
..OOO.............O....................
...OO............O.O...................
..................O.................OO.
....................................OO.

:p11 bumper (p11) A periodic colour-preserving glider reflector with a minimum repeat time of 44 ticks. Unlike the p5 through p8 cases where Noam Elkies' domino-spark based reflectors are available, no small period-22 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

............................O..
............................O.O
............................OO.
...............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
.................O.............
.................O.O...........
.................OO............
...............................
.........OO....OO..............
.........OO...O..O.............
...OO....OO....O.O.............
....O.....OO....O..............
..O.....O.OO...................
..OO..OOO...........OO.........
.....O....O.O.......O..........
..OOO.OO.OO.OOO......OOO.......
.O....O....O...O.......O.......
O.O.O...OO.O..O................
O.O......O.O.O.................
.O..OOOOO..OO..................
..OO....O.O....................
....OOOO..O....................
..OO......OO...................
..O..O.........................
....OO.........................

In practice this reflector is not useful with input streams below period 121, because lower-period bumpers can be used to reflect all smaller multiples of 11 for which the bumper reaction can be made to work.

:p130 shuttle A shuttle found in March 2004 by David Eppstein, which originally needed several period 5 oscillators for support. David Bell found a reaction between two of the shuttles to produce a p130 glider gun. On 18 November 2017 Tanner Jacobi found that the stable sidesnagger can be used to support the shuttle instead, and this is shown here.

.....OO................................OO.....
.....OO................................OO.....
..............................................
..............................................
.........................O....................
OO....OO..................O...........OO....OO
OO...O..O................OO..........O..O...OO
.....O.O...........OOOOOOO............O.O.....
......O...........OOO..O...............O......
..................O..OO.O.....................
...O..................O.O.................O...
..O.O...............OO.OO................O.O..
..OO................OOOO..................OO..
..............................................
..OO................OOOO..................OO..
..O.O...............OO.OO................O.O..
...O..................O.O.................O...
..................O..OO.O.....................
......O...........OOO..O...............O......
.....O.O...........OOOOOOO............O.O.....
OO...O..O................OO..........O..O...OO
OO....OO..................O...........OO....OO
.........................O....................
..............................................
..............................................
.....OO................................OO.....
.....OO................................OO.....

:p144 gun A glider gun with true period 144. The first one was found by Bill Gosper in July 1994. For a full description and pattern see factory.

:p14 gun A glider gun which emits a period 14 glider stream. This is the smallest possible period for any stream, so such a gun is of great interest. There is no known true-period p14 glider gun, and finding a small direct example is well beyond current search algorithms' abilities. However, pseudo-period p14 guns have been created by injecting gliders into a higher period glider stream. The first pseudo p14 gun was built by Dieter Leithner in 1995. Smaller pseudo p14 guns have since been constructed, but they are still much too large to show here. The essential mechanism used by them is demonstrated in GIG.

:p15 bouncer Noam Elkies' colour-changing glider reflector, with Karel's p15 providing the necessary domino spark. Compare to the colour-preserving Snark. The minimum repeat time is 30 ticks.

........................O..
........................O.O
........................OO.
...........................
...........................
...........................
...........................
.................O.........
................O..........
................OOO........
...........................
...OO....OO.........OO.....
..O..O..O..O....OO..OO.....
..OO......OO...O.O.........
..OO......OO....O..........
....OO..OO.................
..................OO.......
..................O........
...................OOO.....
.O..O.OO.O..O........O.....
OO..O....O..OO.............
.O..O.OO.O..O..............

:p15 bumper A periodic colour-preserving glider reflector with Karel's p15 providing the necessary spark. The minimum repeat time is 45 ticks. For an equivalent colour-changing periodic glider reflector see p15 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

............................O.O
............................OO.
.............................O.
...............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
.................O.............
.................O.O...........
.................OO............
...............................
...............OO..............
.OO.OO.OO.....O..O.............
.OO....OO......O.O.............
.OO.OO.OO.......O..............
...............................
....OO..............OO.........
..O....O............O..........
.O......O............OOO.......
O........O.............O.......
O........O.....................
O........O.....................
.O......O......................
..O....O.......................
....OO.........................

:p15 reflector An ambiguous term that may refer to PD-pair reflector, p15 bouncer, or the more recently discovered p15 bumper.

:p184 gun A true period 184 double-barrelled glider gun found by Dave Buckingham in July 1996. The engine in this gun is a Herschel descendant. Unlike previous glider guns, the reaction flips on a diagonal so that both gliders travel in the same direction.

...................O...........
.................OOO...........
................O..............
................OO.............
..............................O
............................OOO
...........................O...
...........................OO..
...............................
...............................
...............................
...............................
....................OO.........
...................O.O.........
...................O...........
...................OO.O........
..OO.................OO........
.O.O...........................
.O.............................
OO.............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
......OO.......................
.....O.O.......................
.....O.........................
....OO.........................

:p1 megacell (p1 circuitry) A metacell constructed by Adam P. Goucher in 2008, capable of being programmed to emulate any Moore neighborhood rule, including isotropic and anisotropic non-totalistic rules. It fits in a 32768 by 32768 bounding box, with the resulting metacell grid at 45 degrees to the underlying Life grid. Like the OTCA metapixel, it includes a large "pixel" area so that the state of the megacell can easily be seen even at extremely small-scale zoom levels.

:p1 telegraph (p1 circuitry) A variant of Jason Summers' telegraph pattern, constructed in 2010 by Adam P. Goucher using only stable circuitry. A single incoming glider produces the entire ten-part composite lightspeed signal that restores the beehive-chain lightspeed wire to its original position. The signal is detected at the other end of the telegraph and converted back into a single output signal. This simplification came at the cost of a much slower transmission speed, one bit per 91080 ticks. In this mechanism, sending the entire ten-part signal constitutes a '1' bit, and not sending the signal means '0'. See also high-bandwidth telegraph.

:p22 gun A true period 22 glider gun constructed by David Eppstein in August 2000, using two interacting copies of a p22 oscillator found earlier the same day by Jason Summers.

..................OO.........................
...................O.......O.................
...................O.O..............OO.......
....................OO............OO..O......
........................OOO.......OO.OO......
........................OO.OO.......OOO......
........................O..OO............OO..
.........................OO..............O.O.
...................................O.......O.
...........................................OO
.............................................
OO...........................................
.O...........................................
.O.O.............OOO.........................
..OO...O........O...O........................
......O.OO......O....O.......................
.....O....O......OO.O........................
......O...O........O...OO....................
.......OOO.............O.O...................
.........................O...................
.........................OO..................

:p246 gun A true period glider gun with period 246, discovered by Dave Buckingham in June 1996. The 180-degree mod-123 symmetry of its bookend-based engine makes it trivial to modify it into a double-barrelled gun. Its single-barreled form is shown below.

..................................O........
..................................OOO......
................................OO...O.....
...............................O.O.OO.O....
..............................O..O..O.O....
....................................O.OO...
..................................O.O......
................................O.O.O......
.................................OO.OO.....
...........................................
OO.........................................
.O.........................................
.O.O.................OO....................
..OO..................O..................OO
....................O.O..................O.
....................OO.................O.O.
.......................................OO..
...........................................
...........................................
...........................................
...........................................
...........................................
...........................................
.............................OO............
.......................O.....OO............
.................OO.OOO....................
.................O..OOOO...................
.................O.OO......................
...........................................
...........................................
.....O.....................................
....O.OOOO.................................
...O.O.OOO.................................
..O.O......................................
...O.......................................
...OO......................................
...OO......................................
...OO......................................

:p24 gun A glider gun with true period 24. The first one was found by Noam Elkies in June 1997. It uses three p4 oscillators to hassle a pair of traffic lights. One of the oscillators was very large and custom-made. Shown below is a much smaller version built by Jason Summers and Karel Suhajda in December 2002, using the same mechanism but with a smaller oscillator:

.......................O..O................
.....................OOOOOO................
.................OO.O........O.............
.............OO.O.O.O.OOOOOOOO..O..........
...........OOO......O.O...O...OOO..........
..........O....O..O.O...O...OO.............
...........OOOOO..O.OOOO.O...O.OO..........
............O....OO.....O.O.OO..O....OO.O..
..........O...OO...O.OO..OO..OO.....O.OO.O.
..........OOOOO.OOOO.O..............O....O.
.....................O........O..OO.O.OO.OO
............OOO...OOO...O.O......O.O.O.O.O.
...........O......O....O..O.O.O....O.O.O.O.
............OO..O.O.......O..OO...O.O.OO.OO
OO.OO..................OO.OO.OOO..O...O.O..
.O.O......O...O.O.O....O..O.............O..
O..O..O..O.O...O.OOO...O.O........O.O.OO...
OOO.OO.O.OOO...........O.........OO........
...O.O.O.OO......................O.........
..O.OO...O.O..............OO.....O..O......
.O...OO....O.............OOO.....O.........
.OO.......OO..............OO.....OO........
..........OO......OOO.............O.O.OO...
.OO.......OO......O.O...................O..
.O...OO....O......OOO.............O...O.O..
..O.OO...O.O......................O.O.OO.OO
...O.O.O.OO........................O.O.O.O.
OOO.OO.O.OOO.....................O.O.O.O.O.
O..O..O..O.O.........OO..........OO.O.OO.OO
.O.O......O..........O..............O....O.
OO.OO.................OOO...........O.OO.O.
........................O............OO.O..

:p256 gun A true period 256 four-barrelled glider gun found by Dave Buckingham in September 1995. It uses four R64 conduits to make the second smallest known Herschel loop (after the Simkin glider gun). The p256 gun was an early "teaser" from Dave Buckingham before he released his full Herschel technology.

...............................OO................
...............................OO.....OO.........
......................................OO.........
.................................................
.................................................
.......OO........OO.................OO...........
.......OO.........O.................OO...........
..................O.O.....................OO.....
...................OO.....................OO.....
.OO..............................................
.OO..............................................
.....OO..........................................
.....OO...............O..........................
......................O.O........................
......................OOO........................
........................O........................
OO...............................................
OO.........................................OO....
...........................................O.....
.........................................O.O.....
.........................................OO......
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
......OO.......................................OO
......O........................................OO
.......O.........................................
......OO.........................................
......................O.O........................
.......................OO.................OO.....
.......................O..................OO.....
..............................................OO.
..............................................OO.
.....OO..........................................
.....OO..........................................
...........OO...........................OO.......
...........OO...........................OO.......
.................................................
.................................................
.........OO......................................
.........OO.....OO...............................
................OO...............................
Either eaters or snakes can be added as shown above, to suppress three of the glider streams so that only one stream escapes. This gun's p256 glider stream is well-suited for repeated reactions with receding Corderships, or for "Hashlife-friendly" signal circuitry.

:p29 pentadecathlon hassler A hassler where two copies of a period 29 oscillator (which is itself a pre-pulsar hassler) change the period of a pentadecathlon.

..........O.......O....................O.......O..........
.........O.O.....O.O..................O.O.....O.O.........
..........O.......O....................O.......O..........
..........................................................
..........................................................
..........................................................
.........................OO....OO.........................
.........................OOO..OOO.........................
...OO....................OO....OO....................OO...
...O.......O.....O......................O.....O.......O...
OO.O......OOO...OOO....................OOO...OOO......O.OO
O..OO.....OOO...OOO....................OOO...OOO.....OO..O
.OO....O.............OO............OO.............O....OO.
...OOOOO.............O.O..........O.O.............OOOOO...
...O....OO.............O..........O.............OO....O...
....OO..O.......OO.....OO........OO.....OO.......O..OO....
......O.O.......OO......................OO.......O.O......
......O.O.O..O..............................O..O.O.O......
.......OO.OOOO..............................OOOO.OO.......
.........O......................................O.........
.........O.O..................................O.O.........
..........OO..................................OO..........

:p30 gun A glider gun with true period 30. The first one, found by Bill Gosper in November 1970 (see Gosper glider gun), was also the first gun found of any period. All known p30 glider guns are made from two or more interacting queen bee shuttles. Paul Callahan found 30 different ways that three queen bee shuttles can react to form a period 30 glider gun. One of the most interesting of these is shown below in which the gliders emerge in an unexpected direction.

OO...................................
.O...................................
.O.O......O.............O............
..OO......OOOO........O.O............
...........OOOO......O.O.............
...........O..O.....O..O.............
...........OOOO......O.O.............
..........OOOO........O.O........OO..
..........O.............O........O.O.
...................................O.
...................................OO
.....................................
................OOO..................
...............OO.OO.................
...............OO.OO.................
...............OOOOO.................
..............OO...OO................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..............OO.....................
...............O.....................
............OOO......................
............O........................

:p30 reflector = buckaroo

:p30 shuttle = queen bee shuttle

:p36 gun A glider gun with true period 36. The first one was found by Jason Summers in 2004. Shown below is a smaller version using improvements by Adam P. Goucher and Scot Ellison:

................................................O.
..............................................OOO.
.............................................O....
.............................................OO...
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
.................................OO...............
................................O..O..............
................................O.O.O.............
.................................O..OOO...........
..................................................
...................................OO.....OO......
...................................O.....O.OO.....
.........................................O..O.....
..........................................OOO.....
......................................OO..OO......
.....................................OOO..........
.....................................O..O.........
.....................................OO.O.....O...
......................................OO.....OO...
..........................OO......................
OO.......................O..O..............OOO..O.
.O........................O.O................O.O.O
.O.O..................OO...O..................O..O
..OO..........O........O.OO....................OO.
.............OO..........O........................
............OO.O.........O........................
.............O.O..................................
..............OO..................................
.......................OO.........................
.......................O.O........................
.............O.........O.OO.......................
.............O..........OO........................
............OO.O........O.........................
...........O...OO.................................
..........O.O.....................................
..........O..O....................................
...........OO...........O...........OO............
.......................O.O...........O............
.......................O.O..OOOOOOOOO.............
....................OO.O..O.OOOOOOO..OOO..........
....................OO.O....OOOOOO..O..O..........
.......................O.............OO...........
.......................O.O....OO..................
........................OO....OO..................

:p3 bumper A variant of Tanner Jacobi's bumper found by Arie Paap in April 2018. Two forms of the period 3 oscillator catalyst are shown below.

..O........................O..................
O.O......................O.O..................
.OO.......................OO..................
......................O.......................
....................OOO.......................
...................O..........................
...................OO.........................
..................OO..........................
.......OO........OO.............OO.........OO.
......O..O....O...O............O..O....O.OOOO.
......O.O...OOO.OOO............O.O...OOO..O.O.
.......O.........O..............O.............
............OOOOOO...................OOO......
..OO........OO.O...........OO.......O.OOO.O.OO
...O.......OO...............O......O....O.OO.O
OOO......................OOO.......OO..OOO....
O........................O............O...OOO.
.......................................OOO..O.
.........................................O....

For bounding box optimization purposes, it's also possible to replace the eater1 in a p3, p6 or p9 bumper with another period 3 oscillator, saving one row along the south edge at the cost of a higher population.

....O.........................
..O.O.........................
...OO.........................
..............................
..............................
..............................
..............................
..............................
.............................O
......O......O.............OOO
.O...O.O...O.O............O...
O.O..O.O....OO.............O..
O.OOO.O.................O..O..
.O..OO........OO........O.....
..OOO........O..O....OOO..O...
.............O.O....OOOO.O....
....OOO.......O...............
...O..O............O..O.O.....
...OOOOO.OO...........O.......
.O.O...OO.O.......OOO.........
.OO......O....................

The repeat time for all these variants is 36 ticks, as shown.

:p44 gun A glider gun with a true period of 44. The first one was found by Dave Buckingham in April 1992. It uses two interacting copies of an oscillator which he also found. In 1996 he found a gun which only used one copy of the oscillator. Paul Callahan improved it in 1997, resulting in the gun shown below:

.................OO......OO.................
.................OO......OO.................
............................................
............................................
............................................
............................................
............................................
............................................
.OO......................................OO.
O.O......................................O.O
O.O.OO................................OO.O.O
.O.O.O................................O.O.O.
...O....................................O...
..O..O.............O....O.............O..O..
..O...............OO....OO...............O..
..O...O..........O........O..........O...O..
..O...O...........OO....OO...........O...O..
..O................O....O................O..
..O..O................................O..O..
...O....................................O...
.O.O.O................................O.O.O.
O.O.OO................................OO.O.O
O.O......................................O.O
.OO......................................OO.
............................................
............................................
............................................
...............OO...........................
................O...........................
.............OOO............................
.............O....................OO........
..................OO..............O.O.......
..................OO................O.......
....................................OO......
............................................
............................................
............................................
....................OO......................
...................O.O......................
...................O........................
..................OO........................

:p44 MWSS gun A gun discovered by Dieter Leithner in April 1997, in a somewhat larger form. This was the smallest known gliderless gun and smallest known MWSS gun until the construction in 2017 of the gun shown under gliderless, based on Tanner's p46.

The p44 MWSS gun is based on a p44 oscillator discovered by Dave Buckingham in early 1992, shown here in an improved form found in January 2005 by Jason Summers using a new p4 sparker by Nicolay Beluchenko. A glider shape appears in this gun for three consecutive generations, but always as part of a larger cluster, so even a purist would regard this gun as gliderless.

.......O..........................................
..OO...O.O....O...................................
..O..OO..O.O.OO.O..OOO..OO........................
....OO.......OO.O.O.OO..OO........................
...OOO.......O.......OOO.........O................
.......................O.......OOO................
.......................O......O........OOO........
..............................OO.......O..O.......
.........OO..............O.............O..........
.........OO.............O..............O...O......
.........................OO............O..........
........................O.O.............O.O.......
..................................................
.......................O.O.....OOO................
........................O.....O..O..............OO
OO............OOO.......O......OO...........OO.O.O
OO...........O...O..........................OO.O..
.............OO.OO..............................O.
.................................OO.........OO.OO.
..............................OO.............O.O..
.............................................O.O..
..............................................O...
.............OO.OO.............O.O................
OO...........O...O.............OO.................
OO............OOO.................................
...........................OO.....................
...........................O.O....................
.............................O....................
.............................OO...................
..................................................
.........OO.......................................
.........OO.......................................
..................................................
.......................O..........................
.......................O..........................
...OOO.......O.......OOO..........................
....OO.......OO.O.O.OO..OO........................
..O..OO..O.O.OO.O..OOO..OO........................
..OO...O.O....O...................................
.......O..........................................

:p45 gun A true-period glider gun discovered by Matthias Merzenich in April 2010. By most measures this is the smallest known odd-period gun of any type, either true-period or pseudo-period:

...............O..O..O..........................
...............OOOOOOO..........................
................................................
...............OOOOOOO..........................
...............O..O..O..........................
................................................
................................................
................................................
................................................
................................................
................O..O............................
............OO..O..O............................
............OO..O..O.......OO...................
...........................OO....OO...O..O...OO.
.................................OOOOO....OOOOO.
.................................OO...O..O...OO.
...........................OOO..................
................................................
OO.OO...........................................
.O.O.......................OOO..................
.O.O......OOO...................................
OO.OO.............................O.O...........
.O.O...............................OO...........
.O.O......OOO......................O............
OO.OO...........................................
................................................
...........OO...................................
...........OO.......O..O..OO....................
....................O..O..OO....................
....................O..O........................
................................................
................................................
...............................................O
.............................................O.O
..............................................OO
..................O..O..O.......................
..................OOOOOOO.......................
................................................
..................OOOOOOO.......................
..................O..O..O.......................

:p46 gun A glider gun which has true-period 46. The first one found was the new gun by Bill Gosper in 1971. Prior to the discovery of Tanner's p46 in October 2017, all known p46 guns were made from two or more twin bees shuttles that interact (e.g., see twin bees shuttle pair). See edge shooter and double-barrelled for two more of these.

On 21 October 2017 Heinrich Koenig found a glider gun using two copies of Tanner's p46 placed at right angles to each other. This is the first p46 gun found which makes no use of the twin bees shuttle.

....OO.............................
.....O.............................
.....O.O...........................
......OO..OO.......................
..........OO.......................
...................................
...................................
...................................
...................................
...................................
...................................
O..................................
OOO.......OO.......................
...O......O.O......................
..O.O.......O......................
..OO......O.O......................
..........OO.......................
..OO...............................
..O................................
...OOO.............................
.....O.............................
........OO.........................
.........O.........................
......OOO..............OOO.........
......O...............O...O........
.....................O.....O.......
.............OO......O.....O.......
.............OO......OOO.OOO.......
...............................OO..
...............................O.O.
............OO...................O.
.............O...................OO
..........OOO................OO....
..........O.............O....O.....
.......................O.O.O.O.....
......................O.OO.OO......
......................O............
.....................OO............

See gliderless for a MWSS gun also made using two copies of Tanner's p46.

:p46 shuttle = twin bees shuttle

:p48 gun A true period compound glider gun based on the p24 gun, using a Rich's p16 oscillator as a filter to remove half of the gliders from the stream.

.................OO...........OO.............
................O..O.........O..O............
................O.O...OO.OO...O.O............
..............OO..O.O.......O.O..OO..........
...............O.O.O....O....O.O.O...........
..............O..OO..OOOOOOO..OO..O..........
..............OO.....O.O.O.O.....OO..........
.......................O.O...................
.....O..OO.........OOO.....OOO...............
....O.O..O..O.....O.O.O...O.O.O..............
....O.OO.O.O.O....OO..OOOOO..OO..............
...OO.O..O.O..O..............................
...O..O.OO..O................................
....OOO.O.O...OOO............................
......OO.O.....OO............................
..O.O..O.O...O..O....O.O.O...................
..OO..OO.O.OO..OOO....OOO.............OO.....
........OO.O...OO......O.............O..O....
..OOOOO....O........................OO.......
.O....O.OOO.................OO.....OOO.....O.
.O.OO.O.O......OO.......O...O.O....O..O...O.O
OO.O..O......OOOO........O....O.....OOO...OO.
.O.O.O.O.....OO..O.....OOO....OO.............
.O.O.OO.O..O........................OOO...OO.
OO.OO..OO...OOOO...................O..O...O.O
...O..OOO..O..OO....O..............OOO.....O.
...O.O.OO.....O....O.O........O.....OO.......
..OO.O..OO.O..O...O...O........O.....O..O....
....O...OO..O..O...O.O.......OOO......OO.....
....O.O.......O.....O........................
...OO.OO..........OOO........................
..........OO....OOOOOOO....OO................
..........O..O..OO.O.OO..O..O................
...........OO.OOOO...OOOO.OO.................
........OOO..O...........O..OOO..............
.......O...OO.OO.......OO.OO...O.............
.......OO.O...OO.......OO...O.OO.............
........O.OOO...O.....O...OOO.O..............
.......O......OO.......OO......O..........O..
........OOOOOO...........OOOOOO............O.
..........O..O...........O..O............OOO.

:p4 bumper (p4) A periodic colour-preserving glider reflector with a minimum repeat time of 36. Unlike the p5 through p8 cases where Noam Elkies' domino spark-based reflectors are available, no small period-4 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

.....................O..
.....................O.O
.....................OO.
........................
........................
........................
........................
........................
........................
............O...........
............O.O.........
............OO..........
........................
....OO....OO............
...O..O..O..O...........
..........O.O...........
...........O............
..O..O..................
..O.OO.........OO.......
...O.OOO.......O........
OOO...O.O.......OOO.....
O.......O.........O.....
........OO..............

:p4 reflector The following glider reflector, discovered by Karel Suhajda in October 2012. Its minimum repeat time is 52 ticks. Unlike the various bouncers discovered many years earlier, it is a colour-preserving reflector, so it was made obsolete the following year by the discovery of the much smaller stable Snark, which uses the same initial bait reaction and so produces an output glider with the same timing. For a smaller periodic colour-preserving glider reflector with a different output timing, see p4 bumper.

................................O.........................
...............................O..........................
...............................OOO.......O.O..............
........................................O.OO..............
......................................OOO.....O...........
.....................................O...OOOOOOOO.........
..................................O.O.O..O.......O........
..............O...................OOOO.OO.OOOOOOO.O.......
..............OOO..................OOO.....O.O..O.O..OO...
.................O...................OOO.O.O...OO.O.O.O...
................OO.............OOO..OO.OOOOO....O.O.O.....
.............................O.O...OOO.OO.O..O.OOOO..O..OO
...........................OO.....O....O..O..O...O....O..O
...................O.......OO.O.O..O......O..O....OOOOOOO.
..................O...........O.O..O..O..O.........O......
..................OOO........O....O..O...........O...OO...
............................O.OOOOOOO........OO.O.OOO.O...
.............................O.........O.O....O.O.O.......
...................OO..........OOOOOOOOO.OOO..O.O.........
...................OO.......O...O.......O...O.O.O.........
...........................O..O...OOOO..O..O.O.O..........
.............................OO...O...O.O.O..O............
.............................O.....OOO.O.O.OO..O..........
........OO...............O...OOO.....O...O...OOO..........
...OO..O..O..................O...OO..O..O.OO..............
...O....O.O..................O...OOOO...O.O.OO............
OO.O.....O................OOO...O......OO...O.O...........
.O.O.OO....................OOO.....O..OO..O.O.O...........
O..O..O........OO...........OOO..OOO.OOO..O.O.OO..........
OO..O....O.....O.O..........O..O...O...O..O.O.............
.....OOOOO.......O...........O.O..O.OO...OOOO.............
................O..........O.O.O.OOO.OOO.O................
.......O.........OOO......O.OO.O..OO......................
......O.O..........O......O.....O......OO.O...............
.......O...................OOOOO......O..OO...............
.............................O........OO..................

:p54 shuttle (p54) A surprising variant of the twin bees shuttle found by Dave Buckingham in 1973. See also centinal.

OO.........................OO
.O.........................O.
.O.O.......O.............O.O.
..OO.....O..O.....O......OO..
............O.....OO.........
........O..........OO........
........O...OO....OO.........
.........OOOOO...............
.............................
.........OOOOO...............
........O...OO....OO.........
........O..........OO........
............O.....OO.........
..OO.....O..O.....O......OO..
.O.O.......O.............O.O.
.O.........................O.
OO.........................OO

:p5 bouncer (p5) A colour-changing glider reflector constructed by Noam Elkies in September 1998 by welding together two special-purpose period-5 sparkers. The minimum repeat time is 25 ticks. For colour-preserving glider reflectors see p5 bumper and the stable Snark reflector.

..........................O..
........................OO...
.........................OO..
.............................
.............................
........OO...................
.....O..O.O........O.........
....O.O.O.O.......O..........
...O.O.O..OO......OOO........
...O...O.O..O................
OO.OO..O.O.O..........OO.....
O.O....OOO..O.....OO..OO.....
..O.OOO...OO.....O.O.........
..O..O.....O......O..........
...O...O.O..O............OO..
....OOO.OO.OO.......OO....O..
......O....O........OO..OOO..
.......OOO.O.....OO.....OOO..
..........O.OO...OO.....OO...
.........O..O..OOO.O........O
.........OO..OOO...........OO
................O............
.............OOOO.O..........
............O..O...O.........
............OO...O.OOO.......
.............O.O..O...O......
.............O.OO.O..OO......
..............O..O...........
...............OO............

:p5 bumper A periodic colour-preserving glider reflector with a middleweight volcano producing the necessary spark. The minimum repeat time is 35 ticks. For an equivalent colour-changing periodic glider reflector see p5 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

............................O
..........................OO.
...........................OO
.............................
.............................
.............................
.............................
.............................
.............................
...OO..O..........O..........
...O..O.O.........O.O........
....O.O.O.........OO.........
...OO.O.OO...................
..O...OO..O.....OO...........
.O..OO...OOO...O..O..........
.O.O.OO..OOO....O.O..........
..O.OO...OOO.....O...........
......OO..O..................
OOOOO.O.OO...........OO......
O..O..O.O............O.......
.....O..O.............OOO....
......OO................O....

:p5 reflector Traditional name for p5 bouncer before 2016, but with the discovery of the p5 bumper this has become an ambiguous reference.

:p60 gun A glider gun with a true period of 60. The first one was found by Bill Gosper in 1970 and is shown below.

............................O..........
............................O.O........
...........OO..................OO......
.........O...O.................OO....OO
...OO...O.....O................OO....OO
...OO..OO.O...O.............O.O........
........O.....O.............O..........
.........O...O.........................
...........OO..........................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
..........O.O..........................
.........O..O...OO.....................
OO......OO.....OOO.OO..OO..............
OO....OO...O...O...O...O.O.............
........OO.....O.O........O............
.........O..O..OO......O..O............
..........O.O.............O............
.......................O.O.......OO....
.......................OO........O.O...
...................................O...
...................................OO..
There are several other ways to create a p60 gun from two p30 guns using period-doubling reactions similar to the one shown here.

:p690 gun A true period 690 glider gun found by Noam Elkies in July 1996. It is composed of a p30 queen bee shuttle pair and a p46 twin bees shuttle whose sparks occasionally react with each other. This is a very compact gun for such a high period and is used in many patterns requiring sparse glider streams.

...........O........................................
...........OOO......................................
..............O.....................................
.............OO.....................................
....................................................
....................................................
....................................................
....................................................
...............OOO..................................
..............O...O.................................
....................................................
.............O.....O................................
.............OO...OO................................
....................................................
..........................................OO.O......
................O......OO............OOO..OO..O.....
OO.............O.O.....OO.............OO......O...OO
.O.............O.O.....................OOO...OOOO..O
.O.O.....O.....O........................O...O...OOO.
..OO...O.O.....O........O.....O.....................
......O.O......O..O.....O.....O.........O...O...OOO.
.....O..O......O..O....................OOO...OOOO..O
......O.O.......OO..OO...........OO...OO......O...OO
.......O.O...........................OOO..OO..O.....
.........O..............O.....O...........OO.O......
........................O.....O.....................

:p6 bouncer (p6) Noam Elkies' colour-changing glider reflector using the p6 pipsquirter, with a minimum repeat time of 24 ticks. For colour-preserving glider reflectors see p6 bumper and the stable Snark reflector.

.......................O.
......................O..
......................OOO
...OO....................
...O.....................
.....O...................
....OOOO.........O.......
...O....O.......O........
...OOOOO.O......OOO......
.OO....O.O...............
O..O.....OO.........OO...
OO.O.O.O..O.....OO..OO...
...O..O.OOO....O.O.......
...OO.O...O.....O........
.....O.O.OO..............
.....O.O.O........OO.....
......O..O........O......
.......OO..........OOO...
.....................O...

:p6 bumper (p6) A periodic colour-preserving glider reflector with a unix providing the necessary spark. The minimum repeat time is 36 ticks. For an equivalent colour-changing periodic glider reflector see p6 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

.......................O..
.......................O.O
.......................OO.
..........................
..........................
..........................
..........................
..........................
..........................
..............O...........
..............O.O.........
..............OO..........
..........................
............OO............
.....OO....O..O...........
.....OO.....O.O...........
.............O............
..........................
.....OOO.........OO.......
OO..O.OO.........O........
OO..OO............OOO.....
....OO..............O.....

:p6 pipsquirter (p6) A pipsquirter oscillator found by Noam Elkies in November 1997, used in various hasslers and the colour-changing p6 bouncer.

.....O.........
.....O.........
...............
...O...O.......
.OOO.O.OOO.....
O...OO....O....
O.OO..OO.O.O...
.O..OO..OO.O...
..OO..OO.O.O.OO
....O..O.O.O.OO
....OOOO.OO....
........O......
......O.O......
......OO.......

:p6 reflector Traditional name for p6 bouncer before 2016, but with the discovery of the p6 bumper this has become an ambiguous reference.

:p6 shuttle (p6) The following oscillator found by Nicolay Beluchenko in February 2004.

O.............
OOO...........
...O..........
..OO..........
..............
......O.......
.....OOOO.....
......O..O....
.......OOO....
..............
..........OO..
..........O...
...........OOO
.............O
This is extensible in more than one way:
O........................
OOO......................
...O.....................
..OO.....................
.........................
......O..................
.....OOOO................
......O..O...............
.......OOO...............
.........................
..........OOO............
..........O..O...........
...........OOOO..........
.............O...........
.........................
.................O.......
................OOO......
.................O.O.....
.................O.O.....
..................OO.....
.....................OO..
.....................O.O.
.......................O.
.......................OO

:p72 quasi-shuttle (p72) The following oscillator, found by Jason Summers in August 2005. Although this looks at first sight like a shuttle, it isn't really.

..............................O......
.............................OO......
............................O.OO.....
.OOOO......................OOO..O....
O....O.......................O.O.O...
O...O.O.......................O.O.O..
.O...O.O......OO...............O..OOO
.......O.....O.O................OO.O.
.......O.....O...................OO..
....O..O.....OOO.................O...
.....OO..............................
.....................................
.....OO..............................
....O..O.....OOO.................O...
.......O.....O...................OO..
.......O.....O.O................OO.O.
.O...O.O......OO...............O..OOO
O...O.O.......................O.O.O..
O....O.......................O.O.O...
.OOOO......................OOO..O....
............................O.OO.....
.............................OO......
..............................O......

:p7 bouncer (p7) Noam Elkies' colour-changing glider reflector using a p7 pipsquirter, with a minimum repeat time of 28 ticks. A high-clearance version is shown in p7 pipsquirter. For colour-preserving glider reflectors see p7 bumper and the stable Snark reflector.

.......................O.
......................O..
......................OOO
.........................
.........................
.........................
.........................
................O........
......OO.......O.........
......O.O......OOO.......
........O................
...O..O.OO.........OO....
...OOOO..O.....OO..OO....
.......OOO....O.O........
...OOOO..O.....O.........
..O...O.OO...............
.O.OOOO.O........OO......
.O.O..O.O........O.......
OO.O.O.O.OO.......OOO....
O..OOO.O..O.........O....
..O...O.O................
...OO.O.OO...............
....O....................
..O.O.OOOO...............
.O.OOOO..O...............
.O.....O.................
..OOOOOO.O...............
....O...O.O..............
.......O..O..............
........OO...............

:p7 bumper (p7) A periodic colour-preserving glider reflector with a minimum repeat time of 35 ticks. For an equivalent colour-changing periodic glider reflector see p7 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

......O..................
....O.O.......OO.....OO..
.....OO......O..O...O..O.
.........................
.......OO.......O...O....
......O..O....O.......O..
......O.O.....OO.....OO..
.......O.........O.O.....
.............O..OO.OO..O.
..OO........O.O..O.O..O.O
...O........O..O.O.O.O..O
OOO.............O...O....
O........................

:p7 pipsquirter A pipsquirter oscillator found by Noam Elkies in August 1999, used in various hasslers and the colour-changing p7 reflector.

................O.....
........O.......O.....
.OO...OOO..O..........
..O..O...OOO..O...O.OO
..O.O.OO....OOO.O.OO.O
OO..O.O.OOOO....O.....
.O.OO........OOO.OOOO.
.O....O.O.OO...O.O..O.
OO.O.O.OO....O.O......
.O.O......OOOO.O......
.O..OOOOOO....O.......
OO....O..O..O.........
............OO........

A larger period-7 pipsquirter is used in cases where space is limited where the reflector should extend southward for as short a distance as possible:

.....OO..................................
......OOO................................
....O....O...............................
..OOOOOO.O.............................O.
.O.....O.OO....OO.....................O..
.O.OO.O....O..O.O.....................OOO
..O...O.OO.O..O..........................
....O.O..O.OO.O..........................
...OO...O.....OO.........................
..O..OO.O.OOOO..O...OO...................
O..O...O.O...O.O...O.O..........O........
OO.O...O..OO.O..OOOO..OO.......O.........
.O.O.OO.O.O.O.O.O...OO..O......OOO.......
O..OOO..O.....O....O..O.O................
O.O...O.OO...OO....O.OO.OO.........OO....
.O.OOOO..O..O.O....O.....O.....OO..OO....
...O...O......OO...O..OOOO....O.O........
...O.OO..O..O.O....O.....O.....O.........
....O.O.OO...OO....O.OO.OO...............
......O.O.....O....O..O.O........OO......
......O.O...O.O.O...OO..O........O.......
.......O...O.O..OOOO..OO..........OOO....
...........O.O.O...O.O..............O....
............OO.OO...OO...................

:p7 reflector Traditional name for p7 bouncer before 2016, but with the discovery of the p7 bumper this has become an ambiguous reference.

:p8 bouncer A glider reflector constructed by Noam Elkies in September 1998, with a minimum repeat time of 24 ticks. It is a constellation containing a figure-8, boat, eater1, and block. For colour-preserving glider reflectors see p8 bumper and the stable Snark reflector.

................O.
...............O..
...............OOO
..................
..................
..................
..........O.......
.........O........
.........OOO......
..................
.............OO...
.........OO..OO...
........O.O.......
.........O........
.....O............
....O.O....OO.....
...O...O...O......
..O...O.....OOO...
.O...O........O...
O...O.............
.O.O..............
..O...............

:p8 bumper A periodic colour-preserving glider reflector with a blocker attached to provide the necessary spark. The minimum repeat time is 40 ticks. For an equivalent colour-changing periodic glider reflector see p8 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

....................O..
....................O.O
....................OO.
.......................
.......................
.......................
.......................
.......................
.......................
.......................
..........O............
..........O.O..........
..........OO...........
.......................
........OO.............
.OO....O..O............
.OO.....O.O............
.OO......O.............
..O....................
.O.O.........OO........
OO.O.........O.........
..............OOO......
................O......
.OO....................
.OO....................

:p8 G-to-H A small periodic variant of a stable two-glider-to-Herschel component found by Paul Callahan in November 1998 and used in the Callahan G-to-H, Silver reflector and Silver G-to-H. The minimum repeat time is 192 ticks, though some lower periods such as 96 are possible via overclocking. Here a ghost Herschel marks the output signal location:

....O.........O...................
....OOO.....OOO...................
.......O...O......................
..O...OO...OO.....................
...O..............................
.OOO..............................
..................................
..................................
..................................
...............................O..
...............................O..
....................OO.........OOO
....................OO...........O
........OO........................
.......O..O.......................
..OO....OO........................
.O.O..............................
.O................................
OO................................
..........OO......................
..........O.......................
...........OOO....................
.............O...........OO.......
.....................OO..OO.......
....................O.O...........
.....................O............
.................O................
................O.O....OO.........
...............O...O...O..........
..............O...O.....OOO.......
.............O...O........O.......
............O...O.................
.............O.O..................
..............O...................

:p8 reflector Traditional name for p8 bouncer before 2016, but with the discovery of the p8 bumper this has become an ambiguous reference.

:p90 gun A glider gun with true period 90. The one below by Dean Hickerson uses the output of two p30 guns in a period-multiplying reaction:

......................................O.........................
......................................OOOO......................
................................OO.....OOOO.......O.............
...........................O...O..O....O..O......O.O............
..........................O.O...OO.....OOOO....OO...O...........
.........OO...............OO.O........OOOO.....OO...O.........OO
.........O.O..............OO.OO.......O........OO...O.........OO
....OO......O.............OO.O...................O.O............
OO.O..O..O..O.............O.O.....................O.............
OO..OO......O........O.....O...........O.O......................
.........O.O.......O.O.................OO.......................
.........OO.........OO..................O.......................
................................................................
................................................................
...........................................OO...................
...........................................OO...................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
........................................OO......................
........................................O.......................
.........................................OOO....................
...........................................O....................

:p92 gun A glider gun with a true period of 92. The first one was found by Bill Gosper in 1971 using a period doubling reaction using two p46 guns. Many different p92 guns are known that use multiple twin bees shuttles. A period 92 gun can also be made by adding a semi-cenark to any period 46 glider gun.

On 18 November 2017, Martin Grant found a new gun using one twin bees shuttle and one Tanner's p46 oscillator, making it the smallest known p92 gun.

....OO..............O.........................
.....O.............O.O........................
.....O.O...........O.O........................
......OO..OO.....OOO.OO....................OO.
..........OO....O..........................OO.
.................OOO.OO........O..............
...................O.OO....OO..O..............
.......OO.O.O.............O.....O...........OO
.......OO.O.O............OO..O.O............OO
.......OO...O.............OO...O..............
.......OO....OO......OO....OOO................
O......OO.....OO.....OO.......................
OOO.......OOO.O............OOO................
...O.....OO...O.O.O.......OO...O..............
..O.O......O..O...O......OO..O.O............OO
..OO.......O.O..O.O.......O.....O...........OO
...........................OO..O..............
..OO...........................O..............
..O........................................OO.
....O......................................OO.
...OO.........................................
........OO....................................
.........O.....................O..............
......OOO.......................O.............
......O.......................OOO.............

:p9 bumper A periodic colour-preserving glider reflector with a repeat time of 36. Unlike the p5 through p8 cases where Noam Elkies' domino spark-based reflectors are available, no small period-9 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.

........................O..
........................O.O
........................OO.
...........................
...........................
...........................
...........................
...........................
...........................
...............O...........
......OO.......O.O.........
.....O.O.......OO..........
.OO..O.....................
.O.O.OO......OO............
...O...O....O..O...........
O..O.O.OO....O.O...........
OOO..O.O......O............
...OO.O....................
..O..O..O.........OO.......
...OOOOOO.........O........
...................OOO.....
.....OO..............O.....
.....OO....................

:pair of bookends = bookends

:pair of tables = table on table

:paperclip (p1) A relatively 180-degree rotationally symmetric 14-bit still life. The Iwona methuselah contains a paperclip in its ash.

..OO.
.O..O
.O.OO
OO.O.
O..O.
.OO..

:parallel grey ship = with-the-grain grey ship

:Parallel HBK ((6,3)c/245912, p245912) A much smaller successor to the half-baked knightship, constructed by Chris Cain in September 2014. Several slow-salvo recipes are needed to support the multi-glider salvo seeds at the upstream end of the spaceship. "Parallel" means that these recipes are sent in parallel instead of one after the other, in series, as in the original HBK.

:Parallel HBK gun An armless constructor pattern that is programmed to build Parallel HBK oblique spaceships every 125906944 ticks. This gun was created by Chris Cain on 3 January 2015.

:parasite A self-sustaining reaction attached to the output of a rake or puffer, that damages or modifies the standard output. Compare tagalong. In 2009, while experimenting with novelty generator patterns in Golly, Mitchell Riley discovered parasites on glider streams from p20 and p8 backward rakes. In some cases, parasites can even "reproduce", as in the pattern below, though the number of copies is limited since they will eventually use up their host glider stream:

......O.............O.........
.....OOO...........OOO........
...OO.OOO.........OOO.OO......
....O..O.OO.....OO.O..O.......
.OO.O....O.O...O.O....O.OO....
.OO.O.O..O.OO.OO.O..O.O.OO....
.O........O.O.O.O........O....
OO.......OO.O.O.OO.......OO...
............O.O...............
.......OOO.O...O.OOO..........
......OO...........OO.........
......O.....O....OO..O........
.....OO....OOO...OO..O........
...........O.OO...OOO.........
............OOO....O..........
............OOO...............
............OOO...............
............OO................
..............................
...................O.O........
....................OO........
...............OO...O.........
........OO......OO............
.......OO......O..............
.........O....................
..............................
..............................
.................OO...........
..........O......OOO..........
.........OOO.O...OOO..........
........OO.O.....OOO..........
........OO......O.OO..........
........OO......OOO....OO.....
........OO.OO....O.....O......
.........OO...........OO......
..........OOO.O...O.OOO.......
...............O.O............
...OO.......OO.O.O.OO.......OO
....O........O.O.O.O........O.
....OO.O.O..O.OO.OO.O..O.O.OO.
....OO.O....O.O...O.O....O.OO.
.......O..O.OO.....OO.O..O....
......OO.OOO.........OOO.OO...
........OOO...........OOO.....
.........O.............O......

:parent A pattern is said to be a parent of the pattern it gives rise to after one generation. Some patterns have infinitely many parents, but others have none at all (see Garden of Eden). Typically parents are considered trivial if they contain groups of cells that can be removed without changing the result, such as isolated faraway cells.

:parent cells The three cells that cause a new cell to be born.

:parity Even or odd, particularly as applied to the phase of an oscillator or spaceship. For example, in slow salvo constructions, the intermediate targets are frequently period 2, most often because they contain blinkers or traffic lights. A glider striking a P2 constellation will generally produce a different result depending on its parity. Period-4 intermediate targets are rare (or not used), so it doesn't matter for example whether an odd-parity glider in a slow salvo is phase 1 or phase 3. Only the even/odd parity is important.

:partial result An intermediate object found by a search program which might be a substantial part of a complete spaceship or oscillator, but which isn't complete.

Running a partial result works for a few generations until the speed of light corruption from any unfinished edge destroys the whole object. But a partial result can still be used to see whether the object (if ever finished) would provide a desired spark or perturbation. If no partial results are found then it is likely that no such object exists under the constraints of the search.

Very large partial results can indicate that there is a good chance that the object being searched for might actually exist (but this is no guarantee). Rerunning the search using the partial result as a base and relaxing some constraints, widening or adjusting the search area, or splitting the object into multiple arms might result in finding a complete working object.

As an example, here is a large partial result for a period 6 knightship found by Josh Ball in April 2017. The first 22 columns were rediscovered in 2018 as part of the successful search for Sir Robin. See also almost knightship for an earlier small example by Eugene Langvagen.

....OOO...................
...O..OO..................
...O....O.................
..........................
...OOO...OO.OOO...........
.OO.O.O....O.OO...........
...O..O....O..OO..........
O..O........O.............
O....O..OO..O..O..........
.O.OOO..OO...OO...........
...OO.O.OO.O...O..........
.........OO.OOO...........
.........O.....O..........
............OOO..OOO......
...............O.OO.......
..........OO.O...OOO......
..........OO..O..OO.......
............OOOO...O......
.............OO.O..O......
...........OO.O.O.O.......
..............O...........
...........O.......OO.....
............OO.....OO.....
..............OO.O........
................OOO..O.O..
................OO...O....
.................O........
..................OOOOO.O.
...................OO..OOO
...................OO....O
.......................OO.

:PD = pentadecathlon

:PD hassler = p29 pentadecathlon hassler

:PD-pair reflector A pair of pentadecathlons arranged so that their V sparks turn a glider by 90 degrees. The minimum repeat time is 45 ticks.

..............OOO......
.......................
.............O...O.....
.............O...O.....
.......................
..............OOO......
.......................
.......................
..............OOO......
.......................
.............O...O.....
.............O...O.....
....................O..
..............OOO...O.O
....................OO.
.......................
O..O.OO.O..O...........
OOOO.OO.OOOO...........
O..O.OO.O..O...........
This was found by Mark Niemiec on 6 January 1996, which is relatively recent considering how old pentadecathlon technology is.

:pedestle (p5) An oscillator found by Dave Buckingham in 1973.

.....O.....
....O.O....
.O..OO.....
.OOO.......
.....OOO...
...OO...O..
..O....O..O
.O.O.O.O.OO
.O.O...O.O.
OO.O.O.O.O.
O..O....O..
..O...OO...
...OOO.....
.......OOO.
.....OO..O.
....O.O....
.....O.....

:penny lane (p4) Found by Dave Buckingham, 1972.

...OO.....OO...
...O.......O...
OO.O.......O.OO
OO.O.OOOOO.O.OO
....O..O..O....
.....OOOOO.....
...............
.......O.......
......O.O......
.......O.......

:pentadecathlon (p15) Found in 1970 by Conway while tracking the history of short rows of cells, 10 cells giving this object, which is the most natural oscillator of period greater than 3. In fact it is the fifth most common oscillator overall, appearing in random soups slightly more frequently than the clock, but much less frequently than the blinker, toad, beacon or pulsar. The pentadecathlon can be constructed using just three gliders, as shown in glider synthesis.

..O....O..
OO.OOOO.OO
..O....O..

The pentadecathlon is the only known oscillator that has two phases that are different polyominoes. It produces accessible V sparks and domino sparks, which give it a great capacity for doing perturbations, especially for period 30 based technology. See relay for example.

:pentant (p5) Found by Dave Buckingham, July 1976.

OO........
.O........
.O.O......
..OO....OO
.........O
.....OOOO.
.....O....
..O...OOO.
..OOOO..O.
.....O....
....O.....
....OO....

:pentaplet Any 5-cell polyplet.

:pentapole (p2) The barberpole of length 5.

OO......
O.O.....
........
..O.O...
........
....O.O.
.......O
......OO

:pentoad (p5) Found by Bill Gosper, June 1977. This is extensible: if an eater is moved back four spaces then another Z-hexomino can be inserted. (This extensibility was discovered by Scott Kim.)

...........OO
...........O.
.........O.O.
.........OO..
.....OO......
......O......
......O......
......OO.....
..OO.........
.O.O.........
.O...........
OO...........

:pentomino Any 5-cell polyomino. There are 12 such patterns, and Conway assigned them all letters in the range O to Z, loosely based on their shapes. Only in the case of the R-pentomino has Conway's label remained in common use, but all of them can nonetheless be found in this lexicon.

:period The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form. The term can also be used for a puffer, wick, fuse, superstring, stream of spaceships, factory or gun. In the last case there is a distinction between true period and pseudo period. There is also a somewhat different concept of period for wicktrailers.

:period doubler See period multiplier.

:periodic For circuit mechanisms, "periodic" is the opposite of p1 or stable. Periodic circuits necessarily contain oscillators, and therefore they can generally only accept input signals that are synchronized to the combined period of those oscillators (but see universal regulator).

For signal streams, "periodic" means that signals will only be present in the stream at one out of every n ticks, where n is the period of the stream. In a periodic intermittent stream there may be gaps, so that signals do not always appear at every nth tick. However, if a signal does appear, its distance measured in ticks from previous and future signals will always be an exact multiple of n.

:period multiplier A term commonly used for a pulse divider, because dividing the number of signals in a regular stream by N necessarily multiplies the period by N. The term "period multiplier" can be somewhat misleading in this context, because most such circuits can accept input streams that are not strictly periodic.

Reactions have also been found to period double or period triple the output of some rakes to create high-period rakes in a relatively small space (i.e., an exponential increase in period for a linear increase in size).

For Herschel signals and glider guns, a number of small period doubler, tripler, and quadrupler mechanisms are known. For example, the following conduit produces one output glider after accepting four input B-heptominoes, or four Herschels if a conduit such as F117 is prepended that includes the same BFx59H converter.

....................O........................
....................OOO......................
.......................O.....................
............OO........OO.....................
.............O...............................
.............O.O.............................
OO............OO.............................
O.O..........................................
..O..........................................
..OO.........................................
.............................................
.............................................
...........................................OO
...........................................OO
.............................................
.O...OO......................................
.OO..OO......................................
..OO.........................................
.OO..........................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.................................OO..........
.........OO......................OO..........
........O.O..................................
........O....................................
.......OO....................................

See semi-Snark and tremi-Snark for additional examples using glider streams. As of June 2018 no stable period-multiplying elementary conduits are known for a multiplication factor of five or higher, though it is easy to construct composite ones.

:permanent switch A signal-carrying circuit that can be modified so that it cleanly absorbs any future signals instead of allowing them to pass. Optionally there may be a separate mechanism to restore the circuit to its original function.

In the following example, a glider from the northeast (shown) will perform a simple block pull that switches off an F166 conduit, so that any future Herschel inputs will be cleanly absorbed. A glider from the southwest (also shown) can restore the block to its original position.

.OO........................................................
..O........................................................
.O.........................................................
.OO...............................................OO.......
...................................................O.......
..................................................O........
..................................................OO.......
..................................O........................
..................................O.O......................
O...OO............................OO.......................
OO..OO.....................................................
.OO......................OO................................
OO.......................OO..........................OO....
.....................................................OO....
...........................................................
...........................................................
...........................................................
...........................................................
.............OO............................................
............O.O........OO..................................
..............O.......O.O..................................
......................O....................................
.....................OO.........................OO.........
................................................OO.........
...........................................................
...........................................................
..................................OO.....................OO
...................................O......................O
................................OOO....................OOO.
................................O......................O...
............................................OO.............
............................................O..............
.............................................OOO...........
...............................................O...........

:perpendicular grey ship = against-the-grain grey ship

:perturb To change the fate of an object by reacting it with other objects. Typically, the other objects are sparks from spaceships or oscillators, or are eaters or impacting spaceships. Perturbations are typically done to turn a dirty reaction into a clean one, or to change the products of a reaction. In many desirable cases the perturbing objects are not destroyed by the reaction, or else are easily replenished.

:perturbation = perturb.

:PF35W One of the three elementary conduits used in the composite Fx176 Herschel conduit. It converts an input pi-heptomino into an output wing in 35 ticks. In November 2017, Aidan F. Pierce discovered the compact PF35W variant below, which improved the repeat time of the Fx176 to 73 ticks and allowed gliders from following dependent conduits to escape freely:

O.........OO...
OOO....OO..O...
...O..O..OO....
..OO...OO..OOO.
.........O.O..O
.........O...OO
..........O....
.........OO....
...............
...............
...............
...............
...OOO.........
.....O.........
...OOO.........
...............
...............
...............
...............
...............
...............
...............
...............
..OO...........
...O...........
OOO............
O..............
Several variants of the key catalyst are known, including welded additions for the Fx176 that absorb the following Herschel's first natural glider, since a standard fishhook eater doesn't quite fit. The following is a complete Fx176 conduit incorporating the new PF45W:
   ......................O...........................
......................OOO...OO....................
..............OO.........O..O..OO.................
..............OO........OO...OO..O................
...............................O.OOO..............
...............................O....O.OO..........
................................O.O.O.O.O.........
...............................OO.OO...O..........
OO................................................
.O...................................OOOOO........
.O.O.................................O...O........
..OO...................................O..........
.........................OOO..........OOO.........
...........................O.............O........
.........................OOO............OO........
..................................................
..................................................
..................................................
..O...............................................
..O.O...............................OO...........O
..OOO...............................OO.........OOO
....O..........................................O..
...............................................O..
..............OO........OO........................
..............OO..OO.....O........................
..................O.O.OOO.........................
....................O.O...........................
....................OO....OO......................
.........................O.O....OO................
.........................O......OO................
........................OO........................

:phase A representative generation of a periodic object such as an oscillator or spaceship. The number of phases is equal to the period of the object. The phases of an object usually repeat in the same cyclic sequence forever, although some perturbations can cause a phase change.

:phase change A perturbation of a periodic object that causes the object to skip forward or backward by one or more phases. If the perturbation is repeated indefinitely, this can effectively change the period of the object. An example of this, found by Dean Hickerson in November 1998, is shown below. In this example, the period of the oscillator would be 7 if the mold were removed, but the period is increased to 8 because of the repeated phase changes caused by the mold's spark.

..........O....
.........O.OO..
..OO.........O.
..O......O..O.O
.......O...O..O
OOOOOO.O....OO.
O..............
.OO.OO...OO....
..O.O....O.O...
..O.O......O...
...O.......OO..

The following pattern demonstrates a p4 c/2 spaceship found by Jason Summers, in which the phase is changed as it deletes a forward glider. This phase change allows the spaceship to be used to delete a glider wave produced by a rake whose period is 2 (mod 4).

........O...........................
.......OOO.OO.......................
......OO...O.OO.....................
.....OO..O.....O....................
......O.....O...O.OOO...............
.....OO.....O...O.O..O..............
...OO.O.OO....O.O.O...O.............
....O.O..OO...........O.............
.OO.O..O..O.........O...............
.OO.O.....OO.........O.OOO..........
.O.O.............OOO.O.O.OO.........
OO.OO...........OO.O..O.O.O.........
..............OO.O...OOO..OO.....OO.
.............O...O......O........O.O
............O.....O..OO.O.OO.....O..
...........O..O.O......O.O..........
...........O.....OO....OOO..........
.............O..........O...........
..........O.O...........O...........
.........OO.O.OOO...................
........O.O.O...O...................
.......OO.O.........................
......O...O.....OO..................
....................................
......OO.OO.........................

Phase changing reactions have enabled the construction of spaceships having periods that were otherwise unknown, and also allow the construction of period-doubling and period-tripling convoys to easily produce very high period rakes.

See also blinker puffer.

:phase shift = phase change

:phi The following common spark. The name comes from the shape in the generation after the one shown here.

.OOO.
O...O
O...O
.OOO.
One oscillator which produces this spark is Tanner's p46. The pentadecathlon produces a slightly corrupted version of this spark.

:phi calculator (p1 circuitry) See pi calculator.

:phoenix Any pattern all of whose cells die in every generation, but which never dies as a whole. A spaceship cannot be a phoenix, and in fact every finite phoenix eventually evolves into an oscillator. The following 12-cell oscillator (found by the MIT group in December 1971) is the smallest known phoenix, and is sometimes called simply "the phoenix".

....O...
..O.O...
......O.
OO......
......OO
.O......
...O.O..
...O....
This is extensible and is just the first of a family of phoenixes made by joining components together to form a loop. Here is another member of this family.
.....................O.......O......
.....................O.O.....O.O....
.................O.O.....O.O........
.................O.......O......OO..
.....O.......O.O....................
.....O.O.....O...................O..
...O.....O.O........................
.........O........................OO
..OO................................
..................................O.
.O..................................
................................OO..
OO........................O.........
........................O.O.....O...
..O...................O.....O.O.....
....................O.O.......O.....
..OO......O.......O.................
........O.O.....O.O.................
....O.O.....O.O.....................
......O.......O.....................
Every known phoenix oscillator has period 2. In January 2000, Stephen Silver showed that a period 3 oscillator cannot be a phoenix. The situation for higher periods is unknown.

An easy synthesis of the phoenix is possible using four blocks as seeds. A puffer creating a growing row of phoenixes has the unusual property that the percentage of live cells that stay alive for more than one generation approaches zero. See lone dot agar for an example of an infinite phoenix.

:pi = pi-heptomino

:Pianola breeder A series of patterns by Paul Tooke in 2010, based on a simplification and extension of the Gemini spaceship's construction mechanism. Tooke produced a number of slow-salvo-constructed patterns with superlinear growth, including a series of breeder patterns of previously unknown types. For some patterns, the Gemini's two construction arms were moved to a permanent stationary platform, using fourteen glider-loop channels instead of twelve.

Some of these breeder patterns remain difficult to classify unambiguously. For example, one pattern was designed to be an MSS breeder - a modified Gemini spaceship puffing slide guns which build lines of blocks. However, the slide guns produce both moving and stationary objects at a linear rate, because streams of gliders are needed to reach out to the construction zone to do the push reaction and build more blocks. The pattern could therefore be classified as a hybrid MSM/MSS breeder. Other breeder patterns utilizing slide guns and universal constructor technology are likely to cause similar classification ambiguities.

:pi calculator (p1 circuitry) A device constructed by Adam P. Goucher in February 2010, which calculates the decimal digits of pi (the transcendental number, not the Life pattern!) and displays them in the Life universe as 8x10 dot matrix characters formed by arrangements of blocks along a diagonal stripe at the top. A push reaction moves a ten-block diagonal cursor to the next position as part of the "printing" operation for each new digit.

The actual calculation is done in binary, using a streaming spigot algorithm based on linear fractional transformations. The pi calculator is made up of a 188-state computer connected to a printing device via period-8 regulators and a binary-to-decimal conversion mechanism. The complete pattern can be found in Golly's Very Large Patterns online archive, along with the very similar 177-state phi calculator which uses a simpler algorithm to calculate and print the Golden Ratio.

:pi climber The reaction that defines rate of travel of the Caterpillar spaceship. A pi climber consists of a pi-heptomino "climbing" a chain of blinkers, moving 17 cells every 45 ticks, and leaving behind an identical chain of blinkers, shifted downward by 6 cells. A single pi climber does not produce any gliders or other output, but two or more of them travelling on nearby blinker chains can be arranged to emit gliders every 45 ticks. Compare Herschel-pair climber.

..O..
..O..
..O..
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
..O..
.OOO.
.O.O.

:pi-heptomino (stabilizes at time 173) A common pattern. The name is also applied to later generations of this object. In a pi ship, for example, the pi-heptomino itself never arises.

OOO
O.O
O.O

:pincers = great on-off

:pinwheel (p4) Found by Simon Norton, April 1970. Compare clock II.

......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O...OO.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:pi orbital (p168) Found by Noam Elkies, August 1995. In this oscillator, a pi-heptomino is turned ninety degrees every 42 generations. A second pi can be inserted to reduce the period to 84.

..............OO....OO....OO...............................
.............O..O.O....O.O..O..............................
.............OOO..........OOO..............................
................OO......OO.................................
...............O..OOOOOO..O................................
...............OO........OO................................
...........................................................
........O.............................OO..........O........
.......O...OOO......O.........O.......OO.........O.O.......
........O.OOOOO..........OOO...O...........................
............O...O.....O.OOOOO.O..................O.........
............OO....OOO.....O......................OO........
............OO....OOO....OO...................OOOOO........
...................O.....OO...................OO.OO.....OO.
.................................................O......O.O
.....................................................OO.O.O
.....................................................O.O.O.
.......................................................O...
...................................OOO.........O.O...O..O..
.......OO..........................O..O........O..O.....O..
.......OO..............................O.......O.O..O...O..
...................................O..O.............O...O..
...................................OOO..................O..
.....................................................O..O..
................................................O......O...
.............................................OO.OO...O.O.O.
.............................................OOOOO...OO.O.O
.........O......................................OO......O.O
........O.O.....................................O.......OO.
...........................................................
.OO.......O.....................................O.O........
O.O......OO......................................O.........
O.O.OO...OOOOO.............................................
.O.O.O...OO.OO.............................................
...O......O................................................
..O..O.....................................................
..O........................................................
..O...O....................................................
..O...O..O.O......................................OO.......
..O.....O..O......................................OO.......
..O..O...O.O...............................................
...O.......................................................
.O.O.O.....................................................
O.O.OO.....................................................
O.O......O.................................................
.OO.....OO.OO...................OO.....O...................
........OOOOO...................OO....OOO....OO............
........OO......................O.....OOO....OO............
.........O..................O.OOOOO.O.....O...O............
...........................O...OOO..........OOOOO.O........
.......O.O.........OO.......O.........O......OOO...O.......
........O..........OO.............................O........
...........................................................
................................OO........OO...............
................................O..OOOOOO..O...............
.................................OO......OO................
..............................OOO..........OOO.............
..............................O..O.O....O.O..O.............
...............................OO....OO....OO..............

:pi portraitor (p32) Found by Robert Wainwright in 1984 or 1985. Compare with gourmet and popover.

...........OO...........
......OO.O....O.OO......
......O..........O......
.......OO......OO.......
....OOO..OOOOOO..OOO....
....O..O........O..O....
.OO.O.O..........O.O.OO.
.O.O.O............O.O.O.
...O................O...
.O..O..............O..O.
....O.......OOO....O....
O...O.......O.O....O...O
O...O.......O.O....O...O
....O..............O....
.O..O..............O..O.
...O................O...
.O.O.O............O.O.O.
.OO.O.O..........O.O.OO.
....O..O........O..O....
....OOO..OOOOOO..OOO....
.......OO......OO.......
......O..........O......
......OO.O....O.OO......
...........OO...........

:pipsquirt = pipsquirter

:pipsquirter An oscillator that produces a domino spark that is orientated parallel to the direction from which it is produced (in contrast to domino sparkers like the pentadecathlon and HWSS, which produce domino sparks perpendicular to the direction of production). See p6 pipsquirter, p7 pipsquirter.

:pi ship A growing spaceship in which the back part consists of a pi-heptomino travelling at a speed of 3c/10. The first example was constructed by David Bell. All known pi ships are too large to show here, but the following diagram shows how the pi fuse works.

............O............
...........O.O...........
OO........OO.OO........OO
OO.....................OO

:piston (p2) Found in 1971.

OO.......OO
O.O..O..O.O
..OOOO..O..
O.O..O..O.O
OO.......OO

:pi wave A line of pi-heptominoes stabilizing one another. For example, an infinite line of pi-heptominoes arranged as shown below produces a pi wave that moves at a speed of 3c/10 with period 30, and leaves no debris.

OOO...............OOO...............OOO...............OOO
O.O...............O.O...............O.O...............O.O
O.O...............O.O...............O.O...............O.O

:pixel = cell

:plet = polyplet

:polyomino A finite collection of orthogonally connected cells. The mathematical study of polyominoes was initiated by Solomon Golomb in 1953. Conway's early investigations of Life and other cellular automata involved tracking the histories of small polyominoes, this being a reasonable way to ascertain the typical behaviour of different cellular automata when the patterns had to be evolved by hand rather than by computer. Polyominoes have no special significance in Life, but their extensive study during the early years lead to a number of important discoveries and has influenced the terminology of Life. (Note on spelling: As with "dominoes" the plural may also be spelt without an e. In this lexicon I have followed Golomb in using the longer form.)

It is possible for a polyomino to be an oscillator. In fact there are infinitely many examples of such polyominoes, namely the cross and its larger analogues. The only other known examples are the block, the blinker, the toad, the star and (in two different phases) the pentadecathlon.

A polyomino can also be a spaceship, as the LWSS, MWSS and HWSS show.

:polyplet A finite collection of orthogonally or diagonally connected cells. This king-wise connectivity is a more natural concept in Life than the orthogonal connectivity of the polyomino.

:pond (p1)

.OO.
O..O
O..O
.OO.

:pond on pond (p1) This term is often used to mean bi-pond, but may also be used of the following pseudo still life.

.OO...OO.
O..O.O..O
O..O.O..O
.OO...OO.

:popover (p32) Found by Robert Wainwright in August 1984. Compare with gourmet and pi portraitor.

.....................O..........
.....................O..........
.....................OOO........
.............OO.......OO........
.............OO..OOO..OO........
...................OOO..........
...................OOO..........
..............OO................
..OOO........O..O...............
..OOO........O.O................
OOO..OO...O...O....OOO..........
.....OO...O.....................
....OOO...O.....................
....O.................OO...OO...
....O...........OOO..O..O..OO...
........O.......O.O...O.O.......
.......O.O......O.O....O........
...OO..O..O................O....
...OO...OO.................O....
.....................O...OOO....
.....................O...OO.....
..........OOO........O...OO..OOO
.................OO........OOO..
................O..O.......OOO..
................O.O.............
..........OOO....O..............
..........OOO...................
........OO..OOO..OO.............
........OO.......OO.............
........OOO.....................
..........O.....................
..........O.....................

:population The number of ON cells.

:P-pentomino Conway's name for the following pentomino, a common spark.

OO
OO
O.

:PPS (c/5 orthogonally, p30) A pre-pulsar spaceship. Any of three different p30 c/5 orthogonal spaceships in which a pre-pulsar is pushed by a pair of spiders. The back sparks of the spaceship can be used to perturb gliders in many different ways, allowing the easy construction of c/5 puffers. The first PPS was found by David Bell in May 1998 based on a p15 pre-pulsar spaceship found by Noam Elkies in December 1997. See also SPPS and APPS.

The pattern below shows the basic mechanism of a PPS. The two isolated sparks at the left and right sides are the edge sparks from the two supporting spiders.

...O.....O...
..O.O...O.O..
.............
..OOO...OOO..
.............
.............
.............
..OOO...OOO..
.............
O.O.O...O.O.O
...O.....O...

:pre-beehive The following common parent of the beehive.

OOO
OOO

:pre-block The following common parent of the block. Another such pattern is the grin.

O.
OO

:precursor = predecessor

:predecessor Any pattern that evolves into a given pattern after one or more generations.

:pre-pre-block A common predecessor to the pre-block (and thus the block):

O.O
.OO
This is easily created by a two-glider collision. Hitting the pre-pre-block with a glider can create a MWSS. Both of these reactions are shown below:
.O..........
..O.........
OOO.........
............
............
...OOO....OO
.....O...OO.
....O......O

:pre-pulsar A common predecessor of the pulsar, such as that shown below. This duplicates itself in 15 generations. (It fails, however, to be a true replicator because of the way the two copies then interact.)

OOO...OOO
O.O...O.O
OOO...OOO

A pair of tubs can be placed to eat half the pre-pulsar as it replicates; this gives the p30 oscillator Eureka where the pre-pulsar's replication becomes a movement back and forth. See twirling T-tetsons II for a variation on this idea. By other means the replication of the pre-pulsar can be made to occur in just 14 generations as half of it is eaten; this allows the construction of p28 and p29 oscillators. The pre-pulsar was also a vital component of the first known p26 and p47 oscillators.

See also PPS.

:pre-pulsar spaceship = PPS.

:pressure cooker (p3) Found by the MIT group in September 1971. Compare mini pressure cooker.

.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O...O...
....OOO....
...........
...O.OO....
...OO.O....

:primer A pattern originally constructed by Dean Hickerson in November 1991 that emits a stream of LWSSs representing the prime numbers. Some improvements were found by Jason Summers in October 2005.

:PRNG = pseudo-random number generator

:propagator = linear propagator

:protein (p3) Found by Dave Buckingham, November 1972.

....OO.......
....O........
......O......
..OOOO.O.OO..
.O.....O.O..O
.O..OO.O.O.OO
OO.O.....O...
...O..OO.O...
...O....O....
....OOOO.....
.............
....OO.......
....OO.......

:pseudo Opposite of true. A gun emitting a period n stream of spaceships (or rakes) is said to be a pseudo period n gun if its mechanism oscillates with a period greater than n. This period will necessarily be a multiple of n. If the base mechanism's period is instead a fraction of n, then a period multiplier must also be present which is considered to be part of the mechanism, and the gun as a whole is still a true period gun. For example, a filter may be used on a lower-period gun to produce a compound gun such as the true p48 gun.

Pseudo period n glider guns are known to exist for all periods greater than or equal to 14, with smaller periods being impossible. All known p14 guns are pseudo guns requiring several signal injections, so they are quite large. The following smaller example is a pseudo period 123 gun, interleaving the streams from two true period 246 guns:

..................................O...........................
..................................OOO.........................
................................OO...O........................
...............................O.O.OO.O.......................
..............................O..O..O.O.......................
....................................O.OO......................
..................................O.O.........................
......................OOO.......O.O.O.........................
.................................OO.OO........................
.....................O..O.....................................
OO...................OOO......................................
.O............................................................
.O.O...................OO.OO..................................
..OO...............OO..OO.O.O............OO...................
...................OO..OO...O............O....................
...........................OOO.........O.O...........OO.......
.......................OO..OOO.........OO............O.O......
..................O.O..OOO............................OOO.....
..................O.O...OO.............................OO.....
...................O.................................O.O......
................................................OO..O.O.......
................................................O.O..O........
.................................................OOOO.........
.............................OO...................OO..........
.............................OO...............................
..............................................................
..............................................................
.....................................OOOO.....................
....................................OOOOO.O...................
.....................................O..O.O...................
.....O...................................OO...................
....O.OOOO.............................O.O....................
...O.O.OOO..........................OO............O.........OO
..O.O..............................O.OOOO..........O........O.
...O...............................O...OO........OOO......O.O.
...OO.............OO................OO.O..................OO..
...OO.............O.O................OOO......................
...OO..............OOO........................................
....................OO........................................
..................O.O.........................................
.............OO..O.O..........................................
.............O.O..O...........................................
..............OOOO..............................OO............
...............OO...............................OO............
....................OO.OO.....................................
.....................O.O......................................
.....................O........................................
..................OO.O..O.....................................
...................O.O.OOO....................................
...................O.OO...O...................................
....................O...OO....................................
.....................OOO......................................
.......................O......................................

The same distinction between true and pseudo also exists for puffers.

:pseudo-barberpole (p5) Found by Achim Flammenkamp in August 1994. In terms of its minimum population of 15 this is the smallest known p5 oscillator. See also barberpole.

..........OO
...........O
.........O..
.......O.O..
............
.....O.O....
............
...O.O......
............
..OO........
O...........
OO..........

:pseudo-random glider generator A pseudo-random number generator in which the bits are represented by the presence or absence of gliders. The first pseudo-random glider generator was built by Bill Gosper. David Bell built the first moving one in 1997, using c/3 rakes.

:pseudo-random number generator A pseudo-random number generator (PRNG) is an algorithm that produces a sequence of bits that looks random (but cannot really be random, being algorithmically determined).

In Life, the term refers to a PRNG implemented as a Life pattern, with the bits represented by the presence or absence of objects such as gliders or blocks. Such a PRNG usually contains gliders or other spaceships in a loop with a feedback mechanism that causes later spaceships to interfere with the generation of earlier spaceships. The period can be very high, as a loop of n spaceships has 2n possible states.

:pseudo still life A stable pattern whose live cells are either immediately adjacent to each other, or are connected into a single group by adjacent dead cells where birth is suppressed by overpopulation.

The definition of strict still life rules out such stable patterns as the bi-block. In such patterns there are dead cells which have more than 3 neighbours in total, but fewer than 3 in any component still life. These patterns are called pseudo still lifes, and have been enumerated up to 32 bits, as shown in the table below.

  --------------
  Bits    Number
  --------------
   8           1
   9           1
  10           7
  11          16
  12          55
  13         110
  14         279
  15         620
  16        1645
  17        4067
  18       10843
  19       27250
  20       70637
  21      179011
  22      462086
  23     1184882
  24     3068984
  25     7906676
  26    20463274
  27    52816265
  28   136655095
  29   353198379
  30   914075620
  31  2364815358
  32  6123084116
  --------------

Attribution of these counts is given in strict still life; see also https://oeis.org/A056613. The unique 32-bit triple pseudo still life is included in the last count in the table. As the number of bits increases, the pseudo still life count goes up exponentially by approximately O(2.56n). By comparison, the rate for strict still lifes is about O(2.46n) while for quasi still lifes it's around O(3.04n).

If a stable pattern's live cells plus its overpopulated dead cells do not form a single mutually adjacent group, the pattern is usually referred to as a constellation. It is also a still life in the general sense, but is neither "pseudo" nor "strict".

:puffer An object that moves like a spaceship, except that it leaves debris behind. The first known puffers were found by Bill Gosper and travelled at c/2 orthogonally (see diagram below for the very first one, found in 1971).

.OOO......O.....O......OOO.
O..O.....OOO...OOO.....O..O
...O....OO.O...O.OO....O...
...O...................O...
...O..O.............O..O...
...O..OO...........OO..O...
..O...OO...........OO...O..

Not long afterwards c/12 diagonal puffers were found (see switch engine). Discounting wickstretchers, which are not puffers in the conventional sense, no new velocity was obtained after this until David Bell found the first c/3 orthogonal puffer in April 1996. Other new puffer speeds followed over the next several years.

Many spaceships that travel orthogonally at a speed less than c/2 have useful side or back sparks. These can be used to perturb standard spaceships that approach from behind. A common technique for creating puffers for a new speed uses a convoy of the new spaceships to create debris from an approaching standard spaceship such that a new standard spaceship is recreated on the same path as the original one. This forms a closed loop, resulting in a high-period puffer for the new speed.

As of June 2018, puffers have been found matching every known velocity of elementary spaceship, except for c/6 and c/7 diagonal and (2,1)c/6. It is also generally easy to create puffers based on macro-spaceships, simply by removing some part of the trailing cleanup mechanism.

:puffer engine A pattern which can be used as the main component of a puffer. The pattern may itself be a puffer (e.g. the classic puffer train), it may be a spaceship (e.g. the Schick engine), or it may even be unstable (e.g. the switch engine).

:pufferfish (c/2, p12) A puffer discovered by Richard Schank in November 2014, from a symmetric soup search using an early version of apgsearch. It consists of a pair of B-heptominoes stabilised by a backend that leaves only pairs of blocks behind. It is simple enough to be easily synthesized with gliders.

...O.......O...
..OOO.....OOO..
.OO..O...O..OO.
...OOO...OOO...
...............
....O.....O....
..O..O...O..O..
O.....O.O.....O
OO....O.O....OO
......O.O......
...O.O...O.O...
....O.....O....
See soup for a random initial pattern, generated by apgsearch and recorded in Catagolue, that produces a pufferfish.

:pufferfish spaceship (c/2, p36) Generally, any spaceship constructed using pufferfish. May refer specifically to the extensible c/2 spaceship constructed by Ivan Fomichev in December 2014, the first such spaceship to contain no period-2 or period-4 parts. (The first two or three rows might be considered to be period 2 or 4, but they are directly dependent on following rows for support.).

The pattern consists of two adjacent pufferfish puffers, plus four copies of a nontrivial period 36 c/2 fuse for pufferfish exhaust, discovered using a randomized soup search.

.......O.......O..................O.......O........
......OOO.....OOO................OOO.....OOO.......
.....O..OO...OO..O..............OO.O.....O.OO......
.....O...O...O...O...............OO.O...O.OO.......
......OO.OO.OO.OO..............O.OO.......OO.O.....
......OO.O...O.OO.............O.O..O.O.O.O..O.O....
........O.....O...............O.O...OO.OO...O.O....
.........OO.OO.................OOO.O.....O.OOO.....
....OO..O.....O..OO.............OOO.......OOO......
....OO..O.....O..OO.............OO.........OO......
................................O...........O......
........O.O.O.O................OO...........OO.....
........OO...OO................OO...........OO.....
...................................................
...................................OO...OO.........
...................O..........O....OO...OO.........
...O..............OOO........OOO..............O....
..OOO...OO...O.O.OO.O.......OO.O.............OOO...
.OO..O..OO.........O........OOO.............OO.O...
.OOOO.O......O...O.O........OOO.............OO.....
OO.....O.......OO..OO.......OOOO..............OO...
.O................O..O......O..O...........O..OO...
.O.OOO..O....O.O..OO.......OO..............O....O..
.O.O...OO....O.O..OO...O....O.O...........O..O.O...
.OO......O..O.......O..O....OOO..........OO...OO...
O.....O.O....O.O....O.OO................O..........
.OO..O..O....O......O.OO............O....OO........
.OO...OO.......OO...OO.OO..OO......OOOOOO..........
........................O....O....O.O.O.O.......OOO
..............................O...O..O.........O...
..............................O....O..........O....
.............................O.................O.O.

:puffer train The full name for a puffer, coined by Conway before any examples were known. The term was also applied specifically to the classic puffer train found by Bill Gosper and shown below. This is very dirty, and the tail does not stabilize until generation 5533. It consists of a B-heptomino (shown here one generation before the standard form) escorted by two LWSS. (This was the second known puffer. The first is shown under puffer.)

.OOO...........OOO
O..O..........O..O
...O....OOO......O
...O....O..O.....O
..O....O........O.
In April 2006, Jason Summers found a way to make the classic puffer train into a p20 spaceship by adding a glider at the back:
OOO...........OOO.
O..O..........O..O
O......OOO....O...
O.....O..O....O...
.O.O..O...O....O.O
.......OOOO.......
.........O........
..................
..................
..................
.......OOO........
.......O..........
........O.........

:puff suppressor An attachment at the back of a line puffer that suppresses all or some of its puffing action. The example below (by Hartmut Holzwart) has a 3-cell puff suppressor at the back which suppresses the entire puff, making a p2 spaceship. If you delete this puff suppressor then you get a p60 double beehive puffer. Puff suppressors were first recognised by Alan Hensel in April 1994.

............O....................
..........OO.O...................
..........OO...O.................
........O...OO.O.....O...........
........OOOO.OO...OOOO.......O.O.
......O......O....OOO.....O.O..O.
......OOOOOOO...O...O....O..O....
...O.O......OO..O...O.O.OO....O..
..OOOOOOOOO.....O..OO........O...
.OO..............O.OO.OOOO...O..O
OO....OO.O..........O...O..O.O...
.OO....O........OOO......O.O.O..O
.........O......OO......O....OO..
.OO....O........OOO......O.O.O..O
OO....OO.O..........O...O..O.O...
.OO..............O.OO.OOOO...O..O
..OOOOOOOOO.....O..OO........O...
...O.O......OO..O...O.O.OO....O..
......OOOOOOO...O...O....O..O....
......O......O....OOO.....O.O..O.
........OOOO.OO...OOOO.......O.O.
........O...OO.O.....O...........
..........OO...O.................
..........OO.O...................
............O....................

:pull A reaction, most often mediated by gliders, that moves an object closer to the source of the reaction. See block pull, blinker pull, loaf pull; also elbow.

:pulsar (p3) Despite its size, this is the fourth most common oscillator (and by far the most common of period greater than 2) and was found very early on by Conway. See also pre-pulsar, pulsar quadrant, and quasar.

..OOO...OOO..
.............
O....O.O....O
O....O.O....O
O....O.O....O
..OOO...OOO..
.............
..OOO...OOO..
O....O.O....O
O....O.O....O
O....O.O....O
.............
..OOO...OOO..

:pulsar 18-22-20 = two pulsar quadrants

:pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases.)

:Pulsar Pixel Display (p30 circuitry) A large-scale raster line display device constructed by Mark Walsh in August 2010, where pulsars form the individual pixels in an otherwise empty grid. The published sample pattern displays and erases eight 7x5-pixel characters on each of two lines of text.

:pulsar quadrant (p3) This consists of a quarter of the outer part of a pulsar stabilized by a cis fuse with two tails. This is reminiscent of mold and jam. Found by Dave Buckingham in July 1973. See also two pulsar quadrants.

.....O..
...OOO..
..O...OO
O..O..O.
O...O.O.
O....O..
........
..OOO...

:pulse A moving object, such as a spaceship or Herschel, which can be used to transmit information. See pulse divider.

Also another name for a pulsar quadrant.

:pulse divider A mechanism that lets every n-th object that reaches it pass through, and deletes all the rest, where n > 1 and the objects are typically gliders, spaceships or Herschels. A common synonym is period multiplier. For n=2, the simplest known stable pulse dividers are the semi-Snarks.

The following diagram shows a p5 glider pulse divider by Dieter Leithner (February 1998). The first glider moves the centre block and is reflected at 90 degrees. The next glider to come along will not be reflected, but will move the block back to its original position. The relatively small size and low period of this example made it useful for constructing compact glider guns of certain periods, but it became largely obsolete with the discovery of the stable CC semi-Snark, which uses the same basic mechanism. Period 7, 22, 36 and 46 versions of this pulse divider are also known.

.....OO...................
.....OO...................
..........................
..................OO......
.................O..O.....
.................O.O..O..O
O...............OO.O.OOOOO
.OO...........O...OO......
OO...............OO..OOO..
.............O...O.O..O.O.
........OO.......OO..OO.O.
........OO....O...OO...O..
................OO.O.OO...
.................O.O.O....
.................O.O..O...
..................O..OO...
..OO......................
...O......................
OOO.......................
O.........................
..........................
............OO............
............O.............
.............OOO..........
...............O..........

:pulshuttle V (p30) Found by Robert Wainwright, May 1985. Compare Eureka.

.............O..............O.............
............O.O.......O....O.O............
.............O......OO.OO...O.............
......................O...................
..OO......OO..................OO......OO..
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO........OO.OO.....OO......OO..
......................O...................
..........................................
..........................................
..OO......OO..................OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O......OO.OO...O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO..................OO......OO..
..........................................
..........................................
......................O...................
..OO......OO........OO.OO.....OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
..OO......OO..................OO......OO..
......................O...................
.............O......OO.OO...O.............
............O.O.......O....O.O............
.............O..............O.............

:pure glider generator A pattern that evolves into one or more gliders, and nothing else. There was some interest in these early on, but they are no longer considered important. Here's a neat example:

..O............
..O............
OOO............
...............
......OOO......
.......O.......
............OOO
............O..
............O..

:push A reaction that moves an object farther away from the source of the reaction. See sliding block memory, pi calculator, elbow, universal constructor. See also pull, fire.

:pushalong Any tagalong at the front of a spaceship. The following is an example found by David Bell in 1992, attached to the front of a MWSS.

..OOO.O.....
.OOOO.O.....
OO..........
.O.O........
..OOOO.O....
...OOO......
............
............
......OOOOO.
......O....O
......O.....
.......O...O
.........O..

:pyrotechnecium (p8) Found by Dave Buckingham in 1972.

.......O........
.....OOOOO......
....O.....O.....
.O..O.O.OO.O....
O.O.O.O....O..O.
.O..O....O.O.O.O
....O.OO.O.O..O.
.....O.....O....
......OOOOO.....
........O.......

:pyrotechneczum A common mistaken spelling of pyrotechnecium, caused by a copying error in the early 1990s.

:python = long snake


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/fix-lex-files.py0000644000175000017500000000400213171233731017601 00000000000000# Fix lexicon .htm files included with iOS/Android/web Golly. # # We replace this text: # #

"temp" — the directory Golly uses to store various temporary files. All these files are deleted when Golly quits.

"rules" — the user-specific rules directory set in Preferences > Control.

"files" — the directory displayed by File > Show Files.

"download" — the directory Golly uses to store downloaded files.

In each case a full path is returned, terminated by the appropriate path separator for the current platform ("/" on Mac and Linux, "\" on Windows).
Example: g.open(g.getdir("app").."Patterns/Life/Breeders/breeder.lif")

setdir(dirname, dirpath)
Set the specified directory to the given path (which must be a full path to an existing directory). All the directory names listed above are allowed, except for "app", "data" and "temp".
Example: g.setdir("download", "/path/to/my-downloads/")

getfiles(dirpath)
Return the contents of the given directory as an array of strings. A non-absolute directory path is relative to the location of the script. File names are returned first, then subdirectory names. The latter names end with the platform-specific path separator ("/" on Mac and Linux, "\" on Windows). See slide-show.lua for an example.

getinfo()
Return the comments from the current pattern.
Example: local comments = g.getinfo()

getpath()
Return the pathname of the current open pattern. Returns "" if the current pattern is new and has not been saved.
Example: local path = g.getpath()

 
EDITING COMMANDS

new(title)
Create a new, empty universe and set the window title. If the given title is empty then the current title won't change.
Example: g.new("test-pattern")

cut()
Cut the current selection to the clipboard.

copy()
Copy the current selection to the clipboard.

clear(where)
Clear inside (where = 0) or outside (where = 1) the current selection.
Example: g.clear(1)

paste(x, y, mode)
Paste the clipboard pattern at x,y using the given mode ("and", "copy", "or", "xor").
Example: g.paste(0, 0, "or")

shrink(remove_if_empty=false)
Shrink the current selection to the smallest rectangle enclosing all of the selection's live cells. If the selection has no live cells then the optional parameter specifies whether the selection remains unchanged or is removed.
Example: if #g.getselrect() > 0 then g.shrink(true) end

randfill(percentage)
Randomly fill the current selection to a density specified by the given percentage (1 to 100).
Example: g.randfill(50)

flip(direction)
Flip the current selection left-right (direction = 0) or top-bottom (direction = 1).

rotate(direction)
Rotate the current selection 90 degrees clockwise (direction = 0) or anticlockwise (direction = 1).

evolve(cell_array, numgens)
Advance the pattern in the given cell array by the specified number of generations and return the resulting cell array.
Example: local newpatt = g.evolve(currpatt, 100)

join(cell_array1, cell_array2)
Join the given cell arrays and return the resulting cell array. If the given arrays are both one-state then the result is one-state. If at least one of the given arrays is multi-state then the result is multi-state, but with one exception: if both arrays have no cells then the result is {} (an empty one-state array) rather than {0}. See below for a description of one-state and multi-state cell arrays.
Example: local result = g.join(part1, part2)

transform(cell_array, x0, y0, axx=1, axy=0, ayx=0, ayy=1)
Apply an affine transformation to the given cell array and return the resulting cell array. For each x,y cell in the input array the corresponding xn,yn cell in the output array is calculated as xn = x0 + x*axx + y*axy, yn = y0 + x*ayx + y*ayy.
Example: local rot_blinker = g.transform(blinker, 0, 0, 0, -1, 1, 0)

parse(string, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1)
Parse an RLE or Life 1.05 string and return an optionally transformed cell array.
Example: local blinker = g.parse("3o!")

putcells(cell_array, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1, mode="or")
Paste the given cell array into the current universe using an optional affine transformation and optional mode ("and", "copy", "not", "or", "xor").
Example: g.putcells(currpatt, 6, -40, 1, 0, 0, 1, "xor")

getcells(rect_array)
Return any live cells in the specified rectangle as a cell array. The given array can be empty (in which case the cell array is empty) or it must represent a valid rectangle of the form {x,y,width,height}.
Example: local cells = g.getcells( g.getrect() )

getclip()
Parse the pattern data in the clipboard and return the pattern's width, height, and a cell array. The width and height are not necessarily the minimal bounding box because the pattern might have empty borders, or it might even be empty.
Example: local wd, ht, cells = g.getclip()

hash(rect_array)
Return an integer hash value for the pattern in the given rectangle. Two identical patterns will have the same hash value, regardless of their location in the universe. This command provides a fast way to detect pattern equality, but there is a tiny probability that two different patterns will have the same hash value, so you might need to use additional (slower) tests to check for true pattern equality.
Example: local h = g.hash( g.getrect() )

select(rect_array)
Create a selection if the given array represents a valid rectangle of the form {x,y,width,height} or remove the current selection if the given array is {}.
Example: g.select( {-10,-10,20,20} )

getrect()
Return the current pattern's bounding box as an array. If there is no pattern then the array is empty ({}), otherwise the array is of the form {x,y,width,height}.
Example: if #g.getrect() == 0 then g.show("No pattern.") end

getselrect()
Return the current selection rectangle as an array. If there is no selection then the array is empty ({}), otherwise the array is of the form {x,y,width,height}.
Example: if #g.getselrect() == 0 then g.show("No selection.") end

setcell(x, y, state)
Set the given cell to the specified state (0 for a dead cell, 1 for a live cell).

getcell(x, y)
Return the state of the given cell. The following example inverts the state of the cell at 0,0.
Example: g.setcell(0, 0, 1 - g.getcell(0, 0))

setcursor(string)
Set the current cursor according to the given string and return the old cursor string. The given string must match one of the names in the Cursor Mode menu.
Example: local oldcurs = g.setcursor("Draw")

getcursor()
Return the current cursor as a string (ie. the ticked name in the Cursor Mode menu).

 
CONTROL COMMANDS

run(numgens)
Run the current pattern for the specified number of generations. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is true.
Example: g.run(100)

step()
Run the current pattern for the current step. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is true.

setstep(exp)
Temporarily set the current step exponent to the given integer. A negative exponent sets the step size to 1 and also sets a delay between each step, but that delay is ignored by the run and step commands. Golly will reset the step exponent to 0 upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setstep(0)

getstep()
Return the current step exponent.
Example: g.setstep( g.getstep() + 1 )

setbase(base)
Temporarily set the current base step to an integer from 2 to 2,000,000,000. The current exponent may be reduced if necessary. Golly will restore the default base step (set in Preferences > Control) upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setbase(2)

getbase()
Return the current base step.

advance(where, numgens)
Advance inside (where = 0) or outside (where = 1) the current selection by the specified number of generations. The generation count does not change.
Example: g.advance(0, 3)

reset()
Restore the starting pattern and generation count. Also reset the algorithm, rule, scale, location and step exponent to the values they had at the starting generation. The starting generation is usually zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

setgen(gen)
Set the generation count using the given string. Commas and other punctuation marks can be used to make a large number more readable. Include a leading +/- sign to specify a number relative to the current generation count.
Example: g.setgen("-1,000")

getgen(sepchar='\0')
Return the current generation count as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getgen(',') would return a string like "1,234,567" but g.getgen() would return "1234567". Use the latter call if you want to do arithmetic on the generation count because then it's easy to convert the string to a number.
Example: local gen = tonumber( g.getgen() )

getpop(sepchar='\0')
Return the current population as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getpop(',') would return a string like "1,234,567" but g.getpop() would return "1234567". Use the latter call if you want to do arithmetic on the population count. The following example converts the population to a number.
Example: local pop = tonumber( g.getpop() )

empty()
Return true if the universe is empty or false if there is at least one live cell. This is much more efficient than testing getpop() == "0".
Example: if g.empty() then g.show("All cells are dead.") end

numstates()
Return the number of cell states in the current universe. This will be a number from 2 to 256, depending on the current algorithm and rule.
Example: local maxstate = g.numstates() - 1

numalgos()
Return the number of algorithms (ie. the number of items in the Set Algorithm menu).
Example: local maxalgo = g.numalgos() - 1

setalgo(string)
Set the current algorithm according to the given string which must match one of the names in the Set Algorithm menu.
Example: g.setalgo("HashLife")

getalgo(index=current)
Return the algorithm name at the given index in the Set Algorithm menu, or the current algorithm's name if no index is supplied.
Example: local lastalgo = g.getalgo( g.numalgos() - 1 )

setrule(string)
Set the current rule according to the given string. If the current algorithm doesn't support the specified rule then Golly will automatically switch to the first algorithm that does support the rule. If no such algorithm can be found then you'll get an error message and the script will be aborted.
Example: g.setrule("b3/s23")

getrule()
Return the current rule as a string in canonical format.
Example: local oldrule = g.getrule()

getwidth()
Return the width (in cells) of the current universe (0 if unbounded).
Example: local wd = g.getwidth()

getheight()
Return the height (in cells) of the current universe (0 if unbounded).
Example: local ht = g.getheight()

 
VIEWING COMMANDS

setpos(x, y)
Change the position of the viewport so the given cell is in the middle. The x,y coordinates are given as strings so the viewport can be moved to any location in the unbounded universe. Commas and other punctuation marks can be used to make large numbers more readable. Apart from a leading minus sign, most non-digits are simply ignored; only alphabetic characters will cause an error message. Note that positive y values increase downwards in Golly's coordinate system.
Example: g.setpos("1,000,000,000,000", "-123456")

getpos(sepchar='\0')
Return the x,y position of the viewport's middle cell in the form of two strings. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting strings more readable. For example, g.getpos(',') might return two strings like "1,234" and "-5,678" but g.getpos() would return "1234" and "-5678". Use the latter call if you want to do arithmetic on the x,y values, or just use the getposint() function defined in the gplus package.
Example: local x, y = g.getpos()

setmag(mag)
Set the magnification, where 0 corresponds to the scale 1:1, 1 = 1:2, -1 = 2:1, etc. The maximum allowed magnification is 5 (= 1:32).
Example: g.setmag(0)

getmag()
Return the current magnification.
Example: g.setmag( g.getmag() - 1 )

fit()
Fit the entire pattern in the viewport.

fitsel()
Fit the current selection in the viewport. The script aborts with an error message if there is no selection.

visrect(rect_array)
Return true if the given rectangle is completely visible in the viewport. The rectangle must be an array of the form {x,y,width,height}.
Example: if not g.visrect({0,0,1,1}) then g.setpos("0","0") end

setview(wd, ht)
Set the pixel width and height of the viewport (the main window will be resized accordingly).
Example: g.setview(32*32, 32*30)

getview(index=-1)
Return the pixel width and height of the viewport if the given index is -1 (the default), or the pixel width and height of the specified layer if the given index is an integer from 0 to numlayers() - 1.
Example: local wd, ht = g.getview()

autoupdate(bool)
When Golly runs a script this setting is initially false. If the given parameter is true then Golly will automatically update the viewport and the status bar after each command that changes the universe or viewport in some way. Useful for debugging scripts.
Example: g.autoupdate(true)

update()
Immediately update the viewport and the status bar, regardless of the current autoupdate setting. Note that Golly always does an update when a script finishes.

 
LAYER COMMANDS

overlay(command)
Call a command to create, modify or delete the overlay, a rectangular area of pixels that can be displayed on top of the current layer.
Example: g.overlay("create 400 300")

ovtable(command)
Call a command to modify the overlay, a rectangular area of pixels that can be displayed on top of the current layer. This command takes a table as a parameter rather than a string (for improved performance) and supports the following overlay commands: fill, get, line, lines, paste, rgba and set.
Example: g.ovtable{"line", 0, 0, 200, 300}

addlayer()
Add a new, empty layer immediately after the current layer and return the new layer's index, an integer from 0 to numlayers() - 1. The new layer becomes the current layer and inherits most of the previous layer's settings, including its algorithm, rule, scale, location, cursor mode, etc. The step exponent is set to 0, there is no selection, no origin offset, and the layer's initial name is "untitled".
Example: local newindex = g.addlayer()

clone()
Like addlayer (see above) but the new layer shares the same universe as the current layer. The current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled).
Example: local cloneindex = g.clone()

duplicate()
Like addlayer (see above) but the new layer has a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized.
Example: local dupeindex = g.duplicate()

dellayer()
Delete the current layer. The current layer changes to the previous layer (unless layer 0 was deleted).

movelayer(fromindex, toindex)
Move a specified layer to a new position in the layer sequence. The chosen layer becomes the current layer.
Example: g.movelayer(1, 0)

setlayer(index)
Set the current layer to the layer with the given index, an integer from 0 to numlayers() - 1.
Example: g.setlayer(0)

getlayer()
Return the index of the current layer, an integer from 0 to numlayers() - 1.
Example: local currindex = g.getlayer()

numlayers()
Return the number of existing layers, an integer from 1 to maxlayers().
Example: if g.numlayers() > 1 then g.setoption("tilelayers",1) end

maxlayers()
Return the maximum number of layers (10 in this implementation).

setname(string, index=current)
Set the name of the given layer, or the current layer's name if no index is supplied.
Example: g.setname("temporary")

getname(index=current)
Return the given layer's name, or the current layer's name if no index is supplied.
Example: if g.getname() == "temporary" then g.dellayer() end

setcolors(color_array)
Set the color(s) of one or more states in the current layer and its clones (if any). If the given array contains a multiple of 4 integers then they are interpreted as state, red, green, blue values. A state value of -1 can be used to set all live states to the same color (state 0 is not changed). If the given array contains exactly 6 integers then they are interpreted as a color gradient from r1, g1, b1 to r2, g2, b2 for all the live states (state 0 is not changed). If the given array is empty then all states (including state 0) are reset to their default colors, depending on the current algorithm and rule. Note that the color changes made by this command are only temporary. Golly will restore the default colors if a new pattern is opened or created, or if the algorithm or rule changes, or if Preferences > Color is used to change any of the default colors for the current layer's algorithm.

# .O.....
# ...O...
# OO..OOO
# 
etc... # # with: # #

# .O.....
# ...O...
# OO..OOO
# 
# # We also increase font size used for links at top and bottom of each page. import re # ------------------------------------------------------------------------------ def fix_file(filename): print 'fixing ' + filename f = open(filename, 'r') contents = f.read() # use re.DOTALL to include newlines in match for pattdata in re.findall('\n(.*?)', contents, re.DOTALL): newdata = pattdata.replace('\n','$') contents = contents.replace('\n'+pattdata+'', ''+pattdata+'', 1) # remove small font used for links at top and bottom of each page contents = contents.replace('', '', 2) contents = contents.replace('Z', 'Z', 2) f.close() f = open(filename, 'w') f.write(contents) f.close() # ------------------------------------------------------------------------------ fix_file("lex.htm") fix_file("lex_1.htm") fix_file("lex_a.htm") fix_file("lex_b.htm") fix_file("lex_c.htm") fix_file("lex_d.htm") fix_file("lex_e.htm") fix_file("lex_f.htm") fix_file("lex_g.htm") fix_file("lex_h.htm") fix_file("lex_i.htm") fix_file("lex_j.htm") fix_file("lex_k.htm") fix_file("lex_l.htm") fix_file("lex_m.htm") fix_file("lex_n.htm") fix_file("lex_o.htm") fix_file("lex_p.htm") fix_file("lex_q.htm") fix_file("lex_r.htm") fix_file("lex_s.htm") fix_file("lex_t.htm") fix_file("lex_u.htm") fix_file("lex_v.htm") fix_file("lex_w.htm") fix_file("lex_x.htm") fix_file("lex_y.htm") fix_file("lex_z.htm") fix_file("lex_bib.htm") golly-3.3-src/gui-common/Help/Lexicon/lex_s.htm0000644000175000017500000065175613317135606016433 00000000000000 Life Lexicon (S)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:S Usually means big S, but may sometimes mean paperclip.

:sailboat (p16) A boat hassled by a Kok's galaxy, a figure-8 and two eater3s. Found by Robert Wainwright in June 1984.

........O...........O........
.......O.O.........O.O.......
........O...........O........
.............................
......OOOOO.......OOOOO......
.....O....O.......O....O.....
....O..O.............O..O....
.O..O.OO.............OO.O..O.
O.O.O.....O.......O.....O.O.O
.O..O....O.O.....O.O....O..O.
....OO..O..O.....O..O..OO....
.........OO.......OO.........
.............OO..............
.............O.O.............
........O..O..O..............
.......O.....................
.....OO..........OOO.........
..O......OO.O....OOO.........
.....O...O..O....OOO.........
.....OOO.O...O......OOO......
..O...........O.....OOO......
...O...O.OOO........OOO......
....O..O...O.................
....O.OO......O..............
..........OO.................
.........O...................
.....O..O....................

:salvo A collection of spaceships, usually gliders, all travelling in the same direction. Any valid glider construction recipe can be partitioned into no more than four salvos. Compare flotilla. In contrast with a convoy, the spaceships in a salvo are usually consumed by the reactions that they cause. Simple examples include block pusher and block pull.

Salvos may be slow or synchronized. The following partially synchronized three-glider salvo produces an LWSS from a block.

OO........
OO........
..........
..........
OOO.......
O.........
.O........
..........
.......OOO
.......O..
........O.
..........
..........
..........
..........
..........
..........
.......OOO
.......O..
........O.
The above is a synchronized salvo and not a slow salvo, because the second glider must follow the first with the exact separation shown. The third glider can be considered to be a slow glider, because it will still delete the temporary loaf no matter how many ticks it is delayed. The slow glider construction entry includes an example of a true slow salvo.

:sawtooth Any finite pattern whose population grows without bound but does not tend to infinity. (In other words, the population reaches new heights infinitely often, but also infinitely often returns to some fixed value.) Conway's preferred plural is "sawteeth".

The first sawtooth was constructed by Dean Hickerson in April 1991. The current smallest known sawtooth was found by a conwaylife.com forum user with the online handle 'thunk'. It has a bounding box of 74x60, and is the smallest known sawtooth in terms of its minimum repeating population of 177 cells. The following variant has a higher repeating population of 194 and an optimized bounding box of 62x56:

.....................................................OO.O.....
.....................................................O.OO.....
..............................................................
...........OO.................................................
...........OO.................................................
..............................................................
..............................................................
..............OO............................OO.......OO.....OO
....OO........OO.....................................OO.....OO
.....O.....................................O.O................
....O......OO............................O..............OO....
....OO.....OO........................OO.O.OO............OO....
......................................O.OO....................
.......................................O......................
..............................................................
.................................OO...........................
.................................OO...........................
..............................................................
.............................OO.....OO........................
.............................OO.....OO........................
..............................................................
..............................................................
..............................................................
.....................OOO......................................
.....................O..O.....................................
.....................O.OO.....................................
..............................................................
..............................................................
..............................................................
....................OO............O.........O.................
....................O..O..........O.O.....OOO.................
..OOOO...............OOO..........OO.....O....................
OO....OO.................................OO...................
OO.....O......................................................
..OO.O.O..............OO......................................
.......O..............OO......................................
...O...O..........................O....O......................
...O....O.......................OO.....O......................
.....OOO...O.....................OO...O.O.....................
.....OO....O.........................OO.OO....................
...........OO.......................O.....O...................
.............O.........................O......................
.............OOO....................OO...OO...................
..............................................................
..............................................................
................O.....................O.......................
...............O.OOOOO................O.......................
..............OO.....O...............O........................
..............OO...O..O.......................................
......................O.......................................
................OO.O..O................OO.....................
...................O..O................OO.....................
....................OO........................................
....................OO.....O....O.............................
.........................OO.OOOO.OO...........................
...........................O....O.............................
Patterns combining a fast puffer with a slower spaceship have also been constructed (see moving sawtooth). See also tractor beam.

:SBM = sliding block memory

:Schick engine (c/2 orthogonally, p12) This spaceship, found by Paul Schick in 1972, produces a large spark (the 15 live cells at the rear in the phase shown below) which can be perturbed by other c/2 spaceships to form a variety of puffers. See blinker ship for an example perturbation of the spark. The diagram below shows the smallest form of the Schick engine, using two LWSS. It is also possible to use two MWSSes or two HWSSes, or even an LWSS and an HWSS.

OOOO..............
O...O.........O...
O...........OO....
.O..O..OO.....OOO.
......OOO......OOO
.O..O..OO.....OOO.
O...........OO....
O...O.........O...
OOOO..............

:Schick ship = Schick engine

:scorpion (p1)

...O...
.OOO...
O...OO.
O.O.O.O
.OO.O.O
.....O.

:scrubber (p2) Found in 1971.

....O......
..OOO......
.O.........
.O..OOO....
OO.O...O...
...O...O...
...O...O.OO
....OOO..O.
.........O.
......OOO..
......O....

:SE = switch engine

:seal (c/6 diagonally, p6) The first diagonal c/6 spaceship, found by Nicolay Beluchenko in September 2005.

...O..OO..........................
.OOO.O.O.O........................
.O..OOO..OO.......................
O..OOOOOO.O.OOO...................
.O..OOO.O.OOOOO...................
......O.O.O.O.....................
O.O...O.O.OOOOO...................
O..O.O..O.OO...O..................
...O..OO.......OOO................
.O...OOOOO.OOO..OO................
....O.........O...................
..O.O.........O...................
....OO.OOOOO...O..................
......O.OOO..O.....OO.............
......O..O...O.OOO.OO.............
........OO...OOO.O..O...O.........
........OO....OO.OOOO...OOO.......
...................O.O..O.........
.............O.O.....OO..OO.......
.............O..O.....O.OOO.....O.
.............O...O....OO..O...O..O
...............OOO.....OO........O
...............O.O..O..O.....OO..O
.................O..OO.OO.O..O....
................O.......O.O.......
.................O...OOOO.........
..................O...O...........
..................................
.......................O..........
......................O.O.........
.....................OO...........
.....................O.O..........
.....................OO...........
.......................O..........
......................O...........

:search program A computer program or script that automates the search for Life objects having certain desired properties. These are used because the difficulty of finding previously unknown Life objects now commonly exceeds the patience, speed, and accuracy of humans. Various types of search programs are used for finding objects such as spaceships, oscillators, drifters, catalysts, soups, Gardens of Eden, and slow salvos.

Some search programs generate partial results as they are running, so even if they don't complete successfully, something of use might still be salvaged from the run.

Example search programs are dr, lifesrc, gfind, and Bellman.

There are other types of programs which don't perform searches as such, but instead perform large constructions. These are used to correctly complete very complicated objects such as the Caterpillar, Gemini, Caterloopillar, and universal constructor-based spaceships such as the Demonoids and Orthogonoids.

:second glider domain The second glider domain of an edge shooter is the set of spacetime offsets, relative to the glider stream emitted by the edge shooter, where a second independent glider stream may be present without interfering with the edge shooter. This is useful to know, because edge shooters are often used to generate glider streams very close to other glider streams, to make for example a spaceship gun or converter.

:second natural glider The glider produced at T=72 during the evolution of a Herschel. This is the common edge-shooting glider output used in the NW31 converter and several other converter variants.

:seed A constellation of still lifes and/or oscillators, which can be converted into another Life object when it is struck by one or more gliders. Usually the resulting object is a rare still life or spaceship, more complex than the original constellation. Spartan single-glider (1G) seeds are more commonly seen than multi-glider seeds, because a Spartan 1G seed can be readily constructed and triggered using a slow salvo. See also freeze-dried. For example, the following is a 14sL 1G seed for a c/7 loafer spaceship.

...................................O..........
..................................O...........
..................................OOO.........
.............OO...............................
..............O...............................
..............O.O.............................
...............OO.............................
..............................................
...O..........................................
..O.O.........................................
.O.O..........................................
.OO...........................................
..............OO..............................
.............O.O..............................
.............OO...............................
..............................................
..............................................
..............................................
....................OO........................
...................O.O........................
..........O.........O.........................
.........O.O....O.............................
..........OO...O.O............................
..............O.O.............................
..............OO..............................
..............................................
.............................................O
.........................OO................OOO
....................OO...OO...............O...
...................O..O...................OO..
.O.................O..O.......................
O.O.................OO........................
.OO...........................................
..............................................
..............................................
..............................................
.....................OO.......................
.....................O.O....OO................
......................O.....O.O...............
.............................OO...............
.................................OO...........
.................................OO...........
..............................................
..............................................
......................OO......................
.....................O..O.....................
.....................O..O.....................
......................OO......................

:Seeds of Destruction Game An interactive search application written by Paul Chapman in 2013. Its primary purpose was to assist in the design of self-destruct circuits in self-constructing circuitry. It has also regularly been helpful in completing glider syntheses, and was used to find the 31c/240 base reaction for the shield bug and Centipede spaceships.

:self-constructing A type of pattern, generally a macro-spaceship, that contains encoded construction information about itself, and makes a complete copy of itself using those instructions. The Gemini, linear propagator, spiral growth patterns, Demonoids and Orthogonoid are examples of self-constructing patterns. Self-constructing spaceships often have trivially adjustable speeds. In many cases, the direction of travel can also be altered, less easily, by changing the encoded construction recipe. Compare self-supporting, elementary.

:self-supporting A type of pattern, specifically a macro-spaceship, that constructs signals or tracks or other scaffolding to assist its movement, but does not contain complete information about its own structure. Examples include the Caterpillar, Centipede, half-baked knightship, waterbear, and the Caterloopillars. Caterpillar has been used as a general term for self-supporting spaceships, but it is not very appropriate for the HBKs.

In general a self-supporting pattern cannot be trivially adjusted to alter its speed or direction. The variable speeds of the HBKs and the Caterloopillars are exceptions, but their direction of travel is fixed, and a specific Caterloopillar can't be made to change its speed without completely rebuilding it. Compare self-constructing, elementary.

:semi-cenark Either of two semi-Snark variants discovered by Tanner Jacobi in November 2017. The name is due to the initial converter, which produces a century output for every two input gliders. The minimum safe repeat time is 43 ticks for the smaller initial catalyst shown in CC semi-cenark and CP semi-cenark, or 42 ticks with the slightly larger catalyst variant shown below. There is also overclocking possible at period 36, 38, or 39. The reset glider can be followed immediately by a new trigger glider, as shown below, so the minimum repeat time for an intermittent stream of gliders is only 50 ticks.

O.O.................................
.OO.................................
.O..................................
....................................
....................................
....................................
....................................
....................................
....................................
.........O.O........................
..........OO........................
..........O.........................
.............O......................
..............OO....................
.............OO.....................
.............................O......
...........................OOO......
..........................O.........
..........................OO........
....................................
....................................
......................O.............
..............OO.......OO..O........
..............O..O....OO..O.O.......
............OO..OO........OO........
...........O..OO....................
...........OO...OO..................
................O.O.................
.................O..................
..................................OO
................................O..O
.....................OO.........OOO.
......................O......O......
...................OOO.......OOOO...
...................O............O...
...............................O....
...............................OO...

:semi-Snark Any small stable signal conduit that produces one output glider for every two input gliders, with a 90 degree reflection. These can act as period-doublers for any glider stream whose period is at least equal to their repeat time, and so adding one of these to a single glider gun often results in a pattern much smaller than the older technology of crossing the output of two guns.

The available semi-Snarks differ in their complexity, size, repeat time, and the colour of their output gliders. The CC semi-Snark was the first one found, and the term "semi-Snark" is often used specifically for this object. The "CC" prefix stands for colour-changing, by contrast with the more recently discovered colour-preserving CP semi-Snark.

There are also CC and CP variants of a semi-Snark based on a two-glider to century converter discovered by Tanner Jacobi in November 2017. These semi-cenarks are the fastest semi-Snarks known as of July 2018, with a repeat time as low as 50 ticks, or a periodic input rate as low as 36 ticks.

:sesquihat (p1) Halfway between a hat and a twinhat.

....O..
OO.O.O.
.O.O.O.
.O.O.OO
..O....

:SGR Abbreviation for stable glider reflector. This term is no longer in use.

:shield bug (31c/240 orthogonally, p240) The first 31c/240 macro-spaceship, constructed by Dave Greene on September 9, 2014.

:shillelagh (p1)

OO...
O..OO
.OO.O

:ship (p1) The term is also used as a synonym of spaceship.

OO.
O.O
.OO

A ship can be used as a catalyst in some situations. For example, it can suppress two of the blinkers from an evolving traffic light:

...OO.
...O.O
....OO
......
O.....
OO....
O.....
It is also a one-glider seed for the engine of the queen bee shuttle:
OOO..OO.
..O..O.O
.O....OO

:ship in a bottle (p16) Found by Bill Gosper in August 1994. See also bottle.

....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO...OO...OO...
.......O.O........
.......OO.........
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:ship on boat = ship tie boat

:ship on ship = ship-tie

:ship-tie (p1) The name is by analogy with boat-tie.

OO....
O.O...
.OO...
...OO.
...O.O
....OO

:ship tie boat (p1)

OO....
O.O...
.OO...
...OO.
...O.O
....O.

:short keys (p3) Found by Dean Hickerson, August 1989. See also bent keys and odd keys.

.O........O.
O.OOO..OOO.O
.O..O..O..O.
....O..O....

:shotgun A gun that fires a salvo of multiple spaceships, almost always gliders, on parallel lanes. Two to four shotguns are often combined to turn a glider synthesis into a gun or factory for that synthesis.

:shoulder The fixed upper end of a construction arm, generally consisting of one or more glider guns or edge shooters aimed at an elbow object.

:shuttle Any oscillator which consists of an active region moving back and forth between stabilizing objects. The most well-known examples are the queen bee shuttle (which has often been called simply "the shuttle") and the twin bees shuttle. See also p54 shuttle, p130 shuttle and Eureka. Another example is the p72 R-pentomino shuttle that forms part of the pattern given under factory.

:siamese A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects sharing two or more cells. See snake siamese snake and loaf siamese barge for examples.

:side Half a sidewalk. In itself this is unstable and requires an induction coil.

OO...
O.OOO
....O

:sidecar A small tagalong for an HWSS that was found by Hartmut Holzwart in 1992. The resulting spaceship (shown below) has a phase with only 24 cells, making it in this respect the smallest known spaceship other than the standard spaceships and some trivial two-spaceship flotillas derived from them. Note also that an HWSS can support two sidecars at once.

.O......
O.....O.
O.....O.
OOOOO.O.
........
....OO..
..O....O
.O......
.O.....O
.OOOOOO.

:side-shooting gun = slide gun

:sidesnagger A Spartan eater found by Chris Cain in May 2015 with functionality similar to the eater5, as shown below. It has one lane less diagonal clearance on the high-clearance side than other eater5 variants, due to the presence of the boat. A good use of the sidesnagger can be seen in p130 shuttle. See also highway robber.

..O.............
O.O.............
.OO.............
................
................
................
.........O......
........O.......
........OOO.....
................
................
.........O......
........O.O.....
.......O..O...OO
........OO....OO
....O...........
...O.O..........
...OO...........
.........OO.....
.........OO.....

:side-tracking See universal constructor.

:sidewalk (p1)

.OO.OO
..O.O.
.O..O.
.O.O..
OO.OO.

:siesta (p5) Found by Dave Buckingham in 1973. Compare sombreros.

...........OO...
...OO.....O.O...
...O.O....O.....
.....O...OO.O...
...O.OO.....OOO.
.OOO.....O.O...O
O...O.O.....OOO.
.OOO.....OO.O...
...O.OO...O.....
.....O....O.O...
...O.O.....OO...
...OO...........

:signal Movement of information through the Life universe. Signals can be carried by spaceships, fuses, drifters, or conduits. Spaceships can only transfer a signal at the speed of the spaceship, while fuses can transfer a signal at speeds up to the speed of light.

In practice, many signals are encoded as the presence or absence of a glider or other spaceship at a particular point at a particular time. Such signals can be combined by the collision of gliders to form logic operations such as AND, OR, and NOT gates. Signals can be duplicated using glider duplicators or other fanout devices, and can be used up by causing perturbations on other parts of the Life object.

Signals are used in Herschel conduit circuitry, universal constructors, macro-spaceships, and other computational patterns such as the pi calculator and Osqrtlogt patterns.

:signal elbow A conduit with signal output 90 degrees from its input. This term is commonly used only for signal wires, particularly 2c/3 signals. A Snark could reasonably be called a "glider elbow", but glider reflector is the standard term. A signal elbow with a recovery time less than 20 ticks would enable a trivial proof that Conway's Life is omniperiodic.

A near miss is the following elbow-like converter found by Dean Hickerson. It successfully turns a 2c/3 signal by 90 degrees, but unfortunately changes it to a double-length signal in the process. This means that further copies of the converter can not be appended (e.g., to make a closed loop).

........................O..O......
........................OOOOOO....
..............................O.OO
......................OOOOO.O.O.OO
.....................O......O.O...
.....................OOOOO..O.O...
..................O.......O.OO....
..................OOOOOO..O.......
........................O.O.......
................OOOOOO..O.OO......
..........OO...O......O.O.........
.........O..O..OOOOO..O.O.........
........O.OOO.......O.OO..........
....OO.O.O...OOOOO..O.............
.....O.O...O......O.O.............
.....O.O..OOOOOO..O.OO............
...O.O.O.O......O.O...............
..O.OO..O.OOOO..O.O...............
..O...O.O.O...O.OO................
OO.OO.O.O...O.O...................
.O.O..O.OOOO.O.OOO................
O..O.O.......O...O................
.OOO..OOOOOOOO....................
....O.O...........................
...OO.O..OOOOOOO..................
..O..OO.O.......O.................
..OO....O..OOOOOO.................
........O.O.......................
.......OO.O..OOOOOO...............
..........O.O......O..............
..........O.O..OOOOO..............
...........OO.O.......O...........
..............O..OOOOOO...........
..............O.O.................
.............OO.O..OOOOOO.........
................O.O......O.OO.....
................O.O..OOOOO.OO.....
.................OO.O.............
....................O..OOOOOO.....
....................O.O.....O.....
...................OO.O..OOO......
......................O.O.....OO..
......................O..O....OO..
.......................OO.........

Relatively small composite MWSS elbows can now be constructed, using Tanner Jacobi's 2015 discovery of a small H-to-MWSS component. For example, the Orthogonoid includes a constructor/reflector that reflects an MWSS stream by 180 degrees, but it can be trivially reconfigured to make a 90-degree MWSS elbow.

:Silver G-to-H A variant of the Silver reflector made by substituting an Fx119 conduit for the final NW31, allowing a Herschel output as well as the beehive-annihilating reset glider. It is still Spartan, and as long as the Fx119 is followed by a dependent conduit, it retains the faster 497-tick recovery time.

:Silver reflector A stable glider reflector found by Stephen Silver in November 1998, by substituting an NW31 converter for the second Fx77 conduit in the Callahan G-to-H found a few days previous. The repeat time is 497 ticks:

........O.............O.......................................
......O.O...........OOO.......................................
.......OO..........O..........................................
...................OO.........................................
....OO........................................................
.....O........................................................
.....O.O......................................................
......OO..........O...........................................
.................O.O..........................................
.................O.O..........................................
..................O....OO.....................................
......OO...............O.O....................................
.....O.O.................O....................................
.....O...................OO...................................
....OO........................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...............OO.............................................
...............OO.............................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...OO.........................................................
....O.........................................................
....O.O.......................................................
.....OO.......................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
......OO...............OO.....................................
......OO...............O.O....................................
.........................O....................................
.........................OO...................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...................O..........................................
.................OOO..........................................
................O.............................................
................OO...................OO.......................
....................OO................O.......................
.....................O................O.O.....................
...................O...................OO.....................
...................OO.........................................
..............................................................
..............................................................
............................................................OO
............................................................OO
..............................................................
......................OO......................................
...OO.................OO......................................
...OO.........................................................
..............................................................
..............................................................
..OO..........................................................
...O..........................................................
OOO............OO.............................................
O..............O..............................................
................OOO...........................................
..................O...........................................
..............................................................
..................................................OO..........
..................................................OO..........

:Silver's p5 (p5) The following oscillator found by Stephen Silver in February 2000:

OO.........
O..........
.O..O......
...OO......
...O...O.OO
..O....OO.O
..OO.......

As this has no spark, it appears useless. Nonetheless, in March 2000, David Eppstein found a way to use it to reduce the size of Noam Elkies' p5 reflector.

:Simkin glider gun (p120) A Herschel-based glider gun discovered by Michael Simkin in April 2015. It consists of a Herschel running through two B60 conduits. In terms of its 36-cell minimum population, it is one of the smallest known guns, sharing the record with the Gosper glider gun. In the double-barreled form, as well as the pseudo-period, snake-stabilized form shown below, it is the absolute record holder.

OO.....OO........................
OO.....OO........................
.................................
....OO...........................
....OO...........................
.................................
.................................
.................................
.................................
......................OO.OO......
.....................O.....O.....
.....................O......O..OO
.....................OOO...O...OO
..........................O......
.................................
.................................
.................................
.................................
........................O.OO.....
........................OO.O.....

:single-arm A type of universal constructor using just one construction arm and slow salvo techniques to construct, usually, Spartan or near-Spartan circuitry. Compare two-arm.

:single-channel A type of universal constructor discovered and developed by Simon Ekström and others starting in December 2015. The initial elbow operation toolkit was near-minimal, with just one push, one pull, and one output glider of each colour (see colour of a glider). Later searches produced a much larger and more efficient library.

Single-channel recipes consist of a stream of gliders on a single lane and aimed at a construction elbow, usually separated from each other by at least 90 ticks. In spite of these strict limitations, single-channel recipes can be made to do surprising things. For example, it is possible to build a Snark directly on the construction lane of an active construction arm, starting from a single elbow block. This can allow the arm to reach efficiently around complex obstructions by bending itself through multiple lossless elbows. Known recipes can also remove an elbow when it is no longer needed, by controlled demolition of the Snark.

As of June 2018, almost all single-channel recipes are made up of singletons and synchronized pairs of gliders, but no synchronized triplets or larger groups. This is not an inherent limitation of single-channel construction, but rather a limitation in the search program used to find currently known single-channel toolkits.

A useful byproduct of this limitation is that single-channel recipes can be trivially adjusted to allow them to safely cross perpendicular data streams, including other single-channel recipes (or earlier parts of the same recipe). To avoid collisions with a crossing stream, each singleton glider or glider pair can safely be delayed by any even number of ticks, or technically by any multiple of the period of the current intermediate target. The final result of the construction will not be affected.

:single-channel Demonoid See Demonoid.

:single-lane = single-channel.

:singleton In single-channel recipes, a glider that is not synchronized with a neighboring glider in its stream. Compare glider pair.

:singular flip flop (p2) Found by Robert Wainwright, July 1972.

..O...
..O.O.
O....O
OOOOOO
......
..OO..
..OO..

:sinking ship = canoe

:Sir Robin ((2,1)c/6, p6) The first elementary knightship in Conway's Game of Life, found by Adam P. Goucher on March 6, 2018, based on a partial by Tomas Rokicki.

....OO.........................
....O..O.......................
....O...O......................
......OOO......................
..OO......OOOO.................
..O.OO....OOOO.................
.O....O......OOO...............
..OOOO....OO...O...............
O.........OO...................
.O...O.........................
......OOO..OO..O...............
..OO.......O....O..............
.............O.OO..............
..........OO......O............
...........OO.OOO.O............
..........OO...O..O............
..........O.O..OO..............
..........O..O.O.O.............
..........OOO......O...........
...........O.O.O...O...........
..............OO.O.O...........
...........O......OOO..........
...............................
...........O.........O.........
...........O...O......O........
............O.....OOOOO........
............OOO................
................OO.............
.............OOO..O............
...........O.OOO.O.............
..........O...O..O.............
...........O....OO.OOO.........
.............OOOO.O....OO......
.............O.OOOO....OO......
...................O...........
....................O..OO......
....................OO.........
.....................OOOOO.....
.........................OO....
...................OOO......O..
....................O.O...O.O..
...................O...O...O...
...................O...OO......
..................O......O.OOO.
...................OO...O...OO.
....................OOOO..O..O.
......................OO...O...
.....................O.........
.....................OO.O......
....................O..........
...................OOOOO.......
...................O....O......
..................OOO.OOO......
..................O.OOOOO......
..................O............
....................O..........
................O....OOOO......
....................OOOO.OO....
.................OOO....O......
........................O.O....
............................O..
........................O..OO..
.........................OOO...
......................OO.......
.....................OOO.....O.
........................OO..O.O
.....................O..OOO.O.O
......................OO.O..O..
........................O.O..OO
..........................OO...
......................OOO....O.
......................OOO....O.
.......................OO...OOO
........................OO.OO..
.........................OO....
.........................O.....
...............................
........................OO.....
..........................O....

:six Ls (p3) This is a compact form of loading dock.

...O...
.OOO..O
O...OOO
OOO....
....OOO
OOO...O
O..OOO.
...O...

:sixty-nine (p4) Found by Robert Wainwright, October 1978.

.........O...........
........O.O..........
.....................
......O...OO.........
.....O.....O.........
......O.O............
........OO......O....
................O....
..O.....OO....OOO....
..O...........OO.....
OOO.......OO..OO..OOO
OO......O.OO....OOO..
OO..OOO.O.O.....OOO..
..OOO................
..OOO......O.........
..........O.O........
.....................
........O...OO.......
.......O.....O.......
........O.O..........
..........OO.........

:skewed quad (p2)

.OO....
.O...OO
..O.O.O
.......
O.O.O..
OO...O.
....OO.

:skewed traffic light (p3) Found by Robert Wainwright, August 1989.

.............OO.........
............O..O........
.............O.O........
.........OO...O.........
..........O.OO..........
............O...........
............O...........
........................
OO........OOO......O....
OOOO.O........O...OO....
O.O..OOO.O....O.........
.........O....O.OOO..O.O
....OO...O........O.OOOO
....O......OOO........OO
........................
...........O............
...........O............
..........OO.O..........
.........O...OO.........
........O.O.............
........O..O............
.........OO.............

:sL Abbreviation for still life, used most often in rough measurements of the complexity of a Spartan constellation.

:slide gun A gun which fires sideways from an extending arm. The arm consists of streams of spaceships which are pushing a pattern away from the body of the gun and releasing an output spaceship every time they do so. Each output spaceship therefore travels along a different path.

Dieter Leithner constructed the first slide gun in July 1994 (although he used the term "side shooting gun"). The following pattern shows the key reaction of this slide gun. The three gliders shown will push the block one cell diagonally, thereby extending the length of the arm by one cell, and at the same time they release an output glider sideways. (In 1999, Jason Summers constructed slide guns using other reactions.)

..............OO.
..............OO.
........OOO......
..........O......
.........O.....OO
..............O.O
................O
.................
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...............
.OO..............
O.O..............

:sliding block memory A memory register whose value is stored as the position of a block. The block can be moved by means of glider collisions. See block pusher for an example.

In Conway's original formulation (as part of his proof of the existence of a universal computer in Life) two gliders were used to pull the block inwards by three diagonal spaces, as shown below, and thirty gliders were used to push it out by the same amount.

OO..........
OO..........
............
............
............
.........OOO
OOO......O..
O.........O.
.O..........

Dean Hickerson later greatly improved on this, finding a way to pull a block inwards by one diagonal space using 2 gliders, and push it out the same distance using 3 gliders. In order for the memory to be of any use there also has to be a way to read the value held. It suffices to be able to check whether the value is zero (as Conway did), or to be able to detect the transition from one to zero (as Hickerson did).

Dean Hickerson's sliding block memory is used in Paul Chapman's URM, and the key salvos from it are used in several other complex constructions, such as David Bell's Collatz 5N+1 simulator and Adam P. Goucher's pi calculator and Spartan universal computer-constructor.

:slmake A search program published by Adam P. Goucher in May 2017. It accepts as input a constellation of sufficiently widely separated still lifes, and produces a glider stream that will perform a complete slow glider construction of that constellation, starting from a single block.

One of slmake's primary uses is to make self-constructing patterns much easier to design and build. It is capable of finding recipes not only for Spartan stable circuitry, but also for other useful non-Spartan circuits such as Snarks, syringes, and H-to-MWSS converters, provided that they are separated from other nearby objects by a sufficient amount of empty space.

:slow See slow glider construction.

:slow elbow A movable construction elbow that is controlled by a slow salvo, which most likely comes from a previous elbow in a multi-elbow construction arm. Unlike a standard elbow which is generally fixed on a single construction lane or at least within a narrow range, a slow elbow can move freely in two dimensions as long as there is room for it. Each slow elbow added to a construction arm results in an exponential increase in the cost (in gliders) of the final construction. Compare lossless elbow.

:slow glider construction Construction an object by a "slow salvo" of gliders all coming from the same direction, in such a way that timing of the gliders does not matter as long as they are not too close behind one another. This type of construction requires an initial seed object, such as a block, which is modified by each glider in turn until the desired object is produced.

In May 1997, Nick Gotts produced a slow glider construction of a block-laying switch engine from a block, using a slow salvo of 53 gliders. Constructions like this are important in the study of sparse Life, as they will occur naturally as gliders created in the first few generations collide with blonks and other debris.

Slow glider constructions are also useful in some designs for universal constructors. However, in this case the above definition is usually too restrictive, and it is desirable to allow constructions in which some gliders in the salvo are required to have a particular timing modulo 2 (a "p2 slow salvo"). This gives much greater flexibility, as blinkers can now be freely used in the intermediate construction steps. The Snarkmaker is a very large p2 slow salvo. A much smaller example is the following edgy construction of an eater1 starting from a block.

OO..OOO...............................................
OO..O.................................................
.....O................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
................OOO...................................
................O.....................................
.................O....................................
......................................................
......................................................
......................................................
......................................................
.......................OOO............................
.......................O..............................
........................O.............................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
..............................O.......................
........................O....OO.......................
.......................OO....O.O......................
.......................O.O............................
......................................................
......................................................
..........................O...........................
.........................OO...........................
.........................O.O..........................
......................................................
.............................OOO....................OO
.............................O.....................OO.
..............................O......................O

Adam P. Goucher's slmake search program, made available in May 2017, makes it much easier to find a slow glider construction for a wide variety of stable circuitry.

:slow salvo See slow glider construction.

:small fish = LWSS

:small lake (p1) A 20-cell still life, but technically not actually a lake because it is not constructed entirely out of dominoes.

....O....
...O.O...
...O.O...
.OO...OO.
O.......O
.OO...OO.
...O.O...
...O.O...
....O....

:smiley (p8) Found by Achim Flammenkamp in July 1994 and named by Alan Hensel.

OO.O.OO
...O...
O.....O
.OOOOO.
.......
.......
OOO.OOO

:SMM breeder See breeder.

:smoke Debris that is fairly long-lived but eventually dies completely. Basically, a large spark. This term is used especially when talking about the output from a smoking ship. Some Herschel conduits such as Fx119 also create large amounts of smoke.

:smoking ship A spaceship which produces smoke. If the smoke extends past the edge of the rest of the spaceship, then it can be used to perturb other objects as the spaceship passes by. Running gliders into the smoke is often a good way to turn or duplicate them, or convert them into other objects. Sometimes the smoke from a smoking ship may itself be perturbed by accompanying spaceships in order to form a puffer. A simple example of a smoking ship is the Schick engine.

:snacker (p9) Found by Mark Niemiec in 1972. This is a pentadecathlon with stabilizers which force it into a lower period.

OO................OO
.O................O.
.O.O............O.O.
..OO............OO..
.......O....O.......
.....OO.OOOO.OO.....
.......O....O.......
..OO............OO..
.O.O............O.O.
.O................O.
OO................OO
The stabilizers make the domino spark largely inaccessible, but the snacker is extensible, as shown in the next diagram, and so a more accessible p9 domino spark can be obtained. In April 1998 Dean Hickerson found an alternative stabilizer that is less obtrusive than the original one, and this is also shown in this diagram.
OO................................
.O................................
.O.O.........................OO...
..OO.......................O..O...
.......O....O..............OOO....
.....OO.OOOO.OO...O....O......OOO.
.......O....O...OO.OOOO.OO...O...O
..OO..............O....O......OOO.
.O.O.......................OOO....
.O.........................O..O...
OO...........................OO...
An end can also be stabilized by killer candlefrobras.

:snail (c/5 orthogonally, p5) The first known c/5 spaceship, discovered by Tim Coe in January 1996. For some time it was the slowest known orthogonal spaceship.

.O....................................
.O....................................
O.....................................
.OOO.................OOO...OOO........
.OO.O.........O...O.O......OOO........
..O...........OO.O.......O....OOOO....
......O......O...O.O...OO.O.....OO....
...O..O.OOO...OO.........O........OO.O
...OO.O.....O.....O.................O.
.........O.OOOOOOO....................
......................................
.........O.OOOOOOO....................
...OO.O.....O.....O.................O.
...O..O.OOO...OO.........O........OO.O
......O......O...O.O...OO.O.....OO....
..O...........OO.O.......O....OOOO....
.OO.O.........O...O.O......OOO........
.OOO.................OOO...OOO........
O.....................................
.O....................................
.O....................................

:snake (p1)

OO.O
O.OO

:snake bit An alternative name for a boat-bit. Not a very sensible name, because various other things can be used instead of a snake. A snake, or alternatively an aircraft carrier, is the smallest object that can consume a glider stream by effectively acting as an eater for every two incoming gliders. The one-cell reduction from the smallest real eater, the seven-cell eater1, has been important when trying to construct recent sawtooths where the population must be minimized.

:snake bridge snake (p1)

....OO
....O.
.....O
....OO
OO.O..
O.OO..

:snake dance (p3) Found by Robert Wainwright, May 1972.

...OO.O..
...O.OO..
OO.O.....
.O..O.OOO
O..O.O..O
OOO.O..O.
.....O.OO
..OO.O...
..O.OO...

:snake pit This term has been used for two different oscillators: the p2 snake pit (essentially the same as fore and back)

O.OO.OO
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
OO.OO.O
and the p3 snake pit.
.....OO....
....O..O...
....O.OO...
.OO.O......
O.O.O.OOOO.
O.........O
.OOOO.O.O.O
......O.OO.
...OO.O....
...O..O....
....OO.....

:snake siamese snake (p1)

OO.OO.O
O.OO.OO

:Snark A small stable 90-degree glider reflector with a repeat time of 43 ticks, discovered by Mike Playle on 25 April 2013 using a search utility he wrote called Bellman. Compare boojum reflector. Four common Snark variants are shown below: Playle's original at the top, and variants by Heinrich Koenig, Simon Ekström, and Shannon Omick to the left, bottom, and right, respectively. As of June 2018, only Playle's variant has a known slow glider construction recipe for all orientations.

.............................OO....................
............................O.O....................
......................OO....O......................
....................O..O..OO.OOOO..................
....................OO.O.O.O.O..O..................
.......................O.O.O.O.....................
.......................O.O.OO......................
........................O..........................
...................................................
.....................................OO............
............................OO.......O.............
............................OO.....O.O.............
.........O.........................OO..............
.........OOO.......................................
............O........O.............................
...........OO.......O..............................
....................OOO............................
...................................................
...OO..............................................
...O.....................OO........................
OO.O......................O........................
O..OOO....OO...........OOO.........................
.OO...O...OO...........O......................O....
...OOOO.....................OO..............OOOOO..
...O...............OO........O.............O.....O.
....OOO............O.O.......O.O............OOO..O.
.......O.............O........OO...............O.OO
..OOOOO..............OO.....................OOOO..O
.O..O......................O...........OO...O...OO.
.OO......................OOO...........OO....OOO...
........................O......................O...
........................OO.....................O.OO
..............................................OO.OO
...................................................
...................................................
......................................OO...........
......................................O............
.......................................OOO.........
..............OO.........................O.........
.............O.O.....OO............................
.............O.......OO............................
............OO.....................................
...................................................
..........................O........................
................OO....OO.O.O.......................
...............O..O..O.O.O.O.......................
................OO...O.O.O.OO......................
..................OOOO.OO..O.......................
..................O...O....O.......................
...................O..O.OOO........................
....................O.O.O..........................
.....................O.............................

:Snarkmaker A single-channel stream of gliders that, when aimed to collide with an elbow block in a specific location, will perform a slow glider construction of a Snark, directly on the same lane as the incoming gliders. This allows a construction arm to add one or more lossless elbows, so that it can bend around multiple corners without an exponential increase in construction cost.

The Snarkmaker recipe used in the first single-channel Demonoid, Orthogonoid, and spiral growth patterns contains 2,254 gliders. This could be considerably reduced with a customized search program.

:SNG = second natural glider.

:SODGame = Seeds of Destruction Game

:sombrero One half of sombreros or siesta.

:sombreros (p6) Found by Dave Buckingham in 1972. If the two halves are moved three spaces closer to one another then the period drops to 4, and the result is just a less compact form of Achim's p4. Compare also siesta.

...OO........OO...
...O.O......O.O...
.....O......O.....
...O.OO....OO.O...
.OOO..........OOO.
O...O.O....O.O...O
.OOO..........OOO.
...O.OO....OO.O...
.....O......O.....
...O.O......O.O...
...OO........OO...

:soup A random initial pattern, either contained within a small area, or alternatively filling the whole Life universe.

Finite soups probably have behaviors very different than infinite soups, but this is obviously unknown. Infinite soups may remain chaotic indefinitely since any reaction, no matter how rare, is bound to happen somewhere.

Soups can have an average density, with results varying based on that. See sparse Life for a discussion of what can happen at a low density.

Finite soups for sizes such as 16x16 (asymmetric) have been examined by the billions by scripts such as apgsearch to find interesting results. Many new oscillators and synthesis recipes have been discovered, as well as previously known rare patterns such as stabilized switch engines. In addition, soups are used to generate statistical census data, and to decide whether specific objects can be considered natural.

Soups can be fully random, or they can be forced to be symmetric. The results for these two types of soups can differ since symmetric soups tend to create large symmetrical objects at a much higher rate. Shown below is an unusual mirror-symmetric soup that produces a pufferfish and nothing else.

OOOO..OO.OOO.O...O.OOO.OO..OOOO
.O.O.OO.O.............O.OO.O.O.
..OOO..O.O.O.......O.O.O..OOO..
O.OO.OOO.O..O.....O..O.OOO.OO.O
.OOOO.O...OO.OOOOO.OO...O.OOOO.
.....OO...OO.O.O.O.OO...OO.....
..OOO...OO...O...O...OO...OOO..
O..O..O.OO...OO.OO...OO.O..O..O
OO.O..O...O.........O...O..O.OO
O.O.O...OOOO..OOO..OOOO...O.O.O
O.OOO.OO..OO...O...OO..OO.OOO.O
..O.....OO...O...O...OO.....O..
OOOOO.O.OOO..O...O..OOO.O.OOOOO
.O....O....O..OOO..O....O....O.
.OO.O...OOOOOOOOOOOOOOO...O.OO.
OOOO.OOO......O.O......OOO.OOOO

:space dust A part of a spaceship or oscillator which looks like a random mix of ON and OFF cells. It is usually very difficult to find a glider synthesis for an object that consists wholly or partly of space dust. As examples, the 295P5H1V1, fly, and seal spaceships contain large amounts of space dust.

:spacefiller Any pattern that grows at a quadratic rate by filling space with an agar. The first example was found in September 1993 by Hartmut Holzwart, following a suggestion by Alan Hensel. The diagram below shows a smaller spacefiller found by Tim Coe. See also Max. Spacefillers can be considered as breeders (more precisely, MMS breeders), but they are very different from ordinary breeders. The word "spacefiller" was suggested by Harold McIntosh and soon became the accepted term.

..................O........
.................OOO.......
............OOO....OO......
...........O..OOO..O.OO....
..........O...O.O..O.O.....
..........O....O.O.O.O.OO..
............O....O.O...OO..
OOOO.....O.O....O...O.OOO..
O...OO.O.OOO.OO.........OO.
O.....OO.....O.............
.O..OO.O..O..O.OO..........
.......O.O.O.O.O.O.....OOOO
.O..OO.O..O..O..OO.O.OO...O
O.....OO...O.O.O...OO.....O
O...OO.O.OO..O..O..O.OO..O.
OOOO.....O.O.O.O.O.O.......
..........OO.O..O..O.OO..O.
.............O.....OO.....O
.OO.........OO.OOO.O.OO...O
..OOO.O...O....O.O.....OOOO
..OO...O.O....O............
..OO.O.O.O.O....O..........
.....O.O..O.O...O..........
....OO.O..OOO..O...........
......OO....OOO............
.......OOO.................
........O..................

:space nonfiller Any pattern that expands indefinitely to affect every cell in the Life plane, but leaves an expanding region of vacuum at its center. Compare spacefiller; see also antstretcher. The first nonfiller was discovered by Jason Summers on 14 April 1999:

...................OOO...............
..................O..O...............
............OOO......O....OOO........
............O..O.O...O....O..O.......
............O..O.O...O....O..O.......
..........O..........O..O.O.OOO......
..........OO..OO..O.O....O.....O.....
........O................OO..OOO.....
........OOO.O.OO..........O......O...
......O........O.........O.O...OOO...
......OOO.....O..........O........O..
...O.O.........................O.OOO.
..OOOOO.O..........................O.
.OO......O.....................OOOOO.
OO....OO..................O.O........
.O.O...O..O...............O..O...O.O.
........O.O..................OO....OO
.OOOOO.....................O......OO.
.O..........................O.OOOOO..
.OOO.O.........................O.O...
..O........O..........O.....OOO......
...OOO...O.O.........O........O......
...O......O..........OO.O.OOO........
.....OOO..OO................O........
.....O.....O....O.O..OO..OO..........
......OOO.O.O..O..........O..........
.......O..O....O...O.O..O............
.......O..O....O...O.O..O............
........OOO....O......OOO............
...............O..O..................
...............OOO...................

:space rake The following p20 forwards glider rake, which was the first known rake. It consists of an ecologist with a LWSS added to turn the dying debris into gliders.

...........OO.....OOOO
.........OO.OO...O...O
.........OOOO........O
..........OO.....O..O.
......................
........O.............
.......OO........OO...
......O.........O..O..
.......OOOOO....O..O..
........OOOO...OO.OO..
...........O....OO....
......................
......................
......................
..................OOOO
O..O.............O...O
....O................O
O...O............O..O.
.OOOO.................

:spaceship Any finite pattern that reappears (without additions or losses) after a number of generations and displaced by a non-zero amount. By far the most natural spaceships are the glider, LWSS, MWSS and HWSS, followed by the Coe ship which has also evolved multiple times from random asymmetric soup starting conditions. See also the entries on individual spaceship speeds: c/2 spaceship, c/3 spaceship, c/4 spaceship, c/5 spaceship, c/6 spaceship, c/7 spaceship, c/10 spaceship, c/12 spaceship, 2c/5 spaceship, 2c/7 spaceship, 3c/7 spaceship, (2,1)c/6 spaceship, and 17c/45 spaceship.

It is known that there exist spaceships travelling in all rational directions and at arbitrarily slow speeds (see universal constructor). Before 1989, however, the only known examples travelled at c/4 diagonally (gliders) or c/2 orthogonally (everything else).

In 1989 Dean Hickerson started to use automated searches to look for new elementary spaceships, and had considerable success. Other people have continued these searches using tools such as lifesrc and gfind, and as a result we now have a great variety of elementary spaceships travelling at sixteen different velocities. The following table details the discovery of elementary spaceships with new velocities as of July 2018.

  -----------------------------------------------------------------
  Speed    Direction  First Discovery   Discoverer             Date
  -----------------------------------------------------------------
  c/4      diagonal   glider            Richard Guy            1970
  c/2      orthogonal LWSS              John Conway            1970
  c/3      orthogonal 25P3H1V0.1        Dean Hickerson     Aug 1989
  c/4      orthogonal 119P4H1V0         Dean Hickerson     Dec 1989
  c/12     diagonal   Cordership        Dean Hickerson     Apr 1991
  2c/5     orthogonal 44P5H2V0          Dean Hickerson     Jul 1991
  c/5      orthogonal snail             Tim Coe            Jan 1996
  2c/7     orthogonal weekender         David Eppstein     Jan 2000
  c/6      orthogonal dragon            Paul Tooke         Apr 2000
  c/5      diagonal   295P5H1V1         Jason Summers      Nov 2000
  c/6      diagonal   seal              Nicolay Beluchenko Sep 2005
  c/7      diagonal   lobster           Matthias Merzenich Aug 2011
  c/7      orthogonal loafer            Josh Ball          Feb 2013
  c/10     orthogonal copperhead        zdr                Mar 2016
  3c/7     orthogonal spaghetti monster Tim Coe            Jun 2016
  (2,1)c/7 oblique    Sir Robin         Adam P. Goucher    Mar 2018
  -----------------------------------------------------------------

Several infinite families of adjustable-velocity macro-spaceships have also been constructed, of which the first was Gabriel Nivasch's Caterpillar from December 2004. The macro-spaceship with the widest range of possible speeds is Michael Simkin's Caterloopillar from April 2016; in theory it supports any rational orthogonal speed strictly less than c<4. A somewhat similar design supporting any rational speed strictly less than c/2 has been shown to be feasible, but as of July 2018 no explicit examples have been constructed.

A period p spaceship that displaces itself (m,n) during its period, where m>=n, is said to be of type (m,n)/p. It was proved by Conway in 1970 that p>=2m+2n. (This follows immediately from the easily-proved fact that a pattern cannot advance diagonally at a rate greater than one half diagonal step every other generation.)

:Spaceships in Conway's Life A series of articles posted by David Bell to the newsgroup comp.theory.cell-automata during the period August-October 1992 that described many of the new spaceships found by himself, Dean Hickerson and Hartmut Holzwart. Bell produced an addendum covering more recent developments in 1996.

:spaghetti monster The first 3c/7 spaceship, found by Tim Coe in June 2016. The spaceship travels orthogonally, has a minimum of 702 live cells and fits in a 27x137 bounding box.

:spark A pattern that dies. The term is typically used to describe a collection of cells periodically thrown off by an oscillator or spaceship, but other dying patterns, particularly those consisting or only one or two cells (such as produced by certain glider collisions, for example), are also described as sparks. For examples of small sparks see unix and HWSS. Examples of much larger sparks are seen in Schick engine and twin bees shuttle spark.

:spark coil (p2) Found in 1971.

OO....OO
O.O..O.O
..O..O..
O.O..O.O
OO....OO

:sparker An oscillator or spaceship that produces sparks. These can be used to perturb other patterns without being themselves affected.

:sparking eater One of two eaters found in April 1997 and November 1998 by Dean Hickerson using his dr search program, shown below to the left and right respectively. These both absorb gliders as a standard eater does, but also produce separated single-bit sparks at the upper right, which can be used to delete antiparallel gliders with different phases as shown.

..O.........OO........O..........OO.
O.O........OO.......O.O..........O.O
.OO..........O.......OO..........O..
....OO..OO...............OO..OO.....
.O...O..OO............O...O..OO.....
.OOOO.............OO..OOOO..........
..................O.................
.OO................OOOOO............
.OO.....................O...........
.....................OOO............
.....................O..............
The above mechanisms can be used to build intermitting glider guns. The left-hand eater produces a spark nine ticks after a glider impact, with the result that the period of the constituent guns can't be a multiple of 4. The right-hand eater produces the same spark ten ticks after impact, which allows p4N guns to be used.

The separation of the spark also allows this reaction to perform other perturbations "around the corner" of some objects. For example, it was used by Jason Summers in 2004 to cap the ends of a row of ten AK47 reactions to form a much smaller period 94 glider gun than the original one. (This is now made obsolete by the AK94 gun.)

:sparky A certain c/4 tagalong, shown here attached to the back of a spaceship.

..........O....................
..........O...............OO...
......OO.O.OOO..........OO...O.
O.OO.OO.OO..O.O...OO.OOOO......
O...OO..O.OO..OOO..O.OO..OO...O
O.OO....OOO.O.OOO......OO..O...
........OO.O...............O..O
O.OO....OOO.O.OOO......OO..O...
O...OO..O.OO..OOO..O.OO..OO...O
O.OO.OO.OO..O.O...OO.OOOO......
......OO.O.OOO..........OO...O.
..........O...............OO...
..........O....................

:sparse Life This refers to the study of the evolution of a Life universe which starts off as a random soup of extremely low density. Such a universe is dominated at an early stage by blocks and blinkers (often referred to collectively as blonks) in a ratio of about 2:1. Much later it will be dominated by simple infinite growth patterns (presumably mostly switch engines). The long-term fate of a sparse Life universe is less certain. It may possibly become dominated by self-reproducing patterns (see universal constructor), but it is not at all clear that there is any mechanism for these to deal with all the junk produced by switch engines.

:Spartan A pattern composed of subunits that can be easily constructed in any orientation, usually with a slow salvo. Generally this means that the pattern is a constellation of Spartan still lifes: block, tub, boat, hive, ship, loaf, eater1, or pond. Other small objects may sometimes be counted as Spartan, including period-2 oscillators - mainly blinkers, but also beacons or toads, which may occur as intermediate targets in slow salvo recipes. Most self-constructing patterns are Spartan or mostly Spartan, to simplify the process of self-construction.

:speed booster Any mechanism which allows a signal (indicated by the presence or absence of a spaceship) to move faster than the spaceship could travel through empty space. The original speed booster is based on p30 technology, and is shown below:

....................O........................
.....................O.......................
...................OOO.......................
.............................................
...........................O.O...............
.........................O...O...............
.................O.......O...................
................OOOO....O....O........OO.....
...............OO.O.O....O............OO.....
....OO........OOO.O..O...O...O...............
....OO.........OO.O.O......O.O...............
................OOOO.........................
.................O...........................
..........................OOO................
..........................O.O...OO...........
.........................OO.....O..O.........
..................O.O.....O.........O......OO
................O...O..OO...........O......OO
.........OO.....O..........O........O........
.O.......OO....O....O.......OO..O..O.........
..O.............O.......O.O..O..OO...........
OOO.............O...O.....OOO................
..................O.O........................
Here the top glider is boosted by passing through two inline inverters, emerging 5 cells further along than the unboosted glider at the left.

The fastest speed boosters are the telegraph and p1 telegraph, which can transfer a orthogonal signal at the speed of light, although their bit rate is rather slow.

Diagonal speed boosters have also been built using 2c/3 wires or other stable components. See stable pseudo-Heisenburp.

The star gate seems like it can transfer a signal faster than the speed of light. The illusion is explained in Fast Forward Force Field.

:speed of light The greatest speed at which any effect can propagate; in Life, a speed of one cell per generation. Usually denoted c.

:S-pentomino Conway's name for the following pentomino, which rapidly dies.

..OO
OOO.

:spider (c/5 orthogonally, p5) This is the smallest known c/5 spaceship, and was found by David Bell in April 1997. Its side sparks have proved very useful in constructing c/5 puffers, including rakes. See also PPS.

......O...OOO.....OOO...O......
...OO.OOOOO.OO...OO.OOOOO.OO...
.O.OO.O.....O.O.O.O.....O.OO.O.
O...O.O...OOOOO.OOOOO...O.O...O
....OOO.....OO...OO.....OOO....
.O..O.OOO.............OOO.O..O.
...O.......................O...

:spiral (p1) Found by Robert Wainwright in 1971.

OO....O
.O..OOO
.O.O...
..O.O..
...O.O.
OOO..O.
O....OO

:spiral growth A self-constructing pattern built by Dave Greene in August 2014 that uses four universal constructors (UCs) arranged in a diamond to build four more UCs in a slightly larger diamond. This was the first B3/S23 pattern that exhibited spiral growth. Much smaller versions have now been constructed using the single-channel construction toolkit.

:splitter A signal converter that accepts a single input signal and produces two or more output signals, usually of the same type as the input. An older term for this is fanout, or "fanout device".

A sub-category is the one-time splitter, which is not technically a converter because it can only be used once. One-time splitters are usually small constellations that produce two or more clean gliders when struck by a single glider. In other words, they are multi-glider seeds. These are important for constructing self-destruct circuitry in self-constructing spaceships.

The following combination, a syringe attached to an SE7T14 converter combined with an NW31 converter, is one of the smallest known glider splitters as of July 2018. Another small splitter with a 90-degree colour-changing output is shown under reflector.

..........OO...........O......OO....................
..........OO..........O.O....O..O...................
......................O.O...O.OOO...O...............
.....................OO.OO.O.O......OOO.............
.........................O.O...OO......O............
.....................OO.O..OOOO.O.....OO............
.....................OO.O.O...O.....................
.........................O.O...O....................
..........................O.O...O...................
...........................O...OO...................
....................................................
....................................................
....................................................
..................OO................................
..................OO................................
...OO...............................................
..O..O..............................................
.O.OO...............................................
.O................................................OO
OO................................................OO
...............OO...................................
...............O....................................
................OOO.................................
..................O..........OO.....................
............................O.O.....................
............................O.......................
...........................OO.......................
OOO.................................................
..O.................................................
.O..................................................

:SPPS (c/5 orthogonally, p30) The symmetric PPS. The original PPS found by David Bell in May 1998. Compare APPS.

:sqrtgun Any glider-emitting pattern which emits its nth glider at a time asymptotically proportional to n2. The first examples were constructed by Dean Hickerson around 1991. See also quadratic filter, exponential filter, recursive filter.

:squaredance The p2 agar formed by tiling the plane with the following pattern. Found by Don Woods in 1971.

OO......
....OO..
..O....O
..O....O
....OO..
OO......
...O..O.
...O..O.

:squirter = pipsquirter

:S-spiral = big S

:stabilized switch engine A single switch engine which survives indefinitely by interacting with the appropriate exhaust such that it prevents the engine from ever being destroyed.

The only known types of stabilized switch engines were found by Charles Corderman soon after he discovered the switch engine itself. There is a p288 block-laying type (the more common of the two) and the p384 glider-producing type. These two puffers are the most natural infinite growth patterns in Life. As of June 2018 they are the basis for every infinite growth pattern ever seen to occur from a random asymmetric soup, even after trillions of census results by apgsearch and similar projects.

Patterns giving rise to block-laying switch engines can be seen under infinite growth, and one giving rise to a glider-producing switch engine is shown under time bomb.

Here is the block-laying type showing its distinctive zig-zag trail of blocks.

..O.........................................................
.O.O........................................................
............................................................
.O..O.......................................................
...OO.......................................................
....O.......................................................
..................OO........................................
..................OO........................................
............................................................
............................................................
.OO.........................................................
...O........................................................
..OO........................................................
.OOO...............O........................................
.OO................OO.....OO................................
OOO.O..............OO.....OO................................
.O...O..........OO..........................................
...O..O..........O..........................................
...OOO............O.........................................
....OO........OO............................................
..............OO............................................
............................................................
..................................OO........................
..................................OO........................
............................................................
............................................................
......OO....................................................
......OO................OO..................................
........................OO..................................
............................................................
..........................................OO................
....................OO....................OO................
....................OO......................................
............................................................
..............OO............................................
..............OO............................................
.......................................OO...................
.......................................OO...................
............................................................
............................................................
...................................OO.......................
...................................OO.......................
............................................................
............................................................
............................................................
............................................................
..........................................................OO
..........................................................OO
............................................................
............................................................
..............................OO............................
..............................OO................OO..........
................................................OO..........
............................................................
............................................................
............................................OO..............
............................................OO..............
............................................................
......................................OO....................
......................................OO....................

:stable A pattern is said to be stable if it is a parent of itself. Stable objects are oscillators with period 1 (p1), and are generally called still lifes.

:stable pseudo-Heisenburp A multi-stage converter constructed by Dave Greene in January 2007, using a complex recipe found by Noam Elkies to insert a signal into a 2c/3 wire. The wire's high transmission speed allows a signal from a highway robber to catch up to a salvo of gliders. Ultimately the mechanism restores the key glider, which was destroyed by the highway robber in the first stage of the converter, to its exact original position in the salvo.

Much smaller stable pseudo-Heisenburp devices have since been designed that use simple 0-degree glider seed constellations instead of a 2c/3 wire.

These patterns are labeled "pseudo-Heisenburp", because a true Heisenburp device does not even temporarily damage or affect a passing glider, yet can still produce an output signal in response. However, it is impossible to construct a stable device that can accomplish this for gliders. True stable Heisenburp devices are possible with many other types of spaceships, but not with gliders which have no usable side sparks to initiate an output signal.

:staged recovery A type of signal-processing circuit where the initial reaction between catalysts an incoming signal results in an imperfect recovery. A catalyst is damaged, destroyed completely as in a bait reaction, or one or more objects are left behind that must be cleaned up before the circuit can be reused. In any of these three cases, output signals from the circuit must be used to complete the cleanup. In theory the cleanup process might itself be dirty, requiring additional cleanup stages. In rare cases this might theoretically allow the construction of special-purpose circuits with a lower recovery time than would otherwise be possible, but in practice this kind of situation does not commonly arise.

An example is the record-breaking (at the time) 487-tick reflector constructed by Adam P. Goucher on 12 April 2009. 487 ticks was a slight improvement over the repeat time of the Silver reflector. The reflector featured a standard Callahan G-to-H, with cleanup by an internal dirty glider reflector found by Dieter Leithner many years before. This in turn was cleaned up by the usual ungainly Herschel plumbing attached to the G-to-H's output. The dirty glider reflector is not actually fully recovered before a second p487 signal enters the full reflector. However, it has been repaired by the time the internal reflector is actually needed again, so the cycle can be successfully repeated at p487 instead of p497.

:stairstep hexomino (stabilizes at time 63) The following predecessor of the blockade.

..OO
.OO.
OO..

:stamp collection A collection of oscillators (or perhaps other Life objects) in a single diagram, displaying the exhibits much like stamps in a stamp album. The classic examples are by Dean Hickerson (see http://conwaylife.com/ref/DRH/stamps.html).

Many stamp collections contain "fonts" made of single cells (which cleanly die) to annotate the objects or to draw boxes around them. For example, here is a stamp collection which shows all the ways that two gliders can create a loaf or an eater:

.O......O.O.....O....O.O.O...................O.
............................................O..
.O.....O...O...O.O...O......................OOO
...............................................
.O.....O...O..O...O..O.O.O.....................
...............................................
.O.....O...O..O.O.O..O.........................
........................................OO.....
.O.O.O..O.O...O...O..O.................O.O.....
.........................................O.....
...............................................
...............................................
.............................................O.
............................................O..
O.O.O....O....O.O.O..O.O.O..O.O.............OOO
................................O..............
O.......O.O.....O....O......O..................
................................O..............
O.O.O..O...O....O....O.O.O..O.O................
...............................................
O......O.O.O....O....O......O..O...........O...
..........................................OO...
O.O.O..O...O....O....O.O.O..O...O.........O.O..

Alternatively, stamp collections can use LifeHistory for their annotations, but this requires a more sophisticated Life program to handle. Numbers, or more rarely letters, are sometimes constructed from stable components such as blocks or snakes, but their readability is somewhat limited by placement constraints.

:standard spaceship A glider, LWSS, MWSS or HWSS. These have all been known since 1970.

:star (p3) Found by Hartmut Holzwart, February 1993.

.....O.....
....OOO....
..OOO.OOO..
..O.....O..
.OO.....OO.
OO.......OO
.OO.....OO.
..O.....O..
..OOO.OOO..
....OOO....
.....O.....

:star gate A device by Dieter Leithner (October 1996) for transporting a LWSS faster than the speed of light. The key reaction is the Fast Forward Force Field.

:stator The cells of an oscillator that are always on. Compare rotor. (The stator is sometimes taken to include also some of those cells which are always off.) The stator is divided into the bushing and the casing.

By analogy, the cells of an eater that remain on even when the eater is eating are considered to constitute the stator of the eater. This is not always well-defined, because an eater can have more than one eating action.

:statorless A statorless oscillator is one in which no cell is permanently on - that is, the stator is empty, or in other words the oscillator has the maximum possible volatility. See the volatility entry for examples of this type of oscillator at different periods. Statorless oscillators can be constructed for any sufficiently large period, using universal constructor technology.

:statorless p5 (p5) Found by Josh Ball, June 2016. The first and only known statorless period 5 oscillator.

O.............O
.OO.........OO.
O....OO.OO....O
OO.O.......O.OO
.O.O..O.O..O.O.
..O.O.....O.O..
..OOO.....OOO..
..OOO.....OOO..
..O.O.....O.O..
.O.O..O.O..O.O.
OO.O.......O.OO
O....OO.OO....O
.OO.........OO.
O.............O

:step Another term for a generation or tick. This term is particularly used in describing conduits. For example, a 64-step conduit is one through which the active object takes 64 generations to pass.

:stillater (p3) Found by Robert Wainwright, September 1985. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and cuphook.

...O....
..O.O.OO
..O.OO.O
OO......
.O.O.OO.
.O.O..O.
..O..O..
...OO...

:still life Any stable pattern, usually assumed to be finite and nonempty. For the purposes of enumerating still lifes this definition is, however, unsatisfactory because, for example, any pair of blocks would count as a still life, and there would therefore be an infinite number of 8-bit still lifes.

For this reason a stricter definition is often used, counting a stable pattern as a strict still life only if its islands cannot be divided into two or more nonempty sets both of which are stable in their own right. If such a subdivision can be made, the pattern can be referred to as a constellation. If its cells form a single cluster it is also, more specifically, either a pseudo still life or a quasi still life.

In rare cases above a certain size threshold, a pattern may be divisible into three or four stable nonempty subsets but not into two. See the 32-bit triple pseudo (32 bits) and the 34-bit quad pseudo for examples.

All still lifes up to 18 bits have been shown to be glider constructible. It is an open question whether all still lifes can be incrementally constructed using glider collisions. For a subset of small still lifes that have been found to be especially useful in self-constructing circuitry, see also Spartan.

The smallest still life is the block. Arbitrarily large still lifes are easy to construct, for example by extending a canoe or barge. The maximum density of a large still life is 1/2, which can be achieved by an arbitrarily large patch of zebra stripes or chicken wire, among many other options. See density for more precise limits.

...O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
......................
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
......................
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O...

:still life tagalong A tagalong which takes the form of a still life in at least one phase. An example is shown below.

..OO...............
.OO.OO.............
..OOOO.............
...OO..............
...................
...OOOOO...........
..OOOOOOO..........
.OO.OOOOO..........
..OO...............
...................
........O.O.....OO.
......O....O...O..O
......OO.....O.O..O
.O..O..OOOO.O...OO.
O.......OO.........
O...O..............
OOOO...............

:stop and go A pattern by Dean Hickerson in which a period 46 shuttle converts a glider into a block on one oscillation, and then converts the block back into a glider on the next oscillation. The glider is reflected back onto its own path, but with a delay.

........................................O.
.......................................O..
OO..............OO.........OO..........OOO
OO...............OO........OO.............
.............OOOOO........................
.............OOOO.........................
..........................................
.............OOOO.........................
.............OOOOO........................
OO...............OO.......................
OO..............OO........................

:stop and restart A type of signal circuit where an input signal is converted into a stationary object, which is then re-activated by a secondary input signal. This can be used either as a memory device storing one bit of information, or as a simple delay mechanism. In the following January 2016 example by Martin Grant, a ghost Herschel marks the output signal location, and a "ghost beehive" marks the location of the intermediate still life.

........................................................O.
.......................................................O..
.......................................................OOO
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
............O.............................................
............OOO...........................................
...............O..........................................
..............OO..........................................
........O.................................................
.......O.O.......OO.......................................
.......O.O......O.O.......................................
.....OOO.OO.....OO........................................
....O.....................................................
.....OOO.OO...............................................
.......O.OO...............................................
..........................................................
..........................................................
..........................................................
OO........................................................
.O........................................................
.O.O......................................................
..OO......................................................
..........................................................
....................O.....................................
...................O.O....................................
...................O...................................O..
....................O................................OOO..
....................................OO...............O....
..O.................................OO...............O....
..O.O.....................................................
..OOO.....................................................
....O....................O................................
........................O.O...............................
........................OO................................
...................OO............OO.......................
...................OO............O........................
..................................O.......................
.................................OO.......................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..OO..........OO..........................................
...O..........O...........................................
OOO............OOO........................................
O................O........................................
The eater1 in the lower left corner catches the restart glider if no input signal has come in to create the beehive. This eater could be removed if it is useful to have both a "0" and a "1" output for a memory cell mechanism.

The catch and throw technology in a Caterpillar is a somewhat similar idea. See also stop and go and reanimation.

:stream A line of identical objects (usually spaceships), each of which is moving in a direction parallel to the line, generally on the same lane. In many uses the stream is periodic. For example, the new gun produces a period 46 glider stream. The stream produced by a pseudo-random glider generator can have a very high period. Compare with wave. See also single-channel for a common use of non-periodic glider streams.

:stretcher Any pattern that grows by stretching a wick or agar. See wickstretcher and spacefiller.

:strict still life A still life that is either a single connected polyplet, or is arranged such that a stable smaller pattern cannot be formed by removing one or more of its islands. For example, beehive with tail is a strict still life because it is connected, and table on table is a strict still life because neither of the tables are stable by themselves. See also triple pseudo, quad pseudo.

Still lifes have been enumerated by Conway (4-7 bits), Robert Wainwright (8-10 bits), Dave Buckingham (11-13 bits), Peter Raynham (14 bits), Mark Niemiec (15-24 bits), and Simon Ekström and Nathaniel Johnston (25-32 bits). The resulting figures are shown below; see also https://oeis.org/A019473. The most recent search by Nathaniel Johnston has also confirmed that the triple pseudo pattern found by Gabriel Nivasch is the only such still life with 32 bits or less. It is therefore included in the pseudo still life count and not in the table below.

  --------------
  Bits    Number
  --------------
   4           2
   5           1
   6           5
   7           4
   8           9
   9          10
  10          25
  11          46
  12         121
  13         240
  14         619
  15        1353
  16        3286
  17        7773
  18       19044
  19       45759
  20      112243
  21      273188
  22      672172
  23     1646147
  24     4051711
  25     9971377
  26    24619307
  27    60823008
  28   150613157
  29   373188952
  30   926068847
  31  2299616637
  32  5716948683
  --------------

As the number of bits increases, the strict still life count goes up exponentially by approximately O(2.46n). By comparison, the rate for pseudo still life}s is about O(2.56n) while for quasi still lifes it's around O(3.04n).

:strict volatility A term suggested by Noam Elkies in August 1998 for the proportion of cells involved in a period n oscillator which themselves oscillate with period n. For prime n this is the same as the ordinary volatility. Periods with known strictly-volatile oscillators include 1, 2, 3, 5, 6, 8, 13, 15, 22, 30, 33, and 177. Examples include figure-8, Kok's galaxy, smiley, and pentadecathlon. A composite example is the following p22, found by Nicolay Beluchenko on 4 March 2009:

...........OO...
..........O.O...
..O.....O....O..
OO.OO..OO.O.O...
O.......O...O...
.O.O............
................
..OOO.......O...
...O.......OOO..
................
............O.O.
...O...O.......O
...O.O.OO..OO.OO
..O....O.....O..
...O.O..........
...OO...........

:super beehive = honeycomb

:superfountain (p4) A p4 sparker which produces a 1-cell spark that is separated from the rest of the oscillator by two clear rows of cells. The first superfountain was found by Noam Elkies in February 1998. In January 2006 Nicolay Beluchenko found the much smaller one shown below. See also fountain.

...........O...........
.......................
.......................
.....O..O.....O..O.....
...OO..O.OOOOO.O..OO...
.....O...........O.....
...O.OO.........OO.O...
.O.O...OOO...OOO...O.O.
OOO.O.............O.OOO
..........O.O..........
....OOO...O.O...OOO....
....O..O...O...O..O....
...OOOO..O.O.O..OOOO...
...OO..OOO.O.OOO..OO...
..O...O...O.O...O...O..
...O..O.O.O.O.O.O..O...
....O.O.OO...OO.O.O....
.....O...........O.....

:superlinear growth Growth faster than any rate proportional to T, where T is the number of ticks that a pattern has been run. This term usually applies to a pattern's population growth, rather than diametric growth or bounding-box growth. For example, breeders' and spacefillers' population asymptotically grows faster than any linear-growth pattern. It may also be used to describe the rate of increase in the number of subpatterns present in a pattern, such as when describing a replicator's rate of reproduction. Due to limits enforced by the speed of light, no pattern's population can grow at an asymptotic rate faster than quadratic growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:superstring An infinite orthogonal row of cells stabilized on one side so that it moves at the speed of light, often leaving debris behind. The first examples were found in 1971 by Edward Fitzgerald and Robert Wainwright. Superstrings were studied extensively by Peter Rott during 1992-1994, and he found examples with many different periods. (But no odd periods. In August 1998 Stephen Silver proved that odd-period superstrings are impossible.)

Sometimes a finite section of a superstring can be made to run between two tracks ("waveguides"). This gives a fuse which can be made as wide as desired. The first example was found by Tony Smithurst and uses tubs. (This is shown below. The superstring itself is p4 with a repeating section of width 9 producing one blinker per period and was one of those discovered in 1971. With the track in place, however, the period is 8. This track can also be used with a number of other superstrings.) Shortly after seeing this example, in March 1997 Peter Rott found another superstring track consisting of boats. At present these are the only two waveguides known. Both are destroyed by the superstring as it moves along. It would be interesting to find one that remains intact.

See titanic toroidal traveler for another example of a superstring.

.OO..........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OOO.........................................................
..OO.........................................................
..OO.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
..OO.........................................................
..OO.........................................................
.OOO.........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OO..........................................................

:support Those parts of an object which are only present in order to keep the rest of the object (such an engine or an edge spark) working correctly. These can be components of the object, or else accompanying objects used to perturb the object. In many cases there is a wide variation of support possible for an engine. The arms in many puffers are an example of support.

:surprise (p3) Found by Dave Buckingham, November 1972.

...O....OO
...OOO..O.
.OO...O.O.
O..OO.O.OO
.O......O.
OO.O.OO..O
.O.O...OO.
.O..OOO...
OO....O...

:SW1T43 A Herschel-to-glider converter that produces a tandem glider useful in the tee reaction. It is classified as a "G3" converter because its two gliders are three lanes apart.

.......OO........
.......O.........
.....O.O.........
....O.O..........
OO...O...........
OO...............
...........OO....
...........O.O...
.............O...
.............O.OO
..........OO.O.OO
O........O..O....
O.O.......OO.....
OOO..............
..O.......OOOO...
...........O..O..
.........O...OO..
.........OO......
Besides the southwest-travelling glider on lane 1, the converter also emits the Herschel's standard first natural glider, SW-2. The converter's full standard name is therefore "HSW1T43_SW-2T21". See NW31 for an explanation of H-to-G naming conventions.

:SW-2 The simplest type of H-to-G converter, where the converter's effect is simply to suppress a Herschel cleanly after allowing its first natural glider to escape. The name should be read as "SW minus two", where -2 is a glider lane number. The complete designation is SW-2T21. See NW31T120 for a discussion of the standard naming conventions used for these converters.

An unlimited number of converters have the SW-2T21 classification. The variants most often used consist of just one or two small still life catalysts.

...................................OO.....
...................................O......
.................................O.O......
.............................OO..OO.......
.............................OO...........
.....OO...................................
.....OO...................................
.............................OO...........
.............................OO...........
..........................................
..........................................
..........................................
.........OO...............................
.........OO...............................
..........................................
O........................O................
O.O......................O.O..............
OOO......................OOO..............
..O........................O..............
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
........................................O.
...........O...........................O.O
..........O.O...........................OO
..........O.O.............................
...........O............................OO
O........................O.............O.O
O.O......................O.O............O.
OOO......................OOO..............
..O........................O..............

:SW-2T21 = SW-2

:swan (c/4 diagonally, p4) A diagonal spaceship producing some useful sparks. Found by Tim Coe in February 1996.

.O..........OO..........
OOOOO......OO...........
O..OO........O.......OO.
..OO.O.....OO......OOO.O
...........OO...O.OO....
.....O.O......OO........
..........OOO.O....O....
.......OOO...O....O.....
........O.......O.......
........O......O........
........................
...........O............

:swimmer = switch engine.

:swimmer lane = switch engine channel.

:switch A signal-carrying circuit that can send output signals to two or more different locations, depending on the state of the mechanism. These may be toggle circuits, where the state of the switch changes after each use, or permanent switches that retain the same state through many uses until a change is made with a separate signal.

More generally, any circuit may be referred to as a switch, if it can alter its output based on stored information. For example, the following simple mechanism based on an eater2 was discovered by Emerson J. Perkins in 2007. It either reflects or absorbs an incoming signal, depending on the presence or absence of a nearby block. The block is removed if a reflection occurs.

...O.....................O....................
....O...................O.O...................
..OOO...................O.O...................
......................OOO.OO................O.
..................O..O....................OOO.
................OOO...OOO.OO...OO........O....
...............O........O.OO...OO........OO...
...............OO.............................
OO............................................
.O............................................
.O.OO.........................................
..O..O....................................OO..
...OO.....................................O.O.
..................OO........................O.
..................OO........................OO
..................................OOO.........
..................................O...........
...................................O..........
..............................................
..........................O...OO..............
.........................O.O...O..............
.....................OO.O.O...O...............
.....................OO.O....O................
.........................OOOOO.O..............
.................OO.O.OO.O....OO...........OOO
.................O.OO.O..O.OO..............O..
..........OO............OO.O.OOO............O.
..........OO...................O..............

The switching signal here is a glider produced by a high-clearance syringe variant found by Matthias Merzenich. The syringe is not technically part of the switch mechanism; any standard Herschel source can deliver the signal to the block factory (the two eater1s on the right side of the pattern). Alternate converter mechanisms could also be used to place the block.

An earlier example of the same type of one-time switch mechanism, also mediated by a block, can be found in the NW34T204 H-to-G. See also bistable switch for a very robust and versatile toggle switch with two input lanes and four possible outputs.

:switchable gun A gun that includes a mechanism to turn the output stream off and on with simple signals, often gliders. A small example is Dieter Leithner's switchable LWSS gun from July 8, 1995. The ON signal enters from the northeast, and the OFF signal from the northwest:

.................OO...........................................
.................O..O.........................................
..............................................................
.....................O........................................
..............................................................
.O.................OO.........................................
..O...............O...........................................
OOO...........................................................
..............................................................
...............OO...OO........................................
...............OO...OO........................................
................OOOOO........................O................
.................O.O........................O.................
............................................OOO...............
.................OOO..........................................
....................................O.O.......................
....................................O...O.....................
........................................O.......O.............
..........................OO........O....O....OOOO............
..........................OO............O....O.O.OO...........
.....................O..............O...O...O..O.OOO........OO
......................O.............O.O......O.O.OO.........OO
....................OOO.......................OOOO............
................O...............................O.............
...............OOO...................O........................
..............OOOOO..................O.O.....O................
.............OO...OO.................OO....OOO................
..........................................O...................
.............................O............OO..................
...........................O..O.........OOO...................
...............OOO..........OOO.........OO....................
...............OOO..........O..........O.O....................
.............................O................................
.............................OOO..............................
................OO............................................
................OO............................................
.....................O........................................
...................OOOO......OO..OO...........................
.............OO...O.O.OO.....OOOO.O..O.O......................
.............OO..O..O.OOO.....OO.O...O...O....................
..................O.O.OO....O............O.....OO.............
...................OOOO..............O....O....OO.............
.....................O...................O....................
.....................................O...O....................
.....................................O.O......................

:switch engine The following pattern discovered by Charles Corderman in 1971, which is a glide symmetric unstable puffer which moves diagonally at a speed of c/12 (8 cells every 96 generations).

.O.O..
O.....
.O..O.
...OOO

The exhaust is dirty and unfortunately catches up and destroys the switch engine before it runs 13 full periods. Corderman found several ways to stabilize the switch engine to produce puffers, using either one or two switch engines in tandem. See stabilized switch engine and ark.

No spaceships were able to be made from switch engines until Dean Hickerson found the first one in April 1991 (see Cordership). Switch engine technology is now well-advanced, producing many c/12 diagonal spaceships, puffers, and rakes of many periods.

Small polyominoes exist whose evolution results in a switch engine. See nonomino switch engine predecessor.

Several three-glider collisions produce dirty reactions that produce a stabilized switch engine along with other ash, making infinite growth. Until recently the only known syntheses for clean unstabilized switch engines used four or more gliders. There are several such recipes. In the reaction shown below no glider arrives from the direction that the switch engine will travel to, making it easier to repeat the reaction:

OOO................
..O................
.O.................
...................
.......OO..........
......OO...........
........O..........
...................
...................
...................
...................
...................
...................
...................
..OO...............
.O.O...............
...O...............
...................
................OOO
................O..
.................O.
Running the above for 20 ticks completes a kickback reaction with the top two gliders, resulting in the three-glider switch engine recipe discovered by Luka Okanishi on 12 March 2017.

:switch engine channel Two lines of boats (or other suitable objects, such as tub with tails) arranged so that a switch engine can travel between them, in the following manner:

..............OO................
.............O.O................
..............O.................
................................
................................
................................
................................
................................
.......OOO............OO........
........O..O.........O.O........
............O.........O.........
.........O.O....................
................................
................................
................................
................................
..............................OO
.............................O.O
..............................O.
................................
................................
.O..............................
O.O.............................
OO..............................
................................
................................
................................
................................
................................
.........O......................
........O.O.....................
........OO......................
David Bell used this in June 2005 to construct a "bobsled" oscillator, in which a switch engine factory sends switch engines down a channel, at the other end of which they are deleted.

:switch engine chute = switch engine channel

:switch-engine ping-pong A very large (210515x183739) quadratic growth pattern found by Michael Simkin in October 2014. Currently this is the smallest starting population (23 cells) known to result in a quadratic population growth rate. Previous record-holders include Jaws, mosquito1, mosquito2, mosquito3, mosquito4, mosquito5, teeth, catacryst, metacatacryst, Gotts dots, wedge, 26-cell quadratic growth, 25-cell quadratic growth, and 24-cell quadratic growth.

:symmetric Any object which can be rotated and/or flipped over an axis and still maintain the same shape. Many common small objects such as the block, beehive, pond, loaf, clock, and blinker are symmetric. Some larger symmetric objects are Kok's galaxy, Achim's p16, cross, Eureka, and the pulsar.

Large symmetric objects can easily be created by placing multiple copies of any finite object together in a symmetrical way. Unless the individual objects interact significantly, this is considered trivial and is not considered further here (e.g., two LWSSs travelling together a hundred cells apart).

There are two kinds of symmetry. Odd symmetry occurs when an object's line of reflection passes through the center of a line of cells. Objects with odd symmetry have an odd number of columns or rows, and can have a gutter. Even symmetry occurs when the line of reflection follows the boundary between two lines of cells. Objects with even symmetry have an even number of columns or rows.

Because the Life universe and its rules are symmetric, all symmetric objects must remain symmetric throughout their evolution. Most non-symmetric objects keep their non-symmetry as they evolve, but some can become symmetric, especially if they result in a single object. Here is a slightly more complicated example where two gliders interact to form a blockade:

..O.........
O.O.........
.OO........O
.........OO.
..........OO

Many useful objects are symmetric along an orthogonal axis. This commonly occurs by placing two copies of an object side by side to change the behaviour of the objects due to the inhibition or killing of new cells at their gutter interface. Examples of this are twin bees shuttle, centinal, and the object shown in puffer. Other useful symmetric objects are created by perturbing a symmetric object using nearby oscillators or spaceships in a symmetric manner. Examples of this are Schick engine, blinker ship, and hivenudger.

Many spaceships found by search programs are symmetric because the search space for such objects is much smaller than for non-symmetrical spaceships. Examples include dart, 60P5H2V0, and 119P4H1V0.

:synchronized Indicates that precise relative timing is required for two or more input signals entering a circuit, or two or more sets of gliders participating in a glider synthesis. Compare asynchronous. See also salvo and slow glider construction.

:synchronous = synchronized

:synthesis = glider synthesis

:syringe A small stable converter found by Tanner Jacobi in March 2015, accepting a glider as input and producing an output Herschel As of June 2018 it is the smallest known converter of this type, so it is very often used to handle input gliders in complex signal circuitry, as described in Herschel circuit. A second glider can safely follow the first any time after 78 ticks, but overclocking also allows the syringe to work at a repeat time of 74 or 75 ticks. If followed by a dependent conduit a simple eater2 can be used instead of the large welded catalyst shown here. A ghost Herschel marks the output location.

....O.............................
.....O............................
...OOO............................
..................O...............
................OOO...............
...............O..................
...............OO.................
OO................................
.O................................
.O.OO.............................
..O..O.......................O....
...OO........................O....
..................OO.........OOO..
..................OO...........O..
..................................
..................................
..................................
...........................O...OO.
..........................O.O...O.
.........................O.O...O..
.....................OO.O.O...O...
.....................OO.O..OOOO.O.
.........................O.O...O.O
.....................OO.OO..O..O.O
......................O.O..OO...O.
..........OO..........O.O.........
..........OO...........O..........

A different version of the large catalyst, with better clearance for some situations, can be seen in the switch entry.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_f.htm0000755000175000017500000022773513317135606016415 00000000000000 Life Lexicon (F)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:F116 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in February 1997. After 116 ticks, it produces a Herschel at (32, 1) relative to the input. Its recovery time is 138 ticks; this can be reduced to 120 ticks by adding extra mechanisms to suppress the internal glider. It is Spartan only if the following conduit is a dependent conduit, so that the welded FNG eater can be removed. A ghost Herschel in the pattern below marks the output location:

........O..........................
........OOO........................
...........O.......................
..........OO.......................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
O..................................
O.O.............................O..
OOO.............................O..
..O.............................OOO
..................................O
...................................
...................................
...................................
...................................
.........................OO........
...................OO.....O........
...................O.O.OOO.........
............OO.......O.O...........
............OO.......OO............

:F117 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HFx58B + BFx59H. After 117 ticks, it produces a Herschel at (40, -6) relative to the input. Its recovery time is 63 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. A ghost Herschel in the pattern below marks the output location:

......................OO.....................
.......................O.....................
..........O...........O......................
..........OOO.........OO.....................
.............O...............................
OO..........OO...............................
.O...........................................
.O.O.........................................
..OO.........................................
.........................OO...............O..
.........................OO...............O..
..........................................OOO
............................................O
.............................................
.............................................
..O..........................................
..O.O........................................
..OOO........................................
....O...........OO...........................
................O............................
.................OOO.........................
...................O.........................

:F166 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in May 1997. It is composed of two elementary conduits, HFx107B + BFx59H. The F166 and Lx200 conduits are the two original dependent conduits (several more have since been discovered). After 166 ticks, it produces a Herschel at (49, 3) relative to the input. Its recovery time is 116 ticks. A ghost Herschel in the pattern below marks the output location:

.................................OO.....................
..................................O.....................
.................................O......................
.................................OO.....................
........................................................
........................................................
.OO.....................................................
OOO.OO..................................................
.OO.OOO.OO..............................................
OOO.OO..OO..........................OO...............O..
OO..................................OO...............O..
.....................................................OOO
.......................................................O
........................................................
........................................................
........................................................
......OO................................................
.....O.O......................................OO........
.....O.........................................O........
....OO.........................OO...........OOO.........
...............................OO...........O...........
........................................................
........................................................
.................OO.....................................
..................O.....................................
...............OOO......................................
...............O........................................
...........................OO...........................
...........................O............................
............................OOO.........................
..............................O.........................
The F166 can be made Spartan by replacing the snake with an eater1 in one of two orientations. The input shown here is a Herschel great-grandparent, since the input reaction is catalysed by the transparent block before the Herschel's standard form can appear.

:F171 An elementary conduit, the seventeenth Herschel conduit, discovered by Brice Due in August 2006 in a search using only eaters as catalysts. This was the first new Herschel conduit discovery since 1998. After 171 ticks, it produces a Herschel at (29, -17) relative to the input. A ghost Herschel in the pattern below marks the output location:

..........O......................
..........OOO....................
.............O...................
............OO...................
.....O...........................
.....OOO.........................
........O........................
.......OO........................
.................................
..............................O..
....OO........................O..
.....O........................OOO
.....O.O........................O
......OO.........................
.................................
.................................
O................................
OOO..............................
...O.............................
..OO.............................
.................................
.................................
.................................
.................................
.................................
.................................
.O...............................
.O.O.............................
.OOO.............................
...O.............................
.................................
..........OO.....................
...........O.....................
........OOO......................
........O........................

The conduit's recovery time is 227 ticks, slower than many of the original sixteen conduits because of the delayed destruction of a temporary blinker, though the circuit itself is clearly Spartan. The recovery time can be improved to 120 ticks by adding sparkers of various periods to suppress the blinker. See clock for a period-2 example.

The central eater in the group of three to the northwest can be removed to release an additional glider output signal on a transparent lane.

:factory Another word for gun, but not used in the case of glider guns. The term is also used for a pattern that repeatedly manufactures objects other than spaceships or rakes. In this case the new objects do not move out of the way, and therefore must be used up in some way before the next one is made. The following shows an example of a p144 gun which consists of a p144 block factory whose output is converted into gliders by a p72 oscillator.

.......................OO........................OO
.......................OO........................OO
.........................................OO........
........................................O..O.......
.........................................OO........
...................................................
....................................OOO............
....................................O.O............
.........OO.........................OOO............
.........OO.........................OO.............
........O..O.......................OOO.............
........O..O.OO....................O.O.............
........O....OO....................OOO.............
..........OO.OO....................................
...............................OO..................
.....................OO.......O..O.................
.....................OO........OO..................
.................................................OO
.................................................OO
...................................................
....OO..................O..........................
OO....OOOO..........OO..OO.OOO.....................
OO..OO.OOO..........OO....OOOO.....................
....O...................OO.........................
This gun is David Bell's improvement of the one Bill Gosper found in July 1994. The p72 oscillator is by Robert Wainwright in 1990, and the block factory is Achim's p144 minus one of its stabilizing blocks. For a block factory using stable components and triggered by an input Herschel, see also keeper.

:familiar fours Common patterns of four identical objects. The five commonest are traffic light (4 blinkers), honey farm (4 beehives), blockade (4 blocks), fleet (4 ships, although really 2 ship-ties) and bakery (4 loaves, although really 2 bi-loaves). Also sometimes included is four skewed blocks.

:fanout A mechanism that emits two or more objects of some type for each one that it receives. Typically the objects are gliders or Herschels; glider duplicators are a special case.

:Fast Forward Force Field The following reaction found by Dieter Leithner in May 1994. In the absence of the incoming LWSS the gliders would simply annihilate one another, but as shown they allow the LWSS to advance 11 spaces in the course of the next 6 generations.

.......O......O..
........O......OO
..OO..OOO.....OO.
OO.OO............
OOOO.........O...
.OO.........OO...
............O.O..

The illusion of super-light-speed travel is caused by an LWSS that is always created, but is then destroyed in some cases, by a signal catching up to it from behind that necessarily never travels faster than the speed of light. It is not possible to make any use of the apparent super-light-speed signal. The front end of an output LWSS can't be distinguished from the alternative dying spark output until several more ticks have passed. Not surprisingly, this extra time is enough to drop the average speed of information transmission safely below c.

Leithner named the Fast Forward Force Field in honour of his favourite science fiction writer, the physicist Robert L. Forward. See also star gate and speed booster.

:fate The result of evolving a pattern until its final behaviour is known. This answers such questions such as whether or not the pattern remains finite, what its growth rate is, what period the final state may settle into, and what its final census is. All small Life objects seem to eventually settle down into a mix of oscillators, simple spaceships, and occasionally small puffers. See methuselah, soup, ash.

Most sufficiently large random patterns are expected to grow forever due to the production of switch engines at their boundary. Engineered Life objects - and therefore also sufficiently large and unlikely random patterns - can have more interesting behaviour, such as breeders, sawtooths, and prime calculators. Some objects have even been constructed or designed having an unknown fate.

:father = parent

:fd Abbreviation for full diagonals.

:featherweight spaceship = glider

:fencepost Any pattern that stabilizes one end of a wick.

:Fermat prime calculator A pattern constructed by Jason Summers in January 2000 that exhibits infinite growth if and only if there are no Fermat primes greater than 65537. The question of whether or not it really does exhibit infinite growth is therefore equivalent to a well-known and long-standing unsolved mathematical problem. It will, however, still be growing at generation 102585827975. The pattern is based on Dean Hickerson's primer and caber tosser patterns and a p8 beehive puffer by Hartmut Holzwart.

:F-heptomino Name given by Conway to the following heptomino.

OO..
.O..
.O..
.OOO

:figure-8 (p8) A domino sparker found by Simon Norton in 1970.

OOO...
OOO...
OOO...
...OOO
...OOO
...OOO

:filter Any oscillator used to delete some but not all of the spaceships in a stream. An example is the blocker, which can be positioned so as to delete every other glider in a stream of period 8n+4, and can also do the same for LWSS streams. Other examples are the MW emulator and T-nosed p4 (either of which can be used to delete every other LWSS in a stream of period 4n+2), the fountain (which does the same for MWSS streams) and a number of others, such as the p6 pipsquirter, the pentadecathlon and the p72 oscillator shown under factory. Another example, a p4 oscillator deleting every other HWSS in a stream of period 4n+2, is shown below. (The p4 oscillator here was found, with a slightly larger stator, by Dean Hickerson in November 1994.)

..........OOOO............
....OO...OOOOOO...........
OOOO.OO..OOOO.OO..........
OOOOOO.......OO...........
.OOOO.....................
..........................
................OO........
..............O....O......
..........................
.............O.O..O.O.....
...........OOOO.OO.OOOO...
........O.O....O..O....O.O
........OO.OO.O....O.OO.OO
...........O.O......O.O...
........OO.O.O......O.O.OO
........OO.O..........O.OO
...........O.O.OOOO.O.O...
...........O.O......O.O...
..........OO.O.OOOO.O.OO..
..........O..OOO..OOO..O..
............O..OOOO..O....
...........OO.O....O.OO...
...........O..O....O..O...
............O..O..O..O....
.............OO....OO.....

:filter stream A stream of spaceships in which there are periodic gaps in the stream. This can thin out another crossing stream by deleting the spaceships in the second stream except where the gaps occur. The filter stream is not affected by the deletions so that the same stream can thin out multiple other streams. The Caterpillar uses filter streams of MWSSs in which there is a gap every 6 spaceships. Here is part of a filter stream that thins a glider stream by 2/3:

................................O.............................
.................................O............................
...............................OOO............................
..............................................................
..............................................................
..............................................................
..............................................................
.......................................O......................
........................................O.....................
......................................OOO.....................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................O...............
...............................................O..............
.............................................OOO..............
..............................................................
..............................................................
..O.............O...........................O.............O...
O...O.........O...O.......................O...O.........O...O.
.....O.............O...........................O.............O
O....O........O....O......................O....O........O....O
.OOOOO.........OOOOO.......................OOOOO.........OOOOO

:finger A protruding cell in an oscillator or dying spark, with the ability to modify a nearby active reaction. Like a thumb, a finger cell appears at the edge of a reaction envelope and is the only live cell in its row or column. The finger spark remains alive for two ticks before dying, whereas a thumb cell dies after one tick. Because the key cell is kept alive for an extra tick, an alternate technical term is "held (orthogonal) bit spark". A "held diagonal bit spark" is not possible in B3/S23 for obvious reasons.

:fire An encoded signal used in combination with push and pull elbow operations in a simple construction arm. When a FIRE signal is sent, the construction-arm elbow produces an output glider, usually at 90 degrees from the construction arm. This terminology is generally used when there is only a single recipe for such a glider output, or only one recipe for each glider colour (e.g., FIRE WHITE, FIRE BLACK).

:fireship (c/10 orthogonally, p10) A variant of the copperhead with a trailing component that emits several large sparks, discovered by Simon Ekström on 20 March 2016. The interaction between the copperhead and the additional component is minimal enough that the extension technically fits the definition of a tagalong. However, the extension slightly modifies two of the phases of the spaceship, starting two ticks after the phase shown below, so it's also valid to classify the fireship as a distinct spaceship.

....OO....
...OOOO...
..........
..OOOOOO..
...OOOO...
..........
..OO..OO..
OO.O..O.OO
...O..O...
..........
..........
....OO....
....OO....
..........
.O.O..O.O.
O..O..O..O
O........O
O........O
OO......OO
..OOOOOO..

:fire-spitting (p3) Found by Nicolay Beluchenko, September 2003.

...O......
.OOO......
O.........
.O.OOO....
.O.....O..
..O..O....
..O.O..O.O
........OO

:first natural glider The glider produced at T=21 during the evolution of a Herschel. This is the most common signal output from a Herschel conduit.

:fish A generic term for LWSS, MWSS and HWSS, or, more generally, for any spaceship. In recent years *WSS is much more commonly used to refer to the small orthogonal c/2 spaceships.

:fishhook = eater1

:fleet (p1) A common formation of two ship-ties.

....OO....
....O.O...
.....OO...
.......OO.
OO.....O.O
O.O.....OO
.OO.......
...OO.....
...O.O....
....OO....

:flip-flop Any p2 oscillator. However, the term is also used in two more specific (and non-equivalent) senses: (a) any p2 oscillator whose two phases are mirror images of one another, and (b) any p2 oscillator in which all rotor cells die from underpopulation. In the latter sense it contrasts with on-off. The term has also been used even more specifically for the 12-cell flip-flop shown under phoenix.

:flip-flops Another name for the flip-flop shown under phoenix.

:flipper Any oscillator or spaceship that forms its mirror image halfway through its period.

:flotilla A spaceship composed of a number of smaller interacting spaceships. Often one or more of these is not a true spaceship and could not survive without the support of the others. The following example shows an OWSS escorted by two HWSS.

....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........
...............
...........OO..
.O............O
O..............
O.............O
OOOOOOOOOOOOOO.
...............
...............
....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........

:fly A certain c/3 tagalong found by David Bell, April 1992. Shown here attached to the back of a small spaceship (also by Bell).

..O...............................
.O.O..............................
.O.O......................O.O...O.
.O.......................OO.O.O..O
...........OOO........O.........O.
OO.........OO..O.OO...O..OOOO.....
.O.O.........OOOO..O.O..OO....OO..
.OO........O..O...OOO.....OOO.....
..O.......O....O..OO..OO..O..O....
...O..O...O....O..OOO.O.O....OO...
.......O.OO....O..OOOO.....O......
....OO...OO....O..OOOO.....O......
....O.O...O....O..OOO.O.O....OO...
...OO.....O....O..OO..OO..O..O....
....O.O....O..O...OOO.....OOO.....
.....O.......OOOO..O.O..OO....OO..
...........OO..O.OO...O..OOOO.....
...........OOO........O.........O.
.........................OO.O.O..O
..........................O.O...O.

:fly-by deletion A reaction performed by a passing convoy of spaceships which deletes a common stationary object without harming the convoy. Fly-by deletion is often used in the construction of puffers and spaceships to clean up unwanted debris.

For c/2 convoys this is not usually difficult since the LWSS, MWSS, and HWSS spaceships have such useful sparks. However, some objects are more difficult to delete. For example, deleting a tub appears to require an unusual p4 spaceship.

.......................O.........
......................O.O........
.......................O.........
.................................
.................................
.................................
................OOO..............
OOO.............O..O.............
O..O....OOO.....O...........OOO..
O.......O..O....O...O.......O..O.
O...O..O...O....O...O.......O....
O......O.O...O..O...........O...O
.O..OO........O.O...........O...O
.OOOOO........O.............O....
....OO......O...OOO..........O.O.
.OO..............................

The deletion of a pond appears to require a convoy which is 89 cells in width containing a very unusual p4 spaceship which has 273 cells. There are small objects which have no known fly-by deletion reactions. However, as in the case of reanimation, hitting them with the output of rakes is an effective brute force method.

:flying machine = Schick engine

:FNG = first natural glider.

:fore and back (p2) Compare snake pit. Found by Achim Flammenkamp, July 1994.

OO.OO..
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
..OO.OO

:forward glider A glider which moves at least partly in the same direction as the puffer(s) or spaceship(s) under consideration.

:fountain (p4) Found by Dean Hickerson in November 1994, and named by Bill Gosper. See also filter and superfountain.

.........O.........
...................
...OO.O.....O.OO...
...O.....O.....O...
....OO.OO.OO.OO....
...................
......OO...OO......
OO...............OO
O..O...O.O.O...O..O
.OOO.OOOOOOOOO.OOO.
....O....O....O....
...OO.........OO...
...O...........O...
.....O.......O.....
....OO.......OO....

:four skewed blocks (p1) The following constellation, sometimes considered to be one of the familiar fours.

...OO.....
...OO.....
..........
..........
..........
........OO
OO......OO
OO........
..........
..........
..........
.....OO...
.....OO...
This is most commonly created by a symmetric 2-glider collision:
.OO.....
O.O.....
..O..O..
.....O.O
.....OO.

:fourteener (p1)

....OO.
OO..O.O
O.....O
.OOOOO.
...O...

:fox (p2) This is the smallest asymmetric p2 oscillator. Found by Dave Buckingham, July 1977.

....O..
....O..
..O..O.
OO.....
....O.O
..O.O.O
......O

:freeze-dried A term used for a glider constructible seed that can activated in some way to produce a complex object. For example, a "freeze-dried salvo" is a constellation of constructible objects which, when triggered by a single glider, produces a unidirectional glider salvo, and nothing else. Freeze-dried salvos can be useful in slow salvo constructions, especially when an active circuit has to destroy or reconstruct itself in a limited amount of time. Gradual modification by a construction arm may be too slow, or the circuit doing the construction may itself be the object that must be modified.

The concept may be applied to other types of objects. For example, one possible way to build a gun for a waterbear would be to program a construction arm to build a freeze-dried waterbear seed, and then trigger it when the construction is complete.

:French kiss (p3) Found by Robert Wainwright, July 1971.

O.........
OOO.......
...O......
..O..OO...
..O....O..
...OO..O..
......O...
.......OOO
.........O
For many years this was one of the best-known small oscillators with no known glider synthesis. In October 2013 Martin Grant completed a 23-glider construction.

:frog II (p3) Found by Dave Buckingham, October 1972.

..OO...OO..
..O.O.O.O..
....O.O....
...O.O.O...
...OO.OO...
.OO.....OO.
O..O.O.O..O
.O.O...O.O.
OO.O...O.OO
....OOO....
...........
...O.OO....
...OO.O....

:frothing puffer A frothing puffer (or a frothing spaceship) is a puffer (or spaceship) whose back end appears to be unstable and breaking apart, but which nonetheless survives. The exhaust festers and clings to the back of the puffer/spaceship before breaking off. The first known frothing puffers were c/2, and most were found by slightly modifying the back ends of p2 spaceships. A number of these have periods which are not a multiple of 4 (as with some line puffers). Paul Tooke has also found c/3 frothing puffers.

The following p78 c/2 frothing puffer was found by Paul Tooke in April 2001.

.......O.................O.......
......OOO...............OOO......
.....OO....OOO.....OOO....OO.....
...OO.O..OOO..O...O..OOO..O.OO...
....O.O..O.O...O.O...O.O..O.O....
.OO.O.O.O.O....O.O....O.O.O.O.OO.
.OO...O.O....O.....O....O.O...OO.
.OOO.O...O....O.O.O....O...O.OOO.
OO.........OO.O.O.O.OO.........OO
............O.......O............
.........OO.O.......O.OO.........
..........O...........O..........
.......OO.O...........O.OO.......
.......OO...............OO.......
.......O.O.O.OOO.OOO.O.O.O.......
......OO...O...O.O...O...OO......
......O..O...O.O.O.O...O..O......
.........OO....O.O....OO.........
.....OO....O...O.O...O....OO.....
.........O.OO.O...O.OO.O.........
..........O.O.O.O.O.O.O..........
............O..O.O..O............
...........O.O.....O.O...........

:frothing spaceship See frothing puffer.

:frozen = freeze-dried.

:full diagonal Diagonal distance measurement, abbreviated "fd", often appropriate when a construction arm elbow or similar diagonally-adjustable mechanism is present.

:fumarole (p5) Found by Dean Hickerson in September 1989. In terms of its 7x8 bounding box this is the smallest p5 oscillator.

...OO...
.O....O.
.O....O.
.O....O.
..O..O..
O.O..O.O
OO....OO

:fuse A wick burning at one end. For examples, see baker, beacon maker, blinker ship, boat maker, cow, harvester, lightspeed wire, pi ship, reverse fuse, superstring and washerwoman. Useful fuses are usually clean, but see also reburnable fuse.

A fuse can burn arbitrarily slowly, as demonstrated by the example Blockic fuse below. A signal, alternating between glider and MWSS form, travels up and down between two rows of blocks in a series of one-time turner reactions. The spacing shown here causes the fuse to burn 24 cells to the right every 240 generations, for a speed of c/10. Moving the bottom half further from the top half by any even number of cells will slow down the burning even further.

.........OO......................OO......................
.........OO......................OO......................
.........................................................
.........................................................
.....OO.......OO.............OO.......OO.............OO..
.OO..OO.......OO.........OO..OO.......OO.........OO..OO..
.OO................OO....OO................OO....OO......
...................OO......................OO............
.........................................................
.........................................................
.........................................................
.........................................................
............OO....OO................OO....OO.............
............OO....OO................OO....OO.............
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
OO....OO................OO....OO................OO....OO.
OO....OO................OO....OO................OO....OO.
.........................................................
.........................................................
.........................................................
.........................................................
.OO....OO......................OO......................OO
O.O....OO....OO................OO....OO................OO
..O..........OO..OO.......OO.........OO..OO.......OO.....
.................OO.......OO.............OO.......OO.....
.........................................................
.........................................................
.....................OO......................OO..........
.....................OO......................OO..........

:Fx119 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in September 1996. After 119 ticks, it produces an inverted Herschel at (20, 14) relative to the input. Its recovery time is 231 ticks; this can be reduced somewhat by suppressing the output Herschel's glider, or by adding extra catalysts to make the reaction settle more quickly. A ghost Herschel in the pattern below marks the output location:

O......................
O.O....................
OOO....................
..O....................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.........OO...........O
....OO...OO.........OOO
....OO..............O..
....................O..
.......................
...OO..................
....O....OO............
.OOO.....OO............
.O.....................

:Fx119 inserter A Herschel-to-glider converter and edge shooter based on an Fx119 Herschel conduit:

.........O....................
.........O.O..................
.........OOO..................
...........O..................
..............................
..............................
..............................
..............................
..OO......OO..................
...O.......O..................
OOO.....OOO...................
O.......O.....................
..............................
..............................
..............................
..................OO..........
.............OO...OO..........
.............OO...............
..............................
..............................
............OO............OO..
.............O....OO......O...
..........OOO.....OO.......OOO
..........O..................O

This edge shooter has an unusually high 27hd clearance, one of the highest known for a single small component. The only known higher-clearance edge shooters are injectors making use of multiple interacting spaceships. This makes the Fx119 inserter ideal for the construction of wide convoys whose total width can fit within its clearance distance.

The component creates a large cloud of smoke behind its emitted glider which lasts for over 90 generations. In spite of this, many tightly packed convoys can be made by injecting later gliders behind others in the convoy, helped along by the insertion reaction which is able to catch up to the existing gliders. The Fx119 inserter can place a glider on the same lane as a passing glider and as close as 15 ticks behind, which is only one step away from the minimum possible following distance.

:Fx153 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in February 1997. It is made up of two elementary conduits, HF94B + BFx59H. After 153 ticks, it produces an inverted Herschel at (48, -4) relative to the input. Its recovery time is 69 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. A ghost Herschel in the pattern below marks the output location:

.........................OO..........................
OO........................O..........................
.O.............OO......OOO...........................
.O.O...........OO......O.............................
..OO.................................................
.....................................................
.....................................................
.....................................................
....................................................O
..................................................OOO
.................................OO...............O..
..O..............................OO...............O..
..O.O................................................
..OOO................................................
....O................................................
.....................................................
.....................................................
..............................OO.....................
..............................O......................
...........OO...OO.............O.....................
............O...O.............OO.....................
.........OOO.....OOO.................................
.........O.........O.................................

:Fx158 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. After 158 ticks, it produces an inverted Herschel at (27, -5) relative to the input. Its recovery time is 176 ticks. It is the only known small conduit that does not produce its output Herschel via the usual Herschel great-grandparent, so it cannot be followed by a dependent conduit. A ghost Herschel in the pattern below marks the output location:

.........O....OO..............
........O.O..O.O.......OO.....
.......O..OOOO.........O......
.......O.O....O......O.O......
.....OOO.OO..OO......OO.......
....O.........................
.O..OOOO.OO...................
.OOO...O.OO...................
....O.........................
...OO.........................
..............................
..............................
..............................
..............................
..............................
..............................
.............................O
...........................OOO
...........................O..
...........................O..
O.............................
O.O...........................
OOO...........................
..O...........................
..............................
...............OO.............
.........OO....O.O............
..........O......O............
.......OOO.......OO...........
.......O......................

:Fx176 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in October 1997. It is made up of three elementary conduits, HF95P + PF35W + WFx46H. After 176 ticks, it produces an inverted Herschel at (45, 0) relative to the input. The recovery time of the standard form shown here is 92 ticks, but see the PF35W entry for a variant discovered in November 2017 that lowers the repeat time to 73 ticks. A ghost Herschel in the pattern below marks the output location.

..............................OO..................
..............................OO..................
..................................................
.................OO...............................
..................O...............................
..................O.O.............................
...................OO.............................
..................................................
..................................................
..............OO..................................
......O.......OO..................................
......OOO.........................................
.........O........................................
........OO........................................
..................................................
OO................................................
.O................................................
.O.O.....................................OO.......
..OO......................................O.......
..........................................O.O.....
...........................................O.O....
............................................O...OO
................................................OO
..................................................
..................................................
..O...............................................
..O.O...............................OO...........O
..OOO...............................OO.........OOO
....O..........................................O..
...............................................O..
..............OO........OO........................
..............OO..OO.....O........................
..................O.O.OOO.........................
....................O.O...........................
....................OO....OO......................
.........................O.O....OO................
.........................O......OO................
........................OO........................

:Fx77 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in August 1996. After 77 ticks, it produces an inverted Herschel at (25, -8) relative to the input. Its recovery time is 61 ticks; this can be reduced slightly by suppressing the output Herschel's glider, as in the L112 case. A pipsquirter can replace the blinker-suppressing eater to produce an extra glider output. It is one of the simplest known Spartan conduits, and one of the few elementary conduits in the original set of sixteen.

In January 2016, Tanner Jacobi discovered a Spartan method of extracting an extra glider output (top variant below). A ghost Herschel marks the output location for each variant.

.O............................
.OOO..........................
....O.........................
...OO...........OO...........O
................OO.........OOO
...........................O..
...........................O..
..............................
..............................
..............................
..O...........................
..O.O.........................
..OOO.........................
....O.........................
..............................
..............................
..............................
..............................
..............................
............OO......OO........
...........O..O.....OO........
...........O..O...............
............OO................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
O.............................
OOO...........................
...O..........................
..OO...........OO...........O.
...............OO.........OOO.
..........................O...
..........................O...
..............................
..............................
..............................
.O............................
.O.O..........................
.OOO..........................
...O..........................
..............................
..............................
..............................
..............................
..............................
................OO............
................O.O...........
..................O...........
..................OO..........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_bib.htm0000755000175000017500000001022213171233731016675 00000000000000 Life Lexicon (Bibliography)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

BIBLIOGRAPHY

David I. Bell, Spaceships in Conway's Life. Series of articles posted on comp.theory.cell-automata, Aug-Oct 1992. Now available from his website.

David I. Bell, Speed c/3 Technology in Conway's Life, 17 December 1999. Available from his website.

Elwyn R. Berlekamp, John H. Conway and Richard K. Guy, Winning Ways for your Mathematical Plays, II: Games in Particular. Academic Press, 1982.

David J Buckingham, Some Facts of Life. BYTE, December 1978.

Dave Buckingham, My Experience with B-heptominos in Oscillators. 12 October 1996. Available from Paul Callahan's website.

David J. Buckingham and Paul B. Callahan, Tight Bounds on Periodic Cell Configurations in Life. Experimental Mathematics 7:3 (1998) 221-241. Available at http://tinyurl.com/TightBoundsOnCellConfigs.

Noam D. Elkies, The still-Life density problem and its generalizations, pp228-253 of "Voronoi's Impact on Modern Science, Book I", P. Engel, H. Syta (eds), Institute of Mathematics, Kyiv, 1998 = Vol.21 of Proc. Inst. Math. Nat. Acad. Sci. Ukraine, math.CO/9905194.

Martin Gardner, Wheels, Life, and other Mathematical Amusements. W. H. Freeman and Company, 1983.

R. Wm. Gosper, Exploiting Regularities in Large Cellular Spaces. Physica 10D (1984) 75-80.

N. M. Gotts and P. B. Callahan, Emergent structures in sparse fields of Conway's 'Game of Life', in Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, MIT Press, 1998.

Mark D Niemiec, Life Algorithms. BYTE, January 1979.

William Poundstone, The Recursive Universe. William Morrow and Company Inc., 1985.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_t.htm0000644000175000017500000033052313317135606016416 00000000000000 Life Lexicon (T)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:T = T-tetromino

:table The following induction coil.

OOOO
O..O

:table on table (p1)

O..O
OOOO
....
OOOO
O..O

:tag = tagalong

:tagalong An object which is not a spaceship in its own right, but which can be attached to one or more spaceships to form a larger spaceship. For examples see Canada goose, fly, pushalong, sidecar and sparky. See also Schick engine, which consists of a tagalong attached to two LWSS (or similar).

The following c/4 spaceship (Nicolay Beluchenko, February 2004) has two wings, either of which can be considered as a tagalong. But if either wing is removed, then the remaining wing becomes an essential component of the spaceship, and so is no longer a tagalong.

.......................O.......................
.......................O.......................
......................O.O......................
...............................................
.....................O...O.....................
....................OO...OO....................
..................OO.O...O.OO..................
................OO.O.O...O.O.OO................
............O...OOO.O.....O.OOO...O............
............OOOOOO...........OOOOOO............
...........O..O....O.......O....O..O...........
...................O.......O...................
..........OOO.....................OOO..........
.........O.OO.....................OO.O.........
........O..O.......................O..O........
........O.............................O........
.........OO.........................OO.........
.........OO.........................OO.........
OOO......O...........................O......OOO
.O......OOO.........................OOO......O.
......OO..O.........................O..OO......
..OO.O.OOO...........................OOO.O.OO..
.O...O.O...............................O.O...O.
.O...OO.................................OO...O.

:tail spark A spark at the back of a spaceship. For example, the 1-bit spark at the back of a LWSS, MWSS or HWSS in their less dense phases.

:tame To perturb a dirty reaction using other patterns so as to make it clean and hopefully useful. Or to make a reaction work which would otherwise fail due to unwanted products which interfere with the reaction.

:taming See tame.

:tandem glider Two gliders travelling on parallel lanes at a fixed spacetime offset, usually as a single signal in a Herschel transceiver. See also glider pair.

:Tanner's p46 (p46) An oscillator found by Tanner Jacobi on 20 October 2017. This oscillator hassles an evolving pi-heptomino to produce an phi spark. The spark is very accessible and is able to perturb many things.

..............O...........
...OO.......OO.OO.........
...OO.......OO.OO.....O.OO
......................OO.O
..........................
..OO......................
...O......................
OOO.......................
O.............O...........
.............O.O.O.OO.....
............O.OO.OO.O.....
............O.............
...........OO.............
The snakes can be replaced with eaters to form a slightly smaller version, as shown in the p46 MWSS gun in gliderless

The period of this new oscillator is the same as the old twin bees shuttle, and so this is able to expand the known p46 technology. For example, a p46 glider gun can be made from a Tanner's p46 and just one of the twin bees shuttles.

Acting on their own, two copies of Tanner's p46 placed at right angles to each other with their sparks interacting can produce two different p46 glider guns and a gliderless p46 MWSS gun. See p46 gun and gliderless for two of these. These are the first p46 guns found which do not use a twin bees shuttle at all.

:target A necessary component of a slow salvo recipe used by a single-arm universal constructor. A target usually consists of a single object, or sometimes a small constellation of common still lifes and/or oscillators. See intermediate target. If no hand target is available, a construction arm may be unable to construct anything, unless recipes are available to generate targets directly from the elbow.

:teardrop The following induction coil, or the formation of two beehives that it evolves into after 20 generations. (Compare butterfly, where the beehives are five cells further apart.)

OOO.
O..O
O..O
.OO.

:technician (p5) Found by Dave Buckingham, January 1973.

.....O.....
....O.O....
....OO.....
..OO.......
.O...OOO...
O..OO...O.O
.OO....O.OO
...O.O.O...
...O...O...
....OOO....
......O.O..
.......OO..

:technician finished product = technician

:technology The collective set of known reactions exploiting one subset of the Life universe. Examples of these subsets include glider synthesis, period 30 glider streams, c/3 spaceships, sparkers, Herschel conduits, and slow salvos. As new reactions and objects are found, over time any particular technology becomes more versatile and complete. Many Life experts like to concentrate on particular technologies.

:tee A head-on collision between three gliders, producing a perpendicular output glider that can be used to construct closely spaced glider salvos, or to inject a glider into an existing stream. There are several workable recipes. One of the more useful is the following, because the tandem glider can be generated by a small Herschel converter, SW1T43:

...............O.
..............O..
..............OOO
.........O.......
.........O.O.....
.........OO......
.OO..............
O.O..............
..O..............

:teeth A 65-cell quadratic growth pattern found by Nick Gotts in March 2000. This (and a related 65-cell pattern which Gotts found at about the same time) beat the record previously held by mosquito5 for smallest population known to have superlinear growth, but was later superseded by catacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:telegraph A pattern created by Jason Summers in February 2003. It transmits and receives information using a rare type of reburnable fuse, a lightspeed wire made from a chain of beehives, at the rate of 1440 ticks per bit. The rate of travel of signals through the entire transceiver device can be increased to any speed strictly less than the speed of light by increasing the length of the beehive chain appropriately.

"Telegraph" may also refer to any device that sends and receives lightspeed signals; see also p1 telegraph, high-bandwidth telegraph.

:ternary reaction Any reaction between three objects. In particular, a reaction in which two gliders from one stream and one glider from a crossing stream of the same period annihilate each other. This can be used to combine two glider guns of the same period to produce a new glider gun with double the period.

:test tube baby (p2)

OO....OO
O.O..O.O
..O..O..
..O..O..
...OO...

:tetraplet Any 4-cell polyplet.

:tetromino Any 4-cell polyomino. There are five such objects, shown below. The first is the block, the second is the T-tetromino and the remaining three rapidly evolve into beehives.

OO......OOO......OOOO......OOO......OO.
OO.......O...................O.......OO

:The Online Life-Like CA Soup Search A distributed search effort set up by Nathaniel Johnston in 2009, using a Python script running in Golly. Results included a collection of the longest-lived 20x20 soups, as well as a census of over 174 billion ash objects. It has since been superseded by Catagolue.

:The Recursive Universe A popular science book by William Poundstone (1985) dealing with the nature of the universe, illuminated by parallels with the game of Life. This book brought to a wider audience many of the results that first appeared in LifeLine. It also outlines the proof of the existence of a universal constructor in Life first given in Winning Ways.

:thumb A spark-like protrusion which flicks out in a manner resembling a thumb being flicked. Below on the left is a p9 thumb sparker found by Dean Hickerson in October 1998. On the right is a p4 example found by David Eppstein in June 2000.

.......O..............O.....
...OO...O.........OO...O....
...O.....O.OO.....O.....O...
OO.O.O......O......OOO.O.OO.
OO.O.OO.OOOO............OO.O
...O.O...........OOOOOO....O
...O.O.OOO.......O....OOOOO.
....O.O...O.........O.......
......O..OO........O.OOOO...
......OO...........O.O..O...
....................O.......

:thunderbird (stabilizes at time 243)

OOO
...
.O.
.O.
.O.

:tick = generation

:tic tac toe = octagon II

:tie A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined point to point, as in ship tie boat.

:time bomb The following pattern by Doug Petrie, which is really just a glider-producing switch engine in disguise. See infinite growth for some better examples of a similar nature.

.O...........OO
O.O....O......O
.......O....O..
..O..O...O..O..
..OO......O....
...O...........

:titanic toroidal traveler The superstring with the following repeating segment. The front part becomes p16, but the eventual fate of the detached back part is unknown.

OOOOOO
OOO...

:TL = traffic light

:T-nosed p4 (p4) Found by Robert Wainwright in October 1989. See also filter.

.....O.....
.....O.....
....OOO....
...........
...........
...........
...OOOOO...
..O.OOO.O..
..O.O.O.O..
.OO.O.O.OO.
O..OO.OO..O
OO.......OO

:T-nosed p5 (p5) Found by Nicolay Beluchenko in April 2005.

.....OO...............OO.OO.....O........
..O..O.........OO.O.OOO.OO......O........
.O.O.O.....O....O.O.OOO......OO.O........
O..O.O.OOOOOO.....O....O.O...OO.O........
.OO.O.O..O...OOO..O.OOOO..O.O.OO.OO......
..O.O..OO.O..O..O.OO....OOO.O.O....OO....
.O..O...O..O.O.OO....OOO...O.............
.O.O.O...OOO.O...OOOO...O..O.O..OO.O..O..
OO.O.........OO.O....O.O.O.O........O.OOO
.O.O.O...OOO.O...OOOO...O..O.O..OO.O..O..
.O..O...O..O.O.OO....OOO...O.............
..O.O..OO.O..O..O.OO....OOO.O.O....OO....
.OO.O.O..O...OOO..O.OOOO..O.O.OO.OO......
O..O.O.OOOOOO.....O....O.O...OO.O........
.O.O.O.....O....O.O.OOO......OO.O........
..O..O.........OO.O.OOO.OO......O........
.....OO...............OO.OO.....O........

:T-nosed p6 (p6) Found by Achim Flammenkamp in September 1994. There is also a much larger and fully symmetric version found by Flammenkamp in August 1994.

......OO...OO......
......O.O.O.O......
.......O...O.......
...................
..O.O.O.....O.O.O..
OOO.O.OO...OO.O.OOO
..O.O.O.....O.O.O..
...................
.......O...O.......
......O.O.O.O......
......OO...OO......

:toad (p2) Found by Simon Norton, May 1970. This is the second most common oscillator, although blinkers are more than a hundred times as frequent. See also killer toads. A toad can be used as a 90-degree one-time turner.

.OOO
OOO.

The protruding cells at the edges can perturb some reactions by encouraging and then suppressing births on successive ticks. For example, a toad can replace the northwest eater in the Callahan G-to-H converter, allowing it to be packed one diagonal cell closer to other circuits.

:toad-flipper A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to flip it over. When the sparks are applied again it is flipped back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-flipper will still work, but because of symmetry there are really only two different types. Compare toad-sucker.

.O..............O.
.O..............O.
O.O............O.O
.O..............O.
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O.....O.O
.O..............O.
.O..............O.

:toad-sucker A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to shift it. When the sparks are applied again it is shifted back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-sucker will still work, but because of symmetry there are really only three different types. Compare toad-flipper.

.O................
.O..............O.
O.O.............O.
.O.............O.O
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O......O.
.O.............O.O
.O..............O.
................O.

:toaster (p5) Found by Dean Hickerson, April 1992.

....O......OO..
...O.O.OO..O...
...O.O.O.O.O...
..OO.O...O.OO..
O...OO.O.OO...O
...O.......O...
...O.......O...
O...OO.O.OO...O
..OO.O...O.OO..
...O.O.O.O.O...
...O.O.OO..O...
....O......OO..

:toggleable gun Any gun that can be turned off or turned on by the same external signal - the simplest possible switching mechanism. An input signal causes the gun to stop producing gliders. Another input signal from the same source restores the gun to its original function. Compare switchable gun.

Here's a small example by Dean Hickerson from September 1996:

..............OO..............O..
..............O.O.............O.O
..............O...............OO.
.................................
.................................
.................................
.................................
...............O..O....b.........
.OOOO..............O..b..........
O...O..........O...O..bbb........
....O...........OOOO.............
O..O........................aaa..
............................a....
.............................a...
In the figure above, glider B and an LWSS are about to send a glider NW. Glider A will delete the next glider after B, turning off the output stream. But if the device were already off, B wouldn't be present and A would instead delete the leading LWSS, turning the device back on.

:toggle circuit Any signal-processing circuit that switches back and forth between two possible states or outputs. An early example is the boat-bit. More recent discoveries include the semi-Snarks, which alternate between reflecting and absorbing input gliders. The following B-to-G converter sends alternate glider outputs in opposite directions.

...........OO....................................OO....
......OO..O.O...............................OO..O.O....
......O...O....O............................O...O....O.
.......OOO.OOOOO.............................OOO.OOOOO.
.........O.O...................................O.O.....
.........O.O.OOO...............................O.O.OOO.
..........OO.O..O...............................OO.O..O
...............OO....................................OO
.......................................................
.......................................................
.............................................OO........
.............................................OO........
.......................................................
.......................................................
.......................................................
OO....................................OO...............
OO....................................OO...............
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.........OO....................................OO......
.........OO....................................OO......
.......................................................
OO.O.......O..........................OO.O.......O.....
O.OO......OOO.........................O.OO......OOO....
.........OO..O.................................OO..O...

:TOLLCASS Acronym for The Online Life-Like CA Soup Search.

:toolkit A set of Life reactions and mechanisms that can be used to solve any problem in a specific pre-defined class of problems: glider timing adjustment, salvo creation, seed construction, etc. See also universal toolkit, technology.

:torus As applies to Life, usually means a finite Life universe which takes the form of an m x n rectangle with the bottom edge considered to be joined to the top edge and the left edge joined to the right edge, so that the universe is topologically a torus. There are also other less obvious ways of obtaining a toroidal universe.

See also Klein bottle. Every object in a torus universe obviously either dies or becomes a still life or oscillator.

:total aperiodic Any finite pattern which evolves in such a way that no cell in the Life plane is eventually periodic. The first example was found by Bill Gosper in November 1997. A few days later he found the following much smaller example consisting of three copies of a p12 backrake by Dave Buckingham.

.........................................O.................
........................................OOO................
.......................................OO.O.....O..........
.......................................OOO.....OOO.........
........................................OO....O..OO...OOO..
..............................................OOO....O..O..
........................................................O..
........................................................O..
........................................................O..
........................................OOO............O...
........................................O..O...............
........................................O..................
........................................O..................
.........................................O.................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
......................................OOO..................
......................................O..O...........O.....
......................................O.............OOO....
......................................O............OO.O....
......................................O............OOO.....
.......................................O............OO.....
...........................................................
...........................................................
...................................OOO.....................
..................................OOOOO....................
..................................OOO.OO.......OO........O.
.....................................OO.......OOOO........O
..............................................OO.OO...O...O
................................................OO.....OOOO
...........................................................
...........................................................
....................O......................................
.....................O.....................................
.OO.............O....O................................OOO..
OOOO.............OOOOO..................................O..
OO.OO...................................................O..
..OO...................................................O...
....................................O......................
.....................................O.....................
.....................OO..........O...O.....................
......................OO..........OOOO...............OO....
.....................OO...........................OOO.OO...
.....................O............................OOOOO....
...................................................OOO.....
...........................................................
......................OO...................................
.............OOOO....OOOO..................................
............O...O....OO.OO.................................
.OOOOO..........O......OO..................................
O....O.........O...........................................
.....O.....................................................
....O......................................................

:T-pentomino Conway's name for the following pentomino, which is a common parent of the T-tetromino.

OOO
.O.
.O.

:track A path made out of conduits, often ending where it begins so that the active signal object is cycled forever, forming an oscillator or a gun.

This term has also been used to refer to the lane on which a glider or spaceship travels. The concept is very similar, but a reference to a "track" now usually implies a non-trivial supporting conduit.

:tractor beam A stream of spaceships that can draw an object towards the source of the stream. The example below shows a tractor beam pulling a loaf; this was used by Dean Hickerson to construct a sawtooth.

.....................O..O......................
.....OOOO...........O..............OOOO........
.....O...O..........O...O..........O...O.......
.....O........OO....OOOO...........O........OO.
.OO...O..O...OOOO...........OO......O..O...OOOO
O..O........OO.OO..........OO.OO..........OO.OO
O.O..........OO.............OOOO...........OO..
.O...........................OO................

:traffic circle (p100)

.....................OO....OO...................
.....................O.O..O.O...................
.......................O..O.....................
......................OO..OO....................
.....................OOO..OOO...................
.......................O..O.....................
...............................O................
..............................O.OO..............
..................................O.............
..........................O...O..O.O............
..........................O.....O..O............
..........................O......OO.............
.........OO.....................................
........O..O..........OOO...OOO.................
.......O.O.O....................................
......OOO.O...............O.....................
......OOO.................O.....................
..........................O.....................
............OOO.................................
OO..O................OOO........................
O..OO.....O.....O...............................
.OOOOO....O.....O..O.....O.................O..OO
..........O.....O..O.....O.................OO..O
...................O.....O.......OOO......OOOOO.
.OOOOO......OOO.................................
O..OO................OOO.......O.....O..........
OO..O..........................O.....O....OOOOO.
...............................O.....O.....OO..O
...........................................O..OO
.................................OOO............
.......................................OO.......
......................................OOO.......
.....................................O.OO.......
....................................O.O.........
....................OOO.............O..O........
.....................................OO.........
.............OO....O..O.........................
............O..O................................
............O.O.O...............................
.............O..O...............................
.................O..............................
..............O.O...............................
.....................O..O.......................
...................OOO..OOO.....................
....................OO..OO......................
.....................O..O.......................
...................O.O..O.O.....................
...................OO....OO.....................

:traffic jam Any traffic light hassler, such as traffic circle. The term is also applied to the following reaction, used in most traffic light hasslers, in which two traffic lights interact in such a way as to reappear after 25 generations with an extra 6 spaces between them. See traffic lights extruder for a way to make this reaction extensible.

..OOO...........
...........OOO..
O.....O.........
O.....O..O.....O
O.....O..O.....O
.........O.....O
..OOO...........
...........OOO..

:traffic light (p2) A common formation of four blinkers.

..OOO..
.......
O.....O
O.....O
O.....O
.......
..OOO..

:traffic lights extruder A growing pattern constructed by Jason Summers in October 2006, which slowly creates an outward-growing chain of traffic lights. The growth occurs in waves which travel through the chain from one end to the other. It can be thought of as a complex fencepost for a wick that does not need a wickstretcher.

The following illustrates the reaction used, in which a newly created traffic light at the left eventually pushes the rightmost one slightly to the right.

......................O.......................O....
......................O.......................O....
.........OOO..........O..........OOO..........O....
.OO................................................
OOO....O.....O....OOO...OOO....O.....O....OOO...OOO
.OO....O.....O.................O.....O.............
.......O.....O........O........O.....O........O....
......................O.......................O....
.........OOO..........O..........OOO..........O....

:trans-beacon on table (p2)

....OO
.....O
..O...
..OO..
......
OOOO..
O..O..

:trans-boat with tail (p1)

OO...
O.O..
.O.O.
...O.
...OO

:transceiver = Herschel transceiver.

:trans-loaf with tail (p1)

.O....
O.O...
O..O..
.OO.O.
....O.
....OO

:transmitter = Herschel transmitter.

:transparent In signal circuitry, a term used for a catalyst that is completely destroyed by the passing signal, then rebuilt. Often (though not always) the active reaction passes directly through the area occupied by the transparent catalyst, then rebuilds the catalyst behind itself, as in the transparent block reaction. See also transparent lane.

:transparent block reaction A certain reaction between a block and a Herschel predecessor in which the block reappears in its original place some time later, the reaction having effectively passed through it. This reaction was found by Dave Buckingham in 1988. It has been used in some Herschel conduits, and in the gunstars. Because the reaction involves a Herschel predecessor rather than an actual Herschel, the following diagram shows instead a B-heptomino (which by itself would evolve into a block and a Herschel).

O.............
OO..........OO
.OO.........OO
OO............

:transparent debris effect A mechanism where a Herschel or other active reaction completely destroys a catalyst in a particular location in a conduit. After passing through or past that location, the same reaction then recreates the catalyst in exactly its original position. This type of catalysis is surprisingly common in signal circuitry. For an example, see transparent block reaction.

The transparent object is most often a very common still life such as a block or beehive. Rarer objects are not unknown; for example, a transparent loaf was found by Stephen Silver in October 1997, in a very useful elementary conduit making up part of a Herschel receiver. However, not surprisingly, rarer objects are much less likely to reappear in exactly the correct location and orientation, so transparent reactions involving them are much more difficult to find, on average.

:transparent lane A path through a signal-producing circuit that can be used to merge signal streams. The signal is usually a standard spaceship such as a glider. It can either be produced by the circuit, or it can come from elsewhere, passing safely through on the same lane without interacting with the circuit. A good example is the NW31 converter, which has two glider outputs on transparent lanes:

OO.......................
.O.......................
.O.O.....................
..OO.....................
.........................
.........................
.........................
.......................OO
.......................OO
.........................
..O......................
..O.O....................
..OOO....................
....O....................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.............OO..........
.............OO..........

The optional third output shown in NW31 is non-transparent, because the upper eater1 catalyst would get in the way of a passing glider on the same lane.

:tremi-Snark A colour-preserving period-multiplying signal conduit found by Tanner Jacobi on 7 September 2017, producing one output glider for every three input gliders. It uses the same block-to-pre-honeyfarm bait reaction as the Snark, and so has the same 43-tick recovery time. Compare semi-Snark.

.O............................
..O...........................
OOO...........................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
...........O..................
............OO................
...........OO.................
..............................
...........................O..
.........................OOO..
........................O.....
........................OO....
..............................
..............................
..............................
.......................O......
.....................O.O......
......................OO......
..............OO..............
.............O.O........O.....
.............O.........O.O....
............OO.........O.O....
........................O.....
..............................
..............................
..............................
.....................OO.OO....
.................OO..OO.O...OO
.................O......O.O..O
..................OOOOOOO.OO..
.........................O....
....................OOOO.O....
....................O..OO.....

:trice tongs (p3) Found by Robert Wainwright, February 1982. In terms of its 7x7 bounding box this ties with jam as the smallest p3 oscillator.

..O....
..OOO..
OO...O.
.O.O.O.
.O.....
..OO..O
.....OO

:trigger A signal, usually a single glider, that collides with a seed constellation to produce a relatively rare still life or oscillator, or an output spaceship or other signal. The constellation is destroyed or damaged in the process; compare circuit, reflector. Here a pair of trigger gliders strike a dirty seed constellation assembled by Chris Cain in March 2015, to launch a three-engine Cordership:

....................................................OO.
................................................OO..OO.
................................................OO.....
.......................................................
.......................................................
.......................................................
........................................OO.............
........................................OO.............
...................................................OO..
..................................O................O.O.
.................................O.O...........OO...O.O
..................................OO..........O.O....O.
...............................................O.......
.......................................................
..................................O.................OOO
.................................O.O................O..
..................................OO.................O.
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
...........................O...........................
..........................O.O..........................
...........................OO..........................
.......................................................
.......................................................
...........................O...........................
..........................O.O..........................
...........................OO..........................
.......................................................
.......................................................
.......................................................
.......................................................
.......O....O..........................................
......O.O..O.O.........................................
.......OO...OO.........................................
.......................................................
.......................................................
.......................................................
.......................................................
OO.....................................................
O.O....................................................
.O.O...................................................
..O....................................................
.......................................................
.......................................................
.......................................................
.............O.........................................
............OO.........................................
............O.O........................................

"Trigger" is also used when a spaceship reacts with another object to cause a reaction to occur whenever desired (but perhaps only at particular intervals). The object being triggered lies dormant until the reaction is required. All turners and freeze-dried constellations are triggerable.

In some cases the object is not destroyed so that the reaction can be repeated after some repeat time. See for example converter and reflector, and more specifically MWSS out of the blue and queen bee shuttle pair.

:triomino Either of the two 3-cell polyominoes. The term is rarely used in Life, since the two objects in question are simply the blinker and the pre-block.

:triple caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and double caterer.

.....OO.........
....O..O..OO....
....OO.O...O....
......O.OOO....O
..OOO.O.O....OOO
.O..O..O....O...
O.O..O...O..OO..
.O..............
..OO.OO.OO.OO...
...O...O...O....
...O...O...O....

:triple pseudo The following pattern, found by Gabriel Nivasch in July 2001. It is unique among 32-bit still lifes in that it can be broken down into three stable pieces but not into two. The term may also refer to any larger stable pattern with the same property. See also quad pseudo.

......OO
..O.O..O
.O.OO.O.
.O....OO
OO.OO...
...OO.OO
OO....O.
.O.OO.O.
O..O.O..
OO......

:triplet Any 3-cell polyplet. There are 5 such objects, shown below. The first two are the two triominoes, and the other three vanish in two generations.

O..................O.......O.......O..
OO......OOO......OO.......O.O.......O.
.....................................O

:tripole (p2) The barberpole of length 3.

OO....
O.O...
......
..O.O.
.....O
....OO

:tritoad (p3) Found by Dave Buckingham, October 1977.

.........OO.......
.........O........
..........O..OO...
.......OOO.O..O...
......O....OO.O.OO
......O.OO..O.O.OO
...OO.O...OO..O...
...O..OO...O.OO...
OO.O.O..OO.O......
OO.O.OO....O......
...O..O.OOO.......
...OO..O..........
........O.........
.......OO.........

:trivial A trivial period-N oscillator is one in which every cell oscillates at some smaller factor of N. See omniperiodic. For example, the joining of a period 3 and a period 4 oscillator as shown below creates a single object which is a trivial oscillator of period 12.

........O.O.
...........O
.......O..O.
......O.O.O.
......O..O..
....OO.OO...
...O..O.....
....O.O.....
OO...O......
.O.OO.......
...O........
...O........
However, there are trivial oscillators that meet this requirement, but may still be considered to be non-trivial because the different-period rotors are not separated by stator cells. An example is Dean Hickerson's trivial p6. Conversely, there are oscillators formed by trivial combinations of high-period guns or sparkers that are only technically non-trivial, because the lower-period components overlap but do not interact in any way.

"Trivial" is also used to describe a parent of an object which has groups of cells that can be removed without changing the result, such as isolated faraway cells. For example, here is a trivial parent of a block.

O......
.O....O
.O.....
O......

:trivial p6 (p6) An oscillator found by Dean Hickerson in December 1994. Every cell has period less than 6, so this is a trivial oscillator. It is unusual because it has period-2 cells in contact with period-3 cells.

...........OO..............
...........O......OO.......
........OO.O......O..O.....
........O.O.OO.OO.O.OO..O..
.O........O..O.O..O..O.O.O.
.O.O.....OO..O.O.O.OO..O..O
.O.O.O........OO.O.O.OO.OO.
.......O.O.OOO...O....OO...
..O...O....O.OO........O...
....O...OOO..OO.OOO.O.O.OO.
OO..O......O..........O.O..
..O...........OO.OO...O.O..
........O.OOOOO...O....O...
........OO...O..O..O.......
...........OOOO.OOO........
........OOO....O...........
........O..O..O..OO........
..........OO...OO.O........

:trombone slide An arrangement of four 90-degree reflectors that can be placed into the path of a glider so as to delay it by an adjustable number of generations, without changing its lane. More generally, any combination of circuits may be referred to as a trombone slide, if the grouping can be moved as a single unit that functions as a 180-degree glider reflector.

The smallest known trombone slides are made using Snarks. In the trombone slide shown below, sample input and output gliders are shown. The input glider will reach the same output location 128 generations sooner if the trombone slide is removed.

If the top and left Snarks are moved together diagonally to the upper left by N cells, then the glider delay is increased by 8N generations since the glider has to travel N more cells in each direction. This sliding action gives the trombone slide its name. If only the final Snark is moved, then the output glider's path can be altered by a number of full diagonals.

......................OO...OO....................
......................OO..O.OOO..................
..........................O....O.................
......................OOOO.OO..O.................
......................O..O.O.O.OO................
.........................O.O.O.O.................
..........................OO.O.O.................
..............................O..................
.................................................
................OO...............................
.................O.......OO......................
.................O.O.....OO......................
..................OO.............................
.................................................
.................................................
.............................................O...
...........................................OOO...
..........................................O......
..........................................OO.....
............................OO...................
............................O....................
.............................OOO..............OOO
...............................O................O
...............................................O.
.................................................
................................OO...............
....O..........................O.O.....OO........
..OOOOO..............OO........O.......OO........
.O.....O.............O........OO.................
.O..OOO............O.O...........................
OO.O...............OO.......................O....
O..OOOO.................................OO.O.O...
.OO...O...OO...........................O.O.O.O...
...OOO....OO........................O..O.O.O.OO..
...O................................OOOO.OO..O...
OO.O....................................O....O...
OO.OO...............................OO..O.OOO....
....................................OO...OO......
.................................................
...........OO....................................
............O....................O...............
.........OOO...OO..............OOOOO.............
.........O......O.............O.....O............
................O.O............OOO..O............
.................OO...............O.OO...........
...............................OOOO..O...........
..........................OO...O...OO............
..........................OO....OOO..............
..................................O..............
..................................O.OO...........
.................................OO.OO...........
.................................................
.................................................
..............OOO........OO......................
................O........O.......................
...............O..........OOO....................
............................O....................

Trombone slides made of the same type of component cannot alter the glider path by half-diagonals, and can only change the timing by multiples of 8 generations. For other timing changes, different components are necessary. These may be stable like the Silver reflector or the colour-changing example shown in the reflector article, or periodic like the various bumpers.

:true Opposite of pseudo. A gun emitting a period n stream of spaceships (or rakes) is said to be a true period n gun if its mechanism oscillates with period n. The same distinction between true and pseudo also exists for puffers. An easy way to check that a gun is true period n is to stop the output with an eater, and check that the result is a period-n oscillator.

True period n guns are known to exist for all periods greater than 61 (see My Experience with B-heptominos in Oscillators), but only a few smaller periods have been achieved, namely 20, 22, 24, 30, 36, 40, 44, 45, 46, 48, 50, and 54 through 61. See also Quetzal for the 54-61 range.

  ------------------------------------
  Period  Discoverers            Date
  ------------------------------------
  20      Matthias Merzenich  May 2013
          Noam Elkies
  22      David Eppstein      Aug 2000
          Jason Summers
  24      Noam Elkies         Jun 1997
  30      Bill Gosper         Nov 1970
  36      Jason Summers       Jul 2004
  40      Adam P. Goucher     Mar 2013
          Matthias Merzenich
          Jason Summers
  44      Dave Buckingham     Apr 1992
  45      Matthias Merzenich  Apr 2010
  46      Bill Gosper             1971
  48      Noam Elkies         Jun 1997
  50      Dean Hickerson      Oct 1996
          Noam Elkies
          Dave Buckingham
  54      Dieter Leithner     Jan 1998
          Noam Elkies
          Dave Buckingham
  55      Stephen Silver      Oct 1998
  56      Dieter Leithner     Jan 1998
          Dave Buckingham
          Noam Elkies
  57      Matthias Merzenich  Apr 2016
  58      'thunk'             Apr 2016
          Matthias Merzenich
          Chris Cain
  59      Adam P. Goucher     Dec 2009
          Jason Summers
  60      Bill Gosper         Nov 1970
  61      Luka Okanishi       Apr 2016
  ------------------------------------

:T-tetromino The following common predecessor of a traffic light.

OOO
.O.

:tub (p1)

.O.
O.O
.O.

:tubber (p3) Found by Robert Wainwright before June 1972.

....O.O......
....OO.O.....
.......OOO...
....OO....O..
OO.O..OO..O..
.O.O....O.OO.
O...O...O...O
.OO.O....O.O.
..O..OO..O.OO
..O....OO....
...OOO.......
.....O.OO....
......O.O....

:tubeater A pattern that consumes the output of a tubstretcher. The smallest known tubeater was found by Nicolay Beluchenko (September 2005), and is shown below in conjunction with the smallest known tubstretcher.

........O....................
.......OO....................
.......O.O...................
.............................
..........OO.................
..........OO.................
.......................OOO...
.O......OO...O.........O.....
OO.....O..O.O.O.........O....
O.O...OO.O...O.O..........OOO
....O.........O.O............
...O...........O.O.....OO....
...O..O.........O.O....O.O.O.
.................O.O...O...OO
..................O.....O....
...................O..OO..O..
.....................O.OOOO..
......................OOO...O
..........................OO.
...........................O.
...........................OO
..........................O..
...........................OO

:tubstretcher Any wickstretcher in which the wick is two diagonal lines of cells forming, successively, a tub, a barge, a long barge, etc. The first one was found by Hartmut Holzwart in June 1993, although at the time this was considered to be a boatstretcher (as it was shown with an extra cell, making the tub into a boat). The following small example is by Nicolay Beluchenko (August 2005), using a quarter.

.......OOO.....
.......O.......
........O......
..........OO...
...........O...
...............
........OO...O.
OOO.....OO..O.O
O......O.O...O.
.O....OO.......
...OOOO.O......
....OO.........

In October 2005, David Bell constructed an adjustable high-period diagonal c/4 rake that burns tubstretcher wicks to create gliders, which are then turned and duplicated by convoys of diagonal c/4 spaceships to re-ignite the stabilized ends of the same wicks.

:tub with tail (p1) The following 8-cell still life. See eater for a use of this object.

.O...
O.O..
.O.O.
...O.
...OO

:tugalong = tagalong

:tumbler (p14) The smallest known p14 oscillator. Found by George Collins in 1970. The oscillator generates domino sparks, but they are fragile and no use has been found for them to date. In each domino, one cell is "held" (remains alive) for two generations, the other for three. By contrast, useful domino sparks are usually alive for only one tick per oscillator period.

.O.....O.
O.O...O.O
O..O.O..O
..O...O..
..OO.OO..

:tumbling T-tetson (p8) A T-tetromino hassled by two figure-8s. Found by Robert Wainwright.

.OOO.................
O..................OO
O...O............O.OO
O..O.O..........O....
..O.O..O...........O.
...O...O.......OO.O..
.......O.......OO....
....OOO....O.........
.........OO..........
...........O.........

:Turing machine See universal computer.

:turner A one-time glider reflector, or in other words a single-glider seed (the term is seldom or never used in relation to spaceships other than gliders). One-time turners may be 90-degree or 180-degree, or they may be 0-degree with the output in the same direction as the input. A reusable turner would instead be called a reflector. Shown on the top row below are the four 90-degree turner reactions that use common small ash objects: boat, eater1, long boat, and toad.

.O..............O..............O..............O.........
..O..............O..............O..............O........
OOO............OOO............OOO............OOO........
........................................................
........................................................
........................................................
.....OO........OO...............O.......................
....O.O.......O.O..............O.O...............OOO....
.....O........O.................O.O...............OOO...
.............OO..................OO.....................
........................................................
........................................................
........................................................
........................................................
........................................................
.O..............O..............O..............O.........
..O..............O..............O....OO........O........
OOO............OOO............OOO....OO......OOO........
......................................................OO
......................................................OO
........................................................
...O...............OO...................................
..O.O.............O.O............OO..............OO.....
.O.O.............O.O.............OO..............OO.....
.OO..............OO.....................................
........................................................
........................................................
........................................................
........................................................
........................................................
.O......................................................
..O.....................................................
OOO.....................................................
........................................................
........................................................
........................................................
....OO..................................................
..O..O..................................................
..OO....................................................

Of the reactions on the first row, the glider output is the same parity for all but the long boat. The three still lifes are all colour-changing, but the toad happens to be a colour-preserving turner. The third row shows an aircraft carrier serving as a "0-degree turner" that is also colour-changing.

Three of the simplest 180-degree turners are shown in the second row. The Blockic 180-degree turner is colour-preserving. The long boat and long ship are again colour-changing; this is somewhat counterintuitive as the output glider is on exactly the same lane as the input glider, but gliders travelling in opposite directions on the same lane always have opposite colours.

Many small one-time turner constellations have also been catalogued. The 90-degree two-block turner on the right, directly below the toad, is also colour-changing but has the opposite parity.

A one-time turner reaction can be used as part of a glider injection mechanism, or as a switching mechanism for a signal. If a previous reaction has created the sacrificial object, then a later glider is turned onto a new path. Otherwise it passes through the area unaffected. This is one way to create simple switching systems or logic circuits. An example is shown in demultiplexer.

:turning toads (p4 wick) Found by Dean Hickerson, October 1989.

..............OO.....OO.....OO.....OO.....OO..............
.......O.....O......O......O......O......O................
......OO...O....O.O....O.O....O.O....O.O....O.O.O.OO......
..OO.O.OOO.O..OO..O..OO..O..OO..O..OO..O..OO..O..O..O.OO..
O..O.OO.........................................OOOOO.O..O
OO.O..............................................OO..O.OO
...O..................................................O...
...OO................................................OO...

:turtle (c/3 orthogonally, p3) A spaceship found by Dean Hickerson in August 1989 that produces a domino spark at the back. Hickerson used this spark to convert an approaching HWSS into a loaf, as part of the first sawtooth. (Also see tractor beam). The shape of the back end of the turtle is distinctive. Very similar but wider back ends have been found in other c/3 ships to produce period 9 and 15 spaceships.

.OOO.......O
.OO..O.OO.OO
...OOO....O.
.O..O.O...O.
O....O....O.
O....O....O.
.O..O.O...O.
...OOO....O.
.OO..O.OO.OO
.OOO.......O

:twin bees shuttle (p46) Found by Bill Gosper in 1971, this was the basis of all known true p46 guns, and all known p46 oscillators except for glider signal loops using Snarks, until the discovery of Tanner's p46 in 2017. See new gun for an example. There are numerous ways to stabilize the ends, two of which are shown in the diagram. On the left is David Bell's double block reaction (which results in a shorter, but wider, shuttle than usual), and on the right is the stabilization by a single block. This latter method produces the very large twin bees shuttle spark which is useful in a number of ways. See metamorphosis for an example. Adding a symmetrically placed block below this one suppresses the spark. See also p54 shuttle.

.OO........................
.OO........................
...........................
...............O...........
OO.............OO........OO
OO..............OO.......OO
...........OO..OO..........
...........................
...........................
...........................
...........OO..OO..........
OO..............OO.........
OO.............OO..........
...............O...........
...........................
.OO........................
.OO........................

:twin bees shuttle pair Any arrangement of two twin bees shuttles such that they interact. There are many ways that the two shuttles can be placed, either head-to-head, or else at right angles. Glider guns can be constructed in at least five different ways. Here is one by Bill Gosper in which the shuttles interact head-to-head:

.................O...............................
OO...............OO..............................
OO................OO.............................
.................OO...........OO.................
.............................O.O.................
.............................O...................
.............................OOO.................
.................OO..............................
..................OO.............................
.................OO..............................
.................O...........OOO.................
.............................O.................OO
.............................O.O...............OO
..............................OO.................
For other examples, see new gun, edge shooter, double-barrelled and natural Heisenburp.

:twin bees shuttle spark The large and distinctive long-lived spark produced, most commonly, by the twin bees shuttle. It starts off as shown below.

..OO.
..OO.
.O..O
O.OO.
O.OO.
After 3 generations it becomes symmetric along the horizontal axis, after 9 generations it becomes symmetric along the vertical axis also, and finally dies after 18 generations.

Since the spark is isolated and long-lived, there are many possible perturbations that it can perform. One of the most useful is demonstrated in metamorphosis where a glider is converted into a LWSS. Another useful one can turn a LWSS by 90 degrees:

O..O.........
....O........
O...O.....O..
.OOOO....OOO.
........O...O
........OO.OO
........OO.OO
.............
........OO.OO
........OO.OO
........O...O
.........OOO.
..........O..

:twinhat (p1) See also hat and sesquihat.

..O...O..
.O.O.O.O.
.O.O.O.O.
OO.O.O.OO
....O....

:twin peaks = twinhat

:twirling T-tetsons II (p60) Found by Robert Wainwright. This is a pre-pulsar hassled by killer toads.

.......OO...OO..........
......O.......O.........
.........O.O............
.......OO...OO..........
........................
........................
........................
.....................OOO
....................OOO.
.............O..........
OOO.........OOO.........
.OOO....................
....................OOO.
.....................OOO
........................
.OOO....................
OOO.........OOO.........
.............O..........
........................
........................
..........OO...OO.......
............O.O.........
.........O.......O......
..........OO...OO.......

:TWIT = eater5

:two-arm The type of universal constructor exemplified by the original Gemini spaceship, where two independently programmed construction arms sent gliders in pairs on 90-degree paths to collide with each other at the construction site. Construction recipes for two-arm constructors are much more efficient in general, but they require many more circuits and multiple independent data streams, which both tend to increase the complexity of self-constructing circuitry. Compare single-arm.

:two-bit spark = duoplet.

:two eaters (p3) Found by Bill Gosper, September 1971.

OO.......
.O.......
.O.O.....
..OO.....
.....OO..
.....O.O.
.......O.
.......OO

:two pulsar quadrants (p3) Found by Dave Buckingham, July 1973. Compare pulsar quadrant.

....O....
....O....
...OO....
..O......
O..O..OOO
O...O.O..
O....O...
.........
..OOO....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_w.htm0000755000175000017500000010061513317135606016421 00000000000000 Life Lexicon (W)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Wainwright's tagalong A small p4 c/4 diagonal tagalong that has 7 cells in every phase. It is shown here attached to the back of a Canada goose.

OOO.............
O.........OO....
.O......OOO.O...
...OO..OO.......
....O...........
........O.....O.
....OO...O...OO.
...O.O.OO....O.O
...O.O..O.OO.O..
..O....OO.....O.
..OO............
..OO............

:washerwoman (2c/3 p18 fuse) A fuse discovered by Earl Abbe, published in LifeLine Vol 3, September 1971.

O.......................................................
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
OOO..O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
O.......................................................

:washing machine (p2) Found by Robert Wainwright before June 1972.

.OO.OO.
O.OO..O
OO....O
.O...O.
O....OO
O..OO.O
.OO.OO.

:wasp (c/3 orthogonally, p3) The following spaceship which produces a domino spark at the back. It is useful for perturbing other objects. Found by David Bell, March 1998.

..........OO.OO.......
........OO.O.OO.OO....
.....OOO.O..OOO..OOOO.
.OOO....OOO.....O....O
O.O.O.OOO.O........OO.
O.O.O.OOOO............
.O.O....O..O..........
..........O...........
..O...................
..O...................

:waterbear ((23,5)c/79 obliquely, p158) A self-supporting oblique macro-spaceship constructed by Brett Berger on December 28, 2014. It is currently the fastest oblique macro-spaceship in Conway's Game of Life by several orders of magnitude, and is also the smallest known oblique macro-spaceship in terms of bounding box, superseding the Parallel HBK. It is no longer the smallest or fastest oblique spaceship due to the discovery in 2018 of the elementary knightship Sir Robin.

Previous oblique spaceships, the Gemini and the half-baked knightships, are stationary throughout almost all of their life cycles, as they construct the necessary mechanisms to support a sudden short move. The waterbear constructs support for reburnable fuse reactions involving (23,5)c/79 Herschel climbers that are in constant motion.

:wave A wick-like structure attached at both ends to moving spaceship-like patterns, in such a way that the entire pattern is mobile. Especially if the wave gets longer over time, the supporting patterns are wavestretchers.

Also, the gliders or spaceships emitted by a rake may be referred to as a wave, again because the line as a whole appears to move in a different direction from the individual components, due to the rake's movement. Compare with stream.

In general a wave can be interpreted as moving at a variety of different velocities, depending on which specific subcomponents are chosen as the starting and ending points for calculating speed and direction. See antstretcher, wavestretcher for a practical example of identical wave ends being connected to spaceships with different velocities.

:wavefront (p4) Found by Dave Buckingham, 1976 or earlier.

........OO...
........O....
.........O...
........OO...
.....OO...OO.
....O..OOO..O
....O.....OO.
.....O...O...
OO.O.O...O...
O.OO.O.OO....
....O.O......
....O.O......
.....O.......

:waveguide = superstring.

:wavestretcher A spaceship pattern that supports a connection to an extensible periodic wick-like structure, whose speed and/or direction of propagation are different from those of the wavestretcher spaceship.

Connecting the following to a standard diagonal antstretcher creates a new oblique wavestretcher (a type of growing spaceship) and also an alternate space nonfiller mechanism.

.......................................................O.....
.......................................................OO....
.....................................................O..O....
....................................................O........
.................................................OO..O.......
................................................O..O.........
.................................................O...........
.............................................O...OO..........
............................................O.OO.............
...........................................OO..O.............
...........................................OO.OO.............
...........................................O..O..OO..........
..........................................OO......OO.........
...........................................O.OO.O.OO.........
..........................................O.OOO.O............
..........................................O.O.O.O............
.............................................................
........................................O...O................
.......................................OO....................
.....................................OOO..O..................
..................................OO.OO......................
...................................O.........................
....................................O.O......................
...................................O.........................
...................................O..O......................
..................................O..........................
.....................................O.......................
..................................OOOO.......................
................................O.OO.O.......................
.....................................O.......................
................................O............................
.................................O..O........................
...................................O.........................
.........................O....OOO....................OOO.....
OO......................O.OOO....O......................O...O
..OO.OO.................O..O....O....................O...O...
..OO...OO.OO...............O..O................OO.O...O.OOOO.
OO.....OO...OO.OO.........OO.OOO...OO..OO.OOO.O....O.....O..O
.....OO.....OO...OO.OO......O.OO..O.O..OOO.OO.O.O...O......O.
..........OO.....OO...OO.O...O....O.O.O..OO..O..O...OOOO.....
...............OO.....OO..O.O.OO..O..O.......................
....................OO...........O....O..........OO...OO.....
.......................................O..........O..........
....................................O........................
....................................OO.......................
A required supporting c/5 spark is shown at the right edge. It can be supplied by a spider or another c/5 orthogonal spaceship with a similar edge spark. Alternatively, the c/5 component could theoretically be replaced by a supporting spaceship travelling diagonally at c/6, to support the same oblique trail of ants. As of June 2018 no workable c/6 component has been found.

:wedge A 26-cell quadratic growth pattern found by Nick Gotts in March 2006, based on ideas found in metacatacryst and Gotts dots. It held the record for the smallest-population quadratic growth pattern for eight years, until it was surpassed by 25-cell quadratic growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:wedge grow = wedge.

:weekender (2c/7 orthogonally, p7) Found by David Eppstein in January 2000. In April 2000 Stephen Silver found a tagalong for a pair of weekenders. At present, n weekenders pulling n-1 tagalongs constitute the only known spaceships of this speed or period, except for variants of the weekender distaff that suppress its output gliders.

.O............O.
.O............O.
O.O..........O.O
.O............O.
.O............O.
..O...OOOO...O..
......OOOO......
..OOOO....OOOO..
................
....O......O....
.....OO..OO.....

:weekender distaff (2c/7, p16982) The first orthogonal 2c/7 rake, constructed by Ivan Fomichev on May 22nd, 2014. It uses the weak sparks from weekenders to perturb an LWSS into an active reaction in a variable-period loop, which produces a series of slow salvo gliders that finally rebuilds the LWSS.

:weld To join two or more still lifes or oscillators together. This is often done in order to fit the objects into a smaller space than would otherwise be possible. The simplest useful example is probably the integral sign, which can be considered as a pair of welded eater1s.

:Wheels, Life, and other Mathematical Amusements One of Martin Gardner's books (1983) that collects together material from his column in Scientific American. The last three chapters of this book contain all the Life stuff.

:why not (p2) Found by Dave Buckingham, July 1977.

...O...
...O.O.
.O.....
O.OOOOO
.O.....
...O.O.
...O...

:wick A stable or oscillating linearly repeating pattern that can be made to burn at one end. See fuse. Wicks are often fairly dense, with repeating units directly connected or at least adjacent to each other, as in the beehive lightspeed wire for example. However, sparse wicks such as the blocks in the 31c/240 Herschel-pair climber are known, and arbitrarily sparse wicks can be constructed.

:wickstretcher A spaceship-like object which stretches a wick that is fixed at the other end. The wick here is assumed to be in some sense connected, otherwise most puffers would qualify as wickstretchers. The first example of a wickstretcher was found in October 1992 (front end by Hartmut Holzwart and back end by Dean Hickerson) and stretches ants at a speed of c/4. This is shown below with an improved back end found by Hickerson the following month.

.................OO..............................
.............OO....O.............................
............OOO.O................................
O.OO..OO...O...OOOO.O.O....OO.......OO...........
O....OO..O........O.OOO....O....OO.O..O.OO.O.....
O.OO....OO.OO....O...........O...O.O.OO.O.OO.....
......O.......O.............OO.....O..O.O...OO...
.....O.........O.O....OOO...O....O..O.O.OOO...O..
.....O.........O.O....OOO.OO.O..OO.O.O...O..OO.O.
......O.......O.............OO.O...OO....OO....O.
O.OO....OO.OO....O..........O........OO.O.O.OO.OO
O....OO..O........O.OOO........O...O...OO.O..O.O.
O.OO..OO...O...OOOO.O.O.......O.O...OO....O..O.O.
............OOO.O..............O.....O.OOO....O..
.............OO....O.................O.O.........
.................OO...................O..........

Diagonally moving c/4 and c/12 wickstretchers have also been built: see tubstretcher and linestretcher. In July 2000 Jason Summers constructed a c/2 wickstretcher, stretching a p50 traffic jam wick, based on an earlier (October 1994) pattern by Hickerson. A c/5 diagonal wickstretcher was found in January 2011 by Matthias Merzenich, who also discovered a c/5 orthogonal wickstretcher two years later in March 2013.

:wicktrailer Any extensible tagalong or component that can be attached to itself, as well as to the back of a spaceship. The number of generations that it takes for the component to occur again in the same place is often called the period of the wicktrailer. This has little relation to the period of the component. See branching spaceship for an example of a wicktrailer that is part of a p2 spaceship, but repeats itself in the same location at period 20.

:windmill (p4) Found by Dean Hickerson, November 1989.

...........O......
.........OO.O.....
.......OO.........
..........OO......
.......OOO........
..................
OOO...............
...OO..OOO.OO.....
..........OOOOOOO.
.OOOOOOO..........
.....OO.OOO..OO...
...............OOO
..................
........OOO.......
......OO..........
.........OO.......
.....O.OO.........
......O...........

:wing The following induction coil. This is generation 2 of block and glider.

.OO.
O..O
.O.O
..OO

In an unrelated use, "wing" may also refer to an arm of a spaceship.

:WinLifeSearch Jason Summers' GUI version of lifesrc for MS Windows. It is available from http://entropymine.com/jason/life/software/.

:Winning Ways A two-volume book (1982) by Elwyn Berlekamp, John Conway and Richard Guy on mathematical games. The last chapter of the second volume concerns Life, and outlines a proof of the existence of a universal constructor.

:wire A repeating stable structure, usually fairly dense, that a signal can travel along without making any permanent change. Known wires include the diagonal 2c/3 wire, and orthogonal lightspeed wire made from a chain of beehives. Diagonal lightspeed wires are known, but the required signals are fairly complex and have no known glider synthesis.

:with the grain A term used for negative spaceships travelling in zebra stripes agar, parallel to the stripes, and also for with-the-grain grey ships.

Below are three small examples of "negative spaceships" found by Gabriel Nivasch in July 1999, travelling with the grain through a stabilized finite segment of zebra stripes agar:

.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOOO....OOO.
O.........................................OO.....O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.....OOOOOOOOO.
.............................................O........
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........OO..OOO.
O.....................................O.O.....OO.O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...O.....OOO.OOO.
.............................................O........
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.....OOOOOOOOO.
O.........................................OO.....O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOOO....OOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOOOO.
O..........................OO...OO...OO...OO..O......O
.OOOOOOOOOOOOOOOOOOOOOOO...O....O....O....O.....OOOOO.
...........................OO...OO...OO...OO...O......
.OOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOO..OOOOOOO.
O........................OO...OO...OO...OO...OO......O
.OOOOOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OO...OOOOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOO...........................OOOO.
O................................................O...O
.OOOOOOOOOOOOOOOOOOOOO...........................OOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OO...OOOOOO.
O........................OO...OO...OO...OO...OO......O
.OOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOO..OOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
It has been proven that signals travelling non-destructively with the grain through zebra stripes cannot travel at less than the speed of light.

:with-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying parallel to the direction in which the spaceship moves. See also against-the-grain grey ship.

:WLS = WinLifeSearch

:worker bee (p9) Found by Dave Buckingham in 1972. Unlike the similar snacker this produces no sparks, and so is not very important. Like the snacker, the worker bee is extensible. It is, in fact, a finite version of the infinite oscillator which consists of six ON cells and two OFF cells alternating along a line. Note that Dean Hickerson's new snacker ends also work here.

OO............OO
.O............O.
.O.O........O.O.
..OO........OO..
................
.....OOOOOO.....
................
..OO........OO..
.O.O........O.O.
.O............O.
OO............OO

:W-pentomino Conway's name for the following pentomino, a common loaf predecessor.

O..
OO.
.OO

:*WSS Any of the standard orthogonal spaceships - LWSS, MWSS, or HWSS. At one point the term fish was more common for this group of spaceships.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_q.htm0000755000175000017500000007074213317135606016422 00000000000000 Life Lexicon (Q)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Q = Quetzal

:qd Abbreviation for quarter diagonal.

:Q-pentomino Conway's name for the following pentomino, a traffic light predecessor.

OOOO
...O

:quad (p2) Found by Robert Kraus, April 1971. Of all oscillators that fit in a 6x6 box this is the only flipper.

OO..OO
O..O.O
.O....
....O.
O.O..O
OO..OO

:QuadLife A form of colourised Life in which there are four types of ON cell. A newly-born cell takes the type of the majority of its three parent cells, or the remaining type if its parent cells are all of different types. In areas where there are only two types of ON cell QuadLife reduces to Immigration.

:quadpole (p2) The barberpole of length 4.

OO.....
O.O....
.......
..O.O..
.......
....O.O
.....OO

:quad pseudo A still life that can be broken down into four stable pieces but not into two or three. This term may refer to the following 34-bit pattern, found by Gabriel Nivasch in July 2001, or any similar pattern with the same property.

........OO.
...OO.O..O.
...O.OO.O..
........OO.
...O.OO...O
.OOO.OO.OO.
O.......O..
.OOO.OO.O..
...O.O.O...

As a consequence of the Four-Colour Theorem, there can be no analogous objects requiring decomposition into five or more pieces. By convention, patterns like this and the triple pseudo are considered to be pseudo still lifes, not strict still lifes. As of June 2018, it has been shown that no quad pseudo patterns exist with 32 or fewer bits, but a 33-bit pattern with this property may theoretically still be found.

:quadratic filter A toolkit developed by Dean Hickerson and Gabriel Nivasch in 2006, enabling the construction of patterns with asymptotic population growth matching an infinite number of different sublinear functions - namely, O(t(1/2n)) for any chosen n. See also exponential filter, recursive filter.

:quadratic growth The fastest possible asymptotic rate of population growth for any Life pattern - O(t2) in big-O notation, where t is the number of ticks. The first quadratic-growth pattern found was Bill Gosper's 1971 breeder. Many other types of breeders and spacefillers have been constructed since.

In April 2011, Stephen Silver gave an example of a one-cell-thick pattern over a million cells long that exhibited quadratic growth. In October 2015, Chris Cain constructed a one-cell-thick pattern with a reduced bounding box of 2596x1, improving on a series of previous longer results. The smallest known quadratic growth pattern by initial population is the 23-cell switch-engine ping-pong by Michael Simkin.

There are an infinite number of possible growth rates between linear and quadratic growth. See superlinear growth.

:quadratic replicator A pattern that fills all or part of the Life plane by making copies of itself in a nonlinear way. Small quadratic replicators are known in other Life-like rules, but as of July 2018 no example has been found or constructed in Conway's Life.

:quadratic sawtooth Any sawtooth pattern with a quadratic envelope, or specifically a pattern assembled by Martin Grant in May 2015, consisting of two caber tossers with period multipliers for timing which activate and deactivate two toggleable rake guns (see toggleable gun). The gliders emitted by those rakes annihilate on the diagonal while the rakes are eaten by 2c/5 ships. All the rakes and gliders are destroyed before the next cycle. See also Osqrtlogt.

:quadri-Snark A period-multiplying colour-preserving signal conduit found by Tanner Jacobi in October 2017, producing one output glider for every four input gliders. It is made by replacing one of the eaters in a tremi-Snark with a catalyst found using Bellman. The catalyst causes the formation of a tub which then requires an additional glider to delete. However, this adds 5 ticks to the repeat time, so that it becomes 48. If period quadrupling is needed with a colour-changing reaction, a CP semi-Snark and a CC semi-Snark can be used in series, or a period-multiplying Herschel conduit can be connected to a syringe and an appropriately chosen Herschel-to-glider converter.

.O.......................................................
..O......................................................
OOO......................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.............O...........................................
..............O..........................................
............OOO..........................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................O...............................
..........................O..............................
........................OOO..............OO..............
..........................................O..............
........................................O.....OO.........
........................................OO.....O.........
...............................................O.OO......
........................................OO..OO.O..O......
........................................OO...O.OO........
.............................................O...........
............................................OO...........
...................................................OO....
.....................................O.............O.O...
......................................O..............O...
....................................OOO..............O.OO
...........................................OO.....OO.O.O.
...........................................OO.....OO.O.O.
.....................................................O.OO
..................................OO..............OOOO..O
.................................O.O..............O...OO.
.................................O..................OO...
................................OO...................O...
...................................................O.....
...................................................OO....

:quapole = quadpole

:quarter (c/4 diagonally, p4) The following spaceship, found by Jason Summers in September 2000. The name is due to the 25-cell minimum population. This is the smallest known c/4 spaceship other than the glider. This spaceship can also be used to make the smallest known tubstretcher.

........OO...
.......OO....
.........O...
...........OO
..........O..
.............
.........O..O
.OO.....OO...
OO.....O.....
..O....O.O...
....OO..O....
....OO.......

:quarter diagonal A unit of measurement sometimes used for diagonal distances, especially for slow salvo glider lanes. One advantage of measurement in quarter diagonals is that gliders travel diagonally at 1qd/tick, so that the same integer value can serve as either a time or a diagonal distance measurement.

:quasar (p3) Found by Robert Wainwright, August 1971. This is related to the pulsar, and is just the smallest of an extensible series of p3 oscillators built using pulsar quadrants which are shifted with respect to each other.

..........OOO...OOO..........
.............................
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
..........OOO...OOO..........
.............................
........OOO.......OOO........
..OOO..O....O...O....O..OOO..
.......O....O...O....O.......
O....O.O....O...O....O.O....O
O....O.................O....O
O....O..OOO.......OOO..O....O
..OOO...................OOO..
.............................
..OOO...................OOO..
O....O..OOO.......OOO..O....O
O....O.................O....O
O....O.O....O...O....O.O....O
.......O....O...O....O.......
..OOO..O....O...O....O..OOO..
........OOO.......OOO........
.............................
..........OOO...OOO..........
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
.............................
..........OOO...OOO..........
Here is the next oscillator in the series.
..................OOO...OOO..................
.............................................
................O....O.O....O................
................O....O.O....O................
................O....O.O....O................
..................OOO...OOO..................
.............................................
................OOO.......OOO................
..........OOO..O....O...O....O..OOO..........
...............O....O...O....O...............
........O....O.O....O...O....O.O....O........
........O....O.................O....O........
........O....O..OOO.......OOO..O....O........
..........OOO...................OOO..........
.............................................
........OOO.......................OOO........
..OOO..O....O...................O....O..OOO..
.......O....O...................O....O.......
O....O.O....O...................O....O.O....O
O....O.................................O....O
O....O..OOO.......................OOO..O....O
..OOO...................................OOO..
.............................................
..OOO...................................OOO..
O....O..OOO.......................OOO..O....O
O....O.................................O....O
O....O.O....O...................O....O.O....O
.......O....O...................O....O.......
..OOO..O....O...................O....O..OOO..
........OOO.......................OOO........
.............................................
..........OOO...................OOO..........
........O....O..OOO.......OOO..O....O........
........O....O.................O....O........
........O....O.O....O...O....O.O....O........
...............O....O...O....O...............
..........OOO..O....O...O....O..OOO..........
................OOO.......OOO................
.............................................
..................OOO...OOO..................
................O....O.O....O................
................O....O.O....O................
................O....O.O....O................
.............................................
..................OOO...OOO..................

:quasi still life A stable constellation where the individual still lifes share dead cells, so the neighborhoods of those dead cells are changed, but all cells that used to remain dead from under-population still do so. Under Life rules, this occurs when objects are diagonally adjacent (e.g., two blocks sharing a single diagonal neighbor) or when single protruding cells in two objects such as tubs share multiple neighbors. The term is due to Mark Niemiec.

  ----------------
  Bits       Count
  ----------------
   8             6
   9            13
  10            57
  11           141
  12           465
  13          1224
  14          3956
  15         11599
  16         36538
  17        107415
  18        327250
  19        972040
  20       2957488
  21       8879327
  22      26943317
  ----------------

As the number of bits increases, the quasi still life count goes up exponentially by approximately O(3.04n), slightly more than a factor of three. By comparison, the rate for strict still lifes is about O(2.46n) while for pseudo still lifes it's around O(2.56n).

:queen bee See queen bee shuttle.

:queen bee shuttle (p30) Found by Bill Gosper in 1970. There are a number of ways to stabilize the ends. Gosper originally stabilized shuttles against one another in a square of eight shuttles. Two simpler methods are shown here; for a third see buckaroo. The queen bee shuttle is the basis of all known true p30 guns (see Gosper glider gun).

.........O............
.......O.O............
......O.O.............
OO...O..O.............
OO....O.O.............
.......O.O........OO..
.........O........O.O.
....................O.
....................OO

:queen bee shuttle pair Any arrangement of two queen bee shuttles such that the two beehives created between them are consumed in some way. There are many ways that the two shuttles can be placed, either head-to-head, or else at right angles. The most well-known and useful arrangement results in the Gosper glider gun.

Other arrangements don't create any lasting output, but create large sparks which can perturb objects (especially gliders) in various ways. For example, one arrangement of a queen bee shuttle pair was used in the original unit Life cell as a memory cell. Here an input glider is converted into a block, which remains until it is deleted by a glider on a right-angled path.

.......................O.
......................O..
......................OOO
.........................
.............O...........
............O.O..........
............OO.O.........
............OO.OO........
............OO.O.........
..OO........O.O..........
.O.O.........O....OOO....
.O................OOO....
OO...............O...O...
................O.....O..
.................O...O...
..................OOO....
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................OO.......
.................O.......
..............OOO........
..............O..........
See p690 gun and metamorphosis II for two more examples.

:Quetzal Any Herschel track-based gun with a period below 62, which is the lowest period with a stable glider-emitting conduit. This was Dieter Leithner's name for the true p54 glider gun he built in January 1998 - a short form of Quetzalcoatlus, which expresses the fact that the gun was a very large Herschel loop that was not an emu. Shortly afterwards Leithner also built a p56 Quetzal using a mechanism found by Noam Elkies for this purpose. In October 1998 Stephen Silver constructed a p55 Quetzal using Elkies' p5 reflector of the previous month. Quetzals of periods 57-61 have since been constructed.

Some of the more recent Quetzals are not Herschel loops, but are instead short Herschel tracks firing several glider streams all but one of which is reflected back to the beginning of the track to create a new Herschel. Noam Elkies first had the idea of doing this for the p55 case, and Stephen Silver constructed the resulting gun shortly after building the original (much larger) p55 Quetzal. Jason Summers later built a p54 version, which is more complicated because the evenness of the period makes the timing problems considerably more difficult.

:Quetzalcoatlus A giant flying dinosaur after which Dieter Leithner named his p54 gun. Usually abbreviated to Quetzal, or simply Q (as in Q54, Q55, Q56, Q-gun, etc.).

:quilt = squaredance


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_u.htm0000755000175000017500000003664313317135606016430 00000000000000 Life Lexicon (U)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:UC = universal constructor.

:underpopulation Death of a cell caused by it having fewer than two neighbours. See also overpopulation.

:unit cell = unit Life cell.

:unit Life cell A rectangular pattern, of size greater than 1x1, that can simulate Life in the following sense. The pattern by itself represents a dead Life cell, and some other pattern represents a live Life cell. When the plane is tiled by these two patterns (which then represent the state of a whole Life universe) they evolve, after a fixed amount of time, into another tiling of the plane by the same two patterns which correctly represents the Life generation following the one they initially represented.

It is usual to use the prefix "meta-" for simulated Life features, so, for example, for the first known unit Life cell (constructed by David Bell in January 1996), one metatick is 5760 ticks, and one metacell is 500x500 cells. Capital letters were originally used to make this distinction - e.g., Generation, Cell - but this usage is no longer common.

In December 2005, Jason Summers constructed an analogous unit cell for Wolfram's Rule 110, a one-dimensional cellular automaton that is known be universal. See also OTCA metapixel, p1 megacell.

:universal See universal computer, universal constructor, universal toolkit.

:universal computer A computer that can compute anything that is computable. (The concept of computability can be defined in terms of Turing machines, or by Church's lambda calculus, or by a number of other methods, all of which can be shown to lead to equivalent definitions.) The relevance of this to Life is that both Bill Gosper and John Conway proved early on that it is possible to construct a universal computer in the Life universe. (To prove the universality of a cellular automaton with simple rules was in fact Conway's aim in Life right from the start.) Conway's proof is outlined in Winning Ways, and also in The Recursive Universe.

Until recently, no universal Life computer had ever been built in practice In April 2000, Paul Rendell completed a Turing machine construction (see http://rendell-attic.org/gol/tm.htm for details). This, however, has a finite tape, as opposed to the infinite tape of a true Turing machine, and is therefore not a universal computer. But in November 2002, Paul Chapman announced the construction of a universal computer, see http://www.igblan.free-online.co.uk/igblan/ca/. This is a universal register machine based around Dean Hickerson's sliding block memory.

In 2009 Adam P. Goucher constructed a programmable Spartan universal computer/constructor pattern using stable Herschel circuitry. It included memory tapes and registers capable of holding a simple universal instruction set and program data, and also a minimal single-arm universal constructor. Its size meant that it was extremely impractical to program it to be self-constructing, though this was theoretically possible if the escape of large numbers of gliders could be allowed as a side effect.

In February 2010, Paul Rendell completed a universal Turing machine design with an unlimited tape, as described in his thesis at http://eprints.uwe.ac.uk/22323/1/thesis.pdf.

In 2016 Nicolas Loizeau ("Coban") completed a Life pattern emulating a complete 8-bit programmable computer.

See also universal constructor.

:universal constructor A pattern that is capable of constructing almost any pattern that has a glider synthesis. This definition is a bit vague. A precise definition seems impossible because it is not known, for example, whether all still lifes are constructible. In any case, a universal constructor ought to be able to construct itself in order to qualify as such.

An outline of Conway's proof that such a pattern exists can be found in Winning Ways, and also in The Recursive Universe. The key mechanism for the production of gliders with any given path and timing is known as side-tracking, and is based on the kickback reaction. A universal constructor designed in this way can also function as a universal destructor: it can delete almost any pattern that can be deleted by gliders.

In May 2004, Paul Chapman and Dave Greene produced a prototype programmable universal constructor. This is able to construct objects by means of slow glider constructions. It likely that it could be programmed to construct itself, but the necessary program would be very large; moreover an additional mechanism would be needed in order to copy the program.

A universal constructor is theoretically most useful when attached to a universal computer, which can be programmed to control the constructor to produce the desired pattern of gliders. In what follows I will assume that a universal constructor always includes this computer.

The existence of a universal constructor/destructor has a number of theoretical consequences.

For example, the constructor could be programmed to make copies of itself. This is a replicator.

The constructor could even be programmed to make just one copy of itself translated by a certain amount and then delete itself. This would be a (very large, very high period) spaceship. Any translation is possible, so that the spaceship could travel in any direction. If the constructor makes a rotated but unreflected copy of itself, the result would be a looping spaceship or reflectorless rotating oscillator.

The constructor could also travel slower than any given speed, since we could program it to perform some time-wasting task (such as repeatedly constructing and deleting a block) before copying itself. Of course, we could also choose for it to leave some debris behind, thus making a puffer.

It is also possible to show that the existence of a universal constructor implies the existence of a stable reflector. This proof is not so easy, however, and is no longer of much significance now that explicit examples of such reflectors are known.

Progressively smaller universal-constructor mechanisms without an attached universal computer have been used in the linear propagator, spiral growth pattern, and the Demonoids and Orthogonoid. See also single-channel.

Another strange consequence of the existence of universal constructors was pointed out by Adam P. Goucher and Tanner Jacobi in 2015. Any glider-constructible pattern, no matter how large, can be constructed with a fixed number of gliders, by working out a construction recipe for a universal constructor attached to a decoder that measures the distance to a faraway object. The object's position encodes a numeric value that can be processed to retrieve as many bits of information as are needed to build a slow salvo to construct any given target pattern. The simplest design, requiring less than a hundred gliders, is described in reverse caber tosser.

:universal destructor See universal constructor.

:universal register machine = URM

:universal regulator A regulator in which the incoming gliders are aligned to period 1, that is, they have arbitrary timing (subject to some minimum time required for the regulator to recover from the previous glider).

Paul Chapman constructed the first universal regulator in March 2003. It is adjustable, so that the output can be aligned to any desired period. A stable universal regulator was constructed by Dave Greene in September 2015, with a minimum delay between test signals of 1177 ticks. Later stable versions have reduced the delay to 952 ticks.

A universal regulator can allow two complex circuits to interact safely, even if they have different base periods. For example, signals from a stable logic circuit could be processed by a period-30 mechanism, though the precise timing of those signals would change in most cases.

:universal toolkit A set of Life reactions and mechanisms that can be used to construct any object that can be constructed by glider collisions. Different universal toolkits were used to construct the linear propagator, 10hd Demonoid, 0hd Demonoid, and Orthogonoid, for example.

:universe The topology of the cells in the Life grid. In the normal universe (the usual Life arena), the grid is infinite in both directions. In a cylindrical universe, the grid is finite in one direction, and the cells at the two edges are adjacent to each other. In a torus universe, the grid is finite in both directions, and the cells at the top and bottom edges are adjacent, and the cells at the left and right edges are adjacent. There are several other more obscure types of universe.

Objects found in the cylindrical and toroidal universes can also run in the normal universe if an infinite number of copies are arranged to support each other. Sometimes the objects can be supported in other ways to make a useful finite object. This is one reason that soup searches are run in alternative universes, to find such objects.

:unix (p6) Two blocks eating a long barge. This is a useful sparker, found by Dave Buckingham in February 1976. The name derives from the fact that it was for some time the mascot of the Unix lab of the mathematics faculty at the University of Waterloo.

.OO.....
.OO.....
........
.O......
O.O.....
O..O..OO
....O.OO
..OO....

:unknown fate An object whose fate is in some way unanswerable with our current knowledge. The simplest way that the fate of an object can be unknown involves the question of whether or not it exhibits infinite growth. For example, the fate of the Fermat prime calculator is currently unknown, but its behaviour is otherwise predictable.

A different type of unknown fate is that of the Collatz 5N+1 simulator, which may become stable, or an oscillator, or have an indefinitely growing bounding box. Its behavior is otherwise predictable, and unlike the Fermat prime calculator the population is known to be bounded.

Life objects having even worse behaviour (e.g. chaotic growth) are not known as of July 2018.

:up boat with tail = trans-boat with tail

:U-pentomino Conway's name for the following pentomino, which rapidly dies.

O.O
OOO

:URM A universal register machine, particularly Paul Chapman's Life implementation of such a machine. See universal computer for more information.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex.htm0000755000175000017500000002044413317135606016074 00000000000000 Life Lexicon (Introduction)
Life Lexicon

Release 29, 2018 July 2
Multipage HTML version


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

INTRODUCTION
This is a lexicon of terms relating to John Horton Conway's Game of Life. It is also available in a single-page HTML version and an ASCII version.

This lexicon was originally compiled between 1997 and 2006 by Stephen A. Silver, and was updated in 2016-18 by Dave Greene and David Bell. See below for additional credits.

The latest versions of this lexicon (both HTML and ASCII) should be available from the Life Lexicon Home Page.

CREDITS
The largest single source for the early versions of this lexicon was a glossary compiled by Alan Hensel "with indispensable help from John Conway, Dean Hickerson, David Bell, Bill Gosper, Bob Wainwright, Noam Elkies, Nathan Thompson, Harold McIntosh, and Dan Hoey".

Other sources include the works listed in the bibliography at the end of this lexicon, as well as pattern collections by Alan Hensel and David Bell (and especially Dean Hickerson's file stamp.l in the latter collection), and the web sites of Mark Niemiec, Paul Callahan, Achim Flammenkamp, Robert Wainwright and Heinrich Koenig. Recent releases also use a lot of information from Dean Hickerson's header to his 1995 stamp file. Most of the information on recent results is from the discoverers themselves, or from Nathaniel Johnston's excellent resources at http://www.conwaylife.com, including both the LifeWiki and the discussion forums.

The following people all provided useful comments on earlier releases of this lexicon: David Bell, Nicolay Beluchenko, Johan Bontes, Daniel Collazo, Scot Ellison, Nick Gotts, Ivan Fomichev, Dave Greene, Alan Hensel, Dean Hickerson, Dieter Leithner, Mark Niemiec, Gabriel Nivasch, Andrzej Okrasinski, Arie Paap, Peter Rott, Chris Rowett, Tony Smith, Ken Takusagawa, Andrew Trevorrow, Malcolm Tyrrell, and the conwaylife.com forum users with the handles 'thunk' and 'Apple Bottom'.

The format, errors, use of British English and anything else you might want to complain about are by Stephen Silver -- except that for post-Version 25 definitions, everything besides the British English may well be Dave Greene's fault instead.

COPYING
This lexicon is copyright (C) Stephen Silver, 1997-2018. It may be freely copied, modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 3.0 Unported licence (CC BY-SA 3.0), as long as due credit is given. This includes not just credit to those who have contributed in some way to the present version (see above), but also credit to those who have made any modifications.
LEXICOGRAPHIC ORDER
I have adopted the following convention: all characters (including spaces) other than letters and digits are ignored for the purposes of ordering the entries in this lexicon. (Many terms are used by some people as a single word, with or without a hyphen, and by others as two words. My convention means that I do not have to list these in two separate places. Indeed, I list them only once, choosing whichever form seems most common or sensible.) Digits lexicographically precede letters.
FORMAT
The diagrams in this lexicon are in a very standard format. You should be able to simply copy a pattern, paste it into a new file and run it in your favourite Life program. If you use Golly then you can just paste the pattern directly into the program. Diagrams are generally restricted to size 64x64 or less.

Most definitions that have a diagram have also some data in brackets after the keyword. Oscillators are marked as pn (where n is a positive integer), meaning that the period is n (p1 indicates a still life). Wicks are marked in the same way but with the word "wick" added. For spaceships the speed (as a fraction of c, the speed of light), the direction and the period are given. Fuses are marked with speed and period and have the word "fuse" added. Wicks and fuses are infinite in extent and so have necessarily been truncated, with the ends stabilized wherever practical.

SCOPE
This lexicon covers only Conway's Life, and provides no information about other cellular automata. David Bell has written articles on two other interesting cellular automata: HighLife (which is similar to Life, but has a tiny replicator) and Day & Night (which is very different, but exhibits many of the same phenomena). These articles can be found on his website.
ERRORS AND OMISSIONS
If you find any errors (including typos) or serious omissions, then please email b3s23life@gmail.com with the details. As of June 2018 this email address is monitored by Dave Greene.
NAMES
When deciding whether to use full or abbreviated forms of forenames I have tried, wherever possible, to follow the usage of the person concerned.
QUOTE
Every other author may aspire to praise; the lexicographer can only hope to escape reproach.    Samuel Johnson, 1775
DEDICATION
This lexicon is dedicated to the memory of Dieter Leithner, who died on 26 February 1999.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_n.htm0000755000175000017500000006121213317135606016407 00000000000000 Life Lexicon (N)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:natural Occurring often in random patterns. There is no precise measure of naturalness, since the most useful definition of "random" in this context is open to debate. Nonetheless, it is clear that objects such as blocks, blinkers, beehives and gliders are very natural, while eater2s, darts, guns, etc., are not.

:natural Heisenburp (p46) A twin bees shuttle pair arrangement found by Brice Due in 2006. A glider passes through the reaction area of the shuttle pair completely unaffected. However, a Heisenburp effect causes a second glider to be created "out of the blue", following behind the first at a 2hd offset.

..................OO.................
.................O.O...............OO
.................O.................OO
.................OOO.................
.....................................
.....................................
.....................................
.................OOO.................
........OO.......O.................OO
........OO.......O.O...............OO
..................OO.................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.O.....O.............................
OOO...OOO............................
O.OO.OO.O............................
..OO.OO..........OO..................
..OO.OO..........O.O.................
..OO.OO..........O...................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
OO.....OO............................
OO.....OO............................

:ND read = non-destructive read

:negative spaceship A type of signal travelling through a periodic agar such as zebra stripes. The leading edge of the signal removes the agar, and the trailing edge rebuilds the agar some time later. The distance between the two edges is sometimes adjustable, as shown in lightspeed bubble. The central part of the "spaceship" may consist of dying sparks or even simple empty space.

Below is a sample period-5 negative spaceship, found by Hartmut Holzwart in March 2007, in a small stabilized section of zebra stripes agar:

.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.........................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOOOOOOOOOOOOOOOOOO.
O..............................OO...OO..................O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO...OOOO..OOOOOOOOOOOO.
..........................OO...............OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO.....OO...OO..OOOOOOO.
O..............................OO...O.OO........OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO...OO.....OO...OOOOOO.
..........................OO............OO.OO............
.OOOOOOOOOOOOOOOOOOOOOOOO...OOOOO..........OO.....OOOOOO.
O............................O...............OO.OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO.....O.........O.......OO..OOOO.
..........................O.O......O...O..........OO.....
.OOOOOOOOOOOOOOOOOOOOOOOO...O.O.OOOOO......O.......OOOOO.
O..............................OOO...O......O...........O
.OOOOOOOOOOOOOOOOOOOOOOOO...O.O.OOOOO......O.......OOOOO.
..........................O.O......O...O..........OO.....
.OOOOOOOOOOOOOOOOOOOOOOOO.....O.........O.......OO..OOOO.
O............................O...............OO.OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO...OOOOO..........OO.....OOOOOO.
..........................OO............OO.OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO...OO.....OO...OOOOOO.
O..............................OO...O.OO........OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO.....OO...OO..OOOOOOO.
..........................OO...............OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO...OOOO..OOOOOOOOOOOO.
O..............................OO...OO..................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOOOOOOOOOOOOOOOOOO.
.........................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
The "spaceship" travels to the left at the speed of light, so it will eventually reach the edge of any finite patch and destroy itself and its supporting agar.

:negentropy (p2) Compare Hertz oscillator.

...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...OO..O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:neighbour Any of the eight cells adjacent to a given cell. A cell is therefore not considered to be a neighbour of itself, although the neighbourhood used in Life does in fact include this cell (see cellular automaton).

:new five (p3) Found by Dean Hickerson, January 1990.

..OO.....
.O..O....
.O.O..O..
OO.O.OO..
O........
.OOO.OOOO
.....O..O
O.OO.....
OO.OO....

:new gun (p46) An old name for the period 46 glider gun show below. This was found by Bill Gosper in 1971, and was the second basic glider gun found (after the Gosper glider gun). It produces a period 46 glider stream.

.........................OO.....OO
.........................OO.....OO
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
...........................OO.OO..
..........................O.....O.
..................................
.........................O.......O
.........................O..O.O..O
.........................OOO...OOO
..................................
..................................
..................................
..................................
.................O................
OO...............OO...............
OO................OO..............
.............OO..OO...............
..................................
..................................
..................................
.............OO..OO...............
OO................OO.......OO.....
OO...............OO........OO.....
.................O................

A number of other ways of constructing a gun from two twin bees shuttles have since been found. See edge shooter for one of these, and see also p46 gun.

:Noah's ark The following diagonal puffer consisting of two switch engines. This was found by Charles Corderman in 1971. The name comes from the variety of objects it leaves behind: blocks, blinkers, beehives, loaves, gliders, ships, boats, long boats, beacons and block on tables.

..........O.O..
.........O.....
..........O..O.
............OOO
...............
...............
...............
...............
...............
.O.............
O.O............
...............
O..O...........
..OO...........
...O...........

See also ark.

:n-omino Any polyomino with exactly n cells.

:non-destructive read A type of test reaction in memory cell circuitry, where the information in the memory cell is unchanged and can be read again to produce the same result. One simple type of non-destructive read reaction is a signal sent to a permanent switch. Memory cells with destructive read reactions are generally simpler and more commonly used.

:nonfiller = space nonfiller

:non-monotonic A spaceship is said to be non-monotonic if its leading edge falls back in some generations. The first example (shown below) was found by Hartmut Holzwart in August 1992. This is p4 and travels at c/4. In April 1994, Holzwart found examples of p3 spaceships with this property, and this is clearly the smallest possible period. Another non-monotonic spaceship is the weekender.

..........OO.O.......
......OOO.O.OOO......
..O.O..........O...OO
OO....OO.....O...OOOO
..O.OO..O....OOO.O...
........O....O.......
..O.OO..O....OOO.O...
OO....OO.....O...OOOO
..O.O..........O...OO
......OOO.O.OOO......
..........OO.O.......

:nonomino switch engine predecessor This is the unique nonomino (a polyomino having 9 cells) whose evolution results in a switch engine, and the smallest polyomino to do so.

OOO...
..O.O.
..OOOO

Charles Corderman may have found this object in 1971 while exhaustively investigating the fate of all the small polyominoes. Records indicate that he found the switch engine while investigating the decominoes (polyominoes having 10 cells). However, there do not appear to be decominoes which result in a clean switch engine. If Corderman was examining polyominoes in order of size, then this smaller predecessor should have been found first in any case.

:non-spark Something that looks like a spark, but isn't. An OWSS produces one of these instead of a belly spark, and is destroyed by it.

:non-standard spaceship Any spaceship other than a glider, LWSS, MWSS or HWSS.

:non-trivial A non-trivial period-N oscillator contains at least one cell that oscillates at the full period. In other words, it is not made up solely of separate oscillators with smaller periods. Usually it includes a spark or other reaction that would not occur if all lower-period subpatterns were separated from each other, but some exceptions are given under trivial. See also omniperiodic.

:novelty generator A pattern that appears to have an unknown fate due to complex feedback loops, for example involving waves of gliders shuttling between perpendicular rakes. Novelty generator patterns fall short of counting as chaotic growth, since the rakes continue to be predictable, and much of their ash generally remains stable.

It has not been proven conclusively that any particular pattern is in fact an infinite novelty generator, since it is always possible that periodicity will spontaneously arise if the simulation is continued far enough. In fact this happens quite regularly. But conversely, it has not been proven that periodicity must spontaneously arise for all such patterns. Bill Gosper, Nick Gotts and others have done extensive experiments along these lines using Golly.

:NW31 One of the most common stable edge shooters. This Herschel-to-glider converter suppresses the junk ordinarily left behind by an evolving Herschel while allowing both the first natural glider and second natural glider to escape on transparent lanes:

OO.......................
.O.......................
.O.O.....................
..OO.....................
.........................
.........................
.........................
.......................OO
.......................OO
.........................
..O......................
..O.O....................
..OOO....................
....O....................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...........OO............
............O............
.........OOO.............
.........O...............
The edge shooter output at the top has no additional clearance, so its use in creating convoys is limited: it can only add gliders on the outermost lanes of an existing glider salvo. Like the beehive version of SW-2, either output can be used to build logical OR gates, where multiple input signal paths are merged onto the same output path.

The complete name for this converter is "NW31T120", where 31 is the output glider lane number. In the above orientation, lane numbers get bigger toward the upper right and smaller toward the lower left (and may easily be negative).

The T120 timing measurement means that a canonical NW glider placed on lane 31 at time T=120, at (+31, +0) relative to the input Herschel, would in theory reach the exact same spacetime locations as the converter's output glider does.

Most converters are not edge shooters and their output lanes are not transparent, so they usually have catalysts that would interfere with this theoretically equivalent glider. This is the case for the optional third glider output created by the lower eater1 catalyst: the upper eater1 overlaps its lane. For the alternate block catalyst suppressing this glider output, see transparent lane.

:NW31T120 = NW31


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_y.htm0000755000175000017500000000465413151213347016424 00000000000000 Life Lexicon (Y)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Y-pentomino Conway's name for the following pentomino, which rapidly dies.

..O.
OOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_d.htm0000755000175000017500000010226613317135606016402 00000000000000 Life Lexicon (D)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:dart (c/3 orthogonally, p3) Found by David Bell, May 1992. A 25-glider recipe for the dart was found in December 2014 by Martin Grant and Chris Cain, making it the first glider-constructible c/3 spaceship.

.......O.......
......O.O......
.....O...O.....
......OOO......
...............
....OO...OO....
..O...O.O...O..
.OO...O.O...OO.
O.....O.O.....O
.O.OO.O.O.OO.O.

:dead spark coil (p1) Compare spark coil.

OO...OO
O.O.O.O
..O.O..
O.O.O.O
OO...OO

:debris = ash.

:de Bruijn diagram = de Bruijn graph

:de Bruijn graph As applied to Life, a de Bruijn graph is a graph showing which pieces can be linked to which other pieces to form a valid part of a Life pattern of a particular kind.

For example, if we are interested in still lifes, then we could consider 2x3 rectangular pieces and the de Bruijn graph would show which pairs of these can be overlapped to form 3x3 squares in which the centre cell remains unchanged in the next generation.

David Eppstein's search program gfind is based on de Bruijn graphs.

:Deep Cell A pattern by Jared James Prince, based on David Bell's unit Life cell, in which each unit cell simulates two Life cells, in such a way that a Life universe filled with Deep Cells simulates two independent Life universes running in parallel.

In fact, a Life universe filled with Deep Cells can simulate infinitely many Life universes, as follows. Let P1, P2, P3, ... be a sequence of Life patterns. Set the Deep Cells to run a simulation of P1 in parallel with a simulation of a universe filled with Deep Cells, with these simulated Deep Cells running a simulation of P2 in parallel with another simulation of a universe filled with Deep Cells, with these doubly simulated Deep Cells simulating P3 in parallel with yet another universe of Deep Cells, and so on.

Deep Cell is available from http://psychoticdeath.com/life.htm.

:Demonoid The first self-constructing diagonal spaceship. A 0hd Demonoid was completed by Chris Cain in December 2015, shortly after a much larger 10hd version was constructed the previous month in collaboration with Dave Greene. The 0hd spaceship fits in a bounding box about 55,000 cells square, and displaces itself by 65 cells diagonally every 438,852 generations.

The first 0hd Demonoid was fired by a gun. No spaceship gun pattern had previously been completed before the first appearance of the actual spaceship.

In June 2017 Dave Greene completed a much simpler single-channel Demonoid using a temporary lossless elbow, which displaces itself 79 cells diagonally every 1,183,842 ticks. This was an improvement in terms of design complexity, but not in terms of speed, population, or bounding box. However, all of these could be further optimized. A smaller Hashlife-friendly single-channel Demonoid design was completed in 2018.

:demultiplexer A simple Herschel circuit consisting of three eater1s, found by Brice Due in August 2006. An input Herschel places a boat in a location accessible to an input glider. If the boat is present, a one-time turner reaction occurs and the glider is turned 90 degrees onto a new lane.

...........................O.....
........OO.................O.O...
.........O.................OO....
.........O.O.....................
..........OO.....................
.......................OO........
.......................O.O.......
........................O........
.................................
.................................
.............................OO..
..........O..................O.O.
..........O.O..................O.
..........OOO............OO....OO
............O............O.O.....
...........................O.....
...........................OO....
.................................
.................................
..OO.............................
.O.O.............................
.O...............................
OO...............................
If the Herschel and boat are removed from the above pattern, the glider passes cleanly through the circuit. It can be used as the "0" output of a one-bit memory cell, where the 90-degree output would be the "1" output. This was the method used to store presence or absence of neighbor metacells in the p1 megacell.

:demuxer = demultiplexer

:density The density of a pattern is the limit of the proportion of live cells in a (2n+1)x(2n+1) square centred on a particular cell as n tends to infinity, when this limit exists. (Note that it does not make any difference what cell is chosen as the centre cell. Also note that if the pattern is finite then the density is zero.) There are other definitions of density, but this one will do here.

In 1994 Noam Elkies proved that the maximum density of a stable pattern is 1/2, which had been the conjectured value. See the paper listed in the bibliography. Marcus Moore provided a simpler proof in 1995, and in fact proves that a still life with an m x n bounding box has at most (mn+m+n)/2 cells.

But what is the maximum average density of an oscillating pattern? The answer is conjectured to be 1/2 again, but this remains unproved. The best upper bound so far obtained is 8/13 (Hartmut Holzwart, September 1992).

The maximum possible density for a phase of an oscillating pattern is also unknown. An example with a density of 3/4 is known (see agar), but densities arbitrarily close to 1 may perhaps be possible.

:dependent conduit A Herschel conduit in which the input Herschel interacts with catalysts in the first few ticks. The standard interaction actually starts at T=-3, before the Herschel is completely formed. Compare independent conduit. The Herschel is prevented from emitting its first natural glider. This is useful in cases where the previous conduit cannot survive a first natural glider emitted from its output Herschel.

This term is somewhat confusing, since it is actually the previous conduit that depends on the dependent conduit to suppress the problematic glider. Dependent conduits such as the F166 and Lx200 do not actually depend on anything. They can be freely connected to any other conduits that fit, as long as the output Herschel evolves from its standard great-grandparent. As of this writing, the Fx158 is the only known case where a conduit's output Herschel has an alternate great-grandparent, which is incompatible with dependent conduits' initial transparent block.

:destructive read The most common type of test reaction in memory cell circuitry. Information is stored in a memory cell by placing objects in known positions, or by changing the state of a stable or periodic toggle circuit. A destructive-read test consists of sending one or more signals to the memory cell. A distinct output signal is produced for each possible state of the memory cell, which is reset to a known "zero" or "rest" state. See for example boat-bit, keeper, and demultiplexer.

To permanently store information in a destructive-read memory cell, the output signal(s) must be used, in part, to send appropriate signals back to the memory cell to restore its state to its previous value. With output looped back to input, this larger composite circuit then effectively becomes a non-destructive read memory cell.

:destructor arm A dedicated construction arm in the Gemini spaceship, used only for removing previously active circuitry once it is no longer needed. More generally, any circuitry in a self-constructing pattern dedicated exclusively to cleanup.

:D-heptomino = Herschel

:diamond = tub

:diamond ring (p3) Found by Dave Buckingham in 1972.

......O......
.....O.O.....
....O.O.O....
....O...O....
..OO..O..OO..
.O....O....O.
O.O.OO.OO.O.O
.O....O....O.
..OO..O..OO..
....O...O....
....O.O.O....
.....O.O.....
......O......

:diehard Any pattern that vanishes, but only after a long time. The following example vanishes in 130 generations, which is probably the limit for patterns of 7 or fewer cells. Note that there is no limit for higher numbers of cells. E.g., for 8 cells we could have a glider heading towards an arbitrarily distant blinker.

......O.
OO......
.O...OOO

:dinner table (p12) Found by Robert Wainwright in 1972.

.O...........
.OOO.......OO
....O......O.
...OO....O.O.
.........OO..
.............
.....OOO.....
.....OOO.....
..OO.........
.O.O....OO...
.O......O....
OO.......OOO.
...........O.

:dirty Opposite of clean. A reaction which produces a large amount of complicated junk which is difficult to control or use is said to be dirty. Many basic puffer engines are dirty and need to be tamed by accompanying spaceships in order to produce clean output. Similarly, a dirty conduit is one that does not recover perfectly after the passage of a signal; one or more extra ash objects are left behind (or more rarely a catalyst is damaged) and additional signals must be used to clean up the circuit before it can be re-used.

:diuresis (p90) Found by David Eppstein in October 1998. His original stabilization used pentadecathlons. The stabilization with complicated still lifes shown here (in two slightly different forms) was found by Dean Hickerson the following day. The name is due to Bill Gosper (see kidney).

.....OO................OO....
......O................O.....
......O.O............O.O.....
.......OO............OO......
.............................
....OO..................OO...
....O.O..........OO....O.O...
.....O..........O.O.....O....
..O.............OO.........O.
..OOOOOO........O.....OOOOOO.
.......O..............O......
....OO..................OO...
....O....................O...
.....O..................O....
..OOO..O..............O..OOO.
..O..OOO........O.....OOO...O
...O............OO.......OOO.
....OO..........O.O.....O....
......O..........OO....O..OO.
....OO..................OO.O.
.O..O....................O...
O.O.O..OO............OO..O...
.O..O.O.O............O.O.OO..
....O.O................O..O..
.....OO................OO....

:dock The following induction coil.

.OOOO.
O....O
OO..OO

:domino The 2-cell polyomino. A number of objects, such as the HWSS and pentadecathlon, produce domino sparks.

:dormant An object that is either stable or oscillates without producing any output, until it is triggered by an appropriate signal, which then produces some desired action. For example, freeze-dried objects are dormant until the arrival of a particular glider.

:do-see-do The following reaction, found by David Bell in 1996, in which two gliders appear to circle around each other as they are reflected 90 degrees by a twin bees shuttle. Four copies of the reaction can be used to create a p92 glider loop which repeats the do-see-do reaction forever.

.....................................................O.O
.....................................................OO.
......................................................O.
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
................................................OO......
................................................O.......
..............................................O.O.......
..............................................OO........
..............................O.O.......................
..............................OO........................
...............................O........................
........................................................
.......................OOO..............................
OO........OOO........OO.O.OO............................
OO........O...O.....O.....OO............................
..........O....O.....OO.O.OO............................
...........O...O.......OOO..............................
........................................................
...........O...O........................................
..........O....O........................................
OO........O...O............OO...........................
OO........OOO..............OO...........................

:double-barrelled Of a gun, emitting two streams of spaceships (or rakes) every period. For examples, see B-52 bomber, Simkin glider gun, and p246 gun. In most cases, the two streams are alternately emitted 1/2 period apart. It is also possible for the two streams to be emitted simultaneously, as in this double-barrelled glider gun by Bill Gosper:

.................O................................
.................OO...............................
..................OO..............................
.................OO...............................
................................O.................
...............................OO...............OO
..............................OO................OO
.................OO............OO.................
OO................OO..............................
OO...............OO...............................
.................O................................
...............................OO.................
..............................OO..................
...............................OO.................
................................O.................

:double block reaction A certain reaction that can be used to stabilize the twin bees shuttle (qv). This was discovered by David Bell in October 1996.

The same reaction sometimes works in other situations, as shown in the following diagram where a pair of blocks eats an R-pentomino and a LWSS. (The LWSS version was known at least as early 1994, when Paul Callahan saw it form spontaneously as a result of firing an LWSS stream at some random junk.)

.OOOO.....OO....
O...O......OO.OO
....O......O..OO
O..O............
................
.............OO.
.............OO.

:double caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and triple caterer.

.....OO...O........
....O..O..OOO......
....OO.O.....O.....
......O.OOOO.O.....
..OOO.O.O...O.OO...
.O..O..O...O..O.O..
O.O..O...O.OO....O.
.O..........OO.OOO.
..OO.OO.OO...O.....
...O...O.....O.OOO.
...O...O......OO..O
.................OO

:double ewe (p3) Found by Robert Wainwright before September 1971.

......OO............
.......O............
......O.............
......OO............
.........OO.........
......OOO.O.........
O.OO.O..............
OO.O.O..............
.....O...O..........
....O...OO....OO....
....OO....OO...O....
..........O...O.....
..............O.O.OO
..............O.OO.O
.........O.OOO......
.........OO.........
............OO......
.............O......
............O.......
............OO......

:double wing = moose antlers. This term is no longer in use.

:dove The following induction coil, found in 2015 to be a possible active reaction for the input or output of a converter.

.OO..
O..O.
.O..O
..OOO

:down boat with tail = cis-boat with tail

:dr Short identifier for Dean Hickerson's 'drifter' search program, used at various times to find wires, eaters, higher-period billiard table configurations, and related signal-carrying and signal-processing mechanisms. See also drifter.

:dragon (c/6 orthogonally, p6) This spaceship, discovered by Paul Tooke in April 2000, was the first known c/6 spaceship. With 102 cells, it was the smallest known orthogonal c/6 spaceship until Hartmut Holzwart discovered 56P6H1V0 in April 2009.

.............O..OO......O..OOO
.....O...OOOO.OOOOOO....O..OOO
.OOOOO....O....O....OOO.......
O......OO.O......OO.OOO..O.OOO
.OOOOO.OOO........OOOO...O.OOO
.....O..O..............O......
........OO..........OO.OO.....
........OO..........OO.OO.....
.....O..O..............O......
.OOOOO.OOO........OOOO...O.OOO
O......OO.O......OO.OOO..O.OOO
.OOOOO....O....O....OOO.......
.....O...OOOO.OOOOOO....O..OOO
.............O..OO......O..OOO

:drain trap = paperclip. This term is no longer in use.

:D read = destructive read

:dried = freeze-dried.

:drifter A perturbation moving within a stable pattern. Dean Hickerson has written a search program to search for drifters, with the hope of finding one which could be moved around a track. Because drifters can be very small, they could be packed more tightly than Herschels, and so allow the creation of oscillators of periods not yet attained, and possibly prove that Life is omniperiodic. Hickerson has found a number of components towards this end, but it has proved difficult to change the direction of movement of a drifter, and so far no complete track has been found. However, Hickerson has had success using the same program to find eaters with novel properties, such as sparking eaters and the ones shown in diuresis.

:dual 1-2-3-4 = Achim's p4

:duoplet A diagonal two-bit spark produced by many oscillators and eater reactions. Among other uses, it can reflect gliders 90 degrees. The following pattern shows an eater5 eating gliders and producing duoplets which are then used to reflect a separate glider stream. If only one glider is present, the eater5 successfully absorbs it, so this mechanism may be considered to be a simple AND gate.

..O....................
O.O....................
.OO....................
.......................
.......................
.......O...............
.....O.O...............
......OO...............
.....................O.
....................O..
....................OOO
.......................
.......................
................O......
...............O.......
...............OOO.....
.......................
....................OO.
................O...OO.
...............O.O.....
..............O.O......
..............O........
.............OO........

:dying spark See spark. A spark by definition dies out completely after some number of ticks.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_l.htm0000755000175000017500000024510313317135606016410 00000000000000 Life Lexicon (L)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:L112 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HLx53B + BFx59H. After 112 ticks, it produces a Herschel turned 90 degrees counterclockwise at (12, -33) relative to the input. Its recovery time is 61 ticks; this can be reduced slightly by removing the output glider, either with a specialized eater (as in the original true p59 gun), or with a sparker as in most of the Quetzal guns. It can be made Spartan by replacing the aircraft carrier with an eater1. A ghost Herschel in the pattern below marks the output location:

...............OO.......
...............O........
.............OOO........
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
.............OO.........
.............OO.........
....OO..................
....O..O................
OO....OO................
.O....................OO
.O.O..................O.
..OO................O.O.
....................OO..
........................
........................
........................
........................
........................
..O.....................
..O.O...................
..OOO...................
....O...................
........................
..............OO........
..............OO..OO....
..................O.O...
....................O...
....................OO..

:L156 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in August 1996. It is made up of three elementary conduits, HLx69R + RF28B + BFx59H. After 156 ticks, it produces a Herschel turned 90 degrees counterclockwise at (17, -41) relative to the input. Its recovery time is 62 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. Additional gliders can be produced by removing the southeasternmost eater, or by replacing the RF28B elementary conduit by an alternate version. A ghost Herschel in the pattern below marks the output location:

...................OO........
...................O.........
.................OOO.........
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.................OO..........
.................OO..........
.............................
........OO.O.................
........O.OO.................
..........................OO.
..........................O..
........................O.O..
........................OO...
.............................
.........O...................
.........OOO.................
O...........O................
OOO........OO..............O.
...O......................O.O
..OO.......................O.
.............................
.............................
.............................
.............................
.............................
.............................
.O....................OO.....
.O.O..................O.O....
.OOO....................O....
...O...........OO.......OO...
...............O.............
................OOO..........
..................O..........

:lake (p1) Any still life consisting of a simple closed curve made from diagonally connected dominoes. The smallest example is the pond, and the next smallest is this (to which the term is sometimes restricted):

....OO....
...O..O...
...O..O...
.OO....OO.
O........O
O........O
.OO....OO.
...O..O...
...O..O...
....OO....

:lane A path traveled by a glider, or less commonly a spaceship such as a loafer. The lane is centered on the line of symmetry (if any) of the spaceship in question. If a lane is clear, then the spaceship can travel along it without colliding or interfering with any other objects.

Diagonal lanes are often numbered consecutively, in half-diagonals (hd). Occasionally diagonal lane measurements are given in quarter-diagonals (qd), in part because diagonally symmetric spaceships have a line of symmetry 1qd away from the lines available for gliders. It's also convenient that moving a glider forward by 100qd (for example) has the same effect as evolving the same glider for 100 ticks.

:Laputa (p2) Found by Rich Schroeppel, September 1992.

...OO.OO....
...OO.O...OO
........O..O
.OOOOOO.OOO.
O..O.O......
OO...O.OO...
....OO.OO...

:large prime oscillator Any oscillator with a relatively small bounding box whose period is a very large prime. (If the bounding-box restriction is removed, then eight gliders travelling in a four-Snark loop would provide a trivial example for any chosen prime.) The first such oscillator was built by Gabriel Nivasch in 2003. The current record holder is an oscillator constructed by Adam P. Goucher with a period that is a Mersenne prime with 13,395 digits (244497-1).

The next higher Mersenne-prime oscillator, period 286243-1, could be constructed with quadri-Snarks and semi-Snarks. It would actually be significantly smaller than the current record holder. As of June 2018 the construction of this pattern has not yet been completed.

:large S = big S

:Lidka (stabilizes at time 29053) A methuselah found by Andrzej Okrasinski in July 2005.

..........OOO..
..........O....
..........O...O
...........O..O
............OOO
...............
.O.............
O.O............
.O.............
The following variant, pointed out by David Bell, has two fewer cells and lasts two generations longer.
..........OOO..
...............
...........OO.O
............O.O
..............O
...............
.O.............
O.O............
.O.............

:Life A 2-dimensional 2-state cellular automaton discovered by John Conway in 1970. The states are referred to as ON and OFF (or live and dead). The transition rule is as follows: a cell that is ON will remain ON in the next generation if and only if exactly 2 or 3 of the 8 adjacent cells are also ON, and a cell that is OFF will turn ON if and only if exactly 3 of the 8 adjacent cells are ON. (This is more succinctly stated as: "If 2 of your 8 nearest neighbours are ON, don't change. If 3 are ON, turn ON. Otherwise, turn OFF.")

:Life32 A freeware Life program by Johan Bontes for Microsoft Windows 95/98/ME/NT/2000/XP: https://github.com/JBontes/Life32/.

:LifeHistory A multistate CA rule supported by Golly, equivalent to two-state B3/S23 Life but with several additional states intended for annotation purposes. A "history" state records whether an off cell has ever turned on in the past, and other states allow on and off cells to be permanently or temporarily marked, without affecting the evolution of the pattern.

:LifeLab A shareware Life program by Andrew Trevorrow for the Macintosh (MacOS 8.6 or later): http://www.trevorrow.com/lifelab/.

:LifeLine A newsletter edited by Robert Wainwright from 1971 to 1973. During this period it was the main forum for discussions about Life. The newsletter was nominally quarterly, but the actual dates of its eleven issues were as follows:


Mar, Jun, Sep, Dec 1971
Sep, Oct, Nov, Dec 1972
Mar, Jun, Sep 1973

:Lifenthusiast A Life enthusiast. Term coined by Robert Wainwright.

:lifesrc David Bell's Life search program for finding new spaceships and oscillators. This is a C implementation of an algorithm developed by Dean Hickerson in 6502 assembler.

Although lifesrc itself is a command-line program, Jason Summers has made a GUI version called WinLifeSearch for Microsoft Windows. A Java version, JavaLifeSearch, was written in November 2012 by Karel Suhajda.

The lifesrc algorithm is only useful for very small periods, as the amount of computing power required rises rapidly with increasing period. For most purposes, period 7 is the practical limit with current hardware.

Lifesrc is available from http://tip.net.au/~dbell/ (source code only). Compare gfind.

:LifeViewer A scriptable Javascript Life pattern viewer written by Chris Rowett, used primarily on the conwaylife.com discussion forums.

:light bulb (p2) Found in 1971.

.OO.O..
.O.OO..
.......
..OOO..
.O...O.
.O...O.
..O.O..
O.O.O.O
OO...OO
The same rotor can be embedded in a slightly smaller stator like this:
...O.....
.OOO.....
O........
OOOOOO...
......O..
..O...O..
..OO.O...
......OOO
........O

:lightspeed bubble A type of negative spaceship travelling through the zebra stripes agar. The center of the bubble is simple empty space, and the length and/or width of the bubble can usually be extended to any desired size.

Below is a small stabilized section of agar containing a sample lightspeed bubble, found by Gabriel Nivasch in August 1999. The bubble travels to the left at the speed of light, so it will eventually reach the edge of any finite patch and destroy itself and its supporting agar.

.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................O
.OOOOOOOOOOOOO..OOO..OOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O..............OO...OO...OO........O..........................
.OOOOOOOOOOOOO...OO...OO...O.OO.O....OOOOOOOOOOOOOOOOOOOOOOOO.
.............................OO.....O........................O
.OOOOOOOOOOOOO.................OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...............................O.............................
.OOOOOOOOOOOOO...................OOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.................................O....O......................O
.OOOOOOOOOOOOO...................OO....OOOOOOOOOOOOOOOOOOOOOO.
O................................O.....O....O.................
.OOOOOOOOOOOOO...................OO....OO....OOOOOOOOOOOOOOOO.
.................................O.....O.....O....O..........O
.OOOOOOOOOOOOO...................OO....OO....OO....OOOOOOOOOO.
O................................O.....O.....O.....O....O.....
.OOOOOOOOOOOOO...................OO....OO....OO....OO....OOOO.
.................................O.....O.....O.....O.....O...O
.OOOOOOOOOOOOO...................OO....OO....OO....OO....OOOO.
O................................O.....O.....O.....O....O.....
.OOOOOOOOOOOOO...................OO....OO....OO....OOOOOOOOOO.
.................................O.....O.....O....O..........O
.OOOOOOOOOOOOO...................OO....OO....OOOOOOOOOOOOOOOO.
O................................O.....O....O.................
.OOOOOOOOOOOOO...................OO....OOOOOOOOOOOOOOOOOOOOOO.
.................................O....O......................O
.OOOOOOOOOOOOO...................OOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...............................O.............................
.OOOOOOOOOOOOO.................OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................OO.....O........................O
.OOOOOOOOOOOOO...OO...OO...O.OO.O....OOOOOOOOOOOOOOOOOOOOOOOO.
O..............OO...OO...OO........O..........................
.OOOOOOOOOOOOO..OOO..OOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...

An open problem related to lightspeed bubbles was whether large extensible empty areas could be created whose length was not proportional to the width (as it must be in the above case, due to the tapering back edge). This was solved in February 2017 by Arie Paap; a simple period-2 solution is shown below.

...O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...........................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O.....................................................O.....O
.OOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOO..OOOO...OOOOO.
......................OO...OO...OO...OO........OO.....O......
.OOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OOOOOOO...O.OO..OOOOO.
O.........................................O........OO.......O
.OOOOOOOOOOOOOOOOOOOO......................OO.O......OOOOOOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOO......................O.............OOO.
O..........................................OO.....OO....O...O
.OOOOOOOOOOOOOOOOOOOO......................OO...OO...O.OOOOO.
...........................................O..O.OO...O.......
.OOOOOOOOOOOOOOOOOOOO......................O......OO...OOOOO.
O..........................................OO..........O....O
.OOOOOOOOOOOOOOOOOOOO......................OO..........OOOOO.
...........................................O......OO.O.......
.OOOOOOOOOOOOOOOOOOOO......................O..O.OO...O.OOOOO.
O..........................................OO...OO......O...O
.OOOOOOOOOOOOOOOOOOOO......................OO.....OO.....OOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOO......................O...........OOOOO.
O..........................................OO.....OO.OO.....O
.OOOOOOOOOOOOOOOOOOOO......................OO...OO...OO..OOO.
...........................................O..O.OO.....OO....
.OOOOOOOOOOOOOOOOOOOO......................O......OO....OOOO.
O..........................................OO...............O
.OOOOOOOOOOOOOOOOOOOO......................OO...........OOOO.
...........................................O......OO...OO....
.OOOOOOOOOOOOOOOOOOOO......................O..O.OO...OO..OOO.
O..........................................OO...OO...OO.....O
.OOOOOOOOOOOOOOOOOOOO......................OO.....OO...OOOOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOOOO.....O.....O.....O..O.O...........OOO.
O.........................OO....OO....OO...O...O.O.......O..O
.OOOOOOOOOOOOOOOOOOOOOOOO.OO.OO.OO.OO.OO.OOOOOOOOO.......OOO.
........................................................O....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...OOOOOOO.
O..................................................OO.......O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOO.
.............................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...........................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...

:lightspeed ribbon = superstring

:lightspeed telegraph = telegraph.

:lightspeed wire Any wick that can burn non-destructively at the speed of light. Lightspeed wires are a type of reburnable fuse. These are potentially useful for various things, but so far the necessary mechanisms are very large and unwieldy. In October 2002, Jason Summers discovered a lightspeed reaction travelling through an orthogonal chain of beehives. Summers completed a period-1440 lightspeed telegraph based on this reaction in 2003.

...O...........................................................
.O...O.........................................................
.O....O....OO.OO...............................................
O......O...OOOOOO...OO...OO...OO...OO...OO...OO...OO...OO...OO.
O......O..O......O.O..O.O..O.O..O.O..O.O..O.O..O.O..O.O..O.O..O
OO.....O...OOOOOO...OO...OO...OO...OO...OO...OO...OO...OO...OO.
......O....OO.OO...............................................
....O..........................................................

A stable lightspeed transceiver mechanism using this same signal reaction, the p1 telegraph, was constructed by Adam P. Goucher in 2010; the bounding boxes of both the transmitter and receiver are over 5000 cells on a side. A more compact periodic high-bandwidth telegraph with a much improved transmission rate was completed by Louis-François Handfield in 2017.

The following diagram shows an older example of a lightspeed wire, with a small defect that travels along it at the speed of light. As of June 2018, no method has been found of creating such a defect in the upstream end of this particular stable wire, or of non-destructively detecting the arrival of the defect and repairing the wire at the downstream end.

....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
..........................................................
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
.O......O...............................................O.
O.OOOOO....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.O
.O.....O................................................O.
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
..........................................................
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....

:lightweight emulator = LW emulator

:lightweight spaceship = LWSS

:lightweight volcano = toaster

:linear growth A growth rate proportional to T, where T is the number of ticks that a pattern has been run. Compare superlinear growth, quadratic growth.

:linear propagator A self-replicating pattern in which each copy of a pattern produces one child that is an exact copy of itself. The child pattern then blocks the parent from any further replication. An example was constructed by Dave Greene on 23 November 2013, with a construction arm using two glider lanes separated by 9hd. By some definitions, due to its limited one-dimensional growth pattern, the linear propagator is not a true replicator. Compare quadratic replicator.

:line crosser A pattern which is able to send a signal across an infinite diagonal line of live cells without destroying the line. David Bell built one in August 2006. It uses many one-shot period 44160 glider guns on both sides of the line having the proper synchronization to create the reactions shown in line-cutting reaction and line-mending reaction.

An input glider can arrive at any multiple of 44160 generations to first cut the line, then send a glider through the gap, and finally mend the line while leaving an output glider on the other side.

A line crosser whose complete mechanism is on one side of the line is theoretically possible, using single-channel construction methods for example.

:line-cutting reaction A reaction that can cut an infinite diagonal line of cells, leaving a gap with both ends sealed. Such a reaction is demonstrated below. In actual use the reaction should be spread out so that the incoming LWSSes don't conflict. See line-mending reaction for a way to mend the gap.

.........................OO.................................
............OO...........O..................................
..........OO.OO...........O.................................
..........OOOO.............O................................
...........OO...............O...............................
................OO...........O..............................
...............O.O............O.............................
.................O.............O............................
................................O...........................
.................................O..........................
..................................O.........................
...................................O........................
.......................O............O.......................
......................OOO............O......................
......................O.OO............O.....................
O..O...................OOO.............O....................
....O..................OO...............O...................
O...O....................................O..................
.OOOO.....................................O.................
...........................................O................
............................................O...............
.............................................O..............
...................................OO.........O.............
....................................OO.........O............
...................................O............O...........
.................................................O..........
..................................................O.........
.....................................OOO...........O........
....................................O..O............O.......
.......................................O.............O......
.......................................O..............O.....
....................................O.O................O....
........................................................O...
.........................................................O.O
.......OOO................................................OO
.........O............OO......OOO..........OOOO.............
........O............O.O........O.........O...O.............
.......................O.......O..............O.............
..........................................O..O..............
............................................................
............................................................
............................................................
....................................................OO......
.....................................................OO.....
....................................................O.......
............................................................
........................................................OOO.
........................................................O..O
........................................................O...
........................................................O...
.........................................................O.O
.......................OO...................................
......................O.O...................................
........................O...................................
............................................................
..........................................O.................
.........................................OOO................
.........................................O.OO...............
..........................................OOO...............
..........................................OO................

:line-mending reaction A reaction which can fully mend a sealed gap in an infinite diagonal line of cells, such as the one produced by a line-cutting reaction. Such a reaction is demonstrated below. See the line cutting reaction for a way of creating the gliders travelling parallel to the line.

...........OO.............................................
...........O..............................................
............O.............................................
...O.O.......O............................................
....OO........O...........................................
....O..........O..........................................
................O...................................O.....
.................O................................OO......
..................O................................OO.....
...................O......................................
....................O.....................................
.....................O.....................O.O............
......................O....................OO.............
.......................O....................O.............
........................O.................................
.........................O................................
..........................O...............O...............
...........................O.............O................
............................O............OOO..............
.............................O............................
............................OO............................
..........................................................
..........................................................
..........................................................
...........................................O.O............
...........................................OO.......O..O..
............................................O......O......
...................................OOO.............O...O..
.....................................O.............OOOO...
....................................O.....................
.......................................OO.................
.......................................O.O................
..........................................O...............
...........................................O..............
...............................OO...........O.............
..............................O.O............O............
................................O.............O.......OO..
.............O..........................OO.....O.....OO...
.............OO.........................O.O.....O......O..
............O.O.....OO..................O........O........
...................O.O............................O.......
.O...................O.............................O......
.OO.....O...........................................O.....
O.O.....OO...........................................O....
.......O.O............................................O...
.......................................................O.O
........................................................OO
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
.................................O........................
................................OOO.......................
...............................OO.O.......................
...............................OOO........................
................................OO........................

This reaction uses spaceships on both sides of the line which need to be synchronized to each other, for example by passing a glider through the gap to trigger the creation of the required spaceships and gliders.

No simple mechanism is known to mend the gap which lies completely on one side of the line. However, it is technically possible to use construction arm technology to push objects through the gap to build and trigger a seed for the required synchronized signals on the other side.

:line puffer A puffer which produces its output by means of an orthogonal line of cells at right angles to the direction of travel. The archetypal line puffer was found by Alan Hensel in March 1994, based on a spaceship found earlier that month by Hartmut Holzwart. The following month Holzwart found a way to make extensible c/2 line puffers, and Hensel found a much smaller stabilization the following day. But in October 1995 Tim Coe discovered that for large widths these were often unstable, although typically lasting millions of generations. In May 1996, however, Coe found a way to fix the instability. The resulting puffers appear to be completely stable and to exhibit an exponential increase in period as a function of width, although neither of these things has been proved.

Line puffers have enabled the construction of various difficult periods for c/2 spaceships and puffers, including occasionally periods which are not multiples of 4 and which would therefore be impossible to attain with the usual type of construction based on standard spaceships. (See frothing puffer for another method of constructing such periods.) In particular, the first c/2 rake with period not divisible by 4 was achieved in January 2000 when David Bell constructed a p42 backrake by means of line puffers.

See also hivenudger and puff suppressor.

:line ship A spaceship in which the front end is a linestretcher, the line being eaten by the back end.

:linestretcher A wickstretcher that stretches a single diagonal line of cells. The first example was constructed by Jason Summers in March 1999; this was c/12 and used switch engine based puffers found earlier by Dean Hickerson. The first c/4 example was found by Hartmut Holzwart in November 2004.

:loading dock (p3) Found by Dave Buckingham, September 1972.

....O....
..OOO....
.O...OO..
O.OO...O.
.O...OO.O
..OO...O.
....OOO..
....O....

:loaf (p1)

.OO.
O..O
.O.O
..O.

:loafer (c/7 orthogonally, p7) A small c/7 spaceship discovered by Josh Ball on 17 February 2013:

.OO..O.OO
O..O..OO.
.O.O.....
..O......
........O
......OOO
.....O...
......O..
.......OO

It has a known 8-glider construction recipe, probably not minimal, discovered on the following day:

.................................O
...............................OO.
................................OO
.........O........................
.O........O.......................
..O.....OOO.......................
OOO...............................
..................................
..................................
.....O............................
......O...........................
....OOO...........................
........................O.O.......
.........................OO.......
.........................O........
..................................
...........................O.O....
...........................OO.....
............................O.....
...............................OOO
...............................O..
................................O.
..................................
..................................
..................................
..................................
..................................
..................................
.....OO...........................
......OO..........................
.....O............................
The loafer was therefore the first new glider-constructible spaceship in almost a decade. (A glider synthesis for a 2c/5 ship, 60P5H2V0, was found in March 2003.)

:loaflipflop (p15) Here four pentadecathlons hassle a loaf. Found by Robert Wainwright in 1990.

................O.................
...............OOO................
..................................
..................................
...............OOO................
..................................
...............O.O................
...............O.O................
..................................
...............OOO................
..................................
..................................
...............OOO................
................O.................
..................................
.O..O.OO.O..O...............OO....
OO..O....O..OO...OO.......O....O..
.O..O.OO.O..O...O..O.....O......O.
................O.O.....O........O
.................O......O........O
........................O........O
.........................O......O.
..........................O....O..
............................OO....
..................OOO.............
.................O...O............
................O.....O...........
..................................
...............O.......O..........
...............O.......O..........
..................................
................O.....O...........
.................O...O............
..................OOO.............

:loaf on loaf = bi-loaf

:loaf pull The following glider/loaf collision, which pulls a loaf (3,1) toward the glider source:

.O.....
O.O....
O..O...
.OO....
.......
.......
....OOO
....O..
.....O.

:loaf siamese barge (p1)

..OO.
.O..O
O.O.O
.O.O.
..O..

:lobster (c/7 diagonally, p7) A spaceship discovered by Matthias Merzenich in August 2011, the first diagonally travelling c/7 spaceship to be found. It consists of two gliders pulling a tagalong that then rephases them.

............OOO...........
............O.............
.............O..OO........
................OO........
............OO............
.............OO...........
............O..O..........
..........................
..............O..O........
..............O...O.......
...............OOO.O......
....................O.....
OO..O.O.............O.....
O.O.OO.............O......
O....O..OO.............OO.
......O...O......OO..OO..O
..OO......O......O..O.....
..OO....O.O....OO.........
.........O.....O...O...O..
..........O..O....OO......
...........OO...O.....O.O.
...............O........OO
...............O....O.....
..............O...O.......
..............O.....OO....
...............O.....O....

:logarithmic growth A pattern whose population or bounding box grows no faster than logarithmically, asymptotic to n.log(t) for some constant n. The first such pattern constructed was the caber tosser whose population is logarithmic, but whose bounding box still grows linearly. The first pattern whose bounding box and population both grow logarithmically was constructed by Jason Summers with Gabriel Nivasch in 2003. For a pattern with a slower growth rate than this, see Osqrtlogt.

:LoM = lumps of muck

:lone dot agar An agar in which every live cell is isolated in every generation. There are many different lone dot agars. All of them are phoenixes. In 1995 Dean Hickerson and Alan W. Hensel found stabilizations for finite patches of ten lone dot agars to create period 2 oscillators. One of these is shown below:

....OO..OO..OO..OO..OO..OO..OO..OO....
....O..O.O..O..O.O..O..O.O..O..O.O....
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
....O.O..O..O.O..O..O.O..O..O.O..O....
....OO..OO..OO..OO..OO..OO..OO..OO....

:lonely bee = worker bee

:long A term applied to an object that is of the same basic form as some standard object, but longer. For examples see long barge, long boat, long bookend, long canoe, long shillelagh, long ship and long snake.

:long^3 The next degree of longness after long long. Some people prefer "extra long".

:long^4 The next degree of longness after long^3. Some people prefer "extra extra long".

:long barge (p1)

.O...
O.O..
.O.O.
..O.O
...O.

:long boat (p1)

.O..
O.O.
.O.O
..OO
A long boat can be used as a 90-degree or 180-degree one-time turner.

:long bookend The following induction coil, longer than a bookend.

...OO
O...O
OOOO.

:long canoe (p1)

....OO
.....O
....O.
...O..
O.O...
OO....

:long hat = loop

:long hook = long bookend

:long house = dock

:long integral (p1)

..OO
.O.O
.O..
..O.
O.O.
OO..

:long long The next degree of longness after long. Some people prefer "very long".

:long long barge (p1)

.O....
O.O...
.O.O..
..O.O.
...O.O
....O.

:long long boat (p1)

.O...
O.O..
.O.O.
..O.O
...OO

:long long canoe (p1)

.....OO
......O
.....O.
....O..
...O...
O.O....
OO.....

:long long ship (p1)

OO...
O.O..
.O.O.
..O.O
...OO

:long long snake (p1)

OO....
O.O...
...O.O
....OO

:long shillelagh (p1)

OO..OO
O..O.O
.OO...

:long ship (p1)

OO..
O.O.
.O.O
..OO

:long sinking ship = long canoe

:long snake (p1)

OO...
O.O.O
...OO

:loop (p1)

.OO..
O..O.
.O.O.
OO.OO

:looping spaceship = reflectorless rotating oscillator

:lossless elbow A stationary elbow in a construction arm toolkit that allows a recipe to turn a corner with no exponential increase in construction cost. Compare slow elbow. It is theoretically possible to construct lossless elbows for early construction arms such as the one in the 10hd Demonoid, but these would currently have to be very large.

The lossless elbow that has been used the most in practice is the Snark, which can be constructed directly on a single-channel construction lane using a Snarkmaker recipe. Controlled demolition of a Snark is also possible, to remove a temporary elbow that is no longer needed, and leave a hand target in its place if necessary for further construction.

A Silver reflector was used as a lossless elbow in the first spiral growth pattern, attached to a separate universal constructor component.

:low-density Life = sparse Life

:lumps of muck The common evolutionary sequence that ends in the blockade. The name is sometimes used of the blockade itself, and can in general be used of any stage of the evolution of the stairstep hexomino.

:LW emulator (p4) The smallest (and least useful) emulator, found by Robert Wainwright in June 1980.

..OO.O..O.OO..
..O........O..
...OO....OO...
OOO..OOOO..OOO
O..O......O..O
.OO........OO.

:LWSS (c/2 orthogonally, p4) A lightweight spaceship, the smallest known orthogonally moving spaceship, and the second most common (after the glider). Found by Conway when one formed from a random soup in 1970. See also MWSS and HWSS.

.O..O
O....
O...O
OOOO.

The LWSS possesses a tail spark which can easily perturb other objects which grow into its path. The spaceship can also perturb some objects in additional ways. For examples, see blinker ship, hivenudger, and puffer train.

Dave Buckingham found that the LWSS can be synthesized in several different ways using three gliders, and can be constructed from two gliders and another small object in several more ways. Here is the fastest synthesis:

.O.....
O......
OOO....
.....OO
....OO.
......O
.......
..OO...
...OO..
..O....

:LWSS emulator = LW emulator

:LWSS-glider bounce The following reaction in which a LWSS and a glider collide to form a glider heading back between the two input paths:

.OOOO........
O...O........
....O.....OOO
O..O......O..
...........O.
This is one way to inject a glider into a existing glider stream. The infinite glider hotel uses this reaction.

:LWSS-LWSS bounce The following symmetric reaction in which two LWSSs collide head-on to form two gliders heading apart at 90 degrees from each other. Compare LWSS-LWSS deflection.

O..O.......O..O
....O.....O....
O...O.....O...O
.OOOO.....OOOO.
This provides one way to inject a glider into a existing glider stream. Another use is described in metamorphosis.

:LWSS-LWSS deflection The following symmetric reaction in which two LWSSs collide nearly head-on to form two gliders heading apart at 180 degrees from each other. Compare LWSS-LWSS bounce.

.........O..O
........O....
........O...O
........OOOO.
.............
.OOOO........
O...O........
....O........
O..O.........

:LWSS-to-G See 135-degree MWSS-to-G.

:LWTDS Life Worker Time Deficiency Syndrome. Term coined by Dieter Leithner to describe the problem of having to divide scarce time between Life and real life.

:LW volcano = toaster

:Lx200 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in June 1997. It is made up of two elementary conduits, HL141B + BFx59H. The Lx200 and F166 conduits are the two original dependent conduits (several more have since been discovered.) After 200 ticks, it produces an inverted Herschel turned 90 degrees counterclockwise at (17, -40) relative to the input. Its recovery time is 90 ticks. It can be made Spartan by replacing the snakes with eater1s in one of two orientations. A ghost Herschel in the pattern below marks the output location:

.....................OO.............
......................O.............
......................OOO...........
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
.......................OO...........
.......................OO...........
....................................
..............................O.OO..
..............................OO.O..
....................................
....................................
..............O.OO..................
..............OO.O..................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
................................OO..
................................O.O.
.OO...............................O.
OOO.OO............................OO
.OO.OOO.OO..........................
OOO.OO..OO..........................
OO..................................
....................................
....................................
....................................
................................OO..
................................OO..
....................................
......OO............................
.......O............................
....OOO.........................OO..
....O...........................OO..
..................OO................
.................O.O................
.................O..................
................OO........OO........
..........................O.........
...........................OOO......
.............................O......
The input shown here is a Herschel great-grandparent, since the input reaction is catalysed by the transparent block before the Herschel's standard form can appear.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_o.htm0000755000175000017500000005067113317135606016417 00000000000000 Life Lexicon (O)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:oblique Neither diagonal nor orthogonal. See also knightship.

:obo spark A spark of the form O.O (so called after its rle encoding).

:octagon II (p5) The first known p5 oscillator, discovered in 1971 independently by Sol Goodman and Arthur Taber. The name is due to the latter.

...OO...
..O..O..
.O....O.
O......O
O......O
.O....O.
..O..O..
...OO...

:octagon IV (p4) Found by Robert Wainwright, January 1979.

.......OO.......
.......OO.......
................
......OOOO......
.....O....O.....
....O......O....
...O........O...
OO.O........O.OO
OO.O........O.OO
...O........O...
....O......O....
.....O....O.....
......OOOO......
................
.......OO.......
.......OO.......

:octomino Any 8-cell polyomino. There are 369 such objects. The word is particularly applied to the following octomino (or its two-generation successor), which is fairly common but lacks a proper name:

..OO
..OO
OOO.
.O..

:odd keys (p3) Found by Dean Hickerson, August 1989. See also short keys and bent keys.

..........O.
.O.......O.O
O.OOO..OO.O.
.O..O..O....
....O..O....

:omino = polyomino

:omniperiodic A cellular automaton is said to be omniperiodic if it has oscillators of all periods. It is not known if Life is omniperiodic, although this seems likely. Dave Buckingham's work on Herschel conduits in 1996 (see My Experience with B-heptominos in Oscillators) left only a short list of unresolved cases, all with periods of 58 or below. The list has been progressively reduced since then. Most recently, period 43 and 53 oscillators were made possible in 2013 by Mike Playle's Snark. As of June 2018, no oscillators are known for periods 19, 23, 38, or 41. If we insist that the oscillator must be non-trivial, then 34 should be added to this list.

Note that if we were to allow infinite oscillators, then all periods are certainly possible, as any period of 14 or more can be obtained using a glider (or LWSS) stream, or an infinitely long 2c/3 wire containing signals with the desired separation.

:one per generation See grow-by-one object.

:one-sided spaceship synthesis A glider synthesis of a spaceship in which all gliders come from the same side of the spaceship's path. Such syntheses are used extensively in the 17c/45 Caterpillar. For example, here is a one-sided way to create an LWSS.

...O.....
....OO...
...OO....
.........
.........
.....O...
...O.O...
....OO...
.........
.........
.........
.........
......OOO
........O
.......O.
.........
.........
.........
OOO......
..O......
.O.......

:one-time A term used for turners and splitters, specifying that the reaction in question is not repeatable as it would be in a reflector or fanout device. Instead, the constellation is used up, usually in a clean reaction, but the much more common dirty turners and splitters are also very useful in some situations.

:onion rings For each integer n>1 onion rings of order n is a stable agar of density 1/2 obtained by tiling the plane with a certain 4n x 4n pattern. The tile for order 3 onion rings is shown below. The reader should be able to deduce the form of tiles of other orders.

......OOOOOO
.OOOO.O....O
.O..O.O.OO.O
.O..O.O.OO.O
.OOOO.O....O
......OOOOOO
OOOOOO......
O....O.OOOO.
O.OO.O.O..O.
O.OO.O.O..O.
O....O.OOOO.
OOOOOO......

:Online Life-Like CA Soup Search = The Online Life-Like CA Soup Search.

:on-off Any p2 oscillator in which all rotor cells die from overpopulation. The simplest example is a beacon. Compare flip-flop.

:O-pentomino Conway's name for the following pentomino, a traffic light predecessor, although not one of the more common ones.

OOOOO

:orbit A term proposed by Jason Summers to refer to a natural stabilization of a puffer. For example, the switch engine has two (known) orbits, the block-laying one and the glider-producing one.

:Orion (c/4 diagonally, p4) Found by Hartmut Holzwart, April 1993.

...OO.........
...O.O........
...O..........
OO.O..........
O....O........
O.OO......OOO.
.....OOO....OO
......OOO.O.O.
.............O
......O.O.....
.....OO.O.....
......O.......
....OO.O......
.......O......
.....OO.......
In May 1999, Jason Summers found the following smaller variant:
.OO..........
OO...........
..O..........
....O....OOO.
....OOO....OO
.....OOO.O.O.
............O
.....O.O.....
....OO.O.....
.....O.......
...OO.O......
......O......
....OO.......

:orphan Conway's preferred term for a Garden of Eden. According to some definitions, an orphan consists of just the minimum living and dead cells needed to ensure that no parent is possible, whereas a GoE is an entire infinite Life plane that contains an orphan.

:Orthogonoid (256c/3476016, p3476016) A self-constructing spaceship analogous to the Demonoids, with a slow orthogonal direction of travel. The first example was completed by Dave Greene on 29 June 2017, with a top speed of 16c/217251 (this is just 256c/3476016 in lowest terms).

The construction recipe is a stream of MWSSes, with the recovery time limited to 90 ticks by the Lx200 dependent conduit that follows the initial syringe converter. The design is hashlife-friendly, meaning that the spaceship can be trivially adjusted so that spatial and temporal offsets are exact powers of two; period 4194304 and period 8388608 versions have been constructed, with speeds of c/16384 and c/32768 respectively.

The MWSSes are converted to Herschels, which produce a standard single-channel glider stream that runs the Orthogonoid's single construction arm. After the child circuitry is complete, a previously constructed Snark in the parent is removed from the construction arm lane, converting it to a "destruction arm" that shoots down the previous constructor/reflector in the series.

:oscillator Any pattern that is a predecessor of itself. The term is usually restricted to non-stable finite patterns; period 1 oscillators are stable and are usually just called still lifes. The blinker is the smallest non-stable oscillator, having period 2. There are oscillators of almost all higher periods (see omniperiodic). In general cellular automaton theory the term "oscillator" usually covers spaceships as well, but this usage is not normal in Life.

Oscillators consisting of separate objects which do not react in any phase are usually ignored. For example, a separated blinker and pulsar makes a period 6 oscillator, but is considered trivial.

An oscillator can be divided into a rotor and a stator, and the stator can be further subdivided into bushing and casing. Some oscillators have no casing cells, and a few 100%-volatility oscillators also have no bushing cells.

An oscillator can be constructed from any gun as long as eaters can be added to consume its output. If it is a true gun then the period of the oscillator will be the same as the gun - unless the eating mechanism multiplies the period, as in the case of gliders caught by a boat-bit.

With the discovery of reflectors, relays provide an easy way to create oscillators of all large periods. For example, eight gliders travelling in a loop created by four Snarks can create any period above 42, with a population never exceeding 356 live cells.

For the very lowest periods, whole families of extensible oscillators are known. Examples of this are barberpole, cross, pentoad, p6 shuttle, snacker, and multiple roteightors. Any of the shuttles are oscillators by definition, for example the queen bee shuttle. Many of these are also extensible. Other oscillators such as figure-8 and tumbler have unique mechanisms that are not part of an extended family.

Some oscillators are useful because of the perturbations they can cause to other objects. This is especially true if they provide a spark on their boundary. Some oscillators are explicitly found by search programs in order to produce these sparks, such as pipsquirters.

Some higher period oscillators have been found while running random soups. This is especially true if the soup is run on a cylindrical or torus universe. Sometimes the found objects can be moved to the normal universe and supported there by added catalysts. Achim's p144 is an example.

:Osqrtlogt (p1 circuitry) A pattern constructed by Adam P. Goucher in 2010, which uses an unbounded triangular region as memory for a binary counter. Empty space is read as a zero, and a boat as a one, as shown in the example pattern in memory cell. The pattern's diametric growth rate is O(sqrt(log(t))), which is the slowest possible for any Life pattern, or indeed any 2D Euclidean cellular automaton. The population returns infinitely often to its initial minimum value (during carry operations from 11111...1 to 100000...0, so it can be considered to be an unusual form of sawtooth.

:OTCA metapixel (p46 circuitry) A 2048 x 2048 period 35328 metacell constructed by Brice Due in 2006. It contains a large "pixel" area that contains a large population of LWSSes when the metacell state is ON, but is empty when it is OFF. This allows the state of the metacell to be visible at high zoom levels, unlike previous unit cells where the state was signaled by the presence or absence of a single glider in a specific location.

:out of the blue See natural Heisenburp. Other similar mechanisms, particularly the method of LWSS creation used in the pixel part of the OTCA metapixel, may also be referred to as "out of the blue" reactions.

:overclocking A term used when a circuit can accept a signal at a specific period which it cannot accept at a higher period. A syringe is a simple example.

Some staged recovery circuits also permit overclocking, and can function successfully at a rate faster than their recovery time. A Silver reflector has a recovery time of 497 ticks, but can be overclocked to reflect a period 250 glider stream, or any nearby period above 248, simply by removing a beehive after the first glider enters the reflector. However, a continuous stream of gliders is then required to maintain the circuit, with timing within a tightly bounded range.

:overcrowding = overpopulation

:over-exposure = underpopulation

:overpopulation Death of a cell caused by it having more than three neighbours. See also underpopulation.

:over-unity reaction An important concept in gun and macro-spaceship construction. To be a good candidate for building one of these types of patterns with a new period or speed, a stationary reaction (for a gun) or a moving reaction (for a macro-spaceship) must be able to produce some number of output signals, strictly greater than the number of input signals required to maintain the reaction. The extra signal becomes a gun's output stream, or may be used in a variety of ways to construct the supporting track for a macro-spaceship. By implication, "over-unity" refers to the ratio of output signals to input signals.

If all signal outputs must be used up to sustain a stationary reaction, a high-period oscillator may still be possible. See emu for example.

:overweight spaceship = OWSS

:OWSS A would-be spaceship similar to LWSS, MWSS and HWSS but longer. On its own an OWSS is unstable, but it can be escorted by true spaceships to form a flotilla.

:Ox A 1976 novel by Piers Anthony which involves Life.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_1.htm0000755000175000017500000022233413317135606016316 00000000000000 Life Lexicon (1)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:0hd Demonoid See Demonoid.

:101 (p5) Found by Achim Flammenkamp in August 1994. The name was suggested by Bill Gosper, noting that the phase shown below displays the period in binary.

....OO......OO....
...O.O......O.O...
...O..........O...
OO.O..........O.OO
OO.O.O..OO..O.O.OO
...O.O.O..O.O.O...
...O.O.O..O.O.O...
OO.O.O..OO..O.O.OO
OO.O..........O.OO
...O..........O...
...O.O......O.O...
....OO......OO....

:10hd Demonoid See Demonoid.

:119P4H1V0 (c/4 orthogonally, p4) A spaceship discovered by Dean Hickerson in December 1989, the first spaceship of its kind to be found. Hickerson then found a small tagalong for this spaceship which could be attached to one side or both. These three variants of 119P4H1V0 were the only known c/4 orthogonal spaceships until July 1992 when Hartmut Holzwart discovered a larger spaceship, 163P4H1V0.

.................................O.
................O...............O.O
......O.O......O.....OO........O...
......O....O....O.OOOOOO....OO.....
......O.OOOOOOOO..........O..O.OOO.
.........O.....O.......OOOO....OOO.
....OO.................OOO.O.......
.O..OO.......OO........OO..........
.O..O..............................
O..................................
.O..O..............................
.O..OO.......OO........OO..........
....OO.................OOO.O.......
.........O.....O.......OOOO....OOO.
......O.OOOOOOOO..........O..O.OOO.
......O....O....O.OOOOOO....OO.....
......O.O......O.....OO........O...
................O...............O.O
.................................O.

:1-2-3 (p3) Found by Dave Buckingham, August 1972. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are stillater and cuphook.

..OO......
O..O......
OO.O.OO...
.O.O..O...
.O....O.OO
..OOO.O.OO
.....O....
....O.....
....OO....

:1-2-3-4 (p4) See also Achim's p4.

.....O.....
....O.O....
...O.O.O...
...O...O...
OO.O.O.O.OO
O.O.....O.O
...OOOOO...
...........
.....O.....
....O.O....
.....O.....

:135-degree MWSS-to-G The following converter, discovered by Matthias Merzenich in July 2013. It accepts an MWSS as input, and produces an output glider travelling at a 135-degree angle relative to the input direction.

......OO......
......O.O.OO.O
........O.O.OO
........OO....
..............
..............
.OOOOO.....OO.
O....O.....OO.
.....O........
O...O.........
..O...........

:14-ner = fourteener

:17c/45 spaceship A spaceship travelling at seventeen forty-fifths of the speed of light. This was the first known macro-spaceship speed. See Caterpillar for details.

:180-degree kickback The only other two-glider collision besides the standard kickback that produces a clean output glider with no leftover ash. The 180-degree change in direction is occasionally useful in glider synthesis, but is rarely used in signal circuitry or in self-supporting patterns like the Caterpillar or Centipede, because 90-degree collisions are generally much easier to arrange.

.O.
O..
OOO
...
...
.OO
O.O
..O

:1G seed See seed.

:(2,1)c/6 spaceship A knightship that travels obliquely at the fastest possible speed. To date the only known example of a spaceship with this velocity is Sir Robin.

:(23,5)c/79 Herschel climber The following glider-supported Herschel climber reaction used in the self-supporting waterbear knightship, which can be repeated every 79 ticks, moving the Herschel 23 cells to the right and 5 cells upward, and releasing two gliders to the northwest and southwest. As the diagram shows, it is possible to substitute a loaf or other still lifes for some or all of the support gliders. This fact is used to advantage at the front end of the waterbear.

...............O.O...............O..
...............OO...............O.O.
................O...............O..O
.................................OO.
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
O...................................
O.O.................................
OOO.................................
..O.................................

:24-cell quadratic growth A 39786x143 quadratic growth pattern found by Michael Simkin in October 2014, two days after 25-cell quadratic growth and a week before switch-engine ping-pong.

:25-cell quadratic growth A 25-cell quadratic growth pattern found by Michael Simkin in October 2014, with a bounding box of 21372x172. It was the smallest-population quadratic growth pattern for two days, until the discovery of 24-cell quadratic growth. It superseded wedge, which had held the record for eight years. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:25P3H1V0.1 (c/3 orthogonally, p3) A spaceship discovered by Dean Hickerson in August 1989. It was the first c/3 spaceship to be discovered. In terms of its 25 cells, it is tied with 25P3H1V0.2 as the smallest c/3 spaceship. Unlike 25P3H1V0.2, it has a population of 25 in all of its phases, as well as a smaller bounding box.

.......OO.O.....
....OO.O.OO.OOO.
.OOOO..OO......O
O....O...O...OO.
.OO.............
Martin Grant discovered a glider synthesis for 25P3H1V0.1 on 6 January 2015.

:25P3H1V0.2 (c/3 orthogonally, p3) A spaceship discovered by David Bell in early 1992, with a minimum of 25 cells - the lowest number of cells known for any c/3 spaceship. A note in Spaceships in Conway's Life indicates that it was found with a search that limited the number of live cells in each column, and possibly also the maximum cross-section (4 cells in this case). See also edge-repair spaceship for a very similar c/3 spaceship with a minimum population of 26.

..........O.....
........OOO.OOO.
.......OO......O
..O...O..O...OO.
.OOOO...........
O...O...........
.O.O..O.........
.....O..........
In December 2017 a collaborative effort found a 26-glider synthesis for this spaceship.

:26-cell quadratic growth = wedge.

:295P5H1V1 (c/5 diagonally, p5) The first spaceship of its type to be discovered, found by Jason Summers on 22 November 2000.

.............OO.....................................
.....OO....OO.O.O...................................
....OOO....OOOO.....................................
...OO......OO.....O.................................
..OO..OO...O..O..O..................................
.OO.....O.......O..OO...............................
.OO.O...OOOO........................................
....O...OO..OO.O....................................
.....OOO....O.O.....................................
......OO...OO..O....................................
......O.....O.......................................
.OOOO.O..O..O...O...................................
.OOO...OOOOO..OOOOOOO.O.............................
O.O....O..........O..OO.............................
OOO.O...O...O.....OOO...............................
.......O.O..O.......OO..............................
.O...O.....OO........OO..O.O........................
....O.......O........OOO.O.OOO......................
...O........OOO......O....O.........................
.....O......O.O.....O.O.............................
.....O......O.OO...O....O...........................
.............O.OOOO...O.....O..O....................
............OO..OO.O.O...O.OOO......................
.................O......O..OOO...OOO................
....................O..O......OO....................
................OO....O..O..........OO..............
..................O.............O...O...............
................OO....OO........O...................
.................O...OOO........O.O.O.O.............
.................O....OO........O.....OO............
........................O........O..OOO.............
.....................O..O........O........O.........
..........................OOOO........OO...O........
.......................O......OO......OO...O........
.......................O....O............O..........
.......................O...............O............
.........................OO.O.O.......O..O..........
.........................O....O.........OOO.........
............................OOO.OO..O...O...O.OO....
.............................O..OO.O.....O...O..O...
.....................................OO..O...O......
..................................O.OO.OO.O..OO...O.
...............................O.....O...O.......O.O
................................OO............OO...O
......................................O.......OO....
.......................................OOO...OO..O..
......................................O..O.OOO......
......................................O....OO.......
.......................................O............
..........................................O..O......
.........................................O..........
..........................................OO........

:2c/3 Two thirds of the speed of light - the speed of signals in a 2c/3 wire or of some against the grain negative spaceship signals in the zebra stripes agar, and also the speed of burning of the blinker fuse and the bi-block fuse.

:2c/3 wire A wire discovered by Dean Hickerson in March 1997, using his dr search program. It supports signals that travel through the wire diagonally at two thirds of the speed of light.

......O..O.......................................
....OOOOOO.......................................
...O.............................................
...O..OOOOOO.....................................
OO.O.O.O....O....................................
OO.O.O.OOOOOO....................................
....OO.O.......O.................................
.......O..OOOOOO.................................
.......O.O.......................................
......OO.O..OOOOOO...............................
.........O.O......O..............................
.........O.O..OOOOO..............................
..........OO.O.......O...........................
.............O..OOOOOO...........................
.............O.O.................................
............OO.O..OOOOOO.........................
...............O.O......O........................
...............O.O..OOOOO........................
................OO.O.......O.....................
...................O..OOOOOO.....................
...................O.O...........................
..................OO.O..OOOOOO...................
.....................O.O......O..................
.....................O.O..OOOOO..................
......................OO.O.......O...............
.........................O..OOOOOO...............
.........................O.O.....................
........................OO.O..OOOOOO.............
...........................O.O......O............
...........................O.O..OOOOO............
............................OO.O.......O.........
...............................O..OOOOOO.........
...............................O.O...............
..............................OO.O..OOOOOO.......
.................................O.O......O......
.................................O.O..OOOOO......
..................................OO.O.......O...
.....................................O..OOOOOO...
.....................................O.O.........
....................................OO.O..OOOOOO.
.......................................O.O......O
.......................................O.O..OOO.O
........................................OO.O...O.
...........................................O..O..
...........................................O.O...
..........................................OO.O.O.
..............................................OO.

Each 2c/3 signal is made up of two half-signals that can be separated from each other by an arbitrary number of ticks.

Considerable effort has been spent on finding a way to turn a 2c/3 signal 90 or 180 degrees, since this would by one way to prove Life to be omniperiodic. There is a known 2c/3 converter shown under signal elbow, which converts a standard 2c/3 signal into a double-length signal. This is usable in some situations, but unfortunately it fails when its input is a double-length signal, so it can't be used to complete a loop.

Noam Elkies discovered a glider synthesis of a reaction that can repeatably insert a signal into the upper end of a 2c/3 wire. See stable pseudo-Heisenburp for details. On 11 September 2017, Martin Grant reduced the input reaction to five gliders, or three gliders plus a Herschel. With the Herschel option the recovery time is 152 ticks.

See also 5c/9 wire.

:2c/5 spaceship A spaceship travelling at two fifths of the speed of light. The only such spaceships that are currently known travel orthogonally. Examples include 30P5H2V0, 44P5H2V0, 60P5H2V0, and 70P5H2V0. As of June 2018, only 30P5H2V0 and 60P5H2V0 have known glider synthesis recipes.

:2c/7 spaceship A spaceship travelling at two sevenths of the speed of light. The only such spaceships that are currently known travel orthogonally. The first to be found was the weekender, found by David Eppstein in January 2000. See also weekender distaff.

:2 eaters = two eaters

:2-engine Cordership The smallest known Cordership, with a minimum population of 100 cells, discovered by Aidan F. Pierce on 31 December 2017. Luka Okanishi produced a 9-glider synthesis of the spaceship on the same day.

............O............................
............O.....OOO....................
...........O.O...OO..O...................
............O...O.....O..................
............O...O........................
.................O..OO...................
..................OO...........OO........
...............................OO........
.........................................
.........................................
.........................................
.........................................
.........................................
.........................................
.OOO...................................OO
.OOO.....................O.............OO
..O............OO.........OO.............
...OO.........O.OOO........OO............
....O.........O...O..........O...........
...O...........OO.O.....OOOOO............
................O..........O.............
.........................................
.........................................
.OO......................................
.OO......................................
..O......................................
..O......................................
.O.O.....................................
O........................................
.O..OO...................................
..O...O..................................
....OO...................................
....O....................................
.........................................
.........................................
.........................................
.........................................
.........................................
.........................................
......OO.................................
......OO.................................
...................O.....................
...................OOO...................
....................OO...................
....................O....................
.........................................
..................OO.O...................
..................OOOO...................
....................OO...................

:2-glider collision Two gliders can react with each other in many different ways, either at right angles, or else head-on. A large number of the reactions cleanly destroy both gliders leaving nothing. Many of the remaining reactions cleanly create some common objects, and so are used as the first steps in glider synthesis or as part of constructing interesting objects using rakes. Only a small number of collisions can be considered dirty due to creating multiple objects or a mess.

Here is a list of the possible results along with how many different ways they can occur (ignoring reflections and rotations).

  -------------------------------
  result     right-angle  head-on
  -------------------------------
  nothing             11       17
  beehive              1        0
  B-heptomino          1        2
  bi-block             1        0
  blinker              2        1
  block                3        3
  boat                 0        1
  eater1               1        0
  glider               1        1
  honey farm           3        2
  interchange          1        0
  loaf                 0        1
  lumps of muck        1        0
  octomino             0        1
  pi-heptomino         2        1
  pond                 1        1
  teardrop             1        0
  traffic light        2        1
  four skewed blocks   0        1
  dirty                6        0
  -------------------------------
The messiest of the two-glider collisions in the "dirty" category is 2-glider mess.

:2-glider mess A constellation made up of eight blinkers, four blocks, a beehive and a ship, plus four emitted gliders, created by the following 2-glider collision.

..O.........
O.O.........
.OO.........
...........O
.........OO.
..........OO
Two of the blocks, two of the gliders, and the ship are the standard signature ash of a Herschel.

:30P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Paul Tooke on 7 December 2000. With just 30 cells, it is currently the smallest known 2c/5 spaceship. A glider synthesis for 30P5H2V0 was found by Martin Grant in January 2015, based on a predecessor by Tanner Jacobi.

....O........
...OOO.......
..OO.OO......
.............
.O.O.O.O..O..
OO...O...OOO.
OO...O......O
..........O.O
........O.O..
.........O..O
............O

:31c/240 The rate of travel of the 31c/240 Herschel-pair climber reaction, and Caterpillar-type spaceships based on that reaction. Each Herschel travels 31 cells orthogonally every 240 ticks.

:31c/240 Herschel-pair climber The mechanism defining the rate of travel of the Centipede and shield bug spaceships. Compare pi climber. It consists of a pair of Herschels climbing two parallel chains of blocks. Certain spacings between the block chains allow gliders from each Herschel to delete the extra ash objects produced by the other Herschel. Two more gliders escape, one to each side, leaving only an exact copy of the original block chains, but shifted forward by 9 cells:

OO.........................................................OO
OO.........................................................OO
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
OO.........................................................OO
OO.........................................................OO
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.......................................................OOO...
.......................................................O..O..
.......................................................O..O..
......................................................OOOO...
.......OOO............................................OO.....
........O............................................O.......
......OOO.............................................O......
......................................................O......

:3c/7 spaceship A spaceship travelling at three sevenths of the speed of light. The only such spaceships that are currently known travel orthogonally. The first to be found was the spaghetti monster, found by Tim Coe in June 2016.

:3-engine Cordership See Cordership.

:44P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Dean Hickerson on 23 July 1991, the first 2c/5 spaceship to be found. Small tagalongs were found by Robert Wainwright and David Bell that allowed the creation of arbitrarily large 2c/5 spaceships. These were the only known 2c/5 spaceships until the discovery of 70P5H2V0 in December 1992.

....O.....O....
...OOO...OOO...
..O..O...O..O..
.OOO.......OOO.
..O.O.....O.O..
....OO...OO....
O....O...O....O
.....O...O.....
OO...O...O...OO
..O..O...O..O..
....O.....O....

:45-degree LWSS-to-G = 45-degree MWSS-to-G.

:45-degree MWSS-to-G The following small converter, which accepts an MWSS or LWSS as input and produces an output glider travelling at a 45-degree angle relative to the input direction.

.........O.OO....O.....
.........OO.O...O.O....
................O.O....
.......OOOOO...OO.OOO..
......O..O..O........O.
......OO...OO..OO.OOO..
...............OO.O....
......................O
....................OOO
...................O...
...................OO..
.OOOOO.................
O....O.................
.....O.................
O...O..................
..O.............OO.....
...............O..O....
................OO.....
........OO.............
.......O.O.............
.......O...............
......OO...............
...................OO..
...................O...
....................OOO
......................O

:4-8-12 diamond The following pure glider generator.

....OOOO....
............
..OOOOOOOO..
............
OOOOOOOOOOOO
............
..OOOOOOOO..
............
....OOOO....

:4 boats (p2)

...O....
..O.O...
.O.OO...
O.O..OO.
.OO..O.O
...OO.O.
...O.O..
....O...

:4F = Fast Forward Force Field. This term is no longer in common use.

:4g-to-5g reaction A reaction involving 4 gliders which cleanly produces 5 gliders. The one shown below was found by Dieter Leithner in July 1992:

O.O..........................................
.OO..........................................
.O...........................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.................O...........................
...............O.O..O........................
................OO..O.O....................O.
....................OO....................OO.
..........................................O.O

The first two gliders collide to produce a traffic light and glider. The other two gliders react symmetrically with the evolving traffic light to form four gliders. A glider gun can be built by using reflectors to turn four of the output gliders so that they repeat the reaction.

:56P6H1V0 (c/6 orthogonally, p6) A 56-cell spaceship discovered by Hartmut Holzwart in 2009, the smallest known c/6 orthogonal spaceship as of July 2018.

.....OOO..........OOO.....
OOO.O.......OO.......O.OOO
....O...O..O..O..O...O....
....O.....O....O.....O....
..........OO..OO..........
.......O...O..O...O.......
.......O.O......O.O.......
........OOOOOOOOOO........
..........O....O..........
........O........O........
.......O..........O.......
........O........O........

:58P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Matthias Merzenich on 5 September 2010. In terms of its minimum population of 58 cells it is the smallest known c/5 diagonal spaceship. It provides sparks at its trailing edge which can perturb gliders, and this property was used to create the first c/5 diagonal puffers. These sparks also allow the attachment of tagalongs which was used to create the first c/5 diagonal wickstretcher in January 2011.

....................OO.
....................OO.
...................O..O
................OO.O..O
......................O
..............OO...O..O
..............OO.....O.
...............O.OOOOO.
................O......
.......................
.......................
.............OOO.......
.............O.........
...........OO..........
.....OO....O...........
.....OOO...O...........
...O....O..............
...O...O...............
.......O...............
..OO.O.O...............
OO.....O...............
OO....OO...............
..OOOO.................

:5c/9 wire A wire discovered by Dean Hickerson in April 1997, using his dr search program. It supports signals that travel through the wire diagonally at five ninths of the speed of light. See also 2c/3 wire.

....O.OO............................................
....OO..O...........................................
.......O..O.........................................
..OOOOO.OO.O..O.....................................
.O..O...O..OOOO.....................................
.O.OO.O.O.O......O..................................
OO.O.OOOO.O..OOOOO..................................
...O......O.O.....OO................................
OO.O.OOOO.O..O.OO.O.O...............................
O..O.O..O.OO.O.O.O..O...............................
..OO..O..O...O.O....O.OO............................
....OO....OOOO.OO..OO..O............................
....O...O.O......O...O..............................
.....OOOO.O.OOOOO.OOO...O...........................
.........O.O....O.O..OOOO...........................
.......O...O..O...O.O......O........................
.......OO..O.O.OOOO.O..OOOOO........................
..........OO.O......O.O.....OO......................
.............O.OOOO.O..O.OO.O.O.....................
.............O.O..O.OO.O.O.O..O.....................
............OO..O..O...O.O....O.OO..................
..............OO....OOOO.OO..OO..O..................
..............O...O.O......O...O....................
...............OOOO.O.OOOOO.OOO...O.................
...................O.O....O.O..OOOO.................
.................O...O..O...O.O......O..............
.................OO..O.O.OOOO.O..OOOOO..............
....................OO.O......O.O.....OO............
.......................O.OOOO.O..O.OO.O.O...........
.......................O.O..O.OO.O.O.O..O...........
......................OO..O..O...O.O....O.OO........
........................OO....OOOO.OO..OO..O........
........................O...O.O......O...O..........
.........................OOOO.O.OOOOO.OOO...O.......
.............................O.O....O.O..OOOO.......
...........................O...O..O...O.O......O....
...........................OO..O.O.OOOO.O..OOOOO....
..............................OO.O......O.O.....OO..
.................................O.OOOO.O..O.OO.O..O
.................................O.O..O.OO.O.O.O..OO
................................OO..O..O...O.O......
..................................OO....OOOO.OO.....
..................................O...O.O......O....
...................................OOOO.O.OOOOO.O...
.......................................O.O....O.O...
.....................................O...O..O...OO..
.....................................OO..O.O.OOO..O.
........................................OO.O.....O..
............................................O.OOO...
.............................................OO.....

:60P312 (p312) Found by Dave Greene, 1 November 2004, based on 92P156.

....................OO....................
....................OO....................
..........................................
..........................................
..........................................
...............................OO.........
......................OO......O..O........
......................O........OO.........
......O...............O...................
.....O.O...............O..................
.....O.O..................................
......O...................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
................................O..O......
.................................OOO......
OO......................................OO
OO......................................OO
......OOO.................................
......O..O................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...................................O......
..................................O.O.....
..................O...............O.O.....
...................O...............O......
.........OO........O......................
........O..O......OO......................
.........OO...............................
..........................................
..........................................
..........................................
....................OO....................
....................OO....................

:60P5H2V0 (2c/5 orthogonally, p5) A 60-cell spaceship discovered by Tim Coe in May 1996. It was the first non-c/2 orthogonal spaceship to be successfully constructed via glider synthesis.

.....O.......O.....
...OO.OO...OO.OO...
......OO...OO......
........O.O........
.O....O.O.O.O....O.
OOO.....O.O.....OOO
O.....O.O.O.O.....O
..O..O..O.O..O..O..
..OO...OO.OO...OO..
O.......O.O.......O
O......OO.OO......O

:67P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Nicolay Beluchenko in July 2006. It was the smallest known c/5 diagonal spaceship until the discovery of 58P5H1V1 in September 2010.

.....OOO..............
....O...OO............
...OO...O.............
..O.....O.............
.O.OO....OO...........
OO..O......O..........
...OO..O..............
...OO.OO..............
....O.................
.....OOOOO............
......O..OOO..OO......
.........O.OO..O.OO...
.........O...O.O..O...
..........OOOOO.....O.
.........O..O..O.....O
.....................O
................OOO...
................O.....
...............O......
................OO....

:70P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Hartmut Holzwart on 5 December 1992.

..O............O..
.O.O..........O.O.
OO.OO........OO.OO
OO..............OO
..O............O..
..OOOO......OOOO..
..O..OO....OO..O..
...OO..O..O..OO...
....OO.OOOO.OO....
.....O.O..O.O.....
......O....O......
..................
.....O......O.....
...OO.OO..OO.OO...
....O........O....
....OO......OO....

:7x9 eater A high-clearance eater5 variant that can suppress passing gliders in tight spaces, such as on the inside corner of an R64 Herschel conduit. Like the eater5 and sidesnagger, the 7x9 eater is able to eat gliders coming from two directions, though this ability is not commonly used.

.O..........
..O.........
OOO.........
............
......O.....
.....O......
.....OOO....
............
............
......O...OO
.....O.O...O
.....OO...O.
.........O..
.....OOOOO.O
.....O....OO
......OOO...
........O.OO
.........O.O

:83P7H1V1 = lobster

:86P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Jason Summers on January 8, 2005. It was the smallest known c/5 diagonal spaceship until the discovery of 67P5H1V1 in July 2006.

.........OOO...........
........O..............
.......O...............
...........OO..........
........OO.O...........
..............OOO......
...........O..OO..OO...
..O........OO.O...OO...
.O..O......O..OO.......
O...O..................
O...........O..O.......
O..OO.OOO...O...OO.OO..
...O...O..OO..O..O.....
.................OO..O.
.....OOOO...O.....O...O
.....OO.O.O..........O.
.....O.....O......OO...
...........OOO.........
......OO.....OO.O......
......OO...O....O......
...........O...........
.............O.O.......
..............O........

:90-degree kickback See kickback reaction.

:92P156 (p156) Discovered by Jason Summers on October 31, 2004. It is actually an eight-barrel glider gun, with all output gliders suppressed by eater1s. Replacing each pair of eater1s with a beehive doubles the period and produces 60P312.

....................OO....................
....................OO....................
..........................................
..........................................
..........................................
........OO......................OO........
.........O............OO........O.........
.........O.O..........O.......O.O.........
.....O....OO..........O.......OO....O.....
.....OOO...............O..........OOO.....
........O........................O........
.......OO........................OO.......
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
................................O..O......
.................................OOO......
OO......................................OO
OO......................................OO
......OOO.................................
......O..O................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
.......OO........................OO.......
........O........................O........
.....OOO..........O...............OOO.....
.....O....OO.......O..........OO....O.....
.........O.O.......O..........O.O.........
.........O........OO............O.........
........OO......................OO........
..........................................
..........................................
..........................................
....................OO....................
....................OO....................

:9hd Separated by 9 half diagonals. Specifically used to describe the distance between the two construction lanes in the linear propagator.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_c.htm0000755000175000017500000033403113317135606016376 00000000000000 Life Lexicon (C)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:c = speed of light

:c/10 spaceship A spaceship travelling at one tenth of the speed of light. The first such spaceship to be discovered was the orthogonally travelling copperhead, found by 'zdr' on 5 March 2016. Simon Ekström found the related fireship two weeks later. A Caterloopillar can theoretically be configured to move at c/10, but there are technical difficulties with speeds of the form 4n+2, and as of June 2018 this has not been done in practice.

:c/12 spaceship A spaceship travelling at one twelfth of the speed of light. The only diagonal spaceships that are currently known to move at this speed are the Corderships. An orthogonal Caterloopillar has been configured to move at c/12.

:c/2 spaceship A spaceship travelling at half the speed of light. Such spaceships necessarily move orthogonally. The first to be discovered was the LWSS. For other examples see Coe ship, ecologist, flotilla, hammerhead, hivenudger, HWSS, MWSS, puffer train, puff suppressor, pushalong, Schick engine, sidecar, still life tagalong and x66.

:c/3 spaceship A spaceship travelling at one third of the speed of light. All known c/3 spaceships travel orthogonally. The first was 25P3H1V0.1, found in August 1989 by Dean Hickerson. For further examples see brain, dart, edge-repair spaceship, fly, turtle and wasp.

:c/4 spaceship A spaceship travelling at one quarter of the speed of light. The first such spaceship to be discovered was, of course, the glider, and this remained the only known example until December 1989, when Dean Hickerson found the first orthogonal example, 119P4H1V0, and also a new diagonal example (the big glider). For other examples see B29, Canada goose, crane, Enterprise, edge-repair spaceship (third pattern), non-monotonic, Orion, quarter, sparky, swan and tagalong. It is known that c/4 is the fastest possible speed for a (45-degree) diagonal spaceship.

:c/5 spaceship A spaceship travelling at one fifth of the speed of light. The first such spaceship to be discovered was the snail, found by Tim Coe in January 1996. The first diagonally moving example, 295P5H1V1, was found by Jason Summers in November 2000. For other c/5 ships see 58P5H1V1, 67P5H1V1, 86P5H1V1 and spider. A Caterloopillar has also been configured to move at c/5.

:c/6 spaceship A spaceship travelling at one sixth of the speed of light. The first such spaceship to be discovered was the dragon, found by Paul Tooke in April 2000. The first diagonally moving example was the seal, found by Nicolay Beluchenko in September 2005. Another orthogonal c/6 spaceship, found by Paul Tooke in March 2006, is shown below. For the smallest known c/6 spaceship see 56P6H1V0.

..O..............O..................................O.....
O..O..OOO.......O.OOOO...............OO...........OO.O....
O..O............OOO.O.O.........O.....O.......O...O.......
.O.O..O.....................OOO..O.O.OOO.....O.O.O....O...
..OO......O....O................OOOOOO..O..O...O...O..O...
.O.O...OO.....O...OO......OO.OO..O..OO..O.O.OO..O.........
..O.....O.OO..O...OO......OO....O.O.O..O..O.O.O......OO..O
..O....OOO..O.........OOO.......OOO.O.OO.....O.......OOO.O
............OOOOOOOOO...O........OO.OOO...OOOO.........O.O
..........................................................
............OOOOOOOOO...O........OO.OOO...OOOO.........O.O
..O....OOO..O.........OOO.......OOO.O.OO.....O.......OOO.O
..O.....O.OO..O...OO......OO....O.O.O..O..O.O.O......OO..O
.O.O...OO.....O...OO......OO.OO..O..OO..O.O.OO..O.........
..OO......O....O................OOOOOO..O..O...O...O..O...
.O.O..O.....................OOO..O.O.OOO.....O.O.O....O...
O..O............OOO.O.O.........O.....O.......O...O.......
O..O..OOO.......O.OOOO...............OO...........OO.O....
..O..............O..................................O.....
A Caterloopillar can theoretically be configured to move at c/6, but there are technical difficulties with speeds of the form 4n+2, and as of July 2018 this has not been done in practice.

:c/7 spaceship A spaceship travelling at one seventh of the speed of light. The first such spaceship to be discovered was the diagonally travelling lobster, found by Matthias Merzenich in August 2011. The first known orthogonal c/7 spaceship was the loafer, discovered by Josh Ball in February 2013. A Caterloopillar has been configured to move at c/7.

:CA = cellular automaton

:caber tosser Any pattern whose population is asymptotic to c.log(t) for some constant c, and which contains a glider (or other spaceship) bouncing between a slower receding spaceship and a fixed reflector which emits a spaceship (in addition to the reflected one) whenever the bouncing spaceship hits it.

As the receding spaceship gets further away the bouncing spaceship takes longer to complete each cycle, and so the extra spaceships emitted by the reflector are produced at increasingly large intervals. More precisely, if v is the speed of the bouncing spaceship and u the speed of the receding spaceship, then each interval is (v+u)/(v-u) times as long as the previous one. The population at time t is therefore n.log(t)/log((v+u)/(v-u)) + O(1), where n is the population of one of the extra spaceships (assumed constant).

The first caber tosser was built by Dean Hickerson in May 1991.

:Callahan G-to-H A stable glider reflector and glider-to-Herschel converter discovered by Paul Callahan in November 1998. Its recovery time is 575 ticks. The initial stage converts two gliders into a Herschel. A ghost Herschel in the pattern below marks the output location:

....O.........O...................
....OOO.....OOO...................
.O.....O...O......................
..O...OO...OO.....................
OOO...............................
.........O........................
........O.O.......................
........O.O.......................
.........O........................
...............................O..
...............................O..
....................OO.........OOO
..............OO....OO...........O
........OO...OO...................
.......O..O....O..................
..OO....OO........................
.O.O..............................
.O................................
OO................................
..........OO......................
..........O.......................
...........OOO....................
.............O....................

The glider from the southeast can be supplied by an Fx77 + L112 + Fx77 Herschel track, or by reflecting the output Herschel's FNG as in the p8 G-to-H. See also Silver reflector, Silver G-to-H.

:Cambridge pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases. The Life pulsar was indeed discovered at Cambridge, like the first real pulsar a few years earlier.)

:Canada goose (c/4 diagonally, p4) Found by Jason Summers, January 1999. It consists of a glider plus a tagalong.

OOO..........
O.........OO.
.O......OOO.O
...OO..OO....
....O........
........O....
....OO...O...
...O.O.OO....
...O.O..O.OO.
..O....OO....
..OO.........
..OO.........
At the time of its discovery the Canada goose was the smallest known diagonal spaceship other than the glider, but this record has since been beaten, first by the second spaceship shown under Orion, and more recently by quarter.

:candelabra (p3) By Charles Trawick. See also the note under cap.

....OO....OO....
.O..O......O..O.
O.O.O......O.O.O
.O..O.OOOO.O..O.
....O.O..O.O....
.....O....O.....

:candlefrobra (p3) Found by Robert Wainwright in November 1984.

.....O....
.O.OO.O.OO
O.O...O.OO
.O....O...
.....OO...
The following diagram shows that a pair of these can act in some ways like killer toads. See also snacker.
....O...........O....
OO.O.OO.O...O.OO.O.OO
OO.O...O.O.O.O...O.OO
...O....O...O....O...
...OO...........OO...
.....................
.....................
.........OOO.........
.........O..O........
.........O...........
.........O...O.......
.........O...O.......
.........O...........
..........O.O........

:canoe (p1)

...OO
....O
...O.
O.O..
OO...

:cap The following induction coil. It can also easily be stabilized to form a p3 oscillator. See candelabra for a slight variation on this.

.OO.
O..O
OOOO

:carnival shuttle (p12) Found by Robert Wainwright in September 1984 (using MW emulators at the end, instead of the monograms shown here).

.................................O...O
OO...OO..........................OOOOO
.O.O.O...O..O......OO...O..O.......O..
.OO.OO..OO...OO....OO..OO...OO....O.O.
.O.O.O...O..O......OO...O..O.......O..
OO...OO..........................OOOOO
.................................O...O

:carrier = aircraft carrier

:casing That part of the stator of an oscillator which is not adjacent to the rotor. Compare bushing.

:catacryst A 58-cell quadratic growth pattern found by Nick Gotts in April 2000. This was formerly the smallest such pattern known, but has since been superseded by the related metacatacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

The catacryst consists of three arks plus a glider-producing switch engine. It produces a block-laying switch engine every 47616 generations. Each block-laying switch engine has only a finite life, but the length of this life increases linearly with each new switch engine, so that the pattern overall grows quadratically, as an unusual type of MMS breeder.

:Catagolue An online database of objects in Conway's Game of Life and similar cellular automata, set up by Adam P. Goucher in 2015 at http://catagolue.appspot.com. It gathers data from a distributed search of random initial configurations and records the eventual decay products. Within a year of operation it had completed a census of the ash objects from over two trillion asymmetric 16x16 soups. As of June 2018, well over two hundred trillion ash objects have been counted, from over a trillion asymmetric soups.

It is often possible to use Catagolue search results find equivalent glider synthesis recipes for selected parts of long-running active reactions. These random soup searches have made it possible to find efficient construction methods for thousands of increasingly rare still lifes and oscillators, and the occasional puffer or spaceship. In many of these cases a glider synthesis was previously very difficult or unknown.

:catalyst An object that participates in a reaction but emerges from it unharmed. All eaters are catalysts. Some small still lifes can act as catalysts in some situations, such as the block, ship, and tub. The still lifes and oscillators that form a conduit are examples of catalysts.

A relatively rare form of catalysis occurs in a transparent debris effect, where the catalyst in question is completely destroyed and then rebuilt. The term is also sometimes used for a modification of an active reaction in a rake by passing spaceships.

:catch and throw A technology used (e.g., in the Caterpillar) to adjust the timing of a glider by turning it into a stationary object using one interaction, and then later restoring it using a second interaction. The interactions are caused by passing objects which are not otherwise affected. The direction of the glider is not usually changed.

Here is an example where a glider is turned into a boat by the first LWSS, and is then restored by the remaining spaceships:

..................................OO.............OO.......OOOO.
................................O....O..........OO.OOOO...O...O
...............................O.................OOOOOO...O....
...............................O.....O............OOOO.....O..O
.O.............................OOOOOO..........................
..O............................................................
OOO............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...OOOO........................................................
...O...O.......................................................
...O...........................OO..............................
....O..O......................OO.OOO...........................
...............................OOOOO...........................
................................OOO............................

:caterer (p3) Found by Dean Hickerson, August 1989. Compare with jam. In terms of its minimum population of 12 this is the smallest p3 oscillator. See also double caterer and triple caterer.

..O.....
O...OOOO
O...O...
O.......
...O....
.OO.....
More generally, any oscillator which serves up a bit in the same manner may be referred to as a caterer.

:Caterloopillar A family of adjustable-speed spaceships constructed by Michael Simkin in 2016, based on an "engineless caterpillar" idea originally proposed by David Bell. The front and back halves of Caterloopillars each function as universal constructors, with each half constructing the building blocks of the other half, while also reading and moving a construction tape. The overall design is reminiscent of M.C. Escher's lithograph "Drawing Hands". The name "Caterloopillar" is a reference to Douglas Hofstader's Strange Loop concept.

Simkin has written an automated script that can construct a Caterloopillar for any rational speed strictly less than c/4, with some exceptions. Speeds closer to the c/4 limit in general require larger constructions, and for any given computer system it is easy to choose a speed that makes it impractical to construct a Caterloopillar.

As of June 2018 one significant remaining exception is that Caterloopillars with periods c/(6+4N) can't be constructed. This is only a limitation of the current construction script, not of the underlying Caterloopillar toolkit. For technical reasons, the lowest speed that the current script can produce is around c/95. The slowest Caterloopillars that have been explicitly constructed to date are c/87 and c/92. These are among the smallest in terms of population, though their bounding boxes are larger than some of the higher-speed Caterloopillars.

:Caterpillar A spaceship that works by laying tracks at its front end. The first example constructed was a p270 17c/45 spaceship built by Gabriel Nivasch in December 2004, based on work by himself, Jason Summers and David Bell. This Caterpillar has a population of about 12 million in each generation and was put together by a computer program that Nivasch wrote. At the time it was by far the largest and most complex Life object ever constructed, and it is still one of the largest in terms of population.

The 17c/45 Caterpillar is based on the following reaction between a pi-heptomino and a blinker:

...............O
O.............OO
O............OO.
O.............OO
...............O
In this reaction, the pi moves forward 17 cells in the course of 45 generations, while the blinker moves back 6 cells and is rephased. This reaction has been known for many years, but it was only in September 2002 that David Bell suggested that it could be used to build a 17c/45 spaceship, based on a reaction he had found in which pi-heptominoes crawling along two rows of blinkers interact to emit a glider every 45 generations. Similar glider-emitting interactions were later found by Gabriel Nivasch and Jason Summers. The basic idea of the spaceship design is that streams of gliders created in this way can be used to construct fleets of standard spaceships which convey gliders to the front of the blinker tracks, where they can be used to build more blinkers.

A different Caterpillar may be possible based on the following reaction, in which the pattern at top left reappears after 31 generations displaced by (13,1), having produced a new NW-travelling glider. In this case the tracks would be waves of backward-moving gliders.

.OO.....................
...O....................
...O.OO.................
OOO....O................
.......O................
.....OOO................
........................
........................
........................
........................
........................
........................
.....................OOO
.....................O..
......................O.
For other Caterpillar-type constructions see Centipede, waterbear, half-baked knightship, and Caterloopillar.

:CatForce An optimized search program written by Michael Simkin in 2015, using brute-force enumeration of small Spartan objects in a limited area, instead of a depth-first tree search. One major purpose of CatForce is to find glider-constructible completions for signal conduits. An early CatForce discovery was the B60 conduit, which enabled a record-breaking new glider gun.

:Catherine wheel = pinwheel

:cauldron (p8) Found in 1971 independently by Don Woods and Robert Wainwright. Compare with Hertz oscillator.

.....O.....
....O.O....
.....O.....
...........
...OOOOO...
O.O.....O.O
OO.O...O.OO
...O...O...
...O...O...
....OOO....
...........
....OO.O...
....O.OO...

:cavity = eater plug

:CC semi-cenark The colour-changing version of Tanner Jacobi's century-based semi-Snark mechanism, using a C-to-G consisting of a BTS catalyst and a block. See CP semi-cenark for the colour-preserving version, or semi-cenark for repeat time details and an alternate initial catalyst.

.O............OO..........
..O..........O.O..........
OOO.....OO..O.............
........O..O.OO...........
.....O....OO.O.O..........
...O.O........O...........
....OO..............OO....
....................O.....
.......OO.........O.O.....
.......OO.........OO......
..........................
..........................
..........................
....OO....OO..............
...O.O...O.O..............
...O......O...............
..OO......................
..........................
.....................OO...
...................O..O...
...................OOO....
..........................
..............OO...OO.O.OO
..............OO....O.OO.O
....................O.....
...................OO.....

:CC semi-Snark A small 90-degree colour-changing glider reflector requiring two input gliders on the same lane for each output glider. It was discovered by Sergei Petrov on 1 July 2013, using a custom-written search utility. It functions as a very compact period doubler in some signal circuitry, for example the linear propagator. The semi-Snark can period-double a regular glider stream of period 51 or more, or an intermittent stream with two gliders every 67 ticks or more, since the block reset glider can be sent just 16 ticks before its partner.

......O..........OO
.......OO........O.
......OO.......O.O.
...............OO..
..........O........
OO.........OO......
OO........OO.......
...................
...................
.................OO
..........OO.....OO
..........OO.......
...................
.....O.............
....O.O............
....OO......OO.....
............O......
.............OOO...
...............O...

:cell The fundamental unit of space in the Life universe. The term is often used to mean a live cell - the sense is usually clear from the context.

:cellular automaton A certain class of mathematical objects of which Life is an example. A cellular automaton consists of a number of things. First there is a positive integer n which is the dimension of the cellular automaton. Then there is a finite set of states S, with at least two members. A state for the whole cellular automaton is obtained by assigning an element of S to each point of the n-dimensional lattice Zn (where Z is the set of all integers). The points of Zn are usually called cells. The cellular automaton also has the concept of a neighbourhood. The neighbourhood N of the origin is some finite (nonempty) subset of Zn. The neighbourhood of any other cell is obtained in the obvious way by translating that of the origin. Finally there is a transition rule, which is a function from SN to S (that is to say, for each possible state of the neighbourhood the transition rule specifies some cell state). The state of the cellular automaton evolves in discrete time, with the state of each cell at time t+1 being determined by the state of its neighbourhood at time t, in accordance with the transition rule.

There are some variations on the above definition. It is common to require that there be a quiescent state, that is, a state such that if the whole universe is in that state at generation 0 then it will remain so in generation 1. (In Life the OFF state is quiescent, but the ON state is not.) Other variations allow spaces other than Zn, neighbourhoods that vary over space and/or time, probabilistic or other non-deterministic transition rules, etc.

It is common for the neighbourhood of a cell to be the 3x...x3 (hyper)cube centred on that cell. (This includes those cases where the neighbourhood might more naturally be thought of as a proper subset of this cube.) This is known as the Moore neighbourhood.

:census A count of the number of different individual Life objects within one larger object, most often the final ash of a random soup experiment. This includes the number of blocks, blinkers, gliders, and other common objects, as well as any rarer larger still lifes, oscillators or spaceships.

:centinal (p100) Found by Bill Gosper. This combines the mechanisms of the p46 and p54 shuttles (see twin bees shuttle and p54 shuttle).

OO................................................OO
.O................................................O.
.O.O.....................OO.....................O.O.
..OO........O............OO............OO.......OO..
...........OO..........................O.O..........
..........OO.............................O..........
...........OO..OO......................OOO..........
....................................................
....................................................
....................................................
...........OO..OO......................OOO..........
..........OO.............................O..........
...........OO..........................O.O..........
..OO........O............OO............OO.......OO..
.O.O.....................OO.....................O.O.
.O................................................O.
OO................................................OO

:Centipede (31c/240 orthogonally, p240) The smallest known 31c/240 spaceship, constructed by Chris Cain in September 2014 as a refinement of the shield bug.

:century (stabilizes at time 103) This is a common pattern which evolves into three blocks and a blinker. In June 1996 Dave Buckingham built a neat p246 gun using a century as the engine. See also bookend and diuresis.

..OO
OOO.
.O..

:century eater A 20-cell still life that functions as an eater for the active reaction produced by any century relative. The most well-known use is to replace a four-object constellation in Paul Callahan's bistable switch, as shown below. In September 2014 Josh Ball showed that a variant of this still life has a relatively inexpensive slow glider construction recipe.

............O.OO..............
............OO.O..............
..............................
..........OOOOO...............
.........O..O..O..............
.........OO...O.O.............
...............OO.............
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
............................OO
............................OO
..............................
O.............................
.OO...........................
OO............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
....OO........................
...O.O........................
...O..........................
..OO........OO................
............OO................
At T=256 the active reaction produces an eight-cell pattern sharing the same grandchild as a century. The century eater at the top of the pattern catalyzes this pattern produce a clean spark.

:century-to-glider converter Any signal circuit that accepts a century as input and produces a clean output glider. For example, in November 2017 Adam P. Goucher noticed that this previously known C-to-G converter can replace the century eater in Paul Callahan's bistable switch, producing an extra glider output.

......................OO.......
.......................O.......
.......................O.O.....
........................O.O....
.........................O...OO
.............................OO
...............................
...............................
...............................
...............................
OO.............................
OO.............................
...............................
...............................
.....................O.........
....................OOO........
......................OO.......

:channel A lane or signal path used in construction circuitry. Until the invention of single-channel construction arms, signals in a channel would usually be synchronized with one or more coordinated signals on other paths, as in the Gemini, which used twelve channels to run three construction arms simultaneously, or the 10hd Demonoid which needed only two channels. See also Geminoid.

:chaotic growth An object whose fate is unknown, except that it appears to grow forever in an unpredictable manner. In Life, no pattern has yet been found that is chaotic. This is in contrast to many other Life-like rules, where even small objects can appear to grow chaotically.

It is possible that chaotic growth may occur rarely or even regularly for large enough random Life objects, but if so the minimum size of such patterns must be larger than what can currently be experimentally simulated (but see novelty generator).

In any case, it is not decidable whether a pattern that apparently grows randomly forever is in fact displaying chaotic growth. Continuing to evolve such a pattern might at any time result in it suddenly cleaning itself up and becoming predictable.

:chemist (p5)

.......O.......
.......OOO.....
..........O....
.....OOO..O..OO
....O.O.O.O.O.O
....O...O.O.O..
.OO.O.....O.OO.
..O.O.O...O....
O.O.O.O.O.O....
OO..O..OOO.....
....O..........
.....OOO.......
.......O.......

:C-heptomino Name given by Conway to the following heptomino, a less common variant of the B-heptomino.

.OOO
OOO.
.O..

:Cheshire cat A block predecessor by C. R. Tompkins that unaccountably appeared both in Scientific American and in Winning Ways. See also grin.

.O..O.
.OOOO.
O....O
O.OO.O
O....O
.OOOO.

:chicken wire A type of stable agar of density 1/2. The simplest version is formed from the tile:

OO..
..OO
But the "wires" can have length greater than two and need not all be the same. For example:
OO...OOOO.....
..OOO....OOOOO

:chirality A term borrowed from chemistry to describe asymmetrical patterns with two distinct mirror-image orientations. One common use is in relation to Herschel transmitters, where the spacing between the two gliders in the tandem glider output can limit the receiver to a single chirality.

:cigar = mango

:circuit Any combination of conduits or converters that moves or processes an active signal. This includes components with multiple states such as period multipliers or switches, which can be used to build guns, logic gates, universal constructors, and other computation or construction circuitry.

:cis-beacon on anvil (p2)

...OO..
....O..
.O.....
.OO....
.......
.OOOO..
O....O.
.OOO.O.
...O.OO

:cis-beacon on table (p2)

..OO
...O
O...
OO..
....
OOOO
O..O

:cis-boat with tail (p1)

.O...
O.O..
OO.O.
...O.
...OO

:cis fuse with two tails (p1) See also pulsar quadrant.

...O..
.OOO..
O...OO
.O..O.
..O.O.
...O..

:cis-mirrored R-bee (p1)

.OO.OO.
O.O.O.O
O.O.O.O
.O...O.

:cis snake = canoe

:clean Opposite of dirty. A reaction which produces a small number of different products which are desired or which are easily deleted is said to be clean. For example, a puffer which produces just one object per period is clean. Clean reactions are useful because they can be used as building blocks in larger constructions.

When a fuse is said to be clean, or to burn cleanly, this usually means that no debris at all is left behind.

:clearance In signal circuitry, the distance from an edge shooter output lane to the last unobstructed lane adjacent to the edge-shooter circuitry. For example, an Fx119 inserter has an unusually high 27hd clearance.

Also, oscillator and eater variants may be said to have better clearance if they allow gliders or other signals to pass closer to them than the standard variant allows. The following high-clearance eater1 variant by Karel Suhajda allows gliders to pass one lane closer on the southeast side, than is allowed by the standard fishhook shape.

.O......OO
..O..OO..O
OOO...O.O.
......O.OO
...OO.O...
...O..O...
....OO....
This is considered to be a variant of the eater1 because the reaction's rotor is exactly the same, even though three cells in this variant are too overpopulated to allow a birth, instead of underpopulated as in a standard eater1 glider-eating reaction.

:clock (p2) Found by Simon Norton, May 1970. This is the fifth or sixth most common oscillator, being about as frequent as the pentadecathlon, but much less frequent than the blinker, toad, beacon or pulsar. It is surprisingly rare considering its small size.

..O.
O.O.
.O.O
.O..

The protruding cells at the edges can perturb some reactions by inhibiting the birth of a cell in a 3-cell corner. For example, a clock can be used to suppress the surplus blinker produced by an F171 conduit, significantly improving the recovery time of the circuit:

.........O........O................................
.........OOO......OOO..............................
............O........O.............................
...........OO.......OO.............................
...................................................
.................................................O.
................................................O.O
................................................O.O
.................................................O.
......................................O............
............OO........................O............
.............O........................OOO..........
.............O.O........................O..........
..............OO...................................
...................................................
...................................................
........O..............................OO..........
........OOO........................O...OO..........
...........O......................O.O..............
..........OO.....................O.O...............
.................................O.................
................................OO.................
...................................................
...................................................
...................................................
...................................................
.........O.........................................
.........O.O.......................................
.........OOO.......................................
...........O.......................................
...................................................
..................OO...O...........................
...................O....OO.........................
................OOO...OO...........................
..OO............O.......O..........................
...O...............................................
OOO................................................
O..................................................

:clock II (p4) Compare with pinwheel.

......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O..O.O.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:clock inserter = clock insertion.

:clock insertion A uniquely effective method of adding a glider to the front edge of a salvo, by first constructing a clock, then converting it to a glider using a one-bit spark. Here it rebuilds a sabotaged glider in a deep pocket between other gliders:

..................................................O........
..................................................O.O......
..................................................OO.......
...............................................O......O....
..............................................O......O.....
..............................................OOO....OOO...
...........................................................
...........................................O......O........
...........................................O.O....O.O.....O
...........................................OO.....OO....OO.
........................................O.......O........OO
.......................................O...................
.......................................OOO...........O.O...
.....................................................OO....
......................................................O....
O..................................................O.......
.OO..............................................OO........
OO................................................OO.......
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
.............................O.............................
....................O......O.O.............................
..................O.O.......OO.............................
...................OO......................................
.........................O.................................
..........................O....OOO.........................
........................OOO....O...........................
................................O..........................
.....................................OO....................
............................OO.......O.O...................
............................O.O......O.....................
............................O..............................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
.............................................OO............
.............................................O.O...........
.............................................O.............

In 2015 Chris Cain used this reaction to demonstrate conclusively that any unidirectional glider salvo, no matter how large or tightly packed, can be constructed by collisions between gliders that are initially separated by any finite distance. As a corollary, because all glider syntheses are made up of two to four unidirectional salvos, any glider-constructible object has a synthesis that starts with every glider at least N cells away from every other glider (for any chosen N).

:cloud of smoke = smoke

:cloverleaf This name was given by Robert Wainwright to his p2 oscillator washing machine. But Achim Flammenkamp also gave this name to Achim's p4.

:cluster Any pattern in which each live cell is connected to every other live cell by a path that does not pass through two consecutive dead cells. This sense is due to Nick Gotts, but the term has also been used in other senses, often imprecise.

:CNWH Conweh, creator of the Life universe.

:Coe ship (c/2 orthogonally, p16) A puffer engine discovered by Tim Coe in October 1995.

....OOOOOO
..OO.....O
OO.O.....O
....O...O.
......O...
......OO..
.....OOOO.
.....OO.OO
.......OO.

In December 2015, the Coe ship was discovered in an asymmetric random soup on Catagolue. This was the first time any non-p4 ship was discovered in a random asymmetric soup experiment, winning Adam P. Goucher a 50-euro prize offered by Ivan Fomichev.

:Coe's p8 (p8) Found by Tim Coe in August 1997.

OO..........
OO..OO......
.....OO.....
....O..O....
.......O..OO
.....O.O..OO

:Collatz 5N+1 simulator An unknown fate pattern constructed by David Bell in December 2017 that simulates the Collatz 5N+1 algorithm using sliding block memory and p1 technology, while always having a population below 32000.

The algorithm is simple. Starting with a number, if it is even divide it by 2, otherwise multiply it by 5 and add 1. When this process is iterated a sequence of numbers is generated. When starting with the value of 7, it is currently unknown whether or not the sequence ever forms a cycle.

Because of this the fate of the simulator is also currently unknown. It may become stable, or become an oscillator with a high period, or have a bounding box which grows irregularly.

:colour = colour of a glider

:colour-changing See colour of a glider. The reflector shown in p8 bouncer is colour-changing, as are its 5/6/7/8 and higher-period versions.

:colour-changing semi-Snark = CC semi-Snark.

:colourised Life A cellular automaton that is the same as Life except for the use of a number of different ON states ("colours"). All ON states behave the same for the purpose of applying the Life rule, but additional rules are used to specify the colour of the resulting ON cells. Examples are Immigration and QuadLife.

:colour of a glider The colour of a glider is a property of the glider that remains constant while the glider is moving along a straight path, but that can be changed when the glider bounces off a reflector. It is an important consideration when building something using reflectors.

The colour of a glider can be defined as follows. First choose some cell to be the origin. This cell is then considered to be white, and all other cells to be black or white in a checkerboard pattern. (So the cell with coordinates (m,n) is white if m+n is even, and black otherwise.) Then the colour of a glider is the colour of its leading cell when it is in a phase that can be rotated to look like this:

OOO
..O
.O.

A reflector that does not change the colour of gliders obviously cannot be used to move a glider onto a path of different colour than it started on. But a 90-degree reflector that does change the colour of gliders is similarly limited, as the colour of the resulting glider will depend only on the direction of the glider, no matter how many reflectors are used. For maximum flexibility, therefore, both types of reflector are required.

Small periodic colour-changing glider reflectors (bouncers) are known, and also small periodic colour-preserving glider reflectors (bumpers). Among stable patterns, only a small colour-preserving reflector (Snark) is known. The smallest known 90-degree colour-changing reflector is given at the end of the reflector entry.

:colour-preserving See colour of a glider. Snarks and bumpers are colour-preserving reflectors.

:colour-preserving semi-Snark = CP semi-Snark

:complementary blinker = fore and back

:component A partial glider synthesis that can be used in the same way in multiple glider recipes. A component transforms part of an object under construction in a well-defined way, without affecting the rest of the object. For example, this well-known component can be used to add a hook to any object that includes a protruding table end, converting it to a long bookend:

.......O...................O...................O
.....OO..................OO..................OO.
......OO..................OO..................OO
................................................
..O...................O...................O.....
O.O.................O.O.................O.O.....
.OO..O...............OO..O...............OO..O..
.....O.O.................O.O.................O.O
.....OO..................OO..................OO.
................................................
................................................
....................O...........................
...O..O............O.O.O..O............OO..O..O.
...OOOO.............OO.OOOO............O...OOOO.
......................O.................OOO.....
.....OO...............O.O.................O.O...
.....OO................O.O.................OO...
........................O.......................

"Component" is also used to specify any piece of an object - spaceship, oscillator, etc. - that can be combined with other components in specific ways according to a grammar to produce a variety of objects. The components can either be independent objects that only occasionally react with each other, or else they can be fused together to support each other. For example, any branching spaceship is made up of several components, and there is a single repeating component in any wicktrailer.

:composite See composite conduit.

:composite conduit A signal-processing conduit that can be subdivided into two or more elementary conduits.

:compression = repeat time, recovery time.

:computational universality See universal computer.

:conduit Any arrangement of still lifes and/or oscillators that moves an active object to another location, perhaps also transforming it into a different active object at the same time, but without leaving any permanent debris (except perhaps gliders, or other spaceships) and without any of the still lifes or oscillators being permanently damaged. Probably the most important conduit is the following remarkable one (Dave Buckingham, July 1996) in which a B-heptomino is transformed into a Herschel in 59 generations.

.........OO.O
O.OO......OOO
OO.O.......O.
.............
.........OO..
.........OO..
Several hundred elementary conduits are now known, with recent discoveries primarily made via search programs such as CatForce and Bellman.

:conduit 1 = BFx59H.

:confused eaters (p4) Found by Dave Buckingham before 1973.

O..........
OOO........
...O.......
..O........
..O..O.....
.....O.....
...O.O.....
...OO..OO..
.......O.O.
.........O.
.........OO

:constellation A general term for a group of two or more separate objects, usually small still lifes and low-period oscillators. Compare pseudo still life.

:construction arm An adjustable mechanism in a universal constructor that allows new objects to be constructed in any chosen location that the arm can reach. A construction arm generally consists of a shoulder containing fixed guns or edge shooters, a movable construction elbow that slides forward and backward along the construction lane(s), and in the case of single-arm universal constructors, a hand target object at the construction site that can be progressively modified by a slow salvo to produce each desired object.

:construction elbow One of the components of a construction arm in a universal constructor. The elbow usually consists of a single Spartan still life or small constellation. It accepts elbow operation recipes, in the form of salvos coming from the construction arm's shoulder.

These recipes may do one of several things: 1) pull the elbow closer to the shoulder, 2) push the elbow farther from the shoulder, 3) emit a glider on a particular output lane (while also optionally pushing or pulling the elbow); 4) create a "hand" target block or other useful object as a target for output gliders, to one side of the construction lane; 5) duplicate the elbow, or 6) destroy the elbow.

Elbows that receive and emit orthogonally-travelling spaceships instead of gliders are technically possible, but no working examples are currently known. The discussion below assumes that gliders are used to communicate between the shoulder, elbow, and hand locations.

If a mechanism can be programmed to generate recipes for at least the first three options listed above, it is generally capable of functioning as a universal constructor. The main requirement is that push and pull elbow operations should be available that are either minimal (1fd) or the distances should be relatively prime.

Depending on the elbow operation library, there may be only one type of elbow, or there may be two or more elbow objects, with recipes that convert between them. The 9hd library had just one elbow type, a block. The original 10hd library had two elbows, blocks in mirror-symmetric locations; this was expanded to a larger list for the 10hd Demonoid. The 0hd Demonoid also has a multi-elbow recipe library. A slow elbow toolkit may make use of an even larger number of glider output recipes, because the target elbow object in that case is not restricted to a single diagonal line.

If only one colour, parity, or phase of glider can be emitted, then the mechanism will be limited to producing monochromatic salvos or monoparity salvos. These are less efficient at most construction tasks, but are still generally accepted to enable universal toolkits. See also half-baked knightship.

:construction envelope The region affected by an active reaction, such as a glider synthesis of an object. The envelope corresponds to the state-2 blue cells in LifeHistory. See also edgy.

:construction lane Part of a construction arm between the shoulder and the elbow - in particular, one of the fixed lanes that elbow operation signals travel on. All known universal constructors have used arms with two or more construction lanes, except for the ones in the 0hd Demonoid and in recent single-channel construction recipes.

:construction recipe One or more streams of gliders or other signals fed into a universal constructor to create a target object. Compare glider recipe.

:construction universality See universal constructor.

:converter A conduit in which the input object is not of the same type as the output object. This term tends to be preferred when either the input object or the output object is a spaceship.

The following diagram shows a p8 pi-heptomino-to-HWSS converter. This was originally found by Dave Buckingham in a larger form (using a figure-8 instead of the boat). The improvement shown here is by Bill Gosper (August 1996). Dieter Leithner has since found (much larger) oscillators of periods 44, 46 and 60 that can be used instead of the Kok's galaxy.

.O.O..O........
.OOO.O.OO......
O......O.....O.
.O.....OO...O.O
.............OO
OO.....O.......
.O......O......
OO.O.OOO.......
..O..O.O.......
............OOO
............O.O
............O.O

For another periodic converter, see the glider-to-LWSS example in queen bee shuttle pair. However, many converters are stable. Examples of elementary conduit converters include BFx59H, 135-degree MWSS-to-G, and 45-degree MWSS-to-G.

The earliest and simplest stable converters known are shown below. These are an HWSS-to-loaf, MWSS-to-beehive, and LWSS-to-blinker. These can serve as memory cells, or as the first steps in constructing objects using salvos.

.........................O..............................
..OO...................O...O.................O..O.......
O....O......................O....................O......
......O................O....O................O...O......
O.....O.................OOOOO.................OOOO......
.OOOOOO.................................................
.........OO....................OO...................OO..
.........O.O...................O....................O...
...........O....................OOO..................OOO
...........OO.....................O....................O

:convoy A collection of spaceships all moving in the same direction at the same speed. Convoys are usually not destroyed by the reactions that they cause. Compare salvo. For examples, see reanimation, fly-by deletion and glider turner.

:copperhead (c/10 orthogonally, p10) The following small c/10 spaceship, discovered by conwaylife.com forum user 'zdr' on 5 March 2016, using a simple depth-first search program. A glider synthesis was found on the same day.

.OOOO.
......
.O..O.
O.OO.O
O....O
......
O....O
OO..OO
OOOOOO
.O..O.
..OO..
..OO..
Later that same month Simon Ekström added a sparky tagalong for the copperhead to produce the fireship. This allowed for the construction of c/10 puffers and rakes.

:Corder- Prefix used for things involving switch engines, after Charles Corderman.

:Corder engine = switch engine

:Cordergun A gun firing Corderships. The first was built by Jason Summers in July 1999, using a glider synthesis by Stephen Silver.

:Cordership Any spaceship based on switch engines. These necessarily move at a speed of c/12 diagonally with a period of 96 or a multiple thereof. The first Cordership was constructed by Dean Hickerson in April 1991, using 13 switch engines. He soon reduced this to 10, and in August 1993 to 7. In July 1998 he reduced it to 6. In January 2004, Paul Tooke found the 3-engine glide symmetric Cordership shown below.

................................OO.O...........................
...............................OOO.O......O.O..................
..............................O....O.O....O....................
...............................OO......O.O...O.................
................................O...O..O..OO...................
...................................O.OO...O....................
..................................O.O................OO........
..................................O.O................OO........
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
.............................................................OO
....................................................OO.......OO
.......................................O.........O.OOOO........
..................................O...OOOOO.....OO.O...OO......
.................................O.O.......OO....O..OO.OO......
.................................O.......O.OO.....OOOOOO.......
..................................O........OO......O...........
...................................O...OOOO....................
........................................OOO....................
........................O.O.........OO.........................
........................O.O.O......O.O.........................
.......................O..OO.O....OO...........................
........................OO...O.O.OO.O..........................
........................OO...OO.OOOOO..........................
............................O.OO...OO..........................
...........................O.O.................................
..OO.O.........................................................
.OOO.O......O.O................................................
O....O.O....O..................................................
.OO......O.O...O...............................................
..O...O..O..OO...........O.....................................
.....O.OO...O...........OOO....................................
....O.O.................O..O...................................
....O.O................O....O..................................
........................O......................................
...............................................................
........................O..O...................................
.........................O.O...................................
...............................................................
.....................O.........................................
....................OOO........................................
...................OO.OO.......................................
.........O........OO.O.....O...................................
....O...OOOOO....OO......OO....................................
...O.O.......OO..OO.......OO...................................
...O.......O.OO................................................
....O........OO................................................
.....O...OOOO..................................................
..........OOO..................................................
...............................................................
...............................................................
...............................................................
...........OO..................................................
...........OO..................................................

At the end of 2017, Aidan F. Pierce discovered a clean 2-engine Cordership. There is also an adjustable-length 4-engine Cordership found by Michael Simkin, made up of two identical or mirror-image 2-engine components. The leading pair of switch engines builds a block trail, which are then deleted by the trailing pair.

Corderships generate sparks which can perturb other objects in many ways, especially gliders which can reach them from the side or from behind. Some perturbations reflect gliders back the way they came, and can be used for constructions such as the caber tosser and the infinite glider hotel.

:cousins (p3) This contains two copies of the stillater rotor.

.....O.OO....
...OOO.O.O...
O.O......O...
OO.OO.OO.O.OO
...O.O....O.O
...O.O.OOO...
....OO.O.....

:cover The following induction coil. See scrubber for an example of its use.

....O
..OOO
.O...
.O...
OO...

:covered table = cap

:cow (c p8 fuse)

OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO...OO
....OO.O.................................................O.O
....OO...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
....OO.O..................................................O.
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:CP pulsar = pulsar

:CP semi-cenark A colour-preserving variant of Tanner Jacobi's century-based semi-Snark mechanism, the semi-cenark. See CC semi-cenark for the colour-changing version, or semi-cenark for repeat time details and an alternate initial catalyst.

.O............OO........
..O..........O.O........
OOO.....OO..O...........
........O..O.OO.........
.....O....OO.O.O........
...O.O........O.........
....OO..............OO..
....................O...
.......OO.........O.O...
.......OO.........OO....
........................
........................
........................
....OO....OO............
...O.O...O.O............
...O......O.............
..OO...............OO...
....................O...
....................O.OO
.................OO.OO.O
..................O.....
................O.O.....
................OO......

:CP semi-Snark A period-multiplying colour-preserving signal conduit found by Tanner Jacobi in October 2017, producing one output glider for every two input gliders. It is made by replacing one of the eaters in a Snark with a catalyst found using Bellman. The catalyst causes the formation of a tub which requires a second glider to delete. However, this adds 5 ticks to the repeat time, so that it becomes 48. This is still 3 ticks faster than the CC semi-Snark.

.O............................
..O.............OO............
OOO..............O............
...............O.....OO.......
...............OO.....O.......
......................O.OO....
...............OO..OO.O..O....
...............OO...O.OO......
....................O.........
...................OO.........
..............................
.........................OO...
.............O............O...
..............O...........O.OO
............OOO...OO....OOO..O
..................OO...O...OO.
.......................OOOO...
.........OO...............O...
........O.O............OOO....
........O.............O.......
.......OO..............OOOOO..
...........................O..
.........................O....
.........................OO...

:crab = quarter.

:crane (c/4 diagonally, p4) The following spaceship found by Nicolay Beluchenko in September 2005, a minor modification of a tubeater found earlier by Hartmut Holzwart. The wing is of the same form as in the swan and Canada goose.

.OO.................
OO..................
..O.................
....OO...O..........
....OO..O.O.........
.......OO.O.........
.......OO...........
.......OO...........
.................OO.
.........O....OO.O..
.........OOO..OO....
.........OOO..OO....
..........OO........
....................
............O.......
...........OO.......
...........O........
............O.......
....................
.............OO.....
..............O.OO..
..................O.
...............OO...
...............OO...
.................O..
..................OO

:cross (p3) Found by Robert Wainwright in October 1989. The members of this family are all polyominoes.

..OOOO..
..O..O..
OOO..OOO
O......O
O......O
OOO..OOO
..O..O..
..OOOO..
In February 1993, Hartmut Holzwart noticed that this is merely the smallest of an infinite family of p3 oscillators. The next smallest member is shown below.
..OOOO.OOOO..
..O..O.O..O..
OOO..OOO..OOO
O...........O
O...........O
OOO.......OOO
..O.......O..
OOO.......OOO
O...........O
O...........O
OOO..OOO..OOO
..O..O.O..O..
..OOOO.OOOO..

:crowd (p3) Found by Dave Buckingham in January 1973.

...........O..
.........OOO..
.....OO.O.....
.....O...O....
.......OO.O...
...OOOO...O...
O.O.....O.O.OO
OO.O.O.....O.O
...O...OOOO...
...O.OO.......
....O...O.....
.....O.OO.....
..OOO.........
..O...........

:crown The p12 part of the following p12 oscillator, where it is hassled by a caterer, a jam and a HW emulator. This oscillator was found by Noam Elkies in January 1995.

..........O...........
..........O......O....
...O....O...O...OO....
...OO....OOO..........
.........OOO..OOO..O.O
.O..OOO.........O.OOOO
O.O.O...............OO
O..O..................
.OO........OO.........
......OO.O....O.OO....
......O..........O....
.......OO......OO.....
....OOO..OOOOOO..OOO..
....O..O........O..O..
.....OO..........OO...

:crucible = cauldron

:crystal A regular growth that is sometimes formed when a stream of gliders, or other spaceships, is fired into some junk.

The most common example is initiated by the following collision of a glider with a block. With a glider stream of even period at least 82, this gives a crystal which forms a pair of beehives for every 11 gliders which hit it.

.O......
..O...OO
OOO...OO

:C-to-G = century-to-glider converter

:cuphook (p3) Found by Rich Schroeppel, October 1970. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and stillater.

....OO...
OO.O.O...
OO.O.....
...O.....
...O..O..
....OO.O.
.......O.
.......OO
The above is the original form, but it can be made more compact:
....OO.
...O.O.
...O...
OO.O...
OO.O..O
...O.OO
...O...
..OO...

:curl = loop


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_k.htm0000755000175000017500000002744313317135606016414 00000000000000 Life Lexicon (K)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Karel's p15 (p15) An oscillator discovered by Karel Suhajda on December 11, 2002. It consists of a period 15 rotor supported by the domino spark of a pentadecathlon. It provides accessible sparks that can be used to perturb reactions or thin signal streams.

..O....O..
..OOOOOO..
..O....O..
..........
..........
..........
..OOOOOO..
.O......O.
O........O
.O......O.
..OOOOOO..

:keeper A type of factory circuit that always results in the presence of an object in the output location, whether or not the object was previously present. In many cases it is easy to construct examples by connecting multiple circuits to shoot down an object with a glider, then rebuild the object again later. The smallest keeper circuits accomplish the same thing more directly with a lucky preliminary spark from the active reaction, which removes the existing object (if any) just before the construction occurs. Below is a useful block keeper with a Herschel input.

................O..............................
................OOO.....OO.....................
...................O....OO.....................
..................OO...........................
...............................................
...............................................
...............................................
...............................................
...............................................
................................OO.............
...............................O.O.............
................................O..............
...............................................
...............................................
.......OO......................................
........O......................................
........O.O....................................
.........OO....................................
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
.........O...................................OO
.........O.O.................................OO
.........OOO...................................
...........O...................................
...............................................
...............................................
..........................OO...................
..........................OO...................
..OO...........................................
...O...........................................
OOO.........OO.................................
O...........OO.................................

:keys See short keys, bent keys and odd keys.

:kickback = kickback reaction or 180-degree kickback.

:kickback reaction The following collision of two gliders whose product is a single glider travelling in the opposite direction to one of the original gliders. This is important in the proof of the existence of a universal constructor, and in Bill Gosper's total aperiodic, as well as a number of other constructions.

.....O..
......OO
.OO..OO.
O.O.....
..O.....
See also 180-degree kickback.

:kidney A Gosperism for century. See also diuresis.

:killer toads A pair of toads acting together so that they can eat things. Here, for example, are some killer toads eating an HWSS. Similarly they can eat a MWSS (but not a LWSS). For another example see twirling T-tetsons II. See also candlefrobra.

..OO.......OOO
O....O....OOO.
......O.......
O.....O.......
.OOOOOO.......
..........OOO.
...........OOO

:Klein bottle As an alternative to a torus, it's possible to make a finite Life universe in the form of a Klein bottle. The simplest way to do this is to use an m x n rectangle with the top edge joined to the bottom edge (as for a torus) and the left edge twisted and joined to the right.

:knightship Any spaceship of type (2m,m)/n - that is, a spaceship of any speed that moves obliquely in a (2,1) direction. The first Conway's Life knightship was a variant of Andrew Wade's Gemini spaceship, constructed in May 2010. The next was an even slower knightship based on the half-bakery reaction.

A knightship must be asymmetric and its period must be at least 6. This is barely within the range of current search programs, as proven by the discovery on March 6, 2018 of an elementary knightship, Sir Robin, by Adam P. Goucher and Tomas Rokicki.

By analogy with the corresponding fairy chess pieces, spaceships of types (3m,m)/n, (3m,2m)/n and (4m,m)/n would presumably be called camelships, zebraships and giraffeships, respectively. Such spaceships do exist (see universal constructor) but small elementary versions are even more difficult to search for. Any of these ship types could be constructed by trivially modifying a Gemini spaceship, or less trivially by reprogramming one of the more recent small Geminoid construction arms, but as of July 2018 a camelship Gemini is the only example that has been explicitly built.

Alternatively, the term "knightship" is regularly used to refer to any oblique spaceship, such as the original Gemini or the waterbear.

:Kok's galaxy (p8) An oscillator found by Jan Kok in 1971, currently serving as the icon for Golly. See converter for a use of this sparker.

OOOOOO.OO
OOOOOO.OO
.......OO
OO.....OO
OO.....OO
OO.....OO
OO.......
OO.OOOOOO
OO.OOOOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_m.htm0000755000175000017500000011721413317135606016412 00000000000000 Life Lexicon (M)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:macrocell A format used by Golly and its hashlife algorithm, capable of storing repetitive patterns very efficiently, even if they contain a large number of cells. For example, a filled square 2167 cells on a side can be stored in less than three kilobytes in macrocell format, or about 800 bytes in compressed macrocell format. The square's total population is over a googol, 10100; the number of atoms in the observable universe is only about 1080.

This high level of compression is obtained by defining a tree structure composed of increasingly large cell "tiles" with power-of-two dimensions. Tile definitions of any size are re-used whenever they appear multiple times in a large pattern (at the same power-of-two offset). For example, the following is a macrocell encoding of a complex pseudo still life arrangement of ships, with a total population over 2500 cells:

[M2] (golly 3.0)
#R B3/S23
.**.**$*.*.*.*$**...**$$**...**$*.*.*.*$.**.**$
4 0 1 1 1
5 2 0 2 2
6 3 3 0 3
7 4 4 4 4

The first line after the #R rule line defines a quadtree tile at the lowest level - a level-3 tile in this case, meaning a 23 square area. At this level the pattern is encoded in a modified ASCII format with dollar signs as line separators. The next line, #2, defines a level-4 quadtree tile, made from one empty level-3 tile in the northwest corner (0), and three copies of the level-3 tile that was defined on the previous line (1). Lines 3, 4, and 5 similarly define level 5, 6, and 7 quadtree tiles by giving the line numbers of four tiles of the next lower size.

Many patterns are only moderately repetitive, so macrocell format is somewhat less successful at compressing them. Certainly most patterns are not nearly as regular as the artificial example above: there are usually many different tiles defined at each level, not just one. Chaotic patterns, such as ash from random soups, usually need so many different tile definitions that they can be stored more efficiently using rle format.

:macro-spaceship A self-constructing or self-supporting spaceship, such as the Caterpillar, Centipede, half-baked knightship, waterbear, Demonoid, Orthogonoid, and Caterloopillar. Engineered spaceships of these types tend to be much larger and more complex than elementary spaceships.

:mango (p1) A relatively rare 180-degree rotationally symmetric 8-bit still life. The acorn produces a mango as part of its ash.

.OO..
O..O.
.O..O
..OO.

:mathematician (p5) Found by Dave Buckingham, 1972.

....O....
...O.O...
...O.O...
..OO.OO..
O.......O
OOO...OOO
.........
OOOOOOOOO
O.......O
...OOOO..
...O..OO.

:Max A name for the smallest known spacefiller. The name represents the fact that the growth rate is the fastest possible. (This has not quite been proved, however. There remains the possibility, albeit not very likely, that a periodic agar could have an average density greater than 1/2, and a spacefiller stretching such an agar at the same speed as the known spacefillers would have a faster average growth rate.)

:mazing (p4) In terms of its minimum population of 12 this ties with mold as the smallest p4 oscillator. Found by Dave Buckingham in December 1973. For some constructions using mazings, see popover and sixty-nine.

...OO..
.O.O...
O.....O
.O...OO
.......
...O.O.
....O..

:mc = macrocell

:medium fish = MWSS

:megacell = p1 megacell.

:memory cell A type of information storage circuit useful in many patterns that perform complex logical operations. Most commonly a memory cell can store a single bit of information. See for example demultiplexer, honey bit, and boat-bit. Depending on the application, the circuit may be a toggle circuit or a permanent switch, or it may be possible to send one or more signals to set the circuit to a "1" state, as can be done with a keeper mechanism. In that case a different input signal must be used to test the current state, usually with a destructive read reaction.

A more complicated example can be found in the Osqrtlogt pattern, which destructively reads a growing 2-dimensional array of minimal memory cells. Each memory cell may either contain a boat (below left) or empty space (below right), with no permanent circuitry anywhere near:

...............OO........................OO
...............OO........................OO
...........................................
...........O...............................
..........O.O..............................
...........OO..............................
...........................................
...........................................
......OO........................OO.........
.....O..O......................O..O........
......OO........................OO.........
...........................................
...........................................
.OO........................OO..............
O..O......................O..O.............
.OO......OOO...............OO......OOO.....
.........O.........................O.......
..........O.........................O......
The two beehives and the block are placed by slow salvos, after an initial 90-degree 2-glider collision that produces a target honey farm. The beehive constellation acts as a one-time turner for an incoming glider. If the boat is present, it acts as a second one-time turner for that glider, sending back a "1" signal. The "backstop" block in the northeast is destroyed cleanly in either the "0" or the "1" case.

:Merzenich's p11 (p11) Found by Matthias Merzenich in December 2010.

...........OO........
............O........
............O.O......
..........OO.O.O.....
.........O.O.O.O.....
........O.O..O..OO...
.......O.....O....O..
......O.......OOOO...
.....O............OOO
....O.....O.....OO..O
...O.O...O.O...O.O...
O..OO.....O.....O....
OOO............O.....
...OOOO.......O......
..O....O.....O.......
...OO..O..O.O........
.....O.O.O.O.........
.....O.O.OO..........
......O.O............
........O............
........OO...........

:Merzenich's p18 (p18) Found by Matthias Merzenich in June 2011.

...OO............
....O............
..O.O.OO.........
.O.O.O.O...OO....
.O.O........O....
OO.O........O.OO.
...O.OO....OO.O..
...O..........O..
OO.O.O.....OOO.OO
O..O.O.O..O..O.O.
..O..O.OOOO.O..O.
...OO.O....OO.O..
......O..O...O...
......O.O.OOO....
.......OO.O......

:metacatacryst A 52-cell pattern exhibiting quadratic growth. Found by Nick Gotts, December 2000. This was for some time the smallest known pattern (in terms of initial population) with superlinear growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:metacell CA logic circuitry that emulates the behavior of a single cell. The circuitry is hard-wired to emulate a particular CA rule, but changing the rule is usually a matter of making simple adjustments. Known examples include David Bell's original 500x500 unit Life cell, Jared Prince's Deep Cell, Brice Due's OTCA metapixel, and Adam P. Goucher's megacell.

:metamorphosis An oscillator built by Robert Wainwright that uses the following reaction (found by Bill Gosper) to turn gliders into LWSS, and converts these LWSS back into gliders by colliding them head on using an LWSS-LWSS bounce. There are two ways to do the following reaction, because the twin bees shuttle spark is symmetric.

...................O.........
....................O........
..................OOO........
.............................
.............................
.............................
.............................
.............................
............O...O.....O.OO...
OO.........O.....O....O.O.O..
OO.........O.........O....O..
...........OO...O.....O.O.O..
.............OOO......O.OO...
.............................
.............OOO.............
...........OO...O............
OO.........O...............OO
OO.........O.....O.........OO
............O...O............

:metamorphosis II An oscillator built by Robert Wainwright in December 1994 based on the following p30 glider-to-LWSS converter using a queen bee shuttle pair. This converter was first found by Paul Rendell, January 1986 or earlier, but wasn't widely known about until Paul Callahan rediscovered it in December 1994.

......................O.
.....................O..
.....................OOO
........................
........................
.........O.O............
.........O..O...........
OO..........OO..........
OO........O...OO........
.....OO.....OO..........
....O....O..O...........
.........O.O............
........................
........................
........................
........................
................O.......
...............OOO......
..............OOOOO.....
.............O.O.O.O....
.............OO...OO....
........................
........................
................O.......
...............O.O......
...............O.O......
................O.......
...............OO.......
...............OO.......
...............OO.......

:metapixel See metacell, OTCA metapixel.

:methuselah Any small pattern that stabilizes only after a long time. Term coined by Conway. Examples include rabbits, acorn, the R-pentomino, blom, Iwona, Justyna and Lidka. See also ark.

:Mickey Mouse (p1) The following still life, named by Mark Niemiec:

.OO....OO.
O..O..O..O
O..OOOO..O
.OO....OO.
...OOOO...
...O..O...
....OO....

:middleweight emulator = MW emulator

:middleweight spaceship = MWSS

:middleweight volcano = MW volcano

:mini pressure cooker (p3) Found by Robert Wainwright before June 1972. Compare pressure cooker.

.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:M.I.P. value The maximum population divided by the initial population for an unstable pattern. For example, the R-pentomino has an M.I.P. value of 63.8, since its maximum population is 319. The term is no longer in use.

:MIT oscillator = cuphook

:MMM breeder See breeder.

:MMS breeder See breeder.

:mod The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form, possibly subject to some rotation or reflection. The mod may be equal to the period, but it may also be a quarter of the period (for oscillators that rotate 90 degrees every quarter period) or half the period (for other oscillators which rotate 180 degrees every half period, and also for flippers).

:mold (p4) Found by Achim Flammenkamp in 1988, but not widely known until Dean Hickerson rediscovered it (and named it) in August 1989. Compare with jam. In terms of its minimum population of 12 it ties with mazing as the smallest p4 oscillator. But in terms of its 6x6 bounding box it wins outright. In fact, of all oscillators that fit in a 6x7 box it is the only one with period greater than 2.

...OO.
..O..O
O..O.O
....O.
O.OO..
.O....

:monochromatic salvo A slow salvo that uses gliders of only one colour. For example, the slow salvos generated by half-baked knightships are monochromatic, because they are generated by a single type of reaction which can happen at any position along a diagonal line. The smallest possible step size is one full diagonal (1fd), which is two half diagonals (2hd), which means that any single glider-producing reaction can only reach half of the available glider lanes. See colour of a glider.

:monogram (p4) Found by Dean Hickerson, August 1989.

OO...OO
.O.O.O.
.OO.OO.
.O.O.O.
OO...OO

:monoparity salvo A slow salvo that uses gliders of only one parity. Compare monochromatic salvo.

:Moore neighbourhood The set of all cells that are orthogonally or diagonally adjacent to a cell or group of cells. The Moore neighbourhood of a cell can be thought of as the points at a Chebyshev distance of 1 from that cell. Compare von Neumann neighbourhood. The Conway's Life rule is based on the Moore neighborhood, as are all the "Life-like" rules and many other commonly investigated rule families.

Cell neighbourhoods can also be defined with a higher range. The Moore neighbourhood of range n can be defined recursively as the Moore neighbourhood of the Moore neighbourhood of range n-1. For example, the Moore neighbourhood of range 2 includes all cells that are orthogonally or diagonally adjacent to the standard Moore neighbourhood.

:moose antlers (p1)

OO.....OO
O.......O
.OOO.OOO.
...O.O...
....O....

:mosquito See mosquito1, mosquito2. mosquito3, mosquito4 and mosquito5.

:mosquito1 A breeder constructed by Nick Gotts in September 1998. The original version had an initial population of 103, which was then the smallest for any known pattern with superlinear growth (beating the record previously held by Jaws). This was reduced to 97 by Stephen Silver the following month, but was then almost immediately superseded by mosquito2.

Mosquito1 consists of the classic puffer train plus four LWSS and four MWSS (mostly in predecessor form, to keep the population down). Once it gets going it produces a new block-laying switch engine (plus a lot of junk) every 280 generations. It is therefore an MMS breeder, albeit a messy one.

:mosquito2 A breeder constructed by Nick Gotts in October 1998. Its initial population of 85 was for a couple of hours the smallest for any known pattern with superlinear growth, but was then beaten by mosquito3.

Mosquito2 is very like mosquito1, but uses two fewer MWSS and one more LWSS.

:mosquito3 A breeder constructed by Nick Gotts in October 1998. Its initial population of 75 was at the time the smallest for any known pattern with superlinear growth, but was beaten a few days later by mosquito4.

Mosquito3 has one less LWSS than mosquito2. It is somewhat different from the earlier mosquitoes in that the switch engines it makes are glider-producing rather than block-laying.

:mosquito4 A slightly improved version of mosquito3 which Stephen Silver produced in October 1998 making use of another discovery of Nick Gotts (September 1997): an 8-cell pattern that evolves into a LWSS plus some junk. Mosquito4 is a breeder with an initial population of 73, at the time the smallest for any known pattern with superlinear growth, but superseded a few days later by mosquito5.

:mosquito5 A slightly improved version of mosquito4 which Nick Gotts produced in October 1998. The improvement is of a similar nature to the improvement of mosquito4 over mosquito3. Mosquito5 is a breeder with an initial population of 71. This was the smallest population for any known pattern with superlinear growth until it was superseded by teeth. See switch-engine ping-pong for the smallest such pattern as of July 2018, along with a list of the record-holders.

:mould = mold

:moving sawtooth A sawtooth such that no cell is ON for more than a finite number generations. David Bell constructed the first pattern of this type, with a c/2 front end and a c/3 back end. The front end is a blinker puffer. The back end ignites the blinker fuse.

The smallest currently known moving sawtooth was constructed in April 2011 by a conwaylife.com forum user with the handle 'cloudy197'. The c/2 front end is a bi-block puffer. The 2c/5 back end ignites the bi-block fuse.

:MSM breeder See breeder.

:multiple roteightors (p8) An extensible oscillator family consisting of one or more roteightor rotors, discovered by Dean Hickerson in 1990.

....................O...........
........OO........OOO...........
.........O.......O..............
.........O.O.....OO.............
..........OO.............O......
.......................OOO......
....OO........OOO.....O.........
.....O.......O..O......O........
.....O.O........O..O...O......O.
......OO..O....O..O.........OOO.
.........O........O..O.....O....
OO.......O..O.....OOO......OO...
.O.......OOO....................
.O.O............................
..OO....................OOO.....
...............OOO.....O..O.....
......OOO.....O..O........O.....
.....O..O........O..O....O..OO..
........O..O....O..O........O.O.
...O...O..O........O..O.......O.
...O......O..O.....OOO........OO
....O.....OOO...................
.OOO....................OO......
.O......................O.O.....
........OO......OOO.......O.....
.........O.....O..O.......OO....
......OOO.........O.............
......O......O...O..OO..........
.............O......O.O.........
..............O.......O.........
...........OOO........OO........
...........O....................

:multiplicity In a reflectorless rotating oscillator, the maximum number n of independent patterns that can orbit a single point, in a way that reduces the period of the combined oscillator by a factor of n.

:multi-state Life = colourised Life

:multum in parvo (stabilizes at time 3933) A methuselah found by Charles Corderman, but not as long-lasting as his acorn.

...OOO
..O..O
.O....
O.....

:muttering moat Any oscillator whose rotor consists of a closed chain of cells each of which is adjacent to exactly two other rotor cells. Compare babbling brook. Examples include the bipole, the blinker, the clock, the cuphook, the Gray counter, the quad, the scrubber, the skewed quad and the p2 snake pit. The following diagram shows a p2 example (by Dean Hickerson, May 1993) with a larger rotor. See ring of fire for a very large one.

OO.....
O.O.OO.
.....O.
.O..O..
..O....
..O.O.O
.....OO

:MW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator and filter.

.......O.......
..OO.O...O.OO..
..O.........O..
...OO.....OO...
OOO..OOOOO..OOO
O..O.......O..O
.OO.........OO.

:MWSS (c/2 orthogonally, p4) A middleweight spaceship, the third most common spaceship. Found by Conway in 1970 by modifying a LWSS. See also HWSS.

...O..
.O...O
O.....
O....O
OOOOO.

The MWSS possesses both a tail spark and a belly spark which can easily perturb other objects as it passes by. The spaceship can also perturb some objects in additional ways. For examples see blinker puffer and glider turner.

Dave Buckingham found that the MWSS can be synthesized using three gliders, and can be constructed from two gliders and another small object in several more ways. Here is the glider synthesis:

...........O..
...........O.O
...........OO.
..............
..............
.O......OO....
.OO.....O.O...
O.O.....O.....

:MWSS emulator = MW emulator

:MWSS out of the blue The following reaction, found by Peter Rott in November 1997, in which a LWSS passing by a p46 oscillator creates a MWSS travelling in the opposite direction. Together with some reactions found by Dieter Leithner, and an LWSS-turning reaction which Rott had found in November 1993 (but which was not widely known until Paul Callahan rediscovered it in June 1994) this can be used to prove that there exist gliderless guns for LWSS, MWSS and HWSS for every period that is a multiple of 46.

O..O.................................
....O................................
O...O................................
.OOOO................................
.....................................
.....................................
.....................................
.....................................
.....................................
...................OO..............OO
..................OO...............OO
...................OOOOO.............
..OO................OOOO.............
..OO.....O...........................
........OOO.........OOOO.............
.......O.O.O.......OOOOO.............
........O..O......OO...............OO
........OOO........OO..............OO
.........O...........................
.....................................
.....................................
.....................................
.....................................
..O.......O..........................
.....................................
OOO.......OOO........................
.OO.OO.OO.OO.........................
..OOO...OOO..........................
...O.....O...........................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..OO.....OO..........................
..OO.....OO..........................

:MWSS-to-G See 135-degree MWSS-to-G, 45-degree MWSS-to-G.

:MW volcano (p5) Found by Dean Hickerson in April 1992.

......O......
....O...O....
.............
...O.....O...
.OOO.OOO.OOO.
O...OO.OO...O
O.OOO.O.OOOO.
.O...........
...O.O.O.OO.O
..OO.OOO.O.OO
...O.O..O....
...O..OO.....
..OO.........

:My Experience with B-heptominos in Oscillators An article by Dave Buckingham (October 1996) available from http://conwaylife.com/ref/lifepage/patterns/bhept/bhept.html. It describes his discovery of Herschel conduits, including sufficient (indeed ample) stable conduits to enable, for the first time, the construction of period n oscillators and true period n guns for every sufficiently large integer n. See Herschel loop and emu.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_b.htm0000755000175000017500000030773213317135606016405 00000000000000 Life Lexicon (B)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:B = B-heptomino

:B29 (c/4 diagonally, p4) The following spaceship, found by Hartmut Holzwart in April 2004. A glider synthesis of this spaceship was completed by Tanner Jacobi in April 2015.

.......OOO.......
.......O.........
OOO......O.......
O......O.O.......
.O....OO.OOOO....
...OOOO.OOOOO.OO.
....OO.......OO.O

:B-52 bomber The following p104 double-barrelled glider gun. It uses a B-heptomino and emits one glider every 52 generations. It was found by Noam Elkies in March 1996, except that Elkies used blockers instead of molds, the improvement being found by David Bell later the same month.

.OO....................................
.OO.................O..................
...................O.O............O.O..
....................O............O.....
OO.......OO.......................O..O.
OO.O.....OO.......................O.O.O
...O.......................O.......O..O
...O.......................OO.......OO.
O..O.................OO.....O..........
.OO..................O.................
.....................OOO...............
....................................OO.
....................................OO.
.OO....................................
O..O...................................
O.O.O................O.O....OO.....OO..
.O..O.................OO....OO.....OO.O
.....O............O...O...............O
..O.O............O.O..................O
..................O................O..O
....................................OO.

:B60 A Herschel conduit discovered by Michael Simkin in 2015 using his search program, CatForce. It is one of two known Blockic elementary conduits. After 60 ticks, it produces a Herschel rotated 180 degrees at (-6,-10) relative to the input. It can most easily be connected to another B60 conduit, producing a closed loop, the Simkin glider gun.

O...........OO.....OO
OOO.........OO.....OO
..O..................
..O............OO....
...............OO....
.....................
.....................
.....................
.....................
......O..............
......O.O............
......OOO............
........O............

:babbling brook Any oscillator whose rotor consists of a string of cells each of which is adjacent to exactly two other rotor cells, except for the endpoints which are adjacent to only one other rotor cell. Compare muttering moat. Examples include the beacon, the great on-off, the light bulb and the spark coil. The following less trivial example (by Dean Hickerson, August 1997) is the only one known with more than four cells in its rotor. It is p4 and has a 6-cell rotor.

.......O........
.....OOO....OO..
....O...OO..O...
.O..O.OO..O.O...
O.O.O....OO..OO.
.OO..OO....O.O.O
...O.O..OO.O..O.
...O..OO...O....
..OO....OOO.....
........O.......

:backrake Another term for a backwards rake. A p8 example by Jason Summers is shown below. See total aperiodic for a p12 example.

.....OOO...........OOO.....
....O...O.........O...O....
...OO....O.......O....OO...
..O.O.OO.OO.....OO.OO.O.O..
.OO.O....O.OO.OO.O....O.OO.
O....O...O..O.O..O...O....O
............O.O............
OO.......OO.O.O.OO.......OO
............O.O............
......OOO.........OOO......
......O...O.........O......
......O.O....OOO...........
............O..O....OO.....
...............O...........
...........O...O...........
...........O...O...........
...............O...........
............O.O............

:backward glider A glider which moves at least partly in the opposite direction to the puffer(s) or spaceship(s) under consideration.

:bait An object in a converter, usually a small still life, that is temporarily destroyed by an incoming signal, but in such a way that a usable output signal is produced. In general such a converter produces multiple output signals (or a signal splitter is added) and one branch of the output is routed to a factory mechanism that rebuilds the bait object so that the converter can be re-used.

:baker (c p4 fuse) A fuse by Keith McClelland.

..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
.O..............

:baker's dozen (p12) A loaf hassled by two blocks and two caterers. The original form (using p4 and p6 oscillators to do the hassling) was found by Robert Wainwright in August 1989.

OO.........OO..........
OOOO.O.....OO..........
O.O..OOO...............
...........O...........
....OO....O.O..........
....O.....O..O....O....
...........OO....OO....
.......................
...............OOO..O.O
..........OO.....O.OOOO
..........OO.........OO

:bakery (p1) A common formation of two bi-loaves.

....OO....
...O..O...
...O.O....
.OO.O...O.
O..O...O.O
O.O...O..O
.O...O.OO.
....O.O...
...O..O...
....OO....

:banana spark A common three-bit polyplet spark used in glider synthesis and signal circuitry. The buckaroo is an oscillator that produces this spark. It can be used to turn a glider 90 degrees:

..O....
O.O....
.OO....
....OO.
......O

:barberpole Any p2 oscillator in the infinite sequence bipole, tripole, quadpole, pentapole, hexapole, heptapole ... (It wasn't my idea to suddenly change from Latin to Greek.) This sequence of oscillators was found by the MIT group in 1970. The term is also used (usually in the form "barber pole") to describe other extensible sections of oscillators or spaceships, especially those (usually of period 2) in which all generations look alike except for a translation and/or rotation/reflection. Any barberpole can be lengthened by the reaction shown in barbershop. See also pseudo-barberpole.

:barberpole intersection = quad

:barbershop An object created by Jason Summers in 1999 which builds an infinite barberpole. It uses slide guns to repeatedly lengthen a barberpole at a speed of c/124. The key lengthening reaction from Mark Niemiec is shown below:

..........O.O.......
...........OO.......
.O.........O.....O..
..O..............O.O
OOO..............OO.
....................
....................
....................
.................O..
................OO..
................O.O.
........OO..........
.......O.O..........
....................
.....O.O............
.....OO.............

:barber's pole = barberpole

:barge (p1)

.O..
O.O.
.O.O
..O.

:basic shuttle = queen bee shuttle

:beacon (p2) The third most common oscillator. Found by Conway, March 1970.

OO..
O...
...O
..OO

:beacon maker (c p8 fuse)

..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
..O.............
..O.............

:beehive (p1) The second most common still life.

.OO.
O..O
.OO.

:beehive and dock (p1)

...OO.
..O..O
...OO.
......
.OOOO.
O....O
OO..OO

:beehive on big table = beehive and dock

:beehive pusher = hivenudger

:beehive stopper A Spartan logic circuit discovered by Tanner Jacobi on 12 May 2015. It converts an input glider signal into a beehive, in such a way that the beehive can cleanly absorb a single glider from a perpendicular glider stream. The circuit can't be re-used until the beehive "bit" is cleared by the passage of at least one perpendicular input.

.O..........................
..O.........................
OOO.........................
............................
............................
................O...........
...............O............
...............OOO..........
............................
............O...............
............O.O.............
............OO..............
...OO.....O.................
...OO....O.O................
.........O.O................
..........O.................
........................OO..
........................O.O.
..........................O.
...............OO.........OO
........OO.....OO...........
.......O.O..................
.......OO...................
............................
..........OO................
..........O.................
...........OOO..............
.............O..............

This term has sometimes been used for the beehive catalyst variant of SW-2, and also for Paul Callahan's larger glider stopper, which also provides optional 0-degree and 180-degree glider outputs.

:beehive wire See lightspeed wire.

:beehive with tail (p1)

.OO...
O..O..
.OO.O.
....O.
....OO

:Bellman A program for searching catalytic reactions, developed by Mike Playle, which successfully found the Snark.

:belly spark The spark of a MWSS or HWSS other than the tail spark.

:Beluchenko's p37 (p37) Found by Nicolay Beluchenko on April 14, 2009. It was the first period 37 oscillator to be found, and remains the smallest.

...........OO...........OO...........
...........OO...........OO...........
.....................................
.....................................
......O.......................O......
.....O.O.....O.........O.....O.O.....
....O..O.....O.OO...OO.O.....O..O....
.....OO..........O.O..........OO.....
...............O.O.O.O...............
................O...O................
.....................................
OO.................................OO
OO.................................OO
.....OO.......................OO.....
.....................................
......O.O...................O.O......
......O..O.................O..O......
.......OO...................OO.......
.....................................
.......OO...................OO.......
......O..O.................O..O......
......O.O...................O.O......
.....................................
.....OO.......................OO.....
OO.................................OO
OO.................................OO
.....................................
................O...O................
...............O.O.O.O...............
.....OO..........O.O..........OO.....
....O..O.....O.OO...OO.O.....O..O....
.....O.O.....O.........O.....O.O.....
......O.......................O......
.....................................
.....................................
...........OO...........OO...........
...........OO...........OO...........

:Beluchenko's p51 (p51) Found by Nicolay Beluchenko on February 17, 2009. It was the first non-trivial period 51 oscillator to be found.

...............OO...OO...............
.....................................
.....................................
......OO.....................OO......
......OO.....................OO......
.....................................
...OO...........................OO...
...OO.........OO.....OO.........OO...
.........OOO.OO.......OO.OOO.........
........O.O...............O.O........
........OO.................OO........
........O...................O........
.....................................
........O...................O........
.......OO...................OO.......
O......O.....................O......O
O...................................O
.....................................
.....................................
.....................................
O...................................O
O......O.....................O......O
.......OO...................OO.......
........O...................O........
.....................................
........O...................O........
........OO.................OO........
........O.O...............O.O........
.........OOO.OO.......OO.OOO.........
...OO.........OO.....OO.........OO...
...OO...........................OO...
.....................................
......OO.....................OO......
......OO.....................OO......
.....................................
.....................................
...............OO...OO...............

:bent keys (p3) Found by Dean Hickerson, August 1989. See also odd keys and short keys.

.O........O.
O.O......O.O
.O.OO..OO.O.
....O..O....
....O..O....

:BFx59H One of the earliest and most remarkable converters, discovered by Dave Buckingham in July 1996. In 59 generations it transforms a B-heptomino into a clean Herschel with very good clearance, allowing easy connections to other conduits. It forms the final stage of many of the known composite conduits, including the majority of the original sixteen Herschel conduits. Here a ghost Herschel marks the output location:

.OO.....................
..O.....................
.O......................
.OO.....................
........................
........................
........................
........................
........................
O...OO...............O..
OO..OO...............O..
.OO..................OOO
.O.....................O
O.......................

:B-heptomino (stabilizes at time 148) This is a very common methuselah that evolves into three blocks, two gliders and a ship after 148 generations. Compare with Herschel, which appears at generation 20 of the B-heptomino's evolution. B-heptominoes acquired particular importance in 1996 due to Dave Buckingham's work on B tracks. See in particular My Experience with B-heptominos in Oscillators.

O.OO
OOO.
.O..

This pattern often arises with the cell at top left shifted one space to the left, producing a seven-bit polyplet that shares the same eight-bit descendant but is not technically a heptomino at all. This alternate form is shown as the input for elementary converter patterns such as BFx59H and BRx46B. This is standard practice for elementary conduits, since many of these conduits do in fact produce this alternate form as output.

The B-heptomino is considered a failed puffer or failed spaceship, since on its own it travels at c/2 for only a short time before being affected by its own trailing debris. However, it can be stabilized into a c/2 puffer or into a clean c/2 rake or spaceship. See, e.g., ecologist.

:B-heptomino shuttle = twin bees shuttle

:bi-block (p1) The smallest pseudo still life.

OO.OO
OO.OO

:bi-block fuse A clean fuse made by a row of bi-blocks separated by 2 cell gaps. The bi-block row wick is usually created by a bi-block puffer. The burning advances 8 cells every 12 generations making its speed 2c/3.

OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.O..O
............................................OO.
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:bi-block puffer Any puffer whose output is bi-blocks. The term is particularly used for p8 c/2 puffers, in which case a bi-block fuse is created. A bi-block puffer is easily made using two backrakes whose gliders impact symmetrically. Jason Summers welded two backrakes to form a more compact puffer, as shown below.

...........O.O............OO..............................
..........O..O..........O....O............................
.........OO.......O....O..................................
........O......OO.O....O.....O............................
.......OOOOOO..O.......OOOOOO.............................
....OO.......O...OOOO.....................................
...O...OOO.O....O.........................................
..O...O...OO.O..OO.O..O...................................
..O.....OO...O.....O......................................
..OOO...OOOO.O.......O.OO.................................
...........O.........O..O......O..........................
..OOO......O.O.......O..O....O.O..........................
.O.....O.....O........OO......OO.....O..OO..OO..OO..OO..OO
O...OO.O...OO.......................OO..OO..OO..OO..OO..OO
O...O......OOO............................................
O...OO.O...OO.......................OO..OO..OO..OO..OO..OO
.O.....O.....O........OO......OO.....O..OO..OO..OO..OO..OO
..OOO......O.O.......O..O....O.O..........................
...........O.........O..O......O..........................
..OOO...OOOO.O.......O.OO.................................
..O.....OO...O.....O......................................
..O...O...OO.O..OO.O..O...................................
...O...OOO.O....O.........................................
....OO.......O...OOOO.....................................
.......OOOOOO..O.......OOOOOO.............................
........O......OO.O....O.....O............................
.........OO.......O....O..................................
..........O..O..........O....O............................
...........O.O............OO..............................
By periodically burning the bi-block fuse using perturbations by a following backrake and spaceships, c/2 rakes can be created for all periods that are a multiple of eight.

:bi-boat = boat-tie

:biclock The following pure glider generator consisting of two clocks.

..O....
OO.....
..OO...
.O...O.
...OO..
.....OO
....O..

:big beacon = figure-8

:big fish = HWSS

:big glider (c/4 diagonally, p4) This was found by Dean Hickerson in December 1989 and was the first known diagonal spaceship other than the glider.

...OOO............
...O..OOO.........
....O.O...........
OO.......O........
O.O....O..O.......
O........OO.......
.OO...............
.O..O.....O.OO....
.O.........OO.O...
...O.O......OO..O.
....OO.O....OO...O
........O.......O.
.......OOOO...O.O.
.......O.OO...OOOO
........O...OO.O..
.............OO...
.........O.OOO....
..........O..O....

:big S (p1)

....OO.
...O..O
...O.OO
OO.O...
O..O...
.OO....

:big table = dock

:billiard table = billiard table configuration.

:billiard table configuration Any oscillator in which the rotor is enclosed within the stator. Examples include airforce, cauldron, clock II, Hertz oscillator, negentropy, pinwheel, pressure cooker and scrubber.

:bi-loaf This term has been used in at least three different senses. A bi-loaf can be half a bakery:

.O.....
O.O....
O..O...
.OO.O..
...O.O.
...O..O
....OO.
or it can be the following much less common still life:
..O....
.O.O...
O..O...
.OO.OO.
...O..O
...O.O.
....O..
or the following pure glider generator:
..O.
.O.O
O..O
.OO.
O..O
O.O.
.O..

:bipole (p2) The barberpole of length 2.

OO...
O.O..
.....
..O.O
...OO

:bi-pond (p1)

.OO....
O..O...
O..O...
.OO.OO.
...O..O
...O..O
....OO.

:bi-ship = ship-tie

:bistable switch A Spartan memory cell found by Paul Callahan in 1994. It can be in one of two states, containing either a boat or a block. Input gliders on the appropriate paths can change the boat to a block, or vice-versa, while also emitting an output glider. Unlike many memory cells, attempts to change the state to the one it is already in are ignored with the glider passing through with no reaction. This makes it easy to reset the memory cell to a known state. Which of the two states is considered the SET and which considered the RESET is just a matter of convention.

The pattern below shows the "boat" state of the memory cell in its original 1994 form. Two gliders are also shown to indicate the input paths used to change the states. A smaller version is shown under century eater, with the circuit in its "block" state.

As shown, the rightmost glider changes the state from a boat to a block and emits a glider to the upper right, while the leftmost glider passes through unchanged. Alternatively, when the state contains a block, then the leftmost glider changes the state from a block to a boat, and emits a glider to the lower right, while the rightmost glider passes through unchanged.

................................O........................
................................OOO......................
...................................O.....................
..................................OO.....................
.O.......................................................
..O........................OO.................OO.........
OOO.........................O.................O..........
............................O.O.............O.O..........
.............................OO.............OO...........
.........................................................
.........................................................
.........................................................
.........................................................
.....................................O...................
....................................O.O..................
....................................O.O..................
.....................................O...................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
...........................................O...........OO
............................................O..........OO
..........................................OOO............
.........................................................
.........................................................
...........................................O.............
..........................................O.O............
...........................................OO............
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
...............................OO........................
..............................O.O........................
..............................O..........................
.............................OO..........................

:bit A live cell, if used in reference to still life population. For example, a beehive is a 6-bit still life. Other uses generally involve information storage: a memory cell such as a honey bit that can hold one binary bit of information for later retrieval.

:biting off more than they can chew (p3) Found by Peter Raynham, July 1972.

O...........
OOO.........
...O........
..OO........
...OO.......
....OO......
...O..O.....
...O..OO....
....OO.OOO..
........O.O.
..........O.
..........OO

:Black&White = Immigration

:blasting cap The pi-heptomino (after the shape at generation 1). A term used at MIT and still occasionally encountered.

:blinker (p2) The smallest and most common oscillator. Found by Conway, March 1970.

OOO

:blinker fuse A clean fuse made from a row of blinkers separated by one cell gaps. The blinker row wick is usually created by a blinker puffer. The fuse can burn in at least three different ways at a speed of 2c/3 depending on the method used to ignite the end of the row of blinkers. This variant has found the most use. The burning advances 12 cells every 18 generations.

....................................................O.
.............................................OO.O..O.O
............................................O.O.OOOO.O
OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.O.........
............................................O.O.OOOO.O
.............................................OO.O..O.O
....................................................O.
Fuses can also be made with blinker rows which contain occasional two cell gaps, since the burning reaction is able to bridge those gaps.

:blinker puffer Any puffer whose output is blinkers. However, the term is particularly used for p8 c/2 puffers. The first such blinker puffer was found by Robert Wainwright in 1984, and was unexpectedly simple:

...O.....
.O...O...
O........
O....O...
OOOOO....
.........
.........
.........
.OO......
OO.OOO...
.OOOO....
..OO.....
.........
.....OO..
...O....O
..O......
..O.....O
..OOOOOO.
Since then many more blinker puffers have been found. The following one was found by David Bell in 1992 when he was trying to extend an x66:
.............OOO.
............OOOOO
...........OO.OOO
............OO...
.................
.................
.........O.O.....
..O.....O..O.....
.OOOOO...O.O.....
OO...OO.OO.......
.O.......O.......
..OO..O..O.......
..........O......
..OO..O..O.......
.O.......O.......
OO...OO.OO.......
.OOOOO...O.O.....
..O.....O..O.....
.........O.O.....
.................
.................
............OO...
...........OO.OOO
............OOOOO
.............OOO.
The importance of this larger blinker puffer (and others like it), is that the engine which produces the blinker output is only p4. The blinker row produced by the puffer can easily be ignited, and the resulting blinker fuse burns cleanly with a speed of 2c/3. When the burning catches up to the engine, it causes a phase change in the puffer. This fact allows p8 blinker puffers to be used to construct rakes of all periods which are large multiples of four.

:blinker pull The following glider/blinker collision, which moves a blinker (-1,3) toward the glider source:

OOO.
....
....
....
.OOO
.O..
..O.

:blinkers bit pole (p2) Found by Robert Wainwright, June 1977.

.....OO
OOO.O.O
.......
.O.O..O
O....O.
OO...O.

:blinker ship A growing spaceship in which the wick consists of a line of blinkers. An example by Paul Schick based on his Schick engine is shown below. Here the front part is p12 and moves at c/2, while the back part is p26 and moves at 6c/13. Every 156 generations 13 blinkers are created and 12 are destroyed, so the wick becomes one blinker longer.

..........OOOO.............
..........O...O............
..........O................
.OO........O..O............
OO.OO......................
.OOOO...O..................
..OO...O.OO........O....OOO
......O...O........O....O.O
..OO...O.OO........O....OOO
.OOOO...O..................
OO.OO......................
.OO........O..O............
..........O................
..........O...O............
..........OOOO.............

:block (p1) The most common still life, and also the most common object produced by 2-glider collisions (six different ways).

OO
OO
This can be used as a catalyst in many reactions. For examples, it can destroy the beehive produced by the queen bee shuttle and can destroy an evolving honey farm:
..O.O....
..OO.....
...O.....
.........
.......OO
OOO....OO
..O......
.O.......

:blockade (p1) A common formation of four blocks. The final form of lumps of muck.

OO.....................
OO.....................
.......................
.......................
.OO.................OO.
.OO.................OO.
.......................
.......................
.....................OO
.....................OO

:block and dock (p1)

...OO.
...OO.
......
.OOOO.
O....O
OO..OO

:block and glider (stabilizes at time 106)

OO..
O.O.
..OO

:blocker (p8) Found by Robert Wainwright. See also filter.

......O.O.
.....O....
OO..O....O
OO.O..O.OO
....OO....

:block factory Any factory circuit that produces a block in response to an input signal. For a useful high-clearance example see keeper.

:Blockic Adjective for constellations consisting entirely of blocks. It's possible to arrange blocks in a way that can be triggered by a single glider to produce any glider constructible pattern. A simple example of a Blockic pattern is shown under fuse. See also seed.

:block keeper See keeper.

:block-laying switch engine See stabilized switch engine.

:block on big table = block and dock

:block on table (p1)

..OO
..OO
....
OOOO
O..O

:block pull The following glider/block collision, which moves a block (2,1) toward the glider source. Performing this reaction twice using a salvo of two gliders can move a block diagonally back by three cells, which can be of use for a sliding block memory.

OO.
OO.
...
...
...
...
OOO
O..
.O.

:block pusher A pattern emitting streams of gliders which can repeatedly push a block further away. This can be used as part of a sliding block memory.

The following pattern, in which three gliders push a block one cell diagonally, is an example of how a block pusher works.

...................O.O
...................OO.
....................O.
......................
......................
......................
...O..................
..O...................
..OOO.................
......................
......................
......................
......................
OO...O................
OO...O.O..............
.....OO...............

A universal construction elbow recipe library is also likely to contain one or more block-pushing reactions, since blocks are commonly used as elbows.

:blom (stabilizes at time 23314) The following methuselah, found by Dean Hickerson in July 2002.

O..........O
.OOOO......O
..OO.......O
..........O.
........O.O.

:blonk A block or a blinker. This term is mainly used in the context of sparse Life and was coined by Rich Schroeppel in September 1992.

:blonker (p6) The following oscillator, found by Nicolay Beluchenko in April 2004.

O..OO....O..
OO..O.OO.O..
....O.O.....
.....OO.....
.......O....
.......O...O
.........O.O
..........O.

:BLSE = block-laying switch engine

:BNE14T30 A B-heptomino to glider converter found by Tanner Jacobi on 26 May 2016. This converter has the unusual property of being an edge shooter where no part of the reaction's envelope extends beyond the glider's output lane. It can be easily connected to Herschel circuitry via HFx58B or other known elementary conduits.

...........OO....
...........O.O...
.............O...
.......OO...O.OO.
........O...O...O
........O.OO.OO.O
.........O.O.O.O.
.................
.................
.................
.................
.................
O................
.O...............
.OO..............
OO...............
O................
.................
.................
.................
OO...............
OO...............

:boat (p1) The only 5-cell still life.

OO.
O.O
.O.
A boat can be used as a 90-degree one-time turner.

:boat-bit A binary digit represented by the presence of a boat next to a snake (or other suitable object, such as an aircraft carrier). The bit can be toggled by a glider travelling along a certain path. A correctly timed glider on a crossing path can detect whether the transition was from 1 to 0 (in which case the crossing glider is deleted) or from 0 to 1 (in which case it passes unharmed). Three gliders therefore suffice for a non-destructive read. The mechanisms involved are shown in the diagram below. Here the bit is shown in state 0. It is about to be set to 1 and then switched back to 0 again. The first crossing glider will survive, but the second will be destroyed.

......O..................
.......O.................
.....OOO.................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................O........
..............O.O........
..........OO...OO........
...........OO............
..........O..........O.OO
.....................OO.O
.........................
.........................
.........................
.........................
.........................
.O.......................
.OO......................
O.O......................

In January 1997 David Bell found a method of reading the bit while setting it to 0. A MWSS is fired at the boat-bit. If it is already 0 (absent) then the MWSS passes unharmed, but if it is 1 (present) then the boat and the MWSS are destroyed and, with the help of an eater1, converted into a glider which travels back along exactly the same path that is used by the gliders that toggle the boat-bit.

................................................O........
................................................OOO......
...................................................O.....
..................................................OO.....
.........................................................
.........................................................
.........................................................
.........................................................
..O......................................................
O...O..............................................O.....
.....O..............................OOOOO...........O....
O....O.............................O....O.........OOO....
.OOOOO..................................O................
...................................O...O.................
.....................................O...................
.........................................................
.........................................................
.......................................................OO
........................................................O
.......................................................O.
.......................................................OO
There are many other equivalent methods based on alternate incoming test signals.

:boat maker (c p4 fuse)

................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
....O.............
....O.............
....O.............
....O.............

:boat on boat = boat-tie

:boat-ship-tie = ship tie boat

:boatstretcher See tubstretcher.

:boat-tie (p1) A 10-cell still life consisting of two boats placed tip-to-tip. The name is a pun on "bow tie".

.O....
O.O...
.OO...
...OO.
...O.O
....O.

:bobsled = switch engine channel.

:boojum reflector (p1) Dave Greene's name for the following 180-degree glider reflector which he found in April 2001, winning $100 bounties offered by Alan Hensel and Dieter Leithner. The name is taken from Lewis Carroll's _The Hunting of the Snark_, referring to the fact that a small 90-degree stable reflector was really what was wanted. 180-degree reflectors are relatively undesirable and have limited use in larger circuitry constructions.

The boojum reflector was the smallest and fastest known stable reflector until the discovery of the rectifier in 2009, followed by the Snark in 2013.

....O.O......OO.............................
.....OO......OO.............................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
........................................O...
.......................................O.O..
.......................................O.O..
....................OO................OO.OO.
....................OO......................
......................................OO.OO.
..OO..................................OO.O..
.O.O.......................................O
.O........................................OO
OO..........................................
............................................
..................................OO........
..................................OO....OO..
...........OO...........................O.O.
..........O.O.............................O.
..........O...............................OO
.........OO.......................OO........
..................................OO........
............................................
............................................
.............................O..............
............................O.O.............
.............................O..............

:bookend The following induction coil. It is generation 1 of century.

..OO
O..O
OOO.

:bookends (p1)

OO...OO
O.O.O.O
..O.O..
.OO.OO.

:boss (p4) Found by Dave Buckingham, 1972.

.....O.....
....O.O....
....O.O....
...OO.OO...
..O.....O..
.O.O.O.O.O.
.O.O...O.O.
OO.O...O.OO
O..O.O.O..O
..O.....O..
...OO.OO...
....O.O....
....O.O....
.....O.....

:bottle (p8) Found by Achim Flammenkamp in August 1994. The name is a back-formation from ship in a bottle.

....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO........OO...
..................
..................
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:bouncer A label used for the small periodic colour-changing glider reflectors discovered mainly by Noam Elkies in the late 1990s. See p5 bouncer, p6 bouncer, p7 bouncer, p8 bouncer, or p15 bouncer.

:bounding box The smallest rectangular array of cells that contains the whole of a given pattern. For oscillators and guns this usually is meant to include all phases of the pattern, but in the case of guns, the outgoing stream(s) are excluded. The bounding box is one of the standard ways to measure the size of an object; the other standard metric is the population.

:bow tie = boat-tie

:brain (c/3 orthogonally, p3) Found by David Bell, May 1992.

.OOO.........OOO.
O.O.OO.....OO.O.O
O.O.O.......O.O.O
.O.OO.OO.OO.OO.O.
.....O.O.O.O.....
...O.O.O.O.O.O...
..OO.O.O.O.O.OO..
..OOO..O.O..OOO..
..OO..O...O..OO..
.O....OO.OO....O.
.O.............O.

:branching spaceship An extensible spaceship containing components which can be attached in multiple ways so that the result can contain arbitrarily many arms arranged like a binary tree. Here is an example of a period 2 c/2 branching spaceship, which also includes a wicktrailer:

.....................O.................O......................
....................OOO...............OOO.....................
..................OO.OOO.............OOO.OO...................
...................O..O.OO....O....OO.O..O....................
................OO.O....O.O.OO.OO.O.O....O.OO.................
................OO.O.O..O.O.......O.O..O.O.OO.................
................O........OOO.O.O.OOO........O....OOO..........
...............OO.......OO.........OO.......OO..O...O.........
...............O...............................O....OO........
........OOO....OOOO.........................OOOO..OO.O........
.......O...O..OO..OO..........................O.O....OO.......
......OO....O......O....OOO.........................O.........
......O.OO..OOOO...OO..O...O..........................OOO.....
.....OO....O.O........O....OO...........................OO....
.......O...........OOOO..OO.O............................O....
...OOO...............O.O....OO...........................OO...
..OO.......................O..................................
..O..........................OOO..............................
.OO............................OO.............................
.O..............................O....OOO......................
.OOOO...........................OO..O...O.....................
OO..OO.............................O....OO....................
.....O....OOO...................OOOO..OO.O....................
.....OO..O...O....................O.O....OO...................
........O....OO.........................O.....................
.....OOOO..OO.O...........................OOO.................
.......O.O....OO............................OO................
.............O...............................O................
...............OOO...........................OO...............
.................OO...........................O...............
..................O........................OOOO....OOO........
..................OO......................OO..OO..O...O.......
...................O...............OOO....O......O....OO......
................OOOO..............O...O..OO...OOOO..OO.O......
...............OO..OO............OO....O........O.O....OO.....
...............O.................O.OO..OOOO...........O.......
..............OO................OO....O.O...............OOO...
..............O...................O.......................OO..
..............OOOO............OOO..........................O..
.............OO..OO..........OO............................OO.
..................O..........O..............................O.
..................OO........OO...........................OOOO.
...................O........O...........................OO..OO
................OOOO........OOOO........................O.....
...............OO..OO......OO..OO......................OO.....
...............O................O......................O......
..............OO................OO.....................OOOO...
..............O.......................................OO..OO..
..............OOOO.........................................O..
.............OO..OO........................................OO.
..................O...........................................
..................OO..........................................
Branching spaceships have also been constructed for other speeds, such as c/3.

:breeder Any pattern whose population grows at a quadratic rate, although it is usual to exclude spacefillers. It is easy to see that this is the fastest possible growth rate.

The term is also sometimes used to mean specifically the breeder created by Bill Gosper's group at MIT, which was the first known pattern exhibiting superlinear growth.

There are four common types of breeder, known as MMM, MMS, MSM and SMM (where M=moving and S=stationary). Typically an MMM breeder is a rake puffer, an MMS breeder is a puffer producing puffers which produce stationary objects (still lifes and/or oscillators), an MSM breeder is a gun puffer and an SMM breeder is a rake gun. There are, however, less obvious variants of these types. Other less common breeder categories (SSS, hybrid MSS/MSM, etc.) can be created with some difficulty, based on universal constructor technology; see Pianola breeder.

The original breeder was of type MSM (a p64 puffer puffing p30 glider guns). The known breeder with the smallest initial population is switch-engine ping-pong.

:bridge A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined edge to edge, as in snake bridge snake.

:broken lines A pattern constructed by Dean Hickerson in May 2005 which produces complex broken lines of gliders and blocks.

:broth = soup

:BRx46B A Spartan elementary conduit discovered by Michael Simkin on 25 April 2016, one of the relatively few known conduits that can move a B-heptomino input to a B-heptomino output without an intervening Herschel stage.

...........OO
..OO.......OO
..OO.........
.............
.............
O..........O.
.O........O.O
.OO.......O.O
OO.........O.
O............

:BTC = billiard table configuration

:B track A track for B-heptominoes. A B-heptomino becomes a Herschel plus a block in twenty generations, so this term was nearly synonymous with Herschel track until the discovery of elementary conduits that convert a B directly to another B, or to some other non-Herschel signal output. See for example BRx46B.

:BTS A 19-cell still life made up of a bookend, a table, and a snake. Starting in 2015, with the help of Mike Playle's Bellman search program, Tanner Jacobi discovered a surprising number of ways to use this object as a catalyst for signal circuitry. One example can be seen in the CC semi-cenark entry.

..OO...
O..O...
OOO....
.......
OO.O.OO
.O.OO.O
.O.....
OO.....

:buckaroo (p30) A queen bee shuttle stabilized at one end by an eater in such a way that it can turn a glider, as shown below. The glider turning reaction uses a banana spark and is colour-preserving. The mechanism was found by Dave Buckingham in the 1970s. The name is due to Bill Gosper.

..O.....................
O.O.....................
.OO.....................
...........O............
.........O.O............
........O.O.............
.......O..O...........OO
........O.O...........OO
...OO....O.O............
..O.O......O............
..O.....................
.OO.....................

:bullet heptomino Generation 1 of the T-tetromino.

.O.
OOO
OOO

:bumper One of several periodic colour-preserving glider reflectors discovered by Tanner Jacobi on 6 April 2016. See p3 bumper, p4 bumper, p5 bumper, p6 bumper, p7 bumper, p8 bumper, p9 bumper, p11 bumper, and p15 bumper.

:bun The following induction coil. By itself this is a common predecessor of the honey farm. See also cis-mirrored R-bee.

.OO.
O..O
.OOO

:bunnies (stabilizes at time 17332) This is a parent of rabbits and was found independently by Robert Wainwright and Andrew Trevorrow.

O.....O.
..O...O.
..O..O.O
.O.O....

:burloaf = loaf

:burloaferimeter (p7) Found by Dave Buckingham in 1972. See also airforce.

....OO....
.....O....
....O.....
...O.OOO..
...O.O..O.
OO.O...O.O
OO.O....O.
....OOOO..
..........
....OO....
....OO....

:burn A reaction which travels indefinitely as a wave through the components of a wick or an agar. A burning wick is known as a fuse.

If the object being burned has a spatial periodicity, then the active area of the burning usually remains bounded and so eventually develops a periodicity too. It is unknown whether this will always occur.

The speed of burning can range from arbitrarily slow up to the speed of light. The results of burning can be clean (leaving no debris), or leaving debris usually much different from the original object. In rare cases, a reburnable fuse produces an exact copy of the original object, allowing the creation of objects such as the telegraph.

In many useful cases burning can be initiated by impacting an object with gliders or other spaceships. An object might be able to burn in more than one way, depending on how the burn is initiated.

:bushing That part of the stator of an oscillator which is adjacent to the rotor. Compare casing.

:butterfly The following pattern, or the formation of two beehives that it evolves into after 33 generations. (Compare teardrop, where the beehives are five cells closer together.)

O...
OO..
O.O.
.OOO

:Bx125 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in November 1998. After 125 ticks, it produces an inverted Herschel rotated 180 degrees at (-9, -17) relative to the input. Its recovery time is 166 ticks. A ghost Herschel in the pattern below marks the output location:

...........................O..........
..O.......................O.O.........
..O.......................O.O.........
OOO.........OO...........OO.OOO.......
O...........OO.................O......
.........................OO.OOO.......
.........................OO.O.........
......................................
......................................
......................................
......................................
......................................
......................................
......................................
......................................
....................................OO
....................................OO
......................................
.........O............................
.........O.O..........................
.........OOO..........................
...........O..........................
......................................
.......................OO.............
.......................O..............
........................OOO...........
..........................O...........

:Bx222 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in October 1998. It is made up of three elementary conduits, HF95P + PB68B + BFx59H. After 222 ticks, it produces a mirror-reflected Herschel rotated 180 degrees, at (6, -16) relative to the input. Its recovery time is 271 ticks. A ghost Herschel in the pattern below marks the output location:

.............O............................
....OO.....OOO.......OO...................
.....O....O..........O....................
.....O.O...O..........O...................
......O.O...O........OO...................
.......O...OO.................O......O....
............................OOO.....O.O...
...........................O........O.O...
...........................OO......OO.OOO.
.........................................O
..O...............OO...............OO.OOO.
..O...............OO...............OO.O...
OOO.......................................
O.........................................
..........................................
..........................................
........................................OO
........................................O.
......................................O.O.
......................................OO..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
......O...................................
......O.O.................................
......OOO.................................
........O....................OO...........
.............................O............
..................OO..........O...........
..................OO..OO.....OO...........
......................O.O.................
........................O.................
........................OO................

:by flops (p2) Found by Robert Wainwright.

...O..
.O.O..
.....O
OOOOO.
.....O
.O.O..
...O..

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_j.htm0000755000175000017500000001600613317135606016404 00000000000000 Life Lexicon (J)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:J = Herschel

:jack (p4) Found by Robert Wainwright, April 1984.

...O.....O...
...OO...OO...
O..OO...OO..O
OOO..O.O..OOO
.....O.O.....
OOO..O.O..OOO
O..OO...OO..O
...OO...OO...
...O.....O...

:jagged lines A pattern constructed by Dean Hickerson in May 2005 that uses puffers to produce a line of bi-blocks that weaves back and forth in a complicated way.

:jam (p3) Found by Achim Flammenkamp in 1988, but not widely known about until its independent discovery (and naming) by Dean Hickerson in September 1989. Compare with mold. In fact this is really very like caterer. In terms of its 7x7 bounding box it ties with trice tongs as the smallest p3 oscillator.

...OO.
..O..O
O..O.O
O...O.
O.....
...O..
.OO...

:JavaLifeSearch See lifesrc.

:Jaws A breeder constructed by Nick Gotts in February 1997. In the original version Jaws had an initial population of 150, which at the time was the smallest for any known pattern with superlinear growth. In November 1997 Gotts produced a 130-cell Jaws using some switch engine predecessors found by Paul Callahan. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

Jaws consists of eight pairs of switch engines which produce a new block-laying switch engine (plus masses of junk) every 10752 generations. It is therefore an MMS breeder.

:JC = dead spark coil

:JHC John Horton Conway. Also another name for monogram.

:J-heptomino = Herschel

:JLS = JavaLifeSearch

:Jolson (p15) Two blocks hassled by two pentadecathlons. Found by Robert Wainwright in November 1984 and named by Bill Gosper. A p9 version using snackers instead of pentadecathlons is also possible.

.OO......OO..
O..O....O..O.
O..O....O..O.
O..O....O..O.
.OO......OO..
.............
.............
.......O.....
.....O..O.OO.
......OO..OO.
.............
.............
......OOOO...
.....OOOOOO..
....OOOOOOOO.
...OO......OO
....OOOOOOOO.
.....OOOOOO..
......OOOO...

:junk = ash.

:Justyna (stabilizes at time 26458) The following methuselah found by Andrzej Okrasinski in May 2004.

.................O....
................O..O..
.................OOO..
.................O..O.
......................
OO................O...
.O................O...
..................O...
......................
......................
......................
......................
......................
......................
......................
...................OOO
...........OOO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_r.htm0000755000175000017500000017643613317135606016432 00000000000000 Life Lexicon (R)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:R = R-pentomino

:R190 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HRx131B + BFx59H. After 190 ticks, it produces a Herschel turned 90 degrees clockwise at (24, 16) relative to the input. Its recovery time is 107 ticks. A ghost Herschel in the pattern below marks the output location:

..........OO.........................
.......OO..O.........................
.....OOO.OO..........................
....O................................
.O..OOOO.OO..........................
.OOO...O.OO..........................
....O................................
...OO..........................OO....
...............................O.....
.............................O.O.....
.............................OO......
.....................................
.....................................
.....................................
.....................................
.................................OO.O
.................................O.OO
.....................................
O.........................OO.........
O.O.......................OO.........
OOO..................................
..O..................................
.....................................
.....................................
.........OO...OO.....................
..........O...O......................
.......OOO.....OOO...................
.......O.........O...................
.................O.O.................
..................OO.................
.....................................
.....................................
.....................................
.....................................
.....................................
.........................OOO.........
.........................O...........
........................OO...........

:R2D2 (p8) This was found, in the form shown below, by Peter Raynham in the early 1970s. The name derives from a form with a larger and less symmetric stator found by Noam Elkies in August 1994. Compare with Gray counter.

.....O.....
....O.O....
...O.O.O...
...O.O.O...
OO.O...O.OO
OO.O...O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:r5 = R-pentomino

:R64 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in September 1995. After 64 ticks, it produces a Herschel rotated 90 degrees clockwise at (11, 9) relative to the input. Its recovery time is 153 ticks, though this can be improved to 61 ticks by adding a from-the-side eater inside the turn to avoid interference from the output Herschel's first natural glider, as shown below. A ghost Herschel in the pattern below marks the output location:

..........OO...........
..........OO.....OO....
.................OO....
.......................
.......................
...............OO......
...............OO......
.....................OO
.....................OO
.......................
.......................
.......................
.O.....................
.O.O...................
.OOO...................
...O...................
.......................
.......................
.......................
...OO.OO...............
..O.O.O.O..............
..O.O..O...............
.OO.O........OOO.......
O...OO.......O.........
.O.O..O.O...OO.........
OO.OO..OO..............
R64 is one of the simplest known Spartan conduits, one of the two known Blockic conduits, and one of the few elementary conduits in the original set of sixteen. See also p256 gun.

:rabbits (stabilizes at time 17331) A 9-cell methuselah found by Andrew Trevorrow in 1986.

O...OOO
OOO..O.
.O.....
The following predecessor, found by Trevorrow in October 1995, has the same number of cells and lasts two generations longer.
..O....O
OO......
.OO.OOO.

:racetrack A pattern in which a signal makes its way in a loop through an "obstacle course" of reactions in order to demonstrate various ways that the signal can be reflected, temporarily stored, and converted. The more different reactions that are used the better the racetrack. David Goodenough built racetracks for p30 and p46 technology in 1995. Racetracks are also known for Herschel conduit technology, and simple ones are useful for building oscillators and glider guns.

:rake Any puffer whose debris consists of spaceships. A rake is said to be forwards, backwards or sideways according to the direction of the spaceships relative to the direction of the rake. Originally the term "rake" was applied only to forwards c/2 glider puffers (see space rake). Many people prefer not to use the term in the case where the puffed spaceships travel parallel or anti-parallel to the puffer, as in this case they do not rake out any significant region of the Life plane (and, in contrast to true rakes, these puffers cannot travel in a stream, and so could never be produced by a gun).

Although the first rakes (circa 1971) were c/2, rakes of other velocities have since been built. Dean Hickerson's construction of Corderships in 1991 made it easy for c/12 diagonal rakes to be built, although no one actually did this until 1998, by which time David Bell had constructed c/3 and c/5 rakes (May 1996 and September 1997, respectively). Jason Summers constructed a 2c/5 rake in June 2000 (building on work by Paul Tooke and David Bell) and a c/4 orthogonal rake in October 2000 (based largely on reactions found by David Bell).

The smallest possible period for a rake is probably 7, as this could be achieved by a 3c/7 orthogonal backwards glider puffer. The smallest period attained to date is 8 (Jason Summers' backrake, March 2001).

:$rats (p6) Found by Dave Buckingham, 1972.

.....OO.....
......O.....
....O.......
OO.O.OOOO...
OO.O.....O.O
...O..OOO.OO
...O....O...
....OOO.O...
.......O....
......O.....
......OO....

:rattlesnake (p11) Found by Dean Hickerson in January 2016 and named by Jeremy Tan.

........OO...
........O....
.........O...
........OO...
.............
.............
.............
.....O.......
.....OO......
OO.O.O.OOO...
O.OO.O.O.O...
......O..OOO.
.......OO...O
.........OOO.
.........O...

:R-bee = bun. This name is due to the fact that the pattern is a single-cell modification of a beehive.

:reaction envelope The collection of cells that are alive during some part of a given active reaction. This term is used for Herschel circuits and other stable circuitry, whereas construction envelope is specific to recipes in self-constructing circuitry.

There are some subtleties at the edges of the envelope. Specifically, two reactions that have the exact same set of cells defining their envelopes may have different behavior when placed next to a single-cell protrusion like the tail of an eater1, or one side of a tub. The difference depends on whether two orthogonally adjacent cells at the edge of the envelope are ever simultaneously alive, within the protruding cell's zone of influence.

:reanimation A reaction performed by a convoy of spaceships (or other moving objects) which converts a common stationary object into a glider without harming the convoy. This provides one way for signals that have been frozen in place by some previous reaction to be released for use.

Simple reactions using period 4 c/2 spaceships have been found for reanimating a block, boat, beehive, ship, loaf, bi-block, or toad. The most interesting of these is for a beehive since it seems to require an unusual p4 spaceship:

..........O.......................
.........O.O......................
.........O.O......................
..........O.......................
..................................
...............OOO.............OOO
..............O..O.....OOO....O..O
.................O....O..O.......O
.............O...O....O...O..O...O
.................O..O...O.O......O
..OOO............O.O........OO..O.
.O..O..............O........OOOOO.
....O..........OOO...O......OO....
O...O..........................OO.
O...O.............................
....O.............................
.O.O...............O..............
..................OOO.............
.................OO.O.............
....O............OOO..............
...OOO...........OOO..............
...O.OO..........OOO..............
....OOO...........OO..............
....OOO...........................
....OO............................

Reanimation of a loaf is used many times in the Caterloopillar. It is also used in the Caterpillar as part of its catch and throw mechanism. Finally, reanimation can produce rakes from some puffers. See stop and restart for a similar idea that applies to Herschel conduits and other signal circuitry.

There are small objects which have no known reanimation reactions using c/2 ships other than the brute force method of hitting them with the output of rakes.

:reburnable fuse A very rare type of fuse whose output is identical to its input, possibly with some spatial and/or temporal offset. See lightspeed wire for an example. Reburnable fuses are used primarily in the construction of fixed-speed self-supporting macro-spaceships, where the speed of the fuse's burning reaction becomes the speed of the spaceship. Examples include the Caterpillar, Centipede, and waterbear.

:receiver See Herschel receiver.

:recipe = glider synthesis or construction recipe.

:recovery time The number of ticks that must elapse after a signal is sent through a conduit, before another signal can be safely sent on the same path. In general, a lower recovery time means a more useful conduit. For example, the Snark's very low recovery time allowed for the creation of oscillators with previously unknown periods, 43 and 53.

For the most part this is a synonym for repeat time. However, overclocking a complex circuit can often allow it to be used at a repeat time much lower than its safe recovery time.

:rectifier The smallest known 180-degree reflector, discovered by Adam P. Goucher in 2009. It was the smallest and fastest stable reflector of any kind until the discovery of the Snark in 2013. The rectifier has the same output glider as the boojum reflector but a much shorter repeat time of only 106 ticks.

Another advantage of the rectifier is that the output glider is on a transparent lane, so it can be used in logic circuitry to merge two signal paths.

..O.........................................
O.O.........................................
.OO.........................................
............................................
..............O.............................
.............O.O............................
.............O.O............................
..............O.............................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
.......................OO...................
.......................OO...................
............................................
.....OO.....................................
....O.O.....................................
....O.......................................
...OO.......................................
..................................OO........
.................................O..O..OO...
.................................O.O....O...
..............OO..................O.....O.OO
.............O.O.....................OO.O.O.
.............O.......................O..O..O
............OO....................O....O..OO
..................................OOOOO.....
............................................
....................................OO.O....
....................................O.OO....
............................OOO.............
............................O...............
.............................O..............

:recursive filter A toolkit developed by Alexey Nigin in July 2015, which enables the construction of patterns with population growth that asymptotically matches an infinite number of different superlinear functions. Toolkits enabling other, sublinear infinite series had been completed by Dean Hickerson and Gabriel Nivasch in 2006. See quadratic filter and exponential filter.

Sublinear functions are possible using the recursive-filter toolkit as well. It can be used to construct a glider-emitting pattern with a slowness rate S(t) = O(log***...*(t)), the nth-level iterated logarithm of t, which asymptotically dominates any primitive-recursive function f(t).

:reflector Any stable or oscillating pattern that can reflect some type of spaceship (usually a glider) without suffering permanent damage. A pattern that is damaged or destroyed during the reflection process is generally called a one-time turner instead.

The first known reflector was the pentadecathlon, which functions as a 180-degree glider reflector (see relay). Other examples include the buckaroo, the twin bees shuttle and some oscillators based on the traffic jam reaction. Glider guns can also be made into reflectors, although these are mostly rather large.

In September 1998 Noam Elkies found some fast small-period glider reflectors, with oscillators supplying the required domino sparks at different periods. A figure-8 produced a p8 bouncer, and a p6 pipsquirter produced an equivalent p6 bouncer. A more complicated construction allows a p5 bouncer (which, as had been anticipated, soon led to a true p55 Quetzal gun). And in August 1999 Elkies found a suitable sparker to produce a p7 bouncer, allowing the first p49 oscillator to be constructed.

These were all called simply "p5 reflector", "p6 reflector", etc., until 6 April 2016 when Tanner Jacobi discovered an equally small and simple reaction, the bumper, starting with a loaf as bait instead of a boat. This resulted in a series of periodic colour-preserving reflectors, whereas Elkies' bouncer reflectors are all colour-changing. A useful mnemonic is that "bouncer" contains a C and is colour-changing, whereas "bumper" contains a P and is colour-preserving.

Stable reflectors are special in that if they satisfy certain conditions they can be used to construct oscillators of all sufficiently large periods. It was known for some time that stable reflectors were possible (see universal constructor), but no one was able to construct an explicit example until Paul Callahan did so in October 1996.

Callahan's original reflector has a repeat time of 4840, soon improved to 1686, then 894, and then 850. In November 1996 Dean Hickerson found a variant in which this is reduced to 747. Dave Buckingham reduced it to 672 in May 1997 using a somewhat different method, and in October 1997 Stephen Silver reduced it to 623 by a method closer to the original. In November 1998 Callahan reduced this to 575 with a new initial reaction. A small modification by Silver a few days later brought this down to 497.

In April 2001 Dave Greene found a 180-degree stable reflector with a repeat time of only 202 (see boojum reflector). This reflector won bounties offered by Dieter Leithner and Alan Hensel. Half of the prize money was recycled into a new prize for a small 90-degree reflector, which in turn was won by Mike Playle's colour-preserving Snark reflector. The Snark is currently the smallest known stable reflector, with a recovery time of 43. Playle has offered a $100 prize for a colour-changing stable reflector contained within a 25 by 25 bounding box, with a recovery time of 50 generations or less.

As of June 2018, the following splitter is among the smallest known 90-degree colour-changing reflectors. The top output can be blocked off by an eater if needed. For small 180-degree colour-changing reflectors see rectifier, and also the sample pattern in splitter.

................OO...........O......OO..................
................OO..........O.O....O..O.................
............................O.O...O.OOO..OO.............
...........................OO.OO.O.O......O.............
...............................O.O...OO...O.O...........
...........................OO.O..OOOO.O....OO...........
...........................OO.O.O...O...................
...............................O.O...O..................
................................O.O...O.................
.................................O...OO..............O..
....................................................O.O.
.....................................................O..
........................................................
........................OO..............................
........................OO..............................
.........OO.............................................
........O..O............................................
.......O.OO..........................................OO.
.......O.............................................OO.
......OO................................................
.....................OO.................................
.....................O..................................
......................OOO...............................
........................O.....OO........................
.............................O.O........................
.............................O..........................
............................OO..........................
........................................................
........................................................
....................................O...............OO..
...................................O.O..............O.O.
...................................O.O................O.
....................................O.................OO
OOO.....................................OO..............
..O.....................................O.O.............
.O........................................O.............
..........................................OO............

:reflectorless rotating oscillator A pattern that rotates itself 90 or 180 degrees after some number of generations, with the additional constraint that multiple non-interacting copies of the pattern can be combined into a new oscillator with a period equal to the appropriate fraction of the component oscillators' period. The second constraint disqualifies small time-symmetric oscillators such as the blinker and monogram.

A working RRO might look something like a pi orbital or p256 gun loop containing one or more pis or Herschels in the same loop, but without any external stabilisation mechanism. Such patterns can be proven to exist (see universal constructor), but as of June 2018 none have been explicitly constructed in Life. There is no upper limit on multiplicity for a constructor-based RRO.

:regulator An object which converts input gliders aligned to some period to output gliders aligned to a different period. The most interesting case is a universal regulator, of which several have been constructed by Paul Chapman and others.

:relay Any oscillator in which spaceships (typically gliders) travel in a loop. The simplest example is the p60 one shown below using two pentadecathlons. Pulling the pentadecathlons further apart allows any period of the form 60+120n to be achieved. This is the simplest proof of the existence of oscillators of arbitrarily large period.

...........................O....O..
................OO.......OO.OOOO.OO
.................OO........O....O..
................O..................
..O....O...........................
OO.OOOO.OO.........................
..O....O...........................

:repeater Any oscillator or spaceship.

:repeat time The minimum number of generations that is possible between the arrival of one object and the arrival of the next. This term is used for things such as reflectors or conduits where the signal objects (gliders or Herschels, for example) will interact fatally with each other if they are too close together, or one will interact fatally with a disturbance caused by the other. For example, the repeat time of Dave Buckingham's 59-step B-heptomino to Herschel conduit (shown under conduit) is 58.

:rephaser The following reaction that shifts the phase and path of a pair of gliders. There is another form of this reaction, glider-block cycle, that reflects the gliders 180 degrees.

..O..O..
O.O..O.O
.OO..OO.
........
........
...OO...
...OO...

:replicator A finite pattern which repeatedly creates copies of itself. Such objects are known to exist (see universal constructor), but no concrete example is known. The linear propagator may be considered to be the first example of a replicator built in Life, but this is debatable as each of its copies replicates itself only once, allowing no possibility of superlinear growth.

:reverse caber tosser A storage mechanism for data feeding a universal constructor designed by Adam P. Goucher in 2018. A very large integer can be encoded in the position of a very faraway object. If the distance to that object is measured using circuitry designed to be as simple as possible, a complete decoder and universal constructor can be created by colliding a small number of gliders - no more than 329 according to a June 2018 glider synthesis, and exactly 43 according to a July 1 redesign by Chris Cain using eight far-distant GPSEs and, amazingly, no stationary circuitry except for a single catalyst block. Some intermediate designs with 50+ gliders need no stationary circuitry at all.

With the correct placement of the faraway object, the complete pattern is theoretically capable of building any glider-constructible object. This means that 43 is the maximum number of gliders required to build any constructible object, no matter what size. However, it is not possible to determine in practice what the locations of these 43 gliders should be, even for a relatively simple construction.

:reverse fuse A fuse that produces some initial debris, but then burns cleanly. The following is a simple example.

.............OO
............O.O
...........O...
..........O....
.........O.....
........O......
.......O.......
......O........
.....O.........
....O..........
...O...........
..O............
OO.............

:revolver (p2)

O............O
OOO....O...OOO
...O.O.O..O...
..O......O.O..
..O.O......O..
...O..O.O.O...
OOO...O....OOO
O............O

:RF28B A converter with several known forms, many of which found by Dave Buckingham in 1972 and in the early 1980s. It accepts an R-pentomino as input and produces an output B-heptomino 28 ticks later. Of nine major variants known as of July 2018, four versions are shown below. For each version, the R-pentomino inputs are shown near the left and right edges, along with the B-heptomino output locations near the center.

........O..........................O........
.......O.O.......O................O.O......O
........O......OOO.................O.....OOO
..............O.........................O...
..............OO........................OO..
............................................
............................................
......O..........O........O..........O......
......OO..........O......O..........OO......
.....OO...........OO....OO...........OO.....
.................OO......OO.................
.................O........O.................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
......O..........O........O..........O......
......OO..........O......O..........OO......
.....OO...........OO....OO...........OO.....
.................OO......OO.................
.................O........O.................
............................................
..O.........................................
.O.O.............................O..........
O..O............................O.O.........
.OO..............................OO.........

The version in the southeast is used in Paul Callahan's Herschel receiver. The one in the northwest is part of L156, but can be replaced by the variant in the northeast which produces a forward glider output.

:RF48H Stephen Silver's alternate completion of Paul Callahan's Herschel receiver. As of June 2018 there are four known variants. The original version consists of a single loaf. A ghost Herschel marks the output location.

......O..................O..
......OO.................O..
.....OO..................OOO
...........................O
............................
.OO.........................
O..O........................
O.O.........................
.O..........................

:Rich's p16 A period 16 oscillator found by Rich Holmes in July 2016, using apgsearch. For its use as a filter see for example p48 gun.

....O...O....
..OO.O.O.OO..
.O...O.O...O.
O...OO.OO...O
O.O.......O.O
.O.........O.
.............
....OO.OO....
...O.O.O.O...
....O...O....

:ring of fire (p2) The following muttering moat found by Dean Hickerson in September 1992.

................O.................
..............O.O.O...............
............O.O.O.O.O.............
..........O.O.O.O.O.O.O...........
........O.O.O..OO.O.O.O.O.........
......O.O.O.O......O..O.O.O.......
....O.O.O..O..........O.O.O.O.....
.....OO.O..............O..O.O.O...
...O...O..................O.OO....
....OOO....................O...O..
..O.........................OOO...
...OO...........................O.
.O...O........................OO..
..OOOO.......................O...O
O.............................OOO.
.OOO.............................O
O...O.......................OOOO..
..OO........................O...O.
.O...........................OO...
...OOO.........................O..
..O...O....................OOO....
....OO.O..................O...O...
...O.O.O..O..............O.OO.....
.....O.O.O.O..........O..O.O.O....
.......O.O.O..O......O.O.O.O......
.........O.O.O.O.OO..O.O.O........
...........O.O.O.O.O.O.O..........
.............O.O.O.O.O............
...............O.O.O..............
.................O................

:rle Run-length encoded. Run-length encoding is a simple (but not very efficient) method of file compression. In Life the term refers to a specific ASCII encoding used for patterns in Conway's Life and other similar cellular automata. This encoding was introduced by Dave Buckingham and is now the usual means of exchanging relatively small patterns by email or in online forum discussions.

As an example of the rle format, here is a representation of the Gosper glider gun. The "run lengths" are the numbers, b's are dead cells, o's are live cells, and dollar signs signal new lines:

x = 36, y = 9, rule = B3/S23
24bo$22bobo$12boo6boo12boo$11bo3bo4boo12boo$oo8bo
5bo3boo$oo8bo3boboo4bobo$10bo5bo7bo$11bo3bo$12boo!

Over the years RLE format has been extended to handle patterns with multiple states, neighborhoods, rules, and universe sizes. A completely different encoding, macrocell format, is used for repetitive patterns that may have very large populations.

:R-mango A small active reaction, so named because it is a single-cell modification of a mango, but now more commonly known as dove.

:RNE-19T84 The following edge shooter converter, accepting an input R-pentomino and producing a glider heading northeast (if the R-pentomino is in standard orientation).

.................O.........
...............OOO.........
..............O............
...O..........OO...........
..O.O......................
..O.O......................
.OO.OO....................O
.O......................OOO
..O.OO.................O...
O.O.OO.................OO..
OO.........................
.............O.............
............OOO.....OO.....
............O......O..O....
....................OO.....
This converter has several common uses. It can be attached to the L156 Herschel conduit to change it into a useful period doubler. Connecting it to the initial stage of the L156 produces a composite Herschel-to-glider converter often used as a splitter, or as a quasi-edge shooter after suppressing the additional glider output:
................................O.........
..............................OOO.........
.............................O............
..................O..........OO...........
.................O.O......................
.................O.O......................
...............OOO.OO....................O
..............O........................OOO
........O......OOO.OO.................O...
........OOO......O.OO.................OO..
...........O..............................
..........OO..............................
...................................OO.....
..................................O..O....
...................................OO.....
..........................................
..........................................
..........................................
.........O................................
.........O.O..............................
.........OOO..............................
...........O...........OO.................
.......................O..................
........................OOO...............
..........................O...............
..........................................
..OO......................................
...O......................................
OOO.......................................
O.........................................
The above H-to-2G mechanism appears in many places in the glider gun collection, for example, mainly for periods below 78 where syringes can't be used to build small true-period guns. The insertion reaction allows a glider to be placed 19 ticks in front of another glider on the same lane, or 30 ticks behind it (28 if the perpendicular glider output is suppressed.)

:rock Dean Hickerson's term for an eater which remains intact throughout the eating process. The snake in Dave Buckingham's 59-step B-to-Herschel conduit (shown under conduit) is an example. Other still lifes that sometimes act as rocks include the tub, the hook with tail, the eater1 (eating with its tail) and the hat (in Heinrich Koenig's stabilization of the twin bees shuttle).

:roteightor (p8) Found by Robert Wainwright in 1972. See also multiple roteightors.

.O............
.OOO........OO
....O.......O.
...OO.....O.O.
..........OO..
..............
.....OOO......
.....O..O.....
.....O........
..OO..O...O...
.O.O......O...
.O.......O....
OO........OOO.
............O.

:rotor The cells of an oscillator that change state. Compare stator. It is easy to see that any rotor cell must be adjacent to another rotor cell.

:R-pentomino This is by far the most active polyomino with less than six cells: all the others stabilize in at most 10 generations, but the R-pentomino does not do so until generation 1103, by which time it has a population of 116, including six gliders.

.OO
OO.
.O.
At generation 774, an R-pentomino produces a queen bee which lasts 17 more generations before being destroyed, enough time for it to flip over. This observation led to the discovery of the Gosper glider gun.

:RRO = reflectorless rotating oscillator

:rule 22 Wolfram's rule 22 is the 2-state 1-D cellular automaton in which a cell is ON in the next generation if and only if exactly one of its three neighbours is ON in the current generation (a cell being counted as a neighbour of itself). This is the behaviour of Life on a cylinder of width 1.

:ruler A pattern constructed by Dean Hickerson in April 2005 that produces a stream of LWSS with gaps in it, such that the number of LWSS between successive gaps follows the "ruler function" (sequence A001511 in The On-Line Encyclopedia of Integer Sequences).

:rumbling river Any oscillator in which the rotor is connected and contained in a strip of width 2. The following p3 example is by Dean Hickerson, November 1994.

..............OO......OO......OO...O.OO..........
....O........O..O....O..O....O..O..OO.O..........
O..O.O....O...OO..O...OO..O...O.O.....O.OO.......
OOOO.O..OOOOOO..OOOOOO..OOOOOO..OOOOOO.O.O.......
.....O.O.....O.O.....O.O.....O.O.....O.O......OO.
..OO.O.O.O.O...O.O.O...O.O.O...O.O.O...O.O.....O.
.O.....O.O...O.O.O...O.O.O...O.O.O...O.O.O.O.OO..
.OO......O.O.....O.O.....O.O.....O.O.....O.O.....
.......O.O.OOOOOO..OOOOOO..OOOOOO..OOOOOO..O.OOOO
.......OO.O.....O.O...O..OO...O..OO...O....O.O..O
..........O.OO..O..O....O..O....O..O........O....
..........OO.O...OO......OO......OO..............

:Rx202 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in May 1997. It is made up of two elementary conduits, HR143B + BFx59H. After 202 ticks, it produces an inverted Herschel turned 90 degrees clockwise at (7, 32) relative to the input. Its recovery time is 201 ticks. A ghost Herschel in the pattern below marks the output location:

..............OO...............
...........OO..O...............
.........OOO.OO......O.........
........O..........OOO.........
.........OOO.OO...O............
...........O.OO...OO...........
...............................
...............................
...............................
...............................
.......................OO......
.......................O.......
.....................O.O.......
.....................OO........
...............................
...............................
...............................
...............................
...............................
...O...........................
...O.O.........................
...OOO.........................
.....O.........................
......................OO.......
......................OO.......
...............................
...............................
...............................
...............................
...............................
...............................
...............................
O.OO...........................
OO.O...........................
.....................OO........
.........OO.........O..O..OO...
.........OO.........O.O....O...
.....................O.....O.OO
........................OO.O.O.
........................O..O..O
.....................O....O..OO
.....................OOOOO.....
...............................
...................OOOOOOO.....
...................O..O..O.....
.................O.O...........
.................OO............
...............................
...............................
...............................
...............................
...............................
.........OOO...................
...........O...................
...........OO..................

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_a.htm0000755000175000017500000011004513317135606016371 00000000000000 Life Lexicon (A)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Achim's p144 (p144) This was found (minus the blocks shown below) on a cylinder of width 22 by Achim Flammenkamp in July 1994. Dean Hickerson reduced it to a finite form using figure-8s the same day. The neater finite form shown here, replacing the figure-8s with blocks, was found by David Bell in August 1994. See factory for a use of this oscillator.

OO........................OO
OO........................OO
..................OO........
.................O..O.......
..................OO........
..............O.............
.............O.O............
............O...O...........
............O..O............
............................
............O..O............
...........O...O............
............O.O.............
.............O..............
........OO..................
.......O..O.................
........OO..................
OO........................OO
OO........................OO

:Achim's p16 (p16) Found by Achim Flammenkamp, July 1994.

.......OO....
.......O.O...
..O....O.OO..
.OO.....O....
O..O.........
OOO..........
.............
..........OOO
.........O..O
....O.....OO.
..OO.O....O..
...O.O.......
....OO.......

:Achim's p4 (p4) Dave Buckingham found this in a less compact form (using two halves of sombreros) in 1976. The form shown here was found by Achim Flammenkamp in 1988. The rotor is two copies of the rotor of 1-2-3-4, so the oscillator is sometimes called the "dual 1-2-3-4".

..OO...OO..
.O..O.O..O.
.O.OO.OO.O.
OO.......OO
..O.O.O.O..
OO.......OO
.O.OO.OO.O.
.O..O.O..O.
..OO...OO..

:Achim's p5 = pseudo-barberpole

:Achim's p8 (p8) Found by Achim Flammenkamp, July 1994.

.OO......
O........
.O...O...
.O...OO..
...O.O...
..OO...O.
...O...O.
........O
......OO.

:acorn (stabilizes at time 5206) A methuselah found by Charles Corderman. It has a final population of 633 and covers an area of 215 by 168 cells, not counting the 13 gliders it produces. Its ash consists of typical stable objects and blinkers, along with the relatively rare mango and a temporary eater1.

.O.....
...O...
OO..OOO

:A for all (p6) Found by Dean Hickerson in March 1993.

....OO....
...O..O...
...OOOO...
.O.O..O.O.
O........O
O........O
.O.O..O.O.
...OOOO...
...O..O...
....OO....

:against the grain A term used for negative spaceships travelling in zebra stripes agar, perpendicular to the stripes, and also for against-the-grain grey ships.

Below is a sample signal, found by Hartmut Holzwart in April 2006, that travels against the grain at 2c/3. This "negative spaceship" travels upward and will quickly reach the edge of the finite patch of stabilized agar shown here.

...O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOO......OOOOOOOOOOOOOO.
O...............O....O..............O
.OOOOOOOOOOOOOOOO....OOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOO...OOOO...OOOOOOOOOOOO.
O.................OO................O
.OOOOOOOOOOOO............OOOOOOOOOOO.
.............O..........O............
.OOOOOOOOOOOOOO........OOOOOOOOOOOOO.
O..............O......O.............O
.OOOOOOOOOOOOOOO......OOOOOOOOOOOOOO.
..........OO....O....O....OO.........
.OOOOOOO......OOOO..OOOO......OOOOOO.
O.......O...OO...O..O...OO...O......O
.OOOOOOO.........O..O.........OOOOOO.
.........O.....O......O.....O........
.OOOOOOOOO......O....O......OOOOOOOO.
O.........O....OO.OO.OO....O........O
.OOOOOOOOOOO....O....O....OOOOOOOOOO.
............OO....OO....OO...........
.OOOOOOO..OOO.O..O..O..O.OOO..OOOOOO.
O..............OOO..OOO.............O
.OOOOO......OOO.O....O.OOO......OOOO.
......O....O..............O....O.....
.OOOOOO........O......O........OOOOO.
O......O...OO..O..OO..O..OO...O.....O
.OOOOOOOO.....O.OO..OO.O.....OOOOOOO.
.........O..O.OO......OO.O..O........
.OOOOOOOOO...OO........OO...OOOOOOOO.
O..........O..............O.........O
.OOOOOOOOOOOOOOOO....OOOOOOOOOOOOOOO.
.................OOOO................
.OOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O..O..O..O..O..O...

Holzwart proved in 2006 that 2c/3 is the maximum speed at which signals can move non-destructively against the grain through zebra stripes agar.

:against-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying perpendicular to the direction in which the spaceship moves. See also with-the-grain grey ship.

:agar Any pattern covering the whole plane that is periodic in both space and time. The simplest (nonempty) agar is the stable one extended by the known spacefillers. For some more examples see chicken wire, houndstooth agar, onion rings, squaredance and Venetian blinds. Tiling the plane with the pattern O......O produces another interesting example: a p6 agar which has a phase of density 3/4, which is the highest yet obtained for any phase of an oscillating pattern. See lone dot agar for an agar composed of isolated cells.

:aircraft carrier (p1) This is the smallest still life that has more than one island.

OO..
O..O
..OO

:airforce (p7) Found by Dave Buckingham in 1972. The rotor consists of two copies of that used in the burloaferimeter.

.......O......
......O.O.....
.......O......
..............
.....OOOOO....
....O.....O.OO
...O.OO...O.OO
...O.O..O.O...
OO.O...OO.O...
OO.O.....O....
....OOOOO.....
..............
......O.......
.....O.O......
......O.......

:AK47 reaction The following reaction (found by Rich Schroeppel and Dave Buckingham) in which a honey farm predecessor, catalysed by an eater and a block, reappears at another location 47 generations later, having produced a glider and a traffic light. This was in 1990 the basis for the Dean Hickerson's construction of the first true p94 gun, and for a very small (but pseudo) p94 glider gun found by Paul Callahan in July 1994. (The original true p94 gun was enormous, and has now been superseded by comparatively small Herschel loop guns and Mike Playle's tiny AK94 gun.)

.....O....
....O.O...
...O...O..
...O...O..
...O...O..
....O.O...
.....O....
..........
..OO......
...O......
OOO.....OO
O.......OO

:AK94 gun The smallest known gun using the AK47 reaction, found by Mike Playle in May 2013 using his Bellman program.

.......O.......O.......OO.............
.......OOO.....OOO.....OO.............
..........O.......O...................
.........OO......OO................OO.
..............................OO..O..O
..............................O.O..OO.
.................................OO...
.....O............................O...
.....OOO..........................O.OO
........O......................OO.O..O
.......OO......................OO.OO..
......................................
......................................
.................O....................
..OO.OO.........O.O..........OO.......
O..O.OO........O...O.........O........
OO.O...........O...O..........OOO.....
...O...........O...O............O.....
...OO...........O.O...................
.OO..O.O.........O....................
O..O..OO..............................
.OO................OO.................
...................O..................
.............OO.....OOO...............
.............OO.......O...............

:Al Jolson = Jolson

:almost knightship A promising partial result discovered by Eugene Langvagen in March 2004. This was an early near miss in the ongoing search for a small elementary (2,1)c/6 knightship. After six generations, only two cells are incorrect.

....OOO......
...OO..OO....
..O..OOO.OO..
.OOO.........
...OO....OO..
OO.O.........
OO..OOO......
....OO.O.....
OO.OOO.......
.O...O.OO....
.....O.OO....
O...O....O...
O...O..OOO.OO
O............
.O.O..O......
.....O.....OO
......O.OO...
......OO..O..
...........O.

:almosymmetric (p2) Found in 1971.

....O....
OO..O.O..
O.O......
.......OO
.O.......
O......O.
OO.O.O...
.....O...

:ambidextrous A type of Herschel transceiver where the receiver can be used in either of two mirror-image orientations. See also chirality.

:anteater A pattern that consumes ants. Matthias Merzenich discovered a c/5 anteater on 15 April 2011. See wavestretcher for details.

:antlers = moose antlers

:ants (p5 wick) The standard form is shown below. It is also possible for any ant to be displaced by one or two cells relative to either or both of its neighbouring ants. Dean Hickerson found fenceposts for both ends of this wick in October 1992 and February 1993. See electric fence, and also wickstretcher.

OO...OO...OO...OO...OO...OO...OO...OO...OO..
..OO...OO...OO...OO...OO...OO...OO...OO...OO
..OO...OO...OO...OO...OO...OO...OO...OO...OO
OO...OO...OO...OO...OO...OO...OO...OO...OO..

:antstretcher Any wickstretcher or wavestretcher that stretches ants. Nicolay Beluchenko and Hartmut Holzwart constructed the following small extensible antstretcher in January 2006:

......................................................OO.......
.....................................................OO........
...............................................OO.....O........
..............................................OO.....OO........
................................................O....O.O..OO...
..................................................OO...OO.OOOO.
..................................................OO..........O
..............................................................O
........................................................O......
..........................................................OO...
...............................................................
..........................................................OOO..
.........................................................OO..O.
...............................OO..........................O...
..............................OO...............................
...............................O.O...................OOO..O....
..........................O....OOO...................O..OOO....
.........................OOOOO.OOO..O.OO................OO.....
.........................O..OO......O...OO.OO.........OO.OO....
...................................O....OO...OO.OO.......OO....
...........................OO..OO.OO..OO.....OO...OO.O.O.......
...................................O.......OO.....OO...........
.....................OOO...O.....OO.............OO....O........
.....................O.....O..O.OO...................O.........
......................O...OO.O.................................
.........................OO...O.O..............................
.............OOO..........O....................................
.............O.....OOO..OO.....................................
..............O..OO.OOO.OO.....................................
................O..........O...................................
.................O.O.OO....O...................................
...................OO.O........................................
.................OO...O.O......................................
................OO.............................................
..................O............................................
...............OO..............................................
..............OOO..............................................
.............OO.O..............................................
............OOOO.O.............................................
.................OOO...........................................
..................OO...........................................
..........OOO.OO...............................................
.........O...OOO...............................................
............OOO................................................
........O.O.O..................................................
.......OOOO....................................................
.......O.......................................................
........OO.....................................................
.........O..O..................................................
OO.............................................................
O.O...OOO......................................................
O...O....O.....................................................
...OO..........................................................
...O.....O.....................................................

:anvil The following induction coil.

.OOOO..
O....O.
.OOO.O.
...O.OO

:apgluxe See apgsearch

:apgmera See apgsearch.

:apgnano See apgsearch.

:apgsearch One of several versions of a client-side Ash Pattern Generator soup search script by Adam P. Goucher, for use with Conway's Life and a wide variety of other rules. Development of the original Golly-based Python script started in August 2014. After the addition in 2016 of apgnano (native C++) and apgmera (self-modifying, 256-bit SIMD compatibility), development continues in 2017 with apgluxe (Larger Than Life and Generations rules, more soup shapes). Several customized variants of the Python script have also been created by other programmers, to perform types of searches not supported by Goucher's original apgsearch 1.x.

All of these versions of the search utility work with a "haul" that usually consists of many thousands or millions of random soup patterns. Each soup is run to stability, and detailed object census results are reported to Catagolue. For any rare objects discovered in the ash, the source soup can be easily retrieved from the Catagolue server.

:APPS (c/5 orthogonally, p30) An asymmetric PPS. The same as the SPPS, but with the two halves 15 generations out of phase with one another. Found by Alan Hensel in May 1998.

:ark A pair of mutually stabilizing switch engines. The archetype is Noah's ark. The diagram below shows an ark found by Nick Gotts that takes until generation 736692 to stabilize, and can therefore be considered as a methuselah.

...........................O....
............................O...
.............................O..
............................O...
...........................O....
.............................OOO
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
OO..............................
..O.............................
..O.............................
...OOOO.........................

:arm A long extension, sometimes also called a "wing", hanging off from the main body of a spaceship or puffer perpendicular to the direction of travel. For example, here is a sparking c/3 spaceship which contains two arms.

............OOO............
...........O...............
..........OO...............
....O.OO..OO..OOO..........
...OO.OO.OO.....O....OO....
..O..OO...O.OO....OO.OO....
........OOOO......OO...O...
....O.O.OO........OO.......
......O....................
...OO......................
..OO..O....................
....OOO.OO.................
O..O.....OOO...............
.O.OOOO.O...O..............
........OO....O......O.....
.........O....OO....OO.OOO.
........O...O..OO..OO.....O
..........O..O.O..O.....OO.
...........O.OOO....O......
............OOO..OOO.O.....
...........OO...OOO........
..................O..O.....
...................O.......
Many known spaceships have multiple arms, usually fairly narrow. This is an artefact of the search methods used to find such spaceships, rather than an indication of what a "typical" spaceship might look like.

For an alternate meaning see construction arm.

:armless A method of generating slow salvos across a wide range of lanes without using a construction arm with a movable elbow. Instead, streams of gliders on two fixed opposing lanes collide with each other to produce clean 90-degree output gliders. Slowing down one of the streams by 8N ticks will move the output lanes of the gliders toward the source of that stream by N full diagonals. This construction method was used to create the supporting slow salvos in the half-baked knightships, and also in the Parallel HBK gun.

:ash The stable or oscillating objects left behind when a chaotic reaction stabilizes, or "burns out". Experiments show that for random soups with moderate initial densities (say 0.25 to 0.5) the resulting ash has a density of about 0.0287. (This is, of course, based on what happens in finite fields. In infinite fields the situation may conceivably be different in the long run because of the effect of certain initially very rare objects such as replicators.)

:asynchronous Indicates that precise relative timing is not needed for two or more input signals entering a circuit, or two or more sets of gliders participating in a glider synthesis. In some cases the signals or sets of gliders can arrive in any order at all - i.e., they have non-overlapping effects.

However, in some cases such as slow salvo constructions, there is a required order for some of the incoming signals. These signals can still be referred to as "asynchronous" because the number of ticks between them is infinitely adjustable: arbitrarily long delays can be added with no change to the final result. Compare synchronized.

:aVerage (p5) Found by Dave Buckingham, 1973. The average number of live rotor cells is five (V), which is also the period.

...OO........
....OOO......
..O....O.....
.O.OOOO.O....
.O.O....O..O.
OO.OOO..O.O.O
.O.O....O..O.
.O.OOOO.O....
..O....O.....
....OOO......
...OO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_x.htm0000755000175000017500000000674313317135606016431 00000000000000 Life Lexicon (X)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:x66 (c/2 orthogonally, p4) Found by Hartmut Holzwart, July 1992. Half of this can be escorted by an HWSS. The name refers to the fact that every cell (live or dead) has at most 6 live neighbours (in contrast to spaceships based on LWSS, MWSS or HWSS). In fact this spaceship was found by a search with this restriction.

..O......
OO.......
O..OOO..O
O....OOO.
.OOO..OO.
.........
.OOO..OO.
O....OOO.
O..OOO..O
OO.......
..O......

:Xlife A popular freeware Life program that runs under the X Window System. The main Life code was written by Jon Bennett, and the X code by Chuck Silvers.

:X-pentomino Conway's name for the following pentomino, a traffic light predecessor.

.O.
OOO
.O.

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_g.htm0000755000175000017500000016422313317135606016406 00000000000000 Life Lexicon (G)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:G4 receiver An alternate Herschel receiver discovered by Sergei Petrov on 28 December 2011, using his previous glider to 2 blocks converter. In the pattern below the Herschel output is marked by a ghost Herschel. A glider also escapes to the northwest. For an explanation of the "G4" describing the tandem glider input, see Gn.

................................O.O.......................
................................OO........................
.................................O........................
..........................................................
..........................................................
..........................................................
..........................................................
................OO........................................
................OO....................O...................
...........................O.O......OOO...................
...........................OO......O......................
............................O......OO.....................
..........................................................
..........................................................
..........................................................
OO........................................................
OO........................................................
......................................OO...............O..
...........OO.........................OO...............O..
...........OO..........................................OOO
.......................OO................................O
........O..........OO..OO.................................
......OOO..........OO.....................................
.....O....................................................
.....OO........................OO.........................
.................OO............O..........................
.................OO......O......OOO.......................
........................O.O.......O.......................
.........................O................................

:Gabriel's p138 (p138) The following oscillator found by Gabriel Nivasch in October 2002.

.......OOO.....
......O..O.....
.......O...O...
..O.....OOO....
...O.....O.....
OO.OO..........
O..O.........O.
O.O.........O.O
.O.........O..O
..........OO.OO
.....O.....O...
....OOO.....O..
...O...O.......
.....O..O......
.....OOO.......

:galaxy = Kok's galaxy

:Game of Life = Life

:Game of Life News A blog reporting on new Life discoveries, started by Heinrich Koenig in December 2004, currently found at http://pentadecathlon.com/lifenews/.

:Garden of Eden A configuration of ON and OFF cells that can only occur in generation 0. (This term was first used in connection with cellular automata by John W. Tukey, many years before Life.) It was known from the start that there are Gardens of Eden in Life, because of a theorem by Edward Moore that guarantees their existence in a wide class of cellular automata. Explicit examples have since been constructed, the first by Roger Banks, et al. at MIT in 1971. This example was 9 x 33. In 1974 J. Hardouin-Duparc et al. at the University of Bordeaux 1 produced a 6 x 122 example. The following shows a 12 x 12 example found by Nicolay Beluchenko in February 2006, based on a 13 x 12 one found by Achim Flammenkamp in June 2004.

..O.OOO.....
OO.O.OOOOO.O
O.O.OO.O.O..
.OOOO.O.OOO.
O.O.OO.OOO.O
.OOO.OO.O.O.
..O...OOO..O
.O.OO.O.O.O.
OOO.OOOO.O.O
OO.OOOO...O.
.O.O.OO..O..
.OO.O..OO.O.

Below is a 10x10 Garden of Eden found by Marijn Heule, Christiaan Hartman, Kees Kwekkeboom, and Alain Noels in 2013 using SAT-solver techniques. An exhaustive search of 90-degree rotationally symmetric 10x10 patterns was possible because the symmetry reduces the number of unknown cells by a factor of four.

.O.OOO.O..
..O.O.O..O
O.OOO..OO.
.O.OOOOO.O
O..O..OOOO
OOOO..O..O
O.OOOOO.O.
.OO..OOO.O
O..O.O.O..
..O.OOO.O.

Steven Eker has since found several asymmetrical Gardens of Eden that are slightly smaller than this in terms of bounding box area. Patterns have also been found that have only Garden of Eden parents. For related results see grandparent.

:Gemini ((5120,1024)c/33699586 obliquely, p33699586) The first self-constructing spaceship, and also the first oblique spaceship. It was made public by Andrew Wade on 18 May 2010. It was the thirteenth explicitly constructed spaceship velocity in Life, and made possible an infinite family of related velocities. The Gemini spaceship derives its name from the Latin "gemini", meaning twins, describing its two identical halves, each of which contains three Chapman-Greene construction arms. A tape of gliders continually relays between the two halves, instructing each to delete its parent and construct a daughter configuration.

:Gemini puffer See Pianola breeder.

:Geminoid A type of self-constructing circuitry that borrows key ideas from Andrew Wade's Gemini spaceship, but with several simplifications. The main feature common to the Gemini spaceship is the construction recipe encoding method. Information is stored directly, and much more efficiently, in the timings of moving gliders, rather than in a static tape with 1s and 0s encoded by the presence of small stationary objects.

Unlike the original Gemini, Geminoids have ambidextrous construction arms, initially using glider pairs on two lanes separated by 9hd, 10hd, or 0hd. The design was the basis for the linear propagator and the Demonoids. A more recent development is a Geminoid toolkit using a single-channel construction arm, which allows for the possibility of multiple elbows with no loss of efficiency, or the construction of temporary lossless elbows. Compare slow elbow.

Other new developments that could be considered part of the extended "Geminoid" toolkit include freeze-dried construction salvos and seeds, used when objects must be built within a short time window, and self-destruct circuits, which are used as an alternative to a destructor arm to clean up temporary objects in a similarly short window.

:generation The fundamental unit of time. The starting pattern is generation 0.

:germ (p3) Found by Dave Buckingham, September 1972.

....OO....
.....O....
...O......
..O.OOOO..
..O....O..
.OO.O.....
..O.O.OOOO
O.O.O....O
OO...OOO..
.......OO.

:gfind A program by David Eppstein which uses de Bruijn graphs to search for new spaceships. It was with gfind that Eppstein found the weekender, and Paul Tooke later used it to find the dragon. It is available at http://www.ics.uci.edu/~eppstein/ca/gfind.c (C source code only).

Compare lifesrc.

:ghost Herschel A dying spark made by removing one cell from the Herschel heptomino. This particular spark has the advantage that, when placed in a conduit to mark the location of an input or output Herschel, it disappears cleanly without damaging adjacent catalysts, even in dependent conduits with a block only two cells away.

O..
O..
OOO
..O

:GIG A glider injection gate. This is a device for injecting a glider into a glider stream. The injected glider is synthesized from one or more incoming spaceships assisted by the presence of the GIG. (This contrasts with some other glider injection reactions which do not require a GIG, as in inject.) Gliders already in the glider stream pass through the GIG without interfering with it. A GIG usually consists of a small number of oscillators.

For example, in July 1996 Dieter Leithner found the following reaction which allows the construction of a pseudo-period 14 glider stream. It uses two LWSS streams, a pentadecathlon and a volcano.

.O...........................
..O..........OO..............
OOO.........OOO..............
............OO.O.............
.....O.......OOO.............
...O.O........O..............
....OO.......................
.............................
......................OOOO...
.....................OOOOOO..
....................OOOOOOOO.
............O......OO......OO
...OO.....O.O.......OOOOOOOO.
.OO.OO.....OO........OOOOOO..
.OOOO..........O......OOOO...
..OO............O............
..............OOO............
.............................
.............................
.............................
.....OOOOOOO.................
...OOO.OOO.OOO...............
..O....OOO....O..............
...OOOO.O.OOO.O..............
.............O...............
..O.OO.O.O.O.................
..OO.O.O.O.OO................
......O..O.O.................
.......OO..O.................
...........OO................

Glider injection gates are useful for building glider guns with pseudo-periods that are of the form nd, where n is a positive integer, and d is a proper divisor of some convenient base gun period (such as 30 or 46), with d > 13.

:glasses (p2) Compare scrubber and spark coil.

....O........O....
..OOO........OOO..
.O..............O.
.O..OOO....OOO..O.
OO.O...O..O...O.OO
...O...OOOO...O...
...O...O..O...O...
....OOO....OOO....
..................
....OO.O..O.OO....
....O.OO..OO.O....

:glider (c/4 diagonally, p4) The smallest, most common and first discovered spaceship. This was found by Richard Guy in 1970 while Conway's group was attempting to track the evolution of the R-pentomino. The name is due in part to the fact that it is glide symmetric. (It is often stated that Conway discovered the glider, but he himself has said it was Guy. See also the cryptic reference ("some guy") in Winning Ways.)

OOO
O..
.O.
The term "glider" is also occasionally (mis)used to mean "spaceship".

:glider-block cycle An infinite oscillator based on the following reaction (a variant of the rephaser). The oscillator consists of copies of this reaction displaced 2n spaces from one another (for some n>6) with blocks added between the copies in order to cause the reaction to occur again halfway through the period. The period of the resulting infinite oscillator is 8n-20. (Alternatively, in a cylindrical universe of width 2n the oscillator just consists of two gliders and two blocks.)

...OO...
...OO...
........
........
..O..O..
O.O..O.O
.OO..OO.

:glider constructible See glider synthesis.

:glider construction = glider synthesis.

:glider duplicator Any reaction in which one input glider is converted into two output gliders. This can be done by oscillators or spaceships, or by Herschel conduits or other signal circuitry such as the stable example shown under splitter. The most useful glider duplicators are those with low periods.

The following period 30 glider duplicator demonstrates a simple mechanism found by Dieter Leithner. The input glider stream comes in from the upper left, and the output glider streams leave at the upper and lower right. One of the output glider streams is inverted, so an inverting reflector is required to complete the duplicator. To produce non-parallel output, an inline inverter could be substituted for the northmost p30 glider gun.

.......O....OO.......................OO.........
........O....O.......................OO.........
......OOO....O.O.......O..........OO......O...OO
..............OO.......O.O.......OOO.....O...O.O
..........................OO......OO......OOOOO.
..........................OO.........OO....OOO..
..........................OO.........OO.........
.......................O.O......................
.......................O........................
................................................
................................................
........................OO......................
........................OO......................
................................................
................................................
................................................
.........................OOO....................
...........................O....................
..........................O.....................
................................................
................................................
.........O.O....................................
.......O...O.....OOO............................
OO.....O.......O.O..O..OO.......................
OO....O....O.......OO..O..O.....................
.......O...................O....................
.......O...O..OOO..........O....................
.........O.O...............O....................
.......................O..O.....OO..............
.......................OO.......O.O.............
..................................O.............
..................................OO............

Spaceship convoys that can duplicate gliders are very useful since they (along with glider turners) provide a means to clean up many dirty puffers by duplicating and turning output gliders so as to impact into the exhaust to clean it up.

Glider duplicators and turners are known for backward gliders using p2 c/2 spaceships, and for forward gliders using p3 c/3 spaceships. These are the most general duplicators for these speeds.

:glider gun A gun that fires gliders. For examples, see Gosper glider gun, Simkin glider gun, new gun, p45 gun.

True-period glider guns are known for some low periods, and for all periods over 53 using Herschel conduit technology. See true for a list of known true-period guns. The lowest true-period gun possible is the p14 gun since that is the lowest possible period for any glider stream, but no example has yet been found.

Pseudo-period glider guns are known for every period above 13. These are made by using multiple true-period guns of some multiple of the period, and glider injection methods to fill in the gaps.

:glider injection gate = GIG

:glider lane See lane.

:gliderless A gun is said to be gliderless if it does not use gliders. The purist definition would insist that a glider does not appear anywhere, even incidentally. For a long time the only known way to construct LWSS, MWSS and HWSS guns involved gliders, and it was not until April 1996 that Dieter Leithner constructed the first gliderless gun (a p46 LWSS gun).

In October 2017 Matthias Merzenich used two copies of Tanner's p46 to create a p46 MWSS gun. This is the smallest known gliderless gun, and also the smallest known MWSS gun.

......O.................................
......OOO...............................
.........O..............................
........OO..............................
.....O..................................
...OOO..................................
..O.....................................
..OO....................................
........................................
..OO.......O.O..O.O.....................
..O.O......O..O...O.....................
...O.....OO...O.O.O.....................
OOO.......OOO.O.........................
O......OO.....OO........OOO.............
.......OO....OO........O...O............
.......OO...O.........O.....O...........
.......OO.O.O........O...O...O..........
.......OO.O.O........O.......O.....OO...
.....................O.O...O.O.....OO...
.................OO...OO...OO...........
..........OO....O.O.....................
......OO..OO....O...................OO..
.....O.O.......OO...................O...
.....O.............OO................OOO
....OO..............O....O.............O
....................O.O.O.O.............
.....................OO.OO.O............
...........................O............
...........................OO...........

:glider pair Two gliders travelling in the same direction with a specific spacetime offset. In a transceiver the preferred term is tandem glider. For several years, glider pairs on lanes separated by 9 or 10 half diagonals were the standard building blocks in Geminoid construction arm recipes. In more recent 0hd and single-channel construction toolkits, all gliders share the same lane, but glider pairs and singletons are still important concepts.

:glider-producing switch engine See stabilized switch engine.

:glider pusher An arrangement of a queen bee shuttle and a pentadecathlon that can push the path of a passing glider out by one half-diagonal space. This was found by Dieter Leithner in December 1993 and is shown below. It is useful for constructing complex guns where it may be necessary to produce a number of gliders travelling on close parallel paths. See also edge shooter.

.........OO..............
.........OO..............
.........................
..........O..............
.........O.O.............
.........O.O.............
..........O..............
.........................
.........................
.......OO.O.OO...........
.......O.....O...........
........O...O............
.O.......OOO.............
..O......................
OOO......................
.........................
.........................
.................O....O..
...............OO.OOOO.OO
.................O....O..

:glider recipe = glider synthesis.

:glider reflector See reflector.

:gliders by the dozen (stabilizes at time 184) In early references this is usually shown in a larger form whose generation 1 is generation 8 of the form shown here.

OO..O
O...O
O..OO

:glider stopper A Spartan logic circuit discovered by Paul Callahan in 1996. It allows a glider signal to pass through the circuit, leaving behind a beehive that can cleanly absorb a single glider from a perpendicular glider stream. Two optional glider outputs are also shown. The circuit can't be re-used until the beehive "bit" is cleared by the passage of at least one perpendicular input. A similar mechanism discovered more recently is shown in the beehive stopper entry.

.O...........................................
..O..........................................
OOO..........................................
.............................................
.............................................
...................................O.........
..................................O..........
..................................OOO........
.............................................
...............................O.............
...............................O.O...........
...................OO..........OO............
...................OO........................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
...................OO........................
..................O..O.......................
...................OO........................
..........................OO.................
..........................OO.................
...........................................OO
........OO.................................O.
.......O.O...............................O.O.
.......O.................................OO..
......OO.....................................
.............................................
.............................................
.............................................
.................OO..........................
................O.O..........................
................O............................
...............OO............................

:glider synthesis Construction of an object by means of glider collisions. It is generally assumed that the gliders should be arranged so that they could come from infinity. That is, gliders should not have had to pass through one another to achieve the initial arrangement.

Glider syntheses for all still lifes and known oscillators with at most 14 cells were found by Dave Buckingham. As of June 2018, this limit has been increased to 18 cells.

Perhaps the most interesting glider syntheses are those of spaceships, because these can be used to create corresponding guns and rakes. Many of the c/2 spaceships that are based on standard spaceships have been synthesized, mostly by Mark Niemiec. In June 1998 Stephen Silver found syntheses for some of the Corderships (although it was not until July 1999 that Jason Summers used this to build a Cordership gun). In May 2000, Noam Elkies suggested that a 2c/5 spaceship found by Tim Coe in May 1996 might be a candidate for glider synthesis. Initial attempts to construct a synthesis for this spaceship got fairly close, but it was only in March 2003 that Summers and Elkies managed to find a way to perform the crucial last step. Summers then used the new synthesis to build a c/2 forward rake for the 2c/5 spaceship; this was the first example in Life of a rake which fires spaceships that travel in the same direction as the rake but more slowly.

A 3-glider synthesis of a pentadecathlon is shown in the diagram below. This was found in April 1997 by Heinrich Koenig and came as a surprise, as it was widely assumed that anything using just three gliders would already be known.

......O...
......O.O.
......OO..
..........
OOO.......
..O.......
.O.....OO.
........OO
.......O..

:glider to 2 blocks A converter discovered by Sergei Petrov on 8 October 2011, used in his later G4 receiver.

..........O.......OO
OO......O.O.......OO
OO.......OO.........
....................
....................
....................
...........OO.......
...........OO.......
....................
....................
..............OO....
...............O....
...............O.O..
................OO..
....................
....................
....................
........OO..........
........OO..........

:glider to block A converter discovered by Sergei Petrov that places a block at its right edge in response to a single glider input. This has a variety of uses in Herschel circuitry and other signal-processing applications.

...........O....
.....O.....OOO..
.....OOO......O.
........O....OO.
.......OO.......
................
................
................
................
................
OO..............
OO..........OO..
............O.O.
.............O..
................
................
................
............OO..
..OOO.......O...
....O........OOO
...O...........O

:glider train A certain p64 c/2 orthogonal puffer that produces two rows of blocks and two backward glider waves. Ten of these were used to make the first breeder.

..............................O............
...............................O...........
.........................O.....O...........
....O.....................OOOOOO.....OOOOOO
.....O..............................O.....O
O....O....................................O
.OOOOO..............................O....O.
......................................OO...
...........................................
.....................................O.....
....................................O......
...................................OO...OO.
...................................O.O...OO
....................................O...OO.
........................................O..
...........................................
........................................O..
....................................O...OO.
...................................O.O...OO
...................................OO...OO.
....................................O......
.....................................O.....
...........................................
......................................OO...
.OOOOO..............................O....O.
O....O....................................O
.....O..............................O.....O
....O.....................OOOOOO.....OOOOOO
.........................O.....O...........
...............................O...........
..............................O............

:glider turner Any reaction in which a glider is turned onto a new path by a spaceship, oscillator, or still life constellation. In the last two cases, the glider turner is usually called a reflector if the reaction is repeatable, or a one-time turner if the reaction can only happen once.

Glider turners are easily built using standard spaceships. The following diagram shows a convoy which turns a forward glider 90 degrees, with the new glider also moving forwards.

.........OO.........
........OO.OOOO.....
.O.......OOOOOO.....
O.........OOOO......
OOO.................
....................
....................
....................
....................
...O................
.O...O..............
O...................
O....O..............
OOOOO...............
....................
....................
.............OOOOOO.
.............O.....O
.............O......
..............O....O
................OO..
Small rearrangements of the back two spaceships can alternatively send the output glider into any of the other three directions.

See also glider duplicator and reflector.

:glide symmetric Undergoing simultaneous reflection and translation. A glide symmetric spaceship is sometimes called a flipper.

:Gn An abbreviation specific to converters that produce multiple gliders. A "G" followed by any integer value means that the converter produces a tandem glider - two parallel glider outputs with lanes separated by the specified number of half diagonals.

:gnome = fox

:GoE = Garden of Eden

:GoL = Game of Life

:Golly A cross-platform open source Life program by Andrew Trevorrow and Tomas Rokicki. Unlike most Life programs it includes the ability to run patterns using the hashlife algorithm. It is available from http://golly.sourceforge.net.

:Gosper glider gun The first known gun, and indeed the first known finite pattern displaying infinite growth, found by Bill Gosper in November 1970. This period 30 gun remains the smallest known gun in terms of its bounding box, though some variants of the p120 Simkin glider gun have a lower population. Gosper later constructed several other guns, such as new gun and the p144 gun shown under factory. See also p30 gun.

........................O...........
......................O.O...........
............OO......OO............OO
...........O...O....OO............OO
OO........O.....O...OO..............
OO........O...O.OO....O.O...........
..........O.....O.......O...........
...........O...O....................
............OO......................

:Gotts dots A 41-cell 187x39 superlinear growth pattern found by Bill Gosper in March 2006, who named it in honour of Nick Gotts, discoverer of many other low-population superlinear patterns, such as Jaws, the mosquitoes, teeth, catacryst and metacatacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

Collisions within the pattern cause it to sprout its Nth switch engine at generation T = ~224n-6. The population of the pattern at time t is asymptotically proportional to t times log(t), so the growth rate is O(t ln(t)), faster than linear growth but slower than quadratic growth.

:gourmet (p32) Found by Dave Buckingham in March 1978. Compare with pi portraitor and popover.

..........OO........
..........O.........
....OO.OO.O....OO...
..O..O.O.O.....O....
..OO....O........O..
................OO..
....................
................OO..
O.........OOO..O.O..
OOO.......O.O...O...
...O......O.O....OOO
..O.O..............O
..OO................
....................
..OO................
..O........O....OO..
....O.....O.O.O..O..
...OO....O.OO.OO....
.........O..........
........OO..........

:gp = glider pair

:GPSE = glider-producing switch engine

:grammar A set of rules for connecting components together to make an object such as a spaceship, oscillator or still life. For example, in August 1989 Dean Hickerson found a grammar for constructing an infinite number of short wide c/3 period 3 spaceships, using 33 different components and a table showing the ways that they can be joined together.

:grandfather = grandparent

:grandfatherless A traditional name for a pattern with one or more parents but no grandparent. This was a hypothetical designation until May 2016. See grandparent for details.

:grandparent A pattern is said to be a grandparent of the pattern it gives rise to after two generations. For over thirty years, a well-known open problem was the question of whether any pattern existed that had a parent but no grandparent. In 1972, LifeLine Volume 6 mentioned John Conway's offer of a $50 prize for a solution to the problem, but it remained open until May 2016 when a user with the conwaylife.com forum handle 'mtve' posted an example.

Other patterns have since been found that have a grandparent but no great-grandparent, or a great-grandparent but no great-great-grandparent. Further examples in this series almost certainly exist, but as of July 2018 none have yet been found.

:Gray counter (p4) Found in 1971. If you look at this in the right way you will see that it cycles through the Gray codes from 0 to 3. Compare with R2D2.

......O......
.....O.O.....
....O.O.O....
.O..O...O..O.
O.O.O...O.O.O
.O..O...O..O.
....O.O.O....
.....O.O.....
......O......

:gray ship = grey ship

:great on-off (p2)

..OO....
.O..O...
.O.O....
OO.O..O.
....OO.O
.......O
....OOO.
....O...

:grey counter = Gray counter (This form is erroneous, as Gray is surname, not a colour.)

:grey ship A spaceship that contains a region with an average density of 1/2, and which is extensible in such a way that the region of average density 1/2 can be made larger than any given square region.

See also with-the-grain grey ship, against-the-grain grey ship and hybrid grey ship.

:grin The following common parent of the block. This name relates to the infamous Cheshire cat. See also pre-block.

O..O
.OO.

:grow-by-one object A pattern whose population increases by one cell every generation. The smallest known grow-by-one object is the following 44-cell pattern (David Bell's one-cell improvement of a pattern found by Nicolay Beluchenko, September 2005).

........OO.......
.......OO........
.........O.......
...........OO....
..........O......
.................
.........O..OO...
.OO.....OO....O..
OO.....O.....O...
..O....O.O...OO..
....O..O....OO.O.
....OO.......OO..
........O....O.OO
.......O.O..O.OO.
........O........

:growing/shrinking line ship A line ship in which the line repeatedly grows and shrinks, resulting in a high-period spaceship.

:growing spaceship An object that moves like a spaceship, except that its front part moves faster than its back part and a wick extends between the two. Put another way, a growing spaceship is a puffer whose output is burning cleanly at a slower rate than the puffer is producing it. Examples include blinker ships, pi ships, and some wavestretchers.

:G-to-H A converter that takes a glider as an input signal and produces a Herschel output, which can then be used by other conduits. G-to-Hs are frequently used in stable logic circuitry. Early examples include Callahan G-to-H, Silver G-to-H, and p8 G-to-H for periodic circuits. A more compact recent example is the syringe.

:gull = elevener

:gun Any stationary pattern that emits spaceships (or rakes) forever. For examples see double-barrelled, edge shooter, factory, gliderless, Gosper glider gun, Simkin glider gun, new gun and true.

:gunstar Any of a series of glider guns of period 144+72n (for all non-negative integers n) constructed by Dave Buckingham in 1990 based on his transparent block reaction and Robert Wainwright's p72 oscillator (shown under factory).

:gutter A single straight line of cells along the axis of symmetry of a mirror-symmetric pattern. Most commonly this is an orthogonal line, and the pattern is then odd-symmetric (as opposed to even-symmetric, where the axis of symmetry follows the boundary between two rows or columns of cells).

The birth rule for Conway's Life trivially implies that if there are no live cells in the gutter of a symmetric pattern, new cells can never be born there. For examples, see 44P5H2V0, 60P5H2V0, Achim's p4, brain, c/6 spaceship, centinal, p54 shuttle, pufferfish, snail, spider, and pulsar (in two orientations).


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_e.htm0000755000175000017500000011275513317135606016407 00000000000000 Life Lexicon (E)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:early universe Conway's somewhat confusing term for sparse Life.

:eater Any still life that has the ability to interact with certain patterns without suffering any permanent damage. (If it doesn't suffer even temporary damage then it may be referred to as a rock.) The eater1 is a very common eater, and the term "eater" is often used specifically for this object. Other eaters include eater2, eater3, eater4, and eater5, and many hundreds of others are known. Below is a complex eater found by Dean Hickerson in 1998 using his dr search program. It takes 25 ticks to recover after feasting on a glider:

.O.............
..O............
OOO............
......OO.OO.O..
.......O.O.OO..
.......O.O.....
........OO.....
OO.............
O..O.OO........
..OO.O.........
...O.O.....OO.O
..O..OOO...O.OO
...OO...O......
.....OOOO......
.....O.........
...O.O.OO......
...OO..O.......
.......O.O.....
........OO.....

Some common still lifes can act as eaters in some situations, such as the block, ship, and tub. In fact the block was the first known eater, being found capable of eating beehives from a queen bee.

:eater1 (p1) Usually simply called an eater, and also called a fishhook.

OO..
O...
.OOO
...O

This eater can be constructed using a simple two-glider collision, as shown in stamp collection. It is often modified in various ways, or welded to other objects, to allow tighter packing of circuits or to allow a signal stream to pass close by. See clearance for an eater1 variant that is 1hd shorter to the southeast than the standard fishhook form. An eater1 can also be used as a 90-degree one-time turner.

Its ability to eat various objects was discovered by Bill Gosper in 1971. The fishhook eater can consume a glider, a LWSS, and a MWSS as shown below. It is not able to consume an HWSS, however. See honey bit or killer toads for that.

...........................OO
...........................O.
..O......................O.O.
O...O.........O..........OO..
.....O.........O.............
O....O.....O...O.....OOO.....
.OOOOO......OOOO.......O.....
......................O......

:eater2 (p1) This eater was found by Dave Buckingham in the 1970s. Mostly it works like the ordinary eater1 but with two slight differences that make it useful despite its size: it takes longer to recover from each bite, and it can eat objects appearing at two different positions.

OO.O...
OO.OOO.
......O
OO.OOO.
.O.O...
.O.O...
..O....
The first property means that, among other things, it can eat a glider in a position that would destroy an eater1. This novel glider-eating action is occasionally of use in itself, and combined with the symmetry means that an eater2 can eat gliders travelling along four adjacent glider lanes, as shown below.

The following eater2 variant (Stephen Silver, May 1998) can be useful for obtaining smaller bounding boxes. A more compact variant with the same purpose can be seen under gliderless.

.O.................
..O................
OOO................
...................
....O..............
.....O.............
...OOO.............
...................
.......O...........
........O..........
......OOO..........
...................
..........O........
...........O.....OO
.........OOO......O
.............OO.O..
.............OO.OO.
...................
.............OO.OO.
..............O.O..
..............O.O..
...............O...

:eater3 (p1) This large symmetric eater, found by Dave Buckingham, has a very different eating action from the eater1 and eater2. The loaf can take bites out things, being flipped over in the process. The rest of the object merely flips it back again.

.........OO.
....OO..O..O
.O..O....O.O
O.O.O.....O.
.O..O.OO....
....O..O....
.....O....O.
......OOOOO.
............
........O...
.......O.O..
........O...

:eater4 (p1) Another eater by Dave Buckingham, which he found in 1971, but did not recognize as an eater until 1975 or 1976. It can't eat gliders, but it can be used for various other purposes. The four NE-most centre cells regrow in a few generations after being destroyed by taking a bite out of something, such as suppressing half of a developing traffic light as it does in the p29 pentadecathlon hassler.

...OO.........
...O..........
OO.O..........
O..OO.........
.OO....O......
...OOOOO......
...O....OO....
....OO..O.....
......O.O.....
......O.O.O..O
.......OO.OOOO
.........O....
.........O.O..
..........OO..

:eater5 (p1) A compound eater that can eat gliders coming from two different directions. Also called the tub-with-tail eater (TWIT), it is often placed along the edges of glider lanes to suppress unwanted gliders in conduits. Below is the standard form, a compact form with a long hook, and an often-useful conjoined form found with Bellman. The sidesnagger is a Spartan constellation that has a similar glider-absorbing function, using a loaf. See also 7x9 eater.

.O.........O.........O...........
..O.........O.........O..........
OOO.......OOO.......OOO..........
.................................
......O.........O.........O......
.....O.........O.........O.......
.....OOO.......OOO.......OOO.....
.................................
..........OO.....................
......O...OO....O...OO....O...OO.
.....O.O.......O.O...O...O.O...O.
....O.O.......O.O...O....OO...O..
....O.........O....O.........O...
...OO........OO.....OOO..OOOOO.O.
......................O..O....O.O
...........................O..O.O
..........................OO...O.

With gliders from either direction, the eater5's eating reaction creates a spark that can be used to reflect other gliders. See the example pattern in duoplet, or advance any of the topmost three gliders in the above pattern by two ticks.

:eater/block frob (p4) Found by Dave Buckingham in 1976 or earlier.

.OO.......
..O.......
..O.O.....
...O.O....
.....OO.OO
........OO
..OO......
...O......
OOO.......
O.........

:eater-bound pond = biting off more than they can chew

:eater-bound Z-hexomino = pentoad

:eater eating eater = two eaters

:eater plug (p2) Found by Robert Wainwright, February 1973.

.......O
.....OOO
....O...
.....O..
..O..O..
.O.OO...
.O......
OO......

:eaters plus = French kiss

:ecologist (c/2 orthogonally, p20) This consists of the classic puffer train with a LWSS added to suppress the debris. See also space rake.

OOOO.....OO........
O...O...OO.OO......
O........OOOO......
.O..O.....OO.......
...................
.....O.........OO..
...OOO........OOOOO
..O...O.....O....OO
..O....OOOOO.....OO
..OO.O.OOOO....OO..
....O...OO.OOO.....
.....O.O...........
...................
...................
OOOO...............
O...O..............
O..................
.O..O..............

:edge-repair spaceship A spaceship which has an edge that possesses no spark and yet is able to perturb things because of its ability to repair certain types of damage to itself. The most useful examples are the following two small p3 c/3 spaceships:

..................................O.....
........O.......................OOO.OOO.
.......OOOO....................OO......O
..O...O...OO.OO...........O...O..O...OO.
.OOOO.....O..OO..........OOOO...........
O...O.......O..O........O...O...........
.O.O..O..................O.O..O.........
.....O.......................O..........
These were found by David Bell in 1992, but the usefulness of the edge-repair property wasn't recognised until July 1997. The following diagram (showing an edge-repair spaceship deleting a Herschel) demonstrates the self-repairing action.
................O.......
O..............OOOO.....
O.O.......O...O...OO.OO.
OOO......OOOO.....O..OO.
..O.....O...O.......O..O
.........O.O..O.........
.............O..........
In October 2000, David Bell found that a T-tetromino component of a c/4 spaceship can also be self-repairing. Stephen Silver noticed that it could be used to delete beehives and, in November 2000, found the smallest known c/4 spaceship with this edge-repair component - in fact, two copies of the component:
.OO..........................
O..O.........................
.OO..........................
.............................
.......O.O...................
.......O.....................
.......O.O..O..O.............
..........O..................
...........O.OO.O............
............OOO.O............
...........O....O..O.OO......
........O...OO...O.OOOO......
........OO..O..O.OO....O....O
........O........OO....O..OOO
.............OO...OO...O..OO.
.OO..........................
O..O.........................
.OO..........................

:edge shooter A gun or signal circuit that fires its gliders (or whatever) right at the edge of the pattern, so that it can be used to fire them closely parallel to others. This is useful for constructing complex guns. Compare glider pusher, which can in fact be used for making edge shooters.

The following diagram shows a p46 edge shooter found by Paul Callahan in June 1994.

OO............OO..O....OO..OO.............
OO............O.OO......OO.OO.............
...............O......O.O.................
...............OOO....OO..................
..........................................
...............OOO....OO..................
...............O......O.O.................
OO............O.OO......OO................
OO............OO..O....OO.................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OOO...OOO..
..............................O...O.O...O.
.............................O...OO.OO...O
.............................O.OO.....OO.O
...............................O.......O..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OO.....OO..
...............................OO.....OO..

Stable edge shooters became possible with the development of Herschel circuitry. For example, NW31, BNE14T30, RNE-19T84, and the high-clearance Fx119 inserter are often used in shotguns for complex salvos. Composite edge-shooter circuits with arbitrarily high clearance can be constructed.

:edge spark A spark at the side of a spaceship that can be used to perturb things as the spaceship passes by.

:edge sparker A spaceship that produces one or more edge sparks.

:edgy In slow salvo terminology, an edgy glider construction recipe is one that places its final product at or very near the edge of its construction envelope. Similarly, an edgy factory will place its output object in an accessible location near the edge of its reaction envelope.

:egg = non-spark. This term is no longer in use.

:E-heptomino Name given by Conway to the following heptomino.

.OOO
OO..
.OO.

:elbow Depending on context, this term may refer to a signal elbow or a construction elbow. See also elbow ladder.

:elbow ladder Scot Ellison's name for the type of pattern he created in which one or more gliders shuttle back and forth (using the kickback reaction) deleting the output gliders from a pair of slide guns.

:elbow operation A recipe, usually a salvo of gliders travelling on one or more construction lanes, that collides with an elbow constellation and performs one of the standard transformations on it: push, pull, or fire for simple construction arms, along with possible construct, duplicate-elbow, or delete-elbow ops for more complicated systems. See construction elbow.

:electric fence (p5) A stabilization of ants. Dean Hickerson, February 1993.

..........O..................................................
.........O.O........................OO.......................
..O....OOO.O.....O...................O...O..O......O.....OO..
.O.O..O....OO...O.O..................O.OOO..OOO...O.O....O...
.O.O..O.OO.......O....................O...OO...O.O..O......O.
OO.OO.O.O.OOOOO.....O..................OO...O..O.O.OO.OO..OO.
.O.O..O...O..O..O.......OO...OO...OO....OO.OO..O.O..O.O.O....
.O..OO....OO......OOO.OO...OO...OO...OOO.....OOOO.OOO.O...OO.
..O..OOO..O..O.OOOO...OO...OO...OO...OOO.OO..O....O.O....O..O
...OO...O.O..O.....OO...OO...OO...OO......O............O...OO
.....OO.O.OO.O.OO..O......................O........OO.O......
.....O.OO.O..O.OO....O.................OO.O.O................
...........OO.......OO..................O..OO................
......................................O.O....................
......................................OO.....................

:elementary Not reducible to a combination of smaller parts. Elementary spaceships in particular are usually those found by search programs, and they can't be subdivided into smaller spaceships, tagalongs, and supporting reactions, as contrasted with engineered macro-spaceships.

:elementary conduit A conduit with no recognizable active signal stage besides its input and output. An early example still very commonly used is Buckingham's BFx59H, which transforms a B-heptomino into an inverted Herschel in 59 ticks. The BFx59H elementary conduit is a component in many of the original universal toolkit of Herschel conduits. An extension of the same naming convention is used for elementary conduits, with the first and last letters of the name specifying the input and output signal objects. As with Herschels, an arbitrary orientation and center point is chosen for each object. "Fx" means the signal moves forward and produces a mirror-image output. See Herschel conduit for further details.

Theoretically an elementary conduit may become a composite conduit, if another conduit can be found that shares the beginning or end of the conduit in question. In practice this happens only rarely, because many of the most likely branch points have already been identified: glider (G), LWSS (L) or MWSS (M), Herschel (H), B-heptomino (B), R-pentomino (R), pi-heptomino (P), queen bee shuttle (Q), century or bookend (C), dove (D), and wing (W). A Herschel descendant might qualify, due to the elementary conduit that can be seen in the p184 gun. However, there are very few simple conduits that produce Herschel descendants without Herschels, so in practice this is not a useful branch point.

:elevener (p1)

OO....
O.O...
..O...
..OOO.
.....O
....OO

:Elkies' p5 (p5) Found by Noam Elkies in 1997.

.O.......
O..OOO...
..O......
...O.O..O
..OO.OOOO
....O....
....O.O..
.....OO..

:emu Dave Buckingham's term for a Herschel loop that does not emit gliders (and so is "flightless"). All known Herschel loops of periods 52, 57, 58, 59 and 61 are emus. See also Quetzal.

:emulator Any one of three p4 oscillators that produce sparks similar to those produced by LWSS, MWSS and HWSS. See LW emulator, MW emulator and HW emulator. Larger emulators are also possible, but they require stabilizing objects to suppress their non-sparks and so are of little use. The emulators were discovered by Robert Wainwright in June 1980.

:engine The active portion of an object (usually a puffer or gun) which is considered to actually produce its output, and which generally permits no variation in how it works. The other parts of the object are just there to support the engine. For examples, see puffer train, Schick engine, blinker puffer, frothing puffer and line puffer.

:engineless A rake or puffer which does not contain a specific engine for its operation. Instead it depends on perturbations of gliders or other objects by passing spaceships. The period of such objects is often adjustable, and in some cases the speed as well. An early example was the creation of c/5 rakes in September 1997, using gliders circulating among a convoy of c/5 spaceships. More recently, the passing spaceships themselves are also constructed, as in the Caterloopillar.

:en retard (p3) Found by Dave Buckingham, August 1972.

.....O.....
....O.O....
OO.O.O.O.OO
.O.O...O.O.
O..O.O.O..O
.OO.....OO.
...OO.OO...
...O.O.O...
....O.O....
..O.O.O.O..
..OO...OO..

:Enterprise (c/4 diagonally, p4) Found by Dean Hickerson, March 1993.

.......OOO...........
.....O.OO............
....OOOO.............
...OO.....O..........
..OOO..O.O.O.........
.OO...O.O..O.........
.O.O.OOOOO...........
OO.O.O...O...........
O........OO..........
.OO..O...O.O.........
....OO..O.OO......O..
...........OO.....OOO
............O..OOO..O
............O..O..OO.
.............O.OO....
............OO.......
............OO.......
...........O.........
............O.O......
...........O..O......
.............O.......

:envelope See construction envelope, reaction envelope.

:Eureka (p30) A pre-pulsar shuttle found by Dave Buckingham in August 1980. A variant is obtained by shifting the top half two spaces to either side.

.O..............O.
O.O....O.......O.O
.O...OO.OO......O.
.......O..........
..................
..................
..................
.......O..........
.O...OO.OO......O.
O.O....O.......O.O
.O..............O.

:evolution The process or result of running one or more generations of an object. For example, a row of 10 cells evolves into a pentadecathlon.

:evolutionary factor For an unstable pattern, the time to stabilization divided by the initial population. For example, the R-pentomino has an evolutionary factor of 220.6, while bunnies has an evolutionary factor of 1925.777... The term is no longer in use.

:exhaust The debris or smoke left behind by a puffer, especially if the debris is dirty and takes many generations to settle. The term is not usually used for the objects created by clean puffers.

:exponential filter A toolkit developed by Gabriel Nivasch in 2006, enabling the construction of patterns with asymptotic population growth matching O((log log ... log(t))) for any number of nested log operations. See also quadratic filter, recursive filter.

:exposure = underpopulation

:extensible A pattern is said to be extensible if arbitrarily large patterns of the same type can be made by repeating parts of the original pattern in a regular way. For examples, see p6 shuttle, pentoad, pufferfish spaceship, snacker, wavestretcher, wicktrailer and branching spaceship.

:extra extra long = long^4

:extra long = long^3

:extremely impressive (p6) Found by Dave Buckingham, August 1976.

....OO......
...O.OOO....
...O....O...
OO.O...OO...
OO.O.....OO.
....OOOOO..O
..........OO
......O.....
.....O.O....
......O.....

:extruder See traffic lights extruder. A single-channel constructor arm has also been programmed to extrude a growing wick consisting of a chain of Snarks, again working from the stationary fencepost end of the wick with no need for a wickstretcher component.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_h.htm0000755000175000017500000023535613317135606016415 00000000000000 Life Lexicon (H)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:half-baked knightship ((6,3)c/2621440, p2621440) A self-supporting macro-spaceship with adjustable period but fixed direction, based on the half-bakery reaction. This was the first spaceship based on this reaction, constructed in December 2014 by Adam P. Goucher. It moves 6 cells horizontally and 3 cells vertically every 2621440+8N ticks, depending on the relative spacing of the two halves. It is one of the slowest known knightships, and the first one that was not a Geminoid. Chris Cain optimized the design a few days later to create the Parallel HBK.

The spaceship produces gliders from near-diagonal lines of half-bakeries, which collide with each other at 180 degrees. These collisions produce monochromatic salvos that gradually build and trigger seeds, which in turn eventually construct small synchronized salvos of gliders. These re-activate the lines of half-bakeries, thus closing the cycle and moving the entire spaceship obliquely by (6,3).

:half bakery = bi-loaf.

:half-bakery reaction The key reaction used in the half-baked knightship and Parallel HBK, where a half-bakery is moved by (6,3) when a glider collides with it, and the glider continues on a new lane. Ivan Fomichev noticed in May 2014 that pairs of these reactions at the correct relative spacing can create 90-degree output gliders:

.............................O.
............................O..
............................OOO
...............................
...............................
...............................
...............................
...............................
...............................
...............................
....................OO.........
...................O..O........
...................O.O.........
.................OO.O..........
........O.......O..O...........
......OO........O.O............
.......OO........O.............
...............................
....OO.........................
...O..O........................
...O.O.........................
.OO.O..........................
O..O...........................
O.O............................
.O.............................

:half diagonal A natural measurement of distance between parallel glider lanes, or between elbow locations in a universal construction arm elbow operation library. If two gliders are in the same phase and exactly lined up vertically or horizontally, N cells away from each other, then the two glider lanes are considered to be N half diagonals (hd) apart. Gliders that are an integer number of full diagonals apart must be the same colour, whereas integer half diagonals allow for both glider colours. See colour of a glider, linear propagator.

:half fleet = ship-tie

:Halfmax A pattern that acts as a spacefiller in half of the Life plane, found by Jason Summers in May 2005. It expands in three directions at c/2, producing a triangular region that grows to fill half the plane.

:hammer To hammer a LWSS, MWSS or HWSS is to smash things into the rear end of it in order to transform it into a different type of spaceship. A hammer is the object used to do the hammering. In the following example by Dieter Leithner an LWSS is hammered by two more LWSS to make it into an MWSS.

O..O................
....O...OO..........
O...O..OOO.....OOOO.
.OOOO..OO.O....O...O
........OOO....O....
.........O......O..O

:hammerhead A certain front end for c/2 spaceships. The central part of the hammerhead pattern is supported between two MWSS. The picture below shows a small example of a spaceship with a hammerhead front end (the front 9 columns).

................O..
.OO...........O...O
OO.OOO.......O.....
.OOOOO.......O....O
..OOOOO.....O.OOOO.
......OOO.O.OO.....
......OOO....O.....
......OOO.OOO......
..........OO.......
..........OO.......
......OOO.OOO......
......OOO....O.....
......OOO.O.OO.....
..OOOOO.....O.OOOO.
.OOOOO.......O....O
OO.OOO.......O.....
.OO...........O...O
................O..

:hand Any object used as a slow salvo target by a construction arm.

:handshake An old MIT name for lumps of muck, from the following form (2 generations on from the stairstep hexomino):

..OO.
.O.OO
OO.O.
.OO..

:harbor (p5) Found by Dave Buckingham in September 1978. The name is by Dean Hickerson.

.....OO...OO.....
.....O.O.O.O.....
......O...O......
.................
.....OO...OO.....
OO..O.O...O.O..OO
O.O.OO.....OO.O.O
.O.............O.
.................
.O.............O.
O.O.OO.....OO.O.O
OO..O.O...O.O..OO
.....OO...OO.....
.................
......O...O......
.....O.O.O.O.....
.....OO...OO.....

:harvester (c p4 fuse) Found by David Poyner, this was the first published example of a fuse. The name refers to the fact that it produces debris in the form of blocks which contain the same number of cells as the fuse has burnt up.

................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
OOOO..............
O.OO..............

:hashlife A Life algorithm by Bill Gosper that is designed to take advantage of the considerable amount of repetitive behaviour in many large patterns of interest. It provides a means of evolving repetitive patterns millions (or even billions or trillions) of generations further than normal Life algorithms can manage in a reasonable amount of time.

The hashlife algorithm is described by Gosper in his paper listed in the bibliography at the end of this lexicon. Roughly speaking, the idea is to store subpatterns in a hash table so that the results of their evolution do not need to be recomputed if they arise again at some other place or time in the evolution of the full pattern. This does, however, mean that complex patterns can require substantial amounts of memory.

Tomas Rokicki and Andrew Trevorrow implemented Hashlife into Golly in 2005. See also macrocell.

:hassle See hassler.

:hassler An oscillator that works by hassling (repeatedly moving or changing) some object. For some examples, see Jolson, baker's dozen, toad-flipper, toad-sucker and traffic circle. Also see p24 gun for a good use of a traffic light hassler.

:hat (p1) Found in 1971. See also twinhat and sesquihat.

..O..
.O.O.
.O.O.
OO.OO

:HBK = half-baked knightship

:hd Abbreviation for half diagonal. This metric is used primarily for relative measurements of glider lanes, often in relation to self-constructing circuitry; compare Gn.

:heat For an oscillator or spaceship, the average number of cells which change state in each generation. For example, the heat of a glider is 4, because 2 cells are born and 2 die every generation.

For a period n oscillator with an r-cell rotor the heat is at least 2r/n and no more than r(1-(n mod 2)/n). For n=2 and n=3 these bounds are equal.

:heavyweight emulator = HW emulator

:heavyweight spaceship = HWSS

:heavyweight volcano = HW volcano

:hebdarole (p7) Found by Noam Elkies, November 1997. Compare fumarole. The smaller version shown below was found soon after by Alan Hensel using a component found by Dave Buckingham in June 1977. The top ten rows can be stabilized by their mirror image (giving an inductor) and this was the original form found by Elkies.

...........OO...........
....OO...O....O...OO....
.O..O..O.O....O.O..O..O.
O.O.O.OO.O....O.OO.O.O.O
.O..O..O.O.OO.O.O..O..O.
....OO....O..O....OO....
...........OO...........
.......O..O..O..O.......
......O.OO....OO.O......
.......O........O.......
........................
...OO..............OO...
...O..OOOO....OOOO..O...
....O.O.O.O..O.O.O.O....
...OO.O...OOOO...O.OO...
.......OO......OO.......
.........OO..OO.........
.........O..O.O.........
..........OO............

:hectic (p30) Found by Robert Wainwright in September 1984.

......................OO...............
......................OO...............
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.........O..........OO...OO............
.......O.O............OOO..............
......O.O............O...O.............
OO...O..O.............O.O..............
OO....O.O..............O...............
.......O.O......O.O....................
.........O......OO.....................
.................O...O.................
.....................OO......O.........
....................O.O......O.O.......
...............O..............O.O....OO
..............O.O.............O..O...OO
.............O...O............O.O......
..............OOO............O.O.......
............OO...OO..........O.........
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
...............OO......................
...............OO......................

:Heisenburp device A pattern which can detect the passage of a glider without affecting the glider's path or timing. The first such device was constructed by David Bell in December 1992. The term, coined by Bill Gosper, refers to the fact that Heisenberg's Uncertainty Principle fails to apply in the Life universe. See also stable pseudo-Heisenburp and natural Heisenburp.

The following is an example of the kind of reaction used at the heart of a Heisenburp device. The glider at bottom right alters the reaction of the other two gliders without itself being affected in any way.

O.....O....
.OO...O.O..
OO....OO...
...........
...........
...........
.........OO
........O.O
..........O

:Heisenburp effect See Heisenburp device.

:helix A convoy of standard spaceships used in a Caterpillar to move some piece of debris at the speed of the Caterpillar. The following diagram illustrates the idea. The leading edge of this example helix, represented by the glider at the upper right in the pattern below, moves at a speed of 65c/213, or slightly faster than c/4.

...............................O.............
.................O............OOO............
................OOO....OOO....O.OO...........
.........OOO....O.OO...O..O....OOO..OOO......
.........O..O....OOO...O.......OO...O........
.........O.......OO....O...O.........O.......
.........O...O.........O...O.................
OOO......O...O.........O.....................
O..O.....O..............O.O..................
O.........O.O................................
O............................................
.O.O.........................................
.............................................
.............................................
..........O..................................
.........OOO.................................
.........O.OO................................
..........OOO................................
..........OO.................................
.............................................
.............................................
...............OOO...........................
...............O..O....O.....OOO.............
...............O......OOO....O..O....O.......
...............O.....OO.O....O......OOO......
....OOO.........O.O..OOO.....O.....OO.O......
....O..O.............OOO......O.O..OOO.......
....O................OOO...........OOO.......
....O.................OO...........OOO.......
.....O.O............................OO.......
...........................................O.
..........................................OOO
.........................................OO.O
.........................................OOO.
..........................................OO.
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.........................................O...
..............................OOO.......OOO..
................OOO.....O....O..O......OO.O..
..........O....O..O....OOO......O......OOO...
.........OOO......O....O.OO.....O......OOO...
.........O.OO.....O.....OOO..O.O........OO...
..........OOO..O.O......OOO..................
.O........OOO...........OOO..................
OOO.......OOO...........OO...................
O.OO......OO.................................
.OOO......................................O..
.OO......................................OOO.
........................................OO.O.
........................................OOO..
.........................................OO..
.........OOO.................................
........O..O.................................
...........O.................................
...........O.................................
........O.O..................................

Adjustable-speed helices can produce a very wide range of spaceship speeds; see Caterloopillar.

:heptaplet Any 7-cell polyplet.

:heptapole (p2) The barberpole of length 7.

OO........
O.O.......
..........
..O.O.....
..........
....O.O...
..........
......O.O.
.........O
........OO

:heptomino Any 7-cell polyomino. There are 108 such objects. Those with names in common use are the B-heptomino, the Herschel and the pi-heptomino.

:Herschel (stabilizes at time 128) The following pattern which occurs at generation 20 of the B-heptomino.

O..
O.O
OOO
..O

The name is commonly ascribed to the Herschel heptomino's similarity to a planetary symbol. William Herschel discovered Uranus in 1781. However, in point of fact a Herschel bears no particular resemblance to either of the symbols used for Uranus, but does closely resemble the symbol for Saturn. So the appropriate name might actually be "Huygens", but "Herschel" is now universally used by tradition.

Herschels are one of the most versatile types of signal in stable circuitry. R-pentominoes and B-heptominoes naturally evolve into Herschels, and converters have also been found that change pi-heptominoes and several other signal types into Herschels, and vice versa. See elementary conduit.

:Herschel circuit A series of Herschel conduits or other components, connected by placing them so that the output Herschels from early conduits become the input Herschels for later conduits. Often the initial component is a converter accepting some other signal type as input - usually a glider, in which case a syringe is most commonly used. The Silver reflector is a well-known early Spartan Herschel circuit from before the syringe was discovered, where the initial converter is a Callahan G-to-H.

Sometimes a direct connection between two conduits is not possible due to unwanted gliders that destroy required catalysts, or wanted gliders that are not able to escape. In this case, small "spacer" conduits such as F116, F117, Fx77, R64, L112, or L156 can be inserted between the other conduits to solve the problem.

Some converter or factory conduits do not produce a Herschel as output, instead generating other useful results such as gliders, boats or MWSSes. See Herschel-to-glider, demultiplexer, and H-to-MWSS respectively for examples of these. For those conduits which do produce an unwanted Herschel, an eater such as SW-2 can be added to delete it.

If the first and last conduits of a chain connect to each other in a loop then there is no need for a syringe to generate the first Herschel, or an eater to consume the last one. The circuit becomes a self-supporting Herschel loop. A loop is also formed by a syringe connected to a Herschel-to-glider converter, with the glider reflected back to the syringe's input with glider reflectors of the appropriate colour, usually Snarks. In either case, if the loop has a surplus glider output, it becomes a gun; if no output is available it is an emu.

:Herschel climber Any reburnable fuse reaction involving Herschels. May refer specifically to the (23,5)c/79 Herschel climber used in the waterbear, or one of several similar reactions with various velocities. See also Herschel-pair climber.

:Herschel component = Herschel conduit

:Herschel conduit A conduit that moves a Herschel from one place to another. See also Herschel loop.

Well over a hundred simple stable Herschel conduits are currently known. As of June 2018 the number is approximately 150, depending on the precise definition of "simple" - e.g., fitting inside a 100x100 bounding box, and producing output in no more than 300 ticks. In general a Herschel conduit can be called "simple" if its active reaction does not return to a Herschel stage except at its output. Compare elementary conduit, composite conduit. A description of common usage in complex circuitry, using syringes and Snarks to make compact connections, can be found in Herschel circuit.

The original universal set consisted of sixteen stable Herschel conduits, discovered between 1995 and 1998 by Dave Buckingham (DJB) and Paul Callahan (PBC). These are shown in the following table. In this table, the number in "name/steps" is the number of ticks needed to produce an output Herschel from the input Herschel. "m" tells how the Herschel is moved (R = turned right, L = turned left, B = turned back, F = unturned, f = flipped), and "dx" and "dy" give the displacement of the centre cell of the Herschel (assumed to start in the orientation shown above).

  ------------------------------------------
  name/steps  m      dx   dy     discovery
  ------------------------------------------
  R64         R      11    9   DJB, Sep 1995
  Fx77        Fflip  25   -8   DJB, Aug 1996
  L112        L      12  -33   DJB, Jul 1996
  F116        F      32    1   PBC, Feb 1997
  F117        F      40   -6   DJB, Jul 1996
  Bx125       Bflip  -9  -17   PBC, Nov 1998
  Fx119       Fflip  20   14   DJB, Sep 1996
  Fx153       Fflip  48   -4   PBC, Feb 1997
  L156        L      17  -41   DJB, Aug 1996
  Fx158       Fflip  27   -5   DJB, Jul 1996
  F166        F      49    3   PBC, May 1997
  Fx176       Fflip  45    0   PBC, Oct 1997
  R190        R      24   16   DJB, Jul 1996
  Lx200       Lflip  17  -40   PBC, Jun 1997
  Rx202       Rflip   7   32   DJB, May 1997
  Bx222       Bflip  -6  -16   PBC, Oct 1998
  ------------------------------------------

See also Herschel transceiver.

:Herschel descendant A common active pattern occurring at generation 22 of a Herschel's evolution:

OO..
O.OO
...O
.O.O
.OO.
There are other evolutionary paths leading to the same pattern, including the modification of a B-heptomino implied by generation 21 of a Herschel.

:Herschel great-grandparent A specific three-tick predecessor of a Herschel, commonly seen in Herschel conduit collections that contain dependent conduits. In some situations it is helpful to display the input reaction in this form instead of the standard Herschel form.

.OO....
OOO.OO.
.OO.OOO
OOO.OO.
OO.....

Dependent conduit inputs are catalysed by a transparent block before the Herschel's standard form can appear, and before the Herschel's first natural glider is produced. This means that these conduits will fail if an actual Herschel is placed in the "correct" input location for a dependent conduit. Refer to F166 or Lx200 to see the correct relative placement of the standard transparent block catalyst.

Almost all known Herschel conduits produce a Herschel great-grandparent near the end of their evolutionary sequence. In the original universal set of Herschel conduits, Fx158 is the only exception.

:Herschel loop A cyclic Herschel track. Although no loop of length less than 120 generations has been constructed it is possible to make oscillators of smaller periods by putting more than one Herschel in a higher-period track. In this way oscillators, and in most cases guns, of all periods from 54 onwards can now be constructed (although the p55 case is a bit strange, shooting itself with gliders in order to stabilize itself). A mechanism for a period-52 loop was found in April 2018, but it includes a stage where the signal is carried by a triplet of gliders so it may not be considered to be a pure Herschel loop. The missing period, 53, is a difficult case simply because 53 is prime and so no small sparkers or reflectors are available.

See Simkin glider gun and p256 gun for the smallest known Herschel loops. See also emu and omniperiodic.

:Herschel-pair climber Any reburnable fuse reaction involving pairs of Herschels. May refer specifically to the 31c/240 Herschel-pair climber used in the Centipede, or one of several similar reactions with various velocities. See also Herschel climber.

:Herschel receiver Any circuit that converts a tandem glider into a Herschel signal. The following diagram shows a pattern found by Paul Callahan in 1996, as part of the first stable glider reflector. Used as a receiver, it converts two parallel input gliders (with path separations of 2, 5, or 6) to an R-pentomino. The signal is then converted to a Herschel by one of several known mechanisms, the first of which was found by Dave Buckingham way back in 1972. The second is elementary conduit RF48H, found by Stephen Silver in October 1997. The receiver version shown below uses Buckingham's R-to-Herschel converter, which is made up of elementary conduit RF28B followed by BFx59H.

...............................................O.O
......................................OO.......OO.
......................................OO........O.
...OO.............................................
...O..............................................
....O.............................................
...OO.............................................
............OO....................................
...........O.O....................................
............O..............................O......
......................................OO...O.O....
.....................................O..O..OO.....
OO....................................OO..........
OO.............................OO.................
...............................OO.................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
............................................OO....
............................................OO....
........................................OO........
........................................O.O.......
..........................................O.......
..........................................OO......
.............................OO...................
.............................OO...................
..................................................
..................................................
...........................OO.....................
...........................OO.....................

:Herschel stopper A method of cleanly suppressing a Herschel signal with an asynchronous boat-bit, discovered by Dean Hickerson. Here a ghost Herschel marks the location of the output signal, in cases where the boat-bit is not present. Other boat-bit locations that allow for clean suppression of a Herschel are also known.

....................................OO
.........................O..........O.
.........................OOO.........O
............................O.......OO
...........................OO.........
......................................
........O.............................
........OOO...........................
...........O..........................
..........OO...........OO...........O.
.......................OO.........OOO.
..................................O...
..................................O...
......................................
..........................O...........
..........................OO..........
.........O...............O.O..........
.........O.O..........................
.........OOO..........................
...........O.......................OO.
....................................O.
.................................OOO..
.................................O....
......................................
..OO..................................
...O..................................
OOO....................OO.............
O......................O..............
........................OOO...........
..........................O...........

This term is also sometimes used to refer to any mechanism that cleanly suppresses a Herschel. These usually allow the Herschel's first natural glider to escape, so they are more commonly classified as converters. See SW-2.

:Herschel-to-glider The largest category of elementary conduit. Gliders are very common and self-supporting, so it's much easier to find these than any other type of output signal. A large collection of these H-to-G converters has been compiled, with many different output lanes and timings. These can be used to synchronize multiple signals to produce gun patterns or complex logic circuitry. See NW31T120 for an example.

:Herschel track A track for Herschels. An equivalent term is Herschel circuit. See also B track.

:Herschel transceiver An adjustable Herschel conduit made up of a Herschel transmitter and a Herschel receiver. The intermediate stage consists of a tandem glider - two gliders on parallel lanes - so that the transmitter and receiver can be separated by any required distance. The conduit may be stable, or may contain low-period oscillators.

:Herschel transmitter Any Herschel-to-two-glider converter that produces a tandem glider that can be used as input to a Herschel receiver. If the gliders are far enough apart, and if one of the gliders is used only for cleanup, then the transmitter is ambidextrous: with a small modification to the receiver, a suitably oriented mirror image of the receiver will also work.

The following diagram shows a stable Herschel transmitter found by Paul Callahan in May 1997:

......OO...........
.....O.O...........
...OOO.............
..O...O......O.....
..OO.OO......OOO...
.............O.O...
...............O...
...................
...................
OO.O...............
O.OO...............
...................
...................
...................
...............OO..
...............O...
................OOO
..................O
Examples of small reversible p6 and p7 transmitters are also known, and more recently several alternate Herschel transceivers have been found with different lane spacing, e.g., 0, 2, 4, 6, and 13.

:Hertz oscillator (p8) Compare negentropy, and also cauldron. Found by Conway's group in 1970.

...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...O...O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:hexadecimal = beehive and dock

:hexaplet Any 6-cell polyplet.

:hexapole (p2) The barberpole of length 6.

OO.......
O.O......
.........
..O.O....
.........
....O.O..
.........
......O.O
.......OO

:hexomino Any 6-cell polyomino. There are 35 such objects. For some examples see century, stairstep hexomino, table, toad and Z-hexomino.

:HF = honey farm

:HFx58B A common Herschel to B-heptomino converter, used as the first stage of F117 and many other Herschel conduits. There are two variants, both shown in the pattern below.

..........O..............................O..........
..........OOO..........................OOO..........
.............O........................O.............
OO..........OO........................OO..........OO
.O................................................O.
.O.O............................................O.O.
..OO............................................OO..
.....................O........O.....................
.....................OO......OO.....................
......................OO....OO......................
......................O......O......................
.....................O........O.....................
....................................................
..O..............................................O..
..O.O..........................................O.O..
..OOO..........................................OOO..
....O...........OO.................OO..........O....
................O..................OO...............
.................OOO...................OO...........
...................O...................O............
........................................OOO.........
..........................................O.........

:H-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the I-heptomino.

OO..
.O..
.OOO
..O.

:high-bandwidth telegraph (p960, p30 circuitry) A variant of the telegraph constructed by Louis-François Handfield in February 2017, using periodic components to achieve a transmission rate of one bit per 192 ticks. The same ten signals are sent as in the original telegraph and the p1 telegraph, but information is encoded more efficiently in the timing of those signals. Specifically, the new transmitter sends five bits every 960 ticks by adjusting the relative timings inside each of the five mirror-image paired subunits of the composite signal in the beehive-chain lightspeed wire fuse.

:high-clearance See clearance.

:highway robber Any mechanism that can retrieve a signal from a spaceship lane while allowing spaceships on nearby lanes to pass by unaffected. In practice the spaceship is generally a glider. The signal is removed from the lane, an output signal is generated elsewhere, and the highway robber returns to its original state. A competent highway robber does not affect gliders even on the lane adjacent to the affected glider stream, except during its recovery period.

A perfect highway robber doesn't affect later gliders even in the lane to which it is attached, even during its recovery period. Below is a near-perfect highway robber "bait" that requires three synchronized signals to rebuild (the Herschel, B-heptomino, and glider.) The glider at the top right passes by unharmed, but another glider following on the same lane 200 ticks later will be cleanly reflected to a new path, and another glider following that one will also pass by unharmed. The only imperfection is a few ticks at the very end of the reconstruction, as the beehive is being rebuilt:

......................O...........O.........
......................OOO.......O.O.........
.........OO...OO.........O.......OO.........
.........OO...OO........OO..................
............................................
............................................
..OO........................................
...O........................................
...O.O......................................
....OO......................................
............................................
............................................
............................................
............................................
............................................
............................................
.......OO...................................
........O...................................
.....OOO....................................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
....................OO......................
....................OO......................
............OO..............................
.............O..............................
O.........OOO...............................
OOO.......O.................................
...O........................................
..OO........................................
............................................
............................................
............................................
............................................
...........O...........OO...............OO..
.........OOO..........O.O...............OO..
.........O.O............O...................
.........O.....................OO.O.......O.
...............................O.OO......OOO
........................................OO.O
............................................
.............................OO.............
.............................OO.............
.......................OO...................
.......................OO...................
............................................
............................................
.........................OO.................
..................OO.....OO.................
..................OO........................

:hive = beehive

:hivenudger (c/2 orthogonally, p4) A spaceship found by Hartmut Holzwart in July 1992. (The name is due to Bill Gosper.) It consists of a pre-beehive escorted by four LWSS. In fact any LWSS can be replaced by a MWSS or an HWSS, so that there are 45 different single-hive hivenudgers.

OOOO.....O..O
O...O...O....
O.......O...O
.O..O...OOOO.
.............
.....OO......
.....OO......
.....OO......
.............
.O..O...OOOO.
O.......O...O
O...O...O....
OOOO.....O..O
Wider versions can be made by stabilizing the front of the extended "pre-beehive", as in the line puffer shown below.
.........O.O..................
........O..O..................
.......OO.....................
......O...O...................
.....OOO.O....................
..OO..........................
.O...OOOOO.......OOOO.....O..O
O...O............O...O...O....
O.....OO.........O.......O...O
OOO...OOOO........O..O...OOOO.
.O.......O....................
.OO...................OO......
.O.O..................OO......
.OO..OO.O........O.O..OO......
..O.OOO.O...O.OOOO.O..OO......
.........OO.O.OO..O...OO...OOO
....OOOOOO.OO...OOOO..OO...OOO
.....O....OOO......O..OO...OOO
......OO.....OO..OO...OO......
.......O..O.....OOOO..OO......
........O.O.OO.....O..OO......
......................OO......
..............................
..................O..O...OOOO.
.................O.......O...O
.................O...O...O....
.................OOOO.....O..O

:honey bit A block and pond constellation used in the OTCA metapixel by Brice Due in 2006, to store and retrieve a bit of data - specifically, the presence or absence of a neighbor metacell. The "0" state of the honey bit memory unit is a simple beehive, which is also the source of the name.

An input glider collides with the beehive to convert it into the honey bit constellation, which can be thought of as a value of "1" stored in the memory unit. A passing LWSS can then test for the presence of the pond. If a collision occurs, the LWSS and the honey bit constellation are mutually annihilated, leaving just the original beehive. Below is the honeybit constellation with the two reactions occurring in the opposite order - test, then reset.

.O...............
..O..............
OOO..............
.................
............OOOO.
............O...O
............O....
.............O..O
.................
..........OO.....
.........O..O....
.........O..O....
..........OO.....
.................
.................
.........OO......
.........OO......
If the pond is not present, the LWSS passes by the beehive without affecting it. Thus a test input has an output for the "0" case, but not for the "1" case. For an alternative memory-unit mechanism with both "0" and "1" outputs, see demultiplexer.

The honey bit is also an interesting eater for the HWSS as shown below. An HWSS colliding with the pond happens to create the exact same reset glider used in the above memory unit.

..OO...........
O....O......OO.
......O....O..O
O.....O....O..O
.OOOOOO.....OO.
...............
...............
...........OO..
...........OO..

:honeycomb (p1)

..OO..
.O..O.
O.OO.O
.O..O.
..OO..

:honey farm (p1) A common formation of four beehives.

......O......
.....O.O.....
.....O.O.....
......O......
.............
.OO.......OO.
O..O.....O..O
.OO.......OO.
.............
......O......
.....O.O.....
.....O.O.....
......O......

:hook Another term for a bookend. It is also used for other hook-shaped things, such as occur in the eater1 and the hook with tail, for example.

:hook with tail (p1) For a long time this was the smallest still life without a well-established name. It is now a vital component of the smallest known HWSS gun, where it acts as a rock.

O.O..
OO.O.
...O.
...OO

:houndstooth agar The p2 agar that results from tiling the plane with the following pattern.

.OOO
.O..
..O.
OOO.

:house The following induction coil. It is generation 3 of the pi-heptomino. See spark coil and dead spark coil.

.OOO.
O...O
OO.OO

:H-to-G A Herschel-to-glider converter.

:H-to-MWSS A Spartan converter found by Tanner Jacobi in October 2015, which converts an input Herschel to a middleweight spaceship. The key discovery was a very small but slightly dirty H-to-MWSS conduit, where a Herschel is catalyzed to produce an MWSS but also leaves behind a beehive. Prefixing two R64 conduits to this produces a composite converter that successfully deletes the beehive in advance, using the input Herschel's first natural glider.

.............................OO................
.............................OO.....OO.........
....................................OO.........
...............................................
...............................................
...............OO.................OO...........
................O.................OO...........
................O.O.....................OO.....
.................OO.....................OO.....
...............................................
...............................................
...............................................
....................O..........................
....................O.O........................
....................OOO........................
......................O........................
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
...OO...........................OOO............
..O.O...........................O..............
...O...........................OO..............
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
.............................................OO
.O...........................................OO
O.O................OO.O........................
O.O................OO.OOO......................
.O......................O......................
........................O...............OO.....
........................................OO.....
....O.O.....................................OO.
.......O....................................OO.
...O...O.......................................
.......O.......................................
....O..O..............................OO.......
.....OOO..............................OO.......
There are many other ways to remove the beehive using a spare glider or additional conduits, but they are generally less compact than this.

:hustler (p3) Found by Robert Wainwright, June 1971.

.....OO....
.....OO....
...........
...OOOO....
O.O....O...
OO.O...O...
...O...O.OO
...O....O.O
....OOOO...
...........
....OO.....
....OO.....

:hustler II (p4)

....O...........
....OOO.........
.......O........
......O..OO.....
O.OO.O.OO..O....
OO.O.O.....O....
.....O....O.....
....O.....O.O.OO
....O..OO.O.OO.O
.....OO..O......
........O.......
.........OOO....
...........O....

:HW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator.

.......OO.......
..OO.O....O.OO..
..O..........O..
...OO......OO...
OOO..OOOOOO..OOO
O..O........O..O
.OO..........OO.

:HWSS (c/2 orthogonally, p4) A heavyweight spaceship, the fourth most common spaceship. Found by Conway in 1970 by modifying a LWSS. See also MWSS.

...OO..
.O....O
O......
O.....O
OOOOOO.

The HWSS possesses both a tail spark and a domino belly spark which can easily perturb other objects as it passes by. The spaceship can also perturb some objects in additional ways. For examples, see puffer and glider turner.

Dave Buckingham found that the HWSS can be synthesized using three gliders as shown below:

........O.O
........OO.
.........O.
...........
OOO........
..O........
.O...OOO...
.......O...
......O....

:HWSS emulator = HW emulator

:HW volcano (p5) A p5 domino sparker, found by Dean Hickerson in February 1995.

.........O..........................
........O.O.........................
......OOO.O.........................
.....O....OO.O......................
.....O.OO...OO......OO..............
....OO.O.OO.........O.O.............
.........O.OOOOO......O..O.OO.......
..O.OO.OO.O.....O....OO.O.OO.O......
.....OO.....OOOO........O....O......
O...O.O..O...O.O....OO.O.OOOO.OO....
O...O.O..OO.O.OO.OO....O.O....O.O...
.....OO...OOO.OO.O.OOO.O..OOO...O...
..O.OO.OO.OO.............O.O..O.O.OO
...........O......O.O.O.O..OO.O.O.O.
....OO.O.O.OO......OO.O.O.O...O.O.O.
.....O.OO.O..O.......O.OO..OOOO.OO..
.....O....O.O........O...OO.........
....OO....OO........OO...O..O.......
...........................OO.......
At least four progressively smaller forms of this sparker have been found, including a 25-cell-wide version found by David Eppstein in 2003, and a vertically narrower 28-cell-wide version by Karel Suhajda in 2004. Scot Ellison's 17-cell-wide version is shown in the zweiback entry.

:hybrid grey ship A grey ship containing more than one type of region of density 1/2, usually a combination of a with-the-grain grey ship and an against-the-grain grey ship.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_i.htm0000755000175000017500000004753513317135606016416 00000000000000 Life Lexicon (I)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:I-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the H-heptomino.

OO..
.O..
.OO.
..OO

:IMG = intermitting glider gun

:Immigration A form of colourised Life in which there are two types of ON cell, a newly-born cell taking the type of the majority of its three parent cells and surviving cells remaining of the same type as in the previous generation.

:independent conduit A Herschel conduit in which the input Herschel produces its first natural glider. Compare dependent conduit.

:induction coil Any object used to stabilize an edge (or edges) without touching. The tubs used in the Gray counter are examples, as are the blocks and snakes used in the Hertz oscillator and the heptomino at the bottom of the mathematician.

:inductor Any oscillator with a row of dead cells down the middle and whose two halves are mirror images of one another, both halves being required for the oscillator to work. The classic examples are the pulsar and the tumbler. If still lifes are considered as p1 oscillators then there are numerous simple examples that include this kind of central gutter, such as table on table, dead spark coil and cis-mirrored R-bee. Some spaceships, such as the brain, the snail and the spider, use the same principle.

:infinite glider hotel A pattern by David Bell, named after Hilbert's "infinite hotel" scenario in which a hotel with an infinite number of rooms has room for more guests even if it is already full, simply by shuffling the old guests around.

In this pattern, two pairs of Corderships moving at c/12 are pulling apart such that there is an ever-lengthening glider track between them. Every 128 generations another glider is injected into the glider track (see LWSS-glider bounce), joining the gliders already circulating there. The number of gliders in the track therefore increases without limit.

The tricky part of this construction is that even though all the previously injected gliders are repeatedly flying through the injection point, that point is guaranteed to be empty when it is time for the next glider to be injected.

:infinite growth Growth of a finite pattern such that the population tends to infinity, or at least is unbounded. Sometimes the term is used for growth of something other than population (for example, length), but here we will only consider infinite population growth. The first known pattern with infinite growth in this sense was the Gosper glider gun, created in a response to a $50 prize challenge by John Conway. Martin Gardner's October 1970 article described the challenge as "Conway conjectures that no pattern can grow without limit", but Conway later explained that he had always expected that this would be disproved. The original purpose in investigating CA rules including B3/S23 was to show that a very simple two-state rule could support a universal computer and/or universal constructor. If all finite patterns could be proven to be bounded, neither of these would be possible.

An interesting question is: What is the minimum population of a pattern that exhibits infinite growth? In 1971 Charles Corderman found that a switch engine could be stabilized by a pre-block in a number of different ways, giving 11-cell patterns with infinite growth. This record stood for more than quarter of a century until Paul Callahan found, in November 1997, two 10-cell patterns with infinite growth. The following month he found the one shown below, which is much neater, being a single cluster. This produces a stabilized switch engine of the block-laying type.

......O.
....O.OO
....O.O.
....O...
..O.....
O.O.....
Nick Gotts and Paul Callahan showed in October 1997 that there is no infinite growth pattern with fewer than 10 cells, so that question has now been answered.

In October 2014, Michael Simkin discovered a three-glider collision that produces a glider-producing stabilized switch engine and thus produces infinite growth from the smallest possible number of gliders (since all 71 2-glider collisions have a finite limit population).

Also of interest is the following pattern (again found by Callahan), which is the only 5x5 pattern with infinite growth. This too emits a block-laying switch engine.

OOO.O
O....
...OO
.OO.O
O.O.O

Following a conjecture of Nick Gotts, Stephen Silver produced, in May 1998, a pattern of width 1 which exhibits infinite growth. This pattern was very large (12470x1 in the first version, reduced to 5447x1 the following day). In October 1998 Paul Callahan did an exhaustive search, finding the smallest example, the 39x1 pattern shown below. This produces two block-laying switch engines, stability being achieved at generation 1483.

OOOOOOOO.OOOOO...OOO......OOOOOOO.OOOOO
Larger patterns have since been constructed that display quadratic growth.

Although the simplest infinite growth patterns grow at a rate that is (asymptotically) linear, many other types of growth rate are possible, quadratic growth (see also breeder) being the fastest. Dean Hickerson has found many patterns with unusual growth rates, such as sawtooths and a caber tosser. Another pattern with superlinear but non-quadratic growth is Gotts dots.

See also Fermat prime calculator.

:initials = monogram

:inject A reaction in which a hole in a regular spaceship stream is filled partially or fully by adding a new spaceship of the same type without affecting the existing spaceships in the stream. Depending on the period of the stream, different mechanisms can be used. For adding a spaceship to an existing multi-lane convoy, see inserter.

For large period glider streams, simple reactions such as LWSS-LWSS bounce and LWSS-glider bounce suffice. If Herschel technology is used, a large number of edge shooters and transparent conduits are known. Simple examples include the NW31 Herschel-to-glider converter and the Fx119 inserter.

Shown below is an injector found by Dave Buckingham that can fill a hole in a p15 glider stream:

..O.O..................
...OO..................
...O.................O.
....................O..
....................OOO
.......................
.......................
..........O............
...........OO..........
..........OO...........
.......................
.OO....................
O.O..OO................
..O.OO.................
......O................
.......................
.......................
.......................
.....OO................
......OO...............
.....O.................
For very low-period glider streams, a GIG is a much more efficient insertion method, in the sense that fewer synchronized signals are needed. However, it has been shown that colliding gliders can complete an insertion even into a single-glider gap in a period-14 stream.

:inline inverter The following reaction in which a p30 gun can be used to invert the presence or absence of gliders in a p30 stream, with the output glider stream being in the same direction as the input glider stream.

................O...................
.................O..................
...............OOO..................
....................................
.......................O.O..........
.....................O...O..........
.............O.......O..............
............OOOO....O....O........OO
...........OO.O.O....O............OO
OO........OOO.O..O...O...O..........
OO.........OO.O.O......O.O..........
............OOOO....................
.............O......................

:inserter A mechanism that can add another spaceship into a stream or convoy of other spaceships without affecting the existing spaceships. For examples see Fx119 inserter, tee, GIG, clock insertion and inject.

:integral = integral sign

:integral sign (p1)

...OO
..O.O
..O..
O.O..
OO...

:intentionless = elevener

:interchange (p2) A common formation of six blinkers.

..OOO....OOO..
..............
O............O
O............O
O............O
..............
..OOO....OOO..

:intermediate target A temporary product of a partial slow salvo, elbow operation, or glider synthesis. An intermediate target is a useful step toward a desired outcome, but will not appear in the final construction.

:intermittent stream A stream of spaceships which is based on a periodic stream, but which can contain holes where some of the spaceships are not present. There is a base period for the intermittent stream such that if a spaceship arrives at a specific location, then it always does so at a generation which is a multiple of the base period. For example, the output from a period 30 glider gun where every third glider is deleted is an intermittent stream. A pseudo-random glider generator can produce a complicated intermittent stream with no obvious pattern.

Intermittent streams can be used to transmit signals, where holes in the stream can also convey information. For example, the stream can be processed by an inverter having the same period.

:intermitting glider gun Despite the name, an intermitting glider gun (IMG) is more often an oscillator than a gun. There are two basic types. A type 1 IMG consists of two guns firing at one another in such a way that each gun is temporarily disabled on being hit by a glider from the other gun. A type 2 IMG consists of a single gun firing at a 180-degree glider reflector in such a way that returning gliders temporarily disable the gun.

Both types of IMG can be used to make glider guns of periods that are multiples of the base period. This is done by firing another gun across the two-way intermittent stream of gliders in the IMG in such a way that gliders only occasionally escape.

:inverter A device which can be used to invert the presence or absence of spaceships in an intermittent stream of spaceships. The device must be a gun whose period matches the base period of the stream, since if there are no input spaceships then the device must produce spaceships as the result of the inversion. Typically the spaceships are gliders, and the inverter is made from a glider gun. Inverters provide a way to produce a NOT logic operation on a stream.

There are several ways to produce an inverter. The simplest method is to simply hit the output of a gun with the input stream to delete its spaceships, producing an output stream that is always turned 90 degrees from the input stream. An example is the northernmost p30 gun in the glider duplicator example pattern. For one way to produce an inverted output stream which is not turned, see inline inverter.

:inverting reflector See inverter.

:island The individual polyplets of which a stable pattern consists are sometimes called islands. So, for example, a boat has only one island, while an aircraft carrier has two, a honey farm has four and the standard form of the eater3 has five.

:Iwona (stabilizes at time 28786) The following methuselah found by Andrzej Okrasinski in August 2004.

..............OOO...
....................
....................
....................
....................
....................
..O.................
...OO...............
...O..............O.
..................O.
..................O.
...................O
..................OO
.......OO...........
........O...........
....................
....................
....................
....................
OO..................
.O..................
It has a final population of 3091 and covers an area of 413 by 364 cells, not counting the 47 gliders it produces. Its ash consists of typical stable objects and blinkers, along with the relatively rare paperclip.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_v.htm0000755000175000017500000003701313171233731016415 00000000000000 Life Lexicon (V)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:vacuum Empty space. That is, space containing only dead cells.

:Venetian blinds The p2 agar obtained by using the pattern O..O to tile the plane. Period 2 stabilizations of finite patches of this agar are known.

..................O.OO.OO......O......OO.OO.O..................
..................OO.O.O...OO.O.O.OO...O.O.OO..................
.....................O...O..O.O.O.O..O...O.....................
.....................O..OOO...O.O...OOO..O.....................
....................OO.O.....O.O.O.....O.OO....................
.......................O..OO.O...O.OO..O.......................
....................OO..OOO..OO.OO..OOO..OO....................
................OO.O.OO...OO.OOOOO.OO...OO.O.OO................
................OO.OO....O...........O....OO.OO................
...................O..OO.O.O.......O.O.OO..O...................
................OO..OOO..OO.OOOOOOO.OO..OOO..OO................
........OO..OO.O.OO...OO.OOOOOOOOOOOOO.OO...OO.O.OO..OO........
.....O..O...OO.OO....O...................O....OO.OO...O..O.....
....O.O.O......O..OO.O.O...............O.O.OO..O......O.O.O....
...O..O.OO..OO..OOO..OO.OOOOOOOOOOOOOOO.OO..OOO..OO..OO.O..O...
...O.OO....O.OO...OO.OOOOOOOOOOOOOOOOOOOOO.OO...OO.O....OO.O...
OO.OO...OO.OO....O...........................O....OO.OO...OO.OO
O.O...OO.O.O..OO.O.O.......................O.O.OO..O.O.OO...O.O
..O.OO.O.O..OOO..OO.OOOOOOOOOOOOOOOOOOOOOOO.OO..OOO..O.O.OO.O..
..O.O..OOOO...OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO...OOOO..O.O..
.OO..O.......O...................................O.......O..OO.
O..O.O....OO.O.O...............................O.O.OO....O.O..O
.O.O..OOOOO..OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO..OOOOO..O.O.
..O.OOO..OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOO..OOO.O..
....O.O..O...........................................O..O.O....
..O.O.O..O.O.......................................O.O..O.O.O..
..OO...O.OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO.O...OO..
.........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........
...............................................................
...............................................................
.........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........
..OO...O.OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO.O...OO..
..O.O.O..O.O.......................................O.O..O.O.O..
....O.O..O...........................................O..O.O....
..O.OOO..OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOO..OOO.O..
.O.O..OOOOO..OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO..OOOOO..O.O.
O..O.O....OO.O.O...............................O.O.OO....O.O..O
.OO..O.......O...................................O.......O..OO.
..O.O..OOOO...OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO...OOOO..O.O..
..O.OO.O.O..OOO..OO.OOOOOOOOOOOOOOOOOOOOOOO.OO..OOO..O.O.OO.O..
O.O...OO.O.O..OO.O.O.......................O.O.OO..O.O.OO...O.O
OO.OO...OO.OO....O...........................O....OO.OO...OO.OO
...O.OO....O.OO...OO.OOOOOOOOOOOOOOOOOOOOO.OO...OO.O....OO.O...
...O..O.OO..OO..OOO..OO.OOOOOOOOOOOOOOO.OO..OOO..OO..OO.O..O...
....O.O.O......O..OO.O.O...............O.O.OO..O......O.O.O....
.....O..O...OO.OO....O...................O....OO.OO...O..O.....
........OO..OO.O.OO...OO.OOOOOOOOOOOOO.OO...OO.O.OO..OO........
................OO..OOO..OO.OOOOOOO.OO..OOO..OO................
...................O..OO.O.O.......O.O.OO..O...................
................OO.OO....O...........O....OO.OO................
................OO.O.OO...OO.OOOOO.OO...OO.O.OO................
....................OO..OOO..OO.OO..OOO..OO....................
.......................O..OO.O...O.OO..O.......................
....................OO.O.....O.O.O.....O.OO....................
.....................O..OOO...O.O...OOO..O.....................
.....................O...O..O.O.O.O..O...O.....................
..................OO.O.O...OO.O.O.OO...O.O.OO..................
..................O.OO.OO......O......OO.OO.O..................

:very long = long long

:very long house The following induction coil.

.OOOOO.
O..O..O
OO...OO

:volatility The volatility of an oscillator is the size (in cells) of its rotor divided by the sum of the sizes of its rotor and its stator. In other words, it is the proportion of cells involved in the oscillator which actually oscillate. For many periods there are known oscillators with volatility 1, see for example Achim's p16, figure-8, Kok's galaxy, mazing, pentadecathlon, phoenix, relay, smiley and tumbler. Such an oscillator of period 3 was found in August 2012 by Jason Summers.

.........O.O.....O...O.....O.O.
........O...O....O...O....O...O
.........O.......O...O.......O.
...........OO.OO.O...O.OO.OO...
.................O...O.........
..........O...O.........O...O..
........O.O.................O.O
...............................
........O...................O..
.......OO..................OO..
.......O...................O...
.....O..O................O..O..
O....O..............O....O.....
OOOO.OO.OOO.........OOOO.OO.OOO
OOO.OO.OOOO.........OOO.OO.OOOO
.....O....O..............O....O
..O..O................O..O.....
...O...................O.......
..OO..................OO.......
..O...................O........
...............................
O.O.................O.O........
..O...O.........O...O..........
.........O...O.................
...OO.OO.O...O.OO.OO...........
.O.......O...O.......O.........
O...O....O...O....O...O........
.O.O.....O...O.....O.O.........

The smallest period for which the existence of such statorless oscillators is undecided is 7. There are oscillators with volatility arbitrarily close to 1 for all but finitely many periods, because of the possibility of feeding the gliders from a true period n gun into an eater.

The term "volatility" is due to Robert Wainwright. See also strict volatility.

:volcano Any of a number of p5 oscillators which produce sparks. See lightweight volcano, middleweight volcano and heavyweight volcano.

:von Neumann neighbourhood The set of all cells that are orthogonally adjacent to a cell or group of cells. The von Neumann neighbourhood of a cell can be thought of as the points at a Manhattan distance of 1 from that cell. Compare Moore neighbourhood.

Cell neighbourhoods can also be defined with a higher range. The von Neumann neighbourhood of range n can be defined recursively as the von Neumann neighbourhood of the von Neumann neighbourhood of range n-1. For example, the von Neumann neighbourhood of range 2 is the set of all cells that are orthogonally adjacent to the range-1 von Neumann neighbourhood.

:V-pentomino Conway's name for the following pentomino, a loaf predecessor.

O..
O..
OOO

:V spark A common three-bit polyplet spark, produced most notably by the pentadecathlon.

O.O
.O.
The spark can convert a pre-block or block into a glider as shown here:
.O...
OO..O
...O.
....O
Also see PD-pair reflector.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/Lexicon/lex_z.htm0000755000175000017500000001737013317135606016431 00000000000000 Life Lexicon (Z)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:zebra stripes (p1) A stable agar consisting of alternating bands of live and dead cells. Known spacefillers and many gray ships create patches of this agar. It is also the medium through which with the grain and against the grain negative spaceships travel. Many simple stabilizations of the boundaries of finite regions of this agar are known, as shown below.

..OO.......................
..O........................
....O..O..O..O..O..O..O....
...OOOOOOOOOOOOOOOOOOOO....
..O........................
...OOOOOOOOOOOOOOOOOO......
.....................O.....
.OOOOOOOOOOOOOOOOOOOO......
O..........................
.OOOOOOOOOOOOOOOOOOOOOO....
.......................O.OO
.OOOOOOOOOOOOOOOOOOOO..O.OO
O....................O.O...
.OOOOOOOOOOOOOOOOOOOO..O...
.......................OO..
...OOOOOOOOOOOOOOOOOO......
..O..................O.....
...OOOOOOOOOOOOOOOOOO......
...........................
.....OO..OO.O.OOOO.OO......
.....OO..O.OO.O..O.OO......

:Z-hexomino The following hexomino. The Z-hexomino features in the pentoad, and also in Achim's p144.

OO.
.O.
.O.
.OO

:zone of influence The set of cells on which a chosen cell or pattern can potentially exert an influence in a given number of generations N. If N is not specified it is generally taken to be one, in which case the zone of influence simply coincides with the Moore neighbourhood of the cell or pattern.

The set for N generations consists of all the cells to which at least N paths of length N can be traced from the cell(s) in question. Contrast this with the range-N Moore neighbourhood, which consists of all cells to which at least one path of length n can be traced.

:Z-pentomino Conway's name for the following pentomino, which rapidly dies.

OO.
.O.
.OO

:zweiback (p30) An oscillator in which two HW volcanoes hassle a loaf. This was found by Mark Niemiec in February 1995. A smaller version using Scot Ellison's reduced HW volcano is shown below.

..........O..............................
........OOOOO.................O..........
.......O.....O..............OOOOO........
.......O..OO.O.............O.....O.......
...O.OOO.O.O.OO............O.OO..O.......
...OO....O................OO.O.O.OOO.O...
......OO.OO....................O....OO...
.OOOOO.O.O..O.................OO.OO......
O......O...O.O..............O..O.O.OOOOO.
OO..OOOOO.OO.O.............O.O...O......O
............OO.............O.OO.OOOOO..OO
.....OO....OOO.............OO............
.....OO....OOO.....OO......OOO....OO.....
............OO....O..O.....OOO....OO.....
OO..OOOOO.OO.O.....O.O.....OO............
O......O...O.O......O......O.OO.OOOOO..OO
.OOOOO.O.O..O..............O.O...O......O
......OO.OO.................O..O.O.OOOOO.
...OO....O....................OO.OO......
...O.OOO.O.O.OO................O....OO...
.......O..OO.O............OO.O.O.OOO.O...
.......O.....O.............O.OO..O.......
........OOOOO..............O.....O.......
..........O.................OOOOO........
..............................O..........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/gui-common/Help/pattern-android.html0000644000175000017500000000351312250742663017147 00000000000000

Golly Screen

The Golly screen lets you display, edit and generate patterns. There are three toolbars:

  • The top toolbar has buttons for generating the current pattern, changing the speed (by setting how often the pattern is rendered), and for changing the scale and/or location.
  • The middle toolbar has buttons for editing the current pattern. You can undo or redo all editing changes (and generating changes), select all of the current pattern, perform a variety of actions on the selection, paste, or change the current drawing state. The buttons at the right edge of the toolbar let you choose an editing mode: drawing cells, picking cell states, selecting cells, or moving the viewport (with a one-finger drag).
  • The bottom toolbar has buttons for miscellaneous functions. You can create a new pattern, change the current rule (and/or algorithm), display comment information in the current pattern file, save the current pattern, or switch to full screen mode.

The thin area in between the top two toolbars is used to display status information about the current pattern. It consists of three lines: The 1st line shows the pattern name, the current algorithm, and the current rule. The 2nd line shows the generation count, the population (ie. number of live cells), the current scale (in cells per pixels), the current step size, and the XY location of the cell in the middle of the viewport. The 3rd line is for various messages.

The background color of the status area depends on the current algorithm: pale yellow for QuickLife, pale blue for HashLife, etc.

The large area above the bottom toolbar is for displaying the current pattern. Two-finger pinching can be used to zoom in or out, and two-finger dragging can be used to move the viewport. golly-3.3-src/gui-common/Help/tips.html0000644000175000017500000000131012250742663015024 00000000000000

Hints and Tips

  • Displaying the population count can cause a significant slow-down when generating large patterns, especially when using HashLife. If you want to generate at maximum speed then hit the Full Screen button.
  • Editing operations are fastest in QuickLife.
  • Pasting large, sparse patterns is much faster when using OR mode, or if the current pattern is empty, or if the paste image is completely outside the current pattern edges.
  • After making a selection you can change its size by dragging inside the selection near a corner or edge, or move the selection by dragging near the middle.
golly-3.3-src/gui-common/Help/formats.html0000644000175000017500000010172212675334101015523 00000000000000

File Formats

Here are the important file formats used by Golly:

Extended RLE format (.rle)
Macrocell format (.mc)
Rule format (.rule)
     @RULE
     @TABLE
     @TREE
     @COLORS
     @ICONS
          Specifying icons using XPM
          Grayscale icons or multi-color icons
          Requesting built-in icons
     How Golly finds .rule files
     Related rules can share colors and/or icons
     How to override a supplied or built-in rule
     The easy way to install a new .rule file
     Deprecated files (.table, .tree)
Zip files (.zip)

Extended RLE format

Golly prefers to store patterns and pattern fragments in a simple concise textual format we call "Extended RLE" (it's a modified version of the RLE format created by Dave Buckingham). The data is run-length encoded which works well for sparse patterns while still being easy to interpret (either by a machine or by a person). The format permits retention of the most critical data:

  • The cell configuration; ie. which cells have what values.
  • The transition rule to be applied.
  • Any comments or description.
  • The generation count.
  • The absolute position on the screen.

Golly uses this format for internal cuts and pastes, which makes it very convenient to move cell configurations to and from text files. For instance, the r-pentomino is represented as

x = 3, y = 3, rule = B3/S23
b2o$2o$bo!

Pattern data in this format can be cut from a browser or email window and pasted directly into Golly.

RLE data is indicated by a file whose first non-comment line starts with "x". A comment line is either a blank line or a line beginning with "#". The line starting with "x" gives the dimensions of the pattern and usually the rule, and has the following format:

x = width, y = height, rule = rule

where width and height are the dimensions of the pattern and rule is the rule to be applied. Whitespace can be inserted at any point in this line except at the beginning or where it would split a token. The dimension data is ignored when Golly loads a pattern, so it need not be accurate, but it is not ignored when Golly pastes a pattern; it is used as the boundary of what to paste, so it may be larger or smaller than the smallest rectangle enclosing all live cells.

Any line that is not blank, or does not start with a "#" or "x " or "x=" is treated as run-length encoded pattern data. The data is ordered a row at a time from top to bottom, and each row is ordered left to right. A "$" represents the end of each row and an optional "!" represents the end of the pattern.

For two-state rules, a "b" represents an off cell, and a "o" represents an on cell. For rules with more than two states, a "." represents a zero state; states 1..24 are represented by "A".."X", states 25..48 by "pA".."pX", states 49..72 by "qA".."qZ", and on up to states 241..255 represented by "yA".."yO". The pattern reader is flexible and will permit "b" and "." interchangeably and "o" and "A" interchangeably.

Any data value or row terminator can be immediately preceded with an integer indicating a repetition count. Thus, "3o" and "ooo" both represent a sequence of three on cells, and "5$" means finish the current row and insert four blank rows, and start at the left side of the row after that.

The pattern writer attempts to keep lines about 70 characters long for convenience when sharing patterns or storing them in text files, but the reader will accept much longer lines.

Comment lines with a specific format will be added at the start of the file to convey extra information. These comment lines start with "#CXRLE" and contain keyword/value pairs. The keywords currently supported are "Pos", which denotes the absolute position of the upper left cell (which may be on or off), and "Gen", which denotes the generation count. For instance,

#CXRLE Pos=0,-1377 Gen=3480106827776

indicates that the upper left corner of the enclosing rectange is at an X coordinate of 0 and a Y coordinate of -1377, and that the pattern stored is at generation 3,480,106,827,776.

All comment lines that occur at the top or bottom of the file are treated as information lines and are displayed in a modal view when you tap the Info button in the Pattern tab's bottom toolbar. Any comment lines interspersed with the pattern data will not be displayed.

Macrocell format

The size of an Extended RLE file is frequently proportional to the number of cells it contains, yet Golly supports universes that can contain trillions of cells or more, using hashlife-based algorithms. The storage of these huge universes, for which Extended RLE is not feasible, is done by essentially dumping the in-memory compressed representation of the universe in "Macrocell format". Since little translation need be done between external and internal representation, this format is also used to store backups of universes at certain points in Golly's operation when using one of the hashlife-based algorithms.

The macrocell format has two parts: the header, and the tree. The first portion of the file is the header; this contains the format identifier, the rule, the generation count (if non-zero), and any comments associated with this file. The format identifier is a line that starts with "[M2]" and contains the name and version of the program used to write it:

[M2] (golly 2.0)

Following this is any comment lines, which are lines that begin with '#'. If the first two characters of a line are '#R', then the remainder of the line (after intervening whitespace) is the rule for the pattern. If the first two characters are '#G', then the remainder of the line is the current generation count. Any other line starting with a '#' is treated as an ordinary comment line.

Following the header is is a child-first textual representation of a canonicalized quadtree. Each line is either a leaf node, or a non-leaf node. For two-state algorithms, the leaf nodes contain an 8x8 pixel array in a simplified raster format, left-to-right, then top-down, with "." representing an empty cell, "*" representing a live cell, and "$" representing the end of line; empty cells at the end of each row are suppressed. No whitespace is permitted; lines representing leaf nodes for two-state algorithms are recognized because they start with ".", "*", or "$". A sample leaf node containing a glider is:

$$..*$...*$.***$$$$

For algorithms with more than two states, leaf nodes represent a two-by-two square of the universe. They contain five integers separated by single spaces; the first integer is 1, and the next four are the state values for the northwest, northeast, southwest, and southeast values of the square.

Nodes with children are represented by lines with five integers. The first integer is the logarithm base 2 of the size of the square this node representes; for two-state patterns, this must be 4 or larger; for multi-state patterns, this must be 2 or larger. The next four values are the node numbers of the northwest, northeast, southwest, and southeast child nodes. Each of these child nodes must be the appropriate size; that is, a square one fourth the area of the current node.

All nodes, both leaf and non-leaf, are numbered in the order they occur in the file, starting with 1. No node number can point to a node that has yet been defined. The special node number "0" is used to represent all squares that have no live cells.

The total universe represented by a macrocell file is that of the last node in the file (the root node), which also must be the single node with the largest size. By convention, the upper left cell of the southeast child of the root node is at coordinate position (x=0,y=1).

Macrocell files saved from two-state algorithms and from multi-state algorithms are not compatible.

Rule format

A .rule file contains all the information about a rule: its name, documentation, table/tree data (used by the RuleLoader algorithm), and any color/icon information. The .rule format is textual and consists of one or more sections. Each section starts with a line of the form @XXX... where X is an uppercase letter. If there is more than one section with the same name then only the first one is used. Any unrecognized sections are silently ignored (this will allow us to add new sections in the future without breaking old versions of Golly).

The currently recognized sections are described below. You might like to refer to WireWorld.rule while reading about each section.

@RULE

This is the only mandatory section. The first line of a .rule must start with @RULE followed by a space and then the rule name. For example:

@RULE WireWorld

The supplied rule name must match exactly the name of the .rule file. This helps Golly to avoid problems that can occur on case-sensitive file systems. When naming a new rule it's best to stick to the following conventions, especially if you'd like to share the .rule file with other Golly users:

  • Please capitalize all rule names and create files like Foo.rule rather than foo.rule. This helps to emphasize that rule names are important, especially on case-sensitive file systems. If the rule "foo" is specified inside a .rle or .mc file then Golly won't be able to find Foo.rule on a case-sensitive system like Linux.
  • To allow for possible future extensions in the way Golly handles rule names, it's best to use only letters and digits. Hyphens and underscores are also okay if you need some sort of separator. Hyphens can allow a set of related rules to share colors and/or icons (see below). Note in particular that spaces and colons must not be used.

After the @RULE line and before the next section (or end of file) you can include any amount of arbitrary text, so this is the place to include a description of the rule or any other documentation. If the .rule file has a @TREE section then this is a good place to put the Python transition function that was used to create the tree data.

@TABLE

This section is optional. If present, it contains a transition table that can be loaded by the RuleLoader algorithm. The contents of this section is identical to the contents of a .table file. A detailed specification of the table format is available here. This is a simple example:

# Signals (2/3) pass alongside a wire (1):
n_states:4
neighborhood:vonNeumann
symmetries:rotate4
var a={2,3}
var b={2,3}
var c={2,3}
a,0,b,1,c,b

Empty lines and anything following the hash symbol "#" are ignored. The following descriptors must appear before other content:

  • n_states: specifies the number of states in the CA (from 0 to n_states-1 inclusive).
  • neighborhood: specifies the cell neighborhood for the CA update step. Must be one of: vonNeumann, Moore, hexagonal, oneDimensional.
  • Other neighborhoods are supported through emulation, using RuleTableToTree.py, see the RoadMap for a full list.
  • symmetries: can be none, permute or one of the symmetries supported for the neighborhood you have chosen. For a full list, see the RoadMap.

After the descriptors comes the variables and transitions. Each variable line should follow the form given in the above example to list the states. Variables should appear before the first transition that uses them. Variables can be used inside later variables.

Transition lines should have states or variables separated by commas. If there are no variables and n_states is less than 11 then the commas can be omitted. Only one transition (or variable) should appear on each line. Inputs are listed in the order C,N,E,S,W,C' for the von Neumann neighborhood, C,N,NE,E,SE,S,SW,W,NW,C' for the Moore neighborhood, C,N,E,SE,S,W,NW,C' for the hexagonal neighborhood, and C,W,E,C' for the oneDimensional neighborhood.

Where the same variable appears more than once in a transition, it stands for the same state each time. For example, the transition in the example above expands to the following: 20212->2, 20213->2, 20312->3, 20313->3, 30212->2, 30213->2, 30312->3, 30313->3, and all 90-degree rotations of those (because of the rotate4 symmetry).

A transition can have a variable as its output (C') if that variable appears more than once in the transition (as in the example above), so that it has a definite value.

Rule tables usually don't specify every possible set of inputs. For those not listed, the central cell remains unchanged.

Transition rules are checked in the order given — the first rule that matches is applied. If you want, you can write rules in the form of general cases and exceptions, as long as the exceptions appear first.

(This form of CA rule table representation was inspired by that in Gianluca Tempesti's PhD thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html.)

To share your rule tables with others, you can archive them at the public Rule Table Repository.

@TREE

This section is optional. If present, it contains a rule tree that can be loaded by the RuleLoader algorithm. (If the .rule file also contains a @TABLE section, RuleLoader will use the first one it finds.) The contents of this section is identical to the contents of a .tree file.

Essentially, the tree format allows you to add your own rules to Golly without needing to know how to recompile Golly and without dealing with the intricacies of external libraries; it generates relatively compact files, and the data structure is designed for very fast execution.

A rule tree is nothing more than a complete transition table for a rule, expressed in a compressed, canonicalized tree format. For an n state rule, each tree node has n children; each child is either another tree node or a next state value. To look up a function of m variables, each of which is a state value, you start at the root node and select the child node corresponding to the value of the first variable. From that node, you select the child node corresponding to the value of the second variable, and so on. When you finally look up the value of the final variable in the last node, the result value is the actual next state value, rather than another node.

The tree format has fixed the order of variables used for these lookups. For a four-neighbor rule, the order is always north, west, east, south, center; for an eight-neighbor rule, the order is always northwest, northeast, southwest, southeast, north, west, east, south, center.

Without compression, for an n-state rule, there would be a total of 1+n+n^2+n^3+n^4 nodes for a four-neighbor rule, and 1+n+...+n^8 for an eight-neighbor rule; this could quickly get unmanageable. Almost all rules show significant redundancy, with identical rows in the transition table, and identical nodes in the rule tree. To compress this tree, all we do is merge identical nodes, from the bottom up. This can be done explicitly as we construct the tree from a transition function (see Rules/TreeGenerators/RuleTreeGen.java) or symbolically as we evaluate a more expressive format.

The tree format itself is simple, and has similarities to the macrocell format. It is not intended for human authorship or consumption. The tree format has two parts: a header, and the rule tree itself. The header consists of comments (lines starting with a "#") that are ignored, and three required parameter values that must be defined before the first tree node. These values are defined, one per line, starting with the parameter name, then an equals sign, and finally an integer value. The three parameters are num_states, which must be in the range 2..256 inclusive, num_neighbors, which must be 4 or 8, and num_nodes, which must match the number of node lines.

The tree is represented by a sequence of node lines. Each node line consists of exactly num_states integers separated by single spaces. The first integer of each node line is the depth of that node, which must range from 1..num_neighbors+1. The remaining integers for nodes of depth one are state values. The remaining integers for nodes of depth greater than one are node numbers. Nodes are numbered in the order they appear in the file, starting with zero; each node must be defined before its node number is used. The root node, which must be the single node at depth num_neighbors+1, must be the last node defined in the file.

@COLORS

This section is optional and can be used to specify the RGB colors for one or more states using lines with 4 numbers, like these:

0  48  48  48   dark gray
1   0 128 255   light blue
2 255 255 255   white
3 255 128   0   orange

Golly silently ignores any states that are invalid for the rule. To specify a color gradient for all live states (all states except 0) you can use a line with 6 numbers, like this:

0 0 255  255 0 0   blue to red

In both cases, any text after the final number on each line is ignored. Blank lines or lines starting with "#" are also ignored.

Note that a .rule file is loaded after switching to the current algorithm's default color scheme, so you have the choice of completely changing all the default colors, or only changing some of them.

@ICONS

This section is optional and can be used to override the default icons displayed for this rule (when Golly is in icon mode).

Specifying icons using XPM

Icon bitmaps can be specified using a simple subset of the XPM format. Here's a small example that describes two 7x7 icons suitable for a 3-state rule (icons are never used for state 0):

XPM
/* width height num_colors chars_per_pixel */
"7 14 2 1"
/* colors */
". c #000000"
"A c #FFFFFF"
/* icon for state 1 */
"A......"
".A....."
"..A...."
"...A..."
"....A.."
".....A."
"......A"
/* icon for state 2 */
"......A"
".....A."
"....A.."
"...A..."
"..A...."
".A....."
"A......"

Any blank lines or lines starting with "#" or "/" are ignored. A line with XPM by itself indicates the start of a set of icon bitmaps at a particular size. The @ICONS section can contain any number of XPM subsections, and their order is not important. Three different icon sizes are currently supported: 7x7, 15x15 and 31x31 (for displaying at scales 1:8, 1:16 and 1:32 respectively). Any missing icon sizes will be created automatically by scaling a supplied size. Scaled icons can look rather ugly, so if you want good looking icons it's best to supply all three sizes.

After seeing an XPM line, Golly then looks for lines containing strings delimited by double quotes. The first double quote must be at the start of the line (any text after the second double quote is ignored). The first string contains crucial header information in the form of 4 positive integers:

  • The 1st number is the bitmap's width which also defines the icon size. If it is not 7, 15 or 31 then Golly simply ignores the rest of the XPM data. (This provides upward compatibility if we ever decide to support more sizes.)
  • The 2nd number is the bitmap's height. This must be an integer multiple of the width — the number of icons is the height divided by the width.
  • The 3rd number is the total number of different colors used in the bitmap. After the first string comes the strings that specify each color.
  • The 4th number is the number of characters used to specify each pixel and must be 1 or 2. After the color strings comes the strings with the pixel data for each row of the bitmap. Each such string should contain width × chars_per_pixel characters.

The total number of strings after the XPM line should be 1 + num_colors + height. You'll get an error message if there aren't enough strings. Any extra strings are ignored.

The 1st icon specified is for state 1, the 2nd is for state 2, etc. If the number of icons supplied is fewer than the number of live states then the last icon is automatically duplicated. If there are more icons than required then the extra icons are simply ignored.

Grayscale icons or multi-color icons

Golly recognizes two types of icons: grayscale or multi-color. Grayscale icons only use shades of gray (including black and white), as in the above example. Any black areas will be transparent; ie. those pixels will be replaced by the color for state 0. White pixels will be replaced by the color for the cell's current state. Gray pixels are used to do anti-aliasing; ie. the darker the gray the greater the transparency. Using grayscale icons minimizes the amount of XPM data needed to describe a set of icons, especially if the icons use the same shape for each state (as in WireWorld.rule).

If a set of icons contains at least one color that isn't a shade of gray (including black or white) then the icons are said to be multi-colored. Any black pixels are still converted to the state 0 color, but non-black pixels are displayed without doing any substitutions.

If you want to use multi-colored icons then you'll probably want a @COLORS section as well so that the non-icon colors match the icon colors as closely as possible. For example, if the icon for state 1 consists of red and blue triangles then it would be best to set the color of state 1 to purple in the @COLORS section. This minimizes "color shock" when switching between icon and non-icon display mode.

Requesting built-in icons

Instead of specifying icon bitmaps using XPM data, you might prefer to use Golly's built-in grayscale icons by supplying one of the following words on a line by itself:

  • circles — circular icons (normally used for Moore neighborhood rules).
  • diamonds — diamond-shaped icons (normally used for von Neumann neighborhood rules).
  • hexagons — hexagonal icons (normally used for hexagonal neighborhood rules).
  • triangles — triangular icons (only suitable for a 4-state rule that is emulating a triangular neighborhood).

How Golly finds .rule files

There are two situations where Golly needs to look for a .rule file:

1. If the RuleLoader algorithm is asked to switch to a rule called "Foo" then it first looks for Foo.rule in Documents/Rules/. If not found, or if Foo.rule has no @TABLE or @TREE section, it will then look for Foo.rule in the supplied Rules folder. If Foo.rule doesn't exist then it will use the same search procedure to look for Foo.table, then Foo.tree.

2. After switching to a new rule (not necessarily using RuleLoader), Golly needs to look for color and/or icon information specific to that rule. A similar search procedure to the one above is used again, where this time Golly looks for any @COLORS and/or @ICONS sections in Foo.rule. (Unlike the above search, if Foo.rule is found in Documents/Rules/ but doesn't have any color/icon info then Golly will not look for Foo.rule in the supplied Rules folder.)

Related rules can share colors and/or icons

If rulename.rule is missing either the @COLORS or @ICONS section, Golly checks to see if rulename contains a hyphen. If it does then it looks for the missing color/icon data in another .rule file called prefix-shared.rule where prefix consists of all the characters before the final hyphen. (As in the above searches, it looks in Documents/Rules/ first, then in the supplied Rules folder.) This allows related rules to share a single source of colors and/or icons.

For example, suppose you have a set of related rules in files called Foo-1.rule, Foo-2.rule, etc. If you want all these rules to use the same colors then create a file called Foo-shared.rule:

@RULE Foo-shared
This file contains the colors shared by Foo-* rules.

@TABLE
n_states:3
neighborhood:Moore
symmetries:none
# do nothing

@COLORS
0 0 0 0     black
1 255 0 0   red
2 0 0 255   blue

Note that a shared .rule file should contain a valid @TABLE section with an appropriate value for n_states (the neighborhood setting doesn't really matter, as long as it's legal). This allows the RuleLoader algorithm to load it.

For another good example, see Worm-shared.rule. It contains the icons shared by all the other Worm-* rules.

How to override a supplied or built-in rule

The search procedure described above makes it easy to override a supplied .rule file, either completely or partially. For example, if you want to override the colors and icons used in the supplied WireWorld.rule then you can create a file with the same name in Documents/Rules/. Its contents might look like this:

@RULE WireWorld

@COLORS
0 0 0 0               black background
0 255 0   255 255 0   live states fade from green to yellow

@ICONS
diamonds

It's also possible to override a built-in rule (ie. a rule recognized by an algorithm other than RuleLoader). A built-in rule name can contain characters not allowed in file names ("/" and "\"), so Golly will substitute those characters with underscores when looking for the corresponding .rule file. For example, if you want to change the colors and/or icons for Life (B3/S23) then you'll need to create a file called B3_S23.rule. This example uses a multi-colored icon to show a blue sphere on a white background:

@RULE B3_S23

Override the default colors and icons for Life (B3/S23).

@COLORS

0 255 255 255   white (matches icon background below)
1 54 54 194     dark blue (average color of icon below)

@ICONS

# 7x7 and 15x15 icons will be created by scaling down this 31x31 icon:

XPM
/* width height num_colors chars_per_pixel */
"31 31 78 2"
/* colors */
".. c #FFFFFF"   white background
"BA c #CECEDE"
"CA c #7B7BAD"
"DA c #4A4A84"
"EA c #18187B"
"FA c #08006B"
"GA c #18186B"
"HA c #29297B"
"IA c #6B6BAD"
"JA c #ADADDE"
"KA c #EFF7FF"
"LA c #ADADC6"
"MA c #39398C"
"NA c #3939BD"
"OA c #7B7BCE"
"PA c #ADB5DE"
"AB c #8C8CD6"
"BB c #4A4A9C"
"CB c #18188C"
"DB c #EFEFEF"
"EB c #EFEFFF"
"FB c #525A9C"
"GB c #08088C"
"HB c #ADADE7"
"IB c #DEDEEF"
"JB c #D6D6F7"
"KB c #DEE7F7"
"LB c #BDBDEF"
"MB c #525ABD"
"NB c #21219C"
"OB c #292984"
"PB c #CECEE7"
"AC c #ADB5CE"
"BC c #2929BD"
"CC c #7B7BDE"
"DC c #BDC6E7"
"EC c #CECEF7"
"FC c #8C8CE7"
"GC c #4242C6"
"HC c #A5A5BD"
"IC c #08087B"
"JC c #3939CE"
"KC c #5A5AC6"
"LC c #BDBDF7"
"MC c #BDBDDE"
"NC c #6B6BD6"
"OC c #9494DE"
"PC c #3931DE"
"AD c #1818AD"
"BD c #2929CE"
"CD c #9C9CC6"
"DD c #10087B"
"ED c #9C9CBD"
"FD c #1818B5"
"GD c #1818C6"
"HD c #847BCE"
"ID c #181094"
"JD c #6B6BCE"
"KD c #7B7BB5"
"LD c #2121AD"
"MD c #BDC6D6"
"ND c #0808AD"
"OD c #4A42B5"
"PD c #00009C"
"AE c #3942BD"
"BE c #3129B5"
"CE c #B5B5CE"
"DE c #0000BD"
"EE c #0000CE"
"FE c #0000DE"
"GE c #42427B"
"HE c #C6CECE"
"IE c #0000EF"
"JE c #9494AD"
"KE c #F7FFEF"
"LE c #10086B"
"ME c #7B849C"
"NE c #0000F7"
/* icon for state 1 */
".............................................................."
".............................................................."
"......................BACADAEAFAGAHAIAJA......................"
"................KALAMAFANAOAJAPAJAABBBCBEAIADB................"
"..............EBFBGBNAHBIBDBJBKAKBEBJBLBMBNBOBPB.............."
"............ACHABCCCDCECIBPBJBPBIBPBJBIBECFCGCCBCAKA.........."
"..........HCICJCKCLBLCLBMCLBLBLBLBMCLBLBMCLCNCJCCBCAKA........"
"........DBOBBCJCCCJAJAJAJAJAJAJAJAJAJAJAJAJAOCJCPCICAC........"
"......KADAADBDBCABABOCABOCOCOCOCABOCABOCABCDFCJCBDBCDDBA......"
"......EDGBFDGDADCCABOAOAOAOAOAOAOAOAHDOAHDCCCCNAADGDIDMA......"
"....KAHAADFDFDADJDMBOAJDJDJDJDJDKDJDJDJDJDJDJDLDFDFDFDICBA...."
"....MDFANDNDNDADODMBMBMBMBMBMBMBKCKCMBMBMBMBODADNDNDNDGBIA...."
"....CAGBNDPDNDPDADGCODODODODODODNAODODGCODAEBCPDNDPDNDPDGA...."
"....OBPDPDNDPDNDNDADBCBEBCBEBCBCBEBCBCBCNAADPDNDNDPDPDNDICPB.."
"....ICNDNDPDNDNDNDPDNDADADADADADADADADADNDNDNDNDNDNDNDPDGBCE.."
"....FANDNDDENDNDNDDENDDENDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDGBLA.."
"....FANDDENDDEDENDDEDENDDENDDEDEDEDEDEDEDEDEDEDEDENDDEDEGBED.."
"....GANDEEDEDEDEDEDEDEDEDEDEDEDENDDENDDEDEDEDEDEDEDEDEDEGBLA.."
"....BBPDEEDEEEDEEEDEEEDEEEDEDEDEEEDEEEDEDEDEDEDEEEDEEEDEFABA.."
"....EDGBDEEEDEEEEEEEDEEEDEEEEEEEEEEEEEEEEEEEEEEEEEDEEENDGADB.."
"....KBICDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGBDA...."
"......FBNDFEFEEEEEEEEEFEEEEEFEEEEEEEEEEEEEEEEEEEEEFEDEICHC...."
"......IBEADEFEFEEEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEDEGBGEDB...."
"........LAGBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFENDGAHE......"
"..........FBNDFEFEIEFEFEIEIEIEFEIEFEFEIEFEFEFEFEEEDDJEKE......"
"..........EBFBIDEEIEIEIEFEFEFEIEFEIEIEIEIEIEIENDLEMEKE........"
"..............CDGBDEIEIENENEIEIEIEIEIEIEIEGDPDGAJEKE.........."
"................BAOBGBADFEIENEIENEIEIEEENDFAGECEKE............"
"....................CDBBDDPDIDNDADPDICEAGEJEDB................"
"........................EBBALAEDEDHCMCDBKE...................."
".............................................................."

The easy way to install a new .rule file

Golly provides a quick and easy way to create a new .rule file in the right place. Simply copy the rule contents to the clipboard, then tap the Paste button. If the first line of the clipboard starts with "@RULE rulename" then Golly will save the text as Documents/Rules/rulename.rule and switch to that rule.

Deprecated files (.table, .tree)

Golly still supports files with extensions of .table or .tree, but their use is discouraged. When Golly opens a .zip file containing .table/tree files it will automatically convert them into .rule files, but only if the zip file has no .rule files. Any existing .rule files are overwritten (in case the zip file contents have changed).

Note that files with extensions of .colors or .icons are no longer supported and are simply ignored. The .rule format can be used to specify color and/or icon information via the @COLORS and @ICONS sections, as described above.

Zip files

Golly can open a standard zip file and display its contents in the Help tab. It does this by building a temporary HTML file with special unzip links to each included file. Any .rule files in the zip file are automatically extracted and installed into Documents/Rules/.

A number of pattern collections in the form of zip files can be downloaded from the online archives. golly-3.3-src/gui-common/Help/problems.html0000644000175000017500000000144012651666400015673 00000000000000

Known Problems

This section lists all known bugs and limitations. If you come across any problems not mentioned below then please report them to Andrew Trevorrow (andrew@trevorrow.com).

  • All editing operations are restricted to cells whose coordinates are within +/- 1 billion. Not much of a limitation really!

Note that this version of Golly has a number of significant limitations when compared with the desktop version:

  • No scripting.
  • No multiple layers.
  • No timelines.
  • No auto fit mode.
  • No hyperspeed mode.
  • You can't change the colors, base step, nor origin.
Some of these capabilities might be added in future versions. golly-3.3-src/gui-common/Help/about.gif0000644000175000017500000013617112250742662014775 00000000000000GIF89ayað1ÿÿÿ333!ÿ NETSCAPE2.0}!þGifBuilder 1.1!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷¾xÃý†Ä¢ñØ ‘̦óù»5”ЪõŠÚ"K„´› ‹ÇÌ­JhfHÉì¶ÛØM×`úúÏë=ñ©á^¸7HXø!˜@ågÈØèøW9‡øhyé3©ò€&è‰*Ê¢éP¸4ºÊz±ª’kGÛz‹›Hq:ÇË›,ü×2Ù9Œ|kKÌœºœMXê¬Û[]-­}I½íý­–!.A~fŽÎ®žÒÝï¸._?LMo¯¿Ï‘ÏÿïÎÔ8N š€öb<ƒ gó×ÁĆ +%zÕkFŠÿm‚ôŽÏÆŽ$+¨šf!„‘%[æPB–JY.kºR„ÊÂ9®ÚüirÅ12ùÛ 4i3f‘2õ"Ž¥Ò©ã^y:ÉtM$„N­˜XN(3°{p˜}*Ê—Z¯[ŽšfUYª¸®ú²#É–™­FñJ aUÛ±:¹@Íû±¯¦¶uÎ^û Ùq¸•qaIy²e´> ]œRJÏ^òÆÜ x.]p Ð ®%ö §ÖZ(#™ókŸ“éè\xsæà±I[>µ¬ÏðE‹?'^Jú/ã³s:¿Èó6RÕ¢«OÞøWaßË5n·ñð¶‘_þ°pÅ„¥_÷:>– äŸ¹ÿþ MWØì"Uuaav {=e0 J.•`9»°uTrtÂvÞsÖçÝy<)š€¿á—ÛJ'j‡^ˆš¸SÇiNW«ÝÈ ­)'>»Y04¦è¢f­ˆ—ò}XZ“ð5÷ã{Ðip™ƒÙã;‚‘’8~)áà})^&\ob"ItÎacæz‡]Z“RªØ!vê¸ÜYA‚Dçäù–ežµ˜æ¥š`.ZL¢²mè$—iŠh }é½Éç…„]xä¥-bF"‘SFúg”lަߓ£šÉ`™ZÖW ²Í7*¤¸¨inœRGi¤x†Ze‘›ÆÙ©°¥j)N­ÿú˜‘_aáhrT­3»FHеqÅj¥svE·žúq-AŽ’pk¦½rkª\±>:(•2Ê‘]ïZÈݘ,î)ª´íykŸ–Åq™dT˜ž)ðƒVzûÝFrG&—˫‚Ǫ¢¬i(¢ à¼ô¢3løR6¯¾Kl¤ùùúfe°Îº¿Á.©ò¤¶Ì2–ìÅô²¿<>¸”?öñO·9èvç>KƒŸâæ‚óÒ…”šÕ\5#ÙÐ28Ý.Ôûj}Å^X/Õ²~òØE³#önŒù'ô‚€®}ãI÷'¯GtÓS±AÌYjïÍÓs[`?„×=3¢Pž­øâ_†œŠä–ª o×&q¹Ñ)ñ¦ùkùÞy+3*l1é¥—Þ ƒ«/šáC‰¿®”Ô±LKûäåλa½ÿŽ‚í¸ûKÄ<ð÷æ|ç±WÞüT* ­zô “.¼õe3{vÙk¿ý@‚O·DWŸJ~E›ÿ«Sõé׺Ɇ"ý¾ÑybØ~ý{‰œtúïßùýOz3ù„ûx=”¬/×8ô=^œàï2fÁ Ê !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÚø‚Íì¶«N„ÅrôûŽÏoâq%±¤'8Hè ö'ˆhÐÕWøɶ¨¤8y`w¹ÉéäHé¥ÈPÕYjªcIe¸æ5©y ;ô÷):”*«» ”™S „É;,{H’úØšKÜì|ùÁœ&ý\mJ­êq(lÝ+ ¬í=NŒaNž®Þ»ÞNžì/ŽR?g<‚œï¯w/Ø¿ÕÂ!!ˆ°DÀ1 :œc_‰+j0È.ÛD+ÿ¹Züˆ¥€¡<‰¢FJBè‡2&WSV¦œ&3gHnùñirÔ9Dúb„Œ¨Œ\Š:m©R$7žK›"}ŠU(Ò>Ê2äS5¤U¯pu3ËÎ¥ •j¸Ò¤¨Ñ‚ÚžYr…Ö–îO½G[e:Øœ´@oEØÆ(³W†¡aí㽆;.¼ pÄ„[*ö)øðHÄ›o%sÈÇܺíh™å#˜ccÙ\ .û™U(œ&G®Ìy2NÜ„w™H3¨ÑÁ1Ï9zXü_åhŽª6㉠¿úxoÑÊ}].¿Ù;h¶/‘§Fÿžùyß_K[=¬[¼ÆbÛÿãîY€½7`Z8 aÃ\ RƒÑ_á˜\_æýáE¶Ý§ƒÖQÖ™_òÙŸyÈebfãM8âräµèFtpè`%ëU²k:¦ÀÒyîÁŠéâw?Á˜}BŠB~Ffƒd|/^ô¡nö"c•ÔmÍ’;~ Q\Ú=È^^õÙR!ˆ>™Þ‹Ò1H£dzù¨¦slJÙ^wZ™dw¤¥i¥„4Ö¨dn]‚‰è s}2ØŠ“Ñ9‰…æyÛƒs~Ö‰"JzØž&¦HiŸ‚hcBeYâu†–$̨g2él.†Jé›–šišWÊ e§©ú ªˆ¢Æ©)p¶qÖ+­eÿ± `˜¤ú*„—ÏâWAŽÛáŸyF”Ÿ´¥­¬‹yê‚«†–i§Þó›\íò:í‘Ön¹m¼ôÌ›(H®éšÉºÓ”ië«öþXç™®ª§œ¹n¾J¬Šâ ¬£7‚{/ÃLnyonü/¿o„o¾­-'TøRUi°LÂE¯Ä·+'¸$Ál(Ÿ»œëÁÐ÷.=;‡;#´ßZxi8]©&²S¹èÕ˜GóÃ-–ƒ6ñ¿„ܶŸÔu0ʘ±yä²$ÀZ=Ö¨a†r†d')yñ´D³{° ¦T[oÈò¯5fL7JS÷ÛóÇÔÊEtßEM*†?e´Rƒë­à͋뫶ä}µå¸öäî$ž&8–kz¬Cü9è;»7á©Cez]IÎtì­n´X³ßïNVé¼ÿ^­ïÀ'öð®³k<îØE“üï05ýNÑO?t©»o=õY…½MæÚ§ó<äSü÷9©]¾ù#ß›­úˆî[Ùqé»¶ª|5&ýMÕ¯iúÓÞ8®îD)V-~à=:ä€ÛÊü(ò ‚" ø(˜/š`°uùÛ ŸæÁº !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªU…$Ðíõ /irÔ,N«×L´"éEãìºýî±¹å†ìâ‡(8è°7aÈçG¸È¸¶…xyØx‰9$YÈ7C)•*Z÷Hé99šªúaJAwzÖº:K˲éùŠÚWÛëË{¡Û!Iü{LhœW¨ü׌ ñl++}}IA¬íÝØlý=.ÍM~Ž~Ó œÞ.(þF²îNß–_ŸŸ:‚«ÿÿ…Ÿ žùskÁ(Þâ°AD‡Æñ‚!'ÿ;–04‘™«HKÞòjN'¥LºüHÒÙ®™Åb²ë÷ äKŠ–$¶¢£³ÒΡÓôÔìÃͨHšƒmTÑcfüA´ù4ëÆIRAùˆ‹Â•Ã,îBYÚhz.¢\Ë•iN·WY9ÕZË«8m—l¹a”}× ³Ö\°`ÞԢ԰߃5?–x9°e¹%›R†F1ÆDèÞ š¯AY~z:KzWìÔ¸*ÏfFF¦F-gãw^úB¡hjV™Tj)Ófƒ²Yž›¢õ&˜âAig‹yž2Zsdž^ú¾v'ºñý .yßã²ï–?>þÉ®pH€Ÿ½ñ“¹Ìî€PÑßþˆ:¶-‚•ûW÷À ÚŽ[ì  !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·ÜÙÕºvÇärôÛ¨ZÍì¶ÛD'nâ·ýŽ©ç89‚ž(88QWsà÷甈HèøHXg¨Ây‰I5ĸ±‡x5™):Ê"Úxöv Hú «qzˆ*Âi›«+cª×´ l2AlÀ)œ¬LaÌ@ܼ-}D-}=ÖƒŒÝí=¢ý-.´:Žþ ýÅîmÿN8ŸZŸ¯ó|oÑñOŸÀå| <˜%TÀ9x!|ø¢„…… ZŒ(g’ÂUÿv¼²jÖ>Ò ‰r7‰ž‘0™òâ¢4íî±<– f̃ž>©rv“IK :w>”´©ç1¥ …v(h4*GE¦”º¢¹æ)T©\ùl–ÓZ|&šò³9œXÚ.Së–ª¢¬”ú¹$Ë!h×q‘6ËT"»j¥e ´ØÜDp§Î2,´äá¶dYqÜ5Œk†‹9Èʼn?ÑÓCï^ˆ†.ó©¼Y. P˜gRöl`Km`&î›Ò/Ð8[~Ì08-ØÀ{ß¾ ùäî¡Tû´ö»Ô÷뢨!Û&~Z4VTΙkÄý{²Zã©“ÿ<½ùhðµÏ·ßhpÙ¹ù[ÿÕšY²Õx£áw WTÒtÞ— fâ%ZR^õ’u¿ˆ× rû±U^|ö•‡\P¹"|XÉמyÌlxÎ_`÷Ùq·ZŽÙ˜…²x÷Ot~øœc"fÖbÚØÔ{ºy8܈óÉ‚žpÒa!X•¦±çÓÿ馗§}I`}M·”SVyâŠóÕÆL€ÏÉ \iÉ9#‰ENyf”<úØc“ÅÍå–)ªf¢;ÀDŒszVç‘Ëñéœ:JœkW¦‡džoîÙbrf hYeYhšhnšÓ¨‡žéŠR†šäpqbš¢¦wJ*ªŠ•‚jdŸB:Z*iL b‘UÿQG‡iH„j¤îê& ’TÕ¥©1IæT~rø§‚8^Kì§f«›´ˆÚ´¤©èò ÃM—1;®¢)!µžFmèçw‡>« ·½bI§zU;‘¥™¾«&“ïÙ'tú¦*}ßÜpÀ A<ÒÁßùWT·öît]2B‰¡®ù‹2:骭r¦äÌÌQk§°1[̃¯–q±€ÖW2rÖ5®º#dÝ-b¼[½Z‚3(ÐÀ˜©´#o’UÊ)w9uír‘¯Õ»`-u[C-óÊ41üaÚK TX/NsÞÜz_Ëð×`LåÞs]rã\AÖ‚ËTIa*þäâ{­”‘SÀ ¹äQ} «˜þX¨¹QœjÒBr‡~µM˜ J5ê1©¾zì®Ïvà¶Ð&Ž!ãžûK¼ÿ®±š,ñ<ê+cñÊ'®Äò³Cþ¢óšÇ;ÅÒ'zù‚×ã.õéÛóåý÷Ó'_Šø‚‡½ùïü“é«o‘³/¾: :ÇQøõ_}«„5‰¼?ž ..V¡_I&’SY W— È@™¼Íl~‹ààüS; O!¶Ñ ðÇ:Ò€"ä+ôWÂJ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªÕ—\³(÷ ‹•´H™ñ«×ì& °}åyûŽÏwäóú[û§'8HÈqgg UÈØ8x¨•e·èx‰i”¨ˆ(™–* 39± eæ9ÊÚZq*™K—héz‹›:³Rç› l2Yª°*œ¬üʻ쮸NŽ.z.’´žþ^ElÌ_âîþ oßÿ‹“¿wÌ­H0!cóÞS‘T$SûR4ü1#¾/ÿ\æ™ HO£Èl°¶‰ÌEDfЬL ó„—/á8ÜC'¦NSÈhí éÔÁDUQsÈfŸŠ:u0 (@VÍù4«Ír'§bôz¬d%¨YbõPG YA[Ô>kë«”§v|ÈþìQS+9¹GYVý;\‰7~~ÁE3«l]™ídÉ[ZÃ7Ãî²8`âÊÔr†ê6.Ó»>c)º’سXô:UŠðçž!Ò†kÚçL»XËqÜç³åɸ!÷¥º‹pÍÀ'ú¦L¹0cÒ[9åÈQwÒµdoÿ†¾´%òÞF{nŒœ¸Û¤—u‘ß¾sðø¨Š‹6®¼}õûº©Ûÿú”—,´M$Í eQàU<%×”7·uú‰Wàrræ•bô}ãS’YØtw™7ßsW("ƒ¡U´a9ø½7bsÕÔÑ‹6ñÝi\¡èZ:\§\TIw‘긢c22w§=7]’ºè\y䆨…ü±H¥\5rÈb†ÈÚ€¯t˜Ÿ}.FiY›Rfib]’e~çeÉ&–U6ùÝœèµeä¨äiãž1¦HæNŽÉ¨!ÜÙv`‰¶ød‰Vòé‚t$›pZ _œˆJ^ ó‘ º¨æ Š¢ùži‚¦*ª´fº`Pëièi}µ&'ªžé1gª–p¡*¥¥ÿIÉë«(6K!^ùŒVä‹®iÔ¤xî൱Ñ’ÀJ[èˆuZ‘·$Lv&¥Åš{ƒTJ®šm£ön«^(k¤¸¶ª „±ú¥¡}á9y[h›R{d©rFÊéÁEö¹« GhÝÃvfV«¬†ÉÕ½zÍ*•™ˆ{å Zi~+Lð“07­¤æ¡ÖpÅÂÌž>—Ël´AâèåÇ´˜l²€"EWŽ‘ È8¯Ë±ºŒhl5!ÞYÜæÂ²é'5 €‚+ Öa¯±5ºd>­ÚÔG/ 7„Fv/¶¨·=s勘`Çõ‹wÞ{õmw8g-xd«xÖ‡‰?õÉ_N°¦¬ÃAŽÒJ*Ÿô { b>l8讜39¥›ÎJÖŽ×v9ëc¾þìO…½ºí:]ܹ«ºÃ-ÔçÿΨŸîåN|èkù|ó ] òÎë}BêÓÛøÓ×ç-ýövï}V•[~ø¸”T½Ëæ‹I{äâ®â¾÷-?üÖOùûT•o뱫2è §âK-’F@¦ý pßI`ñèÒú90# ÙÂ%8A ^ƒdšjØÁ{5ÐX!LáJø»ÿ p…0(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjYK UQ nÇärTì˜RÑæ¶û]þ²©^¸ýŽ'©â9Ÿ(8ØðÅ`èw–HØèøÈƸfø×õx‰G9Ãø#™ Ú³IA fêõ)ºÊ‚º!'éÙJ[û ªòúg€k뛉x»¢ËKü{ìhÌ›¢«Œü $|á¼}¶›ÍÝR]ªè=n>JŽÞÔœ›fnOæ±oß6¯Ä“ï¯× ' ÿd7¡Þ‰^.<”0œ6j+Æ`¸ÍBA‹ÿwô’3cÇ‘JDJÔ$É•!˜ì·QË™¥Ö!Ú‹ZL4{œ&íe;}:œƒQq'¾3 µÐÍIRû "²hÔ­Å*bZç–1•8 bµ¦õŽ•µO‘±•öiVX¯%Éf<é#-×ZHAF+´mW:kðdéí¡±»)ntñÜ}‘é%F Ylã«‚e¾Âʹ²KÌp?[nÂ’ã±òåÈNëQ>ᙣ°¸˜Tš*NÔ«¨£lª«iÜŽV-@×Öy¥´÷éP…,‰mÔ®£\õX®¼cŠ'+ª”è~ÜŽ—¤µ•"<s㚚隘½éÎnÓkío‰‡®~ûÖok‡å«oC8Åb§erA p³óÒjàÅ[LZÚº7l²©ŒÇôñzž–gÜ–Æ8F,²§;Òùì» –ìžH ŒmZŒMò HgˆÏú'f\ ­|ÖÞâ#¨Â¬xÝ›¯fÛ»ÝAMwÒ ÃÕ$puï­Ó¤Sµ3Ygó=c‡m]Ⱦ/‚Mëé«¡Œ3®Ô–¦Â >yÔO ¹sæžëô¨u×¹Òùç&ÔbJ‘›.Û·Ù²ÞèÒä‹9ìäØU¶Ôn{: 9Ý{ÝEæ¼ç1É®{îÅÓ´“’ª/ß“¦NéÅ;ô|åV½õÂs¡=áÙgß=ªz5(¥4˼úÁµ¬EÃÜ´Ih‰ÜŸÜÞ¢Rk‡šHEs¤ÎMÛbêWpáíí“Dî°aaj‘ò·ž35H•MFüÐÏߘ#—âDù.Ù[6ƒ¬<ú›ç?¯…^|š´:ÉÿÂj5!xpÄÖW%—ÎÝÔí-ÓxKÆy™tlÍt3w¶«¹a½ÔךKb®<³]Ö¨×>œtjMèëc¶žJøêg¸¾oÿý:ãøËŸm>xäÕé«ÿÅžÜjHa§_Káù–jaÄ‚\`4PSÞZ{œY¸9+gà…*¢ufçWOZ ÷xª‰hÔ{Ÿù køE’ qº¨â‹ó¨c„³ôô£ˆªt¡ Zº)GlÅq'[:S-Xa‹÷UãŽ2æ†"‡ÞÙ‹·ÅH¥†É)sOþ}Y¢QÝÁ„’nFI]V;™µÝx£%¦$Žx8 „4ÝU—îmé%;|Ny¡‰Ú9a~wê5Y¡ÿé™'"¾‰)Q\jÊ¢3JЦ ÅÙŸétt]P¬ÇØóò‹®¬rþ™cüw®þŽ{]ž o_Æ Â~M￲-)^ÿ æ¡×/‘Á… ½U×0b†„í.P,¥J¢F}ÿÝýÁøm£H€Ilíëi¤Êrò4¡¬÷°ÚÊ™°XíÈG3§.w-§¼Ô 4¿*&kåøt#"/¥™4ê k§¦U*é´¢Ô­–“ÔT¡Ã±$c¦²‚ÚŒiá¬õ6 UJ0ÑlW[®ËªÊ±6BQ¡FëŠõ(—¨Ó¯JVÙÄÈ­ñÙŒXÏý},ÐðbÇŠ!á|‹™¬O_¤èLšK‹\Ë>qgìå Ž5ت‚-KÖÜ4e_µ‰Aþ8Øånß…u»6ôwïàx‡cÕ 74îÃYUYMM½³öçPùw¾=çÌŒ§+nžî÷ÉÇ›|ö¼úæéC¿ƒÞ2¹RMoÓÿíî߯ÉEß ;eæš0ï)¸_9àTÙ& &(L`juXh¨5 GðVyÀq†^yCµöblUÄÜfî™WK>ý3#Œ²áWk°í¨ŽñyÇLŒ/®¡œ~-zBF |GŸ‰:ÉÛXÒ! ¥‹DþçA‡<~ÉÇ–r$YŠáQÙžˆ/šˆßN€±wYub6Yßdk–鿇BrÙ]vÃ]ù¤‘+*ø’Ž`ª‡vÆùT–X zçynþµâ†}ŽV"‹IÚ™à)Ö=–‰›Ô(%§š^ÔÅ ‰5ú\”#FZX§”ÂYå¥DfºÜ¦f®©'¨Šú©¯îJ Z^êò+ŠqÿL´ ƒBʧ~ÑŽ·Žœ¢ê)LÂò°ç¤ª1ÊÓ€Í,ùj«µšË-ç’舾«â˜Óv†Tª¦&'í“øÅy¦æÙ¯¥¬Ž†$À³‡¹¼.z¸Ö>]ÃÛ!¬W­{âÂŽlÔy¦Þ:k¾ÊíKÚ  ŸÉ`¿Ä‰6§ˆŸü)¦S2œ\¶ñ 43`ß«°'Lɲ1ÇÁ0uh`õ€ÒZÝ&ƒrÆŒôäœ^áÖ.v0ãàtÖËH,õ"T3™ôYüæ5äÐF#ê#X‹†DBE¯NÛ£ôªtï]¡kiîÌwàâ­ÆÊ*Ì-¸2Ðþj+Ä'žSÞò®+!…¸sŒÜ…Q{9æèìxç`R„¶è¦'ê˨Ÿþn³TÖ™⬫Sú!”Ï›ë¶kŽûŽÔûè*ʼF…ò^<äÇ¿îlò35Ý8óÎK™!M¯¾¡‰}ç2qA|÷ð†-þ;sƒ~ù¡d\}¸é«¿þÍ&ûD>üð\¼5磾oÿ+’«K?þõï~Û VýH“cuA€ŒM×À½Å ŒàB&2 z¯v\;<Ó€p„;(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ†^™ñ8 ËÕírû`ǯçü¾Ÿãæ¶ ¨Gøwˆ˜ˆ§‘Ö¨)é±WWó8©¹©“™9X×àôÉYjšcF)jóHv ‹²ôiG(dŠ%ËÛ»‘ú¼ê ìk|¬;KZŒÜÌKê’뚭Ѹ#‡å; S ´+©‹‰óÂL=Œæü™…1 Dáìl•*¶šE›2zó.éÑ Ijtе-1BµLÆ2«X@—\îBê)eÕ÷0Q=Ûì†Ü·Îæb i‹k^Q_wôëM)TªxÓ²ÄÅóÃÃ6yÞ¢KÌ-ßVÙÚî²Ë8r¨Çpµæ|ïí܇75h«W+S×*f Ø ½ƒYKµ…qçwa'—L)™5eU»SSÆL8O1ÒwŠÿ¬òdäw1E×:ôŽ0É#ˤýka±tÞ…ÿ. ½2z×6ïúrïôÏÑ·¯î¾yÅ싘ÉÿÝ –u|½B‚%¡]³‚ ^…ƒâ<qjFÎM:W•Je½‡K%€3^vÀ57"}l`¸Y:_ÙõÒy™H¢}Ó…æ5¢HF ´^l>ª œjkÁÖÚqË#v0º¸_Ç•F“"jšŒ¡˜Ø‰ý©…£€õåG^T¯Áöc™Yê‡Ô˜÷…‰¦Yl²HåzO*ÈU{;j)!žò½('œJž(àm¾'—/•¸æ|D’if£Pz"\œ5y¢JªŽ¡{j:)••Î×gˆÓj$X%5y—–úyè©=QǦ«3ª÷ç¥sVX§|‚Ê*\•|ÚÊjœ1æhª¨ohxãªÆÿ÷MËH 1wåN¶´+…Ö·JE*d«=+ަªd Š“—i—ù-g.*¢…KI³(9Šï€.ÝÂh!‰R«m’ªF’[ð»íW "Ç/–½Þ70´¼fsnŹޯi^ôŽÁh‘ùÆ4)§`Ú&qx¨Íz±››–êÅÌNËÞžšç°»È1³BÌ‘w½e\êÆâ·¥VýÆ:rFžÙŸ~]œòƒdá§.$/‡Ã'S=œ¹GH)=g­ÈÖÓx ð×t}\o…7íãuâÅ´ÛáÑ]¦ÝH¦– žò=V¼þ:wãà„Çv›Å@.Îx-ÏF yå*¾/…ó„YrmùB‰ŸÕ]yhwþÑèÑrNzN¨»·zêM/l•…®ó½°éh¶>;?>…œyî€á.·ïfÂ>‹ðî~ðÆŸ³RÕV/¯:ºE ½£Kó^ýOÄ3Œcöù6ŸTïy‘í‚ç¦<ù±¤Ÿ)ûêŸb>Øú¾Tëþ±K?N&× üù¿~¤Zý+SC·H;x©„l¤[ãâ×@“HEoŒà÷\, vÎÒ ðÜçÁúA0„Ç« Oˆƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇQ@Óòçú·uÝ ‡Ä¢ËÆøŒÌ¦ó9D.~€%ôŠÍjYÖj7¡ÜŠÇä«TÑ=#¨å¶û]<«§_°ŽÏë?õê¬À¶7HXØöð5fèøˆ·(ˆF险)d ÑY™Ô¸9Jº‡9è XÊÚzò‰†!Iëj{K![²¤‹û;X;!l ¨º«ê ¼LÚ©|ÈKÌ<%ˆ˜cM½Íô<œ¢Í-^&ý>³v>¾^œúÍ÷ÊNOX¾VŸ¯=™Í¸6ê„S§à±ƒ ¡xëWL!>y +ò’E1ÆC‰ÿ;ÒÆ‘ƒ”{Kòñ&ñ!:“,oôºv!ä™-k 7NF›<³){é®Xb4{7S¥<¥E:M—.Í*Œ3ŸZ!G‘(|?›^ýª!kB w"žJµ¬X6¬¸åöÖ\jq{«•ÑY;9ÿ…õáì-5„ EúñO{¡z‚º(.LgvQÍU\÷0âÄÿ"k^HYíD’™}ÕÊz™kŸ9¨õ¦NeNéÐÀ‚é­3öu®¶;; „2èáÓduzÖ Š·Ü·‘Ù:³ƒzèãÄ—¿s&?ØÄG®®+U4䉀‹ûM$ܺ'ó¸Å__ý}ePÚ^9øçÄ™ý´ÿÕßvBwÙwÐÁÝå%ˆŒb½qæ }“<‡V…mÖ`€®tá~èýány™ÕØI‚¶¡dîägYu¦¹‡âc÷ÉÈâ..®xÜá‡#yfùx ƒµ IÄY¬…x’%ÿièØ{“õh#fê(W*òS£t˜ý%$Œ Á%ØÞ’I‰& dyæˆ Ò×Þ;7·d9óÉ'Zv:ex¥}.egjÌÝéezŠå–êA$•L²¥ )AŒ©¨§˜-*:YeÊq]koÎCtº› Z)¨‹8gŸ1"(•…Žz)RÆwSžº $¨cŠšé¢˜îš'€O¢Âª¢®ÿbéÝ£•ÇTSR˜VÎF”ëyLòpš€`Vð[“¯ê`f©/zz̵Ñt™”ØË­‡è–‰¨,´EÊ^½¾Û¼fˆ!žåâÚ½Ô)ð¿Ÿî©e†•{Ê;ªëW˜ÂJô«.¾&­©1YK«’o›p±ê¹:0¸¤ Ûî¾pÞçðŒƒÇ%ÄãvI‰¦Bë|¤‚ÿu{bX÷Š,N³7«s‡kU8ô6C‡lHÎêè–VÔ‚ÆXgñ·¶h]¸Ø¬#Ëì2}a|ÅÊ%ÜpÙ(z±Õ´Ýq¯××»Úö“ßDN5£n©ª}°áµu¥™±à:Ny,±À­iYåšc%aÀ›þtãÞšó`æ ç›µÊxzë öëzìÞÊN»Ô׎»íäýaîh²UzÝKû^éðÌFüï2–¼UÌ#öuµÍ;¸•ÓØð×¼PáÛkš÷&hÿý#À Þûºå3ôâño9ùëõLÔó‹œöG¼ßßSýÎíÏ¿}ü/h%  ò‚78ÕÈÏ€)à%ÈÀÃ1KeŒ Kf± ‚ƒÔàݺf(Rq"¬]XÂ. !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íò›Ñœë÷üïl—à&¸Ögxˆ¨¢(t5xð˜(99ŨIdIéùI“9ÑÙ¸ F šªZ‚ê‘yʘ·:KY×ÀY»»Ûá‹ÅF!êÌ{¼Ú)*(\±ŒeŒ,Ûl-Q9Ímø<ªíìüÝ]®¬nήê«| Ô>O_¿¡^¯¯GŽÒ*ÖoŸ@5Ã0äÃ60¡™wBº§0â–€þ8´'1ãÄ/ÿ ÿiüØâ"Ç ð‚4`Žº¢[ºíFdJ¸„(zÅ@h~)Š·b é_†?Θ”e×PŒw\y>R7ÌT.v$Y‘jbHÞˆ$ù&c“Abù$ŽÛ•™Þ|p²)§IðUäå”f¢c&|KjueŸ¨…™%ŽNŠ™(>i®I醭'.¢Øbsw®ch{FšÚ–J¹Ü xÆ]žQ¶'[uüÑ é‹­ñ_ŠQrÙÞ§†úÖ¨–ŠÝ©žÒ*™‡ÿÖçg²öô8+§ºVJ¸ÂX•Óu™íOïi%jZ •ˆ2à¤ãœ©¥5º«îªo¢º,»6Æk![Ñš‹n¥þžŠ ¸“ñ{Û¹|’Kf«pΧ\½¿ª*ªÀÙÌvŒ2̨óbìŸÄ¤’jqÇãð£Õ&xáaøþ[Ï«õ56XÆ—F—g¸†¬ñs4k ±´97›rÄ"ßLòÎsél/ŠÆ)²d½z>ÂØ‹£’ÛÊ,w¬Ë†W0ÐÖ’T´½½ˆLð!MË,ŽmcÙµu½ÅvÙf“mõD!Ϧ¨°=ÄõÕ~<'ÚSœv y­`]Oxxã¬!è ýî8âÅÑ…ÊdˆVžØÞ¬vóMœå¦zAŽúƒŒCù¸©[ÅoI¬¼Nú_4þqî´ûÝ¡»ÿ~4îÀo»×Ä0ã#!ÿ7pƒë.9ó•bKܰÒÃnýäãyýn¡COW÷jR/ºøµ¯¼ù‡§¶ú´ËÞúyî³ä¼ëhy<D¾'¯¡˜uço6q¯]¬R¤#·:倎I [¦(áHå©{ÍÚ†* bC›×4È}Ѐ±ðÙ+Xž žsPY!ðJçBâ5á1¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ›KªôŠÍjAJHWnÇä2ô[ƒÕæ¶ûíD«Ø&ŽÏë1ì;  ·GXhx1øôàwøy¤(áXçgW©¹9“Ù¸6É9Júé5á9áÈXêúšñ•j1+È ›[Êû&j©+L Ì#Æ´<¼ YËKQ»èpÍl5[);Ý }ý .ø×ˆn~NY}RŒÞþȾ ¾êN¿Û TŸ,ϯðÊ6BD ˆ0г :ŒSμòZü·£âÅÿ5ÒâV‡£H…ž“üXEè9kŠõ6Öòh{sìÃ5·æÃ¡t36¬2Þ1ÙUfKë\²0]¸µžÎL4òU6—KíŒZõ8x‘¯½ËÛXcÒªn&7þ˜NdÍF¡V¼[»yÇÒÕ§ìþºýÍÁMÓÿï¿VèÉG;D¡tY‚ò— F4TÞ‚Ù1˜R…÷¸Û6‚ x.¿EGJçÕ·Ø€ÇñÒÓz ÎbqÓñGb9Ü%6£‰®-¶a\zùe[8éßj´5f zÙ˜š‹ûXQ{"96¾'Úˆ¨!”þµHÙ’O†Gå'µùHæG¾µ"¦‡ ‰¥pHòvã¿dÆ¡hY¢Õ&^!:)g•ú‡–oZ†Ù •¥¥¤&cYf£ü†{^¸§rЄi]ZvYbIòÅ祣1‡é~’ÝA¨v†æ©*ŠšF‰§Nzj¥×‰:'fšêæ‹R2yèž~Þ˜Ô¦½ªV㪟ÿ¶ºˆk>ˆ¦cCŒéƒâÅ’ Y ªÔ‚‹¦÷ŸÄ⊢¶ä| „MÐN sBêÀjR϶+¦£ö>[‡Â–fµ²¨gùZMœùíjg|"þ™k¦F¾ylišðŠ®2|$©ï;ÈrF΋-÷"ô]±Ñ¢/DùïÁ¥J|ḴTeļ2JçÄÇÔÄ…æüYÅò¶ã¢.é ø<·˜¥ ï r‚f~x1‰×,-lx3n›š*Â-¥Ö”'„ª”“wûùæ}«¹èN£ë¯éª¿äùê®SEÞS¾®·¿ZK{îøÂ®ûÜ¢â]zïJm%«ðÆïþ%>ÇÆrä-Ï<ñLCVó9Oý5Öm·WÝg?„† ¾>M‹üZù|ˆêNÂÛ¾Ïy쩤:Òôo„y¾ ³†½ý 7åÙãبIH YýC Lw@öè¸ÛN%ȹÁ]ƒLC9øn„á! —‚‰ª°!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍj_¶ibÜŠÇd¨WVTËì¶»ÝM×ïºý>’3Έ%þè çñÃ'ˆ˜ÈF83xp”ĨHY‰2i B×Ç„i z’ö™Ñ¡é'ºÊêèŠÚG’*ÙZ[«ÙSš¹kë{÷I 3Ź×û‹ 7qlUûš-­ôõÀL!w=½M‰û<ªÍ-.ÈŒ>®œÞ쳈ëm,ow~ÙÛŽïŸÕZ¹±Ð£°ª„rÁæ0b¨tÇ„5úÀP¢Æÿ=Z¶1äbT.u‚(2%—ƒ%1¢³¦2¦oždÚEË1=„:æ²Àò¦P„“Hvâ Ê¡Lf3ŒNO“›Z]FÊ‹*5FÅùv5ìÊ£\Fš·+¡Ow¹‚¸åö¶ÙÚ|™êÅšµ¬NkS“š+ö×™*_?¢å«FobŒ’Òž<1¦Æ-Ë’[ ­…:f[ræ‹q;·Dì´áÏŠÏz•waˆ»UòtË©ëO4—KxbðYÚÞÁE«.~¹ô÷x†u<µñá˜1S^Üü´ÝÏHyÝž#·ÅÙ×aj®J}²iô²s*‡\jÞóÍ£‘WnŸùmy°çÇÿ:Q­-·YàL†Íx²q¤TvØ]ÐÏ@ýi·YE^T† fèx©yÝ_æQÇ^…!¶ÕWzÞ 5ÂA§Þr%J6HŽX Ž'îÇÞS±yG[mB Q“Ž}E|/šãtíµ““ƒõU7b2懟)SÖó :6™"t­éV™Cžé’‡guDRŒcnYÜ“m%H –œQ¨&-ú§"•Yöhšq\šµŒYîéJ6(’‡f£9øIŸ‹¥'g”r–h_’…I߉Ò%G§¢^fŠgœ%}y(œ.*J™™ ij¥“LVJ“é÷#õÈZ¥­~Îúâ~‚ÆêªÀ"ºjŽ~ÿle ‹Dù¡/I¥…Ìm¨‹–ƒv¨KÈÆÀã¥ÅæJ ´&XŠÕޤnš­§ÑvåCæ:Ц…¸‰|&NZèÊ®¯ÿ®+­•ü¶z«=ÕÊàÀ‹F[j—«-ª•ÂWþºĆÉ2/½¶ X1€¸‘‡¤‚bú0/Õ!pÃXª ‰Ï!¼$®¦Nû‚1‹©,Å ºÛw×]#1Œz\¹[Bå×¹†¶ìKÉG-uÇxr–UQAña5„ýöFÕ`Ã!v·yªŒÓZït²»H )•0 ƒh°É<¿íè`L‡h&¬Mã}¦t+©/à†£©«në*æØ‡¯C“‘Ž/þ¸Md»B;¹¨•3Õ·‹ûú¶ySVë£jš¡ ¥–y§¯¾êö°:éwÃN{ƒ¶|{íõ­—ì]ë>$?„OüëÅ_ðäÈŸ^1¶y,7‡‚½XvÿŽÆÕ[?’ôÛ‡u¡éS?Tøy(O~%`kcYú!ɾÔLî¿o̼Í/’ïnZË×ïø#CFd-cÿ‹ƒNE¹‚wdñŸ-ç¼£ ï)72 ƒµ+a§¸vpƒ",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰6Aʶî ÇòŒöJçúÎ÷¾xÃý†Ä¢ñ販7¤ó ›*ªôŠÍjAÖ*#(ÜŠÇd¨rqf†ݲû w¦½ßvüŽÏ‡ÖµÃ<¤'8(È÷ñè`HØè¨Å¸ô`ç§ùˆ™Ùry99Aéª9JÊÕÙ™±†˜¸(Zú Û×Z™ãª‹›Ë´(+Šáj°ªK¬û+Ü;ò;\ÜLÊ,í<Ýx¼qjÝ—MÍÝÆû™ì=þȼ-$M¶MÞ.†í›zÌî^—m½®nϯ™–Þ/ @4ôì§/ÞÁ…ä î’„Œ¡ÄÙ8ütJ\‹ÿ;b´¢ ŽK^[¦Qä ’&[Ê#¨ÜH–.]J«¨PÊ4kÚdI)£²>‹úJ-„žF›R…nÎ:¦ÒrеBR¥KÙ…ŒÀ4«Ç9mʆ’ÊiZOWy*Á×[܇añÌEë¡,Ÿ¨Á¶ÂËÔªX„PY5¯k ¥ëð²‰8Iê¬UsÒÈ YÇ:²Í¬æ›g°˜‘%¼q´6lqýi,8‘¡°±›ÜkX˜-Ö‹QÒ)­4eÈ“%_ÞEY3§Î¾…Ï&îå®iÎDS«¤.)R0¹¯ ®«[ó,ZËŒS®ú¼qéÉ_‡þ~jôå·Æ.ߢÌé¤ÓÏÿ·ã—rùq :_¹‡ZNãÅ—Šø,(šeÆÔ_[KX_²uf ô%\dþ…Úc#²rÚT•íwÜgʼnVŸsû¤J‰.F÷Üh¯eV›m>N±™~ÕtËoÖ…8Ù‹&ÆèÐ[ гbvJ2‡ÚEQReb%4Ú‡"‡’öøc™ vÇÕQè@H"yUV‰>Ô±×X„q(&ƒL¶ø¦,qÖ™åPÚNŒyªwÜåž™Ž:hʺêfppv‰!Y¥(Ž0ö·ç•IúÙ% xFß–'Îw¨”«•ÚæIk—£¡´bú‘¦—qzªzŸ~*—úÕ&¡è‰¸–ª¶ÿŠêª–hQ‘fdâÑãigQm>¦"øƒ•”J Ìr«Æð–Wø½+/d*c^¦S~;l£gšË–†ûh¾×†wäFëfØ©½¤¤tþ•K$®tö° n"¬ëÂÃVµÞ¦sŠËÖcÏi1¼Ìvèo¯‹îñ¯¾%íUØa]É;ò¸“.É_ÁÀÍv®e ׫Ã#\é}0yk¼•Þkç«ü§E)Ÿ·CÉ&ôkaÂ*"ÃJÉ37I;­ÇÑ\wÍ7•7µ‡1ËûÆÖh—á5PK§«c´Ò>M7·Još[uÓm¿cz7°{‹Õò†£*(¸Žƒ?Zä—†8Ñ‹g5öÛBÂOŽù r'~Hæ„+GÏÚžÿø5ƒ%8zK%c|Ó5©{þàà¾nê`#N{îYš£{ïCù< ¶ãÞpð°GE¡ÝÆùòΛ^¡Ë =_·èŽS¯ï¾>]¡ÛÀÍ>ïúõMŸ¿G»¯ï¯|ÆÚ»‰ X0ᨃØ*|øŒƒ/‡µàA¼L8ÿÐ6büè­ß¹_srx‰Ò µ2›A h¨dÊ™_œ˜&Í™+e’¤ GçΡ>Ðñ9iÑœK¢LMg) ŸšüšZ…ƒ«R0E}ªZZñªØ^¸˜AhÖåF¯²–¸ÕöV¦Ð@qYÍ%›U2V*/Üòwl²7„å%-»Ê죿È,zA·/:»R}•k²Í¬]WÖÜÙòËÌ©îm>$ZoZŸtrŒjê˜ ¶‚1z])5ê^AGôŒgX±nÔ¡…»&Ýõ˜QSÃÑx&ùy)ÇÄ.öêÉTn?Ý < oÓ]‚_½9g¾˜K&?}Öv²ÅÏ“voÝ9üʪ§ªÿ Va±ýtŠx„†U‚ñ]5„ Nè_?ÒI¸`¹m8ÉY´)x__òÙÜW†gÔI‘¸bƒÿåÇœqôANo5^à‰š˜TcµýHÆH£UÓÍ{#n†Þgç9”‹ˆúYK’:"éà…à1×ßRê7_„&ñ%b¥a‡a–õ"˜1’(e ÁHnוùdˆ¿ ØV½áÇcŸ`åU'ŸZ’Øb”ÎhcÉhHDZÙ¡Ÿv–ˆg“K®)h¤s–'ižw^Z(}\~%g œ.Öé”’Mj¨v¤Ê#xª**’n:ÕgœBšªf}ƒÚê)•kæ¨)¯¢z£zÄÿ±ú©« y=|(­3Q0)Юîð –t¦êªÊj£ž)jÛà™!Xz`š¥Rºè¡ÚÄRb€:o£Lywïn‹R"Ü”nŽDnĶ{fïnª¦Žˆš§0dì…ÛÞ[W» ³cº1­¸^i¦º€å«ï?üÞ›-ÉSxdÇ‘,1¸Â|ª±ërÅÕõZ¥Î¦í–Ưr<´'/ew*“\ò:õv”H²§(y0@C‹ŒÇÃ2“r³€ÈÂqt —;ØÕL¡5Ö¢µ¦­ád»cÓ ¨o"¾s¶Ü Ñ­ N²e€®Þ?®V«‹ßž·àóÀ†˜“€[«xmE2œŽ£îÂD.ØÄå…Í0æžø·_'Tþù¾gCXºç‰nsê@Ý0Æ»Þ4éŸN;æ«çλej÷<»ïºíI|îcùæñÉïðÏóäÃôzKo}éáž}æþ öÝ[Ííïãûád‚-þùÂ,÷=§£™ï>>4²î-§_+m-±jÏêŽé‡^¿Žö¹:H‡ Â{ì: óO¤3 =D|ˆŠ|ÿ\ˆeü8ÂÔ! -f¨2¥!OÎã‚R¥Ì^«ÌL23ç‘’*¸ñ¥ODÁñu¬T/¡“n}ª‡K{ÜQ'šþ‰j6 räj¥j•igªV¦ZcžRšzÙx¾~¹—­ÿò×b¬Æöªª¶Fz ¥žWqª¹D„¶Þ@报¹yù(šJk­v˜k‡2r®cg†ûão欫Cº3R ¤Ä‹én†› ¥j,µØq7g»œÎç®ÃàK­¨;ùj² ^ÇÓÞI'€®êÚÀˆ½)®µ“õ&˜¶œ#.ps)òžÿ5ì-Äõú{%~ ã§ÆìÜ,±Ÿù5ö³Å…й´‚­ýŠPœ1¯¼Á)ÞFQeS+¶´Ã¸Üêµ,Io=$¢fyâÌÈšT3Ùc€ 0]pìtšàFäËUTï}\ÙøÂ‰°SqóQ&èEUîN„ür‰d†¸xä;V”6 ƒÉKn6*[\œ™˜G˜‡›ýùL÷V%–k—^¸6V 9ë„ë–Õ nËŽ{>Ãí»¿ÃyÏ!ýNuåG§N|›¸òÙNò˜_¾’ó «+ýôQ«^ýïÿ š=îâøÞ½ìà‡¿Õò‰;8>ùÓø’è¿e«?˜èž ù¤ÿ‹¶€õÇß”ˆDîÏ&ƒÀ&vKI £ªPJeÔ >8c®Ñ5Ðtô"ô&¨Jä‚Ì`¿4ØAÉuå`!ÜÉ$XÂÅ‘0…ák _èƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·\ö¡¬Z»ä²YvPã³û §}ÁsÄ*;Öãü¾_µ·W³öwˆØXEAhǤ–(9é´˜¶È†i`øÈIù gÙ ØzŠ ¥iW#¸é˜*;ûÓ´z«§tKÛëÛby{§÷[lÌŠËÛ¨|µt—{}j „]È,­-š}¢|½®hÝ-n~®2QŽÎÞ¾Yλî>O)ߨFM¯¿Ÿ‰œÎ/à™Q÷.`²'0!p¸:,v-Ÿ¿AäZ$Î?ÿ]ü¤£³†:D‚üȰ™Á &Oº 1 ßÊð^ÚD±Kb’€6Þü©îà+žBĴʈ„,ö‡ýú¥4\»Ö;×Íá,]ödÏŒ¶¢„A"ã·´±lµCе"˜ƒqõM¸qÄÒ\ Å_ò]8:]9x¦§EV'Ð ÓäºÅùÄrj¾Û™0Žï}¤ƒ^—T{[c6§£Þ‹¥sý±Ù°Ÿ¤íë·ß®;¸»_÷ïÂ<ÅðI2KaðÊõn<;[gN{ó^1¯·ôn*o½ôÔgßòì¹zÎýäoI~ãä¯^~ùÈC}ú/mOö>–µ7*ÿüÎÛn|ðëï ¡TÏn¥øÁ¾þYö È@ÍAækÏ0`c—'àäï‚KéÖbA:/2x¡ð V9JÐ]@Sá 7èÂã,†4ôA!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä" Øø!̦óÙ«%ЪõŠIÈ%BêÍŠÇä"BslËì¶V§ÑS@üÏë“Û\´(¸Whxò·à§ˆèø)·¡YiiIøuvÉÙyt’Y‘êizÚWJ±Ô(9ÕŠ+»ø š`{À kàg7û L‚K ¸Œœl7q|{ˬ,M­£è<]V[Û­ ŽíÁÌ~Þfn1þ…îÙå¢þ^_ÅnŸ¯ï›;L¿hß¾VÊÉ›ñ Â,^TýSÓn¡ÄD›ù{61£™yÿ«ú`¨¨1ä¸]¥jˆ2¤Êƒ€\™ìèq¥Ì ØZ9Lïå̶FÆKÈ!åΡhDõ»yÂ+¢LSAëÇ‹K/WO›ZBIª3›‰€^ýJëhÕˆËNª©ƒP~Á¡]«Ç­/ÃpåubtÁf» ï29%qý«é£°†óÜ’­E~r M K®<Ë™Ñ"¤uëd¨wÓ‘<(sÃvû®CìW\ÏÃFñšLõXЗ9ÇÑ,‰ÔÛпgëýfØ3@ÈóvKê÷h.ÏØÜy®]»¤‹ÁNmùdߌÇO­Ìûø©Û~mâò¦Q"µÝ}½Î õúÍñm·ý<ðµ„Ë{Ø„‹?a¶;ö ù):¯õýå•›BÓ0:¾ù—?imè‡þ«¦¯ÞÂ謿Þì²ã4»è‘ƒ];X®Ÿ†{î±iî;Ús|ñ&U¼— ‚þpòL¡þ¹äzîüD°|õà {û‰ÔkÿK£ôD7ø+!…÷^7šRò®7ûÏsˆý+ÙË/Žž¾¾R.þ9£„ûù5¹‘¾÷iå€Ô¢± o[’ áÒgAÙu+ƒ”A!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Äb ÈøÙŒÌ¦óü%•ЪõŠõÑ"Û5 ‹¶®×°œšÇì¶;–† “€u¢ë÷|QÞkwðÕGXhØ(8xØèøøð§07)y‰yI‰ $™ù ʢȱ è`šªZaæ):Ú¹*;{”QÊYçJ»Ë;¹9ñçªÛ[lÌJ’H|̼º,ù\çÛ\M(MmÍ}ˆŒöýÝMîÖš3^®.–¾îþŽ~ 3 Õ>=“Œïo¤o"}ÿd7OÛÁ…& rç‡É7³wLJÿ;b”H޼„AÊ鈅"]=´™2¦…/ï¤á(3狚іàô¡3è ž €d)4é‰5s¶5²èP“J«Vâ¤ÌiÑ‹’~Fµ ö×¢ºå­šÝ©žyZ¨¿¾ŽèjÑŽ{Ú¹ïÎ{ï³GØûÒØžxðp_…Š5„TbI¯±J™5lê–ÚÔk3 è‹%®’q'Ím¸æô½F—ä×¥ïŠ5 hJªf…i¼†R°S1yèªA¢IãÃ(ÍYv¬´2áÉ–éuÎ<s·¸Ÿ¾æRYÔàÑŸ ¯i´.¦ØTaÉý{Î×k1^{M8gëÞÃ…†¦LiÙ™ó¼œ ¹qÎÁ”Cg~\³µµ8¥oV}½ö`á«‹n»umqב˫¯.ù:ÜÐj½¾~ZvøòKÇÿgsÚsÿy6Ò€÷¦-dÐÕkÌ4ÒƒÏU0DíÙÇV†áW‡bèápç‘w[p:W {ßðgš>¢m·"~)îàŒvÇ]uÞéGŒ ÅÜ*váF¤»åØM Çb{4V6$aî86‚×d/6G¥ö] `~'Jˆ˜zŠDYdšq¶J;0YcñAd`^îeG\˜1²Æbjt¶6_lri¦>B¹Ü2áQ'Œ*n€¦š’úu&£XÆ åœ:Ý‘z:Ù#ŸrV‰è}–îô)EÃHopu—çgxˆø øå5HØÈ˜8I'Ù8ȘwYù zFøjzú´XñÈf7Š+»¥êæ9‹››qÛJÁJª,ÌÂûe ñ;¬\™üÑŒg7ö¼LXŒ¼»Z½­|]ìÍŽ:ÝíÃv-®>ù­Èë¸?—žùRG/Ÿ/„¯ÿ¯‹Ü~ ÆðwœÁ…MVAGB!É%+'C EŠÿWÑ#HOÈŽ$ÿÜ)Bâ±’,UlÄØ¢”-k^ÔéÕŒz)múÔð’Á=_<b ù³$,À‚&}:Ðѽw’œB½ºBÌRŠ\‰Ä 6È ±[kýš6ôè\Hz!5ÔÖ˜Õ™dݪ²¨'-²·_ò¬‹­qûÝt„kΓKt²*ܯñ1Ȇq"~ Shfi˜ ­Œ9¹U3ÆœÂöù+Ù7jZK• ú"ßÊ~ò¾iiçÍs}I­GºêéÅ‘1ÅmûØÓh⨅ï^ü¸èᇅV…DŽrÓ¼åÊöí$3Ç`ÁsOmݸÛéU”_‡ÞܼÑò¡åR÷êΜ«ì›!bÿFžLÔµ¶WŒWSÅ­1ÁrÙ<¸“eFÍðJ¨áÛ‚š5X`œÑo^Ñ—ÞÁ]·‘v®Ÿ&&F'_ƒÏ1¸ßIwž6…4³Õ¤=S±¦•Iµ°˜Ÿs/8z6"hJæヤAÉ^‹%R©¥2c½I&Q¸IÊ‘õ%]!Þ ¸žwXÒ“Šž¸f•QºöaNéÍy߆ôÙ)(vn:Tn Yf£ðÅçzÊç$…ÏI'§Ÿ12×€ªIöfjÈ x›ñçiSHJi(Ž ¦Ê(’2Ù¦z^§ˆšºÈe§xÚž¨ìeúªª§ê8è³ÿÖè*†<•…’¢Ä€ôžZûP{+ˆ ö’s4B é…É$ŠºFèI©:¶)¹Ûq«l¡¼¶¨€ñjèh¾z¨mn?ÊÊÜ¡¥±˜W½I‚škŸ+J¸§ÀQ†–ܺ.Ü,bß^Ì,Ÿ[%¼¤6õ¬ð&•:“®¾ØkˆŠ|¯GKaJêǼL«Ì2ÇpÊq·;Xä…­jLÞ°½>ùaÌøÌV²Éù+òjúj‚¸rÜ4D» ×gFì^V«ƒõØplµo¸YÌvg41a¶Ó5°·K,wÞîèêÚ%*F¬wành*m˜· Žxdhå7gO‰ƒõ Ø÷ãO»é¥¶Œ–o~“JídÈùOi»0uèsWžó8›Îzë®›1úëúTþê²;úÑíA®¼ö¾fê^f2¨Û¼å¼Ÿñ #ϼ—«7ïSµi}ò¶ü;ÞÕ·¤Ü´Ûcå KÊÐõ‹fN¾MÔ³]a…éƒÏ |Û¾2þû³£å^ìö3Ô¼ÂÕ¿¿q ¯pŠO­§9®ù뀸Ûp„§@B®w) &ëî‚ÓwgÁF/",á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡ÄâÊ2~H£ó êšµSŠÍj·œæAùð"ªb®ùŒŠÁ /»]MËçôVyö^Zãõ¾ÿïA•t·Çˆ˜¨’7ö³)©gðÖ8x8¹É9…GáæpÕIZZFX)ˆéh˜j ›óê–:*‹›»ñ*J[Á«+l\²Ì:¬¼,”Ìüœèü5« mí'MQOÿº®N¿µö9 ¿P¼ÂmÁ…§ìÉcñ\Â6gF¼Ø a7„ÿ1zd! •ÁÃ|<Ù¡Ú¯’ñ–Xd‰¥³œ‰ÓB†×ïê—%Oƒ<ƒn:¯Û2ëÉæø¨f¿‰AîåõçßÂk“®ÉUÒ¾>¥ÎØY³ëÈ@,þŠ9ßçb¿ûêe;\µèçÂ{Z¡ˆz³Ðç¼£o\*ÒÙŽøzw~^·pæÔ§{Öm})dæÚѯ/=Ÿnñ¯ø¯«ÿËžžB÷=¶wîE^^æýÓŸ|ñAgU„Ûd䃆¶‘bÀ€"†ŸÁWE]¡`T~Ç_€…݆S}ò5G ŠÐ±à~ìX}58Ù„;>…WW¹ÕF¤Û­uœˆøæâ‘2vG£M…ÐØÝr>>)b”75‰^•In¸ã{&r¶%xH¦$e‘jrábKš§å‰íç— jø‹’¢‘)ç˜øù3Õée Wþ¹ç¡ÿQJ›].¹f¤vÁxM\Nù真Ôi(mz—¢ŽQVÆáppÙè)žNž&*¢~‚é ~šÖ.]Úʨ–Ê© )ö4 ŸÀ’Jg–žù!p¬ÿ* l¢°bǨªçik‚V@ÚXC¤™êƒq;Ζ‘]Ø¥^0k«˜Ã®ƒÛ„è’P\¥­9I-¨=Pú¬½©²rkÖJz’™Ý.ö—Yúùj"¥¨òJì©õZk²6jk*J—ð±KKk’÷hh°ñTÌãˆ/ÌÈ»c´ž(o¿KoÆöuT³qÄuü¨ÄÑZ™ŸÅ%é\²±K-Ê$‹‰ïµ<-üòvBº²mg}–O³$LÒÿVäõ¶áͬ ¿Cš|ôBa3ó±Ê÷t\³kTmìÒ×Uë$’ºwêáÝ~;èÓã&»÷߆Ӊà¼Èšj÷áL•GÞp—êxå…ÇGU²r5nù3ˆuáÇçz§=º`Ûdzêà¸m†®K:´Ø³ßÞsè¸ÓNùî¾›ðµx¿On…­¿ŒÝ:âŠ/][zñõÓC™èå§•ðí¯-’6r¹âMv—3LzÈ ÀøõÎl Œ`‘S7 ЂïHÜ9ÈLÜ„·CàI8 ¢px#\¡ oP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ú„JGPŠÍj·! i­*‚^®ùŒ–¿ëX%NËçôV[…x/ïìxý¸ÀAxà—§'¸ÈØ8x¡8™çXiyyhȶԇéùi楙IxzŠ 3º9!Šèöš:K"+™ÙZ:YÛë;&ãªyû[l <²6J|ÜŒÉ|h í\Ý»úEÂdÍ]mòÝ-žEÍn5ž®np¹þþgø-úPŸ¶ÊÜž/à–~æ¨ðq%0¡‚7”S1GÃ'&F¼gЇÿ;ÒàÈŽR2mKz v¯P‹xLº¬ˆC È—4¹ðÛ¦cfÍtJjÃ2d+žD§»‡I€E›Ú+#s«Œþ„:½ªj´*@c2mi«Ø•PËB%5V µÈb%'Ô«·¸iwøAd—.°/|޵v·l"½7 ½pÎŒ¯äJP"×ñ a‡åTur]ºCýy=j8QfJ(/à üYYäÁ*÷µuø¯:¼Ñ’êíäÚïã{ŠGŸ~í[3dÎLºB-r™iÑ–ƒãZ 2ð§C–vήø#ì\#ÑÎÞãä=Ø75ï=ܳuãÔ1'n½k³úã8WKßÞžotååï#ÿSŽW|òèf<„ÜnÕYÐЋÖêrΣOí zéT·fz䕲àyê&}R×®Ïîí¡O»í³—3¥î’Ÿ^Ýæ¾s#OOÊ>öÅí€c’…AvÄÀèÄTÜ'WÁùh¤;è¶ât„$4@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ¦ŽË ñ8 Ëa쉛l4çü¾ßQGqhsõ‡˜(W–1ˆPó¨8IyÄ"t¸†Uéù‰tÙ±ùÖ zŠÊ#ªñVH–+ë² (*éT;»ËkŠ+tëȸ×[lŒñ5 l‘©yü -ø¡KH}}j ÈÚŒý .ÍNî©í%^®ŽX뜾–¬“ |.ŸŸ6¬ßïŸg' @€ÿ ¢º7Í B-ø \rg*â‰?.4¬p±”DŠÿé€!cÇ‘IV!$‰2)nïRºä²²”®“8D¾¼Yí!›8{î´S›™èù<*¢L² †– ÄïcQ¤Tí8C,çÀqzªz 鎛{°Úxã‰ÉÀhÿ°Í²…X¬C[lØ6îWr+•:Ýf¶¨É¶zr…ŒdËP‚‡;½ÝÖáUÅ WVFe+káFjf–˜Ÿ2†\vnaÂÝöRUe,PÁ¬Ÿ¶‚¸ðh©›Cç~©ÎÙÏÞö½¸÷ÇßÉoÜu›»Ç¸wͶ!ÜX½–ÜÛyòÁŠ{¶8:o“Ç—[wÜØ|ìàÉA«?o<<ýË`×ÿÕ8ßjµ…EÍ]ÄwW-ÍgV=¸U~¼1¡ƒ w{B è^{o”öœrÎØó^t®×ˆãÅ—X\ûM%†*ò—ŸŠ¤lBS®í˜†‘I8Êwص"yz…f(ÖHäŠà]D]ƒ€I5‡å™"+§Á&Ô4Gòf’€5ÖFÆG_/Â`‡J¢7åu¤¡Éæ ¹¡(ž›qnW•2²Xg–1^¹ç„p~©[˜ŠÊ•×2OÒY–£™GW}MÒ£‘Ì=¨Ôy•öÙ"gUŠXžœLšg{ZiU”ºiZ*§Á÷雯by*v›JÚi€µ˜h£žh®ž®)Ú£%ÿb„¨ExˆQÍø£˜=@)e…|v¹A³‚¬É+?¿vå­w¤n7£3ºúàê…—n9YuÙ¹h½«ñ ®ºÞQŠì¦íÊl¬üVki¢š¥‰lqùư| j‚~Ú­ ÿ{ê[⥺Üo¯”k‡öªc~ž5#¤—Wêp°Ï²‰ñˆ¶VÇ߯³Œ®–0/[ì‰xØNùÝl»Ó£¤•+Zv›~Žš{›ý9èÂL^zêg.¹êaâ¡Ä®Ï^ÑÓ´·¹³ÞÎ÷Ôˆó>Òï<Ï#>z Oü?°G›üQ»ÓÌ|ôÍ¿öŠGÓ_/YçØƒ2 öömèè¬~™÷૵Õg(“Ï òç÷AÔèo­'ôïë#þ¹õ[žóýýØ1§1Å|þSH†Ld—;°nìkÊðøÎ}”Ç/WA{%PÔ`‰¹–ŽL",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf樒ΪõŠý@I*BêÍŠÇdåVq>/¤å¶ûÝ OÔ‰.×&‡ë÷ü¯†ŽxðÓWh—'"hÅvø锈ö79õ€©¹ùbÉU²8EÈIZŠãé:ƒgÚꪈz©Õ•˜ùz‹«è7SÊ›\«f ¼á(¼ÌŒILuL¡ÚL]­…m½ÝfL-Í-Îù b77žþ¨íS®þ~Ë?Ï<ý´KŸŸ -¯ï_è #Láþ;Ø \*|~ë7b{ZDA±Ž•Œÿ;^ ¨ÐB@$ßÐú(qaÉ•¦5J‘’¥Ìv¼î bHPàÌ ”šä“£¬1yµùåä"ŸkØ; Õ…-¢MEŒŠU§(/A#Éó©Õ›×Öüº í%¡RÃte”-Y”¢³²’ÄܨŸs‡2`‹iU q)ùMÆJ–Ú¿žŠÖxøoÅÁrSUOz>\ºÇß‘ûæÿ?cKÛ¿+e}ü `Æj/Òn Ô\˜¸ûAp] œ eP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íòçN4çü¾ÿ›•džeG(ø‡˜ˆVÁˆ¥×t(ä¨hyIS iÈ ‰  £I*tÇt7¹d*êújÑÚª2A¦9I‰ »Ë;›áKYÃÆøÉk|\|1‹‹§Œ Í’wX'}ýèðœ¦Ç¾8è9¤{ºL±'ÎîZy®ŠOØ^ßi¯¿ïIÂÏ/ »w "ØoBƒ -¤Õ0¢1ór<”ˆñÌÅŒÿ-¢hãM³Ž$ùœÛˆ*eÉ•›½xg %Ë™Dþª¥.ŒLš,OâYFP¥KžD[\!¶FØË¢LS$FÝ·2;›ZöMU³5vª&¼ Vd :«X• ‹¶ÈسÚrµÍ:4˜¯sµýdw×–™b‚¶ÊÊénZcÔÖ¢Òµ.9¸Rsx:ÌqÖjoEEw—í6k”%+ut´kåyå~ݹޡ WçSv”ÞÔrÖdTÌ“ª³Âž !lúlëà)I…Æl—¸lÔœÈZtïÉÉO‡¨s¤y™Su~Ž9j5ù~ƒ9Þð¶Þõè×í¡«—nüréëù²7ÿ? ÞzøÕ‡|º1_)Î6œXÚÕ2ßMÚTʃ^Ha†öf™…jVY_hõLÓÃ^‡ˆ)÷ xÅ(àgí]&ÜHÜm j)’¦#1³%¨p¸ y®©'ÔcˆÑèÝ€*þÃd…ØUÇc…;ê¨AwRö÷È'òçŒYnˆ%‹¿ÜFdšXéÑ“ŠQfçÆ~µqùÆ”VI§~êDù˜˜ä‘ÍÅù…#ºwžž&Ù’š’z©p3Êyâu&W§t}ÊÈÚ¥±eJ]˜‚zZ&-^"J¥˜ƒ0ºž ŇЛ(Šª3GÚ™£M‚Êg{ŠJß©JÑÙϪÄÿ꫹6*+°æ ©` ÔöÊa7jA !¶ª5æ–±˜#e]‹ë¸fvy§vèš0j2sFçmTy¨°Ne(‚¶b8iÀºÏ2I²«ŸÌ Œ{Õ%졸/Âú"rã‘êÝØœí±8bº©Åý.ìj ÏÆ:F½*wð¯À`¡ÜÈ?*D1œkÊí{ëE›g±'WlrÆòš/Ê'Xs?Ó74»lr ¤‚U½ë2GAXQR( yoÒØÀJu]p%æmb1É5"'‡m Øi‡ õr1Ï[Ó¥øV­&W -éÏ~ã-©ÞÏüŸÑ€.Œ_}G¼ï‡ˆã–Ùo3þøU>Ëè+ÆpWnùmÐ*ÆyèÝÆõ¨áè‰Û#zêé4~ôæ­WžõŸÏŽû[[çÎ{¬»ÃÞ;â°M|ZÓV|ò§ý¥<êºE|óµ«ôÖ_?éNlÛŽ½DÏW/w‹Ý[<餻¸îøû0/ûšS¯~@ß§¿¦,ÑÇ/ÇêŽË[ßöø¯_¾ð®Zÿ³ 8àÀ–&-‹œÿØ[™Ël÷ƒ 4P¥¸ZHYÙ6Xµ­Ü „ÂSM¼Hˆ;¢pv \a ?èÂÊ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"@—̦SXkآϪõŠ)@E´› ‹ÇͭÜø‘×ìvœ„3ä$ÝÏë3Ý齇¶GXh˜¸x¦vèøX†1ˆÐø“¹É©•¢ ˆÙØIZê¡ù‘ˆ6Iagú ë5z:«J›KJ{${–¤,œV—ã7WÇ:¼üÊ«l±¥ŠÈL ú)m0ZÍíè vÝ->®õýIŽž>-¥Þ.Í%éN?_Á[¯Oô¼ïÿ0 À~ì^äˆÏAÏòI1•Ãx³Šýª1c‚ÿ/ÉÓÖê£Æ‘+:2 )¥RA’,‚šådË™ó¸À¹Î×Jš½ÚK*UpÉ^BhZR±8«‘Ö§œ/g-¥Uª­í o±’„tQC¹ZÁÁ‰V×´[–|t,1a›}­&þHx_È8“"ûê÷1±Ž“+*{1'h?Dã õQÚ…ã"† T§Ä”šáJMñYËZïTì±ö`Ç´tWvëØ÷åbœqÿ,únAxo–µógiê”Ù£'kMɹ¢cÓÑ2EÅ:¼wbë‘K¿ts:vèÊéƒlÞ~¾áàòyÓÿv­Œ`$øÝ ÙÚ©&ÓrðÙ‚Ò\êIˆào"gŸpr…B€Öax[{ß±Vg²÷•x#÷`d âÇ\q*š¢Œùù'nÑL¥ZNì¸Ö_t±òˆ,b>þÇžE6ºø’ ÎØ[“÷=yRüi`b•½u©`]>ŽY!{8rIä’s§f–’¥]†9êH¥“-Æ×Ê’pòâšž¹Ÿ”Ça$ä|K9[“¢If£0ˆé§ŸÅ±)âsvšçåi¹I™”xB($¦qž()2øMŠ"ƒµQz¨œQZºÁ¢nÝ9+¨o^™i4rzªÆj¦{Z™›©X Š¢„…ÿRªi³¯^)«’ÛEf‚iS£>ÓCLB“™ÓB*©Cú›ëgä¢V)ˆn¦ «`¥³¶µ9¬®Ü:ÊoƒùV-šçÖZ^¼þº'¼újiè­ÀI†/cå1kš…®ŠJqªÂKQ¯ªT¨} ¸n¿ý G%sÇç§ ¬¤Æ7‚Œä~ «ç±m\ è ö£{­&¬¥·{¸WÀùn4­Éõ„¢óÏ@5m­!¬R½ÇÍ+Ç ²T{•©=Ws£5Öçä•P݉;šÓn ó:f¿M÷†KcXß„tï  (_ç-5ßüòx­·… >S?Sýµˆ s#nW¤êÝîµ¾Cnz …yO…ûhç4•¬êF¢ó}Ïã—ŸžQz•W|!묇-{ítQî‰íˆµµîžç {p¾¯i>«|ÍɯFrð>,Ða«}B¥§ˆQ„IVïŽñÚ_cÏÜ‹#ýÙy?þ!¥U‘IJ§èïËÎûðG«æ˜õ~ÿH0Û¿§LÊoè  >Ç›DÌ€viÜxÇÀ1)NŒàjXA ’$MöÓ ÛäAȉ/„¢‹ OØ‚!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍjcÓÄ2¸ ‹ÇÐ.£J5“×ìöZ}Xºçô: ­„äö¾ÿ¯„¡·—4xˆ(±hˆ ÷³˜8IÉãèu÷È$YéùÉÑé!:Aêeʪºú(bê ¹iËjëWûK»K¥Kë{;Ì&ܘ#›F¼ü'¬á¬Ë,==sÕM­Í›W½ý Z‹½÷~Þç{Ùj>2Žÿd¸ô¿aŸÏßÌÞ±¯Ÿ@\1eˆpUÁ„ a,¤` bÉ7èmÊä,b,ŠÿÝ­{¸1ÈŽ$#$3­] o,KºÔçÈâ™”>þ½¼ ‘Vžk D¤7gÉ“õÀøT´TR¡ÍLùræ£J¦TwtÁ“êTÌ}ЖVExuÑ8[ š=å°Mµä²±µ"³I$n³¢Šó*ï×[N9Õ³Ù­-ZF¤~†µÒ ÎÛ:/Vì¢bÁ!aòI™Q[¶óLò,üW3⨡ f$MÖ(ѬJCÄÝÛ±ÓẉG×Õ[š—å`¿l'nü–wÏ\Ùíz<¹ŸŽä]§¥H™q! %d™î$wà(HžÈ[FÈ–hžåX—ç5ך$œ½)˜Fz¸Ò’õñè[›o®¦M%ªif£V½¢gcw>Ç`u i\¶Èfyš¸(tçÍtc“žz£çs‡bXYŒcùY§èåyÌ¥qÒ©iŽœR‰'…©j—›¨[’  ©0Љ€µÿÊ)áQUÉØ˜öçŠÓ*XdtR<ÃF®'LÚi ˜š d¥ÞJÉ䇯pl”[.;ï­s¶;¡£úV©½Wz«§GáëªÀYþËj„Æ©lz/Jª®Á¡.(~Ê6lë‹_v¹'ÃFã¯}w¼»ïPsú´‚¬i0}×¶,#®‰ºw1‹ÓÇ­ÄÿJS²†bÜñ¦Õýj¶ oE²“%Ãruª / ?'}ÈÅT÷ Û5Zï”/?S§»…Õ`».]áRjW×K¯=œ½:V@l/=¢\le…s›Iîón<öÞLô¢Z(xHoè%ã‰37êÈüøP—¾ RÞ•“tµ8™†òùæ±Þ`M¢ŸŽoà¨ î¹æ«¿~~ªÃ.dÓWºI{îPo¬{ïà6»ïˆxõîÕÂ'„»ƒ­óÎìñ ÖÒò“;Ïùî_¿»ñÔ“<¿ÀoÏôŽ#>Uâß‘fù8I~ùZÁ«ßhßð¯8È„½?¿*¶›a/ÚçžÑ ÿàठ¸pnû‹þˆT,J+„`%¨2 >Ž€Ô`â¨åÁÕu0„°ƒ Oȃ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~x³ý†Ä¢ñé‚Ȧó - AeôŠÍjASΊ¸ÀÛ²ùÜì:Ô &ú ?ÅÔù ¼Ë÷üþ‡ÝF·$èWhxÈ¥7Vµ†èø¨¥ضè噩I$Y‰!ɸ):*ÓÕ9–A‰gy©JúJzJÕhàºá «ûÉõ‰‹*»;,'Ìj¼ä…—Lì\fÜùè÷˜³3¥ =¶iù€ãKÿ§_žv¸áWÔ*Y9üYvÚjçÁ×_ÃYàW41ita/éôD ‚‘aè“@Ûí÷a~$Þg"bTwQq¯!÷ŸsÞùô]tû½èß$ôQ—Ò•ø¸ ƒ Öˆ#†ìHVÙR¼-ùÆW­ø‡d;Î7¤Ž2bãg6F¤yUbIX¹h—EjId˜YŽÛFì1 '_ª¥{bZååe:5褖›‘‰ yV.GД˜y9æ€Ïz¥~`Ö'¢qî9ç`¸åéæ^qnJR¦€ ºX¡­ø[¥<¢y#¨Ê ¢´‘©Ü2@ƈ]¤Caª(›¨&˜(qvÒ*ˆ”¢Ö™©Tî°«ÿ>ªŸ«ÍÑ*kšêÚ¦•+²¥öéQ>ö kˆ?|ûªj‘{Q˜Rx›Žó ‹§4Î~Æm#ðŽ0Y§] èÛ½Géš,„ØòHéºwZÉiÂÄYª¢¡TXµóªŠ¿úƒ*®Ž;Ú„jqw&>9©` ? pµ';Û.‹ŠšÒ› /‰Ü˜‹…Äë1€ R6”jÍ^û3ÇÇ©Éç…A‡FoÉ[½¥†×[n’¶Ò’¦3£bàb!N{ƒ«¿r¡Wjp-c|ÐØÝ”­5¾áæk2ÛBŽuo.®m)—yÿÍÙÒH¶Â÷†€+|³[ºZtä1ÎdXœÑçݘÌf×xy™ÓÅaçpú汆~§,ºR\,÷ã©Óä/å®ÿñ:WU{î-¤¦{ï–Ïþ*Þ¾ÿͺðÃo •¨ÇOBUËYé"GzðóÉF=‰@Z/D¡óŽzøÜO=…¡Ï)ö'¶ˆþè!š=¢äíÛ~v¶ó£ Ì÷/¯¿^Æï?ŒòU Eƒø‰±“}ÍQ×9 ç€±@µÐûhœWòEÁËEúË òa'ÂyPwÂéàs§ %‹à {'¿îO…2¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋uÝ ‡Äb ¸øÙŒÌ¦ó)D*K¨õŠÍ®€4F·« ‹ÇPpò`N|Éì¶ûmK«ò·ýŽU§Ë:Zš(8¨·§¦D˜¨8hшÐçG÷³Xiéô˜”i°‰x* Ói²7Ù·9Úê:3Q:"9‰úz‹ë@{&õ› ìÆª1¬Z<ç¼xÌëQå ËÉ\m'm*ÛщmíM$Íý=NmÕ]žžˆNý®/øK1ߎ_ùþî•ïÏæ,Ͱhôþ¼f—ÀX:„„ì¡Düîé‚hn¢Æÿõ>Tœ‚áãÆ‘%›F2%O|žE©2&EG«,)Sæ/[œ±ÛWgΑ #~âùÒf¿?‡:Ý ÇL=CÎzŠ5ƒ@ª´(éªú¥½¬dÃþ9m'ÚÊ<†éÓNh¸tRÍ¥»RM.È-»,*Á…4Lý›lï!»È°­© Yo±­Œ1®…|ÒÝix+ƒ,Ì4SM“˜ùjK:’Oqg/NVѰÊÕ­?¶z1ßÒ-OóÎl«³æÉz'ýmÛ7ÚàqSù¾ÝôÞTÔ‹•^PÁL‘×ÒÛ{OÏÍ ?ƾÛìR‹—%“ü’9ü/`A¯§6]¼óúí›Óÿ'O›mÒIá ‚!S1ÑÅ—`ƒbé÷Ù wR„=m\Z,PXÖ™W\lð‘ÆÞu"ò¡{&ŽfØù¹Èbj+FøXr¨"[ZP†â69šV#t&Va…åŨߟ-G!“P*Y׌7>©¢VÔ¥WÒbÝAs¤bjéå† éàŽÁx"›Ïq©Ô‰R¶(Ÿ…¼ÁåäxT–Ùe•ý™·d–î×gœ|*•§ž`ŽÉhr…H¢sô¸ékF¥YdSPž7éø¹YŸ‘ýX ¨œ‚~J¨¡[bÙÛ)B*F¤¤8Ê‚§¥…ÆÊ꜑nÖ¢q‰¾™æ¨Šjª©©Í¥KÿU5P…ù¥E‘´ŠÚ÷^†Õ2è [ i›mP?±igQκV ·ã6 j¤<ðú-·¶ÊgWÙÁdm£cxmwˆqQ³ábÚ&ªÑî g¥©l0’ÒÊWkeÓ2 ²+MÖîT$íÑo© >w÷•Ê)ܾ6Öê…½ƒyª-–©$6’ŒáÔxPÞ›ìBÅ—‘äË _B¦º ¡e½s/ÒôÜhïäÏ›QŸÃµ©™­ÝºxeؾŒ×„Û™vqη£;Ï;Ü:羫Ðb~ü†)èæØS'ý9`öѯÕ{o¼[kùÌ«oÿ®Ùuÿ§_ràhÕ_¤”"’tóa×=³puËVÔ¬#5xhxჯa6ØJY5aƒ#·}¦‘”bgÿ±Wߊ‚ `¹Á·–vßÉHÜŽ®ä&^bw9C¢nFF!›]•äEd3¶ÇÎtüm£‹|T¬9zL1ÐÇ;4u"ã¹2UOC60Î.÷GX…>EØ%† ÃÇV'òóØjœèX@‚í‡Øl7äö?¯·qÊ’y5¥~(nÏæ xÔ/™˜Þ”!~õÔh–iÓˆOZ$ÕoQÉöÛÑ߃oL–Àïå^Öb2{ãùç™u‹wéª ~Ö˜«»o©¨¿®w-ŽûDûã–Ï{TÜ4Õjë½ÿ${ê?ý!9„-e»ëÏÉɯXüJ;ܤ¹êg¬ØÜΘ–eA,iDµüUpMµaÞaW›¹ïƒR ÍHػΠ…×£ ¹7Â^.]2¬á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·Ü$ÁìŠÇä¬rVXËì¶û˜¦:Òêë÷Ïë5_ºÊ&·7HX¨rpW¸¶døiXEi'(™©©eù€‰Ø¸):Š÷Y5gGªºÊ‘˜Ñäú÷§Ëj{KÒ7W[׉û»‰å[rÇ;i œlˆ<¹#̬ý6¬ØìU-Ý]Ë «-Îõ‹4žNÎRGÁ[®.ŸŸ:Q?¯_f?£»°P8|2ú<(Æ` fÿ:Œâk` …+Z°'±Oÿ;&T!E$'"sEmDÆ#Kº¼s×)Tà-z‰ÓGJšZæüùΦ±‘>±=”箢v"} *·aÔ(Ú„Šõâ3©±Ö0Š™5¬:ŸúL­ÊÑš¦!ZÃÁ¶ÔÛ{yüŠcê\ÄDWUÆkËn_™2Ý-Të·Ø Jp“6ŽÙnèVƈÕHù2š¹0#²œ|(åcY™¹=^ŒÙgy{:ãT+àÙÅ/2ˆ).cÔ3Oò>Ýl7švÕNV>\ú3ä¹´ø*·¬×¸fäΧ÷fþÛ¬75¬£.–˜;ݶ¾SïÌW²Òå›­GM>œ}ãæ3_¯çÝ>òøsî‹cÿ7_Ýqv)ÒUC!䵟QñAWïv>õ˜ö`[k%Å`{²`›v7]‚‚pðÙçYl£ÝwÜu_XXaŠF tú±hÙŒ&¨Ù]ÝÍÆã6°•e`+ªáç_|±!÷œ‚'Ö袊$:Øß‡'c“uDÉn)Šwå1CÎ_=Ž9å1ü…¹âoŽ·ÜjõiÔ%gi•GË–¤ùGŸw Ú¦$ŽWÒ)'K•e7JN™'#>If£"µ˜¦)_¡ZYäœÊÕ‰%’ä©g™wžc§æš_Œ nY¥x0Õ }œ®E)pnÆ™¦“4Ñéš©ïáYë¥+†Öê“ì]˜£¤lÿâaz~âÅ(w7rHÜ+EDk&­RÚG„–_Qkm„¡¾Â«l%nµ¶ÄôÚ »˜¡‹)K"k£¨ïr›-œùò!¦£?yx&Ÿrê,£²rìz»j¥èaVS¯¶&œ¡¸ªÊÊæ|”fÙ`¥Û;î¶:Jû‚þf¥˜ÀŠ)ļ ·ëðŒ{êûéÇ·Y0”ï:3³T*ûéÃ4vóŸgq™°z,÷{²6·Š¼Ñv†;¡ê>òñÕf¸º¯ŸÁÑên2V3MFÖd›$°™pÁš„ˆÝ4@nDÜJ]KwÜ#{ÉQ¤Tçío99+Œ7àdzErÀzÂmxZ[Èx々--—ÊKŽùENÚB䙯¢uµŠ?úùQ‘{^:P%c”zÞœ«4zÅ­«^¡ M]&곋’ȸû®”î»kòº¯¿o üð™Pˆ{òÊÓ¶mÏM=ò²¶ƒC½ëµgÏý¡„›V÷Žch¼Ûâýñüžo8ó^ƒÏ>R‰~w—ǯ¶úñ=§óø“â-|ÍÂÿ ¸’¤(ð¾A‰É¨7ÆH”G¬UÁöAç‚÷Ë üˆ8*Ï¡áìZ¶?î.„*d_jZC#!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÊ@'¾æ¶û}fSⵎÏë5_›\Y‡°´GXhè8ñwеxøi–˜fqgð3¹ÉùxI¤Ù9JŠä%Úà‡J—êWú ë¤j©Ù{‹Káx±ÚšŠÙ›+<œ \yjL¼¬§¼öáŒÌ<½ilµ{"6HÍmˆ=gíÛM^&¡­¨{ZÞ®u®‹š>ãånòÈïßdMк…åSçÞÁ‚ ]\ ¶°XÉc”E<†Ž¢F‡ÿä常1$‰‡ãè…«R¤JŒõ”°Cw-ÞÊ™÷u™’¦Îpò¢)ìÇk§PŸ¢gs¨R0¢¾%M¸4j6iN!J½*E›mL?býŠRM’É,Q‚‘³D(Ll©­ªÚÖ@ŸŠ‚kûkdZ°¹þÔÙ “«X˜ŒÔÎû ®"WŠß¦Yux‘ã~Mg³Øv-¶^‘)Å ±QÌYmÖ ¦UÒyúöòµGµØÊ´§•&Ñd_a2³• ¹ibΠSK.þ¸téÜ.kç-üYqòãÒ)ûf¼6ÙŬ[£¦ÎyÖ[ͺƒõm¶ºqÝÈCÿm9ñ˳Љ«¯>£rññúÿgôW:§•Ýs„x’D%‡à|Ιa{ ""Ü‚¡a`Ë`Ò€öT1ŠVØ}î ×ánô¡×mùiG!ˆõDWŸ~*²'âe->Å܉ hL‡¯ý(ÄawIˆad4†çâb5nbˆöÍØ’ù˜x¡|ðÉxã‘X*ˆä9nhJ>IfP— ¶Á%Ø16Cï iejC*—"a½-éÞp¦É'“Åõ——”(nã—5Òæ% :väZ™ŽZÈètâÉØr|þÇ›–éIɘEl^ç&ìL¢h”vºé3kbÚ¤uëÉ‘šüáùª“WØÜ¨šÖ©]§”êi(u£zöä©tze°‹ÿšZë/¡Ä:–Bb˜•‡JâÚ¦|´Xdš%%É“®án&Úgcfó©’Pb›eT¦š)«#H/¸b>Š/¤å–w.-Tšío^:'ƒÀÎj«¥yŽ‹Â,åzž@«VJ^’ïòZ±²ß¶I0Þå[¦¨nÚ `£UÌÛí{xÞÙêÆ î9ÚËÆm»É»Ù7ÇÄód¼«™<»znöÔo½ KUqÁÛ%Ó(‘gÀ\´'³FEl·–¬šºò–2uÓ’tMȇsjU™51öŽìÂuÚ.Ew—6hÛUËN§÷£¥>Ìà´yÿØcE xá2q+ïÙ†/x„2¹œ-I^pä–»Sí®å4)â^{­ù-žšI¸~¡Ešéªã|ºPék U­»~8QÔήRê+³:îÝÀí¥[û®ðHôNü=˜'ï»îP1ÿšñ<Þ†<ôn­måè·[¯÷ðw7ÎýN?Mˆ·Úá‹¿Waz|¾ø¼˜mvûÅKTUpÕË?Ñ>ú¯¿Nû“º¼þ-å‚£•Q1·ì€ørßfs?Dß“`Ü‘ ž®Ô`HøçÁÈ-¡ƒ!,á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Ä¢‹ÖøÙŒÌ¦ó).”K¨õŠÍ‚IW¡ÔŠÇdë·›”–×ìöó À¶¹ûŽÏoÑòj"¬(88bçH˜¨èöåá8eا¶XiÙYhHuÙé)S%)§‘—&ú™ªŠµ‰¸ú ÛÑX‚Ú{‹KZê±{Л \ºçû+ŒÛë÷;Kqœ]ùìÀ,­ú°nŸ™±¾|Ï­/ ¼íLöï¹rø:$‘°žDϾ=¼h‚¯ÿô"büøZDMy‰RÅ»kýPhL ³K GƼ鲤1xâü9ãå >§=šâŒš—3/C u ³©Beò‹Š•Õ?Ž¡‚34HQˆ'ëÕ³$­-B”ʦ ÕÖi§Ïf½¶+6¥\'öíYêl;j¹Õq[–A-¥u2¶—¸áÈ=%rªßrçKvL²Y[C!!9Mõ+KÏv™Þ½hú¯±µ`š>švÁ̤-7¶š†ÜîG¡éü6Å»°ÚÜ&›*þ£¿è–E+'}ºÂ²'Í>f7QЛ?M¼E†"‹'ŸÜ7v£€…sn_þ=}ü×sOÿæ3[€ —\ö…t M¤4\sõÅ`edX‚¢)F’^;™¦Ù!áÕ6rbFpø±G\~Â7âLUuŒ*†¨.vÜs øÃk>fAIiÆI5Þ~#f8£€VgâFÖW’gÁ9˜]“ÁýgãUIn§ÝŠJrY"?®ýHf„ºÅ%¦þUt&bŒÑ‡!œLJwäyvuRŽ%NGe˜5¶hgŠxú‡œ 6§§thÎóa™ŽR¨ÕkVÈzv餈&wØ–’þ©çöt‡ŒñºiŒ¿Uêàså%êªÞx5_?Uöwé’W²˜*”Úê×r·’7j~UÒ åœÖÿ©J£±‚š˜W<-ê烮Î3Ę`û¥Žâ^¯×¾nÓ𿃲ñ8:e½¯|0t}õVÇž¼õ)3¿:õÝk”è—³-ø7ÉÚ;ßê››å"Èþö¯}üú¨TýöÃsx_‹Q»¿‡€~Ó_ÃÁ½æ•JxDI+LÖÀ2ñ¦€Œš$ XÁÅ탌TÓAÆõ/„®kŒIˆB!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·Ü×ê;LÃݲù ½>ÔV´û ‡_ÙâjüŽÏȈ9ÿpó§7HXÈ 81†ˆeèøiÀˆc×çÄ™©£FçQ 8·9J ƒ rÚÔXÚꊑ*ÙGâúõŠ› »§ªû ,Q Á›H\œœË[Œ¬ü º6+|ñŸÐn|Y«µ>e™É“¤»ê¼=/éer„9õèô^»éÚ?eõ¥ßO~òzêÒljþã9ÑImûy“—¶ü=íæpåöß/ÐËMÔ¿?sK?ŠË^ÛqÂu†qT^äÕÀ€¡ÈnœßWA V΀ôÐ:ºÅ0s`ààO€!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Äb‹Ö°ÕŒÌ¦ó9\&¥ÐªõŠQ§Œ0 ‹ŸÈî¡ÜE×ì¶ð ئ“q¸ûŽÏ‹ìs³Z(øð‡ V¨ 7¸ÈØxÇ÷h€8Y鈙If8¡hè©*uy–@É9…:ÊÚê°êQº°úãj{k†!{Jú‰ ¼›Z×ÛG79ÌÜ|²¬ í<·‹&ýL­=]Ò½ kJHòŽ.nœÃ'ÉK—4‹½šÉ »š<5l¼¹™•=‹rGKÉÀ˜F›Ê8t ZReúœZ`êÏ>ë.à¼úðX¨1KÊ S—"…~­V ÙV6rÆJÚIç¹`ÃÙýeêÐ)kËøåÓ¶Û¸²BR:+®ÂÆIÆÊ¸R¾€…Z.˜8¤M^ž1/F’ïlçGÝò¾Ý·/âÁŸ¦½û2ri.¨3ËuÍùé—UŽ5åâߣ‰ÝÉ<`qÚˆB'k u^.–‹¤RæuEÖçô^~ðó\äˆï¦¾ý½hìšÓßæª;°{ÊÍÛ›ÿ¦¯]Ó…¤Z}¿(‡ŸõÒ˜OŽ” iŠM8CWBGHƒÂæa¬¡µZ4†%§[aöñòSyùù6PÕ]H‹K†â~2–øßŠÑÈUn=†`lBþCÖ`åtŒÒs^†+.×"oñ™(ßHTZÆ ü½X%r¨hÜŠFˆ–#‰æ†>®9Q-M’(Øi!:&–þI×å’P‰ܘlÞ§'â}VÖXLœvr蜟½çËQiNº—™‰Y(?ßÍ h˜\ژ鞅ö™—N^2(–TZánÙ•ÊÞ£ÀiÉÝ^$Ê`srªä]Sæ*˜æ‘ªk|§úê±¢ÿF©ß¥tvê%|ÀëxLj¨Ö×vÂk­$=!·±‡S€s9úY·é’„éŽ:þ9Ÿx_öšË–Gš—Q‘° ›+¥þ¶ÊZ ¾uë¹ÙùV*¶ë¥òª® ˆ«¤†6Üã¢h®¦ÿÊÑÃ?+p¬3*â™iÈû/<Þ}XÛ½–@l«›ÛN좄 û÷ñ›Î÷லÚ|1s9{<(¿xFG•4á…`rÊýèËòËð u GÈÇ\ß3[ KDi#[£ ¶³_I[ÛlÞŠ$ÚR$Öy>]çÜz£bxÖ ¸öÞiÖrÞ÷É-¸QµÄ|µ9‰ƒõ¦´vLùã²ÂñG/´Oš–¹å ažç¢ «éyO‘;Yzêmj.ú䪿žȲkû܈‹[ûÞçÎû³÷®øï£œð±I%¼ñÊsÎüíˇå8ëÒ?ÏÓîkºã<õÂ$öN¹Œu,ÞˆƒºãÓdý—ÙŸËRÇ~õÜk^&…ñ×ÔQ«f5nÜú÷£$øÝ$}ÿ ”’â¿Ú¾PJ¨2Ê” ‚BºRdHA‹ ðÔ *0ØÁ¢€0„ä ñgµªð!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjaAeͺ ‹ÇЮcJ5“×ìv—±‡pòk!Í ÉVž{9?Lñž]n,kÉE†ª—TÉå­Êø°f*¥ý†›§ˆ*åìÌÐ)cÁòÈå’,Ø×M|l6&h‡bsç~a¬>iK}ÀÉ%;0ÝzÏïO /½wà«Î„[\ Žø#oÁEàµZ'žÕØ‚^ š€ÃCþQµ_V>NǘµîÕ:Ìý¹(|9ˆz¥¥Ó]ïã2­.5Ð/D {O¤×Ž» ·ç®ÂŠ‚Äû¿;!|¤]Ž|çÅGŽí‹Ê/Ÿí g ½™_ï^ý=f„}öÆt?øÞßâ:ðã3¿ƒôç{ã{Ï6‡¼>KÉ”ÿ>r'ÇÑñì5‰øø³¢“W±Ksÿ£‰Šªæ¿Ú%’SŠê$Y‚ÖãŸâHÁlHP}Œ 9ØÁèa0„ª! U¦–žp…(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó •Ë ôŠÍjÔ³[³nÇä²ìmV…æ¶ûýD§×l¸ýŽBÔiyþXsÁ§R¨P'¨¸•Há‡p ÉhyYæh¨I)†ù ŠÔ¹ù@Úyªº’zàjèàÉJ[ÁiÀ†»‘Ziû ühª±‹|¼:ZœË‹ül§+¼³ mí&´[}²}í}ç\ÒMù].¨=Î<nÞ^›î/Ÿ!íQ?ÏÚÍþ ŸÿÃ_«I b[GÍ BüreÓ–£á‰¨†Åÿ#”@äðÑBHŽ$VáöðÃÅ’,Ãàò8feË’³IœFh¦N‘¾¾¼ùJ%ÁD×ÕQ¦ÎË-Go}ŠáTÍ9äÉÄ5«4\ =drò§ŠWé©ÃQöZf@£MôÕ•X¥Ój Ö5L¤žL ª7£š}×Våwo_DIe5¶ºxÐa§U×J]ªXÓÊbýÞz¶¯Ô¼?Û#«­Ñ»wåd‹Œê§ìÀ `N[8´çb— .3 ÙóãX†-of¼çå XÀõ ¿=¶2ÛÍÏý‚q ·ŸHb~SMnwrǾ9§† Ø»té™b^²ü÷ðÌî¡Ó-.ú¸äÄ´µ‡ÿÅj_|F^TÄàDUt[mÃÎ>ûQ¶`&ÈSEhéçÓ~A¨v^ss\Öà|È¥gn÷aÖ™ƒÌÅW"qõÉ Cèu£Œíõg_¬í(Š2p XÛ`( d®‡QŠ'Žw‘‡8]‹¾(åv1*å¨až=ò&j´éhaƒâw]}ˆé¤dêÙFàQQ¦IךCE)æ›]VIÝ™ R˜0f×]_†‰(=†þáuºé¢&K&9$’(º™–G7ÖŠWj‡B·õ ›fU zªRd&gf©jz§‰È Zi›bª¥ŒPþ§*­Lî™'‹¹è«sÅ>¹!H7ÿõf @…Cg„ÎxRTv§ †ŠV"¤Nª£ˆœ·‰kˆ”ʪ.}AšK•­«%J/h{Á{ïªãŽsc¨g*7Þ¬™:ºž¶6ÚTðœøîúç$ýúÉžÁ–ŠŠ&©Ú°1ÉÞ»i‘­ [ï?? ©\qáœÀ:·)ÆgJâËÁQ[1yrŠÉØÃ®¾ü\“¯ö¶0Æ'Ïle¸!gå#ÑI9#ɵצ«ó3:ƒŒ ¡k´» Õj ü4Swi°N64/ÕhÙùÎfÕh‡ÙÄk>A;2Ö¿½ã†šõ"®Öé€7>W‹Ø=u"8kqo‚ÔØv'y¶9>Þà‘¯Ce²¼-×ëå$5dy…žïä6 ¡Ž¹¨¿M 8§¯.rçÃN»€â\{í`Ãózîñ4®¬ï¾÷^´ðZŽ{GÆ£¾ûòÎßþ|ôˆKtó³ÏK½NÈS«(ñÙ3¿¢~´‘¦JþLüp’«é ™™{ÿ>^1—ýõ Î7ûáퟸÑè €­á ûHÀæO ÜÈØÀzIìzô+¹/0ƒd@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡Ä¢ ȰՌ̦ó9\.~ôŠÍjYK¤âgÝŠÇä§÷{8#¨å¶ûýV†Ñj¸ýŽÍ“õ´4(è³·6ˆ˜ˆW8ÃøÕWŦ8Iä9 vYéù×Ö)jzúA:ש±Ù…  â¥ZR*‹››Y•vÂjð§;Œ ¼ö`L¬¼ì@›•Ì=¶ MRÝ+ 8ŠŒQÍ{­-®>n~®émÎÞî]îÏ /:Á‹ÏEýb¯ŸÀôô¥¨70!Ápûvù"Ø, Â‰¢º] 'ÑÅÿ” ˈi]0Ž$Õ]jØ ä”c%[6vlH•h\ÚÄäq%F0+ ¼ ÔÚZ=²4j‚fЄgÔ öÔg—ZÅ¹ËØ(IN6³ÃŠØ‘ËÆöBiêU$©OsŠâíÕqN›®zøuƒÜ”n#1k–V¶p±Y¬Õ'°_²cÁùýçèÖáˆkk~c¼Ö±à¬ýªüö‘¥sÍ":X߬C’ý˜óYžª?³Ôú:]âÜ¡ü[vU_(‹Þm8¯oà R~ݳ®ç“ÂHC]-ø¯lÉŸ'1Š;ùñÂZs.çŽ×ûʘá“_Œ­q)äÂ×wçݹøTÚõÙÿV×µ ÷˜¨ŸEä5ƒz>•#Ivy¶ß,Æe÷Ù^Ú'Ûd½½‡•{牶^{”ÉÅ\H(¦É]†DUZBTžjÁ¶gåq|"ZV`@ŠVq*~˜¢­ð¶R™-9^sõhc–qv…д¸]sô¥“d‡Êiž€«É'fpdJ9›“!šébkÌ5õ]he‚y&NJa©e üù wçÝ#†MÖ‰f¶ç„eöö‰?ú¶¥óÉ8iž´Yé©“3±h(f’©(‘Œ†˜æ£àM‰(”ºUJåŠtz¨$¬‰Êªªµj"/MõßEQØCj¬zÿZòä²Ä¶à…Wª *{ÊÒa^ùÍɤT


© 2005-2019 The Golly Gang:
Andrew Trevorrow, Tom Rokicki, Tim Hutton,
Dave Greene, Jason Summers, Robert Munafo,
Maks Verver, Brenton Bostick, Chris Rowett.

Golly is an open source, cross-platform application for
exploring the Game of Life and other cellular automata.

http://golly.sourceforge.net/
golly-3.3-src/gui-common/Help/open-android.html0000644000175000017500000000204512250742663016432 00000000000000

Open Screen

The Open screen lets you select a pattern to load from a number of different sources:

  • The large collection of patterns supplied with the app.
  • The most recently opened patterns (from newest to oldest).
  • Patterns you have saved.
  • Patterns you have downloaded.

In the last two cases you have the option of deleting a file by tapping on the "DELETE" link.

Text files stored in Documents have an "EDIT" link which will display the file's contents and let you edit it. The resulting view has a Save button which lets you save any changes to the original file or to a new file. Text files supplied with the app have a "READ" link so you can view the file (editing is disabled and there is no Save button).

When you tap on a link to a pattern file, Golly will load the pattern and automatically switch to the Golly screen. (However, if you tap on a link to a zip file, Golly will switch to the Help screen and display its contents there.) golly-3.3-src/gui-common/Help/refs.html0000644000175000017500000000707313107435536015020 00000000000000

References

Good web sites

Good books and magazine articles

  • "Wheels, Life and Other Mathematical Amusements" by Martin Gardner. W. H. Freeman and Company, 1983. The last three chapters are an updated collection of his superb columns from Scientific American (see below). The last chapter has an excellent bibliography.
  • "The Recursive Universe" by William Poundstone. William Morrow & Company, 1985. An entire book devoted to a discussion of cellular automata and other fascinating topics in physics and mathematics.
  • "Winning Ways", Volume 2 by Elwyn Berlekamp, John Conway and Richard Guy. Academic Press, 1982. Chapter 25 has the title "What is Life?".
  • "Cellular Automata Machines" by Tommaso Toffoli and Norman Margolus. MIT Press, 1987. Describes CAM, a machine for doing sophisticated experiments with cellular automata.
  • "A New Kind of Science" by Stephen Wolfram. Wolfram Media, 2002. Bloated and egotistical, but there is plenty of fascinating stuff.
  • Scientific American articles:
    "Mathematical Games" columns by Martin Gardner: Oct, Nov 1970, Jan, Feb, Mar, Apr, Nov 1971, Jan 1972.
    "Computer Recreations" by Brian Hayes, Mar 1984.
  • BYTE articles:
    "Some Facts of Life" by David Buckingham, Dec 1978.
    "Life Algorithms" by Mark Niemiec, Jan 1979.
golly-3.3-src/gui-common/Help/help-android.html0000644000175000017500000000323412250742662016421 00000000000000

Help Screen

The Help screen behaves like a simplified browser and is used to display HTML information on a variety of topics.

Special links

A number of Golly-specific links are used for various purposes:

  • edit:file
    Display the given file in a modal view.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the Help screen. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is displayed in a modal view.
    • A zip file's contents are displayed in the Help screen.
    • A rule file (.rule) is installed into Documents/Rules/ and Golly then switches to the corresponding rule.
    • A pattern file is loaded and displayed in the Golly screen.
  • lexpatt:pattern
    Load the given Life Lexicon pattern and display it in the Golly screen.
  • open:file
    Load the given pattern and display it in the Golly screen.
  • rule:rulename
    Load the given rule and switch to the Golly screen.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file and displays its contents in the Help screen.
golly-3.3-src/gui-common/Help/index.html0000644000175000017500000000400612250742663015161 00000000000000

Table of Contents

  • References
  • File Formats
  • Bounded Grids
  • Known Problems
  • Credits
golly-3.3-src/gui-common/Help/algos.html0000644000175000017500000000107613151213347015154 00000000000000

Algorithms

Golly can generate patterns using a number of different algorithms:

golly-3.3-src/gui-common/Help/credits.html0000644000175000017500000000561212750014265015506 00000000000000

Credits

The pioneers

First and foremost, a big thanks to John Conway for creating the Game of Life, and to Martin Gardner for popularizing the topic in his Scientific American column.

The programmers

Tom Rokicki wrote most of the complicated stuff. Golly is essentially the merging of two of Tom's programs (hlife and qlife). The HashLife algorithm is based on an idea by Bill Gosper. The QuickLife algorithm uses some ideas from Alan Hensel. David Eppstein provided the idea on how to emulate B0 rules.

Andrew Trevorrow wrote the cross-platform GUI code for the desktop version of Golly using wxWidgets. Much thanks to Julian Smart and all the other wxWidgets developers. Andrew also wrote the GUI code for the iOS, Android and Web versions of Golly.

Tim Hutton wrote the RuleTable algorithm (now merged into the RuleLoader algorithm) and created the excellent Rule Table Repository.

Various code improvements have been contributed by Dave Greene, Jason Summers, Maks Verver, Robert Munafo, Chris Rowett and Brenton Bostick.

If you'd like to join us and help make Golly the best Life/CA app in the known universe then please get in touch.

The beta testers

Thanks to all the bug hunters for their reports and suggestions, especially Dave Greene, Gabriel Nivasch, Dean Hickerson, Brice Due, David Eppstein, Tony Smith, Alan Hensel, Dennis Langdeau, Bill Gosper.

Other contributors

Dave Greene and Alan Hensel helped put together the pattern collection. Thanks to everybody who allowed us to distribute their fantastic patterns, especially Nick Gotts, Gabriel Nivasch, David Eppstein, Jason Summers, Stephen Morley, Dean Hickerson, Brice Due, William R. Buckley, David Moore, Mark Owen, Tim Hutton, Renato Nobili and Adam P. Goucher.

Thanks to Stephen Silver for compiling the wonderful Life Lexicon.

Thanks to Nathaniel Johnston for creating the brilliant LifeWiki and for making its patterns available to Golly users via an online archive. golly-3.3-src/gui-common/Help/settings-android.html0000644000175000017500000000030212250742663017323 00000000000000

Settings Screen

The Settings screen lets you change various options. All of these should be pretty obvious. If not, let us know! golly-3.3-src/gui-common/Help/changes-ios.html0000644000175000017500000000722313171233731016250 00000000000000

Changes

Changes in version 1.3 (released !!!)

  • Fixed link to Rule Table Repository in Help > Online Archives.
  • Fixed paste bug that prevented rule from being changed even if universe was empty.
  • Updated the Life Lexicon to release 27.

Changes in version 1.2 (released October 2017)

  • Golly has a new algorithm that supports the Larger than Life family of rules.
  • Added support for MAP rules to QuickLife, HashLife and Generations.
  • QuickLife and HashLife now support non-totalistic rules. A number of interesting examples can be found in the new Patterns/Non-Totalistic folder.
  • The Generations algorithm now supports Hex, Von Neumann and non-totalistic Moore neighborhoods.
  • The Life Lexicon has had a major update.
  • The Banks, Codd, Devore, and JvN folders have moved into a new top-level "Self-Rep" folder, to emphasize their common focus on self-replication.
  • Rendering speed is faster in most cases.
  • Files with extensions .colors or .icons are no longer supported.
  • The Fit button will fit the paste image in the viewport if the current pattern is empty.
  • The action menu has a new Fit item that will fit the current selection in the viewport.
  • Double-tapping the paste image now stops generating (the same as tapping the Paste button).
  • Fixed an undo/reset bug that could occur if there was a rule change at the starting generation.
  • Fixed minor problems with status bar messages.
  • Major reorganization of source code so that the iOS and Android versions of Golly can share common code.
  • This version requires iOS 8.0 or later.

Changes in version 1.1 (released June 2013)

  • This version introduces a new rule format. A file in the new format has a .rule extension and contains all the information about the rule: its name, description, table/tree data, and any color/icon information. More details can be found here.
  • The RuleTable and RuleTree algorithms have been replaced by a new algorithm called RuleLoader.
  • If the Paste button sees clipboard text starting with "@RULE rulename" then it will save the text as Documents/Rules/rulename.rule and switch to that rule.
  • When the Rule dialog is switched to the RuleLoader algorithm it will display links to all the .rule files in Documents/Rules/ and to the supplied .rule files. Any deprecated files (.table or .tree or .colors or .icons) are automatically converted to .rule files and then deleted.
  • Icons can be displayed at scales 1:8, 1:16 and 1:32 by turning on the "Show icons" option in either the Settings tab or the Pattern tab's state picker window.
  • Fixed a bug that could cause the Undo/Redo buttons to be incorrectly enabled/disabled after tapping STOP.
  • The Open tab has READ and EDIT links that let you display or change the contents of pattern files. Only files stored in the Documents folder can be edited.
  • After tapping on a DELETE link you now get a warning dialog asking if you really want to delete the corresponding file.
  • The size of text in the Help tab has been increased.
  • Added support for file sharing using iTunes. More details here.

Version 1.0 released August 2012

golly-3.3-src/gui-common/Help/intro.html0000644000175000017500000000334012250742663015205 00000000000000

Introduction

Golly is a cross-platform application for exploring John Conway's Game of Life and many other types of cellular automata. It's also free and open source. More details are available at the Golly web site:

http://golly.sourceforge.net/

What is Life?

The Game of Life is a simple example of a set of rules more broadly known as a "cellular automaton", or CA for short. CAs were first studied in the mid-1950s by Stanislaw Ulam and John von Neumann but became much more widely known in 1970 when Conway's Life was described by Martin Gardner in his Scientific American column.

Life is played on an arbitrary-sized grid of square cells. Each cell has two states: "dead" or "alive". The state of every cell changes from one "generation" to the next according to the states of its 8 nearest neighbors: a dead cell becomes alive (a "birth") if it has exactly 3 live neighbors; a live cell dies out if it has less than 2 or more than 3 live neighbors. The "game" of Life simply involves starting off with a pattern of live cells and seeing what happens.

Even though the rules for Life are completely deterministic, it is impossible to predict whether an arbitrary starting pattern will die out, or start oscillating, or expand forever. Life and other CAs provide a powerful demonstration of how a very simple system can generate extremely complicated results.

If you'd like to learn more about Life and other cellular automata then check out the links and books mentioned in the References, or start exploring the Life Lexicon. golly-3.3-src/gui-common/Help/Algorithms/0000755000175000017500000000000013307733370015354 500000000000000golly-3.3-src/gui-common/Help/Algorithms/Generations.html0000644000175000017500000002212413230774246020443 00000000000000 Golly Help: Generations

The Generations algorithm supports rules similar to Life but with an extra history component that allows cells to have up to 256 states. The rule notation is "0..8/1..8/n" where the 1st set of digits specify the live neighbor counts necessary for a cell to survive to the next generation. The 2nd set of digits specify the live neighbor counts necessary for a cell to be born in the next generation. The final number n specifies the maximum number of cell states (from 2 to 256).

Here are some example rules:

2367/3457/5 [Banners] - an exploding rule by Mirek Wojtowicz.
234/34678/24 [Bloomerang] - an expanding rule by John Elliott.
/2/3 [Brian's Brain] - a chaotic rule by Brian Silverman.
124567/378/4 [Caterpillars] - a chaotic rule by Mirek Wojtowicz.
23/2/8 [Cooties] - an exploding rule by Rudy Rucker.
2/13/21 [Fireworks] - an exploding rule by John Elliott.
12/34/3 [Frogs] - a chaotic rule by Scott Robert Ladd.
12345/45678/8 [Lava] - an expanding rule by Mirek Wojtowicz.
012345/458/3 [Lines] - a stable rule by Anders Starmark.
345/2/4 [Star Wars] - an exploding rule by Mirek Wojtowicz.
3456/2/6 [Sticks] - an exploding rule by Rudy Rucker.
345/26/5 [Transers] - an exploding rule by John Elliott.
1456/2356/16 [Xtasy] - an exploding rule by John Elliott.

Other rules in this family, along with more detailed descriptions, can be found at Mirek Wojtowicz's MCell website. See also the Patterns/Generations folder which contains a number of interesting patterns extracted from the MCell pattern collection.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual notation and use neighbor counts ranging from 0 to 4.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

Golly can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual notation and use neighbor counts ranging from 0 to 6. Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons (in icon mode) at scales 1:8 or 1:16 or 1:32.

 
Non-totalistic rules

All of the above rules are classified as "totalistic" because the outcome depends only on the total number of neighbors. Golly also supports non-totalistic rules for Moore neighborhoods — such rules depend on the configuration of the neighbors, not just their counts.

The syntax used to specify a non-totalistic rule is based on a notation developed by Alan Hensel. It's very similar to the above notation but uses various lowercase letters to represent unique neighborhoods. One or more of these letters can appear after an appropriate digit (which must be from 1 to 7, depending on the letters). The usual counts of 0 and 8 can still be used without letters since there is no way to constrain 0 or 8 neighbors. Letter strings can get quite long, so it's possible to specify their inverse using a "-" between the digit and the letters.

The following table shows which letters correspond to which neighborhoods. The central cell in each neighborhood is colored red, corner neighbors are green, edge neighbors are yellow and ignored neighbors are black:

The table makes it clear which digits are allowed before which letters. For example, /1a/8 and /5z/8 are both invalid rules.

Golly uses the following steps to convert a given non-totalistic rule into its canonical version:

  1. An underscore can be used instead of a slash, but the canonical version always uses a slash.
  2. The lowercase letters are listed in alphabetical order. For example, /2nic/8 will become /2cin/8.
  3. A given rule is converted to its shortest equivalent version. For example, /2ceikn/8 will become /2-a/8. If equivalent rules have the same length then the version without the minus sign is preferred. For example, /4-qjrtwz/8 will become /4aceikny/8.
  4. It's possible for a non-totalistic rule to be converted to a totalistic rule. If you supply all the letters for a specific neighbor count then the canonical version removes the letters. For example, /2aceikn3/8 will become /23/8. (Note that /2-3/8 is equivalent to /2aceikn3/8 so will also become /23/8.)
  5. If you supply a minus sign and all the letters for a specific neighbor count then the letters and the neighbor count are removed. For example, /2-aceikn3/8 will become /3/8.

 
MAP rules

The totalistic and non-totalistic rules above are only a small subset of all possible rules for a 2-state Moore neighborhood. The Moore neighborhood has 9 cells which gives 512 (2^9) possible combinations of cells. For each of these combinations you define whether the output cell is dead or alive, giving a string of 512 digits, each being 0 (dead) or 1 (alive).

   0 1 2
   3 4 5  ->  4'
   6 7 8
The first few entries for Conway's Life in Generations form (23/3/2) in this format are as follows:
   Cell 0 1 2 3 4 5 6 7 8  ->  4'
   0    0 0 0 0 0 0 0 0 0  ->  0
   1    0 0 0 0 0 0 0 0 1  ->  0
   2    0 0 0 0 0 0 0 1 0  ->  0
   3    0 0 0 0 0 0 0 1 1  ->  0
   4    0 0 0 0 0 0 1 0 0  ->  0
   5    0 0 0 0 0 0 1 0 1  ->  0
   6    0 0 0 0 0 0 1 1 0  ->  0
   7    0 0 0 0 0 0 1 1 1  ->  1   B3
   8    0 0 0 0 0 1 0 0 0  ->  0
   9    0 0 0 0 0 1 0 0 1  ->  0
   10   0 0 0 0 0 1 0 1 0  ->  0
   11   0 0 0 0 0 1 0 1 1  ->  1   B3
   ...
   19   0 0 0 0 1 0 0 1 1  ->  1   S2
   ...
   511  1 1 1 1 1 1 1 1 1  ->  0
This creates a string of 512 binary digits:
   00000001000100000001...0
This binary string is then base64 encoded for brevity giving a string of 86 characters:
   ARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
By prefixing this string with "MAP" the syntax of the rule becomes:
   rule = MAP<base64_string>/<states>
So, Conway's Life in Generations (23/3/2) form encoded as a MAP rule is:
   rule = MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA/2
Given each MAP rule has 512 bits and there are 255 different Generations states (2 to 256) this leads to 255*2^512 (roughly 3.42x10^156) unique rules. Totalistic rules are a subset of isotropic non-totalistic rules which are a subset of MAP rules.

MAP rules can also be specified for Hexagonal and von Neumann neighborhoods.

Hexagonal neighborhoods have 7 cells (center plus 6 neighbors) which gives 128 (2^7) possible combinations of cells. These encode into 22 base64 characters.

Von Neumann neighborhoods have 5 cells (center plus 4 neighbors) which gives 32 (2^5) possible combinations of cells. These encode into 6 base64 characters. golly-3.3-src/gui-common/Help/Algorithms/HashLife.html0000644000175000017500000000120512250742662017643 00000000000000 Golly Help: HashLife

HashLife uses Bill Gosper's hashlife algorithm to achieve remarkable speeds when generating patterns that have a lot of regularity in time and/or space.

HashLife supports the same set of rules as QuickLife, but with one exception: if a rule contains B0 it must also contain S8 (or S6 if the rule ends with H, or S4 if it ends with V).

Note that HashLife performs very poorly on highly chaotic patterns, so in those cases you are better off switching to QuickLife. golly-3.3-src/gui-common/Help/Algorithms/NC.png0000644000175000017500000000213113307733370016277 00000000000000‰PNG  IHDRGGU°Z!tEXtSoftwareGraphicConverter (Intel)w‡úóIDATxœì\=Oã@µ¨)ø¡# üÈ/€Ž&5:ˆ\!Ñ@Gt¹êh=×)'"Q ZšCsûöÖÇ{IØx7ºyÒ€ˆŸwfŽ÷kì(rʳùùyªV«´¶¶F´½½MÍf“vww©ÕjQÇò7þÆç8ø8çµ?…\œƒÒèv»tuuE'''txxHív›nnnhyy™z½½¾¾ÒÛÛ½¿¿K>~ão|Žãàóp>ÚA{h7hVÄyyy‘ Ñéé)ÝÞÞR¿ß7’ù²<´ƒöÐ.Ú‡ø‹BG|-êFCþ‡¯¯¯éùùùÃIOÂCûðð ÿ¾50 ‚ZÖö»^¯ë¯È¤I˃?ø…Ç¢oM$D {Âþû"l.r˜ô¸<øWq ž=Ÿ¢Ô„ýöMX%uÈ›8©Ø**.ÄW+[˜-t»ÂvFö.N*ÎçÖ´5Iû%l%‡Œ8*ÞïÁ´4I û!l¡€”8*î÷™kM$677ewPƒ6Ä<œ #?Gþ®—<5:w% î1ßCOzòùô=HõJêã-×Y¤¯ÂöGò–ŒkÞˆœ÷‘·M˜ºšöÏýgâÌ©¼õ ¡äêêª÷‘¬CÞ#fÿÇR#VÔòªfáŠø y#èð´8X‹ít:ÞƒôÉCþÐ!áiqާ¾æ:ùC‡„'Åy||”«ù¡é“ ‡çòòRnw„¤/t€Zl”===¤/t€Rl±â.Z>yÐCn=/--É­Ö2‡ÎƒÐ%Z__×ÝWYÎCçA衊¡V«y¡†dкD(ó@5C™ÿ™„wo5Wô€.ê`PîQ¦ó„ª8кD(B=L™Î^¨â@è¡’ªìªˆ„ª8к`-£tç /TqèÂWÎè+‡ï9&ô=‡{+º·âqŽ =ÎárÁ™çV&ôÜŠgå&ô¬œ×sLèõy%p€¡•@üà5äŒ5dÞ}ÀØ}xß*gß àÏ‚OÞ+ÏÙ+OŒ«,Ì* ®Ï±<¯Å•]ÅâpM E ®&µÄuÈâp»E ~öÁ"?5cˆŸ·*?©g?ãiAÌO#æçÊ‹ó ìˆù]ňù-(vÄüþ+øÍKJ†ßÙ5ŒÜꬽíí/ÿÿ-ÚA¦„lùIEND®B`‚golly-3.3-src/gui-common/Help/Algorithms/hensel.png0000644000175000017500000004247513151213347017266 00000000000000‰PNG  IHDRQþª^ª. ViCCPICCProfilexœµ—PYÇ_wO¤‘Ì3’£ä8äœL 30 a† "fX*" ² ¢àªY"ŠiPÀ¼ƒ,깕käÀ½ºÛººª»Õ×ý«¯¾þÞë÷úUýÊY–@ KÂO{º0"£¢x€€,ú@“ÅN8ú‚¿Ôd?Zê®ál¯¿®û·’äÄ¥±€QŽå¤±SP>‹ò8[ L®B¹{uºe -D'ˆòöYæÎqÙ,ÇÎñ©o5¡Á®(w@ °XB.än4ÏÈdsÑäq”ù ev‹ƒr Ê))«f¹eØ?õáþSÏØ…ž,wçÞå›n¼4A2kí¹ÿY)ÉócH¡Aá'ûÏî QËÍgžÉ ù8~XÈ<ócýæ9^è¼PŸîò' ç¬Wÿ…>iî }YÞó,Ì›ç´Ì÷ïφF,Ì-Îm!Ïó`Î3/¹0VÒ*Ÿ…9ð,ÀN[3»ïÀu•`­ÇMHg8£_YœƒÉg0LM,ÿçküÿÔìùš£wôoç¢ßüžKmÀ&Mr¿çXêœ{mò{Ný-ºõ»¸ÐÍÎfÎå0³, ¡çVÈe t€!0–À8wà @(ˆ+$€ «A6Ø rA>Ø öƒPŽ‚cà$8 šÁyp\·@7è€ ƒ—`L‚i‚ð¢Ar ¤ éC¦5ä¹C¾P0Å@\ˆe@ÙÐV(*„J  ¨ú:]†n@=ÐhƒÞBŸ`¦ÀÒ°¬/†­agØ…—Ã\8΂sàp1\ Ÿ€›àËð-¸Á/á  d„ލ"†ˆ5⊠ÑH<"D6 yHR‰Ô#­H'r!¯††a` 1v/L†IÅlÀ`J0Ç0M˜Ì]Ì fóKÅ*bõ±¶X&6ËÅ®Ææb‹°ÕØFìUlv;‰Ãáè8mœÎ …KÄ­Ãàápm¸ÜnÇËáõñöø< ŸŽÏÅÄŸÀ_Â÷â‡ñd‚ Á”àAˆ&ð [E„ã„‹„^Âaš(AÔ$ÚˆâZâ.b±•x‡8Lœ&I’´Iö¤PR"i3©˜TOºJzLzG&“ÕÈ6ä 2¼‰\L>E¾N$¤HQô(®”e” ÊNJ ¥ò€òŽJ¥jQ¨ÑÔtêNj-õ õ)õƒMÌHŒ)ÆÛ(V*Ö$Ö+öZœ(®)î,¾Bõvõq  ?l:‡šDMkÍÍššSZÚZZÛ´šµFµeµ™ÚYÚuÚu¨:Ž:©:•:÷tqºÖºIº‡t»õ`= ½½R½;ú°¾¥>Oÿ~ÖÀÆ€oPi0`H1t6Ì4¬34¢ùm1j6z½Xcqôâ=‹;5¶0N6®2~d"eâm²Å¤Õä­©ž)Û´ÔôžÕÌÃl£Y‹Ùs}ó8óÃæ÷-h~Û,Ú-¾XZY -ë-Ǭ4¬b¬Ê¬¬¥­­ ¬¯Û`m\l6Úœ·ùhki›n{Úö;C»$»ãv£K´—Ä-©Z2d¯fϲ¯°90bŽ8ˆUYŽ•ŽÏœÔ8NÕN#κΉÎ'œ_»»]]¦\m]×»¶¹!nžnyn]îRîaî%îO=Ô<¸uãžžë<Û¼°^>^{¼˜JL6³–9îmå½Þ»Ã‡ââSâóÌWÏWèÛêûyûíõ{ì¯éÏ÷oÌ€½OµS •=6 Îî ¡…¬ 92êº+ôQ˜NXFX{¸xø²ðÚð©·ˆÂQäâÈõ‘·¢ä£xQ-Ñøèðèê艥îK÷/^f±,wYÿríåk–ßX!¿"yÅ…•â+Y+ÏÄ`c"bŽÇ|f°*Y±ÌزØq¶+ûû%lj³3gW7o_?ʵçîåŽ%8&%¼â¹òJxo½Ë§’’j’f’#’R)1)çøRü$~Ç*åUkVõô¹QªmêþÔq¡°: J[žÖ’.™Û:?d f:d–f~X¾úÌÉ5ü5·×ê­Ý±v$Ë#ë§u˜uìuíÙªÙ›³×;¯¯ØmˆÝоQ}cÎÆáMž›Žm&mNÚüëã-…[ÞoØÚ𣔳)gèÏêrÅr…¹Ûì¶•oÇlçmïÚa¶ãàŽ¯yœ¼›ùÆùEùŸ Ø74ù±øÇ™ñ;»vYî:¼·›¿»ãžc…’…Y…C{ýö6ícìËÛ÷~ÿÊý7ŠÌ‹Êdû·Ô8¸ûàç’„’¾R—Ò†2ŲeS‡8‡z;®/W*Ï/ÿt„wä~…gES¥VeÑQÜṆ̃ϫ«:²þ©¶Z¾:¿úK ¿Ft,øXG­UmíqÅã»êຌº±ËNtŸt;ÙRoX_Ñ@oÈ?NeœzñsÌÏý§}N·Ÿ±>SVólY#­1¯ jZÛ4ÞœÐ,j‰jé9ç}®½Õ®µñ£_jΫž/½ sa×EÒÅœ‹3—².M´ Ú^]æ^j_ÙþèJä•{A]W}®^¿æqíJ§sç¥ëö×Ïß°½qî¦õÍæ[–·šn[ÜnüÕâׯ.Ë®¦;VwZºmº[{–ô\ìuì½|×íîµ{Ì{·úüûzúÃúï,ÝçÜ}üàÍÃ̇Ó6=Æ>Î{"ñ¤è©âÓÊßtkYŠ. º Þ~òìÑ{èåïi¿ÎyN}^4¢2R;j:z~Ìc¬ûÅÒÃ//§_åþMòoe¯u^ŸýÃéÛã‘ãÃo„ofÞ¼“{WóÞü}ûDàÄÓÉ”É驼rŽ}´þØù)âÓÈôêÏøÏÅ_t¿´~õùúx&efFÀ²¾Y 8>€·5P£Pï€úS’Øœÿý&hγ#ðW<ç‘¿ 5Y5N„mÀõ(‡ÑÐD™‚Þgm`¨€ÍÌâJ‹73ëE¢ÖäÃÌÌ;%ð­|ÎÌLš™ù‚ú{äm©s¾{V8ôoä~–nh+ÿ‹ú;fÝ䯨)Ìõ pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡ú:`IDATxœì=o£JÇù@ßO@ÿˆÚ5ÒS¹»¢s‘D4{‘m‰Ý\![¢²-Y¯HlYÖjÙëиqAÃSPPÐPPø9ƒ7 ‰bÃ9šHÑ 3?ÍÀ^1‡ù ­IÆÀß ­vrr²ÕüI}­â "qŽ{Òügu¥ô‹K/0¡~t Ôü»V™æŸ!-x~ ʧ.v‘Ûl ¨vÁ±b× ¡Å³Ì,bG®@ó‰Å¡·Ô’=‹¶á–гeB‘ ÇuFÉâE¦Ú)ü¨¸£ÓÑæBÍ¿c•kÞ•XV¥\]ï[Ç#qeïr0seàûKfÁ’ãùTKì=ÎØ€ÅDgN•‡çÀbŒS6³‰`« ŽjÓ·híB˜ØKíö+jþ=«Vó¡*pÊvÈ#š)é>·Ï†™)åpA‡‹–"˰ì‹Ífª~mŸÚ-ARùšgåÍm m¹"Í,úƒ]Ôü;¶ÙÃsè7g ži0/õåÒq[}Eq?iq¡kÖf%({ìQåZ“´*æö¾mèÛ3²»F;o¢®o>ž}øÛTG­ÅÓƒ‰½ Ø5DÍ¿e¾­‹¸Ã]_ÏîïO³³Ü_ÿn¾äà ’òÒO¯wXJÔ÷šæcG'~v9þÚÏ—&ƒÄتÈrÏ2lKñˆdc[kCŒyÉ&Ÿú,M8¡#*ÿùo›‡üB+qŒÊ¶~š"SnqÆHú2•EAÿÈÄ·š»¦7ª˜yÂ@”ó˜öûÿ쳇‡¸ÃÁ£¼Xœç¨âÏŒ{YU(}HÊ[xŸï(šáò5ïŽÚp¤y¸&nÃA{šWsè ¶~ùT·_2qË8ö —mÄ%«„›Ëˆ+^g›Ç›VÞî·Eĵ+cÀèÙ½uÙÙüƒ[?GæØŽ½Åµ:ª¢È²¬(ªí¿Ì²å>ù¥²CxL÷¸ú‰°b\¾æ“!šéX9s‰_ï³ÁÈPz|?tÝÿõnFþ­;göAóœ½ÅÃÿЛ’Ÿ4ÏA¦Ç©Dìºþ‹,‰%} jq5aŸü¹ýƒOÑö£peȺó˜'ÍÛí´¹L.“tÛ÷WJâA=q{ÊmÜf–´õÎ; óÑÆMhì$ã<Éé¬LJžw U­UzZ‹m›Þ‹,‰YííB€ÖaÛ qˆ«ß¦ZŸWöðbO¹‡{!Î_øcöAÊ’µñ†ûtY{´¨#ƒ8WæeEbÞX…P”Ö&ÓVè8Al)-†l j¶¥%9“LV™[ê<•%)v%$ëü5½½z¼dÙ³·Ïê*ÆÕ÷$²‚Ó¬4îÖÈf?^Ü[guaàûAŽËðd¡.=ºÀÎz6Žßu=Ê“µ˜ø~% «ÉÊO{Ï^{LÇãqöÓ,眊qõ~ã¨ü·VRµƒ+³Ù¡Ì#Å|Ï5$NÔ ¬® ˜£‰¬¨çô=»ÕŽƒÁ ×+áÝÛŠqõ~³¸ü·Sw©” %#®øûö¡ç•¼{ë¹Þ>ªm'Ü`N›ß÷76ãêý ¢ò…²Kí L(ùqÅ5,v"DÍ?Ç¡æ?‡š¯D„¨ùç8Ôü§âPó•ˆ5ÿ‡šÿT\s5Ÿ{¤< ºÝ¾Y1®Þ_ø,ÿ+‘»ÔÊ„’×PÍ¿öEáñxl%|ëºb\½¿ä]þ× w©”IÒ×PÍ¿á9 ,Ÿãêí±£d¯;ÖJ>FÜÿÿÿì=›HÇùD|†ãðhÚÍî"KW¸ZÑ$È^‰D'Ë+Q¹ —µQr$:¹ˆs7n¬ \AA±÷`{ý² ¶˜ÙYæyšµg~‹í?3ÌÛ_RÍ#qÒâPóˆCœ\8Ô<â'58ÄÉ…;hþMsƒó"q"ã”í+ ⤞ojp¾@Ä!NpÜAó/uãaœ/qˆ‡šGâ䡿‡8¹p¨yÄ!N.œ¤š§ž³ý™Õ|{Ä•ÁqžÞß,œ¤š§^›õ̓¬ò+ÏW#Žó2¾Æá$Õüß´k°ö «ü sÄÕˆã¼\¿q8y5Cµ×ÊÃ-dåËßTÛ'qepœ·åi5ßDU4×8rơ曨Šfã'BÎ8Ô|UÑl\ãDÈWAóI‘ÓÔ¡ÄzMa`uù|¥¢ègJç…òЇ¬|ùŠ>6ˆ+ƒãl›Ó8\IÍÇ‹¦uÎxFF¥*tN²SÛ4íÕ¿qM/°È@n2)tƒ¬*~u´kœq•/'ÇÙ×6 ê÷«ƒsŽk•Ñ|Ř_ª•ýÌ=šNÃ#C1Ýåår4Qô3%ÅŽ'…îŸUÚ¹µ„•*g\æmš+'¹ÖJ•#޳ .-Ž©/m-¸³šO“„P“']1Üð¸ØóR›fúÂÖN4Ÿ&ÏýkóÇFîÞܾ® RÄ2ÚÅùîhqâ˜Eš}Ë„¶9DË™ËrSÉ«þÎ’6bš–ÉwÜÅ6iæ´Õ0MÚöšµÓüÜm«šIz«ÓíZÓÌu’pìããÚRsttC©TÝNÐXÊîùßÍííœ^àÓx¸!|‘?î²zï¥qY¤ï›+¦äN¡öާ qsUäùc·çŸYˆ¾FÃ[~7¨ùq¨ùŠ8¢æc[Û^—nêÙã¨kmnëŠjoÜàcrÍ®cÛ–eÙ¶3[ý)š=ß–õnÛö›¦2Xfu;TãÝYL:6}:¿¦¨VÎö"ünPó5âPóqDͯ·šï«Ç\„4Ý­æ5Ewö]niþ úJÛß¾Ÿ[ûçùÄkÃùôn·¥·œ›|þØksOAÍ£æEùî$ÑüãÔÚÔïj{±ŽáQÜtæû¬daï»Ù¦]¸7¨N°Œãh`ªm?Ê«¨îî «ìÆÑ­ÓLÑUs‚E†ûn¼ü±Ûô M7Âw1DèÂ>¼q؇WWЇ—F¶©î.࣓¼UgßH–]}WÊt6BMBËØ¼W5MUT½åÎWéÂ8þ´4+"›ÅÒ8z¶¯%¨Æê.Œ÷°<{q\3ÆêÆãñ—O$ܧOccu…8–cuµàÎÕÅëq"]2‡ª¾óÔîOãõúÙ º$>IˆüŽÖöâ]ÉÕÀ4žºýŸ›utNýVª99¾_<¯Ã¯’Ìdâ'/ƒDÈzísr&Añ§ þ99gpã¿êŸ“ç¬ Wr^èu´–{ÝSwîŠaMË0\nW7lB?<ÉZjË©þ+‚jºèp8ì÷I3û}¢C{ÅÙ©ÍÆqž{ûa:|øNÂ}ï 9´Wœ ûzqåçÛÇQ¸¾® ž®æVËÐ tÓr§EªŽÂ¨Î6ýSPuÌ@] Mè|:$Þ1èj6Žó¨Ü MKRÅ-dÕ¾èåõâÊkþµ„Ȫh65/&5/‘QóbŠ35/‘QóbŠ3N^Í]‡Ãa¯GÚi°×#örUãm6Žó˜ï§ÃŸ3nÖ{Oê媸)åëÅIªù¢í™ïïï=´£°çAV>½ânÐÍÆqÞëúÏà>ÙÎã¾zUûæÓ¯'©æÏØ0:°q}h6޳§Åç/$ÜV&¯'©æ‡8iq¨yÄ!N.jqˆ“ ‡šGâäÂ4ÿ¦¹Áù‡8‘qÊö† qRÏ758_ â'8î ù—ºñ°Îˆ8Ä ŽCÍ#qráPóˆCœ\8Ô<â'5Ïwf5« ð‚ã*ÎH§šÞ_}[WÌs§šÚ¦iÏ® „š/ò<ó¿’íñªÈqÇ-Ö&?.2ÿûZÁ@ŽÞ¯’__»¸PÏ's+Ó¼n 0FŠbdŽÔÉL»Ró ú Xži;¬}•tª…kOŸœñF†bºËç%Άš/ð6-²ÁeäÜÊwÞJµÐu·¬Q,µ n5_ZÎ8vq©mŸ9Ïf•r–“®n¸yy^óiòLãéIf|œ½9Õ,ó«OöÉiäTþ‘ ·¢9M_Íñ2ò0猣µL¯hßl»Øãþÿÿ쿎«HÆy¢zž€ &&u6"#º"CÝ-1«ê+9YfºÛšÛhtå`õ8! aï)ÀÆnÀÓÔ–íó%ã[Tù+<ý£þRç$ó’•$þB !Ú²i]ËFžÔñ¤w ¦«”U}¾MCËYË'Ç2¤Œ†ž³‰dÔ¡ægADY&‚¤jºn@)ø*(¥jªP—Ðs‡vø"Jö¦â>…ˆ²Œ.¸Õ ?ך‚Ž.mfÛšOÐKì+~|ȳ“yÈáÒ¡€¤ëª¤ZuÜù¼O2/!ó\ÙÝ6„÷Â|X´š²“&«rL.ì†ÓåÕÙL¤4»~^¬èòžä%ubÙÎÓž„Vës…%îÖêŠH#¢åm¢(j¦ñrzôÞ¾Njæ3úøpã4ÚDU.o±ëö¼ÕQ?ÐÅâaR çð®×n>f¾ž9£i_-Õà{Ó ª™kÀw;šLó-œ°zLÔ^ì™J™hûž]>2äU\¬m~&ŠçÛb#þ¢o[KIn9ÃE™e±Ü”Ö!t¢áÃy.˜§‹g®ûÔÒŒku]v¯o=ËKÓ×êF­fýþÔ¤]=¨óÐÅ3ÆKƒýv·³VwV9íükÉ¥öñJn¶-²4ÍòÄVäÕ‰ÎúÁÒ}~ÍëÏÚ!N˜yyùÞÒj5Ï&™;øÎ¾m$¯¯“ìFïZy[µ«uæq PÝëûmíÉ¢ÈÕDÕ>®>P|A6Ö›0ŠBÏÑ%Ùòøl•¨Î í?âù¾ý›ÏÏÏ3l†»]ôã.]ã­¾=vÿZ?üçvöÞUGéˆ^v£" UA’b8ÃvñAï Š/pã„ùÎI5hÜ OÛNŸúÒËØ×B>žàÒÕØ1~¥§Çšzèáw1ïØÜ’yd™ß"óŒíyd™g'd™Gæ·ÈZ»Çîwï…®ÛãY׊æOÄE˜+ÈĨ0 ^›ã=vþÀ˜\ŠæÑíø±CæÑíîË™G;´»/;díÐî¾ìæ¹]1¾A´C;ží„ê …ºµó·*Æ7ˆvhǹ]ÃüÿëÁ3·ß Ú¡çvÈ<Ú¡Ý}Ù!óh‡v÷e‡Ì£ÚÝ—2ÏÂnôžíÙv¤sa7mGú%//\Ý|Bæ™Ú~7kž7Ïx±›öæÙè—'¾WÇÖn>!óLíF¿ƒ=Ïæ¼ØM{ÃüçØÃ&¾?ÏÖn>!óLíFŸµ2ÏI2¼ØM;IæçØC‡&ž“ÃÖn>!óLíx‡™çÆn>!óLíx‡™çÆn>!óLíx‡™çÆn>}óy–ŸË‘¦u–"K“ô\ö ê« 'Ì‹…2O¤^ì¦Ezù96(ÐÄ86líæÓ0ŸmlQÔND‹Œ=ƒM Y_‡Dyj¸Ö¦¢˜~;æß¼¿üõÒŽaöæ1èv*ÄÚ4»±w5iWê<(€ÜØà¯4€Ü»Îh|ð‹½¾}½Ý|šÊ|/AÎ5Û+7ºæ0 ×^_RÙ“Ú8æz4o) Š~ÊÀóïïî¿Ýv¬RøûøñëÈ­_nwÁÝÑ0¸­êA§DÝ=ä÷R»ÓQw¿Ün> b¾Èó&"ì‘r[d'Úÿ›vÛ³ãœeW{cŠ{æ?©£H‘g­”.û&µˆ]A›xw±#Ò§'Ì÷­ñö„¿®écïnb¸{Ævc̉vóéóÙÆP$Q’DèœËÚ:9¨läI=:u‰Hª*5!â·¾¥B1E‘ -O™Ï¢µ©)D2Óþ"D”%"Å,#Qæ+CE‡^shßÖ%Z¥ M/.C¨Rî(à Q²7÷©!Ê2:¬-'ÌwÎAW¶ mŸž~›Çþ¶>>¾uü™þý6³_m7öî P“®i…o™gi7öÇœh7ŸÎ0˜”,;¦-5%l7&¯”®5A0*ä3:L—i—=€:$&\]”øÌ$5óÛ"u5Ú̺ŠÄ®*H}®¤ØY›õaÀÔÙþŠÎ¶K{ KEÐ,£- ,è\»ñ¶¡G‰-¹XU9ƒ.æÛEèmÿúAEÿ…§€dígãŠ(JJ¼ÃO·g˜—yd™oë4óe3 iw8*|Ëô »œÓ=UFô¸È=`ÓÃ,/SˆCØ "ìÊî™oYÔOsü$ MY4ýt­Ó™Ë ³,¶²XÁ"(Ûyê £b”¡Œ>Ü86QU7oѬ~ºÕÙ~Ì#áÞÙ»Ã9¼vóéÜx¾ESÚ•úƒî.³%0d×¼d[.ÂW5>u™ç‘Q"¢oIušsÏ|G‘ml©be´X–Í;ç«ÿ_*eØ3Zfaûž]f•Wq]…E]ªš årðßy«óýšgíÆ./A"\š´V7fyi¢Ý…‹g­êA‡®Õ1\¼`áóZ×êò,ËÊ5±[%ªÓÞçÇó£÷o>>vÆŸºö¶íoõek7Ÿ¾f¿}GiÿÞÛ ÏT !ÒÂN.ð¬8Š;ë óãÞÓxzú>Ã¤ÚØ1~¥‡­Ý|úæ¯BÈü­Ù!ó ™gjwã"óÈ!óLí.‰‹01ÈÄmÛ1¡ÁÐn>!óh‡vwj‡Ì£ÚÝ—2vhw_vÈ<Ú¡Ý}Ù5Ìÿr»b|ƒh‡v<Û Õ' u:jçoUŒoíÐŽs»ÿÿÿì¿nK‡óD¼Ã>Á¾õ­ÝÞ.r—ÊJ“¬l$œD´n ,F1²ÒÄÁnhRÜ&Í-R¸qAÁ=kG× ;ãõÎì9œÙù¹@ÄÇ,|,ìüù=9¿«îî pÀ)ÇÁyà€‹ ç..œ¸¸pp^÷ÌŒô‹ Ӝ틖ÌH·Î·÷Äé˜ÞÏÑ;¾‚ó¢8Ûʳñ8Ø ¶´6k1¢¦ÐWžå‹|tfZWw6¢&wœŽe|L½ã+8/Š»²¬0?>ÜܘÖ`ßRSè+Ì߇ïLëçßR“;NÇr}¦ÞñœÅ]Yv’ùøq¸\šöZYö¨©|ÿƒ v’^{™iŸœ¬GMî8Ûò0õޝà¼(ÎÃy8/WpÎÃù œÆÁy8¯ßùõÏÕí+ƒ£(%Γ^>|,—¦,”å5•ïVÒËàzpôÞ”cóþˆšÜq:bs˜zÇWÎßqt¯¶B- ÎÛÝÎÏ­™gÔä W?ÑšÊ÷§ñIt£Çœóê¦Î=@®fŸ<ždïøªÂùõÏQ‡œïž´àD¯Äycr+½mÙ¦Ôä[+¹u2¡¦òýéA^ƒkOnµæÒúÅÖIÝõŒÁî_Uÿž_ßýjðÎÛ†”™òç…q ííÆñÕóÎߟîw“4MM1¯Á•ç—è«`qf(KØë}b–aÂÑ[y¹<0Xq=,¾D”­ÈzÔdºŠqðB [Œã«ªßóßÞ¯y’á÷|#88®„Ñ8ÿx /ÉpžoçÕ0:çqžoçÕ0çïWýâ5Oû8Ï7‚Ã5¼?¬ê¢Z4×ðö’‡½s² þâ½çw0VgÂåÓé|b^¢R“3NÕà™ñ`ú F2VךRâ¼èœ n6›å¦i$ôOjòÁi˜$3[&5¹OŠdNN›JƒóÒso…g§ê˜ ÛŽ™Å|çEqÒkl„W¡èXôÒŽD|çEqp¾Iœw*8/ŠƒóMâà¼SÁyQœoç ΋â¤÷ÀÞ%RǦ”íØá“¯à¼(Nz¯káÝ ul>ÝŽ¼ù ΋âvi!œú #d¢‰|ç.Rœ¸¸pp8àâÂÁyà€‹ ÷äüëö–pN3îÕã- Cýqžok w8à”ãžœßÕw w8à”ãà1ËØptv¢/¥¦_Â/t^²wô”è‰$¼§Ù]ã<&_Uœçïo³‡ÃÒ9]ýsúwB·Þ|ý%óÌ/8_‰ƒó âBuþîÑù´¿ÞlVY—n¾ýçÝqp~‡Âù-ܳÎ'ý”¿…óÞ88¿C áüÎòÝ~Õ/ŽJš=çoCýA¯Äy\Ãkªw¸†çVU×ðö’‡Ã’ôOOþê<ÞÜÿ±–yn —ç‹Ñ¬Ñ¨<\T1Vç:šU÷{x©4µXxÕ1Dƒg—£ò`˜uðÌh°Îï`òÆçEqôÞÊó¼<-d6³ÏɹôšµR 7=/f­”§ŒÇ,S€üg¿äåI/Ó9Ï ú8êŸóÁä«ÿqÿÿÿì1Nã@†s"îä‚6ÚŽjE%‘XEF¢¢rä$be¶ ah¶¡ ¡Ù‚‚†‚"k“•0ëŒÉdòöÌ÷KHhˆøl>lìyóp^gZ¿EÑ` °Ö§¼ÔW'µÔ×ç¶ÔW.8¯Š3=åÊ.nÙ=myܵèŧ\Ò#ƒ“*é±Å¹•ôÈçUq8ó8¯œÇyœ_à¼2çqçõRçW¾ÁŽ¢¨ßؔҧ¼å¦ NjËM[œÛ–›rÁyUœi¿ä$IâX`ói[œòÖÚ28©­µmqn[kËçUq}¤šLØâ”[hÈà¤ZhXáÜZhÈçÁ ‡óàÀ……ÃypàÂÂá<8paáÞœß÷7Ê'\q­åw„òî:ïk”O¸šãÞœÿ¬?<ÒQ>ApàjŽÃypàÂÂá<8paáp¸°p8ï!n“ð2+Ò•« ..¹^‡ó⬠ÝËø”q†ªÁñ8ym&Ù¼B7eÎ{ˆ³.hw,×WÆv8:ŠnnYЮŒÃyqÖ×8nË£Œ3ìtrr:Ÿ7rãeÎ{ˆÃyœ¯Àἇ8œÇù Î{ˆÃyœ¯Àἇ8ëÆ2Žms”q†.=ÇÇÑ|ÞÈÆ2Ê8œ÷·I9—öx–¸É$o Wî7N×íÆ7'å†pÙI4´œ2ç=ÄmØ(Ö¥ ® î_çÖR§×Ÿ—kunÍÅæïáÿoüÚÜF±Ê8œ÷gzƒíG»{ÿÂ+ãV:ÿ|Þí´;ì«7»M{{;;³»g#Ûz™Èâ é)Wv__fË·ß]ËXâ²kov˽êï¯k:Ÿ}r…ó¿Nó«ú¶qr©•ó‹ÅŸY;Ÿµöìqñr{Øþ’®ü-H YÄyœ¯ÀïíÓƒÜúÝ^<ÚÛ=xÑ9,‰2‘ÅAœÇù œùÿù‡óåÔuFM½­M YÄyœ¯ÀU<Ã{>ÛÍgîðêQ瘄ÈDy†·Eœ\jèüâé¶×jíÝë‘X™Èâ`þò,އ¥L¦Æ·YÙÊŸÏ~‰à»ºM_žåïê.ãò«¾å»º­¿”K½œ¿KÏF³û§ßßv®uH.Ldq0“0I’ÓR¦S㪕ìGåÏg¿d-çm×äLsÜÆ‹d2Ü8MÊKz¦él"°H.µrþñ ¿5k·w:³fß×ç d"‹ƒÊ«S­×Þ+ûÏKáÜ–úÊ¥VÎ/îÓQ·Û]=èh™Èâ rŠuÍpxêòÈP·¤G.õrÞ§2‘ÅAœÇù Î{ˆÃyœ¯Àἇ8œÇù Î{ˆSÞ%ÒzÌ~å3<)œÛ–›rÁy©2‘ÅAåÝ ­÷ºŽã$QĹm­-œ—J YTîú°IO eœC ¹à¼T™HpàÖÄá<8paáp¸°p8\X¸7ç÷ýò ‚Wg\kù!$„¼»Îû宿¸7ç?ët”O¸šãp¸°p8\X8œ.,Î{ˆ«X‘~ñCu½½ÎPMÀzûup8ï!ÎTy6N“|ÇX­º:)œ¡j0I’8¦®îcÎ{ˆ3U˜]E7×zõóR8ÃîQõûÔÏŒû ÿÿì1oÚ@ÇùD|>¿@fæ¬l›§ˆ KNZUXêÔ¥Kt`€ŠfÉ’¥K† YÒç¤jl_@ðöÝÿ)RÑ#ÊïèË/˜»ó=8o ®è$™ÏÓ`1“;'‡ Wp Pž‡sr>ÆÁyqpÎkppÞ@œ‡óœ7çá¼ç Äuz¹žö3¹>6\¸‚.=ý~¿×C›qpÞ@\Q¹Ñ„«_]n¹x̃ƒ(ÛîŽ~fœ¯ÎÃy .ßùå÷ó´gþêeýý×öÃaoÃyÌámâ æðÖüf]­œ¯.]« ÃìbXÇãaÎj%é©ìÚ^øƒeñì¸=—ÓµºÌðhÌX«ÛŽç§Çç——û¯ÍWçŸeFvô°¤j’̉¢(»é%I’-»k…’Ém’ÝÃýÜi×ʾ›dÅí¿ˆ€ÙáјwùÃetþ5_?Î×ÚáRfdGK ©&…w§Jãd·úòEI_†ÝóVÛuÛ­V÷a%3¶#‡%…T“Âw¡Hãdoéá‹’:o@XRH5 çá¼ç ÄÁy8¯ÁÁyqpÎkppÞ@œð)‘Ò8Ù#7ùÎs…%…T“§AKãdÖæ 8Ï–RM w}8N°…_Ày®°¤À·#Μ]88pváàIF'{,_Ày®°¤jÎÃy Έƒóp^ƒƒóâà<œ×àŠ_=ÞÍï«Ú°J K ©&…;½HãdÛæðEÙœ_'­´Gå™/3 ¾°¤jr|3Ž~FÙ†p£ KG7iœl{<¾(›óÿÚλ“G™ñ…%…T“i_Úa¶ñ+©v3<~çVaœp\¾(ó/i_Újv¨Û K ©&‹V°‹úÏØ¡]'Üîž/Êåüj6Žã4ÚßdÄ–RMÍrÑ….½ïåHØõè’;ïƒ÷ÅŽÎKâè{è;sœÿ¤Yç=F’ÞŽS†|Q.ç)îºý¿4:s™ñ…%…T“pÎkpçÓÏóœ¯ ÎÃy Έƒóp^ƒƒóâ0‡·á<æð6q8ÏóUÄ¥‹gaèe"Šãñ0g5ëkuy¸x”.ž±¬Õ݆‹™·õõ¶V—ƒc¬Õi_%îY³›Lý&9ß ÿÈ ˆ/,)¤š¤_å(Š‚L$IBÚgw­œ£ÑA›drqô3™¶ &Ñçi°õ q£ öäèœöµZ½å·éŸÚ·åZf@|aI!ÕäÞ»S{½~ÞÕï›a¯¯û‹E ¶úÎzôöÞê®íWË©ï¶ÝŽ?}x’ kXRH5¹÷](ž0ËU„£·nºbÏs^ö–ž™GOá›öá™–RMÂy8¯ÁÁyqpÎkppÞ@œ‡óœ7·÷)‘——¹sxJyuÕÿý»GnÎ/¯òæðp&œ7·÷iÐaHOýðéÁ z½éõÔGk߆ôκþû ÿÿì¿Râ@Çy¢{ž€°¾ÚÖα³rl<2srW„Ö†H†?GaˆÖ÷WX\Caám¤M6övv?¿±`ô³™õc0ûç‹óâI}Ð21V BcD¦Å΃ççÁs ‡óàÀ¹…ÃypàÜÂmœ?·· _ 8pUÆÕÖ¯(Šr¡>Üçm-Ã\ÅqçËúã» _ 8pÇá<8pnáp8·p8œ[8œ·WxFºá ð긢« ˜oóvã ¯<3¼ÐMWtÕ`/§¬«Ãy«q…W˜^Юˆ+º;ÀMËdý<Î[+¼“ŒákqEwjzÝûäà¼Õ8œÇùÎ[ˆÃyœÏÁá¼…8œÇùÎ[ˆ+œôb8XFW4¥ç[Û_cƒóVãÆ£q8 Ó mñDžèÒsa¨+@N)¯n<ïL»¸„(ÎJã‹’¼ºtóD›É«³³éÈíƒIPl/H'±ŠßþQ?;(VØ’– ‚½’[ ŪçÒ&Ûé~þö5Nšº›jžhó>8}U]ç_WÇSéHGn”`ËáÚ‹ÂΟWÄé«J9¿º»8©7¯×g Ñ÷gw¿Í4KG9Ò‘ÛeO¹ÄÝä¾—vÞó~*äØs–Ë« Ý䮞–°é‰SYÿç_íé¼Iœ¾ª”óoo_Þ{ýôú²^«5šÏfš¥£éÈíƒ8ó98‰ó«ù‰èózs%^¿òÙþÈp8ó9¸\çÍ¿fš£³éÈíƒ8ó98‰ó/“úû}çÇ3¼ÿˆÓW•r~uwºþw¾Ö¸VfZ¤­éÈíƒÉX]¤ÇÞ¢X:x¦:VwÀà™ÊX|h±º8Æç-Ä QÃ0Lϱ‰c=srŠN’‰Üásr$S€âÉ Š˜“³‡óâd³S;¹¬ÀdØv;3î^qª¯¿ðÛߘ{»‡óâdÏðĽT|„ÎrÞì¢Ïë*<2”-éé.º^“56»q8o!çq>‡óâpçsp8o!çq>‡óâdãó··þÓS6¥lµ2Ÿá)n¹é?ú­öÀÜÃy q²Ý ïïÃ÷ô²7Ÿqêpœdkíp=öºÞÃy q9©Ãa5B&ôDhi±çÁs ‡óàÀ¹…ÃypàÜÂá<8pná6ΟÛ[†/¸*ãjëWE¹Pîó¶–á ®â¸óeýáÑ]†/¸Šãp8·p8œ[8œÎ-΃SÅåL€޲¦÷˜_&çÁ©âd Ýî'a²Amz߯@œb¡Îë*G:²DœlAûíƒÿ4ÏZ®?o‰S,hÇy]åHG–ˆ“m\óã¡»œemË3óÄ)6®Áy]åHG–ˆÃùãÂá<8UÎçÁ©âpþ¸p8N' –é<øËYVlάÝÉz†çl°Œa\Žó/“`~ì•oÎtd‰¸ñhNÃî¢ûé+žÈãñ&ƒôûÅq3@Î0Nêüó÷F­vùb¦9:Ë‘Ž,—Äàö¯é}úŠ¢hÔÏŠÁí÷Å©ôûÅÙ'£ÒðÕÙ‡ûÿÿì¿n£J‡óDy?_ µë´éVé\ËÍ^ËFÊ?E ¹Š„‚&6EÖ*ÉâmÒ¤H³Í.ܸp‘=Ø‘¢Ë ¾º30žßÑèèËŒg‡ïüêý&ý2x½‹~¸ÿÄI.w/ùéöÇu~qVûLÃaýôUqï5Id‰¸¼:6W¶–g7Í+:6’Ÿnÿpü~~>í¤I¨uþȹ"C“D–ˆƒójáøÎ/~u7cû…œÛ)24Id‰88¯Î'Šƒójá¶;ß nºƒ_j‹¯I"KÄaO-\ÎZÝêõx“‡Zç÷JÎ-š$²D\ºVçº&þÈŸ ykuÃ;:ÄžOÁZÜ–wrV‹ùBqßÓÐ$‘%âHTÏól&F£üwrF{>]ÎKÀáÝ[àDq4 7 ƒ«_\XIÂ{÷6éÓ!ö|ºÆöpp8Q\ÞÞå¥$¼ÿ±IL:„9<8_Th’Èqp^-œNçÕÂÁyàDqp^-œN—·>~nÍf¼o`Îztˆ=ëórpp8Q\EŽã´™½8æ}ë:vé{>]„.Uµ§Û?œN—Ö´ˆ¢G&Â0y5-Æt$dϧ‹ ¦…œ8½pp8àôÂÁyà€Ó çN/Ü—óßö7$? pÀUw°ÙB :Ä¿úù} ÉpÇ}9_Öž¢Cò\Åqp8àôÂÁyà€Ó çN/œN—¾o?Žï3-œ„ã Þ·¯Î'Š#áØi'íLF^ü€ÿ««Î'Š£.½5k±õäϧÖìÿ?_9œNGÎS¯Î:9µ“'|'§r88œ(Ϋ…ƒóÀ‰âà¼Z88œ(Ϋ…ƒóÀ‰âÈy#1Xç/¦Vò„:6•ÃÁyàDqá$ôbÏ~±3måÖ«óý€ºúLQ¯NÎ'ŠKëÒÞºf×Ì42{rǯKKÚÓ?ÓâØLà|á88œ(îÿÖŸïýøiñÖí[÷÷ÛŽã:¿×kuŠ“›àº±Þ:î nº'‡‡GîûRÎ-î*4Id‰¸¼:6W¶ý`šç»&ðy¿óÛp^ŽßÏ/ß®×Y;ùóñá6Ö[Á|ùܬwžåÜßC“D–ˆƒójáòÆö‹³zš¶¦œ¬ówØhž5¢¹œÛÛeh’Èqp^-\îïùyÔÜdîx4k›-WÎÍí64Id‰88¯nËÞûº‡o¼}|¼žÑÖõ›b¿ä7¡I"KÄaO-ܶyû×nýàtJ«÷ ó×§¡I"KÄ¥ku®k2áù~xwG]}¦}®Õ=™™?`­NnëZÝj¹\}n-+9w¶óÐ$‘%âÈyÏól&‚ íi„Ÿi¾ï¢àrjgÚ0òB8_<ëóÀ‰âhlo;¶·,«ßï³ûûÿô­‹}W×HŒGŒí‹ÇÁyàDqysxÔÕÓŸÝovMûÅfo'm8/çÅÁyµpp8QœW çÅÁyµpp8Q\Þú¼eY½^ÝßûÞ³~ræðZ³œ—€ƒóÀ‰â¢(r‡ývµçy®ë²ûÝ[׋=öÛØNìDc|ëºpœN—Ö´ˆ"¶FEòkW¤{'![ƒ„GM 88pzáàûþ¡Ú¼è¼ëò]èû,ç‹÷7ƒÇ§-ûpÌ…UlõU%aH"kÄÁùfáäÎ??í÷O?nŽ™x{ûKÏ1U†$²Fœoîìó|Øk¯ñƒÝþy³Ùé9¬*ÂDÖˆƒóÍÂÉß®Ç,tæ¿÷›Ûn«Çä?Ó„0$‘5âЇ×,œÔùÝ'ë% –Õ៛ü@oH"kÄÆêÂP{‹“8‹dcu³YÇâØ^x‡±:8ŒÕ§Šã¢BÄ96Ir~N›‹sxHNhç+ÇÁyàTqü†Üqñ^}2™–¥lîír4)$õçÒAýy 88œ*î\žçùe){Çféz…/:ß/ûp^Î§ŠƒóÍÂÁyàTqp¾Y88œ*Î7 çSÅŸ§ëµl ÌÕp,ëó×6œ×€ƒóÀ©âcAˆkWGÉsÙZ׋0bD\;È–b­ëÊqp8UÜ¡¦cb JišÊjZd”fT¬Á…GM 88pfáàAà€»d\ëï7aB¼8ÿ@ÿÿSÆë½£©°BIEND®B`‚golly-3.3-src/gui-common/Help/Algorithms/Larger_than_Life.html0000644000175000017500000002641713307733370021361 00000000000000 Golly Help: Larger than Life

Larger than Life (LtL) is a family of cellular automata rules that generalize John Conway's Game of Life to large neighborhoods and general birth and survival thresholds. The LtL rule notation used by Golly is identical to the one created by Mirek Wojtowicz for MCell:

Rr,Cc,Mm,Ssmin..smax,Bbmin..bmax,Nn

Rr - specifies the neighborhood range (r is from 1 to 500).
Cc - specifies the number of states (c is from 0 to 255).
Mm - specifies if the middle cell is included in the neighborhood count (m is 0 or 1).
Ssmin..smax - specifies the count limits for a state 1 cell to survive.
Bbmin..bmax - specifies the count limits for a dead cell to become a birth.
Nn - specifies the extended neighborhood type (n is M for Moore, N for von Neumann, and C is for circular).

These diagrams show the NM, NN and NC neighborhoods for r = 3 (the NC diagram also shows the circle used to determine which cells are within the circular neighborhood):

       

The S and B limits must be from 0 to the neighborhood size: (2r+1)^2 when n = M, or 2r(r+1)+1 when n = N, or approximately 3.14(r+0.5)^2 when n = C. The set of points in a circular neighborhood is those whose Euclidean distance from the center point is less than r+0.5. A quick way to see the circular neighborhood for a given r and n is to use a rule with only B1 set. For example, switch to R6,C0,M0,S1..1,B1..1,NC, turn on a single cell and hit the space bar.

If the number of states (specified after C) is greater than 2 then states 1 and above don't die immediately but gradually decay. Note that state values above 1 are not included in the neighborhood counts and thus play no part in deciding the survival of a state 1 cell, nor the birth of an empty cell. C0 and C1 are equivalent to C2.

 
Examples

The Patterns/Larger-than-Life folder contains a number of example patterns (mostly from the MCell collection). The following table shows a number of example rules along with their commonly used names:

R1,C0,M0,S2..3,B3..3,NM [Life] - the default rule for this algorithm.
R5,C0,M1,S34..58,B34..45,NM [Bosco's Rule] - (aka Bugs) a chaotic rule by Kellie Evans.
R10,C0,M1,S123..212,B123..170,NM [Bugsmovie] - a chaotic rule by David Griffeath.
R8,C0,M0,S163..223,B74..252,NM [Globe] - an expanding rule by Mirek Wojtowicz.
R1,C0,M1,S1..1,B1..1,NN [Gnarl] - an exploding rule by Kellie Evans.
R4,C0,M1,S41..81,B41..81,NM [Majority] - a stable rule by David Griffeath.
R7,C0,M1,S113..225,B113..225,NM [Majorly] - an expanding rule by David Griffeath.
R10,C255,M1,S2..3,B3..3,NM [ModernArt] - a chaotic rule by Charles A. Rockafellor.
R7,C0,M1,S100..200,B75..170,NM [Waffle] - an expanding rule by Kellie Evans.

 
Alternative rule notation

Golly also allows rules to be entered using the notation defined by Kellie Evans in her thesis [2]. The range, birth limits and survival limits are specified by five integers separated by commas:

r,bmin,bmax,smin,smax

This notation assumes an extended Moore neighborhood in which a live middle cell is included in the neighborhood count (ie. totalistic). For example, Life can be entered as 1,3,3,3,4.

Note that Golly's canonical version of a Larger than Life rule always uses the MCell syntax.

 
Grid topology and size limits

The Larger than Life algorithm supports both bounded and unbounded universes, but with certain restrictions. As in Golly's other algorithms, a bounded universe is specified by appending a suitable suffix to the rule, but the topology can only be a simple torus or a plane. For example, R5,C0,M1,S34..58,B34..45,NM:T500,40 creates a 500 by 40 torus using Bosco's Rule, and 1,3,3,3,4:P300,200 creates a 300 by 200 plane using Life. The maximum grid size is 100 million cells. The minimum width or height is twice the supplied range. Values less than that (including zero) are automatically increased to the minimum value.

If a given rule has no suffix then the universe is unbounded. Well, almost. Golly maintains an internal grid that is automatically resized as a pattern expands or shrinks. The size of this grid is limited to 100 million cells, and the cell coordinates of the grid edges must remain within the editing limits of +/- 1 billion. For the vast majority of patterns these limits won't ever be a problem.

One more restriction worth noting: B0 is not allowed in an unbounded universe.

 
History

Larger than Life was first imagined by David Griffeath in the early 1990s to explore whether Life might be a clue to a critical phase point in the threshold-range scaling limit [1]. The LtL family of rules includes Life as well as a rich set of two-dimensional rules, some of which exhibit dynamics vastly different from Life [2], [3]. Kellie Evans studied LtL in her 1996 thesis and discovered that a family of "Life-like" rules comprises a much larger subset of LtL parameter space than initially imagined [2], [4], [5].

In order to study LtL rules, David Griffeath and Bob Fisch developed WinCA, a cellular automata modeling environment for Windows. WinCA's editing capabilities were modest, but the software was able to implement LtL rules to range 200 and its speed increased together with the hardware on which it ran. In those early days of Windows, Griffeath's Primordial Soup Kitchen shared graphics and other discoveries via weekly "soup recipes" [6]. WinCA still runs on 32-bit Windows and allows for colorful LtL and other cellular automata images [10], [11]. Just before LtL was implemented in Golly, a virtual machine was used to run WinCA on 64-bit Windows and some new discoveries were made [12].

In 1999 Mirek Wojtowicz developed Mirek's Cellebration (MCell) [9], a cellular automata modeling environment for Windows, which was excellent for editing on the fly and working with small configurations for LtL rules up to range 10. Dean Hickerson used MCell to construct the first "bug gun" using the period 166 oscillator known as Bosco, which was discovered by Kellie Evans. This construction led to numerous other constructions and questions [7].

Golly is a game changer in the study of LtL: the first software with seemingly boundless possibilities that implements LtL in ranges up to 500 and the potential to discover LtL dynamics as yet unimagined.

 
References

[1] D. Griffeath. Self-organization of random cellular automata: Four snapshots, in "Probability and Phase Transitions", 1994. (G. Grimmett Ed.), Kluwer Academic, Dordrecht/Norwell, MA.

[2] K. Evans. "Larger than Life: it's so nonlinear", 1996. Ph.D. dissertation, University of Wisconsin- Madison.
http://www.csun.edu/~kme52026/thesis.html

[3] J. Gravner and D. Griffeath. Cellular automaton growth on Z2: theorems, examples, and problems, 1998. Advances in App. Math 21, 241-304.
http://psoup.math.wisc.edu/extras/r1shapes/r1shapes.html

[4] K. Evans. Larger than Life: digital creatures in a family of two-dimensional cellular automata, 2001. Discrete Mathematics and Theoretical Computer Science, Volume AA, 2001, 177-192
http://dmtcs.loria.fr/proceedings/html/dmAA0113.abs.html

[5] K. Evans, Threshold-range scaling of Life's coherent structures, Physica D 183 (2003), 45-67.

[6] D. Griffeath. Primordial Soup Kitchen.
http://psoup.math.wisc.edu/kitchen.html

[7] K. Evans, Is Bosco's rule universal?, in "Lecture Notes in Computer Science," Vol. 3354, ed. Maurice Margenstern. Springer-Verlag GmbH (2005), 188–199. WWW companion page to paper
http://www.csun.edu/~kme52026/bosco/bosco.html

[8] K. Evans. Replicators and Larger than Life examples, 2002. In "New Constructions in Cellular Automata", eds. David Griffeath and Cris Moore. Oxford University Press.

[9] MCell rules lexicon for Larger than Life:
http://www.mirekw.com/ca/rullex_lgtl.html

[10] D. Griffeath. Self-organizing two-dimensional cellular automata: 10 still frames. In "Designing Beauty: the Art of Cellular Automata," eds. Andrew Adamatzky and Genaro Martinez. Springer (2016) 1-12.

[11] K. Evans. Larger than Life. In "Designing Beauty: the Art of Cellular Automata," eds. Andrew Adamatzky and Genaro Martinez. Springer (2016) 27-34.

[12] A. Tantoushian. "Scaling Larger than Life Bugs: to range 25 and beyond", 2017 Master's thesis, California State University, Northridge.
http://scholarworks.csun.edu/handle/10211.3/192639 golly-3.3-src/gui-common/Help/Algorithms/NN.png0000644000175000017500000000565613307733370016331 00000000000000‰PNG  IHDRGGÚÒÍH ViCCPICCProfilexœµ—PYÇ_wO¤!HrÎ’%Ç!’AT††0CRÄÌ¢+Šˆ˜Ð•¤àªÄ5 ¢ˆ²*˜]EA9w `@å9p¯î¶®®êî_õuÿꫯ¿÷ú½~Uÿ€r–%$Á$óÓ„ž.ŒðˆH~@@À,vªÀ9 Àü¥¦ÑjT· g{ýuÝ¿•$'6• €r '•ŒòY”El0 øÊ}™i”4€´ ÊÛg™;dz3ǧ¾Õº¢Ü Âb ¹ûÐ<#ƒÍE{E(›ð9<>Êìxåh” ’“WÏrÊ:1êÃý§ž1 =Y,îϽË7Üx©‚$ÖÚÿr9þ³’“ÒçÇBƒÂOZ:»74Æ8,7Ÿy$,äcù!AóÌYê?ÏqBÀ…ú4—?q@ðvº0c.‡™½` ˆi ”:ІÀ X;àÜ7ðÁ ¬l’d‚l°ä‚|° ìeà8 ªÁIp4ƒsภn€>0‚!0 ^˜Óá!*Dƒä!HÒ‡Ì kÈr‡|¡@(І¸J‡²¡­P>T•AG èg¨ºuCýÐ}h‡Þ@Ÿ`¦ÀÒ°¬ÃÖ°3ìÃ+`.œgÁ9ðN¸®„OÀMð%ø<Á/áI d„ލ"†ˆ5âŠø#‘H"D6 yH R‰Ô#mHrB&††a` 1v/L†IÁlÀ`Ê0Õ˜&L'æ6f#Â|ÅR±ŠX}¬-–‰ Çr±™Ø\l ö8¶{;€ÅNáp8:Ng…óÂEàpëp¸¸\;®7‚›Äãñòx}¼=Þϧásñûñ'ðñ·ð£ø2A…`Fð Dø„-„B-ááá9aš(AÔ$Úý‰âZb!ñ±x“8Jœ&I’´Iö¤`Ri3©”TOºBzDzK&“ÕÈ6äedy¹”|Š|¶(öyœ}\QÜמ»‡;ï_?Áså•ñ^'x%JxŸèŸX•8“–ÔLHŽNnåKñù«•W¯YÝ/Ðä †RlSö¦ˆ„>Âã©PêŠÔ–4iÔÈô¤ë¤ÿ>œáQžñ!34óÌÉ5ü5=kõÖîXû<Ë#ë§u˜uìuÙªÙ›³‡×;¯?²Ú³¡c£úÆœ£›<7Uo&mNÜüë“-E[Þm ÛÚ–£”³)gäÏêrÅr…¹w·Ùm;´³·½w‡ùŽý;¾æqò®ç›ä—ä.`\ÿÑôÇÒgvÆíì-´,<¸ ·‹¿kp·ãîê"É¢¬¢‘=~{šŠÅyÅïö®ÚÛ]²¸äÐ>Ò¾ô}C¥¾¥-û5öïÚÿ¹,¾l Ü¥¼¡B±bGÅûœ·:¬?¤t(ÿЧüÃ÷ŽxiªÔª,9Š;šqôÙ±Ðc]?YÿTs\áxþñ/Uüª¡êÀêΫššZÅÚÂ:¸.½nüDÔ‰¾“n'[ê ë4ÐòOSé§^üýóàiŸÓg¬ÏÔŸÕ<[ÑHkÌk‚šÖ6‰šã›‡Z"Zú[½[;ÚìÚ1ú¥êœê¹òó2ç /.ä\˜¹˜uq²]Ð>q‰{i¤cUÇÃËá—ït.ëì½âsåÚU«—»œ».^³¿v®Û¶»õºõõæ–7šz,zµøµ±×²·é¦ÕÍ–>›¾¶þ%ýn9ÞºtÛíöÕ;Ì;7–ô† Þ»uwèçÞØý¤û¯d<˜~¸éöQÞc‰Ç%OŸTþ¦û[ÃåÐùa·áž§AOްG^þžúûçÑœgÔg%ÏUž×Œ™÷ï{±üÅèKÁËé‰Ü¿Iþ­â•Ϋ³8ýÑ# ¾¾žySðVþmÕ»Åï:&&ŸL%OM¿Ïû ÿ¡ú£õÇ®OaŸžOg~Æ.ý¢û¥í«Ï×G3É33–õÍ hÀqq¼©€zÔŸ’Äæüï7Asžý¿â9üM–T9² _Ô£DCe zŸµÁN67_ˆ(5ÎÜl®EˆZ“33o•À·ðE833}`fæ êï‘û´§ÌùîYáп‘ÃøYêÖVþÿôwq䊸=Q pHYs  šœtRNSÿýÙæÑJî!tEXtSoftwareGraphicConverter (Intel)w‡ú¿IDATxœìÖAƒ0 @òÿõ }LÕ½!³Š³ÊÍgâ‹—ïç:ËaZkÁÖ¹_o÷ÞUéãXŠæ’ª?J•ŠŠŠŠŠêÙªÜöPI×ÜQe§›$Õ-Tóe5/Ñ}í'Ú—ê|•êʾTç«TWö¥:_¦š/›jÎ=ŠŠŠŠŠêþªÑ{ÂÿTU#'Y¸ÕôªÛCPUd¬5ÕÃUÑíáøüÿÿð2WžÐœ7IEND®B`‚golly-3.3-src/gui-common/Help/Algorithms/NM.png0000644000175000017500000000572313307733370016323 00000000000000‰PNG  IHDRGGÚÒÍH ViCCPICCProfilexœµ—PYÇ_wO¤!HrÎ’%Ç!’AT††0CRÄÌ¢+Šˆ˜Ð•¤àªÄ5 ¢ˆ²*˜]EA9w `@å9p¯î¶®®êî_õuÿꫯ¿÷ú½~Uÿ€r–%$Á$óÓ„ž.ŒðˆH~@@À,vªÀ9 Àü¥¦ÑjT· g{ýuÝ¿•$'6• €r '•ŒòY”El0 øÊ}™i”4€´ ÊÛg™;dz3ǧ¾Õº¢Ü Âb ¹ûÐ<#ƒÍE{E(›ð9<>Êìxåh” ’“WÏrÊ:1êÃý§ž1 =Y,îϽË7Üx©‚$ÖÚÿr9þ³’“ÒçÇBƒÂOZ:»74Æ8,7Ÿy$,äcù!AóÌYê?ÏqBÀ…ú4—?q@ðvº0c.‡™½` ˆi ”:ІÀ X;àÜ7ðÁ ¬l’d‚l°ä‚|° ìeà8 ªÁIp4ƒsภn€>0‚!0 ^˜Óá!*Dƒä!HÒ‡Ì kÈr‡|¡@(І¸J‡²¡­P>T•AG èg¨ºuCýÐ}h‡Þ@Ÿ`¦ÀÒ°¬ÃÖ°3ìÃ+`.œgÁ9ðN¸®„OÀMð%ø<Á/áI d„ލ"†ˆ5âŠø#‘H"D6 yH R‰Ô#mHrB&††a` 1v/L†IÁlÀ`Ê0Õ˜&L'æ6f#Â|ÅR±ŠX}¬-–‰ Çr±™Ø\l ö8¶{;€ÅNáp8:Ng…óÂEàpëp¸¸\;®7‚›Äãñòx}¼=Þϧásñûñ'ðñ·ð£ø2A…`Fð Dø„-„B-ááá9aš(AÔ$Úý‰âZb!ñ±x“8Jœ&I’´Iö¤`Ri3©”TOºBzDzK&“ÕÈ6äedy¹”|Š|¶(öyœ}\QÜמ»‡;ï_?Áså•ñ^'x%JxŸèŸX•8“–ÔLHŽNnåKñù«•W¯YÝ/Ðä †RlSö¦ˆ„>Âã©PêŠÔ–4iÔÈô¤ë¤ÿ>œáQžñ!34óÌÉ5ü5=kõÖîXû<Ë#ë§u˜uìuÙªÙ›³‡×;¯?²Ú³¡c£úÆœ£›<7Uo&mNÜüë“-E[Þm ÛÚ–£”³)gäÏêrÅr…¹w·Ùm;´³·½w‡ùŽý;¾æqò®ç›ä—ä.`\ÿÑôÇÒgvÆíì-´,<¸ ·‹¿kp·ãîê"É¢¬¢‘=~{šŠÅyÅïö®ÚÛ]²¸äÐ>Ò¾ô}C¥¾¥-û5öïÚÿ¹,¾l Ü¥¼¡B±bGÅûœ·:¬?¤t(ÿЧüÃ÷ŽxiªÔª,9Š;šqôÙ±Ðc]?YÿTs\áxþñ/Uüª¡êÀêΫššZÅÚÂ:¸.½nüDÔ‰¾“n'[ê ë4ÐòOSé§^üýóàiŸÓg¬ÏÔŸÕ<[ÑHkÌk‚šÖ6‰šã›‡Z"Zú[½[;ÚìÚ1ú¥êœê¹òó2ç /.ä\˜¹˜uq²]Ð>q‰{i¤cUÇÃËá—ït.ëì½âsåÚU«—»œ».^³¿v®Û¶»õºõõæ–7šz,zµøµ±×²·é¦ÕÍ–>›¾¶þ%ýn9ÞºtÛíöÕ;Ì;7–ô† Þ»uwèçÞØý¤û¯d<˜~¸éöQÞc‰Ç%OŸTþ¦û[ÃåÐùa·áž§AOްG^þžúûçÑœgÔg%ÏUž×Œ™÷ï{±üÅèKÁËé‰Ü¿Iþ­â•Ϋ³8ýÑ# ¾¾žySðVþmÕ»Åï:&&ŸL%OM¿Ïû ÿ¡ú£õÇ®OaŸžOg~Æ.ý¢û¥í«Ï×G3É33–õÍ hÀqq¼©€zÔŸ’Äæüï7Asžý¿â9üM–T9² _Ô£DCe zŸµÁN67_ˆ(5ÎÜl®EˆZ“33o•À·ðE833}`fæ êï‘û´§ÌùîYáп‘ÃøYêÖVþÿôwq䊸=Q pHYs  šœtRNSÿýÙæÑJî!tEXtSoftwareGraphicConverter (Intel)w‡úäIDATxœì–A Ã@ ³ÿÿXÕ¦wea±­3ºä048 \׸¬µþïsÞ¢w³ÅÊH±+#ÅJP¬Œ4ÁjXFߪ¨V¢Y„be¤X Š•‘b%hæ¨7Éè[5ÃJ4‹P¬Œ+A±2R¬Íõ&)¿Õç9ûw[XõÞS¬Î)Vg½÷«sŠÕYï=Íõ&ýXÔ +Ñ,B±2R¬ÅÊH±4sÔ›dô­Šša%šE(VFŠ• X)V‚fŽz“Œ¾UQ3¬D³ÅÊH±+#ÅJÐÌQo’ÛêÿÿCˆ%JV­gIEND®B`‚golly-3.3-src/gui-common/Help/Algorithms/QuickLife.html0000644000175000017500000002701413230774246020044 00000000000000 Golly Help: QuickLife

QuickLife is a fast, conventional (non-hashing) algorithm for exploring Life and other 2D outer-totalistic rules. Such rules are defined using "B0...8/S0...8" notation, where the digits after B specify the counts of live neighbors necessary for a cell to be born in the next generation, and the digits after S specify the counts of live neighbors necessary for a cell to survive to the next generation. Here are some example rules:

B3/S23 [Life]
John Conway's rule is by far the best known and most explored CA.

B36/S23 [HighLife]
Very similar to Conway's Life but with an interesting replicator.

B3678/S34678 [Day & Night]
Dead cells in a sea of live cells behave the same as live cells in a sea of dead cells.

B35678/S5678 [Diamoeba]
Creates diamond-shaped blobs with unpredictable behavior.

B2/S [Seeds]
Every living cell dies every generation, but most patterns still explode.

B234/S [Serviettes or Persian Rug]
A single 2x2 block turns into a set of Persian rugs.

B345/S5 [LongLife]
Oscillators with extremely long periods can occur quite naturally.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 4. For example, try B13/S012V or B2/S013V.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

QuickLife can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 6. Here's an example:
x = 7, y = 6, rule = B245/S3H
obo$4bo$2bo$bo2bobo$3bo$5bo!
Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons when in icon mode.

 
Non-totalistic rules

All of the above rules are classified as "totalistic" because the outcome depends only on the total number of neighbors. Golly also supports non-totalistic rules for Moore neighborhoods — such rules depend on the configuration of the neighbors, not just their counts.

The syntax used to specify a non-totalistic rule is based on a notation developed by Alan Hensel. It's very similar to the above "B.../S..." notation but uses various lowercase letters to represent unique neighborhoods. One or more of these letters can appear after an appropriate digit (which must be from 1 to 7, depending on the letters). The usual counts of 0 and 8 can still be used without letters since there is no way to constrain 0 or 8 neighbors.

For example, B3/2a34 means birth on 3 neighbors and survival on 2 adjacent neighbors (a corner and an edge), or 3 or 4 neighbors.

Letter strings can get quite long, so it's possible to specify their inverse using a "-" between the digit and the letters. For example, B2cekin/S12 is equivalent to B2-a/S12 and means birth on 2 non-adjacent neighbors, and survival on 1 or 2 neighbors. (This is David Bell's "Just Friends" rule.)

The following table shows which letters correspond to which neighborhoods. The central cell in each neighborhood is colored red, corner neighbors are green, edge neighbors are yellow and ignored neighbors are black:

The table makes it clear which digits are allowed before which letters. For example, B1a/S and B5z/S are both invalid rules.

Golly uses the following steps to convert a given non-totalistic rule into its canonical version:

  1. An underscore can be used instead of a slash, but the canonical version always uses a slash.
  2. The lowercase letters are listed in alphabetical order. For example, B2nic/S will become B2cin/S.
  3. A given rule is converted to its shortest equivalent version. For example, B2ceikn/S will become B2-a/S. If equivalent rules have the same length then the version without the minus sign is preferred. For example, B4-qjrtwz/S will become B4aceikny/S.
  4. It's possible for a non-totalistic rule to be converted to a totalistic rule. If you supply all the letters for a specific neighbor count then the canonical version removes the letters. For example, B2aceikn3/S will become B23/S. (Note that B2-3/S is equivalent to B2aceikn3/S so will also become B23/S.)
  5. If you supply a minus sign and all the letters for a specific neighbor count then the letters and the neighbor count are removed. For example, B2-aceikn3/S will become B3/S.

 
MAP rules

The totalistic and non-totalistic rules above are only a small subset of all possible rules for a 2-state Moore neighborhood. The Moore neighborhood has 9 cells which gives 512 (2^9) possible combinations of cells. For each of these combinations you define whether the output cell is dead or alive, giving a string of 512 digits, each being 0 (dead) or 1 (alive).

   0 1 2
   3 4 5  ->  4'
   6 7 8
The first few entries for Conway's Life (B3/S23) in this format are as follows:
   Cell 0 1 2 3 4 5 6 7 8  ->  4'
   0    0 0 0 0 0 0 0 0 0  ->  0
   1    0 0 0 0 0 0 0 0 1  ->  0
   2    0 0 0 0 0 0 0 1 0  ->  0
   3    0 0 0 0 0 0 0 1 1  ->  0
   4    0 0 0 0 0 0 1 0 0  ->  0
   5    0 0 0 0 0 0 1 0 1  ->  0
   6    0 0 0 0 0 0 1 1 0  ->  0
   7    0 0 0 0 0 0 1 1 1  ->  1   B3
   8    0 0 0 0 0 1 0 0 0  ->  0
   9    0 0 0 0 0 1 0 0 1  ->  0
   10   0 0 0 0 0 1 0 1 0  ->  0
   11   0 0 0 0 0 1 0 1 1  ->  1   B3
   ...
   19   0 0 0 0 1 0 0 1 1  ->  1   S2
   ...
   511  1 1 1 1 1 1 1 1 1  ->  0
This creates a string of 512 binary digits:
   00000001000100000001...0
This binary string is then base64 encoded for brevity giving a string of 86 characters:
   ARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
By prefixing this string with "MAP" the syntax of the rule becomes:
   rule = MAP<base64_string>
So, Conway's Life (B3/S23) encoded as a MAP rule is:
   rule = MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
Given each MAP rule has 512 bits this leads to 2^512 (roughly 1.34x10^154) unique rules. Totalistic rules are a subset of isotropic non-totalistic rules which are a subset of MAP rules.

MAP rules can also be specified for Hexagonal and von Neumann neighborhoods.

Hexagonal neighborhoods have 7 cells (center plus 6 neighbors) which gives 128 (2^7) possible combinations of cells. These encode into 22 base64 characters.

Von Neumann neighborhoods have 5 cells (center plus 4 neighbors) which gives 32 (2^5) possible combinations of cells. These encode into 6 base64 characters.

 
Emulating B0 rules

Rules containing B0 are tricky to handle in an unbounded universe because every dead cell becomes alive in the next generation. If the rule doesn't contain Smax (where max is the number of neighbors in the neighborhood: 8 for Moore, 6 for Hexagonal or 4 for Von Neumann) then the "background" cells alternate from all-alive to all-dead, creating a nasty strobing effect. To avoid these problems, Golly emulates rules with B0 in the following way:

A totalistic rule containing B0 and Smax is converted into an equivalent rule (without B0) by inverting the neighbor counts, then using S(max-x) for the B counts and B(max-x) for the S counts. For example, B0123478/S01234678 (AntiLife) is changed to B3/S23 (Life) via these steps: B0123478/S01234678 -> B56/S5 -> B3/S23.

A non-totalistic rule is converted in a similar way. The isotropic letters are inverted and then S(max-x)(letters) is used for B counts and B(max-x)(letters) is used for the S counts. The 4 neighbor letters are swapped using the following table:

   4c -> 4e
   4e -> 4c
   4k -> 4k
   4a -> 4a
   4i -> 4t
   4n -> 4r
   4y -> 4j
   4q -> 4w
   4j -> 4y
   4r -> 4n
   4t -> 4i
   4w -> 4q
   4z -> 4z
A totalistic rule containing B0 but not Smax is converted into a pair of rules (both without B0): one is used for the even generations and the other for the odd generations. The rule for even generations uses inverted neighbor counts. The rule for odd generations uses S(max-x) for the B counts and B(max-x) for the S counts. For example, B03/S23 becomes B1245678/S0145678 (even) and B56/S58 (odd).

A non-totalistic rule is converted in a similar way. For even generations invert both B(x)(letter) and S(x)(letter). For odd generations except 4-neighbor letters, use B(x)(letter) if and only if the original rule has S(max-x)(letter) and use S(x)(letter) if and only if the original rule has B(max-x)(letter). For 4-neighbor isotropic letters use the table above. For example, B0124-k/S1c25 becomes B34k5678/S01-c34678 (even) and B367c/S4-k678 (odd).

For a MAP rule B0 is equivalent to the first bit being 0. Smax is equivalent to the 511th bit being 1. For B0 with Smax the rule is converted to NOT(REVERSE(bits)). For B0 with Smax the even rule is NOT(bits) and the odd rule is REVERSE(bits).

In all cases, the replacement rule(s) generate patterns that are equivalent to the requested rule. However, you need to be careful when editing an emulated pattern in a rule that contains B0 but not Smax. If you do a cut or copy then you should only paste into a generation with the same parity.

 
Wolfram's elementary rules

QuickLife supports Stephen Wolfram's elementary 1D rules. These rules are specified as "Wn" where n is an even number from 0 to 254. For example:

W22
A single live cell creates a beautiful fractal pattern.

W30
Highly chaotic and an excellent random number generator.

W110
Matthew Cook proved that this rule is capable of universal computation.

The binary representation of a particular number specifies the cell states resulting from each of the 8 possible combinations of a cell and its left and right neighbors, where 1 is a live cell and 0 is a dead cell. Here are the state transitions for W30:

   111  110  101  100  011  010  001  000
    |    |    |    |    |    |    |    | 
    0    0    0    1    1    1    1    0  = 30 (2^4 + 2^3 + 2^2 + 2^1)
Note that odd-numbered rules have the same problem as B0 rules. Golly currently makes no attempt to emulate such rules, and they are not supported. golly-3.3-src/gui-common/Help/Algorithms/RuleLoader.html0000644000175000017500000003176413151213347020225 00000000000000 Golly Help: RuleLoader

The RuleLoader algorithm allows rules to be specified in external files. Given the rule string "Foo", RuleLoader will search for a file called Foo.rule. The format of a .rule file is described here. A number of examples can be found in the Rules folder:

B3/S23 or Life
Conway's Life. This is the default rule for the RuleLoader algorithm and is built in (there is no corresponding .rule file).

Banks-I, Banks-II, Banks-III, Banks-IV
In 1971, Edwin Roger Banks (a student of Ed Fredkin) made simpler versions of Codd's 1968 CA, using only two states in some cases. These four rules are found in his PhD thesis. To see the rules in action, open Banks-I-demo.rle and the other examples in Patterns/Self-Rep/Banks/.

BBM-Margolus-emulated
Ed Fredkin's Billiard Ball Model, using the Margolus neighborhood to implement a simple reversible physics of bouncing balls. In this implementation we are emulating the system using a Moore-neighborhood CA with extra states. Open BBM.rle to see the rule in action.

BriansBrain
An alternative implementation of the Generations rule /2/3.

Byl-Loop
A six state 5-neighborhood CA that supports small self-replicating loops. To see the rule in action, open Byl-Loop.rle.

Caterpillars
An alternative implementation of the Generations rule 124567/378/4.

Chou-Reggia-1 and Chou-Reggia-2
Two 5-neighborhood CA that supports tiny self-replicating loops. To see the rules in action, open Chou-Reggia-Loop-1.rle and Chou-Reggia-Loop-2.rle.

Codd
In 1968, Edgar F. Codd (who would later invent the relational database) made a simpler version of von Neumann's 29-state CA, using just 8 states. To see the rule in action, open repeater-emitter-demo.rle and the other examples in Patterns/Self-Rep/Codd/.

Codd2
A very minor extension of Codd's transition table, to allow for some sheathing cases that were found with large patterns. See sheathing-problems.rle for a demonstration of the problem cases.

CrittersMargolus_emulated
The Critters rule is reversible and has Life-like gliders. See CrittersCircle.rle.

Devore
In 1973, John Devore altered Codd's transition table to allow for simple diodes and triodes, enabling him to make a much smaller replicator than Codd's. See Devore-rep.rle and the other examples in Patterns/Self-Rep/Devore/.

DLA-Margolus-emulated
Diffusion-limited aggregation (DLA) is where moving particles can become stuck, forming a distinctive fractal pattern seen in several different natural physical systems. See DLA.rle.

Ed-rep
A version of Fredkin's parity rule, for 7 states. See Ed-rep.rle for an image of Ed Fredkin that photocopies itself.

Evoloop and Evoloop-finite
An extension of the SDSR Loop, designed to allow evolution through collisions. To see the rule in action, open Evoloop-finite.rle.

HPP
The HPP lattice gas. A simple model of gas particles moving at right angles at a fixed speed turns out to give an accurate model of fluid dynamics on a larger scale. Though the later FHP gas improved on the HPP gas by using a hexagonal lattice for more realistic results, the HPP gas is where things began. Open HPP-demo.rle.

Langtons-Ant
Chris Langton's other famous CA. An ant walks around on a binary landscape, collecting and depositing pheremones. See Langtons-Ant.rle.

Langtons-Loops
The original loop. Chris Langton adapted Codd's 1968 CA to support a simple form of self-replication based on a circulating loop of instructions. To see the rule in action, open Langtons-Loops.rle.

LifeHistory
A 7-state extension of the HistoricalLife rule from MCell, allowing for on and off marked cells (states 3 and 4) as well as the history envelope (state 2). State 3 is useful for labels and other identifying marks, since an active pattern can touch or even cross it without being affected. State 5 is an alternate marked ON state most often used to mark a 'starting' location; once a cell changes to state 2, it can not return to this start state. State 6 cells kill any adjacent live cells; they are intended to be used as boundaries between subpatterns, e.g. in an active stamp collection where flying debris from one subpattern might adversely affect another subpattern. See h-to-h-collection-26Aug2017.zip for an example using all of LifeHistory's extra states.

LifeOnTheEdge
A CA proposed by Franklin T. Adams-Watters in which all the action occurs on the edges of a square grid. Each edge can be on or off and has six neighbors, three at each end. An edge is on in the next generation iff exactly two of the edges in its seven edge neighborhood (including the edge itself) are on. This implementation has 3 live states with suitable icons that allow any pattern of edges to be created. Open life-on-the-edge.rle.

LifeOnTheSlope
The same behavior as LifeOnTheEdge but patterns are rotated by 45 degrees. This implementation has only 2 live states (with icons \ and /), so it's a lot easier to enter patterns and they run faster. Open life-on-the-slope.rle.

Perrier
Perrier extended Langton's Loops to allow for universal computation. See Perrier-Loop.rle.

Sand-Margolus-emulated
MCell's Sand rule is a simple simulation of falling sand particles. See Sand.rle.

SDSR-Loop
An extension of Langton's Loops, designed to cause dead loops to disappear, allowing other loops to replicate further. To see the rule in action, open SDSR-Loop.rle.

StarWars
An alternative implementation of the Generations rule 345/2/4.

Tempesti
A programmable loop that can construct shapes inside itself after replication. To see the rule in action, open Tempesti-Loop.rle. This loop prints the letters 'LSL' inside each copy — the initials of Tempesti's university group.

TMGasMargolus_emulated
A different version of the HPP gas, implemented in the Margolus neighborhood, see TMGas.rle.

TripATronMargolus_emulated
The Trip-A-Tron rule in the Margolus neighborhood. See TripATron.rle.

WireWorld
A 4-state CA created by Brian Silverman. WireWorld models the flow of currents in wires and makes it relatively easy to build logic gates and other digital circuits. Open primes.mc and the other examples in Patterns/WireWorld/.

Worm-1040512, Worm-1042015, Worm-1042020, Worm-1252121, Worm-1525115
Examples of Paterson's Worms, a simulation created by Mike Paterson in which a worm travels around a triangular grid according to certain rules. There's also a rule called Worm-complement which can be used to show the uneaten edges within a solid region. Open worm-1040512.rle and the other examples in Patterns/Patersons-Worms/.

References:

Banks-I, Banks-II, Banks-III, Banks-IV (1971)
E. R. Banks. "Information Processing and Transmission in Cellular Automata" PhD Thesis, MIT, 1971.

Byl-Loop (1989)
J. Byl. "Self-Reproduction in small cellular automata." Physica D, Vol. 34, pages 295-299, 1989.

Chou-Reggia-1 and Chou-Reggia-2 (1993)
J. A. Reggia, S. L. Armentrout, H.-H. Chou, and Y. Peng. "Simple systems that exhibit self-directed replication." Science, Vol. 259, pages 1282-1287, February 1993.

Codd (1968)
E. F. Codd, "Cellular Automata" Academic Press, New York, 1968.

Devore (1973)
Devore, J. and Hightower, R. (1992) "The Devore variation of the Codd self-replicating computer" Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260.

Evoloop (1999)
Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999.

HPP (1973)
J. Hardy, O. de Pazzis, and Y. Pomeau. J. Math. Phys. 14, 470, 1973.

Langtons-Ant (1986)
C. G. Langton. "Studying artificial life with cellular automata" Physica D 2(1-3):120-149, 1986.

Langtons-Loops (1984)
C. G. Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984.

Paterson's Worms (1973)
See these sites for a good description and the latest results:
http://www.maa.org/editorial/mathgames/mathgames_10_24_03.html
http://wso.williams.edu/~Ebchaffin/patersons_worms/
http://tomas.rokicki.com/worms.html

Perrier (1996)
J.-Y. Perrier, M. Sipper, and J. Zahnd. "Toward a viable, self-reproducing universal computer" Physica D 97: 335-352. 1996

SDSR-Loop (1998)
Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press.

Tempesti (1995)
G. Tempesti. "A New Self-Reproducing Cellular Automaton Capable of Construction and Computation". Advances in Artificial Life, Proc. 3rd European Conference on Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563.

WireWorld (1987)
A. K. Dewdney, Computer Recreations. Scientific American 282:136-139, 1990. golly-3.3-src/gui-common/Help/Algorithms/JvN.html0000644000175000017500000000503613151213347016655 00000000000000 Golly Help: JvN

John von Neumann created the very first cellular automata in the 1940's, together with fellow mathematician Stanislaw Ulam. The JvN algorithm supports 3 rules:

JvN29
The original 29-state CA as created by von Neumann. To see how his rules work, load the simpler examples first: counter-demo.rle and cell-coders-demo.rle and read their pattern info (hit the 'i' button). For a more complex example, see read-arm-demo.rle which shows one component of von Neumann's original design, the tape reader. For a complete self-replicating machine within von Neumann's CA, open sphinx.mc.gz.

Nobili32
An extension of JvN29 created by Renato Nobili in 1994. This rule adds three new states to allow signal crossing, allowing self-replicating machines to be greatly reduced in size. The example pattern construction-arm-demo.rle shows some of the crossing cells in action under this rule. The pattern NP-replicator.rle.gz shows the 1994 design that was the first implementation of von Neumann's vision of a self-reproducing universal constructor in a CA.

Hutton32
Created by Tim Hutton in 2008, this rule uses the same states as Nobili32 but has a slightly modified rule table. Examples golly-constructor.rle and Hutton-replicator.rle show what it can do.

References:

http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor
http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata
http://www.pd.infn.it/~rnobili/wjvn/index.htm
http://www.pd.infn.it/~rnobili/au_cell/
http://www.sq3.org.uk/Evolution/JvN/

golly-3.3-src/gui-common/Help/changes-android.html0000644000175000017500000000501013441044674017074 00000000000000

Changes

Changes in version 1.2 (released October 2018)

  • Golly has a new algorithm that supports the Larger than Life family of rules.
  • HashLife and the other hash-based algorithms are faster and more responsive.
  • Added support for MAP rules to QuickLife, HashLife and Generations.
  • QuickLife and HashLife now support non-totalistic rules. A number of interesting examples can be found in the new Patterns/Non-Totalistic folder.
  • The Generations algorithm now supports Hex, Von Neumann and non-totalistic Moore neighborhoods.
  • Updated the Life Lexicon to release 27.
  • The Banks, Codd, Devore, and JvN folders have moved into a new top-level "Self-Rep" folder, to emphasize their common focus on self-replication.
  • Icon rendering is faster in most cases.
  • Correct colors/icons are now displayed when pasting a pattern with a rule different to the current layer's rule.
  • Fixed link to Rule Table Repository in Help > Online Archives.
  • Fixed paste bug that prevented rule from being changed even if universe was empty.
  • Fixed crashes on some Nexus devices.
  • Fixed problem with Move button becoming enabled after a multi-finger pan/zoom.
  • Fixed an undo/reset bug that could occur if there was a rule change at the starting generation.
  • Fixed a bug where patterns larger than bounded grids were not correctly clipped.
  • Fixed a bug that could crash Golly if a .rule file contained invalid XPM data.
  • Updated the Life Lexicon to release 29.

Changes in version 1.1 (released June 2015)

  • Fixed some bugs that could cause Golly to crash.
  • Fixed bug in QuickLife algorithm that could cause cells at the bottom/left edges of the viewport to disappear every odd generation.
  • Fixed bug in QuickLife algorithm that could cause the selection rectangle to appear offset by one pixel.
  • Fixed bug that could cause Undo button to fail due to a temporary macrocell file containing comment lines not prefixed with #C.
  • Fixed minor problem with the Fit button not centering a pattern accurately in some cases.
  • The size of text in the Open screen has been increased.

Version 1.0 released November 2013

golly-3.3-src/gui-common/Help/open-ios.html0000644000175000017500000000402312250742663015602 00000000000000

Open Tab

The Open tab lets you select a pattern to load from a number of different sources:

  • The large collection of patterns supplied with the app.
  • The most recently opened patterns (from newest to oldest).
  • Patterns you have saved (stored in Documents/Saved/).
  • Patterns you have downloaded (stored in Documents/Downloads/).

In the last two cases you have the option of deleting a file by tapping on the "DELETE" link.

Text files stored in Documents have an "EDIT" link which will display the file's contents and let you edit it. The resulting view has a Save button which lets you save any changes to the original file or to a new file. Text files supplied with the app have a "READ" link so you can view the file (editing is disabled and there is no Save button).

When you tap on a link to a pattern file, Golly will load the pattern and automatically switch to the Pattern tab. (However, if you tap on a link to a zip file, Golly will switch to the Help tab and display its contents there.)

File sharing using iTunes

Golly supports the transfer of pattern files and rule files from a desktop computer to your iPad (or vice versa) by using iTunes file sharing.

A minor annoyance is that iTunes only lets you put files into the Documents folder and not inside the various sub-folders that Golly uses. But it's not really a problem because when you switch to Golly's Open tab or tap the Pattern tab's Rule button, Golly will check for files in the Documents folder and automatically move them into the appropriate sub-folders. Any files with extensions of .rule, .tree or .table are moved into Documents/Rules/. Any .colors or .icons files are ignored. All other files are assumed to be pattern files and are moved into Documents/Saved/. Note that any existing files with the same names as the files being moved will be replaced. golly-3.3-src/gui-common/Help/pattern-ios.html0000644000175000017500000000352312250742663016322 00000000000000

Pattern Tab

The Pattern tab lets you display, edit and generate patterns. There are three toolbars:

  • The top toolbar has buttons for generating the current pattern, changing the speed (by setting how often the pattern is rendered), and for changing the scale and/or location.
  • The middle toolbar has buttons for editing the current pattern. You can undo or redo all editing changes (and generating changes), select all of the current pattern, perform a variety of actions on the selection, paste, or change the current drawing state. The segmented buttons at the right edge of the toolbar let you choose an editing mode: drawing cells, picking cell states, selecting cells, or moving the viewport (with a one-finger drag).
  • The bottom toolbar has buttons for miscellaneous functions. You can create a new pattern, change the current rule (and/or algorithm), display comment information in the current pattern file, save the current pattern, or switch to full screen mode.

The thin area in between the top two toolbars is used to display status information about the current pattern. It consists of three lines: The 1st line shows the pattern name, the current algorithm, and the current rule. The 2nd line shows the generation count, the population (ie. number of live cells), the current scale (in cells per pixels), the current step size, and the XY location of the cell in the middle of the viewport. The 3rd line is for various messages.

The background color of the status area depends on the current algorithm: pale yellow for QuickLife, pale blue for HashLife, etc.

The large area above the bottom toolbar is for displaying the current pattern. Two-finger pinching can be used to zoom in or out, and two-finger dragging can be used to move the viewport. golly-3.3-src/gui-common/Help/archives.html0000644000175000017500000000262313171233731015653 00000000000000

Online Archives

Golly can download patterns and rules from these online archives:

golly-3.3-src/gui-common/file.cpp0000644000175000017500000012214513230774246013725 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifdef ANDROID_GUI #include "jnicalls.h" // for SwitchToPatternTab, ShowTextFile, ShowHelp, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for SwitchToPatternTab, ShowTextFile, ShowHelp, etc #endif #ifdef IOS_GUI #import "GollyAppDelegate.h" // for SwitchToPatternTab #import "HelpViewController.h" // for ShowHelp #import "InfoViewController.h" // for ShowTextFile #endif // we use MiniZip code for opening zip files and extracting files stored within them #include "zip.h" #include "unzip.h" #include // for std::string #include // for std::list #include // for std::runtime_error and std::exception #include // for std::ostringstream #include // for std::replace #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "ruleloaderalgo.h" // for noTABLEorTREE #include "readpattern.h" // for readpattern #include "writepattern.h" // for writepattern, pattern_format #include "utils.h" // for Warning #include "prefs.h" // for SavePrefs, allowundo, userrules, etc #include "status.h" // for SetMessage #include "algos.h" // for CreateNewUniverse, algo_type, algoinfo, etc #include "layer.h" // for currlayer, etc #include "control.h" // for SetGenIncrement, ChangeAlgorithm #include "view.h" // for origin_restored, nopattupdate #include "undo.h" // for UndoRedo #include "file.h" // ----------------------------------------------------------------------------- std::string GetBaseName(const char* path) { // extract basename from given path std::string basename = path; size_t lastsep = basename.rfind('/'); if (lastsep != std::string::npos) { basename = basename.substr(lastsep+1); } return basename; } // ----------------------------------------------------------------------------- void SetPatternTitle(const char* filename) { if ( filename[0] != 0 ) { // remember current file name currlayer->currname = filename; // show currname in current layer's menu item //!!! UpdateLayerItem(currindex); } } // ----------------------------------------------------------------------------- bool SaveCurrentLayer() { if (currlayer->algo->isEmpty()) return true; // no need to save empty universe #ifdef WEB_GUI // show a modal dialog that lets user save their changes return WebSaveChanges(); #else // currently ignored in Android and iOS versions return true; #endif } // ----------------------------------------------------------------------------- void CreateUniverse() { // save current rule std::string oldrule = currlayer->algo->getrule(); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // ensure new universe uses same rule (and thus same # of cell states) RestoreRule(oldrule.c_str()); // increment has been reset to 1 but that's probably not always desirable // so set increment using current step size SetGenIncrement(); } // ----------------------------------------------------------------------------- void NewPattern(const char* title) { if (generating) Warning("Bug detected in NewPattern!"); if (currlayer->dirty && asktosave && !SaveCurrentLayer()) return; currlayer->savestart = false; currlayer->currfile.clear(); currlayer->startgen = 0; // reset step size before CreateUniverse calls SetGenIncrement currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; // create new, empty universe of same type and using same rule CreateUniverse(); // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); // possibly clear selection currlayer->currsel.Deselect(); // initially in drawing mode currlayer->touchmode = drawmode; // reset location and scale currlayer->view->setpositionmag(bigint::zero, bigint::zero, MAX_MAG); // no longer use newmag // best to restore true origin if (currlayer->originx != bigint::zero || currlayer->originy != bigint::zero) { currlayer->originx = 0; currlayer->originy = 0; SetMessage(origin_restored); } // restore default colors for current algo/rule UpdateLayerColors(); MarkLayerClean(title); // calls SetPatternTitle } // ----------------------------------------------------------------------------- bool LoadPattern(const char* path, const char* newtitle) { if ( !FileExists(path) ) { std::string msg = "The file does not exist:\n"; msg += path; Warning(msg.c_str()); return false; } // newtitle is only empty if called from ResetPattern/RestorePattern if (newtitle[0] != 0) { if (currlayer->dirty && asktosave && !SaveCurrentLayer()) return false; currlayer->savestart = false; currlayer->currfile = path; // reset step size currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); } // disable pattern update so we see gen=0 and pop=0; // in particular, it avoids getPopulation being called which would slow down macrocell loading nopattupdate = true; // save current algo and rule algo_type oldalgo = currlayer->algtype; std::string oldrule = currlayer->algo->getrule(); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); const char* err = readpattern(path, *currlayer->algo); if (err) { // cycle thru all other algos until readpattern succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != oldalgo) { currlayer->algtype = i; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // readpattern will call setrule err = readpattern(path, *currlayer->algo); if (!err) break; } } if (err) { // no algo could read pattern so restore original algo and rule currlayer->algtype = oldalgo; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); RestoreRule(oldrule.c_str()); // Warning(err); // current error and original error are not necessarily meaningful // so report a more generic error Warning("File could not be loaded by any algorithm\n(probably due to an unknown rule)."); } } // enable pattern update nopattupdate = false; if (newtitle[0] != 0) { MarkLayerClean(newtitle); // calls SetPatternTitle // restore default base step for current algo // (currlayer->currexpo was set to 0 above) currlayer->currbase = algoinfo[currlayer->algtype]->defbase; SetGenIncrement(); // restore default colors for current algo/rule UpdateLayerColors(); currlayer->currsel.Deselect(); // initially in moving mode currlayer->touchmode = movemode; currlayer->algo->fit(*currlayer->view, 1); currlayer->startgen = currlayer->algo->getGeneration(); // might be > 0 UpdateEverything(); } return err == NULL; } // ----------------------------------------------------------------------------- void AddRecentPattern(const char* inpath) { std::string path = inpath; if (path.find(userdir) == 0) { // remove userdir from start of path path.erase(0, userdir.length()); } // check if path is already in recentpatterns if (!recentpatterns.empty()) { std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string nextpath = *next; if (path == nextpath) { if (next == recentpatterns.begin()) { // path is in recentpatterns and at top, so we're done return; } // remove this path from recentpatterns (we'll add it below) recentpatterns.erase(next); numpatterns--; break; } next++; } } // put given path at start of recentpatterns recentpatterns.push_front(path); if (numpatterns < maxpatterns) { numpatterns++; } else { // remove the path at end of recentpatterns recentpatterns.pop_back(); } } // ----------------------------------------------------------------------------- bool CopyTextToClipboard(const char* text) { #ifdef ANDROID_GUI return AndroidCopyTextToClipboard(text); #endif #ifdef WEB_GUI return WebCopyTextToClipboard(text); #endif #ifdef IOS_GUI UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = [NSString stringWithCString:text encoding:NSUTF8StringEncoding]; return true; #endif } // ----------------------------------------------------------------------------- bool GetTextFromClipboard(std::string& text) { #ifdef ANDROID_GUI return AndroidGetTextFromClipboard(text); #endif #ifdef WEB_GUI return WebGetTextFromClipboard(text); #endif #ifdef IOS_GUI UIPasteboard *pboard = [UIPasteboard generalPasteboard]; NSString *str = pboard.string; if (str == nil) { ErrorMessage("No text in clipboard."); return false; } else { text = [str cStringUsingEncoding:NSUTF8StringEncoding]; return true; } #endif } // ----------------------------------------------------------------------------- void LoadRule(const std::string& rulestring) { // load recently installed .rule file std::string oldrule = currlayer->algo->getrule(); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); // InitAlgorithms ensures the RuleLoader algo is the last algo int rule_loader_algo = NumAlgos() - 1; const char* err; if (currlayer->algtype == rule_loader_algo) { // RuleLoader is current algo so no need to switch err = currlayer->algo->setrule(rulestring.c_str()); } else { // switch to RuleLoader algo lifealgo* tempalgo = CreateNewUniverse(rule_loader_algo); err = tempalgo->setrule(rulestring.c_str()); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule ChangeAlgorithm(rule_loader_algo, rulestring.c_str()); if (rule_loader_algo != currlayer->algtype) { RestoreRule(oldrule.c_str()); Warning("Algorithm could not be changed (pattern is too big to convert)."); } return; } } if (err) { // RuleLoader algo found some sort of error if (strcmp(err, noTABLEorTREE) == 0) { // .rule file has no TABLE or TREE section but it might be used // to override a built-in rule, so try each algo std::string temprule = rulestring; std::replace(temprule.begin(), temprule.end(), '_', '/'); // eg. convert B3_S23 to B3/S23 for (int i = 0; i < NumAlgos(); i++) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule(temprule.c_str()); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule ChangeAlgorithm(i, temprule.c_str()); if (i != currlayer->algtype) { RestoreRule(oldrule.c_str()); Warning("Algorithm could not be changed (pattern is too big to convert)."); } return; } } } RestoreRule(oldrule.c_str()); std::string msg = "The rule file is not valid:\n"; msg += rulestring; msg += "\n\nThe error message:\n"; msg += err; Warning(msg.c_str()); return; } std::string newrule = currlayer->algo->getrule(); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // if pattern exists and is at starting gen then ensure savestart is true // so that SaveStartingPattern will save pattern to suitable file // (and thus undo/reset will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // new rule might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } // set colors for new rule UpdateLayerColors(); } // ----------------------------------------------------------------------------- bool ExtractZipEntry(const std::string& zippath, const std::string& entryname, const std::string& outfile) { bool found = false; bool ok = false; std::ostringstream oss; int err; char* zipdata = NULL; unzFile zfile = unzOpen(zippath.c_str()); if (zfile == NULL) { std::string msg = "Could not open zip file:\n" + zippath; Warning(msg.c_str()); return false; } try { err = unzGoToFirstFile(zfile); if (err != UNZ_OK) { oss << "Error going to first file in zip file:\n" << zippath.c_str(); throw std::runtime_error(oss.str().c_str()); } do { char filename[256]; unz_file_info file_info; err = unzGetCurrentFileInfo(zfile, &file_info, filename, sizeof(filename), NULL, 0, NULL, 0); if (err != UNZ_OK) { oss << "Error getting current file info in zip file:\n" << zippath.c_str(); throw std::runtime_error(oss.str().c_str()); } std::string thisname = filename; if (thisname == entryname) { found = true; // we've found the desired entry so copy entry data to given outfile zipdata = (char*) malloc(file_info.uncompressed_size); if (zipdata == NULL) { throw std::runtime_error("Failed to allocate memory for zip file entry!"); } err = unzOpenCurrentFilePassword(zfile, NULL); if (err != UNZ_OK) { oss << "Error opening current zip entry:\n" << entryname.c_str(); throw std::runtime_error(oss.str().c_str()); } int bytesRead = unzReadCurrentFile(zfile, zipdata, (unsigned int)file_info.uncompressed_size); if (bytesRead < 0) { throw std::runtime_error("Error reading the zip entry data!"); } err = unzCloseCurrentFile(zfile); if (err != UNZ_OK) { oss << "Error closing current zip entry:\n" << entryname.c_str(); throw std::runtime_error(oss.str().c_str()); } if (file_info.uncompressed_size == 0) { Warning("Zip entry is empty!"); } else if (bytesRead == (long)(file_info.uncompressed_size)) { // write zipdata to outfile FILE* f = fopen(outfile.c_str(), "wb"); if (f) { if (fwrite(zipdata, 1, bytesRead, f) != (size_t)bytesRead) { Warning("Could not write data for zip entry!"); } else { ok = true; } fclose(f); } else { Warning("Could not create file for zip entry!"); } } else { Warning("Failed to read all bytes of zip entry!"); } break; } } while (unzGoToNextFile(zfile) == UNZ_OK); } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(e.what()); } if (zipdata) free(zipdata); err = unzClose(zfile); if (err != UNZ_OK) { Warning("Error closing zip file!"); } if (found && ok) return true; if (!found) { std::string msg = "Could not find zip file entry:\n" + entryname; Warning(msg.c_str()); } else { // outfile is probably incomplete so best to delete it if (FileExists(outfile)) RemoveFile(outfile); } return false; } // ----------------------------------------------------------------------------- void UnzipFile(const std::string& zippath, const std::string& entry) { std::string filename = GetBaseName(entry.c_str()); std::string tempfile = tempdir + filename; if ( IsRuleFile(filename) ) { // rule-related file should have already been extracted and installed // into userrules, so check that file exists and load rule std::string rulefile = userrules + filename; if (FileExists(rulefile)) { // load corresponding rule SwitchToPatternTab(); LoadRule(filename.substr(0, filename.rfind('.'))); } else { std::string msg = "Rule-related file was not installed:\n" + rulefile; Warning(msg.c_str()); } } else if ( ExtractZipEntry(zippath, entry, tempfile) ) { if ( IsHTMLFile(filename) ) { // display html file ShowHelp(tempfile.c_str()); } else if ( IsTextFile(filename) ) { // display text file ShowTextFile(tempfile.c_str()); } else if ( IsScriptFile(filename) ) { // run script depending on safety check; note that because the script is // included in a zip file we don't remember it in the Run Recent submenu //!!! CheckBeforeRunning(tempfile, false, zippath); Warning("This version of Golly cannot run scripts."); } else { // open pattern but don't remember in recentpatterns OpenFile(tempfile.c_str(), false); } } } // ----------------------------------------------------------------------------- static bool RuleInstalled(unzFile zfile, unz_file_info& info, const std::string& outfile) { if (info.uncompressed_size == 0) { Warning("Zip entry is empty!"); return false; } char* zipdata = (char*) malloc(info.uncompressed_size); if (zipdata == NULL) { Warning("Failed to allocate memory for rule file!"); return false; } int err = unzOpenCurrentFilePassword(zfile, NULL); if (err != UNZ_OK) { Warning("Error opening current zip entry!"); free(zipdata); return false; } int bytesRead = unzReadCurrentFile(zfile, zipdata, (unsigned int)info.uncompressed_size); if (bytesRead < 0) { // error is detected below } err = unzCloseCurrentFile(zfile); if (err != UNZ_OK) { Warning("Error closing current zip entry!"); // but keep going } bool ok = true; if (bytesRead == (long)(info.uncompressed_size)) { // write zipdata to outfile FILE* f = fopen(outfile.c_str(), "wb"); if (f) { if (fwrite(zipdata, 1, bytesRead, f) != (size_t)bytesRead) { Warning("Could not write data for zip entry!"); ok = false; } fclose(f); } else { Warning("Could not create file for zip entry!"); ok = false; } } else { Warning("Failed to read all bytes of zip entry!"); ok = false; } free(zipdata); return ok; } // ----------------------------------------------------------------------------- void OpenZipFile(const char* zippath) { // Process given zip file in the following manner: // - If it contains any .rule files then extract and install those files // into userrules (the user's rules directory). // - Build a temporary html file with clickable links to each file entry // and show it in the Help tab. const std::string indent = "    "; bool dirseen = false; bool diffdirs = (userrules != rulesdir); std::string firstdir = ""; std::string lastpattern = ""; std::string lastscript = ""; int patternseps = 0; // # of separators in lastpattern int scriptseps = 0; // # of separators in lastscript int patternfiles = 0; int scriptfiles = 0; int textfiles = 0; // includes html files int rulefiles = 0; int deprecated = 0; // # of .table/tree files std::list deplist; // list of installed deprecated files std::list rulelist; // list of installed .rule files int err; // strip off patternsdir or userdir std::string relpath = zippath; size_t pos = relpath.find(patternsdir); if (pos == 0) { relpath.erase(0, patternsdir.length()); } else { pos = relpath.find(userdir); if (pos == 0) relpath.erase(0, userdir.length()); } std::string contents = "

\nContents of "; contents += relpath; contents += ":

\n"; unzFile zfile = unzOpen(zippath); if (zfile == NULL) { std::string msg = "Could not open zip file:\n"; msg += zippath; Warning(msg.c_str()); return; } try { err = unzGoToFirstFile(zfile); if (err != UNZ_OK) { throw std::runtime_error("Error going to first file in zip file!"); } do { // examine each entry in zip file and build contents string; // also install any .rule files char entryname[256]; unz_file_info file_info; err = unzGetCurrentFileInfo(zfile, &file_info, entryname, sizeof(entryname), NULL, 0, NULL, 0); if (err != UNZ_OK) { throw std::runtime_error("Error getting current file info in zip file!"); } std::string name = entryname; if (name.find("__MACOSX") == 0 || name.rfind(".DS_Store") != std::string::npos) { // ignore meta-data stuff in zip file created on Mac } else { // indent depending on # of separators in name unsigned int sepcount = 0; unsigned int i = 0; unsigned int len = (unsigned int)name.length(); while (i < len) { if (name[i] == '/') sepcount++; i++; } // check if 1st directory has multiple separators (eg. in jslife.zip) if (name[len-1] == '/' && !dirseen && sepcount > 1) { firstdir = name.substr(0, name.find('/')); contents += firstdir; contents += "
\n"; } for (i = 1; i < sepcount; i++) contents += indent; if (name[len-1] == '/') { // remove terminating separator from directory name name = name.substr(0, name.rfind('/')); name = GetBaseName(name.c_str()); if (dirseen && name == firstdir) { // ignore dir already output earlier (eg. in jslife.zip) } else { contents += name; contents += "
\n"; } dirseen = true; } else { // entry is for some sort of file std::string filename = GetBaseName(name.c_str()); if (dirseen) contents += indent; if ( IsRuleFile(filename) && !EndsWith(filename,".rule") ) { // this is a deprecated .table/tree/colors/icons file if (EndsWith(filename,".colors") || EndsWith(filename,".icons")) { // these files are no longer supported and are simply ignored contents += filename; contents += indent; contents += "[ignored]"; // don't add to deprecated list } else { // .table/.tree file contents += filename; contents += indent; contents += "[deprecated]"; deprecated++; // install it into userrules so it can be used below to create a .rule file std::string outfile = userrules + filename; if (RuleInstalled(zfile, file_info, outfile)) { deplist.push_back(filename); } else { contents += indent; contents += "INSTALL FAILED!"; } } } else { // user can extract file via special "unzip:" link contents += ""; contents += filename; contents += ""; if ( IsRuleFile(filename) ) { // extract and install .rule file into userrules std::string outfile = userrules + filename; if (RuleInstalled(zfile, file_info, outfile)) { // file successfully installed rulelist.push_back(filename); contents += indent; contents += "[installed]"; if (diffdirs) { // check if this file overrides similarly named file in rulesdir std::string clashfile = rulesdir + filename; if (FileExists(clashfile)) { contents += indent; contents += "(overrides file in Rules folder)"; } } #ifdef WEB_GUI // ensure the .rule file persists beyond the current session CopyRuleToLocalStorage(outfile.c_str()); #endif } else { // file could not be installed contents += indent; contents += "[NOT installed]"; // file is probably incomplete so best to delete it if (FileExists(outfile)) RemoveFile(outfile); } rulefiles++; } else if ( IsHTMLFile(filename) || IsTextFile(filename) ) { textfiles++; } else if ( IsScriptFile(filename) ) { scriptfiles++; lastscript = name; scriptseps = sepcount; } else { patternfiles++; lastpattern = name; patternseps = sepcount; } } contents += "
\n"; } } } while (unzGoToNextFile(zfile) == UNZ_OK); } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(e.what()); } err = unzClose(zfile); if (err != UNZ_OK) { Warning("Error closing zip file!"); } if (rulefiles > 0) { relpath = userrules; pos = relpath.find(userdir); if (pos == 0) relpath.erase(0, userdir.length()); contents += "

Files marked as \"[installed]\" have been stored in "; contents += relpath; contents += "."; } if (deprecated > 0) { std::string newrules = CreateRuleFiles(deplist, rulelist); if (newrules.length() > 0) { contents += "

Files marked as \"[deprecated]\" have been used to create new .rule files:
\n"; contents += newrules; } } contents += "\n
"; // NOTE: The desktop version of Golly will load a pattern if it's in a "simple" zip file // but for the iPad version it's probably less confusing if the zip file's contents are // *always* displayed in the Help tab. We might change this if script support is added. // write contents to a unique temporary html file std::string htmlfile = CreateTempFileName("zip_contents"); htmlfile += ".html"; FILE* f = fopen(htmlfile.c_str(), "w"); if (f) { if (fputs(contents.c_str(), f) == EOF) { fclose(f); Warning("Could not write HTML data to temporary file!"); return; } } else { Warning("Could not create temporary HTML file!"); return; } fclose(f); // display temporary html file in Help tab ShowHelp(htmlfile.c_str()); } // ----------------------------------------------------------------------------- void OpenFile(const char* path, bool remember) { // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0) { // Patterns directory is inside supplieddir fullpath = supplieddir + fullpath; } else { fullpath = userdir + fullpath; } } if (IsHTMLFile(path)) { // show HTML file in Help tab ShowHelp(fullpath.c_str()); return; } if (IsTextFile(path)) { // show text file using InfoViewController ShowTextFile(fullpath.c_str()); return; } if (IsScriptFile(path)) { // execute script /*!!! if (remember) AddRecentScript(path); RunScript(path); */ Warning("This version of Golly cannot run scripts."); return; } if (IsZipFile(path)) { // process zip file if (remember) AddRecentPattern(path); // treat zip file like a pattern file OpenZipFile(fullpath.c_str()); // must use full path return; } if (IsRuleFile(path)) { // switch to rule (.rule file must be in rulesdir or userrules) SwitchToPatternTab(); std::string basename = GetBaseName(path); LoadRule(basename.substr(0, basename.rfind('.'))); return; } // anything else is a pattern file if (remember) AddRecentPattern(path); std::string basename = GetBaseName(path); // best to switch to Pattern tab first in case progress view appears SwitchToPatternTab(); LoadPattern(fullpath.c_str(), basename.c_str()); } // ----------------------------------------------------------------------------- const char* WritePattern(const char* path, pattern_format format, output_compression compression, int top, int left, int bottom, int right) { // if the format is RLE_format and the grid is bounded then force XRLE_format so that // position info is recorded (this position will be used when the file is read) if (format == RLE_format && (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0)) format = XRLE_format; const char* err = writepattern(path, *currlayer->algo, format, compression, top, left, bottom, right); return err; } // ----------------------------------------------------------------------------- void SaveSucceeded(const std::string& path) { // save old info for RememberNameChange std::string oldname = currlayer->currname; std::string oldfile = currlayer->currfile; bool oldsave = currlayer->savestart; bool olddirty = currlayer->dirty; //!!! if (allowundo && !currlayer->stayclean) SavePendingChanges(); if ( currlayer->algo->getGeneration() == currlayer->startgen ) { // no need to save starting pattern (ResetPattern can load currfile) currlayer->currfile = path; currlayer->savestart = false; } // set dirty flag false and update currlayer->currname std::string basename = GetBaseName(path.c_str()); MarkLayerClean(basename.c_str()); if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberNameChange(oldname.c_str(), oldfile.c_str(), oldsave, olddirty); } } // ----------------------------------------------------------------------------- bool SavePattern(const std::string& path, pattern_format format, output_compression compression) { bigint top, left, bottom, right; int itop, ileft, ibottom, iright; currlayer->algo->findedges(&top, &left, &bottom, &right); if (currlayer->algo->hyperCapable()) { // algorithm uses hashlife if ( OutsideLimits(top, left, bottom, right) ) { // too big so only allow saving as MC file if (format != MC_format) { Warning("Pattern is outside +/- 10^9 boundary and can't be saved in RLE format."); return false; } itop = ileft = ibottom = iright = 0; } else { // allow saving as MC or RLE file itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); } } else { // allow saving file only if pattern is small enough if ( OutsideLimits(top, left, bottom, right) ) { Warning("Pattern is outside +/- 10^9 boundary and can't be saved."); return false; } itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); } const char* err = WritePattern(path.c_str(), format, compression, itop, ileft, ibottom, iright); if (err) { Warning(err); return false; } else { std::string msg = "Pattern saved as "; msg += GetBaseName(path.c_str()); DisplayMessage(msg.c_str()); AddRecentPattern(path.c_str()); SaveSucceeded(path); return true; } } // ----------------------------------------------------------------------------- void GetURL(const std::string& url, const std::string& pageurl) { const char* HTML_PREFIX = "GET-"; // prepended to html filename #ifdef ANDROID_GUI // LOGI("GetURL url=%s\n", url.c_str()); // LOGI("GetURL pageurl=%s\n", pageurl.c_str()); #endif #ifdef IOS_GUI // NSLog(@"GetURL url = %s", url.c_str()); // NSLog(@"GetURL pageurl = %s", pageurl.c_str()); #endif std::string fullurl; if (url.find("http:") == 0) { fullurl = url; } else { // relative get, so prepend full prefix extracted from pageurl std::string urlprefix = GetBaseName(pageurl.c_str()); // replace HTML_PREFIX with "http://" and convert spaces to '/' // (ie. reverse what we do below when building filepath) urlprefix.erase(0, strlen(HTML_PREFIX)); urlprefix = "http://" + urlprefix; std::replace(urlprefix.begin(), urlprefix.end(), ' ', '/'); urlprefix = urlprefix.substr(0, urlprefix.rfind('/')+1); fullurl = urlprefix + url; } std::string filename = GetBaseName(fullurl.c_str()); // remove ugly stuff at start of file names downloaded from ConwayLife.com if (filename.find("download.php?f=") == 0 || filename.find("pattern.asp?p=") == 0 || filename.find("script.asp?s=") == 0) { filename = filename.substr( filename.find('=')+1 ); } // create full path for downloaded file based on given url; // first remove initial "http://" std::string filepath = fullurl.substr( fullurl.find('/')+1 ); while (filepath[0] == '/') filepath.erase(0,1); if (IsHTMLFile(filename)) { // create special name for html file so above code can extract it and set urlprefix std::replace(filepath.begin(), filepath.end(), '/', ' '); #ifdef ANDROID_GUI // replace "?" with something else to avoid problem in Android's WebView.loadUrl std::replace(filepath.begin(), filepath.end(), '?', '$'); #endif filepath = HTML_PREFIX + filepath; } else { // no need for url info in file name filepath = filename; } if (IsRuleFile(filename)) { // create file in user's rules directory filepath = userrules + filename; } else if (IsHTMLFile(filename)) { // nicer to store html files in temporary directory filepath = tempdir + filepath; } else { // all other files are stored in user's download directory filepath = downloaddir + filepath; } // download the file and store it in filepath if (DownloadFile(fullurl, filepath)) { ProcessDownload(filepath); } } // ----------------------------------------------------------------------------- bool DownloadFile(const std::string& url, const std::string& filepath) { #ifdef ANDROID_GUI AndroidDownloadFile(url, filepath); // on Android the file is downloaded asynchronously, so we need to return false // here so that GetURL won't call ProcessDownload immediately (it will be called // later if the download succeeds) return false; #endif #ifdef WEB_GUI return WebDownloadFile(url, filepath); #endif #ifdef IOS_GUI NSURL *nsurl = [NSURL URLWithString:[NSString stringWithCString:url.c_str() encoding:NSUTF8StringEncoding]]; if (nsurl == nil) { std::string msg = "Bad URL: " + url; Warning(msg.c_str()); return false; } NSData *urlData = [NSData dataWithContentsOfURL:nsurl]; if (urlData) { [urlData writeToFile:[NSString stringWithCString:filepath.c_str() encoding:NSUTF8StringEncoding] atomically:YES]; return true; } else { Warning("Failed to download file!"); return false; } #endif } // ----------------------------------------------------------------------------- void ProcessDownload(const std::string& filepath) { // process a successfully downloaded file std::string filename = GetBaseName(filepath.c_str()); if (IsHTMLFile(filename)) { // display html file in Help tab ShowHelp(filepath.c_str()); } else if (IsRuleFile(filename)) { // load corresponding rule SwitchToPatternTab(); LoadRule(filename.substr(0, filename.rfind('.'))); } else if (IsTextFile(filename)) { // open text file in modal view ShowTextFile(filepath.c_str()); } else if (IsScriptFile(filename)) { // run script depending on safety check; if it is allowed to run // then we remember script in the Run Recent submenu //!!! CheckBeforeRunning(filepath, true, wxEmptyString); Warning("This version of Golly cannot run scripts."); } else { // assume it's a pattern/zip file, so open it OpenFile(filepath.c_str()); } } // ----------------------------------------------------------------------------- void LoadLexiconPattern(const std::string& lexpattern) { // copy lexpattern data to tempstart file FILE* f = fopen(currlayer->tempstart.c_str(), "w"); if (f) { if (fputs(lexpattern.c_str(), f) == EOF) { fclose(f); Warning("Could not write lexicon pattern to tempstart file!"); return; } } else { Warning("Could not create tempstart file!"); return; } fclose(f); // avoid any pattern conversion (possibly causing ChangeAlgorithm to beep with a message) NewPattern(); // all Life Lexicon patterns assume we're using Conway's Life so try // switching to B3/S23 or Life; if that fails then switch to QuickLife const char* err = currlayer->algo->setrule("B3/S23"); if (err) { // try "Life" in case current algo is RuleLoader and Life.rule/table/tree exists err = currlayer->algo->setrule("Life"); } if (err) { ChangeAlgorithm(QLIFE_ALGO, "B3/S23"); } // load lexicon pattern SwitchToPatternTab(); LoadPattern(currlayer->tempstart.c_str(), "lexicon"); } golly-3.3-src/gui-common/prefs.cpp0000644000175000017500000005503613171233731014122 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "lifealgo.h" #include "viewport.h" // for MAX_MAG #include "util.h" // for linereader, lifeerrors #include "utils.h" // for gColor, SetColor, Warning, Fatal, Beep #include "status.h" // for DisplayMessage #include "algos.h" // for NumAlgos, algoinfo, etc #include "layer.h" // for currlayer #include "prefs.h" #ifdef ANDROID_GUI #include "jnicalls.h" // for BeginProgress, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for BeginProgress, etc #endif #ifdef IOS_GUI #import "PatternViewController.h" // for BeginProgress, etc #endif // ----------------------------------------------------------------------------- // Golly's preferences file is a simple text file. const int PREFS_VERSION = 1; // increment if necessary due to changes in syntax/semantics int currversion = PREFS_VERSION; // might be changed by prefs_version const int PREF_LINE_SIZE = 5000; // must be quite long for storing file paths std::string supplieddir; // path of parent directory for supplied help/patterns/rules std::string helpdir; // path of directory for supplied help std::string patternsdir; // path of directory for supplied patterns std::string rulesdir; // path of directory for supplied rules std::string userdir; // path of parent directory for user's rules/patterns/downloads std::string userrules; // path of directory for user's rules std::string savedir; // path of directory for user's saved patterns std::string downloaddir; // path of directory for user's downloaded files std::string tempdir; // path of directory for temporary data std::string clipfile; // path of temporary file for storing clipboard data std::string prefsfile; // path of file for storing user's preferences // initialize exported preferences: int debuglevel = 0; // for displaying debug info if > 0 int helpfontsize = 10; // font size in help window char initrule[256] = "B3/S23"; // initial rule bool initautofit = false; // initial autofit setting bool inithyperspeed = false; // initial hyperspeed setting bool initshowhashinfo = false; // initial showhashinfo setting bool savexrle = true; // save RLE file using XRLE format? bool showtool = true; // show tool bar? bool showlayer = false; // show layer bar? bool showedit = true; // show edit bar? bool showallstates = false; // show all cell states in edit bar? bool showstatus = true; // show status bar? bool showexact = false; // show exact numbers in status bar? bool showtimeline = false; // show timeline bar? bool showtiming = false; // show timing messages? bool showgridlines = true; // display grid lines? bool showicons = false; // display icons for cell states? bool swapcolors = false; // swap colors used for cell states? bool allowundo = true; // allow undo/redo? bool allowbeep = true; // okay to play beep sound? bool restoreview = true; // should reset/undo restore view? int canchangerule = 1; // if > 0 then paste can change rule if pattern is empty int randomfill = 50; // random fill percentage (1..100) int opacity = 80; // percentage opacity of live cells in overlays (1..100) int tileborder = 3; // thickness of tiled window borders int mingridmag = 2; // minimum mag to draw grid lines int boldspacing = 10; // spacing of bold grid lines bool showboldlines = true; // show bold grid lines? bool mathcoords = false; // show Y values increasing upwards? bool syncviews = false; // synchronize viewports? bool syncmodes = true; // synchronize touch modes? bool stacklayers = false; // stack all layers? bool tilelayers = false; // tile all layers? bool asktosave = true; // ask to save changes? int newmag = 5; // mag setting for new pattern bool newremovesel = true; // new pattern removes selection? bool openremovesel = true; // opening pattern removes selection? int mindelay = 250; // minimum millisec delay int maxdelay = 2000; // maximum millisec delay int maxhashmem = 100; // maximum memory (in MB) for hashlife-based algos int numpatterns = 0; // current number of recent pattern files int maxpatterns = 20; // maximum number of recent pattern files std::list recentpatterns; // list of recent pattern files gColor borderrgb; // color for border around bounded grid gColor selectrgb; // color for selected cells gColor pastergb; // color for pasted pattern paste_mode pmode = Or; // logical paste mode // ----------------------------------------------------------------------------- const char* GetPasteMode() { switch (pmode) { case And: return "AND"; case Copy: return "COPY"; case Or: return "OR"; case Xor: return "XOR"; default: return "unknown"; } } // ----------------------------------------------------------------------------- void SetPasteMode(const char* s) { if (strcmp(s, "AND") == 0) { pmode = And; } else if (strcmp(s, "COPY") == 0) { pmode = Copy; } else if (strcmp(s, "OR") == 0) { pmode = Or; } else { pmode = Xor; } } // ----------------------------------------------------------------------------- void CreateDefaultColors() { SetColor(borderrgb, 128, 128, 128); // 50% gray SetColor(selectrgb, 75, 175, 0); // dark green SetColor(pastergb, 255, 0, 0); // red } // ----------------------------------------------------------------------------- void GetColor(const char* value, gColor& rgb) { unsigned int r, g, b; sscanf(value, "%u,%u,%u", &r, &g, &b); SetColor(rgb, r, g, b); } // ----------------------------------------------------------------------------- void SaveColor(FILE* f, const char* name, const gColor rgb) { fprintf(f, "%s=%u,%u,%u\n", name, rgb.r, rgb.g, rgb.b); } // ----------------------------------------------------------------------------- void SavePrefs() { if (currlayer == NULL) { // should never happen but play safe Warning("Bug: currlayer is NULL!"); return; } FILE* f = fopen(prefsfile.c_str(), "w"); if (f == NULL) { Warning("Could not save preferences file!"); return; } fprintf(f, "prefs_version=%d\n", PREFS_VERSION); fprintf(f, "debug_level=%d\n", debuglevel); fprintf(f, "help_font_size=%d (%d..%d)\n", helpfontsize, minfontsize, maxfontsize); fprintf(f, "allow_undo=%d\n", allowundo ? 1 : 0); fprintf(f, "allow_beep=%d\n", allowbeep ? 1 : 0); fprintf(f, "restore_view=%d\n", restoreview ? 1 : 0); fprintf(f, "paste_mode=%s\n", GetPasteMode()); fprintf(f, "can_change_rule=%d (0..2)\n", canchangerule); fprintf(f, "random_fill=%d (1..100)\n", randomfill); fprintf(f, "min_delay=%d (0..%d millisecs)\n", mindelay, MAX_DELAY); fprintf(f, "max_delay=%d (0..%d millisecs)\n", maxdelay, MAX_DELAY); fprintf(f, "auto_fit=%d\n", currlayer->autofit ? 1 : 0); fprintf(f, "hyperspeed=%d\n", currlayer->hyperspeed ? 1 : 0); fprintf(f, "hash_info=%d\n", currlayer->showhashinfo ? 1 : 0); fprintf(f, "max_hash_mem=%d\n", maxhashmem); fputs("\n", f); fprintf(f, "init_algo=%s\n", GetAlgoName(currlayer->algtype)); for (int i = 0; i < NumAlgos(); i++) { fputs("\n", f); fprintf(f, "algorithm=%s\n", GetAlgoName(i)); fprintf(f, "base_step=%d\n", algoinfo[i]->defbase); SaveColor(f, "status_rgb", algoinfo[i]->statusrgb); SaveColor(f, "from_rgb", algoinfo[i]->fromrgb); SaveColor(f, "to_rgb", algoinfo[i]->torgb); fprintf(f, "use_gradient=%d\n", algoinfo[i]->gradient ? 1 : 0); fputs("colors=", f); for (int state = 0; state < algoinfo[i]->maxstates; state++) { // only write out state,r,g,b tuple if color is different to default if (algoinfo[i]->algor[state] != algoinfo[i]->defr[state] || algoinfo[i]->algog[state] != algoinfo[i]->defg[state] || algoinfo[i]->algob[state] != algoinfo[i]->defb[state] ) { fprintf(f, "%d,%d,%d,%d,", state, algoinfo[i]->algor[state], algoinfo[i]->algog[state], algoinfo[i]->algob[state]); } } fputs("\n", f); } fputs("\n", f); fprintf(f, "rule=%s\n", currlayer->algo->getrule()); fprintf(f, "show_tool=%d\n", showtool ? 1 : 0); fprintf(f, "show_layer=%d\n", showlayer ? 1 : 0); fprintf(f, "show_edit=%d\n", showedit ? 1 : 0); fprintf(f, "show_states=%d\n", showallstates ? 1 : 0); fprintf(f, "show_status=%d\n", showstatus ? 1 : 0); fprintf(f, "show_exact=%d\n", showexact ? 1 : 0); fprintf(f, "show_timeline=%d\n", showtimeline ? 1 : 0); fprintf(f, "show_timing=%d\n", showtiming ? 1 : 0); fprintf(f, "grid_lines=%d\n", showgridlines ? 1 : 0); fprintf(f, "min_grid_mag=%d (2..%d)\n", mingridmag, MAX_MAG); fprintf(f, "bold_spacing=%d (2..%d)\n", boldspacing, MAX_SPACING); fprintf(f, "show_bold_lines=%d\n", showboldlines ? 1 : 0); fprintf(f, "math_coords=%d\n", mathcoords ? 1 : 0); fputs("\n", f); fprintf(f, "sync_views=%d\n", syncviews ? 1 : 0); fprintf(f, "sync_modes=%d\n", syncmodes ? 1 : 0); fprintf(f, "stack_layers=%d\n", stacklayers ? 1 : 0); fprintf(f, "tile_layers=%d\n", tilelayers ? 1 : 0); fprintf(f, "tile_border=%d (1..10)\n", tileborder); fprintf(f, "ask_to_save=%d\n", asktosave ? 1 : 0); fputs("\n", f); fprintf(f, "show_icons=%d\n", showicons ? 1 : 0); fprintf(f, "swap_colors=%d\n", swapcolors ? 1 : 0); fprintf(f, "opacity=%d (1..100)\n", opacity); SaveColor(f, "border_rgb", borderrgb); SaveColor(f, "select_rgb", selectrgb); SaveColor(f, "paste_rgb", pastergb); fputs("\n", f); fprintf(f, "new_mag=%d (0..%d)\n", newmag, MAX_MAG); fprintf(f, "new_remove_sel=%d\n", newremovesel ? 1 : 0); fprintf(f, "open_remove_sel=%d\n", openremovesel ? 1 : 0); fprintf(f, "save_xrle=%d\n", savexrle ? 1 : 0); fprintf(f, "max_patterns=%d (1..%d)\n", maxpatterns, MAX_RECENT); if (!recentpatterns.empty()) { fputs("\n", f); std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string path = *next; fprintf(f, "recent_pattern=%s\n", path.c_str()); next++; } } fclose(f); } // ----------------------------------------------------------------------------- bool GetKeywordAndValue(linereader& lr, char* line, char** keyword, char** value) { // the linereader class handles all line endings (CR, CR+LF, LF) // and terminates line buffer with \0 while ( lr.fgets(line, PREF_LINE_SIZE) != 0 ) { if ( line[0] == '#' || line[0] == 0 ) { // skip comment line or empty line } else { // line should have format keyword=value *keyword = line; *value = line; while ( **value != '=' && **value != 0 ) *value += 1; **value = 0; // terminate keyword *value += 1; return true; } } return false; } // ----------------------------------------------------------------------------- char* ReplaceDeprecatedAlgo(char* algoname) { if (strcmp(algoname, "RuleTable") == 0 || strcmp(algoname, "RuleTree") == 0) { // RuleTable and RuleTree algos have been replaced by RuleLoader return (char*)"RuleLoader"; } else { return algoname; } } // ----------------------------------------------------------------------------- // let gollybase code call Fatal, Warning, BeginProgress, etc class my_errors : public lifeerrors { public: virtual void fatal(const char* s) { Fatal(s); } virtual void warning(const char* s) { Warning(s); } virtual void status(const char* s) { DisplayMessage(s); } virtual void beginprogress(const char* s) { BeginProgress(s); // init flag for isaborted() calls aborted = false; } virtual bool abortprogress(double f, const char* s) { return AbortProgress(f, s); } virtual void endprogress() { EndProgress(); } virtual const char* getuserrules() { return (const char*) userrules.c_str(); } virtual const char* getrulesdir() { return (const char*) rulesdir.c_str(); } }; static my_errors myerrhandler; // create instance // ----------------------------------------------------------------------------- void GetPrefs() { int algoindex = -1; // unknown algorithm // let gollybase code call Fatal, Warning, BeginProgress, etc lifeerrors::seterrorhandler(&myerrhandler); CreateDefaultColors(); FILE* f = fopen(prefsfile.c_str(), "r"); if (f == NULL) { // should only happen 1st time app is run return; } linereader reader(f); char line[PREF_LINE_SIZE]; char* keyword; char* value; while ( GetKeywordAndValue(reader, line, &keyword, &value) ) { if (strcmp(keyword, "prefs_version") == 0) { sscanf(value, "%d", &currversion); } else if (strcmp(keyword, "debug_level") == 0) { sscanf(value, "%d", &debuglevel); } else if (strcmp(keyword, "help_font_size") == 0) { sscanf(value, "%d", &helpfontsize); if (helpfontsize < minfontsize) helpfontsize = minfontsize; if (helpfontsize > maxfontsize) helpfontsize = maxfontsize; } else if (strcmp(keyword, "allow_undo") == 0) { allowundo = value[0] == '1'; } else if (strcmp(keyword, "allow_beep") == 0) { allowbeep = value[0] == '1'; } else if (strcmp(keyword, "restore_view") == 0) { restoreview = value[0] == '1'; } else if (strcmp(keyword, "paste_mode") == 0) { SetPasteMode(value); } else if (strcmp(keyword, "can_change_rule") == 0) { sscanf(value, "%d", &canchangerule); if (canchangerule < 0) canchangerule = 0; if (canchangerule > 2) canchangerule = 2; } else if (strcmp(keyword, "random_fill") == 0) { sscanf(value, "%d", &randomfill); if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } else if (strcmp(keyword, "algorithm") == 0) { if (strcmp(value, "RuleTable") == 0) { // use deprecated RuleTable settings for RuleLoader // (deprecated RuleTree settings will simply be ignored) value = (char*)"RuleLoader"; } algoindex = -1; for (int i = 0; i < NumAlgos(); i++) { if (strcmp(value, GetAlgoName(i)) == 0) { algoindex = i; break; } } } else if (strcmp(keyword, "base_step") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int base; sscanf(value, "%d", &base); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; algoinfo[algoindex]->defbase = base; } } else if (strcmp(keyword, "status_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->statusrgb); } else if (strcmp(keyword, "from_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->fromrgb); } else if (strcmp(keyword, "to_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->torgb); } else if (strcmp(keyword, "use_gradient") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) algoinfo[algoindex]->gradient = value[0] == '1'; } else if (strcmp(keyword, "colors") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int state, r, g, b; while (sscanf(value, "%d,%d,%d,%d,", &state, &r, &g, &b) == 4) { if (state >= 0 && state < algoinfo[algoindex]->maxstates) { algoinfo[algoindex]->algor[state] = r; algoinfo[algoindex]->algog[state] = g; algoinfo[algoindex]->algob[state] = b; } while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; } } } else if (strcmp(keyword, "min_delay") == 0) { sscanf(value, "%d", &mindelay); if (mindelay < 0) mindelay = 0; if (mindelay > MAX_DELAY) mindelay = MAX_DELAY; } else if (strcmp(keyword, "max_delay") == 0) { sscanf(value, "%d", &maxdelay); if (maxdelay < 0) maxdelay = 0; if (maxdelay > MAX_DELAY) maxdelay = MAX_DELAY; } else if (strcmp(keyword, "auto_fit") == 0) { initautofit = value[0] == '1'; } else if (strcmp(keyword, "init_algo") == 0) { value = ReplaceDeprecatedAlgo(value); int i = staticAlgoInfo::nameToIndex(value); if (i >= 0 && i < NumAlgos()) initalgo = i; } else if (strcmp(keyword, "hyperspeed") == 0) { inithyperspeed = value[0] == '1'; } else if (strcmp(keyword, "hash_info") == 0) { initshowhashinfo = value[0] == '1'; } else if (strcmp(keyword, "max_hash_mem") == 0) { sscanf(value, "%d", &maxhashmem); if (maxhashmem < MIN_MEM_MB) maxhashmem = MIN_MEM_MB; if (maxhashmem > MAX_MEM_MB) maxhashmem = MAX_MEM_MB; } else if (strcmp(keyword, "rule") == 0) { strncpy(initrule, value, sizeof(initrule)); } else if (strcmp(keyword, "show_tool") == 0) { showtool = value[0] == '1'; } else if (strcmp(keyword, "show_layer") == 0) { showlayer = value[0] == '1'; } else if (strcmp(keyword, "show_edit") == 0) { showedit = value[0] == '1'; } else if (strcmp(keyword, "show_states") == 0) { showallstates = value[0] == '1'; } else if (strcmp(keyword, "show_status") == 0) { showstatus = value[0] == '1'; } else if (strcmp(keyword, "show_exact") == 0) { showexact = value[0] == '1'; } else if (strcmp(keyword, "show_timeline") == 0) { showtimeline = value[0] == '1'; } else if (strcmp(keyword, "show_timing") == 0) { showtiming = value[0] == '1'; } else if (strcmp(keyword, "grid_lines") == 0) { showgridlines = value[0] == '1'; } else if (strcmp(keyword, "min_grid_mag") == 0) { sscanf(value, "%d", &mingridmag); if (mingridmag < 2) mingridmag = 2; if (mingridmag > MAX_MAG) mingridmag = MAX_MAG; } else if (strcmp(keyword, "bold_spacing") == 0) { sscanf(value, "%d", &boldspacing); if (boldspacing < 2) boldspacing = 2; if (boldspacing > MAX_SPACING) boldspacing = MAX_SPACING; } else if (strcmp(keyword, "show_bold_lines") == 0) { showboldlines = value[0] == '1'; } else if (strcmp(keyword, "math_coords") == 0) { mathcoords = value[0] == '1'; } else if (strcmp(keyword, "sync_views") == 0) { syncviews = value[0] == '1'; } else if (strcmp(keyword, "sync_modes") == 0) { syncmodes = value[0] == '1'; } else if (strcmp(keyword, "stack_layers") == 0) { stacklayers = value[0] == '1'; } else if (strcmp(keyword, "tile_layers") == 0) { tilelayers = value[0] == '1'; } else if (strcmp(keyword, "tile_border") == 0) { sscanf(value, "%d", &tileborder); if (tileborder < 1) tileborder = 1; if (tileborder > 10) tileborder = 10; } else if (strcmp(keyword, "ask_to_save") == 0) { asktosave = value[0] == '1'; } else if (strcmp(keyword, "show_icons") == 0) { showicons = value[0] == '1'; } else if (strcmp(keyword, "swap_colors") == 0) { swapcolors = value[0] == '1'; } else if (strcmp(keyword, "opacity") == 0) { sscanf(value, "%d", &opacity); if (opacity < 1) opacity = 1; if (opacity > 100) opacity = 100; } else if (strcmp(keyword, "border_rgb") == 0) { GetColor(value, borderrgb); } else if (strcmp(keyword, "select_rgb") == 0) { GetColor(value, selectrgb); } else if (strcmp(keyword, "paste_rgb") == 0) { GetColor(value, pastergb); } else if (strcmp(keyword, "new_mag") == 0) { sscanf(value, "%d", &newmag); if (newmag < 0) newmag = 0; if (newmag > MAX_MAG) newmag = MAX_MAG; } else if (strcmp(keyword, "new_remove_sel") == 0) { newremovesel = value[0] == '1'; } else if (strcmp(keyword, "open_remove_sel") == 0) { openremovesel = value[0] == '1'; } else if (strcmp(keyword, "save_xrle") == 0) { savexrle = value[0] == '1'; } else if (strcmp(keyword, "max_patterns") == 0) { sscanf(value, "%d", &maxpatterns); if (maxpatterns < 1) maxpatterns = 1; if (maxpatterns > MAX_RECENT) maxpatterns = MAX_RECENT; } else if (strcmp(keyword, "recent_pattern") == 0) { if (numpatterns < maxpatterns && value[0]) { // append path to recentpatterns if file exists std::string path = value; if (path.find("Patterns/") == 0 || FileExists(userdir + path)) { recentpatterns.push_back(path); numpatterns++; } } } } reader.close(); // stacklayers and tilelayers must not both be true if (stacklayers && tilelayers) tilelayers = false; } golly-3.3-src/gui-common/select.cpp0000644000175000017500000020541613273534663014274 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, PollerReset, etc #include "prefs.h" // for randomfill, etc #include "status.h" // for Stringify, etc #include "undo.h" // for currlayer->undoredo->... #include "algos.h" // for *_ALGO, CreateNewUniverse #include "layer.h" // for currlayer, MarkLayerDirty, etc #include "view.h" // for OutsideLimits, etc #include "control.h" // for generating, etc #include "file.h" // for CreateUniverse #include "select.h" #include // for rand #ifdef ANDROID_GUI #include "jnicalls.h" // for BeginProgress, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for BeginProgress, etc #endif #ifdef IOS_GUI #import "PatternViewController.h" // for BeginProgress, etc #endif // ----------------------------------------------------------------------------- Selection::Selection() { exists = false; } // ----------------------------------------------------------------------------- Selection::Selection(int t, int l, int b, int r) { // create rectangular selection if given edges are valid exists = (t <= b && l <= r); if (exists) { seltop = t; selleft = l; selbottom = b; selright = r; } } // ----------------------------------------------------------------------------- Selection::~Selection() { // no need to do anything at the moment } // ----------------------------------------------------------------------------- bool Selection::operator==(const Selection& s) const { if (!exists && !s.exists) { // neither selection exists return true; } else if (exists && s.exists) { // check if edges match return (seltop == s.seltop && selleft == s.selleft && selbottom == s.selbottom && selright == s.selright); } else { // one selection exists but not the other return false; } } // ----------------------------------------------------------------------------- bool Selection::operator!=(const Selection& s) const { return !(*this == s); } // ----------------------------------------------------------------------------- bool Selection::Exists() { return exists; } // ----------------------------------------------------------------------------- void Selection::Deselect() { exists = false; } // ----------------------------------------------------------------------------- bool Selection::TooBig() { return OutsideLimits(seltop, selleft, selbottom, selright); } // ----------------------------------------------------------------------------- void Selection::DisplaySize() { if (inscript) return; bigint wd = selright; wd -= selleft; wd += bigint::one; bigint ht = selbottom; ht -= seltop; ht += bigint::one; std::string msg = "Selection width x height = "; msg += Stringify(wd); msg += " x "; msg += Stringify(ht); #ifdef WEB_GUI msg += " (right-click on it to perform actions)"; #endif SetMessage(msg.c_str()); } // ----------------------------------------------------------------------------- void Selection::SetRect(int x, int y, int wd, int ht) { exists = (wd > 0 && ht > 0); if (exists) { seltop = y; selleft = x; // avoid int overflow ht--; wd--; selbottom = y; selbottom += ht; selright = x; selright += wd; } } // ----------------------------------------------------------------------------- void Selection::GetRect(int* x, int* y, int* wd, int* ht) { *x = selleft.toint(); *y = seltop.toint(); *wd = selright.toint() - *x + 1; *ht = selbottom.toint() - *y + 1; } // ----------------------------------------------------------------------------- void Selection::SetEdges(bigint& t, bigint& l, bigint& b, bigint& r) { exists = true; seltop = t; selleft = l; selbottom = b; selright = r; CheckGridEdges(); } // ----------------------------------------------------------------------------- void Selection::CheckGridEdges() { if (exists) { // change selection edges if necessary to ensure they are inside a bounded grid if (currlayer->algo->gridwd > 0) { if (selleft > currlayer->algo->gridright || selright < currlayer->algo->gridleft) { exists = false; // selection is outside grid return; } if (selleft < currlayer->algo->gridleft) selleft = currlayer->algo->gridleft; if (selright > currlayer->algo->gridright) selright = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (seltop > currlayer->algo->gridbottom || selbottom < currlayer->algo->gridtop) { exists = false; // selection is outside grid return; } if (seltop < currlayer->algo->gridtop) seltop = currlayer->algo->gridtop; if (selbottom > currlayer->algo->gridbottom) selbottom = currlayer->algo->gridbottom; } } } // ----------------------------------------------------------------------------- bool Selection::Contains(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop <= t && selleft <= l && selbottom >= b && selright >= r ); } // ----------------------------------------------------------------------------- bool Selection::Outside(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop > b || selleft > r || selbottom < t || selright < l ); } // ----------------------------------------------------------------------------- bool Selection::ContainsCell(int x, int y) { return ( x >= selleft.toint() && x <= selright.toint() && y >= seltop.toint() && y <= selbottom.toint() ); } // ----------------------------------------------------------------------------- bool Selection::SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // compare patterns in given algos and call SaveCellChange for each different cell BeginProgress("Saving cell changes"); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int oldstate = oldalgo->getcell(cx, cy); int newstate = newalgo->getcell(cx, cy); if ( oldstate != newstate ) { // assume this is only called if allowundo currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void Selection::Advance() { if (generating) return; if (!exists) { ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { ErrorMessage(empty_selection); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { ErrorMessage(empty_selection); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bool boundedgrid = currlayer->algo->unbounded && (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection encloses entire pattern; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Contains(top, left, bottom, right) ) { generating = true; PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) currlayer->algo->CreateBorderCells(); currlayer->algo->step(); if (boundedgrid) currlayer->algo->DeleteBorderCells(); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); generating = false; // clear 1-cell thick strips just outside selection ClearOutside(); MarkLayerDirty(); UpdateEverything(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that intersection is within setcell/getcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // create a temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype); if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, "Saving selection") ) { delete tempalgo; return; } if ( tempalgo->isEmpty() ) { ErrorMessage(empty_selection); delete tempalgo; return; } // advance temporary universe by one gen generating = true; PollerReset(); tempalgo->setIncrement(1); if (boundedgrid) tempalgo->CreateBorderCells(); tempalgo->step(); if (boundedgrid) tempalgo->DeleteBorderCells(); generating = false; if ( !tempalgo->isEmpty() ) { // temporary pattern might have expanded bigint temptop, templeft, tempbottom, tempright; tempalgo->findedges(&temptop, &templeft, &tempbottom, &tempright); if (temptop < top) top = temptop; if (templeft < left) left = templeft; if (tempbottom > bottom) bottom = tempbottom; if (tempright > right) right = tempright; // but ignore live cells created outside selection edges if (top < seltop) top = seltop; if (left < selleft) left = selleft; if (bottom > selbottom) bottom = selbottom; if (right > selright) right = selright; } if (savecells) { // compare selection rect in currlayer->algo and tempalgo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(currlayer->algo, tempalgo, top.toint(), left.toint(), bottom.toint(), right.toint()) ) { if ( !currlayer->undoredo->RememberCellChanges("Advance Selection", currlayer->dirty) ) { // pattern inside selection didn't change delete tempalgo; return; } } else { currlayer->undoredo->ForgetCellChanges(); delete tempalgo; return; } } // copy all cells in new selection from tempalgo to currlayer->algo CopyAllRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, "Copying advanced selection"); delete tempalgo; MarkLayerDirty(); UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::AdvanceOutside() { if (generating) return; if (!exists) { ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { ErrorMessage(empty_outside); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection encloses entire pattern if (Contains(top, left, bottom, right)) { ErrorMessage(empty_outside); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bool boundedgrid = currlayer->algo->unbounded && (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection is completely outside pattern edges; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Outside(top, left, bottom, right) ) { generating = true; PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) currlayer->algo->CreateBorderCells(); currlayer->algo->step(); if (boundedgrid) currlayer->algo->DeleteBorderCells(); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); generating = false; // clear selection in case pattern expanded into it Clear(); MarkLayerDirty(); UpdateEverything(); return; } // check that pattern is within setcell/getcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern is outside +/- 10^9 boundary."); return; } lifealgo* oldalgo = NULL; if (savecells) { // copy current pattern to oldalgo, using same type and gen count // so we can switch to oldalgo if user decides to abort below oldalgo = CreateNewUniverse(currlayer->algtype); if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); oldalgo->setGeneration( currlayer->algo->getGeneration() ); if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, oldalgo, false, "Saving pattern") ) { delete oldalgo; return; } } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy (and kill) live cells in selection to new universe int iseltop = seltop.toint(); int iselleft = selleft.toint(); int iselbottom = selbottom.toint(); int iselright = selright.toint(); if ( !CopyRect(iseltop, iselleft, iselbottom, iselright, currlayer->algo, newalgo, true, "Saving and erasing selection") ) { // aborted, so best to restore selection if ( !newalgo->isEmpty() ) { newalgo->findedges(&top, &left, &bottom, &right); CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), newalgo, currlayer->algo, false, "Restoring selection"); } delete newalgo; if (savecells) delete oldalgo; UpdateEverything(); return; } // advance current universe by 1 generation generating = true; PollerReset(); currlayer->algo->setIncrement(1); if (boundedgrid) currlayer->algo->CreateBorderCells(); currlayer->algo->step(); if (boundedgrid) currlayer->algo->DeleteBorderCells(); generating = false; if ( !currlayer->algo->isEmpty() ) { // find new edges and copy current pattern to new universe, // except for any cells that were created in selection // (newalgo contains the original selection) bigint t, l, b, r; currlayer->algo->findedges(&t, &l, &b, &r); int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; int v = 0; bool abort = false; BeginProgress("Copying advanced pattern"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; // only copy cell if outside selection if ( cx < iselleft || cx > iselright || cy < iseltop || cy > iselbottom ) { newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); if (abort && savecells) { // revert back to pattern saved in oldalgo delete newalgo; delete currlayer->algo; currlayer->algo = oldalgo; SetGenIncrement(); UpdateEverything(); return; } } // switch to new universe (best to do this even if aborted) delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state; note that we need to compare // the union of the original pattern's rect and the new pattern's rect int otop = top.toint(); int oleft = left.toint(); int obottom = bottom.toint(); int oright = right.toint(); if (!currlayer->algo->isEmpty()) { currlayer->algo->findedges(&top, &left, &bottom, &right); int ntop = top.toint(); int nleft = left.toint(); int nbottom = bottom.toint(); int nright = right.toint(); if (ntop < otop) otop = ntop; if (nleft < oleft) oleft = nleft; if (nbottom > obottom) obottom = nbottom; if (nright > oright) oright = nright; } if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { delete oldalgo; if ( !currlayer->undoredo->RememberCellChanges("Advance Outside", currlayer->dirty) ) { // pattern outside selection didn't change UpdateEverything(); return; } } else { // revert back to pattern saved in oldalgo currlayer->undoredo->ForgetCellChanges(); delete currlayer->algo; currlayer->algo = oldalgo; SetGenIncrement(); UpdateEverything(); return; } } MarkLayerDirty(); UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::Modify(const int x, const int y, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev) { // assume tapped point is somewhere inside selection pair lt = currlayer->view->screenPosOf(selleft, seltop, currlayer->algo); pair rb = currlayer->view->screenPosOf(selright, selbottom, currlayer->algo); if (currlayer->view->getmag() > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << currlayer->view->getmag()) - 1; rb.second += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() > 1) { // allow for gap at scale 1:4 and above rb.first--; rb.second--; } } double wd = rb.first - lt.first + 1; double ht = rb.second - lt.second + 1; double onefifthx = lt.first + wd / 5.0; double fourfifthx = lt.first + wd * 4.0 / 5.0; double onefifthy = lt.second + ht / 5.0; double fourfifthy = lt.second + ht * 4.0 / 5.0; if ( y < onefifthy && x < onefifthx ) { // tap is near top left corner anchory = selbottom; anchorx = selright; } else if ( y < onefifthy && x > fourfifthx ) { // tap is near top right corner anchory = selbottom; anchorx = selleft; } else if ( y > fourfifthy && x > fourfifthx ) { // tap is near bottom right corner anchory = seltop; anchorx = selleft; } else if ( y > fourfifthy && x < onefifthx ) { // tap is near bottom left corner anchory = seltop; anchorx = selright; } else if ( x < onefifthx ) { // tap is near left edge *forceh = true; anchorx = selright; } else if ( x > fourfifthx ) { // tap is near right edge *forceh = true; anchorx = selleft; } else if ( y < onefifthy ) { // tap is near top edge *forcev = true; anchory = selbottom; } else if ( y > fourfifthy ) { // tap is near bottom edge *forcev = true; anchory = seltop; } else { // tap is in middle area, so move selection rather than resize *forceh = true; *forcev = true; } } // ----------------------------------------------------------------------------- void Selection::Move(const bigint& xcells, const bigint& ycells) { if (exists) { selleft += xcells; selright += xcells; seltop += ycells; selbottom += ycells; CheckGridEdges(); } } // ----------------------------------------------------------------------------- void Selection::SetLeftRight(const bigint& x, const bigint& anchorx) { if (x <= anchorx) { selleft = x; selright = anchorx; } else { selleft = anchorx; selright = x; } exists = true; } // ----------------------------------------------------------------------------- void Selection::SetTopBottom(const bigint& y, const bigint& anchory) { if (y <= anchory) { seltop = y; selbottom = anchory; } else { seltop = anchory; selbottom = y; } exists = true; } // ----------------------------------------------------------------------------- void Selection::Fit() { bigint newx = selright; newx -= selleft; newx += bigint::one; newx.div2(); newx += selleft; bigint newy = selbottom; newy -= seltop; newy += bigint::one; newy.div2(); newy += seltop; int mag = MAX_MAG; while (true) { currlayer->view->setpositionmag(newx, newy, mag); if (currlayer->view->contains(selleft, seltop) && currlayer->view->contains(selright, selbottom)) break; mag--; } } // ----------------------------------------------------------------------------- void Selection::Shrink(bool fit) { if (!exists) return; // check if there is no pattern if (currlayer->algo->isEmpty()) { ErrorMessage(empty_selection); if (fit) FitSelection(); return; } // check if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // shrink edges SaveCurrentSelection(); seltop = top; selleft = left; selbottom = bottom; selright = right; RememberNewSelection("Shrink Selection"); DisplaySelectionSize(); if (fit) FitSelection(); // calls UpdateEverything else UpdatePatternAndStatus(); return; } // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { ErrorMessage(empty_selection); if (fit) FitSelection(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); if (fit) FitSelection(); return; } // the easy way to shrink selection is to create a new temporary universe, // copy selection into new universe and then call findedges; // if only 2 cell states then use qlife because its findedges call is faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, "Copying selection") ) { if ( tempalgo->isEmpty() ) { ErrorMessage(empty_selection); } else { SaveCurrentSelection(); tempalgo->findedges(&seltop, &selleft, &selbottom, &selright); RememberNewSelection("Shrink Selection"); DisplaySelectionSize(); if (!fit) UpdatePatternAndStatus(); } } delete tempalgo; if (fit) FitSelection(); } // ----------------------------------------------------------------------------- bool Selection::Visible(gRect* visrect) { if (!exists) return false; pair lt = currlayer->view->screenPosOf(selleft, seltop, currlayer->algo); pair rb = currlayer->view->screenPosOf(selright, selbottom, currlayer->algo); if (lt.first > currlayer->view->getxmax() || rb.first < 0 || lt.second > currlayer->view->getymax() || rb.second < 0) { // no part of selection is visible return false; } // all or some of selection is visible in viewport; // only set visible rectangle if requested if (visrect) { // first we must clip coords to viewport if (lt.first < 0) lt.first = 0; if (lt.second < 0) lt.second = 0; if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); if (currlayer->view->getmag() > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << currlayer->view->getmag()) - 1; rb.second += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } // clip to viewport again if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); } visrect->x = lt.first; visrect->y = lt.second; visrect->width = rb.first - lt.first + 1; visrect->height = rb.second - lt.second + 1; } return true; } // ----------------------------------------------------------------------------- void Selection::EmptyUniverse() { // save current step, scale, position and gen count int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; int savemag = currlayer->view->getmag(); bigint savex = currlayer->view->x; bigint savey = currlayer->view->y; bigint savegen = currlayer->algo->getGeneration(); // kill all live cells by replacing the current universe with a // new, empty universe which also uses the same rule CreateUniverse(); // restore step, scale, position and gen count currlayer->currbase = savebase; SetStepExponent(saveexpo); // SetStepExponent calls SetGenIncrement currlayer->view->setpositionmag(savex, savey, savemag); currlayer->algo->setGeneration(savegen); UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void Selection::Clear() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( !savecells && Contains(top, left, bottom, right) ) { // selection encloses entire pattern so just create empty universe EmptyUniverse(); MarkLayerDirty(); return; } // no need to do anything if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // can only use setcell in limited domain if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // clear all live cells in selection int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; bool selchanged = false; BeginProgress("Clearing selection"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; curralgo->setcell(cx, cy, 0); selchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } if (selchanged) curralgo->endofpattern(); EndProgress(); if (selchanged) { if (savecells) currlayer->undoredo->RememberCellChanges("Clear", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- bool Selection::SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r) { if ( OutsideLimits(t, l, b, r) ) { ErrorMessage(pattern_too_big); return false; } int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); // save ALL cells if selection is completely outside pattern edges bool saveall = Outside(t, l, b, r); // integer selection edges must not be outside pattern edges int stop = itop; int sleft = ileft; int sbottom = ibottom; int sright = iright; if (!saveall) { if (seltop > t) stop = seltop.toint(); if (selleft > l) sleft = selleft.toint(); if (selbottom < b) sbottom = selbottom.toint(); if (selright < r) sright = selright.toint(); } int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; int v = 0; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress("Saving outside selection"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (saveall || cx < sleft || cx > sright || cy < stop || cy > sbottom) { // cell is outside selection edges currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } EndProgress(); if (abort) currlayer->undoredo->ForgetCellChanges(); return !abort; } // ----------------------------------------------------------------------------- void Selection::ClearOutside() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; // no need to do anything if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); if (savecells) { // save live cells outside selection if ( !SaveOutside(top, left, bottom, right) ) { return; } } else { // create empty universe if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { EmptyUniverse(); MarkLayerDirty(); return; } } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy live cells in selection to new universe if ( CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, "Saving selection") ) { // delete old universe and point currlayer->algo at new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); if (savecells) currlayer->undoredo->RememberCellChanges("Clear Outside", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } else { // CopyRect was aborted, so don't change current universe delete newalgo; if (savecells) currlayer->undoredo->ForgetCellChanges(); } } // ----------------------------------------------------------------------------- void Selection::AddEOL(char* &chptr) { // use LF on Mac *chptr = '\n'; chptr += 1; } // ----------------------------------------------------------------------------- const int WRLE_NONE = -3; const int WRLE_EOP = -2; const int WRLE_NEWLINE = -1; void Selection::AddRun(int state, // in: state of cell to write int multistate, // true if #cell states > 2 unsigned int &run, // in and out unsigned int &linelen, // ditto char* &chptr) // ditto { // output of RLE pattern data is channelled thru here to make it easier to // ensure all lines have <= maxrleline characters const unsigned int maxrleline = 70; unsigned int i, numlen; char numstr[32]; if ( run > 1 ) { sprintf(numstr, "%u", run); numlen = (unsigned int)strlen(numstr); } else { numlen = 0; // no run count shown if 1 } // keep linelen <= maxrleline if ( linelen + numlen + 1 + multistate > maxrleline ) { AddEOL(chptr); linelen = 0; } i = 0; while (i < numlen) { *chptr = numstr[i]; chptr += 1; i++; } if (multistate) { if (state <= 0) *chptr = ".$!"[-state]; else { if (state > 24) { int hi = (state - 25) / 24; *chptr = hi + 'p'; chptr += 1; linelen += 1; state -= (hi + 1) * 24; } *chptr = 'A' + state - 1; } } else *chptr = "!$bo"[state+2]; chptr += 1; linelen += numlen + 1; run = 0; // reset run count } // ----------------------------------------------------------------------------- void Selection::CopyToClipboard(bool cut) { // can only use getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return; } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); unsigned int wd = iright - ileft + 1; unsigned int ht = ibottom - itop + 1; // convert cells in selection to RLE data in textptr char* textptr; char* etextptr; int cursize = 4096; textptr = (char*)malloc(cursize); if (textptr == NULL) { ErrorMessage("Not enough memory for clipboard data!"); return; } etextptr = textptr + cursize; // add RLE header line sprintf(textptr, "x = %u, y = %u, rule = %s", wd, ht, currlayer->algo->getrule()); char* chptr = textptr; chptr += strlen(textptr); AddEOL(chptr); // save start of data in case livecount is zero int datastart = int(chptr - textptr); // add RLE pattern data unsigned int livecount = 0; unsigned int linelen = 0; unsigned int brun = 0; unsigned int orun = 0; unsigned int dollrun = 0; int laststate; int cx, cy; int v = 0; // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; if (cut) BeginProgress("Cutting selection"); else BeginProgress("Copying selection"); lifealgo* curralgo = currlayer->algo; int multistate = curralgo->NumCellStates() > 2; for ( cy=itop; cy<=ibottom; cy++ ) { laststate = WRLE_NONE; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip > 0) { // have exactly "skip" empty cells here if (laststate == 0) { brun += skip; } else { if (orun > 0) { // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); } laststate = 0; brun = skip; } } if (skip >= 0) { // found next live cell cx += skip; livecount++; if (cut) { curralgo->setcell(cx, cy, 0); if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } if (laststate == v) { orun++; } else { if (dollrun > 0) // output current run of $ chars AddRun(WRLE_NEWLINE, multistate, dollrun, linelen, chptr); if (brun > 0) // output current run of dead cells AddRun(0, multistate, brun, linelen, chptr); if (orun > 0) // output current run of other live cells AddRun(laststate, multistate, orun, linelen, chptr); laststate = v; orun = 1; } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } if (chptr + 60 >= etextptr) { // nearly out of space; try to increase allocation char* ntxtptr = (char*) realloc(textptr, 2*cursize); if (ntxtptr == 0) { ErrorMessage("No more memory for clipboard data!"); // don't return here -- best to set abort flag and break so that // partially cut/copied portion gets saved to clipboard abort = true; break; } chptr = ntxtptr + (chptr - textptr); cursize *= 2; etextptr = ntxtptr + cursize; textptr = ntxtptr; } } if (abort) break; // end of current row if (laststate == 0) // forget dead cells at end of row brun = 0; else if (laststate >= 0) // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); dollrun++; } if (livecount == 0) { // no live cells in selection so simplify RLE data to "!" chptr = textptr + datastart; *chptr = '!'; chptr++; } else { // terminate RLE data dollrun = 1; AddRun(WRLE_EOP, multistate, dollrun, linelen, chptr); if (cut) currlayer->algo->endofpattern(); } AddEOL(chptr); *chptr = 0; EndProgress(); if (cut && livecount > 0) { if (savecells) currlayer->undoredo->RememberCellChanges("Cut", currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); UpdatePatternAndStatus(); } CopyTextToClipboard(textptr); free(textptr); } // ----------------------------------------------------------------------------- bool Selection::CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left) { bigint selht = selbottom; selht -= seltop; selht += 1; bigint selwd = selright; selwd -= selleft; selwd += 1; if ( ht > selht || wd > selwd ) return false; // set paste rectangle's top left cell coord top = seltop; left = selleft; return true; } // ----------------------------------------------------------------------------- void Selection::RandomFill() { if (!exists) return; // can only use getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); // no need to kill cells if selection is empty bool killcells = !currlayer->algo->isEmpty(); if ( killcells ) { // find pattern edges and compare with selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so create empty universe if (savecells) { // don't kill pattern otherwise we can't use SaveCellChange below } else { EmptyUniverse(); killcells = false; } } else if (Outside(top, left, bottom, right)) { // selection is completely outside pattern edges killcells = false; } } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress("Randomly filling selection"); int cx, cy; lifealgo* curralgo = currlayer->algo; int livestates = curralgo->NumRandomizedCellStates() - 1; // don't count dead state for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { // randomfill is from 1..100 if (savecells) { // remember cell change only if state changes int oldstate = curralgo->getcell(cx, cy); if ((rand() % 100) < randomfill) { int newstate = livestates < 2 ? 1 : 1 + (rand() % livestates); if (oldstate != newstate) { curralgo->setcell(cx, cy, newstate); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } } else if (killcells && oldstate > 0) { curralgo->setcell(cx, cy, 0); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, 0); } } else { if ((rand() % 100) < randomfill) { if (livestates < 2) { curralgo->setcell(cx, cy, 1); } else { curralgo->setcell(cx, cy, 1 + (rand() % livestates)); } } else if (killcells) { curralgo->setcell(cx, cy, 0); } } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } currlayer->algo->endofpattern(); EndProgress(); if (savecells) currlayer->undoredo->RememberCellChanges("Random Fill", currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- bool Selection::FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int v = 0; int cx, cy, newx, newy, newxinc, newyinc; if (topbottom) { BeginProgress("Flipping top-bottom"); newy = ibottom; newyinc = -1; newxinc = 1; } else { BeginProgress("Flipping left-right"); newy = itop; newyinc = 1; newxinc = -1; } for ( cy=itop; cy<=ibottom; cy++ ) { newx = topbottom ? ileft : iright; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newx += newxinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newx += newxinc; } if (abort) break; newy += newyinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::Flip(bool topbottom, bool inundoredo) { if (!exists) return false; if (topbottom) { if (seltop == selbottom) return true; } else { if (selleft == selright) return true; } if (currlayer->algo->isEmpty()) return true; bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); bigint stop = seltop; bigint sleft = selleft; bigint sbottom = selbottom; bigint sright = selright; bool simpleflip; if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so we may only need to flip a smaller rectangle if (topbottom) { bigint tdiff = top; tdiff -= stop; bigint bdiff = sbottom; bdiff -= bottom; bigint mindiff = tdiff; if (bdiff < mindiff) mindiff = bdiff; stop += mindiff; sbottom -= mindiff; sleft = left; sright = right; } else { bigint ldiff = left; ldiff -= sleft; bigint rdiff = sright; rdiff -= right; bigint mindiff = ldiff; if (rdiff < mindiff) mindiff = rdiff; sleft += mindiff; sright -= mindiff; stop = top; sbottom = bottom; } simpleflip = true; } else { // selection encloses part of pattern so we can clip some selection edges // if they are outside the pattern edges if (topbottom) { if (sleft < left) sleft = left; if (sright > right) sright = right; } else { if (stop < top) stop = top; if (sbottom > bottom) sbottom = bottom; } simpleflip = false; } // can only use getcell/setcell in limited domain if ( OutsideLimits(stop, sbottom, sleft, sright) ) { ErrorMessage(selection_too_big); return false; } int itop = stop.toint(); int ileft = sleft.toint(); int ibottom = sbottom.toint(); int iright = sright.toint(); if (simpleflip) { // selection encloses all of pattern so we can flip into new universe // (must be same type) without killing live cells in selection lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); if ( FlipRect(topbottom, currlayer->algo, newalgo, false, itop, ileft, ibottom, iright) ) { // switch to newalgo delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); } else { // user aborted flip delete newalgo; return false; } } else { // flip into temporary universe and kill all live cells in selection; // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); if ( FlipRect(topbottom, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright) ) { // find pattern edges in temporary universe (could be much smaller) // and copy temporary pattern into current universe tempalgo->findedges(&top, &left, &bottom, &right); CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, false, "Adding flipped selection"); delete tempalgo; } else { // user aborted flip so flip tempalgo pattern back into current universe FlipRect(topbottom, tempalgo, currlayer->algo, false, itop, ileft, ibottom, iright); delete tempalgo; return false; } } // flips are always reversible so no need to use SaveCellChange and RememberCellChanges if (allowundo && !currlayer->stayclean && !inundoredo) { //!!! if (inscript) SavePendingChanges(); currlayer->undoredo->RememberFlip(topbottom, currlayer->dirty); } // update currlayer->dirty AFTER RememberFlip if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); return true; } // ----------------------------------------------------------------------------- const char* rotate_clockwise = "Rotating selection +90 degrees"; const char* rotate_anticlockwise = "Rotating selection -90 degrees"; bool Selection::RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, v=0; if (clockwise) { BeginProgress(rotate_clockwise); newx = nright; newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); newx = nleft; newyinc = -1; newxinc = 1; } for ( cy=itop; cy<=ibottom; cy++ ) { newy = clockwise ? ntop : nbottom; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newy += newyinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo) { // create new universe of same type as current universe lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy all live cells to new universe, rotating the coords by +/- 90 degrees int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, firstnewy, v=0; if (clockwise) { BeginProgress(rotate_clockwise); firstnewy = newtop.toint(); newx = newright.toint(); newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); firstnewy = newbottom.toint(); newx = newleft.toint(); newyinc = -1; newxinc = 1; } lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { newy = firstnewy; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; newy += newyinc * skip; newalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } newalgo->endofpattern(); EndProgress(); if (abort) { delete newalgo; } else { // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; // switch to new universe and display results delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); DisplaySelectionSize(); // rotating entire pattern is easily reversible so no need to use // SaveCellChange and RememberCellChanges in this case if (allowundo && !currlayer->stayclean && !inundoredo) { //!!! if (inscript) SavePendingChanges(); currlayer->undoredo->RememberRotation(clockwise, currlayer->dirty); } // update currlayer->dirty AFTER RememberRotation if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); } return !abort; } // ----------------------------------------------------------------------------- bool Selection::Rotate(bool clockwise, bool inundoredo) { if (!exists) return false; // determine rotated selection edges bigint halfht = selbottom; halfht -= seltop; halfht.div2(); bigint halfwd = selright; halfwd -= selleft; halfwd.div2(); bigint midy = seltop; midy += halfht; bigint midx = selleft; midx += halfwd; bigint newtop = midy; newtop += selleft; newtop -= midx; bigint newbottom = midy; newbottom += selright; newbottom -= midx; bigint newleft = midx; newleft += seltop; newleft -= midy; bigint newright = midx; newright += selbottom; newright -= midy; if (!inundoredo) { // check if rotated selection edges are outside bounded grid if ((currlayer->algo->gridwd > 0 && (newleft < currlayer->algo->gridleft || newright > currlayer->algo->gridright)) || (currlayer->algo->gridht > 0 && (newtop < currlayer->algo->gridtop || newbottom > currlayer->algo->gridbottom))) { ErrorMessage("New selection would be outside grid boundary."); return false; } } // if there is no pattern then just rotate the selection edges if (currlayer->algo->isEmpty()) { SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; RememberNewSelection("Rotation"); DisplaySelectionSize(); UpdatePatternAndStatus(); return true; } // if the current selection and the rotated selection are both outside the // pattern edges (ie. both are empty) then just rotate the selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( (seltop > bottom || selbottom < top || selleft > right || selright < left) && (newtop > bottom || newbottom < top || newleft > right || newright < left) ) { SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; RememberNewSelection("Rotation"); DisplaySelectionSize(); UpdatePatternAndStatus(); return true; } // can only use nextcell/getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return false; } // make sure rotated selection edges are also within limits if ( OutsideLimits(newtop, newbottom, newleft, newright) ) { ErrorMessage("New selection would be outside +/- 10^9 boundary."); return false; } // use faster method if selection encloses entire pattern if (Contains(top, left, bottom, right)) { return RotatePattern(clockwise, newtop, newbottom, newleft, newright, inundoredo); } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int ntop = newtop.toint(); int nleft = newleft.toint(); int nbottom = newbottom.toint(); int nright = newright.toint(); // save cell changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier rotation bool savecells = allowundo && !currlayer->stayclean && !inundoredo; //!!! if (savecells && inscript) SavePendingChanges(); lifealgo* oldalgo = NULL; int otop = itop; int oleft = ileft; int obottom = ibottom; int oright = iright; if (savecells) { // copy current pattern to oldalgo using union of old and new selection rects if (otop > ntop) otop = ntop; if (oleft > nleft) oleft = nleft; if (obottom < nbottom) obottom = nbottom; if (oright < nright) oright = nright; oldalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); if ( !CopyRect(otop, oleft, obottom, oright, currlayer->algo, oldalgo, false, "Saving part of pattern") ) { delete oldalgo; return false; } } // create temporary universe; doesn't need to match current universe so // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy (and kill) live cells in selection to temporary universe, // rotating the new coords by +/- 90 degrees if ( !RotateRect(clockwise, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright, ntop, nleft, nbottom, nright) ) { // user aborted rotation if (savecells) { // use oldalgo to restore erased selection CopyRect(itop, ileft, ibottom, iright, oldalgo, currlayer->algo, false, "Restoring selection"); delete oldalgo; } else { // restore erased selection by rotating tempalgo in opposite direction // back into the current universe RotateRect(!clockwise, tempalgo, currlayer->algo, false, ntop, nleft, nbottom, nright, itop, ileft, ibottom, iright); } delete tempalgo; UpdatePatternAndStatus(); return false; } // copy rotated selection from temporary universe to current universe; // check if new selection rect is outside modified pattern edges currlayer->algo->findedges(&top, &left, &bottom, &right); if ( newtop > bottom || newbottom < top || newleft > right || newright < left ) { // safe to use fast nextcell calls CopyRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, false, "Adding rotated selection"); } else { // have to use slow getcell calls CopyAllRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, "Pasting rotated selection"); } // don't need temporary universe any more delete tempalgo; // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { Selection oldsel(itop, ileft, ibottom, iright); Selection newsel(ntop, nleft, nbottom, nright); currlayer->undoredo->RememberRotation(clockwise, oldsel, newsel, currlayer->dirty); } else { currlayer->undoredo->ForgetCellChanges(); Warning("You can't undo this change!"); } delete oldalgo; } // display results DisplaySelectionSize(); if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); return true; } golly-3.3-src/gui-common/render.h0000644000175000017500000000143113145740437013724 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _RENDER_H_ #define _RENDER_H_ #include "utils.h" // for gRect class Layer; // Routines for rendering the pattern view: #ifdef WEB_GUI bool InitOGLES2(); // Return true if we can create the shaders and program objects // required by OpenGL ES 2. #endif void DrawPattern(int tileindex); // Draw the current pattern, grid lines, selection, etc. // The given tile index is only used when drawing tiled layers. void InitPaste(Layer* pastelayer, gRect& bbox); // Initialize some globals used to draw the pattern stored in pastelayer. // The given bounding box is not necessarily the *minimal* bounding box because // the paste pattern might have blank borders (in fact it could be empty). #endif golly-3.3-src/gui-common/undo.cpp0000644000175000017500000015303413247734027013755 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "writepattern.h" // for MC_format, XRLE_format #include "select.h" // for Selection #include "view.h" // for OutsideLimits, nopattupdate, etc #include "utils.h" // for Warning, Fatal, etc #include "algos.h" // for algo_type #include "layer.h" // for currlayer, numclones, MarkLayerDirty, etc #include "prefs.h" // for allowundo, etc #include "control.h" // for RestorePattern #include "file.h" // for SetPatternTitle #include "undo.h" // ----------------------------------------------------------------------------- const char* lack_of_memory = "Due to lack of memory, some changes can't be undone!"; // the following prefixes are used when creating temporary file names const char* genchange_prefix = "gg_"; const char* setgen_prefix = "gs_"; const char* dupe1_prefix = "g1_"; const char* dupe2_prefix = "g2_"; const char* dupe3_prefix = "g3_"; const char* dupe4_prefix = "g4_"; const char* dupe5_prefix = "g5_"; const char* dupe6_prefix = "g6_"; // ----------------------------------------------------------------------------- // the next two classes are needed because Golly allows multiple starting points // (by setting the generation count back to 0), so we need to ensure that a Reset // goes back to the correct starting info class VariableInfo { public: VariableInfo() {} ~VariableInfo() {} // note that we have to remember pointer to layer and not its index // (the latter can change if user adds/deletes/moves a layer) Layer* layerptr; std::string savename; bigint savex; bigint savey; int savemag; int savebase; int saveexpo; }; class StartingInfo { public: StartingInfo(StartingInfo* dupe, Layer* oldlayer, Layer* newlayer); ~StartingInfo(); void Restore(); void RemoveClone(Layer* cloneptr); // this info is the same in each clone bool savedirty; algo_type savealgo; std::string saverule; // this info can be different in each clone VariableInfo layer[MAX_LAYERS]; int count; }; // ----------------------------------------------------------------------------- StartingInfo::StartingInfo(StartingInfo* dupe, Layer* oldlayer, Layer* newlayer) { if (dupe) { // called from DuplicateHistory so duplicate given starting info savedirty = dupe->savedirty; savealgo = dupe->savealgo; saverule = dupe->saverule; // new duplicate layer is not a clone count = 0; for (int n = 0; n < dupe->count; n++) { if (dupe->layer[n].layerptr == oldlayer) { layer[0].layerptr = newlayer; layer[0].savename = dupe->layer[n].savename; layer[0].savex = dupe->layer[n].savex; layer[0].savey = dupe->layer[n].savey; layer[0].savemag = dupe->layer[n].savemag; layer[0].savebase = dupe->layer[n].savebase; layer[0].saveexpo = dupe->layer[n].saveexpo; count = 1; break; } } } else { // save current starting info (set by most recent SaveStartingPattern) savedirty = currlayer->startdirty; savealgo = currlayer->startalgo; saverule = currlayer->startrule; // save variable info for currlayer and its clones (if any) count = 0; for (int i = 0; i < numlayers; i++) { Layer* lptr = GetLayer(i); if (lptr == currlayer || (lptr->cloneid > 0 && lptr->cloneid == currlayer->cloneid)) { layer[count].layerptr = lptr; layer[count].savename = lptr->startname; layer[count].savex = lptr->startx; layer[count].savey = lptr->starty; layer[count].savemag = lptr->startmag; layer[count].savebase = lptr->startbase; layer[count].saveexpo = lptr->startexpo; count++; } } if (count == 0) Warning("Bug detected in StartingInfo ctor!"); } } // ----------------------------------------------------------------------------- StartingInfo::~StartingInfo() { // no need to do anything } // ----------------------------------------------------------------------------- void StartingInfo::Restore() { // restore starting info (for use by next ResetPattern) currlayer->startdirty = savedirty; currlayer->startalgo = savealgo; currlayer->startrule = saverule; // restore variable info for currlayer and its clones (if any); // note that currlayer might have changed since the starting info // was saved, and there might be more or fewer clones for (int i = 0; i < numlayers; i++) { Layer* lptr = GetLayer(i); for (int n = 0; n < count; n++) { if (lptr == layer[n].layerptr) { lptr->startname = layer[n].savename; lptr->startx = layer[n].savex; lptr->starty = layer[n].savey; lptr->startmag = layer[n].savemag; lptr->startbase = layer[n].savebase; lptr->startexpo = layer[n].saveexpo; break; } } } } // ----------------------------------------------------------------------------- void StartingInfo::RemoveClone(Layer* cloneptr) { for (int n = 0; n < count; n++) { if (layer[n].layerptr == cloneptr) { layer[n].layerptr = NULL; return; } } } // ----------------------------------------------------------------------------- // encapsulate change info stored in undo/redo lists typedef enum { cellstates, // one or more cell states were changed fliptb, // selection was flipped top-bottom fliplr, // selection was flipped left-right rotatecw, // selection was rotated clockwise rotateacw, // selection was rotated anticlockwise rotatepattcw, // pattern was rotated clockwise rotatepattacw, // pattern was rotated anticlockwise namechange, // layer name was changed // WARNING: code in UndoChange/RedoChange assumes only changes < selchange // can alter the layer's dirty state; ie. the olddirty/newdirty flags are // not used for all the following changes selchange, // selection was changed genchange, // pattern was generated setgen, // generation count was changed rulechange, // rule was changed algochange, // algorithm was changed scriptstart, // later changes were made by script scriptfinish // earlier changes were made by script } change_type; class ChangeNode { public: ChangeNode(change_type id); ~ChangeNode(); bool DoChange(bool undo); // do the undo/redo; if it returns false (eg. user has aborted a lengthy // rotate/flip operation) then cancel the undo/redo void ChangeCells(bool undo); // change cell states using cellinfo change_type changeid; // specifies the type of change bool olddirty; // layer's dirty state before change bool newdirty; // layer's dirty state after change // cellstates info cell_change* cellinfo; // dynamic array of cell changes unsigned int cellcount; // number of cell changes in array // rotatecw/rotateacw/selchange info Selection oldsel, newsel; // old and new selections // genchange info bool scriptgen; // gen change was done by script? std::string oldfile, newfile; // old and new pattern files bigint oldgen, newgen; // old and new generation counts bigint oldx, oldy, newx, newy; // old and new positions int oldmag, newmag; // old and new scales int oldbase, newbase; // old and new base steps int oldexpo, newexpo; // old and new step exponents StartingInfo* startinfo; // saves starting info for ResetPattern // also uses oldsel, newsel // setgen info bigint oldstartgen, newstartgen; // old and new startgen values bool oldsave, newsave; // old and new savestart states std::string oldtempstart, newtempstart; // old and new tempstart paths std::string oldcurrfile, newcurrfile; // old and new currfile paths // also uses oldgen, newgen // and startinfo // namechange info std::string oldname, newname; // old and new layer names Layer* whichlayer; // which layer was changed // also uses oldsave, newsave // and oldcurrfile, newcurrfile // rulechange info std::string oldrule, newrule; // old and new rules // also uses oldsel, newsel // algochange info algo_type oldalgo, newalgo; // old and new algorithm types // also uses oldrule, newrule // and oldsel, newsel }; // ----------------------------------------------------------------------------- ChangeNode::ChangeNode(change_type id) { changeid = id; startinfo = NULL; whichlayer = NULL; // simplifies UndoRedo::DeletingClone cellinfo = NULL; cellcount = 0; oldfile.clear(); newfile.clear(); oldtempstart.clear(); newtempstart.clear(); oldcurrfile.clear(); newcurrfile.clear(); } // ----------------------------------------------------------------------------- bool delete_all_temps = false; // ok to delete all temporary files? ChangeNode::~ChangeNode() { if (startinfo) delete startinfo; if (cellinfo) free(cellinfo); // it's always ok to delete oldfile and newfile if they exist if (!oldfile.empty() && FileExists(oldfile)) { RemoveFile(oldfile); } if (!newfile.empty() && FileExists(newfile)) { RemoveFile(newfile); } if (delete_all_temps) { // we're in ClearUndoRedo so it's safe to delete oldtempstart/newtempstart/oldcurrfile/newcurrfile // if they are in tempdir and not being used to store the current layer's starting pattern // (the latter condition allows user to Reset after disabling undo/redo) if (!oldtempstart.empty() && FileExists(oldtempstart) && oldtempstart.compare(0,tempdir.length(),tempdir) == 0 && oldtempstart != currlayer->currfile) { RemoveFile(oldtempstart); } if (!newtempstart.empty() && FileExists(newtempstart) && newtempstart.compare(0,tempdir.length(),tempdir) == 0 && newtempstart != currlayer->currfile) { RemoveFile(newtempstart); } if (!oldcurrfile.empty() && FileExists(oldcurrfile) && oldcurrfile.compare(0,tempdir.length(),tempdir) == 0 && oldcurrfile != currlayer->currfile) { RemoveFile(oldcurrfile); } if (!newcurrfile.empty() && FileExists(newcurrfile) && newcurrfile.compare(0,tempdir.length(),tempdir) == 0 && newcurrfile != currlayer->currfile) { RemoveFile(newcurrfile); } } } // ----------------------------------------------------------------------------- void ChangeNode::ChangeCells(bool undo) { // avoid possible pattern update during a setcell call (can happen if cellcount is large) nopattupdate = true; // change state of cell(s) stored in cellinfo array if (undo) { // we must undo the cell changes in reverse order in case // a script has changed the same cell more than once unsigned int i = cellcount; while (i > 0) { i--; currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].oldstate); } } else { unsigned int i = 0; while (i < cellcount) { currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].newstate); i++; } } if (cellcount > 0) currlayer->algo->endofpattern(); nopattupdate = false; } // ----------------------------------------------------------------------------- bool ChangeNode::DoChange(bool undo) { switch (changeid) { case cellstates: if (cellcount > 0) ChangeCells(undo); break; case fliptb: case fliplr: // pass in true so FlipSelection won't save changes or call MarkLayerDirty if (!FlipSelection(changeid == fliptb, true)) return false; break; case rotatepattcw: case rotatepattacw: // pass in true so RotateSelection won't save changes or call MarkLayerDirty if (!RotateSelection(changeid == rotatepattcw ? !undo : undo, true)) return false; break; case rotatecw: case rotateacw: if (cellcount > 0) ChangeCells(undo); // rotate selection edges if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } DisplaySelectionSize(); break; case selchange: if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } if (SelectionExists()) DisplaySelectionSize(); break; case genchange: currlayer->currfile = oldcurrfile; if (undo) { currlayer->currsel = oldsel; RestorePattern(oldgen, oldfile.c_str(), oldx, oldy, oldmag, oldbase, oldexpo); } else { if (startinfo) { // restore starting info for use by ResetPattern startinfo->Restore(); } currlayer->currsel = newsel; RestorePattern(newgen, newfile.c_str(), newx, newy, newmag, newbase, newexpo); } break; case setgen: if (undo) { ChangeGenCount(oldgen.tostring(), true); currlayer->startgen = oldstartgen; currlayer->savestart = oldsave; currlayer->tempstart = oldtempstart; currlayer->currfile = oldcurrfile; if (startinfo) { // restore starting info for use by ResetPattern startinfo->Restore(); } } else { ChangeGenCount(newgen.tostring(), true); currlayer->startgen = newstartgen; currlayer->savestart = newsave; currlayer->tempstart = newtempstart; currlayer->currfile = newcurrfile; } break; case namechange: if (whichlayer == NULL) { // the layer has been deleted so ignore name change } else { // note that if whichlayer != currlayer then we're changing the // name of a non-active cloned layer if (undo) { whichlayer->currname = oldname; currlayer->currfile = oldcurrfile; currlayer->savestart = oldsave; } else { whichlayer->currname = newname; currlayer->currfile = newcurrfile; currlayer->savestart = newsave; } if (whichlayer == currlayer) { if (olddirty == newdirty) SetPatternTitle(currlayer->currname.c_str()); // if olddirty != newdirty then UndoChange/RedoChange will call // MarkLayerClean/MarkLayerDirty (they call SetPatternTitle) } } break; case rulechange: if (undo) { RestoreRule(oldrule.c_str()); currlayer->currsel = oldsel; } else { RestoreRule(newrule.c_str()); currlayer->currsel = newsel; } if (cellcount > 0) { ChangeCells(undo); } // switch to default colors for new rule UpdateLayerColors(); break; case algochange: // pass in true so ChangeAlgorithm won't call RememberAlgoChange if (undo) { ChangeAlgorithm(oldalgo, oldrule.c_str(), true); currlayer->currsel = oldsel; } else { ChangeAlgorithm(newalgo, newrule.c_str(), true); currlayer->currsel = newsel; } if (cellcount > 0) { ChangeCells(undo); } // ChangeAlgorithm has called UpdateLayerColors() break; case scriptstart: case scriptfinish: // should never happen Warning("Bug detected in DoChange!"); break; } return true; } // ----------------------------------------------------------------------------- UndoRedo::UndoRedo() { numchanges = 0; // for 1st SaveCellChange maxchanges = 0; // ditto badalloc = false; // true if malloc/realloc fails cellarray = NULL; // play safe savecellchanges = false; // no script cell changes are pending savegenchanges = false; // no script gen changes are pending doingscriptchanges = false; // not undoing/redoing script changes prevfile.clear(); // play safe for ClearUndoRedo startcount = 0; // unfinished RememberGenStart calls // need to remember if script has created a new layer (not a clone) if (inscript) RememberScriptStart(); } // ----------------------------------------------------------------------------- UndoRedo::~UndoRedo() { ClearUndoRedo(); } // ----------------------------------------------------------------------------- void UndoRedo::ClearUndoHistory() { while (!undolist.empty()) { delete undolist.front(); undolist.pop_front(); } } // ----------------------------------------------------------------------------- void UndoRedo::ClearRedoHistory() { while (!redolist.empty()) { delete redolist.front(); redolist.pop_front(); } } // ----------------------------------------------------------------------------- void UndoRedo::SaveCellChange(int x, int y, int oldstate, int newstate) { if (numchanges == maxchanges) { if (numchanges == 0) { // initially allocate room for 1 cell change maxchanges = 1; cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { badalloc = true; return; } // ~ChangeNode or ForgetCellChanges will free cellarray } else { // double size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, maxchanges * 2 * sizeof(cell_change)); if (newptr == NULL) { badalloc = true; return; } cellarray = newptr; maxchanges *= 2; } } cellarray[numchanges].x = x; cellarray[numchanges].y = y; cellarray[numchanges].oldstate = oldstate; cellarray[numchanges].newstate = newstate; numchanges++; } // ----------------------------------------------------------------------------- void UndoRedo::ForgetCellChanges() { if (numchanges > 0) { if (cellarray) { free(cellarray); } else { Warning("Bug detected in ForgetCellChanges!"); } numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto badalloc = false; } } // ----------------------------------------------------------------------------- bool UndoRedo::RememberCellChanges(const char* action, bool olddirty) { if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; // in the unlikely event that newptr is NULL, cellarray should // still point to valid data } ClearRedoHistory(); // add cellstates node to head of undo list ChangeNode* change = new ChangeNode(cellstates); if (change == NULL) Fatal("Failed to create cellstates node!"); change->cellinfo = cellarray; change->cellcount = numchanges; change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } return true; // at least one cell changed state } return false; // no cells changed state (SaveCellChange wasn't called) } // ----------------------------------------------------------------------------- void UndoRedo::RememberFlip(bool topbot, bool olddirty) { ClearRedoHistory(); // add fliptb/fliplr node to head of undo list ChangeNode* change = new ChangeNode(topbot ? fliptb : fliplr); if (change == NULL) Fatal("Failed to create flip node!"); change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, bool olddirty) { ClearRedoHistory(); // add rotatepattcw/rotatepattacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatepattcw : rotatepattacw); if (change == NULL) Fatal("Failed to create simple rotation node!"); change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty) { ClearRedoHistory(); // add rotatecw/rotateacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatecw : rotateacw); if (change == NULL) Fatal("Failed to create rotation node!"); change->oldsel = oldsel; change->newsel = newsel; change->olddirty = olddirty; change->newdirty = true; // if numchanges == 0 we still need to rotate selection edges if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSelection(const char* action) { if (currlayer->savesel == currlayer->currsel) { // selection has not changed return; } if (generating) { // don't record selection changes while a pattern is generating; // RememberGenStart and RememberGenFinish will remember the overall change return; } ClearRedoHistory(); // add selchange node to head of undo list ChangeNode* change = new ChangeNode(selchange); if (change == NULL) Fatal("Failed to create selchange node!"); change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::SaveCurrentPattern(const char* tempfile) { const char* err = NULL; if ( currlayer->algo->hyperCapable() ) { // save hlife pattern in a macrocell file err = WritePattern(tempfile, MC_format, no_compression, 0, 0, 0, 0); } else { // can only save RLE file if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { err = "Pattern is too big to save."; } else { // use XRLE format so the pattern's top left location and the current // generation count are stored in the file err = WritePattern(tempfile, XRLE_format, no_compression, top.toint(), left.toint(), bottom.toint(), right.toint()); } } if (err) Warning(err); } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenStart() { startcount++; if (startcount > 1) { // return immediately and ignore next RememberGenFinish call; // this can happen in Linux app if user holds down space bar return; } if (inscript) { if (savegenchanges) return; // ignore consecutive run/step command savegenchanges = true; // we're about to do first run/step command of a (possibly long) // sequence, so save starting info } // save current generation, selection, position, scale, speed, etc prevgen = currlayer->algo->getGeneration(); prevsel = currlayer->currsel; prevx = currlayer->view->x; prevy = currlayer->view->y; prevmag = currlayer->view->getmag(); prevbase = currlayer->currbase; prevexpo = currlayer->currexpo; if (prevgen == currlayer->startgen) { // we can just reset to starting pattern prevfile.clear(); } else { // save starting pattern in a unique temporary file prevfile = CreateTempFileName(genchange_prefix); // if head of undo list is a genchange node then we can copy that // change node's newfile to prevfile; this makes consecutive generating // runs faster (setting prevfile to newfile would be even faster but it's // difficult to avoid the file being deleted if the redo list is cleared) if (!undolist.empty()) { std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == genchange) { if (CopyFile(change->newfile, prevfile)) { return; } else { Warning("Failed to copy temporary file!"); // continue and call SaveCurrentPattern } } } SaveCurrentPattern(prevfile.c_str()); } } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenFinish() { startcount--; if (startcount > 0) return; if (startcount < 0) { // this can happen if a script has pending gen changes that need // to be remembered (ie. savegenchanges is now false) so reset // startcount for the next RememberGenStart call startcount = 0; } if (inscript && savegenchanges) return; // ignore consecutive run/step command // generation count might not have changed (can happen in Linux app and iOS Golly) if (prevgen == currlayer->algo->getGeneration()) { // delete prevfile created by RememberGenStart if (!prevfile.empty() && FileExists(prevfile)) { RemoveFile(prevfile); } prevfile.clear(); return; } std::string fpath; if (currlayer->algo->getGeneration() == currlayer->startgen) { // this can happen if script called reset() so just use starting pattern fpath.clear(); } else { // save finishing pattern in a unique temporary file fpath = CreateTempFileName(genchange_prefix); SaveCurrentPattern(fpath.c_str()); } ClearRedoHistory(); // add genchange node to head of undo list ChangeNode* change = new ChangeNode(genchange); if (change == NULL) Fatal("Failed to create genchange node!"); change->scriptgen = inscript; change->oldgen = prevgen; change->newgen = currlayer->algo->getGeneration(); change->oldfile = prevfile; change->newfile = fpath; change->oldx = prevx; change->oldy = prevy; change->newx = currlayer->view->x; change->newy = currlayer->view->y; change->oldmag = prevmag; change->newmag = currlayer->view->getmag(); change->oldbase = prevbase; change->newbase = currlayer->currbase; change->oldexpo = prevexpo; change->newexpo = currlayer->currexpo; change->oldsel = prevsel; change->newsel = currlayer->currsel; // also remember the file containing the starting pattern // (in case it is changed by by RememberSetGen or RememberNameChange) change->oldcurrfile = currlayer->currfile; if (change->oldgen == currlayer->startgen) { // save starting info set by recent SaveStartingPattern call // (the info will be restored when redoing this genchange node) change->startinfo = new StartingInfo(NULL, NULL, NULL); } // prevfile has been saved in change->oldfile (~ChangeNode will delete it) prevfile.clear(); undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::AddGenChange() { // add a genchange node to empty undo list if (!undolist.empty()) Warning("AddGenChange bug: undo list NOT empty!"); // use starting pattern info for previous state prevgen = currlayer->startgen; prevsel = currlayer->startsel; prevx = currlayer->startx; prevy = currlayer->starty; prevmag = currlayer->startmag; prevbase = currlayer->startbase; prevexpo = currlayer->startexpo; prevfile.clear(); // pretend RememberGenStart was called startcount = 1; // avoid RememberGenFinish returning early if inscript is true savegenchanges = false; RememberGenFinish(); if (undolist.empty()) Warning("AddGenChange bug: undo list is empty!"); } // ----------------------------------------------------------------------------- void UndoRedo::SyncUndoHistory() { // reset startcount for the next RememberGenStart call startcount = 0; // synchronize undo history due to a ResetPattern call; // wind back the undo list to just past the genchange node that // matches the current layer's starting gen count std::list::iterator node; ChangeNode* change; while (!undolist.empty()) { node = undolist.begin(); change = *node; // remove node from head of undo list and prepend it to redo list undolist.erase(node); redolist.push_front(change); if (change->changeid == genchange && change->oldgen == currlayer->startgen) { if (change->scriptgen) { // gen change was done by a script so keep winding back the undo list // until the scriptstart node, or until the list is empty while (!undolist.empty()) { node = undolist.begin(); change = *node; if (change->changeid == scriptstart) { undolist.erase(node); redolist.push_front(change); break; } // undo this change so Reset and Undo restore to the same pattern UndoChange(); } } return; } } // should never get here Warning("Bug detected in SyncUndoHistory!"); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave) { std::string oldtempstart = currlayer->tempstart; std::string oldcurrfile = currlayer->currfile; if (oldgen > oldstartgen && newgen <= oldstartgen) { // if pattern is generated then tempstart will be clobbered by // SaveStartingPattern, so change tempstart to a new temporary file currlayer->tempstart = CreateTempFileName(setgen_prefix); // also need to update currfile (currlayer->savestart is true) currlayer->currfile = currlayer->tempstart; } ClearRedoHistory(); // add setgen node to head of undo list ChangeNode* change = new ChangeNode(setgen); if (change == NULL) Fatal("Failed to create setgen node!"); change->oldgen = oldgen; change->newgen = newgen; change->oldstartgen = oldstartgen; change->newstartgen = currlayer->startgen; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->oldtempstart = oldtempstart; change->newtempstart = currlayer->tempstart; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; if (oldtempstart != currlayer->tempstart) { // save starting info set by most recent SaveStartingPattern call // (the info will be restored when undoing this setgen node) change->startinfo = new StartingInfo(NULL, NULL, NULL); } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberNameChange(const char* oldname, const char* oldcurrfile, bool oldsave, bool olddirty) { if (oldname == currlayer->currname && oldcurrfile == currlayer->currfile && oldsave == currlayer->savestart && olddirty == currlayer->dirty) return; ClearRedoHistory(); // add namechange node to head of undo list ChangeNode* change = new ChangeNode(namechange); if (change == NULL) Fatal("Failed to create namechange node!"); change->oldname = oldname; change->newname = currlayer->currname; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->olddirty = olddirty; change->newdirty = currlayer->dirty; // cloned layers share the same undo/redo history but each clone can have // a different name, so we need to remember which layer was changed change->whichlayer = currlayer; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::DeletingClone(int index) { // the given cloned layer is about to be deleted, so we need to go thru the // undo/redo lists and fix up any nodes that have pointers to that clone // (very ugly, but I don't see any better solution if we're going to allow // cloned layers to have different names) Layer* cloneptr = GetLayer(index); std::list::iterator node; node = undolist.begin(); while (node != undolist.end()) { ChangeNode* change = *node; if (change->whichlayer == cloneptr) { change->whichlayer = NULL; } if (change->startinfo) { change->startinfo->RemoveClone(cloneptr); } node++; } node = redolist.begin(); while (node != redolist.end()) { ChangeNode* change = *node; if (change->whichlayer == cloneptr) { change->whichlayer = NULL; } if (change->startinfo) { change->startinfo->RemoveClone(cloneptr); } node++; } } // ----------------------------------------------------------------------------- void UndoRedo::RememberRuleChange(const char* oldrule) { std::string newrule = currlayer->algo->getrule(); if (oldrule == newrule) return; ClearRedoHistory(); // add rulechange node to head of undo list ChangeNode* change = new ChangeNode(rulechange); if (change == NULL) Fatal("Failed to create rulechange node!"); change->oldrule = oldrule; change->newrule = newrule; // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberAlgoChange(algo_type oldalgo, const char* oldrule) { ClearRedoHistory(); // add algochange node to head of undo list ChangeNode* change = new ChangeNode(algochange); if (change == NULL) Fatal("Failed to create algochange node!"); change->oldalgo = oldalgo; change->newalgo = currlayer->algtype; change->oldrule = oldrule; change->newrule = currlayer->algo->getrule(); // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptStart() { if (!undolist.empty()) { std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { // ignore consecutive RememberScriptStart calls made by RunScript // due to cloned layers if (numclones == 0) Warning("Unexpected RememberScriptStart call!"); return; } } // add scriptstart node to head of undo list ChangeNode* change = new ChangeNode(scriptstart); if (change == NULL) Fatal("Failed to create scriptstart node!"); undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptFinish() { if (undolist.empty()) { // this can happen if RunScript calls RememberScriptFinish multiple times // due to cloned layers AND the script made no changes if (numclones == 0) { // there should be at least a scriptstart node (see ClearUndoRedo) Warning("Bug detected in RememberScriptFinish!"); } return; } // if head of undo list is a scriptstart node then simply remove it // and return (ie. the script didn't make any changes) std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { undolist.erase(node); delete change; return; } else if (change->changeid == scriptfinish) { // ignore consecutive RememberScriptFinish calls made by RunScript // due to cloned layers if (numclones == 0) Warning("Unexpected RememberScriptFinish call!"); return; } // add scriptfinish node to head of undo list change = new ChangeNode(scriptfinish); if (change == NULL) Fatal("Failed to create scriptfinish node!"); undolist.push_front(change); } // ----------------------------------------------------------------------------- bool UndoRedo::CanUndo() { // we need to allow undo if generating even though undo list might be empty // (selecting Undo will stop generating and add genchange node to undo list) if (allowundo && generating) return true; return !undolist.empty() && !inscript; } // ----------------------------------------------------------------------------- bool UndoRedo::CanRedo() { return !redolist.empty() && !inscript && !generating; } // ----------------------------------------------------------------------------- void UndoRedo::UndoChange() { if (!CanUndo()) return; // get change info from head of undo list and do the change std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptfinish) { // undo all changes between scriptfinish and scriptstart nodes; // first remove scriptfinish node from undo list and add it to redo list undolist.erase(node); redolist.push_front(change); while (change->changeid != scriptstart) { // call UndoChange recursively; temporarily set doingscriptchanges so // UndoChange won't return if DoChange is aborted doingscriptchanges = true; UndoChange(); doingscriptchanges = false; node = undolist.begin(); if (node == undolist.end()) Fatal("Bug in UndoChange!"); change = *node; } // continue below so that scriptstart node is removed from undo list // and added to redo list } else { // user might abort the undo (eg. a lengthy rotate/flip) if (!change->DoChange(true) && !doingscriptchanges) return; } // remove node from head of undo list (doesn't delete node's data) undolist.erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag if (change->olddirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname.c_str()); } } // add change to head of redo list redolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RedoChange() { if (!CanRedo()) return; // get change info from head of redo list and do the change std::list::iterator node = redolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { // redo all changes between scriptstart and scriptfinish nodes; // first remove scriptstart node from redo list and add it to undo list redolist.erase(node); undolist.push_front(change); while (change->changeid != scriptfinish) { // call RedoChange recursively; temporarily set doingscriptchanges so // RedoChange won't return if DoChange is aborted doingscriptchanges = true; RedoChange(); doingscriptchanges = false; node = redolist.begin(); if (node == redolist.end()) Fatal("Bug in RedoChange!"); change = *node; } // continue below so that scriptfinish node is removed from redo list // and added to undo list } else { // user might abort the redo (eg. a lengthy rotate/flip) if (!change->DoChange(false) && !doingscriptchanges) return; } // remove node from head of redo list (doesn't delete node's data) redolist.erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag if (change->newdirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname.c_str()); } } // add change to head of undo list undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::ClearUndoRedo() { // free cellarray in case there were SaveCellChange calls not followed // by ForgetCellChanges or RememberCellChanges ForgetCellChanges(); if (startcount > 0) { // RememberGenStart was not followed by RememberGenFinish if (!prevfile.empty() && FileExists(prevfile)) { RemoveFile(prevfile); } prevfile.clear(); startcount = 0; } // set flag so ChangeNode::~ChangeNode() can delete all temporary files delete_all_temps = true; // clear the undo/redo lists (and delete each node's data) ClearUndoHistory(); ClearRedoHistory(); delete_all_temps = false; if (inscript) { // script has called a command like new() so add a scriptstart node // to the undo list to match the final scriptfinish node RememberScriptStart(); // reset flags to indicate no pending cell/gen changes savecellchanges = false; savegenchanges = false; } } // ----------------------------------------------------------------------------- bool CopyTempFiles(ChangeNode* srcnode, ChangeNode* destnode, const char* tempstart1) { // if srcnode has any existing temporary files then, if necessary, create new // temporary file names in the destnode and copy such files bool allcopied = true; if ( !srcnode->oldfile.empty() && FileExists(srcnode->oldfile) ) { destnode->oldfile = CreateTempFileName(dupe1_prefix); if ( !CopyFile(srcnode->oldfile, destnode->oldfile) ) allcopied = false; } if ( !srcnode->newfile.empty() && FileExists(srcnode->newfile) ) { destnode->newfile = CreateTempFileName(dupe2_prefix); if ( !CopyFile(srcnode->newfile, destnode->newfile) ) allcopied = false; } if ( !srcnode->oldcurrfile.empty() && FileExists(srcnode->oldcurrfile) ) { if (srcnode->oldcurrfile == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->oldcurrfile = tempstart1; } else if (srcnode->oldcurrfile.compare(0,tempdir.length(),tempdir) == 0) { destnode->oldcurrfile = CreateTempFileName(dupe3_prefix); if ( !CopyFile(srcnode->oldcurrfile, destnode->oldcurrfile) ) allcopied = false; } } if ( !srcnode->newcurrfile.empty() && FileExists(srcnode->newcurrfile) ) { if (srcnode->newcurrfile == srcnode->oldcurrfile) { // use destnode->oldcurrfile set above or earlier in DuplicateHistory destnode->newcurrfile = destnode->oldcurrfile; } else if (srcnode->newcurrfile == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->newcurrfile = tempstart1; } else if (srcnode->newcurrfile.compare(0,tempdir.length(),tempdir) == 0) { destnode->newcurrfile = CreateTempFileName(dupe4_prefix); if ( !CopyFile(srcnode->newcurrfile, destnode->newcurrfile) ) allcopied = false; } } if ( !srcnode->oldtempstart.empty() && FileExists(srcnode->oldtempstart) ) { if (srcnode->oldtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->oldtempstart = tempstart1; } else if (srcnode->oldtempstart.compare(0,tempdir.length(),tempdir) == 0) { destnode->oldtempstart = CreateTempFileName(dupe5_prefix); if ( !CopyFile(srcnode->oldtempstart, destnode->oldtempstart) ) allcopied = false; } } if ( !srcnode->newtempstart.empty() && FileExists(srcnode->newtempstart) ) { if (srcnode->newtempstart == srcnode->oldtempstart) { // use destnode->oldtempstart set above or earlier in DuplicateHistory destnode->newtempstart = destnode->oldtempstart; } else if (srcnode->newtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->newtempstart = tempstart1; } else if (srcnode->newtempstart.compare(0,tempdir.length(),tempdir) == 0) { destnode->newtempstart = CreateTempFileName(dupe6_prefix); if ( !CopyFile(srcnode->newtempstart, destnode->newtempstart) ) allcopied = false; } } return allcopied; } // ----------------------------------------------------------------------------- void UndoRedo::DuplicateHistory(Layer* oldlayer, Layer* newlayer) { UndoRedo* history = oldlayer->undoredo; // clear the undo/redo lists; note that UndoRedo::UndoRedo has added // a scriptstart node to undolist if inscript is true, but we don't // want that here because the old layer's history will already have one ClearUndoHistory(); ClearRedoHistory(); // safer to do our own shallow copy (avoids setting undolist/redolist) savecellchanges = history->savecellchanges; savegenchanges = history->savegenchanges; doingscriptchanges = history->doingscriptchanges; numchanges = history->numchanges; maxchanges = history->maxchanges; badalloc = history->badalloc; prevfile = history->prevfile; prevgen = history->prevgen; prevx = history->prevx; prevy = history->prevy; prevmag = history->prevmag; prevbase = history->prevbase; prevexpo = history->prevexpo; prevsel = history->prevsel; startcount = history->startcount; // copy existing temporary file to new name if ( !prevfile.empty() && FileExists(prevfile) ) { prevfile = CreateTempFileName(genchange_prefix); if ( !CopyFile(history->prevfile, prevfile) ) { Warning("Could not copy prevfile!"); return; } } // do a deep copy of dynamically allocated data cellarray = NULL; if (numchanges > 0 && history->cellarray) { cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { Warning("Could not allocate cellarray!"); return; } // copy history->cellarray data to this cellarray memcpy(cellarray, history->cellarray, numchanges * sizeof(cell_change)); } std::list::iterator node; // build a new undolist using history->undolist node = history->undolist.begin(); while (node != undolist.end()) { ChangeNode* change = *node; ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning("Failed to copy undolist!"); ClearUndoHistory(); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning("Could not copy undolist!"); ClearUndoHistory(); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } if (change->startinfo) { newchange->startinfo = new StartingInfo(change->startinfo, oldlayer, newlayer); } // if node is a name change then update whichlayer if (newchange->changeid == namechange) { if (change->whichlayer == oldlayer) { newchange->whichlayer = newlayer; } else { newchange->whichlayer = NULL; } } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart.c_str())) { Warning("Failed to copy temporary file in undolist!"); ClearUndoHistory(); return; } undolist.push_back(newchange); node++; } // build a new redolist using history->redolist node = history->redolist.begin(); while (node != redolist.end()) { ChangeNode* change = *node; ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning("Failed to copy redolist!"); ClearRedoHistory(); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning("Could not copy redolist!"); ClearRedoHistory(); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } if (change->startinfo) { newchange->startinfo = new StartingInfo(change->startinfo, oldlayer, newlayer); } // if node is a name change then update whichlayer to point to new layer if (newchange->changeid == namechange) { if (change->whichlayer == oldlayer) { newchange->whichlayer = newlayer; } else { newchange->whichlayer = NULL; } } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart.c_str())) { Warning("Failed to copy temporary file in redolist!"); ClearRedoHistory(); return; } redolist.push_back(newchange); node++; } } golly-3.3-src/gui-common/utils.h0000644000175000017500000000577413145740437013623 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _UTILS_H_ #define _UTILS_H_ #include // for std::string class lifepoll; // Various types and utility routines: typedef struct { unsigned char r; unsigned char g; unsigned char b; } gColor; // a color in RGB space typedef struct { int x; int y; int width; int height; } gRect; // a rectangle void SetColor(gColor& color, unsigned char red, unsigned char green, unsigned char blue); // Set given gColor to given RGB values. void SetRect(gRect& rect, int x, int y, int width, int height); // Set given gRect to given location and size. void Warning(const char* msg); // Beep and display message in a modal dialog. bool YesNo(const char* msg); // Similar to Warning, but there are 2 buttons: Yes and No. // Returns true if Yes button is hit. void Fatal(const char* msg); // Beep, display message in a modal dialog, then exit app. void Beep(); // Play beep sound, depending on user setting. double TimeInSeconds(); // Get time of day, in seconds (accuracy in microsecs). std::string CreateTempFileName(const char* prefix); // Return path to a unique temporary file. bool FileExists(const std::string& filepath); // Does given file exist? void RemoveFile(const std::string& filepath); // Delete given file. bool CopyFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully copied to output file. // If the output file existed it is replaced. bool MoveFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully moved to output file. // If the output file existed it is replaced. void FixURLPath(std::string& path); // Replace "%..." with suitable chars for a file path (eg. %20 is changed to space). bool IsHTMLFile(const std::string& filename); // Return true if the given file's extension is .htm or .html // (ignoring case). bool IsTextFile(const std::string& filename); // Return true if the given file's extension is .txt or .doc, // or if it's not a HTML file and its name contains "readme" // (ignoring case). bool IsZipFile(const std::string& filename); // Return true if the given file's extension is .zip or .gar // (ignoring case). bool IsRuleFile(const std::string& filename); // Return true if the given file is a rule-related file with // an extension of .rule or .table or .tree or .colors or .icons // (ignoring case). bool IsScriptFile(const std::string& filename); // Return true if the given file is a Lua or Perl or Python script. // It simply checks if the file's extension is .lua or .pl or .py // (ignoring case). bool EndsWith(const std::string& str, const std::string& suffix); // Return true if given string ends with given suffix. lifepoll* Poller(); void PollerReset(); void PollerInterrupt(); extern int event_checker; // Poller is used by gollybase modules to process events. // If event_checker > 0 then we've been called from the event checking code. #endif golly-3.3-src/gui-common/undo.h0000644000175000017500000001225213145740437013415 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _UNDO_H_ #define _UNDO_H_ #include "bigint.h" // for bigint class #include "select.h" // for Selection class #include "algos.h" // for algo_type #include // for std::string #include // for std::list class ChangeNode; class Layer; // Golly supports unlimited undo/redo: typedef struct { int x; // cell's x position int y; // cell's y position int oldstate; // old state int newstate; // new state } cell_change; // stores a single cell change class UndoRedo { public: UndoRedo(); ~UndoRedo(); void SaveCellChange(int x, int y, int oldstate, int newstate); // cell at x,y has changed state void ForgetCellChanges(); // ignore cell changes made by any previous SaveCellChange calls bool RememberCellChanges(const char* action, bool olddirty); // remember cell changes made by any previous SaveCellChange calls, // and the state of the layer's dirty flag BEFORE the change; // the given action string will be appended to the Undo/Redo items; // return true if one or more cells changed state, false otherwise void RememberFlip(bool topbot, bool olddirty); // remember flip's direction void RememberRotation(bool clockwise, bool olddirty); // remember simple rotation (selection includes entire pattern) void RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty); // remember rotation's direction and old and new selections; // this variant assumes SaveCellChange may have been called void RememberSelection(const char* action); // remember selection change (no-op if selection hasn't changed) void RememberGenStart(); // remember info before generating the current pattern void RememberGenFinish(); // remember generating change after pattern has finished generating void AddGenChange(); // in some situations the undo list is empty but ResetPattern can still // be called because the gen count is > startgen, so this routine adds // a generating change to the undo list so the user can Undo or Reset // (and then Redo if they wish) void SyncUndoHistory(); // called by ResetPattern to synchronize the undo history void RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave); // remember change of generation count void RememberNameChange(const char* oldname, const char* oldcurrfile, bool oldsave, bool olddirty); // remember change to current layer's name void DeletingClone(int index); // the given cloned layer is about to be deleted, so we must ignore // any later name changes involving this layer void RememberRuleChange(const char* oldrule); // remember rule change void RememberAlgoChange(algo_type oldalgo, const char* oldrule); // remember algorithm change, including a possible rule change // and possible cell changes (SaveCellChange may have been called) void RememberScriptStart(); // remember that script is about to start; this allows us to undo/redo // any changes made by the script all at once void RememberScriptFinish(); // remember that script has ended void DuplicateHistory(Layer* oldlayer, Layer* newlayer); // duplicate old layer's undo/redo history in new layer bool savecellchanges; // script's cell changes need to be remembered? bool savegenchanges; // script's gen changes need to be remembered? bool doingscriptchanges; // are script's changes being undone/redone? bool CanUndo(); // can a change be undone? bool CanRedo(); // can an undone change be redone? void UndoChange(); // undo a change void RedoChange(); // redo an undone change void ClearUndoRedo(); // clear all undo/redo history private: std::list undolist; // list of undoable changes std::list redolist; // list of redoable changes cell_change* cellarray; // dynamic array of cell changes unsigned int numchanges; // number of cell changes unsigned int maxchanges; // number allocated bool badalloc; // malloc/realloc failed? std::string prevfile; // for saving pattern at start of gen change bigint prevgen; // generation count at start of gen change bigint prevx, prevy; // viewport position at start of gen change int prevmag; // scale at start of gen change int prevbase; // base step at start of gen change int prevexpo; // step exponent at start of gen change Selection prevsel; // selection at start of gen change int startcount; // unfinished RememberGenStart calls void ClearUndoHistory(); // clear undolist void ClearRedoHistory(); // clear redolist void SaveCurrentPattern(const char* tempfile); // save current pattern to given temporary file }; #endif golly-3.3-src/gui-common/control.h0000644000175000017500000000231413145740437014126 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _CONTROL_H_ #define _CONTROL_H_ #include "bigint.h" // for bigint #include "algos.h" // for algo_type #include // for std::string #include // for std::list // Data and routines for generating patterns: extern bool generating; // currently generating pattern? extern int minexpo; // step exponent at maximum delay (must be <= 0) bool StartGenerating(); void StopGenerating(); void NextGeneration(bool useinc); void ResetPattern(bool resetundo = true); void RestorePattern(bigint& gen, const char* filename, bigint& x, bigint& y, int mag, int base, int expo); void SetMinimumStepExponent(); void SetStepExponent(int newexpo); void SetGenIncrement(); const char* ChangeGenCount(const char* genstring, bool inundoredo = false); void ClearOutsideGrid(); void ReduceCellStates(int newmaxstate); void ChangeRule(const std::string& rulestring); void ChangeAlgorithm(algo_type newalgotype, const char* newrule = "", bool inundoredo = false); std::string CreateRuleFiles(std::list& deprecated, std::list& keeprules); #endif golly-3.3-src/gui-common/file.h0000644000175000017500000000245013230774246013366 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _FILE_H_ #define _FILE_H_ #include // for std::string #include "writepattern.h" // for pattern_format, output_compression // Routines for opening, saving, unzipping, downloading files: void NewPattern(const char* title = "untitled"); bool LoadPattern(const char* path, const char* newtitle); void SetPatternTitle(const char* filename); bool SaveCurrentLayer(); void CreateUniverse(); void OpenFile(const char* path, bool remember = true); bool CopyTextToClipboard(const char* text); bool GetTextFromClipboard(std::string& text); bool SavePattern(const std::string& path, pattern_format format, output_compression compression); const char* WritePattern(const char* path, pattern_format format, output_compression compression, int top, int left, int bottom, int right); void UnzipFile(const std::string& zippath, const std::string& entry); void GetURL(const std::string& url, const std::string& pageurl); bool DownloadFile(const std::string& url, const std::string& filepath); void ProcessDownload(const std::string& filepath); void LoadLexiconPattern(const std::string& lexpattern); void LoadRule(const std::string& rulestring); std::string GetBaseName(const char* path); #endif golly-3.3-src/gui-common/utils.cpp0000644000175000017500000003353513171233731014143 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include // for gettimeofday #include // for std::transform #include // for tolower #include "lifepoll.h" // for lifepoll #include "util.h" // for linereader #include "prefs.h" // for allowbeep, tempdir #include "utils.h" #ifdef ANDROID_GUI #include "jnicalls.h" // for AndroidWarning, AndroidBeep, UpdateStatus, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for WebWarning, WebBeep, UpdateStatus, etc #endif #ifdef IOS_GUI #import // for AudioServicesPlaySystemSound, etc #import "PatternViewController.h" // for UpdateStatus, etc #endif // ----------------------------------------------------------------------------- int event_checker = 0; // if > 0 then we're in gollypoller.checkevents() // ----------------------------------------------------------------------------- void SetColor(gColor& color, unsigned char red, unsigned char green, unsigned char blue) { color.r = red; color.g = green; color.b = blue; } // ----------------------------------------------------------------------------- void SetRect(gRect& rect, int x, int y, int width, int height) { rect.x = x; rect.y = y; rect.width = width; rect.height = height; } // ----------------------------------------------------------------------------- #ifdef IOS_GUI // need the following to make YesNo/Warning/Fatal dialogs modal: @interface ModalAlertDelegate : NSObject { NSInteger returnButt; } @property () NSInteger returnButt; - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; @end @implementation ModalAlertDelegate @synthesize returnButt; - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { returnButt = buttonIndex; } @end #endif // IOS_GUI // ----------------------------------------------------------------------------- bool YesNo(const char* msg) { Beep(); #ifdef ANDROID_GUI return AndroidYesNo(msg); #endif #ifdef WEB_GUI return WebYesNo(msg); #endif #ifdef IOS_GUI ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Warning" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } return md.returnButt != 0; #endif // IOS_GUI } // ----------------------------------------------------------------------------- void Warning(const char* msg) { Beep(); #ifdef ANDROID_GUI AndroidWarning(msg); #endif #ifdef WEB_GUI WebWarning(msg); #endif #ifdef IOS_GUI ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Warning" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"OK" otherButtonTitles:nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } #endif // IOS_GUI } // ----------------------------------------------------------------------------- void Fatal(const char* msg) { Beep(); #ifdef ANDROID_GUI AndroidFatal(msg); #endif #ifdef WEB_GUI WebFatal(msg); #endif #ifdef IOS_GUI ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Fatal Error" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"Quit" otherButtonTitles:nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } exit(1); #endif // IOS_GUI } // ----------------------------------------------------------------------------- void Beep() { if (!allowbeep) return; #ifdef ANDROID_GUI AndroidBeep(); #endif #ifdef WEB_GUI WebBeep(); #endif #ifdef IOS_GUI static SystemSoundID beepID = 0; if (beepID == 0) { // get the path to the sound file NSString* path = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"aiff"]; if (path) { NSURL* url = [NSURL fileURLWithPath:path]; OSStatus err = AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &beepID); if (err == kAudioServicesNoError && beepID > 0) { // play the sound AudioServicesPlaySystemSound(beepID); } } } else { // assume we got the sound AudioServicesPlaySystemSound(beepID); } #endif // IOS_GUI } // ----------------------------------------------------------------------------- double TimeInSeconds() { struct timeval trec; gettimeofday(&trec, 0); return double(trec.tv_sec) + double(trec.tv_usec) / 1.0e6; } // ----------------------------------------------------------------------------- std::string CreateTempFileName(const char* prefix) { /* std::string tmplate = tempdir; tmplate += prefix; tmplate += ".XXXXXX"; std::string path = mktemp((char*)tmplate.c_str()); */ // simpler to ignore prefix and create /tmp/0, /tmp/1, /tmp/2, etc char n[32]; static int nextname = 0; sprintf(n, "%d", nextname++); std::string path = tempdir + n; return path; } // ----------------------------------------------------------------------------- bool FileExists(const std::string& filepath) { FILE* f = fopen(filepath.c_str(), "r"); if (f) { fclose(f); return true; } else { return false; } } // ----------------------------------------------------------------------------- void RemoveFile(const std::string& filepath) { #ifdef ANDROID_GUI AndroidRemoveFile(filepath); #endif #ifdef WEB_GUI WebRemoveFile(filepath); #endif #ifdef IOS_GUI if ([[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithCString:filepath.c_str() encoding:NSUTF8StringEncoding] error:NULL] == NO) { // should never happen Warning("RemoveFile failed!"); }; #endif } // ----------------------------------------------------------------------------- bool CopyFile(const std::string& inpath, const std::string& outpath) { #if defined(ANDROID_GUI) || defined(WEB_GUI) FILE* infile = fopen(inpath.c_str(), "r"); if (infile) { // read entire file into contents std::string contents; const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(infile); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); // fclose(infile) has been called // write contents to outpath FILE* outfile = fopen(outpath.c_str(), "w"); if (outfile) { if (fputs(contents.c_str(), outfile) == EOF) { fclose(outfile); Warning("CopyFile failed to copy contents to output file!"); return false; } fclose(outfile); } else { Warning("CopyFile failed to open output file!"); return false; } return true; } else { Warning("CopyFile failed to open input file!"); return false; } #endif // ANDROID_GUI or WEB_GUI #ifdef IOS_GUI if (FileExists(outpath)) { RemoveFile(outpath); } return [[NSFileManager defaultManager] copyItemAtPath:[NSString stringWithCString:inpath.c_str() encoding:NSUTF8StringEncoding] toPath:[NSString stringWithCString:outpath.c_str() encoding:NSUTF8StringEncoding] error:NULL]; #endif // IOS_GUI } // ----------------------------------------------------------------------------- bool MoveFile(const std::string& inpath, const std::string& outpath) { #ifdef ANDROID_GUI return AndroidMoveFile(inpath, outpath); #endif #ifdef WEB_GUI return WebMoveFile(inpath, outpath); #endif #ifdef IOS_GUI if (FileExists(outpath)) { RemoveFile(outpath); } return [[NSFileManager defaultManager] moveItemAtPath:[NSString stringWithCString:inpath.c_str() encoding:NSUTF8StringEncoding] toPath:[NSString stringWithCString:outpath.c_str() encoding:NSUTF8StringEncoding] error:NULL]; #endif } // ----------------------------------------------------------------------------- void FixURLPath(std::string& path) { // replace "%..." with suitable chars for a file path (eg. %20 is changed to space) #ifdef ANDROID_GUI AndroidFixURLPath(path); #endif #ifdef WEB_GUI WebFixURLPath(path); #endif #ifdef IOS_GUI NSString* newpath = [[NSString stringWithCString:path.c_str() encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if (newpath) path = [newpath cStringUsingEncoding:NSUTF8StringEncoding]; #endif } // ----------------------------------------------------------------------------- bool IsHTMLFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"htm") == 0 || strcasecmp(ext.c_str(),"html") == 0 ); } // ----------------------------------------------------------------------------- bool IsTextFile(const std::string& filename) { if (!IsHTMLFile(filename)) { // if non-html file name contains "readme" then assume it's a text file std::string basename = filename; size_t lastsep = basename.rfind('/'); if (lastsep != std::string::npos) { basename = basename.substr(lastsep+1); } std::transform(basename.begin(), basename.end(), basename.begin(), tolower); if (basename.find("readme") != std::string::npos) return true; } size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"txt") == 0 || strcasecmp(ext.c_str(),"doc") == 0 ); } // ----------------------------------------------------------------------------- bool IsZipFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"zip") == 0 || strcasecmp(ext.c_str(),"gar") == 0 ); } // ----------------------------------------------------------------------------- bool IsRuleFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"rule") == 0 || strcasecmp(ext.c_str(),"table") == 0 || strcasecmp(ext.c_str(),"tree") == 0 || strcasecmp(ext.c_str(),"colors") == 0 || strcasecmp(ext.c_str(),"icons") == 0 ); } // ----------------------------------------------------------------------------- bool IsScriptFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"lua") == 0 || strcasecmp(ext.c_str(),"pl") == 0 || strcasecmp(ext.c_str(),"py") == 0 ); } // ----------------------------------------------------------------------------- bool EndsWith(const std::string& str, const std::string& suffix) { // return true if str ends with suffix size_t strlen = str.length(); size_t sufflen = suffix.length(); return (strlen >= sufflen) && (str.rfind(suffix) == strlen - sufflen); } // ----------------------------------------------------------------------------- // let gollybase modules process events class golly_poll : public lifepoll { public: virtual int checkevents(); virtual void updatePop(); }; int golly_poll::checkevents() { if (event_checker > 0) return isInterrupted(); event_checker++; #ifdef ANDROID_GUI AndroidCheckEvents(); #endif #ifdef WEB_GUI WebCheckEvents(); #endif #ifdef IOS_GUI [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; #endif event_checker--; return isInterrupted(); } void golly_poll::updatePop() { UpdateStatus(); } // ----------------------------------------------------------------------------- golly_poll gollypoller; // create instance lifepoll* Poller() { return &gollypoller; } void PollerReset() { gollypoller.resetInterrupted(); } void PollerInterrupt() { gollypoller.setInterrupted(); } golly-3.3-src/gui-common/control.cpp0000644000175000017500000012217013543255652014466 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "writepattern.h" #include "util.h" // for linereader #include "utils.h" // for Warning, TimeInSeconds, Poller, event_checker, etc #include "prefs.h" // for allowundo, etc #include "status.h" // for ErrorMessage, etc #include "file.h" // for WritePattern, LoadPattern, etc #include "algos.h" // for *_ALGO, algo_type, CreateNewUniverse, etc #include "layer.h" // for currlayer, RestoreRule, etc #include "view.h" // for UpdatePatternAndStatus, draw_pending, etc #include "undo.h" // for UndoRedo #include "control.h" #include // for std::runtime_error and std::exception #include // for std::ostringstream #include // for std::find #ifdef ANDROID_GUI #include "jnicalls.h" // for UpdateStatus, BeginProgress, etc #endif #ifdef IOS_GUI #import "PatternViewController.h" // for UpdateStatus, BeginProgress, etc #endif #ifdef WEB_GUI #include "webcalls.h" // for UpdateStatus, BeginProgress, etc #endif // ----------------------------------------------------------------------------- bool generating = false; // currently generating pattern? int minexpo = 0; // step exponent at maximum delay (must be <= 0) double begintime, endtime; // for timing info double begingen, endgen; // ditto const char* empty_pattern = "All cells are dead."; // ----------------------------------------------------------------------------- // macros for checking if a certain string exists in a list of strings #define FOUND(l,s) (std::find(l.begin(),l.end(),s) != l.end()) #define NOT_FOUND(l,s) (std::find(l.begin(),l.end(),s) == l.end()) // ----------------------------------------------------------------------------- bool SaveStartingPattern() { if ( currlayer->algo->getGeneration() > currlayer->startgen ) { // don't do anything if current gen count > starting gen return true; } // save current rule, dirty flag, scale, location, etc currlayer->startname = currlayer->currname; currlayer->startrule = currlayer->algo->getrule(); currlayer->startdirty = currlayer->dirty; currlayer->startmag = currlayer->view->getmag(); currlayer->startx = currlayer->view->x; currlayer->starty = currlayer->view->y; currlayer->startbase = currlayer->currbase; currlayer->startexpo = currlayer->currexpo; currlayer->startalgo = currlayer->algtype; // if this layer is a clone then save some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = cloneptr->currname; cloneptr->startx = cloneptr->view->x; cloneptr->starty = cloneptr->view->y; cloneptr->startmag = cloneptr->view->getmag(); cloneptr->startbase = cloneptr->currbase; cloneptr->startexpo = cloneptr->currexpo; } } } // save current selection currlayer->startsel = currlayer->currsel; if ( !currlayer->savestart ) { // no need to save pattern (use currlayer->currfile as the starting pattern) if (currlayer->currfile.empty()) Warning("Bug in SaveStartingPattern: currfile is empty!"); return true; } currlayer->currfile = currlayer->tempstart; // ResetPattern will load tempstart // save starting pattern in tempstart file if ( currlayer->algo->hyperCapable() ) { // much faster to save pattern in a macrocell file const char* err = WritePattern(currlayer->tempstart.c_str(), MC_format, no_compression, 0, 0, 0, 0); if (err) { ErrorMessage(err); // don't allow user to continue generating return false; } } else { // can only save as RLE if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Starting pattern is outside +/- 10^9 boundary."); // don't allow user to continue generating return false; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // use XRLE format so the pattern's top left location and the current // generation count are stored in the file const char* err = WritePattern(currlayer->tempstart.c_str(), XRLE_format, no_compression, itop, ileft, ibottom, iright); if (err) { ErrorMessage(err); // don't allow user to continue generating return false; } } return true; } // ----------------------------------------------------------------------------- void SetGenIncrement() { if (currlayer->currexpo > 0) { bigint inc = 1; int maxexpo = 1 ; if (currlayer->currbase <= 10000) { int mantissa = currlayer->currbase ; int himantissa = 0x7fffffff ; while (mantissa > 1 && 0 == (mantissa & 1)) mantissa >>= 1 ; if (mantissa == 1) { maxexpo = 0x7fffffff ; } else { int p = mantissa ; while (p <= himantissa / mantissa) { p *= mantissa ; maxexpo++ ; } } } if (currlayer->currexpo > maxexpo) currlayer->currexpo = maxexpo ; // set increment to currbase^currexpo int i = currlayer->currexpo; while (i > 0) { if (currlayer->currbase > 10000) { inc = currlayer->currbase ; } else { inc.mul_smallint(currlayer->currbase); } i--; } currlayer->algo->setIncrement(inc); } else { currlayer->algo->setIncrement(1); } } // ----------------------------------------------------------------------------- void SetStepExponent(int newexpo) { currlayer->currexpo = newexpo; if (currlayer->currexpo < minexpo) currlayer->currexpo = minexpo; SetGenIncrement(); } // ----------------------------------------------------------------------------- void SetMinimumStepExponent() { // set minexpo depending on mindelay and maxdelay minexpo = 0; if (mindelay > 0) { int d = mindelay; minexpo--; while (d < maxdelay) { d *= 2; minexpo--; } } } // ----------------------------------------------------------------------------- void ResetPattern(bool resetundo) { if (currlayer->algo->getGeneration() == currlayer->startgen) return; if (currlayer->algo->getGeneration() < currlayer->startgen) { // if this happens then startgen logic is wrong Warning("Current gen < starting gen!"); return; } if (currlayer->currfile.empty()) { // if this happens then savestart logic is wrong Warning("Starting pattern cannot be restored!"); return; } // save current algo and rule algo_type oldalgo = currlayer->algtype; std::string oldrule = currlayer->algo->getrule(); // restore pattern and settings saved by SaveStartingPattern; // first restore algorithm currlayer->algtype = currlayer->startalgo; // restore starting pattern LoadPattern(currlayer->currfile.c_str(), ""); if (currlayer->algo->getGeneration() != currlayer->startgen) { // LoadPattern failed to reset the gen count to startgen // (probably because the user deleted the starting pattern) // so best to clear the pattern and reset the gen count CreateUniverse(); currlayer->algo->setGeneration(currlayer->startgen); std::string msg = "Failed to reset pattern from this file:\n"; msg += currlayer->currfile; Warning(msg.c_str()); } // restore settings saved by SaveStartingPattern RestoreRule(currlayer->startrule.c_str()); currlayer->currname = currlayer->startname; currlayer->dirty = currlayer->startdirty; if (restoreview) { currlayer->view->setpositionmag(currlayer->startx, currlayer->starty, currlayer->startmag); } // restore step size and set increment currlayer->currbase = currlayer->startbase; currlayer->currexpo = currlayer->startexpo; SetGenIncrement(); // if this layer is a clone then restore some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->currname = cloneptr->startname; if (restoreview) { cloneptr->view->setpositionmag(cloneptr->startx, cloneptr->starty, cloneptr->startmag); } cloneptr->currbase = cloneptr->startbase; cloneptr->currexpo = cloneptr->startexpo; // also synchronize dirty flags and update items in Layer menu cloneptr->dirty = currlayer->dirty; //!!! UpdateLayerItem(i); } } } // restore selection currlayer->currsel = currlayer->startsel; // switch to default colors if algo/rule changed std::string newrule = currlayer->algo->getrule(); if (oldalgo != currlayer->algtype || oldrule != newrule) { UpdateLayerColors(); } // update window title in case currname, rule or dirty flag changed //!!! SetWindowTitle(currlayer->currname); if (allowundo) { if (resetundo) { // wind back the undo history to the starting pattern currlayer->undoredo->SyncUndoHistory(); } } } // ----------------------------------------------------------------------------- void RestorePattern(bigint& gen, const char* filename, bigint& x, bigint& y, int mag, int base, int expo) { // called to undo/redo a generating change if (gen == currlayer->startgen) { // restore starting pattern (false means don't call SyncUndoHistory) ResetPattern(false); } else { // restore pattern in given filename LoadPattern(filename, ""); if (currlayer->algo->getGeneration() != gen) { // best to clear the pattern and set the expected gen count CreateUniverse(); currlayer->algo->setGeneration(gen); std::string msg = "Could not restore pattern from this file:\n"; msg += filename; Warning(msg.c_str()); } // restore step size and set increment currlayer->currbase = base; currlayer->currexpo = expo; SetGenIncrement(); // restore position and scale, if allowed if (restoreview) currlayer->view->setpositionmag(x, y, mag); UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- const char* ChangeGenCount(const char* genstring, bool inundoredo) { // disallow alphabetic chars in genstring for (unsigned int i = 0; i < strlen(genstring); i++) if ( (genstring[i] >= 'a' && genstring[i] <= 'z') || (genstring[i] >= 'A' && genstring[i] <= 'Z') ) return "Alphabetic character is not allowed in generation string."; bigint oldgen = currlayer->algo->getGeneration(); bigint newgen(genstring); if (genstring[0] == '+' || genstring[0] == '-') { // leading +/- sign so make newgen relative to oldgen bigint relgen = newgen; newgen = oldgen; newgen += relgen; if (newgen < bigint::zero) newgen = bigint::zero; } // set stop_after_script BEFORE testing newgen == oldgen so scripts // can call setgen("+0") to prevent further generating //!!! if (inscript) stop_after_script = true; if (newgen == oldgen) return NULL; if (!inundoredo && allowundo && !currlayer->stayclean && inscript) { // script called setgen() //!!! SavePendingChanges(); } // need IsParityShifted() method??? if (currlayer->algtype == QLIFE_ALGO && newgen.odd() != oldgen.odd()) { // qlife stores pattern in different bits depending on gen parity, // so we need to create a new qlife universe, set its gen, copy the // current pattern to the new universe, then switch to that universe bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { return "Pattern is too big to copy."; } // create a new universe of same type and same rule lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); const char* err = newalgo->setrule(currlayer->algo->getrule()); if (err) { delete newalgo; return "Current rule is no longer valid!"; } newalgo->setGeneration(newgen); // copy pattern if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, "Copying pattern") ) { delete newalgo; return "Failed to copy pattern."; } // switch to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); } else { currlayer->algo->setGeneration(newgen); } if (!inundoredo) { // save some settings for RememberSetGen below bigint oldstartgen = currlayer->startgen; bool oldsave = currlayer->savestart; // may need to change startgen and savestart if (oldgen == currlayer->startgen || newgen <= currlayer->startgen) { currlayer->startgen = newgen; currlayer->savestart = true; } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberSetGen(oldgen, newgen, oldstartgen, oldsave); } } UpdateStatus(); return NULL; } // ----------------------------------------------------------------------------- void DisplayTimingInfo() { endtime = TimeInSeconds(); if (endtime <= begintime) endtime = begintime + 0.000001; endgen = currlayer->algo->getGeneration().todouble(); double secs = endtime - begintime; double gens = endgen - begingen; char s[128]; sprintf(s, "%g gens in %g secs (%g gens/sec).", gens, secs, gens/secs); DisplayMessage(s); } // ----------------------------------------------------------------------------- bool StartGenerating() { if (generating) Warning("Bug detected in StartGenerating!"); lifealgo* curralgo = currlayer->algo; if (curralgo->isEmpty()) { ErrorMessage(empty_pattern); return false; } if (!SaveStartingPattern()) { return false; } if (allowundo) currlayer->undoredo->RememberGenStart(); // only show hashing info while generating lifealgo::setVerbose(currlayer->showhashinfo); // for DisplayTimingInfo begintime = TimeInSeconds(); begingen = curralgo->getGeneration().todouble(); generating = true; PollerReset(); // caller will start a repeating timer return true; } // ----------------------------------------------------------------------------- void StopGenerating() { if (!generating) Warning("Bug detected in StopGenerating!"); generating = false; PollerInterrupt(); if (showtiming) DisplayTimingInfo(); lifealgo::setVerbose(0); if (event_checker > 0) { // we're currently in the event poller somewhere inside step(), so we must let // step() complete and only call RememberGenFinish at the end of NextGeneration } else { if (allowundo) currlayer->undoredo->RememberGenFinish(); } // caller will stop the timer } // ----------------------------------------------------------------------------- void NextGeneration(bool useinc) { lifealgo* curralgo = currlayer->algo; bool boundedgrid = curralgo->unbounded && (curralgo->gridwd > 0 || curralgo->gridht > 0); if (generating) { // we were called via timer so StartGenerating has already checked // if the pattern is empty, etc (note that useinc is also true) } else { // we were called via Next/Step button if (curralgo->isEmpty()) { ErrorMessage(empty_pattern); return; } if (!SaveStartingPattern()) { return; } if (allowundo) currlayer->undoredo->RememberGenStart(); // only show hashing info while generating lifealgo::setVerbose(currlayer->showhashinfo); if (useinc && curralgo->getIncrement() > bigint::one) { // for DisplayTimingInfo begintime = TimeInSeconds(); begingen = curralgo->getGeneration().todouble(); } PollerReset(); } if (useinc) { // step by current increment if (boundedgrid) { // temporarily set the increment to 1 so we can call CreateBorderCells() // and DeleteBorderCells() around each step() int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; bigint inc = curralgo->getIncrement(); curralgo->setIncrement(1); while (inc > 0) { if (Poller()->checkevents()) break; if (savebase != currlayer->currbase || saveexpo != currlayer->currexpo) { // user changed step base/exponent, so reset increment to 1 inc = curralgo->getIncrement(); curralgo->setIncrement(1); } if (!curralgo->CreateBorderCells()) break; curralgo->step(); if (!curralgo->DeleteBorderCells()) break; inc -= 1; } // safe way to restore correct increment in case user altered base/expo in above loop SetGenIncrement(); } else { curralgo->step(); } } else { // step by 1 gen bigint saveinc = curralgo->getIncrement(); curralgo->setIncrement(1); if (boundedgrid) curralgo->CreateBorderCells(); curralgo->step(); if (boundedgrid) curralgo->DeleteBorderCells(); curralgo->setIncrement(saveinc); } if (!generating) { if (showtiming && useinc && curralgo->getIncrement() > bigint::one) DisplayTimingInfo(); lifealgo::setVerbose(0); if (allowundo) currlayer->undoredo->RememberGenFinish(); } // autofit is only used when doing many gens if (currlayer->autofit && (generating || useinc)) { FitInView(0); } if (draw_pending) { draw_pending = false; TouchBegan(pendingx, pendingy); } } // ----------------------------------------------------------------------------- void ClearOutsideGrid() { // check current pattern and clear any live cells outside bounded grid bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // might also need to truncate selection currlayer->currsel.CheckGridEdges(); if (!currlayer->algo->unbounded) { if (currlayer->algo->clipped_cells.size() > 0) { // cells outside the grid were clipped if (savechanges) { for (size_t i = 0; i < currlayer->algo->clipped_cells.size(); i += 3) { int x = currlayer->algo->clipped_cells[i]; int y = currlayer->algo->clipped_cells[i+1]; int s = currlayer->algo->clipped_cells[i+2]; currlayer->undoredo->SaveCellChange(x, y, s, 0); } } currlayer->algo->clipped_cells.clear(); patternchanged = true; } } else { // algo uses an unbounded grid if (currlayer->algo->isEmpty()) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern too big to check (outside +/- 10^9 boundary)."); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // no need to do anything if pattern is entirely within grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } if (itop >= gtop && ileft >= gleft && ibottom <= gbottom && iright <= gright) { return; } int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Checking cells outside grid"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // clear cell outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); curralgo->setcell(cx, cy, 0); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); } if (patternchanged) { ErrorMessage("Pattern was truncated (live cells were outside grid)."); } } // ----------------------------------------------------------------------------- void ReduceCellStates(int newmaxstate) { // check current pattern and reduce any cell states > newmaxstate bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern too big to check (outside +/- 10^9 boundary)."); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Checking cell states"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (v > newmaxstate) { // reduce cell's current state to largest state if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); curralgo->setcell(cx, cy, newmaxstate); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); if (patternchanged) { ErrorMessage("Pattern has changed (new rule has fewer states)."); } } // ----------------------------------------------------------------------------- void ChangeRule(const std::string& rulestring) { std::string oldrule = currlayer->algo->getrule(); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); const char* err = currlayer->algo->setrule( rulestring.c_str() ); if (err) { // try to find another algorithm that supports the given rule for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule( rulestring.c_str() ); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule ChangeAlgorithm(i, rulestring.c_str()); if (i != currlayer->algtype) { RestoreRule(oldrule.c_str()); Warning("Algorithm could not be changed (pattern is too big to convert)."); } else { UpdateEverything(); } return; } } } // should only get here if .rule file contains some sort of error RestoreRule(oldrule.c_str()); Warning("New rule is not valid in any algorithm!"); return; } std::string newrule = currlayer->algo->getrule(); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { UpdateStatus(); // if pattern exists and is at starting gen then ensure savestart is true // so that SaveStartingPattern will save pattern to suitable file // (and thus undo/reset will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // new rule might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } // set colors and icons for new rule UpdateLayerColors(); // pattern or colors or icons might have changed UpdateEverything(); } // ----------------------------------------------------------------------------- void ChangeAlgorithm(algo_type newalgotype, const char* newrule, bool inundoredo) { if (newalgotype == currlayer->algtype) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; if ( !currlayer->algo->isEmpty() ) { currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern cannot be converted (outside +/- 10^9 boundary)."); return; } } // save changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier algo change bool savechanges = allowundo && !currlayer->stayclean && !inundoredo; if (savechanges && inscript) { // note that we must save pending gen changes BEFORE changing algo type // otherwise temporary files won't be the correct type (mc or rle) //!!! SavePendingChanges(); } // selection might change if grid becomes smaller, // so save current selection for RememberAlgoChange if (savechanges) SaveCurrentSelection(); bool rulechanged = false; std::string oldrule = currlayer->algo->getrule(); // change algorithm type, reset step size, and update status bar algo_type oldalgo = currlayer->algtype; currlayer->algtype = newalgotype; currlayer->currbase = algoinfo[newalgotype]->defbase; currlayer->currexpo = 0; UpdateStatus(); // create a new universe of the requested flavor lifealgo* newalgo = CreateNewUniverse(newalgotype); if (inundoredo) { // switch to given newrule const char* err = newalgo->setrule(newrule); if (err) newalgo->setrule(newalgo->DefaultRule()); } else { const char* err; if (newrule[0] == 0) { // try to use same rule err = newalgo->setrule(currlayer->algo->getrule()); } else { // switch to newrule err = newalgo->setrule(newrule); rulechanged = true; } if (err) { std::string defrule = newalgo->DefaultRule(); size_t oldpos = oldrule.find(':'); if (newrule[0] == 0 && oldpos != std::string::npos) { // switch to new algo's default rule, but preserve the topology in oldrule // so we can do things like switch from "LifeHistory:T30,20" in RuleLoader // to "B3/S23:T30,20" in QuickLife size_t defpos = defrule.find(':'); if (defpos != std::string::npos) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.substr(0, defpos); } defrule += ":"; defrule += oldrule.substr(oldpos+1); } err = newalgo->setrule(defrule.c_str()); // shouldn't ever fail but play safe if (err) newalgo->setrule( newalgo->DefaultRule() ); rulechanged = true; } } // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); bool patternchanged = false; if ( !currlayer->algo->isEmpty() ) { // copy pattern in current universe to new universe int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Converting pattern"); // set newalgo's grid edges so we can save cells that are outside grid int gtop = newalgo->gridtop.toint(); int gleft = newalgo->gridleft.toint(); int gbottom = newalgo->gridbottom.toint(); int gright = newalgo->gridright.toint(); if (newalgo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (newalgo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // need to check for state change if new algo has fewer states than old algo int newmaxstate = newalgo->NumCellStates() - 1; lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // cx,cy is outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); // no need to clear cell from curralgo (that universe will soon be deleted) patternchanged = true; } else { if (v > newmaxstate) { // reduce v to largest state in new algo if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); v = newmaxstate; patternchanged = true; } newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); } // delete old universe and point current universe to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); // if new grid is bounded then we might need to truncate the selection if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { currlayer->currsel.CheckGridEdges(); } // switch to default colors for new algo+rule UpdateLayerColors(); if (!inundoredo) { // if pattern exists and is at starting gen then set savestart true // so that SaveStartingPattern will save pattern to suitable file // (and thus ResetPattern will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } if (rulechanged) { if (newrule[0] == 0) { if (patternchanged) { ErrorMessage("Rule has changed and pattern has changed."); } else { // don't beep DisplayMessage("Rule has changed."); } } else { if (patternchanged) { ErrorMessage("Algorithm has changed and pattern has changed."); } else { // don't beep DisplayMessage("Algorithm has changed."); } } } else if (patternchanged) { ErrorMessage("Pattern has changed."); } } if (savechanges) { currlayer->undoredo->RememberAlgoChange(oldalgo, oldrule.c_str()); } if (!inundoredo && !inscript) { // do this AFTER RememberAlgoChange so Undo button becomes enabled UpdateEverything(); } } // ----------------------------------------------------------------------------- static std::string CreateTABLE(const std::string& tablepath) { std::string contents = "\n@TABLE\n\n"; // append contents of .table file FILE* f = fopen(tablepath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); } else { std::ostringstream oss; oss << "Could not read .table file:\n" << tablepath.c_str(); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static std::string CreateTREE(const std::string& treepath) { std::string contents = "\n@TREE\n\n"; // append contents of .tree file FILE* f = fopen(treepath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); } else { std::ostringstream oss; oss << "Could not read .tree file:\n" << treepath.c_str(); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static void CreateOneRule(const std::string& rulefile, const std::string& folder, std::list& allfiles, std::string& htmlinfo) { std::string rulename = rulefile.substr(0,rulefile.rfind('.')); std::string tablefile = rulename + ".table"; std::string treefile = rulename + ".tree"; std::string tabledata, treedata; if (FOUND(allfiles,tablefile)) tabledata = CreateTABLE(folder + tablefile); if (FOUND(allfiles,treefile)) treedata = CreateTREE(folder + treefile); std::string contents = "@RULE " + rulename + "\n"; contents += tabledata; contents += treedata; // write contents to .rule file std::string rulepath = folder + rulefile; FILE* outfile = fopen(rulepath.c_str(), "w"); if (outfile) { if (fputs(contents.c_str(), outfile) == EOF) { fclose(outfile); std::ostringstream oss; oss << "Could not write data to rule file:\n" << rulepath.c_str(); throw std::runtime_error(oss.str().c_str()); } fclose(outfile); } else { std::ostringstream oss; oss << "Could not create rule file:\n" << rulepath.c_str(); throw std::runtime_error(oss.str().c_str()); } #ifdef WEB_GUI // ensure the .rule file persists beyond the current session CopyRuleToLocalStorage(rulepath.c_str()); #endif // append created file to htmlinfo htmlinfo += ""; htmlinfo += rulefile; htmlinfo += "
\n"; } // ----------------------------------------------------------------------------- std::string CreateRuleFiles(std::list& deprecated, std::list& keeprules) { // use the given list of deprecated .table/tree files to create new .rule files, // except for those .rule files in keeprules std::string htmlinfo; bool aborted = false; try { // create a list of candidate .rule files to be created std::string rulefile, filename, rulename; std::list candidates; std::list::iterator it; for (it=deprecated.begin(); it!=deprecated.end(); ++it) { filename = *it; rulename = filename.substr(0,filename.rfind('.')); if (EndsWith(filename,".table") || EndsWith(filename,".tree")) { // .table/tree file rulefile = rulename + ".rule"; // add .rule file to candidates if it hasn't been added yet // and if it isn't in the keeprules list if (NOT_FOUND(candidates,rulefile) && NOT_FOUND(keeprules,rulefile)) { candidates.push_back(rulefile); } } } // create the new .rule files (we overwrite any existing .rule files // that aren't in keeprules) for (it=candidates.begin(); it!=candidates.end(); ++it) { CreateOneRule(*it, userrules, deprecated, htmlinfo); } } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(e.what()); aborted = true; // nice to also show error message in help window htmlinfo += "\n

*** CONVERSION ABORTED DUE TO ERROR ***\n

"; htmlinfo += std::string(e.what()); } if (!aborted) { // delete all the deprecated files std::list::iterator it; for (it=deprecated.begin(); it!=deprecated.end(); ++it) { RemoveFile(userrules + *it); } } return htmlinfo; } golly-3.3-src/gui-common/MiniZip/0000755000175000017500000000000012651666400013732 500000000000000golly-3.3-src/gui-common/MiniZip/crypt.h0000644000175000017500000001105712227612122015157 00000000000000/* crypt.h -- base code for crypt/uncrypt ZIPfile Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This code is a modified version of crypting code in Infozip distribution The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). If you don't need crypting in your application, just define symbols NOCRYPT and NOUNCRYPT. This code support the "Traditional PKWARE Encryption". The new AES encryption added on Zip format by Winzip (see the page http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong Encryption is not supported. */ #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) /*********************************************************************** * Return the next byte in the pseudo-random sequence */ static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } /*********************************************************************** * Update the encryption keys with the next byte of plain text */ static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) { (*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; { register int keyshift = (int)((*(pkeys+1)) >> 24); (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); } return c; } /*********************************************************************** * Initialize the encryption keys and the random header according to * the given password. */ static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) { *(pkeys+0) = 305419896L; *(pkeys+1) = 591751049L; *(pkeys+2) = 878082192L; while (*passwd != '\0') { update_keys(pkeys,pcrc_32_tab,(int)*passwd); passwd++; } } #define zdecode(pkeys,pcrc_32_tab,c) \ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) #define zencode(pkeys,pcrc_32_tab,c,t) \ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define RAND_HEAD_LEN 12 /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 # define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif static int crypthead( const char *passwd, /* password string */ unsigned char *buf, /* where to write header */ int bufSize, unsigned long* pkeys, const unsigned long* pcrc_32_tab, unsigned long crcForCrypting) { int n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */ static unsigned calls = 0; /* ensure different random header each time */ if (bufSize> 7) & 0xff; header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); } /* Encrypt random header (last two bytes is high word of crc) */ init_keys(passwd, pkeys, pcrc_32_tab); for (n = 0; n < RAND_HEAD_LEN-2; n++) { buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); } buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); return n; } #endif golly-3.3-src/gui-common/MiniZip/zip.h0000644000175000017500000002121712227612122014617 00000000000000/* zip.h -- IO for compress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This unzip package allow creates .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Multi volume ZipFile (span) are not supported. Encryption compatible with pkzip 2.04g only supported Old compressions used by old PKZip 1.x are not supported For uncompress .zip file, look at unzip.h I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.html for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _zip_H #define _zip_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagzipFile__ { int unused; } zipFile__; typedef zipFile__ *zipFile; #else typedef voidp zipFile; #endif #define ZIP_OK (0) #define ZIP_EOF (0) #define ZIP_ERRNO (Z_ERRNO) #define ZIP_PARAMERROR (-102) #define ZIP_BADZIPFILE (-103) #define ZIP_INTERNALERROR (-104) #ifndef DEF_MEM_LEVEL # if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 # else # define DEF_MEM_LEVEL MAX_MEM_LEVEL # endif #endif /* default memLevel */ /* tm_zip contain date/time info */ typedef struct tm_zip_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_zip; typedef struct { tm_zip tmz_date; /* date in understandable format */ uLong dosDate; /* if dos_date == 0, tmu_date is used */ /* uLong flag; */ /* general purpose bit flag 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ } zip_fileinfo; typedef const char* zipcharpc; #define APPEND_STATUS_CREATE (0) #define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_ADDINZIP (2) extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); /* Create a zipfile. pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip will be created at the end of the file. (useful if the file contain a self extractor code) if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will add files in existing zip (be sure you don't add file that doesn't exist) If the zipfile cannot be opened, the return value is NULL. Else, the return value is a zipFile Handle, usable with other function of this zip package. */ /* Note : there is no delete function into a zipfile. If you want delete file into a zipfile, you must open a zipfile, and create another Of couse, you can use RAW reading and writing to copy the file you did not want delte */ extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def)); extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level)); /* Open a file in the ZIP for writing. filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local contains the extrafield data the the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global contains the extrafield data the the local header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) */ extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw)); /* Same than zipOpenNewFileInZip, except if raw=1, we write raw file */ extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char* password, uLong crcForCtypting)); /* Same than zipOpenNewFileInZip2, except windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 password : crypting password (NULL for no crypting) crcForCtypting : crc of file to compress (needed for crypting) */ extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len)); /* Write data in the zipfile */ extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); /* Close the current file in the zipfile */ extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32)); /* Close the current file in the zipfile, for fiel opened with parameter raw=1 in zipOpenNewFileInZip2 uncompressed_size and crc32 are value for the uncompressed size */ extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment)); /* Close the zipfile */ #ifdef __cplusplus } #endif #endif /* _zip_H */ golly-3.3-src/gui-common/MiniZip/unzip.c0000644000175000017500000013564112362063145015171 00000000000000/* unzip.c -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant Read unzip.h for more info */ /* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of compatibility with older software. The following is from the original crypt.c. Code woven in by Terry Thorsen 1/2003. */ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) */ /* This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). */ #include #include #include #include "zlib.h" #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef CASESENSITIVITYDEFAULT_NO # if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) # define CASESENSITIVITYDEFAULT_NO # endif #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ int encrypted; # ifndef NOUNCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; # endif } unz_s; #ifndef NOUNCRYPT #include "crypt.h" #endif /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int unzlocal_getByte( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getShort ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getLong ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal ( const char* fileName1, const char* fileName2) { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare ( const char* fileName1, const char* fileName2, int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong unzlocal_SearchCentralDir( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer "zlib/zlib114.zip". If the zipfile cannot be opened (file doesn't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 ( const char *path, zlib_filefunc_def* pzlib_filefunc_def) { unz_s us; unz_s *s; uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&us.z_filefunc); else us.z_filefunc = *pzlib_filefunc_def; us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); if (us.filestream==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); if (central_pos==0) err=UNZ_ERRNO; if (ZSEEK(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); ZCLOSE(s->z_filefunc, s->filestream); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo ( unzFile file, unz_global_info *pglobal_info) { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate ( uLong ulDosDate, tm_unz* ptm) { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal ( unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize) { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (ZSEEK(s->z_filefunc, s->filestream, s->pos_in_central_dir+s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo ( unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize) { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (unzFile file) { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (unzFile file) { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile ( unzFile file, const char *szFileName, int iCaseSensitivity) { unz_s* s; int err; /* We remember the 'current' position in the file so that we can jump * back there if we fail. */ unz_file_info cur_file_infoSaved; unz_file_info_internal cur_file_info_internalSaved; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; /* Save the current state */ num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; cur_file_infoSaved = s->cur_file_info; cur_file_info_internalSaved = s->cur_file_info_internal; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; err = unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (err == UNZ_OK) { if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } } /* We failed, so restore the state of the 'current file' to where we * were. */ s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; s->cur_file_info = cur_file_infoSaved; s->cur_file_info_internal = cur_file_info_internalSaved; return err; } /* /////////////////////////////////////////// // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) // I need random access // // Further optimization could be realized by adding an ability // to cache the directory in memory. The goal being a single // comprehensive file read to put the file I need in a memory. */ /* typedef struct unz_file_pos_s { uLong pos_in_zip_directory; // offset in file uLong num_of_file; // # of file } unz_file_pos; */ extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos) { unz_s* s; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; file_pos->pos_in_zip_directory = s->pos_in_central_dir; file_pos->num_of_file = s->num_file; return UNZ_OK; } extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos) { unz_s* s; int err; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; /* jump to the right spot */ s->pos_in_central_dir = file_pos->pos_in_zip_directory; s->num_file = file_pos->num_of_file; /* set the current file */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); /* return results */ s->current_file_ok = (err == UNZ_OK); return err; } /* // Unzip Helper Functions - should be here? /////////////////////////////////////////// */ /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader ( unz_s* s, uInt* piSizeVar, uLong *poffset_local_extrafield, uInt *psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile3 ( unzFile file, int* method, int* level, int raw, const char* password) { int err=UNZ_OK; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ # ifndef NOUNCRYPT char source[12]; # else if (password != NULL) return UNZ_PARAMERROR; # endif if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; pfile_in_zip_read_info->raw=raw; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if (method!=NULL) *method = (int)s->cur_file_info.compression_method; if (level!=NULL) { *level = 6; switch (s->cur_file_info.flag & 0x06) { case 6 : *level = 1; break; case 4 : *level = 2; break; case 2 : *level = 9; break; } } if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->filestream=s->filestream; pfile_in_zip_read_info->z_filefunc=s->z_filefunc; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = NULL; // AKT was (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; else { TRYFREE(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; # ifndef NOUNCRYPT if (password != NULL) { int i; s->pcrc_32_tab = (const unsigned long *)get_crc_table(); init_keys(password,s->keys,s->pcrc_32_tab); if (ZSEEK(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET)!=0) return UNZ_INTERNALERROR; if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) return UNZ_INTERNALERROR; for (i = 0; i<12; i++) zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; s->encrypted=1; } # endif return UNZ_OK; } extern int ZEXPORT unzOpenCurrentFile (unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } extern int ZEXPORT unzOpenCurrentFilePassword ( unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } extern int ZEXPORT unzOpenCurrentFile2 ( unzFile file, int* method, int* level, int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile ( unzFile file, voidp buf, unsigned len) { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->read_buffer == NULL) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw))) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; if ((len>pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw)) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis)!=uReadThis) return UNZ_ERRNO; # ifndef NOUNCRYPT if(s->encrypted) { uInt i; for(i=0;iread_buffer[i] = zdecode(s->keys,s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]); } # endif pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) { uInt uDoCopy,i ; if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) return (iRead==0) ? UNZ_EOF : iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield ( unzFile file, voidp buf, unsigned len) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf,read_now)!=read_now) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (unzFile file) { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment ( unzFile file, char *szComment, uLong uSizeBuf) { //AKT int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } /* Additions by RX '2004 */ extern uLong ZEXPORT unzGetOffset (unzFile file) { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return 0; if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) if (s->num_file==s->gi.number_entry) return 0; return s->pos_in_central_dir; } extern int ZEXPORT unzSetOffset ( unzFile file, uLong pos) { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir = pos; s->num_file = s->gi.number_entry; /* hack */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } golly-3.3-src/gui-common/MiniZip/ioapi.h0000644000175000017500000000474712227612122015127 00000000000000/* ioapi.h -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant */ #ifndef _ZLIBIOAPI_H #define _ZLIBIOAPI_H #define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_CREATE (8) #ifndef ZCALLBACK #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK #endif #endif #ifdef __cplusplus extern "C" { #endif typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef struct zlib_filefunc_def_s { open_file_func zopen_file; read_file_func zread_file; write_file_func zwrite_file; tell_file_func ztell_file; seek_file_func zseek_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc_def; void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); #define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) #define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) #define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #ifdef __cplusplus } #endif #endif golly-3.3-src/gui-common/MiniZip/unzip.h0000644000175000017500000003125012227612122015160 00000000000000/* unzip.h -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Multi volume ZipFile (span) are not supported. Encryption compatible with pkzip 2.04g only supported Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ /* ****************************************** */ /* Ryan supplied functions */ /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_pos_s { uLong pos_in_zip_directory; /* offset in zip file directory */ uLong num_of_file; /* # of file */ } unz_file_pos; extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos); /* ****************************************** */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ /***************************************************************************/ /* Get the current file offset */ extern uLong ZEXPORT unzGetOffset (unzFile file); /* Set the current file offset */ extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); #ifdef __cplusplus } #endif #endif /* _unz_H */ golly-3.3-src/gui-common/MiniZip/zip.c0000644000175000017500000010655512651666400014634 00000000000000/* zip.c -- IO on .zip files using zlib Version 1.01e, February 12th, 2005 27 Dec 2004 Rolf Kalbermatter Modification to zipOpen2 to support globalComment retrieval. Copyright (C) 1998-2005 Gilles Vollant Read zip.h for more info */ #include #include #include #include #include "zlib.h" #include "zip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef VERSIONMADEBY # define VERSIONMADEBY (0x0) /* platform depedent */ #endif #ifndef Z_BUFSIZE #define Z_BUFSIZE (16384) #endif #ifndef Z_MAXFILENAMEINZIP #define Z_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif /* #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) */ /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef DEF_MEM_LEVEL #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif #endif //const char zip_copyright[] = // " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; #define SIZEDATA_INDATABLOCK (4096-(4*4)) #define LOCALHEADERMAGIC (0x04034b50) #define CENTRALHEADERMAGIC (0x02014b50) #define ENDHEADERMAGIC (0x06054b50) #define FLAG_LOCALHEADER_OFFSET (0x06) #define CRC_LOCALHEADER_OFFSET (0x0e) #define SIZECENTRALHEADER (0x2e) /* 46 */ typedef struct linkedlist_datablock_internal_s { struct linkedlist_datablock_internal_s* next_datablock; uLong avail_in_this_block; uLong filled_in_this_block; uLong unused; /* for future use and alignement */ unsigned char data[SIZEDATA_INDATABLOCK]; } linkedlist_datablock_internal; typedef struct linkedlist_data_s { linkedlist_datablock_internal* first_block; linkedlist_datablock_internal* last_block; } linkedlist_data; typedef struct { z_stream stream; /* zLib stream structure for inflate */ int stream_initialised; /* 1 is stream is initialised */ uInt pos_in_buffered_data; /* last written byte in buffered_data */ uLong pos_local_header; /* offset of the local header of the file currenty writing */ char* central_header; /* central header data for the current file */ uLong size_centralheader; /* size of the central header for cur file */ uLong flag; /* flag of the file currently writing */ int method; /* compression method of file currenty wr.*/ int raw; /* 1 for directly writing raw data */ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32; int encrypt; #ifndef NOCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; int crypt_header_size; #endif } curfile_info; typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ curfile_info ci; /* info on the file curretly writing */ uLong begin_pos; /* position of the beginning of the zipfile */ uLong add_position_when_writting_offset; uLong number_entry; #ifndef NO_ADDFILEINEXISTINGZIP char *globalcomment; #endif } zip_internal; #ifndef NOCRYPT #define INCLUDECRYPTINGCODE_IFCRYPTALLOWED #include "crypt.h" #endif local linkedlist_datablock_internal* allocate_new_datablock() { linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); if (ldi!=NULL) { ldi->next_datablock = NULL ; ldi->filled_in_this_block = 0 ; ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; } return ldi; } local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; TRYFREE(ldi); ldi = ldinext; } } local void init_linkedlist(linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } /* AKT: not used local void free_linkedlist(linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } */ local int add_data_in_datablock( linkedlist_data* ll, const void* buf, uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; if (ll==NULL) return ZIP_INTERNALERROR; if (ll->last_block == NULL) { ll->first_block = ll->last_block = allocate_new_datablock(); if (ll->first_block == NULL) return ZIP_INTERNALERROR; } ldi = ll->last_block; from_copy = (unsigned char*)buf; while (len>0) { uInt copy_this; uInt i; unsigned char* to_copy; if (ldi->avail_in_this_block==0) { ldi->next_datablock = allocate_new_datablock(); if (ldi->next_datablock == NULL) return ZIP_INTERNALERROR; ldi = ldi->next_datablock ; ll->last_block = ldi; } if (ldi->avail_in_this_block < len) copy_this = (uInt)ldi->avail_in_this_block; else copy_this = (uInt)len; to_copy = &(ldi->data[ldi->filled_in_this_block]); for (i=0;ifilled_in_this_block += copy_this; ldi->avail_in_this_block -= copy_this; from_copy += copy_this ; len -= copy_this; } return ZIP_OK; } /****************************************************************************/ #ifndef NO_ADDFILEINEXISTINGZIP /* =========================================================================== Inputs a long in LSB order to the given file nbByte == 1, 2 or 4 (byte, short or long) */ local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte)); local int ziplocal_putValue ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) { unsigned char buf[4]; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; } if (x != 0) { /* data overflow - hack for ZIP64 (X Roche) */ for (n = 0; n < nbByte; n++) { buf[n] = 0xff; } } if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) return ZIP_ERRNO; else return ZIP_OK; } local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); local void ziplocal_putValue_inmemory ( void* dest, uLong x, int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; } if (x != 0) { /* data overflow - hack for ZIP64 */ for (n = 0; n < nbByte; n++) { buf[n] = 0xff; } } } /****************************************************************************/ local uLong ziplocal_TmzDateToDosDate( const tm_zip* ptm, uLong dosDate) { uLong year = (uLong)ptm->tm_year; if (year>1980) year-=1980; else if (year>80) year-=80; return (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); } /****************************************************************************/ local int ziplocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int ziplocal_getByte( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return ZIP_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return ZIP_ERRNO; else return ZIP_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int ziplocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int ziplocal_getShort ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==ZIP_OK) *pX = x; else *pX = 0; return err; } local int ziplocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int ziplocal_getLong ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==ZIP_OK) *pX = x; else *pX = 0; return err; } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong ziplocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong ziplocal_SearchCentralDir( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } #endif /* !NO_ADDFILEINEXISTINGZIP*/ /************************************************************/ extern zipFile ZEXPORT zipOpen2 ( const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def) { zip_internal ziinit; zip_internal* zi; int err=ZIP_OK; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&ziinit.z_filefunc); else ziinit.z_filefunc = *pzlib_filefunc_def; ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) (ziinit.z_filefunc.opaque, pathname, (append == APPEND_STATUS_CREATE) ? (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); if (ziinit.filestream == NULL) return NULL; ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); ziinit.in_opened_file_inzip = 0; ziinit.ci.stream_initialised = 0; ziinit.number_entry = 0; ziinit.add_position_when_writting_offset = 0; init_linkedlist(&(ziinit.central_dir)); zi = (zip_internal*)ALLOC(sizeof(zip_internal)); if (zi==NULL) { ZCLOSE(ziinit.z_filefunc,ziinit.filestream); return NULL; } /* now we add file in a zipfile */ # ifndef NO_ADDFILEINEXISTINGZIP ziinit.globalcomment = NULL; if (append == APPEND_STATUS_ADDINZIP) { uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory */ uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry; uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ uLong size_comment; central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); if (central_pos==0) err=ZIP_ERRNO; if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=ZIP_ERRNO; /* the signature, already checked */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) err=ZIP_ERRNO; /* number of this disk */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) err=ZIP_ERRNO; /* number of the disk with the start of the central directory */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) err=ZIP_ERRNO; /* total number of entries in the central dir on this disk */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) err=ZIP_ERRNO; /* total number of entries in the central dir */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) err=ZIP_ERRNO; if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=ZIP_BADZIPFILE; /* size of the central directory */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) err=ZIP_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) err=ZIP_ERRNO; /* zipfile global comment length */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) err=ZIP_ERRNO; if ((central_pos0) { // AKT added (char*) ziinit.globalcomment = (char*) ALLOC(size_comment+1); if (ziinit.globalcomment) { size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); ziinit.globalcomment[size_comment]=0; } } byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); ziinit.add_position_when_writting_offset = byte_before_the_zipfile; { uLong size_central_dir_to_read = size_central_dir; size_t buf_size = SIZEDATA_INDATABLOCK; void* buf_read = (void*)ALLOC(buf_size); if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) err=ZIP_ERRNO; while ((size_central_dir_to_read>0) && (err==ZIP_OK)) { uLong read_this = SIZEDATA_INDATABLOCK; if (read_this > size_central_dir_to_read) read_this = size_central_dir_to_read; if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) err=ZIP_ERRNO; if (err==ZIP_OK) err = add_data_in_datablock(&ziinit.central_dir,buf_read, (uLong)read_this); size_central_dir_to_read-=read_this; } TRYFREE(buf_read); } ziinit.begin_pos = byte_before_the_zipfile; ziinit.number_entry = number_entry_CD; if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) err=ZIP_ERRNO; } if (globalcomment) { *globalcomment = ziinit.globalcomment; } # endif /* !NO_ADDFILEINEXISTINGZIP*/ if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP TRYFREE(ziinit.globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ TRYFREE(zi); return NULL; } else { *zi = ziinit; return (zipFile)zi; } } extern zipFile ZEXPORT zipOpen ( const char *pathname, int append) { return zipOpen2(pathname,append,NULL,NULL); } extern int ZEXPORT zipOpenNewFileInZip3 ( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char* password, uLong crcForCrypting) { zip_internal* zi; uInt size_filename; uInt size_comment; uInt i; int err = ZIP_OK; # ifdef NOCRYPT if (password != NULL) return ZIP_PARAMERROR; # endif if (file == NULL) return ZIP_PARAMERROR; if ((method!=0) && (method!=Z_DEFLATED)) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 1) { err = zipCloseFileInZip (file); if (err != ZIP_OK) return err; } if (filename==NULL) filename="-"; if (comment==NULL) size_comment = 0; else size_comment = (uInt)strlen(comment); size_filename = (uInt)strlen(filename); if (zipfi == NULL) zi->ci.dosDate = 0; else { if (zipfi->dosDate != 0) zi->ci.dosDate = zipfi->dosDate; else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); } zi->ci.flag = 0; if ((level==8) || (level==9)) zi->ci.flag |= 2; if (level==2) zi->ci.flag |= 4; if (level==1) zi->ci.flag |= 6; if (password != NULL) zi->ci.flag |= 1; zi->ci.crc32 = 0; zi->ci.method = method; zi->ci.encrypt = 0; zi->ci.stream_initialised = 0; zi->ci.pos_in_buffered_data = 0; zi->ci.raw = raw; zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); /* version info */ ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ if (zipfi==NULL) ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); else ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); if (zipfi==NULL) ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); else ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = *(((const char*)extrafield_global)+i); for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ size_extrafield_global+i) = *(comment+i); if (zi->ci.central_header == NULL) return ZIP_INTERNALERROR; /* write the local header */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); if ((err==ZIP_OK) && (size_filename>0)) if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) err = ZIP_ERRNO; if ((err==ZIP_OK) && (size_extrafield_local>0)) if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) !=size_extrafield_local) err = ZIP_ERRNO; zi->ci.stream.avail_in = (uInt)0; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; zi->ci.stream.total_in = 0; zi->ci.stream.total_out = 0; if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { zi->ci.stream.zalloc = (alloc_func)0; zi->ci.stream.zfree = (free_func)0; zi->ci.stream.opaque = (voidpf)0; if (windowBits>0) windowBits = -windowBits; err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); if (err==Z_OK) zi->ci.stream_initialised = 1; } # ifndef NOCRYPT zi->ci.crypt_header_size = 0; if ((err==Z_OK) && (password != NULL)) { unsigned char bufHead[RAND_HEAD_LEN]; unsigned int sizeHead; zi->ci.encrypt = 1; zi->ci.pcrc_32_tab = (const unsigned long *)get_crc_table(); /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); zi->ci.crypt_header_size = sizeHead; if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) err = ZIP_ERRNO; } # endif if (err==Z_OK) zi->in_opened_file_inzip = 1; return err; } extern int ZEXPORT zipOpenNewFileInZip2( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw) { return zipOpenNewFileInZip3 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0); } extern int ZEXPORT zipOpenNewFileInZip ( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level) { return zipOpenNewFileInZip2 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level, 0); } local int zipFlushWriteBuffer(zip_internal* zi) { int err=ZIP_OK; if (zi->ci.encrypt != 0) { #ifndef NOCRYPT uInt i; int t; for (i=0;ici.pos_in_buffered_data;i++) zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); #endif } if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) !=zi->ci.pos_in_buffered_data) err = ZIP_ERRNO; zi->ci.pos_in_buffered_data = 0; return err; } extern int ZEXPORT zipWriteInFileInZip ( zipFile file, const void* buf, unsigned len) { zip_internal* zi; int err=ZIP_OK; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 0) return ZIP_PARAMERROR; zi->ci.stream.next_in = (Bytef*)buf; // AKT was (void*)buf; zi->ci.stream.avail_in = len; zi->ci.crc32 = crc32(zi->ci.crc32, (Bytef*)buf, len); // AKT added (Bytef*) while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) { if (zi->ci.stream.avail_out == 0) { if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) err = ZIP_ERRNO; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; } if(err != ZIP_OK) break; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { uLong uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_NO_FLUSH); zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } else { uInt copy_this,i; if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) copy_this = zi->ci.stream.avail_in; else copy_this = zi->ci.stream.avail_out; for (i=0;ici.stream.next_out)+i) = *(((const char*)zi->ci.stream.next_in)+i); { zi->ci.stream.avail_in -= copy_this; zi->ci.stream.avail_out-= copy_this; zi->ci.stream.next_in+= copy_this; zi->ci.stream.next_out+= copy_this; zi->ci.stream.total_in+= copy_this; zi->ci.stream.total_out+= copy_this; zi->ci.pos_in_buffered_data += copy_this; } } } return err; } extern int ZEXPORT zipCloseFileInZipRaw ( zipFile file, uLong uncompressed_size, uLong crc32) { zip_internal* zi; uLong compressed_size; int err=ZIP_OK; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 0) return ZIP_PARAMERROR; zi->ci.stream.avail_in = 0; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) while (err==ZIP_OK) { uLong uTotalOutBefore; if (zi->ci.stream.avail_out == 0) { if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) err = ZIP_ERRNO; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; } uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_FINISH); zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } if (err==Z_STREAM_END) err=ZIP_OK; /* this is normal */ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) err = ZIP_ERRNO; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { err=deflateEnd(&zi->ci.stream); zi->ci.stream_initialised = 0; } if (!zi->ci.raw) { crc32 = (uLong)zi->ci.crc32; uncompressed_size = (uLong)zi->ci.stream.total_in; } compressed_size = (uLong)zi->ci.stream.total_out; # ifndef NOCRYPT compressed_size += zi->ci.crypt_header_size; # endif ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ if (zi->ci.stream.data_type == Z_ASCII) ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); ziplocal_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ if (err==ZIP_OK) err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, (uLong)zi->ci.size_centralheader); free(zi->ci.central_header); if (err==ZIP_OK) { long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); if (ZSEEK(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) err = ZIP_ERRNO; if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ if (err==ZIP_OK) /* compressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); if (err==ZIP_OK) /* uncompressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); if (ZSEEK(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) err = ZIP_ERRNO; } zi->number_entry ++; zi->in_opened_file_inzip = 0; return err; } extern int ZEXPORT zipCloseFileInZip (zipFile file) { return zipCloseFileInZipRaw (file,0,0); } extern int ZEXPORT zipClose ( zipFile file, const char* global_comment) { zip_internal* zi; int err = 0; uLong size_centraldir = 0; uLong centraldir_pos_inzip; uInt size_global_comment; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 1) { err = zipCloseFileInZip (file); } #ifndef NO_ADDFILEINEXISTINGZIP if (global_comment==NULL) global_comment = zi->globalcomment; #endif if (global_comment==NULL) size_global_comment = 0; else size_global_comment = (uInt)strlen(global_comment); centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); if (err==ZIP_OK) { linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; while (ldi!=NULL) { if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) if (ZWRITE(zi->z_filefunc,zi->filestream, ldi->data,ldi->filled_in_this_block) !=ldi->filled_in_this_block ) err = ZIP_ERRNO; size_centraldir += ldi->filled_in_this_block; ldi = ldi->next_datablock; } } free_datablock(zi->central_dir.first_block); if (err==ZIP_OK) /* Magic End */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); if (err==ZIP_OK) /* number of this disk */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); if (err==ZIP_OK) /* number of the disk with the start of the central directory */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); if (err==ZIP_OK) /* total number of entries in the central dir */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); if (err==ZIP_OK) /* size of the central directory */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); if (err==ZIP_OK) /* zipfile comment length */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); if ((err==ZIP_OK) && (size_global_comment>0)) if (ZWRITE(zi->z_filefunc,zi->filestream, global_comment,size_global_comment) != size_global_comment) err = ZIP_ERRNO; if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) if (err == ZIP_OK) err = ZIP_ERRNO; #ifndef NO_ADDFILEINEXISTINGZIP TRYFREE(zi->globalcomment); #endif TRYFREE(zi); return err; } golly-3.3-src/gui-common/MiniZip/ioapi.c0000644000175000017500000000665512227612122015122 00000000000000/* ioapi.c -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant */ #include #include #include #include "zlib.h" #include "ioapi.h" /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif voidpf ZCALLBACK fopen_file_func OF(( voidpf opaque, const char* filename, int mode)); uLong ZCALLBACK fread_file_func OF(( voidpf opaque, voidpf stream, void* buf, uLong size)); uLong ZCALLBACK fwrite_file_func OF(( voidpf opaque, voidpf stream, const void* buf, uLong size)); long ZCALLBACK ftell_file_func OF(( voidpf opaque, voidpf stream)); long ZCALLBACK fseek_file_func OF(( voidpf opaque, voidpf stream, uLong offset, int origin)); int ZCALLBACK fclose_file_func OF(( voidpf opaque, voidpf stream)); int ZCALLBACK ferror_file_func OF(( voidpf opaque, voidpf stream)); voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = "r+b"; else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = "wb"; if ((filename!=NULL) && (mode_fopen != NULL)) file = fopen(filename, mode_fopen); return file; } uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } uLong ZCALLBACK fwrite_file_func ( voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } long ZCALLBACK ftell_file_func ( voidpf opaque, voidpf stream) { long ret; ret = ftell((FILE *)stream); return ret; } long ZCALLBACK fseek_file_func ( voidpf opaque, voidpf stream, uLong offset, int origin) { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; fseek((FILE *)stream, offset, fseek_origin); return ret; } int ZCALLBACK fclose_file_func ( voidpf opaque, voidpf stream) { int ret; ret = fclose((FILE *)stream); return ret; } int ZCALLBACK ferror_file_func ( voidpf opaque, voidpf stream) { int ret; ret = ferror((FILE *)stream); return ret; } void fill_fopen_filefunc ( zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } golly-3.3-src/Rules/0000755000175000017500000000000013543257426011400 500000000000000golly-3.3-src/Rules/Tempesti.rule0000644000175000017500000005320512124663564014006 00000000000000@RULE Tempesti Transitions rules for Tempesti's self-replicating loops. Converted from rules given in Tempesti's thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/ Note that there's an error in the text, where it says that states are given as clockwise from north: PS,N,NE,E,... but actually they start at NW: PS,NW,N,NE,... Note also that Table A-3 in his thesis has rules that are rotationally symmetric, but Table A-4's rules are not, despite what footnote 39 says. To make a single rule file we've had to expand A-3, giving 175*4+326=1026 rules. Hopefully this can be compressed further. As in Tempesti's thesis, variables are bound within each transition. For example, if a={1,2} then 4,a,0->a represents two transitions: 4,1,0->1 and 4,2,0->2 @TABLE # rules: 1026 # variables: 4 # format: C,N,NE,E,SE,S,SW,W,NW,C' # remaining cases default: state doesn't change # symmetry: none (no rotation/reflection) n_states:10 neighborhood:Moore symmetries:none var a={5,6,7,8,9} var b={5,6,7,8,9} var c={5,6,7,8,9} var d={5,6,7,8,9} 2,b,0,0,0,a,1,1,1,a a,0,0,b,1,1,1,2,0,b b,0,1,c,1,1,1,a,0,c b,1,0,c,d,1,1,a,0,c b,0,0,0,0,c,1,a,1,c c,b,0,0,0,d,1,1,a,d b,a,0,0,0,2,1,1,1,2 b,0,0,c,1,1,1,a,0,c c,b,0,0,0,2,1,1,a,2 b,0,0,0,0,2,1,a,1,2 2,b,0,0,0,a,1,1,c,a b,1,0,c,2,1,1,a,0,c b,2,0,0,0,c,1,1,a,c b,1,0,2,c,1,1,a,0,2 2,0,0,0,0,b,1,a,1,b 0,0,0,0,0,2,a,1,0,2 b,0,1,2,1,1,1,a,0,2 b,c,0,0,0,a,1,1,2,a 2,1,2,b,c,1,1,a,0,b a,2,0,0,0,b,1,2,1,b 0,0,0,0,2,2,0,0,0,2 2,0,0,0,0,a,2,2,0,0 2,0,1,b,1,1,1,a,0,b a,1,0,b,c,1,1,2,0,b 0,0,0,0,0,0,1,2,0,2 a,0,1,b,1,1,1,2,0,b 2,0,0,0,0,0,1,2,0,0 0,0,0,0,0,2,a,1,1,2 2,0,0,0,0,a,2,1,1,0 0,0,0,0,0,2,1,1,1,2 2,0,0,0,0,0,1,1,1,0 0,2,0,0,0,2,1,1,2,2 0,0,0,0,0,2,1,1,2,3 0,0,0,0,3,3,0,0,0,3 3,0,0,0,0,0,1,3,0,0 3,0,0,3,0,1,0,0,0,1 0,0,0,0,0,0,1,3,0,3 0,3,0,0,0,2,1,1,3,2 0,0,0,0,0,2,1,1,3,2 3,3,2,1,0,0,0,3,0,2 3,0,3,2,0,0,0,0,0,1 0,2,1,0,0,0,0,0,3,3 2,3,2,1,0,0,0,3,0,3 1,2,0,1,0,0,0,2,3,3 3,0,0,2,3,3,1,0,0,0 2,0,0,0,1,3,3,3,0,0 3,3,2,3,0,3,0,1,0,0 0,3,1,0,0,0,0,3,3,3 3,2,0,1,0,0,3,3,3,1 3,1,1,0,0,0,0,3,0,1 3,0,1,3,0,0,0,0,1,0 0,0,0,2,1,1,0,0,0,2 0,0,0,2,1,0,1,0,0,2 0,2,0,1,1,0,0,1,0,2 0,2,1,1,1,0,0,0,1,2 2,0,0,0,1,2,1,0,0,0 2,0,1,1,1,0,0,0,1,0 0,1,1,0,3,3,0,0,1,1 0,1,1,1,1,0,0,2,1,3 1,0,1,1,1,0,2,1,0,3 1,1,0,0,0,1,0,3,3,3 1,1,0,0,0,1,3,3,0,3 3,3,1,1,1,0,0,0,1,0 3,0,1,1,1,3,0,1,0,1 0,0,0,0,0,2,1,3,3,3 3,3,0,0,2,1,0,0,1,1 2,0,0,0,0,0,1,1,3,0 0,0,0,0,0,3,1,3,1,2 3,0,0,0,0,0,1,1,3,0 3,1,0,0,3,1,0,1,0,1 0,3,0,0,0,0,1,1,1,3 3,0,0,0,0,0,1,1,1,0 3,0,0,0,0,2,1,1,1,2 2,3,0,0,0,0,1,1,1,3 3,2,0,0,0,0,1,1,1,0 2,0,0,0,0,3,1,1,1,0 0,a,b,1,1,3,0,0,0,3 a,2,1,b,1,3,0,0,0,2 b,1,1,c,0,1,3,a,2,a b,1,1,c,0,1,3,2,a,2 3,2,a,1,1,0,0,0,0,2 2,b,1,a,1,3,0,0,0,b 1,a,b,0,0,1,0,3,2,2 0,2,2,1,1,0,0,0,0,2 2,a,2,2,1,0,0,0,0,a a,b,1,2,2,2,0,0,0,b a,2,1,1,1,b,0,0,2,2 2,1,1,c,0,2,2,a,b,a 2,2,b,0,0,1,0,2,a,1 2,a,1,1,1,0,0,0,0,a a,b,a,1,1,2,0,0,0,b a,1,1,2,0,1,a,b,c,b b,c,1,a,1,a,0,0,0,c b,c,b,1,1,a,0,0,0,c a,1,1,d,0,1,a,b,c,b 2,a,1,1,1,3,0,0,0,a 2,a,1,1,3,0,0,0,0,a 3,a,1,1,3,0,0,0,0,a a,b,1,1,1,3,0,0,0,b b,2,1,a,1,a,0,0,0,3 b,1,1,c,0,1,b,a,2,a b,3,c,1,1,a,0,0,0,3 a,1,1,b,0,1,a,3,c,2 3,a,1,b,1,b,0,0,0,a a,b,1,1,c,3,0,0,0,b b,3,1,1,1,a,0,0,0,3 2,1,1,a,0,1,3,b,c,b a,b,1,2,1,3,0,0,0,b 3,b,2,1,1,a,0,0,0,b 3,b,1,1,1,a,0,0,0,b a,b,a,1,1,3,0,0,0,b 2,a,1,1,0,0,0,0,0,a a,b,1,1,0,2,0,0,0,b 2,a,1,0,1,0,0,0,0,a 0,1,1,0,0,1,0,2,a,2 a,b,1,2,1,0,0,0,0,b 2,1,1,0,0,1,0,a,b,a 2,1,1,0,0,0,1,a,1,a c,3,1,1,a,b,0,0,0,2 0,0,0,0,a,3,1,1,1,4 3,0,0,a,1,3,1,1,1,a a,0,0,b,1,1,3,3,0,b 3,3,a,1,0,0,1,1,1,1 1,1,4,c,1,1,a,b,3,c a,4,0,b,1,1,1,1,1,b b,0,0,c,1,1,1,a,4,c 1,1,0,4,b,1,a,3,b,4 4,0,0,0,b,a,1,1,1,0 3,b,4,b,1,a,0,0,0,b 4,1,0,0,a,b,3,b,a,0 b,4,0,c,1,1,a,3,b,c a,b,1,4,a,3,0,0,0,0 1,1,0,0,0,4,a,b,c,4 3,b,c,1,1,a,0,0,0,b a,0,0,b,1,3,0,0,0,b b,0,0,c,1,1,3,a,0,c a,b,1,4,0,0,0,0,0,0 4,1,0,0,0,0,0,a,b,0 0,0,0,a,3,0,0,0,0,1 a,b,c,1,1,3,0,0,1,b b,0,0,c,1,a,0,1,0,c b,c,d,1,1,a,0,0,1,c 1,1,0,0,0,4,a,b,3,4 b,c,1,1,4,a,0,0,0,c b,c,b,1,4,a,0,0,0,1 1,b,a,0,0,4,a,b,c,0 a,2,1,b,0,1,0,0,0,2 b,1,1,c,0,0,1,a,2,a 1,a,b,0,0,0,0,0,2,2 2,2,b,0,0,0,0,2,a,1 2,2,0,1,0,0,0,0,0,1 1,1,0,0,0,2,0,0,2,3 2,3,3,2,0,0,0,0,0,3 2,3,0,0,0,0,0,2,3,3 3,1,0,0,0,2,2,3,0,1 3,0,1,3,2,2,0,0,0,0 0,3,3,2,0,0,0,0,0,3 2,3,0,0,0,0,0,0,3,3 3,1,0,0,0,2,0,3,0,1 3,0,1,3,2,0,0,0,0,0 2,0,1,1,0,0,0,0,0,0 2,1,1,0,0,1,0,2,0,0 2,a,1,b,0,1,0,0,0,a b,1,1,c,0,0,1,2,a,2 a,b,1,2,0,1,0,0,0,b 2,1,1,a,0,0,1,b,c,b a,1,1,2,0,0,1,b,c,b 1,1,0,0,0,0,0,0,0,4 2,0,1,1,4,0,0,0,0,0 4,1,0,0,0,0,0,0,0,0 1,1,0,0,0,4,0,0,0,4 0,a,b,1,4,0,0,0,0,1 1,b,c,0,0,4,0,0,a,0 2,a,2,1,4,0,0,0,0,0 1,b,2,0,0,4,0,0,a,0 2,0,0,a,1,1,1,b,0,a a,b,1,1,1,2,0,0,0,b b,c,1,1,1,a,0,0,1,c b,c,d,1,1,a,0,1,0,c b,0,0,c,1,a,1,0,0,c c,0,0,d,1,1,a,b,0,d b,0,0,2,1,1,1,a,0,2 b,c,1,1,1,a,0,0,0,c c,0,0,2,1,1,a,b,0,2 b,0,0,2,1,a,1,0,0,2 2,0,0,a,1,1,c,b,0,a b,c,2,1,1,a,0,1,0,c b,0,0,c,1,1,a,2,0,c b,2,c,1,1,a,0,1,0,2 2,0,0,b,1,a,1,0,0,b 0,0,0,2,a,1,0,0,0,2 b,2,1,1,1,a,0,0,1,2 b,0,0,a,1,1,2,c,0,a 2,b,c,1,1,a,0,1,2,b a,0,0,b,1,2,1,2,0,b 0,0,2,2,0,0,0,0,0,2 2,0,0,a,2,2,0,0,0,0 2,b,1,1,1,a,0,0,1,b a,b,c,1,1,2,0,1,0,b 0,0,0,0,1,2,0,0,0,2 a,b,1,1,1,2,0,0,1,b 2,0,0,0,1,2,0,0,0,0 0,0,0,2,a,1,1,0,0,2 2,0,0,a,2,1,1,0,0,0 0,0,0,2,1,1,1,0,0,2 2,0,0,0,1,1,1,0,0,0 0,0,0,2,1,1,2,2,0,2 0,0,0,2,1,1,2,0,0,3 0,0,3,3,0,0,0,0,0,3 3,0,0,0,1,3,0,0,0,0 3,3,0,1,0,0,0,0,0,1 0,0,0,0,1,3,0,0,0,3 0,0,0,2,1,1,3,3,0,2 0,0,0,2,1,1,3,0,0,2 3,1,0,0,0,3,0,3,2,2 3,2,0,0,0,0,0,0,3,1 0,0,0,0,0,0,3,2,1,3 2,1,0,0,0,3,0,3,2,3 1,1,0,0,0,2,3,2,0,3 3,2,3,3,1,0,0,0,0,0 2,0,1,3,3,3,0,0,0,0 3,3,0,3,0,1,0,3,2,0 0,0,0,0,0,3,3,3,1,3 3,1,0,0,3,3,3,2,0,1 3,0,0,0,0,3,0,1,1,1 3,3,0,0,0,0,1,0,1,0 0,2,1,1,0,0,0,0,0,2 0,2,1,0,1,0,0,0,0,2 0,1,1,0,0,1,0,2,0,2 0,1,1,0,0,0,1,2,1,2 2,0,1,2,1,0,0,0,0,0 2,1,1,0,0,0,1,0,1,0 0,0,3,3,0,0,1,1,1,1 0,1,1,0,0,2,1,1,1,3 1,1,1,0,2,1,0,0,1,3 1,0,0,1,0,3,3,1,0,3 1,0,0,1,3,3,0,1,0,3 3,1,1,0,0,0,1,3,1,0 3,1,1,3,0,1,0,0,1,1 0,0,0,2,1,3,3,0,0,3 3,0,2,1,0,0,1,3,0,1 2,0,0,0,1,1,3,0,0,0 0,0,0,3,1,3,1,0,0,2 3,0,0,0,1,1,3,0,0,0 3,0,3,1,0,1,0,1,0,1 0,0,0,0,1,1,1,3,0,3 3,0,0,0,1,1,1,0,0,0 3,0,0,2,1,1,1,0,0,2 2,0,0,0,1,1,1,3,0,3 3,0,0,0,1,1,1,2,0,0 2,0,0,3,1,1,1,0,0,0 0,1,1,3,0,0,0,a,b,3 a,b,1,3,0,0,0,2,1,2 b,c,0,1,3,a,2,1,1,a b,c,0,1,3,2,a,1,1,2 3,1,1,0,0,0,0,2,a,2 2,a,1,3,0,0,0,b,1,b 1,0,0,1,0,3,2,a,b,2 0,1,1,0,0,0,0,2,2,2 2,2,1,0,0,0,0,a,2,a a,2,2,2,0,0,0,b,1,b a,1,1,b,0,0,2,2,1,2 2,c,0,2,2,a,b,1,1,a 2,0,0,1,0,2,a,2,b,1 2,1,1,0,0,0,0,a,1,a a,1,1,2,0,0,0,b,a,b a,2,0,1,a,b,c,1,1,b b,a,1,a,0,0,0,c,1,c b,1,1,a,0,0,0,c,b,c a,d,0,1,a,b,c,1,1,b 2,1,1,3,0,0,0,a,1,a 2,1,3,0,0,0,0,a,1,a 3,1,3,0,0,0,0,a,1,a a,1,1,3,0,0,0,b,1,b b,a,1,a,0,0,0,2,1,3 b,c,0,1,b,a,2,1,1,a b,1,1,a,0,0,0,3,c,3 a,b,0,1,a,3,c,1,1,2 3,b,1,b,0,0,0,a,1,a a,1,c,3,0,0,0,b,1,b b,1,1,a,0,0,0,3,1,3 2,a,0,1,3,b,c,1,1,b a,2,1,3,0,0,0,b,1,b 3,1,1,a,0,0,0,b,2,b 3,1,1,a,0,0,0,b,1,b a,1,1,3,0,0,0,b,a,b 2,1,0,0,0,0,0,a,1,a a,1,0,2,0,0,0,b,1,b 2,0,1,0,0,0,0,a,1,a 0,0,0,1,0,2,a,1,1,2 a,2,1,0,0,0,0,b,1,b 2,0,0,1,0,a,b,1,1,a 2,0,0,0,1,a,1,1,1,a c,1,a,b,0,0,0,3,1,2 0,0,a,3,1,1,1,0,0,4 3,a,1,3,1,1,1,0,0,a a,b,1,1,3,3,0,0,0,b 3,1,0,0,1,1,1,3,a,1 1,c,1,1,a,b,3,1,4,c a,b,1,1,1,1,1,4,0,b b,c,1,1,1,a,4,0,0,c 1,4,b,1,a,3,b,1,0,4 4,0,b,a,1,1,1,0,0,0 3,b,1,a,0,0,0,b,4,b 4,0,a,b,3,b,a,1,0,0 b,c,1,1,a,3,b,4,0,c a,4,a,3,0,0,0,b,1,0 1,0,0,4,a,b,c,1,0,4 3,1,1,a,0,0,0,b,c,b a,b,1,3,0,0,0,0,0,b b,c,1,1,3,a,0,0,0,c a,4,0,0,0,0,0,b,1,0 4,0,0,0,0,a,b,1,0,0 0,a,3,0,0,0,0,0,0,1 a,1,1,3,0,0,1,b,c,b b,c,1,a,0,1,0,0,0,c b,1,1,a,0,0,1,c,d,c 1,0,0,4,a,b,3,1,0,4 b,1,4,a,0,0,0,c,1,c b,1,4,a,0,0,0,c,b,1 1,0,0,4,a,b,c,b,a,0 a,b,0,1,0,0,0,2,1,2 b,c,0,0,1,a,2,1,1,a 1,0,0,0,0,0,2,a,b,2 2,0,0,0,0,2,a,2,b,1 2,1,0,0,0,0,0,2,0,1 1,0,0,2,0,0,2,1,0,3 2,2,0,0,0,0,0,3,3,3 2,0,0,0,0,2,3,3,0,3 3,0,0,2,2,3,0,1,0,1 3,3,2,2,0,0,0,0,1,0 0,2,0,0,0,0,0,3,3,3 2,0,0,0,0,0,3,3,0,3 3,0,0,2,0,3,0,1,0,1 3,3,2,0,0,0,0,0,1,0 2,1,0,0,0,0,0,0,1,0 2,0,0,1,0,2,0,1,1,0 2,b,0,1,0,0,0,a,1,a b,c,0,0,1,2,a,1,1,2 a,2,0,1,0,0,0,b,1,b 2,a,0,0,1,b,c,1,1,b a,2,0,0,1,b,c,1,1,b 1,0,0,0,0,0,0,1,0,4 2,1,4,0,0,0,0,0,1,0 4,0,0,0,0,0,0,1,0,0 1,0,0,4,0,0,0,1,0,4 0,1,4,0,0,0,0,a,b,1 1,0,0,4,0,0,a,b,c,0 2,1,4,0,0,0,0,a,2,0 1,0,0,4,0,0,a,b,2,0 2,a,1,1,1,b,0,0,0,a a,1,1,2,0,0,0,b,1,b b,1,1,a,0,0,1,c,1,c b,1,1,a,0,1,0,c,d,c b,c,1,a,1,0,0,0,0,c c,d,1,1,a,b,0,0,0,d b,2,1,1,1,a,0,0,0,2 b,1,1,a,0,0,0,c,1,c c,2,1,1,a,b,0,0,0,2 b,2,1,a,1,0,0,0,0,2 2,a,1,1,c,b,0,0,0,a b,1,1,a,0,1,0,c,2,c b,c,1,1,a,2,0,0,0,c b,1,1,a,0,1,0,2,c,2 2,b,1,a,1,0,0,0,0,b 0,2,a,1,0,0,0,0,0,2 b,1,1,a,0,0,1,2,1,2 b,a,1,1,2,c,0,0,0,a 2,1,1,a,0,1,2,b,c,b a,b,1,2,1,2,0,0,0,b 0,2,0,0,0,0,0,0,2,2 2,a,2,2,0,0,0,0,0,0 2,1,1,a,0,0,1,b,1,b a,1,1,2,0,1,0,b,c,b 0,0,1,2,0,0,0,0,0,2 a,1,1,2,0,0,1,b,1,b 2,0,1,2,0,0,0,0,0,0 0,2,a,1,1,0,0,0,0,2 2,a,2,1,1,0,0,0,0,0 0,2,1,1,1,0,0,0,0,2 2,0,1,1,1,0,0,0,0,0 0,2,1,1,2,2,0,0,0,2 0,2,1,1,2,0,0,0,0,3 0,3,0,0,0,0,0,0,3,3 3,0,1,3,0,0,0,0,0,0 3,1,0,0,0,0,0,3,0,1 0,0,1,3,0,0,0,0,0,3 0,2,1,1,3,3,0,0,0,2 0,2,1,1,3,0,0,0,0,2 3,0,0,3,0,3,2,1,0,2 3,0,0,0,0,0,3,2,0,1 0,0,0,0,3,2,1,0,0,3 2,0,0,3,0,3,2,1,0,3 1,0,0,2,3,2,0,1,0,3 3,3,1,0,0,0,0,2,3,0 2,3,3,3,0,0,0,0,1,0 3,3,0,1,0,3,2,3,0,0 0,0,0,3,3,3,1,0,0,3 3,0,3,3,3,2,0,1,0,1 3,0,0,3,0,1,1,0,0,1 3,0,0,0,1,0,1,3,0,0 0,1,0,0,0,0,0,2,1,2 0,0,1,0,0,0,0,2,1,2 0,0,0,1,0,2,0,1,1,2 0,0,0,0,1,2,1,1,1,2 2,2,1,0,0,0,0,0,1,0 2,0,0,0,1,0,1,1,1,0 0,3,0,0,1,1,1,0,3,1 0,0,0,2,1,1,1,1,1,3 1,0,2,1,0,0,1,1,1,3 1,1,0,3,3,1,0,0,0,3 1,1,3,3,0,1,0,0,0,3 3,0,0,0,1,3,1,1,1,0 3,3,0,1,0,0,1,1,1,1 0,2,1,3,3,0,0,0,0,3 3,1,0,0,1,3,0,0,2,1 2,0,1,1,3,0,0,0,0,0 0,3,1,3,1,0,0,0,0,2 3,0,1,1,3,0,0,0,0,0 3,1,0,1,0,1,0,0,3,1 0,0,1,1,1,3,0,0,0,3 3,0,1,1,1,0,0,0,0,0 3,2,1,1,1,0,0,0,0,2 2,0,1,1,1,3,0,0,0,3 3,0,1,1,1,2,0,0,0,0 2,3,1,1,1,0,0,0,0,0 0,3,0,0,0,a,b,1,1,3 a,3,0,0,0,2,1,b,1,2 b,1,3,a,2,1,1,c,0,a b,1,3,2,a,1,1,c,0,2 3,0,0,0,0,2,a,1,1,2 2,3,0,0,0,b,1,a,1,b 1,1,0,3,2,a,b,0,0,2 0,0,0,0,0,2,2,1,1,2 2,0,0,0,0,a,2,2,1,a a,2,0,0,0,b,1,2,2,b a,b,0,0,2,2,1,1,1,2 2,2,2,a,b,1,1,c,0,a 2,1,0,2,a,2,b,0,0,1 2,0,0,0,0,a,1,1,1,a a,2,0,0,0,b,a,1,1,b a,1,a,b,c,1,1,2,0,b b,a,0,0,0,c,1,a,1,c b,a,0,0,0,c,b,1,1,c a,1,a,b,c,1,1,d,0,b 2,3,0,0,0,a,1,1,1,a 2,0,0,0,0,a,1,1,3,a 3,0,0,0,0,a,1,1,3,a a,3,0,0,0,b,1,1,1,b b,a,0,0,0,2,1,a,1,3 b,1,b,a,2,1,1,c,0,a b,a,0,0,0,3,c,1,1,3 a,1,a,3,c,1,1,b,0,2 3,b,0,0,0,a,1,b,1,a a,3,0,0,0,b,1,1,c,b b,a,0,0,0,3,1,1,1,3 2,1,3,b,c,1,1,a,0,b a,3,0,0,0,b,1,2,1,b 3,a,0,0,0,b,2,1,1,b 3,a,0,0,0,b,1,1,1,b a,3,0,0,0,b,a,1,1,b 2,0,0,0,0,a,1,1,0,a a,2,0,0,0,b,1,1,0,b 2,0,0,0,0,a,1,0,1,a 0,1,0,2,a,1,1,0,0,2 a,0,0,0,0,b,1,2,1,b 2,1,0,a,b,1,1,0,0,a 2,0,1,a,1,1,1,0,0,a c,b,0,0,0,3,1,1,a,2 0,3,1,1,1,0,0,0,a,4 3,3,1,1,1,0,0,a,1,a a,1,3,3,0,0,0,b,1,b 3,0,1,1,1,3,a,1,0,1 1,1,a,b,3,1,4,c,1,c a,1,1,1,1,4,0,b,1,b b,1,1,a,4,0,0,c,1,c 1,1,a,3,b,1,0,4,b,4 4,a,1,1,1,0,0,0,b,0 3,a,0,0,0,b,4,b,1,b 4,b,3,b,a,1,0,0,a,0 b,1,a,3,b,4,0,c,1,c a,3,0,0,0,b,1,4,a,0 1,4,a,b,c,1,0,0,0,4 3,a,0,0,0,b,c,1,1,b a,3,0,0,0,0,0,b,1,b b,1,3,a,0,0,0,c,1,c a,0,0,0,0,b,1,4,0,0 4,0,0,a,b,1,0,0,0,0 0,0,0,0,0,0,0,a,3,1 a,3,0,0,1,b,c,1,1,b b,a,0,1,0,0,0,c,1,c b,a,0,0,1,c,d,1,1,c 1,4,a,b,3,1,0,0,0,4 b,a,0,0,0,c,1,1,4,c b,a,0,0,0,c,b,1,4,1 1,4,a,b,c,b,a,0,0,0 a,1,0,0,0,2,1,b,0,2 b,0,1,a,2,1,1,c,0,a 1,0,0,0,2,a,b,0,0,2 2,0,0,2,a,2,b,0,0,1 2,0,0,0,0,2,0,1,0,1 1,2,0,0,2,1,0,0,0,3 2,0,0,0,0,3,3,2,0,3 2,0,0,2,3,3,0,0,0,3 3,2,2,3,0,1,0,0,0,1 3,2,0,0,0,0,1,3,2,0 0,0,0,0,0,3,3,2,0,3 2,0,0,0,3,3,0,0,0,3 3,2,0,3,0,1,0,0,0,1 3,0,0,0,0,0,1,3,2,0 2,0,0,0,0,0,1,1,0,0 2,1,0,2,0,1,1,0,0,0 2,1,0,0,0,a,1,b,0,a b,0,1,2,a,1,1,c,0,2 a,1,0,0,0,b,1,2,0,b 2,0,1,b,c,1,1,a,0,b a,0,1,b,c,1,1,2,0,b 1,0,0,0,0,1,0,0,0,4 2,0,0,0,0,0,1,1,4,0 4,0,0,0,0,1,0,0,0,0 1,4,0,0,0,1,0,0,0,4 0,0,0,0,0,a,b,1,4,1 1,4,0,0,a,b,c,0,0,0 2,0,0,0,0,a,2,1,4,0 1,4,0,0,a,b,2,0,0,0 2,1,1,b,0,0,0,a,1,a a,2,0,0,0,b,1,1,1,b b,a,0,0,1,c,1,1,1,c b,a,0,1,0,c,d,1,1,c b,a,1,0,0,0,0,c,1,c c,1,a,b,0,0,0,d,1,d b,1,1,a,0,0,0,2,1,2 b,a,0,0,0,c,1,1,1,c c,1,a,b,0,0,0,2,1,2 b,a,1,0,0,0,0,2,1,2 2,1,c,b,0,0,0,a,1,a b,a,0,1,0,c,2,1,1,c b,1,a,2,0,0,0,c,1,c b,a,0,1,0,2,c,1,1,2 2,a,1,0,0,0,0,b,1,b 0,1,0,0,0,0,0,2,a,2 b,a,0,0,1,2,1,1,1,2 b,1,2,c,0,0,0,a,1,a 2,a,0,1,2,b,c,1,1,b a,2,1,2,0,0,0,b,1,b 0,0,0,0,0,0,2,2,0,2 2,2,0,0,0,0,0,a,2,0 2,a,0,0,1,b,1,1,1,b a,2,0,1,0,b,c,1,1,b 0,2,0,0,0,0,0,0,1,2 a,2,0,0,1,b,1,1,1,b 2,2,0,0,0,0,0,0,1,0 0,1,1,0,0,0,0,2,a,2 2,1,1,0,0,0,0,a,2,0 0,1,1,0,0,0,0,2,1,2 2,1,1,0,0,0,0,0,1,0 0,1,2,2,0,0,0,2,1,2 0,1,2,0,0,0,0,2,1,3 0,0,0,0,0,0,3,3,0,3 3,3,0,0,0,0,0,0,1,0 3,0,0,0,0,3,0,1,0,1 0,3,0,0,0,0,0,0,1,3 0,1,3,3,0,0,0,2,1,2 0,1,3,0,0,0,0,2,1,2 3,3,0,3,2,1,0,0,0,2 3,0,0,0,3,2,0,0,0,1 0,0,3,2,1,0,0,0,0,3 2,3,0,3,2,1,0,0,0,3 1,2,3,2,0,1,0,0,0,3 3,0,0,0,0,2,3,3,1,0 2,3,0,0,0,0,1,3,3,0 3,1,0,3,2,3,0,3,0,0 0,3,3,3,1,0,0,0,0,3 3,3,3,2,0,1,0,0,3,1 3,3,0,1,1,0,0,0,0,1 3,0,1,0,1,3,0,0,0,0 0,0,0,0,0,2,1,1,0,2 0,0,0,0,0,2,1,0,1,2 0,1,0,2,0,1,1,0,0,2 0,0,1,2,1,1,1,0,0,2 2,0,0,0,0,0,1,2,1,0 2,0,1,0,1,1,1,0,0,0 0,0,1,1,1,0,3,3,0,1 0,2,1,1,1,1,1,0,0,3 1,1,0,0,1,1,1,0,2,3 1,3,3,1,0,0,0,1,0,3 1,3,0,1,0,0,0,1,3,3 3,0,1,3,1,1,1,0,0,0 3,1,0,0,1,1,1,3,0,1 0,3,3,0,0,0,0,2,1,3 3,0,1,3,0,0,2,1,0,1 2,1,3,0,0,0,0,0,1,0 0,3,1,0,0,0,0,3,1,2 3,1,3,0,0,0,0,0,1,0 3,1,0,1,0,0,3,1,0,1 0,1,1,3,0,0,0,0,1,3 3,1,1,0,0,0,0,0,1,0 3,1,1,0,0,0,0,2,1,2 2,1,1,3,0,0,0,0,1,3 3,1,1,2,0,0,0,0,1,0 2,1,1,0,0,0,0,3,1,0 0,0,0,a,b,1,1,3,0,3 a,0,0,2,1,b,1,3,0,2 b,a,2,1,1,c,0,1,3,a b,2,a,1,1,c,0,1,3,2 3,0,0,2,a,1,1,0,0,2 2,0,0,b,1,a,1,3,0,b 1,3,2,a,b,0,0,1,0,2 0,0,0,2,2,1,1,0,0,2 2,0,0,a,2,2,1,0,0,a a,0,0,b,1,2,2,2,0,b a,0,2,2,1,1,1,b,0,2 2,a,b,1,1,c,0,2,2,a 2,2,a,2,b,0,0,1,0,1 2,0,0,a,1,1,1,0,0,a a,0,0,b,a,1,1,2,0,b a,b,c,1,1,2,0,1,a,b b,0,0,c,1,a,1,a,0,c b,0,0,c,b,1,1,a,0,c a,b,c,1,1,d,0,1,a,b 2,0,0,a,1,1,1,3,0,a 2,0,0,a,1,1,3,0,0,a 3,0,0,a,1,1,3,0,0,a a,0,0,b,1,1,1,3,0,b b,0,0,2,1,a,1,a,0,3 b,a,2,1,1,c,0,1,b,a b,0,0,3,c,1,1,a,0,3 a,3,c,1,1,b,0,1,a,2 3,0,0,a,1,b,1,b,0,a a,0,0,b,1,1,c,3,0,b b,0,0,3,1,1,1,a,0,3 2,b,c,1,1,a,0,1,3,b a,0,0,b,1,2,1,3,0,b 3,0,0,b,2,1,1,a,0,b 3,0,0,b,1,1,1,a,0,b a,0,0,b,a,1,1,3,0,b 2,0,0,a,1,1,0,0,0,a a,0,0,b,1,1,0,2,0,b 2,0,0,a,1,0,1,0,0,a 0,2,a,1,1,0,0,1,0,2 a,0,0,b,1,2,1,0,0,b 2,a,b,1,1,0,0,1,0,a 2,a,1,1,1,0,0,0,1,a c,0,0,3,1,1,a,b,0,2 0,1,1,0,0,0,a,3,1,4 3,1,1,0,0,a,1,3,1,a a,3,0,0,0,b,1,1,3,b 3,1,1,3,a,1,0,0,1,1 1,b,3,1,4,c,1,1,a,c a,1,1,4,0,b,1,1,1,b b,a,4,0,0,c,1,1,1,c 1,3,b,1,0,4,b,1,a,4 4,1,1,0,0,0,b,a,1,0 3,0,0,b,4,b,1,a,0,b 4,b,a,1,0,0,a,b,3,0 b,3,b,4,0,c,1,1,a,c a,0,0,b,1,4,a,3,0,0 1,b,c,1,0,0,0,4,a,4 3,0,0,b,c,1,1,a,0,b a,0,0,0,0,b,1,3,0,b b,a,0,0,0,c,1,1,3,c a,0,0,b,1,4,0,0,0,0 4,a,b,1,0,0,0,0,0,0 0,0,0,0,0,a,3,0,0,1 a,0,1,b,c,1,1,3,0,b b,1,0,0,0,c,1,a,0,c b,0,1,c,d,1,1,a,0,c 1,b,3,1,0,0,0,4,a,4 b,0,0,c,1,1,4,a,0,c b,0,0,c,b,1,4,a,0,1 1,b,c,b,a,0,0,4,a,0 a,0,0,2,1,b,0,1,0,2 b,a,2,1,1,c,0,0,1,a 1,0,2,a,b,0,0,0,0,2 2,2,a,2,b,0,0,0,0,1 2,0,0,2,0,1,0,0,0,1 1,0,2,1,0,0,0,2,0,3 2,0,0,3,3,2,0,0,0,3 2,2,3,3,0,0,0,0,0,3 3,3,0,1,0,0,0,2,2,1 3,0,0,0,1,3,2,2,0,0 0,0,0,3,3,2,0,0,0,3 2,0,3,3,0,0,0,0,0,3 3,3,0,1,0,0,0,2,0,1 3,0,0,0,1,3,2,0,0,0 2,0,0,0,1,1,0,0,0,0 2,2,0,1,1,0,0,1,0,0 2,0,0,a,1,b,0,1,0,a b,2,a,1,1,c,0,0,1,2 a,0,0,b,1,2,0,1,0,b 2,b,c,1,1,a,0,0,1,b a,b,c,1,1,2,0,0,1,b 1,0,0,1,0,0,0,0,0,4 2,0,0,0,1,1,4,0,0,0 4,0,0,1,0,0,0,0,0,0 1,0,0,1,0,0,0,4,0,4 0,0,0,a,b,1,4,0,0,1 1,0,a,b,c,0,0,4,0,0 2,0,0,a,2,1,4,0,0,0 1,0,a,b,2,0,0,4,0,0 # # rules for construction: # 1,7,2,1,0,0,1,1,5,5 7,0,0,2,5,1,5,5,0,2 2,0,0,7,1,5,1,7,0,7 1,7,5,1,0,0,0,5,2,5 5,2,7,1,0,0,1,1,7,1 7,0,0,5,5,1,1,2,0,5 5,0,0,6,1,5,1,7,0,6 1,6,6,1,0,0,0,5,5,6 0,5,6,0,0,0,0,0,1,5 0,6,1,0,0,0,0,5,5,6 0,5,6,0,0,0,0,0,0,5 0,6,0,0,0,0,0,5,5,6 6,0,0,7,1,6,5,6,0,7 6,7,6,1,0,6,5,5,6,7 6,0,0,7,6,5,1,6,0,7 7,0,0,6,1,6,5,6,0,6 7,6,6,1,0,6,5,5,7,6 6,7,1,0,0,6,5,5,5,7 6,0,0,9,1,6,5,6,0,9 7,6,1,0,0,6,5,5,5,6 6,7,0,0,0,6,5,5,5,7 7,6,0,0,0,6,5,5,5,6 6,0,0,9,6,5,1,6,0,9 6,9,6,1,0,6,5,5,6,9 9,0,0,6,1,6,5,6,0,6 9,0,0,6,9,5,1,6,0,6 6,9,1,0,0,6,5,5,5,9 9,6,1,0,0,6,5,5,5,6 6,9,0,0,0,6,5,5,5,9 9,6,0,0,0,6,5,5,5,6 2,0,0,6,1,6,5,6,0,6 2,0,0,6,6,5,1,6,0,6 9,6,2,1,0,6,5,5,9,6 6,0,0,2,1,9,5,9,0,2 6,0,0,2,6,5,1,9,0,2 6,7,0,0,0,0,5,5,5,7 6,7,0,0,0,0,0,5,5,7 5,5,7,0,0,0,0,0,0,7 0,7,0,0,0,0,0,5,5,7 0,0,0,0,0,0,0,7,6,7 7,6,0,0,0,0,5,5,5,6 6,9,0,0,7,6,5,5,5,9 7,0,0,0,0,0,7,6,6,6 7,5,6,7,0,0,0,0,0,5 7,6,7,0,0,0,0,7,5,5 0,7,0,0,0,0,0,7,6,5 0,0,0,0,0,0,0,5,6,5 9,6,0,0,6,6,5,5,5,6 6,9,0,6,5,5,5,5,5,9 6,0,0,8,1,6,5,6,0,8 6,8,6,1,0,6,5,5,6,8 6,0,0,8,6,5,1,6,0,8 8,0,0,6,1,6,5,6,0,6 0,0,0,0,0,5,5,6,0,6 6,0,0,0,5,5,5,9,6,9 9,6,0,6,5,5,5,5,5,6 6,8,1,0,0,6,5,5,5,8 8,0,0,6,8,5,1,6,0,6 8,6,6,1,0,6,5,5,8,6 6,8,0,0,0,6,5,5,5,8 8,6,1,0,0,6,5,5,5,6 8,6,0,0,0,6,5,5,5,6 6,0,0,0,0,5,5,9,0,9 9,0,0,6,5,5,5,6,6,6 9,0,0,0,5,5,5,6,0,6 5,0,0,0,0,0,0,5,9,7 0,0,0,0,0,5,5,9,0,9 6,7,0,0,6,6,5,5,5,7 9,0,0,0,0,7,5,6,0,6 0,0,0,0,0,0,0,7,9,6 7,9,0,0,0,0,0,5,6,0 7,6,0,0,6,6,5,5,5,6 6,7,0,6,5,5,5,5,5,7 0,0,0,0,0,6,0,6,0,6 7,6,0,6,5,5,5,5,5,6 6,0,0,6,5,5,5,7,6,7 6,6,0,0,0,0,0,0,6,5 6,0,0,6,0,5,5,7,0,7 7,0,0,6,5,5,5,6,6,6 6,7,0,0,7,6,5,5,5,7 6,0,0,6,5,0,5,7,0,7 7,0,0,6,0,5,5,6,0,6 7,0,0,6,5,0,5,6,0,6 6,0,0,6,5,5,0,7,0,7 6,8,0,0,7,6,5,5,5,8 7,0,0,6,5,5,0,6,0,6 6,0,0,0,5,5,5,7,0,7 6,9,2,1,0,6,5,5,6,9 9,0,0,2,1,6,5,6,0,2 9,0,0,2,9,5,1,6,0,2 2,0,0,6,1,9,5,9,0,6 9,2,6,1,0,6,5,5,9,6 2,0,0,6,6,5,1,9,0,6 7,0,0,6,5,5,5,6,0,6 6,0,0,0,0,5,5,7,0,7 0,0,0,0,0,5,5,7,0,7 5,0,0,0,0,0,0,5,7,7 0,0,0,0,0,7,6,0,0,7 7,0,0,0,5,5,5,6,0,6 7,0,0,0,7,6,6,0,0,6 6,0,7,6,5,5,5,7,0,7 7,0,0,0,0,7,5,6,7,5 7,7,0,0,0,0,0,5,6,5 0,0,0,0,0,7,6,7,0,5 0,0,0,0,0,5,6,0,0,5 6,6,5,5,5,5,5,7,0,7 7,0,6,6,5,5,5,6,0,6 6,8,0,6,5,5,5,5,5,8 8,6,0,0,6,6,5,5,5,6 6,0,0,6,5,5,5,8,6,8 8,6,0,6,5,5,5,5,5,6 8,0,0,6,5,5,5,6,6,6 6,0,0,6,0,5,5,8,0,8 6,0,0,6,5,0,5,8,0,8 8,0,0,6,0,5,5,6,0,6 8,0,0,6,5,0,5,6,0,6 7,6,5,5,5,5,5,6,0,6 0,0,0,5,5,6,0,0,0,6 6,0,5,5,5,7,6,0,0,7 6,0,0,6,5,5,0,8,0,8 6,8,0,0,6,6,5,5,5,8 6,0,7,6,5,5,5,8,0,8 6,0,0,5,5,7,0,0,0,7 7,6,5,5,5,6,6,0,0,6 8,0,0,6,5,5,0,6,0,6 0,0,0,5,5,7,0,0,0,7 5,0,0,0,0,5,7,0,0,7 0,0,0,7,6,0,0,0,0,7 7,0,5,5,5,6,0,0,0,6 6,6,5,5,5,5,5,8,0,8 8,0,6,6,5,5,5,6,0,6 0,0,0,7,6,7,0,0,0,5 7,0,0,7,5,6,7,0,0,5 7,0,0,0,0,5,6,7,0,5 7,0,7,6,6,0,0,0,0,6 8,6,5,5,5,5,5,6,0,6 6,6,5,5,5,8,6,0,7,8 6,5,5,5,5,8,0,6,5,8 8,6,5,5,5,6,6,0,6,6 0,0,0,5,6,0,0,0,0,5 6,0,0,8,1,6,5,2,0,8 6,0,0,8,6,5,1,2,0,8 6,0,0,8,5,1,1,2,0,8 6,5,5,8,6,0,0,0,5,8 0,5,5,6,0,0,0,0,0,6 8,5,5,5,5,6,0,6,5,6 6,9,0,0,6,6,5,5,5,9 6,5,5,8,0,0,0,0,0,8 6,0,6,6,5,5,5,8,0,8 6,0,0,6,5,5,5,9,6,9 8,5,5,6,6,0,0,6,5,6 6,0,0,6,0,5,5,9,0,9 0,5,5,8,0,0,0,0,0,8 6,8,0,0,9,6,5,5,5,8 8,5,5,6,0,0,0,0,5,6 5,0,0,5,6,8,0,0,0,8 6,6,5,5,5,8,6,0,6,8 6,0,0,6,5,0,5,9,0,9 9,0,0,6,0,5,5,6,0,6 8,5,5,6,0,0,0,0,0,6 6,0,0,6,5,5,0,9,0,9 8,0,0,5,6,6,0,0,0,6 9,0,0,6,5,0,5,6,0,6 0,0,0,0,5,5,8,0,0,5 6,0,0,5,1,6,5,6,0,5 6,5,5,8,6,0,0,6,5,8 6,0,6,6,5,5,5,9,0,9 9,0,0,6,5,5,0,6,0,6 6,0,0,5,6,5,1,6,0,5 6,5,5,1,0,6,5,5,6,5 6,5,5,8,0,0,0,6,6,8 9,0,6,6,5,5,5,6,0,6 6,6,5,5,5,5,5,9,0,9 6,5,1,0,0,6,5,5,5,5 6,5,0,0,0,6,5,5,5,0 5,5,5,6,6,5,0,0,0,0 5,5,1,0,0,6,5,5,5,0 5,5,5,5,6,5,0,0,1,0 6,6,5,8,0,0,0,0,0,8 6,6,5,5,5,9,6,0,6,9 8,5,5,6,0,0,0,6,6,6 9,6,5,5,5,5,5,6,0,6 6,0,0,0,0,6,5,5,0,0 6,6,5,5,6,8,0,0,0,8 6,0,9,6,5,5,5,8,0,8 6,5,5,5,5,9,0,6,5,9 9,6,5,5,5,6,6,0,6,6 8,6,5,6,0,0,0,0,0,6 6,0,0,0,0,6,5,5,5,0 6,5,5,9,6,0,0,6,5,9 6,6,5,5,5,8,0,0,0,8 8,6,5,5,6,6,0,0,0,6 9,5,5,5,5,6,0,6,5,6 8,6,5,5,5,6,0,0,0,6 9,5,5,6,6,0,0,6,5,6 6,6,5,5,5,8,6,0,9,8 6,5,5,9,0,0,0,6,6,9 6,0,5,5,5,8,0,0,0,8 6,6,5,9,0,0,0,0,0,9 9,5,5,6,0,0,0,6,6,6 6,0,0,5,5,8,0,0,0,8 6,6,5,5,6,9,0,0,0,9 9,6,5,6,0,0,0,0,0,6 0,0,0,5,5,8,0,0,0,8 6,6,5,5,5,9,0,0,0,9 6,5,5,8,0,0,0,6,9,8 9,6,5,5,6,6,0,0,0,6 8,0,5,5,5,6,0,0,0,6 8,0,0,5,5,6,0,0,0,6 9,6,5,5,5,6,0,0,0,6 5,0,0,0,0,5,6,8,0,8 8,0,0,0,0,5,6,6,0,6 0,0,0,0,0,0,5,5,8,5 6,0,0,0,7,6,5,5,5,0 6,0,0,6,5,5,5,5,5,0 6,6,6,5,5,9,0,0,0,9 6,0,0,6,5,9,0,0,0,9 9,6,6,5,5,6,0,0,0,6 6,0,0,6,5,5,5,0,0,0 6,0,0,6,0,5,5,0,0,0 6,0,6,6,5,5,5,7,0,7 6,0,0,6,5,5,6,9,0,9 9,0,0,6,5,6,0,0,0,6 9,0,0,6,5,5,6,6,0,6 6,0,0,6,5,5,5,9,0,9 6,6,9,5,5,8,0,0,0,8 6,0,0,6,5,0,5,0,0,0 6,6,5,5,5,7,6,0,6,7 6,0,0,6,5,5,0,0,0,0 6,0,0,6,5,8,0,0,0,8 6,0,0,0,5,5,5,9,0,9 8,6,6,5,5,6,0,0,0,6 9,0,0,6,5,5,5,6,0,6 6,0,0,6,5,5,6,8,0,8 8,0,0,6,5,6,0,0,0,6 8,0,0,6,5,5,6,6,0,6 7,6,5,5,5,6,6,0,6,6 6,5,5,5,5,7,0,6,5,7 6,0,0,6,5,5,5,8,0,8 6,0,7,6,5,5,5,0,0,0 6,6,5,5,5,5,5,0,0,0 6,5,5,7,6,0,0,6,5,7 8,0,0,6,5,5,5,6,0,6 7,5,5,5,5,6,0,6,5,6 6,5,5,7,0,0,0,6,6,7 7,5,5,6,6,0,0,6,5,6 6,6,5,5,5,0,0,0,7,0 6,0,0,6,6,0,5,8,0,8 6,6,5,7,0,0,0,0,0,7 7,5,5,6,0,0,0,6,6,6 6,5,5,5,5,0,0,6,5,0 6,0,0,0,0,5,0,8,0,8 6,6,5,5,6,7,0,0,0,7 7,6,5,6,0,0,0,0,0,6 6,5,5,0,0,0,0,6,5,0 0,0,0,0,0,5,5,8,0,8 8,0,0,0,5,5,0,6,0,6 5,8,0,0,0,0,0,5,6,8 8,0,0,0,0,5,5,6,0,6 8,6,0,0,0,0,0,5,6,6 0,5,8,0,0,0,0,0,0,5 6,6,5,5,5,7,0,0,0,7 7,6,5,5,6,6,0,0,0,6 6,5,5,0,0,0,0,6,7,0 6,6,5,0,0,0,0,0,0,0 7,6,5,5,5,6,0,0,0,6 6,6,5,5,0,0,0,0,0,0 6,6,5,5,5,0,0,0,0,0 6,6,6,5,5,7,0,0,0,7 6,0,0,6,5,7,0,0,0,7 7,6,6,5,5,6,0,0,0,6 7,0,0,6,5,6,0,0,0,6 6,0,0,6,5,5,6,7,0,7 7,0,0,6,6,0,0,0,0,0 6,6,7,5,5,0,0,0,7,0 7,0,0,6,5,5,6,6,0,6 6,0,0,6,5,5,5,7,0,7 6,0,0,6,5,0,0,0,0,0 6,0,0,6,6,5,0,7,0,7 6,0,0,0,0,6,5,7,0,7 7,0,0,6,6,5,0,6,0,6 7,0,0,0,0,6,5,6,0,6 6,7,0,0,0,6,5,5,6,7 7,6,0,0,0,6,5,5,6,6 6,0,0,6,7,5,0,0,0,0 6,0,0,0,0,6,5,0,0,0 6,0,0,0,0,5,5,0,0,0 6,0,0,0,5,5,5,0,0,0 5,5,5,1,0,5,5,5,5,7 5,0,0,2,1,7,5,5,0,2 5,0,0,2,7,5,1,5,0,2 2,0,0,5,1,7,5,5,0,5 2,0,0,5,7,5,1,5,0,5 a,0,0,b,1,7,5,c,0,b a,0,0,b,7,5,1,c,0,b 7,0,0,2,1,7,5,5,0,2 7,0,0,2,7,5,1,5,0,2 2,0,0,7,1,7,5,7,0,7 2,0,0,7,7,5,1,7,0,7 7,0,0,5,1,7,5,2,0,5 7,0,0,5,7,5,1,2,0,5 6,0,0,2,1,7,5,9,0,2 6,0,0,2,7,5,1,9,0,2 2,0,0,6,1,7,5,6,0,6 2,0,0,6,7,5,1,6,0,6 9,0,0,2,1,7,5,6,0,2 9,0,0,2,7,5,1,6,0,2 2,0,0,6,1,7,5,9,0,6 2,0,0,6,7,5,1,9,0,6 6,0,0,8,1,7,5,2,0,8 6,0,0,8,7,5,1,2,0,8 6,0,0,7,5,1,1,6,0,7 7,0,0,6,5,1,1,6,0,6 6,0,0,9,5,1,1,6,0,9 9,0,0,6,5,1,1,6,0,6 6,0,0,2,5,1,1,9,0,2 2,0,0,6,5,1,1,6,0,6 6,0,0,8,5,1,1,6,0,8 8,0,0,6,5,1,1,6,0,6 9,0,0,2,5,1,1,6,0,2 2,0,0,6,5,1,1,9,0,6 6,0,0,5,5,1,1,6,0,5 5,0,0,2,5,1,1,5,0,2 2,0,0,5,5,1,1,5,0,5 7,0,0,2,5,1,1,5,0,2 2,0,0,7,5,1,1,7,0,7 @COLORS # colors from # http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html 1 255 255 255 2 255 0 0 3 0 255 255 4 0 255 0 5 255 0 255 6 0 0 255 7 255 255 0 8 85 85 85 9 170 170 170 golly-3.3-src/Rules/Chou-Reggia-1.rule0000644000175000017500000001425212124663564014443 00000000000000@RULE Chou-Reggia-1 J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. ``Simple systems that exhibit self-directed replication.'' Science, Vol. 259, pages 1282-1287, February 1993. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" @TABLE # rules: 174 # format: CNESWC' n_states:8 neighborhood:vonNeumann symmetries:rotate4 000000 000200 000110 004420 006301 001447 003030 046000 060400 062102 051060 010420 010360 012152 032000 401033 410011 431206 640406 660630 616600 636000 000440 000260 000330 004512 005103 001540 003100 045002 060600 061110 051710 010506 010320 030400 076010 460313 410633 600000 640106 610006 616100 636100 000420 000231 000705 006030 002020 001210 040000 045600 060100 050006 020320 010140 016000 036000 400035 466633 410100 606100 660060 610106 613001 676600 000600 000100 004040 006440 001010 001110 040160 041040 060166 050306 024200 010154 016100 036606 400313 423106 411033 606313 660460 614004 630160 500000 000540 000152 004010 006110 001030 003000 044400 060066 062030 054040 023010 010340 012000 036300 405033 410061 431033 640006 660615 616000 630360 500044 500011 230000 100111 101044 146004 143321 166611 121121 117044 300111 340066 366611 374017 200100 100044 104414 101601 141403 160414 161101 112244 130414 304011 340611 314001 703010 203010 100011 104674 101301 141424 160111 161301 111044 133001 301471 340261 314676 703330 240400 100441 106101 103011 141141 164104 120414 113011 133011 301303 340211 313023 733630 210102 100414 105011 103103 141121 166644 124104 113601 300101 307141 344011 331001 @TREE num_states=8 num_neighbors=4 num_nodes=195 1 0 1 2 3 4 0 0 7 1 0 1 0 1 4 1 6 7 1 0 1 2 3 4 5 6 7 1 0 1 0 3 5 5 6 7 1 0 4 2 3 4 4 6 7 1 6 1 2 3 4 5 6 7 1 5 1 2 3 4 5 6 7 2 0 1 2 3 4 5 2 6 1 0 1 2 1 1 5 6 7 1 0 1 2 3 4 5 1 7 1 0 1 2 1 4 5 4 7 1 2 1 2 3 4 5 6 7 1 0 1 2 3 4 5 0 7 2 1 8 2 9 10 11 12 2 1 1 1 2 3 4 5 6 7 2 2 2 2 14 2 2 2 2 1 0 3 2 1 3 5 6 7 2 3 16 2 2 2 2 12 2 1 0 4 2 3 4 5 6 7 2 4 18 2 2 2 11 18 2 1 3 1 2 3 4 5 6 7 2 5 20 2 2 2 2 2 2 1 0 1 2 3 1 5 0 7 1 0 1 2 6 4 5 6 7 1 6 1 2 3 4 5 0 7 2 2 22 2 14 23 2 24 2 2 6 2 2 2 2 2 2 2 3 7 13 15 17 19 21 25 26 2 1 8 2 16 18 20 22 2 1 0 1 2 3 0 5 6 7 1 4 1 2 3 4 5 6 7 2 29 2 2 2 2 30 12 2 1 0 1 2 3 6 5 6 7 2 2 2 2 32 18 2 2 2 1 0 1 0 3 3 5 6 0 1 0 1 2 3 3 5 6 7 2 34 35 2 35 2 2 12 2 1 0 4 2 1 4 5 6 7 2 37 18 2 2 18 11 2 2 2 5 2 2 2 2 2 2 2 1 0 1 2 3 3 5 3 7 2 2 2 11 40 18 2 2 2 2 2 2 2 2 2 2 2 2 3 28 31 33 36 38 39 41 42 2 2 32 2 2 2 2 2 2 2 2 18 2 2 2 2 2 2 3 42 42 42 44 45 42 42 42 2 3 9 14 2 2 2 14 2 2 34 2 2 2 2 2 12 2 1 0 1 2 3 4 5 6 0 2 2 2 2 49 2 2 12 2 1 6 1 2 3 3 5 6 7 2 51 2 2 2 2 2 2 2 3 47 48 42 50 45 52 42 42 2 4 10 2 2 2 2 23 2 1 7 1 2 1 4 5 6 7 1 0 1 2 7 4 5 6 7 2 37 2 2 2 55 2 2 56 1 0 1 2 1 4 5 6 7 2 2 58 2 2 2 2 58 2 1 0 1 0 3 4 5 6 7 1 0 3 2 3 4 5 6 7 2 60 61 2 2 2 2 2 2 2 2 58 2 2 2 2 2 2 3 54 57 59 42 62 42 63 63 2 5 11 2 2 11 2 2 2 3 65 39 42 52 42 42 42 42 2 2 12 2 12 18 2 24 2 2 2 2 2 2 2 2 24 2 2 2 35 2 2 2 2 5 2 2 2 18 2 2 2 2 12 2 1 0 1 2 3 4 5 5 7 2 2 71 2 12 2 2 2 2 2 2 2 2 2 2 2 12 2 3 67 68 42 69 70 42 72 73 2 2 2 2 2 58 2 2 2 2 2 18 2 2 2 2 18 2 3 26 75 42 42 76 42 42 42 4 27 43 46 53 64 66 74 77 2 1 29 2 34 37 5 2 2 2 8 2 2 2 2 2 2 2 2 9 2 2 2 2 2 2 2 2 10 2 2 2 55 2 2 58 2 11 30 2 2 2 2 2 2 2 12 12 2 12 2 2 24 2 2 2 2 2 2 56 2 2 2 3 79 80 42 81 82 83 84 85 2 8 2 2 35 18 2 2 2 3 87 42 42 42 42 42 42 42 2 2 2 2 2 2 2 11 2 2 58 2 2 2 2 2 2 2 2 2 11 2 2 2 2 2 2 3 89 42 42 42 90 91 42 42 2 16 2 32 35 2 2 40 2 2 35 2 2 2 2 2 2 2 2 32 2 2 2 2 2 2 2 3 93 94 95 42 42 42 94 42 2 18 2 18 2 18 2 18 2 2 18 2 2 2 2 2 2 2 2 18 2 18 2 2 2 2 2 2 61 2 18 2 2 2 2 2 3 97 98 99 98 100 42 98 98 2 20 30 2 2 11 2 2 2 3 102 42 91 42 42 42 42 42 2 22 12 2 12 2 2 2 2 2 71 2 2 2 2 2 58 2 3 104 42 42 42 90 42 105 42 2 58 2 2 2 2 2 23 2 3 42 42 42 42 107 42 42 42 4 86 88 92 96 101 103 106 108 2 14 32 2 2 2 2 2 2 3 42 75 42 110 45 42 75 42 2 2 2 2 2 2 11 2 2 2 2 2 2 2 18 2 2 2 3 33 112 113 42 42 42 42 42 3 42 42 42 42 45 42 42 42 3 42 42 42 42 42 42 42 42 2 11 2 2 2 2 2 2 2 3 42 117 42 42 42 42 42 42 4 111 114 115 116 115 116 118 116 2 3 34 2 2 2 51 2 2 2 16 35 32 2 2 2 35 2 2 2 35 2 49 2 2 2 2 2 12 12 2 12 2 2 5 2 3 120 121 42 122 42 42 123 42 2 9 2 2 2 18 2 2 2 3 125 42 42 42 42 42 42 42 2 14 2 2 2 2 2 2 2 3 127 95 42 42 42 42 42 42 2 2 2 2 49 2 2 2 2 2 49 2 2 2 2 2 49 2 3 129 94 42 130 42 42 129 42 2 14 12 2 12 2 2 2 2 2 40 2 2 2 2 2 2 2 2 12 2 2 2 2 2 35 2 3 132 133 42 129 42 42 134 42 4 124 126 128 131 116 116 135 116 2 4 37 2 2 60 2 2 2 2 18 18 18 18 61 2 18 18 2 11 11 2 2 2 2 2 2 2 18 2 2 2 2 2 12 18 3 137 138 42 42 45 139 140 42 2 10 2 58 2 61 2 58 58 2 55 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 23 3 142 42 113 42 143 42 144 90 2 18 2 18 2 18 2 2 2 3 42 146 42 42 42 42 42 42 2 2 55 2 2 2 2 2 2 3 148 98 42 42 42 42 42 42 2 23 2 58 2 2 2 2 2 2 2 2 2 2 2 2 18 2 3 150 98 42 42 42 42 151 42 2 2 56 2 2 2 2 2 2 3 153 42 42 42 42 42 42 42 4 141 145 147 116 149 116 152 154 2 5 5 2 51 2 2 2 2 2 20 2 2 2 2 2 2 2 3 156 157 42 42 42 42 42 42 2 30 2 11 2 2 2 2 2 3 117 159 42 42 42 42 42 42 3 117 117 42 42 42 42 42 42 4 158 160 116 116 161 116 116 116 2 22 2 2 2 58 2 71 2 2 14 40 2 2 2 2 12 2 2 23 18 2 2 2 2 2 2 2 24 2 2 2 2 2 2 2 3 42 163 91 164 165 42 166 42 2 12 2 2 35 18 2 71 2 2 12 2 2 2 2 2 2 2 2 24 2 2 2 2 2 58 2 3 168 169 42 169 42 42 170 42 3 42 42 42 42 90 42 42 42 2 12 2 2 2 2 2 12 2 2 12 2 2 49 2 2 2 2 2 5 2 2 2 2 2 35 2 3 173 169 42 174 42 42 175 42 2 12 2 2 2 2 2 18 2 2 18 23 2 2 2 2 2 2 3 98 42 42 42 42 42 177 178 2 24 24 2 5 12 2 2 12 2 2 2 2 2 2 2 58 2 2 2 2 2 2 2 2 35 2 2 2 58 2 35 18 2 2 2 3 180 181 42 182 151 42 183 42 3 42 42 42 42 42 42 169 42 4 167 171 172 176 179 116 184 185 3 26 75 42 42 42 42 73 42 2 56 2 2 2 2 2 2 2 3 113 42 42 42 188 42 42 42 3 63 42 42 42 42 42 42 42 2 2 2 2 2 23 2 2 2 3 113 191 42 42 42 42 42 42 4 187 189 116 116 190 116 192 116 5 78 109 119 136 155 162 186 193 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-3.3-src/Rules/Turmite_181181121010.rule0000644000175000017500000006501612124005036015120 00000000000000@RULE Turmite_181181121010 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 6 14 14 14 14 14 14 14 14 14 14 14 14 14 6 6 6 6 1 2 10 10 10 10 10 10 10 10 10 10 10 10 10 2 2 2 2 2 0 0 0 1 0 0 0 0 0 1 0 1 0 0 2 0 0 0 1 9 17 17 17 17 17 17 17 17 17 17 17 17 17 9 9 9 9 2 4 4 4 0 4 4 4 4 4 0 4 0 4 4 0 4 4 4 1 5 13 13 13 13 13 13 13 13 13 13 13 13 13 5 5 5 5 2 6 6 6 0 6 6 6 6 6 0 6 0 6 6 0 6 6 6 3 3 3 5 3 3 3 3 3 5 3 5 3 3 3 3 3 3 7 1 7 15 15 15 15 15 15 15 15 15 15 15 15 15 7 7 7 7 2 9 9 9 0 9 9 9 9 9 0 9 0 9 9 0 9 9 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 11 10 10 10 10 10 11 10 11 10 10 10 10 10 10 11 1 3 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 2 13 13 13 0 13 13 13 13 13 0 13 0 13 13 0 13 13 13 3 14 14 11 14 14 14 14 14 11 14 11 14 14 14 14 14 14 11 4 8 8 8 8 12 8 12 8 8 8 8 8 12 8 8 15 8 8 1 8 16 16 16 16 16 16 16 16 16 16 16 16 16 8 8 8 8 2 17 17 17 0 17 17 17 17 17 0 17 0 17 17 0 17 17 17 3 18 18 11 18 18 18 18 18 11 18 11 18 18 18 18 18 18 11 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 19 19 20 19 20 19 19 19 19 19 20 19 19 20 19 19 1 4 12 12 12 12 12 12 12 12 12 12 12 12 12 4 4 4 4 2 22 22 22 0 22 22 22 22 22 0 22 0 22 22 0 22 22 22 3 23 23 11 23 23 23 23 23 11 23 11 23 23 23 23 23 23 11 4 24 24 24 24 20 24 20 24 24 24 24 24 20 24 24 20 24 24 5 16 16 16 16 16 21 16 21 16 16 16 16 16 21 16 16 25 16 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-3.3-src/Rules/Banks-I.rule0000644000175000017500000000044612124663564013437 00000000000000@RULE Banks-I Edwin Roger Banks, PhD Thesis 1971 Two-state, five-neighbor CA for a universal computer (Appendix I) http://www.bottomlayer.com/bottom/banks/banks_commentary.htm @TABLE # Format: C,N,E,S,W,C' n_states:2 neighborhood:vonNeumann symmetries:rotate4reflect 111000 011101 011111 golly-3.3-src/Rules/Ed-rep.rule0000644000175000017500000000202412124663564013321 00000000000000@RULE Ed-rep Rule tree written automatically by Scripts/Python/Rule-Generators/FredkinModN-gen.py. Winograd's generalization of Fredkin's parity rule (B1357/S1357) to modulo-n: c,{s} -> sum(s)%n, where n=2 for original rule. Winograd, T. (1970) A simple algorithm for self-replication A. I. Memo 197, Project MAC. MIT. http://hdl.handle.net/1721.1/5843 @TREE num_states=7 num_neighbors=4 num_nodes=29 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 3 3 3 3 3 3 3 1 4 4 4 4 4 4 4 1 5 5 5 5 5 5 5 1 6 6 6 6 6 6 6 2 0 1 2 3 4 5 6 2 1 2 3 4 5 6 0 2 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 2 4 5 6 0 1 2 3 2 5 6 0 1 2 3 4 2 6 0 1 2 3 4 5 3 7 8 9 10 11 12 13 3 8 9 10 11 12 13 7 3 9 10 11 12 13 7 8 3 10 11 12 13 7 8 9 3 11 12 13 7 8 9 10 3 12 13 7 8 9 10 11 3 13 7 8 9 10 11 12 4 14 15 16 17 18 19 20 4 15 16 17 18 19 20 14 4 16 17 18 19 20 14 15 4 17 18 19 20 14 15 16 4 18 19 20 14 15 16 17 4 19 20 14 15 16 17 18 4 20 14 15 16 17 18 19 5 21 22 23 24 25 26 27 @COLORS 1 56 32 16 2 104 80 56 3 120 120 72 4 168 120 104 5 200 168 120 6 216 176 168 golly-3.3-src/Rules/Evoloop-finite.rule0000644000175000017500000001036512060231465015101 00000000000000@RULE Evoloop-finite @TABLE # a mod of Evoloop, using state 9 as the background # rules: 132 n_states:10 neighborhood:vonNeumann symmetries:rotate4 var a={9,2,5} var b={9,1,2,3,4,5,6,7} var c={9,1,2,3,4,5,6,7} var d={1,4,6,7} var e={1,4} var f={9,1} var g={9,1,2,3,4,5,6,7,8} var h={9,1,2,3,4,5,6,7,8} var i={2,3,4,5,6,7} var j={9,2,3,5} var k={9,2,3,4,5,6,7} var l={4,6,7} var m={2,5} var n={9,1,8} var o={9,3,5} var p={2,3,5} var q={3,5} var r={2,4,6,7} var s={9,1} var t={9,1} var u={9,1,2,3,4,7} var v={5,6} var w={1,6,7} var x={9,3,5} var y={9,3,5} var z={1,3,5} var A={9,1,3,5} var B={9,1,3,5} var C={1,3,5} var D={1,3,5} var E={9,1,2,3,4,5} var F={9,1,2,4,5} var G={1,2,4} var H={9,1,3,4,5,6} var I={9,1,2,3,4,5,6} var J={1,2,4,6} var K={9,1,2,4,5,6,7} var L={9,1,2,3,4,5,7} var M={1,2,4,6,7} var N={9,3} var O={9,1,2,3,5} var P={9,1,2,3,4} var Q={9,2,3,5,6} var R={9,1,3,4,5,6,7} var S={1,3} var T={1,2,3,5} var U={9,1,3,4,5} var V={9,1,4,5,6} var W={1,4,6} var X={2,3,5} var Y={9,5} var Z={1,2} var aa={9,1,5} var ab={9,2} var ac={2,3,4,5} var ad={2,3,4,5,6} var ae={9,3} var af={9,3} var ag={3,7} var ah={2,8} var ai={9,2,8} var aj={9,8} var ak={9,2,8} var al={6,8} var am={9,1,4,5,6,7} var an={9,1,4,5,6,7} var ao={1,4,6,7} var ap={1,3,4,5,6,7} var aq={2,3,5,8} var ar={9,1,2,3,4,5,6,7,8} var as={9,1,4,6,7} var at={1,5,6} var au={4,7} var av={1,3,4,5,7} var aw={9,4,5,7} var ax={1,4,5,6,7} var ay={9,4,5,7} var az={1,4,5,6,7} var aA={9,1,3,5,6,7} var aB={1,2,3,4,5,7} var aC={9,1,4,7} var aD={2,4,6,7,8} var aE={3,5,6} var aF={2,3,5,6} var aG={2,3,5,6} var aH={2,3} var aI={9,1,3,4,7} var aJ={2,5,6,7} var aK={1,2,3,4,6,7} var aL={1,3,4,7} var aM={9,2,3} var aN={1,2,4,7} var aO={3,6} var aP={1,2,3,4,7} var aQ={3,4,7} var aR={1,2,3,4,5,6,7} var aS={3,4,6,7,8} var aT={9,3,6} var aU={3,4,5,7} var aV={2,3,6} var aW={1,2,3,4,5,6,7} var aX={9,8} var aY={9,8} var aZ={4,5,6,7} var ba={4,6,7,8} var bb={1,2,4,6,7} var bc={4,5} var bd={4,7,8} var be={9,1,4,5,7} var bf={4,5,7} var bg={1,2,4,5,7} var bh={1,2,4,5,7} var bi={9,1,2,3,4,6,7} var bj={2,5,6} var bk={1,3,4,6,7} var bl={9,4,6,7} var bm={6,7,8} var bn={1,3,4,5,6,7} var bo={1,4,7} var bp={2,3,5,6} var bq={2,3,5,6} var br={9,1,2,3,4,5,6,7} var bs={9,1,2,3,4,5,6,7} 9,a,9,9,1,2 9,9,9,9,4,3 9,b,c,1,d,1 9,9,9,2,e,2 f,g,h,i,8,8 9,j,k,l,1,1 9,9,9,4,m,2 9,9,9,7,5,2 f,b,n,8,i,8 9,o,1,j,d,1 9,9,1,9,2,2 9,o,1,2,p,1 9,j,1,q,r,1 f,s,i,t,8,8 9,u,2,1,p,1 9,9,r,p,1,1 9,9,2,3,2,2 9,9,q,1,2,1 9,o,q,2,1,1 9,1,2,v,2,6 w,o,x,y,k,8 z,A,B,C,D,8 1,E,F,G,4,4 1,H,I,J,6,6 1,K,L,M,7,7 1,N,A,j,p,8 1,O,P,4,G,4 1,Q,I,6,J,6 1,b,R,7,M,7 1,N,S,f,T,8 1,O,e,o,4,4 1,U,J,o,6,6 1,V,M,I,7,7 1,I,W,7,3,7 1,o,2,N,4,4 S,j,p,O,5,8 C,j,p,2,X,8 1,9,2,3,2,4 1,f,2,5,2,7 1,f,2,5,4,3 1,f,2,7,3,5 1,Y,3,Z,4,4 C,aa,q,ab,D,8 1,o,5,4,Z,4 1,f,6,2,4,4 1,o,7,3,M,7 C,f,2,X,q,8 1,e,ac,6,2,6 C,f,A,5,ab,8 1,1,4,3,3,4 1,X,2,5,4,4 1,ad,2,7,3,7 1,2,4,3,3,3 1,2,6,2,7,6 X,9,9,9,9,8 2,N,ae,af,ag,1 ah,ai,aj,ak,al,9 X,am,an,d,ao,8 2,b,R,ap,3,1 aq,g,h,ar,8,9 2,as,ab,3,ap,1 2,9,9,3,2,4 2,9,9,4,2,3 X,am,an,v,at,8 2,ab,9,5,au,5 2,9,9,8,av,9 X,aw,ax,ay,az,8 2,aA,ap,ab,3,1 2,9,aB,9,8,9 2,aC,2,9,6,5 2,9,2,9,7,3 2,am,2,ax,3,1 2,aC,2,3,2,3 2,9,2,5,2,5 aD,9,2,6,Y,9 2,9,3,2,ax,1 2,ab,3,aE,2,1 2,2,aF,aG,3,1 2,2,3,4,5,1 3,9,9,9,aH,2 3,R,k,b,v,8 3,9,9,9,7,4 3,aI,R,aJ,aK,8 3,9,9,3,2,2 3,u,U,aL,ao,8 3,9,9,4,2,1 3,aM,b,aN,aO,8 3,9,1,9,2,1 3,f,aP,s,aQ,8 q,R,ax,aR,aK,8 aS,9,1,2,5,9 3,9,2,aT,2,8 3,aC,2,5,2,1 3,9,3,3,2,1 aU,ap,aR,aV,aW,8 4,aj,aX,aY,ai,1 aZ,o,x,y,ap,8 ba,9,am,M,bb,9 l,ar,g,h,8,1 4,o,x,2,q,8 bc,9,o,q,2,8 4,9,9,8,ap,1 ba,9,ao,o,M,9 4,9,ap,9,8,1 ba,9,M,bb,ap,9 bd,9,2,be,M,9 4,9,2,9,q,8 ba,9,2,C,ao,9 4,9,2,aH,2,1 au,9,2,6,2,6 ba,9,3,ao,M,9 ba,9,3,2,ao,9 4,9,3,2,2,1 bf,bg,bh,aR,aW,8 5,b,bi,aF,bj,8 5,9,9,2,3,2 5,aI,bk,bl,bi,8 5,9,1,2,1,8 5,9,2,9,m,2 5,9,2,1,5,2 5,9,2,au,5,8 5,9,3,1,2,9 6,9,2,aC,2,2 al,9,2,aF,2,9 bm,9,3,2,2,9 6,ap,bn,aR,aW,8 6,ap,2,bn,2,8 al,bo,2,2,2,9 6,aF,aG,bp,bq,8 7,9,2,2,2,1 7,9,2,3,2,9 8,b,c,br,bs,9 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 # this is the background state for Evoloop-finite 9 0 0 0 golly-3.3-src/Rules/Worm-1252121.rule0000644000175000017500000001135112140624403013732 00000000000000@RULE Worm-1252121 Paterson's worms (by Dean Hickerson, 11/20/2008) Pattern #155 Sven Kahrkling's notation 1252121 Gardner's notation 1a2d3cbcc4b Final outcome unknown; doesn't finish within 1.1*10^17 steps. Forms almost full regular hexagons at certain times. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1252121 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 2 = sharp right b,0,a0,n,a1,0,12,0,0,2 b,0,a0,0,a1,n,0,9,0,3 b,0,a0,0,a1,0,n,0,15,4 b,13,a0,0,a1,0,0,n,0,5 b,0,a0,10,a1,0,0,0,n,6 b,n,a0,0,a1,16,0,0,0,1 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 3 eaten(045): 2 = sharp right b,n,a0,0,a1,0,12,o,p,2 b,p,a0,n,a1,0,0,9,o,3 b,o,a0,p,a1,n,0,0,15,4 b,13,a0,o,a1,p,n,0,0,5 b,0,a0,10,a1,o,p,n,0,6 b,0,a0,0,a1,16,o,p,n,1 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(02): 1 = gentle right b,n,a0,0,a1,o,12,0,0,1 b,0,a0,n,a1,0,o,9,0,2 b,0,a0,0,a1,n,0,o,15,3 b,13,a0,0,a1,0,n,0,o,4 b,o,a0,10,a1,0,0,n,0,5 b,0,a0,o,a1,16,0,0,n,6 golly-3.3-src/Rules/LifeOnTheSlope.rule0000644000175000017500000001010412124005036015003 00000000000000@RULE LifeOnTheSlope @TREE num_states=3 num_neighbors=8 num_nodes=78 1 0 0 0 1 0 0 2 1 0 1 0 2 0 1 2 1 2 2 0 1 0 1 2 2 1 4 5 1 1 0 1 2 2 5 7 3 3 6 8 1 2 0 0 2 4 0 10 1 1 0 0 2 5 10 12 3 6 11 13 2 7 12 0 3 8 13 15 4 9 14 16 2 0 0 2 1 0 2 1 2 10 2 19 3 11 18 20 2 12 19 1 3 13 20 22 4 14 21 23 2 0 1 0 3 15 22 25 4 16 23 26 5 17 24 27 2 2 2 7 2 19 7 4 3 20 29 30 2 1 4 1 3 22 30 32 4 23 31 33 3 25 32 25 4 26 33 35 5 27 34 36 6 28 37 28 3 18 18 29 4 21 39 31 5 24 40 34 2 7 7 0 3 29 29 42 2 4 0 4 3 30 42 44 4 31 43 45 3 32 44 32 4 33 45 47 5 34 46 48 6 41 49 41 7 38 38 50 4 39 39 43 5 40 52 46 2 0 0 0 3 42 42 54 4 43 43 55 3 44 54 44 4 45 55 57 5 46 56 58 6 53 59 53 7 50 50 60 8 51 51 61 4 35 47 35 5 36 48 63 6 37 64 37 4 47 57 47 5 48 58 66 6 49 67 49 7 65 65 68 3 54 54 54 4 55 55 70 4 57 70 57 5 58 71 72 6 59 73 59 7 68 68 74 8 69 69 75 9 62 76 62 @COLORS 1 200 200 255 pale blue 2 200 200 255 pale blue @ICONS XPM /* width height num_colors chars_per_pixel */ "31 62 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AAA............................" "AAAA..........................." "AAAAA.........................." ".AAAAA........................." "..AAAAA........................" "...AAAAA......................." "....AAAAA......................" ".....AAAAA....................." "......AAAAA...................." ".......AAAAA..................." "........AAAAA.................." ".........AAAAA................." "..........AAAAA................" "...........AAAAA..............." "............AAAAA.............." ".............AAAAA............." "..............AAAAA............" "...............AAAAA..........." "................AAAAA.........." ".................AAAAA........." "..................AAAAA........" "...................AAAAA......." "....................AAAAA......" ".....................AAAAA....." "......................AAAAA...." ".......................AAAAA..." "........................AAAAA.." ".........................AAAAA." "..........................AAAAA" "...........................AAAA" "............................AAA" /* icon for state 2 */ "............................AAA" "...........................AAAA" "..........................AAAAA" ".........................AAAAA." "........................AAAAA.." ".......................AAAAA..." "......................AAAAA...." ".....................AAAAA....." "....................AAAAA......" "...................AAAAA......." "..................AAAAA........" ".................AAAAA........." "................AAAAA.........." "...............AAAAA..........." "..............AAAAA............" ".............AAAAA............." "............AAAAA.............." "...........AAAAA..............." "..........AAAAA................" ".........AAAAA................." "........AAAAA.................." ".......AAAAA..................." "......AAAAA...................." ".....AAAAA....................." "....AAAAA......................" "...AAAAA......................." "..AAAAA........................" ".AAAAA........................." "AAAAA.........................." "AAAA..........................." "AAA............................" XPM /* width height num_colors chars_per_pixel */ "15 30 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AA............." "AAA............" ".AAA..........." "..AAA.........." "...AAA........." "....AAA........" ".....AAA......." "......AAA......" ".......AAA....." "........AAA...." ".........AAA..." "..........AAA.." "...........AAA." "............AAA" ".............AA" /* icon for state 2 */ ".............AA" "............AAA" "...........AAA." "..........AAA.." ".........AAA..." "........AAA...." ".......AAA....." "......AAA......" ".....AAA......." "....AAA........" "...AAA........." "..AAA.........." ".AAA..........." "AAA............" "AA............." XPM /* width height num_colors chars_per_pixel */ "7 14 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "A......" ".A....." "..A...." "...A..." "....A.." ".....A." "......A" /* icon for state 2 */ "......A" ".....A." "....A.." "...A..." "..A...." ".A....." "A......" golly-3.3-src/Rules/AbsoluteTurmite_0S11W11E21S21W00N0.rule0000644000175000017500000002637112124005036017550 00000000000000@RULE AbsoluteTurmite_0S11W11E21S21W00N0 @TREE num_states=8 num_neighbors=4 num_nodes=17 1 0 1 0 1 1 1 1 0 1 2 5 2 5 5 5 5 2 2 0 0 0 0 0 0 0 1 2 1 1 1 1 1 1 1 0 1 3 6 3 6 6 6 6 3 2 4 4 4 4 4 4 4 0 3 2 2 2 2 3 5 2 2 1 4 7 4 7 7 7 7 4 2 7 7 7 7 7 7 7 0 2 0 0 0 0 0 0 0 0 3 8 8 8 8 9 9 8 8 4 6 6 6 10 6 6 6 6 3 5 5 5 5 9 9 5 5 3 9 9 9 9 9 9 9 9 4 12 12 12 13 12 12 12 12 4 10 10 10 13 10 10 10 10 5 11 11 14 11 11 11 15 11 @COLORS 0 0 0 0 1 0 155 67 2 123 4 243 3 124 124 124 4 178 177 94 5 71 72 170 6 71 141 101 7 102 171 84 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 217 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." "..............................." ".............CCCCC............." "..........CIIIIIIIIIC.........." "........CIIIIIIIIIIIIIC........" ".......CIIIIIIIIIIIIIIIC......." "......CIIIIIIIIIIIIIIIIIC......" ".....CIIIIIIIIIIIIIIIIIIIC....." "....CIIIIILLIIIIIIIIIIIIIIC...." "....IIIIILLIIIIIIIIIIIIIIII...." "...CIIIILLIIIIIIIIIIIIIIIIIC..." "...IIIIILLIIIIIIIIIIIIIIIIII..." "...IIIIILIIIIIIIIIIIIIIIIIII..." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "...IIIIIIIIIIIIIIIIIIIIIIIII..." "...IIIIIIIIIIIIIIIIIIIIIIIII..." "...CIIIIIIIIIIIIIIIIIIIIIIIC..." "....IIIIIIIIIIIIIIIIIIIIIII...." "....CIIIIIIIIIIIIIIIIIIIIIC...." ".....CIIIIIIIIIIIIIIIIIIIC....." "......CIIIIIIIIIIIIIIIIIC......" ".......CIIIIIIIIIIIIIIIC......." "........CIIIIIIIIIIIIIC........" "..........CIIIIIIIIIC.........." ".............CCCCC............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." ".............DDDDD............." "..........DJJJJJJJJJD.........." "........DJJJJJJJJJJJJJD........" ".......DJJJJJJJJJJJJJJJD......." "......DJJJJJJJJJJJJJJJJJD......" ".....DJJJJJJJJJJJJJJJJJJJD....." "....DJJJJJLLJJJJJJJJJJJJJJD...." "....JJJJJLLJJJJJJJJJJJJJJJJ...." "...DJJJJLLJJJJJJJJJJJJJJJJJD..." "...JJJJJLLJJJJJJJJJJJJJJJJJJ..." "...JJJJJLJJJJJJJJJJJJJJJJJJJ..." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "...JJJJJJJJJJJJJJJJJJJJJJJJJ..." "...JJJJJJJJJJJJJJJJJJJJJJJJJ..." "...DJJJJJJJJJJJJJJJJJJJJJJJD..." "....JJJJJJJJJJJJJJJJJJJJJJJ...." "....DJJJJJJJJJJJJJJJJJJJJJD...." ".....DJJJJJJJJJJJJJJJJJJJD....." "......DJJJJJJJJJJJJJJJJJD......" ".......DJJJJJJJJJJJJJJJD......." "........DJJJJJJJJJJJJJD........" "..........DJJJJJJJJJD.........." ".............DDDDD............." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." ".............EEEEE............." "..........EKKKKKKKKKE.........." "........EKKKKKKKKKKKKKE........" ".......EKKKKKKKKKKKKKKKE......." "......EKKKKKKKKKKKKKKKKKE......" ".....EKKKKKKKKKKKKKKKKKKKE....." "....EKKKKKLLKKKKKKKKKKKKKKE...." "....KKKKKLLKKKKKKKKKKKKKKKK...." "...EKKKKLLKKKKKKKKKKKKKKKKKE..." "...KKKKKLLKKKKKKKKKKKKKKKKKK..." "...KKKKKLKKKKKKKKKKKKKKKKKKK..." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...EKKKKKKKKKKKKKKKKKKKKKKKE..." "....KKKKKKKKKKKKKKKKKKKKKKK...." "....EKKKKKKKKKKKKKKKKKKKKKE...." ".....EKKKKKKKKKKKKKKKKKKKE....." "......EKKKKKKKKKKKKKKKKKE......" ".......EKKKKKKKKKKKKKKKE......." "........EKKKKKKKKKKKKKE........" "..........EKKKKKKKKKE.........." ".............EEEEE............." "..............................." "..............................." /* icon for state 5 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAFIIIIIIIIIFAAAAAAAAAA" "AAAAAAAAFIIIIIIIIIIIIIFAAAAAAAA" "AAAAAAAFIIIIIIIIIIIIIIIFAAAAAAA" "AAAAAAFIIIIIIIIIIIIIIIIIFAAAAAA" "AAAAAFIIIIIIIIIIIIIIIIIIIFAAAAA" "AAAAFIIIIILLIIIIIIIIIIIIIIFAAAA" "AAAAIIIIILLIIIIIIIIIIIIIIIIAAAA" "AAAFIIIILLIIIIIIIIIIIIIIIIIFAAA" "AAAIIIIILLIIIIIIIIIIIIIIIIIIAAA" "AAAIIIIILIIIIIIIIIIIIIIIIIIIAAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAAIIIIIIIIIIIIIIIIIIIIIIIIIAAA" "AAAIIIIIIIIIIIIIIIIIIIIIIIIIAAA" "AAAFIIIIIIIIIIIIIIIIIIIIIIIFAAA" "AAAAIIIIIIIIIIIIIIIIIIIIIIIAAAA" "AAAAFIIIIIIIIIIIIIIIIIIIIIFAAAA" "AAAAAFIIIIIIIIIIIIIIIIIIIFAAAAA" "AAAAAAFIIIIIIIIIIIIIIIIIFAAAAAA" "AAAAAAAFIIIIIIIIIIIIIIIFAAAAAAA" "AAAAAAAAFIIIIIIIIIIIIIFAAAAAAAA" "AAAAAAAAAAFIIIIIIIIIFAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 6 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAGJJJJJJJJJGAAAAAAAAAA" "AAAAAAAAGJJJJJJJJJJJJJGAAAAAAAA" "AAAAAAAGJJJJJJJJJJJJJJJGAAAAAAA" "AAAAAAGJJJJJJJJJJJJJJJJJGAAAAAA" "AAAAAGJJJJJJJJJJJJJJJJJJJGAAAAA" "AAAAGJJJJJLLJJJJJJJJJJJJJJGAAAA" "AAAAJJJJJLLJJJJJJJJJJJJJJJJAAAA" "AAAGJJJJLLJJJJJJJJJJJJJJJJJGAAA" "AAAJJJJJLLJJJJJJJJJJJJJJJJJJAAA" "AAAJJJJJLJJJJJJJJJJJJJJJJJJJAAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAAJJJJJJJJJJJJJJJJJJJJJJJJJAAA" "AAAJJJJJJJJJJJJJJJJJJJJJJJJJAAA" "AAAGJJJJJJJJJJJJJJJJJJJJJJJGAAA" "AAAAJJJJJJJJJJJJJJJJJJJJJJJAAAA" "AAAAGJJJJJJJJJJJJJJJJJJJJJGAAAA" "AAAAAGJJJJJJJJJJJJJJJJJJJGAAAAA" "AAAAAAGJJJJJJJJJJJJJJJJJGAAAAAA" "AAAAAAAGJJJJJJJJJJJJJJJGAAAAAAA" "AAAAAAAAGJJJJJJJJJJJJJGAAAAAAAA" "AAAAAAAAAAGJJJJJJJJJGAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAHKKKKKKKKKHAAAAAAAAAA" "AAAAAAAAHKKKKKKKKKKKKKHAAAAAAAA" "AAAAAAAHKKKKKKKKKKKKKKKHAAAAAAA" "AAAAAAHKKKKKKKKKKKKKKKKKHAAAAAA" "AAAAAHKKKKKKKKKKKKKKKKKKKHAAAAA" "AAAAHKKKKKLLKKKKKKKKKKKKKKHAAAA" "AAAAKKKKKLLKKKKKKKKKKKKKKKKAAAA" "AAAHKKKKLLKKKKKKKKKKKKKKKKKHAAA" "AAAKKKKKLLKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKLKKKKKKKKKKKKKKKKKKKAAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAHKKKKKKKKKKKKKKKKKKKKKKKHAAA" "AAAAKKKKKKKKKKKKKKKKKKKKKKKAAAA" "AAAAHKKKKKKKKKKKKKKKKKKKKKHAAAA" "AAAAAHKKKKKKKKKKKKKKKKKKKHAAAAA" "AAAAAAHKKKKKKKKKKKKKKKKKHAAAAAA" "AAAAAAAHKKKKKKKKKKKKKKKHAAAAAAA" "AAAAAAAAHKKKKKKKKKKKKKHAAAAAAAA" "AAAAAAAAAAHKKKKKKKKKHAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 105 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "..............." "......CCC......" "....CIIIIIC...." "...CIIIIIIIC..." "..CIILIIIIIIC.." "..IILIIIIIIII.." ".CIILIIIIIIIIC." ".CIIIIIIIIIIIC." ".CIIIIIIIIIIIC." "..IIIIIIIIIII.." "..CIIIIIIIIIC.." "...CIIIIIIIC..." "....CIIIIIC...." "......CCC......" "..............." /* icon for state 3 */ "..............." "......DDD......" "....DJJJJJD...." "...DJJJJJJJD..." "..DJJLJJJJJJD.." "..JJLJJJJJJJJ.." ".DJJLJJJJJJJJD." ".DJJJJJJJJJJJD." ".DJJJJJJJJJJJD." "..JJJJJJJJJJJ.." "..DJJJJJJJJJD.." "...DJJJJJJJD..." "....DJJJJJD...." "......DDD......" "..............." /* icon for state 4 */ "..............." "......EEE......" "....EKKKKKE...." "...EKKKKKKKE..." "..EKKLKKKKKKE.." "..KKLKKKKKKKK.." ".EKKLKKKKKKKKE." ".EKKKKKKKKKKKE." ".EKKKKKKKKKKKE." "..KKKKKKKKKKK.." "..EKKKKKKKKKE.." "...EKKKKKKKE..." "....EKKKKKE...." "......EEE......" "..............." /* icon for state 5 */ "AAAAAAAAAAAAAAA" "AAAAAAFFFAAAAAA" "AAAAFIIIIIFAAAA" "AAAFIIIIIIIFAAA" "AAFIILIIIIIIFAA" "AAIILIIIIIIIIAA" "AFIILIIIIIIIIFA" "AFIIIIIIIIIIIFA" "AFIIIIIIIIIIIFA" "AAIIIIIIIIIIIAA" "AAFIIIIIIIIIFAA" "AAAFIIIIIIIFAAA" "AAAAFIIIIIFAAAA" "AAAAAAFFFAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 6 */ "AAAAAAAAAAAAAAA" "AAAAAAGGGAAAAAA" "AAAAGJJJJJGAAAA" "AAAGJJJJJJJGAAA" "AAGJJLJJJJJJGAA" "AAJJLJJJJJJJJAA" "AGJJLJJJJJJJJGA" "AGJJJJJJJJJJJGA" "AGJJJJJJJJJJJGA" "AAJJJJJJJJJJJAA" "AAGJJJJJJJJJGAA" "AAAGJJJJJJJGAAA" "AAAAGJJJJJGAAAA" "AAAAAAGGGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAA" "AAAAAAHHHAAAAAA" "AAAAHKKKKKHAAAA" "AAAHKKKKKKKHAAA" "AAHKKLKKKKKKHAA" "AAKKLKKKKKKKKAA" "AHKKLKKKKKKKKHA" "AHKKKKKKKKKKKHA" "AHKKKKKKKKKKKHA" "AAKKKKKKKKKKKAA" "AAHKKKKKKKKKHAA" "AAAHKKKKKKKHAAA" "AAAAHKKKKKHAAAA" "AAAAAAHHHAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 49 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ "..CCC.." ".CIIIC." "CILIIIC" "CIIIIIC" "CIIIIIC" ".CIIIC." "..CCC.." /* icon for state 3 */ "..DDD.." ".DJJJD." "DJLJJJD" "DJJJJJD" "DJJJJJD" ".DJJJD." "..DDD.." /* icon for state 4 */ "..EEE.." ".EKKKE." "EKLKKKE" "EKKKKKE" "EKKKKKE" ".EKKKE." "..EEE.." /* icon for state 5 */ "AAFFFAA" "AFIIIFA" "FILIIIF" "FIIIIIF" "FIIIIIF" "AFIIIFA" "AAFFFAA" /* icon for state 6 */ "AAGGGAA" "AGJJJGA" "GJLJJJG" "GJJJJJG" "GJJJJJG" "AGJJJGA" "AAGGGAA" /* icon for state 7 */ "AAHHHAA" "AHKKKHA" "HKLKKKH" "HKKKKKH" "HKKKKKH" "AHKKKHA" "AAHHHAA" golly-3.3-src/Rules/Sand-square4cyclic_emulated.rule0000644000175000017500000003503212060231465017516 00000000000000@RULE Sand-square4cyclic_emulated @TREE num_states=9 num_neighbors=8 num_nodes=460 1 0 1 1 3 3 5 5 7 7 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 1 0 2 1 4 3 6 5 8 7 1 0 2 2 4 4 6 6 8 8 2 3 4 3 4 3 4 3 4 3 2 1 1 0 1 0 1 0 1 0 3 2 5 6 5 6 5 6 5 6 2 1 1 1 1 1 1 1 1 1 3 5 5 8 5 8 5 8 5 8 3 6 8 6 8 6 8 6 8 6 4 7 9 10 9 10 9 10 9 10 2 4 4 1 4 1 4 1 4 1 3 8 12 8 12 8 12 8 12 8 3 12 12 8 12 8 12 8 12 8 3 8 8 8 8 8 8 8 8 8 4 13 14 15 14 15 14 15 14 15 2 3 1 3 1 3 1 3 1 3 3 2 17 2 17 2 17 2 17 2 3 17 17 8 17 8 17 8 17 8 3 2 8 2 8 2 8 2 8 2 4 18 19 20 19 20 19 20 19 20 5 11 16 21 16 21 16 21 16 21 2 0 1 3 1 3 1 3 1 3 1 0 1 2 3 2 5 6 7 8 2 4 24 4 24 4 24 4 24 4 2 4 24 4 1 4 1 4 1 4 3 23 25 2 26 2 26 2 26 2 2 4 1 4 1 4 1 4 1 4 3 28 25 8 26 8 26 8 26 8 4 27 29 20 29 20 29 20 29 20 2 1 24 1 24 1 24 1 24 1 2 1 24 1 1 1 1 1 1 1 3 8 31 8 32 8 32 8 32 8 4 33 33 15 33 15 33 15 33 15 3 17 28 2 28 2 28 2 28 2 3 28 28 8 28 8 28 8 28 8 4 35 36 20 36 20 36 20 36 20 5 30 34 37 34 37 34 37 34 37 2 0 4 0 4 0 4 0 4 0 2 3 4 0 4 0 4 0 4 0 1 0 1 2 1 4 5 6 7 8 2 1 1 41 1 41 1 41 1 41 2 1 1 41 1 1 1 1 1 1 3 39 40 42 40 43 40 43 40 43 3 40 40 8 40 8 40 8 40 8 3 8 8 42 8 43 8 43 8 43 4 44 45 46 45 46 45 46 45 46 4 14 14 15 14 15 14 15 14 15 3 2 2 42 2 43 2 43 2 43 3 2 2 8 2 8 2 8 2 8 4 49 50 46 50 46 50 46 50 46 5 47 48 51 48 51 48 51 48 51 3 23 26 2 26 2 26 2 26 2 3 28 26 8 26 8 26 8 26 8 4 53 54 20 54 20 54 20 54 20 3 8 32 8 32 8 32 8 32 8 4 56 56 15 56 15 56 15 56 15 5 55 57 37 57 37 57 37 57 37 3 39 40 43 40 43 40 43 40 43 3 8 8 43 8 43 8 43 8 43 4 59 45 60 45 60 45 60 45 60 3 2 2 43 2 43 2 43 2 43 4 62 50 60 50 60 50 60 50 60 5 61 48 63 48 63 48 63 48 63 6 22 38 52 58 64 58 64 58 64 3 23 28 2 28 2 28 2 28 2 2 0 41 0 41 0 41 0 41 0 3 67 8 67 8 67 8 67 8 67 2 0 41 0 1 0 1 0 1 0 3 69 8 69 8 69 8 69 8 69 4 66 36 68 36 70 36 70 36 70 2 1 41 1 41 1 41 1 41 1 3 72 8 72 8 72 8 72 8 72 2 1 41 1 1 1 1 1 1 1 3 74 8 74 8 74 8 74 8 74 4 15 15 73 15 75 15 75 15 75 5 71 76 37 76 37 76 37 76 37 4 27 29 68 29 70 29 70 29 70 4 33 33 73 33 75 33 75 33 75 5 78 79 37 79 37 79 37 79 37 4 15 15 15 15 15 15 15 15 15 5 81 81 81 81 81 81 81 81 81 4 53 54 68 54 70 54 70 54 70 4 56 56 73 56 75 56 75 56 75 5 83 84 37 84 37 84 37 84 37 6 77 80 82 85 82 85 82 85 82 3 39 40 8 40 8 40 8 40 8 1 0 1 1 3 1 5 5 7 7 2 3 4 88 4 88 4 88 4 88 3 89 89 8 89 8 89 8 89 8 2 3 4 88 4 0 4 0 4 0 3 91 91 8 91 8 91 8 91 8 4 87 90 15 92 15 92 15 92 15 2 0 1 88 1 88 1 88 1 88 3 94 94 8 94 8 94 8 94 8 2 0 1 88 1 0 1 0 1 0 3 96 96 8 96 8 96 8 96 8 4 50 95 15 97 15 97 15 97 15 5 93 48 98 48 98 48 98 48 98 4 44 90 46 92 46 92 46 92 46 4 49 95 46 97 46 97 46 97 46 5 100 48 101 48 101 48 101 48 101 4 59 90 60 92 60 92 60 92 60 4 62 95 60 97 60 97 60 97 60 5 103 48 104 48 104 48 104 48 104 6 99 82 102 82 105 82 105 82 105 4 66 36 70 36 70 36 70 36 70 4 15 15 75 15 75 15 75 15 75 5 107 108 37 108 37 108 37 108 37 4 27 29 70 29 70 29 70 29 70 4 33 33 75 33 75 33 75 33 75 5 110 111 37 111 37 111 37 111 37 4 53 54 70 54 70 54 70 54 70 4 56 56 75 56 75 56 75 56 75 5 113 114 37 114 37 114 37 114 37 6 109 112 82 115 82 115 82 115 82 4 87 92 15 92 15 92 15 92 15 4 50 97 15 97 15 97 15 97 15 5 117 48 118 48 118 48 118 48 118 4 44 92 46 92 46 92 46 92 46 4 49 97 46 97 46 97 46 97 46 5 120 48 121 48 121 48 121 48 121 4 59 92 60 92 60 92 60 92 60 4 62 97 60 97 60 97 60 97 60 5 123 48 124 48 124 48 124 48 124 6 119 82 122 82 125 82 125 82 125 7 65 86 106 116 126 116 126 116 126 4 66 36 20 36 20 36 20 36 20 1 0 4 2 4 4 6 6 8 8 2 129 1 129 1 129 1 129 1 129 3 17 130 2 130 2 130 2 130 2 3 28 130 8 130 8 130 8 130 8 4 131 132 20 132 20 132 20 132 20 5 128 81 37 81 133 81 37 81 133 5 30 34 37 34 133 34 37 34 133 5 55 57 37 57 133 57 37 57 133 6 134 135 82 136 82 136 82 136 82 5 71 76 37 76 133 76 37 76 133 5 78 79 37 79 133 79 37 79 133 5 83 84 37 84 133 84 37 84 133 6 138 139 82 140 82 140 82 140 82 6 82 82 82 82 82 82 82 82 82 5 107 108 37 108 133 108 37 108 133 5 110 111 37 111 133 111 37 111 133 5 113 114 37 114 133 114 37 114 133 6 143 144 82 145 82 145 82 145 82 7 137 141 142 146 142 146 142 146 142 4 87 45 15 45 15 45 15 45 15 4 50 50 15 50 15 50 15 50 15 1 0 1 4 3 4 5 6 7 8 2 150 150 1 150 1 150 1 150 1 3 12 12 151 12 151 12 151 12 151 3 8 8 151 8 151 8 151 8 151 4 152 14 153 14 153 14 153 14 153 5 148 48 149 154 149 48 149 154 149 5 47 48 51 154 51 48 51 154 51 5 61 48 63 154 63 48 63 154 63 6 155 82 156 82 157 82 157 82 157 5 93 48 98 154 98 48 98 154 98 5 100 48 101 154 101 48 101 154 101 5 103 48 104 154 104 48 104 154 104 6 159 82 160 82 161 82 161 82 161 5 117 48 118 154 118 48 118 154 118 5 120 48 121 154 121 48 121 154 121 5 123 48 124 154 124 48 124 154 124 6 163 82 164 82 165 82 165 82 165 7 158 142 162 142 166 142 166 142 166 3 17 28 2 130 2 130 2 130 2 3 28 28 8 130 8 130 8 130 8 4 168 169 20 169 20 169 20 169 20 5 128 81 170 81 133 81 37 81 170 5 30 34 170 34 133 34 37 34 170 5 55 57 170 57 133 57 37 57 170 6 171 172 82 173 82 173 82 173 82 5 71 76 170 76 133 76 37 76 170 5 78 79 170 79 133 79 37 79 170 5 83 84 170 84 133 84 37 84 170 6 175 176 82 177 82 177 82 177 82 5 107 108 170 108 133 108 37 108 170 5 110 111 170 111 133 111 37 111 170 5 113 114 170 114 133 114 37 114 170 6 179 180 82 181 82 181 82 181 82 7 174 178 142 182 142 182 142 182 142 3 12 12 8 12 151 12 151 12 151 3 8 8 8 8 151 8 151 8 151 4 184 14 185 14 185 14 185 14 185 5 148 186 149 154 149 48 149 186 149 5 47 186 51 154 51 48 51 186 51 5 61 186 63 154 63 48 63 186 63 6 187 82 188 82 189 82 189 82 189 5 93 186 98 154 98 48 98 186 98 5 100 186 101 154 101 48 101 186 101 5 103 186 104 154 104 48 104 186 104 6 191 82 192 82 193 82 193 82 193 5 117 186 118 154 118 48 118 186 118 5 120 186 121 154 121 48 121 186 121 5 123 186 124 154 124 48 124 186 124 6 195 82 196 82 197 82 197 82 197 7 190 142 194 142 198 142 198 142 198 8 127 147 167 183 199 147 167 147 167 1 0 1 3 3 3 5 5 7 7 2 201 1 201 1 201 1 201 1 201 3 202 8 202 8 202 8 202 8 202 4 35 36 203 36 203 36 203 36 203 5 128 81 37 81 204 81 37 81 204 5 30 34 37 34 204 34 37 34 204 5 55 57 37 57 204 57 37 57 204 6 205 206 82 207 82 207 82 207 82 5 71 76 37 76 204 76 37 76 204 5 78 79 37 79 204 79 37 79 204 5 83 84 37 84 204 84 37 84 204 6 209 210 82 211 82 211 82 211 82 5 107 108 37 108 204 108 37 108 204 5 110 111 37 111 204 111 37 111 204 5 113 114 37 114 204 114 37 114 204 6 213 214 82 215 82 215 82 215 82 7 208 212 142 216 142 216 142 216 142 4 131 132 203 132 203 132 203 132 203 5 128 81 37 81 218 81 37 81 218 5 30 34 37 34 218 34 37 34 218 5 55 57 37 57 218 57 37 57 218 6 219 220 82 221 82 221 82 221 82 5 71 76 37 76 218 76 37 76 218 5 78 79 37 79 218 79 37 79 218 5 83 84 37 84 218 84 37 84 218 6 223 224 82 225 82 225 82 225 82 5 107 108 37 108 218 108 37 108 218 5 110 111 37 111 218 111 37 111 218 5 113 114 37 114 218 114 37 114 218 6 227 228 82 229 82 229 82 229 82 7 222 226 142 230 142 230 142 230 142 7 142 142 142 142 142 142 142 142 142 4 168 169 203 169 203 169 203 169 203 5 128 81 170 81 218 81 37 81 233 5 30 34 170 34 218 34 37 34 233 5 55 57 170 57 218 57 37 57 233 6 234 235 82 236 82 236 82 236 82 5 71 76 170 76 218 76 37 76 233 5 78 79 170 79 218 79 37 79 233 5 83 84 170 84 218 84 37 84 233 6 238 239 82 240 82 240 82 240 82 5 107 108 170 108 218 108 37 108 233 5 110 111 170 111 218 111 37 111 233 5 113 114 170 114 218 114 37 114 233 6 242 243 82 244 82 244 82 244 82 7 237 241 142 245 142 245 142 245 142 8 217 231 232 246 232 231 232 231 232 2 129 129 1 129 1 129 1 129 1 3 248 248 8 248 8 248 8 248 8 4 14 249 15 249 15 249 15 249 15 5 148 48 149 250 149 48 149 250 149 5 47 48 51 250 51 48 51 250 51 5 61 48 63 250 63 48 63 250 63 6 251 82 252 82 253 82 253 82 253 5 93 48 98 250 98 48 98 250 98 5 100 48 101 250 101 48 101 250 101 5 103 48 104 250 104 48 104 250 104 6 255 82 256 82 257 82 257 82 257 5 117 48 118 250 118 48 118 250 118 5 120 48 121 250 121 48 121 250 121 5 123 48 124 250 124 48 124 250 124 6 259 82 260 82 261 82 261 82 261 7 254 142 258 142 262 142 262 142 262 4 152 249 153 249 153 249 153 249 153 5 148 48 149 264 149 48 149 264 149 5 47 48 51 264 51 48 51 264 51 5 61 48 63 264 63 48 63 264 63 6 265 82 266 82 267 82 267 82 267 5 93 48 98 264 98 48 98 264 98 5 100 48 101 264 101 48 101 264 101 5 103 48 104 264 104 48 104 264 104 6 269 82 270 82 271 82 271 82 271 5 117 48 118 264 118 48 118 264 118 5 120 48 121 264 121 48 121 264 121 5 123 48 124 264 124 48 124 264 124 6 273 82 274 82 275 82 275 82 275 7 268 142 272 142 276 142 276 142 276 4 184 249 185 249 185 249 185 249 185 5 148 186 149 264 149 48 149 278 149 5 47 186 51 264 51 48 51 278 51 5 61 186 63 264 63 48 63 278 63 6 279 82 280 82 281 82 281 82 281 5 93 186 98 264 98 48 98 278 98 5 100 186 101 264 101 48 101 278 101 5 103 186 104 264 104 48 104 278 104 6 283 82 284 82 285 82 285 82 285 5 117 186 118 264 118 48 118 278 118 5 120 186 121 264 121 48 121 278 121 5 123 186 124 264 124 48 124 278 124 6 287 82 288 82 289 82 289 82 289 7 282 142 286 142 290 142 290 142 290 8 263 232 277 232 291 232 277 232 277 4 35 36 20 36 203 36 203 36 203 5 128 81 293 81 204 81 37 81 293 5 30 34 293 34 204 34 37 34 293 5 55 57 293 57 204 57 37 57 293 6 294 295 82 296 82 296 82 296 82 5 71 76 293 76 204 76 37 76 293 5 78 79 293 79 204 79 37 79 293 5 83 84 293 84 204 84 37 84 293 6 298 299 82 300 82 300 82 300 82 5 107 108 293 108 204 108 37 108 293 5 110 111 293 111 204 111 37 111 293 5 113 114 293 114 204 114 37 114 293 6 302 303 82 304 82 304 82 304 82 7 297 301 142 305 142 305 142 305 142 4 131 132 20 132 203 132 203 132 203 5 128 81 293 81 218 81 37 81 307 5 30 34 293 34 218 34 37 34 307 5 55 57 293 57 218 57 37 57 307 6 308 309 82 310 82 310 82 310 82 5 71 76 293 76 218 76 37 76 307 5 78 79 293 79 218 79 37 79 307 5 83 84 293 84 218 84 37 84 307 6 312 313 82 314 82 314 82 314 82 5 107 108 293 108 218 108 37 108 307 5 110 111 293 111 218 111 37 111 307 5 113 114 293 114 218 114 37 114 307 6 316 317 82 318 82 318 82 318 82 7 311 315 142 319 142 319 142 319 142 4 168 169 20 169 203 169 203 169 203 5 128 81 321 81 218 81 37 81 321 5 30 34 321 34 218 34 37 34 321 5 55 57 321 57 218 57 37 57 321 6 322 323 82 324 82 324 82 324 82 5 71 76 321 76 218 76 37 76 321 5 78 79 321 79 218 79 37 79 321 5 83 84 321 84 218 84 37 84 321 6 326 327 82 328 82 328 82 328 82 5 107 108 321 108 218 108 37 108 321 5 110 111 321 111 218 111 37 111 321 5 113 114 321 114 218 114 37 114 321 6 330 331 82 332 82 332 82 332 82 7 325 329 142 333 142 333 142 333 142 8 306 320 232 334 232 320 232 320 232 4 14 14 15 249 15 249 15 249 15 5 148 336 149 250 149 48 149 336 149 5 47 336 51 250 51 48 51 336 51 5 61 336 63 250 63 48 63 336 63 6 337 82 338 82 339 82 339 82 339 5 93 336 98 250 98 48 98 336 98 5 100 336 101 250 101 48 101 336 101 5 103 336 104 250 104 48 104 336 104 6 341 82 342 82 343 82 343 82 343 5 117 336 118 250 118 48 118 336 118 5 120 336 121 250 121 48 121 336 121 5 123 336 124 250 124 48 124 336 124 6 345 82 346 82 347 82 347 82 347 7 340 142 344 142 348 142 348 142 348 4 152 14 153 249 153 249 153 249 153 5 148 336 149 264 149 48 149 350 149 5 47 336 51 264 51 48 51 350 51 5 61 336 63 264 63 48 63 350 63 6 351 82 352 82 353 82 353 82 353 5 93 336 98 264 98 48 98 350 98 5 100 336 101 264 101 48 101 350 101 5 103 336 104 264 104 48 104 350 104 6 355 82 356 82 357 82 357 82 357 5 117 336 118 264 118 48 118 350 118 5 120 336 121 264 121 48 121 350 121 5 123 336 124 264 124 48 124 350 124 6 359 82 360 82 361 82 361 82 361 7 354 142 358 142 362 142 362 142 362 4 184 14 185 249 185 249 185 249 185 5 148 364 149 264 149 48 149 364 149 5 47 364 51 264 51 48 51 364 51 5 61 364 63 264 63 48 63 364 63 6 365 82 366 82 367 82 367 82 367 5 93 364 98 264 98 48 98 364 98 5 100 364 101 264 101 48 101 364 101 5 103 364 104 264 104 48 104 364 104 6 369 82 370 82 371 82 371 82 371 5 117 364 118 264 118 48 118 364 118 5 120 364 121 264 121 48 121 364 121 5 123 364 124 264 124 48 124 364 124 6 373 82 374 82 375 82 375 82 375 7 368 142 372 142 376 142 376 142 376 8 349 232 363 232 377 232 363 232 363 5 128 81 37 81 204 81 37 81 293 5 30 34 37 34 204 34 37 34 293 5 55 57 37 57 204 57 37 57 293 6 379 380 82 381 82 381 82 381 82 5 71 76 37 76 204 76 37 76 293 5 78 79 37 79 204 79 37 79 293 5 83 84 37 84 204 84 37 84 293 6 383 384 82 385 82 385 82 385 82 5 107 108 37 108 204 108 37 108 293 5 110 111 37 111 204 111 37 111 293 5 113 114 37 114 204 114 37 114 293 6 387 388 82 389 82 389 82 389 82 7 382 386 142 390 142 390 142 390 142 5 128 81 37 81 218 81 37 81 307 5 30 34 37 34 218 34 37 34 307 5 55 57 37 57 218 57 37 57 307 6 392 393 82 394 82 394 82 394 82 5 71 76 37 76 218 76 37 76 307 5 78 79 37 79 218 79 37 79 307 5 83 84 37 84 218 84 37 84 307 6 396 397 82 398 82 398 82 398 82 5 107 108 37 108 218 108 37 108 307 5 110 111 37 111 218 111 37 111 307 5 113 114 37 114 218 114 37 114 307 6 400 401 82 402 82 402 82 402 82 7 395 399 142 403 142 403 142 403 142 5 128 81 170 81 218 81 37 81 321 5 30 34 170 34 218 34 37 34 321 5 55 57 170 57 218 57 37 57 321 6 405 406 82 407 82 407 82 407 82 5 71 76 170 76 218 76 37 76 321 5 78 79 170 79 218 79 37 79 321 5 83 84 170 84 218 84 37 84 321 6 409 410 82 411 82 411 82 411 82 5 107 108 170 108 218 108 37 108 321 5 110 111 170 111 218 111 37 111 321 5 113 114 170 114 218 114 37 114 321 6 413 414 82 415 82 415 82 415 82 7 408 412 142 416 142 416 142 416 142 8 391 404 232 417 232 404 232 404 232 5 148 48 149 250 149 48 149 336 149 5 47 48 51 250 51 48 51 336 51 5 61 48 63 250 63 48 63 336 63 6 419 82 420 82 421 82 421 82 421 5 93 48 98 250 98 48 98 336 98 5 100 48 101 250 101 48 101 336 101 5 103 48 104 250 104 48 104 336 104 6 423 82 424 82 425 82 425 82 425 5 117 48 118 250 118 48 118 336 118 5 120 48 121 250 121 48 121 336 121 5 123 48 124 250 124 48 124 336 124 6 427 82 428 82 429 82 429 82 429 7 422 142 426 142 430 142 430 142 430 5 148 48 149 264 149 48 149 350 149 5 47 48 51 264 51 48 51 350 51 5 61 48 63 264 63 48 63 350 63 6 432 82 433 82 434 82 434 82 434 5 93 48 98 264 98 48 98 350 98 5 100 48 101 264 101 48 101 350 101 5 103 48 104 264 104 48 104 350 104 6 436 82 437 82 438 82 438 82 438 5 117 48 118 264 118 48 118 350 118 5 120 48 121 264 121 48 121 350 121 5 123 48 124 264 124 48 124 350 124 6 440 82 441 82 442 82 442 82 442 7 435 142 439 142 443 142 443 142 443 5 148 186 149 264 149 48 149 364 149 5 47 186 51 264 51 48 51 364 51 5 61 186 63 264 63 48 63 364 63 6 445 82 446 82 447 82 447 82 447 5 93 186 98 264 98 48 98 364 98 5 100 186 101 264 101 48 101 364 101 5 103 186 104 264 104 48 104 364 104 6 449 82 450 82 451 82 451 82 451 5 117 186 118 264 118 48 118 364 118 5 120 186 121 264 121 48 121 364 121 5 123 186 124 264 124 48 124 364 124 6 453 82 454 82 455 82 455 82 455 7 448 142 452 142 456 142 456 142 456 8 431 232 444 232 457 232 444 232 444 9 200 247 292 335 378 247 292 418 458 @COLORS 1 90 90 90 2 62 62 62 3 255 255 0 4 220 220 0 5 120 100 0 6 100 80 0 7 148 148 148 8 103 103 103 golly-3.3-src/Rules/LifeOnTheEdge.rule0000644000175000017500000001257712124005036014605 00000000000000@RULE LifeOnTheEdge @TREE num_states=4 num_neighbors=8 num_nodes=58 1 0 0 0 3 1 0 1 1 2 1 1 0 0 2 2 0 1 1 2 1 0 2 2 1 1 0 3 3 0 1 1 2 2 0 2 4 5 5 6 1 2 0 0 1 1 2 1 1 0 1 3 0 0 0 2 8 9 9 10 3 3 7 7 11 1 0 2 2 0 2 5 6 6 13 1 2 0 0 0 2 9 10 10 15 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 2 17 18 18 19 3 14 16 16 20 4 12 12 21 21 2 10 15 15 15 2 18 19 19 19 3 23 24 24 24 4 21 21 25 25 5 22 26 22 26 6 27 27 27 27 1 0 0 0 2 2 1 2 2 29 3 30 14 14 16 2 6 13 13 13 3 32 23 23 24 4 31 31 33 33 2 15 15 15 15 2 19 19 19 19 3 35 36 36 36 4 33 33 37 37 5 34 38 34 38 6 39 39 39 39 7 28 28 40 40 1 0 0 0 1 2 42 17 17 18 3 7 11 11 43 3 16 20 20 20 4 44 44 45 45 3 24 24 24 24 4 45 45 47 47 5 46 48 46 48 6 49 49 49 49 3 36 36 36 36 4 25 25 51 51 5 26 52 26 52 6 53 53 53 53 7 50 50 54 54 8 41 55 41 55 9 56 56 56 56 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 93 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..............................." "..............................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." /* icon for state 2 */ "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 3 */ "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." XPM /* width height num_colors chars_per_pixel */ "15 45 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "..............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." /* icon for state 2 */ "..BBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." /* icon for state 3 */ "..BBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." XPM /* width height num_colors chars_per_pixel */ "7 21 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "B......" "B......" "B......" "B......" "B......" "B......" /* icon for state 2 */ ".BBBBBB" "......." "......." "......." "......." "......." "......." /* icon for state 3 */ ".BBBBBB" "B......" "B......" "B......" "B......" "B......" "B......" golly-3.3-src/Rules/Byl-Loop.rule0000644000175000017500000001043212124663564013644 00000000000000@RULE Byl-Loop J. Byl. "Self-Reproduction in small cellular automata." Physica D, Vol. 34, pages 295-299, 1989. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" @TABLE # rules: 145 # format: CNESWC' n_states:6 neighborhood:vonNeumann symmetries:rotate4 000000 000010 000031 000420 000110 000120 000311 000330 000320 000200 000242 000233 004330 005120 001400 001120 001305 001310 001320 003020 003400 003420 003120 002040 002050 002010 002020 002420 002500 002520 002200 002250 002220 040000 050000 050500 010052 010022 010400 010100 020055 400233 405235 401233 442024 452020 415233 411233 412024 412533 432024 421433 422313 501302 502230 540022 542002 512024 530025 520025 520442 523242 522020 100000 100010 100033 100330 101233 103401 103244 111244 113244 112404 133244 121351 123444 123543 122414 122434 300100 300300 300211 300233 304233 301100 301211 303211 303233 302233 344233 343233 351202 353215 314233 311233 313251 313211 312211 335223 333211 320533 324433 325415 321433 321511 321321 323411 200000 200042 200032 200022 200442 200515 200112 200122 200342 200332 200242 200212 201502 203202 202302 244022 245022 242042 242022 254202 255042 252025 210042 214022 215022 #212052 this line appears to be inserted through an error - correct transition is the one below 212055 212022 230052 234022 235002 235022 232042 232022 220042 220020 220533 221552 @TREE num_states=6 num_neighbors=4 num_nodes=152 1 0 0 0 3 4 5 1 0 0 2 0 4 5 1 0 1 2 3 4 5 1 1 3 2 0 4 5 2 0 1 2 3 2 2 1 0 1 2 0 4 5 1 5 1 2 3 4 2 2 1 5 2 6 2 2 1 2 1 2 1 4 5 1 0 1 0 3 4 5 1 3 1 2 3 3 5 1 2 1 2 3 4 2 2 2 8 9 10 11 2 1 1 1 2 3 4 5 1 0 0 2 3 4 5 2 3 13 2 14 2 2 1 0 1 2 3 4 2 2 2 2 16 2 2 2 1 2 1 5 3 4 5 1 5 1 2 3 4 5 2 2 18 19 2 2 2 3 4 7 12 15 17 20 2 1 5 8 13 2 18 1 0 1 2 1 4 5 2 2 2 23 2 2 2 2 2 2 2 2 2 2 3 22 24 25 24 25 25 2 2 2 9 2 16 19 1 0 1 2 3 4 4 1 0 1 2 3 4 0 1 0 1 5 3 0 5 2 2 28 29 2 2 30 2 2 2 2 2 16 2 1 0 1 5 2 4 5 1 0 1 3 3 4 5 2 2 33 2 34 2 2 3 27 25 31 25 32 35 2 3 6 10 14 2 2 1 0 3 2 3 3 5 2 2 2 38 2 2 2 2 2 2 29 2 2 2 1 0 1 2 3 5 5 2 2 2 41 2 2 2 3 37 39 40 25 25 42 2 2 2 11 2 2 2 1 0 4 2 3 4 5 2 2 2 45 2 2 2 3 44 46 25 46 25 25 3 25 25 25 25 25 25 4 21 26 36 43 47 48 2 1 2 2 2 2 2 2 5 2 2 2 2 2 2 2 23 2 38 45 2 2 6 2 2 2 2 2 3 50 51 52 53 25 25 1 0 1 2 3 3 5 2 2 2 23 55 45 2 3 51 25 56 24 25 25 2 8 23 2 23 2 2 2 2 2 23 23 2 2 2 28 2 2 2 2 2 2 2 2 2 55 2 2 1 0 1 2 5 4 5 2 2 23 2 62 2 2 3 58 59 60 59 61 63 2 13 2 2 2 2 2 2 2 2 55 2 2 2 2 2 2 55 2 2 55 3 65 66 67 25 25 66 2 2 2 45 23 2 62 3 25 46 69 46 25 25 2 18 2 2 2 2 2 2 33 23 2 2 2 2 3 71 25 72 24 25 25 4 54 57 64 68 70 73 2 8 2 28 2 2 2 2 9 2 29 29 2 2 2 10 2 2 2 2 2 2 11 2 2 2 2 2 2 2 2 30 2 2 2 3 25 75 76 77 78 79 2 2 2 28 2 2 33 2 23 2 2 2 2 23 2 2 23 2 55 45 2 2 38 55 2 2 23 2 2 45 45 2 2 2 2 2 2 2 2 55 62 2 3 81 82 83 84 85 86 2 9 2 29 2 2 2 2 2 23 2 23 2 2 2 29 2 2 2 2 2 2 29 55 2 2 2 2 2 2 45 2 45 2 2 3 88 89 90 91 92 25 2 2 2 2 2 2 34 2 23 23 2 23 55 62 2 2 23 2 2 45 2 2 45 45 16 45 2 2 2 2 23 2 2 2 2 3 94 95 96 25 97 98 2 16 2 2 2 16 2 1 0 3 2 3 4 5 2 2 2 16 2 45 101 3 100 25 25 102 25 25 2 19 2 30 2 2 2 2 41 55 2 2 2 2 3 104 25 25 105 25 25 4 80 87 93 99 103 106 2 3 2 2 2 2 2 2 14 2 2 2 2 2 3 108 65 96 109 25 25 2 2 23 23 2 45 23 3 53 25 111 24 25 25 2 10 38 29 2 2 41 2 2 55 55 2 2 55 2 2 2 2 2 101 2 3 113 114 32 25 96 115 3 109 25 96 25 25 25 2 2 55 45 2 2 2 3 25 25 118 46 25 25 2 34 62 2 2 2 2 3 25 66 120 25 25 25 4 110 112 116 117 119 121 2 16 2 2 2 2 2 3 25 25 123 25 17 25 3 25 25 25 66 25 25 2 11 45 2 45 2 2 2 2 45 45 45 2 2 2 2 2 2 16 2 2 2 2 2 45 45 2 2 3 126 127 128 129 25 25 3 25 24 25 25 46 25 2 16 2 2 45 2 2 3 25 25 132 25 25 25 2 2 2 62 2 2 2 2 2 2 2 101 2 2 3 25 134 135 25 25 25 4 124 125 130 131 133 136 2 18 2 33 2 2 2 2 19 2 2 41 2 2 2 2 2 34 2 2 2 3 25 138 139 140 25 25 3 25 24 61 134 25 25 2 2 2 2 23 2 2 2 30 2 2 2 2 2 2 2 55 2 2 2 2 2 2 62 2 2 2 2 3 25 143 144 145 146 25 2 2 2 101 2 2 2 3 25 25 25 25 148 25 4 141 142 147 149 48 48 5 49 74 107 122 137 150 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 golly-3.3-src/Rules/Banks-II.rule0000644000175000017500000000065612124663564013553 00000000000000@RULE Banks-II Edwin Roger Banks, PhD Thesis 1971 Three-state, five-neighbor CA for a universal computer (Appendix II) http://www.bottomlayer.com/bottom/banks/banks_commentary.htm @TABLE # Format: C,N,E,S,W,C' n_states:3 neighborhood:vonNeumann symmetries:rotate4reflect 010002 011122 011202 012002 012022 012222 022201 022222 021012 110002 112220 122200 122000 200001 211120 211221 212221 @COLORS 1 255 0 0 2 200 200 200 golly-3.3-src/Rules/TripATronMargolus_emulated.rule0000644000175000017500000000357712060231465017465 00000000000000@RULE TripATronMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=114 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 4 2 4 4 2 0 1 21 1 0 3 2 3 22 3 2 4 23 7 23 7 23 5 24 10 24 10 24 1 0 2 2 2 4 2 0 1 0 1 26 3 2 3 2 3 27 4 28 7 28 7 28 5 29 10 29 10 29 6 15 20 25 20 30 5 10 10 10 10 10 6 20 20 32 20 32 3 2 3 2 3 2 1 0 1 4 3 4 2 1 1 35 1 1 3 36 36 3 36 3 4 34 37 34 7 34 5 38 10 38 10 38 4 23 37 23 7 23 5 40 10 40 10 40 4 28 37 28 7 28 5 42 10 42 10 42 6 39 32 41 32 43 1 0 1 2 3 2 2 1 1 1 1 45 3 46 46 3 46 3 4 34 7 34 47 34 5 48 10 48 10 48 4 23 7 23 47 23 5 50 10 50 10 50 4 28 7 28 47 28 5 52 10 52 10 52 6 49 32 51 32 53 7 31 33 44 33 54 6 32 32 32 32 32 7 33 33 56 33 56 4 34 7 34 7 34 2 35 35 1 35 1 3 3 3 59 3 3 4 60 7 60 7 60 5 58 61 58 10 58 5 24 61 24 10 24 5 29 61 29 10 29 6 62 32 63 32 64 5 38 61 38 10 38 5 40 61 40 10 40 5 42 61 42 10 42 6 66 32 67 32 68 5 48 61 48 10 48 5 50 61 50 10 50 5 52 61 52 10 52 6 70 32 71 32 72 7 65 56 69 56 73 2 45 45 1 45 1 3 3 3 3 3 75 4 76 7 76 7 76 5 58 10 58 77 58 5 24 10 24 77 24 5 29 10 29 77 29 6 78 32 79 32 80 5 38 10 38 77 38 5 40 10 40 77 40 5 42 10 42 77 42 6 82 32 83 32 84 5 48 10 48 77 48 5 50 10 50 77 50 5 52 10 52 77 52 6 86 32 87 32 88 7 81 56 85 56 89 8 55 57 74 57 90 1 0 1 3 3 3 2 92 1 92 1 92 3 93 3 93 3 93 4 18 7 94 7 18 5 19 10 95 10 19 6 96 96 32 96 32 7 97 97 56 97 56 7 56 56 56 56 56 8 98 98 99 98 99 5 58 10 58 10 58 6 101 32 25 32 30 7 102 56 44 56 54 8 103 99 74 99 90 1 0 1 1 3 1 2 105 1 105 1 105 3 106 3 106 3 106 4 18 7 18 7 107 5 19 10 19 10 108 6 109 109 32 109 32 7 110 110 56 110 56 8 111 111 99 111 99 9 91 100 104 112 104 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 golly-3.3-src/Rules/Worm-1042015.rule0000644000175000017500000001127212140624403013733 00000000000000@RULE Worm-1042015 Paterson's worms (by Dean Hickerson, 11/20/2008) Pattern #061 Sven Kahrkling's notation 1042015 Gardner's notation 1a2c3caca4a Final outcome unknown; doesn't finish within 1.3*10^18 steps. Very chaotic. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1042015 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 0 = straight b,0,a0,n,a1,0,12,0,0,6 b,0,a0,0,a1,n,0,9,0,1 b,0,a0,0,a1,0,n,0,15,2 b,13,a0,0,a1,0,0,n,0,3 b,0,a0,10,a1,0,0,0,n,4 b,n,a0,0,a1,16,0,0,0,5 # 2 eaten(02): 4 = sharp left b,n,a0,0,a1,o,12,0,0,4 b,0,a0,n,a1,0,o,9,0,5 b,0,a0,0,a1,n,0,o,15,6 b,13,a0,0,a1,0,n,0,o,1 b,o,a0,10,a1,0,0,n,0,2 b,0,a0,o,a1,16,0,0,n,3 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(24): 0 = straight b,0,a0,0,a1,n,12,o,0,6 b,0,a0,0,a1,0,n,9,o,1 b,o,a0,0,a1,0,0,n,15,2 b,13,a0,o,a1,0,0,0,n,3 b,n,a0,10,a1,o,0,0,0,4 b,0,a0,n,a1,16,o,0,0,5 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(124): 5 = gentle left b,0,a0,n,a1,o,12,p,0,5 b,0,a0,0,a1,n,o,9,p,6 b,p,a0,0,a1,0,n,o,15,1 b,13,a0,p,a1,0,0,n,o,2 b,o,a0,10,a1,p,0,0,n,3 b,n,a0,o,a1,16,p,0,0,4 golly-3.3-src/Rules/Codd.rule0000644000175000017500000002016112124663564013060 00000000000000@RULE Codd Codd's cellular automaton. Codd, E.F., _Cellular_Automata_, Academic Press 1968 (ACM Monograph #3). Originally distributed with XLife as codd.r. Several corrections have been made. Stasis transitions have been taken out. Tim Hutton @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} var b={2,3} var c={2,3} var d={4,5,6,7} var e={4,5,6} var f={0,1} var g={1,2} var h={0,1,2} var i={1,2,6} var j={1,6} var k={4,5} var l={4,6,7} var m={1,2,3} var n={6,7} var o={1,2,7} var p={0,2,3} # Almost all configurations with neighborhoods in [0-3] are stable # These are the exceptions (Codd's `short table', page 66) 0,1,2,1,2,1 # Path self-repair 3,0,0,0,2,2 # Path self-repair 3,0,1,0,2,2 # Gate control 3,0,1,0,3,0 # Gate control 2,1,2,3,2,3 # Gate control 3,1,2,3,2,2 # Gate control 0,0,2,1,3,1 # Path end self-repair 0,1,2,3,2,6 # Echo generation 0,1,2,2,2,7 # Echo generation # The long table 0,0,2,7,2,1 # j 0,0,3,6,3,1 # i 0,1,1,2,d,1 # fi = fan-in 0,1,1,e,2,1 # fi 0,1,2,1,d,1 # fi 0,1,2,2,d,1 # p = signal propagation 0,1,2,3,5,1 # p 0,1,2,4,2,1 # p 0,1,2,4,4,1 # fo = fan-out 0,1,2,5,b,1 # p (was fi) 0,1,2,5,5,1 # fo 0,1,2,6,2,1 # p 0,1,2,6,6,1 # fo 0,1,2,7,b,1 # p 0,1,2,7,7,1 # fo 0,1,3,2,4,1 # p 0,1,3,d,2,1 # pg - propagation at gate (subordibate path) 0,1,3,7,3,1 # t7 = transforming to 07 0,1,4,2,2,1 # p 0,1,4,2,4,1 # fo 0,1,4,3,2,1 # p 0,1,4,4,2,1 # fo 0,1,5,2,b,1 # p 0,1,5,2,5,1 # fo 0,1,5,3,2,1 # p 0,1,5,5,2,1 # fo 0,1,6,2,2,1 # p 0,1,6,2,6,1 # fo 0,1,6,6,2,1 # fo 0,1,7,2,2,1 # p 0,1,7,2,7,1 # fo 0,1,7,7,2,1 # fo 0,0,0,f,6,2 # k 0,0,0,2,5,2 # xl = extend left 0,0,0,2,6,2 # sh = sheathing 0,0,0,4,2,2 # xr = extend right 0,0,0,6,1,2 # k 0,0,0,6,2,2 # sh 0,0,0,6,6,2 # sh 0,0,1,0,6,2 # sh 0,0,1,1,6,2 # k 0,0,1,2,6,2 # sh 0,0,1,6,1,2 # k 0,0,1,6,2,2 # sh 0,0,1,6,6,2 # sh 0,0,2,0,6,2 # g = gate control 0,0,2,2,6,2 # sh 0,0,2,6,g,2 # sh 0,0,6,1,1,2 # k 0,0,6,2,1,2 # sh 0,0,6,2,2,2 # sh 0,0,6,2,6,2 # sh 0,0,6,6,1,2 # sh 0,1,1,1,6,2 # k 0,1,1,6,6,2 # sh 0,2,2,2,6,2 # sh 0,2,2,6,6,2 # sh 0,0,0,0,7,3 # k 0,0,0,1,5,3 # i 0,0,0,5,1,3 # i 0,0,1,0,7,3 # e 0,0,2,0,7,3 # g 1,0,0,0,4,0 # e 1,0,0,1,4,0 # e 1,0,0,4,1,0 # e 1,0,1,0,4,0 # e 1,0,1,1,4,0 # e 1,0,1,4,1,0 # e 1,0,4,1,1,0 # e 1,1,1,1,4,0 # e 1,0,0,3,6,2 # i 1,0,0,6,3,2 # i # error in codd.r: 10107[23] # s = sense 1,0,1,0,7,2 # s = sense 1,0,0,0,7,3 # s 1,0,0,2,4,4 # xr 1,0,b,4,c,4 # pe = path end 1,1,1,2,4,4 # fo 1,1,g,4,2,4 # fo,p 1,1,2,g,4,4 # fo,p 1,1,2,4,3,4 # pg 1,1,2,7,7,4 # fi 1,1,4,2,2,4 # p 1,1,7,2,7,4 # fi 1,1,7,7,2,4 # fi 1,2,b,2,4,4 # pe 1,2,b,4,3,4 # pe 1,2,2,4,4,4 # c = collision 1,2,3,2,4,4 # pe 1,b,3,3,4,4 # pe 1,2,4,2,2,4 # c 1,2,4,3,3,4 # pe 1,0,0,5,2,5 # xl 1,0,1,0,5,5 # i 1,0,b,5,c,5 # pe 1,1,1,2,5,5 # fo 1,1,g,5,2,5 # fo,p 1,1,2,g,5,5 # fo,p 1,1,2,4,4,5 # fi 1,1,2,5,3,5 # pg 1,1,4,2,4,5 # fi 1,1,4,4,2,5 # fi 1,1,5,2,2,5 # p 1,2,2,b,5,5 # pe 1,2,2,5,3,5 # pe 1,2,2,5,5,5 # c 1,2,3,b,5,5 # pe 1,2,3,5,3,5 # pe 1,2,5,2,5,5 # c 1,2,5,3,3,5 # pe 1,3,3,3,5,5 # pe 1,0,0,h,6,6 # sh 1,0,0,6,i,6 # sh 1,0,1,h,6,6 # sh 1,0,1,6,i,6 # sh 1,0,2,2,6,6 # pe 1,0,2,6,1,6 # sh 1,0,b,6,c,6 # pe 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,g,6 # sh,pe 1,0,6,2,6,6 # c 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,i,6 # sh,pe,c 1,0,6,6,1,6 # sh 1,1,1,1,5,6 # i 1,1,1,2,6,6 # fo 1,1,1,6,2,6 # fo 1,1,2,1,6,6 # fo 1,1,2,2,6,6 # p 1,1,2,5,5,6 # fi 1,1,2,6,2,6 # p 1,1,2,6,3,6 # pg 1,1,2,6,6,6 # fi 1,1,5,2,5,6 # fi 1,1,5,5,2,6 # fi 1,1,6,2,2,6 # p 1,1,6,2,6,6 # fi 1,1,6,6,2,6 # fi 1,2,2,b,6,6 # pe 1,2,2,6,3,6 # pe 1,2,2,6,6,6 # c 1,2,3,b,6,6 # pe 1,2,3,6,3,6 # pe 1,2,6,2,6,6 # c 1,2,6,3,3,6 # pe 1,3,3,3,6,6 # pe 1,0,2,7,b,7 # pe 1,0,3,7,b,7 # pe 1,1,1,2,7,7 # fo 1,1,1,7,2,7 # fo 1,1,2,g,7,7 # fo,p 1,1,2,7,b,7 # p,pg 1,1,3,e,3,7 # t7 1,1,3,7,3,7 # t7 1,1,7,2,2,7 # p 1,2,2,b,7,7 # pe 1,2,2,7,3,7 # pe 1,2,2,7,7,7 # c 1,2,3,b,7,7 # pe 1,2,3,7,3,7 # pe 1,2,7,2,7,7 # c 1,2,7,3,3,7 # pe 1,3,3,3,7,7 # pe 2,0,h,0,6,0 # k,k,g 2,0,0,f,7,1 # s,x 2,0,0,7,1,1 # x = extend 2,0,1,0,7,1 # s 2,0,1,1,7,1 # x 2,0,1,7,1,1 # x 2,0,7,1,1,1 # x 2,1,1,1,7,1 # x 2,0,0,2,5,3 # qm = cell q change of state 2,0,0,4,2,3 # pm = cell p change of state 2,0,1,4,2,3 # pm (was missing in codd.r) 2,0,2,0,7,3 # g 2,0,2,5,1,3 # qm 2,0,3,0,n,3 # g 2,2,3,2,d,3 # g (was missing in codd.r) 3,0,0,2,n,0 # r,m 3,0,0,6,2,0 # r 3,0,0,7,2,0 # m 3,0,1,6,2,0 # pm 3,0,1,7,2,0 # m 3,0,2,6,1,0 # qm 3,0,2,7,1,0 # m 3,0,0,0,6,1 # s 3,0,0,2,5,1 # qm 3,0,0,4,2,1 # pm 3,2,3,2,d,2 # g 3,0,1,0,6,4 # e 3,0,1,0,7,7 # j 4,0,0,0,1,0 # e 4,0,0,1,2,0 # fi 4,0,0,2,1,0 # fi 4,0,1,0,2,0 # fi 4,0,1,1,2,0 # fo 4,0,1,2,1,0 # fo 4,0,1,2,2,0 # p 4,0,2,1,1,0 # fo 4,0,2,1,2,0 # p 4,0,2,2,1,0 # p 4,0,3,1,2,0 # pg 4,0,0,0,2,1 # xr 4,0,0,2,2,1 # c 4,0,2,0,2,1 # pe 4,0,2,2,2,1 # pe 4,0,2,2,3,1 # pe 4,0,2,3,2,1 # pe 4,0,2,3,3,1 # pe 4,0,3,2,2,1 # pe 4,0,3,2,3,1 # pe 4,0,3,3,2,1 # pe 4,0,3,3,3,1 # pe 5,0,0,0,1,0 # i 5,0,0,1,2,0 # fi 5,0,0,2,1,0 # fi 5,0,1,0,2,0 # fi 5,0,1,1,2,0 # fo 5,0,1,2,1,0 # fo 5,0,1,2,2,0 # p 5,0,2,1,1,0 # fo 5,0,2,1,2,0 # p 5,0,2,2,1,0 # p 5,0,3,1,2,0 # pg 5,0,0,0,2,1 # xl 5,0,0,2,2,1 # c 5,0,2,p,b,1 # pe 5,0,3,b,c,1 # pe (was missing in codd.r) 6,0,0,0,1,0 # sh 6,0,0,1,1,0 # sh 6,0,0,1,2,0 # fi 6,0,0,2,1,0 # fi 6,0,1,0,1,0 # sh 6,0,1,0,2,0 # fi 6,0,1,1,1,0 # i 6,0,1,1,2,0 # fo 6,0,1,2,1,0 # fo 6,0,1,2,2,0 # p 6,0,2,1,1,0 # fo 6,0,2,1,2,0 # p 6,0,2,2,1,0 # p 6,0,2,2,3,0 # pe 6,0,2,3,2,0 # pe 6,0,2,3,3,0 # pe 6,0,3,1,2,0 # pg 6,0,3,2,2,0 # pe 6,0,3,2,3,0 # pe 6,0,3,3,2,0 # pe 6,0,3,3,3,0 # pe 6,1,2,3,2,0 # s 6,0,0,0,0,1 # sh 6,0,0,0,2,1 # sh 6,0,0,2,2,1 # c 6,0,2,0,2,1 # pe 6,0,2,2,2,1 # sh 7,0,0,0,1,0 # j 7,0,1,1,2,0 # fo 7,0,1,2,1,0 # fo 7,0,1,2,2,0 # p 7,0,2,1,1,0 # fo 7,0,2,1,2,0 # p 7,0,2,2,1,0 # p 7,0,2,2,3,0 # pe 7,0,2,3,2,0 # pe 7,0,2,3,3,0 # pe 7,0,3,1,2,0 # pg 7,0,3,1,3,0 # pe 7,0,3,2,2,0 # pe 7,0,3,2,3,0 # pe 7,0,3,3,2,0 # pe 7,0,3,3,3,0 # pe 7,1,2,2,2,0 # s 7,0,0,0,2,1 # pe 7,0,0,2,2,1 # c 7,0,2,0,2,1 # pe 7,0,2,2,2,1 # x # End of ruleset @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-3.3-src/Rules/Codd2.rule0000644000175000017500000002154512124663564013151 00000000000000@RULE Codd2 Codd, E.F., _Cellular_Automata_, Academic Press 1968 (ACM Monograph #3). Originally distributed with XLife as codd.r. Several corrections have been made from the XLife version, to match Codd's printed transition table. Stasis transitions have been taken out. More importantly, some extra transitions have been added, to deal with sheathing- signal collision cases that Codd hadn't considered. These additions are at the bottom of the file and clearly marked. Hopefully these changes can be considered to be the intent of Codd's work, if not his exact specification. Just to be clear, these changes change nothing about the way the examples in Codd's book work, and only affect rarely-encountered situations. Contact: Tim Hutton @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} var b={2,3} var c={2,3} var d={4,5,6,7} var e={4,5,6} var f={0,1} var g={1,2} var h={0,1,2} var i={1,2,6} var j={1,6} var k={4,5} var l={4,6,7} var m={1,2,3} var n={6,7} var o={1,2,7} var p={0,2,3} # Almost all configurations with neighborhoods in [0-3] are stable # These are the exceptions (Codd's `short table', page 66) 0,1,2,1,2,1 # Path self-repair 3,0,0,0,2,2 # Path self-repair 3,0,1,0,2,2 # Gate control 3,0,1,0,3,0 # Gate control 2,1,2,3,2,3 # Gate control 3,1,2,3,2,2 # Gate control 0,0,2,1,3,1 # Path end self-repair 0,1,2,3,2,6 # Echo generation 0,1,2,2,2,7 # Echo generation # The long table 0,0,2,7,2,1 # j 0,0,3,6,3,1 # i 0,1,1,2,d,1 # fi = fan-in 0,1,1,e,2,1 # fi 0,1,2,1,d,1 # fi 0,1,2,2,d,1 # p = signal propagation 0,1,2,3,5,1 # p 0,1,2,4,2,1 # p 0,1,2,4,4,1 # fo = fan-out 0,1,2,5,b,1 # p (was fi) 0,1,2,5,5,1 # fo 0,1,2,6,2,1 # p 0,1,2,6,6,1 # fo 0,1,2,7,b,1 # p 0,1,2,7,7,1 # fo 0,1,3,2,4,1 # p 0,1,3,d,2,1 # pg - propagation at gate (subordinate path) 0,1,3,7,3,1 # t7 = transforming to 07 0,1,4,2,2,1 # p 0,1,4,2,4,1 # fo 0,1,4,3,2,1 # p 0,1,4,4,2,1 # fo 0,1,5,2,b,1 # p 0,1,5,2,5,1 # fo 0,1,5,3,2,1 # p 0,1,5,5,2,1 # fo 0,1,6,2,2,1 # p 0,1,6,2,6,1 # fo 0,1,6,6,2,1 # fo 0,1,7,2,2,1 # p 0,1,7,2,7,1 # fo 0,1,7,7,2,1 # fo 0,0,0,f,6,2 # k 0,0,0,2,5,2 # xl = extend left 0,0,0,2,6,2 # sh = sheathing 0,0,0,4,2,2 # xr = extend right 0,0,0,6,1,2 # k 0,0,0,6,2,2 # sh 0,0,0,6,6,2 # sh 0,0,1,0,6,2 # sh 0,0,1,1,6,2 # k 0,0,1,2,6,2 # sh 0,0,1,6,1,2 # k 0,0,1,6,2,2 # sh 0,0,1,6,6,2 # sh 0,0,2,0,6,2 # g = gate control 0,0,2,2,6,2 # sh 0,0,2,6,g,2 # sh 0,0,6,1,1,2 # k 0,0,6,2,1,2 # sh 0,0,6,2,2,2 # sh 0,0,6,2,6,2 # sh 0,0,6,6,1,2 # sh 0,1,1,1,6,2 # k 0,1,1,6,6,2 # sh 0,2,2,2,6,2 # sh 0,2,2,6,6,2 # sh 0,0,0,0,7,3 # k 0,0,0,1,5,3 # i 0,0,0,5,1,3 # i 0,0,1,0,7,3 # e 0,0,2,0,7,3 # g 1,0,0,0,4,0 # e 1,0,0,1,4,0 # e 1,0,0,4,1,0 # e 1,0,1,0,4,0 # e 1,0,1,1,4,0 # e 1,0,1,4,1,0 # e 1,0,4,1,1,0 # e 1,1,1,1,4,0 # e 1,0,0,3,6,2 # i 1,0,0,6,3,2 # i # error in codd.r: 10107[23] # s = sense 1,0,1,0,7,2 # s = sense 1,0,0,0,7,3 # s 1,0,0,2,4,4 # xr 1,0,b,4,c,4 # pe = path end 1,1,1,2,4,4 # fo 1,1,g,4,2,4 # fo,p 1,1,2,g,4,4 # fo,p 1,1,2,4,3,4 # pg 1,1,2,7,7,4 # fi 1,1,4,2,2,4 # p 1,1,7,2,7,4 # fi 1,1,7,7,2,4 # fi 1,2,b,2,4,4 # pe 1,2,b,4,3,4 # pe 1,2,2,4,4,4 # c = collision 1,2,3,2,4,4 # pe 1,b,3,3,4,4 # pe 1,2,4,2,2,4 # c 1,2,4,3,3,4 # pe 1,0,0,5,2,5 # xl 1,0,1,0,5,5 # i 1,0,b,5,c,5 # pe 1,1,1,2,5,5 # fo 1,1,g,5,2,5 # fo,p 1,1,2,g,5,5 # fo,p 1,1,2,4,4,5 # fi 1,1,2,5,3,5 # pg 1,1,4,2,4,5 # fi 1,1,4,4,2,5 # fi 1,1,5,2,2,5 # p 1,2,2,b,5,5 # pe 1,2,2,5,3,5 # pe 1,2,2,5,5,5 # c 1,2,3,b,5,5 # pe 1,2,3,5,3,5 # pe 1,2,5,2,5,5 # c 1,2,5,3,3,5 # pe 1,3,3,3,5,5 # pe 1,0,0,h,6,6 # sh 1,0,0,6,i,6 # sh 1,0,1,h,6,6 # sh 1,0,1,6,i,6 # sh 1,0,2,2,6,6 # pe 1,0,2,6,1,6 # sh 1,0,b,6,c,6 # pe 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,g,6 # sh,pe 1,0,6,2,6,6 # c 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,i,6 # sh,pe,c 1,0,6,6,1,6 # sh 1,1,1,1,5,6 # i 1,1,1,2,6,6 # fo 1,1,1,6,2,6 # fo 1,1,2,1,6,6 # fo 1,1,2,2,6,6 # p 1,1,2,5,5,6 # fi 1,1,2,6,2,6 # p 1,1,2,6,3,6 # pg 1,1,2,6,6,6 # fi 1,1,5,2,5,6 # fi 1,1,5,5,2,6 # fi 1,1,6,2,2,6 # p 1,1,6,2,6,6 # fi 1,1,6,6,2,6 # fi 1,2,2,b,6,6 # pe 1,2,2,6,3,6 # pe 1,2,2,6,6,6 # c 1,2,3,b,6,6 # pe 1,2,3,6,3,6 # pe 1,2,6,2,6,6 # c 1,2,6,3,3,6 # pe 1,3,3,3,6,6 # pe 1,0,2,7,b,7 # pe 1,0,3,7,b,7 # pe 1,1,1,2,7,7 # fo 1,1,1,7,2,7 # fo 1,1,2,g,7,7 # fo,p 1,1,2,7,b,7 # p,pg 1,1,3,e,3,7 # t7 1,1,3,7,3,7 # t7 1,1,7,2,2,7 # p 1,2,2,b,7,7 # pe 1,2,2,7,3,7 # pe 1,2,2,7,7,7 # c 1,2,3,b,7,7 # pe 1,2,3,7,3,7 # pe 1,2,7,2,7,7 # c 1,2,7,3,3,7 # pe 1,3,3,3,7,7 # pe 2,0,h,0,6,0 # k,k,g 2,0,0,f,7,1 # s,x 2,0,0,7,1,1 # x = extend 2,0,1,0,7,1 # s 2,0,1,1,7,1 # x 2,0,1,7,1,1 # x 2,0,7,1,1,1 # x 2,1,1,1,7,1 # x 2,0,0,2,5,3 # qm = cell q change of state 2,0,0,4,2,3 # pm = cell p change of state 2,0,1,4,2,3 # pm (was missing in codd.r) 2,0,2,0,7,3 # g 2,0,2,5,1,3 # qm 2,0,3,0,n,3 # g 2,2,3,2,d,3 # g (was missing in codd.r) 3,0,0,2,n,0 # r,m 3,0,0,6,2,0 # r 3,0,0,7,2,0 # m 3,0,1,6,2,0 # pm 3,0,1,7,2,0 # m 3,0,2,6,1,0 # qm 3,0,2,7,1,0 # m 3,0,0,0,6,1 # s 3,0,0,2,5,1 # qm 3,0,0,4,2,1 # pm 3,2,3,2,d,2 # g 3,0,1,0,6,4 # e 3,0,1,0,7,7 # j 4,0,0,0,1,0 # e 4,0,0,1,2,0 # fi 4,0,0,2,1,0 # fi 4,0,1,0,2,0 # fi 4,0,1,1,2,0 # fo 4,0,1,2,1,0 # fo 4,0,1,2,2,0 # p 4,0,2,1,1,0 # fo 4,0,2,1,2,0 # p 4,0,2,2,1,0 # p 4,0,3,1,2,0 # pg 4,0,0,0,2,1 # xr 4,0,0,2,2,1 # c 4,0,2,0,2,1 # pe 4,0,2,2,2,1 # pe 4,0,2,2,3,1 # pe 4,0,2,3,2,1 # pe 4,0,2,3,3,1 # pe 4,0,3,2,2,1 # pe 4,0,3,2,3,1 # pe 4,0,3,3,2,1 # pe 4,0,3,3,3,1 # pe 5,0,0,0,1,0 # i 5,0,0,1,2,0 # fi 5,0,0,2,1,0 # fi 5,0,1,0,2,0 # fi 5,0,1,1,2,0 # fo 5,0,1,2,1,0 # fo 5,0,1,2,2,0 # p 5,0,2,1,1,0 # fo 5,0,2,1,2,0 # p 5,0,2,2,1,0 # p 5,0,3,1,2,0 # pg 5,0,0,0,2,1 # xl 5,0,0,2,2,1 # c 5,0,2,p,b,1 # pe 5,0,3,b,c,1 # pe (was missing in codd.r) 6,0,0,0,1,0 # sh 6,0,0,1,1,0 # sh 6,0,0,1,2,0 # fi 6,0,0,2,1,0 # fi 6,0,1,0,1,0 # sh 6,0,1,0,2,0 # fi 6,0,1,1,1,0 # i 6,0,1,1,2,0 # fo 6,0,1,2,1,0 # fo 6,0,1,2,2,0 # p 6,0,2,1,1,0 # fo 6,0,2,1,2,0 # p 6,0,2,2,1,0 # p 6,0,2,2,3,0 # pe 6,0,2,3,2,0 # pe 6,0,2,3,3,0 # pe 6,0,3,1,2,0 # pg 6,0,3,2,2,0 # pe 6,0,3,2,3,0 # pe 6,0,3,3,2,0 # pe 6,0,3,3,3,0 # pe 6,1,2,3,2,0 # s 6,0,0,0,0,1 # sh 6,0,0,0,2,1 # sh 6,0,0,2,2,1 # c 6,0,2,0,2,1 # pe 6,0,2,2,2,1 # sh 7,0,0,0,1,0 # j 7,0,1,1,2,0 # fo 7,0,1,2,1,0 # fo 7,0,1,2,2,0 # p 7,0,2,1,1,0 # fo 7,0,2,1,2,0 # p 7,0,2,2,1,0 # p 7,0,2,2,3,0 # pe 7,0,2,3,2,0 # pe 7,0,2,3,3,0 # pe 7,0,3,1,2,0 # pg 7,0,3,1,3,0 # pe 7,0,3,2,2,0 # pe 7,0,3,2,3,0 # pe 7,0,3,3,2,0 # pe 7,0,3,3,3,0 # pe 7,1,2,2,2,0 # s 7,0,0,0,2,1 # pe 7,0,0,2,2,1 # c 7,0,2,0,2,1 # pe 7,0,2,2,2,1 # x # End of Codd's original ruleset # TJH added some extra cases for collisions between sheathing-signals: # (see top of file) # for 2-way collisions: 0,0,6,6,2,2 # sh 0,6,6,0,2,2 # sh (reflected form of above) # for 3-way collisions: 1,6,6,6,0,6 # sh @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-3.3-src/Rules/Devore.rule0000644000175000017500000001442612124663564013442 00000000000000@RULE Devore Devore's cellular automaton (a variation on Codd's CA). See patterns in Patterns/Devore/. Devore,J. and Hightower,R. (1992) The Devore variation of the Codd self-replicating computer, Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260. @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} 0,0,0,0,4,0 # j 0,0,0,0,5,0 0,0,0,0,6,2 0,0,0,1,4,0 0,0,0,1,6,2 0,0,0,2,5,2 0,0,0,2,6,2 0,0,0,3,5,0 0,0,0,4,1,0 0,0,0,4,2,2 0,0,0,6,1,2 0,0,0,6,2,2 0,0,0,6,6,2 0,0,1,0,4,0 0,0,1,0,5,0 0,0,1,0,6,2 0,0,1,0,7,3 0,0,1,1,6,2 0,0,1,6,2,2 0,0,1,6,6,2 0,0,2,0,6,2 0,0,2,1,3,1 0,0,2,2,6,2 0,0,2,6,1,2 0,0,2,6,2,2 0,0,2,6,6,2 0,0,2,7,2,1 0,0,2,7,3,0 0,0,3,0,7,0 0,0,3,1,2,1 0,0,3,6,3,1 0,0,3,7,2,0 0,0,6,2,2,2 0,0,6,6,1,2 0,0,6,6,2,2 0,1,1,1,6,2 0,1,1,2,4,1 0,1,1,2,5,1 0,1,1,2,6,1 0,1,1,2,7,1 0,1,1,4,2,1 0,1,1,5,2,1 0,1,1,6,2,1 0,1,1,6,6,3 0,1,1,7,2,1 0,1,1,7,3,1 0,1,2,1,2,1 0,1,2,1,3,1 0,1,2,1,4,1 0,1,2,1,5,1 0,1,2,1,6,1 0,1,2,1,7,1 0,1,2,2,2,7 0,1,2,2,3,1 0,1,2,2,4,1 0,1,2,2,5,1 0,1,2,2,6,1 0,1,2,2,7,1 0,1,2,3,2,6 0,1,2,3,5,1 0,1,2,4,2,1 0,1,2,4,3,1 0,1,2,4,4,1 0,1,2,5,2,1 0,1,2,5,3,1 0,1,2,5,5,1 0,1,2,6,2,1 0,1,2,6,6,1 0,1,2,7,2,1 0,1,2,7,3,1 0,1,2,7,7,1 0,1,3,2,2,1 0,1,3,2,4,1 0,1,3,4,2,1 0,1,3,4,3,1 0,1,3,4,4,1 0,1,3,5,2,1 0,1,3,6,2,1 0,1,3,7,2,1 0,1,3,7,3,1 0,1,4,2,2,1 0,1,4,2,3,1 0,1,4,2,4,1 0,1,4,3,2,1 0,1,4,3,3,1 0,1,4,4,2,1 0,1,5,2,2,1 0,1,5,2,3,1 0,1,5,2,5,1 0,1,5,3,2,1 0,1,5,5,2,1 0,1,6,2,2,1 0,1,6,2,3,1 0,1,6,2,6,1 0,1,6,6,2,1 0,1,6,6,6,3 0,1,7,2,2,1 0,1,7,2,3,1 0,1,7,2,7,1 0,1,7,7,2,1 0,2,2,2,6,2 0,2,2,6,6,2 0,2,3,2,6,1 0,2,6,6,6,2 1,0,0,0,4,0 1,0,0,0,5,0 1,0,0,0,6,6 1,0,0,0,7,3 1,0,0,1,4,0 1,0,0,1,5,3 1,0,0,1,6,6 1,0,0,1,7,2 1,0,0,2,4,4 1,0,0,2,6,6 1,0,0,3,6,2 1,0,0,5,1,3 1,0,0,5,2,5 1,0,0,6,1,6 1,0,0,6,2,6 1,0,0,6,3,2 1,0,0,6,6,6 1,0,0,7,1,2 1,0,1,0,4,0 1,0,1,0,5,0 1,0,1,0,6,6 1,0,1,0,7,2 1,0,1,1,6,6 1,0,1,2,6,6 1,0,1,6,1,6 1,0,1,6,2,6 1,0,1,6,6,6 1,0,2,2,6,6 1,0,2,5,2,5 1,0,2,6,1,6 1,0,2,6,2,6 1,0,2,6,6,6 1,0,2,7,2,7 1,0,3,5,2,5 1,0,6,0,6,6 1,0,6,1,1,6 1,0,6,1,6,6 1,0,6,2,1,6 1,0,6,2,2,6 1,0,6,2,6,6 1,0,6,6,1,6 1,0,6,6,6,6 1,1,1,1,4,0 1,1,1,1,5,6 1,1,1,1,6,6 1,1,1,2,4,4 1,1,1,2,5,5 1,1,1,2,6,6 1,1,1,2,7,7 1,1,1,4,2,4 1,1,1,5,2,5 1,1,1,6,2,6 1,1,1,6,6,6 1,1,1,7,2,7 1,1,2,1,4,4 1,1,2,1,5,5 1,1,2,1,6,6 1,1,2,1,7,7 1,1,2,2,4,4 1,1,2,2,5,5 1,1,2,2,6,6 1,1,2,2,7,7 1,1,2,3,5,5 1,1,2,4,2,4 1,1,2,4,3,1 1,1,2,4,4,3 1,1,2,5,2,5 1,1,2,5,3,1 1,1,2,5,5,3 1,1,2,6,2,6 1,1,2,6,3,1 1,1,2,6,6,3 1,1,2,7,2,7 1,1,2,7,3,1 1,1,2,7,7,3 1,1,3,4,2,1 1,1,3,4,3,7 1,1,3,5,2,1 1,1,3,5,3,7 1,1,3,6,2,1 1,1,3,6,3,7 1,1,3,7,2,1 1,1,3,7,3,7 1,1,3,7,6,7 1,1,3,7,7,1 1,1,4,2,2,4 1,1,4,2,4,5 1,1,4,3,2,4 1,1,4,4,2,4 1,1,5,2,2,5 1,1,5,2,5,6 1,1,5,5,2,5 1,1,6,2,2,6 1,1,6,6,2,6 1,1,6,7,2,1 1,1,7,2,2,7 1,1,7,2,7,4 1,1,7,7,2,7 1,2,2,2,3,3 1,2,2,2,4,4 1,2,2,2,5,5 1,2,2,2,6,6 1,2,2,2,7,7 1,2,2,3,5,5 1,2,2,3,6,6 1,2,2,4,3,4 1,2,2,4,4,1 1,2,2,5,3,5 1,2,2,5,5,1 1,2,2,6,3,6 1,2,2,6,6,1 1,2,2,7,7,1 1,2,3,2,4,4 1,2,3,2,5,5 1,2,3,2,6,6 1,2,3,2,7,7 1,2,3,6,3,6 1,2,3,7,3,7 1,2,5,3,3,5 1,2,6,2,6,6 1,3,3,3,6,6 2,0,0,0,4,2 2,0,0,0,5,2 2,0,0,0,6,0 2,0,0,0,7,1 2,0,0,1,4,2 2,0,0,1,5,2 2,0,0,1,6,2 2,0,0,1,7,1 2,0,0,2,4,2 2,0,0,2,5,3 2,0,0,2,6,2 2,0,0,2,7,2 2,0,0,3,4,2 2,0,0,3,5,2 2,0,0,3,6,2 2,0,0,3,7,2 2,0,0,4,1,2 2,0,0,4,2,3 2,0,0,5,1,2 2,0,0,5,2,2 2,0,0,5,3,2 2,0,0,6,1,2 2,0,0,6,2,2 2,0,0,6,3,2 2,0,0,7,1,1 2,0,0,7,2,2 2,0,0,7,3,2 2,0,1,0,4,2 2,0,1,0,5,2 2,0,1,0,6,0 2,0,1,0,7,1 2,0,1,1,4,2 2,0,1,1,5,2 2,0,1,1,6,2 2,0,1,1,7,1 2,0,1,4,1,2 2,0,1,4,2,3 2,0,1,5,1,2 2,0,1,5,2,2 2,0,1,5,3,2 2,0,1,6,1,2 2,0,1,6,2,2 2,0,1,7,1,1 2,0,1,7,2,2 2,0,2,0,6,2 2,0,2,0,7,3 2,0,2,1,4,2 2,0,2,1,5,2 2,0,2,1,6,2 2,0,2,1,7,2 2,0,2,2,4,2 2,0,2,2,5,2 2,0,2,2,6,2 2,0,2,2,7,2 2,0,2,4,1,2 2,0,2,4,2,2 2,0,2,4,3,2 2,0,2,5,1,3 2,0,2,5,2,2 2,0,2,5,3,2 2,0,2,6,1,2 2,0,2,6,2,2 2,0,2,6,3,2 2,0,2,6,6,2 2,0,2,7,1,2 2,0,2,7,2,2 2,0,2,7,3,2 2,0,2,7,7,2 2,0,3,0,6,3 2,0,3,0,7,3 2,0,3,1,6,2 2,0,3,1,7,2 2,0,3,4,1,2 2,0,3,4,2,2 2,0,3,4,3,2 2,0,3,5,2,2 2,0,3,5,3,2 2,0,3,6,2,2 2,0,3,7,1,2 2,0,3,7,2,2 2,0,3,7,3,2 2,0,4,1,2,2 2,0,4,2,2,2 2,0,5,1,2,2 2,0,5,2,2,2 2,0,6,1,2,2 2,0,6,1,3,2 2,0,6,2,2,2 2,0,6,6,2,2 2,0,7,1,2,2 2,0,7,2,2,2 2,0,7,3,2,2 2,0,7,7,2,2 2,1,1,1,4,2 2,1,1,1,5,2 2,1,1,1,6,5 2,1,1,1,7,1 2,1,1,6,2,2 2,1,2,2,4,2 2,1,2,2,5,2 2,1,2,2,6,2 2,1,2,2,7,2 2,1,2,3,2,3 2,1,2,3,4,2 2,1,2,3,5,2 2,1,2,3,6,2 2,1,2,3,7,2 2,1,3,2,6,2 2,1,3,2,7,2 2,1,4,2,2,2 2,1,5,2,2,2 2,1,5,3,2,2 2,1,5,3,3,2 2,1,6,2,2,2 2,1,6,2,3,2 2,1,6,3,2,2 2,1,7,2,2,2 2,1,7,2,3,2 2,1,7,3,2,2 2,1,7,7,2,2 2,2,2,2,4,2 2,2,2,2,5,2 2,2,2,2,6,2 2,2,2,2,7,2 2,2,2,3,4,2 2,2,2,4,3,2 2,2,2,4,4,2 2,2,2,5,3,2 2,2,2,5,5,2 2,2,2,6,3,2 2,2,2,6,6,2 2,2,2,6,7,2 2,2,2,7,3,2 2,2,2,7,6,2 2,2,2,7,7,2 2,2,3,7,6,2 2,2,3,7,7,2 2,2,6,7,3,2 2,2,7,7,3,2 3,0,0,0,2,2 3,0,0,0,4,3 3,0,0,0,5,3 3,0,0,0,6,1 3,0,0,1,1,1 3,0,0,2,5,1 3,0,0,2,6,0 3,0,0,2,7,0 3,0,0,4,2,1 3,0,0,5,2,3 3,0,0,6,2,0 3,0,0,7,2,0 3,0,1,0,2,2 3,0,1,0,3,2 3,0,1,0,4,3 3,0,1,0,5,3 3,0,1,0,6,4 3,0,1,0,7,7 3,0,1,1,1,1 3,0,1,5,2,3 3,0,1,6,2,0 3,0,1,7,2,0 3,0,2,6,1,0 3,0,2,7,1,0 3,1,1,1,1,1 3,1,1,1,2,1 3,1,1,1,3,1 3,1,1,7,2,7 3,1,2,3,2,2 3,2,2,2,7,3 4,0,0,0,1,0 4,0,0,0,2,1 4,0,0,2,1,0 4,0,1,0,2,0 4,0,1,1,2,0 4,0,1,2,1,0 4,0,1,2,2,0 4,0,2,1,1,0 4,0,2,1,2,0 4,0,2,2,1,0 4,0,2,2,2,1 4,0,2,3,2,1 4,0,3,2,2,1 5,0,0,0,2,1 5,0,0,2,1,0 5,0,1,0,2,0 5,0,1,1,1,0 5,0,1,1,2,0 5,0,1,2,1,0 5,0,1,2,2,0 5,0,2,0,2,1 5,0,2,1,1,0 5,0,2,1,2,0 5,0,2,2,1,0 5,0,2,2,2,1 5,0,2,2,3,1 5,0,3,2,2,1 5,0,3,3,2,1 6,0,0,0,0,1 6,0,0,0,1,0 6,0,0,0,2,1 6,0,0,1,1,0 6,0,0,1,2,0 6,0,0,2,1,0 6,0,0,2,2,1 6,0,1,0,1,0 6,0,1,0,2,0 6,0,1,1,1,0 6,0,1,1,2,0 6,0,1,2,1,0 6,0,1,2,2,0 6,0,2,0,2,1 6,0,2,1,1,0 6,0,2,1,2,0 6,0,2,2,1,0 6,0,2,2,2,1 6,0,2,2,3,0 6,0,2,3,2,0 6,0,3,2,2,0 6,0,3,2,3,0 6,0,3,3,3,0 6,1,2,3,2,0 7,0,0,0,1,0 7,0,0,1,3,0 7,0,0,2,1,0 7,0,1,1,2,0 7,0,1,2,1,0 7,0,1,2,2,0 7,0,2,0,2,1 7,0,2,1,1,0 7,0,2,1,2,0 7,0,2,2,1,0 7,0,2,2,2,1 7,0,2,3,2,0 7,0,3,1,3,0 7,0,3,2,3,0 7,1,2,2,2,0 # End of ruleset @COLORS 1 0 0 255 2 0 220 0 3 255 255 0 4 0 255 255 5 255 0 255 6 255 0 0 7 255 255 255 golly-3.3-src/Rules/Turmite_180121020081.rule0000644000175000017500000006475612124005036015131 00000000000000@RULE Turmite_180121020081 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 2 10 10 10 10 10 2 2 2 2 10 10 10 10 2 2 2 2 1 6 14 14 14 14 14 6 6 6 6 14 14 14 14 6 6 6 6 2 0 0 0 1 0 0 0 0 0 1 0 0 0 2 0 2 0 0 1 5 13 13 13 13 13 5 5 5 5 13 13 13 13 5 5 5 5 2 4 4 4 0 4 4 4 4 4 0 4 4 4 0 4 0 4 4 1 9 17 17 17 17 17 9 9 9 9 17 17 17 17 9 9 9 9 2 6 6 6 0 6 6 6 6 6 0 6 6 6 0 6 0 6 6 3 3 3 5 3 3 3 3 3 5 3 3 3 7 3 7 3 3 3 1 3 11 11 11 11 11 3 3 3 3 11 11 11 11 3 3 3 3 2 9 9 9 0 9 9 9 9 9 0 9 9 9 0 9 0 9 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 11 10 10 10 10 10 11 10 10 10 11 10 11 10 10 10 1 7 15 15 15 15 15 7 7 7 7 15 15 15 15 7 7 7 7 2 13 13 13 0 13 13 13 13 13 0 13 13 13 0 13 0 13 13 3 14 14 11 14 14 14 14 14 11 14 14 14 11 14 11 14 14 14 4 8 8 8 8 12 8 12 8 8 8 15 8 8 8 8 8 15 8 1 4 12 12 12 12 12 4 4 4 4 12 12 12 12 4 4 4 4 2 17 17 17 0 17 17 17 17 17 0 17 17 17 0 17 0 17 17 3 18 18 11 18 18 18 18 18 11 18 18 18 11 18 11 18 18 18 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 19 19 20 19 20 19 19 19 20 19 19 19 19 19 20 19 1 8 16 16 16 16 16 8 8 8 8 16 16 16 16 8 8 8 8 2 22 22 22 0 22 22 22 22 22 0 22 22 22 0 22 0 22 22 3 23 23 11 23 23 23 23 23 11 23 23 23 11 23 11 23 23 23 4 24 24 24 24 20 24 20 24 24 24 20 24 24 24 24 24 20 24 5 16 16 16 16 16 21 16 21 16 16 16 25 16 16 16 16 16 25 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-3.3-src/Rules/DLA-Margolus-emulated.rule0000644000175000017500000001107012060231465016161 00000000000000@RULE DLA-Margolus-emulated @TREE num_states=7 num_neighbors=8 num_nodes=204 1 0 2 2 4 4 6 6 1 0 1 2 3 4 5 6 2 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 2 0 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 4 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 5 9 10 14 10 14 10 14 1 0 1 1 3 3 5 5 2 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 1 0 2 2 2 4 6 6 1 0 2 2 6 4 6 6 2 0 1 21 1 0 1 22 1 0 4 2 4 4 6 6 2 0 1 0 1 24 1 0 2 0 1 22 1 0 1 0 3 2 3 23 3 25 3 26 4 27 7 27 7 27 7 27 5 28 10 28 10 28 10 28 1 0 4 2 2 4 6 6 2 0 1 30 1 0 1 0 2 0 1 21 1 24 1 0 3 2 3 31 3 32 3 2 4 33 7 33 7 33 7 33 5 34 10 34 10 34 10 34 2 0 1 0 1 0 1 22 3 2 3 36 3 2 3 26 4 37 7 37 7 37 7 37 5 38 10 38 10 38 10 38 6 15 20 29 20 35 20 39 5 10 10 10 10 10 10 10 6 20 20 41 20 41 20 41 3 2 3 2 3 2 3 2 1 0 1 2 3 2 5 6 1 0 1 2 3 6 5 6 2 1 1 44 1 1 1 45 3 46 46 3 46 3 46 3 1 0 1 4 3 4 5 6 2 1 1 1 1 48 1 1 3 49 49 3 49 3 49 3 2 1 1 45 1 1 1 1 3 51 51 3 51 3 51 3 4 43 47 43 50 43 52 43 5 53 10 53 10 53 10 53 4 27 47 27 50 27 52 27 5 55 10 55 10 55 10 55 4 33 47 33 50 33 52 33 5 57 10 57 10 57 10 57 4 37 47 37 50 37 52 37 5 59 10 59 10 59 10 59 6 54 41 56 41 58 41 60 1 0 1 4 3 2 5 6 2 1 1 62 1 44 1 1 3 63 63 3 63 3 63 3 4 43 64 43 50 43 7 43 5 65 10 65 10 65 10 65 4 27 64 27 50 27 7 27 5 67 10 67 10 67 10 67 4 33 64 33 50 33 7 33 5 69 10 69 10 69 10 69 4 37 64 37 50 37 7 37 5 71 10 71 10 71 10 71 6 66 41 68 41 70 41 72 2 1 1 1 1 1 1 45 3 74 74 3 74 3 74 3 4 43 75 43 7 43 52 43 5 76 10 76 10 76 10 76 4 27 75 27 7 27 52 27 5 78 10 78 10 78 10 78 4 33 75 33 7 33 52 33 5 80 10 80 10 80 10 80 4 37 75 37 7 37 52 37 5 82 10 82 10 82 10 82 6 77 41 79 41 81 41 83 7 40 42 61 42 73 42 84 6 41 41 41 41 41 41 41 7 42 42 86 42 86 42 86 4 43 7 43 7 43 7 43 2 44 44 1 44 1 44 1 2 45 45 1 45 1 45 1 3 3 3 89 3 3 3 90 4 91 7 91 7 91 7 91 2 48 48 1 48 1 48 1 3 3 3 3 3 93 3 3 4 94 7 94 7 94 7 94 3 3 3 90 3 3 3 3 4 96 7 96 7 96 7 96 5 88 92 88 95 88 97 88 5 28 92 28 95 28 97 28 5 34 92 34 95 34 97 34 5 38 92 38 95 38 97 38 6 98 41 99 41 100 41 101 5 53 92 53 95 53 97 53 5 55 92 55 95 55 97 55 5 57 92 57 95 57 97 57 5 59 92 59 95 59 97 59 6 103 41 104 41 105 41 106 5 65 92 65 95 65 97 65 5 67 92 67 95 67 97 67 5 69 92 69 95 69 97 69 5 71 92 71 95 71 97 71 6 108 41 109 41 110 41 111 5 76 92 76 95 76 97 76 5 78 92 78 95 78 97 78 5 80 92 80 95 80 97 80 5 82 92 82 95 82 97 82 6 113 41 114 41 115 41 116 7 102 86 107 86 112 86 117 2 62 62 1 62 1 62 1 3 3 3 119 3 3 3 3 4 120 7 120 7 120 7 120 3 3 3 89 3 93 3 3 4 122 7 122 7 122 7 122 5 88 121 88 123 88 10 88 5 28 121 28 123 28 10 28 5 34 121 34 123 34 10 34 5 38 121 38 123 38 10 38 6 124 41 125 41 126 41 127 5 53 121 53 123 53 10 53 5 55 121 55 123 55 10 55 5 57 121 57 123 57 10 57 5 59 121 59 123 59 10 59 6 129 41 130 41 131 41 132 5 65 121 65 123 65 10 65 5 67 121 67 123 67 10 67 5 69 121 69 123 69 10 69 5 71 121 71 123 71 10 71 6 134 41 135 41 136 41 137 5 76 121 76 123 76 10 76 5 78 121 78 123 78 10 78 5 80 121 80 123 80 10 80 5 82 121 82 123 82 10 82 6 139 41 140 41 141 41 142 7 128 86 133 86 138 86 143 3 3 3 3 3 3 3 90 4 145 7 145 7 145 7 145 5 88 146 88 10 88 97 88 5 28 146 28 10 28 97 28 5 34 146 34 10 34 97 34 5 38 146 38 10 38 97 38 6 147 41 148 41 149 41 150 5 53 146 53 10 53 97 53 5 55 146 55 10 55 97 55 5 57 146 57 10 57 97 57 5 59 146 59 10 59 97 59 6 152 41 153 41 154 41 155 5 65 146 65 10 65 97 65 5 67 146 67 10 67 97 67 5 69 146 69 10 69 97 69 5 71 146 71 10 71 97 71 6 157 41 158 41 159 41 160 5 76 146 76 10 76 97 76 5 78 146 78 10 78 97 78 5 80 146 80 10 80 97 80 5 82 146 82 10 82 97 82 6 162 41 163 41 164 41 165 7 151 86 156 86 161 86 166 8 85 87 118 87 144 87 167 1 0 1 1 3 1 5 5 2 169 1 169 1 169 1 169 3 170 3 170 3 170 3 170 1 0 1 1 3 5 5 5 2 172 1 172 1 172 1 172 3 173 3 173 3 173 3 173 4 18 7 171 7 18 7 174 1 0 1 3 3 3 5 5 2 176 1 176 1 176 1 176 3 177 3 177 3 177 3 177 4 18 7 18 7 178 7 18 4 18 7 174 7 18 7 18 5 19 10 175 10 179 10 180 6 181 181 41 181 41 181 41 7 182 182 86 182 86 182 86 7 86 86 86 86 86 86 86 8 183 183 184 183 184 183 184 5 88 10 88 10 88 10 88 6 186 41 29 41 35 41 39 7 187 86 61 86 73 86 84 8 188 184 118 184 144 184 167 1 0 1 3 3 1 5 5 2 190 1 190 1 190 1 190 3 191 3 191 3 191 3 191 4 18 7 192 7 171 7 18 5 19 10 193 10 179 10 19 6 194 194 41 194 41 194 41 7 195 195 86 195 86 195 86 8 196 196 184 196 184 196 184 4 18 7 18 7 18 7 174 5 19 10 198 10 19 10 180 6 199 199 41 199 41 199 41 7 200 200 86 200 86 200 86 8 201 201 184 201 184 201 184 9 168 185 189 197 189 202 189 @COLORS 1 90 90 90 2 62 62 62 3 0 0 255 4 0 0 220 5 255 255 255 6 220 220 220 golly-3.3-src/Rules/Turmite_121181121020.rule0000644000175000017500000006501612124005036015113 00000000000000@RULE Turmite_121181121020 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 6 14 14 14 14 14 14 14 14 14 14 14 14 14 6 6 6 6 1 2 10 10 10 10 10 10 10 10 10 10 10 10 10 2 2 2 2 2 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 2 1 9 17 17 17 17 17 17 17 17 17 17 17 17 17 9 9 9 9 2 4 4 4 4 4 0 4 4 4 0 4 0 4 4 4 4 4 0 1 5 13 13 13 13 13 13 13 13 13 13 13 13 13 5 5 5 5 2 6 6 6 6 6 0 6 6 6 0 6 0 6 6 6 6 6 0 3 3 3 3 3 5 3 3 3 5 3 5 3 3 3 3 3 7 3 1 7 15 15 15 15 15 15 15 15 15 15 15 15 15 7 7 7 7 2 9 9 9 9 9 0 9 9 9 0 9 0 9 9 9 9 9 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 10 10 11 10 10 10 11 10 11 10 10 10 10 10 11 10 1 3 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 2 13 13 13 13 13 0 13 13 13 0 13 0 13 13 13 13 13 0 3 14 14 14 14 11 14 14 14 11 14 11 14 14 14 14 14 11 14 4 8 8 12 8 8 8 12 8 8 8 8 8 12 8 15 8 8 8 1 8 16 16 16 16 16 16 16 16 16 16 16 16 16 8 8 8 8 2 17 17 17 17 17 0 17 17 17 0 17 0 17 17 17 17 17 0 3 18 18 18 18 11 18 18 18 11 18 11 18 18 18 18 18 11 18 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 20 19 19 19 20 19 19 19 19 19 20 19 20 19 19 19 1 4 12 12 12 12 12 12 12 12 12 12 12 12 12 4 4 4 4 2 22 22 22 22 22 0 22 22 22 0 22 0 22 22 22 22 22 0 3 23 23 23 23 11 23 23 23 11 23 11 23 23 23 23 23 11 23 4 24 24 20 24 24 24 20 24 24 24 24 24 20 24 20 24 24 24 5 16 16 16 21 16 16 16 21 16 16 16 16 16 21 16 25 16 16 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-3.3-src/Rules/Caterpillars.rule0000644000175000017500000000102412060231465014617 00000000000000@RULE Caterpillars @TREE num_states=4 num_neighbors=8 num_nodes=38 1 0 2 3 0 1 0 1 3 0 2 0 1 0 0 2 1 1 1 1 3 2 3 2 2 1 1 2 3 0 2 1 5 1 1 3 3 6 3 3 4 4 7 4 4 2 5 1 5 5 3 6 9 6 6 4 7 10 7 7 5 8 11 8 8 3 9 3 9 9 4 10 13 10 10 5 11 14 11 11 6 12 15 12 12 3 3 3 3 3 4 13 17 13 13 5 14 18 14 14 6 15 19 15 15 7 16 20 16 16 1 1 1 3 0 2 1 22 1 1 3 3 23 3 3 4 17 24 17 17 5 18 25 18 18 6 19 26 19 19 7 20 27 20 20 8 21 28 21 21 2 22 5 22 22 3 23 30 23 23 4 24 31 24 24 5 25 32 25 25 6 26 33 26 26 7 27 34 27 27 8 28 35 28 28 9 29 36 29 29 golly-3.3-src/Rules/TableGenerators/0000755000175000017500000000000013543257426014461 500000000000000golly-3.3-src/Rules/TableGenerators/make-ruletable.cpp0000644000175000017500000005472013145740437020004 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include #include #include #include #include #include #include #include #include using namespace std; /* Makes a rule-table for your transition function. To compile: g++ -O5 -o make-ruletable make-ruletable.cpp or in Microsoft Visual Studio, add to an empty CLR project. To use: 1) fill slowcalc with your own transition function. 2) set the parameters in main() at the bottom. 3) execute the program from the command line (no options taken) For a 32-state 5-neighbourhood rule it took 16mins on a 2.2GHz machine. For a 4-state 9-neighbourhood rule it took 4s. The merging is very simple - if a transition is compatible with the first rule, then merge the transition into the rule. If not, try the next rule. If there are no more rules, add a new rule containing just the transition. === Worked example: === Transitions: 1,0,0->3 1,2,0->3 2,0,0->3 2,2,0->1 Start. First transition taken as first rule: rule 1: 1,0,0->3 Next transition - is it compatible with rule 1? i.e. is 1,[0,2],0->3 valid for all permutations? Yes. rule 1 now: 1,[0,2],0->3 Next transition - is it compatible with rule 1? i.e. is [1,2],[0,2],0->3 valid for all permutations? no - because 2,2,0 ->1, not ->3. so add the transition as a new rule: rule 1 still: 1,[0,2],0 -> 3 rule 2 now : 2,0,0->3 Next transition - is it compatible with rule 1? no - output is different. Is it compatible with rule 2? no - output is different. Final output: 1,[0,2],0 -> 3 2,0,0 -> 3 2,2,0 -> 1 Written with variables: var a={0,2} 1,a,0,3 2,0,0,3 2,2,0,1 =============== In the function produce_rule_table, the state space is exhaustively traversed. If your transition function consists of transition rules already then you can optimise by running through the transitions instead. You might also want to turn off the optimisation in rule::can_merge, to see if it gives you better compression. Also note: I feel sure there are better ways to compress rule tables than this... Contact: Tim Hutton */ // some typedefs and compile-time constants typedef unsigned short state; enum TSymm { none, rotate4, rotate8, reflect, rotate4reflect, rotate8reflect }; static const string symmetry_strings[] = {"none","rotate4","rotate8","reflect","rotate4reflect","rotate8reflect"}; // fill in this function with your desired transition rules // (for von Neumann neighbourhoods, just ignore the nw,se,sw,ne inputs) state slowcalc(state nw,state n,state ne,state w,state c,state e,state sw,state s,state se) { // wireworld: switch (c) { case 0: return 0 ; case 1: return 2 ; case 2: return 3 ; case 3: if ((((1+(nw==1)+(n==1)+(ne==1)+(w==1)+(e==1)+(sw==1)+ (s==1)+(se==1))) | 1) == 3) return 1 ; else return 3 ; default: return 0 ; // should throw an error here } } vector rotate_inputs(const vector& inputs,int rot) { vector rotinp(inputs); rotate_copy(inputs.begin()+1,inputs.begin()+1+rot,inputs.end(),rotinp.begin()+1); return rotinp; } vector reflect_inputs(const vector& inputs,int neighbourhood_size) { vector refinp(inputs); if(neighbourhood_size==5) // CNESW { refinp[2]=inputs[4]; // swap E and W refinp[4]=inputs[2]; } else // neighbourhood_size==9 (C,N,NE,E,SE,S,SW,W,NW) { refinp[2]=inputs[8]; refinp[8]=inputs[2]; refinp[3]=inputs[7]; refinp[7]=inputs[3]; refinp[4]=inputs[6]; refinp[6]=inputs[4]; // swap all E and W } return refinp; } // simple rule structure, e.g. 1,2,[4,5],8,2 -> 0 class rule { public: set inputs[9]; // c,n,ne,e,se,s,sw,w,nw or c,n,e,s,w state ns; // new state int n_inputs; // 5: von Neumann; 9: Moore TSymm symm; public: // constructors rule(const rule& r) : ns(r.ns),n_inputs(r.n_inputs),symm(r.symm) { for(int i=0;i& inputs,int n_inputs,state ns1,TSymm symm1) : ns(ns1),n_inputs(n_inputs),symm(symm1) { merge(inputs); } // if we merge the rule and the supplied transition, will the rule remain true for all cases? bool can_merge(const vector& test_inputs,state ns1) const { if(ns1!=ns) return false; // can't merge if the outputs are different // If you are running through your own transitions, or for small state spaces, // you might want to turn off this optimisation, to get better compression. // On JvN29 it doesn't make any difference but on Nobili32 it does. const bool forbid_multiple_input_differences = true; if(forbid_multiple_input_differences) { // optimisation: we skip this rule if more than 2 entries are different, we // assume we will have considered the relevant one-change rules before this. int n_different=0; for(int i=0;i1) return false; // just check the new permutations for(int i=0;i& new_inputs) { for(int i=0;i& test_inputs) const { int n_rotations,rotation_skip; bool do_reflect; switch(symm) { default: case none: n_rotations=1; rotation_skip=1; do_reflect=false; break; case rotate4: if(n_inputs==5) { n_rotations=4; rotation_skip=1; do_reflect=false; } else { n_rotations=4; rotation_skip=2; do_reflect=false; } break; case rotate8: n_rotations=8; rotation_skip=1; do_reflect=false; break; case reflect: n_rotations=1; rotation_skip=1; do_reflect=true; break; case rotate4reflect: if(n_inputs==5) { n_rotations=4; rotation_skip=1; do_reflect=true; } else { n_rotations=4; rotation_skip=2; do_reflect=true; } break; case rotate8reflect: n_rotations=8; rotation_skip=1; do_reflect=true; break; } for(int iRot=0;iRot& test_inputs) const { for(int i=0;i::const_iterator c_it,n_it,ne_it,e_it,se_it,s_it,sw_it,w_it,nw_it; if(n_inputs==9) { for(c_it = inputs[0].begin();c_it!=inputs[0].end();c_it++) for(n_it = inputs[1].begin();n_it!=inputs[1].end();n_it++) for(ne_it = inputs[2].begin();ne_it!=inputs[2].end();ne_it++) for(e_it = inputs[3].begin();e_it!=inputs[3].end();e_it++) for(se_it = inputs[4].begin();se_it!=inputs[4].end();se_it++) for(s_it = inputs[5].begin();s_it!=inputs[5].end();s_it++) for(sw_it = inputs[6].begin();sw_it!=inputs[6].end();sw_it++) for(w_it = inputs[7].begin();w_it!=inputs[7].end();w_it++) for(nw_it = inputs[8].begin();nw_it!=inputs[8].end();nw_it++) if(slowcalc(*nw_it,*n_it,*ne_it,*w_it,*c_it,*e_it,*sw_it,*s_it,*se_it)!=ns) return false; } else { for(c_it = inputs[0].begin();c_it!=inputs[0].end();c_it++) for(n_it = inputs[1].begin();n_it!=inputs[1].end();n_it++) for(e_it = inputs[2].begin();e_it!=inputs[2].end();e_it++) for(s_it = inputs[3].begin();s_it!=inputs[3].end();s_it++) for(w_it = inputs[4].begin();w_it!=inputs[4].end();w_it++) if(slowcalc(0,*n_it,0,*w_it,*c_it,*e_it,0,*s_it,0)!=ns) return false; } return true; } }; // makes a unique variable name for a given value string get_variable_name(unsigned int iVar) { const char VARS[52]={'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t','u','v','w','x', 'y','z','A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; ostringstream oss; if(iVar<52) oss << VARS[iVar]; else if(iVar<52*52) oss << VARS[(iVar-(iVar%52))/52 - 1] << VARS[iVar%52]; else oss << "!"; // we have a 52*52 limit ("should be enough for anyone") return oss.str(); } void print_rules(const vector& rules,ostream& out) { // first collect all variables (makes reading easier) map< string , set > vars; ostringstream rules_out; for(vector::const_iterator r_it=rules.begin();r_it!=rules.end();r_it++) { vector variables_used; for(int i=0;in_inputs;i++) { // if more than one state for this input, we need a variable if(r_it->inputs[i].size()>1) { string var; // is there a variable that matches these inputs, and that we haven't used? bool found_unused_var=false; for(map >::const_iterator v_it=vars.begin();v_it!=vars.end();v_it++) { if(v_it->second==r_it->inputs[i] && find(variables_used.begin(),variables_used.end(),v_it->first)==variables_used.end()) { found_unused_var = true; var = v_it->first; break; } } if(!found_unused_var) { // we need to make a new one for this set of inputs var = get_variable_name(vars.size()); // add it to the list of made variables vars[var] = r_it->inputs[i]; // print it out << "var " << var << "={"; set::const_iterator it=r_it->inputs[i].begin(); while(true) { out << (int)*it; it++; if(it!=r_it->inputs[i].end()) out << ","; else break; } out << "}\n"; } // add the variable to the list of used ones variables_used.push_back(var); rules_out << var << ","; } else { // just a state, output it rules_out << (int)*r_it->inputs[i].begin() << ","; } } rules_out << (int)r_it->ns << endl; } out << rules_out.str(); } void produce_rule_table(vector& rules,int N,int nhood_size,TSymm symm,bool remove_stasis) { int n_rotations,rotation_skip; bool do_reflect; switch(symm) { default: case none: n_rotations=1; rotation_skip=1; do_reflect=false; break; case rotate4: if(nhood_size==5) { n_rotations=4; rotation_skip=1; do_reflect=false; } else { n_rotations=4; rotation_skip=2; do_reflect=false; } break; case rotate8: n_rotations=8; rotation_skip=1; do_reflect=false; break; case reflect: n_rotations=1; rotation_skip=1; do_reflect=true; break; case rotate4reflect: if(nhood_size==5) { n_rotations=4; rotation_skip=1; do_reflect=true; } else { n_rotations=4; rotation_skip=2; do_reflect=true; } break; case rotate8reflect: n_rotations=8; rotation_skip=1; do_reflect=true; break; } state c,n,ne,nw,sw,s,se,e,w,ns; vector::iterator it; bool merged; for(c=0;c inputs(9); inputs[0]=c; for(n=0;n inputs(5); inputs[0]=c; for(n=0;n& rules,const vector& inputs) { for(vector::const_iterator it=rules.begin();it!=rules.end();it++) if(it->matches(inputs)) return it->ns; return inputs[0]; // default: no change } bool is_correct(const vector&rules,int N,int neighbourhood_size) { // exhaustive check state c,n,ne,nw,sw,s,se,e,w; if(neighbourhood_size==9) { vector inputs(9); for(c=0;c inputs(5); for(c=0;c rules; time_t t1,t2; time(&t1); produce_rule_table(rules,N_STATES,nhood_size,symmetry,remove_stasis_transitions); time(&t2); int n_secs = (int)difftime(t2,t1); cout << "\nProcessing took: " << n_secs << " seconds." << endl; { ofstream out(output_filename.c_str()); out << "# rules: " << rules.size() << "\n#"; out << "\n# Golly rule-table format.\n# Each rule: C,"; if(nhood_size==5) out << "N,E,S,W"; else out << "N,NE,E,SE,S,SW,W,NW"; out << ",C'"; out << "\n# N.B. Where the same variable appears multiple times in a transition,\n# it takes the same value each time.\n#"; if(remove_stasis_transitions) out << "\n# Default for transitions not listed: no change\n#"; else out << "\n# All transitions should be included below, including no-change ones.\n#"; out << "\nn_states:" << N_STATES; out << "\nneighborhood:" << ((nhood_size==5)?("vonNeumann"):("Moore")); out << "\nsymmetries:" << symmetry_strings[symmetry] << "\n"; print_rules(rules,out); } cout << rules.size() << " rules written." << endl; // optional: run through the entire state space, checking that new_slowcalc matches slowcalc cout << "Verifying is correct (can abort if you're confident)..."; cout.flush(); if(is_correct(rules,N_STATES,nhood_size)) cout << "yes." << endl; else cout << "no! Either there's a bug in the code, or the transition function does not have the symmetry you selected." << endl; } golly-3.3-src/Rules/Chou-Reggia-2.rule0000644000175000017500000000630512124663564014444 00000000000000@RULE Chou-Reggia-2 J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. ``Simple systems that exhibit self-directed replication.'' Science, Vol. 259, pages 1282-1287, February 1993. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" @TABLE # rules: 65 # format: CNESWC' n_states:8 neighborhood:vonNeumann symmetries:rotate4 000000 000440 000547 000100 000110 000330 004040 004445 004100 001040 001010 001740 003000 003010 003030 007040 007030 007104 007110 040000 040070 047100 050007 017000 070000 070077 071010 400101 400313 401033 407103 411033 431033 500033 503330 100045 100011 100414 101044 101301 103011 107131 140414 141044 111044 133011 177711 304011 305011 305141 307141 344011 345011 354010 314001 377711 700000 700337 707100 707141 707110 717000 730007 770070 770711 @TREE num_states=8 num_neighbors=4 num_nodes=101 1 0 1 2 3 4 5 6 0 1 0 1 2 3 1 5 6 7 1 0 1 2 3 4 5 6 7 1 0 1 2 3 4 3 6 7 1 0 5 2 3 4 5 6 7 1 7 1 2 3 4 5 6 7 2 0 1 2 3 4 5 2 2 1 0 1 2 1 4 5 6 7 2 1 2 2 2 7 2 2 0 2 2 2 2 2 2 2 2 2 1 0 1 2 3 3 5 6 7 2 3 10 2 2 2 2 2 2 1 0 4 2 3 4 5 6 7 2 4 12 2 2 2 2 2 2 2 5 2 2 2 5 2 2 2 1 4 1 2 3 3 5 6 0 1 7 1 2 3 4 5 6 0 2 2 15 2 2 2 2 2 16 3 6 8 9 11 13 14 9 17 2 1 2 2 10 12 2 2 15 2 10 10 2 10 2 2 2 2 1 0 4 2 1 4 5 6 7 2 21 12 2 2 12 2 2 2 2 7 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 2 3 19 9 9 20 22 23 9 24 3 9 9 9 9 9 9 9 9 2 3 2 2 2 2 2 2 2 2 10 2 2 2 2 2 2 2 1 0 1 2 3 4 0 6 7 2 2 2 2 29 2 2 2 2 3 27 28 9 30 9 9 9 9 2 4 7 2 2 2 5 2 2 1 0 1 2 0 4 5 6 7 2 21 2 2 2 7 33 2 2 1 5 1 2 3 4 5 6 7 2 2 12 2 2 35 2 2 2 2 2 7 2 2 2 2 2 2 1 0 1 2 1 4 5 6 1 2 2 38 2 2 2 2 2 2 3 32 34 9 9 36 37 9 39 2 5 2 2 2 2 2 2 2 2 7 2 2 2 7 2 2 2 3 41 42 9 9 9 9 9 9 2 2 0 2 2 2 2 2 16 1 0 1 2 3 4 5 6 1 2 2 45 2 2 2 2 2 2 3 44 9 9 9 9 9 9 46 4 18 25 26 31 40 43 26 47 2 1 2 2 10 21 7 2 2 2 7 2 2 2 7 7 2 2 2 2 2 2 2 33 2 2 2 2 0 2 2 2 2 2 2 2 3 49 9 9 9 50 51 9 52 2 2 2 2 10 12 2 2 0 3 54 9 9 9 9 9 9 9 2 10 2 2 10 2 2 2 2 3 56 28 9 9 9 9 9 9 2 12 2 2 2 12 2 2 2 2 12 2 2 2 2 2 2 2 3 58 59 9 9 59 9 9 9 3 9 9 9 9 23 9 9 9 2 15 2 2 2 2 2 2 2 2 38 2 2 2 2 2 2 2 2 45 2 2 2 2 2 2 7 3 62 52 9 9 63 9 9 64 4 53 55 26 57 60 61 26 65 4 26 26 26 26 26 26 26 26 2 10 10 2 2 2 2 2 2 2 2 10 2 29 2 2 2 2 3 11 68 9 69 9 9 9 9 2 29 2 2 2 2 2 2 2 3 30 28 9 71 9 9 9 9 4 70 26 26 72 26 26 26 26 2 4 21 2 2 2 2 2 2 2 12 12 2 2 12 2 2 2 3 74 75 9 9 36 9 9 9 2 7 2 2 2 12 7 2 38 3 77 9 9 9 23 23 9 9 2 2 7 2 2 35 2 2 2 2 35 2 2 2 2 2 2 2 3 79 59 9 9 80 9 9 9 2 5 33 2 2 2 2 2 2 3 82 9 9 9 9 9 9 9 4 76 78 26 26 81 83 26 26 2 5 7 2 2 2 2 2 2 2 2 2 2 2 7 2 2 2 3 85 86 9 9 41 9 9 9 2 33 2 2 2 2 2 2 2 3 9 9 9 9 88 9 9 9 3 37 9 9 9 9 9 9 9 4 87 89 26 26 90 26 26 26 2 15 0 2 2 38 2 2 45 2 16 2 2 2 2 2 2 2 3 9 92 9 9 9 9 9 93 2 0 2 2 2 2 2 2 45 2 2 2 2 2 2 2 2 7 3 95 9 9 9 9 9 9 96 3 93 96 9 9 9 9 9 37 4 94 97 26 26 26 26 26 98 5 48 66 67 73 84 91 67 99 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-3.3-src/Rules/Worm-1040512.rule0000644000175000017500000001125112140624403013730 00000000000000@RULE Worm-1040512 Paterson's worms (by Dean Hickerson, 11/19/2008) Pattern #055 Sven Kahrkling's notation 1040512 Gardner's notation 1a2c3cbaa4b Finishes after 569804 steps, almost filling a regular hexagon. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1040512 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 0 = straight b,0,a0,n,a1,0,12,0,0,6 b,0,a0,0,a1,n,0,9,0,1 b,0,a0,0,a1,0,n,0,15,2 b,13,a0,0,a1,0,0,n,0,3 b,0,a0,10,a1,0,0,0,n,4 b,n,a0,0,a1,16,0,0,0,5 # 2 eaten(02): 4 = sharp left b,n,a0,0,a1,o,12,0,0,4 b,0,a0,n,a1,0,o,9,0,5 b,0,a0,0,a1,n,0,o,15,6 b,13,a0,0,a1,0,n,0,o,1 b,o,a0,10,a1,0,0,n,0,2 b,0,a0,o,a1,16,0,0,n,3 # 2 eaten(15): 0 = straight b,0,a0,o,a1,0,12,0,n,6 b,n,a0,0,a1,o,0,9,0,1 b,0,a0,n,a1,0,o,0,15,2 b,13,a0,0,a1,n,0,o,0,3 b,0,a0,10,a1,0,n,0,o,4 b,o,a0,0,a1,16,0,n,0,5 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(145): 2 = sharp right b,0,a0,n,a1,0,12,o,p,2 b,p,a0,0,a1,n,0,9,o,3 b,o,a0,p,a1,0,n,0,15,4 b,13,a0,o,a1,p,0,n,0,5 b,0,a0,10,a1,o,p,0,n,6 b,n,a0,0,a1,16,o,p,0,1 golly-3.3-src/Rules/TMGasMargolus_emulated.rule0000644000175000017500000002421712060231465016550 00000000000000@RULE TMGasMargolus_emulated @TREE num_states=9 num_neighbors=8 num_nodes=340 1 0 2 2 4 4 6 6 8 8 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 8 7 2 0 1 4 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 7 8 4 7 7 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 7 13 5 9 10 14 10 14 10 14 10 14 1 0 1 1 3 3 5 5 7 7 2 16 1 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 10 19 1 0 2 2 4 4 2 6 2 8 1 0 2 2 4 4 8 6 6 8 1 0 8 2 4 4 8 6 8 8 1 0 2 2 4 4 6 6 2 8 2 0 1 21 1 22 1 23 1 24 1 0 2 2 4 4 8 6 8 8 1 0 2 2 4 4 6 6 6 8 2 0 1 22 1 22 1 26 1 27 1 0 2 2 4 4 2 6 8 8 2 0 1 29 1 26 1 26 1 0 1 0 6 2 4 4 6 6 6 8 2 0 1 31 1 27 1 0 1 27 3 2 3 25 3 28 3 30 3 32 4 33 7 33 7 33 7 33 7 33 5 34 10 34 10 34 10 34 10 34 2 0 1 26 1 26 1 26 1 0 2 0 1 27 1 27 1 0 1 27 3 2 3 28 3 28 3 36 3 37 4 38 7 38 7 38 7 38 7 38 5 39 10 39 10 39 10 39 10 39 2 0 1 26 1 26 1 23 1 0 2 0 1 29 1 26 1 23 1 0 3 2 3 41 3 36 3 42 3 2 4 43 7 43 7 43 7 43 7 43 5 44 10 44 10 44 10 44 10 44 2 0 1 27 1 27 1 0 1 24 2 0 1 31 1 27 1 0 1 31 3 2 3 46 3 37 3 2 3 47 4 48 7 48 7 48 7 48 7 48 5 49 10 49 10 49 10 49 10 49 6 15 20 35 20 40 20 45 20 50 5 10 10 10 10 10 10 10 10 10 6 20 20 52 20 52 20 52 20 52 3 2 3 2 3 2 3 2 3 2 1 0 1 2 3 4 5 2 7 2 1 0 1 2 3 4 5 8 7 6 1 0 1 2 3 4 5 2 7 8 1 0 1 6 3 4 5 6 7 6 2 1 1 55 1 56 1 57 1 58 3 59 59 3 59 3 59 3 59 3 1 0 1 2 3 4 5 8 7 8 1 0 1 2 3 4 5 6 7 6 2 1 1 56 1 56 1 61 1 62 3 63 63 3 63 3 63 3 63 3 1 0 1 8 3 4 5 8 7 8 2 1 1 65 1 61 1 61 1 1 3 66 66 3 66 3 66 3 66 3 1 0 1 2 3 4 5 6 7 2 2 1 1 68 1 62 1 1 1 62 3 69 69 3 69 3 69 3 69 3 4 54 60 54 64 54 67 54 70 54 5 71 10 71 10 71 10 71 10 71 4 33 60 33 64 33 67 33 70 33 5 73 10 73 10 73 10 73 10 73 4 38 60 38 64 38 67 38 70 38 5 75 10 75 10 75 10 75 10 75 4 43 60 43 64 43 67 43 70 43 5 77 10 77 10 77 10 77 10 77 4 48 60 48 64 48 67 48 70 48 5 79 10 79 10 79 10 79 10 79 6 72 52 74 52 76 52 78 52 80 2 1 1 61 1 61 1 61 1 1 3 82 82 3 82 3 82 3 82 3 2 1 1 62 1 62 1 1 1 62 3 84 84 3 84 3 84 3 84 3 4 54 64 54 64 54 83 54 85 54 5 86 10 86 10 86 10 86 10 86 4 33 64 33 64 33 83 33 85 33 5 88 10 88 10 88 10 88 10 88 4 38 64 38 64 38 83 38 85 38 5 90 10 90 10 90 10 90 10 90 4 43 64 43 64 43 83 43 85 43 5 92 10 92 10 92 10 92 10 92 4 48 64 48 64 48 83 48 85 48 5 94 10 94 10 94 10 94 10 94 6 87 52 89 52 91 52 93 52 95 2 1 1 61 1 61 1 57 1 1 3 97 97 3 97 3 97 3 97 3 2 1 1 65 1 61 1 65 1 1 3 99 99 3 99 3 99 3 99 3 4 54 98 54 83 54 100 54 7 54 5 101 10 101 10 101 10 101 10 101 4 33 98 33 83 33 100 33 7 33 5 103 10 103 10 103 10 103 10 103 4 38 98 38 83 38 100 38 7 38 5 105 10 105 10 105 10 105 10 105 4 43 98 43 83 43 100 43 7 43 5 107 10 107 10 107 10 107 10 107 4 48 98 48 83 48 100 48 7 48 5 109 10 109 10 109 10 109 10 109 6 102 52 104 52 106 52 108 52 110 2 1 1 62 1 62 1 1 1 58 3 112 112 3 112 3 112 3 112 3 2 1 1 68 1 62 1 1 1 58 3 114 114 3 114 3 114 3 114 3 4 54 113 54 85 54 7 54 115 54 5 116 10 116 10 116 10 116 10 116 4 33 113 33 85 33 7 33 115 33 5 118 10 118 10 118 10 118 10 118 4 38 113 38 85 38 7 38 115 38 5 120 10 120 10 120 10 120 10 120 4 43 113 43 85 43 7 43 115 43 5 122 10 122 10 122 10 122 10 122 4 48 113 48 85 48 7 48 115 48 5 124 10 124 10 124 10 124 10 124 6 117 52 119 52 121 52 123 52 125 7 51 53 81 53 96 53 111 53 126 6 52 52 52 52 52 52 52 52 52 7 53 53 128 53 128 53 128 53 128 4 54 7 54 7 54 7 54 7 54 2 55 55 1 55 1 55 1 55 1 2 56 56 1 56 1 56 1 56 1 2 65 65 1 65 1 65 1 65 1 2 68 68 1 68 1 68 1 68 1 3 3 3 131 3 132 3 133 3 134 4 135 7 135 7 135 7 135 7 135 2 61 61 1 61 1 61 1 61 1 2 62 62 1 62 1 62 1 62 1 3 3 3 132 3 132 3 137 3 138 4 139 7 139 7 139 7 139 7 139 2 57 57 1 57 1 57 1 57 1 3 3 3 141 3 137 3 137 3 3 4 142 7 142 7 142 7 142 7 142 2 58 58 1 58 1 58 1 58 1 3 3 3 144 3 138 3 3 3 138 4 145 7 145 7 145 7 145 7 145 5 130 136 130 140 130 143 130 146 130 5 34 136 34 140 34 143 34 146 34 5 39 136 39 140 39 143 39 146 39 5 44 136 44 140 44 143 44 146 44 5 49 136 49 140 49 143 49 146 49 6 147 52 148 52 149 52 150 52 151 5 71 136 71 140 71 143 71 146 71 5 73 136 73 140 73 143 73 146 73 5 75 136 75 140 75 143 75 146 75 5 77 136 77 140 77 143 77 146 77 5 79 136 79 140 79 143 79 146 79 6 153 52 154 52 155 52 156 52 157 5 86 136 86 140 86 143 86 146 86 5 88 136 88 140 88 143 88 146 88 5 90 136 90 140 90 143 90 146 90 5 92 136 92 140 92 143 92 146 92 5 94 136 94 140 94 143 94 146 94 6 159 52 160 52 161 52 162 52 163 5 101 136 101 140 101 143 101 146 101 5 103 136 103 140 103 143 103 146 103 5 105 136 105 140 105 143 105 146 105 5 107 136 107 140 107 143 107 146 107 5 109 136 109 140 109 143 109 146 109 6 165 52 166 52 167 52 168 52 169 5 116 136 116 140 116 143 116 146 116 5 118 136 118 140 118 143 118 146 118 5 120 136 120 140 120 143 120 146 120 5 122 136 122 140 122 143 122 146 122 5 124 136 124 140 124 143 124 146 124 6 171 52 172 52 173 52 174 52 175 7 152 128 158 128 164 128 170 128 176 3 3 3 137 3 137 3 137 3 3 4 178 7 178 7 178 7 178 7 178 3 3 3 138 3 138 3 3 3 138 4 180 7 180 7 180 7 180 7 180 5 130 140 130 140 130 179 130 181 130 5 34 140 34 140 34 179 34 181 34 5 39 140 39 140 39 179 39 181 39 5 44 140 44 140 44 179 44 181 44 5 49 140 49 140 49 179 49 181 49 6 182 52 183 52 184 52 185 52 186 5 71 140 71 140 71 179 71 181 71 5 73 140 73 140 73 179 73 181 73 5 75 140 75 140 75 179 75 181 75 5 77 140 77 140 77 179 77 181 77 5 79 140 79 140 79 179 79 181 79 6 188 52 189 52 190 52 191 52 192 5 86 140 86 140 86 179 86 181 86 5 88 140 88 140 88 179 88 181 88 5 90 140 90 140 90 179 90 181 90 5 92 140 92 140 92 179 92 181 92 5 94 140 94 140 94 179 94 181 94 6 194 52 195 52 196 52 197 52 198 5 101 140 101 140 101 179 101 181 101 5 103 140 103 140 103 179 103 181 103 5 105 140 105 140 105 179 105 181 105 5 107 140 107 140 107 179 107 181 107 5 109 140 109 140 109 179 109 181 109 6 200 52 201 52 202 52 203 52 204 5 116 140 116 140 116 179 116 181 116 5 118 140 118 140 118 179 118 181 118 5 120 140 120 140 120 179 120 181 120 5 122 140 122 140 122 179 122 181 122 5 124 140 124 140 124 179 124 181 124 6 206 52 207 52 208 52 209 52 210 7 187 128 193 128 199 128 205 128 211 3 3 3 137 3 137 3 133 3 3 4 213 7 213 7 213 7 213 7 213 3 3 3 141 3 137 3 133 3 3 4 215 7 215 7 215 7 215 7 215 5 130 214 130 179 130 216 130 10 130 5 34 214 34 179 34 216 34 10 34 5 39 214 39 179 39 216 39 10 39 5 44 214 44 179 44 216 44 10 44 5 49 214 49 179 49 216 49 10 49 6 217 52 218 52 219 52 220 52 221 5 71 214 71 179 71 216 71 10 71 5 73 214 73 179 73 216 73 10 73 5 75 214 75 179 75 216 75 10 75 5 77 214 77 179 77 216 77 10 77 5 79 214 79 179 79 216 79 10 79 6 223 52 224 52 225 52 226 52 227 5 86 214 86 179 86 216 86 10 86 5 88 214 88 179 88 216 88 10 88 5 90 214 90 179 90 216 90 10 90 5 92 214 92 179 92 216 92 10 92 5 94 214 94 179 94 216 94 10 94 6 229 52 230 52 231 52 232 52 233 5 101 214 101 179 101 216 101 10 101 5 103 214 103 179 103 216 103 10 103 5 105 214 105 179 105 216 105 10 105 5 107 214 107 179 107 216 107 10 107 5 109 214 109 179 109 216 109 10 109 6 235 52 236 52 237 52 238 52 239 5 116 214 116 179 116 216 116 10 116 5 118 214 118 179 118 216 118 10 118 5 120 214 120 179 120 216 120 10 120 5 122 214 122 179 122 216 122 10 122 5 124 214 124 179 124 216 124 10 124 6 241 52 242 52 243 52 244 52 245 7 222 128 228 128 234 128 240 128 246 3 3 3 138 3 138 3 3 3 134 4 248 7 248 7 248 7 248 7 248 3 3 3 144 3 138 3 3 3 144 4 250 7 250 7 250 7 250 7 250 5 130 249 130 181 130 10 130 251 130 5 34 249 34 181 34 10 34 251 34 5 39 249 39 181 39 10 39 251 39 5 44 249 44 181 44 10 44 251 44 5 49 249 49 181 49 10 49 251 49 6 252 52 253 52 254 52 255 52 256 5 71 249 71 181 71 10 71 251 71 5 73 249 73 181 73 10 73 251 73 5 75 249 75 181 75 10 75 251 75 5 77 249 77 181 77 10 77 251 77 5 79 249 79 181 79 10 79 251 79 6 258 52 259 52 260 52 261 52 262 5 86 249 86 181 86 10 86 251 86 5 88 249 88 181 88 10 88 251 88 5 90 249 90 181 90 10 90 251 90 5 92 249 92 181 92 10 92 251 92 5 94 249 94 181 94 10 94 251 94 6 264 52 265 52 266 52 267 52 268 5 101 249 101 181 101 10 101 251 101 5 103 249 103 181 103 10 103 251 103 5 105 249 105 181 105 10 105 251 105 5 107 249 107 181 107 10 107 251 107 5 109 249 109 181 109 10 109 251 109 6 270 52 271 52 272 52 273 52 274 5 116 249 116 181 116 10 116 251 116 5 118 249 118 181 118 10 118 251 118 5 120 249 120 181 120 10 120 251 120 5 122 249 122 181 122 10 122 251 122 5 124 249 124 181 124 10 124 251 124 6 276 52 277 52 278 52 279 52 280 7 257 128 263 128 269 128 275 128 281 8 127 129 177 129 212 129 247 129 282 1 0 1 1 3 3 5 1 7 1 2 284 1 284 1 284 1 284 1 284 3 285 3 285 3 285 3 285 3 285 1 0 1 1 3 3 5 7 7 5 2 287 1 287 1 287 1 287 1 287 3 288 3 288 3 288 3 288 3 288 1 0 1 1 3 3 5 1 7 7 2 290 1 290 1 290 1 290 1 290 3 291 3 291 3 291 3 291 3 291 1 0 1 5 3 3 5 5 7 5 2 293 1 293 1 293 1 293 1 293 3 294 3 294 3 294 3 294 3 294 4 18 7 286 7 289 7 292 7 295 1 0 1 1 3 3 5 7 7 7 2 297 1 297 1 297 1 297 1 297 3 298 3 298 3 298 3 298 3 298 1 0 1 1 3 3 5 5 7 5 2 300 1 300 1 300 1 300 1 300 3 301 3 301 3 301 3 301 3 301 4 18 7 289 7 289 7 299 7 302 1 0 1 7 3 3 5 7 7 7 2 304 1 304 1 304 1 304 1 304 3 305 3 305 3 305 3 305 3 305 4 18 7 306 7 299 7 299 7 18 1 0 1 1 3 3 5 5 7 1 2 308 1 308 1 308 1 308 1 308 3 309 3 309 3 309 3 309 3 309 4 18 7 310 7 302 7 18 7 302 5 19 10 296 10 303 10 307 10 311 6 312 312 52 312 52 312 52 312 52 7 313 313 128 313 128 313 128 313 128 7 128 128 128 128 128 128 128 128 128 8 314 314 315 314 315 314 315 314 315 5 130 10 130 10 130 10 130 10 130 6 317 52 35 52 40 52 45 52 50 7 318 128 81 128 96 128 111 128 126 8 319 315 177 315 212 315 247 315 282 4 18 7 299 7 299 7 299 7 18 4 18 7 302 7 302 7 18 7 302 5 19 10 303 10 303 10 321 10 322 6 323 323 52 323 52 323 52 323 52 7 324 324 128 324 128 324 128 324 128 8 325 325 315 325 315 325 315 325 315 4 18 7 299 7 299 7 292 7 18 4 18 7 306 7 299 7 306 7 18 5 19 10 327 10 321 10 328 10 19 6 329 329 52 329 52 329 52 329 52 7 330 330 128 330 128 330 128 330 128 8 331 331 315 331 315 331 315 331 315 4 18 7 302 7 302 7 18 7 295 4 18 7 310 7 302 7 18 7 295 5 19 10 333 10 322 10 19 10 334 6 335 335 52 335 52 335 52 335 52 7 336 336 128 336 128 336 128 336 128 8 337 337 315 337 315 337 315 337 315 9 283 316 320 326 320 332 320 338 320 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 5 255 255 255 6 220 220 220 7 255 255 0 8 220 220 0 golly-3.3-src/Rules/Banks-III.rule0000644000175000017500000000153312124663564013657 00000000000000@RULE Banks-III Edwin Roger Banks, PhD Thesis 1971 Two-state, nine-neighbor CA for a universal computer (Appendix III) NOTE: The rules listed in the thesis start at the corner, not at N,S,E or W. We have converted them to Golly's format. http://www.bottomlayer.com/bottom/banks/banks_commentary.htm @TABLE # Format: C,N,NE,E,SE,S,SW,W,NW,C' n_states:2 neighborhood:Moore symmetries:rotate4reflect # transitions for signal propagation: 1111111010 1011000010 0111010111 0101000111 # transitions for echo: 0010000011 0111010011 0111110011 1101010100 1011000010 1010000010 0101010111 1100000010 0111110001 1110100010 0101000001 0101010001 1011010010 0101010011 # transitions for junction properties: 0111111111 0111111101 1010011010 1011001010 0101010111 1110110010 1111101011 0101010111 1100011010 1101101010 1010100010 0110110111 0111011011 0110111011 golly-3.3-src/Rules/Sand-Margolus-emulated.rule0000644000175000017500000000622612060231465016455 00000000000000@RULE Sand-Margolus-emulated @TREE num_states=9 num_neighbors=8 num_nodes=113 1 0 2 2 4 4 6 6 8 8 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 8 7 2 0 1 4 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 7 8 4 7 7 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 7 13 5 9 10 14 10 14 10 14 10 14 1 0 1 1 3 3 5 5 7 7 2 16 1 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 10 19 1 0 2 2 2 4 6 6 8 8 2 0 1 21 1 21 1 21 1 21 2 0 1 21 1 0 1 0 1 0 3 2 3 22 3 23 3 23 3 23 4 24 7 24 7 24 7 24 7 24 5 25 10 25 10 25 10 25 10 25 3 2 3 23 3 23 3 23 3 23 4 27 7 27 7 27 7 27 7 27 5 28 10 28 10 28 10 28 10 28 6 15 20 26 20 29 20 29 20 29 5 10 10 10 10 10 10 10 10 10 6 20 20 31 20 31 20 31 20 31 3 2 3 2 3 2 3 2 3 2 1 0 1 2 3 2 5 6 7 8 2 1 1 34 1 34 1 34 1 34 3 35 35 3 35 3 35 3 35 3 2 1 1 34 1 1 1 1 1 1 3 37 37 3 37 3 37 3 37 3 4 33 36 33 38 33 38 33 38 33 5 39 10 39 10 39 10 39 10 39 4 24 36 24 38 24 38 24 38 24 5 41 10 41 10 41 10 41 10 41 4 27 36 27 38 27 38 27 38 27 5 43 10 43 10 43 10 43 10 43 6 40 31 42 31 44 31 44 31 44 4 33 38 33 38 33 38 33 38 33 5 46 10 46 10 46 10 46 10 46 4 24 38 24 38 24 38 24 38 24 5 48 10 48 10 48 10 48 10 48 4 27 38 27 38 27 38 27 38 27 5 50 10 50 10 50 10 50 10 50 6 47 31 49 31 51 31 51 31 51 7 30 32 45 32 52 32 52 32 52 6 31 31 31 31 31 31 31 31 31 7 32 32 54 32 54 32 54 32 54 4 33 7 33 7 33 7 33 7 33 1 0 1 4 3 4 5 6 7 8 2 57 57 1 57 1 57 1 57 1 3 3 3 58 3 58 3 58 3 58 4 59 7 59 7 59 7 59 7 59 5 56 10 56 60 56 10 56 60 56 5 25 10 25 60 25 10 25 60 25 5 28 10 28 60 28 10 28 60 28 6 61 31 62 31 63 31 63 31 63 5 39 10 39 60 39 10 39 60 39 5 41 10 41 60 41 10 41 60 41 5 43 10 43 60 43 10 43 60 43 6 65 31 66 31 67 31 67 31 67 5 46 10 46 60 46 10 46 60 46 5 48 10 48 60 48 10 48 60 48 5 50 10 50 60 50 10 50 60 50 6 69 31 70 31 71 31 71 31 71 7 64 54 68 54 72 54 72 54 72 3 3 3 3 3 58 3 58 3 58 4 74 7 74 7 74 7 74 7 74 5 56 75 56 60 56 10 56 75 56 5 25 75 25 60 25 10 25 75 25 5 28 75 28 60 28 10 28 75 28 6 76 31 77 31 78 31 78 31 78 5 39 75 39 60 39 10 39 75 39 5 41 75 41 60 41 10 41 75 41 5 43 75 43 60 43 10 43 75 43 6 80 31 81 31 82 31 82 31 82 5 46 75 46 60 46 10 46 75 46 5 48 75 48 60 48 10 48 75 48 5 50 75 50 60 50 10 50 75 50 6 84 31 85 31 86 31 86 31 86 7 79 54 83 54 87 54 87 54 87 8 53 55 73 55 88 55 73 55 73 1 0 1 3 3 3 5 5 7 7 2 90 1 90 1 90 1 90 1 90 3 91 3 91 3 91 3 91 3 91 4 18 7 92 7 92 7 92 7 92 5 19 10 19 10 93 10 19 10 93 6 94 94 31 94 31 94 31 94 31 7 95 95 54 95 54 95 54 95 54 7 54 54 54 54 54 54 54 54 54 8 96 96 97 96 97 96 97 96 97 5 56 10 56 10 56 10 56 10 56 6 99 31 26 31 29 31 29 31 29 7 100 54 45 54 52 54 52 54 52 8 101 97 73 97 88 97 73 97 73 4 18 7 18 7 92 7 92 7 92 5 19 10 103 10 93 10 19 10 103 6 104 104 31 104 31 104 31 104 31 7 105 105 54 105 54 105 54 105 54 8 106 106 97 106 97 106 97 106 97 5 19 10 19 10 93 10 19 10 103 6 108 108 31 108 31 108 31 108 31 7 109 109 54 109 54 109 54 109 54 8 110 110 97 110 97 110 97 110 97 9 89 98 102 107 102 98 102 111 102 @COLORS 1 90 90 90 2 62 62 62 3 255 255 0 4 220 220 0 5 120 100 0 6 100 80 0 7 148 148 148 8 103 103 103 golly-3.3-src/Rules/Langtons-Loops.rule0000644000175000017500000001574612124663564015103 00000000000000@RULE Langtons-Loops C.G.Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" @TABLE # rules: 219 # format: CNESWC' n_states:8 neighborhood:vonNeumann symmetries:rotate4 000000 000012 000020 000030 000050 000063 000071 000112 000122 000132 000212 000220 000230 000262 000272 000320 000525 000622 000722 001022 001120 002020 002030 002050 002125 002220 002322 005222 012321 012421 012525 012621 012721 012751 014221 014321 014421 014721 016251 017221 017255 017521 017621 017721 025271 100011 100061 100077 100111 100121 100211 100244 100277 100511 101011 101111 101244 101277 102026 102121 102211 102244 102263 102277 102327 102424 102626 102644 102677 102710 102727 105427 111121 111221 111244 111251 111261 111277 111522 112121 112221 112244 112251 112277 112321 112424 112621 112727 113221 122244 122277 122434 122547 123244 123277 124255 124267 125275 200012 200022 200042 200071 200122 200152 200212 200222 200232 200242 200250 200262 200272 200326 200423 200517 200522 200575 200722 201022 201122 201222 201422 201722 202022 202032 202052 202073 202122 202152 202212 202222 202272 202321 202422 202452 202520 202552 202622 202722 203122 203216 203226 203422 204222 205122 205212 205222 205521 205725 206222 206722 207122 207222 207422 207722 211222 211261 212222 212242 212262 212272 214222 215222 216222 217222 222272 222442 222462 222762 222772 300013 300022 300041 300076 300123 300421 300622 301021 301220 302511 401120 401220 401250 402120 402221 402326 402520 403221 500022 500215 500225 500232 500272 500520 502022 502122 502152 502220 502244 502722 512122 512220 512422 512722 600011 600021 602120 612125 612131 612225 700077 701120 701220 701250 702120 702221 702251 702321 702525 702720 @TREE num_states=8 num_neighbors=4 num_nodes=222 1 0 1 2 3 4 5 6 7 1 2 1 2 3 4 5 1 7 1 0 1 2 2 4 2 1 7 1 0 1 2 1 4 5 6 7 1 3 1 2 3 4 5 6 7 1 1 7 1 6 4 5 6 7 2 0 1 2 0 3 0 4 5 1 2 1 2 3 4 5 6 7 2 1 7 7 7 0 0 0 0 1 0 1 2 3 4 2 6 7 1 0 4 2 3 4 5 6 7 1 0 1 0 3 4 5 6 7 1 2 7 2 3 4 2 6 7 2 2 7 0 9 10 11 7 12 1 0 1 6 3 4 5 6 7 2 0 0 14 0 0 0 0 0 1 0 1 3 1 4 5 6 7 2 3 0 16 0 0 0 0 0 1 0 1 7 3 4 5 6 7 1 5 1 2 3 4 0 6 7 1 0 1 5 3 4 5 6 7 2 0 18 19 0 0 0 0 20 1 2 1 2 2 4 5 6 7 2 4 0 22 0 0 0 0 0 2 5 0 7 0 0 0 0 0 3 6 8 13 15 17 21 23 24 2 1 7 7 0 0 18 0 0 2 0 0 0 0 0 0 0 0 1 2 1 2 1 4 5 6 7 1 0 0 2 3 4 5 6 7 2 28 0 0 0 0 3 0 29 3 26 27 30 15 27 27 27 27 2 2 7 0 14 16 19 22 7 1 0 1 2 3 0 5 6 0 1 0 1 2 0 0 5 6 0 2 28 33 34 0 0 0 0 0 1 0 6 2 3 4 2 6 7 1 5 1 2 3 0 2 0 0 1 0 1 2 3 1 0 6 1 1 2 7 1 3 6 5 6 1 1 0 1 0 3 0 5 6 5 1 0 6 2 3 4 5 6 7 1 0 7 2 3 4 2 6 0 2 36 37 38 39 10 40 41 42 1 0 1 6 3 1 5 6 7 2 0 0 44 0 0 0 0 0 1 0 7 2 3 4 5 6 7 1 0 1 1 3 4 5 6 7 2 0 0 7 0 46 47 0 20 1 0 1 3 3 4 5 6 7 2 49 0 0 0 0 0 0 0 3 32 35 43 45 27 48 27 50 2 0 7 9 0 0 0 0 0 3 52 27 27 27 27 27 27 27 2 3 0 10 0 0 0 0 0 2 0 0 10 0 0 0 0 0 1 0 4 2 3 4 4 6 7 2 0 0 56 0 0 0 10 0 3 54 55 57 27 27 27 27 27 2 0 0 11 0 0 0 0 0 2 0 0 33 0 0 0 0 0 1 0 1 2 3 4 5 6 1 2 0 9 61 0 0 0 0 0 3 59 60 62 27 27 27 27 27 2 4 0 7 0 0 0 0 0 1 0 3 2 3 4 5 6 7 2 0 0 65 0 0 0 0 0 3 64 27 66 27 27 27 27 27 2 5 0 12 0 0 20 0 0 2 0 0 46 0 0 0 0 0 2 49 0 46 0 0 0 46 0 3 68 69 70 27 27 27 27 27 4 25 31 51 53 58 63 67 71 2 1 0 28 0 0 0 0 0 2 7 0 33 0 0 0 0 0 2 7 0 34 0 10 33 0 46 2 7 0 0 0 0 0 0 0 3 73 74 75 76 27 27 27 27 2 33 0 0 0 10 0 47 46 1 0 2 2 3 4 5 6 7 2 0 0 79 0 0 0 0 0 3 76 27 78 27 27 80 27 27 2 7 0 0 14 0 0 0 0 2 0 0 0 0 0 79 0 0 1 0 1 2 3 4 2 5 7 1 0 1 2 3 4 0 5 7 1 1 1 2 3 4 5 6 7 1 1 4 2 3 4 2 6 7 1 5 1 2 3 4 5 6 7 1 1 7 2 3 4 2 6 7 2 37 84 85 86 87 88 86 89 1 0 1 2 3 4 5 1 7 2 0 91 0 0 0 0 0 0 2 0 0 86 86 86 0 0 86 2 9 0 0 0 0 0 0 0 2 0 0 86 0 0 86 86 86 3 82 83 90 92 93 94 27 95 3 27 27 92 27 27 27 27 27 3 27 55 55 27 27 27 27 27 2 18 0 3 0 0 0 0 0 2 0 0 0 0 0 0 0 86 2 0 0 86 0 0 0 0 0 2 0 0 88 0 0 0 0 0 3 99 27 100 27 27 27 101 102 2 0 0 47 0 0 0 0 0 3 27 104 27 27 27 27 27 27 2 0 0 29 0 0 0 0 0 3 106 69 69 27 27 27 27 27 4 77 81 96 97 98 103 105 107 2 2 28 36 0 0 0 0 49 2 7 0 37 0 0 9 0 0 2 0 0 38 0 56 61 65 46 2 9 0 39 0 0 0 0 0 2 10 0 10 0 0 0 0 0 2 11 3 40 0 0 0 0 0 2 7 0 41 0 10 0 0 46 2 12 29 42 0 0 0 0 0 3 109 110 111 112 113 114 115 116 2 7 33 37 0 0 0 0 0 2 0 0 84 91 0 0 0 0 2 34 0 85 0 10 0 0 46 2 10 10 87 0 0 0 0 0 2 33 0 88 0 0 0 0 0 2 0 47 86 0 0 0 0 0 2 46 46 89 0 0 86 0 0 3 118 119 120 101 121 122 123 124 2 0 34 38 44 0 7 0 0 2 0 0 85 0 86 0 0 86 2 38 85 0 0 10 0 0 46 2 56 10 10 10 0 0 0 0 2 61 0 0 0 46 0 0 0 2 65 0 0 0 0 0 0 0 2 46 46 46 0 0 0 0 0 3 126 127 128 27 129 130 131 132 2 14 0 39 0 0 0 0 0 2 14 0 86 0 86 0 0 0 2 44 0 0 0 10 0 0 0 3 134 135 136 27 55 27 27 69 2 16 0 10 0 0 46 0 0 2 0 0 87 0 86 0 0 0 2 0 86 10 0 0 46 0 0 1 0 5 2 3 4 5 6 7 2 0 0 141 0 0 0 0 0 3 138 139 140 55 27 142 69 27 2 19 0 40 0 0 47 0 0 2 0 79 88 0 0 0 0 86 1 1 5 2 3 4 5 6 7 2 0 0 146 0 0 0 0 0 3 144 145 76 27 142 27 27 147 2 22 0 41 0 0 0 0 0 2 0 0 86 0 0 0 0 86 2 0 86 0 0 0 0 0 0 3 149 150 27 27 69 151 27 27 2 7 0 42 0 0 20 0 0 2 0 0 89 0 86 0 0 86 2 0 86 46 0 0 0 0 0 2 0 88 146 0 0 0 0 0 3 153 154 155 69 27 156 27 27 4 117 125 133 137 143 148 152 157 2 14 14 44 0 0 0 0 0 3 27 27 159 27 27 27 27 27 2 0 0 91 0 0 0 0 0 3 76 161 27 27 27 27 27 27 2 39 86 0 0 10 0 0 46 3 94 27 163 27 27 27 27 27 3 27 27 27 27 27 27 27 27 2 0 86 10 0 0 0 0 0 3 27 27 166 27 27 27 27 27 4 160 162 164 165 167 165 165 165 2 3 0 0 0 0 0 0 0 2 16 0 0 0 0 0 0 0 3 169 27 170 27 27 27 27 27 3 27 27 101 101 101 27 27 101 2 10 10 56 0 0 0 0 0 2 0 10 10 0 0 0 0 0 2 10 87 10 10 0 141 46 0 3 173 174 175 55 27 27 27 27 3 27 27 151 27 27 27 27 27 2 46 0 46 0 0 0 0 0 3 27 27 178 27 27 27 27 27 3 55 27 27 27 27 27 27 27 4 171 172 176 165 177 179 180 165 2 18 0 0 0 0 0 0 0 2 19 0 7 0 0 0 0 0 2 20 0 20 0 0 0 0 0 3 27 182 183 27 69 104 27 184 2 0 0 9 0 0 0 0 0 2 0 79 0 0 0 0 0 0 3 186 27 187 27 27 27 27 27 2 11 33 61 0 0 0 0 0 2 3 0 0 0 0 0 86 88 2 40 88 0 0 141 0 0 146 3 189 190 191 27 69 27 27 27 2 47 0 0 0 0 0 0 0 3 27 27 193 27 27 27 27 27 3 27 101 151 27 27 27 27 27 4 185 188 192 165 165 194 165 195 2 4 0 0 0 0 0 0 0 2 22 0 0 0 0 0 0 0 3 197 27 198 27 27 27 27 27 2 0 0 0 0 0 86 0 0 3 27 27 200 27 27 27 27 27 2 7 0 65 0 0 0 0 0 2 0 47 0 0 0 0 0 0 2 41 86 0 0 46 0 0 0 2 10 0 0 0 0 0 0 0 2 46 0 0 0 0 0 0 0 3 202 203 204 27 205 27 27 206 4 199 201 207 165 165 165 165 177 2 5 0 49 0 0 0 0 0 3 209 27 76 27 27 27 27 27 2 0 0 86 0 0 88 0 0 3 27 27 211 27 27 101 101 101 2 12 46 46 0 0 0 0 0 2 29 46 46 0 0 0 0 0 2 42 89 46 46 0 146 0 0 3 213 214 215 27 27 151 27 27 2 20 0 0 0 0 0 0 0 3 217 27 217 27 27 27 27 27 3 69 27 27 27 27 27 27 27 4 210 212 216 165 177 218 219 177 5 72 108 158 168 181 196 208 220 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 golly-3.3-src/Rules/Evoloop.rule0000644000175000017500000003760712124663564013647 00000000000000@RULE Evoloop Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" Note that the transition table given in the above link is incomplete, and is patched by the function set_undefined_rule(). The table below has these changes incorporated, and was produced automatically by a bottom-up merging procedure from the full 9^5 rule table. See Rules/TableGenerators/make_ruletable.cpp @TABLE # rules: 132 # variables: 123 # format: C,N,E,S,W,C' # # Variables are bound within each transition. # For example, if a={1,2} then 4,a,0->a represents # two transitions: 4,1,0->1 and 4,2,0->2 n_states:9 neighborhood:vonNeumann symmetries:rotate4 var a={0,2,5} var b={0,1,2,3,4,5,6,7} var c={0,1,2,3,4,5,6,7} var d={1,4,6,7} var e={1,4} var f={0,1} var g={0,1,2,3,4,5,6,7,8} var h={0,1,2,3,4,5,6,7,8} var i={2,3,4,5,6,7} var j={0,2,3,5} var k={0,2,3,4,5,6,7} var l={4,6,7} var m={2,5} var n={0,1,8} var o={0,3,5} var p={2,3,5} var q={3,5} var r={2,4,6,7} var s={0,1} var t={0,1} var u={0,1,2,3,4,7} var v={5,6} var w={1,6,7} var x={0,3,5} var y={0,3,5} var z={1,3,5} var A={0,1,3,5} var B={0,1,3,5} var C={1,3,5} var D={1,3,5} var E={0,1,2,3,4,5} var F={0,1,2,4,5} var G={1,2,4} var H={0,1,3,4,5,6} var I={0,1,2,3,4,5,6} var J={1,2,4,6} var K={0,1,2,4,5,6,7} var L={0,1,2,3,4,5,7} var M={1,2,4,6,7} var N={0,3} var O={0,1,2,3,5} var P={0,1,2,3,4} var Q={0,2,3,5,6} var R={0,1,3,4,5,6,7} var S={1,3} var T={1,2,3,5} var U={0,1,3,4,5} var V={0,1,4,5,6} var W={1,4,6} var X={2,3,5} var Y={0,5} var Z={1,2} var aa={0,1,5} var ab={0,2} var ac={2,3,4,5} var ad={2,3,4,5,6} var ae={0,3} var af={0,3} var ag={3,7} var ah={2,8} var ai={0,2,8} var aj={0,8} var ak={0,2,8} var al={6,8} var am={0,1,4,5,6,7} var an={0,1,4,5,6,7} var ao={1,4,6,7} var ap={1,3,4,5,6,7} var aq={2,3,5,8} var ar={0,1,2,3,4,5,6,7,8} var as={0,1,4,6,7} var at={1,5,6} var au={4,7} var av={1,3,4,5,7} var aw={0,4,5,7} var ax={1,4,5,6,7} var ay={0,4,5,7} var az={1,4,5,6,7} var aA={0,1,3,5,6,7} var aB={1,2,3,4,5,7} var aC={0,1,4,7} var aD={2,4,6,7,8} var aE={3,5,6} var aF={2,3,5,6} var aG={2,3,5,6} var aH={2,3} var aI={0,1,3,4,7} var aJ={2,5,6,7} var aK={1,2,3,4,6,7} var aL={1,3,4,7} var aM={0,2,3} var aN={1,2,4,7} var aO={3,6} var aP={1,2,3,4,7} var aQ={3,4,7} var aR={1,2,3,4,5,6,7} var aS={3,4,6,7,8} var aT={0,3,6} var aU={3,4,5,7} var aV={2,3,6} var aW={1,2,3,4,5,6,7} var aX={0,8} var aY={0,8} var aZ={4,5,6,7} var ba={4,6,7,8} var bb={1,2,4,6,7} var bc={4,5} var bd={4,7,8} var be={0,1,4,5,7} var bf={4,5,7} var bg={1,2,4,5,7} var bh={1,2,4,5,7} var bi={0,1,2,3,4,6,7} var bj={2,5,6} var bk={1,3,4,6,7} var bl={0,4,6,7} var bm={6,7,8} var bn={1,3,4,5,6,7} var bo={1,4,7} var bp={2,3,5,6} var bq={2,3,5,6} var br={0,1,2,3,4,5,6,7} var bs={0,1,2,3,4,5,6,7} 0,a,0,0,1,2 0,0,0,0,4,3 0,b,c,1,d,1 0,0,0,2,e,2 f,g,h,i,8,8 0,j,k,l,1,1 0,0,0,4,m,2 0,0,0,7,5,2 f,b,n,8,i,8 0,o,1,j,d,1 0,0,1,0,2,2 0,o,1,2,p,1 0,j,1,q,r,1 f,s,i,t,8,8 0,u,2,1,p,1 0,0,r,p,1,1 0,0,2,3,2,2 0,0,q,1,2,1 0,o,q,2,1,1 0,1,2,v,2,6 w,o,x,y,k,8 z,A,B,C,D,8 1,E,F,G,4,4 1,H,I,J,6,6 1,K,L,M,7,7 1,N,A,j,p,8 1,O,P,4,G,4 1,Q,I,6,J,6 1,b,R,7,M,7 1,N,S,f,T,8 1,O,e,o,4,4 1,U,J,o,6,6 1,V,M,I,7,7 1,I,W,7,3,7 1,o,2,N,4,4 S,j,p,O,5,8 C,j,p,2,X,8 1,0,2,3,2,4 1,f,2,5,2,7 1,f,2,5,4,3 1,f,2,7,3,5 1,Y,3,Z,4,4 C,aa,q,ab,D,8 1,o,5,4,Z,4 1,f,6,2,4,4 1,o,7,3,M,7 C,f,2,X,q,8 1,e,ac,6,2,6 C,f,A,5,ab,8 1,1,4,3,3,4 1,X,2,5,4,4 1,ad,2,7,3,7 1,2,4,3,3,3 1,2,6,2,7,6 X,0,0,0,0,8 2,N,ae,af,ag,1 ah,ai,aj,ak,al,0 X,am,an,d,ao,8 2,b,R,ap,3,1 aq,g,h,ar,8,0 2,as,ab,3,ap,1 2,0,0,3,2,4 2,0,0,4,2,3 X,am,an,v,at,8 2,ab,0,5,au,5 2,0,0,8,av,0 X,aw,ax,ay,az,8 2,aA,ap,ab,3,1 2,0,aB,0,8,0 2,aC,2,0,6,5 2,0,2,0,7,3 2,am,2,ax,3,1 2,aC,2,3,2,3 2,0,2,5,2,5 aD,0,2,6,Y,0 2,0,3,2,ax,1 2,ab,3,aE,2,1 2,2,aF,aG,3,1 2,2,3,4,5,1 3,0,0,0,aH,2 3,R,k,b,v,8 3,0,0,0,7,4 3,aI,R,aJ,aK,8 3,0,0,3,2,2 3,u,U,aL,ao,8 3,0,0,4,2,1 3,aM,b,aN,aO,8 3,0,1,0,2,1 3,f,aP,s,aQ,8 q,R,ax,aR,aK,8 aS,0,1,2,5,0 3,0,2,aT,2,8 3,aC,2,5,2,1 3,0,3,3,2,1 aU,ap,aR,aV,aW,8 4,aj,aX,aY,ai,1 aZ,o,x,y,ap,8 ba,0,am,M,bb,0 l,ar,g,h,8,1 4,o,x,2,q,8 bc,0,o,q,2,8 4,0,0,8,ap,1 ba,0,ao,o,M,0 4,0,ap,0,8,1 ba,0,M,bb,ap,0 bd,0,2,be,M,0 4,0,2,0,q,8 ba,0,2,C,ao,0 4,0,2,aH,2,1 au,0,2,6,2,6 ba,0,3,ao,M,0 ba,0,3,2,ao,0 4,0,3,2,2,1 bf,bg,bh,aR,aW,8 5,b,bi,aF,bj,8 5,0,0,2,3,2 5,aI,bk,bl,bi,8 5,0,1,2,1,8 5,0,2,0,m,2 5,0,2,1,5,2 5,0,2,au,5,8 5,0,3,1,2,0 6,0,2,aC,2,2 al,0,2,aF,2,0 bm,0,3,2,2,0 6,ap,bn,aR,aW,8 6,ap,2,bn,2,8 al,bo,2,2,2,0 6,aF,aG,bp,bq,8 7,0,2,2,2,1 7,0,2,3,2,0 8,b,c,br,bs,0 @TREE num_states=9 num_neighbors=4 num_nodes=377 1 0 8 8 8 1 8 8 8 0 1 2 1 2 3 8 8 8 8 0 1 0 8 2 2 1 5 8 8 0 1 0 8 1 2 8 8 8 8 0 1 3 8 2 3 8 8 8 8 0 1 0 8 2 8 8 8 8 8 0 1 0 8 0 8 8 8 8 8 0 1 0 8 1 4 8 8 8 8 0 1 0 1 0 0 1 0 1 1 0 2 0 1 2 3 4 5 6 7 8 1 1 8 8 8 0 8 0 0 0 1 2 1 2 3 0 5 0 0 0 1 0 8 1 8 8 8 8 8 0 1 1 4 8 8 0 8 0 0 0 1 2 8 2 8 8 8 8 8 0 1 1 6 8 8 0 8 0 0 0 1 1 7 8 8 0 8 0 0 0 2 1 10 11 12 13 14 15 16 8 1 2 1 2 8 0 5 0 0 0 1 0 8 2 8 0 8 0 0 0 1 0 8 2 8 8 2 8 8 0 1 2 4 2 8 0 5 0 0 0 1 0 6 0 8 0 8 0 0 0 1 0 7 2 8 0 5 0 0 0 1 8 8 0 0 1 0 1 1 0 2 2 18 19 20 21 5 22 23 24 1 0 8 4 2 8 8 8 8 0 2 3 12 26 12 12 12 12 12 24 1 2 4 3 1 0 5 0 0 0 1 0 4 8 8 0 8 0 0 0 1 0 6 8 8 0 8 0 0 0 1 0 7 8 8 0 8 0 0 0 2 4 13 28 12 29 14 30 31 24 1 0 8 8 8 8 8 8 8 0 1 0 8 5 8 8 8 8 8 0 2 5 33 5 12 34 33 33 34 24 2 6 15 22 12 30 33 30 31 24 2 7 16 23 12 31 14 31 31 24 2 8 8 24 24 24 24 24 24 8 3 9 17 25 27 32 35 36 37 38 2 1 10 18 12 13 33 15 16 8 1 1 1 2 8 0 8 0 0 0 1 1 8 1 8 0 8 0 0 0 2 10 10 41 42 13 10 15 16 8 1 2 8 2 1 0 8 0 0 0 1 1 4 2 8 0 8 0 0 0 1 1 6 2 8 0 8 0 0 0 1 1 7 2 8 0 8 0 0 0 2 44 41 41 42 45 41 46 47 24 1 1 4 1 8 0 8 0 0 0 1 1 6 1 8 0 8 0 0 0 1 1 7 1 8 0 8 0 0 0 2 12 42 42 12 49 12 50 51 24 2 13 13 45 49 13 13 15 16 24 1 1 8 2 8 0 8 0 0 0 2 33 10 54 12 13 33 15 16 24 2 15 15 41 50 15 15 15 16 24 2 16 16 47 51 16 16 16 16 24 3 40 43 48 52 53 55 56 57 38 2 2 11 19 26 28 5 22 23 24 2 44 54 54 42 45 54 46 47 24 1 0 1 2 8 0 2 2 0 0 1 1 1 2 3 0 5 2 0 0 1 0 8 2 8 1 8 0 1 0 1 2 4 3 8 1 8 0 0 0 1 0 4 2 3 0 5 2 0 0 1 0 7 5 1 0 8 0 0 0 1 0 6 0 8 6 8 0 6 0 1 0 7 2 3 0 5 2 0 0 2 61 62 63 64 65 66 67 68 24 1 1 8 2 8 0 0 0 0 0 1 0 8 2 8 1 8 0 0 0 1 0 8 1 1 8 8 8 8 0 1 0 4 2 8 0 8 0 0 0 1 0 6 1 8 0 8 0 0 0 1 0 7 2 8 0 8 0 0 0 2 5 70 71 72 73 12 74 75 24 1 0 4 1 8 0 8 0 0 0 1 0 6 2 8 0 8 0 0 0 2 73 45 73 77 73 73 78 75 24 1 0 4 5 8 0 8 0 0 0 1 0 7 5 8 0 8 0 0 0 2 20 41 19 12 80 5 78 81 24 1 0 6 5 8 0 8 0 0 0 1 1 6 5 8 0 8 0 0 0 2 83 84 78 74 83 78 78 81 24 1 0 7 3 8 0 8 0 0 0 1 0 7 1 8 0 8 0 0 0 2 86 47 75 87 75 75 75 75 24 2 24 24 24 24 24 24 24 24 24 3 59 60 69 76 79 82 85 88 89 2 3 12 20 12 12 12 12 12 24 1 1 1 1 8 0 8 0 0 0 1 0 5 1 8 0 8 0 0 0 2 5 92 19 12 77 12 74 93 24 2 12 12 12 12 12 12 12 12 24 2 12 49 77 12 77 12 74 87 24 2 12 50 74 12 74 12 74 87 24 2 12 51 87 12 87 12 87 87 24 3 91 52 94 95 96 95 97 98 89 2 4 13 21 12 29 34 30 31 24 1 0 3 2 8 0 8 0 0 0 2 73 45 73 77 73 101 78 75 24 2 29 13 73 77 29 29 30 31 24 2 33 13 73 12 29 33 30 31 24 2 30 15 73 74 30 30 30 31 24 2 31 16 75 87 31 31 31 31 24 3 100 53 102 96 103 104 105 106 89 2 5 14 5 12 14 33 33 14 24 1 1 8 2 0 0 8 0 0 0 2 33 10 109 12 13 33 15 16 24 1 1 8 2 8 0 2 0 0 0 2 20 111 19 12 73 5 22 75 24 2 12 12 12 12 5 12 12 12 24 2 33 33 5 12 33 33 33 33 24 2 33 15 78 12 30 33 30 31 24 2 33 16 75 12 31 33 31 31 24 3 108 110 112 113 104 114 115 116 89 2 15 15 46 50 15 15 15 16 24 2 83 46 78 74 78 78 78 75 24 2 30 15 78 74 30 30 30 31 24 3 36 118 119 97 120 115 120 106 89 2 7 16 23 12 31 34 31 31 24 3 122 57 88 98 106 116 106 106 89 3 38 38 89 89 89 89 89 89 38 4 39 58 90 99 107 117 121 123 124 2 1 10 44 12 13 33 15 16 8 2 10 10 54 42 13 10 15 16 8 2 11 41 54 42 45 109 46 47 24 2 14 10 54 12 13 33 15 16 24 3 126 127 128 52 53 129 118 57 38 1 1 8 8 8 8 8 8 8 0 1 1 1 2 8 8 8 8 8 0 1 1 8 1 8 8 8 8 8 0 1 1 4 8 8 8 8 8 8 0 1 1 6 8 8 8 8 8 8 0 1 1 7 8 8 8 8 8 8 0 2 10 131 132 133 134 131 135 136 8 1 1 4 2 8 8 8 8 8 0 1 1 6 2 8 8 8 8 8 0 1 1 7 2 8 8 8 8 8 0 2 54 132 132 133 138 132 139 140 24 1 1 4 1 8 8 8 8 8 0 1 1 6 1 8 8 8 8 8 0 1 1 7 1 8 8 8 8 8 0 2 42 133 133 133 142 133 143 144 24 2 13 134 138 142 134 134 135 136 24 1 1 8 2 8 8 8 8 8 0 2 10 131 147 133 134 131 135 136 24 2 15 135 132 143 135 135 135 136 24 2 16 136 140 144 136 136 136 136 24 3 43 137 141 145 146 148 149 150 38 2 18 41 41 42 45 54 41 47 24 2 41 132 132 133 138 147 132 140 24 1 1 1 2 3 8 8 8 8 0 1 1 1 2 8 8 8 0 8 0 1 1 1 3 8 8 8 8 8 0 1 1 4 2 3 8 8 8 8 0 1 6 7 2 1 8 8 8 8 0 1 6 6 2 8 8 8 8 8 0 1 1 7 2 3 8 8 8 8 0 2 62 154 155 156 157 158 159 160 24 1 1 1 1 8 8 8 8 8 0 2 92 162 132 162 142 133 143 144 24 2 45 138 138 142 138 138 139 140 24 2 111 132 147 133 138 147 139 140 24 2 46 139 139 143 139 139 139 140 24 2 47 140 140 144 140 140 140 140 24 3 152 153 161 163 164 165 166 167 89 1 1 5 1 8 8 8 8 8 0 2 70 162 147 133 142 133 143 169 24 2 12 133 133 12 142 12 143 144 24 2 49 142 142 142 142 142 143 144 24 2 50 143 143 143 143 143 143 144 24 2 51 144 144 144 144 144 144 144 24 3 52 145 170 171 172 171 173 174 89 1 1 3 2 8 8 8 8 8 0 2 45 138 138 142 138 176 139 140 24 2 15 135 138 143 135 135 135 136 24 3 53 146 177 172 146 146 178 150 89 2 33 10 41 12 13 33 15 16 24 2 10 131 132 133 134 131 135 136 24 2 41 132 147 133 138 147 139 140 24 2 33 131 147 12 134 33 135 136 24 2 15 135 139 143 135 135 135 136 24 3 180 181 182 171 146 183 184 150 89 2 84 139 139 143 139 139 139 140 24 3 118 184 186 173 184 184 184 150 89 3 57 150 167 174 150 150 150 150 89 4 130 151 168 175 179 185 187 188 124 2 2 44 61 5 73 20 83 86 24 2 18 41 62 92 45 111 46 47 24 2 19 41 63 19 73 19 78 75 24 2 20 42 64 12 77 12 74 87 24 2 21 45 65 77 73 73 78 75 24 2 5 41 66 12 101 5 78 75 24 2 22 46 67 74 78 22 78 75 24 2 23 47 68 93 75 75 75 75 24 3 190 191 192 193 194 195 196 197 89 2 11 54 62 70 45 41 84 47 24 2 41 132 154 162 138 132 139 140 24 2 54 132 155 147 138 147 139 140 24 2 42 133 156 133 142 133 143 144 24 2 45 138 157 142 138 138 139 140 24 2 109 132 158 133 176 147 139 140 24 2 46 139 159 143 139 139 139 140 24 2 47 140 160 169 140 140 140 140 24 3 199 200 201 202 203 204 205 206 89 2 19 54 63 71 73 19 78 75 24 2 41 132 155 132 138 147 139 140 24 1 0 4 2 8 8 8 0 8 0 1 0 6 2 8 8 8 8 8 0 1 0 7 2 8 8 8 0 8 0 2 63 155 5 12 210 5 211 212 24 1 0 4 2 8 8 8 8 8 0 1 0 6 1 8 8 8 8 8 0 1 0 7 2 8 8 8 8 8 0 2 19 147 12 12 214 12 215 216 24 2 73 138 210 214 214 214 211 216 24 2 19 147 5 12 214 5 211 216 24 2 78 139 211 215 211 211 211 216 24 2 75 140 212 216 216 216 216 216 24 3 208 209 213 217 218 219 220 221 89 2 26 42 64 72 77 12 74 87 24 2 42 133 156 162 142 133 143 144 24 2 71 132 12 12 214 12 215 216 24 1 0 4 1 8 8 8 8 8 0 1 0 7 1 8 8 8 8 8 0 2 12 133 12 12 226 12 215 227 24 1 0 4 3 8 8 8 8 8 0 1 0 3 1 8 8 8 8 8 0 2 77 142 229 230 226 226 215 227 24 2 74 143 215 215 215 215 215 227 24 1 0 7 3 8 8 8 8 8 0 2 87 144 233 227 227 227 227 227 24 3 223 224 225 228 231 228 232 234 89 2 28 45 65 73 73 80 83 75 24 2 77 142 229 226 226 226 215 227 24 1 0 4 2 3 8 8 8 8 0 2 73 138 238 226 214 214 211 216 24 1 0 4 2 1 8 8 8 8 0 2 73 138 240 226 214 214 211 216 24 1 0 7 2 3 8 8 8 8 0 2 75 140 242 227 216 216 216 216 24 3 236 203 218 237 239 241 220 243 89 2 5 54 66 12 73 5 78 75 24 2 54 147 158 133 138 147 139 140 24 2 5 147 5 12 214 5 211 216 24 1 0 7 2 1 8 8 8 8 0 2 75 140 248 227 216 216 216 216 24 3 245 246 219 228 241 247 220 249 89 2 22 46 67 74 78 78 78 75 24 2 41 132 159 143 139 139 139 140 24 2 73 138 211 215 211 211 211 216 24 2 75 140 211 227 216 216 216 216 24 3 251 252 220 232 253 220 220 254 89 2 23 47 68 75 75 81 81 75 24 2 47 140 160 144 140 140 140 140 24 3 256 257 221 234 243 249 254 243 89 3 89 89 89 89 89 89 89 89 89 4 198 207 222 235 244 250 255 258 259 2 3 12 5 12 12 12 12 12 24 2 12 42 70 12 49 12 50 51 24 2 26 42 71 12 77 12 74 87 24 2 12 12 72 12 12 12 12 12 24 2 12 49 73 12 77 5 74 87 24 2 12 51 75 12 87 12 87 87 24 3 261 262 263 264 265 95 97 266 89 2 12 42 92 12 49 12 50 51 24 2 42 133 162 133 142 133 143 144 24 2 42 133 132 133 142 133 143 144 24 2 12 133 162 12 142 12 143 144 24 3 268 269 270 271 172 171 173 174 89 2 20 42 19 12 77 12 74 87 24 2 42 133 147 133 142 133 143 144 24 2 64 156 12 12 229 12 215 233 24 2 77 142 214 226 226 226 215 227 24 2 87 144 216 227 227 227 227 227 24 3 273 274 275 228 276 228 232 277 89 2 72 162 12 12 230 12 215 227 24 2 12 142 226 12 226 12 215 227 24 2 12 143 215 12 215 12 215 227 24 2 12 144 227 12 227 12 227 227 24 3 95 171 279 95 280 95 281 282 89 2 12 142 230 12 226 12 215 227 24 2 77 142 226 226 226 226 215 227 24 2 87 144 227 227 227 227 227 227 24 3 96 172 276 284 285 280 232 286 89 3 95 171 228 95 280 95 281 282 89 3 97 173 232 281 232 281 232 286 89 2 12 51 93 12 87 12 87 87 24 2 51 144 169 144 144 144 144 144 24 3 290 291 277 282 286 282 286 286 89 4 267 272 278 283 287 288 289 292 259 2 4 13 73 12 29 33 30 31 24 2 28 45 73 77 73 73 78 75 24 2 14 13 73 12 29 33 30 31 24 3 294 53 295 96 103 296 120 106 89 3 53 146 164 172 146 146 184 150 89 2 21 45 73 77 73 73 73 75 24 2 45 138 138 142 138 138 138 140 24 2 65 157 210 229 238 240 211 242 24 2 77 142 214 230 226 226 215 227 24 2 73 138 214 226 214 214 211 216 24 2 75 140 216 227 216 216 216 216 24 3 299 300 301 302 303 303 220 304 89 2 73 142 214 226 226 226 215 227 24 2 5 142 226 12 226 12 215 227 24 3 96 172 306 280 285 307 232 286 89 1 0 4 8 8 8 8 8 8 0 1 0 6 8 8 8 8 8 8 0 1 0 7 8 8 8 8 8 8 0 2 29 134 214 226 309 309 310 311 24 2 30 135 211 215 310 310 310 311 24 2 31 136 216 227 311 311 311 311 24 3 103 146 303 285 312 312 313 314 89 2 34 13 101 12 29 33 30 31 24 2 13 134 176 142 134 134 135 136 24 2 80 138 214 226 214 214 211 216 24 2 33 134 214 12 309 33 310 311 24 3 316 317 318 280 312 319 313 314 89 2 83 139 211 215 211 211 211 216 24 3 120 184 321 232 313 313 313 314 89 3 106 150 304 286 314 314 314 314 89 4 297 298 305 308 315 320 322 323 259 2 5 33 20 12 33 33 33 33 24 2 5 54 19 12 73 5 78 75 24 2 34 13 80 12 29 33 30 31 24 2 34 16 81 12 31 33 31 31 24 3 325 180 326 95 327 114 115 328 89 2 14 10 111 12 13 33 15 16 24 2 54 147 147 133 138 147 139 140 24 3 330 181 331 171 146 183 184 150 89 2 5 109 19 12 73 5 78 75 24 2 66 158 5 12 240 5 211 248 24 2 101 176 214 226 214 214 211 216 24 3 333 182 334 228 335 247 220 304 89 2 14 13 73 5 29 33 30 31 24 3 337 146 303 280 312 319 313 314 89 2 33 135 211 12 310 33 310 311 24 2 33 136 216 12 311 33 311 311 24 3 114 183 247 95 319 114 339 340 89 2 33 15 22 12 30 33 30 31 24 3 342 184 220 281 313 339 313 314 89 2 14 16 75 12 31 33 31 31 24 3 344 150 304 282 314 340 314 314 89 4 329 332 336 288 338 341 343 345 259 2 6 15 83 12 30 33 30 31 24 2 15 15 84 50 15 15 15 16 24 2 22 41 78 74 73 78 78 75 24 2 30 15 83 74 30 30 30 31 24 2 31 16 81 87 31 31 31 31 24 3 347 348 349 97 350 115 120 351 89 2 46 132 139 143 138 139 139 140 24 3 118 184 353 173 184 184 184 150 89 2 22 46 78 74 78 78 78 75 24 2 67 159 211 215 211 211 211 211 24 2 22 139 211 215 211 211 211 216 24 3 355 166 356 232 220 357 220 304 89 3 120 184 220 232 313 313 313 314 89 3 115 184 220 281 313 339 313 314 89 4 352 354 358 289 359 360 359 323 259 2 7 16 86 12 31 33 31 31 24 2 23 47 75 87 75 75 75 75 24 3 362 57 363 98 106 344 106 106 89 2 68 160 212 233 242 248 211 242 24 2 93 169 216 227 227 227 227 227 24 3 363 167 365 366 304 304 304 304 89 2 75 144 216 227 227 227 227 227 24 3 98 174 368 282 286 282 286 286 89 2 34 16 75 12 31 33 31 31 24 2 81 140 216 227 216 216 216 216 24 3 370 150 371 282 314 340 314 314 89 3 106 150 371 286 314 314 314 314 89 4 364 188 367 369 323 372 373 323 259 4 124 124 259 259 259 259 259 259 124 5 125 189 260 293 324 346 361 374 375 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 # this is the background state for Evoloop-finite 9 0 0 0 golly-3.3-src/Rules/AbsoluteTurmite_1N10S11S30N21W01N11S20E1.rule0000644000175000017500000003467612124005036020315 00000000000000@RULE AbsoluteTurmite_1N10S11S30N21W01N11S20E1 @TREE num_states=10 num_neighbors=4 num_nodes=21 1 0 1 1 1 1 1 0 0 1 0 1 3 7 7 7 7 7 3 3 7 3 1 4 8 8 8 8 8 4 4 8 4 2 0 0 1 0 0 0 0 2 1 0 1 2 6 6 6 6 6 2 2 6 2 2 4 4 0 4 4 4 4 0 0 4 3 3 3 3 3 5 3 3 3 3 3 2 1 1 0 1 1 1 1 0 0 1 2 0 0 0 0 0 0 0 0 0 0 3 7 7 7 7 8 7 7 7 7 7 4 6 6 6 6 6 6 6 6 6 9 1 5 9 9 9 9 9 5 5 9 5 2 11 11 0 11 11 11 11 0 0 11 3 12 12 12 12 8 12 12 12 12 12 3 8 8 8 8 8 8 8 8 8 8 4 13 13 13 13 13 13 13 13 13 14 2 2 2 0 2 2 2 2 0 0 2 3 16 16 16 16 8 16 16 16 16 16 4 17 17 17 17 17 17 17 17 17 14 4 9 9 9 9 9 9 9 9 9 14 5 10 10 10 15 10 18 19 10 10 10 @COLORS 0 0 0 0 1 0 155 67 2 123 4 243 3 124 124 124 4 178 177 94 5 4 98 243 6 71 72 170 7 71 141 101 8 102 171 84 9 2 126 170 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 279 15 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #00327F" "G c #3F4DA1" "H c #408D61" "I c #5CA951" "J c #007FA1" "K c #7F00FF" "L c #808080" "M c #B9B860" "N c #0064FF" "O c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." "..............................." ".............CCCCC............." "..........CKKKKKKKKKC.........." "........CKKKKKKKKKKKKKC........" ".......CKKKKKKKKKKKKKKKC......." "......CKKKKKKKKKKKKKKKKKC......" ".....CKKKKKKKKKKKKKKKKKKKC....." "....CKKKKKOOKKKKKKKKKKKKKKC...." "....KKKKKOOKKKKKKKKKKKKKKKK...." "...CKKKKOOKKKKKKKKKKKKKKKKKC..." "...KKKKKOOKKKKKKKKKKKKKKKKKK..." "...KKKKKOKKKKKKKKKKKKKKKKKKK..." "..CKKKKKKKKKKKKKKKKKKKKKKKKKC.." "..CKKKKKKKKKKKKKKKKKKKKKKKKKC.." "..CKKKKKKKKKKKKKKKKKKKKKKKKKC.." "..CKKKKKKKKKKKKKKKKKKKKKKKKKC.." "..CKKKKKKKKKKKKKKKKKKKKKKKKKC.." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...CKKKKKKKKKKKKKKKKKKKKKKKC..." "....KKKKKKKKKKKKKKKKKKKKKKK...." "....CKKKKKKKKKKKKKKKKKKKKKC...." ".....CKKKKKKKKKKKKKKKKKKKC....." "......CKKKKKKKKKKKKKKKKKC......" ".......CKKKKKKKKKKKKKKKC......." "........CKKKKKKKKKKKKKC........" "..........CKKKKKKKKKC.........." ".............CCCCC............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." ".............DDDDD............." "..........DLLLLLLLLLD.........." "........DLLLLLLLLLLLLLD........" ".......DLLLLLLLLLLLLLLLD......." "......DLLLLLLLLLLLLLLLLLD......" ".....DLLLLLLLLLLLLLLLLLLLD....." "....DLLLLLOOLLLLLLLLLLLLLLD...." "....LLLLLOOLLLLLLLLLLLLLLLL...." "...DLLLLOOLLLLLLLLLLLLLLLLLD..." "...LLLLLOOLLLLLLLLLLLLLLLLLL..." "...LLLLLOLLLLLLLLLLLLLLLLLLL..." "..DLLLLLLLLLLLLLLLLLLLLLLLLLD.." "..DLLLLLLLLLLLLLLLLLLLLLLLLLD.." "..DLLLLLLLLLLLLLLLLLLLLLLLLLD.." "..DLLLLLLLLLLLLLLLLLLLLLLLLLD.." "..DLLLLLLLLLLLLLLLLLLLLLLLLLD.." "...LLLLLLLLLLLLLLLLLLLLLLLLL..." "...LLLLLLLLLLLLLLLLLLLLLLLLL..." "...DLLLLLLLLLLLLLLLLLLLLLLLD..." "....LLLLLLLLLLLLLLLLLLLLLLL...." "....DLLLLLLLLLLLLLLLLLLLLLD...." ".....DLLLLLLLLLLLLLLLLLLLD....." "......DLLLLLLLLLLLLLLLLLD......" ".......DLLLLLLLLLLLLLLLD......." "........DLLLLLLLLLLLLLD........" "..........DLLLLLLLLLD.........." ".............DDDDD............." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." ".............EEEEE............." "..........EMMMMMMMMME.........." "........EMMMMMMMMMMMMME........" ".......EMMMMMMMMMMMMMMME......." "......EMMMMMMMMMMMMMMMMME......" ".....EMMMMMMMMMMMMMMMMMMME....." "....EMMMMMOOMMMMMMMMMMMMMME...." "....MMMMMOOMMMMMMMMMMMMMMMM...." "...EMMMMOOMMMMMMMMMMMMMMMMME..." "...MMMMMOOMMMMMMMMMMMMMMMMMM..." "...MMMMMOMMMMMMMMMMMMMMMMMMM..." "..EMMMMMMMMMMMMMMMMMMMMMMMMME.." "..EMMMMMMMMMMMMMMMMMMMMMMMMME.." "..EMMMMMMMMMMMMMMMMMMMMMMMMME.." "..EMMMMMMMMMMMMMMMMMMMMMMMMME.." "..EMMMMMMMMMMMMMMMMMMMMMMMMME.." "...MMMMMMMMMMMMMMMMMMMMMMMMM..." "...MMMMMMMMMMMMMMMMMMMMMMMMM..." "...EMMMMMMMMMMMMMMMMMMMMMMME..." "....MMMMMMMMMMMMMMMMMMMMMMM...." "....EMMMMMMMMMMMMMMMMMMMMME...." ".....EMMMMMMMMMMMMMMMMMMME....." "......EMMMMMMMMMMMMMMMMME......" ".......EMMMMMMMMMMMMMMME......." "........EMMMMMMMMMMMMME........" "..........EMMMMMMMMME.........." ".............EEEEE............." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." ".............FFFFF............." "..........FNNNNNNNNNF.........." "........FNNNNNNNNNNNNNF........" ".......FNNNNNNNNNNNNNNNF......." "......FNNNNNNNNNNNNNNNNNF......" ".....FNNNNNNNNNNNNNNNNNNNF....." "....FNNNNNOONNNNNNNNNNNNNNF...." "....NNNNNOONNNNNNNNNNNNNNNN...." "...FNNNNOONNNNNNNNNNNNNNNNNF..." "...NNNNNOONNNNNNNNNNNNNNNNNN..." "...NNNNNONNNNNNNNNNNNNNNNNNN..." "..FNNNNNNNNNNNNNNNNNNNNNNNNNF.." "..FNNNNNNNNNNNNNNNNNNNNNNNNNF.." "..FNNNNNNNNNNNNNNNNNNNNNNNNNF.." "..FNNNNNNNNNNNNNNNNNNNNNNNNNF.." "..FNNNNNNNNNNNNNNNNNNNNNNNNNF.." "...NNNNNNNNNNNNNNNNNNNNNNNNN..." "...NNNNNNNNNNNNNNNNNNNNNNNNN..." "...FNNNNNNNNNNNNNNNNNNNNNNNF..." "....NNNNNNNNNNNNNNNNNNNNNNN...." "....FNNNNNNNNNNNNNNNNNNNNNF...." ".....FNNNNNNNNNNNNNNNNNNNF....." "......FNNNNNNNNNNNNNNNNNF......" ".......FNNNNNNNNNNNNNNNF......." "........FNNNNNNNNNNNNNF........" "..........FNNNNNNNNNF.........." ".............FFFFF............." "..............................." "..............................." /* icon for state 6 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAGKKKKKKKKKGAAAAAAAAAA" "AAAAAAAAGKKKKKKKKKKKKKGAAAAAAAA" "AAAAAAAGKKKKKKKKKKKKKKKGAAAAAAA" "AAAAAAGKKKKKKKKKKKKKKKKKGAAAAAA" "AAAAAGKKKKKKKKKKKKKKKKKKKGAAAAA" "AAAAGKKKKKOOKKKKKKKKKKKKKKGAAAA" "AAAAKKKKKOOKKKKKKKKKKKKKKKKAAAA" "AAAGKKKKOOKKKKKKKKKKKKKKKKKGAAA" "AAAKKKKKOOKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKOKKKKKKKKKKKKKKKKKKKAAA" "AAGKKKKKKKKKKKKKKKKKKKKKKKKKGAA" "AAGKKKKKKKKKKKKKKKKKKKKKKKKKGAA" "AAGKKKKKKKKKKKKKKKKKKKKKKKKKGAA" "AAGKKKKKKKKKKKKKKKKKKKKKKKKKGAA" "AAGKKKKKKKKKKKKKKKKKKKKKKKKKGAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAGKKKKKKKKKKKKKKKKKKKKKKKGAAA" "AAAAKKKKKKKKKKKKKKKKKKKKKKKAAAA" "AAAAGKKKKKKKKKKKKKKKKKKKKKGAAAA" "AAAAAGKKKKKKKKKKKKKKKKKKKGAAAAA" "AAAAAAGKKKKKKKKKKKKKKKKKGAAAAAA" "AAAAAAAGKKKKKKKKKKKKKKKGAAAAAAA" "AAAAAAAAGKKKKKKKKKKKKKGAAAAAAAA" "AAAAAAAAAAGKKKKKKKKKGAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAHLLLLLLLLLHAAAAAAAAAA" "AAAAAAAAHLLLLLLLLLLLLLHAAAAAAAA" "AAAAAAAHLLLLLLLLLLLLLLLHAAAAAAA" "AAAAAAHLLLLLLLLLLLLLLLLLHAAAAAA" "AAAAAHLLLLLLLLLLLLLLLLLLLHAAAAA" "AAAAHLLLLLOOLLLLLLLLLLLLLLHAAAA" "AAAALLLLLOOLLLLLLLLLLLLLLLLAAAA" "AAAHLLLLOOLLLLLLLLLLLLLLLLLHAAA" "AAALLLLLOOLLLLLLLLLLLLLLLLLLAAA" "AAALLLLLOLLLLLLLLLLLLLLLLLLLAAA" "AAHLLLLLLLLLLLLLLLLLLLLLLLLLHAA" "AAHLLLLLLLLLLLLLLLLLLLLLLLLLHAA" "AAHLLLLLLLLLLLLLLLLLLLLLLLLLHAA" "AAHLLLLLLLLLLLLLLLLLLLLLLLLLHAA" "AAHLLLLLLLLLLLLLLLLLLLLLLLLLHAA" "AAALLLLLLLLLLLLLLLLLLLLLLLLLAAA" "AAALLLLLLLLLLLLLLLLLLLLLLLLLAAA" "AAAHLLLLLLLLLLLLLLLLLLLLLLLHAAA" "AAAALLLLLLLLLLLLLLLLLLLLLLLAAAA" "AAAAHLLLLLLLLLLLLLLLLLLLLLHAAAA" "AAAAAHLLLLLLLLLLLLLLLLLLLHAAAAA" "AAAAAAHLLLLLLLLLLLLLLLLLHAAAAAA" "AAAAAAAHLLLLLLLLLLLLLLLHAAAAAAA" "AAAAAAAAHLLLLLLLLLLLLLHAAAAAAAA" "AAAAAAAAAAHLLLLLLLLLHAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 8 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAIIIIIAAAAAAAAAAAAA" "AAAAAAAAAAIMMMMMMMMMIAAAAAAAAAA" "AAAAAAAAIMMMMMMMMMMMMMIAAAAAAAA" "AAAAAAAIMMMMMMMMMMMMMMMIAAAAAAA" "AAAAAAIMMMMMMMMMMMMMMMMMIAAAAAA" "AAAAAIMMMMMMMMMMMMMMMMMMMIAAAAA" "AAAAIMMMMMOOMMMMMMMMMMMMMMIAAAA" "AAAAMMMMMOOMMMMMMMMMMMMMMMMAAAA" "AAAIMMMMOOMMMMMMMMMMMMMMMMMIAAA" "AAAMMMMMOOMMMMMMMMMMMMMMMMMMAAA" "AAAMMMMMOMMMMMMMMMMMMMMMMMMMAAA" "AAIMMMMMMMMMMMMMMMMMMMMMMMMMIAA" "AAIMMMMMMMMMMMMMMMMMMMMMMMMMIAA" "AAIMMMMMMMMMMMMMMMMMMMMMMMMMIAA" "AAIMMMMMMMMMMMMMMMMMMMMMMMMMIAA" "AAIMMMMMMMMMMMMMMMMMMMMMMMMMIAA" "AAAMMMMMMMMMMMMMMMMMMMMMMMMMAAA" "AAAMMMMMMMMMMMMMMMMMMMMMMMMMAAA" "AAAIMMMMMMMMMMMMMMMMMMMMMMMIAAA" "AAAAMMMMMMMMMMMMMMMMMMMMMMMAAAA" "AAAAIMMMMMMMMMMMMMMMMMMMMMIAAAA" "AAAAAIMMMMMMMMMMMMMMMMMMMIAAAAA" "AAAAAAIMMMMMMMMMMMMMMMMMIAAAAAA" "AAAAAAAIMMMMMMMMMMMMMMMIAAAAAAA" "AAAAAAAAIMMMMMMMMMMMMMIAAAAAAAA" "AAAAAAAAAAIMMMMMMMMMIAAAAAAAAAA" "AAAAAAAAAAAAAIIIIIAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAJJJJJAAAAAAAAAAAAA" "AAAAAAAAAAJNNNNNNNNNJAAAAAAAAAA" "AAAAAAAAJNNNNNNNNNNNNNJAAAAAAAA" "AAAAAAAJNNNNNNNNNNNNNNNJAAAAAAA" "AAAAAAJNNNNNNNNNNNNNNNNNJAAAAAA" "AAAAAJNNNNNNNNNNNNNNNNNNNJAAAAA" "AAAAJNNNNNOONNNNNNNNNNNNNNJAAAA" "AAAANNNNNOONNNNNNNNNNNNNNNNAAAA" "AAAJNNNNOONNNNNNNNNNNNNNNNNJAAA" "AAANNNNNOONNNNNNNNNNNNNNNNNNAAA" "AAANNNNNONNNNNNNNNNNNNNNNNNNAAA" "AAJNNNNNNNNNNNNNNNNNNNNNNNNNJAA" "AAJNNNNNNNNNNNNNNNNNNNNNNNNNJAA" "AAJNNNNNNNNNNNNNNNNNNNNNNNNNJAA" "AAJNNNNNNNNNNNNNNNNNNNNNNNNNJAA" "AAJNNNNNNNNNNNNNNNNNNNNNNNNNJAA" "AAANNNNNNNNNNNNNNNNNNNNNNNNNAAA" "AAANNNNNNNNNNNNNNNNNNNNNNNNNAAA" "AAAJNNNNNNNNNNNNNNNNNNNNNNNJAAA" "AAAANNNNNNNNNNNNNNNNNNNNNNNAAAA" "AAAAJNNNNNNNNNNNNNNNNNNNNNJAAAA" "AAAAAJNNNNNNNNNNNNNNNNNNNJAAAAA" "AAAAAAJNNNNNNNNNNNNNNNNNJAAAAAA" "AAAAAAAJNNNNNNNNNNNNNNNJAAAAAAA" "AAAAAAAAJNNNNNNNNNNNNNJAAAAAAAA" "AAAAAAAAAAJNNNNNNNNNJAAAAAAAAAA" "AAAAAAAAAAAAAJJJJJAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 135 15 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #00327F" "G c #3F4DA1" "H c #408D61" "I c #5CA951" "J c #007FA1" "K c #7F00FF" "L c #808080" "M c #B9B860" "N c #0064FF" "O c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "..............." "......CCC......" "....CKKKKKC...." "...CKKKKKKKC..." "..CKKOKKKKKKC.." "..KKOKKKKKKKK.." ".CKKOKKKKKKKKC." ".CKKKKKKKKKKKC." ".CKKKKKKKKKKKC." "..KKKKKKKKKKK.." "..CKKKKKKKKKC.." "...CKKKKKKKC..." "....CKKKKKC...." "......CCC......" "..............." /* icon for state 3 */ "..............." "......DDD......" "....DLLLLLD...." "...DLLLLLLLD..." "..DLLOLLLLLLD.." "..LLOLLLLLLLL.." ".DLLOLLLLLLLLD." ".DLLLLLLLLLLLD." ".DLLLLLLLLLLLD." "..LLLLLLLLLLL.." "..DLLLLLLLLLD.." "...DLLLLLLLD..." "....DLLLLLD...." "......DDD......" "..............." /* icon for state 4 */ "..............." "......EEE......" "....EMMMMME...." "...EMMMMMMME..." "..EMMOMMMMMME.." "..MMOMMMMMMMM.." ".EMMOMMMMMMMME." ".EMMMMMMMMMMME." ".EMMMMMMMMMMME." "..MMMMMMMMMMM.." "..EMMMMMMMMME.." "...EMMMMMMME..." "....EMMMMME...." "......EEE......" "..............." /* icon for state 5 */ "..............." "......FFF......" "....FNNNNNF...." "...FNNNNNNNF..." "..FNNONNNNNNF.." "..NNONNNNNNNN.." ".FNNONNNNNNNNF." ".FNNNNNNNNNNNF." ".FNNNNNNNNNNNF." "..NNNNNNNNNNN.." "..FNNNNNNNNNF.." "...FNNNNNNNF..." "....FNNNNNF...." "......FFF......" "..............." /* icon for state 6 */ "AAAAAAAAAAAAAAA" "AAAAAAGGGAAAAAA" "AAAAGKKKKKGAAAA" "AAAGKKKKKKKGAAA" "AAGKKOKKKKKKGAA" "AAKKOKKKKKKKKAA" "AGKKOKKKKKKKKGA" "AGKKKKKKKKKKKGA" "AGKKKKKKKKKKKGA" "AAKKKKKKKKKKKAA" "AAGKKKKKKKKKGAA" "AAAGKKKKKKKGAAA" "AAAAGKKKKKGAAAA" "AAAAAAGGGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAA" "AAAAAAHHHAAAAAA" "AAAAHLLLLLHAAAA" "AAAHLLLLLLLHAAA" "AAHLLOLLLLLLHAA" "AALLOLLLLLLLLAA" "AHLLOLLLLLLLLHA" "AHLLLLLLLLLLLHA" "AHLLLLLLLLLLLHA" "AALLLLLLLLLLLAA" "AAHLLLLLLLLLHAA" "AAAHLLLLLLLHAAA" "AAAAHLLLLLHAAAA" "AAAAAAHHHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 8 */ "AAAAAAAAAAAAAAA" "AAAAAAIIIAAAAAA" "AAAAIMMMMMIAAAA" "AAAIMMMMMMMIAAA" "AAIMMOMMMMMMIAA" "AAMMOMMMMMMMMAA" "AIMMOMMMMMMMMIA" "AIMMMMMMMMMMMIA" "AIMMMMMMMMMMMIA" "AAMMMMMMMMMMMAA" "AAIMMMMMMMMMIAA" "AAAIMMMMMMMIAAA" "AAAAIMMMMMIAAAA" "AAAAAAIIIAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAA" "AAAAAAJJJAAAAAA" "AAAAJNNNNNJAAAA" "AAAJNNNNNNNJAAA" "AAJNNONNNNNNJAA" "AANNONNNNNNNNAA" "AJNNONNNNNNNNJA" "AJNNNNNNNNNNNJA" "AJNNNNNNNNNNNJA" "AANNNNNNNNNNNAA" "AAJNNNNNNNNNJAA" "AAAJNNNNNNNJAAA" "AAAAJNNNNNJAAAA" "AAAAAAJJJAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 63 15 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #00327F" "G c #3F4DA1" "H c #408D61" "I c #5CA951" "J c #007FA1" "K c #7F00FF" "L c #808080" "M c #B9B860" "N c #0064FF" "O c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ "..CCC.." ".CKKKC." "CKOKKKC" "CKKKKKC" "CKKKKKC" ".CKKKC." "..CCC.." /* icon for state 3 */ "..DDD.." ".DLLLD." "DLOLLLD" "DLLLLLD" "DLLLLLD" ".DLLLD." "..DDD.." /* icon for state 4 */ "..EEE.." ".EMMME." "EMOMMME" "EMMMMME" "EMMMMME" ".EMMME." "..EEE.." /* icon for state 5 */ "..FFF.." ".FNNNF." "FNONNNF" "FNNNNNF" "FNNNNNF" ".FNNNF." "..FFF.." /* icon for state 6 */ "AAGGGAA" "AGKKKGA" "GKOKKKG" "GKKKKKG" "GKKKKKG" "AGKKKGA" "AAGGGAA" /* icon for state 7 */ "AAHHHAA" "AHLLLHA" "HLOLLLH" "HLLLLLH" "HLLLLLH" "AHLLLHA" "AAHHHAA" /* icon for state 8 */ "AAIIIAA" "AIMMMIA" "IMOMMMI" "IMMMMMI" "IMMMMMI" "AIMMMIA" "AAIIIAA" /* icon for state 9 */ "AAJJJAA" "AJNNNJA" "JNONNNJ" "JNNNNNJ" "JNNNNNJ" "AJNNNJA" "AAJJJAA" golly-3.3-src/Rules/Banks-IV.rule0000644000175000017500000000122612124663564013562 00000000000000@RULE Banks-IV Edwin Roger Banks, PhD Thesis 1971 Four-state, five-neighbor universal constructor (Appendix IV) http://www.bottomlayer.com/bottom/banks/banks_commentary.htm @TABLE # Format: C,N,E,S,W,C' n_states:4 neighborhood:vonNeumann symmetries:rotate4reflect 031301 132302 231300 013331 310002 220001 120002 123332 211103 213330 233300 311001 122002 211003 310301 100000 130000 011001 310002 020003 200000 012131 010303 033203 020303 023003 013102 230000 033331 331001 113000 121313 313132 230301 133333 130303 011301 321311 133000 013133 011132 320101 113330 133303 123003 120303 021332 020201 120202 210100 213300 210001 213130 320000 223230 010101 golly-3.3-src/Rules/BBM-Margolus-emulated.rule0000644000175000017500000000652712060231465016174 00000000000000@RULE BBM-Margolus-emulated @TREE num_states=5 num_neighbors=8 num_nodes=126 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 2 2 2 4 2 0 1 21 1 0 1 0 4 2 4 4 2 0 1 0 1 23 3 2 3 22 3 24 4 25 7 25 7 25 5 26 10 26 10 26 1 0 4 2 2 4 2 0 1 28 1 0 3 2 3 29 3 2 4 30 7 30 7 30 5 31 10 31 10 31 6 15 20 27 20 32 5 10 10 10 10 10 6 20 20 34 20 34 3 2 3 2 3 2 1 0 1 2 3 2 2 1 1 37 1 1 3 38 38 3 38 3 1 0 1 4 3 4 2 1 1 1 1 40 3 41 41 3 41 3 4 36 39 36 42 36 5 43 10 43 10 43 4 25 39 25 42 25 5 45 10 45 10 45 4 30 39 30 42 30 5 47 10 47 10 47 6 44 34 46 34 48 1 0 1 4 3 2 2 1 1 50 1 1 3 51 51 3 51 3 4 36 52 36 7 36 5 53 10 53 10 53 4 25 52 25 7 25 5 55 10 55 10 55 4 30 52 30 7 30 5 57 10 57 10 57 6 54 34 56 34 58 7 33 35 49 35 59 6 34 34 34 34 34 7 35 35 61 35 61 4 36 7 36 7 36 2 37 37 1 37 1 3 3 3 64 3 3 4 65 7 65 7 65 2 40 40 1 40 1 3 3 3 3 3 67 4 68 7 68 7 68 5 63 66 63 69 63 5 26 66 26 69 26 5 31 66 31 69 31 6 70 34 71 34 72 5 43 66 43 69 43 5 45 66 45 69 45 5 47 66 47 69 47 6 74 34 75 34 76 5 53 66 53 69 53 5 55 66 55 69 55 5 57 66 57 69 57 6 78 34 79 34 80 7 73 61 77 61 81 2 50 50 1 50 1 3 3 3 83 3 3 4 84 7 84 7 84 5 63 85 63 10 63 5 26 85 26 10 26 5 31 85 31 10 31 6 86 34 87 34 88 5 43 85 43 10 43 5 45 85 45 10 45 5 47 85 47 10 47 6 90 34 91 34 92 5 53 85 53 10 53 5 55 85 55 10 55 5 57 85 57 10 57 6 94 34 95 34 96 7 89 61 93 61 97 8 60 62 82 62 98 1 0 1 1 3 1 2 100 1 100 1 100 3 101 3 101 3 101 4 18 7 102 7 18 1 0 1 3 3 3 2 104 1 104 1 104 3 105 3 105 3 105 4 18 7 18 7 106 5 19 10 103 10 107 6 108 108 34 108 34 7 109 109 61 109 61 7 61 61 61 61 61 8 110 110 111 110 111 5 63 10 63 10 63 6 113 34 27 34 32 7 114 61 49 61 59 8 115 111 82 111 98 1 0 1 3 3 1 2 117 1 117 1 117 3 118 3 118 3 118 4 18 7 119 7 18 5 19 10 120 10 19 6 121 121 34 121 34 7 122 122 61 122 61 8 123 123 111 123 111 9 99 112 116 124 116 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 5 127 0 255 6 88 0 178 7 148 148 148 8 103 103 103 9 128 255 0 10 89 178 0 11 255 0 128 12 178 0 89 13 0 128 255 14 0 89 178 15 1 159 0 16 0 111 0 17 159 0 1 18 111 0 0 19 255 254 96 20 178 177 67 21 0 1 159 22 0 0 111 23 96 255 254 24 67 178 177 25 254 96 255 26 177 67 178 27 126 125 21 28 88 87 14 29 21 126 125 30 14 88 87 31 125 21 126 32 87 14 88 33 255 116 116 34 178 81 81 35 116 255 116 36 81 178 81 37 116 116 255 38 81 81 178 39 228 227 0 40 159 158 0 41 28 255 27 42 19 178 18 43 255 27 28 44 178 18 19 45 0 228 227 46 0 159 158 47 227 0 228 48 158 0 159 49 27 28 255 50 18 19 178 51 59 59 59 52 41 41 41 53 234 195 176 54 163 136 123 55 175 196 255 56 122 137 178 57 171 194 68 58 119 135 47 59 194 68 171 60 135 47 119 61 68 171 194 62 47 119 135 63 72 184 71 64 50 128 49 65 184 71 72 66 128 49 50 67 71 72 184 68 49 50 128 69 169 255 188 70 118 178 131 71 252 179 63 72 176 125 44 73 63 252 179 74 44 176 125 75 179 63 252 76 125 44 176 77 80 9 0 78 56 6 0 79 0 80 9 80 0 56 6 81 9 0 80 82 6 0 56 83 255 175 250 84 178 122 175 85 199 134 213 86 139 93 149 87 115 100 95 88 80 70 66 89 188 163 0 90 131 114 0 91 0 188 163 92 0 131 114 93 163 0 188 94 114 0 131 95 203 73 0 96 142 51 0 97 0 203 73 98 0 142 51 99 73 0 203 100 51 0 142 101 94 189 0 102 65 132 0 103 189 0 94 104 132 0 65 golly-3.3-src/Rules/HPP.rule0000644000175000017500000006466112124663564012653 00000000000000@RULE HPP HPP Lattice gas J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. The earliest lattice gas model. Later made obsolete by the FHP gas on a hexagonal lattice, which has better physical properties. States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf Each cell can contain up to 4 particles, each moving in one of the four directions. Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. Next state is simply the collected inputs, in most cases. The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). To make the gas useful in Golly's infinite area, I've added reflecting boundary states, 16-31. These work in the same way as gas particles (collecting inputs) but reverse their direction. Contact: Tim Hutton Sink boundary: (or you can vent to the outside but this way is neater) 32 Source boundary: (haven't really worked out how to use this well yet) 33 The HPP gas can also be run using the Margolus-neighborhood emulator in Golly (see e.g. Patterns/Margolus/BBM.rle) but this CA is neater. @TABLE n_states:34 neighborhood:vonNeumann symmetries:none # a = any of the gas states var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} # b = any of the reflecting boundary states var b={16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31} # s = has an outgoing south particle var s={8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,33} # Ns = doesn't have an outgoing south particle var Ns={0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,32} # e = has an outgoing east particle var e={4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,33} # Ne = doesn't have an outgoing east particle var Ne={0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27,32} # n = has an outgoing north particle var n={2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,33} # Nn = doesn't have an outgoing north particle var Nn={0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32} # w = has an outgoing west particle var w={1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33} # Nw = doesn't have an outgoing north particle var Nw={0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32} # straightforward transport (no interactions) except 5 and 10 which are swapped a,Ns,Nw,Nn,Ne,0 a,Ns,w,Nn,Ne,1 a,Ns,Nw,n,Ne,2 a,Ns,w,n,Ne,3 a,Ns,Nw,Nn,e,4 a,Ns,w,Nn,e,10 a,Ns,Nw,n,e,6 a,Ns,w,n,e,7 a,s,Nw,Nn,Ne,8 a,s,w,Nn,Ne,9 a,s,Nw,n,Ne,5 a,s,w,n,Ne,11 a,s,Nw,Nn,e,12 a,s,w,Nn,e,13 a,s,Nw,n,e,14 a,s,w,n,e,15 # reflecting boundaries: b,Ns,Nw,Nn,Ne,16 b,Ns,Nw,Nn,e,17 b,s,Nw,Nn,Ne,18 b,s,Nw,Nn,e,19 b,Ns,w,Nn,Ne,20 b,Ns,w,Nn,e,21 b,s,w,Nn,Ne,22 b,s,w,Nn,e,23 b,Ns,Nw,n,Ne,24 b,Ns,Nw,n,e,25 b,s,Nw,n,Ne,26 b,s,Nw,n,e,27 b,Ns,w,n,Ne,28 b,Ns,w,n,e,29 b,s,w,n,Ne,30 b,s,w,n,e,31 @COLORS # the grey-level intensity is proportional to the number of particles # in the square 1 120 120 120 2 120 120 120 3 160 160 160 4 120 120 120 5 160 160 160 6 160 160 160 7 220 220 220 8 120 120 120 9 160 160 160 10 160 160 160 11 220 220 220 12 160 160 160 13 220 220 220 14 220 220 220 15 255 255 255 16 200 180 0 17 255 255 0 18 255 255 0 19 255 255 0 20 255 255 0 21 255 255 0 22 255 255 0 23 255 255 0 24 255 255 0 25 255 255 0 26 255 255 0 27 255 255 0 28 255 255 0 29 255 255 0 30 255 255 0 31 255 255 0 32 255 0 0 33 0 255 0 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 496 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B........................." "....BB........................." "...BBB........................." "..BBBB........................." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........................." "...BBB........................." "....BB........................." ".....B........................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 2 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 3 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".........................B....." ".........................BB...." ".........................BBB..." ".........................BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." ".........................BBBB.." ".........................BBB..." ".........................BB...." ".........................B....." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B...................B....." "....BB...................BB...." "...BBB...................BBB..." "..BBBB...................BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB...................BBBB.." "...BBB...................BBB..." "....BB...................BB...." ".....B...................B....." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 7 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 10 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 11 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 12 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 13 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 14 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 15 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for states 16 to 33 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "15 240 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "..............." "..............." "..............." "..............." "..B............" ".BB............" "BBBBBBBBBBBBB.." ".BB............" "..B............" "..............." "..............." "..............." "..............." "..............." /* icon for state 2 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 3 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 4 */ "..............." "..............." "..............." "..............." "..............." "............B.." "............BB." "..BBBBBBBBBBBBB" "............BB." "............B.." "..............." "..............." "..............." "..............." "..............." /* icon for state 5 */ "..............." "..............." "..............." "..............." "..............." "..B.........B.." ".BB.........BB." "BBBBBBBBBBBBBBB" ".BB.........BB." "..B.........B.." "..............." "..............." "..............." "..............." "..............." /* icon for state 6 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 7 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 8 */ "..............." "..............." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 9 */ "..............." "..............." ".......B......." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 10 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 11 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 12 */ "..............." "..............." ".......B......." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 13 */ "..............." "..............." ".......B......." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 14 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 15 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for states 16 to 33 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "7 112 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "......." ".B....." "BBBBBB." ".B....." "......." "......." /* icon for state 2 */ "...B..." "..BBB.." "...B..." "...B..." "...B..." "...B..." "......." /* icon for state 3 */ "...B..." "..BBB.." ".B.B..." "BBBBBB." ".B.B..." "...B..." "......." /* icon for state 4 */ "......." "......." ".....B." ".BBBBBB" ".....B." "......." "......." /* icon for state 5 */ "......." "......." ".B...B." "BBBBBBB" ".B...B." "......." "......." /* icon for state 6 */ "...B..." "..BBB.." "...B.B." ".BBBBBB" "...B.B." "...B..." "......." /* icon for state 7 */ "...B..." "..BBB.." ".B.B.B." "BBBBBBB" ".B.B.B." "...B..." "......." /* icon for state 8 */ "......." "...B..." "...B..." "...B..." "...B..." "..BBB.." "...B..." /* icon for state 9 */ "......." "......." ".B....." "BBBB..." ".B.B..." "..BBB.." "...B..." /* icon for state 10 */ "...B..." "..BBB.." "...B..." "...B..." "...B..." "..BBB.." "...B..." /* icon for state 11 */ "...B..." "..BBB.." ".B.B..." "BBBBBB." ".B.B..." "..BBB.." "...B..." /* icon for state 12 */ "......." "...B..." "...B.B." ".BBBBBB" "...B.B." "..BBB.." "...B..." /* icon for state 13 */ "......." "...B..." ".B.B.B." "BBBBBBB" ".B.B.B." "..BBB.." "...B..." /* icon for state 14 */ "...B..." "..BBB.." "...B.B." ".BBBBBB" "...B.B." "..BBB.." "...B..." /* icon for state 15 */ "...B..." "..BBB.." ".B.B.B." "BBBBBBB" ".B.B.B." "..BBB.." "...B..." /* icon for states 16 to 33 */ "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" golly-3.3-src/Rules/AbsoluteTurmite_0N21S10E00S01W11N2.rule0000644000175000017500000002633712124005036017540 00000000000000@RULE AbsoluteTurmite_0N21S10E00S01W11N2 @TREE num_states=8 num_neighbors=4 num_nodes=16 1 0 1 0 0 1 1 0 1 1 4 7 4 4 7 7 4 7 2 0 0 1 0 0 0 0 1 1 3 6 3 3 6 6 3 6 2 3 3 0 3 3 3 3 0 3 2 2 2 2 4 2 2 2 1 2 5 2 2 5 5 2 5 2 6 6 0 6 6 6 6 0 2 0 0 0 0 0 0 0 0 3 7 7 7 7 8 7 7 7 4 5 5 5 9 5 5 5 5 3 4 4 4 4 8 4 4 4 3 8 8 8 8 8 8 8 8 4 11 11 11 12 11 11 11 11 4 9 9 9 12 9 9 9 9 5 10 10 10 10 10 13 14 10 @COLORS 0 0 0 0 1 0 155 67 2 123 4 243 3 124 124 124 4 178 177 94 5 71 72 170 6 71 141 101 7 102 171 84 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 217 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." "..............................." ".............CCCCC............." "..........CIIIIIIIIIC.........." "........CIIIIIIIIIIIIIC........" ".......CIIIIIIIIIIIIIIIC......." "......CIIIIIIIIIIIIIIIIIC......" ".....CIIIIIIIIIIIIIIIIIIIC....." "....CIIIIILLIIIIIIIIIIIIIIC...." "....IIIIILLIIIIIIIIIIIIIIII...." "...CIIIILLIIIIIIIIIIIIIIIIIC..." "...IIIIILLIIIIIIIIIIIIIIIIII..." "...IIIIILIIIIIIIIIIIIIIIIIII..." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "..CIIIIIIIIIIIIIIIIIIIIIIIIIC.." "...IIIIIIIIIIIIIIIIIIIIIIIII..." "...IIIIIIIIIIIIIIIIIIIIIIIII..." "...CIIIIIIIIIIIIIIIIIIIIIIIC..." "....IIIIIIIIIIIIIIIIIIIIIII...." "....CIIIIIIIIIIIIIIIIIIIIIC...." ".....CIIIIIIIIIIIIIIIIIIIC....." "......CIIIIIIIIIIIIIIIIIC......" ".......CIIIIIIIIIIIIIIIC......." "........CIIIIIIIIIIIIIC........" "..........CIIIIIIIIIC.........." ".............CCCCC............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." ".............DDDDD............." "..........DJJJJJJJJJD.........." "........DJJJJJJJJJJJJJD........" ".......DJJJJJJJJJJJJJJJD......." "......DJJJJJJJJJJJJJJJJJD......" ".....DJJJJJJJJJJJJJJJJJJJD....." "....DJJJJJLLJJJJJJJJJJJJJJD...." "....JJJJJLLJJJJJJJJJJJJJJJJ...." "...DJJJJLLJJJJJJJJJJJJJJJJJD..." "...JJJJJLLJJJJJJJJJJJJJJJJJJ..." "...JJJJJLJJJJJJJJJJJJJJJJJJJ..." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "..DJJJJJJJJJJJJJJJJJJJJJJJJJD.." "...JJJJJJJJJJJJJJJJJJJJJJJJJ..." "...JJJJJJJJJJJJJJJJJJJJJJJJJ..." "...DJJJJJJJJJJJJJJJJJJJJJJJD..." "....JJJJJJJJJJJJJJJJJJJJJJJ...." "....DJJJJJJJJJJJJJJJJJJJJJD...." ".....DJJJJJJJJJJJJJJJJJJJD....." "......DJJJJJJJJJJJJJJJJJD......" ".......DJJJJJJJJJJJJJJJD......." "........DJJJJJJJJJJJJJD........" "..........DJJJJJJJJJD.........." ".............DDDDD............." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." ".............EEEEE............." "..........EKKKKKKKKKE.........." "........EKKKKKKKKKKKKKE........" ".......EKKKKKKKKKKKKKKKE......." "......EKKKKKKKKKKKKKKKKKE......" ".....EKKKKKKKKKKKKKKKKKKKE....." "....EKKKKKLLKKKKKKKKKKKKKKE...." "....KKKKKLLKKKKKKKKKKKKKKKK...." "...EKKKKLLKKKKKKKKKKKKKKKKKE..." "...KKKKKLLKKKKKKKKKKKKKKKKKK..." "...KKKKKLKKKKKKKKKKKKKKKKKKK..." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "..EKKKKKKKKKKKKKKKKKKKKKKKKKE.." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...KKKKKKKKKKKKKKKKKKKKKKKKK..." "...EKKKKKKKKKKKKKKKKKKKKKKKE..." "....KKKKKKKKKKKKKKKKKKKKKKK...." "....EKKKKKKKKKKKKKKKKKKKKKE...." ".....EKKKKKKKKKKKKKKKKKKKE....." "......EKKKKKKKKKKKKKKKKKE......" ".......EKKKKKKKKKKKKKKKE......." "........EKKKKKKKKKKKKKE........" "..........EKKKKKKKKKE.........." ".............EEEEE............." "..............................." "..............................." /* icon for state 5 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAFIIIIIIIIIFAAAAAAAAAA" "AAAAAAAAFIIIIIIIIIIIIIFAAAAAAAA" "AAAAAAAFIIIIIIIIIIIIIIIFAAAAAAA" "AAAAAAFIIIIIIIIIIIIIIIIIFAAAAAA" "AAAAAFIIIIIIIIIIIIIIIIIIIFAAAAA" "AAAAFIIIIILLIIIIIIIIIIIIIIFAAAA" "AAAAIIIIILLIIIIIIIIIIIIIIIIAAAA" "AAAFIIIILLIIIIIIIIIIIIIIIIIFAAA" "AAAIIIIILLIIIIIIIIIIIIIIIIIIAAA" "AAAIIIIILIIIIIIIIIIIIIIIIIIIAAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAFIIIIIIIIIIIIIIIIIIIIIIIIIFAA" "AAAIIIIIIIIIIIIIIIIIIIIIIIIIAAA" "AAAIIIIIIIIIIIIIIIIIIIIIIIIIAAA" "AAAFIIIIIIIIIIIIIIIIIIIIIIIFAAA" "AAAAIIIIIIIIIIIIIIIIIIIIIIIAAAA" "AAAAFIIIIIIIIIIIIIIIIIIIIIFAAAA" "AAAAAFIIIIIIIIIIIIIIIIIIIFAAAAA" "AAAAAAFIIIIIIIIIIIIIIIIIFAAAAAA" "AAAAAAAFIIIIIIIIIIIIIIIFAAAAAAA" "AAAAAAAAFIIIIIIIIIIIIIFAAAAAAAA" "AAAAAAAAAAFIIIIIIIIIFAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 6 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAGJJJJJJJJJGAAAAAAAAAA" "AAAAAAAAGJJJJJJJJJJJJJGAAAAAAAA" "AAAAAAAGJJJJJJJJJJJJJJJGAAAAAAA" "AAAAAAGJJJJJJJJJJJJJJJJJGAAAAAA" "AAAAAGJJJJJJJJJJJJJJJJJJJGAAAAA" "AAAAGJJJJJLLJJJJJJJJJJJJJJGAAAA" "AAAAJJJJJLLJJJJJJJJJJJJJJJJAAAA" "AAAGJJJJLLJJJJJJJJJJJJJJJJJGAAA" "AAAJJJJJLLJJJJJJJJJJJJJJJJJJAAA" "AAAJJJJJLJJJJJJJJJJJJJJJJJJJAAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAGJJJJJJJJJJJJJJJJJJJJJJJJJGAA" "AAAJJJJJJJJJJJJJJJJJJJJJJJJJAAA" "AAAJJJJJJJJJJJJJJJJJJJJJJJJJAAA" "AAAGJJJJJJJJJJJJJJJJJJJJJJJGAAA" "AAAAJJJJJJJJJJJJJJJJJJJJJJJAAAA" "AAAAGJJJJJJJJJJJJJJJJJJJJJGAAAA" "AAAAAGJJJJJJJJJJJJJJJJJJJGAAAAA" "AAAAAAGJJJJJJJJJJJJJJJJJGAAAAAA" "AAAAAAAGJJJJJJJJJJJJJJJGAAAAAAA" "AAAAAAAAGJJJJJJJJJJJJJGAAAAAAAA" "AAAAAAAAAAGJJJJJJJJJGAAAAAAAAAA" "AAAAAAAAAAAAAGGGGGAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAHKKKKKKKKKHAAAAAAAAAA" "AAAAAAAAHKKKKKKKKKKKKKHAAAAAAAA" "AAAAAAAHKKKKKKKKKKKKKKKHAAAAAAA" "AAAAAAHKKKKKKKKKKKKKKKKKHAAAAAA" "AAAAAHKKKKKKKKKKKKKKKKKKKHAAAAA" "AAAAHKKKKKLLKKKKKKKKKKKKKKHAAAA" "AAAAKKKKKLLKKKKKKKKKKKKKKKKAAAA" "AAAHKKKKLLKKKKKKKKKKKKKKKKKHAAA" "AAAKKKKKLLKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKLKKKKKKKKKKKKKKKKKKKAAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAHKKKKKKKKKKKKKKKKKKKKKKKKKHAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAKKKKKKKKKKKKKKKKKKKKKKKKKAAA" "AAAHKKKKKKKKKKKKKKKKKKKKKKKHAAA" "AAAAKKKKKKKKKKKKKKKKKKKKKKKAAAA" "AAAAHKKKKKKKKKKKKKKKKKKKKKHAAAA" "AAAAAHKKKKKKKKKKKKKKKKKKKHAAAAA" "AAAAAAHKKKKKKKKKKKKKKKKKHAAAAAA" "AAAAAAAHKKKKKKKKKKKKKKKHAAAAAAA" "AAAAAAAAHKKKKKKKKKKKKKHAAAAAAAA" "AAAAAAAAAAHKKKKKKKKKHAAAAAAAAAA" "AAAAAAAAAAAAAHHHHHAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 105 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "..............." "......CCC......" "....CIIIIIC...." "...CIIIIIIIC..." "..CIILIIIIIIC.." "..IILIIIIIIII.." ".CIILIIIIIIIIC." ".CIIIIIIIIIIIC." ".CIIIIIIIIIIIC." "..IIIIIIIIIII.." "..CIIIIIIIIIC.." "...CIIIIIIIC..." "....CIIIIIC...." "......CCC......" "..............." /* icon for state 3 */ "..............." "......DDD......" "....DJJJJJD...." "...DJJJJJJJD..." "..DJJLJJJJJJD.." "..JJLJJJJJJJJ.." ".DJJLJJJJJJJJD." ".DJJJJJJJJJJJD." ".DJJJJJJJJJJJD." "..JJJJJJJJJJJ.." "..DJJJJJJJJJD.." "...DJJJJJJJD..." "....DJJJJJD...." "......DDD......" "..............." /* icon for state 4 */ "..............." "......EEE......" "....EKKKKKE...." "...EKKKKKKKE..." "..EKKLKKKKKKE.." "..KKLKKKKKKKK.." ".EKKLKKKKKKKKE." ".EKKKKKKKKKKKE." ".EKKKKKKKKKKKE." "..KKKKKKKKKKK.." "..EKKKKKKKKKE.." "...EKKKKKKKE..." "....EKKKKKE...." "......EEE......" "..............." /* icon for state 5 */ "AAAAAAAAAAAAAAA" "AAAAAAFFFAAAAAA" "AAAAFIIIIIFAAAA" "AAAFIIIIIIIFAAA" "AAFIILIIIIIIFAA" "AAIILIIIIIIIIAA" "AFIILIIIIIIIIFA" "AFIIIIIIIIIIIFA" "AFIIIIIIIIIIIFA" "AAIIIIIIIIIIIAA" "AAFIIIIIIIIIFAA" "AAAFIIIIIIIFAAA" "AAAAFIIIIIFAAAA" "AAAAAAFFFAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 6 */ "AAAAAAAAAAAAAAA" "AAAAAAGGGAAAAAA" "AAAAGJJJJJGAAAA" "AAAGJJJJJJJGAAA" "AAGJJLJJJJJJGAA" "AAJJLJJJJJJJJAA" "AGJJLJJJJJJJJGA" "AGJJJJJJJJJJJGA" "AGJJJJJJJJJJJGA" "AAJJJJJJJJJJJAA" "AAGJJJJJJJJJGAA" "AAAGJJJJJJJGAAA" "AAAAGJJJJJGAAAA" "AAAAAAGGGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAA" "AAAAAAHHHAAAAAA" "AAAAHKKKKKHAAAA" "AAAHKKKKKKKHAAA" "AAHKKLKKKKKKHAA" "AAKKLKKKKKKKKAA" "AHKKLKKKKKKKKHA" "AHKKKKKKKKKKKHA" "AHKKKKKKKKKKKHA" "AAKKKKKKKKKKKAA" "AAHKKKKKKKKKHAA" "AAAHKKKKKKKHAAA" "AAAAHKKKKKHAAAA" "AAAAAAHHHAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 49 12 1" /* colors */ "A c #009B43" ". c #000000" "C c #3F007F" "D c #404040" "E c #5C5C30" "F c #3F4DA1" "G c #408D61" "H c #5CA951" "I c #7F00FF" "J c #808080" "K c #B9B860" "L c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ "..CCC.." ".CIIIC." "CILIIIC" "CIIIIIC" "CIIIIIC" ".CIIIC." "..CCC.." /* icon for state 3 */ "..DDD.." ".DJJJD." "DJLJJJD" "DJJJJJD" "DJJJJJD" ".DJJJD." "..DDD.." /* icon for state 4 */ "..EEE.." ".EKKKE." "EKLKKKE" "EKKKKKE" "EKKKKKE" ".EKKKE." "..EEE.." /* icon for state 5 */ "AAFFFAA" "AFIIIFA" "FILIIIF" "FIIIIIF" "FIIIIIF" "AFIIIFA" "AAFFFAA" /* icon for state 6 */ "AAGGGAA" "AGJJJGA" "GJLJJJG" "GJJJJJG" "GJJJJJG" "AGJJJGA" "AAGGGAA" /* icon for state 7 */ "AAHHHAA" "AHKKKHA" "HKLKKKH" "HKKKKKH" "HKKKKKH" "AHKKKHA" "AAHHHAA" golly-3.3-src/Rules/BriansBrain.rule0000644000175000017500000000050512060231465014367 00000000000000@RULE BriansBrain @TREE num_states=3 num_neighbors=8 num_nodes=27 1 0 2 0 2 0 0 0 1 1 2 0 2 0 2 0 3 1 3 1 2 2 0 2 3 3 5 3 4 4 6 4 3 5 1 5 4 6 8 6 5 7 9 7 3 1 1 1 4 8 11 8 5 9 12 9 6 10 13 10 4 11 11 11 5 12 15 12 6 13 16 13 7 14 17 14 5 15 15 15 6 16 19 16 7 17 20 17 8 18 21 18 6 19 19 19 7 20 23 20 8 21 24 21 9 22 25 22 golly-3.3-src/Rules/LifeHistory.rule0000644000175000017500000002622212124663564014454 00000000000000@RULE LifeHistory A variant of HistoricalLife with two extra ON states and two extra OFF states, for annotation purposes: state 0: OFF state 1: ON state 2: history/envelope (state=2 if cell was ever ON) state 3: marked ON (may change to OFF but will always remain marked) state 4: marked OFF (may change to ON but will always remain marked) state 5: start ON (becomes a normal marked OFF cell when it dies) state 6: boundary OFF (can never turn on -- can keep subpatterns in a stamp collection from interfering with each other) @TABLE n_states:7 neighborhood:Moore symmetries:rotate8 var a={0,2,4,6} var b={0,2,4,6} var c={0,2,4,6} var d={0,2,4,6} var e={0,2,4,6} var f={0,2,4,6} var g={3,5} var h={0,1,2} var i={0,1,2,3,4,5,6} var j={0,1,2,3,4,5,6} var k={0,1,2,3,4,5,6} var l={0,1,2,3,4,5,6} var m={0,1,2,3,4,5,6} var n={0,1,2,3,4,5,6} var o={0,1,2,3,4,5,6} var p={0,1,2,3,4,5,6} var q={1,3,5} var R={1,3,5} var S={1,3,5} var T={1,3,5} var u={3,4,5} # boundary cell always stays a boundary cell 6,i,j,k,l,m,n,o,p,6 # anything else that touches a boundary cell dies # (using 'u' instead of 'g' below lets gliders survive as blocks) g,6,i,j,k,l,m,n,o,4 1,6,i,j,k,l,m,n,o,2 # marked 3-neighbour birth # (has to be separate from the next section # only to handle the extra 'start' state 5) 4,R,S,T,a,b,c,d,e,3 4,R,S,a,T,b,c,d,e,3 4,R,S,a,b,T,c,d,e,3 4,R,S,a,b,c,T,d,e,3 4,R,S,a,b,c,d,T,e,3 4,R,a,S,b,T,c,d,e,3 4,R,a,S,b,c,T,d,e,3 # marked 3-neighbour survival g,R,S,T,a,b,c,d,e,g g,R,S,a,T,b,c,d,e,g g,R,S,a,b,T,c,d,e,g g,R,S,a,b,c,T,d,e,g g,R,S,a,b,c,d,T,e,g g,R,a,S,b,T,c,d,e,g g,R,a,S,b,c,T,d,e,g # normal 3-neighbour birth h,R,S,T,a,b,c,d,e,1 h,R,S,a,T,b,c,d,e,1 h,R,S,a,b,T,c,d,e,1 h,R,S,a,b,c,T,d,e,1 h,R,S,a,b,c,d,T,e,1 h,R,a,S,b,T,c,d,e,1 h,R,a,S,b,c,T,d,e,1 # 2-neighbour survival q,R,S,a,b,c,d,e,f,q q,R,a,S,b,c,d,e,f,q q,R,a,b,S,c,d,e,f,q q,R,a,b,c,S,d,e,f,q # ON states 3 and 5 go to history state 4 if they don't survive g,i,j,k,l,m,n,o,p,4 # Otherwise ON states die and become the history state q,i,j,k,l,m,n,o,p,2 @COLORS 1 0 255 0 2 0 0 128 3 216 255 216 4 255 0 0 5 255 255 0 6 96 96 96 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 186 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 2 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." /* icon for state 3 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 4 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." /* icon for state 5 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 6 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." XPM /* width height num_colors chars_per_pixel */ "15 90 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 2 */ ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." /* icon for state 3 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 4 */ "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" /* icon for state 5 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 6 */ "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" XPM /* width height num_colors chars_per_pixel */ "7 42 6 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" "F c #E0E0E0" /* icon for state 1 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 2 */ ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." /* icon for state 3 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 4 */ "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" /* icon for state 5 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 6 */ "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" golly-3.3-src/Rules/Worm-1525115.rule0000644000175000017500000001135112140624403013740 00000000000000@RULE Worm-1525115 Paterson's worms (by Dean Hickerson, 11/24/2008) Pattern #322 Sven Kahrkling's notation 1525115 Gardner's notation 1a2b3cbcc4a Final outcome unknown; doesn't finish within 1.4*10^17 steps. Forms almost full regular hexagons at certain times. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1525115 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 5 = gentle left b,0,a0,n,a1,0,12,0,0,5 b,0,a0,0,a1,n,0,9,0,6 b,0,a0,0,a1,0,n,0,15,1 b,13,a0,0,a1,0,0,n,0,2 b,0,a0,10,a1,0,0,0,n,3 b,n,a0,0,a1,16,0,0,0,4 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 2 eaten(02): 1 = gentle right b,n,a0,0,a1,o,12,0,0,1 b,0,a0,n,a1,0,o,9,0,2 b,0,a0,0,a1,n,0,o,15,3 b,13,a0,0,a1,0,n,0,o,4 b,o,a0,10,a1,0,0,n,0,5 b,0,a0,o,a1,16,0,0,n,6 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(024): 5 = gentle left b,n,a0,0,a1,o,12,p,0,5 b,0,a0,n,a1,0,o,9,p,6 b,p,a0,0,a1,n,0,o,15,1 b,13,a0,p,a1,0,n,0,o,2 b,o,a0,10,a1,p,0,n,0,3 b,0,a0,o,a1,16,p,0,n,4 golly-3.3-src/Rules/Perrier.rule0000644000175000017500000002454712124663564013633 00000000000000@RULE Perrier J.-Y. Perrier, M. Sipper, and J. Zahnd "Toward a viable, self-reproducing universal computer" Physica D, vol. 97, pp. 335-352, 1996 Thanks to Gianluca Tempesti for the transition table and the pattern. Two small changes have been made. Firstly a conflicting rule has been removed. This only causes a problem in some packages, where the first applicable rule is used - other packages used the last applicable rule. Secondly a rule has been added to correct what appears to be a rare bug that shows up when trying to write to the first entry on the data tape. Other such cases might exist. Contact: tim.hutton@gmail.com @TABLE # rules: 637 n_states:64 neighborhood:vonNeumann symmetries:none var a={14,15,16} var b={11,12} var c={4,5,6,7,8,9,10} var d={32,33,34,35,36,37,38} var e={0,1,2,14,15,16} var f={32,33,34,35,36,37,38} var g={39,40} var h={39,40} var i={28,29,30,31,41} var j={28,29,30,31,41} var k={4,5,6,7,8} var l={9,10} var m={11,12} var n={2,28,29,30,31,41} var o={11,12} var p={47,48} 1,2,a,2,0,a 0,2,1,2,a,1 a,2,0,2,1,0 1,a,2,0,2,a a,0,2,1,2,0 0,1,2,a,2,1 1,2,0,2,a,a a,2,1,2,0,0 0,2,a,2,1,1 1,1,2,a,2,a 0,a,2,1,2,1 1,2,a,0,2,a 0,1,a,3,2,1 a,1,1,2,0,0 a,2,2,0,1,0 1,2,1,2,a,a a,2,0,1,2,0 1,a,0,3,2,a 0,a,a,2,1,1 a,1,2,0,2,0 0,2,2,1,a,1 0,2,1,a,2,1 a,0,1,3,2,0 1,0,0,2,a,a 1,0,2,a,2,a 1,2,2,2,a,a a,2,2,2,0,1 2,0,0,0,14,1 0,0,0,1,2,2 0,0,0,0,1,2 0,1,0,0,2,2 1,2,2,a,1,a 1,2,a,2,1,a 1,2,2,a,0,a 1,2,a,1,2,a 1,a,2,1,2,a 1,a,1,3,2,a 1,1,1,2,a,a 2,0,0,15,2,17 0,17,2,1,a,1 17,0,0,0,2,2 2,0,15,2,0,17 0,2,1,a,17,1 17,0,0,2,0,2 1,17,2,2,15,15 17,0,0,15,2,1 15,17,2,2,0,1 0,0,0,1,0,2 0,0,0,2,1,2 1,1,2,2,a,a 1,2,2,a,2,a a,1,2,2,0,0 2,0,0,14,0,1 14,2,2,0,2,1 0,a,2,2,1,1 0,0,1,2,0,2 1,0,2,2,a,a 15,2,2,0,2,1 1,2,2,15,17,15 17,0,15,2,0,1 15,2,2,0,17,1 0,0,2,1,0,2 0,0,1,0,0,2 1,2,a,2,2,a 2,0,14,0,0,1 14,2,0,2,2,1 0,1,2,0,0,2 2,15,2,0,0,17 15,2,0,2,2,1 1,2,15,17,2,15 17,15,2,0,0,1 15,2,0,17,2,1 0,2,1,0,0,2 0,1,0,0,0,2 1,a,2,2,2,a 2,14,0,0,0,1 14,0,2,2,2,1 0,2,0,0,1,2 0,1,0,2,0,2 2,14,0,2,0,17 2,17,2,0,2,1 17,1,0,2,0,1 0,2,1,2,0,2 1,1,0,2,14,0 1,2,0,2,0,16 0,2,0,2,1,18 18,2,0,2,1,2 1,14,18,1,2,19 1,19,2,0,2,19 19,0,2,1,2,0 0,1,2,19,2,1 18,2,0,2,14,2 14,2,18,2,0,18 0,1,16,2,18,1 1,19,0,2,2,19 2,0,2,18,2,0 18,2,2,2,1,0 1,2,18,2,14,18 2,19,2,0,2,20 1,2,0,2,19,14 19,0,1,2,2,0 0,14,18,2,1,1 2,18,2,2,2,18 18,2,0,2,0,2 0,1,a,20,2,1 2,1,18,b,2,18 18,2,2,2,2,2 a,1,2,18,0,0 18,15,2,b,2,2 2,0,18,2,2,18 2,18,0,2,b,21 1,2,0,18,a,a 18,1,2,2,2,2 2,a,18,0,2,18 0,2,a,18,1,1 18,0,2,0,2,2 2,1,18,0,2,18 2,16,0,0,2,20 18,1,2,0,2,2 0,a,2,20,1,1 1,a,0,20,2,a a,0,1,20,2,0 1,0,2,20,a,a a,1,2,20,0,0 a,2,1,18,0,0 18,a,2,0,2,2 2,0,18,2,3,18 18,1,2,2,3,2 2,18,0,2,c,18 18,2,0,2,4,32 18,2,0,2,5,33 18,2,0,2,6,34 18,2,0,2,7,35 18,2,0,2,8,36 18,2,0,2,9,37 18,2,0,2,10,38 18,d,0,2,6,34 18,d,0,2,5,33 18,d,0,2,7,35 18,d,0,2,8,36 18,d,0,2,9,37 18,d,0,2,10,38 d,2,0,18,c,2 2,e,2,d,3,d 1,2,0,d,a,a d,e,2,2,3,2 2,e,2,0,d,d 2,f,0,d,c,d d,e,2,0,2,2 2,e,f,d,3,d d,2,0,2,c,2 2,e,f,0,d,d 0,2,e,d,1,1 2,e,2,2,d,d a,2,1,d,0,0 1,a,1,20,2,a d,e,2,2,2,2 2,e,2,b,d,d 2,2,2,21,d,d d,e,2,b,2,2 1,0,2,d,a,a 2,e,f,2,d,d 2,18,0,0,c,18 d,2,2,21,2,2 2,e,f,b,d,d 18,f,0,0,6,34 18,f,0,0,4,32 18,f,0,0,5,33 18,f,0,0,7,35 18,f,0,0,8,36 18,f,0,0,9,37 18,f,0,0,10,38 2,2,f,21,d,d 0,20,0,0,0,22 2,2,20,0,d,d d,2,20,0,2,2 0,d,22,0,0,d 0,a,2,d,1,1 a,1,2,d,0,0 2,2,20,f,d,d 22,20,0,0,32,4 22,20,0,0,33,5 22,20,0,0,34,6 22,20,0,0,35,7 22,20,0,0,36,8 22,20,0,0,37,9 22,20,0,0,38,10 d,2,22,0,0,2 0,2,0,0,c,2 0,c,0,0,0,22 2,d,c,0,0,d d,2,20,2,2,2 d,2,c,0,0,2 22,c,0,0,34,6 22,c,0,0,33,5 22,c,0,0,32,4 22,c,0,0,35,7 22,c,0,0,36,8 22,c,0,0,37,9 22,c,0,0,38,10 2,d,c,f,0,d 1,1,2,20,14,14 d,2,c,2,0,2 d,2,0,0,c,23 d,2,0,23,c,23 23,d,0,0,c,2 23,d,0,2,c,2 d,e,2,23,3,23 23,e,d,2,3,2 d,e,2,0,23,23 23,e,d,0,2,2 d,e,2,2,23,23 23,e,d,2,2,2 d,e,2,b,23,23 23,e,d,b,2,2 d,2,2,21,23,23 23,2,d,21,2,2 d,2,20,2,23,23 d,23,c,2,0,23 23,2,20,d,2,2 23,2,c,d,0,2 d,23,c,0,0,23 d,23,22,0,0,23 0,23,22,0,0,23 23,2,c,23,0,2 23,23,22,0,0,0 22,c,0,0,23,2 21,23,0,2,b,24 24,2,0,2,12,40 24,2,0,2,11,39 2,24,0,2,b,24 2,2,2,g,2,g g,2,0,24,b,2 24,g,0,2,11,39 24,g,0,2,12,40 2,0,2,0,g,g g,2,2,2,2,2 2,h,0,g,b,g g,0,2,0,2,2 2,2,h,g,2,g g,2,0,2,b,2 1,14,1,2,2,14 2,e,2,c,g,g 2,0,h,0,g,g a,0,1,2,2,0 2,e,2,2,g,g g,0,2,c,2,2 2,2,h,2,g,g 0,1,a,g,2,1 2,24,0,0,b,24 2,e,2,0,g,g g,0,2,2,2,2 0,2,a,g,1,1 2,1,h,c,g,g 24,g,0,0,12,40 24,g,0,0,11,39 1,a,0,2,2,a 2,1,h,2,g,g g,a,2,c,2,2 40,2,0,0,12,13 39,2,0,0,11,13 2,1,h,0,g,g g,a,2,2,2,2 a,2,1,g,0,0 0,1,a,2,2,1 2,0,h,c,g,g g,2,0,13,b,13 13,g,0,0,b,2 g,a,2,0,2,2 2,0,h,2,g,g g,1,2,c,2,2 1,a,0,g,2,a 13,g,0,2,b,2 2,e,20,0,g,g g,1,2,2,2,2 1,2,0,g,a,a 2,a,h,c,g,g 0,g,22,0,0,g g,e,20,0,2,2 g,1,2,0,2,2 2,a,h,2,g,g 22,20,0,0,40,12 22,20,0,0,39,11 g,2,22,0,0,2 2,e,20,h,g,g 2,a,h,0,g,g a,0,1,g,2,0 0,0,0,0,b,2 0,b,0,0,0,22 2,g,b,0,0,g g,e,20,2,2,2 g,2,b,0,0,2 g,2,2,13,2,13 g,0,2,0,13,13 13,2,g,2,2,2 2,e,13,b,2,13 2,g,b,h,0,g 2,g,22,0,0,g g,2,b,2,0,2 g,2,2,2,13,13 13,0,g,0,2,0 22,b,0,0,39,11 22,b,0,0,40,12 0,2,0,0,b,2 13,e,2,b,2,2 2,e,13,2,2,13 0,a,2,13,1,1 13,2,g,2,0,2 a,2,1,13,0,0 13,e,2,2,2,2 2,e,13,0,2,13 2,13,b,2,0,25 g,e,2,2,3,3 13,e,2,0,2,2 1,2,0,13,a,a 25,2,b,2,0,26 g,e,2,0,3,3 3,e,g,2,3,2 0,2,26,0,0,25 26,2,b,2,0,2 0,2,a,13,1,1 3,e,g,0,2,2 2,e,13,2,3,13 13,e,2,2,3,2 2,13,0,2,c,25 g,e,20,2,3,3 1,2,0,3,a,a g,3,b,2,0,23 20,e,0,b,3,3 3,e,20,g,2,2 0,2,0,2,3,3 3,e,0,b,2,2 g,23,b,2,0,23 23,2,b,g,0,2 1,0,2,3,a,a 2,2,0,3,e,26 3,2,0,2,2,2 0,a,26,2,1,1 a,1,26,2,0,0 g,23,11,0,0,23 g,23,22,0,0,23 22,b,0,0,23,2 23,2,b,23,0,2 1,1,26,2,14,14 1,0,26,2,14,14 1,0,26,2,15,15 1,0,26,2,16,17 1,0,2,17,2,14 17,1,26,2,0,0 0,2,17,2,1,1 26,2,0,2,17,27 27,2,0,2,0,1 0,14,27,2,1,1 0,0,0,0,27,17 1,0,1,2,14,14 1,2,17,2,14,14 14,2,17,2,0,1 17,0,0,0,14,27 27,0,0,0,1,1 1,2,17,2,15,15 17,0,0,0,15,1 15,2,17,2,0,27 17,0,0,27,2,2 0,0,0,1,17,2 27,17,1,2,1,1 1,2,27,2,15,14 25,2,0,2,4,28 25,2,0,2,5,29 25,2,0,2,6,30 25,2,0,2,7,31 25,2,0,2,8,41 2,e,2,i,3,i i,2,0,25,c,2 25,i,0,2,4,28 25,i,0,2,5,29 25,i,0,2,6,30 25,i,0,2,7,31 25,i,0,2,8,41 a,2,1,i,0,0 2,e,2,0,i,i 2,j,0,i,c,i i,e,2,0,2,2 2,e,j,i,3,i i,2,0,2,c,2 1,2,0,i,a,a i,e,2,2,3,2 2,e,j,0,i,i 2,25,0,2,k,25 2,25,0,2,l,42 i,2,0,42,8,2 2,e,2,25,i,i 2,e,2,2,28,28 i,e,2,25,2,2 2,e,2,2,29,29 2,e,2,2,30,30 2,e,2,2,31,43 2,e,2,2,41,41 0,2,a,i,1,1 2,e,j,25,i,i i,e,2,2,2,2 43,e,2,2,2,2 2,28,b,2,25,44 44,2,b,2,25,2 b,2,2,m,44,11 2,e,2,44,30,30 2,e,2,44,28,28 2,e,2,44,29,29 2,e,2,44,31,43 2,e,2,44,41,41 2,30,b,2,25,45 25,n,45,0,0,45 45,2,b,2,25,2 2,e,2,45,29,29 2,e,2,45,28,28 2,e,2,45,30,30 2,e,2,45,31,43 2,e,2,45,41,41 2,e,j,45,i,i 2,i,b,2,45,i 45,n,2,0,0,0 0,45,2,0,0,25 2,e,2,j,28,28 2,e,2,j,29,29 2,e,2,j,30,30 2,e,2,j,31,43 2,e,2,j,41,41 i,2,b,2,0,2 2,29,b,2,25,46 a,2,1,43,0,0 b,m,2,o,46,12 46,2,b,2,25,2 2,e,43,0,i,i 2,43,b,46,0,31 2,28,b,46,0,28 2,29,b,46,0,29 2,30,b,46,0,30 2,41,b,46,0,41 0,n,31,25,0,25 25,25,2,0,0,0 2,41,12,2,25,48 2,41,11,2,25,47 47,2,11,2,25,2 48,2,11,2,25,2 2,e,2,p,2,p 0,2,a,p,1,1 p,e,2,2,2,2 2,e,p,25,2,p a,2,1,p,0,0 p,e,2,25,2,2 2,e,p,0,2,p 1,2,0,p,a,a p,e,2,0,2,2 2,e,p,2,3,p p,e,2,2,3,2 2,p,0,2,c,p p,2,0,2,c,2 2,p,0,42,c,p p,2,0,42,c,2 42,47,0,2,c,49 49,2,0,2,c,2 2,49,0,2,l,49 2,49,0,2,k,25 2,2,0,i,c,i 2,25,0,0,c,25 25,i,0,0,6,30 25,i,0,0,5,29 25,i,0,0,4,28 25,i,0,0,7,31 25,i,0,0,8,41 i,2,0,0,c,2 25,0,45,0,0,45 2,i,b,45,0,i 45,0,2,0,0,0 2,i,b,j,0,i 20,e,2,c,23,2 2,30,b,0,25,50 25,0,50,0,0,0 50,2,b,0,25,2 0,50,2,0,0,50 2,i,b,50,0,i 0,0,50,0,0,25 50,2,2,0,0,2 2,b,0,0,50,11 0,50,22,0,0,50 0,50,0,0,0,51 0,b,0,0,51,2 51,2,0,0,0,0 2,41,11,51,25,47 2,41,12,51,25,48 2,32,b,51,25,44 2,33,b,51,25,46 2,30,b,51,25,50 2,43,b,45,0,31 2,43,b,i,0,31 0,0,31,25,0,25 2,e,43,25,31,31 2,43,b,2,25,52 0,2,a,43,1,1 1,2,0,43,a,a 2,e,2,52,31,43 2,e,2,52,28,28 2,e,2,52,29,29 2,e,2,52,30,30 2,52,b,2,0,53 53,52,b,2,0,52 2,53,b,2,0,53 52,52,b,53,0,25 52,25,b,53,0,2 52,2,b,53,0,2 2,53,b,0,0,53 0,53,2,0,0,53 53,52,b,0,0,52 2,b,0,0,53,b 53,52,2,0,0,2 b,m,2,2,52,53 0,53,0,0,0,52 0,b,0,0,52,2 52,2,0,0,0,0 53,b,2,m,2,b b,m,2,53,2,53 b,m,2,53,25,53 53,b,2,m,25,b b,2,2,53,52,53 53,2,2,b,52,11 52,43,53,25,25,53 25,53,b,2,0,2 53,i,11,25,25,2 53,43,11,25,25,2 43,e,2,2,i,2 i,e,2,2,j,2 1,2,1,i,14,14 1,2,1,43,14,14 i,e,2,25,j,2 i,e,2,0,j,2 52,2,53,25,25,53 53,2,11,25,25,2 g,e,2,c,13,3 1,2,1,f,14,14 1,2,0,23,a,a 1,0,2,23,a,a 1,2,1,13,14,14 i,e,2,j,3,2 2,e,43,25,i,i i,2,0,j,c,2 52,i,53,25,25,53 1,14,1,g,2,14 1,2,1,g,14,14 1,0,2,13,a,a a,2,1,3,0,0 a,1,2,3,0,0 48,2,12,2,25,2 42,48,0,2,10,55 55,2,0,2,10,54 2,55,0,2,10,55 55,54,0,2,10,54 54,54,0,56,c,2 2,57,0,2,k,56 57,2,0,2,c,2 2,54,0,57,c,54 54,54,0,2,c,2 2,54,0,56,c,54 2,54,0,54,c,54 54,2,0,2,c,2 2,55,0,2,k,56 56,54,0,2,c,57 56,2,0,2,k,58 54,2,0,58,k,2 58,54,0,2,l,57 58,2,0,2,k,25 2,2,b,p,0,p p,2,b,2,0,2 42,48,0,2,9,59 2,2,0,59,8,59 60,2,0,2,c,2 2,59,0,60,c,60 2,60,0,60,c,60 61,2,0,2,c,2 #2,2,0,61,c,59 - this rule is overwritten by later rules 59,2,0,2,l,2 2,61,0,60,c,60 59,2,0,2,k,62 62,2,0,60,k,61 60,62,0,2,c,2 2,59,0,2,10,63 2,59,0,63,c,60 2,63,0,2,10,63 63,2,0,2,10,2 2,60,0,63,c,60 62,2,0,2,c,25 2,i,b,2,0,i 2,41,12,0,25,48 2,41,11,0,25,47 48,2,12,0,25,2 47,2,11,0,25,2 2,43,b,2,0,31 g,23,b,0,0,23 18,d,0,2,4,32 2,57,0,2,l,57 58,54,0,2,k,57 57,54,0,2,c,2 54,2,0,58,l,2 0,2,a,23,1,1 0,a,2,23,1,1 a,1,2,13,0,0 2,57,0,0,k,56 56,2,0,0,k,58 58,54,0,0,k,2 0,2,a,3,1,1 58,2,0,0,k,25 25,2,0,0,6,30 25,2,0,0,5,29 25,2,0,0,4,28 25,2,0,0,7,31 25,2,0,0,8,41 2,2,0,61,k,59 2,2,0,61,l,61 0,a,2,3,1,1 2,63,0,0,10,63 63,2,0,0,10,2 b,m,2,o,44,11 b,2,2,m,46,12 2,43,b,44,0,31 2,28,b,44,0,28 2,29,b,44,0,29 2,30,b,44,0,30 2,31,b,44,0,31 2,41,b,44,0,41 a,2,1,23,0,0 a,1,2,23,0,0 1,2,1,p,14,14 2,29,b,0,25,46 46,2,b,0,25,2 b,m,2,2,46,12 b,m,2,2,44,11 2,28,b,0,25,44 44,2,12,0,25,2 2,e,2,52,41,41 2,e,2,46,i,i # rule added by TJH to correct an apparent bug @COLORS 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 9 159 116 187 10 255 135 128 11 184 25 181 12 235 199 185 13 187 40 166 14 99 110 94 15 226 149 86 16 52 181 122 17 221 138 196 18 97 152 80 19 57 189 164 20 252 38 183 21 211 148 59 22 59 241 164 23 203 170 40 24 222 164 132 25 162 204 172 26 179 133 87 27 55 203 233 28 92 71 22 29 188 231 154 30 145 96 127 31 112 205 26 32 40 94 120 33 28 29 23 34 31 70 253 35 29 80 34 36 174 45 190 37 143 50 251 38 227 98 100 39 41 115 190 40 167 65 28 41 243 50 195 42 104 21 68 43 40 30 20 44 73 82 194 45 176 35 168 46 216 102 181 47 90 199 188 48 83 70 120 49 211 218 78 50 174 115 98 51 205 183 158 52 179 112 83 53 220 158 134 54 80 190 199 55 108 218 146 56 45 94 219 57 211 176 68 58 246 20 49 59 91 92 85 60 188 165 228 61 71 246 39 62 232 202 95 63 169 99 242 golly-3.3-src/Rules/CrittersMargolus_emulated.rule0000644000175000017500000000670712060231465017400 00000000000000@RULE CrittersMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=132 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 4 2 2 4 1 0 4 2 4 4 2 0 1 21 1 22 2 0 1 22 1 0 3 2 3 23 3 24 4 25 7 25 7 25 5 26 10 26 10 26 1 0 2 2 2 4 2 0 1 22 1 28 2 0 1 28 1 28 3 2 3 29 3 30 4 31 7 31 7 31 5 32 10 32 10 32 6 15 20 27 20 33 5 10 10 10 10 10 6 20 20 35 20 35 3 2 3 2 3 2 1 0 1 4 3 2 1 0 1 4 3 4 2 1 1 38 1 39 3 40 40 3 40 3 2 1 1 39 1 1 3 42 42 3 42 3 4 37 41 37 43 37 5 44 10 44 10 44 4 25 41 25 43 25 5 46 10 46 10 46 4 31 41 31 43 31 5 48 10 48 10 48 6 45 35 47 35 49 1 0 1 2 3 2 2 1 1 39 1 51 3 52 52 3 52 3 2 1 1 51 1 51 3 54 54 3 54 3 4 37 53 37 55 37 5 56 10 56 10 56 4 25 53 25 55 25 5 58 10 58 10 58 4 31 53 31 55 31 5 60 10 60 10 60 6 57 35 59 35 61 7 34 36 50 36 62 6 35 35 35 35 35 7 36 36 64 36 64 4 37 7 37 7 37 2 38 38 1 38 1 2 39 39 1 39 1 3 3 3 67 3 68 4 69 7 69 7 69 3 3 3 68 3 3 4 71 7 71 7 71 5 66 70 66 72 66 5 26 70 26 72 26 5 32 70 32 72 32 6 73 35 74 35 75 5 44 70 44 72 44 5 46 70 46 72 46 5 48 70 48 72 48 6 77 35 78 35 79 5 56 70 56 72 56 5 58 70 58 72 58 5 60 70 60 72 60 6 81 35 82 35 83 7 76 64 80 64 84 2 51 51 1 51 1 3 3 3 68 3 86 4 87 7 87 7 87 3 3 3 86 3 86 4 89 7 89 7 89 5 66 88 66 90 66 5 26 88 26 90 26 5 32 88 32 90 32 6 91 35 92 35 93 5 44 88 44 90 44 5 46 88 46 90 46 5 48 88 48 90 48 6 95 35 96 35 97 5 56 88 56 90 56 5 58 88 58 90 58 5 60 88 60 90 60 6 99 35 100 35 101 7 94 64 98 64 102 8 63 65 85 65 103 1 0 1 3 3 1 2 105 1 105 1 105 3 106 3 106 3 106 1 0 1 3 3 3 2 108 1 108 1 108 3 109 3 109 3 109 4 18 7 107 7 110 4 18 7 110 7 18 5 19 10 111 10 112 6 113 113 35 113 35 7 114 114 64 114 64 7 64 64 64 64 64 8 115 115 116 115 116 5 66 10 66 10 66 6 118 35 27 35 33 7 119 64 50 64 62 8 120 116 85 116 103 1 0 1 1 3 1 2 122 1 122 1 122 3 123 3 123 3 123 4 18 7 110 7 124 4 18 7 124 7 124 5 19 10 125 10 126 6 127 127 35 127 35 7 128 128 64 128 64 8 129 129 116 129 116 9 104 117 121 130 121 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 5 127 0 255 6 88 0 178 7 148 148 148 8 103 103 103 9 128 255 0 10 89 178 0 11 255 0 128 12 178 0 89 13 0 128 255 14 0 89 178 15 1 159 0 16 0 111 0 17 159 0 1 18 111 0 0 19 255 254 96 20 178 177 67 21 0 1 159 22 0 0 111 23 96 255 254 24 67 178 177 25 254 96 255 26 177 67 178 27 126 125 21 28 88 87 14 29 21 126 125 30 14 88 87 31 125 21 126 32 87 14 88 33 255 116 116 34 178 81 81 35 116 255 116 36 81 178 81 37 116 116 255 38 81 81 178 39 228 227 0 40 159 158 0 41 28 255 27 42 19 178 18 43 255 27 28 44 178 18 19 45 0 228 227 46 0 159 158 47 227 0 228 48 158 0 159 49 27 28 255 50 18 19 178 51 59 59 59 52 41 41 41 53 234 195 176 54 163 136 123 55 175 196 255 56 122 137 178 57 171 194 68 58 119 135 47 59 194 68 171 60 135 47 119 61 68 171 194 62 47 119 135 63 72 184 71 64 50 128 49 65 184 71 72 66 128 49 50 67 71 72 184 68 49 50 128 69 169 255 188 70 118 178 131 71 252 179 63 72 176 125 44 73 63 252 179 74 44 176 125 75 179 63 252 76 125 44 176 77 80 9 0 78 56 6 0 79 0 80 9 80 0 56 6 81 9 0 80 82 6 0 56 83 255 175 250 84 178 122 175 85 199 134 213 86 139 93 149 87 115 100 95 88 80 70 66 89 188 163 0 90 131 114 0 91 0 188 163 92 0 131 114 93 163 0 188 94 114 0 131 95 203 73 0 96 142 51 0 97 0 203 73 98 0 142 51 99 73 0 203 100 51 0 142 101 94 189 0 102 65 132 0 103 189 0 94 104 132 0 65 golly-3.3-src/Rules/HPPMargolus_emulated.rule0000644000175000017500000000426112060231465016221 00000000000000@RULE HPPMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=132 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 2 2 2 4 2 0 1 21 1 21 1 0 4 2 2 4 2 0 1 21 1 23 3 2 3 22 3 24 4 25 7 25 7 25 5 26 10 26 10 26 1 0 4 2 4 4 2 0 1 23 1 28 2 0 1 28 1 28 3 2 3 29 3 30 4 31 7 31 7 31 5 32 10 32 10 32 6 15 20 27 20 33 5 10 10 10 10 10 6 20 20 35 20 35 3 2 3 2 3 2 1 0 1 2 3 2 2 1 1 38 1 38 3 39 39 3 39 3 1 0 1 4 3 2 2 1 1 38 1 41 3 42 42 3 42 3 4 37 40 37 43 37 5 44 10 44 10 44 4 25 40 25 43 25 5 46 10 46 10 46 4 31 40 31 43 31 5 48 10 48 10 48 6 45 35 47 35 49 1 0 1 4 3 4 2 1 1 41 1 51 3 52 52 3 52 3 2 1 1 51 1 51 3 54 54 3 54 3 4 37 53 37 55 37 5 56 10 56 10 56 4 25 53 25 55 25 5 58 10 58 10 58 4 31 53 31 55 31 5 60 10 60 10 60 6 57 35 59 35 61 7 34 36 50 36 62 6 35 35 35 35 35 7 36 36 64 36 64 4 37 7 37 7 37 2 38 38 1 38 1 3 3 3 67 3 67 4 68 7 68 7 68 2 41 41 1 41 1 3 3 3 67 3 70 4 71 7 71 7 71 5 66 69 66 72 66 5 26 69 26 72 26 5 32 69 32 72 32 6 73 35 74 35 75 5 44 69 44 72 44 5 46 69 46 72 46 5 48 69 48 72 48 6 77 35 78 35 79 5 56 69 56 72 56 5 58 69 58 72 58 5 60 69 60 72 60 6 81 35 82 35 83 7 76 64 80 64 84 2 51 51 1 51 1 3 3 3 70 3 86 4 87 7 87 7 87 3 3 3 86 3 86 4 89 7 89 7 89 5 66 88 66 90 66 5 26 88 26 90 26 5 32 88 32 90 32 6 91 35 92 35 93 5 44 88 44 90 44 5 46 88 46 90 46 5 48 88 48 90 48 6 95 35 96 35 97 5 56 88 56 90 56 5 58 88 58 90 58 5 60 88 60 90 60 6 99 35 100 35 101 7 94 64 98 64 102 8 63 65 85 65 103 1 0 1 1 3 1 2 105 1 105 1 105 3 106 3 106 3 106 4 18 7 107 7 107 1 0 1 3 3 1 2 109 1 109 1 109 3 110 3 110 3 110 4 18 7 107 7 111 5 19 10 108 10 112 6 113 113 35 113 35 7 114 114 64 114 64 7 64 64 64 64 64 8 115 115 116 115 116 5 66 10 66 10 66 6 118 35 27 35 33 7 119 64 50 64 62 8 120 116 85 116 103 1 0 1 3 3 3 2 122 1 122 1 122 3 123 3 123 3 123 4 18 7 111 7 124 4 18 7 124 7 124 5 19 10 125 10 126 6 127 127 35 127 35 7 128 128 64 128 64 8 129 129 116 129 116 9 104 117 121 130 121 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 golly-3.3-src/Rules/SDSR-Loop.rule0000644000175000017500000003531112124663564013674 00000000000000@RULE SDSR-Loop Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" Note that the transition table given in the above link is incomplete (it's the original Langton's Loops one), and is patched by the function set_undefined_rule(). The table below has these changes incorporated, and was produced automatically by a bottom-up merging procedure from the full 9^5 rule table. Tim Hutton @TABLE # rules: 142 # variables: 123 # format: CNESWC' # # Variables are bound within each transition. # For example, if a={1,2} then 4,a,0->a represents # two transitions: 4,1,0->1 and 4,2,0->2 n_states:9 neighborhood:vonNeumann symmetries:rotate4 var a={0,1,2} var b={0,1} var c={0,1} var d={0,1} var e={2,3} var f={0,1,2,3,4,5,6,7} var g={0,1,2,3,4,6,7} var h={4,6,7} var i={6,7} var j={0,1,2,3,4,5,6,7,8} var k={0,1,2,3,4,5,6,7,8} var l={2,3,4,5,6,7} var m={0,1,2,3,5} var n={0,1,8} var o={1,4,6,7} var p={0,1,3,5} var q={1,2,4,6,7} var r={3,5} var s={2,3,4,5,6} var t={0,3,5} var u={1,3,5} var v={0,5} var w={2,3,5} var x={0,2} var y={1,4,7} var z={0,3,5} var A={0,3,5} var B={0,2,3,4,5} var C={0,2,4,6,7} var D={0,1,2,4,6,7} var E={0,1,2,4,6,7} var F={1,3,4,6,7} var G={0,1,2,3,4,5} var H={0,1,2,3,4} var I={1,2,4} var J={0,3,5,6} var K={0,1,3,4,5,6} var L={1,2,4,6} var M={0,3} var N={0,2,3,5} var O={1,3,4,5,6,7} var P={0,1,3,4} var Q={1,2} var R={2,4,6,7} var S={0,1,2,3,4,5,6} var T={0,1,3,4,5,6,7} var U={1,5} var V={0,1,3,4,5} var W={1,3,5} var X={1,3,5} var Y={0,3,4,5,6} var Z={0,6} var aa={0,6} var ab={1,3} var ac={2,5} var ad={2,3,5} var ae={0,7} var af={2,7} var ag={1,4,6,7,8} var ah={1,3,5} var ai={1,2,3,4,5} var aj={1,4,5,6,7} var ak={1,2,3,5} var al={1,2,3,5} var am={4,7} var an={0,5,6} var ao={0,5,6} var ap={0,5,6} var aq={0,5,6} var ar={0,3} var as={0,3} var at={3,7} var au={2,3,5,8} var av={0,1,2,3,4,5,6,7,8} var aw={0,1,4,5,6,7} var ax={0,1,4,5,6,7} var ay={1,4,6,7} var az={0,1,2,3,4,5,6,7} var aA={2,8} var aB={4,5,6,7} var aC={4,5,6} var aD={0,1,5} var aE={0,1,5} var aF={1,4,5,6,7} var aG={0,1,2,4,5,6,7} var aH={5,6,7} var aI={0,2,3,4,5,6,7} var aJ={0,4,6,7} var aK={2,3,5,7} var aL={1,2,3,4,6,7} var aM={1,2,3,4,5,6,7} var aN={3,4,6,7,8} var aO={1,3,4,5,6,7} var aP={2,4,6,7} var aQ={4,5} var aR={0,1,3,4,6,7} var aS={4,6,7,8} var aT={1,2,4,6,7} var aU={4,6,8} var aV={1,2,3,4,5,6,7} var aW={1,2,3,4,5,6,7} var aX={1,2,3,4,5,6,7} var aY={0,3,7} var aZ={0,1,2,3} var ba={0,3,4,5,6,7} var bb={5,8} var bc={0,1,7} var bd={0,1,3,7} var be={1,2,7} var bf={1,3,6,7} var bg={0,1,2,3,7} var bh={3,6} var bi={5,6} var bj={2,3,4,5,6,7} var bk={2,3,4,5,6,7} var bl={2,3,4,5,6,7} var bm={6,8} var bn={6,7,8} var bo={3,4,6,7} var bp={1,6} var bq={0,1,4,6,7} var br={0,1,2,3,4,5,6,7} var bs={0,1,2,3,4,5,6,7} 0,0,0,a,1,2 0,0,0,0,6,3 0,b,c,d,7,1 0,0,0,1,e,2 0,f,g,1,h,1 0,0,0,2,i,2 b,j,k,l,8,8 0,m,f,h,1,1 0,0,0,5,2,5 0,0,0,i,2,2 b,f,n,8,l,8 0,m,1,f,o,1 0,0,1,0,2,2 0,p,1,q,r,1 0,m,1,s,2,1 b,c,l,d,8,8 0,t,2,1,u,1 0,v,2,1,2,5 0,0,2,w,1,1 0,0,2,3,2,2 0,0,r,1,q,1 0,0,r,2,1,1 0,0,5,2,2,2 x,1,q,3,f,1 0,1,7,2,5,5 0,2,5,2,7,1 y,t,z,A,B,8 1,C,D,E,7,7 F,A,t,f,r,8 1,G,H,I,4,4 1,J,K,L,6,6 1,M,p,N,w,8 O,A,t,3,f,8 1,m,P,4,Q,4 F,0,A,5,R,8 1,S,K,6,L,6 1,f,T,7,q,7 U,M,u,m,w,8 1,p,I,A,4,4 1,A,L,V,6,6 u,A,W,w,X,8 1,p,q,f,7,7 1,p,L,7,Y,7 1,Z,2,aa,2,6 1,A,w,U,W,8 ab,N,w,ac,ad,8 1,0,2,2,6,3 1,ae,af,3,2,7 1,B,2,6,W,6 1,0,2,6,4,4 ag,0,2,7,1,0 O,A,r,v,D,8 1,b,s,L,7,7 1,p,5,I,4,4 1,A,5,4,1,4 1,x,5,4,2,7 1,0,7,r,L,7 O,W,X,u,ah,8 1,1,Q,2,7,7 ab,m,Q,5,x,8 1,ai,2,6,4,6 aj,ak,5,ad,al,8 1,W,5,4,2,4 1,2,ad,2,6,6 1,2,am,2,5,5 1,2,4,2,6,7 ad,an,ao,ap,aq,8 2,M,ar,as,at,1 au,j,k,av,8,0 ad,aw,ax,o,ay,8 2,f,az,O,3,1 aA,x,0,2,5,0 2,aw,x,3,aj,1 2,a,0,3,2,6 2,0,0,4,2,3 ad,aw,ax,aB,aC,8 2,0,0,5,1,7 2,0,b,5,aC,8 2,x,0,5,7,5 ad,aD,aj,aE,aF,8 2,0,O,x,3,1 2,0,2,0,7,3 2,aG,l,2,3,1 af,0,2,3,2,1 2,0,3,2,aB,1 2,0,3,aH,2,1 2,0,5,5,2,1 2,1,1,2,6,1 3,0,0,Z,2,2 3,aI,az,f,r,8 3,x,0,0,4,1 3,0,0,0,7,6 3,D,aJ,aK,aL,8 3,v,1,0,2,1 3,az,aM,F,aL,8 aN,0,1,2,2,0 r,T,O,az,aO,8 3,0,R,0,aP,8 aQ,A,0,v,aR,8 h,av,j,k,8,1 aS,0,aw,q,aT,0 aS,0,ay,A,aT,0 aU,0,aT,q,O,0 aU,0,2,aw,aT,0 aS,0,2,aM,ay,0 4,0,e,2,2,1 4,0,2,3,2,6 aS,0,e,ay,aT,0 aS,0,3,2,ay,0 am,aM,aV,aW,aX,8 5,aY,0,0,2,2 5,aZ,T,F,az,8 5,az,ba,e,aC,8 bb,0,0,5,2,0 5,b,2,bc,2,2 5,0,e,bd,h,8 5,v,e,be,bf,8 5,0,2,1,5,2 bb,b,2,2,2,0 5,0,2,2,4,4 5,0,2,af,5,8 5,bg,2,bh,2,8 5,1,2,4,2,2 bi,l,bj,bk,bl,8 6,0,0,0,aJ,8 6,0,0,0,Q,1 i,0,0,5,1,8 bm,0,2,e,2,0 bn,0,3,2,2,0 6,O,aF,aM,bj,8 6,1,2,Q,2,5 6,1,2,1,3,1 6,1,e,bo,2,8 6,1,3,2,2,8 7,0,0,0,bp,8 7,0,ay,aT,r,0 7,0,2,bq,2,0 7,0,2,ay,r,0 7,0,2,2,ac,1 7,0,2,2,3,0 7,0,2,5,2,5 8,az,f,br,bs,0 @TREE num_states=9 num_neighbors=4 num_nodes=339 1 0 8 8 8 8 8 8 8 0 1 2 1 2 3 8 8 1 8 0 1 0 8 2 2 8 2 1 8 0 1 0 8 1 8 8 8 8 8 0 1 0 8 2 1 8 8 8 8 0 1 3 1 8 8 8 8 8 8 0 1 1 7 1 6 8 8 8 7 0 1 0 1 0 0 1 0 1 1 0 2 0 1 2 3 4 0 5 6 7 1 2 1 8 8 0 8 0 0 0 1 2 1 2 3 0 8 0 0 0 1 2 8 1 8 8 8 8 8 0 1 1 4 8 8 0 8 0 0 0 1 0 8 2 8 8 8 8 8 0 1 1 6 8 8 0 8 0 0 0 1 1 7 8 8 0 8 0 0 0 2 1 9 10 11 12 13 14 15 7 1 2 1 2 8 0 5 0 0 0 1 0 8 2 8 0 5 0 0 0 1 0 8 2 8 8 2 8 8 0 1 0 4 2 8 0 8 0 0 0 1 0 8 0 8 8 8 8 8 0 1 2 6 2 8 0 8 0 0 0 1 2 7 2 8 0 2 0 0 0 1 8 8 0 0 1 0 1 1 0 2 2 17 18 19 20 21 22 23 24 1 0 8 6 8 8 8 8 8 0 2 3 3 26 3 3 3 3 3 24 1 0 4 3 1 0 8 0 0 0 1 0 4 8 8 0 8 0 0 0 1 0 6 8 8 0 8 0 0 0 1 0 7 8 8 0 8 0 0 0 2 4 12 28 3 29 0 30 31 24 1 0 1 7 8 8 8 8 8 0 1 5 8 2 8 8 0 8 8 0 1 0 8 5 8 8 8 8 8 0 2 0 33 34 3 0 0 0 35 24 1 2 6 2 2 0 8 0 0 0 2 5 14 37 3 30 0 30 31 24 1 2 7 2 8 0 8 0 0 0 2 6 15 39 3 31 0 31 31 24 2 7 7 24 24 24 24 24 24 7 3 8 16 25 27 32 36 38 40 41 2 1 9 17 3 12 33 14 15 7 1 1 1 8 8 0 8 0 0 0 1 1 8 2 8 0 8 0 0 0 1 1 8 1 8 0 8 0 0 0 1 1 8 8 8 0 8 0 0 0 2 44 44 45 46 12 47 14 15 7 1 2 8 2 1 0 8 0 0 0 1 1 1 2 8 0 8 0 0 0 1 1 4 2 8 0 8 0 0 0 1 1 8 2 1 0 8 0 0 0 1 1 6 2 8 0 8 0 0 0 1 1 0 2 8 0 8 0 0 0 2 49 45 50 46 51 52 53 54 24 1 1 8 6 8 0 8 0 0 0 1 1 4 1 8 0 8 0 0 0 1 1 6 1 8 0 8 0 0 0 1 1 7 1 8 0 8 0 0 0 2 3 46 56 3 57 3 58 59 24 2 12 12 51 57 12 12 14 15 24 2 0 47 45 3 12 0 14 15 24 2 14 14 53 58 14 14 14 15 24 1 1 7 2 8 0 8 0 0 0 2 15 15 64 59 15 15 15 15 24 3 43 48 55 60 61 62 63 65 41 2 2 10 18 26 28 34 37 39 24 1 0 8 2 8 0 8 0 0 0 1 1 8 2 0 0 8 0 0 0 2 49 68 69 46 51 45 53 64 24 1 0 6 2 8 0 2 0 0 0 1 5 1 2 8 0 2 0 0 0 1 0 8 2 8 1 0 0 1 0 1 2 7 1 8 6 8 0 1 0 1 0 8 0 8 0 8 0 5 0 1 0 6 2 8 0 8 0 0 0 1 0 7 2 8 0 2 0 0 0 2 71 72 73 74 20 75 76 77 24 1 0 8 6 8 1 8 0 0 0 1 0 6 1 8 0 8 0 0 0 1 0 7 1 8 0 8 0 0 0 2 13 45 79 3 20 3 80 81 24 1 0 4 1 8 0 8 0 0 0 1 0 7 2 8 0 8 0 0 0 2 20 51 20 83 20 20 76 84 24 1 2 8 2 8 0 8 0 0 0 1 0 7 5 8 0 8 0 0 0 2 13 45 86 3 84 3 76 87 24 2 76 53 76 80 76 76 76 84 24 1 0 7 3 8 0 8 0 0 0 2 90 64 84 81 84 84 84 84 24 2 24 24 24 24 24 24 24 24 24 3 67 70 78 82 85 88 89 91 92 2 3 11 19 3 3 3 3 3 24 2 3 46 46 3 57 3 58 59 24 1 0 8 1 8 0 8 0 0 0 2 13 46 96 3 83 3 80 81 24 2 3 3 3 3 3 3 3 3 24 2 3 57 83 3 83 3 80 81 24 2 3 58 80 3 80 3 80 81 24 2 3 59 81 3 81 3 81 81 24 3 94 95 97 98 99 98 100 101 92 2 4 12 20 3 29 0 30 31 24 1 0 4 2 8 0 4 0 0 0 2 20 51 104 83 20 20 20 84 24 2 29 12 20 83 29 29 30 31 24 2 0 12 20 3 29 0 30 31 24 2 30 14 76 80 30 30 30 31 24 2 31 15 84 81 31 31 31 31 24 3 103 61 105 99 106 107 108 109 92 2 0 13 21 3 0 0 0 0 24 1 1 8 2 8 0 2 0 0 0 1 0 8 2 8 0 8 0 1 0 2 13 112 113 3 20 13 76 84 24 2 0 0 13 3 0 0 0 0 24 2 0 14 76 3 30 0 30 31 24 2 0 15 84 3 31 0 31 31 24 3 111 62 114 98 107 115 116 117 92 2 5 14 22 3 30 0 30 31 24 1 0 3 2 8 0 8 0 0 0 2 76 53 120 80 76 76 76 84 24 3 119 63 121 100 108 116 108 109 92 2 6 15 23 3 31 35 31 31 24 3 123 65 91 101 109 117 109 109 92 3 41 41 92 92 92 92 92 92 41 4 42 66 93 102 110 118 122 124 125 2 1 44 49 3 12 0 14 15 7 2 9 44 68 46 12 47 14 15 7 2 10 45 69 46 51 45 53 64 24 2 11 46 46 3 57 3 58 59 24 2 13 47 45 3 12 0 14 15 24 3 127 128 129 130 61 131 63 65 41 2 9 44 45 46 12 47 14 15 7 1 1 8 8 8 8 8 8 8 0 1 1 1 2 8 8 8 8 8 0 1 1 8 1 8 8 8 8 8 0 1 1 4 8 8 8 8 8 8 0 1 1 6 8 8 8 8 8 8 0 1 1 7 8 8 8 8 8 8 0 2 44 134 135 136 137 134 138 139 7 1 1 4 2 8 8 8 8 8 0 1 1 1 1 8 8 8 8 8 0 1 1 7 2 8 8 8 8 8 0 2 68 135 135 136 141 135 142 143 24 1 1 4 1 8 8 8 8 8 0 1 1 6 1 8 8 8 8 8 0 1 1 7 1 8 8 8 8 8 0 2 46 136 136 136 145 136 146 147 24 2 12 137 141 145 137 137 138 139 24 1 1 8 2 8 8 8 8 8 0 2 47 134 150 136 137 134 138 139 24 1 1 6 2 8 8 8 8 8 0 2 14 138 152 146 138 138 138 139 24 2 15 139 143 147 139 139 139 139 24 3 133 140 144 148 149 151 153 154 41 2 17 45 50 56 51 45 53 64 24 2 45 135 135 136 141 150 152 143 24 1 1 1 2 8 8 2 5 8 0 1 1 1 2 8 8 0 5 8 0 1 1 4 2 8 8 2 8 8 0 1 5 8 2 8 8 8 8 8 0 1 1 7 2 8 8 2 8 8 0 2 72 158 159 142 160 161 135 162 24 1 1 8 1 8 8 8 1 8 0 2 46 164 142 136 145 136 146 147 24 2 51 141 141 145 141 141 152 143 24 2 112 150 150 136 141 150 152 143 24 2 53 152 152 146 152 152 152 143 24 2 64 143 143 147 143 143 143 143 24 3 156 157 163 165 166 167 168 169 92 2 45 164 136 136 145 136 146 147 24 2 3 136 136 3 145 3 146 147 24 2 57 145 145 145 145 145 146 147 24 2 58 146 146 146 146 146 146 147 24 2 59 147 147 147 147 147 147 147 24 3 95 148 171 172 173 172 174 175 92 3 61 149 166 173 149 149 153 154 92 2 33 47 52 3 12 0 14 15 24 2 47 134 135 136 137 134 138 139 24 2 45 150 135 136 141 150 152 143 24 2 0 134 150 3 137 0 138 139 24 1 5 7 2 8 8 8 8 8 0 2 15 139 182 147 139 139 139 139 24 3 178 179 180 172 149 181 153 183 92 2 14 138 142 146 138 138 138 139 24 3 63 185 168 174 153 153 153 154 92 2 15 15 54 59 15 15 15 15 24 3 187 154 169 175 154 154 154 154 92 4 132 155 170 176 177 184 186 188 125 2 2 49 71 13 20 13 76 90 24 2 17 45 72 46 51 112 53 64 24 2 18 50 73 96 104 113 120 84 24 2 19 46 74 3 83 3 80 81 24 2 21 52 75 3 20 13 76 84 24 2 22 53 76 80 20 76 76 84 24 2 23 54 77 81 84 84 84 84 24 3 190 191 192 193 85 194 195 196 92 2 10 68 72 45 51 45 53 64 24 2 45 135 158 164 141 150 152 143 24 2 69 135 159 136 141 135 152 143 24 2 46 136 142 136 145 136 146 147 24 2 51 141 160 145 141 141 152 143 24 2 45 135 161 136 141 150 152 143 24 2 53 142 135 146 152 152 152 143 24 2 64 143 162 147 143 143 143 143 24 3 198 199 200 201 202 203 204 205 92 2 18 69 73 79 20 86 76 84 24 2 50 135 159 142 141 150 152 143 24 1 0 4 2 8 8 8 8 8 0 1 0 6 2 8 8 8 8 8 0 1 0 7 2 8 8 8 8 8 0 2 73 159 13 3 209 13 210 211 24 1 0 4 1 8 8 8 8 8 0 1 0 6 1 8 8 8 8 8 0 1 0 7 1 8 8 8 8 8 0 2 96 136 3 3 213 3 214 215 24 2 104 141 209 213 209 209 210 211 24 2 113 135 13 3 211 13 210 211 24 2 120 152 210 214 210 210 210 211 24 2 84 143 211 215 211 211 211 211 24 3 207 208 212 216 217 218 219 220 92 2 26 46 74 3 83 3 80 81 24 2 56 136 142 136 145 136 146 147 24 2 79 142 3 3 213 3 214 215 24 2 3 136 3 3 213 3 214 215 24 2 83 145 213 213 213 213 214 215 24 2 80 146 214 214 214 214 214 215 24 2 81 147 215 215 215 215 215 215 24 3 222 223 224 225 226 225 227 228 92 2 28 51 20 20 20 84 76 84 24 2 20 141 209 213 209 211 210 211 24 2 20 141 209 213 209 209 210 211 24 1 0 5 2 8 8 8 8 8 0 2 20 141 233 213 209 209 210 211 24 2 76 152 211 214 210 210 210 211 24 3 230 202 231 226 232 234 235 220 92 2 34 45 75 3 20 3 76 84 24 2 45 150 161 136 141 150 152 143 24 2 86 150 13 3 209 13 210 211 24 2 13 150 13 3 209 13 210 211 24 2 76 152 210 214 210 210 210 211 24 1 1 5 2 8 8 8 8 8 0 2 84 143 242 215 211 211 211 211 24 3 237 238 239 225 234 240 241 243 92 2 37 53 76 80 76 76 76 84 24 2 53 152 135 146 152 152 152 143 24 3 245 246 241 227 235 241 241 220 92 2 39 64 77 81 84 87 84 84 24 2 84 182 242 215 211 211 211 211 24 3 248 205 220 228 220 249 220 220 92 3 92 92 92 92 92 92 92 92 92 4 197 206 221 229 236 244 247 250 251 2 3 3 13 3 3 3 3 3 24 2 3 46 45 3 57 3 58 59 24 2 26 56 79 3 83 3 80 81 24 2 3 57 20 3 83 3 80 81 24 3 253 254 255 98 256 98 100 101 92 2 46 136 164 136 145 136 146 147 24 3 130 258 201 172 173 172 174 175 92 2 19 46 96 3 83 3 80 81 24 2 74 142 3 3 213 3 214 215 24 3 260 148 261 225 226 225 227 228 92 2 3 145 213 3 213 3 214 215 24 2 3 146 214 3 214 3 214 215 24 2 3 147 215 3 215 3 215 215 24 3 98 172 225 98 263 98 264 265 92 3 99 173 226 263 226 263 227 228 92 3 100 174 227 264 227 264 227 228 92 3 101 175 228 265 228 265 228 228 92 4 257 259 262 266 267 266 268 269 251 2 28 51 20 83 20 20 76 84 24 3 103 61 271 99 106 107 108 109 92 2 20 51 104 83 20 20 76 84 24 2 20 160 209 213 209 233 211 211 24 3 273 166 274 226 232 232 241 220 92 2 20 145 213 213 213 213 214 215 24 3 99 173 276 263 226 263 227 228 92 1 0 4 8 8 8 8 8 8 0 1 0 6 8 8 8 8 8 8 0 1 0 7 8 8 8 8 8 8 0 2 29 137 209 213 278 278 279 280 24 2 30 138 210 214 279 279 279 280 24 2 31 139 211 215 280 280 280 280 24 3 106 149 232 226 281 281 282 283 92 2 84 141 211 213 209 209 210 211 24 2 0 137 209 3 278 0 279 280 24 3 107 149 285 263 281 286 282 283 92 2 30 14 20 80 30 30 30 31 24 3 288 153 241 227 282 282 282 283 92 3 109 154 220 228 283 283 283 283 92 4 272 177 275 277 284 287 289 290 251 2 33 47 45 3 12 0 14 15 24 2 34 45 86 3 20 13 76 84 24 2 0 12 84 3 29 0 30 31 24 2 0 0 3 3 0 0 0 0 24 2 35 15 87 3 31 0 31 31 24 3 115 292 293 98 294 295 116 296 92 2 13 47 112 3 12 0 14 15 24 2 45 150 150 136 141 150 152 143 24 3 298 151 299 172 149 181 153 154 92 2 21 45 113 3 20 13 76 84 24 2 52 135 135 136 141 150 152 182 24 2 75 161 13 3 233 13 210 242 24 2 20 141 211 213 209 209 210 211 24 3 301 302 303 225 304 240 241 220 92 3 107 149 232 263 281 286 282 283 92 2 3 150 13 3 209 13 210 211 24 2 0 138 210 3 279 0 279 280 24 2 0 139 211 3 280 0 280 280 24 3 115 181 307 98 286 115 308 309 92 3 116 153 241 264 282 308 282 283 92 3 117 154 220 265 283 309 283 283 92 4 297 300 305 266 306 310 311 312 251 2 5 14 76 3 30 0 30 31 24 3 314 63 245 100 108 116 108 109 92 3 63 153 168 174 153 153 153 154 92 2 22 53 120 80 76 76 76 84 24 2 53 142 152 146 152 152 152 143 24 2 76 135 210 214 211 210 210 211 24 2 20 152 210 214 210 210 210 211 24 3 317 318 319 227 320 241 241 220 92 3 108 153 241 227 282 282 282 283 92 4 315 316 321 268 322 311 322 290 251 2 6 15 90 3 31 0 31 31 24 2 39 64 84 81 84 84 84 84 24 3 324 65 325 101 109 117 109 109 92 2 64 143 143 147 143 182 143 143 24 3 65 154 327 175 154 154 154 154 92 2 23 64 84 81 84 84 84 84 24 2 54 143 143 147 143 143 143 143 24 2 77 162 211 215 211 242 211 211 24 3 329 330 331 228 220 220 220 220 92 2 35 15 84 3 31 0 31 31 24 2 87 143 211 215 211 211 211 211 24 3 333 154 334 265 283 309 283 283 92 4 326 328 332 269 290 335 290 290 251 4 125 125 251 251 251 251 251 251 125 5 126 189 252 270 291 313 323 336 337 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 golly-3.3-src/Rules/TreeGenerators/0000755000175000017500000000000013543257426014331 500000000000000golly-3.3-src/Rules/TreeGenerators/RuleTreeGen.cpp0000644000175000017500000000270012026730263017123 00000000000000#include // for strlen #include #include #include #include using namespace std ; /** * Set the state count, neighbor count, and put your function here. */ const int numStates = 2 ; const int numNeighbors = 8 ; /* order for nine neighbors is nw, ne, sw, se, n, w, e, s, c */ /* order for five neighbors is n, w, e, s, c */ int f(int *a) { int n = a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] ; if (n == 2 && a[8]) return 1 ; if (n == 3) return 1 ; return 0 ; } const int numParams = numNeighbors + 1 ; map world ; vector r ; int nodeSeq, params[9] ; int getNode(const string &n) { map::iterator it = world.find(n) ; if (it != world.end()) return it->second ; world[n] = nodeSeq ; r.push_back(n) ; return nodeSeq++ ; } int recur(int at) { if (at == 0) { return f(params) ; } else { char buf[256*10] ; sprintf(buf, "%d", at) ; for (int i=0; i world = new HashMap() ; ArrayList r = new ArrayList() ; int[] params = new int[numParams] ; int nodeSeq = 0 ; int getNode(String n) { Integer found = world.get(n) ; if (found == null) { found = nodeSeq++ ; r.add(n) ; world.put(n, found) ; } return found ; } int recur(int at) { if (at == 0) return f(params) ; String n = "" + at ; for (int i=0; i #include #include #include using namespace std ; /** * Set the state count, neighbor count, and put your function here. */ const int numStates = 3 ; const int numNeighbors = 8 ; /** 0: (nothing set) 1: \ 2: / */ /* order for nine neighbors is nw, ne, sw, se, n, w, e, s, c */ int f(int *a) { int on1 = (a[0] & 1) + (a[3] & 1) + (a[4] >> 1) + (a[5] >> 1) + (a[6] >> 1) + (a[7] >> 1) + (a[8] & 1) ; int on2 = (a[1] >> 1) + (a[2] >> 1) + (a[4] & 1) + (a[5] & 1) + (a[6] & 1) + (a[7] & 1) + (a[8] >> 1) ; if (on1 == 2) if (on2 == 2) return 0 ; else return 1 ; else if (on2 == 2) return 2 ; else return 0 ; } const int numParams = numNeighbors + 1 ; map world ; vector r ; int nodeSeq, params[9] ; int getNode(const string &n) { map::iterator it = world.find(n) ; if (it != world.end()) return it->second ; world[n] = nodeSeq ; r.push_back(n) ; return nodeSeq++ ; } int recur(int at) { if (at == 0) { return f(params) ; } else { char buf[256*10] ; sprintf(buf, "%d", at) ; for (int i=0; i=1): #C #C A(n) = 9 2^(6n+1) - 261 n 2^(3n-2) - (179 2^(3n-2) + 13)/7 #C #C B(n) = A(n) + (45n - 2) 2^(3n-2) #C = 9 2^(6n+1) - 27 n 2^(3n+1) - (193 2^(3n-2) + 13)/7 #C #C C(n) = 9 2^(6n+3) - 9 n 2^(3n+4) - (1425 2^(3n-2) + 13)/7 #C #C D(n) = C(n) + (27n - 11) 2^(3n) + 12 #C = 9 2^(6n+3) - 117 n 2^(3n) - (1733 2^(3n-2) - 71)/7 #C #C (The hexagon at time A(1) doesn't quite fit the pattern.) #C #C Here are the first few values: #C #C n A(n) B(n) C(n) D(n) #C 1 577 663 3047 3187 #C 2 64965 66373 273221 275985 #C 3 4615093 4632117 18627125 18662977 #C 4 300894645 301076917 1205391797 1205789121 #C x = 1, y = 1, rule = Worm-1525115 A! golly-3.3-src/Patterns/Patersons-Worms/worm-1252121.rle0000644000175000017500000000426712026730263017413 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #155 #C Sven Kahrkling's notation 1252121 #C Gardner's notation 1a2d3cbcc4b #C #C This almost certainly runs forever, repeatedly forming almost solid #C hexagons at certain times, as described below. (Here all times and #C distances are in terms of the Golly implementation. Divide by 2 to get #C measurements in terms of the original worm.) #C #C The worm forms a hexagon, whose horizontal sides have length 2^(3n+2)-2, #C completing the boundary at a point P in the middle of one side, in #C generation a(n). Then it wanders around inside for a while and leaves at #C the corner that's 210 degrees clockwise from P, in generation b(n). #C #C Next it builds a new hexagon, whose horizontal sides have length #C 2^(3n+3)-2, completing the boundary in the middle of the side that's 120 #C degrees clockwise from P, in generation c(n). Again it wanders inside, #C this time emerging in the middle of the side that's 60 degrees clockwise #C from P, in generation d(n). #C #C Next it builds a hexagon, with horizontal sides of length 2^(3n+5)-2, #C completing the boundary in the middle of the side that's 60 degrees #C clockwise from P, in generation a(n+1). Then the process repeats. #C #C The uneaten parts of the hexagons have a fractal structure, which can #C be viewed by changing the rule to "worm-complement" and running for #C one generation. #C #C Here are the formulas for a(n), ..., d(n) (for n>=1): #C #C a(n) = 9 2^(6n+3) - 261 n 2^(3n-1) - (197 2^(3n+1) + 5)/7 #C #C b(n) = a(n) + (45n + 13) 2^(3n-1) #C = 9 2^(6n+3) - 27 n 2^(3n+2) - (697 2^(3n-1) + 5)/7 #C #C c(n) = 9 2^(6n+5) - 9 n 2^(3n+5) - (2769 2^(3n-1) + 5)/7 #C #C d(n) = c(n) + (27n - 2) 2^(3n+1) + 12 #C = 9 2^(6n+5) - 117 n 2^(3n+1) - (2825 2^(3n-1) - 79)/7 #C #C (The hexagon at time a(1) doesn't quite fit the pattern.) #C #C Here are the first few values: #C #C n a(n) b(n) c(n) d(n) #C 1 3113 3345 14545 14957 #C 2 274605 277901 1130125 1136793 #C 3 18645101 18682989 74953837 75034745 #C 4 1205590893 1205986157 4826309485 4827177849 #C x = 1, y = 1, rule = Worm-1252121 A! golly-3.3-src/Patterns/Patersons-Worms/worm-1040512.rle0000644000175000017500000000045312026730263017403 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #055 #C Sven Kahrkling's notation 1040512 #C Gardner's notation 1a2c3cbaa4b #C Finishes after 569804 steps (1139608 gens in Golly), almost filling #C a regular hexagon. x = 1, y = 1, rule = Worm-1040512 A! golly-3.3-src/Patterns/Patersons-Worms/worm-1042020.rle0000644000175000017500000000043312026730263017375 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #062a #C Sven Kahrkling's notation 1042020 #C Gardner's notation 1a2c3aaca4a #C Finishes after 57,493,855,205,939 steps, as determined by Tomas Rokicki. x = 1, y = 1, rule = Worm-1042020 A! golly-3.3-src/Patterns/WireWorld/0000755000175000017500000000000013543257426014024 500000000000000golly-3.3-src/Patterns/WireWorld/gate-NOT.mcl0000644000175000017500000000077112026730263016012 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D NOT (clocked, has to be) #D #D A correctly timed signal from left (shown) will cancel the signal that #D would otherwise leave at right. #D #D Harold V. McIntosh #L 3CBACCBACCBACCBAC$18.C$17.3C$18.C$17.C.11C$16.C$15.B.C$16.A7$6CBA6CBA #L CC$18.C$17.3C$18.C$17.C.11C$15.CC$14.C..C$14.C..C$15.BA golly-3.3-src/Patterns/WireWorld/gate-XOR.mcl0000644000175000017500000000140512026730263016015 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D XOR (EXCLUSIVE OR) #D #D A signal from top or bottom (not both) will cause a signal to leave at right. #D No signal will pass through from top to bottom or vice versa. #D #D As a circuit element it is not much used in design, but it has a theoretical #D importance with respect to minimal collections of gates from which all #D others can be derived. For example, NANDs by themselves are sufficient #D for the purpose. #D #D Harold V. McIntosh #L .A$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$.C3$.C$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$ #L .A3$.A$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$.A golly-3.3-src/Patterns/WireWorld/Langtons-ant.zip0000644000175000017500000000761412706123635017037 00000000000000PKV[Hinit.luaUX ÷EWTCWõ]‘Ñnƒ0 Eßù k/£R;[¥jÒ~e’ nˆb›¢vÚ¿ÏJÝÆCäúú87p‹|€ã®å¦(v;ÙkÛƒØ2Ôï5`ì@§O'ÀIywò <ªçÂwñÌñY³EÛctöÝS„UÉ*E1©€£H ÕGW¸!ЕÕfݯ~åSn`þOÛj%¢(S2–ž åÀI #û) T Û+  Ä>`ÊО üC(ž–ŸB« F…/´”ÂK– t‰ÇÑÀd¥Y[•_Õàíðg³í0Á%¼ðû©ó±•Ô ›ýþ®Þõ Ç0Ñ_ys=–E>÷^ÿ)_ͳÊ,ûjiñ½y`Ïq tÑG¯ÞÂ¥1Þ>ëüÆ ûŽÔò`“Bço·+ÌhçDòmj5qh¯­eЉ§þâiAzNëõQ¨l÷èrŸ²Þ?PKÏJARSPK À\H __MACOSX/UX ÷EW÷EWõPKV[H__MACOSX/._init.luaUX ÷EWTCWõc`cg`b`ðMLVðVˆP€'q%ƒø«˜!Ä5"„/p bðg>Õ1ˆùÑ”0"ÄÅ“ósõ rRõBR+J\ó’óS2óÒ’¡!nºÖ†Æ&F†æ–&PKܵÖóe«PKäNÍ:Langtons-ant.mcUX ÷EWÜê2Jõ]XËn#ɼó+ ØÃî M׳»|3|µ/¶=6À•Zbc(r@¶–½#"«šÔb$Mw=2#_‘Uý¯¿…»ŸÞÎÇãwž†Ÿw?üÝýº\æ_Ï—ãË¸–ë}Ä}Û¯ë|9¹ëòþqܯóÕýuz[ϧ¯îϧÕ-'·wo—åÅ_]þ›·Çðó|<^Ÿ(ïóìëúíO_¾Ün·§Ã¼\ç§ÛõËÑÄ<Ö÷£{=_Ü˼î—ãÕOîp¾¹eu·óåëâ„«Éx߯‡‘=ÝÎÇ×Ëþýéùüþ¥aºÑ]àûù2»ýoçõ3fÂÚ,íöáq9=?^æ³éË7÷º!áx>½¹Û²0z\Öc×çËòmuëa¿RÒu^¯îãæOËóŒý˺ìî÷e¾¹ëŽîûùÃö¿Ïn=»—3Õ]×ýeuoói¾ì×åôFA°ÕÝöëó¢g÷úqºcÝŸà læÄí|z™/Wºœ¯‡ýõp\^ õí|Ð÷_Üò*•°é2ï¯3× é:£”0ý'rì$?/x>!#ÖýWHq¯Ä=?CËUž¤FûX,O˜¼^ö/óûþòÕ–·Ãmÿ]–U;.[Ýüò6w Ê“Ÿö¯ð¸†‚R~†aóÂøóÓλÁEþîþòŸßÅöÚ,Þõ4´§Øž‚K.ã¹´YJéëâ&yäÉUç‡&ztÞkÔK_×ïcI+½þdNø“¤½ãÍÎO<Ùü@, ÝððÄ•Á»‚é ÖC{uæÅ]œ/.¤Í&/ã_ÙÔш0Qpä6Ü}MatrFª‹¾I«Z‚ø)zÆ~jëG!òæVÂõôBéƒâé;™1q¼RæÈ壹*b¸ºQqVÂ×35×6ì9S ÅEÂOr)»Tèˆ..Á®QÊC3Üœ<µbM•Ø.¯?ƒÇ#­4ŸñÇËt{Fܰ=ã?ü ¯Ìñ=’æHçh¦ Â@ca¨’ŽO2/Ý£@gL"ÞØÃgï2b_]I†T©${˜²ì‘|ì/®Œ®@›baðÍo{ÍPË–dñ-´ õˆüön nŒ}ÊÐ*t^¡ðJºÒÜbX¸9»±¸qtã¤/\ל?}D‹¯Rb°˜LX„wˆ¤å¥º1¹±º)íûˆ/BŸÝ”·¸XíXPP ­:§ÑMS³/x׋¶’è6§™ó{V'çû¨UJ “TD “«YY´â®#«;¹©º Ç M'¼¡ ‘„ƒKiÌÞhV¡•/UîÇnH¦ü@?Ò¿|N¾á%Sµ²0ý0Z O¢ ,smhÉìþàø$ð~ÀN©‡:º+¢ñDÙŒôL*’]fò57ÀÏ9VR³05&ĨÅrÏ´+xÜ×ÝØé9 ¬ÒB§%ØB)pœV'²XbЩhJÔ#­õ@!khg ñÑ×y§Ä€ê)SsÓêÁe>Œ\NDܼ& r ö2™úz`Gþí Ó Á©½_ »ÚM@aµ]`bhÚdŒ”ÓeDhŠÛ\Üà#ÕO]>ë*Þç¨-oo…«ûÊÄ îH|â/:U‡$´˜ÞÍ|Ê›†@-Û[¥¤M Iø®!<Øê³´l˜qù¾1ró½¼¶JtÆ-'‰È-犒rÜ2kPbÙJ±g†'kefïyNÙ‚SX¨¦” nQƒo`ÁϾlîð™}2 b(®÷u«vՇحK`YÚ¢Úž(aC¾{p¤=‘ƒi=¸’ÙØåõ]zôz·'ý[z¦:(Óƒ3ý8±®—a6ž½Ó“JšÐy̓ýDöÄäL€u~us"²võ¼ukê%Éq˜Ç"[HZê7»dÔ8˜1¹¶NÜÕÈHºd•ìkôé7 ¬;P–8¸ÔW>'e@îq€ê µ‘ \0€$@¢·vþÁ»ØÕ؇èHÄœ¯<Q úeήu‘n3˜Õíœ$ ÝÒ |$ 5ŠëÈØŽ$¥!3š§ãynƒûÝ‚@îól8àó0p’0Õ¼º+w¹ód‡Ïso‡#ÓdR¹Á3EéhÀÅéiT›³f§À2¨ÕÌC¤’KØbYF–¬ÛX–®%í6’¥Ôý˜ÁªGÆ pØïšL“¼UäoÓ$ÏάЂØWîŠÍ& ¨4‹•Çjä!Ôˆ›Èˆ†æû*l“З²0Ëã>ð¥*I¸×h’dXÂã ˆ5Ä  ÎÑmÝåÖ;º©R%ó;r¹¡¶h9£–X>D>[D'nÐ¥JÂr!L¸!âÁ‚nÈ%o ÷ºÈ.®„@ToˆŒV´ó}g¢ÜÒî¡õ†ÄÜÜÒ#–ˆ=,q’ý„#ÿ¡¯Zpî5 „ì{¬´b²}Ÿš+÷mÝ5d–UêaP@âî?¬ÐtÃi0è:dšI ì\AüÄÒÇš,­º©fP±J‹K‡-§È¡õàœJìnÕ”Í5œ7‡w<Äöì¡ÀŠZOÈú[䤡9ˆ®ÖÙÀÒº6›…ƒõKë‰>Z.e³žxÑ›‰ oh4§ñ€¢*–ÄCóÔ ¢a’Pm„1™-#åY"´À.EÄ› —0W‹ŠáÚõøøŽK’ùKÉX;É¿ŒjÚp a0Y†‹»¦`¾›èÃBÿ¼8bíÄËœ03±i-ý<ÊvÙh7-Q>dC9kx&“>±µFJž(•:ù,»Ì¿Ý»ÒýÛ}@9àÅPC÷·<l§Ù§5É2ż+í¾¡d˳˜xÐì˜8€CU61Ó¨Ï,–ä`ÒÍbŽ˜ºÅ’LºY,Éù))~jxwš‹"u‘y#¹‘Mdí²¤GZ]±Ìa~у#¡¾Šãä^†6í"±•ßdW½Ô®•Yo£Ê$N 7ØÙæôaeÚœ]UK+ h%?¡ü¢NWºŒš­Ö×îi‡µ8YW‰“Jg*š· lÐ=tèRÛi'N¹ïäŽ*l5(™ÜH:à­Ævn‰ ©ÉÒŽ,ÅŠa¾jc>vZ«ôZ¬"ŸÊ v5ÎdJà°ˆ”4YD™-É Úp´”Š­›AòŽßjõñlhî8R ‡9¨øZ}ô¬Ñ¸ÕrXBpÆ^/Êø`lmù©5­:ªå‰6–F íSìƒçiH Q‘£ì’ù9!d Œ•3),âT@ÏÉó:‹²áçT+½˜y9wÿPK°¬F߉ ÍPKV[HÏJARS @¤init.luaUX÷EWTCWPK À\H @ýA˜__MACOSX/UX÷EW÷EWPKV[HܵÖóe« @¤Ï__MACOSX/._init.luaUX÷EWTCWPKäNÍ:°¬F߉ Í @¤…Langtons-ant.mcUX÷EWÜê2JPK[golly-3.3-src/Patterns/WireWorld/circuit.mcl0000644000175000017500000000351512026730263016075 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 80x80 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The cellular automaton WireWorld is attributed to Brian Silverman and #D was included in his program PHANTOM FISH TANK. #D A. K. Dewdney publicized WireWorld in his "Computer Recreations" #D column (Scientific American, January, 1990). #D #D Cells in WireWorld have one of four possible states: background (0), #D electron head (1), electron tail (2), and wire (3). #D #D The rules for updating cells are: #D #D - background (0) always remains background. #D - electron head (1) always changes to electron tail. #D - electron tail (2) always changes to wire. #D - wire (3) changes to electron head if one or two of its neighbours are electron heads. #D #D These simple rules allow fairly complicated logic circuits to be #D constructed. #L .49C$C49.C$C49.C$C49.C$C49.C$C49.C$C9.C23.C15.C$C8.C.C.CC.CC15.C.C.CC. #L CC8.C$C8.C..CC.C.4C12.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC3.C.3C$ #L C6.CC8.C4.C3.7C8.C4.C$C12.CC..C.CC.C14.CC..C.CC.C$C6.7C.CC.C.CC9.7C.CC #L .C.CC$C5.C6.CC4.CC9.C6.CC4.CC$C5.C23.C$C5.C23.C$C5.C23.C$C6.19C5.19C$C #L 25.C23.C$C25.C23.C$C25.C23.C$C9.C15.C7.C15.C$C8.C.C.CC.CC8.C6.C.C.CC. #L CC8.C$C8.C..CC.C.4C5.C6.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC3.C. #L 3C$C6.CC8.C4.C3.7C8.C4.C$C12.CC..C.CC.C14.CC..C.CC.C$C6.7C.CC.C.CC9.7C #L .CC.C.CC$C5.C6.CC4.CC9.C6.CC4.CC$C5.C23.C$C5.C23.C$C5.C23.C$C6.19C5. #L 19C$C25.C23.C$C25.C23.C$C25.C23.C$C9.C15.C7.C15.C$C8.C.C.CC.CC8.C6.C.C #L .CC.CC8.C$C8.C..CC.C.4C5.C6.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC #L 3.C.3C$C6.CC8.C4.C3.7C8.C4.C$C.CC9.CC..C.CC.C14.CC..C.CC.C$.CC.10C.CC. #L C.CC9.7C.CC.C.CC$..CC9.CC4.CC9.C6.CC4.CC$30.C$30.C$30.C$30.C$30.C$30.C #L $30.C$.3C.25C$C3.C$C3.C$C3.C$.CBA golly-3.3-src/Patterns/WireWorld/flip-flop.mcl0000644000175000017500000000161612026730263016323 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The following is a negative going edge-triggered flip flop. #D #D Using this circuit, you can construct counters, dividers and #D things- though the Transit time does pose a bit of a problem... #D #D Transit: 21 (measured from entry of entry of a 'missing' electron) #D IBI: 5 #D Size: 16x13 #D #D The right pattern is a flip flop that toggles with every electron sent in. #D #D Transit: 14 #D IBI: 5 #D Size: 11x13 #D #D Ian Woollard, March 1990 #L ..C18.C$..C18.C$..C18.C$..C18.C$..C3.3C12.C3.3C$..C.3C.CC11.C.3C.CC$3. #L C..C.C.C11.C..C.C.C$..3C.3C.C10.3C.3C.C$..C.C..C..C10.C.C..C..C$.CC.3C #L ..C10.CC.3C..C$C.3C3.C10.C.3C3.C$C6.C11.C6.C$.6C13.6C$6.C.C16.A$7.3C$ #L 4.3C.C.C$3.C6.C$4.7C$10.A golly-3.3-src/Patterns/WireWorld/gate-AND.mcl0000644000175000017500000000151012026730263015744 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D AND #D #D A little ingenuity produces the following AND gate; #D the signals enter at the top corners, their AND exits #D at the bottom right hand corner. #D #D This literal construction shows too many cells; the circuit #D can be rearranged into other forms. #D #D Harold V. McIntosh #L 14.A5C$20.C$10.A5C5.3C$16.C.C.C3.C$17.3C4.C$18.C.C.C.C$21.3C$22.C.10C #L 11$4.A5C19.6C$10.C24.C$6C5.3C11.A5C5.3C$6.C.C.C3.C16.C.C.C3.C$7.3C4.C #L 17.3C4.C$8.C.C.C.C18.C.C.C.C$11.3C22.3C$12.C.10C13.C.10C6$4.CA4C19.A5C #L $10.C24.C$A5C5.3C11.CA4C5.3C$6.C.C.C3.C16.C.C.C3.C$7.3C4.C17.3C4.C$8.C #L .C.C.C18.C.C.C.C$11.3C22.3C$12.C.10C13.C.10C golly-3.3-src/Patterns/WireWorld/unary-multiplier.mcl0000644000175000017500000003344512026730263017762 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 200x200 #WRAP 0 #CCOLORS 4 #PALETTE 2_2_1 #D #D A Unary Multiplier Wrapped in a Turing Machine Inside WireWorld #D by Nyles Heise, March 12, 2004 #D nylesheise@yahoo.com #D #D First of all, my thanks to #D #D A.K.Dewdney for introducing me to WireWorld with his Scientific American #D article in 1990 and for writing "The New Turing Omnibus", #D from which I took many ideas for the design. #D #D Karl Scherer for his great work in WireWorld design. Karl's web site #D (http://karl.kiwi.gen.nz) has a voluminous amount of devices #D from basic elements to complex multipliers. Some of these #D devices have been used here. Karl and I have also recently #D cooperated is coming up with some more-compact versions of #D the 4-cycle logic I devised in 1990. The free game page, #D (http://www.zillions-of-games.com/games/index.html), to the #D Zillions of Games (http://www.zillions-of-games.com/) #D contains a downloadable, operational file that allows you #D to watch WireWorld in aciton. #D #D This is a WireWorld implementation of a Turing Machine, M, that multiplies two #D unary numbers. I set out to do the exact multipler found in Mr. Dewdney's #D "The New Turing Omnibus", however, backed off to a design the requirs less #D logic. The design I came up with takes 9 States, plus halt, but only #D 2 Symbols. It is basically a nested pair of move loops, as found in the #D Turing_Machine download to Zillions. #D (http://www.zillions-of-games.com/games/index.html) #D #D The logic is set up to do the multiply 5 * 4 = 20. The Turing #D algorithm that's implemented starts with the first number, a "Blank", the second #D number and finally another "Blank". The blanks extend to infinity in both #D directions. #D #D ... B B 1 1 1 1 1 B 1 1 1 1 B B ... #D #D After the machine halts, the tape contains the product along with the initial #D numbers and blanks for demarcation. #D #D ... B B 1 1 1 1 1 B 1 1 1 1 B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 B B ... #D #D Strictly speaking, the output of M should be only the number 20, however, I've #D chosen to leave the input numbers as well since this eased the design of the #D control mechanism logic. #D #D #D -----Quintuple notation #D #D I'm using the quintuple notation to describe the Turing Machine program as #D found on page 207 and following in "The New Turing Omnibus" by A. K. Dewdney. Each #D quintuple gives the next state, new symbol to be written, and tape direction #D as a function of the present state and the symbol on the tape at the location #D of the Read/Write Head. Let Q be the state and S be the symbol. Then each #D quintile is of the form #D #D {present Q, present S, next Q, next S, direction} #D #D The state comes from the following set #D #D PO Pick up the UIT, outer loop #D PI Pick up the UIT, inner loop #D CO Carry the UIT, outer loop #D CI Carry the UIT, inner loop #D CIT Carry the UIT, inner loop, about to write a 1 #D LO Move to the left, outer loop #D LOT Move to the left, outer loop, about to go right #D LI Move to the left, inner loop #D LIT Move to the left, inner loop, about to go right #D #D The symbol comes from the alphabet #D #D B Blank #D 1 A UIT #D #D The tape motion comes from the set #D #D Left #D Right #D Stop #D #D #D -----Unary Multiplier Quintuple Specification #D #D Only quintuples that change state or write to the tape are listed. #D #D PO 1 C0 B Right #D CO B PI B Right #D PI 1 CI B Right #D CI B CIT B Right #D CIT B LI 1 Left #D LI B LIT B Left #D LIT B PI 1 Right #D PI B LO B Left #D LO B LOT B Left #D LOT B PO 1 Right #D PO B Halt #D #D #D -----Description of the Control Mechanism #D #D The control mechanism contains the random logic to generate the next state for #D Q and S. It is essentially a clocked, sequential state machine with 5 latches, #D 4 for Q and 1 for S. The latches for Q and S are found within the control #D mechanism. There are 9 states (plus halt), that are represented by 4 latches, #D L, I, T, and P. #D #D PO L=0 I=0 T=0 P=1 #D CO L=0 I=0 T=0 P=0 #D PI L=0 I=1 T=0 P=1 #D CI L=0 I=1 T=0 P=0 #D CIT L=0 I=1 T=1 P=0 #D LO L=1 I=0 T=0 P=0 #D LOT L=1 I=0 T=1 P=0 #D LI L=1 I=1 T=0 P=0 #D LIT L=1 I=1 T=1 P=0 #D #D There are 2 symbols that are represented by a single latch, S. #D #D B S=0 #D 1 S=1 #D #D #D -----Random Logic Equations #D #D Triggered latches are used for Q. A triggered latch has one input. The latch #D keeps its value if the input is 0. It is flipped if the input is 1. #D #D L_trigger = (~S) ^ (P + T) #D I_trigger = (~S) ^ ( P + ~(L + I) ) #D T_trigger = (~S) ^ ( (P ^ ~I) + ~( P + ~(L + I) ) #D P_trigger = P + (~S) ^ ( (L ^ T) + ~(L + I) ) #D #D A clocked D latch is used for S. #D #D S_next = T + S ^ ~P #D #D #D -----Machine Advancement #D #D The tape is simulated as a loop with electrons passing around the control #D mechanism. This is basically the concept developed by Karl Scherer which he #D used to design his very ingenious binary multiplier. #D There are only two symbols, B and 1, so each symbol on the tape #D requires only one WireWorld bit, however, the location of the R/W head must #D be maintained. This is accomplished by having a clock position for each #D tape location. A second WireWorld bit is used for this purpose. Since the #D implementation uses 4-tick logic, each tape location can be represented with #D 8 WireWorld cells. Identically one clock is present on the tape when it #D leaves the control mechanism. #D #D As the tape passes the control mechanism the clock and symbol under the R/W #D head are removed and a new clock inserted in anticipation for a right move. #D The new values for Q are clocked into the latches. If a left move is indicated #D the clock is inserted onto the tape and the previously inserted clock removed. #D The new symbol in written on the tape. And finally the symbol under the moved #d R/W head is written. #D #D #D -----Description of the WireWorld Layout #D #D The control mechanism contains the State Q latches, the S latch, and the random #D logic to generate the next states for Q and S. It modifies the clock and data at #D the appropriate places on the tape. #D #D The tape is simulated as a loop that continually moves around the control #D mechanism. The Turing tape extends to infinity in both, but it is truncated #D here to 320 cells. This is the minimum length possible with the present #D implementation. This equates to 40 tape locations. #D #D The minimum length required to do a multiply is 8 times the sum of the two numbers #D + the product + 3. 5 times 4 could be done with 256 WireWorld cells. Larger #D multiplies can be done by merely extending the loop after it leaves the control #D mechanism by 8 cells per tape location. #D #D The portion of the logic at the very bottom is not actually required to do the #D multiply, but included to aid in viewing. The two numbers and the clock are #D loaded into the multiplier from this extension during the first few cycles of #D operation. After 640 ticks the tape returns with the first Turing step taken. #D The viewing data is then blocked from reentering the machine. #D #D The entire multiply takes 606 advancements of the tape. Including the first 320 #D ticks for loading, this is a total of 194240 ticks. #D #D The control logic detects when the operation is complete and simply removes the #D clock from the tape. With no clock, the tape continues to move without future #D modification. #D #D #D -----Description of the WireWorld devices #D #D The design uses 4-tick devices - ORs, ANDs, LATCHES, etc. 4-tick logic was my #D invention in 1990, at which time I devised the method that allows data to be #D spaced at a distance of 4 cells. Recently several better configurations of some #D of these devices have been laid out by myself and Karl Scherer. #D #D I use a clocked, vectored approach for storing and moving data. The 4 Q latches #D are contained in one 16-cell latch. The data leaving the latches have 4 phases, #D repeating every 16 ticks. The Q latch contains L, I, T, and P. #D #D Q = {L: I: T: P}. #D #D The S latch contain only one bit and is 4 cells in length. #D #D S = {S} #D #D The tape contains a symbol and a clock, 8 cells per tape location. The symbol #D comes first. #D #D Tape = {S: Clock} #D #D The vectored approach enables the logic to be implemented more easily than the #D one-bit-per-latch method. Normal crossing of wires in not required. As a matter #D of fact, there are no 3-XOR cross devices in the design. #D #D #D -----Viewing tips #D #D Non-functional extensions have been appended to the shift register latches for #D easier viewing. The period of the machine is 320. I believe the following #D settings provide best viewing #D #D CTRL g Grid off #D ALT CTRL c Black background (color 0), white electron head (color 1), #D dark blue electron tail and wire (colors 2 and 3) #D The .mcl file sets the 2_2_1 Palette, the closest I could find. #D ALT CTRL n Run for 194240 cycles #D Redraw the universe every 320 cycles #D n Runs to completion #D #D #D -----Enjoy #D #L 31.C.C.C..C..C..CC..C.C3.C3.C.C.C.C3.3C.3C.CC..C3.3C.3C.CC$31.C.C.CC.C #L .C.C.C.C.C.C3.CC.CC.C.C.C4.C3.C..C.C.C4.C..C3.C.C$31.C.C.C.CC.3C.CC3.C #L 4.C.C.C.C.C.C4.C3.C..CC..C4.C..CC..CC$31.C.C.C..C.C.C.C.C..C4.C3.C.C.C #L .C4.C3.C..C3.C4.C..C3.C.C$32.C..C..C.C.C.C.C..C4.C3.C..C..3C..C..3C.C #L 3.3C.3C.3C.C.C5$..11C3.92C3.3C.3C3.6C$.C11.C.C92.C.C3.C3.C.C6.C$C6.3C. #L C.4C16.C5.59C7.CC..3C.3C..C.C6.C$C..B..A3.BCC..C..CC.C.C5.C..A.C.A.C #L 59.C5.C..C..C3.C3.C.C6.C$C.C.A..BCA.C.C..CC..3C.C3.C.C..B.BAC3.3C.7C. #L 3C.12C.4C.CC.10C5.BC3.C.C.4C.C3.3C5.C7.C$C..C9.CC4.C.C..C..C..C..A..A #L 3.C3.C7.C3.C12.C4.C..C10.C3.A..A3.3C..C..C6.C3.3C..CC..C$C..C.C..5C..C #L .CC4.3C.C..C.5C..C5.C6.C.C.C5.A6.C.C..C..C4.CC.B..C.C.C..B..C.C..4C8.C #L 3.C..C..B.C$C3.4C8.C..C3.C.4C.C..C.C..C3.C..C7.3C5.C.B..C3.6C.C3.CC.A. #L C..3C3.C.C4.CC.A.C8.C3.CCA..A.C$C4.C.C.4C..3C.C..C.BC.C..C..C.C.C3.A.C #L .C8.C6.C.C.C.C.C.C..A3.3C.4C..C.C.C..C.C3.C.CC.B..7C7.BC..C$C3.C3.C4.C #L ..C..C3.A4.CC3.C.C.C3.B.B.C.C5.3C5.B.C.C.C.C3.C.B.C5.C3.C4.B..A.C3.C6. #L C8.5C..B..C$C..C7.C..CC..C10.C.CC3.CC.C.C.A..CCA.A..C.CC4.A.C.C.C.C3.B #L .C.C.C3.C..3C3.A..B.C..3C5.3C.CC.CC5.C..A.C$C.3C..C..C.C4.3C..ABCCA3.C #L ..C.C..CCA..C.C.C.B.C..AC.C.C.C.A.C.C.C3.A.C..7C..C.C3.CC..C.C.C.C3.C #L 3.C..C3.C3.C..C.C$C..C..C.C.C.C.C.CA.A.C5.B.3C.C.C.C.C.B.C.C3.C.C.B.C #L ..3C..B.A.C.C3.C.A.C.C3.B..C..C7.C.C4.C..C.C.C.3C.C.A3.C.C.C$C.C.C.C.C #L .C..3C.AB..B5.C..A..C.B.C3.C.C.C3.C.B..C..C.C.B.C.B.C.C3.C.B.C4.C.A.C #L 3.7C..C3.C.C..3C3.C3.BA.C.C.C.C$C.C.C.C.C.C.C.C..A.C.A5.CCB4.A3.C..C.B #L .C3.A.A5.C4.A..C.C.C3.C.C.C4.C.C.C12.C3.C.C3.C..CC3.A.A3C..C.C$C.C.C.C #L .C.C.C5.C3.3CBA4.3C5.C..A3.C.B..C4.C9.C..C3.B.C.C4.C.C.C..A10.3C3.3C.. #L C5.3C.C.C.C.C$.C..C.C.C.C.C..CC3.C5.A3.C..C.C.B..C5.C.C.B..CC.C10.C.C #L 4.A..C4.A.B.C.C.B19.C7.C4.C.C.C$3.C..C.C.C.C.C..C.C.CC..3C3.C..CCA.C.. #L C..C.C.C.A.C..C9.C.C.C7.C4.B.A.C..CC..C..BCCABCC4.3C7.C.C..C..C.C$..C #L 3.C..C..C..C.C.C3.C..C3.3C..C.C4.4C3.C..C.5C5.3C3.4C3.C4.C.C.C.C.5CA7. #L C..C4.C4.3C..C3.C.C$..C.C.C6.C.C.C.C..4C.3C.C3.C8.C7.C..C3.C3.C.C.C6.C #L ..C4.A.C.C.3C..C..CCBACBA..C4.C.A4.C..C4.C.C$3.3C..CCB..C.C.C.C.C.C.C #L 6.C.4C7.CC6.CC4.C3.C3.C.C.3C4.C4.B..C..C..3C10.C5.B..C.C3.C.C.C..C$4.C #L ..C3.A..C3.C..C4.C3.CC3.C..C8.C10.3C..C..5C6.3C6.C3.C..C3.CC6.C4.6C5. #L 3C3.C$..CC..C.ABC5.C5.4C3.C4.C4.A..B5.C10.C.C.C3.C.C8.C.C.CC..C..C.CC. #L C.C..C5.C5.C..C.CC..C.C4.C$.C3.C6.6C12.4C4.3BC.A5.10C3.C.3C3.8C3.C..C. #L C.C6.3C..C4.C3.4C3.C.C.C6.C$.C..3C..C.C4.B.6C13.C.C..C37.3C..C.C6.C.C. #L C..4C3.C.A.CC..C.C.7C$..C..C..C.C6.A6.C12.C.C41.C12.C3.C10.B.CC.CC3.C$ #L 3.CC.CC..C5.3C6.12C3.41C14.3C18.C$..C7.C.CC3.C..C94.C$..C8.C..6C.B20. #L 73C$..C7.3C4.C..A20.C$3.6C..C29.C$..C6.CC30.C$..C8.106C.5C.CC$..C38.C #L 75.C5.C..C$..C107.CBA.C.C..C..3C.C$..C106.A3.3C..3C..C..C$..C107.BCC.C #L .CC.C.C..C.C$..C117.C.CC..C$..C..3C.C.C.3C3.3C..C..CC..3C12.C..C3.CC.. #L C.C..C..CC..3C.3C5.CC12.C30.C$..C3.C..C.C.C6.C..C.C.C.C.C13.C.C.C3.C.C #L .C.C.C.C.C.C.C4.C6.C.C.CC8.C3.CC..C22.C$..C3.C..3C.CC5.C..3C.CC..CC12. #L 3C.C3.CC..3C.3C.CC..CC3.C6.CC6.C5.C7.C22.C$..C3.C..C.C.C6.C..C.C.C3.C #L 13.C.C.C3.C3.C.C.C.C.C.C.C4.C6.C.C.CC8.C3.CC..C22.C$..C3.C..C.C.3C4.C #L ..C.C.C3.3C11.C.C.3C.C3.C.C.C.C.CC..3C..C6.CC11.3C29.C$..C123.C$..C3.A #L 3.A3.A3.A3.A3.C3.A3.A3.A3.A3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C$3.C.B.C.B.C.B.C.B.C.B.C.C.C.B.C.B.C.B.C.B.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C$3.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$3.B.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$4.A3.C3.C3.C3.C3.C3. #L C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C5$.C..3C4.3C7.C$C.C..C6.C3.CC..C.C$3C..C6.C7.C.C$C.C..C6.C3.CC..C.C #L $C.C..C6.C8.C3$6.C3.C3.C3.C3.C7.C3.C3.C3.C$..C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C$6.C3.C3.C3.C3.C7.C3.C3.C3.C3$.C..3C4.3C7.C..3C.C3.CC..C3.3C6.CC.. #L CC..3C..C3.C..3C.3C.3C$C.C..C6.C3.CC3.C..C.C.C5.C.C3.C.C..CC4.C3.C.C.C #L 3.C.C3.C3.C.C3.C$3C..C6.C8.C..3C.3C..C..3C.C.C7.C3.C..C.C4.C4.3C.C.C3. #L C$C.C..C6.C3.CC3.C4.C..C..C4.C..C.C..CC4.C.C3.C.C3.C.C3.C.C.C.C3.C$C.C #L ..C6.C7.3C.3C..C..3C..C..3C6.CC..3C.3C..C3.C..3C.3C3.C3$6.C3.C3.C3.C3. #L C7.C3.C3.C3.C7.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C$..C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C$6.C3.C3.C3.C3.C7.C3.C3.C3.C7.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C golly-3.3-src/Patterns/WireWorld/primes.mc0000644000175000017500000022606012026730263015560 00000000000000[M2] (golly 2.0) #C #C Copyright 1992, 2008 David Moore and Mark Owen #C (http://www.quinapalus.com/wi-index.html) #C #C A WireWorld computer designed by David Moore and Mark Owen, with the #C help of many others. The program stored in this configuration is #C due to Michael Fryers and computes prime numbers. Results are #C displayed in decimal in large 7-segment pattterns. For details #C on the technology behind this computer, visit the site above. #C #R WireWorld 1 0 3 3 0 2 0 0 0 1 3 0 0 0 2 4 0 0 0 3 1 0 0 0 3 2 0 0 0 5 1 3 3 0 0 1 3 0 0 3 2 0 0 7 8 2 5 8 7 7 3 0 6 9 10 1 3 3 3 3 2 0 0 12 12 1 0 0 3 3 2 14 14 7 7 3 13 13 15 15 4 0 0 11 16 5 0 0 4 17 1 0 3 0 3 2 0 0 0 19 3 0 0 0 20 1 3 3 0 3 2 1 5 5 22 2 1 5 0 19 1 3 0 3 0 2 25 12 25 12 3 2 23 24 26 2 0 19 0 19 3 0 28 0 28 3 28 26 28 26 4 21 27 29 30 2 8 0 19 8 2 22 22 0 8 2 19 25 19 25 1 3 0 3 3 2 35 0 12 19 3 32 33 34 36 2 12 12 14 14 2 7 7 12 12 3 38 38 39 39 2 12 19 12 19 3 34 41 34 41 2 12 12 12 12 3 43 43 43 43 4 37 40 42 44 2 0 19 0 0 2 25 12 8 22 3 28 26 46 47 4 29 30 29 48 2 19 25 19 8 1 0 3 0 0 1 3 0 0 0 2 12 51 52 5 3 34 41 50 53 3 43 43 39 39 4 42 44 54 55 5 31 45 49 56 6 0 18 0 57 4 0 0 16 16 2 0 0 35 0 2 14 8 7 7 2 0 0 8 0 3 60 0 61 62 4 0 0 63 0 5 0 0 59 64 4 40 40 44 44 2 12 22 14 52 2 52 5 5 22 2 52 5 12 19 3 67 68 69 26 2 35 0 12 0 3 32 0 34 71 3 41 26 41 26 2 12 0 12 0 3 34 74 34 74 4 70 72 73 75 4 44 44 55 55 2 7 19 35 0 3 41 26 78 47 2 12 0 52 0 3 34 74 50 80 4 73 75 79 81 5 66 76 77 82 6 65 0 83 0 2 0 14 19 5 2 14 14 14 14 2 19 19 19 51 1 3 3 3 0 2 12 88 5 5 3 85 86 87 89 2 19 5 19 19 2 19 19 19 19 3 91 26 92 26 4 29 90 29 93 1 0 0 3 0 1 0 3 3 3 2 52 95 96 5 2 7 95 8 5 3 97 10 98 33 3 15 15 38 38 3 34 36 34 41 3 39 39 43 43 4 99 100 101 102 3 92 26 92 26 4 29 104 29 104 4 42 44 42 44 5 94 103 105 106 2 0 51 0 0 3 0 28 0 108 2 19 19 51 95 2 95 51 51 95 2 95 22 19 0 3 110 47 111 112 2 95 8 51 95 3 108 114 0 108 4 109 113 0 115 2 19 52 25 5 3 50 53 117 10 3 39 39 15 15 2 51 95 8 51 2 22 22 95 8 3 120 121 114 120 2 7 7 7 7 2 7 7 7 95 3 38 38 123 124 4 118 119 122 125 2 95 8 96 95 2 51 19 7 7 3 108 127 46 128 2 5 7 22 52 2 95 25 25 51 2 0 7 14 95 2 8 0 19 0 3 130 131 132 133 2 0 5 35 25 3 0 0 6 135 2 5 19 22 22 2 51 95 0 25 2 22 96 0 0 2 8 51 5 35 3 137 138 139 140 4 129 134 136 141 5 116 126 0 142 6 0 107 0 143 4 100 100 102 102 2 0 95 8 14 2 52 95 5 5 3 61 146 67 147 2 25 0 51 8 2 0 0 14 0 2 7 14 8 5 3 149 150 151 114 3 69 26 41 26 2 35 19 12 19 3 34 154 34 41 4 148 152 153 155 4 44 44 44 44 4 73 42 73 42 5 145 156 157 158 3 0 0 62 0 2 19 0 19 0 3 161 0 161 0 4 160 0 162 0 4 162 0 162 0 5 163 0 164 0 2 7 7 0 0 3 38 38 166 166 4 119 119 167 167 2 0 22 8 0 3 78 47 61 169 2 12 19 52 1 2 19 52 25 1 2 1 5 5 52 3 50 171 172 173 2 52 25 1 5 2 52 1 1 5 2 5 52 52 1 3 67 175 176 177 2 25 25 52 25 2 25 0 25 0 2 52 0 0 0 3 179 180 173 181 4 170 174 178 182 2 1 8 88 19 2 51 7 0 0 2 95 5 25 19 3 184 0 185 186 2 1 8 25 22 2 5 1 52 5 2 7 52 5 7 2 0 25 95 25 3 188 189 190 191 2 25 1 25 25 2 95 0 25 0 2 25 8 25 19 3 0 193 194 195 2 19 51 1 7 2 88 0 5 95 2 25 96 35 1 3 197 198 161 199 4 187 192 196 200 2 1 5 0 25 2 0 25 0 25 3 177 202 161 203 3 181 0 0 0 2 1 0 0 0 3 161 203 206 203 4 204 205 207 0 5 168 183 201 208 3 161 0 181 0 4 210 0 0 0 5 211 0 0 0 6 159 165 209 212 7 58 84 144 213 2 0 5 5 52 3 0 6 6 215 2 5 35 5 25 3 0 0 0 217 2 0 22 5 22 2 22 0 96 8 2 25 0 35 0 2 0 5 0 5 3 219 220 221 222 4 0 216 218 223 5 0 0 0 224 3 0 6 0 219 2 0 0 52 0 2 5 5 22 22 3 0 0 227 228 2 52 7 0 0 2 52 8 0 22 3 217 221 230 231 4 0 226 229 232 2 25 35 7 52 3 215 234 220 6 2 0 0 8 5 2 5 25 52 7 2 22 22 22 96 3 236 237 238 62 2 35 35 25 35 2 5 52 22 0 2 7 52 0 0 3 222 240 241 242 2 5 0 0 0 2 8 5 22 22 2 52 7 52 0 3 244 217 245 246 4 235 239 243 247 2 0 5 35 35 3 249 139 234 236 2 8 0 5 35 2 5 22 25 0 2 35 0 52 8 3 251 252 237 253 3 6 238 240 0 2 35 0 35 0 3 62 219 217 256 4 250 254 255 257 2 96 8 0 5 3 259 135 215 234 3 139 251 236 237 2 22 52 96 8 2 35 25 25 35 3 262 6 222 263 3 238 62 0 217 4 260 261 264 265 5 233 248 258 266 2 0 5 0 0 3 268 234 0 0 4 0 136 0 269 3 228 246 139 251 2 5 52 22 52 2 5 22 35 0 3 231 272 273 259 3 253 215 219 262 4 271 274 239 275 2 0 7 0 0 3 0 217 0 277 3 221 222 231 241 2 0 22 0 0 3 280 259 0 268 4 278 279 0 281 5 270 276 0 282 3 242 245 135 139 3 246 231 251 252 3 234 236 6 238 3 237 253 62 219 4 284 285 286 287 3 272 242 259 135 3 245 230 139 251 4 289 290 235 239 3 240 0 242 245 3 217 256 230 231 3 135 139 234 236 3 251 273 237 253 4 292 293 294 295 3 222 263 241 242 2 52 7 0 95 3 0 217 245 298 2 22 51 51 95 2 1 95 25 19 2 51 88 19 19 3 139 300 301 302 4 297 299 260 303 5 288 291 296 304 6 225 267 283 305 2 25 19 19 51 3 253 307 219 262 2 19 51 95 25 2 95 0 51 95 2 25 51 51 95 2 95 25 25 8 3 309 310 311 312 2 8 19 22 22 3 263 110 242 314 4 308 313 279 315 2 5 7 19 51 2 95 25 88 0 2 1 7 19 0 3 317 318 319 0 2 0 0 95 0 2 25 0 8 0 3 120 321 203 322 4 320 0 323 0 3 273 259 253 215 4 325 294 223 255 2 95 25 25 19 3 140 327 237 253 2 25 0 19 0 3 0 0 329 0 2 25 0 35 1 3 62 219 217 331 2 22 0 96 22 2 0 51 95 51 2 95 8 88 0 3 333 310 334 335 4 328 330 332 336 5 316 324 326 337 2 0 0 0 51 1 0 2 0 0 2 0 0 0 340 3 0 0 339 341 4 0 0 0 342 2 0 0 5 0 3 0 0 301 344 2 96 95 1 95 2 22 52 19 0 2 35 8 25 51 2 19 0 1 0 3 346 347 348 349 4 345 0 350 0 2 0 0 0 95 3 0 0 0 352 1 0 3 1 1 2 0 0 0 354 1 0 3 1 3 2 0 1 356 95 1 0 2 3 2 2 0 358 1 340 1 1 3 0 0 2 19 95 360 51 3 355 357 359 361 1 3 3 1 0 1 0 2 3 0 1 1 0 1 3 2 51 363 364 365 2 96 96 356 19 3 0 366 367 321 2 25 0 88 95 2 0 51 0 364 2 0 96 0 356 2 96 95 19 95 3 369 370 371 372 4 353 362 368 373 5 0 343 351 374 3 231 241 252 259 3 242 245 249 139 2 22 52 96 22 3 253 215 219 378 3 234 301 310 346 4 376 377 379 380 2 52 25 0 96 2 95 1 8 35 3 298 382 300 383 2 19 19 95 22 2 19 0 52 25 2 95 19 8 19 2 0 96 0 19 3 385 386 387 388 1 0 3 2 2 1 0 0 2 0 2 25 25 390 391 3 302 203 347 392 2 51 1 51 88 1 0 0 0 2 2 0 395 5 52 1 1 0 0 0 2 0 8 395 397 3 394 396 398 181 4 384 389 393 399 3 331 334 382 385 1 0 1 0 0 2 25 402 25 0 3 335 348 386 403 3 383 387 203 394 1 0 1 0 2 2 0 96 0 406 2 95 5 395 397 3 407 408 215 181 4 401 404 405 409 2 19 5 5 52 1 1 1 2 0 2 412 395 8 52 2 397 0 0 0 3 349 411 413 414 4 415 205 205 0 5 381 400 410 416 2 25 51 25 0 1 1 0 0 2 2 88 0 419 0 2 95 5 5 52 2 52 0 0 358 3 418 420 421 422 2 95 364 88 88 1 0 3 1 0 1 0 2 3 3 2 0 425 426 0 2 35 88 0 0 3 339 424 427 428 2 0 358 0 340 3 414 430 0 0 2 19 95 7 51 1 0 0 1 0 2 0 0 433 425 2 0 51 0 51 1 1 2 1 0 1 2 0 3 0 1 1 0 1 2 2 436 437 438 88 3 432 434 435 439 4 423 429 431 440 2 51 95 51 88 2 95 0 96 358 2 425 35 95 0 3 185 442 443 444 2 364 51 88 0 2 7 51 0 51 2 88 95 0 96 2 0 425 358 0 3 446 447 448 449 1 0 2 0 2 1 3 2 0 0 2 96 451 51 452 1 2 2 3 0 1 3 0 3 2 2 340 454 1 455 3 453 310 321 456 2 0 96 425 51 2 451 95 452 51 1 1 3 1 0 2 460 0 460 95 2 0 340 0 1 3 458 459 461 462 4 445 450 457 463 2 96 354 96 451 1 1 2 0 0 2 51 466 0 0 3 465 321 467 442 2 0 354 0 358 2 356 95 19 95 1 3 0 1 0 2 1 340 471 0 2 360 51 0 51 3 469 470 472 473 2 51 35 0 0 3 0 475 0 0 2 436 95 0 96 2 0 364 96 0 2 0 96 0 51 2 19 433 7 340 3 477 478 479 480 4 468 474 476 481 5 441 464 0 482 6 338 375 417 483 3 0 238 0 0 2 52 0 8 0 1 0 1 3 0 2 25 0 35 487 3 486 219 217 488 2 52 0 1 7 2 8 35 25 25 3 277 490 0 491 4 485 489 0 492 2 0 51 391 402 2 95 8 412 0 3 333 310 494 495 1 0 1 0 3 2 19 497 95 22 1 3 0 2 0 2 19 0 52 499 2 52 25 7 5 2 0 390 8 19 3 498 500 501 502 2 88 5 8 52 2 391 395 5 52 3 418 504 505 414 4 496 350 503 506 2 25 0 25 19 2 51 52 0 0 3 0 508 0 509 4 0 510 0 0 2 14 402 0 25 1 1 0 3 3 2 390 5 5 513 2 0 8 0 0 2 0 25 8 51 3 512 514 515 516 3 181 0 9 0 3 0 515 0 0 2 0 19 8 51 3 520 321 515 120 4 517 518 519 521 5 493 507 511 522 4 0 519 0 0 5 0 524 0 0 6 0 523 0 525 2 25 25 96 95 2 0 419 5 52 2 19 5 395 397 3 527 528 529 181 3 414 0 0 0 4 530 531 205 0 3 0 0 321 0 4 0 0 533 0 5 532 0 534 0 3 0 435 0 0 4 0 536 0 0 5 0 537 0 0 2 51 7 7 7 3 539 123 0 0 3 123 123 0 0 4 540 541 0 0 4 541 541 0 0 5 542 543 0 0 5 543 543 0 0 6 535 538 544 545 7 306 484 526 546 8 0 214 0 547 1 2 1 0 0 2 0 0 5 549 2 0 0 452 425 3 0 0 550 551 4 0 0 0 552 2 0 0 0 358 1 1 3 1 3 1 2 1 2 1 2 0 0 555 556 1 0 1 2 0 1 0 0 3 2 2 558 559 549 452 1 0 0 1 3 1 0 0 2 1 2 561 562 360 549 3 554 557 560 563 1 3 2 3 2 2 0 0 565 555 2 0 0 556 565 2 559 561 452 360 2 562 559 549 452 3 566 567 568 569 4 0 0 564 570 5 0 0 553 571 3 557 566 563 568 2 0 0 433 0 2 425 391 360 549 3 567 574 569 575 4 0 0 573 576 5 0 0 577 534 1 0 0 0 1 2 0 395 579 52 1 1 0 2 0 2 0 5 0 581 1 2 0 0 0 1 3 3 1 1 2 583 390 0 584 3 0 580 582 585 2 397 364 558 581 2 95 51 412 391 1 0 3 0 1 1 0 2 0 3 2 589 471 590 437 1 0 3 0 2 1 2 2 3 3 2 584 592 593 589 3 587 588 591 594 2 0 471 0 437 1 1 1 2 2 2 0 593 0 597 2 0 581 0 471 2 0 584 0 593 3 596 598 599 600 2 406 581 589 471 2 597 590 584 406 2 590 437 406 581 2 593 589 597 590 3 602 603 604 605 4 586 595 601 606 1 2 1 2 0 2 608 565 402 559 2 555 556 561 562 2 391 340 471 12 2 360 549 12 12 3 609 610 611 612 2 565 555 559 561 2 556 565 562 559 2 452 360 12 12 2 549 452 12 12 3 614 615 616 617 2 437 12 581 12 2 471 12 437 12 3 619 43 620 43 4 613 618 621 44 2 0 437 0 581 2 0 597 0 584 3 623 624 596 598 2 584 406 593 589 3 591 626 602 603 2 0 597 0 51 3 599 600 623 628 1 0 2 1 0 2 589 471 630 437 2 584 406 454 425 3 604 605 631 632 4 625 627 629 633 2 581 12 471 12 3 635 43 619 43 2 581 7 0 96 3 620 43 637 39 4 636 44 638 55 5 607 622 634 639 3 610 614 612 616 2 460 608 425 0 2 0 354 25 593 3 615 642 617 643 2 25 597 25 584 2 25 593 25 597 3 43 645 43 646 4 641 644 44 647 2 0 558 425 471 2 391 0 363 433 3 649 650 604 605 2 433 0 437 0 3 0 0 652 0 2 581 0 471 0 2 437 0 581 0 3 654 0 655 0 4 651 653 627 656 2 25 584 25 593 3 43 658 43 645 2 52 584 95 340 3 43 646 39 660 4 44 659 55 661 3 604 605 591 626 2 471 0 437 0 3 664 0 654 0 2 590 437 487 581 2 593 589 412 364 3 602 603 666 667 2 471 0 0 0 3 655 0 669 0 4 663 665 668 670 5 648 657 662 671 6 572 578 640 672 2 0 0 364 360 3 0 0 0 674 2 0 0 5 556 1 2 0 0 1 2 0 395 677 452 1 1 0 0 3 2 679 562 360 549 3 0 676 678 680 4 0 0 675 681 4 0 0 570 573 5 0 0 682 683 2 0 364 406 0 3 0 0 0 685 2 589 0 590 0 2 406 0 589 0 3 0 687 0 688 4 0 686 0 689 2 590 0 406 0 3 0 691 0 687 3 0 688 0 691 4 0 692 0 693 5 0 690 0 694 2 0 558 425 395 1 2 0 0 3 1 1 1 0 2 2 5 697 698 406 2 395 499 589 471 2 584 589 593 590 3 696 699 700 701 1 3 2 0 2 2 0 703 419 0 1 1 3 0 3 2 705 556 679 562 1 3 0 2 2 2 471 707 437 584 2 0 549 19 12 3 704 706 708 709 2 597 406 584 589 2 593 590 597 406 3 604 711 591 712 2 581 593 471 597 2 19 12 19 12 2 437 584 581 593 3 714 715 716 715 4 702 710 713 717 4 618 641 44 44 3 602 701 604 711 2 471 597 437 584 3 721 715 714 715 1 3 0 0 1 2 406 581 0 723 1 2 2 0 3 2 584 589 725 590 3 591 712 724 726 2 471 597 677 52 2 51 7 5 12 3 716 715 728 729 4 720 722 727 730 5 718 719 731 77 6 0 684 695 732 2 579 559 437 14 2 581 12 471 52 3 596 734 599 735 2 561 558 14 14 2 5 0 25 1 2 12 7 433 425 2 8 51 433 433 3 737 738 739 740 2 437 426 581 597 2 471 584 437 593 3 623 742 596 743 3 604 712 591 701 4 736 741 744 745 2 1 14 7 7 2 88 12 51 14 3 747 15 748 38 2 95 51 581 12 3 750 39 620 43 4 749 100 751 102 2 581 597 471 584 2 437 593 581 597 3 599 753 623 754 3 602 711 604 712 3 596 743 599 753 3 591 701 602 711 4 755 756 757 758 3 620 43 635 43 4 636 44 760 44 5 746 752 759 761 2 1 95 7 7 2 88 88 1 0 3 15 763 38 764 2 0 426 25 597 3 39 766 43 658 4 100 765 102 767 2 5 589 14 95 1 2 3 0 0 1 0 0 1 2 2 0 0 770 771 2 5 51 433 425 2 8 14 433 433 3 769 772 773 774 2 402 391 8 51 3 321 0 776 574 2 95 25 581 25 2 471 25 437 25 3 778 655 779 664 4 775 777 745 780 4 44 647 44 659 2 581 25 471 25 2 437 25 581 25 3 783 654 784 655 3 779 664 783 654 4 756 785 758 786 5 768 781 782 787 2 437 593 419 402 2 0 723 0 0 2 0 723 697 0 3 623 789 790 791 2 590 437 558 581 2 593 590 412 558 2 51 471 437 590 2 363 0 0 630 3 793 794 795 796 2 0 419 0 0 3 0 798 0 0 2 402 391 723 51 2 419 340 433 723 2 0 697 0 0 2 340 95 419 402 3 800 801 802 803 4 792 797 799 804 1 0 3 2 3 2 437 7 0 806 1 1 2 1 2 1 3 1 3 1 2 7 7 808 809 1 0 0 2 3 1 3 1 0 0 2 487 811 812 770 1 0 0 3 1 2 771 814 466 812 3 807 810 813 815 1 2 3 2 3 2 7 7 817 808 2 7 7 809 817 2 811 771 770 466 2 814 811 812 770 3 818 819 820 821 1 3 1 3 0 2 823 817 402 811 2 808 809 771 814 2 697 51 391 466 2 466 812 812 770 3 824 825 826 827 2 817 808 811 771 2 809 817 814 811 2 770 466 419 0 2 812 770 0 0 3 829 830 831 832 4 816 822 828 833 2 0 723 0 5 2 0 581 0 51 3 0 835 0 836 2 0 0 0 96 3 0 0 0 838 4 0 837 0 839 1 2 0 2 3 2 51 433 841 340 2 487 697 454 19 2 583 25 7 723 2 51 7 811 0 3 842 843 844 845 2 589 5 0 725 2 466 95 583 25 2 7 723 0 590 3 847 848 652 849 2 95 25 363 25 2 365 88 0 0 3 339 851 478 852 2 8 0 589 0 2 0 19 0 589 2 95 697 96 96 2 0 590 0 19 3 854 855 856 857 4 846 850 853 858 5 805 834 840 859 3 810 818 815 820 2 52 593 433 402 2 630 95 466 812 3 819 862 821 863 2 466 812 0 0 2 770 466 0 0 3 825 829 865 866 2 436 823 630 5 2 812 770 0 579 2 395 397 52 558 3 830 868 869 870 4 861 864 867 871 2 51 471 391 590 2 363 5 5 52 3 793 794 873 874 2 437 25 5 52 2 52 425 364 0 3 876 655 877 0 2 589 406 583 425 2 19 406 19 589 2 364 5 5 52 2 52 364 558 0 3 879 880 881 882 4 875 878 883 0 2 0 5 0 19 2 549 95 340 454 2 0 425 0 437 2 7 0 364 679 3 885 886 887 888 2 561 583 0 364 2 425 5 5 52 3 890 891 688 180 2 5 52 589 579 2 25 725 7 52 2 340 95 0 25 2 437 19 25 19 3 893 894 895 896 2 583 0 14 0 2 5 35 14 52 3 898 180 899 181 4 889 892 897 900 2 52 425 590 0 3 902 0 688 0 3 691 0 687 0 4 903 0 904 0 5 872 884 901 905 6 762 788 860 906 2 589 0 590 590 2 406 406 589 589 3 0 908 0 909 2 590 590 406 406 2 589 589 590 590 3 0 911 0 912 4 0 910 0 913 3 0 909 0 911 3 0 912 0 909 4 0 915 0 916 5 0 914 0 917 2 561 562 5 14 2 559 397 14 96 2 19 12 51 579 2 88 7 579 723 3 919 920 921 922 2 95 5 5 7 2 8 14 7 7 2 95 22 579 0 2 22 12 8 14 3 924 925 926 927 2 5 437 406 581 3 929 712 591 701 1 2 0 3 3 2 437 931 581 597 2 0 7 19 12 3 932 933 743 715 4 923 928 930 934 3 753 715 754 715 3 743 715 753 715 4 756 936 758 937 5 935 145 938 157 2 590 590 406 402 2 51 433 0 340 3 0 940 0 941 4 0 942 0 0 5 0 943 0 0 2 590 437 391 419 2 593 590 698 406 2 51 433 95 590 1 3 3 0 1 2 948 589 0 437 3 945 946 947 949 2 437 593 419 397 2 51 7 395 809 2 52 5 579 770 2 419 814 466 812 3 951 952 953 954 2 402 391 0 51 2 419 402 433 723 2 340 95 0 402 3 956 957 0 958 1 2 3 0 3 2 391 960 51 433 1 1 2 0 2 2 962 809 419 814 2 697 340 391 419 2 95 812 402 770 3 961 963 964 965 4 950 955 959 966 2 770 466 466 812 2 812 770 391 0 3 829 830 968 969 4 822 861 970 867 2 51 433 0 358 2 723 5 95 725 2 406 340 0 7 2 19 0 7 771 3 972 973 974 975 2 0 5 0 948 2 0 0 5 35 1 2 1 0 1 2 5 979 25 0 3 0 977 978 980 4 0 976 0 981 2 471 487 340 454 2 7 723 95 590 3 848 983 984 108 2 697 0 19 0 2 0 364 0 25 2 7 433 0 437 2 579 7 590 5 3 986 987 988 989 2 19 51 22 0 2 95 0 471 0 2 340 95 35 25 3 991 992 259 993 2 0 25 0 471 2 1 19 471 425 2 0 437 0 25 2 697 590 19 19 3 995 996 997 998 4 985 990 994 999 5 967 971 982 1000 6 918 939 944 1001 7 673 733 907 1002 1 2 0 2 1 2 0 0 555 1004 3 567 1005 569 563 1 3 0 0 2 2 1007 0 452 679 3 0 0 1008 0 4 0 0 1006 1009 5 0 0 1010 0 3 0 0 0 6 4 0 0 0 1012 5 0 0 0 1013 2 360 583 12 12 3 615 610 617 1015 2 703 397 52 579 2 395 419 948 589 2 579 471 590 437 3 1017 1018 1019 712 4 1016 1020 44 720 2 0 0 723 0 1 3 0 1 1 2 437 1023 581 593 3 1022 0 1024 0 3 721 0 714 0 4 1025 0 1026 0 3 591 712 602 701 2 7 7 12 35 3 43 43 39 1029 2 589 471 0 697 3 604 711 1031 946 4 44 1028 1030 1032 3 716 0 721 0 2 437 584 679 583 3 714 0 1035 0 4 1034 0 1036 0 5 1021 1027 1033 1037 2 0 0 0 579 2 5 583 581 0 2 390 589 584 590 3 1039 870 1040 1041 2 593 406 597 589 2 584 590 593 406 3 664 1043 654 1044 4 0 1042 0 1045 2 597 589 584 590 3 655 1047 664 1043 2 597 589 51 630 3 654 1044 655 1049 4 0 1048 0 1050 5 0 1046 0 1051 6 1011 1014 1038 1052 2 0 0 549 452 2 0 558 425 549 3 0 0 1054 1055 2 0 0 358 555 3 1057 567 568 569 4 0 0 1056 1058 3 567 557 569 563 4 0 0 573 1060 5 0 0 1059 1061 2 0 0 565 433 2 559 425 452 360 2 391 0 549 95 3 1063 0 1064 1065 4 0 0 1066 0 5 0 0 1067 0 2 364 95 581 412 2 51 608 391 402 2 592 391 589 471 3 1069 1070 743 1071 2 340 360 12 12 3 614 615 1073 617 3 753 604 754 591 4 1072 1074 1075 44 3 615 610 617 612 4 641 1077 44 44 3 743 602 753 604 2 471 584 437 454 2 406 581 425 0 3 754 591 1080 1081 2 7 7 96 12 3 43 43 1083 39 4 1079 44 1082 1084 5 1076 1078 1085 77 2 565 460 559 425 2 608 0 0 425 2 452 0 12 25 2 354 590 593 406 3 1087 1088 1089 1090 2 558 391 471 363 2 589 433 590 437 3 1092 574 754 1093 2 12 25 12 25 3 1095 1047 1095 1043 4 1091 1094 1096 1079 3 1095 1044 1095 1047 3 754 591 743 602 2 7 52 12 95 2 584 590 340 487 3 1095 1043 1100 1101 2 437 593 581 412 2 589 471 364 0 3 753 604 1103 1104 4 1098 1099 1102 1105 5 1097 0 1106 0 6 1062 1068 1086 1107 2 8 0 7 8 2 95 471 14 340 2 22 52 52 579 2 95 7 579 723 3 1109 1110 1111 1112 2 7 52 12 12 3 39 1114 43 43 4 100 1113 1115 930 2 0 0 723 811 2 14 95 579 51 2 419 0 95 723 3 1117 0 1118 1119 2 19 590 19 406 2 19 589 19 590 3 932 1121 743 1122 4 1120 0 1123 0 4 44 756 44 758 3 753 880 754 1121 3 743 1122 753 880 4 1126 0 1127 0 5 1116 1124 1125 1128 2 471 579 437 437 2 559 561 14 14 2 581 581 471 471 2 12 12 52 433 3 1130 1131 1132 1133 2 437 437 581 581 2 426 590 597 406 2 471 471 437 437 3 1135 1136 1137 701 4 0 1134 0 1138 3 1132 711 1135 712 3 1137 701 1132 711 4 0 1140 0 1141 5 0 1139 0 1142 1 3 0 3 1 2 7 7 808 1144 3 819 1145 821 815 2 590 437 0 419 2 697 0 770 419 3 1147 946 1148 949 2 466 52 0 425 3 830 825 832 1150 2 960 397 583 364 2 471 581 579 52 2 558 5 395 397 2 583 1 1 395 3 1152 1153 1154 1155 4 1146 1149 1151 1156 2 19 590 1 406 2 579 52 583 0 3 951 1158 176 1159 2 25 581 25 471 2 5 583 397 0 3 1161 0 1162 0 4 1160 0 1163 0 2 679 579 725 583 2 364 579 5 583 2 52 0 549 95 2 581 19 471 19 3 1165 1166 1167 1168 2 52 1 1 0 2 579 52 437 0 3 1170 1171 0 654 2 340 454 7 5 2 0 19 95 19 2 0 25 0 35 2 96 1 1 0 3 1173 1174 1175 1176 3 0 655 0 664 4 1169 1172 1177 1178 5 1157 1164 1179 0 2 437 437 581 419 2 593 590 402 558 2 723 0 0 697 2 723 51 0 437 3 1181 1182 1183 1184 2 419 402 0 723 3 0 1186 0 0 4 0 1185 0 1187 5 0 1188 0 0 6 1129 1143 1180 1189 2 558 5 14 25 2 0 1 1 7 2 7 8 425 433 2 51 88 433 51 3 1191 1192 1193 1194 2 590 95 406 581 3 754 1196 743 591 2 51 7 12 12 3 1198 39 43 43 4 1195 100 1197 1199 3 753 602 754 604 3 743 591 753 602 4 1201 44 1202 44 5 1200 145 1203 157 2 14 1 7 7 2 95 5 7 14 2 12 88 14 1 2 88 5 0 433 3 1205 1206 1207 1208 2 589 0 95 770 2 0 0 771 95 2 51 8 425 433 2 14 402 433 8 3 1210 1211 1212 1213 2 7 0 12 25 3 1215 1136 1095 701 4 1209 1214 1216 1197 2 391 0 51 433 3 0 0 1218 0 2 25 437 25 581 2 25 471 25 437 3 1220 0 1221 0 4 1219 0 1222 0 3 1095 711 1095 712 3 1095 701 1095 711 4 1224 1201 1225 1202 3 1161 0 1220 0 3 1221 0 1161 0 4 1227 0 1228 0 5 1217 1223 1226 1229 2 590 437 558 0 2 471 363 590 0 2 0 487 630 812 3 1103 1231 1232 1233 2 7 7 806 808 3 1235 819 820 821 2 391 419 51 433 2 340 823 723 402 2 697 340 0 419 2 95 697 402 391 3 1237 1238 1239 1240 2 51 466 466 812 2 812 770 770 419 3 829 830 1242 1243 4 1234 1236 1241 1244 3 819 810 821 815 3 830 825 832 865 4 861 1246 867 1247 2 723 51 5 841 2 581 583 51 7 3 0 1249 0 1250 2 433 487 340 454 2 697 589 19 0 2 25 51 723 811 3 1252 1253 1254 988 2 0 0 96 96 3 0 0 0 1256 2 0 95 51 363 2 25 8 25 589 2 364 365 0 0 3 1258 1259 1260 448 4 1251 1255 1257 1261 2 5 466 725 583 2 723 0 590 0 3 1263 194 277 1264 2 5 549 19 340 2 95 561 454 0 2 425 7 437 364 2 0 406 679 589 3 1266 1267 1268 1269 2 19 5 589 589 2 697 0 96 0 2 590 340 19 0 3 0 1271 1272 1273 2 52 25 579 7 2 725 583 52 14 2 95 437 25 25 2 19 5 19 14 3 1275 1276 1277 1278 4 1265 1270 1274 1279 5 1245 1248 1262 1280 2 7 52 817 433 2 811 630 770 466 2 95 51 812 391 3 1282 1182 1283 1284 2 590 437 558 5 2 471 363 590 5 2 5 52 52 364 3 1103 1286 1287 1288 2 817 436 811 630 2 823 589 5 583 2 770 395 579 52 2 397 364 558 5 3 1290 1291 1292 1293 2 406 19 425 19 2 5 52 52 558 2 364 0 0 0 3 1295 688 1296 1297 4 1285 1289 1294 1298 2 25 437 52 581 2 425 0 0 0 3 1300 0 1301 0 4 1302 0 0 0 2 583 425 364 5 2 5 52 52 590 2 0 406 0 589 3 1304 1305 203 1306 3 1301 0 0 0 2 0 590 0 406 2 35 52 52 0 2 0 589 0 590 3 203 1309 1310 1311 4 1307 1308 1312 0 5 1299 1303 1313 0 6 1204 1230 1281 1314 7 1053 1108 1190 1315 2 0 356 364 51 2 51 88 425 35 3 352 1317 1318 369 2 96 358 96 451 1 1 0 1 0 2 95 425 454 1321 2 51 452 0 0 3 0 1320 1322 1323 2 0 96 0 96 2 51 95 340 454 2 425 51 1321 0 3 321 1325 1326 1327 4 0 1319 1324 1328 2 0 0 95 364 2 0 51 0 425 2 88 25 35 88 3 432 1330 1331 1332 2 356 19 51 7 2 95 589 51 95 3 1334 1335 321 1318 2 358 95 451 95 2 95 0 0 0 2 452 51 0 340 2 95 425 454 460 3 1337 1338 1339 1340 3 1320 321 1323 1326 4 1333 1336 1341 1342 2 455 460 0 0 2 95 0 354 356 2 0 0 95 1 2 358 19 340 360 3 1344 1345 1346 1347 2 1 455 0 0 2 460 95 0 354 3 1349 1350 310 359 2 363 25 365 88 3 1352 321 0 367 2 88 0 88 95 2 95 0 95 0 3 366 1354 1355 371 4 1348 1351 1353 1356 2 0 1 356 0 3 1358 1344 361 1346 2 1 455 95 0 3 1345 1360 1347 310 2 96 0 19 95 3 370 1352 1362 0 3 321 366 367 321 4 1359 1361 1363 1364 5 1329 1343 1357 1365 2 0 471 437 697 2 471 8 590 0 2 88 19 88 95 2 0 8 723 589 3 1367 1368 1369 1370 2 425 8 437 948 2 19 5 51 95 2 7 583 471 0 3 62 1372 1373 1374 2 358 0 451 95 3 1325 1376 1327 1339 2 437 25 8 51 2 697 0 95 8 2 95 471 454 1321 2 19 589 19 340 3 1378 1379 1380 1381 4 1371 1375 1377 1382 2 406 0 52 0 3 1384 0 0 0 4 1385 0 533 0 3 1350 1358 359 361 2 95 8 96 96 2 96 19 51 7 3 1344 1388 1346 1389 2 0 51 0 1 3 369 1391 1325 372 3 1332 321 0 367 4 1387 1390 1392 1393 2 19 0 0 471 2 95 590 51 95 2 0 0 25 0 3 1395 0 1396 1397 2 8 0 0 25 3 0 0 885 1399 2 25 5 88 25 2 0 0 14 8 2 0 8 0 22 3 366 1401 1402 1403 2 0 5 8 5 2 35 51 8 0 2 51 96 52 19 2 1 95 0 8 3 1405 1406 1407 1408 4 1398 1400 1404 1409 5 1383 1386 1394 1410 3 424 185 428 443 2 425 35 0 0 3 442 446 1413 448 2 0 0 95 425 2 454 1321 455 460 3 1415 453 1416 321 2 1321 0 460 95 3 310 458 456 1418 4 1412 1414 1417 1419 2 95 364 88 25 3 447 1421 449 428 2 95 0 96 96 2 1 35 0 0 3 185 442 1423 1424 3 459 1346 1391 1332 3 1389 310 321 456 4 1422 1425 1426 1427 2 354 356 358 19 2 95 1 363 25 2 340 360 0 0 3 0 1429 1430 1431 2 1 51 25 0 3 1355 1325 442 1433 3 852 1423 1346 1389 2 1 35 95 0 3 1436 448 310 1317 4 1432 1434 1435 1437 3 1362 0 447 1430 2 340 360 5 0 2 19 0 5 35 3 1429 1402 1440 1441 2 19 14 7 19 3 478 852 1443 1399 2 25 8 8 51 2 5 8 96 1 2 22 52 25 25 3 1445 1446 1447 161 4 1439 1442 1444 1448 5 1420 1428 1438 1449 2 0 425 358 95 3 1433 447 448 1451 2 51 7 5 0 3 1421 1453 428 1445 2 451 14 452 19 2 460 5 460 25 3 458 1455 1456 1405 2 88 19 25 395 3 1399 1447 1406 1458 4 1452 1454 1457 1459 2 25 25 51 88 3 1441 1461 1446 191 2 25 19 19 19 2 0 22 0 402 2 5 35 0 25 2 0 1 1 0 3 1463 1464 1465 1466 2 8 52 22 52 2 19 0 707 0 2 51 1 558 0 3 161 1468 1469 1470 2 0 558 1 0 3 1472 0 0 0 4 1462 1467 1471 1473 3 1403 1407 1461 1463 2 25 0 52 0 2 0 698 0 51 2 397 558 1 0 3 1408 1476 1477 1478 2 5 35 0 581 3 191 1480 1468 1466 2 0 1 558 0 3 1482 0 0 0 4 1475 1479 1481 1483 2 25 1 1 0 3 1485 0 0 0 4 1486 0 0 0 5 1460 1474 1484 1487 6 1366 1411 1450 1488 2 0 0 0 52 3 0 0 0 1490 2 0 5 0 725 2 579 52 979 0 3 0 222 1492 1493 4 0 0 1491 1494 2 88 0 25 0 3 1496 0 1476 0 2 0 5 0 579 3 0 6 1498 263 4 533 0 1497 1499 2 0 0 579 1023 2 0 0 5 5 1 2 0 2 0 2 5 1503 52 549 3 0 1501 1502 1504 1 0 1 2 1 2 1506 8 0 579 3 273 1507 253 215 2 948 22 979 96 2 5 35 579 25 3 1509 62 0 1510 2 0 948 5 979 3 1512 220 256 1498 4 1505 1508 1511 1513 5 0 1495 1500 1514 3 0 1502 1039 238 2 579 25 583 7 2 0 22 579 22 3 1517 253 62 1518 2 35 1503 25 841 2 7 583 0 0 2 8 579 725 979 3 1520 0 1521 1522 2 841 5 841 0 2 583 8 0 725 3 217 1524 230 1525 4 1516 1519 1523 1526 2 0 579 5 583 3 1528 234 220 1039 2 0 471 8 590 2 589 589 340 95 2 52 25 8 51 3 1530 1531 238 1532 2 579 52 979 52 3 222 1520 1534 1521 3 0 217 1522 230 4 1529 1533 1535 1536 2 0 5 1023 25 2 22 1506 0 0 2 1503 35 549 52 3 1538 1539 1540 236 2 8 0 579 1023 3 1542 252 1504 253 3 6 1509 240 0 3 486 1512 1510 221 4 1541 1543 1544 1545 2 0 5 1023 35 3 1507 1547 215 1540 3 1539 1542 236 1504 3 220 6 1498 263 3 1509 62 0 217 4 1548 1549 1550 1551 5 1527 1537 1546 1552 2 52 0 391 0 2 0 5 0 22 2 0 0 5 841 2 579 22 437 0 3 1554 1555 1556 1557 2 5 583 22 52 2 0 579 35 841 3 1559 242 259 1560 2 5 1503 0 770 2 35 0 52 723 1 3 1 0 1 2 0 1564 0 1564 3 1562 1563 0 1565 2 0 5 579 52 2 25 841 7 583 2 725 0 806 8 3 1567 1568 1569 6 4 1558 1561 1566 1570 2 583 7 52 0 3 245 1572 139 251 2 579 22 1503 0 3 231 1559 1574 259 2 0 0 8 579 2 725 979 22 1506 3 1576 237 1577 486 2 841 0 583 8 2 0 725 5 22 2 979 0 1506 8 3 1579 1567 1580 1581 4 1573 1575 1578 1582 2 1144 471 25 841 2 812 583 0 0 3 222 1584 0 1585 4 0 1586 0 0 2 579 1023 5 1503 2 8 5 22 948 2 52 549 0 0 3 0 1588 1589 1590 2 0 579 0 5 2 52 8 0 948 3 256 1592 1593 241 1 0 1 3 1 2 22 1595 0 0 2 697 0 5 35 2 5 25 0 7 3 1596 1597 0 1598 2 1144 0 52 697 3 980 259 1600 215 4 1591 1594 1599 1601 5 1571 1583 1587 1602 2 0 579 35 1503 3 242 245 1604 139 3 1572 231 251 1574 3 1568 1576 6 1577 3 237 1579 62 219 4 1605 1606 1607 1608 2 5 583 22 0 3 1610 242 259 135 2 52 95 22 51 3 1576 237 1577 1612 4 1611 290 235 1613 2 1023 35 1503 35 2 549 52 0 0 3 1615 0 1616 245 3 217 221 230 1593 2 35 1 52 25 3 251 980 1517 1619 4 1617 1618 250 1620 2 1023 25 1503 35 2 549 52 95 0 3 1592 1622 241 1623 2 0 0 1 95 2 25 19 96 95 2 19 19 22 52 3 1625 442 1626 1627 2 96 22 0 51 2 51 95 95 8 2 95 51 19 19 2 88 0 19 0 3 1629 1630 1631 1632 2 1 95 35 8 2 25 51 25 51 2 1 0 88 5 3 1634 161 1635 1636 4 1624 1628 1633 1637 5 1609 1614 1621 1638 6 1515 1553 1603 1639 2 88 88 35 88 2 358 426 358 19 3 1641 574 0 1642 2 0 0 14 419 2 0 8 0 698 3 1318 1401 1644 1645 2 340 7 0 5 2 0 51 0 19 3 0 1647 0 1648 1 1 0 3 0 2 25 1650 51 88 2 96 1 19 51 2 19 0 52 1 3 9 1651 1652 1653 4 1643 1646 1649 1654 2 51 96 397 19 3 1405 1406 1656 1408 2 88 19 25 5 2 19 0 35 0 2 25 1 558 0 3 1658 1659 1476 1660 2 25 19 592 19 2 0 22 0 51 2 395 707 95 25 3 1662 1663 1664 1472 3 1170 0 0 0 4 1657 1661 1665 1666 3 0 46 0 0 2 0 14 7 0 2 95 419 19 0 2 51 95 0 51 3 1669 1670 0 1671 4 1668 1672 0 0 1 0 1 3 3 2 499 1 1674 95 2 19 0 95 7 3 1675 0 1676 9 3 1671 1174 0 1671 3 0 0 123 123 4 1677 0 1678 1679 5 1655 1667 1673 1680 2 402 558 1 0 3 1682 0 0 0 4 1683 0 0 0 4 0 0 1679 1679 5 1684 0 1685 1685 6 1681 1686 545 545 2 0 22 0 22 2 22 52 96 723 3 1688 1689 0 222 4 0 1690 0 0 5 0 1691 1685 1685 2 841 437 1503 35 2 0 0 487 391 3 1039 238 1693 1694 2 0 95 22 51 2 0 96 95 1 2 51 95 402 412 2 8 35 0 25 3 1696 1697 1698 1699 2 770 52 0 1 2 0 19 7 95 2 0 8 0 25 2 35 52 25 7 3 1701 1702 1703 1704 2 497 19 22 52 2 0 25 499 25 2 25 0 5 8 2 390 391 19 5 3 1706 1707 1708 1709 4 1695 1700 1705 1710 2 95 22 95 19 2 8 19 51 1 2 0 19 0 395 3 1712 382 1713 1714 2 25 0 95 5 2 419 397 52 0 2 5 52 397 0 3 1716 1717 1718 0 2 51 88 0 8 2 5 52 52 0 2 395 397 52 0 3 1720 1721 1722 0 4 1715 1719 1723 0 2 0 25 0 8 2 5 14 52 0 3 1725 1726 0 0 2 402 390 25 5 2 5 52 513 0 2 8 0 0 8 3 1728 1729 1730 1730 2 8 0 0 7 3 0 1732 123 123 4 1727 1731 1679 1733 3 123 123 123 123 4 0 0 1735 1735 5 1711 1724 1734 1736 6 1692 1737 545 545 7 1489 1640 1687 1738 2 51 95 437 51 2 0 579 95 590 2 51 95 433 471 2 25 1 8 589 3 1740 1741 1742 1743 2 7 95 51 363 2 581 0 0 0 2 452 0 0 0 3 1745 1746 1747 0 2 1503 590 841 51 2 19 340 95 8 2 589 0 979 0 3 1749 1750 1525 1751 2 25 471 25 697 3 310 0 1753 0 4 1744 1748 1752 1754 2 1506 8 0 5 3 252 1756 253 215 2 51 95 35 25 2 25 0 589 0 2 0 437 8 19 3 1758 1759 234 1760 3 219 220 256 1498 3 6 1509 263 1625 4 1757 1761 1762 1763 2 0 1 0 25 3 0 0 0 1765 2 95 0 19 5 3 0 0 1767 0 3 1696 1697 442 1699 3 1712 181 1713 0 4 1766 1768 1769 1770 5 1755 0 1764 1771 3 0 0 0 1331 2 0 0 51 0 2 0 95 340 454 3 0 0 1774 1775 4 0 1773 1776 1377 3 0 0 0 1346 3 0 0 0 371 4 0 1778 1779 1363 2 0 0 354 356 3 1781 1360 1347 310 3 321 366 367 1355 4 1782 1387 1783 373 5 0 1777 1780 1784 2 579 22 841 0 3 231 1610 1786 1629 2 7 52 95 0 3 1788 1626 1630 1634 2 841 1 583 25 3 1790 1631 1697 1712 2 52 25 0 390 2 25 0 391 395 3 1632 1635 1792 1793 4 1787 1789 1791 1794 2 0 25 25 25 2 96 95 19 5 3 1627 1796 161 1797 2 51 88 0 419 2 0 0 358 426 3 1799 0 1721 1800 2 8 52 397 0 3 1636 1722 1802 0 2 358 19 340 7 3 0 1804 0 0 4 1798 1801 1803 1805 2 402 412 0 8 3 1699 1713 1796 1807 2 0 19 0 5 3 1809 1721 1722 0 2 96 95 406 395 3 1811 1718 1721 0 4 1808 1810 1812 0 5 1795 1806 1813 0 2 0 95 51 88 3 1815 446 1413 448 3 447 424 1451 428 2 95 0 51 433 2 51 436 51 438 2 437 0 88 95 3 1818 458 1819 1820 2 454 460 455 460 3 459 1415 462 1822 4 1816 1817 1821 1823 3 185 442 443 1413 3 458 459 1418 462 4 1825 450 457 1826 3 0 1325 0 108 2 354 0 451 95 2 466 51 0 51 2 95 1 88 471 3 1829 0 1830 1831 2 35 436 0 0 3 108 1833 0 0 4 1828 1832 0 1834 2 51 95 51 363 3 1429 1355 1431 1836 2 1 340 25 0 3 469 470 1838 473 2 433 0 340 95 3 1423 1260 1389 1840 2 0 1 96 95 2 0 96 1 51 3 448 1842 1843 432 4 1837 1839 1841 1844 5 1824 1827 1835 1845 6 1772 1785 1814 1846 3 1330 1334 1332 321 3 310 1317 1318 369 2 95 95 95 0 2 425 51 460 0 3 1850 1325 1326 1851 4 1848 1849 1324 1852 2 589 0 95 437 3 432 1854 1331 1641 2 471 471 697 590 2 19 0 95 723 2 8 19 589 51 3 1856 1730 1857 1858 3 1376 0 1339 1322 2 0 437 95 8 3 1320 1861 1323 1326 4 1855 1859 1860 1862 2 363 88 365 88 3 1864 321 0 367 3 366 369 321 371 4 1348 1351 1865 1866 3 357 1344 361 1346 3 1345 1349 1347 310 2 51 88 1 35 2 96 96 96 19 3 321 1870 1871 1355 4 1868 1869 1363 1872 5 1853 1863 1867 1873 2 8 406 948 52 2 5 7 95 471 2 583 0 0 0 3 887 1875 1876 1877 2 25 697 51 95 2 471 19 1321 19 2 589 0 340 95 3 1879 62 1880 1881 4 1878 0 1882 0 2 460 95 0 96 2 8 19 96 0 3 1884 1885 1843 432 2 0 0 471 0 2 590 0 95 25 3 1887 0 1888 0 2 96 0 19 14 3 369 370 371 1890 2 5 0 25 8 2 8 51 22 52 3 1352 1892 62 1893 4 1886 1889 1891 1894 2 5 8 19 0 2 0 0 25 95 3 0 0 1896 1897 2 5 35 5 8 2 51 88 0 25 2 96 1 19 0 2 95 25 8 52 3 1899 1900 1901 1902 4 1898 0 1903 0 5 1883 0 1895 1904 2 364 51 25 0 3 442 1906 1413 448 3 310 1843 1870 369 4 1412 1907 1417 1908 2 95 1 88 25 2 0 1 96 0 3 447 1910 1911 428 3 432 1415 462 1822 2 14 8 19 0 3 453 1914 1892 1899 4 1912 445 1913 1915 3 0 1871 1910 185 2 1 340 25 5 3 321 469 1836 1918 3 428 1423 1330 1334 2 88 25 0 8 2 0 22 25 25 3 1260 1921 1914 1922 4 1917 1919 1920 1923 2 356 0 19 14 2 360 19 0 5 2 0 25 35 51 3 1925 62 1926 1927 2 25 25 88 19 3 1893 1901 1929 161 2 8 5 51 96 2 8 0 1 95 2 52 19 25 19 3 1931 1932 1933 1403 2 25 5 25 0 2 35 0 581 558 2 52 0 52 1 3 1935 1936 1937 206 4 1928 1930 1934 1938 5 1909 1916 1924 1939 2 364 51 25 5 2 7 19 0 5 3 1941 1942 1921 1931 3 1927 1929 1932 1935 2 19 19 395 707 3 1922 1933 1900 1945 2 0 51 0 558 3 1403 1937 1947 206 4 1943 1944 1946 1948 2 22 52 402 391 2 35 0 25 1 2 1 0 0 5 3 161 1950 1951 1952 3 0 228 135 139 2 558 0 0 0 3 1955 268 0 0 3 234 236 0 238 4 1953 1954 1956 1957 2 0 25 0 1 2 698 397 51 1 3 1902 1959 1960 1955 3 206 0 0 0 4 1961 1962 1962 0 5 1949 1958 1963 0 6 1874 1905 1940 1964 5 0 0 1736 1736 2 51 88 51 35 3 0 1967 0 0 2 88 0 88 433 2 0 358 0 358 2 426 0 19 14 3 1969 1331 1970 1971 2 0 340 0 0 2 7 0 5 7 2 51 96 7 19 3 1973 1974 2 1975 4 1968 1972 0 1976 2 14 14 0 0 3 515 1978 0 0 4 0 1979 1735 1735 5 0 1977 1736 1980 2 7 7 7 1 2 0 25 0 51 2 0 0 7 7 3 1982 123 1983 1984 3 123 123 1984 1984 4 1985 1986 0 0 2 0 0 35 7 3 123 123 9 1988 2 19 5 1 19 3 123 1982 321 1990 3 0 230 0 0 2 88 7 25 5 2 25 5 25 25 3 1993 249 1994 234 4 1989 1991 1992 1995 2 0 1 1 5 3 0 1997 1997 1721 4 0 0 0 1998 2 5 7 52 340 3 0 1466 1997 2000 2 8 7 22 52 2 95 0 454 590 2 425 95 5 35 3 108 2002 2003 2004 1 0 2 0 1 2 0 2006 0 22 2 5 8 0 8 3 1721 2007 0 2008 2 19 52 52 5 2 5 8 52 1 2 14 52 0 0 2 340 454 2006 19 3 2010 2011 2012 2013 4 2001 2005 2009 2014 5 1987 1996 1999 2015 6 1966 1981 545 2016 2 0 0 419 0 2 8 51 698 397 3 1332 1892 2018 2019 2 1650 25 88 592 2 1 19 51 52 2 0 395 1 95 3 516 2021 2022 2023 2 22 52 51 1 2 707 0 25 1 3 161 2025 2026 1955 4 2020 1903 2024 2027 2 19 19 5 35 2 0 402 0 1 2 0 25 0 558 3 2029 2030 2031 206 3 1955 0 0 0 4 2032 2033 1962 0 2 419 499 0 1674 2 95 19 51 95 3 310 2035 108 2036 2 1 0 95 0 3 2038 0 62 0 2 8 51 95 8 2 7 8 7 95 3 123 2040 2041 120 3 114 62 2040 114 4 2037 2039 2042 2043 4 0 0 160 0 5 2028 2034 2044 2045 2 35 14 14 35 2 52 51 0 5 3 2040 114 2047 2048 2 8 51 95 25 2 95 25 52 25 2 25 25 25 25 3 120 2050 2051 2052 2 52 52 0 0 2 8 52 5 35 2 19 14 5 52 3 2054 2055 60 2056 2 0 25 14 52 2 25 25 52 8 3 2058 2052 253 2059 4 2049 2053 2057 2060 2 95 25 25 25 3 2062 0 2052 0 2 25 8 51 95 3 2052 0 2064 1397 4 2063 0 2065 0 2 25 7 51 8 2 52 35 7 5 3 217 256 2067 2068 3 885 2047 249 2054 2 0 22 0 425 2 52 5 95 25 2 590 5 52 5 3 2071 2072 2073 1406 3 234 60 2002 217 4 2069 2070 2074 2075 2 52 25 0 25 2 8 0 14 52 3 2077 180 2055 2078 3 2056 253 256 885 3 1984 1984 2047 166 4 2079 0 2080 2081 5 2061 2066 2076 2082 2 0 0 1 7 3 0 0 0 2084 3 0 0 1984 1984 4 0 0 2085 2086 3 0 0 0 1997 3 1984 1984 166 166 2 0 1 7 5 3 2090 1721 242 0 4 0 2088 2089 2091 2 5 7 52 5 3 1997 2093 1721 28 2 7 7 7 452 2 5 7 0 7 3 123 2095 2096 123 2 5 7 0 452 2 466 7 360 7 3 2096 123 2098 2099 4 2094 2097 29 2100 5 0 2087 2092 2101 6 2046 0 2083 2102 7 1847 1965 2017 2103 8 1003 1316 1739 2104 2 0 1 51 95 3 0 2106 0 92 2 5 52 19 0 3 2108 0 161 0 3 0 92 0 92 2 0 0 0 14 2 19 0 19 19 3 161 2111 161 2112 4 2107 2109 2110 2113 2 22 52 8 14 3 1730 2115 0 1730 2 0 0 14 14 2 14 14 0 5 2 51 14 8 0 3 2117 321 2118 2119 3 0 0 1978 62 4 0 2116 2120 2121 3 161 92 161 92 4 2110 2123 2110 2123 2 88 0 25 95 2 1 823 35 562 3 108 2125 6 2126 2 0 0 391 0 2 52 0 14 14 2 0 0 562 14 3 2128 515 2129 2130 2 579 811 8 14 3 596 2132 995 2132 2 14 814 562 14 2 811 14 14 562 3 2134 2135 2134 2135 4 2127 2131 2133 2136 5 2114 2122 2124 2137 2 51 1 0 0 3 161 92 161 2139 4 2110 2140 2110 162 3 997 2132 596 2132 3 995 2132 997 2132 2 14 14 562 14 2 14 14 14 562 3 2134 2135 2144 2145 4 2142 2136 2143 2146 3 0 92 0 161 3 0 161 0 161 3 0 0 2117 2117 4 2148 210 2149 2150 2 814 811 0 0 3 596 2132 515 2152 2 14 814 0 0 2 811 14 0 0 3 2144 2145 2154 2155 2 5 0 14 14 3 0 0 2157 2117 4 2153 2156 2150 2158 5 2141 2147 2151 2159 6 0 2138 0 2160 2 5 52 52 340 2 1 0 454 590 3 2162 2163 2007 2010 3 2004 2067 2011 2071 2 8 8 0 8 3 2166 2012 0 1730 3 2013 2073 2115 2162 4 2164 2165 2167 2168 3 2068 249 2072 234 3 2054 0 60 0 3 1406 2002 2163 2004 2 0 8 0 51 3 2173 321 0 1671 4 2170 2171 2172 2174 2 0 677 14 562 3 62 0 2176 86 2 0 2006 95 22 2 1 52 14 562 3 1730 2178 2144 2179 2 814 811 14 14 2 14 814 14 562 2 14 814 14 14 3 2181 2182 2181 2183 3 2135 2181 2135 2181 4 2177 2180 2184 2185 2 19 52 52 0 2 0 52 0 0 3 2187 2188 2117 0 2 583 0 14 562 3 2134 2190 2134 2135 3 2117 2130 2181 2134 4 2189 0 2191 2192 5 2169 2175 2186 2193 3 2096 123 2096 123 4 29 2195 29 2195 2 51 95 0 19 3 1671 321 0 2197 2 0 0 14 562 2 0 1 0 22 2 52 0 0 5 3 2199 2200 2135 2201 2 95 0 52 0 2 7 8 8 19 3 2203 0 2204 0 4 2198 0 2202 2205 5 534 2196 2206 2196 3 2181 2183 2181 2183 4 2208 2185 2208 2185 3 2181 2134 2181 2134 3 2144 2145 2144 2145 4 2146 2210 2211 2208 3 2181 2183 2152 2154 3 2135 2181 2155 2152 2 0 19 14 14 3 0 0 2215 2117 4 2213 2214 2150 2216 3 2181 2134 2152 2154 2 0 0 14 559 3 0 0 2219 357 2 0 14 1 5 2 95 0 1 7 2 0 8 0 5 2 5 96 35 51 3 2221 2222 2223 2224 4 2156 2218 2220 2225 5 2209 2212 2217 2226 2 52 19 0 19 3 2135 2228 2135 2228 3 92 0 92 0 4 2229 2230 2229 2230 2 52 19 5 19 2 811 14 0 95 2 22 8 0 19 3 2135 2232 2233 2234 2 1 22 51 52 2 52 96 7 0 3 9 28 2236 2237 2 19 19 51 1 2 14 14 5 95 3 2239 0 2240 1984 4 2235 2230 2238 2241 2 0 19 5 19 3 0 28 9 2243 4 29 2195 2244 2195 5 2231 2196 2242 2245 6 2194 2207 2227 2246 2 19 51 0 8 3 268 92 0 2248 2 0 14 51 14 2 14 14 14 95 3 2250 86 2251 1978 3 108 310 0 108 4 2249 2252 0 2253 3 86 86 1978 1978 2 812 770 7 549 2 95 5 51 95 3 268 2256 2257 123 2 7 812 7 7 2 770 7 549 7 3 2259 2260 123 123 4 2255 2255 2258 2261 3 108 166 0 0 3 166 166 0 0 4 2263 2264 0 0 5 2254 2262 0 2265 6 0 2266 0 0 2 812 770 7 7 2 7 7 7 549 3 2268 2259 123 2269 2 770 7 7 7 2 7 812 549 7 3 2271 2268 2268 2272 4 2255 2255 2270 2273 2 14 1 14 95 2 14 1 0 0 3 86 2275 1978 2276 2 0 5 0 96 2 52 14 96 14 1 0 0 1 1 2 51 14 0 2280 2 51 14 1023 0 3 2278 2279 2281 2282 2 770 7 7 549 2 7 7 7 22 3 2259 2271 2284 2285 2 812 841 95 0 2 426 402 8 814 2 0 0 549 7 2 5 562 52 0 3 2287 2288 2289 2290 4 2277 2283 2286 2291 3 310 0 108 310 3 0 108 0 0 4 2264 2293 0 2294 4 0 0 2293 0 5 2274 2292 2295 2296 2 14 95 5 51 2 0 2280 14 841 2 22 8 14 0 2 0 583 8 841 3 2298 2299 2300 2301 2 1023 51 426 0 2 8 0 52 723 2 0 1 412 698 3 2303 310 2304 2305 2 811 7 811 1 2 583 583 812 770 2 14 14 0 95 2 562 14 0 0 3 2307 2308 2309 2310 2 770 88 1 0 2 14 1506 0 402 2 95 0 19 0 3 1721 2312 2313 2314 4 2302 2306 2311 2315 2 0 5 5 96 2 22 52 95 0 2 22 14 0 19 3 2317 2318 2319 1708 2 7 7 51 0 2 51 0 7 7 3 2321 166 2322 1984 2 0 395 0 0 1 3 0 1 2 2 707 19 2325 19 2 811 19 513 19 3 2324 2326 6 2327 4 2320 2323 2328 2195 3 339 1765 0 28 2 51 96 406 51 2 14 5 5 35 3 2002 181 2331 2332 2 5 452 0 7 2 433 471 0 590 2 5 8 2006 589 3 2334 2335 2336 855 4 2330 2333 29 2337 2 0 5 0 354 2 8 96 433 19 1 0 2 2 3 2 814 2341 497 5 2 19 19 35 19 3 2339 2340 2342 2343 2 19 0 592 0 2 497 0 19 0 3 2345 1463 2346 92 4 2344 2195 2347 2195 5 2316 2329 2338 2348 4 2294 2293 0 2294 5 0 2350 0 0 2 19 590 19 19 3 2352 857 92 1311 2 95 0 51 96 3 310 0 108 2354 2 0 19 433 19 3 2228 855 2356 857 4 29 2353 2355 2357 2 592 0 497 0 3 2359 92 2345 92 3 2346 92 2359 92 4 2360 2195 2361 2195 2 589 51 590 677 2 19 0 88 471 3 0 2363 0 2364 2 590 19 19 19 2 52 19 0 363 2 0 19 471 589 3 2366 1311 2367 2368 2 0 1 0 8 2 8 19 5 22 3 2370 1833 0 2371 2 364 365 25 0 2 436 364 5 52 2 948 579 1595 697 3 2373 2374 2375 181 4 2365 2369 2372 2376 3 2345 92 2346 92 4 2378 2195 2360 2195 5 2358 2362 2377 2379 6 2297 2349 2351 2380 7 2161 2247 2267 2381 3 0 1671 0 0 2 8 0 0 723 2 0 590 95 51 3 321 2384 1671 2385 2 51 14 0 0 3 0 2387 0 0 4 2383 2386 0 2388 2 592 0 14 397 3 2346 92 2390 92 2 5 7 0 466 3 2096 123 2392 123 2 14 0 0 8 3 2394 92 28 92 2 360 7 466 7 3 2334 2396 2096 123 4 2391 2393 2395 2397 2 25 0 1 0 3 2111 0 173 2399 4 0 0 3 2400 2 19 0 0 7 3 28 92 28 2402 3 2096 123 123 123 3 0 166 0 0 4 2403 2404 2405 2264 5 2389 2398 2401 2406 2 1 395 5 1650 2 52 0 14 841 3 2 173 2408 2409 4 0 3 3 2410 2 1 5 395 52 2 52 1 0 499 3 2 2408 2412 2413 4 0 3 3 2414 2 1650 14 1 579 3 2 2412 173 2416 2 579 583 22 452 1 1 1 0 0 2 841 2419 583 561 2 52 8 841 5 3 2413 2418 2420 2421 2 499 22 2419 52 2 561 841 0 583 3 2409 2423 2418 2424 2 452 0 8 88 2 583 5 35 22 2 5 35 5 52 2 35 0 25 95 3 2426 2427 2428 2429 4 2417 2422 2425 2430 5 0 2411 2415 2431 2 499 0 397 0 3 2409 2433 2418 2424 3 2416 2420 2423 2426 2 88 35 35 35 2 52 25 52 1 3 2421 2436 2427 2437 4 2414 2434 2435 2438 2 95 0 88 0 3 0 0 2440 0 4 0 0 2441 0 2 22 52 0 7 3 2424 2428 2436 2443 2 7 0 0 0 2 1 88 0 52 3 2429 2445 2446 166 2 95 0 88 7 3 2437 2448 2445 181 2 0 0 7 466 2 0 22 0 7 3 2450 1984 2451 0 4 2444 2447 2449 2452 2 0 25 0 52 2 7 7 8 0 3 181 2454 2455 166 3 0 0 166 166 2 7 0 466 7 3 2458 1984 0 0 3 1984 1984 0 352 4 2456 2457 2459 2460 5 2439 2442 2453 2461 6 0 2407 2432 2462 4 0 3 3 2417 4 2414 2425 2435 2438 5 0 2464 2411 2465 2 1 395 5 1503 2 1 5 579 52 2 52 487 0 25 3 2 2467 2468 2469 4 0 3 3 2470 2 1503 14 487 5 3 2 2468 173 2472 4 0 3 3 2473 2 1 579 5 1503 2 52 0 14 438 3 2 173 2475 2476 2 438 7 397 559 2 25 725 7 583 2 549 0 8 88 3 2472 2478 2479 2480 2 5 397 725 549 2 583 8 365 5 3 2469 2482 2478 2483 2 559 365 0 397 3 2485 2428 2436 2443 4 2477 2481 2484 2486 5 0 2471 2474 2487 2 52 0 14 35 2 5 52 948 452 3 2489 2423 2490 2424 4 2417 2422 2491 2430 2 433 0 436 7 3 2437 2493 2445 181 3 2450 1984 2454 1476 4 2444 2447 2494 2495 2 88 841 35 841 2 397 5 35 22 1 2 0 1 0 2 52 2499 52 1 3 2483 2497 2498 2500 3 2443 2446 2448 2450 2 35 0 25 433 2 1 436 0 52 3 2503 2445 2504 166 2 7 7 25 35 2 7 466 0 0 3 181 2454 2506 2507 4 2501 2502 2505 2508 2 466 7 25 8 2 52 7 466 7 3 166 2510 1984 2511 3 2507 166 2450 1984 2 22 0 7 0 2 466 7 0 0 3 2514 0 166 2515 2 7 8 0 51 3 0 0 2507 2517 4 2512 2513 2516 2518 5 2492 2496 2509 2519 6 0 2466 2488 2520 4 2410 2435 2422 2444 2 0 88 0 51 2 7 7 35 0 3 181 2523 2524 2507 4 2438 2502 2505 2525 3 2443 2446 2493 1984 2 7 7 12 0 2 7 0 7 7 3 166 2528 1984 2529 4 2430 2449 2527 2530 3 1984 1984 1663 0 3 2529 2450 0 0 2 7 7 52 0 2 0 0 8 7 3 2534 2507 1984 2535 4 2532 2533 2513 2536 5 2522 2526 2531 2537 2 51 0 466 7 3 166 2524 1984 2539 3 166 166 2450 1984 3 0 0 166 2515 4 2540 2541 2542 2518 2 0 0 466 7 3 2515 166 2544 2535 2 7 7 14 14 2 0 95 7 7 3 2517 2546 1984 2547 2 466 7 14 562 3 0 2387 2549 2546 2 14 562 0 95 2 7 7 562 14 2 7 7 14 562 3 2310 2551 2552 2553 4 2545 2548 2550 2554 3 1984 2544 0 0 2 0 0 8 466 3 2557 1984 2387 2310 3 2517 2549 1984 2544 2 7 466 14 14 3 2560 2546 2450 1984 4 2556 2558 2559 2561 2 14 562 0 0 3 2544 1984 2563 1978 3 1984 2547 1978 2309 3 2549 2546 2544 1984 3 2546 2546 1984 2547 4 2564 2565 2566 2567 5 2543 2555 2562 2568 2 0 12 0 51 2 466 7 25 14 3 181 2570 2571 166 3 2511 1984 0 0 3 1984 1984 0 0 4 2572 2457 2573 2574 3 0 2387 2549 2560 3 2535 1984 2387 1978 3 1984 1984 1978 1978 4 2518 2576 2577 2578 3 2517 2546 1984 1984 3 2310 2563 2552 2553 4 2545 2580 2550 2581 3 2560 2552 2450 1984 3 2549 2560 1984 2450 3 1978 2310 2560 2546 2 7 466 14 96 3 2563 1978 2553 2586 4 2583 2584 2585 2587 5 2575 2579 2582 2588 3 1978 2563 2546 2546 3 1978 1978 2560 2552 3 1984 2544 2310 2563 3 2450 1984 1978 2310 4 2590 2591 2592 2593 2 466 7 14 14 3 1978 1978 2595 2546 3 2310 2309 2546 2553 2 0 95 7 8 2 14 14 0 579 2 95 5 390 558 3 1984 2598 2599 2600 4 2596 2597 2564 2601 3 2552 2595 1984 2544 3 1978 2563 2546 2595 2 14 96 0 0 2 7 466 14 95 2 8 5 5 22 3 2605 2118 2606 2607 4 2603 2561 2604 2608 2 7 7 14 95 2 0 0 466 8 2 5 96 5 51 3 2595 2610 2611 2612 2 51 14 8 5 2 1 0 14 96 2 14 22 0 95 3 2607 2614 2615 2616 2 95 5 96 1 2 22 8 0 14 2 96 0 0 7 3 2618 2619 2614 2620 2 5 0 22 8 2 7 88 1 88 2 95 1 88 22 3 2622 2623 2624 1815 4 2613 2617 2621 2625 5 2594 2602 2609 2626 6 2538 2569 2589 2627 7 0 2463 2521 2628 8 0 2382 0 2629 9 548 2105 0 2630 2 0 0 0 364 2 0 0 360 677 3 0 0 2632 2633 4 0 0 0 2634 5 0 0 0 2635 2 395 679 452 360 3 6 567 2637 569 4 0 0 2638 573 2 0 0 1004 0 2 562 1007 549 452 3 566 2640 568 2641 4 0 0 1060 2642 5 0 0 2639 2643 2 0 0 0 425 2 0 0 0 406 2 364 5 0 19 3 0 2645 2646 2647 2 558 5 5 22 3 2649 32 26 34 3 1311 28 1306 28 3 26 34 26 34 4 2648 2650 2651 2652 3 1309 28 1311 28 3 1306 28 1309 46 3 26 34 47 50 4 2654 2652 2655 2656 5 0 2653 0 2657 2 703 705 0 679 3 2659 615 36 617 3 41 43 41 43 4 2660 641 2661 44 2 556 703 562 52 2 583 579 12 590 3 614 2663 616 2664 2 12 406 12 589 2 12 590 12 406 3 43 2666 43 2667 4 1077 2665 44 2668 2 12 51 52 579 3 41 43 2670 818 3 43 43 819 810 4 2661 44 2671 2672 2 12 589 12 590 3 43 2674 43 2666 3 43 43 818 819 2 7 589 841 0 3 43 2667 810 2677 4 44 2675 2676 2678 5 2662 2669 2673 2679 6 2636 2644 2658 2680 2 0 0 679 0 3 0 0 2682 0 4 0 0 2683 0 5 0 0 2684 0 2 397 395 579 948 2 419 0 589 723 2 471 593 437 597 3 2686 2687 2688 604 2 1023 0 593 0 3 0 0 2690 0 2 581 584 471 593 2 437 597 581 584 3 2692 591 2693 602 2 597 0 584 0 2 593 0 597 0 3 2695 0 2696 0 4 2689 2691 2694 2697 3 2688 604 2692 591 2 584 0 593 0 3 2700 0 2695 0 2 471 593 697 698 2 590 437 406 679 3 2693 602 2702 2703 2 584 0 583 0 3 2696 0 2705 0 4 2699 2701 2704 2706 5 2698 0 2707 0 6 2685 0 2708 0 3 1311 85 1306 87 3 86 97 89 98 3 1309 91 1311 92 4 2710 2711 2712 2652 3 1306 92 1309 92 3 1311 92 1306 92 4 2714 2652 2715 2652 5 0 2713 0 2716 2 395 723 466 812 2 962 1564 0 723 3 2718 820 2719 829 3 821 815 830 825 2 770 466 12 12 3 36 2722 41 43 2 812 770 12 12 2 466 812 12 12 3 2724 2725 43 43 4 2720 2721 2723 2726 3 820 821 829 830 2 811 419 770 466 2 817 962 811 397 3 815 2729 825 2730 3 2722 2724 43 43 2 583 5 12 406 3 2725 2733 43 2674 4 2728 2731 2732 2734 4 2661 44 2661 44 4 44 2668 44 2675 5 2727 2735 2736 2737 2 433 51 340 95 3 1309 110 108 2739 2 19 52 25 579 3 47 50 112 2741 2 0 402 0 0 3 0 2743 0 0 2 391 8 51 433 2 95 8 402 391 3 2745 120 1973 2746 4 2740 2742 2744 2747 2 0 406 0 0 3 0 108 0 2749 4 0 2750 0 1012 5 0 2748 0 2751 2 12 51 52 395 2 5 419 770 466 3 2753 819 2754 821 2 960 962 95 419 3 2756 830 120 2268 2 466 812 7 95 3 825 829 2758 866 4 2755 861 2757 2759 2 7 590 1144 0 2 814 697 812 770 3 818 2761 820 2762 2 809 960 814 583 2 52 558 425 395 3 829 2764 866 2765 4 1246 2763 1247 2766 2 433 8 358 95 2 340 19 7 7 2 0 7 771 95 3 2768 130 2769 2770 3 131 184 133 185 2 5 19 948 22 2 979 96 0 0 3 0 2773 135 2774 3 138 0 140 194 4 2771 2772 2775 2776 2 364 679 25 725 2 95 579 25 590 2 7 52 5 549 3 0 2778 2779 2780 2 579 364 583 5 2 579 52 583 364 2 0 581 95 471 3 2782 2783 2784 688 2 25 1 25 471 2 19 340 425 7 2 25 697 25 19 2 590 0 19 0 3 2786 2787 2788 2789 2 454 0 579 95 2 437 354 35 364 3 2791 691 2792 1301 4 2781 2785 2790 2793 5 2760 2767 2777 2794 6 2717 2738 2752 2795 2 0 95 723 811 2 471 0 340 723 2 52 95 579 579 2 466 814 723 579 3 2797 2798 2799 2800 2 0 0 811 0 3 2802 0 1237 1022 3 754 604 743 591 2 931 590 597 406 3 2805 691 701 687 4 2801 2803 2804 2806 3 711 688 712 691 3 701 687 711 688 4 1201 2808 1202 2809 5 2807 0 2810 0 2 437 593 419 698 2 590 437 406 419 2 0 948 419 0 2 589 52 437 364 3 2812 2813 2814 2815 2 593 590 397 558 2 425 579 5 583 3 2817 691 2818 181 2 397 471 364 579 2 581 581 52 471 2 5 583 397 558 2 364 5 395 397 3 2820 2821 2822 2823 3 654 0 1877 0 4 2816 2819 2824 2825 2 425 579 0 437 3 2827 181 599 0 3 623 0 596 0 4 2828 0 2829 0 5 2826 0 2830 0 6 2811 0 2831 0 7 2681 2709 2796 2832 3 0 0 0 227 4 0 0 0 2834 3 6 1528 1518 220 2 5 579 725 979 3 0 217 2837 230 2 1503 0 841 0 2 583 8 0 22 3 2839 222 2840 241 4 0 2836 2838 2841 3 1039 1547 215 1540 3 0 219 217 221 2 948 0 1595 697 2 35 35 25 1144 3 2845 6 222 2846 4 1012 2843 2844 2847 3 1539 251 236 237 3 252 259 253 215 3 219 262 256 1498 4 2849 2850 265 2851 5 2835 2842 2848 2852 3 240 244 242 245 2 52 8 0 725 3 217 221 246 2855 4 286 287 2854 2856 2 25 589 19 340 2 589 51 95 437 2 25 51 51 433 3 2858 2859 262 2860 2 579 7 590 51 2 95 25 471 723 2 1 452 589 0 3 1840 2862 2863 2864 3 222 1520 1493 1521 2 590 590 51 95 2 340 95 8 51 2 8 589 725 979 3 2867 2868 2869 596 4 2861 2865 2866 2870 3 1542 273 1504 253 3 6 1509 263 0 3 62 1512 1510 221 4 294 2872 2873 2874 3 1507 1538 215 1540 2 8 51 579 1023 3 1539 2877 236 1504 3 220 6 1498 240 4 2876 2878 2879 1511 5 2857 2871 2875 2880 3 246 231 251 273 3 215 234 262 6 4 2882 289 287 2883 2 697 5 22 22 2 723 0 5 841 3 2885 246 139 2886 3 231 1559 1557 259 2 5 1503 52 770 3 236 2889 238 62 2 0 1564 5 1564 3 1563 1567 2891 1569 4 2887 2888 2890 2892 3 217 221 277 231 3 0 280 0 0 3 259 135 268 234 4 2894 243 2895 2896 3 0 217 245 230 3 256 222 231 241 4 2898 2899 261 325 5 2884 2893 2897 2900 2 583 7 0 0 3 2902 231 251 1574 3 237 1579 62 1580 4 1605 2903 1607 2904 3 1610 242 259 1560 2 583 7 0 95 3 245 2907 139 300 2 979 52 1506 22 3 1567 1568 2909 310 3 301 302 346 347 4 2906 2908 2910 2911 3 1584 0 1585 1589 2 52 549 0 95 3 1588 331 2914 382 3 135 1596 234 301 1 2 3 0 2 2 2917 51 402 95 2 95 1 419 707 3 2918 2919 302 203 4 2913 2915 2916 2920 3 334 335 385 386 3 348 349 403 413 2 95 19 679 19 3 2924 407 394 215 3 408 181 181 0 4 2922 2923 2925 2926 5 2905 2912 2921 2927 6 2853 2881 2901 2928 2 95 581 363 0 3 2930 0 0 0 2 471 0 697 0 3 321 0 2932 0 4 2931 0 2933 0 2 95 25 25 589 2 437 0 19 0 3 2935 0 253 2936 3 0 0 0 301 3 1512 333 331 334 3 310 346 335 348 4 2937 2938 2939 2940 3 0 0 344 0 3 347 0 349 0 4 2942 0 2943 0 5 2934 0 2941 2944 3 382 385 383 387 3 386 418 388 421 3 203 394 392 398 3 396 414 181 0 4 2946 2947 2948 2949 3 420 0 181 0 4 2951 0 0 0 3 411 181 414 0 4 2953 0 0 0 5 2950 2952 2954 0 6 2945 0 2955 0 3 238 486 0 217 3 219 333 331 334 3 0 277 0 0 3 490 385 491 501 4 2957 2958 2959 2960 2 8 14 0 0 2 0 25 1 5 3 2962 512 0 2963 3 1997 1721 1721 0 4 0 2964 2088 2965 5 0 2961 0 2966 3 347 527 349 529 3 386 418 502 505 3 504 181 414 0 4 2940 2968 2969 2970 3 528 414 181 0 4 2972 0 0 0 3 514 181 1721 0 4 2974 0 0 0 5 2971 2973 2975 0 3 0 0 1984 2090 4 0 2088 2977 2965 4 2965 0 0 0 2 7 7 360 7 2 7 52 452 360 3 2980 2981 123 123 3 1984 1984 123 123 2 7 466 452 360 3 123 123 2984 2095 3 123 123 2099 2984 4 2982 2983 2985 2986 2 0 0 452 360 3 1984 2988 123 123 3 123 123 2095 2099 2 7 7 452 360 3 123 123 2991 2095 4 2983 2989 2990 2992 5 2978 2979 2987 2993 2 0 0 7 452 3 1984 2995 123 123 3 123 123 2980 2991 3 123 123 2095 2980 4 2983 2996 2997 2998 2 52 0 7 7 3 2682 0 3000 1984 4 3001 2086 2992 2997 5 0 0 2999 3002 6 2967 2976 2994 3003 4 2086 2086 2998 2992 3 486 0 486 0 4 2086 160 2997 3006 5 0 0 3005 3007 6 0 0 3008 0 7 2929 2956 3004 3009 8 2833 0 3010 0 4 1735 1735 1735 1735 2 7 466 7 7 3 123 123 3013 123 4 1735 3014 1735 1735 5 3012 3015 3012 3012 2 466 7 7 7 3 123 123 3017 123 3 123 123 123 3017 4 3018 3019 1735 1735 5 3012 3012 3020 3012 5 3012 3012 3012 3012 3 123 123 123 3013 4 3023 1735 1735 1735 4 1735 3023 1735 1735 4 1735 3019 1735 1735 3 123 123 3017 3013 4 1735 3027 1735 1735 5 3024 3025 3026 3028 6 3016 3021 3022 3029 3 123 3017 123 123 3 3013 123 123 123 4 3031 3032 1735 1735 3 3017 3013 123 123 4 3034 3006 1735 3006 4 1735 3006 1735 3006 5 3033 3035 3012 3036 4 3019 3014 1735 1735 4 3018 3006 1735 3006 5 3012 3036 3038 3039 6 3037 0 3040 0 3 166 166 1984 1984 4 3042 3042 1735 1735 3 166 166 2322 1984 4 3044 3042 1735 1735 5 3043 3045 3012 3012 2 7 7 466 7 3 123 123 123 3047 4 3042 3044 1735 3048 3 166 166 2544 1984 2 7 7 7 466 3 3051 123 123 123 3 123 3051 3047 3051 4 3042 3050 3052 3053 3 123 3047 123 123 3 123 123 123 3051 4 1735 3055 3056 3055 3 123 123 3051 123 3 123 3051 123 123 4 3058 3059 1735 3053 5 3049 3054 3057 3060 4 1735 1735 1735 3058 5 3012 3012 3012 3062 3 123 3051 3047 123 4 3059 3048 3064 3048 3 123 123 3047 123 4 3052 3066 3052 1735 3 3047 123 123 3051 3 3047 123 123 123 4 3068 1735 3069 1735 5 3065 3067 3070 3012 6 3046 3061 3063 3071 3 166 166 2322 2544 3 123 3047 123 3047 3 3051 123 3051 123 4 3073 2541 3074 3075 3 166 166 2544 2450 3 181 0 62 0 2 452 360 7 466 3 3047 3079 3047 123 4 3077 3078 3080 3006 4 3074 3058 3055 1735 5 3076 3081 3082 3036 5 3012 3036 3012 3036 6 3083 0 3084 0 7 3030 3041 3072 3085 2 7 452 7 7 3 3079 3087 123 123 3 2396 3079 123 123 4 1735 1735 3088 3089 3 3087 2396 123 123 2 452 360 7 7 3 3092 3087 123 123 4 1735 3052 3091 3093 2 360 7 7 14 3 123 123 3087 3095 2 95 5 25 8 2 25 0 471 1 3 166 3097 0 3098 4 1735 3096 2264 3099 2 452 360 14 14 2 7 452 14 14 3 123 123 3101 3102 2 360 7 14 14 3 123 123 3104 3101 4 3103 3105 2255 2255 5 3090 3094 3100 3106 2 360 7 7 7 3 3108 3092 123 123 3 3087 3108 123 123 4 1735 1735 3109 3110 3 3092 3087 3051 123 3 2396 123 123 123 4 1735 3056 3112 3113 3 123 123 3102 3104 3 123 123 2546 3102 4 3115 3116 2255 2255 2 397 0 14 14 3 2455 166 3118 2117 2 0 0 14 95 3 166 166 2117 3120 2 14 1 14 14 3 86 3122 1978 1978 4 3119 3121 2255 3123 5 3111 3114 3117 3124 2 0 19 0 51 3 0 20 0 3126 2 0 0 7 95 2 437 25 25 25 2 0 25 7 0 3 3128 3129 3130 779 2 0 5 5 14 2 7 52 1 7 3 3132 240 1399 3133 4 3127 3131 0 3134 2 8 8 51 51 3 1897 1397 3136 181 2 25 0 7 7 3 0 0 3138 1984 4 3137 0 3139 2086 3 0 0 166 2517 2 51 452 7 7 3 1983 3142 2595 2586 2 51 96 0 0 3 2557 1984 3144 1978 3 2544 2450 1978 1978 4 3141 3143 3145 3146 3 3108 3092 2546 2595 3 123 123 2560 2546 3 2450 1984 1978 1978 4 3148 3149 2592 3150 5 3135 3140 3147 3151 4 0 0 2086 2086 2 0 0 5 95 2 51 52 7 7 2 14 14 5 14 3 3154 0 3155 3156 2 14 0 95 8 3 0 0 3158 344 4 0 0 3157 3159 3 123 123 2546 2546 3 1984 1984 2563 1978 2 562 14 0 5 3 1984 9 3163 2618 4 3161 3161 3162 3164 2 52 0 7 8 3 123 3166 2610 2607 2 96 14 96 0 2 0 8 8 5 3 3168 2619 3169 2620 3 2612 2615 2619 2622 2 8 1 1 0 2 22 51 88 5 3 2616 3172 2623 3173 4 3167 3170 3171 3174 5 3153 3160 3165 3175 6 3107 3125 3152 3176 3 3087 3108 3087 3108 3 3092 123 3051 123 4 3048 3058 3178 3179 3 3047 3051 3047 3079 4 3066 3006 3181 3006 2 452 360 0 0 3 3183 166 0 0 3 0 0 181 0 4 2264 3184 3185 0 4 2264 205 0 0 5 3180 3182 3186 3187 3 2622 2117 2624 1815 3 2117 2117 0 344 2 88 88 95 51 2 5 52 96 1 2 88 19 52 1 2 51 5 7 52 3 3191 3192 3193 3194 2 1 7 88 0 2 52 88 1 5 2 52 1 88 5 2 5 52 52 5 3 3196 3197 3198 3199 4 3189 3190 3195 3200 3 0 0 1730 0 2 95 0 52 5 2 8 0 52 0 3 3203 3204 1721 0 4 3202 0 3205 0 5 0 0 3201 3206 6 3188 0 3207 0 3 2560 2552 1984 1984 3 2546 2546 2544 1984 3 2563 1978 2549 2546 4 3209 3210 2585 3211 3 2546 2546 1984 1984 3 1978 1978 2546 2546 3 1978 2118 2610 2607 4 3213 3213 3214 3215 3 1984 2450 1978 1978 3 2546 2552 1984 1984 3 2546 2610 9 2612 4 3150 3217 3218 3219 2 562 14 0 579 3 1984 2611 3221 2600 2 579 390 5 51 2 558 0 14 96 3 3223 3224 2619 2622 3 2620 2624 3172 3191 4 3222 3225 2617 3226 5 3212 3216 3220 3227 2 51 96 19 51 3 1815 3229 3192 3196 2 1 88 5 52 3 3173 3193 3229 3231 3 3194 3198 1997 3199 4 3226 3230 3232 3233 3 3231 1997 3197 3199 4 3174 3195 3230 3235 3 3199 1721 1721 0 4 3200 3237 3237 0 5 2626 3234 3236 3238 3 1978 2599 2606 2607 3 2600 2619 2614 2620 4 3240 3241 3171 3174 4 2625 3232 3195 3200 4 3235 3237 3237 0 5 3242 3243 3234 3244 4 3233 3237 3237 0 5 3246 0 0 0 6 3228 3239 3245 3247 5 3244 0 0 0 6 3249 0 0 0 7 3177 3208 3248 3250 8 3086 0 3251 0 9 3011 0 3252 0 2 25 14 1 5 3 2 173 173 3254 4 0 3 3 3255 2 1 5 5 25 3 2 173 3257 2489 4 0 3 3 3258 2 52 1 0 25 3 2 3257 173 3260 2 25 22 7 52 2 5 52 22 7 2 14 35 0 52 3 2489 3262 3263 3264 2 35 7 52 14 2 7 0 8 88 3 3254 3266 3262 3267 2 52 8 35 5 2 52 5 35 22 3 3269 2436 3270 2437 4 3261 3265 3268 3271 5 0 3256 3259 3272 4 0 3 3 3261 3 3260 3263 3266 3269 3 3264 2428 2436 2443 4 3258 3268 3275 3276 5 0 3274 3256 3277 3 3267 3270 2428 2429 4 3255 3275 3265 3279 2 0 35 0 51 2 51 25 51 52 3 2450 1984 3281 3282 4 3276 2447 2494 3283 3 2443 2446 2448 1984 2 7 7 35 19 2 7 7 95 0 3 181 3281 3286 3287 4 3271 3285 2447 3288 3 166 3286 1984 2322 3 3287 166 3000 1984 2 51 25 51 0 3 3292 0 166 166 4 3290 3291 3293 3141 5 3280 3284 3289 3294 6 0 3273 3278 3295 5 0 3259 3274 3280 2 466 7 88 19 2 7 466 95 0 3 181 2523 3298 3299 4 3271 3285 2505 3300 2 35 0 25 0 3 3267 3270 2428 3302 2 7 5 1 52 2 95 14 96 95 3 2437 2448 3304 3305 2 22 52 0 52 2 95 1 88 88 2 0 1 406 579 3 3307 1997 3308 3309 2 395 561 52 95 2 1 0 5 8 2 19 19 1023 19 2 19 5 0 22 3 3311 3312 3313 3314 4 3303 3306 3310 3315 2 0 88 8 51 2 19 52 0 52 3 1984 1984 3317 3318 3 2322 3000 0 0 2 0 7 14 14 2 0 0 7 96 2 8 14 95 0 3 3321 166 3322 3323 2 14 7 0 7 3 166 166 1978 3325 4 3319 3320 3324 3326 5 3277 3301 3316 3327 6 0 3297 3273 3328 2 51 51 7 7 3 166 3286 1984 3330 4 3279 2449 3285 3331 2 19 0 51 0 3 1984 1984 2523 3333 4 3276 2447 2449 3334 2 7 7 88 5 3 181 3281 3336 3287 2 19 25 0 52 3 3338 0 166 166 3 3330 3000 0 0 4 3337 3339 3340 2460 5 3272 3332 3335 3341 2 51 25 0 52 3 1984 1984 3281 3343 2 7 7 25 0 3 3345 166 3000 1984 3 2534 166 1984 2535 4 3344 3340 3346 3347 4 2574 2577 2580 3213 2 7 7 14 96 3 0 2387 2546 3350 3 2535 1984 3144 1978 4 3141 3351 3352 2578 3 2605 1978 2546 2546 4 3214 3354 2578 2578 5 3348 3349 3353 3355 2 7 7 88 51 3 166 3357 1984 3330 2 7 8 0 0 2 5 5 698 2419 3 3282 0 3359 3360 2 7 7 581 0 3 0 0 3362 2517 4 3358 3291 3361 3363 3 166 166 1984 2535 3 0 2387 2546 2546 4 3365 2548 3366 3214 2 0 5 7 52 2 703 22 0 0 3 3368 3369 0 0 2 52 0 8 466 3 3371 1984 2387 2310 3 3359 123 123 123 4 3370 3372 3373 1735 3 2544 2450 2563 1978 3 1984 1984 2310 2563 4 3375 3376 1735 1735 5 3364 3367 3374 3377 4 3213 3213 3214 3214 2 7 7 7 8 3 3013 123 123 3380 2 7 466 7 8 3 123 3382 1730 3223 4 2593 3375 3381 3383 3 2607 2614 3224 2616 4 3222 3171 3385 3226 5 3379 3216 3384 3386 6 3342 3356 3378 3387 7 0 3296 3329 3388 8 0 0 0 3389 4 0 3 3 2477 3 2 2475 2468 2469 4 0 3 3 3392 3 2476 2479 2482 2485 3 2480 2498 2428 2429 4 2473 2484 3394 3395 5 0 3391 3393 3396 3 2 173 3257 2476 4 0 3 3 3398 3 2 2475 173 2469 3 3254 2478 2479 2480 3 2483 2436 2498 2437 4 3400 3394 3401 3402 5 0 2474 3399 3403 2 0 8 0 7 2 7 7 8 51 3 181 3405 3406 3299 4 3402 3285 2505 3407 2 7 7 8 19 3 166 3409 1984 2529 4 3395 2449 2527 3410 3 1984 1984 3405 3282 2 7 51 7 7 2 52 0 7 466 3 3413 3414 0 0 3 3287 166 3414 1984 3 2534 166 2544 2535 4 3412 3415 3416 3417 5 2487 3408 3411 3418 6 0 3397 3404 3419 3 3267 3270 2428 2503 4 3255 3275 3265 3421 5 0 3259 3274 3422 3 2443 2504 2448 1984 2 7 7 22 51 3 166 3425 1984 3413 4 3421 2449 3424 3426 3 2450 1984 2451 3292 4 3276 2447 2494 3428 2 7 7 22 19 3 181 2451 3430 3287 3 3282 0 166 166 3 2458 3414 0 0 3 1984 2544 0 352 4 3431 3432 3433 3434 5 3272 3427 3429 3435 6 0 3278 3423 3436 2 5 397 22 7 2 35 7 52 559 2 52 8 365 5 3 3260 3438 3439 3440 3 3267 2498 2428 2429 4 3255 3441 3265 3442 3 1984 1984 3405 3343 4 2486 2447 2449 3444 2 7 7 22 5 3 181 3405 3446 3287 4 3271 3285 2447 3447 3 166 3409 1984 3413 4 3449 3346 3339 3141 5 3443 3445 3448 3450 2 466 7 8 19 3 181 3405 3452 3287 3 3318 0 166 166 3 3413 3000 0 0 4 3453 3454 3455 2574 4 3141 3366 2577 2578 4 3365 2580 3366 3214 5 3456 3457 3458 3379 3 1984 1984 2451 3333 2 7 51 466 7 3 3461 3000 0 0 3 3299 166 3414 1984 2 466 7 52 0 3 3464 2507 1984 2557 4 3460 3462 3463 3465 3 2517 2549 1984 1984 4 2574 2577 3467 3209 3 0 2387 2549 3350 3 2535 1984 3144 2310 4 2518 3469 3470 3375 4 2590 3354 2592 2593 5 3466 3468 3471 3472 3 1984 1984 2310 1978 3 2549 2560 1984 1984 3 2546 2549 1984 1984 4 2578 3474 3475 3476 3 2549 2606 9 3223 4 2578 2578 3209 3478 4 3214 3214 3375 3222 4 3215 2621 3171 3174 5 3477 3479 3480 3481 6 3451 3459 3473 3482 7 0 3420 3437 3483 4 3392 3394 2481 3402 2 52 7 7 7 3 166 2506 1984 3486 4 3395 2449 2527 3487 2 12 0 51 0 3 2450 1984 2454 3489 4 2486 2505 2494 3490 2 466 7 25 12 3 181 2454 3492 166 2 22 0 51 0 3 3494 0 166 166 4 3493 3495 2573 2460 5 3485 3488 3491 3496 2 88 0 51 0 3 2450 1984 2454 3498 2 52 51 7 7 3 3500 2450 0 0 3 3464 2507 2544 2557 4 3499 3501 2541 3502 3 2517 2553 1984 1984 4 2556 2558 3504 3218 3 0 2387 2595 2586 4 3141 3506 3352 2578 3 2310 2563 2546 2546 3 2605 1978 2560 2552 4 3508 3509 2592 2593 5 3503 3505 3507 3510 2 466 7 8 5 3 166 3512 1984 3413 3 3299 166 3000 1984 3 3333 0 166 2515 4 3513 3514 3515 2518 3 2515 166 1984 2535 3 1978 2309 2552 2553 4 3517 2548 2550 3518 4 2556 2558 3467 3209 5 3516 3519 3520 2568 3 2553 2546 1984 1984 3 1978 1978 2553 2546 4 3218 3522 3214 3523 3 2552 2595 1984 1984 4 3525 3213 3214 3215 3 2546 2610 9 3223 4 2578 3146 2583 3527 3 1984 2611 2599 2600 4 3529 3225 3385 3226 5 3524 3526 3528 3530 6 3497 3511 3521 3531 3 1984 1984 1978 2563 3 2595 3350 2544 1984 4 2564 3533 3534 3213 3 2450 1984 2605 1978 3 2553 2610 2611 3223 4 3536 3217 2583 3537 3 1978 1978 2549 2546 3 2310 2563 2552 2546 3 1984 9 3221 2600 4 3539 3540 2564 3541 3 1978 2599 2610 2607 4 3543 3241 3171 3174 5 3535 3538 3542 3544 4 3541 3225 3385 3226 5 3546 3236 3243 3246 3 2549 2610 2611 2612 4 3548 2617 2621 2625 2 0 1 1 579 3 3194 3198 3550 3199 4 3226 3230 3232 3551 2 5 583 52 395 3 3231 3550 3197 3553 4 3174 3195 3230 3554 2 579 52 583 5 3 3196 3197 3198 3556 3 3553 1718 1721 0 3 3199 1722 1718 0 4 3557 3558 3559 0 5 3549 3552 3555 3560 2 5 583 52 5 3 3231 3550 3197 3562 3 3556 1721 1721 0 4 3563 3237 3564 0 5 3565 0 0 0 6 3545 3547 3561 3566 4 3214 3214 2578 2578 3 2310 2551 2546 2546 3 1984 2598 2118 2618 4 3214 3569 2578 3570 4 3219 2617 2621 2625 5 3568 3571 3216 3572 3 1978 3221 2610 2607 4 3574 3241 3171 3174 4 2625 3232 3195 3557 3 3556 1721 1722 0 4 3554 3559 3577 0 5 3575 3576 3552 3578 3 1984 9 2118 2618 4 3580 3171 3385 3226 4 3551 3577 3558 0 5 3581 3555 3576 3582 5 3560 0 0 0 6 3573 3579 3583 3584 5 3582 0 0 0 6 3586 0 0 0 7 3532 3567 3585 3587 3 181 2451 3430 3345 4 3271 3424 2447 3589 2 7 7 35 5 3 166 3591 1984 3330 4 3279 2449 3285 3592 3 1984 1984 2451 3338 4 3594 3455 3291 3347 5 3277 3590 3593 3595 2 466 7 22 19 3 166 3597 1984 3413 3 3343 0 166 166 4 3598 3514 3599 3141 3 2515 2507 1984 2535 3 2517 2549 1984 2547 3 1978 2309 2546 2546 4 3601 3602 3366 3603 4 2578 2565 3213 2567 5 3600 3604 3349 3605 2 7 7 35 51 3 181 3281 3607 3287 3 3333 0 166 166 2 51 51 466 7 3 3610 3414 0 0 4 3608 3609 3611 2556 4 3141 3366 2558 3375 3 1978 1978 2546 3350 4 3213 3213 3214 3614 5 3612 3613 3458 3615 4 3214 3214 2592 2593 3 1978 2551 2546 2553 2 0 391 466 8 3 1984 3619 2118 2618 4 3214 3618 3375 3620 3 2605 2118 2610 2607 4 3213 3213 3214 3622 5 3617 3621 3623 3572 6 3596 3606 3616 3624 3 2553 2560 1984 2450 3 1978 1978 2560 2546 3 1978 1978 2546 2560 4 3209 3626 3627 3628 3 2552 2549 1984 1984 3 1978 1978 2546 2595 4 3630 2583 3631 3215 3 2546 2606 9 2612 4 3150 2578 2561 3633 3 1984 2611 2118 2618 4 3635 3171 2617 3226 5 3629 3632 3634 3636 4 3478 3385 2621 2625 5 3638 3234 3236 3238 5 3544 3243 3234 3244 2 5 25 52 25 3 3199 3641 1721 203 4 3233 3237 3642 0 3 0 203 0 203 4 3644 0 3644 0 5 3643 0 3645 0 6 3637 3639 3640 3646 3 2546 3350 1984 1984 4 2578 2578 3648 3213 3 1984 1984 2605 1978 4 3650 2578 3213 3219 4 3214 3214 2578 3580 5 3649 3651 3652 3481 4 3580 3171 2617 3226 3 3196 3197 3198 1721 4 2625 3232 3195 3655 2 5 52 52 395 3 3194 3198 1997 3657 2 395 52 397 0 3 3199 3659 1721 0 2 0 497 0 19 2 0 592 0 497 3 1721 3661 0 3662 4 3658 3660 3663 0 5 3654 3236 3656 3664 3 3194 3198 1997 1721 4 3226 3230 3232 3666 3 3231 1997 3197 1721 4 3174 3195 3230 3668 3 1721 0 0 0 4 3655 3670 3670 0 5 3572 3667 3669 3671 2 5 52 52 14 3 3673 2117 203 20 3 2108 28 161 28 4 3668 3674 3670 3675 2 0 19 14 95 2 95 0 19 19 2 95 19 19 19 3 2117 3677 3678 3679 3 92 92 92 92 4 3680 0 3681 0 3 161 28 2112 3679 4 0 3683 0 3681 4 3681 0 3681 0 5 3676 3682 3684 3685 6 3653 3665 3672 3686 5 3238 0 0 0 2 0 12 0 0 3 0 0 3689 108 4 3644 0 3644 3690 2 0 0 1 0 2 0 0 5 14 2 88 7 51 0 3 3692 3693 3694 2962 2 0 0 771 14 3 3696 2117 1978 1978 4 0 0 3695 3697 5 3645 0 3691 3698 2 0 95 0 25 3 3700 0 352 0 2 0 96 0 0 2 0 14 0 96 3 3702 0 3703 0 4 3644 3701 3644 3704 3 352 0 280 0 2 0 14 0 8 3 3707 0 352 0 4 3644 3706 3644 3708 5 3705 0 3709 0 6 3688 3699 0 3710 7 3625 3647 3687 3711 3 3199 1722 1721 0 4 3235 3713 3237 0 5 3714 0 0 0 6 3715 0 0 0 3 2117 2117 1978 1978 4 0 0 3717 3717 5 0 0 3718 3718 3 2117 0 1978 181 4 0 0 3720 0 5 0 0 3721 0 6 3719 3722 0 0 7 3716 0 3723 0 8 3484 3588 3712 3724 3 0 0 6 2117 3 2223 86 515 1978 4 3726 2150 3727 2255 2 96 1 51 51 3 86 227 1978 3729 2 8 7 22 8 3 0 215 3731 181 4 2150 2150 3730 3732 5 0 0 3728 3733 6 0 0 0 3734 3 2 173 173 181 4 0 3 3 3736 3 0 0 3693 2117 2 0 0 14 88 2 0 0 14 1 3 0 0 3739 3740 3 277 215 215 181 4 3738 3741 205 3742 2 52 5 0 19 2 95 5 1 19 2 1 51 0 0 3 3744 3745 46 3746 2 5 0 19 51 2 14 0 95 5 2 1 5 0 0 2 1 19 0 19 3 3748 3749 3750 3751 4 3736 205 3747 3752 5 0 3737 3743 3753 3 181 3262 0 0 2 8 0 19 5 3 0 215 215 3756 4 3736 3755 205 3757 3 2443 2446 3693 2117 2 0 0 14 35 2 5 14 35 0 3 166 166 3760 3761 4 3279 2494 3759 3762 3 0 215 215 181 2 0 22 0 19 3 181 3765 344 885 2 19 0 52 8 2 0 0 88 35 2 35 25 19 0 3 3767 3768 0 3769 2 25 7 52 0 3 3771 242 1730 0 4 3764 3766 3770 3772 2 52 0 5 19 2 22 52 0 14 2 51 1 14 14 3 3774 1767 3775 3776 2 5 35 52 52 2 96 0 8 1 3 3778 3779 2117 1984 3 2387 310 0 108 2 5 14 25 0 3 3782 1984 0 0 4 3777 3780 3781 3783 5 3758 3763 3773 3784 6 0 3278 3754 3785 3 6 1984 28 2096 3 28 2096 6 123 4 3787 2983 3788 1735 3 1984 1984 123 3380 2 0 19 7 52 3 3791 0 166 166 2 7 52 7 7 2 7 8 7 52 3 123 3793 123 3794 2 95 14 88 14 2 52 25 52 25 3 3796 3761 0 3797 4 3790 3792 3795 3798 2 7 7 5 7 3 0 3800 0 277 3 123 123 166 166 4 3801 3802 0 0 3 123 3794 166 3359 3 0 1325 1397 2248 3 180 0 180 222 4 3804 3805 0 3806 5 3789 3799 3803 3807 2 0 19 0 96 3 180 28 1730 3809 2 8 19 0 52 3 0 3811 0 0 4 0 3810 0 3812 5 0 3813 0 0 6 0 3808 0 3814 2 0 0 5 88 2 7 8 5 8 2 52 7 14 0 3 0 3816 3817 3818 2 19 0 1 95 2 88 52 88 0 2 0 25 0 96 2 88 7 95 0 3 3820 3821 3822 3823 2 52 0 0 14 2 0 8 14 14 2 19 0 19 51 3 3825 3826 3827 2251 2 95 95 51 88 3 3122 2117 3829 86 4 3819 3824 3828 3830 2 88 95 88 95 2 52 51 0 0 3 3832 3832 3833 3833 2 1 95 25 25 2 88 51 88 95 2 51 51 0 0 3 3835 3836 3837 2054 2 95 0 96 14 2 19 0 52 0 3 2117 321 3839 3840 4 3834 3838 3841 0 2 96 95 19 14 2 0 1 14 8 2 0 5 0 51 3 3843 3844 2445 3845 2 5 95 25 51 2 22 7 14 14 2 88 5 52 5 3 344 3847 3848 3849 2 8 0 5 7 2 35 5 8 19 2 7 7 0 19 3 3851 1984 3852 3853 2 95 51 0 14 3 3128 242 3855 2314 4 3846 3850 3854 3856 2 35 5 25 25 2 88 35 35 25 3 349 0 3858 3859 3 0 0 3322 321 2 96 95 51 14 2 51 95 14 1 3 3862 3863 0 0 2 19 51 22 7 2 51 96 22 51 2 51 14 0 5 3 3865 3866 0 3867 4 3860 3861 3864 3868 5 3831 3842 3857 3869 2 96 22 19 96 2 1 96 0 19 3 3871 3872 203 0 2 22 1 96 0 3 3874 0 2962 1978 2 0 0 8 14 3 203 0 515 3876 3 2096 123 2117 2117 4 3873 3875 3877 3878 2 14 95 0 1 2 5 0 5 95 3 0 0 3880 3881 2 0 0 0 395 3 0 3883 0 2743 2 5 5 22 8 2 0 0 96 1 3 2529 3885 2117 3886 2 14 14 95 0 2 1 8 0 51 3 3888 1978 3889 321 4 3882 3884 3887 3890 2 0 8 51 19 3 6 2117 3892 0 2 95 1 51 95 2 7 8 0 22 2 35 35 35 96 3 3894 3895 3896 1774 2 7 22 52 0 2 52 0 7 0 2 7 7 0 51 3 3898 3899 3900 166 4 0 3893 3897 3901 2 51 19 14 52 3 2117 3903 0 0 2 14 35 0 0 3 0 6 2962 3905 3 2117 2117 1978 2118 4 3904 2383 3906 3907 5 3879 3891 3902 3908 2 25 25 0 25 3 161 2052 1676 3910 2 19 5 19 0 2 35 0 25 51 2 88 22 0 22 3 3912 3913 2067 3914 2 0 1 0 51 2 7 7 8 7 3 539 3413 3916 3917 2 7 52 8 5 2 7 52 466 7 3 3919 3920 490 3087 4 3911 3915 3918 3921 2 630 7 88 0 2 1 8 51 95 2 19 5 52 22 2 14 2006 19 52 3 3923 3924 3925 3926 2 5 22 1506 14 2 8 5 14 22 3 236 1983 3928 3929 2 0 51 7 466 2 88 19 0 0 3 3931 3932 3108 3092 2 402 0 7 419 2 19 0 5 7 2 19 51 52 0 3 3934 3935 3793 3936 4 3927 3930 3933 3937 2 22 52 51 14 3 0 3939 0 0 3 1476 0 0 0 4 3940 3941 0 0 2 1 7 51 7 3 0 0 3943 123 3 2084 1984 185 166 4 0 3944 0 3945 5 3922 3938 3942 3946 2 52 8 95 0 2 1 7 8 35 2 51 95 8 52 2 0 8 5 52 3 3948 3949 3950 3951 2 7 7 95 95 2 1 88 0 0 3 3953 166 3954 3800 2 95 25 88 22 2 0 7 5 7 2 88 88 0 51 3 3956 3957 3958 3840 3 123 3204 0 0 4 3952 3955 3959 3960 3 166 166 123 123 2 95 5 0 19 3 166 3359 123 3963 2 0 88 0 25 3 0 0 3965 166 3 6 2215 242 0 4 3962 3964 3966 3967 3 0 181 123 123 4 3969 1679 2089 2089 2 7 0 7 14 3 203 6 3971 1721 2 7 7 88 7 3 1726 1978 1765 3973 2 7 95 0 25 3 3130 0 3975 0 2 8 14 5 14 2 25 0 8 14 3 203 3977 203 3978 4 3972 3974 3976 3979 5 3961 3968 3970 3980 6 3870 3909 3947 3981 7 3735 3786 3815 3982 2 7 0 0 1 2 95 88 0 52 3 2429 3984 3985 1391 2 0 51 7 7 3 1984 3987 0 0 4 3276 3986 2449 3988 2 433 5 436 52 2 14 7 0 1 3 2443 2446 3990 3991 2 52 1 0 340 2 7 88 679 51 2 7 96 0 51 2 7 25 22 52 3 3993 3994 3995 3996 4 3271 3992 2505 3997 2 7 7 0 5 2 7 52 95 19 3 166 3999 123 4000 2 5 7 7 25 3 123 124 4002 111 2 8 35 52 52 2 51 22 419 395 2 364 679 51 52 2 14 703 14 14 3 4004 4005 4006 4007 2 22 52 5 8 2 0 51 5 88 2 52 5 14 52 2 52 7 0 19 3 4009 4010 4011 4012 4 4001 4003 4008 4013 5 3280 3989 3998 4014 2 25 579 19 7 2 96 95 51 51 2 22 52 52 7 3 2012 4016 4017 4018 2 697 51 96 14 2 1 52 14 7 2 51 0 812 770 2 0 487 7 51 3 4020 4021 4022 4023 2 88 19 51 0 3 123 123 0 4025 3 123 3380 1476 108 4 4019 4024 4026 4027 2 51 1 8 1 2 697 0 52 19 3 3413 4029 4030 2257 2 95 7 51 7 3 190 3987 4032 123 4 4031 1735 4033 1735 3 166 166 3880 2535 2 8 5 1 51 3 4036 2546 539 1984 2 1 0 22 0 2 88 5 51 52 3 4038 2387 4039 2546 4 4035 4037 4040 3214 3 1978 1978 2546 2552 4 3213 3213 4042 3523 5 4028 4034 4041 4043 2 14 5 5 22 2 419 0 52 0 3 2450 4045 3916 4046 2 0 7 7 7 2 0 5 0 25 3 1984 4048 0 4049 2 7 436 0 8 2 14 14 0 14 3 4051 3287 4052 1659 2 8 630 0 0 3 2534 4054 0 0 4 4047 4050 4053 4055 2 814 558 433 51 2 8 0 7 96 3 123 1984 4057 4058 2 51 14 14 5 3 2535 1984 4060 3888 2 460 8 0 22 2 7 51 52 811 2 0 25 51 88 2 88 1503 0 2917 3 4062 4063 4064 4065 2 0 25 95 51 2 51 7 8 0 2 88 812 52 1 2 583 0 7 7 3 4067 4068 4069 4070 4 4059 4061 4066 4071 2 96 0 8 0 2 0 8 7 22 3 1424 4073 1984 4074 3 1896 1984 161 0 2 0 5 7 22 2 5 1 8 96 3 4077 4078 0 108 3 349 0 0 0 4 4075 4076 4079 4080 2 5 52 25 0 3 386 0 4082 0 2 360 0 0 0 3 4084 0 0 0 2 25 0 25 52 2 5 14 8 14 3 4086 4087 3138 62 2 771 14 14 14 3 4089 86 0 0 4 4083 4085 4088 4090 5 4056 4072 4081 4091 3 123 1984 1978 1978 2 7 7 5 562 2 25 0 0 0 3 4094 3350 4095 0 3 2546 2546 0 0 4 4093 2578 4096 4097 2 5 96 0 51 3 2546 2610 0 4099 4 2578 2578 4097 4100 3 86 86 0 0 4 0 0 4102 4102 3 86 86 2117 2117 4 0 0 4104 4104 5 4098 4101 4103 4105 6 4015 4044 4092 4106 3 3047 123 2095 2980 3 123 123 123 2095 2 8 5 96 1 3 123 3380 3092 4110 4 4108 4109 1735 4111 3 2310 1978 2546 2546 4 3213 3213 4113 3215 5 3012 4112 4114 3572 2 7 95 7 5 2 7 7 425 8 3 123 4116 4117 2607 3 4110 2619 2614 2620 2 0 96 5 51 3 4120 2615 2619 2622 4 4118 4119 4121 3174 4 3668 3670 3670 0 5 4122 3656 3667 4123 2 52 88 1 0 2 5 0 25 25 3 3231 1466 4125 4126 4 3174 3195 3230 4127 3 0 2623 108 0 3 86 227 2117 150 2 52 88 1 95 2 22 52 0 8 3 185 4131 0 4132 4 4129 3232 4130 4133 2 52 1 88 0 2 5 0 52 25 3 3194 4135 1997 4136 2 25 25 8 51 3 6 4138 108 1496 2 5 52 25 5 2 19 22 22 96 2 25 51 52 0 3 4140 4141 4142 310 2 0 19 8 22 2 19 0 88 25 3 4144 220 4145 1466 4 4137 4139 4143 4146 5 3654 4128 4134 4147 3 28 0 28 0 4 3655 3670 4149 0 2 0 19 8 19 3 4151 0 92 0 2 19 19 0 52 3 4153 0 0 0 4 4152 0 4154 0 5 4150 0 4155 0 6 4115 4124 4148 4156 3 486 0 206 0 3 1978 1978 0 0 4 4158 0 4159 4159 3 885 181 46 62 3 2394 515 0 1730 3 62 0 515 62 4 4161 0 4162 4163 3 1984 9 0 435 2 5 0 22 7 2 1 0 88 0 3 4166 1984 4167 0 3 2117 2117 86 86 3 1476 0 86 86 4 4165 4168 4169 4170 3 1984 321 0 1730 3 1730 515 0 1730 2 14 95 14 1 3 0 0 86 4174 3 133 28 161 28 4 4172 4173 4175 4176 5 4160 4164 4171 4177 2 51 14 0 14 3 0 2111 0 4179 2 0 51 14 14 3 2117 4181 86 86 3 0 2387 0 2 3 1978 1978 1984 1984 4 4180 4182 4183 4184 3 86 86 86 4174 2 35 7 52 7 2 1 7 88 95 3 4187 4188 1984 3130 4 4186 4102 4184 4189 2 0 8 0 19 3 62 203 4191 203 3 3943 123 3943 123 3 28 1391 28 1391 4 4192 4193 4194 1735 2 7 5 7 22 2 5 95 8 96 3 124 166 4196 4197 2 7 95 7 0 3 4199 435 4199 0 4 1735 4198 1735 4200 5 4185 4190 4195 4201 2 22 8 0 0 2 14 0 0 25 3 62 0 4203 4204 3 3368 2012 0 6 3 6 1721 1721 0 4 4205 1012 4206 4207 2 5 7 52 0 3 0 0 4209 166 3 161 28 2445 46 3 0 0 0 215 4 4210 4211 0 4212 2 14 52 14 14 3 4052 4214 2529 1984 3 2117 1466 1984 1984 4 4215 4216 4104 4104 3 166 166 1984 1669 3 166 181 1978 1978 2 14 0 14 52 3 86 4220 2117 150 4 4218 4219 4221 0 5 4208 4213 4217 4222 2 0 51 95 0 3 3126 4224 236 161 2 88 22 22 22 3 4226 3000 181 0 2 0 0 7 14 3 4228 150 0 277 4 4225 2264 4227 4229 2 7 95 0 19 3 4231 0 28 0 2 7 95 0 51 3 0 0 4233 321 4 2264 4232 4234 4149 2 95 0 51 7 3 4236 1984 0 0 4 2121 0 2959 4237 2 35 0 0 22 3 0 4239 0 46 2 0 0 22 0 3 108 310 4241 108 2 35 95 0 25 3 3128 0 108 4243 3 138 0 1983 1984 4 4240 4242 4244 4245 5 4230 4235 4238 4246 6 4178 4202 4223 4247 2 95 8 1 0 3 2251 4249 1466 0 2 0 0 96 8 3 3876 4251 0 509 3 0 1466 1466 2243 4 4250 4252 0 4253 2 0 14 1 0 2 0 14 0 35 3 4255 3122 1466 4256 2 35 88 14 14 2 0 95 52 25 3 4258 86 4259 3097 2 0 35 0 0 2 7 19 52 19 2 8 19 8 19 3 0 4261 4262 4263 2 52 8 0 0 2 52 14 0 0 2 8 5 8 19 2 8 19 19 19 3 4265 4266 4267 4268 4 4257 4260 4264 4269 2 7 1 1 14 2 14 1 95 0 3 166 4271 4272 3693 2 51 14 14 14 3 321 2029 4274 4214 2 25 5 25 8 2 35 0 35 14 3 161 4276 217 4277 2 14 14 14 0 2 5 52 1 95 2 0 0 95 19 3 4279 3885 4280 4281 4 4273 4275 4278 4282 3 166 277 2117 2117 3 2188 230 0 352 2 0 0 35 1 3 86 4286 2394 1476 3 4095 0 0 0 4 4284 4285 4287 4288 5 4254 4270 4283 4289 3 86 86 1338 0 2 8 0 8 0 3 181 0 4292 0 4 4291 4102 4293 0 3 86 4220 0 0 4 4295 0 0 0 2 51 0 0 0 3 4297 268 3883 486 3 2096 2268 0 0 3 2743 206 0 0 3 0 0 0 2111 4 4298 4299 4300 4301 3 123 123 0 2111 2 0 0 14 7 3 123 123 4304 1984 2 19 0 51 14 3 0 4306 2117 2117 2 0 579 14 0 2 770 95 7 0 2 0 25 1 0 3 4308 4309 4310 0 4 4303 4305 4307 4311 5 4294 4296 4302 4312 2 25 7 51 95 3 4314 181 108 2222 2 88 22 14 1 2 0 51 8 0 3 2370 4316 1984 4317 2 0 96 0 1 2 95 1 95 25 2 25 19 25 19 3 4319 4320 203 4321 2 7 8 0 25 2 0 8 5 95 2 19 0 406 0 2 25 96 25 19 3 4323 4324 4325 4326 4 4315 4318 4322 4327 2 52 96 0 96 2 95 96 19 19 2 7 5 0 0 2 35 0 8 14 3 4329 4330 4331 4332 2 22 95 96 51 2 0 0 8 35 2 8 0 14 7 2 25 52 88 7 3 4334 4335 4336 4337 2 95 5 0 22 2 7 8 52 0 3 1397 0 4339 4340 2 7 95 8 51 2 0 0 95 95 3 0 0 4342 4343 4 4333 4338 4341 4344 2 0 25 5 35 2 25 19 51 52 2 95 25 51 51 3 4346 4347 4348 123 2 19 19 19 0 2 51 22 7 433 2 452 51 95 1 3 4350 4351 3486 4352 3 0 2096 1984 4224 2 7 7 1 8 2 88 19 8 1 3 4355 3987 4356 0 4 4349 4353 4354 4357 2 7 25 51 88 2 25 14 51 25 2 0 22 7 52 3 4359 4360 2529 4361 2 95 25 88 5 2 1 88 35 14 2 52 25 0 51 2 52 0 812 391 3 4363 4364 4365 4366 3 123 123 2250 86 3 123 2529 86 86 4 4362 4367 4368 4369 5 4328 4345 4358 4370 2 8 35 25 52 2 5 7 8 0 3 0 0 4372 4373 2 51 95 52 25 2 7 88 0 51 3 0 4375 166 4376 2 8 96 0 96 2 96 95 14 25 2 51 14 0 51 3 4378 4379 2248 4380 2 7 7 96 14 2 7 7 5 0 3 227 1490 4382 4383 4 4374 4377 4381 4384 2 5 0 52 0 3 1490 0 4386 0 3 227 1490 0 0 4 4387 4388 2457 2457 2 95 95 1 88 2 8 0 1 0 2 25 5 1 22 2 19 0 7 25 3 4390 4391 4392 4393 2 51 14 1 0 2 22 7 0 0 2 51 7 1 7 3 4395 4396 4397 123 2 25 22 0 0 2 14 96 14 14 3 4399 2443 86 4400 2 25 1 0 8 3 4402 2546 86 86 4 4394 4398 4401 4403 2 7 7 1 7 3 4405 123 421 4405 2 7 8 8 0 3 123 3794 123 4407 2 52 19 14 52 2 5 7 19 0 2 1 0 0 19 3 4409 4410 86 4411 3 166 2445 86 86 4 4406 4408 4412 4413 5 4385 4389 4404 4414 6 4290 4313 4371 4415 7 4107 4157 4248 4416 2 0 5 0 8 3 0 0 0 4418 4 0 4419 0 0 3 0 0 86 86 3 0 0 86 1131 3 0 244 0 0 4 4421 4422 0 4423 5 0 0 4420 4424 6 0 4425 0 0 4 0 0 3 2086 2 0 14 7 25 2 95 0 88 1 3 0 108 4428 4429 2 14 95 25 88 3 166 166 2535 4431 2 52 471 590 19 3 3765 4433 0 3260 2 22 52 19 19 2 406 0 19 0 3 347 4435 4436 2188 4 4430 4432 4434 4437 2 0 0 1 8 3 166 166 4439 4428 2 0 95 8 7 3 166 166 4429 4441 2 25 22 19 19 2 52 22 0 19 2 1 19 25 19 3 4443 4444 4445 0 2 52 25 19 19 3 4447 347 3260 161 4 4440 4442 4446 4448 5 4427 3153 4438 4449 3 203 0 203 0 3 203 3782 203 180 3 203 0 3130 0 2 25 0 51 7 3 203 180 203 4454 4 4451 4452 4453 4455 3 166 166 4431 4439 3 166 166 4428 4429 3 4435 4443 2188 4445 3 4444 4447 0 3260 4 4457 4458 4459 4460 2 0 25 8 7 2 14 433 25 436 3 3975 0 4462 4463 2 1 7 25 0 2 0 0 364 679 2 25 14 7 25 3 1725 4465 4466 4467 3 347 4435 161 2188 2 25 698 19 19 2 397 22 0 19 2 630 19 25 19 3 4470 4471 4472 0 4 4464 4468 4469 4473 5 3153 4456 4461 4474 4 2294 205 0 0 3 509 0 0 0 3 108 181 0 0 4 4477 4478 0 0 5 4476 4479 0 0 3 0 509 0 0 4 4481 2294 0 0 4 205 4477 0 0 5 4482 4483 0 0 6 4450 4475 4480 4484 7 4426 4485 0 0 4 4159 4159 2086 2086 3 1978 2012 0 0 4 4488 0 2086 2086 3 166 166 4429 2535 4 4490 4457 4448 4459 4 4458 4432 4460 4469 5 4487 4489 4491 4492 4 0 0 2086 533 3 0 4261 0 0 2 14 14 0 19 3 4496 0 46 1397 3 0 185 0 0 4 4495 4497 0 4498 2 0 0 1 52 3 166 166 4500 0 2 25 52 19 0 3 4502 0 4445 0 4 4501 0 4503 0 5 4494 4499 4504 0 4 4478 4481 0 0 5 4506 4476 0 0 4 4477 0 0 0 5 4508 0 0 0 6 4493 4505 4507 4509 3 0 1730 0 108 3 0 2 1978 206 4 4511 4512 2264 2264 3 236 3693 4226 3000 3 2117 2117 1984 1669 4 4514 4515 205 0 5 4513 4516 0 0 2 0 14 14 14 3 2117 4518 1978 1978 4 4519 2255 0 0 3 86 2129 1978 1978 4 4521 2255 0 0 5 4520 4522 0 0 6 4517 4523 0 0 7 4510 4524 0 0 8 3983 4417 4486 4525 4 3666 3670 3670 0 5 4527 0 0 0 4 0 3681 0 3681 5 4529 3685 4529 3685 2 19 19 19 589 3 92 92 4531 92 3 2352 92 1122 92 4 4532 0 4533 0 3 4531 92 2352 92 3 1122 92 4531 92 4 4535 0 4536 0 5 4529 4534 4529 4537 6 4528 4530 0 4538 2 0 14 0 19 3 3689 0 4540 0 3 2111 0 3689 0 4 3644 4541 3644 4542 2 0 14 0 22 3 4544 0 352 0 2 0 25 0 0 2 12 0 0 0 3 4546 4547 3700 194 4 3644 4545 3644 4548 5 4543 0 4549 0 2 96 0 0 0 3 352 321 4546 4551 2 14 0 96 0 3 3700 4553 352 321 4 3644 4552 3644 4554 2 22 0 0 0 2 14 0 8 0 3 4546 4556 3700 4557 3 0 203 2 206 4 3644 4558 4559 0 5 4555 0 4560 0 6 0 4550 0 4561 3 123 123 3128 0 3 1983 2117 0 0 3 321 0 1671 4255 4 4563 541 4564 4565 3 3204 0 0 0 3 0 0 4236 1984 3 0 0 4052 86 4 541 4567 4568 4569 5 0 0 4566 4570 4 4533 0 4535 0 3 0 0 86 3122 2 19 19 1 19 2 0 19 14 52 3 4574 92 4575 92 4 0 3681 4573 4576 2 2006 589 19 590 2 19 19 2006 589 3 4578 4153 4579 0 3 2352 0 4578 0 4 4580 0 4581 0 5 4529 4572 4577 4582 4 0 0 4234 0 3 227 0 0 4049 2 1 0 25 0 3 4586 0 181 0 2 0 0 19 7 2 5 25 52 0 3 4588 4589 161 0 4 4585 4587 4590 0 2 88 14 0 0 2 0 25 25 1 3 1765 4592 4593 1669 2 1 0 5 7 3 2314 0 4595 1984 2 1 19 95 19 3 195 4049 4597 161 4 4594 4596 4598 205 2 19 0 7 0 3 161 0 4600 0 4 4601 0 0 0 5 4584 4591 4599 4602 3 0 92 0 2188 4 0 2110 0 4604 2 19 19 340 425 3 4606 0 0 0 3 0 2 2 206 3 0 2 166 2445 4 4607 4608 4609 1962 5 4605 4610 0 0 6 4571 4583 4603 4611 4 0 4608 4608 1962 4 1962 0 0 0 5 0 4613 4613 4614 5 4614 0 0 0 6 4615 4616 4616 0 7 4539 4562 4612 4617 2 1 19 14 52 3 4619 161 1978 181 4 4620 0 0 0 5 4621 0 0 0 6 4622 0 0 0 7 4623 0 0 0 8 4618 0 4624 0 9 3390 3725 4526 4625 6 3688 0 0 0 7 4627 0 0 0 8 4628 0 0 0 9 4629 0 0 0 10 2631 3253 4626 4630 11 0 0 0 4631 golly-3.3-src/Patterns/WireWorld/memory-cell.mcl0000644000175000017500000000214612026730263016657 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The wire on the left is the SET input, the wire on top the CLEAR input, #D and the wire on the right is the output. The inputs and outputs are #D supposed to be pulsed at 6-cycle intervals. #D #D Initially there are no electrons in the loop. At a tick which we'll number #D 0, an electron enters the device as shown in the top picture. #D Some cycles later, it leaves the output, and a duplicate rounds the bottom of #D the loop for another cycle, so that the memory will continue outputing #D the pulse. #D #D But, if at this time (or any multiple of 6 cycles afterwards) a pulse #D arrives in the CLEAR input, then two cycles later, the pulse in the loop #D will go away, and pulses will stop coming out the output. #D #D Mike Frank, March 1990 #L 8.C$8.C$7.3C$8.C$7.C.C$7.C.C$BA7C.14C$7.C6$8.B$8.A$8.C$8.C$8.C$8.C$8.C #L $8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$7.3C$8.C$7.C.C$7. #L C.C$BA7C.14C$7.C golly-3.3-src/Patterns/WireWorld/NylesHeise.mcl0000644000175000017500000001202212026730263016474 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 400x200 #WRAP 0 #CCOLORS 4 #D Design by Nyles Heise (nylesheise@yahoo.com). Previous multipliers #D by Nick Gardner and Karl Scherer. #D #D This is 32-bit by 32-bit binary muliplier producing a 64 bit product. #D Two versions are given. The compact version is crammed into the #D minimum area I could get to (you may be able to do better). The #D expanded version has the component separated and labeled, to give a #D better view of what's going on. #D #D A is the multiplicand, 252 cells. B is the multiplier, 124 cells. #D C is the product, 256 cells in the expanded version. FA is a single #D full adder. Gate is used to gate the bits of A into FA when the #D corresponding bit of B was on. Also turns off the B bit after it #D has been used. Clock tells Gate when to look at B. It's a fill-empty #D ring counter, 128 cells and a period of 252 cycles. #D The first partial result appears in the expanded verion in C after #D 205 cycles, next in another 256, and so on. Final product in a total #D of 8141 cycles. 8116 is the compact verion, some bits always in the FA. #D #D The design uses 4-tick logic elements. 6-tick takes 50% more space for #D the loops and 50% more overall time. All the normal logic elements #D are available in 4-tick (OR, XOR, AND, INVERT, R-S LATCH, T LATCH). #D The 4-tick INVERTER is shown bottom left. Note it takes less area than #D 6-tick. #D #L .C3.C..C3.C.CC3.C3.C..3C$C.C.C.C.CC.CC.C.C.C.C.C.C..C$C3.C.C.C.C.C.CC #L ..C.C.C4.C$C.C.C.C.C3.C.C3.3C.C.C..C$.C3.C..C3.C.C3.C.C..C3.C4$4.23C.C #L .C3.C.4C.10C.42C$3.C23.3C.A4C4.C10.C42.C$4.21C3.C.B3.C.C..3C..C3.3C.. #L 41C$25.C.C5.C3.C..C..A.C.C4.C$4.21C..C4.C..CC..4CAB3.3C..32CBACCBACCB$ #L 3.C23.C3.C..C3.C.C4.A5.C42.A$4.17C3.C..C..C3.C3.C3.CC..CC.A..ABCCABCCA #L BCCABCCABCCABCCABCCABCCABCCABCC..C$21.C.C.C.3C4.C4.C.C..C3.CAB41.A.C$ #L 4.17C..C.C..C3.C..C4.3C.C.C..A.CAB.CABCCABCCABCCABCCABCCABCCABCCABCCAB #L ..B.B$3.C19.C.C..7C4.C.A3.4C5.C35.C.C.A$4.17C..C.C.C4.C3.A3.B5.C6.B..A #L CCBACCBACCBACCBACCBACCBACCBACCBAC..C.C$21.C.C.C.C.C.CC.CB.C.3C..CC7.A. #L B36.A.C$4.17C..C..5C..CC.C3.C..B.C.BC..B.C..CCABCCABCCABCCABCCABCC4.CB #L ACCBACCB..B$3.C19.C3.A.C.C..3C4.CA3.A..ABBC25.A..C12.A$4.16C3.C3.B4.C #L ..C13.B.B.BACCBACCBACCBACCBACCBACCB4.ABCCABCCAB..C$20.C..C..C.A4.C.C5. #L ACCBA3C43.C.C$4.16C..CC3.C..3C..C4.B9.BACCBA3CBACCBACCBACCBACCBAC3.C3. #L BACCBAC..B$3.C17.C.CC4.C5.C3.C4.CCBACC28.C.C.A.C9.A$4.15C..C3.C..3C.C. #L 3C.C..CAA7.CABCCABCCABCCABCCABCCABCC..4B3.CABCCAB..C$19.C.C..3C..C.3C. #L C..A.C..B6.C25.A..C..A9.C.C$4.15C..C.C.C.CC.C.C..B.CACC.C.C6.BACCBACCB #L ACCBACCBACCBACC..B3C.C..BACCBAC..B$3.C17.C.C10.A.C.A.CC3.C29.B3.C..C.C #L 9.A$4.17C3.10C.C6.ABC.ABCCABCCABCCABCCABCCABCCABCCA5.AB3.CABCCABCC10$ #L 85.23C$84.C23.C$84.C..21C$84.C.C$84.C..31C$3C.C3.C.CC3.C..C3.C.CC..3C. #L CC50.C33.C$C4.C.C..C.C.C.C.CC..C.C.C.C3.C.C49.C..31C$CC4.C3.CC..C.C.C. #L C.C.C.C.CC..C.C49.C.C$C4.C.C..C3.3C.C..CC.C.C.C3.C.C49.C..BACCBACCBACC #L BACCBACCBACCBACCBAC$3C.C3.C.C3.C.C.C3.C.CC..3C.CC50.C33.C$84.C..CABCCA #L BCCABCCABCCABCCABCCABCCAB$84.C.C$84.C..BACCBACCBACCBACCBACCBACCBACCBAC #L $84.C33.C$85.3CABCCABCCABCCABCCABCCABCCABCCAB$87.C$87.C5.C3.C5.3C..C$ #L 87.C4.C.C.C.C6.C..C$55.3C..C10.CC3.C..3C.3C.C4.C.C.C.C.CC..CC..C$55.C #L 3.C.C8.C4.C.C..C..C3.C4.3C.C.C6.C..C$18.C3.C5.C3.3C20.CC..C.C8.C.CC.C. #L C..C..CC..C4.C.C..C5.3C.3C$17.C.C.C.C4.C5.C20.C3.3C8.C.C..3C..C..C3.C$ #L 17.C3.C.C.CC.3C..CC20.C3.C.C9.CC..C.C..C..3C.C$17.C.C.C.C4.C.C3.C52.C$ #L 18.C3.C5.3C.3C21.C.C3.C.12C.10C$52.6C.A4C12.C$4.31C16.C4.C.B3.C.C10.3C #L ..C11.CC..3C..C6.C$3.C47.C3.C5.C3.C10.C..A.C10.C.C3.C..C5.C.C$4.31C16. #L C3.C4.C..CC10.4CAB11.CC3.CC..C..CC.C.C$35.16C4.C3.C..C11.C.C4.A10.C.C #L 3.C..C5.C.C$4.31C17.C..C..C3.C11.C3.CC..CC.A6.CC..3C.3C5.C$3.C47.C.C. #L 3C4.C12.C.C..C3.CAB$4.31C16.C.C..C3.C..C12.3C.C.C..A.CAB.CABCCABCCABCC #L ABCCABCCABCCABCC$35.C15.C.C..7C12.C.A3.4C5.C29.A$4.31C16.C.C.C4.C3.A #L 11.B5.C6.B3.CCBACCBACCBACCBACCBACCBACCB$3.C47.C.C.C.C.CC.CB.C9.3C..CC #L 7.A..A$4.31C16.C..5C..CC.C11.C..B.C.BC..B.C3.BCCABCCABCCABCCABCCABCCAB #L CC$35.C15.C3.A.C.C..3C12.CA3.A..ABBC31.A$4.31C16.C3.B4.C..C21.B.B.B3. #L CCBACCBACCBACCBACCBACCBACCB$3.C47.C..C.A4.C.C13.ACCBA3C4.A..A$4.48C3.C #L ..3C..C12.B12.C.B$51.CC4.C5.C11.C14.C$53.C..3C.C.3C9.C$52.3C..C.3C.C #L 10.A$51.C.C.CC.C.C..B.BACCBA3CAC$51.C10.A.C9.A.C$52.10C.C12.C$76.C16.C #L ..C4.C3.C..C..C$76.C15.C.C.C3.C.C.C.C.C.C$.C..C3.C4.3C.C3.C.C.C.3C.CC #L ..3C.3C.CC31.C15.C3.C3.C.C.C3.CC$C.C.CC..C5.C..CC..C.C.C.C3.C.C..C..C #L 3.C.C30.C15.C.C.C3.C.C.C.C.C.C$C.C.C.C.C5.C..C.C.C.C.C.CC..CC3.C..CC.. #L CC31.C16.C..3C..C3.C..C..C$3C.C..CC5.C..C..CC.C.C.C3.C.C..C..C3.C.C30. #L C$C.C.C3.C4.3C.C3.C..C..3C.C.C..C..3C.C.C30.C11.CBACCBACCBACCBACCBA3CB #L ACCBA3.A$76.C5.ACCBAC28.C.C.B$10.C65.C..ABB7.ABCCABCCABCCABCCABCCABCCA #L ..4C$9.A.C64.C.C..C6.C25.B..C..B$9.B.B8.A56.CC.C.C6.CBACCBACCBACCBACCB #L ACCBAC..4C.A$9.C.A6.CB.C56.CA3.A29.C3.A..C$9.C..7C.C59.BCC.BCCABCCABCC #L ABCCABCCABCCABCCAB5.BC$9.C.C6.3C$9.C.C7.C$9.C.C8.12C$10.C golly-3.3-src/Patterns/WireWorld/gate-OR.mcl0000644000175000017500000000140212026730263015662 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D OR #D #D A 'T'' can be used as an OR gate for a pair of signals; #D the main concern is that one signal should not encroach #D upon the territory of the other when the second is absent. #D #D The signals arrive along the arms of the 'T',' the composite #D departs along the stem. It is essential that the stem rise one #D cell above the crossbar, thereby isolating the incoming signals; #D a barrier lurks beneath it all. #D #D Harold V. McIntosh #L .A$.C$.C$.C$.C$12C$.C$.C$.C$.C$.C3$.C$.C$.C$.C$.C$12C$.C$.C$.C$.C$.A3$ #L .A$.C$.C$.C$.C$12C$.C$.C$.C$.C$.A golly-3.3-src/Patterns/WireWorld/clocks.mcl0000644000175000017500000000254112026730263015707 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D Clocks #D #D To establish a clock it is only necessary to set up a ring whose #D circumference has the desired period, draw the signal off at some #D point, and insert an electron. Diodes can be used to protect the clock, #D and to ensure a particular direction of circulation. More elaborate #D clocks can be constructed by spacing out several electrons within #D the same circumference. #D #D WireWorld inherits the basic three-cell loop from the Zhabotinsky reactions, #D yielding all kinds of period-3 clocks. That is also the closest spacing that #D two electrons can have, but it is entirely too fast and dense for most applications. #D #D Loops yielding period six or even longer lead to more conservative constructions. #D Period six allows the inclusion of ultrafast period three subassemblies. #D #D A clock seems to be the only way to create the boolean constant TRUE; #D once again it is worth emphasizing that the constant only appears at intervals #D and propagates with a finite velocity. #D #D Harold V. McIntosh #L 7.A13C$7.B6$7.C$6.B.13C$7.A5$5.3C$4.C3.C$4.C3.13C$4.C3.C$5.CBA5$4.4C$ #L 3.C4.C$3.C4.13C$3.C4.C$4.CCBA5$.7C$C7.C$C7.13C$C7.C$.5CBA golly-3.3-src/Patterns/WireWorld/NickGardner.mcl0000644000175000017500000004203512026730263016622 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 400x200 #SPEED 20 #WRAP 0 #D 8-bit multiplier by Nick Gardner, Aug 2002. #D (see http://www.maa.org/editorial/mathgames/mathgames_05_24_04.html) #D #D C15 to C0 consist of 16 half-adders each made of an AND gate and an XOR gate. #D When set to one, a C-bit is represented by a looping electron. #D #D The bits of A7-A0 shift rightwards across the pattern. The bits of B7-B0 arrive #D in procession to meet the A bits at the AND gates just below the half adders. #D If the B bit is one the A bits proceed up to the half adders, otherwise they #D are cancelled. #D #D An unset C-loop will be set if an A bit arrives. A set C-loop will become unset #D and will throw a carry leftwards to the next C-loop. #D #D C-loops are 15 generations long. The B-bits arrive 105 generations apart. #D This is the minimum to ensure carrying bits in the half-adders don't collide #D with the next presentation of A-bits. #D #D The product can usually be seen after about 1000 generations, but to get rid #D of all superfluous electrons run the pattern for exactly 1661 generations. #D #D The AND gate in the C15 loop isn't necessary but has been left in to preserve #D the flashing effect of the C-loops. #L 21.3C.C.3C217.3C.3C$21.C3.C.C219.C3.C.C$21.C3.C.3C217.C3.C.C$21.C3.C3. #L C217.C3.C.C$21.3C.C.3C217.3C.3C3$23.5C10.5C10.5C10.5C10.5C10.5C10.5C #L 10.5C10.5C10.5C10.5C10.5C10.5C10.5C10.5C10.5C$22.C5.C8.C5.C8.C5.C8.C5. #L C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C #L 5.C$22.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5. #L C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C$22.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C #L 9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C$23.C.4C9. #L C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C #L 9.C.4C9.C.4C9.C.4C$24.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC #L 6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC #L 6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC$23.C.4C.C..C4.C.4C.C..C4.C.4C #L .C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C.. #L C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C #L .4C.C..C$20.3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C #L ..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C #L .C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C$19.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C$19.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4. #L 3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C #L 4.3C5.C.C4.3C5.C$19.C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C #L .C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC.. #L C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C #L ..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC$20.3C5.CC5.3C5.CC5. #L 3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC #L 5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC$21.C8.C3.C.C..CC4.C3.C.C..CC #L 4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C.. #L CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C #L ..CC4.C3.C.C..CC4.C$31.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C #L 4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C #L ..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C$32.C..3C3.C3.3C..3C #L 3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C #L 3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C #L ..3C3.C3.C$34.C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C #L .C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC #L 3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C$33.C4.C5.C3.C4.C5. #L C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C #L 5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C$32.C4.C..3C.C..C4.C.. #L 3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C #L ..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C #L 4.C..3C.C..C4.C..3C.C$31.C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C.. #L C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C5. #L C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C #L 3.C$31.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C #L .C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C5.C.C..3C.C5.C.C..3C #L .C5.C.C..3C.C5.C.C..3C.C5.C.C..3C.C5.C.C..3C.C5.C.C..3C$31.C.C.C.C.C3. #L C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3. #L C..C.C.C.C.C3.C..C.C.C.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C #L 3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C$3C.3C5.3C.3C5.C6.C.C.C..C.C.C3.C. #L C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C. #L C.C..C.C.C3.C.C.C..C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C #L .C.C3.C6.C.C.C3.C6.C.C.C$C.C3.C5.C.C.C.C6.C4.C..C.C5.C3.C..C.C5.C3.C.. #L C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C10.C3. #L C10.C3.C10.C3.C10.C3.C10.C3.C10.C3.C10.C$3C3.C.3C.3C.C.C.7C..C..C3.CCA #L .3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C #L ..C3.CCA.3C.C..C3.CCA.3C.C10.3C.C10.3C.C10.3C.C10.3C.C10.3C.C10.3C.C #L 10.3C$C.C3.C5.C.C.C.C6.C3.C.C9.C..C.C9.C..C.C9.C..C.C9.C..C.C9.C..C.C #L 9.C..C.C9.C..C.C9.C..C11.C..C11.C..C11.C..C11.C..C11.C..C11.C..C11.C$C #L .C3.C5.C.C.3C5.C3.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C.. #L C.C3.7C..C.C3.7C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C10.C #L .C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C. #L C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12. #L C.C12.C$28.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C #L .C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C10.C.C.C10.C.C.C10.C. #L C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C10.C.C. #L C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C #L .C12.C$28.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C #L 3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C #L .C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C9.C.C..C9.C.C..C9.C. #L C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C.C12.C$28.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C. #L C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C$28.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C. #L C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C.. #L C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C #L .C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C. #L C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C. #L C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12. #L C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C #L .C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C.. #L C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C #L 6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C. #L C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C #L .C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C #L .C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C. #L C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C #L .C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C. #L C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C #L .C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C. #L C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C #L ..C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C #L .C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C. #L C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C5.C.C.C.C..C #L 5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C #L ..C5.C.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..6C..C.C.C.. #L 6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C.. #L C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C6.C..C.C..C6.C..C #L .C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C5.C3.C.C..C5.C3.C.C..C #L 5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$29.C.C4.C4.C..C.C4.C4.C..C.C4.C4.C #L ..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C11.C..C11.C #L ..C11.C..C11.C..C11.C..C11.C..C11.C$30.C4.C4.3C..3C..C4.3C..3C..C4.3C #L ..3C..C4.3C..3C..C4.3C..3C..C4.3C..3C..C4.3C..3C..C4.3C..C9.3C..C9.3C #L ..C9.3C..C9.3C..C9.3C..C9.3C..C10.C$34.C6.C.C..C..C6.C.C..C..C6.C.C..C #L ..C6.C.C..C..C6.C.C..C..C6.C.C..C..C6.C.C..C..C6.C.C..C9.C.C..C9.C.C.. #L C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C$34.C..CC.C3.C.C..C..CC.C3.C.C..C #L ..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C #L ..CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC #L .C3.C.C9.C$35.3C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3. #L 3C..5C.C3.3C..5C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3. #L 3C4.3C.C3.3C10.C$37.CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C. #L C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C. #L C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C #L 11.C$41.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C #L 7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C14.C$40.C.C..C3.4C..C.C..C #L 3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C #L ..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C #L .C13.C$40.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C #L 8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C13.C$41.C..C..6C3.C..C.. #L 6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C.. #L 6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C14.C$41.C.C..C9.C.C..C9.C #L .C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C #L 9.C.C..C9.C.C..C9.C14.C$41.C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C #L ..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3. #L 7C..C14.C$41.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C #L .C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C..8C..C.C.. #L 8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$41.C.C.C10.C.C.C10.C.C.C10.C.C. #L C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C. #L C.C10.C14.C$41.C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C #L .C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$ #L 41.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C..8C..C.C..8C..C.C.. #L 8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C14.C$41.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C #L 14.C$41.C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C #L ..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$41.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C #L .C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C5.5C..C.C5.5C..C.C5.5C..C.C #L 5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C #L .C5.5C..C.C5.5C..C14.C$41.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C #L 4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C14.C$41. #L C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4. #L C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C14.C$40.C #L 4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C #L ..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C12.C$39.C6.6C6.C..6C.. #L C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C.. #L C6.6C6.C10.C$38.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C$35. #L 3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C$34.C #L 28.CC28.CC28.CC28.CC28.CC28.CC28.CC$34.C28.C30.C28.C30.C28.C30.C28.C$ #L 35.13C..13C32.13C..13C32.13C..13C32.13C..13C$48.CC58.CC58.CC58.CC$49.C #L 58.C60.C58.C$50.28C..28C62.28C..28C$78.CC118.CC$79.C118.C$80.58C..58C$ #L 138.CC60.C5.CC..3C5.CC..3C$138.C60.C6.C.C3.C5.C.C.C.C$135.A.C5.A7.A7.A #L 7.A7.A7.A7.A6.7C.CC4.C.3C.CC..C.C$134.3C4.4C4.4C4.4C4.4C4.4C4.4C4.CC8. #L C6.C.C3.C5.C.C.C.C$135.C4.C..C4.C..C4.C..C4.C..C4.C..C4.C..C4.C11.C5. #L CC4.C5.CC..3C$135.C..C..C.C..C..C.C..C..C.C..C..C.C..C..C.C..C..C.C..C #L ..C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$136.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C golly-3.3-src/Patterns/Larger-than-Life/0000755000175000017500000000000013543257426015127 500000000000000golly-3.3-src/Patterns/Larger-than-Life/SlowShip.rle0000644000175000017500000000051213127300132017276 00000000000000#C Range-10, diagonal, speed 2/1846 spaceship. #C Dean Hickerson, Sep 1, 2002. x = 26, y = 26, rule = R10,C0,M1,S154..262,B133..265,NM 13bo$15bo$12b5o$11b5obo$10b7obo$9b9o$8b10o$4bo2b12o$3bob15o$4b17o$b10o 4b7o$ob8o6b7o$ob8o6b7o$ob8o6b8obo$3b7o6b8obo$3b8o4b10o$4b18obo$6b14o2b o$7b12o2bo$8b10o$8b9o$7bob7o$8bob5o$10b4o$10bo$12bo! golly-3.3-src/Patterns/Larger-than-Life/R500-alien-bug.rle0000644000175000017500000004450413140227320020030 00000000000000# An orthogonal bug (speed = 16123261c/144331) created by scaling up # the R100-alien-bug in the following way: # # The R100-alien-bug was loaded into Golly and a screenshot saved at # scale 1:1. The resulting png file was opened in an image editor, # the background changed to white, the live cells changed to black, # and the image was magnified by 500%. # # The modified png file was then opened in Golly in an empty universe # using the following R500 rule. The new S and B limits were calculated # from the R100 limits using the formula: # # newlimit = oldlimit * (2*500+1)^2 / (2*100+1)^2 # # The oscar.lua script was then run to find the resulting bug's speed. # x = 1018, y = 1012, rule = R500,C0,M1,S256694..390374,B231893..306545,NM 451b116o$431b156o$422b174o$415b188o$410b198o$404b210o$400b218o$395b 228o$390b238o$386b246o$381b256o$377b264o$373b272o$370b278o$366b286o$ 363b292o$360b298o$358b302o$355b308o$352b314o$350b318o$348b322o$345b 328o$343b332o$341b336o$338b342o$336b346o$334b350o$332b354o$330b358o$ 328b362o$326b366o$325b368o$323b372o$321b376o$319b380o$318b382o$316b 386o$314b390o$313b392o$311b396o$310b398o$308b402o$307b404o$305b408o$ 304b410o$302b414o$301b416o$300b418o$298b422o$297b424o$296b426o$294b 430o$293b432o$292b434o$290b438o$289b440o$288b442o$287b444o$286b446o$ 284b450o$283b452o$282b454o$281b456o$280b458o$279b460o$278b462o$277b 464o$276b466o$275b468o$274b470o$273b472o$272b474o$271b476o$270b478o$ 269b480o$268b482o$267b484o$266b486o$265b488o$264b490o$263b492o$262b 494o$261b496o$260b498o$259b500o$258b502o$257b504o$257b504o$256b506o$ 255b508o$254b510o$253b512o$252b514o$252b514o$251b516o$250b518o$249b 520o$248b522o$248b522o$247b524o$246b526o$245b528o$244b530o$244b530o$ 243b532o$242b534o$241b536o$241b536o$240b538o$239b540o$238b542o$238b 542o$237b544o$236b546o$236b546o$235b548o$234b550o$234b550o$233b552o$ 232b554o$232b554o$231b556o$230b558o$230b558o$229b560o$228b562o$228b 562o$227b564o$226b566o$226b566o$225b568o$225b568o$224b570o$223b572o$ 223b572o$222b574o$221b576o$221b576o$220b578o$220b578o$219b580o$218b 582o$218b582o$217b584o$217b584o$216b586o$216b586o$215b588o$214b590o$ 214b590o$213b592o$213b592o$212b594o$212b594o$211b596o$211b596o$210b 598o$209b600o$209b600o$208b602o$208b602o$207b604o$207b604o$206b606o$ 206b606o$205b608o$205b608o$204b610o$204b610o$203b612o$203b612o$202b 614o$201b616o$201b616o$200b618o$200b618o$199b620o$199b620o$198b622o$ 198b622o$197b624o$196b626o$196b626o$195b628o$195b628o$194b630o$194b 630o$193b632o$193b632o$192b634o$191b636o$191b636o$190b638o$190b638o$ 189b640o$189b640o$188b642o$187b644o$187b644o$186b646o$186b646o$185b 648o$185b648o$184b650o$183b652o$183b652o$182b654o$182b654o$181b656o$ 181b656o$180b658o$179b660o$179b660o$178b662o$178b662o$177b664o$176b 666o$176b666o$175b668o$175b668o$174b670o$173b672o$173b672o$172b674o$ 172b674o$171b676o$170b678o$170b678o$169b680o$169b680o$168b682o$167b 684o$167b684o$166b686o$165b688o$165b688o$164b690o$164b690o$163b692o$ 162b694o$162b694o$161b696o$161b696o$160b698o$159b700o$159b700o$158b 702o$157b704o$157b704o$156b706o$156b706o$155b708o$154b710o$154b710o$ 153b712o$152b714o$152b714o$151b716o$151b716o$150b718o$149b720o$149b 720o$148b722o$148b722o$147b724o$146b726o$146b726o$145b728o$144b730o$ 144b730o$143b732o$143b732o$142b734o$142b734o$141b736o$140b738o$140b 738o$139b740o$139b740o$138b742o$138b742o$137b744o$136b746o$136b746o$ 135b748o$135b748o$134b750o$134b750o$133b752o$132b754o$132b754o$131b 756o$131b756o$130b758o$130b758o$129b57ob644ob57o$129b57ob644ob57o$128b 57ob646ob57o$128b57ob646ob57o$127b57o2b646o2b57o$127b56o2b648o2b56o$ 126b57o2b648o2b57o$126b56o2b650o2b56o$125b56o3b650o3b56o$124b57o3b650o 3b57o$124b56o3b652o3b56o$123b56o4b652o4b56o$123b56o4b652o4b56o$122b56o 4b318o18b318o4b56o$122b55o5b307o40b307o5b55o$121b56o4b303o50b303o4b56o $121b55o5b300o56b300o5b55o$120b55o6b296o64b296o6b55o$120b55o5b294o70b 294o5b55o$119b55o6b290o78b290o6b55o$119b54o7b287o84b287o7b54o$119b54o 6b285o90b285o6b54o$118b54o7b282o96b282o7b54o$118b53o8b280o100b280o8b 53o$117b54o7b279o104b279o7b54o$117b53o8b277o108b277o8b53o$116b53o9b 275o112b275o9b53o$116b53o8b275o114b275o8b53o$115b53o9b273o118b273o9b 53o$115b52o10b271o122b271o10b52o$114b52o10b271o124b271o10b52o$114b52o 10b269o128b269o10b52o$113b52o11b268o130b268o11b52o$113b51o11b267o134b 267o11b51o$113b51o11b266o136b266o11b51o$112b51o12b265o138b265o12b51o$ 112b50o13b263o142b263o13b50o$111b50o13b263o144b263o13b50o$111b50o13b 262o146b262o13b50o$110b50o14b261o148b261o14b50o$110b49o14b260o152b260o 14b49o$110b48o15b259o154b259o15b48o$109b49o15b258o156b258o15b49o$109b 48o15b258o158b258o15b48o$108b48o16b257o160b257o16b48o$108b47o17b256o 162b256o17b47o$108b47o17b255o164b255o17b47o$107b47o17b255o166b255o17b 47o$107b46o18b254o168b254o18b46o$106b46o19b253o170b253o19b46o$106b46o 18b253o172b253o18b46o$106b45o19b252o174b252o19b45o$105b45o20b251o176b 251o20b45o$105b44o21b250o178b250o21b44o$104b45o20b250o180b250o20b45o$ 104b44o21b249o182b249o21b44o$104b43o22b248o184b248o22b43o$103b43o22b 248o186b248o22b43o$103b42o23b247o188b247o23b42o$102b43o23b246o190b246o 23b43o$102b42o24b246o190b246o24b42o$102b41o24b246o192b246o24b41o$101b 41o25b245o194b245o25b41o$101b41o25b244o196b244o25b41o$101b40o26b243o 198b243o26b40o$100b40o26b244o198b244o26b40o$100b39o27b243o200b243o27b 39o$100b39o27b242o202b242o27b39o$99b39o27b242o204b242o27b39o$99b38o28b 241o206b241o28b38o$98b38o29b241o206b241o29b38o$98b38o29b240o208b240o 29b38o$98b37o29b240o210b240o29b37o$97b37o30b240o210b240o30b37o$97b36o 31b239o212b239o31b36o$97b36o31b238o214b238o31b36o$96b36o31b238o216b 238o31b36o$96b35o32b238o216b238o32b35o$96b34o33b237o218b237o33b34o$95b 35o33b236o220b236o33b35o$95b34o33b237o220b237o33b34o$95b33o34b236o222b 236o34b33o$94b33o35b236o222b236o35b33o$94b33o35b235o224b235o35b33o$94b 32o35b235o226b235o35b32o$93b32o36b235o226b235o36b32o$93b31o37b234o228b 234o37b31o$93b31o37b234o228b234o37b31o$92b31o37b234o230b234o37b31o$92b 30o38b233o232b233o38b30o$92b30o38b233o232b233o38b30o$91b30o39b232o234b 232o39b30o$91b29o39b233o234b233o39b29o$91b29o39b232o236b232o39b29o$90b 29o40b232o236b232o40b29o$90b28o41b231o238b231o41b28o$90b27o42b231o238b 231o42b27o$90b27o41b231o240b231o41b27o$89b27o42b231o240b231o42b27o$89b 26o43b230o242b230o43b26o$89b26o43b230o242b230o43b26o$88b26o44b230o242b 230o44b26o$88b26o43b230o244b230o43b26o$88b25o44b230o244b230o44b25o$88b 24o45b229o246b229o45b24o$87b25o45b229o246b229o45b25o$87b24o46b229o246b 229o46b24o$87b23o46b229o248b229o46b23o$87b23o46b229o248b229o46b23o$86b 23o47b228o250b228o47b23o$86b23o47b228o250b228o47b23o$86b22o48b228o250b 228o48b22o$86b21o48b228o252b228o48b21o$85b22o48b228o252b228o48b22o$85b 21o49b228o252b228o49b21o$85b21o49b227o254b227o49b21o$85b20o50b227o254b 227o50b20o$84b21o50b226o256b226o50b21o$84b20o50b227o256b227o50b20o$84b 19o51b227o256b227o51b19o$84b19o51b226o258b226o51b19o$83b19o52b226o258b 226o52b19o$83b19o52b226o258b226o52b19o$83b18o52b226o260b226o52b18o$83b 18o52b226o260b226o52b18o$82b18o53b226o260b226o53b18o$82b17o54b225o262b 225o54b17o$82b17o54b225o262b225o54b17o$82b16o54b225o264b225o54b16o$81b 17o54b225o264b225o54b17o$81b16o55b225o264b225o55b16o$81b16o55b224o266b 224o55b16o$81b15o56b224o266b224o56b15o$80b16o55b225o266b225o55b16o$80b 15o56b224o268b224o56b15o$80b15o56b224o268b224o56b15o$80b14o57b224o268b 224o57b14o$79b15o57b223o270b223o57b15o$79b14o57b224o270b224o57b14o$79b 14o57b224o270b224o57b14o$79b13o58b223o272b223o58b13o$78b14o58b223o272b 223o58b14o$78b13o59b223o272b223o59b13o$78b13o58b223o274b223o58b13o$77b 13o59b223o274b223o59b13o$77b13o59b222o276b222o59b13o$77b12o60b222o276b 222o60b12o$77b12o60b222o276b222o60b12o$76b12o60b222o278b222o60b12o$76b 12o60b222o278b222o60b12o$76b11o61b222o278b222o61b11o$76b11o61b221o280b 221o61b11o$75b11o61b222o280b222o61b11o$75b11o61b222o280b222o61b11o$75b 10o62b221o282b221o62b10o$74b11o62b221o282b221o62b11o$74b11o62b221o282b 221o62b11o$74b10o62b221o284b221o62b10o$74b10o62b221o284b221o62b10o$73b 10o63b220o286b220o63b10o$73b10o63b220o286b220o63b10o$73b9o63b221o286b 221o63b9o$72b10o63b220o288b220o63b10o$72b9o64b220o288b220o64b9o$72b9o 64b220o288b220o64b9o$71b10o64b219o290b219o64b10o$71b9o64b220o290b220o 64b9o$71b9o64b220o290b220o64b9o$71b8o65b219o292b219o65b8o$70b9o65b219o 292b219o65b9o$70b9o64b219o294b219o64b9o$70b8o65b219o294b219o65b8o$69b 9o65b219o294b219o65b9o$69b8o66b218o296b218o66b8o$69b8o65b219o296b219o 65b8o$68b9o65b219o296b219o65b9o$68b8o66b218o298b218o66b8o$68b8o65b219o 298b219o65b8o$67b8o66b218o300b218o66b8o$67b8o65b219o300b219o65b8o$67b 8o64b220o300b220o64b8o$66b8o65b219o302b219o65b8o$66b8o64b220o302b220o 64b8o$66b7o64b220o304b220o64b7o$65b8o64b220o304b220o64b8o$65b8o63b221o 304b221o63b8o$65b7o63b221o306b221o63b7o$64b8o63b221o306b221o63b8o$64b 8o62b221o308b221o62b8o$63b8o62b222o308b222o62b8o$63b8o62b221o310b221o 62b8o$63b7o62b222o310b222o62b7o$62b8o61b222o312b222o61b8o$62b8o61b222o 312b222o61b8o$61b8o61b223o312b223o61b8o$61b8o60b223o314b223o60b8o$61b 8o60b223o314b223o60b8o$60b8o60b223o316b223o60b8o$60b8o59b224o316b224o 59b8o$59b9o59b223o318b223o59b9o$59b8o59b224o318b224o59b8o$58b9o58b224o 320b224o58b9o$58b9o58b224o320b224o58b9o$57b9o58b224o322b224o58b9o$57b 9o57b225o322b225o57b9o$57b9o57b224o324b224o57b9o$56b9o57b225o324b225o 57b9o$56b9o56b225o326b225o56b9o$55b10o56b224o328b224o56b10o$55b9o56b 225o328b225o56b9o$54b10o56b224o330b224o56b10o$53b11o55b225o330b225o55b 11o$53b10o55b225o332b225o55b10o$52b11o55b225o332b225o55b11o$52b11o54b 225o334b225o54b11o$51b11o54b225o336b225o54b11o$51b11o54b225o336b225o 54b11o$50b12o53b225o338b225o53b12o$49b12o53b226o338b226o53b12o$49b12o 53b225o340b225o53b12o$48b13o52b225o342b225o52b13o$47b13o53b225o342b 225o53b13o$47b13o52b225o344b225o52b13o$46b14o51b225o346b225o51b14o$45b 14o52b225o346b225o52b14o$44b15o51b225o348b225o51b15o$43b16o50b225o350b 225o50b16o$43b15o51b224o352b224o51b15o$42b16o50b225o352b225o50b16o$41b 17o50b224o354b224o50b17o$40b18o49b224o356b224o49b18o$39b18o49b225o356b 225o49b18o$39b18o49b224o358b224o49b18o$38b19o48b224o360b224o48b19o$37b 20o48b223o362b223o48b20o$36b20o48b224o362b224o48b20o$36b20o48b223o364b 223o48b20o$35b21o47b223o366b223o47b21o$34b22o46b224o366b224o46b22o$33b 22o47b223o368b223o47b22o$33b22o46b223o370b223o46b22o$32b23o46b223o370b 223o46b23o$31b24o45b223o372b223o45b24o$30b24o46b222o374b222o46b24o$30b 24o45b223o374b223o45b24o$29b25o44b223o376b223o44b25o$28b26o44b223o376b 223o44b26o$28b25o44b223o378b223o44b25o$27b26o44b222o380b222o44b26o$26b 27o43b223o380b223o43b27o$26b26o44b222o382b222o44b26o$25b27o43b223o382b 223o43b27o$25b27o43b222o384b222o43b27o$24b28o42b222o386b222o42b28o$23b 28o43b222o386b222o43b28o$23b28o42b222o388b222o42b28o$22b29o41b223o388b 223o41b29o$22b29o41b222o390b222o41b29o$21b29o41b223o390b223o41b29o$20b 30o41b222o392b222o41b30o$20b30o40b222o394b222o40b30o$19b31o40b222o394b 222o40b31o$19b30o40b222o396b222o40b30o$18b31o40b222o396b222o40b31o$18b 31o39b222o398b222o39b31o$17b31o40b222o398b222o40b31o$17b31o39b222o400b 222o39b31o$16b32o39b222o400b222o39b32o$15b33o38b222o402b222o38b33o$15b 32o39b222o402b222o39b32o$14b33o38b222o404b222o38b33o$14b33o38b222o404b 222o38b33o$14b33o37b222o406b222o37b33o$13b33o37b223o406b223o37b33o$13b 33o37b222o408b222o37b33o$12b34o36b223o408b223o36b34o$12b33o37b222o410b 222o37b33o$11b34o36b223o410b223o36b34o$11b34o35b224o410b224o35b34o$10b 35o35b223o412b223o35b35o$10b34o35b224o412b224o35b34o$9b35o35b223o414b 223o35b35o$9b35o34b224o414b224o34b35o$9b34o35b223o416b223o35b34o$8b35o 34b224o416b224o34b35o$8b35o34b223o418b223o34b35o$7b35o34b224o418b224o 34b35o$7b35o34b224o418b224o34b35o$7b35o33b224o420b224o33b35o$6b36o33b 224o420b224o33b36o$6b35o33b224o422b224o33b35o$6b35o33b224o422b224o33b 35o$5b36o32b225o422b225o32b36o$5b35o33b224o424b224o33b35o$5b35o32b225o 424b225o32b35o$4b36o32b225o424b225o32b36o$4b35o32b225o426b225o32b35o$ 4b35o32b225o426b225o32b35o$3b36o31b225o428b225o31b36o$3b35o32b225o428b 225o32b35o$3b35o31b226o428b226o31b35o$2b36o31b225o430b225o31b36o$2b35o 31b226o430b226o31b35o$2b35o31b226o430b226o31b35o$b36o31b225o432b225o 31b36o$b35o31b226o432b226o31b35o$b35o31b226o432b226o31b35o$b35o30b227o 432b227o30b35o$35o31b226o434b226o31b35o$35o31b226o434b226o31b35o$35o 30b227o434b227o30b35o$34o31b227o434b227o31b34o$34o31b227o434b227o31b 34o$34o31b227o434b227o31b34o$33o31b228o434b228o31b33o$33o31b228o434b 228o31b33o$33o31b228o434b228o31b33o$32o31b229o434b229o31b32o$32o31b 229o434b229o31b32o$32o30b230o434b230o30b32o$b30o31b230o434b230o31b30o$ b30o30b232o432b232o30b30o$b30o30b232o432b232o30b30o$b29o31b232o432b 232o31b29o$b29o30b233o432b233o30b29o$2b27o31b233o432b233o31b27o$2b27o 30b235o430b235o30b27o$2b27o30b235o430b235o30b27o$2b26o30b236o430b236o 30b26o$3b25o30b237o428b237o30b25o$3b24o31b237o428b237o31b24o$3b24o30b 238o428b238o30b24o$3b23o31b239o426b239o31b23o$4b22o31b239o426b239o31b 22o$4b21o31b240o426b240o31b21o$5b20o31b241o424b241o31b20o$5b19o31b242o 424b242o31b19o$5b19o31b243o422b243o31b19o$6b17o32b243o422b243o32b17o$ 6b16o32b245o420b245o32b16o$7b15o32b245o420b245o32b15o$7b14o33b246o418b 246o33b14o$8b12o33b247o418b247o33b12o$8b12o33b248o416b248o33b12o$9b10o 34b248o416b248o34b10o$9b9o34b250o414b250o34b9o$10b7o35b250o414b250o35b 7o$10b7o35b251o412b251o35b7o$11b5o35b253o410b253o35b5o$11b4o36b253o 410b253o36b4o$12b2o37b254o408b254o37b2o$12b2o37b254o408b254o37b2o$50b 256o406b256o$50b257o404b257o$50b257o404b257o$49b259o402b259o$49b260o 400b260o$49b260o400b260o$49b261o398b261o$48b263o396b263o$48b36o2b225o 396b225o2b36o$48b36o3b225o394b225o3b36o$48b35o5b225o392b225o5b35o$47b 35o6b225o392b225o6b35o$47b34o8b223o394b223o8b34o$47b34o9b222o394b222o 9b34o$47b33o11b220o396b220o11b33o$46b33o13b219o396b219o13b33o$46b32o 14b218o398b218o14b32o$46b32o15b217o398b217o15b32o$46b31o17b215o400b 215o17b31o$45b31o19b213o402b213o19b31o$45b31o20b212o402b212o20b31o$45b 30o21b211o404b211o21b30o$45b29o23b210o404b210o23b29o$44b30o24b208o406b 208o24b30o$44b29o26b207o406b207o26b29o$44b28o28b205o408b205o28b28o$44b 28o29b204o408b204o29b28o$43b28o31b202o410b202o31b28o$43b27o32b202o410b 202o32b27o$43b27o33b200o412b200o33b27o$42b27o35b199o412b199o35b27o$42b 26o37b197o414b197o37b26o$42b26o38b196o414b196o38b26o$42b25o40b194o416b 194o40b25o$41b26o41b193o416b193o41b26o$41b25o43b192o416b192o43b25o$41b 24o45b190o418b190o45b24o$41b24o46b189o418b189o46b24o$40b24o47b188o420b 188o47b24o$41b23o48b187o420b187o48b23o$42b21o50b185o422b185o50b21o$43b 20o51b184o422b184o51b20o$43b19o53b182o424b182o53b19o$44b18o54b181o424b 181o54b18o$45b16o56b180o424b180o56b16o$46b14o58b178o426b178o58b14o$47b 13o59b177o426b177o59b13o$48b11o61b175o428b175o61b11o$49b10o62b174o428b 174o62b10o$50b8o64b173o428b173o64b8o$51b7o65b171o430b171o65b7o$52b5o 67b170o430b170o67b5o$53b4o68b168o432b168o68b4o$54b2o70b167o432b167o70b 2o$55bo71b166o432b166o71bo$128b164o434b164o$129b163o434b163o$130b162o 434b162o$131b160o436b160o$132b159o436b159o$133b158o436b158o$134b156o 438b156o$135b155o438b155o$136b154o438b154o$137b152o440b152o$138b151o 440b151o$139b150o440b150o$140b149o440b149o$141b147o442b147o$142b146o 442b146o$143b145o442b145o$144b144o442b144o$145b143o442b143o$146b142o 442b142o$147b141o442b141o$148b140o442b140o$149b139o442b139o$150b138o 442b138o$151b138o440b138o$152b137o440b137o$153b136o440b136o$154b135o 440b135o$155b134o440b134o$156b134o438b134o$157b133o438b133o$158b132o 438b132o$159b131o438b131o$160b131o436b131o$161b130o436b130o$162b129o 436b129o$163b129o434b129o$164b128o434b128o$165b127o434b127o$166b127o 432b127o$167b126o432b126o$168b126o430b126o$169b125o430b125o$170b125o 428b125o$171b124o428b124o$172b124o426b124o$173b123o426b123o$174b123o 424b123o$175b122o424b122o$176b122o422b122o$177b122o420b122o$178b121o 420b121o$179b121o418b121o$180b120o418b120o$181b120o416b120o$182b120o 414b120o$183b119o414b119o$184b119o412b119o$185b118o412b118o$186b118o 410b118o$187b118o408b118o$188b117o408b117o$189b117o406b117o$190b117o 404b117o$191b115o406b115o$192b114o406b114o$193b112o408b112o$194b111o 408b111o$195b109o410b109o$196b108o410b108o$197b106o412b106o$198b105o 412b105o$199b103o414b103o$200b102o414b102o$201b100o416b100o$202b99o 416b99o$203b97o418b97o$204b96o418b96o$205b94o420b94o$206b93o420b93o$ 207b91o422b91o$208b90o422b90o$209b88o424b88o$210b87o424b87o$211b85o 426b85o$212b84o426b84o$213b82o428b82o$214b81o428b81o$215b79o430b79o$ 216b79o428b79o$218b78o426b78o$219b78o424b78o$220b78o422b78o$221b78o 420b78o$222b78o418b78o$222b79o416b79o$223b79o414b79o$224b79o412b79o$ 225b79o410b79o$226b79o408b79o$227b79o406b79o$228b79o404b79o$229b79o 402b79o$230b79o400b79o$231b79o398b79o$232b79o396b79o$232b80o394b80o$ 233b80o392b80o$234b80o390b80o$235b80o388b80o$236b81o384b81o$237b81o 382b81o$238b81o380b81o$238b82o378b82o$239b82o376b82o$240b82o374b82o$ 241b82o372b82o$242b82o370b82o$243b83o366b83o$244b83o364b83o$245b83o 362b83o$246b83o360b83o$246b84o358b84o$247b85o354b85o$248b85o352b85o$ 249b85o350b85o$250b85o348b85o$251b85o346b85o$252b86o342b86o$253b86o 340b86o$254b86o338b86o$255b86o336b86o$256b87o332b87o$257b87o330b87o$ 258b87o328b87o$259b88o324b88o$260b88o322b88o$261b88o320b88o$262b89o 316b89o$263b89o314b89o$264b89o312b89o$265b90o308b90o$266b90o306b90o$ 267b90o304b90o$268b91o300b91o$269b91o298b91o$270b92o294b92o$271b92o 292b92o$272b92o290b92o$273b93o286b93o$274b93o284b93o$275b94o280b94o$ 276b94o278b94o$277b95o274b95o$279b94o272b94o$280b95o268b95o$281b96o 264b96o$282b96o262b96o$283b97o258b97o$284b98o254b98o$285b98o252b98o$ 287b98o248b98o$288b99o244b99o$289b100o240b100o$290b101o236b101o$291b 102o232b102o$292b103o228b103o$293b104o224b104o$293b106o220b106o$294b 107o216b107o$294b109o212b109o$295b111o206b111o$295b113o202b113o$296b 115o196b115o$296b117o192b117o$297b119o186b119o$298b121o180b121o$298b 123o176b123o$299b125o170b125o$300b127o164b127o$300b130o158b130o$299b 134o152b134o$299b138o144b138o$298b142o138b142o$298b146o130b146o$297b 150o124b150o$297b154o116b154o$296b160o106b160o$296b164o98b164o$295b 171o86b171o$295b179o70b179o$294b187o56b187o$294b196o38b196o$293b432o$ 293b432o$292b434o$292b434o$291b436o$292b434o$293b432o$294b430o$295b 428o$296b426o$297b424o$298b422o$299b420o$300b418o$301b416o$302b414o$ 303b412o$304b410o$305b408o$306b406o$307b404o$308b402o$309b400o$310b 398o$311b396o$312b394o$313b392o$314b390o$316b386o$317b384o$318b382o$ 319b380o$320b378o$321b376o$322b374o$323b372o$324b370o$326b366o$327b 364o$328b362o$329b360o$330b358o$331b356o$333b352o$334b350o$335b348o$ 336b346o$338b342o$339b340o$340b338o$341b336o$342b334o$344b330o$345b 328o$346b326o$348b322o$349b320o$350b318o$352b314o$353b312o$354b310o$ 356b306o$357b304o$358b302o$360b298o$361b296o$362b294o$364b290o$365b 288o$367b284o$368b282o$370b278o$371b276o$373b272o$374b270o$376b266o$ 377b264o$379b260o$380b258o$382b254o$383b252o$385b248o$387b244o$388b 242o$390b238o$392b234o$393b232o$395b228o$397b224o$399b220o$401b216o$ 403b212o$405b208o$407b204o$409b200o$412b194o$415b188o$417b184o$420b 178o$423b172o$426b166o$428b162o$431b156o$434b150o$437b144o$440b138o$ 443b132o$446b126o$449b120o$453b112o$456b106o$460b98o$464b90o$469b80o$ 475b68o$481b56o$488b42o! golly-3.3-src/Patterns/Larger-than-Life/Globe.mcl0000755000175000017500000000301713125321675016572 00000000000000#MCell 3.00 #GAME Larger than Life #RULE R8,C0,M0,S163..223,B74..252,NM #BOARD 160x160 #SPEED 20 #WRAP 1 #CCOLORS 9 #D Globe #D #D Dense-enough to survive small starting patterns form circular #D shapes that resemble planets watched from spaceships. #D #D Mirek Wojtowicz, March 2000 #L 23.14A$17.14A6.AA$16.6A.6A..AA6.A$15.A.11A.5A6.AA$14.16A3.3A6.A$10.4A. #L AA.5A4.A.8A6.AA$10.3A.6A3.AA3.A..3A.A.AA5.A$9.AA..5A3.10A.4A..A5.A$8. #L AA..22A.3A.A4.A$8.A..30A3.A$7.A..18A3.16A$6.A..6A.7A3.3A..3A..5A.A.A.. #L A$6.10A.AA..A4.A..5A..A..4A.A..A$5.4A..7A..A4.A4.7A..4A.A3.A$4.AA.A.. #L AA.AA.A3.A4.A.AA.4A..A..4A.A4.A$4.3A3.4A.A3.A4.A.9A.A..A.AA.A4.A$3.4A #L 3.6A3.A4.3A.7A.A..A.AA.A4.A$..4A3.5A.A..A4.AA3.A.5A.A..A.AA.A4.A$..4A #L 3.6A..A3.3A3.8A.A..A.AA.A4.A$..3A3.7A.A4.AA3.9A.A..A.3A5.A$..AA3.7A.A #L 4.3A.5A.4A.AA..A.3A5.A$..AA..A.8A4.5A.8A.AA..A.3A5.A$.3A..8A5.A.3A.9A. #L AA..A.3A5.A$.AA..AA.6A4.A.3A..AA.5A..AA..A.3A5.A$3A..A.6A4.AA.A.A.3A.A #L .3A..AA..A.3A5.A$3A4.6A4.A.A.A..AA..5A..AA..A.3A5.A$3A4.6A4.A.A.A.A.5A #L .AA..AA..5A5.A$3A4.6A5.A.A.A.5A.A.A..A3.4A5.A$3A4.6A4.AA.AA.6A.A.A.AA #L 3.4A5.A$3A4.6A4.4A.8A..A.AA..5A4.A$3A4.6A4.10A.AA..AA.3A.4A4.A$6A.15A. #L 5A.A.AA.AA3.AA.A3.A$3A3.20A..A.A.AA.A3.A..A3.A$3A4.AA.4A.AA5.4A..4A3.A #L ..AA.AA..A$3A4.AA.3A.A..14A4.A.3A.A3.A$3A4.AA.A.10A3.3A..A4.3A..A3.A$ #L 3A5.19A..A..4A.A.AA3.A$5A3.A..3A7.11A..A.A..A..3A$..A.3A..A.A.3A3.AA3. #L A.3A4.A.A..4A$3.AA.21A5.A..4A$5.A.12A3.AA..10A.A$6.6A.A3.14A..A..A$10. #L 27A$11.A7.10A6.A$12.3A18.3A$15.3A12.3A$18.3A6.3A$21.6A golly-3.3-src/Patterns/Larger-than-Life/Majority.mcl0000755000175000017500000006721413125321675017351 00000000000000#MCell 2.20 #GAME Larger than Life #RULE R4,C0,M1,S41..81,B41..81,NM #BOARD 180x180 #SPEED 0 #WRAP 1 #CCOLORS 25 #COLORING 2 #D #D Many basic two-color CA rules can be thought of as voter models. #D Using our Vote palette, think of Blue=Democrat, Red=Republican. Majority #D vote is perhaps the simplest CA voting scheme: the occupant of each cell #D survey's a 'Mr. Roger's neighborhood' and decides to ally with the more #D popular opinion next time. In the present case, a range 4 Box has 81 #D cells, so each party needs 41 or more for a local majority. Note that we #D can view this and related threshold voting rules either as special cases #D of Larger than Life or as 2-color cases of the Cyclic Cellular Automaton. #D We choose the former interpretation for its better performance. #D #D So how does Majority Vote behave starting from a completely random #D initial state with equal densities of the two opinions? Press the Step #D button once to see massive self-organization in the first update, again #D to observe dramatic smoothing of the edges and a third time to see a #D two-color tessellation of the array with boundaries that appear #D continuous within the resolution of a range 4 discretization. Now press #D start to see convexification, and erosion of bounded regions, according #D to dynamics that approximate a continuous flow known as Motion by Mean #D Curvature (MMC). This process continues until the boundaries achieve #D uniformly small curvature, at which point the system fixates. For a #D better approximation to the continuous flow one must do Majority Vote #D with larger range. In the style of Riemann these CA approximations, #D suitably scaled, converge to Euclidean dynamics that cluster #D indefinitely. #D #D By keeping the range fixed at 4 but varying the threshold, you will #D discover an indication of two cutoff phenomena. For example, try #D thresholds of about 30-32, and about 55-57. Also, note the structure of #D the final boundaries for threshold 33. (To modify the present experiment #D you will need to figure out the proper LtLife settings corresponding to #D these parameter values...) #D #D David Griffeath #L 7.6A.7A.A..AA.A..A.AA3.3A.A..3A..A.A.A3.AA4.A..AA.6A3.A.AA..4A.A.A..AA #L 4.A5.3A.A.3A..7A.4A.3A3.A.A.A.A.A.7A.AA..AA.3A.A.A..A..A..AA$.3A.AA.3A #L .A3.A.A.3A.A.A..5A..AA.A5.AA.A3.A..A.3A..A..4A4.AA3.AA..A3.3A.3A.3A..A #L ..A.4A.6A3.3A..A4.3A3.A.AA.A..3A.4A.A.A4.3A.3A5.AA.A4.AA$A3.A.3A3.AA.A #L .AA..A..A..AA.A.4A3.A.AA3.AA5.7A3.3A.AA.AA..AA..A.A.A.A..3A7.A.A3.A5. #L 4A.A.A.4A..3A6.A4.3A3.AA.3A.A.AA..A.AA3.4A.A.A5.AA$4A.A.A5.A.AA..AA.AA #L .A.7A.A.A.AA..A4.A.A.AA3.A..3A.4A8.3A..A.A..A.AA3.A.3A..4A.A3.6A.AA.3A #L 3.A5.A.3A.A3.A.A.A.A.3A3.A.A.3A.A..3A.AA.3A.A.A$.A4.3A3.A7.A3.5A.A..3A #L .AA.A.A.A..AA.A..AA..A..7A.A.A.8A.A..AA.AA.3A.6A..AA..AA..5A.5A4.A.5A #L ..A.AA..A.A3.4A.A.A.5A.AA..AA3.A3.4A$A.AA.AA.AA.AA4.3A3.A.A.AA.6A.5A. #L 4A.AA.3A..A5.A.3A.3A..6A.A.AA.3A6.AA.A..3A.A.AA4.6A..5A.4A6.4A3.AA5.A #L 3.A..AA3.4A5.AA..3A.A$.AA.A.A.6A.A.A..AA3.A.AA.AA5.A3.4A..A..7A.AA.AA. #L 5A5.AA..A.AA10.AA..A.A3.A5.3A.3A3.5A4.6A..AA.AA.A.A.4A.A..A.A3.A.A.AA #L ..A$.3A.AA4.A.A.AA3.A.3A.3A6.AA4.A.5A..A3.AA.A.A.A..A4.A.6A4.5A.A.4A.A #L .A..AA.A.A..A.A..A.3A.AA6.3A..3A..3A.AA.AA..A.AA3.AA..A.6A.AA..A.A.AA$ #L A3.4A.A4.AA6.3A.A..A.6A.AA.A.A.5A.A..AA5.AA.AA.6A.AA.9A..A.A5.A..A.AA #L ..A.AA..3A..A..A.AA.A..AA4.A3.3A.AA.AA.A..AA.A..AA.AA.4A4.A.A..A.AA$. #L 4A4.3A3.A..3A.AA.A5.5A.A..AA..6A.A.3A.A.AA..3A..A3.A4.A.A5.A3.A.A.A.AA #L ..AA.AA..A..AA.9A4.3A..3A.AA.AA..A..A.6A4.AA..AA..A.AA..A5.AA$4.A.A.. #L 5A.AA.A.A8.4A3.3A.AA..A.4A.A.AA..A.AA.A.A..A.AA..A.AA3.A.A.4A.A.4A.AA. #L AA..A.A..AA..3A3.AA.A..3A3.A4.AA.A..A.AA.AA.A..A.A..A3.A..A..A.A..3A$A #L .AA.A..A.A..4A.AA3.A.A.AA4.A3.A.A.A..A.4A..3A4.A.4A..AA.A5.A.A.A.3A.5A #L ..A4.A5.A.4A.AA5.A3.3A.A.3A..A.AA4.4A4.A.AA..A9.A.3A.AA..AA$.A.AA.A.A. #L A.A6.A4.4A3.AA8.A.AA.A.4A.AA.3A..AA.6A.A.A..A6.A.4A.3A.7A.A.A4.A.5A.3A #L ..4A3.A.A.3A..AA4.A3.AA..3A.A.A..A.AA4.A5.A..A$.AA4.3A.A..A.3A.AA.A..A #L ..A.A..3A.A3.AA..A..A9.AA.6A3.3A..AA5.A.A3.3A.A.AA5.AA.A.3A.A.AA.A.A.A #L 3.A.4A3.9A.A3.5A.A..AA..AA4.AA..A.5A$3A.A.AA.AA.3A4.3A3.A3.3A.3A..A..A #L ..3A.3A.A.4A.A4.A3.A..A3.AA.A.AA4.A.A.AA.A.3A.A.AA.3A3.A.3A.8A6.AA.AA #L ..8A3.5A..3A..A..5A3.A..5A$A.A9.AA.11A.A3.A.AA6.AA.4A4.A.A.AA3.A.A.A3. #L A.A.5A.AA.A4.5A..A.AA.A.A..A.A4.A3.AA.A.A.5A..4A.3A.4A.A.A.A.3A..AA5.A #L 5.A.A.AA.A.A$.A..AA.4A5.A..A.A.AA..4A..3A.A.AA.AA..AA.A.A.A.A.A.AA.A.. #L 6A..9A..A.A5.3A3.A.A..4A..A6.A3.AA.5A3.4A.AA.4A4.3A..A..A3.AA.3A3.4A.A #L ..A..A$5.A.A3.A5.A..3A.A3.A.5A.AA.A.AA..A.A3.A3.A4.A.AA..A3.A3.AA.AA.A #L .5A7.A.4A..A.AA.A.A.A.3A5.AA.A..A..A4.AA3.AA.A.3A.A.A5.AA3.A3.6A.AA..A #L $..AA.AA..3A.A4.4A4.A.A3.8A.AA..3A.A..A..A..A3.4A.AA3.A.3A..AA.A.AA.AA #L 3.3A.A.A.AA.AA3.A..A.A3.A.4A.A..A.A.A.A..A..A.AA..3A..3A..A4.A.A..A4.A #L .A5.A$AA.4A..AA..A.AA.4A..AA5.AA3.A4.A.A..3A.A.A.8A.A3.AA..A..A..A.A.. #L 3A.A.A..A5.A.A.A3.AA..A.6A.AA..AA.A3.AA6.A3.AA4.AA..A.A.A..7A.A.A.3A. #L 3A.AA$..A.AA..AA..A..A.5A.A.4A..5A.A.A.AA.AA.3A.7A3.4A.A.A.4A.A.A.3A.A #L .A3.A6.AA.A.A.4A.4A.A9.A..A.4A.AA..A..A.AA.A.AA.A..AA.AA.A.A.AA4.AA.A. #L A..3A$3.AA.A3.A.A.AA.3A.A.AA.AA.A.A.A..A..A3.A..A..4A4.A.A3.A..A4.A.AA #L .AA4.A6.A3.3A.A.AA..A.3A3.5A.A3.A3.A.A.4A..A.AA..A..4A3.AA.A.3A.3A.A.A #L .AA3.A3.A.A$A.3A6.6A.A.AA.AA11.3A.3A.AA..3A4.A.A3.4A..AA..A.4A3.A..3A. #L 5A.4A.A5.A.A..A..A.A..A.5A4.A..A.AA3.AA..3A.AA5.A3.A..5A3.AA.A3.5A$AA. #L A..A.A..A.AA..A..A.AA.AA.A.A.3A.A.A3.AA.A.A.AA..AA.6A.AA..A.AA.A.A.A. #L AA4.A..5A5.AA..A3.A.AA..AA4.A7.A6.A4.A.AA6.A.A.7A3.AA3.A4.3A.A.3A$3.A #L 4.A7.A..A3.AA3.3A..A.AA.3A.6A..A..AA5.A.A.A.A..A..AA..A..A5.AA4.A.A.3A #L ..AA.AA.A.4A.A.A.A3.AA4.AA..AA..3A.A.A.A5.AA5.A..AA.A.A.3A.AA.A..A.AA$ #L ..A.A.A9.AA.5A.A.A.A..A.AA3.3A.3A.4A3.4A.A..A.4A.AA.10A.A.AA.5A3.6A..A #L .A..A.3A.A.3A.AA.A.AA3.A.A.A.A3.5A.A..3A.3A.3A.A4.A..A..A.4A$A4.A12.3A #L .A.A..3A.AA.4A.3A..A.4A10.3A.AA.AA..AA..AA.5A..AA..AA..4A3.5A3.A.3A3. #L AA.A..A.A.4A..A.A.3A.AA7.4A.AA..A..A4.3A.A.3A.A$A.3A.AA.AA3.A.7A5.A.. #L AA..A..AA.A..A.A..A.5A.A..AA.3A..AA.A..AA5.A.AA..A.4A..3A.AA..A5.7A.A. #L A.A.A.A..4A..A..A3.A.3A.AA.AA.3A..A.5A3.4A..A..A.A$A..A3.AA.A.3A4.AA.A #L .A..4A3.AA.3A.AA3.A.4A3.6A.A..5A..A.A..6A..AA5.A..A.3A.6A..AA..A..4A. #L 3A3.AA.5A5.AA3.A3.5A3.A5.AA..A.A.6A..A$..A..AA3.AA.A.3A.3A.4A..AA.A.A #L 3.A..4A3.A.A.AA.AA..A..AA4.A..AA.3A.A.A.3A.A.3A.5A.3A.AA3.3A.A.AA..A.. #L AA.A.A..A.AA..3A.4A.AA.AA.A.3A.A..4A..A.A.A.3A.5A$3A.4A.5A4.3A.A.A3.A #L 3.AA.5A5.AA3.AA.A3.AA..A..4A.10A3.3A.A..4A..AA.A..A3.A.AA..A.3A.A6.A5. #L AA.3A.AA.AA.AA..A.A3.A..AA..3A..AA.A..3A..A.AA$A..5A.3A..A.A.AA.4A.AA #L ..A3.A..3A3.AA.A.A..A.3A5.A.A..A..10A.3A.A4.3A.AA.A.A.AA.AA.AA..A3.A.. #L AA.A..A..A.A.A3.AA..A..A..A..5A..A.3A.AA..4A3.AA.A.AA$A..4A..3A..A.A.. #L AA6.4A..A..A..AA..3A.A.3A.A..A.A.A.A..3A..AA..4A.5A..A7.A..AA.A.A..4A #L 3.AA.AA3.AA.A..AA4.A3.A.A.AA.3A.A..A.AA.AA.AA.A.A3.4A..A.A3.A$A.A..AA. #L A3.3A..A.A.3A..AA..11A.AA..A.A..A..A.3A.A3.A..4A.3A.AA..AA.3A.AA..A.A #L 3.A4.A3.3A.A.A3.A3.5A11.AA.A.AA..3A..AA.A..3A4.A.4A3.AA.AA.AA$3A..6A. #L AA.A3.A.A..A..A.3A3.3A.3A6.A..A7.A.9A..A.AA4.A5.3A3.AA.A..A5.AA.AA..3A #L .AA3.A..3A.A.AA3.3A.A..A.3A.6A4.A9.5A.AA3.A$3.AA.AA5.8A.AA.A8.A.6A4.AA #L 5.A3.A.A.A..AA.AA.A4.A..A.AA.5A4.A.A3.4A..A.3A3.3A4.A.AA.4A..A..4A4.AA #L ..A5.A.9A..A..A.A..A6.A$A.A10.A.A.AA.4A..AA.AA.A.A.AA.AA3.A.A.A4.AA3.A #L .9A4.AA5.A..A4.A5.5A..AA4.A6.4A..A.A.AA..AA.3A.AA.AA..AA.A.5A.A3.AA.A. #L A..A4.3A.AA$..AA.5A..A.AA.3A.A..AA..A.A..4A..A.A.3A.A.3A.A.A..A.A3.A.A #L 3.A4.3A..A.AA..A3.4A.A3.AA.A5.A.A.A.A..4A4.3A.A3.AA3.AA4.4A.3A5.3A5.AA #L ..3A..A..A$A.3A.A.3A.AA.4A.3A..AA3.A3.3A..A.A..A..AA.A.A5.AA..AA3.5A.A #L ..3A..AA4.A5.A3.A.A.AA..3A..AA3.3A.A3.AA5.AA3.A5.A.A3.A.AA.A4.AA10.AA. #L A.AA..AA$A.5A..AA..A4.8A..A7.AA.AA..A.A..AA5.A4.4A5.3A..AA.A.A5.A.A.. #L 7A.5A3.A3.3A..A.A.3A.AA4.AA3.A3.9A.A.A..5A.A.3A.3A8.3A$3.AA.AA.AA3.A3. #L AA.3A.A.5A..A4.3A.5A3.A..5A.AA.A..4A4.A..4A.A..A..A.4A3.A..A.A.AA.A3.A #L ..AA..A.AA.AA3.A.6A.5A..A..A.4A..A..3A.3A.A3.10A$A.AA.A.4A.6A.5A..A.AA #L ..3A..A..A..A3.A.4A5.AA..AA.A3.3A.A.AA3.AA3.A..A3.A.A.AA.AA4.AA.A..A5. #L A..AA.A..3A3.AA3.A.7A3.A.A.AA..A..A.4A.A.4A.A.AA$4.A3.4A.A6.A.AA.A..AA #L .A.A.A.3A..AA.A..A4.4A.AA..3A.AA..AA.AA.A.A.AA..AA..A.A6.A.A.AA.A6.A.A #L 4.AA5.A.AA.3A4.3A.AA.5A3.A5.A.A..3A.A3.3A.AA..A$.3A..6A..AA5.A.3A.A3.A #L .AA.A.A.4A.4A6.3A..AA..A..AA..A.A..A.A.6A3.6A5.AA.A.A.3A.A..A.AA.3A.A #L 4.4A..AA.A4.AA.AA..A.AA.7A.A.3A.A3.A3.AA.A$5A.A.A.A.AA..A.3A.A.A.AA3.A #L 3.4A..4A..A..A4.AA..AA..A..A..3A.A.AA.A3.AA..3A4.AA.A.6A..3A6.A..A.AA. #L 3A4.3A.3A..4A.A3.A.3A.3A.A4.A.AA..A.4A3.AA$..A5.5A.A.AA3.A.A.3A.A.AA3. #L 4A..AA.A7.A3.3A..A.A3.AA3.A..AA.A..A.AA..A.AA..A3.A.A.A..3A.A.AA.A4.A #L ..AA.A..3A..AA..A.AA.A.3A..4A8.A6.A4.3A3.A$4A7.AA.A4.AA.6A.AA.4A6.AA3. #L A.A..A.AA..A..AA.AA..3A7.A..A.3A6.A..A..3A.A.A.3A.A4.4A.AA9.AA..AA..A #L ..5A3.A..5A9.3A3.4A$9.A4.3A..A.4A..A.3A.A.A3.A.AA3.AA.A4.A.AA.A.AA..3A #L 3.A.A3.A..4A.AA.AA.3A.A.AA.AA.A.A.A3.A.3A.3A5.3A.A.AA3.3A.4A5.A.A..A5. #L A.5A.A.5A.A$..AA.6A.A.AA.A..5A3.A.A.3A.4A.A..A.A.AA..3A.AA..AA.AA3.A. #L 4A.6A5.A3.A.4A.6A..A..3A.A.3A..A5.A.AA..3A.4A3.A..4A..AA.A..A.AA..A.. #L 5A.A3.A..A$..A.3A6.A.A3.A..A..A.A..A.A3.4A.A..A..3A..AA3.4A.4A.A..A.3A #L 3.A.AA.A.4A.AA.8A..A3.A.AA.3A..AA4.AA..A.3A..5A.A7.3A3.10A4.4A..A$A..A #L .A5.A.AA.3A.A.A7.AA..A.A..6A.AA..A.A3.AA.A.A3.5A.AA..A..A.3A.AA3.A3.A #L 3.4A.5A.A3.AA..A.A3.A.A.A5.A.AA..AA.AA..AA..3A..5A.A.A.AA8.AA$3.A..A5. #L AA.A.A.4A3.AA..A.AA..AA.A.A4.A..A.A5.A.AA.AA.5A.A..6A..A4.AA3.A.A.A.AA #L .AA.A5.AA3.A..AA6.3A..AA.A..A.A..A3.7A3.A..A..A3.A..AA.AA3.A$3.A.AA4.A #L ..A.AA.3A4.A.A.A.3A.AA4.A.A..A.A.A4.3A5.A.AA4.A.4A.AA3.3A3.7A.A.A3.A. #L 5A.A..A3.A.AA..A.AA3.3A..A3.3A.AA..A.AA.4A.6A.AA.5A..AA$3A3.A.A.3A.AA #L 4.A.AA..AA..A5.AA3.A.A.A..AA4.A..A.6A.A6.A..3A.A.A3.A..3A.3A.AA3.A.A. #L 3A..3A..AA5.AA..AA3.5A..A.A8.A4.AA.A.A..A..A..A.A3.A.A.A$..A3.A..3A4. #L 3A.A.AA.A.A3.AA.A.A.4A.AA..A5.4A.A.3A3.4A.A5.A.A..3A..A..A.A.A3.AA.A.. #L A3.A..AA3.A..A4.3A4.A.A..A.AA..3A..AA3.6A.AA..A.A.3A.AA4.A.A$.A..A.A. #L AA..A.A.A3.A4.5A.A..A.A.A..AA.AA.9A.AA.A.3A.AA.A.5A3.4A..AA.5A.AA3.AA #L ..A.4A4.3A..AA..A..3A.4A..3A..4A.A.AA..A.3A3.A..A.5A.4A4.A$..3A.3A.A.. #L 5A..AA7.AA6.A.A.3A3.A.AA3.4A..A9.AA..AA..4A..AA..AA.AA.AA.A.4A..A.A3. #L AA3.5A.A6.A.5A..AA4.A..A..3A.3A3.A..AA..3A.A.AA..AA$..AA.A4.A.A..AA..A #L .A..AA..3A.9A.7A.A.AA3.A3.AA3.A.AA..A.6A3.3A..AA..A.A.4A..A.3A..A3.A.. #L A5.A3.A..A3.9A3.3A4.A.A..AA.AA3.AA.4A3.A.3A$3A.A..3A.A10.A6.3A.A.AA.4A #L 4.A.3A.A.A.A..A.AA..A.A.A..A..AA..AA.A4.A.4A.AA..AA4.AA.A.6A..AA.A4.AA #L .A..A.A.AA..A..A3.AA.AA..A.A..AA3.A.AA..A.5A.A.A$.A.A.AA.A.5A4.4A.A..A #L ..A5.A5.A..5A5.A..A.AA..A.A.4A..AA..A3.AA5.A.A.4A3.A.A..3A.A.AA.A..A. #L AA3.4A.6A3.7A..AA.AA.6A..AA3.A.A..A.A3.A.A$6A.A3.AA3.4A3.A.AA6.5A.AA. #L AA..AA.A.A..8A..A3.A.A.A3.3A5.3A..3A.AA..A.7A.A..3A..A3.AA..A.3A4.AA.. #L 4A.A.AA..3A3.AA3.3A.AA.AA..A.A.A.3A$4.7A.AA.A.A5.AA..AA4.AA.3A..A..AA. #L 3A4.A..AA..A..AA.AA..A4.4A.A5.A.3A3.A.A.A.AA.A.A.3A.A..3A..A..AA.AA.3A #L ..A..7A..A.AA5.A.A5.A.A.A.A.A3.3A$.A..A..A..A.5A.A.3A4.4A..AA..4A4.A5. #L 4A.AA..A.3A..A..A3.A4.A..3A.AA.5A..A.AA.AA5.A.AA.A.AA5.A.3A.A.A.A..A3. #L AA..A.AA..4A.3A.A.AA8.4A..A.A$AA.3A3.A4.3A4.AA.AA..3A6.A.5A.A..A.A5.A. #L A.3A.AA3.AA..A.A..3A.AA3.AA.3A..3A.A.AA..3A.A.A.A5.4A..A.6A..3A.A3.AA. #L AA..A..A.A..A4.3A4.AA3.A3.A$3.A3.A..A4.AA.A.A.A..A3.AA..4A.A.A.A..9A.A #L 4.AA.A.3A3.4A3.A..AA3.AA8.A.AA10.4A..A.AA..3A3.5A.A.A..AA.3A..3A.3A.5A #L .A.A.AA5.3A$A.A..A3.4A.3A8.A..A.AA.3A.3A..AA..A..A..A5.AA5.AA3.3A..AA. #L AA..A..A.A.4A9.A..3A.A.AA.A.3A..AA.3A.AA..A.AA3.A4.5A.3A.A.A3.3A.AA.A #L 3.A..AA..A$.AA.A.AA..3A4.AA.AA.AA..A.A.AA..A3.A..A..A..A3.3A..AA.4A.. #L 3A..A.A6.AA..A3.A7.AA..AA3.AA.A.AA..A..4A.A5.AA.A..A.AA.AA.A3.A3.A..AA #L ..AA3.A3.3A3.A4.AA$.A.A..A5.A.A..A4.A.A3.A.A.AA.AA.3A.3A4.A3.AA3.AA..A #L 3.A.AA4.A4.A.A4.A.3A..4A..AA.A.3A..A.4A..AA..6A.9A.AA..AA.A3.A.AA3.A. #L AA.4A.A..A..A.5A$A.A3.A.A.AA..AA3.A.AA7.A3.A.5A..A..A.6A..A.A.A3.3A.AA #L ..A..A.AA..3A..AA.AA.A.A.AA.AA..AA.A.A5.AA..AA3.A4.A3.A5.AA..A.A..A3.A #L .A..A.A.A.AA.AA5.A..3A.A$.AA.5A.3A.A.A..A.3A.AA.AA.A.5A.A.AA.A..AA3.A #L 3.3A..A..A3.A.3A..AA3.A.4A4.A4.AA5.A.AA.A.A3.AA3.10A.A..A..A.A.A4.A.AA #L 3.AA3.AA.A.3A.AA.A..AA.A..A.A$3A5.AA.A.3A.A3.A.A..3A5.AA.3A3.3A.AA..3A #L ..A.A4.4A3.A..A4.A4.A3.AA5.A6.A3.5A.AA..AA..A6.6A7.A4.3A.A.AA.4A.3A..A #L 3.A.A.6A.AA$..A.3A.A.A.5A.4A.A.A.3A..AA..AA4.A.AA4.A.3A..A..AA5.3A..A #L ..AA.A.A.3A.AA.AA.A.A.A4.A.A..AA.3A5.3A.A.3A.AA..AA.AA3.A.AA5.5A4.A..A #L 3.A.3A4.3A..A$.A..A5.A4.AA4.A..A.A..A.AA.4A.3A6.6A4.5A..3A.AA..AA..AA #L 3.4A.A..AA.AA.4A.3A.4A..A.AA3.4A..A.A5.AA..AA..A.A.AA.A.AA..A6.4A.4A.. #L A6.A$A..4A.4A.A.3A.4A.AA4.A..AA5.AA4.5A.A4.A.6A..4A..AA.AA.AA.A.3A..AA #L ..A.AA..AA..A.A..A..A3.A5.AA5.A.A.AA..4A.A.3A4.5A.4A..AA.A.A.4A..3A.A$ #L 3.5A.AA3.A4.AA..A4.AA3.AA.4A..A..A.AA3.7A4.A.A..A.A.A..AA.A..A.3A.AA. #L 6A.A.AA..AA.AA3.3A.3A.A.A.A..A.AA..7A..A5.A3.A3.A.AA.A..A.A..3A3.3A.A$ #L 4A.A6.AA..A.A3.AA.A.A3.AA.A4.AA.A.AA3.A.4A6.5A..A5.3A3.AA3.A.4A..AA5.A #L 5.A..A..A3.A.A.A.AA.AA.AA..3A..A.A.A.3A6.A.A.4A.AA4.A.A.3A5.A$AA.AA.A #L 5.A7.A.AA.5A..AA.3A4.A.AA.A4.A5.A5.AA3.4A.A.A.A..AA.6A6.3A4.AA..AA..A. #L A4.AA.A.A5.A3.4A.A.AA..7A.AA4.A4.4A.A.A.A.A.AA.A$.A..AA.A.A.5A.6A4.8A #L ..3A3.AA7.3A.A.A.AA.3A3.A..AA.A.4A.3A4.3A.A..A3.3A..A.A..AA.AA..4A..A. #L 3A.3A3.A3.A..3A..A.AA..A4.AA.3A.5A..A.A..A$AA3.A3.AA.4A..4A..AA..A..6A #L .A.AA.A3.3A.A.AA.A.A..A..3A..3A..A..4A..A.A.A.6A..AA3.AA.AA.A4.4A.A.. #L 3A4.A.4A4.AA.A3.A.3A..A.A3.A.A..3A3.7A.A.A$A..5A4.A5.A.A3.AA..AA.A..AA #L .A6.AA.3A..AA..A.A.A3.A3.A4.4A..A..A..A..A.3A3.AA3.3A.A.3A3.A..AA..A. #L AA4.AA.AA.AA3.3A.AA.AA.6A.7A.AA..4A.A.AA.A$4A..AA3.A.AA.A.3A.AA6.AA.. #L 5A3.AA..A.3A.AA.A4.A.A..4A4.3A.A.A3.A.AA..A4.AA..A.A3.4A4.A..3A.AA..AA #L .A.A.AA.AA.5A.A.AA.A.5A.AA.A.AA.A.A.AA.AA.AA3.A$AA.3A.A.A.AA..5A4.AA6. #L A4.A.A3.3A..AA.AA5.3A.A.AA..3A..AA.A..A.A..A..AA.3A3.3A5.AA..A3.A3.AA. #L 3A.A.AA4.A..A3.A4.3A..AA.6A3.AA3.A..4A..AA$..A.AA8.A.3A.AA3.A3.A.A4.AA #L 3.AA..AA.AA.AA3.A..A3.AA4.4A..A.A.A..4A7.AA.A.A3.A.4A.AA.A..AA..4A5.A #L 3.A.A.AA.3A.A.AA.A3.A3.3A..3A3.AA..AA.A3.A$.AA.A.3A.AA..AA..A.A..A3.A #L ..3A..4A.AA5.A.AA4.A.AA.8A3.A4.AA3.6A4.3A.A5.AA.A3.A.AA3.A.4A..A..A.A. #L A3.AA..A..4A3.A3.AA3.A..3A3.A5.AA.AA$.A.4A.A.3A.A..AA.4A.A..A3.A..AA. #L 4A.3A.A4.AA.3A.4A4.6A.5A..3A.AA3.A.A.A.AA3.AA6.3A5.7A3.A..A..A3.3A.A.. #L AA..A..AA4.3A.A..A.A.A.AA..6A$.AA.3A.A3.A.A4.AA..A.A.A.AA.AA5.A..3A.5A #L .A.6A3.AA3.A3.A.A.5A5.AA.A5.AA7.4A4.A.3A.A4.A.AA.AA3.A.A.A.6A.A.A.3A4. #L AA.A5.A3.A.4A..A$AA.A.4A3.3A..A..AA..AA.A..AA..A..3A3.A.A3.AA.A..A.A3. #L A.A..A..A..AA.3A4.A..A..AA5.AA.A3.A3.AA4.A.4A3.AA.A.A..5A3.A..7A.A.A. #L AA6.A.AA.A.AA3.3A$A3.AA.A.4A3.AA4.A.A.A3.A.A.AA.5A.AA3.3A3.A.3A..3A3. #L AA.A4.A.AA.AA5.A4.3A.A..A.AA.9A..A..3A.A.A4.AA4.3A..A5.AA..AA.A.3A.4A #L ..A3.A..6A$3A..3A.AA.A.AA3.3A.A..AA4.3A3.AA.6A.A.6A4.4A.A.A3.A..A3.3A. #L A4.5A3.AA7.A..AA5.A.AA..3A.A..A.3A.AA.AA.A3.AA.AA..A..A.3A.6A..AA.A3.A #L .AA$A..A.AA.A..3A..A.3A3.3A4.A.AA..3A3.AA.A3.AA.3A.AA.A4.A.AA.5A.A.A4. #L 3A.AA.A.A4.A.3A..A3.A.A.A.A.AA.10A3.6A5.3A.A3.A3.A5.AA.A.AA.A.4A.A.A$ #L AA..4A.A..A.3A.A..4A.AA.3A.A..3A.6A..A.A3.A4.A.AA.3A.AA.A3.AA.3A3.AA.A #L 3.A..A.A..A.A.3A3.6A3.A..4A.A.A.AA.A.AA.A.AA.A.A8.A.3A9.A..3A..A.A$A. #L 7A3.A..8A.3A.A.AA..A.A5.A.AA..AA.3A.AA.4A3.A..4A4.A..AA.A.A.6A.A.A..3A #L .AA.4A.A..A..AA.4A.A3.A.3A.5A.AA3.AA.AA3.A.AA.A4.A.6A.A4.AA$A..5A.AA.. #L 8A.4A..A.A.3A.A..A.AA..4A..5A.3A..AA.A.5A.A.A.4A.4A.A.4A.3A.A.3A4.AA.. #L A.A.4A3.A3.A.3A3.AA3.AA.A.A..A8.A.A..A..A.A6.A..A$A.A..AA..3A8.3A..4A #L ..A.A.A3.4A..AA..A3.A.A.AA3.A..A.AA.A.A3.A..A4.A.AA.A.A4.5A4.AA.3A.A.. #L A..AA..A..3A.A..A.A3.A..A..5A..A..5A.3A.4A..A.3A..A.A$AA4.A10.A.AA.3A #L 4.A.A.AA.4A3.AA..A..A.AA.A.A.A.AA.A..A.A.AA..AA3.3A..A..A4.A.AA.AA.A3. #L 3A7.6A.A..3A.AA.3A.A..A.A3.4A.A.A..3A6.3A..A.AA.AA.3A$3.A.AA4.A.A..A6. #L A.4A.A.A..A.3A5.3A.AA.A..3A.A6.A..6A..5A.AA.A.AA..A..AA5.AA5.AA.4A..A #L ..A..AA3.4A.A4.A.AA.AA3.4A..A..3A..A3.AA..A..AA.AA$A..AA..A.A.A.4A.5A. #L A3.A..A5.5A5.5A5.AA.A.3A..AA.A.A.A3.A.AA..3A.AA6.A.AA.A3.AA.A3.A.A.A4. #L 3A4.AA.A3.AA7.A..A..AA..AA..3A4.A9.5A$A.3A.3A5.5A3.AA..3A.AA.A..AA.A3. #L A..A.3A.AA.A.A..AA.3A.A.AA..AA..A.A4.3A.A.A.A..A3.A.A.3A3.A.5A.3A3.A3. #L AA..A.AA.A.A..A.A3.A3.AA.A3.4A.AA5.AA5.A.A$3.3A..AA.3A..A..AA..A.A..AA #L .A3.AA..AA6.A.AA3.AA..A.3A4.AA..4A.A4.3A..4A.3A3.AA..3A5.A3.A5.3A.A3.A #L ..6A..AA..A.AA3.AA.AA.4A.A3.A..A.A5.3A$..AA.A.A..3A.A..AA3.A.A3.5A..A. #L 3A.A..AA..3A.3A..4A.3A5.A.AA..A.A.AA.A..A.A3.A6.AA4.3A4.3A4.A.A.5A.3A #L ..3A3.A..4A..4A..AA.A..A.A.3A..AA..AA.A$3.A3.3A..8A6.A.A.A.AA5.AA.3A3. #L AA.AA.3A3.A3.AA.A3.5A3.A.AA.A3.A3.A..4A.AA.A.A6.A4.5A..A3.A..AA.4A6.AA #L .A5.A.AA4.3A.A.AA.AA.A..A$..3A.A.A5.4A6.3A3.A3.A.4A.A.A3.A3.A.AA.AA3. #L AA.A.A.A..3A..A.A..3A6.A..A4.A..A.A..AA.A.A..3A.A.A4.AA5.A4.A4.A.AA.A. #L AA..AA.3A.AA..A4.AA..A.3A.A$.A..4A.A.AA.AA.3A.A..A3.A.4A.AA.A.AA4.7A.. #L A.AA.3A..3A..A..A..AA.AA.3A.3A..A7.A.5A.A.6A4.3A3.3A.5A3.AA3.6A..3A..A #L ..A.A3.A.3A3.AA.5A$.A.A.AA3.AA5.A4.3A6.3A.AA..3A5.A..3A.A3.3A..AA..A5. #L AA..A3.A..A..AA.AA..A.AA.A.3A3.4A.A4.AA.AA.AA3.A.A3.A..AA.A.AA.A4.A..A #L .6A..A.A..A..A.A3.AA$3A..AA.AA..3A4.A.A.AA4.AA.A.3A.AA.6A..A.A.4A.6A4. #L 3A.A..A3.A6.A.A..4A.A.A.AA5.A4.A.AA.A..4A..AA..A.4A3.A.A3.A.A..A..AA. #L 3A.4A.A..A.A..5A$.A.AA.AA.A3.A.A.A4.A3.AA..A3.A.4A.A.AA3.AA.3A3.5A.A.A #L ..A.A3.A..3A3.A4.3A3.A5.AA.AA.5A3.3A.A.A.A4.A.A.AA..AA.5A3.AA.4A4.A.AA #L .4A3.AA3.A.4A$.A.A.A..AA4.AA.A..5A.AA.4A.3A.A.4A3.AA3.AA..A.A..A4.A.4A #L .AA.A.A4.A..AA.A..6A..A..A..AA5.A.A.3A.AA.AA.AA.AA.A6.A..A.AA.AA.AA3. #L AA..AA..AA.AA3.4A.AA$.4A..A.A3.A.AA.A.5A..A..AA.A8.AA5.7A3.A.3A..A..A. #L A.AA.6A.AA.AA.A..6A3.A..4A.7A.3A.3A.A..A..AA.4A.3A.A.AA..A..A.A.A3.A.. #L AA..A.A.AA3.4A$..5A.3A3.AA.AA.A..5A.A.A3.A.3A3.AA.AA.3A6.A.3A4.A..AA.A #L .3A7.4A4.AA.A.4A.A.3A..AA..A.A..AA3.A3.3A.A.AA3.A.A3.A.A.A.A..A..AA..A #L ..A3.A6.AA.A$AA.A.8A.A3.4A..4A.AA..A.A.A.3A.A.3A3.A3.AA.A.AA.A.7A.3A3. #L 4A..A3.4A4.A.A.4A.4A3.5A3.A..A3.A.A4.4A..3A4.3A.3A3.3A.AA.AA.A..AA.A. #L 4A$AA.AA.3A.3A3.AA.A4.A.A3.A..AA3.4A.AA.AA4.A.AA3.5A..AA4.AA3.A..A3.6A #L ..A.AA3.A..4A.3A3.AA4.A.AA3.A.3A..A.A..AA.AA5.A.AA..3A5.A.A..A.A.AA.AA #L ..A$5.A.AA4.A.A.3A3.A.3A.AA.A3.A.5A..A.A.AA.AA.A.AA..AA.A4.AA.3A.A4.AA #L ..AA..A.4A.4A.4A..A.AA.A.A3.A.AA3.AA3.AA.4A..A.A.6A..AA.3A3.A3.A..AA. #L 3A3.A$AA..A..3A..AA..AA.A..A3.A.A3.4A5.3A.A3.AA.3A..AA.AA..AA.A..AA..A #L 7.4A..A3.A.A.AA..A4.AA.AA.5A..3A.3A..AA.AA..4A.4A.AA3.A.4A.5A..AA3.A.. #L AA..AA$6.A3.3A.A.A..AA3.A5.A.A..3A6.A.6A.3A.A.A..A.4A.A..3A4.A4.3A3.3A #L 6.AA..4A3.3A.3A..AA.A..AA.A3.A..A.A.AA..7A.A..3A..A3.4A3.AA.AA..A.A$5. #L 4A.A..A.3A3.A.AA..5A4.AA..A..A.AA.AA.AA..AA.A..A.A.A.3A.A.A..5A.6A3.AA #L .A.A.AA.A.5A6.AA.A..A..AA5.A.AA.AA..A.A.A.A..A.A..A.A..A.5A..A3.AA.A$. #L A3.A3.A.A.AA.AA.A.A.A.A.7A.4A..AA.AA.3A..3A3.A3.5A3.A.A.A.AA.3A..AA..A #L .4A..3A..3A6.A4.A.3A..A.AA.A4.AA.AA.AA5.4A..A.A4.3A.A.3A3.AA..A4.A$..A #L .A.A5.AA..5A6.AA5.A.AA4.A3.A..A..3A4.A3.A3.AA.A.A.4A6.AA.AA5.AA.A3.5A #L 6.AA.4A..3A..A4.6A.3A4.A.A3.A.A..3A.3A3.4A3.A3.A$AA3.AA.A3.A.AA.3A.A4. #L A5.AA5.A..6A.AA.A.A.A..AA.A..AA..4A6.A3.A.A.A..A3.AA.A4.AA..A.AA.A..A. #L 4A.A.A..AA5.AA.A.A..A4.A3.A5.A3.A.AA..A.A.AA..6A$.A5.A.AA4.3A.A.A.A.. #L AA3.A3.A.A.A3.AA.5A.AA.AA.3A4.A.AA.3A.A3.6A5.10A.3A.3A..3A.A..A.AA.A.A #L 8.A..AA3.A.A.A.A6.A.4A.A.A3.AA3.5A$..A.A4.6A..AA.3A3.AA4.AA3.4A.A.4A.A #L ..A.AA..AA3.3A.AA.AA4.AA.6A..A3.A.A.A.A.3A.9A3.A.4A.A.AA.A.A..A3.A.A. #L AA..9A..A..A..A5.4A7.A$.A3.AA.AA.A.A..A.A.A.A.A.AA..A7.3A.AA..A5.A.AA #L ..3A5.6A.A.A..A..3A.7A..A.6A.A.4A.A.AA.A.7A.AA.3A3.3A.A.A..4A3.A..A.5A #L .3A.4A3.A..A$A.AA.AA.AA.A.AA.3A..A..A..AA.3A.A3.A.A..A..A4.AA.A..3A3.A #L 6.A.3A..3A.A.A.A..3A.A3.3A.A.3A4.A.3A3.A..A.A.A13.3A.3A..AA.A8.AA4.AA #L 3.A.A3.3A$AA..A.6A.A.A.3A..AA.AA..A.A9.AA.AA..AA..5A5.AA7.A..A.A..5A3. #L A3.A.A.3A3.AA..3A..A.3A3.A4.A3.A..A.3A.4A..AA.A4.AA.A6.A..A.3A3.A.A.A #L 3.A$3A8.AA.A..A..A..A3.A3.A.3A.A.AA5.A.A3.AA.A.A.AA..AA..A3.3A3.A3.A.. #L A.A..3A.AA.3A.A..AA3.A..A.A..4A..A.A.AA.A.4A.AA3.AA4.AA..3A7.A.A.A.A.. #L 3A..A.AA$.10A.3A.A.AA..3A.A.A..AA.A.A..A.A.4A3.AA..A.A.A.3A..A4.A.A.3A #L .AA.A4.A..A.A..A.6A.A..AA.A..A..A4.AA..AA.3A.3A4.A.3A..A..A..A3.A3.A3. #L 3A5.A.AA4.A$3.AA..A5.A.AA.AA.A.A3.AA5.A..A..AA.3A..A3.6A..AA.A.3A..3A #L 4.A..A.3A3.A.A.AA4.A4.A3.AA.3A.A.3A.A4.AA..A..AA..A.AA..AA..A3.A4.A3. #L AA.A..A3.A3.3A.3A$A5.A.A.AA4.A3.A3.A.6A3.4A5.A4.A..A.AA3.3A.A..A.3A.A #L ..5A..AA.AA.AA.A.AA.AA.A.A.A..AA.A..A.AA.AA.A.A5.A3.3A.A8.AA3.AA.5A.A #L ..AA.7A.A.A.AA$..A.A4.A..A3.AA.A.AA.A.A.5A5.3A.A.3A..A.4A..A.4A3.AA.5A #L .3A.3A.A.A.AA..AA.4A.AA.A.5A..4A..A.3A.A3.A3.3A.A.AA..3A3.A.A..A.AA3.A #L ..A.AA4.A.4A..A$..AA.A.A.6A.AA.A..A3.5A.A..A5.A..A..A.3A.AA..AA.A3.A4. #L AA.A.AA.4A3.AA.A.A.A3.AA..A.AA.A..A7.4A.A3.AA4.A.A3.A.4A.A.AA5.AA..AA. #L 3A.A.A4.8A.A$..AA.9A.3A..4A.6A.6A.A..3A.A.A3.A3.5A.AA..A..A..A..A..6A #L 3.4A.3A..7A.4A.A.A.4A.AA.AA.3A.A.A..3A4.A5.A.8A.A..A..A.A3.AA..A.A.AA$ #L .A..AA.A4.A6.AA..A8.A.AA..A.3A..A.3A.4A..A..4A.A4.AA.A.3A.AA3.AA.3A.AA #L .A..A.3A3.A..A.A.4A.A..A3.A..A3.A..AA..A.A.5A..3A.3A.A.AA..6A3.3A3.AA$ #L .A.3A.A.3A.AA3.A.A..3A.A..AA6.AA.A.7A6.A.A.AA.AA6.A.AA.A3.A.5A.8A.3A. #L AA..A..AA7.AA.3A.4A.A.A.A7.3A..7A.A3.AA..AA.AA.AA.A3.4A$..A.A9.AA3.AA. #L A3.A..A.AA..A.A.AA3.A..AA..A.A5.3A4.A..AA.A.3A.A.A.AA..3A5.5A3.AA..AA #L 10.AA4.A.10A.A.A.AA4.A3.A..A4.AA3.A.AA.AA.AA.A..A$.AA4.AA3.A..A.A.AA.A #L .6A..AA.AA4.A..3A.A3.A3.A3.A.A.A.A.4A..AA.A..A..A3.AA..AA..AA.A3.7A.A. #L AA..4A..3A.A4.AA5.AA.A5.A.A..A.AA.AA..A3.A.A.A.3A.A.3A$AA.AA.A..A3.AA. #L A.A3.A3.A.A.A.4A.A.A.A.A.A.AA4.4A3.4A.A.AA.A.4A.A.A.3A5.AA6.AA.A.A..4A #L ..A3.AA.A.AA..3A.A..A5.4A.A..A.A.3A.A4.A.7A3.3A6.A$..A.3A.AA.A.A3.3A.. #L A.5A6.A3.A.A..7A.A..A.3A.A.3A.A.A.A.A.A.A4.A3.AA3.A.A.4A.AA.4A..A.3A4. #L A.AA.3A3.6A.4A.3A.A..A.AA..A5.A.A.AA.4A.A..5A$..A5.A.A4.4A..AA.8A4.A. #L AA.5A.A..AA.3A.3A..AA.A.A3.A.A..A.A5.A..AA.3A.5A.A3.A.4A3.5A3.AA..4A. #L AA.3A.AA..A.4A..A..A.4A.A.3A..A.A.6A..A$A.AA4.AA.AA.A5.A..A6.AA5.A..A. #L 3A.A..A6.5A3.A3.A.3A.A.A..AA5.4A.A.AA4.A.AA4.A.A7.A.A.A.AA.A.A.A.3A. #L 10A..AA.A.A.4A.AA..A.4A.AA3.AA.A$7.A6.A.A3.A4.A..A3.AA.A..5A.AA.AA7.A #L ..3A.5A..6A4.AA.3A3.AA..6A.8A.A9.3A.A3.A3.A..A..AA..A..3A.A.A.3A.4A.. #L AA.A.3A5.A$AA..A.AA..AA.A.4A.3A..7A..A..4A5.9A.AA.A..AA.AA5.A.A..A3.3A #L .3A.AA.A.A..A..4A.4A.A.A5.3A.AA.A.AA.AA.A..AA..AA.AA.AA.3A..AA.AA.AA4. #L 4A3.A3.AA$..A4.A.5A.A.A.AA.4A3.A..AA4.AA.A.A.A.A.4A.3A.6A3.A..3A..3A.A #L .A.AA.AA.5A.A..A..A.A.AA4.A5.A.A4.AA3.4A.3A.A..A.3A4.A4.AA.AA4.AA.A.. #L AA.4A..A$.3A.A..AA.AA..AA.4A.4A..A3.A..A.A4.A5.A.A.A3.3A..A.A..AA3.A4. #L A.5A.AA.A.AA.A.A..AA5.5A..3A..6A.A.A..A.3A..8A..A.A4.3A..AA.A.3A5.3A3. #L AA$4A3.A4.AA3.7A3.A.AA..4A..3A.A.AA..AA4.3A..3A.A..A.A.AA..AA..4A..3A #L ..AA.AA.A..4A3.A.4A3.A3.A4.AA.A.AA..AA..A.3A.AA.A.A..AA8.A3.AA6.AA..A. #L A$AA3.5A..5A.AA.A3.5A.5A.A..3A.AA.A..A.6A.AA..A..A3.A.A..AA.3A.5A.A.4A #L .A.AA6.6A.AA.8A3.A3.6A4.AA6.AA.A.A3.3A4.A5.AA4.A..A$3.A..A.4A3.AA.3A.. #L A.A.A.A.AA.AA.3A.AA3.A..3A.AA3.A4.A.AA3.A.4A6.3A.A..5A.A..4A..A.3A..A. #L AA.3A..A..4A.3A4.AA..A..A.AA..A.A7.A3.A..A4.A..A..A.A$..A.A..A3.3A.A.A #L .A.AA3.A..AA.3A..A.A.AA.AA.A3.A.AA.A6.A.A.AA.7A.A.A..A3.AA..9A3.A.3A.A #L .A5.AA..A.A3.A.A..5A.AA.4A..A..3A3.3A..A..A3.AA4.A..AA$.3A.AA3.6A3.3A #L ..AA.A..A.A.A..4A.AA.A6.3A.3A.A.6A.AA.5A..A.3A..4A..A..4A.3A.5A5.A.AA. #L AA..4A.A3.5A.A.A..AA.AA3.AA..6A4.AA..4A..3A.A$.A.A.AA..A.4A..A3.AA.AA #L 5.A.A.AA..A4.A.A.AA.A6.A.A3.A.A6.AA.AA.3A.A3.5A3.7A.AA.AA4.A3.AA..A.AA #L .3A.4A.A..AA.A..A.5A.A..AA3.A.A.A3.4A.6A.A$.A.A.3A.A3.6A.A..AA.AA.A.A. #L A5.8A6.A.AA.A3.3A..6A.A.A..A3.A..AA.AA..A3.A.A3.3A..AA.3A..A..A3.A.A3. #L AA.A..A3.3A3.3A.AA3.A4.A.3A.3A.4A.A3.AA$.AA..A..AA..AA.AA.3A.A6.4A.3A #L ..3A.A.AA7.A..A.A.3A.A..3A..A.A.4A.3A8.A.4A3.3A3.AA..5A4.A.A.AA.5A.AA #L 5.A.A.A.A4.A.A.A.4A.A..A..A.3A3.A$A..AA7.A.AA..A..A..A.5A.A.3A3.A.4A. #L 5A7.A.A..A.3A.AA.3A.3A3.A.A.A3.3A..AA.AA.A5.A..A..A3.A3.AA.A.A.3A..A.. #L A.A.5A.3A..AA.AA5.A.AA4.A5.A.AA$.AA.AA..3A.3A.AA.A3.A4.A..A.AA.AA.AA. #L 3A..A4.4A.A.A.AA..A.A.A.AA.AA..A.A..AA.AA..3A3.3A.3A.4A.A.A..A..A.A.A. #L A..AA.5A.A..AA.A..A3.3A..4A..A.A3.A..A.A.AA3.3A$.A.A5.A..A.A5.4A.4A3.A #L .A..3A4.A..A3.A..5A.AA.A.A..AA..3A3.A.AA5.6A..A5.AA.A..A3.A4.AA.A3.A. #L AA3.A5.4A.A3.A.AA.AA3.A.AA.AA..AA..A.3A3.A$..5A.AA..A..5A..AA.AA.A.AA. #L A.A.A3.A.AA..AA4.A..A.3A.A.AA3.3A..A..AA.A3.A3.3A..AA.A..A.AA.A.A3.4A #L 10.A3.AA..AA3.6A.A3.A5.A4.A.AA.A.A.4A..AA.A.A$.3A..AA.A..A.3A4.AA.3A.A #L 4.A..A.3A..AA.A.A..A.3A.AA.AA..A5.AA..A.AA.4A.4A.A.AA.A6.A.A.3A..A4.AA #L ..AA..AA.AA.A7.A..3A4.6A.AA..A.AA.4A.A3.3A.A.AA$3A.A..A.A.3A..A..AA.A. #L AA.A..A3.6A3.3A.3A4.3A..AA.AA.A..A..A.A.4A.AA3.A.A.AA..A3.AA5.AA4.A10. #L AA..AA3.A..A.A..A.A.4A..A.AA..4A.A..AA..A..AA..A$.3A.3A..A5.A.A.AA.3A. #L A..3A5.A3.A4.AA3.6A4.A.A.A..3A.6A.A.A8.3A..3A.A.AA3.5A..AA.AA..A.6A3.A #L ..AA.AA.AA..A.A5.6A4.5A5.AA.AA.A$.AA.AA..A4.3A..A3.AA..AA..AA3.A3.AA. #L AA..A..A.3A.AA.A3.A.A..A.5A..A3.A..4A.A.A4.AA..AA.A..4A3.A.A.4A.3A..AA #L ..AA.A.8A..A.AA..5A.AA6.A3.A..A.AA3.A$AA4.A.A4.AA.A..A..AA..3A3.4A.A3. #L 3A4.A.AA..A.3A.3A.A3.6A..A.A..A.5A3.4A.A3.A.A..A..A3.A5.AA.AA..A4.A4. #L AA3.AA.A3.3A..A.A..A.AA5.A3.3A.AA$A.4A.AA.6A..A..A5.AA.AA..AA.A.A.AA. #L 6A3.4A.AA.4A.3A3.A.AA.A.AA.AA.3A..5A3.A4.3A..A.A..A.A..A.A.A.AA4.3A.A. #L AA..A..3A..AA.AA6.AA.AA5.4A4.AA$..AA.A.AA..6A4.A4.4A..A.A.A.3A4.AA.AA. #L A3.A3.3A..AA..AA.A.A4.3A.AA3.AA..4A7.6A.3A.10A.A..AA.A.A..AA3.4A.AA6. #L AA3.A.3A.A.A.A..AA6.A$4.AA.A5.A..10A..A3.A.A..3A..A..A3.A.A.A.3A.AA3. #L 3A.AA..3A.AA.AA.5A.AA.AA.AA..A.A.3A.3A..7A..AA.AA3.AA4.A.AA.A..3A..A.. #L AA..A.A..AA.A..A.AA.4A.A..A$6A..A3.3A.A.A3.A.3A.3A.3A.A.A4.A.A6.4A.A. #L AA..3A..A..A4.A4.A.A..AA.A..AA.5A..AA..AA.A3.A5.5A.A..A..A.5A.AA.3A3.A #L ..7A5.AA.6A.A..3A$A.AA.3A..3A..AA.AA.4A.5A..A7.4A..A3.A..A.A3.AA.3A.A #L 4.AA5.8A.A.A.4A3.A4.A.5A3.4A5.A7.3A.AA.A3.A.4A..AA..A.AA.A.A.A..A.A.. #L 3A.5A$A3.A..4A.A.AA.A..A3.4A.AA.AA.AA.3A..A..A.AA.AA3.A.3A..A3.A..AA.A #L 5.AA4.AA.A.A..AA5.A3.AA.AA.A..AA..A.A..AA7.A..AA.3A.A..A.4A5.A..A6.AA #L 7.4A.A$3A..A11.3A.A..A.AA.AA.A.AA..3A.A.A.A5.AA.4A3.A.5A.AA3.6A.A3.A3. #L A.3A..A3.3A.3A..3A.A.A7.4A4.AA..AA..AA3.A..A.4A.A..A..AA..A.3A..3A.AA. #L A$A4.A.AA.A.A.3A3.A..A.A.4A.AA4.A.A..A..AA.A.AA.A.A3.A.3A.7A..A..3A..A #L ..A.A.9A.AA..A.A..AA..4A.AA.6A..5A4.A..3A..3A3.A4.A..3A..3A.3A3.A.3A$. #L A.A7.A.A.A4.AA..A4.AA..AA.AA.AA.AA5.A.A.A.AA..A.A..3A.A3.A3.4A.6A.A..A #L 6.A5.AA.AA.A..AA6.A.4A.3A7.3A..A.8A..A..A.A..AA..4A..3A$.A6.A.A4.AA..A #L ..AA.A.A3.A.4A.3A.A..A.A4.AA4.A.AA.AA..A.A.4A5.AA.A..A.A.A4.AA..A.5A. #L AA..A.A..A..4A12.3A..A4.A..AA.A.A.5A.A.AA3.AA.3A3.3A$AA3.AA.A5.3A.3A. #L 6A5.A.3A.AA3.3A4.A5.A4.AA..4A.AA4.A3.A..AA4.AA.4A.A.4A.A.4A..A5.A6.A. #L 5A4.AA.4A.A.A.A.A4.A.A.A..AA.3A4.3A$A.A.AA10.AA..3A.6A..A.A.A..A6.3A.. #L A..A4.AA.AA4.AA.3A.AA.AA..A4.A..A..A..A3.AA.4A3.A..AA3.AA.AA.AA..4A.A #L ..A5.A3.AA..A.4A.A.AA.AA.AA..AA..A.A..A$7A3.3A.AA.A.AA..4A.4A.3A..A.A. #L A.A..A.A.AA4.AA..AA..A.A4.A.A4.3A4.A3.A..A.A..4A..4A.7A.4A.A5.A5.A..AA #L .3A..A.3A.3A4.A.A3.AA.A.A3.A.A.A$..A4.3A.4A..AA..AA.A.A5.A.3A.A.AA.AA #L 4.AA4.3A..A5.A3.3A..A..A..AA..3A.AA..A..A.AA5.A.A..A.AA7.A.3A.3A.AA3.A #L ..3A.A3.3A..A4.A.AA..A..7A.A..3A$A..AA.A..A3.AA.A..AA.5A4.AA.A5.3A3.3A #L .AA4.A.A.A..3A.A.A..3A.A.4A3.A..A.A.A4.3A.A..AA.A..A6.AA.AA.AA..A5.AA #L 5.A3.A..A.A.3A.AA..3A..6A.4A..A$A..3A.A3.4A3.A.AA..3A..A..A.4A..A3.AA #L 3.3A..5A.A.A.A.4A..AA.A.AA.5A.AA..A..A.A.A5.7A..A.4A.A.A.A.A..A.3A.AA #L ..4A3.A.3A.A..A.A4.AA..3A.AA.A..A.A.A$4A.A4.A.A.AA5.A3.3A.AA.AA.A.AA. #L AA3.AA.3A3.AA.A.A.A..AA4.4A.A.A.A5.4A.AA.3A4.A.AA.AA3.4A..A.A.A..4A6. #L AA..A3.A5.A3.A..A3.4A.AA3.AA.AA3.3A$3A..A3.A..5A.3A3.AA.7A..AA..AA..3A #L .A.A.3A3.AA..A.AA.A3.A.5A.A.A.A..AA.A.A.5A.5A.A.3A6.AA3.A4.A..9A4.A.A. #L A3.A.A.3A5.AA9.A..A$.AA..A..A.AA7.AA3.A.AA.4A.A.A4.6A..A.3A.AA3.A4.A.. #L A4.A6.A..AA.A3.A..A.AA4.4A.3A.A4.A..AA3.A.AA.AA..8A.3A4.A.A..A5.AA.A. #L AA3.A.A..A.A.A$A..A.AA4.A.3A..A9.AA5.A..A3.A.AA3.A..A..A..A.A5.AA..A.A #L ..AA4.A3.A..A3.A3.3A..A.AA.3A3.A.A5.A..AA.A.A.A.AA..A..A3.AA.AA3.A6.5A #L 3.AA.3A.AA3.A$..A3.A.A..3A.A3.AA3.A3.AA6.AA.A.A.A.A.5A5.AA4.3A.A.A.3A. #L A.A.AA.3A.AA.3A..A..A3.4A.A.4A.A4.3A..3A.AA..AA..3A3.A7.A3.A3.5A.A..A. #L 3A..A.A.A golly-3.3-src/Patterns/Larger-than-Life/R100-alien-bug.rle0000644000175000017500000000611113140227320020014 00000000000000# An orthogonal bug (speed = 68261c/3043) in a range 100 rule. # See figure 11.41, page 219, in Chapter 11, "Larger than Life's Extremes" # by Kellie Michele Evans, in Game of Life Cellular Automata # (Andrew Adamatzky, ed., Springer 2010). # x = 204, y = 203, rule = R100,C0,M1,S10350..15740,B9350..12360,NM 85b34o$79b46o$75b54o$72b60o$69b66o$67b70o$65b74o$63b78o$62b80o$60b84o$ 59b86o$58b88o$56b92o$55b94o$54b96o$53b98o$52b100o$51b102o$51b102o$50b 104o$49b106o$48b108o$47b110o$47b110o$46b112o$45b114o$45b114o$44b116o$ 44b116o$43b118o$42b120o$42b120o$41b122o$41b122o$40b124o$40b124o$39b 126o$39b126o$38b128o$38b128o$37b130o$36b132o$36b132o$35b134o$35b134o$ 34b136o$33b138o$33b138o$32b140o$31b142o$31b142o$30b144o$30b144o$29b 146o$28b148o$28b148o$27b150o$27b150o$26b152o$25b154o$25b154o$24b156o$ 24b11ob60o12b60ob11o$23b12ob57o18b57ob12o$23b11ob56o22b56ob11o$23b10o 2b54o26b54o2b10o$22b11o2b53o28b53o2b11o$22b10o2b53o30b53o2b10o$21b10o 3b52o32b52o3b10o$21b9o4b51o34b51o4b9o$20b10o4b50o36b50o4b10o$20b9o4b 50o38b50o4b9o$20b8o5b49o40b49o5b8o$19b8o6b48o42b48o6b8o$19b8o5b48o44b 48o5b8o$19b7o6b48o44b48o6b7o$18b7o7b47o46b47o7b7o$18b6o8b47o46b47o8b6o $18b6o8b46o48b46o8b6o$17b6o8b47o48b47o8b6o$17b5o9b46o50b46o9b5o$17b5o 9b46o50b46o9b5o$17b4o10b46o50b46o10b4o$16b5o10b45o52b45o10b5o$16b4o10b 46o52b46o10b4o$16b3o11b45o54b45o11b3o$16b3o11b45o54b45o11b3o$15b3o12b 45o54b45o12b3o$15b3o12b44o56b44o12b3o$15b2o12b45o56b45o12b2o$15b2o12b 45o56b45o12b2o$14b2o13b44o58b44o13b2o$14b2o13b44o58b44o13b2o$14b2o12b 45o58b45o12b2o$13b2o13b44o60b44o13b2o$13b2o13b44o60b44o13b2o$13bo13b 44o62b44o13bo$12b2o13b44o62b44o13b2o$12b2o12b45o62b45o12b2o$12bo12b45o 64b45o12bo$11b2o12b45o64b45o12b2o$11b2o11b45o66b45o11b2o$10b2o11b46o 66b46o11b2o$9b3o11b45o68b45o11b3o$9b3o10b45o70b45o10b3o$8b3o10b46o70b 46o10b3o$7b4o10b45o72b45o10b4o$6b5o9b45o74b45o9b5o$6b4o10b45o74b45o10b 4o$5b5o9b45o76b45o9b5o$4b6o9b44o78b44o9b6o$4b6o8b45o78b45o8b6o$3b6o9b 44o80b44o9b6o$3b6o8b45o80b45o8b6o$2b7o7b45o82b45o7b7o$2b7o7b45o82b45o 7b7o$b7o7b45o84b45o7b7o$b7o7b45o84b45o7b7o$b7o6b45o86b45o6b7o$7o7b45o 86b45o7b7o$7o6b46o86b46o6b7o$7o6b45o88b45o6b7o$6o7b45o88b45o7b6o$6o6b 47o86b47o6b6o$6o6b47o86b47o6b6o$5o6b48o86b48o6b5o$b4o6b48o86b48o6b4o$b 3o7b49o84b49o7b3o$b3o6b50o84b50o6b3o$2bo7b51o82b51o7bo$10b51o82b51o$9b 53o80b53o$9b7o2b45o78b45o2b7o$9b6o3b44o80b44o3b6o$9b6o4b43o80b43o4b6o$ 8b6o6b41o82b41o6b6o$8b5o8b40o82b40o8b5o$8b5o9b38o84b38o9b5o$8b4o11b37o 84b37o11b4o$9b3o12b35o86b35o12b3o$10bo14b34o86b34o14bo$26b32o88b32o$ 27b31o88b31o$28b30o88b30o$29b29o88b29o$30b28o88b28o$31b27o88b27o$32b 26o88b26o$33b25o88b25o$34b25o86b25o$35b24o86b24o$36b24o84b24o$37b23o 84b23o$38b23o82b23o$39b22o82b22o$40b20o84b20o$41b19o84b19o$42b17o86b 17o$43b16o86b16o$44b15o86b15o$45b15o84b15o$46b16o80b16o$47b16o78b16o$ 47b17o76b17o$48b17o74b17o$49b17o72b17o$50b17o70b17o$51b17o68b17o$52b 18o64b18o$53b18o62b18o$54b18o60b18o$55b19o56b19o$56b19o54b19o$57b20o 50b20o$58b21o46b21o$59b22o42b22o$59b25o36b25o$60b27o30b27o$59b31o24b 31o$59b37o12b37o$58b88o$59b86o$60b84o$61b82o$62b80o$63b78o$64b76o$65b 74o$67b70o$68b68o$69b66o$70b64o$72b60o$73b58o$75b54o$76b52o$78b48o$79b 46o$81b42o$84b36o$87b30o$90b24o$93b18o! golly-3.3-src/Patterns/Larger-than-Life/GunCollection.rle0000644000175000017500000001000713140227320020275 00000000000000#C Smallest known period-166 guns for 7 spaceships in Bosco's Rule. #C All are based on collisions between the sparks of 2 Boscos. #C These were found by Dean Hickerson and Kellie Evans in April-May, 2000. x = 510, y = 527, rule = R5,C0,M1,S34..58,B34..45,NM:P700,700 13bo3bo306bo4bo$13bo9bo299b3o3bo$11b3o3bo3b3o3b3o281b3o3b3o4bo4b3o$11b obo3bo3bobo3bobo281bobo3bo6bo4bobo$11b3o3bo3b3o3b3o281b3o3bo6bo4bobo$ 29bo$27b3o14$43b3o300b4o$41b6o298b7o30b3o$41b7o296b2o2b6o27b5o$40b9o 294b2o4b5o25b5ob2o$40b3o3b4o265b3o7bo3b3o10b2o6b4o24b5o3b2o$40b3o3b4o 265bo8bo4bo12b3o6b4o22b5o5b2o$40bo5b4o265b3o5bo5b3o10b4o4b4o23b4o6b3o$ 40bo5b4o267bo4bo6bobo11b4o2b4o24b4o5b4o$40b2o2b6o265b3o3bo7b3o11b9o26b 4o3b4o$41b7o296b7o28b10o$43b3o298b6o30b8o$345b4o32b7o$382b5o$383b2o4$ 64b5o$64b6o$63b8o$63b9o$62b3o4b4o$62b3o4b4o$62b2o5b4o$63bo3b5o$b3o3b3o 7bo3bobo3b3o33b2o2b5o$3bo5bo6bo4bobo5bo34b6o$b3o3b3o5bo5b3o3b3o$bo7bo 4bo8bo3bo$b3o3b3o3bo9bo3b3o280bobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobo7$96b6o$96b6o$96b6o$96b6o$96b6o$96b6o3$381b3o$380b 6o$379b8o$378b10o$376b5o3b4o$110b6o259b5o4b5o$110b6o259b4o6b4o$110b6o 259b4o6b4o111b3o$110b6o259b5o5b3o110b6o$110b6o259b5o5b2o110b8o$110b6o 259b6o3bo111b10o$377b8o111b11o$380b3o112b5o4b5o$495b5o4b6o$495b4o6b5o$ 495b4o6b5o$497b2o5b6o$499bo4b6o$500b2ob6o$501b5o$502b2o10$obobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobo24$315bobo7bo3b3o$44b4o267bobo6bo4b o$43b6o266b3o5bo5b3o$42b8o267bo4bo8bo$42b9o266bo3bo7b3o$41b4o2b5o$41b 3o4b4o$40b3o6b3o$41bo6b4o$41b2o4b5o$42b2o2b6o$43b2ob4o$45b3o$9b3o7bo3b o3b3o$9bobo6bo4bo3bo$9b3o5bo5bo3b3o$9bobo4bo6bo3bobo$9b3o3bo7bo3b3o$ 65b6o$65b7o$64b9o$64b4ob5o$63b4o3b5o23b6o305b2o$63b3o5b4o23b6o303b3ob 2o$63bo7b4o23b6o301b5o2b2o$64bo5b5o23b6o301b4o4bo$64b2o3b5o24b6o301b4o 5bo$65b2ob5o25b6o301b4o3b3o$66b5o334b9o$68bo337b8o$407b6o$408b5o11$ 391b6o$391b6o$391b6o$391b6o$391b6o$391b6o$346b3o90b3o$obobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobo157b6o88b6o$342b5o3bo86bo3b5o$342b4o5bo 84bo5b4o$342b4o5b2o82b2o5b4o$342b4o4b3o82b3o4b4o$342b4o3b3o84b3o3b4o$ 343b8o86b8o$344b7o86b7o$345b6o86b6o$346b4o88b4o24$310bobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobo25$347b3o$346b5o31b4o$345b 2ob5o27b7o$344b2o3b5o24b6o2b2o$311b3o7bo3bo3b3o11b2o5b5o23b5o4b2o$311b obo6bo4bo5bo10b3o6b4o23b4o6b2o$311b3o5bo5bo3b3o10b4o5b4o22b4o6b3o$311b obo4bo6bo3bo13b4o3b4o24b4o4b4o$311b3o3bo7bo3b3o11b10o26b4o2b4o$344b8o 28b9o$344b7o30b7o$345b5o32b6o$347b2o34b4o31$129b4o$128b6o$128b7o$127b 9o$127b3o3b4o$126b3o4b4o$126b3o4b4o$127bo5b4o$128bo2b6o$128b7o$130b3o 54$169b3o$167b6o$167b7o$166b8o$15bo7bo3b3o134b5o2b3o$15bo6bo6bo134b4o 4b3o$15bo5bo5b3o134b3o5b3o$15bo4bo6bo136b4o5b2o$15bo3bo7b3o134b5o4bo$ 165b5o2bo$167b5o$169b2o2$56b3o$55b6o$54b7o$52b10o$52b4o4b2o$52b4o5bo$ 52b5o3b2o$53b3o3b2o$53b7o$55b4o9$137b5o$136bo2b4o$135bo3b5o$134b2o4b5o $134b3o4b4o$134b4o2b5o$135b9o$135b8o$136b6o$136b5o27$55b4o$53b7o$53b3o 3b2o$52b5o3b2o$52b4o5bo$52b4o4b2o$52b10o$54b7o$55b6o$56b3o52$obobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobo25$43b3o62b3o$42b5o60b5o$40b4o2b 2o58b2o2b4o$39b5o3b2o56b2o3b5o$39b4o5bo56bo5b4o$38b4o5b3o54b3o5b4o$39b 4o3b3o56b3o3b4o$39b10o56b10o$40b8o26b6o26b8o$41b7o26b6o26b7o$42b5o27b 6o27b5o$74b6o$74b6o$74b6o3$bo2bo6b3o2bo7bo2bobo$o3bo8bo3bo5bo3bobo$o3b o6b3o3bo4bo4b3o$o3bo2b2o2bo5bo3bo7bo$bo2bo2b2o2b3o2bo3bo8bo$8bo$7bo8$ 60b6o$60b7o$59b9o$59b4ob5o$58b4o3b5o$58b3o5b4o$58bo7b4o$59bo5b5o$59b2o 3b5o$60b2ob5o$61b5o$63bo! golly-3.3-src/Patterns/Larger-than-Life/ModernArt.mcl0000755000175000017500000000077513125321675017445 00000000000000#MCell 4.00 #GAME Larger than Life #RULE R10,C255,M1,S2..3,B3..3,NM #BOARD 120x120 #SPEED 20 #WRAP 1 #CCOLORS 255 #D Most simple patterns expand into lines and blocks of color, except #D for the really simple ones, which form stable power blocks (literally). #D #D Discovered by Charles A. Rockafellor, March 2000 #L 4A$4.AA15.6A$6.AA11.AA$8.3A5.3A$11.AA..A$13.AA$12.A..AA$11.A5.AA$11.A #L 7.AA$10.A10.3A$9.A14.AA$8.A17.AA$7.A20.AA$6.A23.AA$5.A26.3A$4.A30.A$ #L 36.A$37.A$38.A$39.AA$41.AA$42.A golly-3.3-src/Patterns/Larger-than-Life/Gnarl.mcl0000755000175000017500000000163513125321675016611 00000000000000#MCell 2.20 #GAME Larger than Life #RULE R1,C0,M1,S1..1,B1..1,NN #BOARD 160x160 #SPEED 0 #WRAP 1 #CCOLORS 2 #D A popular form of recreational mathematics is to grow fractals, #D snowflakes, and related patterns from simple CA rules. Here is a nice #D example provided by Kellie Evans. The rule is an LTL model in which cell #D x is occupied next time if and only if the range 1 Diamond neighborhood #D centered at x contains exactly 1 occupied cell this time. Started from a #D configuration of two diagonally adjacent occupied cells, a periodic #D tiling emerges in two quadrants of the plane while complex dynamics #D occupy the other two quadrants. We have named this experiment in homage #D to Rudy Rucker. His book "Artificial Life Lab" (Waite Group, 1993) #D suggests that the three fundamental characteristics of life are gnarl, #D sex and death. Check it out. #D #D David Griffeath #L .A$A golly-3.3-src/Patterns/Larger-than-Life/R100-NN-bug.rle0000644000175000017500000000312513140227320017241 00000000000000# An orthogonal bug (speed = 85c/10) in a range 100 rule # using the extended von Neumann neighborhood. # Very similar to the period-3 bug shown in figure 11.38, page 218, # in Chapter 11, "Larger than Life's Extremes" by Kellie Michele Evans, # in Game of Life Cellular Automata (Andrew Adamatzky, ed., Springer 2010). # x = 138, y = 124, rule = R100,C0,M1,S5612..9776,B5612..7585,NN 34b16o38b16o$31b30o16b30o$28b82o$26b86o$25b88o$23b92o$22b94o$20b98o$ 19b100o$18b102o$17b104o$16b106o$15b108o$14b110o$13b112o$12b114o$11b 116o$11b116o$10b118o$9b120o$8b122o$8b122o$7b124o$7b124o$6b126o$5b128o$ 5b128o$4b130o$4b130o$3b132o$3b132o$3b132o$2b134o$2b134o$2b134o$b136o$b 136o$b136o$b136o$138o$138o$138o$66o6b66o$61o16b61o$58o22b58o$55o28b55o $53o32b53o$52o34b52o$50o38b50o$49o40b49o$49o40b49o$b48o40b48o$b47o42b 47o$b47o42b47o$b46o44b46o$b46o44b46o$2b45o44b45o$2b45o44b45o$2b45o44b 45o$3b43o46b43o$3b43o46b43o$3b43o46b43o$4b42o46b42o$4b42o46b42o$5b41o 46b41o$5b41o46b41o$5b41o46b41o$6b40o46b40o$6b40o46b40o$6b40o46b40o$7b 39o46b39o$7b39o46b39o$7b39o46b39o$8b38o46b38o$8b38o46b38o$9b37o46b37o$ 9b37o46b37o$9b37o46b37o$10b36o46b36o$10b36o46b36o$10b36o46b36o$11b35o 46b35o$11b35o46b35o$11b35o46b35o$12b34o46b34o$12b34o46b34o$12b34o46b 34o$12b34o46b34o$13b33o46b33o$13b33o46b33o$13b33o46b33o$13b33o46b33o$ 14b32o46b32o$14b32o46b32o$14b32o46b32o$14b32o46b32o$15b31o46b31o$15b 31o46b31o$15b31o46b31o$16b30o46b30o$16b30o46b30o$16b30o46b30o$17b29o 46b29o$17b29o46b29o$17b29o46b29o$18b29o44b29o$18b33o36b33o$19b37o26b 37o$19b100o$20b98o$21b96o$21b96o$22b94o$23b92o$24b90o$26b86o$28b82o$ 30b78o$33b72o$37b64o$41b56o$46b46o$52b34o$58b22o! golly-3.3-src/Patterns/Larger-than-Life/BugReactions.rle0000644000175000017500000000263013125321675020133 00000000000000#C Three reactions in which blocks modify a passing bug: #C #C First, a diagonal, speed 8/16 bug becomes an orthogonal, #C speed 5/6 bug. #C #C Second, an orthogonal, speed 4/5 bug becomes an orthogonal, #C speed 8/12 bug. (Another 4/5 bug is shown below to make the #C change clearer.) #C #C Third, pairs of blocks can slow down a Bosco oscillator, giving #C oscillators with periods 166 + 188n. Here are a normal #C Bosco (p166), one using one pair of blocks (p284), and one #C using two pairs of blocks (p402). #C #C Dean Hickerson, May 2000. x = 266, y = 250, rule = R5,C0,M1,S34..58,B34..45,NM:T400,400 114bo$113b4o$111b2ob5o$111bo3b5o$110bo5b5o$109b3o5b4o$110b3o3b5o$110b 4ob5o$111b8o$111b7o$112b5o$113b3o8$151b6o$151b6o$151b6o$151b6o$151b6o$ 151b6o48$134b6o$134b6o$134b6o$134b6o$134b6o$134b6o7$113b2o$112b5o$111b 8o$110bob8o$109b2o4b5o$109b2o4b5o$109b2o4b5o$110bob8o$111b8o$112b5o$ 113b2o9$113b2o$112b5o$111b8o$110bob8o$109b2o4b5o$109b2o4b5o$109b2o4b5o $110bob8o$111b8o$112b5o$113b2o80$4b3o91b3o91b3o$3b7o87b7o87b7o$2bo3b5o 85bo3b5o85bo3b5o$bo5b4o84bo5b4o84bo5b4o$2o5b4o83b2o5b4o83b2o5b4o$b2o4b 4o84b2o4b4o31b6o47b2o4b4o31b6o$b4o2b4o84b4o2b4o31b6o47b4o2b4o31b6o$2b 8o86b8o32b6o48b8o32b6o$2b7o87b7o33b6o48b7o33b6o$3b5o89b5o34b6o49b5o34b 6o$4b3o91b3o35b6o50b3o35b6o12$94b6o88b6o$94b6o88b6o$94b6o88b6o$94b6o 88b6o$94b6o88b6o$94b6o88b6o7$260b6o$260b6o$260b6o$260b6o$260b6o$260b6o 12$218b6o$218b6o$218b6o$218b6o$218b6o$218b6o! golly-3.3-src/Patterns/Larger-than-Life/Jitterbug.rle0000644000175000017500000000037313127300132017472 00000000000000#C Jitterbug #C A range-4 bug that alternately moves north and south, but #C also a little bit east each time. Its speed is 4/40. #C Dean Hickerson, Dec 22, 2001. x = 7, y = 8, rule = R4,C0,M1,S24..38,B22..31,NM b4o$o4bo$o4b2o$2o2b3o$7o$b4o$b4o$b4o! golly-3.3-src/Patterns/Larger-than-Life/SoldierBugs.rle0000644000175000017500000000306513127300132017756 00000000000000#CXRLE Pos=-56,-56 # # Dean Hickerson discovered the "soldier bug" in 2001. # A single soldier bug moves around in a circle, with period 552. # The following pattern by Dave Greene shows how twelve soldier bugs # can be arranged to create a period 46 oscillator. # x = 113, y = 113, rule = R7,C0,M1,S65..114,B65..95,NM 49b4o$47b7o$46b10o$45b12o$45b13o19b2o$44b3o5b6o17b6o$22b3o19b3o5b6o16b 9o$20b7o17b3o5b6o15b11o$19b9o16b3o5b6o14b3ob9o$18b12o15b3o2b8o14b3o4b 7o$18b13o14b12o14b3o6b6o$17b5o3b6o15b10o15b3o6b6o$17b2o7b5o16b7o17b3o 6b6o$17b2o7b5o18b3o20b3obo2b7o$17b3o5b6o41b13o$17b3o2b9o42b11o$18b3ob 8o44b8o$19b10o46b6o16b5o$20b7o50b2o17b8o$21b5o69b4o2b4o$94b3o4b5o$93b 3o5b5o$93b5o4b5o$93b5o4b5o$93b5o4b5o$93b6o2b5o$94b12o$9b5o81b10o$8b7o 80b9o$7b9o80b8o$6b10o81b6o$6b11o$5b13o$5b5o3b5o$4b5o5b5o$4b5o5b5o$5b4o 4b5o$5b3o6b4o$6b4o3b4o$7b9o$8b7o$10b3o3$104b4o$102b8o$101b10o$100b4o4b 4o$100b3o5b4o$99b4o5b5o$99b5o4b5o$99b5o4b5o$100b13o$100b12o$101b10o$4b 6o91b10o$3b8o91b8o$2b10o91b6o$2b10o$b12o$13o$5o4b5o$5o4b5o$5o5b4o$b4o 5b3o$b4o4b4o$2b10o$3b8o$5b4o3$100b3o$98b7o$97b9o$96b4o3b4o$95b4o6b3o$ 95b5o4b4o$94b5o5b5o$94b5o5b5o$95b5o3b5o$95b13o$96b11o$10b6o81b10o$9b8o 80b9o$9b9o80b7o$8b10o81b5o$7b12o$7b5o2b6o$6b5o4b5o$6b5o4b5o$6b5o4b5o$ 7b5o5b3o$7b5o4b3o$8b4o2b4o69b5o$9b8o17b2o50b7o$11b5o16b6o46b10o$31b8o 44b8ob3o$29b11o42b9o2b3o$28b13o41b6o5b3o$27b7o2bob3o20b3o18b5o7b2o$27b 6o6b3o17b7o16b5o7b2o$27b6o6b3o15b10o15b6o3b5o$27b6o6b3o14b12o14b13o$ 27b7o4b3o14b8o2b3o15b12o$28b9ob3o14b6o5b3o16b9o$29b11o15b6o5b3o17b7o$ 30b9o16b6o5b3o19b3o$32b6o17b6o5b3o$34b2o19b13o$56b12o$57b10o$59b7o$60b 4o! golly-3.3-src/Patterns/Larger-than-Life/BugCollection.rle0000644000175000017500000000372513140227320020272 00000000000000#C Collection of spaceships in Bosco's Rule. #C Found by Kellie Evans and Dean Hickerson, about 2000-2003. x = 123, y = 131, rule = R5,C0,M1,S34..58,B34..45,NM:T400,400 11bo3bo78bo4bo$11bo9bo71b3o3bo$9b3o3bo3b3o3b3o53b3o3b3o4bo4b3o$9bobo3b o3bobo3bobo53bobo3bo6bo4bobo$9b3o3bo3b3o3b3o53b3o3bo6bo4bobo$27bo$25b 3o6$42b3o70b3o$40b6o68b6o$40b7o66b9o$7b3o7bo3bo3b3o12b8o41bo7bo3bo10b 2o3b6o$7bo8bo4bo3bobo11b4o2b5o39bo6bo4bo10bo5b5o$7b3o5bo5bo3bobo11b3o 4b4o39bo5bo5bo9b2o6b4o$7bobo4bo6bo3bobo10b3o6b4o38bo4bo6bo10bo5b5o$7b 3o3bo7bo3b3o11bo6b5o38bo3bo7bo10b2o3b6o$39b2o4b5o63b9o$40b2o2b6o64b6o$ 41b2ob5o66b3o$43b3o10$115b4o$43b4o67b7o$42b6o65b9o$41b8o36b3o7bo3b3o 10b2o3b5o$b3o3b3o7bo3bobo3b3o11b9o37bo6bo6bo10bo5b5o$3bo5bo6bo4bobo5bo 10b3o4b4o34b3o5bo5b3o10bo5b5o$b3o3b3o5bo5b3o3b3o10b2o5b4o34bo6bo6bo12b 2o3b5o$bo7bo4bo8bo3bo12b2o5b4o34b3o3bo7b3o11b9o$b3o3b3o3bo9bo3b3o11bo 4b5o63b7o$42bo2b5o65b4o$43b5o$44b2o9$116bo$115b4o$43b5o66b7o$42b6o37b 3o7bo3b3o11b10o$42b7o36bo8bo4bo12b2o4b5o$9b3o7bo3bo3b3o11b10o34b3o5bo 5b3o10bo6b4o$9bobo6bo4bo3bo13b3o3b4o36bo4bo6bobo10bo6b4o$9b3o5bo5bo3b 3o10b3o4b4o34b3o3bo7b3o10b2o4b5o$9bobo4bo6bo3bobo11bo5b4o62b10o$9b3o3b o7bo3b3o11b2o3b5o63b7o$42b2ob5o65b4o$43b5o68bo$45bo10$116b2o$42b4o69b 5o$41b6o67b8o$41b7o37bobo7bo3b3o11bob8o$15bo7bo3b3o11b8o36bobo6bo4bo 12b2o4b5o$15bo6bo6bo10b4ob5o35b3o5bo5b3o10b2o4b5o$15bo5bo5b3o10b2o4b4o 37bo4bo8bo10b2o4b5o$15bo4bo6bo12bo5b4o37bo3bo7b3o11bob8o$15bo3bo7b3o 10b2o4b4o64b8o$41b2o2b5o65b5o$42b7o67b2o$43b3o10$116bo$115b3o$114b6o$ 113b8o$81b3o7bo3bo3b3o10b3o2b6o$81bobo6bo4bo5bo10bo5b5o$81b3o5bo5bo3b 3o9b2o6b4o$81bobo4bo6bo3bo12bo5b5o$81b3o3bo7bo3b3o10b3o2b6o$113b8o$ 114b6o$115b3o$116bo11$116b2o$114b6o$43b4o66b9o$42b6o33b3o7bo3bo3b3o10b 4o2b4o$bo2bo6b3o2bo7bo2bobo11b9o33bo6bo4bo5bo10b2o5b4o$o3bo8bo3bo5bo3b obo10b10o33bo5bo5bo3b3o10b2o5b4o$o3bo6b3o3bo4bo4b3o10b2o4b4o33bo4bo6bo 5bo10b2o5b4o$o3bo2b2o2bo5bo3bo7bo10b2o4b4o33bo3bo7bo3b3o10b3o4b4o$bo2b o2b2o2b3o2bo3bo8bo10b2o3b5o62b4o2b4o$8bo32b2ob6o63b9o$7bo34b7o65b6o$ 44b2o70b2o! golly-3.3-src/Patterns/Larger-than-Life/Blinkers.mcl0000755000175000017500000000046213125321675017314 00000000000000#MCell 2.20 #GAME Larger than Life #RULE R10,C0,M1,S123..212,B123..170,NM #BOARD 100x100 #SPEED 0 #WRAP 1 #CCOLORS 2 #D "Bugsmovie" rule oscillators #L 6.3A$4.7A$3.9A$..11A20.11A$.13A18.13A$.13A18.13A$15A17.13A$15A17.13A$ #L 15A17.13A$.13A18.13A$.13A18.13A$..11A19.13A$3.9A20.13A$4.7A22.11A$6.3A golly-3.3-src/Patterns/Larger-than-Life/Bosco.mcl0000755000175000017500000000072313140227320016575 00000000000000#MCell 2.20 #GAME Larger than Life #RULE R5,C0,M1,S34..58,B34..45,NM #BOARD 100x100 #SPEED 0 #WRAP 1 #CCOLORS 2 #D Bosco's Rule #D #D Here's a little range 5, Larger than Life creature that Kellie Evans #D discovered while exploring LtLife phase space on the CAM8 cellular automaton #D machine. It's a period 166 oscillator. #D #D David Griffeath #L 29.A$27.5A$25.5A.AA$24.5A3.AA$24.4A5.A$23.4A5.3A$24.4A3.3A$24.5A.4A$ #L 25.8A$26.7A$27.5A31$A golly-3.3-src/Patterns/Larger-than-Life/BugGun.rle0000644000175000017500000000067513140227320016731 00000000000000#C First gun found in Bosco's Rule. #C Constructed by Dean Hickerson, Feb 27, 2000. x = 28, y = 90, rule = R5,C0,M1,S34..58,B34..45,NM:P200,200 4b2o15b3o$2b6o12b5o$b2o2b4o10b7o$2o3b5o9b8o$o5b4o8b4o2b4o$3o3b4o8b2o4b 4o$10o7b2o6b3o$b8o9bo5b4o$b7o11bo3b5o$2b5o13b7o$4b2o15b3o32$19b6o$19b 6o$19b6o$19b6o$19b6o$19b6o32$4b2o15b3o$2b5o13b7o$b7o11bo3b5o$b8o9bo5b 4o$10o7b2o6b3o$3o3b4o8b2o4b4o$o5b4o8b4o2b4o$2o3b5o9b8o$b2o2b4o10b7o$2b 6o12b5o$4b2o15b3o! golly-3.3-src/Patterns/Larger-than-Life/Butterfly.rle0000644000175000017500000000106413127300132017511 00000000000000#C Range-5, orthogonal, speed 9/31 spaceship, whose population #C varies by a factor of 10 (min 37, max 370). #C Dean Hickerson, Feb 28, 2000 x = 25, y = 37, rule = R5,C0,M1,S34..52,B31..45,NM 18b4o$16b4ob3o$14b5o3b3o$14b3o5b3o$13b3o6b3o$11b3o9b2o$b7o2b3o10b2o$3o b7o12b2o$11o13bo$3o2b4o14b2o$3o4b2o2b3o8b2o$3o18b2o$o17bob2o$o16b4o$2o 13bob3o$b2o13b2o$b3obo6bob3o$2b5o4b4o$3b4o5b2o$2b5o4b4o$b3obo6bob3o$b 2o13b2o$2o13bob3o$o16b4o$o17bob2o$3o18b2o$3o4b2o2b3o8b2o$3o2b4o14b2o$ 11o13bo$3ob7o12b2o$b7o2b3o10b2o$11b3o9b2o$13b3o6b3o$14b3o5b3o$14b5o3b 3o$16b4ob3o$18b4o! golly-3.3-src/Patterns/Larger-than-Life/Waffle.mcl0000755000175000017500000000260413125321675016747 00000000000000#MCell 2.20 #GAME Larger than Life #RULE R7,C0,M1,S100..200,B75..170,NM #BOARD 300x300 #SPEED 0 #WRAP 1 #CCOLORS 25 #COLORING 2 #D #D Here is a a beautiful 'waffle' for the range 7 Box Larger than Life rule #D with birth interval [75,170] and survival interval [100,200], after 90 #D updates, with all 0's boundary conditions. The initial configuration is #D a central lattice circle of occupied sites with radius 12. #D #D Starting from a 50-50 random mix of live and dead cells, the dynamics #D produce a familiar nucleation scenario - most of the space relaxes to #D all 0's, but isolated pockets of activity form seeds for spreading #D colonies of 1's. Try it! Early on we observe an assortment of waffles, #D most imperfect, but some highly patterned and nearly symmetric. Later the #D imperfections take over and cover the space with another variety of #D pseduo-random 'seething gurp'. #D #D Intrigued by the delicate transient droplet patterns, Kellie Evans segued #D into 'engineering' mode in search of the perfect waffle. She discovered #D that for the LtL given here, if we start from a radius 10 lattice circle, #D then the waffle appears to grow 'perfectly' for more than 70 updates before #D beginning to unravel. #D #D David Griffeath #L 7.9A$5.13A$4.15A$3.17A$..19A$.21A$.21A$23A$23A$23A$23A$23A$23A$23A$23A #L $23A$.21A$.21A$..19A$3.17A$4.15A$5.13A$7.9A golly-3.3-src/Patterns/Self-Rep/0000755000175000017500000000000013543257425013522 500000000000000golly-3.3-src/Patterns/Self-Rep/Devore/0000755000175000017500000000000013543257426014747 500000000000000golly-3.3-src/Patterns/Self-Rep/Devore/Devore-body.rle0000644000175000017500000010107213151213347017540 00000000000000#CXRLE Pos=-37,-10 # Devore, J. and Hightower, R. (1992) # The Devore variation of the Codd self-replicating computer, # Third Workshop on Artificial Life, Santa Fe, New Mexico, # Original work carried out in the 1970s though apparently never published. # Reported by John R. Koza, "Artificial life: spontaneous emergence of # self-replicating and evolutionary self-improving computer programs," # in Christopher G. Langton, Artificial Life III, Proc. Volume XVII # Santa Fe Institute Studies in the Sciences of Complexity, # Addison-Wesley Publishing Company, New York, 1994, p. 260. # # See make-Devore-tape.py for a script to write tapes for this machine. # # John Devore writes: (part III) # "I then converted from a "microcode" to a "hardware" design which allowed # for tremendous miniaturization. I had estimated that a full-blown realization # of Codd's space would take at least a 10,000 x 10,000 array or 100,000,000 # cells. My design fit nicely in a 250 x 350 array or 87,500 cells -- less than # 1/1000 the estimated Codd size. Further it operated much more efficiently on # an instruction by instruction basis even if they had had the same distance for # signals to travel. Of course, Codd, was just trying to show that a self- # reproducing UCC was possible. I was trying to actually implement it # completely." # x = 367, y = 243, rule = Devore 18.10A2.14A2.17A2.15A2.16A2.17A2.11A2.103A$18.A8.A2.A12.A2.A15.A2.A 13.A2.A14.A2.A15.A2.A9.A2.A101.A$14.5A8.4A12.4A15.4A13.4A14.4A15.4A9. 4A101.A$17.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A2.78A4.A16.A$17.A11.A 15.A18.A16.A17.A18.A12.A3.A76.A4.A16.A$14.4A8.4A12.4A15.4A13.4A14.4A 15.4A9.4A3.A76.6A16.A$14.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A4.2A2. 69A5.A21.A$14.A11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.10A$14.A 11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.2A6.5A$5.7A2.A5.4A2.A9.7A 12.7A11.6A6.9A2.A8.7A3.A7.6A5.A3.A13.5A5.5A5.5A23.8A4.A12.A10.2A$5.A 5.A2.A5.A2.A2.A9.A4.4A10.A4.4A9.A3.4A4.A7.A2.A8.A5.A3.A7.A3.4A3.A3.A 13.A3.A5.A3.A5.A3.A23.A6.A4.A12.A11.3A$5.A5.A2.A5.A2.A2.A4.6A7.A5.6A 7.A9.A6.A4.A7.A2.A8.A5.A3.A7.A6.A3.A3.5A3.7A3.7A3.7A3.14A10.A6.A4.A 12.A12.11A$6A5.A2.A5.A2.4A4.A3.4A5.A5.A3.4A5.A4.6A6.A2.5A4.2A2.A8.A4. 2A3.A7.A6.A3.A7.A3.A2.A2.A3.A2.A2.A3.A2.A2.A3.A6.A5.A10.A6.A4.A11.2A 3.5A4.A9.A$A3.4A3.A2.A5.A4.4A2.A6.A5.A5.A6.A5.A4.A3.4A4.A2.A3.A4.5A6. 5A2.6A5.5A4.A3.A7.A3.A2.A2.5A2.A2.5A2.A2.5A6.A5.A10.3A2.5A2.A11.6A2. 2A4.A9.A$A6.A3.A2.A5.A7.A2.A6.A5.A5.A6.A5.A4.A6.A4.A2.A3.A4.A2.4A4.A 3.A2.A3.5A2.A3.A4.A3.A7.A3.A2.A9.A9.A13.A5.A12.A2.A3.A2.A9.3A3.2A3.6A 9.5A92.22A$A6.A2.2A2.A3.5A5.A2.8A5.A5.8A5.A4.A6.A4.A2.A3.A4.A5.A4.A3. A2.A7.A2.A3.A4.A3.A3.5A3.A2.A9.A9.A13.A3.8A7.A2.A3.A2.A9.2A4.A8.3A4. 2A2.A3.A92.A20.A$8A2.5A3.A3.A5.A7.A7.A10.A7.A4.8A4.A2.5A4.A5.A4.A3.A 2.A7.A2.A3.A4.A3.A3.A7.A2.A6.4A3.7A4.6A3.A3.A6.A7.A2.A3.A2.A9.A5.A10. A4.A3.A3.A92.A20.A$5.A4.A7.A3.A5.A7.A7.A10.A7.A9.A6.A4.A6.A5.A4.5A2. 4A4.A2.5A4.A3.A3.A7.A2.A6.A6.A10.A3.6A3.A6.A5.3A2.5A2.11A5.A10.A4.A3. A3.A92.A3.9A$5.A4.A7.A3.A5.A7.9A10.9A9.A6.A4.A6.A5.A6.A7.A2.3A4.A6.A 3.A3.A7.A2.A5.2A5.2A10.A3.A3.2A3.4A3.A5.A6.A20.2A9.A4.5A3.A92.5A7.A$ 5.6A7.5A5.A10.A3.5A10.A3.4A4.7A3.A4.A2.5A5.A6.A7.A2.A6.A6.A3.A3.9A2.A 5.4A3.4A2.4A2.A3.A3.A6.6A5.A6.A20.6A4.2A4.A3.A3.A95.2A7.A$5.A3.5A6.A 4.4A10.A7.A10.A6.A4.A5.A3.A4.A2.A2.5A2.A6.9A2.A4.5A4.A3.A11.A2.A5.A2. A3.A2.A2.A2.A2.A3.A3.A6.A10.A4.5A22.8A4.A3.A3.A95.A8.A$5.A7.A6.A4.A 13.A7.A10.A6.A4.A5.A3.A4.4A6.A2.A6.A10.3A2.A3.A4.A3.A11.A2.7A2.5A2.A 2.A2.A2.A3.A3.8A10.A4.A3.A22.A11.A2.2A3.A95.A5.4A$3.5A5.A6.6A11.5A3. 3A8.5A4.A4.A5.A3.A7.A6.A2.A6.A12.A2.A3.A4.A3.A11.A18.4A2.A2.A3.A21.A 4.A3.A11.6A5.A11.A2.3A2.A33.63A5.2A$3.A3.A5.A6.A3.4A9.A3.A3.A10.A3.A 4.A4.7A3.A7.8A2.A4.5A10.A2.A3.A4.A3.A8.4A24.4A3.A21.A4.A3.A11.A4.A5.A 11.A2.A4.A33.A67.A$3.A3.A5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A6.A7.A9.A4.A 3.A2.4A2.3A2.5A4.A3.A8.A34.20A2.A4.5A11.A4.15A3.4A4.A33.A67.A$3.A3.A 5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A4.3A7.A9.A4.A3.A2.A2.A2.A6.A6.A3.A8.A 53.A2.A6.A4.10A18.A11.A33.A40.5A4.19A$3.5A2.4A3.7A3.A9.5A3.A10.5A4.A 7.A4.A7.5A7.A4.A3.A2.A2.4A6.A6.A3.A8.A53.A2.A6.A4.A7.4A16.A11.A33.A 40.A3.A4.A16.4A$5.A4.A6.A5.A3.A11.A5.A12.A6.A4.9A7.A3.A5.3A4.5A2.A4. 4A2.5A2.3A3.A8.A16.5A5.5A5.5A12.A2.A4.5A2.A10.A16.A45.A3.20A12.6A3.6A 19.A$5.A4.A6.A5.A3.A11.A5.A12.A6.A4.A6.4A5.A3.A5.A8.A4.A7.A2.A3.A2.A 5.A8.A16.A3.A5.A3.A5.A3.A12.A2.A4.A3.A2.A10.A5.5A6.A45.A3.A18.A12.A 12.4A17.A$3.5A2.4A3.A5.A3.A9.5A3.A12.8A4.A9.A5.A3.A5.A8.A4.A7.A2.A3.A 2.A5.A8.A2.15A3.7A3.7A3.5A8.A2.A4.A3.A2.A3.8A2.A2.A3.A6.35A11.A3.A18. A8.5A15.A17.A$3.A3.A5.A3.7A3.A9.A3.A3.A15.A6.5A7.A5.5A5.A8.14A2.A3.A 2.A5.A8.A2.A10.A2.A3.A2.A2.A3.A2.A2.A3.A3.A8.A2.A4.A3.A2.A3.2A4.8A3. 4A37.A11.A3.A17.2A8.A2.4A13.A12.6A$3.A3.A5.A6.A6.A9.A3.A3.A15.A6.A3.A 2.6A7.A7.A16.A7.5A2.3A3.A8.A2.A10.A2.5A2.A2.5A2.A2.5A3.7A2.A2.A4.5A2. A3.A9.A2.A3.A2.A37.A11.A3.A17.11A5.A7.7A12.A3.4A$3.A3.A5.A6.A6.A9.A3. A3.A13.5A4.A3.A2.A12.A7.A16.A9.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6. A4.A3.A12.5A2.A37.A11.A3.A17.A15.A7.A4.4A10.A6.A$3.5A2.4A4.5A2.3A9.5A 3.A13.A3.A4.A3.A2.A12.6A2.A14.5A7.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2. A6.A4.A3.A2.4A13.A37.A11.A3.A17.A15.A2.6A7.A5.6A6.A$5.A4.A7.A3.A2.A 13.A5.A13.A3.A4.5A2.A12.A4.A2.A14.A3.A7.8A3.A8.A2.A3.8A3.7A2.4A3.A10. A5.A2.A2.4A3.A4.A3.A2.A2.A13.A37.A11.A3.A6.9A2.A15.A2.A3.4A5.A5.A3.4A 4.A$5.A4.A7.A3.A2.A13.A5.A13.A3.A6.A4.A12.A4.A2.A14.A3.A8.A9.A8.A2.A 3.A6.A3.A8.A2.A3.A10.A3.3A2.A4.6A4.A3.A2.A2.15A36.2A11.A3.A6.A7.A2.A 15.A2.A6.A5.A5.A6.A4.A$3.5A2.4A4.A3.A2.A13.7A13.5A6.A4.A10.5A2.A2.A 14.A3.A8.A9.A8.A2.A3.A6.A3.A8.A2.5A10.A3.A4.A4.A9.A3.4A16.A36.14A3.A 6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A$3.A3.A5.A4.5A2.3A13.A19.A8.6A10.A3.A 2.A2.A14.5A8.A9.A8.A2.A3.4A3.A3.4A5.A9.5A3.A3.A4.A4.A9.A5.2A16.A36.A 16.A4.5A4.2A2.A13.3A2.8A5.A5.8A4.A$3.A3.A5.A6.A6.A13.A19.A11.A12.A3.A 2.A2.A16.A10.A9.A8.A2.A6.A3.A6.A5.A9.A2.6A3.3A2.3A2.A9.A5.A3.5A2.5A2. A36.A16.A4.A3.A4.5A13.A9.A7.A10.A6.A$3.A3.A5.A6.A6.A11.5A15.5A9.A12.A 3.A2.4A16.A10.A9.A8.A2.A6.A3.A6.A5.A9.A2.A3.2A5.A3.5A9.A5.A3.A3.A2.A 3.A2.A36.A16.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A$3.5A2.4A6.8A11.A3.A15.A 3.A7.5A10.5A22.A5.6A9.A8.A2.A3.4A2.2A5.2A4.2A9.A2.A3.A6.A3.A13.A5.5A 3.4A3.4A36.2A10.6A4.A3.A4.A5.A6.6A9.9A7.7A3.A$5.A4.A11.A16.A3.A15.A3. A7.A3.A12.A24.A5.A14.A8.A2.A3.A5.4A3.4A2.12A2.A3.A6.A3.A7.7A9.A3.A2.A 3.A6.6A27.4A8.A3.4A2.5A4.A5.A6.A3.4A10.A3.5A4.A5.A3.A$5.A4.A11.A16.A 3.A15.A3.A7.A3.A12.A24.A5.A14.A8.A2.A3.A5.A2.A3.A2.A2.A13.A3.8A3.A7.A 15.5A2.5A6.A4.A12.6A12.A8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.6A11. A16.5A15.5A7.A3.A12.A17.8A5.A2.13A2.7A2.A3.7A2.5A2.4A13.A14.4A4.A33.A 4.A12.A4.A12.A8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.A3.5A8.A18.A19. A9.5A12.A17.A12.A2.A14.A8.A36.A16.2A4.A33.A3.2A3.5A4.A4.14A6.5A4.A4.A 2.5A5.A4.5A4.A8.5A3.3A4.7A3.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A14. A8.A36.14A4.A4.A16.6A2.10A3.6A3.6A16.4A4.A3.A4.A4.A2.A2.5A2.A4.A3.A4. A8.A3.A3.A9.A6.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A2.13A2.7A4.30A 14.2A4.A4.A16.A4.A2.A12.A12.4A17.A4.A3.A4.A4.4A6.A2.A4.A3.A4.A8.A3.A 3.A9.A4.3A$5.9A8.A18.A19.A11.A14.A11.7A4.9A2.A2.A14.A10.A28.A15.A3.2A 4.A16.A4.A2.A12.A15.A17.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A$ 5.A16.A18.A19.A8.4A14.A11.A10.A10.A2.A14.A10.A28.A15.A3.4A2.A16.A3.2A 2.A7.6A15.A12.6A4.5A4.A7.8A2.A4.5A4.A8.5A3.A6.9A$5.A16.A18.A19.A8.A 17.A11.A10.A10.A2.A2.13A2.9A2.24A2.A7.5A3.5A2.A2.A2.15A3.5A7.A3.4A7. 7A12.A3.4A4.A6.A7.A9.A6.A6.A10.A5.A6.A6.4A$5.A16.A18.A19.A8.A17.A11.A 7.4A2.9A2.A2.A14.A10.A22.A2.A7.A3.A10.A2.A2.A17.A11.A6.A7.A4.4A10.A6. A4.A6.A7.A9.A6.A6.A10.A5.A6.A9.A$5.A16.A18.A19.A8.A17.A11.A7.A5.A10.A 2.A14.A10.A22.A2.A7.A3.A10.A2.A2.A17.A6.6A6.A2.6A7.A5.6A6.A2.5A4.A5. 5A7.A4.5A4.A8.5A3.A4.5A7.A$5.7A10.A18.A19.A8.A2.16A3.9A2.6A5.A10.A2.A 3.12A2.9A2.18A2.A2.5A3.A3.A9.2A2.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A5.A3. 4A4.A2.A3.A4.A5.A3.A5.3A4.A3.A4.A8.A3.A3.A4.A3.A2.6A$11.A10.A18.A19.A 8.A2.A18.A10.A7.4A2.9A2.A3.A13.A10.A16.A2.A6.A3.A2.2A9.5A2.A6.A7.A2.A 6.A6.A4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A 2.A$11.A10.A18.A12.8A8.A2.A18.A10.A7.A5.A10.A3.A13.A10.A16.A2.A6.5A2. 5A6.A6.A6.A7.A2.A6.A6.A4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A 4.A8.A3.A3.A4.A3.A2.A$11.A10.A18.A12.A15.A2.A6.13A2.9A2.6A5.A10.A3.A 6.8A2.9A2.12A2.A2.5A6.A2.A2.2A3.4A6.A4.5A4.2A2.A6.8A4.A2.8A5.A5.8A4.A 2.5A4.A5.5A5.A6.5A4.A8.5A3.A4.5A2.A$11.A10.A18.A12.A15.A2.A6.A14.A10. A7.4A2.9A3.A6.A9.A10.A10.A2.A6.A6.4A3.A3.A9.A4.A3.A4.5A11.A6.A7.A7.A 10.A6.A4.A6.A7.A7.A8.A6.A10.A5.A6.A4.A$11.A10.A13.6A8.5A15.A2.A6.A14. A10.A7.A5.A11.A6.A9.A10.A10.A2.A6.A13.A3.A9.A4.A3.A4.A2.4A9.A6.A7.A7. A10.A6.A4.A6.A7.A7.A8.A6.A10.A5.A6.A4.A$11.A10.A13.A13.A11.9A2.A6.A6. 9A2.9A2.6A5.A11.A5.2A8.2A9.2A3.5A2.A2.5A2.A13.A3.A4.6A4.A3.A4.A5.A6. 7A3.A7.9A7.7A3.A2.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A$11.A10.A13.A13.A11.A 10.A6.A6.A10.A10.A9.2A11.A5.5A5.5A6.6A3.A2.A6.A2.A12.2A3.A4.A3.4A2.5A 4.A5.A6.A5.A3.A10.A3.5A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A$ 11.A10.A13.A13.A11.A10.A6.A6.A10.A10.A9.9A4.A3.3A3.A3.3A3.A4.3A3.2A3. A2.A6.A2.A12.6A4.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A3.A2.A9.A4. A2.A6.A3.A2.A14.A13.A$11.A9.2A9.5A6.8A3.9A2.9A2.5A5.2A9.2A9.2A7.3A3.A 2.2A4.A3.2A4.A3.2A4.A4.2A4.A4.A2.5A2.A2.A12.A9.A6.A4.A6.A5.A6.A5.A3.A 10.A7.A4.A5.A3.A2.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A$11.A9.A10.A10.A 10.A10.A10.A9.5A6.5A6.5A4.2A4.A3.A4.A3.A5.A3.A5.A4.A5.A4.A6.A2.A2.A 12.A7.5A4.A4.A2.5A5.A6.7A3.A8.5A3.3A4.7A3.A2.5A2.3A5.A3.A2.A2.A6.5A2. 3A10.A3.A9.A3.A$11.A9.A10.A10.A10.A10.A10.A7.3A3.A4.3A3.A4.3A3.A4.A5. A3.A3.2A3.A3.7A3.8A3.3A4.A6.A2.A2.A12.A7.A3.A4.A4.A2.A2.5A2.A9.A6.A8. A3.A3.A9.A6.A4.A6.A5.A3.A2.A2.A8.A6.A10.A3.A9.A3.A$11.A8.2A9.2A9.2A9. 2A9.2A9.2A7.2A4.A4.2A4.A4.2A4.6A3.3A3.A3.6A3.2A8.2A9.2A5.5A2.A2.A2.A 12.4A4.A3.A4.A4.4A6.A2.A9.A4.3A8.A3.A3.A9.A4.3A4.A6.A5.A3.A2.4A8.A6.A 10.A3.A9.A3.A$11.A8.5A6.5A6.5A6.5A6.5A6.5A4.A5.A4.A5.A4.A5.A8.2A4.5A 3.2A3.A9.A10.A10.A2.A2.A2.A15.A4.A3.A4.A7.A6.A2.A9.A4.A10.A3.A3.A9.A 4.A6.8A5.5A14.8A10.5A9.5A$11.A6.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A 3.6A3.8A3.8A3.3A8.A13.A4.A9.A10.A10.A2.A2.A2.A15.A4.5A4.A7.8A2.A6.9A 10.5A3.A6.9A7.A13.A17.A18.A13.A$11.A6.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A 4.A4.2A4.A8.2A9.2A9.2A9.A13.A3.2A3.4A2.A4.4A2.A4.4A2.A2.A2.A2.A15.A6. A6.A7.A9.A6.A6.4A10.A5.A6.A6.4A5.A13.A17.A18.A13.A$11.A6.A5.A4.A5.A4. A5.A4.A5.A4.A5.A4.A5.A8.A10.A10.A10.A5.9A3.A4.A2.A2.A4.A2.A2.A4.A2.A 2.A2.A2.A2.A15.A6.A6.A7.A9.A6.A9.A10.A5.A6.A9.A5.66A$11.8A3.8A3.8A3. 8A3.8A3.8A3.3A8.A10.A10.A10.A5.2A10.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2. A2.A2.A15.A4.5A4.A5.5A7.A4.5A7.A8.5A3.A4.5A7.A70.A$11.A10.2A9.2A9.2A 9.2A9.2A9.2A9.A4.4A2.A3.8A4.7A5.A11.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A2. A2.A2.A15.A4.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.A3.A2.6A70.A$A10.A 10.A10.A10.A10.A10.A10.A10.A4.A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2. A3.A3.A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A 10.66A$A10.A10.A10.A10.A10.A10.A10.A10.A2.3A2.A2.A3.A11.A11.A11.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A 3.A3.A4.A3.A2.A10.A$A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2. A4.4A2.A3.2A2.A2.A3.A4.4A3.A4.4A3.A4.4A3.A3.5A2.A3.5A2.A3.5A2.A2.A2.A 2.A15.A4.5A4.A5.5A5.A6.5A2.A13.5A3.A4.5A2.A2.9A$A4.A2.A2.A4.A2.A2.A4. A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A3.A3.A2.A3.A4.A2. A3.A4.A2.A3.A4.A2.A3.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A6.A6.A 7.A7.A8.A4.A15.A5.A6.A4.A2.A18.6A$A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A 2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A3.A3.A2.A3.A2.3A2.A3.A 2.3A2.A3.A2.3A2.A3.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.11A5.A6.A6.A7. A7.A8.A4.A15.A5.A6.A4.A2.A18.A4.A39.10A$A3.2A2.A2.A3.2A2.A2.A3.2A2.A 2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.5A2.A3.A3.2A2. A3.A3.2A2.A3.A3.2A2.A3.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A2.A2.A11.2A5.A 4.5A2.3A7.6A2.A8.6A15.7A6.6A2.A2.17A4.15A20.A4.A8.A$A3.A3.A2.A3.A3.A 2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A3.A3.A3.A3.A3.A3.A3.A3.5A6.5A6.5A6.A2.A2.A12.A5.A4.A3.A2.A9.A4.A2. A11.A19.A13.A4.A2.A14.4A16.A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3. A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3. A3.A3.A3.A7.A10.A10.A6.A2.A2.5A8.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4. A2.A17.A16.A20.6A8.A$A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A 2.A3.5A2.A3.A2.2A2.A3.A3.5A3.A3.5A3.A3.5A7.A10.A10.A6.A2.A6.A8.A4.2A 4.A3.A2.A7.5A2.A2.A9.5A15.5A9.5A2.A2.A17.A5.5A6.A29.6A$A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.5A6.A3.A3. A3.A3.A3.A3.A3.A3.A3.A3.5A2.9A2.9A6.A2.A6.A7.2A3.3A4.5A2.3A5.A3.A2.A 2.A9.A3.A15.A3.A9.A3.A2.A2.A10.8A2.A2.A3.A6.A29.A3.4A$A3.A3.A2.A3.A3. A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A6.A6.A3.A3.A3. A3.A3.A3.A3.A3.A3.A3.A6.A10.A14.A2.A6.A7.6A8.A6.A5.A3.A2.A2.A9.A3.A 15.A3.A9.A3.A2.A2.A10.2A4.8A3.4A3.A29.A6.2A$A3.A2.2A2.A3.A2.2A2.A3.A 2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A6.A6.A3.A3.A2. 2A3.A3.A2.2A3.A3.A2.2A3.A6.A10.A14.A2.A5.2A7.A3.2A8.A6.A5.A3.A2.4A9.A 3.A15.A3.A9.A3.A2.A2.A10.A9.A2.A3.A2.A3.A3.27A6.4A$5A6.5A6.5A6.5A6.5A 6.5A6.5A6.5A6.5A2.5A3.5A7.5A7.5A7.A3.4A2.9A14.A2.A4.3A3.5A3.A9.8A5.5A 15.5A15.5A9.5A2.A2.A10.A12.5A2.A3.5A35.A$4.A10.A10.A10.A10.A10.A10.A 10.A6.A6.A11.A11.A11.A7.A3.A5.A11.12A2.A4.A5.A7.A10.A13.A19.A19.A13.A 4.A2.A10.A2.4A13.A43.A$4.A10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A 11.A7.A3.A5.A11.A13.A4.A4.2A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.A2.A 13.A20.24A$4.A10.A10.A8.3A10.A5.6A3.8A2.9A3.4A3.4A3.9A3.9A4.8A5.3A3.A 5.A11.A13.A3.2A3.3A7.A10.69A4.A2.A10.A2.A2.15A20.A21.4A$4.A10.A10.A8. A5.8A5.A8.A9.A11.A6.A6.A11.A12.A12.A5.A5.A3.9A3.11A3.6A9.A78.A4.A2.A 10.4A16.A20.A24.A$5A10.2A2.8A8.A5.A12.A8.A9.A11.A6.A6.A11.A12.A12.A5. A5.A3.A11.A8.2A3.A3.2A9.A78.A4.A2.A12.2A16.A20.A24.A$A15.A2.A15.A2.4A 12.A2.7A9.A2.10A6.A2.5A11.A2.11A5.8A2.4A5.A3.A11.A8.A4.A3.A10.80A4.A 2.A5.A6.A3.5A2.5A2.A12.6A2.8A7.5A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15. A2.A15.A2.A15.A9.A8.A3.A11.A8.A4.A3.A94.A2.A2.7A3.A3.A3.A2.A3.A2.A12. A4.A9.A7.A3.A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8. A3.A11.A8.A4.A3.A94.A2.A2.A2.A2.A3.5A3.4A3.4A12.A4.A9.A7.A3.A5.A$8A3. 6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A3.A11.A8.6A 3.96A2.A2.A5.A7.A3.A2.A3.A5.6A4.A3.2A9.A7.A3.A5.A$A6.A3.A4.A2.A6.A3.A 4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A 3.A4.A3.A11.A115.A2.A5.A7.5A2.5A5.A4.A4.A3.12A7.A2.2A5.A$A6.A3.A4.A2. A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4. A2.A6.A3.A4.A3.A10.2A115.A2.A5.A24.A4.A4.A3.A15.4A2.5A2.A$A6.A2.2A4.A 2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A 6.A2.2A4.A2.A6.A2.2A4.A3.A9.3A3.62A27.18A5.A2.A4.2A24.A3.2A4.A3.A15.A 2.A2.A3.A2.A$A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2. A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A3.A9.A5.A60.A2. A2.A21.A16.A5.A2.A4.15A2.10A3.7A3.A15.A2.4A3.A2.A$A5.2A2.A5.A2.A5.2A 2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A 5.A2.A5.2A2.A5.A3.A9.A4.2A60.10A18.A16.A5.A2.A4.A13.A2.A12.A9.7A9.A9. A2.A$A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A 3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A3.A8.2A3.3A7.4A3.5A44.A2.A2.A18.A6.7A3. A5.A2.A4.A13.A2.A12.A15.A9.A9.A2.A$A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A 3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3. 3A3.3A3.A3.4A5.6A9.A2.A3.A3.A44.A5.A4.15A6.2A3.6A5.A2.A4.A12.2A2.A7. 6A15.A9.A9.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A 7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A5.8A3.2A9.A2.5A3.A44.A5.A4. A20.A4.A10.A2.6A12.5A7.A3.4A7.7A9.8A2.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A 3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A 5.A10.A10.A10.A44.12A20.A4.A10.A2.A17.A11.A6.A7.A4.4A7.A5.5A2.A$A3. 10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A 2.A2.A3.10A2.A5.A10.A10.A10.A58.19A4.5A6.A2.A17.A6.6A6.A2.6A7.A7.A5.A 6.A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A 3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.3A10.A10.A10. A58.A16.4A6.A6.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A7.A5.A6.A$A2.3A2.A2.3A 2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A 2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A3.A12.A8.11A2.A 10.22A12.15A19.A6.A6.A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.2A6.A$A3.A3. A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2. A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.5A10.A20.A12.A 12.4A17.A5.2A6.A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.9A$A3.A3.A3.A3.A2. A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3. A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.A14.A20.A8.5A15.A17.A5. 9A2.A4.5A4.2A2.A6.8A4.A2.8A5.A7.A4.A$A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A 3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A 3.A3.A12.A8.A8.A14.A19.2A8.A2.4A13.A12.6A5.A10.A4.A3.A4.5A11.A6.A7.A 7.A5.5A2.A$A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A 2.A7.5A3.A2.A7.5A3.A3.A12.A6.5A5.2A14.A19.11A5.A7.7A12.A3.4A3.A10.A4. A3.A4.A2.4A9.A6.A7.A7.A5.A3.A2.A$A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2. A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A3.A12.A6.A3.A5.17A19.A15.A7.A4.4A 10.A6.A3.A5.6A4.A3.A4.A5.A6.7A3.A7.9A5.A3.A2.8A$A2.6A7.A2.A2.6A7.A2.A 2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A3.A12.A6.A3. A5.A14.4A17.A15.A2.6A7.A5.6A6.A3.A5.A3.4A2.5A4.A5.A6.A5.A3.A10.A3.5A 2.A3.A9.A$A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A 2.A2.A12.A2.A2.A12.A3.A12.A6.A3.A5.A17.A6.9A2.A15.A2.A3.4A5.A5.A3.4A 4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A2.5A9.A$A2.A12.A2.A2.A12.A2.A2.A 12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A3.A12.A6.5A5.5A 13.A6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A 4.A7.5A$A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A 2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A3.A12.A8.A11.A13.A6.A7.A2.A15.A2.A6. A5.A5.A6.A4.A3.A3.5A4.A4.A2.5A5.A6.7A3.A8.5A3.3A4.A7.A$A2.14A2.A2.14A 2.A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2.14A3.A12.A8.A11.A13.A4. 5A4.2A2.A13.3A2.8A5.A5.8A4.A3.A3.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A 6.6A2.A$A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A 8.8A4.A13.A4.A3.A4.5A13.A9.A7.A10.A6.A3.A3.A3.A4.A4.4A6.A2.A9.A4.3A8. A3.A3.A6.A4.A2.4A$A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A 7.A11.A12.A8.A6.A4.A13.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A3.A3.A3.A4.A7.A 6.A2.A9.A4.A10.A3.A3.A6.A4.A5.A$9A10.9A10.9A10.9A10.9A10.9A10.9A10.9A 11.A12.A8.A6.A4.A8.6A4.A3.A4.A5.A6.6A9.9A7.7A3.A3.A3.5A4.A7.8A2.A6.9A 10.5A3.A4.5A2.A5.A$8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.5A2.3A4.A 8.A3.4A2.5A4.A5.A6.A3.4A10.A3.5A4.A5.A3.A3.A5.A6.A7.A9.A6.A6.4A10.A5. A4.A3.A2.A2.4A$8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.A3.A2.A6.A8.A 6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A3.A5.A6.A7.A9.A6.A9.A10.A5.A4.A3.A 2.A2.A$8.9A10.17A2.A18.9A2.9A18.A2.17A10.9A11.A12.A6.A3.A2.A6.A8.A6.A 4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A3.A3.5A4.A5.5A7.A4.5A7.A8.5A3.A4.A3.A 2.4A$16.A26.A2.A26.A2.A26.A2.A26.A11.9A12.A6.A3.A2.A6.A6.5A4.A4.A2.5A 5.A4.5A4.A8.5A3.3A4.7A3.A3.A3.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4. 5A4.4A$16.A26.A2.A26.A2.A26.A2.A26.A11.A20.A6.5A2.8A6.A3.A4.A4.A2.A2. 5A2.A4.A3.A4.A8.A3.A3.A9.A6.A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A 6.A9.A$16.5A18.5A2.5A18.5A2.5A18.5A2.5A18.5A11.A20.A8.A10.4A4.A3.A4.A 4.4A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.3A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A 3.A3.A6.A9.A$16.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A4. 8A20.A8.A13.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A5.A3.5A4.A5.5A 5.A6.5A2.A13.5A3.A6.6A4.A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.6A8.A 4.5A4.A7.8A2.A4.5A4.A8.5A3.A6.9A5.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2. 3A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.A4.A6.3A6.A6.A7.A9.A6.A6.A 10.A5.A6.A6.4A3.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2.A$16.12A7.9A2.12A7. 9A2.12A7.9A2.12A7.9A4.A27.A8.A4.A6.A8.A6.A7.A9.A6.A6.A10.A5.A6.A9.A3. A3.5A2.3A7.6A2.A8.6A15.7A4.5A2.4A$16.A10.A7.A7.A2.A10.A7.A7.A2.A10.A 7.A7.A2.A10.A7.A7.A4.A27.A6.5A2.A2.5A6.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A 7.A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A4.4A$16.A10.A6.2A7.A2.A10.A6.2A 7.A2.A10.A6.2A7.A2.A10.A6.2A7.A4.A27.A6.A3.A2.A2.A2.4A4.A3.A4.A5.A3.A 5.3A4.A3.A4.A8.A3.A3.A4.A3.A2.6A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A7. A$16.A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A4.A27.A6.A 3.A2.A2.A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.A3.A2.A 7.5A2.A2.A9.5A15.5A6.A3.A7.A$16.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A 2.A9.2A6.A8.A4.A27.A6.A3.A2.4A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A 4.A3.A2.A8.A3.5A2.3A5.A3.A2.A2.A9.A3.A15.A3.A6.5A7.A$16.A9.A7.A8.A2.A 9.A7.A8.A2.A9.A7.A8.A2.A9.A7.A8.A4.A27.A6.5A11.A4.5A4.A5.5A5.A6.5A4.A 8.5A3.A4.5A2.A7.2A5.A6.A5.A3.A2.A2.A9.A3.A15.A3.A8.A9.A$16.A9.A7.A8.A 2.A9.A7.A8.A2.A9.A7.A8.A2.A9.A7.A8.A4.A27.A8.A11.3A6.A6.A7.A7.A8.A6.A 10.A5.A6.A4.A7.A6.A6.A5.A3.A2.4A9.A3.A15.A3.A8.A9.A$16.A9.10A7.A2.A9. 10A7.A2.A9.10A7.A2.A9.10A7.A4.A27.A8.A11.A8.A6.A7.A7.A8.A6.A10.A5.A6. A4.A7.A6.8A5.5A15.5A15.5A8.11A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A8.13A6.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A 7.A7.A13.A19.A19.A10.A$16.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A2.A 2.3A7.A2.A8.3A2.A2.3A7.A4.A27.A8.A4.A5.4A4.A3.A2.A9.A4.A2.A6.A3.A2.A 14.A13.A9.2A6.A13.A19.A19.A10.A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A9.A4.A2.A6.A3.A2.A 14.A13.A10.A6.66A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9. A3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A8.A71. A$16.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A4.A27.A8.A4.A 2.4A2.A4.5A2.3A5.A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A8.A71.A$16.A13.5A8.A 2.A13.5A8.A2.A13.5A8.A2.A13.5A8.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2. A2.A8.A6.A10.A3.A9.A3.A8.34A38.A$16.A13.A12.A2.A13.A12.A2.A13.A12.A2. A13.A12.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A8.A 3.A22.A5.A3.13A15.8A$16.A3.11A12.A2.A3.11A12.A2.A3.11A12.A2.A3.11A12. A4.A27.A8.A4.4A2.4A6.8A5.5A14.8A10.5A9.5A8.A3.A22.A5.A3.A10.2A15.A$ 16.A3.A22.A2.A3.A22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A21.A13.A17.A18.A 13.A10.A2.3A21.A2.A2.A3.A11.A5.6A4.A$16.A3.A22.A2.A3.A22.A2.A3.A22.A 2.A3.A22.A4.A27.A8.A21.A13.A17.A8.5A5.A13.A10.A3.A22.11A11.A5.A4.A4.A $16.A2.22A2.A2.A2.22A2.A2.A2.22A2.A2.A2.22A2.A4.A27.A8.64A3.21A10.A3. A25.A2.A15.A4.2A4.A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A 2.A2.A2.A6.A13.A2.A4.A27.A95.A10.5A43.2A3.3A4.A4.A$16.A2.A6.A13.A2.A 2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A4.A27.A95.A14.A43.6A 6.A4.7A$16.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A 4.A2.A2.A2.A2.A2.3A7.A4.A2.A4.A27.A53.43A14.8A36.A3.2A6.A4.A5.A$16.A 2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A 2.A2.A2.A3.A4.5A.A2.A2.A4.A27.A53.A62.39A3.A7.A4.A5.A$16.A2.A2.5A4.A 2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A4. A27.A53.A62.A41.A7.A2.A.A2.A2.A$16.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A 2.A2.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2.A4.A27.A53.A9.51A2.A41.A7.12A $16.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A4.A 27.A53.A9.A48.2A2.4A5.30A3.4A7.A4.A2.A$16.A2.13A8.A5.A2.13A8.A5.A2. 13A8.A5.A2.13A8.A7.A27.A53.A9.A49.A4.2A5.A4.A17.A4.2A5.2A7.A7.A$16.A 11.A11.A5.A11.A11.A5.A11.A11.A5.A11.A11.A7.A27.A53.A9.A34.12A3.A5.3A 3.A4.A17.A5.A6.6A2.A7.A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A 34.A10.A3.A6.6A2.5A13.5A3.A7.A3.A2.9A$16.A23.A5.A23.A5.A23.A5.A23.A7. A27.A53.A9.A34.A10.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$16.25A5.25A5.25A 5.25A7.A27.A42.12A9.A7.28A3.5A2.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$40. A29.A29.A29.A7.A23.5A42.A10.A9.A7.A30.A3.A2.12A7.A3.A13.A3.A3.9A3.4A 7.A$40.A29.A29.A29.A7.A23.A3.5A38.A10.A9.A7.A30.A3.A21.5A13.5A10.3A5. A7.A$40.6A24.17A2.12A29.A7.A23.A3.A3.A38.A10.12A6.A30.A3.A23.A17.A14. A5.3A5.A$45.A40.A2.A40.A7.A23.A3.A3.A38.A10.A5.A3.A7.A30.A2.2A23.A17. A14.A7.A5.A$45.A40.A2.A40.A7.A22.3A2.A2.3A37.A10.A5.A3.A7.A27.4A2.4A 17.7A10.14A6.A7.A5.A$45.7A34.A2.7A34.A4.4A23.A3.A3.A38.A7.A2.A2.A2.A 2.3A6.A19.5A3.A2.A2.A2.A17.A5.A10.A7.A4.A6.A7.A5.A$45.A4.12A7.13A.A2. A2.A4.12A7.13A.A2.A4.A26.A3.A3.A38.A4.13A3.A7.A19.A3.A3.A2.4A2.A17.A 5.A10.A7.A4.A6.A6.2A5.A$45.A4.A10.A7.A10.7A2.A4.A10.A7.A10.7A4.A25. 10A38.A4.A2.A5.A2.A3.A7.A16.4A3.5A8.A17.A5.A10.4A4.A2.5A4.A6.5A2.A$ 45.A4.A10.A7.A10.A2.A2.A2.A4.A10.A7.A10.A2.A2.A4.A26.A7.A38.A4.A2.A8. 5A7.A2.5A2.5A2.A2.A3.A3.A8.A3.7A7.A3.5A10.4A2.A2.A3.A4.A2.5A6.A$45.A 3.3A2.5A2.A7.A2.5A3.A5.A2.A3.3A2.5A2.A7.A2.5A3.A5.A4.A26.A7.34A5.A4.A 2.A8.A11.A2.A3.A2.A3.A2.A2.5A3.A7.2A3.A5.A7.A3.A3.A10.A2.A2.A2.A3.A4. A2.A3.A6.A$45.A4.A3.A3.A2.A7.A2.A3.A3.A5.A2.A4.A3.A3.A2.A7.A2.A3.A3.A 5.A4.A26.A39.2A5.A4.A2.10A11.4A3.4A3.4A10.A7.6A5.A7.A3.A3.A8.3A2.4A2. A3.A4.A2.A3.A6.A$45.A4.A2.3A2.A2.A7.A2.A2.3A2.A5.A2.A4.A2.3A2.A2.A7.A 2.A2.3A2.A5.A4.A26.A40.A5.A4.A11.8A4.A2.A3.A2.A3.A2.A9.2A7.A3.4A3.A7. A3.A3.A8.A10.5A4.A2.A3.A6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A 26.A40.A5.A3.2A18.A4.A2.5A2.5A2.A9.10A6.A3.A7.A3.5A8.A12.A6.A2.2A2.A 6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A26.A40.A4.2A3.10A10.A4.A 16.A9.A15.A3.A7.A5.A10.3A10.A6.A6.A6.A$45.17A7.18A2.17A7.18A4.A26.A 39.2A3.3A3.A8.8A3.A4.A16.11A15.A3.A7.A5.A12.A2.9A6.A6.A6.A$45.A15.A7. A16.A2.A15.A7.A16.A4.A26.A39.6A5.A15.A3.A4.A42.A3.A7.A3.5A10.A2.A7.A 6.A5.3A5.A$45.A15.A6.2A16.A2.A15.A6.2A16.A4.A17.10A39.A3.2A5.A15.A3.A 4.A42.A3.A7.A3.A3.A8.3A2.A7.A6.A6.A6.A$45.A4.12A6.16A2.A2.A4.12A6.16A 2.A4.A17.A48.A3.A6.9A7.A3.A4.A5.5A2.5A2.5A18.A3.A7.A3.A3.A8.A4.4A2.5A 4.A6.A6.A$45.A4.A9.2A6.A17.A2.A4.A9.2A6.A17.A4.A17.A48.A3.A14.A6.2A3. A4.A5.A3.A2.A3.A2.A3.A18.A3.A5.3A3.A3.A8.A7.A2.A3.A4.A4.10A$45.A4.A9. A7.A17.A2.A4.A9.A7.A17.A4.6A12.A48.A3.A14.A6.3A2.A4.A2.4A3.4A3.4A3.5A 14.A3.3A3.A5.5A8.A7.A2.A3.A4.A4.A$45.A14.A7.A13.5A2.A14.A7.A13.5A4.A 4.A12.4A14.32A3.11A4.A6.A4.A4.4A2.A3.A2.A3.A2.A3.A3.A14.A5.A3.A7.A10. 5A3.A2.A3.A4.A4.A$45.A14.10A12.A6.A14.10A12.A8.A4.A14.2A14.A43.7A2.5A 4.A4.A2.A2.5A2.5A2.5A3.A2.13A5.A3.5A3.A13.6A2.5A4.A4.A$45.12A3.A3.A3. A13.A6.12A3.A3.A3.A13.A8.A4.A15.9A6.A43.A3.A4.A3.A4.A4.A2.A24.A2.A10. 5A2.A6.9A10.A3.2A4.A6.A4.A$56.A2.3A2.A2.3A12.A17.A2.3A2.A2.3A12.A8.A 3.2A16.A6.A6.A43.A3.A4.A3.A4.A4.A2.A23.2A2.A14.A2.A6.A7.A10.A3.A5.A6. A4.A$56.A3.A3.A3.A13.A17.A3.A3.A3.A13.A8.A3.15A3.A6.A6.A4.40A2.3A3.2A 2.A4.A4.A2.A2.5A16.5A7.A6.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A13. A17.A3.A3.A3.A13.A8.A3.A4.A7.2A3.A5.2A6.A4.A38.A3.A8.A4.A4.A2.A2.A3.A 16.A11.A6.A2.A6.A5.8A5.A3.7A6.A4.A$56.A3.A3.5A13.A17.A3.A3.5A13.A8.A 3.A4.A8.5A5.5A3.A4.A38.A3.A8.A4.A4.A2.4A3.18A11.3A4.A2.A6.A5.A6.A5.A 16.A4.A$56.A3.5A17.A17.A3.5A17.A8.A3.A4.A11.4A3.A2.6A4.A22.5A11.A3.4A 5.A4.A4.A40.A4.A2.A6.A5.A6.A5.A16.A4.A$56.A7.A17.A17.A7.A17.A8.A3.A4. A14.A3.A2.A9.A22.A3.A10.2A3.A2.A4.3A3.A4.A40.A4.A2.A6.A5.4A3.A2.4A16. A4.A$56.A7.16A2.A17.A7.16A2.A8.A3.A4.A2.2A10.A3.A2.A9.A22.A3.A10.3A2. A2.A5.A4.A4.A33.5A2.A4.A2.A6.A7.6A2.A19.A4.A$56.A13.A8.A2.A17.A13.A8. A2.A8.A3.A4.A3.A10.A3.A2.4A6.A22.A3.A6.5A4.A2.A5.A4.A4.A12.6A8.4A3.A 3.A2.A4.A2.A6.4A4.A7.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A4.A3. A10.A3.A4.9A22.A2.2A6.A3.A4.A2.A5.6A2.3A12.A4.A8.A2.A3.A3.A2.A4.A2.A 8.7A7.A19.A4.A$56.A9.A2.3A2.A4.A2.A17.A9.A2.3A2.A4.A2.A8.A3.A4.5A10.A 3.A4.A27.4A2.4A4.A3.A4.A2.A5.A7.A14.A4.10A2.5A3.A2.A4.A2.A8.A13.A19.A 4.A$56.A9.A3.A3.A.A2.A2.A17.A9.A3.A3.A.A2.A2.A8.A3.A4.A14.A3.A4.A12. 5A2.5A3.A2.A2.A2.A4.A3.A4.A2.A5.A7.A8.8A22.2A2.A4.A2.A8.A13.A19.A4.A$ 56.A9.5A3.6A2.A17.A9.5A3.6A2.A8.A3.A4.A14.A3.A4.A12.A3.A2.A3.A3.A2.4A 2.A4.2A2.A4.A2.A5.A7.4A5.A5.A23.5A4.A2.A8.4A10.A19.A4.A$56.A19.A2.A2. A17.A19.A2.A2.A8.A3.A3.2A14.A3.A4.A2.5A2.4A3.4A3.5A8.A8.A4.A2.A5.A9. 2A5.A5.A2.5A2.5A2.5A2.A8.A2.A10.13A3.17A4.A$56.A22.4A17.A22.4A8.A3.A 3.12A4.A3.A4.A2.A3.A2.A2.A3.A2.A3.A3.A8.A8.A4.A2.A5.A10.3A3.A2.A2.A2. A3.A2.A3.A2.A3.A2.A8.A2.A10.A15.A6.A13.A$56.A22.A20.A22.A11.A3.A3.A9. 7A3.A4.4A3.4A2.5A2.5A3.A7.2A7.3A3.A2.A5.A11.15A3.4A3.4A3.5A7.A2.A8.3A 15.A6.A13.A$56.24A20.24A11.A3.A3.A9.A5.A3.A4.A2.A3.A2.A17.A7.7A3.A4.A 2.A4.2A3.5A3.A3.A3.A.A3.A3.A2.A3.A2.A3.A3.A7.A2.A8.A12.6A4.5A11.A$79. A43.A11.A3.A3.A.A7.A5.A3.A4.A2.5A2.A16.2A7.A5.A3.A4.A2.A4.6A2.2A3.A3. A5.A3.5A2.5A2.5A3.A7.A2.A8.A12.A9.A3.A11.A$79.A43.A11.A3.A3.7A3.A5.A 3.A4.A9.A16.10A5.A3.A4.A2.A2.3A3.2A3.5A3.A5.A24.2A7.A2.A8.A12.A9.A3.A 11.A$79.7A34.A2.A11.A3.A5.A3.A3.A5.A3.A4.A9.15A2.A14.A3.A4.A2.A2.2A4. A7.3A2.7A24.5A4.A2.A8.A10.5A7.A3.A11.A$85.A2.A5.5A11.5A3.6A7.5A3.A5.A 3.A3.A5.A3.2A3.A23.A2.A14.A3.6A2.A2.A5.A9.A8.A3.5A2.5A9.A3.A4.A2.A8.A 4.4A2.A3.A7.5A11.A$85.6A3.A3.A11.A3.A3.A.A2.A7.A6.3A4.A2.3A2.A5.A4.A 3.A23.4A14.A3.A7.4A3.3A9.A8.A3.A3.A2.A3.A2.8A3.A4.A2.A8.A4.A2.A2.A3.A 9.A13.A$85.A2.A.A2.3A2.A11.A2.3A2.A4.A7.A7.A5.A3.A9.A4.A3.A41.A3.A14. 2A10.A8.5A3.A2.A3.A2.A10.A4.A2.A8.A4.A2.A2.A3.A9.A13.A$85.A8.A19.A8.A 7.5A3.A5.A3.A9.A4.A3.A3.5A33.A3.A14.A8.4A16.4A3.4A10.A4.A2.A8.A4.A2.A 2.5A7.5A11.A$85.A8.A19.A8.A3.2A2.A3.A3.A3.13A3.A4.A3.A3.A3.A6.5A2.5A 2.5A8.A3.5A10.A8.A40.A4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.16A7.16A3.A3.A 3.A3.A3.A3.A3.A3.A3.A4.A3.A3.A3.A6.A3.A2.A3.A2.A3.A8.A7.A10.A8.A40.A 4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.A14.A7.A14.A3.A3.A3.A3.A3.A3.A3.A3.A 3.A4.A3.A3.A3.A3.4A3.4A3.4A3.5A4.A7.A10.A8.A12.5A13.5A5.A4.A2.A8.A4.A 2.6A9.A3.A11.A$85.A14.A6.2A14.A3.5A3.A3.5A2.3A2.A3.A3.A4.A3.A3.A3.5A 2.A3.A2.A3.A2.A3.A3.A3.2A7.A10.A8.A12.A3.A13.A3.A5.A4.A2.A8.A4.A7.A9. 5A11.A$85.A2.13A6.14A2.A3.A3.A3.A6.2A3.A3.A3.A3.A4.A3.A3.A7.A2.5A2.5A 2.5A3.A3.6A3.A10.A8.A9.4A3.4A3.5A2.A3.A5.A4.A2.A8.A4.A7.A11.A13.A$85. A13.2A6.A15.A3.A3.A3.A6.A4.A3.A3.A3.A4.A3.A3.A7.A24.A3.A4.A3.A10.A8.A 2.5A2.A2.A3.A2.A3.A3.A2.A3.A5.A4.A2.A8.A4.A5.5A9.A13.A$85.A13.A7.A15. A3.A2.2A3.A6.A3.6A3.A3.A4.A3.A3.A7.A23.2A3.A4.A3.A10.A8.A2.A3.A2.A2. 5A2.A3.A3.A2.A2.2A5.A4.A2.A8.A4.A5.A3.A5.8A10.A$85.9A5.A7.A15.A3.A2. 3A2.A6.A4.A7.A3.A4.A3.A3.A7.A2.5A16.6A4.A3.A10.A8.4A3.4A9.5A3.4A2.5A 2.A4.A2.A8.A4.A5.A3.A5.A6.A10.A$93.A5.10A14.A3.A2.A4.A6.A4.A7.A3.A4.A 3.A3.A7.A2.A3.A16.A3.4A2.A3.A10.A8.A2.A3.A2.A9.A3.A3.A2.A2.A3.A2.A4.A 2.A8.A2.3A5.A3.A5.A6.A10.A$93.A5.A3.A3.A15.A3.4A4.A6.A3.2A7.A3.A4.A3. A3.A7.4A3.18A6.A2.A3.A10.A8.A2.5A2.7A3.A3.A3.A2.4A3.A2.A4.A2.A8.A2.A 7.5A5.A4.5A8.A13.8A$93.A4.3A2.A2.3A14.A11.A6.A3.6A3.A3.A4.A3.A3.A38.A 2.A3.A10.A8.A15.A3.A3.5A9.A7.A2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A 3.A3.A15.A11.A6.A3.A4.A3.A3.A4.A3.5A38.A2.A3.A10.A8.A15.A2.2A16.2A7.A 2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15.A11.A5.2A3.A4.A3.A3.A 4.A3.A26.5A6.6A2.A3.A10.A8.A15.A2.4A14.7A2.A2.A8.A2.A2.8A7.A4.A3.A8.A 11.5A4.A$93.A5.5A3.A15.A5.7A5.6A4.A3.A3.A4.A3.A26.A3.A6.A7.A3.A10.A8. A15.A2.A2.A14.A5.A2.A2.A8.A2.A2.A6.A7.A4.5A8.A11.A3.A4.A$93.A9.5A15.A 5.A9.3A3.2A4.A3.A3.6A3.A21.6A3.4A3.A7.A3.A10.A8.A15.4A2.16A5.A2.A2.A 8.A2.A2.A6.4A4.A6.A10.A11.A3.A4.A$93.A9.A19.A5.A9.2A4.A5.A3.A3.A4.A3. A2.5A5.5A4.A4.A3.A2.A3.A7.A3.A10.A8.A41.2A2.A2.A8.A2.A2.5A2.A2.A4.A6. A10.A11.A3.A4.A$93.A4.6A19.A4.2A9.A5.A5.A3.A3.A4.A3.A2.A3.A5.A3.A4.A 4.5A2.A3.A7.A3.A10.A8.A41.5A2.A8.A2.A5.5A2.A4.4A3.A10.A11.5A3.2A$93.A 4.A24.A4.12A5.A5.A3.A3.A4.A3.4A3.7A3.8A9.A3.A7.A3.A10.A8.A12.5A5.5A 14.A6.A8.A2.A5.A6.A6.9A7.A5.5A3.A5.4A$93.A4.A24.A4.A14.3A5.A3.A3.A4.A 3.A2.A3.A2.A2.A3.A2.A3.A9.A3.A7.A3.A10.A8.A12.A3.A5.A3.A6.9A6.A8.A2.A 5.A6.A6.A7.A7.A5.A3.A3.A5.A2.A$93.A2.28A4.A14.2A6.A3.A3.A4.A3.A2.5A2. A2.5A2.A3.A9.A3.A7.A3.A10.A8.A9.4A3.7A3.5A2.A6.4A4.A8.A2.A5.A4.5A4.A 7.A7.A2.4A3.11A2.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.2A9. A3.A7.A3.A10.A8.A9.A2.A3.A2.A2.A3.A3.A2.A9.A4.A8.A2.A5.A4.A3.A4.A5.8A 2.A2.A2.A3.A2.A9.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.9A2. A3.A7.A3.A10.A8.A9.A2.5A2.A2.5A3.A2.A9.A4.A8.A2.4A2.A4.A3.A4.A5.A6.A 2.A2.A2.5A2.A9.A$93.A2.A2.A2.3A2.A2.3A2.A3.A8.4A7.5A7.A3.A3.A4.A3.A3. 7A9.A2.A6.5A3.A7.A3.A10.A8.A9.A9.A10.A2.A4.6A4.A8.A4.5A4.A3.A4.A5.A6. A2.A2.A9.A9.A$93.A2.A2.A3.A3.A3.A3.A3.A8.A2.A7.A2.6A3.A3.A3.A4.A3.A3. A15.A2.A6.A7.A7.A3.A10.A8.A9.A9.A10.A2.A4.A3.4A2.A8.A4.A2.2A4.5A4.A5. 4A3.A2.A2.A8.2A9.A$93.A2.A2.5A3.A3.A3.A3.A8.A2.A2.3A2.A7.A3.A3.A3.A4. A3.A3.A15.4A5.2A7.A7.A3.A10.A8.A9.7A3.A2.6A2.A2.A4.A6.A2.A8.A4.A2.A7. A6.A7.6A2.A2.A8.9A2.A$93.A2.A10.5A2.3A2.A3.6A2.A3.A3.A7.A3.A3.A3.A4.A 3.A3.13A12.10A7.A3.A10.A8.A2.5A2.A5.A3.A2.A3.5A2.A4.A6.A2.A8.A4.A2.A 7.A6.4A4.A7.A2.10A6.5A$93.A2.A13.2A3.A3.A3.A3.2A2.A3.A3.A7.A3.A3.A3.A 4.A3.A15.A12.A7.4A5.A3.A10.A8.A2.A3.A2.A5.A3.A2.A3.A6.A4.8A2.A7.2A4.A 2.9A8.7A7.A2.A15.A$93.A2.A13.A4.A3.A3.A3.A3.9A7.A3.A3.A3.A4.A3.A15. 14A10.A5.A3.A10.A8.4A3.4A3.3A3.4A3.A6.A9.A4.A6.3A4.A19.A13.A2.A15.A$ 93.A2.A7.A5.A4.A3.A3.A3.A11.A2.3A2.A3.A3.A3.A4.A3.A3.5A31.A5.A3.A10.A 8.A2.A3.A2.A3.A11.2A6.A9.A4.A6.A6.A19.A13.A2.A15.3A$93.A2.20A3.A3.A3. A11.A3.A3.A3.A3.A3.A4.A3.A3.A3.A31.A5.A3.A10.A8.A2.5A2.A2.2A11.9A2.8A 4.4A3.A6.18A2.A13.A2.A2.5A10.A$93.A10.A9.6A3.A3.A11.A3.A3.A3.A3.A3.A 3.2A3.A3.A3.A3.4A2.4A2.17A5.A3.A10.A8.A9.A2.4A2.4A3.A10.A13.2A3.A22. 5A13.A2.A2.A3.A2.A7.A$93.A25.A3.A3.A11.9A3.A3.A3.A3.3A2.A3.A3.A3.A2.A 2.A2.A2.A21.A3.3A8.A8.A9.A2.A2.A2.A2.A3.A10.A14.A3.A22.A17.A2.4A3.8A 2.2A$93.A25.A3.A3.A19.A3.A3.A3.A3.A4.A3.A2.2A3.A2.4A2.4A21.A5.A8.A8.A 9.4A2.4A2.5A10.12A3.A3.A21.2A17.A5.A3.A2.A2.6A$93.27A3.A3.A8.A10.A3.A 3.A3.5A4.5A2.6A33.A5.A8.A8.A28.5A14.A3.A2.2A20.3A17.A5.5A5.A$119.A3.A 3.A5.15A3.A3.A16.A2.A29.6A2.2A5.A8.A8.A28.A3.A14.A3.A2.4A18.A19.A15.A $119.A3.A3.A5.A2.A14.A3.A16.4A29.A3.6A4.2A7.2A8.30A3.16A2.2A2.A2.A17. 2A18.2A14.2A$87.2A30.A3.A3.A5.A21.A49.A3.A9.4A5.4A57.5A2.A17.4A16.4A 12.9A$88.32A3.A3.A5.A21.A49.A3.A9.A2.A5.A2.A57.A6.A17.A2.A16.A2.A12.A 7.A$87.2A29.6A3.79A3.11A2.7A2.59A6.19A2.18A2.14A! golly-3.3-src/Patterns/Self-Rep/Devore/Devore-rep.rle0000644000175000017500000034607213151213347017404 00000000000000# The Devore variation of the Codd self-replicating computer, # Devore, J. and Hightower, R. (1992) # Third Workshop on Artificial Life, Santa Fe, New Mexico, # Original work carried out in the 1970s though apparently never published. # Reported by John R. Koza, "Artificial life: spontaneous emergence of # self-replicating and evolutionary self-improving computer programs," # in Christopher G. Langton, Artificial Life III, Proc. Volume XVII # Santa Fe Institute Studies in the Sciences of Complexity, # Addison-Wesley Publishing Company, New York, 1994, p. 260. # # Zoom in on the left-hand end of the line to see the main machine. A step size # of 8^7 or higher will be needed, as replication takes 1.02E11 generations. # # See make-Devore-tape.py for the script that wrote the tapes for this machine, # and for more information about the encoding. See the other patterns in this # folder for information about the machine body. # # John Devore writes: (part IV) # "Where Codd used two read heads, one to read the program and a parallel one # to read the "marker" tape, I used a single head that could "look" either left # or right so read both. Also, as I recall I made my branches "relative" to the # current position and could branch forward or backward from the current # instruction. I think Codd used absolute addressing so had to go back to the # start of the program and count entry points to the address." # # I asked John: "You say you worked on an IBM 360/50 computer. Without a # monitor, is that right? So you would load your machine into memory and ask for # a printout after N iterations, or something like that? (I have heard about # such days but never experienced them.)" # # And John said: "Yes. I started with all 1's and 0's (which I printed as blanks # for readability) except for the injection signals on an injection head. I # printed a snapshot every 100 steps during sheathing (takes about 600 to # complete) and every 1000 to 5000 after that. Each snapshot was printed on 9 # sheets of wide (white -- really lost something on the standard green-bar # paper) band printer paper. I disabled page skips so only had to cut one edge # of two three-page sets and tape into the 3x3 with two strips of tape. I also # used 8-lines/inch instead of the standard 6 so almost had square cells -- # 10/inch across x 8/inch high. I still have a stack of printouts that have # never been trimmed and taped." # # Thanks to Ron Hightower and John Devore for getting us to the point where we # can run this pattern in Golly. Contact: tim.hutton@gmail.com # x = 106968, y = 244, rule = Devore 18.10A2.14A2.17A2.15A2.16A2.17A2.11A2.103A$18.A8.A2.A12.A2.A15.A2.A 13.A2.A14.A2.A15.A2.A9.A2.A101.A$14.5A8.4A12.4A15.4A13.4A14.4A15.4A9. 4A101.A$17.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A2.78A4.A16.A$17.A11.A 15.A18.A16.A17.A18.A12.A3.A76.A4.A16.A$14.4A8.4A12.4A15.4A13.4A14.4A 15.4A9.4A3.A76.6A16.A$14.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A4.2A2. 69A5.A21.A$14.A11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.10A$14.A 11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.2A6.5A$5.7A2.A5.4A2.A9.7A 12.7A11.6A6.9A2.A8.7A3.A7.6A5.A3.A13.5A5.5A5.5A23.8A4.A12.A10.2A$5.A 5.A2.A5.A2.A2.A9.A4.4A10.A4.4A9.A3.4A4.A7.A2.A8.A5.A3.A7.A3.4A3.A3.A 13.A3.A5.A3.A5.A3.A23.A6.A4.A12.A11.3A$5.A5.A2.A5.A2.A2.A4.6A7.A5.6A 7.A9.A6.A4.A7.A2.A8.A5.A3.A7.A6.A3.A3.5A3.7A3.7A3.7A3.14A10.A6.A4.A 12.A12.11A$6A5.A2.A5.A2.4A4.A3.4A5.A5.A3.4A5.A4.6A6.A2.5A4.2A2.A8.A4. 2A3.A7.A6.A3.A7.A3.A2.A2.A3.A2.A2.A3.A2.A2.A3.A6.A5.A10.A6.A4.A11.2A 3.5A4.A9.A$A3.4A3.A2.A5.A4.4A2.A6.A5.A5.A6.A5.A4.A3.4A4.A2.A3.A4.5A6. 5A2.6A5.5A4.A3.A7.A3.A2.A2.5A2.A2.5A2.A2.5A6.A5.A10.3A2.5A2.A11.6A2. 2A4.A9.A$A6.A3.A2.A5.A7.A2.A6.A5.A5.A6.A5.A4.A6.A4.A2.A3.A4.A2.4A4.A 3.A2.A3.5A2.A3.A4.A3.A7.A3.A2.A9.A9.A13.A5.A12.A2.A3.A2.A9.3A3.2A3.6A 9.5A92.22A$A6.A2.2A2.A3.5A5.A2.8A5.A5.8A5.A4.A6.A4.A2.A3.A4.A5.A4.A3. A2.A7.A2.A3.A4.A3.A3.5A3.A2.A9.A9.A13.A3.8A7.A2.A3.A2.A9.2A4.A8.3A4. 2A2.A3.A92.A20.A$8A2.5A3.A3.A5.A7.A7.A10.A7.A4.8A4.A2.5A4.A5.A4.A3.A 2.A7.A2.A3.A4.A3.A3.A7.A2.A6.4A3.7A4.6A3.A3.A6.A7.A2.A3.A2.A9.A5.A10. A4.A3.A3.A92.A20.A$5.A4.A7.A3.A5.A7.A7.A10.A7.A9.A6.A4.A6.A5.A4.5A2. 4A4.A2.5A4.A3.A3.A7.A2.A6.A6.A10.A3.6A3.A6.A5.3A2.5A2.11A5.A10.A4.A3. A3.A92.A3.9A$5.A4.A7.A3.A5.A7.9A10.9A9.A6.A4.A6.A5.A6.A7.A2.3A4.A6.A 3.A3.A7.A2.A5.2A5.2A10.A3.A3.2A3.4A3.A5.A6.A20.2A9.A4.5A3.A92.5A7.A9. A2.206A.A.23A.A.35A.A.33A.A.31A.A.35A.A.29A.A.22A.A.A.A.A.A.A2.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A .A.4A.A.A.2A.A.4A.A.A.A.A.2A.A.3A.A.2A.A.A.A.2A.A.3A.2A.A.A.A.2A.A.4A .A.A.A.A.2A.A.4A.A.A.A.2A.A.3A.A.2A.A.3A.A.A.A.A.A.A2.2A.A.2A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.9A.A.A.9A.A. A.A.A.8A.A.2A.A.A.A.8A.2A.A.A.A.9A.A.A.A.A.9A.A.A.A.8A.A.2A.A.10A.A. 2A.A.A.A.A2.2A.2A.A.A.A.A.2A.2A.156A.A.5A.A.2A.A.A.4A.A.2A.A.A.A.A.4A .2A.A.A.A.A.5A.A.A.A.A.4A.A.2A.A.A.A.A.4A.A.2A.A.A.A.4A.2A.A.A.4A.A. 2A.A.A.A.A.A2.2A.2A.A.A.A.A.2A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.3A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A .A.A.3A.A.A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.A2.2A.2A.A.A .A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.9A.A.A .9A.A.A.A.A.8A.A.2A.A.A.A.8A.2A.A.A.A.9A.A.A.A.A.9A.A.A.A.8A.A.2A.A. 8A.A.2A.A.A.A.A2.3A.A.A.A.A.A.A.2A.A.2A.138A.A.5A.2A.4A.A.2A.A.A.4A.A .2A.A.A.A.A.4A.2A.A.A.A.A.5A.A.A.A.A.4A.A.2A.A.A.A.A.4A.A.2A.A.A.A.4A .2A.A.A.4A.A.2A.A.A.A.A2.21A.A.A.A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.3A.2A.A.2A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A. A.2A.2A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A2. 11A.A.5A.A.A.A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.3A.2A.A.2A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A2.4A.2A.A.A.3A.A.A.A. 2A.2A.16A.A.2A.A.A.A.A.A.A.10A.A.2A.10A.A.2A.10A.2A.A.A.A.3A.2A.A.2A. 12A.2A.A.3A.14A.A.2A.A.2A.A.20A.A.12A.A.2A.A.A.15A.A.A.A.15A.A.A.2A.A .9A.A.2A.2A.A.15A.A.2A.A2.6A.A.2A.A.A.3A.A.A.A.2A.2A.3A.A.2A.A.2A.A.A .A.A.A.A.3A.2A.A.2A.3A.2A.A.2A.3A.2A.2A.A.A.A.3A.3A.9A.2A.2A.A.3A.2A. A.2A.2A.A.2A.A.2A.A.3A.2A.A.2A.2A.9A.3A.A.A.8A.2A.2A.2A.A.A.8A.2A.3A. A.A.2A.A.3A.A.3A.A.2A.2A.A.3A.A.2A.2A.A.2A.A2.23A.A.A.A.3A.A.A.A.2A. 2A.3A.A.2A.2A.A.A.29A.15A.15A.15A.11A.3A.3A.A.2A.2A.A.3A.2A.A.2A.2A.A .2A.A.2A.A.3A.2A.A.2A.2A.3A.A.3A.A.A.2A.2A.A.12A.A.2A.2A.2A.A.12A.2A. 2A.A.3A.A.3A.A.2A.2A.A.3A.A.2A.2A.A.2A.A2.3A.A.A.2A.2A.11A.4A.A.2A.A. A.2A.2A.3A.A.2A.2A.A.A.2A.A.2A.3A.A.3A.2A.A.3A.A.4A.2A.A.3A.A.4A.2A.A .3A.A.4A.2A.2A.A.3A.3A.A.2A.2A.A.3A.4A.2A.2A.A.2A.A.2A.A.5A.2A.10A.A. 4A.A.12A.2A.2A.A.2A.9A.2A.A.2A.2A.A.2A.9A.2A.2A.8A.A.3A.A.2A.2A.A.3A. A.2A.13A2.3A.A.A.2A.2A.4A.A.13A.A.2A.A.A.2A.A.11A.A.7A.2A.A.A.2A.A.2A .3A.A.10A.A.3A.A.11A.A.3A.A.11A.A.3A.A.4A.2A.2A.A.3A.2A.2A.10A.A.2A. 12A.A.12A.A.10A.2A.3A.2A.A.3A.2A.9A.2A.2A.2A.A.2A.3A.A.2A.A.2A.2A.A. 2A.3A.A.2A.A.9A.2A.2A.A.2A.2A.A.4A.9A.3A2.44A.A.2A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.11A.A.A.13A.5A.7A.A.A.2A.A.4A .2A.A.4A.A.A.A.2A.A.2A.2A.2A.A.A.A.3A.A.A.3A.A.A.2A.A.4A.2A.2A.A.3A. 2A.2A.3A.2A.A.12A.2A.A.4A.2A.2A.8A.A.3A.2A.3A.2A.A.3A.2A.3A.A.2A.2A. 2A.A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A.2A.A.3A.2A.A.2A.A.2A.2A.A.4A.3A.A. 3A2.2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.3A.2A.A.5A.2A.6A.A.2A.A.2A.2A.5A.A.A.2A.A.4A.2A.A. 3A.2A.A.17A.2A.2A.A.A.A.3A.A.A.3A.A.A.2A.A.4A.11A.3A.2A.2A.3A.2A.A.3A .2A.A.2A.A.4A.2A.2A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.2A.2A.A.2A. 16A.A.2A.2A.A.2A.16A.A.3A.A.2A.11A.2A.A.5A.A.4A.A.3A2.2A.A.2A.A.A.A.A .A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. 3A.3A.2A.2A.2A.2A.A.A.2A.A.2A.3A.A.A.2A.A.4A.2A.A.3A.2A.A.3A.A.3A.3A. 12A.2A.15A.9A.A.2A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.A.3A.2A.A.2A.A.4A.2A. 2A.2A.A.2A.2A.2A.10A.A.3A.2A.16A.2A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A .2A.A.2A.3A.3A.10A.A.18A2.19A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.2A.2A.2A.A.A.2A.A.2A.22A.A.11A.A. 7A.A.2A.3A.A.3A.13A.2A.2A.A.A.3A.A.3A.A.2A.A.3A.2A.A.3A.3A.2A.2A.10A. A.3A.2A.8A.A.11A.2A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.2A.2A.A.2A.2A.A.A. 2A.2A.A.2A.2A.A.2A.A.2A.3A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.A.10A.A.2A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.10A.2A. 3A.A.A.4A.A.2A.A.A.A.A.A.3A.A.2A.A.2A.3A.9A.5A.3A.2A.2A.A.A.4A.A.2A. 4A.A.2A.2A.A.3A.2A.A.3A.3A.3A.A.2A.2A.6A.A.3A.2A.A.3A.A.2A.A.2A.3A.A. 2A.2A.3A.A.3A.A.A.18A.2A.A.A.18A.2A.A.2A.A.2A.3A.2A.2A.A.2A.2A.2A.A. 2A.A2.2A.2A.A.4A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.3A.3A.2A.2A.4A.2A.12A.A.2A.A.A.A.A.A.3A.A.2A.A.2A.13A.A. 3A.3A.2A.A.9A.A.10A.8A.A.2A.2A.A.20A.3A.3A.A.3A.A.2A.A.3A.2A.A.3A.A. 2A.A.2A.10A.A.3A.2A.3A.14A.2A.9A.2A.2A.A.A.11A.2A.2A.A.A.2A.A.2A.10A. 2A.A.12A.A.2A.A2.2A.A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.2A.16A.2A.A.A.A.A.A.A.10A.2A.2A.2A .A.A.3A.A.3A.3A.2A.A.3A.A.3A.A.3A.A.4A.2A.A.3A.A.2A.2A.A.3A.A.2A.A.A. 3A.2A.2A.10A.2A.2A.A.20A.A.2A.A.11A.A.3A.A.3A.2A.3A.2A.A.2A.2A.2A.3A. A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.8A.2A.3A.A.11A.2A.A.2A.A2.8A.A.2A.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.4A. A.3A.A.2A.A.A.2A.2A.A.A.A.A.A.A.3A.2A.2A.2A.2A.A.A.17A.3A.2A.A.3A.A. 3A.A.3A.A.11A.A.15A.A.3A.A.2A.A.A.3A.2A.2A.3A.2A.A.7A.2A.A.A.3A.A.2A. A.4A.A.8A.2A.3A.2A.A.2A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.A.2A. 2A.3A.A.2A.2A.A.2A.A.2A.A2.4A.A.2A.127A.A.A.A.A.A.A.A.A.A.A.2A.A.7A.A .3A.A.2A.A.A.2A.A.2A.12A.A.2A.A.A.3A.2A.2A.3A.A.A.A.A.A.A.3A.2A.A.3A. A.10A.A.A.A.A.A.2A.A.2A.A.A.3A.2A.2A.3A.2A.A.4A.A.A.A.3A.A.2A.A.4A.A. 2A.2A.A.3A.2A.A.2A.2A.2A.2A.2A.10A.A.2A.A.7A.10A.A.2A.A.A.13A.A.2A.A. 2A.11A.A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A. A.A.A.A.A.A.2A.2A.2A.A.3A.A.2A.A.A.2A.A.2A.2A.2A.2A.A.2A.A.A.3A.2A.2A .3A.A.A.A.A.A.A.3A.9A.A.A.A.A.A.A.A.8A.A.2A.A.3A.2A.2A.3A.2A.A.3A.2A. A.A.10A.2A.2A.A.17A.2A.A.3A.14A.2A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.9A .3A.A.2A.A.2A.3A.3A.A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.3A.A.A.A.A.A.A.A.A.A.A.2A.2A.9A.30A.2A.2A.A.2A.A.A.10A.2A.2A.A.41A. 2A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.2A.2A.10A.A.7A.A.9A.A.4A.2A.2A.3A .A.A.2A.2A.A.3A.A.2A.2A.A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.3A.A.3A.A. 2A.A.2A.3A.3A.A2.38A.2A.10A.2A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A .A.A.A.A.2A.A.2A.A.A.3A.A.A.A.A.A.20A.2A.3A.A.2A.A.3A.A.2A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.3A.A.3A.A.2A.A.3A.A.3A.A.4A.2A.2A. 3A.A.A.2A.2A.A.6A.2A.2A.2A.A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.3A.A.3A. A.2A.A.2A.3A.3A.A2.8A.2A.A.A.A.A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A .A.3A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.8A.2A.A.2A.2A.3A. A.2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.3A.A.3A.A .8A.A.3A.A.4A.2A.2A.2A.2A.A.10A.2A.A.2A.2A.2A.2A.A.2A.2A.10A.2A.A.A. 3A.11A.A.A.3A.15A.8A.A.12A.A2.2A.2A.A.A.A.A.A.13A.13A.A.A.A.41A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.2A.2A.A.A.2A.A.11A.2A.2A.A.4A .A.A.A.10A.A.2A.10A.A.2A.10A.2A.A.A.A.A.2A.A.2A.A.3A.6A.A.11A.A.9A.2A .2A.A.11A.2A.6A.A.2A.3A.2A.2A.A.18A.2A.3A.A.3A.A.A.A.2A.A.2A.2A.A.2A. A.A.3A.2A.A.2A.3A.A.2A.2A.2A.A.2A.A2.2A.A.2A.A.A.A.A.9A.A.A.A.3A.A.A. A.3A.A.A.A.A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.10A.A.2A.2A.2A. A.A.2A.A.4A.2A.2A.2A.A.4A.A.A.A.3A.2A.A.2A.3A.2A.A.2A.3A.2A.2A.A.A.A. A.2A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.3A.2A.A.2A.2A.2A.A.2A.A.2A.A.2A.3A. 2A.A.2A.9A.A.2A.2A.3A.A.3A.A.A.A.2A.A.2A.2A.A.2A.A.A.3A.2A.A.2A.3A.A. 2A.2A.2A.A.2A.A2.2A.A.2A.A.A.A.A.3A.A.A.A.A.10A.A.2A.A.3A.A.A.A.A.A. 3A.2A.A.2A.A.A.71A.A.3A.2A.A.3A.A.18A.2A.A.4A.2A.2A.2A.A.3A.A.2A.A. 11A.15A.15A.30A.A.3A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.3A.2A.A.2A.2A.2A.A. 2A.A.2A.A.2A.3A.2A.A.2A.3A.A.A.2A.2A.17A.A.A.A.3A.11A.A.A.3A.2A.A.2A. 3A.8A.A.12A.A2.13A.A.A.A.2A.2A.A.A.A.8A.A.3A.A.2A.A.4A.A.2A.A.A.A.A. 3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.9A.16A.2A.5A.2A.A.4A.2A.2A .2A.A.3A.A.2A.A.3A.3A.2A.A.3A.A.4A.2A.A.3A.A.4A.2A.A.3A.2A.A.A.2A.A. 3A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.29A.A.2A.A.2A.A.2A.10A.A.2A.2A.2A.A. 11A.A.3A.A.A.A.A.3A.3A.3A.A.A.3A.15A.2A.A.2A.3A.3A.A2.9A.3A.A.A.A.14A .2A.A.2A.A.2A.22A.A.2A.A.A.A.A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A .A.A.2A.A.4A.2A.A.4A.A.A.3A.2A.A.11A.2A.2A.A.3A.A.16A.10A.A.3A.A.11A. A.3A.A.11A.A.3A.2A.A.A.2A.A.3A.A.2A.A.3A.6A.A.11A.2A.A.2A.2A.A.A.A.A. 2A.2A.A.2A.2A.A.12A.A.4A.3A.A.3A.A.A.A.A.3A.3A.3A.A.A.3A.A.3A.A.2A.A. 2A.3A.3A.A2.3A.A.2A.2A.A.A.8A.2A.2A.2A.A.3A.A.A.A.A.2A.A.2A.A.A.A.A. 3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.A.12A.A.A.A.3A.2A.2A.3A .A.2A.A.3A.A.3A.A.2A.2A.2A.A.A.3A.A.A.3A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A .3A.3A.A.3A.A.A.2A.2A.A.A.A.A.2A.2A.A.3A.A.A.A.2A.A.4A.2A.2A.10A.2A.A .A.A.3A.3A.3A.A.A.3A.A.3A.A.2A.A.2A.3A.3A.A2.3A.A.12A.A.2A.2A.2A.A. 12A.A.4A.A.A.A.A.2A.A.2A.A.A.A.A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A .A.A.A.2A.2A.A.A.A.8A.A.4A.2A.2A.3A.A.2A.A.3A.A.3A.A.2A.2A.2A.A.A.3A. A.A.3A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A.3A.3A.A.2A.2A.A.10A.A.2A.A.A.A.2A .A.14A.A.A.A.2A.A.4A.2A.2A.3A.2A.2A.A.A.A.3A.11A.A.A.6A.A.11A.2A.8A.A .12A.A2.2A.2A.9A.2A.A.2A.2A.A.2A.9A.2A.A.4A.A.A.A.A.2A.A.20A.A.3A.2A. A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.2A.A.3A.A.4A.2A.2A. 3A.8A.A.3A.A.3A.A.2A.2A.2A.A.A.3A.8A.A.16A.17A.2A.A.3A.A.2A.A.3A.16A. 2A.A.3A.2A.A.2A.A.A.A.2A.A.3A.2A.3A.A.A.A.2A.A.11A.2A.3A.2A.2A.A.A.A. 2A.A.2A.2A.2A.A.A.A.2A.A.4A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.3A.A.2A.A. 2A.2A.A.2A.3A.A.2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.3A.2A.A.2A.A.A.5A.A .A.A.A.A.A.A.A.A.A.A.30A.A.3A.A.4A.2A.2A.12A.2A.2A.A.8A.2A.2A.A.A.3A. 2A.A.3A.A.2A.A.3A.3A.A.3A.2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.3A.2A.A.2A. A.A.A.2A.A.3A.2A.3A.A.A.A.2A.2A.3A.A.3A.2A.2A.A.A.A.2A.A.2A.2A.2A.A.A .A.2A.A.4A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A. 2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.3A.29A.A.A.A.A.A.A.A.A.A.A.A.2A.2A. A.A.A.A.9A.3A.A.A.2A.2A.2A.2A.3A.2A.2A.A.A.10A.A.3A.A.2A.A.3A.3A.A.3A .2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.3A.2A.A.2A.A.A.A.2A.A.3A.A.11A.2A.A. A.2A.2A.3A.A.10A.2A.A.A.A.14A.2A.A.A.A.2A.A.4A.2A.2A.8A.A.12A.A2.2A. 2A.16A.A.2A.2A.A.2A.16A.A.7A.2A.A.A.A.2A.A.5A.2A.10A.2A.2A.2A.A.A.A.A .3A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.4A.A.2A.3A.A.A.2A.2A.2A.2A.3A .3A.11A.A.A.2A.A.2A.9A.3A.9A.2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.10A.A.2A .A.A.A.2A.A.3A.A.4A.2A.2A.A.A.12A.A.2A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A. 6A.A.11A.2A.2A.A.2A.3A.3A.A2.3A.A.2A.2A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A. A.10A.2A.3A.2A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.11A.A. 12A.2A.A.2A.3A.A.A.2A.A.7A.A.8A.12A.A.4A.A.A.2A.A.2A.3A.A.3A.3A.A.2A. A.3A.A.2A.A.3A.A.A.2A.2A.A.A.2A.2A.A.A.A.A.2A.A.3A.A.4A.3A.A.A.A.2A.A .2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.3A.A.3A.A.2A.A.2A.3A.3A.A2.3A.A. 2A.2A.A.A.2A.2A.A.3A.A.A.2A.A.2A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A.A. A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.4A.2A.A.4A.3A.2A.A.2A.3A.A.A.11A.2A.A .2A.5A.2A.A.4A.A.A.2A.A.2A.3A.A.3A.3A.A.2A.A.3A.A.2A.A.3A.A.A.2A.2A.A .A.2A.2A.A.A.A.A.8A.A.4A.3A.A.A.A.3A.A.A.11A.A.A.A.A.10A.A.2A.A.A.3A. A.3A.A.2A.A.2A.3A.3A.A2.3A.14A.2A.A.19A.A.A.13A.A.2A.A.2A.2A.2A.3A.2A .2A.12A.2A.A.A.5A.A.A.A.A.A.A.A.A.A.A.A.9A.9A.10A.A.2A.2A.2A.A.A.A.3A .3A.A.3A.2A.A.4A.A.A.4A.2A.4A.A.2A.4A.A.10A.2A.A.3A.A.2A.A.3A.A.A.12A .A.2A.2A.2A.A.A.A.A.A.A.10A.2A.A.A.10A.2A.A.3A.3A.A.A.A.A.3A.2A.A.2A. A.A.17A.A.8A.A.12A.A2.3A.2A.A.2A.2A.2A.11A.2A.2A.A.A.9A.3A.A.2A.A.2A. 2A.2A.10A.A.10A.2A.A.2A.A.9A.A.A.A.A.A.A.A.A.13A.A.3A.2A.A.4A.3A.A.A. 14A.2A.A.3A.3A.A.3A.2A.A.25A.A.10A.8A.A.2A.3A.2A.A.3A.A.2A.A.2A.A.2A. A.A.A.2A.A.2A.3A.A.A.A.A.A.A.A.3A.A.A.A.3A.2A.2A.A.3A.3A.A.A.A.A.3A. 2A.2A.A.A.A.A.2A.A.2A.A.A.2A.2A.2A.A.2A.A2.3A.2A.A.2A.2A.2A.2A.2A.A. 2A.2A.A.A.3A.A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.13A.A. A.A.2A.2A.3A.A.10A.A.12A.A.A.A.A.2A.2A.A.3A.17A.2A.2A.A.A.A.2A.A.3A.A .4A.2A.A.3A.A.2A.3A.2A.A.3A.A.2A.A.2A.A.2A.A.A.A.2A.A.2A.3A.A.A.A.A.A .A.A.3A.A.A.A.3A.2A.2A.A.3A.3A.A.A.A.A.3A.2A.2A.A.A.A.A.2A.A.2A.A.A. 2A.2A.2A.A.2A.A2.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.A.3A.A.2A.A.2A .3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.2A.2A.3A.A.A.A.2A.2A.3A.A.A.A.A.A .A.A.A.A.A.2A.2A.8A.A.2A.A.A.A.2A.2A.A.A.A.8A.A.11A.A.16A.2A.A.15A.A. 27A.A.3A.A.2A.16A.A.2A.A.A.A.A.3A.A.A.A.3A.2A.2A.A.11A.A.A.A.A.10A.2A .A.A.A.A.2A.A.2A.A.A.12A.A.2A.A2.3A.14A.2A.7A.10A.A.2A.A.2A.2A.10A.2A .2A.A.2A.10A.A.3A.2A.2A.2A.11A.A.28A.2A.2A.2A.11A.5A.3A.A.A.A.A.A.A.A .A.A.A.2A.2A.4A.2A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.A.2A .A.A.A.2A.A.4A.A.A.A.2A.A.2A.A.A.A.A.3A.A.A.A.11A.A.A.2A.2A.A.A.A.A.A .3A.A.A.A.A.A.2A.A.2A.A.11A.2A.A.2A.A2.3A.A.3A.A.A.3A.3A.2A.A.2A.A.2A .2A.3A.2A.2A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.2A.2A.8A.2A.A.A.A.A.13A. 13A.20A.A.13A.2A.A.A.A.A.2A.2A.2A.2A.29A.A.A.A.A.A.A.A.A.A.A.A.2A.A. 2A.A.2A.A.2A.A.A.A.2A.A.4A.A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.2A.A. 2A.A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.2A.2A.A.2A.A.2A.A2.6A. 2A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A.8A.2A.2A.2A.3A.2A. 2A.2A.A.2A.A.A.A.A.9A.A.A.A.3A.A.A.A.2A.A.3A.2A.2A.2A.A.A.A.A.2A.2A. 2A.2A.4A.A.2A.A.A.A.60A.2A.14A.A.27A.A.3A.A.4A.A.A.A.2A.A.2A.A.A.A.A. 2A.A.2A.A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.2A. 2A.A.2A.A.2A.A2.2A.2A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A .2A.2A.A.2A.2A.3A.2A.2A.2A.A.2A.A.A.A.A.3A.A.A.A.A.3A.A.A.A.2A.A.3A. 2A.2A.2A.A.A.A.A.2A.2A.5A.3A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A. 2A.A.2A.A.A.A.2A.A.3A.A.19A.2A.14A.A.2A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.A .2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.18A.A.2A.A2.19A.A.3A.10A.A.2A .A.2A.2A.10A.2A.2A.A.17A.2A.A.2A.2A.10A.2A.13A.A.A.A.3A.A.A.A.A.12A. 2A.A.2A.A.6A.2A.2A.A.A.A.A.2A.A.10A.3A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A. 2A.2A.A.A.2A.A.2A.A.A.A.2A.A.3A.2A.A.A.2A.2A.A.A.2A.A.2A.A.A.2A.A.2A. A.A.A.8A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A 2.9A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.2A.9A. 3A.A.A.A.14A.2A.A.9A.2A.2A.A.11A.30A.A.3A.A.3A.A.12A.10A.2A.A.2A.A. 49A.A.19A.A.27A.A.3A.A.3A.2A.A.A.2A.2A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A. A.2A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A2.3A. A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.2A.3A.A. 2A.2A.A.A.8A.2A.2A.2A.A.3A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A .2A.A.A.3A.2A.2A.A.2A.A.3A.2A.A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.2A. A.3A.A.19A.A.9A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.2A.2A.A.A. A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A2.2A.2A.A.10A.2A.3A.10A.A. 2A.A.2A.2A.10A.2A.2A.2A.A.10A.A.2A.2A.2A.10A.A.4A.A.12A.A.2A.2A.2A.A. 12A.A.4A.A.13A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.2A.A.A.3A.2A.2A.A.2A.A. 3A.2A.A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.2A.A.3A.2A.A.A.2A.A.2A.2A. 2A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A .A.2A.2A.A.A.A.A.2A.A.2A.A2.12A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A. 2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.9A.2A.A.2A.2A.A.2A.9A.2A .A.3A.2A.9A.3A.A.2A.A.20A.A.2A.A.3A.A.6A.A.A.3A.3A.10A.A.3A.A.37A.A. 19A.A.26A.2A.A.3A.2A.A.A.2A.A.2A.12A.A.20A.32A.A.3A.A.2A.A.2A.2A.A.A. A.A.A.3A.A.A.A.A.A.2A.2A.A.A.14A.A.2A.A2.2A.A.4A.2A.2A.3A.3A.2A.A.2A. A.2A.2A.3A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.A.2A. 2A.A.2A.3A.A.2A.A.3A.2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.12A.A.A.4A.A .4A.3A.A.2A.A.3A.2A.A.A.A.A.2A.2A.A.A.2A.2A.A.A.A.3A.2A.A.19A.A.9A.2A .A.2A.2A.A.A.3A.A.A.A.A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A .2A.2A.A.A.2A.A.2A.A.A.A2.2A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.3A.A .2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A.2A. A.3A.2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.3A.A.3A.A.10A.A.12A.A.2A.A.3A.2A. A.A.A.A.2A.2A.A.A.2A.2A.A.A.A.3A.2A.2A.A.A.2A.A.2A.2A.2A.A.2A.2A.A.A. 3A.A.A.A.A.A.2A.A.3A.A.2A.A.17A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.2A.A.2A. A.A.A2.2A.A.11A.2A.3A.10A.A.2A.A.2A.2A.11A.A.2A.A.2A.10A.A.2A.2A.2A. 10A.A.3A.2A.16A.A.2A.2A.A.2A.16A.A.3A.2A.17A.A.2A.A.5A.2A.10A.2A.3A.A .9A.4A.A.3A.A.4A.A.10A.A.3A.A.25A.A.19A.A.18A.A.3A.2A.2A.A.A.2A.A.2A. 12A.A.19A.A.28A.A.2A.A.4A.A.A.A.A.3A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.2A. A.2A.A.A.A2.2A.2A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.2A.A.2A.2A .A.3A.A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.A.A.10A.2A. 3A.2A.2A.3A.A.A.3A.3A.9A.A.3A.A.2A.A.3A.2A.A.A.2A.2A.A.A.3A.A.A.3A.A. 3A.18A.A.9A.2A.A.2A.2A.A.A.2A.A.2A.A.A.A.3A.A.2A.A.4A.A.A.A.A.3A.A.A. A.3A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A2.2A.2A.3A.A.2A.A.2A.2A.2A.A.A. 3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A. 2A.A.3A.A.3A.A.A.8A.A.3A.2A.3A.2A.2A.3A.A.A.3A.2A.2A.A.A.A.3A.A.2A.A. 3A.2A.A.A.2A.2A.A.A.3A.A.A.3A.A.2A.A.2A.A.A.2A.A.2A.2A.2A.A.2A.2A.A.A .2A.A.2A.A.A.A.3A.A.2A.A.4A.A.A.A.A.10A.A.2A.A.12A.2A.A.A.A.2A.2A.A.A .2A.A.2A.A.A.A2.13A.A.14A.2A.A.A.6A.A.12A.A.2A.A.13A.2A.A.6A.A.11A.A. 4A.14A.2A.A.18A.2A.A.3A.15A.A.2A.A.2A.2A.2A.3A.2A.2A.12A.2A.3A.2A.2A. A.A.A.2A.A.11A.A.3A.A.12A.5A.A.A.4A.A.2A.A.4A.A.2A.2A.A.2A.A.A.2A.A. 2A.12A.A.19A.A.20A.A.3A.A.2A.A.19A.A.2A.A.A.2A.2A.A.A.A.2A.2A.A.A.A. 2A.2A.A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A. 3A.2A.3A.A.A.2A.A.4A.2A.A.4A.2A.A.2A.2A.2A.11A.2A.2A.A.A.3A.2A.A.2A. 3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.2A.3A.5A.A.A.A.2A.A.4A.A.2A.A.4A.13A. A.10A.A.2A.10A.A.2A.2A.A.2A.A.A.5A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.3A.A. 2A.2A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A 2.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.2A .A.4A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A .2A.3A.A.2A.2A.13A.A.A.A.2A.A.4A.A.2A.A.4A.5A.6A.2A.3A.7A.3A.7A.2A.2A .19A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.3A.A.2A.2A.A.A.2A.A.2A.A.A.2A.2A.A. A.A.2A.2A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A2.11A.A.A.11A.A.A.A.2A.A.4A.3A .A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.A.4A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A .3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.3A.A.A.A.2A.A.3A.A. 11A.A.3A.2A.2A.2A.4A.2A.2A.2A.5A.2A.2A.5A.2A.2A.4A.A.4A.6A.2A.A.5A.A. A.5A.A.A.4A.A.2A.10A.A.19A.A.20A.17A.A.11A.A.A.5A.A.A.2A.A.2A.A.A.A2. 3A.3A.A.A.3A.2A.2A.A.A.6A.A.12A.A.2A.A.3A.A.4A.2A.A.2A.6A.A.11A.A.4A. 14A.2A.7A.10A.A.2A.A.3A.15A.A.2A.A.2A.10A.A.3A.2A.2A.2A.10A.2A.A.3A.A .A.A.2A.A.3A.A.4A.A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.3A.2A.A.2A.3A.2A.2A. 3A.2A.2A.4A.2A.11A.A.11A.A.11A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A. 2A.A.A.2A.2A.A.A.3A.A.A.2A.A.2A.A.A.A2.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A .A.2A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.3A.3A.2A.A.2A.A. 3A.A.3A.A.A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.2A.2A.A.3A.A.A.A.2A.A.3A.A .4A.A.2A.2A.7A.17A.15A.3A.5A.3A.2A.A.2A.2A.2A.3A.6A.2A.3A.6A.2A.3A.6A .2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.A.2A.A. 2A.A.A.A2.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A.A.2A.A.8A.A.4A.2A.A.2A.3A.A. 2A.2A.6A.2A.3A.A.A.3A.3A.2A.A.2A.A.6A.2A.3A.A.A.2A.A.4A.A.8A.2A.2A.2A .3A.2A.2A.9A.A.A.A.2A.A.3A.A.3A.A.11A.A.2A.5A.A.A.4A.A.2A.A.5A.13A.3A .7A.12A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.A.5A.A.A.5A.A.A.5A.A.A.5A.A. A.5A.A.A.4A.A.2A.A.2A.A.2A.A.A.A2.11A.A.A.10A.2A.A.A.16A.A.2A.A.A.A. 10A.A.2A.17A.A.2A.2A.3A.A.A.3A.3A.2A.2A.A.A.2A.2A.3A.A.A.2A.A.4A.A.2A .2A.A.2A.2A.3A.2A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.2A.A.A.2A.2A.A.A.3A .A.A.3A.5A.10A.2A.4A.A.2A.A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.2A.2A .11A.A.11A.A.11A.A.11A.A.11A.A.10A.A.2A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A. 3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.2A.2A.A.19A.A.3A.10A.2A.A.A. 19A.A.2A.A.17A.2A.A.2A.2A.10A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.2A.A.A. 2A.2A.A.A.3A.A.A.2A.2A.2A.2A.A.A.A.2A.A.2A.A.7A.17A.17A.13A.6A.2A.3A. 6A.2A.3A.6A.2A.3A.6A.2A.3A.6A.2A.3A.7A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A. 3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.2A.A.2A.9A.A.3A.A.2A.A.2A.2A .2A.A.A.9A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.3A.A.A.A.A.2A.A.3A.A.3A.A. 3A.A.9A.2A.2A.A.9A.2A.2A.A.10A.5A.2A.2A.A.A.A.3A.A.A.5A.A.A.5A.A.A.4A .A.2A.A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A. 2A.2A.5A.A.2A.A.2A.A.A.A2.132A.A.2A.3A.A.A.3A.A.2A.A.2A.2A.2A.A.A.3A. A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A .3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.3A.18A.A.2A.2A.2A.A.A.2A.2A.A. A.2A.2A.A.A.2A.A.2A.A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A. 2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.3A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.10A.2A.3A.10A.A.2A.A.2A.2A.A. 10A.2A.2A.2A.A.10A.A.2A.2A.2A.10A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.A. 3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.2A.A.A.4A.A.2A.2A.2A.A.A. 2A.2A.A.A.2A.2A.A.A.2A.A.2A.A.7A.17A.17A.17A.17A.17A.16A.A.2A.A.A.A2. 2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.12A.A.4A.2A.2A.3A. 3A.2A.A.2A.A.12A.A.4A.2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.2A.A.A .2A.A.2A.14A.2A.17A.2A.A.9A.2A.3A.A.A.5A.A.A.5A.A.A.5A.A.A.5A.A.A.5A. A.A.4A.2A.A.A.2A.A.2A.A.A.A2.132A.2A.A.A.2A.A.4A.2A.2A.3A.3A.2A.2A.A. A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A.A.A.2A.A.3A .A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A .2A.A.A.3A.2A.A.3A.A.3A.2A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A2.2A.2A.A.A.2A.A.4A.2A.2A.3A. 3A.2A.2A.A.A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.2A.A.A.2A.A. 2A.A.A.2A.A.2A.A.A.3A.2A.A.3A.A.7A.A.3A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A2.18A.A.3A.A.11A.2A .3A.10A.2A.A.A.A.2A.A.12A.A.2A.A.2A.10A.A.2A.2A.2A.10A.2A.3A.A.A.A.A. 2A.A.3A.A.3A.A.3A.A.12A.2A.A.12A.2A.A.12A.3A.8A.2A.3A.8A.2A.3A.8A.2A. 3A.2A.A.3A.A.6A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A. 2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.3A2.13A.A.A.A.A.A.2A.A.3A.2A.3A.A .2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.3A.A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A.2A.A.3A.2A.3A. 2A.A.3A.2A.3A.2A.A.3A.2A.3A.2A.A.4A.3A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A. 2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A .A.3A.A.3A.2A.2A.A.3A.A.3A.2A.3A2.21A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A. 3A.A.A.A.A.A.2A.A.3A.2A.3A.A.2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A .A.2A.2A.A.3A.A.3A.A.2A.A.2A.22A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A .A.4A.3A.3A.2A.A.7A.A.4A.2A.A.7A.A.4A.2A.A.7A.A.4A.2A.A.4A.3A.2A.A.3A .A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A. 3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.4A2.2A.A.2A.A.2A.2A.2A.A .2A.A.A.A.A.A.30A.2A.34A.A.3A.A.14A.A.15A.A.A.A.A.12A.A.2A.A.2A.A.13A .2A.A.6A.A.11A.2A.2A.A.2A.4A.A.2A.A.A.2A.A.3A.A.3A.A.5A.A.4A.2A.A.5A. A.4A.2A.A.5A.A.4A.3A.2A.A.6A.3A.2A.A.6A.3A.2A.A.6A.3A.2A.A.12A.2A.A. 3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A .6A.2A.A.3A.A.6A.2A.A.3A.A.6A.3A2.2A.A.2A.A.2A.2A.2A.A.2A.A.A.A.A.A. 2A.2A.A.A.A.A.8A.A.2A.A.A.A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A .A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.2A.2A.2A.A.2A.3A.A.A.A.2A.A.3A.A. 4A.A.11A.A.11A.A.11A.3A.3A.3A.3A.3A.3A.3A.3A.3A.2A.A.4A.3A.2A.A.4A.3A .2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A .A.4A.3A.3A2.2A.A.2A.A.12A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A.A.A .A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A .A.2A.A.4A.2A.2A.2A.A.2A.2A.A.2A.A.10A.A.3A.A.4A.A.2A.2A.A.A.2A.2A.A. A.2A.2A.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A .2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A 2.12A.A.2A.A.A.A.A.A.A.A.A.3A.A.10A.A.2A.2A.A.2A.A.A.A.A.2A.A.3A.A. 12A.A.A.11A.A.A.A.A.11A.A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.2A.4A.2A.2A .A.2A.A.3A.A.2A.A.4A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.11A.3A.11A.3A.11A. 3A.2A.A.5A.A.4A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A .2A.A.12A.2A.A.12A.3A2.9A.2A.A.2A.A.A.A.A.A.A.A.A.3A.A.3A.2A.A.3A.A. 17A.2A.A.A.2A.A.3A.A.4A.3A.A.A.3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A. 2A.A.2A.6A.A.11A.2A.7A.4A.2A.A.3A.A.2A.A.4A.A.18A.A.19A.A.12A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.A.10A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A. 3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A2.5A.A.2A.A.2A.A.A.A .A.A.A.A.A.3A.9A.16A.2A.4A.2A.A.A.2A.A.3A.A.4A.3A.A.A.3A.3A.A.A.A.A. 3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.A.2A.A.12A.2A.A.3A.A.2A.A.3A.A .2A.A.A.A.2A.2A.A.A.3A.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.A.3A.A.3A. 3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A. 2A.A.4A.3A.3A2.9A.A.55A.3A.2A.A.4A.2A.A.4A.A.A.2A.2A.A.A.2A.A.3A.A.4A .3A.A.A.3A.3A.A.A.A.A.3A.3A.A.A.8A.A.4A.2A.A.2A.3A.A.2A.A.2A.A.5A.2A. 2A.A.4A.A.2A.2A.A.3A.A.2A.A.A.A.2A.2A.A.A.3A.A.3A.4A.A.4A.3A.4A.A.4A. 3A.4A.A.4A.3A.3A.A.3A.A.4A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A. 4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.3A2.2A.A.2A.A. A.A.A.A.A.A.A.A.A.11A.2A.A.12A.A.A.A.2A.2A.A.A.2A.A.3A.A.12A.A.A.11A. A.A.A.A.11A.A.A.A.A.10A.A.2A.17A.A.A.3A.11A.6A.2A.2A.A.3A.A.2A.A.A.A. 18A.A.10A.2A.2A.A.10A.2A.A.10A.2A.A.11A.10A.A.12A.A.11A.A.11A.A.11A.A .11A.A.11A.A.11A.A.11A.A.11A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A .A.A.8A.A.3A.2A.A.A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A. A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A.2A.A.2A.A.2A.2A.2A.2A.A.25A.A.2A.A.A. 2A.A.2A.3A.2A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A. 2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A2.48A.A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.A.3A.A.3A.2A.A.A.2A.A.3A.2A. 2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A. 2A.A.4A.2A.2A.2A.2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.3A.2A.2A.A.2A.A.2A.A .A.2A.A.2A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A2.9A.A.A.A.A.A.A.2A.A.2A .A.A.A.A.A.30A.A.3A.A.3A.2A.A.A.2A.A.3A.2A.138A.2A.A.A.2A.2A.A.7A.5A. 2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.3A.6A.A.2A.16A.2A.19A.19A.9A.9A.18A.A .18A.12A.A.2A.2A.2A.A.A.6A.A.2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A2.3A.A.A .A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.8A.2A.A.A.2A.A.3A.2A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.13A.23A.19A.2A .A.2A.2A.A.2A.3A.A.A.A.3A.A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A.A.2A.A.A.3A. A.A.2A.A.2A.A.2A.A.2A.16A.A.2A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A 2.3A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.5A.A.A.A.2A.A.3A. 2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.5A.3A. 4A.A.2A.A.2A.A.2A.A.A.3A.2A.A.2A.2A.A.2A.3A.A.A.A.3A.A.A.A.2A.A.2A.A. A.3A.A.3A.A.2A.A.2A.A.A.3A.A.A.2A.A.2A.A.3A.A.A.A.2A.A.2A.2A.A.2A.A. 16A.A.5A.2A.A.A.11A2.2A.A.2A.10A.2A.A.16A.A.14A.A.A.A.2A.A.11A.A.12A. 3A.A.2A.A.2A.2A.A.3A.2A.160A.2A.A.A.3A.2A.2A.2A.A.2A.A.2A.A.2A.A.A.3A .2A.A.2A.8A.A.17A.A.2A.22A.A.3A.A.2A.A.A.10A.A.4A.A.20A.A.4A.A.A.14A. A.4A.A.A.A.8A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.3A2.2A.A.2A.3A.2A.2A.A.3A. A.A.2A.2A.3A.A.A.A.2A.A.4A.2A.A.4A.3A.3A.14A.A.3A.A.3A.2A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.2A.A.2A.A. 2A.A.2A.A.A.3A.2A.A.2A.A.3A.A.A.3A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A. A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A .3A2.2A.A.2A.3A.2A.2A.A.3A.A.A.2A.2A.3A.A.A.A.9A.9A.11A.2A.A.3A.A.3A. A.3A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.3A.2A.2A.2A.A.2A.A.2A.A.2A.A.A.3A.2A.A.2A.A.3A.A.A.3A.A.A.A.A.2A. A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A. A.A.A.A.2A.A.4A.A.A.A.A.3A2.2A.A.2A.3A.2A.2A.A.3A.A.A.5A.2A.2A.12A.A. 2A.3A.2A.A.4A.2A.2A.A.2A.A.2A.2A.A.3A.A.194A.12A.A.2A.A.2A.A.2A.A.A. 3A.13A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A. 16A.A.14A.17A2.2A.A.2A.4A.A.3A.2A.A.25A.2A.2A.2A.2A.2A.A.2A.10A.A.11A .2A.A.2A.A.2A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.3A.2A.2A.3A.3A.A.2A.A.3A.2A .3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A. A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.3A2.2A.A.11A.A. 10A.A.A.A.A.3A.2A.2A.2A.2A.3A.A.A.A.A.A.A.A.2A.A.2A.2A.A.3A.2A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. 4A.2A.A.A.3A.2A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A .3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A .A.2A.A.3A.2A.3A.3A.A.3A2.2A.A.4A.2A.A.3A.A.4A.A.A.A.A.3A.2A.2A.5A.3A .A.A.A.A.A.A.A.4A.2A.2A.A.3A.A.2A.37A.A.A.A.A.A.A.A.A.125A.7A.A.A.3A. 2A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A. 4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A. 4A.A.2A.A.3A.2A.4A.A.4A.A.3A2.2A.A.4A.8A.A.4A.A.A.A.A.3A.15A.20A.A. 31A.2A.2A.A.3A.A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.3A.A.4A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.3A.A.A.3A.2A.A.9A.A.11A.A.3A.A .3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A. 9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A. 11A.A.4A2.2A.A.4A.A.A.3A.A.A.15A.A.A.3A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A. 2A.A.3A.A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.21A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.4A.2A.3A.A.A.3A.2A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A. 5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A .2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A. 2A.A.3A.A.2A.2A.A.5A.A.2A.3A2.2A.A.4A.A.A.3A.A.A.3A.A.A.A.A.3A.A.A.A. 2A.A.3A.2A.A.A.A.2A.2A.2A.A.3A.A.2A.3A.15A.A.3A.A.A.A.A.A.2A.A.3A.A. 3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.11A.8A.2A.A.7A.4A.A.2A.A.3A.2A.A.2A .3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A .2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A. 3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.3A2.2A.A.4A.A.A.3A.A.A.3A. A.A.A.A.12A.2A.A.2A.A.6A.A.A.A.2A.2A.2A.A.3A.A.2A.13A.5A.A.30A.2A.2A. A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.A.4A.A.A.12A.A.2A.9A. 3A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A .4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.3A2.2A.A.3A.A.18A.A.A.14A.2A.A. 9A.2A.2A.A.11A.A.A.A.12A.A.3A.2A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.2A.2A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.10A.A.4A.A.A.5A.16A.A.2A. 3A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A. 3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A. 2A.2A.A.3A.3A2.2A.A.11A.A.2A.2A.2A.A.8A.2A.2A.2A.A.3A.A.2A.A.2A.A.A. 2A.A.2A.A.A.A.A.2A.A.3A.2A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.24A.A.2A.A.A.A .A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.A.2A.3A.2A.2A.A .3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A. 2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A. 3A2.3A.A.2A.A.2A.2A.2A.A.2A.2A.A.12A.A.4A.A.13A.A.2A.A.2A.A.A.A.A.2A. A.4A.A.10A.2A.38A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.A.2A.2A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A. 3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.3A2. 3A.A.2A.A.2A.2A.2A.A.2A.A.2A.9A.2A.A.3A.2A.9A.3A.A.2A.A.20A.A.2A.A.4A .A.3A.A.8A.2A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A .A.A.2A.2A.A.A.2A.2A.A.A.7A.3A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A. 3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A. 3A.3A.2A.A.4A.3A.3A.3A.3A2.3A.A.4A.2A.2A.2A.A.2A.A.2A.3A.A.2A.A.3A.2A .3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.4A.A.3A.A.2A.2A.A.A.A.A.A.31A.A.A.A .44A.2A.A.A.2A.A.23A.A.2A.A.3A.A.A.A.3A.2A.A.7A.A.3A.A.7A.A.3A.A.3A.A .7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A. A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A .A.3A.A.3A.A.7A.A.3A.A.7A.A.4A2.18A.2A.2A.2A.A.2A.A.2A.3A.A.2A.A.3A. 2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.4A.A.4A.A.2A.2A.A.2A.A.A.A.A.9A.A .A.A.3A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.10A.A.2A.A.2A.A.2A.A.3A.A.A .A.3A.3A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A. 2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A. 3A2.2A.2A.2A.2A.A.2A.A.2A.16A.A.3A.2A.17A.A.2A.A.5A.2A.10A.2A.2A.A. 19A.A.2A.2A.A.2A.A.A.A.A.3A.A.A.A.A.10A.A.2A.A.2A.A.2A.A.A.A.A.A.2A.A .2A.A.A.A.2A.A.2A.A.2A.A.2A.A.3A.A.A.A.3A.3A.3A.3A.3A.2A.A.4A.3A.3A. 3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A. 3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.3A2.2A.A.11A.A.2A.2A.2A.A.2A.2A. A.3A.A.2A.A.2A.A.A.10A.2A.3A.2A.2A.2A.2A.A.A.2A.A.2A.13A.A.A.A.2A.2A. A.A.A.8A.A.3A.A.2A.A.4A.2A.A.A.A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.2A.A.2A. A.3A.A.A.A.3A.3A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A. 2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.3A2.2A.A. 4A.2A.A.2A.2A.2A.A.2A.2A.A.3A.A.3A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A. 3A.9A.3A.A.A.A.14A.2A.A.2A.A.2A.22A.2A.A.A.A.A.A.2A.A.2A.A.A.A.4A.A. 2A.11A.A.3A.A.A.A.3A.3A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A .A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A. A.4A.10A.2A.A.3A2.16A.A.4A.2A.A.2A.18A.2A.A.3A.15A.A.2A.A.2A.2A.2A.3A .2A.2A.12A.A.2A.3A.3A.A.2A.2A.A.A.8A.2A.2A.2A.A.3A.A.A.A.A.2A.2A.A.A. A.A.A.34A.A.2A.3A.3A.A.3A.A.A.A.3A.2A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A .A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A. A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.3A2.3A.A. A.3A.2A.A.12A.2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.A. 2A.3A.3A.A.12A.A.2A.2A.2A.A.12A.A.4A.A.A.A.A.2A.A.2A.A.A.A.A.8A.A.2A. A.A.A.2A.A.2A.3A.3A.A.3A.A.A.A.3A.2A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A .A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A. 12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.4A2.3A.A.A.10A.A.3A.2A.A. 2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.3A.2A.2A.9A .2A.A.2A.2A.A.2A.9A.2A.A.4A.A.A.A.A.2A.A.20A.A.2A.A.2A.A.A.A.A.2A.A. 2A.3A.3A.A.3A.A.A.A.3A.3A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A .2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A. 4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.4A2.10A.2A.A.2A.2A.2A.2A.A.2A.2A.A.A .3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.3A.2A.2A.3A.A.2A.A. 2A.2A.A.2A.3A.A.2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.2A.2A.A.A.A.10A.A. 2A.11A.A.3A.A.A.A.3A.3A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A. 2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A .A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.4A2.2A.2A.A.2A.2A.7A.10A.A.2A.A.3A.15A .A.2A.A.2A.10A.A.3A.2A.2A.2A.11A.3A.2A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A. 2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.A. 3A.A.A.A.3A.3A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A. 3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A. A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.4A2.2A.A.14A.A.3A.3A.2A .A.2A.A.3A.A.3A.A.A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.3A.3A.2A.2A.16A.A. 2A.2A.A.2A.16A.A.7A.2A.A.A.A.2A.A.5A.2A.10A.2A.2A.2A.A.A.A.2A.A.2A.A. A.2A.A.2A.A.3A.A.A.A.3A.28A.A.3A.A.29A.A.3A.A.29A.A.3A.A.29A.A.3A.A. 29A.A.3A.A.29A.A.3A.A.29A.A.3A.A.29A.A.4A2.8A.A.3A.2A.3A.A.3A.3A.2A.A .2A.A.6A.2A.3A.A.A.2A.A.4A.A.8A.2A.2A.2A.3A.3A.3A.3A.A.2A.2A.A.A.2A. 2A.A.3A.A.A.2A.2A.A.A.A.10A.2A.3A.2A.2A.2A.2A.A.A.A.2A.2A.16A.A.2A.A. 3A.A.A.A.2A.A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A. 2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A. 2A.2A.A.A.2A.2A.A.3A2.2A.A.2A.2A.2A.3A.A.3A.3A.2A.2A.A.A.2A.2A.3A.A.A .2A.A.4A.A.2A.2A.A.2A.2A.3A.3A.3A.3A.A.2A.2A.A.A.2A.2A.A.3A.A.A.2A.A. 2A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A. 2A.A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A. 2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A. 2A.2A.A.3A2.2A.A.2A.2A.A.11A.2A.3A.10A.2A.A.A.19A.A.2A.A.17A.2A.A.2A. 2A.11A.3A.3A.14A.2A.A.19A.A.A.13A.A.2A.A.2A.2A.2A.3A.2A.2A.12A.A.2A.A .2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.2A.A.2A.A.A.18A.2A.A.A.18A.2A.A.A.18A. 2A.A.A.18A.2A.A.A.18A.2A.A.A.18A.2A.A.A.18A.2A.A.A.19A2.8A.A.3A.A.4A. 2A.2A.2A.A.2A.2A.2A.A.A.9A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.A.2A.3A.3A. 2A.A.2A.2A.2A.11A.2A.2A.A.A.9A.3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.A.2A.A .2A.2A.6A.A.12A.A.3A.A.A.A.2A.A.2A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A. A.A2.2A.A.3A.A.4A.2A.2A.2A.A.2A.2A.2A.A.A.3A.A.A.3A.A.3A.A.A.2A.2A.A. 3A.A.2A.A.2A.3A.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.A.3A.A.2A.A.2A. 3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.2A.A.4A.3A.A.3A.A.A.A.2A.A.2A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A .A.A.3A.A.A.A.A.A.2A.A.2A.A.A2.8A.A.4A.2A.2A.3A.10A.A.2A.A.2A.2A.A. 10A.2A.2A.2A.A.10A.A.2A.2A.2A.11A.3A.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A .A.3A.A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.2A.A.4A.3A.A.3A.A .A.A.2A.A.2A.A.A.18A.2A.A.A.34A.A.4A.A.A.A.A.A.18A.A.20A.A.A.A.A.A.2A .A.35A.2A.A.A.18A.A.2A.A.A2.8A.2A.10A.2A.3A.3A.2A.A.2A.A.12A.A.4A.2A. 2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A.3A.14A.2A.7A.10A.A.2A.A.2A.2A. 10A.2A.2A.A.2A.10A.A.3A.2A.2A.2A.11A.A.3A.A.2A.A.4A.3A.A.3A.A.A.A.18A .A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A. 2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.3A.A.A. 3A.A.3A.3A.2A.2A.A.A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A .3A.A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.11A.A.3A.A.3A.2A.2A. 2A.3A.3A.A.16A.A.12A.A.2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A. A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A .2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.3A.A.3A.3A.2A.2A.A.A.A.2A.A .4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A.6A.2A.3A.A.A.3A.3A.2A.A.2A .A.2A.2A.3A.2A.2A.2A.A.4A.A.8A.2A.2A.2A.3A.2A.2A.8A.2A.A.A.2A.A.2A.A. 2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.11A.A.A.A.A.A.10A.A.12A.A.A.A.A.A.10A.A .12A.A.A.A.A.A.10A.A.12A.A.A.A.A.A.10A.2A.A.A.A.A.A2.2A.2A.13A.A.3A. 10A.2A.A.A.A.2A.A.12A.A.2A.A.2A.10A.A.2A.2A.2A.11A.2A.A.2A.2A.2A.3A.A .A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A.2A.2A.A.2A.2A.3A.2A.2A.2A .2A.A.A.A.2A.A.2A.A.2A.A.2A.A.A.A.A.A.16A.2A.3A.3A.A.A.A.A.A.3A.2A.A. 4A.3A.A.A.A.A.A.3A.2A.A.4A.3A.A.A.A.A.A.3A.2A.A.4A.3A.A.A.A.A.A.3A.2A .2A.A.A.A.A.A2.6A.A.3A.2A.3A.A.2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A. 2A.A.2A.2A.A.3A.A.2A.A.2A.2A.A.2A.19A.A.3A.10A.A.2A.A.2A.2A.10A.2A.2A .A.17A.2A.A.2A.2A.10A.2A.2A.A.2A.A.12A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A. A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.A.3A.2A.3A.A .2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.3A. 9A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.7A.A. 2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.A.A.2A.A. 3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A .A.A.A.2A.2A.A.A.A.A.A2.8A.A.11A.2A.15A.A.A.A.A.12A.A.2A.A.2A.A.13A. 2A.A.6A.A.12A.3A.3A.A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A .A.3A.A.2A.A.2A.A.3A.A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.18A. 2A.A.24A.A.19A.2A.A.24A.A.19A.2A.A.24A.A.19A.2A.A.24A.2A.A.A.A.A.A2. 8A.2A.3A.2A.A.2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A .4A.3A.3A.2A.2A.A.10A.2A.3A.10A.A.2A.A.2A.2A.10A.2A.2A.2A.A.10A.A.2A. 2A.2A.11A.A.10A.A.3A.A.12A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.2A.2A.A .2A.2A.A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A.A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A. A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.3A.2A.A. 2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.3A.3A.12A. A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A .2A.2A.8A.A.3A.A.3A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.5A.A. 2A.2A.A.A.2A.A.3A.2A.A.5A.A.2A.2A.A.A.2A.A.3A.2A.A.5A.A.2A.2A.A.A.2A. A.3A.2A.A.5A.A.2A.2A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.3A.3A.A.11A.A.A.A.A .11A.A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.3A.2A.A.2A.A.2A.A.4A.2A.2A.3A.3A. 2A.A.2A.A.2A.2A.3A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.2A. A.3A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.16A.A.18A.A.3A.A.3A.A. 16A.A.18A.A.3A.A.3A.A.16A.A.18A.A.3A.A.3A.A.16A.A.18A.A.3A.2A.A.A.A.A .A2.2A.2A.A.11A.A.3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.6A.A. 12A.2A.A.2A.A.2A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.3A.A.2A.A.2A.3A. 2A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.8A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A. 2A.A.2A.A.3A.A.5A.A.A.2A.A.3A.A.2A.A.3A.A.5A.A.A.2A.A.3A.A.2A.A.3A.A. 5A.A.A.2A.A.3A.A.2A.A.3A.A.5A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.2A.A.2A.A. 3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.A.2A.4A.2A.A.2A. A.11A.2A.3A.10A.A.2A.A.2A.2A.11A.A.2A.A.2A.10A.A.2A.2A.2A.10A.2A.2A.A .2A.A.A.11A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.3A.A.A.2A.A. 3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A .2A.2A.A.3A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.2A.A.2A.A.3A.3A.A.A.A.A.3A.3A .A.A.8A.A.4A.2A.A.2A.3A.A.3A.A.2A.2A.A.2A.2A.3A.A.2A.A.2A.2A.2A.A.A. 3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.3A.A.6A.A.2A.A.A.2A.A.2A.A.3A.A.A .A.A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A .A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A. 2A.A.A.A.A.A2.22A.A.2A.A.11A.A.A.A.A.11A.A.A.A.A.10A.A.2A.17A.A.2A.2A .A.2A.2A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A. 2A.A.2A.A.2A.A.2A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.21A. A.A.2A.A.3A.2A.A.21A.A.A.2A.A.3A.2A.A.21A.A.A.2A.A.3A.2A.A.21A.A.A.2A .2A.A.A.A.A.A2.2A.2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A. 2A.2A.A.2A.2A.A.13A.A.14A.2A.A.A.6A.A.12A.A.2A.A.13A.2A.A.6A.A.12A.A. 26A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A. 2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A .A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A .A.A.A.3A.A.5A.A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A.3A.2A. 3A.A.A.2A.A.4A.2A.2A.8A.A.2A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A .2A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A .2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.2A.A.A. A.A.A2.133A.A.2A.2A.A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A. 3A.2A.3A.A.A.2A.A.4A.2A.2A.2A.A.2A.A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A .A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A .2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.2A.A.A.A.A.A2.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.11A.A.A.11A. A.A.A.2A.A.4A.3A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.2A.2A.A.2A.A.2A.2A. 2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A. 2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A .A.A.2A.2A.A.A.A.A.A2.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.2A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.6A.A.12A.A.2A.A.3A.A.4A.2A.A.2A .6A.A.11A.2A.2A.A.9A.A.3A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A. 2A.A.3A.11A.A.A.2A.A.3A.A.2A.A.3A.11A.A.A.2A.A.3A.A.2A.A.3A.11A.A.A. 2A.A.3A.A.2A.A.3A.11A.A.A.2A.2A.A.A.A.A.A2.2A.A.2A.A.A.A.A.A.A.A.A.A. A.A.68A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.A.3A.A.4A.2A. A.2A.3A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.2A.A.10A.2A.A.A.A.2A.A.3A.A.2A.A.10A.2A.A.A.A.2A.A.3A.A.2A.A. 10A.2A.A.A.A.2A.A.3A.A.2A.A.10A.2A.A.A.A.2A.2A.A.A.A.A.A2.17A.A.A.A.A .27A.2A.A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.3A .A.2A.A.2A.A.8A.A.4A.2A.A.2A.3A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.2A.A.2A.A .3A.A.A.A.A.A.A.A.A.2A.2A.3A.A.A.A.2A.2A.A.A.A.2A.A.4A.A.A.A.2A.2A.A. A.A.2A.A.4A.A.A.A.2A.2A.A.A.A.2A.A.4A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.A.A .A2.3A.A.A.A.A.4A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A. 11A.A.A.10A.2A.A.A.16A.A.2A.A.A.A.10A.A.2A.17A.A.8A.A.9A.2A.2A.A.2A.A .3A.A.A.A.A.A.A.A.A.2A.2A.3A.A.A.A.23A.2A.A.4A.A.A.A.23A.2A.A.4A.A.A. A.23A.2A.A.4A.A.A.A.23A.2A.2A.A.A.A.A.A2.2A.2A.12A.A.2A.2A.A.2A.A.A. 3A.2A.A.3A.A.4A.A.A.A.A.A.A.6A.A.3A.2A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A. 2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A .A.2A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A. A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A2.2A.2A.2A.2A. 2A.A.2A.2A.A.2A.A.A.22A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.2A.2A.A.A.A.2A.A. 2A.10A.A.2A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.A.3A .A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A .2A.A.3A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A 2.2A.2A.2A.2A.4A.2A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.3A.2A.2A.A.A. 43A.128A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.45A.A.3A.A.3A.A.45A.A. 3A.A.3A.A.45A.A.3A.A.3A.A.45A.A.3A.2A.A.A.A.A.A2.2A.2A.2A.2A.7A.4A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.10A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.3A .2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A .A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.2A.A.A.A.A.A2.14A. 2A.3A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A. A.A.2A.2A.2A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A. 3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.2A .A.A.A.A.A2.2A.A.2A.2A.2A.3A.A.5A.3A.A.A.A.A.A.A.A.A.A.A.A.16A.A.2A.A .A.A.86A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.3A.2A.2A.2A.A.6A.A.3A.A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A.6A.A.3A. A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A.6A.A.3A.A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A .6A.A.3A.A.3A.A.3A.2A.A.A.A.A.A2.2A.A.2A.2A.2A.2A.2A.A.3A.78A.A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.A .3A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.A.3A.A.3A.A.3A.11A.2A.3A.2A.A.3A .A.3A.A.3A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.2A.A.A.A.A.A2.2A.A.3A.A. 3A.3A.A.3A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A .A.A.A.A.A.A.A.2A.2A.2A.A.15A.A.3A.2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A. 2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A.2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A.2A. 10A.A.3A.A.3A.2A.A.A.A.A.A2.24A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A. 2A.A.104A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A. A.A.2A.2A.2A.A.3A.A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A.2A. 2A.A.2A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.A.3A.A.3A .A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.2A.A.A.A.A.A2.2A.A.3A.2A.2A.2A.A.9A. 60A.A.2A.8A.A.6A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.8A.A.2A.A.2A.A.3A.A .2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A. A.2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.2A.A.A.A.A.A2.2A.2A .A.2A.2A.A.4A.A.2A.4A.2A.2A.A.2A.A.A.A.A.2A.2A.2A.A.2A.4A.2A.2A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.26A.A.3A.A.2A.2A.A.2A.A. 26A.A.3A.A.2A.2A.A.2A.A.26A.A.3A.A.2A.2A.A.2A.A.26A.A.3A.2A.A.A.A.A.A 2.2A.2A.A.2A.A.14A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.2A.3A.6A.A.2A.3A.24A. 2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A .A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A.A.2A .A.2A.A.A.2A.2A.A.A.A.A.A2.18A.A.4A.2A.2A.A.3A.10A.2A.A.A.A.10A.A.14A .A.3A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A .A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.3A.2A.2A.A.3A.3A.2A.2A.A.A.A. 3A.2A.2A.A.3A.A.3A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A .A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.3A.2A.2A.A.3A.3A .2A.2A.A.A.A.3A.2A.2A.A.3A.A.3A.2A.A.12A.56A.2A.A.3A.A.A.25A.A.A.A.A. A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.50A.A.2A.50A.A.2A.50A.A. 2A.50A.2A.A.A.A.A.A2.2A.2A.A.9A.19A.3A.2A.2A.A.A.A.3A.2A.2A.A.24A.A. 4A.3A.A.A.A.A.A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A.3A.A.A.A.A.A.A.A.A.A .A.A.A.A.10A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A. A.A2.2A.2A.A.2A.A.2A.6A.2A.A.A.10A.2A.A.A.A.11A.A.A.A.A.A.A.3A.3A.A.A .A.A.A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .11A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.A.2A.A.A. A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 2A.A.2A.6A.A.2A.2A.A.2A.A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.3A. 3A.A.A.A.A.A.A.A.A.A.3A.A.24A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.3A .3A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.24A.A.36A.A.A .A.A.A.A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A.2A.A.2A. A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.4A.A.4A.A.A.A.A.A.A.A.A.A. 2A.2A.A.3A.2A.A.2A.2A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.A .2A.A.A.A.A.A.A.2A.2A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A. A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A .3A.A.28A.2A.A.A.14A.A.2A.A.A.A.A.8A.A.10A.A.A.A.A.A.A.A.A.2A.2A.A.3A .2A.A.2A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.6A.A.3A.A.7A.2A.A.A.A. A.A.A.2A.2A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A. A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A.3A.A.2A. 2A.2A.2A.A.2A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.A.4A.10A.2A .A.A.A.A.A.3A.A.6A.A.3A.A.3A.A.3A.A.3A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A .A.A.3A.3A.2A.A.2A.A.A.A.A.A.A.8A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.14A.A. 3A.2A.A.A.A.A.A.A.A.A.A.A.15A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A. 5A.A.3A.A.2A.2A.2A.2A.A.2A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.9A.A. 4A.3A.2A.2A.A.A.A.A.A.2A.2A.A.3A.26A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .3A.3A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.27A.2A.A.24A.2A.2A.A.3A.A. 3A.27A.2A.A.24A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.12A.A.2A.2A .10A.A.3A.2A.8A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.2A.A.11A.8A.2A.A. A.A.A.2A.2A.A.3A.2A.A.3A.A.2A.2A.A.3A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A. A.20A.2A.A.A.A.A.A.A.A.2A.2A.14A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.2A.A. 15A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 3A.A.10A.A.3A.2A.3A.2A.A.3A.A.9A.2A.A.A.11A.2A.2A.A.15A.2A.A.2A.A.3A. 3A.2A.A.3A.A.11A.A.11A.A.3A.2A.A.10A.A.2A.A.2A.A.3A.2A.2A.A.2A.A.A.A. A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.A.3A.2A.A .A.2A.2A.A.2A.2A.A.A.2A.2A.2A.A.3A.A.3A.A.3A.2A.A.A.2A.2A.A.2A.2A.A.A .2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.2A.A.3A.2A.3A.2A.A. 3A.A.3A.A.3A.2A.A.A.3A.3A.2A.2A.A.2A.A.2A.3A.4A.2A.A.3A.10A.A.3A.A.4A .2A.A.4A.2A.A.3A.A.2A.A.A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.68A.2A.A.2A.A. 2A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.3A.10A.A.3A.2A.A.2A.A.11A.A.8A.2A.A.3A .A.2A.3A.10A.A.3A.2A.A.2A.A.11A.A.8A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A 2.3A.A.3A.2A.A.3A.2A.3A.2A.A.9A.A.7A.A.2A.A.3A.3A.2A.2A.A.2A.A.2A.12A .2A.A.2A.2A.A.A.9A.9A.8A.A.2A.A.A.20A.A.3A.2A.2A.A.2A.5A.A.A.A.A.A.A. A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.3A.3A.2A.A.3A.2A.A.2A .A.4A.3A.2A.2A.2A.A.3A.A.2A.3A.3A.2A.A.3A.2A.A.2A.A.4A.3A.2A.2A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.2A.A.3A.2A.10A.2A.A.A.2A.A.2A.A. 3A.3A.2A.2A.A.3A.9A.2A.2A.A.5A.A.A.2A.A.4A.2A.A.4A.2A.A.3A.2A.16A.A. 2A.A.A.2A.2A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A. A.A.2A.2A.2A.A.2A.2A.A.7A.A.3A.A.3A.2A.A.2A.A.3A.A.7A.A.3A.2A.2A.A.3A .A.2A.2A.A.7A.A.3A.A.3A.2A.A.2A.A.3A.A.7A.A.3A.2A.3A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A2.3A.A.2A.A.5A.A.4A.A.3A.A.A.A.2A.A.2A.A.11A.2A.2A.A.3A. 3A.A.21A.A.A.2A.A.11A.A.11A.A.3A.2A.3A.A.A.A.A.A.5A.2A.A.2A.2A.2A.A.A .A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.3A.A.A.3A.A.2A.2A.A. 3A.A.2A.A.2A.A.2A.A.4A.A.A.3A.A.2A.2A.A.3A.A.2A.A.2A.A.3A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.2A.2A.A.A.6A.2A.A.A.2A.A.2A.2A.2A. A.3A.3A.A.A.A.A.3A.A.A.2A.2A.A.A.A.A.2A.2A.2A.2A.A.A.21A.4A.2A.2A.2A. A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.3A.A.A.3A.A.2A.2A .A.3A.A.2A.A.2A.A.2A.A.4A.A.A.3A.A.2A.2A.A.3A.A.2A.A.2A.A.3A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.18A.A.4A.A.A.A.2A.A.2A.2A.2A.A. 3A.3A.A.A.A.A.22A.2A.A.A.A.A.2A.2A.3A.16A.A.2A.A.3A.7A.5A.A.A.A.A.A.A .A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.36A.2A.A.34A.A.37A.2A.A.35A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.6A.A.2A.3A.A.2A.2A.A.2A.A.3A. 2A.A.A.11A.2A.2A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.3A.A.A.A. A.2A.A.2A.13A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A. 2A.A.A.A.A.2A.2A.A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.2A.2A.A.3A.A.A.A.A. 3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.2A.2A.A.2A.A.7A.A.2A .A.3A.3A.2A.2A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.3A.A.A.A.A. 2A.A.2A.5A.3A.A.A.A.A.A.A.A.A.A.A.A.A.20A.A.2A.A.A.A.A.2A.2A.2A.2A.A. A.A.A.5A.A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.5A.A.3A.A.A.A.A.3A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.2A.2A.10A.A.9A.2A.2A.A.2A.A.3A.3A.2A. 2A.A.3A.3A.A.A.A.A.A.10A.A.11A.A.11A.A.2A.2A.2A.3A.2A.2A.A.19A.A.3A. 3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.2A.A.34A.A.24A .2A.2A.A.3A.A.34A.A.24A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.20A.2A. 2A.2A.3A.2A.A.3A.2A.A.2A.A.2A.A.3A.3A.6A.A.2A.3A.3A.A.A.A.A.A.3A.2A.A .4A.2A.A.4A.2A.A.2A.2A.2A.3A.5A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.2A.A.2A.A.A.A.A.3A.A.5A.A.A.2A. 2A.2A.A.3A.A.2A.A.A.A.A.3A.A.5A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A2.2A.2A.2A.2A.3A.2A.A.3A.2A.A.2A.A.2A.A.10A.A.2A.3A.7A.2A.A.2A.A .A.A.11A.9A.9A.8A.A.3A.2A.2A.A.8A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.3A.A.A.A.12A.2A.2A.A.2A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A .2A.A.3A.A.2A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A2.2A.2A.2A.2A.3A.2A.A.4A.10A.2A.A.A.2A.2A.A.3A.2A.A.2A.2A.A.2A. A.A.A.3A.3A.2A.A.4A.2A.A.4A.2A.A.9A.2A.2A.2A.3A.A.2A.2A.23A.64A.A.2A. A.A.A.9A.A.A.A.2A.2A.2A.2A.10A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.2A.A. 11A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 2A.2A.2A.2A.10A.A.13A.2A.A.A.A.3A.11A.2A.A.2A.26A.A.4A.10A.A.11A.A. 11A.A.3A.A.3A.2A.2A.2A.10A.A.15A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A .A.A.A.4A.A.2A.A.A.A.2A.2A.2A.A.2A.A.3A.A.A.A.20A.A.2A.A.A.A.3A.A.3A. A.A.A.20A.A.2A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A. 2A.5A.2A.2A.A.A.19A.A.2A.A.11A.2A.A.A.2A.A.4A.A.A.A.A.A.A.A.2A.A.3A. 2A.2A.2A.3A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.19A.A.A.A.A .2A.2A.2A.A.2A.A.2A.2A.A.A.A.3A.3A.3A.25A.A.2A.2A.A.A.A.3A.3A.3A.25A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A.A.2A.3A.2A.2A.A.A.2A.2A. A.3A.A.2A.A.3A.A.2A.A.A.A.2A.A.5A.A.2A.A.A.A.A.A.A.2A.A.3A.2A.2A.2A. 3A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.3A.A.2A.2A.A.A.A.A. 5A.2A.A.2A.A.3A.A.A.A.6A.A.3A.A.7A.A.3A.A.2A.A.A.A.A.3A.A.A.A.6A.A.3A .A.7A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A.A. 2A.3A.2A.2A.A.A.2A.2A.A.3A.A.2A.A.4A.A.2A.2A.A.10A.2A.A.A.A.A.10A.A. 3A.A.3A.2A.2A.2A.2A.A.6A.6A.A.81A.2A.3A.A.3A.A.3A.31A.2A.A.2A.A.2A.2A .A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.15A.2A.A.2A.16A.A.2A.3A.A.2A. A.4A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.3A.2A.A.3A.A.3A.2A.2A.2A.2A.A.2A.A. 3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.A.4A.A.2A.3A.4A.2A.A.2A.2A. 3A.2A.A.2A.A.2A.2A.A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.3A. 3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A. 2A.A.2A.3A.A.2A.A.2A.3A.A.2A.A.3A.2A.6A.A.2A.A.A.37A.8A.A.3A.2A.2A.2A .2A.A.2A.A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.10A.A.2A.10A.A. 2A.A.2A.2A.3A.2A.A.2A.A.2A.2A.A.A.A.11A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A. A.11A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A .A.A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A .A.2A.2A.2A.2A.2A.A.2A.9A.2A.A.2A.A.A.10A.2A.A.A.A.A.A.A.2A.2A.12A.A. 4A.8A.A.2A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.2A.A.A.A.A.11A.2A.A.2A.A.A.A.A .2A.A.2A.A.A.A.A.11A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A. 2A.2A.2A.A.A.A.A.8A.A.4A.8A.A.2A.3A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A. A.A.A.A.A.2A.2A.3A.6A.2A.2A.A.4A.4A.2A.A.A.3A.2A.2A.A.A.A.A.A.A.3A.A. A.2A.A.4A.2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.2A.A.A.A.A.2A.2A.A.2A .A.2A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.A.13A.2A.A.3A.A.2A.A.3A.2A.2A. A.12A.A.A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.2A.A.2A.2A.A.3A.A.7A.2A.A.A.3A. 2A.2A.A.A.A.A.A.A.3A.A.A.2A.A.4A.2A.2A.A.A.4A.A.3A.2A.3A.2A.A.2A.A.2A .A.33A.2A.A.2A.A.2A.A.A.A.A.2A.A.33A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.2A.2A.9A.A.2A.A.3A.2A .2A.A.4A.3A.8A.A.2A.A.13A.A.A.A.2A.2A.2A.2A.2A.A.2A.2A.A.3A.2A.11A.A. 3A.2A.2A.A.A.A.A.A.A.3A.A.8A.A.4A.2A.2A.A.A.3A.2A.2A.3A.2A.A.2A.A.2A. A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A .A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A. 2A.A.14A.A.2A.A.2A.A.3A.2A.2A.A.4A.3A.2A.A.3A.A.2A.A.2A.2A.3A.A.A.A. 6A.A.13A.A.2A.2A.A.3A.2A.3A.3A.A.4A.A.3A.2A.A.A.A.A.A.A.18A.2A.3A.2A. 2A.A.A.3A.2A.2A.3A.2A.A.2A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A .A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.A.2A.A.2A.A.3A.2A.2A.A.4A. 10A.A.21A.2A.2A.A.2A.A.A.A.2A.2A.A.2A.A.2A.2A.A.3A.2A.3A.2A.2A.8A.A. 10A.A.A.A.A.A.A.A.A.2A.2A.3A.2A.2A.A.A.10A.2A.3A.2A.A.2A.A.2A.A.3A.2A .2A.A.7A.A.4A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.2A.2A.A.7A.A.4A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A .A.2A.A.2A.A.2A.A.3A.2A.2A.A.5A.2A.A.A.A.A.A.A.16A.A.2A.A.2A.2A.A.2A. A.2A.2A.A.3A.2A.3A.2A.2A.2A.A.3A.A.3A.A.4A.10A.A.12A.A.A.A.2A.2A.3A. 2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.3A.A.3A.4A.3A.3A.A.A.2A.A.2A.A. A.A.A.2A.A.3A.A.3A.4A.3A.3A.A.A.3A.A.A.A.A.A.A.6A.A.2A.A.A.A.A.A.A.A. A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A.8A.A.2A.A.2A.A.3A.2A.10A.A.2A. A.A.A.A.A.A.2A.A.2A.2A.A.2A.8A.2A.A.2A.A.2A.2A.A.3A.2A.2A.A.5A.2A.2A. A.9A.A.4A.3A.2A.A.4A.3A.A.A.A.2A.2A.3A.2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A .A.2A.A.14A.11A.A.A.2A.A.2A.A.A.A.A.2A.A.14A.11A.A.A.2A.A.2A.A.A.A.A. A.10A.2A.A.A.A.A.A.A.A.A.A.A2.2A.2A.35A.26A.2A.A.A.2A.A.3A.A.2A.A.2A. A.11A.A.11A.A.11A.A.3A.A.2A.2A.A.2A.5A.A.A.2A.A.2A.2A.A.3A.2A.2A.A.2A .A.2A.A.2A.A.11A.9A.8A.A.11A.A.3A.2A.3A.2A.A.2A.A.A.A.5A.3A.2A.A.2A.A .2A.A.3A.A.3A.2A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.2A.A.A.A.A.A. 3A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A2.2A.2A.A.A.A.3A.A.3A.A. A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A.2A.A.4A.2A.A.4A.2A.A.4A.2A.A.3A.A.3A.A .4A.6A.2A.A.A.2A.A.2A.2A.A.3A.2A.2A.A.2A.A.2A.A.2A.A.3A.3A.2A.A.4A.2A .A.3A.A.4A.2A.A.3A.2A.3A.2A.2A.25A.3A.2A.A.2A.A.8A.2A.A.A.A.A.A.A.2A. A.2A.A.A.A.A.8A.2A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.4A.2A.A.A.A.4A.A.4A.A .A.A.A2.2A.2A.A.A.A.3A.A.3A.A.A.A.A.6A.A.2A.A.2A.A.3A.2A.A.11A.9A.9A. 30A.A.2A.A.A.2A.A.2A.2A.A.4A.6A.2A.A.4A.2A.A.3A.10A.A.11A.A.10A.8A.2A .3A.15A.A.A.3A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A. 2A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.4A.A.2A.A.A.A.18A.2A.A.A2.2A.A.2A.A.A .10A.2A.13A.A.A.A.2A.A.2A.A.2A.A.3A.2A.A.3A.3A.2A.A.4A.2A.A.4A.3A.2A. 4A.3A.3A.11A.4A.2A.2A.A.3A.2A.3A.14A.2A.A.2A.A.2A.A.A.A.A.2A.A.4A.2A. A.3A.2A.3A.2A.A.2A.3A.A.A.3A.3A.2A.A.2A.A.A.48A.A.2A.A.A.A.A.A.48A.2A .A.A.A.A.A.A.A.3A.A.A.A.A.16A.2A.A.A2.2A.A.2A.A.A.3A.3A.A.A.3A.A.A.A. 2A.A.2A.A.2A.A.3A.2A.A.3A.10A.A.11A.A.12A.2A.A.2A.3A.3A.4A.A.13A.2A. 2A.A.3A.2A.3A.2A.A.2A.2A.2A.A.4A.2A.A.A.A.A.2A.A.11A.A.3A.2A.3A.2A.A. 2A.2A.2A.A.2A.4A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.2A.A.A.A.A.6A.2A.A.A.A2.2A.A.2A.A.A.3A .3A.A.A.3A.A.A.A.2A.A.2A.A.2A.A.3A.2A.A.5A.A.A.A.A.A.A.A.2A.A.2A.3A. 11A.5A.6A.A.3A.A.3A.2A.3A.2A.A.2A.20A.2A.A.A.A.A.3A.A.A.2A.2A.3A.2A.A .2A.3A.15A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.4A.2A.A.A.A.A.6A.2A.A.A.A2.2A.A.2A.A.A.3A.2A.2A .A.10A.2A.A.A.2A.A.2A.A.2A.A.3A.2A.11A.A.A.A.A.A.A.A.14A.A.7A.2A.A.2A .2A.4A.A.3A.A.3A.2A.3A.2A.A.2A.A.A.A.2A.A.32A.A.A.2A.2A.3A.2A.A.2A.3A .3A.2A.A.2A.3A.2A.A.2A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.14A.A.2A.A. A.A.A.A.A.A.A.A.5A.A.A.A.A.3A.2A.7A.A.2A.A.6A.2A.A.A.A2.2A.A.2A.A.A. 10A.2A.A.3A.2A.A.9A.2A.2A.A.2A.A.2A.A.3A.2A.3A.3A.A.A.10A.A.12A.2A.A. 2A.A.3A.A.A.2A.A.2A.2A.A.3A.A.14A.2A.A.2A.A.A.A.2A.A.3A.A.2A.A.A.A.A. A.A.3A.5A.2A.A.2A.3A.3A.2A.A.2A.3A.10A.2A.A.13A.10A.A.2A.A.A.10A.A.2A .2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.4A.A.2A.4A.A.2A.A.A.A.3A.15A.A.4A.A. 2A.A.A.A2.2A.2A.A.A.A.3A.A.A.3A.2A.A.3A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A. 3A.16A.A.4A.2A.A.4A.3A.2A.A.2A.A.3A.A.A.7A.8A.2A.A.3A.2A.A.2A.A.A.A. 8A.A.2A.A.A.A.A.A.A.3A.2A.2A.2A.A.2A.2A.A.7A.A.3A.2A.7A.A.2A.2A.A.2A. A.3A.4A.3A.2A.A.2A.A.A.3A.3A.12A.A.2A.A.A.A.A.A.A.A.A.A.6A.2A.6A.2A.A .4A.2A.3A.6A.9A.A.2A.4A.A.2A.A.A.A2.2A.2A.A.A.A.3A.A.A.3A.2A.A.3A.A. 3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.2A.A.4A.2A.A.4A.10A.A.2A.A.2A.2A .A.A.4A.A.2A.A.A.A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.3A.A.A .3A.2A.A.2A.2A.2A.A.2A.2A.A.2A.2A.2A.A.7A.A.3A.A.2A.A.A.2A.A.7A.A.3A. 3A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.4A.4A.4A.5A.A.2A.8A.A.6A.7A.2A.A.2A.4A .A.2A.A.A.A2.2A.A.2A.A.A.10A.2A.A.10A.A.3A.A.3A.2A.2A.A.2A.A.2A.A.3A. 2A.2A.2A.A.A.9A.8A.2A.A.A.A.A.8A.A.2A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A .A.A.A.A.A.11A.3A.2A.2A.3A.A.A.3A.2A.A.2A.3A.10A.2A.A.2A.A.2A.A.2A.2A .A.A.A.A.A.2A.A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.4A.A.4A.2A.A.2A.A.4A. 5A.6A.4A.2A.4A.2A.4A.A.2A.A.A.A2.2A.A.2A.A.A.3A.3A.A.A.2A.2A.2A.A.3A. 2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.2A .A.A.11A.2A.A.2A.A.10A.A.11A.A.12A.A.3A.3A.3A.2A.2A.3A.27A.3A.3A.2A.A .6A.2A.A.2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.A.A.3A.2A. A.3A.2A.A.6A.A.3A.A.3A.2A.5A.4A.A.2A.2A.A.2A.A.A.A2.2A.A.2A.A.A.3A.3A .A.A.2A.2A.2A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A. A.A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.2A.A.2A.A.3A.2A.A.4A.2A.A.4A.3A.A.3A. 3A.3A.2A.2A.3A.3A.3A.3A.3A.3A.3A.3A.3A.32A.2A.A.32A.A.2A.A.A.A.A.A.A. A.A.A.7A.2A.6A.A.7A.6A.2A.5A.4A.A.2A.4A.2A.A.A.A2.2A.A.2A.A.A.3A.3A.A .A.12A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.10A.2A.A.A.A.11A.A.A.A.2A .A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.11A.9A.9A.9A.3A.3A.3A.2A.2A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.2A.A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.2A.A.2A.A.A.A.A .A.A.A.A.3A.4A.2A.4A.2A.A.7A.6A.A.2A.4A.A.5A.A.2A.4A.2A.A.A.A2.2A.A. 2A.A.A.11A.A.A.2A.2A.A.2A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.3A.2A.2A.A. A.A.3A.3A.A.A.A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.5A.3A.3A.2A.A.4A.2A.A.4A. 2A.A.12A.3A.3A.2A.2A.3A.3A.2A.A.7A.A.12A.3A.11A.2A.A.2A.A.A.A.5A.A.2A .A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.4A.7A.2A.6A.A.5A.A.7A.2A.5A.A.2A. A.7A.2A.4A.2A.A.A.A2.2A.2A.A.A.A.2A.A.2A.A.A.2A.2A.A.2A.2A.2A.A.2A.A. 2A.A.3A.2A.2A.A.2A.3A.2A.A.12A.9A.9A.A.A.2A.A.2A.A.2A.2A.A.A.3A.13A. 3A.10A.A.11A.A.11A.A.3A.2A.A.3A.3A.2A.2A.3A.3A.3A.3A.5A.A.3A.3A.3A.2A .A.30A.A.26A.A.4A.A.A.A.A.A.A.A.A.A.10A.A.2A.5A.4A.5A.A.2A.7A.A.2A.6A .A.2A.2A.A.A.A2.2A.2A.A.A.A.3A.A.A.10A.A.2A.2A.2A.2A.A.2A.A.2A.A.3A. 2A.2A.A.2A.3A.2A.A.4A.3A.2A.A.4A.2A.A.3A.A.11A.A.3A.A.2A.A.2A.2A.A.A. 3A.2A.2A.3A.3A.A.A.A.A.A.A.A.2A.2A.A.3A.3A.2A.2A.3A.3A.3A.2A.2A.3A.A. 3A.3A.3A.3A.A.A.A.A.3A.A.4A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.6A.A. 2A.4A.2A.8A.A.2A.6A.2A.A.7A.A.5A.A.A.A2.2A.2A.A.A.16A.A.2A.3A.2A.A.2A .2A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.4A.A.3A.A.4A.3A.2A.A.11A.A.3A.A. 4A.2A.A.3A.A.2A.A.2A.2A.A.A.3A.2A.2A.3A.4A.A.2A.A.A.A.A.A.A.2A.2A.A. 3A.3A.2A.2A.3A.3A.13A.3A.A.3A.4A.A.4A.3A.A.A.A.A.2A.2A.A.2A.2A.A.A.A. 2A.2A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.5A.A.4A.A.2A.A.4A.2A.A.3A.A .A.A2.2A.2A.A.A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.2A.A.2A.A.2A.A.3A.2A.2A .A.11A.A.10A.11A.A.A.9A.8A.A.2A.A.2A.2A.A.A.3A.2A.2A.12A.2A.A.A.A.A. 10A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.2A.A.2A.2A.3A.A.2A.A.7A.A.4A.3A.A.A.A .A.2A.2A.A.2A.A.2A.19A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A. A.A.A.3A.A.A.A2.2A.2A.A.A.3A.A.2A.A.2A.3A.2A.A.2A.6A.A.3A.A.2A.A.2A.A .3A.2A.2A.A.4A.2A.A.3A.A.4A.3A.3A.A.A.2A.A.4A.2A.A.3A.A.2A.A.2A.2A.A. A.3A.2A.A.10A.2A.2A.A.A.A.A.3A.2A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.2A.A.2A .2A.3A.A.2A.2A.2A.A.4A.2A.A.2A.A.A.A.20A.A.2A.3A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A2.16A.2A.A.A.A.2A.A.2A.A .10A.2A.2A.A.2A.10A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.2A.2A.A.4A.8A.A.4A.3A .3A.14A.A.11A.A.3A.A.2A.A.2A.2A.A.A.3A.2A.A.4A.A.37A.8A.2A.A.3A.3A.2A .2A.3A.2A.2A.A.5A.3A.A.2A.2A.9A.3A.A.A.A.A.3A.3A.2A.A.2A.2A.A.2A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A2.3A.A.2A. 2A.A.A.A.2A.A.2A.A.3A.2A.2A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.A.3A.2A. A.3A.A.A.11A.3A.3A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.3A.A.2A.A.A.A. A.A.A.A.A.A.A.A.3A.3A.2A.2A.3A.3A.13A.3A.A.2A.A.2A.A.A.2A.A.2A.A.A.A. 6A.A.3A.A.7A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.4A.2A.A.A2.3A.A.2A.2A.A.A.A.2A.A.2A.A.3A.2A.2A.2A.2A.A.3A.A.A.2A. A.3A.A.2A.A.2A.A.3A.2A.A.4A.2A.A.A.A.A.4A.A.4A.A.A.A.A.2A.A.2A.A.2A. 2A.A.A.3A.2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.11A.2A.2A.3A.3A.2A.2A.3A .3A.A.2A.A.2A.A.A.3A.A.A.A.A.3A.3A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.8A.2A.A.A.2A.2A.A.A2.2A.2A.10A.A.2A.A.A.2A. A.2A.A.3A.2A.2A.2A.2A.A.16A.A.3A.A.3A.A.2A.A.2A.A.3A.A.15A.A.2A.A.A.A .8A.A.4A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.14A.A.10A.A.2A.A.A.A.A.A .A.A.3A.2A.2A.3A.3A.2A.2A.3A.4A.A.2A.2A.A.2A.A.A.3A.A.A.A.A.3A.3A.2A. A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.14A.A.2A.A.A. 3A.A.A2.2A.2A.3A.2A.A.2A.A.A.2A.A.2A.A.10A.2A.2A.2A.A.3A.A.2A.A.3A.A. 3A.A.2A.A.2A.A.3A.A.3A.A.2A.2A.A.2A.A.A.A.2A.A.3A.A.4A.A.A.A.A.2A.A. 2A.A.2A.2A.A.A.3A.2A.2A.A.3A.A.3A.2A.A.2A.A.A.A.A.A.A.A.3A.2A.2A.3A. 3A.2A.2A.12A.A.2A.14A.A.2A.3A.A.A.A.A.3A.10A.A.2A.3A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.20A.A.2A.A.A.4A.2A.A2.2A.2A.3A.2A.A.2A.A.A. 2A.2A.A.A.3A.A.2A.2A.9A.A.2A.A.3A.A.3A.A.2A.A.2A.A.3A.A.3A.A.2A.32A.A .10A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.9A.13A.A.A.A.A.A.A.3A. 13A.3A.2A.2A.5A.7A.A.A.2A.A.2A.3A.A.A.A.A.11A.A.A.2A.A.2A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.10A.A.7A.A.2A.A.A.A.3A.A2.2A.2A.3A.2A.A. 2A.A.A.2A.2A.A.A.3A.A.2A.2A.2A.A.3A.A.11A.A.3A.A.3A.A.2A.A.2A.A.3A.A. 5A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.2A. A.4A.2A.2A.2A.2A.10A.A.2A.10A.A.4A.2A.2A.3A.3A.2A.A.2A.2A.2A.5A.A.A. 2A.A.2A.2A.2A.A.A.A.A.A.3A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A.A .A.A.A.A.6A.A.2A.7A.A.A.A.A.4A.2A2.5A.10A.A.2A.A.A.2A.2A.A.A.3A.8A.2A .2A.A.11A.A.2A.2A.A.3A.A.2A.A.2A.A.11A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A. 2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.2A.A.11A.2A.2A.2A.3A.2A.A.2A.3A.2A. A.4A.2A.2A.3A.3A.2A.A.2A.2A.A.2A.3A.A.A.4A.2A.2A.2A.A.A.A.A.A.12A.2A. 3A.A.A.A.A.A.A.A.A.A.A.A.7A.A.A.A.A.A.A.A.7A.A.10A.A.2A.A.A.A.5A2.8A. A.2A.3A.10A.A.2A.2A.2A.A.19A.A.3A.A.2A.A.2A.2A.A.3A.A.2A.A.3A.A.2A.A. 2A.A.A.A.10A.A.2A.11A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.3A.A.A. 17A.15A.9A.2A.2A.3A.3A.2A.A.2A.2A.A.2A.24A.2A.3A.A.A.A.A.A.A.A.2A.2A. 3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.6A.2A.A.7A.A.A.A.A.A. A2.2A.A.3A.A.2A.3A.3A.2A.A.2A.2A.2A.A.2A.2A.A.3A.A.3A.A.2A.A.2A.2A.A. 3A.A.2A.A.3A.A.19A.A.3A.2A.A.2A.3A.3A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A .2A.A.3A.3A.A.A.3A.2A.A.4A.2A.A.3A.A.4A.2A.A.4A.2A.2A.3A.3A.2A.A.2A. 6A.A.2A.A.A.A.2A.2A.3A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.A.2A.A.2A.A.2A.A .2A.2A.8A.A.2A.2A.A.3A.A.A.3A.A.4A.A.2A.A.7A.A.A.A.A.A.A2.2A.A.24A.8A .A.3A.2A.A.2A.2A.A.2A.2A.10A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.2A.9A.A.2A. A.12A.15A.9A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.3A.A.A.3A.2A.A.11A .A.3A.A.11A.A.4A.2A.2A.3A.3A.3A.A.4A.A.2A.A.A.A.2A.2A.56A.A.4A.A.A. 10A.A.6A.6A.A.15A.2A.5A.A.6A.A.2A.11A.4A.2A.A.A.5A.A.A.A.A.A.A2.3A.A. A.2A.A.4A.2A.A.3A.A.3A.A.17A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.2A.A.3A.A.2A .A.2A.2A.3A.A.A.2A.A.4A.3A.2A.A.3A.A.4A.2A.A.4A.A.A.2A.A.2A.A.2A.2A.A .A.3A.2A.2A.A.3A.3A.A.A.4A.A.4A.A.A.3A.A.A.3A.2A.2A.3A.3A.2A.2A.A.2A. A.2A.A.A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.4A.A.5A.A.7A.9A .7A.9A.2A.2A.2A.A.9A.4A.A.6A.2A.2A.A.A.5A.A.A.A.A.A.A2.3A.A.A.2A.A. 11A.A.3A.A.3A.A.4A.A.2A.A.2A.2A.2A.3A.2A.2A.2A.A.9A.A.3A.A.2A.A.2A.2A .3A.A.A.2A.A.4A.10A.A.3A.A.11A.A.4A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A. A.3A.2A.A.19A.A.4A.A.A.3A.A.A.3A.2A.2A.3A.3A.2A.2A.A.2A.A.2A.A.A.A.2A .A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.4A.A.5A.A.2A.6A.3A.A.8A.2A. 2A.5A.A.4A.5A.A.5A.A.6A.2A.2A.A.A.5A.A.A.A.A.A.A2.3A.A.A.3A.A.A.2A.A. 3A.A.4A.A.2A.A.2A.2A.2A.3A.2A.2A.10A.2A.2A.A.2A.A.2A.2A.12A.2A.2A.A. 3A.2A.A.A.3A.A.A.3A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.11A.A.2A.A. 4A.A.A.15A.3A.2A.2A.3A.3A.2A.2A.A.10A.2A.A.8A.A.2A.A.3A.2A.A.7A.A.3A. A.7A.A.3A.A.3A.A.4A.A.A.6A.A.5A.A.2A.4A.2A.4A.2A.4A.2A.3A.A.4A.A.2A. 6A.A.5A.A.6A.A.A.5A.A.A.A.A.A.A2.3A.A.A.4A.A.2A.A.2A.A.3A.A.4A.8A.A. 2A.2A.2A.10A.2A.4A.A.3A.2A.2A.A.2A.A.2A.A.10A.2A.2A.2A.A.3A.2A.A.A.3A .A.A.3A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.A .A.3A.3A.2A.2A.3A.3A.3A.12A.A.3A.2A.A.2A.A.3A.A.2A.A.3A.3A.3A.3A.3A. 2A.A.3A.A.3A.A.2A.A.A.10A.A.2A.4A.A.2A.5A.4A.A.2A.2A.A.2A.4A.2A.A.11A .2A.2A.A.A.3A.A.A.A.A.A.A2.2A.A.19A.A.2A.A.2A.A.3A.A.13A.2A.A.3A.A.2A .2A.A.2A.A.3A.2A.2A.A.2A.A.2A.A.4A.A.2A.2A.2A.A.3A.A.13A.A.4A.15A.A.A .2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.2A.2A.A.4A.A.2A.9A.A.A.A.A.3A.3A.2A. 2A.3A.3A.3A.2A.2A.A.2A.A.7A.A.3A.A.3A.A.2A.A.3A.3A.3A.3A.10A.A.3A.A. 3A.2A.A.A.A.7A.A.4A.2A.5A.4A.A.2A.5A.7A.A.A.6A.2A.3A.A.A.3A.A.A.A.A.A .A2.11A.A.20A.A.3A.2A.A.2A.2A.9A.A.2A.2A.A.2A.A.3A.2A.2A.A.2A.A.2A.A. 4A.A.2A.2A.2A.A.12A.2A.A.4A.2A.A.2A.2A.A.11A.A.3A.A.2A.A.2A.2A.A.A.3A .2A.2A.A.21A.A.A.A.27A.3A.2A.2A.3A.3A.3A.2A.2A.A.3A.3A.2A.A.14A.2A.A. 7A.A.11A.2A.A.A.2A.A.3A.A.2A.A.A.A.6A.A.2A.4A.A.2A.4A.A.6A.A.4A.A.7A. 2A.A.A.6A.2A.4A.2A.A.3A.A.A.A.A.A.A2.3A.A.A.A.A.2A.A.3A.2A.A.14A.A.2A .A.18A.A.3A.2A.4A.2A.A.2A.A.17A.2A.3A.A.3A.2A.A.4A.2A.A.2A.2A.A.4A.2A .A.3A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.8A.2A.A.3A.A.A.A.3A.A.A.A.A.3A.2A. 2A.3A.3A.3A.2A.2A.A.3A.3A.2A.A.6A.3A.3A.3A.4A.2A.A.A.A.2A.A.3A.2A.A. 3A.A.6A.A.2A.5A.A.2A.A.8A.A.4A.8A.3A.A.7A.A.4A.A.2A.4A.A.2A.A.A.A.A.A 2.3A.A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.7A.A.2A.2A.3A.A.A .3A.A.3A.9A.7A.9A.8A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.29A.A.A.A. A.3A.2A.2A.3A.3A.3A.2A.2A.A.19A.3A.3A.3A.2A.2A.2A.2A.A.A.A.2A.A.3A.A. 2A.A.7A.6A.A.2A.4A.2A.A.2A.5A.A.2A.A.10A.2A.7A.6A.2A.A.6A.2A.2A.A.2A. A.A.A.A.A2.7A.A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A.A.A.A.A.A.3A.A.3A.A.2A. 2A.3A.A.A.3A.A.4A.A.2A.A.A.3A.2A.A.4A.2A.A.3A.A.2A.A.2A.2A.A.A.3A.2A. A.2A.2A.2A.A.A.A.A.A.A.A.A.A.11A.3A.2A.2A.3A.3A.3A.2A.A.7A.A.3A.A.2A. A.A.3A.3A.3A.2A.2A.2A.A.2A.2A.2A.A.2A.A.3A.2A.A.A.14A.A.2A.6A.2A.A.7A .A.A.6A.2A.A.14A.2A.A.A.4A.A.3A.A.2A.A.A.A.A.A2.2A.2A.A.A.10A.A.3A.A. 3A.2A.A.A.A.2A.A.38A.A.3A.8A.2A.16A.A.19A.A.2A.A.A.4A.A.3A.A.11A.A.3A .A.2A.A.2A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.3A.3A.3A.2A.2A. 3A.3A.3A.3A.3A.2A.A.2A.A.A.3A.3A.3A.40A.A.4A.A.A.A.11A.A.4A.A.2A.A.4A .2A.A.A.5A.A.A.11A.A.A.A.8A.2A.A.A.A.A.A2.2A.2A.A.2A.A.4A.2A.A.3A.A. 3A.2A.A.A.A.10A.2A.A.A.A.A.A.A.3A.4A.2A.A.A.A.2A.2A.A.A.3A.8A.A.9A.A. 4A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.34A.A.9A.A.10A.3A.3A.3A.5A.3A. 3A.3A.3A.3A.2A.A.2A.A.A.3A.3A.13A.A.A.2A.2A.A.A.3A.A.A.A.A.3A.A.A.A.A .A.A.A.A.A.3A.A.A.A.3A.A.A.A.A.8A.A.2A.A.A.A.A2.4A.A.18A.8A.A.3A.A.2A .A.A.A.A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A.A.A.2A.2A.A.A.3A.2A.A.3A.A.3A .A.3A.A.4A.A.A.2A.A.2A.A.2A.A.2A.A.7A.3A.A.A.A.A.A.A.2A.A.3A.A.3A.A. 3A.A.4A.3A.3A.2A.A.8A.3A.3A.3A.18A.A.2A.A.A.3A.3A.2A.2A.A.A.A.A.A.A.A .2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A. A.A2.12A.A.3A.A.4A.2A.A.2A.2A.A.2A.A.A.A.A.5A.A.A.A.A.A.A.3A.3A.24A. 2A.A.A.10A.A.9A.A.10A.A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.3A.A.A.A.A.A.A. 8A.A.9A.A.4A.4A.A.4A.2A.2A.3A.3A.3A.3A.2A.2A.A.A.A.A.A.3A.3A.2A.2A.A. A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A .2A.A.A.A.A2.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .2A.2A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.3A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A. A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.2A .A.2A.10A.A.2A.2A.A.2A.A.A.A.A.6A.A.2A.A.A.A.A.A.4A.A.4A.2A.A.2A.A.A. A.10A.2A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.3A.A.A.A.A.A.A.A .A.A.A.12A.A.11A.2A.11A.3A.3A.2A.2A.A.A.2A.A.2A.A.3A.3A.55A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.A.A.A.2A. 2A.A.A.A.A.A.3A.A.A.A.A.A.8A.A.4A.2A.A.2A.A.A.A.3A.2A.2A.A.A.A.A.A.A. A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.4A.A.13A.A.2A.A.A.A.A.A.A.A.A.2A.A.3A .2A.A.A.A.A.3A.3A.30A.A.2A.3A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.4A.A.2A.A.A.A.5A.A .A.A.A.A.4A.A.2A.A.A.A.A.2A.A.3A.A.5A.A.34A.60A.A.2A.A.4A.2A.A.4A.2A. 13A.2A.A.2A.A.A.A.A.A.A.A.A.8A.2A.A.A.A.A.3A.2A.A.2A.A.A.A.2A.A.3A.A. 2A.3A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A2.19A.A.A.A.8A.2A.A.A.A.A.8A.A.2A.A.A.A.A.2A .A.12A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.8A.A.2A.9A.A.A.3A.2A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.3A.3A.3A.A.A.A.A.A .A.A.A.A.5A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A 2.2A.2A.A.3A.A.A.A.2A.A.3A.2A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.3A.A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.A.2A.2A.A.4A.A.A.3A.2A.2A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.3A.3A.64A.2A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.28A.A.37A.A. 40A.A.118A.A.15A.A.24A.159A.12A.A.2A.A.A.A.A.A.A.A.A.5A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.8A.3A.3A.3A.3A.3A.3A.7A .3A.9A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.3A.A. 3A.3A.3A.25A.A.2A.4A.3A.3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.7A.7A.7A.7A. 7A.3A.A.9A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.2A.2A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.A.5A.3A.3A.3A.3A.3A.3A.5A.5A.3A.3A. 5A.3A.A.27A.A.2A.4A.3A.3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.3A.A.9A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.3A.A.3A.19A.A.2A.7A.4A.6A.2A.A.5A.3A.A.3A. 17A.A.2A.6A.A.10A.3A.14A.A.2A.6A.7A.7A.A.15A.A.2A.7A.4A.3A.3A.3A.3A. 3A.3A.5A.5A.3A.3A.5A.3A.A.3A.A.2A.4A.3A.3A.3A.9A.A.7A.2A.2A.3A.3A.5A. A.19A.2A.4A.3A.3A.5A.3A.A.4A.A.2A.7A.3A.3A.3A.9A.A.7A.2A.2A.A.5A.3A. 3A.3A.3A.3A.7A.3A.3A.5A.3A.A.5A.7A.2A.2A.14A.3A.19A.3A.21A.2A.A.5A.3A .3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.3A.A.3A.3A.A.2A.4A.3A.3A.3A.31A.A.7A .2A.2A.3A.3A.5A.A.4A.4A.5A.A.4A.6A.A.5A.5A.A.4A.6A.A.5A.5A.A.4A.7A.4A .6A.2A.A.5A.3A.A.3A.30A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A$5.6A7.5A5.A 10.A3.5A10.A3.4A4.7A3.A4.A2.5A5.A6.A7.A2.A6.A6.A3.A3.9A2.A5.4A3.4A2. 4A2.A3.A3.A6.6A5.A6.A20.6A4.2A4.A3.A3.A95.2A7.A$5.A3.5A6.A4.4A10.A7.A 10.A6.A4.A5.A3.A4.A2.A2.5A2.A6.9A2.A4.5A4.A3.A11.A2.A5.A2.A3.A2.A2.A 2.A2.A3.A3.A6.A10.A4.5A22.8A4.A3.A3.A95.A8.A$5.A7.A6.A4.A13.A7.A10.A 6.A4.A5.A3.A4.4A6.A2.A6.A10.3A2.A3.A4.A3.A11.A2.7A2.5A2.A2.A2.A2.A3.A 3.8A10.A4.A3.A22.A11.A2.2A3.A95.A5.4A$3.5A5.A6.6A11.5A3.3A8.5A4.A4.A 5.A3.A7.A6.A2.A6.A12.A2.A3.A4.A3.A11.A18.4A2.A2.A3.A21.A4.A3.A11.6A5. A11.A2.3A2.A33.63A5.2A$3.A3.A5.A6.A3.4A9.A3.A3.A10.A3.A4.A4.7A3.A7.8A 2.A4.5A10.A2.A3.A4.A3.A8.4A24.4A3.A21.A4.A3.A11.A4.A5.A11.A2.A4.A33.A 67.A$3.A3.A5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A6.A7.A9.A4.A3.A2.4A2.3A2.5A 4.A3.A8.A34.20A2.A4.5A11.A4.15A3.4A4.A33.A67.A$3.A3.A5.A6.A6.A9.A3.A 3.A10.A3.A4.A7.A4.3A7.A9.A4.A3.A2.A2.A2.A6.A6.A3.A8.A53.A2.A6.A4.10A 18.A11.A33.A40.5A4.19A$3.5A2.4A3.7A3.A9.5A3.A10.5A4.A7.A4.A7.5A7.A4.A 3.A2.A2.4A6.A6.A3.A8.A53.A2.A6.A4.A7.4A16.A11.A33.A40.A3.A4.A16.4A$5. A4.A6.A5.A3.A11.A5.A12.A6.A4.9A7.A3.A5.3A4.5A2.A4.4A2.5A2.3A3.A8.A16. 5A5.5A5.5A12.A2.A4.5A2.A10.A16.A45.A3.20A12.6A3.6A19.A$5.A4.A6.A5.A3. A11.A5.A12.A6.A4.A6.4A5.A3.A5.A8.A4.A7.A2.A3.A2.A5.A8.A16.A3.A5.A3.A 5.A3.A12.A2.A4.A3.A2.A10.A5.5A6.A45.A3.A18.A12.A12.4A17.A$3.5A2.4A3.A 5.A3.A9.5A3.A12.8A4.A9.A5.A3.A5.A8.A4.A7.A2.A3.A2.A5.A8.A2.15A3.7A3. 7A3.5A8.A2.A4.A3.A2.A3.8A2.A2.A3.A6.35A11.A3.A18.A8.5A15.A17.A$3.A3.A 5.A3.7A3.A9.A3.A3.A15.A6.5A7.A5.5A5.A8.14A2.A3.A2.A5.A8.A2.A10.A2.A3. A2.A2.A3.A2.A2.A3.A3.A8.A2.A4.A3.A2.A3.2A4.8A3.4A37.A11.A3.A17.2A8.A 2.4A13.A12.6A$3.A3.A5.A6.A6.A9.A3.A3.A15.A6.A3.A2.6A7.A7.A16.A7.5A2. 3A3.A8.A2.A10.A2.5A2.A2.5A2.A2.5A3.7A2.A2.A4.5A2.A3.A9.A2.A3.A2.A37.A 11.A3.A17.11A5.A7.7A12.A3.4A$3.A3.A5.A6.A6.A9.A3.A3.A13.5A4.A3.A2.A 12.A7.A16.A9.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6.A4.A3.A12.5A2.A37. A11.A3.A17.A15.A7.A4.4A10.A6.A$3.5A2.4A4.5A2.3A9.5A3.A13.A3.A4.A3.A2. A12.6A2.A14.5A7.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6.A4.A3.A2.4A13.A 37.A11.A3.A17.A15.A2.6A7.A5.6A6.A$5.A4.A7.A3.A2.A13.A5.A13.A3.A4.5A2. A12.A4.A2.A14.A3.A7.8A3.A8.A2.A3.8A3.7A2.4A3.A10.A5.A2.A2.4A3.A4.A3.A 2.A2.A13.A37.A11.A3.A6.9A2.A15.A2.A3.4A5.A5.A3.4A4.A$5.A4.A7.A3.A2.A 13.A5.A13.A3.A6.A4.A12.A4.A2.A14.A3.A8.A9.A8.A2.A3.A6.A3.A8.A2.A3.A 10.A3.3A2.A4.6A4.A3.A2.A2.15A36.2A11.A3.A6.A7.A2.A15.A2.A6.A5.A5.A6.A 4.A$3.5A2.4A4.A3.A2.A13.7A13.5A6.A4.A10.5A2.A2.A14.A3.A8.A9.A8.A2.A3. A6.A3.A8.A2.5A10.A3.A4.A4.A9.A3.4A16.A36.14A3.A6.A7.A2.A15.A2.A6.A5.A 5.A6.A4.A$3.A3.A5.A4.5A2.3A13.A19.A8.6A10.A3.A2.A2.A14.5A8.A9.A8.A2.A 3.4A3.A3.4A5.A9.5A3.A3.A4.A4.A9.A5.2A16.A36.A16.A4.5A4.2A2.A13.3A2.8A 5.A5.8A4.A$3.A3.A5.A6.A6.A13.A19.A11.A12.A3.A2.A2.A16.A10.A9.A8.A2.A 6.A3.A6.A5.A9.A2.6A3.3A2.3A2.A9.A5.A3.5A2.5A2.A36.A16.A4.A3.A4.5A13.A 9.A7.A10.A6.A$3.A3.A5.A6.A6.A11.5A15.5A9.A12.A3.A2.4A16.A10.A9.A8.A2. A6.A3.A6.A5.A9.A2.A3.2A5.A3.5A9.A5.A3.A3.A2.A3.A2.A36.A16.A4.A3.A4.A 2.4A11.A9.A7.A10.A6.A$3.5A2.4A6.8A11.A3.A15.A3.A7.5A10.5A22.A5.6A9.A 8.A2.A3.4A2.2A5.2A4.2A9.A2.A3.A6.A3.A13.A5.5A3.4A3.4A36.2A10.6A4.A3.A 4.A5.A6.6A9.9A7.7A3.A$5.A4.A11.A16.A3.A15.A3.A7.A3.A12.A24.A5.A14.A8. A2.A3.A5.4A3.4A2.12A2.A3.A6.A3.A7.7A9.A3.A2.A3.A6.6A27.4A8.A3.4A2.5A 4.A5.A6.A3.4A10.A3.5A4.A5.A3.A$5.A4.A11.A16.A3.A15.A3.A7.A3.A12.A24.A 5.A14.A8.A2.A3.A5.A2.A3.A2.A2.A13.A3.8A3.A7.A15.5A2.5A6.A4.A12.6A12.A 8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.6A11.A16.5A15.5A7.A3.A12.A17. 8A5.A2.13A2.7A2.A3.7A2.5A2.4A13.A14.4A4.A33.A4.A12.A4.A12.A8.A6.A4.A 6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.A3.5A8.A18.A19.A9.5A12.A17.A12.A2.A14. A8.A36.A16.2A4.A33.A3.2A3.5A4.A4.14A6.5A4.A4.A2.5A5.A4.5A4.A8.5A3.3A 4.7A3.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A14.A8.A36.14A4.A4.A16.6A 2.10A3.6A3.6A16.4A4.A3.A4.A4.A2.A2.5A2.A4.A3.A4.A8.A3.A3.A9.A6.A$5.A 7.A8.A18.A19.A11.A14.A17.A12.A2.A2.13A2.7A4.30A14.2A4.A4.A16.A4.A2.A 12.A12.4A17.A4.A3.A4.A4.4A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.3A$5.9A8.A18.A 19.A11.A14.A11.7A4.9A2.A2.A14.A10.A28.A15.A3.2A4.A16.A4.A2.A12.A15.A 17.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A$5.A16.A18.A19.A8.4A14. A11.A10.A10.A2.A14.A10.A28.A15.A3.4A2.A16.A3.2A2.A7.6A15.A12.6A4.5A4. A7.8A2.A4.5A4.A8.5A3.A6.9A$5.A16.A18.A19.A8.A17.A11.A10.A10.A2.A2.13A 2.9A2.24A2.A7.5A3.5A2.A2.A2.15A3.5A7.A3.4A7.7A12.A3.4A4.A6.A7.A9.A6.A 6.A10.A5.A6.A6.4A$5.A16.A18.A19.A8.A17.A11.A7.4A2.9A2.A2.A14.A10.A22. A2.A7.A3.A10.A2.A2.A17.A11.A6.A7.A4.4A10.A6.A4.A6.A7.A9.A6.A6.A10.A5. A6.A9.A$5.A16.A18.A19.A8.A17.A11.A7.A5.A10.A2.A14.A10.A22.A2.A7.A3.A 10.A2.A2.A17.A6.6A6.A2.6A7.A5.6A6.A2.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A7. A$5.7A10.A18.A19.A8.A2.16A3.9A2.6A5.A10.A2.A3.12A2.9A2.18A2.A2.5A3.A 3.A9.2A2.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A5.A3.4A4.A2.A3.A4.A5.A3.A5.3A 4.A3.A4.A8.A3.A3.A4.A3.A2.6A$11.A10.A18.A19.A8.A2.A18.A10.A7.4A2.9A2. A3.A13.A10.A16.A2.A6.A3.A2.2A9.5A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A5.A6.A 4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A$11.A10.A18.A12.8A8.A 2.A18.A10.A7.A5.A10.A3.A13.A10.A16.A2.A6.5A2.5A6.A6.A6.A7.A2.A6.A6.A 4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A$ 11.A10.A18.A12.A15.A2.A6.13A2.9A2.6A5.A10.A3.A6.8A2.9A2.12A2.A2.5A6.A 2.A2.2A3.4A6.A4.5A4.2A2.A6.8A4.A2.8A5.A5.8A4.A2.5A4.A5.5A5.A6.5A4.A8. 5A3.A4.5A2.A$11.A10.A18.A12.A15.A2.A6.A14.A10.A7.4A2.9A3.A6.A9.A10.A 10.A2.A6.A6.4A3.A3.A9.A4.A3.A4.5A11.A6.A7.A7.A10.A6.A4.A6.A7.A7.A8.A 6.A10.A5.A6.A4.A$11.A10.A13.6A8.5A15.A2.A6.A14.A10.A7.A5.A11.A6.A9.A 10.A10.A2.A6.A13.A3.A9.A4.A3.A4.A2.4A9.A6.A7.A7.A10.A6.A4.A6.A7.A7.A 8.A6.A10.A5.A6.A4.A$11.A10.A13.A13.A11.9A2.A6.A6.9A2.9A2.6A5.A11.A5. 2A8.2A9.2A3.5A2.A2.5A2.A13.A3.A4.6A4.A3.A4.A5.A6.7A3.A7.9A7.7A3.A2.5A 2.3A7.6A2.A6.5A2.3A10.7A6.6A$11.A10.A13.A13.A11.A10.A6.A6.A10.A10.A9. 2A11.A5.5A5.5A6.6A3.A2.A6.A2.A12.2A3.A4.A3.4A2.5A4.A5.A6.A5.A3.A10.A 3.5A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A$11.A10.A13.A13.A11.A 10.A6.A6.A10.A10.A9.9A4.A3.3A3.A3.3A3.A4.3A3.2A3.A2.A6.A2.A12.6A4.A6. A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13. A$11.A9.2A9.5A6.8A3.9A2.9A2.5A5.2A9.2A9.2A7.3A3.A2.2A4.A3.2A4.A3.2A4. A4.2A4.A4.A2.5A2.A2.A12.A9.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A 3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A$11.A9.A10.A10.A10.A10.A10.A9.5A6. 5A6.5A4.2A4.A3.A4.A3.A5.A3.A5.A4.A5.A4.A6.A2.A2.A12.A7.5A4.A4.A2.5A5. A6.7A3.A8.5A3.3A4.7A3.A2.5A2.3A5.A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A$11.A 9.A10.A10.A10.A10.A10.A7.3A3.A4.3A3.A4.3A3.A4.A5.A3.A3.2A3.A3.7A3.8A 3.3A4.A6.A2.A2.A12.A7.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A9.A6.A4.A6.A 5.A3.A2.A2.A8.A6.A10.A3.A9.A3.A$11.A8.2A9.2A9.2A9.2A9.2A9.2A7.2A4.A4. 2A4.A4.2A4.6A3.3A3.A3.6A3.2A8.2A9.2A5.5A2.A2.A2.A12.4A4.A3.A4.A4.4A6. A2.A9.A4.3A8.A3.A3.A9.A4.3A4.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A$11.A8. 5A6.5A6.5A6.5A6.5A6.5A4.A5.A4.A5.A4.A5.A8.2A4.5A3.2A3.A9.A10.A10.A2.A 2.A2.A15.A4.A3.A4.A7.A6.A2.A9.A4.A10.A3.A3.A9.A4.A6.8A5.5A14.8A10.5A 9.5A$11.A6.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.6A3.8A3.8A3.3A8.A 13.A4.A9.A10.A10.A2.A2.A2.A15.A4.5A4.A7.8A2.A6.9A10.5A3.A6.9A7.A13.A 17.A18.A13.A$11.A6.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A4.A8.2A9.2A9. 2A9.A13.A3.2A3.4A2.A4.4A2.A4.4A2.A2.A2.A2.A15.A6.A6.A7.A9.A6.A6.4A10. A5.A6.A6.4A5.A13.A17.A18.A13.A$11.A6.A5.A4.A5.A4.A5.A4.A5.A4.A5.A4.A 5.A8.A10.A10.A10.A5.9A3.A4.A2.A2.A4.A2.A2.A4.A2.A2.A2.A2.A2.A15.A6.A 6.A7.A9.A6.A9.A10.A5.A6.A9.A5.66A$11.8A3.8A3.8A3.8A3.8A3.8A3.3A8.A10. A10.A10.A5.2A10.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.A2.A2.A15.A4.5A4.A5. 5A7.A4.5A7.A8.5A3.A4.5A7.A70.A$11.A10.2A9.2A9.2A9.2A9.2A9.2A9.A4.4A2. A3.8A4.7A5.A11.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A2.A2.A2.A15.A4.A3.A4.A 5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.A3.A2.6A70.A$A10.A10.A10.A10.A10.A10.A 10.A10.A4.A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A 15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A10.66A$A10.A10.A10. A10.A10.A10.A10.A10.A2.3A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2.A3.A3. A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A10.A$A 4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A3.2A2.A2.A3.A 4.4A3.A4.4A3.A4.4A3.A3.5A2.A3.5A2.A3.5A2.A2.A2.A2.A15.A4.5A4.A5.5A5.A 6.5A2.A13.5A3.A4.5A2.A2.9A$A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2. A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A3.A3.A2.A3.A4.A2.A3.A4.A2.A3.A4.A2.A3. A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A6.A6.A7.A7.A8.A4.A15.A5.A6.A 4.A2.A18.6A$A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2. A2.A2.3A2.A2.A2.3A2.A2.A3.A3.A2.A3.A2.3A2.A3.A2.3A2.A3.A2.3A2.A3.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.11A5.A6.A6.A7.A7.A8.A4.A15.A5.A6.A4.A 2.A18.A4.A39.10A$A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A 3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.5A2.A3.A3.2A2.A3.A3.2A2.A3.A3.2A2.A3. A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A2.A2.A11.2A5.A4.5A2.3A7.6A2.A8.6A15.7A 6.6A2.A2.17A4.15A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3.A3.A3.A3.A 3.5A6.5A6.5A6.A2.A2.A12.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4.A2.A14.4A 16.A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2. A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3.A3.A3.A3.A7.A10.A10.A6.A 2.A2.5A8.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4.A2.A17.A16.A20.6A8.A$A3. 5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.A2.2A2.A3.A3. 5A3.A3.5A3.A3.5A7.A10.A10.A6.A2.A6.A8.A4.2A4.A3.A2.A7.5A2.A2.A9.5A15. 5A9.5A2.A2.A17.A5.5A6.A29.6A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.5A6.A3.A3.A3.A3.A3.A3.A3.A3.A3.A3.5A 2.9A2.9A6.A2.A6.A7.2A3.3A4.5A2.3A5.A3.A2.A2.A9.A3.A15.A3.A9.A3.A2.A2. A10.8A2.A2.A3.A6.A29.A3.4A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3. A2.A3.A3.A2.A3.A3.A2.A3.A3.A6.A6.A3.A3.A3.A3.A3.A3.A3.A3.A3.A3.A6.A 10.A14.A2.A6.A7.6A8.A6.A5.A3.A2.A2.A9.A3.A15.A3.A9.A3.A2.A2.A10.2A4. 8A3.4A3.A29.A6.2A$A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A 3.A2.2A2.A3.A2.2A2.A3.A2.2A6.A6.A3.A3.A2.2A3.A3.A2.2A3.A3.A2.2A3.A6.A 10.A14.A2.A5.2A7.A3.2A8.A6.A5.A3.A2.4A9.A3.A15.A3.A9.A3.A2.A2.A10.A9. A2.A3.A2.A3.A3.27A6.4A$5A6.5A6.5A6.5A6.5A6.5A6.5A6.5A6.5A2.5A3.5A7.5A 7.5A7.A3.4A2.9A14.A2.A4.3A3.5A3.A9.8A5.5A15.5A15.5A9.5A2.A2.A10.A12. 5A2.A3.5A35.A$4.A10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A11.A7.A3.A 5.A11.12A2.A4.A5.A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.4A13.A43.A$4.A 10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A11.A7.A3.A5.A11.A13.A4.A4. 2A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.A2.A13.A20.24A$4.A10.A10.A8.3A 10.A5.6A3.8A2.9A3.4A3.4A3.9A3.9A4.8A5.3A3.A5.A11.A13.A3.2A3.3A7.A10. 69A4.A2.A10.A2.A2.15A20.A21.4A$4.A10.A10.A8.A5.8A5.A8.A9.A11.A6.A6.A 11.A12.A12.A5.A5.A3.9A3.11A3.6A9.A78.A4.A2.A10.4A16.A20.A24.A$5A10.2A 2.8A8.A5.A12.A8.A9.A11.A6.A6.A11.A12.A12.A5.A5.A3.A11.A8.2A3.A3.2A9.A 78.A4.A2.A12.2A16.A20.A24.A$A15.A2.A15.A2.4A12.A2.7A9.A2.10A6.A2.5A 11.A2.11A5.8A2.4A5.A3.A11.A8.A4.A3.A10.80A4.A2.A5.A6.A3.5A2.5A2.A12. 6A2.8A7.5A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8.A3. A11.A8.A4.A3.A94.A2.A2.7A3.A3.A3.A2.A3.A2.A12.A4.A9.A7.A3.A5.A$A15.A 2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8.A3.A11.A8.A4.A3.A94.A 2.A2.A2.A2.A3.5A3.4A3.4A12.A4.A9.A7.A3.A5.A$8A3.6A2.8A3.6A2.8A3.6A2. 8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A3.A11.A8.6A3.96A2.A2.A5.A7.A3.A 2.A3.A5.6A4.A3.2A9.A7.A3.A5.A$A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6. A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A3.A11.A115.A2. A5.A7.5A2.5A5.A4.A4.A3.12A7.A2.2A5.A$A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A 4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A3.A10. 2A115.A2.A5.A24.A4.A4.A3.A15.4A2.5A2.A$A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A 2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A 4.A3.A9.3A3.62A27.18A5.A2.A4.2A24.A3.2A4.A3.A15.A2.A2.A3.A2.A$A2.5A2. 4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A 2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A3.A9.A5.A60.A2.A2.A21.A16.A5.A2.A 4.15A2.10A3.7A3.A15.A2.4A3.A2.A$A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A 2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A3.A 9.A4.2A60.10A18.A16.A5.A2.A4.A13.A2.A12.A9.7A9.A9.A2.A$A5.A3.A5.A2.A 5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A 2.A5.A3.A5.A3.A8.2A3.3A7.4A3.5A44.A2.A2.A18.A6.7A3.A5.A2.A4.A13.A2.A 12.A15.A9.A9.A2.A$A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A 3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A3.4A5.6A9. A2.A3.A3.A44.A5.A4.15A6.2A3.6A5.A2.A4.A12.2A2.A7.6A15.A9.A9.A2.A$A3.A 7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A 3.A7.A3.A2.A3.A7.A3.A5.8A3.2A9.A2.5A3.A44.A5.A4.A20.A4.A10.A2.6A12.5A 7.A3.4A7.7A9.8A2.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A 2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A5.A10.A10.A10.A44.12A 20.A4.A10.A2.A17.A11.A6.A7.A4.4A7.A5.5A2.A$A3.10A2.A2.A3.10A2.A2.A3. 10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A5.A10.A 10.A10.A58.19A4.5A6.A2.A17.A6.6A6.A2.6A7.A7.A5.A6.A$A3.A3.A3.A3.A2.A 3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A 3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.3A10.A10.A10.A58.A16.4A6.A6.A2.A6. 9A2.A6.A3.4A4.A2.A3.4A5.A7.A5.A6.A$A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2. A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A 2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A3.A12.A8.11A2.A10.22A12.15A19.A6.A6.A 2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.2A6.A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A 2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A 3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.5A10.A20.A12.A12.4A17.A5.2A6.A2.A6.A 7.A2.A6.A6.A4.A2.A6.A5.A7.A4.9A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A 3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A 3.A3.A3.A3.A3.A12.A8.A8.A14.A20.A8.5A15.A17.A5.9A2.A4.5A4.2A2.A6.8A4. A2.8A5.A7.A4.A$A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A 3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A3.A12.A8.A8.A14.A19. 2A8.A2.4A13.A12.6A5.A10.A4.A3.A4.5A11.A6.A7.A7.A5.5A2.A$A7.5A3.A2.A7. 5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A3.A 12.A6.5A5.2A14.A19.11A5.A7.7A12.A3.4A3.A10.A4.A3.A4.A2.4A9.A6.A7.A7.A 5.A3.A2.A$A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A 7.A2.A7.A7.A3.A12.A6.A3.A5.17A19.A15.A7.A4.4A10.A6.A3.A5.6A4.A3.A4.A 5.A6.7A3.A7.9A5.A3.A2.8A$A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2. 6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A3.A12.A6.A3.A5.A14.4A17.A15.A2.6A 7.A5.6A6.A3.A5.A3.4A2.5A4.A5.A6.A5.A3.A10.A3.5A2.A3.A9.A$A2.A12.A2.A 2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A3. A12.A6.A3.A5.A17.A6.9A2.A15.A2.A3.4A5.A5.A3.4A4.A3.A5.A6.A4.A6.A5.A6. A5.A3.A10.A7.A2.5A9.A$A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12. A2.A2.A12.A2.A2.A12.A2.A2.A12.A3.A12.A6.5A5.5A13.A6.A7.A2.A15.A2.A6.A 5.A5.A6.A4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A7.5A$A2.A2.A9.A2.A2. A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2. A2.A2.A9.A3.A12.A8.A11.A13.A6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A3.A3.5A4.A 4.A2.5A5.A6.7A3.A8.5A3.3A4.A7.A$A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2. 14A2.A2.14A2.A2.14A2.A2.14A3.A12.A8.A11.A13.A4.5A4.2A2.A13.3A2.8A5.A 5.8A4.A3.A3.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A6.6A2.A$A7.A10.A7.A10. A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A8.8A4.A13.A4.A3.A4.5A 13.A9.A7.A10.A6.A3.A3.A3.A4.A4.4A6.A2.A9.A4.3A8.A3.A3.A6.A4.A2.4A$A7. A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A8.A6.A4.A 13.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A3.A3.A3.A4.A7.A6.A2.A9.A4.A10.A3.A 3.A6.A4.A5.A$9A10.9A10.9A10.9A10.9A10.9A10.9A10.9A11.A12.A8.A6.A4.A8. 6A4.A3.A4.A5.A6.6A9.9A7.7A3.A3.A3.5A4.A7.8A2.A6.9A10.5A3.A4.5A2.A5.A$ 8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.5A2.3A4.A8.A3.4A2.5A4.A5.A6. A3.4A10.A3.5A4.A5.A3.A3.A5.A6.A7.A9.A6.A6.4A10.A5.A4.A3.A2.A2.4A$8.A 18.A18.A18.A18.A18.A18.A18.A11.A12.A6.A3.A2.A6.A8.A6.A4.A6.A5.A6.A6.A 10.A7.A4.A5.A3.A3.A5.A6.A7.A9.A6.A9.A10.A5.A4.A3.A2.A2.A$8.9A10.17A2. A18.9A2.9A18.A2.17A10.9A11.A12.A6.A3.A2.A6.A8.A6.A4.A6.A5.A6.A6.A10.A 7.A4.A5.A3.A3.A3.5A4.A5.5A7.A4.5A7.A8.5A3.A4.A3.A2.4A$16.A26.A2.A26.A 2.A26.A2.A26.A11.9A12.A6.A3.A2.A6.A6.5A4.A4.A2.5A5.A4.5A4.A8.5A3.3A4. 7A3.A3.A3.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.5A4.4A$16.A26.A2.A26. A2.A26.A2.A26.A11.A20.A6.5A2.8A6.A3.A4.A4.A2.A2.5A2.A4.A3.A4.A8.A3.A 3.A9.A6.A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A6.A9.A$16.5A18.5A2. 5A18.5A2.5A18.5A2.5A18.5A11.A20.A8.A10.4A4.A3.A4.A4.4A6.A2.A4.A3.A4.A 8.A3.A3.A9.A4.3A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A6.A9.A$16.A3. A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A4.8A20.A8.A13.A4.A3.A 4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A5.A3.5A4.A5.5A5.A6.5A2.A13.5A3.A 6.6A4.A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.6A8.A4.5A4.A7.8A2.A4.5A 4.A8.5A3.A6.9A5.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2.3A$16.A26.A2.A26.A 2.A26.A2.A26.A4.A27.A8.A4.A6.3A6.A6.A7.A9.A6.A6.A10.A5.A6.A6.4A3.A5.A 6.A7.A7.A8.A4.A15.A5.A6.A4.A2.A$16.12A7.9A2.12A7.9A2.12A7.9A2.12A7.9A 4.A27.A8.A4.A6.A8.A6.A7.A9.A6.A6.A10.A5.A6.A9.A3.A3.5A2.3A7.6A2.A8.6A 15.7A4.5A2.4A$16.A10.A7.A7.A2.A10.A7.A7.A2.A10.A7.A7.A2.A10.A7.A7.A4. A27.A6.5A2.A2.5A6.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A7.A3.A3.A3.A2.A9.A4.A 2.A11.A19.A8.A3.A4.4A$16.A10.A6.2A7.A2.A10.A6.2A7.A2.A10.A6.2A7.A2.A 10.A6.2A7.A4.A27.A6.A3.A2.A2.A2.4A4.A3.A4.A5.A3.A5.3A4.A3.A4.A8.A3.A 3.A4.A3.A2.6A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A7.A$16.A2.9A6.7A2.A2. A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A4.A27.A6.A3.A2.A2.A5.A4.A3.A 4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.A3.A2.A7.5A2.A2.A9.5A15. 5A6.A3.A7.A$16.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A4.A 27.A6.A3.A2.4A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.5A 2.3A5.A3.A2.A2.A9.A3.A15.A3.A6.5A7.A$16.A9.A7.A8.A2.A9.A7.A8.A2.A9.A 7.A8.A2.A9.A7.A8.A4.A27.A6.5A11.A4.5A4.A5.5A5.A6.5A4.A8.5A3.A4.5A2.A 7.2A5.A6.A5.A3.A2.A2.A9.A3.A15.A3.A8.A9.A$16.A9.A7.A8.A2.A9.A7.A8.A2. A9.A7.A8.A2.A9.A7.A8.A4.A27.A8.A11.3A6.A6.A7.A7.A8.A6.A10.A5.A6.A4.A 7.A6.A6.A5.A3.A2.4A9.A3.A15.A3.A8.A9.A$16.A9.10A7.A2.A9.10A7.A2.A9. 10A7.A2.A9.10A7.A4.A27.A8.A11.A8.A6.A7.A7.A8.A6.A10.A5.A6.A4.A7.A6.8A 5.5A15.5A15.5A8.11A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A 9.A3.A3.A8.A4.A27.A8.13A6.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A7.A7.A13.A19. A19.A10.A$16.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A 2.A2.3A7.A4.A27.A8.A4.A5.4A4.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A9.2A6.A 13.A19.A19.A10.A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A10.A6.66A $16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A 8.A4.A8.A4.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A8.A71.A$16.A9.5A3.A8.A 2.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A4.A27.A8.A4.A2.4A2.A4.5A2.3A5. A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A8.A71.A$16.A13.5A8.A2.A13.5A8.A2.A13. 5A8.A2.A13.5A8.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2.A2.A8.A6.A10.A3.A 9.A3.A8.34A38.A$16.A13.A12.A2.A13.A12.A2.A13.A12.A2.A13.A12.A4.A27.A 8.A4.A2.A2.A2.A6.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A8.A3.A22.A5.A3.13A 15.8A$16.A3.11A12.A2.A3.11A12.A2.A3.11A12.A2.A3.11A12.A4.A27.A8.A4.4A 2.4A6.8A5.5A14.8A10.5A9.5A8.A3.A22.A5.A3.A10.2A15.A$16.A3.A22.A2.A3.A 22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A21.A13.A17.A18.A13.A10.A2.3A21.A2.A 2.A3.A11.A5.6A4.A$16.A3.A22.A2.A3.A22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A 21.A13.A17.A8.5A5.A13.A10.A3.A22.11A11.A5.A4.A4.A$16.A2.22A2.A2.A2. 22A2.A2.A2.22A2.A2.A2.22A2.A4.A27.A8.64A3.21A10.A3.A25.A2.A15.A4.2A4. A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2. A4.A27.A95.A10.5A43.2A3.3A4.A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A 2.A6.A13.A2.A2.A2.A6.A13.A2.A4.A27.A95.A14.A43.6A6.A4.7A$16.A2.A2.A2. 3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A 7.A4.A2.A4.A27.A53.43A14.8A36.A3.2A6.A4.A5.A$16.A2.A2.A3.A4.5A.A2.A2. A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2. A2.A4.A27.A53.A62.39A3.A7.A4.A5.A$16.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A 2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A4.A27.A53.A62.A41.A7.A 2.A.A2.A2.A$16.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2. A2.A2.A11.A5.A2.A2.A4.A27.A53.A9.51A2.A41.A7.12A$16.A2.A8.A2.A8.4A2.A 2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A4.A27.A53.A9.A48.2A2.4A 5.30A3.4A7.A4.A2.A$16.A2.13A8.A5.A2.13A8.A5.A2.13A8.A5.A2.13A8.A7.A 27.A53.A9.A49.A4.2A5.A4.A17.A4.2A5.2A7.A7.A$16.A11.A11.A5.A11.A11.A5. A11.A11.A5.A11.A11.A7.A27.A53.A9.A34.12A3.A5.3A3.A4.A17.A5.A6.6A2.A7. A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A34.A10.A3.A6.6A2.5A13.5A 3.A7.A3.A2.9A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A34.A10.A3.A 6.A7.A3.A13.A3.A3.A7.A3.A10.A$16.25A5.25A5.25A5.25A7.A27.A42.12A9.A7. 28A3.5A2.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$40.A29.A29.A29.A7.A23.5A 42.A10.A9.A7.A30.A3.A2.12A7.A3.A13.A3.A3.9A3.4A7.A$40.A29.A29.A29.A7. A23.A3.5A38.A10.A9.A7.A30.A3.A21.5A13.5A10.3A5.A7.A$40.6A24.17A2.12A 29.A7.A23.A3.A3.A38.A10.12A6.A30.A3.A23.A17.A14.A5.3A5.A$45.A40.A2.A 40.A7.A23.A3.A3.A38.A10.A5.A3.A7.A30.A2.2A23.A17.A14.A7.A5.A$45.A40.A 2.A40.A7.A22.3A2.A2.3A37.A10.A5.A3.A7.A27.4A2.4A17.7A10.14A6.A7.A5.A$ 45.7A34.A2.7A34.A4.4A23.A3.A3.A38.A7.A2.A2.A2.A2.3A6.A19.5A3.A2.A2.A 2.A17.A5.A10.A7.A4.A6.A7.A5.A$45.A4.12A7.13A.A2.A2.A4.12A7.13A.A2.A4. A26.A3.A3.A38.A4.13A3.A7.A19.A3.A3.A2.4A2.A17.A5.A10.A7.A4.A6.A6.2A5. A$45.A4.A10.A7.A10.7A2.A4.A10.A7.A10.7A4.A25.10A38.A4.A2.A5.A2.A3.A7. A16.4A3.5A8.A17.A5.A10.4A4.A2.5A4.A6.5A2.A$45.A4.A10.A7.A10.A2.A2.A2. A4.A10.A7.A10.A2.A2.A4.A26.A7.A38.A4.A2.A8.5A7.A2.5A2.5A2.A2.A3.A3.A 8.A3.7A7.A3.5A10.4A2.A2.A3.A4.A2.5A6.A$45.A3.3A2.5A2.A7.A2.5A3.A5.A2. A3.3A2.5A2.A7.A2.5A3.A5.A4.A26.A7.34A5.A4.A2.A8.A11.A2.A3.A2.A3.A2.A 2.5A3.A7.2A3.A5.A7.A3.A3.A10.A2.A2.A2.A3.A4.A2.A3.A6.A$45.A4.A3.A3.A 2.A7.A2.A3.A3.A5.A2.A4.A3.A3.A2.A7.A2.A3.A3.A5.A4.A26.A39.2A5.A4.A2. 10A11.4A3.4A3.4A10.A7.6A5.A7.A3.A3.A8.3A2.4A2.A3.A4.A2.A3.A6.A$45.A4. A2.3A2.A2.A7.A2.A2.3A2.A5.A2.A4.A2.3A2.A2.A7.A2.A2.3A2.A5.A4.A26.A40. A5.A4.A11.8A4.A2.A3.A2.A3.A2.A9.2A7.A3.4A3.A7.A3.A3.A8.A10.5A4.A2.A3. A6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A26.A40.A5.A3.2A18.A4.A2. 5A2.5A2.A9.10A6.A3.A7.A3.5A8.A12.A6.A2.2A2.A6.A$45.A8.A6.A7.A6.A9.A2. A8.A6.A7.A6.A9.A4.A26.A40.A4.2A3.10A10.A4.A16.A9.A15.A3.A7.A5.A10.3A 10.A6.A6.A6.A$45.17A7.18A2.17A7.18A4.A26.A39.2A3.3A3.A8.8A3.A4.A16. 11A15.A3.A7.A5.A12.A2.9A6.A6.A6.A$45.A15.A7.A16.A2.A15.A7.A16.A4.A26. A39.6A5.A15.A3.A4.A42.A3.A7.A3.5A10.A2.A7.A6.A5.3A5.A$45.A15.A6.2A16. A2.A15.A6.2A16.A4.A17.10A39.A3.2A5.A15.A3.A4.A42.A3.A7.A3.A3.A8.3A2.A 7.A6.A6.A6.A$45.A4.12A6.16A2.A2.A4.12A6.16A2.A4.A17.A48.A3.A6.9A7.A3. A4.A5.5A2.5A2.5A18.A3.A7.A3.A3.A8.A4.4A2.5A4.A6.A6.A$45.A4.A9.2A6.A 17.A2.A4.A9.2A6.A17.A4.A17.A48.A3.A14.A6.2A3.A4.A5.A3.A2.A3.A2.A3.A 18.A3.A5.3A3.A3.A8.A7.A2.A3.A4.A4.10A$45.A4.A9.A7.A17.A2.A4.A9.A7.A 17.A4.6A12.A48.A3.A14.A6.3A2.A4.A2.4A3.4A3.4A3.5A14.A3.3A3.A5.5A8.A7. A2.A3.A4.A4.A$45.A14.A7.A13.5A2.A14.A7.A13.5A4.A4.A12.4A14.32A3.11A4. A6.A4.A4.4A2.A3.A2.A3.A2.A3.A3.A14.A5.A3.A7.A10.5A3.A2.A3.A4.A4.A$45. A14.10A12.A6.A14.10A12.A8.A4.A14.2A14.A43.7A2.5A4.A4.A2.A2.5A2.5A2.5A 3.A2.13A5.A3.5A3.A13.6A2.5A4.A4.A$45.12A3.A3.A3.A13.A6.12A3.A3.A3.A 13.A8.A4.A15.9A6.A43.A3.A4.A3.A4.A4.A2.A24.A2.A10.5A2.A6.9A10.A3.2A4. A6.A4.A$56.A2.3A2.A2.3A12.A17.A2.3A2.A2.3A12.A8.A3.2A16.A6.A6.A43.A3. A4.A3.A4.A4.A2.A23.2A2.A14.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A 13.A17.A3.A3.A3.A13.A8.A3.15A3.A6.A6.A4.40A2.3A3.2A2.A4.A4.A2.A2.5A 16.5A7.A6.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A13.A17.A3.A3.A3.A 13.A8.A3.A4.A7.2A3.A5.2A6.A4.A38.A3.A8.A4.A4.A2.A2.A3.A16.A11.A6.A2.A 6.A5.8A5.A3.7A6.A4.A$56.A3.A3.5A13.A17.A3.A3.5A13.A8.A3.A4.A8.5A5.5A 3.A4.A38.A3.A8.A4.A4.A2.4A3.18A11.3A4.A2.A6.A5.A6.A5.A16.A4.A$56.A3. 5A17.A17.A3.5A17.A8.A3.A4.A11.4A3.A2.6A4.A22.5A11.A3.4A5.A4.A4.A40.A 4.A2.A6.A5.A6.A5.A16.A4.A$56.A7.A17.A17.A7.A17.A8.A3.A4.A14.A3.A2.A9. A22.A3.A10.2A3.A2.A4.3A3.A4.A40.A4.A2.A6.A5.4A3.A2.4A16.A4.A$56.A7. 16A2.A17.A7.16A2.A8.A3.A4.A2.2A10.A3.A2.A9.A22.A3.A10.3A2.A2.A5.A4.A 4.A33.5A2.A4.A2.A6.A7.6A2.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A 4.A3.A10.A3.A2.4A6.A22.A3.A6.5A4.A2.A5.A4.A4.A12.6A8.4A3.A3.A2.A4.A2. A6.4A4.A7.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A4.A3.A10.A3.A4. 9A22.A2.2A6.A3.A4.A2.A5.6A2.3A12.A4.A8.A2.A3.A3.A2.A4.A2.A8.7A7.A19.A 4.A$56.A9.A2.3A2.A4.A2.A17.A9.A2.3A2.A4.A2.A8.A3.A4.5A10.A3.A4.A27.4A 2.4A4.A3.A4.A2.A5.A7.A14.A4.10A2.5A3.A2.A4.A2.A8.A13.A19.A4.A$56.A9.A 3.A3.A.A2.A2.A17.A9.A3.A3.A.A2.A2.A8.A3.A4.A14.A3.A4.A12.5A2.5A3.A2.A 2.A2.A4.A3.A4.A2.A5.A7.A8.8A22.2A2.A4.A2.A8.A13.A19.A4.A$56.A9.5A3.6A 2.A17.A9.5A3.6A2.A8.A3.A4.A14.A3.A4.A12.A3.A2.A3.A3.A2.4A2.A4.2A2.A4. A2.A5.A7.4A5.A5.A23.5A4.A2.A8.4A10.A19.A4.A$56.A19.A2.A2.A17.A19.A2.A 2.A8.A3.A3.2A14.A3.A4.A2.5A2.4A3.4A3.5A8.A8.A4.A2.A5.A9.2A5.A5.A2.5A 2.5A2.5A2.A8.A2.A10.13A3.17A4.A$56.A22.4A17.A22.4A8.A3.A3.12A4.A3.A4. A2.A3.A2.A2.A3.A2.A3.A3.A8.A8.A4.A2.A5.A10.3A3.A2.A2.A2.A3.A2.A3.A2.A 3.A2.A8.A2.A10.A15.A6.A13.A$56.A22.A20.A22.A11.A3.A3.A9.7A3.A4.4A3.4A 2.5A2.5A3.A7.2A7.3A3.A2.A5.A11.15A3.4A3.4A3.5A7.A2.A8.3A15.A6.A13.A$ 56.24A20.24A11.A3.A3.A9.A5.A3.A4.A2.A3.A2.A17.A7.7A3.A4.A2.A4.2A3.5A 3.A3.A3.A.A3.A3.A2.A3.A2.A3.A3.A7.A2.A8.A12.6A4.5A11.A$79.A43.A11.A3. A3.A.A7.A5.A3.A4.A2.5A2.A16.2A7.A5.A3.A4.A2.A4.6A2.2A3.A3.A5.A3.5A2. 5A2.5A3.A7.A2.A8.A12.A9.A3.A11.A$79.A43.A11.A3.A3.7A3.A5.A3.A4.A9.A 16.10A5.A3.A4.A2.A2.3A3.2A3.5A3.A5.A24.2A7.A2.A8.A12.A9.A3.A11.A$79. 7A34.A2.A11.A3.A5.A3.A3.A5.A3.A4.A9.15A2.A14.A3.A4.A2.A2.2A4.A7.3A2. 7A24.5A4.A2.A8.A10.5A7.A3.A11.A$85.A2.A5.5A11.5A3.6A7.5A3.A5.A3.A3.A 5.A3.2A3.A23.A2.A14.A3.6A2.A2.A5.A9.A8.A3.5A2.5A9.A3.A4.A2.A8.A4.4A2. A3.A7.5A11.A$85.6A3.A3.A11.A3.A3.A.A2.A7.A6.3A4.A2.3A2.A5.A4.A3.A23. 4A14.A3.A7.4A3.3A9.A8.A3.A3.A2.A3.A2.8A3.A4.A2.A8.A4.A2.A2.A3.A9.A13. A$85.A2.A.A2.3A2.A11.A2.3A2.A4.A7.A7.A5.A3.A9.A4.A3.A41.A3.A14.2A10.A 8.5A3.A2.A3.A2.A10.A4.A2.A8.A4.A2.A2.A3.A9.A13.A$85.A8.A19.A8.A7.5A3. A5.A3.A9.A4.A3.A3.5A33.A3.A14.A8.4A16.4A3.4A10.A4.A2.A8.A4.A2.A2.5A7. 5A11.A$85.A8.A19.A8.A3.2A2.A3.A3.A3.13A3.A4.A3.A3.A3.A6.5A2.5A2.5A8.A 3.5A10.A8.A40.A4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.16A7.16A3.A3.A3.A3.A3. A3.A3.A3.A3.A4.A3.A3.A3.A6.A3.A2.A3.A2.A3.A8.A7.A10.A8.A40.A4.A2.A8.A 4.A2.A4.A9.A3.A11.A$85.A14.A7.A14.A3.A3.A3.A3.A3.A3.A3.A3.A3.A4.A3.A 3.A3.A3.4A3.4A3.4A3.5A4.A7.A10.A8.A12.5A13.5A5.A4.A2.A8.A4.A2.6A9.A3. A11.A$85.A14.A6.2A14.A3.5A3.A3.5A2.3A2.A3.A3.A4.A3.A3.A3.5A2.A3.A2.A 3.A2.A3.A3.A3.2A7.A10.A8.A12.A3.A13.A3.A5.A4.A2.A8.A4.A7.A9.5A11.A$ 85.A2.13A6.14A2.A3.A3.A3.A6.2A3.A3.A3.A3.A4.A3.A3.A7.A2.5A2.5A2.5A3.A 3.6A3.A10.A8.A9.4A3.4A3.5A2.A3.A5.A4.A2.A8.A4.A7.A11.A13.A$85.A13.2A 6.A15.A3.A3.A3.A6.A4.A3.A3.A3.A4.A3.A3.A7.A24.A3.A4.A3.A10.A8.A2.5A2. A2.A3.A2.A3.A3.A2.A3.A5.A4.A2.A8.A4.A5.5A9.A13.A$85.A13.A7.A15.A3.A2. 2A3.A6.A3.6A3.A3.A4.A3.A3.A7.A23.2A3.A4.A3.A10.A8.A2.A3.A2.A2.5A2.A3. A3.A2.A2.2A5.A4.A2.A8.A4.A5.A3.A5.8A10.A$85.9A5.A7.A15.A3.A2.3A2.A6.A 4.A7.A3.A4.A3.A3.A7.A2.5A16.6A4.A3.A10.A8.4A3.4A9.5A3.4A2.5A2.A4.A2.A 8.A4.A5.A3.A5.A6.A10.A$93.A5.10A14.A3.A2.A4.A6.A4.A7.A3.A4.A3.A3.A7.A 2.A3.A16.A3.4A2.A3.A10.A8.A2.A3.A2.A9.A3.A3.A2.A2.A3.A2.A4.A2.A8.A2. 3A5.A3.A5.A6.A10.A$93.A5.A3.A3.A15.A3.4A4.A6.A3.2A7.A3.A4.A3.A3.A7.4A 3.18A6.A2.A3.A10.A8.A2.5A2.7A3.A3.A3.A2.4A3.A2.A4.A2.A8.A2.A7.5A5.A4. 5A8.A13.8A$93.A4.3A2.A2.3A14.A11.A6.A3.6A3.A3.A4.A3.A3.A38.A2.A3.A10. A8.A15.A3.A3.5A9.A7.A2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15. A11.A6.A3.A4.A3.A3.A4.A3.5A38.A2.A3.A10.A8.A15.A2.2A16.2A7.A2.A8.A2.A 9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15.A11.A5.2A3.A4.A3.A3.A4.A3.A26. 5A6.6A2.A3.A10.A8.A15.A2.4A14.7A2.A2.A8.A2.A2.8A7.A4.A3.A8.A11.5A4.A$ 93.A5.5A3.A15.A5.7A5.6A4.A3.A3.A4.A3.A26.A3.A6.A7.A3.A10.A8.A15.A2.A 2.A14.A5.A2.A2.A8.A2.A2.A6.A7.A4.5A8.A11.A3.A4.A$93.A9.5A15.A5.A9.3A 3.2A4.A3.A3.6A3.A21.6A3.4A3.A7.A3.A10.A8.A15.4A2.16A5.A2.A2.A8.A2.A2. A6.4A4.A6.A10.A11.A3.A4.A$93.A9.A19.A5.A9.2A4.A5.A3.A3.A4.A3.A2.5A5. 5A4.A4.A3.A2.A3.A7.A3.A10.A8.A41.2A2.A2.A8.A2.A2.5A2.A2.A4.A6.A10.A 11.A3.A4.A$93.A4.6A19.A4.2A9.A5.A5.A3.A3.A4.A3.A2.A3.A5.A3.A4.A4.5A2. A3.A7.A3.A10.A8.A41.5A2.A8.A2.A5.5A2.A4.4A3.A10.A11.5A3.2A$93.A4.A24. A4.12A5.A5.A3.A3.A4.A3.4A3.7A3.8A9.A3.A7.A3.A10.A8.A12.5A5.5A14.A6.A 8.A2.A5.A6.A6.9A7.A5.5A3.A5.4A$93.A4.A24.A4.A14.3A5.A3.A3.A4.A3.A2.A 3.A2.A2.A3.A2.A3.A9.A3.A7.A3.A10.A8.A12.A3.A5.A3.A6.9A6.A8.A2.A5.A6.A 6.A7.A7.A5.A3.A3.A5.A2.A$93.A2.28A4.A14.2A6.A3.A3.A4.A3.A2.5A2.A2.5A 2.A3.A9.A3.A7.A3.A10.A8.A9.4A3.7A3.5A2.A6.4A4.A8.A2.A5.A4.5A4.A7.A7.A 2.4A3.11A2.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.2A9.A3.A7. A3.A10.A8.A9.A2.A3.A2.A2.A3.A3.A2.A9.A4.A8.A2.A5.A4.A3.A4.A5.8A2.A2.A 2.A3.A2.A9.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.9A2.A3.A7. A3.A10.A8.A9.A2.5A2.A2.5A3.A2.A9.A4.A8.A2.4A2.A4.A3.A4.A5.A6.A2.A2.A 2.5A2.A9.A$93.A2.A2.A2.3A2.A2.3A2.A3.A8.4A7.5A7.A3.A3.A4.A3.A3.7A9.A 2.A6.5A3.A7.A3.A10.A8.A9.A9.A10.A2.A4.6A4.A8.A4.5A4.A3.A4.A5.A6.A2.A 2.A9.A9.A$93.A2.A2.A3.A3.A3.A3.A3.A8.A2.A7.A2.6A3.A3.A3.A4.A3.A3.A15. A2.A6.A7.A7.A3.A10.A8.A9.A9.A10.A2.A4.A3.4A2.A8.A4.A2.2A4.5A4.A5.4A3. A2.A2.A8.2A9.A$93.A2.A2.5A3.A3.A3.A3.A8.A2.A2.3A2.A7.A3.A3.A3.A4.A3.A 3.A15.4A5.2A7.A7.A3.A10.A8.A9.7A3.A2.6A2.A2.A4.A6.A2.A8.A4.A2.A7.A6.A 7.6A2.A2.A8.9A2.A$93.A2.A10.5A2.3A2.A3.6A2.A3.A3.A7.A3.A3.A3.A4.A3.A 3.13A12.10A7.A3.A10.A8.A2.5A2.A5.A3.A2.A3.5A2.A4.A6.A2.A8.A4.A2.A7.A 6.4A4.A7.A2.10A6.5A$93.A2.A13.2A3.A3.A3.A3.2A2.A3.A3.A7.A3.A3.A3.A4.A 3.A15.A12.A7.4A5.A3.A10.A8.A2.A3.A2.A5.A3.A2.A3.A6.A4.8A2.A7.2A4.A2. 9A8.7A7.A2.A15.A$93.A2.A13.A4.A3.A3.A3.A3.9A7.A3.A3.A3.A4.A3.A15.14A 10.A5.A3.A10.A8.4A3.4A3.3A3.4A3.A6.A9.A4.A6.3A4.A19.A13.A2.A15.A$93.A 2.A7.A5.A4.A3.A3.A3.A11.A2.3A2.A3.A3.A3.A4.A3.A3.5A31.A5.A3.A10.A8.A 2.A3.A2.A3.A11.2A6.A9.A4.A6.A6.A19.A13.A2.A15.3A$93.A2.20A3.A3.A3.A 11.A3.A3.A3.A3.A3.A4.A3.A3.A3.A31.A5.A3.A10.A8.A2.5A2.A2.2A11.9A2.8A 4.4A3.A6.18A2.A13.A2.A2.5A10.A$93.A10.A9.6A3.A3.A11.A3.A3.A3.A3.A3.A 3.2A3.A3.A3.A3.4A2.4A2.17A5.A3.A10.A8.A9.A2.4A2.4A3.A10.A13.2A3.A22. 5A13.A2.A2.A3.A2.A7.A$93.A25.A3.A3.A11.9A3.A3.A3.A3.3A2.A3.A3.A3.A2.A 2.A2.A2.A21.A3.3A8.A8.A9.A2.A2.A2.A2.A3.A10.A14.A3.A22.A17.A2.4A3.8A 2.2A$93.A25.A3.A3.A19.A3.A3.A3.A3.A4.A3.A2.2A3.A2.4A2.4A21.A5.A8.A8.A 9.4A2.4A2.5A10.12A3.A3.A21.2A17.A5.A3.A2.A2.6A$93.27A3.A3.A8.A10.A3.A 3.A3.5A4.5A2.6A33.A5.A8.A8.A28.5A14.A3.A2.2A20.3A17.A5.5A5.A25.A23.A 51.A44.A43.A85.A33.A25.A3.A33.A48.A24.A28.A38.A1034.A2517.A$119.A3.A 3.A5.15A3.A3.A16.A2.A29.6A2.2A5.A8.A8.A28.A3.A14.A3.A2.4A18.A19.A15.A $119.A3.A3.A5.A2.A14.A3.A16.4A29.A3.6A4.2A7.2A8.30A3.16A2.2A2.A2.A17. 2A18.2A14.2A$87.15B17.A3.A3.A5.A21.A49.A3.A9.4A5.4A57.5A2.A17.4A16.4A 12.9A$87.A.G11A.F17A3.A3.A5.A21.A49.A3.A9.A2.A5.A2.A57.A6.A17.A2.A16. A2.A12.A7.A$87.15B16.6A3.79A3.11A2.7A2.59A6.19A2.18A2.14A$363.14A.A2. A.2A2.A3.2A.2A3.3A3.A2.2A.2A2.3A3.A2.2A.2A2.3A3.A2.2A.2A3.A2.2A.A.A.A 4.3A2.15A.A.A.A.2A5.A.A2.A.3A.3A.4A4.3A.2A2.A3.2A.A.A.A.2A2.A3.10A3.A 3.9A3.A3.6A.A4.3A.2A2.A.2A.A.A.3A.A.A.A.A.A.2A2.A4.3A2.4A.A.A.A.3A.A 6.A2.A.2A.A.A.2A4.9A2.2A.A.A.A4.3A2.4A.A.A.A.2A5.A2.A.2A.A.A.2A.2A.A. A.A.A.A.A.2A3.3A5.7A2.3A.3A.3A5.7A3.A3.4A2.3A5.8A.A2.A.2A2.A3.2A.2A3. 3A5.9A.A2.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.4A2.A.3A.3A.4A4.3A.2A2.A 3.2A.A.A.A.2A5.13A2.A.2A.A.A.2A.2A.A.A.A.A.A.A.2A2.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A4.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.4A2.A.3A.3A.3A.3A.3A.3A.3A.4A4.3A.2A2.A3.2A.A.A.A.2A5. 12A.A.A.A2.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .4A.A.3A.A.A.A.A.A.A.4A! golly-3.3-src/Patterns/Self-Rep/Devore/discriminator.rle0000644000175000017500000000232513151213347020231 00000000000000# An organ that can discriminate between 6 signals and 7 signals. It uses # two compact "7-transforms" and a special T-junction structure to direct the # flow of signals appropriately. Unlike in Codd's CA, these structures are # initialised by the sheathing structure. # # John Devore writes: (part II) # "I recall two other important components. One was a miniature 7-transform. # Any signal that went through it came out as a 7. ... [And then] there was a # 6-7 discriminator. This latter one had an input and two outputs (sort of like # a T junction, but with a more complex structure at the junction). If a 6 came # in the input a 7 would go out one of the outputs. If a 7 came in the input a 7 # would go out the other output. This one required some minor modification to # the collision rules -- actually addition of rules to handle collision of # different signals -- Codd only defined collision of identical signals." # x = 79, y = 14, rule = Devore 67.5A4.3A$47.A19.A3.A6.A$43.25A3.A6.A$43.A3.A5.A13.A3.A5.A$43.A9.A13. 5A5.A$.35B7.A9.A$B3A.F29A.F17A$BA24BA9B4.A12.A$BAB22.BAB12.A12.A13.5A 5.A$BAB22.BAB12.A6.A5.A13.A3.A4.A$BAB22.BAB12.28A3.A4.2A$BA24BAB19.A 5.A13.A3.A4.A.A$B21AG.3AB39.5A5.A$.26B! golly-3.3-src/Patterns/Self-Rep/Devore/crossover.rle0000644000175000017500000000433413151213347017411 00000000000000# A demo of one-way units (diodes) and three-way funnelling units (triodes) in # the Devore variant of Codd's CA. With two diodes and two triodes arranged as # shown, a crossover can be made, for signals of any type (4, 5, 6 or 7). # # John Devore writes: (part I) # "I did the original work as a masters report back in 1973. The text of that # report may be completely lost, but I have a file of notes I have used in # presentations so could reconstruct all the important information again. I was # working full time while I worked on my masters degree and I never did follow # up appropriately on publishing results. I did all my simulations at that time # on an IBM 360/50 computer. The component I call a diode was suggested by Rod # Bates who was working on his PhD in EE at the time. It takes advantage of the # fact that the Codd space must include triplicate collision rules for signals # colliding at a T junction. A straight-on, a left-hand, and a right-hand # collision. Codd had treated these all the same and had to make diodes out of # extremely elaborate race conditions driving his "gates". By suggesting that # either the right or left collision annihilate the colliding signals Rod could # create a diode from "wires" arranged in a square with leads at two opposite # corners where one lead forms a right-hand T connection with two sides of the # square and the other lead forms a left-hand T connection. I discovered that # the square needed NO sheathing (with no additional rules) -- just a 2x2 array # of cells with values of 1's -- so the diode was extremely small. Further I # found one could add a third lead in the correct configuration to make what I # called the "triode" with the terrifically useful property of "funneling" # signals from either of two of the leads into the third while being blocked # from going out the other input lead. Again, this required no rule changes # beyond the basic diode rule change." # x = 25, y = 16, rule = Devore 18.6B$.8B8.B6AB$B8AB7.BA4BAB$BA5B2AB7.BAB2.BAB$BAB4.BAB7.BAB2.BAB$BAB 4.BAB3.4B2AB2.BAB$BGB4.BAB2.B6AB2.BAB$B.B4.BAB2.BA5B3.BAB$BAB3.B2A4BA B7.BAB$BAB3.B7AB7.BAB$BAB3.BA4B2AB7.BAB$BA5BAB2.BAB8.BAB$B7AB2.BAB8.B AB$.7B3.BA10BAB$11.B12AB$12.12B! golly-3.3-src/Patterns/Self-Rep/Flow6/0000755000175000017500000000000013543257426014520 500000000000000golly-3.3-src/Patterns/Self-Rep/Flow6/Flow6.zip0000755000175000017500000007224713543255652016177 00000000000000PKÝ4îN~½] Flow6.ruleuVQkã8~ä?ˆíÃÝ‚·kËv¹ ›k»ÝBo»¤]îîémÅ8V‘ädKÙÿ~3ËvR– 2ù4úf曑ȧõ÷ûö¹Õû³åb¹8a«Ž)«ÑϪdim$3}+™k„ckYY§;YhÅ*iUÝÉŠ9Í Éžz£ºúC©·Ï­t©]ÅJÝYgúÒ)Ý}è;µ“ÆŠ–ýþtuõýý)cO²>Äo–Õvà'P*äÙÊÎS«kÈç˜égiZ–®Ýж•Æ;o„u`Â^G<ÞKoØ—ÞA!)÷^×r‡u²}£ ÒÞB!Lwí ;cÖ 'mı”8°nÑZ¤Ý keW»†m@C<è£ûºa{e¤=e_dW¢z’ub+/HêSÒz,‹rBA[dÜHáz8Íl_6LØ Š+8ÙYU€?f Ò9?‡Œ"ò󑽋}n•ÂÎêëuÄþyXûMøª}q´Wm­ÞMÎoÄf;\ueÛWPòÞ`…ŸN×µŸÙA²ÎˆÒM{½éØy ST)±ã{a*ë…*æ$¾ŒRt§ü«{6Û(@¡Ëèn%ÛʬJ̉½ó ¼–[ýñó äé¶|ç5ÿô´úóþf¹èþ£Æ^ÀÔwRÕM¡M£uuá'~¹°/Û-d¬ÀÃhôܴ̌²tH²0\¯q”DÁÊKpóÊÇwÀlþ d}ü¶ºMNŒ|ak–‹8Š¡´ JÌýJE03ŽªHF›¨˃9ÀŒ D8ŽÆ|tst˜Žã¨<@ˆôž¥’EÍ(ÜO橜ÐXÒ.ŸQăE!1•Ôø#ó¹ ”cÙMÏ@ÈÏ«ù÷ݚĄ۹\$ÑT1*ÑD|RžÐ)Hò†/ž+“Œ"Ї¶+¥+‰›Ø,+† s¬¯ômÐ!÷íp"ÚƒÃ^D®À|OÆ[>id€„ÏI’øàdJ¸°A̧+„U%m°&Á’ÎU̽`O«»ûqì¸okî{7¶ÃÏ_$gì«¥á~3ñw1öŽ ŠžÍ¢qb/ŽZŽB¥WŠ¢ðÙð`Œ_î(ÌT/Äo2ܬ›«»VWô5\ÉÔMrHRŸ>÷Q7#3H: OÜqÊS¯P6Óh`É„‹GQS£’Ó0ãѨ°Ðx­Ä£!×x¨)QÊ~ŽŽ­‘v£J ‚<ŒìTÄ|òÒq\v@º£¦ã©ÖÎÛy¼Q<´#}ÓŽ˜&íáööþf=ª›E$exk(1ÒŒn[êw¦wa@E¦‡e¿ˆúxwûÕÏ¥±ä³³ |hiÀÃ÷!ÿÅûàg7»‹2ãâc%ĜΦ(G0Œ]9e‘¤–‡ÔæµòyÇCÞQÀpF¢xöñ.³†|Ò7ͰHZƒ 9ÒÛP]æø‘Éßt†û?W÷ëGxÊY *Æó|úÉYrÎY|~† †‹%üŸe¸ ëdÂ?IXÊŸÃó°þPK+4îN Flow6/Demo/PK+4îN¦ÍÙ,Í Flow6/Demo/Arm Mechanics.mc]UM‹›7¾üzi¡>FÒ1rË%×ÒÃÛ­Ù5xí`;„üû̇FzSvm¤ùžGþþÿß_o—ËHðãá·/ðérûN,ýáñ¾].ðu{>O÷+¼Ü®Ïí|=__A¶Ÿo'U;¿½ÝŸÛõ /Ûãô€ïo§+lð8¿^· ÜOÛËÛ顚›¸x<ïß^žçëÜßÿ„ËöïérúïÃñ€ô/ºEŒ*¢ˆi($QˆªL¡ÈÇHTއÌ?ò©ÇCfíx !ö"¬ˆ+Îxi/ºÌÄ=’9T%‡ol€]¿›¸Ä q™ó.Ê·F‹qe¬™!r°ä †]‚ÈîË:˜ÉÆjÙZü8bÄ%c±wÛ„/IN‰ÿ5g¯ÄSäý¼¦¢Æ&¢‹¸vÑ Aâl¤.Ráâò¨.D>HÑç3ä¸*2#“s¶ÄÕùL¼C&×Éuw qç¢êbhu(a¹BoÇôZôK®†â yYhMりV&Ñ£jÌtK†R T(MªÌ2k#”¾:?+eB 9BJŽ_–³ÈÖ âÿâÎ ˆ| ÅÇIͽzú:[êPƒ/Xò…Ũu4^gm0‰ µ(zÈ£¤¼;ñ;ÎP j…ÚÜ5;ï–~•ÚZ°ôÛħÝÞ šv¿$™·Åš,ýAŸ¸dÒ¯QO+ÐZµ°óˆÐÚ–ap×_Ñn6Ãf‰tæ„¡[.$‘§ÿ0£Él%ev‚^G(U\D¹d¼A;ô:ÌLNÊ oiàþÆGˆîE9M;_¢Áίèî:` IÆÚ3šcia`. <ÁPù£“éüÏó rØW´g?ÄÝ0·’ÌÄw„⨈ý[1]¡ábH§Ÿ$'ÕO1-E\HG´ ú¢p7&Æ_!ÙÌS5‚[®væÌ, Ã’H¹Å„£œú¼&¦Ö¥nc˧Ì<‰¼UÆ) |ŽÖKg|©c 8l“|„Ù‹×/7Û,yb õîâÄ\Ö^ég¡£Ö0,M®eú`®ÅÌËl’“½),2="çˆBª|oXBi-»Ëú‚vÁ@O²ÉŽlWtî˜ç;‚N XÂ/8¡•ÅhX‘—RgWf¡†¦Ÿñ’IC¤V½×ÈdŠÌ¦’s¡…¹¥nOv= Zý¢. sÌ)oN‰¤mQ›Âo9â_ÒK©t<+ ò¿|Û.ª¡{8'éÔ¤ ÒeßS îóöTmtõkÑ&žW¸é³s¹‘&¢•_±ê¥ç’-ÙÐ[ÇjŒC¬ãu"ε±káçŸPKF4îNŽ™~I1#+Flow6/Demo/Features.mcmZËn$ËqÝ0ÿ€²‘ï¬\ 2´³Z0´èËé;C€CؤG÷ï}N<2«ìê®Gf¼óDDÿ÷¿ò?ÿyyzú-”?¥ÿøøáßþþ¾_ÞÞ®¯ÏáöõåÇãó—ðöõ¾]ž ¿^/oï¯×[xù5üõéåGu}x{|y¾}’Ù×ËÃ×5ñòü9<]~¹>ñâáúúvÁøE„O¿]¾^žn’Ùòõ·gáøëå5<]} nß.OO|¼} Ÿ¯ßÀííõB®”„ƒ_ߟ®¸Éôyú.B…Ëë7áóðøúðþøöúÛæø)üx|û~yùe¹© &Ç?¨ñÞ¿ÜŒÅíÊ¡6*<\žÃ/ñåÄUàçë¿ÞÜjŒ_¯¯W5 çB‘ï—Ç×ëgåÌ9Ÿ¯·‡×ÇïgU^¾}y¾>¿LòŸÈSIR¿¼|¿aÞ…Ï ËíñËó¾½àїLJðåòvUÃÜÞ!Çå&Lþçoÿxüù¿ÿó“Xè/¯/·ôý´¼‡Ž…Ûߟ…«ôûò`œÆ Ì…ó×ð~Ó0ùYˆˆ¯0Û÷÷7 ƒ—÷7=‡¹^¯ÿw}½]?ÿ¤þÓå¶Ù)§Ûã·ïO×{‡¿ß~è~âÃÏÁóðsh0ý|¸,IY‘A Â)MH–!š±aàrË.jPŠ:!ãSƒ]@Ê\\ÐŒ Ðj! 1ŒÚJòßÍÕÈà3Õrä•ÍrI¾¶¼I­d&·!¥ò‚Œ ”)¡´=J4“¸“}þ•i⫪ì˜Ó!x¨Â0Ë_ôÓè§ñþ®­ðv µ…Úå’êÕ¶‡e6ù±p’AI•¨#Ô#4˜ÚtŠ¢RqÙó–½!¬ê¾¿ÜÔzˆ>·µÐUj9´ÚÁGjòŠ;ÓC§Àç‹@ÝóÁ»»3xð4©áNæ\+a­Lë¡’é5ôú±¯¾#?yLäCš“77òî`˜Áj…4FãNš(.ø Zûj™¬¨Ø<GÓuÃRZ"yzpd|töRú@€Lù^áH?÷³Ñ‡%~C©-=ŠÃèmº-ÓO‰WeGSvrææ‰TõAƈó´e;a™f ³Ëò‚%3ÌáÎ#L‘¡±£žb¬¾‘ÇTKqé3Å3ºº#Ÿ`häyµ¡Œ†é™>)îIP2NÀqˆt…Ÿ‰ns߈;2Sâ‘<6' OWqË$&+ê$5ývÀìú}fÒØ,eá—éÌ1ø’ã^ç½²ƒ&e]Á|`ì“è¾Æ$‚]n'e3~Ç<•ÓTržNÔ‡ž®E™b©äý›º8Ý><•¦ßçáýdlÂgKuÀr*‡[;e²šžIRÂàj†9$UcS³~ž——*ò;Þh‹GqŒ0z²JÜë±)×89¢‰ ¡k‚4 Þ*‚1­¨­-B7–xœçHè4‹•Ôôæ¡Ò§f ‚²§õBrr·„#ù±¯%Ä!È@[òDÄáŽ5É”8Éž€™z ”%CyDºcba$?¡<¹xG ð*Ć' 2%[)b\Ì,À²…N0<’R¤"iMm ¯†AìÔÈýip"‚Ú±¶ÐœžG&ïÔêT¤À?pbœf(’ä‡8óXéýTáTš"‘N>ÔŸEÜvœÔœª5Ëtʶà25Kò#¤¿`Ó,K¿hó-Œf3u¢ÕEõ°ð,Êhˆ1æºiËÕ!ªó7ÇèÖ¤ˆÓ!… °¸“£ÙaRTiâE"0i’uêÜ9"»(cÁU$ĘÆÌd·:öhÊ µZd½‡Â,ª}ÄykmdQ1³ÌKbùq*²c1ZÄäÄ£úDNj{ Íá!Ç¢È7rä-dB`yNRª$äø4… Â3¢©¯@T£/ïf”q”>gƒi‰÷iÏUjh ƒšPíFhû@&)'%{ÈÈ©± ›îô/öaI:œÅ ³@¡‘šE& pŽz¤[a¨"®bBkŽ}©ê±D•U˜‹¦öiÁ£‘ ߎªß"Œ °šQž&)¥ÌÌT¶(žë*—¸Ì«±Fؘ$¢ eÐÈZæj .ÁÉ4é÷^uRïBQ=båqn&*+27I%¤3fgä…¬8~Êû<í©‰wõK{/—r}é’]Îì57gMbFÖ˜z4ýìËûBUÅÈ‹S;Ïe}æF1¡’AîÍ@ÖÂÏÑî±Ü$¼4d4„Å–r)¹ OÕã„aÁ†iUÚiÚ ††ÛÕ£¹<[Ѹ¼R}µÝó€2ƒž8Ì0mFGy²& ÅG©uJÔµdâ –˜v_.ÔTGXÏr8üKM¯áY-àìIŠ:Ó*m'æ€ãŒẊ•T©—¤hfI!®À€g€}†ñ󴆆ýFp3N'¢ü†‚/ &Ã^¨Û5pÁäSë¤GUeT.º• 5)ls8ðÂKdÛ…€ŒÙŸŸSãÂK#"ó !V(‘G×€œVÅóñ±Úq¬ÕÈ;XÂÑêò*Žjg¡“=jÁôgW !Q—  Ï«s[Óâj ´™ˆ.›XÞɺŽSO‘Ìô~‘¥H“µR2똤¶ñ:{ž'ºq‹Ž#›L[Èê+È2µ{É|ÜOq`@ª‡¾Ô|½™­2¹”⩉ºÐ#À碘Ç$Ñ›Û6ê*§Šfxv9lµ‹àó÷·w{ÊÄÜN‹sÚ åî…ð+ÅÌtA‚81X°*Ž+‚¸‚.g‚jWâzcºä¹Ú +¹Ts›µ;—"ÎÇjýJe"X•§4Ëë°š‡ Ëfî‡Â[’¿q{ú;/ [/L|,jé&+Ñûj+ä´z}% Dø¨Ú;ËÀ],Ƶ>¹Ö#4Ð’ÇaçQ5ú»íziM¬Cý\‡V Kñ.5gi<å-ˆÞšÆî•§­#q5÷2HŒUCÞR¹–«J)ˆ}¥=ÆÚOØP™Ê’/îUÊyCõA—±øoU«,Šr0ý‹øƒƒÁå½#«FéΫzaEÀ˜ÌåCñx[z»Ìzt1ô‚F½š ¸OwP¶'ÄG/­ïú{Â`¡Í¹‰ =~º—¹º|­ƒÛޙʊ{,Ç8:Ìî˜>s죶÷t<ÇN†{†"5 Öß8ÉO’Äj´ü£µ‰ˆ îùqa­¶QÓ³T…Z*ÕÈQÞ¾Š*sœn–ˆ~®%Ù(zª««†kX USY>C.«L«À¬ª`®ìw²jam2PÅš¸:îÄv%Ц —º“6aŽ'¡QÉל¶1-f«ì÷ÆÐZP˜Í+м[‡·¶5Õh‘+÷(ÂtÓfD&I™Ô"É”HPÒÞi´ÕUKqÂâî½{Ÿ}:,!mc—©™ïn‡ªHqa-½§–2žMwÊ©•MÞr¿-û•?£´Î¦½u„™ÊI4“žÆ«ulùEo}s|iŸ¡¼!P»­®•iC‹n‰m%…ÜÚt3dOÒ´uºµveí…³ e1„ªM:#6ßÞå–pÚúÐ}t9%UöBYݺg=ÓÈL[øÕ}g†wZ;‹–þÛ 4ªÐå®{'pøÌêcdšÏ“I¯Ž]m‘Ý05]f¨«©.7©¸¼swÒ“2a?s)z/»;éàžEx¬]°¯{«o¡®4)”Ùž°4¡iÇR…Œ•—ê&Í—‡V—Sü®Ç\Zlâøk¢Õùâ“§–ººÞLMFӱđôçucYm£Ùieò8AiåþµžH0—mt°Z8¯º¹TST Ñh +¯E)åÔ³eï Äæ÷—ó‹k"û k£ÅcÇ…=ÒìÔ’±B]‡š»q£dH¯ß"©ã7å M¬–bö–ªTîî²zÞ½6”Ž‘²”1EP¨mÃØ&»Ùf¶j+mÌv™Ñ2fr/½fDàÊ)Ê~äVÕÚ=j½ 9¯ñ-aC˜µ<|b Ö,h5&ÞÒ© 3T1 Ú€Ò­H§Ù2oñ÷À-y¹Y'õ¢u8²¸³×òk@G¶G¥q×WŽ2ׯÅVt×îЩðb!§úª¤ˆøÉÜXÛ¤ûà³Õaj<¼µÊJ¿Iÿ­<­°¾çx¶âË—ž7-æöööÚ´olª¦Ç–B”iº¢Z;½Ä”‹"'ú-ë+‰0lÑt¯;K­ÙYkzm3‚ç¹ÆrYrrÖ)ê§ÕMêȽòÅšÿ]ÁމùF·ZH6—Õ¸ð¶^z%¹#ü?Å‘nÜÆPާB¢•Ýz-åm¯Lz¬9µÞÜÉÐR wnZAI ·“'Îi'ÙzÜñ‚ÀÉyçߪ¬¿x…]eYyõÂúþóßHzMºm¡…¢³õbµˆ4Å*5:§ ÞÞxƒøòT°·gzŒ:â|àË»kƒ­§™yNÞo[U}~áÝ%9ôaïÕ»´}X#å8Ú9û؈<ù¿1+ tèð Î@—X·ÝÞb½e«yŸÙYã,¡] }-½çýî²øÜ26VDJã‘3:RD× £ès¡uGÿÑ™½È–¼X?D…ãÜzã±ñ¿u@šÊso}J9Ûç±­®5Ïî¼FŒñL'ÃSÒy´2HÄ“­š…ÿ‰Ö†>“pe"q-àë59ŽäÍ5Ó:„ák>ÞÆâùPK+4îNö6©âBFlow6/Demo/Quadratic.mcUTMoÛ0 ½È °Ë …¨o‡»í²ë°ƒ›x×îw]ÿýHJ´ qE™ïñ=JôÏïö||šÇñÜ~:>ü€oãüiõ¾À8Ï/°\ºNót[ºi¡ÌÇ×a<ß ›ÎЖáo·ô7ɦßÃ4,=t×gèÿ-ýtÏÐw§ <]ç·az‚q˜úî:¾Èry½ÁcšŸù]^»óµ[†“ä/xé–¥¿NÇ‚G?ÃK —–whiyÉIǃoK<„¶ ÐÆà6†YwÍ~@TŽÝ.Ðky´€R•iw¤˜ é:S´‚)(µÂ‹û$"³ZÁÒŸS‹Áú 7ü«vÌÖ&ù‘4ÅÞï—ZÁfz8Se7Nr¶å‘Špòh®œRs½sAêZsár}!€RלëXˆ7U ­Â«‡&Ã[ÖáÝê"lINú>JRTͪϬƒì²ô*¯a{SŒïÁSX  :iÁ1y¨ýBÙZÍ·©É $¬&I¿ˆÖÕâ’Š  B‚!”{%¥I&,I¶Ò»Hu¢a5¹T~%­ºÜ ƒ`©P Fn}° DÚO÷Æb³°a[Ë…_ú $RâvïˆZ—¤\ŒÚõ«‡Ð’÷oå¦)BJ +zôÀx÷üL…-$ ‰žòzfÒÙÊ•«·ÃìO:{š*fÌô×®i;å5úNi9é%j3/R!—v›s†bô:ç76³“ClÅIQ=6"¯ÅCY5ØíëRÍSZ©•”up UZ''R A ÅH!Í©6T.ñ-7ÍX®šhƒ>e |õˆ:hxƒ@ÚgÇ$X²Ž,¥™äLŸWíFv˜‘›‚¸¡’×ÎjU”‰Ä (/a¬…„iÙ{\i8kô¡ìšHß äÊhEG¤Pô[QI_zë5µ¶ ­()-¨-#6¾“ÿPK+4îN•‹ç'²Flow6/Demo/unarySub.mcMRMkÜ0½òä’…&XßÞCO…Þ ¥´§Òƒ+»G^loÃþûÎh$»¬µŒ¤™7ï½ÑïoúOÓ8Þ`žÕáþîᾎӇ§è ~¥n¾a¹¾¬s÷ºSÂǰž‘®ï/q^ÓëÔÇCÂ2œR7bŒé´žŸsñ÷iÖáoD—z¤xêò¦ÞÞâL•qA7GL×õr]q‰ó%¦~x½ŽÝ<ÞáçyXpéÖ5Î }|ŸÒBDVªtx‚Ágh<®çHRœ ‡åÆî%ޱ?dîN9‰rŸ`©æÉJuÞ‹ÔQ¡É?%¡¦åîï4ÊFNœr¨$WjC‹N ¼|S’ÐRØ2‚ɧGmTÃù¾öàvNꔑ&R¨ˆŒ­9®ÍL2QÏa‡qE€:r‹ §…Þ((­vqj—Aµ¶|×¹i+@:o}-(buV"$ =QHÞ4b‚f6¦°¶¹1cj¦¹+P;¦qtÆÀX¿wÈ@&·hÑÔv-+fõf®ªnÕPÈùÖˆAæK;kÙ"`;À’—Ù M%ÔÝKoØP;õ¶*þ³&kå*Ó·¬Ýѧê\~\Nbñ;»Kiêór¾JËe,ÛãììC–âŽðÅa€ß¦ú¿UùI×c…òê³å¥­§ÏÂ;x¿)¡L†·½,ßÂ%Ç¡L;(v³©Ó ª2òöÁ°~O•; 9O³wžwÿPK+4îN˨2“)Flow6/Demo/WolframOneDimensionalSeries.mceTMÛ6½/ÿ0@/ ’"ÅkôÖK ‡ íš»*[†$w“þú¾’–ƒ@\.9o¾ýíoûþ|™§é'¹üöÍßé¯i~ 8}¢/¯3]†mËËy¥u<]§aÏ/tŸŸó’ÏÍçüþ0žòyçó0ÑròúN·c¦m¾4€æŸWúê ½Ç)«Íã¼mó‰³h˜ÍõÖíã¼i~³5ÿ–Iq׈4?/#NÏór* ¼‘ãî5à²ä˨ó–4@¨Iû1£,uªzšõ4`ÑS^¶A.Óð”i8hCÕw©>Jª{†Y,Žy\h¾n—ë&n3åøæe-šé4ü£eœ(똑­¹Døw\¯Ã4þ'a˜Œ~ÜŽÜŽ\¤KŽÜ›§ž¼H]ùv[³K£H¹I‹ï‰ØZÀ×#ˆ‡I'fvb·cMÎ‬:âЬ¡‰;º+à¦{WS\YYűRZR”;«Î‘…»WdìX=Yxv{E ±ÖlK{ùwmÕðVlÁRÇ-¯Údd.ÉÛØòеBÛ“ƒ…'וbklžôí œH.•‹tÖI/|-_æj'.Q|jÞ^tÿ}Í%ÉfêÅÔ ôA:äcí=Ä­…rMÍXM“˜v¦6Ówä%ÝJŒòLUœòµÑvK.zhW쮀U¼œò”ïýúæ×·kñKâ´; Ð`|‘7-,#¦`) e¡à‚ZH@G@¡k¬’Æ:Ó‚øÅ¦Ð 7ž†T¡LQú0<+™e: Ûóˆ0peŠ¡§ˆÑû»5ömr1J›+!*Ôí1ÄD5?Ž…Ý‚£§ÞP_i˜À.Û^™TéêËïuó7haÏ­F[I¨¬“ëûŠM¢“èñÜ#õ—v.ÖœÒí'„>ÊrÖW –§Êê„…,»³¶ é£-ôTP¹ERº> LÂëí)É/’¾Ü^Þ”×wŒ+ÃAšOïá“x¸AžÿŠ?Ÿ®˜ê‡¿ ”Àñ¤÷ÇûåÛÇ Džß¯_/o” <üøãòFÁ<¾½¼¿¿ ½®Ë±$\ª_„p»|»Ÿ¤øßïwéôòvý~+²†_„MÈfðü|y¼__žÁÚýçåò0…7ˆù<žL:<>]o_÷Çõë×Ûyý8è¼8u×±1Yh·gïá&4~>aÈï×?uà·—WL øË0o\²_F1½¥pî¿JH”øú.Þ?^__Þuß.²È×çÇÛÇW—ùÃÛHðAî¯ÏªzX/Lø™œ$(ÿ²_f¿ÌÇS^¶ßËPòJ¨|šµ#Ÿv\$¶-ò¬…ñûoÕèÎßkv¹Ž!¤›^¦ä IÙŠ“KhSö{˜ÔñÊJ-¤áRH»ÑâXéxìôs:Ü^kÏŒ¡ª“Ïøo>“4CîÚ[öïS~T4ÙçXBù<š´O!ùÀN%êÓäìü£s ¥‘£¼BIòÛî:2›à¶L_:É«P£÷_ü­IçT~ª \x¬{ê¸6×ó‹ÚåGûWŽYO"ÇÌ…ªu mK·é XZ¼K¡åƒå“¦mJÑeØjh-4™zqq‰p9Ã6]vþ¼P$=²k#´z2ÆZço9ÆÙ£ó|ÞkèÍ;ÈTô–*‹ŸVI»ã¿‡>Bßâßf 1„¥œÈR™àj«Ko[ù“¯æ™¢²>Rxˆ‹F±7ŒÆV]•±B˜3 YLªë ‡*)'l9m¾¦…‡Ä¤ d5s˜å_äo—9Žf ³†ÙŒ÷C6¢;¸+ñ˜¾/?.'Å- XÂaΰ€é`ÈÅ?¸XåXhoV#GùXß-LÈÿàŸÖ‡Î5¬ÖkÊÔȪ¯+dTxKN¼cÉÛ<·õá1VoRJ/#^G>X˜#‡µp¯b‰jìÅu–ì·æ£Fýµ–PèÊR8&JÑdGáã‡ws#­Û½ 8¥J%K ½³}ªµ”gê˜L¶“hÝ¢àði‹‰c¶´—úIžSç¼KÀÑ”‰Åª.äO¸ZÍT=ŸÁß”âo@&óÃ,eA‘$ÌcúÀÚ”E‰Á ´ÚÒ‚³)¶"ë zªÿ: ÚÉ”1•SXz*ô [ò1µ¢È,·è,Ffý¥³JTm4¥nSœÊ°ÖèirS¥¤øPeB›6sU WÉìM\° ƪë0Öƒ¼M["˜o”1ú¨BÙD¶ù§:8Dìå l‹À9Õ)R-"«|½±µnz/òSu8 µš3—;_4 tjXÆëj"¤ÀŠMT‘c7—Ph»AŸNõh×£/U£H]:‚gèPj๋â&Ò»ãAc+Ì· 5Â`£rxÓæ%êÿt%¬7C‰F»Þ‡ëwÄ#:ÛêúÑ V“Få›ÓØABZ§ÑN#n:åç4liö¦èo5§å†Ç¹|+M‹]ø¦Z‡Y˜‰”ð_[G5#V¡µ¸ù—j=U=e °,Îy´_¾Ê´‹¤khÚ­ª_–ÌvaúK"²ÎÒÄ*¤UL¨‚ õ~[¹;k¹µyCÚ 0ž–šî6cš@<)¡L-(<),”â‚HçÈ 8Ÿe(ë]‡bXf¨PÁ-§Vç!zøÏBÖY!ÌÌNâðÜÜÒ’,H 9à{¶gŸ@ß(7xÎ fÄÍç6¨“9S4d*Áø–а4 ª^·¥ú')Cnž30çÈ; —±eÕ²w iîPM5Od:ŒÎ ®w{_%¨2_ðÉÕ5ñs7ê VI†‰&0èYvn ƒ§ƒ›:Ò•n€4š®@ñv‘#óFšÑ;vW2aì qì2@>O•tç# 9è-,óÒÜÇ.ÍÈzVw†Å¯Ÿ“gs6l=ý¬oeYxYõïxõitÎ3@>/格Ȁø ¿‘ç/é+£¹S.¤”×ÖI{AO½-©tw2Ku%‹»-1Šºu²¯$“Y‹&<&{ÞÖ“€¹ÑV¢D]BFç<øxw ï9FÓôP&,KØáòÖÍxš¦@¤ÈܬŒ’Çæšeª>ÛŸ4FÈ^h!ÓŪ٤w#áè„Ü%Í`FX"oùL¥e“݈%IuÉÉçSÖPuIué,jø\w1å2ÔðÐJ]5†K^¦E£Yé”/y¹æœ”h+žéщ(Í3Á;mÍÝ y0Ïc‚ÑöX. olZ¤+[Šxt½¢Oı&¶f¥¨!$\Y­aZÐV\7'cc õŸdL÷ ¬òÌÛšªû’¨³É$«vé­ÐQVꩃÊF[µ²IŒEŸ¨ƒ6FŽlÁ¢”б´P—m혆­dÙÕ±ÒXhØu9çA8©æj6U£ë’uëldL¶ÏKf*ÖÓyîrËdª³åÚ[1)‰^¾Eà^€Åë)u›g—*BfLª5•¢eñoDk芷/ˆÎ µ ^K€Pè‘Y¼€(¸—̉SÒàAÃ÷(“yØ­¸g¹UÂÆXGѳh|® ±„%•LÜ*Wrì+Rºà¹¸îD“ž1M¾Ýçéf\<ò£øò–ɘ€ÏEcúí–dK‡=‰Õ¤“º/+i +;çÑ4Ò¥0°¸pb\ªe5«0N&·¬;vÔ: ªˆ (Z¥Ñé;§m0>±\VÉ…èk,-®iP ¿Tªnqþó4æƒi¶ÕBÞ€äU¨Â®ÃØñ ¹Ìc 8ãV¼ÆµyëÎÛ¦¤kMÞ¶’îÅ;‡<.úäáj÷‰×õ`Px¯©/®ùÅ:#¦ÅÀNˆ¶ýHL5™Ç€©ð/q}Íâ6*¼c…/«pQ•’á ƒ=xç²Ø*;„f‡ùröEÝe%tä&~0wž‹ÃsXâyi #åº$á S7߈FÔ*±ðwT_p±Ê)8Šg{¨˜n-[Óc(þ¶–!owø”Ý{d U„—Fv*ÜB­ñ˜xÓfr#³¨<Ô¶ Ê*V£Be*üO­§\ƒ>FPÇLn{; ©p5UbØê^Eân!¢æ’ÿûŒ³‰ #¶¬B;¸¥ —Pá1j+¡=Þö“Ñ5£©¨^ñÔîPº6­PÕa”“ÅTEýÚ“„z§.(«¡’sLŒÝá<*%‹£rlœ{u&·>íеö.ÒêC¹,‡¿ß¥nÇŒ D¯VyÛ@t€n¡}AÑ:ó!Œ/QßT—pöÈIòQ)¯ëȆˆ—X²‡$Vjîë ÅeïMú¾Õ–|oOUaq•‘è®ÇKR¼ßîr+¤†ü£"”¬ÀÚ:»Ã 3Úÿ¡ÏÅ—Ýl€+læzŽ6Í転¨Úž›Scxi`bËÕà’ƒñª¡öíÓf38‘º¤dY=†«úÒ/‹ÙZÂ0Ülq/릷!£EåŒuÊÚgeƒoip-2žVøs”XäIAD ëÜ”Çù•îƒäÜC‹b…– r<’Õsoy×`³e® kÈM#²/aÓöÊ›3 ¦ÞÆ·éè/ŒDŒ_tc´G‰@zd¨e€EÅáwT»®NCôуH‹»¢MÍÍ—_D#`!ªÄ >æÀÁÍ~~pB„1ŒRö #ú Ù{k|"2*Ôuø…NæázRŽ$t“Í‹_6÷…& ÷; ½Ã-tw ²ù茲ÐݽNòòŒ÷гW§ˆ´~¨Á¢ªCbþbôÅ zÞ)˜ªÁoÓt °ô—FÙé䬛Qù—òes|í¢Ìõ,6«`Ø#@ZÒ²Ú\2çù³pg m¢§+,j‰BK­á¸eˆAõñeÄ›N “VÕ§Åræx­­|W ÄèRÕ+®b=“ªÂlÂÈö;‚;è¹Ô·é=™€tÇÝÔ æÇOÝѺÃ.{=zÚžÞ¸Žg È~ÓA®óË’V7ÁFÜi¾“Ù¥$©r‘òêÞÕÐÝ„¡1¯Äº}\ü­l84šN5åW8lÒm;S«xê’’„yÑ*·šZImlÒ@E,ŸÝ`0fhº pÚlGê’íUç73VÕ·MœýM£GIlŒ4¸„1v$}dŸó§â/3Š“±±Ü–ŽÛ¬· ÅU…ßèƒ_É7qŸïðk¡Á×ÓæÙåÇ= „ÍmS¡Ø$ejæÉ±þ+}Ài‡?èÜXߟuPÞ{g¿ÉTíNMØ”£‡i“‡{zŽgPÜ­¾jÓöìψ¹+–³Ê¡£–>}x1Nc§Ä9§…¹hµ¨O<FW¦[{=ì-bËP¦­¡'O¤ÇŽKvâFÜÍçÞêÔÎûÛ Ýù´ÎaDž™AI€9à'F4ÏãDèfƒ~1â8oûI>.šJQ>mh†>è?RÜö?(¹Ç0#.èJôsPYÏE}6͆ðÀR‡án86º$\ð5†9˪uÍÂzµº(ï â4)ëŽÊyá 8=ºTמT÷Ä ‘íµK‰Åâ5–—ÉŠB²ï+sV^m•tãpðóÊÎÀGW óÊ?uUe›1¡21šdÐò扃ô¢óÅÏ.¥œÓt¤%5½Á2÷·„Ƚ¡O«{ŸW“‡îjª“>¬l,ÚÈÆ4Åá„ø“üØi‹Ì¡ŒÆÂtÀó5ævÞ¶šœÖ5p~Ìî²³ ˆŒËÕCÊ]C÷ƒ­è²ÆÚ¾æwÔ€èþ5;BeU`ÐYì#¸¯©ü€mŒÅ-l9e;åû˜ÈÇÚaYƒ’JÁrIâ;ˆÑZpɹf3 Ç„Ã"·GšO•ˆéQ~•›î^£ß·zX¿ ¤Ÿqž4sÐí–½?ò3ízF~7k¤è":nO}ûAŠ}Û1P‘Ë} R‰}Ç&•¶œøœï­®n¥ž#7 É>AQd~NÛÂüÜ©ì;æ ¾aw—½º€gУÿPKŒ4îNÄ´(· ¿# Flow6/ReplicatorV3/Replicator.mcmYËncÉ ÝÈ?Ef€NO=X¯õA²Èfd$€Æ­î6à¶ Kdþ><$ëq%C–|¯ªŠÅÇá!ëê_‹ÿv?|yyzúÍ¥áÇßÿ??½ü·ðÕÏî_/Žÿ®_Ï.½}r§çOîóãóéÉ?=^_žÝËgþGžtz=ÿé×Óåüɽ_ŸN×—·KÎëéz=¿=CÞ¯çËÕ½}v§«»\ϯ®ý'ëLùøë•ÅÅ¡g÷p~zº¸§—ç/îñÙ]_®§§îÛùôüˆo0¯'²Y—¯/o¼k{z9Pû/߯WÖó—©Ñþúåû—¯îÂzŸùv( ‰¬ÏÉ]^ÏlÃËg‘ñCbúñá'úÐ|þÐK&ñ\(ºº‡—çËõíûÃw÷ðõñ铃‡>_ÎW8*SôíñËWŒ}I1Ù×ß_¡Ûù™]rzIîôÿwz¸r„¦ îËùùüvB.›ßþ~>o†þ3ýôóËÛë÷ËÇoì9wáQ(÷*¿½¼ÝÃÓùôöô‹ÎË+ŽËˆË(—A¿Õ?¾%\™9—á2를1·¸Êï¦ð ¸).ðurÉe×Ù;kk?fÛ~êg¤ƒ4LG{¢]º¶Ž+Õ–/õvnã«xËÆÌì¡cÓ†·ÀL¼Î!JÕ"€þÒîôF**K&íÞøywäÖmtwf ?KaI«ãŸc ªo±4î,i•wÝV¢!C•ÍÇm·QÈ^ñM£«Ðm«·|î÷ ìüE.‘y7‚§ÁâH_ˆæI]·©q£d*‹üÚ 0x§i̘©bÂmP ’Arƒ%z HZúŠ!‹àc,Z: <±Ž[±Z6¥ªV“X­;දvO×Ã-â½91ÅýVÊ8Ìðã-f:¨¦°›¤õ.̺‘I=æeÆ»ßÙŸù ÊWG®M±°ŒfÛ¡ÝXÚÉñjÓÝÉÃs xö\,YÁÛpƒvçŒ|pFZEBÁ¡¥«C‡Á7Þ sðVoü?ʦhîë}ŒÑšÕåCIŒí¶OWƒq­Ƶ©Ø[—c®ñ‚æw¤B›ªŒz_µ4Â~ìX2™GT êa+;£HaÚœªI¤·7Ò·ôÝ2¾ï¦ÙТÌ%õ®wೊ¢`±žïJ; Õ™ŠAl ‡ö¦2ƶå€!ö¾ÄõMy³:“<œÎm¢‡ÿ52='Ýy®£ç ËЖ1X&Pþ‚²|D™×»@"¯0¤Â8 U£˜¸>$)]’ÇÂ4¢˜¸N%Ô K.®â U£ë-Š¿žÖ €*p䢩¥:bjÂXÆÓ¯ ñÎ1,…H(ò†“ïªIÛ«µmÊ©^ÜâN¼áI¹×–Êj>ZUÛ¬½Tíâ$.ƒæYË YOFmôdT±ð®$ç4Õy¡Šw™ ŽÃ ¼ùëÚöÍ¡"˜*’ŸICí,‹ÚldJ²Hó‘,ëie}ƒÚwÓ–ÉúmF¨¡žÛ݆7p壶¸¡â—²®Ür_cXÒZo¤ Ú¢~w NgÚÎ8á¦Á ³Ça¥ • Ïi»øW¼J‚OÿÂ/}óï–Æ+Sää§™ïg¯6²ŸÍLöïhŠ_Óô‹Ìžf¶E…tZ €°”4ÂRÙc§»öKhTÊBÐYïöZ™K^¶ÚW£$ÚÛÉ|SZ·TKÒÁŽkÑ€d<¼¯m9@Þ¬m™k[³]È g»@3V»@|VË8i}HIœ·9ªgÑÿñ(58­Áy¢?Ç»<Ë_çé]aø6ŒÛ›æ´ò)Yɳú{„‘Ù+9Í=9âQ¦µ#Q܈–†òäùœŽpž¯ê³Q”ÛœîýÊöçÕ» Á¡·Ö_œ¢þ|;é=§ý¸(g1…=ï’ ?2Û/Àe.„Ó"$½…l)22_¦Éïf.×±Le†7ABáÍ$Oü,¸™D' mβ>f·ñB¬dÌžÿPK+4îNFlow6/Reploopcator/PK+4îN‹u'B Ý! Flow6/Reploopcator/Canon form.mcuYK·¾ð ClÀ°HV‘Mæ6r¾‚ ŒV³Ö »3›ÙQ,ÿû|ÅW‘= ´=jv“õ®¯ŠÍwoý¯æ›ß/OOúÞ}ûõWùÙüøtù#âîóËÇ£¹_žN‡Ûåú×Wóp8_Î=™ÇËõù;óz<žÍñ¿ÇëŸæç1Ïüt<¯‡Ûér6ßà1†ß~?è]®§ßOgPxº\^Ìáér>šÓ«9 •JïðxÃí sO××›©$¾+^O燣yøxzúP@¤Ëùõvýôp3ïêX¾®ÇóÍ|8ÜB´Ï˜øüòt¼¡êÃååtüPe*?ÿ¸½îäy¼|:0\ÇÏ/O‡ÓùøÁœÎEKÌ+z¾™ß??(¹_>‚ÂËá=ÎBìýj\?Aµ›y½_LúÍWˆãákYòŸO§‡C4ÁæÓí£IÖ¾ý»y>|6ÏÇçËõÏIê]>‰G`µ[ÑZ' yrƒJOÇÇ4¾Â'æòh~gÿ­¬ÿñôt|óÏëññk=_ßüp9ß®—'óîvxÿë›·‡Ï§çOÏæm%ùîýåó¯_å o¬q_%ÿÙzëLÀ? äÖÉ3¹­Ȱ<µeB¨·…ˆk«Oe™«·N'dãprÂ8˜dœ«\\î1s2§aüé¤"Š+/ðU¯"¸Ô7ª@}©/k½`3.ïUV[åð,‚ø"ËØV“8UÓvéÚRŠÑød|nCÜscèƒñÑL‰!8@"ÈëþØ$ñzÂn±šÜV'LY³¥þÆ;3^$Û³™ƒd‚W·Œ˜ ’…¾­¯ó*éäMÂ/›Zh—™Ü\(®Í=Žôuhš’IY¬³e“œIÑäjz·ø½¥TaLÂ6„+5‹Š&•Y \…GÆ|äh09¶µY—†V¡J“‘]ÅÄ•Ýð´/ .&tmhuD# ä‘düÏÅáÛTLŒQçÆv!Ž‚¨Ÿ V—(N}u =,dÄeÚ¶<éáU „XpÎKxå’9W!³ÏW–uAE-t'e”ºs ?'¸è&ނչ´ ¡”X7¶¡ Y3•&Ƭ_¥â•Gº`­Ý0¥©ÓJ˵›q}Âx&Ï«ã@ÓhË@* lF^iQÎy’WA°¯…‚›ÍØhw#ÖŸ—„]àÁ.H¡ ÃŒ€ qŸ#]þö(¤â "0äùýµ¢vRÈì¢2ˆ'#-ównŠÂrk}9&?ˆ¡¢:Ùåé2Í)Ø;¤†S¼w¨³nóƒö²n“¼à%2Dâf¦)2fËox¼©£7è´¥9Rš]—@™¹&¹Öˆ_íšh‰nT—x( ˆwRvál'°ì) ê¨ ÝÆ:&§<&Ü™ç6¬,—¿C—É ‚.™u=†N£UÃIÙhÒ£v¸¼ —¡R¹¬²I¿æÂ ƒÞ*ÖùmÎB.(¿D±GõðvIì)Š;˜¬Qà­T²Ø™z/,b¢ŠÙÕÛÔ¾<]L¹6¹hÓIi¦ÁõÆ;ž}¦1¤>š×Ã0SjþߣAåKn•%úg))MKé’¥IßšÒ2™F&erožÜ†ÞÁ‡®ö9"ݹ¿Ã¯Iioèw^æÓRÔV}…ˆS'ømh§Ð;†¾n¤JEÇÓCùž&« 1Ì&_AÚ“tbÚw¸]Óày‰]ÏÒK-evGO*DPl \±±/‡‡Y£ÂK9iþAÃë9/ÞV mZ-ˆ¾Ý?+¼d=’ïGÖû ð8°gÍÔ»Dþú)jgÀÕäØeO”Ë)_YЫ©}†´ð\KŠ—¸§mÖû ©\û(Ó~~s|‹¤£6¹Ülº©:k›Œ) ¢ê7é¯Gqö:ʾ¢ùEÌK=IMeY°TÄ8©ÄÚXwÍ$’9 öØøD{¿Ð£ÍL„DÜçÇ2#UêLd>*³ÇÆç%YÖpË’,yŸ~‘rïê,45Ád“ãÞ 3 ä4 ±ÆYI%5`ެb"6dQɪ4V xà)ºu¼Uø˜Ë¤ÆþÎÊd…ƒV?ìäKÓÚ[ˆãÆ&€À\ àE%NIêw¡BØj’ÓRÎ Ã5J)Ï9>ù`îàfŠBbà6!ðH÷)„²DRT¶6Ä~EŠJj 0†Ô«ˆGCRTœ­cùnÓªÊä­¹ŽÞ7cäEMö¸ÕòßÄC•¡VVô:BTžR‡ð„ˆf›¬e”d«GBŒ´¬œB4I—*öh”·,è!á÷¹K,—SúÐ@’] ¢Sýdòè ›’HÍü(Äš ÷áÏBM«î¾™""«ºbSAó.Em£Ö"L(#¤U…äãRèNA>½Ïl²¥éñ¨;¹ÀÊ=ÈJq˜…)ŠuÝ‚1«³¼³­#„¦ »Š¦I>‚ÅÓÄ2\±e…+Úlm‹»'ÞÛ"Í],C¡MFfL¶Ã^…´ˆj m“íÒ’bÙ8­Êж÷¥›¤Fˆ1{É`´Ä„Ii¼“\<,³Á)Ìq±ø­ \ÚEÉÒk¹ý†˜B-[åù³ÚN[¯Õ˜“ïQ(Oû÷;hÌQppÀ.…d[Ò4Dy¢<áDœEžÊ²º›­\NRÐmd*c_–öO¹&ß°m˜^r‘ňZªüY*GlCÆ•‡GPÈX*G‹Ul²X¡/EyëgåÖ¼`ùÜuËwªò…ˆÝˆv2TwÜíwX6A78vm'­ÆÀdP9𪱗kÄ £±_6¤îdùd¥“n$”fÈÈ~4Ó,ÊøØáÀ”ö1ŠÇTù°=Z)–Š Ÿbfÿ÷õòÕ@UÂ>!ÎÝ£”pPù¤ÕK˯–ˆ}ŽV—C¾¨ò‰¡ãhõ8ÈÁŠnÏQW=¬•L÷i`¥|³ð›Rƃ£ÌÄQY>Žìú‹µlð&H¬znrÀk}ÏÝ/DŒ—#¤mZ ­7 üMÞnCMÙj´€ˆ29w˜`9Z5[ÆBZ>[µƒòò^QÂîaDb†Ï.Ýwô’ÓIa›Nw02y‘“œ›,¸ÜÔ¯‡GARnûqS?CÞçB©†P}Á¹htŒúÁ¨ œ•7úÎ#A8Ë56<,ßlìøla™Ú ˆ’Û ðlF n;LlQ >q"<‰ã4ÉVYåÓÏ8VØæ>´åAˆÐ¡p õ`BŽl=óéd²};ùÓ¡Tƒ“ óÁÅv\ThÙ6ÙêÜTX¶³Êz¦ÔßùqP,ÄP „½/ÆÊrÆÕÎŨÁ7WmeÐ PÈûX¹ š5ª²¾é_LºŤwèƒ< R¢¨œ/ÿPK+4îN]¦U0>Flow6/Reploopcator/Corpus.mc}[Ë®#9rÝÐÿ€ÝÔ’o¦w¼0 ؼx¡ÖUÕÕ´Jº¾RMMÿ½Ï‰™ª]y•Ì$ƒñ< ³ÿòïñ—_>ß.—ß—ô1üñ§?üÓ.ÿz¹}«¸û—å¿_Ï÷ÿËÛáñ8½_—ûëíÛùúyy¼ž–÷ÓÛåv{;·÷Ÿï˯·—ß?Ê0{Z··1d8èx¸Þ®çãá"ý?,ßÎWпÞ?ŸÐ÷ý!ƒoŸ¤ó/§/oóéå 'ZŽ_ÿ`²†9¾Ý–/‡ãëùzº/ÇÛõz:>N/2à|}Ü0Õ§Ûååô²üíô~?ß®>Õíýüù|[œé˜[èN¢2¿Ë—¯Ç×ååð8,§ëñörº5œE ËáúÂA/§/·ëýñ~xœÆXö4NïË·Ûûo‡v=-§¿¿]`ùŠ@<‚ ¾“õËùåårú^\¼¸¾œžäþç1ærúôP~9¿¿ßÞÿÜSŒŸï2^ís9€ ;·÷˜þò»’ÿÓ=Àê—/§Ã•3O— Hð§ ·Â$ï'(ô«0òbnDX8]_>IÒ‡@B9Ê’…,Ôt}!s'åùíív??@õüX>ŸÊ/­ ¥¥½$ýçå~»œ_–_/·ãoÞ'Sýz,ŸÎ—ËéŒžŽ‡¯w¨ûðý ´¿ßOìz|=Þ` È üv~{c§ûÛáxúÎ\ÐÀ«êþJóÂ5~TþÔ¹ ûˆ„óãû@Úù}>ó;~Û/Pçñ!œÂpÍûù3/#ùöz†Çš.öFÞOê—ÓõóãõOÙþñƒ Õ‘Ñ=›kIH<¥°çùòâHÀ˜Ùqüo`ë†è¸"ˆØEb\ Gg°‰î"î 4?}…ã?^N:·˜ÃÔïÔ—¯×Çù¢¬L)å”q€IŸ@;&þãz<Ñ?ïïç¿îâ+÷»šŸÞo_`›¼DøPŸùûá¨(¤ªY®§l÷‘bá=ÌŽþ;Í%gº9^nwñQÏIˆ ··“Ú`¸(àðþåÃr¸Ü\C‚²¯T‹ŒþQa˜àt}ˆ÷ý óÿyµ)„,Ë9?(>Øp+棸”~Ld"ˆêŸ|ªúÙ®ÇÛÛÙp‚œ_èʉ`NA¯®§o†£‚ˆ¦Žï…7 ìlòrƒï!2)´Ø·ÃõqW·¸}wõ<*Šýîñ„õBî8þóÃaÀ»p’ŸïϼÜOÿ÷õ$îrÌî¼ìãT®°HóøÁ1Ž¡Ž]ì‚æ£Â·Gia%»OkÝ>}ìÀî§a+ÜRco¥2áWÄÌùz¾¿î#Âüõö+dË*ÿ%¿KüéQnoÓséä}Ãü©ÜrXYêÒøTi¬óVènxþ«î¼ÇÀŒ_^!NŽ„´þ·*é ]ÊœRžWù/4ëS|Òà B¢ù<-û¶%ÚÄ1ê+öä*¦ÉEqeDæ÷•·ª˜X—Ø´{t¦¡,—·Å‰ÄmIxðoê¯ømYâ|çSšÒ’ò’Ê’ê$]I5 úà1õ%mÓ–aR ó©ÍD3n…I˜¦-vȦ'—!hA…-*ÍÊfe5Kmâ¦/yãß²î:ëœÞÙH¥¥€3 S,äÆJÊÓ÷ÊT€˜¶Tj²gŽs$g.ìt‚ ÀPetµÎΤH0Xç ïBŸ¦ ©œ¸æîÆÈô¬7×x«U%ÞÓ– êÛNÕÆ*åÑ´±n¤–—–DCIøkb¶>µ;ǺeT»­Ê¿†”§­KÃß²´N×Ïu)ðp4ÁC4Rä>B=-ɽDô( u‘ž–žG#KÃãP%ýƒ{[zçßuºån2ñvè˶.›aArBY"Ìh®Ž[Z¶¼l¨ ¶F4¨Ë& ìÛ²ášÛ Ü4çF­ÁgY÷\…5-uºå.î¥SXpk%dµÉŒz,æÆ»Îhe猫áÚh™^–Ž‘+¡qÐ2Ô¤ A¼eé0k¼c€¨v•õNB¦8­þh¿‘7—Ù,b˜£ßº¨bÇèTBdþfþ:áÍ “ÈJLFl†X"ð™Lf+M¥À)èÍ¿ŠýñYQÕë€cÆ´ \‰¨žÔc Ú#¹Å\‰W5' ´< mM3Yuåªïvq¢8-:$Ì–ÇÚcæÙôµ5UjtÙÊ@»MùͼÊx©CƨáY 8µ7‚Éó¦o¡Z E€WÄsPÌ-œ^ ¸3¥?…bö*Iíåì›u»S#¥h÷*ÝWíŒé íÌéšZRЈ‚ßÒÝéŒiCŽæË1( ´ =WV7ùø2Í—”^˜Yûôsþ±—kÑ¿JœmCm¦œ*}*ïºGÌ:ózß:˜U؉`E(›¾Â(L²¡¥]7þUÇ ‰@Þ-kKô†ÆÄ¥ëòÂGà¬mJ±íl܃c”¿LJ¦?mè¡ë_Y¥Àöæ/‡N½v¡Ò›ªÀ<|BïØÒŒ–¨Ó…Ì…- çrßVüS¯‡ºè†¸ê0IÒ‚˜6þb²Íã_b°”½\®º<æ(Á¨ éÎêç¸ÂQ´FUÄçÀ¸RwêqqÍn¸ê@̳+¢;CA¨«Ô[sKF |\93Jõ3™@02½¥:ÕÍ^šh¦äK{ÁlTvï“$}‰™Þáo$Š{vÉ”b¦¹…9Bd‚ë)›è~µ(©ª ÕÍDkš‚€ èÞ:ÐÓ Ëd´92 á—ÃÀƒÂøè ©ŽÉ™$GqóH”üŤQ ´Ë A9ÓÊ.¹²äWÒØLl3§ œ©IÖÆ Iþ‰Ùò$þ‚IE÷‘u¦ÁóÈÖ8?–ý´ãeÇáÈöÜ06ïb¦Öºå•¦…!QΪ#þæçüñ)és#À»Ù¸,á32>"IØb ŸÜ¬@“ys3»W– W{¶du˨qh½’Ü–"º?2[aqˆøXÆN%ê² “–áG|>* Ÿ(–nÌ@¥uu ë,c&ÎRÙ rÕ½ÕŸóàIŠ€¬È„5¹Tqž"V‘üš©q•5ZRfÉ—£LX9ºA·hyx}r3õ (/ß¡!óxµ¼¸(§O$Ì1€ðTr¥çÉ^3bÙˆ´lã½,•±>â«1÷TU røh‡ÅÏÛ¼¸OÎÃÌ…RíÚ¹«}»FEÏ_ºt‘žÖ¥Špè9÷€²ÓÔ…Ïü—2‹Jvðà~‹=µ1F‡¡`(_p+©úª†XV­±ÊÆ +ªgräRCõÂrrùŠl©ec·*lx›ïê7a]ó|gƒ}ZÙ±a(3­;‚Tý”âà‰nÓ U×’´&17 ÅæîÞõªÛÈ"ZK«ì÷²o:•sÛ’úþ•Í ½;Í”°˜TË ÒÊ0KZ2!‹p"ÛP§‰–Ù¶„´±ÈdŸ7­†ô#Kö÷Å˜Š å‰'c94ÅlZaì£wî$rðèW¿7äI²ð@ GòK’}EŠªêh0££(‘(–i\ƒ'ÐF  T’b,®ñìG^àÌ&ân‘z¦À&wÝË&YæRT_ɲû6œ¬ ,8Ž­¶"ÓÕj¡Nv«ûWb‡%Sʦ…ý6Ÿäži² Àj¶Vä=Ȉäao,óF ;|ú&e]òÞlÜmû•yVr2¨R}Ëúìu‚äëñ¬$ª•nŽå%exJÒ`p<ZêiQ M:ªxÄb•(˜ÆÛT¸6H”²ØG;¡’M7îá9ë2/軌ɱ\ D¤Ù$áJ…h3šÔ‡¥=šÜî„!J¢OôŠj´dŽ!ªJ"T®hÔñÄ ·” tØ“¥[Ì Ð0¤[m¸8W3^O.ÌyM—¬E›YlDkæÍL«52uJºhÞ¦ã’×<0ËlQtŽ8±ŠªIYóJ!ɤVÌvf=g‘eUhN²sL̞݊L«c¥I,™”?Š4Öå¦d4Ð’§ˆòDÐ ¦iç[#ÓêõÌ2 TÙ!†–Êöxщr`pêîL•y›å ªaRVç3_ÛÃúÏYðž°€%,`i“u!5¢sF.Q¦R‰{ƒ•*ïJr3]>TT,«r"ðŽ5.m\>Ä%4ýAhéoõ`So*¥È§÷Íb4c5ËXÍ2¶EyÍ{§’Ÿ½ O<ÿ5¸×lƒ»jÓYÏC=1Æû¬»£Œ1¯\7< ;Á'Ú¨íàÆ‘ފu3v?yí;Á|*ó6ùK|”Å!cϲ3åXY]¦Qµ| ±a¦a6¬Ë9®žXͱâÜÑçÈ+=•Ù8DV¯bh=)­°‚¥¨J¶l™…vŸ#›PMÜ<‘®¾i«#µÓ‰ÔVXo¸3áVC2éù:“õd¥XkØ#ÔQ«`)k°œS›I|µº í¡ýÈC¶ØV9Èð§,éLðªŒo#w{Jã0g‘ ¦TÛËîñŽy¶¥'á8×]•Âw§¥Ì†í*ò¨ÖŒ Xæ!Oh%ìÞOKÚûc›·Ìƒ’4NGJ•q&”6S5©Šžl&Uaþ²Ž¾zÂ>ŽtX¶Öýs•rR®ÆM®rðUúÈ£žv¢ºÙÈr`°ãÉj²YªY9J™ŠÝ„§j‚^°"ä¾‰Šºèt3ïÅES=ÌÒmÝŽz\ž[f‰ø¼›l‹:ÙÆWu‚\S ShUE§²wºE–yËê¡¥Gk¬>ØßÊö§¬É§çŽuè†@ONšô(曄Â*J¦Ï$iŠ®ú¢ÈÆñ°¨T›q+ {%(¼k‰“…h-Q‘•ÔT6ee8ÜxS敺nÑ£ÜxS» ç¡{³{SG‰šâª¹¿L ¬N.4£ùŽDÌF"Z9Q¦VU‘Iå°¸p¯¡#º¾Ó)¼¨¤$³…¨¤$[»D%%Ek-ë¬3JùYÞŠR¢îæ“kÈU­€çÝ…*pœ’¸‰Gü$ÉJV ìtrv[?´y?¬Á³ÀëJ5R9óšï*/Õ›˜57Óœ¬ÑEÏ#W;±_í¨©8£¸-2´§ÂÆ€öØgI™ð)|4=Pƒ¿—bcw Vyí9‰ÙJ÷Šq6nÈæ¥l®Â4A?øYM—«)‹Ö¡ü‘œ?ƒXË<›±Z1ßt­Dó*š¢—Ê ÓW>תü8Â``ΖQÖãîx¶Í 25OB‘u›̰ípÊ]ÈŽZxÀ „XãvˆaMLX°·)ÜNb!(­¹€]ŽMõ¹I°nÑ"ZÎËÊ6ò!žÞÌ(ëÃqØ©¨¿ë1õ¢¶çzÞ3›Cø•Á6ƒ§Aëê£W/Ä{g~½sU¼.Ö€UW ÖèG»ÂxQ{¶ñjÝ¥=uÝáØ@6Ö}œÖ ÔÍÅïmøü*G®~²@Ö唤kàE/‚Ói¾¸SŠ+¯ JËߟÆf²0§ðœ~ЬU儆ÛÀU®g»ë`w×…õÌ9˜÷²9­¬qÓÉYFh íÇeo…áèaÉ0ž¹=m±VzÂR™ŸÙ5ææk³|ììW÷°< edâ÷š%Æy`Æ«¦ú æ&âìóÒØ`˜ìe ÿ^ÉB‰Ã³.FÅ>dÿ¨©r)`F5ñ?Ì#VG? Zæ´(¾™mý,”ï7¡Æ_…’q6*›—Z -0wæ„` C-R¹¨Xxkâ+˜VsRUY2Éñtx›B©êP¶V:rÖ20Ö²ÛbÙ‡º8’sóVÅÿæÌÑÃê«5ûÃÿŠ$´¸|‹H­üerjµ?ˆØ0Øö/*läÆo5õã½Ö+–®J¶¥~2 µò#¥ÒUæ¹jìÖV†I©ìÆú¥Ì¦§±v+Ç›¡øù¾mœEÄÜð]œÈ™[;‹ŒùùAm¬^± (wÃWnpÇÑG¹¾’Ž0B`T9”®ÝúÒsUYYNá·u_³¼ksUÊç*/ÕëÝì@^’4Ñd1[UÍê­ þ;K-°ÛÆWòË´Z”Óïb uì§%è8ˆó¶:kf\i4°½XÉc[ÓD$É v‹…)½áU[eíêÂh"¶•¿MŒ*%  «”6*Ã;0vØojcÀÖ±Fè÷:éªKNñÛ²ŒE½±\=¿¥lWËsÇ>; 4ºž[àžŠ½À­Õóó›AYÇÏuµÝ›'ìÞwæ½Ôv,“xÔ+²´®F$—ØP|ì#ØçÛ†aTB6ûÀiç›}¾Õå7à|ãgGi—ί…²»²sî*>¬$k²qh‰…nÉ£WbYš–¼me™êHÏÚ43¿éМ-Ø×mY§²~Ñà+ëïŽÑo1 ¹ÌmZD·Æ¸œqß2›ÐIY}’U¸¦ýY Ó¢Nuõêg]Rw²õ “²ºG§ ed®"Æ+ì§ÚÂúа’4­£qÂè[›Æ¯=øeâÀ&'Í»GÓT_²÷é$i;É&÷:&ÅK1 kú=ˆfHššÍ9´Ê·gçEµO‹«ÖM@pb[ÿd|Ó¸l,=8Ú—ýû,~5V¸›dõOVwyÓ¬Pø´Ïì3.wËu$1Ú·ù÷Gfó˜>j6Dió#P‰‰iNÑáæ™ãÜ @bAl€©Öùá©(‹å»u8’Àcë]Q­±;«ÙÃ6c¼+¢ÛUX5£¯¢ÑÌã \ª7¬ mã½ú=Y÷ ö%“uæ»¶9!5„hÛ&î8Ôõ;XÉ £qÂA›©Û+º‡aŠKó ¼ÕÖо²"«¤¯mㇸ€•¯ÊœaõOÔ6YÉ6*_lM{²¾¡ÇÄË‚^¤±íÇïØŸ¬ ?›×67è§;¥Þg™x [LØ{ôþ|ܦ§tÇè9½’¥aâ0zæa°ºxmx,{¶Æ3Œ‚kãÀ¤èÔö褙^ót°Çvq£s×ÌË"cÝ-4=ÊgS=Y[¾ŸTôÝK7$åúIH–7ã­#puè(#‹Òˆ“Ièe=µŸ¬ íÜQعºñSjS•Ô”G·÷Œç§%¡§.KBGÞÔ³”µ:œ>?05m¾÷íáP«¸ÔhºétàÛ½ìlûtÞô#+ó‰c^¸/Ó¹€¹½ì|>ªèV“çüßèY q×ô…6ø„ãôjvX‡q.㈃”¿×4˜ÁZÑ«ê+N¯4{T·Ü‰'Á§¤Øïà¨rh®zX™6%$‚ž6vVëñwà¼0ÕxI²¡¨®IÉHß{+lÔaðàAFÂ;Ô•læ<Bb,?o–›U‘Lñq±DÏê óF# & z«ëÔaápXçé]—<¿w«"vùΨ뷨rãMîó»46åÅèn«î½F’g’Ú7^iˆ VGh¨Ê|sÀ—UbÇ4á©TwTíóË]vî[ýqÀ¨úøñò:4­Âò”MÄÕDj°§ÍRF¸o+}h„©F¸¿âádÞO½I|U\RýÞÖÞ|Fß²&…&K›VæYÏÅÈ`zï!ùHÆxÈ£ÅÿÅ ŒIÖÑâ˜Xy&1¨ëÿPK+4îNÊÕŽ ˜"Flow6/Reploopcator/Reploopcator.mceYKo¹¾ð 6‡MEîb‘l2Ç,àÄÁb/á£QKd4­Ì´ ëßç+¾9†5VsºXïúªH}ûª¿«??®Çã»â[úËÇú]}>®oO¿©?žu^^އýn[Ï¿^Ôq]_nÔÛa{RÞÝï¶ÚÏËîþ=nدÏ/Çe[Ôît)öëé²_÷Ûa=©ÝùY­/Ëi¹¿Ô_6°|xá—åøð×ËëÃÃaXNÛÚݵ­AÜqØ.j};©»õþ=ÊØC6Ä=¼ž¢ˆÝQíŸÇûórJ"â¿üñt¸¨—ݶ-çD¾¬—Ëáîp(s£Ë„°V‚v[Û½š²—ÈÞª»w¥§² ãÛåÇËqw@EMñ ^"³ß‘'Ð,fʧßÖóËëåöyßTïc œî–˦ίȊ †Â þ?:ù_^â–ÿ½öÿ…'…I6úiúúwì‡z^ž×ó{믯j^–-ê׈„|³Á}ÇåAì=Ÿ#xèR‹û?ÞOÿ:/ rh¿\`Êi;¯GõmÛÝ}ÿôu÷ãðüú¬¾&–ßîÖß?~ 5©ø‘GyÀ¿òHò­Æ/ùp£µéq’ï…À*—¶1~|æLb¥|¡%!Ðé±ã™’¼D¢Ë£!™š™º0XG¥LZ6èÆ&î%¯(½È*rŠfdEÛAW­›QU´Nßkˆ"SXi–Ó.²‚:Bª¡:Œ¶*(íaÜTŸ¡Iõ‘ì¶Š'ÅÔ ³X1‹žH]žŠY+6Ñ'?LQp]&6™ë¨ã'Ë· 8;bV)*ϾúØH[4‘³‘vh«FÞöåö“ Z(* Þ&Òd§NEê 'ÕûP8$9n»Æ5¨(µbS>[ÉV,"H$; æKR“°ŒN‰Ð†ÈuYQ“¼¾³ÈF®TZnS¶€jã-Ä2¤Œ7»¹XŸòºÂbrã‹ä`àq’¼ Ee ÓìU½Œ ÒDµ(Ð5éfPƒÊ¸z¯–™–lg_×p ´DÑRO”´.ssҨr^yå’'dèm`®ÅÎæÕ©µë¦Ø¢§Å˺› G•¦N‚ ¾V‰¸Cè¡ñp1¤§­s®¥§¡fÓûXËŒßÃùÐp4ªx¶‰“W¥h£ÃS÷læ "´é¢1&ÉÙ&DPÉt*!ƦgÜê¥À ¨ŒëR³„½:µ »í&$Ap[Cóäã:„¤z4×¶²r(DVV¢YAKFØ´ª¹¤ªf¡ò¿µÌÎçùlA´µëœ5´'-ÞãáÐ%”t¦´“Àg­Š \Ï–±¶gì“'e¯ÀP+>ñqÀ+ _9vÖƒëü8ÝužD¦èœ7~=×nœr¬âpٺğEPhÉlSªƒà\{ª:cž×^Q@§Ñ¾›ïê)5¾õåd æegK2rÝÐ]™¹ñõ©®ï:¤lL M'LÞ:èÎZ{u:1²ÕôÉMGù\-ã¬È‡ŠCõLæ'yšªAJs˜ðttMO/£W7"ô³ù5’ò$8æZu^½õùÓˆm7.ÛÞ‡Gy¢&vH{–"™Òñ„Ѓ˜äíè$·"¡+(¤tPŒÑF™Bâ ôÔ(Eú v¼R³î}8(ÖëˆB i>gà*ëÚÍ‚ËÕÈœµ’¯C—'ƒ\0ö!Ò¤Ü%à$šX®G ¤÷'F×8 ~ּђ)oèÎíž„åÖd˜Ðm7„§ÌJ•åltSrœ²ekšÐÙÈ£-œ¼\Ÿc¹ÞØ«ƒË剜 „BY@*cÎg;¤:cüg[SÅqê ‰£ ÛrÓWU¶¥ÕäÓcs$Z?ª.ª!*Ú¡%s;Â2àºôux븑£fšùXÜfF,’Ñ,¤ITJÙ¹ÆI6 Fàv¡"™‘çù˜Ó ÊÉý\ÅV M.])Ì6¡3`”[³¯£yÅe:)|Óýp‚ÂeF/U/] °$å}‹köcô@̾EÏ E©¾|ì=2°-@N…”&^Õ³LN¸I]šZl½\Nqoæ:Âs$³%O~h˜Ì+/¹ ˜3/PPOoao.]9qhå'±ÃE%¶ÍÔ™0  &r¼íZò€f2eÒ6‘°–_ž±†Á‚nžÊ™Š·!qòÊ”!Ýa‰ÕK „¦C{0ñöºƒÏ@ ÕÔ0ð©¡Úþ¤öx ¶O÷bTn›êç5d-Jœa\‹§SSæô9s†ryê³çK[!ÍÒˆ <¼1A#·ÝùnX;!÷Ù³éœÕ-@- £\ºOÝ}ªa]þÖ Ó ñBCsGwö¥šÇÔ2c¸6Ãù>»%H^M2ñMÈ‹ô7‡)¯¢èlŒ‘ɼÞtœ:L¼ùæü6j’o»‰ªˆÈ “Uù?PKÝ4îN~½]  Flow6.rulePK+4îN 0ÅFlow6/Demo/PK+4îN¦ÍÙ,Í  îFlow6/Demo/Arm Mechanics.mcPKF4îNŽ™~I1#+ ôFlow6/Demo/Features.mcPK+4îNö6©âB YFlow6/Demo/Quadratic.mcPK+4îN•‹ç'² pFlow6/Demo/unarySub.mcPK+4îN˨2“) ËFlow6/Demo/WolframOneDimensionalSeries.mcPK+4îN0D"Flow6/ReplicatorV3/PK+4îN!àæ¢w3 u"Flow6/ReplicatorV3/Body.mcPKŒ4îNÄ´(· ¿#  O6Flow6/ReplicatorV3/Replicator.mcPK+4îN0DCFlow6/Reploopcator/PK+4îN‹u'B Ý!  uCFlow6/Reploopcator/Canon form.mcPK+4îN]¦U0> õNFlow6/Reploopcator/Corpus.mcPK+4îNÊÕŽ ˜" _fFlow6/Reploopcator/Reploopcator.mcPKÞ³pgolly-3.3-src/Patterns/Self-Rep/JvN/0000755000175000017500000000000013543257426014220 500000000000000golly-3.3-src/Patterns/Self-Rep/JvN/golly-constructor.rle0000644000175000017500000000606513151213347020351 00000000000000# A simple tape that constructs the Golly logo. # Author: Tim Hutton # # Uses the Hutton32 rule, a modification of von Neumann's CA. Under # this rule, a simple tape with pulses can construct any pattern of # quiescent cells. # x = 131, y = 33, rule = Hutton32 MIMIM4IMI4MI4MI4MI4MI4MI4MI4MIMI4MIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM IM3IM2IMIN$N2OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4K OKO4KOKO4KOKO4KOKO4KOKO$MI4MIMI4MIMIM4IMI4M5IM5IM5IM5IM5IM5IM5IM5IM5I M5IMIM3IM5IMI4MIMI4MIMIM4IMI4MIM3IJ$J4OKOK4OKOK4OK4OKO4KOKOK4OKOK4OKO 5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4KOKO$M5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4MI4MIMIM4IMI4MI4MIMI4MJ$N2OKO4KOKOK 4OKOK4OK4OKO4KOKOK4OK4OKO4KOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO 5KO$M5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4MIM4IMIM4IMI4MI4MIMIM 4IMIM4IMI4M5IM4IJ$J4KO5KO5K4OKO4KOKOK4OK4OK4OK4OKO4KOKOK4OKOK4OKOK4OK O5KO3KOKOK4OKO5KO3KOKO5KO5KO5KO2K$M5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5I MI4MIMI4MIMI4MIMIMI2MIMIMI2MIMIMI2MIMIMI2MIM5IM5IM2IJ$J4KOK2OKOKOK2OK OKOK4OK3O2KOKOK4OKOK4OKOK4OKOK4OK2O3KOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5K O5KO5KO$5IMIM3IM5IMI4MIMI4MIMIM3I2MI4MIMI4MIMI4MIMI4MIMIM2I3MI4MIMI4M IMI4MIMIM2I3M5IM5IM5IM5IM4IJ$N5KO5KO5KO5KO5KO5KO5KO5KO5KO5K3O2KOKOK4O KOK4OKOK4OKOK4OK4OK4OKOK4OKOK4OKOK4OKOK3O$2MIMI4MIMI4MIMI4MI4MIMI4MIM IM2I3M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMIN$NOKOK4OKOK2OKO KOK2OKOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K3O2KOKOK4O KO$5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMIM3I2MI4MIMI4MIMI4MI4MIMI 4MIMI4MIMI4MI4MJ$N5K2OKOKOK2OKOKOKOK4OKOK4OKOK4OKOK4OK4OKOK4OKOK4OK2O 3KOKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KOK$3M5IM5IM5IM5IM5IM5IM5IM5IM5IM5I MIM3IM5IMI4MIMIM3I2MI4MIMI4MIMI4MIMI4MIMI4MI4M3IJ$JKOKOK4OKOK4OKOK4OK OK4OK2O3KOKOK4OKOK4OKOK4OK2O3KOKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO2K $2IM5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIMIMI2MIMIMI2MI4MIMIM3I2MI4MIMI4MIM I4MIMI4MIMIM2I3M5IM5IM2IJ$J2KO5KO5KO5KO5K2OKOKOK2OKOKOK2OKOKOK2OKOKOK OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO5KO3KOKOK4OKO5KO3KOKO2K$MIM3IM5IMI4MIM I4MIMIM4IMI4MI4MI4MI4MI4MI4MI4MI4M5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$J4KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOK4OKO4KOK OK4OKOK2O$3IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5IM5IMIM3IM5IMI4MIMI4MIMIM 4IMI4M5IM5IM5IMIM3IM5IMIMN$JKO5KO5K4OKO4KOKOK4OKOK4OKO5KO3KOKOK4OKO5K O3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K$3IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM 3IM5IMI4MIMI4MIMIM4IMI4MI4MI4MI4MI4MI4MI4MI3MN$JKO4KOKO4KOKO4KOKO4KOK O4KOKO4KOKO4KOK4OKO4KOKOK4OKOK4OKO5KO3KOKO5KO5KO5K4OKO4KOKOK4OKOK3O$ 4IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5I M5IMIM3IM5IMIN$JO5KO5KO5KO5KO5KO5KO5KO5KO5K4OK4OK4OK4OKOK4OKOK4OKOK4O KOK4OKOK4OKOK4OKOK4OKO5KO$3MIMI4MIMI4MIMI4MIMIM4IMI4MIM4IMIM4IMIM4IMI M4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM2IJ$NKOK4OKO5KO3KOKO5KO5KO5KO5KO 5KO5K4OK4OK4OK4OK4OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO4K$4IM5IM5IM5IM5IM5IM 5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IMI4M5IM5IMJ$J4OK4OK 4OK4OKO4KOKO4KOKOK4OKOK4OKOK4OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO 5KO5KO$50.I4MIMI4MIMI4MIMI4MIMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IM5IM4IJ! golly-3.3-src/Patterns/Self-Rep/JvN/small-JvN-self-replicator.rle0000755000175000017500000004141313543255652021545 00000000000000#N small-JvN-self-replicator.rle #O Redstoneboi, 17 August 2018 #C smaller and faster JvN linear self-replicator, period 221693. #C http://www.conwaylife.com/forums/viewtopic.php?p=62707#p62707 #C Inspired in part by a small JvN self-replicator by Rohan Ridenour, #C http://www.conwaylife.com/forums/viewtopic.php?p=61421#p61421 x = 12314, y = 21, rule = JvN29 2.2IpAIpA3IL.pAIpA4IpAT$2.JLpAKpA2K.pA.J2.2IL.R$.pAJ.pAT.IpAQ.2pAK2pA IpAIpAI$IJ2ILQI2J2.L.I2J.J.pAJ$pAIpAIpAIpAIpA2.2IpAIpALJIJ$J3.2IJ6.2I JI2J$J7IpA9IJLK$2J6KpA10KLJ$2J5.R2.pAKpA.L3KJ2pA$2J.KpA2KpAKpAK.J2.L. pAIpAJ$JK2pAK3.IpAL.J3KJ.JpAK$.IJ3.pAIpAL5I.pA3IpA$.J2IL.JIJ3IL.2RL.Q R$.JpAIpAIpAJ4.L.RpAK.R$.IJ.2IJ5.L2.I2.pA$.JTpA$.JKpA$.IpA$.J$.pDK3OK 2OK3O5K5OKO3KOKOKOK5OK5O2K6OKOK4OK5OK2O2K2O2K2O2K2O2K2O2K2O2K2O2K2O2K 2O2K2O2K2O2K2O2K2O2K2O2K2O2K2O2K2O2KOK2OK3OK3OK3OK3OK3OK3OK3OK3OK3OK 3OK3OK3OK3OK3OK3OK3OK3OK3OK3OKO3KO3KO3KO3KO3KO3KO3KO3KO3KO3KO3KOK5OK 5OK5OK5OK5OK5OKO3KO3KO3KO3KO3KO3KO3KO5K5OK5OK5OK5OKO3KO3KO3KO3KO3KO5K 5OK5OK5OKO3KO3KO3KO7K5OK5OKO3KO3KO3KO3K5OK5OKO3KO7K5OKO3KOKO3K5OKOK3O K3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5O K5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O 2K3O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K 4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K 5OK2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3O K2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K 5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OK O3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK 5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O 2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K 5OKO2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO3KOK5OK2OK4O3KOKOK5OK3OKO3K5OKOK 3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5OK 5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O2K2O 3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK 2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2O K3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O 3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK 2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OK2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO 3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK O2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO3KOK5OK2OK4O3KOKOK5OK3OKO3K5OKOK3OK 3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5OK 5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O 2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O 5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O 2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KOK2O3K5OKO2KOKOK 5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK 2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2K3O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OKO2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO3KOK5OK2OK4O3KOKOK5OK3OKO3K5OKO K3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5O K5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5O K2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3O K2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KO KOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO 3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O 5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK 2OK3O5K5OKO3KO5K5OK2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKO K5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K 5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K 5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KOK2O3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3K O5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O 2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO3KOK5OK2OK4O3KOKOK5OK3OKO3K 5OKOK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK 5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK 2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK 2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O 5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO 2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5O KO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OK O2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK 3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K4O3K5OKO2KOKOK5OK3OK2OK3O5K 5OKO2KO5K5OKO3KOK5OK2OK4O3KOKOK5OK3OKO3K5OKOK3OK3OK3OK3OK3OK3OK3OK3OK 3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK 5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OK O3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOK OK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K 5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK 2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O 5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OK O3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO 5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5O K3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KO KOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OKO2KOKOK5O K3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO 3KOK5OK2OK4O3KOKOK5OK3OKO3K5OKOK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK 3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK 5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OK O3KO5K5OK2O2KOKO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K5OKO2K OKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K 5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK 2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K 5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO 3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5O K3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2K 4O3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K 5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOK OK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK 2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OK2O2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO3KO3K 5OKO2KOKOK5OK3OK2OK3O5K5OKO2KO5K5OKO3KOK5OK2OK4O3KO3K5OK4OKO3K5OKOK3O K3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK3OK2OK5OK5OK5O K5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK5OK3OKO3KO5K5OK2O 2KO3KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KOKO3K5OKO2KOKOK5OK3OK 2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO 2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK 3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO 3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O 5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K 5OKO2KOKOK5OK3OK2OK3O5K5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3OK2OK3O5K 5OKO3KO5K5OK2O2KO2KO3K5OKO2KOKOK5OK3O$.3MIMIM2IMI5M3IM3IM2I2MI5M5IM3I MI3MI5MI5MI2MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI 3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI3MI5MI5MI5MI2MI3MI3MIMI5M3IMI 4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM 2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI3MI5MI5MI 5MI5MI2MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI 3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M 5I3MI2MI3MI5MIMIM2IMI5M3I3M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I 4M2I2MI5M5IM3IMI3MI5MI5MI5MI5MI2MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5M IM3IMI5M5IM2IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IM I5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IM I5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M 3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIM IM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IM I5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I MIM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM 2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMI M2IMI5M3I4M2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5M I5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3M I3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI3MI5MIMIM2IMI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5M IMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IM I5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M 3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2M I3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI 5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM 3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I2M2I2M I5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MI MIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI 2MI3MI5MIMIM2IMI5M3I2M2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI 5MI5MI5MI5MI5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI 3MI3MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI3MI 5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I 2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM 2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3I MI5M5I3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I2M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIM IM2IMI5M3I2M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM3IM I5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I2MIM2I2MI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I2M2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5M I5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3M I3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI 5M5IM2IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM 2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI 3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5M IMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2M I3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M 5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMI M2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M 5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM 2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI 2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMI M2IMI5M3I4M2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5M I5MI5MI5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3M I3MI3MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI3M I5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIM IM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3I MI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M 5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2I2MI5M5IM 3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IM I5M3IMIM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5M IMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M 5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIM IM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM 3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I 2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI 5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI 3MI3MI3MI3MI3MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM 3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM 2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI 5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI 5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I 4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI 2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IM I5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I 3MI2MI3MI5MIMIM2IMI5M3IMIM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM 3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IM I5M3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3M I2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI 5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI 3MI3MI3MI3MI3MI3MI3MI3MI3MI3MIMI5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2I MI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IM I5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI 5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMI M2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI 5M3I2M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIM IM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI 3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI 2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM 2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2MI 3MI5MIMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3I4M2I2MI5M 5IM3IMI3MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5MI5M I5MI2MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MI3MIMI 5M3IMI4MI5M3IM3I4MI2MI5MIM3IMI5M5IM2IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3I M2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM3IM2I2MI5M5IM3IMI5M5I3MI2M I3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I 2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3M I5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI 5M5IM3IMI5M5I3MI2MI3MI5MIMIM2IMI5M3IM2IM2I2MI5M5IM3IMI5M5I3MI2MI3MI5M IMIM2IMI5M3I4M2I2MI5M5IM3IMI5M5I3MI2MJ!golly-3.3-src/Patterns/Self-Rep/JvN/Hutton-replicator.rle0000644000175000017500000002452313151213347020262 00000000000000# Hutton-replicator - a self-reproducing machine in a modified version # of von Neumann's cellular automaton. # Author: Tim Hutton # # Having modified the von Neumann CA transition rules, a new form of # self-replicator becomes possible, one that replicates much faster # and exhibits exponential growth in the initial stages. # # Motivation: In the original von Neumann transition rules, lines of # transmission states can extend themselves by writing out binary # signal trains, e.g. 10000 for extend with a right-directed ordinary # transmission state (OTS). But for construction, a dual-stranded # construction arm (c-arm) is needed, simply because the arm must be # retracted after each write. I noticed that there was room to add the # needed write-and-retract operation by modifying the transition rules # slightly. This allows the machine to be greatly reduced in size and # speed of replication. # # Another modification was made when it was noticed that the # construction could be made rotationally invariant simply by basing # the orientation of the written cell on the orientation of the one # writing it. Instead of "write an up arrow" we have "turn left". This # allows us to spawn offspring in different directions and to fill up # the space with more and more copies in a manner inspired by # Langton's Loops. # # A single OTS line can now act as a c-arm in any direction. Below are # the signal trains: # # 100000 : move forward (write an OTS arrow in the same direction) # 100010 : turn left # 10100 : turn right # 100001 : write a forward-directed OTS and retract # 100011 : write a left-directed OTS and retract # 10011 : write a reverse-directed OTS and retract # 10101 : write a right-directed OTS and retract # 101101 : write a forward-directed STS and retract # 110001 : write a left-directed STS and retract # 110101 : write a reverse-directed STS and retract # 111001 : write a right-directed STS and retract # 1111 : write a confluent state and retract # 101111 : retract # # Achieving these features without adding new states required making # some slight changes elsewhere, though hopefully these don't affect # the computation- or construction-universality of the CA. The most # important effects are listed here: # # 1) OTS's cannot destroy special transmission states (STS's). This # functionality was used in von Neumann's construction and read- # write arms but isn't needed for the logic organs, as far as I # know. The opposite operation is still enabled. # 2) STS lines can only construct one cell type: an OTS in the forward # direction. Some logic organs will need to be redesigned. # # Under this modified JvN rule, a self-replicator can be much smaller, # consisting only of a tape contained within a repeater-emitter loop. # One early example consisted of 5521 cells in total, and replicates # in 44,201 timesteps, compared with 8 billion timesteps for the # smallest known JvN-32 replicator. This became possible because the # construction process runs at the same speed as a moving signal, # allowing the tape to be simply stored in a repeater-emitter loop. # The machine simply creates a loop of the right size (by counting # tape circuits) before allowing the tape contents to fill up their # new home. # # The rotational invariance allows the machine to make multiple copies # oriented in different directions. The population growth starts off # as exponential but soons slows down as the long tapes obstruct the # new copies. # # Some context for these modifications to von Neumann's rule table: # Codd simplified vN's CA to a rotationally-invariant 8 states. # Langton modified this to make a self-replicating repeater-emitter, # his 'loops'. Other loops were made by Sayama, Perrier, Tempesti, # Byl, Chou-Reggia, and others. So there are other CA derived from # vN's that support faster replication than that achieveable here, and # some of them retain the computation- and construction-universality # that von Neumann was considering. Our modifications are mostly a # historical exploration of the possibility space around vN's CA, to # explore the questions of why he made the design decisions he did. # In particular, why didn't von Neumann design for a tape loop stored # within a repeater-emitter? It would have made his machine much # simpler from the beginning. Why didn't he consider write-and- # retraction instead of designing a complicated c-arm procedure? Of # course this is far from criticism of vN - his untimely death # interrupted his work in this area. # # Some details of the modifications are given below: # # The transition rules are as in Nobili32 (or JvN29), except the # following: # 1) The end of an OTS wire, when writing a new cell, adopts one of # two states: excited OTS and excited STS, standing for bits 1 and # 0 respectively. After writing the cell reverts to being an OTS. # 2) A sensitized cell that is about to revert to an arrow bases its # direction upon that of the excited arrow that is pointing to it. # 3) A TS 'c', with a sensitized state 's' on its output that will # become an OTS next (based on the state of 'c'), reverts to the # ground state if any of 'c's input is 1, else it quiesces. # 4) A TS 'c', with a sensitized state 's' on its output that will # become a confluent state next (based on the state of 'c'), # reverts to the first sensitized state S is any of 'c's input is # one, else it reverts to the ground state. # 5) A TS 'c', with an STS on its output, reverts to the ground state # if any of 'c's input is 1. # # The body of the machine looks fiddly but it only does these things: # 1) detect a unique mark on the tape as it goes round # 2) starts and stops a 6-period pulser # 3) codes for: extend, turn left, turn left, extend some more # 4) counts when 3 tape marks have gone past, and switches coder # 5) when finished writing an empty tape of the right length, # divert the tape to copy itself into the new holder # 6) after the tape is copied across, it separates itself from its # old tape to prevent infection spreading from multiple copies. # x = 3129, y = 4, rule = Hutton32 2.J$2.J$2KpAOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3KOKO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKO4KOK4OKO 4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKOK4OKOK4OK2OKOKOK3O2KOKOK4OKOK 4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KOKOKOKOK4OKOKOKOKOK4OKOK4OKOK4OKO3K2OKOK4OKO2K2OKO2K 2OKO3K2OKOKOKOKO4KOK4OK3O2KOKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4KOKOK4OK 4OKOK4OKOKOKOKO4KOKO3K2OKOK4OKO3K2OKO4KOKO4KOKO4KOKO2K2OKO3K2OKOK2OKO KOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO2K2OK4OKO4KOKOK2OKOK4OKO4KOKO3K2OK4OKO4KO KO4KOKOK4OKOK4OKOK4OKOK4OKO3K2OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK O2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOK4OKOKOKOKOK4OKOK4OKO3K2OKOK4OK4OKOK4OKOK4OKOK4OKO4KOK4OKO4KOK4OK O4KOKO4KOKO4KOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KOKOKOKOK4OKOKOKOKOKOKOKOK2OKOKOK2OKOK4OKOK4OKOKOKOK 2O3KOK2O3KOK2O3KOKO3K2OKOKOKOKOK4OKO3K2OKOK4OKOK4OKOK4OKO3K2OKOK4OKOK O2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOKOKOKOKOKOKOK4OK2O3KOKO3K2OKOK4OKOKOKOK2O3KOK4OK2O3KOKO3K2OKOKOKO KOK4OK4OKO4KOK4OKO4KOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK4OKO2K2OK4OKOKOKOK2O3KOK4OKOKOKOKO2K2O KO2K2OKO3K2OKO2K2OKO3K2OKOKOKOKOK4OKO3K2OKOK4OKOK4OKOK4OKO3K2OKOK4OKO KO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOK4OKOKOKOKOKOKOKOK4OKO3K2OKO2K2OKO2K2OKO2K2OKO2K2OKO3K2OKOKOKOKO 4KOKOK4OK4OKO4KOKO4KOKOKOKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOKOKOKO4KOKO4KOKOKOKOKOK4OKO3K2OKO K4OKOK4OKOK4OKOK4OKOKOKOKO3K2OKOK2OKOKOK4OKO3K2OKOK4OKO3K2OKO4KOKO3K 2OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KOKOKOKO2K2OKO2K2OKOKOKOKO2K2OKO2K2OK4OKO2K$2.94I5M2IMIMIM4IMIM4IMIM 4IMI2M3IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM2IMIMI4MIMI M3I2MI4MI2M2IMI4MI2M2IMI2M2IMI2M2IMI2M2IMI2M2IM5IM5IM5IM5IM5IM5IM5IM 5IM2IMIMI4MIMIMI2MIMIMI2MIMI2M3IMI2M2IMI4MIMI4MIMI4MIMI4MIMIMIMIM5IM 5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI2M3IMI4MI2M2IMI2M2IMI2M2IMI2M2IM I2M2IMI4MI2M2IMI2M2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMIM3I2MI 4MI2M3IMI4MIMI4MIMI4MIMI4MIMI4MIMIMIMIMI4MIMIMIMIMI4MIMIM4IMIM4IMIM4I MIM4IMIM4IMIM4IMIM4IMIM4IMIM4IMIM4IMIM4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMIMI2MIMIMI2MIMI2M3IM I4MIM4IMIM4IMIM4IMIM4IMI4MIM4IMI4MIM4IMIMIMIMI4MIMI4MIMI4MIMI4MIMI4MI MI4MIMIMIMIMI4MIMI4MIMI4MIMI4MI2M2IMI2M2IMI2M2IMI2M2IMI2M2IMI2M2IMI2M 2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMI2M2IMI2M2IMI2M2IMI4MIMI4MIMI 4MIMI4MIMIMIMIMI4MIMIMIMIMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IMIM4IMI4MIMIMI MI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMI4MIMI4MIMIM4IMIM4IMI2M3IMI4MIM I4MIMIMIMIMI2M2IMIMIMIMI2M3IMI2M2IMI4MI2M2IMI2M2IMI4MI4MIMI2M3IMIMIMI MI4MIMI4MIMI4MIMI4MIM4IMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIM4IMI4MIMIMIMI2M3IM I2M2IMIM3I2MI4MI4MIMIMIMIMIMIMIMI2M3IMI4MIMI4MIMI4MIMI4MIMIMIMIMI4MIM IM4IMIMIMIMI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMIM4IMI4MIM4IMI4MI4MI MIM3I2MIMIMIMI4MIMIMIMIMIMIMIMI2M3IMIM4IMIM4IMIM4IMIM4IMIMIMIMI4MIMI 4MIMIMIMIMI4MIMI4MIMI4MIMI2M2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMIMIMI4MIMI4MIMI2M3IMI4M IMIM3I2MI4MI4MIMIMIMIMIMIMIMI2M3IMIMIMIMI2M2IMI2M2IMI2M2IMI2M2IMI4MIM I4MIMIMIMIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 2IMIMI4MIMI2M3IMIM4IMI4MI4MIMI2M3IMI4MIMIM3I2MIMIMIMIM4IMIMIMIMIMIMIM IM4IMIM4IMI2M3IMI4MIMI4MIMIMIMIMI4MIMI4MIMIMIMIM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMIMIMIM4IMIM4IMI4MI 4MIMIM3I2MIMIMIMI4MI2M2IMI4MI2M2IMIMN! golly-3.3-src/Patterns/Self-Rep/JvN/JvN-loop-replicator.rle.gz0000644000175000017500000002503413151213347021062 00000000000000‹¨7óJJvN-loop-replicator.rleí]Ksã8’¾ãWhg13Õ ‹”lù°‡š>슢Û]UŽØÛF¨\ªjÇøµ¶ÜÓýï7|ˆ$^ ’()ÃU† ‰‰D"‘xýõçÑÇ»õý﫟ÖË—Õèáþiµ|½®^îï–ëçWñןáßèö·û·ü[Ž—w¿A¢Ñ÷ç×ÑïÏO£_Vï˧§¿½ž_ïÜ?-FñÕOoëåz5z}X½­ÖR˜¯+ª«·ÑÝóÓÛý·ÕëòëߣïË·õ‡ÑýÓhùòòúüÇý#$èøò|ôxÿðpÿü„~¬ž ýþzû0Z>}=ßݽ¿Ü¯ÔÛËòn5zþ}õŠó<£»ÕÃÃÛèßPLTÕb5ú¶z»ÿñ„uy»‡”Ë×£¯ïëÑÓóz)ŸÖða´~þ0úï÷õúùé§ +¢‚ÄŸ£¯ÏëßFoµÔoë×÷; k….GÏO?>ŒÖÀ$øøü2zþœùŒyý ¬_—Oo÷ooQ²é­ï«LüyZCmæûÛê‚:®îî¿ÿ‰%,_¬FOï_!ÅßãÿÏÿ8Âxü°Äæþ½=.FËG$…($“"lˆo÷w²`@ M¾zúÕyþ.Ña¢þû30æk¸6¿Êù0úmùðI5òU™þ!9ôëûÃ6 d}Y¾!øï¯ÏȨËÓýë²Ìk³|¸ÇïŸ_,ŸP 0ûêõê ØõC’E¡Œê2‚óýþÇ{.€šñù›¸µz[c>¡—Õë$#}||Î)="…û¼Æß—w€â·%¶úÓOwϲ´FCJðÏÐF_ I€çß0 ’&¾¾­Fo«ÿ{_=ÝA=¡þ_ï×o£¯«õ¿W«'Y*Ñèöþ±#DŠÙ_WË×aƒbñë¼Fïß ;6ô÷÷Ù±V¿??¼#” ¥PÌØùüoIäiõRô0z|_çý¡Á¡À"Å·ЦvP¹Çö Pô©œó²™þ;Ïòqô9ýóýî_«?¡gÿåË ˆó©Ñλ Жb÷¾~þéÚV¶è™öûòõ~™ËÝ=¿‚†ø"[>ü´¾‡æº{Eæ×eÓ—ðÿùçèã7(û×ò¼ßý¶‚RnîÖÏ(æñùù•øcôŸ£ñùdv9M>ŒþÄ?¦ãRËÀçô÷_â+quÅ/üuvu½|ŒáäùI&“ßÉ”WµTBÍ·!š`Ú$Ïb.#q‰á,šnbgWÑ<ßi”ÿuÁy4!n¥þœM_2Ïÿ‹òCùþe/SùaEŒgs™%M¢ôRþCìðee‘$˜ŠñUiâ<Þþï"‚_‹ò¶2__Fs +𠦻œgEЍ‰R‹8Î"q\„Ï—Ñ&k~Ï ìtžâϿʰJõ -vÈà£l‚¸_„ÚTkÿ v ce r sù I±bÙ®qÄñÿ¦ZX§)^5Iùian(©Oóå_i[‰Øz_â²ó0ñ÷…Œ®FYþ“”L²‘Kqd©Ì_Ìé‰xó¹ú„„æŸñ,jñk¼aݸúXòp2_X¸€½yzž˜Ä=[¤9§"¤° `N.ƒå¨ó ™gXRšŒáÓ"gyœÅ LuÅ0‰çy"Kž¢ÐdyíðÓ™Ÿ—Ÿl‰@^YQQ"-KG~å8°æ9Ë6"œK(“HÏ1ÕÉRžÌ(òVp7ŠÓE”Ë ° ËÍ¥Z÷RÊ[/æáhåÎ@^ÅÉôjž\ϯ§çók0DŸfçÄŠòC§Pt% CÁH # D’÷ëºxp(º¡èJàH‘4ô¯ü còŸzŒ) $’1‰9®¤Pt%ÀHœHâëÀ.-º‹ë‘öÀÞ‘L±™âVvňl§#÷GŒÄ¯KX„:¸Êá•͉%'’8JÖ§ ±Kœè.²§Ó ÷‡$xHïßUGM?0ÅÔ…6˜ˆÍ£P£ m"_BF#߃ÝȧÂ4Â¥µ„’f A+ËÉX ©c”YJ ‰±2FH#³1z™õ1OL=f˜<ü0’^‘ØÊÝ™£m½hDâJHFJH75õ'ÔBBnZi„®\³]­7—E¨EíDÒ™µ½‹»ïÉîg!=;ÃJØdAM8Yh¥ Ÿ,hlÚN„úŸ,ø†ä9ažÌ©…î«ÝM¶'üÂRVÈþ ÖNŒdHºyª‚»OÛª;Çs0/u#FP=ÖÖoDEÝN!ìIì ÝöBôæ”ôÈÖŒQ<´¥€V(L$V0’C@²§-e§§-»z¢èìC¯*´g¼N¥"ùŒIîøî„ÌÚÚcAX’¸Ázuv·º`‘dU*¤£í=  Ö’Œd‹H† ÎÖµÕíL7H5cXoH|‘õ$|×iå›gºñ¥©òÍI¨DvÆ\«&cá|ŒdGHöµtêíïh¢oÍn¢¯n8vÌ„vÍDE&ô^{“g¨'¿ŒVݪ !•ÛÆ˜@BVPtW,3ÞzÃHˆÃÁŽ×³¬Ø0òÁHÂ=ùšxtŪ’¦Ÿ³ÖÑ>Poˆ©þÕøÆj–‘lɾŽþ˜ô0û¯»òµjI»šÂÑv5¹\óBã…!IHƒ0}ñÆ‚§>3ôÇÓˬCÅBCͼÐ#ë•Þ|£WEá‰}µp͸¸MËÞì‚ §7v0’CD¢ñw³™œ²â8JK[ÀÆ{'²+P·\âs–¡jowh»@ú:‡NÝ'n9¡“önŸ>Ý£3¥Ó9@K yJ‹i\÷kúCv`EÕ2FrHxu.€Ð°WçÂYÎÛhßD¸=™#Ò1Ë-}ò¯)ȽÄç°vŠöiQwWÌZosšüΤֹöÜ2cEìBBùÆ©š‚ˆ„`Ýý3vè3’ÓE‡»Zá1îê¼ ­QµN<ÚB—‘°yšRômD®„0 Y„2ÆðFYk4$Ø@`$ŒÄ ‰-o6³Ì~HËã”Ò¥¾„:)}’O…JÈéS!)ýN¶ë¬ t…Ô´·Í§âÚDP‘±O·©xœ7Þð8.©¥m©°¯g¹ñU¬uõU§a糿єÆâ˜¡rìo$rØ„p{rÙÞa$Œäxìš¶60¥Ûß.žÐ†öXêsË‚$Ü\iï‹'–¬ó¹"Ã$5qu‰nñèŠT,Œ€Ý¸%Zc\‡âKMšîý§ÁÚ“| #éBhWoÄmyÊ?8­t}¬·ÓúJ¹™uû3,ilǘ¼*¤–íâÆ´¦;cÚ•$ ÉJ×_ÞhÛ!¢oG’ai²À:{Ò»f,D|2)ßho16d2§4añSûì×a$§Ž$xËŸ_Çé9ès£‹ºQÝ1 û®*ßleˆ­¢ 9«‡‰º–²A’`^ÜC~1^KaÆÞ¡¢È柹usÖÁ«}FÂHvŠ$ÌÎ9^ÉÛ\h„p›K#‡y–êsŸk¨ëŒ8{sc31­áä»@æiNÖÖ„é m¼)¡Bô-в™é[kÌi¡Îîø7íã4ïOwb$Œ$ ÍtÙÝíè‘” eiŒÄ®{šVZGÕ°}Îg¿Uëí½ùåØkáEûH°ç \áÆÛi-Xvß³«B¾ ꬛)Œ„‘ô‡dKfÊ6µAÀ8¡¦ækÁÁ„öº·±™V´w´÷ö‹´½Æ¯ìØ®Û¦Š‚À{Äl/9“}&ÔD®ÊipbåÓàOño--[&mØÛÅõ¡ÊNÕ>#a$‡Äo ÈëèÞi=§á£Vëñ–õʘEÜHá:ÆS3Ì]<i¿ëøL£«Šä*ÿîv±™¡}(™”4.#åp¬ o$fùáw¥ # c»f îÊ${~J¥3˨A8‚a™7Wßß±ÂaNäA²qÁb¨„;e4ŒÝü #ì%Ó<-»<lç»Ìús™µÒ8¯Ï§xØÂ`$ŒÄÇ4©u´ž.qOV-qMY¦'âgæti|wÁö¶8®Š…þ¯zݼm“XÏ “Í8¡Fµ³9¶|FT‚A·¾§B$´ éîGËmc?wY=¦ó"GU!s9îoz!b9orvñïDDk ob$Œd˜HÈ‹.=ç õè(º A…„šÐšnKkÉõ2)¦AÛ¡f¬zÓhïPFu5†j£ÐŒ´æ³Å>Ü:ª“«|(øY«ïQŠ!7[ÊûPGFÂH‰Ón ~è‡ñŽ4û>PBndªþ'mktˆ¶ *ÔáĹÕ&làž •åH#(«”N2ÂÍ '³}ÙìÖ2ˆa£ë˜YÛÃ-›±NtMg¼^ÉH ÙÑbctx À+Üë†ÏFUm’ø¶¯ýaâY&ý;AK´u´EgÝ´VÆÜdTkÇe4©¸wÓ8×ëôCrÀéþÞ- {C[âõ{ç|;¥mÓ=ÞvóÉø¿.–ö܉\Ul0FâƒÄÛL ù™\šë̃zUßAÐÙäW©{¼ø¾U¡.ÙǬfAè¡|ëšßÈpx‚²ŽdŸË¡èŒ£ÞÄæÆVß7¥ŒU´_å·o]=œQƒ‘0 ’[eGÞÒsy„z½I¶¡­,*„Úám=u‚Z‹Ã}.Ùþ’Qk1ÌÔ’‚âM!r…üŒ¶>Pê.µŽzÛû8am/Èb ú„7 %#éù&£® ²pfb$Œd«H‚—Y(*¥Ã3Ò®¬Ü¼Â½'íÆŸ.cFÐýPÁlÑ-@ù® ̬稜VÏöE¿³:`÷#a$ÁH¶ç~q‰îÔÇ>_çÛuµc½’¶ËÓ}- CWÝ\ <¯z ¿IÈã‚sA¤×¨M¼©ÈùQ£xK޽ÒÊ^_}y[[âûr š´ËmeñÖUFÂHèaÓ:ëoFu8˜ÂÏÛ!iÚo~åÎ=,«®wyF5lßz2ŒFÈ÷rÂL~éwì|Lw m²£Ñ÷v‰‹ÃUÕ;¯]ÜÂÒ*ZCS´Œ„‘ ‰ÝQÓß ŽPB‘4Âí»Šª¿5ö¹Þ8²uºçW? $zû qώצ óîJ‡9ÐÀä8TIð`\óyUÂAPBGÃZöb0Fq×^ âÜ”¤›øšÞ@B!j¿·uµ†XX|*É1q=Üå"y¢+‘š½ö“«¸Bªˆ#™ˆÕ*Ó½=a·ûöqŽ—Œ$´ ÊTŒnÐW=)ÇŽm%Ì%ÊÄHÉ0„í†õ^æ0*ß’Û„ú? _\ÜP|¡ÛK´ÚZqº8ìfJë‚‹½]H›n<†iÝ@è&Û®¸ëmWF¯û™Â²ÛYëGHÝvíÏ—NïlUyÜ7 öŠlcóO˜ªe #9U$aVE-4ƒÛÚ4jLÃ×ÚjÒìb«³•à&Æþ.OÐÒ‚nõÊ5‚µü)ú$”NayëÁ’%¥iÚ°’vãºN‘XK”ªÄÚàê!é`ÕD²FÍ–OðÝßšžìÆaK¡9øÁ‡‘0’"éfíxŸ(Ö†‡½W¦]UOÈ÷…8^Mro½1ÍÔ5 Öa2˜œ ÎåŸPǃÑ`ñ»¦ÔTyOOоò¤G Žhw ‰Ý=½=køƒU´Œ„‘ì‰÷Ïw®jªêµ¹ß¨?íGˆc¾ÏÔÉá:×b ïFíê:×m£ @s­ÙT´8ßÓe#$‡™3怌JÌÑl]íµ¥I{ô#a$}"© šžç&‹†2'ä§BÚštûƒ/¡½Þä¢ñ§„ùv™ «HIØ©U¢ÝEsï{žÇrx»<‰4• ÈŒÄN¦óìlz¥ã«HŒgó8½¼Z¼|ÌÒìåãl1¹Ï7ñâ&YÄð?Á¿éâ%7“üCŒ1Sü*¾ãKLÜÌÎÃCÑ•†¢+A!*Èùsärþ0; F„ekƈðò71¢[EòÑ#(´ÌÚ¡³#‡Ð‡£úC’´ÙíŠÐŒõPh¾‚ÐÀæˆaÙZ1"¸üzŒ°&¢2]¸8CøÝ;„r|²ßÿ¸LnqàZ“>‘›üÇ"õ¤Îìê:ï» ¨7hÑÖTJï7¢¦,FU42WÜc[nD£#ôòã#²µbDpùõÑ¥"ínL}Î<*›ZE·{«d‹‡­Ó¦)ÿö75Ì!#±öða÷Ÿá#1÷pÑ–M÷h¦I!ú Ò•0"ˆ¥;ÀBZ½x«ˆÜ{“Åú4WéNZ­¹²Ó·Ù." çGÿÙúØ<Ä‘° ¡íj¨ô*…ŒÙ¤m'µôn3OTãZW•øFQ(¦În‡«ÓJšUÆÔCÑÌè¶:¡~Ž„&/­AIäL#ˆ¥YÓ˜g•„ì^&*!—-ªÑêh(ÌÚÆiYlè #pŸ¡OâVT‚[㺓Y%«‚èˆÃAâÒüÚ^0t·ÝÇ”§”¤¦P㼦(Z}L[­ð£7ß< ™M2›ìß’öTÑOðl¥ÒÛE$ÞÒ¸3CŸf[;3(Còu:¦‡ÎL ǽ7¢Úµ¶^ø™í:ŒdƒÄÐjæ8`ÓB›¦cÿ묓H+ž8Ó*û€i±'þ¨Vɪ• !ù¬]>ž}¯í Xì‰VѶcì`X_´¬™g(v•#LÙ½bDX6«¦ %äÖ ~ªŸºQ@7þ <^ZêÔuÂá TÝgrýÔŠ5‘3 –fOÓƒæ>2C ·3)ÔØ+š ´¾ñÒØÎ»?:UŠ2’À%5ŠG³îã³°¡Õ¦SÆTϪÙâKp›çü=Cÿ+½t˜LgÅ èÝîï>õ,/ÒŸ §+ж'1Ð@·L_(Š)™¶BÞ„èW”YùÝù©RTS˜á¶]5Ir85ª–¯°‡-¨õVŸ¯Ì&§BL4_S¬³¨µ/U1?)ì×:P˜á±…èd7UYwØ$…¬Ý:ÏLY»(_í–û˜zè‚ýÍoaË(‘PÛ ¥ë’zOV·…P§“ªSÓ½ïí°‰ÙªžøéZÇdòÄ{ÀZ…‘lc 6Ô ”Rë7=WcŽ}‹‰šHÓ1U…mš_kÊ4ÇXW~È1Cº«ÆÌN{ß·í¨%kZÞ«rŒH4ÓBosXê¥Ö÷7ÿÝèºt½,ºèNÓ-Ê*¥åšY—{PD|ô\'7Q:'ÿ$=wØ}™‘0FÂwEÓØãó”³–YˬÝkÍ–1qÚ²¸÷š@hǯŸZuÜ ¡ó"ì…¥4ùÑ]FX~òʧ)d$Œ„‘"’ú0@¾†Õs„€ïÔº`Ö2k™µÇÀÚF„ñÉ.á^.0ÑÏ% ¯xy.V¯•8("¦¬.NmOR!‡d$”÷w #a$=!qêG‡?Òô€_ /ÙhcØùͬeÖ2k™µûb­~¦ÔŠÙ|³ß5ŽfŒiß´WLÇ売BÁ3'ã(4Ì]ã§#2â #a$»ER ¨Ĕ‘âÔGS6T˜µÌZf-³öYkž9 yígGDñf#Ã'ôšA-L¥ýÛ^Œ„‘0’CAâT~šÓ¯æ±â&¸1ҴǦÂT˜ Sa*Tüüüæè}b†sIØÃVØù/’¬u£•~Ê#a$ŒÄ U_*o;wjj7¼ðäI¬<ì¢WµTb¤›Î\Ä„¡ž^Ä„ƒi4bš[ň™·ü{s_“N FãÆBL9KËRËRËRÛ“Ôº]âúõ‰œiÔCéι ©¾+¢IouÜ÷~Wzø§1W #a$ÛE¢Þ¿HPô>ƒ2e"úvh¤ÝwïRH‹Àò1¦ƒ¹^¤wr­1‰tØ‹Hí˜à'ž4¬íÀk¥6„#D©%•ZeÆÐ‰#þ !PjI¤{{Ç«#GüB Ô’I÷q1é(„›4Q!J­é®Ã˜"µá·´¸Þ$'ň°lÆú/4BŸ#öÆ0ä u’td#a$ŒdËH”)ú„-Iž¢uïïÆ­W¯êL?÷b*L…©0¦bж4‹u_ϵ·B~¯ƒ‘0FrHHÜï&…û=£F´NáëPIë¡áÕkwÆZ>ën[ÆF>ãë~>U´-*“«Ø3‚x#:2µ>™ gêâ†6Ž:‘šÆQ¯*Š®L•ùÚ"‡ñFtcjc®Û‘7й´5sºs¿+o'g$Œ„‘Ò7ø©½ gÓÞú3ö*™}߀À—K0k™µÌZf­1‘úìµÑS{²¯RìvKFp:2¾¿Ð?çtçx,/FÂHÉÎ7‡XqÇñ«Õ;kǽ+|FrHœ¦Û ò$IÐFØ $Š t€j–‘0F2t$-ÏÓ;b³–Yˬ=LÖºL^üÔ¼n*ôxØ)O’ùUZFÂHÉ!qmíS7Ðj’"”e× ªŽ=šÄÑûöd&ÂD˜é‹ÈÍ¢cØÍá¸ËÅeÈá)ù¦·Ž3?$í+>Ý}¸¯;_ã½[L„ekÅŸl§´VÙé 1/$V•p¤ýç‘«Ýsþ¡Ð—ApCª7±tìC61xÃ#ñBâ׫C.iS»,éÎ9Ee4c´C]% ¿'û†|A#ñCâ? ë–*]C»v=¯Ù †¸[-±2`epp]p8HºMø§:IÑ áÓ¼HA³ ØDweps<“s õŽ„¤ Ž´’ö…2½§ÞçéYlóUæªÕ`Æ),%Q‰|†W³ƒãÑÔ‰¦æÒ v†0$ý9C與j ܪI%|xï Øbj¬»Í¨æè'¹dcïp 1ë<㕜o­:ç i³6§Ôöfd°ýÖ“ý>õvª&’=׋ÿ-qè4Â!±Ûsz¯1e%ª–fKN¢ Ëê}¶ñNÿ®çsGþŠÖp²¶óF²VqD‡×ƒN‰sHœwXõ†]’‚;a½PÿwÃ5ivò¶(PO`úewÍÚ½Ôb»é·³V4/;Ò¾|¸H’–¥°9¿%â=»U(Ýg·n• DºSÛÞ„Çc定f–ë±äRoÞÖX‡¡°¦Y© IàÐNོƒè&¢:P7‘±jÂO¥èÍeëT³…­ {7¼‚ °S×[C"û`¸„ÒÊäQÒoh'i¦.Fõx×Ú ÃmÂæ,—ø|˜’l{[£¼gcÃéAÃA"çÛ>oè›h¨;úÚÐ)cªŒz#©÷ „Xt e02׿ôkF ’ª \ù§MQ ƒ>m#ê>E½‘HB-üº…­o?½Òߨá=V Wc‡»½Z2ÛiÆaŸ†O] ©n•B´§²\ÂË×¾m‰fíSQ/4íDß;mK#ˆ¥ÙÓ hõF#ûË»D3Ð*Ѓ·í#!ì­µƒðlmH^°·¦£œTÞÞÈÞ%Ôô𛾠ɞÖ:ˆ!šCÄAˆîQõÝ yY¹$„ËŒCWã!o/ñ ]*;4ãyë4—:U±Ý¦Ê¾àÜ¿;!Ã%~„†²Éª?}ÐÙ“ÁE7ÇÕæVïcêïNÉÝDdžãûîHö¬gCÝ!»Ý¼æEˆ'tZM±…Û?ØÏºC$´£4[ÛSáu‰Û{( RµýãÄÄvgHvx³¸³Ý)—æ?ªé\_«.¼Â}˜H¼&V[Ý뵤C¹·°·™˜÷=öÝyÂŽô"qßTV[$ß³cóXÖ¢h³Â-î{&„A„ŒGì{3wÈÚá;sïHôÓ»]„åe:GV»›’yg>m±e$¸]:ÊuÂî$„ü<´&æðCGŒ(î¯êìmT_í "³ùF½¨e*{i×͸Âý? Fב”ªvBR)áÃ׌dH‚,ýöe þDt§ý=mëBõx{juMZÒkÚ`ÞºæCƾ¥Â2EpØ‘ç2uÕ¬†·¶á’쓾F`${@bÖ oœYR˜¼’nû­¦«\æ˜æf}§M­#ëôêSÈžºÕÅìtQÙcdãC¹º4¼;7UËHèáÞÖ`5½D]²tY²$"äÞW?BÞ©Ñ ?Db’ºÆê˽ÆfCÀnÛ'ãùð#(’N¾QîÝDZ¡Æ,v9LTýçŒÙòë ÎJÔ8è|ÔÅ¢6:^ØégKZ=DäÅÂ>ö ’”Ý1Ä´½·#¡-<Ѥ¢vC¯!¯%¯å@Ä1$ÁQOSüå‡a(ôëÔf}í±gž¸ëÓV±ÅÍîÎU¹«¶õÉ9ìÿ½ÝÞ=/‡§ ÉXµ§^¥xN DÈÚ[jÓ€ÛðLÒR’o7öU®½8SÜZ‰4üÜP¬|2!¾3T—ÆbåÓCÇê8i8QåÆHÜá¾¶GºâiO¨Ø­Èºš &§ïžv6ñÁG¸½ͽ7Iv½EȈÄ[^¶tñU2YœMÏ£t|¥Ÿn“ˆò_ÐFi–f9ñË(ž§Ÿ?EY´ù%Z‡ýÍ¿«"§ÑŠŒç/ç1üw‚Ækš—€ŸGð7pûåãE¿ °é<+Ä}F{þ~Yb`Ó,º0 È韉F*›¸öeW³EÅØ8‰f/'cü}VæOxŒéRQ¤KΣIRKÒ&g@éöËe2/)O®¢2ƒ¨¡ “yþÿ²1y”]Æ %g½(Q++Jùïeá6ͳX“³Vä¼ü'ªOX²Ì'Qäøb‘¡´/Q 90-¦ã Ì5)þlä‹nf <“üYà §#dç˜ÈVšÉO•d’“LJLåOqT.ø:*Š>˪!åª2Efù))Â< -èÃB¶BR|1‰Œ‰6yâ Œ8¯ òÅÔFPEÈ·'E½b…’¬ß¤@rYF`¿ 8I;sY/ì) ýWóÚ OáW ŠL‘GB—o”À’i3®äZÑ¢Œ©1Ë@Õç×ók*fûÐvó3òØT™Àq¡hϤNª [Ä$µ—dcb™"NsÞþrý’IiNQš¾À%DøÉ¢ä1µ£&…¬É ¸Ñ¯/ÿDú@ì-p²Õ¦Ð¨‰Ô—E#%…àÈ%!Ó—Ÿc,ûågèG_€L\cpˆº4HÖΜlݸâˆHÓÏ7(ß‹›IÑM¥¥›¥œÍ"M#  üÆ×8úeþòÏk`Ö/QüI Ѧ)ê]1.»“JYL*º1¶\š}Æ¿ 7ÐfÈn´gUu+Úef‘D—øW*{56äâZ¥ aÍcÍJ ’€˜BMd~Ð…×´C†æj1¾‚æ`L,9‰0<úU’@"Q¶ÀÏ‹ò'mÒÚúL’ú¥¤²HYA$]@ÕãX ÕíÙ$çÒâFö§2„_À†…Ì?B O˜d euòéó”Vˆ­#*P ãè3Ö òó òòå }Ž£ñ%j«³I‚¬‚ñ—èö³ì;I”µFË ÆØãb°¤Ò â©a²ŠŽÔ'hB…¤F.>A¶¢Õ$ÉX ´Æ A.‘Â9ŽéÑd<—Ÿ,IÑäùÇ2æ,>Ǿ’Fgñ¸Ï4Ÿ«ÆMjÔ¾±¦÷4ókUi¢ÞJ¤suHËßÿ!þ¾nûÆgolly-3.3-src/Patterns/Self-Rep/JvN/N-compressed-replicator.rle0000644000175000017500000010061013151213347021330 00000000000000# A self-reproducing machine. # Author: Renato Nobili # # To see the machine, zoom in on the left-hand end of the line. # # A universal constructor is given a tape of instructions that # specify the construction of an identical machine. After copying # the tape, the machine then obeys its instructions, creating and # then activating an exact copy of itself. # # Replication takes around 9.59e+09 generations. With larger step # sizes (8^8 or higher) it should only take a few minutes on a # modern machine. # # This machine uses run-length encoding to compress the tape. # Blocks of repeated codons are replaced with a codon and a value # specifying the number of repeats. A special organ in the body # of the machine decompresses the tape before use. # # Length of tape: 56,325 cells # Replication time: 9.59 x 10^9 (9.59 billion timesteps) # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # Originally distributed as SR_CCN_AP.EVN # Redistributed with permission. # # About the tape: # The machine was originally not supplied with a complete tape because # before 2008 it was not possible to run these machines sufficiently # fast. Following the instructions here: # http://www.pd.infn.it/~rnobili/au_cell/ # under the section "Cell + cell-number coding modes", a Golly python # script was written to produce a suitable tape. The script makes the # minor optimisation that trailing empty cells on each row are skipped. # Similar other optimisations are possible. # Tape written by Tim Hutton # x = 56422, y = 100, rule = Nobili32 5.21IpAI4.pAL44.2IL.IpA2IpALIpAL$5IpA17IL2IpA.4R2L44.J.pAIpA.L2KIJ.pA IpA$J4.J16I2LJLK.pA2RpAKL39.5IpA5IpA8IL$J.3IpAJL14KpAIpA2ILJ3K.pA2IpA 2IL33.JpAIpA.2JpAIpA.2IpAIpA4.L$J.J2.J.pA4.2IL12.L5.L2.L2.L27.7IJ.2IpA IJ12.L$J.J2.J.L4.JKL12.L5.pAL.pA2.L27.J25.L$J.pA2IpAIpA5IpA13IL9K2.L 11.2IL13.J6.pA2IL15.L$J.2JR2.L.4RL13.L.pAJ.pA.J2K2.L.2IpAIpAIpAIpAIpA .L13.J6.J.LpALIpAL11.L$pAIpAJR2.2LpA2RpAK.pA2KpA2KpA2KpA2KpA.J2.J.pAL J2.L.J3.J.J.J.L.L13.J.5IpA.2LpAJ.IpAIpA8.L$J.J.pA2.2LJ3K2.T2.T2.T2.T 2.T.pA2IpA.JIJ2.L.J2.pAJ.JKJ.pAQ11IL2.J.J4.L.17IL$J.JIJ.LpAK5IpA.IpA. IpA.IpA.IpA.KJ4.J4.L.J2KJK.I2J.J12.L2.J.J4.2IpAIpA14.L$J.2J2.LILJ2K.J .LJ.LJ.LJ.LJ.L.J4.J4.L.2IpAIpAIpAIpA.J2K10.L2.J.J14.3IL5.L$J.2J2.pAL 3IpA.JpAKJpAKJpAKJpAKJpAK.pAIL2.J4.L.J7.IpA2IJ10.L2.J.J4.10IpA2.pAL4. L$J.2J2.L3IL2.L13K2.J.L.IJ4.L.J22.L2.J.J4.J9KIpAI2pAIpAIpAL$J.2J2.pAL 2.L2.pA15IpAIpAIpAIK3IpAIpA13IL8.L2.J.J.12IpA9IL$J.2J2.L4K2.L15.J.L.J .R3.L.L.L12K8.L2.J.J.JpAIpA.JpAIpALJKJ9.L$J.2J2.L4.LKpAIpAIpAIpA5IL3. J.L.J.pA3.L.L.13IL5KpAKpA2.J.J2.J.3IJ2.2IpAJ9.L$J.2J2.L4.L2.LK.L.L.L 4K3.J.L.J.J3.L.L.L13K5.T.L2.J.J2.J20.L$J.2J2.L4.L2.pAL.pA.L.pAQ3IL2.J .L.J.J3.L.L.20I2L2IpAIpA2IpA5IpA2IpAIL9.L$J.2J2.L4.L3.L.L.L.J.JK.L2.J .L.J.J3.L.L.15ILIL2.2LJQJ.J2.J5.L2.2LpAIpA2L5.L$J.2J2.L4.pA3IpAIpAIpA IpA2IJ.pA2IpAIpAIpAIpAIL.L.L.J12.LKpAJL2.2LJ.J.J2.J5.L.LK4IpA6IL$J.2J 2.L16.L3KLKJKILJ.J.L.L.L.J12K5IpAQLIpAIpAIpA2IpA2IL2.L.2IpAIpA.LJpAIpA 2.L$J.2JLKpA17K.LKLJKJKLJ.J.L.L.L13.JpAKpAIpA2.L.J.J.J2.J2.L2.L7.pAIJ 4.L$J.2JL.2LK2LKLKL11KJKIJ.JLJ.J.L.L.L.2IpAIpAIpAIpA2IL3.J4.L.J.J.J2. J2.L2.L14.pA$J.2JL.2LJ2KJKJK3IL2IL3ILILJ2KJLJ.J.L.L.L.J3.J.J.L.LK3.pA IL2.2IpAIpAIpA2IpA2IpA2IpA13IpAQ$J.2JL.IpA7IpAL.IJ.IJ2.IJL2I2JLJ.J.L. L.L.J2.pAJ.J.pAQ3IpAIJ.L2.J.J.J.J2.J2.L2.L.6ILILILJ.J$J.2JL2.L7.JIpA 2IpA2IpA2I2LJ2KJLJ.J.L.L.L.J2KJK.J.J4.2IpAIpA2IpAIJ.J.J2.J2.L2.L.JKpA IpAJLJLJLJ.J$J.2JL8IpAIJ.L2.L2.L2.2L2I2JLJ.pAIpAIpAIpAQT.pAIpAIpA.J3K 3.J.LJ.J3.J.J2.J2.L2.L3.J.IJIJIJIJ.J$J.2JLJKILI2L2KL2KpA2KpA2KpA2KLIpA I.JLJ.J.L.L.L.T.J.7IJ3.J.LJ.JL2KpAKpA2KpA2KpA2IpA3IpAIL.7IJ$J.2JLI2JL J2L2.L2.L2.L2.L.JLR2.R.LJ.J.pAIpAIpAIKIpA12IJ.LJ.JL2.J.J2.J5.L3.pAKpA .pAIpA4.J$J.2JLJKJLJ2L.pAK.pAK.pAK.pAK.pAKpA2IpA.LJ.J.L.L.L3.J.9IL.J. LJ.JL2.J.J2.J5.L3.4IJ6.J$J.2JLI2JLJ2L.TJ.TJ.TJ.TJ.T.J2.L.LJ.J.L.L.pA 3IpAIpAIpAIL.L2KpA.J.IpAIpAIpA.J.J2.J5.L7.IL5.J$J.2JLJKJLJL2I.pAI.pAI .pAI.pAI.IJ2.L.LJ.J.L.L.L5.L.L.L.L4.J2.J.J.T.J.J.SJ5.L7.JIpAIpA2.J$J. 2JLI2JLJL2.J2.J2.J2.J2.J4.L.LJ.J.L.L.L4.pAK.L.L.pAQIpAIJ2.J.J.2IpAIpA 2IpA5.L3.4IpA6IJ$J.2JLJKJLJLIpA.IpA.IpA.IpA.IpA.K3.L.LJ.J.L.L.L4.L2.L .L.J.JL.J2.J.J.J.J.J2.L5.4IpAIpA.2JpAIpA2.J$J.2JLI2JLJLJ.R2.R2.R2.R2. R4.L.LJ.J.L.L.L4.IpAIpAIpAIpA.JL.J2.J.J.J.J.J2.L11.2IpAIJ4.J$J.2JLJ.J LJLJ2pA2KpA2KpA2KpA2KpA.LK.L.LJ.J.L.L.L11.2IJL.J2.J.J.J.J.J2.L2.8IL9. J$J.2JLJ.JIJ2IJ12.J2KJ.L.LJ.J.L.L.L14.2IpA2IpAIpAIpAIpA.J2.L2.J5K.LK 9.J$J.2JLJ.pA12IpA4I2JIJ.L.LJ.J.L.L.4IpAIpAIpA5IL2.J2.J.J.JTL.J2.L2. 5IpAIpA10IJ$J.2JLJ.J4.J.L3K2.LJK.2IJpAK.L.IpAIpAIpAIpAL2.L2K.I2L.L3KpA 2.J2.J.J.J.L.J2.L2.2JpA2IJ.IpAIpA2.pAKpAIpAJ$J.2JLJKpA4KpAKpA2TpAK.2I pA.J2KLJ.L2.J.J.L.2L2.L3.LKL.L6.J2.J.J.J.L.J2.L2.JpAJ7.IpAIpAIJ.IJ$J. 2JL2.J4.J.4TJ5.ILJKJ.2LKpAKpA3KpAL2.L3.L.L.pAQ5IpA2IpAIpAIpAIpAIpA2. 4IJ16.J$J.2JL2.pA4IpAI4.pA5IJ3IJ.2L.J.J4.L2.pA3IpAIpA.J.JK6.J.J.JRL.L 9.2IpA2IpAIL6.J$J.2JL2.J2.J7.L4.L7KL.J.J2KpAIpAIpA6.2IpA2IJ6.J.J.J.L. L8.IpAL3.L.L.IL3.J$J.2JpA2KpA2KpA7KpA4KpA7KpAKpA4KJ.L.T18.J.J.J.L.7IpA IpA.pAIpA.L.pAIpAL3.J$J.J.L2.J2.J7.L4.L7.L.J3.2J.2IK17ILJ.J.J.L8.8IpA 8IJ$J.J.L2.J2.J6.LpA4.L3.4IpAIJ3.2J.L20KJ.J.J.L16.L.pAIpAIpA2.J$J.J.L 2.J2.J6.IL4.L3.J3.L5.2J.20ILJ.J.J.L16.pAIJ6.J$J.JKpA2KpA2KJ2.L4KpA4KpA 3KpA2K.K5.2J.L20KJ.J.J.L25.J$J3.L2.JQ2J2.L.QT.L2.J.L3.J2.R6.2J.21IpAI pAIJ.L25IJ$J3.L2.JRJ3.pAIpA.2L2.J.L3.J2.pA6KpAJ.21IJ.J.J.IpAIpA.JpAIpA J3.pAI2pAIpA.pAKpA3K$J3KpA2KJRpA2K.2IL2KL2.pAKpAIpALJ5.J3.2J.J2.20IJ. J4.3IJ.IpAIpAIJ2.J.LIpA2.pAKpA$4.LQ2J.J.pA4K2.L7KLJ5IJ3IpAJ.J2.JpA3. 17IJ12.5IpA.IJ3IpAIJ$4.LRJ2.J.L6.L3.2IL.L2JKpAIpA.J.JLJ.J3.J3.J$4.LRpA 2KpA2K6.L2.IJKL.LJ2.J.pAIpAIJIJ.J3.J3.J.pA2IpAIL10IpAL.11IpAIpAIL$4.L .J2.J2.L5KpA2IpAR.L.LJ2.J.J.J3.J.J3.J3.J.J2.pAKpAJ2.IL3.LKpAK.J10KL.pA KpA3.IL$4IpAIJK.J2.L8.J2.L.LJ2.pAIpAIpA2IpAJ.J3.J3.J.J2.4IpAIpAL.LKpA IpAL.10IJL.4IpAIpAL$J3.L.R2.J2.L8IJ2.L.LJ2.J.J.J2.IJ.J3.J3.J.J6.10IpA IpA10IpA12IL$J.2IpAIpA2IJK.LJ10K3IpA2IpAIpAIpA3IL.J3.J3.J.J13.L3K.J.L 2.pAIpAJL2KILILJKpALJ3.L$J.J.L.J2.R2.L10IJ.R.J2.J.J.J3.L.J3.J3.J.J13. 5IpA4IJ.IJ3IJIJ3IJIJ3.L$J.J.L.J2KpA3KJ10K.pAKpA2IpAIpAIpAIpA2L.J3.J3. J.J20.R21.L$pAIpAIpA4IpA13IJ3.J2.J.3J.3L.J3.J3.J.J.19IpA21.L$J.2JL22. J2.J.2JpA.pA2L.J3.J3.J.J.J40.L$J.pAJL2.L2KpA3KpA4KpA7KJ2.J.J.JLK2L.J 3.J3.J.J.J2.3IpA2ILIL7.3IpA2IL4.3IL7.L$J.J.L2.L2.L3.L4.L4.JI2J2.J.J.J 3IpAQL3.LSpAQL.J.J2.J2KL2.pAJL6.IpA4.LpALIpAIpA2.pAL6.L$J.J.L2.L2.L.L KpAKpA2KpAKpA2KJpAKJ2.J.J.J2.JL.J3.J.J.J.J.J4.2pAI2pAKpAIpAIpAL.JIpAI pA.2LpAJ2.IpAI2pAIpAIpA2.L$J.J.L.IL2.I2L.I2L2.I2L.2JL2J2.J.J.J.pAJL.pA 3IpAIpAIpAIpAIpA3ILJ10IpAIpA20IL.L$J.J.LIpAL.IpA2LIpA2L.IpA2L.2JK2J2. J.J.J.2JL.J3.J.J.J.L.J3.L3JpA.L6K.J5K3.2JpAL.pA2J4.L.L$J.J.LJ.pA.pA. 3pA.2pATJ.2pATJK.pAJ2.J.J.JIpAJL.J3.J.J.J.L.J.pAKpA2JpAJ.pA12IpA.L.JpA JIpAJ6.L.L$J.J.LJ.T.J.2TJ.3TJ.3T.J.J3.J.J.2JLJL.J3.J.J.J.L.J.5IJ15.5I J10.L.L$J.J.IpAILIpAIL.pAIL2.pAIL2.LJ.J3.J.J.3pAJL.J3.J.J.J.L.J24.R 11.I2L.L$J.J2.JKpA.JKpA.JKpA2.JKpA2.LJ.J3.J.J.2J2.L.J3.J.J.J.L.pA24IpA 11.J2L.L$J.J4.L3.L3.L4.L2.LJ.J3.J.J.2J2.L.J3.J.J.J.L.J31.5IpA2L.L$J.J 2.LKpA3KpA3KpA4KpA3KJ.J3.J.J.2J2.L.J3.J.J.J.L.J2.3IpAILIpA.9I2pA6ILIL J.I2LK2L.L$J.J2.L.L3.L3.L4.L3.J.J3.J.J.2J2.L.J3.J.J.J.L.J2.J2.2LpAJIpA 2JK.L5KJ6KIJIpAIpAL2I2L.L$J.J2.L.L3.L3.3IpAIpA3IpAIpA3IpAIpAIpAJ2.IpA JSpA.J.J.J.L.J2.J2.8IpAIpA11IpA10IpAIL$J.J2.L.L3.L6.L.L3.J.J3.J.J.J3. J.L.J.J.J.J.L.J2.J2.4IpAIpA2J.L4.JpALIpAIpAJ3IpAIpA4.L.L$J.J2.L.L3.L 6.L.pA3IpAIpAIL.J.J.J3.J.L.J.J.J.J.L.J2.J2.pAKpAL2.I2J.6IJIpA4.pAKpA 7.L.L$J.J2.L.L3.L6.L.L3.J.J.L.J.J.J3.J.L.J.J.J.J.L.J2.J2.pAIJ5IpA9.IpA IpAIpAIJ7.L.L$J.J2.L.L3.7IpA5IpAIpAIpAIpAIpAIpA3.J.L.J.J.J.J.L.J2.J3. J3K28.L.L$J.J2.L.L8.J.L5.J.J.L.J.J.L3.J.L.J.J.J.J.L.J.IpAIpA4IJ.5IL5. pAL4.3IL6.L.L$J.J2.L.9IpAIpA5IpAIpAIpAIJ.J.L3.J.L.J.J.J.J.L.J.2J.L6.pA KpA2LpALIpAL.J5IpA2.pAL5.L.L$J.J2.L6.J3.J.L5.J.J.L3.J.L3.J.2IpAIpAIpA IpAIpAIpA2IpA8IpAIJ3LpAJ.pA.J5KIpAI2pAIpAIpA.L.L$J.J2.L2.4IpA3IpA7IpA IpAIpA3IpA.L3.J3.J.J.J.2IL.J.R10.L2K12IpA10IL.L$J.J2.L2.J3.J3.J4.J2.J .J.L3.L.L3.J3.J.JKpA3KL.pAIpA6IL2.LKIL3.JpAI2pAIpAILJ10.L.L$J.J2.2LKpA .LKpA.LKpA2.LKpAIpAJ.J.L3.L.L3.J2.pAJ2K.J2.JL.J8.L2.ILJL4IJ2.JKpAKLJ 10.L.L$J.J2.IpAIJ.pAIJIpAIJ2.pAIJKL.IJ.L3.L.L3.J2.2JIJ.J2.JL.J7K.L3.I 3pAKpA3IpA2IpAJIJ10.L.L$J.J3.L.2RL.R.L.3RL.RLK.pAL.L3.2IpA3IpA2IpAJpA 2.J2.JL.pAJ.pAKpAIpA.L5.IpAIJ12.8IpAIL$J.J3.L.3pA.pA.L.2pARL.2pAL.JL. L5.L3.J2.L2J.pAJ2KJL.J4.J3.L.L19.JpA.pAIpAJ.L.L$J.J3.IpA2JIpAJ.IpA2J. IpAJL2IpAL.L5.L3.J2.pAJpA.2JI2J2IpA4IpA3IpA22IJ.J.IJ.L.L$J.J4.I2J.IJ 2.I2J2.IJL2.2L.L5.L3.J2.L.JIpAJpA.J2.J4.J3.L.R11.11IpA4IL.L$J.J5.2JKpA 3KpAKpA2KpA2K2.pAL.L5.4IpA2IpAI2JL2J.J2.J4.J3.2IpA11.2JpAIpA.pA4IJ4.L .L$J.J5.J2.J3.J4.J5.L.L9.J2.L2.2pAJpA.J2.J4.J17.J.JIpA.J9.L.L$J.J5.J 2KpA3KpA4KpA6K.10IpA2IpA2IJ2.J.J2.pA4IpA17IpAIpAJ2IpA.pAKpAKpA2K.L.L$ J.J35.J2.6IJ.J2.J4.J25.L3.L.J.L.L$J.J35KpA10KpA2KpA4KpA23KpAKpAKpAKpA .J.L.L$J37.J13.J28.T.L.J.J.J.L.pA2IL$J37KpA13KpA28KLKpA.JIJ.J.2IpA2QL $38.J41.JK3.2JK.J7.2L.4L2.L.L2.2L.L.L3.L.2L2.8L2.8L2.8L2.L5.2L.2L5.5L 5.5L5.5L10.L.L.7L.L.7L.L.7L.L.L4.3L2.8L2.8L2.8L2.L12.L.2L.L7.4L6.L9.L .L7.4L6.L8.5L6.L19.L.L7.L8.L5.5L6.L.3L.L7.4L14.3L9.4L6.L4.L.L9.L2.L2. 2L5.2L2.8L2.8L2.8L2.L13.6L6.L9.4L16.L3.L5.L9.L2.L5.2L.L17.4L6.L9.4L 16.L3.L10.5L6.L.3L.L6.3L6.2L10.4L6.L8.2L.L7.L4.L4.4L6.L6.L2.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L7.L6.7L6.L6.L2.4L6.L6.L7.5L7.2L.L.L7.L2.L6.4L 6.2L7.5L16.L2.L6.L.L7.L3.L5.L.L6.2L5.5L3.L13.3L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L15.6L6.L9.4L6.L8.L10.4L6.L9.4L6.L3.L4.L10.4L6.L9.4L6.L 3.L10.5L10.L.L7.L8.5L6.L8.5L16.L2.L4.L.L3.L5.L.L7.L8.5L6.L9.4L6.L2.L 2.2L.2L.L7.L3.L5.4L6.L7.L11.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13. L.3L3.L5.L9.4L6.L8.L10.L3.L5.L6.2L6.2L.L.L.L16.2L.L16.2L.L14.L2.L.L 13.L.3L.L7.L8.L8.6L16.L3.L14.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L12.2L3.L3.L10.2L.L.L.L16.5L16.L.L7.4L13.L2.L.L13.L.3L.L7.L2.L 6.L3.L13.3L.L17.L3.L14.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 13.3L.L.L7.L8.5L13.L.2L3.L11.2L2.L.L7.L8.L6.L.L.L.L16.2L2.L2.L3.L.L7. L5.2L2.4L6.L6.L2.4L6.L9.4L6.L8.5L16.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L13.L.L.L.L7.4L6.L9.L.L7.4L6.L.L17.L3.L12.L.2L3.L11.2L2.L.L17.4L 6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L.L16.2L2.L5.2L3.L15.4L16.L3.L5. 4L16.L.L13.2L2.L.L7.2L6.2L10.L.L16.3L8.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.L14.7L6.L9.4L6.L19.L3.L5.4L6.L.L6.L10.4L6.L6.L12.L 3.L11.2L2.L.L17.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L5.L.L 7.4L16.L3.L14.2L3.L15.4L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L16.L 2.L6.4L6.2L7.5L6.L.L6.L9.3L8.L3.L5.4L6.L9.4L6.L2.2L5.2L2.8L2.8L2.8L2. L13.L.L.L7.L4.L14.L.L15.3L3.L15.L3.L14.2L.L7.L5.L.L.L.2L6.4L16.L3.L5. L2.L6.L3.L15.L3.L5.4L15.2L3.L15.L.L16.2L3.L5.L9.L3.L15.4L6.L8.5L16.3L 16.4L16.4L16.4L16.4L16.2L2.L4.L.L3.L5.L.L6.L9.5L16.L3.L15.L3.L5.L2.2L 5.2L2.8L2.8L2.8L2.L13.L.L.L13.2L.5L6.L9.4L6.L8.L8.3L3.L15.L3.L14.2L.L 13.L.3L3.L15.L3.L4.2L19.L2.L6.L3.L5.L2.L5.2L3.L15.L.L15.3L3.L13.3L3.L 5.L2.L16.4L6.L19.4L6.L19.4L6.L19.4L6.L19.4L6.L6.L2.L2.L6.4L6.L.L17.L 3.L5.L9.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L14.L2.L.L7.L7.L 7.2L.2L3.L15.L3.L14.2L.L13.L2.2L2.L5.2L3.L15.4L6.L9.4L6.L9.4L6.L9.4L 6.L8.L10.L.L15.3L3.L13.3L3.L15.L.L17.L3.L5.L.L17.L3.L5.L.L17.L3.L5.L. L17.L3.L5.L.L17.L3.L15.L2.L5.2L3.L5.L.L7.L9.L.L16.2L3.L4.L10.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.3L.L7.4L15.5L6.L5.L2.L8.3L3.L15.L3. L14.2L.L13.L2.2L3.L5.L8.5L6.L16.2L.L3.L15.L.L15.3L3.L14.2L.L7.L9.4L 16.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L 2.L6.4L6.L3.L15.4L6.L7.L.L.L7.4L15.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L7.4L6.L9.4L6.L9.4L5.2L9.4L6.L9.L2.L2.L3.L3.L13.3L3.L 15.L3.L14.2L.L12.L.L.2L3.L15.L.L15.3L3.L5.L19.L.L17.L3.L14.2L2.L2.2L 2.L.L16.2L.L7.L7.L.L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L7.L5.L3.4L6.L5.L.2L10.L3.L15.L3.L14.2L.L14.4L.L7.L5.2L2.4L6.L9. 4L6.L7.L.L2.L6.L9.4L6.L9.4L6.L9.4L6.L5.3L.4L15.2L.L16.2L.L7.4L15.2L3. L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13.L3.L3.L5.L2.L6.L3.L5. L.L7.4L6.L9.4L6.L3.L15.4L6.L9.4L6.L3.L15.L3.L15.L3.L14.2L.L14.4L2.L2. L.3L.L17.L.L17.L.L15.L.2L18.L3.L15.L.L17.L3.L11.3L.L.L16.2L2.L4.3L.L 16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13.L3.L3.L5.4L6.L 8.L9.2L3.L5.L7.L11.L3.L14.2L3.L15.L3.L14.5L6.L2.L6.4L6.L2.L3.L2.L.L7. L5.2L12.L.L17.L.L15.L.4L16.L3.L15.L.L17.L3.L13.L.L.L7.L6.L2.4L6.L9.4L 6.L9.4L6.L9.4L6.L2.L6.L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L12.L2.3L3.L14.2L3.L15.L3.L14.2L.L17.3L14.L2.L2.L2.2L2. L.L17.L.L17.L.L15.L.L3.L15.L3.L15.L.L17.L3.L13.L.L2.L4.3L.L17.L.L17.L .L17.L2.L6.L.L16.2L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L 2.L13.L.L.L13.L3.L.L7.L9.4L6.L8.5L6.L6.L2.4L6.L8.5L6.L9.4L6.L8.2L.L6. 2L4.L2.2L10.L.L17.L.L15.L.L3.L15.L3.L15.L.L17.L3.L14.2L.L7.L7.L.L.2L 6.4L16.L.L17.4L16.L.L7.4L15.2L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L14.L2.L.L6.5L6.L9.4L6.L.L6.L9.2L.L14.L2.L3.L 14.2L3.L15.L3.L5.L.2L6.L3.L5.L.L6.L9.2L.L7.L9.L.L7.L5.3L11.L.L17.L.L 15.L.L3.L15.L3.L15.L.L17.L3.L14.2L.L17.L2.L6.L3.L15.L3.L15.L.L17.L.L 17.L.L15.L.L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L .L.L7.L6.L.5L6.L7.3L2.L6.L.L17.L.L14.L2.L3.L14.2L3.L15.L3.L15.L3.L5.L .L6.L9.2L.L7.L3.L5.4L6.L2.L6.L.L13.L.3L3.L15.L.L17.L.L17.L.L7.L9.4L6. L9.4L6.L9.4L6.L9.4L6.L8.5L16.L3.L5.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L7.L. 4L14.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L16.5L6.L 9.4L6.L3.L5.L.L17.4L6.L9.4L6.L8.L10.L.L16.2L.L7.L8.5L6.L8.5L6.L9.4L6. L9.4L6.L9.L.L7.L.2L6.4L6.L6.L2.L2.L2.L.3L3.L15.L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L7.L9.L2.L6.L3.L5.L2.L6.L.L7.L2.L4.L.L.L13.5L.L16.2L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.3L3.L5.L9.4L13.2L.L.L16. 2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L.L16.5L6.L9.4L6.L2.L6.4L6.L3.L 11.2L2.L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L2.L6.L3.L5.L2.L6.L3.L5.L. L7.L2.L6.L.L17.L2.L.L4.4L6.L2.L6.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.4L12.2L.2L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L.L 15.3L3.L13.L.L.L7.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L.L17.L.L17.L.L 17.L3.L15.L3.L5.L.L7.L3.L15.L3.L5.L9.L2.L6.L3.L5.L2.L2.L.L.L.L7.L2.L 6.L.L7.L2.L6.L.L6.2L2.L6.L.L6.L10.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.2L6.4L6.L5.2L2.4L6.L8.5L6.L8.5L6.L8.5L6.L9.4L6.L9. 4L6.L8.L9.2L.L7.L9.4L14.L.L2.L6.L.L17.L.L17.L3.L15.L3.L13.L.L3.L15.L. L17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L3.L5.L2.L5.2L3.L5.L.L7.L9.L.L7.L7. L.L.L7.L8.2L.L7.L7.L.L2.L6.L3.L5.L2.L6.L3.L5.L2.L5.2L3.L5.L.L6.L10.L. L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L15.L3.L5.L.L7.L9. L.L7.L9.L.L7.L6.L.L10.L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L3.L 14.2L.L17.L3.L5.L9.4L6.L7.L.L.2L6.4L16.L3.L15.L3.L5.4L15.2L3.L15.L.L 17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L3.L4.2L8.2L.L7.L3.L5.L18.2L3.L5.L 19.L3.L5.L19.L.L7.4L6.L6.2L.4L6.L19.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2. 8L2.8L2.8L2.L13.L.L3.L15.L3.L5.L.L7.L3.L5.L.L7.L3.L5.L.L7.L3.L5.4L6.L 9.4L6.L2.L6.L3.L15.L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L5.L9.4L6.L 8.5L6.L9.4L6.L8.L8.3L3.L15.L3.L15.L2.L6.L3.L5.L2.L5.2L3.L15.L.L17.L.L 17.L.L17.L3.L15.L3.L5.L.L7.L3.L5.L2.L5.2L3.L5.L.L6.2L8.5L6.L8.5L6.L8. 5L6.L9.L3.L12.2L.L.L16.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L3.L15.L3.L5.L9.L3.L5.L9.L3.L5.L9.L3.L5.L19.L3.L13.L.L.L16.2L.L 16.2L3.L14.2L3.L15.L3.L13.L.L3.L15.L3.L5.L.L17.L3.L13.L.L2.L4.L.L3.L 15.4L6.L9.4L6.L9.4L16.3L7.L.2L6.4L6.L9.4L6.L9.4L6.L9.4L16.L3.L5.L.L7. L3.L4.2L8.2L.L6.L9.2L.L16.2L.L16.2L.L17.L3.L5.L9.4L6.L6.4L.L7.L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L6.2L11.L.L7.L9.4L6.L7.L. 4L6.L8.5L6.L2.L5.5L6.L2.L5.5L6.L2.L6.4L6.L2.L5.2L.L7.L3.L15.L3.L5.L.L 17.L3.L13.L.L3.L5.L6.2L11.L3.L15.3L17.L.L17.L.L17.L.L17.L3.L15.L3.L5. L.L7.L3.L15.L9.4L6.L9.L.L7.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.2L.L7. L2.L5.2L.L6.2L9.L.L7.L9.L2.L6.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2. 8L2.8L2.8L2.L13.L.L3.L13.6L6.L9.4L16.4L6.L2.L6.4L14.L.L.L14.L2.L3.L 14.2L3.L15.L3.L14.2L.L7.L3.L15.L3.L5.L.L17.L3.L5.L5.L.6L6.L9.L2.L6.L 9.4L6.L9.4L6.L9.4L16.L3.L15.L3.L5.L.L17.2L17.3L8.L.L7.L3.L15.L.L16.2L .L16.2L.L16.2L.L16.2L.L6.2L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L3.L5.L7.2L8.L.L.L14.L2.L3.L14. 2L3.L15.L3.L14.2L.L7.L3.L15.L3.L5.L.L17.L3.L15.L.L7.L5.L13.L3.L13.L.L .L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.4L6.L8.5L6.L2.L6.4L16.L2.L6.4L16. L2.L6.4L16.L2.L6.4L16.L2.L6.4L16.L.L6.2L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L .L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L2.L.L7.L16. 2L.L.L14.L2.L3.L14.2L3.L15.L3.L15.4L6.L9.4L6.L9.4L6.L19.L3.L15.4L6.L 2.L5.2L.L17.L.L7.L9.4L6.L9.4L6.L9.4L6.L7.L.4L16.L.L17.L.L17.L3.L15.L 3.L5.L.L17.L.L16.2L3.L15.3L17.L3.L5.3L17.L3.L5.3L17.L3.L5.3L17.L3.L5. 3L17.L.L6.2L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L9.L3.L12.2L.L.L14.L2.L3.L5.2L.L16.L 3.L15.L3.L15.3L17.L3.L15.L3.L14.2L3.L13.3L.L17.L.L17.L.L17.L.L14.L2.L .L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L16.2L3.L5.L19.L9.4L16.L9.4L16. L9.4L16.L9.4L16.L8.2L.L7.L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L.L7.L3.L4.L10. L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L6.L.5L6.L7.2L8.L.L.L14.L2. 4L6.L8.5L6.L9.4L6.L8.L10.L3.L15.L3.L14.2L3.L5.L9.4L6.L9.L.2L6.4L16.L. L17.L.L17.L2.L6.4L14.3L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L15.3L3. L14.2L3.L14.2L3.L14.2L3.L14.2L3.L14.2L.L7.L3.L5.L.L7.L3.L4.2L9.L.L7.L 3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L3.L4.L 10.4L6.L9.4L6.L7.2L7.L2.L.L16.2L3.L15.L3.L15.L3.L15.L3.L15.L3.L14.2L 3.L15.L.L7.L3.L15.L3.L15.L.L17.L.L16.2L.L15.3L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L17.L.L15.L.L2.L16.4L6.L19.4L6.L19.4L6.L19.4L6.L19.4L6.L9. L.L7.L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L3.L13.3L3.L5.L9.4L6.L8.L6.L.L.L.L16.2L3.L15.L3.L15.L 3.L15.L3.L15.L3.L14.2L3.L15.L.L7.L3.L15.4L6.L9.4L6.L9.4L6.L9.4L6.L17. 3L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L15.4L17.3L17.3L17.3L17.3L18. L3.L5.L.L7.L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L11.L3.L.L7.L6.3L9.2L.L16.2L3.L15.L3.L15.L3.L15.L3.L 15.L3.L14.2L3.L15.L.L7.L3.L5.L8.L6.L.L.L.L17.L.L17.L.L17.L3.L15.L3.L 5.L.L17.L.L17.L2.L6.L.L17.4L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L 5.2L3.L5.L.L7.L3.L5.L.L7.L3.L15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L3.L11.L3.L2.L6.L.L17.L2.L3.L2.L3.L14.2L.L16.2L3. L15.4L6.L9.4L6.L9.4L6.L9.4L6.L8.5L6.L8.L6.2L.2L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L17.L.L17.L3.L5.L2.L5.2L3.L11.L.3L3.L5.L8.2L3.L5.L9.L3.L 15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L5.L 2.5L6.L9.4L6.L6.L11.2L.L16.2L3.L15.L.L7.3L7.L3.L15.L3.L15.L3.L14.2L3. L14.2L.L7.L6.L2.4L6.L9.4L6.L9.4L6.L7.2L10.L.L17.L.L17.L3.L15.L3.L5.L. L17.L.L17.L3.L5.L9.L3.L4.2L7.6L6.L5.L.6L16.L3.L5.L.L7.L3.L4.L10.L3.L 5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.4L6.L9.4L6.L2.L6.4L15.5L6.L9.4L 6.L19.L3.L5.L8.5L6.L3.L4.L9.2L.L16.2L3.L15.L.L17.L3.L15.L3.L15.L3.L 14.2L3.L14.5L6.L2.L4.L.L.L17.L.L6.2L19.L2.L5.2L.L16.2L.L7.4L6.L9.4L6. L9.4L6.L9.4L6.L19.L.L17.L2.L6.4L6.L3.L5.L8.L10.L2.L6.L3.L5.L.L16.2L2. L4.L.L.L17.L3.L13.3L3.L15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L5.L19.L3.L5.L9.4L6.L9.4L6.L16.2L.L3.L5.4L6.L3.L14. 2L.L16.2L3.L15.L.L17.L3.L15.L3.L15.L3.L14.2L3.L12.L.2L.L17.L.L7.L2.L 6.L.L15.L.L.L16.2L.L6.L10.L.L17.L3.L15.L3.L14.2L.L17.L3.L5.L.L7.L2.L 5.2L3.L15.4L6.L8.L10.L2.L6.4L6.3L6.5L6.L2.L6.4L6.L2.L4.6L6.L2.L6.L3.L 5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L11.5L3.L5.L7. 2L9.5L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.5L6.L6.L2.L.2L6.4L16.L.L17.L.L 15.L.L.L16.2L.L7.4L6.L2.L4.L.4L6.L2.L6.4L6.L2.L6.L.L6.L10.L3.L5.L2.L 6.L3.L5.L.L7.L16.L2.L3.L5.3L5.2L10.L3.L13.3L3.L14.2L.L7.L3.L4.L10.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L.L7.L9.4L6.L8.5L6.L8.L6.L 3.L.L17.L.L7.2L8.L3.L15.L3.L15.L3.L12.L.2L2.L6.L3.L15.L3.L15.4L6.L9. 4L6.L7.L.4L15.2L.L15.3L3.L15.L3.L15.L.L6.L10.L3.L5.L7.L.L3.L5.L6.L2. 4L14.3L9.4L6.L7.6L15.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L3.L13.L.L.L7.L19.L.L17.L.L15.L.L.L7.4L6.L16.4L.L17.L.L17.L3.L 15.L3.L15.L3.L12.L.2L3.L5.L8.5L6.L8.L7.L.5L6.L9.4L6.L9.4L6.L2.L5.2L3. L15.L3.L15.L.L7.L2.L3.2L.L.L15.3L.L14.2L.L3.L14.2L3.L14.2L.L7.L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L13.L.L.L7.4L6.L9.4L16.L.L 17.4L6.L9.4L16.4L6.L9.4L6.L6.2L11.L.L17.L3.L15.L3.L15.L3.L10.L3.4L17. L.L17.L3.L5.L2.L4.6L6.L2.L6.4L6.L2.L3.2L.4L6.L2.L4.6L6.L2.L3.2L.4L6.L 2.L5.5L6.L2.L5.5L6.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L 5.L6.7L6.L6.3L7.4L.L17.L3.L15.L3.L15.L3.L5.L.L7.L4.L4.L2.L6.L8.L10.L 3.L4.L8.L.L3.L15.L.L14.2L.L.L15.3L.L14.2L.L3.L14.2L3.L14.2L.L17.L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L9.4L16.L.L 13.5L.L17.L3.L15.L3.L15.L3.L5.L2.L.L2.3L.L17.L3.L4.L8.L.L3.L5.L9.4L6. L7.2L8.L.L.L15.6L6.L.L14.L.2L3.L14.2L3.L14.2L.L17.L3.L15.L3.L5.L2.2L 5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L3.L5.L9.4L12.5L.L17.L3.L15.L3.L15. L3.L5.L.L7.L4.L2.2L10.L3.L4.L7.L2.L.L15.L.L3.L13.L.L.L15.3L.L7.L16.L. 2L3.L14.2L3.L14.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L 10.2L3.L.L17.L3.L15.L3.L15.L3.L5.L2.L.L2.3L.L17.L3.L4.L7.L2.L2.L16.L 2.L5.5L6.L2.L4.L.4L6.L2.L4.6L6.L2.L4.3L.L16.2L3.L5.L2.L5.5L6.L2.L5.5L 6.L2.L6.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L4.2L3.L.L17. L3.L5.L9.4L6.L9.4L6.L4.L.L12.L3.L4.L7.L.3L17.2L3.L13.L.L.L17.L3.L14. 2L.L17.3L7.L.2L16.L.L16.2L3.L4.2L.2L6.L3.L14.2L.L15.L.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.3L2.L4.L.4L6.L2.L6.4L16.4L6.L9.4L5.2L9.4L14.L.L3.L 5.4L6.L9.4L6.L3.L15.4L6.L9.4L6.L19.L3.L15.L3.L15.L3.L5.L4.L.L12.L3.L 5.4L6.L2.L3.L.5L15.2L3.L13.L.L.L17.L3.L14.2L.L6.L10.4L6.L9.4L14.L.L3. L5.2L8.L3.L14.2L.L15.L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.6L6.L2.L6.4L 15.5L6.L9.L.L17.L3.L14.2L3.L5.L9.4L6.L9.4L6.L19.L3.L5.L7.L9.3L3.L15.L 3.L5.L4.L2.2L9.2L3.L15.L3.L4.L8.L.L3.L12.L2.L3.L5.L.L7.4L6.L9.4L6.L2. L6.4L15.2L.L7.L2.L5.2L.L7.L8.L10.L2.L5.5L6.2L8.L3.L5.L2.L5.5L6.L2.L4. L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.3L3.L5.L9.4L6.L7.L.L3.L5.L19.4L6.L 6.L8.L.3L3.L5.L4.L12.L.4L6.L3.L14.2L3.L15.L3.L5.4L6.L7.L.L3.L5.L6.L2. L3.L5.L.L7.L2.L3.2L.L.L16.2L2.L4.6L16.L3.L15.L3.L4.2L.2L6.L.L15.3L2. 2L5.2L2.8L2.8L2.8L2.L10.5L6.5L3.L13.L.L3.L13.L.L3.L15.L3.L5.L.L7.L3.L 15.L3.L15.4L6.L9.4L6.L2.L6.L3.L4.2L.L17.L.L7.L8.L8.L.L.L14.L.2L.L17.L 3.L14.2L3.L5.2L8.L.L15.3L2.2L5.2L2.8L2.8L2.8L2.L11.L.3L.L7.L9.4L6.L9. 4L6.L5.L.L11.L.L7.4L6.L5.L2.2L.L7.L9.4L6.L8.5L16.L3.L13.L.L3.L13.L.L 3.L15.L3.L5.L9.L3.L5.L9.4L6.L9.4L16.L3.L14.2L3.L5.L.L17.L.L7.L2.L6.L 3.L5.L18.2L.L14.L.2L2.L5.5L6.L2.L5.5L6.2L8.L.L15.3L2.2L5.2L2.8L2.8L2. 8L2.L12.2L.L.L7.L17.L.4L6.L2.L6.4L16.L.L7.L2.L2.L2.2L3.L15.L2.L6.4L6. L2.L6.L.L15.L.L.L7.L18.2L3.L5.4L6.L2.L6.4L15.2L3.L15.L3.L13.L.L3.L13. L.L3.L15.L3.L13.L.L3.L15.L3.L15.L3.L14.2L3.L5.L.L17.L.L17.2L8.4L6.L8. 5L6.L2.L3.L2.L.L16.2L3.L14.2L3.L15.L.L15.3L2.2L5.2L2.8L2.8L2.8L2.L12. 2L.L.L7.4L6.L9.4L6.L7.2L10.L.L7.L3.L5.L5.L2.L10.L.L7.4L6.L9.4L6.L2.L 6.L.L17.L.L7.4L6.L9.4L6.L7.2L9.2L3.L15.L3.L13.L.L3.L13.L.L3.L15.L3.L 5.4L6.L8.5L6.L9.4L6.L9.4L15.2L3.L5.L.L17.L.L16.2L3.L12.4L.L16.2L3.L 15.L2.L6.L3.L5.L9.4L6.L7.3L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L5.L.6L6. L5.L2.5L6.L9.4L6.L5.L2.L7.L.2L3.L15.L3.L13.L.L3.L13.L.L3.L15.L3.L5.L 18.2L3.L15.L3.L15.L3.L14.2L3.L5.L.L17.L.L16.2L3.L5.L6.4L.L16.2L3.L14. 3L18.L.L15.L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.L.L3.L5.L.L7.4L 6.L2.L6.L3.L5.L.L7.L9.L.L7.L9.L2.L5.2L.L7.L3.L5.4L6.L9.4L15.2L.L17.L 3.L15.L2.L4.L.L.L13.2L2.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L7.L7.L.4L 6.L9.4L6.L9.4L6.L8.5L6.L7.L.L2.L2.L2.2L3.L5.L.L17.L2.L6.L3.L5.L8.5L6. L9.4L6.L8.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.L.L3.L5.L9.L3. L5.L7.L.L3.L5.L9.L3.L5.L7.L.L3.L5.L19.L3.L5.L7.6L6.L6.L8.2L2.L3.L15.L 3.L13.L.L3.L13.L.L3.L15.L.L15.L.L3.L15.L3.L15.L3.L14.2L3.L15.2L18.L3. L5.L5.L2.2L.L16.3L17.2L3.L15.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L 2.L13.L.L.L12.L.L2.2L13.L2.3L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6.5L6. L9.4L6.L9.4L6.L9.4L6.L8.5L6.L2.L6.4L16.L2.L2.L2.2L3.L5.L2.L4.L.4L6.L 2.L5.2L3.L15.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L12.L. L2.4L6.L4.L2.L11.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L5.L11.L3.L3.L11.L 3.L14.2L3.L13.L.L3.L5.L5.2L2.4L6.L7.6L6.L9.4L6.L9.4L6.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L12.5L7.4L3.L15.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6. 5L16.4L6.L3.L4.L10.L3.L14.2L3.L10.L.L.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L14.2L.L.L7.L7.L9.3L.L7.L8.5L6.L7.L8.2L.L.L7.L 9.L.L7.L8.5L6.L7.L10.2L3.L15.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6.2L 2.L6.L.L7.L3.L15.L3.L15.L3.L14.2L3.L5.L2.L3.2L.4L6.L2.L4.6L6.L2.L4.L. 4L6.L2.L5.2L.L16.2L.L7.L3.L5.4L16.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L. L.L14.L.2L.L7.4L15.5L6.L9.4L6.L9.L.L7.4L6.L.L15.6L6.L16.L.2L.L7.L3.L 5.4L15.2L.L7.L2.L5.2L3.L14.2L3.L15.L3.L15.L.L7.L.2L6.4L6.2L.L6.L.L15. L.L.L7.L.2L6.4L6.L7.L.L3.L15.L3.L15.L3.L14.2L3.L4.2L9.L3.L13.3L.L15. 3L.L15.L.L.L16.2L.L16.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L16.5L6.L9.4L6.L9.4L5.2L9.4L6.L18.2L3.L5.4L6.L.L6.L10.4L6.L9.4L6. L9.L3.L15.L.L7.4L6.L9.4L6.L9.4L6.L2.L6.4L5.2L9.4L5.L8.3L3.L15.L3.L15. L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L14.2L3.L15.L3.L15.L3.L14.2L3.L 5.L2.L6.4L6.L3.L5.L2.L5.5L6.L2.L6.4L6.L2.L5.5L6.L2.L6.4L6.L2.L6.L.L 17.L.L16.2L.L16.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 17.L.L7.L4.L2.6L6.L9.4L6.L5.L2.2L3.L5.L.L7.L7.L.4L6.L9.4L6.L9.4L6.L9. 4L6.L9.4L6.L7.L.4L16.L.L7.L3.L5.4L16.L3.L15.L3.L15.L3.L14.2L3.L4.2L.L 7.L3.L4.L10.L.L6.2L18.2L.L6.2L19.L.L6.2L18.2L.L7.L19.L.L17.L3.L15.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L15.3L3.L4.5L16.L.L7.4L6.L3.L 4.L8.L.L2.L3.L2.L3.L15.L2.L3.L.2L.L17.4L6.L3.L3.L.L.L15.L.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L4.L10.L3.L15.L3.L15.L3.L14. 2L3.L4.2L2.L6.L3.L4.L10.L.L6.5L6.L19.L.L6.5L6.L9.L.L6.5L6.L19.L.L7.4L 6.L9.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L14.L.2L 3.L5.4L6.L9.L3.L5.4L6.L3.L15.L.L17.4L6.L5.L.6L16.L3.L5.4L6.L3.L4.5L6. L2.L6.4L16.L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.4L6. L9.L3.L15.L3.L15.L3.L14.2L3.L5.4L16.L2.L6.L3.L5.3L7.4L5.L10.L3.L5.3L 7.4L5.L10.4L4.L11.4L16.4L16.L3.L5.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L6.L8.3L.L3.L5.L6.L12.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.L.L7.L3.L4.L10.L3.L15.L3. L13.L.L3.L15.L3.L15.3L5.L11.L3.L5.3L5.L11.L3.L5.3L6.L10.L3.L15.3L17.L 3.L5.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L15. L.L.2L13.L.4L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.4L 4.L11.L3.L15.L3.L13.L.L3.L15.L3.L5.L.L16.2L.L7.L9.4L15.2L.L7.L9.4L16. L.L7.L9.4L6.L9.L.L7.L9.4L6.L19.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L17.L.L6.2L3.L11.L.L.4L6.L4.L.7L16.L.L17.L3.L15.L3.L15.L3.L13. L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3.L15.L3.L5.L.L16.5L6.L2.L 6.L3.L14.5L6.L2.L6.L3.L15.4L6.L2.L6.L3.L15.4L6.L2.L6.L3.L14.2L3.L15.L 3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.5L6.L6.L7.4L.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3. L15.L3.L5.L.L16.2L.L15.3L.L15.L.L.L15.L.L.L15.3L3.L15.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L2.L6.L.L6.2L19.L3.L5.L.L7.L9.L.L7.L 6.L.5L5.2L5.L13.4L6.L9.L.L7.L9.4L6.L7.L10.2L3.L15.L.L17.L3.L15.L3.L 15.L3.L13.L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3.L15.L3.L5.L2.L 4.L.4L6.L2.L4.6L6.L2.L4.L.4L6.L2.L4.L.4L6.L2.L6.L.L16.2L3.L15.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L8.2L.L7.4L6.L9.4L6.L9.L3.L5. L9.L2.L3.L.2L3.L5.L2.L3.L2.L.L17.L2.L6.L3.L4.5L6.L9.L3.L5.4L6.L.L6.L 9.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L4.L 10.L3.L15.L3.L13.L.L3.L15.L3.L13.L.L.L15.3L.L15.L.L.L15.L.L.L17.L.L 16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L9.4L6.L5.L2.5L6.L 5.L.L.4L6.L9.4L6.L6.3L9.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L15.4L 6.2L.L6.L3.L5.4L6.L18.2L3.L5.4L6.L9.4L6.L9.4L6.L7.L.4L6.L9.4L6.L7.L. 4L6.L9.4L6.L7.L9.L.L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L17.L.L15.6L6.L9.4L6.L7.L.L3.L5.4L6.L9.4L6.L9.L.L7.4L 6.L3.L13.3L.L17.L3.L4.5L6.L9.4L6.L7.2L9.2L3.L14.2L3.L15.L.L17.L3.L15. L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L.L3.L15.L3.L15.L3.L13.L.L3.L15.L3. L13.L.L.L17.L.L14.L.2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.L17.L.L14.2L.4L6.L2.L6.4L14.6L6.L9.L3.L5.L6.L.L10.L 3.L4.2L18.2L.L7.4L6.L2.L6.4L15.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L 3.L15.L3.L15.L.L17.L3.L13.L.L3.L15.L3.L15.L3.L15.L.L7.L9.4L6.L9.4L6.L 7.L.4L16.L.L14.L.2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L17.L.L14.2L.L3.L5.L9.4L6.L9.4L6.L9.4L6.L15.L3.4L6.L6.L 2.L3.L5.L9.4L15.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L 17.L3.L13.L.L3.L15.L3.L15.L3.L15.L.L17.L3.L15.L3.L13.L.L.L17.L.L14.L. 2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 17.L.L12.2L.L11.L2.L4.L.L3.L13.L.L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L 3.L15.L3.L15.L.L17.L3.L13.L.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L 6.L2.4L6.L6.2L9.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L17.L.L14.L.2L.L7.L7.L9.3L.L7.4L13.L2.L.L7.L6.L12.L3.L5.L7.6L 6.L9.4L6.L19.L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L. L.L17.L3.L15.L3.L15.L.L17.L3.L15.L3.L12.L2.L.L17.L3.L12.4L.L17.L.L16. 2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L14.L2.L.L7.4L15. 5L6.L6.L2.L3.L15.L.L7.4L6.L9.L.L7.4L6.L.L6.5L6.L2.L6.4L13.L.2L.L17.L 3.L4.L10.L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L.L.L 17.L3.L15.L3.L5.L9.4L6.L9.4L6.L9.4L6.L6.L2.4L6.L9.4L6.L5.L13.L.L16.2L 3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.4L6.L9.4L6.L9.4L 5.2L9.4L6.L9.L2.L3.L2.L3.L15.4L16.L3.L5.4L6.L.L5.L.L3.L5.L9.4L6.L6.7L 6.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L3.L13.L.L.L17.L3. L13.L.L.L17.L3.L15.L3.L12.L2.L.L17.L3.L13.L.L3.L12.L.2L.L16.2L3.L15.L 3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L7.L5.L2.5L6.L5.L.3L2.L5.2L .L13.L2.3L18.L3.L15.L.L7.L8.L10.L3.L15.L3.L15.L3.L13.L.L3.L13.L.L.L 17.4L6.L7.L.4L6.L9.4L6.L9.4L6.L6.2L.4L6.L7.L.4L6.L7.2L9.2L.L16.2L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L.L7.L9. 4L6.L9.4L5.2L9.4L6.L3.L13.L.L.L7.L9.L2.L6.L.L16.2L.L7.L6.L.5L6.L9.4L 16.L.L7.L2.L4.L.4L6.L2.L6.L3.L15.L3.L13.L.L3.L13.L.L.L17.L.L15.L.L.L 17.L3.L15.L3.L14.2L3.L13.3L3.L13.L.L3.L13.L.L3.L14.2L.L16.2L3.L15.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L.L7.L2.L6.4L6. L2.L6.L3.L14.2L3.L5.L7.3L.L7.L3.L5.L.L7.L18.2L.L14.4L3.L15.L.L7.L3.L 14.2L3.L15.L2.L5.2L3.L5.4L15.2L3.L13.L.L.L17.L.L15.L.L.L17.L3.L15.L3. L5.4L6.L9.4L6.L2.L6.L.L16.5L6.L2.L6.L.L17.4L6.L2.L6.L.L17.4L6.L2.L6.L .L6.L9.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3. L5.L9.L3.L5.4L6.L8.5L6.L7.L.4L6.L2.L6.4L4.L.L17.L.L.L17.L2.L3.2L.L3.L 15.L.L7.L3.L14.2L3.L15.L3.L5.L9.L3.L4.L9.2L3.L13.L.L.L17.L.L15.L.L.L 17.L3.L5.L19.L.L7.L2.L6.L3.L5.L9.4L15.2L3.L5.L9.4L6.L9.L3.L5.L9.4L16. L3.L5.L9.4L6.L18.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L9. 4L6.L6.3L6.L.3L3.L5.L9.4L6.L16.L2.L.L17.4L6.L9.4L6.L2.L6.4L16.L3.L5. 4L16.L.L7.L3.L14.2L3.L14.5L6.L3.L5.4L6.L8.5L6.L7.L.4L6.L8.L8.L.L.L17. L.L7.4L16.L2.L6.L.L7.2L18.L.L7.2L6.L11.L.L17.2L18.L.L7.2L7.L10.L.L15. L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L5.4L6.L9. 4L16.4L6.L3.L10.L2.L.L.L17.L.L15.L.L3.L13.3L3.L15.L.L7.L3.L5.L2.L5.2L 3.L5.4L16.L3.L4.2L.L16.2L3.L13.L.L.L14.L2.L.L17.L.L7.L3.L15.L.L7.4L5. L10.L.L7.2L8.4L5.L10.L.L17.4L16.4L4.L11.L.L15.L.L3.L15.L3.L5.L2.2L5. 2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L5.L19.L3.L15.L3.L5.L4.L.L.5L6.L 7.L.4L6.L7.6L6.L8.2L3.L4.2L9.L3.L4.L10.4L6.L3.L5.4L15.2L3.L13.L.L.L 14.L2.L.L17.L.L7.4L6.L8.2L.L7.L3.L5.4L6.L19.L3.L4.5L6.L19.L3.L5.4L6.L 9.L3.L4.5L6.L17.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L 7.L7.6L6.L5.L.L7.L.L.2L18.L.L15.L.L3.L13.3L3.L14.2L3.L15.4L6.L3.L5.4L 6.L9.L3.L15.L.L16.2L3.L13.L.L.L14.L2.L.L17.L.L6.L9.2L.L7.L3.L5.L18.2L 3.L4.2L18.2L3.L5.L19.L3.L4.2L17.3L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2. L13.L.L.L17.L.L15.3L3.L5.L7.6L16.4L6.L9.4L6.L3.L4.L6.L.L.4L6.L8.L8.L. L3.L13.3L3.L14.2L3.L15.L3.L4.2L.L7.L3.L4.2L9.4L6.L8.5L6.L7.2L7.L2.L.L 17.L.L7.4L15.2L2.L5.5L6.L2.L5.5L6.L2.L6.4L6.L2.L4.L.4L6.L2.L6.L3.L4.L 7.L2.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L3.L3.L15. 4L6.L9.L3.L15.L3.L10.L4.L3.L13.3L3.L14.2L3.L15.4L6.L3.L5.4L5.L9.2L.L 16.2L3.L11.L3.L.L17.L.L14.L2.L3.L13.3L3.L13.L.L3.L14.2L3.L12.L2.L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L2.L5.5L6.L2.L6.4L 6.L2.L6.4L16.4L6.L8.2L3.L5.4L6.L9.4L6.L4.L4.4L6.L7.6L15.2L3.L15.L3.L 14.2L3.L5.L8.5L6.L8.5L6.L5.L2.L10.L2.L3.L.5L6.L2.L4.6L6.L2.L4.L.4L6.L 2.L5.2L3.L12.L2.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L 17.L3.L15.L.L15.L.L.L12.2L3.L3.L13.3L3.L14.2L3.L15.L3.L5.L6.L.L9.2L3. L10.5L8.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L 15.4L6.L2.L6.4L6.L2.L6.4L6.L2.L6.4L6.L2.L.L.2L.4L6.L2.L4.6L6.L2.L5.5L 6.L2.L2.L2.5L6.L2.L.6L2.L4.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L5.L .L7.L8.5L16.L.L17.L3.L15.L3.L15.L3.L15.L.L17.3L12.2L.L11.L3.L11.2L2.L 3.L10.5L7.L2.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L5.L.L7.L.2L5.5L6.L8.L10.L 3.L15.L3.L5.L9.L3.L15.4L6.L2.L6.L.L7.L2.L.2L.L.L2.L6.4L6.L2.L2.2L2.4L 6.L2.L.6L2.L3.L2.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L12.2L.L3.L15.L2.L6.L3. L4.L8.L.L2.L6.L3.L10.5L6.L3.L3.L10.5L7.L.2L2.2L5.2L2.8L2.8L2.8L2.L5.L 2.L3.2L.4L6.L2.L6.4L6.L2.L6.4L11.5L6.2L.2L3.L5.L4.6L6.L.2L2.2L4.3L2.L 4.2L.L.L5.3L.L5.L2.2L11.L.L.2L.2L$M37IJ46.pAKpAKpA7K! golly-3.3-src/Patterns/Self-Rep/JvN/partial-constructor.mc.gz0000644000175000017500000017620013151213347021112 00000000000000‹A UQpartial-constructor.mcìý[“%7’&¾û¯8"ó0Ì’m¸]-%›ÉÊêÊڬʚLö”¬¬ìƒ3ÂIzWDx´»™ì_¿ø>UÅÅΉÌê™—•Ý%ÃqÌ`¸(€ªB¡Pü?ÿÉÿ¿._üðôîÝ/ÿuúÕÝÿòÇË?þôϾÝý/ß\ð÷Oï_^ß\î?¼½üËýóëãý»Ë7O^^Ÿ?½y}|úpyüpù©ÿüóç÷÷>\|ûêåõþõ™ÿôðîû¯þøðñÝã›û×Ç?\¾yx÷îÓ»ûç˯?½>½¿½·j¾yúøËóã?¾^¾xó«‹k-}å.ßýrù×Çwïïß_þøõå7ŸÞüÛ»‡_á/ü÷Ÿ~þîÿöæþÝÃO̯Ÿžø[«æÛûlÉýû‡oûßë ªøõÛ^þ¿|}ù/OŸÞüøð=ߣ­/—zøpéiz³ïŸ.½ˆÇ燎½×žø©7áñCGÐÏOÏÿ†ž¾¿þ׳üÇ—ËÿÛË÷ï.Ÿ^Ð}¯ôýÇûçÇ—ŽÖ^ÂëÏ—àòyâ¼1tÞ :;„_^îß½C®Ÿ||ó#AüîÓã»W)¨Ó[ÞËÂ;Kè5=}@µ_âóËÃsùî}vÿü|ÿá‡‡Ž³7ožžß"êõéòúóò¿}üþûŽŒ¯=Ù›_Þ¼v\½»||wÿáåë¿€HÖKëyßöâ>¢Èïž^{+¾dÿ¼}xÏ1¦é¾cç野 —GÁÉ›û÷ß=¾{|ýåòýóÓûvzšÞ«ï: ÚÎm¿Y†î—¨õ/å¼|”/˜šGÃ~ýöí#":Ιܺ´¤7£#èÇÿýÓÃåû§g-öõùéÝEÊþÔ±òÃÇÉÜ ¼½ô1"=ø©÷K/¢Ï®oïŸß~‰ìïŸÞrЯ/—ßÞ÷>dzu÷ûñøá…<~xûð±zt– …#¥§’ì/§<Ò/Oˆû¥#¼cæ¡Ãÿ‚¡€ (âçÇן>½^><¼éÓÇì;$ýô‚Qbuÿø ûêòøÊ:Žäg›d¨ìçsGØOoŽÿù7=§8Çt¯ 3¯4táSÓ÷/ûàC´ÞA%¾{øñþ§Ç§çþá—èOϽEïz hÖ&£­üðh]Îÿ¬[·~9þ™ÆnCÿûÇç—×½€Ž‡ŽÙel¼Hg£Ø Þšç÷_^[4îáÃ÷?<,‚†É8CÓ>õÑÙñóòøhÔ›ç§‚Þ $&ëåòÏ}Þë ¸Ç(ãáýÇwOFéGFȧï^~yy}x±þòæùñ»^«¶Iÿ¤ã•óe Œ‡—N×äc'ËÏÿÉP†ÿþ$0~c0þééÝ'™Oר‘ÿþt¢Ÿç5 5˜Ÿ>lpv ó¦#¬g}é5¼ûÔÇÔ+?1"÷æaÀhe^üqT‹üý§=<_þ„ ÿŒ‘ù›_;w ¿ý\þkZ7ÿ÷^ÅÛ§÷–ëwúÍ?åŽÿtq_µ#µš¿rù«4¿„ÿti¥~µ~ –×FØýwE}øwpŸžéó“xøîÝhƒŽOã`lsŸl_?÷$(EYÐÓO½;•!zddõÑŸžIx€Ù>¤zWÿôðîé#Xhï'R“161*zÙ??p®Û04_õõ7ã|z½:zùÇקNù+½õO¿ûVð|ùoOŸž{ÆQäoŸÞ=ýÐ[ÿ¨6ÂîW—¿¾„¯ò×íúçË¥c=¥ôUJÑ#ò·_!zD¦cEô$ö½-ï=}t¼yxþļ}xíÓŸ„t°‹Ž«§F6ˆ¨DyËŽPvPç ÷_ÞS"J^üðŠ‡ +bA˜òßáÓ›g!ËŠŸû­ö/H*:£xüÞhÅO÷—žŸ~~ýqôþéùã@üÃËc—z™ï>±³>>"¶ƒúò+ãÒ6†þ¯ôèÿ™¹÷»üæ›ßõ‰ç|'!ÿ²äTþ{³~÷áµ÷‰AðOé]‰ßŒ²/);Ð(  n?àëUÆßta§þ}¬ÿéã}oÃ%}U.èóP­[æn«í«šrú*„¯â:¤˜ À[éV¼µü·ÌñkÉBÉñ‡§uìr߃ÿð`2žŠNÈÿ}‹ï{þ4ÏqÕó?@ˆËQ vN]þ÷O]Þ}aƇ?\D2SgY/ý P Iý –m‰OõÞ?¿¿Í„´ãIžHìþBQ¿ÁÂ0ò7@”Ò¨.þõ2@Â&×{xû¥NÊÇï!Çüü)d~zúôî­ŠnXKu±öÓ›‡À‚•^ϧ>û”™5ö©Ë5“I!@¤ÈØSÒQÖòû4|Ѿë%}ÿéÃږ뱂"z{><½bñ„ WJ$±íC0ñ ”zz~è²Ñ3ŽÖRÞ)â$B| ŒüØ™ÎÕc•@§^Ÿ8ëQ†‰\£våVÖ€ûËw½¸N:‚¿ï£çõòd¬ãùÕ†Þ;oép<éÑ":±î²RïJp½%^>ö©!¯“5¬Í€ÿ¡n}Ø|Õ±/È·õâ>„ ¾{|ÿø¥Ãö›O¯_^~×ÛÏÕúç5Sý{Ä=\Úz[pP>ÚHÞÿ« §ó¢F‰­K¥ŒT©dáÉ ß9ÜSïŸ÷è.ï÷uÖÓóhÐ>ÿuDlOh÷Y×ñæÍÃÇס~á„{x5VýÒ¥Ì;°„NC)|?üÜYAoÆ)iÐßQ„HæïÓyP¹ûëâC÷§ûw²Øï#ø¡Ó4*B?¼¥È3ZòwShοuSŸ<ïž~þ’:š·O?wVbXõl Õ8èIá¯ç®eª·æÜÿãï;`°!òm¯å›5ïY º’Œ¾érë§‘„³â¿ÿt¹ø‹+\–õeqG¯IFú_OÒÈÿpùðéýw|ˆì½Œ‘Ì?|€’£Sƒ¡4¼âà=ÿ%ü»òÿ汑Ï[¨ÿBYðË"|€÷âµì~ë˜ò7™øç>ìî?üðîAS&Wÿ¡ƒârËÿzùb°™/E>|±žúwþÀ­ßýò?™ùJ;÷1FÒ>ƇèŽU•ªK>üôºÁЇ÷”_¡"ŽL>P×øÁÖ¥(å‡çû·ŸÀý0ä —T@ø”¨Ô(K€°}¤,?…À.Ò=˜$ò¤øµS³aúd Ô“¥ô¢öÆtò=ôÀ«dÑGË,µL»«ö.Âwú†¢ÏX½v¦€¯}æBsù倾ö¶GõUõ'‘Msø)´¨Ê6%Ù»@Ða…'°¼öõÕ;¬ì'EYŠçdïtO¨ÝE*â¨!x÷ ºá†¶ ˆ~•Ü9ó†ê¢ÆxÁÚæËk’Bpû#t—*A>Ü¿RþîáþûŽŠ>ôßPÿÓã(so˜íù:wBH)¢Ôïß}úþû_”q¯cWA¶ùªçIåîŸm-zyúôCgì²¥ÀJúÄúôîEeV |”ˆÙ{ÀÜwôµËÿ¡'ø/ÏOŸ>jiì<|x™bn6®”ŸˆÔN>APéüÔ¥hï»äÒáûô²þM{Ú!úñ^¤‘¡¨ðoñ¾}ùHÏ¿}è|A àN:vÏç‡Î1DeMAFâáëýÓlÜ#tÔß?ÊÔÿ$úòû·o!QÌ"П^»¸@ÎÕ%º_Aª»Ð5ªf³aú¡¯B*UÑ9+ôrÊ÷•;}ÿòã@ÄŠ%}¬õ9úüÄyÀýˆû÷ð_w˜öw¨š{ˆY¦T~édC0.Ìßz‡òõ²`~xÿøú*Í–ÎþRxò/ïÞ.,— Ïžú Z|fé“í=÷ðFy-zƒÕ¿1å.Ô­ö§®d.]€Ã$ï)Öݼ;LÓëãròÃ[_b1ýéùêE_G?r$½˜àLö¹ò"Ò‰4õ;*±Æ²°‹/Ÿ8)·š]¯¥j ·¡{crb¥7yê#9Ž^攡8üÎFã·ª5À µ}¹ï»ðü–¦ožÞb§szìHLEçw]>Ò2î_ ¦À»/ñ ›"9 EO*€æSìø'Qã\~¯`~Ù ÆåÛúýתðž4ˆurwªo }´ CK‡Ð6èt™Ñ …pÿt­[T¶ÞSrüÓÃ/÷2¨8¨Em`ýó¯à̲’çžÎý28€Ø>L¥…Ö²ËßþþW«Ú b‹ö 2IÕ·¿ÿ_- Ö×2©Q‰ŽöÙ£°ÚËÿxx~"óoßþÞ²¢ìûw¯Ø|üòòß>õaqÿr•]¾_¾8Ï”_IÅ?>ýÌeä_àéÃÃgëÇêä¯Á°¤¹|ñáéjÒ”?õ&ö’¿úÛŽÀžóWxêXúÒtT­¾P |ÓYã\Áüs'…J§:§¢6Ö†Ê;ÕV+Ñ\Î~˜ªÞû¯eˆéÚs£eS» 'ÉøÝ_Ïx"!’ïÍ×öu¡HÇö*QË^îƒl‚Ð/ß©[u˜¼c– ɼŸdA'¤ê“aúð–…}ñ»o8D˜ìŒ¾syUìtòþ(k¶o¿Wõøòòi“g{Ýî¥èzúô=·iXu‚'â=)1ªÿ†ûou%܉b'>ÂWæŘyèI®à;ÄàgŠêob&$´x'[¿¡@ ÔÁà¸~¯ã²¤ÖWÚýwO?ñÙA÷ÿî_­w¾þúk d eŽäþî>~þCÏ8ö~ÝIÖõû—?Xî?þǽüˆÕ9Ñ_ý°«ôÿêpæ°{yz‡AƒuËÇOÏŸt©oÃÝ6ˆŒ'ýcÍ$?’T£_ÿ¥š¯:ª>×ùÝ„SAÄZ/ÇW×2ošA| ÐC)fRÌïŒ+¼\¾%M|8dd,éØûRºÆ»i¶EÊÕñ†5Ñ;(1ûîc=>k…¢YÉbl­‰ Çñ:Ô, ébíu"‘V¿h6Ú÷2%úNE­óðöWä郒$V¸›ø\I"]â)'!›âo¨ØPFøòé™ZEÃEW,ÛoHâ9ÕzÇ–*ÊŠ~º|‡íàM~R‘ý,ø_KOº¥Ûë “¸—½¡›Ê.µôô˲9Ø9Æ6¿ºÀDò¿ýûöá•Âë®tÀǯ.¿ípüáûÝí+Èõ8Ü1̲ð̃qïD!„zž©¹ìAL§'éØÜêº1«ÔÐbÉ‚aÑ`a%ÑÛ¯¯A º^Þ÷Bû°è˜í}ÌåÀîžÿq£§‡:<“eëŽóúå3à£àÏ5¡K`€ÿ{üw|øþkúÜ™Ùý§¾¤~XV2’ z×%˧¾ŽéãòÜÈuù m%rd¥±¬cngb‡€ÎP/OƒžË°J¼\~øZlJAËVq?v™ë¬µú§Ç·oß=ü;•“ÿýäÿoh&ùåh&ÿÜÿûÿlÍäÔÎñ½ªÌw¢mKT Ùõµt$‚d:ÏßCú¼m^õ¥¬áEF{/ƒi«‚”YÄIUBê m{¼Á@nñ)Þcíp¨éG4Z³ïÀ¡ßß¿ªÉx¯ú<ÑZãȯøupˆ¶F˜³y¥âýKüpÛ˹ÿ°’>(Ï~ø³È)ƒ»qÍ* îu°?WݼîüÝ‹š£wÿ㻇ïYÖÛGQ6¯F'øÜ ±¹Ñ+üïþí»£0ýå1ð7Û&¤0Ðů”@Q¨è+Ê—eQŽZþ ¤î ï¾ú³pÅý¥ª¢íùêGj´Ÿž…O*y­¨¤@þ=€…‚û‹+}͵q†²"‘¸´cÉÀíîo©×ý~C'¹iVv[‘äß^>Ë[Õîèã»{¨Ò_>-{œ( •.y×nýC¯–©85ŠÓé¾ö¸êź°ùQ&ýƒÅnk8‘œÌfCu»f"ëÉ´‘–V«Òý¿%«Q— —Âtm1¿@g äaŸÚQ„õýãeàõ2u»èøÃ£… Î“ž¦¼÷ááçó†àdŠ¡Wu¿¡­öÿŸþ/;|ÿôÓýØÝá¬~ÿôÊög[7|qÖ&Èzi–8Ø4°2jvÖ`J”{³¶_7ãí«èÓľöeOrRÏÛ§öOW«‘evs[åü÷O÷oûÜ5Vyb¤öÕ}÷—ÿñËO¯ÔÃp¸|ŽóÞX‹_þÔçûW@Þ+­Fž6•õË_š9Ÿ™Lºœ:ú—ËŸ¾Õ>ýÓ«Úþ»L ûïŸÄš¹\_QY®ßŠ |+ÏžËõº~ûÍžk[ŠÝÎÕëúæŸõ(Æ;ì…Ü’£,ÍêØ¸ÿjû­ËýøïÊÚkýÓOYÿÈ-¾¿–ÍüÓß²þN=+jýý)ëïÁžþJVÇŽüƒµõ¶^»ÕØë¬½Ö?üñœõVc¯²¢­ø»sÖ[½ÎŠZÎz«±ç¬ì×ßZ[+*›Ýzùµé¢F^ Ý?îyoöë¼hí­µÐÛ={#o¯÷¿ÿÿûÿ¾æ½Ùµ3ïÜZ>(&Ú7§åú_`™»yî½pG1v¸’¦WÔaª+Ö. ½Þ«#ÕoOßïg.þðíå?ï\kõEø·\ëÿç+ý Wûøø­•÷ë—eßStתø} ŸÛêùò†*DŠ»L`öž(à{µ‘…M#÷éEQ9 •y–æÌXÿAè÷(êÖþ–D,¶C_²èÚ¾´}g•¨‡í.¥n)ÑrQ,ÛÕÎA5šVm)MTäWêVÛ¢ïÒboÛ{bcÍ2 b,61¹Õ=ä‡éüšL:Ôó‡·GÔg­pºùÔ…Ë÷/‹2ðlza-"K.L{µœãNXÏpƒÂú›µ£‘MiÙQ'Õ¯÷?ß?CÉó›{ùÇûŸÐ„Q—vßôUR¹ïÁé:+þ¯"<¾þBLþý§wïž_U8¾?Ÿ¹‚2·˜ï»Dð“h·8ºÞ<½}K^Åž¾Çîåg¬n~TÔ—Çÿñp[Uz:ø¥ˆ‚r‡æ‹‰#³0ÚSüJ•¿f7(¶7œ>ïÅ’^ľâ:æ[…_© ŒÇçÓ±Œ_÷dX޾yúøøæò<>pOg? ‹ywã<Åï~ûÛß1ÿG_¾]šÿòòÏO_w™üËËß=¼y PÝ;)Ž–ÿþñåUö°ad£ÒWG¥µÀá]õ=¾¾#ßÿ2L¶t’¾l:ã?HߨZDøê÷›ÅøéòŸ¦®Ïþû«g‘… Ûß߉‘ü éléàk;{±0ûz;{Õ…éç_Îävùïï± ûǧŽÊ×Ë?Üz™gÿ »OÏÖ¿À^ÇåïaëõþéÇ:~~ùȽýOHøŠƒe ­åT•ðí/}ŒÿúõõþÍ¿õOÿòã//} ýòú%Žt¾¡Y26 ¾îóñí×µz„q6ösÍûÍ3lë;îóûò¯ßÍÖý+4Ïbj÷á—Ë÷´¡yzú·(”S¸W=ÖµÂïž^ž>þ(S~;HuàïîŸ~„]õå·?=½û‰¨Eþ»ûŸßö.þøð³åø ö¿PÔ") à…Y_~|ÔÆ¦^ U²<–Ì?«Jƒ‹¥Ç÷´¯îÂîû[|ª•!w¬„‹¿ÿE‡¼X”tÒMf¡PP3ж ÞdO´ƒ!®Gy¢zvªýú  =±÷ô$›„°³ñÌœï ±l"~íE¼¨%ƒ09ƒómÇ–Ió `Oóô²<£¡>ýôŒC*s|Üë‰@0í_Ði0ª¹5dìÄüoßþÐÛ¬‡æÏ[!¿yúðáñáògý mµ¿ø‡û/~µz 0r.u¾é͆ñóV©Õöëw¾Gë.ì?Oï>þ¨å^;ø‡ûg9œÿ[éB ò_%Æß?ݳo‘íÕ·?=ñLÈó»G(OÁÉó8†€ÓÙ÷?uÌml}9wø?­oùhŸÈÐÀ>d³ãUy£‰= ×ñDQtäA–Ê7vo\>ó­,ŠÅE³Ì´gÉæÒ÷‹õú¸±j8hÌU èU=Üs×hØÛ}}¡A>Obˆ‚Ö¤=Ûý¡êpêì’ÿ4”@ýå=¬p†š%|?üoñWª0²ü)Ñ-Å?½<®²ÏwÏh¡’ÞÛÿ·lp_(±Î3jâEÏððo_™Î™r1úîIùßÿ¯Ö¦ùrÿ–ÆE2è†}âðåð$ã7]®|3|ìZ¢¡/ ~ÕIôó¿q îd÷qQùÏ]KÕí¢)wûÈ–i;}kìÎaùj±£þÐyÚÛXügõFòÍTáôåw8Òü·ëä§ï,å4ü4ž6Uçå¿<±íª|‡#”½Þ!XÈ=Íü>5ßÀøõÝÃÛþ=ÍzJΑ u•XÑÑ'$ä"f󠿀~|M¡9ûtÄÝPœ]9øZHI¯çc½çdZL•xåKX—àèÐD’B0§ïgHÂOOúÓýóãÓ§³VÞ2\¹-àò‘7 KþøÐY€¾Þjæ—Ò¤û·²³&þKÞoœå¯m9];hù_Ù7µ‘ßÞƒ»÷ÔÊôìß~ó‡cÒï?½~â0ÆFÓ[c½T…ñÝÓÛ_DÔÿ g>/v¼êë}Gå«d"ÄbÂ}±±Í@‹RÖ,ˆyøñEǼÿôîõ± ÓÖI_ˆQúWo° zÓÜ_¡¦¸zÁÙ)Ni"á±ËÖ(îòHWß>^ 4þݧ±ýøóý/CC¡ø'‘ÑÅþÛ[[+²–~ºìðüù#ÜLÀÄE·ûh`Å_ª¯~TÅë—f¿ò´zɳ %›aº©H팫È57üwvõKì¸â¸þkØÞÀA Ʋ³»ë8—Áùðp¿(Ÿ€FüËãŸ9 x1U_´Ö9¢¤–Ï]B#Âî»XO-‹Í­ì9b¿QÆšî9’éX•©l'}B¥žTcÁ‰ò2DzùxcŒŽ¹1ø„Z-‹`Ð…¢Ç³öÆ43ç]ƵNØ£êÔƒ#æÃ8±©"TóÝ㫺z¹7¥·>a5Ù'Ùïh×ô¥²³«÷ågö—2†ú燯lÊÂv»*#lŠ>̰72µuö½á Nlú©­/wíúµCˆ·O¾¦¯úrú‰8ü†”ÿü•ôx»nKtvØ%.¹ØýËÉ÷/¨—ˆ_­ñLÿõµt±8Œd9ÃlŒ,Ä2‘g©=‰Mš*ZÑ'¥æb‚L]ÚT]Š—©u›ôovj2òxúðÕÃû¯¿ôÎí<ÍväOåa,£hY¾9pÞõ©ÿ¼ípISHPåÐÌwhãë'.pÞ>b»ïÝ/r€%|úøQ»K!7º^·§¿Ã²ñ'ÅgžU•yò•yàš^‡dçÞøâëÓG¬”Y¸´Žš¯Å–Q•ñÒã4óhÒßÐkÎs ¡ß=¬¦Ž]`ÿâþ•kÚ_íFŽ6§éÔ‹r ÿ¦ä¿ó@%Ý—²yš´GdšžZéÅçL(Dˆ„LFÚŽ13Œ?^ºWö3Ü]‘*¦AÜT;ùgñ7È#TôiY†WC¢¶ó8zù('ÄÆ¹«á3ì¶›ºÿ ‡sîrðŸô±áÑóÑ]¼>ùþø.ñ.jž¤qqÄ•K¹K|Ê—z—5]E·Q²söÈg)Èù‹ öÎoÐ+Dã[¯8£bÔñ8Þú‡pÉ=,—lc=µKVøceô,Å2úãx³2Š¿” ùò1ò!ešùÒ|ùzÉEë.=IÕùPú¿¶t¥â£:”}¬è¨@G¯2&íKýŸtXž^{eãkîÔž­‡˜ƒ‰OœŸ Kí%4{nx¸ZÿçtžÖþ<è ÆŸ>fô-^šQ™–ð,¡åK+ö\ð,Ô¡ÕKkƒî¸ãPÊÓË_¨š;ü˜Î¹#j9xN3¯Í)w¢Rž+ò܈¡g‡ÍÇ%¯ãoñ6‹Ú;x–PÚè[ÁB]§t­¡eÞr0sMŸ;ôJæzçQäȸŒ}äþWû?ɃPZçQ`ò!Ï„@H‡ÏƒG´‰ytÛcœ €èQQ'FTÜ ÍSòÔ?GÇF¸Nö„Œt ýq-Љ¥Œ¼”e|B‰›üÓ´ÄÀu‚È‚]§J.ö+ lT'GÒ¸Â7/Tß9£”.‚ ‚ÈŘëTÎ~Ì=ùêȇ¤mIºÌnbØu äR¯µS³þ‡¾Í˜ÉŠš¨/½¢Ç>/V¸K™xôú%/)\ª‚ùe…EÿPRÃÐIÈÙÓ¢¬<{ÀØ;ÐðÎzrËŠÿ,LÜ‘ ¸œ,½;õSŽú[Œ— F‘07«Ì©¤h§fPW´Ssæ›Hp+:™$p@ÓÆ÷/ wã›þ–S$7ku¥è_ÅP׉±ü¡,Î<`¥ÓXWúoåÌjôö4ÕëßÁ4&.½k‘£ÿÖpBØÀAMö{êU)H%j9a1XÕ¶Ov¬S£§m Ô'¿ç¡Äú\ ú‡çh˜.Çš 1¨Uà Ó2$;iw¤»NÊuH6ûkø[[+mKûýáúIªŽA_dpù£ÏÕ#]†Ü§_,•«ëôúû£Ú´Ôø —*úNnýA‰Ð9íˆÂ7OÄúƒ"#åÜXV be˜®Co Ú»Nó:{ð-ô¿A´M®±M‹;kzäýAÐ|çœöVñø»CÁUþ<ÒŒÐDd¤‹wYÞðç%Ækë ó=+oó$´Þ׉Zë$¢Wi‘ò¦HsÐ>u3¾yéQ´CX$ð€ ˜&YÒý]CÔ"(ø qUè& ãOUÛ!Šœ) €|c¬~ëøé|—¢=úŸ3&¸ÓñÓ;Sþ𜘆߶\ð~.†Þ¹…@Kļð³ð/a,άl‘‚&ÃËZÐå;!ò)Š £¥E²<Ú?Þ$«O¨°èoÜ&uÚìG™Þc-ÙAÎŽi×ÂŽdß‹|Ï"†ù,eˆ æ)xr äJüÑ E¹h+f ™ˆ#A› ÐN-b}— Å <ÅÞ O3œ½·§`ˆ¯qkÓ†<²dAA)£È5¦Œ˜"1œò3WÄø‚·ÞŽŠ¦Ûr¹‘¦išÓùFoyÑ¿Î_|åÌ ÀrôgÒä­v…°híy-¹±^jÿ›i&ÌQ¿ã¯çlÇV{ÏÝÜU]e«Ë¯å4Œ ,©ãV×h)¿ãÏy­«á+"¶ ^ ë"QD©óEßùù[•Õê²R…×…(Âpx#øºf?D¼ØZ±õ¨ÄtÌÖ +<Û'”V‰ VWú‡Î!Bç%ᨲ†ïõš,Äœ]†ý4±JX4}éƒb"¿×ä¤#À´C~;!+ë˜9‚Í þµ2EÿBubJÓ®ðxéàS"Fg6úŒ˜rN#ÈÛZS¶iã׉½€lÚ­öÕMˆ(µÃëU9;æÜ(ÙËIÐ^ul¡}lhˆXH¡†ÞšÁ"8tÚtqmFø3 ÆwŒJ¤¹O9“ J]Àù¸Ù®™ËOÂ'¹:7 h×lEç{¡§ g.t†ƒgƒ¹œÓäëºfLÙjï0—æ5Í^N±\=&” æ Õa‡¹·4°b¹-C4Ïá,¬ç°­e¡z]¡Ôó2`Y(Åey:Ë `I.- ¥ ‹¤þÅŸJv×ð䲦©i­Ý$c­«ðo.ÊBEl¯¯B­U—WèÌ,ÔvÕ –Óÿn”Ó@üyQDC“¿[¹þÖÚhx¾Ã˜A{ªÜb:7ð”C9ÈÐÀ‘F·F:É´D4¹Q>üüíƒð,„JÛ#øPï‘x€¶G.•â‘õ;ã1Rùý<Êʨ×–ÝN<š«s¬€ õŠ[3Uª§"tjýÖ÷q(§lG_ò¢MS-^täÞNÖv¢R“Þ”cHÔ#«°èXÏP€9âI70 ›E±'pé&Цˆ{ ½L¡ëGã<¾·Ñ"Q®ÚS™B(v¤iwB×C ¾§fI x=Ès ‰É1Ýu ~yúC±ß¾r­´çTA7Š S¤»cÀ¨œ¡˜÷¢ó‡ÏSífK\§Z 0Dç˜4}8–ôTØUÍ@}8FÕÚüUÕSŒ™S:F.¤¡ H"ž§Ä&°:r¤ù°|Ç •_4â?ÿðŒ5D iQRÚÐÖ¤gíHa°P=Ñ1àEÓ·ñ¶ нìæw…º§ÈAþ&Lhr”ý9SW×µ#xêd{ÅñD³MAâƒê-USÌwÔÚ¤r üè_çýïÜ19«b ŠÅ¼r» ½â}ÖéÊ-‹VƒBYM,Yÿþ€–Œï½°‚ÝN,¾aºŒé©;ûiEîdx6©J—฾Ý56Hö©¨%ã·¬¥j®95m µc™š:jš“ 5îY†³À[°8ZÜàè¸hh/ »ˆ üz¶ôxFEb°ÜÁˆÀ¾"5eŸÕÅ1M‚–Ò2ôŽCÏ–Žƒz¶t g V„SU=%(ÎEQWnhÒ‘¨AJG¾Cê@}Q‚ÍÇ«…u9-¬ÓÑ®–ãkšÔ4–f£æÚ«å޵äÂV×X«r5]ñ½ÿqAäPªï3.o%Ÿ×à=\o%Ÿ×à 8ðKöú‡õ–[V¦©c.y?ZzkÅÝËèqÃÆyÅÝ¿÷¿¼Öå±®([ÉçõuÏÑÿv<Ÿ××ýû%·–°Më×Vxl°†>2ÓQ¹¾Nè÷U'LR‚Q.ûºF:”$-D|©ÔI«ü¡äª:á˜E'¼òŠ…$¨ì@ë”&#5kÁ¢§¨¿a8¤N¯vŸcdLÓ˜ÈòÚW¬²ÐWÖuœÈ[¾sl£¢7€¾Yõ²SñyÈJ؉rÓÇ$ 6y ‰Û׊BN³De5ÒÔõÖU7I­+‹È,"aØE((ýhlÄ·Þt쮓ÈþczØÔï|:uúš²cŒþõ%b¼€­À/oY$…DªÚ”G åt ¬š(eBhŒª.MPNÿ¹ŠpaÿÆ›ž@ °mýt+t×ÕךzA4 ´%c]ªég‚¼%@Ñ^ÿ°õ^TÖ]þT5› Õ²øÕ*½Xp«#Žbƒ=­1–F~Qu…‰¾à™ƒ3£‚ŽÊN³S%ÝÂccüPúš:i›jÕMSRj‚ÔûU"›j"ÛÜ(R2žZ“ÚUÌZË–'"ó÷1LjAYøëíè\)µ:Ѹ€š ª}•¬ òá•åÎè÷ ¤±jG%”Ú3Hûb(“ ®1i>’þ•þǙԹvê|3³ê¶VTâÒⵜs ÈFîH—?ßÿÎð Åx…ðØru˜ x8àqø }h‚éF§ý¹ÏÍLîe%ï}²–|ŽJsçHòSÏ9F16rá9­vn‘}^á9aÌ_a̯ëüGþzYÜ¢Øk·’1ÖŒY®.ÂåVx0TB¼lc}é—C‡Ë W^‡tù®öÅ8ä3ÐUXäšae *8>EYîÔ s%´ÝÔ&s[×¾r!2^MÂ4#%|ˆsU¢«–Þ¸˜%Dóúóòs¡ÎûrÄoo ù〥¬Å§CÑeŒŸ; àß,°³(˜`ˆtÙ›; Ì)Ž5æÌŸåïFþ‚¿)Mþ®stN”³YåÎÍrçBEßð‹¶B#/°ž Ó™ÄvÚbŒ7Úk &i@sæœ_ë´gÊy4u˜Ê¡McC–UR{»¨(‚7©n`º m_ Äò5ÔH`䯤 ÆiVZúöhøëo/äJ6Û¶¯ðï:Gç+¹Ž¾Ä\£˜­Xþ,7ò÷´Õb€:š‡YqÇð–ñ•SµDQ™´­§šß¾rTŽ×>X&²R‹™ØX«ë›bé×V²ýYþ*cM¾³¨Ü‰@9ŽÙÙåp³³K'pÚÙ| "DˆpW•qèUàA˜b(#OÄ1]Wéd©tVR¸ó"oø«Œ‘¼‰a!1£°cÂŒ´Óô{«h1‰â`qèû_èãõ/2&õšzC;k(…²yÃ_f á QÈÂÀkä:Zùý¯—å3Í`òZ#¾÷?1ÃKM¬ÎŒu˜X€“›Óbˆï 6“y1Fâ Ç*©~ÿZ™Uáé;йâ• N£œa䲿–ÃÓ>\J€±&xFé<°tþUº WBÜšçµy š–4¨CšœoAÄ1+<ÍvŸîf»ò•”Å\”×VôEPéÓ¨tQ"´¥/uŠCKûטuØ´Çyˆ -ŽßE¬GýRçaƒ-ÒæälhÅ&C+ù'}ú.8¹:‡™F}ÞòÞØÞ„Ôõ KÙä“t*òAéÄ®ôõÍ‚¥„²o‡;û»¨²y,´¡–jo yN’:çµÖ ‡A¶ÀÑ!Ïí³ÐûYOU©J|Žªâ lˆi]Üÿ ’QlG l„¹Ä®N¯ÿª¦ Éº­Ír›6«`Á7¥ ü²êFýVö.‰^*ž4^¥ùëЗê·ϘUwhºÐ°`Žu›ðÛ¡ê,¶ü·˜E9,¥¢ô]÷0réB^Õ ¨ ‹#˜Ye×a x:ëÀßÔe–Î xG_jà&„ér­Œ-2Vk’¶ÍrZÑr*þÐYGuâ«Y/Ê}é˜ õÞØ„†Yœþj7ÔC´äõ'¤Wá 5lú”ÚXÿ[*Vá¶•yKER1^¶*JF¯Tçøg‰`»¬ªŽekƒªò^$é¾…HT*ômup{‹\&âLK|)¥—ˆV£5H§‡ |^öˆIoVÞx–}©èÍZqa1A¯[\ý'ÚFP²ú4¤°p€¥qÁÌ´>Ó² CáúÌN ¯´¡aUÜÓ¾¿À@gAÛþ¼Â駪¹œìx9j›¸÷¥h½ãh]Cöì•‹³¯–½µÌؼçˆfƒc46W Ô ¡Fnômvn”6IBVl“çfz^(ºÐ€ˆb{a1/ÆibÈÂ+5DÄÜö‡f”©W ¦ƒ°P“gQÚ¦¡j±ö^©9Õ¾¸©)Þ"Íík’>¬ÉpÚÓØ³Â*G¥áŠóXÈT<¤e‡ ¶q1¹Æ/ó4ùëIû—Uþp"#‹µjíg.IÝÿþfÚä2ÍRW¡ )s%ýËøC]9êNr@7Pû¬•?@P×ÚµäSíbª:ív­vÛ+Øk/^j'û©ÅIí%Þª½`]1¾tQÐ'µE…æfÒ¥Ï,¹Ru[ Õ·+çÔ†*Yt9x¯˜îbjâ ¾¾éI+4q$ÐÄQ+Z¡ÃèÝÆ¶ˆ’R¯…ðZŒ´ VÑlWr %aK.+gRQ¨­k;„š6§JêZEI]›mQî$ èÚâ¨K¨è¶N©-ÓZ™ÂÝÝHʆWÎf6ºQ9Ü«*+¶0P›)ºL Ùyí€5ÓLÌ9Æ/JµÖF+™5ͳ«âZi`n¶Éžë©®]ùx­xk°aàyĽ®)\抷ÖyOã:jÔS—5Rë+¬æLm}ˆÈ|':g*Ž£ ¶¹aû¨ ͙ȗKaJ0ýQEqÃNAž[pP 7O%qÿ]°çÈ—kÕ^ƒe»¿n±?Å쪽‘Ó·›µ°BÜ3wê¯>eÉ:hZð4-œA^»-_®µ­³° d/謱^A¼$A¸HÔð×»(Ö„ˆz¢Ónl1¾ˆØZ1ä0\&¬ñš:Ú:_“¿Œ?Rñ¶Qú`ôsËÕ¡‹Ê1 º¸Iá/a1|¬u í^ùàǭ³¹Ö©á¬]Î&°®, î Lµõ±¦ZrúÄÒÕlèEç¥ÂÊÂùÅR~Æ ¼&'úD°I'ya±‚·\à@¿ü|‚ÊžÓ’‹f“bp·ÅP6™‚”=²Û\Ui£µÎ—Z§­Câ0ûl7re.ÊU ËÁ¤æ„Ÿ•SF9uËuŽaß”¬·À›Zoüá¹]Õ>!,“×rúŒjÕ¯¹–vÕ-×9¼©UûëµóX耧sÑVÁß[Ö?øëñ žrã×’¡ìižO+W++Æ:³’?<§Â!5o#¡\“KÇHàÓv³[sMG+Öb¿ºÚ¢¢äÕÖÔÔ™²s9ÈJÝ"bCÉ:µW4Q_V–øQU¥s4—M¬ëû~FSkX—Óq£¨äB}Á¹ƒÚô2Û³iŸ6˺YT›T5VSTZ ”'=htbàThdò»¢´ ”²ßÅC\Ñ!5/å#hL'­"_j¬•Ř a& ‰'¶úÈç€bûXJ[ý‹ý»üA;'ýwêœA¬»‡cwõ·`Þ0zT:,¦ÈC‰Õ_4®,ÝàN7䯖I·õh‰dÅÉÉ}'§l;Fà$6è&žSƒ£aŒ3-ƒ¬$ýIRÒ ’ÄòXG€Ûˆ˜¡ÒbUÄõS]—ëV~ÄR~³ÀklV"Ø“’Ì"¥xî´iI¢ í¿ñœ©Œ5ΰbüVL+îY°ƒFÐÁSƒ£c Ç5¦ƒ‹°÷ñdÇÖÁË…t mâq`™}i ?ÅÆ Ãñx XBõ† i¢LB$ÔhLm™ßÞæ·Ã¹ "ƒAW]ÝyUÔÐsI*Œˆé½ÕïÉ£³?S5£¥UƒO‰AHæê„%ª@ïÃôÍ §q†fÕ†ôÖe•ITÊ` n QYúMõÆçta”.CFèãaõNãÚ$V [N+]bpª72Q&nB²ÛÇr†F±à¯°€å±‰ž¿Öv¬XXÒy'hÀcX±EgZJ}/þaš;ˆÁ€"`ã rÂ? Ì.}_P{ÄºÒØ~>û¶9VßsO<‡¿ø­‚:Ú'X·DÚ"0騣§¯2'?â Çù"®ÐxFOó øA]œ¹åûp6FÊŸb¥eù©wšM£ÍÄ„ÛêôMiþÜ@¿§?¿¶ÙÁåˆó5¨“%®XFÛ+Hùâ< >94ÀÒ^ÛD +QmÔz+WmÓ¿žú3ÝWŠ‘'[Áþ|ó;–Zƒ®òmÁ“øÁòMà,,O- ¶Ö\+ö[5ìÇ‘¥-ù0̰ԅ£“`ÿ–V§>^\8ÌÂdm%)>Ϭ Ès<œS™ƒŒG wB 718¢E”¼CW%ÇМ•8ñ ²Ôƒ±ÖnöŒ¤â!p¯&§Ï·ö‰ t~H÷g°qA#r`qJ^Üðœù•âKYWúÁU}Á£¼'{GEÞL{ãÝøèõ£ƒ“â]$3¾ƒÅ…oM-9 À\$XÇ!ø&¤è8låïZ+âL"#kgÈnN8x7A€Ú"¹HC$Š?ãr‘ü®Á/‹dil%¿Gñÿ(,å$ºÀÏYÝu¬—½‘Ñ•TòÔ6yAe€‘Ñü²»À›#ŠŽk#8`qQ9© e+"ºdE³b-b±Žˆ®¯O–„ƒÝJÕ÷á†X„?-hká{…0 ~ð{jkéå2=Úˆ¤¹œþ 8Âu½hç©EÄDŽæÅw€.æFí^ï̳â% £ŒaÊNðàâà¶¥a9X§wÂFD¯. 6ªXµƒ‹ Ö.B¦z§.d'9ªÔìhä§•ÓtOè{ ÀÒD×)¸Ñ+ÔË·Ñ5‘5G»Q³ÈyèºÁL(ˆ‰Á²ìŠ8qÒw•ˆîuí`n«!ñšKî¼à.&/±"ÿN\çJ FÔA)àà•ÅAê" \¤›  ž¾a¢ÐîˆsáÞÔÞÊ’²Ö«”`£âÏC ½ÐS«³·V–.ˆ‘’$3®D|’̆ LÄç‘Õ#–Îîü 8hþwÌ$ú’ÀÍ %&‚PBY:CÊH¿Õ~á­ÖÌÏŽF°RÙé\5äŒØ‰2ÅGaæzŸn…·Ù±; WÝEªÛ’ÞîX°Ð({;ð•âàÒeǸxT'õ,›©ÌÚ>à úZ©mˆYgVç0nIƒÂ áåE‚•Âÿ‹Ã¹aN±…[BÝ™FðÎØÒ ²Û¬PÊå&'üʸHÎ'@ÓÙ/‡8:¬p7ob~j\:Ü„aЦgìÀ ‚[Š`Þc$X±“ÀµáxFà…k™‚ð;ðJ‚àÙMìÀ © Ž%d©?°•à5%› 5 ÿ¸¼'8»ÀÃÁq̸1 9V˜·õgrv‘å=Û;ÚáÚ|oò>=ŒQ4õ¶(Õw“ç…ºœ÷õÉ/O£K“4mg‰2ö¸x¹yYÉÅhõÚúhYk-±Ë‚µ'OHÐ&z±W¿aK浄|.á”¶ÎrÁg}ªñ†(˜]ÀK(žBÞð40B<…2£·Á(§¬žc©‡ã·L¡ž ù„Í;ý‡K ù8—‹â,!I ˆ LÄ­,¸ûq‰×š¾”S/X+nµ-H¹ÍŽ'ÙØ]JˆW%„S į!ã,M¬¡d~,A/S€o)ϧS¬;W‚‰«l0œ¤÷ÄÌoV–˜ä7ŸnŽËÛi¥•%ðu®ˆvH˜¢?ÆB1Ñ}õ*µ³\¿VVY—š—§YšNÉ(z .C-ÕpФõOÎTF:X¶bpÁa‹Ò%qvíSy3e^RFk=}ޱ?J‘ÞÆ‚´”h‚%ªF`²*±( ""|9x×q©žGœŽS‰mçùˆˆKÚÏÓ1›O›,Xg; « @p†ó¼‘«ÚMÎ3R@âi‡}3³6ÖÌ جC°CÄÖ³,kV•.23Ïñ¶M;cªÑ­§V†Öµ‰Ý®oYÙ‹ƒ³—cUX¹¡`ÔÄ–j>é¥3ùû@]µ$QSç#Ù÷hßG‰ífuÜÁb ù@^n0j™Ô=e»–!Ëò,ëÅ NŽN»ìôÎ g\ÇÔ>ÓAè±§ÈnR8á!.ûS1t6C¿8-¦i¡àUÆe?Ï]Rq°ho%Cö (XU–9w­AepB[T´…9®–îÀGÞ¥#cÀVƒÑHÀ[bòNŒç.dÁn*²”“¶-çË<­$ÁÄÞ9XSµr¬‹ ? Ù—þ0éÄvpM <ö ¤¸r™÷®×4"0Bb‰KäãECbN2^ø¯ÊmR|iò Ë 9’ ‹§ïO½[PtãòµÚÒš±Í›°àïQм‚óÂn˜eðNñ+äàpÈÁ‘ƒ? 'ç§5U–÷hÖù^åÙ€à6ÔŽxïº\‚·—BãÝË{±w€Ód`Ü=åçZ*7¡î°NçïvÜÜÁyÐTŽÂ¹+‡Yóq¼'<¢T™'—Va~ôëGB TAËxaØ»¸Â(&.çy·ÌOØ8G?Kl‹;ÎdPgîN㉴Áå‹¶âÂÍ´·èUcf’ªBòzUè½ÁN{P&x§QÊt¦Åù›¬¬ :Qü-:QœÑ‰âÏ´j…wÔ¯?Î$^ÙÁ ëø!r…ø5nÕvUB[J@;±´>Ž,xA† XRa÷m¸5¤ÜÎØ9arêÞB.qŽÞqÆ™Ñ÷eD­c‡å¶3 7yÁyL d}d¬+d¡ZGËÕZ¤œð#ä ‹\(g¡´”°“ uä=eÝWHM•ĉ;5|7Y¬pl¢Ö¥VÈÍ9Òºs§µ˜Å²Î¼-ÏôjÁÂUÝ:Øç>5eŠCd.“1)— ˜E‚‘å ÈáÎÏKZ– l± 9É’ :% 8±ò1L‘)­m·!'±‚Ô6IÜáŒå¹ÕNìI``Ú´ÀpjE­€ß—Ðv̦mÅòN?›YÁÍXm0Váð<µðê’:$âF¶E8FHl˜(™hôcGÙ £%Ù¬íì3rš±r…á9VZQαÍbµm¼²‚wr€%—ꆔy2^ofîݶ ⯮Ý6b'¼ X~áíŠibRîX •‰ä‰`P%–ýBL1 oBÁ‚AiÇ©/lHîUŸ +-—Q—ê‚Õ¶Œ’ߺökÎ#`YåæòbJ¹û(a £@)[=މÉÜNµž0€›'Äeˆ$t%žŸ$BcƒÄž¦±Â°ºóLÏÌ]ư­”JU=ê:#‡ÈÕ€9öyW)VʲPÇ&ê€XQm|MˆT•+²©«,ÕTjIª¼§2ïTV¥ŽêÒ F‹1}…ßS"«W»„|3¶žÊõ,!Ü€Ô`ðÉÉ@‰‰ÕKà™ˆSÅÀ‚Ç«Nñ垪«7k˧Ú0j˜m#ç8¼Uî‚3–€YVEÊ\àá¯!^þ›"ä["”`í ‹§†-`¡añVö´„>²6?›¹¢rÄ‹H!Øféç°9Û1û–Ò!6#8QÖVS%¡Åºaƒ§ª¹Ì4¹YØ)Ÿc£ä¼ý0Á¢¦‚Ó«vHÕìÜê^Âj¢—6è,ªgåé*í¢*LQÇéœoõg<ÂV¹†bYø¸*RÅXââ,288¨’ªôéö.ÔÇW^Àâå¸+3ȳ\ꨭ ³aùÔ°¥²7ÌÁõ–ƒ­m·.䤺›´ …‘Ì”p á„ì ùAÒ.õh§êNҲɮ–AŸJY*É{ïkùxs±œ(®ôZS˜}+r„•¶”f¾‹ìdXmº{1·)¶hHTëyPG·0îRQ±¶Õ*¹eå'>¡ð*S98ûÂO;n çOc¬io H÷Ê#­‚A³z\sYÀW¹Œ¬š Ú¬µåe”Î^þüØ%O1ÌRÜ»sRÖ½„Æ+bTxc·ñŠ®æZ½9«®ÊMnϪzsV]••ÓÑÎ\X}œæÀÒCðÊ%Áè¡Þë´qI °A÷›KK¿m­3nt§“ p–[FPH¹Mƒu<´ƒÐ àÍÍT–End(Iné‘Uà\ª¹[vË*:ÍËVË$Ô‡® QJóY’ 9€ÐB$ižß¦×ã ˜ZV¸ìrÊ»0ã¥D´4ãIï‡ÿ0üˆ’VÉ H½Ñ²Ià,¯ƒ£. øšvåbÂ34Y=‹ò>Qüà ½h\€¹D݈{X¦Ž±ÅaxuÆ€Õ™ÏuÒ‡ùU _tÎÃSÐM”›º”YÏe2 Œu)?èÓØL‡ØÉHôk:v̘ðsÂubZ ײ‡¿ÄBÑRãò þMD›ð#‚'Žw \•À´M{dk+&{ËÇh+ h^UE[Áxµ¼g‚,s%úcÜ󪋆¡ÓåÛ–‡V—Ç2ÛØ Ã9„9®Â —-êLÁë:-£ZÚ·"~³…ÞÑ£P+Œ÷[ñNÑ`ÕóÔ,œõ@°Ã‰M»S¾…n5Ù&8RCeíF±JÛš&ý”Õ ¯ÌÚ”ïµ*ã§’*h/€ Âæjì„~5Ôè¯ÅÚ+âÔ´–Í"ÇjU\s;óÍmÐVgm$©Óz#W|V§©âeÌ”Qʘ#¼es¤ ®å(Tky«»:½õQÆz[ǯîjlã¹án§±YÀÇñ΀ÇbŽÅdcòÎö³ÆÂy Øûšã”!36ÝÁ‚VnÔPà¯ãX 4ÍœöÚF´²ºRP#줨ÙÍ@ý!Äà7§Ù¨&¦­þ¥¼8Sã×R­‹Åx—˜ÃYSÁs©c¹Óô|‚EoFf抈¥-‡ïqr.Ï÷(Y¤`¿`þP—Ï ´‡[²à‰~þwT‚»Kxþ‰¹†C.¸%¤Ç¬òɆ×ÀÉfK­ezxóð2Öƒf;¸a‚ k¸ëçØñp„ÕßÌßÃϘ?æ5¥ž‡ü嘦NïyúTk y…¤²3§–ËN™ZÁvšÒJiDö»µ”4/h’@S±IÕ‚ÈS¦q…³Ö+8£L5NgZ u ã줦J‡+±Œ áNº‡¿2ÌA5Ok^Á•XtdYik›ÆÙÊë¼…ä­¬p$mt5gc6»ŸÕ ñ–áTO*Á’6œÒšá”‡k0bÊtX0 §üAŠ“ùDçÃù& »á”‡Û07aØ §üQx¥žŒ|Nôâ–Úø4Ð°Í §à_ÁœÆªëŠpwˆÓ23u<á¡0 •ÁMÎx¨ƒÝüö0­Áº=”H"}¤ËçpðË3rŒÕót‚ÍÊ̶jWùsÚ0븈%ê(M35Î]®|ýAZXGÓE;F-AŸ®cG¹’´‡ã€k#­Bfi½^­h"+F墮pf3UôtF–Ø/bŸ8LÁÜ“Z9zpÑßAë<öFkbvç$ð¯Š<ìx2•tEù»ÇÁjäÝ™Øn\òŽ×ªÊöºÀãQ<=ÇØi+¯6ïwÌ’GPœJÐÓ³„Õ^Jh8:>Ni·¢Á@ƒY….võÙÍraH¨ÚJ'Ù½¢Šg:2J NðZÛn´ØÊ-#`YõÜb7K˜ÇWœÑ鱎Á©6k1Ó ÖV€ûÙ¶ÂG“â÷ƒ«·bµ¸ÎRƒÂ`¦]®J,ZÁS§P…ºÄò€©ÅÆQÀßWhžwzK÷ÊNîq…Ç8j½¼Ü?í–ã”·ÇY`†t ¿W# |Ù3 38qvªíªÁnÅ-Úzævo‚qŠk´«ñ«åƬ½ ×Ôpr¦ñ&$¯l^Ï&v8Á’iËeòs°¬:Eœ†xF)#M¹^$” ÉÂ%·u‰  É.ͲNB/ÿ»-T4+—cJ#Óù¡‡S4  \y8óñpm†`È„â@c— 7gÌ ÖN®«ÐE$zh’cÐÓ}΄^ä¡ußd°,IËÓf<‡§¹¤o§Ø(èÓa'úV*ĸ’ ˆ<Ü Y€¦‰œÿlÞñ$º‡ó!ÖÇgobܽõw;Z»-Õœ@.œ@æA·,c¼_$Œ#vkó˜¶Y°Í+Ø“¸Hu|™e\õ§ÚVÈêÖÚX–{p6°^îæ!ºYûM¬TÂYYžÕèG÷”2F"°¡¬µI­XѺ6û„k󨳶l·1sÚÙnË;Ûmgæv›ð5^»Ün‘¢3áó žÏ=\¦yOþ“—µ Ž:#˜ öó„NÂÜbcR®ç ÝÂ{'áó¼«rCäΘy¸jóž²ÀÊ&“¿‰ïxiµ¿ïv°–÷ ƒcmR½Àp£¶+ìh ¯¿ØÙ¾ê1‹j±«-Ö$Y{ʰõì“àÌñÒmà—w5Ébßê%Ⱥ@ë˜BüRåmprs›ïúPØ¡Ò4]¬%ª†<Æ[%hì2,ÖòøZ–Úf÷¹»Ùsäwé>N6^™ïí<Ý©ËÐ\Ž ù›ÃM ã½ñ )žKXÒʸfõÌšo¦³HF+¢El±LƳ„·åG–5‡f˜CSŽ“ÇV–9Ç1¶:Ì8YŠmêU¬Œ(0F О,mKÅ\u¡wU[YbãÍØ2ë±zTe¶ ¢ <œyøqóª8(ã¹m û ;B ïía+r±,$é!HC€¥‡â&vÙŠX¹§/mS\/x` i™!+q¯œzê‡,¢–b‡€4wó äEwB| }_ÖC'g@ p<3€ª!ȆÂvˆmÇ€Ò–"ýtjÙ%[UµU£¶ºÖÆÞ‚Ê †`»0 ÂfÐA~?Ôr‹.—Sâq¬劽¦Ù½8ß³£Ñ˜BKa«Õ«ä½›¥D]®{ºÄ téägvc,«Wûžk— ü4Ÿ=ù6Ë•Ø"±½\8æ“réݶÇÕÉ;˜‘5 Rä6ϵ N`–mžÜîÌœF ²‡áއíËìÄhÉ$’VËð¯ïjS¡ÊÈU·V‹‰ô!£ù˜ƒ66hyÞ´gZR3¸29Räý§@uĨ‰Y]¡¨ßãÑ‹ûy’TùÖ¤“ÓÚǦCôQ62b¶–eÖ&sX„ÓÈ))A“ØëâÄ…”ÓŠ]¨Õƒþ°,ðÍ- S  %‰u#H»ÚØGñž!ÕrïÅÓ Ìªm‹…Ü ï–OÁ­î²ƒoØ€Œ@w‹±‡w@ëðAz2û·²kÞËÖ÷Y6Æ@] û‚É0#×x¹°”¦×¿"tL³ãÿ¾=Œê<œzñ 8Z7úzögz;£ü;¶á¨æÐŸ9(8ýlPŒ¼­myG僧§O¤[%Äú‰Uf.ˆ„?›#HÐÞÌ›‰ zÓhcmþo=|ð1Ð!øác°}zøúcpC²R¯wzˆñ0–®I¯H>l©æÑ1Ú%XQ&:;¢{$®Aé±q+±ªÕî<âP¨zåf×°˜ç[NÖȹ©m›‡@Ÿœœé-Ç’v±zbΠ‰`É(Þùaxïi­‚]F“¬%ZËôŸ8±éô‹.T—CcAÉC<>°œ›c¦"?·ê­qUHj ‡Ñä}9:¤Æß3—'*×±FóØl¬ñE,añ”îØIl6öÅy3gÈw\ïÓqP¢ÿL|g,¦-;]R±<ä/Çã£(¤KÅbUMÅ^7‡_>>‰…‚å;•°tŸ±qè äIbW…“Ä¢¶È †W=[òÒ‹KÞϵéÓ-ÈÄzÿœ–ùZXo'Kii[>·mUOì$iB>·4#ãâ6ñîqY×Ò Ž‹[¹âl]ÄÕ$‹¸‹ño.ÑÉim–¨ °ß­´ëÒ¿í‹|ì`xZ“­KFø¼Ó€çt«„²¥\… xàúÿ ²%ím¥„@Fü÷yÈx—/¸ôI0©‹ÙøÝÔåf+Ê©r/o¹ÙŠ+u À]À^’Y,¸ÕtsÓÈÍy±ŒÔeœq6ToãlS Ü%þé!¶õXüe?®ÅÓ ä­ K¢2€¸ÛH¸ô‰K€ÊrÛЂ$(VP®‡;¾8(!?ÉáªS_ˆYÒÎJŒ˜Áù‡,7ž¶³é"A1rÇ,YÉV&W²5;m!P™Ì#¥ ÀP-€pÐà!ÉH êÿls 1ËuáßÑ6wn[]Û¶tm›msÚ¶½5œZáf+Úl…­ðÒoìo ˜@‹Œ¥m2ÆÀ%ž tøk± 2˜­ïæH%OiL›e¤Æy ÃqŒIÐ X%ÇdæEå4{+O1Ýb»×“xé·àuØäpn[pÖ¶pî·•[‹·¹ ÏzÚâP¤Å£m¡Þj[m œoðÕç¡[÷PÔú“à›‚ ¾ÛùayGìv—qžr(@‚P"¹´QÙb·Ê羌õ!@÷4E„’íTþ„l= 2øä†²ü—!ƒ´‘å4Æ[æk“Ä´ËÇ'¼ð›Ì7=#-JÑ›A¸¨üíáeÆÃK•‡§2·Z. £Ü42‡¥¢±PIÀsŒÏ9ž{>Ýìù›øÍ,¦œ{¾Þìùz ¿4r9Nø…l“©iIÎüّܼ¼£$H ¹Ä¹ÆÛt-_žºÚT×4uK„ ^ó<ö Ø2DÌe­^,cj.ãlÙfNª3ÂQ¢žÁX‘Ùyð±ÄƒSD ¶Á®¬£?ë„¡ÑI€ðt-;a(†:`<èÓˆå2ŽkÅVÝ„ŒË#@–é’Øgž¬ô¹é²Ìky+Äk“…+¨–•÷Í« Ö|]øyx,´€%œ=ЈÏr3íyi¦·bI½á„ÑÓý⦩YO%ŸK¨ç‚¸¯BqøÖ›“ư‰Sç×X-÷ÎgíÑyLñ¸¸[k`¸sôE.xc¯€;B‹âá'Ò::Þ°W{qHÔ1ÊšÇM=2ö ²h”3³òðáDö(qÎQäpM‚M[gƒ mè£U'.V¯skF5å”PܲˆpÎÏÙë’=lÊ|UÊ©“(ÔÃCcʼ‡oC_ôê7+zk+×ôÖscENþøÂÛûú§Þ,pN[1“ÅBëŒÍ*ž­DýIRâ ’ÄòMtR T±¹T´7É.•¬êf>݉Šrh’µÒ(ͳF¼Yà$6 e$U„únZRo¥è€g$–?bN+÷ hYC+leµmº,Õ×38ÒÇX{Q³MŒ¢ç*²\UyÏŠ¼wœ]ÕTyTº,@ÑŸÂ >A|.}ÍÄó"´H!Œ-w}¾fÞ̃ˆœé”qÍ-±iTÓ“3G'÷Yo(Å.}öð–ÈóTg.ÌÅH‹Üo.zÀHß#[’àv6 ̨~ ½È¾|[‹iÜ,†RŽQLJµ©]ùÙ‹…®(/„p4<¦Qœ&^ i_é^$€Exá1áþSGA½³oÀ ÂýÓ‘!ŠêsÓŸn…ç¥:ˆ‹áW” î O‡=ˆ³]@BMÚ²Æ$ù®ÚW¦.Ó×ÞJ&_õîVl±ôrÓà±xÖ¿ ´æíÃ!™{xú¤EúÒô'I¢ ìÍw·|›õÀ‚IÐ~.}•å9íû ‡Î­‡Óq1¢¹rvø´Eþæâ¨l­]+Dmp è+Ç?ùRkâÿЯÍr²Ü fVhEò¶vš¯U~§ʮ/A‡'¶TÄF³!§ÙTuiÜë¡°÷i _ªôGtíŒîÒ&ƥţ¡ •ÌÄÐ:zÅ4qE=‹º|OiG\=ŽQÞèW툾 6®3Š•c ‡àH[`ð‘lðYìlÙuPË®±ÔyÆ‚aêÜ„XHõ";Í÷|FZð¹Ú@ã>¦FŒX×\tãÉï`nø‰¬¾Î§1_ö& ¤l0ÌÚòx*7biµHÖf‹Ákä>%åOUXq_ýyˆÇ|WœºÁé¸ïCðoÝ`Q3W"b!€åÂG6vïè~º0ô5µIáà°ÏéÅÃraÞš|Ò«ù‡×çôVbB‘ Bp­Ì}²ˆB)¡Øäå’œ ªŽ±*gfåZÉ‹7# yBïá§ÏWàî×|5aÙz€®)aÄÄQãÝ!Þï ²ˆE%|9¹!ES+ÕC»í~&ñ$CÚV7z»|^Èz0ñµÖäáÍ΂Èà:w8âb”_‹$“/gãúÛ& Ú^™Æi°€ghû*˜Gm”±.Õ<»’¹éÁ—cGZ‹iM>*ðÒ /ð¡*ÎAlms3m—YåÎñÑí×öi׳5Ò'˜du wíp£³¡"oÓÁ<%ùvhÎ ·|ú°wfK:ŒÛ‘mxkÔ1³è€%3ˆ¹RZ³ÒœjCàòÎÞ‡—8<1¡p²™ŠWÂÊl²6éæìZ¹“i³a¦£;lLéJ¸¯ómÜ´ŽGyOöÞ!m¼Ê†ýl··/m"kmÞîQMûÛUëo}’qœGÐ$Íô 4æTócÎA‹Á÷¥ñ`vM/i•a¡½4[ØÂ|7Úc-Óiô6`X Ù —öí”ö@ ¼Uò)¯ÔÁãm n–Çg=r¤hq<¦H)ùZô§Iª×èõÏImvÕ87XõßÐäÝþ‰wrü!‹†c<xžëzPulyB‰Ê¢\Wèá0ÑÃ뚇¶8ÊÂZ⤳ Åݙْx³„f%ì”ý¸AÖ[Ê&Æ–…dÃuœÉá^n&7°哘sÿîî<œÌõXw¢ÃmÌ¡kÒxœÓròÊdÿƒÂÓ7NõwŠÇ¹ÙŽ…:Ö…â1oÕb—i¼’̦ÜJëÔƒÅÏùVÜFõÕFÊÍ·­1p;׃¸p‘ÆÐ·oHsX…ðûÑŒêx‰–5péæá‹Î7™ÿ N¤¸pjR‰‹pÏ"Ôò tÕØŸÐ]Â/]$íõУ §QPäù´QiD2¼M"€+Üx‰#Uœ¸Fz<·I®&M*¥@ÕLûÚ2[À²µØ†id^âÐvòs£:,™/ [æcf¦BHDâZ©$FÚ XlR\_„Ç}ì™1:®ÇŒô¿ˆ]„˜%haØj^šXNµÄ|jLÑÆ°„Œ`°Ê£žk_Ó²¶¶ ”/{=àZåæx¦Ÿ¾m<Ï> ,Ñ¡DGr­LD©i1j*´ò,ùàò¹g”áYROåT´;hþ±üpx•7èTrÞ„ÎeD€ ;çÑJNmw¬‰ÍnøUH€¿¾px»ŽÈ7ö ´kð‡Ø¿äei–o.ÍòõÒ,Ы>-‹T·<ÍEض¸»R“ëª=¼Ô]—žC×`XÒòЮ€&‡€‡ñ'lÞW,À¸â¾k€®iÎÈ‚¸ô’y§“ÏÉäã9$’q IxÞµ 0Àt‘i| r­ÇÀ9ÀyŒKY)Yr–вb<ËexÙâu‰…U·å}‹C¹ôàΫwº)»3Èha†g²@5V`7c1ò5)'‚,¯Ž qœE%'rRBéÌ)'ìtRîª*\¨?ñ²BË„ !Vh éL4ºcÔ1œÒa$Ùå‚I%0“#Ïé<4ƒb¡çøÂB7p¡«ò%Ë q†r5Üî °t*ÉÞHÇB˹À+α`dÊ‰í ½Ì€ÞሀzûÑ¿d1tGÄ㸯nyªÒT:÷RáÔ'ÀW‚¸´lÅÌî)ÚÂÁ‚¥e+þ–t•ÁÞ²x0h“+(飛Íb ä0Vºg‚‰†l÷Tm¦ŠšŠ‡D ýÕ~%ULOÂU88©1-©b&JÀ£áA+ÀÑV€ï"í†oQ=72;ÞÃ¥_¨l.bý!³mEfÛºù"¼9|áMÈ‚ÀÀhˆ­H„õð¢›3‰g™zOm–<Ÿµ^sÇŸø—ääÒ€„ŽŠz¥éÈI5HÂ!¤12D;Öhkº0)è]DŒ5$"cŠ!î)Å,EâªH½@¹æ€<Ì(øjÀOuðø‘x‹üZ&-&ܱ×;Yܹh7AúzàO)ÓEn˜í†W–䤒‘`à%"+”àÑ1âìT€ó³?d!Rà%">QüDx= ‘šLO5DR±£®bJ! D(| (£×ÎCT€Ï, xÇÚÊ/{ùÌÄ#9î(LŒl-?LUD‘¤Üuõ€kú÷ÁTô 8xKªîDÝX¦RÆ‹T#íÒ—hƒ’üEbŒJg¡ÄŽ”¼­ß;-!¡ ðÀõÎ;…(‹á˜©òã²ÒÅ!…”“dRNq›dßIAÎ=1U;É5xoŸ•kà8+DÑHO¹Îz€ñ‹i¿Q}þFžzwÇ®áˆ)i/’#’¶s¬ß/hoäê]@Ye¸€•´°þž;ò¨l¤õŽï†¼ðàY«ÜjtŽHd)qt !’ÞT¡3\qN­zP810ªà@,D® mv?°ëˆ%Œsf(ìdVµ±o|ºÒArYèÐ#6»7'Dn½ÛR'ˆ›­—Y­ÙRçe=UYÛÈùÊB+ÄÒ±…?¸BH‚8Ð*ä dÓÁŒwÆÁ÷㸖æ]ˆ©e-–ã-qKv;/¬Iþœ!"ÚÁU½®ßpf¹7ªPÁ¹(´˜"¬j&ˆœÑP߯zp` ¾¶<@…ij "aðDàÉ ¸G~YêÄ|…O+M”³„8y‰³+R4ƒ‚€³l.À­X€ ®è©HQ‘AÔ‡j'> ЂFÊÔz’-AžjæƒÌ–u¶ 7¸Ä‚BHÔLéWÌ“ Îuõ<åÐyÁÅÀ‡‰sΉ¢ÎîΦd¼ËÙg+ >Õe☖Y|”‚p²kNžÈ÷=(kÆ…ƒ®®¹³¦$Ø€#­€«€”Æ–L¦O[Cm&xH\uÆIf - M¡`“"X$*k˜¾H^xšb^,ª$/|_Yà Ž‚tUè Û«õ_à '¥:Ĺã}|##¬øª"òø êD 2€ ‰ ‘m]øwÇKòÇ&ôÎÇßÎÓá¤î”2ão“1€ú$*Ì57Hq—°xê[“!@wj’1ÏÓWZðR"¿qÈ`I„g`l¹øW,')(S´œpoec 4ɼ̉1!Ïcê–½a}´‰g6d†™eý$“Þ¦<Ǹ*έ÷M–m/ÁEæWBUÏ`ÐI]€Ç*…£Ž¥!dRº»`-U/YØjâÔC\§L8ÌŒjÀŠ5@7vÆH€S®ÿW¨3ÁŒS‡ï{l–AFPe­S(é è«mã [* ©ÏŽmjÔæ¦ÎîöŽ~M˜.Ò:€«É€&K‡5LÂíMöN@)×)_–1¿  º‰úÞef”Ǽ ³êˆo¾J\À¡g* iŒ´<0Ï4[´[Çã ·ØÇz0¸:Áœ1zsÔ&Z_¬GC"„~:µ¶ ¡iîØÓ4YhÆY×!ð;äXï÷ÆJNÉB"‚?ó¾í9¡G‹Á}Û, `ùHt±`¶ÃunØobP=™0Ž õX.ßÍFW‚Ý~¾ÂLÚÒxBp:ª„jî{ÏU¾Z‰€!.CûÏ0ˆàf TÉpåÌÞ˜J­‹3yK-"2¶¾²,ŠáR*`~¸§ Š«—š˜£h¢½F˜L]ü<|åÆqF³l·»N§f€ó¨ÿxó®š {;èµ:1;¥=N–Û#Å Nfi¥&µ— /Rn ¯P=†÷wMŠw1©Ó6¨^3e}[b‹È—iK<¡˜ ‚Ú8€#J°Ä¶%–Ë" L[Æ=@©Ãý7¾‚¿npJ†™‚þ:Ý5š2µÛ!3-¸.¤²iŠDÇà<Ûh/}é$P|Ý“ªËˆ7ÎX“Ò;“X‘sœEgøl*­X2kè ørJKuKxeBp7 Kån]0Ú¢p -ó€ï§¹L¦oèw]´ú'$Êv@³A7¢Í6žbcz0Y:ãss=Ô(v|ËÎŒí§æB¦?Œ@?LrD.ä,Óž‡}xDn;o&ÁÝzÞ,ÐáO“•ó)4×qNÍŽ•±nñØÀ£ ¬¸0’Oùr:èÆsM]¯W«âài i`á´Õ±%ž–Ê}¤,ª<8«éQè%â*{5 jÜÊ•ã8¥?Î ðÍ Õ1ºqgøuŽJð_8A p»r­›µ7ŒXŒ¸ã0Írº±ú ,1ƒÇÁË»Ê+µ3øæAZ[ë‰ÁÉ‚ÚÚû+øpp1¯ÀAÈdœ@Ü8pý²|"@«ãñØÌ9x˜ã§0Öò—wÉ‚ÔðuzŒ0ûË ¼+²˜#Š ®G3¸FJb¹ð–h58j ptŠHŽ:h¢‘/ýCgDèà5óÄ46sý¤.’0B!—dÃÈÒÜh \Šn>-¸£/íÖCv9öÉÀ4á³§bäèô̱©©Í3i0YnOGMBñ+jI§R\Z‡˜û@íPì/`Ípˆ°@…WÇøÎ …5ay^xuB€ð2•mEK'í¥ýzô–׊𔣨b`¨ì)š ç5ùèй llHÎÊœØx³Ovê‰0÷òv–Å šeªÁ*áרÞŽ¾ÉAÑ‹zhijÔK3Þ2OÞ,Œ.z@¦®%2–ŠÁ Ôx;êa&Îhœi6OòmðÜ6]È¥é7¸/VA£c2Ûe±Qá*Ða5Ú †'Ή%aÜá p¦6Î K f] ü—Èa"À)P†˜&‘àwEhµh&Å«X rP‰e ýAo6ˆOµ-wãxС#º¨-))rSƒÃ’Û0÷n*u„R”œ² ¼1°q¢£v&Ña;Ka.>ø’6ÉEF'KóæmËP˜I-Ü€xP ðrÔƒvB]Ô©ùúp­!,®B©Ã„çeJ ³‹×äè\|N3y6gDÍœP4c-Æ­¸^)ÕÀ­M®ªÐãÖ^°1`0@UÍ*סªªpYcàR¤Ðßi€_¯ÇTUJËÃp~ qÁ ›®¾Ò„ü‘üèÍãßÝBÓ±IÆÀŒÆ3S¤š;TnJôŸh‘v~ÍöK?7Žª%'Z%M³ÒF6¡>£Ný*âÈŠ.T z°’ã‚TàIª÷éP½,îAl¼ñ8*KBv± :Ä[ŒÒ´»0’TY<’MÎr­/ÉE9؆êËyrØÂ¢°5‚ ˆÓž=ÐÓ#×Cã¡Ñ“ÄE¢1YŒ§úlCruµBSéJyÕ–Z2ŽŠ†ÊÏcíNiær`m-á"›'w׳À••&@Ž•8ûËâ6bœ÷ÈG[£ÊÔ¾V æJCòOi`=£ ¯>r´©°ñ¼*¶ÕÖvÀ îŒzÀ1 'E*¸Lq ˆ"çV’WE=`ÕÕHÇÒ­aº?E«PFv¬ÈhNU“ŸÜŠkI9¸Â{!$Ê8àô£!üBˆ•”xxþ¦Ï-[²ú!Y +“2D¸¯à'U]ÃEZ/ñ+¦Q¦† ·¼Jx[ â·vLÜ‹žß7@¯f¬Ìšš…p‡ª¾8™í8Y0õ$žŠBCÂ…Naˆã$Õ˜¾_˜–²€"Δ7ѵäÉ|ä¶; ìó©ñ* »•h ÔY•p²m ÆO< ÏÓYH@èŸ(4£j¬´’ EÝŠá?‘оdªüÍ îôpÂ3:`?œNç8õ0µCµó z‰™(mÆj;$¯4Ÿ µ™ÞÃ2³oBQö8ž'd`³Ö›^ä4“ÁÌàÅ(TZe´r‚ËT:SB€©—Ÿ N>L\’ÅÜg"ÔÞÀ$Ú”è71Ô¨¤²Ð6òv¤!+öPÆrÇZ£öÅ×ÓP— ¸ý¨VÞ¨ Ã>78S£9¬01ªÂàsèÔw%kßAáJT1Ÿ]Å´êÚ.'ÕÒu”Žsœ´$éðTš\ÄpUZ–Åèºú>ʲR.ƒÙ7Y(¨7="‹EQÌ…ïœÈxÍ ê>¿á*À9RÿDŠ¿Y¦1¿ËtH²°Jº@½ CÞzQs"c<æET+ÐË1Ù*Gl4?ÎÎ>y›$ü(‹Š¦¢*£BÐyåe3&ÀQÐ:Pì&L¯d-|Ì¥‘yÌ/ÃL`rpxú\\®x; C{åÔþNWU%:rrY fÃHh$©¤¥\—<®8i)Ñ'Ñs™0&ez)±Á€&[([Ì皘ʹ¦z̤èŠm«KAQk†qÀ¡@ŠHç:Òöã‘~—ÇH2"¦B3•*ñ8âèLÄ(dWcC,j IJT*ŽÎC#©é\1ÂÇP¨Î‚ã«x¨d ÇU»Ã¡<žÿ‹vëâ‡wG¡)òäT[éÆ3ª?e›én|"|íô€2UšL]D H úSSÛ¤ç<ñð‡ºßC u…S[<¼ƒÁ왽Èú)Ê·ŒÍÙ‚¨ÈR™¼ŸŠ£òÎñ{ šÅÅ™¡Ì»—m ®í°¢¼9-­û1õ„R†¨5éîH„ÿœç< ty¨œÎñ“­Kès!ÂÕŽr)ÛUÓ© íÕµŒ)Q¹Ô ´spÆ5V½ÿ ÔÆù õ=91DÄ‘€#ØHK è6"œ&õŸ°j„çžl¨d*T9£™·Ó›y‹Á4²Ó›[Uñ ¨¤i[ζÅì9êLaÀ—áM­;"eé9íLé‡Ä£>YîæˆþWϤPó1‘Ï®²¯E*Ý áøçȶ­sÌͪœ‰Ì„¡Ÿ™2™ç †Öã–‡nõnÏt™:iÖÉE¢¦`QhÜ'‹GÙ2™RV¦FÁ}5“7–êd4ùáðZ £×|¶õøêW‚üÃDøVéA]ÒIéC['’É[ˆŽÁ ¢rŒð§]0·2ëœò¾H·94 )"Ñre lS d'¬ø—‹4l…×¢8¢“²ìtht&roMX6Õ é±ˆ6Kmµ—=V:/Žs.û¹!¿¤ƒB ‹ŽâsƒrÉÐtŒív'þÅ)÷IòPc°¤(òItI<4›¬@E„“˜ˆ³{=(‹˜$sUxC/&“è¤k¬èUúXD޹ô“¥ôŠ98¨|Ž8@ýÞe€#‘ê…ãÝçzlZHƒtbªú&V•$^án5m ÎÅÀfì? ¥w<ùP1¯‰®ØR^Øõîÿ3 ¾"8FMt…'õ"‰»AÏó³<*ÓçЖž/M§ÅØoCmàEŽ®Àç\=MÍðRGe¥ B°q2™ÙÿÊK¿6. s£øÊÀ™JDƈZQ¢#_T°X7>=¨ }šÄLê2o‘­Z«W¸otÓgÿ¢®G³›b1º6àw¡7½ªùe›=:mhcI= ÜN3áaÅ­à6dæ•Æú±ÝáÕ&â`g_:*>©º¨ Š.[Zû3ÎmŠ"Ý W†6ód‚õVDJ²¤bŒÝb¦^ö½íQ^Ñ‹?Òyì óI~MŒÖ¢§pÔ¼©¾"`jÝ$•>Ûj›I\{zéÊa®8Šq¨öá´z ÷r|>Éa^¶"\åD¸Ê‰žÍ ±1BbY õÌ€W3¥´±eC¢à[¹Â¤è†ˆ“CV\ ₳Mâ ÍóHôA7ŽEÀeü °tàƒFÓÁf—›ò,ϭ~\AªRÇ1¬HÚ剎¸{tﱨ2º…±£0²°ÜÅaÙþ¦¾Ι¢çªN$Ô¥7ç*Ç–¯+4'O=óÑAÄŠ3ÝŪsvìÚÕsß­œgi£Oc˜È*øˆÉHÂÍ?ž„‘qÄY¾Ï5=Û*\„b֩†u1†Ïô„3íi ¼H×_ à4™!Iòj=2-^‡…€Ñ§#NñFñ‚3µ{…†‰ñ€ÚøDxl ¹Û;4Ó¦ãd¸µ¬ÑewPtfº¬b<ä8þòVeM^6õx%ŒZ*Ùf¸°G/†tÃÿ¹ù!£ #N+öÀsˆ%~âŽ^‹­uÚ)\ä o.$Ó5‹ž—V‡Ì\Ìá»i[ã$–Ëa}@;k¾+‘²ù4I˜bÛÆlÄáÞ™(ë#³¾ž0MŠO*{qB*æ+džÆ#tîá>§|ÂÜ«m@)šaÇEï©ÉÁ }±m˜Þâv\¾qàF%ÂÇM4÷6Ç 1U¨K M‡©ÔÇ…o´Ú æ¶a®[И8|¹'ýì†cý±%g>ƒI K€!,™ÂA5’ç¾RcÕð2td•«soA.ætÖŒY¼—Æáú j^z†ŒàpþŒÃèq ÃûÃÁX‡€*¥žjO©qè¿Ï寉UÞ»q2¿Ç¢Y˜z—IFGŠY9옢ã!œnm{Ô4ôYtP¨Î¦½­ô( „Ý˵Åì d¥ƒg¯ãnDd‘ÇËþ*„Fñ¡é'ˆ°OG§tXjKè%¶M£ <Úa²†Bøbs¬ž¸-S ¡ƒe¿wÃp)âÈõÄQPëq)ȪY¶ì 5y•«-9U/¾´c W-â­-xšFŒÏzC QPÅ¥eÄÑî;jz`—²õHŒ£˜­Pµr5*Î퀪l.Xw Ÿ’(XÖy8—಄pBµÉiZmÛ²‘o¸ƒ½ô nÁzÛcY Æ ÞezD-’.;«ŸKqÒ0R°ÈãÓMŒ"e(±G’¾`,l¹ig*©XÅü²³öIÍÆÞçò4yšÙ…â Èq)‘Ú$/ß±¤ yOªpRIH2U—lµõ…±YÝ6q´þXמôiFm…¾Ó0B°  tÜÚÏš.ŠªMªV©››–UÅ’Æe hJÆ^çB E=ÖÑ"~‡#μFø˜‰PÅNöx4ÀQ7™fŒÓ[gÛ™®i"¼QŒö‡„wÜeŽAxb“Æ¡2ȤÚÁŽdáÓº¸fQ\2ï†g!—ˆ}`x¡I3ª\+ÚÂÔŠŸó¥‘Ož–t2ˆ4]‘t¤bZz“kCõ6á^kŽFÚxÌbg·²¥‰ÀAM¼Y‚»u G1³vV¹Cñá§F±ª`"Ç1eï[¾Ú/šÅL ~ið‹FEQ·F½V `î K=r ×ELl³§´¤×;0Wø,éyd 'ªƒ¡á‘A¯NÅøÒ;GûK½Œóý7½D\ ¸‹Ÿ§ï#|X¸Àå_ùˆðHƒ€¥Á‘YËïS Ý[ùy@´×Óý^‚ˆ#¸=º w Jßv°…ïoY•þpŸ‚–Áô_IÂ`˜Í7^ ƒkºyè©¢$¦›‡á@ ÉbeØà™Ã“E:Ÿ0’Åcñ”׿W8‰ëÑÐ3Å(‹Y8ª‰â@†ç÷ÅÅEgúk:Å­gúcäÈá1w¦ÄVþæà8År­±.î"݃Dñ S•’7'Ö‡½®\¶4P~Ö5‚’$G2]„¤1•1H!á–|ìÎߎáRér’¯—Æ¡sÓñ‰n2÷›€ ¥ @(ˆó¬CM2… Æ= Adºö4H…¨ƒ(ÊëÇWÖïÌQØÄ iú4×Iá– ½§9Y%i or§눳㕀á¦dZŽjMxc kD¡LŽªy %Þ5.Hñ‰ŽÁªŽcbäYö÷M^‡"EqÓ+"Nåi2€ ²)cRÌ«Q¤S•¥£ºÀ®´±óMg¸?®ÜS滓i îË{™TÃ"&Ò“)$ àÇìàíå5ÊŸÃÖ9‚;ñä(Þ~ ÂwçT1Ò³›xTT·Žr”¤×/ê³€ÀMœ•r{ÔHF׊[QtÒ(Q÷àðö ¬ÉM ä„ט¬M\œ0Êf%_§â!;غx1ŠÃ]L{Ån9à…L!Bjê° L‡ ­u6cÐçšÏ3ÁHò}*ÂL„Ÿ™/0–2ãÌn†äzg·&àPÆÓÜ; [åÕ£3:Âã  IÜÈžé~}£ÚÎe"ÝÀp»†—]ÈÓ£fL¶· 3$p2Óƒ¢„£×Fz—Æö¹X‹€ ÁˆþJ -†½îqJAÞ'b.h"œõµù°ÝõàvôïI%¸ 1â3ÛƒÚÂ">o/ܤŠ(a1ˆšü YðAñ·®cšh]G‘uPú”ƒçZú˜,øeiAâFC!=¤0)%3ðÃÑÀZI‹PaØéq^+u0æÐZ§;­•äÞYŒàEyÝâX ;Ó :“ÌWL–›œ2b"JåäÄð +Ð$·yÁùØF»[n€—óæ_#&ŽBòY˜hc5 ëè&hÆþ:EÒ§Ž\!ÀS… ¸ŒÉ‘1¬­Äª.Iz@™T#x‰5Ÿ'üÅ9MF#ïêjйÑ$TÓ®R5IU5n!ÉæPÊ`üÖ89ZY˜F„G˜‘¾Qæ [ª2S¡!¢.,iŠ4X †' ˜ªø³ÂšRRvtÊ}ÊÓçð,©zGƒÇWO,JÊèá]\1‘8æA¢ÚÌJ„Ÿ¡oFQ<  ®mY®ˆi äoÚâU{M9›ŒHéÌéñÁ¦Ù°Í [0-M(œU-¥ÉLeò˜),M&ELt§‚\d >ÔF,/‘)EW/Xn\n›'Rá^ži0ZÜ‘ IÞa®KG\G´Ü`0t‚#‘‰Îîéñ惵ÁõÐ! b'æ‚·twìUuÙB«ÒÑÄRá·W¶ÚÇst»oŠñ#@Ü>Êœ£·`±£Ê9~’qµ–@¸Ê ZÇDõŽíq˜O®ÝQâ%Áæ@C¬¹jÑÅ‹zY„_¨GÏ´ÒËÊß³`Õ𢠞y¨>f=@‹¦½lnc¢plqDq6c…/©knãA §bÛw‡‰ÉVT“c»ôئô¸Æ¹ƒ«mwôµU¢t¸VÓÁÖe)á ¥€@êÉ» í¤L!c5&ŠA-;¼™Û¾H˜>í=#t]¼Á0‹+.‡Þ‹{|Èá(¥RY´Çp sôÚ‘QÀíhEÎD.YÇrgBªhceÚÚåÜy€?™EÛ““¨œ(-M³.UíÐ2ŠqqÍ&%‰rG # h*ha¦Ÿ7’'7å”LTÑE½ã’5äe(òìD¤EäE9®ÒðÎ3+=ËbÍ^¥ sᘠeœaQc n—UE —sÃ-Ž¥gÉ'µÍ–o”µ"Œ‚#œÏ žÉ3@Ø3E¬Œ½%¬Ò^(lþJáE ×1CBŸyýš]ò é™<Ÿ„^„:ùǼF\äœ-ûä-¿žçôÁ¦Š>¬S¥ªù*¥Œ\ŠY|&â`HäüqlLÃÁ ¦áD3›ÌEq±ùʺ«ôg¥Ød#Î3pqUD»3ÙÊÍmó˜S³y3TšÇvbwîò%iu:kóå ;–ÐðqÓƒIïár&f¶¸ ½/=6wï8H©i(tÌAtÇ®‡cZrEžãysñíÁ¯imÀd¢wP#¾n%»×9H,ÛÆÍ*ÙMòh›`{Íú‰0äwWÄéÑÚC’«zˆC»9–™»?TZT^­©-à®UQe,­€БýÖ D ˆ ¼íÜŠvŽ% @"Ô8´Å3ÒlŠDP·V ¢E¨VÖð’„ÌRZÁþ.qi:Õ; "42ý;9¯: zOhDJ2)—Ö¡ò&ÚLa('ìð“9DxPr™ ZÐìÓ(+ð‘6ðzc<7‹•óÐ6H,tŒE¹ Í™[‚àâ•Çx·´ÞÒ2™¥M’–?¼Ím#-¦þ`À3a”ؼÃÛ*ò"tž\:ì°Üg¬ƒžŽ±a¶è„:á´ÕöH Mbä„’D妤ž óÍg2IªòØWâð£OÜJ•ä@"åTÊÝò${.±¼ÐPvt*%XôCïëÅýýVBš%ÈEˆˆMm”Kn˜f lEÑ a¿ YJX!›± d8Vaù¼C¶”°¦å—”•èR¯^´<\/]aRÆ™Ôq‚ÌÃ{/!œ Kí;žª=8Ò¸† ^¢"v{°ŽÉó¼ˆñ<ÖO3+ñ«ó‚s¡Ñ‡ÝĈ­ÄÿO=pÛF¬“Øm^h¹mÎ Œê1[P¸)ÆÞ^„þ"Bèd8Ø¥Œ÷Ð`*ÊYÑ¥ë,Ôçf”"CwÎ[‘h-^Ûý±‚·5LJÀšNXøvŠ p›«Œõ E'Mç¸R?¬©zq9õMвãvÁ,Vy[R=/4DvÊ5‚A‘X>£½ßÑA ‡Ìò©øoœ§ªÔ"ì¢#Ž &¡[F¼$áãFDô,a‘Á ŠPÏ‘(:xì¿.W6Ö…¤Aÿ&$Mn~22ÕfYnU†¥mÈ€!~gP¤óÓ@ ƒ6±Ã #‹ 6X· 0X;di–›’”Û]¸ØL»Æ"Âbu°b•;k4‚‰k¬26â#vá /H^¢€‹ÊiöîpM¬‡¥0õ5xb¬<ëÊO …—ÔqÖd––´uIæóxªçR{ñ°ògi.Ûó#ßR‚éyþd1ZñKÚ3dÒâÏCù¤QÐ\!ƒ,ÓTUc0xìO8¯q(¬ð˜•¬#â‹n€Úîš<µæùÆà]ËÕÀ¶r!zì±(š øµšå¡…áЊ4¹åvéù ¿£çµ•'ìTSO=oi÷ž×öœJ€0Ñ(ì®ø…"¿ñ¨krŠîzÊJÇp8[ŸNõ–ç{žï@ ù€„g/7»r$\hƒr¶ÆËéà)7\À${ÿŒ°@cq±çÁ´áÔ`7|’I½­…ØNÚN¬E |h!Øò&¬ôìyÕÏóx§b-aýŸhþ JàäRc33×x·\¨xäB3y½§KºurÏb)ÌÅ6µs.Lõ_˜8 Åá‰[ Œ8$Êwt’tUÆ£ÜÿZI:õÔ³HÆ{T½9 r´ñ¬\Í{¼ÒÒGŸ!JÉ“¬ 1õÓAíEÿÉוôØ2”÷•Ky}bUÙbí …b‰ê°~Kp;•Žp,%¤%í,!-åî%aƒ,–¢"·æàÖf@Ž"&ñ~ájëaojüµL‡]ý§žZR’”²µzÄ_ùÀ´¸¨:¢;ÇÕT®äõIÒjธ©H¼v¥ƒ£<òU»— FD6£˜T»Æƒ€N,åøÐôGÛÇõþÓÆrª {b÷c‘‡ ÁÈ%$xëB 5„² o/Ä`ìU:X‚ÇLÅiÄ œ¦FBÛRS#±,4>ñ3öc{ã‰(ªøíopD/ÂÈ.Áø$¢YqØØp¼Á ä)œrbRr/Q×Ve,'d!ÄpÞÛé`á4ߣ„–ª#8+³-9Kà±ji¡×gàÔ Óbð,Î /¾¯oåR*ÏzM¤K• åŠ&Z{-ƒk”PF ÙJHpfA`@üJ³0– j7)º®™k•ÆáI(u91מ±õ,U œ‡¥Cö4 =wЮŸJ8(Ð~¶„Š1@ç) >¾ÒQWÔàýLoÊ‚O–~§ž'4QÚÆÞªÀ§ðÑ,±„Q›>I `÷œèpàUo­HpR–à˜,Ü3²Šf÷“É!³•à­„gd[+dq%§€¯@‘ É\ We]Uød"~¢S²FBû‡tpœqˆAþ Á›ÈœÒýJ„AqØÈ؉2v€H<m¸Cö]9R!âø=ÇoØTi™…6ª¼•m£Ú‘`T;^žàñL sxÏ¢5+²YÒ¶µQ×9{ˆ0&GÝ·ÇÙsÏ5îUÁ{˜ôãÙôY2K £6UB°^¤u\öÔµç'd3m“´°üq'`¾f w\˜SW¹ö¼çV´ò€Ì“Ò:Þ>îpU¹wÖó Nç%Ç[Ìyæ`2bG×öU4«Kl&ï¯;{†Ë®¤sZ”Ðê)ë¾v¸s ÉŸYs ^Ø-ܘmLر[,p˜Ö/ŒugîK¹ZB<—ϱ,—AÞ6Î0%ø-I8O‘ÔŒºkul^M @mçÚ!¼8¢;¿V¼‰óÀf.ÌØzÀuÀrzòËš´ÉX«ãx½<82›ÔÄ×V“‡þHª"ïjýhv'?ò]¤55K0mL8š#(qI†$ÉÆÁÒiH¨iº-8Ù:< $8Ú³¥…¿´ë´p –œ– /´»d‚Ý}è6ÉöÛ=h&™À][0 ó!’ UP‚(ujÀö •¿S ¥“5ƒ+ÁµšÂ%3©Ñ“ÕêsÕÓ-Á$SW É“#*@h¯WüF[²0¥¯'g²¾ô;íw¥€$ û·ZvSÙ>’JóX¼ApX'}ªak¿?µ-¯Ú8ô¯%ÂHÿðR"X§•ˆ÷`ÎTÑXˆð@”àÊ-ÁæõA:ð.,:X¥z,“ýA>³q_vD-ß ÿÇc,k`^ Ï1àþ‰&«KÚh4ˆ˜%x:¡Îµ1©±"|wà DÚ–‰É0W I– õ§Íˆ™ó«",Öc'pø× †˜bƒ$H2Žè ã63 PèA ÞÁ J,žSg¤šå0ÓƒÛâþõˆi:ÑÅ.õ¬-ú¦Ä"È]7p^?[ ÆÈN=ê„ -=ÄÙ"æÁçQB­“ÖFûú­6´ Ë_©­’§À;ÁO+-ÞÛWƒŽæ•kÛ _xQq£¢µ¯së+_Omoóžs~i¯ñG¾5ú´m¬­^Õ†¶ýKmMÚ‰‡ÙgÛPÑ‘$Hðd׿û;ÒQÒ4b‡±“ºdÔÌCÎïJ9I{Ö›ob'—l:¹ £‡Ô" nhƒWîv­žlg$qFçàðëÐ=ä:ÜE»CþDŽI ó=F<Ñõ€'Â}2[0¹O7!²oÂÆÅÕô‚Ø4ªˆœ°ÐŸÕ‹Øbé…’Ó€N|è–’î;-cæ(…Êi”ÑŸs=˜—h ()¸:/U·3@í‹’Á¨ƒ77 €Îë¾ü|^íãè ç¤{ôZ&ç$ÔäY’mŽlÀSQð Š+;»8yô¼4ð ăJfÅ-³lhÞS1‚ŸLzâ#± Ã^ÕRCŸLGg]ï!û°½¹h^Q=.ÕN®Z¡Öãrɳ‡ºI®Û…¨ÃŸhKz,‹B##ÙSz;µ€‘@äÄW™].=/´¦Óêqƒô!WKÜÅQ,Æ:}ä$»~%á0B É®:ÅuNܤ.—_Üq¯ý¸åe½cw ÏG€;ÃÁ\ì O¹L=›ß-®Þýpk'¾Þ’\OD—ÞŸÍч;vJÞ*`iøUàIA}çw® àŒ+¥ÀÉ 8æÀ³Ñ'£ˆÙËi21v›Ý( l3ä!‚•'qx,#tŽcÎÆr¡„¨Dç¡Ô`V[p¬‡ô #ç .,rN p55ê!TƦ ŽÒdK ã*&›kZd½šmšd›“5߬˜¥—µàk<Õ›¤«Í™ ^š» 㪛Hç…ô÷vØLöPû¨3^,Ðø†fïóúL\X܆¦NÎuœ„6fdkCÄgÞ9¿ÀMâáÆÀÉ¢‰O¾{ê¯iÇrmlÄ^/ù;˜+!Èæ0\ˆ­—+æ(Hó;¬’ÄxfáÆEäz 7ØY•l âR¤Gpfw~Üš-ÜG掑!JæƒÂ&áÈCÂñÓë€ïoŠ 0çEJ²w~¯vN*ùèÚôŠ'×(%¸s 8¤iDt%›âÄds¤\È-<₲A`IQhFôÌÃ×$dWâBÕ»?+œ$zÄQZ5´<ÏìÚ%ç“V§Èeƒs– Ç;ÆÆ9xq‚¾(ÁKVd6(ݨ­øåvªÐW£¤ÐCLJ:=û^ÓÜ™2¹c•-£§O>Åã:-o&Ž3ÅxâÖÌ%±§`}zçBÌbgÿ!ˆi<åk68ú$Ö3O£ª’²Õµº? rò_$Àá8ju.€Ïá¸-ÙbîM‡Žœ:rg¥¸‡Jð\e:Ë×£þèƒd/r½ŸN४fs‹q —pÞ7áœLŠìŠlw8-Ÿs?¼ 'ŸõæH™ÒVë˜ß9 ŸîOÔïÒ÷g»¨—J§P™Ch ‹Døˆc›Â°äŒò(-ñF˜·0@Cxó7Å%h&¬5U‹rZ(álMÂQç„£J)–½÷efñf6&Ö”ˆ’:gå̼û/Z/o=ÑÌ7–´±j÷i?×°õ§Ü–HÐÁLq)áÔPÒâÐÁy»åÁH±`É™Hmh‚4ÁgÖ nô¤Œ #ä^T*ܼµ`m.GÝúbÜ€_gãØ$¬Úà•-áäœ@ÖfYÞøÖKY*Ê©¡¯M‘| ÜMNê$œˆJÐ'V¥$;ðõ˜pt<áäW’³IgAo%:ðí¶)˜®„uzPWOæC4eª$g•‚¥t Gøã:x»H¼,dÑÊšdNË’[xhKI'#pðd–è1.‰Þ<Žé'xªë±iW+x,qQ+ðV¹Âƒküë…~Âê þÜü¹%9¶ªvÜæa¾pår¢9ëAcäÙnM´ˆ¢ÒG­|•M—w29t>kfŽ1@±5wè‡ó¸ßo >áz@OR D@Câè‚ʦÄq5–¸¾°Š7Ýh’!ö+R—r°Á‰JQ/OÉð¦z&ö•W‰Eca¨ÕQ– ÕÙ!z³c¨ÇàêDÔcÆß±IèaQ’à)º1ÿÄ›Þ2ëéZW\À.'Á‰[díŠÛ¶©`oôK3ð\³ÎnR—i+óûã›Ê‡½@´;@T’Ž™]±š Çe‡8xA‡—à§Ð'¸zK8÷æõàKÄ…Uz÷L ÿv\<:Ú©àÛÒ€ã Ððè8AjEÖ¢*mê'¸ EÒ—š—®NÌ‹ÖíÁ_Ûà°6Œ‹^–›à”-á^éét, ðÄÕF™Å6óÎ?)í zÃ5s‚óµ”ʸ£×ë•oñâÍ÷Ì@YSa@ýG¢Ê>ÁKÂI½”8‚J1ßø°!à¯#PMü)Hí2„t§DÙnr†Kð!ºVƆAÂYkÝ`%•C¡äH2ŒxY^ͳ /CNߤ«ñR釥ÎÖ…½ˆ$.ÔRâ@'„c˜„#{s9a¥ø9ÀBà?M}{¯²ŒÒ»¦ž¿»•MwœúiLGé?r&ØçCÅi‚󚀮gÜu ìàˆp³–pR®61”ÖyÄ%Ž!UŽ §ìRÒœÎR¦§hÅ8Zk+H• ¹aU}AܲS§Ð ¯§8GÁOd ø+ã¢5Á÷Y‚£²„sPàÜ‘MŠˆe‘¼V$Ë]Òã’\½3ÁÄ\®C/»è\)žÎ ¸7J<2•UÜâõÒÚH/¢yJ\FýŠ@ ¶”IM²·IѬ+lþ%q[4Ц„"Îȼí¤,÷N‹a®qÛäh~®qáfÌé]Éýe¹„Š×g›ª”˜ä)Å)&rÏâÍl/‚Õ¢à9Ì‹–Çb_n¦”êyÉ‘\yÝ_ü&-·ƒÙl‡]#Zõf‹á_f‘©)'ÿçB‹=`€,n·W¶H /B%¿3yûÂDSúàõ+|ŠM"0ÅY_±ë|à½1„%1;°ÅLN³ðÃò6¦*<€%.­yI(B)Ý d§ŒšM"¾ŽšÌeD2ç¥õ@xNÎL ØÄ nÜçŽ3%¹Ü7Á5a/±Y§ô.·õ5ê!Ä(s˵?”…œ ¹>Š“øûâÜþ $E¡96—¼#U’@µz™S¤ Rå&ï@ë B,(¹Óí4$ƒþéeUe­”0àe,eÎpnwZƒ ±¨¢2÷yp-ÎßÀYŽ»JEº†º4øÞJY†Í-ƒ }¦òræ/ÅÚ¡Ã*&Ó9 G#לbÕì(Á!˜‰â’Ö/%,P߬­Ì\çr1v·hsa;WnB.wK/ì® ØÃ~Œ úƒê±9¨´·§;>'9 0žîä~cNŠC ïXt¹Î”àSŒ?p F¦OíCjÚÅXžŽØ¼éî“ñúcÐ= ¹bÓu¢Õ/ó7i;ä¸ù.6¼Ö´8áåÄ pâÒg'œ‰¥¢÷7iWîÆèHÚ"µe=ª1Ê]žtÀÛ(_ZÌH¢{ÍíYq’ú¦glf°Äú%–-G߀ÂUX¸Ã·… ®é´%=®pSä† ìDà†—ðQ(Ê]{ ÞÆxȇ~’ÜÙà'óRÚ% â©€ŒÌ'¹€R°À;âT—΃ab_ºÖ‹ïµ¹ º©î„ç0Kx08e‡¯:qIÛ !TbÕƒ³¥©â»}Þ_UÒByiccê´WEÃIq…¬0±¨ <çOÜH…"{ 2¼“%hSgc¶5A”àIn”â¢&Tµ«UÄ%?Ÿn6TjOQ*žÛÞî_5Ÿò¬W⢆Th@8÷JhÆ—g ‡ÖÓô Ú. »WvaÎÈb—^ssÀÀZ­M<P²û¢¦¶^uÞ¦3°A¡©PÓB #þTh\´v¡ky@;;XFæ%mkƒ^Ê–ÓÖ^Q¥×Z&xnI¥ þ8êeª(û‹¨×n¯’I^$Ó0R,qOLòÀ„]Ç Ö¡Ýbs AF¿Û²šªnT†ŒSsh*xà>™ŽŽNú‘|€¡ŽáV£åº4¦Ê(wwãbB»sÀ´”³’THŸéöE ˜~p– 'õè_xà‡¶L¤ÂF75HX®§ûøI¯ÙÎzgg¾èE¯ýÝŠ-oKòSÆ®?tȶÄjvÅY¹XRk!ÓiŒ].†—;Š«lïŠ(.W˜ªHìü¸R§ŸŽ–J> ޶z7Ý¥ÅrÌà´GÂS‚ó«TºÀ+¤«Þ3Ï»ÏãxÀ9â¸/"›åM¸tÕÆï¼5ZÉ–\}%x Iðx•àKQ‡ ž ÁVg—VŽ«šÇ»A5ksã*ÝÇ[l¥îç(U°…G¯D½@ëªÞmåJÛø³j½.p6ÃJÅ^Óg©à¬ðÓ•àœ+Õ!sÊ ÖNèÄÈ5‘ô*ÇS§HIȶ-—ÍÊ]¨ã]¯E?®JÁ4«`š$½Ê'¨¯`ìð×Õƒy)±›‹í(¥ñÂ(ûxœ¾ÉQ×TI4Ss;XŽ0éǨL±Šq‹ÍgµQIÕ.¼ Ùï×÷꥿²&¥=ö9f¾²äSZ^+<¯öR€è/á†+Á§VªéØjôð¡²\_,+™íüšà _y+0äd^?jäµ­Î’H)vù¢ÃÏ .—f1,èI|h©®-j Þ9‚É(óY®¶Õä¿«Ùôà œ…¬[–V_8ú–€œl‡ûÎu'pÍ„S==àa>Ú³Ã)[‚K°Ty–ž+²eY&ëA]@Ì݃(ª3.5jQÕýVq°»DÑóÏfïf+vþà$ÿ¯«‚m=vZy‘»U^uZM]¯Ò(Ú×*H(„ÍÅ*UÏhœÏIJÏ%¢}5^×δ·VƒgøÁغ˜B˜ÀK5àkÝ`ØJšw.cÆ2å´†B«š×`¤cݰ.P)ÄW8¬J<;\OkÚ ³¬®n¬Ü²-•Ö~œ‹­¹üa ˆ ¨ÚÚ™?CÖS@@KkIYÀÀ›XªÄ$VÅí0¹p¬þ„Ùƒö¶c4FSjËpM•áwÉîÁGG “á9Ô6Ú·ù‹¼GÛŽ"çƒ0«ßˆ™ÚüÎ%@þá\B$z ÷½-‡•«Îð<Å`=.œ±wÆ`>8^K¨œJh¬ŽóÁ›+s•Ѓ.‡“²ƒk!è¡â¼†R­4hKëŒ#³îÐ žABžt‘õýù '£|è ã(˜65ªTkÛÊ~ÜŠCƒ:åìƒS¶×÷jƒ#Ob’Œã¹’.J}Ô+4×Ëùå|KÆ Ýþ…Ы@I@? ydT9bNU²ÌzŽ­‹ZrÃÇpí`@õŸ$.0å4À)¬QˆóÿìÃÀHtdÔ«•&Ù¸Ü8$žÅ³ÔŒE„Ä®çÄ3Î ÷ žc«Ä¢ lú-_N€gqèÐÌ­BOŒfò,ì<‚äÕfµ ã! H3ém*ãXñau犊œU·Š¸×•qæX(dœÞÎ…§òAþJœŸ/Þø¸«*ÞødWi¨úçËp•á2JVÇÚ¥9.ýjþ’Ú:?kÌRžÄìÞ'ú?í?ê“@|{y\›Øò¿þÓØ@\{ðHCQFŒ &ôR7·'º•–Ÿl&hyØFzø"ÍÇ‚ø‹r«/¸»³8)÷Tá-‘~|,àkÝÒúD—¾q/ÁÃ>Âgŵ„ŠW½²k´¢0Hì‰$ð‰Æ®´ÒŠë´iI‹Ú*?AÉLsŽªiÓ9í ¸#liÛ¹\ô ¶¶F¹D&EeÛ0NåŽJ;'âç‡ü;É 2#¸™ÖßL+ž«Dßc?'À¨°§¼ÏªFxìRzg{©Nyy¥çiFÂC–s†2#ÐÒøÔðE&%é6È¿q¨ž(™4•YŠˆ¬âðç&[´²b=LTÎ0Æ¥¨œõÐzKQs^ãåÈ—d6‘7ÓýDÞŒCí*×fzF‚pÛcݾ¥®^%+me=ÇŽtÌryÊbá"ü‡mðg'Ó\63tƒß¶»Ÿa›UDýa­d¥JuœŒ.€èQ8}Frï>;7žü0aÇ »fçU2Ä“=œb~Ôƒd†›#<íi³“ýÆÌÓ”t|1_Ñ’a¤kAc`†¦‡þܩ݈a";¹)‚O^j\ž){);0×I^ê¼'霕¾N±Ì^îÌYr£=ðµJ v·Í,b•[†ú„î¤x4Ñ륿 @3Ö´ŠD¤õ$`[Ú†¡ðÚ”áÏ Õã)œÆ„v¤t‰Á`5ŒVxc“Y§LݧŒ–P&@ÕY XÕxžžÌ^Ø]9ÝEÞã„ñ4ˆ ž½÷:\½÷§áŠNØ@Q& ÿMÙ›÷ŸC ƒ$QÏ‚¤ºò=˜€G³Ôþ£«W/½LBðuöÌáx,F‚ÆÀ‚7}*ûÐ$¢.äcOÛv*d£ìÄ9”ýÌÚ ‘×'/íAf¬îà§ Z´£Þö·˜( Ós;°7µœš%ÃST"!{ËpßÔƒ¶ç´`äLŽÁÊIxñ T·X¢þ°“Ò9  Yð‘DxĆíÔÇ•g†K%V­‰‹·#êx€È¯KÙ³S² ŒD˜Y^³L]NX 6|¢AYЉÁ [TžïÂÔå°XÿI6Œ÷€À‚0lž÷.qLI²xáÏÒ—(Ö0\¤QÈì k_¹¿žåoÔ*ËRà/ îiµ/³L~]öÒª/jÛ‡76i%®ß$ Ïñ\ÚÒE)½¹rTÍ›1LÿB2mOR]E8tÑ–á£$c38Ã/S^”´µ57”E¦ÔayqWêÀ¿R–ƒ;‹²ÉNiw`KF¼ÂMcËl‚âe (¢@êaZ#íøG¬7ÃlƒÝ‡XpsòxÙiŽG3O•(8Ø©³u)›¼ñPñ7úÃRIg2]-Nþ†Â n{²\Qì“—#R¾Î¼‡d<îF(­%¯{¤Ré–F)¨µ€"Ô”{3êôõuœÏA\ã‚e1¸F#½¡â8‡8ÔÔâR*cçÚáˆÒÀá±{žáziHIcIÆ–áFIL¯M@UÞ¦Aà¢e¤¸‘6y–'áˆÀQšOÅ40[ãeaä‘£;5dEŽ›Ÿs€æX¾Û|™ÁEÜ-Nl±©àdr%¨<ÕE´{a î25Hµ'Ú&Örª*c"dØSglO÷€”5Xqcƒ1‡b^=Œ?óˆb†ƒ&ºèP›¢CDMÙ#C¡Òƒ¸Ð.®hüÞ)–.ËKìÂÄJNzÓ§Ù÷ µÊxâÖT‹KFÜ)%«ACÁþmIë÷jå³,Ýi2 ?zdÏìË *#ò¨ §…˜¦+Õë^cb1ÐÒ1@c1yr§ŒÅ…•ãÖh(¢u)6I@DZÛšJ8FÌ„h }ƒM;Æ}Ú£Mµ‚32Ž/{µ9r :ÃU†ÿ¨q [‡Šé¾õü©-MP”à T†¨”Sa{6¾iï•cïGxkBïõ'p³8‡ß-cøŸ¢&$ÌŽÒDAí·Y”…~Ì‚æZ&ʨËã²n¬ú³G€ö*‡dçTâ‰ü1äù@Ež¢ß¥l—EÂ…—>Ñ›Ø)òfRyn…(oš0ëKXdg¸`¢k’1Ü1U<‡g­U'8mP¤ÓÚ@.õ^àS nJî*Ô³ú RÓÜËâ4~Ö.jyͧ$:èuàßy´J´mi©ÎÈ/+$Œ@ ("ܯXÚk¢Ììƒæ3V‹:ʢб`¸‘ÊéË­ÿŽÂ§£g@˜AïØÌF^áy°²ŠX–„ÑõÛ’ U`£Þg2Ü ái¢c°“1f½Þ9&ÿÝ ¨sæ°‰Xã`q†Š¤æŸô Ü[McŠ Ô>´9×¥t†=\0e¹Ì}´ O ™Uç›z2ì½Óïê?iÆÝ™¯KZTž B̳H©{0ì"ÄÕ̓nÇâ‰²ÊøàD$š£(¯çJ(râêI"ezR[ðóX‚rki-–ç–n†wFylÅ tò˜¬Ë´]úrþ|¦:ö™ gG. ²¸l¸ÂÝ<Œ¿È67+#.*p¢Ú:Ò®L>ôIí‰ã’üVe,æ¨,yÄ7fê­Y½ Uðõ”#é¬<3ÎLòpã™JXîðíÑÄÔ-óûkÐ6Q`&?ëS±dÃöDD4~ê±ðW•áœj-÷FU£§ö÷€Ì ¢â;i!­* µ4„ÖYfAƒéìƒÙ³ÞdÛ+MÎ ©ž+ëæ[œÜt~µ 2¥iûûè&^ÀR‚¡VMôûjÏh×®I/·O¦0OÒ@ñìv؉s­4=©ýû(Qîe ÇUŽ«2Ö³Y¬R2žõvyIJˆp·ÐO{ÊÇ™BÈ0™]D!"ÀÏ*£$ÞBxUZRIHR,i%È Vš^ésâ9è…Ä@¾5ËeŒÂUÆÊŸ’ …5•‰Ž‰Ü7«0¯Ž}’XI±¤¤ ~BÝY˜¨ìl1ͧ;zv AÂÙõX 'páÄã]æ¶…?xÇF0²È/óI&&Jzé Oè[â6²cþ›#]‚Îðd%‹›”W tLrK>Ê\ØWQá7§$mRˆ.Ž£ß9q˜Fâ”Cë4‰^lÓ†j,§Tl<± 0bxºêô¹ÁxßXçè×ìÄWÏ‹œDsÌI+… ƒl4«XÞ…YÒ-ÃCì&=à²?±¸@  Õ<ø•#…a–à™¶®z8 ÆõŸvƒ Ç_þ2œËÌ€à9‡ãx*yS¤2Ÿ†@÷ˆ”Ž,„‚%Q·ÀBAWâ2`Ãà਩?qìÛ[Ò.ëlõýs w–Þü²0/|œgËpâ£šÛ wZü‘Ñ#p³j`´&ÕðÂÊBáŠè®c¶Óžˆw’ÔpÃUN¤ƒ•µuMå× #3ñ b†×¬c]Ò/.‚è]ˆI“$5qVƸAÖŽ{±Ý–•­}DJªüA᧪,¤Óó¡ìî»P\¦eoZ^çãRŠŸc~áH8WáU‹σ´cùËDyt܉Žþ´’É Ÿšìt:q›µ;w+ç0„z{u±¸ Hfv\T6žˆpfx#êK*I~¥2|õز:Æs¶zíšh‚õ|ÜU»jÅ­.>ò^[hÍsŽ‹@uH5œÔù‹vkÔÁ’a’¡Ë5f¦wc½#‡#ÍÖCµäM’o®fi5<}Šª!'¿~±4‚+®McŸ G^{%NÝSäø¢ ØB,=-¦Ðpz%`ƒÐjmRõ¬UcâSºìNÐ%ö ƒ‰õND§Â!XÎÙnÁܨe80ë_ÈJÅnÃz@HÓØ ÅgÚœž¬¤jã2ë~ Dȱs&Eò†0ŠQÆ••ÂÉÙtæ,*˜\ÂîÇúÈ´ÃðÑ5Fuar´¯ð5ÏŒs…œè›?Ãg×aM—ƒ ƒÜiûN±¨MY®n®e•}Ù†¥Q=%“X‚b\.)‹U¨üZI¢d‡'ÃX†k° §_9×af±Ü]ºˆ7‚;)µ9ýá8€z§³ÌÄæÇ|NmÅ[ãéü|ÈéSöb¡”äÌÙ 1¼“+—sØÈŸQŠV•¯]“0\-ÇFdXEÇÃä¼QĤRz¶³ˆªÈ{Ðá «“â;àãfgtJ¥IÊÔ^-çMûZ¸Ã%?»2¶Ì²Øa7ñ• BÚ¤i£¸È\ HÙÅÃ)Fá‰áŒƒëÁåÉëEœ¼r ÐÛ4^Æ©ýŒãÑY˜+UË;}áκ˜ˆÖèÇ9#l8f8¿ ëF GtÆ☋'+¦\´wB=ßø…¯yÈn¶z¬Þ©£7eÜgÍ@½»¨ÃŒùŒÌ¾¡ß£Q!wD3nÎÎe\X"Ž3®Š¶™­UŽ oÆ „ˆY,€9±ã5³©‹íõÎÊðŒÕ¿I7—h3fxÃËp áa%Ãkõí\Žæ#SÄÅŒÙqRö9¾ˆ‹“ç¹@š´LÛ…=úÝ)——v‰Fx%–é4Ó‰×}Ù?­ÃùªxJfÉ`÷ìá%¨²‰™¡TSM… §ÑüŒ¶pê{”w€•˜c >Ž÷lé(o¢ç[Û?Vû˜áÖŠ¾#ܯ¨Û*ã¸Ç²°¨Kœ&ã]/¨Ê…˜Î6A½Ö Ò— Qï2Ò+©:gt“q‚¼rŒ ÃJ1| LÓazÙÓÝzéÓah-úלr*Ë­QóĬøPqÑëvr)Õ&B)cpºî¡eͬ·¹T[mLJµ ÙTQO[8‹åÔ¨,!IIxêêP«nb\æh©vå^šã—*qî® ˆ¢ô€Ù'.]b‘¼ˆ"n¨z l¢ØÒȽgwôÔ®uá¾RuáÃw ,Ù¼ÔKÒœŠ›¼ŒIð·ø$%ÞèÊKg‹a Y|¨Dò‹G¤¥¬@¸XÅÂUªt„â`â&ú´»Q¯»Èõaøè¬WïX!}±õô¯Â¡R]°žõ6¶…bA€¨¨\RÚ͸‚U¢é?ÅòÀ 7¶IeíVýãÏ“Of8«ê œ6´Š5-|bexgÈp¢Ñcƒf—»Õf¯Œá¢ÀH¹üÆl ÂÄ[lÍF‹œ^Ö–ïìÚ¶<ÚMS3¹7OJn†<0˜œV?ïÕ#²'ꘔ¶n« ‹íC¿‚3Á'Ãõ€>ˆP¢ ‰ÂèËд‡ºÐ[¾•û]vùѱ7Jg|•S#tC%·NÙDZ{£ÒÞe DE8‹ˆÖc°œ¯1/3ÀŸFÌ5fµ%°&ËpM¥OIØma¿GÉ.–Èè‡óá;/ôp½Õ°IPHÁmjšQF.:bö†n…/ª\é…¡W®õ wh¨3ÊÕ‘aµ*á×Áª^Ö¨˜4¬ÉÀÎ0þžhRƒC‹¹f;Ý-XãDqªº”ºŠ aåibö/xs/}ÅlË2\XåZÜVÁ$/„¹)Ö¹tÕSfƒ¸´Vj…® ¬!…Aè9FÃeܳ[Ë e ¬ £V7`Çô­uˆH50ËT9SÒ'}£#7 üO⥙ô…ßAî &²‡ Ž1±à ³M/áÊpÞ´ôeG„õ¥ÿY\ Ö]×p%•E™)óIm™¬×àêPÆ—+«X<(bXÜ ÓõÚtíLªªª¿6=îååsðÄÔKAýSd@Ò¥ßV’×NY׳ðødAa`¸¤Èe¹“ÅóµÚÇ ·N 66ëSn"ÏÈ»Ÿï àèDÐè5uLjÓ£¶&Ó—Óe‘ºš^Ÿ–Û¸¤e6rEE¦Ø,ˆC»ŠÕÀÜ2õÀïÌ-ò´¨%Ž·²¡it¿à¤4ŽÏ~)ˆö,“`1‹Ý׳5¼·Ñ™~»-8í2ðC¼Íêá%Uàó(’K˜b/ ’"‘µ[G¿žaødb*¿áÔé’±ä ¼R,‹$ˆÜ‰£¥ z n—,s(‰¥h‹qƒu\Ç¿Öã±ÌŸÃ]۲ϊ‘;ÍÜ£)Žš2¼eøeé‰Ü¹WGk2Ï< öÁcõcËX2 ¥§tk슴w5Hi—jEì)“ÜEÖÖqå0eq­4ÆEVi ®”eÉæ-‡d£®e;:œØ;ˆ‰#—Š×? (p¨–u_ –9‡9&KÓþ/Æ íbËáúa2EKEÀ¯@—D\‘Â'Mnê¿°@šj%÷qµ.ÆIdKX^ |Âå&¶ÙÖlÍ&'RÖÁ / ñnÕr~³|~ÃêªÕ¤4”1y~LëÇ 'GÆ<ç‚{£±Œjí˜Ûú1»jïÀ€ì[ˆ²_o3£Y_xŒèŽä#5ºH “K/¸6Êþ¤p#ì9)”uIJÄÁ¸¯Å ,à œ!¸GCNyíÕòZ6>E Fô&îZÃ{¶½ u§SŽC‹”1Wàp(€•44Wnܯ\bݨÇ1p†¦Ãî„™Dš·bzâ`Åè¢öPkqªSàtˆÁz|G+KŒø6ê ˆ^*P)’ŠÜž…>½ óý;ÙŽõãnôdÇAý'œ;) ›÷®ú ÜõxÊÒ ZbЂѳXg%nºÆÎ´ÑÐ_¶& Cp|ºcü„´ئ¢ÑMK‡Å‰Ï³§!0U'"-AŸX[à'>>Ú:°÷—Û·Ø-­Ô‘6""zi«§¯$sv¿ª|r¢jÖÛ3Ee[8Ò;㊶a™¹96÷ÝvYT“ä•>ÀYy#d‘ÏhkxI=–ëu·c'N½wg¹2g\:ÕÖ _ŒbøêA\A x?_O"}“øÌ'ôBªs´xA*ð7tB£v"5¸¸)/K™XO¿!N[Ñräy»Jýs’+äàJDtá^.d2‚SE´UÁ¦9 2?¡þ ´eú—†þ‹Ô‡©˜ìæÅu*åû:Á€ª±K¯Ü Ái–1 ÓŽ–ìlfd@CXàûªÀ‡U·—;.’í­6m4úG ¡è]›ØºY¥œ‚¤¬ÒŒqY§B^yL&pû™ª‹¤ËmiÞðW¥kR2\kE3*^É×9Xa[¾Íaó-2f"R¡õŽœ \8l*ð˜TŽ&p9ÊËÑ ÁœAtfoL«ÿÉyÆ}Kz < ©0×(ðÿƒªNèqts$·ÁI ™¤5?{lÐéÑpkƒ`D»Ã¦¯y7,‰Ç=Ý·I·Á+°„.ðð“í=]âd@Ë9ÌBMÌ,¥Ž%^qܳæ-u~ÞŠ%£D §N¡ ­sÜù"j Ô,+j˜ŒÑÁ´+Ë_QSàÜÇ‚B,YG0íUG,µ‰.£ÀkOP‘g[¤¯³«Æå$?K4D¯eûõÅ «„_šbG®¬Ÿ-‘`¬g¶¾ùV³¬ ít£‘Wƒ¢OÇÓ. <”ø-)ŽN¥üèªÛ@ÖWØá>à"h6NŒc:z#VÜafÁOÊÖ“³×Mˆ¼n2ˆ’”‹V»xlÎn•7m“‹~C¤¹›õLØg„gz^9õ£€áÙ<¤+l#¸.\8ú)ŽÞù ø[(`*=vΞpXïôÉÊù ¾ä’ÛSp[{¤àTÝñL¨ÜºjÁ¸p™½‘ð ¾èÊ諽 1è/:1=¿µäʹ¶¶ƒ6ä×óNæØ ¼ôèxÈaÃïçú›,q-—<œc›†7|ÏÌP¶ÿ £8Ÿ¡•1K&‚“ =˜n‹6ì&>A¼äƧ'»Áé÷">‚zŒMóBîMB8‰Ë\îÃJ¨q¡}”q#{sU=&I‰KËP˜&¼ÂÌ[3pNÁànœ£„š„i¸ï)ðûÑÆèa9ÚV­³å`ÍpüSàà´d´plUàû£À-HÇ>´@7&£g‘Šk⮤8êQåçŽ2iàÕ1ѦŒÇnbÿžÆ×+‡saEÜõ˜¹íÚÝ<¬ h‰ñYÛ7+nß \óxßé3À üó¸¹é±~®M1V$3Ñ<Í ¤7'ïRå°EöéÌ„jˆ(ò·æ)p’BÝu¨‰ÃÑÖ&Œ§¥Q~zzà ,º+0[+¸X»À£OñN:“jëÅ|Æk°z]רkƒ3Wª´Nôªši½dñ :øcØðŠs”PàS§ÀóNËœ Ià §Í Jt%¿4>eûl´ºe‚EƒÅ6|‚%Çý)äFž>Öƒç³T€L8AÃùÚX@\Š^ð6ËG_àI«ãP×€Š6„Ä,ˆ 0Sœbs‰\‘0²@C½pI¸*pxž';d¶Ó!~yÒs÷ú¼¸èåâਫ਼Á­v¼Ÿr1C´£Xùy®ß‹ï–">wöÇt4À„ŽwfÂ8`àce·¡ÈîB ŽºC¼ià4–h`,#б▲ãôÖ]°ã|‘w’¢]`›±h‡»¨™3kë\Ǭ;Psl=ƒãÅÓ–³e©¦K“ã/wã°d?^¶"ç <ðÔ]àž§¤RpΣøn ÅÍ<½§%(Þ%_ZJ0€ÔOÁç 3; ÷õ*¡BzJ(«[Èú4Äê„ 4>-ÖŸ|Ó"“øâ¹†|È/±7°·¦ å„=¬ta7kOuÃÞÚ$äŒÇ’}ĆãT(xtˆ~6YJþSpà+É›`·¤.s œ ®¶àŸ§È –±M¿ MP:Pvú·ÒJøì±€•µ™öš®Z°\ Éíi]eŠ ÁBÿ Üÿ¹ö€‰â-ÈÎô¾{Š\ÁtÙ™²ÁûE‘«W ¼W÷ -µ± |ÊÄš—9&ìŸÅÖ¼!ïÜásØÉÜâ:J1ÁÐlØ _<%¢-?Cv…°ž@¹à ²+ìÇ€µáãtì¬@¡±%,عA0Ö‰\nN»rsz—1½éÅþj:ÓÑéÕÄ-7ÉS(sŠÖc<¹[s¬º9§ Èœª:§¡pð³„8ce¦%›i…âJÀúéA>¥ÅX(K Ä#Mšà'™N ¡AÐJªÐµYÙK|M­êëÚNØâ ir­GJ“N Àáfa²ÚÕ‚ˆËAŽ|·"ïSDf–Í&A1ÖZ8öw·æBaë;gl¥àî˜ĵn« ;hÒLü´¬\xb:¼±0 nm”“RIêìr÷æoŠ-ÑÙ±7# æP£ˆVý[qap ¦À P‘sù¾|Jtf_§[EV—fcpÊÌŠ!ñ)% `_”iF?•E½·° ½L–e”èãÒ³îe‘4tœÕbÐnÕ 0Â"ÏF[™·RFÙ´…Ëþl—¸ *v%f‘‘ÂAy#§Éçh®ËðæŒŸÓHfL$Ç´‰v5± úœ×!ƹ ±ÿw_W–%É ÿû}„d÷¿˜‰ Ȫö¼g3Ùû" $B굺UZµøg/W¥ZÔ&Éè^ˆ Dµ–w^¯Ñ[5Þea j¿s½S´UÂ7~×Èß§–>ÇCq¡=à‹¼ŠVre{þ»CrjS¯%Ù•öŠãüK'!‡»QÉŸÿ¬ à+°?Ü›!zæûA{1ùó–×¾dUPÇÚË›:Egõ3¶*6$rm™Pˆî DÎZý¥?¾Ð Pã¼É'­}¦µÏ´˜IpúÊdàãz™¹¿¯X4,\ËìªVÅjÝ\·dg€Û®tžàŠUÀíÚ8{lÚ ¤…ýüÚÔXG՞ߣ0NN¯#-§îþZz;°ðGµú¦Éþ®í¢ÉûµÒúdã"95"^±Û@KYõÚסmÝxÏ9Štyñ³£n€¢Q¹;Ài*÷Ü|ã¡lX£¿b;ƒ)ì1·±nå4€Ù×uëK[<_²lóÊH6€¸QlÀ{šU„'… T•ósG™Šƒÿ©8šÈŸðƨ’ür£‚×·Ç¡_å² WiïŽÝåÚê·Ÿ”8iü|µ—±ÿl/Ö—|xSMEÊ«Ü="?z¾lãwÓCÐ>D©‘3?Î#ðeðF£©iD4F(¶œ|W _7!Þ†{]í¼Ch&8µ,÷g±¸¾˜Œ¥Ð…ˆºb™ >P ØkØÏ ¡l,Ñ~”²  ›J@ñ`q@[@Z¿ vÂl7lÍsÁmÑØì(Úº¬¦ž+·ÿ?¬Áëzîk­0ƒýu”Õñ x> îÃ0†€dî€üÕ²ÏÃðvüÕ²Ïðz°¶ÊÌýªß˜ÑuXêh¾¡aÕFðjB"Éîº]p+zJd‘éÁÐÎ-,Mp8¨„¶#BYZÒÜo¡ÌdBø•qKɺÚjê;®ÎV \vX¶Ó$Ó<øÌ0ïÕQ‚ùp„áÍ5Õ€ ZAÖÔ¡Å'îö„Æ—`”^ؘ·GJÅ£$y†P‚Ñò {î'X`ò0UN¨C·;Ñ¡Ø"P°\1¡fääÔ—ÂFž#ìh¼xhXÙ³!1zößg;M%ºô'fÙ€@3„œÊÎ0‚…%³‰Ú&—ÿÓ3–5¯vŠß者~x&Dù¼½I:I†32RõMÚ!k1x>8’(@0ôGÌ^;@þÐÐZ†‘“ z‚wvüßDUÜùPÑÜ»ùzO'ñƒ‚\$ñìÛü&~ZAÿ“|¦¿Èçw 7ú'_íÄÈ56=íÂ-®G—p„ ¬¡?Z~“íÅy×ÛYTûN‹²¾Ë‚Yz•À6òšu0­ô¡;²M¥HžOZ8?hág{ò3€Vä$.iDbÆEgõ¹cñ˜õ,‹j²Hå~Pÿ{$çg,KÀö·'úö´«eŸìvpÌpa  #P„äA±.ÿ>GŠ´ßí` aýÏ•¥÷ŸPçñzD÷'¨Yµ°"óÙ³:ŒÍ@[u“tÍ*­¤ï¨o½ºS"1ÅaKqR ÔÔ ˆ™tÑx©ø¢NÙ¸©¯æpônÓÙ­6ÈF&'ò‚冀1ZŽÝ!+°«³þõZžg`|} _hزÄ|Z¯×Àœ¹}•_g…²È­“²pj3Vhe£)ú°.W˜{2^ÓrVÖ׊ý£v0uÜLùÚÔõÕµ¸®q9%ÈŸ³JK}žæ‰¥³Kü1)zDŸ³FÑ à´¡9&l*Võw“( ̤E09 ñ_¶PÒ±ŸØËRŒÌ€PÃhyõeFpÒÞf'Vf@—F‹®?ÍA5ÌM5Æ60ýª-”[Tî_†$^.ºm´/2Ž¢Cù¡@]pwõ®t˜¡u|+}wìK‡ ©aŽÖ6Tpo­íŽý(­£ÓÔK 4«èI ´Ë¿n$Å;Й²8÷_ t»õþº[&ØäB¬r>ÌRvQÙM0µUyøë˜O½8=ëšh?`¨Vð¡_¾ÆðÒ/ÿ=†¶qÄÚ÷Ë„­"ŸÊ‰ñÔë£r¾[ß´œ‹¯] ‹P®V@Þ©^u±õ[åÓˆ#·öˆR ¶öôKÿzJ˜\úãÓ^¥•øF½ôåiÅ{¡¤òEËi¼S\i·^šÎÜÇÖ"³JZdS©ÒŠ÷bfš‘®:ƒè“ïjÚP¦¸•WÆÀ;gä1yίnë6ˆ^gfÂdá?0›–;‹BE2* Þ¨ë'»m›O¦å"r粌³ÔO©Óöj†®@R40Y6 bª»ò¯º¡…h×TÂFeý”¯û‰øšnU]PS kˆæ°D^¢ï¯8” *›u…+=Іʻq8ʼn?gy2kÛ9ú‰ ÷Ù_Y®ÇW,ÂÜàbÈX]5i¦œû±¨×Ø3+>¥Rd¡ì6ô»Ô–P+°õ<½H–žC4ªKÄ< 9Ì*G V ëþŽÉƾõ²ÇðY>žDÙ'!ëfÆëûŠÅ¡{0ÄvàSÊ3ô¶T`ôp°¸RÂã‡Ë‰í^euwnx2Íâ(>``ü@À€ÈÓ´>›t9…  Æä{ª18—— 6¨Xì¥ú `ÚP¼9“±~EKÀ'˜ë´|Üç‡e oò‰Î¤z^Iܯ3hWG­s ”W=Œ/£‰ùä"€à€Ücš^Yã ÛžÉ-8·ùïÆ¯)¦qYëi»:,rŸ7ÛËe_>ñÓ,n¨Ž6 U̯úYh+~{NÏ~ëW GçØ]+`},ˆB¸ ß€¿÷”ïLßrŸ›o E>_?[d Ü hiÎÝŽ(Dà3'{è>R_Ð{ôFËJõ]}&ÁŠ>Ã&Æ€À•ýjTâ]0­~ü=üö¨Uîþë©ô«Çž h1ö°9©¼†Ä€ódÂົ¹!Q÷ýM g+ìkêûkDlÂ]Ÿ|1v@²ý5¯±°S Ú¹øk.SÉc(¢?|Aü×@(.<éï]Í,ƒKQ{ì_Uþ§¼¼x}eoLÙY cÑgøt}2®L hcø†Ž“ 4ܾ©[œÎ>i’+xŽ/îr(ëÙò{£#5ƒvQ"òH–c@ûq¢¾éÛ@s‹]ô0ú]Eî¯C+˜Ὀ§t+ñ_G¢&-çf]„ïˆJ¼R×ðU“Á¶ÇW—<š×4õ±Oºª‡A·)hŸ ˆèaåïÿöpB f¸®€ [±ôN=õåê5ãÓ¤qQ¨Ìt‹*/¢þÅ)Ó9þå(ãn6ÚÐhÄ<~„–ÖÝdÒ-Žƒ!Vm¬»È¹ˆýì"´ÚC׬]@+û—iîµ[>cXß]~/*߀µ‚öÂ+º›®ß{µå­ºÍäâ·_\Ìl-ö–Á¤(W3ïQ4¸ØÃwUdÃÒ2`‚­Ø|„½ˆ6ã³GžQ69Œ¾])§Y'öêˆff° #6ö²ÖßÅSwŒò"´§p÷`­Å®YùPî@Oå¹5Vþµ^òޝŽòJ[êk·½ìá§Ârwóé™öGáãcæ–èÕ Æg±—^ä›Î©»»ýZ’&´š××c»püv&"ÿö]õÊ+ËCk‹/²ÒÝW0ý¸¬$z–ã5¢ceE`*ºÄ{uKÜ(œà‚?y¯n€»\k…{Ûx}1ÉG°CŸ‚bŸ‡žŽWõ<*AdZ{ú‡È®04©G¹tûzœ£‡«å8JÕš€àÀó‡%á«$_®­í +Ö½•GBHTCFìñçO¥1õ ­ {,Kg1z\j¼`÷ÅfÅ–SçUíÿø`ñ¸³rWF–ú ¶DW@àω´ï®\‡¿]Ôq2uo‰a<ô D¶4Ô 4¤É=;ï«Á‹¬uJük µÔ¸ö8¦wíÒ‡K+Þ™=ávÉ’]n—P‚å»Ío€Si,«~Lš5NšÚ vŽ9y·Ù®C›íSm>£ÿìÉÅŸ`±I ú$SÞ÷ŒÍòömÕEŠ•M̓N3ÀÃuˆ˜NªÖ7#âéî9LïWa<*r*æ< WR373æRPd:F›,¾Þ‡öKBÙUÿákØÿEÇa(ktaIŽ”ÅÌ·È9¹¾¤ÐGY Ád.àÔ°5Ÿ]ÎdÞqžvÂLžîú“nιv+¸¤üíZNû|O¯tûh÷’c†=˜Y£)I¾« ÈDÜ „ƒ•ç ð'-U·ÆßÛ™¬eÚÏo‡³áÆ– ¾û¾Æ²»”ÌÏ™ˆ¼'Bˆ(Û«®xA8i’·ZËùx:¼¼Æº‹EZ¯4:ª‚—^ËÙ¢¡hÙ 4½‡Ô ¡Ñ¸»/Eâ poX.z—ÐÌ2aT ÐoT7ÛŠ +=øº_O¹±ÂúýÃpˆç}NÌ$3JedË_†3R¦éÛú+¾!ÃÜ]4ýT¶35Óv?÷ J‹ó(÷—à\, èd·›:0šåzÜÒ­ŒUÎçVôx3§{'¬_õhâƶWt™:‡Å3ªÅAvx`28‘Þ–Ûç°nݘ¸ú"ס5JÁKPϬû¦ì²“Ïc(Ê}ÌÈìQó]Ö0Èè¯Í…#ùªšÙËxC–y)¤s$ ¹yx%EFì]Û>œÏ|W#S–ûì&w~¡;]–KP>»’ÄS¦kÅ~Ô,]=¾ 4 8eü¢äÁª2i''k\èüá¸<¿­—3sËC+ìÜvˆz]ùŽÀ½=z¿ "§â°®Áo3üuÙu„sÝt\µËU¶e{|úÝ×q¼…1¼ƒ+Ôíe£Q²á¢i„8NG}ËЦÿ–šïYËþÀµÜQUÔñ\þråO­³_`LŸ]ðdࣀÏLžßØúí»Ö²Ü`æpäyoÿéS–€–8ù:ÕúÐÌË•«71bTš4Ù¤.T ï<žÅðÓÊój„ä^Ñè—@Ìœ‚|‚øZ¡?¸§¾ÈWPf÷®ºóÑSª—Œß Bú0¢“A§dÅq· €f+5Š®3\áF4B,5}ûzîú}`’pSáYè ôÒ“ð–I¼ßú+TˆVHSœ-J ,$2 Z¡Ÿ®Ä¬ð<²%Üe:üD¸É¿%URpÃÈ90 }Dñ’‚£ˆë3`“ñaY£WUÊ¡pÿƤחñN®`p";p×1œÞL ŠÑЫ&p,õ$³M[OUèQu—j¥$§Ô)}ÔÅlG´WAùxšÜî)›¦¥4bŶWÆc¢’ü{¹¡”[Ìí Í}?bø}eÐ×’ÁôÆ ~Å-ö帮ú壹™„ÇÄøµóô ,Zî¥_µ´'_ÿ`Ætž1ìSÆ“¶ž6ýº[¿$ß~§Xo‚ Ìg…&åVxp½\•žß›O$ÿð8ØPÖ¬4ÕÚÖ#ÀÞú<>ëš>WO ½ ‚ _$få`?%Ò ðF >Y¡@=fg\Y!\10Øâ"Àʃ‘^3.0ÁÒ/áʛӳ‡¶ãÑŸîc¢ôgĸý¦x¯ðªó;®Ã*^Ÿæs¡â+½'ÊÃM‹SS¡çˆëF+ôq‹›’Â{hÕïâé>D­f9J&x²Á”jã· í³{p=¬°2Ä-~/·ÁTl¼X(8­bŸ,­`mà D¸„v)Œ#¥þ¨¥qä:2?% è|±#§Ñ£ ÷t"rnУx)fÅùGÙ#]µ°4{ÒwXŠÁÎ)ÞDðv¢Ÿ„†ï-ÞiÚ•¦âžž­¦G†?gçÎ"]ëçU^™ã^˱‚ªZ?¸ŠíÊ»Úä÷¤géý8Ì.—Œ•+޽YÖç>3~±1¾^ ô]þúœMTKŸmõ‘ûí(ÿ9QÅ„YLðÒ:‡pe@üÏ“U¡W5Ñû¬^ÀZÁ}ŸTaxуr!yN÷´;ßÀ lݸd¼W‹Ki ‚“÷·‹H‡ÖáêØ]Vé†Äïƒ9Ò3Ç&y~Y)»•·Ám1 Ïøk1&_€÷z]ˆ.-n)rwºC =b£eY­ÄÝrUDG@2G?ü2£Кßë¥àåÊp¯Œ;—‚MõáÙ"i ïtk¸À—w"TZ9 0•‰×0ƒ<Øé‚W# Î6å*ÜšG©’‘o".6k±«5ü»NÜ 8(õZ“íÛä&ÿvÑn¦Ç<¬ä±$ aq ÚìºÙ ¬ª \Ž«¸PoªÏ^‘8~ûIs%xXï€ 3 s­îRûs‘8µKk‘d8Z^i’È`Òf6 jq¡N,wÜ)n»QÅb§ü”1§l¸jå‘Äój~cZàR¯lP8€$ ËU«tñÚ/ÊCBÀÓ%ˆƒ†çVG<)®¸ÉÄnø¹LzÖ~/¯\V¹Jy½ÞðP£>ûõЯçðõk_1Ïð;W­¶Á–̳9Çl0\V¹´èGÐòSú³‰´“KI æ„’Hè•°àd¢âw+ÓÎtb®¦sq©‡Æ›ÈÌprz:à2¹¾Oð:íÅ¡£¶ÊåÄ]7 §zpÌñeÌU÷tá8Ó÷ôÐÃJØLº27?“iòhÍÏàI0~®8Òež_sm0?^Á¶3 }) ¬>7ô˜òˆµ§í|=†è¾b-ç°/çoŸ¼Dç‘Íô` ,VÒˆï±Êb€ÜïêÆEË rCâlê­ËØÆ‡Eã±`aµ^&?ð‘Ò{ù®ßÍÇð¹stÁ{±A§ZgiˆØ¦ZÉ7p¤ HZ¤-Ãe–Äd¯Œ­ârK×é×@®0Ù¿Ú>+AÃp X,k% r”]Öl{¡aK0¯+ÒŸEÛdàal …WWÉÝÈ U¾×6q‰SÁIæ“¢ëYªŸeƲVŸ˜‹÷¡âÁoùÈç´â+ƒÞÁIÆþÔnbxŸ¨ ˆV >Kí vÕ0?k@ÓõZù‡ýaRŒέ­}•xcíÕ°«­YºäÝüÖ:D 0­ ýøDs0ëïu!”C.…Ì¢3XÌc³¸ƒ¥J¦á"¶µÐèçyÆ\çÕ›ìjô{ 2CþúÚ”Ú0b¬”õy ¯R5bÜFåœ(ÏqŠíë,#&ÛÜ+SéG#ê5MН c-ë8x¼d‡¢5êéqõÿžB´¥m½)x‚“ªH¤&³ýÈ‹-œQ¸,ãY” €ª¸º2M㻆Ç-¼sÔØlXŒdûžßsŽŸ3œYÐHÄúÅιûS¿Ï±{N= P—"M‡µÉßGäí FÕ ^ÅæÌMnàÑŠmj BÑÐÈÀbÛ|-¦g|´nnaÈUx+¼Xб“,N- ê Ö8è`Ð$š.(Võ.þÎJf¶G^)cŵ;ýë‡ûwëOüƒºú“õWÝÏýл`—˜þ}sà7ª…Sެ%k}QÔÁRÜŸv¾™·NkX+LÞô·ëÇœLY`¯=ÒÖÉÒxNÅ<õô:ø¥K†8M²AsAަ9P1ëe#yY—¶®ëÞÎÒÛ•d*É•c»ìß[ Ë @c­€ªØ^µ-¡&í ®† †¤ø2ƒîÏzë» pÈÞÊGEÑ:Ê[¿ÏSÚÞ£cÒ^ ëùnîõÔ‡µ‚zÊ«,ô.ïzÝ¢~œòØ)ýéÓ©Zç곌|ÿŸ3‚®Ë¹`yeË¡§½{\¤cY)Ž+­iõøÊ©iRÄ6<Úµî”jP iTuì0Ü,_O¨X*Ó“®û(qC¿/è»ijB8ÍáxG!Õ¶s×õW\ãǯÔ0R¤^6‚ûB»g3sõ%óâV&eÒVÔ|ÏE=s«µakáy¯­këùø…íg;†]c}ö=±¸«íó,0¶×ÂBççüØ9òCõm€ÃŠ…;б.@ù^Øã©g#Økaçx0¾ãüï†À>ò¿c¤çþýk¡C}åã|1ÒÙás¾û‡µ`–õ3?|ˆp»lG‘DšÝÛû®u$æzâÈÏë÷C‡Þ™I„FÞM™™Ï€‹Üîù?ã™cdÜÔs²ÇÈ}®9äÔµ£Ö’ó”â.Ôv¢×ƒ:ÃuÀ´½ï†Ì̆0œqe5Dªà9%ú­ŒtjQ¨ùNæCÿ̽É_RÚ¨{³‡Fâñö^Ý….9õˆÝ†›«]-×%•šÕÍHÛà…¨:nñÄQ'K&í#¢6>ñš°ªVdâ*¡1‰ÑjÅ}Ì­ùÆ.X쀛“¿º ‹Ç4ÇrÛ.ýéÞ2³Ã²¿[Hiè÷˜QТÑ:hpáw÷ñKç‡ܨ·1a}„àçø =Ž Р\ úG2B(Á’É€´~ 5—éÑé“·è"m°´|<®¥ãýÍå0t ouÏŽ+¥!Õ3èC]å4Ì6nqø) /œ\ÃWC†¥fÅø.`W2H‘®kͰ;šL‹ Œ9€®ÒTõä µèÏ£³-U@F2`㬠¿ÚëWÑ»¥N‚ñ¾Þ`ê^ž…BŽ@ S %ÃÁr㥥Ûkš/ÖqH”sîxñÙ˜èÀ\ å=¤µ¦ë½P42Ð:RVNù»,W¸¡·ÈPC_Æ)êÝ_.ÿ¸©sB` 7®üžaÇjb2€òјäBÛÈ®i43÷WM}"Lü}¡¢¤v‹6Ä^ÚW#Ž7ôÝTõ€.Ü××»åÇIw¤ì—#o´Ì‘zES~a<¥¶Íj óïS«?N 3bZ@Ùif-‘õ¢$tÛ`³²bC­9(´;·&É›í%‹ª¿×¢akvz´©ÉÙ½ümcEg:~%¥+h¨ùå¹ùg›]lÊ(1ÁôfLÓ~ t&ÃN‚sk•’‚C½-vP\h~÷ËÔÍÉ Æ›%#^¹hÀÕ ’¨É*í»Î`° ø"õ*”AÊ e6BÄ¢s½D†,–qF §=å¤w•ÖÜ:øDÏrC…wï¥;<þpîE‚d`.™|Æòpb]€ÏDVøÇè¥ Ø@{·]‹ i“í3N?‹Ì˜¨E£ùŽ/]ö"®óáÝ>œ Ív,Ÿ@Åkº¡¡R¿ÊôüÙ<èI‡a>ïo.–ÇýmS¤üÃ8ÛàŦ‡!€Á2F`¡Ìôbú±â‚Qžv‹Ç‘Ûµ½ßÉbD#êF6jóùÝݬŠVk€%dÀU*Bÿ &ÅK´Ú^K]Â$8“;Iã7e²h\?“ü]²T t\Ô^r9Þ’C<zÈ·k#”ÀÍȽJß?NÔÉÌ xI±LÓd¼”’M=™×ºØÞÃ]¸H 0„ÀCgê›èMÚæüÚ-g¬¾çˆÁ–ñx¤ª»l&‚ÚòI„&‚ßNꨢßÉøDËhý¦Ýk;c·Mª)B{}OÔæÇ=$Z¸‚Câ(2ÖÙ÷熽½MNjþxl/Fª Aê…Tݤø`þ\{À÷-Sú?uò, verä•„,-N2»Ÿ”¨öf×hq°×è»pZ7’ï­î lvõá³Yï7UžW"e%'¿-PùS;ÓeÛò7ÿsnp‰èáƒ%¤÷]º®9¹¸äD¾è›ãU?.5g»W‡w|€@2¡-BBzÙd¶Jׇdʨ².zίšäTæž7ÝŒ‡‚éjãq?f×™ö°´˜X`iiS§ç•~PâÄêèåýBÀtÝa³×Sßó®Ÿ/ƒt çØ—,SXœª¦è/k@½Ä À“›ßɰç9žmVõü¦ÐÛô8q›´påð‚ló†¹î3°ó‰st¿Û 7¡åeëgã¦ÄQ-ÕíTÃ+·É«KŸ ¼ÿh!gÆ–ØkÒö™þÄÇ̱¹Ü¤à’ÀAZA ^ÜSlî`ˆµ¼=Óå–~o´Ã‡ HÜR圿»ÖYÇd?Rª1X&‹]NÐͤ½×E#÷n/Gh Äw>¯­ì_|Å6}˜«8Ñò £ú(ß­1ۤ충Âd1ÁÚåOòƒw÷K$âu)'–×]ó!‡l`À_º©Kcu雘ÇëÉì²!½˜éwÆ®åŽÞè†õRQM‡®€í^¢é#ïü¬’Ú…ŸÔjß’?ïž°º¯ušÈ¨êU§!2ÜèNà Íôœuʽ·ïË«ŽDöto¦ùÜ2‰Lç£)ÁÞši?Eôb>F0¥¯ ž.ÒÑžï©ÓIkךšF!jM,5žiO@Í”B¼’òw{H-»Ê2UåY¹›¨ž™òžûˆz¯ ”_wË2Z’ÛžÞ]d¾Ô}ºG ³™¯ˆi(¡wäTII(Íß«ØK³Òxa0…¼3aç2ñîz¦b·¢~\êB>38zýÐýÍTÔÆ}V»zAz’ü-ïLäv"ÊŠLjgr”ë«mΈg ›&{µ§ê™»O6®SU«êà|oå6FbÅZ‚¤¢†lmÓÎ ‹M-ß¿ëÕ0:BŽˆ×Áü[ñ7&)+µ—s²É¡ÿ:¢´h#³§g£4`=VoOWoz¼lG¯äêCŠÌ•/)j¤ž= â1ƒ_Q—3 >oÍjT?ÿ—ÃV¦ïgolly-3.3-src/Patterns/Self-Rep/JvN/NP-replicator.rle.gz0000644000175000017500000002376013151213347017737 00000000000000‹Æ INP-replicator.rleí]m“Û8rþŽ_¡«s*»/-‚”4ÚÊ¥Îw—Q¬½xv.ù–-Í íQV#)’Ƴ·üöt7ÞAðEÛCŽei(Z@÷ƒHþ~ðv°/VïØÛÝæöáf¹þ0¸_ÜÜ-×ÅëÁvWì‹õ¡¸,×?²ß³ßþ½Ø/>ÂW›×ƒ¿Eƒïâétôýàíz°¼ß®Š{øaqXnÖƒÍûÁGøø©x¸_¬×¿@Öªb¢ÁÛÝaù~y³\¬ùò}1àߥßÿ˜$“’QQ±WÈ^ w…©Üÿn6÷P¯”ƒß¯Š÷‡îëÛAPúå“„·ƒ‡õòc±ÛC!7›õþ°{¸9lvƒå~ð¾_ƒÃb[`Æ¥ü²)‹V~[Ü,ß"¡:»léš M_Þ€lÓ¨÷‡bi·Ÿ ­ sb ¯íVà9ȸ.>íËÃÞ)úõàfW€:ASØ*!ê ¿~T_ŠßàÿT Õü€JŽÔâËb»‚*Q-‹_‹ý`±Û<€¤q”¤Å?ÄÃÁ‡b]ì(Á>üçòp7X-v ÖûC±ÅF/ÿr}wñ_ÐÔÝòÃ]±û ìï6+Pòzõ‰DƒòÞƒûåúá96¨MÈ¿¹-vk­aÉ;иj=œ>‚ê@Ê®ø°ØÝÐ{ÒÏûån(£ d›»µ®Ë½2EeÚì×6üfKm‡K¬îŸ¡l7 -‡»Ínÿ#(q½8l?m®—«%Ùáo÷מÒ=Uý°‚ŽrøQ¦K8 ùKqX,W{è8ƒ»Ãaûã›7Ñö6Z®ß¯£åáÍÿíÖ”þÍã\¿Y®o‹ß¢»Ã}súÅÃ/7ÅjõƤ,ÖÑãò×嶸].¢ÍîÃüß›ÿج‘júEëáK nQûÿI0oôðë›þ¸Y= ÒßdzCÍù!üOèëzópÐÿQZÚÀÜ&J¶…d»Áâzó±<‚ÍoV‹å=ü н8]¯ <µXƒ \ ®¡˜õfp[ÜS#4ÛV(h»Ùï—˜}!êƒÝ$Gƒ¿"X¡t>^¼¹XKèøôëõæö“J©Ùi;ìâaÄÅm@Q÷¨uüʈ…jû-¡D¯©Q~(ˆP%õ>.t!¨:Ô–.Z®Ä…HÚ$9K`åG4$=â%Ì·ÛtêY/ßÑˈeðÁcU¸håe6ß¾¿ƒô‰’UÙˤ^„€TtÈìP®2º¬+¹W¦†bô;™cÅÏMF‹•%7SÆ$ˆ‹¨±€T«¬ÃË…é<À(ó Q’Î\‘WsKƒ_;¤”ˉrh4KÃÎVÙ$¢¦ÌÍ‚ ¶:“>u²ÂqžØ9ã)ØØNÁ&ÖÏqdýˆFÓ?"é­¾^!6gDýÔä)9 c–Zrs=öÑ€‚‚/qlÚM2¨V”!¾Ÿ¢.9W™Êr ÕUy0%8zw‰M?… áÐʹJõsœ’k8‘ÆC£¥ð7š£üú‘#-ãð‡~ Kf¹*j,tZbM¸¢ÌAŠ–a'#·2‡FÙÔ‰°^"ó‚‘ãáª¦É {j9(5O€ ¿$»ËÌ,Ìù¤ØHiÁç[ìªû_D—㟙_é|ªq*“\þ,XC%I¤w„ÂßQ26¢/99"B"ÐDŠ­æBÿŽ\h#ç’дà9\"KgVûu™ã¨œ‡Ï1W–”š¬ôRÊ´}KCÐH 5&¿ÏjŸÊ@I×Ùe‚Ýãa¤=ñ1‰Ä„Â4•+£\rDšœI¥¤,ôô†3å…Ó‹„d¹h9LC\«1²O6‘ÕàÂ1ŽdgÉæ&·€;³Ðâ6¥‰LÎÆ²Âd'¤Ëq]çÑõ^ Ks馢0S.ÊÁ‡üÿÌA2¡YËÁÉŠ1Ù)rU'j°#ÅíR¹`K¡.ŰÜ“Í2¯*N×Ò3\ÉcºIJÙyC•Ô¬ŒêÄóÉ«“FWº2QîÔÆŒKNuH Öé‘ý·z£ìÊ9|­X=æ<Ð<”ŸIÔÏLñ ÎùÌ/OÕüL% B3>æ`^Ý+àžŸCÙ/¨ 3„>&L&FÆLæž²*@Î\ ™@Bê '"¯é6#=C›ÉÜÌÏ®RVc&çö¨ŽqTQ$^¬[ðbœ“O¼j–Kÿ›`1YÎD9aŠR„Ó€.ƒ/kMg¹¬ ùQŽ~1{¦²çӹ̧„< WªL 6ñ t~”|–¹•ÇrY¹pžÃh'¯rãÌõÂÎ+ ‹Mç†)(kžežãjË/Ôù˜œ2Þˆs$$ÊËé–Gµ¹iÇè^ét©ÊôªÊ”•8!–¦#ŠÙÌ(üB«lQ~& “rÄpÔ‚ %j’_ÑT"UM§Y²US!GN6có+ò£a؈gb0ʯÒw¦V3©ô†¤ÒØÌn'δˆI'SòqH0»²’¶\‘hŒøŸå#-A•ÊAá éðÅòw‘ùMw®›“JcÖÈ® fÎG¤bÀD9T ªbÏ™vP 3–å? @»\&? E™!7klÁè:žyÙ3Í%x*«×Á¢Ñ©N­Rv ª$ÂS¸¡¼`A7#¹ ø‡C:£ ‚ŒeŽ)úA`õdæç¡B¦œÔèÌ™ã<˜.ù×y†ampa¹ ¥fô9²wWÄÀª.I$gž{ï$¦@ghpê QöFˆ4º¯ièc jÓzU#:&¸ÁPè¿'pë¶Õ¦–ŽÙ(¬ðžÃ­Bx.×9& S¤”öGùfŠ¡øÅ‘\ÔY¥tB ëãØÊD¼ýY$6`Ða¨_ó˜é¤ÔcRùzB$}“MGuiåÔµŸk«k¥›Bôp!ZI€rx·-1‘Û¨N·Œøë ­ô@ˆo^r{SoüñÞ|zî=_Xˆk#®‡ÒA¬ÁLNì5_n/Dˆ5}i9¡¬è=¦¼,|œ†Í×Y¥ôGˆo>qÂü¯JsQw>ÊGŽál!`½áéþyoˆéy„TƸ=“-i€Sn~ÉpGÙ­ƒZé¾9ý­<ÿwô”Ø6²´";Úž=×ì¢çZL™Šûž»s³à’a¤öt‚ìñàóY…¤“–Yyv{”e0ødË<·Nº!ıŒè4²óœn2 {ªmz¯ÚÏ&Äóޙb©³ø%„üs¡÷‰ëœ7‰àíu ´=bú˜³–ê8ïÖ;´ð*Þñ´ ;ž×¿¬°9|;Fv|úc&dÒJ¿… ¶cn±%ã¥Ùõñ\Ùyfêž4DÒ¼8ÌJÝÆ¢Æð,»lÀžc¶›BÈM‰…ãô˜…cçàmÄàî8YîªVz(„Kÿ1´8&üH'Ä_mÇQmÏdÁ®Ù]µôXHØ¢¶¹“4ã±½±ÃZ釀Ó)lP=[¾Kë¢KʸLÝhÙü×'£;B¸¥tw¥t¢þ;ÕQ™§ †=~7„ØvÒs3õ^­3‰ ¯–ÖÝÚ8¤=TJO„mG¦i¿Ò&å*¬Û¶;vH)ýR2)Sg3Žš@¶=é×fuÖWSÿ¿íB;ñä¼AùK ©æåðÆ$íÐ6ÏUd€UpÅÅPx̹¡¬ÓJé¹ ¾æ RîZËŠÞÇ©k]Q™žsd7…¨U¬ÊëÍD3RaZ½R9±ºi,l>†ìÙ]¥ôXˆ!Y7\ÞèY;% ìob¡îÚv0V8ïø²BÂëaå±·4ÅM]Û{'={¤=n·wwN)/Cˆð¬ƒ;MSgpÕ‹GV;þ6tè©29kÃèM=åÙ¯'d”Ç!_¸Ü5½þINWêMŒ5YG•Ò}!\ß)a=°¶°Úqüt9Xk8t_·=ÒȬ‰ Zq‚¿¨Ž%ƒê¶ûB´ÿÐÒ?¨·:sâ¿öàO©ÔT²ÁÜP{,DO(½,U»[=šéša‰+Ú÷èç‡þKÂMèö´p ^$ÇÂë9y<2–އM¦>otù²B”©ãá¤j.O*;${Êü«³:éžÙ'޼µ4m🆭iÅ]Ψ¯.DL ’ö3ê¼ä<‹a&PCßÀ£ã£*ÌüïyûjB¸êŽMÓfk…ݶ}Èô5#kù8»'º}~!\j¿î¦N(ÄŸí›:Bôš‹64S>Õ“ ÝqÕvKˆ2´ŠT”ï*†ŒÜ¢'sÇÀ¦?3ã:?ÁÌõvº)¤ÂÌk;ôˆ uÛÅ4r¹÷ôì]y!ÞÅ®f]²þÍœén°·ˆo°3_e!es·2r kWF6ÎF~#«À·ýaÇ7–æP“ª™SÃ…„e_?iæHsñk(bQ#˜ŽÆ Ðç0àÂ]3׊ ùæå¾K%~\ˆ[ƒ‡=^1 `Â!KrŠÍŸPî™F›sëÏì©ß³ÙØêû¥c‹ XÛ„µ‡ÒÍq½ƒ¦ :v¶+÷GHù‘ oG„¨+‘ÇJ,cãZOUÓa­¹{Ò“û!Ä¾Šž9 »¼‘>Ü«$%<@Hªhå˜{zRÙ©Z{dOs.º ÙŽ ÑwËð»{Øúnçg\[ʺI•ñÅ—f§ßX:"zO}ÏžêCâ_o‰öëÑf–þ7'eSO†–KÈ2”{í´>¸·ë Ëà4ª§¹eðSíÝIÍvSÈ‘W׳òWSÝë«|±’sÈ*¾«ìà´…679¤Vœ —òl·…´¾Ž–Õÿ\:s—³”ÿ''›“ ¨éª!–Š@UšÇ±€Î”òU®µn]Ó'«IÀZs‚æ`dœ† S¦&á`Dø˜³€çq j:oŸn iÁ,,ÄÕWcºˆaïo8 AÆXì™L4 ÚæWê¦ ² ‘JK¸$C¹÷ '•5SP›Y*â š·bù©Ò´½Ó÷ ûB¼‹ŪinEÃ’&8Ìþš”VÕÕ‡XWU8ØLû/îoñøߥçz^!µ[k[<ÕM’‚BJèv Ì›s³ÏoìÍ•Ã÷㞊éO¢úÿˆI£ÓC =YHÐÄâ!ÞÂ`긊eoqváŠû˜[_Y£ñH§®™¸¶æ¸jªlÛë[ kêËS„”úOL^!ÖÊ ¯ì!\˜çˆñ7ü×[¯éË )?ãéØ7+‡È¿Þ¹¦ò·°YP`•X˜¨ìÍÃlOzOw…o'·V¦ályσ <ßÀ›ê9˜éû³”6ÄÛ›\n•…ÖzÄì–n{&$¼Q!™”•œµ%ï¡ãµÔ!È!tW2²žšà !QîOïp5³¬³Ï>úgR˜òú0{¥JÇ9˜ÍqíÏóškm$‘MÚ8’û%$lõI»+¡ÂVÓïDôx&ïÝjxÃ’¡í KxWÖ©û€ ¯26Qã—zgžçR e@Ę…¾tÏJ·iTÍååkd\„%înß‹Ü:‘[_Úº§ën ñæ%.’˜=Aoÿ顇•áãŒAžkN–ËÁlV9ea¡ó¹›BÜÇÚº{• e¯ÉªY^ÑŠs=½ëìÖ"âä¼âkñŸ<˜sêê¬nùÉ^k¨u¤¯Ó̆¶ª®gÎxsâ6ˆ›ç« ±ެ֒›W*Œ,ãTz_l%£ý1ÕHÕà¼;òd!öÃÍK}ÕZ"lcRòÿ­Éƒ:²$nkN3.œç”Ï'ä„û·X ¬z(1‡ÔÌÂ[áhä¦Ñd/ œIÿ…  FöúSâÏHj>ÃË$©v†&žÜ÷öÁ9èaõ\¤Xœ`Ÿ q £)BáÀ ú%Ì[\‰Üû­JæI‡õ ÃJ©Øì¯I™t:Íù/PÈqÐa>v|§´ <Ü&VS­²RoÛyÕ¾@!A´æ¸Àø4 Dܹ3Üx·1Gv4(z«Ù ñ@‘lj·!Ú€·#Ã[®IBsäf[wN)/T×ÝÑó;ëWÞkg>É´Œüç=œH Õí b ›Px¬\+ÔèR~`!m¢“päS^!âß)°Ü;mÆMǼüoDˆ‹áiÆ–§é¹ÛÞÖG¡OEU|¼ÕN¨yhØ Á“¯Ó ¿!õ Q7+ \­Þ80KGn…ÃÂËÈ/•7ˆåf}è¼'äY…Ð:+î |ØèaÕìÃuØ.N}êñPÄܹÖùy6Ï&Äq{UŸe¥x㉸¬S>aÍ䓪í´/L99-¢+×¥Ï+„Ï+ÄYy>Å$a´å ç|Κ@j_â¿ÎR‚óÓ85.´FÍ‘I‡Ð&Få§C®Ç¬òüB·ÉI1};ϳð¦÷ŽDtIï^§åK±&æÉê¦NÖA¡£w]ù…ñ½j‡^Ì4k`¥ÒÀ¬íHÚ¡Ü:Èæ¿ØzÎgõîíšÛX*:›V¢¬wæy!BQærkà£1qƒ?&7D:…qýP£To›,³UlâŸÌ!oÆV/ Ôc!Þà—Æ+D˜óÕÔ2¬åÕ\Q•o–ý|Ÿº òRÔ\mÂX“Û9F-ØC?¥ÇBÔB¹Ù±sá\”âGÔöqg]Ãg('PY—RðP5+ŒäUϱ*Ùì—äÉZ¡©çæé—LL f¸,0•–Ç‚Å\nãy Ko`øXÈIrîH‘$é¹Zú(®Âo¤N/\ˆƒ$Hþ>uæ.=[Ä㣉CMvÈÔ¾ä^ãM‚BR`‰}jÉçtå ©Üòì«Nö‹½0ØWÞË: OÎÝZ­Rmå:À¸uȪó|ð„´A™ ¡L·Zq›âÝ¥ÛÛDœš‹lñh;w¢dO‰qõÌ:/DHd›x—…7u¹Û48 §OD›”Xº€Öfy)*ÃYç5ÂN ).ä%Ñí=<úñ™¡©jªîÐÊj”¡3&bgpšøÌ×>€vŽ…<§ÐÈ:±®Ñ oRöw™6ñ«ÃR9ÆVbcGÅØÎ7J|N!!\5=LK¦Gض»CdǰYEðöèy^ˆ0Ê‚—˜ì«3W‡•OhsUq??ÈÓ#Ð'FJV”k“cG¢3ü×Y½_BàdÖåÏá½mŽ^ C]â¬kÜG¬rÂÑ"j§ƒvÌåÌ£¢vçxÊs Nu«ôl!† ªõ÷£™UwK¶·0RO–ú¢¹Šè^ÛàÞ™';$$Ä“­î«k’³R~†ïÎÄ&Ïí‹Lñ,DžÇ†Y96x|hð¼Êñ\BCƒ©·ómj†w{¼ßØzóe·Dý¬Ãƒ¬.HØ:FÈr~§¡¯×ÔÔ !.úôðÓ‚€u¨EŽJ«x°ŽYUÐZm¯k"dOÛâÒs#wWˆ¹lÎÁ_i¸móɬ/ªÞ#‚!6d 3êvEfQçÉÅ b=fAŸŽ“܆ÛàN¢ÐÍÈüØÌi¼h#“Õ„ÛG»@ߢ}Ójì±z8–±Äsà'à” ›Xч Åk©7f<Á;/$¸µþ¼Ñ´Ä‹uqHå0 $²’ð}U²ÓÃV_bùÉaÈΚø… ©Ú;Ý´ȼo§a|øH1·v£b˜_Z8âØpdí"Ž ¸ë¨^¨c÷ì?uª-à‡Ë6<Àhiîxƒ  YòÄ(âù"Úç¢a§o#3-G“à[¹a9º™ƒ´T½æö–ž÷é„Õ=)„¨ç›ä>³2ôœP]ã.¯VGf;nÖíEréùyY,޳Ѩo)&ðxLñ¼¢›BÊè“€ÓS‚Zl…8Ò™'ÛsĆkEr¥û¦ò2æ˜ñôx>õ½¹`èÐ'#‡ìI3dõד‘¬_B¸æƒ0ûµÞqØ’&­‘˜[W,È0o'Ù4 ÿü¬ÓÈ#àÕø‚MÑ@Éq|hI8Î7ì´…^` .ÐåÖËÛœ:°ÈB\HL\O¹Š«´ºÙœ#W:#vh{¯·¡£ÕL¦³f~!BND«šX°ãø00$›È±UFÜÀ•y(lhѤ~Bišë&§öm¹«Ø9 }cBìKT$ÇØà¬ØÇB§ 87ºÈʵ“:™úÙ)ÕE¬þ.Šðü¹tn͹²}lO–w÷_¨EžjœôÍ«Ã1¬:èØþˆÎ$i-jŸ?ñyÌôÅD ŽìF¹ÄÏÎdç…˜ ¼‚´˜Cs'~Ò*ªâ†ñ¢v;øD‡ÁÍåWGú~½´N…Ô\W9'á‘â5FgšÎØS2«3Ö"aM8ž+§ÖJj/C;”͵gbO“´GÁì/¸»¼Ó¾3ôd ì¹¶;¹K'Gëã³å# Ap¯¿êxQŒ[Ç.èÌL›B¸dO`éÎ[¹B|~jýh´Úæõ¹1‹Àô×{Ì!u†Ž ·¢zÙ¨üÉù«%YììT´w*_OÈÓñ柨±\™ZÔÅÕ­O˜µ–-Ÿ#˜úëëãpÊe[‘ ÓÜ $¤"´ɹ¥½®$¾f9g)òX¨u•ÓA¥8ÊWzÒ¦A#aÝÜÁÀC=V½|8¦s?§—ÎMo0Svƒq·ÕÍ391v´%ÈaÚZëìÜ% ¶R„Å<`¬À/V$±oBcT÷7ôÙÍVWW¥†QUGD n¨JìíîÅÒtÙ¸ª‘f;Ë$¯“íiÓ.M]Üi{ú­T¿¼Rêí5¶›ÅŽêlU_ë&1õCoˆöOÒ#‰åù‡eÝVÚ+Ú<žÀ_qmL&ZÁN¼¹²ºƒ)ímëÁš¬–7·ø˜ç!yož*$oxæŽÌw—8æ\â`e9Ÿ'(¦,o÷ÒæÛ·ð‹ùfô‘âi¾}+“„%ÏC¯WÏgDµQFÚƒã ëÍ þÐm(ÓlûV¿/àZn-~Fâk¾}]‚”W™˜8Eèó¡t1±œgÑ%T·›s80‘ª…ÚÇ4bòu†À˱çøåhf~¤ÁlÛ·ùÚ4…ÙY:) ýâý€’ƒ_crVþ!¥»ßB*hü‚C‚R¨o€ã’˜tù*™ŠÃO¿cìÿÃònOËŠgolly-3.3-src/Patterns/Self-Rep/JvN/counter-demo.rle0000644000175000017500000000343013151213347017232 00000000000000# Counter demo. # Author: Renato Nobili # # After 10 input pulses are seen on the input line (IN), a single output # pulse is sent (OUT) and the counter resets. Set the machine running at # a slow speed to see it working. # # Note that this counter only works for well-separated pulses. If pulses # arrive with less than 32 quiescent cells between them then the counter # may break or miscount. # # After ten pulses, the output pulse is duplicated and sent to the special # transmission states (STS) under the wire. These annihilate the section # of OTS wire above, causing the gap to be restored and the counter to be # reset to zero. # # Counters for other values can be made in a similar fashion. Counters for # large values can be made by chaining counters together. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: SIMPLE_COUNTERS.EVN # Redistributed with permission. # x = 60, y = 26, rule = JvN29 5.2pA.pA.pA3.pA.2pA2.pA3.3pA4.2pA2.2pA2.pA2.pA.pA2.pA.3pA.3pA.2pA$4.pA 3.pA.2pA.2pA.pA.pA.pA3.pA5.pA3.pA2.pA.pA2.pA.2pA.pA2.pA2.pA3.pA.pA$5. pA2.pA.pA.pA.pA.pA.pA.pA3.2pA4.pA3.pA2.pA.pA2.pA.pA.2pA2.pA2.2pA2.pA. pA$6.pA.pA.pA3.pA.2pA2.pA3.pA5.pA3.pA2.pA.pA2.pA.pA2.pA2.pA2.pA3.2pA$ 4.2pA2.pA.pA3.pA.pA3.3pA.3pA4.2pA2.2pA3.2pA2.pA2.pA2.pA2.3pA.pA.pA7$ 17.pA.pA2.pA25.2pA2.pA2.pA.3pA$17.pA.2pA.pA24.pA2.pA.pA2.pA2.pA$17.pA .pA.2pA24.pA2.pA.pA2.pA2.pA$17.pA.pA2.pA25.2pA3.2pA3.pA3$10IpA22I9.IpA 14I$J9.L22.9R.L$J9.L22.RpA2RpA2RpAR.L$J9.L23.J2.J2.J2.L$J9.L23.J2KpA 2KpA3K10.pA2.pA$J9.L42.2pA.pA.pA$N9.L43.pA.pA.pA$J9.L43.pA.pA.pA$J10K 43.pA2.pA! golly-3.3-src/Patterns/Self-Rep/JvN/NP-mutation.rle.gz0000644000175000017500000004525613151213347017437 00000000000000‹Ö INP-mutation.rleí}[wãHræ{ü ú¸÷l÷Ù4‘H±ÏzËc{— <¶Ôjûm稪X]ò¨$­¤êšÞ‡ýí›y‹¼àFµ$@Å"¢Hdd"ã‹/##/øÛÅ›ÅýþêÃîö·w7ï?¿»¼þeñéâÝÇËëý÷‹/—‹‡‹ÛýâáãÅÃâãÅýâí~½øôùáâaÿþvqy-ÚK!ïn®ß/~Ù_ïï..o®³ÅÙgõ“·ø|ýpyEß\ïÿú°xwsû›LïD^¼ß/.¤ Jƒò¥Y„«+ùûânÿëþâjÿ>[È4ßnþëýâþóííÍý^&¸Á+.ð‹»Ëûýß|'/‘ï¾¹[|º¹Û/Þï..¯¾—eÜ/þôox«W—ï.nî²»«}¶8ÿh.Á’\Ý|Y\Üíeúw7ŸÔm¸”×ÁßÊïþÐú~îªÌÛ»ýýþZVš¬²éêÛß_ü*¿ºù~ñs¶ø6ßlªïo®—Ÿn¯öŸäª n>,~•Úþtq}-o\&mË&[¼¹{¸üpùîòâjÑ\~Ø/Ä·åw?ÅúEUfºŸ¯/ÝßÝËK¤Òîî>¿“•±¸¼_ü"¿¿6—ù^ê_e1î©*0ëÛý»Ë¿‘šlr]Î Yø÷²à²z¯X‘><ìïHß²¤R¦Ä¾÷à!Ï¥Œ·ûßî—÷^Öß/ÞÝíeeÈûD€(²œò×_Í׋ý_åÿ)*ùV¢E^}¦5Ž¥|¸øËþ^jøæ³”´ÊŠrÿßò%Ãí}¶ø„ýÕÅÝ/²Ô÷û[¼éËÿ+S}{ò¿O²¦>^þòq÷ÌdqÿñæóÕûÅÍõÕo$ZVÞ‡ý—ŧËëÏ2Å Ö¦LÿéæýþîÚV •êü£¬qs÷òô‹¬:)ånÿËÅÝ{ “‹{ªŸ—w÷1&¤€úæãu_/ï*bŒXµË´\ñ7·tïòŠK,î%Šo/ÞéR¾ùüðñæîþGY‰×Òfºy{yuIzøùÓÛýüÊâ«úó•„ùÃúºBTæõ#ÚûÃÃí?üðåË—ìö}vyýá:»|øáÿÝ]Óõ?|ùÏ_¯¸¼~¿ÿköñáSÿõŸÿünuõƒ»r}¹üËåíþýåEvs÷Ëø¿þýæúϺšþlëáϬü¬îÿOi³ÏùáŸ~½¹úŒ•þCýëŸ~èbU_oo>?Xˆÿ¨5í`Îi€.»•—Ý-.ÞÞüº_|‘:wuqùɱÚÛ«=ž2›'(ïoe6×7’¹>ÑMX®x@X¡ IŽ÷—˜üB•ÍFJÎÿŠ`•¹‹åòD’<š’dáWHDªw’ò$.äý.îPŸ$îâý{U*)çÞ\]ýöýâýå{´·’û?í]~òš;â~ŽïëŇÏWWÙâ§Ëëw{,8i†dÿ*áA·úí%¶2ïe!U¤†ëý^æü7dnxñõþÝþþþâî7]˜/w—²:nc?ÈrÝ|A$ã {ì…fB‘Vòõ¿ÿiñqu++ÿ—=ê·?Ÿ5J ßiÒø¥Æ;²MiMWÒèe½\]|1š{¿¿¿üåºM£ÀsTÛÃ…¬ORŒÂÄâê’˜AÒ§D.–R>ýúöæýoæJËžHh°Ÿï‘¸dv7²¢>a­ãWN¬,¦d¿KY¢ŒïMcz-ÙUSï— › VÖ–ÍSÞAº7(DÓ&ɹ”¬ü)Éqí$A ÓÝa#Jˆæ¥ÃÜö×ß4i¾•ʦ Øø°—~©F}_n”YÉw—DÞX÷Wûíœü|e¹G’üðBÜ+dHIŸTѾ`‹õ‰jÝYT-ëO¶#ÒèÞ£rÐùAS–BoîUƒ²¿hê”U%+õžÐloRʹ¸’õ{On Yð/—×ÊÊóež“·q·ÿ€n ƒ¼øæîR^z!í ¥0L¡æÞã-%ÝX×÷x_ïo>¿}¸'û‘2Èxd9ïu[rCZÓ¬ŽH’±¿d…Ë{âïu«N-µ'+[*X5l·W²MXÜ YR“v'µuqýË•b¢{ɸ÷ê×·W×!lkUJ¼£ù0Јþð‘¹' I íåM(5îöòæöªíÃf×3·¿™¦;/þK¶øçÏwh¢heŸdÕ©´ÊÞßQ»Œ *«H’ Y§Dˆä™;4Ù΋¢¬†Ï2t©Yüt‹n„Ö zŒ?ýùüÓŸßü[öO’5.ɾS …»wwyû``.ËúãâüòÓâ}~x·ÿße5géüï‘–v•ÉÌþ‡I+I}}¿ÿqqûù­<—uÆØÛÚ`ËâHO !–D"¿B2 ða¢)qòùîªø=ÞîûK‰äË·ŸµÃîµðˆà‹«ûéXa“sù ‘©üCÉn0äh(–Õn)XcMÝ^ÈZ¸»K‚*&þ•õüɾ‹oÉ—ùòñòÝGÕd\9~§€úw¿Ã?t•~½¦&íçëË¿.–Yþ}ì¼Pý éé/þ^øþNÞ÷oÙ½4²ß¤Û¡úÿª-uñ7Òá’ŽV„æYÆ}£ŒyEäëó:“¼ý=™Ù÷è¢7i¼J”µ íü—»‹OX!R‚ø;kvtL\d|‰fg^&}]Ñ/&s‡,þU¿T‘Õöç|µeÿÏåõ«è/Ê eÒUKw{ú§ZžàOîFõ½6êõ ¸«2ÊüªÌVˆ»¢.âûÇ*Yÿ:v?ÂÜiúg*¼_(yXŠ(¹‘ÁöžJHÉK¼ÃŠNkYØïäB^+d•«/ÊVHÖƒ|¯õu優Ivø™¼ªð¥Õünð…ªÅk@‰ò$™ûi2{™'*_oërkJIt›—Y!e‹àò¸}#vM-x"|y÷\ᵺZ¬1»Û7%}ç߉ºá­»²ÎW²,eÖDW*ÄîØ•"+µX#™[H2Ií].µY—ô£¹Øª^Õ–/u€wT²[B+C}«‹D-Ý6'åZö¨ì5H£CY\”)²Ï,efIbá’› t…ç…L‘¾*À™¼RœÚ+eÑêìÎÍŵ­yݶv×ÕÙYvzޝ³sYMRëörº3y9—Ÿ«b¨f—«Û“ ’×ÉßÙbéC&>;¥—'XäVœÆÜY½»}³:• #­ÕøLÝ“„RÙi}’A±5)}zÖ$m®—Ùw!ÿU;›,}Û—NYÔ ݱD.Ë-hØ…‰Ðöj,u¹ó“udµJeåe—È)kèîLÀO×~[D[[Â7/ û²ÿõÓÊã®àIóT¶wÉš~õ{žñ_Q}k“Zj6­ø•C8`eZÔéEj­ËZgöFéüz¦‚øz¢Í0mÑ‚‘}”L‰ô'cì_Kösãê³é8Ë™¤.%„¤ty…DP.®,ºÊ-6!Z[T«ö ë,Ô~íhÍ jy £: 5Ó·«Rî’ÚS÷Y8õ75Ø*ñF—¥ÐõKiˆ…‡k›DVíJ6‡&•É‘R®°øž±œVÚ›*ŒbLÙ’ÑFd…Ø{7Ès*7£HYnD ÷tv,e]äx1¶g®0ŠÜ¨":½ t_n™ jë†pFŠõR)Ÿh§AJ%­Pœ%è,7*™l¶Â¿VœDj‡½Pz>ºÅSÊ;§v‚ª`ƒ÷#%mK.Ü6–Ôš˜¢œak$‹ºF0¡ZQf†è—à5éð;–êL–ܤÂk³­Nϰ ¤ŸCi„¼ëKsþS^š˜ª³”Õ3Ià6hlô] ù·&_ ±Ò¤§Ž9<%Å¥š]™g2LEµ¯K+•Èqé¾ hÜ}¯•f ›¼Î—;Y(.Ác'¯ç?ÉjnJ'c«Š )àl pEq€ÀV•ò4šŒ¡‹“ìlõmBT‘гŸј\ íj¡üSº²¢ïÄé9HFI%Ò²µRîq*}¥LSdª££ Yº gòC:߯ ›ó*‹“‰&¬‹ÔíCÓ’îö 5c•‚sNþ¤¯F„d¦³Ås–€È—™õ¡ÔÇ:S]ï¶•¥Õu]%Õ:‘Ë­ñôéErêÆ"Bvz„ßïU’Öº0B¹Þ™¶©zç P&ü®*Rìd#_RשYé’“örW]/•8ƒ&S¦®¤ !%S7d+2¼ÐûÚ9Q ­&³å#ñ%£;÷ùþ ’=y[Y"-©ÞÖA{°‹d aß*”ubE( 5Û ¦îUj`ÉE#›PUFö§OxrM}õŽb*²C€‰©!)¤C©sat-›•s¾"w@`#d3/P® 9.xW'êòz1¤P›·ÐJbeÇÜ)+ȵ>‰™*άÊ/e%P¥¨u~NT•‚>r›*OsN]›ÒTõáY‘\±˜( YõvwN>½l‚rulÎËSW6Šïdm 8Ë J)j"â‚ß’¼)’͹.ªµfIuù™½âBŒðR·.çH¥§ºhN3÷ÛVñ¥b|ÕBäÔVA‘0}S)«VEQa¨TšéœÕjR¢ˆÖg ¦ÎŠŸTí¡L@‹ñ°W­¶±„Át&=“š…£´C†î}f¾U…Fðª¶7NÞdR§ÒŠ‚´ä‡à_n²Tt®mÐã’P(¼Â‚NFym4RiÁÛxަ‹McF’×õ”µ""|˜šw‘¿Ÿž‡›™î‘‘,Xc7g“m 'Yìï2°ݘ[±` ¢ê‘ÊHbë"Œî¾ 7B²¥š"ÿAIUw®C¤U AðlMo9(‰(S.!….ÑeM¡HÞ¤# ¤H’l_¤›‹M|µ X,S(¢Ê KŸW’FÞ]&ÄàÕ&ű\ÅðI&Dõ±çäZï¬P<Έb.ÎCå¶PK61G­¸õ˜Â4ÀIdB4uv66ê ªÈWÕ`»­¥Â0dzw°D‚v7»p6›,.çÊðSßWÎ`¤£ í`ʹÊú'­èL‚S•dWŒ» ÚÿÎ"l¦¡©³>îfz;öÕ".D%øµTó¡¼Xâ¶…¡’Bu²Âñ¿@´Ì_J†UÁGZóát‰o Lbó\â(ç&ÛzÎI‰¬ Çnä6 þ„¦ØÉ¦× µÊEÁ$ÖjÌ—F~~IÛôÉ>6²šWô‡¾_EÇ|S‘¬ZÄ¿4º‚Gëæ¥ke:BŒ m¨â¡bZ`º0õŸÅ¦Ï6àñwóõ5[Ë:E„wÁÿʽI‰ù Õcí¦MY³ÇìË ÑÖâK?ƒÔ—îLîÒ‹, JÅUVqP”Cll:u23!‘ ×±³Ðþ N…b­t·^*SÓô8@{“«“ù±îD“/ ijïÿž‘¥u…ÌX*sÃwÂÓ›]­LSH¨+=H0ü-”S’Ÿ,•ƒRª8zO!DèΓ֗°­Vê íJ›TQ…zcb-½ß|•Ô´¯ÕxnóÂ:`ÖûÚ¹ƒ¬h K’/å•Ò8® qJ*ažlg^³Óê·`†ìw¾ýÞ¶ßã¶ËǤaƒÊiwEåªM§ñßTømFBb½ég€-uÓÐnêLkã¢eÞa¥Ó…þŒ„è^~W{šîòC2`â–LûiE—I~_(b.VŠ•Ç+z¢UûbB EzÑ€tÿƒõùS³~W¾L5»h—NºO¾§Q)3âL¦â®S V¤ÑãjéÜ]ÝdBžsË=p€a6Mس1.­RÃïe„Œó;,ÊðV«~M¡Vf"$¼k7¿ÐûͯÒ!¹¨Û n¼ïð ÂÌèíÉ…¸®BÀ¤k¿³Ñk†à)±”_¯Ç³åäq?M!ÎKÏÁd=´Ë7ÝÖ R³Kw-“‘Ÿù&BÒªmyR²×‰èLLÍ67t;Rϳ2žiA ä‚«ˆ"Z7zì㨛gÕMÑ?‘um¸:S‘ƒWÃÇ%:« ÌãòS Ê“AUåezÐ?Õ)À»õƒxÖjµ‘êÉiB,)ÿ¢mèdÌß š¯—¢ÕÌ"k]C(ë–¡èPËmÆ\.-9CŽ-r¿ý;˜¬ùLWHZã\Ø£¨[ÓkÌf›ì¶lÖùq8û©…$Ü_O'Ýo7ca3Ü„O*­[£ÚÉUÊëb¢v‰ñëµùoBm¾Ižlй¶û›p6 !‚Ù‰í/ZÃQ*`ñ£`œ³ÝÚ6KdãžàìT ;c!Iýa@§0s9èÖ*®°ÏY榠ؗ®•W ¤E±¤ ÝÖ™Ìñ!Ò­³>÷Æ)F Géi…´Ót‘c6eÐL¨(guê1o©Ø ù\­Ì_ˆ,Mšy·EÇú I? ë÷J3=jX¾«<Ðôªå ñÜâ” ³>lËžåéFòœÝæÊ”WKóAº-Cݺ¿‰º£ó⸠eô£:³~GV™*ôšñæŒS‡pÈNŪÓ¬Ù™ IîÍ4¤ºÈ-°ð(ß³yIú¶­4-Ðê‹vÓŸyÝNKˆ°ú§ëH­¥n;ô“Gü ­}*má+R5°Z¥ÜêØtmvY±–]h'\p5¢Ÿ=µZ™‘a磭V}Áƒ4éYãÊ×&<¾£<;–|^!*dµjYîé/p¾)¨B_–t©P¬ÝâËmRê&M)ýë}nèÏ\ÕûªŠ|«-ƒ…„]è¡uŽ ­ûød%ÿN‚ŽX¤üQºŸlÍN_ˆÑ}r.«ÐÁë$ÌWxüy‚ÞÛIØ¢;eU÷ê{v5;M!"bâq+×7­ŒÏ†²TFF ã»U•FÆh&˜½~^NˆhÌÒº¤‚½Yìžá7Êõ‹ON¢› í˜àÚaê]ÅNCˆèî2·ÎÓ ûÕ-í?z­çuíXšë‘Šp •J &›j!Òt­§-D¥éžó)ô£BÚnë3ä>¹G‘nf\ð'è˜?å±d4e”ï(ÌFA/'Ä@£}ŠhËg¼we k& ¿”=Ÿ!hÖJŠru ­Œ äO\AÓ2˜QŒ#Ùqè¿¢k{¥fC ·¯‡ˆæD<îo6ÂË 9V[¢ #Ã*•"Ï}1k›%kvŽƒO.DÄ+àùÉ™;„áE#ó*& ¡ ™BóÅ@–˜JÅÎPHKðàö=RÌq}U7 `/¹kþæ Úäy±V3•t„²m‚O‹‚C£ÇPz.VÜÒUv‚Æ'ffA3"\yTxÒE5óT¬Â4²žE»þ%çÛ Þe8«žXˆQ¾\·j±PSë[M×Îײo3¥#Ðßlje>B”pÃï+'ÔÉ&Ô3UjñÄr­^âëü8íú9”¬´3Ô;o‰*ßÚ×zå¢8Cã=àþÇ‘a`AóxCXÄ3÷˜^^ˆÐä9ê~‘Œ6),ð~XÂaÓW8u—¹¥„¤º§`>¯DˆÐÚÐ[Eèí ny«ÂA‰óc7É.™Ñü2Òüêø0§bToâ(-ÛG´©Ú]xï°ø%†óIñ¦—&Žñüg‰çÇzO¬½ boºyûÝu1³Äœ ­êb¤ª'g@ÓOJNälß[MuÃvÎÂ1†å¡ÏÖ3¼ Ö¥›MÝÎKˆ°¸;ì­põûÂ1\ÿê ßÓb:;Q!Ö—î ÁѨËÛDÒ½¶žC¨uÐYœèÞýɱ]žv=ôáüE•ýÛ÷{K°˜?š¡•“ºOŽÖ§âë:ØàØ¹Âø`Žr ™ÃçÖÔ çÿA)ã9-è•ޏ›É~Ÿ°ßx¼ÀÜBÏéƒhô}éB;C5?#œžÍÃs1Ìrÿ’O¥`¤à>óU¤|ãtæ¸óÙñ© O*DXýŒ1ý¤åƒ0ñ€!®_HŒ<T=”t$ýÏÎ _VH+ «/CÐÞe†_ú¦®ƒ=ÖÖÁe²±8Òí…AUÿˆÿÁ]SF+³ÐÏü„¶v¨LáJ=Á/¤PÀÕEâ›±£bVPÉ+VÐGOò …_Í„b‚ÇÑ.â!•„A#Áö°†Ê%’02I1^çS±  éÕù˜‡®j/CËVEWÏqÀ†^Øy×§„KAÇí\ŸTHütú¿N#–áËeY@´\vª{ÂŒ=?!| ðÆŒE/}/ÓÛ¢W ) ­ŒÙÓ•ò.Í(&<ƹ˜FÍN\ˆÝ·$4÷´öƒm„Õ{†´óÕ—n6âJ;"vÚ¡ëxœ©þfK´Ï#ĪYû{ÂĪ^/™K)ªcºgºzt‚)œZõ²a ?Tß“¬Ùi ¸S9BüÕÆZ}›/9‡Ðò}2XÅÔ 1°V[Ò] — òì´…<Ï~ÖÿÓÍu LwÕKK¬Ê,"=RÊ3¹Â8ÞT6Lù˜KÖ'èGæe :15)#çë%<1¨™¼~¦)d³@Š1:æ:{ˆ©ÔJ¤þÀA¢ ZF‚<ȲX[@ ‡Í¬4M!-d“"•p)–z:–Þ}³´\HOówNÂi3Ü™‰{0}!Á"g¤6•z@ŠDøÿË"U7j\µjq°!˜ÖeŽùjŒï2s½¬x 6{¢kR0HIíÌ AX¸9« ¯ìwšÍùFubˆÚÿk ½^Ì 5ôh!I«ÇÍ+…ÛiÑ› ãMÌU#ö¹`_±VÈy¤_MÂjsÕÖUæúúšÂšv¡‹Òƒ©~ÏÓó¢i¢­"”zF´¿é¿ÙzMO+$~¼×Ø7DÁa/òog®Ðò¤V(@+Ö&y3;ë™®åí4ldºÐÏ=æ›Ø¼÷¬öºúI» M¼}ê&@`èrY4ÀàsZu;3!é‰ Å:TòÆ–Ì2ô®®–OÉqÁºVÌù*]ƒá𬠻÷†?„éY¶·ÙGýwÒŽ˜x|ŠNì®æ >«DŒEs|ý‹&x˜Y)a=Äq˜T“cH}éŸ$ï&8–4øÆWU$éF)ì»ûŠè©/CÝŽ‰Óõ´…t͉6qÀACVì3@ÄðñZŽ$Ϩ1'ærg•C&oÌÓâ?ÌØŸ«ä(úx$ö#ZÜ›F]¶K„  DÉqÄs Ÿ¸‘<¸s2õô ÍÄXCK«£}~Þp´Õ¶6¼öæÀiVϳ áÁ6cÉý#H-JÖq*;/¶•’ÑþœJdJpœy°¯_Ý0F¥j¼8ºE>T®]8ö)_NÈ;"[e“|;(G¦gŒpôrX4ñ”#é¿ TÅÇŸ¢UšŸéa’R;SOÁA%‚ypz ›‹ ;¹¾œ:f"Iœ _ÁàJæïöª™§\v3 Dézæ\c¦Qù¤3iÎ…BÆABì„Nix'h©v4YeÐ|Õ¾B!I´$æ„mÀÄ&KDÜ…×Üx;ð#ŒÅlkvÆBP4yLˆöÌȆkŠT¹_ד«”W*DXs üÎî‘÷ΞO±D:âfÌH “­ÛW&ÄA%w¡ðܸ ,ÔèS~b ­JÑI:ò©Wˆ„#L ÷núq31/ÿ+âãFyš9ó4#±nx úLT%Ä[g‡Z´ZÙæ¥­ð+Ò ˆg>ƒ6¹U‹ˆ‘‘ Š'ˆ5n|è8'äE…Ð8ÿ îI|pô@;û¶ËËzß×:Œ^fÂúÓâ¹½ÆfQJppžˆÏ:ñ ô“Oib´›V¼€qr D·ŽKG_Vˆ²¸?MÞN>©9"•a0îÑØ•ð¾Kì %x?­JçB[ÔŒ\$B›j•¹³ÊË ñÜ&¿'v;Ïcx³sG2ZRº×e¼kížVa6ubƒŽÙ™ò+zÕ½¸hèa¥h'06É:Ô‰­ƒ8ÿåìY¤í³·;ö6t¶iEÙìÔóJ„ô¢Ìçèᣈ˜„ŽÃè ‘^fÂ>ñ¨´Ó&c¶Ê]ü<Š~lÍRA34p ~é]!â?\gÃË<£Ž%Y¼D [üY?]:ôRÔÆLÂÐXÓÓ9ªœ¡Ÿ2c!f ÜÍØ9ñ¥„Q#3}Ü×Ê TÆ`Z Úz…™^õœ›œÝ\qMž0M3Wϼ„x`ÒÛøŸxàb`Š†Ç’>·‰&Â’Æ› Ç¹¢œ¢žM’«ejþ MªåxåB<$q …óÔ]˜;T ùhíQ™ò%÷oš#öé$ŸW`Ê3Ò:å9 V=êñ/¶£—˜WŸžËºIO=hBï§dy‘Š­Ù=>rîX1$£ÛÁéyúBh\FO3,—™yôDr†0}ºvíèW8*³ûÅ„hèÃÌ«v†Bú*±‰[±~ˆT‘çw¸'ÙÄyÙš¯i÷®é é]¿3fµŽó¿µÈd#f ê~} ­ÒÎnÚ ¦ã¶2/)$X!8 /jÞ£?·ÞM ;RÉ®•÷«êêd¥¢áý´1‘&p^?‡áHNºô …ˆP!¥0;…‡,ÑD!©8€`.g«@@Ÿ•”­þŽØl‚D{( Ü’Ÿúa©VàÁcÛÒß¾2!ðÐ-¯|ìAQÐ }¦rò‚H<Œ}·AA«AÛ:°²š<¼2!CPæ@)”ÙàÖ n3B‚]ºƒIÄ¥[d‹GîÜ©œõ#œÇƸf¦W"$2¿O)\¼‹áÍ,wÛ$;¡ùæ‘hÓ£´a4+˜HÑÎ:ŽNJHº”—DÔ÷rôã3S]ÕÒìÐÊvÔ¡3P±3yZ„Ì7<€vŒ…¼¤T˺fk´Ò“”ÃY¦}ü]XŠcl-!6c;n”ø’BR¸ê{˜ 5–`[Ø¡³S„1lÖ|ƒñaÙ¨ç•I£,épÙ†‰¯ÎH¬‹OhóUµŸŸäÍô©–:ƒrCcr0é¿Ézèó’'°åÏé¹CŽA ì ñƵîc€Ghíp ˆÚÙ øœ9*jwŒ§¼”dW·}`ÀöR`h¡Úp>šåð§d#Ýdi͵D÷†÷Ž<9!!)ž´¯.'$o&¤þLïΙĦhø"O<¤ÈslhâØàøÐàq”㥄ô†Ë`æÛÆ5ï¼½OïÌžA¡ì¨£Ÿmxº‚„ƒc„Ðøð; }³¦¦iñÑgç€ìB-rTÙÆƒ]4mAk3½nHˆ7ÅeæJž®·lÎÃ_ÔÜùöEÛ»ò ˜bCèéQ‹(£Îƒ#Š3jÄf.$Í‚!%:¹=ÛளÔfdalæ0^äÈ„ŽPãðHãákÂÑ·iÇtÃ1Æ^wàÁOÁ©Xö±b=HÅ;©7f<Á'/$9uþ‚Ö4âÅ®8¤q!…$| J8< Él šƒÃ“Uñ+Ò6wºo‚o7i|„Hq[»Q6æ–Ž8öaXıwUÐ+2vÎþc»Ú ~8l#ŒV6ž7Ø3ÁŠGF‹h_Jˆ…ÝFfG‹äFȎ±5Ýà!­´m¯ÛÞ2ð>½¢9À£BˆæpÜ$÷……ÄÐóBu½³¼;nl{‘F{~AÆ{vK1…Ç1ÄãLˆi ‰Ñ§g»ØJq¤×OæsÔ„kCrѾ©"Æ8OO4›Ð›K†¹89„GõÍßLZ²y –Òì7xÆá@šd-±`7,=Ø ‰K¦)Ä –„3ÆrÃø1?ç`¢#Ⱥ½)&é0.LvâMXz¢…Ç}_\ˆ`ZqÐ7E{Èâ¯üHKéw‚ãÏ•šä˜Fæ˜À ð= ÎPË3Ò Ð¢r*6gàNÛÎ:æ:ÜÒÍ/O¯'hiòQ¡Ài´c_‹.´¹)±Þ'l²ôÉÏ6àE¯Ãì‹jŽK&aœo8i ½"!À– k¬× %8s€Œ!.%&樂ÆÄU-EvçÈ•^‹šÞLèÔ“™¬š_‰Ñj:0ŽM²‹³<ò®lRaCF“ö ¥eco¹äÛr·prúÊ„ð%*šc88[æ1¤ÐÉçG!ž¨]tÉ´ÏNñh±†³(Òýçèœõ¹ ²CN–w÷_©Cž¦ ÕkÃ1ÐtþNDgвµEÈŸø ¨<ŸÇã-<1!r=³aÔ%ÌÖ'ÀƲõsËðq}slN…¾W$è²ñ ¥ meºoÉÇ•Ô×èsF‘‡Ä@­_9¬¯rÔJOjÀ,htE°Í<ÌcÕãÃã~I/]8kp]v‡qÿ®û{rªíJaòZ›lß%QmQ„Å=`]8¬È_X¤à›†P5ý }ü¶ÍêªÒ1ª¹ÁŠÄU©¹Ý³šŽ•knÒMgYçIåMò~†Ü—¥.áÝ<~+Õ§¯”n}­ømÁ(ckû{®Mbº9†Þˆö¯Ë‘ÄòòͲ½Wš«îy³<€ŸqCT¦îÜ\Ùì`JsÛf°Q»óþ;ó<¤à-Jƒ„—m§U!›jN »*m$äô=ÿ$Ôð@Ž<þìµìBTø³h¾©DV7u“ÕY](??Siwòû¼ß6ôCMSôN1ô\œ’ink™4kêrWÓ«öªvß@K¦ÍV~%ÒEâÙžža³u†í™üYì Ìý.”1䕺ÉÛ7øù×Ðo&ÏÝíù^©þ.ñ£¹}£¯àÙƒËk—zùùç²æ¶uµ•Mr-äÝÊÈ3ê[Ê-Þe¶•Ö’ïÛ…moßÈ·PrÔð-ïèD~Ê:Ã{<=ËÔ×BÞè™L©eþBÇ"WX—ê%kK »¹»:;“7«SHË …ËÆ¯I¯­\ÈèêÞ6-«¤¼]¶5|É;ÇüTÔ4;—ÀÂõç…²-¬¶L€.LÍaƒ/¬J¯*æT~ÖÔÿ¨eõBktWKh¨É!9”Z'ž{¾ÞÖåÖ^ŒØ¥<Ÿ--f’ET!aP—û¢¹äZe.v²Ú¬ür‹Šå%±òë6µ NŒ™A\&.*,¼TOI×øu©Ô±Õ)Qã¹Ì–%­s©j¼|=ÔTjiE¾uI•¿4Åò2¤¨ËÊ¥ÀÔº^õõJUVa*+–Á_¸|TVù ÍmÛà5ÂÜH©ó­³“­†Oe.É$µlCA¦Ø*s’(_RŒN#‘ÆåJÉ *HRèí›äE²ä…ëSs¡,Vž× ¯­­fäeò†ìuÒJåuø:;¯Ñ^ÜåtW9¡…_}v®^ˆËš]­n-×*K\’Ìõbé•Éå”^žX‘aêÏ"`…–YY­œb*”Š}¤½[•já¨Ã½Ì圊°Mºj„cŒ-˜“F%,´}!Þ¤1–Ûš¥ ó3I4µÅÖXârç§²™¤2Âæ~žYï¦QMRdD»¶œˆck?oQæü¤Ø ’•ƒ‘Ù‚‘MØ2I ™R)¾I5Š-Uýˆ´˜z uPÏÒN»ª¦­»%S×–ºLQ‘L/‘Ê$šõ‹Sfç‚™†- Ô[×0yÅ!1X¦oˆíãäÇ7!A•BHb×’?~·Õ¹K‡£.dOõ±MæG—ãOµ‚ õ %BmõKàŽZ}#¹ç§Tò* ëJËlHDPlE&Þ˜­Ï½Š2LâK¨Ó3‚Èõ^hÛ(Y|¢²]´m˜\§˺[ÉÀêXeéDÚ‰µù]¾F‡cë …éïÒÿv–NW[7,3]KŒ˜H—!”Ue›­®*€'€^@Í/&¯Mòf³ÓÉuÄÁ+(%²g&@mD¥Ó+ 4Û sSÓ,o@l6²µS7oRváXZa‚ZüÎ8åZHÇSÒ ´c:AìÓY l8\b§fÿuí Ý ÒÍÕ¨ÞÜ.¥¥Gi› >©°šþЏ‚å­ò¯unZŽn)¸§JÒœcoF 9whѬ0®@žœz»;'7Z–*'ŸPXyZ1²Æ~j•;£àb¥GHLZPCY’C¥ÄvWRÁVÅù[#U„ ŸjÂÀÛ=G:<¥˜@sª³õL 0šS“¥Eöûd‹¯†6èúPM& RžqiŠ“9qøá*T­øM‘*æ¬ø‰jYvcƒ¼hµ5·Tùnð%ÚβÓ3“Ô í`ÖèV—¶*0×­**ÂSUK‘J+uè'$?ÿr“—"cÃsô„¤Þ‹m˜†2Ùl•"¨þž¾ó…=%»‘¶'ë_Pó¡Åý$2[Í Rìé91°ñ©‰Q;+¨Æí¶p€Høœ  ´'¡„2L¨ºs2ë‚•N+DuÃð–™é.Ö¡4ÕYjgà¡ud ²m'y%S…ûÐwä²À”måà‰‘-ÆPe£RíŠ$dŒ/V¤ÒW™¡;×L`¦Em"cQ0ß„Vˆ9¡Ög*3+”¥š¨°§É6œi±.BçàÛâf,pR3fI‚A ÍË„ýá'ùªlh“ø[°UÙ·‘<í¿nv^í:Žbl²¸„+F9,T™rÑ"`s,nã®2n„_F\ ªrÈ~÷µ Œ‚ …È¢œ5Š †ý!:¦T½è3S3yÊÚ°ò†XÆ O¨^Mb.(§Ì]ô¡M Œ|ô k5‘pµÛd[Ïq(½RZ Z AvO)Üs¢æ“ÉÅò”²°s/ëTøV´‰€4uW–jb+ ›ŠÒ}€ñI‚ÃËÏ: Á?œúvReO¢c5&ò{ˆÇ$£ýÍ/æX-¯®ZÒ–‘ Êñ_¬I¶Ì¬ã3µSG¾;Á}–lûB´"’Û©¨õƒÑ&â²þÙ¤ßYÀmÚBŒ1{¯CºÂg ·i± ûÙÕº1oiï)NFsÑD+eB¨Y´C¶[›:ôŒ¯P³5H©@ŸdAÓ¨”‰ ÑôåT."O}‚ýÂéLï 1BW®•i ±Í½}VËSÖᑚQ³m’Ÿ_H¨ѹJ,á‹ÍÑzžXˆ¯#»ð=>è‰,ZÍsÀí•aÝ—¡Ê´õ8ª‚$bU¦Õ7ÙJ™P}…u‹DÏÔøŸë+ ÿqU\ˆÔÞòèŸ?‘ÖØz²Á‘8r7 ÅÒÛkeúB:ö¦´|â™4½ÏµnB;„ÑúœyÍ>¹ÛײnEè¹{·ŸSÊÎàñ9ãÆçwânŸ¦Y>B3¸ýУ5óÒu2 !žf”Ñhã9\7¤˜ÃÖAóxïºá‡hêè>…„n6×òœó^%ÁÞÞ´@;3!ÎÆ¼±Ô¬å í[å©g·hs }BÒêùö”ìùôc:dª•y ÁÚÎcKQïzýͬVf$D…‘V-ëo=¾²Ub©\k¡Ø¸åai›~P­¼!TÑ«Ê,]CzåcÝû)U'¹ ÉdõÑ >qù$§äÚ~ùjy­BŒº“s2ÓZ¶]áR±–bÀãž Q¯*ÍT<ÉW$DõˆnLÀVå€oë)ý8H Ž÷”§P³3¢*zYõXµ[og´Ù(o->9‰zRFŸð;t}fTµ/#DŒléá¶ Áÿ-½'™'÷Uc¯/>Ì…?zoÏ&D˜s÷\Æg‰õƒy;{èVÃ]6ln¤`‡ÄF^¾jg&Ä ¡/¸É6ÙiûìR¼›XÒ˜™"ùÒ±£îOåb<#êo’t=M!#ÐAÇ|…nŠ/RÊH³ðß­ÿo‡ÃLŒp^B„¡ë^Έ>@[ðƒõc<¿] ‡é×í …ô²ô1Á NÕòj,̰n§/Äúýƒn­ƒÿå?]eº’=êž|ƒ:c!¶CLdi›Ý’°h°4ˈ+†[ôËCÿµ .t{X8ÉAz<§É+§é|Ù§êãD—§bT/×m#pMÑjð˜þ×dëdzB´MŒÜZš&øoÒÚdq—cêÙ…¨T1¼GÝDγjVej*¸U÷¿cäíÙ„cŽ}Ýf6ÂÎuŸR}GLjM gϤn_^ˆÐµßµi€ »CIý–ž;æb Ƨz”¢'^µÓbm"ñ®eJÉ,Yx vö Îu~„š'ëíLSH‹šk;ì ˆ¤v‡Å4=÷ôè]?½`±«—ì~ƒ×ÝMZñ€øùú™…Äê¤äÚnl•üJ6 ÁýaÏ7^F}¨u[Ï©ç@žW@àèz5;=!"étùKðzv o‚;L‚VgQéf7¯çÕì´„øzöŒÕ#Ò‡EQ”[§þÃzPÌN1ÿÛ<Æ›¬Ë4-!}ÀH„XÚ-ûǬÍçŸxà‘>æ)=“®Ûé  õÁ³¹öÕ£biõ ¸Ï|)Þø•ùº†ŸPˆðÕÜI(&äÛÄ!}ŸJ¸`o¯À&’02IqˆÎ_¾Qž™^Ùú'P{Z6¬˜íG=ÆA&:ÀÐ ;Ñæ¸ÁÁRP'kÊó?’AámDˆºy± Çµíª–ËNuÏÄ’ç!„¯¢o`WôÒ‡¿JRÃC ) ­ŒÙÓ“ò.ÍØ#<ι˜BÍN\ˆÝ-#4÷´ö}ãa5Å6©rÞ£úÒÍô[iGÄÎé£ïá±>$þÍ–hŸGˆU³ö÷„;‰U½^2— R”¿vÚü­ÅVvD‚)œZõ²a ?Tß“¬Ùi ¹ºâ¯6ÖêÛ|±È9„–ï“Á*œfˆµÚäîâP¸Lg§-dð:Zèþ9:󇳌ÿ§;›ë ˜îª#––@UÙä¹k€Ž”ò,k­ûC×ô $0!–¬OÐŒÌËtbjRF†9KxcP3yýLSÈfc´¯ÆôS¡õ $š e„!ȃ,‹µÔpØÌJAÓÒB6)R—b©ç^a§²£ Ê™¥åBA Fl„pEÚ w`fâL_H°øWš6,Þ "ÑÁþÿ²ˆFÕ͇W­Zl°þ‹ÿ[¾ã»Ì\A/+¤sj퀧ºiR0HIm AX¸y~« ¯œÞ{£º?1Díÿ5‹^/f†z´¤ŠÕC¼•ÂÌ8ŠÅ'Èx³pÕˆ}.ØW¬réÆW“°Ú\µu•¹¾¾¦°¦]ž¢ô`ªßóÄô ±Aš(D«…¥žíoúo¶^ÓÓ ‰Ÿñ4ö QpØ‹üÛ™+RUá6hÅÂÚ$ïofgb=Ó¢¼†LÊÙ ž•x¾AÐÕOr0ØýY¢ ñ|’K­bh€Á-æ´êvfBÒŠu<¨ä-ï¤E©m\IÉ!BDé ׄdMؽ7ü!Lϲ½Í>úè¿£vÄÄãSt|¤JW‰>‹æøúMÇZMdë!ŽÃ¤šäy Ik}=l%TZkö](‹½w«ã ÞþKî K+ëÌ>`Ê«Ì]TgüPÃìÔó2BÚ@aô‘ˆCêKÿ,Ú¦ÑLptË'â52>HÒRØwç{‘³=õe¨Û1qºž¶ _â# x}øg€ˆáãµIžQcNÌåÎ*‡ ,LÞ˜§)Ĭ­?WÉQFrMVÇðBŠV¼õô¾³Û‰  DÉqÄs Ÿ‘<¸s2uè~âc -­ŽöuúyÃÑVÛzpðÚ›§ALX=Ï*„?ÙŒ%÷ µ(YÇ©ì¼ØV HFûs*‘)ÁqväÁBøÃÍ#[eC„CTJþ?ë<˜#ùPuºváØ§|9!ì<`€°íí =˜žE0ÂÑË `ÑÄPޤÿ‚BP*ÂIÇgz˜¤TÁÎTÇSpP‰`œ‡èæ"ƒÀnä¼ýLXˆ3H‘ ‡$NÐ/`p%ó÷[ÕÌS.»"Œ´Lö·‡"&Isþ+2:b'tJÛÀ#8ù@{Lµ£É*ƒìä«ö I¢%10'l&6Y"â.¼æ&ØbÄa4(f[³3€¢É‹`B´€`FF0\S¤úÈýºž\¥¼R!šcàwv¼wö|ŠÍ 2¨Âç=H “­ÛW&ÄA%w¡ðܸ ,ÔèS~b ­JÑI:ò©Wˆ„Û %†{7ý¸™˜—ÿ•ñq£<Íœyš‹‘Øö¶ <}&ªâ­³C-Ú@OžÇ ¿!Ý 1›•&V«Žì%§#·Êa12ÒCAñ±Æ焼¨çÄ=‰ŽhgaÃvyRO€"ðûZÇçÙ¼˜Ïí56 ŒR‚ƒóD|Ö‰O Ÿ|J£Ý´âŒ“3` ºu\ú8Bø²B<Åý)Є1”ƒ¼=ø¼1’7_ê¿ÞP‚÷Óªt.´EÍÈEÒ)´©Vùñ›1«¼¼Ïmò{R`·óìa0†7;w$£%5¡{]ÆK±ÖîÉfS'v0è˜)¿!¡WíÑ‹€†VŠvcÓ‘¬CØ:ˆó_ΞóÙ>{»cKCg›V”ÍN=¯DH/Ê|Î>ŠˆI8à8üžée&ìCJ;m2f«ÜÅ?Áƒ¡èÇÖ,4c!A—à—Þ"à}µaŠežQÇŠ’,Þ"…-þ|Ÿ® z)jc&ah¬ééÕÎÐO™±3Pîfìœx‹R¨‘™>îk„ å*c0 -m½ÂL¯zÎMÎn®¸&O„¦™«g^B<0jÌNWrŠFxR4I®–=ªUø€4©–ã• ñÄÎSwaîèÙ"­=jâ!S¾äÞâMƒBS`Ä>äó Ly†BZ§<‡ÁªÃŸýÂfóêÓsY7Ià©Mèý”ì!/R±5»ÇGÎ+†Dxt;8#=O_Ëèi†å23žH®Ã¦O×’‚ ±¢ý Gev¿˜ `˜yÕÎPCCßC%6©'dõA¤Š<'ð¸Ã=ÑÈ&ÎË~Ð|M»wMOHïú1«uœÿ­E&1Q7ðëm•v¦p“Ð^0·•yI!Á ÁaxQóý¹õnz\Ø‘Jv­¼_U§PŸ + 柳4óú9 G¢pÒ W(D„ )}„Ù(<|`‰& IÅs9[bžMZRB ·ú;b³ í¡(pKF|êK„¥ZmK?>øÊ„DÀC·¼ò±E@'ô™ÊÈ  ñ0>öÝ­Jmë8ÀjpÈjò|ðÊ„ A™¤Pfƒ[ƒ¸Í vé&—n‘-¹s§r†|yHŒkfÚy%B óû”ÂÅ»ÞÌr·M²šo‰6-1Z@F³‚‰­á¬ãᤄD KyIt@}/G?>3ÕU-Íþ= lg@:;“§EÈ|ÃhÇXÈK Iµ¬k¶F+=I9œeÚÇoÐ…¥8ÆÖbƒQ1¶ãF‰/)$…«¾‡ Rc ¶…:Û9…@Ãf-Á7ö˜z^‰4Ê’—m˜øêŒÄê°ø$6¯QUûùy@ÞŒ@Ÿj)¡3(74&#Ñ™þ›¬‡>/! p[þœžk1äÄ0ÌÚo\+á>x„ÖÇ€¨ ÚÏ™£¢vÇxÊK IvuÛlo!†ª 磹QJv00ÒM–vÑ\KtohpïÈ“’âÉAûêrBòfBêÏôîœIlІ/2ñÄCŠ<dž!Ž Ž G9^JHoh° f¾m\óÎÛûô>ÀìTʈ:úÙ†¡+H88F¿ÃÐ7kjš†}vøaAÀ.Ô"G•m<ØEƒÐ´6Ó놄áqS\f®äé qËæ<üEÍíO`_´½+‚)6„žõ°ˆ"0ê<8¢8£FlæBÒ,ÒQ¢“Û³ î:KmFÆfãEŽLè54N¾F!}›vìA7cì%qüœŠe+†ÐƒTœ±“zaÆc|òB’3P‡á/hM#^ìŠC‡Q!RHÂ÷ª„ÃÃÌ– 98 9Y¿R!ms§û†!øv“ÆGˆ·µeanéˆcOÀ†E{p7Q½R!cçì?¶«­à‡Ã6"Áheãyƒ= ¡xdñ¸ˆö¥„XØÙmd6qt°Hn„<à(ËQÓ ÒJÛöºí-ïÓ !š<*„hÇMr_XH =/T×;Ëkиãƶi´ç$a¼ÇÑh·SxA<΄˜¦}p¶KЉ­Gzýd>1GM¸6$í›*bÌóôD³ ½¹dè‹Ó‘CxTÙüͤ%›—aù Í~ƒg¤IÖ †qÂÐC€Í8áq°dšBÜ`I8#!`¼!'0Œðs&:‚¬Ûë‘b’ÓáÂd(Þ„¥'ZxÜ÷÷Å…¦õ(}S´‡!þÊ´”~'8þ\©IŽidŽ ߨãà à µgyH Ôú•3ÁJñ*G­ô¤Ì‚FWÛÜÁÁÃŒ1î—ôÒ…³×ew÷ﺿ'§ÚŽ¡&¯µÉö]ÕEXÜօÊü…I ¾iµQÓŸÐÇoÛ¬®*£š¬ˆ@üP•šÛ=‹¡éX¹æ&Ýt–užTÞ$ïgÈ}YêÞ}Áã·R}úJéÖ׊ߌ2¶¶¿çÚ$¦›cè ‰hÿºI,/ß,Û{¥)±êž7Ëøñy7Deê.àÀ͕ͦ4·m5±;ï¿ã1ÏC Þ¢4HxyÐv Q²©æÔ°«ÒFBAßóOB äÈãÏ^Ë.D…?‹æ›ºhjìÙÔ4ïTŠS²¼m-²:kêrWÓ«¡4»žW^–'eµóŸžaÃs†-RV7b'é­&6¯›a/%mwûF¾WêC¾Áž•øÑܾї¤%ïR¯ojÉM[ÔûIVSÊãË™meùkɹ©DÛÛ7ö}"ÿNáL&•Ÿg™úZܾÉΤ”ojÕ{ÊÐñCéªw¹«³3Y\üÝÞÞQ.äQ]$K…*ÀkTì\j×dïðËjë~¤¥înßÔäpCM÷â’Jþ¤k²Ä(9ù5¤¯/éŽýoåUòîôB^Ë+Ô7PSfENuùM±Ñ‡¿ÿB°cÂgolly-3.3-src/Patterns/Self-Rep/JvN/construction-arm-demo.rle0000644000175000017500000001265313151213347021071 00000000000000# Construction-arm demo. # Author: Renato Nobili # # Controls are provided to direct the construction arm (c-arm). Use # the edit bar and the pencil tool to draw a right-directed excited # ordinary tranmission state (OTS, green arrow, 13) at the start of # one of the 14 input lines on the left. Set the machine running at # a slow speed to see it working. # # The first 9 inputs pass the pulse through quiescent cell coders # (QCC) before passing along the special transmission states (STS, red # arrows) of the c-arm. At the end the quiescent cell specified is # written. Immediately after writing, a sequence of pulses is sent to # retract the c-arm by one cell, to allow the next cell to be written. # # The next 4 inputs below allow the c-arm to be moved around in the # directions shown. The pulse passes through various coders that send # a choreographed sequence of instructions down both wires of the # c-arm. You will discover that the c-arm can be broken by moving it # down or left without having previously moved it up or right, # respectively. # # The final input inserts an activation pulse (AP) - an excited pulse # that enters the configuration you have constructed. This is used in # self-replication for triggering the new copy into life. If there is # no cell immediately above the final STS (red arrow) then the pulse # causes a right-directed OTS (blue arrow) to be written. # # The construction arm is designed to be capable of writing any pattern # of quiescent (non-active) cells, and of inserting one or more # activation pulses. This functionality is used to allow a suitably # designed machine to construct a working copy of itself - see for # example NP-replicator.rle. # # Although this demonstration uses the extended von Neumann rules, the # construction arm in von Neumann's original design works in the same # way, having both an STS line and an OTS line. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: C-ARM_CONTROLS.EVN # Redistributed with permission. # x = 96, y = 110, rule = Nobili32 21.2pA6.2pA2.3pA2.pA3.pA7.2pA2.2pA2.pA2.pA.3pA.3pA3.2pA2.pA4.3pA$20.pA 7.pA2.pA.pA2.pA.2pA.2pA6.pA3.pA2.pA.2pA.pA2.pA2.pA2.pA.pA2.pA.pA3.pA$ 20.pA7.pA2.pA.pA2.pA.pA.pA.pA6.pA3.pA2.pA.pA.2pA2.pA2.pA2.pA.pA2.pA.pA 3.pA$20.pA3.3pA.4pA.3pA2.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.3pA2.pA2.pA.pA 4.2pA$20.pA7.pA2.pA.2pA3.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.2pA3.pA2.pA.pA 6.pA$20.pA7.pA2.pA.pA.pA2.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.pA.pA2.pA2.pA .pA6.pA$21.2pA5.pA2.pA.pA2.pA.pA3.pA7.2pA2.2pA2.pA2.pA2.pA2.pA2.pA2. 2pA2.3pA.3pA10$4.2pA3.2pA2.2pA$3.pA2.pA.pA3.pA$3.pA2.pA.pA3.pA$3.pA2. pA.pA3.pA$4.3pA2.2pA2.2pA33.2IL.IpA2IpALIpAL$7.pA40.J.pAIpA.L2KIJ.pAI pA$43.5IpA5IpA8IL$43.JpAIpA.2JpAIpA.2IpAIpA4.L$pA.4IpAIpAIpAIpA4IL19. 7IJ.2IpAIJ12.L$6.9IL.L19.J25.L$15.L.L19.J6.pA2IL15.L$6.9IpAIL19.J6.J. LpALIpAL11.L$6.J2.2IL3.L.L19.J.5IpA.2LpAJ.IpAIpA8.L$Q.4IpA2IpA.pAIpA. L.L19.J.J4.L.17IL$9.IpA4IL.L19.J.J4.2IpAIpA14.L$15.L.L19.J.J14.3IL5.L $6.9IpAIL19.J.J4.10IpA2.pAL4.L$6.J6.I2L.L19.J.J4.J9KIpAI2pAIpAIpAL$S. 4IpA2IpAIpAIJ2L.L19.J.J.12IpA9IL$9.6IL.L19.J.J.JpAIpA.JpAIpALJKJ9.L$ 15.L.L19.J.J2.J.3IJ2.2IpAJ9.L$6.9IpAIL19.J.J2.J20.L$6.J8.L.L3.16IpAIpA 2IpA5IpA2IpAIL9.L$T.4IpA2IpAIpAIpA.L.L3.J15.J.J2.J5.L2.2LpAIpA2L5.L$ 9.6IL.L3.J15.J.J2.J5.L.LK4IpA6IL21.11Q$15.L.L3.J15.J.J2.J5.L.2IpAIpA. LJpAIpA2.L21.R9IJ$6.9IpAIL3.J15.J.J2.J5.L7.pAIJ4.L21.RJ$6.J8.L.L3.J 15.J.J2.J5.L14.pA21.RJ$R.4IpA2IpAIpA3.2IpA3IpA15IpAIpA2IpA5IpA13IpA 22QRJ$9.6IJ.L3.J15.J.J2.J5.L.6ILILILJ.23IJ$6.9IpAIL3.J15.J.J2.J5.L.JK pAIpAJLJLJLJ.J$6.J8.J.L3.J15.J.J2.J5.L3.J.IJIJIJIJ.J$6.J2.2IpA3.J.L3. J8.7IpAIpA2IpA5IpA3IpAIL.7IJ$J.4IpA2IpA.IpA2.J.L3.J8.J6.J.J2.J5.L3.pA KpA.pAIpA4.J11.2pA4.pA2.2pA2.pA3.pA$9.6IJ.L3.J8.J6.J.J2.J5.L3.4IJ6.J 10.pA5.pA.pA.pA.pA.2pA.2pA$15.J.L3.J8.J6.J.J2.J5.L7.IL5.J10.pA2.2pA.pA .pA.pA.pA.pA.pA.pA$6.9IpAIL3.J8.J6.J.J2.J5.L7.JIpAIpA2.J10.pA5.3pA.2pA 2.pA3.pA$6.J2.2IL3.J.4IpA8IpA6IpAIpA2IpA5.L3.4IpA6IJ11.2pA3.pA.pA.pA. pA.pA3.pA$K.4IpA2IpA.pA3.J.J3.J8.J6.J.J2.L5.4IpAIpA.2JpAIpA2.J$9.6IJ. J3.J8.J6.J.J2.L11.2IpAIJ4.J$15.J.J3.J8.J6.J.J2.L2.8IL9.J$6.9IpAIJ3.J 2.6IpA6IpA.J2.L2.J5K.LK9.J$6.J2.2IL3.J.J3.J2.J5.J6.L.J2.L2.5IpAIpA10I J$L.4IpA2IpA.L3.J.J3.J2.J5.J6.L.J2.L2.2JpA2IJ.IpAIpA2.pAKpAIpAJ$9.6IJ .J3.J2.J5.J6.L.J2.L2.JpAJ7.IpAIpAIJ.IJ$15.J.J3.J2.J2.3IpA6IpAIpA2.4IJ 16.J$15.J.J3.J2.J2.J2.J6.L.L9.2IpA2IpAIL6.J$6.9IpAIJ3.J2.J2.J2.J6.L.L 8.IpAL3.L.L.IL3.J$6.J8.J.J3.J2.J2.J2.J6.L.7IpAIpA.pAIpA.L.pAIpAL3.J$I .4IpA8IJ.J3.J2.J2.J2.J6.L8.8IpA8IJ$17.J3.J2.J2.J2.J6.L16.L.pAIpAIpA2. J$17.J3.J2.J2.J2.J6.L16.pAIJ6.J$17.J3.J2.J2.J2.J6.L25.J$17.J3.J2.J2.J 2.J6.L25IJ$17.J3.J2.J2.J2.J6.IpAIpA.JpAIpAJ3.pAI2pAIpA.pAKpA3K$17.J3. J2.J2.J2.J9.3IJ.IpAIpAIJ2.J.LIpA2.pAKpA$17.J3.J2.J2.J2.J17.5IpA.IJ3IpA IJ$6.pA10.J3.J2.J2.J2.J$5.2pA10.J3.J2.J2.J2.J$4.6pA.6IJ3.J2.J2.J2.J$ 5.2pA14.J2.J2.J2.J$6.pA14.J2.J2.J2.J$21.J2.J2.J2.J$21.J2.J2.J2.J$21.J 2.J2.J2.J$6.pA14.J2.J2.J2.J$6.2pA13.J2.J2.J2.J$3.6pA2.10IJ2.J2.J2.J$ 6.2pA16.J2.J2.J$6.pA17.J2.J2.J$24.J2.J2.J$24.J2.J2.J$6.pA17.J2.J2.J$ 6.pA17.J2.J2.J$6.pA17.J2.J2.J$4.5pA2.13IJ2.J2.J$5.3pA19.J2.J$6.pA20.J 2.J$27.J2.J$27.J2.J$6.pA20.J2.J$5.3pA19.J2.J$4.5pA18.J2.J$6.pA4.16IJ 2.J$6.pA23.J$6.pA23.J$30.J$30.J$30.J$4.pA2.2pA21.J$3.pA.pA.pA.pA20.J$ 3.pA.pA.pA.pA.19IJ$3.3pA.2pA$3.pA.pA.pA! golly-3.3-src/Patterns/Self-Rep/JvN/cell-coders-demo.rle0000644000175000017500000000316213151213347017751 00000000000000# Cell coders demo. # Author: Renato Nobili # # There are nine cell types that can be constructed in von Neumann's # CA: 9-12,17-20 and 25. The signal trains needed for each are shown # on the left. Advance five generations to see the result. # # These nine signal trains can be created by using coders. On the right # are shown the necessary coders for each, converting a single excited # pulse into the necessary signal train. The confluent cell type is # used as a splitter, to duplicate a pulse onto two wires, and also as # a 1-generation delay unit, to synchronise the pulses correctly. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: Q-STATE_CODERS.JVN # Redistributed with permission. # x = 60, y = 66, rule = JvN29 18.2pA.3pA.pA3.pA7.2pA2.2pA2.2pA2.3pA.2pA3.2pA$17.pA3.pA3.pA3.pA6.pA 3.pA2.pA.pA.pA.pA3.pA.pA.pA$17.pA3.2pA2.pA3.pA6.pA3.pA2.pA.pA.pA.2pA 2.pA.pA2.pA$17.pA3.pA3.pA3.pA6.pA3.pA2.pA.pA.pA.pA3.2pA4.pA$18.2pA.3pA .3pA.3pA5.2pA2.2pA2.2pA2.3pA.pA.pA.2pA5$4IM3.I14.M28I3.I$44.I$M3IM3.J $32.20I3.J$IM2IM3.K23.2JK5.I3.I$32.JIJ$2IMIM3.L23.2JK$23.M8IpAIJ$I2MI M3.Q2$3I2M3.R$32.20I3.K$IMI2M3.S23.JIJ6.I2.I$32.2JK$2I3M3.T14.M8IpAIpA 2$I4M3.pA2$33.19I3.L$33.JIJ6.I.I$33.2JK$23.M9IpAIJ4$33.19I3.Q$33.J3.pA 4.2I.I$33.J.2IJ$23.M9IpAIpAIpA6$33.19I3.R$23.M9IpAIpA7.2I4$33.19I3.S$ 33.J.JIJ4.I.2I$33.J.2JK$23.M9IpAIpAIJ6$33.19I3.T$23.M9IpAIpAIpA4.3I6$ 33.19I3.pA$23.M9IpAIpAIpAIpA.4I! golly-3.3-src/Patterns/Self-Rep/JvN/sphinx-spark.mc.gz0000644000175000017500000030470513151213347017525 00000000000000‹C6õHsphinx-spark.mctýÉ®-Ë•-ˆõ÷Wl ;™P `uõ2e6ÔÔ âÝx¼z Þ@ùõ²1fe¶öyä=¾×òånnnŬç˜ÿÏÿµü¿¾ÿÇÿúÇ_þòŸßùŸûŸþ§¯ÿá9ÿ}ÿ/üûþÇïÿõÏÿ.)ÍïÿÇïùËïú·ïÿýŸ¿ÿçüËûËoÿùÏ~éÿýÏ¿ÿíûü÷·ÿóïýÿýó¿ýË÷Ÿþþý_ûëoÿñ§¿ÿþÇ_¿ËÈÿÔÆü§–Æ?Õ:¾ÿô¯ÿí?¾ÿû÷Ÿÿô7iá_ÿüËýÛßÿãÿò÷ßþË÷ßÿüÛ÷¿üù÷¿ü—ïûÓùû×ß¾ÿô×ÿ‚‡üþñ·¿ÿéÿýÇ?þþý÷?Î#ÿôÿ K;rÇï=¿üå÷ý퟿¿ÿoü ýþ·úþ?þøãßÎoß§Ghý/¿ýëßÿ‰­þíß;OüÇ¿Køío¿ÿÛ?þ"ÿÿOßÿí·ÿüŸNSÿÛÿíüzÞ­¦ô¿þÏßü+^àÏßÿöÛ¿ýñÿyú&÷ÿþ׿ýã_ÿõ÷ùý·¿Jûøþãß1 §ñûã¿ÿù/ÿùþþÏ?þñý·?ÿñöù_þã·?ýí·èÃÝöß~ÿ?Î}¿ýýï¿ÿõ¿~ÿþ¯¸ñ?|`Î…ßç*öí¯ß}“¹ùß¿ÿ¯ÿßÿ­ì¯ÿáÿ‚)83p&àŒÿWþNçÿû;—ó1—ïÌãþ*<Ÿ¿ËWå§ô]õÚ¤×f½6ù¶‚û÷øžz9:g÷ùùÚÜúÎé«ñcÃïýnZ>ÈmüܼC§í§võîɹAzd¯çw^ßç°ã²,—é3Ò¹ªdþw.?Ëý;³Ì¿K}š¾.ü.=Þí:?Ï—Š»ÑÀùoé –ö]¶_–®«j>ÿÝã®ãW+Æ#xƬã?Ž…4пk—®%ü¨ÞÚ¾ÏÖªÖZ¾ëÖ!®gÀÓ×î×ï–ý-“Ïd’‡JÃí\ÔlÔÙŒ6ðŸu†·ä$ýl wiwNGZÿnó»a ÐZå,Úç³Z®.ØDïB¯gkÿîí4Ö3ÿ;g»¾[?ÿ ]Ò”|Ú¾²ñ¨¾¿GB+uêìë{ ¯çôHúîÉŸí<_ïõ{hWõ]“¼¹Ž_hÌóıü2T\þmãvÖdúžÙ‡ûmlDzö»&m¶ï)o¸e„¾²ÍHŽoEç!º)6ç÷<Þß Ó2NsçÜø^ùšŠtM…Qkó\¶Æpé÷£“núu&¹úÌ2kÇ=õ{ÿÎ3×÷ÆögœÏ·³Yô3~å+vgo€šÎ3çFge÷ïmó_Ê·Ÿß{]#ÊEp(MJ²:/šEB‘äß„óç¼V2nË k0'4‹¿ƒçõ†tǦiCa?mô?m¿í|Ý÷XòY×/™¼wzÑA<ýô‡ow>çvsŸ:ë"Ê’{ŒT)×ûI÷HW¶Sf>iÛ¿ÓöFç‡væ"ýÙ—ùÁ*ºsÁ+UÇ Wšš}úÈÇžVi=í:ƒ!ÕÌ8•“ñ¼²ùÛÖùÌe‘\%]üº]6?êÎM6[¹âßyâ¡‚vUÖ¥bâç|ˆ“ü²kçqé·äOåßÛ4öhYÿ?㥱&GÌT®¸ú´×p¦YmÊŽK±¥ù€¾¼’]1Êè°:ÛùåÃÜÉÇÅͽØ_¹aûËc/œ{0ƒ'xsÃÍX1àƒ§ý>ì/û8´ŸÊgì ‡”â ¸÷á,Ó!m-Þï;²ýåc³´Ù„˨ ý;ÉͪïÇ°×øi¥o6̉œ8y~(w&±æKq±d“”iå%¿Ì¡Îøvúb<õ…’¢í/v¨s^èÂéÝÚ×{ï{Hw œþ+öéÁæè*¶ò¹|ƒaóœÅŒã )(WM·¿7ßò§ìik±jŸ6¾Iyò>=¡ãâ,ŸÍ .ù ÓlKsC¨;[êï’bQÄîÚœZŒNìEdPÊC\q塯6ÀJtZŠÒøV%ïÐìrÜwÆÿÐíºŸó%$(9Î!²b…¤€ëÚ%ìqŽD¼*‡Â¦˜ÿýHa"âI;Ú(Fðc‘'­àïy4¨3$_é¬tÒ;[í7¿æ¼Ú,øå|æùƘôe¤ ëò»Ø· <¸ur•‚“œàe+C&øƒºí|í|,«ž®5Pñ/µ¢o2üyjm:ã[ÆJÖù5YuÜ+PÄž[ˆÔŸŠNi©§§‡z—–îa:T±´lC»‡v4›¡ìSäÚÖ¾ä»Ò'«Y¹PºR§„0X¼xDÁ(žã¶™Áš8$¹tHV:#ç fÒUI¸î삊EV”Ë‚RŸ?‡SÙ«*èv÷_+m<©%”–rFç°3Þ¯xœK»2…{†Ü:t3¥{bc˜B¢âÊÀP‡Ò’}' Ë÷¤ÓáKc)‡”C „o‰rÞ¾þRG(3‡á*ìRH™Íå“ñT:mÌÁgð‚ì$É+ ‡êPr2Ñ"·øIר-Mˆ•†…vˆkÁ¦Y˜˜2qæ\½ÎÓ£ÒñBxÚéæ|nKId*äoJâ—ò:goÉî²9©Ê²ÐD–ÄEn+G°/—k<ë<9_"#6ÜAdEa•Ëø4·¡!Ÿ€HïùˆÃ¯Ãùß›k ‚œß™)ãMgúhÀºïíWáß¦Ûø–WÑêÚ`5¡ý£.&42ƒ"ð ?èö¨Pëá*5áï: ½¬µ …‹ #¨ˆl lÍÕ^Ä8°m :Oc¹ßïNEú,{,"Ðèšqît•¶¨ûe£]ô¦…m’«®YmkÉ!Ç‚ÓQJ.rÊz«‡Æ×CQªT2ÖY Ö^£¨{®âÐ žÁà îÄu§‡‡ÄWZBp5÷–ŠèntÈ9ž¾}f9b ¨è;§6m'ñ¸/þtÇõ©#ÖU¼GÅr‡t_az=v’CµD8­5ÉßfsH*;U2Bž]îÚßµ^VeÎõôJé^W‘5ȦAÜôJt§á>Üs:Ù–ë6¡'ªP #†.ž/¢i/˜S…>D)>‹Hî@Ø®\…‡žY;TzXq†?Ê^䨻xñóÛ#+öFÒû[ŒLæœÝzÈ{\¨‡ÒVX`Þu¨ p^Aºøåö8¬í?ú[í5ðÒ§Ñ3õ÷žðekµá1›-Ô)Ö§ón‡¼×Cê!txüŽ3çó,àŒ +ÓZ ‰xë<ˆð['ÌGCŒmþ‹ÛM‹wý>$~£}tÃ0Eo‰‘9¼ìâ¡õïzÈw]ň”“¢óHÿ·¸ê!ŸCZÛÄ!‘ÖI…w³DÖñd½;¯¿–ôrAx¨GÞª Ÿ~ìÛ\•¹T+mg «•¤þpk úÀigvJϬ»’Bî.F'ò‘ fÁ§müC[ç‰{Þ[Õ”é éž±pIL05ÜK œu›ð%ä àyܱç FžC‘ : ²`]xèiâPÆFc"\ÙÞ!„¿Dó¯0ª‰ÿlÝ–p缈@r‘:¸tz©¶Ú8'ÛùÜ2>ûú’m_¬'…Ä•?›·’àÏ î%nÑ‹À÷ ßzŸ“íü;=->ºv›°¬VŠÌÚãä6FHC`iìëé­p[Ùj5r†y¦–,ýÇVVH¨a7t£…ÙNDR:cQaU.$ªhÿÎ(9«ÙöN÷fjµÛš÷a.Ú-siÜæ[2Ùç®vëŒrálÂÌÀnA¾ÚÙõoíRž/Œ.Ñv¨`k$JkÒçr©” Ø‚,ªX…%ýÄQpo°Ã6Ž‚{£ÉO8¿ö¬D|’ÏEꘄΑ€’¿¢P<6₼iz"&ƒ”ž_‡3Õ[ÎŒÏAK+vOG‹g^Fú2sºüxzÔFÑbÖNz9ÿáÝ:®9o3 Ê¶«}e“ÂLú5¨×òIÞÔW¹¿Ù™x„=fà1çÛ!H4ÿ< Ÿìµã9ðBœḭ̂ïºUMUèÓþĽíOg°ÊÕ¸ e~E¤åEv-ΞWÁ‚[‰™XÌ°óØ±•i5¯ÒkÏCLÌPî”~˜RKè:„û`HÍÉØpµÚ-`'¸ý ”~³1X,4¥ÌÅɹšŠ ÖúÃÚÙ*mK÷øÉÏ4êö 2þ…¶Ëµ—…X`3ƒ¨J÷0…›$ÛhHÞfݼ„Ìl*Bƒ5‡+™=Ø0©Ÿ?ða:Ðhð2 O¶]&î'±mT8ú¡øý¬Ùžê³ ûV[eOÝþÞT¯¥ëŠnÒžp)VX§ Ùß3.=áþŽïž“Q s†– P=‹!¦cž®1î ÔÛ,1P5Ô\¦x{jV3Ö«ê_á [ªû÷Œ~œþfÒ̬$fo›4Êé ±Õp:)HÑA¯{è…Ö“óBý´ÓÑzi—’œø$tˆ3†88Çù½ównî‚AZ2 ýPù~øE?z@/û6kݬ§ÃhCÑÃZׂ$XíÖs ´jF[ãbðÊü±Ì\¯3W1Zç_Å牶1’p*b0 .tUЩ¬8ÏÀôà>ƒ}V=<áð‹Þ2mgÆÜÛ|SÒŸäw¯©†ÆÄ[O°ÐàF•[“>£y˜Û:ÍeüûÆ_kþÏsþÅ64Þœwî·GwáåÎñ3æÿ+ôpõŽMzÖƒñwq 5{¿{ëOÓèÓ6:”öÕ8<¶Ùþ~¹;“Óìkh}°¯‰â§uõÜŸ,xZ&1Å÷ÓÍÖÎ QaàžÂêµµh#›)ÄŸö[Ç•›{¶Þ¤ŒæX¨UàÀß}>3ÕµÁ~øœøÜ8ÿó ^ÍnSa¶`£_#1'GBÆ PS7^±CrÆ«v7[ŠùTI°v¦Nµ:sø`0…ª«º/¯“ž{Hl?¬¦/|¾-Õ`£³Ù”¨D®Æ× l,íì­ý( }qͦלêgÌB :~®s;õ„|IE&TºlE»á¯?]£¿×õðÃÙÔ^Þ±Oóm¸èç¥úíÙl+L<âSÎl—̇‚hßxö!”ªÙ™‰/w*ÂG©]â¾ë .ÏßöO%OòD´}tÀ»õešùÑ>­í#áÓéÊéðÈaI4|ñ°+=¨Ù,ª+Ú³EþyÊóI_AGFó8szSUÏÄÏ?î‹3µÀÓH‘Š*—Ç2¹¾#:åQ°ÒÇ¡ÁË-°PŽ„.àßi·¸AÙTV“Ö}”ŒIŒÓî8 `T„²¸QF§Uåñ«•|Mf²F@#£š¯XÐÒµ Dôã,®Ìî¨ù’Û¨’ÌÒ¿Ì3΂â H!³+ÍÁºÍaÐÀXøwV/Ûñ¢Yרö:åØYGï6h⃟”¤TyGK»Ë_Șcá>üÃã Á¼á§­mBä@ôWZ—±Â,IÖÍÉ.1Š\ZÄA q0¹Ÿ©˜êšh7¨bêï”Î+Cl|çÁé¸W wYê°œG@›ç¾©‚0ô ìîîî¯â{^¬ÜØ@3£Gó¬ÈÃe¦q<ÈàX®I­… Õ°Ž>wdükº>gBhí @¾)ÞB(‡y·Ò lqÐÉA²ëGJ×jÍkð¼ó–PB΋̒UKEßú– ºÅ^æ*ºÎ¦CV¾ž& þ5ýÛBº5ÑÕý5åÅAƒ®Ç ‹ñɱ̭/„:­ëÙØÒ¸³"d®Ú<ïŒyE\_Xˆ(¹E¥lqûç­- NWÅÓÖW QpBG$Ls u:SNù&“ŇdÍC¨'%ü š°ŠÇeaðÞºCίóì߉©j…H¾œ$ÞÀL…@¸¿aRã‚Ü|zÙ6o†öˆOçÜwW(”_Í^lì ¥ìC¨\[71ÚòP:Â]wö`_´3UP¡@ú‹[Àh§ôÚÈÖ^ºVž†•7,¼Ë­»ä ¨OEça óŒü]WÆ?‘¶á—3æާ÷c^c]ÔvÄ‚îàÀe-ÙvÜ{¾0'œè3c)àeNëGty–áÆ5õ ¼òôƘs)51XVFÇùøàÁ=ãm/ÛÈœoÄÝDÄ–òJW«sYìä„›vI»m§p2ÑÙ÷-Vlm6†dÏC¸ç‚…Qü-¹Ê±é7úý5ærr”çâN©7Q(º¹=kW'”8§þU1 —øó翹¡\ã³ Ù<Á ¸í±E,Ê9ÑõŒÐšølÝ£ï˜>8¾eiÑùëàyxÆÑÊéÚ!ý ¶G&QøàTy>ä`J½Œ„G¥x¸¼O·ãÐX~ÖûáÒ sÜ®ÃòÆäHäku§PF0ø}‰”{‰—¦W{.ŽÌþZ›]Zbßžx:¿ÅRÆæpuhþ"Ǹ]ù\s$vp'/˜§·8a‹6Ç?PõUºm4s/ ;„™éX J‡¤®'ƒ|p©mür6y²h†7²Nc;á_¥ç2(*áK­á”.ÄI,éÛGƶ󕡤‘…m“Š[‡…ì„^É“$¿áʼnP,¸’oö„ õX㢳±6üõeÚn0wªJ¨›^e< ?düÅÉ˯.œ… (¤k€‘ºÒÙRP!§ÜHÂqpéàÉ6‡sq(å>bß>‹r[VÕχ+aùÚ…¶¿Ë"ãóCîbö¤…«Ò/ó lö~ Ðâ¼4¶ p†¥"dƒä! áìº]²öùîpìm¢l–_E†å¿óãm/Âð3÷…n¸íâÍÕ·UaÙá‘kù[ºÃ]Ö¥[tÖ ú¼5e`7üCDÒEq‡dÝ!Åú³ŸØMå7(™ú]š:ÓÛBsí†NSqÅùÜ,ÊE×õ›³´·Š Ö|5NA›o îaÃGÂÜg³íîI:힯o¢2á^üS÷ñ—›øí9C&VE7f¿;R}È”ÃÑø÷Ê¥ñ(7˜ŸT¯˜ ¦A‹pÃt4#äRïÎÕˆZ¢õœ7:²@ú~jæ?è+"ÈÚt½Z„-éu ¡Îd‹îá}¨ìF„ΡÆ{V½¿Ñr†1¯YÅÝ[£~8âdü°Ó#¾‰åãÖÍÝ kþîÉw84}³ûØËM2Ó9êuf#4«Lç€H1YNT»þ‡Ò²»¡%.ü=OZ{÷ù}R¼îœãÖFð ‘­öN6û¶z…ÙdY.cÐDOã’Gž÷Ø7WÛEÖZ—šHžìLÌíIŒ)ñ&‘.Æü©…f¯Q±>¿g¤e¬!tžùFÅh8'°æÄŒ1*©þhª?gf,$SÁøÖCò˜‰°§¯(Q…8 µ û+Ñ’•°oöÆ?F !ù-#²`wl L²­ >ŒPɯ)—Âe¯„ŽLý¾5?Cƒú“ã'dÑ&¤€%ùLâÎBøœ:7] ’Pâxýðõx:‹%ÞQãOÛùÀÄŽ”ãÀ³¦dë–wgg?è—62vÂb%ì‹xÞõýÏ xÂÌ;Ïdˆ_cñî&¾ƒmé¸-ìZ9!Î4! ,!*ñVsÊs¥Kcp_³“tl?m-àúïNs}Äž$(u‰yÀ:DˆæOœç*‰–H#Y^U¼Í9Ù_›‡{v-*µj©a‘MÁåiÞÖJûï—8%“‹U@ˆ°©±¥É.6FEr‚øuÍËÓ²h¸í`c’ØanXl")c‰Ñ¢È¢GÏéíÅh’s‡«…m‘¢Üí‘?o8mˆ3AŒ¬Œ´¨ò$þˆaKÝzŒ†(H ]Cè1}ªÍ4¦4ͤáU_áS"ICžCËRçtò4.'­Ø‹¨‹«…èNyœ†óI¡Æå4“ji§E|˜(›ÄèÙóŠ|m&š2ÉÒÓYWœ/t²ñÚzk›Ë=8»móÍÈ)\ŸÌ à>à)Fø‹Ñ ëW 'ÜoØ ‰æ %/SœKTßI´7>hÏjš½BðTK?ÅòJ‹ŸÐ)е Àœ°š™ù=À\Ñò"d jopÀ0.JLÛŸ¬Nxƒá‹üo÷ñM²0Ó¦´E!‰_…æí$¤ê¥Í«SÂ× Q«wÂ?ó¢Ÿ87÷ÄÉ2qó˜÷/c* ‹Éšñs~à#èÁZKI5«›ZÊ<Ñ WÈè¿>¬Ié^¬é^äQg¤-c‡oÉñ£UŽIÖ B—$h1R‹Å[}Ъ: ­ñ%³½y|IOþ–P&Øœ²SyzÆÉän¢HïQ­\ù¦!Y׺Û3Sž3iÜk©Y+úàŽTV¹šÏ“d޵°(šÔ2³Ë%¹"‹ï¥rJ¡9üȱX*c¦÷h$%¬ÔÅx‰§Ø$3ˇ2ÂìL†$Nr+lS¸%)kV¢F‚݉Pž2 ;¦Í¢Æ»€Ï0íY§¸¸$*9Â$ÄC¼ÙøpŠð¥6 ­éî kU ¶½ãPA½¡PÁ,á<˜4œ6W)ÇÏ”)Ùɉ±ã…qIˆþf¨wrÁ4› iöŽÊ4éúÖÞŸ³Õyÿû*Îõ%Ê{Љ)‹Á)ÛE‰QøIñULÖf\&£ –|†°‹\¿÷Ë5;x%¥–%שê›™:$ÄÜ`|S{1í;ô'ƒûb¦8rÈÏ}ZäLÊf"93Ïó² ·”ÊþåìÖŒ$®â;Õ"=w2(Ëg¥[—·on'öŒŠüd€yÆàˆ)‹—R{b}H*’m!Zîh2Ÿ¤›Ÿð–»_,]ƒ¯Û]¹P ïB q³Â<¯¸"™;”‰æÌ4/éMŸ’ÍË•¤ ÷²im¤ñDÈpÒñÓV ˜Òp3÷IIóôôŒÜôs°IÇK¿5$Þ ]ªYö™¸›-‚@CÖÕ†ÀÅJd.ê*Ï\ ¸QWˆdZ<Ž8i,6‹·>b{ó¤„ ôLj-rvÜ÷®.i8/Ó·Bpmô« õØŸ)°Gú™‹¬Ðuj±Ü¢ iÿd—%ŠÐ¡` T¸R¨].\°Zò®.p 0E\£uÕ÷ò…³"J%Âü—ZMrDÒyFÖyF"ú9´kxÐIãWÎïèžXªÝЙ¼KW:Ô_ÆoFåz”=˜š[Ài$]qf¯ )±%¼­U,¹o ½ñƒš!¼¤²ñ’•VPÙŠz äÕ¸BCñü6NôŒˆ7’Ô9N˜®¨7HT5âB.£2Z$­Q]€[y¿ú;J¯.lWš‹)Ì'†Ù˜vyQ­aà©ëYòÙAÔ #—-Ôfj‘èìhÚ[¨ßF´˜½T†£Í<Ò Ÿ†7·£¤TÈ¢-oÆI‰JÆû< ]nBúŒÌÙ8$OáZŒD/é¼ÊˆÃÊHîÉHaÏeÜáK²igöüƒ\Ë%8AA÷YëkÈó´> DÎH&Ï’ ?1“¤ )ÿ‰xIç 2åœj àÝ¡Áû0«RhôÆ£:r!ÓâàÎ5D–.ÂÂ-x‘}ÀsÁåh(«š2© >òò²(¸è¢á4ѧmæ'óA¸Å™íƒ¢ì¬e4,‰Ï#C¶hFòû‘i%)92„ZV!ñ]#§¬gü· ®Û°$‰{qËè.‘ÿq‚‡¡â·6–<†Ô“E—¤ìfˆt"¶l!IÓòRåKm•®Ãdù¬êuÏHf‡AXœn©,Q!#íK-ëC%0ʾ݉[pUFN}û4Íiy„£¢ËÔœØKp2 Û§™h«ZL¾¨²fÖÞ¹±bZ«ŒÌl_I×Ô‹áü¾ç`ÿ¼ ìr}KYPšß Z1šÏ©ÊÉØaÇI¿%@ú WÞ×Å)ðy‹uˆx•FW7ÅâJ“'u™Â¯žê­ð6˜ü]<:ÛŒU&·W*[-»ß#?>í É(™å¢Ð”H‰] ‘ ' |ª2{Œà!ˆØ ùêr“Æñ‰äÄ+Æ5’ErB_Ÿ±ù²ÍÝ1ã©Êh*¨è_ö¢²³4TÿÓ&V‘ÍŸEèk´Iã¬tN*o¨_´aW‘n2(ªµ«;ƒNØðÈð_‹.QöÁHøHq„O$jÛJH£„Ì(yû‘´ï—zj4Ô.«ƒaÙÒÏ’À5FOµ'„ˆÆ,,:hÄœ2\.5_x® ×㲟ªCE=Oùñ>._aá%’B¿ó9®ØsŸ‘nÊ0BW²uOäJϵ([Ê +úƒfccn¨‘4gÏj%²Ò»ðâʬñÂZªÝ9)Š äÞË–ó‡ú{Nð'z´²ÔÍL‹á-tn»Ãܳù_Në~ 3²ø³˜å ïBC$Ú©ê‹NÆ ’¢î0ç\ˆÓ«2ìö=Z@Ö‡s¯kéΖ )ð6à!ñ̦‰È‘îŸ%û̳þ5OßZ%.–¸¾Å6XɯZSi¯n`F8Q+ÓÛ^¾2¾Š-$_ºìʼ¬_t|*†™mÒ4Ñ̸B|IXI-1"B8ÇTê†%cKKÆx¨cz0¡+=à ‚.ˆ€oë3zò¥<ñ¾—Kކ mEF2PÈ`ßkгÄä¦}‹Øb¾bÎ3‹I¹qVªEU‡ÙÓæHa8~\Ã7ðŒLm 0Y”Å,¢¥>èyä¨Êè4òâþÕ´°3ýDó  2A •@"EfÑC7ŸŠe£UÂK4“é³XÔñ$Þ‡,˜¦Šf†8€ä&¡ŽÌir7 @çà-9D6üʼ$š@ ®%†dDüd®—V©leS^ah&Ń© O›€M ¥F¤°€ÃNÚ¨WuCDoúøn‘sk‡{nlÙõÌ‹£”À’¤çBј†ÄwÚŒ¿,!ÌßÛ˜{$`rÆùÄÛMýç>¤âµž\4uV¯$Ö[×9ò­ì’Œ(0(Wƒ·YÚ7º?’¥5²µ.£×‡Ž^—µ>™+Ÿ)6z@»‚=yxXʳñe!é.J¶A. oŠäÓˆX µHYL;p¹v±g³•e%Yš/±øÀ9 %V·B­Ö-âyÉm@3°ny Þ™A¾ƒŸ°ÆgúØYÜv²éèÎB0ü¬îäé¹lE.UùÔ.6[xŒ ¡CZGM6„-ûù"ëÚ½ª;)©×ßipÂãÀ(}{p‘”v%%$‰ê÷ 4€Ÿ‡xlˆ.<éfwLflñ@·5Æ} ÑžÈߢï£}2’ZË$rê]Ü9zÆ-à›H™?zh¸ý÷\%*=€èö½]²âÃÒ‹"2¥™#qÄE ûm’>/¡¥©ê™~n $dx¼øŽèšà£Ð>y¯*5(‰0oogò6LIÅ":²hÔ¿DaëäW™Ÿxôâ-³Ò—f¸{’[ÉljßœúZ }žS£Ñr#ð–*ŠmàžNo!ýÁžÚh&‹ÖUÔµÄ/èÅL’£ÐÓ²±:ÄYÌp /d@œƒÄ.$i0ã×ÏsOƒ*·v†ç€©!wqáh ¹3ú…‘ñØ#¦Ú ôˆsVs˜Aù-²@LTæ¹S—)¡4IÁqÚœ–VýM'F¦„Ýi™m\|ù¼ÜcoJŠ’r,¤Ýd€/œùZ}Ã4…‡‘©tŽ!8\o]ÎN?Ûå,/#OæÁ9Ì/²n24< Š9ð}À`jf¼{IZéäÜö§§ø’-ë! ˜–ÿPݺn‰›<ͺ&Ç«K‘š´‘ÜûÒ?n€ˆ™f‡‰ŒªŸ¾dat™ñ‘£ý!íã1ÄY’2§ÞT8‡ß›|(Ñ!anHõçAB6ח秦èð¹`[Ÿe‡ábnG"ùd@%hϱY¢çƒßÐõ¼;¤O “™ÁtOõ)¿z_³ÄÂ|i”m¦Mž‰çCê Ã9<½³¼ryïôÓe¶ˆ}cgÄ5Àœ[ÿÍg“äWæ 4x ç€þ,K‘Y–Â]yÁt-_&ÝvXR_:ﲿÁ\ôÓÁ€Å% HXCˆ sàÅNé!¹äf@DÂY°äŒR¢7›íÙ>DŒ½¼íÚÚ7ˆD}o]k‘þfBggRAA÷ËHV†ÄBç<@Ù qUð«…HqkΚ4‰æ«å!³dˆ|ÞLÃA·WÓãWx›F$Àå‘Ô jà·éYfoŒïCe<`œCSqbˆ+W„ ‰€§7YÏ"»|Yª×Õ½öü“¦‘W—Ù*ÂD…)F"r)b—1®äêç»tJ}/ƒÀþ¦9ÚÛZ¯Fï€K'q‘°Õ-€†W0ãTdz17J°¦ÿª…Wž$^G’·Š0¹­'³ò>"zhâgð¬^}b‹Ô‡3±LyÕàüVº‘š©;â–,[8ÆÜ*! ÍV¡nT]‚¤‚N.üð yè,úMˆ¡—`âç\c Sæ0½`g£u_¾¸vxøt’LtK™ÝÖAç5¶‚lx`ç¹&¾«Ñ#ú3mÍÃ#øÑ[x}Ò¬ÞÑeWôH°ËƒèëÝ|šœ&bÔÑ$…e ލtXRå– $f{Z³]«Î^bÝtÆCçÐ4Cê¸Jǰ§Ài„vbYv*‹Þ½$Þ/.}xÆLiåÙ+c7¹2±#DeaŸ“„Å©MÕM1¥<¸¶×e”8ðçP•ÖÛ3ƒÖt‹5 NAO_UäJ†èîhŸ,€žNêðfàbdXdA ¨l5&@ nrUÒ³1Œ¨g‘æ|n”å"–Ô7úb[ü„-o\Xl]©LÙ€HÜâ‹!­l…”‚‰w–š‡„S"žÂ€ZdfBÌN”E}µ\W@ÿall3Å@íÚM9‰$Œg Yd@ZœkJ,³oD† LñÄÀ*a!“e"zŠzýÆp‡!qV­8¶Ã¯4±îäÍ7Ú8KñuÈ–eb$γLÈᲞš_¬ÍAÝpݘú° 绳y d”º AçuæòrfŠÛ Rä„!í‹ ýÅ75°ÄGlìm_ðP W»¼Œ1¨©…†Ú•¬CŒ;ÏÕ¾akiW2(Î7ë%RíLž¢FMûÆR4Ö!ÎQ¶•xJ(_– ’JžU„ýªQêõÉz…br~k’Ú,«)¦âzH;4™c ß û‹D°Ãö޲&لŤQŽjš‰O¨>±Ï µ³¶¼íK-€5ÅŸä]~Ÿ>ƒ§<®ŸÉfð:¤ {X?À œï3¦*9™Ûh æ%ÝÒ §"¾b[‰À ØŠs0Êc‹I?ký1]>¼Á­·ÈKî ‰$Ëf±dÌäàg™6Ü]ZŒ èZX’’Úº­]@œÈÂÊ-~Ñ¢ÉðˆÒ¦#,"”yzÓuvä¶k\‹Ý = èYfk|"ÏrïÄüƒQ â*‰'YÕ•_Ìw’}Aa¿xìçüöô`IgÒ K@ú†¯OKÔb&:”§U-Þ °BDÖÄ Í(áO aìÔ4ë-è|·Qç$P‹†´¬ÎdÈ`™‚Ö ¾¬‘iœ (t Œ6"R=4@#VKÞ ‚‰à Ô’’%Ó™¶’*ÏÜu¶·—”hÇ90Ÿ¸ñl%ÜK‚†-Zšñ¢†>ã>‹QF•´~ðïJB­õn7;C¦šÅ@#m4kªbßÁÂUšÎ€5È‹0 ,`™II€|‘)F¸ ‰Ë_…/ƒqk[£+gI¢8²›„¦à òËù Ér2’á3ƒ\Ö¸Š;¢„ ´( ØUQ3i’eÌ5û¥A/RÌÍNÐQÆÚ·¦›ajã`õû®bÑ7BØ·QµÉ0p ùcëèùdÕ Ó’­O8ÙFe™©J‡î P€hÑ·^äßÉG3ϹM¯8°iÆÄyRœ-ßesjŸlýj¢_³s|ºðï tÀÝ8‡âŸ8®©°X<ÜË ¼Ål±¥ö9ym«V"²'C.FI„y÷¾úméÓhm3}š|Xœ¾½ÑŠßCº›"ݱã?ñ~ìÇÔ¸|Y°NÊetœíPO€Ú„—ƒ8µSx å_¡ô‚Ð38ØÈ)\€5å¾@GÞÉ^€…NTEPó<](œX,G5” –"of§aÛî»Râx½Þ»iö G˜ä)y CúΖ™$ƒaYv&,ïÌ#ªF8s‘|ÛÆ>º·È7ç7Š1r¶¶²t¦‘ *^4&ôÈö+VއxU’ÍWeV«ôd@wd €dxœƒÙX-Tàï)RbEª¬pskÎT¹5oð †·+¿rÑ$#j+3lVÀ> ƒgPÉ|mEˆjØ(u> ËU"ª£(U™–ÂHJ)ò% 7ؼÜ>§eSŸRœ²É›á`_¹¯/ %Os}BÈdMNñívGã‰|°ãÑ3–uhÐoø þ²ŒÉ²Ú4­ÆÃíˆua¥)4ªÂ®ýR« îd-V‘’rla„À:É@)9'ð‚}X$»J“;€›MHOUšj•e‹7­ŒÀAd$`¬* T»Ö±![ÁV3O+ ?2 BÄÑ’¹ˆÔ_ Ù®K•0E‰É„8à¸Ê =qÒ‹¢ªYùBÌ“[œö[:ü!1qtÀWrZÁ’`óÉ7£ì+ËC`›LÓñ!ZhÉ¢/ÏïŽä*1¯s—8ÎöÐ*&šZü‘ ø¼)‘LÓ’ ŒT…!.bâÌ`Å@òA¼¯m†ëCùÝ«¾JÑ&¥_‘Y5+òI›ÔÔÙКöbc¡’¡Iú¡yCìĶûä™Ú±¦´mú^lÙ4Öó½T¸Ë&S+FÆœ›ïß,Ø~o0ƒd9 ?Dï²=„qŠ ÜžÂÞ2Ì [ëÊÍ#Œ âkÌ*Ê%–9M¼‰ƒL M’0ñ”ŒjUÚ¥" &|kѯ/õx¯«$ÛeK^Ë&ælS%ã¢H樃'ȯ¦°DÞ•ÃRi$rXÎ \M +%QCJëçÙö¶¤U¯Ÿ—ÄÁ⪼G Ê+¥--øœìju%q0ñ Âr齃u^ô]çÝ’&“磴øôEÒàåÐ2¸d¢ä^Øtîóϲ!ˉC„¤¤Í“„–º"ÊJ·U@o¶æAz¹ÁòŤÆÌLl F᪬’£Yãÿ™C_‡M¢c Ü]ª†A±óe'“dt„I&Nyk£®êp¸Þ(…çæð Hìê>”Ý6“yXC·P†y‰§‡a£RÈ@ÁBÚ·•'䣨ì’r™©í¯âL¥Ç„’§ÿúÒÌ»*5ü¸”…£ócq_´×ÑßίB˵ç~ÙC.D8en…è!SqE¢åwR„±§°Z‘Ý×±eð~‰Á’#«•¤<êŒRZj=¼YOIRkFŠdz»l:›bD²TF<`عKÇä! 11/œ4QE+º„/~i°…òKÖMN,x>d­¨­}㬠Å`CL¶†Yì ("ƒ£-éj¶“ã ãV#Æ,J’1@› 6 –+KsåJÖ›c`AºàÊ f4¡HGáù<6€¾¡>kZí"xE%çvb¾:Ü„k- =‘z›YÌZfQxÍòHBŽ0`@ÎÅT R€:rè !CNÇÈH±o¸ö \'ˆ1‰¹bësØ@‘-<ËÑN–V_M,V³åÍ·ÈJ%±Ôö¾©¶ä¶uù3.á¿Z®1_\²Ñ!°ÎÙ$Z€)"ÎëÞŽæ¨äjÔïÚdQ~\©Àt^²ÔàV ¡ldÀL !I€ RhUÌÙjH+OÖ•[ˆÓÑÂßîÀ˜ÅR*LÜ”ª5l5 '0¹fÕ²aSóªŠÐ-*žFAKÁ«’Y䉖*:Z³’YMŠY%Šn™•`žÿ öNÐA±%³]37Ȭtü$û`Ñ£É|´¥ 6*K꣰nr¦lÞ€Œ‘û¡k9–/ÓÖDÝgÀHáVO‘Lu}³1ã˜f±âÉ¢wZý¹ ú\$~´¦| ‹¬Hí€ÊÊižÊ8š¹M¤—–¬VØQ'å:uº3¼2ÄÕA:ÚPÔ"F'—,hc¤ÒKàÕt äáBñ·GOR«¶0|Zâ¸å›”âÎÜYà<©Q2OcðÆ½±8EŸÍ²í8ô® ò‡nòôT ~ ~øA®Ê¤f´›´™=„v¨/÷Q/™:š¸Ìê#RiØ_·*V¸C'¾« $ã1ð—²¥Œ÷ÉÔ Y tH>8gÓÌÜCî¢Ý®Ø¶/VÇh[Qé =ÐØäûgõ—±#Lq¸²áIEå»úSŒüU'MlÃKʱ©LB ƒðî¼¹­úB¶6$%þü­{Lï†`{må4¢F€´Y½—ór€QI YàUhsê&a%ûE§ñu@%°•‹K–Kmq牄Ãs(—@eŸ ŒBPA•C\#[¸GÉ\¶tXx‹ÏcʺÐ)ø ¾?QæˆÓ«¹PC‰ð¦kˆm²:\âà\pÅœ{F yÿ¯ ²Ÿ¿uÉ_ ì ykÒjäG¡ûªÐz"_ÉZzÆA­yšC/š€L :ž-ÕRtÈÒ1r…ELZ¬w)B͘ŽB ³8rLRZ¯»`f×<äþ\[Äòæìw5¶%t¡°¨ö©ä¶Ó%V€vR ±¨±ÝÎÿ¾Xä36¹&XÖŽI¹À)-‰t²óÚ¤Mä“l% (D÷X|¡âþžbîwÅ`òn_L)œoÂ÷ë'Ù¥ØÕ"Ap­"¨Z à—@‘ä0ƒ®-Àý(…°•œDZ!Q#x÷Jm„ºD¥Kó¡Y£ìì*HÙ/ D‚]—©§»üŠ÷×+M&ëÅ®¼œ<R`+¹ŒÖ ¯kà2M1„¼r×ÈmæR¡ð!H¼@Úù0UKÎjåWûØò(—q#ÉôšHù=°¥ÞU8;Œç¥Ÿ©d»n£Îê R¾ãõ¢ÄF¾Á¥ÀÆdIh®³¢e—¨Ö"èŒêÕL‰ª#ÆÎs³ 8Ôà+‚ø¡p;IµrÜ3бgÔWÛšÐe¥Ä¯jÒrk¦M¥ +°¬2‘ÊóX°èIû),u]†¸}†,0`Œœ¯0`äóޤVp-X«5”…OV<ÚNp@{Z#—UëÀà6‡ÂRk— #ªKeÉÍ´,mË…s~V¦&爫´Eˆsu§òïF&Áwbµ ŒŽÓAež„7, G7¸ha53äÓ⾘Öz¶bÚžêYÜôQÄòÎUÀ´èL‘ˆ'…–øÂíÄHú³BY—oŒö X)àÅRÓõ[k¶ò»ÊÞ,€úн·‰Ö,J™–quž¬e\¥ŒïžÖŠà7~ÄkMñ½(RÝË$rD±(”Z¥JÏE¡I  V1ëÌ~kFí x†,$’G@Ô‹¤J¢_ÃÆašF¼Lú{Ž¡:HѸÊdá`ú/ÈfŸ7X"š½4Y°š$•shv H‘‚ñ§bKÂaâŽÒ•åž!ÎÄBv–•+A(Wá¤Hæ p½N+V ú-6ŒnY*qÌGÌG©töÖ¬œsÌT¤²îe¥dÔy!&ƒgüÞfKëÁXX®Çã®"©%›™ÍxEc&¾Tõë™NJˆü,’sÀ„I .ˆ rñ$jFÔz«B7©;ñ8zŠxj‹»Õ‡ßZ'P÷|Ômd+è7­ÓçÕ,‚iÿƽÛ¨ä…ù`[ÖÈÜ€L䷈Ϩö('S*gºÉ,ƒÐW¤ÀQ`ŸâdãDæñ켩úþA´k“jM&-¥Øêk„r‡“òÓP³ ±CôTú<„Ma!ƒØÔnBör»íyõPtîèùíV…l²8Z‚ñK” ‚(€)uˆfSh£HÆ9UŒTo'Õr «\'ˆÕ$³ ™m%jþ—f¯\sÀ²SQËDˆ$VLš@§àà¢ÌZçõ¤mÅVM¹¤)ý¡ceؼ¼ßT ,ʈuAkˆÓ¼8l&“®ƒÁÏ|:À\aøÑèp ® ˆžwv»S’yd`{´‡Ï¨ŠêTÞ*uª*JÏ‹D\ˆ—Ûù âİâQ™QñA3g¿ÔBIO3ÞhɺsõK¤hؾS°ÊdÈkÜÕL'aÐnåGñQf) ÉäE Ô¿^$±T­ÙED(­;ˆËxâf´zI§žˆÄS°YÍ2×ÖØ÷{Š)¶±œ#øa*Š<©D\=À‰1F•€P³Rèq²ß;€ ji¸51yÊAåõˆ§øòH‹IS³ÍÅDÑìÏ—˜Òåý À@Ih…lWøsൔæïƒéØ&é#‹€vãå1Mwot‚J¬P ™7ÂX¡ˆòþ|xñâZ>…Ñéó®YŒ䯉NôžÂ‰oÄa,aZŽ}¯•IY¤‡(Ìú¢&3ù ¥‘Ž ÀAiŽÀ ºÕî“f§´’•wv-a,V&àlVj’Gƒ”¸°O yà6Æ œðÚ/’}ìµþ9è#åãTL(R¥XºxP—y°õ‡îT‰ÖÞîÒ@Êû©94ê@ÒÌTå9Lc› Þ·4Jr• ‘>°áN MœûN—²*oB¸†Ÿ¯¼}l8 šå@^íNHŸ$àcDû­C¶K1Û¦Þº9J·#«˜ÃwÄ$%ɤ•GÖ_úøF¡A´à|dï Yæ Ÿoì$d_öåÝÓõ)–÷¸>½×r+HÀÊ}-·‚ˆ„² hÓc1ö1ž÷ì+, œRûRG£ݘےO„¹Á„sŒ§™f$.HP¤ÛÞ蜩³ËJ¬‰5­R­Ö†"x•{°®àç⢚¹S]»£¹‰‡û}üR’.ó¦V­IoÐ1mK”tlŠ´dñ ‹Š(áEÚ¢¾„ ÷@šBѰ'XÔ}@µ¹j ͪLmB}Ǽi#-YWÊ} znè’˜ÂFÀ÷šð=çkZý·uâ.ø»‚“r¾i­$رçuc·BÑœS^¼N@;øÆÛrŽ à:JS).eÝñHâbéóJ%͇P”œ«e H–de‚upu¢W ÃnUPÊpp¨%:±Ô°”ö4ü“! `ßåejU'Ü/@Û¨>À›#®“5×ð|vÁNkS.L;8оhÉ&»£_§E¿Êú¼ò-Ò¶š‡ä¾JBŸ¥®«8³ÝYºF—N)^!]P™‘EW륳Ê7v~b7,XÍ”{–܈²nV¢y ð:Ρ[û| ·o=!ú¢BÓ?ò¥”Ùæ‰¢â ‚nv^GS·c#ø¤8x–, ¯9]Ý¥NÏ€+ÄRC$¬\Á²-7èGr7|2yÜAŒÅJÈ;L0-C"ŽÎ_ÆÑJDãÓÅð©˜w*vDjƒúHt_±ÌÜH•(CJÇ0¦éìATv5ßTqÃå]¾ëÍÄú ¼\‘B ¡y™U–†>ü«xï¾¥( §G:ds‘ @AžHI˜ÃÅÖéÇÂ@ÔJ 9¹58¦¼¶1³tr›Á†îê b9Òà$µÂ ¬ùÚÀò’¨~$†2Xf6¤ì9hû[s Eב˜¬ÊŠhb6œHajûÁtlÊ ¶’' †¯ËÞÀµž ‰¨kMJÇFckSõ ÑîJxRfÀl©Ä»‹?C'¨×ƒ ØVºõë­újð=… mÚ%û‡ÅÆ8D®ì2‚[ . ÃrSZFô¥¨çÍœ´1¶³t€ºÅˆc1D¿ˆœ©®fuð‹öu{¿ 0(¤Qøà†wÑðÖîÅŸ•þB‡dA¾Ð§0‚p U‰Šl€Ø†DIâ=§Lw§ä‘`l')Êàû0\›ÙS„Zs®%$Q¹’ b/e=VŠ—™f]‡Ì&0|6“%@€"R¤zjÑR#KyyÌ}TÁ E»Ê?Ÿàó…Dõ¡s Z¤ ¸pU­f&¸^—c°ÖRCÂù4L,J ¸‹Y…-Ále›E¹KùnŸ9!ƇhƒÖ&¢x‡¨Ñì‰;Ì«@9j²c²yܽ1LM–¡äÀÅ)€v9go”=­œhî%2dàgÓ¸ 0E ”Úw®%m}«©¿LfèiŠnàõ˜u†PêmÂÈ9€×B7SZI‘£eµ¾]È,¤BÈR‘/ö6ôŠL‘2?PüÔGÄV«ü+b!è)¢IÝ"_€.b~mÖ‡P3Ó~›Jô"`A”‰'@Öâƒ@M&óßʤHÊ  ’2©’‰í~9ÊœbÚÝ/zØ‘s0X!»à "Z{Ÿ´*‹ôßNh=d{IVÏ®†?a/i•t @J °I IΆNM‰gFoÓ E¢3k¸Ü^é8ÂW¦¾¥ ¢¤ ’p1ˆ«ªð”lcïH…ñ1c_f©gé)€°9í 0+,Âdz7xp°I…öFСÔµ7ú®XåMz$Îk “Ì ¹º8Ð ’2Ö"BÔ1¢ègf˜c6|$ ßg“6Ú+ÞKRb:õ²ž}9á²Ò¨~À6)€*)“|Œn´Žd€CvE~¸Xt‰«ï'.É& ”v± ï!-³LQï‡YP¢½g¤Ìapñ¸¼s«CiLÎåMàp0‘GF®Ò¡•@mZü™?\8\&ëÊÑ=À%6U9,ÛL0ýñ Toß‚ÍOò2&]âj²dÉ9˜%azEUq3‹ŒÊà±ÛöM®ê‡ ;!ŠMI¤%"½™Ë³m„,TÔà¬Æ Ë}†cÊ=c¹µ2™Ù v…|s¶Æº:ìPQ:#k|(;¦ñ&‰¢ÇK_SS²6¥*&õ"¿$¡Ò»VŒä«#õQ.Hã-s›"EÍTºñe¶lºu>ƒ •åeéTY–ß\’2%i‹9³¦VŽßM•$)Û¦OËÕ…$A¤ÿ’\hÆI3Ö…M¡ÃkKDpY;}<ÓÁÜ s·¦×&ñýfÅÙ"*e‘Æ-žÀk’+6ɧ—,}áš`Ë↢n.Êδô¬-Á×Qr˜{DÙ“¦ó’ ƒŸn†wJÌ®F±ÓMÿ% î„ÂíIýº(Ž$âý¢+^Š«U¥zåZ®rHF®A÷Š!`\5s‰&ÁòðÕÇ·A¥ì$[só3ÏÀ ¤K@ahž÷Ke^±µ}1_Pà Çp]:êóàªb®(¸ŠHÿY¶‰ Êñ‚ܶgæEDÝßZÝJ£¤´³+ré[룺7WjÊ~³ñ¸ƒ=€5È +ç ð|YpwîK©Ý‚Ö@©ë'%•ÛUik{±U Šz ]Z€úRnR¡ÂÝÊuÜñn=9ä|¤@k|Ñë %¯á<”@b-éæñ"´¥éɬ2¹¢ÊOxpíJSÀ Èl¾ÂàËŒe¡’‹ÁiW#&)úÍŒ×c¥§ä0_ÍLšén½.›ø;KŸ,PWqk* ''ƒAË *7 1«÷©ñiwu2žnãLØdÒl§TÚl À9 `[ 0UÎaY9)HFLjwLÕ‚ÖhãìÑh¤&/5Ÿ‡åúKê#Ikâ@(fR×L{m¯[ïh,SZ½/Ã<úÜy?ar¥Èà‘ˆRüSôZ÷ÍŠß7üÖ]!$$ËÅÔÃ8Ó7‡¸ZÎÏbñ_Q¬s´˜B&rÅU ´Éº°¨–t”uñ$õ'qz(×ò;m,×o#f–B.4ðnÔÈZ3Cf©)ž5y^hò+W©(8ca©)k%á™mXª„&0a¥læIpOÙ±ƒïÃx)ÉI}%®˜¯„Žâ*DŽ»Ÿ¦;&Û˜ñ¬Š'ÄêÚß®æš gøB6xç^æÉî[«,Sô¼ –Õp>ª…œXÇ —@ÿ6¬,uCèzÔóP{““€MRÆrùÇÎí;JŽk,Ñ–º_…€*½Ü㌅v…¶7¾à%qp/>–wcIŠñíÜì,¯"bø-—Â|f%i°¯×ª–œÁiA´"XjJUy»lȪv”ì%UÚr´¨ÊId‰žV®£é0QéKt;V+fà‹ëûrÏ ìYrÎÊ‹¯>ŸbûÌðf¶ÄÛÁÀ Cšýr×J£AÖÌR¥¶î‚,JÛW„¤ØªElt5ñèE%ö ËTÀÊÔDSK&D…ºSøuﯚ©:_LR5É•ÍÐ$=MVÎÓË…œóSm[N„M‚.¼š2Û(Dk•N+0H*ÐX6£6«GºÕ'¯/ ‹ö TÍp à Èôò}A<„qÜòò+t Ø wÀͨѳ”êþ*VmLÊÿm2«šˆcŽw4Ë9dŽ;ä À¯ÔÄÁmf—«ZÏýg´ÄHÊ… Ã*25í3H¥­R›Ê2 Î"Àø$ ëñ‰Ló•’ •Pà--ÌÆñ"šӨĊ¼$:@íà(\²jßK¢Õ$ÍQaÕN¡á,%ä¹ÌÔgQw ¹-4µHxÊý@‡ (€Ë‡ 5uŽÎß1ZȆn^“x‰Zi¾kæ‚‘d‘0ç~[ ñ"U¨Li‘<[m±¹èŸ³•Æ®ë—Z€¤ª›]4ŽM"å‚è*kPS1P5r‘Ø<…×Wˆ¶0­¨Ó·„Ad?ƒÓSËûô¸àªNãØ*nxêÂÐJ‰íÉð ñW„‘l°eoíÓ´[¤Q óé®sÅŠ!J<ûZ¦Évh-•`b„ä·vÏN5Âõ­yœêñíTW›VÏ¥“L–Ê·Èc©™ cE°He0> Oj6ׯÂÏ|i´DÍ;eýÌ^}Æ Y(çöYÒÑKÖ¸áMÙâÙ£½"só0i:KVÌ‘ Ù0¸"[ -Re~L±•aŒNŠabu«ýÍ%g‘€½ m½®DjC'WSXSa’¨ÀŠ©wí7s> ù¡Kdˆp p/H¾KT¹ý9Q64W/5†GeÙpC[ئ€±¬k…!Df$DsGYMÁ*ˆ-Ô3ª )†.º¸éº ‹YÑ[¨Œ1¶dª‘°&s¶©ìHšw`—®Š†¦šÏN±†ò:—•qI8™/,c vž¥ßxw©®£~èZu…ÐnÑ”1#Á±ööØŽiùJ„Ý}Ô A·îĸ·1 #†ÄÉeBJSžB¡Ë@¸,5ÙªŽõ¨2Ö K@‡9~m™H×2Î…/¸„9NRŠƒÕ-H˜¥X¡P§ë–¹ Kè9ì¯@sÌNCöwqc­á|T‚4ñ®Éo"¹HD×m†<_‰l€7¡Y‘®™ œš › šŠ!'ùàVáï´  aÙ4m2Þ ¤I¤~Ú<‚ˆz€(¬ô£¥.ž¹ó‰…HÔ§Î5)zß[LÝýð6¸ô*íûÚlç‹|`,ø0ø$þ¨özµÄ„H;òÊK“`i"^·wœh Ë„{ÜáUkÍ`•A6 Ù±ðs@Æð&©HU ÿ›wñOýzÃd¶Œt}­6dtðÍÅX\º§^Ç=.ï_™ÛJâ_zÊe-3 i¯àY%E5õuˆÒ¬yË'¯¢ pê*d*òØÇ­S@¿yñbêÔ¶“GŒ¢LÑR_µ$ÉÎÉukóNšú²Ü|¶¿ØD6…ð3¢OÉÃüÖ+h³–Ÿ DÚWZLË¥Ï5EH¤Äß—ÑÄÌf(E_VßÉ;_Tn6cŸ`ÄÝ(3‚sÀÀ^iÁªZVâ.”bayEéž`ÑR/Ù2©0¾ÞÖ®=HõEbD!3 ½Žf1JÌLðen™Ô³½z±È¿téϥīI‹Û§eU&ñˆÊe~"¶%í”iЉŠÞšWèŠwâM‰n KöWœÅñr\>Ãe±€»©E¨–ÓAâkd¤<’{5k¸ªM©YÄ£QöR ©òr.hÀÔBC£42o)AtNZ“\n9~ר3èÂ8K EF°Én#u•˜Íͬ2;‹%ßMltô÷gY\V8–Þy`䫎Ž/}óªÁÍk[@§¿¸—£ÝÃàjá—¨=’›Y$‹‹XË’ÇÀ¬·}6%ùJ~Ê6$¸`cja¸óÏ£H30ÍC5¼Ÿ‰Ð´"r,‰Š$cËXB¡”mëBJk4m–|b™]u³I?–™x6{ÖÕ¢§ªµ;ã“Ô5ÌÚ’”+ ÷ ]Í\C¨4Q¹½VH—5Ûe<˜-< ߀1ŸÔ)€êR ÷0kÉ.ÉÔdhJr¹™}8yÜ´]T kÛE&®/vüÒ‚†LXÕYA~ p}ϧ!eS½Ö©4®…Po‹ŸÐá…B”•t@±øhŒïùŽŠÌš v­0ðC9@)£_×\K'ªÚ-ÍnÙ²t@õÀ‹†g{ÿk_‘Uv] 9ÐÌl/6˜˜ x¾˜áƒ¡ÒüEKÝ唼xƒÉã´ :Aš' ™›k(êòd£àòTÉÌ-"3Œ…©4ÓFjÚ(œt± Yƒ"ç Ä`ç:œ€¦!¦‹Z¤ Þå[`«d)1 *µÆ ¬o3hIϘÙ)%JΗ%e‘€§h Šêu‡`Ý %0€x,®¯Ìs¢˜]™ë_yR©é‚Úðáüƒ. -½K³>ÖH&«>[õqçÀt8ÛºR•+d• ¨™*… ~Mü©$•ZÂ*6ÒóÒLY„Ñ‘ñ¥’äGƒÄSõ¦²PUk?v5µÖ°ìä*€—dCÚ„x¸†–‘øÝ–Vló[ybùl‰•Ÿ*³Ë$†ÂÂæ¶2™&ж4-Àétí·ýVõ¾E?k£Èbò×uZ¥ôæx7шMËIª4²}º €º”2¸Íªø$ÅlLפ„Û`x‰á”hþ—Áäܶ·ö;M0ü³žÑŠ÷ñëð¡ƒ^L4í Z;EB@ñT¢õ0§©Ö.}¯×)Ö )32Ìx>E`ªx둞߳ÂÈjÍ{Á˜Ø ‡¹Š5Ùžf"{š&Õ‘¢z'Ó ¯ÍŠ <›Jc´HÏ5™ÿ1£±²ÌCðL­Ó ±WRì:m$¥šÓ¡éÏ[$2yFõÂEEÀÁçñ rTê™G 20ìû[V—', ~5ÛCßwò1‚êYwö•– d|ç$àùÛ¨Öög‰Öà‰¬xP¢(Y‰ 2#Î\W|ͽE!VD^"˜N"’ü&¢þÈ=æ9¤Ò¸iÊÔ‚7§%Iüé¬àP’S[²5ÔNd ÐÃHO‰Î7±n_çÄ'¦‘Ú«E\'B 5’„ñÁ“t*#Cº¦s¨ù]J9åz5‹ 0½&X1=v»l¦.q#]£E WH÷l^¤Ô¥ìgòˆ`õ<ˆ}uÏu'ðH.—ÙH¤0CŒ Ø[+Þ})à`q]g=i)n­opÝ7Ħ#4ÙHè ØX+Ë_›Ý-ÛVe<ÖàÞ–? 3â*á7n$5ÓºzBnRù ]ˆ@U¸ðU¿¤ö¹(|ƙР®Æˆ¾Îr4›¾V¥u5ùìQ@ïU´,Õ;ŒY_òeãŠjõj-äËw²tÃèCSœ» äŸhÆv) 6†¶ñ÷å¹äô.žä`wõ,›Æ‚¶N&èB&¦H’͉£s¸L«EÂN[OXDŒ8¬,ºIM¼ür€§©4´®· ¹)»Ï Ú¦*¥ðƒ80Ú¸R÷ЦˆT Ð úïlSÝ´CàÛa…”â9çk/ð…ÀÙ47ÆîñÃÒw£à¼Y>É b H9tæ¬ï(á9öµ´åÀwލù%¥0äÄ¥$‚uÊÍ9 K`‚ ú÷b‘`¤æôŠbúËL)bÔh8F¹Ä#H£è‡¥õ™Y?¢½ÄÉté‚΃µUï$Ť3Áß–á;.ê^ß^ÿŠJiŸÅ(§…%ц”ÜÀ£À¬ÚbØÜ¾Ì4Ù"…HÆdi+’%R'wä{+j(éÉRÔ’‘,Qa}{Ù†-~tâ Ò,¡9J`uL¯‚ªIð i*ojãŠß²&Ę­mI22ÅGgO‡!_ÁÿÅH޽ÀW@)ÔeÓä¼ýl¨kêÀfKã[k¾¢g@µ©€R¨©¢áïæäÂü©à½àæÒz°Žø14C ¡^P ×T†ÞsñõLq†áôð‹ÔNr»/|[-ŒZÒÂ82?+”?ÞÍ7ú¶ú píäiµS(Ò>1Ÿ,™›gŠH !d„,@g(øa¸ð ÒÙ)éº%Ë3¦Ž^á½pÑJíó¸^öM¯éªÌ ZNH£ØÃ±#ù•ÌA–ygeѶů,¡ÍÿðEÎàOað²|¡JïHc©ÄG/ëü²: ¹k…ªïÜÜé&EØs6-˜£ Š®¬xEf©£9* &@°À‡ c$྿KT/’ ¼n†ålôîŠÏRðöq¹™Ÿ!‚„bK‚û@ÀàNó›ª1EDö”µôÀÖ€!“M©¹þñQl2ûY \ª mû2B€SSëÁ×â3y‚-Û"UAÓ̲ÜXØ{ò;ÓÕk'Ú*ØM‡óa®öåU¤gŽÉÓ$=äºW¹Ï?uñv5\ê¡ÏúfŠ€F-Åà¨åŒCÅU ÊØ£7/å.Z’€?bÌh¼´cî†õ\@h «³Ž”°C 9fƒÏÄ$ƒ«u‰ƒŸ¢$%› ±ÈH`H§ÉhÕ3!BM4®­gM;ª=ôiÃ0FKücøÄ˜jÈ1’ Z#™õz.4n½Õmÿ9¸8º†…‹2”¬S}w4Ì«]§ZZߢÂ/iåx3µ3J\à1|ûÈO£meŒšx ¾-Å…> Z‘¥O†”²Æ"öÝM‰R“LGÛŠ†Ì¬‹,[‘ Dõï§F¦±B_5¨ø0ö âmbÉ*Éá:ãiM³‚K¥À]ËÆô›˜~ñÉò&ìLåòžL²ñÅ6£öjnÁ‹&{ Õ¤v$v“SݤÑë|P–žâS¹]iB zOíéˆ4u0'Ã5v6;7 ÇênE²tJÍetþ¼‚SÕR%®‰,™ë 2u0\n¥Hõ‚D>L1Р졦Ò! £aZ†0¯Á8<Œbß—(œÈï…ÏW­<¼É’BÄü¢æÆ9 ýŽ&A­‡"o‘ßàÀy€=SG,+1tE1­ží‡.1´ìCe­š ëtãä;‚²'Ÿ—ŠÕIÈ¿éøeœ\R§9ùÃÐ2 uˆ†u<aFAèû…å²8_2wÉL±šž–4Ø `ò½ ˜ ˜ ¼ÄsضùÈÏdóõ.;L^‚] @Ý‚,zƒ[qP‡` Ýw$XeÔÀ2*pUê`•ØÊø †äkæLdÓê=b8¢Ð¬‡›/.üsHá"¶Mß¡™ƒäJ笆¨Jœ /2a" i%à @ü­jþD<‹á>Ku U·0a©ÊÓgÌbµkÞC¥zŒI çÎÉÁùt8-ª#/–6XVÜh¦¸•ÍâsYøx¨Bk@»ÿé¼dåjÛÜØdè“} HÀ› š:hy´RE™5T3Ñ86Ò=AÌì8åF‰–ì_0+|Ù ­ÓÅ«Üdù¤XçztlMÇ3Ù‚|-¹„Ò:–­,ä0›‡ð+K­m‘F¶$—º4mš5$O ºˆ][ê–LŽÄæý¶e\™)A"ɾ´ê¡B¸œ 9¢«=¥/øLÐðűùœåóæÊ[”Ü’`D“¥Ð ½Õm¾fâÅó&s}“me²{ \5Q¦‰ªJI•®sš‡àÖuïÕ$oÂìÓ>È_ {~](¥ç7I®”&û $؉úÉ'ccx«9Ï$Î3|ÁÉffðë iXhcù }¹±ÌEl¸™±éFîdÙÖ­È"³f1£2/aQW»¤úR¿ì"ë8QaÔ§‚!Häå¾ò'³fObA ÛáÚ\T‚­4Ø S'³ùÊÍ«€T_’X? qÒŸÙ :ÆèUŒ<ázL_½>iS2ó;„;ú•]ÚÄÃg0¼-­…G³8R£ÏV‚I(o&ˆ2Vžö>[Xnß‹žÌ¥OðºŠÁ—# ýÊÓ®ûÐ…À“T m]ƒ¯cG¢°›rƒ3’K‚&'ëb³òž­B·‚«%¦ Ì’‚¿éê잃É8›¤b¦1£…;Y¨x-ŠfJÏ0¤ ºïʼn¹ý†q-ìºÕ,2N¸„ -“JvgEûý-w®Æ[Ѯܩ{s)äóL‡€nhžˆ“-E$šáò½›P4‡ÉYhXŒ¾hqXù<õK<ÀLO¤˜´Ð(™1côé´¥ÁvðÀõá^¸MN‡µ‹°E,ÆhÍfV;Q!É¥sZTBœ¨i™O„Pp›£“òòjÃ%1rº¨{kލQuJ†.sÑIDÉ$d™Ù¤øY#—ÑþaÅŽ­yù‚Ë3²'‡Mæ!-ÊdŒÊD!MByѲˆ6€ãœïûã…€KcŸsg ؼ„é-â¹Räö¦µe&ô:#æÃÉNn¶ÀN2ÕF“ñS=+8¸‰Æ¨¿³-»Ú*úÚ‚§Æ ^L˜*x0urÊ7GWÒbô‚¡%!‹þ~ÀyIÆš·Øm–vG‚É5rYåìbXÊu%µ..9_‰£kdñκ²ì½×*®]1Y%#[ÕMñÈÝ •Ë[y@ëð¾’b ZØ©˜aÙ_ Çð°LÂX–WÀ©îuEÄø.OÃ`O>hóÓ݈hSÀkA²³Ù Ô5Iǃj p.u™°Æ«y ¦E–ÊÃqh@eˆKˆ‹ 7k ­e’îb´ÐbÒîòh!ÀœÕÅ’aWmij¼MI;`%çÀv Ý­mfý½òðE»Å Ÿ°Ÿ\6Vºæû‰{Rµ"óQW ¸°æDU1Ä^Ád"‚B²p'þ*¯#œf¨9VSs€ðRðRœrÅ.¤ŪU9» o9‡îHd*ñ)¦+1{Š~'ÀhbŸ§äÏZKHÐ- 0Ð-u‹f(hçAÇõbÕç8ÉR£ij£‹•qEŸ¤¼åT¢&o?ëuÓÈà ~X˜ñVÕ(Qô‰'övg)F‡Oè{¢MdÏÓ‰ÕÄ<ŽpoK¥ævù(Ùò½Ñ (âVC«§y³öM é»TûÐ|çXá¬F<„Æ_µD¸Ü–KH™èC̶Mbüa7@c7 Þà‘ÀtÁ,fxÃUeG ÉãÐ="Áá\¢ §…Él A¸ ;@ŠÇ…%%Ò°øb/¤T{R7Iþª¾H:-vÁ§*žˆmÕÒì–tt ÇÔ-ÞYþzC¢+†E˜ÄÄ.®àØ}WPœ,3Ð&zÁ†Þ‡`þsðr¦ô[(|•%Y¿@¨§-z´¸Þ÷ó4KFá0[é5Æ•×r×&ãã¥v¥våqÎ0÷ª…×Í$¼oÑ‘6S)ÓØ¥"¿ï‹ÊfW[ÝFàç0'†y¡“q0I®ÛÁü±çÁßš´¸lsB ü l‹‘Àn…B5¯JåÕ,ÀrU”hV½¼*^e’‘à*…؃ÏÙÞ1u|™AÐ’A¸IåÛ¢pލ/‚e­EœdÙÒ4ŒÖìˆYVȲ(:†ûªÄjóÏ@ŽÉOè![*Àg*Pa*[ª ¶0jIB ÂZHÐðBpÕQ¶8ŸÌœ/._FiúØùUÌ¢,¡ú-5•%˵ð [£# _çÀOT-$9BÈ® …âÍ|:®i. @-KìŠÙ±;ðÖ‹oÀ+ÑÇ].¯µbA‘òoÚ7¿Åü†8¾ë#•2ÑÒî6„h©À®©@†©€p©{=d*XÒ‰ÝRÜöætĬd˜â¨[8F'¯t_ì…¡ISÉ]ºÈ²lÀbiAΡ_jRK¤ò‡KoÈ?çßW~§¢5"´’E¶¬¶¨1œ¼€zPlésû¼ðSÆA\J¬² {Æä0ßK—™ôÍ-qî„QðGÄYóŽgŒ4~p{°CÂ66Un–ði•â3ñ§åßJãx¯‚á@Ï$œOÅvg#Ö¼ê/ +˜¿ˆ€Çß5}¦pã9uÜë%ž<#ü x—Ð’sØ${‹‹‰#‡‹*…AàPµ¤¾=ÕA«À6nÄÕb˜Ã-IB© ™H˜+6AEž±eFYuL k{‹'û+Ÿ1ú,²^×å‚Z Ü–Jâ¨sb²þWd;#÷.®‘or Ó0ú\Ê_›Ž(¬Á;Ñ›µGë2ÉçvŠ”û5án˜<¢Â‡ª3·¾å0H(8¨ª"fOöœ"”BKl±£‹]©…„ÆÈ3‘¿žíÑ_ᛂÿe«9:ÛÒæã;ÛÓ2ÍçÓëÑâZÓ3Ðæì ïDwÆm÷Y¢qk›˜Lù4ÌàhìLc·{:ù²ÀØL†fÇ9ôÇ¥#/;dJUDdmZÙ:8$IÆÀ4o›t”ŠBõVqØ)˜ÁÏDNšwnP™ „B’ådBeU%ÝW(ŸÙÓµíU¯ˆ•Ãá»obGM~b<å2ùYòV-]ÒJ”|øԲ®KÒ_Ò#ªÌÍÔl±hi¬ØW8->^cJ‘¤CmËj®Â'î—nqá-ç¡N–=¶ò;ô[ðC^*3[§<ŽSÅøJR‹,Mj|~Që™_¯^ßÜN ÔŒ'wv±àaDÏ·ñåóÀÏÉ(V Q0‹9xLbBm¤þÉâB\NC”¬}ÊOÄ€â¬ágBwZîXHV`1ÙíSDJ¤ÇêRãšta×I0ŸÅ°\ÿÄ÷á$Ú Õ¨“¯,–Wò•å+©åk%Å‹k&ßÇcøÎÝjÇÎË»Ð}†qGÓê1,»×¤[LÏkÔÂÇ3É­iÓŒo0ì߇([hmâƒÈ,iòÐ÷m„,l†U\´ \޲>¿¶/7Bkܽ~Ó-àjoÜùHfì-¾§æËy/Æ»×|ÙP®'å¾YP@×ífºü®6¯„½ˆ&-€—ßxÞ²6ð\Zf¢kˆŒoÜÕ’ûítÜš Ί/ñÏafïlñ½Åwh=n­„Ó­•ŸN·s®F¿Ô߆O²ã¹÷Çž{`Û˜rv|¹$r­¦ œÌšJÙß»¥&Ë•õX…ézüà0z–ÍðÚ KL8KA—;ÓjŠ©çp•¦ ö¢Ò•7ÅB®9ÇB6ÖŠu{-ô‹E ø‘shN’kîÏ”}8™²*€]œ²š×5e è ç°}¹þ ‘ÀmÂïQŠ~_s"³ôsûï7Ó¯fÆÓ‘Â[ç+q]@À8i•eôª©)^ÇŸËh»£F÷í¹Ð"jmý¨ïÞª„‰®²:À3jÉ'‹*ƽVë~è~õlìôÀÚLjæEõ¡±ƒ»i,PCZm0qÝl¢=ï4…‰·Åe1ˆÙÆ•ä /×1è…sþP>T6sƒ2BÒ{ºÝyw7ïM^ ¹ÐW\¿¯ÎB'ªz1?æïô±=¹•‡ è•HÓÃ#9ȵûÐõÑýýZÑ3² 'Ù·ÈZŨD8¸ºÎäš…pê¼…^ÙuR‰FwÕLV'ì¨üxög &ìC†À×"F¡Îûý›k¼oÿR‘j‡ƒÓšº~Ŧ r•=\<Ñî’ UBJú˜Ø;“üØŠEZYÒ"^líçwúÕÖ[ÌöÍœyÒÝ}I(÷WÑä/¦À~(»QM౨Te7üȃ“ÎÝ÷hI^×IYûPyÈ&E(k¿Py>|Á¾YòDçl68òýžÉéœèÖöÈÖ¥šœÞ ±¡™½Ø8a ‡÷_ôŠ.4¤íe^T6k;·|ž–/ÂÃ"VЇ‹—í  “ÖTåÁ@@ŠhJ¥3·"ž¢ûœ³ò•’WÀkÑœŸ¦{Q`À‹ >übøO|éV¯‘«/›HkꃒÚKÔ^.â¿îWÂÞhUZòÑ¿³M>ÍéðÿϽ \£lÿ¥Èz†ïíG#½KžÛJ<o¥*«GUÞÑl†>¥I&.(‡û&Û£µö i²µ˜÷žTóVÑ9pÃöpá¹Ê¤ê W64¼ln×Û`Öý$N°%R¬­ŸáaXK%U.`>ì—èw®r ´±6~öö¶v“³_«°yX¾léæaù¢Ýµú“LX…'«aûAòÙjúk/ŽÖý)±%nÐÛC eëï[¯ýò‘¬ 1œýì<ñ°wœs,¢kgß­Ùµ•ñ“Gcb€ÍñÑÊŠ·í¼õ²rÜæ^p>BÖ£iyÇšæ6±}ÀEºs ™<Ñ¹Ž¼(ãÔw¸$~•¨8òÄ™Dc¹ž ±ZßZþ¿&mï³J èó|” o4Àqðu» ¨-à8š°ÎÖÑ>×ûæÓ-XìGp6ã)Ÿ¼®†ãŠ ó}=ïÖi+\AŽ® Þmñðn#p­¾Ös}K)l%?”CÌBŽ$ŽÖ_éE’Yecöe²€;Z;P Îg·`ufQì‹4^–u\tU}H„;¡yÉ—|é ôÄžÀ)”±ôšFz­@Õh#¹rFëoÝ×õSn²ç±ß!­BZºÜ×XRbätÏžÚZ9»Ðø¹=G®—Ýêcv)µŒüª¹bm€–h#?³=èÓÞ;ÉÑeÂùÈÛ¸˜1¡tK ¸»8g^F%’·oÞ6¸ŸrØœ @\Òåà\WlÂÑFqŶ’0g¡­«=2ô‹w"€º²†ß¼“uH¯Ý9jÿà8+?b–$Fµ~¨M»h£ÆgÈz û?öøhééÅÅk‰ªq«ÿz÷èœXaÙex`m4©¬{÷‚zI(kÀæhCßkpˆÖåi‰¾0«HÃÏBúEC)퇗.CÝÐÔÕF¿-bP?Rís—ÚÀ×èbÜxÜ0X£ÛÄyÁ»Dƒ‡»oR…Gí±^FŒ U–ƒ @3+q'8ß1d GÃnâˆ/ÙñÚÀ¼”'[t÷ÛÃfÍàáZ¤>׃³î“Rû10@uÇ|8#÷¶p%ÑHÆ|„ 3A<ßšà•Æ|Tw,Y[àhPÛЀ8ÚXåG/¬UV5œ?ª{;ZlâÏ'ÜÅÆ9L¿žÞ!´Iååµ#Í–œ›³”Çd-(FÀÁÀh‰3xÇ¡G¤"¥žÙL¡µH¨w\f¨PÜ»×ý¿h³¹œ Ô‹6›kB4KpjÌËtÄ܆o÷1­¯Õo?hø°|ö'•’F&U›áü\vF»e±Êr³‡C´ÕïÛ³€‹6Gôr\a+ì%ÚõåÌÈh3ØÌ$ú«°.>µ\©¶ ÀIó͇0öË™'Õœ:bwÑjœo+\ó‡ÛmO’~ a´9]$oòÛx†¨†QuÎÇ…Ç›wüø³ @±Àá!(•UÅÅóÓ'ËYZ²úI-×=tºÛ¤Œ„ì¶W³¶EŠlé)^¶ÕðîÌ?í0R/¤GZzB'Î;I“v4º†ø­ÚØnY¤wÛÅÑFñ5$‰Iæ±”‚‡ûzÛ„Õ%ÛëÇ•œ²-X×VºvtÐþ¶%JÏblˆ!Hym+=¬òY¹ÖÖz•å åöñkFºt[ùaÅ l p³Âg¾Aî.ié«jïXêåþ›æäÚ&p•¸¬|ð»)®õn„÷\ñô‰„w±„W¼ŒgÈR$¬-µUž¥Œ‰sàR’E[¨ÂVi°ÈE[ÊP8Ý8© …ÄÒÙRCœ¶´„Ì0ñÄ¥õ{¯ËaC;oX÷©ë®zégåážHßi«ÅøAõYÍ'Ãþˆò„_ùÖ<ÊñˆõbzZ‡WzU–É/5‚Å â§²ºtšÎêùíº.Á‹ÁÕ - ªÕêõË‚fˆâd«¿ÚÀòZ"jx½‹:ƵgúQ£J—ö°8¼."!)@ƒhk<†šÅløÆ5|öžð:®1î]yÁ¾’שíãÆ£ ¤ƒÈ[¾hHšl‹knRt@þk[$-QDÁ„× k³úK½~B[×8ÝAÑg¾OÑ× Ñ;æj_˜vsÑcqb—3}@8´µ^96ŒWU¬k?Ù À ÎaÄÞŽ0v¹ãnCXÕ§IlA\\;=³¡.ÒŽA°m±43'†Žøû÷Ý]°[\м¨Y/â Y\»möQ‹”ÅÕ—$‡¶Ý-@¹r‡IlÓÊÂÚ¾L\h©Í× ¢¡íäf @œƒ÷DŒ¤a.F ­"v?èàÎ.vm*‚ÉÅ.¤ž“bׂº¶³‹] ú̾<åÆÑË‘ÀXF”Ö“Ê¡¶/Xv„>7†iÓd çÐâeÐùЂ‹ØjâåécKÔs¼|áÉý¾ü¦w9¬AÈÏ<+€§h;Lc43ÿŒ¦l+"÷v}M‡M_¯üHàŠÛ>´•Řü¸ëíbÕh¿éŽÂN®*’†¹ÛÏ€ÍÝê/ìK[òA%˜-Œ²Œ¨ÙA#*³š‚mМ†@<Пz÷J)³üþr5œƒSZº}/Æ7ù]"“½paö¡éãTÆÂ9г™Àä†äLLcSNRs)³ŠÅêû†l_Z™þ¸»kq„šF´ µâ;4Œ¹¿5R³FÊÊG{&%ná-íauÎìf" =4䃟³åÒ0ü­6·êŒ 4»œú\‚-™É [ ÀÎ!¢/U™›ú€õÿÎÁØì\°•߯ץíŠ4ÞfbÌ]C’Ò3`M[4“ÍÉ[ìS¸.7‰˜ÚÀÐpç½C\®É9â⮼Ãà )óÝïµ{˜+Í"yoÍCäiN]i÷_ zrvŸnÓTLÂ9<û èFÊg9=9gQžH&î<³§tK<ç+Ò•Ó¼¯×I艉èû§áR\gü©§œŸö2”‘ßß!€vä÷Dsuù´‡YôtÅ43hßÝ¡=åùJD CujÓ+‰æí£”q(éî5Ýob8?•ÿÞ[x«Òž·*x‰ÒŸ}9—{„)‡Š\ÙÐSùé™É¥§úCì?—cÚ+öq'Hœ{€ ç, 0 =9Ø¢é!*ŒpŒ/çPÜR>„µ «½¸hOuù¡Cª±Ñ…¸¾¹à33¯Œ¸I±©Ý»Yí1D!u=1GþÕ\¨éXœ—„Û¿dˆ€FžšÏÒ?·çó{wSgdC'ÊA"LC/n%³e<€c콦?ìÒ!¢› A窕Ó#—#Ф§«E0’ËõñŠk'³Ÿß]‚P)ú5}öÄ(Èôš:%šöüÆÃ»›[%?A|ÐGjOL¦¡ÜÐЄÐÉ`&®3”%IÓ3;6R¤`p\>‚›zФN´+É“ÁPݸžäúéã4yÒe‡I§d‰¥ÅDMO1êÈßïéIÞpCôg¯V즣ølpCô´º÷jQ+JñT\©3„hˆ€òNl#;z¢>bdÂ9cɸ#{â"Ø\°¹Hй/w¦pˆb4ñ­§­Bã¡NEÉžHŒwXgë~c”P#§g¢.NÖÐó«PMƈ”7ßcE,8±5v@ ôœ'%•Dÿ}Ç×wEùH8Ä‚p°õ–•s f¨Ó,lùºß³ù¥xcÿôcuàœƒ÷{W7#t x䊲žû‘È_Þ|㼂sjAÏÅb·:pz¶ðæ$ìž-¼›rc>¬H¤!9¡«Цܢ>j0ȹ\œÑZBiu£X±Ë»¥M{ó-î º+öV‹–OþÜ1óânî,PÐ=ÇQpwA¶DàCí@è¹ÉLWâùáIM½¨]lnÎ5 mö¬=¿y3õâs Íp\‘+¦v‡fÙ#ÐóPvëì‹óÙc0QÕ<÷ŸùFÝ!“ä7m›ávŽBrçÃ;-G­˜spÉLBiÉ EFɯGáͧË2„€b÷,ge‚MçaŠt#ùà™Ã•>Vȹ„O`ô<žÍ1Üy—ÆÍ³iÀ=ç" YG™[ͳu2ѢϰIï M cÈzÓvÞäOãbPŸ²›KØBÈN€=¯˜ê‰‘ó¨er‹ÕtA ¸ÖÝz¤ ÙƒœŸ¥"AþÙÍ=¯‡.2‚IÌŒ]b‘å¶ÃÒÐsÆèÑôÙtB¼šQÏ;ÖrÐdÐ1гp‡ÌÂ;Ö q¾‡æÇÌì p¸Qª çkwÞB{•ån[«q¦XcèÝ$sC_Ü«°—äÜ·Èw7ÌKvÓg5˜Ë¹Š™GˆÒì‘U*ÖäϰÀÎP€ËçB­A‡á½<>—ðHž†äÿü>\ÚBÜm€Ar@/´l¨µ6ÇäSÛ±aW)Wì²èŠáuF=žâþÚN³ÍÞ1L¨Ó`QƦ»Z žEN]Šòõ{qL—xün»òN/¶²Ž|þnëÍÌ——-ºH S™f"ù[Ñ\ñpAÁ½Ä~4@ž7Ú½×  K¨smý÷W4p@— λ׌u _êo/Íó:'zy·1ÅKgèWi¸Â´úÏ\¶.ÓV‡Ùózy£–%”T£F \ç3ÊZñŸQdð„ž³bãÙá·sQ®ô°0³é`<㜠ðÌC|4%£|©ŽÖK(·¼Ä°u¿õàÁI8mZ¶khŽêÎTvWø¹½$á‚IÐYPµ ™)($EÀ1ÇAùŒKNEM0™Óˆ§½qº97ŸêO—ÎëÉïb>=—²%/«!V©ö<pó¥Ý‘{ÜË/Öá‚RUŸwó ¼'øB.ƒ7õJ³(-´L_Îà"–_„yn±Y“Ê kúz•Ö-ÞѾïtDª ¯*/÷:²i•³ßÛÞS6Þpw[În±28Ýà}Èœìȶ?‡É‡*áj›~PÆ­Úw@ ƒ´ @€G¿¸a7è^gö ÇÓwdþwËüïõt«òRH9ÅYMÔ•þ"1–r ¾£ýLLègÕ ñœ{Üûfý ¯æ›ã3fùœã& AG:d4À9 ãwüŸtßÑÃåŽî̲hÝs)zT|áµ „Ù÷ZÞ8y j[nШå& "’ÖâzúBêÎé%ªÂMzÀD—šÉ@ ß ÔŽ,üsŽf2’J0ýsÀW1“Uj­ØA{­/¼¹QüÝRÆŸn‹7B9z Kk–Ö°”5ÁqʘU›•+¦ŠÜ°ztr¯„“k?M¶ªK&~ðøD…þ®%h.‡$<Ò¦3»$ñÏ÷úž%j“·±> #%–2fMåS¢î;NdêˆÂïHÎïõvîGvpdÜ¢u¸=7=º&@z±—QlËÒþ?c4¡‘Ž·Ž„áé'ç,¹5ÒOºat Ìd¶ä=,ã1‡¥ó3V4-f„Íé•%{#Y×É·ÛH{>SÊsô5¸9Â*&i %^›âôµ,^¨³ €ÎDø XçÍB,¤(Ë:×)ßfs £# *[Ý Í$Šnéþ]õ®µ^×x䪺ØÈÍß+©Ä2‡eÇÒë–òÏ' þe1 ×!rUæïïÌ0ôëS®’¼ÿˆÖ#ÉÕˆw!žr©ës°ç/䨺;¿ùì­§©®7e—.jXâ?)xWS 5„Éá/¢tzÁ^`¿µPeÿ)€‰³"Ô*áu¤àe½¥×éHËúl÷@˜µ ½åg8põƒê³ÂuËûïb°ûˆìÈð? do‚º¸€stÑOütE$÷VògÏaœãzÃm/¡ì!t±/´‡¿tÀœÃx(ŸÊ"­\aŸ÷›ªùœyÿ¢,rÿÏ*›Ž #ãœ"sªAoÕMN•­¡ôÒp“C·Ì­çÊzò|ËÞ¸œ"õeÓjTCZf¸[(Ù‹§½Câfo û˜l˜Åƒ¢»µÐ4æ _ ) #Ñ÷(HÌv½O¯xKÿþ8óßÛi¶¯àd§’È¨ï–æÙ…Ô~'±¼þÛJl³Úø}{ëš²J§Gú‘E@Ù©‰a Ð¥…€[zÎÒ0.Þ›ƒËtªií ó0?ªM2Áê2µñNùþ½°Êö7©rK;W‘.·.[\¯b Ç9÷&‹_‘Rm»—¶é½·$sÎu C<¿?Î6à¹ŸÃæAÓm¤kP‡Î|šÙ삃èLÿÄI¦êp%±>‰ƒ=RùyéùþºWxmÛú¹%&Dß)ÄI{‹…ž‡ÅU¢÷²Òý#•äF  7¯ëVŠŽ í•űÀ'¹’bBz Õ…<êÿ(8õdË—aX½;’Œˆ‹+Øß.9¡Côï;&ÑáĤw÷ð÷.í{ä”û =—pWÒpz¿7`țφcé«£E¹˜ð0i¤¥R{nábX¾G"²;‡ÐC€¿úÓ¾ºz'8Xs±„ ú‘eÖa;ì\z‰%HÛクZ€ýÑ-­ŸìFˆîqd4@]ÚTï’’| ®A ’ÁÒ–ØÚ<„ª#¹¿÷š£Ûè•W-'àÌ-]!·¿3ÿy q«U¿3þ¨Q2•~¶vïˇ0…¤þ;è¬÷æØ.å…š{ÚÈ­šGV)UÍžÁ¼—¼ ÿPiEû<¸ @Pˆ×åϼä³châ¡ßgH'zNs™Ä]¾Yú}¸¹¬‹A×Íyô‚_®+ l¸,¨ðÜôsÑæš&”¸žâøì”ÿÖx–?å/å2êÜ"Åÿh‚ À9lœÀ[’ú‘y…“ºE7Ȉ¹b2}Ø"˜qEÕáÒ>œáðÒnÉüº§òÔ¨ý‡<…„ÿspR*æ?qSVä|Ú넹¹=Ö£¥·=ô±É\WžÀKƒ» …gfê´GM ©n.37cì;ÈÚ#+ÉOƒ.3g»þ}4ƒ¶ÿ -í9}xÕîשªÚ‡>ìPùþç );èµÉh§È©#¯þ¨^§ F 3_ÅŠºEsÝऺÔÀ ØÑÇÛPÛã½-ä‹GÁÌ5"­‰„÷’¸˜A}ArÐa^×CEú})þÝV*?¢‘V¾’O¯, ¶:Ü|&C)8m]æAìÄ[Îoú˜OHZgFþŒ²!M{6mÄ?—µÐØÏ‡‡¹ü},Þë Þ2͂ €E³M–Q6€²ÔX†„õ®•Ý)Kx¡å˜,½s ˜ ZÉ⇠R ùy×$ùGªQõ’ú†Å‡ù}”ìíñ ‰l › FÙ/FÜ% ¬OWxÎÇüu€ªaØ»$‡•æÀŽÔþ>ßfõ­P¶@4sŸéž•Žlÿs˜f¿rÇ¿ÑäÐv$Æñ‡ka&MnëT˧F™Ñ6•b)ÎàË÷1M‡‰¹Ïü† W¯jüm~¾•ÚÂ:ô?bÔP ë0ÌJ£$àœ¥¹ýç³[1€žÐg vÉ3R½h{éóÊWÔ¯E_ì¹ðýÚW@èHá·±-E‚Åt_QT®‡_V%äÔ÷YÝâ €>Ãö%Ñ«o”4sLá¸èò“‡Å¨Sî3¨ )ûç@+t·Ž„ÔŽ’¸Gd ²ËÝ39díÕ׳«)}râ‚ÿôòº¦øËƒÿ¤õa[b@óöØKaðO8k˜Ig'_fjÿGÒèäz%jYT@—|¹‹á=³ñŠËŹçì—¿ÁlT%øª¤9D0²üûÉgëgnŠ9ʇtaB'EFB~Ÿ¯ %hn½9þÁY§@…Ui/ÿdcv åC66\‘“+ünÎV¬kUµ#$â9)æ&›ŸN §ˆ#ž/ëÑõãÑͼµÏ_‘»â #mwê®CB}ŸëÞdÏ*FÂ|)K`›D¾BôÑ’°ÌE=P³ç@"Nò6ÃiƒÜÝó=œ6ôˆÏÀŽa*Ô¸0REþáU‘5#I§mÌȾq'á;¶Éæ!¶Ýæó£àp?ôu%ÉR„y S:’âÏ¡pÀë8WK‹dyäR$Y¡HPݹ=æ¿– SÕ¸þ2ôªÓ†¢›¸, è@è+LY@ èë#1³„àœ BÉăìcIó}€ôEŸGD…!e¾kÆ?ŸB^“? fHû¿-Mè À%ÁT|CÝ鯸¾”Žøú ùh)¹%=3%E>d•E›RÕÞ±…K¢ ö¦rÓÝ·ê¯Â¦ºÕ$² snVÄ9¯jáÓ7–ˆÂŽd~ º$MŒ"HþgøÓýbàG«EÌâ|%!yÅC«½-À›#¹›] :Ζ!àtÌZ屈nm4]°0_o<±WîhqÎW<±W·S>ú@pè‹ïл8Ô`}>ßÐG),'©Îî0£Äp Ðע̸K=•ƒ-‡«éH½ï–ÿo©Å7nÒr ôx]°Ó4n5·Äk(Gpvê]k•{Èc>V 1 K`ÌíêbÈíZØ+ñs\Œ$}nçƒIûLf|‹•èõ›F‚E:Ïy‚ÁíŒÍP„¬ôcºñW¤/·ñÒí%¿;]ÎScޝ‰ïWª?E×ø½oZp¯!#ÙaV«’]÷’ŽqíÈýÿU‘ivýÙˆ~ý¼E]‹Ó«÷Ür퉢.R÷;Të耳›™ØEqÌ`¸hÐëV}Ú&vv¦ÍõwmÆ{„Ù™5ñ »CN|¿ÒHh} _ß7Uâztóª‚ÆP‰ùÃŒm®_øÂ>d£N•c3ÖS¦„Á%l/×°ƒiìaFsŽÞpzß¡ótà œƒ¤Òû]",¦<ð”ÐÝl1EÀG§š¸£ƒ¯ ïMçŠÇwºlö§éMÞ‚ 2Q¬N¬•ý] n™Í*§`<̺Wö€ƒsâõ3^z sãKdŠhf‹ß糥船F«·èCÃNoú@€ŽìÿspÑû}?€e:VŠñºn@±NwËVí ­ô[äðwOÚÝ¥ÝÝø=¤]f…ߢ `0ºq(Ù«ðÄ‹*ËÀÜü‹çʰíWÉ‘Ð'‰HaÚþ‡Ê P€Ÿv¤ý[½K‚ÖöÓÇ$æiQ ö/Âv—ÏŠå>Qa$sß\vžˆ÷Y–²Óô›Ëv~ÿkç¡'ŽŠÊ·¤1²À膠ÂħÑp}k\dMáSz-,Íið‡ø]ðú–úŸ|(¿}™_Ð+²LÂLÌÏû5šS}Ó ‚½Û£ºý‘ÍÛHXž°´Úp^¬«·ˆ³ÜLñ}SÑá¯)¹¨oNæaWç,í@8 FŠx«‘¨A‰"ßÎu F £¬Ç—Ýg¤paÁÂ5ò>‘"~€q ýY~#]ÁÏK¢Þžå+zý@Þûõ&è¡âòaˆFzT½€sÀDŸÎò€1Ë(?žÅ'‰¹_ {P–Iž9ù#]8G ¥«KÓ5Pnc¤ò8æ%&G¬8›½*· C+Î9·Ùë‚·fÌÁÂxV°ð_Ãùl,|À1R |ޑܧÏW¥SÆt:KH{ ¡[—ƒ.óñZ,ãÑÏ¢×§«=\g„³ùp'`|xª€vÑ‘ZüŠ.Në;è@JÊ9L1‡T »Ûkë”ÅC;Øc³?·bä˜N3€0€060’¤Ó4ÁZbÔbÿtÜÐf0<ŒÔïÉÖ%Zßw¤þa½h&Ø  tܽìèåÈ&ïµòÊ“šeùp#- é‰l8‡að€Pøp|y^°R¬à †ɳj¨=s;Ñê|E†Ð®G’à±€Ïadi¿îçEï–«ÃçHŒ~ŽDÖ$x¾ÀF"ó@nýHÜŠ;ÀÉÓH«>έI¨lt³=CЉsP.qn¤»Æ¦=ï‚W+¤ÓnIÀ¾â°_kÌH$Û—Fâ\\gÚ•m‰^ìfÈ.‰š ÖZÀH{ùS¥Õ+(œÐ`1û ¾`™`d‹~ÆôŸ‹ÇFå¢#¹ý”‹Î•Z•çG>ø€ßæ‡Ü3€ QJ#K O°öÈW´Ò™ês׉®É 9ò“ÐI¹häì( #Kù¼•(ù’Çî’ßÈù5œO†¯õ؃?l?âùZÀÈåeŸÆ8Ñ«+_2Ï+ Àœz9ˆN1àœà¡slÀ³³YÕÐV#;ûá œï?#„®Œ&²/Q¥2ôG®?dÊ‘Iw%x Ïg쇚vÜF~é2Îaš\3X02WT]bŸÉcc»z Qá…@ͳKžr) ˆçùF«nÜaˆ ùËÊ Ð=2UC÷mÊ[4LJ‹h0faˆ(¼€ñ‚H½FƒAfù)0Ã2×àžÈìÈ-9™ëŠÕÔÍæ72×m÷Êg1ð±AØïœcgyøÆÙù|¿Ê|îò8‚F¾#£ïH¹³û€‚}@p(´,C#"žõ7{¹—h ­ä'PíÜŽÞÏÂ;ËCÍCçlu!å®±!¿}”Íð$È!›Ã¯Ýo×ðàCF;J<#»‘bH`äõSc@ìœ%¢Â¤çëªÀù Œn‘á1¤îc3†Õ ƒYç#úO¬g¢“@ùƒún¼©ïÚ°°¹¹k•úrê« Æœ0þh@Té`‰ Ÿ„¼€‘Ãц[G¹RþYÿ ?°ýB”"…RJ< ¯‡~Jw·¡’>Úã“o¹ù{ơⰾ,|ȱ-ê÷Âq…á&,FñBg4)ß2ðÎÁø6K-ÒÁµþŸS¨s$–•¹…?-ž¹etÔŒ[¾–¢Yˆ£‚VøøîF¡üqd@•Ëz~A Ölz†Û(¯m ¾¼sÎ[íÈþж6°üÎ!̬èÇ¥³!ñÑ3xÛ‡ cÞ(.†ñë2€ÌºÊ^êN¹<9“AœJð-ò¹€T…™÷ÛzÅòšCÀ °Îa¹NzÇUA(ŽRÃ/á€ÙyÀ6ƒkÞ¤?U»àý¹Ã› )›C¾Þ÷_è/iüVpÀk®Íù“,Ž´9s=J mä<޲cSC6 ‘&7J$PÐî~“>¾Ïv"$°".î–‘Š„ 퉔 j|à÷ÝÂ$£¾Ë”Ÿ°ÕQYâÃíðcáGãSàƽFŒ!ŽúÖÆÓŽšª €œhº«@@&€èy7’;ÜĘQ=X€&«>ƒáH~RÄù@,Õ­iu2F€ÈÊYÅMèà¨X›V@Â%8Ïeqë$0°SÎ".²GeyšÅ+)âæ`Ôℇå…Õ%‹™'­×7•Ëì5úÀ ¢îù ¢ÖWiTéQiõXµ|Q_4îYiðßþ€™UÓ_`†Á¨ç P6.‡`ä4ùÐU0è_íéS.4ZĨ:Í€¹óǹ²Cx(gó9Ѭá¢cõÚ0ªc©ˆá«¾ D,/Â<ª'{2ØàÓœ‡ šsxËõ*í õ†ÂB ]ÓÜ'Á £rº&£íc-Œì†¯ Xçláêj¼Â+€“õ£ˆs@Y1ÇþGˆf5êµZÛö=&c!Äu®lϨ@õ*T^,KšŒjä²A3;¨ÌÀˆŒúF¢hf$b ¬ñŽ:_²¬îáÉ–¶‹G²¼ƒñ*sD¯ ³»÷’…WS©ì”FÄ©K(|À¨kD{x Ýè×ÎZ¯8…±'ÐDø _¢VÏÃa Ã5,0ê®þÆh| m¬™p¾W0jÒÏ Ú¹9'"aìÏ€`¸ZúE0Ô9KãO¿s(t¦`áüikÉ=àF@ ˆ€U"Ç 3 ­¿~oì¬#i}EƒØ}>mwð]T{ˤ Fû|rÓ×#j)–S8†Byª½[æ…o>‰ìýÑ+æë‹˜Ÿ2òñGcHôù¬©r>g3dzÕ<$z4Žöìæh‘¦T_ß¹\'3“ÝŽ4bü~ÀM>=èS89’<=Œ\}÷õjïT1›QŽ| ½iÀv{’nǾÁ²œw Šé­†*¾ð–Á¬ÿzÕñÎÜçh¬’PFkIÒsÛº¼À‡Ûzuà$ÉÏß냊SÙÚò¼õ$4`£:*¥H€6(:=eáÌrâúå^HB¤œ7á¢H’©¾åò0Fså†jFiº Q·7²v 2÷¤—àc­›í© —* P®­0‚¡‡|Ìa@].õ\¶ˆš_>7tÃç÷óäOXn°èr8Í8”;~Ph6girm*è =bªÄxç ü§‚sÀ0€upN`Â&éilÑ Ü@ F £9#‰öÅ;Xr<²9¹B£×hÜ+V(¸B[—œQ%Áßæºþˆª€8‡á%ž?¡IŒjI ~”ZbÀ«æ©±Gû}Âæ¡¸y V»È€s¶ºŽRî°èü:hk=©ö~$‰Û¼àÑö.Î.Æ" m@ äñ;ˆEÈåýM¾ƒ¶%wüþÕ6ÐŽ¢·ÐÁÁ`]iå®@Q—“Yâ,=.k0bÑÊW±,Ý•w`pÝ5¯ó± ú’ü®£º_SäeÈÁj×6Àè= $©„æ"1j] tŠVaàŒT³mh¹ª—_I@3=Lkt¸÷’Fƒm Œ™ì€óô°¼¢qE•@i‡ÝSô蟱Ð=:¡mÄÖÓÚ&¯ w̦¶ö_ØvˆApÛvZ¤ÓH$ä³@Ä–Ó«—^zÄ–snå @9 üÑÙ·À¦ÝcFÛ•Î8z³¨í.¨{ÇúõáN Áè|Z-îâéýò8tÉå'jÀ}?Ü:µÑF'‰8Ðí^Í}býáÕÁBFïCU.®Ú~˜õáL€èxÝ^|R”3¸ÇGï‚÷!DÂ\Ñņ†÷:Ÿ]p¤H_Àyl Jb7Ü㊻pa« Ñ)Ä< qŠ¡C}Fû`D¼Î¨¢Öî€ò)~ à œƒT™`9”8Ü™,th }þÓÄÒ¹ßM,pšŒNÁ¯[ èØ$±¼ÝÁG¿ê 0º:\’b·t«Ö€K’BßçºÔ!‰‡ëÕ°‰.AZÒ_þ ¾ttÞ@¢RZg>ÍÑwPÁ«|-À«!x¯CDDÐèî¼€ #‚)k¥²Óz²ªÚ3 $Šr²#á]jA2ÿ/Ÿ´z}Ø Ôv6îR]>öyKqæ H„ÝfPYl[ ´ë,v…“‘޲Ķ1ò+#Œf­7ȶ‰ÐVWÝ™1ÊG/7Î]V¥yc°í¸Ú<0¢D8ŸÈŒµ Œr%ÇÚáLZsSÞ#TØ7švL0ŒZNÜeaPY 0eŒJk¯}c Xà–b}3F¥ ”Î9yÑSå ¯tÝ1k϶׺ڗW¹Äj<1ž<ˆÀqu€ƒCwûˆ …VzŒÀ_€µ­_2*ÆðLOCjüö8½1ú+^Æú‡+3c\K³ÕÈP° (§çà"Æè.òa`Œþ"{à( ƒÀ˜ÂLj¨T ÕŽñ?€ã(»¶O¨´Ë h€1FL µÕ£¡€*ðSh¬:æb ü I³³7ä[7™Ñø,ÝL‰hHñ¸ÂlYÌ_Ô^À0c ’‡a ˜ÏlL.€Ãi‘ˆL½.³®ê½'%´f¬p‹@¬5òÍÚ»‡Öøuš½@ö à 8Q—4³Ï0%ÆIŒý ©Sä]$å¦àÓ‹APÄã i| ÂÎŽ±Ì¼AßåØ2±‹MäOz+Y22cDEgÚcÞœÖ$ïe.ìO½n•qd¿ø¬Û8fò•ìaoY žö€ ó¥©(1<`@^(PC$ÿ’Ýe¾ Mc†]€áëÆ¢ÐÔˆ 0`€:Ñ]*€âvx ÀÎ1šÌ¨§‘#š¡Pm=Ò(ÎxFø‰Ñ»úüLÐöצ¤s fˆpÕó£5 CP`0,М ˆ½riˆQÖ-êÛïô ” 1¯ªœÌa 8ˆÛU¾P~w}pc†%Mré®Q®V•Gg›³µLvÿ"µjQÜ߇•Œ€³½CÖ4· üOƒyü40Ífú‹¢NAQŽ…íBÙÖÀ˜aVE Œ—Ö°-ñLçÒz'y ÀœÃ½ñ)ªY‚þÆ µy$ûloÕyÍúÒoÖ4fž®ïvý࢞5d0À€Ç`Æ 3 J­?ËÝMx ðù¦É[hÌ€ú¨ù„K´Ã”¯CõÓÛKô'*ÙPôSp’Ãù¦¶‘‹ ”µßÇ|2ú Îa¸ùƒ×ÉjÔ+oA‹i3CXQ@ªôú&wÞ\±v "ÌY0æzˆ<Ýo¢ ŸÆ'xјMÁ‰ 0™Ž¹Âü3I´—Åí(ºÃ°8†¦… [¢+Ê ÉGnQ+>Í ¼¥ÝoJl“; i#€Ó iR`&PÞÇ$áqÍ•4ãª%&¦Ë¤NAy%o?QZŒö`»KÙåÄÇ„C#’ÖlO4Øøˆ@ÔÀXéju ˜‘µJ“À§´DÙqyÞçÀ€KK]‚>¥#˜dÎ…íÒÑÊÝíE+[Ô©È9+GÔ)RGÀ \ÍxWA‡4Š«( åᦲÑʳÑDZa†«˜4´ …0€œƒsS„uÜÒ>¤#’Ò|ÑòAº·çþOþ^Ÿ…Tû±ÄûN,’ò–Z¿¸xîÿgõ!J§ÊW€ëA_‹CN°©±Š…}#åÿ¶ÉG×2ùhý/ZCCéŸ_í'YÒß)±­7Šç0L#½pÑ ‰?Î4»‡ý %}IàÒÑY’ ë2ã«?b7 ç>1À$ àœ³2ã—¹Eç{÷í7… Ùo=dÀQ m,¦€æK5N¯!ç#€|qc9÷aTg{âÆÅáá®õs‡àÄnÅ ™üñ;cbȈ0ý?hRX3tÆÎ=§Xê!ܯÜ/ Kpá Ôg,¯' aë­Âr~w(aDt]¿Åð”p#.Ž’×# ùìåʬd°‚Û,N¬[÷Uô·ÌˆÞš#È‚¸æzA–ë ¡ókÉ–™ü½©)lIœÆò˜HÆ|7лK—ôíêÎØœÐnX˜ƒø·ˆô„±/îà ä+vÈ Ùs³Ø¿ò%îñF-Ÿ`ì¾Dâ ôþš¶n]«Ñ¸Çþ…ä·Y z*ÀëwAM2œ‹p{†­r-‰Чˆ·2 "PiD„Û3ªy̨¼¸ö~…'Ü17ökâÁ9'®êžîº&”Þ>ªøà à p[4•5°Î¡Ë»£¯køOþ攦èîY+"€ípçTêI÷[Ð`Ÿ×0”Ä<…a„l¾÷KÐI4v3ÒøÓ|`¨sÅxZTc÷ËÙ?‘Ô4a&°˜7³o@h˜À0ñ‹°»œ³%<ž½pñOäÍUo ,Í+ÀžŒ2 ›¨8Ï Ï3¬óÀü„L¦©N¦þçv3ˆsm†,AF+ì€ c¦'ûh&Že‰ P ƒ‰Ÿ€@‡Þ*p„*KÆ{þ !³UVds ld`È€ItQ“æ©™ÜCKÕ¼=70“‰mu‡ðA!=¿Ç(|´‰*áç‘cÀ —G@8‡ÊQ(˜Õª©óIà® –rq™üÑK$âD=Ï Ì€™ÂËLÔ®1*³yÝj45kJå4ÜŽ˜°eçàÕ<”Ççƒߪâ]EwÛäÜV~6Ö=Å0S Ö½®²l’Á36‡.ŒRxwÄáËF;0pE\N¸"ç 3`IµC®_ß0"³(þLs3w:;ÞåªÝ O­È83ú­¸Béñ‚ ´ê×óðì@Ÿ‡§ØMÀLÀœƒ$¶Iè*ÆÈE¸ætmEÀÂ@/×ò™˜)E¹~ÿÀ¨Oq?#¾øÎèà‡çd&Ë•™‰8ѧd*À@ãò™xã‰a]Ž·4‘°?/RÀ^…Aj&Ö*~k&}"ë»A‹×ãQnŸ@$˜)â¢%n0©Ùo†ã¦9tF3@0 `ÚxÍýa°Òª ù>±Í¶s&Ú×h{þf`¬`fUT9L ßÝÍ8s*ÜB9æCnA¢Ê¹ð« ”µXÍœ, ë’L]pŒni±3ßöéñýQË“M3g®š@!`«çìÓ¸Ó°6¾ó*ÛÚVÎWœ••’W`Tù,š$ £™Ø-©ê ˆð3?q0çœ$ ÏüY”DD)e–™åOÑhf¾"ëÌLZ<Rp4W1Ä|^p6ÓÀ.]ŠÙ1êáœÙã¨ÚýDÂDˆý¹Š‘•½¯õéQe+Íâ7Xfæ´RCœ(dÀòhOŸº©*]&äñºž¯xjKŒ–šH©œÀ(8§2ç”3}k2·Ö·Ô$š@`çqæËEƸ=¼Rl<f¸àhPb-‰è"®gî/yf9 ¯wôjV¤ sÀ[u %q¹,Ö8˜™ãHÝvƒ„Qíçª020³£JO Ì¥¾+#“Ãd„¤™™eNª¡{´óÎÀÌé¾_ èÌ\#ŽØI®ïb ƒgôwÝ€-g*8 x4 ÍLçô­N3˜O FÌ<=üðl^àå&Oæ=.é±M©Gບ9àY6é…û1g&ôFº)‚…­OuSã¼ÊçÈ€¦ÔJ,`âï퇅>G”8‘gE¤šHD›ù‰ØWdÚ•®ßßÝù'oÒy¨=¹ê3sÑKFˆÀ&ÏÊoª+Qfk<œW |h3G4´Àpîwv!cäí±œ„׸J Ðúw´w¸Ì,RA|á,Ùvyú¸³äåœ^b²C^F€×«m†õy›ŽÐ ç!À³D)º"ÃÍ<så=d–@uc2›š&±=Ì»4W0gà’,A5M"æ”à¤[Ó$©ú’-pÁ$Mª¡—ü¢p?ä—"EØš?¥Î'ÅÏ`×pèlû¨Ê€¤sMûErØ9K~Úîvõ¸ÍâÖ>"Ý’ ìf³<Φ}¡Âõ,BøGZ"-,ã ñ˜pFžƒ[ƒ&€ faËÎuÄ‚q!‰RÀÔñ (¬e åw RV‹MHÖ3òô¥P|P‚ù1‘ ©* 5-pD¤"±w°.Ó´…ií °ÝX+…ôÈøŽXœñ4”Fñ%Úuf ¨hF¤EñÆ(]U¬'’fQf¸ŽÛÝOì5 ùeÙwušU•‰Qœï¦…âS¼ê/ >¦êÍÂÂ^¯e–H%àÑö1×P| K~Nð® ·ëDŠÇ”^‰ªvÀ"^i–€Š¦¦¿ÃãÃïÓÀ'ðfñª ö<‹£E3^‰Óz¿X‚ÃrPÖ¾ÙèùŽQUß±û @›£<ŸLˆYHŽ÷SúRcW&!>ÄøÍêƒDº ƒ wâ9Ð2P¸x¼Û,\qÛ-èÓq¤®°0XL …{ ²a €~‹oV%Ò™Á¼¢=C{ãõ‚TRc΋;ëºÀÜÍꡘ³zp­JWäÓ¬w¶§B´š¨0ëžF nÀ1}YözáxJàLšû|¦†*\%jç„ÕibŸO¤³œ¥t+­ý¼5kEX¯Àe¢F¬Ø..ÓÓ¬.BOrûýjVôóÇ£ 4Ò¬/q[õ’ ˆÑž8€ ì#°$3M¹²xoC53ÒtU_½ÄðÈ‹©X÷`¡à ÈN8FgÄ9µ œ„Z _ö¬4h¹ctÒÂR#PmäËnÔ²®¿ÆRHîçP«u é1ë‹E õˆCŽÃwÍY˜`ë³~¶ŽI¾'e8êÝ•;§‡$¢ï'Òø=KµŠôŠBŸ,/÷÷ùÞïüÐY¹Å"ß“è ;1X7«‡HOÀÌJn£¥Ì8`ÕC¤gå —óË/¹ 0^ÏÎì<—I˜‰åÅ ÏžËY=P6ÂÛ9†³ya t©îØð‹]™“«wÖ£»TÅß„fœ'÷mÔ'iVæŒØwsžœÉ.d‡Á¢¯@0ÄÑH‚ö#»€ÏF˜Î ìƒ Pƒ x‚s ×êÂlW`4!}ê:ÝìÀ³E]—âx®Ô7Á®KwþGêZCˆí|™LÍ¿’G‰p³ìéeÈøÓl¯ä ès xÖOà!ížËMfØÙEfsfÃÏ6_'ĽPl±^Aæb;‘×(Lž ÿ&òS/ô|‰‡}Òþ'ò©0ûŽš¡°½f4žqÁù³}lÖmÑ0ȃ XƒÙ¸œÙÐf[~01M÷²D±€U§ŠÇÙöƒ8<+p>Šâ@ 8:´Ú‹ }»ñÓl^ƒ`6’¹mÀ;¸ ³1_DÌB\–nQÈN ïFêDdy'e49öä½Àì¤Ù¤8’;¼(v¯µF]cöPhÔ!–¢ý%¶4oŸ÷[ ÍjÁìù ´™[ç¥Q‚ô\ð@³³ØZ2=ÿ"ÐföüÚLL‹VÈœmž…9d®ùE Í{Ǩvˆ±K5ûáæ‚Ÿaö˃S<Ì|Bž›ý•,,0,`öŽ}%“#ÆéÃq×¹HÇ1áä›Pì&2ýÏÁ“d‘ëBŒÄè‚;/JdN ̶­gFÿ(tArQÝì§Fø¢¡Õ¯FX$£Ïî¼g`Ê@—(ͶkȲƒÔ'—sˆ°†ìJ÷„Ÿí#5mv)ŠFÞÖát‚´9!YÙ7”âÙ£€‘äY½¼Šþ1mDÞê(±.E 8³‡: „Ù÷HTu/Š_|&€æ•0¿õí=Ä–œ="Ó°ù ‚oMƒÍ¹Æ"ÏÄé|9_Jà+O@³¿…Ga÷E­üÎêÅï,€“t&|N$ÎÎnþ$O¹b+ggRM‰!‘"Œp}4‡ 8² c¦» ƒR¤’·GöpVš<>… œ· &  & aç@srž§•>å"áwÕ$õ,BÝÐÁ9ÜDcÀ‰IËÝÈ¡±÷öÃ"0ÇõÖ0ŠýepE_¼tý€ÞWl[ÒçÁ¤±ò¾5ü$ãÊg…uîò‚I™hà Ìá: B"V‰ý>~ˆž˜äs îŒî98( Ñƒ\ÆB/èê«ö!ž£äÊD*ú¼Rßu׋ãŠ6ЛišžJŸÎȸF Tè»§Ð3/ÒÈXîâöÇ æÖ{¯Ð^ }Ћu¤¥×W­Æ\À‘õѤÍц¿Lp£Ý²H—h›V¤9ÈeB‚A<ïO Fôix^.îÁÃ80Täê£÷_H0gLÜ3<¿@$˜«HX“k5„Z3½@ ¯ópjzéM’EƒÕŠñÉ›ƒ+a„„@ƒ Œ‚s`=8ˆXs Ћ0‡2—Ìû“ùÒhó ãeb¤å‡1|ôrIXp÷ßm^Åм°ÄRà-(ù†~ÌAº3×+!˜ý<¬EBñ+ÿ°ÒÜ‘oƒ¨0/–ƒR$††õuçx2·ÔiÕ¼Þ"£4*9þóCÞ.Á9x°3 m’$;uìjDƒW"K¼€ î»s Þ P„ kÆ9ÁŸÈ¸µp>»"QïR9dAWFÂùž÷©qÈ—–“Ÿ ‰‰<þ9CËAšüœ)|²¬Ãr# •[Ö!·›.ÀûÙh˜wÓúQOŽnÍæ™/ËöÀ¬€mS·ŠÁ`©öç@9’õE >Ù†¨ŒÐ¤°®S*€ ÌéyvÈ9äiúW4wzÄ;$ý3àÅn†7cFuŽÊ³/v9­3³–^ÍÏ!añ+5|N)ý¬’Yø Šw=8Ÿ1n…—# l"bΈ@úÑœ5Ðj륄[¦eŠH'Øfæt˃y®L¯ÉPíkï±jݺÖµã­×œ§dvâõ>xX&«©`©`à–O”ˆX®²ãƒ"ˆAfFÁ¦Î\%¾çY¼Eã~è~!âØCšÏŒ÷¶>–'”šÙÅÖ–Ô7y~§¬Ås˜J' &`Î;@ 3"hÒÕØ`—»êŠœëp‡[ÒOêUt¶—[p˜¨&zîöÀœÄ®¥-@ÂaÄDè:¡{®Z†õø„î¹òÅç$ø¨ãLZÛçx­)—‡˜‹NMhÓ AÙ\\B{¤ ÓÅ@Ì9û+ ó~ZP1™—z÷”Æ4Ûú+sÈdõÇ0‡Ìu• 3¢•D·u³ÚN|130§cŒò£·U±øÃ/Šˆ³Óe¹ài0|°Çàø¡³†3@޳†3@kÚÜwðŠÅÁ•èéîoOñÜMüsä™ @O@ ü°ûLJšS ¶ÆßúøÑéy{>30W0ÆÙâ°—D0Ñä^_ô!isW™¶:£ÕŠC¤e"¡8òáĶvë“*”!i;ŒR½YÆ ^b‚@_c±°¥¶'á7S060—ÄèÁLßÛ£V"¿{^&c—ñ i]s=•,$»\ —5þ^: ´€s(¯$è‚ ”> /\|…c§ÏÀRˆû®ºÀ{C›!BnÄ©‘9äà ¨¹^ BÁi›27Üþž`N ,ì €sˆˆð@€g`ó\aš¢ßç-Ž;60]`]`ÊPV>žò‡GߪÎv™û'vU{+ð§@P0°kT %G ñŽ]{Éï_±ÎO–/}=Ÿ†ÍÔ vñn$°5ÐId0a•›À$˜ÀÀk7~Ÿ”RŽÝ‡¤®+R‘æú«@ ׫ÇÜ‚¨.g@’DÛJ¬…»=\´Æ#ßPJC _h®/„sý¡®z=­kxÚ¾˜!?PiÊ9Wɸ͘©6n`[thO`#LfðÈàœ-_C@¬?­5m‡™9ómÏ×lWï¾CöTè8kR§ZÄ÷./ý`Š£F&Ôì‰ÿ ‚óƒ&z0m q¦ñ‚Ëñß'€"æs¦HzÇÆf=o0—G ˜_" ¦á\˳•w2´P´³_1¶Ðh&æm®êW_)ÚbTO´À§Á9úçàÁ’tp©ç’N–µ_·ßòr¹“øé5¥2éð¼Çö;0•‰ ¬s¶š?–¥Bt…3Íp‡ŒÉw;´t˜Ü®*"s“>wã_êÈ9ì×V°¹¹=.ZêI 7°ªíÆ­(s»]M,LW, ‰·Á3Ò EU»D.X¤<ÞÉœtµ‚mhîo=Ãè^&¯]Þ®sÓš†`!Ì­œ&³Åþ}×¢Ÿ€´8gé ùV«‰Qêû;¡MEµh  Ìý€æN@œs¿€‡>g‹_U³€ZâñgÙBêaç².Ï?¢È˜ðÿ +4Kpôã0n|»G¤¸í±j”Z ˆ$è»\È›kͱ<'©ån&ëaió ¦Öçkm´yã±¹[¸r`©nîÒ˜›F¶0ÎcñOƒèR:îB9š@˜ûZñ`B0üÞ(F¨Ó0ŸèÁ¥…ùûk¯‘¼1š;ð)%šà§o¨´jÎÀ ¸+v0|6½‰²@"8‡öTܘ óçÐï^2tù²ÝUÖTíî†ý|fqlx_¶&¬Só ŽÐlŸ½‚£fÏh¨àd,Á©Œûp°ù=\¶LJÛQôS²¹ÜÔË襹§{Á#¬#Áªö9¼ ôí"GŒM/=(—ïüŽö/ÈbI9}‡e=k‰Û$>Gû܇vxàè²Ä ý¹`2QyoˆL‚t•ÿÂ`ϽCÐ$4{˜Ý7GaG/÷…¢¤Ÿeuýz<úA”Õ.]@øÀX=ç ¶QÕ›ˆiŸx7ÆÚ;Xð9Ê=Ðç±j @=Š\°ô$ChtìIššGó/dó¯äªÃ~½Wjrú“Z8†UAòÚK0=¿cI.lÔô‚Ì%˜“³|E­$Dhx¯¤tÈ«FcIà¤ñÀ•Ug°`ÄGͳbŽ]@X¯°°Å~ÕlŽÄQ¿€.ðQàn!lüÜ1¿P¿dà@ÐLßË00 ¿…wó"½¬pºR} m3 kœŸ*—79?ðÒT‡XºR½,ªí“f!ã_ÓŸÔâ…e¿€;àöžªØ0º»é¤ wÕüÀJí²"ñ»÷Rjª&‚¼Wòªðtû¸oÙЕf†—•¸šÚ›Þ´`@ZÉC'ØÀ³€5pÁƬÔQ¡t% n¾Y€,Xæjã*¯<¡´’d’·©t¥°õP‘j4%Þ<ĉÌ+_È笗¤X)`Õ$,ù­ò2ëÇT>nØéo–âù !båµ#³<ˆIÓ™ô¥­ä¾ñ„µVç[£k¤`%†³Ñf¹`T]ÉùÏ‚Çt¥à?ñV þ#QaºÅ>Xi^e4à±Ò$M‹šÆ tlOF}~”“@"®‘uÏÝ ümçSÿ’>Öʸ `êLöÁJ‹§wyr¸x˜BIC¥‹•¢<[f^Õ쳩ûÊÉÒUœÍŸsa,‚ 1ûªº¶ vÄ¢ÁgånÂû-&L+ßuÞ½?Dlµ,¾"××O„¸À%»êüÞ#œYÛCßsàƒqa!öüæëŒ]F .píW1¦­ì 3«a¸`dOÒÞ9lì·[ë…Zð @ î}ö‡ ópÜ•C'*_‰hBbØÞ0CœWv é •þ.ÅÕ=‘ˆÁºWVüŠÀÊåÚÔý“—žŸy.r¶#•/.˜Ÿp†ìÝŽç3^ )>n‹\3¢À…7 q\`eçBôx]©Ë4ðß/®u¥3u±·|(? pç ®ÔÒ'ª¯÷-°W~`Á¾¿>°J°`e¾û•\Bªîñb+k­?¶‰+jå¦b¯}Á²¿%ÜïëEMêCze»[r?ʲ¤ß¿ÅÈ–›¢AÁ_ÃÒJÁÊ œ^GX€=X¨n|Z¾2Eú’I aqY™°7×[w6>Üòà`.$ý÷€¡ï*ǹ€G°òKó´L‡ìþ¡þºëwª]*'O < Ö ç°ø–ƒ'°"Çv. ”…•µbŒýt”å( \ƒ|Ã8ºH5ZH*¼¥bº,gÈ$4l^÷ê.8Î’5O"„†CÒ.Jjy¹t…´òº Ã}Ég¯^9œ=Ô£"•èü„G{Ù¬•×/R‰À VvgÏ97R‰VÞ醌á|´V˽Æú ÅfåýNQœbâÇ^Õ¨Eü S${¾²P  L¢ ç$î¢UŽ“/¶7ÒP¥÷×½cxo ŠƒUˆò©YW¥ÃÎ;.k¿»މÖ·i`½Uaâ¦R•\ð§,È' Š 30%ÈÍ\%›¥uÁã·— ×tÁvdÖGfÞüì))3)«¼Ò ÜŒçœS"fÚ*„›y£Éú Ý<4¸,„·/èáç@”vºUf$½"bg~H'K‰’ÞʼX"n÷©gàÙ$á4qÂjâ¨3•+cç ý£ïcÏw訄°a¦Áò !IuÌáZ"økVp´!`eÑп̑émeK<›Ý:]wÉ4ph.¸0ÒŸW 7Ƈ%da8š[BÈÊd@®¤aB“+¯ß½&®Á9—ï·4 ç€àF ›gn‚îZ0V¹´àf¬ZÏÙ·Ðz´ÖUTëHN²L"c@ ¨JÑÌ$æ1s“X”ø`—"®„ðÂW®s©BÜ¢Áe• —À(X7A¹*á‘"7µi¤ôz×ódiLò_(´ b¦X[ ᚤ˜W8~Ûà;¸ej Ræ|d&à‰¥ŠOm{7ПUê<µ÷'R•^Ù% ‰ù¿3ü~]å4Â’ˆò9P9ƒê¼j ·ü@¼,@p?Z/z“Ò×¢¥ïG@tW¥Eä©*°€ap~ÈC Á‘ÂTÁ9<&ÀÊ"/>_^„·`QPFÀ÷‘6¥Ñ B`*›‰±ý3:aUæÍ´ì[»MD\À§a2Ð9ÐÓ3ÿBÊB>Æ9Ð"ƒLýe0 ¨‡†8”9»xcåC™ËŽ »kWàYÝ ´*Ó¯]u^@(è5²sß3*R#Û£‡zµ˜»‚±²Œ@{Ê, °«±ïúY.èñ‚ªûƮʭO«ÛB‚Ùdæàœ•8¦1y|BŠòÕ¸ì¦e Õi†Ý(­X à(õ#¤Á úµ¦ñ¡íWÖ¾›E%åá£2½Ê¶à ÍEËCÇÀA⨎ѿª°‰oK· ¾ ’@IN«C¶œX,,ˆX ¾ÏÞú6¦Ûw‹çÁŒzw— éç-ñ‚¸0xÔÛý°7ÑʶN°jdŒBØú(½P°T@gmáì‚÷ÔMkäéU· è•õGöc rlo±û")ä€û±iI6x÷‚€Ÿ èZ@,èØç«nÕs»„Zöäö"ÓjÁ{D‹½B¡.F´ÀoWs¥Ò®\.äŒËŽ4œÕ’¥¶.¬¦¥¨1!sµò¦±>d®‚»Bs!šß•r±`ÑX†µŠ§ü*itµ7itþ`µH]Ȉ_í£‘°I–b_@&øÖÐ ~22@h‘ùÞú[D_?ý¸‹&iî0`¬æe©…‰¶(K-æj‹å’ñámJ-±Ò:û‰¥Ù´ ‘xλ®Ž5©¸+@)J„Q1‡àt¸A3ƒÛ?#X]*ØPql/Ç“—©žÝª˜Æ¤™À*¸2JXˆæSGdû9x¼ài wBE:ÅრÒÜÔBnOõT<ílp5§ô4‹;\—?ƒÐÖ­›bæQŠ ñ‘«õ#¾n“ G$ÚnÁƒN ÑËQ«Ëû*вVÀX~¿Ÿ'ÝnPäð]*è¿|‡¥E<Á ç²€! %Å$•äƒxƒs±ìüûFÂv—\]fƒhǪÅ׊lÚ ZºõÇiŠ“ÎÏåf ¾G•ZÏamWþÎô»Õ¤Lè»jË&Õ|Ó«qiN^¾Ü]>áã¯ñ‡Øß"Mƒl/B èÖ^í¢~Ë,,x$¨[ý ^@C8gƒÙ·z!Tì-‹ÈÛÃÆt«/õe¥št¹9³õ… §IUÕfÊVÑ—#÷’y®€+±Ü|MéPŽ>Ì­CöÎÞ{—³¹ùâ )VºŽc0ñÝàužîøu›|°ÅêÑ£n"­©O@>·ºß,@¬žŒ›v»„E8#< Ô$«Hf]0˜,‹Kd_7¾×‡É4ÚzöÍ¢HÁdŒ?ÂÉp–Å¡X`×gÉÔÕ¥ 5ÅÎÁ¹?ðÒ«—ü“‰ZvFÂÕ²+èÌÅü ¬x|IÈ/Rí’„2Òhh>ëì&yM°VpY °"„¶ÖÚwçç*Q6Æh°ú`»¦ËY×Ç;{á1} Ûx·QNË ;lõúhŽ Ž¿»Ðxð‚ `¡:škwmüŪ˗Z¤‚aáçwTëDy<ZKE"E€1ðI¨!¯Þ‡_&÷šÇ[ÁÏÄÒ‹ËçÖkÿ!«à®Dk`ç³Å½I9=dßä4äðgl`ÐG;˜H§Ñ*  ¸Èûz58Älq«( ;ÄÌþ!t¶Éض…äÌ…às/# ÎçXŽp€õymzîX©iÆè#ä’y°„î žœ\‹©Zë‡6ftÔ¸|{׳œ} pØêœ(†5p[Zhìîj]ÊSD07òTXÞpõín(À ,„܈1"}÷LÎø•…~ês«ï•Õ ye-Џ%Ë ½Féüì÷‘¯,Gâ¿FS˜H–d¾-  , , œƒ€Àeb£„åã'ï;—^¬”5’`]4àb&ã4p«ß•x³I_J=2ø×pÏŽü>=p!Ý…« –ÁäﳑÔ+Ã6À²”ó4Z3_9ï+¨˜Ž¤Q8Mƒ‰/,1Õ¤,`  Ñ] 0æƒ, r Ï&±:WªAC¼}ˆYX‘À¶~Q…~!Tnˆl#öÍkú°,†¼‹Æ@ 0ˆÀ YC<ð À¨º ¶€€_•¾“!2ðBæ¾[,îˆñ–,øëû|EWDi®Ñ§Ĝ¹Ö«Çà‚{1Ñ*ßBƒ²ÉGëfd…ÌðS7 Á9L« Ù«“šEì‚úÁÝG@1–ð²ë°âÃð‚:ï´zìÝ¥©¾ÕÇ/z- ôш”tÚÏyçÝ}ÍÀeXZàºðÞÍ•ŸèñEÄ‚â“IsnXÑЬmAB³Æ•ÑÃBá뉰V°¶Åø¨9ŒPû`¿‘ZcÊr¿€ŒrèžTå Uc¸×W(Üpg$1¶´:ûkÜóStÖ1#<“±àQ]CÜ<èë9DQÒÚo í5–æ°—Lð¸Ã²‘Ô¹FÔÕ‘M¢B¿nQ¼k¼Áb®£Q‹Ñæk¸©RPo¯¨?klÓûþþˆl\„¯Ìð\Cú‡Opòýt›…רV°ËNñ|€[/ÖàBnú9,»ÞÃúôû§æ P‚s ÍW€ Î):îÖºaàÍ/÷8ú{£”¨…Ó£éÄ\v 9à.ìó8ƒ5/ü¨ÄXXß3çØV¬ó‡c¸É¯ð }n¤,®I ³E1â¶LÑdlûUb‰~è+’ `J+(å ÁšQ-L$ÆÆAŠJ;5†Ášå–ª%nHlÝìðšå‡ÁkÁ( 4S’‡û¾”°K¿i°¦ÄSvaÍbNV¯¼«ô"ŠgpÁšŒ4öz~²­ IòŽáj³Ëõ=RÀºJkAse. ?Ïê)f4 ©Uxb”>båIp˜,94Á?I op~ÊÖ«¶}ì-ùØMªHù_³}øE'Ü9_€EYù°àÀ€ÓXf 7†a) ˜}E\,”Ðê5¹3ùè¦vý\8äÞ¸Áš½ÅèÕÇ =iR«.¬"‰lÍþ!Y³à6¾à‘,渢›¼‚ÒGNçš´­yž4] ŠÁ½€h°¦«9,D¡ôž¶Á ßXéN :Y¨z`W·èdAŒ¹*ÄÑ™,)€!Xóu¯õàœ#õ…ú³=²xÎïoÎØÀÁ9PqDFК3QYȢǘK]äwS¸ËÞNS×q1©_» Xs™ÝEŸ¤œ¢ª$£bû#¹0©wÍÀv¢Hy4 ûü†IPy$Ñ‘0¶€c°æ£H’¹*C£F}àô%>jŠß ¸ Pk’ ‰cr*#®Ðç»ë¶„kŠZkn« ¥„ƒXW9nÁ&Ù‚¡y­t“ñsÍ=0ÎAºHp-Ú½(Û¶I@ ÛUw;ùzŠFÓçMÊŸÅ+EY™hÞË|0ƒÿQr!ùØ?¨œ  kIø4Ìxçó›Ã~>%¹^ž£°€*0z¸ 5:ç; ê)Ý] lõZáä«eÑ—ö\?h‚@!Ÿ‹Þ"¨`že,}´ãr—¯@*°Fó¨u PÉÂ(­R§{úFàÂ÷O)èçðäškè½xB–Çi2fïS~pÁ90XˆlÈkq`˜5ºÄ½–g.à5¬èŸ ðkúçÌËZþ¹€2³Ö‹þyA–w ÍXHEál¡Û¼ûÏYË9“> ÂýÁüþKSãðb]Œ…årÑt/±§sÑyûåü(í-µe/%°kE©w$Ò!)‹Õ#sãÐ>­ LÉ~­që™Ä‹T†Òi•Znµ€bp²Áé°°àÀ ð¹ó ßÔ ( SƒH++ jH™ú(¾¹–”ch®d,v…Qi˜âBÛ¡íb­ˆ¾§Ua{Z¶¸¥v,O¡E)JšÒ$ƒµß˜£ÂxñÐmIǹ·ã‚=ã^<ÃoÃ9ˆ!‰úl{|Úk{UÉÛ?#§áSpáVÄ…<ÿ†ð‘…xÖÓ8Õ/èkæYb¥—Ð $ƒµc!É`]¸¨Øcá7d O@Ë*J¥ÓðywmÇÈYË×vEI™^“ WeÁB» !¤l—Nþœ—x&ŒÓ´ñ™.s»P³E˜Ú sÿG4ð—à,ä ² ,àð3^ ºr‹°Ñµuûp»lž‡°=Ö¾œ9ø˜ïÊMÉÓpÉÁöÇh4q};IỤ́ƞٌacâÓ´½=°öUó€a¤Á6BÛ»Óm!ÚhívïrÙ?’˜'vŒÝ»ÀgȃàwåI1½ÿ´Þì^8º0zaÖàhUg&Áv$Pö%‚{gâgÅj-ö¶¶¸tÒý‚æ¤Q“`º{¼sŽˆ‚=²õúÇïÃÝw¼]ÚRÒ <©w±”Åhû,tµvHÞXWÀÂä½x+÷.{UÅ~XlÉ)ÏUÔ·€â=œ(3cðƒE­‹Â|Žä¿XÀQå÷€˜ßo:VkH^³]°vÔÖÙ¬g¡£04Ü<xk¯Çâû!N¯m l …ÆÄyã©( ð‘m¾¹µhg^›Û @ ÎaÓö³ÒcÞRûàqìíâáTÁGŒšæLÙF¤µž)JËÚG™ßŒs˜7›hEð ¶D®ÝsµSryc!mHwøyßó#íöæeQ†™ü.än– 7¾ÀNau O2Öä>Á UÃÈ6¼‚‰‡;;\ÃGFÛ±BP„'ÕᇀP¦ë3|~j·kôj›9mâÛxˆ6dë"Á ±:ì…²·ÓUnç5°!4I‹’Ò².˜”6×§SÆàûÓy歷2îŠL#ú±F:oñ“w2£ÞªcMxm· <†ó=X(!`Fà¶èËsy¨6\†þñÆOIBü8›(OãÄG©ù ü‚-Hb-{«vPÔ#OfŽÍÀ8 Á†}i'i¹›iåBh`=ø®ŠnìÜNtYG‘ Žöp1èEÂgªÌÎéIú07lB ]»Rƒ†O±ÙTóÃÿ·Éè$ôguïF6 Þ Z»r©7à vÖŦü½YBœfíì¾¥M6lSæ ËUÊ7r2$hnìÇ ¼‘(}‹‹sõ€…Rhž·VÈXÁ9pË?aý`Òàœ-f ºÐY6á†| å‚‹3"ósgO¤ æXáMŒGWpû¹”yè5ž‚F)‡j_½²¸2nŠØ ^Ç÷W<ßK l`ì\ï^ÒœŸ~Z6° ¶% q Ø€³Ç êŽ#Ü]:ЧCš†ãîFàsϺà~5xÎ~”`g0èÎí*`wYÑÎ …;–ðÏS¶˜‰þÅ9ñmšîqcçn3%q ¢t~zV©pÐìV:rš7Æ*ÁYíc±}¼‰] Öî.Eœ ‰T˜=¬ Á êeî,â4Ôö­1]:ùܨîßáÆù¨ä·J ÀðyÈÔRϧÉé˜TW~’„Ú#èÌy°½ ¦=²¸J;À.Ø7Àë‰ä!ÕÕ6\©ŸÒ B9ÏÈè#é¡áäŸÙË[ÆŒ5¬·d>íLµdûýñ›hë±q9õ$¦rP–±ü00à#0r°àõÍI1ÁŸò’!$mp¤‚ ̇–zcçíÓ áþ iï“›Ä-mV1DÆ °…s½úk\v§ÏC±ìbŒŒÇRÐýÐê;AôÞ鿯ÀG(ÑF(Ò9»ÿçï Á™œr—³6ˆÃ9Ð.„h´~‹Ÿð  ;# S ½Æ’Ú%²DW»zm+ýÎÛ0+ŸC±ßi¸A—¼¶PØw¡ž£õ±]£&¯þÞpà{Jas&wpðIl’±Ñü;2ˆÐ;"%˜éù½ID“’sØ"7(ÏMO.EøJ¹‹ÉÙÛ‚4\àR°éûÜ%²tÀêv¤ªñÖ]®p‚Ò?±Ù7SÙŽxõˆVª±àefýúan SûFîýÆ’?nȨç³o€4ìò¢w$Õô |MÇaï Žø&go)œƒ°¡jû.S𥑥—Z¾K„Ьuº$vÛml,Äz™P60¶É`x׆CÏ/«2Â.ÎlÔ;Ìy|³Üá7ýN¾Þð†lsÒò¿LÙå )ØH»Û%‚Ø6R¢·C€fm AQó„/PFÏWÐçrKÌûWà|+#sýv@ýQcà†»{—ǰ!xÚ-ðv l–„û¸ïšÅÂÒÈP>y1’±ïmZHaHÁFÜå.nm‰ De1”HåîœÓ7ÜUŽz%î°@î„NRáQ"a¡»¬Øê íÉÝñæ`]®šñÔp-§Gå+;E~@[¾¥kJ ôFšÍ9D ª”AàÂGÈ.‘íǘo>Xæâõb(e Á\¼"Òÿץ˜|Ü Ýô5ýTêbpõ±ž º„6rcF0ý½â‡ñK~óK£ÝÚ¿¸Ø ¼‚mê²E‚\‚(æÕÀ­ ´ä%EÁ¶«çýPŸÿ@ÔÛ&è}®GÊ: ˆGËÕòÁ¾*˼7VST<¡·þѲ1NçSÿ†Åa#ù}CòÞ•%6ÐvõÒç6h‚¦õ`#šn 4ÃTK²Útyÿÿûº²lËUùŸ£¸C0hæ?±B öyUë7·Œu¡Ò„Ò2S©f r!Ž6Kq½Ecn›ž±âŧÌ4øºsàF¼\â\ÉV3ðþj')ÓÁTjƒÕ0‘T‹r#UF"ú$ŠîާÞãÁåKwb¼¼$ººÈÖßâ×o‚Ÿ0Û ÍœíPs7y°\N…pE'¾| Ç©—¿î )¸«‡u”4Ò²c6qaÈUŸ3Ÿe×Å,x±q+§2"¬£bo7Ú2˜HÖ‹h„ ¾Ne#h‡ÆþH„ôìÕÍT.ë¨eÌÀP@:´ÛŸŽqTÔ§2!†=?ô~øú ÀMÀ”ó  (ÁÜ E”'¾2ÁÈv詤³V•7¨ðµÕn+Oáhó”Õ!UÉW'i@$" ÷¬¹©r~†ú»=_¨¼©D3ÐkèõÂ'iÚošuÛÈÍ8é ý*&}ƒ^¦?áúu=½¡ÊK𠉦†«—)¦䩜SeÄ:š }í¨ñ©Õ—CqëYsý;²Ç¯_Ætšèyý¦‘Ÿ_ÂËX 2ªk£Ùߢè—3}*Áñé*· jO¦•MåI˜ÕÙypžôᄚÐúS¯¨Ÿ5ÀE•ÀY=F§…f5¯¨s­ÞŸùÇê•u*®Í®ªáSÝŸj{²ÁÆ:¯4´‰äiÂí¦fÄMå;˜šv?•Ž`÷:jž* g5Mm׆Uñ­Äg¤Ækªó’ªg;]Ïâ "†•ÌCD€ã7æ>+B9ˆœÍÚ>§_b:¦©¤«É>;¾£áâüY.= _]i!S]¹«ÐPÉ=+†EÅU¥;MÉfmfÖ*oÄ<„XÅêI8ÄõPÃTxÕîF˜RÙÌ“oîÒtÒ=ÃtŸ X¶©ÔÍk7N% ˜Õy§QÌ%èiÊKW)tâújÛ8)ÏHŽœh®ñ¬†#€•×Rº×©úËêÀn´qÏï*Ô2G+J¥˜ÒL-z|2Éštð³ºS 32ނՄh¤·U?Z5ºOün{~ݬóÇ‚3*›_SÃî³N—‰fAºèF¡[¦3•à`ýûÛáA¦ÎTî…)Îæ€8û–ÛŽŒßVé ¦88W…†Eg„@Šø-•ž`Fð21ÖkH‚t‰ÕتAÙ²m¡)¤ï’Œ[\mW4è•çk'.B÷© «f®t S‰¦Lz—•«DÜsÅ reÂ3.·¤0;Ô0£ë@Ö¦š ¤SŒg*OÂúûŒ%üDò™=@ï}°””`Š9ÖDõ u¦x– K§XÔ}*IÁ”bŠš2LÖ_<ŠP|ÃÿT‚_çœâÑ)7óÞÔ½zNøg¿‹â˜ŒÍIð¨kbõÉ©D,rëXyhªÕ;¥^ñoVnu ' ÇÄhNl7‰öTtØÔŠ_B¢;”{ÝÓyQýÚ”5s}5ùVï´üj •v`ýÛ1lÊ‘w¶C¨龫öBŒéW®5• @³B tá$©D!iŽÜ-_0¬´[®´©lšbYï€cÖáÁCl8‘¼ù»(Ц2Li¾4ü%b 8ü)w0E9N|H•ÊÉ2ðê Ó\;5Ú¤tåTgÜúÛЕt“jì7¶q5lœš"pŽS@[aaDTü6WUÔÕqÁ¨iD*‹ §ØM; ~<•Kæù!Àx›áâëÒ™r»g”[`5: Ò‡4Æ¡‚r®e³¤Ö›zZu°í—RV‚êž$ÚJýîG@ Ì]C¡SÑ ÷{³B¦ òÐÅZ<•N`5d!žÊŽ0•á`6°áLµ—gó0>+ƒ{ è.ŠçÌ|)xSc¡Ó¹¼¦bfgóÙ®ÖLTsañ7›ýð‡…ˆSÓça$8ùm¯“ ”#ë,‡p´K­hª¾¯cˆ‹€L?pL’T^BAY VÅW¡¹Sø§âUWªžÍYuŽÊÐ{˜'zý›cå/ëfI3Y4;ÐUM`#ÚSèMªIKe%où‘0Zƒà&æ˜JO0[¹X`ví¥©q:/¸FëÉY;׫l‰* ‰úJ•a*§Ájà)W®†ÙŠAF”ÄbzÜÉ”æ7Ó·R>‚Ïf/\bqPÖ@? pI–Ù6•—w:`;äÄ^W1»­UÐùY-˜wÍîSÁè?¦æüÏôWõÔõûÃ¥0è“JB`uãõz;íM‘£Z\Ü~7!6‹v¥™\·÷¥xдS]=«Á¶£$ SƒƒSé ¦‚éðúSHtüZ `MÍiäæôºÕ›N¶&>: þ\áÙ@8wo†:‹W3΢{ѳͳuÖiǦVèÜT"#𠜤1ÿ baÕËÌNå˜G÷×»j§õ›}xÂmÝt %e˜­;¢E=kÓ™°{ön蜳Ô`},úí µ—H ¿ßðY%)˜ #¸ºEÏš¹ÕJ¼ÕLÝ—ÐF;³¤¶ÞÝ€nf¹Ô&*omf“/Ÿy’ñÏ7 œóÇ+¦î•Õ4»ê3 (Ìèàuo·Ö­A±¹äŠmК!õ¦ö®’6P0Ô•1»…`‰Äñ žÍÙí£‰ÓÝâà#¨ºÏîÈiå&˜ÈbVoÁÞf—9»Ë¾½£sõ›…|*3åéžX1aîẗìeÚšý¶xÔe»šq¼\ò¬0UËf§oMI¦êÐSqë(œÓê š=›sZÉf7îµ¶I„}”†Ö9¸½!#™ñ­á›«¦¡ HkoeçëƒQçY8\×´´ÀèáIH—Ò ãéÌôyÆ‚hÕÏÙÍFoÊ 5û]fž‡½gªŠ4»Yh(ð”Le+˜½úõ,´ ù¨À›úbVdòÒ„¿Wêƒñ~xf|›‚þé¿t]š.¾MÁ¿/î¶·!Zm¾•æ3 3Ä8p¨š x6<–<•ŒC{®WXt¿¿•AµùwGÞ4iÌ%˜7S ¦úƒ¦r¬¸J²æi¨,;A ºÞ õŸuKDßLŒ•Qi7äï°þ´•†ƒƒå‡ü-èOé€J½ózþFz´…1LMB˜#˜æÆrgwó¦cºy3;¶§Q=¸;y€88ª)Ÿ³›S{'5wà¨ë¢ó1Prv:W¶x]Ðmþ(9ÝD}sEˆ)rèÓÉï‰å!ˆ [ÅI@Xõï…£ºwŸ[Å[S¨› ±€:®)5•v`ö=ØÕWS»ƒd³c9OëµfNñø÷“©u¶’avDm~)¶ PÉnƘ?ÜwMDUº‡ÑMïómkhzÕgd ‡Ôá©ôsX©ƒ©&ùO©ƒ©¨Èy¢p(\êʆƶûa•P©®ôs\Ž}n_ˆ2¼”7°EÉNðzdÈNÀÚa'80–q—Ùf™®bj\F®6¤áDæ}Ô7y¬¨¡P‚‘‹êo«A.°ä‹8‡B{\Ä8¬7ÒZ¦¦øÏ‘= 6tíl”]äý?÷š¦SšOð»L å'X)ó,~@ÆZ IÏÁÆ®ôsl>PýW3ÖXúº^]ÅØ‹mÕ`ÿ•^ÆeÓ3ó'LC3L‡ÌQ¯]]í…Õì.νb”ô`5˜–ðìŠ>œ=Ó2á„› Ýíöªužç°mv³‹tøÎÊ*Ld.ÓnkøË«s³Ûjµ A¨”@åÊçœ.)ÛÕÙ”ö`*“Á¤ßGºˆ8¼ ÀzïõT^Ž4ÞÂ|k$¤‡ð.0™°‚«Ö÷ˆ©|s¸oM+>M')˃@x[Fçü*Íôý7P)ñ­Õ\`ý\·ÖR II VÃùßpš¥6¨EdL{Ê·Ïx“çÀ vÄš*l†±Ãêì“u¾ŽKð4õ#3í$c§ gƒ¥\"Bmê9ç£ *]¡SY &Á¡À)T¦Á¤,s8áôfìòÍü0^vž¯n–Ï„ShÜEÝt ©¯Ì¬“kxŠo,?™Gc`k6O=¶‘—“#Š˜¡"&pÏœ£8þôGQùI“‚s;¶U?ïX‘ZðÁ ÆÏ©¼S‰ ¦Ö _òǃ÷ã§”ƒ:s™5• %ÿP•oš©«ÁÀ)…ã<²xèÃôÅ g¯#3Ö/p.Õ·¦q×Ñâîv¾´»¬÷Tüí<¼è…>/?ó„¨çž$`&hž†£ÿ”báõ;Njv×K’Ú»©ókf Ý*ÝœÙC·ªˆÌS0a›ÒÞÝ*mÐ:à¡[•¦óp¡¦¦‘Ô€^ÿ"²ûmóòM@Zê,dT‡Îôr-ªáþÌžŠæŽëLÍ^G†sví£EÌúxù§Q; Žð"3gµÂ5„O å9ÁýùpO(À¤(€­ß>O·a¥¯Ót‚:ª@Ò†“Ùjqô¯jýœœVƒ9aƒ.…I Jw0§ø$ÕIé„Ns³ðÖJà$±à9 çW_R¾‚¹É 4ãê>àD§ÊÔ¼V¨ã×õè¤ÏÊv0õ£¯q2壴ªO1f²Ã´S OÞZ3Æå¾ÃÍ"+Æ%XÊ¥/Me*XMGÀëà‚ósê„Óˆq¦2:L7ô?Bžöm{Öd‚òLç%øœ-ÔŒi›XS æ´<à]9ê‚mt€—'`"Ìö ã]gÌ«²ÔDrÿlm"ÛVýî«Ñ»Ìl±½IÀÑ?ü;ˆF½øW¦¬Æ§ØÄA’Pò/j%Eú”¡@Û/Nø@zR‰Þ8aM¾©þný1£å‰p÷+á‚þ™)f1êoÃ…ø^¦í€{Ø;ÜÛ3ŒrÓ,RÕY` z.úáµDQFü‰èïrP"úGB‹®; (j÷DÈDùõŸ5О#M3}^Ù 6^V˜Yçj¶_2ºAì·†š°ÎeŒxÙô¿<–íÀ?utõ¹üù(:Z<â9¸Êœ¡G†‰åÑ#Æ¢«~WÉæö\¿Mð]1HÄ’¸è ¿%ÍÕõ³zÂN·½Þª`|™¿Ø@„3Ÿ÷FÒó·_û”ôÑòŠï~0d­*<5¬nk~WqM=,Œ€kè»ü…ÁCfý!§Í‹+0¨9¯ŽžÛ÷¤õ‡±u}^e’[¿!ÅÌPz2>Õ“Ú£Grôîë‰x¦NXÿ¨W¥b‰„ÞÁ}¯g’,*¦B2'ú¦ÊÒsùü;sF ÝyÔÁ ¶‘ã&O$@ÏÅP·³O0g"IïÜÐǶ'rÃkg"CiЙ*¿dßz‚WË+c"V 蓺–õßXS‹ÄXüMÛ°ùt¬C‹é¿ÑSU&B Ø #ÁÚþ´¨Ð+ðžÝçûL¦œlºœKÒÀ“²®9n#›ÆD×+B >íC3ncðÔ½É à ޼sø;7™uxlL{¼á$Ö¹ó‡JI²%5v®DËë»RL(0÷åõ‚ù¸n¯â=ú7¾4rvâá4Þè!õm®áaëOáÕ§8µoÁ3¦‰%[X-ÑAEPÖ=Λ²n\:Câ§êAgP‡ºsk{>\ ]è ÷Æ *„/ÿ0Ð߯±õõø›A³¸WÆ ZçK”ˆ*ÁþàÎŒˆGÊûd~1ý·"Ÿ5§PžÖºqëYlÇqØé¼•o¿ ’ñ°*… »¯† ô»¯mw’Å̯hô (ÕðÚ(|E)ƒ}P/ð€žÈkðëï¼íäĘìE;ë7T’’ˆÛ5+~喝üέùÝUßÞ½k(÷Q2 4äl8›oºµçíøÇÿšÊ®Øm'Æœ5»×|Wˆøo›°¸ØÀhx=p»6:Ó4èüãýntð°p>Ô\=áyal&h‰ÞÞ»Çú-sùŽafÈ›¼™µãòV‡‚þâ÷ѿ̄€–éáý­yü@hüŠwCOÀhäkÞ …ŠèÛõ[ù¢£nS¬Êó&½/ùZ—µS~R]Î>òÕ’õÆÞêÕé»óN6¹@/úYü ©AÕÖsg,½£pkKM‚„‡ QCÙ›˜qE7œ1zÖO„s[|ùÖÙÀ¢ÐÁp¦àE*/âS=5ºéÖqE}Áª{qg d!úÔê*BO¢-›9_¥Ø²Šÿ\yÚ¹3ö‹Þ]ñG6(6¦R àX×¶+ ¢7Ã-=}I•aKþ=æûC^¯`XàZL¯M§ãדGz·©Üú~E¼ì?¥\Ðv˜úØC˜/è’뤎[õ+J¨¢ò'xÉêzºÛ« ÇÌ•ØÃÌ…ýz˜—…dœÍ@¸ôƒ«S q2C\D†äwùlÑo¦'.@ã?!WãnXê\×¶Ýê‡.‘{w#ÖÑó7¡‡ñã–i ° ÉZP_×î X¢|Â@o±– )pK¼ù¹•š`çnl…"_™…Û-‘çøK¡È€Z“ݲ  ©'m —wÈ·/ÀG(·VZ 5Žc{LÉ€{W(1¹~¬xÑ«ò²dâŽÂ³,ŸKØúú²…ÝÎfÀ`\Þ öèi¯¥k']ždÑÌEý…êY©ü‹g›÷ æ±9Ý·Ãdäê›Õ­ÃQXBªŠ»$ñ„j£¢¹Ë!ڎʨðÝû=ÙÞ˜`˜Éômý¸ˆÛ^ =» ž®ß[ŠøCQ3FÎZk{­ O k­ m™Ôù®»-§ÑùlÑߢÒ_;ŒEfX¬zJø° œâ²²ñ_‰ê ±¤)¦ç–—©C]¨þ±†WP¼”ãÇ@4dET3¾¶ŽÎËãÃ1}âfý¡ IÉܬ Gì¥Þr¿pqÀ÷ò¬§ÒÍ{¡!¿&`ü+#.¶ŽÏÇdÙŽÉŸm1Ç$êÜ.Zå…û!ºRG»cÝ6½æù­üNµIm­Ìd½Rn©P‚on“Añ…q+Pr÷ŠUz^á®  ÒMò}M_…°«ß ^è¿?´oôBù+ô¸ÛþnÄjÞ>–&iªiò¯j7/®Jäê 3ôGŸU½â/" 0Ô ¦8ƒºVaH»®2õ׸½ôµ6¬Ðã:hîÊ0 D >S­ô ‰ø–¡ÊÈ¢]'(ZO‰ñ¬Z_M T›ÙÆÈ7Ö#å¹I=ÌúH>ãÛx:-Ð Ÿ«oI°îk· (`éæÇ] Ôªí±ý™±orôçT#^îº/^1ú éuˆ(\Á)…‡˜?¶Õ;Uu{jßo c²vón¯:ÊÇY'éòôÆ\ ÆœV† UJ¨­Õ`‚m §.ÿÆ©ÒkT}ÈE~=M•>IÊô ë¯"^WÐsV!k°ãjÃïwƒ-$ÚÞ"••öÆèÔÞx#‚r@Ãn)»PCÀ?R»B´]FÄë;º4Tz„—L|É%n¹Fú6`Öu(1먕ít|E {ÀžË5D‘LðŒÌâ¦ÞRCc^¼OÀ7*H’îDöÑæÉ䔾ÏвñÛ;+û2ðúœ¸ÊäãÉ¡Ô4KÀ’õ‹¹0N%ÉêŒa#ðdƒõ›Ò­ ³+º†º›«žÑZý7nš#1„°îG(¢g4–üøŽf›¼J¯™6TÿÐ Ðý<ãЖ7„!lR¶¾#ÏÌg××¹„ž´#å ÏÚê:Ö˾Ð]Ô¬&¿PmØÙ¥Ü&ÕÃ!Žq(-  ^p "©×ª£Qs*;ñ’{•+Æ kýQ¤Ê1¿cyúkàDÔnøÙ@¤ÞÓõ˜”Åôæ llÛÞÒwØlžàÜ@ Æ¥qW{¾ÛR9åÛµì%I'Ñ00A~ŠðÀ8â0T^XÇÛ¥¼ï@jÈ5$Ïác<|ŒkW=^†ú8àK&—ÒôägÕÂA)Ûu©ÞüÓ_DóÖìàè /öP£ºâ¸Ò 0´‰Þí¾s_¢ü¥´LÕ=΂²œz»gU%xjŸê °Þ_à »W‚WS®@ê­¯ƒc¯ÇÎçàýØI8P>/ó³MdzÛ'‚A&Ãä¡®Öê¤b̉ E—¿xj*жÁgÕ_-zý>?—‡2Øu ùLa>CPJ€žEÞ”ë_œå`çyœŽ@N‰•¬eñšrc-ƒ…ÇnÍp½v¡™yLß“Õ 9 3>hûr(ðukoà¼ÖS¸ü5ã®z†É¦ª·JØ ZÚ·g,4¬öñ6|žaDuïh+Pç±¾·ÎÔRŠÝYû!'¥Å‡lBP‚ÕrWY«ØzÛã¡hÐwÖB@÷ÚAüë?y:­ †ÕØÒAÆë›°3†×Ù‰ ·‡›¿¶pìäMœ{;œ fa/ÄØqª‰x‘GýíBˆÉĦ߲'*ÊTàP˼i\ÍZ‘àÐl¬ßÔZtb”ùABÒQÔè·AÙ€~— Üuœð{ÿxI{nÁ§q>´Ì¿ø ^Ž˜~dw†ðRƒƒ¹U[¾škc5Ë &׌š¶êú’¥é ¶Æ:Ǥz€¤Á}Ùl]r“¾©ô÷öl°[å¿§« ^ºf)Í]$Å0/,TVJøFØ¢›KO¸Ô>Ï4É'é¹ívÂ4ááS³Uÿ·–q)NÏ­Ó8¬3 ÞM”ÿ#<Ó0[;Y÷z#Ðp 7o*p›“EOhŒ™}‡a–Ön}g‡YHµAèõNaŽ˜’­ë¸$û3;Ûr\O_ô7±²YAûiœC},gÛØÚWën%+ðãälº{¤ª}ã¯ä­í˜i#»†Ô¸'b¼è&êÆ4äf@0ïêà@ÀÊU€q ™§üñæï‰eA4Kå1ÎÖù”“>“°ÍïØ±ëÍ8Tƒ…¼Ñi¤"xHôâÉ0ñGñæFtŠÚÜÝá,YâÙsíué>é­ú{B»{;MÝkp0öÏÜ%=T•AöšïÐzž ½”·¯A˜GáÓ¢Y§‚ê8¬w©?vj‡”éieü©®¿ÓÙóŽX\‡´ê‰ÊFÇRꖭàÃlë.­ZãYsOÑÅo15³¼1Çà(™˜Cʿàô·r$EôÚ‹?îíÛ±úo¼„§´¡vg‹.^8cº%GÓ_š€…Woù:Ÿß¦0îÒ3[Œ‰pŒFÙ§Å€ÅÛF¿ôM½"ôâ«Úd§Á ¾» ã€$´ŸêA¥Ù`¡uAM¿Qå^Ùr÷Âv"œ‚¸âúþëÌbdK´f† VO¸'±ê…H¥SþÇo&ém:V§\ O3?î¼ùÐe÷·úÌþŒlyÅ»\+°?sñ¯Ý!ÛúÍ…xé,O¼t…:ÝâpÕÖojol7€º¸Ý&„’üê0“Þ¬£Ãzè°ðúöPvÈÞnÙúöè—§eU‚[U½]â¹áëÀÚ¯û)q|ì`÷¦À¢Ñ³Ô tKªú"¥Ÿ÷E÷.§øcZŸa‘Ã.8 xúüƒ­T?ØQzJñ³6žyá¬lG]è?ˆsÐu| :d/îdÀ_=ŠÇ<\1{-#Hz߸_®»QCKçÃøØ±Ç)5Ô=\kn]<¥ ü…ÀÓ£6 Rh&] ¤âá2œ:Qg次–GÑ=”ê(¯î!@êÑScXÏçÍQ¶I·™‡ÁB›îŸƒÁ[ÃÂ[ö3??ÊôxÆÀ[“#qmñPñؾãïèñåÊg¢Ç°\8ý7ž=»‘¾¨Äct¨kL⡳w/ þô,¯Ñ~( ðtØ]³×w:7žéjÏÞ,nHûþ¶«=9Çô—B—šÎ¬þ ñ´ûõÄÚ kEf Jµ=õ3Ћñi>O|ùÙ‹/c1¦QHèrŸ¡jÛGzB OvsðˆêïµT‰N„ _/K0³[#l?§Ã”>Ô•z­®Ü÷êšl/WаÌ#’+̇­€ð¢¹1ÓÁšJ’”žŸRÓÑÓ÷yè{^Ñ=ˆ_=ÁêiŠb,ÌD¯ÏêYg¥ÅßÑ7•@À‘¾ËcÉÌý. î#ý¬ÉùLvEâ‹eIG×¼P +cÐXÕtט} ¹æû3'hš1ú=bï&Ž´XmÛivôù^6² ÀE¢)agP5ÇVÄb'ßÍâr \&éóŒ8uY6ÏT’é aØ3/´ð‹f¥¡}Ô‡þ•t¸LpŸg:G§Æ«­ôÊ7õÏD8’ªüúBh¯ŸŒÅ}IóÔσ²jͼz]†¿Aá…Ñw¢Ô€Í¾Nf’tøùð^5ßj‘Úé802H5NNhB ç©ä®'¨ëEˆÔ̬_äFH/|!( L& nºµ5ëlKUô ùºSá]?ÔɞɫçbÙÉQí®íªiû]>¦L Ò;F ‹Æšµ5„<#3#ÇH …”úë´éý~ià*Am§œÝGÝ›h…o-ü¹ùþ~—Ö#¿uV¶þ¡!ˆŠLõÂmVi=!¿%Ùô úƒ¸lÄ6££³8ƒ_Á›Ý¥mõ¾Ês2ÁÀŸEs4}·3_šg¨VNÌ^'êNè_`2^Æ,½ãÄ´O0ó?.µ°NFýƒ‡°f^ƒÙécÿw‚ŒíÏ \›7ÚÙÔ°%éšñ  ™îòA1”诘xäU¸UÃRªRÁŠ×;Àm‰È¨þWÞ·‚ •ã°DÛ{8Ú’‘”œ» õ¾ƒn­ÛÄ%Ç»±ÂŒ”ê uq“OHP‡´› 6z]g:Îh!”uKF[Ñ¢éãGÑa:¼&XƒG¼\Q Ÿ/mèn¯0)6nÙà,IÉvõ¦Ž­§dßyKd·#¾û[©ù2Öë­2ÛÄ·JÐyþ‰Nç|À(·%žRÑë_港%Ômٟ눯‚½.Y4Ž\ãm$Dç M®¾¶‰ëf’©ÿ<EŸ9b“ÕV¾]æãñb©p/K8çÍH‡6÷:û¨Ø~œÛ£íú :Á³ ßR¥1ÿYØCçz¬{Æ$N›è5•¯ŠÎUÐ-i#¬>>Þ,>$zþ›ÇŸÀF[J:Ykœ¿ñ”à êT£çÖsq¶¦ŠÞKH£U6T=d†²z".ýS)N¢%%P~Ô…Bh·ÁSjÁ‰â»’„žc¢Ä­—®õÓ_”ë°‘„ëK¸š‰²ªh¢_,3@Er“-àSÿ.sLöfa‰ðuþˆ»—ãÁN˜íL_ðúõ)/÷уáðrž±ŽÒ+ØóoXv~ÏÑÑÅñ=’“Âqý›ò5ì_¨cjÙÞN i þIiüŽ ŸìyÜ` lÊo°)a§Kä„GØûí ­+Ýip’ºVô8eô…H’ûø,HÉÀ–› ã ¡ÆÌ‘¤¼%ÚÚÄÐÀ\ )¡ûýuè:dyW­MòúÉ*ò'Ö ™«‚Ä) Ì#)3)• 0Áט誟¦|3JÊ#ÿtÃ4¸ gx™²ky û*æd×ß‹«\ú‚“#r>ä¯8rÕ­lµµ(S^¢Œ¤œ(Ú2¿ë—Jc&nQL O¢4Ã`É%›ºR= âä£ð‚åP`_â>ŽÌå6/q a’kt×%Р¤âù^ZV\Æó•ð¤ gCí¾>ÛT>Þ@ò…;é2ÒVÐ~µÉóÜÕ–amG´ˆh¾‹KüUªïŸªp1OpÛ­˜'4¾—aF†TܰӇŽÃ°~Ô6är¯³Xmêñ­á¿yƒI©d¶4ì 4qpœ$pœ$e> “Ñ‚8iFô¥'á2^#£À‹~‘q^OÄý½v²7>#¡*ÊÇtsé”Å ¡zÌ…G³^ñÞ£¼Í:䥭oÛµl³Žöp1K Ñy“w[z4¯Ê§çòy–ݰ}çgMú œŠUI$$ç#b´©Ô§»ˆiiäÈ¢eL9‰1M²ÀÖÄoòÍ¢)~­Š<Ÿ>ÇRé(•Ç0,ØŠl͈®º°Èôƒ†`¸”Ü/Ü¿O˜âb$‰(ñ˜Ê­HÅi+×Hò‡ª¥’xÒÖs(½pî–rXB|ÅÁ}Haó,,ý­8:Úi?{”™Õ[åƒïë”’SóÒêok(œPð’é¯ÞpâE[)dÃŽY tjÑ®-Tx^Q ª“Tº¶Jxb†íŽýˆ!²&F¿36EÁ:ï!¼NV[·&v¼±êkÃ= º•¢×Ãá¾,WˆäùÛ«°d£ÞœÜCdz'Ãü*oÖh*ûìÉÑ©V,5\/›Á9•tˆŠufäìú[ÌÚz@®øoR¢‘Èr¥²GÎèiÅk€Íƒ¾/G‚À^-ÁjŠð‚W.~' tÖ)4ŠÊd;q,£­'þ²½¦êaq݆//[Eœ®Zœn‚©ãQÊ“X!Iùg´ Á{’ª#-+p ¯vH–š8g„„ÏkÔ$×° {„—ÃFYûA“¨~üË“eÁÓ`¾Y¡…zTŠÐ±P ƒR=Å !(THUÉð”@]²Z(VšÂ0>cßDDÓM<ž`¤®–F¥3Ò"SÍìÁt-Éôuå¥X{«7~Gƒä±~DÜæPm¦{®—ÂN.$#Éw ÖDjÒÖø«Œ›þ,®$q™Ôåß3*ªÔ2*vspœ¤Šb8zŒíTªÐ/ª¹4áõ›É Œ †W¨l@xuÙªzîü¾HÁ*̲’æTÃ>¸¸µí´Åunqâ'{GÁ“‰ê{9„î`ìÈêÆWu>¹ï»"`ûÌwØ}§“@Õ’@¿’ö f¹¤É^ӖŇ;4ôÎ^Š©\‡óùTv‹¬6¶&=0XH¥`mî®°ö4F}‹&¨¤j*?éB6)ãïÕ¼a@ó‡ªáúf©üÄó—Ï›°Ý;b“kÔœ|÷®}Ð~²w„W{x'ˆ€º£nügŽô¾Ó¸ P$zò÷IâTæµÛM „÷. € ¸B)(?©'ýtV~ó-WcfÞ¾åê’Q&»Ô´Užð6È#VûÂë•WW“{açQç¡ËmqV³à c˜KLwÍÌ–»Ÿ¬£&LìO•Þ-¨sH¤Ý[%*º¬ÖiÖ]%´ ¢ƒb%I¨¶®ßÊ—™íó<ª$pr#Q@¤EÎ≒3Qòc!ƒÙ/‘eóÃùSéø’@æ)ó F!d\'ÊjQvÚð<¯Y$2Òó0†F!¥PÐÆéCjð)Yã¸×¦H›–ûÓCnäN@õËr1øL<„L&Þ-Iæó(ã@¬’àCJ`8Y-µ4°›¤ìâüÀ•%¨iàiLR.l’UÕÏûÛ)X+¼•ªµÇOk»%óûbêò.x…ÆwóL$%AÑ0Åâ|ýr³°ØðB@zö3g`iI¥Š<ÇÄõ/л—2yØBÍŠŒÂäˆX|Xñrºúobu¶±ùŸqé“H˜Â#?•So~;pC½FU•g}_Px·NÅpR¿Ï`´®š§Úâ“aZ”³²ÝÕÌÓÕóóA¯ÔsÄWôŠ€N*ÿE?b¢$D’Àv’¤¹ƒ ׫BEÀ¿Ôg#ž @6_0âáNÏõ·¿<1Ÿ¼p`¡n4`³½À.93g XÐ$qˆå.ƒæ¯ d'^…c¡c\ gä‰:¢?°îàå¸äž@Êp% 3Iî@tõHý­¹øðž{:ž8ÌÀЋƒ¤FXZ·Ÿ_‚@B°ŠÁ’”ìäéï¼™“2žÜà0¨$™šOµºÑ–p#ÔÁçnÇ5 W¾ùÉžc„šgm—&!ðx‡ Õ-±ÊÛµç Н#nzöDµñöë®fne…Gþx7÷ÉÌéJ‰bºC30nÒfL5jí%7ÔH5ÛdZ±Î’†m ÙÌ]‰ú*/ÝaõIjéè'0Ÿ$¥D9.în9Ê»>‰'v§†UÛ‚ÙÝÃÖ͈E¡ÌÞúýF¶Š­;ü4p ¢¯ÒÓëñE‡=§@ÿHhùgYKüÅÝU`oI͘CÚµšŸþÄ„OªÁ1ØBÔ©éz†íú¨°êXý óÆ ¤]ÃÜOµ¹M¼ùîÖÉÙx×@pF‚²Z‚H'מ+*[u ÎRð¬$°¬_²Ù!u¸òÓÔ¥.þ8.©AknÕ÷dV¹|¥Û"£³I]‡F4Â÷ÃÈ—À{ºÚ3}Ii·©nS#âÐpéôË<)& Ô&«e(,©AЂIeµ{> äØ,µ #¥³¸!Ë p‰¯ )Ø,>‡L¿7}Å'¶ŸfÖ0>”iøF’íô‚Û †ÔZ·¡E-zäñU†Ì¼()/8 ä&«Ý“ºDƒ1Ø ÐóVa–vÏ+§m =OnÍ ä'éx 6.=âÝÚšÁùOøÃéDrþ"ú|TñmÕ`öR¼ó([•h·Bx%°û5x V‘K ö%3`#Y-T æìqò¡Pu wZÄ!šYtHäëþîµÈÉ٫š;ܳuº§Ž°“ÔÌ(i+ïó™R›l¯°=ªÅз¡¿MBóýx1TÈð3~è~3àfJ›%5ŽÌ·¾³èNdÀêá%ÍS”e#‘>=ÔÔ?¶6%ÔióMšYkÀÞvvØëN&@?S‰šhN’—û#B?ONà«c#†ž¾‡³J¡ÝGdjOlÝ“ÒÓ_…*’ \Ê ]¦N‚Â%F(W”'+}Ê{~ãà7šîJB·‚©ÛÁн^ªþ‘ÑZÁTý¢ ‡ÜÕanýƒÃþqƒvH}¹c½åcJúrÙ¤þH±Î.—ö¾¤d/ýhæÑà-ÖÀögt/À£Ïy—ϲWK;ÙþJ$%A / ÓèõØ'Ps¬–»E'³ðßèqånÁÐeHȾìgg³Y68»‹Ë Ÿ¬ÖñfºM†b)©3‘`Ä©DyRi”e¶ù !  w˜wÀJÌiýh»–Æó• è–ä[ ¯çðž¤Ea&íS [ÒzŒm¼GÒ¤ü\‚’a[‹~TXíérüìRÅIžRBâ NZ+é¼eŒàtÚ~¶œ(«¥½×!uA¶‘h¦öÎP3]Ò‘,xNåÓú·³åö[jÕCÝPnÇ« Ùjn€%uKŠnm£x°Ô†ù‰·ƒÔdµòï(o_Ðá›"tOéPìž~ ¼ý Gl(©# Øa`õIoJ„Cµç|³P`ºv}ȾÖµ:¼b9ËÔçY g\ÀÏï9 å®RŸUJ…¢;øÌ=ß*–²Á!È{Òønµqì£ Íuø';t  Ic{.AÇ’†ÉVQ°ÚÃ!ÓŽ :])¦(‘ž8 ØÎ‡ eWź‚˜ ¨¶þ¼S Ò_«?7ÄŠw=90)ù_ Ç”ÒÊ_æîàPI#—üõ°0W†$@|`ÝÑ,»/˜~ 6I#»‰øƒéÍ$¬Á_22oÔLÜ‚*%y j”4´´3iDheÇTfÇ às•H=#Œa¹ C$TUûø`M‰5 °:òôÇ*äH¢¬;óÁ²¬ó!p˜pCŽúðõ$Ь6»J0‚:‰Š[›ËQû@M/¸•ä±7<Kt”Pƒ¶ÊOïÒÀ8~rç@š²ŽãaH•‹‰… ·!{ÙÚ‘TÙÚë¼k*“Çæà•ƒDò¼¨ßýöƒD|Èo¿kEŠÓBµ 1IàDIƒ¥wÒ€9¼ôÎzGœJï$꣇sÒ!D7….âáÄ_Þè/,í6cyEÄEÄKÙ*f·0§6clÎŽÀêi( ë,q°àÆEÙJ\V9¶w¥ì¤;K³æ"ëó6R¡ Â&Uè¾Fº’ßâ ‰–âÜ„dî€rÚ”Õ4ž.±oÿy¥"z‡ß—„PîÀäMâ¾½¬¸{ÇT4¾GÜ‚[ÿí¹¡Ý5Y"Œ;É7ZâoˆŒ)vc¶³Òƒ[¥?^<`‘Éj)ܨLì$Êy2E<Ï%9ëh×e0K8ï4œv ¬MËØÔø¬çâ—°µý@¬Í‰~ ­ÖÚLTŽ4•Î^SHwhRÞ.Á™;…`~|¹c -¼ï¨F8C„U•ÐÍÝ!Ô-ùqj8½^š€ž¶0,ð4ý±@Á²3=$ v6K-gÝ &ÈDÒöü®Ý(, ÷ Aè‰7‚¯§ó çùÜ´£3ŽÎ ™;ÕÓêÅ6\]ƒ%!Ú¥ÚFõÚ‿E—m†»5{½nzò|ë j“Õ¢,–BÂüé“&ïKø<à/3RÖ_xAÝýW‹ü‡ ]%+ ûÇÄY‡À™s‡œ3AÏŸ#Rà©í¦oŠjLý+áÝumæÏÓ 4óÃhx†*ðãW–²ú¹ž0ÿ{«e龜¼>>v¨–\Ÿ )4G`g$Ì<Žƒ n”ÕVŽVfo0>ïYèGéѱµuÃÑ£'â.ôÔÖ<ºt¦Q¼¤¢w ˜fÙuhÐØoˆBVrm_‚¿Y‚&..‘?é4¨Ï$ µ ò·OÁHTölrŽüåΘ]vnïßñLØ îá*4Ëó¹nð)}‘žaÒ-ƒ% E)øþ2èPj Û%»ê1èŽ>çkXåÉ–|¨§H-‰”9—Äu/‚$^ð:-t¶aôZ»eq;J>\(NÁ‹6O…È(‹t—?`Æ\eE8–™ÎŸïc‘ó²\“ý¯¬öuÂX ŠÀÑÜ@7ÅE†fŸ?+ÁCïýF.dåA‘Þ®©ö?$ã1ò3¨IÖñÄÑè¸S\î4Ycff1qã}G7¾Éð²ÁXÐ`¦g0Ï@hÛ®O{mRÔ>¤»y¿Ä4?ŠÞ€}À—cöÜævµùAºÿkךè²Cz5ý¦ÑH€Â_—àiAÖ©*<žþÈtS§Ç EY-AjäI3[0ùž—L˜Ké,ñɧOËh…ßjò<ódgðÕädæÊkƺºcÅÑ€KþÎJTÏetP%‘“cã&K¹pˆº”ÜM6°¯¹ôÔÊHX­Mb")¶k(+¯‰¹†x SLsÊ\Ò (Ô–gü’Ž&Fø BFEVNCl¡¯à•XÖ3<çAŠçÐe°£ärèT[Ý—J›Wã9lQBÝ ò3,KØMòéíù(|%<åHá«ò¯ÓcD®#3BÆ.¡œ\ÎmWœmÌ­s–ä_^cÁ”>É­z2ºac ôëÊJ•¢­\â}§•geAùïÄ,“nT{ÍžáƒCz$‰¢·èK÷0ñí)a;O›À®^>f9乿l(”Þo²s5‚÷oÇ-ôŠç Z’ì˜å—~@Š9!Yn/ueiÑ}hü9óc ÿ2¿eN…g¹ß2ƒ÷(§à·ÌJÚ¥‡Üo™?Îô“!OTã…7@Ð]ì¤øÏÉ¢túoÝž“Oö BwRfås6y'uÈ%>e¶œ®Œ³Þ*Y&éÈR,`ª‡Ò tçoéæKÏ9³M|H>¥WÑï–¹_d,u×8ÑVÚÉžBƼTÜu–8àÙáí·xLV”™Q>Qwº/©¯k`Ÿå’ùq ¼Ï¹ð÷Ø…B:gVB”`®—VC{F¨>g/#Žô^¯€…¨}K3|K–lh F±ÇnMô¢ep›¬Ö|½dBÛæê3¬_ã1€ÐÊ™x” Š”œ!Ñ2Äc&%csËÇ3ÊÏÊ#®•é YQ–];"j®nìRå´µp@_v>² €þ7tܘ17ÅF.£¦*¥¤ÈÍH½MÜÜö¢ƒˆßJýÉú%éÇø»õ¨E­òØ<:FBÎY¢-»KM5…Ù®úB[óøöŒb2Ý-“3Äaî»Ç Óðïž\nd˜˜9‚ ×7Š•O…LŒyëdÜ+Dë¢<+í‰9À!¢ó””9Ç­ˆcàu”&9_bnóÂÂÊÙæcÞ{èT˜C…‚;¿Hg²º5´u³/ùp¢$N ´Ã¡k9s?ñjtØ€Ó¸çKV”ÁrYÌtkOùÑÊûæÔå !˜YU\¯l¯ÕÌšfʧÁ#“Û㥴Ï`DY-Ým’2¦µô‹–|‹·ò¹Smx¯˜pµžâ“Ód\ó@®ÉÌžËÍË•áµÉʲ·˜ê MñO½Ý`°\xŸ-ñ ÌG`îW;ð ì%x þìÑ÷e–m ÛFØF‹ÄGì(ù°£ÜŒýq¸DÛœµß¨ Γ%¾#Pˆ ÷l(X Â^wÓ‰%iC)¢Œ\À\¼†A§¥kû *'ëgÆp-¡2™ÛƒËåñ¡¶Ó:êþEm†Æí€vœˆjÞxS.íž×àËA*”êáçö)ÌO—‹Sfƒâ8å¥ÌUV"çeÌÊxØõ:q—G$ÿXÌàÉš ¬mÎ"©£®4žtñ3ýV`q'¦æÝÉ¥Qí§|7JÞØ<µ$§.ÁSTæcŠ–ùW%Þu'tt†NÏ`‰&>ÓozÒ{¡R.'ÁŽRç†t›$?ôáYiR@¾ ôø[îRWJÈö±eð ¬ãVÆ ErÉó©Ç«ïó;ìgß§Èj7¶µ ïÙð`Ž·;ík@ƒQeiÖæ ;¯Í3¹ir5žÃ’v #äuLO ÍB¤—„"Ά£™úz_29Þ‹k¹\4, p¶Ž!nêÛ;b#­9_òo'=gåC "¦ L¿O¥ÝQ! kæ/šÌš‘šª‹ê.ÔœâOÏÃÄŒºö¼sùu7#šf·€`«ÅÏÅXpýTå©·•AŸÃÒTqU^ +$²‰Çzm=]­\nö&èW2èTÖ/ wÔÌ¿¼žLÚBþÝYE8Š÷ [­’gõ˜'Ç3¨:Cò{Vºm-¶¡ŽŸ·¨íË´ [KMà L[?¬wö8wÆì>M‘>šUÐ*íy^f‹9°»d0¶d®de…ßYCU wƒð¸òzž™@•& 'Y à (RÔ°—lPk⦬7ƒ"%;E +ž4O7È HÉÕ‹ÐIcáÖ[–+3Êc°èÑãî¨:&(ËJÞo½Òœ´À#Ä&Ú,vbÂŽõåá*‡º)x UTïI ÌD,x1•t£ÒyÌuµÒnüƒº°ºÃvvÔ™òG-‰NZ¥I‘Âhá+Î×hjï/÷xƳ¿!pX²8÷S = êŒo[W z‚S&»‚lÝO{ôDõAÄÈ¿À>k\ÂV˜¤éD-8Á¸ÉsƒDlWV>àx]ü'còDx’ïlæø¦â´U§XÏ@Ùæf I$?\•Ø×–zÓÒdp¦äöæ‘ç–nZšÜR ¥‘ív®ã‰È6"Ržˆì–§-9»Kn^§i w¨åÄ•ê}GR&CáQ ®çuÆÃOžé8#g s®/On”Mã¢a&ÑÆf­©ØýUÊyˆaÖQ°R+í¯YL1»Z7½¿Òôï‘!­°ÍÿB_Ù' p)y|èv =ó±²ÜŽ_ƒ3 wÜ‘;81hD”ÔhЮæ¶M%¼T‚\m†Y¡&é¡1,w=áH­F`sÈŠb¥#(íÏW¯Ä5Þd»Þñ½vÑaëð.ýMÿx¼kà2ÉM,ÀØ?éÒoÞ« Þ“ÕÒi•ýBÿál¨g ˜Põ³î/ k€Ê&;¨œw"VÒ¥^>m¦hi0ù ôÚ=qàý:«Aè^X¥¶©îÌ%«•s†ÃüÎöß §5öep¸»@Ò5ȸÆìƒõ zaõ©ÚŽî6+R ò,/)®'—ÖÕ Ò4;e2'§š? þf¸„­éIXa劔7ðXoTßX¤=Ó"lµ|ÍÎþáÅÏçËõîï$·3o£'» nœÏ&‡qJó4Ÿ ýÎN8§²G|01›;«0[À`§ÈUztTpZ˜-Ä’ò) ¶ùl3°áÚ¤³ªqNþ‚¼)mð/’·Î‡[.i÷§ ðMÖ†LHIÿÜÁò®q)I$Êý“ÝÆ…/ÉýìÊ—R‹ •e…Áj©´u˜‰°(2è¡·#Y'Z4Õ{r›,ÅŽùÃÉæí*Z™iO¯MÚ± »Á]uvÖöåp/e¦èR¾iã{螺Š(|{âa¯BŸ‰…èù1PØ“†Çä*Ú³íÝž „TLSÕã㇀=w¤(}ò-g;[Øw[¦÷r\ÄÛFîF Æxò à"!ÊaÉÔË –‘èC ¾kW1+â܃Ooÿ /ÙìÔé*›•Ì$£g-\ˆÑá^ÿapÉÌ!íŪýÈ—ŸîùeÔ‘[J›JÞœ)¹Wžm>MŸ‘‰Ñn-úrärøÛµê ¶ú˜@íõ5¹‘»¸þ6“Üý5ÇŒ´xökûZtB®aV£ÞLyö-p¦äÍ™’»°c|"Þ¦àæZÂ’Ø)Ž~Í9ZȽóÚ½_ôÀ Ô¸ú^$‹®£Ø)‹q§4 ^?E»rïl)Öæz\Œ(OÚ÷§í<oÑyW*BÌ.ôHMçK7ê+ :”ìJûD˜'ЫL*€!kyÀØñbÄi¨D}ÒK•E¥cÑÆäþí/Â’Í|Ôßo?ÙR«œÛƒOÄñYbÆôØêD¾Že'јÈq;Ôvá vZï$wXž\9ƒWòÆó&Žˆ…Úx$x6»o“;Òk™g0ª¬ö²÷ïh¦ZsÏõ(=`Ù|öN°æÜžyx;æä/•Ÿâ<¿^ãÜ!ˆ3`¨×j_E¼ž–¢OÓº¼f¾åOyjï6 Ò 9UH,ÒÚJ(bßãÉv⇌vñä3lk ÄÒõv}Lß+àT)ΩBZ‘À ZH¡‹ä&EIUDÜfCH2”iE]O+ñs^@‚Ê çãàÖ Cñ:8 ˜TVkD r¦37ÛÁ[LÎàn,_(f×çÍ6Q¾|‘,šdû+mŠzÛ¢´)ʬRëeço“,Ï¿@=ë‚Nü¤7eZÑ¥d«¬¾3€8Ⱦ[Ô¬Ñ6ïN¢-k¶Ô©À]]¾Ç·ï: Ï5¸ÆA,dæ.£ü<ž-èQ-¤!`HÙ_âJ !ã¡°ˆ@€å«—‰IÁ€QÑÚÝ»Šþƒ6»'ºÑt²ê “_˜³bß #Fc¯€¦|nì­WÃŒ÷ÐÕ§[!Ú62m[>OÈS´#2uldPoà­éÌwâq¬.P¾G"²,ƒ‹‘óÄ-‹§T×±yÀHHm°Þ»UŽ…°;x{Ž> -(¨yŠÒ¬.ð RB¢ùž-,ZHV¯e>ž Hù$±Ñˆ€µŸ\Dhbò[:¥€ø¤lÚ…¢ˆmñ–ãE{¯ÀoQ¾àäTêñPç!—ò™¾ÄY`Ž°Ê‘NYtG1ÈB NÎ΂}6È“wy^KSZ‹°=Á†B–”&™/9ð’ƒ]ÀËMóåÇš!ëx^ ¦ÇuÁ§’ÃŒh©¢´*¡¨ÀˆxxZý&¦ÕDç%ÍY„õ‚gÒ)ôd©æ$¶pƒQ èP hZ r—W»w´É¿Ìå]à]))à€×ËÍT.u/ÆxKúØ:“. Dwèíâç,i—íÂná қɀòœáaªÐS ›Ú¸æéá D§ºÄI˜uéGê%H½¤ž2¥\®ÂÕ-ÁqzÔNå`â(93FñŠÑˆ-8ä^`Müx*Q ­³ê_m½ÅÑæUªd5ª¥ÌnÓ´¨^‚ãG‚¤ÝN¾2öÖÃMqŒªuÀ½H››à?w–ä&ß½”íÔiß C™W´…¯ÙCæÝù6ãTwóKÐ=Eêìak+× Je’'ïå¦N‘Xް$0ñ Ç9(É*ƒiýך[W¡Çµ‰†ú(ðñ˜)P$•‘EÛÁ­øò–~Ÿb ù®P²ƒð*0‰KòØ^…þà‘ëŽ•Ï I(qŽ Ïó}LãæêcFºŒgŒ!…ȹBˆxÊ»êio¬¨$H¬Ô¸)‚ƒ¥€¹¥€ƒeµåØF1àQ”heí3Nw¼Ï¸í½’[ÏérÙ%ÑÑx™GMmýeã@l1î\‘®•­Øéý±Ì!ÂÀ¹²ÚÊÙðq=a¡€X¦¤wƒÂKì½€–÷WÐ÷=²ÒQÌ®$÷<1ðç‰ðü»¹R— àÒ pÈÖ1é,ÉÓñPû≈•4x³~Å·ÖrÝßô$d+…)i,a9ÝÎEBwÏaþRbx="ÕBO‰Ç}F%Sè>A™¬:1Ôkþcƒ¥Ék¡d¢Âužïî}[`2Â"K~™tÑë¯9¼|\Ñ.¦›•¬}Æ®NQŠŽ_+Z¹Ä‘hnX—<ÚãrÔ°¥”l¹m á¨âõ}JæÓÓ )ÜósrÝ8ÃøÌ)èÆvŠÇž ¨{JNQ¥_;d‚ãdª@*”|§+¥FA‚ã‚g‰*S=f²¸JßGrãF¤Ë-93´ª;eØVX‹ïµ'PgµO ¢îm…’0VŠgWç³Ê6äÒ)Ù(>)MK†¡ÓšöÓ}i\KFmnýÃ2Wªs!&'(PÓ¤5÷%/¤$´èdé¾TLó<3±˜ôPßA‹AÝB†t)Jɶ“NÕòÍQÔy¹4\ýjˆ<öæDZRÙt+%W^ƒA¸éV ˆXJ [)ûÕÝJÏà€î¤Éõó>Câzk¢ò\5*ʰb{ýN€«±¶`ç}Z¸'¯ó€4X =®ÙÓ/¶¬€V¥äæg¼,Oõ„&“ÕŽ$ ’ÉK†lÌ­Ú9¿8‹ä–ÜB‡Õ¼s²„…Z(ÅUr›WT@”þGœehm‰{óø~bµŒ#ˆÖ¡Ç°•@[¼Ëx™ëÖ%‘F眲}*l¼|×riX†9‹Ú¾ÁA$x³dîX038^ˆFÀ«µ8Ù•nhz!x¸×ÂêH]®HZɃ­å¯`ò—ñŒäÁ×ÙØx"0#]öÜxûöcÎÂ÷cèÙ2c ¦bL1øSÀ˜R²|H½8­(‡ë}œlç%Œpo/!¼Sà‡>+°õJp.d-ôWø€Ý£O](å î7ã<ºK¾®“ú%_˜Úõ# õêµBÈꦯ<7JlÓY˜dj=+³Õ_m¶`vªã÷" .Y­ìÃËlágOINÈS0Ëá`M}¼Á1û(‡õÃK…Ú©ñzX4Y6Ö9/ÊÁ‹ÃÌÖ½N™Àâ|î¥dÞÍ‚9€ÏÓEï¶þ8®/ó°—”RøR¸)•¿ú ˬÓ>ÍJ)F9¡`öüÇâò ”Êk,–¯æL¯,eÁs•âEòÀOú’°ÄîPLÚ>•ÂWªü7F[8ˆ©¤àÒ?i0wà‡i0E™X6“á“™8$]'Ÿ¦”«H·.`YYí^¹®E܉Q*ÜQ‰/·ÜÍ~ZÀÿQŠ€ì4°"êöfN%a9™“©KA’Cå=ágUè[s’;&˜¬/þLDE¶J„š7ÅÄDË›V ³×…/à_)àg)…õÎ÷àÀ¨,æT q\^W„‡ÇëæÉ‰ÝƼÇx…BèLur½¾ô¿ g–iW¶ˆï§iÙ2‚;ô’CÉrÜÕ(®Õ>F¶”Ü%ª|¶÷¨ 1I«Y“ˆ&>{"uô£¿‚Tú|ÜQÐe|+kU>eÖ@§ó¼˜ H¬ÔÙ,ÚÚ$ßÎÀ€\[Ç’×éX Õ·b™œÛU¼Î)ò•b¦bQî•7dŽWtkëÊþQ+Ì+úERˆ(³yA¤ƒ æ*\øñ3×ýÙûbˆB¸â[)!Ë®1ØB9]p_4Z©BÎ’ ø×pÒ¶–â<,Øw…é7Hf³úäÈ¢úôºŒ=#CAɰ6”Õrg®˜¨5‡y ­¤f›Çd[G² R ŸJu¬‹¢a‹LuGÇ p%ËjÝìkïH™I«@Ñí .6Ƈ<&€M¬+Žª)¯×²BöÔeõÙØ´ä$ &/øR °)«Õ…7övïÙjj¯õ:Cúfç¥w²—¦H¬N@mfÉïG†“ëª`Vja‹W«ü>|ª45`:õcLgp‡ÿ0ú +ä_ ™ºLÁêaJ*ú››ƒ*Ïë:Ĉ ¼^&å¥fAo+[ôªòÒYñ¼Â@ið"%¹+`e±X‘ Ú|@ h)Uxz÷M·rR‹Û­T@ª…b°t‚`bîÐ:ãN˜gæÒÂl h¼¦^‰@« _8ï/¨rK©^_¡(aË€¨íï]ûÅvïTËÓ)ä›ëSÀFP”·%ª”Ä }…õf´úöTë r©_µ»g1è­Ñµ?¸"×™{$¬& ·*–¥n¶7è7¡¬_h(Ú.tUó<’K²TÛ÷IÕÒ%V5¤«Aq|b¾Ðc‚È¥T—}p‚Ñû Œ¥þøìûS¹s+MJzW*ààWY­Ê z±XН€·¥8"Vo> 3°Xâ9:ŸW£èv7IOeÊj“³<–:ùR¿ì¶¨“çÀ?Õ"U¡.ñœòñ Ûë]”ë 0Y¶§CPÚ{XÇk¾n÷£þÌ}ìWÞ,J ¼Z0|¹`PÜÂ|Ñ•¤L-WØ@ðú¾ %½~#gé çúOŒHÀ ¦ß½…¤DvA°µ(aËÀ_¸•§7°ß”S[–Ëzð$çª+µó)ÎUWjæ…{?€>…PãÁ0² wªœZèT‘x–§Zæò Ë’Z3xí‘bÃÄ”ýiUù S ,Ü/ëvQËj¦C 1Ÿ¿þØŸKÒT8Œºà])²OŸxÚzO‹‹ì¸Ä'¾¢ó“!rCJä7‰^}SH·8×!ôÌ«¦«ó³4©"Á5[ÄÎOêõô ¨ZмõôŠ…s†Ay‚¢\:o]àáóVQä¾_îáô…åëÈû.å¡þA Ø:ñIü,à¦X†å#òîMŸ«å£EÍ|õ°¡4ë«Âó£'ßf#À«}ÅŠ7£Eëx¾n€‚÷( ‹ Dì’rîPêi6Cñ"¿”»eÍýz»3w½Üš”6—‚Ây«mÆûJõÑk'>Pò^xž8¸,?{W÷bcŒÓáM=ÜŽ ’ñð4ѽ*fV…ÙhÃ7€‹•nð‘¬vqçï®% £2Üø^{`õ?ŠŠBz8¶¶lé@L[HÝ2n½ µ^5o„>/ykh6 ®¥A&—Õ¢ÏR³»sIŸëqFÍJl²Àç¢þñ·bBiÈMdd„d>ÉǨŠ[ÚÖ4ÁS@üR€g]-íW¾”Ãç‚."spÄ´–uÎt=ÉÒ–Zd]Jû[þ3°ó«˜4¤?ÌD R˜ÂRƒiImaÒêLÞ%ð4äÕÅÅðf¶L ØPVë*)ØGJ HÐ"“½  êÕ ŠIsÍœ–ó1·Žïæ)*zÿ¾6H¶–åíen7X´1éÏÊŸ}¯“í-iù/›ÒB¶{i%ΖB©š´à~€âc5†r+ }ûq ´Âsß]Ü#«íÇõA/2/ݾV‚'\ÑNVyêß›ÞP(üÛÖí{yKEéoõ¿Ùkp·ÊãèMåÔnˆþµÚ|˜±ýnÌ…–y’sþ³Ñá ùžŒÃ"C¡†)¸R[pÏÒˆl7…' –ã|Ñ,W¡nÖƒ² oF­¤0«Å–?%Ë]:ÎíKUj0ÁšY† N‘ãñ®ÌÛ½P‹ÊãbZ*oµü ü~;¬žŽŠŠpY=Hv=a2e€o„}4/¥ÁÚ:! £)­»w-âPƒ`¼Àr¥'£‡öUÈqY.uo;­[o¶¯kÙ«Ñ!u¦ÒaJ—GëãL‰ËɪÄR{iÁ¦•Àº¯Ê3„÷_㡱RöÎ- («ÝÂ¥0‘;Ϻ˜Bnû©ï¿ ¾õ8÷h°ò®ßèVÑpØ9 Ñ¶ºeHã®I¹ßh›ªuà®L8C_ŸòdW¥9Ÿçú7ú÷òy–6Ù/ÈúK%YéæîE~aúçÞOë/¿YQÆ—k×SIéÞ¬€§œˆ¥Rå¹N_UÀäUÍå-Xö º§°AwCÉl'‚¿Þˆä3“ô¤j&ôƒÚNˆl¯3ÞýeÊWKøF¿Ê£îí¹§Û7£¹Ot”¯ß4ùÝù½‡ }«sf1°†«Ý%ªÔ7â¥ê¥½—ðîn¢Œ3Úb|25<°ËGoí šS€Á¸¹}c(Êô‚"ζ³N:.ÎÚ¥ Ð=D¨&áïRéU4-Àw’'¸öqVnÎÄKt~\~Q–j`$Ïžàžwîðu"$W7ú „B®÷zéîmø(9ÞÏ­î0EÉÕnÔ¢|þ6[¯#F¨£a *Ÿ€·Ýi½ð/‡€Š§ô˜(xé†3:&¨£ç™I €úë5·÷Ew]6†ÕÀoÏ·0Õé86:4¹.ü7ºÛ¶ ™7‰t)¡Ê£n3XT+ÁË èýk¿T;]ç¶#úÍ–Œ€“b¦s ƒóô «¥‹±ÃjìþUo b¤u‚ç$ð#È©aâdö,5¥À¦nÃiÙg ÜÐÖan'Ýæ†BñÝqÝ;»Á`ôÇö1@êL¨oïÌ'Y]t<"zï׈ÝSKï_ IŸéàíŒÎìÎ/½ Ò¡C!s[ÕâåÙÕ;ýVÈ-ðV­¶ÿ)+æ²ÂmtÔ¦ïWÉu!Œk½Ô!–Sqw#²Àß;`Žï lÈÍØqôu˜A¿6¦Ûù`…)ãóå3’éj&âuò¨<à…Y-ÂFjSY‰?ƒöiýz6ñú—ˆÿMÉgpʈîßãFÒ N†9°AjÐN¤¬9•½$¤ÒÈ®‰ªÊòºV•ùE!÷Gœô6ÓsœY,n[ü­b\.«Uã¬)Ô/à)Ó!p†Ú2`­æ—¶³]5ñζ •ßÍuÔ|¿€zà)Nù÷ûOªô·Œb¡yx˜®Î7@L'eÞ•"›!‰@þ‚M5º5^ "Z¿B8c ŠJ7äþ[k° ÐqÔÇ‘ƒU§†Zé€Eþ—Bþ˜Fð'ó^µñ ^Äf›Ðëî«ö –g;T8 !‚„C˜|ÁM|1eˆ§(ú¦ qV®®¡â 0pࢱañ¤4áû(uôñ”>˜æ@:¥2 Œ«Ñ’%)¡°Qu†ë˜Ü0oõ$ûÅYZ¸D#üy×.JgÞ0Pn>¤†%¥Qé‘{¸•‚_¢ß2Pƒ=ìDzr\˜†Ã¤?¼zkWÔwûMªkÀÝk>ߣ<^2~"… Ž)¤ƒÙ»ñaƒ1ÍýÔÓæW„þr|‡ Ä)gÁj®2ö.M5‰œklÐ9åµEkÁZär*IEÊoÇùBý2Y|ÂSíæ%íJaŽçmL.!æŒ>¯¡¾”ÛÁ¡ÅCCQ'â(D1«mÿNÏë×TO£²Jÿà!|ÓÉ#{IÁJ›ž/¤½Tb’·„:®°\n'iCѽuêñ‹fÍœøøÉ"²‰ÿæ™è¹zNz(òö)°¿L”ù±¾*í¢ÞEi¬!iW`²Ì›ˆ@‘Þhs8¢Q„½ OL:fê2fµô0glTð–\[2QÔ¦[jfêÈwÛOmöÈ´=á…|9eB’MI0·¬6s éý¿ | Zó/‹ê%%J`z]71 Iô8ˆÍt2dJ«e&Û„jcBs´"¦– ¾™ïr¯ËjÇ?"ŒqÎûå€ñ9…&ÕøRf„vL{ýÈZÕ­m:(öõïÂwS‡JýB6ÅT!\s m bÏË)â9àŽõd¶@çnÊ&096#L=Þãþß&Ü©_z`Ä2õsÏÁ®ñnhõK·£·*ËŒ¶îè­p×ï.j+ÀTlxBá˜85•ž;ìYQl¥~,¡{6¿³qöß¤äªæ–¶WJEþj«íƒõ×¶Y?w+ šŒûa1? Ð Æ—ÕÎsÆoéÅzkiT2õ+ùí_á¯H™Vx~pRRɬN£ÿn(¯w!`Ìóy’â"«l‹Ìj㔦$¥gü4aÂK59}Î2 Oç[›¡‚Êeµ•³ ­üß‚ÃúqÐEÐN6ß<âô s±W\çéóÚ¹¤~AFý‚?šýe§MÕŠô$"5:ûÀœëGh`ÙKWx ^k¥À{iaHUì%'p®ԪGë×衼SHYÍQË2ù“@¶ÎrÂU‰gôRÌ.àV8†‚ß[X|•Gââã„je©šÙ ‡B”daõ3 €3^Õ#0Z¨E÷8+ÊõJ;>¯ÒñøŽ)¬XÄ{¡„¦c×u äÎÜe „ªj…ßa5½-ÁÉs?=ã¿1fããØé’®_£lD¨¸?÷#¢0…v ëãñWhò°¸H®ÑA¢³þWÐÌÔoŒwCìØô:ðÑ·KD§t¾è-­àf©ßC›ŸŒÈšæz½Ó1i®¯ƒ7=£ëp;£<«­S8[Ï’™è:kCkôÝ¢j²K¬·;"RA-SÓ÷î|éã¯{†Os¯L‹ìM_ëMƪ ™©šµéJ­f¿†ŒkròW0ɬvouÈÑ«Ê03«²€(Ãq*¬05yÌn êÓ `Ò9^¡‚r¦z’ª´¾¥3+Rý–]„ âÇp`º&ˆÄ¥Da¸€:¯‡[¿|xœ³N€í¸¹­žP5Ûnz2noò¯QUyb¤{>µºhŸW˜ßq óÍØ{Æì2L45AÚ­õciWήÇËU±²n.ƽé#2á³bû[‹´þëJŸº ¡*\ÁBSSáíÙ§É!-øÄ–¢>˜%-!G°ÇI¹Ý+¨ÌXX±QoÀÛ`Òk:çq-j]¯#³¾èÚÐRG²V0ÊÔdnê¡üôoùñªt$‡Ø½jÉ,mÁS20)$ñÝ*ÞZÌ~© ¨©)`K+Ã5‰Û/Q5…R¿<žG<•Ù)ꋺ›¬!ŽHØšÀƸÚA¤±Ž·'fTAISS “»… ÑñQ"a¹b¢*`^Úå‚Ü›^jnz©Ù¦'Y(ê¸è¹ì2\˜Ù“곎ûW=»§#kIT%¸Ñ¿îÚ¢ë@ Ÿ¡aÌÝf]{†¥µ\“×c0°•wãí Í΀7 €ðRîVð½€@*ôýü™`1øƒÆ®ZLò2;z"ÚÉg÷ ”—›½þò¤CçăÏÓìÚ‚{]B§=oŽ–ìñè'z‚s‘TàÄiì%v‰3'Ø­ š‰R ò玢Մ8U:®M`jV¡‚wfµü·v*´bAaF0J ¬5ÿ†øq¥-ɳyR…ý¡{}ÞVáŠt˜ÊµtVP†ÌÍŸ6+zjv•Uw·Ñ÷ €²g©7–¾˜ä…š£-a²$òfæ–z’¥™†\«tÓà±oI¹k„(¯Ûµ}óŠﱡ©v†fNæã3~ízí9dM˜!p `ðšÙÉ_4Ûå5ƒ•À&L按Œµ4ñƒð3í@ó×C[CÃÞ/<´•nhcn¸,öX3Ù“1*ÁLB„;?–'ècV›ÿÚÒÈMS5¡'Oå…m4.m]ÏÅ8¿ÐÓu¤#k‹r<55{Ü©z¿ÎbË—/FÙ£¬9ÉT'§á‹=€{æ•­³ê± -Éäˆqxü*éiNg!e3—‰H3è/¦ï{8LUššÕ:L´ Ñ¥YÒ1¨7ûgY®Yé?ߺÍ5ÃbÌÌ`©`·É7á½öDƒq›=5¿f¾º–š)³5[^¢h¤#z QŠù’gª+Á«Ü©™êüøPö‰Ë â%“züÇ|Û½r;׸‡™f¬rßÍxOð>-ní /©×ï8äÔ4?ˆPäî&ðh‹Çmù˜ùí-àùs(/“ÿ³*Ë@ìnß™±lü¤A3Í”ÎÁ” â¡+±2{Á5íÙùþËuÄûÕ‘ÖîÏ-xÉ«õBW—H-C¾ãk‚˜ËG%Ná²ý2ìÃ<œ“¤"˜Uó•05Þº<,ô…‚Œ:ZM ³-špÐm¯‚!83°xýn©î3~öÈÂÌ⃠mÓöót´|߯>Gì‰ÚþŒüò  \ÖIõßÎ4z #W$òlËî*²Ž+–«í¦b8s“Ÿw–Ž& ‰© dn‘Õ¶‚¼xž2XÂÐSñ— ›´¤ËIô)ÏØX¢ÿì4³|÷Ö]„IÂô×–à“»[}æí-"­¾ç@‹ÉT(Õ OÈôòúbˆ`Œ˜F²÷mà¸^¹c‚NFëýÛË#¾„îBk€¼ Ù•ëkjb¶â½#Y0¥XÏÆûñ%  ¹Ó¿\˜—̳‚0»Q-¡¾ë ã$n<ÕCc ñ{Ȥ¶ WHkõ¨ òf€zk=T°¦¬íå©€…%­ÇIH¦a3ºƒ‹µ@×ÿbsüО\E~x¼»ãõÌ›%{ÐÆ®9bêp<ý¹WVHÄš=hScõŠÛ•ºûîëmùÒDŠ±Í Æ’³(P:âN段°}*WTàTx…ò}Êë}‘¹Œ[þåÄ_¿c óä“*õN´yA*µÂÑúSS¸‚½¦®¯Áñ‚ÛçMI¬5ˆ–šyȱâµ"Â[­2Ó²e´îV ‚Êlíùµ×Ó_Tý32kVÁN³Z/ö¦@ч隺ymPNPÿB?•áqL9{_?º¦•ƒdÛAU…Ë ›ZÍæxúò§©e¹Øtuȼ›4ªSÕÍLÃí ¯Â1ǵ7ðC/´}Oz9üZ©Õ2áï±½ç#tS¬×Ðo€k`}®«B‰«f7)°\ĸq¨ çž6°bT°þU’Øäí«ð´T¯Ö[+fjÐrı]U£? š2B=՚ƛwYA]S++’º´VÊÊáaöF"¦ìðòtøÀP„øt ö“ÙîÌÛò7k+Ä+D\ýÚ¦6¿çï.5Øz²rµl‡+—b¨Õ±Ûº¥.µ¬Ú|ˆ47êªÝr+×>¡h¹é…*¸nVÛßb²ŠäˆJ‹lÑýÝ烸ߢ}-ü?‡e¶Áf*$œ8~+}qõà×!¡wˆ£IH^UÕÌkîbþÆ4 š*@•º™ºúp‹<~öR¸î×U{p!Iý«2yd0Ü(‡Ù“ûPûÕ^Á!T÷06Oi¼ÎFY_ºú›ëorƒA”ÎF<†+é¶7ñ&…ÁžñG Ì4•Tõ H×y^$$`(A^L3´6•ú¶ÚøH@•³ªvõÔ‹ úS9Sõ]¤= © ™ÂÁ#ÿÍqNu*›ªùÔUB ¤Aª:ë\›wU°ºíïíMÌ$}Ð#¶¸ÕJ¤Ô%`BàÚvw/~¡âê¤ÏÅ—AC•ä“6Í»aôýŒŠ'øZêq¥áÈéfuçÖž –몘‹{n4Û‚FÙÊÉh“-?ê:÷£4ðíì¯b‚ò£°ÛFÙ`äÛꃱh& ‘GZ½ì,QÝmW[åUý8άêB¤ž¡§{·$Ý+ë§×om“žcx–Ñ©ì“`ÓÕ}oD¼.™%(ð~‚ã¢!ø| üêŽð±{b¡ž ܯ£m4¡ç©sžÝZlá¯uÏoØ.ÇXs~‘]èòE6DöZ(ÛÀÞ¼Pk6Uµþ/ÙøoµÈ Á,ªîZ`+'¶AF¼T ®R‚ß¼65ðÚè6µþ¾}Ï…'Qù9LmH"á cÃõ_t¼»w <µ…ÆõÉñú!‡±6„}[Èa„ìÐCž¢«Â%¯¿¿ãAjy^X=¡1îWtn=û–ZÄÀz»ÿ–ïÑA@ü»¶Ò„Oµ‡MðÉíãÁ>¦ŠGk°3 ˆÌF«]“ò³)Z€wÇÑ‘!÷ø i^4µ¢A +¨ÃT B­MUÕ!±9ÃÕ)ÃÜì =x:jÇ'éfý1k9Ýì•Û‡ÙY=¤‚*§vºQÿÍWèÛïæ ÔôðĽyÐEX„ZQ,Qó¿Ü'úûʳí2¸ßïü €‡w9Óªä0Ð ãBà¤#4uêkVôÒÙÌj“oÃ=?s7ÒoåBl/foNlåÛ*(ñz9•Ìæ}:ï?,|èÃvøÄ ½`n{ÓðÞã<¨SÚt`.¾4Ÿò±k>ºq"¼â^K½ðÉ$ÊÑ-Ÿí‚u¯_¯W÷çFh³s8ùî• ðÃÔ^­„’JäV5?!µ" 'òòªsÚ@Õ µªaBök 佼ޤ'G‹±¿yK9b‹`[ÃåìÏ…’·ç£ð:È¿è²KwÊ7] Õ93OQÕ¼‘+ߊ–5ø0ò½«ˆ"×¾Áx>äŸòÄ ›ÆXpÇæjQ‡¨é-Àf3¯'j¼ïêù¥˜¥C uâŒ5ÆB¢ê¸Æl½&Åvc8©Ÿþ;]ណ¼ƒzÇÀ)£í)ü¬9$›ŠUPº±v Ûé ¬œ®ˆâ£æ€¨vìÁ…É×U ”5«¥bÑáí—àÉ©}~ð ØÐ߈^d©û$Ž‚:ß:8¨z¨-P½ ~gX< ÀY-wþ™ÕH%&‚ÅZÂxBæuÙŠzH=¤tâë0ÛfZ¿R/XV •°.Wóa­âô6U l¼ì±8êÒ eo€Žep+‚muxQ,õ„„Ç•JS5ÉÓ ¬Y-O0r‡ ƒ5xÄY'ê¢sÐÓf°õ¾`ü3'ÍúÑ=F#=|ApZéq[°¾yz[hdÔ:o$£üÔž#][9Äå©:† ìÉ£¯¨©ô=è0ýF|ã|#Ôpëâ a¯KMõؽcâºàÞSÁv£¡µ½1æÈ‡sæÇC3 Fùé/̽±«L¨BÓÍ‹Ø5!Û¾Í*èÁâexL†§ª`£—g¬øÖ{MíæêœËË‚Paý}£>× ¿‚´"V^äÞØr\;Õ™l¦BæQçqKUÕð.×Å@Žî0¹wÈ8M¡e/ñ‚™@é¨ZœgM!íò=°ÚÁy#g±ƒ>ÇÀ£òÎxKȹ!Å(‰Ü—ØþxvfÁB”Aå IøJÂÖ$ˆ Eˆ‘³}(mM;ɤ)rƒ¢€#¤ƒÕ†å 8¼Ë^¦PÒGÈG%U”ä:Í<©¹`‰‡<q‰ >z{ña ÞkÛOt¨ãò-þˆ‡ßþ× 8ìCG!µÔ®P+p{3øHÀF“ÔéȬ_·Úhçùo ×®´Þk–7¬Œ5'ÈsŽR¹!±DÎŒ°R¼H"q@lDœŽKi>¤ö ˆlêàæ­,$½Ež?hklpÑQÆåÕݬô²ß•ÀN¾¥:†43õÔPÅ I8\—Û©ûÇ(æíúG8ïTOÀçÍ?A´ˆ×¼¡ê|Äh:´ÐÓ´èýѤg{F´ähAà­Yí½?OœùýE>·;ù\=6&¦›ôˆ:•æt¡¹…•3KÑêüžõQü´Öï•ß+mVÛœ™#h™L8?©3¹Ô,ǹÎÊv” ØR°©›nl/Epa‡³©¡],±…ñô´w!™á³P&ì»év_Ú‘€ÉN“±´¥ú—×¢U°OsW#ò…pèiêt`¡þØ…%œOѳ:ù}/EæëðϨé/Áv3Íj¡‚¨02]×(ÄÁ¼09Ë4ëàuŸÏÊ–¾ñ É<9‡ ;g-øëFÍ“v0pVKÛØcâPJØ 1 œXÁ‘³ò8qôÆaÄ!‹¦„E‡}xJA€Ši !PA­CÎeª3hë³ôªéQdYqœEÜü›H þ¯ ÛnZ.q_MøúfKîé‡ÍÅ5뼋È!«Z#‚ÀÃU½jd˜;Šòwµ!ØTÛuœ?(i³Ý6XhV ¬¥êºðìW@d¥—[yš@ÃÌžm»Òfç¯Ì³ž·3x>á“Ç!7Ý%Æê"åD€vØeêô’å>|WQT­È³AA®1¥é’üš fGfôþhAQ€¼)SWŸŸMí|žyi¹Ì(ÐÏÔ€‘à¯Ó¨¡÷ÔþCIGß„Õ693Àãw²Õ`MÕ$ß„>ï¥×D‰N´^GÿC°ìP0%ú,ÈÆ{hxözvª—  +ƒïvêOôgé%å¿Hݺd´Oô^@b#‡žfâßí¦Ð6äû|t WR6m±uÖ_EÖvìÞfGÑ(_òxšúÊä‚mQ9“vð²¯%éêNªùÏžÙª›ýÌŽ\â°?±!(!Í1AcÖ!Y½­-á2â©pc5T[Y'Ôûžì{6@l¤‡0ðy†„wñÄ ;³Ù¢¿†ÒëuüÁ,-¾nDfêc^ý+è_¡fš± mk+«µ›ôHƒ (|ÅêCU$¶ÚöGÁã.Ê¡YÞë/ /ÊT“Ì.Á¨tô Á ‘_Ù"}:<ÓÓ<,Ef§%Nižµç1–° ßÕWàH1éäç±…€ª\¾=OíÇL0-Y>¹t?k~AßÌÅ”> bYmº=Çe?©q0¯€˜ ßÉ]Y"î䈃Œ»¾©à^,æÄ;ˆT•7$ ¢‘µî;Ù,ôOt¢U~AkîNæšV1­¡p߃‰Ò”/îJ /g~»‰âÐzüýªCš™Õfë¾›/ç R0Œ3‰;[ | ¹Ç˜~>ùœdQ@(cµŽZ<¬Džfr}¦ìÑWU+†¢Dùg´}’CîNú¡ ¢}›¾aý{pç-ÂNÜxärNd+öhxΨÉÇgxÝý±K ï lB ¨°ÏˆÒB\R¹;¬3å•*£;›¿Ë|Ðîwùæ­#ì5²yüäfÛR&}é/)“>¹rI™À;£ý :â[‚ Ú—Ȗ·ÖÖájÓãŒ0Ó¬ã®z§aDœ?ÔŠØu<¿§;ØuÄ~lí6=Dw‡­«FZ†­õæÿ±­-BT-VÝž{\ȋ囱p+È®ä8"¶û¦*«s*ëÙ¼•Å­rªìg{_(Aºž$²°©Í0Ôuj¼/est7’8è…¿«ú:ͳ—ÆÓ1/êÇÔMŒ$¯oVô`?‰’ËÔ“¸|¾,²FGãCê÷ƒ–D£¯°Ã…-æJ¿mq‘°‡³†4åAÁB I—à›¼•íšiýc Ër/üzoi”\î©wàž’cÞÑ,üNfçÁÅi£T[ìéÞ:ЖR/Aê%©}±þ ©Çº|þÝy;rÀZO]ä;Œ‹HÖõ8H4ÍÉ:6Ê»¢š.#^úk_S]\ê?ãK¯ ùÍXùSç;€èŠ8^V»—ðî®^Ü'àvÁß¶ŽxÆÍzWqŠžýä^Ùþ;a»‡˜ÄuF3ТºÚ¢Ó½Ó¥`i7À%¢$Aj%[=¸Ä+y¶ä³‚”TÉô$½uÞ'ѹ íE07‘½3ý Ÿ +°R¯w&?•×/PðH2fn¦¿¦îºÈQÄ©éQ–ª}fÖ}Ói¹`¢t3Ú>®Jp¼XT¶o’=ñ+ Èbä  ÐOµè¾(eEYo´5í>A“ò°&r¶Æ“ú  Ym>g ¤Ä+¨¦ÇMÖ.”ù{Ü…B)qíפëÎ ŒÞÍ-vî4Ð2Y­Xo*ƒ®õÞ®ÀÞ”_¾uɉ¿Âq!Jf£¹®¬4„R}*¦u:{© ëŽ rÈè…7oN ä³ 3P²ã<Á‹P½3CÊå̲ŒêOïÍÒDáÈxñÕ×êj9ApC² Ù´mÇ>ŠYxî$gÇ_´Sô7œaxoÆ8üú[fòÿî¤kñ¨°Àû…`Éy*XOëÅD_áj „\”&æ¥^[y³ÁW,£ÂÓ§›mûë:·€ôG²q“Ei 'ȇgœÔ?,¿Ê;m©GC°H›m|ÇYRQ#ºA>g‰èxƒ}Û3K6„‰É±ÇËéGu¢Co[htOòåó‚³â¤L0Â,ðÓÑŽS꘭ŸâÁUMþDtÒoÍË/åx#ßG}éªè€8ÏV°ûô¬çëA扇W ÿVx@W\g}®áóÚ~¥¹bª³h/ú®¹C…ÖÞù>ëKþNÅotÿüU³äÎE§Õæ;cCîÌ®U‚³E²¡[:k9VR4ÇÐn±…Áª 5“]’MصŒl• ð!Há‘c©”_ð“(Ì? Øf$C fµÂ‘ëüËM¥ »9Û ²è(nH-šmzDw AŠa [FAº` ¢ÎždÏNÑ âl×õz–€Fò‰j‡ÕÚ> ’¬Ïq1úã¸$³/Y1¥G2&A Ù ¢|8zèvš|o|è;6¿å™¤@ð„ª]wr(Ü¥ÀÔCjf@ž@íjåÆH)?†øXÖñ´ß¬á/³Áª ÛSéô0{#Y«õwéeíß >Dôå)“% õdë;+%’##Ànþò¬ êËË1¤@6# ›æV[ÐÕhH¤:‡ ÕMQ=W:l>±t>°ÙbŽÐ•ñæÌ0úoŒŸ)]%ƒ´]¾ææz–¿eÙ¦UáˆRV˜‘¶·6rXaø!1Ü?±…S)ž‹(à @ÊÁjêgŸÛ›‹d‹"ص®pø…€ÐEŠçói¾G\‚]Ê]yïq³^Ò8$™N_„¯ ϦӢ!c<(ò ðÉÓèaU][DAÐÖí8PW|wé Íü±%QxëÏ—€šV îh8Ù) •½õͤ@æ¡fQ„ÇðA…=›üzþ§.掄;š½]ùÊj‹ãÏm#ÌN:øX×ì¼hŒ9ŠB:¤5³4¶GDSô¸Jsià Z9؃X©J@Fò¼é·™g¥@8á'¥K$¥ñn.H 7†~ùé­ÝÞ‡jjGW¬ê„fïúl»ì©ú"`x‘[>-ÚH¸¦wG 8Yþ#¨ ŰŨcí)ðiþJ1o©LK)!¥]@f#åÊ?Ù ÁV±„¿Xï÷NùÀÕõèã| §ÙXȬìó§|¥Ï…ÐÊŠC\CbÿI(’ú±M?›8žùö‘Õ¼e$ù3ª õòc"ÊZ@#Õ‰ª4(†8W\éHÀ›ôTlŒØ 1UYðÕ¸ Ð"ƒsW®˜õ(ÍJž©»:o¾cжá>÷‹„$QDPÛ𰘦wí— sfé JÏåjÃB„Ù“x¥W cÙÚh ݧˆþ¤"¦–©.uËðÒÈa{á'äï¤Ô“ÑŽ×éI‘(ÖpuqÉK€”‹ŸŠe2|½Â… èW¤º£óèØSº–PØÄÒ¬x ¼VñJ÷z…«ó„îT8¯ÕqE”äÅö„Ç ¥¼Dù]ä°fF£‡!V¥“àiq‘íÐYµj† >à„ƒ…«-^¢cÍg~šŠÏepq?¼µÊò²YWªêõqbV:,ËÁö ¨UV+fð=¯É0XuÆuÌtCjí|•M0¸H5™‡Ôü“C3ìÍä@r±T+„RPYgB*¤iu\ç:‚på *3|º̶òÖ.1(=˸ &qgZEtZé\jÞµ;Õ•¬(­K°@¶ÛR©]îý”0Rû1/˜&ðS Q”§å’ o1‡UâÀñû 4ìd´íó{¾<„ßš£ÖîtNüˆ^yk®Å“˶&•úN»Á›<PR¹™2]Nw Õ·@äDÍÃ1|M^aûšªW_’ £°šk+%dàÞ9ÕM¸tÀvÄÂßž\ Sâ-Ô+•"jÇþîrS¨ÀáèÂdžY.ç2¨»ŽÜ!8PxÍÏÞ:`–ïþÅ=ÈèúñedµýìòG¶ÅËC' pIœÒà@ã mø&‡„#Î#æøÝ»þ)=8•x’e-kÒ."AçÕ5¥?${éÉ艣9±£{†úú-LN²KrºùvÌ/¢ñÏ’Šüþ" †*;³)˜›˜y¤Ð½ÌÖ£|½x\Ȇ•öªøÐ؈5Ø5®Ós» €ÅWKkU2ßc_ø;w;°Ðˆ˜ñ ‘-{LWÖ BPN¬xXÔn¾’ý:B2P‚a°oÕYoÞ(6jŸ;¼bãS1…¢Õ0_WÙ¶ö¤ÒÚKŒHµ0™+F@"#§Ì¾(§X½`À‡ØóEñ>ÖØŽý ù‰e“E`’IØÙâC [vRæ‚Áçè}‰:‘3ïöÖ.òªö`ƒ1Vß=ଆ¸· 䤴à9¢zàÎVøAÐÛð}3=cÒê_[¹4Rç)é‘›ÆÝsönE(GÈPH lʵ—Ÿô)«}~"΄)‚ô/ ¦¨ÀPGs{’äJôó‚Ñò¾3Yhž“ÈOÌ`+ümòí¯"„zú…ºÁ]}6òÐ]°Ý›Â÷¼  ìD¥éhÛÀí³ICVEQ‘@(¦§Xù+Ä@j  à/Ρ×ßrsI‚Sžð˜XV[é%—ù väŠ$g’€bF*»À1,äÄš>2=P)0Ý%²ËÃî’8 9m€€ÏKŒÞ…j|Æ¡-RàÇ®<Ë-ŠÒëÙ¥Rg[7 ÚÇÖÌ@°ÁæŸ*ãÁÃ~iרtlÊ'¨\T.ÒèüWî“¡` «›µ·ˆø€cL¯¸&±z%6 SS"ÛìVù숴.ÒãÝ^8Õg¸?­ù ï:„avјr¹èn@ ¾¥¡ÑœÃö¸Ì»RáWõ¿ËåBØø–i’(ß ÷4ÝËjÇñ×ߦ‚ óqg†H÷À¹Ia›-«Y@#ÍÙ±¥ÁŠm!Ã/3¤î´LÕÌaj¶.ßÕ¬fïy+? e™å«ÂZÜ/¥šhì+O4©ù <(— %íµå7Îs‡²ås}Lê+U”‘å‹¥:…@”ENÍó“Aâñ\Íäž^®^á†zëöW7Ó6x¥17î MO ˜•ç¹k(9ßœ¹œØæáélÇ^EõÈ—û¯…ïF¬#-¡I»þR$zã¯ÏÁÕÀ®½. ©Z*„nÁÒ²ZŠ?P-íUÇ5>ûÙš¥]LÐ(Ú«'̳RIÇ¢zß¼&Y‚ø:òሽÉöÓ›ÐÕ:q:nrVú¯yiÅDóc%Šu £u/¨^D‘0ÑFBpg¤~oGªL ¨\Ȧ9u¶§Eº…zr¿â¥Êáòãùf C«Nü›G‚G£#Vu矧„4ŸÑ¼„¤ôüë—î잣üEÆ%=ób¯¸+Ýrûàܨ§ydÒ’Éí9Ò¶ϬêûÖO ‘½Ðñô}ÿ=ÞšîóóÙÊÙÖÖ† *Ó˜7†¢ $ŽmŽ AyE r¥r¹ ºý<Ž)·ÂÛ—|k…EÎÊà\å @üm.Ë‹¥áãËAü÷úz§Hæ36È“(înd׊þrF)µ{ ‚Å=B©.8–œš¯àw¥jÙs´2ÂFÊr“âŬ×éè˜%µïýÏâרÈékPyRÛî1×hfW:<–JærQ·H‡AÙ­C(0|ù+”Ä%ès,Á–¯´­›õFÏŠÁÞÆ?É  ÇÞ´z¶;䵯֊¦ “Îà`((Xäæ1°\íž°ôzób²{z˜M²…ŠÎ6ã…ÜÔÍi4·=‡¦8×k T]½ó®˜p‡[ʃí¸u;U.qgȽ¾åžºèÆ~5Înµ‘øþYCrmjƒàº!¿gý†}bcÒýLcÚ±¤ƒù}îù…B¿Í7nsóOÇmŸ%ìjævD Žy{È3ÉNñ¼—Ñä] '+TÙwl¬nóÀ²è”ß«Äe×´&È0P]½úë”ñ]/TÊqFDHcu6kt'CZQì²^W;ŽC*m‰»9ÜÍá[UŸàí ‰­×Á…¶èö†|‚‰F†3š XrÖc™Ø{âIQáž8xsÃg¨Môî8Gáó^ —ͳJ”÷zUä1•áüŸ2 óè¥OKÑ„,@Td<9 #óbn aÂÁ•ÕïݶWe­–Ãö!;¯,–ñ–‰2ÊA>"&#ÁÞ¥t!d¿¤Z€¡þ|ƒ»]F‰ wñì0¢°ä{÷LàÌäWèâq-Îr H§ÔmÕ0¢‘KnËPýuOÙìÙ îFï€QbÛ˜£ö£†4çªí/UD-kýˆZXѾÞ[ö¶tÇ¡2Š qûzÀû:̳rx¿ë½õ‰r¸Äí÷s.B$[æçí…2ÑMXIDÒ«D¾Lç?ôhÛ¯µVÙiá¯ìôÞuk É¿¨ÎÈð"ÎØá.3(Ž¥Œ¸ËDÈ[-Êê2çãæÐóYÉÀŽ$ïˆèþbÄP1[.ªÝØ_¶††’ApÐLN燘Õv†5P×[n'“ú=³Í?‹Çã÷ec¼~Zп¬ã{b@Fñ$Ÿ—å.ïŽ!kgÀJ[þ%¯—õÉp¨8ÿšl4X˶¼…Š¿b>Õ##Ì£èü…ŸßkÈ_S£®p^* ²Úƒ,cãëõbôsÞú=HYV‹I‚¬UÉî¢Ñ#=YsN¨˜ ˆƒ‰€Úd¶ƒ‹eÄ4%x hZdºôau&’1°À´ëŠxöÅ-@ºÃgzÕPp\ÈtšIUo›s#L0£”æ5çd&^â 2Š ³Jy›> –o“™Øú® úQ¯÷g›m ’1eœWþ±I ¬.rp˜ø7&Þ´$w7ˆpju-ï!Že˜efžfAîz3÷kÔ*ÓfþÙÖ­Áù}y †3 ûÆ]kB nìZê4ŽÓ­0ø>†¤Ö?¸2H¨è&œ‘Øz[Ò‚X«5±FƒÌ'¦©,.ªøþ¥bN8A‡Ö„èŽ4zŠÖÁɳÞwÚ¢néêì5Äèᬲmçè “Â3½²(j0衳¶ÉÔ$ðîÁ·=Å]‡Sè ‘¨æo©Q°¾>¯!¼‘¸ º%Pñ1Ö5o2™B0õtr¨Ëj¥xÃ4ÍE„ÚÊ|ƒ)ûa¥zÙebÏ$ƒÑ5[\Ú§s¶S…²ÑPxÅ"sÑ`¡¤°o¦ÙaÀ=“¨Ïê.£Éáèw<XaËÊä•ê ÌãמýÒNBR1Œ÷;¦ïi޼ƒÙ݋ֹë“ÃǹԩWÒDZôʯ¤ön‹ûL×·Faùzu¬Œ²/{tÁÈ<¢¤ó‡³ž>)z-æ$ªü/?ÕÙ—Ê øHå*Õ§Ë©?ˆÁô<ás‚_pÔ &Ç|6·(§ež5:ƒß”3rÌ®Q.¶ÃeÅZ]3í  ¨ðwA$8ÖI…~ ’§»Ò”·6o Ý”FÛ‡ôY’Úª™BõâÂãcÑ>"ÌÒÁ8 „½tQÍmJ£­í;(6ö`MA!<©{MN1Ü”XF[t6ñ¶ð“7°´Ï vÀ•pЇö9P ‰Š?–%Á±¨…ŒWÈGßOðh+÷2Ö¹Ò}{Ô3£ HÈò nÅþÍ{‘­#¸ÁÞ^&^m¹ýº$s¨÷2n_)æ@^GÎZ©ÈŒ2.É„ñ/<ç¶È[Þ¾òX›Þö•齬aº7ú¤ö:'uáL©Ï„XJä²v¾w¾VLHÈF.»ö=¢±}A46e¢ÑÖEcÓȹrÆ+u2=Y¸M™ZÐÍ'{΀XÈôtNêÛiÁàî” uëôšÃ YÂq4OKúÅò$ÓC‹ûinÖç"!ÎÑcÄýMN$ÁC<'Qm hÖÖ-ëÏ#{Žƒº_§3ª4ð—´ï Xê¢óÛ01ûc%zÀI¡Œ.®gæv¥³6°Â´ÏRä(‘Bˆ³‘&ÀÜaV+ï"ê)OX}ᙕ˜ïĸ¦ Æ.¿ü^ããZ ’)ˆ9`£|µì䊞Þ>nJ[¼›—TZXí£ÅuD»œøïBãetža™Ìsï³Lf xóé‘Ù†­í›ž±Û>J§é» ôcíÛfh¢‰ŒþïÏ“ˆá½,Wã †°:¬Üž=@§-}ß‘sá @º ³u®HèMúž¨Ö:’ÐVW|Çt§·Z6-¹¯F•V+À²ýKoYÔæ—ÕÂR@2ßS <©‰©UF½Z}C±–0æ)Á±Ð@õÑ’oH+v¹ŸrÒ¾¦TëÚzá(ñ‹âT§ì­uoÊ$µ4¾wºw̤P%©%(dÉbÚ[Aœžå©&’°®™3x'ùKÐ%ÇÁN¸‘ô™hµd9·éï”WiR¥`DÛÑÀ³Ú93ñrçà ³›Á’ŠZÊØÏöØŸ–‚¥óýg>Yí¡ÒÎþÛ%º×̽SlÁƒ GÓ¿ê–ÞÂfŒö mhÔCN½ÞeàPF+VÆ"¤‘50¹ =Úáúê‘=£C¦eƒÿ2ðã ‹ûï òCfµÆTÝä è4šžÏÂmñI|µpFŽ.„øj’ÿB5!P¬4Ï:Ñ“1œF†À[¤ lzÀ.Ñ1fPYÂ0@&æ`5‚w¦åÇj¶!…@BOëáÂñׯ3Ÿã’|×ÆÎœ–Ëa¾jlË )5Bç¾þ8÷^’ËCÔr¹Ó²HdV;B¯~#²-Á¨&cûîvÓèıÊPó²_ñý g½&X†Ý˜£Ý˜½ ¼¦ðØšÛ²µóõ*ˆüŠª¢m„€tÚC"ßÀ ³ÚôótŒƒd‹ö-Fû[vQ$qEáõ#†Ð¼a¢¹ ëMOwŸ-·´ìnPÇrš–aXC¥Ü²ü¨Ü9HFÐì´ì’QÑOCŒy—ålÖ WŸ§SfBoã-!C†xS‹`µýæ¡`ᩉ}ªŸ†àtSî NãÖÓËÊÈ30í~)>†—¶w™Á ÍîPmJ$ó,³Æk/ã¬1'þõÍä }vk1 þcõ®Ñ+à–þö»dçm Ÿi98S<]÷*<>\çʼèvK¼ÕuØÈšÑÆ.ï·L7êoy:ž=®Ï<ãZ4Øòwž$ä9éIãœ`¬HôΗt]>¶?+r²|ÙB¨Vé½á‡à ེF ´÷‚ÀœÇ¹Z”=Rº'ÅlYÑj©Uƒd¤•/ìÖçZÝM½aû ½]×’Q«¬\ÞWã@ÂÃ`×_}0ÏÌUTU!L+;æ BµLGƒ,r45°Ç´âÅ#Ô–­—ŸQv€óLg¤Ü7…wÝ‹¬@⇚~À †=PI_.?Mù[*j<û²ñP­¨Æ™Ä÷O8tTòW f°÷ò,¥ÄóÝÑÏr ¼3ÔZàÑ?ÞåV›V.h/´Y¿¿4ÝRn½3CwùfÁ6«·ÍÅù¦£5ðÐ(’£¦ñ^Ã÷a¾G!eÏSž'aä+hQ*Àép×%‚V D øaš¦Œòžxmqu™DÍÕɶ}©gš0Ô¸ŸzüðX) ·=õað<åÙ ËÌÁq£Õ>µÖ¬ °òšV\éV=>äóœ“,o¼Ó뤻K+ƒÉS^öÐËSzzŒÆÒ_·ôÇÞ™Vzf`åi¥ÿº@®ºÓM h‚ dÇÊî…b¤ê¥kÊ@s±E70ÓØBç²èxþîdâáYž‚â Ds»CK#‘·Y1›Ï¤|F?æÆ®¤44À"H6T@¼NPc/¿Õ ô8¥æT`ƒ–yÆډ²YØ- wØ­L‹ÆÐßRœg !‡Ó9’ö)F©§r¯ÏÇp‹Å¶úåß@\…§´"¶HÒ—yÓU“ôe!œg0AmÓÀ²Z¥˜ðÀ9ìb6’¾4Å4ÏÝ='&b„ ´ŠéQ=£UÌ¡+ Óµ‡×qK—Ô8½Ñ€BXïP8hZuNÛÔ/õ{ïèÿp ¨`Ú!£á´ž<ô+aœ$7Ó=ùg ÕY-Ƴdjæ½›/ÐÚ4ß¡P2áÅáiÀ gýUÉ£­^üÛ• _‚YV/\gä›dUjºƒ.òe‹½ñeà’V+|YøVÏ»ØZ¨Å7V5ƒ"h-ÓQ‹O$¥ótý~úq°/Öhµk˾r=ˆ$Äúc}.¡éÔ8ýöÚâPe Å Ç ùv´š«gâ£Îgxƒ¦<4½?‰¬,ÅUYtn]Ži‘X%‡¹‘XµM7}ÐÓùÝ×bë¡äØZw"V#¨çÈÑ”>æ §Uá3Üì‘L«í6»È<»\]«-,ÈVþRÊ*dZ ¦iÊÔ G‚»DåIGj;1YÞôÇYQÉÁÝ”ŸæUdšýö^x ÓmŠièùö^€¤&J,ðÓÜ˯óÒ ÈUØ©§zEâ*ãíäÙÊîÕ¶¾høð^W5Qµ¬Ö &ûµzó!6¥*Ú°d"XÖÜkàÍ/ÏôÞ÷‘w…ÂØ«Ã,­ŽÈÒªyP!U~ =õŸh1‚›³O<–†ÜÖ”¼üÚ¹côcVŽðŽ ÉÅ"É:ù{2/þ˜ôBÞä73ŒDSÂøÛCPH¤î|ä'·J TvrXS²š#kê¡ùñª ×vµ\kJå»—3¥RÜüjŒhbœ°4À_Ž$qà1ü g ʙۨ5§V?Ÿ°7T3yf¢­†)‘yí“Íßšn£$VÊ͈<¤ŠŒl ¬4­UÇÈ­¿ø¹úŠ¢íðÖ°è¼>ˆÉ'­ä¿'-Rƒ|ÎJh⚔嶂š´g&#Ù$ kl“€¬m•gMßýbÞgX¨E9Ò<ÖÍoþ&$Ukå/±u©JK(÷?EÀú?¾Só$kæÏ½„ý­Y CtH>÷OuVv»Íª¸>þ“nظ$ÖµzoÛº×5³‹asö!–$lMYl,v‚á‚tè^d^÷¶ž`ØÌVašC’õîè¸IÚr8z㯆#*¬øºÓïª}­ÿÁÑcFÒÑ‘¹?þå`¸³Æ Ø)Q?Fs¨œgQ¨œ¾oæõgšb5õS£¿™µ„s¶Âÿ?ÔeÂ9Y¹à `Ís*š^ÒiÏN5kOY&—¯_·¼›ü+ì*°àºg;žÉé•×¹LÜñ¥ÿ^7j3{½¸eÀI%mÛ 3mW3>sô ì”¸½ºC"!fÂé9¾›†¸ïMÂC…v$Óq΢,õî¦âÁk îÙ]n\ÙHj&ƒ"ÍgãÀ\ðzÍaw.}xš|iüí8ò“lÀò<¥}yc˜ñ#,6¸vÚ8¢ßFÊaÆIT¡ñFÛëÊPçྲྀ›‡éDèÚñ»vb÷²Šm]38dkus?ÿàÍ•!çÒª4ŽP½^$¦4mâ—¦_ÏýÃ&†îóžÊ‘ý=°¸Æœã5of_(Í[ ›ã ›#àDm¼œáš ûL™öN™ö;e˜Z³¶ˆ¿¶ÙÁBMÉrPnùž 1V9¸(,V¹ÍG13s]r»œv{&Ž6¦F×ÈÑÒ£Ý;`ïžÎù¦“øE4éè%|À\‡mO¨Ö-¾=í94‚0UK?im'øÒtt¶qs<2?–In!±UM½KQUòœ¿vBî&#|¹Îþ"¶\K]ö¥A¿Ô`_‚Ç œ<íépÆÿ$Ï“a®I6Ÿø°öç™dÌVùÃjÓèàmµ‡3 »o혗KÂ0ñ›.éGuQRSF?‚ùÁjÛ‰'by¸ÂTõ;ID‰¸p 7&Ôpæ¬SPÐÚþ¹\@ÊÓæçê³B ªih{ÖÍ-FmwSbkJ©¸ ’xcä>^æÃ­ƒ%­çú£2‚í¦ÍÂTLçØ¹ðØ?¹ò3Í{BÍí™0@¶›8øÁ˜;/âïæ Ì˜æÿÉùwúì=jÂA»§ÏaÙ±é3sP&<©3Âàå‡q %2êÖø fí>õ#÷ž¥9U6‘'äà,üA—"«Ó7/IXAº¢—3+ÈÌ`½9³ÂëM5ðØ´ù ®ÎG©nMøJæ¶>™Ÿ¢l´•v+×Ð''U B¼<ÍvðaJÃn’yVÎ#ÖÛ¦<óœþßi .B•ýƦÁ_=Mx¾ºÈóÕ£\³7ãŽúQÿÚ‘¦Ì°lÚçb^Ö`QžXö׌óóG¥ìáXi›cçÙ}]Z?r˶´ŸÞoµb6žs Sˆ ð‰3;Ã\ù™RÝã³³ÿ™S9_,Š^) êi3Â|@[´ý¡¡{¹^žrièz@¡|±ðm›1[òRhû[ȽÍè­UÚûL7ý×;ŽÇÀ˜ÜË¢1ŠúN)Ú¢“_&¦ˆ œf›ã×*(˜œéÇcZsƒ ó¡“ËfÆÁŸò¿çI^>Ûâ<}qoµ¬»nŠíß÷DTú÷=@lûÁk¯Öå-¤Zuö?†Æî~Å ¹(ƒÈy\Géçþ}#>n¾ƒ@ çïBîß–¥¶KôÏ3«6ˆr|¶.ú÷—QÊM¼ŸTþ» m¡[é™3ýÛÇ}Îtõ/…ÝQšÖ¡#J¹Káò?P²ÀöÝb¹Nbíòÿ’¯ýäà£ÿc‘cÿõ*ñÿ ì(aͧkµö瘕ð) SâÌ)峌yQþg¢Õ^}‹óŶ:ÂóðEKœ:1Áò…¥0ë;è–KÒýà|~7—þ±ˆGöN€Ì5l ÙKýÐóð¥+èa¢|²:~§ÀŪߕ|äGÕïßæ ÿ‘9?n,ý“²ÒAųÚú×Àlúìý´ököÏK7¬Ç¬ïÈÈ|F¦}ïÈNl)ŒŒ`ÚÿR`ïvW²ž?†¡‰ÃhÏ0´þCÃÛ´Ûcw%'ueíYívòò[5|ÑSуŸ—g]´­š®Ø€x'•¬O4ª+UÏOõ®¿õÛþàKìôô%ª&eGJT$X÷Ïk;öÐ nzý§’„ï’#‡R¦„YúßxèÀMG½ÎãkuÿÆY’<ÿ¹jŒÝ†qa!öÍ_Þ¿ù¥eݘõKÚÓoÑÏÏ\›<ýç¹Ó]ë~˜qŒ†å“Nr.õ7Ó/º–Ìüc HÄìʾcÝl§S}ÑÀ£¶YðNN ~¯©†œ~‚+œŠ“]°Ù¡Y¿Œñ:×i‰~Ñ™S«èÊŃ Mfç*èf´}DnJ¼ü—}]T僧k°q ÛtvüÓþæ¹ÌüÌ]eä‰7oû¤xªþ»x{wDáÀ=¹íÙÁ ÔoúØ¿>çìg÷ð}2=Â|êüaþÜFp<=;2èþá™_öJW§3Vò±’<8°"w%؉q†3DÎyÞSù+o¹½÷t®ï¾°ð“¥]bõ®™÷˺²Nzu=AbÎöO™‰ô)Êœ+ÿXäDÖ¿xú …^}‹ÆÝI zÊþ­o.Jj±[6æ$×dOß—I—ž‘†Œu¸p *®—{÷ä¥?€jÏéJJÑîòa=9ðy»³þn»å‡QÉ©<z(±ÅüOý÷8Ð0Cv ôŒäÇhËEþ–X³n}·×B.&KrÇ¿÷¼dbº9DÏ[ôÿÑÙžy-×È{m¯lßk;¯Ùk·£ÏÎcו’HÄu)è|ë2U Pw@VOPNÓÑr ûpÇ“‚ QÆžLjÕ¸ # # The machine corpus appears at the left of the observed line; # zoom to see the machine. # # This configuration employs two mechanisms of tape message # compression: a) the assumption that during construction # (whether of daughter corpus or tape copy), retraction of the # construction arm should be automatic - no need for a specific # retract instruction to appear on tape (such as after appearance # of a construct instruction); b) that tape instructions are # represented by four bits. Whereas auto-retraction of the # construction arm yields an approximately 1/3 smaller tape, the # shortened instruction coding reduces the tape an additional # 20%. # # Translation of instruction code to construction code involves # the generation of five-bit long signals, generally. Hence, if # the instruction code is shorter, an additional bit must at # minimum be generated. Yet, the best way to minimise corpus size # is to do as little work as possible; put all the information in # the tape, none of it in the corpus. Here, the instruction code # is four bits, and so the corpus generates the fifth. Thus, this # corpus is marginally larger than is the corpus which has a five-bit # instruction code. We see this size increase represented in the # increased tape instruction count. # # This machine serves (even more) to demonstrate that one may obtain # optimal solutions to machine self-replication within von Neumannesque # cellular automata without the use of more complicated compression # schemes, like run-length encoding, and that indeed such schemes # may here serve to reduce the efficiency of solutions. # # Corpus cell count : 3574 # Bounding rectangle : 109w 59t # Length of tape : 37780 # Tape instruction count: 9445 # Bits per instruction : 4 # Replication time : 4.31 x 10^9 # # Instruction Set - fourteen total operations # ------------------------------------------- # # 0000 OR Ordinary Transmission Right Construct # 0001 OU Ordinary Transmission Up Construct # 0010 OL Ordinary Transmission Left Construct # 0011 XU Extend CArm Up Articulate # 0100 OD Ordinary Transmission Down Construct # 0101 RD Retract CArm Down Articulate # 0110 SR Special Transmission Right Construct # 0111 -- not used # 1000 SU Special Transmission Up Construct # 1001 XR Extend CArm Right Articulate # 1010 SL Special Transmission Left Construct # 1011 RL/QQ Retract CArm Left/Ground Articulate # 1100 SD Special Transmission Down Construct # 1101 -- not used # 1110 CN Confluent Construct # 1111 TM Tape Mark Meta # x = 37888, y = 59, rule = Nobili32 22.2IL14IpA13IpAIpA3IL8.13IL$14.5IpA2IJ.pAJ5IL.J3.2IpA13IpAIpA2IL9IJ 2IL2IL2IL.I2pA$12.2IJ4IpA2ILRpAKpA2KQ.pAIpAL2IpAIpA13IpAL.IL11IpA.pAJ .pAJ.pAIpA.L$4.IK3IpA2IpA2IJ.2IpAILIL.IJIpAR3.JIpALJ.L.ILIL2.IL2ILI2pA I2pAIL2IL2ILIL.IpA2IpA2IpA4IL$3.IpAIJ2IpA2IJ2.IpAJIpAL2IpAIJ.J2Q.pAIpA IJIpAIpAI5pAIJIpA.pAJIpAIpA2.IpA.pAJ.pAJIpAIpA10.pA$2.pA2JRSpAKpA3KpA KpA2KpAKIL.L3IpA3I3JK2.J.L.LIJIJ3.IpA10IpA2IpA13IpA3IpAIpAIpA3I$2.JIpA 2IJTSJL2K.J2.2JK2IpAJ2.J2.2IpAIpA2IpA2L.L5.2IL7.2ILI2pAL.pALILIpAIpA. pALIL.pALIpA4.2QR$2.3JR3S.JL2IpAJ2IpAKJ2.L3IpAILJIJIJ2.JIpAIpAIpAIpAI pA.pAIpAIpAIpAIpA.pAJIJ2IJIJIJ2.IpAJIJ2IJIpAL4.pA$2.2J.ILILI3pAKpAIJI pA2JpAIpAJ2.J.pA2J.JK2.pA.I2L.5IpA9IpA11IpA2IpA12IpAJ$IpA2J.JIJIJ.LJK JK.J.2IJ2IL.IpAR2.J2pAJ2.J2.2pA6IpA4IpAIpAIpA.pAIpALIpAIpALIpA.IpA.pA IpAIpAIpAI2pAI2pAJ$JpAKJ.JLKLK.LIJIpAKJIpA2KJTpAK2pAQIpAL2J.2IpAILIpA .5IpA4IpAIpAL2IJ2.IpA3.IJ.pAJ2IJ.pAIpAJ2.IJ2.J$.pA2J7pAKJLpA.4JI2JTL. 2JK.JL2JKJ3.ILIpAJ2ILIpA2ILIpAL.7IpA6IJ5IJIpA7IJ$.J2K2JKJKJK.JLJpA3JpA J.J.pAIpALJIpAIpAIpAJ4.pAIpAIpA.LJpAK.2pA.pAILILIL2IpA7IJ5IJ$.IL2J2KL KLK.JpA.JIpAIJ2.JKpA.JIpA2J.JKJ5.5I2pAIpAJ.IJLK.IJIJIJIpA8IJ$I3pA2.6pA 2K.pAJ7.J.J.JIpAQI2pA10.17IJ$pA.IJ2.JKJKJK3.J6K2.J.J.3J2.2J$JpA19KJ2. J.J.3J2.2J$IpA16IpAI2J2.J.J.3J2.2J$JpAK14ILJR.J2KJ.J.3J2.2J$IpA2J.LK 3.7IpAIpAIpAI2J.J.3J2.2J$JpAKJ3pAKpAKpA6KL.J.JR.J.J.3J2.2J$IpAJ.JK4.J 5IpA2IpA2QR.J.J.3J2.2J$J2.3IpAIpAI2J4IpA2IpA4IJ.J.3J2.2J$JpAKJLKpAK. 2I2J2IL8.2IJ.3J2.2J$IpA2JLIpAJIpA2I2JIpAIL6.J3I3J2.2J$JpAKJLJpA.pAJK 2.2JLTpA3.3I2J.2I2J2I2J6K$.pA2JLIJ.JLpA2I3pAI.3IpAIpAIpAIpAL.JpA8KJ$I J.3pA2KpAKJ3.JL2RL3KIJIJIJL4.5IL2J$pA2KJQT.IJIpAKpA.JLRpAK.2IpAIJIpA 2L.3IpA3I2L2J2K$pAI2JK.pAJI2JKJ.JLTS2.J.J.2pAJ2L.JLKJLKJ2LJ.IpA2IpAIpA 2IpA2IL$JK2IpA.JKJK.JpA.2pA2.pAIpAIpAL3J2L.JL2JL2J2LJpA2J2IpAIpA2IpAI 2L$I2JIpA2IpA.JpAIJ.JL2RL.J.JIpA2J2L.JKpAJKpAJ2L.J.2JIpAIpA2IpA3L$pAK 2JpAKLpAK.JK2.JLRpAK.pAIpALJ.JLIpAL6J2L.J.3JpAKpAKLpAK2L$pA2JIpAJL2J. IpAK.JLTS2.J.JLJ.JL.2LJpA2JpAJLILJ.2JIpAIpAJIpA.LIL.11IL31.ILILIL$JK 2JpAK3pAKpA.J.2pA3.IpALJLJ.2pAIL2IJ2IJIpA2LJK3JpAKpAK.LIpAIpAIpA9I2L 11.2IL5.2IL.2IL4.I6pA$I2J4.JK.JpAJ.JL3RS2LJLJKJ2IpA2IpAJ.2JLIpAL3JK.I pAJIpAJL.L.J7IL.IpA5IpAIpAIpAIpA.pAIpAIpAIpA.pAIpA.pAIpAIpAJLIJIJIpA$ pAKJpAKpA2KpA2KJK.JLRpAKpAKLJIL2JK.IL.J2.2J2LKIpAJIpAIpA2.J2IpAIpAIpA J6.pA2.LILIL.7IpA7IpA3IpA12IL$pAJIpAIpA2IpAIJIpAKJLTS3.IpA2LJKJpAIpAL J2.2J2L2IJ.2JKIL.J2.L.L.J.IpA2IpALIpAIpAJI2pAIpAIpAIpA.J3.IL.IpA2.IpA .pAIpAIpAIpAIpA3.L$JKJpAKpA2KpA2KpA.J2pA3.IpALJIpAIpAIJ.LpAJK.2JLIpAI LQJIpAIpAIpA2LpA.L.J.JpA.LpAK.IL2IL7.2IJ3.2pAIJ3IJ2IJ11.L$.pAKpA.pA2K pA2KJpA2JL3RS2LJ.L.J2.LKpAIpAI2JLIJ.pARJ.JLK.JIpA2IpAI2pAIJ.IpA.2IpAI LIpA.4IpA5IpAJ10.2IL5.2I2L$IpAIJ.L2IpALJKJKJLRpAKpAKIpAIpAIpA2IpAIJ.J IpAJIpAL3.J.JL2.J.IL.L.LJ4K2IJLK.IL2IpA3IpA5IpA3IpAIpAIpAIpAIpA.pAIpA IpAIpA.pAL$JpA3K2pAK2pAIpA.2JLTS4.J.L2K2.L2KpA3J2.J4IpAQ2IpAI2pAIpAIpA IpA4IpA3IpAIpAIpA2IJ3IpA5IpA5IpA6IpA7IpAIL$TpA2KI2pALJpAKL.3pA2.2IpAI JIpA4IpA2IJI2pATIpA4.J.JLKLKJ.L.L.L.2ILJ3.L.L.4IpAIpA.pAIpAIpA.pAIpAI pA.2pAIpAIpA.pAIpA6.L$3TpAJLJLIpAJL.2JL2R2.L.2JIL3.L2K.J.JIpA5.pA.JL. L.J.2LpAK2pAJLpAJ3IpAIpA5IpA.2IJ3.2IJ3.2I2J3.2IJ8.L$3.JLpAJI2pAKpA.2J LRpA3K.2JIpA3IpAIpAIpAI2JpA5KJ.JL.pALJ.4LKJ.L2IJ2.L.L3IL.7IpA4IpA4IpA 14.IL$J7IL2IpA.2JLTS2.2I3J2L3K3.J4.ILIL2J.J2LpAKJ.2LIpAIpAIpA5IpAIpAJ .LpA8IpA4IpA4IpA2IpA3IpA2IpA4I2L$JpAL2.pAK.L2.I4pA.3IpAIpA2JIpA3IpAQI pA2.I7pA.JLIpALJ.2L.L.JK3IL2.L.LIpA2IJIpA.IpAIpA.pALIpA.2pAIpA.pAL.pA IpA.pAL.pAI4pA$.JIpAIpAJ.IpAILI2JLR3.LIJIJ.L6.J2.JIJIJI2J.J2LpAKJ.3LpA .IJ.2IpALIpAIpAJIJ2.JIpAJ2.2IJLJ2I2J.2IJ2IJ.2IJ2IJ.IJ2L$.J.pAKpAKpAKpA KpA.2JLRpA3KJIJLKpAK4.IJ2.JLKLKLKJ.JLIpALJ.2LIpALJK.pAK2LJIL6IJIpAL.I LILIJIL.J16.J2L$IJ.T.T.T.T.T.2JLTS2.I2J.LILJ3KLpA2K.J7pA.J2LpAKJ.3LpA KIJIpAJ2LJIpA7IpA.IpAJIJ3IJ2IJ3IpA2IpA9IJ2L$JIpA.pA.pA.pA.pA2.3pA3.IpA IJL3pALQ.pAKL.pA2K.JKJK2J.JLIpALJLKLIpALJKJpA.LI2J2IL5IpA2IpA10IJIpA. pAL.pAL.pALJIL.3pA$JpA.pA.pA.pA.pA.pA.2JL3RSL2.2pAJLIpA2.LpAKpAKJ.ILI L2J.J2LpAKJL.pA2.2IJ.J.L.IpAILIJ.pAIpA.IpA.pA.IpA.pAIpAI2pAJ2IJ2IJL.J LJ2pAIJL2QT$2J.L8K.3JRpAKpAK.LKJLpAKQ.pAKL.L2JI6pA.JLIpAIJL.7IpAIpAI 2J.4IJ.2IJ2IJIJIpAJ3.LJ7.pAI2pAIJ3.3IL$2J.pA9I2J3K4.2LpAKLJ3K.L.L3J.I JI2J.JL2.IL9IJ.3IpA13IpA7.IJ19.4L2.2L2.2L2.2L2.2L2.2L2.3L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.6L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.3L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L54.L.3L.3L. 3L.3L.3L.3L.3L.2L.L14.3L5.3L53.3L58.L10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.3L5.L.2L.L11.L11.L13.L37.L10.3L5.3L53. 3L9.L.3L.3L.2L3.2L.2L.L25.4L.L.2L3.L8.3L21.L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L.L2.L.5L5.3L.L.2L3.4L.L.2L3.4L.L.5L46.L6.L.2L.L2.3L53.3L5.3L 10.L2.3L5.3L.L.2L.2L3.L3.L.3L3.L.3L.L4.L10.3L20.L8.L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.L.L18.3L9.3L9.3L5.L.2L.L7.L11.L11.L6.3L.3L5.3L.3L6.L11.L6.L .3L.2L.L7.L6.L.2L.L2.L.2L3.L.L2.3L8.2L.3L.3L.3L3.3L8.L4.L.2L.L7.L6.3L 9.L.2L3.L8.3L9.3L15.L5.L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.4L.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L5.3L8.4L. L.2L3.4L.L.5L5.L.3L.5L5.3L8.4L.L.5L8.L4.3L.3L.3L.3L.3L5.3L5.3L8.L4.3L 5.3L.L.2L.2L2.2L4.2L.2L3.L4.3L10.L2.3L8.4L5.L.3L.2L3.L8.3L12.L4.3L5.L .3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L12.3L5.3L5.3L13.3L53.3L9.3L41.3L5.L. 3L.3L.2L3.L7.L5.L2.L.2L.L2.L.2L3.2L.3L.2L2.L4.L3.L3.L12.3L14.L2.L.2L. L8.L.3L3.L3.L.3L3.L.3L3.L3.L3.L.3L3.L.3L.L.L.L6.L3.4L.L.3L.2L.L.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L4.2L2.2L.L.3L.3L.3L.5L6.L2.3L.L.2L.L7.L2.3L.L.5L5. 3L6.L7.L2.3L.L.2L.L2.3L.3L6.L10.L.3L.3L.3L.3L.3L.3L.2L.L10.L.3L.3L.3L .3L.2L.L2.L.2L.L3.L2.3L9.3L5.3L9.L.3L.2L3.2L.3L.2L3.4L11.L4.L3.2L.3L. 2L3.2L.2L2.L3.L2.L5.2L.L.2L5.L8.3L8.2L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.L.3L.3L. 3L.2L.L2.3L8.L11.L7.4L5.L.3L.2L3.L7.L7.L11.L7.4L.L.5L5.3L5.3L5.3L5.3L .L.5L5.3L5.3L5.3L5.3L8.2L.3L.2L3.L7.L7.L.L6.3L14.L2.L.3L.2L3.L2.L.3L 12.4L10.L5.2L.3L.L.L.L.L.L.L6.L3.L3.2L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.4L49.3L 9.3L45.3L37.3L21.L.2L.L3.L6.L.5L.L.3L.2L2.L4.2L.2L3.L3.4L.L.2L3.2L.3L .2L3.4L5.3L4.L3.4L8.L4.3L3.L.3L.3L.3L6.L7.L6.L.2L3.L3.2L.3L.2L.L.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L3.4L.3L5.3L.3L5.3L5.3L5.3L5.3L.L.5L5.L.5L6.L2.3L5.3L6.L2.3L 5.3L.L.5L5.3L5.3L17.3L25.3L.3L.L.3L.2L3.2L.3L.2L3.4L.3L4.2L.3L.3L3.3L 5.L.2L.L13.L8.L.2L3.2L.2L2.L4.L2.L4.L.L2.L.2L3.L7.L7.2L.2L3.L3.4L6.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L3.2L.3L.2L3.L4.L.3L.2L3.4L5.3L.L.2L3.L11.4L.L.2L3.L4.L.3L.3L .5L5.L.3L.2L3.L9.L2.3L5.3L17.3L21.L.5L6.L6.3L9.L.2L3.L3.L.L2.3L6.2L. 3L.3L3.L.3L.2L5.L2.L3.L.3L8.L2.L.3L8.L5.L2.L.2L2.L2.L4.L2.L5.2L.2L3.L 2.L.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L3.L28.3L8.L23.L24.3L29.L.2L.L2.3L6.L10.3L6.L13. 4L6.L6.L.3L.3L.2L3.L2.L4.L3.L.L5.2L.2L2.L4.L3.2L.2L.L2.2L5.L3.L7.L3.L 3.L3.2L.5L2.L5.L2.L.3L.3L.3L.3L.3L.3L.3L4.L3.4L.L.2L.L.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L23.L28.3L10.L7.L7.L6.3L.L.5L.3L.L.2L2.L .3L4.L.L2.L.5L5.3L5.3L.L.3L.3L.3L.2L3.4L5.3L5.3L8.L.L2.3L5.3L.L.2L3. 2L.2L3.4L4.L3.L3.4L4.L.L5.2L.2L2.L4.L2.L4.L2.L4.L3.L2.L3.L4.2L.2L.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L3.L32.3L8.L7.L7.L4.L.2L2.L2.L5.L4.L.2L3.4L5.3L. 3L21.L.3L.3L.3L.3L.2L3.L2.L4.2L.2L3.L3.4L8.2L.5L3.L4.2L.3L.2L3.L4.3L 8.2L.5L4.2L.2L2.L2.L4.L2.L4.L3.L4.L3.L.L6.L.2L.L.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L68.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L.3L 6.2L.3L8.2L.2L3.2L.2L3.2L.3L.3L.3L.3L.3L.3L.2L3.4L.L.2L2.L3.L.3L.3L. 3L.3L.3L.3L.L.3L.5L.3L.3L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3. 2L.3L.2L2.L3.L3.L3.L3.L3.L4.2L.3L.3L.2L2.L4.L2.L4.L2.L4.2L.3L.2L3.L4. L.5L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L.2L3.L2.L3.L3.L 3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L.2L3.L3.L4.3L65.3L6.L.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L .2L3.L3.L3.2L.2L3.2L.2L3.L2.L3.L4.2L.3L6.L.L60.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.L3.L4.3L5.3L5.3L29.L.3L.3L.2L2.L2.L2.L.2L 3.L3.4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L6.2L.2L3.2L.2L .L4.L3.L3.L3.L3.L3.L.3L3.L.3L3.L.3L.3L.3L4.L2.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L4.2L2.2L.3L9.3L24.2L.3L.3L.3L.2L2.L4. 2L.2L3.4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.L16.3L9.3L20.L3.L 4.3L5.3L13.L.3L.2L3.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.L8.L.3L.3L. 3L.3L.3L.3L.3L.2L.L13.L3.L8.L.2L2.L.3L3.L2.L5.L2.L.3L4.L.L.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3. 2L.3L.2L3.L3.L3.L15.2L.3L.3L.3L.3L.3L.2L.L6.3L8.L3.L8.3L8.4L6.L5.L3. 4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L3.L3.L3.L3.L4.L3.L11.L3.L8.L .2L3.L3.L12.L.3L.3L.5L.2L3.L5.L3.2L.3L.2L2.L4.4L.L.5L4.L.L5.L2.L.3L4. L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L2.L3.L3.L3.L3.L3.L3.L3.L.3L4.2L. 2L.L2.3L5.3L5.3L5.3L13.L.2L4.3L.3L.3L9.3L2.L5.2L.2L3.L5.L5.L3.4L.L.2L .L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.L.L22.L.3L.3L.3L.2L.L5.L7.L7.L6.L 3.L3.L2.L2.L3.L4.L5.2L.3L.3L.2L3.L2.L.3L3.L3.L.3L.3L.3L.L.2L3.L5.L.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L4.L3.L.L3.L14.3L13.L.2L.L3.L 2.3L8.L4.3L9.L.2L2.L.3L.L4.L5.2L.5L3.L.3L8.L4.L.4L3.2L4.L2.L3.L.3L2.L .2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.L.L10.3L9.3L5.3L9.3L5.L.2L3.L.L3.L5.L2.L2.L5.L2.L2.L5.2L. 2L.L3.L5.4L.3L.L.2L3.2L.2L3.2L.3L.3L.L.2L3.L5.2L.2L3.L2.L4.L3.L7.4L.L .2L2.L4.L3.L4.3L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L6.3L9.3L5.3L12.L3.4L4.L.L3.L5.L 3.L.L5.L3.L.L5.2L.2L.L3.L5.L3.L3.L.L2.3L5.3L5.3L.L.3L.5L.3L.L.5L4.2L. 2L2.L4.L2.L4.2L.5L11.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L3.L2.3L9.3L5.3L8.L3.2L. 2L3.2L.2L.L3.L5.4L3.L4.4L3.L4.2L.2L.L3.L5.L3.4L8.2L.2L3.2L.2L.L2.L3.L 4.L5.2L.2L3.L4.3L4.2L.5L9.3L8.L3.L5.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L4.L.3L2.L4.L. 3L3.L.3L4.L3.L3.2L.2L3.2L.2L.L3.L5.L3.L3.L3.L3.L3.L.L2.3L6.L5.2L.2L3. L.L2.3L5.3L.L.2L2.L.3L.L4.L5.2L.3L.2L2.L4.2L.2L2.L.3L2.L4.L.3L4.L3.L 2.L.3L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.L.L7.L7.L6.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L46.L.2L. L7.L2.L.5L8.4L5.3L8.L3.2L.2L3.L.L7.L5.4L4.L3.4L4.L.L3.L2.L.2L.L5.2L. 2L3.L.L5.2L.2L3.2L.3L.3L.L.2L3.L5.2L.2L2.L.3L5.L.2L3.L3.L.L5.4L8.L3. 4L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.4L.3L.3L.3L.3L.3L5.L.3L.3L.3L.2L.L10.L.2L.L10.L.3L. 3L.3L.3L.2L.L10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L3.L38.3L5.3L5.3L 6.L2.L.2L2.L.3L3.L.3L4.L3.L3.L2.L4.L.L3.L2.3L8.L11.L9.L6.3L.3L.L.2L3. L.L5.L.L2.3L5.L.3L.3L.5L.3L.L.2L3.2L.5L3.L.3L.3L.3L3.L.3L4.L3.L2.L4.L .L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.4L8.L7.L5.L5.4L5.3L5.3L.L.5L5.3L.L.5L5.3L5.3L5.3L.L .5L5.3L5.3L5.3L21.3L5.L.2L.L33.2L.2L.L2.L.2L.L5.4L8.4L5.L.2L2.L4.L3.L 3.L.L2.3L6.L5.L3.2L.2L3.4L9.3L12.L2.L4.L.L5.L.L3.L2.L.L.L3.L3.L4.L5. 2L.2L3.4L4.2L.2L2.L4.2L.3L.3L.3L.2L3.L3.L5.L.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L50.3L 13.3L29.3L29.L.2L.L7.L7.L2.L.3L.5L.L.3L.3L.3L.3L.3L.2L3.4L5.3L5.3L12. 2L.3L.5L5.3L8.4L7.L2.L3.L5.L3.2L.3L.2L3.2L.2L.L6.L.2L2.L4.L3.L.L9.L.L 4.L.3L3.L.3L.L4.L5.2L.2L2.L4.L2.L3.L.3L3.L3.L.3L3.L.3L4.L2.L.3L2.L.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L.L2.L.3L.3L.5L5.3L5.3L5.3L5.3L.L.5L5.L.3L.5L5.L.2L.L6. L.3L.3L.2L3.2L.5L5.3L5.3L5.3L.3L8.4L5.3L6.L2.3L9.3L5.L.2L3.2L.2L.L2.L .2L.L2.L.3L.2L3.2L.2L.L8.L4.L3.2L.2L3.L9.L3.L5.L3.2L.3L.2L3.L.L2.3L5. 3L4.L2.L4.L.L3.L2.3L5.L.3L.3L.3L.L.2L3.L5.L2.L.3L8.L4.3L9.3L5.3L8.4L 2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L.L2.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.L11.L15. L4.3L.3L.L.3L.3L.2L3.L8.L.3L.3L.3L.3L.3L.3L.2L.L11.L6.L.2L2.L.3L2.L2. L.5L4.2L.2L3.2L.2L.L2.L.5L2.L3.L2.3L5.3L5.3L8.L.2L2.L6.3L6.L5.L3.2L. 2L2.L4.4L2.L2.L.2L3.L4.3L5.3L8.L.L2.3L5.L.3L.3L.5L.3L4.2L.5L3.L3.L.3L 3.L3.L.3L3.L.3L4.L2.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L10.L.3L.3L.3L.3L.2L.L 10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.4L21.3L17.L.5L6.L6.3L9.L.5L5.L.2L 3.L4.3L.3L5.3L9.3L8.2L.2L2.L2.L5.2L.2L3.2L3.3L.L.2L3.L5.L5.L3.L4.3L5. 3L3.L2.L2.L.3L.2L3.2L.2L.L2.L.2L3.L.L3.L2.L.L.L3.L3.L4.L5.L3.4L4.L2.L 3.L.3L3.L3.L.3L.L.5L3.L.3L.L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.3L.L.5L5.3L5. 3L5.3L.L.5L5.3L5.3L5.3L5.3L13.3L21.3L13.3L10.L6.L.2L2.L2.L5.L10.L3.L 3.L3.L4.L.L2.L.2L.L2.L.2L.L6.L.2L3.2L.3L.2L.L5.2L.2L3.2L.3L.3L.2L.L2. 3L8.4L8.2L.2L3.L4.3L9.3L5.3L5.3L7.L.3L3.L.3L.L4.L5.L2.L4.L2.L4.L.L2. 3L10.L2.L.2L3.L4.3L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L6.3L29.3L25.3L21.3L21.3L16.L 8.3L5.3L5.3L13.3L17.3L5.3L5.3L5.3L.3L5.3L10.2L.3L20.2L.3L.2L3.L3.L3. 4L3.L3.L2.L2.L.3L.2L2.L3.L2.L2.L.2L3.2L.3L.3L.3L.3L.L.2L3.L5.L3.2L.5L 5.3L.3L3.L.3L.3L3.L3.L3.L.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.L.3L.3L.3L.3L. 3L.5L5.3L.L.5L5.3L5.3L.3L.L.5L5.3L5.3L.L.5L5.3L5.3L.L.5L5.3L17.L.2L.L 2.L.2L.L2.L.3L.3L.2L3.L.L10.L.2L.L2.L.2L.L2.L.2L.L2.L.2L3.L2.L2.L4.L 2.L5.2L.2L3.2L.3L.3L.3L.5L5.2L2.3L.3L8.L8.3L17.3L8.L4.3L9.L.3L.5L.3L. 3L.L.2L.L4.L.3L4.L.L2.3L.3L7.L3.L.3L.2L3.L.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.L.3L. 3L.3L.3L.3L.3L.3L.2L3.L8.L.3L.3L.2L3.L3.L8.L.3L.3L.2L3.L8.L.3L.3L.2L 3.L8.L.5L21.3L5.3L16.4L2.L5.4L.3L3.L.3L2.L3.L2.L.2L3.2L.2L.L2.L.2L.L 5.2L.5L.L.3L.3L.3L.3L.5L8.2L.2L3.2L.2L2.L3.L2.L2.L.3L.3L.2L.L9.L3.2L. 2L.L2.L.3L.3L3.L4.L5.L3.2L.2L.L5.4L6.L5.L.L5.4L.2L2.2L2.2L3.L.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L.L6.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L17.3L 17.3L29.L.2L.L15.L2.L.2L.L2.L.3L.2L3.L9.L2.L.2L3.L2.L2.L3.L3.L3.L2.L. 2L3.L.L2.3L.L.2L.L5.2L.2L3.L2.L3.L3.L3.L3.L.3L4.L3.L4.3L5.3L5.3L13.3L 8.L3.2L.2L2.L3.L3.L.3L.L4.L5.L3.2L.5L3.L.3L.3L8.4L2.L5.2L.3L.3L.2L.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L.L3.L18.3L9.3L13.3L9.3L17.3L17.3L33.3L2.L2.L.2L 3.4L5.3L21.3L5.3L5.3L6.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.2L3.L3.L.L7.L6.L .3L.3L.3L.2L3.2L.3L.3L.2L2.L3.L3.L2.L3.L5.L3.L3.L8.L.3L.3L.L.2L3.L5.L 3.2L.5L10.L33.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.3L.3L.3L5.3L.L.2L.L2.3L.L.5L 5.3L.L.2L.L2.3L.L.5L5.3L.3L.L.5L6.L2.3L.L.5L5.3L5.L.5L8.L8.3L6.L2.L. 2L.L2.L.3L.2L.L16.L4.2L.2L.L2.L.2L.L3.L2.L.2L3.L.L2.3L6.L5.2L.5L.3L. 3L.3L.3L.3L.3L5.L.3L.5L6.2L.3L13.3L8.L3.4L5.3L13.L.5L.3L.3L.3L5.L.3L. 2L.L2.L.2L2.L.3L.L.3L.2L.L2.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L5.L4.L. 2L3.L11.L8.L.2L3.L11.L8.L.2L3.L3.L11.L.L5.L8.L.3L.2L3.4L8.2L.3L.2L3.L 7.4L5.3L6.L2.3L9.L.2L3.L4.L.5L2.L3.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.2L3. L3.L7.L7.L7.2L.3L.2L3.2L.3L.3L.3L.3L.3L.2L.L2.L.2L3.L7.L5.L2.L.3L.3L. 3L4.L5.L3.L5.L6.3L5.L.2L3.4L5.3L8.2L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L 5.2L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.2L.2L.L9.L5.L7. L6.L.2L.L2.3L8.L25.L9.L.L3.L4.L.3L.L.2L2.L4.L.L2.3L6.L3.L2.L.2L3.L.L 2.3L6.L5.2L.2L3.L2.L2.L4.L2.L4.L2.L5.2L.3L.2L3.L4.L.3L.3L.3L.2L2.L.3L 3.L2.L5.L7.L2.L3.L3.L.3L.L4.L5.L3.2L.5L3.L.3L3.L.3L3.L.3L3.L.3L.L.2L 3.2L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L5.L36.3L9.3L16.L11.L15.L7.4L5.L. 5L29.3L8.L.L3.L5.4L8.L6.L.3L2.L3.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.5L.3L. 3L.3L.3L.3L.3L4.2L.2L2.L3.L.3L2.L4.L3.L3.L4.L.L7.L2.L.2L3.L3.L4.L.3L. 3L.L.2L3.L5.L3.2L.4L2.L.4L2.L.4L2.L.4L2.L.4L2.L.2L3.L5.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.4L.3L.3L.L.2L.L9.L.L2.3L.L.2L.L2.3L.L.2L.L2.3L.L.5L8.L40.3L9. 3L22.L13.L3.L5.L2.L.5L4.L2.L4.L.L2.3L6.L4.L2.L5.L.L2.3L6.L5.2L.2L3.L 3.L2.L4.L2.L4.2L.2L2.L3.L.3L.L.2L.L4.L.3L.L.2L.2L2.L2.3L.3L.3L2.L5.L 4.3L5.L.3L.3L.5L.3L.3L.L.3L.5L.L.5L.L.5L.L.5L.L.5L8.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.3L3.2L2.2L2.L5.L4.3L.3L4.L.L5.2L.2L.L5.L11.L11.4L.3L 5.3L5.3L.L.5L5.L.5L.L.5L5.L.5L5.3L.L.2L3.L5.L6.3L5.L.2L.L2.L.2L3.2L. 2L3.L8.L.3L.5L.L.2L.L5.L2.L.3L2.L3.L5.2L.2L3.L3.L.L7.L6.L.2L3.L2.L.3L 3.L.3L2.L2.L.3L.5L6.L5.4L.3L.L.3L.2L.L2.L.L.L3.L3.L4.L5.L3.2L.5L.L.5L .L.5L.L.5L.L.5L.L.5L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L14.L.3L.3L. 2L3.L4.3L.3L5.3L.L.3L.3L.3L.3L.3L.3L.2L3.L.L2.L.3L.3L.2L3.4L8.L7.L11. L8.L.2L3.L16.L.2L3.L3.L4.3L5.3L29.L.2L.L5.L4.3L6.L5.2L.5L.3L.3L.3L.3L .3L8.L3.L.L2.L.2L.L4.L.3L.L.2L.2L3.L.3L2.L5.L2.L2.L2.L.2L2.L.3L3.L.3L .L6.L3.L3.2L.2L2.L3.L3.L3.L3.L3.L3.L3.L2.L2.L.2L3.L3.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.L3.L4.L.3L.3L.3L.3L.3L.3L.5L53.3L13.L.2L3.L37.L6.L.3L.2L.L5.2L.2L 3.L3.L7.L4.L.2L3.L3.L3.L.L2.L.2L.L2.L.2L2.L3.L3.L4.L.L4.L.3L2.L3.L2.L .3L.3L.3L.2L2.L3.L3.L4.L3.L36.3L.L.2L3.L3.L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.L2.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3. L3.L3.L3.L3.L3.L3.L3.L3.L.3L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L2.L5. L63.L15.2L.2L3.2L.2L2.L3.L3.L3.L4.L3.L3.L.L4.L.3L3.L3.L3.L3.L3.L.3L3. L4.L.L4.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L3.L 4.L3.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.L2.L3.L3.L3.L2.L4.L3.L2.L2.L.2L2.L3.L2.L2.L.2L2.L3.L3.L3.L3.L3.L 3.L3.L.3L3.L.3L3.L.3L3.L.3L3.L.3L4.L3.L.L5.L2.L3.L.3L6.2L2.2L2.L2.L. 3L.2L2.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L 3.L3.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L.3L3. L.3L3.L.3L3.L.3L3.L.3L.L.2L2.L3.L3.L2.L4.L2.L2.L.3L.2L3.2L.3L.3L.2L3. 2L.2L3.L2.L4.L2.L.3L3.L3.L.3L6.2L.3L5.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L.3L3.L.3L.L.5L2.L4.L3.L.3L3.L.3L3.L. 3L3.L.3L.L.L.3L3.L3.L3.L.3L3.L.3L4.2L.3L.2L3.L12.L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L4.L2.L3.L3.L.3L3.L.3L3.L.3L3.L .3L3.L4.2L.3L.3L.3L.3L.2L3.2L2.L4.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.2L.L.5L$2JKpA19KLJKpA5KpAKL3J4K.J.J3IJ15IJL12KpA29K$J2KpA20K2.L 2QIpA2KJL2JpAKpAKpAKpAKpA8K.L2K.L2KL4K$26.IpAQIpA2KpAKJKJ.J3.J2.LKL3K .pAKpAKpAKpAKpAK$30.3IJ2.JpAKpA3KpASpAKpAKpAKpA2KLpA.pAKpA2K$37.N5.JK pAKpAKpAKpA3KJ2K! golly-3.3-src/Patterns/Self-Rep/JvN/sphinx-midpoint.mc.gz0000644000175000017500000025304313151213347020226 00000000000000‹S6õHsphinx-midpoint.mct½Ë®-9’%6?_q Ô  ·ñ1Ñ@= H‚Ð ‚ÑYQ•ÎŒ(dDv«ôõâZFš}_UåõØÇŸt:I{-[öý/ùÿþþwÿòÛ_þòoßéå§ÿõßü‡õ¿ïïïÿðÛ¿þÛß~ù—?ÿñŸ§ÿ¿üå/¿üô×ïÿøßÿÃßÿôŸÿòó¿ý£ú¿ÿù—ß¿×ÿ~ÿ×?ÿòëÿóýÓ÷O|ÿËÏ¿þü·Ÿþøå·_¿S¯ÿОò==ÿP[ýÖÛþôÏüü·ï_þøþóO¿ë}þù—_ùýÏ?ÿÓ÷?ýý_ÿòËŸÖÅ¿þË:á÷ïßþë¯ßüô¯?ÿÃ÷O¿þÓ¾ü?ýüÏ¿ýíg\¿žüÓúíï|ÿñ›Þç÷?~úÛßúí×ßÿøÛßÿÄ»üñ矿ÿôç_þòOßýiý÷W\øûÏùçüþþŸûéŸÖñ_~ÿ‡ïÿ÷·ßþúý˯߫Íë½Ù_~þç?¾ÿåŸöÃÿןWÿþ¯¼ãï¿üõïÑwüwÿÝ÷þùßþý÷ßýã—¿àv¿þËïÚ½Í_û/k×?¬6~ÿþóÏÚkàºþ_ÿöÛŸ~þý÷Õžÿ󷿯FþÛ÷ýéW¼ÒjÏŸþöóO¿ïæàÂÿé¿ü¯ß?ýå_~ûÛ/üù¯ÿíïßýù¯¿ýíß¾ÿòË_Woü»ÿòËOßÿÛß~þçŸÿöó¯ë–ßÿýú”¿þñ·ßþòïõ‹ýG\Ÿç×ó?âìï²>Ëú*_é{®ÿOÏ÷ó•¿þZ;`/󌤧”õ¯~a‹¿dßÁoпûÚ§·šü•²þ§fùÞ·Íø½þ7×…ú€NÒ+x¤î#å{|'nä«òþí;µý0œŸÎï„ßÚœ´NŸl.þ??Ö6>j_§—îŸûÁyýwµ¤|gôRòÿ}ñ޵õ¿}k¼J·ó¦Þ]ÿÐnHÏ~]vcžßeuåypò>Êߥàðú«ìcÞoíXµ/Êè–"û´ò]Ö׎ö]:N|p—ÓŸß¡>v‡uÍü®ë§¬ËVæôÇwß5ksÏÿØ‘µr÷­ÂÍéào>»Ö¯ò];nYù•ò¹î;éï‚ î"Î’¤ß²¶ï:±|e¾Å~—¢íÛ­d°ßº&¾Ø‰}½´¿ðú‰Ñ….Â;†i{ôÕñìõ´ñÝÒz¼¬ÿ ¶-­.íßu5°|·r>nÇÇÍü†¯/Ãa»Çúƒ¹u ͱÎ]×·öÝ&Þ'•0"l²¬7Ia²EìwœúíôÕåìçäÙWrÊØ8Ów&ÙÔûöÕ?ã»Ïïñ¬†õµc}±ö=ÐMð¿þ|›Ö³øÿQ¿l>ذôߣùüÈ>ñÆÀiaæœW[×ÏÝ6}Î×â«­>öÜØKÁ£7žëå{Öï)ûÏ×ëö<´Ëë;m˜ý{Žï‰NA?ŒõÑV®!öhÓ'ºà©Ï9Sùè³ôöó|¯ô¬¾[ÛfÏšzÞã¯h/2m`ê8HÏš+Ïú“/ÉÑùàßš4K§õê÷ÀÝÑ)˜Õ–…³ŒÛ8+W'|Óý üޱßר×!V„Õí:ÿX7Íh gŸ6!4%aaôk ÜðáÊWÓ¥;ª­>ÓÅ‹­™øÝ÷JŽßã¬(k„øY©ðß9¶:깎ä}‡„e­”/Ù÷X¯Tª­Õ÷DÓöؑąbíÄbSF˜ŸåKÝ6ë«m‘öèhŠÿ rÓ¤DÅB½ú§V{LA•ÃlæehÐZ Ò:ð ÖÌOX©×›*[þÈ6 ÃFSð9}9Úëƒþ³$¤g7xm¤h×ê—Dl¹Ö½'c¼ kÚé‰ýòÓ$è5osÔ!Ø/X…ÛÚÙð»dOxSR|âZœRk\¹! ÖI` Ã'Œ^ÈÜÎÑóì/~¤úþZg¡á¼å°XÿÉaµ¡¶–Ç'*0hÐÀÒ³­5 Ó0uœ‡ÿb'eædåpY}{–¹=àÆÜ8[×®3úåׯ¼Òï¾–ê„™u*ûáœïœ…mwÁôY–´%è] žd×®‡'V'ˆýõŽ˜‡Öá:Ž=ìp]°9®ótô–¼võQÊåÎÆÎy÷ÉÓrÁ°,á(_jqyö?a[qþzÝ¥øf*‡±˜_g¾Ÿù²ÕGsL‚¼Þ\Ÿ=Aps s~JÈÉu#NJÇ4ÛÓO_+{®ø¯ŽÜ¼ßþÜ7˜{Ýâ¿Óš½Âä5ú¹Ý½éÜzuìZbsÅÙ>n½–÷\ÑofÚì ¤à×W¹¬wG¿á­³Èþ×x÷¸ç9Ï“óo=WðrkV.•îÑÕ›ý_·ûä\ ûþo˜UŸG9– È­ìÿÆ^â˜X£5/}Z•V[LU¦l“I‡G£nÖ~‘¡¯˜kÇÌÕñe¾pá0™uL¾51êãÚ‘jk÷j&Q}OáÚ±n¼:ËsQµQo¹½ºi}¯õ¹ ÄSÆ*‹×Xï—B†~Æ€ý¸¾ÀÒ·1`±hæeåQÔR:ÿ3{x¯Ä°û2ë–^.·vQÃŽ©?^Êy†¡ö90ö—DÈã÷ØŒ»kJ–g†¡Ù…z¬Eígغhv˜ <¶,`(ÛAeÞzþªëŒ-LZ.hK”ä‰ÁŒYyµ'¹zgªNrVÖŠ[\9>:(íNÑî+»ûmÎ{éàYš7‡Gá8Û²7+P¯¡Ccx¸òÀÞ^…¹žšÚºyâÀRߓ٫[?9Ÿzžß[®”„ñ[Ö_2Æ” ÕG•îT.+9éB‰¶äé7În/êªZV—eÃùR~ÀåÚ\™²ö[/ìxÖCà)€£D½oš(›ûÛñöpM”‡uÝ‹¥¼Ëi'ÌIhÙ*ÇNÃð©àx¶µYàÞXÓ¤À/P )”ŒÆ`ïêÞâ¢8m©½ÆäwÚ¼Õ¨§ à˜ uͽ¬…½`(@ã–®~¯´·l÷Ùƒ¾/Wàa«½T‹Í50.ÏOrÝ)™I^&ÙzÉgØm‰‡)²a–|fFPºÌ™gzËrù5JŠà ëkÉÕA<Œ šêúÙèüÃZ-jÙ'Á6eçYiJ«l§BSÚÍÓulöÝ!¥sÚÝÇ#V:]SPQ….:s-…Þ“|Öþãæ8Óé S|q‡²ìÒa·3ªŽ½33©²–îÙÝÓA$¼_ϹÁ±Jö”9F›:2¼ÃwÒc…ï¸Ö÷²ÄAkeÉîÒpç™{â1MëÐZÓÖÁKOºÆcF¬[7ßö7£VÜŽ¶ýœ%6Ÿ!¤¶IYê|ÁlÆžÕ?ç³m°2V²m| .·jðrÕÕ1b ˆ.Ëõy¸bŠôNOâj,úoBQ6¹jNÖ3"—T¤kgEÉ–ÌÕ5·ÊØ qT,ÔÜVàÊ㇠)= Çb§Ã¡¹½ÔÍ>²žþÁƒWÿPÒý„°D& ¦¦] ÃsqÛõ5á¿kÝ#eâAØ»š³s¬àë¥ÑeK"×ÄgUx[¸tqÑ£À.t|e]ú â7¬Ï¾äé‚Õ®˜TCrfÖ­E¿®ëk¦¨ÔÉu&¢Ð4(8êÓPGiͳc´è—PÿÕ%ÞŽ"uî‘m ­k¤V¨îxD9ÓMuX:žÖºQ×]W“? D÷u½q¥ƒù8—jÆiº¨²õŽŒ¯—'¬åà~ªðUWw¶ÁƒÀKf¾îÿrÖ+já¶èåðµ ®Õ½BSxrÝï˜98ç›Ç‘€k§™U‚ S­o¼üšŒeýa«ÖiKã¯kÖã8­Zw¡Óà´ä¬ii¯u à1ø Œ Éæ‘ ºŽW’^7¹ú×Õ_õÜ÷LÆÚtí_‹åm‚VãlÄ*V×ô¯ÐŠz‹lÉJYóñ»7\xéJ7 ûë µJJõÉq¯*cÁ"U—t¨k‰¯kì×nì S‰ž¶|ÖãÕ<< ‡ß¥ê€æ´0÷Ü xtÕ9j×¥Kg¢*GTàÎ…þžÇ©‹?’N€ÁÞé¸ þZ-¥–Žåë$þÕôå+µ*0{Ä8MM(j?PËWÆÖæË_·h]W¡›òÄt¯¬nȘÙE ?êä×Ä©°X±G§îé²xë̺Öïý_®¾õHœu Ö¼‰ø ž@íhÕúïDÇ@ @䳬»Ê‚‘ÿpIÝÎCsRº÷ðœÚֿΗÑ9¯®\,ëßXÿàQ1•âHéÇ¡u“õ ²,C°P‘Åx‡ €r0âT9CmÞÌ<«Äj cUøo?QA%irMw—µ$ü[B`I±pc`gñ–̰ÕÒbO§cQQVQÏ/ k½”Õôs\+÷<ÀÞªº‘ZMªú࣠5U±¢«Ú„¹Ð–ŒhkõikÙoµ)”nC×l¬¢âŸk ?0âøok9kˆÂÙZ¼áïÁ¥m#œØÿVs}†_\m™opÈáAÒ·-U¿­¥¹ `\ã ÛÝq¬…7ÒÁ·Y—3(ÚL«ÙuÏ©]Güia¾¤¢{[ÛK|?Š[[ã¦5œ´nÞ:©¨ ¨ý_'üýœÈ£œßkµXg­m£Ëµ-í¼­U½­sZG´½aö š»žÛqœó`œ­ÑC­óVZs\÷ Ý–o½ŸT5ñnÜÞKa:nhÎïílãÙÿVûFm¼RŸ%k }Óu£Fr8i€²WÞy½ë€=»Z8àrlèé%u¡1wÙêéëÕoC€8ø¥­Õ—³×¸3ÖEÔÛÚš«Ÿ² k1c¦X`2?Æ^eÔašTœûb½ß©?º&íï§!Iaˆ\¶ÖV·µ"ö¥ûõ'ë-“…ø×H¶C¨Y¸ -½M_Ëvð~ã¹\Ë!žH‹ìWrç ιœåI«;Ó·Þ{¬g`_Þ‹W"ð¬)œ È¢úXUz‚ûºuï±'êuªÓuN<0’:Œ×„8ÜzxÆ—èš‚=@X(¦ƒ¡k~G™X/Ü¡Îaô“NpþUí)Õ¤ñ}øùO8w·½¯Uš¶}Ÿ¦Î²äk×Íš^ͤBKº¯õ¼s‰z,õÉÕ‡óæ»±ë<˜ë Á`Õ¦Ì}†º­àñ>è¬c(³«%kýï\ûi ÐÏ¿§äÈvÒ%Іb(Åc»•ýÕzå=+þá¯Õ/zj§ÊŒ½±/L8ÌôöÌ/¸ãVO¬3ë*Ù ›Î´§•WLÁìÞ pXÅ' Jƒþ™¡õ;¶ß·nç¿{öAðF™imˆiÀt«ÈåÅØg«A¹¶OÁ#VG#zºDCoÁG¹Î¦òNùac‰÷®ŠY@O5—8öM“-KC©M»Ëz( ¢®§`ÕÿÖžCE5,«ƒ.$AÅgïn¤©uíЄ¾>†i<Ç—¹{G—âFK}°ýpÇË }<æî?n^Ùãvð,ôÁÒá;_¯´Öé¾åAeº;õÌóÖÇŽÖ¹çÍ¢|K^8МÉÒ~çÁ/^‰‹èR A–³x¾vŸøŒëŠ™¿XGñZǘ>OôÇHÚ#¹¨ÛF…+0iÀî‚rt…3κ7GÞsFÇñ©Ä¬Ë3𳫑GÑô¿í@èôËÇÏÆ—ù+b¬{!¼z¾ \†”‰#ãhÃzÉòXû1¦*¯¦#B˼0ØB«‰3 ÂQeÉ8Œt®œçÊFœÚÀ"NHfmíY¥VK–ØÀÏõÎE=v…}³;ñ,ûß6ÝÎ',i>¦3xÃíP¡À1V,×ë)†ÉÈxöÂÛ€¸KXsâ³Ãºí_P‘ýt»g«°@ÜCtuò³Õ¥Aó6ƒÒ&±¼áê%†^=¤F;¯4p+¦§E¶NÓ…’ÈtU‰dîØ1tÜr}εµ4…AGB$H¨™±ºôœF„ÆÉÔŸ: ôü:è¢;ç¯g,`4üw}°†%kN'øký·m0Ëj2·Ñ ÆÙŒ ú*!Š%DzŸçÛŽN۾⮽¸£Rý¤ëEל ·É>*থ㚗²A€îtàž×÷íãkÃ÷¹$nûl0eU·~SW}¦ÃwPÎX/5!Ôq¸ãêjÙ(^÷É ÝuQ!ˆ‰.éÛ°\?¶äâŸÚWcIŽçÊÀSÆñyìQsnÀÍ“¡HÛú¢ÚþKäùjÛ{æÖ°ˆÉþ'ý@ÚЮÎPZÚX¯±:k¥vΆ‡_—y[‰Ó±™õëÀµ¥É˜Ón´Ô<:Æ@ƒÑ(ÀóSøf…ëW½©ÿ´;¨§¨ËyÝmb€[c Çù¨JIÇa˜é¨Uуpý–¼ƒ™9Ÿ³X´Ç$’ʳ¡Ýþ‰‰ ö½avª.*oºÆ0î\{'$Öz±É0îhø8²®ä—¿eÞcê:éÖhÞXÚIsãÙÒîø’ÚÜEë½fÖ„’¹Þyf,;'3Ìß {iÒ³{?l„»wÒ±p§©ÙM°9gF¬Ç5"'¢ øú ¡c]ß½7‹j ø¯Âëù¥FèC840"V9ƒ´Þ —ûjNujœ³œ‘:‘¯T€”^ £˜ÐF[üÙ·/uâTéƵ5™1=«:×0z˜‚òuœpëùzþÁÈÄ*7 –Òõ€ŠÿvwÀ¢‘˜?É‚ÞO´wý~S bßq›@0‹¥oÂ5žLxèö9€T¯ç þ ¸¸œ¦³PtâG "òšÞü)cëTˆN8áp$>ðîõBk~Ì4ê¹ÆólEƒJDÞ@ïé|±ZŒõo6ñõt:¼ÛvmâakøÍµ Î¥¢NF`âà˜½9ŽùßLó÷KogÞa¸³në"”mÞ€€æ…Ç×;çªà¹ë6kõžÝ}µÏq:„E#òR÷4†»ž¬ÎÓ9¶H> Éàøþ/¿2Ð^8﹌¬ãáÎÁ@óG ËU1ž­*µ4ÖtV†ù rê­»þ­fÐkfž~Î~4¦î xþ­{!7jÍÌ9 pôùzñ©_÷Zu*a^Ã4ôy]7T·Æ¥È’š{êÂr¡0Ò;}åt æ×Íû0Ô|ä–¬âkM ˜ãÁŠ<¦‡0 ‡ÆžâªÍW·g9æ%ÏÁHƒ`Ø;ØWÇWîÈÖu&z‡KßÍ-§™¦¼|Ïj¶t '.*ëG5·ö>ŒÒC´”Ø:ªJn·<‰ù(R%¦èÐ’4·t€974ˆÀx·ýõÕ]ЧË#½)9=ÐOúâúɳTvOmènà`ûkÈt|Fx˜Gô"G1³ë,6”“W1?BšwB»àÜ ¢¹Cas¿/l}ß©#’oɉ¦¿²>}²…0 è`¨?~X±Gù­Z¸/CpÖBAzfÿR§5¼Ï cp\ )ã;o ©XŠ‹'áãC>'?fn‹h„º…¯w$:1í ·Ð«'÷[ 4&XöëA‰ù¹;÷r˜+Œ+3yR:ø™yœ2]¨1:NâMbnWÒt/}¢¿šÙš‹†[SŸåÐ0mv£'9®›4M”þY‚/Óå6“ˆLæqI–…l¹\´ÇYñéÃ:Ùh‚©ÿ/181?Œ×ýö õÐ;< þ6ŠzK"Òô-^4ìÇ—[Ø”³ùŒà倓R³zRr˜ß\ßs='Š):F9ÐNv~‘ƒ®bª¶6S3¦…·ÃͰX% %uþ‡nÝ{2£ ¡Ÿ÷Ò˜Šö,~aS|ÇQs‹_—6m Š˜Ÿ€ž`¨¢Ÿxlbº.¢#‰ Á©ªUB)ŒN?æ×Iáát㥰Ï^ù &±öÙ-¾±Ä,[ÜŽ=…Ó^Álà$Ð<³D™žø²"6=Î3vüoO+Í®8û4ÝÚ3¯ãI<“€¾bÀ+E@LÂkë«Wãë3ËiÆ&nÚm}g1q¦á<~ò¢Îð™·Á‚Èç³ãžIW ÎS´HsŽ!¢qµ˜©|µ¤HF` ª†U * é8g‹\ÞA—ÄE1uín2W4þ—`ý¬üå{þ`!Ö¼_špåè4ÀëQ¢# jRÿæ0®Õ±…Ç¡ d޵¡„@±21™ÉÌiä ’÷ÒOÀ2ÅêˆXŽ€nQm®3c0›ÉÂÂWp÷ &SBv2‘»xô|L®0TÍôå4uQÀŒz€Hd'˜Nö’O\&›fßv^ú/ÍDV‡ Ÿ¨ÛÐ ˆªq³}Ÿ·à#'B7à¤Æ‰õ™ƒ㈡ãkËŒ¼ánz߉Í`t‘®wFÂpB²sB.sÊO“êÙC”Á¾§mÐäi ½`EW/•gÕúÒ¨›àº–·C:1™É IËI#Ÿh#´ÄÚv™Ž¹¨‰Jp†Ì­u2 šQÒ¬´ÁHNȆN™«ÞES²‡ç瀎¾4,÷óD°7+S4`@œcÏÎ;ËŠïöþcЇ°8¢¿³çjtç¼ÏÅu‡ø"[‡8¹Wd×Aä5!_óèù3úVÔ“Íi–‹9b› ÝO/Ù:È¥*3/ŽÌ2°¡2M+Œæûau².?/·õö˜µÛIìÁ†ÁñMôh¢îxšô¥~MŒ ¶âh÷Ì©æ©P&vËΩzk4Ž# +~®››Â ®©TúI…À¼~$ˆ¯½•Œ kàP‚p×ñ_vê fßšãLt?ÌîÊ«æÆ÷1ŽKsW9N+­4ÐÒ£w.¾käšù£ÑûͧU¨>–¼=<‰j$´ÍDå,3ΫZ`™"k»Í3¤³iÛ¦êߺñèÒœ5†ö¨©šÛIù–~Q z<=®Ñ+ë˜ýˆ»ÜS?åÖŽØ7”Â3ëRC 9Ò*ˆp~NÈ{ôp±€Ø×$jÍýDgµ }Hô2=›§€îGï5³ÝŠN†ný×7dµp:íV®Ÿ¼ÌÐ-;Zêø$Lïûáã2}‚MOìM›  ])·ºÝ&6•O\[›‹®†LS“œH†~¨Á ÚÎ/5˜¹„îµABóÌC¹;žÝ>η¯9‘ç…ò{Ô婟z-%‰K+Cå“íßy*ØvîG -«z¯.Ô”I$â>®”>úFq4ƒœÊƒ£Æ·óxByÊÑe*tÞ‘Vç)nÙ^7 w’&H#Å9•'†±…<ÙùÏŒ yÒt~_ôÔäÚDÔ 0C‰ž÷’(àé¤C"ù:LY"sÌÃõ(~8^p¢FJt:ýQÜ?Óµ53{ÿ­¸ö™}2[šè¡)ô!lbžó=ÃÔœáDÕRù‘ƀļí¢S[4ç 1Üø—¡d+„x ÕšJöLDË.å±ÙÁ:H  "Há2w(û=IEÉ“¸Á½K9÷¢—xæ­÷Ä[¤·c™r-Cì”ëJ¸+:˜¬JLÛNH _¿ÑnÈŽBíqvEÙ›³OæÞ¡ ƒ Ý“ Ú)±K ³õÁ÷vÖÙý¶U×îý:—ÄÞTsð2BÈJ^<‹ÚÛu'¬ç:³´ëÂþ‘?Þ÷Š‹‘ÿÛÌCè"ˆ³"¤\) ûEªiR9ÆŒÇòìVo$¼!"hz¾eÀ²oⲤÝ̾„ZÚÐÙ™‡Ë£K8I NlD0Y[ür4 ú˜0ÈëN´æ4-<g˜Yæí`Zø|ªK@šS¿pOß®³Áùƒ×ò±ðIÖ·¥ÌÖÖð«ós9ùå+a ÃØ7,ñX.»iC5û„¬ïJƒ oý0ßBE’¨úppëy/ÇŸC?zc×à?ëÐôlë|m}j[ûK O½ º·¶¯H¡ó5/bêÔíQ¸HBè0¯¼Lˈ:«Ï†¯©>®çTµÃ˼b¥\g:÷ÓÔˆbÛw@ø@ŸñÀH§¾QæÜíR°5…¡‹pÉsC‹½W!‹vVW عÚèô¦ $¿ÍN( @#ÞqYÌ dŠLŒ„kˆñÒ£¶ùø?¾>F*ømÐQp0€zÁ€qâÉe’”}0;§7 ÒO¶¹Æ;WÀsÈ%‡uJ3ÍÛ±1v¾N€ƒZ’˜X \SÑ0J%"_U»¯JTǰ6Ú›7¡fÝ]ß…0b¥~’sëýrøÌ6=ygX5GNx9» õ ðܵƒ'°R[I'é÷ŽÑéž* ƨlƒš£Ë ƒgmÊ1]§š×ž¦x<íjý4ÆbSeø)!ƒ]»VTÍûݵÓfÙÚä6éù®Îóž$ìËŽº=Ï£êŠÛf` 8ï´¡„¼u}ŽüÃKs1@ZyÒÜw~õ&Õª1PwûÑkÊ K#ÌY0zò¡†ˆOæmÑXv5$Ym§Åê×Ûðo½«ZìtצÐzÞñuWH® Ýy³k£c™ü‰äDl!/~mxÉÖÍRÜ4¤.ÉEQÙL[5ðgªñÎÌAá@䜤YéݦÓ|Ða>¿øYЊ©-ÇPÃ2þ›TÉW9w&C Þ!ˆ:÷ê\·ËýQÇz¦¤^⨭(Ü™ó"sK>Ñ>̨¡OjÒ «‡X¶CrZÔÏð¾ìø•*{m‘çaî{Bd É1ÀÒíUÍ»[Çé[Sô!C\¾t´¨¬ª\¶Ç^ÉȤØt‘ÓÇánäE„á%£E”ž•Y-¸µ¤ˆà†N@·Z°“•Ø=ºZkRæ gX#.xÄ_õøø6‰Ëä—{ë1°Õ[¿Aú´¢kU6PÈCº·%ºÙ0BZÄaUÔ>ÏŠ!¢NÓª¢Jð1„) ü‘_ÏSŠ=ÌRÀò? 5Gæ$ï=$ìcµFÖþÚÐ… $$Ú%ŒÄ‰Lþ xüÖ¹˜ÔzV4ë×ái9©È™´uR’ZÆÈñG[ 7'õˆ©X|5wDÜžP +(Rð`“Ž’ šý&<äˇáiÞ~KÂî¨ ÌXr: ¤˜ïÍt³j݃×9Ká´ÛâHVp艞A+JIŠlô$JN‹ žÓ“è²—sd]hséà‡ôlr&ŸJ—íÀØÞ6€ª¼2W‹Æ‡Ð&«`¾YÇMGš{¹ÊÌèg,}i2ÉÈrF ï΄"%×Å H÷ï£4)S¬½úšžcv«´ƒRÞqmǃ UÎÁ‡áU øÛ¿6jÄT²"þ¤œH£GÉ•q¯ÛÒú¾`÷ßZŸQˆ)¶6èÁÆ5B˜HEÖ^ÈKY×rÜ£9™C=PÜlû†Æ?3¹ Ùum|;< Ö®ë &¼ÈÄóÖÎ0˜®›wD#;|V<ˆ4õ~~…pF¡¶ŸÈ: Îu~)ÏÂT¨ààBd!!óy2Ê×aºš±½‰Ô©;ÞÒ’†LÂP³ý°nݶ—ðGc‘J[?xGt$†2„ݦLIž¾KâÑsDµe$û³õJÒ«Ý ’‚µ—‡dëÈðSrÖ'Qe£waè‚¿6Ð Òc|[à€_'! FÃ[°Ú’¼S{HÖ™ã\ºž`ƒß‘­„j°Ð(bšêãðCU!UÑiG’œ‚°Á{Ìçu˜ZïÙõŒ/#qšákô‚%Ýv7¶tàñ †§"ÐõaÖÕ„w& ˆ²¨7J5:b!îZ’ˆëÐìÂG?52ðEØçTš¥[ÒyȾÐHþ—F]y:7›+Ÿã‡€ }eˆH$0¬ Í|§ÿeUÒh.+À¨o«YS%èRcÚŸE=¸±#!Œt©FÝ£•)‚ÛÚÑyFã·é­ º@RP3ç)¢ZÞæ°¤óëí‘j…7b(ñ¤ž7 À Ë*QB¿“?·Ù:è‰PÜîà”D'ÜÜÊž3ÐiÔeÒ xæžé}kú˜ìÝ©¹È»KEÕo¬¼ð^4¬vMw§Ç5P?tFTn”Ì¿UíæÂfá`Z4æ¾&ŒùÔˆÊlÔFÒn4ndÚËŽ‘3¥*é”máQ¾> Õ1öHÐD¶Ê¼Ýmhž×`ðf2Ýèò¤ÔçEAðù–¸EOh)zyIâ¹ja¥KÓž¶GGwþÐ?[¤b áëýf;MáTh±;t`èo¦Ù½L[P›³æ;à v¶ÌíÉ/Bjœp*5Bj¤¦o<ŽÉF…ŠéÖ¨°a1þ±<î W¿>ÎG àIHÆNötÿc€ µól—Ôª&üwt0zn¨rÑÔ³æú„Ô8Ì ËßWÔ£^Žî÷å>ŸÝwF¡6ÇåèÛA8Œó`¿6ŸÄSðFbÊ¡àÊeL{=°ZNçî9°xaA€<w…´cB¢©Ó&ª kHàpHH_:ɸZ6óÁ‘rÌœ§ËÈfñÙt}Æ6äXR9³×L1ÂÜ‘®ªÙÏQ@”~3¦­éÞ;v£ü˜txøxˆ’²,ë‰\ºÝÄ;Ýá¾Ô¹Ÿ Zý™Gݳò´Rçœß@dœì!¶)d¾¶ßŠl¤Ÿ…~+xÊÁ1xFâÍN<•kè&ØÖ ÌaS~Ž'ƒ*ç'H¸Ômä‡ÀØàÒ¥èz¼4’ÿÈÖF™Ö×~[rWêäâã¾-­Áµoœ³m!Ü·Ä@˜CÊõõ7šEÔfJ/NÆ£ª}CÁ»:] Ú4m 3ÊÂà¼Â;²ÑOÐ1q®€^‚N…<áBR:†2•ÄDã­_Êp+•ž—·Wí5 T ‰L ý±–@F]>ìºgHß®g‹ Y^ •¸ÔTí+ij:ÔÔI‚¶ÄkB‚¤ëg,Ç z|«£ÛQÍTÛq[·¤oè´¶ÔlÔ•uœs¾OŠdH¢fól¯S—“öiË.‘ yH cÐ;ßúÁo¸ÿ:€Yªn]MpÚ¼z‡hB¥íbvãÆ>XØgçaï˜ýT¨hÙ ör"K mHS‚ÂNå^«ñg Ry´åVtðü@z÷îñ¾O9¹ùB©cð>Kø1«f»"Æ;+¦hÉ´——£ z<Í#6G!bʬJíZõ™iCáÓ©)–:Û9Ö!ÇúPþ¨NÈ‘ÅtˆÓ&(@\ègà)º 2D‚ŸmŒ×gÖ¦n5åÀx‘žh“=;pÍõb×’™ü§°×TŒÇ"wbmðkžH¤ÿèæî4ÅŽ ÅªOTÆy(76òa»/6Ññ·æë4…L‡BïCÚÄ|ÚIŽßÃŽ‡“ùç9$"θR³øEMƒʆ¶;ñŽ •Ùt·±§½”¹ÓhÎÆÖÃg\óI@f´•7›ã*ÅÄ¡:À»<,‡Ž7$äÑúÄ¿èO½EÂPK`’X¶ð$NÁèËò3;xóÈÁj}Íônѱ>ˆ4(E0‡+ZQfΟä¨GO LT;Éx09¸kú we;¶³9oÌ*""ìs(|xæ†7âÃÃúñ؇äÜ* Š¢HqÃj9V¦qŸðÖZPŒˆvÀN1CßÄÚ:£“mqÕÚôU—<ðN'0M¬*I ò‹ÞQ´MûÃúÁoÆ¿1AC±Ž$Öíc1&ý¾¸eei 0Q&2À‘ägP&ÀÁ…é§?jØ3³‡EyºìéÐæœ@fiò3H¼:«ûÛ™15¸:íáYieí`SI·Åã8ÝÄKÜ>×|p2ê}VÆvNµfôæ8„Ï­º8³HÿáXmüÙY ôì28¯£"•^BnBÈ)‘G+–Z­¬pREýÂûVêï9{öŒ&é*Ò$¶ÖG˜™ÏD?BœÎ“ú<C?1ò¼³º@qAº=4z§ Ÿ÷Æbxß§xæþ¶5Û¯òx•ŽXŒž³«ì§€ˆO´8ªž¼=ŒÊbJÑT·iAÕŒÎßàk*“`H ç¼ß }‰ Bµ¡ðŸ¬éòk•„zJX ÿ¶¾ø‹0ü}Bš*í µ ° ÑZ3.ª‘Û×® ^>XJ0z#ͦéu…}<ŽÎÑ(«u…'I8O„P‰:×m®µã4‹ÃRN7E7á_EÌɳ¯ç ÍMÈ­½AÓºRµ.¹Ï‚æ´6_;‘ó:«Ûþ¼!+L’À¡óOù¢ âÂŽàU9߬qJd1¿e×2ÒrÇW!y2ŒÅƙѧzާy•ø–~Ù9Ò±ì1BrB®îJæÁª¾Æ4±kZnjJÜŸR¥'¹tŽZ,T<•¨éû@ù_¼ˆ­àÓðˆil½ÛZÁá™­Ê_ˆì òÌ›·V)[q¡“&÷+x/¾´ÂëG,›9uŘÜt>NŸ‰–ké̱\¿išF‡ÅÜϪuœh?çD.NQ€ÑB+V>àâ;àž{FšŠ(/úq h Ñ##ºmÏáÛ„ <KY-;|aêÅÜ*i&…GSºQX×L¸Ü\Áë ëoÊþhë ü›—áõÒÚ¨²ˆš5!›¼'t1FËÝ€ñR¸4˜ö½‹€ÒW™èÙG_æm-7²]m¥»Ç±h=ŽÂg—Q€+QcèL?Q‡tQ§ ¥3¨?òÃ|kˆŠ'Ÿº”¬Mi€t¯§œIÈèëX¶ʼ-ŽR› ,¯7ÁÝK=P+pä§œüâç„)¿´ÔªÐ=FªF ÚžC ißò××±nà=ÆûZ`“µH뉂QÂH46õÆWÞõâè¸Ö±"-š×¹=òÍkm‚Ñ#ƒÑcm˜§®yî߯Ptd@¸bž f>²›…O%ÚLÞµ_¯³˜±Â'á”%¼4¶ÇxÂKèC2yµßy¨°‚-n €2yìŠÎu<µpüfõ=0€ý™.È$ÏOSýL)—íx%àL¤|ÃÏÄ{µCóv8¹X,û+ï¥ÚÕÄÏ¡á–p§¡COÇíáxÚ´nBÁÓh/ƒC$?›Äœƒ ;ûéÆó¨ï,—4žÁæÁ *n>ÆÀâ‰I›„JãùÙt@žþžI;ÑÈ…®ˆ³s¥„^`Éž sÌ`¯i×G\§¡Ç¸±úèÐ~ì<³~`ÒßÛ û|¼ =1xÛa) Éâ–]‹@ƒúN!ûëa\ ^䩃Œt„ Ò ¿'ˆ*MÏæóÃ=õÆgøÇkíRŽkËøFL«ØÞ•›µ¼5Õþ*û3©ßŒi—ᙄJ#òDD‡weðr𠕤öX} È$vkå¯ ±ôeÕÃD¬JȎܨVšˆuÜ´~Ûwï§ ¼ñÐhä÷xbFÄ1¶Ox·¤GóîÑþíÛÙNe+>„ÃiLljç/9‹+lÝ8eéë6%í¦4O$aéEK¦#ÉçIQI÷NÝxd±ºK §Ñš<>(‹Zz†¡ñ ÑYœpa™Ý•vj¢W¡¾ ˜EÀЀÅѶç4µb­ÜÓ +¯-XÉ7ß8ËÁs†#CBÔ×èá;KÎU,˜ 2ù9Œ`öe¶Îat\ç¨Q­™m*q4Æœ‘bW æ¦c5{;k¹¡gÞþÅŒjëëïòê¢oþ“=›ÓA£ ܨ ú2ò§ âmaÒBiPà3]9ëDÎ,A³?Vf­-`µKhg`;ΠÓnëþ¶o˪Zš]œµŸéAÊ‹Lš)âÿ „pîÙ&4D™f!æLGá¿X0•P£ËäK«³(:¬Ø<âcë¯ÁK÷Ådû2agñ|ˆ3Æ ó©×’O¡ÛLæ 2½Y8†Ÿ*rä‘ån¿¦H=Hr¦æÌ8cd7¹æk ß°Lå]ÞC³Õ*‡³œÿÀ¤šYöh¶Ào!’™fP{üÇð¿Ïp¢O(TÙJ߇tþp°P±g¯âܬïDâvH70S¬M=zÕQpÎ%™\È3[=ÔscKdUæ½ïË2Xë?BÅ)W>CVVn> YÌ úè}ttâÔ–Õ-¶~í䡹·x G´ÚýƒƒŒ8ÇlÑ€êËñÆËtø7Jt|㓊É`zY¿qZ"œc¿{ßC`ãŖg¸ai¨œ*¤ï¸Ä ÈíÔ8] HÞu™ÐÂìë&SÞä±^ŽƒI‘;–Ô@ÙGr!Dâ‘¡‰ZXþ3Æ28Ö¦M†Ú>á³o+§6nt‚ïÂ=VÞvÌq¤zhKGÚL¶B¼o&ÚJˆ¶ÌE™÷#?o}IÎ\ƒabm%\K …æ÷)(©ZÞ~±_Êè±ê@Û©k|8ÅÅÔñéð]o_h&{Ê‘‚úÙÞÆ].L5N#Ï ÓP|,OÖ4 ]{39B¾x I§0²ùï\hãe0€d$U`¼Lþ6+±* QøXÛxÆ}^7Ó;áÕ”å#ƒ\„›3⓹Ø2ˆ/6/’f75þv}&Œ(eXxüy¼dúóòQ@÷q¼eN´G0+A·öâMˆQØgM¿K®º‰wÉ< z—³a ð¢EÙçæÈ*Áœ•m`êj£3…+t¡D#%C&4å1óªóL•’]™Þõ Ô°*å¨ÙèÌ;r7ôÚ`¼ÜÊÏ“Ku ²R‚WQ)s÷¨š;¥º…Rª[xÐßKu ÝÀ‹¼/¶y¾¿ä6û EïØì%ɵ^»½'VöR‡½*$‹nÎxn%Þ=çoœ )T¶S/±[q¯Íé1õ˜`£ŒÕµ÷0“f¯‹éü}Œð~ÃŒÌûøðãXÞJ;¨Ç7ÙÿÎú÷ýÊ g"ÅnE¡Å (ÚMäwhýj )¶Ø„»‰Oç8gv¿›Ø¹ñ&ÂrÂßw!lµÁ›ñVg!fÐÛÍ{$ôÓÆ=º¹vt$t?¿÷û|”2|zÀ2ÂæŒHuØßÅÿÆ­oÂFTm³¶1çû‘ãýÈñz¤7q¼Î‡Ã›sþ̺9M‚Ü)Ó›¿Ûùº$q0×Gb!öÙü#Í~$>A?"||¯ã ÈÀ†0ÙDž9±7ñ£A.Ö'ÛÌèü»øÔÁR ΜW;ÎgæHd7¢K4úò~ƒúx «‰–д[({SuÖÈž šö&vxMõêðºÃF§ƒAűÏÇ©ñ|[p³ÏŠ›©®ó©÷<©ÙçEÅR †]­j._|Z•Ý¥fEÍÍú+7ǚǵ8VJ _ù¤J±qi]¼«)⼫Û+ÇCõ¤•Âc–ïðyq»ý}¤ºÆ(/ηÆÇh­¾œ×Òv‹kåè7×jc©Ö¹Ö8/ÎÀÚ:нW¾bmûà­!TJ•í ȵþ`Ê{ÂѬÌì¼ÏQ'Þƒœ>ŠtÔ‰Üäµ:s¤I7Re\Æ.X&ÏiU•vFU£Ì«aµÙwÖ¹‘_c½•Ðk=v¡ËdeäÚ|Ø5îôaǶ¶×°k3 »—L¨&@r±6É>-]í.™AŸ’ã=¯Qòµ¦‚#®©µ·{¸rͶ5TEau§/¡Ó¯ S§ŽÇÕ:RüVÏç‡Å?Ô¸TC0i¬ÍaÊ|Î<÷:È31¹Ž8±cj¿öq>6eúÞÎ¥ûí9´FÍ=ϲ“™ùƓϻœ¶B€êáê,ä‹oÅÕsÞâ-®÷àˆ«­<®DÅeGžj…ö…/lBSÄ6ÄdzçúŸ‘z.>ú$®ÔXϾ,¥w'RBSàZ¨aµ&ŽTped¡{'©:`‹oÍÞ•WƒéoO#60N6´1Köfæ›Éƒ¦5KÞÓѧ €XY¶ˆÀÙX”$û-%ÎôE6»CŒCß˨êI±µôµBŠîã ÒŠ,¥\—Ó:u}¿æ’WPW˜¥\‹?(,Öfè{Ï3î:÷Î3„ß”¨&×Ì5-1çÏÍdÕ§¬µ¨²°E°odƸދ•yØoÏ·ãLú˜N—"úY±¼‰\ò_¤¹f¨*Ö~ pqe›±\ßöäàÈá öÅW'•¸NÙÇ­â@„‰˜y.¬´Ðžo[Ù_í»^r›v}Ú”iò¡Ü€"#Ó÷¼ŸhHÔ} 2&÷ørÏ^Îb°¿ÖYé†ÈÙr€÷EÏvS)s¤×ëú°‘ót›uÓfÎÇý0A¥û´P}Ì'ì8ëNq¶B:ÈðÙÚyFyMXN©á–%"ÆFÖpJâ^cÛàh<Çüþ6ÔžqšøÄa?æiÿ°žÃKS*žÆ«aQ8€¶»MómÊQm#õz¥É«µCÚßxÅÉ.Ú‡d9ÄY ;?Pš»ÑÉÚ¶q1õy§_A(‘Û^ß~ ²iý ]/•­%ûâ_䥲µd½©2õ„»ÂŸƒU¾¥Óµû„묽ž5êô í]“hµti{\“ÚÑQç÷ÛÿÔhw¨ÿÉÚt“Ù4–ÍÁÑ ÙZþAS£§Fõz€-»Þ…©Ý²Ù¾4•Z¶u‡´“ÒÐ4ã:Ö¸¬ºˆo”`õvÞI7E¬ñ×öu?Ïd>™V>UhÐAðêébëtDSS»ÜkS÷ë7µ;šþÎm’–MßkµÆãPŶ­‘lµ;Ÿ¹òÓRqm®ÏÜ*ÌË4ieØR-¦&fP4ä&ùº^¨Ð¾cÈ™Z›jÆœ<މc5¸—1Ø\º4·ôá¸tGDn&]¨X¼ -üÖ²÷ëa`Xȭ݃YåŒ;’ôÐÔÝ{ô·f+6rÛ̦-® CëQ úZßh€æ`üA¢ø2œæÜ|mmðnØá,xµͨ ÒHñPÛÝ÷/ÿW~: ‡-†ø,Þ{¸!D‰Ú6äRm_ÂÀ Û°…´ ì ¾ÈŸ»õ” Tϯiîæ–Ð%áҥѓ=Í«¦ Ѭ·(i ´i«xSÑ2¯UýüÍÊEqÞ«C£ý8ÍLëÏÒ<ÞuÍ}Ið9œõº–ý˜{[žÛ]²†)Ð÷ì!¡–­œA ôg¯·ûeºR˜ÝN#z½Â‚ßSŠÇuæ·¼Gà­®ƒ‘Š5›AÔÍ£µ# 2µ{]ï”1Oº§¥.F=}ºe(sÀÞpß%‡ÅXèQ>D»3»g×cÇómî<2scS‡ò¢çOÕº’‡”{¾\3½¨'Ä-ÝWGSm3Hh„ãT}±žêT½e2ò¾{¹pÓï‡ã³ªåBôŽö (¶tüð&v–è+G¼Yó4ý%ÐÀ®°6¢*_¯í~×väÎ^…ß}cåléÊÿvÏ–Jº™t/Íœo»B¥«P[CîrAý:MêQ–¹›ÁÍÀŽàŽaÓ$ó.>ç;7[¶pǪзG c¼qÖ·í,Â÷<ÃÖÄ­tÜ«WoÁ³uG›z»£M€\åÞβ£¾Q?¿?zÑ9Î5Õ­Õé8÷cƒû=ÎÔ9©ƒ¼%皇½¹ýù2ÞYÿ·»’@o¤Š×NV¡qh-T¼"½5w’ÃÀê,°NA$¥«¼Ú:\kÓ™.½úv#ó!u±óKÉkfÞd¿ÝCQFw*à~?Êì Ám¶6r_ïÒ±3´–öy{ö‘nžû–8l ðBÏË Óaæ ÷pÑÚ_žÐñ”«AšŽçö¤"œ•Çc‹ààÄí&£Á·AŸpµ‚@•`xù m¼`Ò -—¢qí‘c¡®}3P)¬ÍËþt€iP•¦×H—³„nhpŸÝV#”ˆ‘Ôk ¯.>äØž°Ë¡:5(¸‰m˼†>V8G鿼ދ™?ƒ¦QÝз¶#{—%žê’A€=œŽÞ9J4‡Î  Ó{TVLùA07a>~²øZÀŸwðD y”Ìm•A46F¹Ôðñ@,\ïµd=6êÝ‘•Ú׃7ÄfF­ö‘Á‘G•VØ]»‹Ñ8@xp™`HxL vK°ãbãJX2Ã,U¢‡˜«§·òÂy»$›^ï“*×&‚ô`m†_¯âÝÑ•âl ö>ZúìhýC5›K=B"ƒŽ¾“ „+<Í´ÂQ2öÒÁI›yò0q–“<<ņ‹EXl8f‡Û;V¾;µ<ÓÝ×ÎæÒß°_‡^ÙÑÎÆ‡.Fƒ8ÎôúÝ]\ÃnC¤ñ¦LlÃõ1maŒ{3ö¾'0&xÖ^ü¢’'8óhUON³A>)œxß1ãˆQïx0bãðQ˜ÌKMÀ`ÌÃãðƒÂ`Ö«‹Þb˜+Ì SuÞº,ýçFþÇú 4?_ã6¯ÐMÓûqóÂ5ï±zì¼eÆûäyM´%ü­G¹zr¤î—§äëzµå´—2oˆ–‚l*Hò/'©ßàJÖÊòSàeZ»‘ZÚ_ž2­—êsiWŠmp9‹¯<5èóº¿J`0™ûå©â÷Ç ÔK!Mæ?N±ðEø•«³Ë³EÄ>9\Ëœ¿rOÁ7–r/t¢ßKx7¹ú[ð D¿7ý‹íu|½¬€í`mð‹}"š*ômÍÔ.a´øÓþf :2!¬]Î;犟ۢzVë_ž– ÑFü,þÙ ’ù‹gð¤û—'¨ƒêã´ûÍB‡Æ¹ÔO¯v=y« Vü_˜=§ž‚µ÷(N…U“Ë—€“âÈ);} »ÖÁYmDA¿²0ìq\TËWü·0=?® ƒ_IPÜØÇýò “L_ké[ìåYðœpßøòð…¸#§ k?†= x Êc^-ç¼à,œé³?OyfŒ)–‡rMp0m°¤ç¹ü:%=ÁCJzî¨'áսðqÕý[@»_ÒóáXûÚ§_¨ìÌ}‹«……]í¬·+¶&¥ãÃâí©±U{-Öã·DAÊ~IÉÖVÆcƒt›tnÐÁ^–_’É–G]×ÍÐMŒPÇxJºÍŒ-ŵ3˜,2ïÍ ™Q@"P¿X,±€ $Ë ) a('•c÷áS ¸)J²Ù¼ƒá½d¸wñ8㌉erëCƒýîa7ä òðJ²ÜI™ù%µ8 ]°r‘¸0Ê8Dùi¢2µKµA~Iý:߆/^ú¸:áÄ?R¿G$$ RêÙð´@Ö¢n½yø"¢3,Hæ˜ T¯wG®1JPYì-‡¤ ޤqYJ¥¥y²üÿ½RwãW¨¬’Æð9 yHUó¨ŽH±\›Ï ñVUÒüTæ—ÔYÙ_£j ®0O,Jü884MÕÚÖÅ÷¶)Ñ6" ZRÒœÖy lzÆO*3ósüA÷%›¡øç3iöŒçý±P±ëyÒ5)‡¼‹´ ö —Y5é¶Gh¿Ä æmNÑ‹VÈS“5QèGÞóÉŽ›c² {mð+1m[Ì«%fsR‰{«¸ ]:UQ;]’-rPŠ’bò¸CJ&sp.ïW¤»}¹ë¸©úíì[˜3/ŽC0ª¶J¾\Û%³ªYÑö´úý‚€fÖo…liÿ%³ü]ĵ ³äýa9øpª…âÕyñ•\\Ó|‚s〒´­æ‡­õäN®îŒN˜5@Íð( fÅ›rvÜ¥­r³¤Éå˜Ôé«-ßÌyo†X]ãúmšˆ6( ´ àƒÊˆLù‚úKeDÞþÚk}É$÷¨2æÂ{½¤ßsf A2ëø¥#f™æ~w1·­#~ÆöTs,™EÀZð¥¦[Á™,¹u}¨(ÁâZr»I%…â'XjÛUX@>X²Éº}êðã=»Œ?o A±–kvn;Z ²ð×ÞêH·”>~á ³À·Ëj›Ëý¼X÷VO÷0çýÀH¶Äà&^Kyñ1˜V2‚¡C óV<µÞ«ÑA?êf.ù ‰9ŠðÊÛzaiJݱG œ’¼dƒ‰AmLâéê¶—ðz¶¦ _q\SÙ,´3µƒ‚l÷’§´Ë-þœPp)D>¤[ÚQ®Šš¦†ßZ+òã×F?òä;€úÙNQOƒ9eMÑôl'ø]Kyì#•çŠÓ¤É—âa‘½N¼²¥Ü”,$ÿ N¤ËHg­ ³R RÔKI—USèÕ’ýæù·&;=#ªmk•ׇãí¯”÷B_RÞ£Ž²e$u”’oœ,KƒfªàÏ+ÈÀ_;ÐM™jDaø Òh\¹]š'RÜK1 °~eŠmÙ–r9½è™-Êóô|ø»^6+oV×í‹3Cu‚Û#‡ øµ™|ß²Ñ9õë_PoMèŠ1Í© ¾”ê_LJ¥Fô¸½’Þ Ã—&„ê­)®¾ ͽyiŠbNDÖÙ²Èt/(Dƒ½k—1±p¾ÎïÝUø²ÚEÂÓ‡\_'éc§¶³jÐ[ô¡üu÷>!á½”*‰šº~uw“1•=Ø’H4/žP¹ãÅ.Ê1úJ1c¥IZŠ¡ƒuÝ¿QÌêe„šƒë9«,'‘ðÖ+ä Åßí.í¬cpw)êñ tu¢n5KÓ×UÍ*碇Y°‡ömïÙÚû¨ysº„3(d•´`ÇcW?W½ éàÕQ*rÇ­Ýqmæ`v+m5ù—6›MÐ/¾{ÓàÀ.˜ƒ.¶XW×qσUýVñ5±º£6utYíiRéÎJ®.©Zîëñ2k­(T0ÖŠûðÓÀ«åø6 †}9è~Ó•Nø?ñ3pG”]¡/K-7ê–aR_êßêEÞ{©Å´ÿŸK]AU˜RÝ¯Š…Zû ŠÒIq·“ë±çÙ¼$I­bó? bhÝäShÌ"É¿T_Åñ™K—Ä»‚O,Nk­à¡ „‚QNö;XÁa™ÈãàP²¸Ä”˜lr¾J:Qö±Éûqs§ô°nØ3áoRÒµœ ;~m̤~ú*×îúýÊ—+L††ÅÑóÁ‚SpÓ‚J>{űL#Ÿnª7K2ñ+|¥0½fh2â‰1·¹—£¯ö¹ìJ¤Æ—“;Ãû.Æý®·µdAá€ÒµOÓ#0ÅyŒŽdþaì ˆl!B« ™¿À“S¬VV—ÂrR¬ý{h|›ï³Hqu+КVxålt ]aʸ£Æ efðg¡qaj{ }ÉùNôÓú¹§uë§|ß €aqIòk2ÐÁæí"b.äÑ ŠiNÈŒ/ô°FÍ Šv9Ä.…+ˆ‘ °M¹ÅÊFF*á&í‰"žOC*ãKs"¸®(_Ó„÷"—×;Ò[SÂÉh-.'AþJ¥9Ú‡ÊÄÁpvA@I3´O©|A·L4„x! `Š[&Br«Xš™ãø:Q¼Nz¬írC¹)XÚõþۃŒqÒïþƒÐ‘Þ掠Nó«‰û/2ÑK$¯ÀYÆÊ¤VHG*cCò|‘ä‰A»’!ï–ÃáöµA†E^™¥DUL÷\È%DŠpR»Ùƒ’BDæ+9—!ÂíGzü[SEtmDµ/dîai`(ÇØ+’¹™ÌÖÃß·ÍŠ¼õÒ„KAfüúûv{Eˆ›'¾~“ñÇU"xÌŠ§Â—΂fŽr„õÀE3¾²JE*žå8ÎÏprã†"Ùô¥sæ@ðt1HU,ݬ”‚XZéÍìPúÀÂ+aâ”þÂ9$KZ) –„xâ~ƒ­÷ Å{Ø,K ~¢¢«DóŽ‹@N|éÝ^™ÃëÝ3¸tÖ›,ÈY/L”œ4T¹’Ó¨š÷n†C*ç-v<;ÄŸšœ£µ ¬´é‡æ§nÕ‡ÃI±ÄhÔ² Ÿxÿ0±ZHž  >žÀóma®tr=déx? 2ì×^ú71ÕJŸž`4gL@.Ì‚ ÈLx¸Á±`r†§–îF‡ß”D6ü[ƒBÆ|N*¢n= 4ާ¼oVHñcÍã $¼¯~hJÈ($¸TßÎIfïÇn<·úØ|8QtcWQ{И#î.z‘u»6z½³Ç<–“ŽªgioÏRAªùÚpÅcšË0s_Q{7ýQAûÚP]BRA~a ü–ó (ÃÈ &cÙ¸å .ÊÈ3›ýû ¶Á^8ónÞL&õõá‘ãB=A·Ê:L,cc‹Â;pú¼Ò:Cö‚Þu84†ÀˆQyÎ*© ›½Ä0Õ=VÈzg’¯5 cÀ òEujða56}KfÔ£èM}Ÿ—ÅHº¥g}²æ­Ó§©Kéç©.-aøy9€=¿=¯ØN0Ö-ÄiJ 7Cã%·!8ž#µËÎv¿¤ö8RæRì†"¿Z˜Ïõ~XâF{¿ô®¡â€É2‚E“ƒÄ…­ã&Gk®—ê!¡võ Áw½©éwˆDÄ㎕#§nmòñPY¬^6ÔýÎX-ƒßKÅÃa,¡;zsïSz”Fpccôyß-çü稖d8/cäWRWWa6ü V†„ù‚\øHN±v`¼ º&s_Æ0í°ã_û]æx”ëQŒ¶>fZQ„G¹­¥ =Åó« «3¹á¿ÓLÓ2bÌ דg…­â©œeX ^¦/83sÛ‡ÖLв¾¢qn¾ `È/ȅ磿¹%T˜jŠ­‡l] â·v+‘á^BF<ÉÑBg2€ìñ jŸ¡ §:ÀÌ!†dùr2â ®û¢gÅÚ4_)S³®hêqFe‘_˜Vèõ +PA.z™îcæ‡ AʳÍíä>^æ!À\ýezšJÿ› ×™{T"8£#`i«BH/ó€)ÿYê&s_Bu2²¤á@ FË,÷·‡+mMZö ”Gdì$ä—YBª€Hdć\킌xËÕÞ¹eî;o™³ÇŽÑ­ðÒ2ß”bEuÁw"núÅn*bº·óm(÷Ò¦”ŽPµ)®@/O<’ã‹&Çd",8Èggàg­L>1d­€J£L3h”^¡{V b4^QÑ)!çg:ðd<ºèV„Ïlæ3E6}‰ŸAxü³7'@å+º·¥UoÆ«ÂD†Ù:»æÔ Sâ6Ò¯t@ÕFŽs­ê¬.§;óÇ+ŠÙð!Zèìòš¼\X<ƒ¾À5¿6‡ £ ¿hò|PHhYM·qè¶:Ù-Ç?üïÌY?TÑx ¤Å´Š'e2Žÿñ”q£™ª_¦Ã‹×ïÀŘ8^xó»>sZ­nOiù"rZ‡Þ\Ù…Ùõl–­i}HWûÍ“¿Ž¾I/Ö®îNe×JèTž¦ËÕG՞ײ«p¿ÊDúúb^bL–S³"§¾Ômʼûµ‡^ð¯ú(EŸ¹zêóŒûz&aâ}ª†*róë“vg ü6\(ê|fYÌJd䛳]žžÀ¹.n×óoØÊD(ʾ¹µo®„Š,ûúd¥É¨Èä¯HÄ_»’-ý¢rœIëõ l‘¸¢Á~›öõ±þ®H»¯SÜ·|S¾«>[<ŸNšú81dž‡Y‘Ö]Ÿ»¿˜H¤kN}¢/@6vé†ïUä1¯ ÀV ÇU¼> ãÏþdIÙšøý3ÛϋХKwYA}jp…סUpéËN;U:иÊÍŠö.®kJÇBQ)öõ[¶7ÖíÂR¸‰q„­Õ×Gܹõ:_‡|Å ÞPðÞÒ©’¾øY±¶ÕG|A„wÁ—éŠäòê8áŠæ>Á‡¯O¤‹¼ŽWµwͧ"¥¾zúÖãhÄË«úŠíƒä©"§~-/(Ã>Ÿ+¦{¤áfH.^ßÑE$i¯à¨Èï¯HÒ_á¨>á­vt=ùõ‰S“·8BCÙâL$j°ÝîA‡ÈUÄ¡ëÀa󢨬&ú7hf€11ˆ|1Õ#Í fE’ýKªHÄ_gkKô阞ì~§'Ú7¯èÁàr4 »màýZ6qëɸ–m¸=1Óýå'7—$à6êÜy¹Œ­ U¤×—æ“ù÷õG9ö**–d£Ø9îÇ›¬"ýy€ ãµéG”W0Ôôø·VJèj­"Í4ë—ì~<_ó é÷5%sŠŽX¦¥ªÿ¦ O¼Ã¡šL°¬Ÿ¼éQs*SM)* §¯žìË3 «|yN/¿ã.鿽7éù5á}…û¨žE>ñr©1d 5eë ˤ¦K®ïbU#ê5‰÷ÛáSÓËœai ÑNeøë2âjr¿ëÚ[Õ9sh3=¨2©y– fTMŸ±ÿµoœ»ÖT4w¿&;‰Wí5/[ð pbñ&S€LªÉi51iòræ0¨F£$jRŠg­ÈʯÉ×8Ñd¹|õ–þ¤F@œ!r7ÊF¹×$÷•ëI8͓֕Ds…‡ª ð@U£Ôe|•šä2À•ª{è·“°¦›fÐL“Ž˜vOÓÆç2‰ûL5+%¼"mÌÓS±¬Täí¯MãW4%¤·ÄˆMÕ¨‚ð6š|€ŽÇ*™îáà٩ɸ#£äÞü¬C&Pàצ;ã+tÞ¥_×wG iœ“_±&κq=o³ÔÓEÕSðõþAiè‡^£§&οÎ3µÎI,= [“ò7´)ïøŠ<üššÆ‹O ­ÿâkdÇ+_¡4©a^ïTzjªÂ÷kâ@™Y=5UÓñ+Pºõ¤ãs$açtá j‹š“¼Y‘Mk*ÆHÁ¯Ù)Â6)@@bÔl€Šlýšû¿Â›¼U=ádQxnT ‘_ós;wY숞Ϛ•ÃÆ/žÎŠ ýºSòáÃ&’+Þ¸5UXÐ~\.ùŠ”ýµ¡X…@EJEÊ~Í©›Û/ÀŽ;tè@EV~Í–4IWNÍ7S…µÉ¡´ÕWV¾ÌîVæ½tÄVÂȹMÏì ë5¹fJ–¦«(ôk.Ï}¿}éðïUxñ*rý×^Ú ÈͯÙcƒ¢AÅÀÅCÝùõm 7—O#˜Ô5+æËT(fL{W$è×ü™²›•YùG.·âM®U‘¤¿6Âo [©û5k¥X¯Òæ$*•©•!zEggPqX”>¨8ÈÚ¯Y\’F(Œ ’æÝÙQÁ«NFðšÍ_V‘ª_O:>Z ›†õꣲ’9‚Œ ¿‚,¡fqG3ÑÅæù©L¼4œä¡wú©Šœüš[±§’·á­"±Â´{z*«Ò. €šG1ÖÜÉÓ><=`™úF”»Ž,ùÈÓ®Yù_^KÓ+Ψ"]¿æ~¢œlXÍÝ=‘“dN· R¢ƒ=K0kï\jD¹[[«fóC#Ê ûb(š/yÜÎñA\@6ßJ'ÍÏU­©¢FüÚH óªh’[t^¾Ô¤é¯Íäg£¿˜#òi3v ¤_ö‚_Ò/Z©šCa(5yÞJ‹2ÓKvm 1œš?¡5OÈ=bwÂýú¡ ÝHËZžK l ¢^ýQj2{ŸÉú¢aÂqNÇ"Á+Y±ŒŠóZ\¢oÒñó Ž;«øè—ÒƒŒýZ¼Â—²xÿ ††ÒZW‹?qÍóË*X›@·^MAR<7×ý ÏÅ«Ç}³Ž ?4I¦ŠÜÿZ2?4X Öïãä[Ý…ÇgK^¬àš¨%» ˆ…å®ñ›2pc×0g†ÓÙažZB˜%‚€×©ÅDNEÒ~-›ØFÏ*Ó\Aµ¼\Žã¦”eïiô¢¢4}-ά"ã~m:;‚¬”ã*4ïà‚ûE¯¡<=¹yœY¾")½–3¥Ã8+Rôk õ¼è±›ñ`ó›ñŠO[›¥½yÔ+ëÐ뀨œ¯<ýæ©•yú/Yá îª+/^н¢³G½¶p é÷õh8S¸*H *׆ KJãÕ³h•ÁšûÆ5LjNøÁ:þ *Rök1D‹^_"µ:“‡.]™úˆUÅÅéèNE+”\î¢á%ÃUѾSå+2ù«Žkáhxm(ӫþèÀ¨^7PŸcq©ÅÜ/Éüõ$ìorÔ pT'”gèÈÌ öÚ…¹«(_‹9É a4*¸œTe\K6‘•Ý¥¾â’[‘¸_ËmG"YäLì…Á-oß²j¼Æ¾Õ®$nu°«–wo ·Ÿ¾ò3y¶>šV«R*‚õdëã­ ¨êóÜL#³ {eº~·R¹$9ˆßBËlz4Ùüµ-}Ý/Ý ÌõøüWßU.½AwB.\­;BÕÿIÚOÔÏxÝÆùÀ¼‡F ø0Yê)WŸh©ó¦n=¢}¢¨î«¨í^«'ÍOŒ3$ïÆÝS~ñ±AÙ•év)`X”ê~¹Â»x¤†n]xLF!X«I¥7÷]!aÖ;pàpm®…kk–çÅ „¯RÝÆ©5Ô”&ÆåBqþ‚sB“bÆ5SâǸÂtnŸÉét»Ì «t™ñáh6äR刧R=vžn±à Ê…Z½^$S‚ÇÚÖñ"*×B‡äýŠÔ+¡‡â+NOœP¦Ï?©4·B²†Ä]kä’R/ÚÊÍQ.úMÛôâ'¢ÔGµ¶K5_Ì µi=¡¤f¹ÃX³gÆöÜî3T»_›aŽ%ÐTp¬Í4{ÅKÉ«=ô |æÚšTQÚ¾6'ë7ógEDmž&E\dowT[oQ²x 踵™=SAª­ßoM/öá¬ÃýÜW&¤UPÔÆid+hª[e= иcæuÎÆ¸<8ško)í¹õÚîÕˆÓ»àÖ½ÚܾájÚöØC«aiP­Ž"ugr8ömðƒ& ¶á#rLå5:w?Ò3À8PÙ8;“»žÑ`µézRUë‡'ê<û“p‡›—ŠG›ýŠÇæåiÁ›¦-÷ï z€—W©û®oøõ¼k;ðrÓ_jç·Zÿá2•§F€‰Ÿ<æÅ) »K'éÝšV{ ä5òµê1CtŽQµV¨±tFeœg«+cÀ¼¯ïØpV+í@EýÚÌ$ñšµ^õ@à£%Žø$õv aí[Ñת޾Zý±ïz'ÿW$ÿWMþç_<ýÅÌÿ 5¬v5«§E>øƒLkÖGÜôdÑ/‰9ò]£°•HSf8phÎk7o!C íA­iÞ—žUT¬Hþ߇ÞðZ‚°eÙÈÕn×ó#FÄ)M b}[-Xȹµ«thEȱö G-P%®Ü’ù+ÅE²@geò$ÿ7Ês…•œ[Šéreá>F‘ß_A n“ÞôCCìÍ×ߎhØ[Œ¾ÌÙé€^PTÏÿW¥*»ÒDt…gäT$Ñ×~'dªBlPo¼ ©'Hªý5eiÒ½ª:"Øcùÿû'³£®ëÑ®q. *HªFר`yLd\”Ü”™µ{x)Cµß9™4]6Òj9W‰-ñâ.µ_õ'+¼,kÓóè®ÂÚÇeFªæ3ÊðF£zŒùe‘àÃå2ªã€[¯£Þx£QU¡Ý^‡Yª#õ@OÍ4ª‹ßYq3`èöı}2C_‘qIÅ(æÖAF÷2oì @5ÀÚ´Ø¥g9¦—èy/ßbÄ%™Ý{ñšU°Te¨C& qǪ,„5²ô ?¢˜$gP¯Ë¸+¿³kz1ŠÖ—õ6H,“«ó”]Unê`ìˆø“ €:n¢eL<ª§^õ:8p.jÄŠÌÿ:z3 H*˜Ö^åÙÌâ¼A¢ÙdŒ4Ÿ¯ˆ•vªYy„ÚMZ-ÀÊê0O+-žHÇO;n¸ÿa¾:†kSµ)diÿMtS»càXŠ+ZÊÙÐPÄ&½ý5ðþ® í> T@ª*Ö¦ð«Ã®:ì&´Ê ¢¦Å‹È°(€¨ƒËÒôòl½_v!£wsŒVÍk"u«NÓq+ê ˽^½<-Å÷­Ø¸Û„ ñ…4Ù¥e%ûßVŠ¥ôY§1±Ë@°öéDÁúp–:&‰–7{’¯£S¹·¡Ó?8“Í_§EüYµÂJWì‰PJ•%Cºª#×yÓdÎd ÄñÕéÚ2Q Ë|Þ ¶ÆÌtÀb`ñ>áÙÿ¶óñ`†g*( *²Ê+Ö†áÄ*ët“ÌÜñÇánÜ ÓkÞ…{ùK…ìò …é>uÉ™ÇÞZ']Úµóh̘ò¨ .‚óÎøå"¼«…#?»ÎzM/$د£ŽÀQPA+°ö–¯Í„Õ+"°\³­³îÌÊýmw¹[Bq,˜fÌŸÕÝ—éþu¾œ² iäR79¶.¶¡:µÀ[Í›X¦¸ÌfÚÂt \Ãu àXuŠ£„‡ÞÇÊMÕ¡—X¹©ÚxÉ]º²Ìz9„‚ø¨Ô槹ɴ€‹s«Wª»ÓÜd\3B*u wùÄz> Œ) ¦˜ò~xÑíþà©ØÙ#{õI (¯>n·”Ž’îw¥ l´CUkÒ¿u¤É±g‘ëÔœ%‡PPìÞ:QçÂ7žèDs$óÍq˜¶U»9\øŠà¨Ó|fá6ʤ«© ™x Sû¨Õiˆfhõ²ÊUÒ² ª*@u ©ˆf° Ô9Ý£^Ë¥ÍY>t"åÚ„ÿü\ó^ºYÒH9€ ¬ã—/wr*¢™ "¯Ê‘»pµþ»¾Ïó½Ö(Ü\P—çbÑÐ ¬ S}&Qrœš«Ïœ[! #˜o'Ï.Ø8HÙîh^û¹"íãÐyå¹ÀëOnò±?¸ì(XãòM²ö×FøV°+êµ–0èp4s|hy.µSPh~m,Ì%ÐM ÇòÑ, 0ÇÍà{Ǥ‘B!MbæB¡§yU~DÌLZn|Õc¢©âØ{GS“'»¨e¦‰°«èè‡%z[î[pÏ¢ª±>×q‚\ðá´ÚAîþÚ437Áíw_µ¿äauaÐ •º¿EÅ ­NrÑôÊãÞÑÏÕxkˆ—óãÂè¹Ûä€<†ƒçªy¸›¾v NžžW³¸ aBoÑqR&ƒæ½S¶óRžW¯ zU´×*?êôZ¿„§à×JV¬O÷·áå 6–¨<Å[-Ž&pžï«¶AFX—<^5Sžv½"_©;f¾@mIãì¶{âð<—3]@ ‘à±J–òôwÂI~Gþ´¢´‚O- .ÐÈ£lÕ âÔ륨mÕŒ¨ ºäá(2¬ƒ€A@Ü-¡õAŽ•Xt%!ûa\¹(;náÒp9ÄÐðµ1lU\k)ÿ6a¸Ü©ºú]ª Ú¯‚°“<ó^ZBK†ž13\ /-cÂú},™Õhï4ã_N+Ïv%J[>ì|窔ЖX&d8nUŽ¸Ð½Lq÷’å:q:€ ºikÐFàjï'þ7ïÇÍ5µÚ¥… þÅ’$$PMPÀ$ gh…Sg ˜ÊÑoŒ"Ë`ˆt'J€Aæ‰ÓÒÿ%™ïŒtÆ Uì§®[Èç—d†Ìæ­°h€@’¥Š*é‹+ÛLß'yPHÚ°p¶ ÍíRÆ ’¼ã¹Îäê¯À@7 òþ?T:AZ}p{ €Þ’¼ ™0ÿ¿¹e@n¤vAuA¦„åSÇ[{›>¦{9^Q’£[;Êš$ç+©Ê5 ¨¬­Ém„v*kë—— ªÉRÇb«£rlÀ_×k£í%úkÓµ•5–¡žö*Š»NE¯ ÓÊ.æèLIß½âݬ’ÌzMsÚG2p Téµîª`¬æ¢%Ù¥~åJc§ ^-ã ÔlA|9¨ 0âxŽ÷Û®lA~¿¤·Œ)Ž (uÿJÊ[ûx ›¾&ýÀÚ 꽂vžÏ-`äø‡Ó­{-›­#ªÅòµƒ7ñu‡£Ñõ„ }Pû™E*Lþ/WY*Á—’äʃ’¦«ì%7ÀúsÓ ¡ó!QÔ^º‘4tú5ôM¨O–Â$®š¾HÁ%1}ÁU.ðH_PN.7”8=R~-Èóe’Š*ÂðgÐô^œüÛœ{,›ä`TVp5>®Ó \k 1¢´ô_bæà’žO,ò¥÷e¢©T¥ýÀÚðÌa’™ÖMö˜\0Ýñ$`°2¶Ukor{s\ñ|´RLË@º¿dÇ6oìŸ%¹sR Z$½,>)!vòÖ»ñVXñs»S»êAD¯cšY.³l:€bwiò­%s\´DP%ˆ±ð÷ˆZ‹2½´¤šx>µ–ÜÍ3%Òs³7êÀkóÒbf!9” Á@ºÍp´­4J2û{ýgðµôÙÓ^ 2#›tª­ù(Ûõ×)€ðé$Ëg@îâgú\Õ’JTòàæžÛÐDóØyÏí]D•§- 3#&·2”±ƒpýFY( X»?Aþø¬‘;÷ÿÑ„–°”lpÚo¯ö‹&þÐ$ùb[¨$RžÇ —/ŸRyòÉÆ[¿‹–"‹ }´Jˆ—räÀ¯M#êIÀ  X›Î •¶D†³SH¥0MÞ nèi8ŒÎ¢'B—öß0E!ÝDŠ#Ö QÜUæpZçÜY·éЏZí·òK ×öQ@ó/´‘ø_ ìÚŠ/Zì¼Ô°ÏÈÇ/|‹'ý š,'éý!f¹ˆçýï2âý¤úK1öLRD[,RŠ“&¦æ:ß–—ti®Hí—B[FÚ/…¬ìX‹Ú2 =X¿Íd}ÃúÛ0„ )[¾P!€–WœY˜K­/‚‚¼ÿ2L×$µ/:ÅŠôΖ+ÈïÏ7ó°ÖWNàÌÑ»Å,­ÛÀ½q1ð"å"hjíKé9!l²Âªþ$Ðò¸ñûmÖX†¸Ïñ{¶ŸÑد•ï‡7Ú Êmdî·µ{*qhµFÂB>>¹OÕ}‡q)fcÒÝõJRp¬Ód”M.rAz¹Œf)ícM ~ôs+ìO ¿r¿{î³µlš{üÒðÇAáö­¡57ƒ2)&X òý¥tŸcd¸¡Âö7Oåý}ÙéÓÿÆýd)Ô…_ÜFR†Eâ1n?€”ábáì œ0ýÊáR›Š3_.()`À’¤ Sv4¾h±c)óJTÐzŽÁUŒ[Iqï†|G½ÄV{¸¡» Ö©Ï‘p\CN`m¶‰Ò6»›²@k“Œ )l™Kg³Ò3»HÜUÈ&c®~ðä‹GÕ¾KKqž0ì¹ó–t¶¶tá0•¦$ÀƒäÎ?(A¿Ýãbådž¯næ¢íX@> o–)¬ÁŽ áç@c}ÒkcfBÓÒtáxÿô ‰"êÒ®tza }ÈýdÎ~œm4Ɣ𦱋ÊýŠXZá‡o™ÀkAÉ]§+Zsdr f2† –Vî@C(õqªÌ£¿iÓË2-iýg»nËRµ>Wˆf}|‹Êµ«×T%úRÚå=S´½jÚK»½g`Xûè54Ž$¬ åͬҬ¼™€ËAšX+™êUÜXR –î½BsÐ!„ ª›¥'z\˜1*ÍqÍ8C‡8$Í‘eHÿ—“þÏfózRëlÜ(ð9ÏWU†ÀúNþò°Ž!·Q¼Øˆ i_ ÀÑÒBµ3aß[=š^~TñÊ F²©œô^Š·ì/( X ¤uײFu¡5ô—6~¥Ñ”E÷ó µ_NþœŽ<ÆAóÐ_^JöàœAi‹i rÿ”†ªJ¨F*iž¶ÁôÏ—ÕJ§¢&‹(¯Â˯ÓÈI5j•R@°6æ<ÕjìêQh¤—}±îjÅe]Yæ5é ‰µ9£–s``€G>ž]rè2:@ °6V]ý4Hé_ý$“·2Á Ê„õ· n†åðP@ d„”ê¼§w'}éⓞ‚¸óE²ç_)šÁ N$Ët±Wd ”Ãë«ãŒ ²úÖæúœàžœ-­!iÞa:ÄáÖ†þ\Ð ôCAšþÚ0ƒ€dË:¨Êk )æ]4Uˆ¤ê®ñƒÔTºGnÈÈÐ9 Ùw'=S×£¥•Í=¯Ðñ¤›ä° ÈöŠB0©¹†AÿÆœ@½6ÁwÿX0 ÁµW’™ôú˜k§#ÒÔùYàjë•«›tçºG‘Õ·¤bPì|k%1T‰ÜúB±t·AA°6¦EãTÍzSkÏ'‰ÐáXHæB†ÈÚ—îÈ3Nýç΂—fcIÍ †ˆKurE#€t¹$cV8®NâÆw¯BŽt&lJç|…*µWñg; €Ü +¬ž¼ÐäPÍãÇû5³rWÞߥ‚榪F6£OÏÂ5éVq@°6:]‚ßyˆ>>ä,K·‚ëÅø·)jL"çº!¾¸[¶ =A«»Î×¾Ý⼬ü€"´BìE¨@/^üÍÙ§½Œ,—>ï·™’9,ø+‡@²³µˆ¾öYG…Õ2'wô«Ôˆ€ `mv5¯¤%}¯ãÝ” 1_ X›ñu|¬ê\wvõ¿Lží"=ŒFZž…]qÛÄó¯ŽWæ'8–F›¬!| rï׆¦# ‘Ë%LdfÕÓøV‰íåÑ¿ê8ƒ³TæEræDS Ü ¥>„€ªi޳Œ•«T¨¬¹íúÂ:ÏÍöm€€ ¨+@A/LYp£ˆ\;¡¼ƒ` § ×NHõ–INÐÇÜ ÈÊ—iî7užx°FÃ,a‘šˆðO“+¤P3-‰÷CmØOÅΚnáW¿œ‚]ìS´¢ZúµÀÁ(³žHWi¤…yë“#îýÐ$å›?§´á5/[9œ†™F[Ÿö÷€H®IòcJ1cÊQÄ5¸s_m=¸]åÃ<Ø>Ø«‡"Š)¯“ø&í6¼¥WeM4û”‘@Ù›œYˆ{»yDgbS‰ 2àdýÇÐfŒo‚"@¦KðÈ|G¹™›·ù{3 FL«&£´Z-¦wõE7”i e7ð–0¶ÛnÐ) !%% VÑI~ú *õ n3IZ›t®wžÄ_h £6ôÊ[Ö¾êáW÷DKB“7EÙä(Q‘Ô ñêÄÈ2Ç«x1n ¬‚6ßÔjÒØÄ©X•°x[Í髽ݺ§HR,!“_l^j$‰ÕvÖÄD̬XyST ü€íyüz'f'|¹=Ž @˜Çˆ’õú²€¦ìvAW6ð4e à0Œí6Õ‚w¿‘ôÉ¡†™Òœ@Ù»SÇ}{’{‰qù¦9ú–äÝà/kÏ…¨ í¼=;óhÈü/éBn7p„¢i‰;x&ooÝÀÐçBÓòëâoÉTg'NV®› PnmÁ§†Ýö˜b’ïûŒ’¦Ûoð¿µ'GÏÊc‰Äyñxãm°/Å¥uŸOŸÆ:vòîér¼ ÿèµY§ß­4'6==¶DÕÚtöXf1Ð ¾E_MY¥ßŽ™’BpU(—‡Î3¢\І:O­x)%Õ|´ðǼögVù@C†~ƒ¾²6ß± ™õ²7<´£Ëp]Ÿ¸Â‰m”ô.4«àÞ–8Â7h\ŽPFwƒ&ÑŽm²]~çæí‘[A€§=âc[¸±ãtÛä›*L ÷±Oˆ^¾ÝøüÚŽ’WA¤j5kŒzËî‡6µÁ>¼Dã^þšx}PÀCÒËÜ,™sÉ37I*îe=ÚCÆÙt$WƒM°6r9gl“öî¹l„±ñêlgÍYWhÚã3T“ºÌùÒàR ¾Ñ†K[¨&G m†uh„:h¸_÷:5šnì~ÜÙí­ÞjŒKkjLÿwÏK{8÷êÈ•i¦ïX ¾!Mdí½ÆD{’•RBÁ¹öÜ%5éDÑã Dí™÷ìž<ðÆæµwøY,H*–C|W¤ñÕ! „/ŒXCæþP¿ÀÚho@z% ×P{kÉk:C'ÊÍekåy¤¸;€›ý @ÐNÖ~HbëSÐâØò^m¸¥tQüð-m‰s¨Þša¸Zb¤yá9ô[òR¨âˆ‰Òù[òñ Vƒ‡75¤÷·tWvVl –2…Ÿ«¥E Iä«o)Ë[;hXŽ×ÆâJZœærc…·P@ƒàØ|˜6P ´Tž«FÁÚ›b+ LZ&¡á)K µT\Ÿ,ò6ò×ažÈ Éû¥f÷S¡ÐÉ»UX’S¹¹}îTµ/!§Ž¦Åóo‹Ì6ðQ4G&k®–{v‰Pj©^ƒP³¢C %â(©—§Q·D䱩n…©N¥× …­«’Ÿ•‹2P#¢àœÜ=‹²çlƒÀÚ4±Š^¼5–ðDâå÷ µ¸ÐC-„™v-É'VþƒJ5¸Õ~·µóñ±/âp8}ï2¢-µ2ÔHíjÈd«ÌÐÌÛ ~LÁÆ„h¢Î›?…ôš¹/X’H™ÝJ­‰¦#ÄM ½Ðº·êø™n4TÀÚ/G¢§r|©®ãúoÑñ¾\ ‡¡•HxtFˆsö· œµ_æó.¼nqª–.„6z‹YuÀ6´4ÆõƒšÇÁøâ(Ftâ²¼c»GØÄ[N‹¿¯{apM₪ƒvèpBç1âV‘öyQyƒËÁ&^é¢ÁnŽÓ´£€àó²“ïA)m'ÇRvM½›\¦e­[A%È‘b¥åøy]J–£Âh\ˆN50 4_”è8jGª‡8¹7"‚ƒi‹Ýôùu¨`s. ¤-§ÛáÒÀ7вÑoòÿ¥e*(ÆÿÒ3ðá¶i™5ØÌmÓÀ>Ðò;\'w쵟ßèÐpÒ›hîË7MmL×|ð¼'2%·œ¤qäl5"ZvJ4¬†v—ãñöÂú)¡Ogõˆ³K‘×q"Á^ðÚkC¯‹ØÜ†ç»ù§càëÎ#o¹Ü%³øZ&j-qÉ7AË.@qвË*x-;Ø‹p ‡ès´ì¤Lð1·ló†Ë_®%ø;y?ÃÏ¢HóZ爎 ½?2H¡"¬5w©t©äk Ú܃Zi‰cå êDZ×>¯G5Êq@P»hÙª¥Ñ²!ø4v&V÷Ì" 9 y°¯`ehà-hÙ¤æV‰¹¤òàç QYºYÚç[ ¦y6Ðä;ºó½6!Ömœ-k…´8ÜîÞ¹SK1LY>÷ëÜÐq‰PbÍAIÁÚ[`$1]Jáë„ê8LkÙË>'¦Žä{xõ ÙÙNßË©íÕÀJÐhåƒ_`éÌÚ—œpÃ&$nvôÄ£EV݈z®ªæ„1·ìzøZÜϨ#àiBÄ䆜÷r€–G˜Ôý-K׎Qè.-‚¡rï&ó¼{¤–œŽëÖ<νx3åÕfŠm³àš:5ǰe½«‡âÁ€í 2tìµbaŦ9 ˆ®–·ñˆÉÚìàépíÎÒÐåu¾`Cí ¼ Ô ”Mù¼ýÍ¡ôÌîÊîšm…PO$fŒÃ¡— ùýµ^†ÖäÕqζr9Ú Mû’ÄÆ}·d¥pq¹‰5{N½P\/·`‰­Ý@}Ð@jÐæZ{µriižœtÒ|ÜßÒ ¦á­±ª•WIí`¦#¥¿äPÝ’•9-äÖ ‹[Éw¯h1 :Ç éžåvÉ’Xõ¤¢É?÷·„ùQ‘nÔdAYÐò;R íþø±±)ÆgÒÀëÑŒcRR¸8‡ sžHÔJ½˜€)<Á@‹ŽǦ(gIœFM¬¸Å“• #ùý¸1íHåVjto¨vÐÏàŽnŃ<°£B¢PÃ$hE²ÝU~(Ô¨k ò40 ÄD¡VXd8¨‘dÅz®ÆPñ. ›§•‹1­!/¿­7¦wÔzÕ¼¿üùö¡ +mmÊ­[€“ oàh4¥ÝÞ:h)U‹dÃJ­ÉõÀnŸ­Í|?·íæ½ ®8õF–î¶Îÿmåƒ~œÕ@.À?Usšø1 ,À<ÐÀJ ~ x;.ÝØxBàOLbHåý<èë寭iµgÏÉhåÖ[&Gæ°5ˆ¯Ç!K`ô6¤Ä+Œê¨Ÿ¥p" >›˜(ï% 5€Ë!â&v< 2ͣѨÜ@2PœÊWŸ:ÐS˜EÞ‡FEà ]6yO‡EDhßCáâpnÔ0hÕ…ÍCÖË[ÛÖ|;5ôÈ.ðRgÀ@°6š±F炬XâÛf`SÁbЃÜ*«A+oÞèæÌtÆ„æVÝM·Á¿¶ ðÕªçisѯ @%ÑÁuÞôB‚ï³öõøŠGꃄ`mð‰g1¤~„VwH‡ß‡»¥&ŒVƒ¥û¹Õ`é€Â¥ÕÝ÷4Ò2²¥ @tÈ»ju;z¥2Þõ”·#0ñ¦¶–°´xHcbšTP±è©Å;²#P ll,V¬ò­º{Maз¹‚´ý5h©ˆmµK-ýÈÄäÍ€»6gh›æòò%ÀôZK`9O-©DXé;ª•!·Ên„³©²½•«:Ð×­V÷ÛÐè /O¿ªÑ´ÊQh6ŽVá|Œ6Sã-ßï.ܤK¯ß%LJÜUÖÞVý¦RÊÜË7ÖÆª±´Ê ,”µæK­„Ú¡‰œÔí K=‹•e¡ƒ„£€©VH­AjÕ±k¬/ÿJîiÕáeto7«¡Â/Úªå|6à‘[õÚœ”ÓîH§HhÕEBiñIÓ@«[ËÁ[p„`ä^oAÚ"÷-°´`”Óp“6Rgþ(cÍiÚä)¨Ý=G‘=Qƒzç€Vºs^5––šÜƒ¢èJ9—=ëO«a^>âôh1[‡rÇ’Äå.ƒŽ¸á:n¼!U¿!ŸµUõúÃ\nÕË "ëÉÈ­²0¨U‡  .ÏsE íQÜu>Õ¼K¨|²“µCüa&»•¸o hr_/D™± v›AI\;ðäAÊ/áí¥ßÌI¬ZÆ&Czúžæ¿`H~[›~æµK?P'¿Ü@)6IÄ&B¸!â‘`íV¬!ë¾I:§Ê„&É N $íP`éGòW+¬¶yU=æ#Œ¨™–ÓÈ6àf-ù&¡(:‚%™"&ŒC› P ÿÛim`x(²³\i«‡áq ¼0ƒ ©±kÃh=xx ra׆N  *þ TFã bÄêuªwÉÁ¨,›d0Qžî½xöŸƒëj¬òò2éiæWrX44ÚšBPù£_ ž’̦rõؤz“«WWМŠÉ4±âÏYùŸ/¨jº•5Ð× 9ÜK€Ô#ek²Èø:6£q]¶¡ß/¸N ÂÎË—G‰6%Èšxê'T«WÕëš¶qb¡+¿+$ýÅQÄqÐ)4‘Ëþ§ù{^Ôœ7)åÒv4áâü’îlúÊ‘>^çÚ¤mKVDYœ™}´N0IC;µÊ”¿E†Lc±Ùk²GV‘pV³c0+›ô“ÝÐ@;ÐdK CH©lb,+ZuÔ5¬†åµ¹…B6¾CÑÀÐú §þ(û³ÉýÙ„+ˆg6P:¬×D& ²íï!oݼcàSlh`W½QÍ]‹Dé뤗(tƒi@ÌM¬´ŠL™/‡ôøXž=ñJÐ Ž&^PMײ÷ø6Þ ƒæÎ^˜Uv™§ÃmIž s9³ÜN(¥ Ä][†b»¨Ò ý¦¤{ýÐ`ù!§FL¼²ccÀ‡GCŠþÚЈ BkÚáBGd¡FÑyðbL3–­ó¨-U³®ée˜Ã´ckÌþTEÏÑr¥ìûÜ­‘°ÓœÝÔ­ôd‡’)“Ä—ú9Ô<¾^y¾9h¶* g¬ ¡hD ”÷ñ¡¥eþU±áŸÚ…0€ÚŽvñuÑ„íÚ‹ë=ÊÍH«{ú×!ÜÚü¨gôƒÝ$ºÜ:ô´zC é7Åh¿ZÓúœ÷gdÆ Ëv4dò75ò“צšS¹ šÄ†ž¯Ü»oFÈÃÔ­YÔ¬5«‘ŽGb­?[÷6´&.Ô­³ŽÙBçÁtiNÿ¬¸K_k7_Róó‡BÿO„;gh‚Ÿ¨*3é΂œlÎ2 } Ùê@^/ãí>­:eš¼f \ëÿøâ·±µ·éS,­!Üߚŀ”˜6Yg«G£,Z½£N+@©ÖZ÷i‡ðåñh€®…ö–«ƒ`08§ÅçºwfçýÌ جԂ#R2}%‚×RãöÈ.pè Úa8µoîZ¥­iég&‹w.gtk£Ê5¸ÚpƒËÊN¬ ·€dy]E¾M-4‰Ü~§i£èXÇNojEd‘[ XþÈêoÍÓrà3}•kLRhžØ(ÑúóølÒ³±‘šÔºaÊ®8åN² Hõjý¹¬A‚ÛCÀ3°6Vcý®»#úÎ’‹!–9¦‰æ‹\®&3͘¹ì…x8Õ¨ÜnÄHÞK3òü['ŸM ï¾à"j7öä^Ú}%^X#5nùFXË;r8Z¨…€Z 8›®^!_ÚCÈLé^ÊOgOåÐt´­ÿ ÃŽ84Õº“A#¥ÿêO€º9ÎNU-ýØpŠ5çà®wŠa£Ê^œ)§8OCÙoQ¦€µ¡£ X­† ðÚàOUÃÀ*°~Û³^ë—ØÖÊæñŒ`Ø”p¯ _”Àк±oó›’økà@$ðÀuökG–“¬Ï«*ÙE‰½¬Ø’µÙ©úî1!QQëX?%êrLâÎÓ‰,)غX ­Ë!oˆ.ð4‘öž*¿VÚt¦:@iùÓÛ i†¼íÍѨñSÓýåoÔÎñš­ŒdVÎÅú:Ÿ÷Ô/ ³ , ‹þZè58‹°eóÔïGä#LÙBKÎõ`c€ˆ Zk¼ì†=fëîRsn¨#Ù¾¹XRßó˜axyèzv8ð&p÷Î7‘hŒ®*bÝÏ ö1¦ÖMÏã‡1s»p6^”5©ƒäwBëÛ€äƒåÚú±` Ox‹cÁÀÀ†K¦ÏãÍàÇ}Õ…£=¶ÎÑéºsååx)'*ÑÀ!`iŽçBȬµÃâå°±§Ü9ñ Äkc9ñm<. µàßíͼHŽ3“YV!ØÖ¦[eE±DÞ6˜ÈkQp•¸ÃýÃD&w ÈÚ0K¦4.#žž2m.þ• ¡ÆÞ:‘ ð4å"ȼœ zÜϘøMMö•Õ Ùš9_ ÉÁò¯NþÄ\ötkî {Y¢vÉ©7Æš"\mØŠ{t ÿÞЖºÅ‘¼oŒWà;–t4KÒCÇåg8³Å¦¦·„=³åóÕ¡<æÂ0"¬ AfÀAµá%Ô“ œÔ ÉÆ‹ÚÕ4#Æy²eŽA#e{ÐOé8Ý€˜qã7d-Pÿ¡ÛmØÇ *b4lçeù&¢^»œ?0Ì,9^™&Ù“mÀá6 ºÖ¦h/ðÆà*Ö:ôæUcY´vóó50 48$öùÙs‚õï—Ù‡²’m¼¦)j½Œ`íÊü°©F;Ô UÛð°ŒÖ< 5È`“ KðUÏTìò6"MxË@óX5ÙÔÊã¹ÑƒKïTÖ}©ÿPŽ 9úÇ+f$4®Úå ‘Ýl<-^*(XÑ##TFX,°¸ ·l!c¸¢œ^€RÛL7À­Ú¸e§Ú½…Û¸ì÷½ØŒv–HÍ¿e¦p+AÃ×lÀ¦¯N—Î߇yŽCíbÚ°HL{€A“m"_ê¹Â¡šºóÆÏ¥-–YW¿DÒðHŒ–Êzöõóv®™M—ÔS»¹!?{J§Uå1÷ëÎßµ¬àr€6Ÿ—‡¼kczŘ|X; qF›N“¶–¸„ÆLÅìdG1´IvÁvkm¯[ÑÛ€ÿ6 Ð@GЦhÑóË"ebõèÚ¤Ýß+Ë' þ€KÍ€лÌÐÙfÞU‚‚ã~3U7¤Ê·éž¥BÈõ£Öµ¹ 7.|Sù#ÁÓ‘Åhíí)wÑ´aèém^áõ†hÁÚÇ*Kð¿Ìá‚”›u¼Þ*Ö†8B†g,¢–Ô?_¨ ¥EÑãJFàæçÁ·ï“±ð9 ^A;Ç"Ç@%š‚#‚ýl* 3bÛtZgeBOFß@›VV™ÕÔTY,BÖÕd_æðs˜ƒ1ªR£lPœÑ$ý[£lû@ò6:¼ô ›6àchÓl•™±KUÛ¤ö•7‹€×“dy.-ÆÜˆ$™žlS”Ïæ^ ?fÓ&ÒDj@ðh„Ljäá!ÓÿXsÙu}zÛ´°2‹À¼Ê8â´eˆø¶;«Û¿ª#6䯝¶¬qƒ‚ý2÷Üä’Òoÿc¨ÿ Ц›ïਪ=(—ow[§Kk&­s@ìÜíÞ˜£¼Ï¯•_å<9 ¼ *çÚhrÀ¼0•ÙYæUsž¨Ct¤ó¯½Fì«È禡נ?f·0 nŒ;U9D)sJ»û²pç±ûûÃw/w:t¡@? -›…S«Mˆ¦Þôç.,Пèts¸ПWan‚þ\¦ ¼úEGMêmÞv4µÞAV>¶?òÓ¾?rYûsCÇa0±´Q„’ aÙöý‘ËG»éðÒµ((Ö§?œ°;T£ÀÚ„áY¯ÒJÔ3tQé§_»Ú|ÝN¶è欴ëþ ó©Ý®ˆŠ€µa“ØÙÀ£ýÖ\ž¼C\ŠÕ}nÙ‘ùßàd~φuQ”¢¢7°°³ÛvšrÚÁ-Ðstö‡Í!ÊòF´½'§ø˜ƒQ:,éþ˜eÜÎË¢Qƒ¥_$Y¥ é9vM…ä:6„2™þ7£åÒ"ÄwB7gë|Ú¯@yøøóÆuÐ ¬Mâ#—ઠk¯vìÀãç±_;ܦýp p¢wõᚸ™!á‰l4'¼Keâ§îLÿoY|%¢6Þ•G€¥w‹»OxëžLäÐøÏÝQðO1§\G\¦§'Îl3»4/œ=y= ˜‰/èM¡Àú*Õ3‹¢Æ€3HAÒáÿïH%ïàè‰e ;¨z2‘³‰Ý-q1vÑÓUš”5šwųž8¾üŒól-O»ÚÓ‘©ºö¥ÓÞ㹜ÐÏæІ¬D+ÈéÆˆ¢£Ý‰çYê©'óèö¤0§‹.y/­íiÇe¶õáwe“¹Øvæ¾ßaˆóe{<;H:ÐÅ=mà2{9óÒv†.Àþ=…ÄÍ&W6–-ðòòÀÁžLÒð-ì¸hZ{”g`è©^~Û—ÆÜ“R‹)y“<šZ~ÅMÝÒA °6ƒo ‘¤£³òq“8ôݯÛApÀ vôdxïN΀ã¥p9¦xÏàg‘Î{¥JÂõ(r%ü¦'Æÿ¯0FOÍt‹žd;):¼oëPâ·žfE‹€裃2 P›©F“œŒS—ÊÎïÍ5–æµóD×;xzj1º¾µ¹ÿSKÝÛ»w|üžœ¶&Ó@u©‘x/×=À#Б–yéÈxï©û¸l<Ë2»º®hýš•æGÖé´Ùmí«î‘ÈŒBC^*ílO!3@¿ÌÀ³_¤s`½µi¦²¤q4%UYkÀñȯÓ( ú©¯HÍ”·8‘ˆ ®Š'2à žz¶wÕ³ÆvÏÛBË3ð92÷^ºÈ>8õ:ò×ׂíÀ ‰+Xš.@u§ P%wTgÏÏ)%ÑaÛu¥ p NGniÏ›…ãâ/ç-\º¼¨ó2<»þ¦¨ºèv G¯ySÀÚÐZ€¯±ƒ* ƒZ`m˜ÕoVt%'Þ‚×Þ¼wdß6P¶¬™Žt©žÍš`ô%{<ƒŠÇí€à¢ïà èùæxÞUÉá’îȤŽèpø^%Ô;Š8­Í4g×]b¯&¾9ž;Žw0t$Ýw%PþpÇt%p&Mh¶šï¿&ÂZQx!]xÈh)É©Móð.ðGŽFþ­¢ ê X»¸(‚… g¯%@uõ²düÓ©pš Ù=]õP¿®rùÊæÓ&%ë&vwú XÏ—¬gv¤×€°~§w&çß^‡žÅÅ4Ø :<¶ û”ÛKˆ Xô¼ç°€îµµ:KŽ‘&[øšøõžxsýD l‘·ÿ 3ñ¾Ó…ÞÁ5Е1¤Ñ¾×@?f?>Ló‚ çƒQoÆvBÖ8ä!r·Ššà˜ÍÓŠø:^ìµ!>ÜÍÔ3eŠÒðFæÿÅ!P}^³ãýh×ÕÊÀ›Gý‘WüªÑóàF§ ¤ ¨:¨ÖÞ|œ;¤¤3Õ¿*z/ã%þ·Ü€V•ñdWõxGæd‹hõ̾ uÒ´óœëžGÄê–àz®è'è X›ØJ j´ß­í“70·@ ýÐp cæð»jˆîÄÊÅæUߘMÿž3 èå)?ð#”€aV †µ»y¹¶è+š0ƒ@*Y*®§Lu&^²ì½$.ôÐúzI··¢Xìð@lrò]úÍ”²vžãÏ;ÑÁPQ¥ùØõHóï,Lt¾déf±ªÒW,öŸáª´rn‡‘3á%7À=p81ëà®X×)µ•}ýN؈îïì˜$޶z wîÏÌUød3£˜keÃÂU¥@/7–Dy,êàx«3²R´ö\Î)"ŠGzë`X›É÷áêÐ1Ó{©:ëá¼tgcg–üÂáEëƒlú‡¢æñ»ˆä¿à„ükÓÔ’@oÀÚh†9 {'ßìHüíÅÉ7µÚ©—ñ@ıó˜ò[ ‹S nÖ-îÅmVqlfqÕ]ìœÌ;{®ý¨NÉcngÎÁ\»Á>k7ù\ÿyœÄa\wÀHÐÁ0°ö¢™.zK¼Ø_š `D"€4¯*ÐOêÅcæ2™²Äa.¯a=`¢¨qý9ø¹Xf{éá su/·)®+ó1;¨ÖoîÅ[1³ƒ ;€"ßs¦”y;HzØè>^q´×pøNÖF‚â½ãƒ¤nÔ«˜¤Ü¥û‰ï»éÌxå:~%µ÷2}„ þíñÿ!o>òÎ5oYí—s_±aÞY^ç7sîH6:CÁ °6:eà;3£eð²O’Å!÷Ê\Ì@†ÄEèJRîH_.¼;u{b‡™ÂZ^Ç î^Ÿæ¨«­è aVóš±ÐhtŽ ­WãÝì(oÖÉ&å+(z5 ³#Ê.a0Z%0IÀ…’;2üû¡àú¤x½1¼½:Ȭ#M¯Ÿ(-¤8ÒºP:s‡§Ü?Æþc'S}fAú]ó¼¬r%Á Ž~fÏmxõ{uè‡ks‡:¨úú†êÚ{”ó"^µk2Q–¼0Ôî‰ß·„ÝQ‰è èÕœhªT§¡Qó¿gÆ(íïƒØßzqõÚd6ˆÌßЖª—ÿAÞB?ÈZô\lZnìÌss滌&¹×0ö‚Œ¸<èÁÕùØé‘/éÆð¿Ø;Rùׯ /¡SU(CU8TÉ>ú\øà®ïƒ÷åàBd§ WK Œ^=Mîr“a€žÙg|€­ë#¶©Fø¬Þc=“¼ƒøkïnÖ‘2¶6» }v {9ì×ɧ?™%hnІ—Á¡ÞUÍgFª¯¨7 »]]•äïb땹3µD½ª`ÑÜkÉÚ8³ze)ž¡¯ s ÚBÅøú; ‚\ﵡ6½ò;Â`‚°Ç ïRmÉh¼Ì¡ L¿¾Pà´deK½ê@…*ŠE¯6äQ5s¦BAz%w£é8ÇLæìö]޼×éÚL¸:ï‹á «“.fÐ t ôÊ…`2%ˆeyĪÒýÀõs|ËÕ`Í2¯§‹óÃÖÅݪ ŒO~jö”<>y qxñùt˜~]sý;²ú;€akG2È º8t™zo(c°‹‡cXyÉóXñ §wä¹vÇ©œgk5ëUÌKA’µ•RP:èÖÞtžb/ ù.ÎÍÚ‘øßÅ­8–äæÑÝE5”W^û.WQZ€®Éþʳx³?väøïLî¾+i³uØ:¤ÀÐ¥Ò„‚~Ü œÐUNÚ¢äàÕWíê>8~xR9v¥øs?|»¦±™Þâœ]xW‹ÌÑÒH6;_H×î èË…·ƒ¢9ÃA-€³¯K{;-_ãj\ifÜLÀf5íB¦i/gÅÕ?ßâ‰ú]ä%ñÖ^ƒÿw±ŠœäüÊõ®¢éþÔÈ;꣄=…ØTB®«Ÿ'ë:È}0tiê¤EúôtG˜á!“§CYé:}Ìwp ßÀgÑÑ=Ñ¥–Íß%Çlµ,fÛwäíwq\3× ÎuÈü.ŒS, +L]úG˜ëXoãkçìt¹œÈ$Zûhžã±Š_ˆK.«γ𧃠ËÐ!™ð³BŒAgŠ‹v4wGî(ÔÜøapn× *¼è¬çÔéXû.¶bðy†%žcÖ;XwÞÖœÌËïêñØÊ°e€ý5) AaÐCõôÑ/RpõÓˆKª½¹°Ä9®¯@Uëz*e3Ÿùa­’}‹çôJG²íúÈøï!ãŸúÒöS#éßüv~?è¸Îˆü±Ž<ÿÞ˜™ÉV-“Ž“îyÿ»Î¹×ïCd¹7ãwéHjïÍ5ÍÄ:<§W<ÅuzÃ¥ÀÐ[:Ök†ÿà4ïÌý×`Xo¬“}¬Ä¿Ï[ÃÉM0I¶.Ëó{s$3Òã¡_ÏÑu½#›¼7öŒṳ́óñærñа¨Âaprÿ×e\VÜÖbûdÒTãýC q a|qEtà²ñ«×$ì_Æ{¾Q•3dþǪL@>\_VL3+ÆÇ£ö\A2lo 1W_ZKƒS¬íº ^½\wd`š$ìè è è`X›a ]£>ñ-z ek8CB/ÀÌp*"ˆi8ogY É1ôT‹yW[¯n«;€‡õÀЛaÍ:Øz3+†±³—·D}ÔÉ3:yoíÙ¡—Æü™ºƒî!y¦èÚ·Üãõmïbш ‹¼ˆ"!®o 9Ó\Î((Ã×&¬ó¥\9¸²µqîÇb%&;z©ävÉ d‹{î 6T70hzë¯ûó5òÆéѹ߇U9Õ3•LƒÕ÷Ð-â³ðø-šB$à ª€Þ†+@ˆ«õ6LZƒO¡7“6t•lT¢Û?ïv@¼‰yõPVÈŒœª¤ùÙÓËxio®¦# 7‡O`1ímF5„l‰}W*€·§qqÔ¶K™§AoÓ}Äv\]Aýù‘²Ö½˜ icƒ€eÆ›–ÖéÈïïý¹œÈZ‘Ô—Ìà߀ÊÛ¥?×RÒ€µa!M€¯ÅÓs‰í|0ëZ+(w0¹×†9ä½»ÁƒUÝlbÅ’_µ ×¹hB2ƽ XU²5 Gá„ ®¨Ç¦\&¦¢çÉæ˜ÔÎî=û‹13<¬é,‡näÄ›€´…çñ&ÝïÇQ:>Ž•ïýö‚à~¹Ü;%Tï¬ÿÜæï§¶ ~B÷Wýç~‚1ìþ‡WÛë+^ÔK¸G#(ÌåqJW­[} g,‹gÙaö‚ª@ÀDô~e«t°txÎù$õ#ßy‡KɆH¬êqÑRïqˆE¥Þ¼þóh~IÅ@_’g•v³Ò©—J}O¹±{àX*ºˆÕv0t0týPéR†ä9Õc{8°½]ó®åhM`÷Rh1Óœ°©ÃgÖû¸t{E´«|¢†Dß/ÆŠ?ÛêÕ›•E uäÿåëv~æùØpxõ©³gÀ':¨Ö†^pº-NKüä[YŸiæ!Ã[!2 cÜ%ãÓéþk‘P‘r ¦ Ç36ŽÿGá5¡Õ,5¼í4p“txIúx,þÅ»þÅ£#Ù¾€œPú¾›˜/hƒµp}øƒ Ëó $̽lž*F‹I¦Y“Ýöò0” ë«*kÃÔ!¿Ò€5â8£álèÃòi´¤Ÿ‡¥ú ÖË\©ÉøY*ûìFÃÁµSv;Òýs»ê0täò¯P}£]‡gÒ¬ÓŽ ^€#qü4³QÜÙÂWîÓ[¸ÿA*ã®ÐŒÒn•8»~øDþíàDÓºÓpŠƒf5Ö\ %ÒAЇãÏý.cG½á®` è œ‰Íº«@÷«@ó£Â!130jú8 Ì4f‡!‰Ÿ9ŽáKWDV«hI˜wȇϟÒ!/hè€4¤ÙUéªõ·úËíBçÑh¶.“ýí^ÛñîJ ÐÒíÃØNãë¬¦ÅøtS8ÍpÓnìK‡<ß0Π胋7I14UÛB¼„øÆ>œÄ1ï9H]À’Š~ýš v£ZᅹšïZÔy>*á~ X8™½v$lèî7BŸžò}'dXÀ£ªXvg¶è4BÕÇ„º0\ÿBžIñB}~¢9±ù:|7R˜Ö5Ôréà è XŒâ.…ª%T"I¯¿ÝÁÐgöÜ…V"—]}ø ¦Vž‰N`Z«Ìž§"UKéÄÕNÏQXIÿ¨™Ø'ó6U9,¡#—¿#ЧÚ4 >èÓm07¬¿Í¦éè¼>íãØ'N¦F`MD"Õ½OËóÒ$¡¼t&Ót–OíN€ý ë {…ÍFg*Ñ&n_‹ûÌ‹DYÞ€p ïÅ‘²™¤%”;Áúûž8àXŠŸ.@NG*iîE¿'ì ¥èà èÐ/;¸ºÒtÐôiˆtt—èR­ëÉÔœÅyÂ`•I¬´¡êÖ}˜Ÿ|×@„=6¯dŸïlêḭ̂Ìå ½DýØÜxh¹³½Ô Lâ>Y³ƒÝ OgÖìJ0R]žƒB¢O3³ø¥áf:NÙ?ØTsç²Ò„U¶“Mc>Sdʼ£pµhW±šA¹Â¢Cí$ÌìeHú‡Ù4ÙwãåTÀÚÕŽªÀY£âúæ”}®d”Ž|û>‡‡Ë&§Üz¡gf¨/°hž£YVÏe@€) ;°…¡à@5†pŽ®\¹g=“móÁ^áªuÀ“ú˜„vTAž³lY™ä ñ{<µE¯†Ò  ÏE–8àX›Ý¾Mð€­ö×ãûáëëãÃPì<Á‚ñ˜~4  ç Ê @ZàBYÖ©êK³¹.¾ÿΣßo]ð% &óxØå¯^xLæ6ƒñ¸¦À°z„p<¯cª9GAó0ÈŒôfŸ\qóKÒÔÎ,à¹iO³hY—qN¹Ú_Ñæ*lAÓ+^¨âÓ1äCðAÓd4ÇËÅÐx8°Ü¾ ²†}dmÎäál…gò÷<ð.]:Oñu´JÐLA3Å2`R±Ç#Çm1y5«¶©% ^¼A ¬SqQ³·Byë |ñHO­!—èˀϡ@y } r.Þ”u*žÚ:_‰ƒ¬¡z¨¡ê<¹7>J”|r–Hˆ‘:38Õ7ÕÅOÀÚèpìÏ™‰.ã¢Jã õÚ•fTt@8Žóexa"µ¬‡ã—á$ ™é­ãаxÞˆÅrª&µ0˜y‰&:.pÀëTÃ]yR³»Ž _»ks"²¬ãfÄƱ$|î‘iÏÚáYÐïÃÀ8pAšN5î8¼)²ÀËÙÒ˜¼c ãáò>•‰6O×ÓDÓ_ߣÄ#½Â5ê÷ÚkØšq¸¶Î0Gïq䀞8A|ÆÆ¥Aò½Êþ ƒûé Ê@ƒ¾æP†¼†"* §el\cfAçºLD˜ït ¡}$C;hÔ#mCMØ„Q ÝÕB\c“èfJXµµ€l-º‚•ì¥ p % ÑÄ;œ@Œ’zK¸ò¸2KHÖf°åb`HÚ_›©†ÏðJE1¢.ÅÁDÖñ*k]ΣS¥{6€)ù+ß”×#³-ö‘Ë‘7´y,˜Ù¸@y(HñÐÈ–É>¿?²…m bpD‡ö:wzn>Šä<æºÆÃ¼bl`ÉÍ—§&ºØ»½µ—Ús-Ý X|è£Oƃýd¬ð P P ¬¦ÙA† 2R4×x3ûÇ28UÖ?£²¨IFæŠpe¦<ÇÔ,ÚÙwÉïÎu0⑹¼p‘šCé.pJh¶G>± Ê@ZañðtŽ•±×Á¢qzÀþò\þ'F?Ö‰e X›íÓ[¿Z@sø 0ŠRYódC²h ý½ÚÖs^ÖF‘ØHÔšŽœÅÏyÔ€þ´6ÚDr&`ÐÁd_º-°¤Žð˜ø›—Ù(TNô5°xnQÉǺÖÅ äh]o›Üo·µeÚ)Z”y—[Ûí! c±0M7^<3{€(`”|Ø0†~Ÿt†Cd”vJ.¥5hFñ›„âQ®Êš(xxFw~Ø`ÒÿÒî>éëÕoZ¿/ö[á@hõ|øj‰A v sõHôA¸%tquÖ^ !årTs´J],ßÇ«Uø¹«­“(Á=e€ñ§âGgÁ}ÄqYd 2%”MÎÀ¢o'K!m,‹ 󣨨oóLkCxý=›ª¨¶0Bm¶âٵ𹕈ë, jÙêVÀD(æif“`n# AÝ h®9Ñx\¡ÐŠ3«\.|À(\ x¼! þUýa° ûxħ51„AÙ¼ÎaŽÒÄN¬È@û¼<á,-Ú\x àiĉÕÃqq:óÆ8¨ÒQâÙ£äÅ50#Ö&Ç9†Jƒü$ƒÀ«@ì¬×ç'iQæ s ß!¹ô–ÙâÌJë(¬ãiÎï –Qi iI"»}ÔV@%¦ ©…®ˆQŸO³>bF{º 2&ûO²o ЬMÁ†S÷â;Á5UÉlj4ìr×îiQ÷ÞÕæ_çЖÍÀ@:¡N¿š(ˆÁH0WÀÖY›}?2³"±-´)b@Wˆ.~ w ±¤¡åªnKöʼn>É2ªÖÊL#'á©­Ü~ƒÊö³þÙ°oÀÑ3*»?óÏ·Ôµª‡QËîª×"SÀZ° Jè C(`‹,ÔïZ;lD‚daŠŠ¨ÉÁîºì$µ®«ÅÔi“Öõô$ôÈ0.L)¿Ì¨æJc#¤‡ŒZÍîkÀ ãðJ2ÍùšÞšg¼P£Ò{òöžã‚Q·°ÁËË]€qT¹ 0çµwKpLf˜%uK¬‘À'Žz³:3…]“T¤×‹ç_ òúÊàT‘^E‘¯OS `s>6¹¸æxyÌÁ'0@€†7^èJ°ªW UiM+™Ç†nŽœ !¦z¨Q/ ã]¬øá¢zQ{:s·gmõb_¡ñ.þ›rÅ[jo¢éÏwPsTbNÒ%®ºâò1œA@`E¾Ù`Ê À[±yhØ(6Ñ҇耡üµÓ¹G½QÐLÙe‘5ÆýH‡2‡IË:'~6-¢Lë?Îz𠹘ǹ&6€ –<%J'w&ý€æ´6L¿d6¿‹7ô>ü-ª|I`XŸ5à.U¬ g T›!îOc<6xE³OýxFÁ׫"‘f êZ1X/½ßš¿> BmHX#šMÑjœåĹíÖ±‹óƒ¾M™ÅûæX^ —CÎlmJ€âoÉ#íxÌ×O4«½<æÂÙ¹¥ û ‹8iI‰øy ©ÄÖ5Ó;T“ˆCšKˆ"±© £&†` šˆ[Åüv·ÉE3a]æƒÑ`ã‹ËgÞEÓô«=òh¹]ò'Î[ÂÑôxˆŽã§®;ß"G^ˆ´\éÚ—ygØžS´„€» rí}=7:2±ž‹'mæ p¾È‡˜kÙ-×d„ú{°èjøä θø63Â]äH‚5ÄSnp©‘mlßÒч.ä%Œ]Hƒø®58 ³6YÛÃFìà!ª?HW_¿}@˜ÞÍÕí]ÁT2òŒfFÍ¿Àh.6ݲ?€Î6—«‚ΚfÉŽs-ªü.W–Ø@NÿhJ‰KÉá{‡g¨é·jl¾OGK»Î˜ÆÓŽáà ‘¤ë¸9÷Ìð8eu³W€-R>²†Nô™ƒAî@« jÀ1«Y>!T^àè¡jF'¤6c~Æ ¨øqHølæËmøøhóP0(ŒC%À…ÏáàúùðŒ­ðBöè%æ1UŒÍM¾?¸(Í;æÌJk¯;ÎÀ‰9w¯™¦¢?·ÒSKÁï|â¸3mX0YoÑÜ9F £Ö!7ktBœ1+3 êžý]ó×ð B¶gLãÔr¸ô[Ç U®°.Ÿ' =]j ÖÈZ¬þ5**—_Ç©m ³žøç8Â)ÐÖP Dãq·ê⬂tÓª0 ¬M9Ƶ}Øc`´Q<ÅcÜÄ8ôkÕî¥ÝJÈ€ž­…cw5›o€'†È<¢Š)/êè¡øäd.øÇîÐg=ÂáüÎɯbãhmú˸Qýçá q°ô²¿9¯@g0Àa0ÀE°öîÒ!ý’å,† ò~Ñÿ™–²áO¾I(=ƒKG€ÀÕ>zôÂí¼’ªm\ö@-0:;^’R®j¦EÚ  îF7›¤ßχ醧ÕZâ$ „Kä÷^'O¿Ï6,4]*VP¥a”œa¶7YÔüò ‹`pŒáñ…áÝ èŒ„ÉøƒYÌ[Jƒa ËŠ”jˆò:Öj•ZÆp)&¤ï—³&èö N0ŒS m<"©FtüÃÒØÇ |q'ÀàzÿvüC[,Å×ÂgÌ“Zàf‡ÔÀ¼2Q ÒôçÓ‹?ò­_¨_ 6¸î³#ƒŽ­¬(ücÜqcêÏ£”c¿Z1ÈTwêý˜ºҵᚠò‚áÔªåxaAÆô‹c'Ô02: …‡†?ˆƨ  È»3 v0sS3 èónÈõzçî ð ððG‹%ÁÚk.q¤ a…ÅË©qÇh—|"•†$ˆ6^–Ç!4ŽóTCã Ü ¬}Z£P>üMC¼²ãEÁœ{–¿4,©s‰1Ž;…O,|D7á†1vWS¼Ý–70yàÙGÞ0@Æg}ÖLe‡© x B¹C©ž ]\‡/–øºÃR- è*ÕÕ0†_ŸP5"–s|nǘÜУû ¦VŽé¸Qø2­¬Öv‰£ëÔè”)ûcp`jî DE»ŸŠœÔ»,+ (¼cLu¼ã‹Ÿ¯ËÉͤ»{uÚ`XM<ă×aœ4ô®ã×°D4äà\¦þùÔÍf»Í)ã÷1€ì•C0 J¬ [9Ÿ3¶\æò,Ñ÷P¬Gqç8Ƽ”;ÆÓˆJ¿âiêï¹ä˜ÃaÐ!+#q€F`mXƒ”|BÓ&/ao¥µ©_þxèNS]j`FÓðÐë]Ñ1ÊÉf.§Á+±);¦ÖϰxÍÁP2Óy8Ú¡¾˜£v1_PµÇ*¨T„ÊÇ,®d0Uª9¬ ãuÈù`$HÈ?‡Î„Ì~Þª A8( bŒY½U6³Z‚l'+°õ Wƒ@!4@.0¦ÉV¶xüfhW=‰ü‰þcÖyëH|3,(ZØ\”ÇsvIHZ{s #Å?Œðo8Lùâ@{ [€`œ Eì™g݆q7†µ±©ÂÇhYq„Û߸“â_ðÉÖ¶zB®V©uOGÆÑ®»öïü#Ä8[ÚÚà$³ÝN–éÈhu²Ì€ŒsL6çÉÚÝ×C¡ßÕ °ÝB¯j‚jQÍ®ƒ²ówßÚøX±'Øe§&boÑ.cMÂÖË8Oiþ‘A›üöI€`mh£ç×#~‚ÉZª1ÍС!Èó¼kù(g1˜3?>ó Ýq>b>ó &ùXåÍ{ÝýµIétL…¯a†ÝõÀ|¬È‘b <¤…'˜°!ÕXnÆÑ6£‘f‘  Úù``"‹e>`@ÔÀ!~P¯*ßÖ£€põ0—ÒîÚ£­?A80Yë Hε£b3­§Èîàÿ –ò› ^˜OÈÄ›{‘ŽF7V˜¿Ëý5<« _¿üvð¬”ÅÄ–xë÷kt´uÜè´ko:ÑŠùxJ½ Ý‘™ûá–ïõ* <É1ðµý½soíˆjŒ±žÌõ 2#ÝÒZab6o4K ðephVû<OµHΦSt2þí"~>ì…ù²Ç®Õx‚K`N{hõ]çpÏİ•nƵ!ào”Oš ìV¶šõZ¶µ=‘&;S¨Í:à `ÂO±6„>Á¯Ý^4ã°Þ·_—¨·™Òµî`my™IýÆ;xˆã¨²™’¥¼(1¾GaøÎC0°aËà $ÜÄÌŦ—`FÁ'î0…‰´ÿ™Œœ•Žh«=ZMEÕÙÌ„û+ ^Åfb ‚‰µf‚—`&ÝÛMßðaÑcÓZQ˜ôuSK»;€ \39kp˜ó$tã©oq"ÿgBMšÉPÒ< 39Jzîp»exZ"½ÐW’³u²†ðÓ¼ó d’„+Íì}êÓ ˜»5¼hû™¥ bgCf$­ÿì)®ãð9t}íŠöUŒ‹ Å7Ësó­!ù¦×±<—sWÁ¬¢€Š}¤ùœ(ÂÍeyI¨Xi–l™éÕjAû˜Š3ÓA¿M°,ž¢q—™š>›ÄH…àLΜßI+à˜Éô 5›(ü;øZ&3]Î5MÓL±®àdžs€U=o¶“™ôœìÓ_ŽÚ4A'òö¨oæúê•Îuâ46 / ¹•:'Ž?ˆÍý@3$¦JNXÌ3yø°Ò,uòdÛœ&M ¬‡nIHÂ~œfóP ðþ¼èøö'”º ¦KrCßœ‡n€ß gyQ„,­„Áê#8B¨hjœ£ú‡š¼þjåÉŠÒóC&ÙŽhXaS^¦Îa­ž¼(ú€ $Üïe¿OÐÌÓÖ‰ŸùÖByšù1ŒÃZ-xÙi •ŠW㉤Ö¨ÿ9¬C;„#™S˜^X‚Éi–ÓKÕÈ^tm‚·`f3y¨*”æÔjó é5 §¢éø4Î [XUìu·ÉÉ@dâ`’ŠÃÖq4Ò!U•,óÓêÊjîHÐëµ"f×È5óL¬jSY&H ¦³LP+ÌÃ:pœ3¿JÁŸ)|.†9&Ém"ÖIÜí]«h‚G`mÊ1 äqM‚Ý>ïw(¼Ñ]äqb<1 X¯ë|aà‹{´'’ušs2"*ÙkAxñÏLp¬MU{z¾ —ïšdÌk“±AÛ‰”ž™ÃÛñLã<Ã݈UmÕ$‰ÂÌÆ/3Á:°6îΓ¥›¸j¿d«xCYƒbƒÕ&Hº\¨È‰€û® :‘m>³Þ•Rš‡n½o¶ÇÛ• Ìl¬7ZÓ6h«¹•K¢’÷ç†Wòâ‚ îùAÎòBì¾Ü?ëôi£líÁDù„z.QÍ^ –îËO7 XyDàY Ùã:¾æÑ…%œ3Û*ðÖ¼êR¡]Ì©¬Ì•š^rJ•«ÎÅÁÚè'@œ ûko>€‚ÛÍA–®?L7lä>1 ,«—–Ç×s 4föt‘Pu]-A¼@lßä†Ì@”b¢oÞï#*Ó£6An0A0Á&°6ºä žaÈ?Xö9²zÌl¦Cƒ df‹])È@×!ŒŠ âø Ì«ž©é9a!¼``‚W€ñüÝ1 '˜Å•lDùk²G˾=.ÎáeŸ‡y€?¹óvœOP̲G,;§î§&€Y˜ :±ÏbUqYǦ¹Ó’Š—4óÔO$öÍÒÜ%˜J8>Ászó#PÿEô½¦òÍB¾ü[¡ ns¨jFWˆ &@Jóh"ˆî~ÜIÁdDDÏÃ@°Ã¼ÙËË“  ®&ÍÀb¡AÍA¹‘Sóõ›"O‡8@|«ºY5às.Wâú, LË™­ë7^hðLªA T˜Å<'fqÏY8ñœÀsÂ’Årsž(q¾1îŸÄ¾köÌb®5ú#¢! "‚Yæå¿WsýQù]xÜ“ ]ºP©²hmÒñ[åysF°€i!ÛD¸Çò ìú‚ ]qˆzLPLð¬M;*‰‘w«k¨)ýÄÅ_à_™Õ\‡ÌOxÞ•þ]†¤'0&ø¦ò ¨pßÁô‚í‚¡:ø¬ôyQ¤>øCû¯77*«Ú<®±×´Uæøê€ÐÀ¬Ùܨ &˜àˆ…ôåQäY³ü@Ð`V7oj ¸y3‘±d¾pÖ¥ôDQí¯¢È¾yIï”\ƒµdûþ7j!R¿+©LÄhÖÆ¼µ¹¡’ú—ç’$hÖÚX´Õh‰"ˆNGí÷ÀÛá R‚µÉïV K*HP ÌZÍW ì7$œxBy†YX}œ€€!ÒÖåšK̵ÙÄg´¨6¤ÔˆwáÁÚ¨ŒùLrï0×qê–€NØõˆÈµõë$`Ž|T¿md>ötWÒ/ÁÚÜnJ7 ¥iN‹4AA0«¹9YV¶ÞÌï|ËŒP-¡ú\exïí=„fº6¯Ô¸oƒE±>0÷šÕÃ9 †˜1ÄRöÇïÌ#KÇY§â•шUbS÷ß“iUná¹1«Y8„zõ”¢µËìÍuŽ xúÞÁ¬ -äM L¨—œ¢¥gªÇ]žôöC¤T[~˜ÊM?OÆ­ÍÂy”ï 6F‹+éÂ*ûêTZ\‰o5ªÉÚè|"Þ¾¬ªæ %³RáW:{9¯^iV}ŠsŒŽ'_‘äßs½çú4WiÞcÊ•3‘_†0±ÍB ‹i& Ç”Æ ™b#§{zÝl`C ›¡èèÖÚ”´ÇߣάÓäæ³¥X8™ï'ÉÀØâeйÎ&ƒà¤`ì Þ‚)ƪ61Šç1u¹wž°õJuÚÁ‡Á–‚oíðrQ¹Æ„ÉÚKÓ\X²yøã«Ù{–Þì,4…Iwáœà'Õš@lO1Sf2Œ#Ÿš(=jwOò?k0ËO!~)Å"ŠÌ“ü_óC (»€2@ý~Õagrñ:é¦@ #˜RïT°í ”õ‰åI.æŸÇkП§Â‹¦ÕÛ/|ùµ¸ú«¨lM¹M%"¯Ô² ³mm&û¢¢Ý–Z…ž"nsÃí6E<·€4óÀ[‡j¤Y ˆQ? øcr2µ³˜m íGœ6š™æî¦Ü{%ÃOÐ ¬ !AD9•«V‚¢'„¬5ÔÔÒumê ¿iMÖ”ì=A`˜b!œ0È„2V°È,*ïÎHáls„ZcÐú&ùÎyíÒ|!•Ïq/-U1d@:L0LØvkC[hÊ)^iÄ^t‰Eå§Ü Qµœ~ºuÜ‹< Šaóôveûº¥7Â!kCmv-“’öóQÁŠ@Øùhþ >M±(XÿeðÉÓt`OaBŽÉHy>ŰNJñ×%T+›–WªçQ` ç€ -Má…~+ó2U'¨¦Nÿ®*ðÅ4±r*æÀ}0éËq6#˜׳Y1‚ 2ŠÙlÄÐ1Õ½`FS<˜·¬³¹Ú‚´êi;[3ð±®SqÏÆaùˆÇ`[ŽvÚÓD-ßWmé‰ÎÚ¨õƒd+;ƒ>ß$C,u>54;›&â¤û~hy¢'h&¸&GeÛ<ÑPùœDžóÒr‚pqF‹²£ 9C™z®.VÀ1g€#ðßMd¼ÏCÏŸ›—c̳U´æR‡LYÆ!…øäPzu‚x`6éŸ<¦i)MR(•¾3Þ¹Ðî5–„/nÑO:y½òQÁl;ØÏC8©¦×[Ô‹|‚.aÎÄÑÉ˶ó”ràÿ«ëJ%Wqà¾Nñ`ãý/Ö($A¾ÞPõœ04…BÚoO2/è2C鮩ÚÕ¯[Ssš[³ƒ'ÝšÍ,¸ÛÌç¶ù–ó —œšà½šÛyª)Äz´9ôÙ©Ðé¼R—dóI…{ _]œífí_§k7á@kêQ6×ÍvtH¿¨L§‚9Vc]\7ÐÞ©Ô?€zÚœx@R©×dW[ÉfïLõaÌváÀ+³“~ñ˜-Ô*þc"*Á$ñà ¸9Ùw*õløp¹3T¶ƒ©®±Õ L˜ZwÙ»Ø^CˆÙ°=ƒ\ú,Ü!ÅQdSý¢³yš "J)w¯ d€T9ÖcØu†œJçSùæƒ)RN‚Õ@â("`ª+d*q5P‚”O`¨#¾º^1] RI>[ ³V_¿×M¬Ž2EBLg¿RiasVõ M¦R ¯‹Ãéy ]6ÕÖ·¢èÒ8Xt¾ß4SónW¥IR‘j,ßþÕ“È¢óà]ÌÞAûlâ*£Àìνƒ¯ÿYZ¯!BËHS ÇÙ/’<ãr£#±[ÔIûVþ¼OÂ9ºs¦|ýŽ6D¥=˜ÊW0±et”“žJ€0»k;hH›G˜™á ëjþك-a=ëLöØæìxå ˜|B§Æþ[‘ËÒäúʪrÍ.NèLnT¾zDj‡…C pWœBWï¯&]¯6’´€‡ÜÄm=Dœ;ÆÚq»î‹õR3nŠÇbù 2µªÃjÿö„¯—›Ukê~>{1õGñ³»ûL‡9ONOå¯2lÔç÷˜‚í{^áÇé•Ë& Ü,T–©¤wëEü5áÙŽe(˜½ñ×lX ž]©àiÛ]ªj ^ódá ‰3öM‘~¨gl«Y­x û~Ù¥4æ½™V@U;¢æ5QAnû35ÊòÆóÀ-ÀxÞ+¥•qàHiÏ(À ª 'X$×TJ€¸t€6K…S77ùëoF®ÙñüþàUnO%8^U¯¶»ÉàMäMe˜Ý}é©Ã¶dQÑ«†Ôe}‹|“þÍŽ/€$5tPÆA þÉõ»õrv¬ó£@?u•‡"Kóª5x8ëÿ뮵‚ñˆ²Mg¨ÝÝgǼ³½µªùû”Í!©$3{¦ñê÷Ý¦Ùæ€E@kÆ•4®o­ô«WR!³c(T(/›.aÝùƤŸ0 S æŽW%è8ž‚ËB[ÉT÷–en#¢,/›ÔTúÕœI^&R%Ψ–‚lO¼¸hƒÐ’²Lå<˜JS°|h%J˜#¹ª Ï$B–¦“0M5æ0ç’„Þc U)ãÀÎq ⟣ ÀϺ#cgŽ;uDS¤çÈ7ž–i@¸ÕVé îø¢ü«Á‡Vr„©T«Ñ×gØFÙ4ѽ3ªm`çziCÊ-° 2€¿×1Di+¾Hyÿ6UÛ|:¿àPöÖ@O‡Ùœ·P8Ù@i$FíJ)÷¨éÞ>ÀÜ9Î?ÕÞšö¿8W†q£X V™&æ!€xPÏöðDouÙÇ…ã·rt^KmšQ½v+ö¶ÏÕ/Áïfth@n»Íeƒq[àê¡¶8È `P5 Žçh÷°54P'Ôé6>ÇNÄ9ÙR]5Qâ«7ɶÀ]}Ф™AÒÍy/z¢ž,ñR!÷»Åþç@/»©Ê:0ÇCÚ9•I`:9ñű½zi˜†Y}šªÁ£û”íhÌ/0úôàs°b½íûÚ™N5À}HhðãMÔš³KUÚñÄ;Uh²§IæaeØh?*ö»[x~œ¸ÃÉëu¸ÅëÕfúúå´¦îj€åÆMPÍ"OeKI<õ‚ÖN%˜c¶ç=TR ¤ÉC–3£1¯ùL#=Pò« ®—6Š^ÎÏ`ð4‡éPWžð–,æþx†5)~5Xæ 4dÆèüðd.sµŠ<‹–Øvê…î ;u”ÉÔL¤Õò›™Ç}çòù¢ ¢”Ú`~åèwpØ—õ"X`JN»¥¦Rž·é£ÜsfÌ\ݧ§2LÍŒ™‡r@~ýÕp–^ê;}ËTÙ}Ÿßb ­©¼s:2­Iu$Å\õ;XøZæãzPB‚©u#Î[…(€Î`”3‹çó0h§ =ÍpŸ0Ò¦ ´¨Šã<½ÞüÃ<+Áø:¸ezŽnÏ­Y`G•f=±…Lók4ö•é) Ûº žL% XMýç™Ù6>‡oÈ ý v3»X_´À{ªSi ¦rÌÉÔ5 K¼ä ‘¢žÂ Ì÷œ¶"¦0çôY@,ozßT¦é©u%3sÁæÊõtIÝêWƒ@™~@q?ÔÒl%_¤›³]Ú¶Ò¬±…«L’LÍðŸ“n4e6˜ÓÀD@Ñÿ¯ HXÙ+f|Àã ãË9+§’`Îéep:=¢5IçaïÀ»2'ðÏÖê i"§7…®†ç|fE7j­©´QêÙõæznÃ5¨´ó’O/4Ðâ‰ÏS ¦Çü‘^ôÎҜ蹪®¦q§äs2ÒçâN æt(šêús(ÚT›oš]à ¯Ï?ÄçœÞMä߸]Îb~¯”h¸”˜å7øˆÀ" ̇Å¥þÊà‰–Ü $x¦ï{ªIë‘­Õ“Ö?ƒ¢"ùvÃi’å=Â-zAÔ4õoÞ¹ÿÛ$ ­Z6v…§szîÔöIÀÑãÇY†PSn<IËŸ©ù˜Î …|L=ë"²!½pú[§åóñÛ¹ÄNpÅÄ-× ÈšÐ Zà P³@áXÕ}?œëu æä'ÈîƒQî =âN%SÒ#–k ”€×=Ôßf¬ýÇ»ˆù&× ‚[ȑҌЄêQêïÖ|*(¡£®þ†¾_¶Ñ2V”þÜõ;™§Þi4z†F 'K¼%ô0˜oëÇ:¿·4™þŽq «Þ  úXø;á³PlÌ›©Ç›—y¨ô|Þ¯XpC÷Ãñ¶¯ß å¡XLA£)Ã-*¾^˜¢mÄ´ ÆD0E“õ½èï|Z³õí~ð±÷ŸY[1®HÕwàS-Ž UTÁÍXQ€'´|VËÑsqƒNÃn3(tåžX¤ç²5¹ªTIõs<¸ŠÜ'â¬ç£Ï¨Âƒò¤Ý‹¿×îì÷Ÿ¾ï‰Ðøfxˎϰ)–־ВÑïéñÓËÓŸÒÿp˜M¨WL¨ñxÌ]h ‚™ágý-».âÉ©Ÿ€£g=~`°É6kó@¾°D΢»#@†ª–¥}ãÖ4Ö‡z:zú²•ÊŽ#hŸJÖz\pÜ߀g{X\+Ñﯶ ´§¥5 =ÐU =<¢Ž¡øpSntñLÏ0íȰ?漞ô‡§]Ë¿ú¼3Sõ7¤¦’G¿VÇMW‚ŸTzÞ'G)HP:4³/–ñà½ånï8 í¸<*<ñrÙåzÀŒ?ÕxžÔý½‘C{û“CÿÑz’õôÏ!sú[¼XALng„z¤´‹µ«Ä.‡ªQzzkÎlæEæ··°š„;‹†ØºÉ9žž h½½-” "5A6$HÁT)/ÔÄҿ̹ ß‹¸ VÁÔmþ=öl ðh|wn}ð¸a5éñlmPËtû[K$°€Ï]0ŸK ghU[…¢äà\O˜oO€Ì×/“‹JцõΨQ8cv܆¾ÄëÍ=û‚ÑNž&ýê½oV‚fˆ'Fèy¸Þ%œºŠGA8R¸"CÂå»Ì /å Ž†9×sí«=ð7»FÓµÖÚœôçðÇ{‚d§ÁÖ>OÊhÙ³½íBjgw”ÏãÙ¢Ù svß´2LŸìŠ2‹!™0”­DO8¨oýAë\ìD[zÆ ýï˜O´dß^=çkÁ±£ý iÄs5ÿ§ž ·ÐUÒ„Kè*¾NÛÐYz9·Gì*ì]»ÜÍX&‡?!ñ²ùRm3ˈUw€ˆXgÙ~#ŠiÏóõá°•GáÁœ…EÂo®h„¿Ÿèz.ÞÑê0lÏøÇµ¦³]æ]M™Ö/å5ß3$`.T'3„_.AëÏL#Ú[žÖ@G5è¹è{ñ­ÔÄÍUÅô½ž=cŽ” Àî¦gåÂåø0Q®sÙÿš\Rëþ£->ÀŠè,º¤ Žû”r-hv‚´ û3Îe„+ÐU—k»™Ò `¾®î6¶“÷ÈtD¹ŸJÙz.v‡-×rå³ñnkJ·€OTyÞq(ëðˆ³’äqqë–ªb깸ÎÝêi Eÿõ Œzk b-w·0ÇÇðøî„BOu =Ÿ×Z`ãêÉpô¨¢!oý2öæ2ë<›¿$ÓWܤÀã˜z^q:«Í‰€ 3LàÆ™ƒ†W  Nˆ’Õ ˆl?–ëüÉåêC(©¾gˆòã4¾áà£ð ÜòÜûÔà_§ÃëFÚ‹Î:ØADA¨åéS•%8˜aÂü œâ“Àó¡2+XÈ;!PÏÍhͧ¦í·G`¢‰Ë4r&Ôêñ½¤\9 jJ¡mC;Íÿ“LIÃä“b„ó°w‹Å¾Úñµy¸‰˜v=Ma®|ò›¬9I!Q=¶y¼99²³N5¤ýÀäÖo`óÙr[`Ü |’ù3}’ø—û óäYæƒÔ%ŒSÝ ©›7¯3/¤ªBxÈÉ…Ÿ"ó¸֢q€OdÊÓ0²SZ!"ú”©ÁMr¼ð&å²ö© Ð@?{“º¯\¯×°uvì9b˜\›·¬—r•ÓÐ3ðŽåµæâÍ©ôÿò'‰ÆçB]JœÜÛ¸V>E¸Ìɹ Ú?p =—½™èA².á&5ðû¢vû”{§è÷R(Q¶“"³üëèHRÛûpÂõX \ ROXe[èRƒëA éÅx*¨ Ëß6ºX¢íçå\ñ•Zñdã“áöTP1×›ù²3â*¸õÇKµø±·²Múž }Â+Ãâ‹@ÏŒ9~ÏÖƒÃQ àÄœ4›<2x»óñkA©‚ü|üB#P kDÝ\(•ôrÓ•¬ [F*U:ÿ7{—à<·÷ßc/¨¡'\å$;‚/s°Í¬Àléy%Šº ‚æCÙn ð‰]ÀðZ“ƒ/y&0Édòw¥]0&°óéñ­P€±BQw=­S–F¿Ke ¼H‹Wèˆ')QmAò/¨šóù`ù;$*.ÂIX.×Fãuáºaé_ mA»—Ùä_g™éÀðˆ t¼¬¶À.BxÒÖ¹Øë‹3{'Ì4ú™ƒƒ²Óñ‡±ë8÷öå›â%¾?YIÄ¡Ü0þc´–ÌEV XJâó0ä9‡P¸õ&G­ñ„Å<¦%t]´ VÌÕ bÉþ–`‡zÑØáÂÌ©[ôH= ΢ÃpH8/Q2þˆ«±xêzVn©è Às=· !¶Ë{Mœt s‰Aó#‹Ä;âˆeRé¿ÄÙf~ÌŽ5B½ÙK.‡w*nèa¼vq›¢/5€—~Y´Å ^º£âky¡#PáÌy+FÊââ“ô4.<Ô ¬)Ob•A¯ÆÆ…ߣ4¢¬Žòì;±úÀí§áÝ+Ýf¥ò˜§Z«¹ìÙÂ[ŽçÇÓßêgàƒõ„R µ/ "›j2J/xöH%周ûŠ™ùº3­Nw_‘Ú²­4Þê`lFðG·±/3|C[Û8 ¹¬»±s%¢­Fì”þ6\víÌq«Bmý…ÄZõDNÃ-QËžQV=OÞúz/9hxJ ÄaA8¬ šÅ…C<Âæ¦ìEøoôˆpj5æ¬Üy—×¹XÅM01sõÒ/jU‡ýKÏ-·Ô*œMf¶uÍ1b)•bí§l¦žW$4 ÆUQ]DO…ïôÕ-õ†Ó±Lö`â—lIãžã¢Ç AW{‡ÚáBgW„rný?¯ ÉΉæ=>T2«"Zà[T¹ñùéʼnžŸÑ9¼!Š1&_M®¬×ÇOV!“–}ˆA©°1+¶® ¹X÷„ ×luœŠ‚)eXö«zmÎu.œèÕçΤuei (”©gDüáwBÉ€é¯Ïl‡4¨œl‹—²£!Àûñ%ªÂ–¡f^þàî’í;ûÌ-Ä Uñ™«°æÞ(ºe=x¡Í¸Îô‚ÉÎôºp—„m(T³­à ÑV©%Hâ Tƒ©V3OºrꃢÛ®º#R3ßJ*î¿)û)‡ÐYÿϧßåá¢×õ10ký£`£Þ ­¡Ó5Ø—‰ÏÇÄÛ¡6*sƒ§n[žRç†D‘^ß´gý}*xÿxð·ô+…u]ÐØ¾³ G£&tpÞ)0"ü®š:4üÖêòúÙëkã©Ls™õÇ üäFê¹³öÚÅ•K£3˜YaÁUcƒ;ˆ8±¦<ö"cú_ùF˜—^êBÿßœMxgQ>— Æy÷bîûÎø.w³ã0ûÝÞ"ªŽ|É;æÇêñE(LG~ žJÓ¢BòÕÁ_00£ÃtSBúéi²JÒ`nm¼1çXÌ÷šÏ+Ïüã5FÌnIæþNú(²³Ç¨E_ó»O^ ¤¡’Ãÿfk’×ÕO}p™1|e˜“•3¼} VÔÁ¿¼˜ÃÝæ‰wUÓB.qÞ`µÀ«xjg˜„ùÙ[ˆj7àBšëeŠå+)þø?[bë«ÕöÝÊ`»²Ž C’P©C5´£)9…¶íy^f˶ö±»ºÄ'Œ“+“»¡èÑ^?ZŠU˜ Ì6Ì®–ðAÖÆ 5ÛE ´²»õ\¶@Hzkážèµ×eê¨eöøT•ïb 1Ü?ðÞñ&7¡¨ž÷bËŒ<åÑÐcxá6Ý’[7 Š×ÊÐ¥ÆC^©¦¦èz˜D¥YÉ0Vë9bjZ–f=®š,Ø$èE v—ÛîР̸µ×*®nZ¨ßÃ&˜+¼Ä8ˆ¤^ó·ÁÙ6r¤ÁÈnD "°Uî@5\xvýj¥†Ã$k5ÄY¾X@«±Ž%H.ƒ¹U¶.…\‘ÊTqKÓ†¾y'Vƒ qåFû3ϵð¸ë·Š§Š pwº.=o)n9JÀðt¨]å õ÷bÇ`tß eÆv±‡orë·ÞQ`¥É0˜÷ñ6šCöÀø¸¿4 !€ßA»D³¦\k(zþÛaéé2‡!«×ÍÜ`¶µñÆŠ"nm$ËŠŽxK,å©Ì¤GÏÎù&Î0 ö¯ÃºÁaØ Ö¢ÓäñH¶%Ê %âéØ`‹îMê †c3P,2²‡CrEQiFˆ|R}£Dê£ÞÀµ†÷]›>ÛÕÈg¦Çç%ÕßYsþÊtÚ¡¤Ñ@Õã‡E[«¦¥=9˜^ÅþÉ‘V­ï`ÿ*ýÒg‹ú®Äív6¬ŽÇr(È‚Ëý°|ãÔÂY×bæ½Á»±Ó K)œt>Ú¡ò^´ž)«úÇÎb Žz¢ß! ¯*f! ÙîéΊÂÙ@¼¬ Úž?·Fñ l÷‡cÛŠB¹¥£¤%È"uôÖï¾Þæ Œ¾ISðÄk¶r_¶6 °Àzæ>ÜámìSæI7°Ç‘Œ¬ýÑéÆh¼yŒl´{gìpK:‘þ3 ¼®ÝRÍ+„²[§SOÀ˜€c™²þ`*ÕðXò¤ïEùµjBéR½Z ÷¤jÃá1/š¥¥ˆZPY[³gÎ!á耀,g*Ø£»y wÀ 0r´èõþl¯»»sÁ„”½këoÍÚiÛ!+{eOX*J«‰Oï£Y"övX•Ø•7kB¡:Ó­H¡þãv•)äãÑnÝ–Ø=ß ™'5Æ#ÄDåg©Ýåeo¼æâß µ‚×o=Ýærr²? ÓzDnªfV`ÁdÕìÏ×è úοägïÝåg4„ß6åp×Iƒk~Mcâ£×ëÈ$ì0ìÈ×Á¤§^ÃRƒ8:ªat^mv”ÆMï Mš˜YEÝ6f…<ã%°)X”þ¢fyöáÉ6»hìƒ=›Ná°ã#÷¦Fçïqjt>f«ÄœdÔý½hdtÚAˆ•‡¶ÏAcÌÚôU-ú, ‚e®'œÏƒ ¾zÀôHu&\øõu|¿þd2ïHÝøn¦xMB¬[8ƒ«¶=[ô€XÉ‚e–±”¸0ì ŒÄH4;ÆÇ~5Ã[¤BAÕbµ½ÌoâÊ>Uô€ÅþÛnFž°5òe‘¬ ¬Z€^Œ{æ ”Jâ–S i-^>Œ4+õç ˆ¤Ážap¼³éŸ+ðî™»üàÐC¼ ¶±SLÙa^†²¤ù|F@ÑäKÊyqá°¨˜ §2üzHª§úf€¶akŠ–W½ôÊ2*Ÿ¦z2ÞWz¾­Ñ±µZ¾¤ð|¼Váïù|¶:-¹ák7°aYŽ€5œË¦=“Å=þ TÄ(ð(|¬oÂÈ5Sbùt À)0­Ëá(Ø/ò´#Ç£>“½ò(ýQ–Qù ^k#JFá_ꇛ9¬°¤;Ì–gò%N4Èh¦ö ä…L¥ÜÜ5z î6.zCØNô#ÎT&lÕwICÆF=mÀ0W” dû‰1Ïj7Õ½„= 5‰9z8עɼF³»í989úk{nˆ^9,R^ÌDSŽ´êš2ƒÈ(¯“Z¹A.¡Ët´C8•øþhÇU ^~Ÿ64j\†Í6l—¡e œ¢’z|¼ŒÖzp’Òú–¯ØšSnËò1xÛÂ!:£w-¥?ßPÉ@*–3x®å«¢Oï½íš¡pÿò佸.Ç|³›Æn7Sp‰ñ²eg)†“õ@ŽìÓ™¼.Oꕇ(³ÈñJzÅóßC °¦ù±åS¹îæÇ“ÝM…²Y×HáµFâ]UÂD±òa7šÆ±r—moɰâJeðk:Ê…íú£¸Í¤™ lšÌÃ5ШÏ~5!Îæ†™LHÓ™ø@¼,`&ð{Ómý!uˆ{¡Æˆ†pدg¾· u«m–œŽe8ï$ò çÒÌP/_NŸÉ í3ƒ¦°¥Ä˜«3³‡x5!˜kBTNqÈçüø{ð÷ 觸&U hr3uðö:‹[Ç=Õ¬ZÇ…‘šü˜fÔa-ë°Aja§ ÞOx-§y-‘FhÄ(@ÊßXÕ¼Òn…xìESÂ%ÀÝÌßlà }]yFðRÆ““•¯Y“I‰Œae dz ìöL×fŸ@µóQæÀVŸÙ8aÏÏÊ4†ñy8çšR[òÌ-ΞuÝØÒtœ•æÿq÷F¥}œœ^ k úbI1¤ ò>w̓@³±=þJÔ]*Ñ[JEܳàxäJnœØúçeJUU95²Ë—€crr ÀØk¤üÌ$'w×ig³ÓR{ݲ·¦>%„×Ü ž“DÙGn¹7aÐÌáÁYÂß=†ï3&»Á©MÀ·¿B¿ *‰RuB¼ÄÈïäb5J,–&ú£Bß:i¾Ú‰bŒ¨ÿºâ4²¸™E§NV¸W¯‰¶ïÓ¢\#:Ž’¯?Ú>¡ÜuUÞ¹ª‚W]¶?ë8ŽlrD7ýÀ)0–Àç‹ê@z Š‚Íf‡|×ä;7Ahý>œzò@ ¥M}³,èªÿÅǰ"àñWòO¥~]5ö¸H¨¤`>Eà‚‡Xy=—WØuÛ¦áȳF³³o깃~ vÊfzóÊ6»úë:V¼ Zr .ûäÕàÕV>4ן@½æ ¡m¦„Îdþ‚/…üip€O×þõ¸Jã™Ã""Fg/!ÔÑP°NÓçáWÍl@k_^ƒÒ¿ýƒ]õ­MufZ bi•ýžƒwÞµó»f´.ê&Š•÷†;¸›@=’œº¤«·,fÔ|óÛ _‚!2òH2TƒßYžª_i5ÔŸ >ïyÉ‚—áâÓSÄË.à“þ~ùÊ6q8± ŸˆUÉ ¸JIh•Û Œ)#C’½B”ï” þr§ŠGzØ^•Å–Ú×~3î$ ª¢µ 8ð=†ˆãê—;Ö§þ¦ËêN•R÷,Ú=w+{Ç[a@Úž Ÿ©™õ©Økñý8!®1‡ÿLŸRHˆÚÙÒTÊð(O…S‹µä”é›®Mèhwר0£P/˯`kÆœ°¬Qº_–ä[™ïÚ1(o7ÌÅ” ñVÌïÞ]¿S× Z›] €ôB§ÑÛ€îNŸQqéÿ1î—ÁŠvD%ê’xõ¤Sñò«Òô‡üTø’Ÿªîâ°‹/ð Øí$VL%Žr“˜wq=ÂãVBÿ¸êC$•aº@J„ÃújÆ,·m†öDòDtd¶ÃO­Ç+LzÚ›ÀM¢ò¼AúØ2°»æì•˜›°E&Gçtzi‚·ɰ)…Œoð⹡§r½¶ΔßD[·òÛfŽ´¤÷j¹È ^Øt8LìY€[)»Š¶ì Žd |ôåð—ùLÕ6FÈÙœùÒì¨FRòL '·rc0¢:›@a’Rvé²#Ä`”@ê.p¯ƒÆ–Û1øNVË0 º?=Õ¢Ú†FŸÍ7ý™,µ [³;¬'\Ù½1h”@b’’y©Y#ïÉBKê=ÔˆÇq0dWFô&Ú®³„/„U“ ¯Ä÷aœ.%ö§xf½6¸÷r„ò±Bú‘IJ`^•eX~yx`fIÙ ¼õjGÜÃ@“œíˆÙ+ÀÄlÊîÓÔ ¹562(ø–k'ØCWÏz¼Êº9_t—'&™2²±G‚Æïic…-W™º0‰½ÁËÃ@Ì@©ä] †›uø IÈýFîfrj ý?îj;Xº– x‚)_2¤tµAÐÌ{±0O†;ü.¡ף{$AH†b†¤Éyy™s+ø3µsþžÊRÎó–àN?<ûÀ1™r¹Œ‰^ƒàÐåG z@¾×N #Y-¬gݾÞxB"UÉHÔè•PL[v/WÍcjTèñ5ñ†c€k‘œ‰ø§¤ä&¡à¢Àˆ˜/ÅM¡‰žJÚ°ˆ êOï+úØÌç·Qwe¯G˜\`KIÈ,^-·³\ù—9·Sæw­oÛó¼ô¼ÁM¹±uÚçï7´)08NÒá8a¯Ð›~§Qîò~-Ý#ìôÞ—¹â D*)ä/±Â›s— ×¢¹5Q`%²‡&qà”ªàtëÕÙN; Ïë³cðÆSÌ_˜ï„&ÈÜW ÿ^ÓFÿÀ°C|Éì¶N’a¥Ï<ôâ²ê,(Ó°ÑÜz(®$•ÏU°µêJyüïêª,¥›Óÿ±0;rŠÒ&BIåã5‚¶¢¥Š”ˆPØtR B£F~|æoV/Õ¦-tÙevøO”CÃÌŽZ!æ«ÜKŠ÷äuî°Sôúhíú/\,ô$•ìq¼'[_ÞàˆFVKoT’¿SX,¹Ø9w72>ôÇÐaµèJ(q ¿“£RÉô¦‡p뢬 XgßÛrûÇ’äÛ* èTRþ‚WÙ²®`ѯ( Q¸–¢Õ µµˆïlIùZ+k–!´™ïDw‚êÅ„c&Ц¤Ë™Þ«EDL#[eÄ©®K5Y4™Þ4/ šXyEÌJakófŽêB!eÊ[†˜uÒO³E³~jü≶¡³pµž•–8ŸÐZE“‚µƒ`Òå©I*fã!Í32_"Ì©g¸—´(©Ôy "Ü{z°2(— EXw%¸ Ó×úG*ž‚ÔìøþMFTnuYõÛŸ:¡2 o ü¨÷œUºv’žž@EélÓY•dFÝ—Ìü‡[87û+?À.²Úºß ]ÙrÏlœ#Šùñ sKò´À/ÇУÆÝ-›‰¹ìM˜”ÿ$dÕé‰ÕE R³ºá:Õv~ƒêeðfž`,î£~ê¼(ø,/ÁHKA*ósIT/Ę$âD¦s:’ wú£§¸ÖA–Õ=½ÔõÑ¢žSxkÓé÷€=¶¯½Ì½M>¤[øe)GüT¸Îøi`&Ý® ~‡øÁ˜ªáU°yåÞýëicQR(Á bЇû4)ûb^1à²ÓXôׂ–ÿב^ƒ¨˜g Žû“ÉrGw˜É’”*¥2JòdvFAk"ˆB™UJÃî ”Õ6 ¸QÒáÓÄ=?qÂFÀ{†©ÀW¹ÂQàéHÕ‚Ù` Ä­½IyRNÆcªØÙ+²òÿ Ç”bÑJ6áË,‘Tº 5Ç«v”vI5$It§w¥ÊÔ3bÚXRRåè°f·³ 3Ò+žKBéÅ`yª^¯š'vs‰qt-0Àl=+0©§üQëQ£Ý&¾Ü£SžøIñC¹ü{(NÕAã§¿«ývû‰}ôoMx,饭L MYm?:+œÏ·Õ½6–*gg½3R6’œNrO;¤þôF/+l²µ;¾á®Ü˜+ä­³¦@‘/Õrô·»©VöjÎQÌ2LJ‘bƒLÓ þk¬ë °Â ªÍ9QÐa‡ù52óBCu ¨¥A„‡rmì÷8P´¬¿ð¾0!5¸ î•|BõAšU®/å¡’æì,Üþ. Œ)©^`‹B“f ˳ÇÊ5[hzlí»Çñ†<Â]¹B2l“¬+Õ“•€W€îTÊ¢‰úáEºú¯@/ØSVk–ðÑÑY¤$"@çj$†ªÇH4 U—,¿ÊJ¹³ =ëº7`ˆLP›¤ áU§.¼FÊæa ú°Ñjd$ÂKŸÔ$¥«pß“žç®/®ñjfßPY&Þ…jKûø;õ kIÍÑš@6zYú £Ë SI-ñôî{.’5ÓoqÄxê‘*X:A.1HƒúWJZ¯#ZAxƒìë–yM¹d2zr›ñ¼¿È ”+©yƒ¤rç5€¸0µüCw¼ù*¶G§YP5¾I; 4IyV¢2IÄÐGv¾Çžiò°¯#IqObz[£hp8®3¹€ç"5“ƒ[o^£G7}Ûô“ÐåÕ‚ï3” :ŽšåäÉ*÷a£ŽA¿Šj"r«¡oè&“Ü6*ˆWRsчÒyô¶A©?Þ>eWYæøž•Ðf àCY-øãú¨a±ª]ÏJòCéP”5máøv%¹ «S³»…(NV›œ1µÊ—Âï _ƒÚª¯.©Ò,8…–V@k¼Â¶:¯3to.éévñe¬©–Ûá¨?³E߸ƖÈdƒ/xb·óô†[6욬.zˆa‚Æ×w&4Éú l`¦1áÎôŸˆ9–ô; ·”H¥Nà^Iʱ‚Qå>â9 l5éŒWuáIÅ%%õÌCAzðÂr€‹˜â)]±cŽèÊ©ãM ‰gFÈö ËLî”g~ÍÉ6ÙŸVuŸ0ÕÀ„ý2_'Ы¬Ö 6’#àã×ûsÉ@î ‡2l)©íÓ'¼·%“@5…¢ÜÁ£V•Ô`b‚B"1Itãw¸5;Isaê§ýóCO¹š]xGÇ0̇©y1©{}º†•Ôßút©“#ÓS‡˜lw¶ˆ~ÆwPà@9ê®uWã¾Þ /]IþìR¾•¥(¼ÞË=3Ám’ˆä¤½£òö°±:…ùMÉÝ=(â®7°$%aqOèWnÏ´"[Yí)°°À…Ÿ—ygÆ™Óà†êæ&z:Kú$p»$е$BU;Kú$Pµ¤ÀŽ‡ì æ]ø‘¡ ƒA ø@Ó-yÀ³²³ƒ6ŽùÕ.:$Ê×)yÀå’:¤eÇ”];ß?¸Ãøï¡K‰a„ó²ÿ€^|êôâÔ#ÊhôÔ#ê¥CIï†òÄœ¹'slàå.%®f&*̰sB¢©Xz9ÚíÌàs1÷}ï2ÙN’%ûþ nö®žúŒ*ýs<¦:šX=Š!#m?î€Îýmþìxx}öãð Ó˜—nGw—»æÏþÖ÷“µ@™?€Å$BM ŽÏÙ¯JsÛ5=Ì„¼~_pÓ}o¥uP¥)"ý4Ð\Õ€wÿð àpI [Y­º*ó[“G(4qóŠAV 'ÝL6^ÒÍœä,-¸ùY:ÎFà?øvo>í¥$KÊÖrm¹ I#0’%Û¤ßâx|<×i§ø·Ò£±~äCJýO¨ãèaw†…Ùž'mpÈg&éIÅìæ‘= §k7çÑÙ¥!3VÝ{óè·;fÖã×D€Ë¬Q¼x‹MbHÅ1Xj* ƒ÷ÔØšù„ò~i ͤ ?m1TƒºˆaÒg”™cåœ7ûL_¾ì/Øs÷½¬â!4ÉÊÕ}¯¦«AYTî½ì*i†4¿)–ÕªMV`ÚæÂz“ɦ +eÆ\cÎeój®_õM‡‰iñÂâM¿3cë BÊó|Z eE£ó 4$eÉœ¼+ÅõüýÞRƒ3v^ãaË2;ƒR"¡¤Âü~*üåÆKJg€ÈWQáÚÁõkB+h+ZFúǤóx«?:õLjO'òÚĵbf~ôÔÍÌÂY±™ú:FÆ†Š =C-Î_ò¼#ð×ä/9©V[Pv&xk%ØY¹<¤\ŽîAGßÐe&¡Ê–ìcBžžÓÚ±ÊP FxÝògªÂ‘…%&à^*3˜]âšáÀËŸáöpóÖÍe«¿ ‚ÆýVê}ì㽓Ö5{qÖ4=YE7Í}!%rÇ'¿L=úJÖA„ºt31'ïÖ™$Y'<:sL&­ ÷á|X]޾ž?qÉ•cFóM?“ ´6ùxŠ`3€Z+{ƒF…Ѳ{©k¶Vîo æ2­ºjȘª¤@}¼ç ÷Ä|΢¶Ÿ?S «ÆmÌÓ¼MÈæ FMˆÅ«ÔÇ4I·½ Õ‹6ÛBV™óÂo2_V‹D .WfVç¢Ì¹×oå!ô¶òÈ^P­ùEÑÙ¨ g°°Ä¢©(ªýX¹Àe®SËÙ?ÔGÑ¥ïõÌŠ­\– /Õ˜‚³6¯Ú 8T3+Õ]¤Yé^´u‘=‹ÃZt`rfG»‚óöÉâ.™mG4ì »ß1>CK\hFM¯ü.Tð–-»‘Šl€?–kƒôo΀´]ßåŒPÇ­º1ð”@Ü@ꭆϬˆáIaG=ÔBĬëÍÞW?±æãÞqàSp˃ï;0ÑÏGÝTàR2¾DÈ/ÌüÊJ£-Öð” ‡Ü>‡e«­YtòÇEg3Ü7v|Öƒ75Ìsþ¸Ìùîyú]òá{Áøªé˜ƒ‹ûŒÚÃ9™t #B£3€.üÞq j—ö8å}¹¶Xåx‰ÎguÛ#òVò½4õ“/†'mžWꧦÀãŠôЗgðª¬V|‡MW®ýÔ`€2’_éÁ›š)£0À›Šó€D2ˆ_V;žÊwåP³r½L¯íM3å  7zOÎ¥# _YC9Àû5hòÄš[Âö’Àä‰Ò§Š^@ö'„ÀMLÃKVÖ¼\ÆðJöϘðpñàëú^8õyòâ¥Ì,$+O,eõmÏÀ­ºS/VÙGxKVúÍŽ¡¥Þàà_<îÎ Ú˜Œ‚»/YÉ_¶Yk³Âš(±ºSVª—È!šyËÉp–M½º=_ÎV}.=½Áó{¼uz1{ƒ·€JurÁøJõIˆC’QÒçfÄé¼AÜtz‚Þ&¾ËiñÈ9Î ŒÉp#g0³¬vü#ž9üßM¹ò°¥äüS ™ðôœHê™Õë¬m:ðôõá»U¼¯gH¬#˜ö¸¬t›À1Ÿ—S4sÀëÉl@ÌÝ´K"n,(B&—œ<#žŒ99õônOЋ’» ví†ß}¬—gë¼£{t3(^rºkÉê0ü rLœà`ë9—¥—Ä^bµuàŠ8)’Æã_ NFÙ”ÕÊ»Ah¦QÂö7Ž1»ÌdÒ zaÄý0 ”ÄgiËjç9ã­˜k{^‚/ÍŸÝ™’eÒQa)¸#©Vf§~Ñÿkæºç ˶w×zÛ 4°YÕ6mÝO´_w½›¬ åë¦g……Gó­œÁŲڽ 1®àbÉàY-Õ$°±äìâqœ O]£àc9¿KΞ¯ZsÿìŒ Š‹ì¥©ÈßÔÿÎ: ›Ò€ürÎp_V–®Ï9ñúžx-@©*¥f¥^™Î¾„ ©>êœó·=šáq‰µh–ðš¥3Køæ s|.9øËÌ!ËÊ;£ù®‘?‰ËnðR2¥^ÎHÉàùÊÙ2ˆðE(xVã¿ ›^pâFŸb¦ß¸]©„wžW† >—Ì\‡kаa¯c ¢}Ýy´tóÎ¬§Èȼ¡™”ä›°?g¾•ðÿ²òqè`[æÀŽBhpKîšÎ,æà»_V†moh®qÍXà•'®ÁA:f·âá×èLÎeú7…LÎ[­Z£¢t—K4ƒY%gã`å$ž7Ãüά܆y®7‘GÞ˃f"(bš-QøË &ÕsÑóÊä~r½´¦êyä{G1LÎíÝòrã¯{~Cþ:= !öîÚ¨šèþæWePĬö`‰5uYµŸqmmÚü ˜ÕNc˜ wYùaz 5×ôî_ðeŸm°øÑd*³Ë”e8Ì‚Î;Û ì"©±÷º¹F ˆò1ü.\»yìÉ 5çpÂàÌN Cô~ïî_«~øÛ:w7Ô+Þ7‚/²ò»ˆ ¬ï«ƒoI¾³±£{@Ô0ô19C¶å™,ÊÙ½õ¸\Å"s¦å&ÆÀT/{á…|ûë*›ºó´¾5Þ̹6ygv‡ž od1(°ÄûÚ>¿k›·Ç%K%ê xA[¶/rû §£µ¿è÷ÙøÐ`E‚fµgSnÊÿÖùÎÊ!r(׳ò2k‹Tz(ÑkâÕ@>“# ~)!šûͧÐbâ¦ÁC¾/v„$ûî8žª‚„ëWýlu³F<+¨/uÐ_hÄñ‰eÐÈdÉ>¥·Ó&ú¼&ü%ÿx‡5ÆgÁÞß$ÿ¹¿I¶ýÍèû*áMVEÏeg¡‚iŠë9@©{C¡Ìj3ß Æ£Xy‡­cJ¨î•ÿY·)yÔ U½Ma •‘±¯706+ALÉTCÕðâfÔƒè©{gÑÉÂ_‰ùJÅ¡ •„€³gWy@ï’)† ­ÀII%h¦Ûw9¢J%¤ðaH’B&llçSc÷ZE)±\ÆV¼#èjŽÚ‡JWxðŽsOrƉZRʪ‰AƒéW¶ ,üª&gáÅsÜ&/«ÿmrd8Ë ³<á3 z¬îàSÁrF4$ƒ&+/ŒÒ³XÃųè±9êOÀW§ ¨qáÃÿe’Ö ]'"ó é‡ã†âÐÃÚCK칓¯' ÉF=ºßÐv™ù‘ÐäWÞbM›Ñøì Ù}ðˆä[‡,’……m5æðøÐfÛ'¼ÛøfVÛùný®O¶i“÷rÛƒT&—HsQ_¢|Ê: *<ßâÃ@plÊéiã5ü7mÂY•ôøŒI5,eÒL;TYºXf3c˜ÅNi¬èó³Áʼy †n§M·¯Ù˜wap¹ȉėí|>ʸ[Ù·¶H2jb;O%s–r±Ý,,¯WxÈ@ܬ½Ûj+pžîï0—ýõo"Ï*v‡&À-€~ìÇE4¯‰Ê ô~jΔ߄ªDÊ”‹+!ýÊÜ›ìÈC%ƒ 6xVÙàˆöl›™À×]7Ÿî¸fÎNGŸ²{1ÙœÎ[ª%7è.š¡ÂÅ$uq ¦ÍòüÊ„În²Ü V• ¦™¬Ì/¶KÔ'?©äð4­)w^üX]ˆ‚ž+$—]4µàåùË_!°ª#J ×#Ž(%çqäÌHȨ́f_âÀSCdkÔ—áihkÖþÛ™\FF¼y™Þj ”&ºnŸmâc'Ä¿LJi+5_ þD7U¦4f5œjê÷†X!;+ŒDÜ+÷}”AóåÔJ…Ы“f0ØäjH+`úʤ˜”¤ÎîE‚:"¡znAkÀ#D_ÖĬ X[‚¬Ø__øHÞ ½”yLCaàÆ–xbÉq·dŽb®Á¼¯Ðº«ù° _`sîŽÆñoÕ´ ú ~»ŠñÞ$*¼¥¨uHƒþL ¶žìî°ûäZåé`˪~ËA( Gd{©U?9¶m‘Œ1SÁz@r…ÊGm{è+oƒBe¬ªAé¥9!‚=|döS{eçó]7\x€àñA §ñdxZ …jr !cÖKÿ@Þ½ïy ‚3`·—hM‰ŒõÖ}w¢±r“âJ‡»ªkHï¤>?d©¼ýîô}a‡‚<(ŽÚ´§Š Põ¢ÀÍõ86h5× Ñãxÿ{c„ô;=<0–‹Þ¨]åv[Ìõ®Ýš+øž7 . q†ãZYªá{ÖÃd›Þmf K$þk ü„Ò{ý\äð«ñKCŸ+obcÖü³Â*;öú$©0W~êôîàiûh·#ž•ÛwçÖ¬QŒ@ˆ~™ÄÑJ8dÛ‡ŸGN¦/cËi!¥^y¾> `…èÏþÒsZ;¿o9‹rÕSá¿Lfä^YÇÆWëÙïj1¸)€å‚C¨JpyV@%“›%áÖ|ùÆ€m ”h K7X`+µl~v’³VÃ9‚¶a [¦žÂšÜ 3#ÝêÈt‰žaKu§¤Äe­x7@Ñø´Œn#a–åúÿ€CèØÄu;œ wOñkî5C†_ó^&—LÙá9$—­c®â5>Ìô­BòÞqSìôõ¯A=gàÕã“™A!“•P†˜9>oÉÑaRÅG×Ó!ÿä/èr-¦ønÑ åZØOw¦ù¸„úû&¯láîøì¥_[Ôf×üÙ¡À/“[6®•íãàlFгXu¯‘Ò¬h|µ¦›;ÓôÛt3pâL»bZ~û"ô\ ß“W¡GØ*Ú£iŒGŠA èÅn߃YíLn’t&¦òtØ•pGƒœkm„móÄÚO©Í.ä”2Æ”aÆ«‘9í„°2’G•V¦–V3dQ»ä&lUxHðQa±Í… †(¼mnÎñ~Î å˾H`§¿±=[GÓ2}1 ‰°ª÷¥Œƒzc¼ XámÐ+áZ+†0Wnܨ!ÛØ Od3øŒ¾+z<¤ªMÂ=`<3¸É>´Í üÇÞá™ÁVáY õi4 $Ã6tÛe-l_T>¶Ý›5W»ïj¢àÕÊŒ—}fµÍhâBÕ>¡ž¶==êê9‹vÚK½9ˆ`ˆÚT‚Mz²xÎñ›[j¦¿q¸tø"¾w+± œaþRÀùɶB9‡Ð2ƒ£&ƒ&wÈžk(©}ò8¹ð3vìAÝd§› ÏPhl\ñl‘Óå=µm?»K'gå¹c=ñù7Fs­ÁÛ†SQ;P,{>vÀÖEºIÅï‡a!+Ç ©¥vpùâ¥T5í-ªœ;¬¾žßTÔÀRw›n–­6û¼Jþ;ºj¯Ì¥±'Ãù;b6 íû¿_V>C+ ÅâÞŽ–|¼³¤²IÛîdTËàÉ݃ëðÐMS±èÛŠ©³|¹£ ´Í+ÄŒw‹BM“€£à’ÜÁû ®Œµ}ìIqÖ±ÜÀ©)Û6WXF ÔõÎÂ:A¬{ú(öõÏИ±Wº¸b{?³ÚÈç%XÈŸ}“ªWßš ˆk2‚v¹WÙãËù¸!±˜ŠPz såÃõ‹²g^gƒ¬æš³5©³íl(‘ŒÅâÔG×Z´*ñ&pu(†Oà„Éd„GYÒ]LîcDgV*FS[¼+ôje’1’ÜñVژ씞àïa5œ„H;vpá€ià‘K˜ÞùÈ=ÌGÎ!“'%¬[´›NVÓ]n A™¨7ø¶a 0K‚ÛúcF~#ÈãRÜ´íÇ_8½‚)ú1Í9w¤¨ÆOÞ Ðå¥_‚'%×;‰6jìŽ* —:Y¹íÿ(Žλ¨8¢8½ëB$ö Ô¬€"w„\ÑðÜìO§nÇ×O>™<À1ºÆñ=hˆa9œâ%Y ±~hâQSÛ~|aVÔàb¥ÜJÕ`øq+‚YbýôÙRrlzQâþÊåJ`i¦žˆèË%$cžÄÔG’f8žBñÆP»¯î$>–SJyf&ªÄ¯ÿ¢Í4’À²›LfÃM i1œùòxY Ô?j·oqÀÖž4‘&+ >ŸZ3ÓöalV#óÿ*Æ>a6˜œg;B“œI†¥Û¼t §â0=/èL2º9åqAî8ó`Å@ˆm+ºÿ245„§¹çœ7Æ8ðú1°sN†ÂÜá[žá­Ó+جt2æHÔJ)íN"ÎJ!cq`^Ñÿ‹aฉӘêß’øu—è߈¾éîú÷‡:n÷nN |°P}Áø@LFµgÈ£¸‹Îîh$òÓ÷"xc`Eœž£ì‰m³ø»@]&lðÉn´-ºCÝK¢ÆDôc ~›ØÌ– vÜ“£Ñ“rš<è!íüÿ~…íR SÖãø^вsl “Ík0åÑÿª;»=‰'ŠÃ»Ög»e\~܉@óîâ Øuê_Åj×/Çái¼ûE¤àeµ)lÁãÑŽ½ŽüTX7W€  =pœgô*Ìûp öbÒ8Y×… UkT'{Ò"øcîQ\ÓIdª"†XÊG®@$ ÈDäÔ¸ë˜åÁ¾¬©wQ²U æÒˆtü &Òž%d¾j‹Iˆ7W´1G€çy>u"4‹îèo%¢ûÓâœDºm¨ù 1’á!KB[ÏšQT´ã%IúMË›‰-"f¥‡Jç~†ü·Ñ“z{> ¯ƒ]p&ÖС ¼PúÃR@Ê^+Z?nq«Í 'Œ¨²Wu¼ÌÏ¡øÐÕ´Þg« L2\´×™ðÌXÕS޵àHµ‚Ì(ŸÀoâââýœªG÷O–!ú9¢_À“§á EvÒyØHBbgBú>þ}°¸h{¸¤5-cSžŠðµÍÅ…M¶™ã¬®›(*ƒ3fµãyûC=á\”`¦ÉJ³ÑèoÁ§ b`wÖЊ•¾Â·ÆLž…÷$î¶HgV»?Ìžé»úÖ^.4’ýþó.†5ÚjÍ_¼BOp¦ ­Âé¸Wý ]¸ô­]¬L+LÝ^äMØ™'D#i@“•2Æ+;n]ibBQV %e3bhy:#~‡?5¤81º;¯ § Ò@àˆY-O¬.\(àÝ2‡œGœïh,u.Ç–ü…˜‡ÂÀc~'þÿaèÉÖß´ÕD{ỦɖW³˳NQr#]*ðTÏ~mäе™+(ÄàÍ'j"‹ëU^³cBŸQæÍWæ9ÏkºѼ‹Ý;&® ži£o޾·Å|3ëuÈLЇùÓ_Xx•”DcP20°&T^ |rsz´OÓÜl‚VØÆ|ÆjòZ”©&•·A †BlF~PÉ`MYJ•s}æ¹Û(ó@n#ÎÓOʉûo…gGG…¨½¦íÃz9¬?R à’_ÀébàÖͺ”u©*ÄZò ~°Ã(´û,,8­þñV¼-^1á ’û-ÐÏž,X(î»'fF¾:›Øšì(`ç4,ªVþý™2ar#àÑÒÖÈ,2r(bð†ÑÓä;òÅt@Y„áì<ÒgæC·[zYá½ö:§“Ú"/FŒÞF‹hìCG}†·‡{Ó}!¢Ì/s˜2–Q9ù6ÖU«Þ Îtú®µ˜Í®Z:‡JxSþCU(0 p—$Ê ³6ç°o„®ÊÇ[‡µá…eÀÇ X!÷&ºÎ9Ÿ¹³…§ðöóðÉ"µì06.ŠË¨O™µ¹×°ÞŠL¾dú Ø\äÔ!Åä({ssîtùtÌ_Þ®¿óNy¸K7ÿ» â½ò¹·S” å’뼚#žˆOߥô(eé÷v ü­ôèaVÛîïØ0­Û_ìnë°³»ÉI"=²%–Ogrˆ9êfö56×£:6ŒŽr®ßêí.-&JÅÿM—½éÍY0\¥î¤Ýö Utµ7¯#]œ0!a§~ˆ¡\ Mé:ÉtNUÙw°¢7Tg¦oÕ¯¼‡nB‚á®íàè`“ƒ£¢À€Ü[XûÜT¨?¯ ‹1zNœ-òÍ;åÔÕÖŽˆ«Q³E[¨*HL¯5fnTæƒ&ùøÆEib´Í\äd—&~|P´£{a‚ÃýPܽ*Ë×}7úÿñŸóFwáqúÛètãU:)…‡ý7%/øŽÖ!/è–ÄI’,*¡<ÒVõ KLÓ(…•šÙaŸV­gâw^.QÂmÞf=uxŒšK£š“¯}9é,Q)éB{Ð *’#i›2ï’Ñ2FÖ'ºöOô ¯¥‚¯vÇ7Œ/«e&²ÜyÇLÆ;/Ë2èp•Ñ_¶Ž°~)ÈØäÞMxÝj¾½n’œDWí›àaÉE빸±W‰@÷*Š U»Ã§ë|H4fˆ Ó¼H1õʺ$ð­ë1þ‚iƒúvU7Ÿö™Ûa³PvY.{ ûj‚ucoPpoS¡ò˜+ aCçÉè~Å—fÁæI‚\MAæ%lnÉXï…jº¡Šð$=Á9(”Ü4€ºT-–ëÏàaí‘’@l·ä9Rx ÏJØÙ"+*LEmVeŒ2¼Hk¥ž‘šûY6ÒÉWL.õ"ÿ%SàÅ–döÝ–ˆÉ„NÕˆaé—C Ïï?1øu <¦;Ùå?÷òIr–õîÖÏÙ3±?!鋯ÍTHÁ¼å€þéÔVCå ˜7œã¹ç@OFu¦Ò(BHÛÆÁç¾7ÜûT KD5§Ž¸D2ˆ%Ñ gõ7“ˆ<©ï†ó&†^VKE4!3N[|CTø+ªg×H,Úø)mêà Dû2’%û6/ ßûä¸`2À¼ËÛ ã‹41xž€õÆ,NHÍ[Y‡Uh÷ç Èל.òݾšß#¡o¶6‡†¥¬ª[;²!ã$D–À‘«-gvÆÄªš/%-èÿåÛÌ0¸¬­³Gó'Lß1­7²ƒmI[ÓTÒ8èŸèAæž \3ú—c“¨˜•©yÜn ±”ì¨CøStv(XÜ®¿Ô°¸¬6[÷Û]›MÈí2†àßl1èRO'Àè»C$Í:®ýdŽdj¿^LljèNY¡ZO -I†dË”¦ÂlÊzŠ„õÿ=ÀÂ[ø¦›34aFªb†÷à¸T Ìgx–®þX»¸:›0T¯zQ"†KÀ Mà:…uæãµð"­¶ù»Ô'Ê/`P—\¯ø6ÂNô¹Ó.7›Û–)¹¥¿dJnè_Ü~ Ä.Šf2 ©V$c\ß ømá`û4Ã/,=n¨?Ê›ÆB’b¸»+s'êɵýjĆ’QöÍiZPý2÷ï¾5_"?–{ÿHô¦ì&‰g P_:¿ GÐÃ\Ü1wä)vMªNÀ­ °òpO4‰ºED«&›G×ðV6y?å+1Õk» _‚%ÉÜèÉ+¡rX§ëŒõ¤QuEÐʈRÇèüY#à|T\TŠ…?SB§cH¤Ô3xž”Œ®Ž*Q/6´0ƒ™aŠ”‹„ð W¡ý´×ç*&¨’|˜a•!Ž%È¡Vˆ1&’ªÇ ™wÜ_(ÄYCäzvç¯ôM´1çïJî'ÍÍ„ïƒ-ž/†ÊÖ=»þ¦¼-ãr0ºOeõ–'‡} Ñd¹œyKhT{ÔDšÆPÏž7ê¨xÑ"œÛ=JA¶YJVÛŽ)½­“ÓÚ+ѨѰþún2Ï>L~¿…þ–™…¿û§[;Bv J‹Õ‘Côp\‘Õ¬Œ¶žË8Dx¿É;í• éþˆªÏñBâç±ìHqkrÈahᆯñi)'+òñN[ÊѦㅞ®¢ìî§ ‰2 ¨“?ð&HÁ8„XÙw=³cs1¸ª)Æä‰ùÕf|ý–ÑÆùB« ãR°¤ ºÓáÔ0jïÎa§$ð.úMyí/ÎZÝ•¯¢¡ºC#m’)ÉûNϺuW°¸(!¦1h¿8[CûÊ u§B³ªÌjÛ~Ÿ¹´Ü} œ%h½´êö Õþ‡”,À¥ØÃ?Õ(ÑŠa!CTÌÓÏ‹N³´ðDÈ»bÈ”ªp¼qMý³[lâè`½5n¶Å ½£VÅ6Ï¢´Kå¨s[*%ÎÐbÆç‹[’¿=qKŠ)^`^‘ÂZ~R„¹I¤Ô6zÄHú5Ü… –¥–kGÕ"KK-èW´úP‘NŠ'‘¨·¿Ï£Y¿•ëYJ)?¦\á¸YÉzH×á–Dìht+*ÿÊ/”C”"#æÛHá™R ÏŒ³©LN|g¨Ê[ÌÚV|ou%Ü< ;ˆQ`Ñ­ž½tT¬Ro6)°çÊ=*ÑÊì/îk˜«~`;!”#o–ÿ:/zÅ•! Vjf{$3%Ž+_0hÖ døÉDRcÔ³Æ{ \¬4ú[”º2 <©0ÔŽü¨Î§@ÎʼÛå|ÏO}€[ýù¸ÎŠ5 7ÖfBØ]O‘ÅŠTØkJ½²í \S§0£ü!>*GÉ1v¾XªDÈÀò#-tG¼¤4RC‚¹€Mfú­•­ÙAØUj6Ó|°I>ðr½úX_û¨B$V0S“¸ý©ñ(•¡8hU}[FCaÿÉýY–"Ûôó0¼dãöU!¹ŸäËÅ·äTÜ“ÍpÑ2© « 6Cì*¬tĺaþ‚¿þH ž¬ŸcƒbÕ/½f/¼˜;r…K ÕKyRwùÚqG“X˜Cx%Rû 5/*/5"¥ý ôÍ3?aèÍ0¤™|R¤ô ô ²ŽN~¯gr"@¦LÓ–a:PÃÈa\á·ãïÛ"œÍ&`*ü u =š0=N}¨Mi{É}ÃìIψÁ§P Bÿ©: ãØwtÙéR …ñ%̶ä-ÐÙ½¯âåaø5ƒ Š~¯ØR¬Ø6pp“¡Ò•(» Œ‘0ç`Þ0R:En¾iÂÖþy”ðŒB³¾Ö ‘¶/à[Y-EGƒdt #bš?þWµá­Œ=Õö¸&ÝŸ!òÀl²ÚjÆ Ûó–Œk5[Œ˜Û!¨8Õ5 ‰ øS¤,yJ¿¦EÓÔ1-¼ˆš÷»5€Æ² Ò >[Àaî'ÍÓ °ÖjuI Œ*¶ño§]mFEUØm9\´Šä³e]DÙT@~wèàTÑX6UxU äR&œ•YåÞð.l&åÿ)(Mî´}{Š4±u§}ã!÷kÉcÛÝÕ¿vïÍ`RYí_¬·êéÚ'N–&›ck©Õs¿¶‡%¥›xV¯FÊ“¡$ ]Y-=ÅH f®Lä,Ð|vzâm¥©9U—4˜~ÍhǦj޹_ÈõJ-pùo—/ Y¯°ÞÚµÒ Z5Âýƒ7áSçqÛE¬¸¨gf~Óµg¤•™1™>¢—]Wl`‹“f¾D„«ÎI·Š}k¼GÇvž]#‚ñðR¾ hS¤õ=9‚Z AÑL?~ HêãVÂ5•Ġ»wø³ÏrÙždabMˆ a¤µuä/æ`éÉè‰Ã&°{÷áŽ>,`Ï ×é&°Э¬ãØ2vÎRe`'’â¯3ʳ[ª§Š–ïœÁÒkƒíÅÕn[E‡ CX±¹gjys7Ö¼‘6ø–ÍÉß÷îj›—Ú¢[­ÆgLį,Ôò/¯€´}Ö¸’„˜o×á‰7ÊåHõ‚ÐYÆp u¯sØQœÀÊpA‘×¶M¹þq#3‹ôÏb]k«ö}ZØÚ°Ðº¥‚—³žŽÜTOúÂöèYÚ6”J×Så ¼4Qg {ïdê@–»‚Še[9xT®-,Ò“íùòwùméùq u>"—PÿxÈa ¼Uº¯—˜eo̮݀"²77$k]Ë»&`V‘Ž}cרÛÏ‹ö]§ ÛWGæý:ž÷{bä½X–BñBQÉí êwæ]);”@é;³TÏE?%zŽØê|%H¼ÿôý*àjV÷¸ú®30cr HkP¶€¢YÛ‚‘Y;Ϩ†ÜÁ/óƒ¸nùvDbŸ"+3ˆqÐçí®tÙiRÀ!=\nžc=ãX™+ºõþŸ…H‚"»‹thäñºNbi¡IÓX:mÌ_¯`Ù[ÿaVáBØ×¨U°µÀ¨1jjéxàyÄåãY&ôëV=6Ä$ÖªHHol †ãþ{‹lG§¸U¤_¸»Ž аô^Öº…MQ Å-1ì !Ž!”âýÆ:«ï`C&õ7åiŠõä:c××ë|<Óh:×.C ¸ÿÆÙvxòºQ§L™)Ã!ÁeÔTš¯×ž{®jõªã×þÝ®ø\ú ÝÑÇ!íd­vïûm(·J“tùžg±q>7TÿÀÉ/ÆZÔCúè0U»'ÛÜÈ¢é•f†&F„§³õLW5õš½ÚŽv÷ùëö©m¯ ÌíͰÒð_Úÿ¨gòâ”Må # °J—§Îí:œÑÖ«é`hmLÆ÷Ê’ñ[D€Eœ•"»ÔÍ͸^!ý÷ºí1š.)`aU[&߸ÊÈð’f§+ŽæàC”CE†P˦ïŒAÄ7 ÝÆK'-àYYÇuŒÁÚu©z›P%h?b¥·'ã–ã.Æ#ʨRH{@6 ·Î ã|°\öþEKd%2öf‚G`£:t*¾¨,6ÀÁV|X³S¼êÎ㾃‡Ã"›•Åv%TµãGÏÊuǤŠò­$åKûwHˆoaQ´÷ˆDPmå\ù’†AD¾ ØõäöÜš7Òy1&BPFˆ*RÁJæ{ÿôTÒOïð^eÏ Á–;¬œPø.hŽ÷,žGƒÏ®‡öÇ‘÷Ý¢ ðãYGô‘oäd6lœñ:Áv£D”g­®2èJ.Ÿ9×jÈö¢Ù›l÷”Tk¬l[ôF(Îþ`„×f±¡ïz-ºyWZ(`BY-r•EŠŠç~J/¸|,ÍV4!&a'Õc¸³:ÀSUb“ÏhxÛÆÀ&²¹i_ø(/—Pt×ÐÖ,¾¢,‰i#q ×¶÷`vËNˆQ•,0oÎ'»yç%®¨Ä¾žÏ2V9+J/¦m÷þt L[ò¶Ó˜ ºSÖÁ¡sW.›> €K¥|#¬ýŽii‰æ¬PÏ¡âÁ9ćB=âIùL'<[À8>j(zœÌAUðÍç?4¨t®žn'Ô¸½v¬Ás¼úÎ:„ñ®ç[Ãy)|áîírÿ•/ÒE—#ÍY¢[£s׿ñE¹STCùC·,¬bÔ´^apuÚ€±ì©ø²N´o  bniÐèu‚=,Q¶çŠŽÉä™^Ù®€Y¦$ËRCO á~0ô””üûnW•ÇhétXD½ö›A¨ ~µÕ•GK¼e¬£¤»lcI‰gB=„±HìÊ•Åaʦ6¼¹—»õÃøQ”aePÝs T*%åâ +%e7bE¨=å Ü)¥š¯“Æ~Iâ$+|wWPË–ä,š…d*½Ûq9ú#w`¨^‘T•,æz…~Á㟙TTo†ÓEö‹ ÆQ|–§ý{\Žúe>:Ò¢ GæB/½ýwoˆ \Y­›7­ÕâïWJì•â<÷eõ^Ø _±rQ˜ÄIøÃÙwˆéŒë8=pΔÉSÑ °‘ž ^©Ûƒ^RÝ$±•0Î^ïè¢\+ÛßU‚šj3#²$ËÍ;«³Žðbcvâ}@¼È øq%âÜÀ¯©ä‰ýràr]' `Œ)Ó˜/Šæ^oÑxI{_r4¡œ,µŠ L¬DÈk\ÿ¤Óó 4¸p!á.å6Aä$çÒlÀ‚ß PÄbü4½vgï¹¶èlçm;§AC{— ÜÚ `2M ± áYóðÕ›¤‹¡^àʆ•´ 3| ?£ÞýàÕwF=ƒ°Ç¢E”<íؿù®±lߦÄyš——©1Û«xZ½…-‰Ó<ÖwF*ê:,€D9`âFUe$Í?PÕtç”4­ú†Ï–¡ùçêu*’ ÔkÓûMô^PL«ÿÌ× a™!÷²Ë¯PÌQ(fìÇ9 Å´/s8‘²(>Y±EéRÐMÖcŠã~X¿ôt-•·ËXØyg6¨#§Vƒpë}=Ç$2xz¦9“¸…#î‡áMi“•¡€P¥d¥±ZË:†gx úz¡NÛós¹ž¯fL¨±å\Y~Û…Ú,{¹flP9³?VëÄJ«â¥ktÚ‡ôÒj–’ nTÔσ—šoÄ©вÀÑs¯ ¶”ì E=âaŸ6î¬5×qÙå÷‚T4¢_jàdKíðµà‘•¹x–v/L9È{ó‰öü…«Z\D4Åitÿ®¢2þÒAs™aÔsï³Fj *<Çã®%MK®žG»Mæ\=¶W^òö„%šÅ¼ýé€;4ÞË*½©Žc0©£zà|´%£"„\¸0l^ÙìM“wÂ][q…÷«.`-gó÷BYµŠ&Ç¥ôÔ- _Y-XDk7®4Ïe@MU‚–îÁ8wÜ Ó™98Îõ½d¡câ ¾ sçÞárçA”†HÌWàI7×t"]Ng)¢@¯ÕômI78,+yBU¾I­5È÷ !›·´hHÌ PÏDHÒsÙºl•KQf–gÕAðæ¤ çvˆx©$œÈn¶¾WUÞ{A"Ú:Ð…¢Ð×ÁÄD™7`Akxåê‰yÔcA>žÒ¨ñ^ó®2^°«ìågg¥IYÆ8c•½uÖë o‹*fs×umºžj_šñÿ€þ êÖ¬¶ÿÜ’-âEàa“Š´ йVŠXBèD:˜géÑ»ðBGŠ$^Æœ•&ý‚(¬'\PˆrÒѻԙ 7.V–˜Çb’@˜vbx xmõ@~æ¸TÊAÄOᥞ5ÂÍ+«¶Ï1³…Æ—¸‡ ÀŽyix­ÌÇDÁ]7O§ º‹ :…ug+­€DÓ`™è¯U'R}þ*>ßæï®Bö‡§D‰Q. KKrh;C'Ê÷LsÉ õ†Šðk·9uBØcGPÚ¶zãF ¼à«­‰7)-:&µÁ¤¥º"ÁØœó]ê«ìAAì_á2 Þ|…B¥Yê+]!¶Ú=f¥büœ4ž®r'ß~ö‡S%”ûï?¯‘¡i†=íšxò»ª!…eñ>ˆ.Ÿ=¸Ÿ°ßu ÔÄæ®wA¯ŸP­(DHô*àRA{æÿR"“E‹‹…ÛO€Çs ÷ßqybˆ%¸3¯òÜ”ÿ*»´y‘ýÞ¡×°XïèzžTñ!îõ¿Pf $¥¡ z•r¸\ ãk‘«oý–ýEÇ~ß g( g)ÌDp¿¬ö6^Å“ÐÓz¸pü¹- >Çå¡Àqzm ör[‰ˆ¥µVÿP]שôÎ"áÈùÎN2Û»OÌþìœZ3x?äGR+.a#–tsæew9fr•æsj@-¯³^««ÀP,ÑPô\•|Éí1BÕ—²Yk´ï»wdîùúÓ»ÄöõDKÊÑwþ*FôK¤i _ á¾áW¬– ­27Û`°é ãê_Éo™ùsœ¸Ô_, ‹)À¼”ÂÒë¥@h— AxSŠKETµn´(ù¢'\}îÎa0~å¦KLŒÎµJ‘s‡²§xô)CÐê·µ4n8cHFøÙýP| /}½›6h ÎÓ$M\e ¶)åÊÞFѸ?|1¥¤ÇSLÐÏÒfèYÛÿô³çò, ƒ)%úN v/2M.ÑÖ«Sd•ãÌ nÆ[].¹m\~y\áߊ<=ù')Iq͵ 9KKÑ|ŒÈ»y’oK¤'s‚ÑE@…LÎ_dnl"¤diÙ"¥VÓ¤óï(ê)׋—ça‘L£¥±å=©P®‡æ›5èiJqJ4Ô‰£êÕr<¡ O2U1eœD<›VP^ò÷ ø+êÈ3ï xK HZJÙÁErÁÃ@9“ ]JñÚ Z@$ ÃrNýZ L¸2ʻȸ+ Ä—‚ˆbpÍ”¿…bë4vRò "¹2¸|æQy_!ø[}–§-Ç©óÏå8Ãr„ d0úÇÏr¤Ì›q:í…–¼*QTs—–᫦ÚD8é’á×Ë@TZþg)€fµÕm¹”# Vs6Èky|¢`RY-s€ä €Ðáº/^“#Ä *ùðµMðä=þ2„X©ˆxVc^(5âËV.÷“ŒZþˆ9N¯”éÜ@i»R!ç?±@Ž™3ã4Wg6]'+=vXo`…)Õ¤ ŠÑ†ÔÛ 9Ÿxxæú3oÁ¶Rj`³æ+{A…ãŒô5QåUŠU^«¶ÊãíL©â”¦ÓC¿îŽ«\sÑôçàîØáƒº½qã?V_¾4@u÷\äÌL&+õ˜…xuÁó·,¤pš<˼ß0_ðå^25D‹H“¬hÌgÒ>£ãGERû°}År!êSs«TP€¼Õô8¥ÂTawÖú€‚j=ª]sô⎮9ûÉ^•ÕëïÁÁjèŶ¡zÊeêÁDäc0> aÙµV Èßx[…O´"„ˆ5[Õ–$,ë Ê ðÒPÍÐ’” ¼ÃÛæ°ºá£Þâ–≻Èa¨‡£kÿ‚˜Tì®ÕS*J…í·C‚qš7þjiŽšªfE_t`4+0FäÀ Sjl‘‘¥}ß{oš„Á†–rÒH8­+ý!XŒÃ7C ˜Ÿ54Ž-qÉðSGÄðÌ”jð0Yþ€ì2·Îñ'6emoˆuƒûæue@ÝhÿmzS©wŠcQ˜Õºñ묜¸“`• ?jO\®\…Z?’öÑá!È¢ öÁ#ßÓ³6ÁϲÚì0Áz`‚¸B,Ï%´¸<¹´?ZB ×íìißÌ‹¡®_ :e‰©óI@E«L”…^>q":™Ù;:Ú[r7¯¥ ½©EÁ؈iˆÅÉ%V!6Ϥžß¯Ë¹µú[ ËeÞåvKs5ÝRzêŠ@ío¨s„3^â¾¢ 2 A—â„ uýv.Î¥EÅÖ öË}Ä<*4Åâ£@*³ZS÷~Ãt VE†·‰E†";ÌÆÍ(³º5ñ—S èµ¸ =¸;¸Ú]ò☸àóz‰d1¥{µ#ä—›°l2j£=ñ ­g9°â¶ç#2ni |/÷ÑÓPF åéZº 0È”þ–nG1=îXó¸‡Òí¥Á-ОƼ JÇMdi‡Áøÿ'yï…Ö³{™:,Ð.ו'·øg¥u ý§T +­ ÏñÕu{Ì#¹ªùÄ?l4)ñ稫ɗV—Óù½´n}+éGçܪA/¦úi4Xùj°l:9´ÍY­zòÏ⧉ӡ-¢¨`é™uë;-1 Fo„ùz!ÈŠI ÇÄ2S/”¬(Ê s/ã¦Á^7¯öO²ÕÍ&¿yù…ÞgU@EïÌjùq–8Ã#³uv]7Ô©ÎÒt’÷6Ð\ŽtHÉÞ^Ï^‡ í^ë¯tüÞ‚o¬2.ÑÁ¤» ç•\ƲƒÕå¥nô²_”Uæ^I›½¿ÎÞgHïúq ±¯º³^Ï rFÃò­7öÎÙ!_¢Žk6püHW}H½¸búx+ÒÄXîÇŽñw²Èªûæa%ÏàÒÖ’è?7bKä,ØjJ>aÄKéþx·“ñ¥ì2!"V£ôãMAöìjá^Ó<Éw#gžä:cÏYÈ_ˆÛέr6#®1mxŸg¾Ã5¸ˆJÇÖq˜xyï#?7vñ…oðÚ'9?Pl£òÔÚs_1©HœV@#S†‰F`RêG¨9PÑ ;Ǥ×÷0 õÃŒ)ÿ=c‘òcv¤‘Ä.)íÈmþè6wMãxãH8; ]G îëññ¬é[G„û 2P"Ãò3hÖü&eBL,ɇ‘Ë¥&ieîö×þ?΀A* O¬=µž¬¸át_Ú¡P(à\orø2 ‡dw­!‰*¥’3XYµmÖé*Þirƒy•CÞ{òhð@ áè¢(˘³PÒnÏ7ºdo€ÏØùŠXE¿Q‚s6êòöÏͱ÷„Å3ßÍ¿@5mŸ¼`j ¡§/³v )[ªÖïºÏòê~e`U“>&à!¸–ÃÎÎT¸áÕ“àËùCI“MÕeÍ@á¤?Êž0ßüö•ãg¥œœ±k©<5&Ê€x¡ÆDËN9d5\*ð;;w÷N"kÄi [â'b:šçÑQG&)O­hHTÞ˪6ä€ç]ÄË^PÀE³ÚWÖŒÎ_åßÉ ¶#<Å ž•ì?O‰2øõ:™H”&ÏNW€Íٓؕ±Ó·‚¾8·@ü™·V8®çìzű<Δ„–;t«€¶•Bö/¥°Ñ‰c„M{ ·ÛŒßÒÉò™Òë8”áè0$Âßç ›Õ³køŒÁ|uÌ”çåOüÀ³oöÂÜbÒÀ絸1a÷òÎðÉ$Ìp¨F_ƒ7k<ÀoõtüùõßI¿7þùÃàÐØ½G+áhŸÔ3¤;wù§Ðäáÿ[Wà©!¥pkþ–îË’aN V3hñ DÃô",NlkFž`z –h¸ÀKblŠãà&¤èüÉИ™¿žþd Ûâ½îòxeþŸ1c~ÆZˆ#pAìí¬‡rGüw¶Óµ<‡x±8`Ç)Feƒ+2ÏræÚ7Oã“0ã 4ýÿ£ú(¯Íɵ­Íaª2ë³æÔ*Ìês=³IC;a|Ö=ŠH’Ÿ^c°L˜nÓÏä´$c9—m;[гÿªŒz£ *Jh³äͶ ÀS)›Í<<¨È$Ý0 ƒ–×V+åæK£ýÌød§‡cᓵÎöd »7 ´ d³ÿ©– \Í59{ vçÄ©»Õ e„ø qyÄI“sž($n û}Ž€¹ž|í#*1Ž0PÓM¢žs÷êNTÖy¯íß‹Áßïk|û[•â»ó[ [ª›ùG£ÒTšK£R‚s;]¶ðKœŸàÈþ±…¡ú¼çéV%}?kðGöŽ*dó´:M :ÿ&öÿ·:s!Œ†QUóÒÊÜoJ”ª°CUÇ™šÒ΄¬àÄYmqkw8ÏV}ÖGìWåÉÑöŽ:Îd,ÄŠ†ñR@`n}5Ü=Hé½;L›¶ 8õK׿èó]³bö…õwÖÖ/ùÖX‘~Q¿·ÆÉn<¤ÞiÈ=cê÷zW°á<3†Þê6ÿÚdײ裸¼Ý®ü¹pª:ƒµ}@Ý0ÌùÆ•°Ê‰¸.›Ç6dƒw`…Å[?ÁS䟛ÉÉøÂ¶PY¹þ|A§ „jØR ÂT¿(IÇÅŒE×wýdø4¶q÷:4Ú!’¼lºDUÕfTÉ—–Z¿òW8¸*½Ž¶Å?œð†@Ž6]ê¾ôÌ‘Y—üP…}q?[ÅN=Ü8‰“Ï­·K„/׫ò̱ZÞ9Æ””_{­~õ±×ê÷pXapv½òªËaÐ÷JýôÕ›+h4úø‡6°ÃdÛÙ%ÝRl%¡øÁ ÒåX×4~¾VmÖ­ª•´—uÃÚñd`ZjϬÛ2Ô÷¶žî)¥Ò7pAâÙfnßr=d9èQ× “ò³Au|RÏô@-=Ò&n³§~}>*`yªíè¡&TõÜéF-ë7ÂLQKóŽŽü;}ηì™>c<ÓgÌÐÑ/îIpÚ>öjS"¼­AA¥¶O(—ë.%ìPƒ¢Þju%b³Ô? £¬l)³y| ó݉¼êS/MMÀj’Sh/‰wOÛðd Zðƒþ±]°OÚ­L9¯ Sêðå$þ,h{ø¼jEWcÌáŒàY¯¦JJ÷,ß@ýŸIp0µèE µ?tÿðàþæ)Õû›§(?Á¯S_ ‘åwBéiÓ’ܘ̣Ï4“{Ÿ‡qàäÔe'N©›3çÞ”`G[èë5åÃåTS\±)F1ù+É« ª0Ï‹ÜÕ$ßeÂï•ÄB²5æ¨{{Hèµ&yR|+¨wj ¨ž ¢uèÝÜkäò”K7ׇW`M1òÒeÇ[-½¦à¤­J…c_‰`ïþç;–ú¼cÁÄ(q® !¼Æw,lÃDG1ËšÊ/’ƒ,[eRÞš×Qš™4ågzåg⪩%ô T: Î|’“÷ž˜ÈxŽPS˜Â[%›A/倶ï­–žÑªh[œMÞÑÒà©¥Uÿ14íÛw¿ÂƒøïÌaCC¹åšÚˆO›ï°ù×2Þr4ì®×oÄälaYüeî<õ°9v,ݧLÿ™2Çã”iìUØwÞ#F¹Gáò? ±@ò="ùðìY—ÿ¯l=ÉõèÿÀsFìÿ¹ì´­HÅqíÈý5f3|ʉÇÌ8qæÏĘóÿLV½ðWßBÕ)Þ¿ž‡žÎ8ub勲™²Öò±º‘º~=ê{ ê_ÿî-HŠ«%ƒ–5îŸàß©‡r'ñÆü¡‡‰‚é{€ô·»#Râ× êWÍÏÉ"î ½¿ö•œJÁÎjËÓ7ö~ZûÃúËɰàÝQË;2i>#“¿wd FrÚcN†üë“çt8äÙ5çò×0l³tlÂì{@·~ 쀜oWÝ•€T3Ä_ÞÞ]ŽäøIOü¼<ëÊ)Ðo è,`ºRêþÚÀ³ìñ[¦æ­àëªan—ñî ±ìåk&ˆ{]Íåµ°Íþìàöå`Çyì‰nÖ\ndƒ‘‡×\~°5x-0ëœÿo•ªïḦÖóáÔ™¼À'ÿôØIÍ0]³qÌ|ÿy>pÛ§»/ˆ©ñ¿«µŽgNÖésÒ|‡§â çHcBjég¡¼Ë5k°ææ¡žšaÁæí€Ð/Ú~ÚA °NbqÎ[ýJÿJQ7Œ|7,qMšÄö‘ùÖü0kæÉ®S3$Ý™xP4Ë}. ÿµ¿ñQ:[7(÷mÇuósRÁòXfOÍ#Ìâ‘Þs è·¿ì“CpÎÏ#ü¡ýÜÆW<=Û<;ÏÏìèÀüÞÎÌ“r ›×™ˆ+9v<p†ÈK<Ô<럓fuœÌ(Csm°0Nó¼ì–5Ç~ lUù©So3_ø. ðZ£,xdå³ .îÂò .ú²˜¯oª'<þç:Ö €8ÏêçÀu”¢«Vm8 ¢ý~C,FÙ •×ô°<‡£Ž.‰ç¸&%˜@ M¤<¯CÁLΓçUPÙ›ôPPÈ¿(·Á¡-[ =tß é°ìéºýà5.Í:”ãÛhüY‰r¾«À¸Z;CÚßgÀSÁÊSÅ2H¦$’þ:À µšS‰B¼ê|q£ÑŽñÇ÷ý»±åƒ…-;ŸóÍ}“SiÐnPÎ2O•;Y¤ Äž¼!“*ð 9X+½…‡Z£”Ù\¢ø`WËþ¿Á-9ñC„.#)V$ pwÛTÜ L~×ê•0õ/<µšSpýÿhx$ìQ¶• =à®@U'ôˆuªÐézæ±Ô3¦˜Ã›QçÌß½“œ¹+Á¼•vTŒÄiÎKöÎŒ.¶“’ MPZ;2‡>îÙ˜÷“qhüûX„Ñß÷golly-3.3-src/Patterns/Self-Rep/JvN/sphinx.mc.gz0000644000175000017500000014763313151213347016414 00000000000000‹ªåHsphinx.mcuý[ËuK“%†Ý¿¿â_Ø«™yˆ<à; XÛ`ã‹rõ§îBÕõ‰êj‰þ÷Î1"3"#Ÿ-ö~óYkÍSÎ<ÄyDüþïùÿûóøÿçþ¯?éßÉÿñÏÿî¿]ÿÿüüü·ÿŸÿë¿þÓøÿö“¿¯ÿü¿þéŸÿùŸþá?ýüÿîçÿò_þñúç¿ýW;óÿñ/ÿô¿üí_ÿó?üóÏ?þý_þó¿ýëùÇûû¿þüÓ¿üüwÿÿòó¿üý_~þû¿ý—ÿôÿò/ÿûÿü“çóŸÿíþío?ÿð_þíïÿéþíþOzÿßý‹'ü»ŸŸÿÛ¿üã?ÿ—ÿ·ÿüóoÿð?ÿíçïÿãÏ?ýÛþÛ?ÿÿçŸÿuýó¯ûŸÿùŸþqÝNoòÿòïÖÝÿõß~þí?þíü—û?ýü¯ÿñŸþñ?ê%ëÈ¿üüã¿þ}øùÿº®ùÇÿøOÿüï¯;üýçïÿ²ýý§ýÏÿöóïÿöŸøRëüÿó¿þý_ÿ§ú—ÿðƒ.ü7çáú®çÅô>ÿÝÿó¿·7\·úÿýïÿ '­¡@Ïþùoÿãêâß×mþÆïÿéVþåoûÝþöøùïþ—ÿ>Ï?ég®ÿÒ÷óýÉ?ÿKëÇÄø•ŸyFÒSÊúWÿ Å7ÙwðôŸ¾~Ó[M~JYÿç©Y~öm3>¯ÿçºP®“ô ©ûHù?‰ü©¼ûIm? ç§ó9á³v'­Ó'»‹ÿòg}ã£öuzéþ¸œ×ßÕ“ò“+ŽùÿxÇÚú߯Òí¼©w×/: éÛ¯ËaÌ󧬡<N>Fù§^ßÊ>öéýÖk°öEÃRdŸV~Êú»~h?¥ãÄw9ãùùêgwX×ÌŸº>ʺlgN?yü”ñS³v÷üϬ• ß¶ ›3À?|"~ZŸÊOí¸eå,åsÝOÒÏ î"Î’¤sYÛOh³Ì·ØïR´»—Ž[÷ÅÄ[+±ï¥—ö ¯X]"¼ƒ`™¶O_Ï^O?-­ÇËú_жüg iÿ©«ƒå§•3¹“›9‡ÏÌpÙ±ÅbnKs¬s×õ­ý´‰÷IåZ¶YÖ›¤ë÷dŠØï8uîôÕåüÎͳ¯ä–±u¦w6ÙÔûö5>ã§ÏŸñ­ŽõõÚ±ö30Mðÿ~†m Yü7êÛ¶ìýÏh¾?²o¼1pÚµsΫ­ëçî›>çÏY⫯¾öÞØ¤àÓÏõù™õgÊ>Æóõº½í²Ï†ÁNDfÿ™ãgbP0cMÚϵÄ>íúÄÐã<õ;gj'?}–Þ~žùJß»Õ6{ÖÔó>E{‘i S×AúÖ^ùÖW¾$Wç‡kÓ,ƘÖ$ÔŸ»cP°«±, wÛ{W®N˜Óý ¿cí÷µöu _T#:¢¿S÷aâ—uÓŒ®p÷i®®$Fÿ·6ÌÀpWþ4%Íø¡õ™Î^Œfâsß”ŸÇ¡(k…øY©ðß9¶ê Gò¾CY+åì{¬W*ÕhuÜhÚ;’Hh°!Ö 6e\û³üÑE·–ÍšµÍÒ>]M÷Âÿ.¾i\¢‚P¯ñ©Õ–Æ^“‡Qåk7ó2th‘ÂBZæ`íüJ½oªìù'{Ù4,íßÖÁÊl\d d[ù$·ªð’êê9‹o“åú}$Ø"½Ó’¸:‹ñ›”¯š‘õ¬ÈÅiÚÀY7gKfêš[dl8*ˆ%·5¸òØ¡KJO‚ÅñÛÆé0hn+u³IÖó1>xðrú¢SMdRajúØÕ1<·]oPþ®_h)¯«;‹˜ƒ‚¯—Æ-Ž\ŸUam!é"Ñ#Ã.4üÉJú â7Ðg'yJ°úGŠI1$gva½Ñ"úu]_3Y¥n®³…ªAÁQ߆ºJkîœÌ>ŽÒ¢3¡ö«ÀÞŽ uֵR+Dw<¢œÉtUš€®§E7ê"Ñuu©qRÀº›¨ë+ ÌǸT3NS¢ÊÞw2þ<–°–/óS…­ºº± ^2s¸ìËY¯¨…WÑËÛá´ .ê^ÁŽÉðÒ•fŽè ¥JrõÉu¯"c‘ª‹;ÔEâëZûµ;ËTnK[>ôxuAÇaw©º ¹-ÌdÝE¼ˆ|ø‡Kê6š‘Ò­‡çÔ¶þu¾Œîy5íàbYÿÆú‹Š‰‡K&­›¬Wu`)‚…‚,Ö;„ƒqo•³Ôf”`æ¡«3ôUáo?QF%i’¦»ÉZþ-&°8ƒ˜»ñ^`‡xK¦ÛjI±gÐATÔ„U”ÇsdÑKYÝ“õŒï¼ñfúk÷¬·ÌÃæÞ/š?Rô:ƒáÌ¥½è ޾†a^¿UÓquqq˜ÆñfdÊTž3ñWââ¹ÛcI PÊ$ÝÊž-.!ýXT“]º½3[n[‡hïá/`ãGêús™–yäM9Fe3Êd‡÷¯ÇUø÷àÝ[¬jLôJf“pÍìrõ-“atdn ìrè÷éï)Â…nÛñ¼Î%– "8Gü2TÂA²ŽÜzIziA8·ˆ™ûön­‹šÕ1Ó¸ |Ÿ\ª‹6Ë¢õ²Äy¡)]*ÆsÍØâ¢4\eµ#q¡vz¥ï½ cí–è°Á`]]O‘ø†Oß~Ó‡æ!¦*äµ|¢Ï¢xÒÛ5ó êÖ 1zë®ÒI¹ò¿M¿Ò&’ÒqΚ¬E­e\~€-ˆQÄÈpsS¾·?z´ú³h®Œfã›Üþr\•ëÔEq*Õ¶­P$ÕH„²‰¬¡’wÜêÔLF|ÓŽR¸¾Ï³kÂÈ:õZç— ¨G1 æž&[”çÝQn‹Ž·Ô® «½MNTL+ 4áx4ðÜu«EÂ[Nû¥Ë›ãà„†>®×[¾-úÞ²©“jÛ{¢åv‘47FØR=š6[˸á–.µiëX?Ûl7ÍàÕÖFm‹÷7ª"Ðð|…:[[¼ -Ñ=nêM[Ol OZ£TšQ²3òP±ð®eøÒÏ7­Üû$¼U5#µšTôÁ¤ 7Uc1D9¨Ú„ºÐh‹ú´Eö[­‡ ¥¨èšN"«¨øç΋÷úo‹œ5xal-Þñwqé·mµá6Á¿Õ¸F¿áóâÄÕÈ|ƒAêä¾m‰úm‘æ&« /ìwDZv½‘î¾ÍºœNÑs8éLò…¼S˜ÍEð׈¶VuRû‘ÕÚZ*­á„õØÖØ/ Ä€¤ÿçx¼¿ãl”óyˆuÖj­¬­áî«?‹˜·ÎðlXA×òèpú Žè~QM÷–SóM7QnX‹·ï”.ñnl#õKÇòL?Ãù¼m­Oý7gãÏêáJý|¨Ô¦ûú¦ëFmÈf½I}’쫺`ÎKlï·Æc@”{Ä‹{iõôõo½xêôáñ.mn³®)°`¬‹&©Æ"ÃkœO0Ûz‡F×hJædl¢6Ò¤Üéó~§FÚYÎü©Rè—-t5P›5Ê^ño›ué†ÇWç<µC®_ Yá6­ô6ýÿ¥â!ÞåS/Y €x"m*²½\ Á:Á笕'­áÔÅÛadþÐEÄdì@°?õ‚V›¯ÈsäƒtèžI. ï³'êu*Æuî§<°’zÂ?\ ÷f¢Ã© ËRB8ˆº±é­æ<Ê4_zájÆHÑæ?9èŒÇÀåEGŠ>2Χÿxpwß;„r_i(ž¦ö±ääê5™¾¶|j[ÂCV?[è¤,·MÛ%†ó滳ë¼u]Q§N€…}¬1°°¥KÄ„î€aƒ/´ø }ŽcX0aW/ª®ôo›ö÷ëØv¹DnP,0ñ¨keÏZ¯¾Šè4üÅ/°õŒ§à×õôEõafZËóžñËø Ür 讚ºÝ•E§½­t¹b v"f*o÷?÷Œ|R?¦7=ºóûb} Ûþ»wxím"3A n hKx ò3\ì³U‡+Û§àp¥®±„Ó´ỸÎ$øEVY†­% Uð*š“1,Yêp©®åtî²Ú ˆ 玩ꂮàh=[ ïôA…àZñ»‡ü¨BíÑÞÓ#äóåm]oNå|°ÿ°ÀËñv|fá?–‚¬NiLèʈ€Ä5 ¼qóƒÊt·ã™±­Caißml3ß’Xà¹Nþ­ŒÎ¯ …èܸ™û:Íf.ÌvŸ˜FD\xt“kï˜ùŽˆC®˜ns¡–›`ëBbRK ú¶6u_¯Úᬛ' &\½¨LábõÆ•ñï*fáºßšý>ákOë)›Zk~Ôó#¬; …òdÍ–8ìezÔç«òžËyÝq|øwœ+[f»OþŽöÍZžCCÀ׎|¯±^·Áï²~©.ïÉ^?jPHî'ºm‚k,Ò`ˆ "cë‘Î:ûhÑÛ½×ñY© ÀÝ×h­U>²kþ‡Ýcn”Ü^|î›Öq9óË ùàXWâÙÃúŒ­3UF5QxÐÂ3 ©•#î0DåãØ)»¶$}„ áüÎÀ.j“<Ôh=½à<üE\'¥ .®ƒuÈûm«=¯Xc“õ(A?· n£¬{,61ªXØšq÷õ Fº"z³ƒ½,Ò>ëµþñØ:b;åÔñmQuÀ~¿ÆxÔN*äg«µ‚š+Ô-ú›áŒñêõˆÈëê!!ZÜÑbrB @iªý1è\E™Û- aÝz1ˆ±4 ìùê%¨RW·e%0WEoÛ‚ºÀÔT:Z:ç×AëÛ9ÏXÝ_”l,=vÃÀ$ z¾þ¶ªq*H´·…‹»¶1*h8.ÈQÚç™ÛÑ`’ ágôË©&Ð5v=߷ɾ*`¥Mš—²Ckÿ Dæ,Ú88+ŒÌ'éÛ:uÙq’*LБ4ժ͸œAoëúƒAf0d"Hz õP¥:Ó¨üYè`vØÐ’NÌÈòg¤ÿT‹°¿Ð\ ÒUMmÀŠ“!0ù4°aèÌ@Â"^ŒcPÓ¸6­[»2(ÿé‹q3/=f¾®€ñ^ɹQÜtÔahÓ›kŒÙìF«ó*Ìø¿ Ú}\sVHÏH‘¦rÊ#jM^w›kfÌ`‹+ÌoÛŠ¿v:YgÕÀŽÁHKÞb-~š‡&ÝvènûŒó(ßZëãÇã¾çâóS>óuª°±>±gœ>?ÇjBø.‚ïÆ×Ç5b°L¬30¾c¶‹ïhçæª$uÊ‘“î\¬Ë¹6 œ]ø,Ö‰£a«çM÷;ƒmÖYƒñb8¿›Š<‹êæX+Ä’ü9& Ø~õ|ž·ØÃ\À$‹˜}"¹þÖ+\œñÈ *5©º)F†z O\sE³ çq+6Pváno“$Lmû MðÜõ¼Å$&•¾ ‚3 #ƒŽ#`Ë+Âjšå§Ô-MrQ5†fÂr3Š~;ÿÖÞZ¿Ìs¿Ë}¹ˆå5ÁW†ÐÑùbýê1¨ÝlõÜ«ï¶m”xXÃYk,àù¥õŠ î½šï5?ï7S ^SÜŒùÓ•V’pÙ¼#Sp÷õ:‹iLô‹¤ g©àúõ²'Þ>_ø-FSÁ7wœ —{áôVÐIÒ9¨ÇöúVp|ÿÅãA­:Ά•Á=½ÝÿpÎ" ׿Ã~MXâ#æ(ú ™ eˇ2dƒUÙãÎ8ôÖ]×I£ßÍÎ9Æyàbsàz¸ €NúþÀ¾¿>¡k¿Ì¹ÑI7)Ô­4ˆã’k_×s‡ËðoÝîn]è#d=Ó z(çu]³¸}Ƈ»$î~îi`aˆ¡".€·;A¸¶x'Å]ç`"A›÷®¾T¦cñöøÔu&~]¡}„ýYÝBqܵ&³Ñ„û)EIߺctôUPíŒ=¡|D½böá;‘X©jϦrûÙv|£Û]›×7w–¾.Tïƒû¥aƒE¾î—PÁÚÓ´N¤¦Lyè˜ ’ÅÜöbJ~vó7Þº† N‡"Q¦=oË8›ãÜßHQ‡^M  Î_ƪ\]ƈ‚“}ÔË­O{m¯ŸýÃ^Ýë£8×(—ðK?H¼dȶÃúˆÙ@‡4äï;·.‚•øg‡O!^Rƒó &®‰„EåºuºÈ0ø• ·"ì XìÇO–k3É öûEpªÔÚìÓЧOöâ?C2¿¿~X±GÙ­4ænߊ¾1¢ñ¢“–a®wÇïŒÌ›5 JÆ¢JöÊ7pßÁ±¬ ú‘Œ·î3O˜¹ù ·;9™†[$Pk…êš•4¿%YƒÖ#hÈ\ÿ¨J8NJÇ=<É¥ëõ hæAÏ$Uü®'&{¢«Ó (Ã-Ÿ[;L’Ý!\×M£ëI‹+û¨¶h†d³û­…•6BŒ{àXÝÕ¾×Í“–4¶ˆxšƒåI„'ÆvÞ^ã5%‡3ûnkŒâyô¢jþ¸.M6›O”P¥Ž`“Æûm2À‰Øá”iUÆ‹d]££€XÞôéà9!RÄ[k7ö IÈ‘À©X˜§Õ†uÿ’é'¸Æy“ÆTtdñ‰ÍµøŽ¥`ýÔ+Î.µ×z a~F‚·~<¬‰ U{‰ìMUc5 ï« \"/§pŸ¸%—° …Mù à„én()î“ &¶0bü /ÃÓðI>R|Ð ÂÀ‰¢Þˆb‹’ «D=z{[içÎoŠ™vøT"¶8‰8U„UƒòT%KB䆻‡ðÚJx÷Õx •IHâ” 0¾¹Uå—Š€°1uÐqÊ‹:fÞÊ |™ßöd&‰@_\ û3hÃÚÚ²*`j1ºT-Þ T ~“3pÎf¹zw !^5qµ7nÂv˜ƒ‚ôªß”¿üÌ¿ ÄI{Aá—¤ì×#GÿTË^'p×ê‚Ç¥ð]]÷|çgv=ê#D•äMúuL¶:BQQišD"H9¡Ë¥;WJ—?ñx}á=eø-ïÜŒ¯êLèoJ:ǃÆ:Ãl¤ùxZ² ömƒ;0~i+Kt «éÏOu›í TÓ¶ÏÀƒôü„Ìã:ýhöS/ ÖÁÛ{–éKÃÝ…§ãmÁ"`Î ½3I5!ßwoªo/QÚÏ¿¼#Oiï*J½”_ªõG—¸àº–·é9òœ2-t` ™&7ô‚%‰ªNÉ8;¨h#B¬ÀËa‚º“9—Ÿ®`Š'`lDMç”ÎêÊîp?V†_Ã1¿œÇ'½Ã©¼ŒÞ:Ǿ ƒ[¦|>~tÁfÐåÌ)DJçC]jä¸ Ûå+ûjí}© ŒëÈùó¶«(•á6ËîL;&2 ?-dë ö/³AÿsËg´êdC~^nËíR˜uØiףůdFj$ÊŽ§KÔ+†µÁ^éžmž ab÷윪·FçøÎ Ô™ ºD‡·ÆäóšB¡?Q¾œ}ô¥~Lë± :0äN9Áô;‹Ï8ÛŸ'Wåæ0k=³4Q&àBÊzÚÿ6 Þ%r…ï¨ tüóÔ Õ¾’·u'e:Ü ‹dY,OH¦á“,k›Í*¤»éSÞ¡¶ˆŸ’fJy€MSUÍrü­ÒC¾@{ûœö8õ±]ih®àɽõ0Ñ[ ,;8ÂáqéâCëÙŒçgv=Šë ³®bðÜ~«í`†47 š·&P¥Zï5³ß ã×müúN¿S¸v/×G^fñ*Ûÿé4@ò~4Z¨…]ëíû@;š¬†da÷Ÿ$¯TǯM—EŸg` ù"X‡NÜiœ©¡ykÀ‰ÆN™Ti¨ÝöPø:Óà{6žÊïªËC§r-9ž EHÁÙ°çßóyž1;wh Ž@ZVñ>Ÿ£åǰ'¦2ŽMÖ |…ýÞ†cü™·o)e’næÚàîœ&8’"‹œI‘IQÎ@Z§ò‡xå§ALvþ·c¦™fÃ?Ç=!›€t\ BÁhÖûÈà3M‘ û(+Ž?Üaœ,Ž1ͽÏ4÷ÏôO#é8A@X§’®T@jöÐÕÍlXÏ“û¥$’´½íˉs>[s^'ΟãÈJ„w° `ÿRQ…)÷ÍšÕ°zGˆÏ 9`Ë8ŸRSÉþ™Ÿ|Jæ–§˜MßÜN?ú/ÏI"¾z7ìšI ´3Ìü{nukG3%-SO¨(cÓjr%ô°TæÜÉì=OFçI‘àcéúüªï¶“±»²:Q[Ðx2ØÞì”{Hª6»_›Îî·°_°ÏÕ ›mIì×›*/t Y ØÕ¤äáNTXÏu¦iÙ:×ñ©8[ì^x°•Âôë½à‹ƒb\øú›Tè[L…¦DÁʃ›kSÔcîÈçùò€¤œpÇP–Óì`¸€ß«û2t‘ <Ñ9J¡_#>ÙŒØð8!doìØ•m€F¢>*Li¼”_ë!%Ç;}é”ÈÂM·¾ôMwy“þãb¡¥'8_¨Tâ4$dÛ®“¬oKž½{ƒAdÜów1™1"ßv´'ÉM :#¥v@¸«ÚR+Ýb£n×’Ú‹7ŸÕI眔ÎϜð£2BjÇý¸Á{í§^kkÏ }maH¨v°_ƒ¯à†©ÔìQH$³–aʇåå:Ôg¤©<’KT8äã2 xmŠû>©”!\bëwˆ1@ˆƒ¾?´¤Âá'3ª“]5Òf¨‡ÃÝ"$y®héèMöŸ¸ÀI- çªk* -¨˜! Ð…mWÚÄ ¾~l`Oø §’+ãÁL*;è’›Ùuä³iŠ Ç‘]ô¼rŸ};°t#kʉ+‡²¹Í Ì!ÙN5Þ°qD?% ËWS¶†@ñ}÷áÏqpPôâ£nt€Ð0–¹þ’F}o龂/UĺU0§šÔ¾ ÍCߎ’'ôX©äÜzǃþñ@™­zòÎ þ½¯ zÏâJïyâ'¼‰ý¡Å(餩ô(n©R_ÜzqÌöV¨õaj7>á5òQ¯$‰®:ÖðXÚUûQ÷oÒ(¶„•§CÍX¶“NCmæ-Mn•þ¨ïz¡œ÷,ŒŽ÷d¨çy4à?I€êÖèÎû“W×Ç×Ç0^ÆOx³ªêÜF—¤+*y“¹›Jß™x’)·ôhšâÎ%ú)I^ ÷bªùÂæ¼DÇk7¦¶·³ÓŸêŸä^; ö‡!|áí÷Ò ×í„ÚÆ‡œI\ÔL2?©mÉbOñ;!êF™Ì’¡_¾’„Y‰9tÄ UJÇ|!!pœ‰Êh><ÒÏNå£Ë=ÓŸ¯9ˆ•.[ïoÛšŽhÒZÜ™Iºª®ã¯N9ˆ>´¬Bé`(|Û–Ò^=‚ø¢½.ôîèm%š‹Ê˜ìL­;pžj°&Èâ’iªBªÒÿœ´…Í#@ЫÀ'j^^ƒñS´Ð§p&3,k)‰âåúøsTÍ»¿‰‰R÷XwCS0•¡ö†M©¢ö@¢ý©E³Í3þ~ðsâÒ­ILšºñJvú»¤N=G†n®Ñ5˜Ž('E®ƒD°…€ñÊÁT#'ÁÚ/÷¼QL–~e’™wüòPpwcÒÈ´3Zqý #¨¶_pF óWCE-G_V±l7p¦Æ¤°"®|„¯&)olÊÐz!÷Ÿ×`ýJ$ 4 ‚çTðÑ}¦®ù¤·â6­õ@1E'ºé¶¦¾e.(zù:‹)\>¨Æˆ´|‚–@ƉÀ|U1¢yøn'Ùh´[ü츟âÉ´ŽƒYéÞdI!;Ÿî µx¾7;©ã;ï!'“ Üþõ‰¨úÝ#®®y…E6,üV™zvýÕafŠÍ«ñ‰@§µpï ÛªÚÍ뎽½ä©“Qqf“T,e:ÕVx”¯_ùö]•ŸKìíÖ8ÃuáËÂp%Ü`gÖ[ŒÃìðÔq›Môi·]RÓ¬íÛ¾'pÛ0qtŽÿl§åÅäì§ÇÂ\ñêLÏ{ûÒº»Än2mnl+òi»\ ].è óÆkXÞZSÈ3ÇCc¢ùÆ“p¯¦‘¤—WÿUƒ… ÜGç# à5p¯Æ´üÙ³£1¥°(NFK¶ Å3Dþ;0Új†ª£E#HËA'¤SHÈ¥¤`5cÓ}vÈ#„•gÝ8¡Zö$Ò¨IÐŸ×Æ“0„ zðk ÂåÿñߤåvV¢a4°-BÖ/˜ˆ$ «A×á.kŒ‚_¯ÁWÃÊ…;­Mõ“kÆQÊü ºQ™‹ ç)ÙÉw¶ÍœÓCâ…„¼ ©Í;c¢ÆÊàWíÒ­/9år=!†ô‡^l…l™i-¹èôIxØ›o!iÂFwöl]<ÞÒíàK¤øÀ)¨õï@°Rgä;ìørl±Í+ê÷³8³Ü-fç8±Þ»}41S»Âaø ¤Á£ëD=i¹@ì²"$dhX¿“˜È¹9™U•l¹8\ê¶ò/WØ éÒìR|’.Жîp¢ïÔjÊJÜþ->§ó0Þ7çl#„zKV$h„C&d{Xßq"6úÖ)ÕWþ” gñJ¾’Ý$sÃ0, ”¢—#í Áz·þc$º?zÙÁjì „­Þ„Ô«áÊžš”D½­óLÇßm Žä «Áû" C›Ö)ðËKn£åù8ÓW‡ IÇ#dˆZ)‘…J ŸoÒ2¤®GhMàüaý€×®(a0!¤–ÎhUo©ù&?õMª¦ÛAuC¾UH ;­Ÿs~ò‚QÊù>=Üå(¬F’”\2ÑC§šÅb@âuαîo'\–b\×ÔÕT ô^xoám÷¦ÝvKo}"a¿·Þû©¢eæåø•:¶ò-¤Îµ¥ºU CBFˆ¤©NhÈÏ•ÿÙ.òàÞÆÙLjÕQä©ÍO¤fÁ¿°XZxò0ôUörÀ:«tÞ´ž úQ=mî¯9¡±ÊÁkÕgrŸb²`©³ÿ`gHæÔ<é¸ld1yâô ‚E'ŸÆñ]à ;8ó8pG}¦Y'þê˜Õ4D½2X¤ïÖÏ>õPÞïy‚´©³¶ XZŸ´}tîÁÓðizR´ãú£MzKì³ê/ Qéåi²Å=lSÆÎUü£˜b°¶ÎÊ/¤Ûšÿ˜O; ø½ìj>¡õ;6ó'dìT¤€h „Œ‰²ï@RÓy½eUúé›siRYµÍ¦¡šŒ i–u¶2óåN S)q|'‘Ø< N°3¿nØc›<ÄÏÒÐAåB’VÑœÆ-ºˆ (ÜŽc‹×ØÐu—ׂ£)‚Âòtê ˜ûuýªi®ú.ŒXe‘Aݶj=ˆpÈ,‘"a5ÕéÇgɽ÷úF#Ñ„èô°²·>îß-Áà†\°ƒñ nƒpör§2NFhŽïÜÒCó]˜ÎO¸•–ÛÚ!~·}É$2U¡“b rƒ˜ið¿Q:KïQF™œ{^ˆ´>K™£Fƒã•

؆ƒQGaoƒK\›ÜyôS¢H¯Ò>òã䊠éÉ!u}‡l¨ÐΠ}×»XN…¼Á²bÃñÌ[@ØD F­12`‡ïw3¦êEªm~ܼæÛ!ŠŒ'ƒ«L¦Ìas00{^Ý鼯*öS=Ø^Mfn"Çá ‚æ®dOC4ïœÔš/õ8%'«˜}:'d#d`pó;¹Cé„Ö»UMØÎu:‘æW-#˜ª ¦LåiÃîÄò0Kl ûAãë›jÈé45FÉOñBÊPÞŒã¤×¢À³å»©þ¥‰;N¦ÄèO™Ó`b¨qH¬‘fª· ¢£Ó’M0ï.a˜ÚvVs¢Õ)‘ö"M¢Æ¿tÎca ÜnmJÌ Û’È9H×4ìÀΩÂ;oÎ[ž¢;n_ÇÜi}àòZ†àrÚm®s|}±ÀÒ}E=W4êÛ{}7<ÉâimHž³Xm\0ÎplÚh‘F}CL7Rw¬C‰Í22 âU™ˆoV7%aç\ÒM·‹ªpÞÿæ?†Šˆ¿ëŒ wšõQÙÒF;{?šýQF˜lÔ]Óx°0¯¥™Øe)wªIÞ/Â{ÙͱS‹sOMéôs=‰}ãˆ`™AzÚÛæ}âhôÆÃ õ%¬H¼Ûz˜æ¡Õ¬8ád„f.W$‘ù£EZçä¹ø ÒÿdL2¨A ÊäPï L°šS5½í¬s;Aë6ŒVú³Ô¡üy‚Ü—5n8†`vsžœ{†<£MÁ /ú1 (€ˆ1Š—Û&\?9éõ*)™‘ê#¬¹ÉmÅM 5e'øÔs:3|~'‰œr÷¹EÒÌüMÓ‡B»&ÜrçþÍ])íI['ó ÔÓòSŸìب¼ˆ’5ÃvÚžtÀb¤HÓA‡ÆP:ÂÏÂ!XècY¹n?¦ÐLx˜Ëƒÿ«ƒ&2° ‚9Û€×E‘däæÀ§?'luÚ7Ö],Í:¡¿¢áLš±SmüÉ»ÈÍÖd+Õvœ¦ÚÈŸ–q;¬;iÚf-–‰”)=VCŒº'Lþð+ªXÓØ°‹•R ¾f®Ž3"¨ZŽýÌÀ}˜dÚŠ¤´foDNؽ:¹ŠâšËÍ¢ü£fñØ%¥žüõãŠ8Ç3SN4f6×h³sy„^`@OŠŸ\`B5í‡ë+ÞØš¯ó1:ŽìÔ8+sǺ“XX·W"öí8x?U6G8Šzt„V+HÛF•Î+ãÉž½‘DÈÈ·á·äþlb¸-¥Cx­[jŽÃqí_ˆˆŠž*é9=c²9;Ë.0Á€É,()&°,dÝÐ[&Šÿ':¯2¸–@‚]Ç®CŽXHSü3rkä´Ýc|oÆŠ­ÂI™ÖHÀUÅ$o£óT+1ëóYãá™Õ·H·iæb†Žu&OÇÐrÇØÆÅõ#š1Ÿañ„U;uÈÎæ4³åãù¸ß,›0יּ;sîIrýD© íéì3dZ„fjÉ|aIÝðš‡K¸nNg]»à=8÷(Ù;rþƒN+¥¢DÞä'¢ñË Þ:Žæv5ŽXÙöüµ:NÙõòáÉënÝÞ¿írÚ!_;Q9má”3Sdšt2c8r¦â“3aÑrž‹i§"«•P÷WÍгóÄï4e;kž!ôÌdñ+¿ñåØ%Ÿ÷/{›ònƒÒ܇YMšHÙv¿þéþߪÇ­ ÌR噹æîÇž¾=ª"1I¢P÷eƒ£ÁlWDŒðÊìÉNwåefáø¶)I=,œ îŠÂtï5ö_1šô˜¦VMj˜‘Ê#ÓØ9—%îmšËÔtª{íµrbÆaÿæ?TÌÈ'û~QøŽ>ÓwqÎõVyLª÷ïg½Ð¸sÕ¾J;6õ¿R"4ÙGÈÈÈË1óÎùÅÊüDØM?ÒÒ!àçabãjŠìâ4 ò–ë‹è«T]¸ÂF.†`|ÈÚ‘5k‡.WÖ¨¾é:Ðà.ÈìÁFï²³˜o£HO ©±d'›®¿ûµë¯ºª¹]ËŽH žcë\ºU¹Ìè!ÌÔÛ¹í “ö)?#Åg’•/‹™ŒøûA>â™éP%d'އ2<ïjVž­\ŠAÉß^JýšÖÞÅﲃYŽ[¶ò„‡Soò—ïgàöwÞÝߺÓÐöOã}´‹ÂÄé[yšzÌN°Õ‘}VKÉç}ðѾŸY.Ð}üo ôbaÚÆç9’ $¨;d-Ý4œ¤š;S|6tž2äæH"w²v zQã÷(Ž«cèÁ¼6ã³ÞIrgöÍ8Ëo’»´’0ªSø¢à:»n´¿¸{q2…yQðÅ2ÇqoÀÞì;Å”0H´±šl+^U{Ÿï×ËÔOìeê×î—©züdzûöü×o†ûà̤ZK®)]wàùŒ"²rMÅúš6•F“=û ü~ŠŸÜÏÉÇÏqz i¯&›Âš÷ø"÷E®9Å®BÖÂmry·¯­~1ÊSIó}¦àdÏ5›ÊImá¬Ñ›òUứêyR]˜çú¬j.´¢V‹w’‹ØnC¾Š\Kœ7lýZzØm•‘P¹ü•„€ZëÅœT²~ËÚì×ä÷g÷ô¿í t­¿Ih­-¾·‚0Åï<#ÁNF€ÿàZ‰³ úosľœ6Vå¬öï÷ WÚ UZxìt>VI"µDÔÑjÎ"Ã/M—S3]Kd»ªÏuijô„ÄÝÉ«·üMâÆKÄéÀp:°·ý»Úð@Âÿô¶v(2€‹qÕžÃã‹k=†®R7õtQo€l.}VÉéyÀ¨Æ¼jŸ¿WÅPÑPåßÐ䢨’ëþŽÅ?ª8xOLTŒ VeG9K$ޝœ}s){7é™!¸ÂÞ!¸·ä¸øF×!Ri%²êR‹€s¼ :H~:‡W.¶ñ¤ìÎÝßëA(âý…È*¥úõâ/‡*%¾Á-Øÿì÷ÈR‚€ÄòÂe¯‡[;ïCšOªš…ü¢„µ¯T7’ü Ú.ªFeíÀÈBb5ÆÈk5{dÏ®=$(nb¤…È"›Ü#sB赜§«ü×[¡Gºc…+^bÇ@CEz8¿xà ó’klBiº ¹Z ·ƒr~¯HNb#A½ÖÈ’wd9Iæ¹bпíß§'ñê DÆ”Óç´=üpj"wQF ‡°ª/²‹ï/V7 𗼃Å(½FF¯’²pÛö8„Tœ0HçõƒïÜg`ªôÀß’±4 QQwˈì÷Ý!#!Ãy WþVò9Ÿ#t¢<ÒÝT^ƈ+{¯ØldFÊαZÑßû3KàqHù°šÊ€•J¦øàÙ‘kè€Wç*2Ç}%¡± Â÷=ÁÀ´çöÅENÓ>ãjíØ‰Wkßo®f÷k¾óïñknTißxYžŠ¿dK-Ùä)‹Œ7C„ÕäÈv¾ƒÕ21ä–ä÷`è`5n‡Hæ”äm8MìÉfcÈÁ62qŒp“ìš>Rk¬\ÓG¾ŒÜrÐ)íPhoùè´[‰´±‘9Èsý~Cä"ãhœ¢ò0~HsZbZ‰Ë VSÝ,õìoEHËpf¨•ÀuFÕ^Ñ”iH|ú\ƒBwúרXô°›Z›|FÀh·)¼È¶G£é¢­þ ÃOG¯ýõÖs‘…á<Š:FTp´bNnr«ûü¡ºNЄŠ>r4ä&n"œüѨnòÜ)7N‘óyN?[le< `SW\¹µßVŠuŸ«çl×ç…¯DÞÈëž¡Bæ„ïzážøÂPGZÕD¦„ŒüMȾ{qSE§žÚ,ÿ/œÀ$ç®ê …®MOHsíÝžOgÃ%dõ⎮¢FSUoçH†v$çÎR°õ·½µ×hoíÊeqªßï¬<=ÇïT «úí»¬5;H¨ûÏ]ήýT ºoÆ6‘‘4!wå½2ùª…äÁ$`¤“áo?é7?Udm»ø”ò8ž^n6wÓt]6êUŒ7ƒ XÊÓS0•ÞÚÍ;ƒ§±·°a÷†ÖûÓy Ïý±lz²ûÓù Z)¹w_–¬–ÛÝ €Ä¹w·0è¦÷ #‹ˆmCa7F<®»Í7ÖŒ 9ûÖo)œ†Ÿvøï/ÔqŽÑ#Ç@Z‚Üctˆ„}QWõ˜ÿ[7wÑþþ>7Ÿl²Ï-„›ØâÉzöó·yâº"£bo5NB §3…¹‚åkDâ®Â†?_-Pº‘Ž / Âd\Ç¢•p<Œ2d@’©^}*χã#odXÍ ÷I=‚öH ¿‚íHÛ:w ²ÛyD½m€YŒÄþ …Þh*)º0Ý¡ªò%äáªò äq©ƒö§WpÍ6 0eå‘ã€äÈͽJs‡z§YjÈ6ÍͶ\9à”åöž(¯³ãÅÉÀé 8Æpã@·ë»¸œjöyu&Õëîú=’ä™&‰ÁÖéQßóÀaªkžD\¡t¦ßëHM585ݺ(®¦Ý8ºÜ>ÞÖ—åT Ô(ýÕ¸A‘ÖmÑIqE, b&¹õ}=ü3›¬ h{#˜x³O‚S²[IÍfv«1²äùPŸ^ƒMW¿«4x}žnrU9¥=Àû¬À{ÛæÄÏ3wâí/¹c@SZ 5{ÃMêóq÷« º×ß2èC™5¹gƒ µ1ƒ‰M2«ͬõ¼훣ü6² ÞMmðÏçõaC^Ÿ§«ª´nÒ 2>%:ܧøô  Ÿ`æêã)Ç»Ìø¾$½Š•×ïPe¶rjtmôÔ¨òZŒyÎÍ*Nÿ…¿%ïÞ±é†e¹Õæ;h¶pJÔ[x˜mï&{XÍO.Ï6nÒ{$b â_—, ð´ŸÎAá˜Ýkœ/}X3Z£¸q|—톚Î'`¥¥ 9< s>Áì:5Á3æ0R ˜{ ]pŽÇÖt‘rŒ¸5 [ØÓˆé ú¨R$yþpE,ÌIŠäzžÓã­ †ÏyE,pì§G,pŸÖ%M2/ùí2ƒÁò¶›žéž¼cTiW-Q³VÙ¯1^¾èž˜¨æû}ùY®ß‘EËç`ÃA[v°y$²\Í‘’ËÇÚ.)±?Hg%*¦–ïq|kâ@ÓÉÊB Pïå»<¹¨ïcѯwçuïÛÖPc_M·Î„ D;àþHFþ¥ÛRõÍ˞Ђ§­¬Çב¡¾`£)À±—ÏmP” NÏ5ò)Ž$u Q4]þåWL]ŠÝîï´AÀçÊA±cB‘ôüû‹x¤MÈKÿv,•ÏW]â— E/¶j^€g/_‰Ž±æ„HXH­~áý KÖÿ‚çÕkfëìúL+Öð>Òœ¾žÛVxŒ”t€b²ÿʰ¤._pœ°ñiD> Öñ§bJ% t¿B#yÏv\båsm8˜yù8­2=$*˜ ì«I|¾:´?(¾—¯YŒQù¸c#ƒÐ³Hó×që·ž[¾m‹åkÁ¶X¾þ¢¶~H‡¨ äË×C˜éëÂNöê3ÐÅׯßLñ†ñqý;3ŒKõú`L¬ºB:+øEª¾`I¡:¬ŠJ½|£„xQÃÂÞ$Æò`#£‹ÀŽóÚïÇJ ¾q¹B¦n\ œX=S¿zÄÁòÍhé©ÊÛ|üf$$È£÷ÍvïˆÈÙt—–³—ï¶œs06çž»n¾óÎøö˜H€üið'4éÞ¿xþ¶¢l릤Š}¼OæÍlíÈ^àPANk” I[£à œ›L”§„ñN+°Î1‡Šè5ª¶ÿ…2È•—Rt¨¨Ú\ˆ4ïFÃÐÛ®Çóç²ìyŸ„t"ÙH@åë{æû$^dPŽÞÆ_Ò*‰ü›ð%-Çä„Ï1KÊ¿ ß„ª~ÙJ*ð%Öq*6³‰U´K¹bê/ßVIåýãQ• aãQ,y—´Å½|Ú›3Ö.Ä·ÎWã#GW6ÆKb&éjT(ý’ªY¶Kb!¢'`¶2 - Ö9NåR5W#©\ªîj$•;0mP9×׿j\û·Ø¨D¹ŽgÄK‹#7nRÜ¢3ÎKK ”8ÉÆËØŒE‹£.W™P¦¦ƒ¶’ZŠÏå‡d“KbeëÈ9TõÊ[›@‡"笼g~dÃcë8îèŒ_§b¶,|¶{^XuÙ0ÚEKTÅJêqpÐû‘X¾Ãˆé()†òeT-D F#h°¼X~:D\什{—4Nloꫤa{WíÕ‘êHGÕIôªŽÞMŽë|ôy8í|þ4ûúw Y$MÝî ³~ÛÁ$¿‚Ö÷Ê÷™ül¹laø(·èx0I¦Ç¥¸ißd…¢@Õ_ч9Ê?‹³*ȾWrˆ -@™ÀÅÏxLbß™¸ÉTã ÷ýxn0 Ao/9y(S$…ùƒŽÿ¤°RXX¼(íVïç;3ÚÂÈ]3/9#w³äS³„“ÉFMMãúY %oƖϟȾ’™B×ìRëc1’HP÷%'~©Ç…€ïãÑžó´ˆ]"%ÐÈ̼YÜzO¨]ZÜöKfö ô¥ðÛÙßfÀ£búsÉn‹Re‘ÆÓBh÷1„ÙžÆÏ’!ÍüÅá¥jrTEðIb·w0%µ\ãš«r»½ ß«iúZ˜ãmlÅc¸F6Óõx¿h5>»›½ä¨kd°d#˜ÓÒp‘>ñ2%³‚ØžÈ šYbðŠ.©¢ØQ±=®¶»v+p—|9»çgªNnÇ Ï¿ú¦‘›«e5Ý(äš›Ñ<5l†àºä6š[w: ‰8刜Ú盿{}Gÿ{ÖeÖcdŽÆ2Œ.¿. ÛÐí{²ìüH°Õ„ªFv†‘YkT³+egÀ©—<\Qˬé6Œ]2yÿã­z€ |(ZÉ,W味…²í¦¢(ÞýB ø9º»…Di:AèÓ,Âën)„fŸè1“ž{\ͤzÙ[Ò>jòYG‘,¨ZTùÒC  %• EÚKDt-) ç«b­y6©®|QU£EP D ŠŽL[1Ò.§ukU½Ï™D ^ ešÅJdKZÄ&ÅIâCÀcwÿ¨Ú’ ÝQß`íRÒ›•@< ‡ÖºÍIÁŸko.!5j–¼ÝèíÕiº» 8ßÍ^·YE¡×Q»Pðœ.–OÓÿ|ñþÌ€b´ÏÒ “GŒÅ(;ň‘–¢……IZ€ /å/'l\«YiV€O$õ€g—RãõRcÜßO€Æ.…XÕøUö¿” o”Â>T_IH³W.3­iyjSJqǼç<ËšÌBê‚U_ŠuÑÒXâÔ¥°¶GôC¨<¦V’BE½mg6¼G.,Ä­æÈFÛRŽÎâ– \.,{ÐJ N…nF]´ u‹Ôe[1·MŒQò­ÔòüÁúÛýyÍ8äÙx½o òª_Ĉ¥;ÀÙÞ†Ó_ðÔáÃX7Lfý£¾ ò·â´‡-8EìHì/'Ù°Ú¥ŒÏ¨c!„°0ÇÁjsBG‰Ô±0^tgöˆO]çhDÍ÷+:­l„ /Ñ1á¯`µ¬-òí©J\æ£NfãÖ˜¼ò íò€¶ @Û¢ÊogŽâA§“çé`›×Ѻգ^=”ˆíRÝN¼wAÚ¾GÃçÇJú·£|Î> ¢ùá·±A²ü2ÑŠ mCþ<7®Np”êŠ Þ«!w£\Q=âªql‚‰¼Â]òísQ‘Á}ÒÃjd ÿåØŸ¸Õÿ^Mñþ`<%†üH™(V³Àê[ªÄÕHG¸á~Š:5”س–j> Ðæ¥z†R[ŽÄ)Ša½Á‹o±-~ó0f½1Xøƒ"‚6P¦\Ð6¡iö7¼{ÒiÀ½4Y{pï–÷Þö C@«ûyÿ.ÏbßXU¸pK ¨ ž>\?®öo gW¿0­ÍBKÕHØCi«³@ÃÓ§—pÏíÛÃRG\{nða6Zˆ»¡Õ,Ü ½r·Få¤lx7¡²ŒBÁ¥ÎèiÞ KÿœûëßF^è½ãœüÍÔ /Y ¹Ì@^]Ýнˆ7×4yH6¡Œà- žË¦=#þŽ?^À”¯FÂhîMoA9UÛƒM ôtð>æQ°œ%áÙ¢a•Oq8†ºö·Ä„åx0Þ·¾Øn‡@2¢´w9ïóìö‹zF‰M•3b¸[DfÒ5µß°¯ÑšÀÊߎñ.ÂÔäÅÇOÙª˜ÁMÌH¥ÈÖGF$Swˆ+ôo•²ïÓаÙ:Ù®4ཋD‡8üûEÜÇùúNï0åEÜÇp}9*LØý* q_8…ÑRŸß¿º>.5@ î­c3wì"ƒAƒe0ð1È+‰êø¶É~í·Í[$ºžå„Ùò6 quˆ/¬ %)â±S”0¥…‚m+ÀzÓh¸û?"1âŒ4žèžSÇ"½-hQ4.楯À~qÐâë;•6­L,?H®à'?H‘~LB©Å&rY¸ÍŠ|x+5L–y<(ÛDcFùÓA­4í„.#™}¼·¢—¾ö€½‹hŽ3œóo9D…àêÇàÇ ëâN€ÅWCto‘yM·›}ЏŒ$sòšä@€½Ãt©u¸ŒDMÖ1ƒký®-Âr Ûà rzÛKQÏÇu>°ßÅÁÞ±”¥©ÖÜy9`ov“ç‹¡Ü÷Us‹RÅ{L~ˆ1ZͰ 1T»PVÔ`ÃBl÷޼YÄ‘K‘·«´èäà†jîäF{}ߟGª^ÐãõØÀÝß?¹Ü,xq¼wi9†ðZ.¼waq¿ƒ÷æV×kÙ¬¦ê£ï¥A-·@ƒÀײééCá¬Wÿa´²ÎÓ½¡¦å@'x̃• àÝx(6g+â/ˆf›©l‡|·h$ë½c‰ýxôXXUÊ‹ïÞz`£QÎõŒKaÌ}=Ü„Í5 –{h'»›Ã–+ùUs€÷^ÍÐÎv÷ ±’Ø Âè6#ž;:ëòkŠ)À‰¯Æk‚ ÍèAdÙI7Pt0J8ìžïƽQcÿ@qFµÅhóÐ4d:³Ê+Ÿ$žkdrõÜ!¤ºŒˆÃ¡§uâÏ›]v•Ù²…×»Ô7ø›s0r£=q¸4«¡@ð7Òo´Hš‰îÞ¤y´3y}Ù­×ãçÊá§{ovR˜qFÁÐCíTƒ9D¬¨™Jqx™’MX‚o²9ºJ³OæB±¸;ÌeóêÁ{ÅSÖÐ<¶“áÕB+šGcÄóYmnøâƒ2È7 Àéeß(ƒ…ï†ÉRë)Á© .wâ•1a  #ä$,ZEœ¸¸_)ù(ʘñ~[ñ€NSFýѧªfš2è! ÎçÐøj|À ¶Aá°ÈýŽÅuY¥ÐM–Ü÷h|5å¦$Gö %œQͨ™q{ý|¯h¸E8/óóàÍ’mvc‚ög­ÅWãúf g3;A–œÉm@Ûž¸JÀ´WCÙ03ƒÙqÞÃû-d2—ÈúƒBÎn¦¤½LÏ%RE ÌËL5ØÛËL… å Äoø6…ÏýwS¥o@qwÆp@ÈWs%M0E¨NÓ=å­…ðeç|¼bT?hYž®~кwÁÄ·iåÓëiå‹C^"lmCÅI³û.(¼~†”¡¹ÍšµšÅм‡fU®±*fMÆæªl豳͜8OvÔn™ì?\ýBgcÜÅÎôQÔäy‰aUdò½G]S10foÛɄ巳* ¥Ì¨pM¾ÃN2~{Äýžþ·#äÕžC5ÂÅ+ äõsÐçë{Ìžpɤ‘N™·*^?s PL}‚êÇú“žaJdIMx\áÐðêÑ}á ŒyM—t\?6Ò˜o²â“"‚Âc J(áSi³ó N¨¿Uùöø·‰Œ vòD§/à ÀóýÑÌ£UÀçkr‡9Y@Íî0¯ˆ®ù³$ I!ê‘oh䟾§ÌAû¤¡«Ï_Ìj¤šŠ ä5ÓZ ½æÏå«báBŒ·yHZEµñÕØDÀVÍêô¨t‰ŠGtÑiœ*ëT<Ï#¬TÞ¥¨PYi<ºm+@ä·|Ôùj`ºª@¬× EÎ%”ƒ¨BQªE~Û7.…MëÕ¨(Tyͱ äØÛõ8òSFù@óŠzã§™}Ò´¿¥¼N• 9qn ÁZ¯Ü·ˆÈ/`ùjŒ…v^³² ÏkvÄ|ÍÑÏ Ã!Í®„‹?¸RO–+õÌ7×`Qì— ©7³È±lëØuèkVêW^Åȹ* U|5ŽFè†÷¯Ž×l–«õ1ZÔ*Ðó5›Ç\©ÕÌÙ8U…* ÉP•%z¤¡{oÈ#¬æ5K¸R“ÐA­¶ÑùZ¡¹¬ÆØÐãhò]§f+ÞWa ¯MîÔÂA"ØøšŸüé°0ìd¬Ø·5{xka.¯§G7êOü°è”ÁãéÁvßkŒªˆT©ÙÒVU`ÀWó³Ú±;½xÕ4;nS )QÍP0òÓÙÁæ²üi4AeÉï‡òk Qß7cÔY‹7Ãx_|Ð@òP²([`.a ¿2±’’j8º6°¢*øjª­½–‚h|ùj4;yýeRQ*Ïq,›ïóµò‰Jλè·?`óZÌhUC_ß _3Q,*·#_‹GåRÌn´B(ŃF«p­F‘*Ì·[ãóuGÍÊ|ý˜"MRŠ{F4*ÄʼØý*µÐ=uÀAXíyà…ÀŽ Àz=lñ>-¶IÊR£åµ\F+øþj‰E˜´µÄt×ûSQ軺ÜÃ5¦N¯t¯fJT²ÕÕ¬Ç(sÔ»R<·;)Áq¸Ù^K1L…;©–íï üxÏ¿È ¢²“ö1¤{@÷ð›Ã‘Ò3)õ»e¿ €ùú‘²Ÿ–óŽÉ›&£Í.@xsÙ­0Ïk$/E+[µÄ˜×RUÖÓ@â`[GRöuüê¶ÏUã©àC­%ƺ^†*š7j‰Êðæµˆ/bΫnT„)Öb•™já³î1¿c¨«¬VÙÍG¨xôñlªÆÆã™¦Uܤ¡ž’ßG¹‹‰ç*0Û«1Y%Ã+Èë‘ÕÇ_^ªŽAaµÆxÝZ=^·ÖÇxU_ãàεz¼n–¸V×­pÿ×^޶'Æïƒdû5†ëÖêáºõ”ßJÁ"…ûç{^q`Ȇ§î#NɤÑäxÇ®“)¸1d¤ÖX ¶"þ”¥fÑmÒh+[x¯anbe5x mÉ>Šùeku¿àˆk¯¼á¼[‘H8s?ã…Žçê­N札â{†à°S‹v¿ ⫱=Œ÷¯XÓø¼Ãç©mšF~÷OóÅU¡£8 3*ªŒ¯Æ½ûZßyŸ/¿´0Ö|ÚÎL­Ž±#ªXÜU}5š“‡ùþ¢œÁâ 1íŒO¿á«ˆóÕP‘CìxËKR Q%_ ðWÊõ*'åz0[€5"ÌEû‚‚¿¦Ê)F“ݘ´%¸—Ép^QE\Ün4ÜâM¢ŠDøj|~á`—¢ó &%Ñû± 7uÛ`R¥ø­R#k™4ëWo¦¸@˜¿r&ÖCõBâ€õ*ÕýªŠÓû3–¿ÿEÙ@¥¡BVˆ ¬Â=ã:k†oš{± ,Ü/b¸þ_E\,¸°Š ÒêÖ‘ײy’iù­±¤xE«ìò õRõ÷÷WlCàl½,ö@W ̉”‘QŸY4ÍÚ7!AÂÀ—½nÞÙ$¿9Æ¡g yƒwÓv¦Äѱ;8)epMãÁ´³M¸s+ú¼Õ"#=@«¹ðYDð$Hïµ}Vƾ"YJm{ÓÔ2täßÄP ôzG^Aq€T›;‡ÔÓ‰'ÌYt ŒÀ–_ÜE0Îõ,·y +2V¯%^‚«ZK¼[^›{>(mtb‡ºg ìNÀ*ÜcUK‰¯?üá2£&-Ý›ŒIVIK+k7Ç÷µéócÑØ2bEÉ­BBé-nRR­bèóÚ8^êFhç`nîwÒ|”Ñœ„:㫱̟¶Ô`ÊeÄ…VÇ™WÒÊÆšN8ðÚš/èaíä²â´à¬“ËŠësë™t‰¤‹e*æJjþ+”Ž0åñ8åÕø(‰´~¹¶!·uù%@5U<|ÍSñ]ó0Ò5s˜sI?õ¥ª3]K’¥7òNêXßç±Nm#„›>ù›†vv°±1ÓŒð3$0…æ>ÀÇW£j–ÿ°N^ÛS§ƒZ1£ªj#é´+C>Ê5²Ó56J7A˜ÆÖHÈcm'5³wŠßZ<ª¬µÿ|4;ã®ú2KOutyEn(Iè äŽÚ¿HPúaG?:6\.S°¢ƒ/' ãÑÃÂÒía]ÝåHpk!8·r0‰ØÏ=`+Šu×î;Î¥®U¸=Úx…'Ȧµ[Aˆ $úúN“rÔ V´« g[MD+ôU ÌWsŒÍ_€ì®)¬ÅC »_$=À˜¯&¹©+ÇÕÎ*!çæP zÑ9Çì–¤ÂdQOeqù¹l:¢>.ó Øq—rÕöàQ–~lBxÛ¬3• %•ÎÅëñ/ûÍŸ²íŸ¹H±ýkú`Ç«QýŒRQÄ!½PuLyeÐPgÒ\õ(wKš[g¯Sžø²˜–Í‚° ;cÙ·Ùó˜Uc~€J¹ºî˜R°ö(ìã!MíÍR ÖÞÛ³D›OìÞ)­cǃ®€±{ÛÅC0ö¼ê–‹¤B²ª½=âÏ(R{¿2AuJÝÏë¸G/±=¢7w”ÜüY·?jÛßh|Wuçýæ±Ço_ùDì#?Ãùõ2eÓü¬(ò ”{íf–ú‚ÊΧ—¦‚Iôáù×—yf«äg§ÎM€O€Ý›Üç%à}:Ñï“>5#¯>Ž9ãÚž *Q{äZ×Xöñ»Ú_EÄ"žj¤¤…Ô“ÊB^¡›U@ÈþˆRÆýB“% Cþó ˆ8šsüÎÒ[ý.žŽa^Šà¨õ];ëÑ™¤ç_Õn+ N«±ÉY, Ø«±$^”£²¢øí·€¾9®FNˆzꊓ'à´SXô‡Áæ1ˆŽY…‘W@Ä…ø\ýÌÀ¯0óÕt3Ú«ƒWL|5î±ZìƒìÞsZŽU>ê %`aÖQ¬°ûS¾ì\ʱ­ï$,€ðÔó< <G÷7)a˜D­¨O¥ZQ‡[¥4sÈSVÃR×i\ÏD²‰à5z`ÃMRtƒe:r,Æ c¥H3R xùjÈÆP˜¼¾%^«J€/¨^1l„"Ѭ9„çh¥G-¹˜Æhjëôçã™MKý ¯Q7_áÈ”>ÃõxgeZêÈãWøýaÛ€ÖU¯&^7¯ZM¼ËZ‡U¬Ë×±ÉÞIú0EBÈ7ég±ïgÂ!—W‡×¡Õ9,b§’±uü•ê#†f¸æ 4y|ý‡ëû°–Ûì©™j+ê…_©r.\Kœ/ˆ"WMq­¤©‚?kŠ?®,Ö÷¼Quð}U±3Z ÕSSœT 1hcz8 ²/Ô±gx9c<@eQpOq@Mèà7€¯ÃÓ²rnLF^Qc¼óc—ÏOwXaVÖÈfêöSÜšø6—¡Èxу@ëÕh1…ö;ï å“é øòÕp›^çwç3¤M’¹OïÕ…Ý2ÝK„ÝÅÅwåzÀã<'üºÓvxAè  x)$d¼Ýý²§+ÄŽ“¸J{‘ï<¬VÌ/¸˜Xæ­Wb¥¦‡]b¾RbÒëôÔ†Z=¦7%übº\ßL¥( GŠçW¬ûi™+pæ«Ñ ¶µýjÛ#®ÎÂh8K›N}MSBJvKÏ%ùÔãø cÅÄ1uFÑ@ñÕøžž£{ iz`ù`HJäW‚Ç/ñlv@Iñ›Ñ\>/«i× "!-Á2[¤Ê•wŽA|9en®q¬ 3樽˺*˜‰d*€âõ-/®áÈ‘ªosâä>\£ì^çS[çB¦’¨mg(€áuF®Á"uV”î¦Çô¾?(ù´Â÷åË×wñ­Þ]ˆcµp¸Î1`Ó]ãdyý™ÍùÝÑg{5Îd,+†Ï¨ívjä3“ܸéûe<H|5Þ9n…m°9¶D{Û¨ÀýËwÁ6Ðy*9VO,ùáà½s„8ëny»ù‹D^­y' È÷+£,z‚2Þ«Ñà̇ú¤n•Ï|b¹  €× ÛOFõSiXpH\9¼tX%™7ê¡'‰7§'¿ŽÓØa »J¾~L‡ÇÿÒ+Ö0­ã…^u7yÌû¢5Æi ÎåÛæI<&ñ^aÉ=¬Iˆü.4S1 6w·å6ƈ#_ð ã$ùjl?kº¯’Žr,ŸY¢4ÉPL!@‚¯æ©913ߟ@§§¿5<°\¾ª“[xQ±÷§ÄîæVrY¾áƒðˆVúÀî1õÁ[†r´#˜Ù\q²ñáW?…Ï{Å£©]NÊ)0¾é¤|bî<Òd9JtÂW¬¬ãåæVD#îΛ즸;op1„송¬ïÚ¢A}¼Œ¨,Ä_%¼Ô€@ÉW£ °Ÿ7º²î¯J©Ð CŠ–øyL1”øj|à:3˜1æ²£îµy_Œ7ë¾;°yسŽ^öCàhuù"4£ž¬¸½£ž[2Û“kFàÂŃ«¼}ç¨Ð†ãbèÃÐâiz?#rM6!.D ¡Ë§v(Vâë§ÔäW%\¾é#7Ù¾ÿÀв<Ðûú˜Ö}ƒÄ¬x›D<¸ äV>óp³ÄŽC‘ô}¯x'):*5È%iì]·Q"}ǸŸ$–ùÀÇ%™£B€M—äŽ ä ©poSPD'=~)H\íPZ›ÄeM((qIf‡ ÄW£LÁÕ#)EW¤Ç%@:Kòd†”¶†yªü6¢â’r¾¥¯õý -£ & áAw%åvlŒï ÷*Ο7̘Z¡°rI¢!é†JE}O€ûF»Y©>7 [€ ¿ Bü…4öx9€ðqçé˜Ôk£t ðQ9¯"¾1”i â«1«»E´‰Ú6_…Âà’ªSåÇ=Ìk·î•ž=3ž¨Õ豂 ૱›8­d‚ å’ŒY ð’œY¬’ܶAð)2ªªû^,¬‘̸¤f×ÿ:NÆa¦\S®‘5Wˆg7†- 0á’45ÅL°ëØ–¢Ô/À|[*‹kƒ ^!Ç„ 0ᢘpA‘Lø6+=P$Iä%âcÕ–%,Z+já—š&À‘¯f—“¤qö… žc}ÿ]ã\Ý.BHtñú ãŽQ&ˆøjŒu¾Õ:IšÅ) üÝ”|)œT\YÎÀA²Éƒ£èÓ3Ñ,ÊJàWV{ Š ~m)•±WÓãýxÀ7¸aV³EøO#Ê®ó WAå—)IXVü’ªѸx0S·šBXò‰:ÒU6ƒJ˜á€N”L„Žß’¯ºè4îŒàk­K¶°(ÒÜ_ëðºâ‚ºâ¢uÅue0FòðÆCñXÊNPNÔ´øbÆ—Tª¹³ÖoYÓûÉ8ݧ °Ó«ÑJ)}¼¡Ë’µæaL°¥O…šÝ‹boð-A%_Éîµ`&娓 pá«ñy¿É…„tÉÅpòë»§'gHZ‰‹´0—§>¢(’ìæ¨¦7D.~ÉfŽ «åw¾‘]O\g{*°é¹Ï2É'WóÒ ’ë/çKÖ4;êøåp“µKí~ÂF3Ä 2éÉ,ªF•dJ×:7ð; ¨%+ ƒËñ.ZUÜep@ÄWC1psÉVØOPãZ²ö@óåä«â2‡²žÛ­s«™IAx¦èþ©‘¾šPõT2ªNåfsKàS9xˆŒV†"Ž‹?uî­#SË mû¼XZÜ#Z‘«rÁÀ{†aÀÈ®kÀ}, \r2—©ä@ýº~£œjSˆïŒ€EËk§ »Wã+p`Œ<‡ˆªéZã£qü,÷ .áã÷ý&3ÓŒÖrPÛOÀ9r(â!¬,~é@Š à/è9ÙuÀ! Y~Ç·i…UÅ[zî?q z¹uT/ѹ$`ø—éYP‚\PRܳœßf.²UbaÄögQg´ø€XD…µ`º\`pVBþ¬~îç;»n¶xalh50öçn*)¡æ†TQ€ ÀàR¬¸Ÿ¸Ÿ8w,˜ã)).'aÊScži»¯d¨šYGµó‰O÷ðqAî)s)©ÙuþàAQaÆ;‰ÅPn)®k L¹Ga4¯¢,„/Rµc-XÝ6Üï<5j’[âɇæþHax_A†+$EÓÉÌZe*郫lEå¤;Ž2hÖ­¢IDhÆ*±zª#JU·7S Ü1áßðï»? ƒR-ZJ`0^M,¯»Éuç+—Hâ%€·IýFØE Á¦âûÑÙý©†(¼¦¸àõ¥Òó-°ÿH5Ï· />_´èÑVîªIIM»šÔ%ŠÐ,çÚEÛzÊZþ5ðŒÎFK¥ŒÝÀ‡¯Æ&˜g‡k¤zì(ÂèäsgŽN..Ayð'‘ª.€ïÉ}ݬ{Ñ\ÜOª* ^uÅt9IWG¦á7Ëîm±£à«ˆ“ZÎüÓœwÔ…@•\ôÎz° Ú¯ŽT9 Õ×_Å“µæÎråÞ O}^f«jfªBX‘d„äEÞÉ€—*^g”1cQˆe)ãån#©Ú!À†Ë%d–˜µ—„v÷烇T:¿Y—Gªœˆ$A)s9õÄE«òZ€‹hŒñ“ªJî^ÍÎê>ïÌ…´Nñ1…”I"_,h/àk"Aoc$ù™ä“ßQ’™w ‘ä"ŸÕ5ùB‚‘ÈüNáÍ!÷÷ù{þ$iÖ»q¢¦½—íµ½ Pûh5ØárÊáèÔ1¿m¯qH"9”t^ßµQŸ¿ ôH«°Žk R¦ Ñ_åRCPÀ~‹„déÈðj̘ È’ ¢8:Ÿñ–åälrÍ2Ï‚ š§þî÷³‹5 k}Ⱦî ½EéáZáø$¥¶ÞA„ `ýï§~9|^"U-e:»Ùß­¾ý¹żVŸWhÂTé—“HD[—FÏ0h¯(ä¡qbaà —«ªß^ß-*yÖèT¨÷^7\Þõ2qÙŒç>‚¦ÞÿÙ€Ž)â_à câ¥Ä¨X¹J‰ïŒD‰“‡éW9Fõ[<“Õx¢¿O³Ú¡¸ˆÁ1DÚŒvz ÖEN–tŒ<T9YÒ±C>þ°W(&ØÊ‰SÝÆiGã ñ72CdWRÅÌFwÐ롞ÆÁW6Sf¹yGq°ñQÄŽîÛˆÔ8BÔ&RÂÎTGÃfåë¾û&a O²uhÎó\Žï-꽕Á<\æM7îó܆Ä|jNb¦ó}t¦:%(žclØ[Ī~Ë® ®ùŒŸ0ÀáþŸÆÐ(y ¢¸´+E jhi-Ô¾¯ NKS%˜>¤Õ˜$¬¸4†Ö $iVV—ƒó>+"šŸ˜ÈQZÊ&czN–r°‚­çùX‹Í™ ޝ¦©éc¼iîÔT”÷%‰2!‚]¿:Ú2gC/-[Ì,Íôi©13˜›–Z®1Ö<«bÈñ‡O£ºß]qÀ¡l¨€Š£¼auÂw t4óƒ ær¡¼¥qº¾?Ú,Ø‘æŽ :–Úã'¥ž!}É:øó2b‹V¢aF¡ëz ¿WSŽQºxæt~|ã-þ–îXÇó»J`@–K7CLÃzãäÃÀïÕÖû‰½Q#tF]`  4šž,}˜D¬wiÓÜÜ<uº®ª†¿@â3Oö(`àà}·ÙìLu»_0ó[}ôöüpꫯ³‰ûUsÊ5[lÒ³@_aÕÅWóLq9’ÊãøŒ•}HïÕx./ª)ˆ*1Ç¡IÀÑ‘ øj|8°{:“K ª˜¯&:&ñÛÎ&Û›ô(©SD‹ÏÌKL *$8]ãù™³'¢Þ„àîáœm¹äÒ±©–y°ûͬÿIv.'IaùtËÀ(˜éJ…åÒ=” Àu鱺†æm¤(=ø4”St¯Ì”{´^£ž8 !þ|<¨¥£“¿(7Ú`z+qqyÜÒ›ËòõÊÄ䆈’άÅ%X ~Xü5O­1Ç‘ TºGR/¾¾- u¡ÜD Š«†ƒ<_Ò-Á”œ.§ 8é…ð7‰~L÷«(r ÿ‹ …WVUéã·(ò—®v*&~M²Fs®T‰ÝÙÚµºG`ÊZ§îJ;6 ‚^ ©aâ„j.ßrŒ2°ÉÄìOèƒ~Ím¯é½ò1`I7¡‰%__=^7AþSëìÀ÷vÛ©tã×ø~{üÔÌÕ##j‚@‹ |–6 øÈï£Gß…üvºê9]ÿ¦&éùM .¨Ë&Žè®ï”û!! ^Ô-ô”²¤^·Îzÿ+#ñ¦p .EÖD—q˜ÇeÁ=¢Iÿ0—8£©è¿Ðþ?®º~ïOc ô‡£5Z—‘] GZ9éµÎÐ\~$ÿ0À¼‘Gƒþ 玄}w«±+DÃoëaÝâq’v^åp?ôÖ**¾ø6-x»ûS›Àѽu yðæ ×@ÌŒ ‹»ã­sO1pUÓûþpDØ»$.ÔG ÞŸ1?®æp› ¾˜Åo‹-¬[2biØŠ ‰ÒwÜŸ¬²½ˆ¿Œ-Ecu,\†%SįÆä–ö$õ®×ÍŒò +Ì$¨7¾}ׯŽ(AOGy2mu¾Õ"9˜…àzøžž6ÞxúóÐóþYÌâ°Ü¶0¹ŒnvR•¤Fw=5ô‡&t ÄWCÄueTó¸Nºû[ì|t°{aÇÒ‚â¤ý[½ÏñÍd„‰¨° õ€_!¼ûŠœwun`4eŒ“Cæž('C+Ó¥Æ,ÆÌ‘TL‚•ÄÔhÅ-1KÉ+hݺƒÔd’©Á²3 !½€Ì'o‚7†2ÑùÛd•‘gMæ§Î58ãpì6`lʤ÷ €ü ³¨L‹Æ% }wÕhæÅ<³ÉVºÁfkŒìsg¶e˜@,+%³è°w.›½mÓ»†f 9)e^QŽtáÌP’„k¸ÀórhÙ ¶ëÑçbi:LÜØâÅv€¸Ì]¡~^ß³§˜Æ¡jÙ)ÜoF3ðãâÕÄ%ÉE«‰ <rÖ$>‚Ó½=5¤f<àûnî± Ì“@€ØG‡on›¿cf–)òàï'ýÄåþ†ÿL‰ºïÔ¼S:à+³]ýû~çã[4ÎÁ§QùÑãºç›üÜÕ;a góõ—ǤòÁ(ÎGP7{DÇš™eö+5Á>0÷çÃÀFKÐââeÅ@sѲ⫘Ñî“ÛxìÚÀ•'øFR™ññLt½#{´¨¸gn€äùÚd—9vŽ˜!dB#ìþl_µÌa |øjL.@òÕL[ûO$Ëœ ÷QÌ€#—9Mò™óÂN¦ù CÎŽCBH—D„jYsäÿúnA뉤‡&û@4Ú"@¼aŽWS8ò<¿)tÛ¢ ¯‹¿™Þ¾èoŸ¥EÿÞÂ8ÛâíKžA‘‚õDX_®ºy9q²ê¦åİåÍˉkÕ×ÙõÍzH!Ù€ oŸæe2¿#µSK|¯ƒÇ•ÞP^|5Õ^&cs ÒÜ*¼<í 6WD¤ßöz° ¸ƒ·3 ³ J;åÄÁ³;ÏðÝZrÓCÒ 5ÆWS¬ÓµžÀÐf! £o‰Ga£ÁWÑ>OÃèú>9I ,5cY‡~eXk¨ÿ·ÿ­²v±G¾ªÉ=øÓÀã«ñI¬PéAÏî%fÁÐIo·Ï‡–ˆÉª¼Ê«Ñzâ¨]–-ã L1k…·Ï¢7Ô _îAÓmn€Î·/–ôSÆ®©„*—„•ôÓRF/×ooŸWQl_a}íc*'† Xðö=yÑ¿äÄJùÆý´©&íMŠw¨ŒoÁÁæØ$™øè$ äìÅLRícÜk ŒÖö~`%àÍjßí#¶“Ì-qøƒSDî=iÝÁˆÛ7S¤`óXý]ßµÄ@qçá,QÐj€c¯Æß`bþ§Ò扷™†Ìî\obD% ZÕÕ¤›"ne„&ö–,Ñ #ËA£Á«Ò¼’xC%ò–8Ÿ#·TÝ:H£¬½OÌ–NÑ%»ÙÄðg5@Ð[JÇ£ÐàÄl)¹Ú gñ‘ïÁOûHt–ÓdNÑí^‹š‡kxñ·Ö …,Zá.„ˆ#­9h¼DÞëi4ÀÔ[2й¦i:Ëó†8ÛïÙ´ÏÕxM!±²^Tû[² !fz¤þ¾#•«x†fÖ€sKl'j° °ü!v5 j/ã Òi‰¿qn|WCâ LzKV”©a¾Zò¢Lk€x‚9ó[b„³›°Ò,´´÷³Õ²>wä•wiœBhyÜ ²UKu˜ÍK0dE2ac @â-‰Eà¬Ï!ƒ§Ü¹ïRLüÑ&_¯ox<88r¥óàðO¥ãXîµ¾³ngõˆ“Á¤³êi@–¯Æ£éI‹¡v±Â‘ƒx’<,Asµ¸Y:Ng9´–áà‡¶ÊAãïÅcÿÁI’%¼mˆs]Måx4tÂÑÐV,¿]ô8Ãåh¦“æ×æ7›U²¼¥¡ãM£Ü5Þç3ªµDJeF1:„iÆÝK}!TëîÐ@§™u„.Æ'…ã(5íb5àå«™fxBþžüý vžæÕÄaWgÍ=š¯½óÝRĪjê'uîÀ„ß"n¼AkŽoÀ¥·4u÷bëåh·ÂëŒkˆthw)ñù+˜­JÞòç¨Õ8¦CÕð¤æ9¢Þ€ä ¥ÄûùÎ Ù¿LÎá¢0í-'§.9ŘáàËÆ?H,žTë°h^˜K[?6U¬® ÐÛ[úXuàâ ÅÄOów¬ ë–sp)—¿#nY5 ZmR¸´6_M;vã–ÍéÑ€PoÙ*ÎäüèÍ›.þÛj‰? šo(þ = á-kâ[p7Kœ»q,tÄÎGÍaÞ€8_Í0¥ÚõT-žP¸†ð´–ÕfÅŒƒhB„Œ#‰×wôõ4{‹è„©DÕŽÚ2Ydzþ×ýàÖÊŠHˈ.„–ˆìx\g@u›ój[«^¡ ¨ñæ•ÄÊ‘7­$Þ2× ø¼B!ÊV…©°üOÄÈâMDލÖöU§ë€ÀÇ|Ÿ áþÍˈ7 Î[VSÔi‹i5Ñ`®G‡Úvd%OJÏ)LÉ=’àÉÛ’4üyxKâë-o¾aBÅ4#?j„·³L¸í…¿šÚÛ&¡åã(Ç›Bì8r˜b¦½ ò/üMËtA¤_~ñ–GŽ„bX²–ÇQÍU¯8æL߈fÕnÃȤ1~BPO<ÐR±ò™-Ïh»€á#kž-¿ÕÜ’{¤\àyú /PyËä³Û eþ³0ü€ˆãVh22ÛŠV'~3àU[aÆ* ®å9Îê¦øiÞÊ.þÎ}hÁ=êa q¼´¤ø‘}öFiŲ¦7@Ê[Qµƒ$¸„Ù¦žùx›’¾i’7ék|¦»9Ö[!ˆ”nÀ×Êð8£¶7ÅÂpÂó>µVBù?Șs=tŽb®ŽìùjHõ€ToÅ\ Ø÷VÜÕÑߨJv.‰äíÀ,ƒœ¡é¹ÄÔÊ•z&ƒXU±=ÇA«Ž|›H4É~+¬ ÑŸëñ––0½aVCý]œAÍé2Q”úÁr|ýl {™(T§ØrÂÎHÿ]½mŠÿ´·µ½ J ´Ž¸¾í[Ó;©XtnÓóÅ¢RJsÞ@¤Õˆ¼ðìÕ˜Á ȶ­2Ã!çGxÖ´&;x·óÙ!­JC}ðÕØ¶@ðÕá¢Vy«æ$/´Aœ´;&AÔ 8ƒnÂ}úDÇ4ÀÉW£AÔ­­ Ò¸ãÇíKUsŽÀPüØö2LMë¸RåZÕžÇ2ñÃ"°U^k i[¢°¿køg÷¨Å ·Wmß’è jñ} Ÿat¯òý4ý4â†Sh¯%GíæŒÕ0J"1Ój€ø6¦¿î®=Ã.Õªj»k5¾KoSµ”@B³µÝ P]¢õ¿c †­Ê–?MN´™l.oò ì"Ñ-¿ðú °ïV]ç"½UÕ9Pü³«Ä(ø{;òÄ……_ÍÕÁ„G{%w…æÚ\h>ÄÐ\-@WSù5³V2Úñ©ŽÜtW4÷ÛÞCcuöH^¢™BêãºBAñÕи¢IZ[îašùp>F¸ûB©]G°ó‡àf¼Û.ëññÝ»g ï¿ð§  ñùŽ(¼>o>º’ouø†ƒ£j–!ÈALuÎ'ÑbFÊ„o ˆ2úå*í°óéÖ…ù9è rüØzNò¡´ã7äòi<Áwó’›¶\dûû<B{eò:JÞ²@ £M¢íóÕ˜”ˆÙh^;ü;B½Š¸wáðY=ӊݬ¡Q¡ ÛˆÇ'ãó0`Ë›$?à.›X~2fKš&jÓ·ºMç~àðƒ]¦¸3;’~Õuj,~æaªm(În„àÍ:ÓäXáäƒ7ý„rùXT0ÈAw`ÕA=;Åé`Þh+½ôíò’­zãÙyÓý–¢å=,Ô¯pK~Óâ*ìKþªÍB·þ¥6 t#–M•—²üÏfš`bO`g̼ÉõÐP̺…Ř1HO gCQí&ÚØÀèÚ†”CV­Ù¼¯|þ“<¯Â5•"4ð4Å÷…°Ü¼€xƒi§¡€8ÆûÖŠØ„›Â¬Êü«ºÍŒ”V“2PãVröôLCd{ §JgŸ¤_Éò@æ«ñþ o<"Ó#¿AÍ´xš-òÚØ„ ÏQåCÑë«Úñ>ŠbçÏòM ×¹0¿z\½Hù~ã/—IïØ\è<–è ༡|ø­7ï:HS>43Ýc¶|5Þ?ðé=ÄŸ‡qî—¡Í®Ç;Pÿ W?PT:»{¾ƒ;ÒÄ6a¿¯v;Xr ïí–ì„MM‡Cœ¼´P¡Òv´ªAµ”h´ús5F¢µp·*ò¬"~S­yÅÜ¡ k²Âo¾òFN'ýÊÚš%!QäD¥ñ…AÛçîJ8”×F·ýcZÀ6™¿B)Àæ«iÊÄæ/T«»€'C†Z:Qf¼5·\¡ùú®¥M5õpÿý¼T„B!kPx5Ë£ .øjlÿÞšòd¯j-ýÞ.ËŸïahè0zk¬ÛÂÚŽÙqâ;O0°êÒ>’UäMe¨U½šy̤ßõ2;~Œòbƒ‘Ènv.Kõúá ÀôÖ4׺VwOéKu4Äi7TÎ^M?W}B©f“ÀEj-D[4¨Ùë·äÏÇËÐUÞ€-n¿jOÛþ0(´&±?Ò‚ÐÒÄR~´&#lÀÒ[·"ÉßZ,ÊACBQÒ¦h8l¬ó§ˆCh›¹ËãqÇjsÓªŒ·ÖšÓ‹ È?[Wcú ÎÚ¹s#†F½~ãîeÇfÉ;Ôhþôhóæðò‡p»àåË£¦iV÷$Nô­ý¾ûDE„ëû¾µá<ØèC|kÃ'’H{²‘4C—c¥‚wt9iáXȆ­±ÈÍ:Óß³n{,ÎÙ€(_MŠ<—”<¶ÒŽ¢éîqk\‡î÷@ÙðÕ´ÀÒ4ƒ ý­™Õ@­—NKBS9—Ô%Гó@æ­[ Ä xëŸh<Ý­µÊð˜Õª*‘A ïÙj4ãË=YºF^>ápç«Iþ|ô?¹ óY Æ™ÑËʰý>¬úØ« è«Qç ·Ãt,Ïømµ QÝqýØž­‡t ¥-×o&"³ÞºF\ßĜӀþdw²î“|ãI‡­2BÏ!»uuúÒ]ö HoøåÿœdþÃ2XѲÿàF¬Ê­[âµzCü([øCÛ/ 2H÷z /¯ã®+ØÂR_ϧ™ïqR7€ÎWãXÙhä³èÞh„\CÆ`‚2˜àvܽ!@R·îD¨ôÕ0h%Ì[w ö Z&ì{ێχÆÑÅp´¦öïP]Æõ…ó±à<ä  ôÕêÝÌ”'bô}_(]StÈ}|Ç3´Ç$ys”yC=ò¦(ó†Zæí Ìq[á1¢Q¾õKÓî\þOÄ.·˜ú¢S.Q¦ïÊEv£È…Ä ‹Ä˜?b ú«1ˆÂä«i‹!Ìè ¶í¡ë³# B K÷,ºt`fî v­EŒy£ÓèbûŒ:×rã ÷Ö] é̃x";;à걫ÈåhJ>ëbY ¼ÓÉ&Å-¯¹™?ÇA ´<‰B(BCÕñ[ˆßF ÖxJìAjh—åbÝjt‹ÀÛ2,œlÙprÊëF1†^ºñ•c'mîQ¤Èø†Z¾Û"ÐAšWKz·b†à´˜;²zÞFRc‹;9¥§ &Êhc¼IçyXéƒyJ¼,íœÛ~˜iæÊ©Gvøê @Ÿ¯Æ(4ò^¶¡˜ÀÓÛ0Ì‡Ê £=¾Âá5<è<}|kD:+î—™€d»àæ»Zj`šÀè®Æ;²áæsõG_àå¯#S­WÀð)>³&”MòûcÊUaôÓðúð3¾ ŸÁBWšÜCó$˜¢E¡‡áá|ÞÓ'ÁÈÝ“´,PØ×²zÓ¥è^ ¡Næ¡H°µáZÈ …Òè+D)¶1}‡À¯7Üw©UmÌ·xŠÃzg€>_M²ís+¿ž®‚ pa5š‹˜aœOñ ’Uãç÷ >Ù¢Ó¦‡íÎÏã÷Mos‡…N|L‘Ÿ:ßÎì‘OÀ¨:-lW÷okazp^¶¡“Åcö ït‚9z5ãœÿT#l¬F‹Ü.ûz!2ÈÃ>_ — êësÌÆðÆbÔïX¹52~F˜ÀèmÒ•Îåa†h^嚣„ìy›é„íúž"¤¬M– tW;cbâÚðùjälj¶Wÿ5 •Ê6Yº)Z >_Âð½kq0°éX¨¹ÞæA}ú4-W k(\…Ñ3 ;?èî†âämVGs{|­Jl1ýEø¼y-òzÞ´9é›å1ÞZþé3±g§˜U3$\Vi–6FŒ‰éJ“7/r×ð:Mk‘7 ÛÛ”',[Uj5»Íh“D†„6ïÚ"ÓB/)O‹×eœÎ«¡~¾_Íà&€šñH¾À®g»ö/¬<^‡¼ßNòÄÏOØ=dÏ6O^] c⽉½úƹkùqJX¿ƒÒù…:3ÇqÃi0Ïœg}3L§e`õ(1T½¡yØ\¿ €ókƒ“ÕÚ¶ëÑ¿éýƒÆ2ç0¥z\ž"¸1gVê¯F+ ·äH—¬öÄŸwð Ày?ß39àv쟽/=/¨ø‘p;ðçEÉ/•r«´$¨=&¿R«$`sÛÊÙ¯ Ûþ=ï—Ð?sw€§û—ÚQ©ÛýcZXº]TÈ]ÚA×É™Mò›cÈ=:àìýËÇŠÚ¡™ö“—ûiIýóÕJHp 6±ŽÅ‰]í¡|×Û¢’Ç›’82ìŽBå«ñfô¬hÑ*ÞÁrå;¸òê¤îŠ“ ¯×Pa®Å*Ìõƒ9ßâk?×s îz`ƒŒ†¢üJÜÎ7ކoÑðGƒ‹xp|5ÍÞx³š~öÏ•ê“ú#w”ï÷ÝL ºÃõ#qèbw-Q¾®EcÑë4P›<}ož$nVžûc vröô+¨s^ܳ۱|×ZÕš$f·ÙõÈÜÄ£58+Ÿß06 Ø:ïŸZ8:Ë1mæ¼v“Ÿ;0é«™|ÿ†½f,¤`ß?ól³øSÿ ºÎ)a«I¬#޶dKHÁoßO:Æ«wëOÇ;uƒR–/$©î¬šÚÄ“hÄ]¾Cæsèéx Ó?8 ÖþD‘{ŽÃaëtß¿pµ¨ô\ž7¿¸#Þe ^Âϳ€ÕóËqt¢È]ƒÝ[rŠoIë gìÉæÐAÿ”@š~R@ÁÀýÓÓçDÿBk܆. È/=ÅèZÄÍô]_õhŒÁÜ~lapfP¼ÌпŽzæ=™²>òD ë=™ÒQ¹©'‡R|éÉuûV?Ðs²ŠÊ6™†¬Ðqÿ­Å'Ž-Ïñ¦˜ßSz"@Ó‰/é‰^ÁYÜP_ÒÑú®Ö"wmís~F,¢w}Ä3ïü%Óv€ç剱ïv?Œ^žç¸ÙÏ.ŠÉ\:ÐçÝÑçm=1«ÙÞ“c±èÐ T¶@1íŠ>×à¬oÄþ”ÁÆïÏó-Þ¦× 8>Ñ*кÅHÍ¡']ó¡v¹jixz Ù :é=9I\µóý¸€ëI›Ó]ÝSEž²a¦zbÂDs¨3ƃ®sÐ1ªžÄÆö¤6?£ I¢¡¼×Þ“žžò^@ á9šî4µ–îZš[Rú|M‘Hôž5Æǯ²O|Õ_ã!|¦÷šI¦+„é¾®ÊÆ¼TҌϋȷ1Ë_Pª{nÁEž©<¹xþT1êw¯fÞQ½k5óŽÒêýT3ç°aìO•(® üÚ]×D>‡~àè” +fw†PxIq: š_Â;Ðè¶Ç{{¼_Àš‘RBˆSg(}gÚ – |ݹ «Ý±èµ~aÑûƒEï½Ã²Ü‹N9Îâ7[ad{èoâÖ©'(¾Cñ&¨÷ìi¬¿—HOŒût"=ÙT³~}–»”Þ•š"^4Mð—Þ©ÎiAVå¢àÜcÈFö¼v·wÊÞ ‹tTSïŃzÛ`ÑE]ÏO^‹ŽEÐ=‹C|ïçüÇ}Ø7‡eb†„<ôO÷b1Yë#öÒ{I¶€€“ïåÉìMÖNÝ çf]ã÷§lnGóÕ ÞTíöŒçW —ü+w* 8@5†ºô¸^Xª×A$¡V¦í@«wOÌÓE¿k?v@ìû¤sOB.ù—  /PPgKјù+}/ÌÝ®m­ 0â ÁæãöäDz/ÊEP½—˜šrÙ—@qÊã ᩈATýYAĺÀúj޽C£"å Ž…(<µ‡hÆfØwúcფÐKU{Ñüå-èn÷ræŵ;Ê™ã}¡å9yØ:¨S?$ÌÔå§ž¹‚±´–‰è ÙOú›W#°\Uߢ¸’Cõû a…XîîõÌ×9èT;l’¿:v}Úq¡…Abêâa÷Ã\sH}5Tå 'ÔTc†ÈÜ!"ôø=ª7pé½hL&÷ÕLK‡~nσͦèx!„ÔHLÀÉh¥\Eƒ°R«9«Jéü2é¢Ðy/Ì…Õ·îe\‡DÐ˸¶Ü¸R"`Ë!f´ŸÚæ‰ËŸ§m6í§a€Eù‹(‹uN´9•áå…„‰À0gµÞ£•;Aå­ù¦„i¼°üG†®úásÅËô流#ÿ¬ðv­nN¤¤‰ÂÛIõÔÇé]1X’É‚HiÉã~í"b½C›>æŽ2TéçxCÃ5|]¯ß%ªÎ4ÁäT±þLÇêŠPßæ"Ï ÉjØîDújLÛ"½¡¾ûWaíÓ°)OↀúM4aÄ^ mn(öÙëvq˜Ðd7Z¢ò|¯9Äìh쵘×o÷Xp¸¸e®B·¨ùŸ¡r†¢¬Ö!è"5o/AóëwöÇ—oÕÂF­æ´ÈÎçx\ìðôJpHGè|¯éê¼ì1,p~o2‘~ œoÏJªÍJ&Ñ@SŸ!¯éΦ[ªÖˆ@»2÷úˆŽÐ®ª$XßÄ—ˆ–Tψhü+ï©S Íæ²`±Â³—Ðâ Zôü¹$ðQ§¤))øÑjLØzÒ«ø¶REÓK3§Á|ÎgiîúÇwï²Xf¯ÎF`ï@¨ã}ÀRj3I øø^ݵΜW ·×bW9æ;5V–_q à¢Ã—Ú«ûPz¼×ÚûýÞrDÒBJ€Ç«=£Ô9µÇs?iE¨w”8ï5°‘"4YèzÓ`ëUÈ%uxÿÀV¡®ã[%ö½“ü^)™³†LGˆE¯ÃwHçnîú¿ÁÌžÌïË:]CµkuÖEƒjžœ–ëTtbºEð2‡°^ïKS¡Ôé ºWJ£ÁŽÜrxPõD'*(‰':éÀÌwñD'¾ð.æ{¤=¯^ï£æ_(À«‘àE8² æS¾8„16¦Cv\‘m@Û»¤mú^ ‹JûbYöTÛ‘Ä9ª½‹kKèú­ÛW§öui;—+ªºÞ%9(+jOêz’¬Úå—~U¶ø8¨ÝÛEÏßýÃøB¤ƒÜt1ï:½×—*ôŒ˜/µÛ·…ÚØëÛzÓ}Í a†ªþ ¸Â©yα(¯jÕÒÐþÛýØÊ©€½÷æª`ì½]ªõë–Ýý´½ewÿÃßÛ‰ÒÂÚ†zvør¢*Œžl'Œ à®ÒFçQo¬Ÿ¨÷%¯¬ܯ S ©º…üEuЫg‘í«w«÷¦-ëWiå7J³­0`¡·r…Až2Ô*«ú€´p±bªzóša ;ë½(ÂæÇÒÝt©è¶Õ¨’@© –ŽP³¤»Þ¢xŠ µÝ ¡wÜ{S:‚Â뽉׺§s?šý€W_ÚÓ±Hlq¸¥è¼7­X°¹Íè¬âû'aŠ44~=:"º Áe^.ôd85Sζ?®1Æó¼úQ/âùÀ3xlŽsæI° ?NòñƒúѺŽ×¼' «þIˆÞOßÎ15œ?ΙF‡N÷ u¤©:Òϰí½õk6þ`@ ŽÜ ½y 8óÅQÙ¨Å<½ë»ûFZ,°Ž@S8Tbš]5}©~¹+cøÊ€õ6|I:¦¹W‹çûÑúkðóÕ¨a~£Y‡@+,ße|½·©#ý£P¤+£ð-®²Ç ›Óma Øó«<‚æ%~¤a,ÉîxõŽºg‰ÿlxìïó!nŒlÂ]ôôN†sà×WÃ-è{?û‰]9ÛT^}oX®iÙ?÷yFMôKÛ@8ßéwR¾!Dg¯†þC`Ù{Oæ?Dóî‘ÐjTŒù 9ØW?ß%}îÀŠ®†4ºç@¸úM£;_Ö³õ®òW«˜±æœgDç!ø-”‰ïxųº)$*Œtƒj"¶ü›êžÒ%³£V"侂îuÑ;íuÃïàVÕ':ÐçW0~E‰k3)Uíš3 îâ‰/)ÈÖý¯@™¯Æ¨ Rý­†{hùÞkdÃ4Ìg”­/qÉE.£ã'¾Dô»§Ú¾ìÌ„Ã>¾ ÒW#þ]BÔJ{w ÖÑ_ÎXê¬÷îiO:-{ˆ!™?p(œû¨Þ¯îõ{ï­gÅËÖàß^ÇÛÙãO¾ç0ãèì~ØÃí ô{ïу÷©YÉ#jÐO¹újŽ4 ?FPbï¬ãþê\÷=þžtïÔ5ôz¿’õñœ;âT\-­T"½ïj™Y£’¢f/ŽÞ5òi?æ Ö'º‚&]+pòËšÁ<2 èð'زñå^â#_F£ÁÐä°TxG0ª¤u Õòä¤ïgx˜ ë]!ëºÀdýðˆQ\a¦½â Ôß~\î`Kˆ3죸„L'ÝËë(•¸ ]'Jú(Õ­þTq»8mWØúæSOâ|غv §¯ °õ®°uõ=Ò2`ëå %l½+l½¶Þ‡ó!ôÁ…Y6‘Yä;5¿Ÿ°I¶È@6‘®ÖŒ÷¸Éœ~>æA(*ݾ3žÎïSÕ“©r,tlkßõ|^£|®Ž_ 1ZZF³þ±.ˆ§'\‡Ð¦ïí@¡÷S$ý°ºÌ<úv4ƒÂX„5 6q¡Ö; öýB­ ëÙ†EË|Â}Ð;RñîVØäÏí¡BPOF÷] >3ºƒN=¢3X€R'¼Æž>ÿÂ[­Jƒ«~ø‚…º6( 3.êÑ÷kã×ä›t@?ÀMÞÌGdY‹¤w ßû)’ŽÑ„n|2›šä?6æ;¢o,“|‹Šê—èz‹ÂˆÅ]‹ÒeW2¼DïKÎì(‹Þ‡úFNÌ}'€1MÆ1bå@KÀ­wÅ­³\ÖchWG„ãÖÕ1™:«ÃÞççû4xn¦nç®u éåºbÖ/Ñ@÷>Ÿ  qó óýÒ¶à¸Pì«Ñ æ-Ô¿¢%âµrAnì[ïäûLŽ››¦‹(Qž¦‹0ê©Íáº\–_fdÔ{í3»óëWžyÎÇóÝœ(w?°õµw¥†€>‰Äêíxñš-*?øÔL_ ÔT_ î}z.8e±&9ÌÜëEU±ºa4ÜO:B<6°õØúY€”cËÙ9Q7ÀÎØ•ÞaÔO﵎3þ Ìä‚É<ÙÃá'›M¡À„´Ç¹E<¨tßÄFU…r²§lÎWÝìóˆ\Þ§‘ ¬Á]&dä^ãÒ^ඤk~7 3 ÕT°˜*¦-AÒ<äâ±”ZKKAð™`"sjÍKÙ” ABî¡ðzwðzЮO ÔN¾OÇ0Ñ•âuÖY^÷õFÂ$ºšä4ÖæaLxöÕ°}_,Qf¯nÖa_ö Ë)’Ž¡‡ƒföþ¸ï,•ÃjunÕ`~Ø'iÝØŒ±¼‘Â8æ8Ò3ë´-áÈ{£ÔTÖ1aŸ˜W…¤¯0¡ÛùŒÏeNuôÃyÇg6,šEK„  Ï‹)²<ÞƒEÑSó$tسˆI¸êL²Dö€»}Ys9>S>Îÿè÷uš©÷€²²‡G Ô=Ÿ&틱$Á;Âà‘ËðëuÒÍQi”ðû¡OYû—ñ.ù à€Ð:Nô½žPÓ­káO¥ë3miv^qk|Ä|Ь<`;^'}N~½)d\uÒÇÇÆë¤¯5ÇûXÁ¸>¹à¼Nz(\uÒi‰Ÿ¯:V ‰7ìÃë¤ïU[5b63=» `v1éÜ€†:¾êƒJ “È ÀÛÇWgx~}ëáàzIÆìÿ"¯åøÄ ¿L*ö½T”‡ÛñŸaø^Øý@}òÕL¿'6GûØgAŸÛ‰JÇ£Å<1ã é¡3cˆºÁ|ÇÇ0Þä¤ÅÜL£éò²Oï9ØH +"%­ÛGB@ÆWd€Z—®ÿûø¬ÜÔÄ}|Ý$‚Áêè—%jY?¾ #аrûð §a#Õ§¸NsŒ€(±ñd:Ó“Yeë¸ÀÀ´2Ùâ’}|‘µ‰™×)„!õ‰0ƒÓçŒã’{ôhõK†ºÊ£ï÷EJÌ*ÔáàwÎq½Ð,%Õ.ž t£ÜÇ:U”u M² €z d¨‡õü0”:†«£‹bIÓç_%ëXçôãs´Hô÷€_gJ¤[—q½‚[`:4S!F.?™¡Q ÔùGÞ¢i#«iæjà @¤Ó]wžñ‚4[  Ý‡×GgÒÏ'þu0p¡R×îó7)xxÙ/Ê<ë÷Fò‚;#œç±ˆVF'ŸÀ¦­Œ>€^}'?bUH?5Ì™ŒÄ^økWô´žuK'mœ~œÏd¸)é ëüÆ ÷ uò’Ì\HâËRØxXi©¾L}1-có>’˜À7°'F )jwÆÖÏâuF’8Ú25FpÇüÑot˜c¥G!Ž~È6€Æ¦Ü𔪣Ë2!#YVAæ…®1 ­¯FQ”ù/DFKÓÐ|¤îK T7±ÄíúŒÉëÁ嶾DZ‘ãÀ‹°jBŒ˜!E¸¾,ÃÉ@ñsÙ…ZX5²¤¨·qJ- vIT>×r°~“q_eIÐæyƒ£ü<ÔÕÆIg‚·õÏY€ê«!ª}ädœõZÓŠ È©·Ç%ŽMp é8©Æ ï$Þ?xj·8Gºõ½¿} £u0c²I梲ŸÌæpšCiŽ”Árè=ÇU b5EJcøG³ÄYšJ:øTvájŒ,d.Ú§ ›LˆŒÇ©î™iM¾~“1Èêºþ•ž ÂÈ®q ÂidÕ8]Ù5äfÙ5޽zä¼ËÙF Â'Ú>Åh¥ò8Ü×X™Ì·h}ç>mÞC°ŠÜ}m܈™oäà:}5:‚ Â9fz¢ Yá2’Þ„2s£uÝ·‹iÜ„­qrrDÆwg Ðd¬¥Æ%ÁàÝïX*cÜìi‹oXF˜‘uáèô!Ûh™ °½(úÈš˜ždBJ%‚`ç¯ôŠ®‘¯Ñ˜l,þ ›;Ñà ìxçòQ0YŸ£Gú@iô[Xð|\õÑGÉ¿¢bÕ$®a¸8ô§ »jPÅvl†¨TºÍÁ J_È8t”r‡îbnÖÐzì"œ}!îãÉv¬Âg±,EXõ¡ñL,|+=&ÿƒŸ|G9*þ(‘fŒ>ŠFív“xI˜ƒ-ËÎÇÀþc¿2 ñyýF©nŽDÜÂå뿳J ZÆÊ¶Ti²ð%8çy°TÑ ¦ÃÒ Pìqð3œ`èbE\iFªQÄÃ]@uÚ 4ès4–d…š·E‡‹‘ßΟ|'1Ѹ¤ù(í¹?fÁ¹*°BB'Äc„@pÓàºuöß+r¼?ø„{æÐêCay@÷QQ˜d¶HŒçì< èóÕWFFþÛŒôùÑQ­d”M0à1Îù7IÁM¶·˜ç«$RxW(hÜR1]`Ó4ÈýÏõ6_H醿Ð@§æç[t¦¸·¨¥W¤§Õ&äκ£ýáñQž41é“¡)å‰?cŸGlÚÏôþÁøT½ÊT­î¹9­#{ò{®†ýi_—Yð){7Ïbx±ô¨úP(úùEg<[®VYYËŠŽhÇ×€¢oÙñWÆ3•ÂQÍÅ6ñ4ÉMÀ_z2ba þ`¶úAþf•ÒÉÏÐód¶ú%å㇣zÐNŽ÷9ªèH°D~jefåî¤In.SØO‹&UA‡ÉQ$d%ôKõVüX¡1‘£–›cîâk6J´JC„,É5êûÛ* Œúpú@ÈÉ8ª)g¥„¤bê»è±(—æÙ³%šŽdÓ/ ÒG­qù<©†pÉõÝÂ%Ç1ÃítJ¥o)ÊtÛS fËŒÊt&¬MóTg@!_™"ëGÅ$y=€yêqK·’¦Ã¿HNªxÿèa¶×b(£º[q«Ñ 7ªâážrec=Añ1Ê ¼ò¨ Ãn,úö¯T7i6JúÕ9€R_/ð“Útû6Ft㈀¼Ú\Ʀԓ‹«—¹[2‡¼¹=„çxQ&µU—f!1 ±q IkGíÞÃÎï»LÌ©=pMû•¶uD¡@ô¡@tæ"ÎÍ«¦Q+;ßÏù$P:¨'V5f5ª»=xýU†¥2c.$÷j´Ž'Ü$‘ØðKkꨖ~iiˆ7ñãÕ\˜•Toú³:¡-œ±¶0ä÷è(»¬3iŒ¥/Ù~<ô³‚΄ã¥ÕH ‡Xnw~1,@ñŸa¼æ8NÀ¢KRš†¼Ñ»sb@#eþGuA‘’âý°@ÅJK ¬Í!,-5džP¢}’Oèû—ííøŠæÝÝýGn„'/ñuâÞr‚˜Tþ9¾OöÏfÕÂ'Ì ¶ú`±ü É‹¥Slˆ-ȱÄtÆá!§‹ûjiBÄÖÜ®ÀpžÂlHôÕd*0YvG¾SP~45àÐWc| hõ!Ì‚5p<Ä6Y-4öK¿?d aCª=¯|Ñw)Ì…è|ÊûjŽŽ>—7ÎdåË?èk5²6²¾wÿ:þZ“Ûb!ÝÒWè¾Iq߈kn"Qs_ý#¸vË>ÕÛª£!y¯ ÔÐÑV4€4Ž<@› ÏZÖ¸Ðù¬Q›vð# 8®V#ÇtXZÖX Î à^‡¨ û Ðmš/×CŸè´Å<¤çÃG³<ïÇ2I–Qi—¾š§°jÞÒÛØ…Ù¯þªÞA§¢™‡¸ÞbíC.½©†œ4X\y8Í»“ïYa †7ÌȶD_Í•‡7èdÓ°œ5s)P§î®ÇùÓ™^ûŠâ:ÔJ”:ÝUº†–G>!A¾aì’©û ëBCm¥9&\ÏþÌ£¦>âêCj>]0ü¬Æˆ™ø²y¦˜R×qgÒG³Ý\Ð8‰)ï“Ýj{ó±ÐmWg$Xˆ’-Ùq+Ã2]‹,ßçƒì6ç@©…Sî«É o°6i  åFÛy„å1@H½õ×ÎGÿœ{¦¾¾“{V3ZL€%D†©iŸQHÍ`1øã(Gçþ™÷ÐÄ—è¶´šý±ÞSÓiÙäd¨ÉC«£ï€á¿ªü¥Þ€Vb™±0úhVØv°2:ß l§YUÛ$ý8ò˜9<Û °ÂÉ/Û2)è ÄÅvª‚‘â’ u(wtÆØj‰‰òÿ@aò7c vêF"c-˜pä«Ñ,ÐDýZà¿–w¨ÑÅ‚:éà £ Á†FÀ¡S}»³ßÛ8Ξ nrc1ª0ÍÕɇ¹7¬£i9µG $§ÛB†ºéëG]wð‚4ËX2€qÍ3– FïÍ`6'òâ‚ (%ø\X|4¬4ËtŒâ̓ÐzBD`¿(´Ûà‹@xŽæ+”cY M©K¡R(KȉZhg0ÓÛˆõJ´ÕPÇÄXOFÔÁï6€:^}–>ÚPÉêFA‹ò¨§Éh\ÏÃÇ e{!ÖáU šœªèì*Víˆ0îѺÞÐâS!“!5Ö´E^¹§üK-¾?æ/ýxe>ÍUÊh®„¸º~8i•›«1ú§ÔL©[øõ [ÿ¢ŠZn1@`¹ÑMåýx=®—­ÕÃ="?ëôÑ-Bw 0aôÐ_.ß ©4z2ôÝè) ïFO1eÓèÚDu˜N\],"íéLu}E“þê|t‹¸ð·Îþˆ¸‚uñÒW*HyÝ\ p£g@ø9:3ðØG7µƒ)í¬¢ï­Îk=¢ty‰ý#Ùˆc0ñ7B—D¦{„.ƒK»#kQ®Ï5‘ÇÍ6àÂ^Mãê=¬Ç®±ñ;óIù€Ýã¬à÷½šÈ§;é˜Z±“€ðÇøEá"S¯1h­}G'e±ŸÑƒTu´^ lZ5e‚Q_`¸‡VDÇ7ϘØÿ"l„æ¢"Vi°¦öѵˆ¯¨%]S”@¹|Yj‡_¬@éBWS€çã¨ü/¿±åçü)¾5Ú³5Ú»5ophÕ«r·¦Œ5£·åÑWŠ…­ï%ÖJFSý‰‹¾@EYžTMx’ѯ½ÝÙ}ôÚXGCÙ'wÔ1zWÞˤ=—-Ùʾ8a°uËu5€E¨†.ª]LÇw] 3”´œ¥°ë[½!ˆˆ®}øºSé„u ÖG÷«ÞyîƒKèŽêîeÓ0¶O¾x0®ü»²¤¨nC­&œÏ{zÁG:tÊ+¿u†ƒ’ _+5Éoƒ`äÃÓlUPÁ±aåcüRˆ”)Ž/2EBçϱ] ¶ÇÎùLNBÀèšk‹<•ldŽ1’Ò˜+ð)ä zã¸r]ì#1› üìV7yÆ-3ÿ¾0s%RáøìaRCzŸœÙ˜Ð”ö¬C8€_#¢¯9¼En/ÀöÀËWl´\ÝÊ$ °Õc)uS>FV?4ëSŽ/ƒà¥+ú¾áÕ.[Jð;ky¤ˆÀ—¡©l6ÿx§ÞÐYƒÁ„¦‹1¬áž} ¯A¨›ex ‡ï8UÐÁ'paý°H0œàã੽ðŒ°û#—PÎè&“˾c(^\ŸãV¨1þ} .ŸË^9h¨Þ„ø¦wPŹä®:h5bñà¤ÞÁ ›VHàû=uçh{ “ËJN9¾_Kú~èJã¦w`ÅŽá”Ëê.äû4Ý­ÅýGDù½ÿo ÇLMj½Lo!w#fÜ£ËkM3H#HNt3H~v U5Ä ˜áª³¤,bz‹±^Äe}ä…–~°N‹ºk…» òHˆL;ÝÆ‹y¶hŸ¿&ô‰¡® ÒǦŠ?ޝØWúpUüC_·êwn?÷œÞs”U ÜÓK#¿Ûá]Ô&aŒéuÝbVê×_‚>€(_Íôά‡ÏÏ-Ì)è‘„œ¯ãÖy¢ö÷‚D¼çj,>¹q ä›a±~Ë>®¥Ï¯xù˜ßï¼]ëKÑÂü(ÒT¦9Æ+ É6sŒT˜ÉݦÓÕ.–ñîO™nfþÕr`ÔgÄ$;fºœ“*«+³înØ–=C•3bs€oÛ3c`€â¯§öíân£ðø˜ŠI¨pL’-ÎüH+s{Åç §$\e¸Eñ¨ŒÔ~ L“0'G“XÀ=ûTC½–qõqp‚O–›_nW åœÕçþŽYÏäÒŸBYýâI°ÝØù¾š•öQTH>ÎwÅlEãÚj¨ÎmâÔ¬>„u>«“«o¿‹ªÁÏ¿å«Ë²ÎÉœCùUe¯V‰âÊñjÖqj V\jû7žbSXò15zjØN)UKôà=¦ëù¨}6æë`êT5˜OF‹šüÈåXbùÜ㘚ž4Ó6ŒÙ_mCQV±>ߌ{L—X€=_ßÉoLÓá€PÓÇt8à^ÓÝ Æ´X8až÷¨Ð¦dùO:ŸèKh°ü©ï$êôÁJ#8¨¨õÁ‘³fG 3ø\6_M³%=%n©Áûíçc¬ðùf}œÂç{ÉÖž|„æhv|5n`&ßr åcö«ªd ÞÛÓáÉj¢G¤V¬?à+Gc/°ž?¿Ï"»ò1ՆР†¾Ðû0¿à žpÚN“7 @­ˆ‰m±|*20s×ü¾¯ço‡FO€ÍçÇ|ˆ¦ây°ä{{Ï“Ôè,©ùyáÚÕü¼pí€d~^¸v nîüL°.° Q:¿úÌm5¼ú<¬1Û-1-Ÿ_Hb±˜¬AYžxÖ ùY†ö /Ãj ß>­¸h+Ä¡+± ñíëÄvÑ¢SAñࢿó+ß±aLÍ-w¹q34À„}~¡<7HäjÐÿÙñRó öÿÉ"è9…ø§ù±î'ó[˜yz-œ~yæx=îY¡_ß“vM ð±ùU³×ïEp4ŒlÁ"ð+5#yI0ÀØ{÷ ò&ãöDmO9mƒ3*¢Îi@?C\ñš‘qðòl %Áæ'ÆŠ×gÞÿÝÏ«ºGD†/3[ÍË+¤D$„Â;G»Õ~mVù_… X˽>&kžDD\ Cü;orQDü¢œ9ï·ï[ïÛ–`‰Ü°òKÆž€–ϯ› 8¬Üæÿ°›ÿÍF8ÿgôC&R¬ÜÃÑÅëj^¾dY•¼µ*…©ž¬Û9f\ò76Æ2Q!}~šg•¹~¢Åx²Š™§J†qøf$hêù‘‘L@Òç7|‚©={œþïês<-…ü^ óÙã^ºv¢zúj<Fe¥¨‹V^¤¥fPª÷ñvÏÄ@ßÏ‚šoËâ@y££7 ŸÉrÈL”O]ªÇ6='¯V¼ ”•>8_M1å´lâ¶ètŠÞè>┦ÔmÛ1)¥ÇåO ûfÚl䈳ãbu˜²äIÚ'lG3esÃB,sÆ5\yQWgÊâSbØSrRëÚ”xÝÁ ,ú<ú$‡¬ùÌw%Þä(%ä¼x«ÃLhÄá– ÛUmSm~±BêZ|jtîÄë|z ÌFhçãMŠOsÁ‹Ôïnƒ$/b—'BgR8}©9(­sÙXz݉”T31-âfÆX}f…mÎÏŸGD‰Ô®eÀ“kš•ÓžÃÊ·Œ8YýJz0'ÖâuÉšK#º¯×9¶W‰6¿¬š!ŒÌ!þPÒëN™šOšOÍgbNÄ ÐúLæý`iÌËsZ€¶{,;†£™vÁ(ÄS>9ï:'·ùä‚¶§®{°§8˜ §»(¹ æ-yJö™ºùwfйu'aðŸÜº¨õy°Ü#q“çh/”+®´ŽZ‹1ŽXI%n[{°V¤æŸž€’³Ù÷Â-3Ìö-›ZŒö*JF3ÉãÁ™@ƒO¯‚>!¡M­‚¾>ã¡nÑBÈV9x©#.³¤«¦Lƒiy¾zòý˜ˆgßkbÇ¯Æ ½Ïl˜Á ¬ôú®õ€?yu4æŽ4_«Ñ]D1ÍlaWbàÌv53­Z¿×Èw©ÂWV$G7ÈÌdÒ|¯Óg6/ùl)Á0>Q ÝX¼¢-0cÂI¶>_eFœÙR„kýiË€™™IJXI³ ï0pʾŸþ€ögã$Àô©…/ôüGÈj,8–hèA Þ|æ¬#é$[zÝ XüÌž^wæ’MI#¿wq'{w²A>f~J}Ìü”œ€¯Ïƒ9Ƕ€Ð9XÒAÌü™b–~TñJF33Õä/Nj æ· àùÌÕÙq¶ô­ô“=β™v3Îñ|FCôÜ“Nu[¾šäÏÃ`È Zª(‰÷ƒaæUcÚ®j× EÈè2û+¦v?³¡UíæÇ™£·gf÷†LV#¹hwVµäš3®ØÍLnwä’‹}ÒÛuƒ‡VçöÐj`w穆„ÜêIÎÜ“OQ·Œ·Û7|½”ç¢Ý2Oàȧ&Õ"Åâ8SZcZ¯ θI°è.;"¿[³s>Wçµ½raXì§W@Ÿ(Þ>czr(®TIýún"JQRÍc>3”ͬEüü/‹ÂQðyÁ,ÏLL6–§iÂÈ7ót¦Í×vªSäù±ÄÉT[êyr ï’K¼$ŠEÐÕ·¨Æî% Á/£Ë0}50NOH2³QṘí–\ÌÒqDSfù~…M˜%YÅ#?΢Y̦2K_ ç ¿{Ž1sDŽU,G;1\ÅNHÏîÊ|/4@ãc;„6¸ÎÉ0µ:¡o¸1tÔY4¼vƧû¤AÔ“L ÓWC*^³˜‹dyÉ.‚H!_Û"xÈðüvÙ¨-“çÏRâ`Ô•u ØLςǼ@–·Øè¸|5Fì€U_ÇŸ†·2K‹«¨ ÓØ«`°DŠ_€ÑgQ•–ãYúQß&ÊœÇU}©l/‰E ˜ ¢l­t§4œõcÜâµ,èú,ýöÂn{-§pzþké)1ÎÌ*²ëÇìS2|ÝqJ¼ÜK¬Æ"Bj<+ÃÜØO8æ„`Pró3ø<óƒ‰ä!OÙß 4újò¡•¯ BS.ƒ'pÓ«NÉä¦11~ =ý›#H*Enqc×/ªì€¢Ïú¹¸Š°¡Y·që–TΨSZ?7`fÞÕ7rýžŒâç³~×F†¡å@Ѓ±'–h™5¹ýí@ìÏÖ°-UÉ)_Tr"îÎá0èü5Ře0‡wMa­†!å°„I kd‚.Ùbg&0êëGë˜>éýÓRÖZÜà}^ž¸ ú¬t’ÌÊX=Ÿ3¥Y¯mˆò³æc~c¡À[«càã%MR™ÕK~L@Ög-A«û~‡)ª†'œZ=&sb9»Úù *§Ä-[&O(¼-ŽÕ;â;ŽÁ §Ý¥â1'Æ+N-…®eŸÔœð´®ã¦ &=AçÏ3Ž/8Ï 0cbÝv­Ë‹u,-UJoFõþï“E‘Ÿùˆf{¶~Ø›„†7:* ÙÖ/w.L5–›ÕJ~P±ºZØjÞªàW=tÆët‡ËÁdkÔëQ}ˆ¼¡ôN`Ð  xÁ·§QÈ{k›¨³1Þpû¬}—tùµIÔóXÝÚU{sÂÆQ-¾gX?« Ü“ØïÁÛUtGŠ“8ò_Mâp+?@³^¥£@J´òˆöõ0+ú¦kžqõ¢l0µ:qù*ä‹pšG©˜(‡>«Kt€­¯¦šâ幚ˆì~p4žžYÕIºN-$’™U‰¿ ±Ñ'îÓè¥Ý§¼N’ãG´ât<¡SmaïxË1nñsEãŒåç§ÖGua•ÔvÝ#’\'–ߌ${‹)i›ßDñ€ÙÁ_ ”zòN Ç熤“ž=!Zt´æ(ÏqÑ8$}’>’>1çsãÒ9D *}i¾' žÒ0I’}“ÈÃI4“Qþ% ÿ›1{qã–<Œdè5åb$-L)%Ü‘þóéæ=)òù/2…Šè±¡Àó©ŒCÈD_ 0õ·#ìzJõ!’×ßîùtˆ}M?¦÷%)ÙVw…˜~iï"æÜx…ü•}á˜rH¹@ÅÉ ²,ÏMç«WÈá&OðŠ£'2þ°w ¹n´¹‰ºµx­;!#„ Ùn÷µ›Nm‹’q¥Bc†(õG Á²ãÜ0”\VŸb&.•âäȉ6WýèØŠËô@ê'`àSóW¦F‰ "& èWò¶‰ÒèSK£Oá¬\3Gnò{3ì\¶·íí#4…¶W3NŽDl¶þ-pùÇ.јVB·ˆ¸½´ºw‰Žø»Kä,w— Ì´Ëý<ÅÒ¹œ¡¾xX>0Ì6n» l¯YqG ÂFâ[ËnLâRý- “8ÛëIió{Þ´½MŸkF¹“ XòØ…Yß.Ì2œµÙî¹-ˆE™íb/m¾ ~Ó.ö‚ íóÄÍïèÙÕÄ €ùÛ‡JÍ>ôï/xt¿ì_,™~÷ð÷Ù·Ú24Ìÿ“ì^tjö{[òðÊË¡ø|\r"…y{ž€…@Yºš#}±2„(ÌqOúrú ž]*ý&§Zú±Ðl´Áìù—q7µ„i“¹nÎæ wñ¨Y„ùízóÌÆ-ê´6Šsw*‰Ý¡%Øô8VcOt,8lŠ9¡ZçT‹qéå·éKì3™{tÍ0®ç²ØÆ>»›ºP·|*¬}Ñ>Œ}èGûŽÓ@¥»•&äGûÎåÁÎziB¾íŒ(ví‘›†f¯îÜé½KŸàö®Ù©£¸ÞªiªK¤Áà÷ÝUE²_AÏU>\ Kiºti~œS°çá~‡¸…û¯ï”Ì$û„’0oÿ J°Ïƒdç*ý­7—:g½¹¼€˜³ÙÏ&Ĉ³95nAVϘ¶°¨?„ćáâhüxHÍyŽn"è&=X\öÂ[µ‚ƒ\Ûhhö˜ZRrŠzŽOO…³Oøÿfß,dÝ/ϳùíä² ô=䄘0НÆlq(–:g?¬¢[”¹‘ìg2†ÑÜVÄgæ1qæÁDsìçIY„ÑßõÎ~T…0:û©Kˆ÷žíÆ*À7*µ|’ÎdþŒ\ÍùçÿL V·fgolly-3.3-src/Patterns/Self-Rep/JvN/Boustrophedon-replicator.rle0000644000175000017500000002537413151213347021641 00000000000000#C Boustrophedon replicator #C #C This is similar in design to Hutton-replicator, but with a #C two-dimensional data tape. This facilitates quadratic growth, #C unlike the original Hutton-replicator, which grows at a #C linear rate. Langton's Loops also grow quadratically. #C #C The dimensions of the loop are controlled by two seven-bit #C binary counters. It is a fortunate coincidence that the tape #C fits in this loop; the next size up is twice as large in #C diameter! #C #C The name of the replicator is derived from the ancient #C boustrophedon scripts, which alternate direction in the #C same way as this tape. #C #C Adam P. Goucher and Tim Hutton, 30 July 2010. #C x = 126, y = 129, rule = Hutton32 2I$pAO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$ L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJK O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$LIM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ3KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$L2IM5IM2IMIM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ2KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K2O$LIMI4MIMI4MIMI4MIMI4MIMI 4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMIMI6M2IMIMN$ LN3OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO2K$LI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMI3M3IMI4MI3M3IM5IM 5IM5IM5IM5IM5IM5IM2IJ$LNK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5K$LMI4MI2MIMI3M3I3M2IMI4M5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IN$LJ4OKOK4OKOK4OKOK4OKOK4OKOK 4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK$L4IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIN$LJO 5KO5KO5KO5KO5KO2K6OKO3K3OK4OKOK4OKO2K3O2K6OKOKOK2OK4OKOK4OKOK4OKOK4OK OK4OKOK4OKOK$L2IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI 4MIMI4MIMI4MIMI4MIMI4MIMI3MN$LJ2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO3K3O3K3OK4OKOK4OK$LIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIM I4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMI2M2I3MI4MIMI4MIMI4MIN$LN3OKOK4OKOK 4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3K$L3IMI4M IMI4MIMI4MI2MIMI2M4I2M4IMI5M4IMI5M4IMI6M3IM5IM5IM5IM5IM5IM5IM5IM5IMIJ $LN2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK OKO2KO5KO5KO5KO5KO2K$L4MIMI2MIMIMI4MI3M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM2IJ$LNK4OKOK4OKOK4OKOK4OKO3K3OK4OKOK4OKOK4OKOK4O KOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK$L5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIN$LN5KO3K3O4K2O4K2O3K3O3K 4OKOK2OK4OKO2K3O2K6OKO2K3O2K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L 3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI 3MN$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K2O4K2O4K5OKO2K3O 2K3O2K3O$L2MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIM I6M2IMI6M2I3M2I3M2I3M2I3M2I3MIJ$LNOKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$LI4MIMI4MIMI4MIMI4MI3M3IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LNK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKO3K3O4K2O4K2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L4IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI 4MIMI3MN$LJO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO3K$L2I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I 2M4I2M4I2M4I2MIMIMI4MI2MN$LJK2O4K2O4K2O4K2O4K5OKO4K2O4K2OK4OKOK4OKOK 4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN3K3OK4OKOKOK2O3K3OKOK2O4K2OK4OKOK OK2O4K2O4K2O4K2O3K3O2K3O2K3O3K3OK4OKOKOK2O4K2O4K5OKOK4OKOK$LM5IM5IM5I M5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MI3M3I2M4IMI4MI4MIMI4MIMI4MIMI4MIMI 3MN$LJ4KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K$ L3MI3M3I2MIMI3M2I2MIMIMI4MIMI5M4I3M3I3M3I3M3I3M2I2MIMIMI4MI4MI3M3I2MI MI3M3I2MIMIMI4MI3M3IM5IN$LNKOK4OKOK4OKOK4OKOK4OKOK4OK3O2K2OK4OKO3K3OK 4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5KO5KO3K3O4K2O4K5OKO4K5OKO4K2O K2OK2OKOK2O3K3O4K2O3K3O4K2O4K2O3K3OK4OKOKOK2O3K3OKOK2O2K$L5IM5IM5IM5I M5IM5IM2IMIMI4MIMI4MIMI4MI3M3I3M3I2M2I3MI4MIMI4MIMI4MIMI4MIMI4MIMI4MI 3MJ$LN5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$ L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJK O5KO5KO5KO5KO5KO5KO5KO5KO5KO5K2OKOK4O2K2OK4OKOK4OK2OKOK4O2K2OK4OKOK4O K2OKOK4O2K$L2M3IMI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M 2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MIMN$LNK4OKOK4OKOK4OKO3K3OK4OK4OK O4K5OKO4K5OKOKOK2O2K6OK4OKOK4OKOKOK2O3K3OKOK2O3K3OK4OKOK4OKO$LIM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MI2M4I2M4I3M3I3M3I2M2I3MI4MIMI4MIMI4MIMI 4MJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO $L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN 5KO5KO5KO5KO5KO5KO5K4OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKO 4KO$LMI4MIMI6M3IMI4MIMI4MI2M4IMI5M4I2M4I2M4IMI5M4I2M4I2M4IMI5M4I2M4I 2M4IMI5M4I2M4IN$LJ2OK2OK2OK2OK4OKO3K3OKOK2O3K3OKOK2O3K3OK4OKOKOK2O3K 3OKOK2O3K3OK4OKOK4OKOK4OK4OKO2K6OKO2K6OK2OKO$LIM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MI3M3IMI4MI2MJ$LJ3KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN2K3O2K3O2K3O2K6OKO2K3O2K 3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OK$LMIMI 3M3I2MIMIMI4MI3M3I2MIMI3M3I2MIMI3M3I2MIMI3M2IMI4MIMI4MI2M4I3M3I2MI2MI MI4MIMI6M2I2MIMI3M2I3M2IN$LN3K3OK4OKOK4OKOK4OKO3K3OK4OKO3K3OK4OKOK4OK OK4OK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KOKOK2O3K3OK4O KOK4OK2O3K2OK2OK2OK2OK2OK2OK2OK2OK2O3K3OKOK2O3K3OKOK2O3K3OKOK2O3K3OK 2O$L4IM5IM5IM2IMIMI4MIMI4MI3M3IMI4MIMI4MIMI4MI3M3I3M2IMI4MI4MIMI4MIMI 4MI3M3I2MIMI3M3I2MIMIMIMN$LJO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO3K$LIMI3M3I2MIMI3M3I2MIMI3M3I2M3I3MIMI3MIMI3MIMI 2MI6M2I3M2IMI6M2IM5IM5IM5IM5IM5IM5IM5IMIJ$LNO3K3OK4OKOKOK2O3K3OKOK2O 3K3OK4OKO2K6OKO3K3OK4OKOK4OKOK4OKOK4OKOK4OKO3K3OK4OKOK4OKOKO2KO5K$L4I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IN$LJO5KO 5KO5KO5KO5KO5KO5KO5KO3K3OK4OKOK4OKO2K3O2K3O2K3O2K3O2K3O3K3O2K3O3K3OKO K2O3K3OKO$LIM5IM2IMIMI4MIMI4MI3M3I2MIMI3M2I3M2IMI4MIMI4MIMI4MI3M3I3M 3IMI4MI3M3I2MIMI3M3I2MIMIMI4MI3M3I2MJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L3I2MIMI3M3IMI6M2I3M2I3M2I3M2I3M2I 3M2I3M2I3M2I3M2IMI4MI3M3IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN2OKOK2O4K2O3K3O 2K3O3K3OK4OKO3K6OKO4K5OKO4K5OKO4K2OKOK2O3K3OK4OKOK4OKOKO2KO5KO5KO5KO$ L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5K O5KO5KO5KO5KO5KO3K6OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO K2O4K5O$L3IM5IM2IMIMI4MIMI4MI3M3I2MIMI3M3I2MIMIMI4MI3M3IMI4MIMI4MIMI 4MIMI4MIMI4MI2MIMIMI6M2IMI4MI4MJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$LIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ3KO5KO5KO5KO5KO5KOKOK5OKO2K3O2K6OKO2K 3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O$LIMI3M3I2M4I2M4I3M 3IMI4MIMI4MI2MIMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2M3I4M3I2M3I 2MI2MN$LNOK4OKOK4OKOK4OKOK4OKOK4OKO3K3O4K2O4K2O3K3OKOK2O3K3OK4OKOK4OK OKO2KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO2K$LMIMI4MIMI4MIMI4MI2MIMI3M2I2M4I2M4I3M3I2M4I2MIMI2M 4I2M4I2M4I2MIMIM5IM5IM5IM5IM5IM5IM2IJ$LN2OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKO2K3O2K6OK2O3K2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L3MIMI 4MI3M3I2MIMI3M3I3M2I3M2I3M2I3M2I3M2I3M2IMI4MI4MI2MIMI3M3I3M3I3M2I3M2I 3M2I3M2I2MIMIMI4MIMI3MN$LNKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO KOK2O2K3O3K3OKOK2O2K3O2K3O2K5O$LIMI4MIMI4MIMI4MIMI4MIMI4MI3M3I3M2I3M 2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2IMI6M2IMIN$LN3OKOK4O KOK4OKOK4OKOKOK2O3K3O4K2O4K2O4K5OKO3K3OKOK2OK4OKO3K3OK4OKOK4OKOK4OKOK OK2O4K2O4K2O2K$LM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI 4MIMI4MI3M3I2M4I2MIJ$LJ4KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5K$L4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IN$LJOKOK2O4K2OK4OKOK2OK2OKOK2O3K3O4K2OKOK2O3K3OK4OKOK4OKO 3K3O4K4O2K2OK4OKOK4OK2OKOK4O2K2OK4OKOK4OK$LM2I3M2I2M2I4MIMI2MI4MIMI4M I2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIM IMN$LNOKOK2O2K3OKOK2O3K3OK4OKOKOK2OK4OKO3K3OK4OKOK2OK5OK4OKO2K3O2K3O 2K3O2K6OKOK4OKOK4OKOKO2KO5KO4K$L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO2K$L4IMI5M4IMI5M4IMI4MI4MI2MIMIM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LNO3K5O2K2OK2OK2OK2OK5OKOK4OKO4K2O4K5O KOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5O$LIMIMI4MI4MIMI4MI2MIMIM I4MI3M3I2MIMI3M3IMI5M4I2M4IMI4MIMI5M4I2M4IMI4MIMI5M4I2M4IMI4MIMJ$LNO 3K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5K O5KO5KO2K$LIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM2IJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO$LM4I2M4IMI5M4I2M4I2M4I3M3IMI4MIMI4MIMI4MI2MI2MI2MI2MI2M4I2MIMI2M IMIM5IM5IM5IM5IM5IM4IJ$LN4K5OKO4K2O4K2O4K5OKO4K2O4K2O4K5OKO4K2O4K2O4K 5OKO4K2O4K2O4K5OKO4K2O4K2O4K5O$LMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI3M3I3M 3I3M3I2M4IMI5M4I2M4IMI5M4I2M4IMI5M4I2M4I2M4IMJ$LJ4OKOK4OKOKO2KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOK2O2K3O2K2O$L2M2I3M2I3M2IMI6M2I3M 2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I 3M2IN$LN3OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O3K3OK4O KOK4OK2OKOK2O3K3O3K3O2K3O3K3O$L4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIM I4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MJ$LJO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KO2K3O2K3O2K3O2K3O 2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K$L2I3M2I3M 2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I 3M2I3M2IMI5MN$LN2OKOK2OK4OK4OKO3K3O3K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KOK$LMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4M I3M3I3M2I3M3IMI4MI2MIMIM5IM5IM5IM5IM5IM5IM5IM3IJ$LJ4OKOK4OKOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K3O2K6OKO3K3OK4OKOK4OK$L3IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIN$L N2O5KO10K8O$27IJ! golly-3.3-src/Patterns/Self-Rep/JvN/read-arm-demo.rle0000644000175000017500000001142213151213347017243 00000000000000# Read arm demo. # Author: Renato Nobili # # Controls are provided to direct the read arm (r-arm). Set the machine # running at a slow speed to see it working. # # A pulse on the input line (IN) causes the pattern to send one of two # signal-trains down the output line (OUT), depending on the presence (1) # or absence (0) of a mark on the tape at the current position. The # reading head then moves forward, ready to read the next cell. # # As with the construction arm, OTS (blue) and STS (red) lines work # together to manipulate the cells at the end of the read arm. Various # coders (C) and decoders (D) are used to send the required signal trains, # which depend on the output of the read operation since the read head is # left in one of two states. # # Other controls (not shown) are needed to retract the read-arm. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: RW-ARM_ADV.JVN # Redistributed with permission. # x = 124, y = 88, rule = JvN29 13.2pA6.pA2.2pA2.pA3.pA4.pA3.pA2.2pA2.pA.pA.pA.pA2.pA2.2pA4.3pA2.2pA 2.2pA2.pA3.pA2.pA2.2pA2.2pA3.2pA$13.pA.pA4.pA.pA.pA.pA.2pA.2pA4.2pA. 2pA.pA2.pA.pA.pA.pA.2pA.pA.pA6.pA3.pA2.pA.pA.pA.pA3.pA.pA.pA.pA.pA.pA .pA.pA$13.pA.pA.2pA.pA.pA.pA.pA.pA.pA.pA4.pA.pA.pA.pA2.pA.pA.pA.pA.pA .2pA.pA6.2pA2.pA2.pA.2pA2.pA3.pA.pA.pA.2pA2.pA.pA2.pA$13.2pA5.3pA.2pA 2.pA3.pA4.pA3.pA.pA2.pA.pA.pA.pA.pA2.pA.pA.pA4.pA3.pA2.pA.2pA2.pA.pA. pA.3pA.2pA2.pA.pA3.pA$13.pA.pA4.pA.pA.pA.pA.pA3.pA4.pA3.pA2.2pA3.pA2. pA.pA2.pA2.2pA4.pA4.2pA2.pA.pA2.pA.pA2.pA.pA.pA.pA.2pA2.2pA9$73.2pA2. 2pA$72.pA3.pA$72.pA3.pA$72.pA3.pA$51.2pA2.2pA16.2pA2.2pA$51.pA.pA.pA. pA$51.pA.pA.pA.pA8.18ILIL$51.pA.pA.pA.pA8.J.J.pA.J.J.pA7.LJLIpA$2.pA. pA2.pA17.3pA2.2pA19.2pA2.2pA9.J.J.JIJIJIJ7.LJLJL$2.pA.2pA.pA18.pA2.pA 36.J.J.2JKJKJK7.LJLJL$2.pA.pA.2pA18.pA2.pA21.pAIpAIpA10IpAIpAIpAIpAIpA IpAIpAIpAIpA.LJLJL$2.pA.pA2.pA18.pA2.pA20.IJ.J.J9.JL.L.2LKLKLKLKLKLK. LJLJL$2.pA.pA2.pA18.pA3.2pA18.JK.pA.J9.JL.L.LILILILILILIL.LJLJLIL$50. IJIJ.J9.JL.L.L.L.L.2LKLKLK.IJIJIJL.6IL$8.pA27.3Q11.JKJK.J9.JL.L.pA.L. L.LILILI2L7K.JL5K$8.2pA16.23IpAIpAIpAIpA9.JL.L.L.L.L.pA.L.2LKL3.5IJ6I L$2.9pA2.M12IpAIpAIpA14.J3.L.pAIpAIpAL8.JL.L.L.L.L.L.L.LI2L3.JL11K$8. 2pA35.J3.LIJ.J.JL8.J21IJ12IL$8.pA36.J3.LJK.J.J9IpA.10ILILILILILJ13.L$ 45.J3.LIJIJ.J9.L.J.J.pA5.LJLJLJLJLJ13.L$45.J3.LJKJK.J9.L.J.J.J5.LJLJL JLJLJ13.L$45.J3.pAIpAIpAIpA9.2IpAIpAIpA5.IJIJIJIJIJ13.L$45.J3.L50.L$ 45.J3.L50.L$45.J3.L50.L$41.2pA2.J3.L50.L$40.pA4.J3.L50.L$33.2pA5.pA4. J3.L50.L$33.pA.pA4.pA4.J3.L50.L$33.pA.pA5.2pA2.J3.pA50.L$33.pA.pA9.J 3.L50.L$33.2pA6.pA3.J3.L50.L$41.pA3.J3.L50.L$41.pA3.J3.L5.pA15.pA28.L $34.pA6.pA3.J3.L2.2pA.pA12.2pA.pA28.L$34.pA4.5pA.J3.L2.pA.pA12.pA32.L $34.pA5.3pA2.J3.pA2.pA.pA12.pA32.L$34.pA6.pA3.J3.L2.pA.pA12.pA32.L$ 34.pA10.J3.L2.2pA14.2pA30.L$32.5pA8.J3.L31.Q.Q.Q14.L$33.3pA3.Q2.2Q.J 3.L22.28IL$34.pA4.6IJ3.L.pAIpAIpA10IpAIpAIpA.J27.L$39.J.JIJ.J3.L.J.J. J10.L.2LK.J27.L$39.J.2JK.J3.LIJ.pA.J10.L.LIL.J27.L$33.pAIpA3IpAIpAIpA .J3.LJK.J.J10.L.pA.L.J27.L$33.J.J9.J3.pAIpAIpAIpA10.6IJ27.L$33.J.pA9. J3.L50.L$30.2Q.J.J3.Q.Q.Q.J3.L50.L$27.6IpAIpA3.6IJ3.L39.pA10.L$27.J 11.J.pA.J5.L32.2pA2.2pA.pA10.L$21.pA5.J11.J.JIJ5.L31.pA3.pA14.L$20.2pA 5.J11.J.2JK5.pA31.pA3.pA14.L$21.pA5.J5.pAIpA3IpAIpAIpA5.L9.pA21.pA3.pA 14.L$21.pA5.J5.J.J13.L2.2pA2.2pA.pA22.2pA2.2pA12.L$21.pA5.J5.JIJ13.L 2.pA.pA.pA.pA41.L$27.J.Q.Q.2JK13.L2.pA.pA.pA.pA12.10ILILILILILILILIL 4.L$4.pA15.2S5.pA5IpAIpA13.L2.pA.pA.pA.pA12.J.J.J.J.pA.LJLJLJLJLJLJLJ L4.L$3.2pA22.J21.pA2.2pA2.2pA13.J.J.J.J.J.LJLJLJLJLJLJLJL4.L$2.9pA.I 14KpA21.L13.8IpAIpAIpAIpAIpA.LJLJLJLJLJLJLJL4.L$3.2pA22.J4K17.L13.J.L 6K9.IJIJIJIJIJIJIJ4I2L$4.pA14.S.S5.J.pAKpAKpAK14.L.pAIpAIpA7IJ.L33I2L $27.J5.LJpAKpAKpA9.LIJ.J.J9.LJ.J.J.J.J.J.J.J.J.J.pA.pA.pA.pA.IL3.2L$ 20.2pA5.J4.LpA.J.J.JK8.LJK.J.J8.LKJ.J.J.J.J.J.J.J.J.J.J.J.JIJ.JL3.2L$ .2pA2.pA2.pA.3pA6.pA2.pA4.J4.2L.J.J.IJ8.LIJIJ.J8.ILJ.J.J.J.pA.pA.pA.pA .J.J.J.J.2JK.JL3.2L$pA2.pA.pA2.pA2.pA7.pA2.pA4.J4.LpA.J.JKJK8.LJKJK.J 9.LJ.J.J.J.J.J.J.JIJIJIJIJIJIJ.JL3.2L$pA2.pA.pA2.pA2.pA7.pA2.pA4.J4. 2L.J.IJIJ8.pAIpAIpAIpA9.LJ.J.J.J.J.J.J.2JKJKJKJKJKJK.JLIL.2L$pA2.pA.pA 2.pA2.pA8.2pA5.J4.LpA.pAKpAKpAKpAK6.L.pAIpAIpA10IpAIpAIpAIpAIpAIpAIpA IpAIpAIpAIpAIpAIpAIpA.JLJL.2L$.2pA3.2pA3.pA15.J4.2L7.LJ6.LIJ.J.J10.L. L.L.L.L.2LKLKLKLKLK7.JLJL.2L$27.J4.LpA7.LJ6.LJK.pA.J10.L.L.L.L.L.LILI LILILIL.ILILILJLJL.2L$27.J4.2L3.LKLKLJ6.LIJIJ.J10.L.L.L.L.L.L.L.2LKLK LK.JLJLJLJLJL.2L$27.J3K.LpA3.LJLJLJ6.LJKJK.J10.L.L.L.L.L.L.L.LILILIL. JLJLJLJLJL.2L$28.pA.J.pA4.LJLJLJ6.2IpAIpAIpA10.L.L.pA.pA.pA.pA.pA.pA. L.L.L.JLJLJLJLJL.LIpAIL$28.J.J.T4.LJLJLJ23.22IJIJIJIJIJ4IpAQL$28.pAKpA KpAK3.LJLJLJ60.L.L.L.L.L.L.L.L.L.L.L$33.J4KJKJKJ61K! golly-3.3-src/Patterns/Self-Rep/JvN/codon5-auto-retract.rle0000644000175000017500000011254013151213347020433 00000000000000# A self-reproducing machine for Nobili cellular automata. # Copyright (C) 2008 by William R. Buckley # # The machine corpus appears at the left of the observed line; # zoom to see the machine. # # This configuration employs one mechanism of tape message # compression: the assumption that during construction (whether # of daughter corpus or tape copy), retraction of the construction # arm should be automatic - no need for a specific retract # instruction to appear on tape (such as after appearance of a # construct instruction). Auto-retraction of the construction # arm yields an approximately 1/3 smaller tape, versus a tape # which contains explicit instructions for construction arm # retraction. # # Consequently, this configuration has minimal size, in accord # with the minimal functionality necessary to both read and # service the tape. # # This machine serves to demonstrate that one may obtain optimal # solutions to machine self-replication within von Neumannesque # cellular automata without the use of more complicated compression # schemes, like run-length encoding, and that indeed such schemes # may here serve to reduce the efficiency of solutions. # # Corpus cell count : 3343 # Bounding rectangle : 110w 50t # Length of tape : 44150 # Tape instruction count: 8830 # Bits per instruction : 4 # Replication time : 5.87 x 10^9 # # Instruction Set - fourteen total operations # ------------------------------------------- # # 00000 RL/QQ Retract CArm Left/Ground Articulate # 00001 -- not used # 01111 # 10000 OR Ordinary Transmission Right Construct # 10001 OU Ordinary Transmission Up Construct # 10010 OL Ordinary Transmission Left Construct # 10011 XU Extend CArm Up Articulate # 10100 OD Ordinary Transmission Down Construct # 10101 RD Retract CArm Down Articulate # 10110 SR Special Transmission Right Construct # 10111 -- not used # 11000 SU Special Transmission Up Construct # 11001 XR Extend CArm Right Articulate # 11010 SL Special Transmission Left Construct # 11011 TM Tape Mark Meta # 11100 SD Special Transmission Down Construct # 11101 -- not used # 11110 CN Confluent Construct # 11111 -- not used # x = 44266, y = 50, rule = Nobili32 8.IK3IpA10IL14IpA13IpAIpA3IL8.13IL$7.IpAIJ2IpA7IL2.pAJ5IL.J3.2IpA13IpA IpA2IL9IJ2IL2IL2IL.I2pA$6.pA2JRSpAKpA7KL.RpAKpA2KQ.pAIpAL2IpAIpA13IpA L.IL11IpA.pAJ.pAJ.pAIpA.L$4.2IJIpA2IJTS.pALILIJ2IL.IJIpAR3.JIpALJ.L.I LIL2.IL2ILI2pAI2pAIL2IL2ILIL.IpA2IpA2IpA4IL$4.pAKI2JR3SLKJI3pAK.IpAIJ .J2Q.pAIpAIJIpAIpAI5pAIJIpA.pAJIpAIpA2.IpA.pAJ.pAJIpAIpA10.pA$4.pA2J 7K2JK.IpAJIJL3IpA3I3JK2.J.L.LIJIJ3.IpA10IpA2IpA13IpA3IpAIpAIpA3I$4.J 4KILIL.pAKJ3.IJIpAJ2.J2.2IpAIpA2IpA2L.L5.2IL7.2ILI2pAL.pALILIpAIpA.pA LIL.pALIpA4.2QR$4.ILIL2JLJL.pA2J3.JIJL3IpAILJIJIJ2.JIpAIpAIpAIpAIpA.pA IpAIpAIpAIpA.pAJIJ2IJIJIJ2.IpAJIJ2IJIpAL4.pA$4.9pAIJIpAL2.2JIpAJ2.J.pA 2J.JK2.pA.I2L.5IpA9IpA11IpA2IpA12IpAJ$4.JIJI2JIJ.2IpAJ3I3JIL.IpAR2.J 2pAJ2.J2.2pA6IpA4IpAIpAIpA.pAIpALIpAIpALIpA.IpA.pAIpAIpAIpAI2pAI2pAJ$ 4.J4IJ.2IJIpAJ4I2JTpAK2pAQIpAL2J.2IpAILIpA.5IpA4IpAIpAL2IJ2.IpA3.IJ.pA J2IJ.pAIpAJ2.IJ2.J$4.2pA.4IJ2IJIpAJ4.JTL.2JK.JL2JKJ3.ILIpAJ2ILIpA2ILI pAL.7IpA6IJ5IJIpA7IJ$4.2JIJ4IpAK.IJ5.J.pAIpALJIpAIpAIpAJ4.pAIpAIpA.LJ pAK.2pA.pAILILIL2IpA7IJ5IJ$4.3pAKpA2.IpAJIpA6IJ3.JIpA2J.JKJ5.5I2pAIpA J.IJLK.IJIJIJIpA8IJ$4.3JKJK.J.IJ.2IL7.J.JIpAQI2pA10.17IJ$4.2JIJIpAKJI pA2KJIpAIL5.J.3J2K2J$3.I3JLpA.4JI3JLTpA3.2IJ.2JK.3J9K$3.pAK2JLJpA3JpA J.3pAI.3IpAIpAIpAIpALJpA9KJ$3.pA3JpA.JIpAIJ2.2JL2RL3KIJIJIJL4.5IL2J$ 3.JKpAKpAIpAJ5.2JLRpAK.2IpAIJIpA2L.3IpA3I2L2J2K$3.IKJIJ8.2JLTS2.J.J. 2pAJ2L.JLKJLKJ2LJ.IpA2IpAIpA2IpA2IL$ILIpAI2J9.3pA2.pAIpAIpAL3J2L.JL2J L2J2LJpA2J2IpAIpA2IpAI2L$2pA2JRSpAK8.2JL2RL.J.JIpA2J2L.JKpAJKpAJ2L.J. 2JIpAIpA2IpA3L$J.IpA2I2J8.2JLRpAK.pAIpALJ.JLIpAL6J2L.J.3JpAKpAKLpAK2L $2pA2JR2IJ8.2JLTS2.J.JLJ.JL.2LJpA2JpAJLILJ.2JIpAIpAJIpA.LIL.11IL31.IL ILIL$2J2KRpA5K5.3pA3.IpALJLJ.2pAIL2IJ2IJIpA2LJK3JpAKpAK.LIpAIpAIpA9I 2L11.2IL5.2IL.2IL4.I6pA$JLKJKpAK.pAIpA5I2JL3RS2LJLJKJ2IpA2IpAJ.2JLIpA L3JK.IpAJIpAJL.L.J7IL.IpA5IpAIpAIpAIpA.pAIpAIpAIpA.pAIpA.pAIpAIpAJLIJ IJIpA$JLJLK.JKJLpAK.LK2.JLRpAKpAKLJIL2JK.IL.J2.2J2LKIpAJIpAIpA2.J2IpA IpAIpAJ6.pA2.LILIL.7IpA7IpA3IpA12IL$6pAK2JpA.pAK2pAK.JLTS3.IpA2LJKJpA IpALJ2.2J2L2IJ.2JKIL.J2.L.L.J.IpA2IpALIpAIpAJI2pAIpAIpAIpA.J3.IL.IpA 2.IpA.pAIpAIpAIpAIpA3.L$JLJLJL2JKJ2K.JLJ.2pA3.IpALJIpAIpAIJ.LpAJK.2JL IpAILQJIpAIpAIpA2LpA.L.J.JpA.LpAK.IL2IL7.2IJ3.2pAIJ3IJ2IJ11.L$7pA.pA 4KJ2pA.JL3RS2LJ.L.J2.LKpAIpAI2JLIJ.pARJ.JLK.JIpA2IpAI2pAIJ.IpA.2IpAIL IpA.4IpA5IpAJ10.2IL5.2I2L$JLJKJKJLpAKLKJ2KJ.JLRpAKpAKIpAIpAIpA2IpAIJ. JIpAJIpAL3.J.JL2.J.IL.L.LJ4K2IJLK.IL2IpA3IpA5IpA3IpAIpAIpAIpAIpA.pAIpA IpAIpA.pAL$pAKL2K.2pA.pAKJ3KJ.JLTS4.J.L2K2.L2KpA3J.IJ4IpAQ2IpAI2pAIpA IpAIpA4IpA3IpAIpAIpA2IJ3IpA5IpA5IpA6IpA7IpAIL$.TpATJKJKIpA2.IL2J3pA2. 2IpAIJIpA4IpA2IJI2pATJ3.LKJ.JLKLKJ.L.L.L.2ILJ3.L.L.4IpAIpA.pAIpAIpA.pA IpAIpA.2pAIpAIpA.pAIpA6.L$.4TpA2IJLI4pAK2JL2R2.L.2JIL3.L2K.J.JIpA3.3pA .JL.L.J.2LpAK2pAJLpAJ3IpAIpA5IpA.2IJ3.2IJ3.2I2J3.2IJ8.L$5.J2.LpAJIJIpA 3JLRpA3K.2JIpA3IpAIpAIpAI2JpA4K2J.JL.pALJ.4LKJ.L2IJ2.L.L3IL.7IpA4IpA 4IpA14.IL$.J11ILK.2JLTS2.2I3J2L3K3.J4.ILIL2J.J2LpAKJ.2LIpAIpAIpA5IpAI pAJ.LpA8IpA4IpA4IpA2IpA3IpA2IpA4I2L$.JpAL7.JKIL.3pA.3IpAIpA2JIpA3IpAQ IpA2.I7pA.JLIpALJ.2L.L.JK3IL2.L.LIpA2IJIpA.IpAIpA.pALIpA.2pAIpA.pAL.pA IpA.pAL.pAI4pA$2.JIpAIpAIpAIpAIpA.L.2JLR3.LIJIJ.L6.J2.JIJIJI2J.J2LpAK J.3LpA.IJ.2IpALIpAIpAJIJ2.JIpAJ2.2IJLJ2I2J.2IJ2IJ.2IJ2IJ.IJ2L$2.J.pAK pAKpAKpAKpAKpA.2JLRpA3KJIJLKpAK4.IJ2.JLKLKLKJ.JLIpALJ.2LIpALJK.pAK2LJ IL6IJIpAL.ILILIJIL.J16.J2L$.IJ.T.T.T.T.T.T.2JLTS2.I2J.LILJ3KLpA2K.J7pA .J2LpAKJ.3LpAKIJIpAJ2LJIpA7IpA.IpAJIJ3IJ2IJ3IpA2IpA9IJ2L$.JIpA.pA.pA. pA.pA.pA2.3pA3.IpAIJL3pALQ.pAKL.pA2K.JKJK2J.JLIpALJLKLIpALJKJpA.LI2J 2IL5IpA2IpA10IJIpA.pAL.pAL.pALJIL.3pA$.JpA.pA.pA.pA.pA.pA.pA.2JL3RSL 2.2pAJLIpA2.LpAKpAKJ.ILIL2J.J2LpAKJL.pA2.2IJ.J.L.IpAILIJ.pAIpA.IpA.pA .IpA.pAIpAI2pAJ2IJ2IJL.JLJ2pAIJL2QT$.2J.L10K.3JRpAKpAK.LKJLpAKQ.pAKL. L2JI6pA.JLIpAIJL.7IpAIpAI2J.4IJ.2IJ2IJIJIpAJ3.LJ7.pAI2pAIJ3.3IL$.2J. 12I2J3K4.2LpAKLJ3K.L.L3J.IJI2J.JL2.IL9IJ.3IpA13IpA7.IJ19.2L.3L2.3L2. 3L2.3L2.3L2.3L2.4L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L.2L555.L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.4L2.3L2.3L2.2L2.3L2.3L2.3L2.3L2.4L2.2L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.4L2.3L2.2L2.4L2.2L2.4L2.2L2.4L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L44.L.L 2.L4.L4.L4.4L.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L 4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.L 4.4L.L4.L4.L4.L2.L.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.4L.L9.L.L2.L4.L 4.L.L2.L4.L4.L.L2.L4.L4.L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L4.L4.4L. L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L19.L3.L5.L.L2.L4. L4.L4.L4.L4.L3.5L11.L.L2.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L3.2L4.4L.L4.L .L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L7.4L.L4.4L6.L3.5L6.L3.5L6.4L.L4.L4. L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L9.L.L2.4L.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.4L.L4.L4.L.L2.4L.L4.4L6.L.2L.L2.L.L2.L.4L.L2.L.4L .2L8.L.L2.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.4L.2L.L.2L3.L3. 2L3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.4L.L4.L4. 4L.L4.L4.4L.L9.L.L2.L4.L.L2.L4.L4.L.L2.L4.L4.L.L2.L4.4L.4L.L4.4L.4L.L 4.L.L2.L4.L4.L.L2.L14.L.L2.L4.L.L2.L9.L.L7.L3.2L.L2.4L.L4.L3.L15.2L3. 4L.L4.L3.2L9.L.L2.L4.L4.L3.2L4.L.L2.L4.L.L2.4L6.2L.L.3L2.L3.2L4.L4.4L .L4.L3.2L4.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L51.4L.L4. 4L.L4.L3.5L6.L3.5L6.4L.L14.4L.L4.4L.L4.L3.5L6.4L.L4.L3.2L4.4L.4L.4L. 4L.4L.L4.4L.L4.4L.L4.L3.2L4.4L.L4.4L6.L.2L.L.2L.L3.L5.L3.2L4.4L.L9.L 2.L.4L.4L.4L.L4.L3.2L2.L.L.L2.2L.L.2L.L.2L.L.2L3.L3.2L3.2L4.L2.L.4L.L .L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L4.L4.L4.4L.L4.4L.L4.4L.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L19.L3.2L 4.L3.2L4.L.L7.L.L7.L3.L10.L2.L.L3.2L3.2L3.2L4.L4.L4.4L.L4.L4.L4.L.L2. L3.2L4.L3.5L.L9.L2.L.L3.2L3.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L 3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L3.L.2L.L.2L21.4L.L4.L.L2.4L6.L.L2.L4.L.L2.4L6.4L.L4.4L. L4.L.L2.L4.L.L2.4L6.L.L2.4L.4L.L4.L.L2.L4.L39.L.L2.L4.L29.L.L7.L.L2.L .L2.4L.L4.L4.4L.L4.4L.L4.L14.L3.L10.L3.5L.L4.L3.2L19.L3.2L2.L.4L6.L.L 2.L4.L.L2.L4.L2.L.L2.L.L2.L.L2.L.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L21.L.L2.4L.L4.L3.2L4.L4.L3.2L4. L3.5L.L14.L3.2L4.L3.2L4.L3.2L4.L4.L3.2L4.L3.5L6.4L.L4.4L.L4.4L.L4.4L. L4.4L6.4L.L4.4L.L4.4L.L4.4L.L4.4L.L4.L3.L10.L3.2L4.L3.2L4.L3.2L.L2.L 4.4L.L4.L4.L4.L.L2.L3.2L4.L3.L15.L3.2L3.5L6.L.L2.L3.2L.L2.L3.2L3.2L.L 2.L4.L.L2.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.2L3.5L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.4L.L 4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L 4.L4.L4.L9.L.L2.L.L2.L9.4L11.L2.L.L3.L5.L3.2L3.5L6.L3.L10.L3.5L.L4.L 3.2L3.L10.L.L2.4L.L4.L3.2L4.4L.4L.4L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.5L.4L.L4.4L .4L.L4.4L.L4.4L.L4.4L.L4.4L6.4L.L9.4L.L4.L.L2.4L.L4.4L.L4.L.L2.4L.L4. 4L6.4L.L4.4L.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.4L.4L11.L3.L10.L 3.5L.4L.L3.L10.2L3.4L.L9.L.L2.L4.L3.2L3.2L3.2L4.L4.L4.L3.5L.L4.L9.L3. 2L4.L3.2L3.2L4.L3.2L4.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.2L3.L10.L3.2L14.L3.5L.L4.4L6.L3.2L4.L4.L3.5L6.L 3.2L19.4L.L14.L3.2L4.L4.L.L2.4L.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L9. 4L.L4.L.L2.L4.4L.L4.L9.L3.2L3.2L.L2.4L.L4.L.2L.4L.4L.L2.L.4L.3L2.L3. 2L3.2L4.L4.L4.L4.L3.5L.L4.L3.2L4.L9.L3.2L4.L4.L4.L4.L3.2L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4.L4.L4. L4.L4.L4.4L.L4.L3.2L4.L4.L4.L4.L4.L3.2L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L 4.L4.L4.L9.L.L2.4L.L4.L.L2.L4.L4.4L.L4.L.L2.L4.L4.L3.5L.L4.L.L2.L19.L 3.2L2.L.L3.2L3.2L.L2.L3.L5.L2.L.L3.2L3.L5.L.L2.3L2.L3.L20.L3.5L.L4.L 3.2L4.L4.L3.2L4.L4.L4.L9.4L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4. L4.L4.L4.L3.2L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L.L2.L4.L.L2.L4.L.L2.L4.4L 6.4L.4L6.L2.L.4L.L3.2L.L7.4L.L4.4L.L4.4L21.L3.5L.L4.4L.L4.4L.L4.L3.2L .L2.4L.L4.4L6.L3.L25.L3.2L9.L2.L.4L.L4.L4.L4.L4.L3.2L4.L3.2L3.2L.L.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L3.2L4.L3.2L4.L3.2L9.L2.L.L.L2.L 3.2L9.L3.5L.L4.4L.4L.L4.L4.L4.L4.L29.L3.2L2.L.L3.L5.L3.2L3.5L.L4.L3.L 15.L3.2L4.L4.L4.L4.L4.L4.4L.L4.L3.5L.L14.4L.L2.L.4L.4L.4L.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L54.4L.4L.L4.L.2L.4L.L4.L3.L5.L3.L35.L.L2.L4.L9.L3.2L9.L3. L5.L2.L.L3.2L2.L.L3.2L3.2L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L3.2L3.2L2.L.L2.L.L3.2L3.2L3.L5.L3.L25.L.L2.L4. 4L.L4.L3.2L2.L.L2.L.4L.L4.L3.2L2.L.4L.L4.L3.2L4.L3.2L3.2L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L3. 2L3.L5.L2.L.L3.2L3.L5.L3.2L4.L19.4L.3L2.L.L2.L3.2L3.2L3.2L4.L3.2L3.2L 3.2L3.L5.4L.L.L2.L3.2L3.2L3.2L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3. 2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L3.2L.L2.4L.L4.4L.L 4.4L.L4.4L.L4.L4.L9.L4.4L.4L.4L6.L3.5L.L3.2L3.2L3.5L.L3.2L.L2.L3.2L3. 2L2.L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L3.2L.L2.L4.L4.L4.L4.L 24.L.L2.L3.2L4.L3.2L4.L3.2L4.L2.L.L2.L.L2.L.L.L2.2L3.2L3.L.L2.L3.2L3. L10.L3.2L4.4L.L4.L3.L5.4L.L3.2L3.2L3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.2L2.L.L2.L.L3.2L3.2L.L2.L.L2.L4.L4.L4.4L.L4.L4.L9.L.L2.L. L2.4L.L4.L3.2L4.4L.L4.L9.L2.L.4L.2L3.L.L2.L3.2L3.L25.L3.5L.L4.4L.L2.L .4L.L2.L.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.4L.L4.L4.4L.L4.4L.L4.L4.4L.L 9.L3.2L.L2.L.L2.L3.2L2.L.L.L2.L3.2L2.L.L.L2.L3.L5.L.L2.L.L2.L3.5L.4L 6.L3.L5.L3.L10.2L.L.3L2.L.L2.L3.2L3.L40.L3.2L4.L3.2L2.L.L4.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.L.L2.L4.4L.L4.L4.4L.L4.4L.L4.L4.L3.2L3.5L.L3.2L.L2.L.L2.L 3.2L3.2L.L2.L3.2L3.2L.L2.L3.L5.L.L2.L.L2.L3.2L3.2L3.2L.L2.4L.L4.4L.L 4.4L11.4L.4L.4L46.L3.2L3.2L4.4L.L4.L.L2.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.2L.L2.L.L2.L.L2.4L.L4.L4.4L.L4.4L.L4.L3.2L3.L5.L3.L5.L.L2.L.L2.L3. 5L.L2.L.L3.5L.L2.L.L3.L5.L.L2.L.L2.L3.2L3.5L.L4.L3.L5.L3.L5.L.L2.2L3. 2L3.L.L2.L3.2L3.L40.L2.L.4L.2L.L.2L3.L3.2L3.5L.4L.L.L.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.2L.L2.L.L2.L2.L.4L.L.L2.L2.L.4L.L2.L.4L.L3.2L3.2L3.L5.L3.L 5.L.L2.L.L2.L3.2L3.2L3.2L3.2L3.2L3.2L.L2.4L.L4.L.L2.L3.L5.L3.2L.L2.4L .L4.4L6.L2.L.4L.2L3.L.L2.L3.2L3.L40.L3.2L3.2L4.L4.4L.L9.L3.2L.L.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L.L2.L4.L.L2.L159.L.L2.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.L9.L.L2.L4.L.L7.4L.L4.L3.5L.L4.4L.L4.L3.2L3.L5.L3.2L.L 2.L4.L.L2.L3.5L.L3.2L3.5L.L3.2L.L2.L.L7.L.L2.L3.L5.L3.2L.L2.L3.L5.L3. L10.2L.L.3L2.L.L2.L3.2L3.L40.L3.2L4.L4.2L3.L3.2L3.5L.4L.L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.5L.4L.4L.4L.4L.4L.L24.L.L2.L4.L9.L.L2.L4.L29.L.L2.L4. L59.L.L2.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.4L.L4.4L.L4.L.L7.L2.L. 4L.L2.L.4L.L3.2L3.2L3.2L2.L.L3.2L.L2.L.L2.4L.L4.L3.2L4.L4.L3.2L4.L4.L .L2.L4.4L.4L6.L3.2L.L2.L3.2L.L2.4L.L19.4L.4L.4L26.L2.L.L2.L.L2.L.L2.L .L2.L.4L.2L3.L2.L.L2.L.L3.2L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.L4.L 3.2L4.L3.2L4.L.L2.L3.5L.L4.4L.L4.4L6.4L.L4.4L6.4L.L4.4L.L4.4L.L4.4L6. 4L.L4.4L.L4.4L.L4.4L.L4.L4.L4.L4.L4.4L.L9.L.L2.L4.L4.L4.L4.L4.L4.L4.L 3.L5.L.L7.L.L2.L3.5L.L4.L3.5L.L9.L2.L.L3.2L3.2L3.2L.L2.4L.L4.L.L2.L3. 2L3.L5.L3.5L.L4.L4.4L.L4.L4.L3.2L2.L.L3.2L.L2.L3.2L.L2.L.L2.2L.L.2L3. 2L3.2L3.L.L2.L3.2L3.2L4.L4.L4.L4.L4.4L.L4.4L6.L2.L.4L.L2.L.L3.2L2.L.L .L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L 4.L9.L.L2.L4.L.L2.L4.L.L12.4L31.L3.5L.L4.4L.L4.4L.L4.L4.L3.L10.4L.L4. 4L.L4.L3.5L.L4.L2.L.L.L2.L.L2.L3.2L3.L10.L3.L5.L.L2.L9.L2.L.L3.2L3.2L .L2.L4.L3.2L.L2.L2.L.4L.L2.L.4L.2L3.L.L2.L3.L10.L2.L.L.L7.L2.L.4L.L.L 2.L3.2L2.L.L3.L5.L2.L.L.L2.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.2L.L17.4L.L4.4L.L4.4L.L4.4L.L4.4L6.4L.L14.4L.L9.L.L2.L19.L3.L5.4L .L4.4L.L4.4L.L4.4L.4L.L4.L3.5L.L4.4L.L4.L.L2.4L.L4.L4.4L.L9.L3.L5.L.L 7.L.L12.L3.L5.L.L2.L4.L2.L.L3.2L3.L5.L3.2L4.L4.L.L2.L.L2.L3.2L3.L10.L 3.2L.L2.4L.L4.4L.L3.2L2.L.L3.2L.L2.L.L2.4L.L19.2L.L.3L2.L.L2.L3.L5.L 2.L.4L.4L.L2.L.4L6.4L.L3.2L3.2L2.L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L.L57.L3.2L4.L4.L3.2L4.L4.L4.L3.2L4.4L.4L16.L3.2L4.L 39.L.L2.L4.L4.L.L2.L9.L2.L.4L.L.L7.4L.L3.L5.L3.L5.L.L7.4L.L.L2.L.L2. 4L.L4.4L.L4.4L.L4.L3.2L.2L.L.L2.L4.4L.L4.L.L2.L3.2L3.L5.L2.L.L3.5L.L. L7.L3.2L4.4L.L4.4L.L4.L3.2L.L2.4L.L19.4L.4L6.L3.2L.L2.L3.L5.L2.L.L2.L .L3.2L2.L.L3.2L3.2L.L2.L3.2L.L2.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.2L.L2.L.L2.L4.L29.L.L2.L4.L54.L3.5L.L4.L4.L4.L4.L4.4L.L4.L4.L 4.L9.4L.L4.L.L2.L4.4L.L4.L9.4L.L9.L3.2L4.4L.4L.L4.4L.L4.L4.4L.L4.L3.L 5.L2.L.L.L2.L3.L5.L3.3L3.4L6.L3.2L4.L.L2.L3.2L3.2L4.4L.L4.4L.L2.L.L.L 12.L3.L5.L.L7.L3.2L.L2.L.L2.2L.L.2L3.2L3.2L3.L.L2.L3.L5.4L.4L.L3.2L2. L.L2.L.L2.L.L2.L.4L6.4L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.4L6.4L.L4.4L.L4.4L.L4.4L6.4L.L4.4L.L4.4L.L4.4L.L4.4L.L4.L 4.L4.4L.L4.L4.L4.L4.L4.4L.L4.L4.L4.4L.L4.L4.L.L2.L9.L2.L.L.L2.L3.2L4. L4.L2.L.L2.L.L2.L.L2.L.L3.2L.L7.L.L7.L.L2.L9.L3.L10.L.L2.L3.L5.L3.L 15.L.L2.4L.L4.L3.5L.L4.L3.L5.L3.2L4.4L.L4.L4.4L.L4.4L.L4.4L.L4.L2.L. 4L.L2.L.4L.2L3.L.L2.L3.L5.L3.2L2.L.L2.L.L3.2L2.L.L.L2.L2.L.4L.L.L2.L 3.2L2.L.L3.2L2.L.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L 4.4L.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.4L.L 4.L4.L4.L4.L4.4L.L4.L4.L4.L3.2L4.L4.4L.L4.4L.L4.4L.L4.L4.L4.4L.L4.L4. L4.L4.4L.L4.4L.L4.4L.L4.4L.4L.L4.4L.L4.L4.L.2L.4L.L4.L4.L4.L4.L3.2L9. L3.2L3.2L3.5L.L2.L.L2.L.L.L12.L2.L.L2.L.L.L7.L3.L20.2L.L.3L2.L.L2.L3. L5.L3.2L2.L.L2.L.L2.L.L3.2L2.L.4L6.4L.4L6.L2.L.L2.L.L.L2.L2.L.4L.L.L. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L32.4L.L4.4L6.4L.L4.4L.L4.4L.4L6.4L.L 4.4L.L4.4L6.4L.L4.4L.L4.4L6.4L.L4.4L.L4.L4.L4.L9.L.L7.L.L17.L3.2L.L2. L4.L9.L.L7.L.L7.L.L7.L3.2L2.L.L.L2.L2.L.L.L2.L3.L5.L3.2L2.L.L.L17.L3. 4L2.4L.4L.L4.L3.2L4.L4.4L.L4.L4.L4.L4.4L.L4.L3.2L4.4L.L4.L14.4L.4L.4L .L3.2L3.2L.L2.L14.4L.L4.L2.L.L3.2L2.L.L3.4L2.4L.3L7.L.L.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L.L42.L3.2L4.L19.L3.2L3.2L4.L19.L3.2L4.L19.L3.2L4.L 9.4L.L4.L4.L4.L4.L4.4L.L4.4L.L4.L4.L4.L3.5L.L.L2.L3.5L.4L.L2.L.4L.L.L 2.L.L7.L3.L5.L.L7.L.L2.L3.L5.4L.4L.4L16.4L.L4.L3.L5.L3.L5.L2.L.L2.L.L .L17.L.L2.L4.L3.2L3.L5.L.L12.2L3.2L3.L.L2.L3.2L3.2L2.L.4L.4L.4L.4L.L 4.L.L2.L3.2L4.L4.4L.3L2.3L2.3L2.3L7.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.2L.L2.L74.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L9.L .L2.L4.L4.L4.L.L7.L.L12.L3.2L4.L4.L.L7.L3.2L2.L.L.L2.L.L2.L.L2.L.L7.L 3.2L.L2.4L6.L.L2.L3.L5.L3.2L3.2L2.L.L2.L.L2.L.L2.L.4L.L3.2L3.2L4.4L.L 4.4L.L4.4L.L4.L4.L4.4L.L4.L3.2L3.L5.L2.L.L2.L.L2.L.4L.2L3.L.L2.L3.2L 3.2L3.5L.L4.L3.2L4.L3.5L.L.L12.L3.L25.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.L.L2.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.4L.L4.L4.4L.L4.L4.L 4.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.4L.L.L7.L3.5L.L4.4L.L 4.L4.L4.L4.L4.4L.L4.4L.L4.4L.L4.L.L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L 5.L3.2L3.2L.L2.L4.L.L2.L24.L3.L15.L2.L.L2.L.L2.L.L.L2.L.L2.L3.2L3.2L 3.2L4.L14.2L.L.3L2.L.L2.L3.2L3.L5.L2.L.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.4L.4L.4L.L4.4L6. L.L2.4L6.4L.L4.4L6.L.L2.4L6.4L.L4.4L.4L6.4L.L4.L.L2.4L6.4L.L4.4L.L9. 4L.L4.L3.2L4.L4.4L.L4.L.L7.L.L12.L.L2.L4.L4.L4.L2.L.L3.L5.L.L7.L.L2.L .L7.L3.2L.L2.4L.L4.L.L2.L3.L5.4L.4L.4L.4L.4L.4L.4L.L14.4L.L4.L.2L.4L. L4.L4.L4.4L.L4.L3.2L3.5L.L4.4L.L4.L4.L9.4L.4L.4L6.L.L2.L4.L2.L.L3.L 35.L.L2.4L.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L.L2.L3.2L 9.L3.2L4.L4.L3.2L4.L9.L3.2L4.L4.L3.2L4.L9.L3.2L3.2L4.L4.L3.2L.L2.L3. 2L4.L14.L3.5L.L4.L3.L10.L3.2L4.L3.5L.L4.4L.L4.L.L2.4L.L4.L9.L3.2L9.4L .L.L2.L.L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L5.L3.2L3.2L4.L3.2L4.L3.2L4. L3.L10.L3.L30.L.L7.L3.2L4.L3.2L4.L.L17.2L3.L.L2.L3.2L3.L5.L.L7.4L.L4. 4L.L4.4L.L4.4L.L4.4L.L4.L3.L10.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L. L2.L.L2.L3.L80.L3.L5.L.L2.L4.L3.2L4.L.L2.L4.L.L2.L9.L.L2.4L.L4.L3.2L 4.L4.L4.L4.L4.L4.L.L2.L4.L3.2L.L2.L.L2.L2.L.4L6.L2.L.L3.2L.L2.4L.L4.L .L2.L.L7.L3.2L.L2.4L.L4.L.L2.L3.L5.L3.2L2.L.L.L2.L2.L.L.L2.L2.L.L.L2. L3.L10.L3.2L24.L2.L.4L.L2.L.L.L2.L3.2L4.L3.2L2.L.L2.L.L2.L.4L.2L3.L.L 2.L3.2L3.L5.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L6.L3.L10.L.L.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L.L2.L3.2L4.L4.L4.L4.L4.L4.L4.L4. L4.4L.L4.L4.4L.L4.L4.L4.L3.2L4.L4.L3.2L4.L4.L4.L3.2L4.L3.5L.L9.4L.L4. L4.L4.L4.L4.L4.L4.4L.L4.L3.2L.L2.L.L2.L3.5L.L4.L3.2L4.L2.L.4L.L.L2.L. L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L5.4L.4L.4L.4L.4L.4L.4L.L3.L5.L2.L.L 2.L.4L.L.L2.L2.L.L2.L.L2.L.L3.2L.L2.L4.L.L7.L3.2L3.2L14.2L.L.3L2.L.L 2.L3.2L3.L5.3L7.3L7.3L7.3L7.3L7.3L7.L3.2L9.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.5L.4L.4L6.L.L2.L4.L3.2L.L2.4L6.L.L2.4L6.L.L2.4L6.4L.L4.L3. 2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.L4.L4.L.L2.L4.L4. L3.2L3.2L4.L.L7.4L.L3.2L2.L.L3.2L.L2.4L.L4.L.L2.L2.L.L.L2.L3.2L.L2.4L .L4.L.L2.L3.L5.L3.2L3.2L2.L.L3.2L2.L.L3.L5.L2.L.L2.L.4L6.L.L2.L2.L.4L 6.L.2L.L.L2.4L.4L.4L.L.L2.L3.2L4.4L.L19.4L.4L.4L11.4L6.4L6.4L6.4L6.4L 6.4L.L4.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.4L2.L.2L.L. 2L.L.L2.L3.2L4.4L.4L.L3.2L.L2.L3.L5.L.L2.L3.2L4.L4.L3.2L4.L4.L3.5L.4L .L4.4L.L4.4L6.4L.L9.4L6.4L.L9.4L.L4.4L6.L3.2L4.L.L2.L4.4L.L9.L.L7.L3. L5.L3.2L4.L14.4L6.L.L2.L3.2L2.L.4L.L.L2.L.L2.L3.L5.L3.2L3.2L.L2.L4.L. L2.L9.L3.2L2.L.4L.L2.L.4L.L.L12.4L.L4.L.L2.L3.5L.4L11.L.L2.2L.L.2L3. 2L3.2L3.L.L2.L3.2L3.L5.4L6.4L6.4L6.4L6.4L6.4L6.4L.L3.L5.L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L19.L3.2L4.4L.4L.L4.4L36. L3.2L.L17.L3.5L.L4.L3.2L4.L3.2L4.L4.L3.2L4.L9.L3.2L4.L4.L4.L9.L3.2L3. 2L4.4L.L4.4L.L4.L4.L4.L4.L4.L4.L9.L.L2.L3.2L4.4L.L4.L.L2.L3.L5.4L.4L. 4L.4L.4L.4L.L4.L3.2L3.2L.L7.L.L2.L2.L.4L6.L.2L.L2.L.4L.L.L2.L3.2L2.L. L.L7.L2.L.4L.L2.L.4L.2L3.L3.2L3.2L3.L5.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L. L2.L.L2.L.L2.L.L2.L.L.L7.L3.2L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L 3.2L39.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L9.L3.2L4.L 4.L4.L4.L4.L4.L4.L4.L4.L.L2.L14.L.L2.L3.L5.L3.2L3.2L4.L3.2L9.L3.2L3. 2L3.2L.L7.L.L7.L2.L.L2.L.L2.L.L3.2L.L2.L2.L.4L.L.L2.L.L22.L2.L.L2.L.L 2.L.L3.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L9.L3.2L3.L5.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2. L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L.L2.L3.2L4.L4.L4.L4.L4.L4.L4.L4. L4.L4.L4.L4.L4.L4.L4.L3.2L4.L4.L4.L3.L5.L3.L5.L2.L.L2.L.L2.L.L2.L.L3. 2L3.2L3.2L.L2.L2.L.4L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.L3.2L.L2.L2.L. L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L3.L5.L.L.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L 2.L.L2.L.L2.L.L.L2.L2.L.L2.L.L.L7.L2.L.L2.L.L.L7.L2.L.L2.L.L2.L.L2.L. L2.L.L2.L.L2.L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L3.2L3.2L.L2.L 3.2L2.L.L2.L.4L.L4.L.2L.L.2L.L.L12.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2. L.L2.L.L2.L.L2.L.L2.L.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L6.L2. L.L2.L.L2.L.L.L2.L2.L.L.L12.L3.L15.L3.L5.L3.2L2.L.L3.2L2.L.4L.L2.L.L 2.L.4L.L4.L.2L.4L.L149.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.2L2.L.L2.L.4L.L2.L.4L6.4L.L.L2.L2.L.L2.L.4L.L2.L.4L.L2. L.4L.L2.L.4L.2L.L.4L.L2.L.L2.L.L2.L.4L.L2.L.4L.L3.L10.L3.2L4.L4.L169. L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L2.L.L3.2L2.L.L2.L. L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.L3.L25.L3.3L2.2L204.L.L.3L.2L$. 2J23KLJKpA5KpAKL3J4K.J.J3IJ15IJL12KpA29K$.J25K2.L2QIpA2KJL2JpAKpAKpAK pAKpA8K.L2K.L2KL4K$29.IpAQIpA2KpAKJKJ.J3.J2.LKL3K.pAKpAKpAKpAKpAK$33. 3IJ2.JpAKpA3KpASpAKpAKpAKpA2KLpA.pAKpA2K$40.N5.JKpAKpAKpAKpA3KJ2K! golly-3.3-src/Patterns/Self-Rep/JvN/CY_Lee_computer.zip0000644000175000017500000031707713247734027017717 00000000000000PKXP™KŒtHÇ6öÕpCY_Lee_computer.rleSD[¤ªŠKcd`ia``0`€ fd3YEÄ–w¾ËãŽæ[\µï%3n9F&&†f°´ÃFyFFˆZ!0%c‚ˆ) 0["ŽÇNUT 8N@Zñ@Zñ@Zìýë$9’'~7Àþ‡ÀN[δ1}Ø«ù™3;ëfôÔÞÜaзˆÊŠªŠéÌ Ÿ|tOïÞþïG’ª¤*©*5 fº‡›©’?ŠE„oá¿ûwKü·úw/¾ÿðã¿ÿøþ—?|úéñ÷ß>üòâÓ_^|¿ùÿl^\?|xñ‡ê´?þÝ‹_>¼ÿñãÿõáÏ/>þüâ·¿}xñ/Ÿ~~ñæÃï?½ÿùçß¿za`þððÓã~úðóo&•yûŸ?ýøã¿½øÓ¿½¸l^¼þôËÇßÞCÞÿøá‡?ýÉ”Qo«Ãß­á˜0?4d=¾ÿÍ0ð³aåçßÞüÙÓûñ×ùøã‡æïûŸ_|øŸïT`óý‹?þþËÇŸÿúâ§÷?üͤGFþøúï^‘þsÏo}úö×ßÞÿöáÅ^Z¿>¾ÿ1Ql ÿÃoPŽ¡à×ß~ùýÆŸÞÿjeH?}øíoŸþÉø¿Uÿ´yñÂsa2{6~ýø“)ë·†lSÞ‡>þåã/êoý·ŸþôéÇ|mßÿöâý?|xüíWDÿñýÏýýý_? Üõÿ||ñ^üß/ªÿïÏ/þ/~Fö_<~úW[Åõ‹ÿÇ”úæýO~ü·o^|ü ˆæãÏF^üë§_À?üü×ßþH(Ñ_?þúÈêÓϦbÍkKƯ/ªÿõW€þëÇùðó7H…¡ì‡¿}øáŸXW®Aé‹6?€O]ò¿½ÿÑp`„mˆ°ü@I(òo^|øñWSw¿¹DÒ•üï~è“ÈÿíÓ/¾r-ðFðPÞÏÿáˆD50Zùé_ýPþõo~ùðâüŸ[§þøÛÇ÷?Z8óàÏæÝ{÷n@ÓÆÕÖoÿáÅöþ¯ÿo»ÿ1éáøQ²m÷/”c?mC5ˆõ5òÛûþðó‹¿üòé§ÿ­ù§ÿúÑÔÑŸÞÿøã‹Ÿ>ýäýo?YMüÛO†Бo@d&C'oå•ëÏVœæ+”õˇùð˯ÿd>~ÿjów/œFÿí½Õ/+?”Ç߀°ÿñûÇŸûÝäüÕT˜à¯ûø—ß^üùã/P9FçMÈh`þöáýŸ¡à?ÿ¨Ãø·ß¾øÃLÌöwß¼øûøåã_ÿæ`5l_üáçOî—üÿý⿱óÂþüý7F†•aÏ<¬¢‡µ}Xû‡ßÂÃý?¡¼poª>yc“7ø¤rÉÛîa…?]JÑF蛼õÀøpgî¹Ãxñÿ¼èfÒçÿ€NòÃæ…©,ëÆLUþ ‰þ«q0ÿ+ØÑ/Fwÿ8¿¼7ü è™õpJ`*«ÆÐޛ߿ñ⟠V„m€~ýÛ§ýùÅŸ> û+Þkýã/ŸþúËûŸ~²*ctõÃÿøýÃÏÖý† ^9^¼øéÌ?/^¿ÿåŸ_üáãæÃæ›ÿjš HŸsŸÕßaʘò?ý®"—tk“þ=&ý/¨àðú·OøÙ*-&ûv"ê:¦úí?ÿÝ?¼øþ“1 ÝøÿþûO!;›Ðþ÷¿}üåWcÆ¿ VO™kT~{ÿøÁúÔØúThè?¿øë'(8€Äøø÷?ÿÝ·Æqe9'kÓ»DÕß™6/N Yï \ _2Y>0}m¼ú (˜U(ð>¢¾˜ºûÉ‹jl÷·oúë'Óà92?ýŠâçI~þð?KcD‰®ë“ócUô ¡ÿ«qlïÿíÓOÆmþðº,êÏŸLW5­³§‚F9þöñ‡¿Ë©VÛ@ôµí?m¼}ú“ë‹äÔÖ ýƒ×ÜßþðmeÜ )è·?Àxfe¯öæ‰}·wï~êÞUù|GÈfß5Õ0cÓ¿¬÷ÜÁËq‰uGMúí0_€Ž^~[·Ã¬ì·õi˜÷Û¶öl~»kFowû^N¤a#h5Èör aÇVýßµ$ô•-¡„?¾šø+ì ;|k±>¡ž·øçqÑà7±Ó•n,7Ò|Óüôû¯}é®è¿€'ˆ šúW?þúéÅÏQ{ýÞz«èTShí»Þ¼úáßÿÛicŽÖ®ˆ^uÿðaóWã"?ýðÃï¿üO~µÝ“_ÿS—æqð¿4&‚~ÅOŸþåßÑY¼4eøóæïl}g í×_MûGðqaú4¿›¾E`XÐÞYüá“¡à×GãA½Ì€øl óïËÿˆÝÐÇ÷¿üfkíñÇ÷?Ø1ÀÏÿf@?ZžúÊþÉÐþË¿u´8˜ß;˜õVl×yǾy߃‡. ÉõþOF جñ/ÞþÅÐöû/¿~¢ÑKUß‚ÛÆNØÃÑË`´f<[OŠõ\Þ‰>8µqL|3ìô}ü+´T¦¢`LbÔåwã½ïzøöÅ?˜¡Þ¿@Âa»÷ëÿø’„6ü£a×øYß>ü=+[×о†Vã?™¼ÿuԲÛ­Iò÷/Ìë™öúÛ|Oá·øÇÊ$üãc{Fë~ÿñ7¯®P#4LVaŽß|ZÓLºÞQ"åºÖìOÆÚA´è¹þø "4ÖçWƒs†®Å¾¯ÙMµûîÎoSËv3ÿ Ì+ð1Ø(9ÉzpôYõæÅùôÓ7þðË/Ÿ~žÝï?wÎï“aè#ä{|Û4 Æ]ÿòÁ6Ðþzß÷G74æ±ìÀÅͯ l“ýkДÃÜŠ+›Nï)ûDýöáñ×ëÙýüâÅ›ßqî æNàÍ‹¯úßÿ#ÂB¢­ë]WÛÃ7Ûª}Ñÿ÷ðºò¯÷Í7‡ê¼~¯k÷¥9µßlëÝðuã_·§oÚº^#¸/íx¬¾Ù5§an·ßµæõ(÷ÞöMuÚ}s¨÷Ã×÷z»?~³=œ†¯-+õ7uU}shòO.÷îT}ÓªAîjërïv§oN»Ýðµ%fÿÍ~ eoƒ×nY©#±Ã7u$–W¶êÀ—|øËÛÝÁ֔Ȍ”¿Á1³i>þíg£¿~t}¡†3ªØõxe{=/^ÙÑÆ{?˜2jÎÿ ˆçͽÿÝXÆ«ÞÿùÃOxñθfÓyy|ÜÔÕáÛºÙ¹9YT[c#aëþA°H¯6ÿuóâ»ßùç_Í(Óaˆû/~üË·¿|0ý½?ÿŽG„'ê›ÿÇÏÿeI~4îê“áÉðüò§÷?›Ýs cïÈhþÉMò~óâbòý,Òýô˦‹ðc˜3²†Œ½"(ÿ}8ãäˆù`íï½!ù·_>ÂŒ&zZØ|vvC7è»)çnú¿4~âoz,A¿ý›éßüj@~w#îü€k#—ço¿ýöøÿþßüeóãÇ?mþæ¾ý}óþ‡Íü÷Ûí¶­÷ aÀ ìô¾ßÿËû?¾>ÞÛ¾Ä?šî¢©MxÒ—¢EBÿáE\è_Ͱø÷?mŒÎü{|ÿŸ ãÿþñ ü’jF—/þËï}oÅØPú/^u3&دífœ;±¹’»Ñ­i¬^œß?¾7ݺF÷Φ£ ò-ø†É¶Mz£ë×ÿ˧>~øíßýú¾­«Ý7ßVÛízõ?_ücî§í7/þÍ|ª·ÛÓ7/@ÂæËù_ÞÔ§õêØì7¯6õã«—ðÑü­Í÷—uÝÂç}µ5ßxR÷›æñÕÎ}‡¿ûÍ’›Ö«Ÿ›&Gwiï~!|?šßvÓút­Ml¥í¿Ö|í2Øçm—±Ë]WøÜÃ}é{ÜvI?u”ž6ˆäª7ëUëXòÏðË)€Ý…Ô×aR$ûŠÆ²sœìve»®”Ý ¸òâ ÈiÆäìl²ú઩ƒÁ÷땯&ü§ÔA/ïP:®âøú_¯àSPÁûM¯£ÔWz˜Æ?;Øì@Î8ƒý[[Ŭ/|…S‡\ÄýçjoKm<î1À±lù·Ã’!U>À/ð7Ô½ºÃiÂbüã£Gn<c:£LëUê¯Ë¶óÅ& <­¡¤,5Xå!¡UP#Rë¸Èž©.gm«¼ˆ9ür´™Oæz•¦ö0$Íû§vHÿ¡S%€9ù¤ûMZËö›˜›ãà™¯rŠŽ…•b[ÑT½þºÕI7*2Q]U ¸rïG•–T“*îqöÙm·Ýn¶F …ê³òW±¸#ÖBÄôœÍüŒ/§‚j„އåjì&BΓºä]“Ó#SW½&¡×má›óíû¾‰È©RkSÆ|y‚ÌŠÈ—p ŸÔã5Í ÐxA­\b)JÙ÷´t¤y¤æ´ý—^\@À1x5Þó»‹<€Gqþn—U/™^¸»kœÂ¼­—wª­d†Véߌ2W¶·buÇ©ž•wã[ÎÆ‹4e‹žÐ¾ÚN;k§8 › 2B§’v@»®(Ì·†¡ß ëð0Hß7›U×ÙA£‹œÎn\HÔŒY ›JÙ%ͦoÏëÐÉ÷2Ú í»¦x‰]§+ƒÞá~vpÒ Õ>âs¬»P2#ÔŽLãt䀿»¸m°’ÙD~e7d•¯— W´¨ÇzåsÌu‡ÂÏõ ¤ž¥)uéu>Ý)èU©ßEÖã¦1U¦å)îe[ª:ú>Р1Oã.¯H=÷ΙO¶Ý9Õ _F¿Æûæ« „³ jÛ×bØ$Årzš¾cñtÆÀ¼Xíß~ˆ„úÀ@‹ý»&–…¬œF±zãDÛü˜¾~˜>70†U§t4Kûó~yê`"• ²ŒdB=iÇ=‚fzTæ¼ðdß§Îl)aÖó´ðÓØ¦?ÌP{jš pìäÛ?q5oyôe i:'ûò¸Ý÷Ú½QŸ~di¾xG|qŸëà¹u[»ö²Û\[ù¿ë•&·û×ÈFaþ…ñêBMÓ^°&°ºöõæ|iÍ«&ñô&ý†ñ×€( -KÓò²nw›‡Çïê‡ÇWó©ÙÆOdßÃR"à÷õJ‹P¸*\®ð»÷õ¶ Ç©cþß¿=çoþ`æ×õJ“»û M¸<·ÿ ½$5)¶ª´¤@ROŠùjF jRÎXOjRÌ_ÃTñç±ë5Û%˜Ýƒ±Ý«éÁÕø‹‰Ã¯(â‰÷į8‰.ÎÝ}5ö­&GAzR®Ž'5_Ögiùžô".µýÄk»ñâøwWo®f|}6Íòys6C±ïûzÅÍ‘þ¾^ið»qYJ„ÂUáê™r´Úø»{¸¶—36ég˜»Ô›¦I?3^˜rò™]y–ævÏŒh¹»g¶¯¥¦üèô@=-@´TzzJm—Ú~Fµ óáŒÃÎtˆÚ͹ë™ÏMz=-JºéGPK¬á£õJK>2VôϵlÁT±Z¾5Î8«åŒ€”hEmŠÚ,¢6/ë]tàjìÇu™ópš˜næÂȲ†LwXI<ÂéT=[(áØ Gƒfç×”lyÃT²ehY@m@0E¾_£|½«‚~×ã«è•uIgžÔrK“»¶^ir¿ jjz캂’¯ÂJz€µtKm—Úþ’kýœéGLOí`“ˆ?«1`»ãàÕFÍVÍM0Žð{0â.€Ê~†£qîî™±oEîa÷HK2«¸ö5ôô»l4ô”Ú.µýUÔv8 ±›U¢vÜoÔ´«X û°«o_†)µ`¬Ú¨ó€«jjÁ” /^*Ü=|i<¨s”›~cœmµÑ:ª}òFú _ÁI&JÆ©wödÕ9|ßbÑiÜ&|g»ÄÄœYŠ0®Sž^{²»FŒ?îÀw:Á@ôö$Sø¸%y (¥Á÷`O©Rš.ŸÂY|Äïa#q¯aƒo¢² rï1¢Ã !‘±­²¼<·60ØP#”vB¢ŒÚÆPqSÛ°b¡edU˜F†é4ʬ@¼Hm %ÅèH50\nN–(nžA\"J¸½6›&•b ­CjºTY¹t%…ú𦆂Ñ»a OmÊS„¾fë£C±_3•¢{?éS!ðF›ò‰C*²߃CŸC Hj¨—äeßćC¤*3ä›—è}Üøe³†oÝ€,û¾»™‚ÆH}™wé7{1ù·•õ ¾¡íj+Jä‚…µ5©}driT9™¿¾ƒðï\5Žá®Úh`ü¦oa¨¹¢qºåã+ÛŸÊä˾ŠE¿‹ú7ÃWMŠiTã*å†ÅÔè­‹ÍØæÞÞÖ¶™.Ü&h¦ó÷¯M_Ÿ[|äµÜk†c<Ÿç÷aÓÂ뜧 ò–“}kÍ2ÿ>Ȥ^[鸾M>¸pϹ‹K8_ô:)<+šiñÍ Ïè̼øÂËéA:Í”îÍŸ^§{âC—×N®ðh€9†ÈJ×ë¦ß×Yås¯óÊ% *ßxP9Ξ±\×~7sÊ·õá/3Ú×ÝR¡`öí”öºˆœSùóÚG(~Jûú­SÔ [\²‡;½GMnŸàí°õ¼jm£{H¾äÁF[é£Á5 ÖÝŒ #©/¦ê/Smp>4d;‘4Àhòåç‹05&j£BF»‰FÈ>¦Ét½ F–Ž3NZ÷‹3‰†¾y„Ñ5¼iyú¨ÎE@¡9_Èa:P„ó¡‰D,2ê7MGz ˜éª7Éñ)L‘1†Ü¸4ÊikR6©‘òtY½+ž£{ )žáàÒÔuЦ`æ,ÕŒ®vµIõ¼&-$QßÕ& “Šx­€P™×š¡cZ™‚v*¯·óÎ5œr‘UYÝ{ ™F¹­@ʹNZ•ÿíóî8‡ÚGHÍàY4:Îæ óa§í8çs-u˜¨ÆçÁ†cÂ.e¯!8þ’‡½ài”P Æ(M*yÅ«ã%“| w C˜á¨!H?æ4 3ìÀG(dbN-»lò xÌÒ`1Ô=®‡ÉãÞù ж[iHá‰79 vÈpj=.bTÀp|(C4ª ’7c=ΠŒ&&"*-UOËŽ˜| ~òw%$Ó$5°Iqš…¤"21§Ž–Ýøi2±¿6/£5ÖïþÑvy|uÁ+`.õ~øÄØÀè™äÉz%Ë?ó R ‚'ÐØ*xéžÖIÅ>Y¯ôò-5UjêéÖ”ó5›ÝC}>lλÍÓ$¾Ṳ̀ }‡¦E‡°-~_¯´øÏÂ빂)и2–°W¥¶Ÿcm{k‡ÏÀ õI 5ÃG’XÝ¥ ”/Å; Ø«ûøýC˜¿ÑgŸ‹’朴æ!vg”عÒc˜¿pD‹1#”£“ÃÊFÑ·þJ%4Vcc(ÆPŒ¡ÃWo Ý8bóÆn1ÂFæu¯Æ²ü]G—ß=3j¬Êï_Û=Lòüîcè)ìá J½xp—­^<ë•Z¼v“Z¼EûŠöí+Ú÷Lµ¯oš¡Á†ß‡kø1пLÚk#bU~÷ ú%šüî5nÒQäwñ¬µ^<0)«/>³1+Õâ±0zñ¬WJñFƒ­x‚*×°U®OWS:ñt‹:ñÀ¸¬h_Ѿ¢}OJû\£×ÿ@|#3˜>o®ñÇöáZW›"r’Í&2ÊG-r2‘¡Æ20lQ$a0‰X‰PÊÒ*êaGUݘ¦”Õ]T§¨NQ¢:EuŠê<ÕÁùŠ7o7Wü›ÇWçþ#nL¤ó%—„’ÀR£Ã€SjŒºÂ[f´& ´WhQ‹ažBô -θé1¬Ö¨1ÎW79ªÃ°³šzŒb ÅŠ1cøjŒÁt šM4L¬œ÷¡ ^S_Œ4oÿ2˜UÒÂȉZ¯ô 3nZ){Q0S¦fÈ­.éÕÆÂ¨¥.™)ˆŠ`ŠÚµ)jóªka(]ãˆ:ø¸ÛüÑÆC¸'“P¬WzŒãÆí†ÔaØÝjŒ«ÝסÄÀ zŒÇïcÑ1"ÑÈ1zÑh0¼h”(=†I¥7†bPÅ ŠAƒzêåzv z ~‹ ûlÒU{ˆ9r ŸN¦€Q³å!Ølª@q!µ(81¡GÁ=«  ¸]¢Z;Ý¢FÁiºPz T¡t¨Dq¨E±¨FÁºÒ£@]”‚RP ÊQlעݜ/#àØe¤=å I¾Á¼’Wd¨‘R>Á°“z$èΤ‚O06V¾6§¾¦°_^ä[ä+”o?à “žÃsÊÆ#AäFˆbV[çÕ¿´II'vãJnñÑgô’â K…¥ÂRa©°TX*,–¾z–‚yízL×7Š…Ýæü©7pô®ƒïS3à&K^–T†\8&YnFPÄIÁÝ,â$H1¥ e¬°›“Ö 2Àñ|¥€ÝýÆZGLéêÈQ 8ñBBÞX¦pí¦hÔ†å™*......þb<8Ù€b_]}óÑ_à†%‘ó$rD¯ˆy9€nžDŽAà)e6ü–œ—`4ÜD[ÂåÜØнWqãrt|•œÃ49»1”VÎQ<9eG­5£×OÎÖ‰Ó$zë´ó$j9{sPÊÙ^6Z¬³Xg±ÎbÅ:‹uëtƒH“LÓ°c‡(1B­Q`tZ£Ã~“+Pø­C1†b žcÀ výÜR‚©5Œ‡ëQ¦ %J 4K=F05¦Âpó†jŒA D)FÈ–ó¥Å€zŒ‡/jŒ#l]ÐcE.Š\¹(rQdL‚s©0L-.HY”\\åšNBIàÍAƒáÍA‰æ Çx„óAzŒsínÕÐaœ»“S* HЇ“côaÁ4µ›ÚWb`Mé1Š1c(ÆPŒáÙv `"áqG)ÄñGÁ S‰æ“ŒC+Šp NÁ)8§àœ‚óe⼬vƒYcþ5é›ÇW»¼´?ˆÒP¿w]TrŽäwXåÑ!àwìéªð‹=…©åÊv»•\™Nw‘K‘Ë‚rAó¯_Á/ a^íE0EaŠ\¾¹¸Ößþ@ü@€z³{|Õ],Vûûp=Xàœ?e?[¯4¹»g°O^M­l5=6b­–DQÓãi)Ò-Ò-Ò¥tn ñ{ð·5í:.,ðúðƒvázŒpóÚüsy|u5ÍÀÊN'ºÏÆÛI² 3áÂ?Û0Ó ¤”38u*H˜ÉàHerBÖrf/Rsf¸ÒTµÏ YÃYB8ÎŒp´JÜökIZÎrÂ)æY̳˜g1ÏbžÅ<‹yó,æI2Ï`Tä†êt@FwA¥ûòøÝåZo®æ-:%•Á0ÅÍ’Ì .!ËÐ#ä$ÊlÀÑՅΔ øâÝ…RÀI¦DdSj¶êêÝ1U\\\\\\\\øetî=1øhK±ßmLqV–TªDDÓ¹,© ñYO1YSL1ÈòLI8©¢“žz'˜*........þšü²Ún7U»{È„0}ˆ?‚Âus…èYÕö!› ?úµœ<£À7O*Ç((°Œ2»ê#æ¦Ë‘$‡O™=æ,æÆå°ñåôrN†ÈæSf£ëåœ%‡GY¤XN,_jµæ {ôZé_±ÎbÅ:‹uë,ÖY¬³X§ø} ,mñXZÕ £í'?ÂJÄ>Vm.Œ3%C:9Âp2¤“ãÅbz‚<Œ’ XÙˆt˜<€ÑnBVÇQšFJÑ>i‡i`ô+Wº.9Â,@Ð(6ºŒ {u›š TÀwA ~J³´5¾„Ÿ@½ŸH(Žˆ £&(¥8‚:AÅáÂ(Ê+‹ Lq\ÅqÇUדq\/Ãîx7íGÿÞ$?V™1r(”ô™Ô¦óW¨)Ôj 5…šBM¡¦PS¨)Ô ÂJnFqKKm—Ú.µ]j»Ôv©íRÛ_NmŸÌç°ƒw®ª}àî´I‡©ƿ̥›K3ž”ts©¦G3Ð!ÿHh†©DÒ Uh†š%j+H“‰6U›ŠF ä:‹æBNêj«XC±†b ÅŠ5k¦ oØpý«nn-º.0ãÌ%r+ŽsɦÅ× J±<)*¬x&UŠÕ‘¢ÃŠâȉ±J•**UTª¨TQ©¢REä*M@=v§L–î ôê`Ö*°*L6—wÇÍ'›N„‚!™KäIQa "} ±pë«F¬^.¥ŠJ•**UTª¨TQ©¢eªÈw`²Îu‘`¦ úNæ¯É|ƒMõг‡áéÒ͆¢!œ»ìÙ0FBDœ€ÔpcÓáa7•?¡ãæ1´ŠØGÒÉ•XYÛœ2Ð×6꾶ÚÒÉÇÊX-ŸõJ]Û¶¦ôµmÒE5%G„ÅŠ5k(ÖP¬aœ2šþj÷QðÃêÅ•ë¾J¿˜zÒBTÉMĕӒÝ⸠ƒå)ðà4…š«RÝ‚êŽ i×lvhBm:& Æg:æßßæ£þð°ýì¶,÷0>“’/ܳ_‰ØUÊF%77¡¯í(:“†/79¡åk½*µ]j»Ôv©í»×ö`Õö„©¡‹;ŽrìÞ¥B“I9£w¦¢„9ãw]l=]Ø =vð£¦'"£ õFOOíGHOgÝ:zÆa™d¨0-¡§§XB±„b _ˆ%$ÛºnSVáèÞ¥c3 9£w>Î?gô.Ú‰‰Ú3¥¡-JOOôJHOgQ:zÆÑÉD¨LOW%=–)5=ÅŠ%Køb,!në¶›j ‡Ä+8Fž>”~œxM}Ùúä ^ÚÙOYÞð%Ø¥Ž!|iìRÉÐÕN‘¨ªl„-CøÈY@Ê` Hy AFÌ¿/ eàj)#ŒZÊÅ8‹q㼩qލ˜UÝdN7uö`zôŠó÷,2óŒ_¬WbÂþо¬ˆ¦ˆ¦ˆ¦ˆæ¹Š&Ùdc»ðxdÓ¤MN<†v$SOü²ÏáÀÉ‹F‡ŠF,éê¨Ôv©íRÛ_Um¼~ƒWWv»oxî=:Sg“oXÏq7‰ÉŸÍS"Ù]“j¤8$€ÉNp¨‘ìÊ¡ e£G*zSô¦èÍSÒ›Îý»¥6hà®{“ÚûaßæÎ‰ØøÿdßqÞ$ÎKðPqäT® W…«ÂUáê¦\Ç ÐAëãþÀïÿÖÝóõj_ã!«k»Uü]¯´Œ¥¯D(´Pi™Q–ö²s½–zÓ\v§ÍÃãw0Ò5ʆ·‡^Mòà‘àAA)(å¢XÏÞÎïbülX/I ‡¿kÇRo-”ûCºø‰è»Ò)ì÷õJ‹P¸*\}Õ\yŸPƒK¨G¨a¦öÒ\°ój~m.öwà+<-Í~‚èSðÞuÿTLLÌêèÀOX×ÑÓœãÂóJû ]7£fž®®µÙ·7¬§éO!mó÷öÀÜŽ– ^m!QÕYŸ'^Žñg¨¤á›Žò]¸O§ ¿aw¼´Èî펛ÇïÞ½6IÞš¿0ë~mëù·ë•&·ÿ <ÉswoaUž»#E‘»{Û‘¿* :õvçD|« ŠZ}{üÞ¼¯Íœ5áL†Ér†ï@ad9£wxVjzz!=Xë•­Œ~Y;ܬâ*ãhðA>àÔ|ð­­ÝYÑ©·ôw;ç—HOg Fΰ7 [µ¬Ã/¦Íßm¶µ3ÿÂÖøwo6ïN{ó%|P5Ã'™$çÖ8»a¢ ÁêðËÉöÐ*1ÎÆi>Wjí»ÉDóI ~ó8°ÿuã *5ðœáb’ÍvŽö~>íãïF‰¦‡1—„À4æ#øþÒ´waåõóýáêX£´}ýÆšk4j å¾ÃúÄ;WZ& %AÇRÁ bÄÆL 7ñŒrP‡`·æ9دE ¸ò2IÖ+B¢‚³NX·;WØ4dƒ›/p~9‚ßh/AÄÑkç9‚»vƒìÝÀw4›ÝÃzÕâ,+_°’º?u´ÕjwÈ¥³cø'rʾfÂÙB~¶Q&3^àeKó ®†]vâ!G$ž˜ªõꔕ?µžLºXÆbÄ~3_œ’‰ˆóGÔöø¼wômqkw¯W;\Ó´ ûÛ`ç–)´ÿ²;¤ÙþÍ[ß[çw/0R¸"ÿ9؉wÊð•Ì’ÌÐo~#gIe0£:¥XÎÁÆ@%[Y Ÿ2¤¤éÅ¿l2:–‘ÍL2–ÑâL²~üoPÝðßíÂèÇþv©þ}xìž3åô_Àô Á0ú¨þ…½ÓBžß¿€Û}5ù®à!±ßÇÌ’xî*N–TÓV,@ §È,ö¾âˆ”S†” z³µÍÃBb²ÉÈX°ø=NL+<Ú@ÈûÁÎk‡ ú·WÛ°<š´v;⃿àÑ=Áã4Më3$’·ö.Éæ4—p× È2ÜõjŽb ®é‚¶æg À¢º„r(˜âÊ æWµÃ%Ix6…A™­…y(®gž5Çŵ&!«$ñv…A(á>9.›LC-$iâ™YìÆÆ/æ 6ªBìÉ „ÿžÕÕæÚ´™ ¼…¸v§0‘Ý8|>'±éÛã­`ü]ïãM´ñû(Ýv˜Øõ0yP«lH×=&çB¸.I':Ï …P™ó¸p§6R²Ê4O¨ ‹W4ðAòeµxœ|ß8 ΰ!6ìÃâU‚a›ŽÍ7NÚ9¥zã'”ºÍôHXÿÀ—'†É Ÿ<¬O&¤é$“s!'I'²7ªçƒB¨ÌyHq RI3ýX:JLx`àyµañš@‹azƒœ<óÞLv4o;Ñ»ƒI°·¸ÏÀÍ=úSXPðĕԧ÷S˜AŽ VɸÆM ‘¸0lž¥x6ÛäÒ1p>K„× è‘` ª¨gŸ¾;rC­ç4…0ÙÌÕ˜’³ÎsÑ;ƒ \´o–Æ$ÒŸp|¹°„“åPKq8óÜ ¼FÞhvöÌScU„ËÕ•éñ_Í?çK½3Ÿš}ø¼…Üæ8zndÌÌ‘H ùöùxB¢$‘Ô´¹t²oL‰->Ã-ADr‚çGDe£ÖñðÐd·ã²‰¾twåu÷£M1ƒ•ÿþù¾;Ù¾ˆ}ûÝ»fKC U¾ës¹+\”-ïì *ZZìmjZ.ö\ž–{ôLŒ¾s[Θ¥Ê¶ÛèØ¥˶[٥ʱ1J•h §ô¡àúO¬è4PDK/‡/Ic+ª·J~3žTi™‹¢hôŽ3n]¤/3("Ê NUž_*Ê0 ÛnKu~öw¹fÚíŽÛà ”Ó%<á¶Óÿ2šmÀf·k?öMsóÔ4ûÜžçQÐ?Ç;‰¤ôåãþQù¨Á›§èy²EÆGKg Íé–*%=¬*¾l\/~õ¦*]–ˆMUeŠD?¡·ªŽ¾¤CA™®Ÿi2€J„Öæ[Õ€œ@fäψœ`|‚qRû MðùTgŽðnƒçæË»‹›B‚w§0´Ý–0¸éÐHƒ à(ˆÊ÷A¡øDå£Ë(ˆÊOµ¦Q•G)Ó4{bˆ…æŠÜæ'–´¢ª$²™áÓEçUoê\¼˜‚ùªº‹U¥ŠœSãHP¦ªÏ`UŸÃÈŸ9Aðø 7BíYž&ø Š A4Ѻ£òásüÒÉ?ÚW8 ‡ ›' D³÷¹ð[|ƒ® #C†#ô2¸ñ[AF.”“ ›v4Ñ0&%h¼(·äd¹Ž+FÉÉr+fɉr 1ZÍ#«Í|•Û¹6m•³Ô&Ëþz%R6ºÚ0ÍÕ^=Z"2¶l@c™Ó›¥É°•†Yƒ–¦i¶È4Ez,§©ÓãN~Æ+Á1Æ:ü{n®§(N žÄ £n„Ñ+ `ÿ¢äãöê]ê(áÙnÙN@TftU7aNæp¢hBRÜOKJ‡GŠY¢%…ˆ“Ëåƒ!°‚yRÎ8ôOd$q9ãòY8yu€y-)JœzP]B 8YÊ!VŒ§ˆ”­Äó,à1& 2⃠8Ô shÊEµbÒ„K^sz·@ý±ß~Fk½z€·µkÒ‘xÂç0gޱÎn€æFY€Æjc8Ò o¯¥$©ð4à„…œŠŽ†D]2°ž†0Vâ4È´=W¬ÂÇEÛ*ç>*º›êb>*ú+U@šôa"Z®w]Ñ8ƒ'×;o ‘èêmP ´˜fƒDrb†J>[rša+ÒŸ•o‚Ï8cˆù` á 0â¶yµ ÞØ…|ÿÆ®ã×›`ß¼vÆVƒ|õ ȃS+¨èh€¬œŠŽÉLHEÖ'¥ößÖ«UŒ‰sjö´‰)ƒƒÜI©ñ(ÃÎ}RjL×ÌÔ§…H¢05M‰2A¶' xLDá•R†Jí]Eocí}v6Po#”ªØÀ—lƒ¦Ô.‹„=¿hÊ"Žw<¯¶q8a˜Y¹Ø™•K³%tÁnc€Z†VÈ)är 9 rpú½¨>79OL:OŒœ‰ñ ‹v>ž>7_j åçÞÂsd€>y P ÐÂ@Û rlÔo%9Ø'X€T°SÈ)ä܆œzTŸ›œ'&'FNnÆýØÝK0Y¾ žÛÛvá뾆!!¼6”í8ë$Æ9€]`þ˜D"œ!0“N’á ð‚8ÎãüªRË*9Æú¢JáÌÜé ÒB1NL îáUk5O5Ä€UrŒÓ]bWÓáôWCè´%*\ §Þqöy` #t=Îè¦ ¡bpý´gy•æ©ÒÂèáÜrŠ/šh6×]xí@uÄ÷f@ ßÌ[¸tk¼è0ƒÜåÉ%1ºÞ ’h…C`Ù G dÏÜ‘ä8…]t"¨j›p½RVµÍŠ¢ÑTõÕÍ h«Úò¤®jT¾%t¦S>MU‡²‘WµÂ=ךª¶Èö ¾¢ªÝm2ʪ¶ÈÈ[QÕ(ä‰ t+ß^[Õö´ºª;ÃÔU5<‡;#uU}Š+JÕÆ SªªÆäÎSÒMspÕctûG0à~ÓRð.±Ÿ[$èáuúŽÊÁꇸÔåQIžI¨ÁÝ6iÉiëî¶IKŽŠêë‰V«YÚ쥑ÄZ@í¸âkœeL›“Öú 5UÖà§XÃj á<2¢ì‹5|éÖŸVr i³‡ËÑwûÌM;Ûà9Âõïºj5ÁQ  ¨ëÕWDÛ< 6˜§à™J[·×†’£Íô¶èõ‘§ /{’¢ô´AOT¨+*ÖÕB(‹QûÏÅŠ5 PÜ~Ùe_¬áË·lN7þœÉ›QlVáÁ[Vóä{–0Åèš°møÑaÄëßâ–(h¼/毥2H ƒÄL¨ƒ{€ájèLìõ*O(Êo*KÊÀvWÝ1å9‚20|yޱáØ[žc¨ÌÅ{<(X…æËs„m׸òA† ¨võAjFž„fXcFÊèŒÖ"Æ­¨vX§P˜Qp©¦ÆŒ>£÷´û€C¨}ñžÏß{Úæ½~|¿ÍÆ® G |k/•Ä딂Cª÷O°Â—úŠ'8 SNCÈ%àç–5@°åY„퓈YD³È Ÿò_êãD:К9 EVkÔ@^kf€|G{ãŽu]mÀ~€s¯Z›ªÞ\ÚÓ†tušÿŒÁþãtÑUláçºÊawQ¨è ìf]ôI+·ðTx*<ž O…§%xŠ/„°ë/•§çXOÏ‘§áÌêã«hÜ…L0{‰íãà.Ät0Ÿý­ŠÁGÃ÷²‡‰r ÍdaþU£Âº«OY<Œ@aš…ÏÃÜ¥DF #Ë@l<Œ [§®såkRxE2S0!v&K]éÃK… ë•„‡QaIk(Öð…[CterZk(ÖÀ±†¹Åg8ºäî4yœ¸!4s ix×(¬u_ Íó÷–f/Ìa{Ð&ó=dÃ{ ¥*£O×ù¬¼O?å`«|Ui}Ö}}:E±œUiUù¶>k!†¥ÏÒøôý%Ž‹ƒû¾|jßnÎ;Ê•á£$6 Æà"èàcED^¯ÆØÓÈ0Ñ:z¡àé…fŠ„†JÉ Û™?;Ž;¶H;Õ«`§¯(;®Hˆ[§aÇÁ!5vâëÜÅìX<«} v²©qC5¦±cßÙûè4ìÜ\9ìX<¼OÃŽE6²¹óÙqEÚE*9;·Qc1;ò¶!ì­œÂÎ)g9tNÔmƒ]_Ò±ã­\£Æ]ݸºÒ:SˆOÁŽEÆñ¦†«§Fß6 ŒŽ5†nL…ðߣéŽm0/pÔúÞ™¿ûgí2·¢g.NoWï>Nµ ‘E¸~a2@ÆIÆD‰SåÙËSeœ„¸þzy­„‚ _&'ayXWBN‚,xKS×–`ñ—ÍIPÞP9œ¸ö‚Z'Áó€)6»9lE]c–€)6'ÝGÓUÒÛe¯ÂšºÆu!9'Aynéc)»ÔIÈîr²¨].ËÕÕu·œ£ñÁ:»Œqù­T½ÍµRЪßÓ.oÕJu5bÛL¥]¾A–¶RiݺeBÛJÙMVg8gxÆÖfÂê3ô¯ ì¹ÚB 0sVoü.v¸ž§ÐÜfw÷fÈ%±»èëM·‰Þ~ôžÎÄÃÅ1C‡Œ§2%N•ˆRN\2ˆ9y1%å$(/`ŠÍI˜¥;Ø ‘PχÁH8 “à­ZBNB\ÞÉ8Ö•“¨<»}U-!30s”F®³ËwS: ¹à"NŠç*žkšwp¬[uñ\Åsi=—Ézx|SY¶£eºc¯`.Ë÷µ`{ûã«ö€³fßÁAÁ·oÜŽxu è¶ãwïRéºýø#ÆmÈ÷Ÿý:—‘ï¦ °ç RoFãýÔÌ¢Û~qªüz5#:g0Ñ&j\°=哿ög•‚À† Ös†ËT p6P!gЈ« ÁŒ¡—æÕ}>¥:Înnâ x»îÁsQ Îîeâ4x_OJÎîjâøÀÄ5œÝÛÄ'áý ¼9Îì©Å$gõg3ñ<üB]F[½¬‰§àC5–sÓ[¼^Ȳ&Ã÷'7Yœ…ûÑŽ¼È·£a'ºŒ-Ì3NG$ƒeÙ8‰ ö–[6N4bB´Y@¼A|¾ÔÀA”6) Ì_¥˜´ûŠØÕ2LƒAµL‡Á“ÎFr¤1Ä~yÀ > Fq|°BâôÆÄ­çx³©ýÜ7Œ›ÍC‹³p­Å[ŠB„n3Xô¡»ýójë߸€ï¹t68¼1ÃÏU•ƒß§K¢”½µaIÆ!Óh°± ¤!(W§K¢”m.Mª“¼â4’”†>,3j6SNwß_ª¯öŒ¤Œ†€{á€V‹±¦ôZŒVµ€Ç5.—··*¬J¦Å8o¨×â·á= * Šê\¨Åé:É;ïIY¼b+µØ^z¡ÖbxncL«´>á.­Ç(ÖâwöÊ3µ÷÷x(ý aj¦$wÓJŠ×ºû†çÔZœ÷¤L^û iT~¹RkqWãÚ¶ÏÔ¹^‹C«Rh±ïè´C- Åçʤ qû>pûˆ¡æÛFÕ¸Z ‘ê7po*.¬Øðöö)®½tÏÓI0Z¾_ȹÀ÷±ªƒd4|¸¨6SÂW©ÏQk¸%'’øË”œá­¹S²£q§6E2’øêÖrT”Š33tkKŸf«9ó×À(9ùC¼uN*y¿«p%g}EÝÑÂóøa…Ë9à ÚÏbá)üq…K8³+óyïxk â§+œÏY¯€ ÎTÞáÛ{žÄ튽 ¨«¨ÐÒj>g¸ÝEi8krÓ“UgÖž”vp¯“ÊÙòv°T‹™î)î+¼.º“×þ>àwÁÓjÞ‘ü.“(¸Ìø|4Ô÷‰Ìð9W¶lõ%˜š™/9Š+'¼’Sø8ì˜ß]جæÌŒ;$2à»»µuœ¡ŸH–ÀãÌHX¡-=>VøœVðGÏ™½1\Í™W-gâè8ëïAWqf¹Rsf<μ¾8ƒ*_Âw!Μ MBÈÙí|—ˆ3×Ì(9»±ïâq†•Ldú‡iÎêÏ廸Þw±Ú•qÝËwñCߥàìž¾kßô–ú>îšO‡ƒy‡AÅ1ö|ùÇwð¯þ®5ŸwƒWãTUã’A̘ u íǪ’’ŠÁ™ðÉ‚Rņïl”>) pú„LD¾»L Ô¸èô'¹eñº^©ˆðÅ „EBRÁò&«fÓ¼-.Z\´¸hqÑb¥·í‹-þ"´øIö|χýæŠÓ¦Aë|ÅéÔ«ýØ=màx˜Œ ^¦Ò™>ºIxÅÙÜ.™ûXU®ètª$R9p+SÒž@…§çæåTørlÔ·É’(娸Ì<¹&¸Å[9ÝGˆ̬ÝT96иH®a9=ŽW» ôõJG…+§æ¥r Rsk7É-V•΢ ™]cRë2x.‰\Ü:¦´º KUO5('¶±"Öè²µµ.ƒþ©|Ä9òêj]¾}ëÀâ¶W•.ÛÊRë²ÝQ¡ÖeO W®Í¤uîžDë Õe»B­Ë0¥y‡ÖÆ­7y{·ï;€êÖ!è*ityÐeê²ï Û ¢Þ0Lãtñ¹Ÿ@~a€.ìÄ7ö NQ·AÄ[›¹{ÄÀDÇ=/F)MmoEaŒ'ÓR‹€0ÆB>Â"àd£Œ0¥ }-âc@[ÊGŸÍÒ"ã#HéC3+«ÜE(WVy2Â3[T½æ©ª< Z]…™«‡6”ŒFu‡Á¯UUÞ3¥ªrã€si½o;À2Äùûèáñ;Xƒ»Àß ''Ð×uö·Þì/ ú»Ý¥ª`ÒÖð.¯ÑõÖÓÞöäŸÃÖÅàMîs£Ú†ôùϸ³ø]ø¦ª)åJ„kÔDå>ãé)Bº*í6©<*ý½yìòãç¦RUKøg2»òÅRê¨É×&…ʈ¹”Œ]ikéL–Ï”R‚‰”ì%7TÏKÉ]•¨Õe[ã哤„³[|Ï0úŒÒùža(%èÊêj Óc˜hZùSR ôO%%á¢ÔºÒ3þ+%\Xg–ŸRJÿRŠk\,%Ûâ©u9lñR·¿")åÚ_®”-žTJÉ-%ãqè ôÞX×ÊØ+ ´}ÎÿQʯˆ§‘KiìERÊ´¿\)á´¾_k/cQöÔ¥d{ʾÀÀË¥4ãq¨RÊSãrÐÇJ)ã¹R²—èÚ‘ÛÙ®\ã$—Þ}ÿöŒóboÍP®ÅIªãxëäåìv@\p±ºÞ¼{óh/^?Mtiýý{=!鸰žB·Oñz8z©¹2»}©­ˆ0Ø* GDغ8¢§xÝ’HñGl©”õôgyÕõ„ÔÅ„Š#G$Œˆ9a5Šz‹#¢E.Ž'UOa™.ŠÜ_Ù2Ñ2Eâøüõ”)Ó]«ñWg±JÅñ™ê‰RnC¹Ê_Ù%%]»âŠ‚û]µõR£3Pè¨ü•FŠa)jø„ážA•¿Šh J­æÅÑ<ÕzÂ2ñ¿ ;lŠvåÆõ$p¤¸CYßñó<‰Û•ÏTOSU,̉£¤À ¦¾Øý íàY}9˜œ\7¿›ë[ûüò6óôú#ú/‰Ô°ã¶CO4̾Ãñ7½Ô\™ë½Ôv" næp¤É ³(qÄè š8¢2=OqD„ykêé­Ã‰##Ç  ŽHÂà†v]=%¨áˆ#| {‰dâˆ>âXU]Ooa¬ª®' F*ލ Óú«6Gœ°ˆE=©üUG‹\OªžÂ2¿zkÇ@ªvå³ÖS¦L#µ¿2e$Ãõ÷«'JÀå¥äR«,§¾“dJmŽ4ÓIâzŽžvÝ¥#é˜ KQÃ'ì³vüF¦’Ìg©§å;~v+Èšê ×úÕ…0r‘ø’°(IW(NLé4ØíÑj°ÕbHº}I.’>:@¿ PtÕ0r‘è|ú(Q¾%´%ì[ÔÞ|ŸNt8šêòÒÑ6Á÷òé4Ú2n”K›¯reìD3Erlà Š­¸´ÅnT\]‘•;°Èʘ…Q7ÁÏ%mož¢O×6ÁΤ”Mð=|:Ž[`-¨Æ%!3n-e5î,3ãµÀÂNív0àHkøCÊÁÓôÇ>íz¬öE¦?ÚX xÿ´ #A,6Wèz5(VF[ñC ’ž¶ Œ_$ýS7ß+I÷ÑÞò IWÆ’‹¤+ Ï©‰EâK²(b‘xØýd* îBl(5>-–‹¤û#IƤÄÕå‚1j«ËGX“‰¤ûˆ‘YÄ"‰MJ§Áµ]£×i°Ë€\ÝѧO' ƒˆ)ªËz?©H<|ç(t>=áµ$í nõÔip芵M0öÕût{Ò\(’ž6»+W]]ŸÁ§Ÿh>½RT—q£Ú^‰u£Køô¸ªt>]߉y?mOŧ‰¶T7I@›'FçӮخ·<~¡õÍ_3p½epëùÛì6»G ooCÜ»/¸‚Œqý.ò aÊÞ¾q±RÏŸmèÃaÀõå>»°x_Ž”€(½½\E@* 6³¤Ò [È’J&Ô#! KŒ¨ªÎ6 ½R'uqÈH•:A¨ÙRW•Ý0°dU1Õ?&cÆIÔ?&ô˨ª/ÆQ¤ŠAjîUUó„âN'­£(>½øô§è(ŠOÿ¬Uu"WUõå8ŠâÓ¿˜ªúÚ}ºä6×Ú˜a ·ü´›6¢6pÐùˆ·ã¿öçl'ZÿÄdM$Š“ìÇéq*3Ÿƒ jÆòôÙ$ëÕ$­TÐŽв  ©TƒôHŒPªAz¤F_UÆÕH¥š×&Âù“@ê˜ÏQ8×z+òGUÙÞ‡ ½x€nˆQÖ5 „FâHÂ2ß3ˆIL‘%ìÌ@Ú´ÈÐJo ÖR:ŒÒpÜÀ¨|)*p} \ú Ä•)jPÐ~Óàß° 8ðä4åpé0pÓpcº{ž\Q®¤-Źš“R**Øx‚С¥cŸ)h½J‰-tSO¯´š.ŒTø6ÊÄÕM¢>¤Ý!Ö·Óšâ3 #Û‰àðü™VeàÌâ*³œÃÒªK©”£.;$»W—t¸g®ºØáxC¤.®[™Öuÿ3i¨§l4NèP0$^•Î ôކ¦zµéDeÅ”,íi»šLiwk Æó­ËwìÚÌ7™P$@Ð [¨Y8çŸ8ÊÚž"¬²:F@âWÛM;Ý¢òÏÀ2'J?¸ÒçøÂ[ÈØ|5Côõ*+·9ô³D$›®|ß³Ù4ä˜s]|JñS•†a~²Â#Wøb–h»nË›lH{A¯ðlGî‹›Uû\]UUs–Ç]Ï`6èAkœžEç)Û9þF5ˆ7HÌ;7“œÊ$wAã;i|3èxð†êV²Ü3~|uJ«¦HoHîRêŒapLæj “|Îb Oÿ<­’6‚Áœ[™c ç2æÆ`â‹› ç–fÌÆ‘sÖ6kÎ03D6‰2&cõñù‚¹Gr;¯°€)_ônã{×y™YÃ3hÄ&`(ÄDt< cèp’{#_Œ+‚÷5›£)+‚ƒ(ïaw.*DÛu”jCw ºÑ½1‘ußüãÃÀ´Î÷ž¦Áj?‹!¥& à²Û0ÓuªØ Û .%:®T.¡õ d¤•Ð5!C!SmDìEO@pi²ˆ}ž&áiBcID¬Ø%õ€§FPf€J‘m|eJÔ›T&Ý.OÌÐ(Çj4ª°[SjO‚˜„xš9‚pžMMå‰/!–i4Æñ¥‘“Ôä¡mRæ,²‘4º†tãGBß%£dÒn@•Žfõ²Øx’|Ç)Þu¼ê¨ì~.3,Ë]ßÕoR…P‹…­Øœ©L†3V¾–&!¼[¨˜ì ÍW!N d‰'W¡öjeÜx˜¡KÕBd[BšÑ>†ËÌ\Æ4— ªº†\Ö±0ÝB¤Ø$-“ÓNg2 ›¢ñ8ÖÄ6ÙÏ; ´¶w<îs. —CŒÄ5Hª90Ùó ŒVÂ=9S³ÝŸ‰R°«OÑÕi&í¶‰AFLF>eÑàyÚå`Wb^Sª‹°\FQÔöœË¡û› {ƒ¸QG&ðw€æJ?tÒšÔSã7¢÷ú9iã Þš"ð–Sç¸Ô^”æc’ ÍÆ/¦Ù%¡7‰ ã µq8Œûëq§QÑ^cH»­8œªÎÙدQûRü²›€‘µßp ñ|^ún¸«§/ÌÞì¢áç°é{ÅüЉª§üD3¦Åb¤Ÿ‰Š6ûØñRåíëןu ‹ÍP·PnáF‘ièµkŸŠ™á쬶ÎÑ.¹3~Ûo·–ðÒ•éf®§MfÎ`‹ê)^ìÄùŒìl§XÄGˆj×4N¥(Ø´z¥â+ Ù¦ÔM˵=·~ …ÂÈÚî¡è™ÙŠ4:ìIäÅÀ¢ÌäŒîaž«•¦cdäf|y]ðH¹GîöZ‰yñœLyâ)Ÿ©k^rFŸöÄɳHÉÈ!#/‘ŒtÒ‘1 Ó£r ÖmNûЧh¥Qª†ñ …@Â} ˜^ªÁ©¶\ƒ"`ÅX*W5̈ÖH6L¹ª`’Ú,âÊ5(e#”« fŠÖè˜Ü(–ƒ1¾TmWvϫڮ0$f„Cå m*è/äÝßô§®T5ƃɺxKWí° ~fŠFe2d¿Úó0é󲂷©x&ÐpëzÖ $¢` Ãû– 8BÅʾväÌ6_ÌiÑŸÆê#çÌ>]Îb’ŸÄΑÉ;а¥‘²+žˆ/ïPÈ9,8Ë TºlÛ«SWNPè “g䓯áÖC­aš¦_ÂÈíA¥a†ÞTŽD¬6Ì„Ãʨ'G†u°X]P«ÖŽ%£d B¾¼1®Ò0g]FDOoänšÊ0¯Ø5Q¦ õML@¨†k:Þ‰…»8ÒY\Cƒ‹F`:U*4\—ºP œ.ÎâÐÉÏ á^r®0Æ ìbƒütqÃ8]B4pé,ò“Åá1B½êxcPªNWß:ÕÁc¦æ'ТˆVrÕ‰âùÉU§×> šõ \Í¿±ŸÐªŽ ý¤V;?«V§}ZÕqLiUÛ… î ÜuQ¦Ñv÷ö*´‘C¿³ŸˆÑúVJ¥:÷ó4[Qm*Þ dKLJ¹nþñÜq| ç¤.ýI@CJÅ7B¤¾(JA}©)¢g‘¬p¤H³<ñ¤“‰¦ÆE¯E z® £”³ëݨœÕKÇ›”©›ŸÐÉÙF ÓJ'öçb$#`¶& B¦Ž‘ì<#Ìò¤•NGŒ ©óg—Šœ'pvRè÷<Òai7Ç“X:¡ß“# © å<Œ*”³»hEѨdyZ®É¥"Ùžƒ‰'<®™À-aù0Ç‚±ç^†å³‘º3ÐÆE ²0³DÏ"ÑwˆHÉ×n‡¾V:vÇ—) Ú$—3lcãJ'…ä7³+åD´ÒHæÈj–Ge“Éy4L&çΔrö”Ò ÎÏhzsÐÈ9`‹-ç8¥XÎyžXÒÉÅec!™.èašèE:n¨ ’NÔ­Ö ¹¡‚V:ýPA…u«¹JÈ“¦ÉõH£nõ$RzÚáM²äMç#ê½dbˆŒ•æM&* Í ç œ,š(ù4¤†Œ–NàQÉÏ7X'EKð™ ?]\>´Gö½—P¡ÃfêàYŠT'°)ê¬WêʆüÝ™ Z6Gu–ór;ê?ãɶæ/à'Òhö@šZunï'èh®O2Iþn^Zá*›Bul» WÈ¡ßÙO$Ðl„8µêÜÅOÑ’Ag!_ WÏÁ²}¡á£ „Ö^A<‘v2oöSÓN”‚×óò¦R®W:n\J¼$WÁÍnìŠ%ÜKn„òM”ÒõIÄÜØ¥-7ø4OÅM·Œ$çæ0’ïNl ùj,›#_¹eOÈ79àÂ4õuwà¹Gc[ʧ}ç6æòRJ릧Ë!•3$*nð1Ìú¨¸ñòUrC”/©£z*nÜw0 7qu‹¹é—½UܸïÐÄi¸q)Áºƒ´;¶¼;åÓYgì÷¤ú+ŸX{íJŸv¢ãezs;ó;¬îîñt~˜ºWa)ÂÈ,I%N”‡£nZ‰“åƒ"–8Y^¢¢$ÆÊ'æ0l.2–7¬*!‡AU‰µf¨~B­ *\¥5;w«µ&Ñ•ˆÒF転5:­ÉuøNðï¹Þ˜Ý£hjc.í8oDÍL9´Rúšâçu‡åÜØÇ° ªâ¦×7ùR)ÔÉ·ûŽëY nfäË¢P,߱橸±)í„c”vÇ—·@¾ Cï)·Î|5–M›íð팋ûîÝåñÕõ¢´ L½Û¼~ü#ã½ÆX3CrF¹#ž¹™°ÆÍ €EDu«Ã:¢ ]IrË#ÊôšË=k×Y¦ªà,å^ ;#"¢¤, ^a*ë-XÚwZP kC”éYRšõmXR¥dégi'€…2:O5Ãv½Ò{*KX×hݧ äÎuÉw›ÇïßÚ 2oG%l.v—Í%YÔdÞ>'ö®’o8˜sZ˜7ÈiXŠkC„éêIKî'ÔÒ؆ža]Ë0ãÄ’u-Àtë—­k.æz5m%Úºf`º]µZz¦ëšŒiCñ"Ôº>dòî(˜¨x4¯¦­ëyL¯xJz0’¼–ž Ï©¡g\×S®×¯ð÷]Â=Ô°›Âü>\Ó­`.oOÖ©7LWKZz`²óAKOà4ôà†§-=±{Ò“ªkæ¨)X²®¹˜p!«• Ô5w^MYÉuMÆD#PÓ3[×$L¼D‹àEu}ÈäÝÍbúq’”ï|ÞiÌpúAA£®'0ÙE9=éºN švn¡c£+8ÅЗc¬ìË×öÀA\ÒdÞ '´KçѦ]…SÓcOriéAo¥§B†½VÓ㽕Ž+_5=·ÒГÖ=6&l™^€žœî11¡ºõôLèÓÖÑ3­{dLÌ´aéÞ!“wGÁô† ¤ÇwÇ•òé AE´Û Ђ‚žî%M{hä®8´‚€<.%4pö¹šaÌ퇰R.÷å¬WoÚ¾â`ó²MäH§78z׳áäH> ¶gPA’é'¥Cç¹ÒK'ôÄEÄEÄ×ãb·EÄKŠØú[¸ÐîðSïÜa-:g8Þcqá2/èí‡t@¿ÆŽþˆŽ0½Ýo7ÎÁiý=Œ©ô¾ÙT‚ps,’L=PN±™Bck’K'WÙL^G†PD|w×c^·EÄKŠØ;çóîÓª;¿ë’›®³ñÉo/8üË0=npÖówH”Ï“ÈáîuÂ< ¸„Wö¸äõJÂÃ(‡ ²Êãt-§ìQŽXý¨epÖ«jÛŤÔÖv„#¯m-NÃígÑÔ6à˜WÖvÜ+×öÛ6ê"±j©Žs›ê¼´´¶{]mkp9Œ=hk›Ž3MíKÓÞùõ…ðSïcßmv¯ãÝ/¼UÇô´áôÙõ€°¨3÷ÀDù$@÷ahég’S@Åv$•¢“ ×ͳ> 0&¤¼+ÂFzWKÙF'ÔJy0O"•2ÁÓKÙžæ¶%£"­òb¦8pñ”=îo¡LÚÃýá fÎ5D\¼À?ïj¼¦ª®»á®;ªEöI-ýI¤?‰ä)R7ÈêAw8G(µO„{8Ò„²ÀáD®<HxéOž)pŒÊ®¬l§ã×̘L; ®,{ºPä#ûëªÝzt‰EH~zWYí¸ŸNXY&•d@fôRSYñ¡I)’ï…JÌ(ïziª=>Ž7@:ŽÉܦÁqߎÊ{ºFj?Ï‚** }–Î{F²QU» ©úán¨Ún7Ð)x‹¿›+Þeƒ@»NCw ú¤––þ<Ò’@‚Xæl¤Á¦ƒ+Vwž ޤôHö˜a’P¸ šÀ“çɶ LyŽÁí}b‚ÊŠ‘Üi"¤žLCŒ@žCp‹¢FÂŽ,[ž#pwFPfF=RâKWí¦¢Äf a ’Ÿ›ÐW–ovµH ¡…àv¯ñžˆ„ú—E:ŽÉÜ&ÁAqtÞóêRz?| †ñšÊ‚ŠÒyODrJ¬ðžn¨Y¢Ñ„Šš“çËù5A„ñ?U»¹î+óas6ãýóæ|…10E`>Öõ¥Þ4ýéšöáÜ%…³l×êÐ¥x‡lLŠ p\âZkª˜ï›£˜@/ êˆüOÑ»^édâ’šÎM‘p‘p‘p‘ð}%|LP\ Å: ]„~‡í5˜ŽÇ;kÝ78Uñ>ÖÐ9 N\wÔ'¬Nþ­=áu®à o@Žddsƒ³¡±‡”"“‡³ðI2yDb<1†,ÓH…'Ë4‘v^L]M’Z!A51eɪ&R E…³«)„¬­ð%«IäNÅk+|ªšèH0-Á7žEª)…„pÏ!™áÿ€ÈC©ðç\áóîðE÷ãZõ7ý¼Ã§F`î¡ÞAIý!À} w<š·ýaÀª^÷2²QáÀaˆ+¤Í¨Í •6Ü^å™J%K›é#ÖÇm8E,C i³ñR$º£Â {= Æi\±†b D”j@Û±X×o Ý¢ysÜ\«-n3¿m [éL¾³ßu‡+îW†xãí}Ð’ôº;ºYÕ3(¸/jÅŠk ÕE­p%´IP´á†Å)ži´Áv& Љ¡FJA˜¨Qäôw£c›‡íònÐF°§w¯ÁºpÂ'<² ¶·Ãy§ X/<Œò r9ÍKåó Meï2›§Ø\¡FƬb3…Úþ0#_ºÐèFZ±ˆË*"."¾™ˆ«È //â~~?$8UFv 8Q^ ÃÍ4./h4ÎâU˜+и8¨k‘@£â,-ü¼Ã,ý)`¹Â„ý…Âà¶T­Â@7e¨Qºlæi4²é3 =-_6:ƒ`Ë&SGÒ(LJ6|þ¼W…‘j~ÚðËkütêAú×}¹öL''SÏh3<š7]àTqŠ˜VàTqTàDqè†dq‚a 4.λa®@£, WSæËR˜¡+- £S˜—{Œ¼TCè%ã^aÖ q³æÁi³0ׇþ0Èî_pÖòݛͻ‡þàG½{0øUåÞÃÛz‹Á£A¨¥D–¦Ëgƒ¥ÔÙ²æK•]=WØ/Òsµ^Q$8[.Ci¹‚áE‚s%Y­Ñse'» Wt®*,«yf\Ý­®ªÚúÊnvâ Ø/è)ÁuÖv6V/‚ˆÂÝïÉßÁ7èÅÂFûóƒ¹-øm¾jë8a&ÙÑ&ÃþdBÜÙH+xÏTùB \2—㘇ÇJæ$8‡gê›U#™dFe5'ûêTÓÕ·Rc/¬oæÔiŒ;r£Õ˜iӬ̷°ßdžùÀÙö§Ý¼nŒ¿mÚ0ôÐÙ O¡Ï…}¯sx-V6qMÉF[ÛÝæDUmw5¥«m+cum¬ŠˆN¡Ú·8]ÚâŒú‡pa{4ÚèÛqîÝ”%ɽ[¯¤9£wþ "=¦šœtß KÕ.ºíXawjêV¡¶Ž¯(^%åq*]t…1¸$NÉCìïáȧ¤ ÚËE&ù¦ Bðbº$³ˆñe2bÄìe<Ä^Æ:ý±7íhj¿nâ!bwBWÛ#k#f­aäj›ü…®ëßä’E‰Ž£Dþn%–›£Vb¹^l6 Ëç’Í`yRTXƒ*b%«ˆ•¯"Ö\‘°ÜX¯­É*RaI¬¨·Ò}å"»}Tc“¡ lP“¡£D†Â0ì±ËÀ)EÎ`ùXÎ*,pÌ¥ËÇÂWb˜>kb]„µ^Ñ´b&TYÃÕ­ÂT·+YÝ$¬Þ6OÃ>a»^´õT² |èq2á$ž 'äãaôïlB"Ô)á4^ ^R0|¼iÁñLçA^ÃEcn 1U}éìyçòÙ…Î0n`Åêƒ Œþ[6Ô6)á4^èPƒ‡kÒƒ„<Ó:e2ðlq&á<ž«*bdñpMš_ÃC<ؽ¢ÑçC×*5:j h`XU ¼õJ§1î†ÚÌ& 9ò«u¡À\'Ë´ú“É|"—Èg؃bA$J&Ă۷FÉøXàGÓÉXX¾#«Ä e¬À‚èDM’±‚q‹ ;²$ ›Är·oi±`vš«ù ¬QäÅ(YhšÐúŽÙɪ.”×Ê&³Ï™Dv‡F÷FˆåÃ.)±Ü ¬ËËE…å'*g’Í`yRTXƒ*b%«ˆ•¯"Ö\‘°üÊŠPó%Všæc.üI… ÉíŠÓus¯³))ˆ¶/|$–Gìæåb*¹ˆHÎ$ß4ÄLÜ&6"ÄAå×Í(´PÕ¶ýæîùÕéO7ß®Ó{Ÿ‰®¶'¬‰H° ¢µª${#o7çãæ kÂ;Œ{羜¶ÑsæS»8­Ãhq¡\aX⤦==\Ïí¥…“aý×ã>~G‚áç½ý¯ *ÜCŒŠ ÷t&õ.lHš‡3®h¶¦÷÷`ZØö?Ã6ê8|šJ9™ÎÀSN¦ÃC–ܲGéàj*7ðÌ€h¹gvË´†›„tS)£)´ú„'@]Zÿu½röÁNÝ„)üƒ| „“T`øvûŸŠ[ÙjJŽ8â–(–Ú¨Š®ÄkDí@à9‹f:kÆg=2²âÏÆ¦Æ)ZúI ó8Y°Ä§á'/d?y®÷0fo>ü\{4оñY‰¬30W"uö§¶'ÄS$NH#&.gŽ›Œ€ÇK| ­¦ÎÁP ô8uN#ˆ¥ÐØšw†+n<Ü­Wžk *ÏF¨<Í™*%ƒÃ0…FÈ ³ÒÔ3Ž'[W<úpк3WYDi`dÒ6M§Š›9ót§‡‘»Q‚ˆ©2áp-Áè¸É“Ããf„#ãFäÙ§¬&çÙ]÷rg®ªm33“ï.!µÏ;p:>¯`<}a¥¿HÇÓ¤bB®dü\˜ãé ?)gªkžÄ1Ž@ä¶/É—ÅàgR4Ò±ƒX…xc‡l1¹Š’N™)M‚Ì[mîlâ‘«› ])&‘­+‰.“Ö$fûnÅÄåüú&Îmމ¿Ü°»OâP=ÅÃô$Î u'sŸiÍÄ»$¿‡‹0 ô× lQÄ™DJ ²iQ)s (œöàr#›öÈ–’ÃN{¹™%‡+³Žx°Çóxg¶¡ ÜŸhÞC&nî¼G¦”¼Aç=TÊSæ=Hl=ñy¦Ìе+¸q?”mB2šÑö³8»#F'ëÂŒº_¼¢ùû-t|ŒêÌí¼Éw¡zÿCÞ33é0ÃÜÐ÷ûHO¼³J'&ºl¥Ê§šKcib‘x¹Ã¢äœàs¦E⟄ Æ©ØŠÃg-– M8ì¬pÆ@RU‚ T±õF¥š¡`…>xj#X?ýˆôˆ{,‚°Ðþcë>7nöñ•¿ŽG®¤fƭ䑆)±}ήf~6Ì!ÄC¦{{ƒ=GnÈÞkÀ MÈ)i“øê-‚½¦–4æ‚“ nz7·×áv(ê®Àì@o†+3YïV4qAð#ß [ŒÌÊC¨)Áf[¹òpvŸO8ž¼óâ Žá„ÊÊ3ëLiÖÇ;M\g U}Í›á™RÆ8¢-;ë•kâ^6GÛá©ÑèÕÞ’ÓߖѸÏqÿÇŸw©ã‚zjL@a*øaÌØ«æ-qLÍl§ÊòLæx~I¤žá'+cöäU·YÁÏ|“øIáø±Ü0vO“ß]jd=e S5>¯ºY±h˜»vÉu5 ½ ÙúÕhŽÆnHÕ k®Ç]z5ïo†ž¶s§l*‹0Þl¶—` ÙóÖq RiºƒFévqçtÆÝ³[uÓ2œý „ÌçM2uËß í©¸¡W²JÀÍ…9ÚËq3Ëó‘€›Àæk 4ÊUÙ$¹ÉŒ> ÃW%{ûÖ[˜¨.,‚Œd/t*yXÞŒ[/(Úó׌q‹^cÙ®ú¹1.ÿ5ݪ[ÿ»VUk;ÕvŸèÖÑz]óÝ G8"Ù0{ȹnÝ º³¤á°Gõ² ®¤bBéÈøÙШ™ãg¾®b³8 ~¨2žág’+Áv3 ?×pßx×’+ECóÓOá,ÄEe‘óCáŠîÊô³GÁ,AXÕ̺"‘àH†Ñ¾WS­ÇæðøüØWƒÖÚsÓFW{Üž¼s»t ®Lªü9¶·?UtnÛh2¡+”“—î°oBÃÒSÔt£“>÷>ÿV°s<®1>+!ßÁ[ð…|8Þc©ˆKT:»·–?‚y BÎË&ËËËÃÆ]«]÷ Nø˜jpÚª†Þ®{ÉûÍÙ4[çéG™ÊÿÀŒ•k°Ø“È<;¿¤*áÒÉÛ_Þ]ð·¦ÚKÂLJuèj;þQã±JË;ß0þÉs%éˆYÊT†Îëçb“õ¬Ä|Á³#Œ³F#V3 “ AGÝÕ›„UN°k]£… Õ`Üe†ù®•Â&«Æ ÿ9Vá8 Æ^Mð[_º¶‹lêöG°?غÀåÕÌ OÙáŒÇ NävL‰[‚•÷i‰e4™+1˜“–ºˆðÙ ö7¨»é<ÛÛ›F¢Î ž¾L)ßÁa¤< Šèšô º¦Ø‹EA¿õiÉXprªo¹pÈåæajÐŽµºvkç^UÕÎ5Kà w Wt‰Œq‰rW,s˜‚8šê&Wº`íü>S‚`-¢)ŒlמLØüé Nг¸âSˆÇƒX%EG˜˜ÂR‹Sà?£#Ìäe/ÿ=^ÑìÀè[gç'|ÛX[?Ø~j㣴¾W„8 %£ù•ÙA˜ïùE9 ™B)€õ0s2æöS5ªÃ&ô5ÓI‰¥Ý({Øhšßû,5ÑJQ‘èºç·>#w¯3*å†ç=%­ëàr¾ÕÉè]Ž{JÎ-¿¬šÓôQˆÛp‡®’¶\6«ùõ9ŸÕ¨ô‡xntRJ|¦ƒuŠ'_ʲ«£þ[f„›\)mÄHwøm„ujMsÒ ˜ÕJ&ùŸd¢>UÊœæ´GÒ Ï0Ë.Þ‘pó¡ù°ñ¿aØ£›w˜îöˆÕüÛŸ¸“Iðë¤þÿx`^U’µ¬Iÿ|;»t¤\q¬,9]ët¯]o‚ÎI{Öæm"¶•µ{"9=3Ïjíým)>ïHÑõŒzýìѯ?”lu¤5ÆÚ­Ì¢®z‰;LÈÖɃïn­“g¦'~$'ÂSÖ:cW¶)½Og’âsˆŽ$7ÿÆlJeq,FþÉloµM)ssƒÄ—r:íýî‘Ö0Ô%¶Á=b„±Sv]¿î¼ªi¯÷̦ â¤`•v{¸Ç– A3“ZÜ`¿=µ¯,ÚÜ:„ÉIÊOR²#§ß/²^7B#0u· WŒpÍêþ¾Ò ´t†@Úä¯4µÇÓ«íÓ<}ó2ÂÈ‹*Ómà¢ÛŽÔqG(ÛŽ$ÇBd :wDf¶ó6Á­äÚL<`”Å¡»<¤Ùô½=’ñ¼³ ì¹ +÷Ðn·T.kÔŸh”;öPLåV™¿`®J¿‹Á˽ú]ù©¤º»<Â÷¯ÜU}a(´ÖN'ñ׃Ù7b§[¿[ÝÙÀäfªHs#8Æž*“l">Tü#`_û.âa'ëF«Òñ¬EwÁ< dÍýeƒ=¦]îX0Ý kgtF9P}± LÇKð|´Ipì”Û@ô÷hºÍ¶¬|wºãñ>·•¢ÜkúMÅû™˜á¼×>Р«uË} üéWa,÷a¦.lé³÷¯²ü±âˆ&Ë!KnÖ‡,$PC•@ºp÷8;H—s#; y¦‰˜*³lØVžÈ„®dó$ÎáÝ%ZþôV¤\[e/a&»4á&mIPÊ]úW’ŠäÈ¡0†QÊùKŸ}ËL¹,=O¥ÛIœ¦ºËÉÞ—ë•¢@vT/¨ß8rà_·+ÞôFÄ÷0üay<•Asìó¥ pÄ+F܃÷÷:C¡[1"ž¡˜›ÊH¨à“ LÜ’<ð[Ì~@ïžn"|xoW~’e½"íÝŸsê´Açl)Ÿóz\áv,ævqùÚÃ!s‡ÃÖÛLݯ˜ü‡é%PþÈ.‚bÈxÊd–ÞÇÌé 'J!nd–œŠã7é÷ ¥"¸sIÛ›ÑߺÓ=«|^ú#ahÕ™pw¹ï&¥!·Ø(D[)K—"Øÿ”jaõB¼~\ëy—ø¯Ôë=8š1ùM×Ûù~ŽÅ)¸!»dq´Ta+Á»üÙc/g˜þÛÝ.˜dößøK3/íþ.‹Íö+å÷:ðÇ÷Í÷: ^Â=Ÿ0Eh›w˜ýEÛ¤È5aêŸî1wçjo@‡Ùl kWì aļ$™ ¦¡1/ÔCռà V¹y„8ˆëÒ¥û·<ªîwqð}¢¹ù;ù$ýA<ÍõlŒœ—S‰†ƒæ9hž"t¹.ÝS’¥6— æºt‹†]*í&œ®˜¯¼ÝÜÌÕðGØn>Ý3!’vóéÆÑ–´›âMãÏ"Ž Ý”Œê­m†ÃڬŗrZ9k¡™ƒ‰£lqsg”×+~ŸF2éF î+XwçHÖÚŸìå9‚èëÂ}ç¼èëÙB2Lm¸Mº<úz¤šSÇS˜]%yŒ¸i‡ÿ”ÈDÏfŽõýQÊsØ)U캛Þ}È_3¯N32µ«ÜïcÖuü©3Ù¢õ<É~¬»Dl¬ç v ?åõ¼öZܨ¥á¯µ‹wK’¥Ìà&À)ëye=Þn†¥pOsdZ€Å/j¯µÓT~íÙ¢SLÏ£­ñ­æ÷þ2Ç£²ÙßñîF;G˜íf_Ê“¼Ú ô´ãzKon`ÕU~`¸hDŒ»ÜB‘™AMìÑÌZÀxŠ;­“Ùé:˜ÉcÏKú&ýÖ;\™MºÛ× {_•ž¾ñÖfÖÄν&Lïx„Ð êgLÛû̘rštGbk+Gu$÷"ó›ô§|>S<¦©2¦Ò—\1eL>*” ŽóH&vÇyÔCaªÞ”q°ÝB6&Òk3³¥‘Üx¤ Ï©2üÐڳĞŒe!®$‹Œ¶F§#š@¾ÝÄŽèÜ0w^'·œ¹xK# Uù‘´Ûf©ƒ£ê¡0‘7Ó™í|©!‘NÙmϽî-'nÂÕnÁD#ÊÝ~Î_GÃ4%ÒuTɹHþpKr.2ájo±ŒªXy|r«¨Ò­­ Ï5µµuŠ©û:• …9]:ùÞ¡¸•xJ¡Š$×=gü÷”î0ZtKdÇŽ¤{2×%˜DOpÛ'ù[[ß§Ü=ÑÌZÐéM‚% ú ¤Ù7ÉÝ™eU˜o’Uañ½›on¾KDÁª°dAD°*¬žB¦édÿQYŽ~d“Š÷Ú,&>²¯«Â’­bê¡0e§e(¼ÀŒ"Qêd†`(¼Ä%êìÆ“çCaa°ç¡«½ÑT½t(Ìš©Ï7“È¢ìD½4:¼‘G†5Û¥K0õt»'’«ä­Ä“¼%Íàj I“'=¼òâH£#)Tby2y¹kSìÝ­ÒÅ4î¨ótHϤ9HÎ;+o?zJžÝÚT!“B²n­àðv祟ǒªóò÷uÿ|×K.; 8Ì<«PénüLëðt/»Ï´ 6Îï¼ÁÒ×·™™urW»¢ÜÞgEù>1‡½wÒò…dž_¦Ü§ï¼øäú}®¬œóh 0YâæšÙ¹ªwVÍåôÞùyœþyçrIÚ4WÏì’4ß#eå|º×Ézïü<Œ³ÍdåŽfRX4 «¢¬G* 4(è‘òíJÐ#• í=RñLsâM|íæÆáL… ©š©Íæ<Ý£^ûÖ¬îsDzÀ—Jü)öЄLœSчIíº97_¡)€6…oÁž‡q–è0 ¢\tm¯ý‰…¥'Ìy1Æy¼Ï„ée‹”#ïL‰*DÀŒ@¤½ör^uªçu^Õ5à·¿ö‹Ó‡“/YÅïv—±Ügñ?Ó‹›ž²%—ÐMŠë摟Ҝ¸lâíé‚”ôHŸîâ‰»Ä ÊÅ]Ò°žØöãô¬Ê"€ØUνyBr £d+¿×¾aÖ8¥=^*º½hwÇðéT‹Ç™SQÝq$Øp.9dÅïµßîß}ÿWºHNîèzíOéàÎív¼•«ï1z¸ÏUŽeÇ[ÙñVv¼ñd\v¼=>ÝÑ}Ùñöt7ÕHv¼I÷âÝOqt¯>§B9³/Øñ&ºdðùíx›‰‹EÝýчˆ&í’æ·lÜaýµ.Of¶ ·_ÁàôÚ5‚=Q¯ÊÔÓ æRÖYD=ÓõEæå±Ùr2Lq@]«¬/–õŲãmÖ°4ÆéaÊŽ·ôû²ã-[JÙñVv¼ÝdÇ›äR!Í9¢«õHÙv%é‘J†ö‚©üœÊ³Úñæõ;ÚkΩ¬W’vA² B1ýyL7›£Þ†ð4jüÈ‚HŽY‰Î©pOY F !5šÁß3 ýäZèfœèõo?? )®Ül…RÔkg†m¿çý‹š^ûÓ3Îr[GÆü^;Y‘%·Äñ{í¦_ÁJŸÝßbR\1üäæÄ%M¸dÅê>7e‚:—ÛË"~v·—ÉX¬yļ?ËÃH&ù=Ò§{ÿ@¹äf&Eâ’ÉK`)6'%ß<åçTúÝùè”/cí­é4E–Ô¹ìœ w†@ríŽdŠ@wN…xèf®K44OöÌ ¥×îdX*ütOc–+)ç±k¥Ò^ûSõÊõÅ'v³\ѱ¨×.³Î{Ýš"öÎOr r—{SÞù‹™çxgÍü@àÏnjž|ï á-ÜLÃâfŒ#é‘J&Å'½ór·åÜeNœæõ‡\$HV>ÉÇ;?ýá"Û;Kb4d¼ó”+•„hñÂ’ñÜ«6VU?(æ)ú!Zfž‚×ggï®ùÑj»}N÷‰ ®ÄR^ãâa伤˜ÒL °b´æ]üÒÑ"JŒrvwЖEJ We‘òqÔÓ™ïJÊ)/V=Ùxé3´Ý`­t3²Éñò”»Ç‘ïLyŠO0û£ñëdz:WPîïæò’¿¿›g“{aÊ]% ¢¢»Jn¾–'9Òd‡/,ãX¯´Cú<9ádߦbL?á2éã–;á¢ÒS˜7ÁÂõ¾ÂªœbŠÀoiÕNˆ§Z›í%öß4øâ}‚"$<áüÖD²”»b7ÐòMv]ÓŽ-°~d¥²PÒ³ºáo1“¨áŠ•/SJ¶ûÆ\“Eˆ<ôí‚‘Š–÷¸aÙ“®ë•UŠ›Ðʱb!/1/I¦î¹‹%ã|Ê 8_È3Ó$L*'ƒéÑ„ÃבG»ÑøU:Æ¿æ=Ú¢ãWõ\ e™àÑ ÙIéP ~žnX@ÁPÉu‚ úÛ8û$;ïv;êÙm.ì‚L—4WÎ4%ä.Fd–‚•mïøo½´-™Õ¤IswTrúb¤#iÖÚöîU‡ö öþf GÒÿ[ `;áˆÁ]Â%zÇÏØúùÔ¶_çµ8úaùYÌV¶ËÂ6C£».Æ=fíè­‡Qíï¡úÉf%þðœ¹w çÑf˜’ìUJmÉ$:e(ÉŽDÉ´`G¢òš±p¸¼$™º×¬@¾ã¾t+ÝHšfâ³Îç [p¥9eHÁ#¿×&™`vÜÅA¬âñíÒ!u½ÙîÍ!/ÁErïY¦”‰áèÞ3åñÛ…mç.¢dÌdÆ8E^ùÙ[#ÕUÌô]ŽO¦e“-&ì Ö›úaÊõLh±`@y©ÅÈiæ:r]²¾ w0žŽ‚—Sl^…€…=w¯_ }q‰©'úÂkMÙjB §+æn5a)µu6Éã?e•õù­²ò´Ú«ÍmγDÕ©°v<5ñGæùÄë’·^dx¾v+ßæü°J…yÊFôþ§t³ž~7‹E^éf•nV7RcÓä›ä%aVžì.yA˜É6eÝŒqŸŠS8e”t 7Xá×LßЗø's$KüKÜÉ>ëHiÓ7Ê5Ö—u+¸¬TÙIrY©rìq»ÀN¢»Á¸Û;3®`éÀNN‚)]ÎxÈ®•ÆC“¹â[×ÜJ¹Ÿ›=Å+¸ŸÛùˆyõ ®u=5HY.z gÎ4éÃåVHÁ¢ºd(Ä4N¯ÅXŸòVø.wÛTÚ|6 0Õ:Ua€{ëd ¡óÖYÔ¦ ¹× +Ã:ÔXgé_“D,àEؿƎGq¸}eƒ#1NIxq ûý·Ä}e¬£éí_³G­,š†Oô|=£¾%ƒÒÁ&X¯¾ƒ}¼Oûe½?P§ZËÆôûnL·UsóÝÎwŠá¥nóžÌö¦—¦çG·š (Ô¦™PÚÌͨ‰"ð–s²63=.#—à@hþs-M9…0.ä^§lÕh§D™ÍU9~·ãáÚæª¢Ø”¦¹*g'µXÃË£¨Wœ·™/rE|Îf2Í%Ö*fM“ÚÒ”=86s£=8‚–æ /‹–Á0R^¦˜â÷$»1«*t’¹ùŽ^Áܵü„$c–íÉ^42<Ò¡lF»Çf´›ùÂ"³Ðš+å²Ò‘oš’¦—Ù\‰ßÇzv3Ó Œ¸¦)hz%¦©˜ýžÕ┦´X¬ÎÏlÅ×ÚÌí#9ÞÙQÃïµ|Ó|²7efæñâ(•ó‹¶Ã[üâuÝb-ñJ—9ÃK˜8¿÷%¸v=UÈtt!zsUŽ,x‰a伤˜Ò4WÜ¡Œž-½"¤k®žÒVȲX[kËbmN6Y«)‹µ\^>Çb-g\õ%h¬Ö«ªÒž^™Ó?úº«ræO0½ ™ùN/T•êô{Y¢V úæ+‰ÏꎑyNé@£û2S}ƒ}™ ¦_n>©Ñy½ai´8&Z¬Ñ_v¯-£Ñ3zƒm!GqtsSdk˜)dŒ#š›bç Û‚³õ˜“Rp ?Ñ )mNmÖÇZ;þúŽ©¡ÌHÒjJãKɽÑéBÆê'ò¥ë•`i`¬g·™n“n$;®é†~ѽMKªqL/˜ —œ<^bzöä1Õ£iöü™pɘ^0Ý&ØdeO Ì7¼ƒL¤hÞ0ýM®žq¢’®€bm‡Þ˜ÔèEýzû4¥+@Ðh}Wæö•¾“RMÏnÓ «7(Þô"XY²ûÑ2íqÄ+oOnÓ‹dÜQNàÏ6¸¾¹í‡Ï¢WÐH n˜“ŒW—ØL1»Ð@SN}#ÕÞg¼*Ø,%Y± õì–ãU¾ŒWSzv—®˜~aWónpÑþã]"Õß<áΣñ-%T:A9#VŽøæ–=båéÍïí •“ª7%¬¸Ø ~ÅÇžfÝ`‰m:(¤×³@qZ‹™š6ú‘„ŠX“PÔî&Pœ›P6í°Áé<È Co$᪥[¦Xáªóʹtô/|JáªËå²G¹ìx^{Êå²G¹ìQæéMÙ£üXö(—½ôÚéë¦ì({”Ëå²G™£4eÜò,ÆerÙ£Ìå¥ìQ.{”Ëå2î(㎲G™¢Å\MKª@Ù£\ö(3xQíQf‰AÄ˾Êñêóº[n Ñ7¯>¯ ¬4˾ôñª`½ãÉÞ-WÖ;ÊzÇÓ]ïŒWãÉxU}‹e ;lpñæ‰ÛD‚\¯ \41{™–`Ø¡i:YÃŽC6\þW3Z=ð¯fà‡ÈéÀL3ÅPdWŒh’£×²êH¶¶óu@°µ=¥„Ú"éÀrË»leé@¼f û‘øuA¬VÙä]óq8‘†vÍö2j ¾èí³§æ>Ûgït¯5²ó|ƹڙª©'¼V6];™šÒô×o9ö Õΰ¦žð†dgÚ¦*ðWÜ)¾ùD~‰½ÚYóZh æN÷)ÐÌë ¹Y˜ãüé('+nT€ïüd'—'P©¶£FãüæΓ½„|®— r°Äu‹³ñGhæõ9 ›W_SªEÛ[Vg:?_Sú™Ú[ˆ8¿9-þÈ–…$'b5ÎoÒáð&'×+½ó›$ǧ'UàB‡çït×,ͼ¾˜y)–y‰—©âº¹Ù 2ßù=>íe*™óÉfêçžÛ*UÎ/ïp¸+3þVô›Ž(³J ÍOš×Ó›UzÂÛõÎO°]/c9Ko×S8¿¼æ&Œ–Û®§w~‡Ã_–Ì*I–ØË¬Oó“æõ¤f•žt\3™ó˱vhæÀšéѳ剚’-þ.àü–‰Ó[œ_q~Åù=çWœ1§¶‹ó+ÎoP;s&%Qâü¢Ÿgáü¦’¬W’Z¹®ÙÌÄiÁXo$û‘¦M=á3(aÝ<ƒ˜ c ¼ÍŒtÅŠuö=o9_è[Éf ÉŒúTÍlM×D¼½ùr­•gc}>›xÅùçWœŸÖùá‘Âe\_UÝçØˆp UUÙó}tóºÕ.=$îæKˆÉ͉’‹`ä¹õ0'¹§°.ŠA1ÊiƒžVÀØ ±ÈÄ0¯Ù^Bû¼e¤¬—Íöxõ}WÎ=¦nØ Ol9¢1%Ùß)àH²¿Ó•3h\l q~‰Iý6 G¢ãr…£N™Šè9ê{=)k›ûé`X\…®j^8){—6ûƒäH|B`ßhLSSŸ^VÇfÓ<¾:mv&Uez˜¦9Ünv÷¹žŸÌoÛ^v›«ùw½²•ÿB=-Æ×AMÓ^°&°ºvõæ|iÍ«fþ¯±mbÊ©¿†%þ50…)-/ëfg\êwµ±è‹ùkÞlãïf;‚öÝ ,•øÜž¡pU¸úJ¹ò¾¾1Íîšacüß¿=×àÒÍÌá¿®WšÜÝ×õJOÊ[ˆM©'ÅÖ”–”æø–1V”^Ħž¨í·†©"⻉Øõš[k¾Æz¯¦Wã/&ŸøŠ"¦'Ï}…ñ‚Ç·ÜÍîáÚ^ÎØ¤ŸÁ#\êMÓPžAw––ròHXž»{îXOi¨tÜØg†'7ðÌT¶^ºn(¥•n©íRÛ_tm׸FÎ8@‡¨Ýœ»>‘ùÜÔ”G¦¦HéfÙŽŸ(kð¦U•„Xb´„ØG~¸ DƒÞ¬ž- f¶péPÏVQ›¢6"µyY7誠 WcO®KI„s²¬á#”°ŠÚõ‡•„ØGv2JÉ–7L%[†½|Ñ0‹|‹|¿Dù¢£B=¯ÇWÐë’òž­WšÜþ™’˜ÈWqƒÏÑÐc{øzzÖ+­t½=-@]*)µ]jû‹¨mÛ%;˜žÚÁ &ø"ÿhúŒj óÑð¤ÆpòU³eÚƒ%DcXZ@4XM_«h‚q„߃÷ERO¹Ï⎑wµèé1ÞSÅMÜiÔÒc¬[)ݸ·§¡§Ôv©íg[ÛÞÓA£m7«DíxôÈwiæÒÍ<t÷¤hÝî ZØ3R %zi´"ß"ß"߬|½«ºŽ§SR“ÊĬ©µAÖðÑ`-Bˆ†'ôlV¡Ö"dh8¦f+Z‹£µ)j£VëªjLé7¹´Ó¡§FM›ØU” °À=ì7†©È=_Ö0Õ|Ù±j¾°ƒ_*¼TøWYá›Üœ]Ï6!ÁÙÖªÝÔæß}ø¶{·Ûd_a¶õjêmæìsŠq»ýaî}‹E§q›Ü;CËtÎeá˜bÒ§º½,FîJ™h›ò©mòøÈUã’|8D 8íZÆð-J8léY÷¶“x¿™‚®Žñ7DL¾³oö*bò¬ ôÍlPßQ¢Ú& kcd¸ç2“($ÔÍLZºÙ×^Ę`7OBšJìX9mú©Džšm—&'Ü)¤`šc®ÀQ¢@İfI•r.A‚œ¬ oÅ֔˄íœ(§vSÂ<ºFØ)g ‡ |¥ím|#•7å­O6%êyœ Õ\h¿cϑʊßÃ|èTŠ=‘Ô SÚMà|w“ÂÝEdtxG¡bÚQ즚~‰>^)È&€°WD!ö„‡p‹l(ß.õ>¤úM°£"W4N¾jÂi…ÄK!µ›â…wQÿ&ÎÍ'įz'Êv,¸pè?Fðëyù÷¹òÛ¸èP¾6A3?ùÚ¶ÞóÅG^kü‰8#›)ÛZ¯›yåÃAç ͤöEïsäµÏ%È‹'ÿÚµ¹³Åçµïd¨)íkzÏ×·¸0hï÷j'šÜA‚°A¼B¹ºWÑfñÑ0— ‹n6ß lO’é˜3ó¦KµgºV8TÅ|ØG¯p\S–-¾7{Þæ ±»<‰·L'"›%Ž­ã"îQ }scד “ ùB&èØGEÀœØ ÁÆGœ¤?¢5$”G¦S¿i:rÅ$LW½I±žÂc˜/.L•ÐÖnóYj¤Lg ãM“èžFŠë|ž¦dŸr¤:3–Zù×9“.„n!àqªM<@&ñ1ð8yBédBMMÐAt®vFaÂókÖãðœëØãø“™PÆX;{3Ôô®ñ7q¨{Ô7Ç6LÀq0:¦äìó…Cç|ΠûM„UÕ sÇ„]Á‘g C[Õ÷ã¦QJ0@iR/2(A=G(™äcðѪ‹K£†È‚ôcN30'‹2âuÔë§ ŒxJžãÖ.Ç·cf‡«Æa†f\«‰UÕ0Ç.4¤È/ñæ€ÚQ妒¯WEŒÆ—Y ´0ÃÑð4Ê q Pixÿ%“| >Ê’i•;yÍÀ R ™˜SGËn&y<¨ì¶_ý£!íòøêÝ·ý¥ÞÏ=Y¯(©æžÀaNI¾Áh¸…DOÖ+/ý“õJ'ûÄ8µ|KM•šzJ5å|Íf÷PŸ›ónsÆT„ïFÆÌÉï°ü£C؈¿›ž¹¿ãx=Wpìk®ŒE-ÀU©íçPÛÞÚá30h}’áØs1—†ðÀ0µŠÕš‚RP ÊQ:g±yüþŠÌ_øìÀ7Ÿk˜„”vj1.0¦Ç¸ö­Š£Æ]j ë9Õgœ%Ôc˜‡Ø÷Tb`OX ¨ÇÈF¡@ltJhe£Vdh¹‹1c(ÆPŒáFÆÐw Þøh«æ|ñ;ŒàÙôkSSªüF•ß¾î+\–¿ënéòÇ<©ÅÓ×”J<¡M)ØÃÃHzñà¶*½xÖ«%´ïŒ0EûŠöí+Ú÷y´¯oœ¡Á†ß‡kø±CèžÁøy2éµçw»iPaþ “¤ÉŽyÒ‰ÇÂèų^©ÅôCµâÁÝ zñí+ÚW´¯hßW }Ø4¿~üð¢áü¼¹º/îcûp­«M¿É'²W©±pc4±Èl"Sã\òS‰ðš@ƒD„•X‘„åXfê¶AvPˆ1¦¬nHäôF‹3R ¨2UT§¨NQ¢:Euž¸ê`§èÍÛÍ?ÀDÆæñÕ9ø{ª«Íù‚ ìtÐdR>R‡aCXé1Î[bŒ€-†cKq¶a¬´¶;©Ä¨+ y¢Å0 `¼¨Å¸ÚF (²­VdŒXŒ¡C1†b OÆLÇ Ù(Á´ÊyoŠÀГ¯©/#fÞFž7|éfÞ E0*¢ ˆž!;_¦fÈè¥\Ô¦¨MQ›¢6_´Ú¸æ†Ò5ލƒ»Í!ôÁå8N€{¦“PàþL%Æ#ìÏÔc˜6Ö§ÆžÐbTpöTqtQB”v—§£× †×%Æã÷±hä Ô‹F£„Å ŠAƒ*õt Êõ `( }¿AÐ}Fbª=#™J3Ÿ¢ ”‚RP JA)(_ŠíZ´›ób»ŒÔ'+E/~‚A°…Op\¡FêÄ«CbtR)ò-ò}Vòíg8aÒsx Ùø$ˆÜQÌjë¼ú—6†;)éDÂnÞ[|ô’â K…¥ÂRa©°TX*,–¾z–‚yíÚ;p_ìö›oð§ÞÀÑ»¾O5΀ûýxYRrñ˜dÁ&F)'A e/ä$H1¥ e¬ðæM:Ö€,ˆ‘ªpmouÐ 8bJWï@ŽZÀ©²L…ëŒÑ?pÇTppppppð+àáÁð#óøêêó˜þÚJ,‰œ'‘#Ü€KÍ“ÈÔpó$r ×H)Ã=Î n\€ÑpmE—scs@÷^ÅËÑuðUràhäìÆPZ9Gñxä”A8µÖŒ^k<9 X'N“è­ÓΓ¨åìÍA)g{ßn±ÎbÅ:‹uë,ÖY¬Ó " M"~M ÃŽòÔ­QÌ%JhCú˜¤×¹”“éFÁeˆ8Þä–=Ng¨!¦œP§ˆ$Ë\BV ë'H0 Ô9>Ѳ” ëÈÇ\Z5,õ²Q±tèGõ–l|+5KiÛ`ºfSÇ’Ý`¨fiûKŠ9ãp¨˜`Mïr¢àsb1A3¥g ½Ö^4t~Šš·¦ÚåÀiJÃð…4 ¦'¸ÛŒ£ᘡ5I¯°¹Ú&’PW¬Æh±ÆõW»×[‡QAm=†‘¯Ã$ÀË•W·›H‰ñ&WRXùQô0¹õÑÃtJhÙ*ÆPŒ¡C1†¯Å°cÌù…ñ™ZÓÁx¸…” f‹áfëÔ&AÈ–#dKƒáÙÒb@Œ,=F‹ƒ;5Æ6 è1ŽÎôJX¹(rQä¢ÈE‘Pdì<¦‚0µ¸eQ¦ 9(1Ðôp*Gq®Ý=:Œsw^I… úˆdrŒ>"™£vó[J ¬)=FëZ•ÇMgRÅŠ1c(Æð•v `"áqE)Ä$áÌ&*8§àœ‚Sp NÁ!㼬°ß¡1¿&uƒKO;xi¥áÇÞ® ¿Øó„¾ë­A°o%B‘K‘ËS“ šýø ~aóª=Á…)rù䂯ïΜ»>øºõfg>]$Vûûp=XÄ3¸6”–ròÙz¥ÉíŸYѨé±gµô ŠšO‹Ž@)Ò-Ò-Òžƒ ã÷ào wù8…Ñ›×æŸËã««ùkVv*8•m˜i½ef‚Óž‚l£„ÆùJ²%„#HÉ/th9Ë ‡K¢Ž–3\”Òs6Ú)å,ކ3ƒ£UâœJ8+æY̳˜g1ÏbžÅ<‹yó,æ)1ÏÑÒP[§Ã1v!Bùæñ»ËµÞ\Í[ôt–T€afI¥ŠÃ®ËÉ2‘r¥JE(—eèQ _Ù3oãÇ.ž§®ÞÑ"”N2%" ˜R ØÙƒVÀSEÀEÀEÀEÀEÀEÀEÀEÀŸCÀ/ OÍ®?ø– Ç|´¥ ^%"’ÎeI}Äp>¼,© 6йŒ“i¦$dÅGaÅdM1Å Ë3¥ð(¨”¬SEÀEÀEÀEÀEÀEÀEÀEÀEÀwðËj»ÝTÍî!EsW®›+DϪ¶™<‰™™'‘#ŠêKÌ“ø±Ý4ÜØ 6*n2A¥e”Ù¥G17]Ž$9|ÊìAp­œmô<½œ“‘tù”YýÓË9K²‘9È(ƒ5ô¬ÓÀ,a½þë,ÖY¬³Xg±ÎbÅ:Ÿ¸uÂ/Ž%àPZUï6a(æs2¯ùkWøXµé0½ç %C*¹a‰—!†C|FÉf‚F±·eÙK½Ô¥Š ‚E2QÇÉ3¡¹¡ë +Žˆ £&(¥8‚:AÅáÂ(Ê+‹ Lq\ÅqÇUWq\ÅqÝÍqEònÚÿ<ü˜ˆ‘^M¥Ï¥NàL¦/Ôj 5…šBM¡¦PS¨)Ôjž85]z÷Êîpì¶×?Ú¸‰v‘ Æ¹ò*sÌ }&uÌž–¾PS¨)Ôj 5…šBM¡¦PS¨yšÔŒzÕ0— Ýí7ße??~wnùèTÙû˜2y9úkèyRŸ!ê7O"ž'sP£âÆå0c!7ij¤”Áµ¥n0Çzµ„Ödê©hMÑš¢5EkŠÖ­)ZS´¦h͵¦Oìàò¼eWùû Žîº€º²wð¿Û+R4øÆ?:üŽ7­¨¹Â›lÔ\Ù«´\£\@.¥¶¿ÞÚŽgà ö³°ŠrÛÍ9¾&/0`.ܧ]íhi§RŽñŠPý ê Æ©µ|ÙQ-_=ŠŽ¯>,µŠ/”ð|œ5|!9z¾Ö+¥ÆØÓmKX‚Õaµ% „õ–P,¼Xx±ðbáÅ‹…K-<¹^Uã GNÿÆ¥.êªÊ §“Ù“Ï„„ÓɺùrÁédým*¼Ä5<¼@F'HÜP¡Àóñ•‚ö•á½`‚[.t‚Æc‘ h HRk`x%‰M¼˜f1ÍbšÅ4‹i>)ÓL{µ=ºþkð±‚çQú©„ÓÉlPBÂédƒøB<#J ’1I5xÀ“Z00_¬ ôÑŒ¯n¥`€§ñ¤Àë-A%h¨î"˜"˜"˜"˜"˜"øÒwÍŽ›j{xèã BÁar_°Âç]TÌÙ”“éìT5%åtºQ¬E¢ Ò)çÓA5)¹Eè#š.§Ž›RÛ¥¶Km—Ú.µ]j»Ôö—SÛ'óù%„Žî:xçj»#Ö6”¸v§aèè‰t3©0ê½Ô\*9Îça”*ƒP‚wéˆ%¤š‹IC[¯ôòÝØ›QµòM”¢Á¤½V¾ðÅÈX)ßÓ0ΨͳDmõä¨Ð 5KÔV.ì. Ö°ÔÖpa•¢9ã,ÖP¬¡XC±Ÿêå°wÌF×fcœåÅS}R,1M‰®ðɱæ‚É‘°âË!¥X\J•**UTª¨TQ©¢RE·¨¢Q鱋9e2õ_Æáªp‹Ý|²éDþ@ ­È\"ÜG-2ŸÈ†I~*‘—‹ uW.ÖRE¥ŠJ•**UTª¨T‘ªŠF$˜g‚ž.˜\Ý÷©p?ùtÃðCBDœÈä–=N‡ K nªAø!•|’Á¦øˆý|Дµ]ùÓ®jùà2¶^>} (•|¬ŒÕò…¦•!NÑb F5%Gìåk(ÖP¬¡XC±†§b Qï®ÝGá«C/mø%Œr7™pú œ;PBøˆp**O Q\Ä==W.þŸ–$Ø'°W¥ºgª;2¤]³Ù=  µÙø1ÇÁ[Øû0õžøÖEýæöoqóƒ8wÿ6IBÀ¨¤âÆÎJ©àÛ æ†/7¿¡åk½*µ]j»Ôv©í¯¨¶GÇN˜:¹ã( Çü»NkØ9£wãX?2TèàëéIE~ Ss¼ëB©èéB¿èèÉÚc¢1zô eê鉃) é)–P,¡XÂÓ´„—©¶®ÛÀ…U8æÞa(¥ì[ò;؉Ÿ3zçb^iéI‡¾`£z¦”ôäD1Q{¦4ô Eéé‰Cg éé,JGU5=ÅŠ%Kxª–0hë6'8%^Á)òÔIócâ%wžxM} äHó/ÇÑdDÁä°Ž!| \é—£–2Xƒ–¡0^„NÊvÞ\/eð7jµÝbK¨ þ_BÊÒ`)ã,ÆYŒsãÄø)Ð\÷ 湪šÌaঞ|‘<&?“'ñb½âçI¼ð§¦•`ñ¡i1Xn¤ˆ¦ˆ¦ˆ¦ˆæKÍpŒ…MF7‹Om6™7¼çpM±ÉŸþÔ!“$`I,îy☯)dITj»Ôv©íçZÛ#¯ßà]ç•Ýí{Î~¸ø9lI¿a=Ç- ù=“J$;JU#Ù^5F.Õ#¡ë‘°ªôHþÈ¡É^ÜXô¦èMÑ–ÞŒÝ?\EÚà°Å´öã®Í(1°so ÕäçJ–ä½1c: …«ÂUáªpU¸Z’«t#­û¿;ü[wÏw5¸º¶[ûw½òŸT×+-B¡å†´$V¶bei/;×k©7Í¥=m¿ƒ±®Q·ïÚÍÕ$îÀŒêà‘è\†ZP JAù’Ql#¾Žïº°î°”âDápèñû·v,õÖBå¿{rè9ßMïDÀï땿àY‡€ßÍ ¹pU¸zÚ\y¯PƒS¨G¨íNš v^ͯ·Îè‰è;îkV!ØïF‡P¸*\®ð{ß+°SðR è"@gÀ$jÍ啕ÀN¼ØRq¾¶Õä7»›“–6ûÍt*„9£oÆÿ-\À½Ä àÀ%/çùâT‡‹Ûà6ËÆå€M^7Wc´§fsƶ8]ÚŠú ÌJ–3ú¶^Isœ‚óÅá Î] ck3T~u=ÁT­ Mͪý*ý‚½ D ¦®…hq ¢†(‚)‚~I:Í s·©¯U ³Ö«CóW0P…é«Zö÷ë ]< |ÁéxÎþi!Š`ž¡`2 É.ÕÞÍî*œ‚…J˜ª©ßPÀ¢œÑ·õJš³àœ/çå WoRݵ²+» ¶à`šÆ„Û“üט¨"÷çD1ÈŒ b³R°ü}à êËÌXPÇÍQºSLm(žÚH°ù²XZ…³^‚#^V8§=Ì(ÞÓ`J‡âõÅ…„éEÒnN°8Üž¸ÿ-¢ŒÏ§Á…‚ Ä ËáçÌ»É7æÛ®G™7¤€&b ö K—2…>%ü^fñ ”áóÓTÕöÑ ®¼Orb2b¬ð¨ÒžF×rÔIJJÑÕµ5ûöfõTY'»¯»C:™íߤóŸ]§F—ßåÆM-Œü§Ìs¿ìÃÈ’ÈXf–[ë[,©­„ÙlE¤œ²VÄ\"€9Í'›ÃÂXáŽ29–›F o‹ØÇ{2úÑ?,1áï»`/)Åm‹Á¯`z©dè¥&òû­Šºü.·é{’óŸ2Ï­°²¤2R¸YKª@w55—­ˆ4rEL%‚—§ùd³X^óTX¼é#ï;[¬!*èßB»òÎ^ÞhRÚ͈ým”î§iÚ‰ -¼lNƒdfÌ=L(Á5]Ï!²×n€š¦8ÃX˜-ÀüÌ å8…2¦WINpØ!QTµOKÌYÑѡ֫™Z˜®xÒØkUµZƒ/ 9Ù Õ4H‘ðl!IÕaZ–?šYìÆæïä w³šVÎõOê cäµZiw2¿S‰*Œ„ãŠPmi‚Z*…%÷Tã€ó£7“h!ÔÂŒ´â%Õm‚:cNKàD*“`ÀŠV`QÁÇKŸc”>êƒN¤£à†ç7"maábUÍP<»^9MT!^Käçu•HÁ)$Y=w†0—n™G–;ä¢w±ÖÄÓÝõ¸MB!a—¾«¥\9´Rp*™cà0òF³Û4.Y|ðɈØôù¯æŸó¥Þ™OÍÞ/Ç–p›ãèù =\ÍÅË‘Hot&ñ†DN˜×»©‰óI…‚‰Áƒ[|‚ëFÒÍ‘<ÏˆÞøI¶8“ãçåàÐd·ã²‰¾×ç…gÌê+î½Ú†‡Ì·ðÝ Z@ûî»wK‰ëË“(p—J¯N¡À GOKê(•„–Ä™7 -xï´ ޽M¢Äù†¹‚soŒÒé(Óù¹Œˆ%¥ËvzÌÎ7(Ûê1%§ ÇZZ¬‹QÈzL׆OÑl÷J&%Xo#”j 3<¢(µÌ n$ Œ¥”;MÊ£LR¬J£Él«Š›£7Á–ê¦ûæ¢0`[4q€Ô@ôÏ¡ÜVèÞp[é™?͖к 7MÍ@ Âòýmñ ÂòqÃŒ‚°|»¢*¢ ,t,u`‚fô[äB³E"SäB³E¢ˆåÙLñ¨1¹zS4Ã9$qùÝb¥¤Í mU‰"“'š³‚2 FPÅ䨭ŠMN Prâ¡?°ÐŸ×«S9õ» ž›/Á›SÚn›=D×¹iŒl2Øa ¤ qÎZBA|è[LAX¾— Ÿ‚*–M @É“*Ò‡!ЪŠÅç|UIdî«ÜõŠ_½ šÑ«ªêNVÅ‘´'&²ÓÕg°ª €ÏaäOŒœ  x|…¡Îö,O|†Rœ&ÅZ°§á°|ø¿tìö•²@ˆÍÓžB4û0WSÍc`Ô.¡FE†îâHÉðÏa^^C† XcÐrÊŸ ›§y%§Êf˜-y^kIJÔFSåŽ)m•Ã]¯ú*7j#P¶Q¹Nm¦sÅB;Eì[ǃCW:¹Z@o£ƒ‹f ˆj£gËôö¥¾!„]|umàÜgЖÀ…ÅxÑc¬Ã/°çæzšˆ”rŠC_ÈþDÉÇAìÕ»Ô§9ø‚›aTÆ£LÓU“Rᔇš” ^) &ö?ªII±D§ Êç‚‹,#Ì—¯À©š#¤€ŒÃÑLÆMGÊ JCCì܈‚1B B!Ú#NŒ§ˆ”-›*½óÂ' ˆâûs„º’©) M¨Åý}ì‚=ô.3§uæ´à]íÚŸLÀ*Œ}sfá+=&ÅÉ4VÑ^$#$ ¢K3r*.ÑxSNEGƒ²ŒŠŽ°‡È\¾A®nŠ‹Uø¨hK ?ß h Fòõ) ¨êqÿ¡Fïr ¤ZÛFìÔÛ ¢‘:rb¾=<7ršèjJ¿sË•o‚Ï8c͈ù` dBa¹UxûÆ.åû`Xv%¿ÞËø#€Êo=pVƒ|5v”©¨ðÏ;KQÑè¨pü¢¡"BÍåÂ)ý@Dù¢¢Å q® Ü£ðQÑ·b ®ú¡‰päžÚ/*<6&@%C뫈oƒ191ßž9‰ÆäMq¢ ¿øA 6+~Ö82 =Ò/åûwn3€‡»`Àsé¶„(vw}Åup‚¼õ$RMNCO–+=v^COOž+=xÆŽŽ4®¥GjOYK{zFE…ω3r*<T•‚ŠNÂ:*Â@L JÐ<-@ ô(—J×§ÑI%'_*½<Ñ.ín°¥ÊW]KÈÕ QRˆ"öx"©¯¡S6åA›xvíÐݤƒplj½êNÉãà!á)žä‘+î)žñ¡ f¶A¦'w>I.ÚòÓŸ½s6s~ŒHâðL¾I+kßÉÚøÛµ»ªvKý0àæ6Œ.‰¶Ô¿;A×7Ø¿F[Êôd ÔþÛz¢Š1qŽåµÛšŸà—…¹^e¤Æ£ ;÷I©q0]K0SŸJ"eˆÂÔ4%Êe6>„ÜRq`¥”ᄆR{DÑÛÀX{Ÿ ÔÛ¥*6ð%ÛÀ )µk2aÏ/š²HGðÝÏ«mÒgV.vfåÒlÉ}ã –¡r 9…œBƒœ~ïªÏMΓÎ#gb<˜‹v^…ÏÍ—ƒÁºw§ðÈ †Ô4ÎPKŽ ®#û ãã{r 9…œ[SoC€ês“óĤóÄÈÉ͸s÷lƒç-ºö]øú„¯aH¯ e;ÎzI§q`õ>&Q@ gH ̤“d8¼ E†sÀ8¿ªÇÁPþ¢JŽ1¿¨’E8s&¨´PŒˆˆÕÚcÍSg¶d•û+2”ZØ_C¢ÓB8^§p5œz;ÄÙç-ŒÐEô8£«-„ZˆÑøОåqTZ˜§J  ‡s È)xnÆ°Íæº /¨ŽøÞ há›y —nÍ· fƒÛ)B"¹$F÷A0B­pìO#{á(€+¢§£«;Um®Wʪ¶YQ4šª¾ºmU[žÔUÊ·„Îtʧ©êP6òª¶@¸çZSÕÙF"PTµ»EYÕÙ^£(¯jòD:•o¯­j{òP]Õaꪞ¯WÚª>Å¥jc)UUcr爩@¹[zpnÖÑíÁ€ûM HÁ»`Ä~n‘ ‡×é_8(7ªâJP—G9$y&¡âfJrDÚº«yÒ’£¢úz¢Õj–6w3­V'P;®ø§EÓ–»š‡I›•Ú¼âkøB­!œGF”}±†/ÝâÓJý¥9-Þ˜ƒãztÓÎ6xŽpý»n‡ZCpGÔ(êz5ÀÑ6B£ æi'x¦ÒÖíu£¡äh³×ãë#Oܶ"Féiƒž¨PW"T¬«…P$£ö;Ÿ‹5k ¸ý²=ʾX×o Øœnü9“36£Ø¬Âƒ½»Žnw‚=KŽbtÜ6|‡è0âõoqK4Þó×R$‡8‡Ab&ÔÁ=ÀX9 t&öz•'”å7•¥e`c|¶ ×·  ˦Ô>ëŠê§öYXUzŸ•Ô>™©+|zȆ÷JUFŸ®óYyŸ~ÊÁVùªÒú¬ûútŠb9«Òªòm}:×B 5JŸ¥ñéûK÷}ùվݜw”‹·GIl@ÁEÐÁÇŠˆ¼^±§‘a¢uôBÁÓ Í •’@¶3*v5:vl‘vªWÁN_Q*v\‘á-ðvR£a'¾é\̎ųڧ`Ç!Û˜7Tc;ö½NÃÎÍ՘ÎÅÃÛñ4ìXd#›¨1ŸW¤]¤’³s5³#oÒÈÞÊ)ìœr–SAçDÝ6Øõ%;ÞÊ5jÜÕ«+­3µøìXdojعzjômÂèØ™Qcè–ÁTØÿ=šîØæóG­ïù»ÏqÖ.s+zæâôðvõî#àT»Y„ë&dœdL”8Už½¥:Înnâ x»îÁsQ Îîeâ4x_OJÎîjâøÀÄ5œÝÛÄ'áý ¼9Îì©Å$gõg3ñ<üB]F[½¬‰§àC5–sÓ[¼^Ȳ&Ã÷'7Yœ…ûÑŽ¼È·£a'ºŒ-Ì3NG$ƒeÙ8‰ ö–[6N4bB´Y@¼A|¾ÔÀA”6) Ì_¥˜´ûŠØÕ2LƒAµL‡Á“ÎFr¤1Ä~yÀ > Fq|°BâôÆÄ­çx³©ýÜ7Œ›ÍC‹³p­Å[ŠB„n3Xô¡»ýójë߸€ï¹t68¼1ÃÏU•ƒß§K¢”½µaIÆ!Óh°± ¤!(W§K¢”m.Mª“¼â4’”†>,3j6SNwß_ª¯öŒ¤Œ†€{á€V‹±¦ôZŒVµ€Ç5.—··*¬J¦Å8o¨×â·á= * Šê\¨Åé:É;ïIY¼b+µØ^z¡ÖbxncL«´>á.­Ç(ÖâwöÊ3µ÷÷x(ý aj¦$wÓJŠ×ºû†çÔZœ÷¤L^û iT~¹RkqWãÚ¶ÏÔ¹^‹C«Rh±ïè´C- Åçʤ qû>pûˆ¡æÛFÕ¸Z ‘ê7po*.¬Øðöö)®½tÏÓI0Z¾_ȹÀ÷±ªƒd4|¸¨6SÂW©ÏQk¸%'’øË”œá­¹S²£q§6E2’øêÖrT”Š33tkKŸf«9ó×À(9ùC¼uN*y¿«p%g}EÝÑÂóøa…Ë9à ÚÏbá)üq…K8³+óyïxk â§+œÏY¯€ ÎTÞáÛ{žÄ튽 ¨«¨ÐÒj>g¸ÝEi8krÓ“UgÖž”vp¯“ÊÙòv°T‹™î)î+¼.º“×þ>àwÁÓjÞ‘ü.“(¸Ìø|4Ô÷‰Ìð9W¶lõ%˜š™/9Š+'¼’Sø8ì˜ß]جæÌŒ;$2à»»µuœ¡ŸH–ÀãÌHX¡-=>VøœVðGÏ™½1\Í™W-gâè8ëïAWqf¹Rsf<μ¾8ƒ*_Âw!Μ MBÈÙí|—ˆ3×Ì(9»±ïâq†•Ldú‡iÎêÏ廸Þw±Ú•qÝËwñCߥàìž¾kßô–ú>îšO‡ƒy‡AÅ1ö|ùÇwð¯þ®5ŸwƒWãTUã’A̘ u íǪ’’ŠÁ™ðÉ‚Rņïl”>) pú„LD¾»L Ô¸èô'¹eñº^©ˆðÅ „EBRÁò&«fÓ¼-.Z\´¸hqÑb¥·í‹-þ"´øIö|χýæŠÓ¦Aë|ÅéÔ«ýØ=màx˜Œ ^¦Ò™>ºIxÅÙÜ.™ûXU®ètª$R9p+SÒž@…§çæåTørlÔ·É’(娸Ì<¹&¸Å[9ÝGˆ̬ÝT96иH®a9=ŽW» ôõJG…+§æ¥r Rsk7É-V•΢ ™]cRë2x.‰\Ü:¦´º KUO5('¶±"Öè²µµ.ƒþ©|Ä9òêj]¾}ëÀâ¶W•.ÛÊRë²ÝQ¡ÖeO W®Í¤uîžDë Õe»B­Ë0¥y‡ÖÆ­7y{·ï;€êÖ!è*ityÐeê²ï Û ¢Þ0Lãtñ¹Ÿ@~a€.ìÄ7ö NQ·AÄ[›¹{ÄÀDÇ=/F)MmoEaŒ'ÓR‹€0ÆB>Â"àd£Œ0¥ }-âc@[ÊGŸÍÒ"ã#HéC3+«ÜE(WVy2Â3[T½æ©ª< Z]…™«‡6”ŒFu‡Á¯UUÞ3¥ªrã€si½o;À2Äùûèáñ;Xƒ»Àß ''Ð×uö·Þì/ ú»Ý¥ª`ÒÖð.¯ÑõÖÓÞöäŸÃÖÅàMîs£Ú†ôùϸ³ø]ø¦ª)åJ„kÔDå>ãé)Bº*í6©<*ý½yìòãç¦RUKøg2»òÅRê¨É×&…ʈ¹”Œ]ikéL–Ï”R‚‰”ì%7TÏKÉ]•¨Õe[ã哤„³[|Ï0úŒÒùža(%èÊêj Óc˜hZùSR ôO%%á¢ÔºÒ3þ+%\Xg–ŸRJÿRŠk\,%Ûâ©u9lñR·¿")åÚ_®”-žTJÉ-%ãqè ôÞX×ÊØ+ ´}ÎÿQʯˆ§‘KiìERÊ´¿\)á´¾_k/cQöÔ¥d{ʾÀÀË¥4ãq¨RÊSãrÐÇJ)ã¹R²—èÚ‘ÛÙ®\ã$—Þ}ÿöŒóboÍP®ÅIªãxëäåìv@\p±ºÞ¼{óh/^?Mtiýý{=!鸰žB·Oñz8z©¹2»}©­ˆ0Ø* GDغ8¢§xÝ’HñGl©”õôgyÕõ„ÔÅ„Š#G$Œˆ9a5Šz‹#¢E.Ž'UOa™.ŠÜ_Ù2Ñ2Eâøüõ”)Ó]«ñWg±JÅñ™ê‰RnC¹Ê_Ù%%]»âŠ‚û]µõR£3Pè¨ü•FŠa)jø„ážA•¿Šh J­æÅÑ<ÕzÂ2ñ¿ ;lŠvåÆõ$p¤¸CYßñó<‰Û•ÏTOSU,̉£¤À ¦¾Øý íàY}9˜œ\7¿›ë[ûüò6óôú#ú/‰Ô°ã¶CO4̾Ãñ7½Ô\™ë½Ôv" næp¤É ³(qÄè š8¢2=OqD„ykêé­Ã‰##Ç  ŽHÂà†v]=%¨áˆ#| {‰dâˆ>âXU]Ooa¬ª®' F*ލ Óú«6Gœ°ˆE=©üUG‹\OªžÂ2¿zkÇ@ªvå³ÖS¦L#µ¿2e$Ãõ÷«'JÀå¥äR«,§¾“dJmŽ4ÓIâzŽžvÝ¥#é˜ KQÃ'ì³vüF¦’Ìg©§å;~v+Èšê ×úÕ…0r‘ø’°(IW(NLé4ØíÑj°ÕbHº}I.’>:@¿ PtÕ0r‘è|ú(Q¾%´%ì[ÔÞ|ŸNt8šêòÒÑ6Á÷òé4Ú2n”K›¯reìD3Erlà Š­¸´ÅnT\]‘•;°Èʘ…Q7ÁÏ%mož¢O×6ÁΤ”Mð=|:Ž[`-¨Æ%!3n-e5î,3ãµÀÂNív0àHkøCÊÁÓôÇ>íz¬öE¦?ÚX xÿ´ #A,6Wèz5(VF[ñC ’ž¶ Œ_$ýS7ß+I÷ÑÞò IWÆ’‹¤+ Ï©‰EâK²(b‘xØýd* îBl(5>-–‹¤û#IƤÄÕå‚1j«ËGX“‰¤ûˆ‘YÄ"‰MJ§Áµ]£×i°Ë€\ÝѧO' ƒˆ)ªËz?©H<|ç(t>=áµ$í nõÔip芵M0öÕût{Ò\(’ž6»+W]]ŸÁ§Ÿh>½RT—q£Ú^‰u£Køô¸ªt>]߉y?mOŧ‰¶T7I@›'FçӮخ·<~¡õÍ_3p½epëùÛì6»G ooCÜ»/¸‚Œqý.ò aÊÞ¾q±RÏŸmèÃaÀõå>»°x_Ž”€(½½\E@* 6³¤Ò [È’J&Ô#! KŒ¨ªÎ6 ½R'uqÈH•:A¨ÙRW•Ý0°dU1Õ?&cÆIÔ?&ô˨ª/ÆQ¤ŠAjîUUó„âN'­£(>½øô§è(ŠOÿ¬Uu"WUõå8ŠâÓ¿˜ªúÚ}ºä6×Ú˜a ·ü´›6¢6pÐùˆ·ã¿öçl'ZÿÄdM$Š“ìÇéq*3Ÿƒ jÆòôÙ$ëÕ$­TÐŽв  ©TƒôHŒPªAz¤F_UÆÕH¥š×&Âù“@ê˜ÏQ8×z+òGUÙÞ‡ ½x€nˆQÖ5 „FâHÂ2ß3ˆIL‘%ìÌ@Ú´ÈÐJo ÖR:ŒÒpÜÀ¨|)*p} \ú Ä•)jPÐ~Óàß° 8ðä4åpé0pÓpcº{ž\Q®¤-Źš“R**Øx‚С¥cŸ)h½J‰-tSO¯´š.ŒTø6ÊÄÕM¢>¤Ý!Ö·Óšâ3 #Û‰àðü™VeàÌâ*³œÃÒªK©”£.;$»W—t¸g®ºØáxC¤.®[™Öuÿ3i¨§l4NèP0$^•Î ôކ¦zµéDeÅ”,íi»šLiwk Æó­ËwìÚÌ7™P$@Ð [¨Y8çŸ8ÊÚž"¬²:F@âWÛM;Ý¢òÏÀ2'J?¸ÒçøÂ[ÈØ|5Côõ*+·9ô³D$›®|ß³Ù4ä˜s]|JñS•†a~²Â#Wøb–h»nË›lH{A¯ðlGî‹›Uû\]UUs–Ç]Ï`6èAkœžEç)Û9þF5ˆ7HÌ;7“œÊ$wAã;i|3èxð†êV²Ü3~|uJ«¦HoHîRêŒapLæj “|Îb Oÿ<­’6‚Áœ[™c ç2æÆ`â‹› ç–fÌÆ‘sÖ6kÎ03D6‰2&cõñù‚¹Gr;¯°€)_ônã{×y™YÃ3hÄ&`(ÄDt< cèp’{#_Œ+‚÷5›£)+‚ƒ(ïaw.*DÛu”jCw ºÑ½1‘ußüãÃÀ´Î÷ž¦Áj?‹!¥& à²Û0ÓuªØ Û .%:®T.¡õ d¤•Ð5!C!SmDìEO@pi²ˆ}ž&áiBcID¬Ø%õ€§FPf€J‘m|eJÔ›T&Ý.OÌÐ(Çj4ª°[SjO‚˜„xš9‚pžMMå‰/!–i4Æñ¥‘“Ôä¡mRæ,²‘4º†tãGBß%£dÒn@•Žfõ²Øx’|Ç)Þu¼ê¨ì~.3,Ë]ßÕoR…P‹…­Øœ©L†3V¾–&!¼[¨˜ì ÍW!N d‰'W¡öjeÜx˜¡KÕBd[BšÑ>†ËÌ\Æ4— ªº†\Ö±0ÝB¤Ø$-“ÓNg2 ›¢ñ8ÖÄ6ÙÏ; ´¶w<îs. —CŒÄ5Hª90Ùó ŒVÂ=9S³ÝŸ‰R°«OÑÕi&í¶‰AFLF>eÑàyÚå`Wb^Sª‹°\FQÔöœË¡û› {ƒ¸QG&ðw€æJ?tÒšÔSã7¢÷ú9iã Þš"ð–Sç¸Ô^”æc’ ÍÆ/¦Ù%¡7‰ ã µq8Œûëq§QÑ^cH»­8œªÎÙدQûRü²›€‘µßp ñ|^ún¸«§/ÌÞì¢áç°é{ÅüЉª§üD3¦Åb¤Ÿ‰Š6ûØñRåíëןu ‹ÍP·PnáF‘ièµkŸŠ™á쬶ÎÑ.¹3~Ûo·–ðÒ•éf®§MfÎ`‹ê)^ìÄùŒìl§XÄGˆj×4N¥(Ø´z¥â+ Ù¦ÔM˵=·~ …ÂÈÚî¡è™ÙŠ4:ìIäÅÀ¢ÌäŒîaž«•¦cdäf|y]ðH¹GîöZ‰yñœLyâ)Ÿ©k^rFŸöÄɳHÉÈ!#/‘ŒtÒ‘1 Ó£r ÖmNûЧh¥Qª†ñ …@Â} ˜^ªÁ©¶\ƒ"`ÅX*W5̈ÖH6L¹ª`’Ú,âÊ5(e#”« fŠÖè˜Ü(–ƒ1¾TmWvϫڮ0$f„Cå m*è/äÝßô§®T5ƃɺxKWí° ~fŠFe2d¿Úó0é󲂷©x&ÐpëzÖ $¢` Ãû– 8BÅʾväÌ6_ÌiÑŸÆê#çÌ>]Îb’ŸÄΑÉ;а¥‘²+žˆ/ïPÈ9,8Ë TºlÛ«SWNPè “g䓯áÖC­aš¦_ÂÈíA¥a†ÞTŽD¬6Ì„Ãʨ'G†u°X]P«ÖŽ%£d B¾¼1®Ò0g]FDOoänšÊ0¯Ø5Q¦ õML@¨†k:Þ‰…»8ÒY\Cƒ‹F`:U*4\—ºP œ.ÎâÐÉÏ á^r®0Æ ìbƒütqÃ8]B4pé,ò“Åá1B½êxcPªNWß:ÕÁc¦æ'ТˆVrÕ‰âùÉU§×> šõ \Í¿±ŸÐªŽ ý¤V;?«V§}ZÕqLiUÛ… î ÜuQ¦Ñv÷ö*´‘C¿³ŸˆÑúVJ¥:÷ó4[Qm*Þ dKLJ¹nþñÜq| ç¤.ýI@CJÅ7B¤¾(JA}©)¢g‘¬p¤H³<ñ¤“‰¦ÆE¯E z® £”³ëݨœÕKÇ›”©›ŸÐÉÙF ÓJ'öçb$#`¶& B¦Ž‘ì<#Ìò¤•NGŒ ©óg—Šœ'pvRè÷<Òai7Ç“X:¡ß“# © å<Œ*”³»hEѨdyZ®É¥"Ùžƒ‰'<®™À-aù0Ç‚±ç^†å³‘º3ÐÆE ²0³DÏ"ÑwˆHÉ×n‡¾V:vÇ—) Ú$—3lcãJ'…ä7³+åD´ÒHæÈj–Ge“Éy4L&çΔrö”Ò ÎÏhzsÐÈ9`‹-ç8¥XÎyžXÒÉÅec!™.èašèE:n¨ ’NÔ­Ö ¹¡‚V:ýPA…u«¹JÈ“¦ÉõH£nõ$RzÚáM²äMç#ê½dbˆŒ•æM&* Í ç œ,š(ù4¤†Œ–NàQÉÏ7X'EKð™ ?]\>´Gö½—P¡ÃfêàYŠT'°)ê¬WêʆüÝ™ Z6Gu–ór;ê?ãɶæ/à'Òhö@šZunï'èh®O2Iþn^Zá*›Bul» WÈ¡ßÙO$Ðl„8µêÜÅOÑ’Ag!_ WÏÁ²}¡á£ „Ö^A<‘v2oöSÓN”‚×óò¦R®W:n\J¼$WÁÍnìŠ%ÜKn„òM”ÒõIÄÜØ¥-7ø4OÅM·Œ$çæ0’ïNl ùj,›#_¹eOÈ79àÂ4õuwà¹Gc[ʧ}ç6æòRJ릧Ë!•3$*nð1Ìú¨¸ñòUrC”/©£z*nÜw0 7qu‹¹é—½UܸïÐÄi¸q)Áºƒ´;¶¼;åÓYgì÷¤ú+ŸX{íJŸv¢ãezs;ó;¬îîñt~˜ºWa)ÂÈ,I%N”‡£nZ‰“åƒ"–8Y^¢¢$ÆÊ'æ0l.2–7¬*!‡AU‰µf¨~B­ *\¥5;w«µ&Ñ•ˆÒF転5:­ÉuøNðï¹Þ˜Ý£hjc.í8oDÍL9´Rúšâçu‡åÜØÇ° ªâ¦×7ùR)ÔÉ·ûŽëY nfäË¢P,߱橸±)í„c”vÇ—·@¾ Cï)·Î|5–M›íð팋ûîÝåñÕõ¢´ L½Û¼~ü#ã½ÆX3CrF¹#ž¹™°ÆÍ €EDu«Ã:¢ ]IrË#ÊôšË=k×Y¦ªà,å^ ;#"¢¤, ^a*ë-XÚwZP kC”éYRšõmXR¥dégi'€…2:O5Ãv½Ò{*KX×hݧ äÎuÉw›ÇïßÚ 2oG%l.v—Í%YÔdÞ>'ö®’o8˜sZ˜7ÈiXŠkC„éêIKî'ÔÒ؆ža]Ë0ãÄ’u-Àtë—­k.æz5m%Úºf`º]µZz¦ëšŒiCñ"Ôº>dòî(˜¨x4¯¦­ëyL¯xJz0’¼–ž Ï©¡g\×S®×¯ð÷]Â=Ô°›Âü>\Ó­`.oOÖ©7LWKZz`²óAKOà4ôà†§-=±{Ò“ªkæ¨)X²®¹˜p!«• Ô5w^MYÉuMÆD#PÓ3[×$L¼D‹àEu}ÈäÝÍbúq’”ï|ÞiÌpúAA£®'0ÙE9=éºN švn¡c£+8ÅЗc¬ìË×öÀA\ÒdÞ '´KçѦ]…SÓcOriéAo¥§B†½VÓ㽕Ž+_5=·ÒГÖ=6&l™^€žœî11¡ºõôLèÓÖÑ3­{dLÌ´aéÞ!“wGÁô† ¤ÇwÇ•òé AE´Û Ђ‚žî%M{hä®8´‚€<.%4pö¹šaÌ퇰R.÷å¬WoÚ¾â`ó²MäH§78z׳áäH> ¶gPA’é'¥Cç¹ÒK'ôÄEÄEÄ×ãb·EÄKŠØú[¸ÐîðSïÜa-:g8Þcqá2/èí‡t@¿ÆŽþˆŽ0½Ýo7ÎÁiý=Œ©ô¾ÙT‚ps,’L=PN±™Bck’K'WÙL^G†PD|w×c^·EÄKŠØ;çóîÓª;¿ë’›®³ñÉo/8üË0=npÖówH”Ï“ÈáîuÂ< ¸„Wö¸äõJÂÃ(‡ ²Êãt-§ìQŽXý¨epÖ«jÛŤÔÖv„#¯m-NÃígÑÔ6à˜WÖvÜ+×öÛ6ê"±j©Žs›ê¼´´¶{]mkp9Œ=hk›Ž3MíKÓÞùõ…ðSïcßmv¯ãÝ/¼UÇô´áôÙõ€°¨3÷ÀDù$@÷ahég’S@Åv$•¢“ ×ͳ> 0&¤¼+ÂFzWKÙF'ÔJy0O"•2ÁÓKÙžæ¶%£"­òb¦8pñ”=îo¡LÚÃýá fÎ5D\¼À?ïj¼¦ª®»á®;ªEöI-ýI¤?‰ä)R7ÈêAw8G(µO„{8Ò„²ÀáD®<HxéOž)pŒÊ®¬l§ã×̘L; ®,{ºPä#ûëªÝzt‰EH~zWYí¸ŸNXY&•d@fôRSYñ¡I)’ï…JÌ(ïziª=>Ž7@:ŽÉܦÁqߎÊ{ºFj?Ï‚** }–Î{F²QU» ©úán¨Ún7Ð)x‹¿›+Þeƒ@»NCw ú¤––þ<Ò’@‚Xæl¤Á¦ƒ+Vwž ޤôHö˜a’P¸ šÀ“çɶ LyŽÁí}b‚ÊŠ‘Üi"¤žLCŒ@žCp‹¢FÂŽ,[ž#pwFPfF=RâKWí¦¢Äf a ’Ÿ›ÐW–ovµH ¡…àv¯ñžˆ„ú—E:ŽÉÜ&ÁAqtÞóêRz?| †ñšÊ‚ŠÒyODrJ¬ðžn¨Y¢Ñ„Šš“çËù5A„ñ?U»¹î+óas6ãýóæ|…10E`>Öõ¥Þ4ýéšöáÜ%…³l×êÐ¥x‡lLŠ p\âZkª˜ï›£˜@/ êˆüOÑ»^édâ’šÎM‘p‘p‘p‘ð}%|LP\ Å: ]„~‡í5˜ŽÇ;kÝ78Uñ>ÖÐ9 N\wÔ'¬Nþ­=áu®à o@Žddsƒ³¡±‡”"“‡³ðI2yDb<1†,ÓH…'Ë4‘v^L]M’Z!A51eɪ&R E…³«)„¬­ð%«IäNÅk+|ªšèH0-Á7žEª)…„pÏ!™áÿ€ÈC©ðç\áóîðE÷ãZõ7ý¼Ã§F`î¡ÞAIý!À} w<š·ýaÀª^÷2²QáÀaˆ+¤Í¨Í •6Ü^å™J%K›é#ÖÇm8E,C i³ñR$º£Â {= Æi\±†b D”j@Û±X×o Ý¢ysÜ\«-n3¿m [éL¾³ßu‡+îW†xãí}Ð’ôº;ºYÕ3(¸/jÅŠk ÕE­p%´IP´á†Å)ži´Áv& Љ¡FJA˜¨Qäôw£c›‡íònÐF°§w¯ÁºpÂ'<² ¶·Ãy§ X/<Œò r9ÍKåó Meï2›§Ø\¡FƬb3…Úþ0#_ºÐèFZ±ˆË*"."¾™ˆ«È //â~~?$8UFv 8Q^ ÃÍ4./h4ÎâU˜+и8¨k‘@£â,-ü¼Ã,ý)`¹Â„ý…Âà¶T­Â@7e¨Qºlæi4²é3 =-_6:ƒ`Ë&SGÒ(LJ6|þ¼W…‘j~ÚðËkütêAú×}¹öL''SÏh3<š7]àTqŠ˜VàTqTàDqè†dq‚a 4.λa®@£, WSæËR˜¡+- £S˜—{Œ¼TCè%ã^aÖ q³æÁi³0ׇþ0Èî_pÖòݛͻ‡þàG½{0øUåÞÃÛz‹Á£A¨¥D–¦Ëgƒ¥ÔÙ²æK•]=WØ/Òsµ^Q$8[.Ci¹‚áE‚s%Y­Ñse'» Wt®*,«yf\Ý­®ªÚúÊnvâ Ø/è)ÁuÖv6V/‚ˆÂÝïÉßÁ7èÅÂFûóƒ¹-øm¾jë8a&ÙÑ&ÃþdBÜÙH+xÏTùB \2—㘇ÇJæ$8‡gê›U#™dFe5'ûêTÓÕ·Rc/¬oæÔiŒ;r£Õ˜iӬ̷°ßdžùÀÙö§Ý¼nŒ¿mÚ0ôÐÙ O¡Ï…}¯sx-V6qMÉF[ÛÝæDUmw5¥«m+cum¬ŠˆN¡Ú·8]ÚâŒú‡pa{4ÚèÛqîÝ”%ɽ[¯¤9£wþ "=¦šœtß KÕ.ºíXawjêV¡¶Ž¯(^%åq*]t…1¸$NÉCìïáȧ¤ ÚËE&ù¦ Bðbº$³ˆñe2bÄìe<Ä^Æ:ý±7íhj¿nâ!bwBWÛ#k#f­aäj›ü…®ëßä’E‰Ž£Dþn%–›£Vb¹^l6 Ëç’Í`yRTXƒ*b%«ˆ•¯"Ö\‘°ÜX¯­É*RaI¬¨·Ò}å"»}Tc“¡ lP“¡£D†Â0ì±ËÀ)EÎ`ùXÎ*,pÌ¥ËÇÂWb˜>kb]„µ^Ñ´b&TYÃÕ­ÂT·+YÝ$¬Þ6OÃ>a»^´õT² |èq2á$ž 'äãaôïlB"Ô)á4^ ^R0|¼iÁñLçA^ÃEcn 1U}éìyçòÙ…Î0n`Åêƒ Œþ[6Ô6)á4^èPƒ‡kÒƒ„<Ó:e2ðlq&á<ž«*bdñpMš_ÃC<ؽ¢ÑçC×*5:j h`XU ¼õJ§1î†ÚÌ& 9ò«u¡À\'Ë´ú“É|"—Èg؃bA$J&Ă۷FÉøXàGÓÉXX¾#«Ä e¬À‚èDM’±‚q‹ ;²$ ›Är·oi±`vš«ù ¬QäÅ(YhšÐúŽÙɪ.”×Ê&³Ï™Dv‡F÷FˆåÃ.)±Ü ¬ËËE…å'*g’Í`yRTXƒ*b%«ˆ•¯"Ö\‘°üÊŠPó%Všæc.üI… ÉíŠÓus¯³))ˆ¶/|$–Gìæåb*¹ˆHÎ$ß4ÄLÜ&6"ÄAå×Í(´PÕ¶ýæîùÕéO7ß®Ó{Ÿ‰®¶'¬‰H° ¢µª${#o7çãæ kÂ;Œ{羜¶ÑsæS»8­Ãhq¡\aX⤦==\Ïí¥…“aý×ã>~G‚áç½ý¯ *ÜCŒŠ ÷t&õ.lHš‡3®h¶¦÷÷`ZØö?Ã6ê8|šJ9™ÎÀSN¦ÃC–ܲGéàj*7ðÌ€h¹gvË´†›„tS)£)´ú„'@]Zÿu½röÁNÝ„)üƒ| „“T`øvûŸŠ[ÙjJŽ8â–(–Ú¨Š®ÄkDí@à9‹f:kÆg=2²âÏÆ¦Æ)ZúI ó8Y°Ä§á'/d?y®÷0fo>ü\{4оñY‰¬30W"uö§¶'ÄS$NH#&.gŽ›Œ€ÇK| ­¦ÎÁP ô8uN#ˆ¥ÐØšw†+n<Ü­Wžk *ÏF¨<Í™*%ƒÃ0…FÈ ³ÒÔ3Ž'[W<úpк3WYDi`dÒ6M§Š›9ót§‡‘»Q‚ˆ©2áp-Áè¸É“Ããf„#ãFäÙ§¬&çÙ]÷rg®ªm33“ï.!µÏ;p:>¯`<}a¥¿HÇÓ¤bB®dü\˜ãé ?)gªkžÄ1Ž@ä¶/É—ÅàgR4Ò±ƒX…xc‡l1¹Š’N™)M‚Ì[mîlâ‘«› ])&‘­+‰.“Ö$fûnÅÄåüú&Îmމ¿Ü°»OâP=ÅÃô$Î u'sŸiÍÄ»$¿‡‹0 ô× lQÄ™DJ ²iQ)s (œöàr#›öÈ–’ÃN{¹™%‡+³Žx°Çóxg¶¡ ÜŸhÞC&nî¼G¦”¼Aç=TÊSæ=Hl=ñy¦Ìе+¸q?”mB2šÑö³8»#F'ëÂŒº_¼¢ùû-t|ŒêÌí¼Éw¡zÿCÞ33é0ÃÜÐ÷ûHO¼³J'&ºl¥Ê§šKcib‘x¹Ã¢äœàs¦E⟄ Æ©ØŠÃg-– M8ì¬pÆ@RU‚ T±õF¥š¡`…>xj#X?ýˆôˆ{,‚°Ðþcë>7nöñ•¿ŽG®¤fƭ䑆)±}ήf~6Ì!ÄC¦{{ƒ=GnÈÞkÀ MÈ)i“øê-‚½¦–4æ‚“ nz7·×áv(ê®Àì@o†+3YïV4qAð#ß [ŒÌÊC¨)Áf[¹òpvŸO8ž¼óâ Žá„ÊÊ3ëLiÖÇ;M\g U}Í›á™RÆ8¢-;ë•kâ^6'“VûhìjïÈéïÊhÜçAïÇ ‹êÁ¨ ž°jŠ5W`/˜²Ä1õF°™*Ï3•ãù‘z†ŸŒÚ–ºmÈ ~²ÔðøIáø±Ü0öO“ß[jd=i S5>¯ºY±h˜{vÉu5 ½ ÙêÕh†ÆnHÕ k¦Ç]y5ïo^60ĬNΡ£K4+ÂP³Ù^‚ácÿ­ïËÜvøÀ^ V–“=³› r2œÿñ=d>o‚­¿‚™*AïJ¡O$§¸!VYÈ ‘ž9n¦aø`³ò6ßù¸æA'ReQ^¹Ý§ã…§‚ÜÊb»0w–‘ÃMÒ™Ø *9[^zÖ•MŸHwGÉDº#—6Gw¦JIŸ×5МðéLÛÅ>7X‚&½±my/ü]«ªµ}‚j»ꃑx4Jè(ßw0Bà,cä™äù-·IÇ‘+¢>èçtpáS?¿ù8£~týŽY’ðsŒÃ¥{ïGŠh&‹ÉïZã¹2ñi½Ø©\EUMçŠKâ`º‹Å[P ‰«ùÖc¹­>J~æeÜñÓµvpm7΃VÛ‹çMuý`àϱ•u¹é}“ëæÜ¶ÑTBP(†ÑårÅ,†¥§¨é8™ôï3o‡´Ím&0Æ×@·¡$ÞßzÃFF)f·‚ÒÈ‘Ã[Yòn~‚%jéÊ@Ô·Úéãuíå>¸†Ô®Œ¸~þîñ•½„¸†øï(lý$Þi— \OHž,µ¾€–VÃ$„ƒR䦡ót|;¬vbå¤éYr s®NBffµ8dF`šì¡«Ä4§{Ïá7tCºn³n?¡c9 «ëã³2§“#ô|!Ž÷X)â•Îîñ£å`ž‚ó²Éòòòà[©º_rÚØæÊ6k{x‰7¾Â+H~ØoΦÙ:ïLGÊ´Pþf­\ƒÅž]çÙù%U ·NÞþòî‚¿/Õ6XfRªCWÛñ:UZæ´‡ó ãŸ->\ìv³¾wY˜ž/$ré|æ<+7ÂÝ;) 6cÌN^Í»»ÔŠØû÷PÀn¨C›9pÒÔw l&˜leî ËMOÏtÖ%K¦šÕúšé¤ÄÒn”=l„à.wYj¢•¢Œ4ÙuÏo}Fî>^gTÊ Ï{JZÖÁå|«“5л÷”œ[~Y5§é£ø÷\%m¹lVó!ës>«QéñÜ褔øLëO¾”eWFý¶ÌæÏÚˆ‘îðÛ7êÔšæ¤A07$ˆ#'Å}„Û­”‹¦É¹+å/Ûãþ±Nù]ÑhJaK¸EV°(#žë ³t¯ÙuÏÊ­OÜiz}8S|ËùõgÓÐè6P¸¢uš¾˜ˆPÖirTùAÚÎt¿Ü)OˆxÌ8;;œ˜û b“íRYfíj–öI!ÓÇ»S¥P6jªAâŽ[ ©%8j8ã>ÆíŠØ3ÈUuºËj½½Pܶ²Oõ’IE~ã'™¨O•2§9í‘´è3̲‹w$Ü|h>lüoöèæ¦;…=b5ÿöGkœÐÿÌ«Jr¢–5éŸog—Žþ+Ž•E ç¡kîµëMÐ9iÃÚ¼MͲvO$§gæY­Ý£?£-Åç)ºžQ¯Ÿ=ºâµ¢ã‡’­Ž´ÆX»•YÔµ@/q‡iÙ:yðÝ a£uòÌôãÄäDxÊZgìÊ6¥÷éLR|Ñ‘äæß˜M©,ŽÅÈÃ?™í­¶)ennøRN§½ßÝ Ò怺Ä6¸Glƒ0vÊÞELil˜Z¼9©±7)ù¨)b= –‚O›Ó}<ó[ÎÔøbΪ¨”yú,d²·Á™þE¯™©¼é‰¾“Mô„oQYŠa}c– ΂dcVWíý7wüüœ>lÆ7›âM/í¶¾Ó²Ê kCáÀ¤§€0Öù›|C¸´[×!ºõ¹V=½Q–G•lŽ 5åy‹€5÷ —z¯!£zÅs–«{nc[gþ]n.z¹¸ïÙ¸XpûÎûµà5׫:ŒËѸ>P»ÝÞ隃ï¢<Ýo D„Ñ_Þp£Pâ%TÖý]ï Ý×óbkŽ 7Žæ† ²”Ÿôµ yÙd‹‰Ã×zïåƒÕúߦ»?ä°ñ×Ûöq/qPv—²ÍöÒõÑîqê¹lÿeïÊ2U4îyÝæf‚²×ŒJNÇ̳Úk6œQjºßº‹ÑÇÍô³K»ad´:`±#ýê÷”>Õ9mÉ졺Ϭ~‡49d]Ênü*ìV8³h®Ç¤4NêxÍ2` œV—à¨0ÚÅ:±ˆ§·RëŽr gSØiÜ¥ÉĹpÁÒä8¬ö|û >±Ì¢ÌE«zÃQسx÷³äŒ¦¤çõdi>ÕËe³…dÃ`KwùÛ+î8~ùn›ÖØ·mH¢¤(»Å¢S¾'3_ 3„:GÈ n|)0!½@<€™ÆœÅµÛ‹™g\òð™h¯ûìBúþÅ{jV‹ˆBNõ(l±å,‰ôtwïsv¹*+»tÔ£¹Íœ`»?öîqÞÞnô0ª[·hsõ³”¥aØãY#b~?@rû>‘t$gO¶í|V·Íçç&<)¡0†ïŸ%'üÞå5œ/ñ†EÞÏŸóëJvˆL±…¬Zˆ ïgy²×ÿ ú'ÄfpÇdêÎÅäϽNñ‚Å?ñ`bs=ál)ü™*¦˜Ÿîâà¿pñèö'¸Çøù¼ôÇÄÀª1„»„yS¬o!9h"é\ˆ'™d»¡Rk"Âõ [YîªOî4AÆMÄ ì·EÌûÕ/(Š:ݯ0š.ÏM£ÁÞ'pC¢3r‹ ÉŠ}ßÔóR¢k{ÙÃC-{†!ãÖ§üL³½G“çâ±òIÚ<Žoö0Ú#· ö'[àFûËô¦tçÉÆm˜ëó$˜,¬Wh›7]¡mÎn{HuºÊÖ@šŸßÖ@N³!C‡ªÉn< u¥—n·àž6Îtéf.p ÑKS®è>±à5åÊ6†ŒëÎ6Ù^ç2Ò]º›Ç*}·Åd—néݺ&}λýÙÓÖp†[â;¨ã)öŠ9³Ý´?æ$Þèݤê MZáJÆ}ŽæNN…,x4wØÚsUEôg_Lü®gµsm3äf-Øä/¹  SJ^6¬Y‹F8kO «vÄÛÄ‚>MÜs¦ì†' …—Yœ–Ä“,NK&7{µé“›‚ÅiÉä¦zßùSz“®Ý ƒª™‹}Oa¯á2åZ•@EúyI &Ù‰j3ÛÏÛÕ°ÉšpušÝÅf¸ W7²Ž?oëo¶-šÔÁ–q]WâŽñ»Üä× „ž†ær¨ëy_ΦTæ&a(Š{í¹OÀ™|[“„HâÍèÖóLÝíZl5ï±s„ÒnŽ`î²sd¦”ÄîÉ>(3bd¥ÏÅνÅÖßûL˜ öŽHöþÞ%ú9m § e×án7„ÖnÆ0O7vz*dè ¹8PpVEã…0¿)©*éͬÍð™TܺÀ¬Eà.„ã¼å#uhç%çà†Ü¤÷5ˆDÄÞ×@¥§/‡Ù¤ £VÞëÄ}Buî—’DêÐ…4&0EœbÖÏëøî6Ko$ç`éMzpV¦ÍL—,™tåç‘ì¹W¤Žûì¹Ó´«z(<ÇýLkÄ”p(|Xô¡p£ Óœ µ”A4ñysþ‰Æ;ì¹Õï„¢lº´5 ³·ßÅYÎo„,gÞîØs(ì´™uº#ßLÂ0qG1¶?âûïuFD´ —{D$ÓÀ-}DD·¡˜¸;zv`¸T„ Úé î¹HÙàñ©Þg­ÚJöë‚Émþ ª ¬EªÙ¸Á^PÑÖÖy ~¦»t‹Ž„ÅÃú‰¦'uéFGÖJÜc‡¡$$”j;(Uqf ûtÉÊã†yò47-;ÃU`5Ò­­#Ù”Y‹Ñü¯z YtÊó^SÈwºEX0°—L!/°*\¦§¹*SÈw›BV­ “±¤áä…9//¹ÂðÉÎúÎÇï»O$ãQw£ùQñPø6'°o¾¥Tr5¨dŠa‰3›véÍFTç\^zNnºgM0–]Huénq$H3¦Ÿ ºë lV>IÀ#É)Ï'{‡¡à”§ö ‰)ÉL¶èð wm'Ó¥›aêé®pßõöÍ•è"^È"&R¢#L”ÂŒŽ@óÔx2+ÑJt„~ ïÊ“œ{º[½§/öËìfÏõJÂMsš¡l½ÇàžpÇÃôs"ñ ÇGÔi"É›CòçÚ4ÔÛ z¯®Š ~ÓØ¸’N l‡&°õt‹wŠŽ«žËžcŠq#bJ8—Í^™AC£;RkLUÖŽbæèéM@²F \Å͜߿Äv‚ÅvÉ.o³à~HÁb»dH. ©í[´[¯›JnÉå›À¨E»åÅå’V B<ñóÅL}°¦ò:œ|›FRMŠß!xç xäºþƒ;Îy®‡È“ÿ™hz&ažìNݹ¦g¡Å黄1Å"›aJ–MÇÒüæèÍMWôø¾Y°Q7å›o0-y—ëç‚é¢f¬_îÀS´Jɼ˜ý‰G}¸K(¼WÎú@É}oR^è2îl¡Ù^ÐfEÿ<³á4šÂì$â` qp÷Èh±ª*JGð9on½rn|M;YʾK‚“]à,‘GÖN¼MrÅÝ©êÚaíd¤A‘äg<_&8° 9¹/9±À_Ò¸øVöÖÑ™ÞU¾dØ2Ý(X 4¨ÀSŒèl`~(CMÄy(¹f(3é¹â|ðÁ.Yi÷Ÿ5g–w­‡;9DÝqʌнH0Åo)Üö›¯7uSF“7dq;.I]ùÿ{o²ã¶Î ï ø!.µÑ–ìv{yÎ÷oÚöI‚÷AúýW—U$%RâPƒ¤¸NÚ–ÈbÍœŠEmFÚ?áyãò§C†Õb.·Y•D½v×o­Ör`Ó|N•–"Qì~ô‡ñ£´ù`¥jjRšhg×Ë6!P’a­6Zmµ5*þám2:yZÆÏ¢kT¢©“Ç[nY¡Bs—€¦ï'KB”¡?¶û2 Ñ-ŠGË0ŒçíKKÖ•8 OhëûŽãzÞÁ[»œTsä䈢+€vfå½ókD@M=ÚJk9ÒQ;k-G7B²–CÝÅɶód§¦cÿü½óc›e¦w–-{̼s}ÙC²°.µ?k‚ËÔèùûgKiÀá1g‚EÓ@†*΢ÉN"r K0"•Ø•t¥‚ÎdÙˆ”?³—-¼‰O¢±7ÉyX9u®Ü¸J=8^†,é$Gö‹F²àæ¿_˜I¢2#§J\ŸðK·ÞâN£vAlìV´iFíÏgœKW§ ´L™ÍS²rB4¦wÚ—äm— •d£vîeÆ;W6ÐÈM ›”ºQ;q Ró΋lRn4¡ŒÚÛJÝ¢†f^p¥‚=†ã]'ó’ä‹m¥böè/\©XÝ:·ºÎ›ïÅ·>ÕÐI·Cülxà†à¿M)Žwþ')ùÑû]5‹Åäg<–Ú·¸GƒÞƒ}‡üFììÀ>û#:;+‰íáÓ"í)ÚÇ…DÕ¨ä·ê£öå.·l+™Oe¥‚ñ¶ªOçG¼I®_IØÞ+€ŠHhúñxAô›aƪ¤S;·; êÜ2k1\ÅËeÖ’ï±Î+J&C’‹Ê• ŠÇ§Ì;³÷uÈè ͼTºë¿~ï쩊pïL’ïZ½RQ¥J6"•Ÿ¹aŒH%ˆ^rïlT%ÕQ;÷&ÝÌ`ªp±›ì&]U5²B²ÈÀ?§"Xdܤ+YdPŒÚYJ[JnÔï/RÒFí \¥k‡9*bjT½Ü;’Q»`"IM#™…hFíô‚¢w^ðÊ%ö«'¥iÞ9v¥âQ;'€½ËöÎâIH¬TÅ©•˜ÏBdÞ¹¥Œ-”úV)c‰Þù»ÜäÂôÎÂó}-Y©í“5•&Xfn¥Y©(k`Jå×5,AěĮoúì „A©$;ÈKF¼‰Ï©¤/³bÚ…y7 £z™)µ" ƒwòšÊ·9só’aT,c_Vð¥bã à(GíôC7Åì›E²Ð¼³>È€¹#‰räxçqËIaœtûL©E#]î¡›Œw^:1à&gnj£ö¶Ž\jäïZG^}—g«›2Û:2˜\G^Ý:%Ûåó”­© öè˜cÞUîI—ãÛ[ò6ÆÅƒj”—ñüe¢¾ÐÍ‚K\ãRì8‹ÑZ—–ÑůãMtÏ«QOÖ]ï3Üê~‹„Ûw A¦nR‚ÒlR’õFrÜž¿I¹ám±V9ÙÑFܸn=ÓJ!™5¤”ÇŒDžó›‡Œd†Ç—#¹¾[piÔà9ŸÒ¯³hi÷w/z77j‰âæŠ&K™pûN™‚_0èê{y’Ðu;}!›¸ýB+fÒ«Oψ­Å}´¸OQÜ'0Û®ÝáÇ}~«kw ÎgÑzm&cŽ‚–Qͤ%[ m&MEgl¤Í¤…÷ÕfÒ"F_ .mJ²ð)CÄ‹øŒV/pÈÂséë§á8dMˆxÞÆÙV?7N©Cniø^fdŽñ4NÒõ¬±ƒ« >Ý5…Š+‰L&»eî(§vå÷ؽWcýŠJØÎ‚d?¯{ÄjÍêÓ¼v+ „æ6ˆâV@ž¥íwFm¸ÏZN{žG{¹œöw¯6ª‰žíT¹ã?^}+6tÒf-ûàoHöò˜C'ÙA‡ÙÐi¤e*æ)ÑGø}“1#š¬}NàùôGàžOG-ñ6¨5ÚaVÆ,ƒò2g#š¬½/)p6ÚaÖ×Zû’ÁÔ5OkI°^5 œ1J:…š¶å›—Y¾éNØ•ðÒbJ.¼à„,ÉON~ð=Žää$;dIrrR~% ðp*,é.p—–…É Õì:ÝyǶ»D J°»ä|D]ýÂÏ£ëJ“”o¶ïñR=<ãôZŒò”÷zÄ‹qéÁ$)&–èÁ«)&éÁä=8s ·Î–><ÝÈVéÃÖ( Æ:ÛøšÄb-Âñ5„8ŠóÉ+8ºx´:î#3Ná¸ýIL0VF)³ŽZhf^ùf;™v‹ê·¨vïêRk;7¾í¹q+šÕZämfÑXwuŸ÷4¡î?ÌÈn5¨ÎÊùµù¦)ȯ-™• òk ¨Mmfµ Žv#l†7Y«©ØÌ7‹Ü,˜ÈW{WN}ïD£]evWîô:GïRCKîSùÑ}tÚðßwL yFâv )/¥gD&iqÔ ß—²“ü’z¶Îr›4ð/ZåhZRˆszÁJøÓ^nOõhÚ´…'þJ¸dN/Xn„YžÅKõŽwR‰”-P Ñ¦¿ÉõÑ'* (övèC¢F/êo^êbg­ï¤ˆéå‚^X£AqЋ`gýiãÑ2m…I‡+šwH.äåoû Ö­óɺu›wÌÔ¯JK›wl5ïh'Fd[wXzÙ£-–®Ëü×â°ɉñ¶/÷`F9?¨ˆ³¢é ew‘C€ÃªKD-Y?Ë ¶˜Õ¼\!ÖY+@u.ºÁ4Q’{4ÔqVs4­¨ÅtMKê'P ÐHá^Îb””ê>ÕßKKФgq“ö³I;œýž:XÔ‚ ·é¾o‡›™Š]‡'¢ßf®„`ÃA=„FU£ªQ5þF»Ÿã{îþüù8ÝoØ¥ßÀ#Ü»CßSžÁp–V²ø 8,¯=<w¬ÇÇtT:jì3C“Žxf„­ç®›Ji¹Û¤Ý¤ý­¥ÝáE¸â¢Óá6Œ‰Ì÷¾£<2’"•«<²?QÕà,«*±Èh±ütA F³z²™È­C=YMmšÚˆÔæG×£«‚!\‡#¹¡$ý®=ʪ†Ã*D:7V"bÙÅ(%YÞ0•d\ôüEÃlümüýŽüEG…F^_ÿ|Âl(Ê{¶ßijûgž5J|`!_E > tFƒáëñÙï´Üõö´>v«¤I»Iû[HÛÉ.f¤vñŒ ~È¿š1£†ùjhRÃpüU“eúƒ%XcHZ€5(¦¿•5Á<ÂÇ`Äc‘ÔSî³x`$†ˆQ-z|Œ÷TQµøëVr7íiðiÒnÒ~Yi{O¶ V‰úñè‘ÒÔÊUM†{RhCtZ82R@KŒÒгüõ®ê1_N=J-*«¦ö"UÃG“½!4< '+à° Úl/B ×ÁÔdE{rhMmšÚ¨ÕƺªKú€"W¶üFjÔ²ù‡ƒ ¤븇c`˜ -£§Ë¦š.«¦ øMàMà¥À7y¸¹‘!ÁÙÖãéЙÿß÷ûó!û «íw¥·™wçÃâÃÜû6†ÛçÞ\Ê5ó…ï€ÁñÛR±Ä)Kü‹^Ã/*€Â{t%:Ƕ<ŒÉï3̱­ô¹5øÞX¸Œ|ÿï¼Þ¤‹mˆ#ªErú‘›y(}®™‘ŸsšˆPµD&5ó¡þñ˜šT@6SóPXL«±ˆ©“FâÅ"WKGúâ_ëP\ èbje²¬àø2`“e. Š’¦SÍSœ,É9GQƒ¿OY8–(úTWbäÅÌÂ]+ŽžR>5°M£ê]‘ “§HØA¥CϾE‡]#½jøÖŽoï%ÐÇø›"&ßÙ7ï*dò¤ ôÝl ï¨Pg …Ò¨™Æ\f ¥‹„º™“ænöµg18×QHc‰£b)×ÃX UÈcó6”É1·)Xæ¨58+°ö¬3¥’LÎH “eôZd•ÔXÆlçD9ÒM1;ðèf§LœÍlœ2ð•v(tðTÞ”ß|±«ëp‚Rµ2ÐÇž#(Ëf|ë¡¥ïDT <¦t.ƒAþž‹Ì=MdtøLÁ¢ì(Î%†¦_¢…×d @Ú+"ÇÂg"{ ”ïœzâ_~DôjEóôé«>\VH¼¤!Ò¹%^xoâjÑzBüjt!oçŒ §þs~z`5/ÿ>×þ)n:ä¯-Зë'_ÛÞ»Þ|䵿¯ÁÓô9ÖÖ&ìæÎYüfoqAÚþ©Œ^‚;^i²hÈÙÓÌYö“©Xšy%Ý+‹/Ä/¥{uæÎ˜ê;™×~äXk¾Â<“cß0µË3/1ÁœƒÈrwþ6V¾ù¼/…_^ùòHÈÞ”lw>k¼îëʇ“Î }Qû¢÷9òÚç äÙ“íúÜjóyí»Úª¤}ýèùÆ&íc¬v¢Ë;´É+äûex‹Ï¦¹d°ØéfëUÀŽ(™9³nºU{6`è…CUL€;áèµaŽëʲí×›p«ç§\#Æ9¢!åB4c³äáñ樈GÔ“BSßœ€qÑ„EÐ|#<Þ£&`MlRàB£#.2Ñš"ÊCÓ©_ÜD1 fo’­×°DÆêÍ…¥Ú:Ÿ¥fÊtÒ0ß4 ï2¤Xæuœ’cÊ™êT,õè_ç>Ûuq¥qÖYCP~NiÌÕB™Ñ:õS Ìh-O°ñÍnÇŸæÄNwà ý\ª‰]Õ°Æ9hŠ‘ßâÍ:Í„›*¾ßš˜Í/³hÁLgÃe(“Îa…ŠËÄûGP2ÅçÀgS™€3}B¸³™WÌt"A!#sp9WŠg€Â>û ÿ× vÿúç÷÷{÷^{²ßQJÕžÀaNI½É踅DOö;-ã“ýNÇûÄ85›¤š¤žIRÎ×ΟÝír¸7,Eømx̬‘ü Û?:g¢…€¿ÍÈ\ ãx=UpìkªŒE-@U“ö+HÛ[;|‡'_dúb.je Q @±ZÓ 4( ʆPgqøúߘ¿ðÝ%>€_¾Ö´©DjaÜa!Lã1ö*v©aXÏ©†qÃUB= óÇžJ8ÖÃ@ÔØðF¡@otJhy£Vdè¹›14chÆÐŒa%c?}¶Uó~ø¯ŒàYùµ‘”ª¾ûj°QÕ·¯GËêÃ-]ý˜&5{FI©ØÚ”‚<<Œ¤g†UéÙ³ß-¡}7Ó´¯i_Ó¾¦}FûÆÎ:lø÷ù¿†g0. ½¶‹òúîë° *¬ ’4õo1M:öX0zöìwjöãP-{0TÏž¦}Mûšö5íû ´»æÿ¾þ?ø Ùp~;<Ü÷õôùèŽ[&~“/d¯„SÃÂÀhb“ÙBFâ\ôS…𚀓B‡•°"Ëa0 ˆÛ&ÙY@u ǘRÜPÈé¬H- :HTS¦:Mušê4ÕyrÕÁAÑÏ_‡$~€…ŒÃ×?·à+ÄT·;°ËAÅ"¤6}¤†Ma¥‡q‹ÈÃÈRÁpd©aÜl+- ;œTÂ莘òD Àù¢ÆÃ¦4Z@‘mhµ"cÀf Íš14cxc0ƒþ, Ë*·wÓ¦æ(¾¦¾ŒÀ0ëF`äu×nåMAPF…”¢'È®—© ò`Ô\njÓÔ¦©MS›o­6®{„©t‡3êàëùð!õÁýc^cÊE(0>S ã â3õ0L›ëSæžÐÂ8ÂÙS=Œ—%D ÃFyªaŒZ£áµF ãë1kä 4²F£„Í šA5ƒjõ<åF0•†±‚tß™ã;$#)•©—hP”¥AiP”åï€b‡§Ãí9>†ŠÔ'˜+EP/~‚I°…Op^¡†4°W Ñq¥ñ·ñ÷¥ø;®p¢çô²ñI¹²˜uÖy/mwRÑBÁaÝÛ|ô'’æI¤FR#©‘ÔHj$5’þz’‚uíÎ';p?ìâÍøépôn?–šWÀx?^•T…\¾&ZÄ(¥$¨€©ì…”¥"¢h!• >üLç 9R• îì­ZGDéä訜J)!AË\Ï`Ìþ±ƒ¢ƒƒƒƒƒƒƒ¿-ƒ§C¯ÐÌ×?_Ç|õ×VbKä:‰a.µN¢`퓨1I\#Å cœÔ¸FCMŠ.§ÆÖ€á½ŠWcà«ø&ÀÑðÙÍ¡´|ŽòñÈ1ƒtÎÊE(‚åC1Œ`mKÃ-ü©a|Þ"²¤0B²40†Üªößçãbܹϊ¼¶{f ’ÖžyŠtø 5>»»»˜»ÃÈž\9‚+<Áßs.Å`ôý?óßý럇ù{×ΙÕf•à ¦ Úìû~'ª6­„ûzÊ&)%¥”…ÌÑPfàHUrLÖRfoÔRSf¨ÒˆÚWÊi Ås$”æh•¸™g3ÏfžÍ<›y6ólæÙ̳™gÅhV䶆ºtÒÅðë׿÷Gwx˜?¶áñU.×y¡Jê+ä:gVIU0RJ²DÉÑ2Š,¥$*•Êu.AËà£d0¾²ÇÕÔr2ƒêäŽÞKÉà$Q"´€(5ƒ=è ËÕÜÜÜÜÜÜÜ<­Ÿ{Ï&P žÛvòUR⃚¤*© 6M9«J‰( %Ç蘦˜’QÁÁÁÁÁÁÁÁÁÁk3øÇñíípìÏŸÉ„›“¯°¡ð8< wÖñí3“ø³R'Q,J‚K¬“¨›6Ü:‰qÖm1fc~j5®(ކš9:*>Û(=Ÿ“èð1³'Áµ|¶©ïô|Κ3kz>7ëlÖÙ¬³Yg³ÎfÍ:›u®jðçp(íØerí‡_‘(Ø’€ÇS½Bº8L‰XÒÅ5B³,Ó2„0:„R©³…`eòsš€‘"dz±ÒÍG‹‚Y¡”þ ²·¹©Êè!ØÓÔú‰¹âHjŽ«9®æ¸šãjŽ«9®gv\?`þ;ȇ=€[õë1*É’ž-ŸþB¡”Ï”6³†MæaÓ°iØ4l6 ›†MÃfl†îw¸Uv¿;_àØ-„×Ù¸‰¯°DÞáJù1}Lœ†¾^>SÚ öYå6 ›†MæaÓ°iØ4l6 ›?ƒM<ª6cjX˶·FþüŠ.Dˆ¾ý{‡ùÝü=ž³¥lzfD ÜÉaÖIÔˆ°Pã¾ãö€‚W#‹ 3‹œWƒ¥Ôd±aáqj­Áô;z­‰°Qñ2«iµæ Òøèµæçô&1ffB¯Öš96R̼ßRñ}¨Zk2rjZÓ´¦iMÓš¦5Mk^RkÆÅ®?Á;PÎG{WÀ‡». KýÆ›Š%H¿ÍhM CúPüm†  P…7Ù¨©²—Dh©2æ´_š´_UÚñŠ\rú°wXÃ>¤È=nñ• °áRæ£7Ó’qúårÙ|IÌS,Ä Îw,Å *‰¼Y€.£ÃKÐè,A×<©´ª¿`^I—=ÿ§¥Ëî^ké¡èèS¬«èŠlSAWp[C¢£§k¿kÞ,¼Yx³ðfá/eáÉ«a`Åñ'ÌJ]ÎÕcøÜÿêËÅ‚»ð|æYFéb³œ¼2xŒž1Áý :F‡û~xvBŘ[,p <Ü#Skà°¤dôxE… ^ân ¼fšÍ4›i6Ól¦ù=MóÇüЫM›‰U†`þ0)æ1|ž/†FE)X,? 6œ*†W ŠA’ÔÆ˜Æ˜Æ˜Æ˜Æ˜Æ˜Æ˜Æ˜Õ3Í>Ç·Ë'äÄ…¹›M"8ÍBîò Ãç¹r˜Ü†T²XÒÀ°Ûž—qk¨ñåÆ<”*þìw*j|9/+%`…Y)mÌ­¤—ö4c¨â~·„´Çœ¬:þØ­½5Ì2}Š Ú±MÚMÚMÚMÚMÚ/*íëg˜þ½½‡ùê®Ó‚™¼v×%]Þ°¡•«”‚5FF«¹RQŽF94‹#ãBªG4\)Wò3¥èù%ETA3بù[ÈíÉ„f®–-·lšË‚©“Ö4A­l>-a †¨%¬“³YC³†f ÍÖ²†ÙøjX[‹îþ›dD‹žå‹Õ Á±1B±j!wû V” N Ë#£‚ßî(…5ðE+^Ûm"j"j"j"j"j"ú+D4 }É­L¥ág6½U¥F2Ö‹• M2d aa"ýD!w U ËóE u·‰¨‰¨‰¨‰¨‰¨‰¨‰hy͆H°Òc'ó×Ô ~AP=Œ¬¢4<.y¡d¹Ü,1¢ b)]¢]>”S3ŸPQãÊ%ÓEñ!ŽGKtüASÐó'â±b.M(â˜xJÅËãf Íš54khÖЬáOZC4¶;½Gɤ.A¾4éÌ/§d»Ó¢ûµ P¦ðSÀƒÓjªlº;5UMÜqG†tîçO0¡ã)Ê cOUøü1³÷Ä·˜)G\{x›Ï°Äƒ ±3 Ðåra)éÂà™èJd’``”ÒÆé¼^ÚQ&, ]“|–RÌК´›´›´›´¹Òž,I^ qgÉ=þ&ß’ßÍ“®È ÂÐ\O*;ŽªQ9%Á»!Œ Ÿ!=Ž;1Tãä1Ràƒ:¬Ç'Îj#ħYB³„f ßÏ’}ÝÀ4fK€µ'ñ–üÎEO jFïl-5>é,l¨ž(%>a >#Q|Тôø„‘ˆb|‹Òác•FO³„f ;£%LúºÃΈá yp~ÜÈÉŸ5ÿH¼¦¾l¤uƒ—óƒò2¤l:" Aø¨Ò„/ŒšË` Z‚ÂÔ:.Ûf=—ÁݨÕ"½–PðZ ¨M˜8J…T3ÎfœÍ871ÎDþóïØgŽ ÷]ö”»yÅyéX˜u/좋èÅì̳ X&9 ˜±=k‚ÓûJ`ñá}1°T^>°ý®±¦±¦±æ²fÖe˜.ÓtÃ$,<Ù3žÛ8Nôs|S)La¡€‡„üž'Îé …$) Y@Ú–5MÚMÚMÚßAÚ3¯ßãMçGí{Ç8 'Ái†¿a=·ñŽzH>ÂP ÉNUÕì&¯’Í­†„"×CBQé!ù3ƒJH64µéMÓ›¦7‹èÍ8v3éà*RSúûå|Ê1`íw˜7ùŽñ•]köÆLé4X4ªUªFU£jªæsè‚ ÷qàßÿšñÀðæÜá«ÇéýמےԌþîwZøw¿k¸q©(Ëé~v£–îÐßO×Ã'˜Ìuºý{:tã B³.=¬_ÁD¯:êÈkɯ5ûé5t à;+AÀžÄÉ:«Æ˜—eÌ´“ÂË"á•馎ïnu÷rÄ ئ„% ®ø —ºˆe³¿PNz8ûƒ§Áù3p~\q÷ös2“ëa%æ|xíÞnÿ…¼c§+ïŸ1.fg„l–X玴хYVõøï“¨?MÒZP~\?·kpðõ²§Ã‘Ó7#i9(æ\ß¿+A«éËép…­áÓµú€¡•üKàtÀ8ÏV—÷&dlžåù7àòÞ`Þ“¯‹Kò•×ûºBIëIïéRû]TN@œÈ9ßîÙÊ—!©Ûµð Ò”Þ¿ámåþ©#ˆ%×áßPÖÑÓœOÇ£Jï¼VæŽ×Ð×¼ŸV”Sù[ˆÛÝü½‡ã°«»ïGxõ…ާÖw ‰Wcþ„4}3`~cvúð‡aö@Ë é1“½óÇáëßßÿ™"¿Ìßã[ý#!>(ŠýÎ cÜ¿ãTœ0>lŠ5á瀿N;ºZzK7Àa×üŽø Ö`ø| w,»ð‡éóχ‹_Íÿÿûçá÷õÝüûé“L‘gm8çÁDwÀºðÇÕŽÐ*1ÅÆõ>ÀIÇþ\,T/b“©á¿ó—Ù5ðœán”­vŽö~3æè·Q¢Rã0jE` ¨Áÿ0ý](¼qµ?Üëa–öÞá2¿±æÚ‚r¿aOá·k-S„R` ©Á Âˆ/Xîãõä@†`·æ9د…w`D”„ =ƒý¼é;08¡o™ì]`kæð÷x¸=l:ëÿ`Êx{\»É+ÿâØçÞ UÀ³+M_cØ•æUEÏFÑ^x…¼_!æb7o¬J~¢·ü ËL7ô–¸âÔ}?f^1½·°büzJQEÿæŠ/°‹ãVš¿€Û±Ø•æUl‡«¦ÊF¡ Ð8¾åð("9T5ݶ¼òø–Ñh•Qk1[$nÑ™¿ïnIÆ®Á¦Ýû Ç7ôÂà?OÜ~ò8ö›ëÿÙÕf/ö;Q5ìD‚çFu¸URìp„U%Á‚ýNIÍO×銨 @wüKèÿ‰2šV _‚5«†aP3yëôõç—¿Xïݯ@ÙK§«f8`f;Wœ&ÙÛí< JAV=Û¼½óÓµÙ ˆüT›Vr¹kÕ®™ç¾B‚ªZ•T˜¨j¨±ï0H\C}ao+®TñÊ“}‰%«š—«j¬5Ne‡Ô½ÖÃŽû»‘ÊÂ?œaÁ„þ—Ÿbáâøl×Òüýg0mK½r±×”U ßÚE½ê5ûf˜Â ªå˜Ã­6¥ÎvSôª™ö9"¦x%³¯ÁûÕE‘­î_Ê‚¢º=ºôLuPó¯` 1\móþï§ŸÑ¥º~Ö’{ØÄ{ïg‹±éç.Wƒ±ÈkÇéµÆÊ { r¼ßú$üE{ ,Ž^;Ï\ûpžì`Ÿ'¾£?œ?÷»`Á\ùñ‰B"º(Ôê|É•³sø§r;™VÂÕB~µY%3_àUKÓ ®†ÝvâAGÄž«ýîšå?UN¦\Ìc1Ä1˜/.É„ˆëGÓ’Ó¾øöGŒ}ñÉFïwgÜÓ´û¯ rË4:þ8_Ò…ìøæ—­‰ë»˜€ZQÿDâ]3t%«$+ŒÁoä*© fV§dË- T’•åð5ƒJ_ÜðË£Ã2¼©#Á2Zœ)6Îÿíj˜þ»(Œqîo·êàÿÏßAôœigü¦¦…ÐG/lö>y}ÿnÃÕÔÿ„Œ#Ÿ8îcVITHÎy­«Cµ#ȶ9’↦%àÀJÝpð"H>œ˜[†3|ÙÎ ÁAÅ9¿˜p¬æUáLÄmžôKkÞ5oRA¤‡xs7½B® ‡Ï§$6}{¼Œ}üŒB¡þø¹{šv#$,H• Ò Ï§Å¹ a^—Ä“¯… Ì:HÜ8ŒK‰›© YeúÁÆ jâ |R|Y-ž/Ã7Ž‚E3l3$xû|@®J{•nÿŽ“vM©;ø¥!˜øVâ°8዇òd‚4’dq.H€“Ä“r4ª×Bf$Ì8&¥$ˆ™q,JŒx`àyµaÑšb@‹1µx>®{3)H ÚѼíB/^™úëã Ü Ù—?5 O\Kcy¿„Ô¤J†kÜIJ®Í8XÁ¸‚mråp=K ¶é!ÁDU!g_~8rC•sCXlæjL’]³ÎS1:ƒ\´o–Æ$Ê_q~¹0‡“íP[qpêÔL¼fÞèÏöÌSoU„ÛÕG3â˜ÿn÷îl¾õïáólàö³ç†Ç̉ò$_Ã>¯€0I5}.í•1±-Âw¸ ˆˆNðü¡ˆªQe<=49D\öÑw#(áŒìüo̯ðÝÕŽEìÛ÷o4(p—Ê¿c-—a… %Ëï‡Ý”Uâb/ŸPãr·çò´¸Ø£gb(á;rÆl}Ö¶ £c·>mÛ†²[Ÿµbc´>k;Ð@NëSÀýŸX $:0h —‘ßIc+êÞ"(Çð—ñ¤JË\ŠF_Ü;ãÖEúR" òTåé¥B™faø9„T÷áwköø¨ w| Þ@;ãQÂ+†˜ñ—ùÓ¿%ØêvïǾé/aŽÀ>·ç9DŒÏñ2!)cû#à j5XÀÖÀezl“ñÑÒJ£Ù&ýÑR%§§¢âóÆåñâ‹7%\tY" 4¢Ê4‰~BoU2|N‡Œ2C?ÓeŽ"hãi¾UMЉÈŒü…Ð æ'˜'u<°Ð߯]æï[ðÜüø}wKHð{#ˆ.sCÿÇà0ˆÚ÷I¡øDí£Ë0ˆÚOµ¦aµG)Ê8{dˆæšœ\Ã'æ´BTÞTètGÑyâM‹cPÕ&V•j²¦Æ£L8þ«*øFþdè}À×?u³gyúà;(2$ÑLd[ŽÊ‡ÏñÇp&ÿþ =$Ù¼R@ôï¾þ:¿`èF‚‘AÃ!z  üV ‘KeÀDÖ„ˆ&Œ"å¶œl×QÅh9Ù.PÅl9Ñ®AF«ydµ©‹Ü®µiEÎR›,ùûHÙèjÃ4WHf`ØvÐxc4–I1½*Npj„Ì´8•É"ãé±§A{8ùïxÇ»ðÄÜ<®Qž<‰fݳW€ãÈ’SˆÕ»wQÁ› ÙN€8šÙUׇ5a6šƒeÓ¢âæxZTòpx¨øœ%ZTˆpr5£z0bP‡Cª׃ñ‰ ƒ$A͸}œ¼:À:Œ%œn".! 8YÌ!–ו7‰çYÀc@dØp¨spÊeµbâ„[^5½‹{ ñØï¸¢µß}ÂÛÎõ@éL<ásX3 çXá]Ç= @oµ1œé…×ßÒ€$±ð8à‚…‹‡DC1°‡0WbH™ƒž*Vãó¦­È¹Ïš–ºXÏšþKÆ}Xˆ–ëÝÐ4®àÉõÎCĺî-ph1͉èÄ*ù²èôÓ^d<+ßßqÅ :óÅÒAaÆmŸòê-xc7òý»ß‚m|à?—¸aÀê`P¯«¹arj0ƒ•c1àà3™ ±“‡©°È¡Ô›Ö2#.~㳦‡f½¨i1¸( ¿ñYÓ¡4»(¤6ç×»·ˆ“åeÐF±mp‚N €o¯†NЕØÍ@uå2Nôá?%ÁnÅÇ`Í3ÚãV¾çB ü;Œ€ Ï}¡Ü0·FŠàu»"¤ לŸ,U<|â,…r|òT±ðqqSTHs)}ùD|J)!$wa _sÈ™(ÃÂC 3A °8¬Ã½AÖ0-(д>. ¤œ+PÓt Z®äøKÅbä'Ú¥ …üUK ©*A!rÊÛ =°ŠÔ×Ð1+yÐɼè2ܤNƒ.phj¿£›ž«)V›Tr ?¹Õâç˜Ã”_mR) “2Š˜!Á,9C:KüäU eɃ\ieYwüùÓåOMf4eƒ,”hKã»+ ý0Àþ?´¥|®O:”ÎÿÚïB¨b˜¸¡†‚óÁ71fp;É5f8¸OrÓõy*¡1C(LMSB)`†ý‰Â¾Yx¥˜á‚†R{„¢·¹ö¾œ to”c³ïl“®Ôn‹„#¿hÉ"Ž÷-x~|‹Ó ÃÊÊÝ®¬Üû72€!Ùm  “Akè4t: :¸ü>8þitžŒ;O†Na>è²Ï“g‡ÏÍSù¹w×ðÀÀ˜È<Ð  …‰¶èجßJtpL°:6©`C§¡ÓÐYî-püÓè<wž ÜŠûÇp/Á$eù[ðÜÞ6p__ñ5L áµÁìL€³ßAÑ2œ °KÌ£(@PgŠ ¬¤“xX¼  k€q}UR˄Ɣú"!‹àÔ îtPi¡NŒ ÆðªµÇš§ä€ 9ŒË]bW3À¯†Ði!JT¸œîm ç=Ø‚ºˆÎì¦ ¡brý´gy8*- ÌS¥…À‡s È5¾h¢?<ÎáµÇ|o&´ð˼…K·*€À[]*ƒ»7khÖ0ââeG(ï;¿5`wzðçLnØb· Þ±g5O®³ô‰é(fׄ½…ï:Ìxý[ ‰‚ÎûnþZ,ƒâ¸0(Ìuq0]M:ö~—G”Ê•¥eÀvWÝ1ù9eÀðù9‡ ÇŽØüœƒÊ\¼Ç»Ð|~Î`Û=.?g CPˆÝe}šÑ„&¡ Ö˜‘etFk‘ãVˆö)f\ª©1£?è=mpê½yÏ×÷ž¶{ï¾þýÁî |Ì:ø“½T¯S ©^Ü<Á ?ºK|(v^à:-Yd !W€(8·¬!Ïz@Ø?é2 Ö,ȲF È /ò?ºB9К FVkÔ€¼ÖTùöÁë†Ú.!ýçþ9ÙRÝá~ºHW§ùï˜ì?.]Å~ïŽ9ØCª tìþ]ôIk·ÑÔhj45šM¦%hŠ/„`wß•¦W”Ó+Ò4]Yýú'šwaB 3Ì^bû5¹ 1]'Ì·/«bðÕP@бìa¡оؘ¿A•Gì±áêS 3 °Ì§¡vg)‘†Ð‹e@ o4ÌÛ§®såkRxE2“1!v%K-ôé¥B û„†YcI7khÖðÍ­!º29Ú5khÖÀ±†Úæ3]rwš|nÍÜBÞ5 ;@ÃsýÞÒì…¹1ØhŸyžlÌÝþÁ¤a ´vu*¨¿ï…Gì1CŸ†‹Œ)¢ø4dDŤa4%*&eXÌe˜qÍš54kXÖ¢«ÄC\»f Í8Ö8,çΊ—›—§ Å׿_»,¬’eî怅IÌ£ë(-–ÚK^^N#¤p4—?ž Xˆ±wo‰¹Î$%"$|á.½—¶‡ê'´ÿŠ·>ˉګ\92Î75ä<<6ú¾ÁèÈ©¨1 Ë`)ì‚ÿ˜áØáëE'?:ówŸãª]æVôÌÅéáíêÃW€s<‡EpýÆd-–Ú³—§Ê( áúëåµ |™”„í¡¬„”Uð —FÖ–Ž`ó—MIÐÞT9”píµ2J‚çQmvkØ Yc•€(6%ÃW3TÒÛå¨ÂY㾜’ =·õ±”]ê8dãE…”,j—åêd=lçh|°Î.c¸ü^ª{ËõRЫoi—kõRƒDlŸ©´ËŸF烥½TZ·ÖQh{)duƒs†7aÝ`%¬»ÁøÊ€˜«7hVκƒb‡ë¹q Í»»7“B®ˆ¢ïC½ýê-<]‰ç d<i±Ô, J) à”ALÉïˆ()%A{QlJÂ*ÃÁ ‡F:Ü FBIXoÕRÂÅ錒©¬„”DíÙðU5‡ÌÄLLIйÎ.GDé8ä’?ˆ(iž«y®2%î,à\·ºæ¹šçÒz.»’õùõ,e}Ú–Ž}ýkY~¬áí_ÿœ.¸jöõ/üõÓEÄCªSP@Ž?¼K•âñ1GŒ È÷ßý:W‘Þ+L5`ϤÞÌÆû©™M'¶ãâT,ðû]…u4Ê`¡MÄÔ¸a{Ê'Ë:2xXÛ¯*2L¬§ ·© l¢:BÊ W‚mS/ÕÕ½ >¥:ÊV7qx»ïÁsQ ʶ2qx/'%e›š8|`âʶ6ñ"x¯F™=µ˜¤¬ûc&ž¿ÐP€ÑW/kâ)ð¡Ë)ƒå-Þ(dYÁ'7Y”…ñh¼ÈÃÑpCƬ3–3’Á¶l\Ä&{K§-›—Î4ƒbB´*@¼A¼Þjà$K› ¬_¹˜hãŠØb™I‡@,å4xR€ÕLŽ4€€ 1¥_`P£8>Y¡NqFcâÊ96µßã†`ø<áj\kñ ¦¢¡ÛL}ênÿüøæß¸„ï¹r68¼1ÃïÇ.j¾—[¢´£µiKÆ!Óp`ã@ˆCÐî„—[¢´}.«EZqIŠÃX ¶’Í´3Ü7ÀçjD«=#)Ã!ÀÀ^8 Õb””^‹ÑªÐâXâr~{«Òiñ̪dZŒë†z-þÞ£ Ò HæB-NË\Äï¼'eÑŠ2Wj±½ôB­ÅðÜæ˜Vi1|‡C]Z-Ž5P¬Å¿í•gj-ïñPúACT¥%wÓJŠÖnø…çÔZœ÷¤LZÇ iT~©Rkñ qmßgd®×âЪZìG:-ÆÔG hqà¹2å&SÜq |úÂTó§̪q·2ÕàÞTÜX±éííSÜ{ž§‹`¶|¿‘s‡îë± ŠÑàÃEµ™æðq—*ñµ†Ûr¢ˆ¿ AIÞš[â28µ)âiTÄ‹[KY (efê ×–±ÍVSæ¯QR†k‡:;øåNj¹¸’²QPZx~(p9e¸@ûG,<.p evg>ï×¶ð)ü´Àù” ¨ Leá|{Ï“¸_±w ‚ -­ãS†á.J;ÀU“U{L–̬=)í`«“JÙòv°T™)¾ñº`N~>Æû€OoáÉ¿3…‚ËŒÁWƒýXÈLŸs-pàCÈÖØ‚‘L½åPÜ9ᵜ‚ÓŽïˆðÝ…ÍjÊ̼CÂÓ |w·¶Ž2ôÉx”+´e„¯i>ÂÑSfo WSæGKÙ 8:ÊÆ{ÐU”YªÔ”S×we ò%|ÂY€²©I)[Ïw‰(sÝŒ’²•}2T²¦)ëþ”ïbÀ÷¾‹Õ¯Ìe¶•ï"Â}—‚²-}W¾-ô}>:4ß.ó“Šcîøë¿áÿü÷É|?O^ÍK{W r&Àj¨+h¿» (©\ /6”jæ2}g³ôI‘P€Ó'd$òÍØ0Sãf`П¤–Eë~§BÂ7ƒ15*Û›,ɦimZÜ´¸iqÓâ¦ÅJ->zoZÜ´ø[h1ГùÞ.ï‡.›B­Û—Söëð´‡kàa12x™*gÆè¦àWs‡bîëñèÚ±‰NK-‘Ú£X™–Þ Xxpm^Ž…oÇf}+¶DiÇægæñ5A-îØÊ±¾Bö`¦tSíØDã"¾†í`ö8žtÐ÷;®\š—ò5(eXÌ•n’Z•΢ ˜ÝcRë2x. _'Ô:¢´º [UO5i'¶±,Öè²µµ.ƒþ©|Ä-òêj]^¿w`Q;ªŽJ—­°Ôºl#*Ôºì±áòµ/Zçù)z­.ÛXµ.Ã’æ½Zo òþî}ª{‡`¨¤ÑåÉp”©Ë~,lo€ŠFðLŒËÅ·qùgðô o‚ýœ°˜µ–aýú|5D¦±«ûùfh¸½†ÛñÂÇ`|jæ0b ‚Fð >“› \JÍÉw=Ø„íI\n. 492 )A!·—(RÛE•æbý•ƒ }”“PmƒFŒZi¬œDj›”’ѶgQ*µ™ÚFdËÔøß¾w6Jë £·4Ö98b£m* µu°NÓï.aÖ«­SãÒO%—þ.aôØÙé½K'X§5qµu±넌‰K¸ºÅ÷ ³ïÎ÷ S.ÁPV'%,i¢ií—¸蟊KþÂE©ÿt­gü—K¸±Îl?Á¥”þ ¸K\Ì%Ûã©u9ìñ\š÷¿".åú_.—&=ž”KÉÍ%ãq ŒÞX×ËØ+ ´cÁÿQÚ?=N/çÒÜ‹¸”é¹\Â-hý¸Ö^Æ¢ $°rÉŽ*”c‰7–s©âq¨\ÊcÃÃr2Ær)ã¹\²—èÚ™ÛÍî\ã"—›Þýï× ×Å~™©Ü ©>æ¡“÷›‹€¸ãfuwøýóË^¼6šþêÊúû÷FDÒ_qc=Ý>Åëáè­æÚn\ô­žDˆA¨€ŒbSlè숞âuK"vÄ_±§RÊé'®òªå„ØÙ7„Š#bGÄŒ9b6 9‰Ùá"gÇSÉ)lÓeC‘û+Û&Z¦ˆ^N™6Ý%±uë”HN¸€r•¿²[Jº~Å5÷»jåb£3P¨ü•eF b)løˆaÌ Ê_E¸­ëìèŸUNØ&^C ñWá€Mѯ¬,'#ÅeýÀÏÓ$îWþœJ"HMjì')0‰éî6^á4yÖÝ/¦æwãÍ¿Ãã—}~ÿ•yúø…‡ýDiˆ¸ §¿bãü›Þj®ÍýŽÞê©Pƒ9jrÄ, ;bè 84vDmzšìˆó<ÖÈé—ƒ#bGŽ€“†€;"vLƒÚurJ`ÃaGøb‰d숾â\U-§_0WUË °‘²#jÈ ¤þê”ÃFŽX„BN*5à"gÇSÉ)l°Ñù«_v¤êWþ¨œ2mΨý•i(îçØNNÀå¥äVYJý É´Ú+ifÄõ#6:†%JGZ˜KaÃGìüf¦’àÌ‘Óò?;1?.wH& 5‡Û£7?†‡·Ï¯oæá刿þƒœj·–þ_÷€øºGòyþ«/{ Û´ ¦Ýàë1Ól¦Q†Ülú+œ“«—ª¢ËÄrŽ _!õ¢œ#Ã׌„##?`ÛOÌ‘á)lûÉ92|µÈH92GFÄÿÂÖ©Ô×Qª/6 Ê'æÈXÖ&ìrdüj÷®Õ )Gð6õ¶Œ#A£#U|ލ¡ÓÒ Ë¸œ# ¬æðL5ɾ_zt)j(r•;OhŽØyö éi šÃB-Ͷ©f™Ãó«¹±µÂX€…ZÀóJûœã%]PÆŽ·ÔÒò`ô#%eç;×cyWó#¥¡QÈn®ë|±¬‘”²óů8Õ Ëi•]Í|ÈűÕã»øtïýpÃHù|ïŽæ× ‚½à×~Á¦ þú‰[1¿áëä)Û&EÒ¥/~l.þj·åáÇ‘Øp²YÂi8jÖÿƒ*•#¢‡`t|±Ûj¾Ø=M5_à8b%_à+,Ø)ùrÀÍ5_,5_\–/.òFËlÖîÔjør³»Øj¾Ø;Ô|ùmÁhùòÓn†kùr·×hù‚_íeZj3¼±˜/7kj¾@³ÐÛ)ù2xc½™;§®áKŽÅL¾¢OÌ—?îþ¦ Ìz_’N”Í(eÿ„ûK6›A§Ê—¸YU²á·çwyqÌÑ‘ ›2ý/½pp¢P眬˜Ý`äåÃÉDÿ+BÏ N60s’ùÎÇJéÒ?pº3lu]ð£¿`ïП?Ç­ nøà.Rúiâ+†¼Œ¥ÑvÇͨä×c7o77éÍfu`rÍ’qöÌ$, Ê)K@6C¥Œ%AK3îpXàÁR ˆkØ&•°d|ê6ûe,¾;Èq…{ý q!9K|K8³dh¦tìbD´lµXÃ’á+d_’³d,„P§Á¿(:q9Kt>}V(aßÜö-êoþ€O':¸†[Ærqó"WvÁ.A4“%×i£AWÐì‘‹[ìFÅâŠÜ¨ÜEnTîÀ,u<ñ\Òþæ}º¶ v&¥ì‚·ðé8o½ ·„̼BÊ:Œ,3óœµÀÆNç"ðŒ?”µGü¡ääiúëXv¿RÇ&Ó_m.‚xÿtH#Al6×è~7iV†Û˜ñCÀ’· Ÿ%ãS·Þ+dÉðÕÞò eÉÐÆ’³dh Ï©‰Yâ[²PÄ,ñ ±ñd* Rl(5¾-–³dø #`IƤÄârɵâòÖd,¾bf1Kb“Òipg÷èuì* Uúôr¡0‰˜B\ÖûIYâÁŽBçÓ^KÒß`¨§NƒCW¬í‚ñ°¯Þ§Û“æB–Œ¸Ù¨\µ¸þ€O¿Ò|úQ!.ãFµ£ëF—ð鱨t>]?ˆœy?nÏâÓ‰‡„[j˜$ÀÍ#£óé Wl÷[¾þ‡©õÍ_3qØ2¸áÕüíχó¦··)îÝÜAƼ~w(ùÓ%€4e¿~º\©ç“ï6õá´NàF„rß]Ú¼/GŠ@TÞ^®ÎB U&›YT鈂-dQ%#ê‘ EF$ª›Í‡BjQ—‡Œ$Ô¢veK-*0°¤¨˜ê#„9ã$ê#ú=DõmEªÄf+QÕÅH'­£h>½ùôgtͧÿQQ]É¢:~GÑ|ú·ÕßîÓÍ$ïzxtÆ OpËÏép‚@Ôîº}à-Åø¿ýÜì¢ÀÉ?1U…â"ïóò¸”™¯AjæòôÙ"û]W*Ð ²@3R®å!Wƒòˆ^TÆÕH¹š×<™¨æš×‡…ÎD ,ÍËbêØ«Ü—'åêhýÆ Àþû‹Â”N#MSzŒÖ¤0%d°Þ”½)%u¯y½?äõŠFÿx½Áì¿þ¹ÄP†Ë8áM‚”‚çY½I-{¯aªxwY#µ^¦XÀ`*þ)ð ÿøàK {ÐxõRÅðÚR5{Æ+T5ìqº§d“H¼1õqÁ¼@L)ì­ÛӲljIÉž©˜ÆñEägι+mNAïW<§ïÐ9A ÆU{ŽÜ^ ï(«{jPCüFïrS6˜Ž€wTp{Tîýp핎Eñ=£bPã^3CKæMͯK“p;s?—Ûé‹ÅØ,ÊÞÊU1o*‹ÌKi“Ëš·Ú&m|‚Ö&™æ]~¿ß)m2v[dP}”ͧëãu¶r[9P“;O¥Ü^Ím‰@¥=ņn+µß•ðÎMcΰô™º ÄÔ9Ãùelÿö•ºñâ\€³÷—àtù·xso©Z+v_ Ç(q_Z+àÔUÜåÀ©byu w-ÛÅ(á]ƒ˜+8š]€»0ëÐs7XSÐp7œ¼Èጠw¡»d£…ƒÓf%wýTJÉÝ`¤àîÉúa-wíŒW ç£"í#ÙB€&-w­k¹{¶ûºZîn‡ïÇö;wœÄ=g'»¾Lý¾ßÙûqOw(q)æÏ‹@émŒ4Ù S-‹)˜‚˜CkC¡puh#}e[þÉ{ÅØòŸÞêÄáÇÚPX\ÛïÃQXU &Uá™b?Ö"äê_î«>ŠPŽÍW½¸¯šMèÝôÀ¼?ß“Y‘M)¼~Õ¿ÿw’|9še(ÀÀA˜`Vh…ÚÆê`Þ« ÛH&­§ñUf†j”ÞÇÕÁðø´1ò†ÏW˜ªÑN”Ü&–#ækІͣº:ª¦§Óº,=˜Õäå|ÙéÀtU0LÙÍnP’™LR†ûLt6±8•iYÞ¨\Vf6[ïúC2ëg Ð(,¤ÓŸâ†|÷›[ðv0NðlR€ÖtÍ6BFJuU4í2›S4aÑG㙾a€-²!¥ºNì>©µRìAJaØ}öq­Øqš)4± ¸éO ãx²™Ù¥&06ËÌzÕɪßépc`iõF`E1–Ñu4v&±´Ù–õB'+NWWµÌ᪡uõ†!óÄM8™Kô&eÔO)dÎÑ›ùŽz×»¤vA²eŸùÎ6j-\[¿Žmf“:Ìó0àV£ù gŸ‰"dT“Æ’‡#ª± ÈÍö¾Ff¡Ç™0%²²„Òdq„CKȉÃÈ,ŠavO¡¬Ï¹ª|}Læ¨èã2W.ìÐQ(„} G´baޏ‹®v–Å|}L¤ó'éb:gé\»7‘ß°pTÂö>TèÅ襬I@h(Î8,ó=“œÄ ó9²±„³™H›zéäZJ§qB>0+ŸgŠ \ßAnH}ìÊ45ièýÐãß°¡8ñdó¸t¸2¸9Þ#M®)×ÒÙ¶â“\Õ¸”Ê 6EžÀtèéÈgÚïRlg3ÝÈÉÂ;´ŽÎŒTú6ÊÄâ&aâî vëiMùLCÓÌv"pxþL«2pfq•YÎaiÕ%ÈTÊQ—3¢=ªK:Ý3W]ì×p¾!R nÌ[™Öuÿ)ê5› Îã„W¥3 FGSS]EmVY6%[{nW“im³j¾Nprõ>†>óg& tŪGn¹ô'³ÓˆŠl3 Máß§2ì*oð ,³Ðúŵ^£ o!cÓÕO¡ïwY¾Õ ‡”%2Ù íû‘Í{€CŽ87ħ4_¦ùÉ2,4ðÅ,ÖÖŸÙ”8<ò‚Qá?Ž<6WUû\ƒ¨æªY¥ñ<˜M:Ä#Ч'ÑyÊS¾™ñ‰Šá¨Ãy3É©© :ߢñU ãÁª[ÉRÎøëŸkZ5EzCr—Rg “c2UäS[xÂèü÷²JÚ 5·R# ×2æÆ â‹/‡`ä–&Ìæ‘sÖV5gX"ƒD“¹úøtÁÚ#¹È , Ê7}>øÑuž§SÒð ± 8 QÈŽ§! N²aoä‹QEð³ns¶dåà$Ê{Ø³Ë qJÁ»Ý^L(ÔGÝ7ÿù40'ç{¯e`_Åb“àªÛ4eŒUì§}ÐP×TΡýx¤åP › ¨S„Ä¢'@pq²ž°½Ž“áqBcI„ìØ%õ€§FP¦€Š‘í|eJ4šT¦~wZ™©Q,ŽÕh&°µ± µ'L‚=} !\gS#diâsg Ëtšãønè$5yj›”5‹l&¡#=ø™Ð¿ÉìÙŽt˜P¥³Dãƒ,lù% !SÐ6†b$æM¤Ñ‰dO"/Å &gôpsM*ý@ÈÌÍøö†ä‘r<ÄZ‰iñ””N¸}=ëÙF°„¡½Ë&¡ÂʾvèT«7kZ4Ä˰ÆÌ9ÄËMá*& ñ"¬Yâ¿£ [ Y&ëa%Óñù2YÀ# Î2•.DÛŽ*„Æ44… :Ãäyñ5Üz¨5LóÕtãK¹=H£4Ì0Á›Ê‹Õ†™p8BèÈ`],¬!©Õ ֙ţd¢B>¿1¯Ò0+‡Î#L¢§7r‡¦2ÌMÔ†)è} ªá‘ÎwbÁÝéÄ,®ŒÁÁe#0ƒ*4Ü—ºS,7gáÐÑÏ@ÃXr.3æìfýtsÓ<]BhàÒYè'›Ãc„zÕñÆ TAÞ:ÕÁc¦æ' E­äªåó“«Î¨}hÖƒr5e?¡U›úI­:v}V­:Nû´ªãˆÒªö/ <¸¢”¡·ö*h3‡¾±Ÿˆ¡½”Ju¶óhVP§T¾¨–Îó8üÿ·â{¸&u—hL™¤T~#„46EihÌ UBº É2G ©J;™lj\HàµH×ò`”|v£$çCõÜñ&¥„4¬Oèøl3†i¹ûs1$Ã`¶&B0L#œC²w:ðŒ0K“–;2*Hƒ8»Tæ<³ …~ÏCº”!k4‰¹ú=9¤i"5!Ÿ§YC…|v­(:•,MËu¹THvä`ÀÄ Lâ–°}Xa‰SÁØs/ÓöÙ† 3ÓæM²`ªHW!Ùwˆ’¯]„¾–;6âK )JÚ$ç3„±q¹“‚äƒÙ•|2Zi¸kHd5ËCš%e“ñy–4LÆçÁ”|ö”Ü ÎÏh æ ás:Á›Ïq>J1Ÿó4±¸“ËËÆ‚d† —2Òg wÜTAÅhX­ä¦ ZîŒS¤hXÍíTBš4]®‡4V!¥—~F)K~y>¢ÑK&‡È\i~f²’P¡ù™a½ÁbsÐE±ÐÏ@óIjÈÐÒ|" *ú™æ& ë¤ÐÒ | 觛˧vãð~ô*hÁ´Y£:x–bÕ lJ£:ûZØP8“¡ƒ–MÂÇQåü„ÜŽÆïx²ƒ­ù ø‰44{ M­:ëû :47&)¢®s+ÜeS¨Žíôª9ôýDšÍ§VMüZ2é,Ô;ÁÕsp§ìØhø(hád¯ .”-Ö jB 9µl¡¼>˜W7Ur¿ÓQãJâ%¹ jÎsW,¡&ØÐP#äo¢•aL"¦Æn•h©ÁG y*j†m$95—Ïb[àðWcÙþÊ-»Àßä„ Ëtó}Ï=šÛR¾ììw¸¶Q«Ki®›.·CjVHTÔàcXõQQãù«¤†È_R+FõTÔ¸ß`jbq‹©·½UÔ¸ßÐÅi¨q%Áº/“²g6¿åÓYgì÷¤ú+ŸX{ýÊX¶0ð2£¹³ù7÷ðx tR~ZzTa)„™Y’Z,´‡³nZ‹ÅöŒA[,¶—”„ÂXùĆÝ%ƒ§Óö¦¢RˆJ¬5SõjM p•ÖœqÞ­ÖšÄP"*™A?7­ÑiMnÀw…ÿoÝ!€9<Š–6jeçu#l*íÐZ%ů;Ë©±aTEͨ5*jü¥b¨ãïð÷³ÔTøËÂPÌ߹橨±%í‚cTöÌç·€¿ Cï)·Î 5–-›ð‹û÷÷ýëŸÇ'diA0#ìó`ÿaf¼ÿ0×ÌY툦Dm&Xãf&€EH »Ã:¤ _IRËCÊ&ôªÕ®€µû,%¬ARîÅt0"BJJÒä…Ѧ²®AÒûÀ`¡Å`mŠ2=IJ³^‡$RJ’.y’ΰBFç©*$1ÀîwzOE#‰ÖuZ÷i“ÀµsCòóáë¿l€Ì¯YKÀ›»²¹'›*Ökâè*ù†sN ë5 I±4D0œ´ø`<¡ŸÀ4øLe-ƒ –”µædX¿¬¬¹0÷»²•heÍ€é¢jµø”eM†iCñ"TY_2uϘ¨x4¯¦•u¦W<%>˜I^‹O0æÔà3—uiÂõß×?øïwÂ=tMaþ}>Ò½`®nPOv©7˜NJZ|`±óS‹Oà4ø`ÀÓ§ŸØ=HñIÉZsÖ,)k.L8ÕÊd͉‘W%+Y@Öd˜hj|ª²&ÁÄK´^„!ëK¦î¹ ÓÏ ”ø ëuË0Ãå> Y`†+‹r|Ò²NMšÎn£ã³+8Å0¶c7¬ìËÿ샸¥bÝ &ôKåÑL» §ÆÇžäÒâƒÞJ¤ ûO÷V:|,ÕøÞJƒOZ÷Ø0!dz|rºÇ„ âÖãSÐ=LPX‡OY÷È03e/ÂÒ½K¦î™Ó‚?Wòg4>Ðo/€Oh |&º—˜4½C'÷À©$äùt%¡ƒ³ÏÍÔ sn†j¹çÁCX+:(@# !(8 @ ªƒIøDD  ¿”!Ô±c,(»G)A ª3rF ”X§7v(¬¢Å?·­T*h—ý6`ëàOcsÊ!=ìdt] ·Å̉Ä5Ë… ̉+6˙ͩRk>yg9ûÝçÏS~˜â`÷ò–¨‘.oàè|º‘ §FòQžA’,_äV¤JÏÐ77 XÜÍ›}k,^’ÅÖßÂ…vŸ„OwvW„Ð9Ãñ ÷ .ó‚Ñ~ˆŒð;èÏðËÛx»y “¿£‡Q#UÞw›J Ü‹I–‡(§ÙL£±5ɹ“6“Ö™!4oÎânNë[cñ’,öÎùv†û´ºÁïºâfèl|ò¯;N¿Ã6̈œõÝü"åë$j¸{°ŽŽK\Âk{Þò~'¡aVÃOYmÏá =§íYXý¨mÏàìw HÛå¤ÔJ;‚#—¶NPÃųh¤ pŒÄ•ÒŽG%biÿ:EC$–”º¸†±©ÁKK¥=ÂÑI[gRÃØƒVÚt8el˜þΨï„O÷îûùpþú§7Þý~Á[uÌHNŸ=.ö2s?,”/x ZùJc P1H;“JáÉ ×ÕI¯‚0:8ãG8$¸üVkÂfzWsÙf'Ôry²N"å2ÁÓsÙžæö%³&­ò]b¢8àâ%{Œo¡,ÚÃýá=Lfnd\¼Ã¿;¼¦ªë†é®;ªMŽE-ãIÄ? ÉwR HÃ$k|Ãᢠà¨}zHÑF”n@äò3 /=àñ3󆲅5ƒát|ÉÌÑ´KjaÙÓ…jH>³¿NìÖ£KÌ(‚ä—w•bÇx:¡°Hp˜TjšãÑK°âC“RH~*1£øxÐK#öø8ÞÒÇÍ·4pŒÛQyO×I-à‡ãUP…°Ðgé¼gÄ•Ø]ÐÛ@Ç·· ~á¿Ãoˆ²I Ý a8ÐÆ¢—ñ<â’€¹ÌÙ&Aw<8&’ÒC²Ç “ˆr€Û¤ <~Î!Ù>ÉÏ9p{Ÿ˜@X1$wEšÒˆ¦AFÀÏ)p E ²l~΀»3‚23!'¾tb7‚›Q “dè ùµ ½°|·«…¼šQÜÎã5Þ!¡þe!}ÌÑ|KÅÑyχ›Héýð#˜Æk„‚ÒyO„ä”Xá=¸Áf‰NUãçúž ‚ñŸãéðx?š/‡›™ïß·œˆ%óµëîÝ¡ÿOל>oCQ8Ëö8^†ÿá!Sâƒp\á´ V©Xï«aLÀ&uDúKøîw:ž¸¢fpÓ8Ü8Ü8Ü8¼-‡?‡ÿb†!Âa`G fàñÓ®ÚÀpã'.Uü†¯ Ž‚W·3õWÿÖžðºá oP@Éðæcœ GH)4y`>‰&IÌ'Æàe’ÂãeI».¦“D*3H &&/YbâA 8£8[LiH¨ÁZ/)&=$w*^+ð’˜è`Y‚o<‹ˆ) /à®A2Óÿ ’—&ðWxýÀ >®Wÿ9®;ÜpiÖº3´4|ŠaÄ£y;O3ÍýŽÏÏ(»Ø¢eÑÄ]­¬ü Q Ê’Äåç6* ŸŸSP¾Ÿcòs –¼Åf4€Úï4fäA¹\ R3ò°’4b‡AÂŒ{°§ßÿuá‚OxdlïŒëNA°^xÕ›Ôrš—ªç *U*› §Ù\£†Ç¬f3Úñ0£^ºÑèFZ1‹Ëj,n,^ÅÇÈ 6/Ïâq}?q¶ýœÿõÆßö§0õÐÍLOaÌ…c¯[x-V(Å*°<**X¨yã!,´@ ËmX+aÕDD‚eøB)VåQQÁšˆH+)">¬¼ˆ8°²"oÐÑŠÆÁžªq#ucÌAdÒ»ë»Ý.œñã¾Ñ§ I2m ï¾þ–,•C“&•,B´kåîâì—dBÄ£få’ˆvLåd"Ü1&’M ïBPJû£%%‡`´Òþ‚UÒ$¥“¶å±ZÚ3k BD§p|?áré WÄÐ?„„§óåýú¨½³AY’šÑ»ýNZ3zç¯ RácĤ døeH:ž¦Û§J· ºøŠÅQJ~”ÊEWˆ!·‚Ä%yÇ{8ò%)íå"Eº)!y1“Yˆñe2bˆÙË&xGëôÇÞ´£‘6þšÝÄ!ƒˆÃ ´gÖ †˜µ†™«íóz¸Q¬“+ú˜òw;(a¹5j%,7ŠÍ#ÁrsÁZ± ,Š ÖDDBXIñaåEÄU –› òµ5)",‰Vú~t€]J‹1«±©0æ6P“©£BÃ0í±–óAi²ËçrVÁBÇT `ù\øJXÆ Ü'Ú§XÁÚïhZQ)b"kAÜ*Xq a%ÅM‚5ÚæsØç2lŸ¢§®T,HúQ,X„çÒ‡Æùð0ûw¶ H‰T° /`Œ^’1|xeÆá™Áƒ\ÂMcVИcwìùìòÙÎ0oà)ÊÕ ã¯l16©`^èP÷¤'%ðLï”-È€gÇ‹•‚uxNTD‰dááž4_ÂSx½¢Ñϧ®Uj ÔÐÀPT xûNcÜ/Lµ™-s2å×É¥sƒ,Óë‹ùD®1Îp!…#’¨˜ܾ5+Ƈ~4]ŒËd•°B+`Á´ I2¬`Þ"‡…Y’†a¹Û·´°`uš«ù X³Ì‹Q±Ð4¡÷%²‹UC(»®•-fŸd Ùá–O»¤„åV`•°<_T°üBe¥X–GEk""!¬¤ˆø°ò"âÀª‰ˆËï¬5_bE¡i~åÒŸœ¢4!ù¤]q¹aíµZ’ÑŽ…?ˆmç!ër1–\ˆˆN‘nÄLÞ&6Dȃʗͬ´PIÛþr÷üêôgXo×é½ÏD'í‚50!¬ÑZ•“£‘Ÿ·Ãö„Ϙ÷Îý¸¾EÏ™Oíæ´Æ 7ÊÕ0 IœÒÆœ®ŸÛé~‚“aãÏ÷øý 0†_köâ_X¸î èLê]Ø‘ôŸ78\Ñ¿™Ñß§éu ì3~†}ÔÇôiªd±œC,Y,‡‡,¹mÏÊÁÕT*jà™¢¥žÙi 5 î¦JFKhÝO€º²þç~ç@Úopê&,áäK H0I ÿÀ†ÿ©0±ÂVcò‰#Ö„b±Dôø"^#j?ÏYôåª 0¾ê£*~¶4.!ÐÊ1ÌÃ9°Ð‚-> =y&óèÉS%à¸ÃcÅ Ã:Q¤ffD 9¢RÑCƒÇrz°*óô¤y̦'€£·U#=Þ­Íš¥y‹:}1¾ósÕÂ*±±FU^£™ éa«DO*™GÓC¥Š¤æ)ªnÈŽÜ4ôTxL¥'GìVyöà-<¹|â´÷+{óÙäóèíÑPh~ú¶ÆWýHT­€y±³ŸÎžO¡XF†LÜNš5Ž–ø:š¤ÖÀPôpºœF[¡‘Uew —Ýx¸[¯<k *ÏŒPy8šSj%‡a !5ÌñIßUOVV<ü0hÝ© ‹Èí·Mש¢¦ÆcžîŒ`än”Àb*Ïfp¸–àÁ¨¨É£Ã£fGFȳ—¬&çÙ]÷ãÎ\ßúÊzL~¸„€¨cÞ‰Óñuóé;«ü]:Ÿ&5R%£çΜOgèIñ8#®:Šs8–Û±$Ÿ“O‘5Ò¹ƒX…xs‡l39AI—Ì”&A¦Š­6›xäêê´Å$²²â¡è’1iM¢:vk&.§§™øó›8·÷&þã|ÅáN¼ˆCõŸåEœ ê"NÌ6ˇ»$þÁ,0^'EawL‰)6È–=f­ÔP¸ìÁ¥F¶ì‘m%G¸ì!¤¦Š—g8âɇÍóEœjG¸?Ѻ‡ŒÝÜuL+yƒ®{¨”§­{Èzòu&Ïе+¨qÊŠ6¡™­hûUœóf'ÒŒºx"d/ò6Þß`àcT§y“Bþ‡SYt(ÃaŒcÄ1éÉÛ!wb¤O“Pª|©Z;I³Ä“È%§äŸSf‰@ÍK±‡OZÌAsØ3XáŠDT‚€*ÛF£R­€Ðg°Â€žÀ VFÏ8#ýÀ‹ -´ÿzrßûƒO7ûõ™¿Îg®¤nÆí䑦)±}V÷3Ÿs ñ™Þ®s$¡†ì½&ÔИœâ6‰®Ñ"ر0¤3DL2¨Á¨¨Y_w„áPÔ¨ÀìD¯†Ë3ÙèV´pAð3ßL[„˜”‡ )A°­\y8ÑçÇ“w^¼É1œPYByªÎ”Öi-±pñ±ÑÂy¥Pµp1J†Ü WZ™Ã…ììw®‹ûÑã b=dÞ>^¢ ¬½(g¼0£w߃!d¼ŠÃ¯SáØóiA•¨ø#Xþ(Ï[äXšÃZ»°äh&SLÚéJô”x,X‹QÒC’xž özÜ0/WÑSÔD#»¬)ÔxSQÝoÍš*è˜$ =ÅÅœ© +/÷DgýhþæGÿ~\èÑ^f€#¥q®I›vöo÷`*i~ þ\w4Þª$“`¸K;;”©=óP\®yXãà¢ë¤Áx¹B Eôñ'~»I~R–pB.£†½ºÎÖMÈ«‹hr¦bKŽ(.[æpDl¹³…U2¿EÏ¡ ¨ DÌ H-á—>‡ÆÆÏïäÐó¢û±ÃøÚnz¿ss(·Ž|úrWŽú}À~˜G ãñd‡Ç·w¿Q¤ßí$º ÑìY°Ü1Né•wùY±g}09­?¹¯$-ˆHâã9¶î|œ«Ñ€Íåº~b"^sx‘#4nE KkΣë>^ŠÉB #y‹˜|ùX?–>…Ø ƒ~´ý§d2—af°ôãàîÙîÆÝ¦ƒ_¦‚¥«ÎmMÁX̺¼n¦×ºÍPÊtOðÉ+ °LWeû«Õû࢖cŽbTɇKÜÊSæ8¶r/Î…(mpdf`GÆŠ† ‡Íõ'q)ÞHµÏ7·ºEÕ†,‹ÇÜʤ¨cÉhûƒKËHÉš'ü'|šØ§g{½ûÝà²Îh]·ËY´*‰Åpd£uÉVA†cKosò§àQ[œó…¶VH6gݯŒ4v ½4Z¡×@¶Í23çÆ¿ g*Ѻш¢ŒåþØï¢p/·†mÊ«­K'F•mçpxüù¨/3¦¬J0"à+b¡¿L™c‘Úð·b¶Úðb²Ltrž´B ‹ÔJGÜÿRz™PѶ ;Qp)a'„á×Ì:eÜÕïOq\ܸ®S%Ü:_¯÷»Ô/Éîxr³*Þ4›™×9'÷ØW?nÍr9›†­HB*6‹†H¼)‰ŠÁ0‹ šÏÕ‡Ý×·+ëîqh íq•Í´|&8„éúI^5ÄÑO»°år¼Ê7–X¢B'Ãì^ø{qHKÅÿåB(¦ïǽq{æå4;obO›ô])¹Kš7lÒà¾v¯¡æpʧ²D ÅÄtÒý_Ç0‡ÅáäD›rÿÝçÛ¡¶Â:2 È’lœé½Nݱ“ZY RÉ jOa©âö:Î@•!0´ÀIÌc óƒèUÉ*ÈSÄéÊÕ nt†R<ë%hàH c±ê°'ŠžÞ’8Uçí›Ý3ý¬tØf›>"ßʲ}D ®`ð—Oïì¡E,[oF-Zõân¡et¹H•dJ½ÉêzÍüS`$k]-¯g‡¢y0Âõõ—éh¦6³R?#4±·‚™±¨’Åuë4Yz#9>,3t>ËdƒÛìa†úê0æt†ì_éÕa2¯çUKǼIõ £RÆ‹¥dU;ÓQK‡Ã(—.hwl• mÕß IÄu˜˜Ó‡0€uàa«-\ýÔ|­Ô"ÓÜ`—3üg˜tþO´=h8|‹b˜<¦óLq)¹Ã…ÉâÍr,l”c_À„W`n1™¦÷Ùµp5lX˜-· Â<ùÂ{…€ŒÏÐŽ ïT.Á `Ä´$‰Rìè±N·sîÁUn¦ЉP«Ý¶Pú»mŽׯ)0Û¤Ü|Þà Ӿs¥ø'iÈÐ3†?IÇO»¾ßM¯—K.³¨SéIÂ44çâxùw6¡l²ó%ÈЦ8ÇJž¿’qÑ+ ù}ÍF×Gm/ž//®ïÒŸg+¤Ý\)1?±:$C»Nv³[kV¼ûŽÅ'Éà"?¸\!õ¡&E©‹œï_0/•_”‰û{3Ö? ¾ÍáÃØ¯>Óî™ã™u§Šž+†ú„T—¨™—%ßvù·ãObŸ÷Þˆ™o~šX––@q‹c<[%PDÛ\½§AÛŒÏNËfäIt¢Æ¸¨I2=í,VròYÙçÝÆJ y=ûPÛ3zÖÔð™PCæ²Ô ŠâÒ/Šg(݆|3CDVr ž¨ d-zºÅïhóƒ:¡ü‰Ñ’Ì’h ÚnN¥Z´EÛÐåóRºùéÖ²ãü~óyOˆ¸¨Ûm‚ZH\n‘㮑—Š¿œ&¹Ê‚nUQñçùf8É–Uªƒ«‘%–|EyÌÿ5[Q–L…ù‹n›M…Ÿ79î&Wn ¦ÂÏ«½éT¸7±Á*û6aÖ[ üÕë’ð)uzœ€¤€(MpÕªyXÎxPÙºä'z4~•~¢§8½Ìˆ‹«²=3ÉÔ¼2‘gßæ~fÁUvÚ»Pˆáìµóí\â~^¬e¼­Œp?/ú¬¦CÓÓÐót—eÌE±Àž ©<û6{`‚&mP2‰(Éꯠ߼³Ý_fé§êÓið·–•ô›Ü¹që7[¿Éï7L÷÷)ì7Åk0Lj*F• &½B£ŠJÞ\0\‹&‘•"Ç ]T‚;Ù Ûïrk¨¼U‹5ãá—ÎÔAîÒ#d8Nðw錸Ž ”']åS#YˆOVŸØo•ªc‰pÐêê¯à6mù­î+¯þr»tá‰ÆY—þ­SºKŽóˆo “PCfóv9rÇyÚT¸M…ëv5¡¦M…ÛTø9§Â[-!¿øTX²'™ /òh»â¦új¿`*ÌfØ0^ÝÖç×.´uõ¹C mm¡­ÏÚ*>DÁ^Báa%KмÕE-´µ…¶FŸçž¤:¸Õò}ãÐVö¤“Ìœ˜EìΆ{7Af*\TeÉݶʘ[bB­"ˆ7É(@ «6DFJVÝL…%î+5^-2Ÿ…]› ÏZiSaÃÚT˜èrÚTø¯ž KRª´©0Ãs}¶;?ÛŒå¾hÁ`oev· öÆ^Ó –Ž“Áã­RëÅ­|ó[ú2Ó­bïIGjÈõ¡»ô™Beº•2sI~x}v„*Q›ýRÈk¤Ö›µ²Rj=é²+ËÅ9Ü¢¨KÈD¢â%d¼+ïoX³pLÇ'IŒ;}/›÷ýu:‡¥žû.|̘˜lüôä6D&KFϺݢïs7 ­s|õé!ñÔréÚÔË¿_…±g#Íú/9ŠX²þ˾BáÀ$ç²TT/U¤¹KáÐиÖÉÑãOÑÊ­0R[rÐD²ÆÔÒöщy½´½d»†ò}I5‰3¬­Òöò“)J.àjËìm™}XÅ÷iëÔÎciŽ]r/Ê8qÁYÙ6—¹nu%³ë‘Ýæ:ëzÖ¹5FڲƢ§Ù ³4¿$hùê—ån9k âsïž A<*QewŸ’ãžLEpÉì8t%'ë”Óž’‹Ùe]w5ÓJÞò<™¼ÿ$d—tŸ¢¥SÖê` ýÛMI•ät¥lÊÍ3/É6i/&¥DÐîwôEÄãñ(2µç<)ÜùªŸóÌèÎ#¾ñ•êdÛ=^…Rßê/kLg±ÍmÔ’ÝFæ–†•8çâóÑïUÑá{×–T`FË Œ– QÝhõ© 7lÂ-–ú“êˆê16w$>ª»ÖÕŽªoa“^¬°E³a&âá&]š«`Øe g»$®Ų+âòiDÑ‹"¢ø^ÙÖßá(À°!¦õÚ_:ü2ÁŠ‘‹[/V‘½Ó-ñ¤w½t¬bi>Xo‡žG’ùMI|½¨7Ój6.Œ$æÔäyœl#97*Öjóƒ’ˆ’¬QQ§vQ;‚ï)X#¢ÕyéCÔ„¡?¶Ë\_Þ…è©/])i*?йOT^í)„šq²á|’~á™sóûñ•L·%^"X{G™9z—í(ÏFïëì(KúÉ:FŠ`LC8]èŸéŸ'Ž€Ò˜qŸòÈX”kA3aDçÑšá{gÙÎôLVŠ{çZø|Ÿ(P†wþ9·øÞYrç[Ê;¯‘ÈIáéëEï¼\Ô=M5Š2Á’ŒHÅa¿UÈÚNÁˆT²Ñ)‘.p“IÝÿIUJ'XÏ… _©ïάTÐå'<ì"9H+™…ðûÉ A~Ô¾ì‰?u¬åÀaÔ>í„ëCÜCžYÞd›á˜|€f`°ê,„߃IrˆI–ZŸ6£J±[nãu‰kš«‹]4ï¬ßqÁ¬z’}Žwn U^/¡JeÔn;=ý:r ›+|¾IØo„!8ç.™ÛK¢¨4ëÈÏ·ù¿Éì^pí›|yåãMÌ –Ø:%'<%æ)[SážQ‘lòHjërQ¨"xç„+•dSç]Êà5CõÎßå”;sMr/QUõO/rM6*¢“{°˜Ãü‰Ä%ñ0‚ó¦|by $á0Òõ!ÖbWnÔ_EÜöFõ²û‹¤ˆ·µ}º$âM{ýájûö¢Hhމ—gÿy¿ÅÞ|mo-â­E¼1yÜ"ÞøÎ¦E¼µˆ7ñJË>…#ҧͪ,‘>í™›—ŒxcEìwÄ• J•* ¡fäôs*ÚU†m˜£vÙ"ì‡[g‘á%èXfþ(çìCµ§ÀðGº‚UßT#%o̵DiFíd?*¹¢ˆ?j—MBž7âM²B ‰x“,¨G플V‚ˆ7á¨ñ&9öß"ÞZÄ[‹xcáÕ"Þh­´ˆ·|#8âM2¹—D¼Éf÷ØÕ fÔx­ˆ·u2j…'ÏÚ´iÕËL©[~Ô:.Q3/FE·´'?D¶Éå‚ÛŸ6’…à r|Þˆ·ç5Îv“s±«E¼Ñ‰!ÕËF¼1Þäq±%–\.Ù2jPÑyÁŒ«[§dáMbžï,¿f«{Õ6¹&ãK®ôiÏÜÔ¼ów»ñ‹¶¦PÄçT?f¥µe^ëÁ– ûÕßÃ]“8}M%Òcù9••sÐnræf6j‡óªéC,Ulû‹¯·¿ÈÜýŽÚÙkô ³ºóGímñU÷7°NÍ­)tó¤ygíY—va0öŸXÏ{祭S9j'š§dD*9ëÒnæqx«[‡§ÞyµÙ‹»@ñÎßtºXóh íX±oè’¤å zç€5|ZÆ Vpî8ÁêÝ'/ö²iÐ×)˜k9ì1»h-çøö6¹q¥›OÄ‹Ïxõ‰ô2“‰‹úyÞÓùÊNç-sþ7ê)ºƒ–±}V­FrBY·D@<¹#H×ô´wž:ÎÈ*ç‡J¶¹']ào„ÃãõO•lr+o<<¦ºÉÙYþ€Ò M¤¾“jŸŸt¿þm‚"^0él0Ë=ÔTpsyëàšx·˜Y±YdÅV[,s²Ó²‰ÛO›Ò¿Ú”žÈaÿ‘¬…ëVåjKÆ8¡ lë$X¼pÜ¿Ýç‚‘¶¯v‚ƒcž" =vý6C7އ–Ÿ¯Š¼ÚzÇ«ØZ’—-ã¡—^ôHCQ)˜¡ÇÏ{æŸ? cFV䆔ßux\R.ºRëÜ×”hÖ0šRÕù|§E·–-G’1óh+e¯>cB]ir`:“·Z×öQVŸŽ=šzÜ&ˆ1’\Ø)ˆ1â#ˆ1’\Ø)=ÀJØ™÷hKt°š&½°ÓmŽSR6æÛÉ'T`ͨW=xÆÌŽpTçèÈîO’ýB1û¤±¹:“^.b‰™tõ Ãf'Ï@Ï Q¬Š™f²®‚7“Á¨fÒÔÅÉ?“f.AçfÒ¢$§%$‰vDÉó­mlgiÛ¢mþô¼gz½ãL•µÁuRq´™tŽ9|ZòDm4“elo3i61m&-ÙYs&ÍÞæäÔ!“9õÙÚô&iˆ8wG:ãÄÊû¥<ëCĉÒ5‡¼È†´,D\’¶LäÛñÉW;>9žÆ\O»r±ŽÎÐÌ ^¹ˆWÝ{2Ö¯¢„Ïz[]; RÇ%jFvÄjÍúKfí~R[ß/BÒË`9Û¨ ÷ðÄ8â!ºœÚR{ wÒi„Ô·ïU©"/µGf.ÏiÏ(”L¦™“+¯ÇVm¤=w‚.w¼'Ê©°b…raèô¢b÷¡jî½[u_ZxªÀóIRéJnóm2n¬ó±ÐÛïäì¢Çåe—lŠçikO:—lêçœ+m¦HçiÏÓ‰hnÃt R×>íœÓ©œ1J:…‚Ö5qô¨õâd¹Cê­¼*Qäy¤2Öî„]Éú—eKÿ(ïÓZ/Y¶èx&7–àð$†Ô©@°¤»À|ÈÂd.×vä¼#ݨ6LÚ#ˆ5’äfÄ v—œ¨«_øyt]i’òÍ¢` 'òéÃK6½˜Æéµå)ïõˆù,û¥’t–Kôà•Œ¡tëŒê\ZFëdm–æ­³]ú“nd«KÖ( Æ:ÛøšÄb-Âñ5„8ŠóÉ+8Š.:î#3Ná¸ýIL0VF•Fɶ“)€²ÐÌ4¼0ò]ô¬µz…ž2ÀìM Wè×`ÿèÞ/‚½I–þ¶£6²£6V4¯FóRáá «)¨@uVFë¿”³²Ó6³²MBg6Có ìíœvÏJ–7Y«©ØLZýØ#%É‚É_ibE£]evW.N£w©!ÞJÉâ¥ÁóϘ+ž3Èóɶ› w¤$ÔS”™Œ€ ‹–k4ÝU»À¼¨ÅZ¾D£â¼Í|Ëñ—ŠÂ&ö4-§`3+Åàzš'Þ:Öe)~¦ŒËÜ•:ÈKñ<ml»¹·L”d{bx«g¶`´4o²´Ôº«o–‹ŸÖ])·•>ø¦)éz™ÝÕ³ÇM¿TÊfùêwU‹SšFÐb±:¿ØŽ¯µ™õ7#9ÞÙa£Í&B"JP)Z“䎊3ëxfÔÆäå ¯]˜md« ˆÝ•6;…SÖµ“S0»+ÙŽÐÌðÖIN!í®¸;B‚Ô1’!]wõL¡m³¶mÖ¶ÍÚo²VÓ6k¹´ü‰ÍZ<ÎR^Åó©T[µ¨8Ç£öôJMÿèû®Ê•?Áò‚dåO¸¼p<ªN¿·!ª Ñ«ï$æ5zÑøºMÒò4:¥7Äe¦4z…¸ÌM2,5:¯7,'çŽ5ú{Ú2]Ñì 9Šó©[›"[ƒ$:Æ4Îɰ™_­B\”‚ý‰QÈw(’§Òï ,>Kî ùÑ}tÚðßwL yFâv )/%FËü¹û!Sz¶Îr›4• 6ï³DINr4-©Ä9½`%\ròx‰MèêÉcªGÓ&Î?ñWŸ6o¾ãY¼4Pïx'•æU¬È•x=ÓßäúèŠ}ÚëÈŠ½¨¿Q‡OS†Ö`m_é;)bz¹ ÖhPô"ØYÚx´ŒG[!˜bçíé‚^$óŽv¿Úáúîvœ>‹:\A'õRwf’”SßI¶™¯ ‚¥$;¶¡ž­9_å»AÁ|5¥g+¸tÅò k¾šwƒ‹Ž7ÉxDðh-SÖ¤‘QÏÖž¯ "·”©.‹ZL¢%I¯Ã ÏÁh:ܤ¸å_m7¼Í;Ú¼ãYçm¿£íwpi‘íwH:)éATÖe¤‚ýIR>I‡+šwHn,áoû Ö­óɺu›wÌÔ¯JK›wl5ïh'Fd[wXzÙ£-–®Ëü×â°ɉñ¶/÷`F9?øR—T/0ï¨éÍë%ëg¹Á³šwƒ+Ä:+bè±ÎE7˜&Jr†:Îj.p‚¦µ˜®iI=ã )]]Ëðh£¤T§ð©þæ‰#gó[Jªt‚r&f¬ðÝ-{ÆÊÓ› ïí •“ª7-­¸Ø þÅÇžªn°å642êYK XÖb¦¦Í>’T1‚k’ŠºÓÝÄеeÓß ;Ü™ÞÈ“ 2ôF’®Z2ÅJWWÎ¥³éÜà3¥«n1Ê-F¹Å ¼V¬@‹Qn1Ê-F™§7-Fù«Å(·XºtFÙ´X£Üb”[Œ2GiÚ¼#nä%æ-F¹Å(sii1Ê-F¹Å(·yG›w´eŠs5-©-F¹Å(3hQÅ(O«Ä@ÄÛ¾ÊùêkÝ-7ÑèÕæ«¯u•fÛ—>_ìw<íÝrm¿£íw<ï~‡d¾*˜wHæ«ê[4([Øa‡‹7O¬“ r¿»,pÑDõ2-Á´CÓu²¦—lºü¿f¶zá_ÍÀ=‘ÓJ7ÅPd׌h‘cÔ²êHBÛù: mOéAZ$ø&·¼Ëv–.Äk†Ä¯ rµÊ. ºË•4µëßî³®à[‡Ï^ûmÂg7º×Éy¹GN:%I=ñ^YY:IiÆëkÎ=hÒ™Jê‰:œ²L p«N6Êo^àwÕVÍk¡=˜îS ™×7¹Y˜ãüî(+VK*Àw~²“Ë‚¨T;`£q~5‡ó´—׸\’ƒ%®[¬æ¡™×7Jr@7¯QRªMÛ5«3Ÿ—”~¥v­±çWÓâéG¶-$9«q~E‡Ã[œÜïôίˆŽ/OàB‡ç7ºk–f^ßf]Še^âmªX6«í óß×soSɜߌ7¥Ï–a•*ç—w8Ü+úê‡#ÚªCó“æõ|«JO®'p~‚p½Œå,®§p~y-ž~j FË…ëé_Æá𷥫J’-ö¶ªÄÓü¤y=ÕªÒSç5“9¿ŒQ¥C3æÔLïüˆÖ@X-OHJ¶ù»€ó[&Oos~Íù5ç÷Õœ_s~Äji7çלßD:5“’¨@s~Ñç%œ_©È~'‘òÌuUO0—c½‘Ä…#1L›zâ3(¡l^ gÂÜ×Y±“îX±Î¾ç-ç›°•SHVìÔ§jª’"î‰x'ºúvM€Ê³±^€/s¯9¿æüšóÓ:?ØÞ @>3‹`g¾,úÚu¯;Óîöt·ãøß¯$Š”ø&‘¿<=¾¼>ß½Þ?=^=ýzõ±ùóÛÇæï»ÇOW¯Ï÷¿ýv|¾üíêþñêýÝã½¼ùóßèwÕãÿùôô¥þ°ºóõóñªºñóë›ÏõCÇêÕËêOîWÿóïß^^¯^|=^ýáKþ‡ÿÕ¼ùåøZ½¤¾çËÝÇÏõmÏ߫ʚ·ÿŸê‹u _>>ßÿrüTÿÒ»¯_«WßÿóêÏ«ßÿ/Ù¿eM‹þp•ßÞäWýü¿ë÷½Ü¿\UÿUïøx÷õî—‡c}ï·ÇûŸ_îª.~ùúíõNõ°ßåìê/O¿Ý¼z¹ÿíñîá¥~Eõí}Õøê_ïîŸ_!^êö¼T¯9¾\åÍ{ŠV^wÿ8>\ýr|ý~Þ½~®_T=×Ü~µË®þõéYûÙŸšf«ö>VOÖ_Um}múüúÔ6æê{%š¦W¯Ÿï^åï|zú^ýHõÍÃñMcÕ‚ï÷ÏÇ—þÏ5â|ÿ£zû·úNý}Õû?>=<Ü:þtuwõýùþµ¾åîù‹lÌñŸ¯•ÌŸ~ª»×Èô±yÓQ¾¿Gõ¢êîúÕýWu +«'³ɯwÕÇÏ5Q¾Õ·Õ/«îk~è®Å?îê^ÿò£êøß%)ïÚ&‹žü¹~¤Â÷øÏ»/_ªf?<©N½©DpÿøÒ ·y¶¾íêùøµ‚âøüæø¥þíçêMµ´ä¯^Ý¿Š–ªG«†ÈVW½­:øýéêÓýÓ§cÓ×O•”?6¬^ôëÃÓ÷Fâ‚6Ww/ÕÏý÷·ê–O’Ì÷M£~½ÿí[;Ø9vÍ|ü!í§J5ß+L«FÜ5 ??_^îžö¼~}Suéáþ£x]3®^¾Uƒõåõ¥åÈçšú¿¾|m†ïǧoŸêWõ`ú~ÿú¹Ñíõ›OÇßž•”žÄÈø©îãÝ?žî?5oùõ®ékûÎêR2U/þðªõ㩺ãYŽþ—»/Ç«ÏÇZ3T‚¨ü§oM×kâ><ÝUÝ«žþú£~ Êí®ÞrücõÀç×ׯüùçïß¿g¿<½¾>}y¸ûq|ΪQü³øûç_êçÄ¿ÿ¯úøËññµ–Óç×/ìÿýxüãÕ¿WJäëëËÏýñúùéñç/wÿu|#•ÙÕü§çìëê¡^ýéªV”Ån÷ÓÕêJaVÚ©bÑŸ:ØÜpg»ùMõÏïåß²úƒêßæ“üö¶ú2Ëo?È{êO>ÕMÕÿQá½Íñª›úwÞÖ?¸«?ܵÑN»¥º~Û<ÙÞ$ÿîßU?–ÝÔ¿•7¿R¿Eü­ÝT7óF4VÜÖ}ÐÝ·¿©?ï£]ýŽ›ö•æ÷ûêσޠG#©½ýå×ͪÿÞ~Èn›ÕŸÕwmCm‹Šæ%·Í¿EFýO´7Þô^w£¿K5QüL+[ÕÈöÓ£÷»æ»q%þû=õ¥¹kZ#.ŠæZ\ôqq¾©•IYßQÜ ù· ëþéšU6Ò,n³ñ?j[ÚÞ³×eöþ]þ¶úgW_ÜÊ‹y¡¾Ú‰ zW±A|$o–÷Ö·îÃ^Gê}ïˋþfchìérèéö+ò=}è}>ÚZ?xÝïu!*TFäKã À‹Âš<‚ ÍÛ¼}¿1U¿)˜XC/&ÙñÞ›ã_L~ D¼7”ºÃí¥DIHAˆo(…dÖ/{ÔEÒ˜b:qðýÀÉø²Oè‚ñ4®šÔûŠ·¾Ÿ"ngiQÈOB¿Ú‹o\¿IL¾‰ß$ #¿éùIJEEï*áÞ¦üºþãGÿî´ß&&ġĕŸìrg3„TxÍ7¯­ f+D#È' ùšÝn¼=t~©„6g"®¨_ßɧ­†]dyÚE!„iW²^)®{â©¥"¸Wt£-$åU ©Ãô 5#¦…ÄWµ0ÀíÇ[HqB<1Ìb\ÌæÙ£\4ð¢cYk Íã€qrYŒ‹Rk2lý¦R¢0µ¦ÛÉ®•µ5¨©S™åñ¦W¬¹Š±‹h1¥*X{Nß+€«sÒLòb õ¼vqè7¬T.›¿ÍtqÎEÛ0 nô Tíõ¸ )‘Z›‰mÀ„jê<½vèm¦ôÁ§ÚL) 8«ÍÄÕmĹ †JsÐrFaŸifƒÐÉçyAw“çm hsiS–dwE¿…¥ü­ñÄe‰è—%õÿ“!òÃxë§èÖŸ%†ºÖ apëíÆ_L©Xm'&ë' ÷´™e£²ª­¥|:„?Ä4¤…b›ýT¤wcFJ¿ $ꦣ½¼/FÎÕðI)EÐÀ ®Rjú3ñDGm¸9µ$£œ btcÂé¹àNé½8¯aŒ 1ǰ…¡lçá1Õ ¦É¸|>RÄ´—KìHçaA\‹Q(]ÀTµh¿šèUĹÔþC¾¢þ”+ëO±®þ ŸJ½-«;ÃlCw.Û¡¬•ÁT¼òt–jLE,lvŒ-Ì×áq§ÜLÈ늊?—)‹›Þ±Ùr¹svlþ¥yulIyau/¾¢16Ò¯©ÓT#ŒB†ØH¿.–E´ûE!#l¤_3HòÚ^´Ixõ&iýYN*䲋ñ=\ÈœPÿã=\®Y:;HëqºDþ/‰¤ ñQ„¦‘¯y+ëê ˆyœ]¥DXµ®Îj®ó: V­«KQ³û°®® ¸‘’êO¬ QL¹´®M1åþÁº:Å”fn´ž.D/õÇêPOiñjIë)­Z+5+¦TÇÞʧÇú¼è »1°ZŸ‰1zRœG½üqܘ\Ù1 g÷@ŸçŸË<Ä༎쒢6…r{Ö8æ%/j[ÕÔwÑ€/Ò©Þk=ìw~3æ+ú¿¶cÛ%þÁ<­ž÷þA¿~Ú7Éê­²~@ß­ŸõC~õ¬‹Ú¶Jûfú¦ëªJ7Ý(/gÞ½pöœbФ°öœùu˜ )Pš4)Ì)Ç\&IAÂò“9Úˆ 4)¬E?ÊOö*p«ôcº<Oxò¸Èj ·<ê âÊ£T¼_FÁŸˆ“½òØž!-ÆåÑ…'%e‡Çű•@cX{8”Ǻg”‡CwSâ#eN\MÒ+ü ¥·[æ+ª¼lßùe.rÔOÉ4Á³’ðA>í>|KøüJ©ZÂ"ý1á 5 álL@}èzKø§Ú>Tñ ŸB¤?"ü­J½3${ÄKgŠ—ÊáÈn½)û˜=Bü§ÄðU>ÖŠúk‡èáSˆôG„¿Ù¶Ý^µÊ"¼Uîg( n±Qpþã‡ÁƒÁý4P8™ût’ ÃiÎCò€@Q(¸A€J²Aðl¹ˆ‚„h¤=4Ò 4Ry­É\%£o¤sŒŠ‰VS¹ñÐà ®­Ø«H”YZ»îmk ÿøH&kò}Ÿ„‡1gt°ªDáÑ,ëé¤$<`ÎM<ÒîùÍÌy6½9?xáÐÑ XsctœÅš§ósÎ Á–wh\|㤞B‚)×ÇÔ¦|@WQ°äòB5–<[Œ%Ï—ÏÊ”CxhpÀ–KQ#.K4æi+ÄåÙÒìæiöiÌyè´ÌùD‘yÙ—þ­¼7ÊŽ`Ö¼LÓþ¬ysR+˜¥ °´å}§ÀxK[®³¾9g#†<á1t8Y-¥b™¸`'Þf+š"#.0bäð€Á¶ÈÂôËonÛgˆ«Ò0tœ%mU˜ÁèX]Ôèˆð²ý†Ô ‚¿&rymߢ@ššC¨#rùP§Ô2— „%8kÒŸ‡a¢Ð©·ÎfDj ¥„­{m€º­{¥ŠÍ&@gÉL;£¡Q€°šË輫¹b"æ\¶\räÝr)JÅ¡´éB¥M£z@„íkL€Æ·¯ÉûéB¤+9ì³"G¡˜íý¡ÇBè"GZ¹Âă…Ð%&r§£€‰ ¡Ëž<‰‡a„.;ñзC˜x°ºüÄC³áBgunåÓÈžÎ/{ÚX$…GEžb†lÅ|²Â%ìcåha67åx01‹ƒ ºqzÝXB†Å&dS6d5ÌÜA3šR3Âk\œf 5fÐŒ&d—=ªNã0fsS"¢VÉ{‚•$¥8 <”ΘàÅQä¸CK@œàr cè5ýÁLŒÞ”31#Øsä5-Áò8;þò¸:„#æÀC`àÄn¢”Iv˜j3±»üT›RšÄxMw°ÅÀî¼kQFœM<7Zà]´¸Q„y*.ȯÕÍɃ›/Z0N5™ªžöÂHì´KwÖ##Z˜€Âˆ:Fè’Œèè…•Ë0¢MäÒÁ—_«ç}ú—˜à62A¶Ï­çÉöEƒ+†0\l{o‚{–mï›Ò‘hp±RÕw–˱×) \1„çtàŠÑ7Ÿ8çÀ¶…–XØJh‰-*Ûml•Á%¶ ZbOºÝ(›p¶7lSw|Ї­ gS°UÐ+U!¡%¶(oðùRÄÄö=°°zuô°¹%&¶¢%HHõ°xš„Ôõ ¸íæ‹PÜ©ª#ƒ â‚+†0\,#4Á XF!«Ü·iȲÊêE^˜±x±c8 fØáÅÚá2 f™ó€/ÝÁ¼$_º…áðZÂaÊ´3¾NBëuL”/“вQ&nJºA™ºÁÌ@§‹˜(§œ.b£Lü‰ÔÑÍhâÁÖØjâƒ2V­›(_vMW?˜¢° yfì}fÂ|ùâòºETa¥RÇÖÊàs«å) ÒHÀ‰›CöÓ øÙ²Ÿ…âá€cÒ|I™“ý(àˆ»ÖwµQp‣®oŽ^[.m8¼¶xmy¼ׇ×f>o¯í7œ6 ï9m.®ã ŸmM>›o$Úl¼×á²)}.ËXÖÌYxÏÎcÂá±­ÉckSéêqu·z”7ØÐ/±¼!?x '®žo^‚å³ôsZ>Ûæbb†½ ½Ü–Ÿ§ñQplBÞ‚ã2yDoë‹ÞLä‰ï×ï°üÌõ½ÏÔG!5bòóW÷mD}ŸmOß_ë0÷“ºI  #603I0Û ÌÚÒ)ã$€*X“*(    ¤/U0‚U«‚¶î ª`„+Wð   rxPí$?4Á V­ \>H s¨Ææ)‚šÄUX°¶Ån7l7 Â8€¢›K, ð:"xmñ—¡óZ¥à H@§ØÎšÀ"A„&ûÏu€÷öȉ² : RТü+sütÀj>ÖQ.Òˆ¹ áBøà£¶D[þ–h"¡èUÈ*m1«e-Ù°hÖB 0ŒÎÀ\ɺÑAå€|ƒÍ†ÕæÒl…`EÐÁÏ:ÅQï°U£É†”­@“¸Æ¢ø[§SÜtÀÖé&†·Ne¬=èÕ‹tbHׂg7(:1cÈ‹³Æ¢´uœ1°¾13UÆÚÖ»:cPe`‡` ºjÈJvî×7¤0£O Ì|71–8ßÕ&´»{•^ƒêPr@ó@7èÖÐC1 ^ÀÿÌÖîö½Œd'矻Æ¢s[¶éó Óç.bôyAiÄÀþ Ëß¿!ÆÅÀ¤Ys¡ñbµ“f9#Å%=‹TçóV)%f­1Ͻj³Ö‚˜ÎçN5„YkAlç³W‰ï}¾Ã!x•±hï3×Ãâ'?w"±•ÆŒ>1äB@¸Ÿ1¦t?¯ ¨7öÈÆMƒâlk#K+ÚûÅz9"؆T¹Æ‘ͥʇõÈN~+SåÉy‡ h—Ñ–a‘lãQ¤U(XkÖ£HÓY¯5ÛGPëKi²ê©·vR6†#M["ËLgd½)²x="®ò.XIæN¼192ËoÚÈW=Þ½:Œ-Ä·:Í[ Q– QÚŠã$¶ J‘¦[ô8زþ §õVbØ‚º€ÍfQÚrå0¶ /ëbË–ò²~ –çc¦GÖ ‘SÇN²lqêxØkiÉÆ$ 6te‰‹¬|N Eåæ|d!”+­©\É&‹*–O' v˜2ɲަ”ÏB†jI#‹raYdA‰¬I–™”È^‹Ä}lfÎf NOu°em«ùB£çA¶(Âb uÊ%-˜Q4ÙrÊÅ„<®ÆÌ(:زÚÅv›uõEÉÞ ŠrÃùÿÞ ]çäÍÓu­/ãã éÄÁέp7ŸŒ9X´‘-#ÒÆN(mÖ;•ohƒÒ©­•N¥Ñu.Úl¨ÎÁ¶RnÚ`ZÓ’=Úxƒ)âÎ#(…’êÝ`ÒÉË›ËO:‰äMobRýZ¼£ƒª_ƒ6Põ{Ð9À /¯>ƒ¤2D‰Ñ–Î :Å'‚ôYé")¥„l©â‹BÁ ¢S^­õBàÕ1h¢À+€@È/; „üriHùÔ:ƒb„Õþ6V;“n3(œ@Øà Ë^Þùüh¤ƒêà r‚d rz6¨&r¨Y6L–÷ðl¦½LgW£q„úÔ÷hÒT ¶¨uyLv^›#Y\Ze)ó0—Æ©½ä¤ÒõR9H%¨%¨¥,X-µ^’L£\¢2r‰¢c6û)/ü\šzölW¼élW´¹s°Šâ̓UÄ^žQ³Šâhåf¦õmV¹¦õK­ü¬¢ZùY…£}LV­iݲ8Ú'ŠVnVáèkØ@E«ƒA˜@˜Àmâ Ê*X@›U6©Êæ-'0€a5VÁ«*@›T0€0€}V¹IÅ7€‡ ÐI*@†çöÁÚ´r³ Ðf•+ êK®Ã:ihÓÊÁªYPØÀ0e¿Ž6Т•›U°6«6°ð¹V°NZÁÚ´r° 3°&­NP ³×Ô5„‘hèøEœ2PÅ/J&XŸ_²4š`¿°NXQE1% Ñ`ÌàVÐÈ _XAc)0ׯqãü2è…­2°U†‡_ï­2Y Át~á]a ©"Xëu'ШÅS Ë•A5)u)"ÙŸúË2Õ@5yqVª¨ªÉ‹sRí ©Dl¦ÁUÓ¤Ô¥ˆd2YߦiÙ™™&50-ÓÀ40mLƒõÓ€ikbZ;»‰4¨–!£ª­„j˜'Õ&¢f?Aµi¨VÀWÕ&¢|5Pm¢ò¡¢e•¢Z÷|,éP‰¢È ÒÑAgUçdÉ7s’÷<Α®é° pÛm\f<ÎwqAÛ–S1EÜÅ8bJ^hœëY¸œëŽ˜áié°¢E^h¤ÃŠ‹tÆŠq¢G`êEƒôÊ=7ý°bOQE1eȹ eéôKdéôKdŸrÕ#)죔xÖbéôÂdE§»‘ìO&½<›}Ä lûˆØ*öQb¡³Ùy1ŸlJëïunW íE¼J?ÄRêRDZ¼‘æúõ‹˜[áP÷ »~mäÑ=¥Þ¨uu°Ãç¯àì3ÍCÄ@ª“åÓ 2b3·Ú§kDÅC b(±™›BSJÝ¿¡iG:Õl?%)Œ“#””qqºn¬)©ââDÝx»“bèÆæLݸW aèÆæLÝØ¥>º±yO7véºJŽ1’ø~£ä=WKR%GIL¿±a$…Pr„‘ÄôKÕ¦–$¦ß˜«†8Ãf¡%Õ{Tû]ä$NP­ÈIì‰cI|~±q'ŽQ¬ /4rž´X!Œœ^nJG”—îV!Ozº›xƼ妜Z᥻‰aÌ7)ŠœnnØ+nR9Ýܤ¤U»¼}"O;šÊ|P O;š*ÆÆò´£)â4w¹…uOq𻼰thàiî5hÚ±”4íXŠ&˜>š†î6+Ô©‚^õÈ`lK5&cUZ)±tŠj‹¦ä–ÏØV±S2V(ÖQÂBÅ: ›]LÅvìì+»RÅvÔNá®R±é^,âÔ»FŪG’¹+Ã.x±w'÷b}Ô¥ñuu‘(@¢ €º‰‰‚Žù]‚̧CY,›œ‹mX¬4uj.¶a,;‹…c³ÎÅŠ s DzXç%ùÀ-ÕpĪ‚Xì¨ ~D ‰‘Òu)ÝÌ$ñ„Îp‘}¨þû}Å’2/÷²¼~›}¨>§þÝu!ÿ(«ËîqÏ xEœ‡Õ±ÚpŠ®”išbÖq)ux¹V¸=OW=”þ>zßmí™'6¦'¦w¥[E*‹aŒ,:—Ô/½L{¹¸ï?|B•’¿˜˜;’)ÎñW•S²(úï%‹Ëþ[†Õ71D¢üÙs,D1gX'z¿±Úk`(ž(àØ÷|V{ÚHËÿStÖ*…{Ðúí.P ß ó7‰!ÓˆÙ‘îü±êùèòëg«ZR?u©S‡óæÔaf3N³ s/~s+åܧ·ç„\Q?>£ šß°if]»Vøƒ3by'kÛf³B­…Ä÷,ûñä¡B¼ÜTå>¬…Ä­åçÕyÃ<{”A¾ÜX¶%8Ç­µºæÌ:iu=ØTâJõ¤s{žXÊ<±æ;ÕŸq=4ÜTâŠUÀÌë!Óf´Ò§ &ò2Zzùõ¶¥l—˜oLÏ_OÈÙB5ÚßæÙYÓfgà‘Fµù¥Bçšm&î’´3/ÜÝÇ úò£0—Œ¦Dv\b挞Ý0<Ä’ãò£ÐÍçùÏ“/m Je‡18EÐ!¿YØü¢ßxâî±7u%27^ÑÏݲ±Ä™U\tëg”É(û-]ì“…Ý Ù‹%)ý&”pwCõ‚ݘhïˆ&ºé†êqµ’èOz7º^˜Sûˆnt½˜[&0÷ ¡1§ :F7T/.¾ÓOçé/uå‚{`,­ZRÃb¹‹÷•í\À¨á=ËÝ^K­Í*|[jw„%_O„I_QVÆ7¡ÖÓŸº3ãî”ZãUЯyçh‹èŽ-Ä×ññxÇ—¾vÖÛ1âÄ;ªcYã¼wuŒ¸ÛY_>ËûcŒ¸ëyçh'©Å™'B†ÙrO;$õkþ{ÐFõkAe.e¿žu¨5Ôܼ\©³ÕCâ*Ñž29é¤Ï!Ä‘ÎÛ‹±XL™ôwpùûÊ—ZwÖ}¦Ö×UŸ§'¢ gWW§fE` «ÖÕ…·"Tïêj‚'ÕŸU+¦Ü?Zצ˜rÿ`]b:$¡ªõt!z)´§ëp—T¿6rÎKc`UÇFúLŒÁ;§‚à}Ö×JÙäWc·¿ÏëËe†²{¨Ï Ê.p^Û”!}éòÒ’¥ÖAõz˪jaµü½_õIªÂ|í”ù íý:xŸ ÑäV‰ÜâÞžrÐ{€_·¾WÈoõ¹´uÛT÷à oåê¾ÔpVI˜ ¬Í»Þ^´4),?;%ܾŽ÷IbXA’¹ð’aSé¿4)lAAÊ‚Ïâ ¦8Ä;xâ8ßzxy4MaÊcž%ûdy¬Ò’æiãE.´ºü0O+ 5²ËćàÉÒ=.MyS˯êTìPä ¦8Mxâ¸ÜÒ§­ÝºcîÔ¥›Ì\”Yol؇ÑVy"|T§`H1f“ eï qíðò Ð,}Á­câ³|åÐï;1ΤTrY‘«Þ”ˊâ2ëû±ŒÃL×@I“ÐF +*¡M:~¹òK½ÑϺ€ ¨­Ìµ- }+èé=]jâPa¹[R›Nä›oŠŠ8ÃN‰ju{—¬0²n@ ¨¶ù8hréÚ$zmÄ6 žm¡…Èl»©ÇÂ+3âM–G´YΡ ó˜D´.³µp?(3ø™‰âÑÄämi‹½r¿FS2#.ÑÄ\MpÝ7ÇäYW%±rÃa}Ö}…I%²R ¨yËÊU@¯èµBIÏ/<¸l¶ðzç8HoHx›N5u=–ðˆc(”ð(màj›÷®q͸Ub•Ï Pà [B¤"ZŒ¶Q°(Âý¾)^Œ°Å"0LFŠãÖÖ°Šœ@ô˜ÆÌ¨µüŸ¸ªNNn©Æú‚¸ªqkañÁ%E‡1•a ±›ÊHSŒB®ÑR´…¸žtÃR'7òaøŽ‰¾ãu_f7*Ê08M¶:õÖx?š<•8á”g&=ÿny*qCž[«Ö8hÂSÙ·%È5jÑPÁ‚°á‚Íc ÁFvÁž¯ ‚=½`šÕnc62ÕÙ–0ÂKÂáÁ¡/΃rkUT<æ‘HyƒË*ÿ¢Ë:ZÔHlÙ¢Ö©(¹ä3!"'¦"Ùnåe1(sJä9æddÞÔ)VäÃQ„‡oâ”}àììˆð)Hú#ÂG¡†-|q $“úÐõ¦ðcªìýÂ'®sÓUo¢È°/|ê,-ƒú"ýáo6^Ðúðë-áŸÚ¯gh}bÎÌ¢tÅM}Jp7máSˆôG„¿î*¶ºÌ “´ÊØŒ äpNšÃC`§t}( nàš(DùŸÞÁ•4Jލè$è¤Ü(,M') “,Ü(œÏMRÌWéè‘AAiphh Mg ±ž* bÚŠýNögóûÖ6 ³z*) d“L<˜Ù$çð D<48ËJŒá1r¸ÓÞ‹‡¬ùDÌù¬ÌyÞ·0çÙ…Íù¡/r‚57FÇÔÖ|ÀxP0æòB5$ ‚-7ÇÙŽ’†)Oã<¦Üz á¡ÁS.EÍ6å9"s ŽÉ—Íú#Dæ"s'ë¶æ™«¡ás~®D;"ó9™smÞæÜS›ó²/û[yçA©XÌš÷†É”³æÀˆ‘ë[L`BWÞ#|)GxdĨ¯ˆ 6\1Ùp%˜âÓô;#÷€¸xvFV(ÜÊg"Œœ Œœ@„`t,„&0:EBð×.寉|Ì0B(¶š|Ñ‚!$ ,„.“ów"DššKDKM„’v϶¢1o;!Rƒ(!lß{°"9†!3m”œ™Ö¬…„CXÏ k=—ˆÔJˆ°ë’Щv]ŠI(`24 “Ö6ñ"Fù€B{Ø îa“Ž©A”޶Z±êmµ6EA­¡ók©A”Žfl„3!I9!L=˜yê!ÆaêÁBhªùîq„0õ`!4ÑÔCÙ‡ãV>¬#EÖ`ŠG éS©¤Ü,¨ˆ›d@È + Ô8wÝ̃gX…B…`Ö„êäÁ였 ù´yT·Â€jÊŠ†¨0-kAu ¿¢ÔpQoa-äÈjÁе´(Ì­01›à„¼PÌ -Ì.V²baF\Êщى”ãÁ…tãœucŒjD:Ê‚ìªÑ=Êà6šÍI3F¹ Ì MÌ&8 nc´(Ì.R+€Tê%mÀ¡vf»S×Έg¡vq4Á›|ÈÞ æb,ðæ9“4ô°ˆ¼ —Ȇ±Cd`b7§È`<̵™àÍh®mÀæ)ðˆ;òš¦`=Š=Jímwèa—j'xç¯o,ûHå×êVEÌÌÚú‰/Góþœ0R8ŽXcâx‘ƒcâ‡#ãˆÅê&ŽgÛ½³€‰j‹8äÅ¥œœC6áäÌÚÉñÇðÁÇDqjg`0R0ŒpqL'wqÒ"¸8Œpqàâ°]œÈQƒ‘؈5ŒŒ#|G$r"‡ãœ²Y~­ž©ð”‰œdýÚBÌÓ¯(b“ž#ElnD @Q%%ÁR ™c•”°˜AˆZ€bͺè Ö¬Y?ŒŒC;"ÏЊ*D @éa ¦›³K…)£J—ÒÕEH^œ5áõ•^p ¢¨ç1=G=O™i 6¿VÇTlîÜǶiÈÅ]¤f°ö‚Ðdp±µº î R¹ûzÄW a¸8ØÀ7ù`ƒ¦¢¤CøàÞ*-€Õví…jÈ%6i0M.1Ám›‚ ¶nÓ Ìw»Ü)bc‹CµLl§^1Ô·¸¶Á%&¶íæa‹E)&¶‹R|ãi¨¤¡dä·ù–¸àŠÌSu&¸#Û”¹¼)¸¢)Lp±ƒª îywP͇M®.rÉ&¸ È%G§1ßÞW¼ƒîYæÛKGõ áõ áX˜a†M˜a†c`&5œÓa†+mÂ|fW:Fi#^l8\„Á, «Ñê`^\Fke䤗Ÿ“F³J6ÊKœUò:`˜^Ó̰3œ¢n83`&néª;œ0§Tw” ·]VDšÄÆ›Ìq€7j,M¼O°gZ)ÛöOœ¸y1d?€Ÿ:ûY™9ăÇ,¤øüS'­åq×òã®Ö#÷§Íø¢¶\÷Ú(݈ci?àsÚœ!gq869²ŸílfcÄ1²ü™C ÞH£Úx/1êÛ˜‰—æXià}ùÊIWù5–φy,Àid„O}"OT‰”&9?[iR©c«n†1A~‰Æ¼ðAÐÜ‚~u¡ùÁƒ} ôؚφ~þ™ö6+=Ê#ÖTáôÄöëë 0o…¿wb…<ê«ðÛ ?ÛœÂ/u”Û‡(uük ö¬LÍJÿPKcs WKãfA °7¬ƒ‹ ö  èªà=/D\{XU`³ „KTm(UÐd«ª ‡WUÃ+€*e[PÙ†UÁÁÃh›«Õ> ,À&A–¨@ SA´ÓÞ½%^Q–ÁÔ Zl˜w© Ð >øé@|ðÓX5’̇Û|°é …¼;'€>:`Eï VôúÌEÞßp‹éBboS“ó] X òÁG¬%Z§¹8H¼)Š>6¨IÉÖ¢¾ ®µÀîŠN6î®8¨o°Ù°Ú|ƒr&ý|ðÒAæEKb I æ6 ±ù è`„šÄµÍq­ECŠâƒ‡ØhÀ¤ÃðF¥¼z‚Œ1=±î £e†N ,qÌL±¶/¢â5š:1pð³]5dñ?·¾…¸—R™Ñ'¦¾› Kœïjƒî^¥×à:TƆüÏ<Ð͹-žŠ=ï²Å8 yš›4[»zH"r[1l^,:·e;˜@Ï0.§DúÄèó‚ÒˆÍñ—¿ƒCÞXÇL ¦Íš ë6c$¹¤k‘ê}âÈy¡ƒÒ˜¡ƒdNÊ ¾ûù®ÝŠç~Öê„ï~¶‘ ÜÏŽŒ©UÕ~ús'R[iÌèCnÿ³#Æ„þgip@½°Ç5ngâjYZÕV1ÌA6äÊ5Žl.W~åHó­Ì•'säö$\lD[„qDÒÇ‘V£`¹Y#MCf½Ü,Š#(ÿrp¤iȺgßöÑiÚ‚Yfº#«Í‘µo,GúkU˜sµÄäH#{ÓãHÓ{SêtèÞ …’L–õ*[P ´5¥­CŽe ‚[Öô´ÎJ [P°Ý4Ê>‚-H̺ز¥Äl ß‚ú˜êy/ÓoClÁܱ“-[œ;> ’¥e“,ØWÐA–%®³òy-•›ó‘…P¯´¦z%[³¨rùt²`“)“,ëØd*—á³äHt&K´ز¶%Z>î8[T Ãb éÊ“Dó›$ŠÊ¶8ØBüÒ„æ-˜%2Ø2ÏY¢øL®b f‰¶6KTêÄP?”.RºoœÓE£¼‘ …—QžŽz$…7Ä ª%ohHß„òf³˜Ö•±yCœˆIñ†âk/of_-1T|­Cͼa“7ÆÉbÑþ |´ÙHC m0é¤Íg#½îMÞËrçš°5“‹7‹žk2Â)â¸7Š7Ä^?д oæ4‘PêQ?E ,ˆÝ®£#4O ƒP'Ûe1H,»ïq$M é ”•ƒA« Ò…ÛœfÆP4Œ¢á÷m~pAÈ0#Ã<À eÅ(^9¤jYVLúÔ<+†©t“@g™JO3bÈ: ´Åì¡îH›"ƒ°ùª“A¡Zßæ«Ü|лöx"…‚D eòA&ƒB>hÎù Ò KoMDºK])TZÿ®mXß'Ó—0ÇêäôRkÙT;BÈ4Ê%:›$xÂWLB&(&‹L£\òn—Å4L&(&›L6—Jƒ6½"×t ….Rmh…F;§Ö§•“U2ÝF+¬E ×Uë\‹jk+'­|¬"¾ |‡³¬Z´ lã¼.Ú¥•‹UÄ® PTcÛ@9³رêü6ð`ÐÆG*Š`•ŸTس{&0бòª*dÍa-Ue“ A `ŸUnRÁÂN^ÒÊÃ*Ä€°€¶®B 8B+7«B6Gt„V°&­Böäƒ Ì`O_£˜Ážr·6ݵ‚ tÓ 6Фհ ,0ø~HY¥—Ã(6ì:…Â0†Xe%/4zmq•Uë¹÷ Öç¥ [ª8 ¦ñk+Khl Ö'˜Î/l—áR`Ø.CJ½ã—yp Á ~I?Å±ïø¥\üǾã–‘¾Ÿå2Ò2ÓSªAQLkõÒ 6Ý 6Ó¹`ÓÓš†\|ÓÖëJ:Õ°¿ ¨6Hµ2Õ@5yqVª¨ªÉ‹sRí ©Dl¦á„K0MJ]ŠHö'“ª`˜–i`Ú*˜ë ¦My>4BPíüTCô ª!§ª­‹j˜)Õ¦¡Z_ T›ˆjðÕ@µ‰¨_ T›†j¥$•L«u§pN•§sŽp¦É9R¤KçÜœNÂiŽVI¤Ãéò’Oª!¨ÄµH׫ĽΒI‡s¦ä…F:œ3e‘Î8g*‘tØðLBKª×¨æ»¸‰”R:9')Wc§œÊMÎwã0"ä»mv6š³ãaمهßW,)órÿ!ÛÉë·Ù‡ês’ì>üúÿ=ÂR Ç golly-3.3-src/Patterns/Self-Rep/Banks/Banks-II-demo.rle0000644000175000017500000000364213151213347017456 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Three-state, five-neighbor CA for a universal computer. # (Appendix II) # # While Banks's Appendix I rule (Banks-I) required an infinite extent # to be computation universal, his Appendix II rule seen here allows # a construction to grow its memory space as required. # # At the top are shown various wires and signals. Two signals that # collide head-on either annihilate each other or pass through each # other, depending on their initial separation. # # Below, junctions can be used to fan-out the signals, and for making # turns. Where two signals meet at right angles they pass through each # other (crossover). Where three signals meet they annihilate each other. # # If a wire ends with a single cell as shown, a signal causes it to # extend by two cells. An echo signal is generated, though this can # easily be destroyed by a second signal if required. # # A wire can be extended at each end by a bouncing signal, for a bit # of fun. # # In the lower-right is shown a repeater-emitter reminiscent of # Langton's Loops. Two signals are sent around a loop and down an # extender wire. # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 59, y = 85, rule = Banks-II 17.25B$17.2B.A17BA.2B$17.25B2$17.25B$17.2B.A16BA.3B$17.25B5$14.3B$14. 3B$14.3B$14.3B$14.3B27.3B$14.3B27.3B$14.3B27.B.B$14.3B5.3B19.BAB$14. 3B5.3B19.3B$25B19.3B$2B.A21B19.3B$25B19.3B$14.3B5.3B11.19B$14.3B5.3B 11.2B.A15B$14.3B5.3B11.19B$14.3B5.3B19.3B$14.3B5.3B19.3B$12.19B13.3B$ 12.19B13.3B$12.19B13.BAB$22.3B19.B.B$22.3B19.3B$22.3B19.3B$22.3B$22. 3B$22.3B$22.3B4$18.22B$18.16B.A5B$18.22B3$18.22B$18.B.A13B.A5B$18.22B 4$26.7B$25.2B.A5B$26.7B3$28.3B$28.3B$28.3B$28.3B$28.3B$28.3B$25.9B$ 24.2B.A7B$25.9B$28.BAB$28.B.B$28.3B$29.B9.3B3.3B$39.3B3.3B$39.3B3.3B$ 36.15B$36.15B$36.15B$39.3B3.3B$39.BAB3.B.B$39.B.B3.BAB$39.3B3.3B$36. 22B$36.23B$36.22B$39.3B3.3B$39.3B3.3B$39.3B3.3B! golly-3.3-src/Patterns/Self-Rep/Banks/Banks-IV-demo.rle0000644000175000017500000000473013151213347017472 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Four-state, five-neighbor CA for universal computation and construction. # (Appendix IV) # # At the top are shown some wires, signals and junctions. These operate # in a similar fashion to Banks' first three CA. Junctions can act as # fan-outs and logic gates. # # Another type of action is possible here, however. A 'compute' signal # can be converted to a 'construct' signal which passes down a single- # cell wire. # # Where two construct signals meet, a new arm is constructed to the # side. Further construct signal pairs extend the arm further. # # Each time an arm is extended further, an echo signal returns. If the # timing of this echo and the next construct signal pair is correct, # they trigger the creation of an erasing wing. This travels up the # arm, deleting it and then depositing a new cell at the end. # # Below are shown four examples of erasing wings travelling up # construction arms and writing new cells at the end. These show that # any pattern consisting of cells in state 3 ('x') can be constructed. # # To activate the new construction, a method is provided to convert # an erasing wing to a compute signal. It leaves behind some stray cells # (garbage) but this can be cleaned up if required by writing some new # cells and then sending a new erasing wing (bottom-most example). # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 93, y = 112, rule = Banks-IV 37.3C$37.C.C$37.C.C$37.C.C$37.C.C3.3C$37.C.C3.C.C22.C.C$28.10C.5C.3C 20.C.C$30.BA6.C5.C2.C20.C.C$28.10C.5C.3C20.CBC$37.C.C3.C.C22.CAC$37.C .C3.C.C22.C.C$37.C.C3.C.C22.C.C$37.C.C3.C.C22.C.C$35.3C.5C.3C12.9C. 10C$35.C2.C5.C2.C15.BA4.C4.AB$35.3C.5C.3C12.9C.10C$37.C.C3.C.C22.C.C$ 37.3C3.C.C22.C.C$43.C.C22.C.C$37.3C3.C.C3.3C16.C.C$37.C.C3.C.C3.C.C 16.C.C$35.3C.5C.5C.3C14.C.C$35.C2.C5.C5.C2.C14.C.C$35.3C.5C.5C.3C14.C .C$37.C.C3.C.C3.C.C16.C.C$37.C.C3.3C3.C.C$37.C.C9.C.C$37.C.C9.C.C$37. C.C9.C.C$37.C.C3.3C3.C.C$37.C.C3.C.C3.C.C$35.3C.5C.5C.3C$35.C2.C5.C5. C2.C$35.3C.5C.5C.3C21.C$37.C.C3.C.C3.C.C10.15C$37.3C3.C.C3.3C11.BA12. 16C$43.C.C16.15C$43.C.C30.C$43.C.C$43.3C7$4CA8CA9CA12CA15CA12CA9CA8CA 6C$3.A8.A9.A12.A17.A12.A9.A8.A10$16.7CA12CA15CA12CA7C$22.A12.A8.C8.A 12.A$44.C$44.C$44.C$44.C$44.C$44.C$44.C8$35.A$36.A10C$35.A3$35.A$36.A 10C.C$35.A3$35.A11.C$36.A10C$35.A3$35.A11.C$36.A10C.C$35.A5$47.C$46. 3C$36.A11.15C$37.A10C14.C$36.A11.15C$46.3C$47.C4$47.C$47.2C$43.2C3. 15C$40.A21.C$41.A3C3.15C$40.A3.C2.2C$47.C! golly-3.3-src/Patterns/Self-Rep/Banks/Banks-III-demo.rle0000644000175000017500000000177713151213347017576 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Two-state, nine-neighbor CA for a universal computer. # (Appendix III) # # Here Banks shows that his previous 3-state CA can be implemented # in a 2-state version, using nine neighbors instead of four. Wires # and signals operate in a similar fashion to Banks-II. # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 89, y = 54, rule = Banks-III 30bo35bo$52bo$6b2ob26o14b4ob30o$5b4ob23o16b5ob30o$6b2ob23o17b4ob30o$ 31bo$31bo34bo5$6b2ob23o$5b4ob23o$6b2ob23o6$6b3ob22o$5b5ob22o$6b3ob22o 4$14b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$15bo36bo25bo$14bobo34bobo23bob o$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$3bo8bob3obo8bo21bob 3obo19bob3obo$3bo10b3o10bo23b3o23b3o$3b25o14b2ob18o5b2ob18o$2b27o13b3o b17o5b3ob17o$31o11b2ob18o5b2ob18o$14b3o34b3o23b3o$4bo7bob3obo7bo22bob 3obo19bob3obo$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b 3o23bobo$14b3o34b3o24bo$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o$14b3o$ 14b3obo$12b5o$15b2o$16bo$16bo! golly-3.3-src/Patterns/Self-Rep/Codd/0000755000175000017500000000000013543257426014374 500000000000000golly-3.3-src/Patterns/Self-Rep/Codd/signals-demo.rle0000644000175000017500000000056613151213347017376 00000000000000# Signal-trains in Codd's CA # # Six signal-trains are shown, travelling along a wire. Their functions # are listed here: # # 4456 : turn left # 5546 : turn right # 76 : advance # x = 27, y = 15, rule = Codd .24B$B5A.F2A.E2A.D2A.D5AB$BA23B$BAB$BA24B$B2AG.2AF.6AG.2AF.5AB$.24BAB $24.BAB$.24BAB$B4A.F2A.D2A.E2A.E7AB$BA24B$BAB$BA23B$B2AG.2AF.6AG.2AF. 4AB$.24B! golly-3.3-src/Patterns/Self-Rep/Codd/coders-demo.rle0000644000175000017500000000126713151213347017214 00000000000000# Coders in Codd's CA # # When two signals collide head-on, the result is a change in state. Here # three coders are used to successively transform a 7-0 signal: # # 7-0 -> 4-0 -> 5-0 -> 6-0 # # In Codd's CA, 7-0 signals are the main carriers of binary information, # for logical operations and computation. For construction, they can get # transformed into states 4, 5 and 6 using one or more coders. # # Signals 4, 5 and 6 can get transformed back into 7 - see gates-demo.rle. # x = 44, y = 10, rule = Codd .5B$B5AB$BA3BAB$BAB.BAB5.3B7.3B7.3B$BAB.BAB4.B3AB5.B3AB5.B3AB$BA3BA6B ABA7BABA7BABA9B$B2A.G8AB9AB9AB9AB$.11BABA7BABA7BABA9B$11.B3AB5.B3AB5. B3AB$12.3B7.3B7.3B! golly-3.3-src/Patterns/Self-Rep/Codd/golly-constructor.rle.gz0000644000175000017500000001257713151213347021151 00000000000000‹‹¬5Igolly-constructor.rleíœÝoÛFÅßõWpÑéb5RR»)¶‹uÛD»À>Û>,öMµéX­-’Ü4ÿ})Ù—¿ï çãÎÌ’Ò¼¢Æ—?žsfH©ùìûÿý÷?o³7»o_Ì_½9Ÿ?ñj6ùlòY¶ØÜÞ~Ê.7ëÝ~{¹ßl³Õ:û~suõl—}q<äÿ›ÍÝ¡ºYgû›<Û®Þßì_Ü,×WY^üÝ\«·«už}ñëýnŸí?}ȳgw³gÍíò}1ÈᘻååÍá°íýz½Z¿ŸåâÏÏ7«]VüYfWùݱå~Uü®ÇËÖµËå‡å/«ÛÕ~•ï<6ZŒ2{söuÑð4»XOçzõþþi Ëüövw8‡Ý~¹Ï³Ù±±—Åpëì—üðöò·äW‡Ãö‡ž®—»›âýÓ#„‹ë}¾­4ó<ÛÜd»Õûõ²{¹Í‹7þš?ްß›_ç³Ë}ñÖu1Æý®8ëcýáÈCsÛü2_ý^ ýÅífóÛ®àø[ïo»ÕîÛÍÇ|ûâ6¿Þ?ô¹]çÛi-Ï®WÛ‚ö®¸xg/^>6Sô²¹/ÎïðîÇ_þ<ÛÝäËâ¬Öï‹AVûl¹;ü÷ý&ßM.Àò¶øE»Ó÷dÅ9pîwÅ ]º8¼´)þ³-Fx<ë‡>vyåê䜎óü©Ÿ7«Ë‚}¯ºeYþûázÔPM³#ò?^‡üå݇ۼÒÛUÑùúپؗòÓñÄ#_ßß>?œØQ‡Å¿ . ©ì6wùÉ¥*ñ|Ül¯²gG<{¸Î?åù7ÙO—ÛÕ‡ýîË‹‘7ë/ï–¿å/R{qâ“é‡OYÜGl¿É~^Ýeÿºßÿû~u7½9þüÏ÷wËÕíôrs÷bð?²o³G÷eŸŠŸ_ÍžV(NìÛ£Ž'Åkgç³éÅìåôâüøçóCéõÙôë‹×Ó7Åß–—.Š?¯•‡—']¯Ÿµ½y6;y+½8é}µëÅ7Õ—&O¯vË×^ÌOßYyõüpÀÉ‹“ÞW‡_¤SyS¼vøu±=À|xÛWÅaó§³k­Mº|ýpòlz6{:böò8Âùìì»ÏçÓw'ßÖ~þ¡o2pÀ»¡û““ÂâñﻯNŽXœ¼H#¾=iõXŸ´¸¨ýZ¥VO¾å\ßR'õ-û}.&Ö·½µu¢¼?;Àœ!Öþ˜«&`’ª±˜ Ó¢>ÈЃ[n²õnûÒ8ì.¶äb0“0˜PÅDi¾9í$áŒE'Ñzy&`ÒÎ„ŠœÓJWžTæ•–×SÎØ„:‹]¹LÀÄ :ˆ3À¢Î„u[Òvœ÷dC';IÅ;È0I„ 9à.ômáb_.01Á„j,&é c[™ ÂL6t¢0 $êä ˜„É„j,&J©Ïy¦N²¡¤½\ƒ ˜´@5­5ý<ÊdK¹xGaLÀÄ6ª±˜ †x}­%z˜É–@'2 ƒI¢LÊA8oè ëÓ<Ñëx’-¢Nàž}0ÓL¨Æb2¸‚®½çïy"'ÙìD¦báb0‰ƒI9ç Ù[w±Ö‚8±d“Û ¼ÃÜ0aì#cÑ k=+F±p1˜ÈdB5“Î,­mË( /ORìÞAž€ {¿„ó†ÞÈÄg^¡u¦báb0q„jøîV:À;È0)÷©Æb2µA*ÇEš'át‰báb0ÑaB5¥¤›0Œ0OäuïXò˜HdB5­µ[ây⯓H ƒÉi‘3@#¸º¼SI®–×SÎëÀ;®¼&˜ÐAœu&¬¥UÛqÞ]a'©(.Ž’ 9`¥$±xÇ—wÀD ÕXLÓ±­äM˜.–ßIªŠ…‹C`Òš+øôMp'ðŽï€ÉSÅDk]2ÒŸߋbRƇÉ`LÔÑZf„ébkÈÐ ¼““rÎzãàÔ;Úq‹GwÅÂÅÖ˜PÅDùfÁ»w丘݉LÀ;!2)ἡÓÝuÅjMꉹ˜åj(Lûp±ïNÂÐ ¼# ÕXL°¢6Ø  wì—ƒpÞÐkJ<Ýâu¦Nà L¨†OšlwÅ&ëâÒd&ÊËÎÓz¤Þ:0À; ‡‰’—&Œ#ôN¯‡ Ø˜´z¦‹‰Öü“ؼ©NRôN¯7æM+Tö»tÒº6ëÚÆá(6X+[€³R´€wÅë$Dàe©Ÿî'œöP¬T÷*kû¦’Õ‰<ï´*Or XÎ>žÛ P,tâÈ;¥ñ)mS€Þ¯N„Š-ἡWp§:Ñœ÷¹:1䪱˜(O©ÞuÂV¬Ì«#_±©ß:N´sEÌÕÁ¼c['q¸ëX¦N¼:£çÒÕ‘Þ'ââò2ö Þs¶H®ëj…ûÜÞÿ+ê^…ó9 ÅÚ¿:½ô‡à{ÿ^Å*'›2dNž BŽôuXŠuÃ$ŽŒÅªÀ–§œ¯c­x§L]Ì;#¯ŽûyÇ‹‹±Ží¸ìÖ×±2]Üëj܇êâÊeìЊ‹Ùá|ºí»:½áÜwu™‹å¯ÁL´˜PQãÉÆN81ÏÙЉF'ÈÍÁ$&T”ÁD+¤ç ³–¡‰%›³NbõòÄ*Ê`¢Ht:£i.ÉÅø÷¨ábcL]î”I¯ËÃxF-ÏÅ𼓨wdèDžw:•Ç'’¥r ¬ÖªÑd'øÌKC'½‰6æê4ÖüÆ’-Ñ‘D²!ÙlÔ‰Üd“§ä‰!&y“E‰uïôÆ…lîD†b#t±– Å0YÔ™XWl§ åzGËCr‹u,Ö±]t`E'x§Sêa0aKýt+óSÚÑi/ïêXQ,+¼ÃeÒªh««¥ðvr—áD'“ŠÞ¼3ŠIE¹NtÂR.kN±ŠH{%&½«+:ÑZcU0¬“йŠa’ÒS ™W§W?ò“­7ÉT®[?t:Æ+#O›‹ÁLœ0¡Z$LÑéìIÎàbPÞ3%tÂïy¢9 ˜„À„Š‘0QZA×·‘~‚@'ÈÞI„ Õ"aÂJ¼HŸ‚ÊO6¸Ø’‹ý3aåH8L”VNF½£•#V:qž'ê$ŒÒ¾s#÷.`.nÛO(OÀ$&T“‡ŸgÂïwä¤}Ä$àÁýó$&T“'×Wt"'Ù:靖w"‡‰³N'Šû 3¡˜WÐIÞQ^†:OûÎeh¤Š•½>0 ‡ ÕÀ„7@c6»¶ïœœw"‡IBÈóòL"bBE0ὡ÷FJVÆjMV:‘Ã$œN"ôòLÞÕŠ`Â{æ¨ÓÞX'ðŽâ~ÂL¨&Lô†0gë,O38¼d3ÞI ŠMÔÅT¦Nl!$›À;f˜P L˜:Ñ (/.n (™yb¬(6TS L˜:ÁJI@ÆÖ·uï´3¡"˜ðt2˜7b\,ð_²5Ί9€5&Z¹9­\“'‹:X­\Až Oûå `ÂÓÉຄ¶Þó¤Œïà~'ød£˜ðö+1!Â;.V^fÈÍ“ðt¨wXqVÈõŽVÈL6¸x¼b[™°lŸö*`.Ú;Ê«khÝ̃։ïôš3Q&½ælû®…Å*{‡eN§ybýêUl¯Ée‚Ðp'‰è„í¥„˜°½$Ë;Z–ÕNœ_7Še{†öãZ³)»¸uþ‘éíùŸª4­~ÚÛ÷NïÚ¬këÅ;­Ö°Ú‰ÿ«£e|š¯æb¶¼?·/-`½“0tB57: ƒ ÒžÙ‰¼«Ó4gÀÈ;ô¬í¡íŽÀL‚`B50ÑÔÉàÂÇûھщöta¼9Lê.ÖØ0á2¡"˜èé$ ;/í;°ç¹ŒV,\ &r™P L4uÒ:!©l'[ç|„´wЉÅÂÅ¡0¡ƒÀDo€2›ÃÉÖÍ‚ÌdsÑÉwŸÏ_½9Ÿ}÷—ÉŸ Lj»golly-3.3-src/Patterns/Self-Rep/Codd/echo-discriminator.rle0000644000175000017500000000541513151213347020575 00000000000000# Echo discriminator # from: # Cellular Automata, Edgar F. Codd (Fig. 5.13, page 78) # # The 'sense' operation is used to read the 0/1 state of the cell # at the end of an arm in Codd's CA. It returns an 'echo' signal # 60/70 respectively. The configuration shown here can be used to # discriminate between these two echo signals. # # Set the machine running. A periodic emitter in the lower-right # activates the machine by turning on some gates. Later signals are # blocked, as the machine is now waiting for an echo signal. # # The first echo *must* be 70 else the machine doesn't work. Stop the # demo and manually add the 70 signal to the input line at the top- # right. Both the lower two output lines on the left emit a signal, # indicating that '70' was detected. The machine then resets itself. # # Now manually add a 60 signal to the input line. Notice that now # the output signals are seen on the top and bottom output lines, # indicating that indeed a '60' signal was detected. # # The input signals must be well separated, else the machine fails. # # See sensing-demo.rle for a demonstration of how sensing works. # # Adapted from a pattern originally distributed with XLife: # esr "Eric S. Raymond"@snark.thyrsus.com Thu May 11 07:41:55 1995 # x = 119, y = 57, rule = Codd 69.30B$68.B29AB$68.BA27BAB$43.26BAB25.BAB$42.B27AB19.7BA5B$42.BA21BA 3BAB.6B11.B13A$42.BAB19.BAB.BA2B6AB10.BA12B$42.BAB16.2B.BAB.BAB.BA3BA B10.BAB2.B$42.BA11B5.B2A2BAB.BAB.BAB.BAB10.BAB.BAB$42.B12AB4.BAB.BAB. BAB.BAB.BAB10.BAB.BAB$43.11BAB4.BAB.BAB.BAB.BA2B2AB10.BAB.BA5B$53.BAB 4.BA3BAB.BAB.BAB.2B11.BAB.B6AB$43.11BAB4.B5AB.BA3BAB14.BAB.BA4BAB$42. B12AB5.4BAB.B5AB14.BAB.BAB2.BAB$42.BA11B9.BAB.BA4B15.BAB.BAB.2BAB$42. BAB19.BAB.BAB18.BAB.BA2B3AB$42.BAB20.B2.BAB18.BAB.BAB.3B$42.BA25BAB 18.BAB.BAB$42.B27AB18.BA3BAB$43.26BAB18.B5AB$68.BAB19.4BAB$69.B23.BAB $81B5.5B2.BAB$B80AB3.B5AB.BAB$59BA11BA3BA4BAB3.BA3BAB.BAB$58.BAB9.BAB .BAB2.BAB3.BAB.BAB.BAB$43.16BAB9.BAB.BAB2.BAB3.BAB2.B2.BAB$42.B17AB9. BAB.BAB2.BAB.3BA7BAB$42.BA11BA3BAB.6B2.BAB.BAB2.BA2B12AB$42.BAB9.BAB. BA2B6AB.BAB.BAB2.BAB.11BAB$42.BAB6.2B.BAB.BAB.BA3BAB.BAB.BAB2.BAB11.B AB$42.BAB5.B2A2BAB.BAB.BAB.BAB.BAB.BAB.2BA13BAB$42.BAB5.BAB.BAB.BAB.B AB.BAB.BAB.BA2B17AB$42.BAB5.BAB.BAB.BAB.BA2B2AB.BAB.BAB.16BAB$42.BAB 5.BA3BAB.BAB.BAB.2B2.BAB.BAB16.BAB$42.BAB5.B5AB.BA3BAB5.BAB.BAB13.2B. BAB$42.BAB6.4BAB.B5AB5.BAB.BAB12.B2A2BAB$42.BAB9.BAB.BA4B6.BAB.BAB12. BAB.BA4B$42.BAB9.BAB.BAB9.BAB.BAB12.BAB.B5AB$42.BAB10.B2.BAB9.BAB.BAB 12.BA3BA3BAB$42.BA15BAB9.BAB.BAB12.B5AB.BAB$42.B17AB9.BAB.BAB13.4BAB. BAB$43.16BAB9.BAB.BAB16.BA2B2AB$58.BAB4.6BAB.BAB16.BAB.2B$59.B4.B7AB. BA18BAB$65BA5BAB.B20AB$B65AB3.BAB.20BAB$67B3.BAB20.BAB$70.BAB20.BAB$ 71BAB20.BAB$B71AB20.BA23B$72B21.B24AB$93.BG22BAB$93.B.B20.BAB$93.BA 22BAB$93.B24AB$94.24B! golly-3.3-src/Patterns/Self-Rep/Codd/echo-switch-demo.rle0000644000175000017500000003476113151213347020157 00000000000000# Echo switch demo - Codd's CA (Fig. 5.12, page 77) # # In this demo, an 'echo switch' is shown, connected to a tape head on # the right. The output of the echo switch passes into an echo # discriminator, which emits a signal on the line marked 0 or 1 # depending on the cell state under the tape head. The echo # discriminator also emits an echo receipt, which in this demo is passed # through a stack of coders in order to advance the tape head by one # cell and to read the next state. # # For the pattern to work correctly, the input signals must be # sufficiently well spaced. The first signal must be 7, and the first # echo must be 7, so the first tape entry must be 1. # # The other demos in this folder show components from this pattern. # x = 370, y = 659, rule = Codd 128.29B$127.B29AB$127.BA27BAB$102.26BAB25.BAB$101.B27AB19.7BA56B$101. BA21BA3BAB.6B11.B64AB$101.BAB19.BAB.BA2B6AB10.BA62BAB$101.BAB16.2B.BA B.BAB.BA3BAB10.BAB2.B57.BAB$101.BA11B5.B2A2BAB.BAB.BAB.BAB10.BAB.BAB 56.BAB$101.B12AB4.BAB.BAB.BAB.BAB.BAB10.BAB.BAB56.BAB$102.11BAB4.BAB. BAB.BAB.BA2B2AB10.BAB.BA5B52.BAB$112.BAB4.BA3BAB.BAB.BAB.2B11.BAB.B6A B51.BAB$102.11BAB4.B5AB.BA3BAB14.BAB.BA4BAB51.BAB$101.B12AB5.4BAB.B5A B14.BAB.BAB2.BAB51.BAB$2.2A97.BA11B9.BAB.BA4B15.BAB.BAB.2BAB51.BAB$.A 2.A96.BAB19.BAB.BAB18.BAB.BA2B3AB51.BAB$.A2.A96.BAB20.B2.BAB18.BAB.BA B.3B52.BAB$.A2.A96.BA25BAB18.BAB.BAB56.BAB$.A2.A96.B27AB18.BA3BAB56.B AB$2.2A98.26BAB18.B5AB56.BAB$127.BAB19.4BAB56.BAB$128.B23.BAB56.BAB$ 140B5.5B2.BAB56.BAB$B139AB3.B5AB.BAB56.BAB$118BA11BA3BA4BAB3.BA3BAB.B AB56.BAB$117.BAB9.BAB.BAB2.BAB3.BAB.BAB.BAB56.BAB$102.16BAB9.BAB.BAB 2.BAB3.BAB2.B2.BAB56.BAB$101.B17AB9.BAB.BAB2.BAB.3BA7BAB56.BAB$101.BA 11BA3BAB.6B2.BAB.BAB2.BA2B12AB56.BAB$101.BAB9.BAB.BA2B6AB.BAB.BAB2.BA B.11BAB56.BAB$101.BAB6.2B.BAB.BAB.BA3BAB.BAB.BAB2.BAB11.BAB56.BAB$ 101.BAB5.B2A2BAB.BAB.BAB.BAB.BAB.BAB.2BA13BAB56.BAB$101.BAB5.BAB.BAB. BAB.BAB.BAB.BAB.BA2B17AB56.BAB$101.BAB5.BAB.BAB.BAB.BA2B2AB.BAB.BAB. 16BAB56.BAB$101.BAB5.BA3BAB.BAB.BAB.2B2.BAB.BAB16.BAB56.BAB$101.BAB5. B5AB.BA3BAB5.BAB.BAB13.2B.BAB56.BAB$101.BAB6.4BAB.B5AB5.BAB.BAB12.B2A 2BAB56.BAB$2.A98.BAB9.BAB.BA4B6.BAB.BAB12.BAB.BA4B53.BAB$.2A98.BAB9.B AB.BAB9.BAB.BAB12.BAB.B5AB52.BAB$2.A98.BAB10.B2.BAB9.BAB.BAB12.BA3BA 3BAB45.A6.BAB$2.A98.BA15BAB9.BAB.BAB12.B5AB.BAB44.3A5.BAB$2.A98.B17AB 9.BAB.BAB13.4BAB.BAB43.5A4.BAB$.3A98.16BAB9.BAB.BAB16.BA2B2AB42.7A3.B AB$117.BAB4.6BAB.BAB16.BAB.2B42.9A2.BAB$118.B4.B7AB.BA18BAB49.A6.BAB$ 124BA5BAB.B20AB49.A6.BAB$B124AB3.BAB2.19BAB49.A6.BAB$125B4.BAB20.BAB 49.A6.BAB$129.BAB20.BAB49.A6.BAB$50.80BAB20.BAB49.A6.BAB$49.B81AB20.B A23B34.BAB$49.BA80B21.B13AG.9AB33.BAB$49.BAB100.BA22BAB33.BAB$49.BAB 100.BAB20.BAB33.BAB$49.BAB100.BA22BAB33.BAB.17B$49.BAB100.B24AB33.BA 2B17AB$49.BAB101.24B17.18BAB.3BA12BAB$49.BAB141.B19AB3.BAB2.B7.BAB$ 49.BAB141.BA18B4.BAB.BAB6.BAB$49.BAB141.BAB17.5BAB.BAB6.BAB$49.BAB 141.BAB16.B6AB.BA5B2.BAB$49.BAB141.BAB16.BA4BAB.B6AB.BAB$49.BAB141.BA B12.3B.BAB2.BAB.BA4BAB.BAB$49.BAB141.BAB11.B3A2BAB2.BAB.BAB2.BAB.BAB$ 49.BAB141.BAB11.BA2B.BAB2.BAB.BAB.2BAB.BAB$49.BAB141.BAB11.BAB2.BAB2. BAB.BA2B3AB.BAB$49.BAB141.BAB11.BA4BA2B.BAB.BAB.3B2.BAB$49.BAB141.BAB 11.B8A2BAB.BAB6.BAB$49.BAB141.BAB12.8B.BA3BA8BAB$49.BAB141.BAB21.B14A B$49.BAB141.BAB21.BA13B$49.BAB141.BAB21.BAB$49.BAB141.BAB21.BA8B$49.B AB141.BAB21.B9AB$49.BAB141.BA6B16.BA7BAB$49.BAB141.B7AB10.4B.BAB5.BAB $49.BAB142.6BAB9.B4A2BAB2.2B.BAB$49.BAB147.BAB9.BA2BA2BAB.B2A2BAB$49. BAB147.BAB9.BAB.B.BAB.BAB.BAB$49.BAB142.6BAB9.BA5BAB.BAB.BAB$49.BAB 141.B7AB9.B7AB.BA3BAB$49.BAB141.BA6B10.BA5BAB.B5AB$49.BAB141.BAB15.BA B3.BAB2.4BAB$49.BAB141.BAB15.BAB3.BAB5.BAB$49.BAB141.BAB15.BA3B.BAB. 5BAB$49.BAB141.BAB15.B4A2BA2B6AB$49.BAB141.BAB16.4B.BAB.6B$49.BAB141. BAB21.BAB$49.BA5B20.105B5.5B2.BA23BA37B5.5B3.40B$49.B6AB18.B12A.G78A. G11AB3.B5AB.B62AB3.B5AB.B40AB$50.5BA18B.BA103BAB3.BA3BAB.BA3BA56BAB3. BA3BAB.BA20BA17BAB$54.B19A2BAB101.BAB3.BAB.BAB.BAB.BAB12.B41.BAB3.BAB .BAB.BAB18.BAB15.BAB$54.BA3BA2BA7BA3B.BAB101.BAB3.BAB2.B2.BAB.BA9B3.B AB40.BAB3.BAB2.B2.BAB11.6B.BAB.4B10.BAB$54.BAB.BA2BAB3.B.BA3B.BAB101. BAB.3BA7BAB.B10AB2.BAB28.A11.BAB.3BA7BAB10.B6A2BA2B4AB9.BAB$54.BAB.B 4AB2.BA2B4A2BAB101.BA2B12AB2.5BA3BAB2.BAB28.2A10.BA2B12AB10.BA5B.BAB. 3BAB9.BAB$54.BAB2.3BAB2.B4A2BA2BAB101.BAB.11BAB6.BAB.BAB2.BAB28.3A9.B AB.11BAB10.BAB5.BAB3.BAB9.BAB$54.BAB4.BAB3.4B2.B.BAB91.A9.BAB11.BAB2. 3B.BAB.BAB2.BAB28.4A8.BAB11.BAB10.BA4B2.BAB3.BAB9.BAB$54.BAB4.BA13BAB 91.2A8.BA13BAB.B3A2BAB.BAB2.BAB10.8B4.11A7.BA13BAB10.B5AB.BA5BAB9.BAB $54.BAB4.B15AB91.3A7.B15AB.BA2B.BAB.BAB2.BAB9.B8AB9.4A8.B15AB10.BA3BA B.B7AB9.BAB$54.BAB5.14BAB91.4A7.15B2.BAB2.BAB.BAB2.BAB9.BA6BAB9.3A10. 15B11.BAB.BAB.BA5BAB9.BAB$54.BAB18.BAB85.11A23.BA4BAB.BAB2.BAB9.BAB4. BAB9.2A37.BAB.BAB.BAB.B.BAB9.BAB$54.BAB18.BAB91.4A24.B6AB.BAB2.BAB9.B AB4.BAB9.A38.BA2B2AB.BA2BA2BAB9.BAB$54.BAB18.BAB91.3A26.5BAB.BAB2.BAB 9.BAB4.BAB48.BAB.2B2.BA2B4AB9.BAB$54.BAB18.BAB91.2A31.BAB.BAB2.BAB9.B AB4.BAB48.BAB5.BAB.4B10.BAB$54.BAB18.BAB91.A32.BAB.BAB2.BAB9.BAB4.BAB 48.BA7BAB15.BAB$54.BAB18.BAB125.B2.BAB2.BA11BAB4.BAB48.B9AB15.BAB$54. BAB18.BAB120.9BAB2.B13AB4.BAB49.8BAB15.BAB$54.BAB18.BAB119.B10AB2.BA 12B5.BAB56.BAB15.BAB$54.BAB18.BAB119.BA9B3.BAB2.B13.BAB56.BAB15.BAB$ 54.BAB18.BAB119.BAB11.BAB.BAB12.BAB56.BAB15.BAB$54.BAB18.BAB119.BAB7. 5BAB.BAB12.BAB35.22BAB15.BAB$54.BAB18.BAB119.BAB6.B6AB.BA5B8.BAB34.B 23AB15.BAB$54.BAB18.BAB119.BAB6.BA4BAB.B6AB7.BAB34.BA17BA3BAB.8B6.BAB $54.BAB18.BAB119.BAB2.3B.BAB2.BAB.BA4BAB7.BAB34.BAB15.BAB.BA2B8AB5.BA B$54.BAB18.BAB119.BAB.B3A2BAB2.BAB.BAB2.BAB7.BAB34.BAB11.3B.BAB.BAB. 2BA4BAB5.BAB$54.BAB18.BAB119.BAB.BA2B.BAB2.BAB.BAB.2BAB7.BAB34.BAB10. B3A2BAB.BAB2.BAB2.BAB5.BAB$54.BAB18.BAB119.BAB.BAB2.BAB2.BAB.BA2B3AB 7.BAB34.BAB10.BA2B.BAB.BAB2.BAB.2BAB5.BAB$54.BAB18.BAB119.BAB.BA4BA2B .BAB.BAB.3B8.BAB34.BAB10.BAB2.BAB.BAB2.BA2B3AB5.BAB$54.BAB18.BAB119.B AB.B8A2BAB.BAB12.BAB34.BAB10.BA4BAB.BAB2.BAB.3B6.BA38B$54.BAB18.BAB 119.BAB2.8B.BA3BA14BAB34.BAB10.B6AB.BA4BAB10.B39AB$54.BAB18.BAB119.BA B11.B20AB34.BAB11.5BAB.B6AB10.BA37BAB$54.BAB18.BAB119.BAB11.BA19B35.B AB15.BAB.BA5B11.BAB36.B$54.BAB18.BAB119.BAB11.BAB53.BAB15.BAB.BAB15.B AB36.A.2A.A2.A.A2.3A2.A2.3A$54.BAB18.BAB119.BAB11.BA8B46.BAB16.B2.BAB 15.BAB$54.BAB18.BAB119.BAB11.B9AB45.BA21BAB15.BAB$54.BAB18.BAB119.BAB 11.BA7BAB45.B23AB15.BAB$54.BAB18.BAB119.BAB6.4B.BAB5.BAB46.22BAB15.BA B$54.BAB18.BAB119.BAB5.B4A2BAB2.2B.BAB67.BAB15.BAB$54.BAB18.BAB119.BA B5.BA2BA2BAB.B2A2BAB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BAB.B.BAB.BAB.B AB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BA5BAB.BAB.BAB67.BAB15.BAB$54.BAB 18.BAB119.BAB5.B7AB.BA3BAB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BA5BAB.B 5AB67.BAB15.BAB$54.BA18B.BAB119.BAB5.BAB3.BAB2.4BAB67.BAB15.BAB$54.B 19A2BAB119.BAB5.BAB3.BAB5.BAB67.BAB15.BAB$54.BA2BABA9BA3B.BAB119.BAB 5.BA3B.BAB.5BAB67.BAB15.BAB$54.BA2B3A2B4.B.BA3B.BAB119.BAB5.B4A2BA2B 6AB67.BAB15.BAB$54.BAB.2B3AB2.BA2B4A2BAB119.BAB6.4B.BAB.6B68.BAB15.BA B$54.BAB2.BABA4B4A2BA2BAB119.BAB11.BAB75.BAB15.BAB$54.BAB2.B6A5B2.B.B AB119.BA13BAB75.BAB15.BAB$54.BAB3.3BABA10BAB119.B15AB75.BAB15.BAB$54. BAB5.B14AB120.14BAB75.BAB15.BAB$54.BAB6.13BAB133.BAB75.BAB15.BAB$54.B AB18.BAB133.BAB75.BAB15.BAB$54.BAB18.BAB133.BAB76.B16.BAB$54.BAB18.BA B133.BA95BAB$54.BAB18.BAB133.B97AB$54.BAB18.BAB126.A7.97B$54.BAB18.BA B125.3A$54.BAB18.BAB124.5A$54.BAB18.BAB123.7A$54.BAB18.BAB122.9A$54.B AB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB126.A$ 54.BAB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B A18B.BAB$54.B19A2BAB$54.BA3BA2BA7BA3B.BAB$54.BAB.BA2BAB3.B.BA3B.BAB$ 54.BAB.B4AB2.BA2B4A2BAB$54.BAB2.3BAB2.B4A2BA2BAB$54.BAB4.BAB3.4B2.B.B AB$54.BAB4.BA13BAB$54.BAB4.B15AB$54.BAB5.14BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B A18B.BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.B AB.2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54. BAB3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB $54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA10BA3B.BAB$54.BAB.BA4B3.B.BA3B.BAB$54.BAB.B 5AB.BA2B4A2BAB$54.BAB2.4BAB.B4A2BA2BAB$54.BAB5.BAB2.4B2.B.BAB$54.BAB 5.BA12BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA B18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB.2B3AB 2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB3.3BA BA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$54.BA3BABA8BA3B.BAB$54.BAB.B3AB4.B.BA3B.BAB$54.BAB2.2BAB 3.BA2B4A2BAB$54.BAB3.BA2B2.B4A2BA2BAB$54.BAB3.B3AB2.4B2.B.BAB$54.BAB 3.BABA12BAB$54.BAB3.B16AB$54.BAB4.15BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.B AB$54.B19A2BAB$54.BA3BABA8BA3B.BAB$54.BAB.B3AB4.B.BA3B.BAB$54.BAB2.2B AB3.BA2B4A2BAB$54.BAB3.BA2B2.B4A2BA2BAB$54.BAB3.B3AB2.4B2.B.BAB$54.BA B3.BABA12BAB$54.BAB3.B16AB$54.BAB4.15BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA2BA7BA3B.BAB$54.BAB.BA2BAB3.B.BA3B.BAB$54.BA B.B4AB2.BA2B4A2BAB$54.BAB2.3BAB2.B4A2BA2BAB$54.BAB4.BAB3.4B2.B.BAB$ 54.BAB4.BA13BAB$54.BAB4.B15AB$54.BAB5.14BAB$54.BAB18.BAB$54.BAB18.BAB $54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA10BA3B.BAB$54.BAB.BA4B3.B.BA3B.BAB$54.BAB.B 5AB.BA2B4A2BAB$54.BAB2.4BAB.B4A2BA2BAB$54.BAB5.BAB2.4B2.B.BAB$54.BAB 5.BA12BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA B18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$55.4BA10BA3B.BAB$58.BA4B3.B.BA3B.BAB$58.B5AB.BA2B4A2BAB$ 59.4BAB.B4A2BA2BAB$62.BAB2.4B2.B.BAB$62.BA12BAB$62.B14AB$63.14B! golly-3.3-src/Patterns/Self-Rep/Codd/extend-coder-demo.rle0000644000175000017500000000206413151213347020312 00000000000000# Extend coder - Codd's CA # # This coder generates 7-6 signals, causing the output line to extend. # # Initially in the unsheathed state as it would be after construction, # the pattern is first sheathed by the 6 signal, and then repeatedly # triggered by a 7 signal coming from a periodic emitter. # # Four gates are required for the machine to function correctly. One stops # the 7 signals from entering the lower section the wrong way. One stops # the 6 signals from entering the upper section the wrong way. The other two # stop these previous gates from being turned off. # # See construction-arm-demo.rle and golly-constructor.rle.gz for examples of # construction. Other demos show gates, sheathing and signals. # x = 54, y = 20, rule = Codd 34.5A$34.A3.A$.5B28.A3.A$B5AB27.A2.2A$BA3BAB27.A3.A$BAB.BAB27.A$BAB.B AB27.A$BAB.BAB21.13A$BAB.BAB21.A11.A$BAB.BAB21.A11.14A$BAB.BA9B13.A 11.A$BAB.B7A.F24A2.A$BAB.BA9B11.A6.A6.A$BAB.BAB19.A6.A6.A$BAB.BAB19.A 3.A2.A4.3A$BAB.BAB19.A3.4A4.A.A$BAB.BAB19.A11.3A$BA3BAB19.3A6.4A$BAG. 2AB19.A.A6.A.A$.5B20.12A! golly-3.3-src/Patterns/Self-Rep/Codd/repeater-emitter-demo.rle0000644000175000017500000000202313151213347021202 00000000000000# Repeater-emitter demo in Codd's CA # # Signals travel along state 1 wires, sheathed in state 2 cells. # # As in WireWorld, each signal has a trailing state to indicate its # direction. Here the signals 7 and 6 each with their trailing 0. # # T-junctions act as fan-outs - duplicating the signal onto the two # output wires. Here the two signals circulate around the loop but are # also copied onto the output wire. # # The effect of the 7-0 signal hitting the capped end is to expose the # bare wire. When 6-0 comes along afterwards it 'repairs' this exposed # end, restoring the sheath cells. The effect of a 7-0..6-0 signal train # is therefore to extend the wire by one cell. # # By putting the 7-0..6-0 signal trains in a repeater-emitter loop, the # extending operation happens again and again. This simple but useful # component became the inspiration for Langton's Loops (see # Patterns/Loops). # x = 21, y = 11, rule = Codd .9B$B9AB$BA7BAB$BFB5.BAB$B.B5.BAB$BAB5.B.B$BAB5.BGB$BAB5.BAB$BA7BA10B $B19AB$.19B! golly-3.3-src/Patterns/Self-Rep/Codd/decoder-4bit-demo.rle.gz0000644000175000017500000024270013151213347020620 00000000000000‹ru¬Idecoder-4bit-demo.rleìýmÏ59r&ˆ}¿~EÛ€féàä{¦|ŸÂÚ0`؆½†ýµ¤.©k·UÕö×;ù$ƒdù´F3Ð]÷y’q] 23I&ñ?|ÿÿýþ_ÿ§ïþ¿üú?þÝ´\ÓßþÝ´ž þ‡ïîÿ­÷÷?ýöÝïü‡_~ÿãŸï¿ÿüËw÷Ý÷¿üþ÷óëwß}÷ŸþO?ýÓë»í5­ûÝŸ~ø§¿;®ÿŒÿáÆýÏøéW#~ÿýá;Eò÷JôþÞí·þ×ïÂ_¿ûéç?ýå·ïÎïþøÓÏ÷…?ÿø§?ÿøë?ÿöÓÏÿt3ýË~üí·ô?üþûå¿[Ù¯ŠöÿñÏ¿|÷Ÿ~ûåO÷5Mñëþî—?÷ËÏ?~÷Ÿþþ—ß~ûåŸCÁëfúÿüáÇŸo[~ýéŸ~þáßýðç?ÿô_nu¿üüÝÍkýá÷÷Ëm†2â»ÛÜ[ÁŸ~øõ×Küö‹–¹9~øÓŸþüËŸþüÓ¿ýøÝ-ý'øOï¿›¶ïþñÏ·NeÐ 0(Å7ìÿ¢”Xü­ærNøÃªÆÿðãmËïuÁ¯?þÿþòãÏÿðãw3½§÷ßümäe‚ú/?üñ/?~7½ïê)¦Ÿþù‡?¾¾û¿ýòÛO7î·?üðÛ]ÍÃUTUĸºÞ$ãëûg¥ï×ßþƶ‚ù‡[üÏ?þÝŸú§?ü¦¼NL~}÷õ¿Ý–/Û~*ªúñçÿüÃo?ýòó¯¦^í?þò—Ÿ•ûþø¯Žöoþñ®Rä8mí-»)ª¿üɺð5þ{ÙÞvËþñ‡?ß]íïü‡þòëκŸ¼øwû›^t·À?üù—_ïöý/®óÜD¿¨®ôrø÷?*[5è#­…ÿþÇßþåÇ»«¨Žô—ŸúýOwû¨êÝ•Ò&ÿðóïÕýëïóÂÛ¼Û¨ßÿ­ï¯ÿò‡Ÿîê.P]ç»›ê·o‡LÛû»ÿÝMøëOÿû¦¦ÿ÷›â~ùç?ýñ§Ð.ýî_~úíFß~ügÛ~‹¡¨ûľÛÿ¶ã¦1>ø‡»ÿ«m_u5U?øÍ³üÓmÊm—nÍlŸRýñïUíUQwÍÿë—þñ·ŸþùGݸ¿þèéþðÃùQ{ù—?þñ§ßß@Ý¡~þ[uíÇŸýËŸô¦ý«ºqþ¬÷óOøé·Öß«Ûú¾òó/¦Þ^üýë¾Aúãºq¾ûgýløù—ït­o?èVþéWå¯_ýËæ&ÒºUÅÿpsß\¸ü£qÚO?Gz7äo¾ËÜXu#ýË/ßùöûUu¾»e¿ûý/ÿò³©œvï?þé‡?+‹ÿV—ÆZÿùUµÒ¨üá§?ªÊ[noßņé/?ÿø¿ýéÖs×ûÇüÇûǯæIøë/ü‹®Ý¯¸µÞTÚ)?éÞ«ì¼ðÇüËïæþãÿú+ãÙ`˯Nï¿©öÿåìù¿þ¬ê£žG·ºþñÇ×wÿïŸïžðÛ_~6ýP?–~úU·Äü¥æO·Ï~úû?*©*ÿê;QöÏùõ7ýÿîOüá~èÜæüÏ÷¿üågãË¿µÍkÛþîuùãoßéYÿÎt »µuù]Á_þü£qÓ¿ÿýí¡¾û›ßþõO÷«äo¾ûíÏ?üüë]þÏêmñ‹rµº©T·ý[Óõ~Vþ¶òîå·ì¿~·Þwõßÿðÿë­ë.?þæWÕ©ÌûÃUôfùUÝOÿzÃôÃáWýŒûûÕïoU»¹WŽ} Xw(þFüî†Ê>Bî›æŸî'øÏΓÆë¶”óô“àÏ?©[Ï>Ò~¹»Ö¦œÔòöÑÝðw_ûýùA½nÿ‹rõß7-ËûM¸¶‰~ùû_üóùÑ>¹ÿøG¥ù?ýݺ;Ӿؿ¤¹~Qmùëo궺[B=Ðþ1éÝêÂ}‹øç‡{2ÛÇÆßÿò_ô³ð¦øã/ÿòúî?éÛ×¾ ŒÌOöµwsþåŸïÛRõ‰nó~¹;êßz9ór¸ÅþüË¿|÷/?üúóßüöî5wc«ûŽ<è ­jˆ{`^NúVøû»Ãÿ¯îjú×Öwت›[¿ôÛ\=ÅþüË_þéÆóºŸE `­•Óç¤~óþb ·vÓˆæE¨Dì+í6Ñ 0þV×”øK³*´º•½7ýßÞw—nÃýN=ÿü]úZ68[½×wÿÓÏæYýóÿ ùÕŒ””.ó7åÖ_ÌC;L¿ûŸ^÷L½ÞïiR½ì÷t¤ðËÏ–å?þão÷Ï¿¨[üîŠÄ £Ì3И”ûƒ”qÁ×w‘w,¿z·üéÇ?ß½A¿|Kü’¸Ê¼ÎÿÅ9õ¦úO·Î¿ùÇåoþ³zÐëG™z6ë~˜W™jhÕtQÍÜÈ)u°õ˜{œV†=ºÅ¿¿ƒ?üÃoÿuS¿þð—»Ê?ÿÿéŸï'ÿë¾­n‰ÿí»ÿñ»i?ö¿ýî_ï_óµ÷î/÷ÃãÔÌóþúLGôŸßÍóöú|ÝÿXó?\!Hét¼.u}ß㿾\iy«‚-ù'k„¾–Ï÷›Æ~*ŒýÌÊôIýBøéiŒ5V¿Ë?oØï •Ò¿•æ7è?ÂoØmýk¿ñ¿~HYí_{dT½¨lëßk\³Ïkþè6Ú¢ •ωo¾ÿ,¶É¿¹ºÈ€…úð…øŸô_šJÖÞxßí¾B_ã~~òŽ ¦KHù†pÂî†Br»ù›A~3¢}« 1ý”«3f×Fâqm[ÆMÂÔæ?jóµùÚüGmþ£6ÿÝ×fZסF1¸vó#ý{‹Üã¨ó]ÿ×H|§ê‹ú'ûËŠ~ý_}ù ú„A Ò²eÔ.<¬Êg¹îÑôíÀûÿÛi/ÿí)îë8ޝÏv¸¶þE¡_Çö±åH/TþQ|Žååe_ª_ᨠ¶¨ –©º«ÃP¡è,ùp5œç×ö1¨lù2â ý=…ß¾>ë– P,h5ˆÊÔ¤­«AË«eæ’¦’JË&:_ÓûsÙÉ9Ó¶rI1¸¦43ÞÓ,É,Ÿ5ë_‰š0v¨å Õ2÷?ÏÛWsÎK -"&Él1K%/#÷µ \V B¹ºÊr¿›îçûn–EÖϲPÚï?³ÿ˜á…e~ åyqtÊóâ 8õú×÷·ÀzWy¶ò‹]XšÞ÷c 𯗗FŸxA}âTÚØþµ}Œ[TçÑ»3ß}iZ?ßß µÎǬ%k‚KÖ‘IZCíº2JöX¿, ’1Œ¤@ #éw‹9ªé×4;/­ö3Ç«ü‹×‰Q ÅaáPÚJº5Xó="V¹ºe„ÙN÷g¯± KPƒ%(aIåô;AKí¯ù2/ÞýNâ=Ó–€2 F@r­ÔE_vhy¿Ì—ÍÓríTaè‡äÈ Ó<ë—ÙÎü¹_fúQó¦d7ˆžÕ(õŠ^*›éçú†'Œ€2 F@FÕ§o=񯧴úE²…5ßM¹c^íª¥™§šýL±7ô›Ê`ŰÅâ ØcÝh]{Æ÷wýgúE@}VµÃ·Í,Zfê¿è{eëí«ñ;žÁ ÏàÜxʹmþè_ºS‘‹ývm<{˜žœš½©±­6i6wPè)ì¡™gêÇžŽÈ\˜zpñ#ÕNøÐÏ?û`{©Á¹Ñ¾šäÙñ¹í·4x} |¾ ¾ѨGyX1êr)ƒYf5ÖvC'3“õ6©{åò­>‘ªþâM¸à÷g<áJ¼;È…¼’ý\ú˜ÁžKwæxÿñU3˜c;Ô Ó DV/Íá»Ò ,G8“r¢f¨˜òÊ«{açv;¬Œ!þ­in+$¦|æ¥V¹#(å0#JFv1BRí#ÚþoºOïè%^Ù÷ýæÐ­iæ)ºõ£î:1„&׉Á0½¬°ïÞ†YýìÇL²õéoI°S 3,e\(âF¹¾Üè1¼ÈçNÑ/€}xtæo×WØ*lV‘¶‘~4dƒâf{d3zڧȬ&Ç/<-7Ž»‡¾×ª¢MVÁ?üжìÙc{¶²ÕœüL+ÚÅ Žº“r£K̳òì#wæ{ ±Ž´ÏEnUó¼}éÁ]´ù/”ŒOÌîìØ&·\é¿]Ä}QÊŽ};zgÙÑk<ËŽ˜þ½ô·Ì[É?$H“»u»9²(Ìœjö<½i•ݺ«™¬.Rv”è»ØÑk<ËŽ^ãÙámËxQ{Þù9Ëµè ”¶tj žæ=îŸnž1¹«29 ì}äè3½@©é["»[ …ò4È-.ßä-²#ݸ£±){Ø&­W[„ÈÆK„¨À¤„h×¹Eˆ¡‡ZôIdµÓ²ýóý¤?d’¾V{“t콤fvm›5Ý0gî£ËÝI³ËÔzƒÂ9ä Gú^ÈÆšÑÖù²çHÔ!ã×ìö߆G+3TòÙÞØ%t˜¾‡%ú.vôϲ£×x–þÁÝ„´Î«½WM_HÆ.ÌÀfÞí)‹Û¯Îûµ u%BxR¯™?¹ôV„iGˆo¼ÉGÚÝçÖøµ:1uJÞ´®z1$"ÃÌÍEdÄ:äæ ª^Ÿ¥P])–áÛçµL÷ý»Ý&à¼ô†ï¯ÊÛ`V~ÉP}w C¢uö`·_I`žŸÀ­~Œ3ýè„_3iå›ìÒÿDòïÂ?Ïíó»Ï2…yѤ~ö…= ÿ^×¶ö/gjÉ )tT®å‹î‡œ6¿ÇNðÏs×}å¬kOÓÛ<=f³Sâþ§éºêå ¦ûU>/ö²½–ÃŽÁ£@‚CxÍt¯š½üO¤Å§>±¼³þô>£kvGëå¶d/Ô=œè_ËP‚Ä8” 1õÈ¡aòt™½6ÞwäMFœ·$¦Þ–þ˜:VkÚ:L±ªÏúO)¬kR|ç¾Ì©H3†÷®Ý žÉ¼õùWÔ‰Ÿ¶È3ÿ}ÐÚ à'{"åÞÀ1Œ§~Ä`_ÕcQëÈpêh2ÏëüEšD õp`#nT}ršóÒ/³µL°š¨ 4O 4a—â:¡oÅÇ/³åè!ÙWü¾ÆŸrΛ[Ø)ž­`,^r˜ÕUÜÐçƒ"À CäDtz‘8ÑŸpSg·è°Ì¾ ÉiZzC%p‹Æ3¸ cònÑ`áßäfÛwûb²«+ ½Ì.ÁCí“;Gp ƒ¸†:N8A³[y­w-f¡cýø3Ä;mˆåYqtÊóâØ¿tÝ‘iûlæt2]ªh‰àóœëò5n©ÿT_'·Yg&LÇGTŽ‚Ü|tÚ?]æ{Îýg#q.µf¾L^„¨lÔÕ&ªã¶«¥¾õåì®»9¶iõ^R ƒMz§+:/©ŽQÚÈç–ô\G(0öÉýx³N}ôãéB›eñsJO$ðˆD›?mε…s]Þî#?¼“#ÑnƒÎù®ËÕÅ ”KÅÔ+3œ¾Cr&ï:B²óÂ3s"Úv9¥\.Ï‹£Sž·¯øs¥õHÏóÇž‰&t#8º9€­ÏšÙóÔ´:½V½Vq]öÇœ_jöè ¹\º$Œ.éOÚö”+(,= ìŸ0[ê¡XrÑŠ$J¢Îæ+ët;IÕdáh‹$Ð)™4‡³ÃöûEª/– MáÍq—â¨zRj‰s/”‹ŠÑ‚Gëû%TkiêÛ¡i}^@TŽ&½MÕz±?…ïôàé|—Ke…àK£'Þe|Ÿaµç¶ñœB ÊEÒœf,î^j^?:ÜïuŠ/À]9÷²M‹þ$t¼¦ãüUÈ„S ³‡¬fEÃb¢‹ÒkŽ„Ú ÎRLû*øËŒñ>jOÊæÞ‚yä:[w’ݤ5ˡŴ •Š-.· ¶E%ðE •æàîu±e¨6ËÎÝ-å—=³žF¾/\»¬ =Àó°[ºzŠv•pbçZi±°"ði²÷T`®%–B aJ¥…(•Æê?ô,‘º›ïMR1J¥… ¥®íúÉFˈIî÷ëy¥¥¨ KÕb«ïøºøh#q=Ô˜Cñ°åh ˆÊAM¹^zÃý5ZâqåíÙ\"©†x)oÞµø—}8\£×HnK}ÚÈ®­6DË’‹r’Öb$¥‡L6sÊdŠ’vFþpÒèç¥Ñ'¾ðýÉ&­-:à1m䆺ÿ|§‹@BÅ ¡"øg@tÒaK:LÉãm•‚0„JAHQì#–Ø’s“K?<[€n@ŒˆÛ˾X̾¡-ÚC?¹¡ÅEÞ@MÁФ‚S:¨¡ïw¸Í9[´S|²C¯‹¾­Ë‚KÖ‘H’@:hÙüi¹Í>²³1OED V$¾ÔöÓÉ[V»“çÝcu*eò"djÕË—& ¨IŽÞk»ë-³‘Ra  tØ|¸çøö™Â:û,JH ¡`ÍY}‹š˜’fepMUR±†db¬T6•:ìÇ韞N9H„š2Èl#¦VÖnLÉB1å’bðfœ/¿éÕ߉ýj¡¾í:®Â^æT,ˆ½ˆ†(þå0×j—òÆØ>0k[Þ™ÛGz²ÁçD¼H~ÄÒïÄ/€ad›E‚äYz‘!IfŒÔy9¯³ö+¨L Úû#ú$O—ptz¿Ë?¡~»W-3íe¾ÞÖsæ:¡i½^ÇaªÀÿõ‚Ên/A…¤t?¢¿Tòë_¥¿ïÕÅ>˵8ß„mÚV32Í@ý:ç#HOÛfn›ÂsÞ}ÝØ<žÌ¯ü‡“^ÞsÑØÓż}¾×ÝéØtãp^„ûIÖÜéêNÛ]"ë¥ÌÆVp¿5žïð‰º”æØˆã–·ÓEs.s{5^ 1²‘û7»k×%Ëc áÒÇ\nÖg !;ò†Ã¬!<`°ù’!H¨Lj›ž¸Ñ²Íä½¥ÁÝ[Y–Ý£t;Ozù~"YfQÎåðá4W8ÒF^á(³1}¯Pr{©LQ&ã=ÌÏé1`~N†~ózô›ÏУb¾4÷3²ëW&Hu’ëN/DY¡[°%#@K’ªãqÂh½P”B©)¤,63FÛ ¡ðâ!™A4ýßBÙ¢¹®’—_E`d*G,ÀöÝv*iô'›ë¾L-eÑSõ–¢ždÓ¬GrÕà±¹V‘LÉàzj f¿ŽÅ@í/%•ÈäÖDœÿšæ§Æpþk*F>®!OyNä ³À†P×Rªl &¿¦Òèw7xRRÍw_TIº`Å©BªÎ³žõ¼ëèJŒ^Ê‹Žî<í¦Ëò¿ëú÷$€ßf}í\;ÓµGIÕ1š®=’…¦Õ-2ªa½<üfÈúšÖYc4e; ‘WEÙÍ|m±ƒ8áó{á›doo¤öf…æ§¢èóeN€È ­ìò­|ô/päÖ è¨A©+`(w|*ŽñTödÜ™d£ tÞ&Åëó¬öaÇ!#[êô‘Ðf¿‹´×« yöúŠ$r…ªÔ›0V«„r:{QÎ{—U».ÅWÆ×oÅKT-Ë®¼õk®^‘¢ŠRyE¢â¨IÊ,ÕŠ\$Ĭò Y= 6ÆR !äRçZ%¡©°Ô*¢w!“ :¨¬?·ÔÅêRˆÅεNC*CÅÉ•js¹ô±Ó›¤…yû¡“ÏB_kH!ˆ[ÆÕ&ãA"W¨MH <™ k— mÆ“'M­\—-‹¢${^B÷8i¯4ÚÒdÚ/­3 /µIP#E‡¬iCN±ThÉ6cu–FÑ8™@ñý„~HŽQöIééKLŠÉZ\'D2ëê'vãà#UØÄЇQ Á¡ <×¶…4ƒã=c›Çê†üÎÐyˆÖ0ÍO©˜(vÙU¬ìC †çW§Øö©a%ŠPÖW*ò¾e£C`Șˆ>tŒpF88“eâÎK‰ȼ“üw²3‰Jr0¡@æ]Ð~‹QƒÅ(D0e¬Ì.ãšþúTÿª¶GçËò4ÆÈžÕb0Ê0 3Æh[9İC€âÝq‘áÜÒÂ|Ù˜’gˆpêE! ýq^"[TîXsÊü9bm¨+<‘ßáU‹p„u>|¸ÍÆöðã7}?'Œ€2 èp­n‘Î ÊGÃ~õ*.½â7zzYEY£±Û+£s3›É`ñì°èoSAxy“`µlîîuÄôU…égšIÞN86r4—2.þkß•|/Æ3¸IïÔßÞ¬>”Âüµö|èW˜±úÝ{—OšöÕ´­V”rn/íG•À2= PjžRè<Û»Âøœ¦y÷ì.ã«âŸ¯a€œ¤ôCîrÏxªòãòŒ¨Ï„³ £r’×hðyNcâuIh¶)®¡Œ&@WkT]&³1¼£AÀœ5qbNó†ì^úõáó¾è£ì~ÇâÞÁGöˆ ±a<×¶Wk„2ršqót{‘Q©ÆÈÛÉ[ç“:žæ5¦€mâ/š>/N§¼l-NĤcœ¨*àÜ6›ìp˜ašwQZ¿ýj{½Ö\[†‹TI’õ¸•±ÛQnÈF´òÔ›f¬Ú„ƒmÆf–çý÷† n iÄÑeŠ>H°•J;†A¶z¥¬Hi‡XÑ2VÄ Jk^wåÓE*dv¼÷x\;dÑ[—%kàÕOÅcŸq™—ñ’7Èî¦.7ÊiåÜ(÷qƒ'ßÞlh™*õÃÍ­Ôe S¯XÙKG¦ÉwºJoÁ•†›ËxGh‘ñöÓ¢fîö®'²ödÔ½ÙÐó;¦. DÕ4³J¨êçÜ[ªÄãf—÷ÊVdMº¾éŒ¶ÊzênfpԽ̽,|lK†>²©€™ÏÇÕù^à(Hª³eí}‘ÄJ"€E)‚²d¸iŽ&ãCûÆ Ž{®”eúvôïØ—“ ÏÜa!Mqlåz᩟%,Eouÿ4aòUÏ‘2÷°q{¢O•É! ºï>˜‘¥ÂŽ2};úgØÁÐ/s'!ZöŠúÌëýQµP±bY«kû/Ÿg:çÔSš)ÈLbWÒ‘«[L¨»™ÁQw3Cdô2¿¢\ãKˆ~70 Âpž«cDtdIV­µø±Ë¼ÌîwD¤£4˜L´ìä¨^ÇwŸšÆAG Q2Ñ4îsáÓܬ=ó‡ÍßåÌ_k_¶íçuµSìôý… Ó{A‘Ža:û“€.9CŠ©1 ‘¢eªˆTÅmÔwëšdïâCl¥¼i©‡ðÈcÜ9Ìf#û¯hYâv=2e^›}¾ÐóˆikÛÑOßÅŽ};jÆ/³r¦}@Z1ˆ¬hõ¿ù*䚟£ÅÁÒ {ÞÃ@ÇBR4³­U׆™<ªˆÓ( @j½»Z%FÝzaöG¾{tÚ‚º'‹D­›šx»ÍLžÄD™˜qå:±9V]$ä3Žòa‰S^ìC”`òÀÝ4àªÚõôŸ\ü‡'.1»Œ²†|-“N¼¼ÎKï‚ûþúèÙÝ"ãš.³º"ôHq³L¯Jdž[pF.2ÀëGšjöC—äÈì5ÓXÝÓzUþyLŒ¡ªÓ†î¾OuíwŸe2KÑú‰=éGøaZÛÔ_×LRÍž54%œ€3Y.Ÿ6Í|:}Wþym!­ºò窻ß;ž]NÓÛ<½f³—N…'6,j  }T–«y±±íµ0Âaá0 t¸k&3µià¢ÓÍäŸ×ZS‚Š?Nÿˆ8gN5›×Mï3þÔeè\¥Æga%t‡$Æ¡ *M û¶LÑï²ÜmbébÉ¿ÜX§»NOé ombFÝÚKq©¬ÊO)BX²'6ê‚¡èmª "]^UÖ8‹ qæN¡i¶pð}2C$þå{FCLâ‘u”ä{| ’{„ûMIº›ˆ(ƒP›WÆ6ì¬Æ6þacËOú…™¿óÏ8þÇd¶Ò¯Oðއx÷uhµšM!±¬¢Â­bæ ¶üÙøÉ¾ó±ÄÇ¡N h Æ#´ãÚÁ¢ûn´Õ°ZbßÃ;ß‘ÇU¹e’BU%Èàé 4·h ÃÅIÒM´Õ€×Ã÷þiáú¾ e·Æ’“ÆH™T®¼ïMäã[x™ )ÃH Do_g5 îÖËú£käc¸Ó5z÷Gq/ý߸²1 c°…1A)·¢ß¯ =XþÜ©æ¤ðûŠšÉ/Ú¾»Q““81—~}¯»Fø@wݧvQ$(íŽ`\¦²"·© ¾&³ ó‡îŸƒ·ùwõÉD©¹\¶âA¾æ‡ÝùŒÃžÆz_NdÊtÚäžp­±™í™;»¹xÎ$ò õÁf¶þ=fØ «} ŸˆEÀPlðÍ«jiBdl¥üIÉt•löC1~‡>šðÓåC}7h<ƒ[4:E¼4õÐëtûÃ…úµËs+•¾Ìþzÿ¶›Â)à .†aÁÐ7lé¯Oö~MOzŠãBiÙÏô •²RcNµ¹ä:ãeL[Ž–€¨‰@Wý<rM|å¦Ë|P¾Ü£=˜…J™¼#ÉèQ¬Ã®VÐ×— Ÿ³î&ªˆµçŠJQ/–¢³>¼…å>wE>TÜÙPJ®£TP¿n,÷'°ÁÌ^ 6äÖžgèô‘ŒÌǶsJ%ð€DWËŒÊNë«íê xZ5˜L„iôžF0²‘­Þe1åêbàäÔà#‹Þ0q‡v7!h¦%&Ïœ+µS Ï‹£Sž‘ßõ¹=ô4û;J 3𑈈dÏi‚ ‘°Û%rHþ½ËøbMØEÄÌD½V½€¨C¬qœ¥*‚¿'öèFäà ÷Ä>F]Ò%aT¤uÕå–°Oõ-õt"È?—!­HB.J%÷i¦¢¨É¶ÞµöL›;^<íù[Ô‹$ÐC²O{“¥mÿ"óÄŠÑ”  ‘ÙžI0ÛË}x_„›=èîµb4Ê[ŻޑQ(Üß/ù^íN×gA9D¦«—Px€©ÏT>Ò—[ÞScëóÍ¢Z**4o bqaèq™¬|'YÓ¾kuNLQG â¢Ý`Pù*‹l:€ÏñR‘©+â û|¥,Ç›×4-ú«þñšŽ",» þ2ÕjÏ8Š&ÌfÀ¼Ò÷…k¨ :ÕÑÅL/ˆb3ùHÛWÁ_&ÐË¥ªƒl ÌÕI¯ƒ- ¦Dc‰.»ÞΛkm  a ²%õ"9­ÔýÍðJ qVÙ¢ãíç‡yRmé8=×U.C­°V¶Û/øsšŸK—SÚ”Çe£s¥ÉÀî —ñ6j…Ò2øB•_¼ˆ<öÌ@:z&'ÑÃÙßk%Å¢RHÁû¼•‹aN¶šÄT²{)™’¢Z*,„6³X|˜œ}‘‰zVÙ\§½;Ö›/•¢Pº›ë…ÒC ôûÐ}æ‘ÉN·Û¨ˆ¢Rô‚wýi/.)÷Y$uôñ)ãÚ¬6²eTŽ–€¨œL´©5†`ëõÒçG÷8VÀO¸îÖ‹¥ZBI…T¸¥Ðóµ¸?” ÇÃõå=t=n¿vD+’‹V$±/›T?ÛDË+5P„Ôñçi£‡ž#Ó³Ò‰4úÄ Òu[l;6Ùáfþì-mߢã¿ÓFNþâz R†P),J?ç:,të æ‚}:»'P´‘{KOԽЯ‡^T Â*G™7”ØB¿~Ÿó—ÙA½%ÇO§Í<½Þ䣎ÁÐà0ˆè-(²*êpïx³Ay‹Nv¨¢_q9H«r`ÍëSÀ與vvÇï[œÌ@ò¼Š‚KÖQ‘4/[ 'è3=ân>ÔÅfß“¬Ú"]$ªÓ5X¼Õf²òRÇ|ôç¿Ã*›÷ÉݕɋP*³)¶,5 Çêõ”:Æce*uÓC”Úõ¦ÈðÜ¡• \ä+”%ÖÀ.à©Ý–äˆÏFæí S¸9ìáŽAå"‰Å†lõ'œ™£å†XC 21+EkAÅÈqUÙý9æð­iM½ÛjÊ .D«PSÓÊÚã©YL1åÍâÝ&Ê+ ¤fž/ÔÉ<@çhª\,,E^ìüY@'ª71ÜsQmÔ'w*“¡ ³V±eÔ$ý¹Ì÷“cÈÒv\EzÙ©O.§Î°íiKAT,œÞÆE£éeFé–ólLjb¤†[A“ZšØ>ë5£ü‚Õ@YÇ€õß°dÇò„ŸoAƒ¯oAƒÏs˜ThŽÍ Y×êßø8Œ÷WcÔ02U;†Ôæüì]ÿ¹«Èþöª®Ï6ÍÄd‚Æ»ËïÚˆlYDvZ¯×q˜ ³UMô€Pu<Õ*û¡d÷ÙHį›åJþÂý°>>nÈN ÕêÎÇl]kvn«™ñ?6ýùMýšÌù£bÚ6s“ÃÿŠlÛdMÓé]¦xôÍœü€ÿ¥ô™_·¼çV•¬(î&Ü¥Í2‘B[åf¡®Y|ó„f±>ku­¼B";Ý¿CÒÙÍ_+æþ‰u{¿Î÷}9ÝåTŸV6ó×Áì?WµÏ=\G ü:N+k~°¹ áQ™Âƒdë3Ÿ ©ùMIì%C—#¶d©/Fˆ@ê6N„ØIƒDˆF‰ $D*C£yºš‡kø7y#-[Ít—ö‹*!‰£zøÃ<ü—äå_]íZ{"^$™¬~ xúªJK52Yÿ*£IwÍ+’Ðp¯Ó¼˜T{Ǫ ÒÕP™®†*ˆtµT¡Ã…EKº\XR…–TÕ5«…©uOÉå+º€²`¤¿HP¶d2#ò-³…„©Ú±E, µ¢U_a‹RªÊœ¿MMkë²de é~¶L%ÙÉv±W)iaæÄ6_¡ÕLÖEgfº\Z&ÊÀÈf°EbÖr¿átßeÖì´ à±À•¡¹J ÈOÐ…j|ÙCêÅq×97%ˆ‰«T<© ËrUð¥ÊD[ÔŠm¡F±\»rÄB¢´‚èÐ øª.42Ò²Ä[g{ ЄÁ7–¾_¼8xùØ’&%&¬ïõU7Ý6Ä!€|xËÅ~$W‹w±å¢1|8iPq÷8è¦/þ^Zê©8Zê#/а8‹M䶪Éëç{õÁ,Îëq7/ ^'-À…®.•„P)ˆ«øñ9¾ŒÚcýò‘È4¤H¯9)Ä ïEB[³º0/âõio³õ&Ô»>Ëžn‰…KŸÛXéë]UœéE±pZIB”Åwá)Žs;›^akbyé5)%<@}ªí7ÂH€™ÌÕöØd!ÇO¶àyªüð6,AÁY֬ѣ Óëf!ÆIÍŠ½æc¯Û€$ ÉÍ´ùh .øÁmN4‘úÐçÊ¢©G¢:$`îª#*frV&N%±5^‰B¿AdIãj“—úþÊQ=¡:×8;D§Á W†6׆ä»Ãâ6JƒŽD¦ÄáiâDŽ-lëL⥠ðÁžë°-f¯ëS[@*§nˆ¬…}•›u²V‡Mo3ÀÄ›¶d-Ñ­èIéxh#Ý\@†(‚ Kæ«ÇÛAüòÀoK¥Rö†«³aÉâò Ô 5hÒf[2 QL}þš%2‚ ‰Ê6ôB™ÀÕ"0té,©Dh‡A†½»ü«·:×êßga¢q¹zt%g±‰ZH7p+h‚HUKHï„#!l‹Žy¿}2ÿ¸ÜJ¿_»ÙŒ Ñ`××òr†2âHäÏõÕÏ üyÕ Ù\ªÕNCÔ×^é0‹„z±äüÄÊlÌ€h»Ùca©,ŠÂÔª#dêï©ZÅV èßæ8Ì—ýØ/—eÉhÕ¬6,dX„(˜ŽØ3vùr¯ŠcûìAÞâpq"¯!‰ä'¯ á6 9Šë6‘=5#eÏ'ëoÉØNÐß8DÁÐt˜Ýn޼Ñß:ì¹Ç“¹l—smLFW’—ˆ£Ü¼Äàä[]-•‡Ø’¢³Ðx¬mt2Ö¸y¶|¾×Aˆ†lÃ9öXOöQ§á”v­çàHVNˆÈÕÀ++Ñ{ûØùÏ%©úU¬7Hò:C¤+.xÐ.flÑh¡H*7b€¤ØÈ U1‹¨/’ÙÇ.Ž!·•‘¢FpÅè ¡õ¥ ÒÕ¨/½›õa¢ÈNÇðˇ“5cDŒTºÆ–kC,ÐlæKEÛñòmºkÌïÄ^V,HSŽO/«5ƒT)oÞÍëBÒ¨Èw—Í=f£úÍAh%Ùʲç%%„L¹uEIýÚÛ¸+ sèNÖÙÐQC.i4¾\ön&)!DÊCÿàe!Õ>;!Ñs? ‰x2qã{Rˆº‹²(òKé•ÃЉáM/\~¾,ëË~û"aó@¢:qµÍŒpàú ÀXy4,¼»–¢ Y2ñî/ó‡Tü»˜Øªn™, €ú9 ± ]”öI(#Ï•EpˆtUŒ%Ë |é‡O6¾É=E´—7rÏêIAdÆ^%Á*9Ú ïâIÈQR“ˆûÀùï¢ã>—-ê²É+ΖÒ×}0L£Rà˜ûˆ1Í4ŽóÑMp†åÖšXãmôv¯xªók>|ª‘9„–ò/‡7ÛøÝhePäÄ:9 ìeФãÄÐàß:µv/Mf# ‚ÕáÓF£ö¨¨LógÙ^™~7š2°Ç¢Þ¦Hž‡LYCŒÃ³òwSbÈþtalDÙ„V?ÓÜHx˜È’Åov¸²­6M¸EÃÁ··Áéƒ\¡ƒO4 œi ·Øs¬#5qÄè®IeVvßË'±Æö­6åÞ^&T«8)ez@a'lï£ZM˜›´üªÓ}Ã<õФJz´h­IÛñË Ì€BɇԸìö­Yg¶ø¸¾Pû!fóvÙ >Í6É”G Œ*§4¸ßÈó\Èí¡Þ+"¨*­]ìÚm©$ç¬/ÙP€ða]¦5d€Z¾t &¿ç¹àã ʹ¶8 ¡²óÄŠ‘MóÁ6'L{–Õˆ´ \Y©—Î(Ž^>C˜3ûB0D½sf¶ª|‚ÊiµãéÕ?ÂBÈÖàDL*áܶÔ*t2ðV¡XU ç4ïä»Ev#w8Ö³ô9!·u†£z‡¯t"´¦A"Í3&qÏg^ ºÌÕ•q@#XtÚ„¸ Ú„Z(uL¸4Ô£ Q@ÚvÆ1´»$ìáJ¿òô™×µˆòZ¸÷ÃܼëЮtÕ¾ÞK…–;BÜQÃòÀ#ž =Î]ŠEÍü“1ŸÆ¥¿­àÔînÆ(冼Ev;ŒÍÙÐ0Uf)†ÜrÃÅ­Î'\a8ßt>cUŠ„ÑJ8¶ŽÙ³ÙA~ä§CÒ!G±Ç®Ü¬:¡EÆ+¢5nñL`-ì5²Š7haC‡—»ËʺÄnêwýå™WÜá‚׸cHŸv_™õ‘¬è˜VІîZßž½üìxX-‰¶˜ÁQK˜íLÉ¡b§ÜLtz€gFB]Ì3œ÷›ïƒN<©Îbb c°1Ò3k¤ß\䩵†(ÀÑ‘IònMFÔ&îA2~7ý¦ÊŽ};,ý2W n1Bdp‹]î(%-…NfÑ¥˜Ñ‹¢âGAT•e­®»ï–äÖñql#­ÉÿT)AßôEï?œšµµÅ-ŠÙQ¢ÏÙ—¹@‘½-sñÈ–”¾˜W€*~B¿âÌOxXCø¶¿Œ…UÙEݧÚÀO ÌŒs&™ èrâ3ƒ§îbva梥:4,1Cäƒb²ßí)lâž!Õ9HȈjMê=Èν{þ²EºJ3‘DÛLzìäÇ áCÌ߂Ŧ×2 lE«½ƒQ…aŸR<`Y“õü»Gíó=}ǡü~Àêì³wà’_·H±ä“—"©¾78&0öõšI¥ë¤ï…L5™¥ÜHŸÊ ÷;’[ü‰S2>ŒÕ"y\ ÒSüwð“äð/;2ä÷¹–¼VûЦ1Ò6ÉØQ¤°û 2YÜ „Èâ;ªþ¨?c‚^ô+fô"wÕ% Þ_%û˼ñqé·æ¯9Z)/Mæ=|äV –rC‰t ®$‰ÕT"F·õœñè¶žÑ^‰´³¹¥€ ÞçÞè¯"ªÎ“£Þ*­Ž§Vï_æ‹ÊN“ÏÜ"”óÄ:¥¬ ÍÕzšpƒ|„z¿ÃbÓ-C©ª­þ¢?_ì>wà¨G—#Ð@P}C}šyª(í ¯eúl:bÃyéËß_=ËßC¾ÓùV74×#Ëï×9:±¿Ø³1óÜ‚k4¸àÖ†$4çŠñuÍ4aÔ´^ôŸÇ$âFÁ)}µBÝ“¶œ_:>öï>Ëg&ý6:L?ñ»E_×bu,g*!@ŵ|‘c‚Óö»ï?צÇcz0V5¢ ƒH(r˱ënüŽW¦émž§³Ùµ¬2ÐØä\W2^T‰ÚçÅ>V·×rä@‚Ã(0ÂaHqwÑÅÕoÉ?¯UÆŠ'õp8hàùI?ÇjÒKdsøé}F×Üã«4òÚC”æ•$Æ¡‰q(Aº ÁÅÆôÞÚ¬xX»E Ìéù•´”J–Ò» ¨žÂxå åŒÖõ¤ €xN1]$šÐ0E°EJQhIÄM¹|†ÜÖÂ>ÑhZ2) »…°EÓfæ‰ü(é¤AêLÆÓµHbÂYÿ7FR¾U8W æGÅJ9I½‘ÍÕ6¯þ"hs¡MzÀ`# £‘$&3õg¿óTãø²üÞÀ‘à›O]–,w¯i¨ã[7©Ù¸j[ÐÇ1šÌ»6"qh;j#¡Cä©'h†]o86­ïA´ç Õ;GÈ Îº^ã`˜mǦ'³íýž쟃 '­mÝ3™hf”ë?¶/—€šeþ1Èqæ"ãÖÜÂò|¹×sG8ÀàN”Ò¦ùN¯¶Äs³“1 W¤NR ð"©TþȃCºAç÷:Í©Ðú®ÈÕÅ ”cÄԘ͆ÁÒ+\ØË.vDru·dqg.ŽgÐX–çÅÑ)Ï‹ƒ“_—µËtÚÏ;ÞsitG>€&©[ݱÁЈÆxP@ Ñè~qGÂ]åk¢šâÙ`å!V4`´‘ûPôßž1Ñ/½^tI—„Ñ% k—á[Xâö&éêûoK½¾Rõùпj ¢IÈE‹’v‹çºlxIð¢e×\Ùí¼›;qõbâñ†H d]®oÀR¨)˜ªÎ!T$Ïž  )ѦȪ9ÀQiN·#)9l6 Ó¹‡b4ÊeÅ åëúîÅ›bL‡àÖ’c¨Пî^@K@T^Àܘb Èê/CõuÜÓõ¹+Õœì|J¥…àKõÃXN ZÚx±_Šþ ßYnœzÆY.ê(ÑÛ*W}Ⱦ“o[òãjÔr½8=>áwû¢+«ñL t¼‹K%Æ„iÑ›–Ž×t„¤è¢«( [³dÌ`-¤Îfêfr[’ôD‚ΰ‚ ÂE‰Qf꜒ØÏÙåæUbœ€Cb fDבPKEL¢6ö}w}&çB±¤U¹Vˆ©›Œ³™çÃV+AÄ8šáCRÔåìÍGô¼®r¡´ iáº-ݬЅÇTªÅqÙx¼ N½Q®Ý•¡V(.3Cöu{w#uÙ±ç§u\-\ê¢ §ï¤5/E½XXz¿Ÿ×s­#™øuKR•_j)q2…¨– uU0†U5ñÉ[Ý;ñ ‹Ü1àî¯ïf!F «yJ†RȱÇì’ô.¤TûìЃzz}ráÜ¥ƒWþ/F=m¹1Ü·ú„EϽOA@TŽ–€®HKj¡2×KGñˆÖ†Nhƹw W¥ZBI!Õár)th B¾ª×V§C#ýácÚ£Cvë@ErÑŠ$ ¢«ùð$$…P”mrŽÍfWW±r¦†È‰œLëpÒè/Hm‰ûE½¶³w8’Ãd[fÚH,õô÷\Â*a ŸãݰDd¨Éôaú¼ÏÂVni`•)~3¦¨„!T Âj]ãzAkèRIJ×?9_µÅQG` Kúr.#8º"Pt` q¼Lv{`i‹BjLv^r^a4V’ƒT°*‡DÐŒLzQŒŸe~´lŽûl4²ƒÞ9t¹aIM²&±$+¨€aíT^’¾ñÒÐæClv$K -"@*¢:þs_13_Öi=&¡VðŸw¿n@ŠP)éÉ>úq©µÇª† §û]øi—Ò˔̜±?ÌQñ]l‘• r–Tù%µ¶Kú:lF8-½‘E©ÃµtUB"F­ÔH9ô²Z"ÁVÉç{#Ç…ç•,KÄR‰¥ÕLÄЧ´Paì>LOøÆŸr6d ªË€Öt ÅZžVÖNMÉ¢b4ÊeÅ M7€7µ ;R¦ó埛FDS+Å ØÕ@£4ƒéøEBuäܤ¦L^„J™5Z@‰¨,5×w-“vÙBó« ;Ë8ad—9{NC¸ö*{‘Ú²°¦,5K¶œ<¹„–± ,®ÝÃí#jÍÆ+¡wA‰B³Ìg]kþQúmÉóG‰ˆs1ç %*fÊ)!­y•CÎ4”:ª“±%üL~ªäbDsÖ÷ƒþÕpz!@O¸çkQ¡˜ßî'ÈoòsÝV檛ÔÍö!tØ|Læ¯ý³Í'ù×tm „A ƒLëõ:ãö¯ªjtª*¯B˜üßU¥¡úuÓ]…¿¶}Â…éÚƒRS ðuôÿšÝg»Œ±š©uôþ×¢¿ªD…“9$j¦m3Ï¡üô¯åXÓÂi:½“¡~¨”~@Y\sË{®7,é'“ë>{gÃ:$t7êk؉öÙ› ò†µNæú.vwÒO|Ÿ=^‡þæ¼›¿1J}dŒ‹C½ûß©>únæoTæ¢b¯PõÛãÔ/ŒÍýdÀ¦€ˆDö+浑(ºI b"‰Q"¤CD`$ú‰ÀKô!õöBÝ–Ë=ÖÍS=ü»ðJ0k"·J8·ægØyÿ,É{ þ…e?±Òþå(Í Ñ\Ǽ@É«4PSÔ’¼VóÛ77‘mQì:QÍU%†HWCdºª ÒÕR…U¡Ç…EUèp!«jV‹œ0W(D_&• qo!FÞ’É/6;"#¤)Y“)díRÜÐQQ‘9· îAØ–š¢IÑU¸È°dÖµ4 dbø„Q&ðeˆŒ$þjn%ÝŽ_VS²SÍõ}Ê;¦ƒÐò¨§• À”ÄFçå™FÄå¬éö[‰û8¹fw˜ÝØ–H\e0[„5¿›ÛªYŽB5¾ìñL“ ÉœŒÉŒb‘«¯”!­ŠT}ÂRªLhP/H²”$’{,wµˆ2¤iE&¡,竺ð˜ËŸà™5ÊE•· Þ-ùHÜ× ™²Èú^µZHõÖÌ#üÅ’ôqç»E-}Ú'ÿlÏ#‹ÄiMI9ZIùú^r}¨ÈËÍCê’q± ÜWGü{õ¹È|cÑCf"ˆ¢äuŠ àÈõ‘ê3ýÅ“Œ«H*ȱ~y6ÛÌi™{g?¥E6”ÊbkÖ4]Ä]õ™x3ß&¡ã¤«ú,{[Ú Ÿ[T†ZaT¶\ï‚°â=FMëj7†.QÄ;ßE§eÙ>ú›Ao‹BýµçÚ’@[dQ_ïëf¢fgÛÌɼPaû‚=·c•[ð®ËÛtøÔrAA ;ײ¤‚‘z«‡7Cö'æ£ ³nK2¹Ú°o 9ß´…Ä.“ÑÁí^.¡}Ôs}®œdM-IãÆ†Eø+Õ‡wª ¾FiB ñ%ÍèC^À{fQ*¤6©RQw{  c°oxÔ5'0\èwC¦6q%áß"N·Sñ¾½ÅS „ÍÛXæCFÑà‹ÜÞi ‹M6cë¡Û­íH+Ru X «|é]FCÁyÞ°cpÉÂëÍɨg£Ç Hø¶2¤ Ðmǹ† ¢PwÇ™*à¡C–â™C ÒFÛ’9†Úœ½¼âh6bi‚Ø5D`jäÚFah@l[4ÌDA\Oð±Ëº¬²¸ðÉ[¨âQh°¡‰¤ÀøXy´ÆÁUÛP‚vÕ ¹-öp“úÿ~÷^ŽÌå]ØlR77ü…ÎzõMù ~®ARÁš´ë:,` FY^}ÕÜühéþÏ~úE“ó¹£¢s4øÝì±×D¸(‹¨îEƆÝv«¦oRÅŒ‘•ms9ÔþÙÏ|õ ™ÞdPj––WÙPÄŸ" .àȽ(Ú²ËuÔ-qñä¶g:˜p@>!/ãÁ"§òË«Ë ;àLˆÙ²(ÄLØ©é!ò°±Ñð`2†+8 DÁ+‰(:dKD·í Ñò`Ñ>¸<MI:`,ŽJŸJ‰‹‚H%[]5rù²Ó »q7:«w¸X¶äF ©†“ìÙ§¢E^Æ9èyª$ [$†’\Á)¼X‰º3R“ДkÞV¨:á*¸ BÍWÝ?W8~^«|§)Ãϵ®q’x*KEª\1SŒFy«Ñc‘)Åzƒ«øE²Æ nD³zX&)ƒ©x·)êAy¼ä=Ô[z³qMrÄébÔQ±Tê\I9ZL9©»+'3'Ôê_*ê›?3±™Ëó;}°4ÄÎMPŽŠ€«~ÛÄĹu!¹¨T\ÜË&"¶Aç Ĉ"—=/a$„’”u‰ÈDmÌe壄+ ‡RSëØ¿¤?Qeï^Ð&´B¨K…þReDÁÆ"/ëžidä“ ó›¼¥õ¸`eÑ#ÌÈÇaÀþ2¤ýø]V]?ÉÓˆÉ XÛ1½ìw<‚ƒx®-Eè$–Ý}×¼B¾A  fšjASEowkp©Ml``—GÑôŸ« Ý€`~£ŽÔ ®bÝHêmºµþ<»¶\3î8 1t|ŸŠHô8ó£K¼ F\{¹Ë,<¬Ï6³Ã–ÌÇn£Â™Än¦¿áÂÏ!Ù“¡ôW ™hE‰èr®Æ`°ñSMŸ^>âóþš/{õ QÍɇÈ È­¤‚9ľš‘˜Hø´½ç%s<S9N/›Tì q–ƒ%&$ ËR‰©AÐìRC¨ð9±5©@†@  –É×’ºMjóáóÇÍ!žcÅ  ƒy©BÉ¡"8©]àQî‘ýâíÂÓÊLsˆ}ˆÇ] ×¥Bò®qܨí•Ùä¦i öXÔÀÛ”Éóâè”·‹æ¥Ïocó]ߺjr£ºK Ñî¥ÕOe7‚‰hЖì'Ö+Û¬Ó„[4|{  2ÄDcWFy”ìIË^㹪£.X ¾ï“哸×ö.F=Õ±©…Âï·RwŸŠï;ZÐo!„A@ ©´Ò›&cê©Bâ<¡`òßq¯‹0G Ág&¦åro»ÔŠˆÑ´š}³‹K|+£Qo‘2Í6•G ¡"Ôë›o<õÖù•‘úuCóäœì”är ' | 2ó~õúÕ=ù.5…Ù1Ìfïg\~5`ÛǬÐ@ !§ù(¥©Ö»ajFM·—P©ì)j`2ÓôêB|U½EhŽuêíøo/|Å'™–-šKvs"&5/ú­×*wC®¶ân|VI°›1›†› õGzêò'öÊMÏ -Žü4M­iqPÍãd°lÏÈà“Ô§û¹/¨NŒ¹#ö2ÖçÕñÉ‹iYÏ™õa7˲¥Jý¸Zëݳ¥K«åØ3šó&ÔÝÌ ÔKˆ…ÝGÆÎ~2T*ý^¥ýC5Hu‚zÚ;º“¥ê¤‡é˜þs½HD…5ÄÝŽŽ£åÉh܇¸â¸ ök¥ßßt"v”è#öe®3Bbp“½.ˆ=ð¦GŸã.µõ:=Š‹®ÇXËFìXVÑ:¿’ûÊe6;W ƒûS¥<1»/´fénñì(Ñw±#¢_æ1B”ìí"„Ä良fºÙEÜ×s× ây9;¤íZíWÈ¿ÌYÜ¢SoPµü `ÞãE÷Ú}Á‘3ƒ£.2/3¡›lè5OB3ÆJ9̈r—оò5qjÑ­—ó: ì}ähu¨°ä>¿î—f¤²8HÔî!ö‚þbjÏWÊ„ª­ÿ½°T^hûUwd® ÝŽä!wÁÚÜzJ÷¡Ø­Jj_óé;byl Xç©™}à ›òCDŠ„µHªŸ«É\¡w>’»E}5+XÙÁ‡EPër¥=%ö[‹¯0®þVr½²aaG¡ ŽKRn„55f ïµÛG" —‘Ö-lšH黨á¢qÌ5‹[”à,î¦DÛ Õ·”qÞ—¹ ïËØ!kÛÆ{ ÅÎårÎúðb2ªç¦2óö!dQ8øJF:PWÒÖ±ÌaA 0û -=Ä`˜»‰%niw:<ÖW/ µJª#­’u@žnjÍÝ„ÈÛÝÆÄWÞõܤÆð5KªLkv¶øÎ2 |ËQ£Áç9 &fÎSª]±ÛÀ~D…^äÕ öâd£§u‚©kÔüZ¦Ï¦Ãcœ—ÞfýýÝsõšÁò÷˜¾¾Fó…uŽB",ö€Ð<4úá:d^¬ãPDzÍ4‘Û´^ôŸÇdk„a‡(—^ã>Ù³¦ó»ëwµþÿ»Ï2…EŸI¿«ÓmÜ\ìuÍ!PÊrÔ%숪%ƒšÐµ|‘c•Óö¦ÿ¼¶ MI3¤Û6§îàïxydšÞæ™k²±è|I¦5.;Œ _§{`?/öÉ»½–£ ŒpF8Œ·ÛAd5@m¦ºè,ýZ{Yñ¤›Šý_üx¶ï&CH¶60½Ïèš;Þ~•Fk{œ½rP‚Ä8” 1õH—í½ø‚™Þ[›ëbv‡hå“ÕúJZÌ ?t‹!ÜlT_aŒCb2íÆd<§X\įG_î w7EÔ¢(5i—(XØg …°‰É;Ü’ê †‹+5™Q)?X‰‚L›tÉë_$¡¡Q¾w;øQ´ò ‰¬±Íd×6óª6ç»$~“_䣠$|6µXà|Û˼ù’ò oàâëOc°Ü¦º¶v/ºkõ¬Ñ¶¤/5™wr2¤‚UFÂRchÆ#ô¢>@;0šïS 1žº„Vï¹ ½¥D¢lÔÉ, ©ÎšêžPàöÈÚ3¸E£6࿽[jQ/HN wûMä+¾aGaáUž„égm$b€#+Ë#Ùí6bú…&B|›™]Qí÷5UE1êU¬–#u•– 0‹Q¨Â¤@<7DÇÅ-ÂÚ=cæmB ù®BWÕW2úaÂß_z,´ÚÍe B—{Bð1 ÔIÀm\ÿâêäFf]·qÛÂ,²D-9™ ÷übÿl0s¿ÉŒ|˜ˆûfjºþ÷á:uõ&Ôô(ów˜ˆAŽ“=¾Ê´êÎÝç Í^‡É¸“ÚÁ@yŽ3̆äÃì·f¶[³FŽ"{y¨0œ/Ùí¹¹Éû+_qž}_!aAéãmrÇz𠾓Tãð(.{ ^Þᅧ[ø#*ào@;ÍßC¨nµ¾Ò ÇË¥S)il¶é^\ à .†¡‚kU<%þÚ¦4+¶-Sß ¿˜¥îõã#¥îdËŠ£SžG§<çkðÎî¬Zò"ß"·à³™¬tQ»*L[ý²¬UawÃtXŽSm¤»Qg¼È/*ÇAs%»Û8œŸ>L—Ùns¹—ÜlŽVêÌö\™´iY£ÉyFÔ´ j¸«/hX_.Âæº›(~Ö\‘UXŠ.p©¶z¯ÇÞ¡6)­Å^³•¾¢py*ŠÞì"¼Æ×Q*h\7u³Lö°&³Î}<µ !¶.ç™F=}¨T³›àô\ÐH  ¢+…ŒRGË ¼«n¯zMç‘ÝiXTÁ÷͉A(WCYNþBp²‰‹Zº‡$½VÔÂ÷d‘¤Gý«)­HB.Z‘D]—­Ë€(PqQ´í¢kN¢ Ó¢ÓžXê'Y—ë°l3»ÂXš½c.œD®M ‰2 R]!Ç삾î_Ò5Óå6]‘!Lô#tÏË%ÅÁ×õ]-G/ºÃ]dǘBMNw³Ê1J`n\³¿tŒ!©% OõÅ߇Mv ïjx¾™BTKE…ÐOï1l-Ÿ\à Ÿˆn—œSZ‚rQ»dÕa ÔÄ·U èƒt¤¨ÖÓ§Ã篗\¹²WÕ@Ç»õÙš2-zÃÖñšŽO`ª]EKØš'ä(Xš:›Iãºz2pלæ"*’RãLÀe=‰OÉ:®"ºL¬lsCÑt£j¥„ä:JåëÔ`7Ò®#„îE]v}¸(çl  a,/‘Á•ôô[š^=ÿÀXb‹:Jà‹8û›|¶讉uz‘€Ð¨ŠËp®Û2€¼ËŽ©¹v\6^s‚Wo¡kËP+”–Ý/÷÷òØËqµ]m\z¬ ¯ï¸5)E½XXj¶¬çÚE¤—·–TKå<[JÔ¾ÕRi¡g®ç6T(NPL«ò¡áÂ<êîËï´ÕRiáýÄ]G±Çl“QCg¤ÞH5&÷?Âì6c_Šzq³t5™"Ñ“ ÈiìÇä3AÄ•^mÒI9F tEœFBe®—ƒ8\ó/}Ü­¬¥ZBIµ„ÔÑ$l‹ÂøL‰à£úÿ*a•‚£ô£¼ÏBȔ度í$KÿXÑmiŒ)~E& ¡R†P)öÿ¨^¢Ô§¼l`«Á§î ý{Ú\(ú‚&ÇÛRºBD4¦ÈxP@ÔÝpËœúÚ¢*“ÀœW.©`EMA32©3¢Kuü(ó£çôY©- ±1™‰ÃyE’eAˆ%+‚ˆ%ͦ›5I:ÈIgF›ügrr^ﺈ@ÕñŸ³øŠ™ùôKFŸLðe[aÞÃj S&-BZfWú(‘›{¬^¾üÓ)S¿A®gu?Ìyü]ŸÇl‰JP.j”øj6f‚•Øi?&¼ô²\8‹¾‘Õ,"!@…[ÑI%ÐÁÁVÉæ2xG‡°ç5%ôÙ+R‰Õ¤Õs” NŒ«ñí)çî|ÒjÉ (D+Ú`B]ˆ©äiEí ÝÙfk9kå²bËI…šô`ÊÓjœ/’ß¼0"UŠz±°¡ØU¡íJóǤê¸W€:¦IîÑbúaÖfZ .µÖ÷,“êÛ>²ÓË=Wݽ,“æì1DSÐÂ15.F¶4dK6SŠØr’Ú¥`ªry/º‡ÛGÔ˜ú²+Ü…Ð;Ê,‰Æc bõß–yÉ%"ÎQJ”Íì „°æuJŒ83+@bæ±¹òâ/C]LOÇaʸ¿N/8$ôæaµÝV…Ó~×®ÛÊ\õ“ºÙ>…LŽƒøÏ6Ÿôâµ¥!Óz½ŽÃ¸!ý ýCÕ5* PUyŽþàÿ®*‹è•úu³]…¿¶}ìeÈtí*ñÊ|Ìq»u5skþÇrlé¥É 5Ó¦ŽÍoû+ÿ±kzišNïdE¨*ð¿’Ê‚ä’#XÞsR[vr½g/6¬oWÄ ;‘Ž×lXwA7p•7¬jWìYwozÅw¼ãu\áúÝ©ô?Ýßù~ à|ßÅ‹¾ûàùèÍüÓýÕ=Ný@R Šÿ:ÎOÄ`.„_¦ßÞ?‘y#â±_<)“½DÃÞ‘p'è?ùP2°‹í øÐãÀ"Æ$â«v•€>?˜·C(ÚLd›pa6_‡X0ýéÖíðoIÞqæ¶°ÿšÍ®÷‚ôuèêÁ¼aúo˜ DGù=Î)rƒ:t ÚŠW¨B{ ¥¡HY/£Ýz‹c¿.½KÝ‘^N-ºõ2jѯ—Q‹GÍq4õÎjñ5𔄠 úÈõÂåÈ–p9qv7m2Ó£ÎKéµÈQbiÑ%º4Ù<¯¹¥_a“îÅ]Lm2‘q e¡(38Ñ™ö¢ƒ£MóWr¹`]¡ ian;)äu¿Ì›¯5\Ö(Ú±À”D•ƒ–ÇU))f P,aëd¿?¹Ï³+}`³eÔðºJQÝX ¢•²´¨PïÕ~ã6y¿ÌY×+feqƒÚ"A"©%ËR3¢V†RM£x—z%7!£ I…JD¹X¹´ö-ÃÐg:« 8»,ñ¹­Ù†¶0ë¯ ³A,³½»(8„òó|”ù!µ¹*NÆ÷Ÿ% ÞêSL,v7Zy6ÏIÊÍ ˜rõ¥B‡>ñDZMÆ•8„òucÑ®Mä%vt1 t¾W–iý|¯>çÍá¬.I t<–â bÉXPûÃI¢*Z4+)@(‰+Ob~*%ÇêOØŸë•÷$b¤,-2uàÊÑ“Ÿ±akš!完úÒ¿¹\kú°Ç]·sË }Ù²×™Ð% ÏzÆj¿6ÅkVê2 §u ^ Ñý=2…ÐänSöaœœ++B$ÔT˜¡D/€•×QŒgµ‰AŠ`ŒF[„‘˜Ì°Áö$»Cðð™RéN‘…äY;Ü ˜såä ÚÓrzŒÁl´‘9l¾|\ò´)˜ÉQ÷" Ÿ¸“„›ç沑‘­ÕA]HúÌKF)ËjðíÀˆÑó4¿ꈼ’boAp’qïN¢RËÜž8.Žæí"£Ÿ=Õî·ÒÅ(0°4WsÉ‚@…’]T¨V&n²2¾¾…c0èÏeDM›„=Œj¾ô©)ô4Œ¾¶Ìë¡H°ºeºmÁ§dK8>ÓÜ5B4j,r`—hó1ÁÎ68âÆÝØ$x¢¯Ùò»d!3çd„[öÌ.Ñ9°2ÔÞ“e;ï—¶u2ĦµÈÜ-ž°¯h§‹þ¼›4÷–ÌÕñ„%dl¦LdXa Ä´¯³¤O \ÒÚ„ n[v³ÚMG¡ ‰[é kw‹ÏžÓ2¬QDâO°z+Ä·¬ª†& #MkáÓƒÊVýaÚÇô²Å#tÿß§Ð&—«¬K³Ùl“—Héˆ%DsQp£ ð¢Sžñ¶ÀÙ ©`YNínøDgLÍAÓ·õë¥ÃZRóìhø¢3óL : Rúô{…=±¬š‡Ÿaaº!-°UZ£mŽÏÇà\Ir3ÆdZ‘™ˆ†¬y65ÈÑ €y~“’Ý5ˆEÑ!›uØÒùu޽Çãê©ýag¬ÿÐàˆÖåͤ@‡lYD¶û¨åôØ/Éà¼fG$ ‰9r €QwºY´¨A£fF¶åtˆ»:7-©d£Ó:qtʯœ³ÑiyÝ’¦äZq3Fž([:ñGSªî®Í¥.˺…¼£j©¨:l ER²Çš®<’Õ0N>ª£ˆ¨ †T®~ûó†¡Ót>d$_eW¤åòš§!4¤ª^ºB4Ôµmp¹Øúo¿äûÖcBûA$×Ê+þ!BIUü£¥Pv@ÄR/ÆØ[ù"ù¨UC§KÏq9-&5¯¥¢ÅtâŸËÙÏÄ1Å‘)#þÑA´¦8]G|§ õ‰ãBy¨»ÞØ"+J¡)×2J¿‰jb7!l¸Ýl oý¶qö©ÎÏ­Vî¡MM AÌõ¥n£Ðcu5ÁßÖ…d[Tñ×/ó%×™7ñs/ÏR‘2T-BtÈÎÄu‘,–Šªcq%)iÝâ„U÷ßvtDzÛ€¬")߫ڄ‘(겡VyQµTT ÜJ<ãl uŸ”ás2íÝ£#MÊúÖá©Ö‚äH!äÅ‘C0^ " ±pÍ÷ˆ¿¬&Sˆ~ã¥>¬½îºú'|TZÉTF‡p~Ÿòº!Úæ×Y7/ 08@ýæ@Ô@‹Iâ½S›Ø€ùdÛÐyXUFFmTDÎïC\?ÄÐîúÙ¹b¢’h%}ŠéÏCÓìºÛšé`âù‡Á¿LÜåDLÔ`áPê× ÙW3*¢øìÄÛïDMã6cIò„ƒI 0;{vÿ³.jó„—` £`a¦Aþšõ±¢I8Qùk>j=&¶º×|ÙËÍT°‡±ï§&g6¦D¾¼š  )(ö~ƒz9{»ÿEÇëv}l¾lªÒ3$UØã5jbÚbôCÑÔG´+½¦°UG7‚À#znÀåûÆåy˜lŠ–TÙö2yEÌ®yc^Ž@ ²L™VN)žSÌæ©ÀRÄ­ú®ñaÜ~ˆzBÌD~.îXà^maBÓM!ˆÛå^Û:©Ñ·š m³Ë\°% ”Qw딕ST•KiP¯ƒ—x˜zEòœÈ«ØïŒz3!F-]÷ù%›X£xæ&Jáäý¨,—ïïYþØl tt#õÙ§ù“>&‡¬ˆ¸ðõ¨FÓ|Dû•YÙA ÖW½&aiƒ“T¿nÆÓ¹9«iñ®nf;K ºõ‰±·—¾âe±-e¸ Ððl¼UHHÇ8Q®j'Ì͹ǖ/cóeb"3(”ñ¼e!K Ô~Xkžz‰úϼ„6.˜/g¸âe0Ýðc6¡Ò•äŒ(I"°gýhåú~Ÿ8'â1ÖMûŽââ+÷PÚïRნ®’èw/ؤõ0#‚u g±\²‚~bˆêÝb…O/™qZ®¥¶?ôîâ2öø§ÂˆK³áë Œgh¦èì%7c·cùŒ µœm™¨¥¨›*äOÞÅ–á鬊U„µpŠÀ;|Ô'Øuù <Ç­î\בŸù”ùæ½bê3Ì„Þ)[<‰rfT™Q¾o+Ì©Áèx¬Ååô›Ÿ«Õ\ÜIÆè^2Ô<б+[É»çDÓœœÊýLE«ßr$_þ>ú;€ŒŠÉ°gã‰@6ef~Ï3£b§YÅ éôË ›O‹[7¬Ô Qƒ¦žei“Ajt¬Û·éA|æõLމ‘ !mKB‚¼‡’ÉŽ‰|•LÎÌÞldfA)ûõÆ>?"lÜdG‰¾‹2ãß$Ò‰ À›¨Â£š8U¨¹^ÌicVQï«x3¡Bú4¹¿}âÈŠd6wª-–f>ÓÜr>Ì,%a¬NKÅ\ˆìm±ã‘7;8ú¨›¾ŽÇhM"Ç£×x†ò¦¬‚š¸ö,ûÏÀ.RТSÅQõü|ЬRÌ$û^”EÙ¥ö£ƒçs_FcKód“š¬YbÁØ:ù^eÝn°Ìï%YIî®DЄªªÈáFˆ¯1bÈiÏDc-Úí yÝ„¨6t¶…h«ßI(©ù[°èOáE³PšvbjO´+„Y—“¹‘eG¯ÿmYºt6q’¹õTˆÂëóuú.]žPWë :V 5?`2mËdÓîùE÷ÕdvÓû¿É}—S£le™:³âª;RúÂݯWÈ<Öe}®‰"çâ>> ïáƒÀí.ÈnY ÛœUž ’òο÷“™"+ìK$Šë5 (óéj2í9aû”Äâ;Jô]ì(Ÿ÷в*<ªÉ2‡‘i§ù9%:š³L ÎÌΧ%R¹œßó×}®*Í:çìäÊ"“‘¶‰Á0—ˆù~eV_÷(+cÛzFJD‚¨"­. ªq¸Vh´‰ŒÕªH‰ÑÑK±S£6PßÕLæÝm¼~åe·ù8Ÿ¯SªÆh_šLHfv¦wW7qJˆ|]WFxRQ¬«€ïMÃýîWÕ\;OC4øzD£RMs¶/féz\¾–飷ø/¯óÒ§j¾¿>zejÙBÍ]³Fó©uŽ¢7™/òÇ(TKÝg˜g¯ðk¦Ù£É˜ƒa_PW`J@÷Öxî~0©GÑï>ËÖ'ý.>LÏssü×5‡@sËP–°Ðq–kù"Q ®­Á‰ÅE¡ªÿö·¾cÞñÂÖ4½íÞ?“ˆK'|5m}%cõ鞸̋}?l¯å0¯”€Ã(0Âaá@×Lœ®UHƒú£ÀM%'›‹&ÜæŠÓäDÌ–›¦÷]saº®ÒÈvtÖJ‡$Æ¡i“E¶é½uá‘ ‰q(ù\Ú(j6¡Òvvƒ1Ò΋SèÂF|$¿Š1cÍ)\¨'Ó6LŒSø½ÉŠR?XHX«gÕÂsŠ~ç ‚’D„¬§„î±…H¡“àƦQ.™i‹êP"qãÁg$~¶ùˆÄ.ÙTH Ý$¦Ä\ÑÊíú¯@RÚY¾³˜Å ÛMô¾›i}Òët,“…ˆD·¦¦·ñއøíãÎM?Á¿Ìc¡Ø%:Øð¼6z5øim&sT­½»(~^蹿í³Udò0cÏ$•µÙG5ŸX¡ÐŒ"škû¾…%&RÅ0Ú‘¢;[Ý4{ÇJÝQÓl¼šæi¢&ã|ŽâcÂÖF)¼Òòÿ涬åf€.ˆa@[Z²;ÞÝ[ã1l”‰J­MïLOm#)ÃÈ„Yoæa ÃH ‡ìº©MÀ»¸Uí÷²5€ž4Àù¥ÿ›ˆ1X‚Â,A!Àjê†ÅÒZŒ^Û~`ЄÒ{_QW¡’V22<éˆÎÆX¿ô8q[žШóÃGmËMßÈÿ-V¨}@Øv‚Éñºç}ûçàm~XÈd3ë kÆvÈ<àPo¢çô»W›ÃÞQWÐŒ8ؼKVápykÇÙ<•tŠ-„ÐÉ¿š¼ýS! IO 1dñïGfór}È`ÒÌÕÎ ãÃ7ðÊìž-너áì|4l4VWúeöŽDÀ§1·h<ƒ»„^Ïàö\ν82<®ŠÉZõ¬*¼ï]à×f»X¸‘OC+G¾Ìñs?T!0 âbq1 ÇæúYº´Ç°çæ:nX¯áî2‹ùº³~|¦ý>ãkR”çÅÑ)ωÃÊ·›§¢ ß 2*ÔcI^ïK¥£ê]ñ6×¶Mç$½Å&¦RÅÓ?[*¢rTÌsF¢ƒ&Ľ­W¡Úh䳕¸Zjñà|‡BTK……°¥úMÖ‰ …(—v,qœ&à³Î¡v†o¼·ÏIXhÞÎ*:à?) <àWŸ­¦ãK‹<ëÀˆÌÇÖÏr¼Å#„ÃÆÌW;{×t|,#øËâ«Æn<âpÕ€¸³Y¾XWBj¯»X¾fý_„]m,7KP)iá*šÂ¤Ã펦.ßhJ\¼ €Ö‡a‚\u¥V(ö+ße×§tsnR€>S³»M5lAR9ˆnϱ™‡ÊŽr‘¤ÄV}(¾DŸì~À%$:lÒö¹.¶PX¾p>öVÈTSµÆ U>.›¨%áQïêk/—¡VX+›%¢Y,SËÇ.mäÃ¥tNûŠ=å³òÅÂRTŠçcr£[õ±ÅÛH(œ%©¼ÊÚ½” H Q-BW|  Q¨õæã}¸ÿD•ýÌWûz§¥ÒBTKçý£Wí¡&• ùÿf&d¶¢“Ëiáv›~¬^ŠAð¼ï¤#ª³RXz2‹ÇöŽõ¹òb·¬6¿ZRŽ–€¨N@×s„áãc¶L•½^:Î^œÞ„܇úßwGa¤ZBIqBªS;)th, ¡!år-~â‚“êïÃS8%iV—ßkE´" ¹hEó9é§’ÖO»B3Ðx™› ˜9m4ðfÔhT}â¬4úÄi?#âè¶“F§íüѤ~‹‚=N‰ó¨æ•‚0„JABù@”êMu£Ð+èÂobÔdvÅ$¯¸è¤ý–Hœ6ÿXУ1*a•‚PE™‘QÛBÈ”Uua5™Õq7š²‘ÈQö-‰58m.* ÍÄt#8ºéðìµø ¸CõˆS-ŒÖC-Ž›~Žx„noQH»ÉNxÏ«(©`EeA3è0bLu""?‘ýdȔޢ(i“™-ž6Ä0Ä’eAˆ%­ 6&’Ô ¢-IÇéÄy QÌ7;&cEÚ]$êæû71Å×Ý,éè\ “É¢â\Í»_K‹P)kÙ¥«:q5KÒš«—/ÿt†Ü¿QÉYÜuhJHH¸•ÙŽÙ¼Ùåf°u^Càý²f^SÂõU—‚L¬!…؃lè¬ç—ÝlÕŽ'²)çþiÊ@"T–ñ ÚBuU4…OœVÔ(Aª1)£QN:A…£ê£ZBöô¡•ì0…ÒJÑ v5ŒŠ1¢:+EÚŠj(é^w*àyX”‹Ð ³U¢e«ã‹LEjâû¬þ`î ¢«à/;«Ÿp¤þ¶.§ÒñØ«•‹ÔBŒy›)El9IíR0 ½Ð¼Þæõˆ:Ãö‘^ý®ƒ%1áXÈc…þ#ÿmÕÕ…Pá—Ó£(ÕC~ózô›Ï¡ß|†]æ›+Ž\4¼%ɘð8L‘ú ÷ÃýÕDô‚û(NôkQi‡Þú'Èïøç|ÌUúÓ.qa¶L“ï.þ³˜´¯IÙ¥¿£@t!§õz‡ñý A9ƒ“ Ê;*GØÿ…û1+œDDñu³^ù_è¶ms‰éÚ ï;°.˜™ §m5Ë5üLWYj2QF Ó´mæI™ÿ€þ5©Ú¤¦éôÍ¢˜õã.ùÿKÙT’rLË{fRí9Ï;ßðî/Ê]ÃSl|Ãû.RÐ5ô_”»†mÁm…ö}%¸­@{ôñ:®P~÷RúOµ‚-¾ÌÒõ¿»õù[ôOÝw¹b«ÿuœŸH$º`úAäÚì˜Í¼ìí&"_²÷#{Íû¥Ÿœ\ÊvðARá&úÈòa¼Aár1/&ó^b‹fó±ö.ƒç¾áX]É[ÕîbH/Ï&ß'®ú7²P/Ì‹? Ò¢‚EÅšL3lñ0ðc¢±†ã¾^½üè±W/§Ýz9µèÖËŽÍ»õæj1 7W‹'ÍëÕ"Ò;«•ühæ.PŽTôJdK#¶t†™6™9`2ë÷—"×¶„c3apÔŒpÑP;WOÔ…Ó)%)ºX–Ìâ2"×€¤¬l79Ht%WQ°¼aL‡ SÓÞ|µðã²G./ þ>`Ü z…ªC%«•>o¿Qº] +¹¯“"¬Ù}.¯6c&­\/:ºýX‰B ¿l\“AzÉš[˜Ô‘“°«|aRË2Þ”¡_=ÿK£´ëeôD_I qî8QÚÆ#L`ýP"òÎXHƒe‰’ è(x§ÿÊÂYÀŠ`{Gœc”ˆdæùâDEFl&RŸEÑü}æ¶Ån¼S ÷[jŠú€UPaêÄt~¸¨OÍÓ[|`ìë7œxä%ò~1ÉA¿_u­ïÕg[›Zò:ùÀO@a]\‰öÆC¹qåIØx9VàÎþ\¯\ ¹˜©CR±Ø°5M6ðqÞz Xjɨ¸ø`é!aüôW3åÙmx¹õhÿí%2®\ bÝ8 uÔ_Ù”GÃ}@>¤IÖYc¨u¾Œ@0OJN€øJƒ’€Ìë.ôß—Š@íêÄ·®ùí ÜR¸ÜÚ—ÒàÓGãÜñ —0ŒØðm¸.$Á·JÎr™oÆ.‰„@¥ U?!JRÖ‡"Fmì01ªÎèjx’ÅaÒéhl»W…L,ßúC„È¥B·3‚•š”ÐDŽ¯Öš™Æ%æñ)Ÿs=5è×íôW¬Ïü´>Û,QfM䶉./ ˆ®4UÎì*´§VeIuæ;Õ WдÅ4KCëW]u(½Š lŽËç-Ú_óe¯úTpɰí»(è墖¸\&›HDެ.™I;:mçÉ@ýã1íÿ˾çÃ8únçù² äÏ#hÇú¹‚˜®ÀE‡ébbTŦyVƒü£Å.ËyÃ!³¼áw”^ío:ês+¢³>‚¸u¨K$( ÚwKŽ2HJ~ÏB&3³Ý¯Þ:-¯CÀ  Ü«N´âçªd,kNÔ,‹lt³ô)ˆC ¿L¯º.•UuÙe½ÉvXLzŒî:¢[/WGt:tnÞ@YF;^W¿æ²‘P¥F#.›oÇm&¹Ìiš2‚ ÞàºvÂ7²ü$CL4ŒþíMÄ ö€B\[ð ;oHè;rù$Jí’¢Má•Vr{™tUæ€9ÉÕ Y¦L):)x¥¨Aâ¦}—êg&DÝÓÑ9+ÕnԙΑ1È,9ÄCœ|äÀ˽êu*u£y5{ôf—Û4€ºkéÆ˜òD7d(5tñ0õöŒ½€o`‰NîÖï†Ì )_º¿‚èçœuº?ÁDÈœ¼=z‘ýòs" +Û^ER b¤>pÕc…áÂC+ þ´Ò|Äý¡Ç$|¾…cðùŽAÁгëÑ?œ3õ!c„Þ#:Ç6èCqïAöŠÞ¶>ÿ¬ k~ÛUˆIǬB‘aš÷¤÷”M„¬ÞuÑÍÀ8kwk$VÍÌ«ì3gÍ]¶cÚ à‰Ÿyi¹F‡ïaЮYérýš&ó° léRŒ×dôhxMf ^“Ù„š×éC ´;íŒ Tú ÙVºE¡`‡{‘‹x*õ1¯v‘u÷Œ’u‹ËHÛC•‚v²Ì¾Ôˆ´@dq‹ C.‰!ôêÒ¿p´úÅÀØšö„þ6ñÞÚæìvþP`£¶ÈØ–)·uSeÜh˜*c15ˆÉ=Œ>ŸÌÆ€rc}ê›èǘÚ?±;£‘ÿêζù¹WiKëg½qÚ8üÒz¶š!¦->¸cíy¿O„µ¾ÞcOaµõÔ@lt uÇʘ뾕vC”—ï Í4''éƒ~j3/.G•}süèvòÚ$ƒóWlj™‰Šm3¿·dhWºnæ›öܼC~/ö­Ê¾"4ºF†!ߦÌõmÔÓ!z.^ä ¼†lGqØŽ`L292ÑÀ’ùÙ¥ #¶Ø­å(#Ù‹X1¸Å‰ÁMFˆ]0½IÄGyŽ–q;­gT¡ßz†ëû¼Îî±öRYÝò~²0è³Ö8kØéæù:íì}¦Y(}„™9&DÄ8@8©£¿ÙÛb‡ÀÞ&!ZöF½õ]ð5ºgT¡ÛxŽ©³‡| IßX›“ðê‡t˳èôԌ¤լwÌ4—(ù’97èÎüªtÓÌŠº¥BC,lžÆš<ê£ÑwþWSzg1ìêhìm“ƒÚ»|ïRŸr ‰Ú ¼E6”¦j‰;66 ýñÝí !a7+eɺžÈFjݶQÊRwú£Ð«$›ƒ¿È2¹ ëx}¾NßÃiRØd 1¹dCH²™cBy.Wd²Y-‰y`ìë7Ïl`UÉõ&xrG÷ðÁY™u¶Ø£u=èö+Ç÷­¼ûÔ'Šß?áˆ5ð»}N’÷Ñ ˜Iž·Æ>¸ý;úE£;P"âô”©ÿìYÜ0N¿—ôÓŒÜüTFÌO(Ñg~ÁßxÒC<;žwY·Ö>—ç¯9ú0Vš–Í{ØëäX’(®þ-ÑC †™óîÌt ÛzÎxPfŸ®´—ÄúÚC7­J¤«âOϪB¢Xµ¢¡"ë׿Êg¡w«ÏV&@ö¿òÞgço.õî:¥*Œ‹ˆ d*X` ù®‹Æ!³®aÜÁÑàÓIÃtLýÀÕí+pa‘+‹4óùúD¡LÁù°Ó6”<ØõU)—^ËôÙtàµóÒ§w¾¿>z)j9nM_£)Ø:û(a>PŸmÝõHh‘å‘nŒA¯™&oÇ1ý×3%q”ï’ƒ;öÙ¨a¿û,SXìœôû0ÑM¿_׬ofÌo9  ; -±\Ë Ûpmªâ­“ASHr#©¯Uú&zÇ eÓô6/“øLç6 x%³‡I¥ëœû®Ú^ËÑ$8Œ#:€×L×j®5Ð`X?ÁaáÀÏôkäöÖQ–w¶Ö4½Ïèš Ør•†Ûö´™‰Ñ õHŒC Ðè…:½IÀØqãP‚D ÚñíyuyJ³e%ÒÞK¢?'†Ï€$¹1gR„1ÿ ;|Ha¶Ñ&|‡¨ÒÏfÃ6ýu+ß+³šˆ¤¶£å™ÐM¶©u2óvx§¦Î$\ø´Eu’¨þÿÐ]*”H³G Ù…oA}ïeH„^Ÿé4fmÄv½oáýò_{¹§ÎAH"Ó*HñÛǯT>À¿Ìi¦gøÉÆÂaºF7×f2›®Öf›‹ƒmîžz-ÁöŒÐK™m’Þ‰ÖÝvÕ ¡ÐŒ2šë.|K̽8Žv`¤è¾×‡m}„ŠÇÊÝYÚl€›æÐŠúîÜ¢ñ nÑè‡3=࿚-ŒÑ/wÔžÓÂtûUqMÆËQº°I¥šÉ{.ƒ$@ # ÃHÚÜÈïx1O0ÃH „Ù¾ÉÁ´¯ÙÞ)µŸ×hÀg5»t(úµ– 0KPhÂjp1‰ ¢ƒ%(èÿÝOk•ð}YuÉÛó6ª3‰oéåzQ{ñ” þÈ:H ñ˜ÍÄ|sÿ7Y¡Ú °½a2§àî‰ãþ9جP›FžÉQÇpòíâ »IÆ9‚-O8œ-!âÄûÊú„€q« Z…oÀq&{uÇÙõ¤@è[.”ªñîLRØ ëC†Íì¾{È`'zƒ ¡O€tŠÿƽrV¿ªT‰ ¶$)ª–Ùß[$K}ºqðÅ%{7h<ƒŸn‡}ç^-2|þ:¶tÁ Þ “Qjx»T2ÛeÈ|gZéDôeŽËû!M à .†aÃ`qܰ¯Ÿ¥W{ëw.7ðƒøöšî.´˜ÏIëÇfs€yÑð5bäyqtÊóâ òíf*(ÃãÊØ5›Š|ÿú)ߟÍdŠ Ÿ‹RdÚ"ˆeÞåH1`$²Íâ‘ã¦ÃržjóóÍrê%î –•C@À8+–†\_¥Ýßþ"M—ùN¤þš÷}PgËäE¨Ár1¤»'³ŒwÀ®>¡¯/¥Ý_6g¹–ºô—ùJ±°yq⌽M…1;¼rE1§U(êÙeŠ ñ”¹ÙuSy›*dûÀñu„‚þþºõð±‚OŸ®Áì“:§4­@Yã$Ú#&WÈrÊ5–$Ðx ©»Ž<ÈÿNS,Ø„"o*¡\U 95úV‹V\*ÿtL}$^®³÷Áú3‹Ç?3Y‚%‰8:åyqtÊÛè [l>ìÏÅ1`ÞÞÿa?47hBbS‘Ðà¨"LK4uàI=<RDõ†@¹=ÖÄ&6Ýun€•G/€•m‹Q“0Z‡H1`à½x˜E‘&£A0¨$Œ.é’0dÒÚ÷en|KÌçç¦tÓåàÆ"[Ú¨iÎÿúß>QâhYrQ#9oŒ©7€HB$Ú‘ÉŽÒÚxQ.|Ñž+õh¡)"@*2ïó7`i›Ò‘¼§ä¤9$ ZÑ” (‘9¨¢£fls5ïë·ß6*n6¾,νZ.+F©|Þ9=ºÕ,ž>¤zL©f¢§»¡ÍÙƒš€¤¼€y}/Õ€~n¢Ó†!÷™gÜ÷7µ\qÚ¨–J Jõ«¯ Q-íÈâ®Nœw†ïã·CÏ©Q‚.мl$ª˜’ø£ä3õ¥m:¾ôWÔ3¾€ìJ~a>¶~–ãÝ9ªƒ5vZôÆßã5Ÿ Kvüe[GõñógP©â† ZS©TZˆRý{ˆ!T«*¿ùÈ+ÑV³ÕÍVùC#{ü}s½›…Îû—¢W-[ˆû–Ÿu ƒøÿfÓ­ëd3ÌÅØÝ&´»KQ/–"*ž÷½ íJ!P=™en{ûäŠ1‹^Q<¬€¨m]Íšž™`+ û¤Öã9K¼yw–¢DR !$Rªgws¡ßøðQÁ¶>ôBŒË|éƒ-éoÞÓ…“µûñ8IÈE+’¨‹Îç$ Ÿ~’è†õ7 íB4ÆéfB¨N~QN¯aGíQ/H£O¼nKÜϺÁ×·0nqŸ}E«[˜sÚhLNõDïF¥ ¡RX”~]uX™²†…è@MÛɼâ–(æ–±œâQE¥ ¡R†Paˆ4¹ô¹RXYžxƒœÜ¨iŸ_ÙˆŠ„Ø’°Óæ"6‚iD€n@@Dc´>«ð wt;ð5é·(Êàd§¿zÄ!¬ÊA*Hä̘ bDu*`ü@ö“#sÈÜæ'öiÍ4ò¼ ’5Aˆ%k‚°ãÆ^íߨBt8€tF½ùn›’µ%ž“¨{ïßÄ_w³ä£SÊN&Ž .6ïaaš-“–Ù5®^Êš%iMŽÕS%?A~;CÊÒ™‡Zê(ë˜T‘ɦ¨£l‘÷Ž UIì—M’ÐGLrùÊÏ¢„D ·ÀY”ÀS3Ì‹Œ©ôê{o4¯)¡—‚L¬!…’X䈆jJí »|æ±)'•D¨)ƒTˆúCÊ„»#êXéÓÊÚ(/)Y£#pRiSŽQõQ1¸j~tЦÊS(MTŠz±°¾Š#hßû ÅIõÔPÒ½íTò°ÐãÒr™¼¡ÕºpQ²²´&¾Ïê/ò_¹pÕ\Fg¥ù6š‚Ž©qÔÄ‚°<ìÛrDû¢kĬ.6ptû¬GÔ@®„~'g™lžeg±±úo«€‘Jj( G‘¿‡ýæ3¿Ño>C~ó™ßè7?¦?6?ëŸÜ/C[,ëÉŠñ8L÷Wq„âT‘V¿•*ê]ÿ9sTØNýgû¼4 ã?‹É_ÄtmcHœÔ‘·ã0Žbÿ*g°BuÙC%xS~eþÎJ'WQ|);LsåmÛæÓµ 5˜”º`>f‚œ¶Õ,רð¿üéʤBÙt¦iÛÌ“þWücRµ/•M§oÅlž‘æWþCÙT,›\€&»}DÞ5&×÷¸Á!ïéÐIÃCØ5(EÖðu Û,Å›­»Cp[¡t_¯ãÊ@wg=ÌžŸÅü°ãïn}¾3üf®ê¾«~¸ º þë8?ƒ¹nú¿þ.‚³ãËnº`˜l‰½—;ìÚrL"Â1> ìრÂm>t9°Ä‡Á‰<˸\õ—˜yCY)¨·šùZp‘DÂã–¶­.ó6Eöz5o׎…M¾‡…-t0È Üå!@à°#†Å¦+-Jäê(¶ Ã67ô •â„P•ô2#¿n½µÑ£\oΈn½œZtëeÔ¢_/ç–GÍËp°zgµ’Í¼Ò W¨r9²…GUoÚdæ€[ÔØî'©¨ÉÈcOµûž1 c°…=óTÅð‚ó4r!«Í€Y÷'AÁÁâ¦M¢]G¦ÄAÓgiÁÄÝ£¥-³‡Áú§ÿl€ÂcµK;ëQ³Å4w!X { D£Æ2gå¶Ì6öÆÝØ$^¶7Éô¹ï—ô8‚ç¤£ÃØ¢°¥{‰âÉtC %¨½— UHÈаÃÝäu6R7íßλIsoÉLpZ샛ÆC·956’.¡NeôC„·2f ­„mÆqsðý«5丕²D§¢a¬þ…Ö(›Å' XYyôysî‘Ú&Eš&9ü¥(§Ïý¡£´%€maÎë³Ä[h›ËYb3éŽ4L0ˆ.ÅdYRAåŒÄ/F^û½à ©)V3d›‹§ÒÍ× 7û¼t”o;âŸHjÝf~²‘i/A$¥c„œŸ¸ÞD±°š¤W¤KÌ߬FÛ\‹kD9Xó…Þé"! BÆ»0©ÙBDÑ!ëEÍsޏ-Älö£¼ý K+Jd•EQ6êÈÂPÑþ“ß¼";0;Žnõ²eQp²"ïPDMÐб$¢èL¹É7 5IFè5»Ì¸T6µŸÊ: )6Jd:P«Á̳€ŽV(v'šÂ§Þ7j‚¨J6n'ŽUøªñ£Óòº%:?*uØò¥…‚DRN¨äj0² 73¼x^¿bô×z®Éú[]u‰jÏ=ˆw«®ò¡Ãôޏ=„+„8_«åâjwñRU¯SjN“„§ÝÍî¢ –·n–ô‹Á”—ê EþBQLÄŌ¢ò¡è°Ë-pû9‘þ¨ò¨˜Ô1B´üOÖʼnÁQqG$ãrÓçéC®j`ÇÚϵ *­g†ø,‘“±åF!¼/A÷ o6b‹Ë}Û4¿½[©-¨¢%5Hüv ±AluÍmw·Õ¯†N&éòe>Néh®÷ƒÀDÇ¿ŠR !¤RFaEmµ®\?¿« xÑUR„øN¾Ò$HÿIë{¨­a¶…ËR-!DR¾Oµ C/]H¢¥‚°ŒÍêÌŽ°r³CüL“'ѼUp¹yܳ§&\”EC8<úͧªÔ$2†ª•#Üÿä…_:\Mª7ýÎLS%|vÿE/€•Pä;,CØHñ>Çêtkĸ3²n.VYÔˆ!GÌNz›ÅMÄ6•ÛÀ¦·ê¦ý?Í*4;ûö¯Š$ä¢^Ò¤Wï¶Å4O„‹aª«jCw}L®¢f¹|V¨ý5_6Ìç YŒö0úŽ«rh Fº äH@qs\2“ RÕ¨/J‚]cä qÑ1»]œ/“ýýs†lI{­C&Ö‚i‚.ýÓ<«I€"«º0^ âŒ<ŸÔL<²ÉDLœõ©ùhÈn£sFVå ´¯ÝÔ A4©3_j¼_%´£GeQ#Äõ©Ýh4Èê¦øFJK³FPÍ(ÖëæÿSIžG§ü2q¶AžLHŠÅ$IyðЈ(¾l,ª0^OסôY¦hÓîê—k6m•ª^üÂËR‡Ä: eD¼ ¶f!8øD³k›ë¯gJ¡îe}þïtIV¸ý"§M{–*ß^&µ—9Ë`Ì ôC2ÈB³n íDL7ñ[ʇR-ºL˜#Ô#aòOZzñÓt{ÝóÌ$–stÔz¡Ñ¿šŠ³Ë‡³Ñ|¨„*êv0YY([Œºr5Æñ0õzå9Ñㆂiö&¡…ZD+YũœõÚÂÿœ¼£õcûò½{"+6Û^ER †‘¨OZîög\ðVLó÷ 11*VÊD³ÆmWÕšç?&ÀN(ç¬!)†Þ;'¶èƒo/}Å+{[›Aú|Ì`Ïà1 >µ•°^ˆIYÎiÞ“^”*€ØêŠÑèm ŽC¾L­2s^sìuôMÔhuü@Ø<ðs>ó’ƒ´:Ý ®û?cð»ÙŸÖ õ®%¤‡Èâ–ÁèöçDô1Ã&U·Ú™ÊD,I!°Ç½¡³ìµ!‡Ê(•ßÙØm’{ìäÉÍÕ´:-F:Lj83ñúgˆÁ0÷{%#…TËø ùêWýÐ'>‚—þ–¶Ðng OØBX“'lÈ|¶»… ¦]KܶǞOÜ6ºþº>ôIxŒÔ"Öj!ò7¤>©NQï£g6”x™LñÑ_Èï™õãêGRð¸-]==%;¢çB?]ŒA­ºbZ󅨾`Ä8"Rƒó3f Ö v1*vJÉž,LœÑ<Äì˜æ$ª@0ÆÏ…´={>³ i3G-¿"C¼=Á‘uZ†+ûkȦì¬0£]iÂü^ù~i;ÿ÷O|;Û*[ƒfÔj n5Ü‘FGl($‡Éˆ* 5BÚ(™M™iÉ„Ðì—Ðdæœs\Ï!F”ì`DØ)uÃŽªÁÓ›DÁQ±¥ ªð¨&®"xTÇqcV!hÌuø` ƒú:yøŒ>Ô*¤ÈóuÚiÿLóyú(=3GZÏaBð&vÞÞíq@%ú¸×¾ëªð¨&®"xT¿~*kÊ!jM¹J_þ¨~º·|‹N¡IÍI¦Ÿ°S;³N2Ót«äëLè&›ˆ2‚™,Ê·èP˜ Wé¦9Tâº×˜á©i_v4|ÂÍÅÅ• ä(²÷£Ù†FÄm¸ŽW‘ìòyÝ#ŒÈ–ÒÜ.2f¯‹‹Q6ÿûaÑ›º+‡ÄÙ”0í‚evˆìm™‹^°^|ȲŠ6ðµ6óÙ}úHÒé»|yf 2éwCȶÙN[UZG½?žÜB=| „ŠoÈ2PÓlfQZ_)*õÍ;]¬!¸Ë¿Ú-6î>j0mÖχrèxâ¡Þ'ý~£“äÌô?uC˜»y«ì;" (7×(1æ–=”¨™)£œfŸ…³Ë ); ôµ›©ÂÚ¸Á飚¸=)]ÍY¢Dµ9¥]ÍÇ©Uèçõü5GÜÖÒ ÚXg¶[e!òHñßçÌýÄ™Ü FÊœ>uÿná»4 ?]Q«TÆÚ$!F·õ1†‡¤¾“«=» ¾»Ý쯼!ã ß:¥¬æHêr<¤1 õ¶³LH÷áCZÃB÷œlxfžRÿykõ'Õ„ Á¶ªUžÏ×gšyªU]'ée¯eúl:‚ÝyésJß_½†¥c,d+Ú¹F&kë…ÓË ‡$Æ¡‰:T‰ÌsNç¬ üš]TÎ>¦È )Ú5˜ƒAGÄŠ‘A÷ÎÍÝkWþÝg™ÂRæ¤ßâ‡é—nòÿºæq9õXUTw»9˜j²ä×òE¢V\[¤•åDbšÄü\N¨ËŸëªo§·{òÛÖ™¦·y©˜„r:­³iÑ+™L÷ìh^ì›e{-‡]9F8Œ#ŠÀk¦+F×Z£Á°þ€Ã(0ÂaS öz¿pª{V¥}eÑu§÷­]Ù5Wi̼‡\QX‡¡‰q(ñ#F¯Ùé½¥DxdƒCbJÈ¡#Þ¯¸áý8´û’Ø‘RÝ(ä2f­b ×ÎÏ(tÇ}L¡¶6&¥ŽQ'a· ß¹ödHBÑÝað‰: YÚ Ýe Qq'3—HG¨ð¹¨Bh÷i‹êÔ&q§ÿŸ‘˜^÷”ÄD,ÍI ݦD &[W¿]ø$Ö»5’‘ð¤ó˜uÛmô&‰÷ËQŽ‹¡¿Ðï´*u¼}Ö=Ä8âÝçZ²áym\<ƒGµ1ß±GãsÒç Ì:„í>®ÉÔà n“ôZÓFFƒh›0þÚщæúÂKxBˆ®÷4»s@l„;ü²Oÿ0"N“™±uˆát1 Ÿ}2È'p‹F³+üײ¥îóœ}ƒg¦…{"Ldo”÷DéÛ&•ú‡¹Ÿ;‘ˆa$¢‚¬6{ă †‘‹|ÔÎæÄ}ÜÊö[àpOšàÒÿ &c – 0‹QH`µ–“¬CþÁl$L–mPÌñ}E]i1»Ãס6ª;ILpé‘èʸDiÏÌi—§›_W(D;œÓÚÓáó-*„Ï¿A…FÎs›^1™w÷Ìsÿlú®Í;Ϥ˅k'GXÊzÂályÆal ‘1ÞWÖ7DŒ`²ö[…oÀ‘gÙ0ç躂ë$[ˆ±”òÊÓ4´C 6žÇCE€g ¶o îƒ|ø^¹Ÿ–½rvm2cî°ûŠ}'šý½FòKЧž‡[4žÁ]6»gpûU¥ç^!WÅäŽ~VF.{yD/¦˜gÑ2h©[+‹¾L0€0öéÆÅ0 âb*8nxØÏ"¯,q±s‡‡ü´9áUÞ}j1_¾ÖO¯±“iIl!G§<+±|­¹ð¸2!ùÈPeH«`¼Y‚¦»Mêú*•i‹àÓKî‡õ+fDP—ök”<8–ûT¾o¶3þ¼GËÑ•ã¬}Ä”ÒA¬ï¬|tDOo›.³‘òr£Fòé¸P&/-Ëý2@RÑ=¾ê9m»ú¨¿¾\êƒuÙìôZêò¥¨ËJAЧìr*ôÙQðÝäŠb{« á³ËÉAcµs²ëÆ v¥qûÀñu„‚á—#¦óL“7œ>'†ÙÖuN- ´E$Ú5zmn· GiÙ~ry¶…æÐ°‘Ï·@®.¡SÃxµ*FòG`T=ƒPîÁÓé<˜D 3“òÁr‘<+ŽNy^A~ÞŽQ{0`.ŽX~ð¹×iª>£±l îFpt#b€i<¨GàA=üéÙóÚ4K’u¡‚ÇÊ£ÀÊ£`Û$`°±<ë·ºdO‘G>!E0Œ“. £Kº$Œ\Z7B7¾…%.Ô‘ßI¨Æ.[ÚÈi ?H%!-KB(:oSñÀ€-}ÜDe^F{LlãlYEÓžKõ ÔH ™÷ù°´MÉœñã uÖ²8€WO$$PdŽJ%ðԌϣ%¹ËŸb‘› ä{î¶\TŒNø¼/L9FÕGÅxöv?}`“˜[ÍuOwÇëQ‚r ˜À#ü²x2YµÑà}Î ÷©P-œoA!ú¡úU•¢[-Wˆ§ÃÀëc2ŸáËúíàsrEò”‹æíòA¤ªõ]J믋Óñ¥?Ÿ¥ (ŠÌÇÖÏr¼4LÄ"µéùxMÇ'¨è¹Šô²­È#Ž¡z4†o³¹³V·èÒ‹®>Œ‡[¤&fóiª¥}üeR£aŽÎz!»]ÈÑÌ\á:dZ?¹êJ-!yF”Ë®’S](–È LMÑ…)àÙÓ$m"ÈQ½auÍ”‹˜¶-ñA¢ªYgô´ðæR~\k _(-Ã|ìcHZ†´ð˜†¶Çe“1%JÕpâÚ›eèÎÇ’¢G%[vìûr—l>ó­y¿­´XX x>¦Z1†TÛÒc{¹ÏÑîöuÅ=¶š–ŒV!_*,_ªÝ '†X­òÁæ#ÞÄÿÑÛL£zhxiOrßyïb!ª¥Ây79iF°Y!hé1ë ùÿM° [ßÉåA ävyE§)dŠ…¥¨Ïû.äF·êɤ²°wôîŽ&Î[mÊÉ'äl—£—@W3À#h™õ$_Ûë¥ãVÆi‹–xyôî0T"©–*Rªw‹¸Ðm<'âkñ‹!°þŒ?íQÜ_»'1HB.Z”„\t>§’$†õSI4DÙ.DƒÐn6›Ì´Ñà³Q{$â¬4úÄyi°âq?k²£ÛvNqî ”LÝüyr|Ö®§«§z •€0„J@¢ô+«¤ 2e ]x⻇›½LHÞqQLˆ-*:Åà Â*a•{’ÁÒP½ðÈ„j2_âQ‰±°½âQ©.é°&E0t#8;NkèÀƒz8:¶£ÇcvµŒš'œW"X“ƒT°"'h}ƒŒxR÷@F2Ë3'ô·(Tàd¦—çU„X²&ˆŠ¤7J81¨½V!:HgÚ›t·Ù!™—@[D VDÝ|ÏYÚ¦øª›]0x2I‹TL·y÷ënÂ"H`v-¬LÙoI\“ÏëXýjœþÍÿt†”%«ÝÔ*€×®xEfKÐòÞ‰Š SÅ”ÐøÜÃz$7“PVYNn à …­ž›á¾sI³®Õ÷þ\i6)¨Ê’XC 21/åV„c1ô)-H¡$Æùe÷±lÃ<6ú„RjÊ@"”ø#‚T]MuOœVÖ†ÊIÉ\1å²bdµîÃgMÄ–§µ<_>æ—¥¬&ðÚY)•¢Tìj(âFŸê¤zj$éßÍ*´ yZ¸2i*e¶JJ±%iM|Ÿ]wò€Š/÷]…³ú gæÂjQ¥6XÁ^eÌÛrš!©‰³1Ô yÝ>ëõsÙæBèw,‰ Çp…ß°ÿ°êêˆ"=ZH=úÍgèÑo>óýæ3ôè7ŸÇl®¼øËк‹ÈÊ#Âã0EÜ_M¤~ - § gûµ¨ì`ïúÏûát4„íÔ¶ÏK“r2þƒÅdgN ¯­‰¤@dÈi½^ÇaüÄþUΈ.ÀýÊ;*ßÁÿ•ʤúGDñu³^…¿¶m“Ü?¦k'mø?ó1Û¥s–t[ÍÿcºÊB“Ákl˜¶Í<) ?&å…BÙ=Ç<}³(jý¸+ýP6åe°…–iyÏ}~1@¨Nµwv ß3¬nè~ÙÛ5Lψ(ú»†ê&f£èqs[¡ 9Ý/¨ãÊïbß÷S|wÞèoÀß½ú|óFÃô]U¬ÄéßÿuSNÇVèúø:Ô[ H~Å,÷0n)Þ>0û_ ÿ-a‚¥zÀ„ب&°ÕëbBÍQ2&\Þf­Þ´×ß>³ùîº\î‚ýâ’^ÿöKÕNÃÆ¿G1›T‹ý·yyòÿòoVÂi^Û`ßõÙ\lü¿Á*h Tˆ7À!ÄV*¿ÒЙ²†.È”5tA¦¬ª ^ä˜ÑíE~ÛëEN¼²Y­½G3 Ê…H5HU×¾LMA¨·mlît@˜m×.Yƒ°äE‘nQAáÒƒ p‚#XÁ_D¸¹+A¤V$E(”UL$§“ì,ƒ¿œ^Í­¤'Æ2;Ia­¬ÔÝÔ¢‰Ëgõ²v|IlrŽŒ KŠÑ(/:Ù~ÆóI…WrkFe‚¢¸ß²"ÔÆºJ¥z|Ù@!&»¸‰»á¾·°…µ²ø™ÀËÄuiJ€)Ö& –¯×™LøËmDµ«&5ŒÅ ” b\]£3Ô³ ¦­ã*SAKfž­bYxNÀön˳âÉžx/»¿³^UÞR?xQ9¨€š’¤ >—_O…æ3Òèg¥‘ˆ³Õ¿ïñU§û~ׄ|µLŠ%q®(M&°Ì%—¬ ¢"ÉÕìXý™3òö·±—D½Wܶl½E`ËJîU[6›"MŸ»m?õMX),•ÍzÓÇ¥qœËâËžÄs/£KZ O.d¨.\BÕ»~réÕ‰²s} $P™Õ>†¹Ü÷ú€€X6 €“‡ 0™w$û:Ù¡VŸ¬ûpGÑÎõ•¦ì,ÉA$¨‚€/sÂnÙª°…1X@iwõ—ß´„4Òd»û¹&‚K–çi¦Gálœìe—¨{€v`ÈÑångv£† ¾QncòŽÝSWE(ŒÁbØœæ }%ã¹À™¹O@…rm:¨Ððg¥YÈ®Ñx{íâ"º‡×ù–99‘~Ù½&£XŸâƒÁšVJ@GþH Q¯ˆöo›¬…½|hÔ˜ác ¾áí–ƒ%‹•='C™Øïdí” Ñ„ºûŠÄköþX|â©!övàÈÐíœ ™ib2×PÈfÔKàX" 2”‹¼<-6ðw$G€…ØÙ’éLÑLd Æob·ßþ ^¼+Ì2Çâ²Él¿Ft˜ÆµÀÉ£0^>è § T{§‰¤@ #-pSDZÎ'.ÜìÔ¥öÛl‚ùË|¶Øi%ÁªXAíÔËU¯M¬Ïöuȳâ(Ëosù$kˆq¾Û£/ŒûìPÕÌ%D"©XHÍÌέ*Ò·µ±pQ=Â6P~ƹzzÙ‹èñ1dì(·æšd8‹¢-;› g…BdÃ1ª‚ Q +Ôc&qqžÌEââTBÙº‹ÁAD.¦t#8 #4\lué ±æbF²e£©:,M•Óà\,M/Pw1â†%c½zŽ!–l:74úb"ŽNyþá€oÑsÕ‡Ú‹ŽäöšK‹B(J5ž¶‘lã–ŽdK¢`d¢•ö<[mr©æ^‚ˆ<†Š`Õ[‘$rM/áÑHÊ\€õµRÞ,ÖþA©B—Ä;—ïü©–gðäݼ¼õø ¥ªÛrQ1Š7[$VªslJCªåŒ<˜.·úè–ÀW=+—#¾©Ê,¤Î¹DR-Ï`è‘­O™¾Ý"·z(LWT÷X@P"@œSã õöR‰1RÔ?á¥Rÿì*Èm8Ö³é£<Ÿùíë¿Q9矫Îc+®¤ «Hms·_xÿ¸‡‚; ´™»Ùea¹of–úª A$e…¬Âu‰eÁ ©T¶, ™ì7|dïiJwÞûn@Ãö¡’TK‰TèmmFß—Ð![…“í1ï!}z¥éGN&W†{PyYôeûô”c$‹„ À@¾ÁÐtY]¥I4rrZø—¦ÀÈ£ ˜ß§±M¿,yM`‘*EtHqzÜ7xÞªEðiU3*’<.RÎf³ kÓ€nAÌïÃä¥r+Ëbë ò¶!)]Èo0~Ò%¦Ùßkî]&†wîšÙšJ£O|!í`ì2ÛÇÅH>7×8à 0Â!޽µ‚Ýß2ÛìÀ±ò4ù…MO¶JE+’HDïÝn›S¨6qq',BA«8=]ß;}÷Gö×|™½{ZÈ¡±‡p¬ÊA »ûbØÁ "g_“0ú&«•ÚÑ×ÇÒÃܰ}·ó|ÙìÖgHűÇCiN 21Ærž•n°ù £e´‘KÉ臤ˆmîrnÉÑPJ~VO™æ“F®›—JÜimˆ5êEHkrw+OƆÝʼQA/.±Å(à’?ÀQôüêfª>ú±a™Ž*FFØŒƒ"2ÅÍh§\žG§¼]‚1§€™ÞMÁ ²‡g™huñì±[mÁ]rÒ«öÄéä:ö´™* GíYüF¦Ëì€wëÝÛhÖÄ#ÚT¶J¹`µÇÛìÖ>SH á!ø6w¿B˜ûl‰_DiûÙu4›Ù&µh{™¤-f;±êºï^HŽ@ ·à›ÎŒí‰É,Í MX&žÂFózF¡£y‰ñ nÅ…N6Ùæt6'“Èå/PkYƬÕ쨚]6‚øÚƒ0„JAHQjHáaê%Wfe9Q·än ¾¾MÛ/‹àöD{ø7j]Ü„N›¼µêsù:‘E‰-ŽÈ=™Ø‰£HD9ÍGÜâIÍÖ@Œ®Êho1\(ZÙÃjXŸ“ÏÇß –%N Ë÷€,\ïç›cõ‰—·÷ÊèêGÓ6À-‰2̾ûOóžôŒÏœµfYj>Q¶‘ 'äVW81ê‰O89´Rõ˜•²°ýÅ"ÍC+±ñ3/á.JLܺ®8Ýò I ›÷—•iÙ"=Šü¤eŒZ\gÄ€âžòðÙ²“ ßO>ÑAº½h'CÝð  \»©Pt3üØ™æŽ&®‚ÊgZÔHb'ïùuЫé3—2w£j²hÔÂwºxF_±Ä‡€Ò€ôB÷îv>an£ˆaŒ Û;;sÓÏŸÔ&™¹lÜ¥¤v/SÏ}²tÖ"à Ü`›¯wõ QD~S Ë ú±mzFD†èhÝ(bÓúÉt/Cq‰ƒ÷¯5=ÙòE‰½5à˜!6ºÆŒGÛ \ÿB­ƒ™Ñ×`¡Ÿ2Ìúµg/q;Q˜6sÀ©I†ÙWùÓêd6+QÖ¿`Ý.ö§DÏ™vƒoå[!3¤FGoÝ_вv‘g§ï^0=£Œ¦'$3 &æŠ7aØ/Þ:8À<Àˆ3­ÿ#ŠF&ŒÓ›)Pþ˜ãÉÕ¸Ø"^×Ów°CP“6;ú÷ž_‡¾+fÃ4ÿŒe†ÿ“f¥ãðG¦&ó–óušÐÿÁZ÷‘òR¤„ ŒÃ„(˜X Œ;ÞÛ¹Éò_—7Ⱦ‡X×B=/f‡°&5vôŸ8~Ÿ ©ndz—V³&3gQiQ–ÈL~j³0ÓdgäƒÙ,cŒR  3¢dd•1êyûe?!Ð îðšÀªš_}äè©G‘}¦³n_¿É'~•kæºÝ²E–f7ó¯}î$HÌüï‡%íRa?E%z–}.B`o›}`½øz‹ßË”>¤V“¢Hï´%»0ÙBd¬ÉMÂâÌB¾xÆ9ʇÂĪȗ÷%畵Û‘¤Šæ°ÅJN QZÔ›º{ýFy|OC2 s›;N’ Ê¿À™©Lx.اqògî¢Ä–Tˆe3yÊzŸôÈvxEº’¾ÑbG_M ìè7žaDz¾ž?ç@{×ù\^b’Š+Œ ݬdÒ4ïaëJˆô—œ s?1d&׉Cð;®?¦MZPˆ±ª$Ý= QÔº‘ô¶É:tz“y<Þ¾?Èg¿kuë>{Evb¦Të”ñ‡ˆ€Oiðù4à;ÚdÃ7ÊØQ©ìdÏϵÉÐö\ÈÉY´]MQz–Éd¼–é³éˆDç¥$|¿¯QzÑkýèe•=ä˜3wÎÍ…Ö9Ž1ó²±C1 Ht@¯™¦>=&S©kØ%1ÏÁôÃcZöÑ£ókQ¢~÷Y¦°V6íÇ9"kÓc8=€ÛÃlôuÍ!ÀÕr6d ºe®…êNTcLw"ƒªôm»vÙõòަ}£ùk5o3WV±áíBA›´§Ž"4܃j=uî6‹Ç·Õ. V"àòÅò÷ôNf(ÎêÔL“„Œ5g‡½¯„$ê”Ö_‡$ºåE•Cš1bÈ.| ’èÐ1C"Ü€€Fo0«\7Ðߪßî³™åÃ3ŽEKëGñއøÓž˜lá¹vOÙð¸6§C=¬Þ4TÅ£†¶sx®¥ý©Ogf†‘gÊ—ÖÌ£-ÐÌè”Esmü_Ç’*ÚQBwí#B¹u­#j­ëÆ>[6 <“¨¼lÅÜQ?wtíœüyxµ#2|ýµmÀ-üÉfDÒÆÓÒjaû‰j K$öL3 <©Àüy¯ˆadÂ"ë÷l‹,@Œ!Ÿœ·M¨÷îì4KâûágF‰'f|éÿR` – PÕÚ-V!Ý©jŒÁêIHÛ\6ð×¾–»,ý\²’ÑÜJÆl÷ùí6QR/ÁìŽÊ¯Dp‹Æ3¸M càÜÓ»ƒ ŸohË(Ü ñø¹=ë§œ3Ì£d'I0^Ÿe¥°—9({øå!\ƒ Ç¥úY2í1 ƒ¸†€?í‚ÖMèí¸{Ñb¾^¬Þ{×£opvWäYq”åB•A¨­n:䟪–ø6Е N?T$&VEÀÉüЯ˜Á“ °åAátX§ÚQz«8ã;Y9Zç§â)' ±¾J9'ÑKjºÌ^²Ë½´ƒ-¤•2Z”{d€¤Rô$°[ä8wõ]v}¹xÎëî‚ÛjK®Z)êʼn/ Š ÑT/ýVN±ÁÕ×(jªŠ¦:»°å‚ëÆC¤(jë¹P®¬^ÔYÎ46õé£z›m6ç”EºfDÊèÐX”€TcÕIõëœ .í?ºéPßvsè» WCQN ™«ê‰8FÕGb rÃo"ø•¨‹u=3¼ƒe^ò¬8"ùy;†ìÁˆý™82ù#^ëÛ¹ˆÔ|Àmb#9#EpÆÏ2«ÐR"² DÛÛh­¬îyÌé<š6^sle ÀÊC0®.j@M…Ø$tž'~Þ…Ÿ9Ú¡ _†¤KÂJk÷¹ñ ,IZº(ý vQí!Ò´×Ǿ_óþíÚ­H¢ :og+Æ ’ ¢ßâv¥¨ÞzÚóÁ•@[ÄïœÛçoÀR‘@´3ktÔ Î%sˆCÍ›‘  )‘û#“@“£)ð| ±o¿)~m6@â¹Û¯‚bäåó¾Èñví¨CýóõóŒÑûGbê«ÚêknW^@TóyÀ`ž-é=ú LížñIÜ'"5—?ß´ÕÒ¤P¿¸R´±ÕÂo°Cs7Ùà sákèíÓS3ùÈKT_™·³•” .\¶G6ÚV_†¦ãKÑ;[fsz] ãýM†P:ê…Úžy¼¦ãã5¿œ]µ¦óÂq”j"I ×d6ëëJ”Ùkà.šk®ôjz2ÖK¶?ëÍ"PjA~éeR‡aŽîšdß"iM\R½Ôæ:òZJ]µB£wù »>´™ëÔ(–°+¡¥FT7ˆïÏmÓZR­(Å%\õlʨrIVCŒ½s"r“R@‡¿.Ns» ó±!iÒÂcz| n¦kdÊÕ«üª”¡V8‹Œ=*}hå5ª­ËÁšñ›ˆºk¹¸U:“=8‚ŽJ‘[¼¡@ð´Î*ÁíRÒ[+D¹TWXFŒ.µª²›ÌþƒèßQõ>4¬gÚTn›¤ÕRR8ïG± lµð˜õÉéM 3?¢ÿ/¤Z“Íþsì.€—.E½˜)÷=+†])UÉ®&³Pko5Ÿ×*vÂêÙpåh Ør]’$ ­r„Êè”`VÒÇ­\â%6“H)‚H*RJ¡GcQ)_Uó ÝãH‰ú»è´GÜþ«ŠhEÑùœ:H1¬ŸJ‚вMN£÷m&|ߴѨ}·“Ñ'ÎKƒ»C“EúcPçïðh&¼ùÍËG·ì«z6¶P C¨Å<Â= RXU†P)5™]Éó>:—¼¥áؼZ˜÷h'*A†2¯û¢.È”5taå~ív»R4& ¡Æ¶$ÖØ´¹0cô…mèFpD4 è³ êàq´C2sv‹ÂcMn^v^2Áªˆ Œ0bD5‘32ds:t‹¢/Mffr^Aˆ%SA3y‡$òÚcAth§/¼+]QØ| ÜÍ%ÒÙYS©ˆºž³´MñÛmÔ.‘Z­_&jμûµU&/‚_·èÃEEHËRsÕË'?òCå(çE²º&FÊ®c¤D¶úàP©()ñõ΋PF•K;a?©³m$üÇFVò(I¸Õ&‘ šW Vtõ}3ĵ˜×”°$™XRÃD Jy)äbI#N.BÛôŽç4Ñ®@¨.Z×A&ÈÕ1•<­¨ î•’¹rY1²ìÃÏѺv©<­ÆéÎæOöSÞlz­¥á‹¥îûÔ:)ERœT@ uÜ+@<'÷(-B¥ÌY»Ë”ªóE©µï¡j'PßájWy亂#}Þζƒä ÆEj F8K¶Q»Dl°× …æ½hû¬‡Fv%¾úIQ$gI4KÀå¿­†ÃLÎJRrJDœc”¨™)¦„¸æ! :3.@ÅÌcs²É/C.")hŽÃÑ¿š -€ú :fÝ×¢ÒC¼™Ÿóq0WA…í¤n}ÛLª+ù³Ø<ÂÑÅéÚÌܹ²Ìûë8Œô_¸ª®Q‰û Ê*ýÊÿ½_î+_A¿n6ãûð×¶Ða_…¤dºv•Tñ6c&i[ÍÜ:ú1iþB™:°G0m›yÅ?&U·R™Iªô;(/+FýPI~( ŠešàžqÜM{\Ò¦tŒ­ÿókûºûÐB¡ËÍëuêÞÄ4ãý&-6ðDûn_›ðÝ®;tûõuèŒów·Ò?Èßó}‹o5ðýÐ9Õ§ìÍü…ûáþ&8þu¨eúŠû…좀Æ~W5×ûݸ‚:”(ºèФhÒ¡Q[¤Î+ÿÆH[d¿ÑÕËå^ æ`ÿôóoþݽpÜÒ¡Õe_hæ5&ù—õ¥/Iÿ* Ìæõðôß( \Õ_‘Xœ¦Ž+(Bر©^Ĉ^µÅQ_—Zö zÕ²ZÑ«–½‚^µ¬VŒ5m¢ rµ³Zs5J{_Fázãò_@v…¹À[6™I‘ù‚i#%=îØÔ• Ë.i;ÁúöW§zù"tÀ®âEˆD‹îŽdfÃí2ð…WßU0—yëÕ:†KN’öG4Êeň˯°^®„­’ý<ä>È®ù3·"!@Iâ*ƒó"H`… ~Ù³ìÊ–{8mˆÇ" t\Å2Ô ëe®žH+EÖ+·¬±„ru10rW‹(@7…osÅ,®vÏX8á7ÛÀ5&Ë®©Ä;ÐfÄÑ)Ï‹C,W4@¦-‚Üeís-vëZfÞµ è¤uv‰¤Ñ'žIÛ¸–€¨¬@ä$uy1™Ø¾_uR’ïÕ§»Ùž¤¿D’5Aˆ%Áëô(– ÂxÃÆ§Ò\ë—·¬Y„˜žê°?aÇm²¦ù·îº¨ú›Í£ÏÆÜ5[Lü$tI—„Ñ% ŸvÛj…Â2øÂÉœÒ0N iý4…¼vCçaó8«©s'€“G/€•×!äϵeC]BH2­ éG>6ì2¿²tr ÉìyøDÄ,,Aa – 0s^°ç³¥‚59Hcï¦a]rîsóa]F˃ÛýФ… éŽ«q´ÍB ÏUXE/±dYÐÅ™b½oc£Ò:øo « qÓtöÌ*„¨äú£BZCŽŠº—õ Æ`1 c0‹r Ó²I4Õ¨âq¸Üøv˜3ÎÚ¼#‡øÇùÀØË‡F… _äÿN[*Ø™œÇz(fuãnk0Õ»"ìn]âƒÕ>„6Inäj’!‰É;F†%Ý>B¶žU2ïø€Ä8t‰ŽŠB 4ií-™vªË+¦{wÝdhMü("Ðx<%°[ߨüi‘%~ˆÐµq#toq9#¶¨™×(ˆ¹óMIF Fn\íåÑ `åÑ ò[8&æÜ ™,^®º.ŸÖfÓ_Q"ï!™‰'Ù¾1Œå%}6G§/«K¡%v®ír3Ëþš/{õ yJvï-Œ€2 F@èÜd¥r –ä¶yh¦Gšcž75T‡zÑéƒ]ªœ/›«ú ÉP‚§bú! ýŠ8/‘-aJS“‚L¬q[@Ò«™î6Ð[Vá{Ü¢åGƒ~Rñ]eŒ€2 z@‘‰¤‚U9Tå+ÔÚÅ,´Ü·ÈFC¯ª,+ c ?(²Ä­pM °Çâ ˜6ó88|Xܦ.yNò¬8&œ4Í ×žVýíi\ý‚ÐFÂlRsLj%½oîÊöðJágp\{¾½ Ý€nDxüQÝ6¯í.÷»|'ÛES›$)5h{™Œ@öhˆ¾{PÜåxNq+Sl:Gc/„A #Ì”ÈÝÐøJnhõò sÿçpò¯KÜ¡&m¿]ÍÖÉÙåá¸ÝÝMƒ¯oAƒÏ7 1§°Sšmj»‚‚0„JAè@-C¨üî}, ¸†&!óM$ÌÉcÔ³êòw×Dƒ4ÿÛòˆ sv;p!2l ΰm¬Ñ¶Ûî?„¤¹:ç·ï,Ÿ9ï,!½€ÞÙ;Çöé#Œoïõ˜dÙÈü™6N7'bÒ1NT •rBXùm«Y…Ç îÿ„Á|T¬2O?æ½leÜN{™gbÒzûM±Ðt1#’cŒ(Ùň’‘]Œ(·¬Ü&/“Î!;-}­Üú¦u‡Ò3Ô=Ìà©3‹?¯Ä²Åuƒ!²Ø´™ =Õ/‘aÄ—4Lè˜x¶‚eß!yÏœuà„(˜B0ÐϤ´{>h±Ó'µ9ëL™¿¯3ƒ£–1›!5ºÊ ©ÑUfêe$cg?Ê•î CÓƒi؉þÝwñƒs#Ïï5d&²ÎÝHZ/nFiÂÂ%So³wî£DßÅŽ};ºçØÑm<ÇP`Ètä eDÑ=Œ9uYŸnṁ¨þBÖ>>‡Ndj2Ó;_§]:˜iBE»®?‡pôì(Ów°£ßx†½Æ³ì°Ñ¤æoBdö¢ê)!¤­ö] ­Xú¯÷®Ë-:Ë"µ‘ŸÎ{|‡-š}šsêŤ6[Ää(°—Èy³ÑawÙltØ] _f÷ý¬Û1#(å0#JFv1¢]íõ›Žö‹ìæyÝ£‘`_ma 1qÛô@Ê8Lˆ‚‰}„àMì$Dn¢jåÿÎXÖîEP4?æ„E}#ôú|þnð“=dóÐÐ&É«Sg3SRR•üpÖ¹ÉÉVžâÖ©!2¸E ‰ÁM{Ñ0X?gš|; Æ‡‡æ|xÔ@®âé¾ûI<í ~÷ÓI²Oú±3÷›w÷¼´/<|/mø;Jô]ìè5žeG¯ñ,;jÆ/³bÔ(ÑOýj&¯ë£oM¦£øˆõ¯7ý\ŸõišdªÇ­ Ì{Øü•E仂Ó’·”Q"Ôº’zE¼<©ˆ¯žTd!‡¾2æ~b0ÌýÄ™Ü F·/ÖîV{oˆZÏÑ£ÔÝm¾å]#ž.®SFOûÜdƒ<‚0ZÂÓŒ—ó¡`¡á›gêÕ] ^ß‚ŸoAC€ÎÙ†S=^Œz-ÓgÓÿ¦ý ¹Ï»ÃÏê©êó*>鯹ÏÖh’·ÎqÌ5{æúø|iý´`°ýx·#÷6\‡‡g ‰q(AbJ·s÷Á—ëüZÔÂÇïÔí°z÷†/?ãRÓgÝÇëšCˆÉåÔÃZ3Ê­ };|®Ê@"ÔÁr޹Uí²Ô÷×ÛÅè´-6í]/ºVóò™Íñ*•çÙ4ù•LF0Ý“±y±¯ íµB`„Ã(0Âaá0 ŒpF8Xàùݾ¬&'Ý;[ìšv’Cazo‘€ Þs‘Ñ;¢¡ö’n­g J‡$Æ¡‰q(Ab¨AÅ›:ò¡ÜbÓúæ›LJÍ¿ SWez…@öÆÖPÁ…D‡z@1]$šØ0E°å ÅäO <¡ð;èQ˜WŠ'ñNh¿! CL¯};»ÐÓ™‰ðCÉ“†Ï7aÐMEñ$ÿ.I¶Ytt Õ‡ìâ÷ÐÑ›4Þ/ÿ)›jž4?â vã ñއxÇC¼ã!ÞÀ!Æ×/w »>Âuy2£¨|X|Æ!üiÍÐŒGh·ƒîÚñíÀx„ÞÂjzëÖ|Av½Áv¦7ÌWrF:Iãs&ùØŠ•àgp’,æ<}HÁ-Ïà~8Ó'0ðò˜²‘Ò.a¿—®ñðú¤Ù&•z)ª†‘ˆa$bIF †‘´¹1Ô‘}•[ɘõ̳C\zk’Žú~ЧvãÃCÇS3Ë{J°ù¹ï8]ã(4GÕžý¶sÌÓ;ë:íóÁ'sÛüˆõÌsP˜•µÁ¡£Ý>æð÷ÿàrœCý¤ÕW¶o*Z [Bܲ3O¦AkÅ3ØñíC5Ê ð˜Aïí}Ì ð˜a6í1œC3´{‡ —~›}gÉòAŸŒB8Mý1 ·h<ƒ[4žÁýäÜ¢Ñ/½Q FûÝe¹“Dg¯Ï²Ò9íËD=ð£¥)Ä€ 0 âbq ƒ¸ö×wË“sífµ½tÕ9·×²šã7‡{gñvSyVò¬8:å9q ™Ÿˆ£,ß±|ƒáÖùl&}Jô ¯"ÓÁç9 dª"èýXÇ>¼À;r:¬ÆS혿UœñwŸ-Q9žÄ T!h» Ýüé2;>/7® ¶peâ"ŒÁ’"Ô`Ï¿÷&þØÕƒõå2N¬» Co´a½jŲR<»Rô€‹NBß(Á,.®Qìôiõ·ó¹%]×Ñ à®#.|À¤Ãd½Ì¶œiÚŒÓ'%1»îN`m‘ç$±ó0°D9Û.!×B|ð&&±™uÞy6 F B¹ºzÕrb¯q/¿ïQæ X]3“k$X–eºHÄÑ)Ï‹£SžG¿ùŒ8„òõ‡Ä ’æ– ½a»:1²†àèF0t#8TƒÑh#ž|Ló¬‰iÞÝ騕-+^+^+±*$ò(úÞ±(µËžhduI—„Ñ%]ÆsCìsaÔ'éú\ „\ð Ó<~à°¥Ý#•„\´,‰qýDÃú©$‚è“DÅÎÛWú  )9¦=éFh‹$ðoJRõd=ôJßû>{ÆdY¦f¤m<§8·l¼ÑKñ$ŰuÖá⌠~n6¬ò¹ÛrQ1žÁw÷´}·Åxºj¤ÓqéÇÞ«ëP3èÓ=êåxJ°ÙØÏ|êÂTàI\òZVÙ|>'÷S-œo¾ÕRY!Æ¡¡I铬Stüx©Å5[ö_ÿoŸSµ# ¬# U²-ÝgXù™úp9_šå:ã+#Ð9ÞCßÀsÛ§Eoè>^Óñ šüUð—;¯¢—‚­šF.Úîο:eà.v_C'˜o/ŒUȬ8zeà/w^Å _½cíP=7}Î4~º®£À^G^ ¸ùŠ1u˜ÚÚpP»>qŸC Ða ÐaêŒG-l—,UÌLõnbÔÊK0ÊJP.êhoˆë®Ã…êä,×Åú¥T(.Ã(0*-<¦ÁA&¼'6ÓŸ2åjTrÕË0 ŒÊ0 ¤e8ö‡ÃíeS#TÕ½rúéc‡™íR<Ç]nìK¡ÃÖÒ­:‚?Ä!úÛó´”ôÞ¥ÒBŒCI!Æ¡ÊvS >aKòŸ¨îöó\Âtß’æpVµTZˆq(iæô˜uäÂÿ;ÝÔužl:ɘc·‰(›¥x>ÒgÜØ—B/V˜Ì#¦E'·‘1ñÐjmråh HÊñ”@¯cµB]÷—2§œ"iõ¿ï.S”jA$Õ‚\aEE)ï3`Øã¸ÎzïÁ´‡á“þXð^›¢IÈE+’ÖO%1¢?íAØÓ›‰œ˜mX¿‹ßnQÜŒ- ß:%ã^T Â*a•‚0„JAè@M;3¤z-þt×gKB“N›‹JJÇ4$bÅ–&ªéC0t#8T#0R¸—»1» ѰE‘3';‡>¯0V.ÉA*X•Àæ\Ϫ¢Wâ§±Ÿ3™h[tq2sÍóÊ!–, bTy$ˆ1å²úБ@:ëÞ|ÄÀÍÆÐùo†DÕd‘HgqžLÆ)oÞýº\£c°¤c0Ò„»‰/ô:V/?øÇšð*݇ v¶ë`g‘U| F@Y F@™côûãp¸™ÄìÚÈZtKÏ)&ÓëRØ( ¹DÒhFtõ=?IJYå)cY¬!™XC ]:KR`Å8·ì>‚qØà}Ûi 5e jÊ@¨­.ƒ¢#N+k£¥dQ1å²b<ƒÓ›‘-O+yºX8“ý&OhP/–â Ø—BNj§†î-7½ïv&OФL^„1XR„:,­ˆï°zÓ€keþrçU S¤/‘Ùö¶$½ˆ‡øpä†÷á–#Š— k\B¸–wÎí³Q')]@[Dp‰ÇÄä¿Q*èbG¯Z–½›…ý^ã‹,Ï]ƒŠÄìÇæû‹ú9ðËñA‡)ëù,ºŸt‹:¯¤’¥½_ã?¡Û9þú6Ìc•þ¹6S£aä2ï¯ã°# ÷Cô70Ü•ïðÐá~4ÿF _7©iªÃŽÆâ ìßéÚ CREÔê?3ANÛjÖdò¨”©“‰Ùcˆ¦m3ÌøòKùi:}‹(býˆó?_*ýpDëq¥õF£S8ä{©µ=*b"=¹Öö(v ÊÐê`;…mñ=ô¦º›ÌÂÂ=^;ôîžÝüµÉ?Ó«î6^TêÛSmžÙÌ_'ÿ3½êï#kü8mÙ—þE„£ ùuJ£Â³ï¾Üþ¦øW|²„«t|èÀ˜×K‡zm…t:¯J‡î¶ tË¥ßBê fÞ<öBü†ª‘ŸÈÄÜ‚µÕe_æÍ¹$/TsKá}ƒüÛ70›;aIßù¡<. 2ˆ T‘“YfÄB i nr¢D+zÕ.’qWS-«½jÛ~ö1zÕrZ1Ø´‹d¨/ôñ¬“i˜9…èëÑt+\(ÈáERË&3çÛ2$-¸XYˆ…¯Š.¤%¼ '7_f-5©aSe5+ÿ€…ïoóŸÀÊHÑHOzJ!ÌUˆuó>W«9—ËÜÈt.SN‹¯RFר)l•ìJÜé6¬Ùml?GÆW^„'`W„JY“—ïqfÙbâ¸Ý£lB%&ã$¼)cp÷m©V(¦F,RhÉ8C‚^§”hÊ]"H6‰pÉl®kŠVyt€0ÊmYâãÚ³ õ¦G‡–ÿíÄ!’ ÎEqŽR¢W-«Uùà±æÑðÙD-Äo§Â%VÄi÷˜BI ‹Î¯–6õÕÔAn~ä$šSÂ$¿Ÿ:«Î’÷½úk¾Jêp’D²(hÖxžR˜½F|I72ɸî${ƒ‚ë—g#E ez ËñRþ'ªˆØ®5ÍDz×EmýØì PÕlÙ«Ò±ði·Ý+ìfBKH jj&sZÌ8%„º÷ý{z“ “Ë ©Î . @*®.*JQDJ‰ˆ³­µNÒ[‘É ŒË¢È/$ÈÇüïrÜî4â²ÑØóËìÏ©ÕaçÚ¢G‘¿‡íPrµ#ñnŒ}!'Á7sÙ¥i?¸3.Š¥}®™ ÚzjÐÔ#1ÂŠ× ƒŽ¼Ÿ7§4~¿¥Í®I²—“ñÄžYT ò5ªSQ7x  ,ðTxbGa £Ðex‰ÊlË[6 ŽqÆñîÝ?°¸ a´yçJù²ç|‘«þ¶E€õÐ{d9Ûààýõðÿ@±émM‚‘{Úŧ‰xN:úÛÈmÅ‘!lÐ’yw$žÛA¶ÔÛ±D'É»¡‰±*$dhØ‘´ö–L)Õ‰œ…îÌLdàLÌ*ø†®8—Pƒ@—Î’Jté,X ¤a%šq#tåmqY¨°Q†5ÊBâlà‘ˆéFÅ<€Õ‰ª¦&ôXy x!ׄ­túwÝBÓ\ŽØ¥Ý »âÜÌ ÝFMiÉñs%Ù•k‚R^äÄR‚`Å·Ùìr+ž(÷“Î]ÇG§¼fª[l1ϨÃѦ²´f(Jõ0‚RŠôrBèÖ»ÍY<£8¿Ò…ÝŒ?™e+"œ+É9Ým‘£ÀÞaˆË¢Ën]U¥î;f¢p#ú‚uh >²¢×½BŽç†Ø<Ÿ½†äma#ÔÛÉðºí&Pz*ô£ˆè /2Cznt4B4â%¶A,_ì{³‰¤2wã™ Fƒ& Dñoyd,êVêVmù2R2Bì5ç1jY! Õ#íÏxîÙùrCd…­fÍ‘,ìåMô”UMM`åz_‹= ®z‘HñÕiØ$ÑR’R1ms5Ý…áζ¼õÒÖhH1U‰ŠñMHå"uQwár+ÚþÛ cEYÈ|­ú+“œk¾Šª3Ò,÷—>ÿòé”D¹&`@Aì\;hð¥¡åh›[¢Há’xíRÁ¿ÝC胷Îù؉åRçFÊñyNž¶Ä2FÄn[ýЍM0t™ïÐ.Ñ„œ(ª²ç%#„Ty•½j­`eŸ¿T¯4+”‹hasEͼ„¾_’½»Œ2åuB¤æR=BÀû\í@8õü™f…:™\DñÓRˆz¢eQäï¡ÿ÷bË6‹ÆÚÜSWÝ;‹{Îa6äÃÉs釴}10¡ s‹åPì"G]j…‘ÃC+\Ûá×ÏýÙ]ðÍw”by¡"X%G$%7rxh…Á Ïdt{˜uûžØh„^•ÓfB–šCoÄj’¼bê“…½©Kž×¸¡ ò¼msDÒŒèy¬­æXã–öë5‰ŒJÍXüžÁ+ÛkÑ÷wYä ËúС°h!ž»äFC¨px,·ë›Îžíá+³„yØ0©©!ÛËd 3çt÷¬Pèõ×ÅöN Zy¥èÔÊÛ‰DÌ%VB¦s}o5´z7†™wÝ8…è™—Ík0¿Ôz¡±f5û g—ïæ®P‘1ÍF¾/$ Œ)h0ª<a•Z ™ÉUD™ùúƦ´}ö+šÇ‡Ã–>ö°ùÖã1ê™tù~;}Hfr}ôk” †Ìqm{§~åè‘_&üò3+ cÈÄ|Œ´ˆ·âìNDVzPÐ…FoRH\¡·½Î±]ú|ßÛ »ãüöéäÓDq"&µã ­Ó*¤ CV¡TÕ«ð˜á&@‘¡§^h6¡µêèššU{×Êf™g_Rßý¢W¨ìš NãÌ Œ[8%0ÈàmWÍnFÐ^1j3,›ÙßÏ7^#„½ª¶äŸõª1‹"’¶a¥— Õ5à +2Ú*«G¤<éSäT™`˜û‰Q2²‹ ÕúJ©ÐÛ 1šm"^A2™Ú¸»ƒ&fA”¥EØ$»[¶°äÜpäÛûê¦ -…Ì KÑçÔ¾E‘÷Ѓ&2·Ñþõduz%âuœÕå;òS¾Œm`oŸ•[̨ÐBöZ?®}Hžô·ô‘V²u73*vÊÉЮ´€ ¢†i1CÐ6í‰î…E³×`šiD–ù‰‘¶mÏ)v6¤vIé’eFÝÍ C½„LG#d¨Ø¹Š™Ñô€ÄLHÝY#ó¶YC‚©mc˜³0ƒK%*[íß7z¶ &S+ ±‘vÇ„ßè(dG‰¾È¾Ì9#$7íÅw\á.ÜdD¯ XFôº€óº]Ù»ŽnVKG îûA²ÖèóôD&·óuºê3͢魗W;Jô,û2ó„ØÛ6¼A6Ž ìm¢Ï,!zÀÕÝ æ®ßlÁQoö§ßGè’šÆOòæ=¾£°|ˆ§™|øî`G1ë¦rt“M”0¢e¬ÄV”Ø»È!±·Ï·£ŒèõKŽ^,kס¨êú¥ÛØòº‡×~ðSè%¦í!™þ^ÙÑ2Â5Ìsk׸YH*:fÖ_‡e¬r(·"Û»D碘o/a ^…»¼>_§ïý/8)™¼ãtBÚÙl³™69RLa‘Tßý«NìˆIoº'÷è+UÒÈ>j´lñA^÷ ž4§Æ3·Ú~‰‡ÃÊýò í0Âí=:IšK?”`f‰ÞBØ'< —: ÅŽ2=þÌ<%„× ÆCvˆ,®SbÄ %FœúCNˆ ^»zm©ç"}¤ú‡¾~~Ï_3}¢O…™-¬©fëU÷D¦u%u¾A™}2Õ^bÈ­¯è@·õ1¾…[Üøß–[Vñ÷¦öãY-P¸Õ±=9H”,»š­SJO«®¾¶JDœ#”&dðcšÉ|´šç´ždðF=¡Ág„f>_d—nØ"{^w<9)J~_{ž ô õk™>›ŽQ7íM×~Ü|VøÓ·íj ȼm£a‹=‹|m¾¿Ê “‚t<ñ ” Á(¯ÙΛŽ͹Í„ÆÈò]²=8Žøº*ðï>ËV2ï~ðE"CàRWÓEݼýuÍ!âr¶ðq¹”«, H„š2j[ÎÎ ¹÷³cÕ·Ô;^g›ö®~\«yÃÌöx¡ÊÇlšøJfÓ={›û2Û^Ë€‡Q`„Ã(0Âaá0 ŒpÏO÷{uó}~·¼³e°i'Áý§wˆÏjλ\!J 7<ßCÚ§õŒ¸]è¤a(AbJ‡z$Æ¡‰!èH¸®÷+iöÙ/äs:i÷%1ª0®¼HducdðI?Åd÷)?£ÐÓS¬§ß­ö€"äxB±¸Ô#ÛÜÕW²þBVuJ½e qp'3­à†'ÅÛ×ð?Hþ’ ìê"}ç{è5îÝ¢7L¼_þû27öù ÚñíR6`­æÒᆠ¼½TžG§<+ŽNyNCæ'â(Ëd7·Êg3y:è§-dÚ"ø| |=¦Ùæþ={Œÿ`8VÓ©öjßÜgüy¯QާºO Ì[(Ÿæ}mºÌ.ÊË‚ Y*eâ"ŒÁ8C†W:g»ýÖùaWô×—Ku°î& ¹µàª•¢^,+ŰOù:Î;6É}\ùž]šŽÚuôØëèŒd/"½A/‚-gš§á´#­û.4ÛØÎ©$Ò–øwHòàšîn»iŸeivšÚÂæuy—Ä ”«‹¡W-+†áZP1<ø³û” 40ûÌä©e™ˆ8:åyqtÊóâè7ŸG‡üƒï;—7!Í@zLð| Ý€nÀx5>QÌúBx{ Ô,kb›_Â¥z{÷XyôXyôyŒV!’G +èöØML ‰`X&Œ.é’0º¤KÂxnÈ©Âç‹¥|¹ÛCF¯'M?hŠ–%!­HbXÿÑП9ò×ñ•>C껫2Æ"m‰w$†.W6jñixõE<§ðÊ'v`™It; ÞK‡ Ì7­÷Ü+Åh”‹Šñ >צånAú4Óœbj5Á=ÝÝΕ£% *ÇS]Žª€Ô;àG=j×—Ï"ä¾ ª5‘óÍ¢Z*-Ä84"){ÄÀÿ.µ¢&³þúíßs’”`”• ÄE EÇŒPœŽ/ý©÷¤]¹FäxÿÿÛû–eÙQ]Ûþø‹±Úé~4g®ÿÿ§›æ)@€€Yûìs¢U3—¥1Û€AÞ…b÷ŸlzWóùZÎO(³q=ÊÅ«(+wT lSèX3Êv´…T®AªX½†ìâ|û¸0(åvè#â¡,%=ôCF:jVW’ÙI™W S\S‚P&Ô®2:ÚW¹d÷ÍÚR eRRá¹ 4:´”éPY¡Ï ânË0 \¢¨gƒ@/;þ°Œ¶ (Û‹rך×ÝNÅB)fÀ®Ï΀Oåv ÅÛWØ?ÔßÕ²eŒ°òR¡ãP"„ú¸@ù 6Éÿž½Qµí‡­„ä{Û½+BT¥R!Æ¡DèÂøŸ«Ž‘ÿgOØê.6y`L~<+ÒwE,”bì¥è/&A…½›Ý潄E¯¼<<‘‚HŽY;à˜$°kG¾²ÇK‡ÈŒó!mñBè·»0Jiµ” /°¢„NÛ%ë˜å—ØÔ¯Òê—#Šå»¼wVrÕŠ&†Ë§š.Ÿj‚We{ ,«LdÙE…ÏÆ[Òeõ‚6úÔÿÙÂ?~¢e…@]‰~ª_#ݨ„!T Â*a•‚ G-f¯RòvÛ¢$!*ºÄ‰•‚0„JAB¥ ¡RÆ"­Ôr¬ùpŠÄLPI(ÌE¹(˜Ñ(J„`èFpt#8Æ«A`q7·#_°QE7 ¿n™bURŪJÎõÐTŒÆ~ŠdÜÛ.ì²i,fNyÝEÍš"ÄšE þ+õ¡;]„R>ž²ƒ±tþÍjà7Hâ……‚ÄWý°1!W³2zšðlëÖ,+2¹c°HN–Väܽ>ÿMçgæŸÓ„á:t.DG"¹# D‚²(©ýlªƒ:†°R棙]\,kH0Oñq9ž)\•Õy÷=?ÄHZ÷”0ׂL­¡…®2KZ©€ÓbÝrø°±aÛ\ÊÉè@¢ÔÔ°´ºäfÇŽ ~¸¬k]Ä›”ìú‰1·bÌÁW{®7©ååâ¹,öSyDS¢.J1vñsbqR»güèÞrO€ò  "TdrÆ`‰ìxõVÓwÐâUô(¯¢¡Ì¹%°W;/bŸX§ Q9¢ï†‘Ùƒv}öñìgÔä0€Iù‹Ð)(ÃO¥í™¿0¶ÈèÝ„aä·íö×iV!ŒàÛ?õ¿Ýßärÿ>÷®·¿Žçúóo÷×ÁãFðŸóúDŠßèr?3½Óèý±%îýMÉâK Xý>:pæuÓ¡Z[)dÎkÐAæ¼:Úb»™·²q¹ïèBE—=/3в’W¨yƒnì¿bl¥·o`N_ñÏüé…²*3N0åh;¸ñ a(^ñú¨‹?|õd,uÞ\ŠÞby–Þb¹RÑ]l£:Ã>ÆpÓR)äÅ®ÏÊ|4­òG —oVEÞ²ÅÌïT<# ×"3D‚.Fw±5Ê ý 'BnîbZŠuó29D€¢{£#Twr¹`\A†TØOg§céeÞúg9Ç%ËŽz•^pŠ%Q¡/™9q/¯«O.a«d¿6º½{¸ÁËhñ”è{Ø!*øã¢˜˜dç&îÈ©,6"Ö@[¥]æàa XRÑ(ª¿^OÈr¾>%¢’äVˆÐeyä‹?›–eXö϶Ň¢WïL9æDÅyåÒj(Su̘à)ÑcB‰D'¸LÑÜ>gáf7Î=ëð*¢FUá‰D(¡CŸ:­‘c°ô˜%…ÈI4ÂfòÙþÝu ´¿Çsˆ} GÅ"‰èUŠÝÆAiÖÊÂ<ù d#½Gi-ÏÝò³?÷;×BE&cxDˆÕb»ö4ßæ·.ÏÖeóÎé#yßšáReáv™Ð¥ý(3Å¢¿\† ‘p±‰µSBøv,!ý“Ý]}ê“~ßGöÞPÑ[ë”èÄú×îö,NØàNÕDœ5ÊÅ l?òÒ7¥C…¶qÉÔOw˜ðÚ_Ÿª¬â–ñKè }°‚U(ò÷ÐCPkØz7™¾‘ÚÊÇ:vyÁÉq‡k/)"ÑÜTؼ] ¦Ð>4Ì.Ô¬ƒ gxE—ž‹õ¾äMëå÷[n4dHÛÁ¬R|oEƒÜ>I\ö(ê§9F2DÀzKK?Rß¿, *Œ[,zÀEC!+ìŸôŠZÅùò¢æ³ð3ÚJ§W³ÌrŠ"AEiñ›ß`w›S5eD¼ýs•ËÃÜ.(‹ìm˜ yåò D¬ât«l{¾éd×i2 Чyˆ˜ ÔˤÁ2;ýÍ9„AÀC¶ER*[(æ)V»”+1\®KE¢«ÌR‘¨•)ëmÞçͦÕ!xáâCøÝv“óªsÎÛÔnöã­.ï‹Zª¨ƒúú««ð„Ÿ_ Áh¢²1Z‡¨lô¢6q’ëRÛ“Yz8¯è*˜p–‹Ç˜ÑëÖL º3¾kн,­È³x·9l–4jF0,™#™_É”x53 …ä7a¥ cƒ›ìÜdÇŒ;¼70ãψw¸?2ƒŒètÁÞ\mo/ý#œ^n/ìU6™‚]¯ËÎáWšLÒ‡™YÉñŸ«fˆv±z«ØÛdGÃ^;f¼á 1ã o.&¼Ø!°·Mˆ¦öÞ½àÙ4ÜL¶œ›NÜHMŠú˜±­G|mšF|eéPžVé–•Šº¥BfpÔy±iu仡ˆAOD䨯ÌE¯XF¿" ê¡åÑq“-'¯ïP"²§4c‹M‚þãBj­¿Á¢¿¼˜m+%DÁľzJXšfA๶YÝ,ûü×3²Rþk¼??Wx•'bÁ(Mu ÃÖÀ„Ëß7L61(k_')RÖˆôÉu¨÷À“ûœ£†°êu>t:€7 [e¦B\÷ŸŽ™·Ï~U­ªßès‘´Œ~„ÀLïœepo…(ÞÙÚI‰¸¶ eÚ6;D·Ø1åÇŽ)$íA8vtûƒ3ýNˆ(÷f$ù³Ó¿Îvû„^VúÌ^Jó½õÛœK·µ“sJÌ·V(Ö§e UˆO,Z+õBXåÄè¶ž3ÝÖse ÛzŽu·ŸÆ¨vîËD¸>Ü®ðWÞ)ìðÔùj_Ò2Œ9[› ñt°Àd›¥hYö•TÄ·®1øz6«yF4ø4hÖëEö®ìBÛÿ»ðé )Ú…÷ük[>JGO[ŽSÓº9ÑùíÔëó$¿Œaùºÿì#ó¯}"[éa¤zúhØ‚1·hôÀKvc¤ä¬` ”œŒ z[ýû€zžU>ÛBv}›þ‡Ä=¸Ÿ‹§énÿº×”o»‚še;Š­³¥¦„¥•udcµê;ç/†-‡ ¾¾wÒ½›Çjñ<‰‚M{ÞÉdùN™Ö;>Ôk;£À‡Q Åaá0 Œp^Ÿµx\=ùO½õ‘µw¶ ´$¢üòV!Ä. °r—FÖGHA´_7Æ¡‰q(Abꑇ$Æ¡=Gµv›4ßaAš®½ý O)ŒïÆÛ؆P¡QŠÝdb™¤pkÜsÛ˾‰¦(ÌÊÍ,ErI):âçEý„¬Á0÷-Ï\]̬€â]4X¸ úZè_’ÿ>µŠ—&hŸ1 Qoí.z“Âûå¿írÃÀ+3NêƒI¼=Ž1‡7pLâm<§I¼IÖ6‰O§,^¸… ÙãC¯pO‘u1cfˆ|ÅÉiMÊhÆú"¡âÇÑ~j½(òFDÛÇÁ º#fWÔø¶½¹×Æz'Ge³î•Cg|ˆ9xñÌÀ-spãdnјƒ[4Öj'ö·§¥zÿ/d'’×\$d»Ž5w0wPIF †‘ˆa$bI€°È¡æÕÛÉŽl/H×~åÛ£øEÃÈßúÿÉó©– 0‹Qƒ%(ŒÁ:`åfD©MdÁc/ß¡äsÕ3 CÊ+”ë¦ÉuȧŽN}VCæ§êšIE¾5>Êä{ _š**è´Uð™§Ðâºß }-§-àzöI)/ÿ¥Ìô“Š‚HŽY-ÇAGö¯¢‹–ÛìD¼ÝkŸ´P&‹0ë4Drk¡Vÿãù|¾¿\ýý0a²mÁw¢.I1öR´Àù'"§Ø<æQôè' õêò8ä×Qt]G/`ªóë5ªíJÃþ_.šÉe·˜]KAE ÿ>’·YÒÙWÒ0ýM¤`}¼óhþ‘„zu5ôË©a¼$’'º–G.’þúBž!XÂèóêèÔçÕѩϪcÀüL-ýþ‡œi€48>Ÿù€Ø”Åßo#8º݈€™jüÍr>ôfˆŠZ{R›Ù€Åê£Àê£Àêc¬ ‰>ƪ0òaöHcß§A"`N4ƒªÚeti—”1oˆM0iˆN3ÜóC$ýà–4Û€¯«´õSMÈUËš/Ÿhb¸|ª‰ :àÜJÝ‘‡Ë‘'ëøï'éòb'ùײ÷Ï–( ©!PÀ<Ånæ‚ÆÀ6¥ÓÅ|ˆÊˆ½Ž‚ ¹HŒ9¸£$é+ʉ)ŸéçåîæŠ-‘³æ”¯Ðù”}k>[¤|º÷­íY¡¸Þ!Æ¡Dˆqhbpôv? ÏTSŸ×#õ¯?¯%‰%¥TAÒOàHç ÏGµåüÑL/Ù `È…óݽÛÖnÚØôÎÞóµœÇ þrßUÌPØêH¦ÍIuV³h³ïÔæbï5ô}Úq§ò ˜Õµ”<\¹ï*z” ÕáÚ‡©ŽK›à¾Z”]×Ñ `+‡ÞÎæCãú3éq¬¤G€~ã\+)¶ ¨Ž.·2o¦|‰# ¬>M ªh·§rÙî»$CM(–aHeÐÂsémdezGÖÊzvuS¡T†Q`$Cð<º·Êö–œO?+ö E],“bì¥h€Oïá`ÿ€ºàIå¾•ì¨ 1 BŒCiç÷uW>nJô¿¨Âö‹PBþ6ÜïŠT*Ä8”!ž«ŽHÿg6õ˜ªâ ©wæØÃf‘“I1öRÌ€}€ïŤ*°w¯Û±–xf·YòJr´$rÌbš²ƒ±;]š¨¨4ð?Iâk~¸Š«YÙäI‘Èä"ŒÁê°´"¾Ãê/ùËW1LA„“oHz“x·V|¨rDñdjK×òΩ>ûu’Ò´UÒa˹5ùo”]ìè-–eïfa£×ø"˼k0P‘˜ýT¾¿Òa俔˩øÏyqˆ("yÆ”[JawV0—"1!Ò£§Y"X“æˆê6L„ÄIcDȽ=@„ÜÛú!p0ïózÙîTF–éºõgW€Š_‰0¯Ä-ySÆWãù·h Dö²–$üñ{žšÌ/•¢(ί”‹‚¨¬FQ•Õ ƒ¨¬VQèpaQŠÉÐáÂrQpe­ÏZz4¿ ( §‡†bárRi8K3×J¦ØþRÄ–éB¨\h«µ…ë„cÁ.r1åD/€!“ñ½e]â?¤Ä9Õ’•Y„0Ô„™¬`§ŽÌêG]é• "z*Æ(ŠQ”ó¦Ûrî{üN穬ŒZÁ*8,FÀ™RR5~lì “,ÚD­p¦èí`©0.ª ·2ôÁyˆ¤X™(ìº^ŽMBQ#)µJ„š†B½zU¡£Î]~í?i{Ê–QQïÈÛÖÔoS"âP²ê(ë—ž!v‹Ìª‰mLï•>r#öƒ†Ðü>W›ÓF¢>F‡ÁÒcmðµÿÞß»Îõ÷ùè·†SCœzÿ+‰@¿­½&ªž„¢Q‚&W±s÷G¹ìÏýލë Î2µ†¥®õµöÙ6 lî,}úêkûÅÊ`„Û‘„wõ–1!»˜be4´s¶'¿‘–7 ­¿¸ŒwÏÉ­kÏUbMÑè×ÛêvßbJDœ½68}p€Å¼Ù‡« ¾wÙ˜O—‘Ý_Qtyë %½­ä-Tƒ èQá—[…XÑ[[¶˜ìS¿HRÁ‚bvÜ!DmÞÖ&Ú$”Ó.ShF]îtdÇÛfQ…t¶ämy¤>Ma Ùn#SÛ‹T˜±À£0aA Âle4heª­G޳à®Ñ{\eŽ©`««”ÄŽªôÚ²º¾³¶àÃØÒÍÖYž¯Øfa'é–‡^“¡Iì¦J(Am'$A€}r2LÛáó9LÙñ )xæÈ$Î-µÓsŒÀï¥ß" 2P‹ü ÄTA%3Œ*ohy™¥"ÑU&o3ú W›cß7øîßN¿GÑí?aX–ê£Ð&Ÿt…¥R$E5K‚¤¨–!UzˆðX¸•J— NÙ\â7ˆ’Êòz Š­·³´‡uE/FíxbŸ¨0øq?7sçÛ<‹‹w»Á’*¡¡õó\ŸØ>F¹÷û1\|ð‰|Ë:–ùèââég­^ÉØÔ¬#la½ "Dƒrt#88D;HQìH”<™ äjuýûeÉt«¦sä(°¯99Šì=æ`È“©#–Œ³ê}&UD£?ʈÁhvïvÝIª_t„Þ‹G@ñœ ­zÝüðë¨5…”c…Â$Ô2'$îí^ÓhÙw’ÈÄSDè(°!θãU©å&U"yÍ®œ$ÄBé'©¾oyp`[”°½õ°¥Ô‚TŒ¢í$åT¤ÕPB§¢úß>ˆ_ûlwò\L¬ú§I­\I–˜q€>èœÑŠiM!ØUÑÂç7h ,­Þ Àºáxšúƒ$J-ù¬oß„*‘#Q°†Ý=4Èd4T eµþÇA8ÙasÜæƒK‚` ߼"-cã¾õ¢¤ÕAˆ]AÞμ¯$9 Ü!b›¹À¶ôXJZ¾![„ ŒŒÖ*#ÄXቓ }°¦éh*'›\H|¾7”‰nx<H Mzùå¡Ò1¶}ºîæ_Uiž‡“Í._m!À,ÏÚ’ô;fý$Ÿ+ÀrAk´¦XR» Œ#C00ÐÒ~ôNÊx¾äière†àpÉ!ŸÂܪ£I‹‚Q+ ÃH D†”ÇÌ›| « {V “FÀ{"ÓFI}ómW³4ËIŠYób (§mšÀ¶¯9Ûn’XmöÒØ¸4ŸÀê`¦&nÞ£Hâ…©Wf°›€«¥K[^Іâ3XÈÀ² +¬QfÀÞ+}Mbag´×öÔßâzB+cŒÚ°ù½'·Ùl‚Û‹ñf¤–‡ŽËåA^`¥<ÌÁ-ŸÁ&zG33wëV²+>§¹‘S+ÔËä¡0û:×ÐÙh’G·ÇÝ¥2…"‚èa^­ÌB‘è0»l58³;›Ì®S>o“0õzqmæ–,Oýr;ì=½èp9·ë^›wépìj©£R âþõAbÉÞEƒ±Â“²1VxBƒÏ Ë¿‚¾Û︣™ kKÄ郛¨R‹'xž·ï{ ™ˆ+³·s©÷®¯I© +h˜äq+ŒÎA.éÀ¼?kÚÎáÛ݇HÖ;¢ÖØ(}Tàí;(eüúE©){Mi}œˆI­Y¼¶ ŪöpBè>sb¥º¸]ìû§ö(±žáö&•ý˜U`Î*•—~¾ƒô0l*1p÷»2å°MbHm‚o¾Q›L"¦š½ŒvˆZ8È»ˆïŸhK½‹?Ú†RuÝWB…ºçÌ ô`ü­³—ì°úÊlDÉÈ.btÔ~¬…6a÷A:žWͧI0; ï-téa‡Ü)bj9Û¶³Aý˜›*ãFÃT¦Ê,Ån ¹xamæNnÏá™A žòiØ^òûÇ5R?YÚBš,›J·˜!yŽ4ÍDÇC©l&ÆÜ1£ÛbßNZ¹~Dº‘ Ÿ Ví>F¸¶ìÈ^ßvt¾(sÄ£@†%õ7É–+u¢l_´SÊŒšb2Tì3£×¿ãÛô¨ ³×})òðËßn:°<â³³¡âÉøÞD°HffæcªÞr´‘Xõ£Œ ”fÃP|SŠØ!1¸i/z]ÀÙ‹)w8vL¹Ã±£îŽ]ö ÂŸ|õwk¬¬ùðßΡ¿a¬GÜû·͵¸¶‘NQªŒËJ>çrHìm’Cbo‹{›ä˜p†#Ç”3\çYOv_îCç‚î]›Šª\š¯$v>ô„y#γ诋î“û !ã¸Y˰Yà+ÚGˆ¶çO”Ÿíîô‰³›$%z·¤»)P-ût¨5ÕX#>ìô.àsy}ü’+g«Œ [e|hØ*3#nȨ1↔ãï0Ò¡ŒÜ–‚‹¤‚ñ/Zfþ`ÌCxœF‘AÖ.J¨¤Ê eêÐŒ2‹cÀ 9%D·Ø1å-ˆõúc¯Nò„},ëb~÷ˆrð„3•X°Y#hBzZ'1fBÌû7+ÝÖsÆã7Üâ²ÚvXÏ•©õÕ20SgæYw]d)K§£<ÜîÊèe½0“Œ}ÉÎHnþ$Ù0 bß­ë’H66=;Ãö½˜ªÛ.pΊ;ÈbƒÇUÑð¾«è._ðÚ–ÒÁF–ã¤éûÎÅÄóWîý£W<ó¦õ»®õ¾2=Ø×(Þ„žzžÔ#ц>ëÊÃ-%çc ä¼`Dðï(æïÝÉ }kl?wô÷Ñð< þ|¶%¬}ÛÑÏ‹Ìn†ïùÿ­ôXJ¤Ž0Å{ÝkO³]A¥–¤¥Uu Qªºìx? b¯í/‰,‡¢óÞe¿é?ïÝ<­Í´S§Ó2–çh4 ^®oÙì3[½¶“F8Œ £@‚Ã(0¡x} _ZÂC[]úÄ;[hX]s1O2û7 «EŽwߥåâ‡ïWT;d?%HŒC ãP‚Ä8t ç€Q½Ï”Í ”˜Ž|ËÙ³ÊÄ¢ÂhìÖñ¡ãW C­º(LˆÇYŠgKÖ4ÅbÖ[&)ôzð4…Z«g³–&3tQ;«èk1C\~àcŽVÁ†b4')}íúHþâ7Hž8èó$& ç,É·¡•¤ýý›¶¹™,ÛÖFùy¬?œÚp‹¥ä#¢Ë„rt«sQ¥:ðn—ÁÞÀ1‰7pLâÝã|ÚœhÝÃzÚÙz¿"D3ÇÉ™áÛ‡‹¤Õ±`L¡-ShÆÚ1…v`dè¾{Òý[ƒ¤õNÎkeÃ?\IJ¶6E¸AcN¢ÌOÀÓz nц«µz+¦M¹lÍ›Q¿ZÈ^ÿ¾¿hôÌå EyÃH Ä0’1Œ$@ #-°o˜«·{”Ú é g?OìÑØì¢q‰Ì¸í SY7‰.´÷ÛöüÎ[ßõ¦üNZŽÏɆvWnø…ȧÔÌzw)‡y+Nr\I¿ãÈc®ŽpÐ{hœ#Ø8.aãÒ¶߸*(ÈW»½.p*läTZ•>“š`’aõGÆfÌnòY†‡“ W3ðÓ l{ÂÇå9^ùšýê{‰ãJŸ89¸Ac¾ù3@3p‹ÆÜ Q€‹ŸµºõP}Ö†#†GÄþ,Áït¤—ÕÞd˜ ÅÅ0 âbq†A\ CÀ‰§vù…j›|{ÈfÚ÷l{1ñ¢Â9"¹>¯ŽN}^ýægêÈõ\ Q·ÿM¼\º¤NT Ði«àó4àtz=S^à[NkÉõl üò^ñG *GKA$Ç,Á>†LÜ„Á)–ÛlºÝ»2Ða ‰Ð„ B ^àÇóqo¹Ø§ûábJºœu±Pа•‚ˆ;Ù.½¼C°–= Vh¢:Úˆh‚ëèp× úªdÖ(|¤àíJCµ^>–­Ùôq-e ´Uþ³$¾°+æ˜ ´Š(ÒêACÖÚyï< k¦¡^] ½Å²jàôÄ^RzcÑJ‚ÏØ7I‚6XQ]iØâ}^ú¼:úÍÏÕÑéÈ4Ðio8lÌ$¶ð€n@7‚`¼¤sBæÔ=aNbΜ–#Æ4¬>z¬>z¬>ºª¹¿&rç‘3‘aƒáqäÖ¶vI]Ú%eÌ¢‡ÈD»ãþ^}Pƒ]9ï¦_ýkL¥íÇkB®ZÑÄpùD U™§ ]u¤ƒÊu9ò!P¦¶Š@¿A" IèûÈ‘¾X\”VŠ mÌS|›Q4«ŒPçÓ®ǃe£‘]GEŒ†\$Æ8œT’Û_Æ©ž‰Èåî$³ÿµ¦ ‘c– :…¾±ŒÞèàC\»ïÏLó²Ñp¥BŒCƒU©´j°CŠû£oÕ+|Çúzè’J0J%`Eâµ[;ÞÄó¹`9ô·˜Ë}è¼P%9ßÒ/wÖ¤eÓ»ÑÎ×r~£ì*z”ù«ç[º›ÑÙ»š9ó¾ÒÕNŸÓ‹Ý×À*Šêšyq‡Ê³’:®b˜‚Ú ©S}â¡”Ø-½²‚®ëšÎFÅøíÐç°rîL€~#+ë/ŽÃfëbÊ­J0J%ˆE½ÉHLœÚûæÊnÈ0 ŒdÈ…ç"­ÔfNõeÍ£Û·ik© £@*CQxâçþfÌæ<îœa[ŠpôT‘‚OõâÒ&»o¼¾ÉLøƒe+P¢*• Ñ }ªå3f»ÿ!®Ž]WN êÉ2P¢*• Ñ =×$SºH W“Å&[ˆq‡‹CS•bì¤è/& ª1q4=ûÔ¹œ‚HŽY@VJê¢Ç`VÑO‹ïDÝéL‹H«¡‘VK òKJðUÝO?÷ ¼ô÷©åˆ¢w-ï=Õ„\µ¢‰áò©&ÆÊOZDRrè°S‹¢±¬"''ÚèSgµÑ§Îk£Ûô\üýÍêT?iQ$tÒó(\êÖT Â*aƒ0„ZÌ'mû¤÷Oëè ¡Jc-ñ[2a•‚0„JAB¥ ˆPÏgÐìýOòA%ÁvåâìÐ×3Apt#ºÕ0€§û!š“p*ŠãÒ!_7¯©bU%§z*Æ1?†6ÇÆ ¢x%‹™b\w®YS„X³¢ˆÁÂõ¡ïºt–¤|èeÇw:sçTø ’x6•¨„¡Œ¹ž£ûÏRÏiT¬GX¬Èä"ŒÁŒÈë_çîõ{"«ùib:vAdJQ‚P&A ”˜i?Uè5Ḿ¢k‹E¶æ)nóœ¬h°5Ú}·$¡£Ö=-2WkhA¦ÖÐBW™‰VÚkhyÇ!¤SNF¥¦„¥ÕuÀU’Ôñ²ºö´rJfÅhÈebÌÁ?.¬{R‹ËÖ]ì÷¦ˆ¦ E],”bœ˜¿..ܳûíÝÁÏÐG,Â,!‘¥Öú¾g>œ[hrüåΫ`.sæl•¿öjïE¤WCTN“\‚L­q LR³Êᛲq]˜¤¼s#-äÿÑõ›2޳Ðß(ÙÇR2rœe˜½ŽüŽÃ”û_à.¦¿"–ó4"úé÷7 ×'pÔÏö„.~¢®áNóåÆ$îÈÿ€üóV"HŽ€zo¯ó4^ýõe½ŸO-OüÿókŠýQý!ŸÈ}Æñö/Ò äïrY«Ü?×s%Eíf-ùç×bÎü¢”yöˆ`Yl+¾ŸõÆÝ¯ŽNý¸¢NH%¸c"úì›ÝPò¬eª€Ûo¯^ÐFŸzA[b‹{Δäh)DN ;7“Áæï³†½ìŸ¿Ï—ó½DÇ}á5kŠkVM}8IQ×ðc¾Hù4çþã ‘.%"Taz0žýŒÙñ“Pçç[¯²ÁøõYou¶#‰ß˜(£K»¤Œ¶ö¥š2°ÂÅlr7á }ÿ^Btn·Ið´™%•Àê£Àê#\{‹’Ó@¬²˜7©í >°àF΀ªÐ„6R$tÊ“QÉa c°…6ìÚ›ô*Ú¨Ôi!„t ¿\T>Œ˜ËAvrÛCÀ†A‡ýl3hŸCŠG_»°Š×NW5yŸÚÀy[wt#ÁÙ¢¬Säý}d•´T µ¦Iû5N…¤†ÝT×>äÚ|!Ï]7Q o‹SÍGQãDå=’ÆŒ<2ÂÎÀ^>°öò!10j€N[ú°« v§|‚Üd$ž¯NØí·e‘W?@‚!)Ò¡È ·ɘ6F¾ž„Ì;¾R)ŒC ÎMž‹*™Ÿ<›ª·WïІž…"aI½3:TðîÁFl'0¶8?Ê!  Hìñ“®¼l.H¶r£ÔõN¹¡¢%$bIF¡Àéƒ(z$É$×3Þ½µ.3‡úì>v ûúñú¬::õYu”õ¯]Æ{Ù¯æMEµ&GÑŽË/“\a½r! éµ·ýxXÙ#°×'®F¤‹å¢.ÊÔ9E%ˆ´ÔÊ<<ò¯T U2À5 [ @7‚ AöìÐ-õ¨BÒË+_k¤„ˆíU^37ÔîFp´ <ªèÐ-ûRjÎdÀè+‡nD¹z5§pä¬*…\·¯r½ŸŒÜ$i5«Òúœ:ÄúÅΔRÑŒcŸ¡ç®%£7ekTˆÑ-«¢C7›lz%ˆ´x¥àô>ÑVÿxiû%Õ««A¨W®å^BV ¶ã²Åj>¸%5ƒH«¥„X‹¯YS Q½kÕÞÞ&.r½F_­–DZ‰RV/4䱸¯©÷MRÚÆËkÄV¢‘VK œÖµWIr1"yOsëj6<±ÉMºÜŒµT­®™ZIëÚÝ‘½ºBQ^Iˆ•Ôþ~bÑùƒJ}ø¬ïÄÞû™ÈHÔªZ©]ª*GK¡Ýônпo$ߨ¶ø¶ ¦mä5(1ªèÐ-©B¤{Ýu%ˆ´q%‘õŒ$8´;ÄiCGí¾…àNrÝ¢*:t¿¡ ‘Ö3t²J¬oPxf¤á£/&ªq2Pèƒ0ôC„} <Ï©EŒnÙ–æí·_—‰0o†Oi|è“f¬+¸`„Ã(0ÂaÈDjöï§ŽªQ}Ä€õÃÚO¹ý:M\{· —Ú†9v ‹,ÃÈ("ñ0’Á#ýWj™‘èFHfòÚÙ?ËêúÊžq31”Íøé=ŒpF84ÚmbЧþõøÆ¸üsã|ùó±Û•ž>³XÊØì:ò» ¡0KPhÂ_ «#PÝÊ/{T\zûðÔÇk½íÕ“Æh>Ü|h”a0Ê0H@fxض(ÒCE±ù¤]Wõ ¸`³_訋7æ¹d¶·Mùv…Сž~ƒ@?„A Œ)kju-r?î$¡Êóã¸]g$6ÿ¬§K çGr.LÏ;¤~Ž1eŒ€<æò¹Q…ŠU=ˆýJsïèŸßnj§Qvqû ì»GÁÔ++ÔMÅvXÌ€=3`E¬–žZ¢S_0ƒX×RêÜ3Ú–±û‰­¢!£hٛ߬qgû‹2¸MK7w!L¦àöƒY Wï‚ Ñ\«4Í›Nuìîks;vÁ'-]½L¤ñ è´-- Ókg)âF¤p)8 õ.AÄ=uE¬ÅÔ*ͦz^aŠâÆ,!hÎm7£­:§™1`7æT*‰z;Çà÷ru1œ­©fý™í'°Ô#z”‡°ÿ.±ç³n5/SFìi<ÙFìaDÉÈ.FÔšQl¦ìó¿Údýº#Œ?>Ñns½VìómŸ$4±¤K4Y!²·EŒQGDÄ°Ìæe>Jjä0²ú ü ÊÌb™F ‘yéïÈ.”ÛápSÍ67xòNnô^äFáEn” Wo1Ún°AîÔö×ÍŽùw¸˜îüîhhý|O'ǰÔg~`§ƒù¤›±¸Á ™Å fÈ}aÚ›%C·c92 ºSðý¡§ïèhψO¸küˆ[td/r;Ê~>â_Q~-ó‘pYº™ÁQsFט!6ºÂŒ wlÛ/úvÛÌwÆ1c5›ž=IdÂ;d¡²£“¤Áªdb¢@Üñ÷gûéÒïŽéaG‰¾‹½Æsìè6žaG‘~[åŒÜbD· ¶}|j¥GGþ9K´ü·Í5ªi2쿞\ñQÂi÷q×,ç=ÇqP¢ïbG‰¾‹½Æ³ìè5ža·§„½áAÇ Á›Èõ«r·B6e÷¾,áfÉo‘IÉÜvr°qoßhÆòeåÉ•cFeÚ!fFÝErìn“£mú¶6ÑçŒ#:=@÷b‚_Ù"û8ýú¾Mý4¼:9Hì9B´…Ťe&a'ob'!Êu~šô¿†EþxÛÈbãn²6èM†¤çWFþÁ.]fõ!#lªJýlœ¾Â³¥<Ó“Bdpeƒ;¨Q3{[…|¹¡Á‡^·²]Ϻ^í>à_:]†Yl ïOfàͲÏtÚÂ%J-Ñw°£H/gÇ€ñ9;úgر­SþpÛ}¢H"C”¨™)}ãæ)vét’b9Ìæ9 ½õ[ÖÂdÊÎÜÈÚW…¨R‹²òƒ™‹Ätù©}­FHž‘ÿ’ð$²¶6³Ýv+ëï—6ߢGù˜êŠã šÌÒ¶2ƒxÇ$Þ}sžÃ8&ñök¤_Û‰ݳzÞX~Úvô!¦»±>i]q$BZí²O¡éríÀ˜B;0¦Ð,}ÞºæâÛyã… ÑɨìJ‚F÷Ð Ü…‰œƒÈBØ(Üçà&\Ò‚ðGâÄ7ßBv!Ø×8´ !ãò=Î; ƒ$@ # ÃH Ä0’ÑDÊZȶýj°GC-½˜æ#BÞúÿ±ÕXŒÂìÌœ;KPƒ%(PX»5LH™£xh'½WèZûN†DW”RN9lŠ1‚Y‚ý˜Ç L´YóXè&àvR#jÈuy×ï¦ïœãøœéÇ^ÅÙ‡®<䥙¬îeŽÍž3žãÐÇr§9ž7Ñ4‡zÂbMsø!n‘ãjÜœë ý¹FUá´~¶À¾ùÒÿ~M¡A8i¤ «N2èp/Ó :À4ƒ=ú0Éðt9YCÖÛ!2Eº½úND‚‚Ò'ËâŽa~Ûãp¿ï{ n sp‹ ¯œNaZ ¥ÛÏÎûŸûYßéäeØ~,׋aÄÅ0 âbq±[šãáä ýöˆÍ¬{ï'õ cÛØF¯ŽN}^ú¬:ÌÏÕÿ×~”‰ÏJW¸{8tÚ*øÌÒ¨5 žÙé‘åtû6®gŸß—ðŠü‚DŽY-‡œ ½„Õ¨ÿr›Í7·„rŸk¨È¤"ŒÁ’ b¤çSÚþr6Ÿt½f™i±Ùö"±Lа—¢"Þå6n´ìQ´¼'Pßꢵ֮£À^'UŇ“2áb¶+ zù©fŵ”5ÐVùÏ’|`'îæ`V!ÔFü;hLUƒ÷-¨A¨WUCw±œ½¦w”ÞÚ“Dé„^)N#›†’³¨žœ::õYutêóê0¿Fš:0¤ÉG9µ‹â×» ÁÐàèFpHÕΈàÌ=±IJŒØS¿tX}ôX}ŒU!ÑGÝÓQ|Ì8†­h 8’âyeti—”1oˆÌØ£]‹}朶úˆž/)êßJ±&äªEMÈU+š._ò¤;Ò§CºÙm~ƒD¿SÁ}”TkûÉ"PÀ<…òRHºÿi×dã1‡²!±®£,FC.c®Öò©;zwëoß1Å3M¸Üâåh)ˆä˜%pùŒ‚ì¹ÿ|×÷A‘Ý";ž‰ßõ.H¥BŒCƒT*žÞ}'^á[гIôâEŒ€¨DmìÜ9>+çËésÈ3ÐV©]8ßl÷Ï-Y6½#ë|-ç'0ÅWÁ_î» þ²5´mçªg®ß>·“2ÌÅÎk*VmCbœYHÉZWÑ£\ºŠ'ú 5)!J‚ŽëÊ6£lôvè³C9g.@?„€“t»6‚ÐóäcÊJ0J%ú¬ÂHÑÑ\t$ÓÛf, Å2Œ© çÒªÌfNœeøçÍt›&EM(•aèeçÑZaW›=½™ãõݶ»|[U±Pа—ÂEôá’Î’Z=É˶õ³Ú_‘J…‡!L}âÜ´&vA6¡üväw¢*• 1µóõñŸJZ‘Z,6î~Œ9l þ\ŠºX$Å x1±6ÿÀÜ%nWBRçݦhÉ1KðÈ1Jàêò<½ #½Ä¡‰·x‘ãÛÆ-%ˆ´ZJXQŠ‚¯ùªî§Ÿé„ˆPúkÍrDq –·øÈU+š«V41\¾×T§Unqc¤L £EÑðE‘“ÍÞ.õ‚6úÔÿ¶„{‚ÞÞÑnçYLô<»Q)C¨„!T Âʬò©‹<*ý#5:§Òà6Kür ¡R†P)C¨„Ôó-1{÷?G_Ü¡•ÄwY” íB_Íä´šJ#Öô!ºÕ<+u¶ÿE#?sˆKE1K;¹îDRÅšFJNôÐ[rü³cf¸£O* Ʊ˜ÙÂuÓÑuYbÍš"Æ OQѤ£›t6¤||3Àýv®ºŠ@ÿ!’0”1÷Âsª|1‘Ÿ8 ë¡+t•drÆ`‘©µçîõå?a~g5?ͱúC«LÉ%(‹:$€3í‡dõQl‡¸x ‰æ)\Ρ[£ÝwËoÜYêuO‹¤j -ÈÔZè*“ÕWáÃGT ; RÎH¥¦„¥Õu+1u¼,Ÿ=h›y¶!—‰1÷AbøZ\îÀéb?E4©u±HŠpXN°›z–—ß¿òœ¶$w°@„1X$BE–8{õ}Ï|¶¶È·ÿB•]º2gΖS½Ú{UÆ•Ó(†„Wk\Bt--üù¨kV9|K2ÐV)\ å=•s jc¿ÓÇí ýÇ0#J‚.FHŠj2¢×1ã©<‡þ)ý±œ§åx~´þäúÄ4úÙž`Øoýä·è§›¼æÃÌi_Ìæ/ÿçV „ùƒòÞ^çi¼ ú‹€|¾©<¡äOÙ_ üÞ>_6ãùößå>B‘2—¬çJ ‹ÚÍ:ÿ^¶˜£¯¿(eG…È/-ËåýûðéIå’K˜¤yÕÖ·lòŽ?êz÷5©·õé>çÌNܤ™´\½‰½]½8ÂkïÁ®64• ;ðgmA¨\ñ¦›œ¶,虉0KÞÅŠtMËV&sÑnçÈ›–’y‡×*…_°ƒ¤tçÈJÎ~v‚n¯$«Š ©HÜ@oJ†ª)©Ð $œ8g–!L‘è*3%p~C69Þ\ÈZEñ{mÑUúŒ¦Í#H D éÆ)Õ’ )ªU”;Ýpr“/˜^Ùd\7ù’q»‚eú¼:Xýkïâ…ÔŽç8­;žrÜŒl¹I*ø›Žº”=ïv}âŠ]ô(Ǻ¤Æ->Ò…9;LNÅ.Õ7WÙ›ÙÜN…b“‘X€A›œQ…â¨EÌÌá÷>WØ‘Š/ÍâS@ÑpU…È‘Ÿ(‡ÌÉ"­º9¢àµHŽ"{ŽÈ½afß oøBÍЩϪ'ƒÀÀ¢’/JyÑŠŽÈëõqªèÐ=ŠÕÆXáI¨¼ºg8¯]}ºñzµË~1Ÿ&‚°)SŠ;*…‚n‰5w?´ÿÉ@…¾SÅëÓ¬P®ÕRb*4@"«ÐM2ýÅË ´B ­–’©Ð,‰¨BúD©£SÒbìµ¥ÖЂ}\ÌР+­Õñ„ò;d•Iº¾ý9~[Ð]S«k!¨]j˜D­Y«°eÕÆ„¼m¶Nؘ’k(mß ºeUTu¯[FiáÕêÂíIBúô«:Hdä\Fº‰ê·M·°h­„²[1 Šyq¡ ã;¥ÉBžÛµ¨‹"¿”ž‰Ïl]²_—‹y«˜€—g¦‘$9~òœlîÉØF8 õs: ù©ë§PR³ pÀbÚ¯ÓÅÕUA"^±]ƃêV)Rk~0Œ¤@Päµ \Q•E‘å •vÚ“©Ø¹mÏH™xŒÎävõ#„@í°b1.:æZ,GR š=ÌZm ˜sÂ-|où5$Ô°Ÿê®",Aa ö¸éˆb/UÅ ‚Itø¸•Çk½Ía4Í¢8™w Ê0YŒ£˜‡BUQHŽTt˺*½ZÇqºmþ¸C‡ YÂRȓV®2XuÓQ‹E  `ôOÙRñÏN"œë •Dz>{µt½hŒ„õtiü8ðÂ'媀"_UôPd¯€2!r˜Kûççߎ¥ÂçI½C\_7ñ:V—EÛìɱ§Ö¢rÝÜi¡<*{,fÀ.“P VKUŸ/ ²Â²²ÖäSsÜÙt gô‘ÓìÁ·³ŸÛF:\.43`óß-ïìCóî'C_4æà!ìC®Þ ‚@^`¥<4n~ÞÛo:dÖƒ–Äãö8ͽ•š ^&ÐçÇlØL"Dµ¢ ËôÝêM(@Ì€,-³T$šeJœØûÏ8Œö¹þîíÔ¯‚ÃÝÒÏ÷ãRƒ?DWöï[•„sgitÇiüÔiÔÂ×!a´ ò·îûA¿ÉŸo°ËÉ_<Ûs¿Þþ0¿Žòá7Mñ^å‚%›ãBdÃ¥Aðù‡k”ç»+6èÝC&|S…Èbú»øšøEoV|{ÓcÆMeì1'bÒ1Nì5CœJ¹£ Þ*«ÚÃiöq©³ûö;n:!*¶¨û˜>1ê³nÄ$dõÜ™öl0"¢eDÑȬ5+6¡É ± MÇE6š¶<·fü.Dd“f^I͵g±ÞºˆÁ1w£j²y'¶©ÐSû¢r«ÊXDcIU}cKCÅÑßBãp¸I Sm)wé~îãF—ᇗ¦lrCj)FÜPêýÇÏÐ\b²¢äíOà%û|ÃÀöÌ›%U˜!îófˆ.2+̨Ç,z=À2£hgO³C2c·ÿ¢­òÁ¤Ý‡ÔÓ>²7 > xWZiÂ Žº›u73õ¶ ’¡×S¾MwäGÍŽÂí®È“…¹Ùõø>œAd[2®4g“ñ¼ù²â¿r‡c´};Jô]ì¿­F̹ßFœr‡ûäë ÞG–‘ì•Yä+¬bøÐu‘mÉ8÷Ò9+£,{îó”Y‘Ù|YñÂ@ÆŽ};zgÙaX­Þ„˜ðF`‡ØÅ®€ú¸Ÿ~VÈ7iSçs_Ãêõˆ»éFó$.« ‡GWì{9 ì}äš¾­5FŒ;#tÛgxrŸ,f›Ëß–%훊,* XÓ:ÂùÃe%ÇÄ„Hª9Dˆ¢‰áÓÆó,u³ ò\lÖ^Ú¨ÐhK÷U6½§wK‹ÞpCúZyHŒÓA²WrÒegñkJ†»“,w/5äfë»™çÈRS1䆘ÎÖÁ;Ù˜æÝî>^$¯é0#ÔpÚç=á™V½ÈŽ};zgÙᎧ®#þp”˜ò‡eG—?J£Ïÿœz9 1ŠÃ0„«®Gølš?EÁ.{ˆ¬ Ô –™Šøînë9bt[Ï•¹õƒcAóû$é|t2‰ƒ¦ö ‹i 3„ݳDf¤ÒëJɽõºÉô/½T“š×Mˆí|õÐ<o–|anÜ€mH+¶åk[>J ]Ž“Æóÿ>noúïsÑÿþ;½zï=¹îú³½³9ãr88ˆöñ?Þ*ÂÚ£Pw>zKâ#ßí—J‡$Æ¡äsf”Yo7±±åߊ"ß‹\-©IaHp‡°*ƺP¥œé§ˆ2F±Üä|ä0E°EJQh#¸ûƒÌº[è‰`åâ,fÆ¿Ý/^ƾðUû—Ä“p§zÍ ¥ÛÊ̾:Z î =·è÷pþŽ¿â¨-´Fæ3Ì ÞÀ1‰7»>æð!¾øpÛÞä£Eß=ãwñ›S[/äÉ+ŽCë’¢-ShÆÚ1…V$¼ž  ¼£ù&@£ Bª¯dÌq¥aÙªÈà!{á Ü¿à§à~8w<Œ4IJ Þ  »{¯Ž¢Ãzü•Wè£L”*º ØRÁgžV•!ë#O¦`]ÄõìBù’^Ѳ'Z "9 â:b°]—Û|¿õÛQé±L*B?¬“^K¬¶Š@$µ·Xîpé Á§\8¹·H¯®¡^U Œ^±]Ï…‹’¤ÓR¡DFŸWG§>¯ŽN}V"G¤¡ °HÙ-@7‚ ÁÐrÉž0±¡ @ }ôX}ôb}µf[G¨7Ž„ˆ ôÊE—vI]Ú%eÈ´+}á‰U„¤Ô4ô“«OErÕŠ&†Ëšåò¹né-9-GôE[E q.Æw¡kˆœÄ³k45$ S”§v§»¿•³p1æà!ÞY*oÜ/·Œù‰{ðìD1½”SÉ1KPû\ uÏ6®Í->ã÷ëQ•J…¨Co©Ûf½Âbô·’×Dtƒò5ÄãŠgIo9Bþ9Ù”TÎw}³lzÁùúÎ#MºâürçUð—›–¬f–°ï”$ºØ} 䢤|3¯J‰Á_îº rYd‰‹YLˆPt]+è±i;^¸ÙB¾’–a‘S6E›a«J0z$‘uhùM¹ÐK÷]–¡&”Ê Ï¥èÆ·ösÆ©_‡÷QŠeèžGñÿ¶''sœÛ5ß–b÷[î¦d¬cßæ„ß²8Q• …肞Šdö!fúe° žÈ©ãP"Ä|ru™—6âËÅF¥Œõwv6’¢.–Iѻܤ¦sº¯pi…vž‘WÉ1K M…½ãåz>ÀÂOúîŠDZ %t–"œ¿WˆŠà×+«ËXÞ»Õ–4!W­hb¸|«iÓÌ'-DO½+s.ݧÔSò›ÑFŸzA}êý¶ð÷O4H¶¯0؃Ø!}êwvþð•ß’`D%dv…°JŸm Ç ™ÂÐÔh+ ©A;„×Ü}§1a)̧¢=-2QkhA¦V×BY«Éá…‡/^&2ÒÝTjé@¢ÔÔAÍþËêÚ“&)Y£!—ˆ!‚§V^î(Æò¶çg#šT,’bœ>ž÷¯{>gÈ#a ‰ø,¤Ó ÈÚ¸Šes•)n‡J 껈Š*S¦ÊiC«/¥ïõùʱŸQ[H/€QI*b*îÚo0‚Y$,ú¬ÿ]ý…ð3ž§Ñªý%„û9íý³=QßÞòŸnX®læò“ÿs+¢[VÑ=®÷럜µ(ùÅÂÜUóÙÀˆ@ÿq¯lø ¬5eÝÚ‡uPL`-ÔÕdóHóÌ+ÿ›y>&vlöñkž¾ü¿²GtNaúÆÿ›¼)Ceß>\ºöuÕK‰øÒ %*¥H)!®ycÎŒ(«í³>«,f€GY²ËÈ®ßé…j1‹ƒª¬$#in†¥UÞOØ“òšEô²,+•\Œ‹S.Ùo•‘ó2d›…T«ü}¿}˜e¦I_21‚ü.kvØï—[Ãß³.j4  w\·GOÖ7snì;"0›üãò`Tî œ· ž/Š+¢—)ØbY5õ¨‰¹xC3D¤Ù¶x¿êjˆ™€ïv+ç»KŸWGQ?®«’½ÌŽƒ†jña27ûeðYÀP¾ßT}êm$ö—é2÷!¶ | ïogßuà·¿Ïâ§YSÔÇ%I”’"ÄšÆXNÖLzä¡<÷o+BEf†&æ'[XàÃÕàù^ l¸;½-îköv$!1eti{åKE2DÂÅìüЬ±"|GYB¤-·µâ´‘ð• ÀêCðù©‹XÌ5v½É°‘ýë*øÌ…z>ív=¸R}°)ìÚ+z Šlå’HÙïªüÁoÎøä¶µÐ.Üôz;Éþ¤kojÚszl•‡ åúï¤[¼—<¸dÃÉ•955K…`u¼2ÚOH•*ˆ,Šã4ÀÄØïåk(çCÌ>ÈÖ@–/r[Û–Õ½WåNFOèo~Ï{ø0¿eÁÖä=¥H×0dXÃKwœ ‰icd>ë¶Ãy Ìû” Œž >Û+`¸("Ä×l ÜÍã—?ßaû> í'%› À¤(ÑEHqµ?élf³ß.Gˆ"Ò½M6š(kêÙy©¬Ê·+Ü…!T6ªöMÇ¡™¥ú¼:jú×.ãÕ¸üˆ‚ήO\œÍvÓ7»r»Þ{”‹ºH•i%ŠŒÊf+pUàVÂrŽä…­Bòw»ìÓàÈ…*}üþ_Z+3bOšFT-ûæ F¢ÁPD4ªEUÉ‘Ážš%oH´ýŸ 8ÚˆBÍÖ$hPÒh}m¶šý á=ÜèW䥗¨C¤_l-únž©‘y«º!Y½6ŠŽÞ2U”uKµˆ”LÐ[ƒ3œÚÈêžL¯¦†‚Õç'?A\68·ä–Ø‘(¡¡Å›z3'½…®ýÖ/Öai•®½N"qéíC7úy4cÃMâäW”PÒºö*Il(XKõ&ËêDÇPÉðZ©1Z×äàZn}ðþøFzQâÉ@øNÌÈÔêZàÕ.U§IŒEjí¾‘ø®OÜ’Û&h°ÁOÖ ´“írݲ*\êËzá wãùĘÄñXVÉ$òfAºDõëýí“Ä÷Z«Ó܇!̆e¹˜P$qN÷DôCâ1óÑ…D9¯Ý¡^64Ñjc*m\°˜“.¢] ÁaáPjÛY ×O¦¾Ú»‰ˆ´‹ù±q‘aθF+IVj¢3 ˆa$µ¾æ?:Ó†©üóÛš²g´L ˜Rã0 Œph¯½] ¾^تնkѦÞna:‰øMœ†YCE'¦ÂÐOsÙCiÁ0õ2¡h\®ËmQ¬fw’BïÐæ(Ô»±ý²·úõçóóƒAdÄi²p}2ç¶ÞVÈóc¢&ìæóÁêÂl|=ÒKcÓ]ÎÑÀ¥lŠhÔÒ¬C‚Amã~‘(ôY'OúK8ëoŽp-»_Ÿxî4Ÿ‹Jµô»WBÖÇ .PÃê\ê­QˆÄ^ñ:ŠID×WÍë±{‹@ÏÚÖ$Iæ²Ó„©1ɦBˆËÈeýœˆI‡8Q4T)¹Uàξ›‘ß÷Z£ìLMíkîSfš¹Ô„é+5Iˆ8^à #JFv1"jŽQ›ÐÛÔá‡+ycLS|¢}.PÃ+¤.¯kžâ-b0ÌýÄ™Ü †{cLQÁ9ú±#îÒ°GqwM1‚ü†´î‡“3Ü(÷q£Ëð78rõîdCÍTñø ã#~ïÙÖ'ioÝ£K u738êNf´Vï&Ĩ5ª·™°¹t—3<¢í{¡Ê~´£í<²‡¶‹‡ý¬¯\©S»˜ÁQw2Cn´aÞ6† ݰd*ýò%}**r;ÓÖB$¡¹ëéþÒ`k22G WŸÎR]²£DßÃŽnã9vøs[ÇܿʨÁ!3¼ô¥òæú»•Þi^Âd©_É!;]OÆ‚(–»[ð6³ê°£DßÅŽ};Æok‹}Þ(4DãGº&Ê]‡[ý°‰ì·¨æüxj=âλ¹|ß‹jûŽ—Vdä(°÷‘£Ïtß_Ȉk_³Ì£Zcýü½ß3òÑ ×E³‚!‚¾]®çڟ϶„¹ÖãØ²9tQoù?o¥_€úqû˜æ†°¯{%™A/£ÔÔD©¡ƒírêÚuzdzåPtÔýtœìŸ(‰ïÝ]*@§­‚ºŽ¨R5í“F—s=Ÿv¿ÌW´øƒ–‚HŽ‚‚¼ušcë'×òjS._ñ¡"ŠHúé¹÷áñ,Dî/wÞ|?ÌÑakÀ-‘bœÑ×å]?uFîÑQÝçÌïjCl(^ÐuÅ^‘ŸŒl䀸 N|ù“üæ3ȵ¤gê«$‰í7¯ø%?Õéþp'ãzÒßî|Èšzu5õˆZÞ[.Š==«¾2ÇóCA™::õ9utêóÂS¡ôÐ:ÈŸÐàèF¬ÌÙH¸¦2Ûö`=)sî!9€ÓG/ ÕW«ß6O+u$ÌûPÞÈj—”Ñ¥”ó‡Âu~‡ÿN3ãÒÃðþ™ÃiB®ZÑD[5{ÜïwÒ1Aζ/Gþ|·Ûùè'ÉP™qk8~γf hj4òqÂývé¶â§­²çò®ƒ£!—‰‘;ÊtÀ¿[y†—ë!‘-‘^±Éæáôñ!ÜZÅ3»ÞDˆªT*„à±v|‡«:`ÿ–¢¾V_K.AYÔ’„Ù,¢²õZÃrþ„ è² °WÎ7[¥g‹ôóáë|ÒA’ôtÉUð—ù«¥¢tvûgp¶ÓDx×`.«ãvöf`züeþjµ:>>VJ ½VP­žÛÄl¹Ú$e%I²rí-ɰ< aeQ]JÙæðø}·dèžK6º½Î,)­? |2z€ç‘6ÁuØÜ”¹¾KWrþÖ¥èŸ.‚<5Å'XfËú‘ !‡ž&2d„›f&ºqÞj©èù¼ÒõsÛ™àR„»aDrÝ™X&Eì’9˜^áV=ºî¢‚HŽ–B0å|^VÑŸ6sÁÁÝðñ~—µJi%JÎ<=Îr£•p J/‚,Gt0kyï~\RÒ„\µ¢ ^•õ(=™¤ÌA¢E…8[â²zA}ê [ø«QѹšEÑóEÏ=ØJAB¥ °(—..~DûØT´“ú1è]ƒ0„JA¡žu¨ì1K6A%§:åtÐç'Apt#$ˆ¸½ì+ÆlÒrWŒN‡uóŠU=H+zˆïÿZ6 T´q1CˆëÎ!Ö,+B¤IWéxƼVõöveÙœŠ@=$Þ$3vÔÁ™tÓì×iîm,'“‹P’¥Åž»§ÊÂýÎŒ=ÍNäCïDŽìÉ%(‹Ê’¤D:HéóaÛ¯J²¾70LAÍWõ‘ɆÙ,=«™ZC ‘Zâ²ÅîXÞñùù”¥†êJŒi\Ö{9¹LŒ¢<5£–øu±PŠTœ˜ ÉqŠL(BZ¬(¯}z5e®6³=ŠùîéîÝã` ‘}~ Lkôæ¶“ÊÞ² R¶§©Z»‘ési I0Œl³ÄÈv6ú¤$¹çŸµá$s2š çïZÎr—üY¢´¿·×Ï®¶b6sDùå/&9›Vþв˜ƒIcîÒÉ_•ìå.¼Ñ0}¼Ö.äŠG–5þRg-k|œ+~yÛ³êÕ4ñ÷¶K²ÃöcÕŸ mpÆðþ´µ—´z¬^éRª‘ÿÝ+>‹áÕÄïT³œè$ç{„hd.3¯")ÃHª€ad›¥·š(!å‰Ý•yJ’Lïnþ§ÄiÝÕés5EAÕ™Õ]™±q¸À1Iò£¨ÔÃQ²ó#ºÓ§sŒèÀ—ÑëHæ *ÕÏç^PçK™LçÕ&’‹›Ïæ^ñ­3˜ÌÝÔH ä+üû¹ÜpÖŒ,•{“¢`›„ýW2¹·I“þã‰Ü+j zÞÎý¿+{=¢zŒ&sGwîwNݹßó¼ôº¢ì•LíËþž(¢¢¹¼šÜ‰ßY’lï¦Xi*v›·]Ú%eôgÏÒ¾›VÎßnõÑ øÕŒò.!¯® f¸oaïc7,Fa – g·Ý¼7;æ¸'ßÞ‡Ðq˜Þ^tZüßÍ?L>A¼÷š(‘;D‰×[‰ÜQÎ4/æƒ,s}ƒ/IæúÒþ7”‹Õ4ñR2HrÎ7Éð’'°/“¡+q<}G“äÉ×ËùÞ1K°9¯L¸˜‘íüñÆCIÜ[éß)ÃH Ä0Ò×× 5æÒÀ¯OЖ.}VúI»™|ñ˜ÎïËJ•‹ºh({ÛU-4FÒ¾gt#rˆÎúHò½—s¸w#dõ¡a}YÞÛIÞ1›H>©‡·O9»»8<†’ÇÇê(èËêáv8ýB ø¸§4t‹ªÙÝHèŽáÄïÅt牞ÈÌÛ;¥#Ý{¡‰û2Ç3æA˜ä½®„ž|ñE%¶•…IÛƒfó¿»sü™c^#Ÿ;ÆÒ¾GZèIûžšØJ¼Þ™Å]ÉÞy­´•ÿGs·Ëu×Ú³Á˜ÈØTÑ“±½¨Š\—éµ­ êOºè‡äð0t]ë™Ò #úS¬3¤1 Œp膺’„ìèÊŽ^H«Ža$b§RòȨÂ]IØQO¦.KÂŽ©´ï0®k– ­ç¢ ê˜É×îQÍ×Õ“éÖ•[›J·®1%ÿ2c3®3‰×ÙèO³îè‡04 ¡º{)„ ü¯®ôêI¦tŒ¥WO0ePTa¬›$Ùz_jó8-:fÀ‹ðVÐ*àØOíDb•$~» 79:’¡s¡cnИƒ[¿Aš1#Í1%.G5s¹4÷9æ)\å)ŠÅìßRT: ú²ª•£šs\˜ïÔå2üü >"÷¡½ÐA!J¦þß–à¼Ì&çy7Êáë\‹Ù±!NEÖJ¡î³ßMåHÿ¬Ñg²ñ¼ë˜Í‘N’« s¢]ùÅ^¬<›ÑhJrt’5ãÉÑ #Æ“£39¸çÒ­CRí&#„­Po dEÏÂ@Vôœ?¿‘n?¿nã¾ ÄÐG§÷}¸…ô`ó9Ås¥ÉÐ+ܘM´®ù0›h]Ñ=BNIzîÑ1TgïCùÄÝ Aô&3FÓ«Gù™‡Ó«Sf ¦W™ÁQw¶ê*a‚r43K”c(§xÊŒ_È×þÌ|çóµ?£KF›¼ˆ¢VB5º4å9&’’{vÌ$%÷ì˜Í×~“XŸãùÚí6®ãÍ<2o5H_Xµ\áèNEÎe"Gw*r޵<êbvŒdiOÙ1”¥²¯Ê†E†4áø… ç+í-ÃÎÍ2ál†s“Ko$9%ÿ'2¿«Á!&›ƒ0žØ<|4›Hl¾Ò:Ó™Ò!ªsB˜5:×øÄà“‰¼³œÊ©Ò1”Ï<¥†Üì 5&<Z Ÿ¡•Ÿ${4&3›]ù§1/³ã’¤;çÎ%Iÿ C¦\O¯†§¾d/o¦æ†${y³ ÌgH_Ìøi2Cú3–›Ï¾ì6WoEÒÖD÷ò+—õÔå²ÌåçB/b ±zN†Äê9!bóT’·\˜¶Å4æ9ËQNZÞ‘³å¤å9Ë1n)‹þ¨g,ïNX&cyžq f5u)-Ï®…®<å(å-ïÉSŽvÚpAÖpÌ&8×8 ¿n‹²j‡ÇÓxªÍ-,ûL&ÇdnrƒÄdnrƒDmå"ox¨æ"g_hË'Ç<ÅaŸÛsúaé(J¹ÇÇr™ÆÉº¹ºÑÌø-Iøß yÎÇÌ“üE 1¾I5Ž$×øXªqs}÷¤ Ç$^Ã1„ÿ7µøpjñr*qÆYèO%ÎdãÆd2o?¼[4æàìÞämîÅŽö¦ñN³xcIFR òÏp¦pä]l S8fŒï.*ëL‚ñ+¤âõ°¾Ìàìsÿ0/÷~‡ó{£Q6ún’¡Ý7—<âìÙµÜøŽÍnüžã0kŒ-Žv¢SÔsç Sf£œu»#é6¦VC2ǰú³‰¾QH–Ý—j³yÂݵùDßhÁEÃhbïÿéÝÅâPÇ ûd‰¼ë‰¶1•˜Ûªc:OxHRü™Ë^މ¤ÜAƒ¹½ã–CW%Ji¶Ñ“‡» GKaâFìM°Ñ¼Ü‘÷JnHópפ(‰ÿô¤ÝF1ï¶<½6êQšmDy¶GÓl£37«ñ<fÓjÛ¤›“iµÿ~Y:Ójÿá²h£;öï¥ÅNÔÑÒeÍÆHì €©ÌÜ€¢'K6Æ’XGúø…´Úv[òšT¢;+6zsh³ÊèÍ¡”IlŒfÁŽ41š›j‚We²^WRZCžõz€äOO’kŒæ°ŽÀiô&µF_Öê‚^>’Ä:œ›˜IbmåèKZ]bšå¨†(ßtCVÔ—“%•®Ôøô䠦ɃC*iŒåœ¶Ç`¢¼ÏÍ´Ñ«ˆ.s¹Ž%)¥;rPWRH£;S4#€•ô§Œô EAœ"z }ôŸ¾ŒÐHÊž,Ô‡<ÇsIŠpœ6“ÏýÓ›mhœ~”ÍãŒÞ,Ϭ±”MíÜÎÝŒÙÄÏÇo扔Í&uçÏ<Œ‘4͉&2>%¬qç_Í·Ü™ÄÕföfŒ%XN´1–ì¹aËPÚf´s)·0c4ÙsB %Î×LÖ9‡ó5ß&TÆd¾f³¸ØB5«ôlåP¢f Àh¢æ€¢œ¡™Ë§Œî ÍŒz34³™™ÿs —[”ðšÅœÌ¿pY@’%cþ…„ËXž„µ„ÌâìËæX.K¾ox’Dx0g2䉙K ‰£ù–!MË\ÕB¢Öhù'ކ-726·2,ŒgX&bÄrQjå\ŠÔÊ©Ô÷•ÞäȱRX5—2S,ïG–æøg$_2Ÿo™šÜ™=̵þ´ÉàTº³c QrŽ@?„µ¥ H†ÜN‚ ›þøÖYªtžãÚOX7KjëÒ×òR‘ãP"Ä8ôßÚü[›kóomþõùNËŽ£$5 ›‡ ¯þUP>‚=ÑШÃå¿Ãœßé¤(M>|›«ßbÎ%½dë¾Gk)ðH)ô|ÒTq%’#ç´(×á sN Ëç;¶…„ó&2‹ÛIai½çcJìAt“jÚHø8Eù¯ªÎ¼¨Ôƒ—qÍ™§ ¦S`drOí³û@&Ô¦Dß}'·½Ëžk"¦œ~TK®†Îø`5 EÖHy‹áVï™ò_‘áéÖŠÂíG¬UÉ•ø6$÷‡ÿw|'wäMLy*=U{²¾ëÿá±ë¹¾ìOÿÿ¯ˆÝÀõ golly-3.3-src/Patterns/Self-Rep/Codd/construction-arm-demo.rle0000644000175000017500000000251713151213347021243 00000000000000#CXRLE Pos=-284,-2 # # Construction arm demo # # In this demo, a construction arm moves into position and writes a cell # before retracting back to its starting position. Hit 'm8' to see the # target area more closely, and set the demo running at a slow speed. # # Three 'advance' signals (76) arrive first, moving the construction arm # forwards three cells. The next signal (4456) turns the construction # arm left. It then advances three more cells before turning right (5546) # and advancing three more cells. A 'mark' signal is sent (764576) to # write a cell (state 1) and the construction arm then retracts. The # correct sequence of retract (4566), retract-left (5666) and # retract-right (4666) is needed to retrace the path of the arm. # # By scanning across an empty area, the construction arm can write any # pattern of cells in state 1. The pattern can then be sheathed and # triggered, to bring it to life. See sheathing-demo.rle and # golly-constructor.rle.gz for examples. # x = 289, y = 3, rule = Codd 288B$A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.F2A.E 2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.F2A.D2A.F 2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.G2A.E2A.D2A.F2A.G 2A.FA.G2A.FA.G2A.FA.G2A.FA.D2A.E2A.E2A.F2A.G2A.FA.G2A.FA.GA.FA.EA.DA. DA.FA.GA.FA.GA.FA.GAB$288B! golly-3.3-src/Patterns/Self-Rep/Codd/gates-demo.rle0000644000175000017500000000172413151213347017036 00000000000000# Gates in Codd's CA # # Signals can be stopped by the use of cells in state 3 embedded in # the sheath to the right of a signal (relative to its direction of # travel). A gate to the signal's left allows the signal through. # # The wire below shows two gate cells on either side of the same point # on a wire. This configuration has the effect of transforming signals # into 7-0, whatever their initial state. See coders-demo.rle for coders # that work the other way round. # # Gates can be constructed by injection of a 7-0 signal into the side # of the wire to be gated. In the pattern at the bottom, a 7-0 signal is # diverted to gate the wire. Only one 7-0 signal ever makes it to the # dead end, the others are blocked. # x = 50, y = 27, rule = Codd 25BC24B$BA.D2A.E2A.F2A.G33AB$36BC13B4$30BC19B$BA.D2A.E2A.F2A.G33AB$ 30BC19B6$7.17B$6.B17AB$6.BA15BAB$6.BGB13.BAB$6.B.B13.BAB$6.BA15BA20B$ 6.B36AB$7.26BA10B$28.B3.BAB$27.BAB2.BAB$27.BA4BAB$27.B6AB$28.6B! golly-3.3-src/Patterns/Self-Rep/Codd/sensing-demo.rle0000644000175000017500000000134713151213347017402 00000000000000# Sensing demo - Codd's CA # # Two wires are shown, one with a state 1 cell just beyond the end, the # other without. Using the 'sense' command 70-70, the wire can detect which # case it is without disturbing the cell. # # The sense command first exposes the end of the wire, then generates one of # two 'echo signals' based on the state detected - '60' for a 0 cell, '70' for # a 1 cell. # # In our examples, these signals are then removed with the gate (state 3). # # The end of the wire is then repaired using the sequence '40-60'. # # See echo-discriminator.rle for an example that shows how these echo signals # can be used. # x = 41, y = 8, rule = Codd 29BC9B$A.F2A.D24A.G2A.G2AB$39B3$29BC9B$A.F2A.D24A.G2A.G2ABA$39B! golly-3.3-src/Patterns/Self-Rep/Codd/Goucher-replicator.mc.gz0000644000175000017500000036750613151213347021020 00000000000000‹HDòIGoucher-replicator.mctý[¯&É‘%Š½ç¯Ø€ Ì Ài„»›ßôÖ˜3:jaNë`Îzô,&ÉR+©ªb÷ô¿—¯enn汩F3*w|qñð‹¹]–-ûýoùÿýñÿôý§Ÿþý#ÿÃóŸ¾üŸþËÇùþ—¿þôí·o¿~ûéÿù—oýéǾþöãÏúøË×þüãÏß>~üy]ô‡?ü‡_?~øöÓOûéë/_ÿöÛ÷¿|ýíûÏë úÿÿË·_üÓÏßþðñõç?|üþo?þônÌÏ3?~ÿïÿø‡¯ùøßÿáãýþ·þüí—ÿø_¾þôÿÿåëÏÿÉŸð?¯;~üíǯ?}àQë?ß~þíÛ/¿~üöçoÖ˜ß}üö·_~Fë~üíãûÏÿðñ?þü ÷Z[øåÛ×ß¾ýúñ'¿^÷~üøëÇ/ûwÿîãßþüãÆ_ø ×ýþûoþøÃßÿ€Ûøü#Þý¿~üáÛ¿þøÃ·ß¾üðýçýö˺þçÇ­»•?þ¼~úúÑÿó³Ïü§Ø_´÷ñÇùõ·ßñ™ß^ýþ›ŸûáßøéÛÇ÷?~üöõ¯ß>N׳W×SÿõûOÿºZóv§üøëjøàý¸~ Õ×? #þ¼þ‹~X_·þÿ+îýý×_üáãû_¿ýÂÇéÇ~üòý7ö žðÿýÛß~ýaõ/oÇ·ýõûúÜü‡ïÿöó¿}ýå¿þøõø‘ÏX—|ûŸýŽFð ÿöã/ßì;ÿûnеm} †é×o?þ†ÑþúÑNç|üøG^÷ûù¶Õäïüãï>¾ÿrua¸Š—üì_¸N³ƒ~ùöÃ÷?ýüã¯kÊý^»õ‡ùáo?þöË¿£±8ñÓ·?þ†þýË¿üüõ/ß~‡Û´/~]}ýž…gþüÇï¿üE{ŠcùÛŸùöíã¯_ùí×ÿ?#ùëX4ø W¡U¿¢/ÿõ‡YÝü·ŸÑ£¸íÛÿüöÃßÖÚBc~þö?ûøïÿõÿ—õ’_ûåo?à…ñù¿®Zwò‰úŽú{TgÇê§uúß~ùñ7Îûßþüõ7í¤Ÿµ ¾ÿõÇÕ!¸%>z}ç/8mEâK¿ýò×5Pëò}óßþºfÌÇŸ¿þôGÜ÷]Gà\×{ÁØ øuÎÏ_Wgÿ° õýçoû¾_üŸñ#å2ýø·¯ÿ®íe¯ÿåO_^òDïáTýÆñýóš{{¶ýôõÇõæßÿí·ÿþ7]>?ûf»ºy­Ðß0|ìê…µ˜¹ê±hѬ_þáãŸ~Ûÿf›qß—üûþo”pß~ýõëŸÖ/?ýø/«ÿ¿ÿ_v—¥ýÿôÏÿô?þéÿÛ?ýÿõã?þðu5‹ø‡%…øë–ßV—RŒ>vË?ÿ?þw>ÂNüßþñ¿ýž°3ÿôÏÿ÷ÿú_þWÄÿñOÿë?ÿãÓ_÷Ïû×úþU޿ʧ_ùóþµÇ_ÏäÒeõÛ/«K÷¸éß¾ÿí'ŒÿÿçÄ õ;ï"]Y÷²üyOÊ5Îø~|ýå/ÿ /âJàšûëß~úuõìßùåÛ¯]›óùëzô/.ùþ¯ßþ²Mœ¦qÎØ¤äì×)¶þZ7,¹sv_ÐëÅÿöç÷;Ð̡߾ýüëÿúí>þ¯X½?ýûïl¬6¨¢”ø¿~?³è_X-ÿ®õýŸ~§‹å—ÿôgŠ«Ï—ýó÷_~û³]‡úu­£õ?}ÿùO§?bŠ®ýã÷ßÖ§¯õôýo¿ÿ “‚“h‹Olg#øøë/ß×KÖúÇ?®åz}KÛßÿô·oÿ7ýõ—54¶f}³\àC×2ÿ…kC_жÙÛ~]‚qI†µûíÚËoÖ®=b­ÙýÊŸ¿ýî;Mùþ‹.oÊ·=M~]¢æ_~5‰´:}w%þXßþ´†ú¥qìÝ| †ׯë!.òTÒ­þý¦ÔW®©8YL:-ñ/Àö=E`Mžõ‡N§?.ùÁNøéû÷¿îMå×ß¾ÿUËîþö‡ksÿàF±ºï_¶û¾VLøzLµŸ¿³O¾®óT䨭ÁøåÛ~Ç1b?þim+?S‰ºöSO~Ý*Çùþ—µAývï>~]+{2;ñlškrþ¸ö, Ã5ã—øjÏÇóÜÿûÓ·Ÿ· ð+»ðûéÓµ þiIÚý¦Rõ÷hØ×ßÿD9¾t$ ’ Ù¯¿ÿ¾Äïóùÿ¬“ëëoÿðñÏß°üùÛÚ—’°Ÿ³ºî_¿ýl³Ê¾ {Õ÷_þåw$kÓ\Ê㙺Q‚p/]ï¢\Ý߬Ýôß©æ/iIÙç#ä/™ÿJéKá¿ÖÙó볕õ¯²ÏÕ/•ö¥ò_}ýÚö½ãKçç:7ôÉëðeîŸSú’ö¿ðô¤/JÿÞ Á»’¾,Uü[_—þ­/LxcÒW¦ëKÞšôµ¯MúÞœð%ûãøUûñÞ¬ïÍxoÞÉ÷j°7ÒúWÚ}%¹ä±þÍÿî¿pcÆÛŠöTyôßh|Á£JÞ½UðRžÎvºàØ…?¶=Ï¢urðŸ¹ó ïÁ;­Ílc²Ëëÿ÷ه㸚*‚#þXÿöëzˆèÿ×i{h%}H÷_Zøe®ÿç‹åÑóÁ>·|T¼ ‡u}Mµèq}£Œº~’0Wjݼþewñþ€ŠO¬c€ND~–¦ˆ^3ü›¬­ wxDkæGKm–Ó9>©µ}w ÃŒ´±:û£Mtâšèý£ó³N?´úÑS¹ÎËð¢ý:ùè‚Ïç‘Nç%i¯»Õg飷޿ð½ëø÷ºi|ôÉ÷=§‡rüº‘âëF£lŠèŠæC>†|Œªmë¯õ€¦ï<ŽÎ1é×1NqÆì¿ÐÛ{B={BMû§­ž k.1>æúGÝë»w=r®/Ùúz»µÕÛ:1íùOxÒø˜sIH“´‡`¶õ¾¼ŒÓÞÓtÎo}œ6s=$=²þW×ÿÚþ»òÏ^xøê¶gì…š\3­ou2díýNºL\¶<ötX““½=ûI£á?5¡ÞŽÜO~6©Ò«òî=Âcý1©?¤ Q—ƺa¬¾ëŽ m¡âªî”½ Z±ÝÃ&§õlö%Õô³¸Ð¥t4I8çž"¸.?:yø6¼pâ\Ú[wZ“3?¶š)m±-»V”þÁÀdz  eOÜ\ZÓö¬ojëx×ü‚wÔõ?œYc•ž-—¡Ïé.‡¹ûÁÇô^ý¹zÀ²„gN²Ç=S“ o×@Lá ›˜{LÐcTrBÖKŒå|ºšÝ^°WwœÏ¦ZµçÈã¼Ä­~<º6/‰š3Îj{Ö+Ö3xä[(ë yg?áNöTÌÕ ™Êo^r:SßL)^«ª­Nî58,c Iÿd~cRI¾–I^ª%giÚgç5ÆX®*7l«àh*ÕLêjà̵:}ð?Xá¹àëê%^²í´éô€è–œ¹û\“%5Û l‚ïí;/Q›eøÃöZÚúÆš\Xx$ M¬OÆ›ŸØ3¼SÇeý¥Ëc-ú¼Dt^:WÈ’ŒiºD{^8×v”õÓ64é©Gà„¦çöØe_|AìICmsf Á¼Ähæl[7ôί—5ñÝdïOIÂù˜s¿:Y·3.:È>|ÜÄëÏ6yu¡ôðh¸£Öt°ñ¿Ä©8ÏT´Áô­Ùý/(«Ø:køÎFi7Ñ&m nØ÷¶mòÆ®íǬì}cB)wü¶®Ã§¯­_¼ÎôÒúu˜8¢@Š“t¨•»6N†¡Cz<ºÎnÅü•cAK ƒ”ç *1˜ëƒ/Ëëc±Ëa¦P^«Jªu¦ÞöR^S5/ý-CºÎfúZ²¾ƒ¦V`;v¨è(X§/A^\åIúÆ3¸vnyŠð’îåÁýnvûUùï¼JõH¶¾•Ú±ÏP}Ĉç´wÄD°vaîÈP—ÛVs˳›`"§õ?ìnyísyÍŠ‚æ'SÕ°wTë‘=›¶ CÛS;B0a"Ôg&•onÉÚ)iž%Mº¨Ú\¨2'Xn^ê®3½ìݱ¬m dœYýe"Jg1{W—Íú©±s³/=]ž²l6{'[Ùb½ ×W”µ=ìkÕÍóêb×¥²¤$Ι«fíç­ÂLQé¬÷–Òô?ø•†ð^&ÝÕRÓ‰ –dYB{‰ç‚Û$±9øZºž+aÉ­~°Q+²•$eÛåqºYÓóÞŽTÂ;)¾÷gb"—¥Gc™ó<ìé•äΣÈЙSö‚*kg(¯Ñ¥¢,ÙYÿƒÝ+Gå°þ­ú¿¥R®ÿݽº¬*½œæ£_¿†V¯Ÿ\Z\¦êá)m{phj¯¦4¸u25Ù’p;šµ~ÛJËÙðõ¯‡Ê:7ÎRµ÷ìBNäÖùük=² [°kæ«’,P¸u ‚²&Wé‰;Féyo¯[©)]•‘¼_Šy]1ÆùN_ˆ¥ã†ÕŽŽ'uÕ;ʼ,ÝvTlI¥AÐ £®ÀÌéӧƳg×QÛÛÜR,ÊnÊeh#0‰°ã©tp¬Ž(}PGíÇö4YRYG­‘º Þ‰Hõ{×LGþ©rxYôì¤Y؈‚ÕÕÇY=Ö‡ðQpßœ:#&ÍÏõßÕ¶Ùýí¦ÿ”9/O{¶öÆUæ¥:.ù²_…»!Zä9Z0Ÿ#)PÍ×háÕkÅ<É»§{xØy/ß’Ä\…e˜•ž­Mù¾·•æ½ÐÍUB׋þ¶ÁŒ/áßÂvMª÷‚ý!U3µTLM­9¸%;B‡ˆ¾ÙŒÉÏ~Ä~ÝzÍñ^ê‹Ð°õ2ÌT Ãg¯Yù†käˆPõ+lEq_œU54Q¼D½`Iv|ìvs÷Xj3>sIsYÍÆB•r™!ÛÝÂnZÂýXNj¨^wV²úàöR¨îÿÄ8áÉ:פô³@uõBÁ5øïz@™ðÆ&´gWoÈžO§3tÃÈÑå¥{¥¨…ï ‚L:¾Xªv_t=àÅ"ºÚPä=YÕ¿c[‰¨í$j© Ñ‚ýv;•$5åÌÛ]D£Ë¼ÒðrÖrZz,A©Rk\OµQ$K¥î¸þ»^Zá-ë¯^RÉÈP‘ N®™ºWúúnhu2My{4Ž™D}ÖfÿV x‡¸D,ö9ô³cž /Á_pÈïíòfû´ùóÜ^æ°ws&B˜Ã㼇Óa õAÓÓ+xçúO/æ*ÃhmqšUG¢k jïèüOÓYѼÇõ,}¯T÷Q©ÇY†èúpÕ5.˜õ(yïŒëTçF¡A¸óÈڙòGå’Òƒ´þ˰ߗ¤Ï¥Œùâj‚öü¤Éat><Û£ qt.Äšæ‡.5›ºpb KßæuÔprÍj|ÌzdÑõ2ÍÝ•=j‚­­{gõ~]jnöljó‹ù{ëuÐûêÃQžØ÷êÍšûk²ÖçhÉ©›‹á8Ûñû ¯®ô¢û§Þ£>²ú0î²ärMÇC(Û¥™3iØ‚jŠ!ÙZ}Z×:5jœfOÐըђ²55êv5mçctê=%Æðj~vL gpÿ’6´/hºPk?¦uá-KeÇ 3R>Ì™ÕÖ­ègd•¢¿ÕâÑ+(”,ŸVÏD¨åüµDÁR—@©Å$gpÍ è‹ÿr|ð[‰Éª"´m÷n-X©•ÖF¥Fw ó À;I9Ðbl-umµàâ5%ÊÜ>ó[¿€z™éQ¨˜iœF§sìÏ«¢á:±•§Á„-d«¨Ü¬¢á_š2ªZýZp븖|³ 2#h[8´ Ä&¶^ùTO“üºâgKQ§œ¨µèê3*®ŠFÁ¶<^2Þeâx?kià~ò:MŠÊ¦6B&«+>`-”-NÑ;ƒ›Ü’õµmIZÛ£ÿ ­Êµ_›.?H©‰…ä&ЏÔJ…n•XÛP̬6}âÚs®b¥/ÉT}ìéH*sA¤¬AN{ÞÝŽ¸uÝ‚æ×»uõû’èµÏ&¥ n*(«ÇáR±è¡ .¹(4àÑÚSsÉÓÇrM^ã ႪÆQP^ñßõðѶܥŒÑèÏíc2ÑlâWCN nðÐ?VëÐï“WkìÅ‚&8ÃXTÍ.¾5ÎqVƒF2ð´‰è1þ»š7aKÔ±¾šËT÷,¥gŠbŸ GAQ×ÊhuñúÿÚ.ï[~Ô#¢’º"©ÔmèÜ ‹Í noDçÇŽ¨F]ÿÀ ¥`M“g/Å´‰†Ñ•Q ½„fgÑ€tß»Ñzz[ª~[CÚÖòÖ8@º© ÇÒÝA¯˜uïÈlK`·5ý'†ºiöF´§"w¡=ýWóT¦o¥¿§ ÚÍÆ(´.¸‹}æmm-C}¨C]WÊÒá3lM…еC'"œ˜ôwÏcKl­nÇ ^3ì {€A4hî*¦ ÷aqPr¾ <.±˜%þ~üY;(µÃÝu+ÖÇ7Ö ^Ô–`oÿ]ŸYÔwÔ¶s‰>$^³‘5_,ônB VYªš÷¥ú¾˜ãƒá¬íËipîñrÈÛ¶ÄybÝÑØV¾ÎR^Цw˜+¢Q_aÿÈ<E~瑯kìËzs«ÉLLP iËܹÐÖŒjkAµŠË—ãû;7PkµÑÜÓ µÕ”VÛXÿ®Û–FÚñ:j5`)þmIå6Ì3ñX騲 ¾œ´ŸˆáÐ@–ÉïÒ,HµGL²gðšÀ…[g›\XÖ0.×Dh³Ò8Û¡.ÚòœÝIËíiÇcøî@—Îh¾êÛÒË0‰ÏÐÀÖ^ ûK·?Ñd:ƒöëfìú¸y©î=m¬Gµ]|û1÷ì,ÄU-õ5í¨z&)s÷[¢sñËåž-Cß…d5rHÏX}í^=á¿«ºÒ4¦Ô¤íôÛ¡ï¾úªçº?‹n@óóíýr»õh=‰5HÃVó,´Ž-ê÷„½x@—.>ü^ÔC£žÿž›Û’º½`#kë%}-øžqVÂzÜñë¼­-‹çléÈW¬Û—eЈÏh˜æ4ÈI7ž­R¥Do_—öµP°-tÙbm‡sJq9¦±/;´Ð·‹mÒhùñùHüž…Õ8pî0ÁPtjŠ;‚³c2¦>ÑßÜa9`œàÙO¾b¥êrçÊ3÷·¢^ü£Mí{:·ÌŽŠoO<溪 '®ÑiEìÎØ"lÇ(ÔŸg½ Yu‚/ªµ¹ÞÝL5Ø»ë}TB·B²µ„/G 9Ñ$ucö†ÿu‹Q¨ªnb4ÓÆTUkßo¥™zÀfÀ Ç QèTn¬Ä뱨‰ræuWF;†¡"4¬ÓçÞÓ·êvt÷­*ØæÏ'áñêGcߟk3|]>¢ì³Õ$Ú¶kJÃj¦¿¨süð$\}|FÛ6}´ ¡s9XáKÙQÛŸ4¬°ÝÎlÉz<ÆŽ-Ý/tW—øY ÛÏýå@Ô±ŒßÕómc&4NЄÕ@AÔi£„ŠBT4]dÖ´E¾­êlÕ¬åËqµ­¿èÛ›e `%ÂïXŽåÄ!˜C1:æåšÏQevÖ]ÒO™ëÃfCKÚZۤߔ]Òòñ˜}XÐ6òljQo/Ûú»RD}¦¨:3aØ?íà˜ÄTôsf½nI'®¥5¯æ’Rè@4¯G¨Ÿ³@q`ÀO `[ìµ}”¢¹~àëiuÃfG(Ï_­ì´¾4Ìorƒ¶9wLÎú}çyÂ~>µî­¦¡›(Ì!˜ðéᆑ÷+áMÆGᜦzø ÖÝrtü†{‘Q03&ãêÜŽÈXsíAŠ®4Ϋ9†eMÂHT9ñÐ "Ñöo›Õû×*Ÿ;¾Üxͦi¦ ÜëÛ+Z8¦9ÑÖT´i‘sIϹÖïœc¨6fm“›Ž™€M|1)œw Ú„XŠmkuÂM´ƒÎÌÞ¢Ç!¥ÝÙ°Îàc°`6f¦T= ™[ÿ°ŒÐõO*XÝbþÅr¿ u­JGM'v¡†æ7v•‰Aœˆ«ÒGwc£´/'!ÁœPë·¶};P+^õÜÂE½QX€.MOñÒFb]Òƒ¤ªŽ•ôÒàlÏÛT;A‚u*ë™!éÖ{yÀî™x¶~a—±³çÙˆ:4ÿÅ:­ ŠEó,TSx¦ºFª]]˜»–Nê¥~7,ñçd¡šâj ¸j Þ«pcËÓ;°·¶ñFû* ‹a=×?ñ= BGg¿†IœV–ºN rm z>>g+͵oo©êlëŒQ>pKÅ=ùº~çM„´|d$Íq<&:G0›Ó ÂÙªÒåSE2ÜÖ-tŽñfᦆÒïãI·WuD1~ó„¿Ý:YÅ98 Ôô¾‚¾™ }zBiñžÍî¤ÿƒÚ5Ĉ‹’uI>ƒË¶ŒsVÑ4«cøG‰ªp‰B(mT%£ðë)̘äãÙ M\ÿ˜§%†Â"BâKL]É‹5ë÷Œ(úP¼5Ý•šRbøºé²îøƵ;ÿ¬ìé\_‰?ZÄF̶Áˆ©ƒak~ö^¼îÀDÐøÅ…xKä`I°©"ü,«pÝ’_ù þeÚÊú'-…gTû8ÌCŠ?½Q=Äštêo)-·nÜð7ÌseƒY¨¸gš™*!YÓm#fj• ñ¬Ó‚3¸bJ×Oõ#¦Ü˜Õ‹}E» {MÄ{àÒ×`p5Ëàôä/“SÆÌÃñÀ”CœçL醴ìÃê l€ Õ¶Åè­e¾üOâó ÀLËÈãc™ˆLÚ&Ðdâþ‡ r7R¢eüä}4S>Ö\k4?“¯ÃeÍcù²ZеÅQ£0¡G á´ãµB¾i³ƒú ·§^iš¡)ª1!Rž6:'‡½%e“ç‰Nò”ËùRÍjeبs×Ü9‹h&Äå³ñ-ëø…?ðµCŸ:¶§ZL W»ï ¡Í !îËøÐ”Ôõ[¼%ÙEûoáá‹ENáÙ©ÍЭ¾ƒ$äæŠ/â/;5\³¡w@ù½Ø|¹„€fIÈ Nô½'C*Ï|ð ©À¤ÐVÞÁíÏݰ>œ£C ¥gKP?’ø“(/4Ô"@$¨ÈhÉDƒî캹Ïðá\ŸXÜŒp;â¿ÐþzaëmÓò¶ÉkÀÌŸtŸ¿¶ÎB˜šŒ·Õ½ªfÍTuñ%äWž˜{'E¬œjŸ½WÓÞÚ’%ëJji¯ÿÄ-#]Õ™vÌEi+€¾IM!{"õ+}T‘žú}Ø}1ÂYž€€_åÈ{K S9G1ñpK%†¡ g‚—m¸m¤N.¦$3')Ç\ØØ&Þ×ö–Ç…Î`BÈPÈãž5 4AÍBnÉa³b\a»‹RÙâ’^"ë7µ°œ?š¿nX×ÈkpË0(¨>e»-ÃÀî‡+H(»Ç!>`¾1RDÕ¦éºfâ|!úž¾ kL‘ÝgâaA¤Éq¦µýÀAÓI¤eÊ@Ùë†(sÏ^Ä}„FaÔµXŠ$B¹ºáT¹±§(u€(4® à—º5¾`ç“iI”˜^zø·‡ÙA³l…q*ÂÏ2*/Dœ ¶4•9e> 68Þšt­A: Õ:eE|©³¢'RtaX3vÆS8ëÝÒ÷ûÄ_—x¨ûuš78M±ü-Î¯Ž…ij7}“šÏ ÖuÊ̽Ț…?8 ü‰ø•ô…˜¢š×÷ÙŽr«˜&i"tSóçÙÿùÂÛ›þÞwÌ@~4³Ö¬•T; }JKw«nÐMœ²:qùŸ`ÝÐ{èI¬ëw“8e>çJXA4rÜcÌGnt¶¨wiǧIEb6ú~z¢7^ÿ¡ó+oA­ÃF!ê&Í5 «‚¬ÕºÍ´š`~Âå8èNˆ<%dQ'@WÖA¼Å´t’Ê|à阔éHœ2,øa–¿i‰n*gM¿ öZÕæRD¯¶«E±QÄb}GÙf“ì©„)³9•^wþé8uZ=g—ÛF¸6ªºŒ/²·95T‘At‚+6!škŠÈ€Yœ² >Ú=½Ræ´f(£åà$,{SµÈêÓη¼WË<Ž >º©]°þex)€”°+ìñk<ð…h3„Ä\zg¬HÈk±¹qRŠÎitJ×ÁaÇ+e€N¾ÈeÉ*[§;$ÙM„ñö±Ýœ‹[AÛ<Æøqì gEÒfÀ­Ñ¸±Axøú=ååXBr¶N»Á¿N‚—eÁ+2A…ìèÁ¹:mNåqH)TÊMÛáϬ´tŠ“4 9­ë|NŠÁñ4h—)}9ˆ:E Æ›ˆ—ñ*C°ç"x‘2ÑðÓü$È[Œˆ„<1¡J¦*Ü8Î:Ømf- ë“pýCCSM…Dy6{Ѻéä_@Bq@ÍÛ‰{ú0ë»0ì¾³xL\„HéP¶›n–äu¸u`•”ÏþeÃ¥í/¾YÛ7½Æú‡Ç­ôÝ ü‹t-KÜrréät]k§s=X\<Âéø?Ûê¾ç@É–Q+vÕ¹ïÃÄFØ'1]ûËÈpû·2Sö觺û¶Ù÷d> 2M·É©âUa$ùÑ„kåf)'|*ù#B¸¦=|R~¤/Û…‡çp` EÌ+•££m"°ƒ)O€W‘ô{Ñ™0«Î½YõßÄnZ"ùÑûôIØ]ž~ÞÎPD½ÏìÕs“Oé•d¾ýe\s”æ°}ÌHà.5rŠìçTêc=À¿Rp"Õ½]žÈØê–BI®.:êëHëN”¯Xë@}AÀ„ZBp*•jP%Ýö|šT‚C7öDyi²1j\cE@Ä)Rº×Á(ÉvØZG—•h•ág¤&gò>´ú¯ªz(!/A3CVWJ\®ºÚRÃnÛ€4D« ´¬½ªûÅV1†H œ-¢'Þ"!И€¹Lô`hr:ù–Ø!sîè²Íè+=F˜âx è’h™! ´ iòúΠüÃó&:¦]aºa ÿ[E˜ Š«}½{è\ÀÆŒHhŒKC\ yò ‰ê©h(¤Q×ä$*UŒ~¸Ó&nz>,=-šÔ Â_;ʳ‰,Ãe“‡Â_ÒýKÕèƒÓ‡ýË^’˜µ÷PÌN%ý—Ú$£>fÒÔ·(i ùIçá›)IŸ¦~ ¹—G®¦'}Ó&SkÖúýsh \A v‡UJèËæcQˆ8à¦3k†õÅõ­Eñ¡BÐi9‘:~¥ô=7R˜¼‰IuïuIäñ—ín/ÃW´cIÀ'Çé‚Të$bù™ ¦B<9 5}[(³˜ÚH½‰jÓÂt3Gw:î>ĘßÚÖë¶jt5T‚¶QýeÇa‰·” *Az%ãø¦Ê—@°îs%Ù¹­+™¬ž„žD%î>ÁC׳ø1±§xz‚Ùç{¸“.¬Ööãã™õWhçҲݵç$I'‚0Ð9u‚zp€®ƒOGˆFÑ\U]c×]ûì'ïB‹ÛYàœ6J[á2¤Ø¼Å_=é|u\|~^ª½š´ÜrF?¿ó·þš—ý,Èn *´:!+=ÉxμÄ$“aÐzþt~ßÒÓ/¼Â'1¶8d±'øÕ×á4´ßK¯0±|]Ð$ÓïÙ¯Ðq•JÈ*_æï½ÉÓ‚äæ(a©àž ’È»I¢l÷ìÙa#H13w)ðIf/¶ŽØØÆÓ«g,Ø'ć4õT˹wé¥bÛÆs¤ò×Ö¡úÎ¥WèU~¤ý¤ú + C X$æYÊ$ .OÏeÙÜ‹Úp%7UXªUêgY¯Ÿ¸€©jA7Zs¨ãÑM—³Ès'àS㛹dÔNÜŒ3*ý*!æÙZžºàéø3UE1¢—s:g¡þùY„²ñz¤Å›î©L›8qŸ=¾äÖ§ÏñMTõÐ1^®¢ª}5ëä£n>$m¬_ˆ«Êš”ÃË¢Gsn’Ü¡%Ö4ƒF˜jÙ9Êàm»@Ì Ê;C{È“·L˜=Üõ ¼„ý†ª|±LvÿbwÔŒ‡ø§6MÆÃNäï³EM¡'$&Ï&úq¾hþúYÃçêÒ<žJ½SÉHe½¡(këØÉÇ‘£• ¯…ãc»ÙÉ ‚0(´ºýa?&Íioú¬õWÕÿ8e"–¹JŽ֩ħ …3§>çgqœC®»Ó˘r3Ie¹y´Ð{̵ﰃqŒk¡¡[ìää‚T•éB¥äØÜ„¤úuh1dÈaçªG¼dOrRo5Þ1é W.oím^ÏaÎêQá¾è2S˜rïM3Ì[9Wn]:tÒê×Á\¼äÛýŽ'½¬›ç—— rbºŒæ ÅoY/4l-¦Þ*ÛU;(yÜ‘Z7Òq« Ùø ÉôE¨êÙËB¶ê•é°ð•ãÑgÐÌc§4ÈÛkZçØ[ÁØ,†‰€mX†Øt]Wâ;°£TF`‰Å çVù™ˆH¾2hÐñN¹¤wˆê¨ÑRÓ ŠÛãéž.ïhš•Ð%±{8¼ÈÑOHéOHÝO-™1ÉX|L0×HK;Ò\Ìq¢×Û¯L$H6uRÓ@ÿEÓ@‰’JË¢¯:™PÏÎRÞ~$Ó'dÚWD¬[¶[jÛwnN_&G²-á6«ð6:…«fúâýÅRÐx}ÐvHÀ¿B¢@Y ,`ÃtÕ”t ibDïfRDk 2ñ°€ÝãÊV,÷ éqú~Y)á2ÞÇVãwÈtà“9…ð6ñ–xmýâT0qL™€Åø0_4‹>Ÿ-ö‘£x_;6v>2¬óq#¬¦Ø¶¬-–¿Óbäì§Æ®AxÉüX”΃—á"KÖÔ };ì‘¢{ÈAÉ!<šffn+L° ¦÷íjõø8à9Á&Rãþ×§~QUß’éHÐOm“pÔêÐbQÆ“·I9ëÔˆ—R\l² gãÚïä.ެЀRX™ó»:«»Œà^£ß¶ñ¡|•s"U³æ±åQjð Â…Üe (¥l4n¹Ôš‚<²±Û&|L×nÑÖˆ5Øny¬“$³{‘óª)C:¦Ö Õˆv3åã`tqÒq¶kRÌvÎ൤mc£8˜üéüyþYß®YÏ&1îš—âóR'ßà"Ÿå‹çí¨xÕï‡ gp¶)ôzÿèûý <{IÂðy¹H˜q™Á»Êe6MRH¼†rb¾å>³=|†Uk Œ ܸ…+KÄëlûBÏÕE.8¦õmÛÛÞ­0þe݌ڲͤèláýåf H`X‡“÷~€Ô‰ .¬Ôùy†¢ÔR够‹É¦0ýá 6IÑ‹¹mµËè.ÉLÿDr€žÌeugºW¨±wìljT=YaˆàbÒ•t9¢ÜNä³ÐÔ4Ï‹‚OUÇÞCK ôë`¦2…&b‚õ‹¢šNÀÌ|Ej5‚<À]A—ÕØs;E’%ðÀÅóå„‘!ìN*}â4{ô“µÚšA>C\nºÓvF¼-Ó%¥Ÿl-,´€¯g6%Ö?ûG=þ09ζíƒn¡dú ô vÕڌťçZ= Ù 4ø~ùÑÚ†*“NÃsŒOu‘}C‡aÇì,î`U^Ïào–f­wi‹ô *$P$¤.ê" !sË6I}›âbÞÖ‚È9¾îCdžq^¦‹3ÞÉC w¢ lãö"p¾|±Ëîk¸Òñ¬_•,¤0ëXñò‘Rø<ö)ŸÒ¶‚fÔö|…ÆÏa©4›®½ÑÑÉ/JìBåݧ¶|w·c÷©- fº—•nŠü_Ñø`&4?·gÀÜ9`Ǧ)îbÑõšÞ.Ñ9ó÷–ÈåÊïÁ YY„ F %+k ¡€åÏIYI½{¢åY’ºéù0/·a˜­µuÅ)ª€Þ‹/‡-”ÄZŽ…S·²;C©"ÆÐ;Uc>OÇoÐ Ãác†r8'BÖ“:}ðÚÉ´­•s_õð(’È-ÛöŽž–ÀHú4]ƒÃÄò*0ò@S€áÚz«¢`2‰¹U¯Hä0õ¤(ÁN¤$Ifk#Ú—£)JR3ÁSU&4ªmQÂá[Rã×Ñ>° $P ¬Š> ÈêA˜WCÍ;Ð$îqZ}Å*#½ë챉T¸‡“v˜Àl°þÖxês8—É£Êgƒ;gúZzƨŽß“q¨ó_`wóÇ'®[ íÀu@v@6°œ÷`APýo$[Aš²…¤DªaÌvêq€Ó¹õg#ÒÚýõq>rzì°–£sˆ^c²I.6˜h0R? ÷C?{(èø È Ò(Û34£‘€G³ÍïÐvJ|Šm%Àv°QA|hgé ¤)OwÕf[¶íŸ¤> hÒ0¦6M Ç–«Ôœªn‹ìÒ)$žL 5XQ¤Àx° å0ܸÂÓ‡Þ²iŽ^| \þc'ô+¡³Ó.À -šODëa?t÷%p0$)$0¬³åKÀïÖ>뤼hŒX‰>𕛆A•Í:i=Þ¡É, ¹êÊ ÂŒˆJÉzÞ^dî¬36¦4è,ÄÇ cA’´Ú¶ÏŠ{àÚð*6t!à[߬£ôã('›”vêâ4úCïÕq!!‘­Àrƒ?ZY¾S£Œ¦Â׸ßàC{r×— Þù1ôq1à°H jHƒ$¤Ì×õeËL]í=õ³Š‡í„M}’ ìi°&ÖevJÒ/¢MQB ~šÎ¿ImRæ§¼ u0•—hØfÑ×¾â6£„ ²ãU*µÍC§Œ ð˜±Á“®ìÉ¡Â×°U‡ú'Ôpöâ¬v¡¢_¸ìÀ?kØ®Ôÿðu}»ÉþîMÊ•©Øb}ÏÆÌ‚A!Mu>©KΜwõ .Æ}Yù8.8|øÄ0¹;aŸ˜éø Ëî%…gÌcO9„’[.¾ŸPÀIÓIU$áÚ7ïn›-w³:ë¼^p–Ø‚'õ8íIJ@¹° ‡bOfpL„O¸²†+ùoü´“—øø V XÒÌý3é-´Îü;}'IûnÚ¬åÓÙ¤=êÍ‘Ó?àZH [`sØ*tä¦Öm§½¼7Ú+¯è ÓtÝ9ŽV躚Φ2mJÉs>‰¶Ž99|:H²é g<Õm´ö`õé# b# Õ?YÚý1ØþôcD?¹ðßêTâ׳'X¬Ð?}±Ò3ÐŒGÓžŠy-ëTÑ´ó>¦µèW¥LÙqH&¯ÌÚLÒU‚õî®R²‰Éuƒ¦(èµ³!*ˆÄ|¢ÉÅÐ’9“v•WUÀœ »»£°7 jô Mlm³W†îˆÆÓ­šËl–[M·×Üx sÃ8ä0;¥ÉÆw‹±|Àù›à€x=>®ãs7Ã:XžòúçŽæL]ÎÔjæqrn˘çyãy=ß1Ò}ýn?¯ß7ÅöÆß! æðç ®“,üùÙ¾½Ó^m´ÿ=Ù(Þɳ ç}™/õ¿›Î"^Ïr—õ¼Ÿ½í ãHîY‡Žòæ)—ýNÞ§Ïx’v„zØü{&ÚS’ÿ>´¡ö7‚ËÏÞfx=î/rµ©þ oèÚÜ0sòCþ»tØt¦ŽÄ›,éY 'ÆDž{L˜_´Wî™é™ï9Ä#Ì!©>ȃxö‚ö1öôêÓ†•ŒÏÈUÉ ràäªýÙxú¡€Cóé ˺Ÿ°dôз±ßO%í×ø Omú»h?^¿óA¿îð7°‰•a2}'jÎ<»ï™9¬3“½Í• ÷G6BÝÅßÉ'Uÿ›ßo ®±kk¨êb9Wd~O Í.l»Þv*Û¼ØlåŸ=Øœ¸¬°]nþ PœGЮkÛß||j¿— ‚Ä÷ý%ÞŸŸSŽ@¯G°8РЍ¡"Û³ïÇ·ù;cË25ô.ZfvúmçžÜW´ëŠéÝ4ÈRý¼né*xËÌ:+xEÒÉÁ!:ϘÌ0ïêÉûöì fØÃ³ïÉ¢½”Ÿ9®®be°ywUzž#™’K °iê{¾ïÁ“×Ëý»5“¬_» ý ‰†ÐnŸ”×ý—ÎS@ó~ž3î€LÖ¹´wHç”|¨!Sº$#¸2x®ÒÈÆ?^²K˜·è‘ÓÂ!ïÉœAo’SöB%Íe9Ó‚‚Ö’QâÖµ ŸŸžak)½ÝïÃæ3¢ tÈ`ØáiÍzN×ÑDíüÛ[«ÊÈæÍ 0á`¾_b–vÞ©•Jw-çÐ_ñû³•M<ϧK%ì}Þ¿“5ýìµl_x·œ½Ìœ ö>uÓWÞe3Ξý&‘‘ÚÆç“V–¡Ÿ÷£½ ’Òñ¿µº3?ìù¨©Š÷ï|îçóyÞØh`!£YL$d°ÑtÐÎûšÏ{_ã!ÙõWßK­œ÷A‚kƇö5?s"k½ëgI%Æôûñw£nƒ #9µyÆ¥¸Ú D2XÚ¥ ¸>’êAWÀ":ÏGu_¥aØó-©.qþæõݯçóµÿ ˜S¿$àž¯Åç—ÜëgðîùW¦Ï—çžïíÂ÷q-£&Ê‹×z‚¾“wÜK"ìáÏ<óG'‘ÿ-ÑJÈ,Ezðxÿä‰{~C)H-Œ'7Ëê÷£fóß ÝçV ã;yðñäQ¾Çw0±8 ËB2(b¦TtEHeu3›wdÿ>)U\ÀpÁ&½ž‡c0‘#?—MT/¼âVrÚ¥ËHälÞ^lõ Lçõ,Ý~˜ sº”U’BƒkïÜÏ™à ®³‚aÓçÑMþ\ïïœIþ7…Ê ÀSdi>[œRKŸÓ¾^8‹üïÉY¢÷3կ롊 vþnu½ísÍ8““½\j+˜Ö9W­Á‘Á¥ „è¡mžèÈóWíB|)‹:îO¢LT°Û+ýÚw÷Œö7ïÔ|H°>³ÜM„ÜÏ¢k¤M vºpÏýbñßGÕ…eÏ¢ á\ömï–½üŒ0O¬Kˆ°®ûS'ú~`ÖJþ@ý\‹ÿ>t¢ÚßèŜįÇýõžƒ•„â{ÎVhv¿rêû3TÓÿ½èD9ï‰`×3ÂÜ. šeéQƒþ|0ùN[Õ9Pù«?‘CìŠËΧ⊧TÝ;®7Ö°Åꣲծç68/E…áAíyZÔ‰‡ÊŠ#6¦®åëäØìºÌ›®µ³ D×Âu=ž1žðB\ ˜6_ŒAسŒÈ(ÕVõ(E&>¬%éä?ïÉß9x¶zQv]S˜“óºžùß¡ƒÌ$IoØ“ïÌ‹¢“+>€àý©H6©æÅ£“ãº×Ìî/$áÑT#< 9Ïð„¢“!<8¡¥3œí¥Sú‘Ê—H²W>éAsúÖpbòjü`›Îe/¾Ä'ñ’{hÉœ¸T€³¼3׸?’u–Ur.˜\ƒ¾;×H¸ˆ$Ú¾7ÝM4!gvéœO@P8 ¿€9Íÿ&·‹ p"dTPÐW\Ÿ}:‚»+[m{6îá[n£1,š´}_š5ƒÜŽd`Vúßœå±(Ü”ý»¦Î*ÿ›œÐµX» ÿË3÷:e3‚¾Qh€ô|)ÄQáÁ` Þ=ÿC;ñÞÏK¹%y‹†3NvObÙ =ÉzüiE½ÏÇå)^×X“èÓÌeW§ÁfqϼۜüÞC¼§Ÿ,,‡=Ë—O„ c‚_a¨R€¬!—zl$æW¼mš»ýˆŽuèîc¯ß祣‚'aÉ7·YÞ^ LÖ¢†íUp›Tm¸çz~#ã )°/”ë| Ëy¹Y‚s-húG‘cçß{·¿óâ6òۆƒ]¥cÄŸç% ¶ Üïç£ÿ‚Ãkð~ª\ %È%ô?ö•÷xm¹CÍ}:÷ø&ÖÈi/ß7êñ1¼Ç—>ý¡^J¾}¼½2ˆÖd¤õžç£Tå$ÿ|™g[AzX.3¬Ç¿ÏmÖ»ýØ5 “ŒÌ«t¯³‰Ïõ|¿Ï?\#OX/•‹Æç«.»Lô¼I>û,1‚·r M¿ŸåäºÏ׬óÉÆ»³<ÇÔçãß»?yºâïKeu1ÀEŒc¡ÎTüœ4éZ Á# lô:xƒ;9é5¡›_ÏFi±ÓH¾œ öܯN¬2΂5|–ìí#~jt¿ž÷{‡Á†ÌLÒ?Égƒj>K¾F™:+üoN2ÿÞƒ÷ÇœQàfp#@ ò}R.Ф2¥ºÀl*eôz ®+f MÈR.#™Å!|6.øìCއZXòF.´°¾¡LŠV,z=úGΞ…,'¿¿7qÖû„ÔY­÷ó¦ËF&hHüówW<®Çf!®‚@![«}/+ V×ÿ…@¶ªú?X:²Ôv¿qrZúŒkœvúF¾æn!4ÐoœS8mx=D¾4o!FKNNѾž£æC¯XÓ@ïǺ}‚ÝûÈy/ºG+ Ì]wÊm»Ÿ"{ó‚壥“Òreÿ éB9p®ÇßýR¥³^£+FB ~.ˆ®Ó÷UÎ`‹vÏ=n:{”ùý.¿%pÃëàKzð _¶4Èâ~.&d ~ä§Ý{`ÿ¼g€Á`¦í1Á¯i~èk@¾þ:ø˜<ßÏž¹ý¸÷ž "ƒ¬DüôãÇ>~öÛ/ j€up…>«) BŒºÇ÷Kgyë8`ÈZhŸúöÛ‚Ÿ€:U³¿•ô=$iŸgï¿ÂNôëÒJlhrMgƒl!×t™fàšÈÕ·pL “ýû3;í<ŸØMßB’„Nò¿'?Ò¯g¸@X’ªÞ[H%Ñósï¡Áï 0ÿ:„ù't>/³ÚΙÈÝÊ5ßz·ÌПکz?oºL%\ÛýÚ¨bŒæõµƒ”ý\o;ô뜋@ò xE býµ…0Àð’«‘ë`·^>®6A(®Žô¿';†m‚„­’®ë)uVn 󸀄ÍUŽÛ Ó7?F×éÂ:×ãÝ·ÿtë0¾ìáä@ØýØÂk>B¬²”lMþûÔŽ´¿KÖ8×c}ÔˉSYQ©ºíºƒu¢é&ýÊó€=Óío2æt?÷·=išŽäÔ¢½¯o,éä^$d°·8†îz¬B‡2 ÷Ø×yÏÐ'ýî󢟯ï<¤Ð|B?(¤aò¿ ú »Ií:Qa!×îóÅÐsí¯afcü0¡já‘D„>—ìØ¥1f”ÅQVTßKœëž§ƒXŸwJoº¼ZÈÈÎM‚>ÞýùÚw‡ÁåzŸr ¬ÿTu¥Ùû°õ4q}ºõë{ AkwÈ„”-„L;™A&À™ÁéZˆÔXr¼: ©4¹mYª;/oñYD¿°‹ûF°Ô âjÄlåÇWÑ MÒê £4ú@êa\õõ¼Æƒ¯ãVye9À7‹ýáhukõ~@Ó ÷<€ÛGUç5( r3DWÒ½ˆ"þt6‹¶ð*ÿ› kKÒÎ.·7¥Ñ‰š&>¿×£Ù¿¼G$˜®9‚O`ãX3Öá¸ü1@é–eÏ£é÷Cµç¢,—ÖÐ(œ«aÓk£ùö±½%ñ…mC<¹®Çín£·$zSðêÞjr9Yÿ¹ý=È…{ õ}î½P„?Ÿc°ðù|Wxþü„_k,>ÿ¸íiíá4N^¸ ÔÏßqgúvÚ邺½7X™Ý¿!¸åœÝv%µ?—¬é,}”܃B‚uB=è ›{OîAßD6*î,ùž$ ãöóFp¢Þ·1Bhщ'ç§çŸäE¡Òz?ŸŸã¢PV*rÝß³x{\ÞuˆŽ~o(`X71o”CWW'$8§Oï/³Þï/aC¾ŸG²ûù<´§xûô·ñmWQôõÛÃÕÙ¾âòº“U]£l>SžÎ‘{6, 9Þ5®ï¸¦:¸ýÝI"ýpÀ;«%Èc h.;{—éïÇáVÄ‘ÿ¿ÎI_4L¤Ïçfí!òNøîk °$ÿ¯ƒŠfð 侫Dw]RCp‡¸;[àH¦F‰Ê=î^½Ý^nº„\«îÍ-äÞnk¬“צÝ_ {‰ËÉΤô¦ÁÙN;#RÁûÞKÜir;&¯ N´¥$ÝàA:=z?³´Å‰û¹÷`òïÛ:âg…('E}+Ê}¸Ö;gp­¡S² ×À4’ûÞOu žØÝÀ )Ÿq ñûæ,´Ï &MCŒÌyèÃç")¹ç5 .ïÓ0í*Б‡âYG¹ Âç#ÙèŒÜkÁ;‡dÞ‹›LŸa1“_|7@º¤ljêbígÇÏir]×áö§kÒ§ò £ë•ºCd;0ëmr:x<ÓŸ‡¤«v,$âGÐâãþìAµ\>Rö=FÍ4F:V<òôóHý¾žæÐçÍË<tŒÌKì£ìVü [LÖ°öàUg¿ÄçÀZî­ígæ/6}\aƒj`¾øéÓò%l€ŸG û%]Kƒ‘Wˆ¯Õ»G™áî2¦ùlä€}2Š÷ „Ý(7êl¸R8XJº½F$yÓðý Uåò¸=5ÈÙ_çÜSF€<¶‚MÝk.î7Y9Ý¥û Ð9rù∓ÜûÃ`µçÈè?TMí~8vF½×RïíéÌ[«EÕËÇÐ4—Ésf•HíR…TàÊZ 7ì‘I{ÊÓ6q[f´€ì·ö5BbÓÛÕ…Ky„ÝlyxÌ„«&„Ý‘Kÿ)G†óPc&D•ï2î÷î\fÐ 2ö3ï£ø¯­ßâl_×À2úíIB³@üyÜkôz†¯îlLðuú<5™÷y„e0_<ì(d¶£Ø30>µE'žÐ“·о ÑFÞÑ^ã&Èd¹¯y<¯ãdùíhÈm‚0ú0Ü?3fˆÌø ³®†1Ý\Oó“úŠTüuè—øiꙦ 2ÖEõr>×ê#(·©º<5Ïä¥ÍQ‰’ƒ ˜.‘—¿—€Eî÷:xx ™þë„£p+Øô…ó#¦à1×|‹Dâtž)Ý â®6$`z‡0´þ¾ŒP$W¯ƒëóñµ ñý©»z¹E= ½ó~ÜÕ ðð뇺ìzØ3_kyõ‰òÖ!Hï_'t9χ·…å sbFÐçãs¢ïãpŒ4ö½:]«)㓉¬ùuð1F^ý:ô#Oß#Iì1j÷`Œäñ‡9`j—"\ Ó=Ž×O–sxå„I3垄ا¦Î±¬6›«eø»y ùðÙ’àû†A‡9ë…vˆ]ù;ï-…©¾³†1†ª6ëãÂÛ\¤VàË’þ¦Y?g1Î:Î23OCÄ]„d ºy‘ onÞéQxfIÎ'Œtúuð ²íóÜ8áIÂóáÁ $ïçÙð~ӭפʯCœŒâjÂdDák E•Ü„—¸‚Ã4‡|ƒJ°‘ uªfJS­Ä¡…én!¹P’3땺A°•JQ,Ç‚å^ÜãP±)o*4«òg6hwG%A6S´ ýå9vg¨˜ÿÛÚ›y8…‚®í8Ü›ÛUZ4²´û|òTOeQôf”_鎪4r….G픇\Ïån`A£Kh yy 6úi1•ÃAâžíøâŠè'ÛÏv~©“œ'¦MÍò y»×ÀÓúBÊl¨N¼eɯ ¡É»Æ½`FÕ “¾3§F:2'ÅãM-î®Ò·PÂ\då¤ËóU)¿Î%ÿꮩ}Ì!+=¾hd—»ë  Æ³IOÆEà ÷£Ëæ¼´Ôð‚„xkP¢a«yIù%=a[yÞ·» ?Â÷Âá"-ˆþ õ_W¿`H`.šÎ~¹… n n½Ehbºw€Kq½ nÀõSÒ;³)ãœ(xaãj»TÑ0‚ ià<‹eÄ[ƒßïK´~è¢ÄÃkB: 徤|YSL²Us±Ð5nùmè&W]ùl…Ií¹%‡ôy5¹œbIüd÷~Á.s±þPÖ^âŸñMEÁ©_¶‹ð‹Š'äqW<æbaÆûqXXVYÂ}gŽòš–I"ÛV*©ø FzezA*#éõ4¸à+%kŸCx%qk Aª¯¼‰òœF y‰²=ÏKWZ¢¤+@_’¶À ´øe;üð›¿yëwZl¡zò° › CséÊí*L\–¾1áÔFŽà´$ÿ:àã€YÞ3Èbu›=ÐùÒÁ:¤+—® ŒaIÃÅqPÅ£÷T‡Ê½r°$Ýq”ñDÑÂTæîŽòA¯–ëèô¹ã¹4SÒÌ×ó'Å»hðJ9žæ_ OsIó¼€²ª¸£yIó^(ØUVW±Aô¡ºQ5¶àÈ‚,ç5†H/[o ²U×At ±”-CÞbZÅrY9OIÜk)œÄ 'Îbax× }CÒAÆ$¼•ür‘õáNÚ߯gAÒ\ñ„dêÜ%_ùŒIËëÐ\Ïèî+R˨ûûç'a€œò’^© ­sH&~Ž€íoÔNzoÁ€–ì€2ÞúÁð¯Vk(ô%9梠ÃÊî[õ^P‹+F˜ºÂ‹1à%{>óä˜S¼ŠB‰Ž3­ =ž1‡ø|H‡,8”JÞ– ,Ý’ïˆJU]øŒ¨Ü¶u•âÄÌIј\¡*—Ý\&Íi–ËØ¥­µsHã ãw3+Ü®îäã‚ÜäuØE±u!’o3…Yãͪ «vÍÇ ά’íÅ…ç¨Ò’íu/4ˆ|$ÉoID“ýú}^±‚¤ö²úA‡šQn'PX¹ÊòŸÕ¯¿û~¢©ûéÜÒÐj‹ªðy<˜@Ö˜ùm)fË_‰<9AQ»®'äñ;fƫߩ ­¸ä~lf^R ärýóRîè6Ï#²q{ÆçE÷•C§Èk©[¬8Zj•n§’i%º"’±™X–¼½ðà†R¦Ûmå6 DekÛT¶òk=îÂÐ7Šöڟׅ¤åuȶÖR¾Öúô‰ÈØBXë œ¼ÖºÞã9ÒìKV Æ&Ío´Pž°4m)>®2ÿ5,EÈ-·ç Iõë '\mù–Û‘^Nøbòçþ†ƒ/MäÔ¯ƒZ¬!V¶ùÏi¾lÄRƒ8@" ³áû ò¹©>¿W‡X°à˪sðt) ±¢ ¢w)Çp- í,÷'e\;D‚ý:±#ZÕ]]%kÉnÙ"O¾Xnü%^ISSJîêYJî½< @Ÿú†Bõí€<,®Rü}%+à4Þ¯û÷É3î«Ð>Å Ru€ÿ:]Þ”ÂLäÀÒZP‡© yl˜ëb-ô=Uª1ðKµHšÅÊu§N DcŠ\ h…‰ñÐ_i_€µF'X^ÌÍÁ–Ú±]¬'qõ2À‹IKŸC>Âë_ä¹éÅ3¡ Rë‹”íi翃§ z%:BÔHLt1±P} ;ñŠçš©YêrE®¤£vÌH¢/H˜?!/]­)z ¥-4„&€Òo?6ç½ÔcœÈd8¹©¤Ö¥è±º°³A'kƒæPÑ +ãH'Г³ÄºÆ–kŠ*!¼Ìí¨ÝHÏ.r!c`2ªOìâkÝ©Ìôø—S)ÛE–‚”ûÄ7»›¢L·.Œ(âÌ+{Úù(*IÄ=ê©ÈT7YQzØEù6‡ØIsx“ â÷'c¨!œ‚TÐu‚Ò†t’žÌSÔÕè VïÛ­9!m¼TFS8céüÞ5Új/Ä|4¸ €a©Á5S.¨¹xºsí8ê™k¥êžríAHX]'(%?H xx‘"Ï0k${G£Òý…iç(Ÿ/€>V³Ž2SÝF¦ O½Xa<®K¾ã”ÚÛ¤»wJggÍÕ£¯ÙC¡Ü¯¬XR˜,ï1îÂDîǽ[šÊpÑ­¤U¯C:eJG× Eœ´È».µx"9§ ø´ƒà¨7N Ìuð¥Œlò‚:”]%u¤—JgÖÊ”¸ÉoÄžR•!’îA‡_MêΔ„†¶n T@lȦWBËÜV©ìÇW’?ç“RFî2¯ÌM Ö¡ˆ\ÿ¬¾]ÿn·éÐ-áÃ7*2o ɬ¥9õpÞ_v=Œˆƒ±¹èÜ ùô¥¹û 6Q}&>ôá÷bû«ÑýUþì”}ä œ/qƒèÁRATaPõ1òÒW@rPL)ÄzÆHƒÂô¤¸ß ‚[µ<ÏÓè Öò4Ã-°.²ácX'ÆqÌ[m¢®þ€>)¨H_º§H» ›Î=厎"Õ¾ì]ZÉñat…}Egt×Ò%„ú²šc×óx¡û¨ävåeY‚¯q^–Â`Ew^–î‡by,!sÁB[ÂöVïD¢Äï= “–%„¶:£:1Ö¥\`DZ}é^l«0¯Ý¼¨–ùò‚ß2"ÓcD¥òNѽðQXÌéHXˆÍštŸ»ó™õ¥ß/@ò}AÉô¡Ûê¡4íç8§@)Zz¿…ë»{†JA*þ:辄PÝúãÎP)݈¾ðo–NŸ8(8¤˜» Zhbhý”q¾¯0YRP3ÛZ3aÓôQLÌ2ïÀº‰L²Ž˜Cý‘‘ç~|È a“¾ ,òêzÜQ²Ò½6©YCÒ”öãÿêzO1;›ÙÔÖ y`ÒÕûºö :`Ô^á’ëÁPÖÐõY²ƒ9'7rT¢ë‡l*Q Òµ<ÜAï¦-H~_× "ÖAS•™;íˆ6z C6=éäžjH®/c—ç#ͤ#”™ö1üƒ-}f¿ïÇy‘­‚l÷uÐàrû‹åÓ󇇗„ÕðèPîWRF£Ü/°ÒÈùÓN5ØÌ¬DKìs׌AäQî`KÀ­s¡±ùŒÜÏòöŠehî £dHBt›K£ðàj$“ê«2S”ÁÚÊ[Ò¦mÀÒ<‚ÍÄ.±~ž,æ6Û¡¦ë‰óFÀ³¹®ç÷v±²&Îïtl>ÅQÎeÈçœpºTbR=]*HªßᲃÙšÊóŽZ貌AEØún3Æ'l’ä˨®@ PIèÅÒê~jøzm‡¯÷L!Ð#hƒ1“åESu(•Å`˜Ôã"ðµ”á‹¢ÎF0kEm[{>Ü`ãvƒ!¯¾„¼ú£¯ ã¶x.« õÇ‘‡M2‚sÎ1(Ê Ib6CÇåøcVýÍ)VD_BV}AÅû‚¬zö16’Ñ6 ®…·»Ã«ÇLÜ2œ¥D31{ÞÈ ç’ê"›ð¦€¦h®Œ;T?Æ ÚBɧ¾†+‡RéD"W0”íALqAùåÃÝK;_+c>· ÷‚öì"lQcú4D®hÓM>P'«bOa‘e)õ:s«[‰§rÜ2ÅÈŘÃY÷oÆ`:ñQÊÞV7öŽùì@.ÿí\XþóÂû aó@.¿c>õÌÌé0³Iô¦Ë}Ö´Ÿwˆ£uÎQ-í@2TÅ ˜\¤×—y¢Š»sÎ,ÅÝÝ9õûh™a_A¢þ:è¾‚Âæež p…Œàm…Ç'dÕ£w>Å%œf  «¾ÜYõYõeê¶¢,/í=(“ïsØv°Ü>ô  ¥¾¼¢YÈw^†–ODT\/S+S:mÕŠ2 ¨•|}Ÿ$NÇJÏÛ Ÿ×hE§ÇÝ/Cíär¼®ç3Ü@q÷‚‚ó½Sܘ|¥¸9€âìŧ•ÚXÁ1ÈäéÈâ+íö\¢à|ÑÚòŠurî â¤Êtæ/¦éßÞÞ‚´ùuð­¹øëÄ]x·9·¹q6±wîéö SÔëÔ\ÂB+(_VÏN‚cmVwiOuEøð¼Dêâ§²µ9¬®zO}-Ѧ~E‹kÑ><±^ŽxÖ ª‡hMXÔ½æ]þŸP/G–<@FX|=„Á…•Ň’ŸÈÓvbÊéõŠAja± ï9”ˆ(O{E ™vêJ…¶yùñ·ó@©/Ï]=¥r&´Süãs±tÌaè•§Ÿt3yúe‹–Aµ+yM씎¯ìaœ;ý0ÂHL®‡¯PBª&ñuÓwà©•ßî™0ð‘¿ì 7²8ëaWæ{êt³ TIAÑùu%Ç’=Ëm–×ðñ¸ŸÔ®]Ð303¶ êÇ 2ëÏ 9hsOE~²»  i’µ@ž7èE+¿]'(Æ[Ì\ü×j]ʯ„ÜzÁЯI‡-FÔ¡ Ì+cKJ¾n:»º.´lŒ‚A"¨6o/DùyI äñKzŽ–#ðe‰a\ Ë)½j‘‘!Ûi~ Ç’{ÁÛ/)y›ÈÏR_FRÃ>‹£¨WXw:LEX>þN¹-$|‹æ-¦JÎÃ0T<”M>‹Õ)HÜ”ä™Ô@Iºœa’Èÿ[ÛFÿ!É×,h !¹œÌV® L"É£…dÒ’“cF—¤×@c«»òPÿ-P»Å@NÎ…s=:µ„ÆÞ“Ê8aâv¤#6>@xÐüÿL'ã…Ž•˜]”Œ8t@MWW–t«@È&—$¡Š ?æ¨ô¯øL?¤ê3YÖbRHåÄËêÑ·|%’,o…º7.Û› wPÉÒ¿¡rXëÑ/›&Š\Rƒ¡ÖNÌ*a¿§ÒØÐA==»¾ñàzÒîYöCGùøã‡Žê«°– å~6]FÒá{Ì’éùÆ)‹NŸ \"Ýyt¿CF¿X’½ùß=Áa•¯.(X.(Ø=tßzP¢»ÇéÌ%±§ÉTÀxâ¡VÀúŽí[ýöè 2¶%‘"lj$fDºUÂjÎ7U`ŸJòŒHIi͈dýKrĨ€$@R‡Áp#E¶”bh™ G¨¶Ä€¤ë² …°¹ Í^ÒÞ\X'þ’j„PztJG!žhOý;ýSüýž)J…ŸÙ&Ìø@Æ aŠ‹ïZ ”ì ,‚ÄzA¦ý8„ƒ—·p™õ{=Þ¡à÷D˜TBÕnºžo”ª ç~fxáêUÔ&N|°à7­Øç9¸Äè† LÇõ ÐO%;*Œµ{£…)ò·y) åXÊEEE¤ðüÛaø¢ä[kpsB&^TŽGÍ9Õ9¶häÌK¾Qa‡÷·kZnÈû¤ÜK¾,ro#?Y3XŠ׊¿°¿cœë=TPÿWž{µÀÄ)w1¨ö>veC¡‡­úÔ,¬òx›=¬1ê,HQ£I‚\ú˜Ð!HÎSWÍ;EOá)0 b<«N"¨Ô.å§RXMæå­Â7•”·ªUŸšˆ1¦+Ò"È®_‡ÐäÄ´C‡*Å#ø›HI‡'qµ‰ ™G„ ÝBб‚aÚV<#Ôd¡d¾Ægÿdo"‰}Ä–ì ;/L¡¯Á¤FÈg6ApŽ)²T†ÓuZøJíP[3îË o;)ÃÙ¹Ü „RPr,HðZ]0Hˆ“⸄ÞkA"( jw”7Ž çë2¼ÍVš]ƒ&Òðö+€#…â&›dä*äß ÙdáÎH 8¤8Ö/u”Õ´ŸS[kÇy%Q)¬ê¨¥~‡ôDð¥|.(¬àxXåë¥ÔÝDrá‹ÍCB3§ÔË]Ì»Z_`¸Óè&ñŽ»Ö ÓñÚqx‰Ø&’B´4B˜I\lw­$ÿ¬sÎT¼’ub¸Ê2î»Ä"ÁøÃyå4ƒAÏ|÷¤oéšTyQ{'¢œëÑ€à+\ÕZQ‰5:†s¯²à€3j6 )×î’Á%#¨"54ó’Kzßϲ]iúý 6Ò*kv›W/v›5Ãt˜;o 3Q_çÙ§Çtr)ó^]ÈÉil–œ&®Ê1ôݖcVk‰x“&Þ<«úä†ó:ìþfO_Àü˜C-·ä©ÑCiåµã"WpRxáÄ ” CCäñÅsq®ÖKÛä rZ‡v8ûå ú²ÌW n³;!¢u…‹› &¢¥ø®yÅ´û\ÔJÒòÀJ­¨¼®Gƒ? 9úë QуG €£±…3=d; ¦0<â; @ÔoEbãGµSÖ·‰Åž èÉí#ÏyÈ:$é¯Ã‘tìjÇpp‰øba1úzÕOъ¾Sˆ–ÃU­ÐP±´{~5ÂFÔ àð£k"Hî‡>°<ñiåP"%4}ª<3RPl\,ùþ<5º_*ãðUKC .buë9W&O8ëP߬³ÄYRRƒ‹K³òŽ¢E VcHÅ—z«ÜHפßÿMDö ÝÛ?£Ä<1ÁŸ7¿-åL¸¢•È·> SOjvE‡ù÷ͱ7‚ÂòbÕëwHˆt#)‡ÊñkQí|ä¿ËU½¹ {€À5VÌV=Úî—ª›‹w’ò„]r“ÝZB¡ÚΗLÕRa²ýã!ˆG`™0~î‰~B uA–Ô@—A ù «Û¼d¹úÇË‚—Üÿ±î“Ôž m-µû˜(¡±ÜÏ»KÏ ª ¬Ã^+Ok¥ññîˆIªm.œ£xÈ´¯ $÷ÕÀzõàUr$®7鬘*¨_o”J,öã˜ÊÝ…@XA½T¶TáÉWKž EÇ8.ó ÇDœ™0I~îð ˜_%O‚Žr*gì+áö±cë®nÚ2†ý™ФŒp/d ¤èÒsöêîæªqœh̾€.iNk,°ÖAö' üqÒ4ž4§5^ÝÃûO ŒÌÑÜÅhÆ yB,a©DªL‘÷v(±ßãUÝeè×Ft*BÔ‘›VIßHöK…K ´L7`q1¢%®Nr‘ÐïVïð rö×)4¨á„ÚȰÛÝÐI`Ò:ü±–¸Û™ÈË&V6÷ÐtHËÈf®À~ÇS‘•¿¾âà3.ê¤*‹1v§é,–ÇŠqÂ+VÌž ƶßÊ)©*ðÚI D®ªÌÓ1D…—|ÛKPÓ×!਄'¦Þè7‡‚¼Ë nƒròë@Ç™äf¸žXóÛ‚\ûupÉA·*xé/Í iZ<îþ »”ôz"&cÝ¿W粺¾ cäÒ¯CX0؃Z=Y¬¶äæÐŒ‰³'›ì…o®œ’(ÂâóÕ)ª¥UŸ¼©v¯˜2-„òá4–ÖödÄvÓZ˜ŒØýZ;{4!͇]žS£ñ–ˆeAÈHƒÁÑj ²ó×¢”™ø!lúà/ë¥òE]=ÝXq¹¹Á'›?æHëaœ9¡uƒ!ZÚÉn!nN·Ï¦è5Äa‘¼¾Ë×®|ò÷<àôn_!sh":y¤XßDÙé„ÿ…©øùÖCý²ªç:ÎC¨5Wî%KÔ§zDn¾4ÍnlÒ<»e}uÂaµÄ›ÄDû›Êªõ«£NØÚ|ÈÝ8ñ!Ñ(ú£Nް¾ƒïèµê·“©?<„>„qÔÊgvÎÅÃNèC7¼2˜,¤ßÎGÀ2•®†Úd9зc8Øñ×õký„’öJPÙ%íIÏâÉø0 ŒûÌ;M§^,Húí@½ûu Ž;±”ß«¬æ¥ôÝu˜>³ëq×ÈØ``=Š Ûz²ªS •_ºSQ ¸Ä‚ \dØ¡­,¨Š4À³s ˜¿IšD+[+fD@/ß°VhàÇxt<Œl טrŸ¦˜¼eí¹%Bã¼l$´?éŰŸ|ŒûPYqã nÁ ÷éä#5Ï­ÓÛ=mR ¤3m’<*Š‘ôDÒë|a·Ù÷¢Æ2ö†¤|®/;)_¡/!)_¥/!)_`ÝHñ–Ôv}ü—¾‡}éê2Uv}¹p\ÒÝN×øËØ´Sz0^Õ¿N¤#GÌ(¥øßÂx˜ßå¾kAblDœ šñî¹µWÒzQNMR½Œ5È÷ð„ùÐý¸Xµd:lb9ù[wZßãF &è“] OjüüÒC¢(¤»ù¤‡XMXž/=˜/HÚKɇ2Õ¡®÷ØŸç85îéÁÂeãb`€KVÌQû¾c¼ø6YØweèú°r°+“«Øýç‚||öŽuyÈï0'’ð×!ôüàÅý²·þ§²DMe¦W¯¶Íô­ò’ŽÜf˜<0oúŽê#e_†§ Î|V¯¼Å%²1ÖAãk´Ý3Lze3¸Îõße‰%.j¦:Ádé’Jm$] d…s½ÈŒW¢± É^F“|êHº^u/–!Â+þêÙƒ9pÅ‚¼ÃYHÒ_‡É&Ä”h™Ÿ°È—ÐbHI¤å+ËÉšX†x†…d¸ñÂ*öw½#ªÀë‡^€^Ï:ÌÈá—±=¤üf2“Ï2òdÄôB&ri¹6ØIÛvÙmd©émܳòL˜À™ ãv±2½úÛ w {¼kÈ¢YW»‘©¿N8=ýú㦧_'ëtq ò$=÷T>Äårk0IøbÌ>Á( Ìu0ÃÊ1dæË1¤‰eæó¬UìµOD)âú¹BMKßËÐHy–=ׄ¼bP+e4Wºò!}"#oN¯E]$$ç œ25–”‚íäªì—ÜPXê=ß;72´àWÖ,£(³z}wü‚W9ßúv( Éù‚ä|ÙÉù‚ä|=&aw¥ ›¶bWêéÀp"Lůí–T ïÊ;£ÌwÅ,a›ˆ|c¶ÚPŽJͲrß. 2ŸÊ?]ß‚4ždÜ =(kô¡•»2ÜË•„l}Î%&Èé—ž/` á\ú$iÈG—Aá á‘ÃÞmo€wlLš‹h¿Ù‚’âæÅ¹žv… yÎ2µvq"{ö‘”B˜ì+ðÏbÛ¨Etæ‘ÎÎó@|…L­M,A2×$@> ÓÑÈM>ñ‹æ«3´Iê¬FL˜ÔcÜH¦Y÷åfúŽ?YNUifŒ˜É¿15uu^/ ßfS¢à.bX|síŠ0ÿÎÜ:2ÀZ†~¢B'å—ªC•?«ªƒÝuZ Êäø9Õ?æ_ïv exØ×¹Ø(W­ô¸Ìân ™šˆ½uk@òÔ›h ‚ÁØ„cK{¸€F•®a‰éòp`¨áº~=s†¸>rø× ]-ðDÉÉÐßœ*©yYÇ"Tò–ñI;C`[Pø~hÌ‚±[^¤Y¸£ŠÐØÖÁ— ×ˬ!ôÏCñ¿+ñ~„ûÜi”€™È¼äìNN?¸}HÊž€n<+½¥ÉÒô\™ØX¦sŠ (d6ߎ•ùâ~aøÝ=-dØX‰_@‚yþ®ÊHãÀ~2wt9úëð¢¯!ŒÿÍä¦zªóü‚A˜ów'ƒÉ7àkv>Íãé¼bV ™E%óŠ ˜ dö»•d®÷‘à1`½æà!ùTÂÂpa÷n{¢P¬N%[E?{¿X¨(÷²13Z×â¹`’SäüHØ߉æ–OØc¦ÓëÓ³)sº±ÌÏ€»K¬œ¿‹’nø;°ÓÉ{.hdÙð¿'/ l‡j¸H›­¯BRXKÅ×R!+øy*²÷×á |óôÉœè·-ᆊ]¢ þõyŽÑZá­V:ïT¤ ùû¸ÔjNHN‘‰gXê : óŠ} ….¯¸AÌä7i‘¯fà¢ý4ѱY•¯I+ÔTØwÕjË1ÊxqtA…õRƒ’á VV¶=‰u AQéE…Ý[m#å·f¼Ê•ç̺\†úµ–£šGÎ^B9£Ücβ[š1ªy„· é;º}n©<„g‡š•ï¼ÂßQ‹ËØðOän¡j§ty`õ)Õ_[ðA¥ùÇtj9k½b¯¬'‰ßJ”¥SRdBì‹‚+òËëc1û úÕ‹†&H°íXÓŠý——¿"ŸÒý> Fm÷¦^BaDµ#Ñг!Õ‡Ù0)_Ï«Ïå¸Y¡ÇëîKÁ·×0Q¯F;æÈöTÅKÒ¼ï”ät®kB!G »Ö¼£>Û¸ÙIòä±÷/­o]ÓÒùhå‰S¦"‰!{!Å €jIüÁ©³ÎÝi¾Yüüh:ÏB8¯BõÚ#‚¯>ù/W·6<°+‘`¾è‘²Î6Ïð+$C½TÖŠÔþu¢«£É;8NõGDz"ð§·[¦"¥;*¡yû¦„®?²“Éó‘£\¹úPRÙÖÃAÆL1Ÿ4—¯ˆQ®ÊÊP× ŸuÍ8¿3ÃéñùK} ë2<ïàÊÖ??QÕG‰øÃP64mÊfA³" ÿ£Ð¿0Tæ8­eÆä[' ŽÐf}œ†¿"õiÖÏýeüsֵ•ˆHÌ‹qL, @5ÝŽzdë¯s>ÚHÐ_ Ò:h"ëĸœ9ë/ÓwXGVN~Õþ<ÿęɣTÓ-Rº©æj" È^Ìç<6FçË:{ùJÙb<#)C‚®‹ÆÖûº$±KMj¡ØKT‚ˆ¹L§Àjõò¤5åOù5å;_¢"çì&þðU³î`Ø f» Ú—ð«Ì&/§)—UÇA `T½3ú™QS¬¶†r sžì3ùÊ®(p¿ÎMÿŠ2ö~‡¯`Ÿ–3!ªi{HÓÞûª•²ÕUwŸóáƒï݉“RÂ-²¥ÿ½W!¬žÂ UtïàiFx Z*÷Þ]È@œz8¨5~*òüëÉí·+X Ä] KÉIz Æ©†ÕQñAqupPªïÝpoU«®”8|Ðn)¥¾ÅŒÈÞgF<±[J6Þòê±B­©jK©¥x5&^Û8íÉ·òºÐ»å¿kjN<þ*दîÉ3#”††“úåãMd‹b0«&mÄ—c6Ï-:Ÿáš%rèסïOÂ’êaÌÆÜÂ6¸u<Š`ò6€.‡Ä6_vv}õ€pM#Ÿ åA{ùkÖ5èûÄ%KZ|…5[Æ3 #Õ1·ŒGfXXâÉ+“JØáë§âŠÙÁœ0Ùð~•‰þÛGZâš_!ƒ5]€Ä ¦€uò—•Å»®z$ìŸB h"Rú#ĤÂuYósÑTÕ¦›%uFÆác…ìR¬Q¬gC£îá¯Ìé—«Ñd3ª!Ïl.넺Ӊ!©wòt¢Ë6­™ûNÞŸÉ=§Š¦n–ŠqÂÀÈã¢ãBDWÄ“š @Ó“Êe%‰ùøœ®´¹ ª€š/þKÍ!YCâzÜãï€Ý–³.uòÕ› i)5Tš}Ò'Žj뚣*©D!$¾fÍš9303i¦Þ¦ûÞýkÐߺþUgÌÁÆÉLëttu…ùæ`ã c¤š¿7qfð QÏ`9ŽªTÄøUsyŸ)Õ O]•Ù踸+ˆJë¨Ìù_š„:1ë¯H\…‡}s„ RÍ —¦[³óÉ.]s(ý‡ÐFr/=«WˆGÓ9¯ùеUÄSÖA BZVýj{3ÇT$ü¯^ 󯢪¹62³Ç€ªµ¿IâN¾ €uÐ95_þµ,äÑ?î´ŒT’,=Œ=ÜR ÎH-Y['ï¸4å|na]²#Ú^3ëÙæ z£áò~œ€4 5€–¥ì—¦]¨hÚ?»¸:Jœ]˜ï¼Êš9˜=t 5¬ø¡dõùUc6q““EHƒ¿_€R©YäØO¡×(3‡èGÃàÉ`a$¹‚%QT0€Czž,×'Wfz¦ R€e è±ßÊ)‰X³þSN¿4”­çÓrÀ¶\,•™›ø„Ƀ«¼`-¨ùb“)´hòqc¦sŸG"•g¼l¸(’êlpº×òÜŠÜè¾VåBòù™‘µîjûo&ˆj1Ï?hâ„kæ ¨–ûo oœxÍç/tQQøìã÷ÄÜâ¤ñÑÒIn@ÃÒn%Þ[<æÑJ5í,¡ÀJLM­–ÛÂKmSÞ·ü‰® 2Ñ?n+ð»Udþ³Z9y?a/+ùXíÜÆòôL¥k9œĕ‘zB±µ”€Y {]ÝÉÿ¤ïpì6뀾¸d+}5$ÿW¨½µÐ¡£ãÅX 93Û4 ËAboÝêä[žëÑkzZoÑ@N…‹±O¹~Sx¥Fí DµD¦eVY¸ß(|f·ÐTynµ¸Ða4ÕWê†åT­¶ºR5r\®ê_UAe·_ƒ©ÿÑw [¸îÔÿ €ZjX0Â_O8¬Õ¿EzòýŠÆ³\É1|“9Wdó_Þp¤ÖÒö\lU5¼Ó2øwwx –æúì¶j{¥®,>Èí.@k9jò^½\ct†¯kÜË@gxщ*¥Æœ®>ë˜Ï… Öå¼§›³¯xÒŠÒÙ¼|°ˆ`×2Âtd Æ^ÕSYi÷ìTi]F–ú‹“º‚ ¥š£w4ŸÍÔqHÛáNž¬`X÷VËÜ»\™Aj`õÚ Zt 1E –ׄÇ>£ùÿ4èõıÎDë@~Qb‡ÚWÏ£u¤÷ßš»rò«p¿xuÉDN/„Mˆ¦\ Eà¸)b*@®ë8qBÚZŸ á±ÍÖç„È"{U죧±VÇ:¿*¨¿¶ºÇ¬26SÕcVkJW1¬Z ˜d“CRë\ÔÙr»ífºdJw V &Ðé'WºB0ÖzeT¤Ðãàm„nVó6Z!§N¿j:ßpJÕÍÜ®%RÌISµ^Úv¦c †¼µêS‘)Z«ï0ñðÍ›V}‘›vŠ4ÛMÅjåinÞÜ|̵2mêJ-«¤ÈÁ‡ƒýišâ[³e ¯é:]sc×µÓ_€ƒÜƒ$I­lËàÍ÷®K…«z*Mņ¸ª}ƒ‰ : @f…Ðq-?Ð=ášž0ÔS¶›Œbv9‘º§Vb*ÎÜÖårãï*I‹³êÉð‘žNê.w˜ b€ÚûŽ\45‘‚Ø«ý.˜N¯V¸¤ú¯÷?øÙJ~‚[ 6ás¿P fð]Qûzæt½NP,ó&ÌEì>}칟ZwåHCò{vw-pTœŠöÚoINd_g52®ì€[üû¼ÁÈ­C³Ø{ú<‡Ðƒýº*úm-¡,PUîeÙ 0´Üu‚*Ö!ˆDì=}ª¾‚Ú§›Ñ @X'ÜŒ×C5JSl°–ƒ¯ò6á„ïú ZHÎOx $ú™Ç=°Ä÷¥_f¹¤2î9;×9¡­ÃTAŽtõc±)jÇXNíl¤2ûñ}2YaØS%p¸f^‘ÛèD`n¼áYíFº€G„+Iž´CR ÷Ör²yf‚¿¬$æ3šLÿ¤éßõ·cYh„êýÂ~G¤SwD IÿÕ˜ 1òm:,ø¸’œN6Dœ–-ÙÁ0yùKV 4övðˆmD4~Ä þQ†é£û%Äí @¢èƒú¹T.lõ»‹”Ë\Ý [¯ÃcتŠWÞàVøæ}¢¶ùz&sÌOÿ úÉX¾šn·%L·ï¹Œë[ˆFU-ßíÓ¦²MÝ÷8#³bÐ7H†š³AŸßÙH߬ý_‘ É.@ǹœ0t†û|ÑÜ·?ü b„íIÚâ¯h|*}:,T=\Ñõ7+?‡Q1uŽwT±*Áá‚Äô:´4nÃ@ÇLÉÜsƒB;”cf|oW¥­ ¶€:‚‹fp¨ ¬Ì™ÌËb×25hu÷+5hèþBn=I1›±¹Ž&ô£q]Až¸Ü¼îC(7 @e’Ê&ÅÕ%oKŸü ¨!C´>t&ÓÿŽ¿Oý:ŽH ^6+xÖ¶  AoEëä[‡Gâë:Ñ [fÌ-†°y€@Õ½*n~±>ÒÈAæÛ:œR¯¾3pºú–¹·H¹!ÁŒëàB)°ë ”ï©k+öÔ‰tG‚``­CR=«‘¹¯gŠ­¡TÎõ_ n\U‘_[gru´Õ18¡dxT~Ï»›A€ž¡”xÊ'ùÿýû°·Ö¡¨o¢x2ºéÈ|`fÂ?ô¡|ƒ‰uæ;ð©2ƒg ¬u*ÇLe¢ê ¡Hÿ?س®™"ïÀˆ~íJÿdFχVSã)ZŽ”éo>—u)š1'Vd2¯ƒkþ@ÀT°v•z/iá]U™Eë»™H€­5OQ2ú“ʧòù.kAPçÞaÀ8P§Ç]ƒ=7™¹ES f{àÁÄÓA×Ì6–;ÌTJEþÿÖ¸©Jo©Ê FÙ½°Sc4å¾\ X'²*°@Òzœ8žc©ìíI+ëõè`/qøƒ‡¹ÕÇçå ÇÖì¡ 9ùv¾%f€r‚@¡Nçöâÿ”U¤#Pݘá×ê¡T!9Y¡7z‘ÅŸc…Þ‘5JwÝ> ;Ë„)3OÍ$”ÚTvKˆN@ØÄ€_Ý’éø³^±4BÝOµ»:wQ^ᮯ?êædÔårж‡w4¢=wšL{X‡1¤É€Û¹\• ~ Z{^éĉ6<¥aàšfÀ¡fIÿ¡„RɧFwcõ)%Rid|w"•´L³„Ó1Ú°-—V󺇙9\âð?¤&Êž·f}»4 nƒu}¢/' §=N/ì¡ö8Ó*Æ,K ^YÝÑ<©‘AÈWñ¹†ÙµšA÷ÊÑqšr+_[íø!41ã;4R%,Ÿw6\¥¨¿ô ›Á:ý7Kà&0ÿUí«ÁT[ñ´@SñÚã„Tà£~¸:™µµ‡Ÿ =—¡Ó€ähÏ~w1'÷Ì4Àí–†Ëucà:µ,UŒÍ^À¸)«?@vl¥uAæ³Î í6&<ßõƒRÿ[ˆº6P¬E»H0@žŠÕ°]·³¶8ü¸Ìœb˜‚o å¦{$Çäe©¯F`$šêšpŽÔzÏm'߈Æ×¡|Ù#¾·vyôkÈÂjHcÞþÞâ¾!/*а†ôÿu˜Ú ßµ¡b{.ùÅhµYñkzCKð9'·¿=Êìÿ\oT³åñ7vt¯æö7¤õGÖà‘m–Û¿i÷Y†N-“Õ<žq$Òà!Q"‘ Û=•óðò¥0o‹9ÊÕ)7ëþn ºòÐȹ $ÝÅÉÐqÞ1¡„‹šLÑuÈ–ÎV²è𺖽¶ü£ô×Ò gËÒ$–;uêOüæ\A‰_’'§ç"Rip®³:@*ÐŒWsìÍš˜ø#Ùé]5„O­™Åž83yb_.‚6i°D? ¾Ó6‡NhCÍË]¬wî#YSµŽîźÇîçÈdÏÝQ°c2 +,Î]ßD2;þbòl™ìv¬ƒU³ÅG`2µƒêìòÜý¹ïÇ'b«ÉŠî9÷g ÔL<»ž'ÕÂÿBÛ4¤ø¯Ch!,¡\†e7íZVNÿ³C4rx•¹ÆrHâ/„î˜oK ØÏuu=±{ˤ[>îp (•ø¼‡8ÏÃXzÒK#@ËŠk`hÙ±c $-9SçBqZ. ±!ùe¥Çâq ï×ïdcsŽHtË;ùŒœ?2&×Ö{Z5B5[Nf- ÓÐ߬:KWfP©‘Îî®Ô°˜ÀÀêMKÙP‚ýƪÃ!o š°giÈ·oÙsögÏDÿÄ­?ì ŒÀ¥ 1éSµÍÚiò­°[îÎËÒ²sÅm£CO ’üzß›ckì_«œ¶,é<îë4þ¾ó­p\?ø.0Ê:45«rêï èÇá†8/ä“§éÃSº˜ñ“Õûa ˜Yyâý0jò ’tò ê úë³ÀY wžXIcµÚra+9Ek€’r°¸í·p=à~­ÄÉ ÿNy´ jÞÞÝçPׇّzð¯N—Ñ€÷{Ó8¼2Äòø×Á4x¤ZÑ”—æ€VRXГ¿0hCVþ:qÀ  ¼­œÄJÝYßùú©9 hjÈ[}Bÿ:0æÛuH¼ÖQÉŸüO€µµ¨ã!“È>ù§§ÍÜSfë< jÀy@F·*7YCÞ+Wø¥2SÏœ¯ÐòK\ƒG¼•@_@  )þw½¨R>¬¡Ð_YxpS(uÂaòckA$/,§> ȶà5ǹ +éû˜fÓŠ#“é3,ö¥F’ƒ‰ƒ¬šu¶æ“V$4‘ä0žcÞûߊDÊÁŒphF—ýMÚ@wŽ UÐÆV˜'œ# ‰õ1¬Nwí¼u ZÂØ ãro-·°^Œs4(Úm§î“¾¡…Ô}"’[¨¦NŠhO$e)ñð¶W4’ï©'“¯A/^Às¾o?Cè--L%)E½dL[»‹&¼ý¾s„ó‘ÐX“~84­!^ºÎªÂˆ`jsÍŠÁØwa«Áá$pŒŽÀSchù~¨!i¿•z»Oé»â|u– 0=/¹H±‰—³ºÎa<”±W <\e„©[Ã,O¶“u¸Î =§ó’¡q<\¢@; ükD»´rñ»0ùz „äVÛ åZôÐXLuØ¡@“‘ì0C¸"[ %ØcEny?ùÊ@ §f™SmrÂûJr—kÍ€ÿ¯k4À1ÆpSŒ»~w ÉýëpL*˜#²¬ƒów⬈7tÔÄì'bÀäŒã¬9Ê06NæË#€ç ‰>hÐ]Ђ;÷Ú[¡y¶+ˆyƺ¬ë Ý›kÜ,DÚû:¨ç„U·Ï¢ÕdèÔèÓVW.P¼Ìw'ó4q&- 7Õ#km*x–qt¶’öÉâĹ*ñ´v…ÿRñ[ ÖLƒ¨mk†Áóæ„Ê”CÑ#¤øf!Í]à@ÿ =pýÀÊä! ¤£—˜éÑ/òÌðÓ:0ÄŠÌ“€}zyºS0 ~{oÒú×Á…VxÓt´¥ñt?Þ2‚7Ôú èwÏ’¢ô® Ú¦¿U­VD@}jA,Ÿú¶çz41xË:Œ•žTv;(íò XJº+‘‚Âa]èE66æ®é0t‚¿ì`zÚcØ“ysÙ4·{Ïïxs°:‘Ø¿ÖD|°o/ ˆ´ÖÃöÒy¶¸ØåB³h94:€—!æÑÃ[+ƒ’ÅWyVéë­Ä>WKÅGÅF; Æ'΋0¤!½¿õPv¸âuB¹Ša#¦ã9jÈsÏɑ҉,'†Ú:½e·¤d ¨;¦Œ½ðêðDµ.»#‚4&B·Õt '˜¶ªÂÉû­{U²†äýÖ«;;b2õŽ Ð†ëa¥#Ûb]ÙÍÙSêùN-Ž9gH¢õ‹ ¾!gKê.1г¹`n/"™ÝÓ8Êmçó7§›åó%è 4 ûµUzžÈ{¶‹y|jFN[Xe‡laÏW)öõ“h¦©ùb=Kàµ9‰}çztaØb‘¿ªí­ÓŽû—ߊ4žóMÜ7=Nêîæ!ÉI¹5îÙ…=§6Âõ ùÎï ÆXèåÁ‡ô/†½)JÒPrvNƒF”X¶o Tq6²Æôý»ì”§Ó-„Îeí…d‰&é[;0Œ‰lZÿ]‘ÓÒ1—á½%L>Óµ‰ñ([9žíé°F2}ÝŠ}œ´æÆ0:ž‹¹!™?·—ñ†ÈÏtdXëĦ#Ãȇ•qMÁÛ ñ%Ø´!É~Ò!' Ú,í}½hDä|4¿»Œfvßé„ô—1Y€\$þ;3µ×ï¡aŒí/¶¤ §#k†mdßì‘f±Nx,á·# ɳõ¢jƒmÒmÉ‚ã{[BÔgB±í  ïP.Ý—¸-ônŽz Šm[¸àh㊭ߦ–¶ý;â².ï7’IþMsúUWî‡Z;¦7xPÉwØé‰ëš(¤|ž»‰èæö§Bb†>ûôüF Šçg¾Äc­ëDÌšÈà.Yšz»ò¼F=ÑÍóúIÓ,ûÜ_a–°\ i’S´12¨qƒ#›în„;l8sc¦Óeœº0‚ìp)ÊQ^ÚíC,ìJ‡•5z7Ɔ•AƒoÃYˆ^.70­Pç, ÒÈ•iÀŸÈ (á\-ýØ‚¼å•Ì2àúBQå¡‚÷°ë1àÔ>‰Pty\¸ÒG>v<›9ÃK6øñ›9>7ß^¨±­üzí¯"Å¿ Í€ ºïæÛkŠÀˆ½ÈaÊCt„4¥˜zò;[½Qo¸.²¹×AM°´q*h‰¿zB_¢³ÐˈèLw¯ÂÌ!êO ‹9^Šl” ˆ—6¦«; =X'Ý9¶<éN|¿k¯¯šCíY›4/wV?Ù&›eõ§]ë¸M'÷!ò 4ÿ 2ñìoŠ‚À3ئ¿”ß$2̯ì0áE VZjgv‰z1n«‰÷Ë^{ N¨g,mn2Ö¼±ü ¹d!%[rࡲrC­ìuhGÊN'ÄÂJ¯(<’ü×AÙñ`ÔWwßh·!„$þuðÉ€†¬~~ÄÔÌ.a6ƒšñß°§•„Á¼„¦0FP ïU<™IÏÓ7æ»ÅÓ7§S’5äý¯ÃU3ˆ€ KxQޑ޹MÉ4$ú·©1™†d6ïè1ùÕ Ij8æJŒMb4Â\â+”7¦?ŸÊ«5„ÃÎòDN¥ã†h[3 ; ‚)îÿfNÿsëÓx¦¬;6èÿgxµy/™Yx;A Ñwûk´ÁŸ€Mcb2„œÁå®Í†N6˜¬ÁÔÞE#à¦é!K›âYB ­~ŸHnZ"'~&<Ú“¡(Î)æ ¤$]îùe¢îlw7A Î,Ÿ¹dfãOAêþåSA›!A*R;¡'|Læ‰SF½ vü þÑJ­Ç‡Ár ÷gx²~hç3_rdù#wÃ?ƒ2°7Êt ¶ºQNŠ?rF ƒWÍpóWÔy[&3¢Û1}r#NŽÝÐF"d2ïª>‰ÔÈá_U­ÀЦ—ºl̇·²ìk˜SÓk%z/¥‰ôæ€ee! ¥Á¥wÒ˜ã?ïèeB"Eh¦‚Ìf™õÇAfôYžÂf5döƒ?±ÃU¾›F­irÃþÜÚnª×Žlåþ¸9Óázì7æ80{a MêV7 ¡#í¿?‰¿7ël®È×z¯Oh 'ÕtЬ{­#ôÙŸtPGÞO·LŽÌäRH©{‘YÌgˆ/¥+<‡¯ÌIc"CµöSÖœÈwþt‡zß±5Ä€G´ÐeG¼¯‡:SLޏ!Œ"wäGY­×âêÌÂÒeJö‡~èÖ¹¼û½àÅ%ôcÆ@”ݬ ãĦ0¤n¹þ SºƒÐ6»CsgJˆ÷ïozÕëPLÖ!yXÊR}…“Oå@¶AÄËî± R¯zv²¡?¶Ý`f&|Ô¦¨dÒ ë®?Df‰„rn€yk3*. <Ë ÉíÏ]^¹±z[$âÊÈ ÎJõÒÁÐm×ëÊ@Rfý©÷Ö­÷ÄZ’|Ò´ý"§ã<æ~ÑŸ+6Óz5§ÒA=Œö¹ç¶¢ûÚÿg­·e3°£¸ðqPžç¡C4dý›Ù£ÅO°\ŒÖÚOûã•Q× <¾îòÈÝfcÜÇŽŠÕ8«ÕW ×É6lvü)pYô+áYìOïç+ú¢^o`>æð¯tÂìÁé5ï;¾âª¼œ™â–È +Û7äjÒš` RK†E•ÃRèÄ»®råÚ±IH0Û%‘`WõÇ7›Ò(¢}³é !觬ga•Y} Ù‰³£Áza¯XŒ†Ú¯ØÎ\FXÐÁ£VùP} Ö»!ðžU lJa‹¯¼#–µÓ?U8ÓûÁ¬õ$nk·êÉzc—A· …Gzä5:R}•Xê?;OxpŸ3jÚß °Æp YÌ⎻·#íÿýCÉÊõCöª<?`ÉGØ$‘ö2Ê9~ŒÌªàŠ©Ïqpuä­]µâëü´´‘üß‘ü\± ïú mQZO,kìá]¢ÙzržçŽÔþkãNÛ… %˜Ã‰Ê’Êû-hü{ÃIï Ç,ÕÑUÑÁ=€3¦û¼*ŽöÄ™«üeu5/ªçŽŒ~”Õóžèl…&¹2s¹\ør—¯Í†»M0Ÿg=qº8ÁK'{ØŽÙulÑëLþѼ<@Ùt‚ë"Ÿqc~Z¯tµ=c¼rqå"pŽÖC|b'°¥æswàøÖá´‘ˆ¨n|М1NÞ±©÷dšYã'`ª42ØÑ‘ê_^tlÏÇ­QbuƒËfdà¯Ã®ì^yõ ’•±9ÎCG^£S­ªZ˵gÝoNü´£h{Ïg¾qdëí„&‚kè‘ù tÐ37”^‰ËJ4ÃÒ=;âŒö~ÏN‘Ù3[æ¼Eí³!Ú³10ŸwhMe¾¬û3jýÛ]wcÌzf×gM —v„Ÿ¼Äl†”sl>LAÉéõq¾ØocÏ è™õ˜ Õ#îÙ‹“A;:döC‹µ¾§9rþסÝÓ<—~r•ž›§çr?@Þý(±±9e‡äO-uvo`Py2ÉÌÈÕó–ÃÌukgíHeX‡¦° ï',ö|ÙÏ’¹å-4Fý×ApiU™,ÿÍ×*@Z=ߤ'ÜK¦'LÉíÊïdì`©ƒ mb¬ž«¹Õ3ug”tl1XÐùš½³wâPžZÝxÉñtÀÅó©Îšá"?u'´“ Àëûu$ôÜîÑnø†®ö[OŸl¤ç­ßC“;šÚ‹é»ÅtË®ŒYõÒ‡yåȠçFŽ õÞ Àг£:ð!g'àÈÁ~³¢\$•'ò‘²pðt îB‘v§[ì  œfÙÅî,*G¢¡¯F-£Ã@FV2öXéw t›#t·Èw2øc ü;ƒ$Àá[Sc<1¬#»gOÖdý„ Ú¡¬ôàïˆß®ƒú$An×_õ~È —]mï¬3¼w½á%¡' Ž–%"q†ú­{Nüy'Ú%#®L&ÃxðÙUCßôK¾PóEÉÒaï%K“@/5ô<Ãsÿ˜K3^ë¨ó1Ýp¯|ˆÜ8#yÝágîå˜7dÕ¿”®ÂݦíŽl<œ)ÉtÉ^‚yƒ„ßu"LIá ÷K‚¤¢;:ýoùÒgYëÖg{éÏUP¶Ó–M ŸQ/ý“ðñ,ûß]•Hxg}ÝÛwêHÎ_‡ÛW)”Jˆ8t¾wøR/½!Xª[Ñ/vMÇ×]BXìW`ì½ù—R #KpÔƒQX„<Þíål¥ v¸K‚÷ÂÎrŠæLWf™Nc€ÈƒÎZ-*t(wB”¢U(Ïçîɉޛî€æÙËtµœ±ØPl]Á³zÂüŒ™£5[ýh~E$çw iµ™ß|¤xS €—'/|ž·Q>€ðUÀ¿WQ ©ƒ  ËÙo4î!‡‚¼±/Š.¼Ñ-2mrIeûOx‰¯n:påÀ²‰t{…¬; pRº–aLÛ Ù×kÅÄ;Ѓ¾KXÌÿ½ä¤•óíðEz ©J ÝI˜ò=‹rUß{šdÞcX]pñãŸÁ  XÝ^Cñ8å[7ÊIMÝÌVë·_Œë=U˜&¥åY&fÔ·érï?p÷èJÐZ†{ „š7Ç%ð@ëW-€Nè› ƒ ?û•wÁ¸~o·z uP3¤Ò‹æ9’±Æ,išï”TªÓ5§$”®ªßII¯ÎbɸO?No®ŽŸÎºm:t9†'ê£y£!rj:†ìCÏVð÷T:Ò¶¿I¹½æðUèÍê¸çÞƒ^óÕ¨ƒ{ÞS  â^ó¡ÿxÁ”Õs—¢?ë0Ü#T¯RžEkt‡M¾–àªåå¢u®€‚Ý<ŽS³B{»óPî·×èIƒžY‹aÜñíÅ Y¸—ºQ°cà‡0ü‚öO¤Òš!¸L‰ \„¹9-8P/=–KÒMúq  èÕA‰½rfÛð1fzÜž Jï/Z)(ÃU¡Ï3êl=%°Æa1åàå‘ïeµ]•Öá!î•”šÜž_Œ˜´ хͨ˜9 uø^Óé?0¢v,"*!_å‹¡WV{t4¦Îîw´ª¡—ýY¬Nõ†ú°÷þí|צëôÕæ|ñÙwl¸L{í÷tRVMמhàÕ®ææVÔžºN'÷jhâÉ« Ûd/7©ÚRÕ°MV¯†W§{Æ»vw¯”Šž%á#X'òn:~œ”I%W?‹¨ƒ"@n‰B`R%$­ ŠUR¿ÇžfHp¢‚E`T‡dRf@3w ÎÖY·¼h›Õ€%D÷Òö¤(éN,Ådè5 Ê«%P)e=ÐG8s¯WŽÍΙwÒ‡vÙZäæÏk«jêåpá†eñrŠÙS¯ª%¬ëßXpP8>Cæ·çÐw¤ Põ¼¹lè^Ý) -Ýn*j\ôvåÛ”®ªbsPÊåzb¢?ºJïJsÔc äKIÞ½{¥³N_q·À º{ò¾ÃÁßQï:€VåÞ0X +i†%ãŒãò!(‡=€À:\ƒë„ù#+ê}_E è{ÇAN|ï—Ó”¼‘…î\ÔNøÛ³€”^ôÎúì Ñï]ã6ô©æÏ•.zwKµƒ^ ÷·;¡÷·Ù@ï·!¤¬÷|0±EY1[<n|…¹®ê›þ­Ã(§ÿm/­N*› èï;l6€ü —÷…­AèÅpÍŒó¤ç XÖIRb÷{0žv®žNª¬›”}8ëæúwóúÀNlY^¾¯€Œ½”z뛚zâ…œ©êW+¶gmâ«=lÓáðY‡_5œrîÜP5x½aU¯jSâ M#×`TÁ ÐG(®IhÃépT¬nƒ}päÐÆ DÉÒóÃ/¶íæÙÃ_<ÿwýØn‹É)}dWzAZЇçÇw3ôèÓÁþÒ¼pë_—{ƒ) !ôyhùÄæŠ?´¹>Í3ÀÈLmf޾Jsõ¡¿‡ÎÕWìDTÚIESÌôÜ„‰“‚‰C&€Dž+[ÂuUݯ@ç4lš~ˆЕØ_Dðæ”Oygá€Ò›Ö‡¡G‹cs9LȾ΅…C bÛe¤ˆbå-nW|l°ÍäПezÃA%°)§ú8°4RNõ±·j»»ÀŠ"ô ]#†l”æX)$á¿ °£õáñ3ZsÄϸ6¹ L˜ôìE¯FºCG èÃ7å¡9¸AÓƒË"ö Â:#ˆðj¯®ð6©»Â;྆T£i7*.¢@`Äô¦çË´öÆÐÁù.„B‡MŽý¡¤hëÁh““¢uh}Áè.SS—?%¦öiü²áØf–B%vÑð t °-¸{ž®T£Ùh¥Ù•Ø®Æ NèO¸}Ì»¼a,x¹ ôáì/Ä›¾l ßÖ–­rÁ‰ÝHlóŠsHgÁ‡s÷ù„ur kÝ +û¼iX˼Ú•S+ è¼ÏKœ[Fnâã:N¸F –…¬ïêÉ/Þç’u8Ã%t´8I×áŒ_mêÓ×9ì@ŸÎœÊèJž/Í×\Ñ84¹á\ÉÒ}*Ùsh3¤ÎÜ1ˆ ‰8ƒO ,}–БåW«(óh  4ÜcŽ€>_ë¢ñ¡a0O´¨Ò0cÛ8_Spê´ Ú”G?›Ñ<ÝÀXѹ6‰M ê¦jTÓ ÙqƒÚ!º•ÃãÕ§¸Î ‚>݉›èX¼­"úgõpà§®‘·PGàXx‚ü¡ØXƒÀÙB Ù6«ë ¶î³ºÓeÖy$&×”Eop5ì°Ù< 6yY;ùúŒ%}žšh‚Ù$ÎZѧ¦<݈.Ø$s­‰Ó®JDô­ßÃè6¾Ä4Þª@u þVU¸/i¾Ã7ÄD̾™|½Ûe ˜”š>™]  @ŽþQÊo¶²õ;KÅWâëwABåfˆ7#­¬œÜèS ¬ãScA£_Sÿ橺Y OÖˆÍ[bÑÑAÆÍáAO"ãæ¸6EŠ›J›YïDIó%X¸ð ¯ÃîI&Ý\Žbáà®=Æs0‰Ì ŽEB§Ð© oÏ+x#• É Ò:h –EÃŽÈk½.‹Ž'€§@’0çyî NÏS¢šò‡U­÷,¼Á½i«ÆóÄ9”ß¼øè?¾qhi†+V7.Z‡#<8Ö‰|†N ¹hHw>ÓÀÞ0MºpçäJ Ê2ä;I“ªÄºf˜ß ßaû åp„m`«_'ÌxÁ™|öàèÖ°ùgüÙã‰ÕŸwêÐxò º7õ4‡"|Ý Vtmž<-ªB=×#Ë­m²(Àx4SžØÑñ"¹ÀM8mÕã©|Ú <ÍëнÑSJÝiCI<Ö;°ÇèÓ‚{ähø8®kNOžùޤ/ÿä1[×Tþ„ÜŽ±Öo7À0°aÂàñåÎÀ„ÒÄP Œ@)0Ôe€)ólŠ6¡ÝÈðØŒ‡`¦%—úšö̺q¹[OÝ]ÉOt°µçñ´Ð••'RlÔa3ÊMøb\ç5™.wù›úxG‹òÕ_×£- 7ÛØÆÔã¹Òna̸«Xú¶«ŽGË×<Þ³\Jý–Üϱgcéá<Þ:X©94ÑjLH;ÔÖ¿ybúœkxóˆK‡Ò[}O!âÓJø®Á‡ˆ~!Ðî´áX8p&áV®÷X LJå|†‹ùU¾n q/Ö¶ÚÝ,aC…éÙÒn&>(ýëñÀ¦ì¡˜h¿ƒ ÇÃŽtôx¶î¦¼’F„ ûéy>I ô¼%Ðê÷uv׹ʺ\7 g޶BfêK¶'ȃÍ*0+2’•°Ñ+D¨DW¥Âƒ5};RÛéJáÇS”/m€†`ýá¾—‘®µÊ’ݵ;T{p 2yÎÃóˆÔ/'à€­1R:®ª2†‘Ì¥†é<ð íRK”N¸ÅðiTéxâdØ3[àçLWÉylX{|$å±áv2R~‰-<êPÿS´F‚¼ûvtW"­ZHR &)ä'Sßå¦/]×”Wÿ’ÙÂãQåâ6¤¹±~m(®™°Œäø´ü„¨™PŒäôþ@GV¹ÄõHš{'*o*±#jò¢º¥±ÿe7‚£ã.5ªÅã.««1¾Bªd 5碛wÞŠ˜ÖÁ¡„Lns© BåF¬U䇮kBÉKèg©¶#h¹ûi^`WÈHóÉ7ú‚‘¦ƒ°ñHÍ÷o6¬wL¾Þ>»l…㦇ñdW‚NÆXøáCþßZmÑþHuZ‡ÝjlRÉa·¤œñr^¬˜ò‚áŽÄÑ&l °Ø¤‡™1½~{]O,©‹ÿĵdÉ=ÍèaJê‰iýÆ2ñ#RDÚé/¶ã‘^>µ‘XÌÆ¦½ò ¸R(X@á*›ñ-FbòM é@•í…;’ïZä ô¹zpëG×Ò@Ñûu(ÚHÚ83Söå<ت„qÈЇl„m;˜”oZÖ2QöV /±-¦<=ôHï¾ÝÀ:x3ò²FÂêDJ?c”Ÿ•äã§‘ õ³opd­ãô„FuænžfNµ52ŒÅ]ÄÜuâ®Äÿ12]YȡǺôƒðò{^"M?øÒ!Á:X˜¶âŸ—9ÒÁí4¯é¢‹Ê.pܬX—\þŠŒ'¤¾Õ¹:9#Gv®Îú‚‘«sd={‹JÖvò(ÛÈš@éN.Ön õ7Ý/9PRƒ1úqŒÌò&ýNˆYg÷”)íJ4`'æÒd‹!Å£b dD¶áa 'ß}IªV ¡¾ª±HÀº(|¶àÕ"ñ³Çv7«jô~Áíé  X5"Óù`Õ%Îr¹Áø*ŠÍŸ'yJö,®E‹hŸn©¼d÷.®]MµMd„I\ = ™“kèI|T®® eŽ„=ƒójû%®°}o錶„×’Yw†–BŽɯ˜ØŽ£T`Ét‡ŒÌõrGt€£@ˆïˆ $Ü6²‘Úl+qä BPê¼Y§ `¾C©¯þ4ªšpt\çׄÝa¦‘u÷ ¹;ì É[Œçñ\Qì‘Ém³wиH.ØyÊÞyÀc0J²7ì‚B·q¹y‚xšvžˆ-é€Cô[LY&ç¿2n‘Œë{x@ÃA Ê£8‚`ž½hHf¯Ït;ã¹™¨úŒÀ4ÀPüLMi`€ÕaÓÅ ”ƒwkŒ~¯B=®\*5|ë\ =C§y ˾ ßlPL—08ØIŠ2wJr´6ÖE` §88åFc¬ãä©xøÁ(wÅ3nÝ„)>.÷-“˜d˜‚!¦2ën%,°âDÑt‡âDÑd£¼ì|‹½X›hÇl`ì´mˆ¼z“ÇRãZ¿»œ#Ù@ÓPÄ€—²²ãë}íÀ17Šã֘МOºÌX:âÛ¦/|WS^º¸ø8õ¹G‹Èød”ëWi‰hÞM†^éŸ*ÁÉ&‚QÚ^:¿†¥Cáð- c:Ã:#Ã!ÈÀ<åb"H»«µ[GVh5'Áà"ñÊê¨+¬£À%&‚’) ×ïxH= UÊKŒ¨Þ½T#û& 5¿OÐÝ ãð $…Ø^Š9ÐDCÜöþ‡lÛŽT7ËϵHµ\Ì6CIª/,…J„ÑB8\F_¼©p`cO{ì6â 5H$†…ú;ƒ\}Ÿr¨mXês”z[ЏZ ›“>°†Ì ÎYkÔÁ4Cœ½s€†aˆ³w®±æ3fQ™¹SȃZ¤2¨sòG}>Ñ„‘VnÔ°éTz·¶—û¨o#T š¨±ÈÏ>¿uÏOä+˜ñ"ùSݨ7ofóäyC_2o ».É!sÖA%9²ÿGuîλ‡mVß|º>a»³O›ù¨ *›ù¨/r›Q_ä6Å»†3ж¢pÄ<ÞxM‹ýkÆ ð—â§E“vÇnÄ’äoÌ;ªé„ÚP¯ ‹ƒ eT{*Ǫžn¦ï²íýv˜¢ÉK´þî÷Ç–¨Œéì°ü ãð ðM8»Q§ÎY¦H=§lŽDzóÛc³3JÌ­GOú/þD¡GHP>×'=u®ž•£QçêY9öñ¨ž•3X·!¯fw›á»p¡åÏRË^jE£ÃI+&à:«î DwF½Ó@áá<ðÑ0a„ðŒzW¦°¬„;¼GÇp:¥Pm{å°+ÜH|é¨ÍÕ^¤¶z'j‘}úÒ°/Ì /‘iv9G½2Ay+Fpd’yÀÂÝH±Õ9HG%¿Í©© ¤4¬èY ·»ð¦=>¤Uëá¥ç´—Ø!$%íÑ ;>€ˆËh¨¼n÷ÞqűP ¾WdR楤Åe*¾X¹ÄÖhuOt=- ×€‰Y'\«cÂh‹ˆËwOOx´1ÁH°GÍèÏs[ uj 'í<ÁlÅŠ í4™àîú&q»`ëO$¡q…)z Ph©ý– |ô0\¢{ëƒßn4·sr\F3ÏZQÂÇѼÛ-Ãh^m4~ã‹ÅS¦„b HÆ[É^¸Í÷µ Ú)öI›@ªÜpáM„§¶ÏxüDMK^ïj]‹–åά™òv¬¢ÝC«Äk:ÀgeA–bjJá9@g0Ú8nsÒæ£\° Œæf0¤ý)÷`NÂØ°ØçFP1´T 8m†å}®bŸ…pÏœm§Åy'»ãΜXgØ 1úèº/óNQž38ÿË3 W«_i J¢±µSaé—´†ö{ùÄ©÷Ga€™µho&# ]W—$“KÇI');­átˆÖáê„Î'Dˆ;¿eËUNù¬œÚ‰ßWqÖ ,Ýub/›³çLFF˜~íí ¨dï¿f¤‘ #X‚”Qö•°tÏb¡ð.Õ|‘ª<ºsd „vFå‚Þ(ðè0 }ÇæEX­µ$/8ÖhNÕBcŽ]_>1Ó ð[`Hp›{`€v R¹ÎíÆ¹üGgäH”hÏM®<îé¢fKq¨ö@†Ô`¥KT£ßŽzèžU hØF¯;‚‚Åx(1Æ=@¾¦!69ý”ñ]rg Ÿ}„ÒðÀáÄnb塇~âslж L4äïø7Ébüä'þ½É|ËïÀöÁèN½ÁË<¶zÑÍÈÁNé`û u]Þ2O»¥¨)jà ÕÍ>0º%çØØL¹·åηtŒ€ )¯[¹/Äu-hCàF>LKgfM­;£˜ÈuOˆãèÞGVŒÊü¼ Æ ¼pËŸm,£ÑˆÍè§´´ìL›KКõà~ùî¦1šÕÃnƒ-i²ïÉý èa·AªÆè‡Z]k-óµ§V>¥û߬æØäCšóÑÃ#Á°—Œ¡© <c_dà›t`€³`Ò[Òæƒ1îJÁµh:D• òÀ-cæ¶0êÝ•y·¡gYǦ|å™0å•vÀ¨ý˜#*í`‡I¢=Æ]éS§pñ»cIÀAÏÐZ¢ÜчSáPçxÛ×äH^´Cñ£É5b`›ºO£ñ¾#"áa!»Q¦a¦ GM4µ·gž°f2(Xê¼Ü_a¼ÑÃÒéN}2jº6MlýgÓÜ“,ËHV(Ôp~µõ´u"ŒqeæÔa$Í[¶“m=°àÆ«eW«'G…ÁÝòÜA~¼™ØÆ´í†KmÛ ÷^á–ÍÜ>üÇ U<÷¶l”v ÐÕ2–2 ìÛ½úƒ‰To¢*†ù7vš;NÎÜ·éõ×T¤Îk«iMž>…øíºH³QVÚrº­MðB®Œ1*ö{àì…V0Ç=F¿ãœl9va Í>ôü+–V„aÅrv]ºl46aø˜ó³G ì꘶Õ`û¶Õ$u²SoòF £®ØMÙÝù Ðìï€í=ùÎÐ%[Ç;&B¯ó¹˜@‰q¯›sûB(wNçË4Ö,|v>œjŒ§\ú´vfhA]‡t6£#‚.[ôÖ°>~Š?€ž4ÝÏGgM&Ì'ÄnPcaZQ®£ÉÖ¬Û’ßz>ÇÁ¦õiŠ­C>Ñ…ùL4\Óó5G±¿ÁÕ”MôL ,U›ÂÑ ‚CEêOó¹"ÞKKxB›x"iÇd<½PahÞ`f5y}Òùpl½˜+ ¶yEÁw²ÒgcÖ•ÀÓ$çÀ»ŸÜ°‹©M–ÝB¹³&„ù8:m¦—'’µ?^Ým‡'_ïDÝÄ£¦;éÑe†&¶çùø2£â<Ÿ[”kí"O¾4ÙùÔ»úìD´ybºtuЗœ )VXª¶XßÿÀ|îbLÓ¯Â5ǃ˜î|Èß™|ѵ“Eþ¡¤wVÀ„]3/=‘ĺUû ¢Ë(0×qbjΧçóD.ç4ÊÄ~tÎhø,Êlî#ÜõâŒf«úh°NÈQ¾ç]ì­/qFŒ¤WBl,H& 1áëòÐNE L°Ìg„È…<<–< .HÖ¾¢cKUä0YCS™–šÏÍÔ¢6Vc¼÷Ëùè=A@ôçÜMœé"¶œÈêŒ9íŒó¹öê¾íÏœÎcN]~>^ê“N†» ÷|X'ú‚ÙÌ9&vO1eà!,¤tç²Òb¸÷Ð…À:ø”èotJ½µaJ.q5ÓÙjX©´–Sr•XlRõìžNéùx1MMP Ìäxš™T]}e*W”y’˜Ì‚Œ‰­åƒóy5Jp½¼K4Í”n¸Eã‹éXÉ8'öÍÀ L;S¾ÉŒ&ü¬ëPΚ€ð |¾äœ›k`Î3_\ Ë¿¿yT³\\ B3yi“™øÄò£Å`,欄 ðþuê¢N± €™>×ü]çèO%ãmó<,¸îgº–Óég¨¦¸þŽUxÀíÁLK› C˜ÉÈm*Ü?J{}®âX{­ðl@©2îÒd@3Àju§šôYÀc&ya¾}¥%©¿å.^Åx&7H'’;Ö¡è‡Vž‘ð¼üc*¿äÿVå5A¿‡´OÕSÏg` ˜h¦õ#.w¦‰ þiLý`Ù˜É }B€²+,Ÿ“Ön¶ I=ñ‰“4È÷'¸ fö´O$“4ÚU¹˜£{>ª„¾Ó t‰C;Œ.¶ ƒ™o Q¥©wðní!³®G#å Ã츅aV"Ï oþÌNäI—Û:q ø™?ƒf`F›¤€·³–ýD%“f¾|“uBXsfe±ÙM:{uœIç„Åx:¼CÛuj` Ääœ>Š'‚Ç/¦Ù‰\3¸(¼ ¤LÐó XϱïûQjä”Na–FxšN¤¡öl \47ÑÀÌìi'˜ ˜F4À®Ç&“Mmļƶ»€s£fw.V>¦ßëü#Ã󺙚›i€Àñ™ç¦ìF\~º]CóH™\×Z›;‘wŒ[X2Ú>Â`ØøŽªúÂùrˆü<š9Ûx) ¯ÚÉô‚Í<¦aê¼¶hJG LpÌq›`èk@Ôá¦ÍUõBá½QZºAÍ›Q–ŠBöjlJÚÌ3,Ê«þ‰\3l€¢T±êŸ¸:èá´°×vd* ˜‘—÷*»¶Üäëií ÈsÔ½ô³xÁŠ¡öª¬˜y—kê 8–bz©})ø f¹™nFº±v°¿q‘dzŠòæ—ýÌŠC¬UpÂåzÑç´4šáAH÷€Õœ…’wh•”Î@ÒÆY.­v‚o V¸™…5ÛнþÀÇúæ3Á5pô}D‰®»’š'\§HéôGpgDõ¾\s¹•‘Ž6EC,» õ<Èñwù,Ìþ¸”“ -oZx#º®™ϸ®Ê‚Y¼þçD&î,^ÿsÒp+â:ðÚ^UùçëwºÐ(;˜C{ ¨=pöŒÈZähÀF^$n”¹ÅFCÐÌË©«U)B½©õ{v§nQì@¿Ê³âŸ.xÁ±|HÂWÊór/ñ½Gð£c¢1A@°»•,.Ø^ªzq²=^ܱª*”P”^•Y¶G¡@U “8¢êœ ,˜¥ßô, _ìz^qB:B>¦\¢øý.•S9¯”BÒ‰u‚!ÔÄ{Õ[?ÝT ëD;¡×YôîOAïˆæ™ Xj*K}8Ç‚ýYFD0Ie* “¬äžE ¶ïF*ÏZØ7Ú‰Ï2N_3><­ÈûšÒ6$¦©p‹øŽ™nsA9éê•qŽ•3àð€Of. 1ï9pµŠ…ÔÓs‹ÒI÷0 •ÞÓž0¯¼°‰LÃ){ëéËtAˆ~ÂÞÄÞ”SvºZïÂ(ż›îãT°<¿# À#v´S´ìô¶ ›‡ÈÒȦQE&>—¥ ‡°gïÀP3¼¤z/h£’Š9 Û—&ÊiýîCR‚u`ê<9#îRìSX_©ÇXEHwSôËÇLQ‚ÜOd” )<—K"÷ÔN${à{ÊU©DàuTÛÙµ›¤<î‡J-פ¦a7Cá)ì–Ý_ïgýš 5˜RÜÜ”Ì+“= ¤ãMc!ƒ)×tP¤Ä²Óƒ'‚n)å¥[Ê º4À'_@Š)(d ˆ´Ú§ òS¤\Aæ R‚u[ˆ%ßði V iI =‰ì) ûGbñYXò͸FÁÑȼ©ù°£NáfsÁQ¦pÏ Æ =ë ëRhéåÜ ¯¼ÇE9¨Ö åÂûÌ×9^Ì×qÅ…Ú,¬,í.”9ÑµÒæÝõ€Hçèßㇷz\ž¯I?Ò Ó2AB°.üá=ú8 ¦b5*bJ¥N±ËT&Ù–=š€ùÀ…váöœ×ZííäÒ¯?Ð N%=A2ãïS8IÏ–Ûè·ãøå¹´è‚,§ß$á€\Žö-‚õ’‚)ÃãóS ­oÖðçúª1îè(rÚJ òÿë“ÃWÁv‘yÜÔ¬-ZŸ¸Ü'«…†åN0Ðj —îÙqX¼Þl=S {ƒÿÀ›h“^µto‚ÈKÅ &8 ÖÙ¤ÄøWgï›H¼ º5ã³Ù@'&r„O@Oi®[×kOb±‚\­•Á%cš5ÝÊÚú/Hn…ƒö`7ÓIÆgfx,à6Ý®ŽwÔÎ ¸n¼ XÆUù:&8.'i¥kÓÅÌíåÂ…9øá•é:g"Éà&X‡ãêU>Πª‘hÄT5XM³f÷ª¢dᬯW`[ ²±ópªêVÃDLkÖ°å‹3Mx&ö2ÎZ (– t–zœlômn ¶ånR Jnµba žñ°•ñêTÒĵ´«zï¬r®T7«Û»Oݬ:ÓÍ$ù@TÆ‘Ö3MPm´}öNû¿Ö 'voÓ Z5T µ{ìù»ÀûuM‰bˆ¥HNÇT|EU5F˲÷Så¾€ÒZÍD¼¶â¬¬™³¥+¶ÿËaY[ЄØ°‹ª“ÝLà.f=d7JD≆ÂQrþìò¬íx¤_e©„œ²oØ´¢)6áWÄh—Ž 3ùÿÇÖ•$HŽÂÀû¼¢ž`6!þÿ±!B,Ùsðt9½bÐ í’*gEÌYählo¸îWs^& —|VÌã2ïW4Hp¹Êéô…†¦ª¯ôã›f'êÑoMßòž·M˜"Ürí;7®fï{aë:]ßWùǸ¯…\M» )ˆô‰vèhVzSäXTAÔwÀ1¶d€G»tÒÃÖÁ¥“ÌÝlêDM\ÂÕ¬¼;s¡G¬K›íBý¥‚|‡„‰WJ p äü–[Ì|¬B°£¯+jŒ< ÖÃ>gµ~ÕÓ†Êm¬³ÞBx¥›ßÁÒÃ×ü˜Å Ãæ:¸†¼IBG?0Ð{tÈ¡¼‘[±ÞfĶäTâ4‰u1ÀkFÆpÈm3È'îz¾SÊ—ÓÚi‘ ¿|ågâ㹡†Á Cy lì5x›“±Î9V ­bP’pné{Àï—•Ý;Á8Üü7¯éFp)×J;Á}jÔû$ ØòäG~:µ>å¡ãwy™à†8ÕƒÂÿ!·â°sð£Õ&u‘®ˆY“ØødGÿªÏýí‚Ò0ÏÈrµƒ³ÌKÎy-9ð“ ±Öâî½c“¥zăº)Ó¸¹â| sÇ)‹FyüÜ÷…þOûô²zßéì͆Q„7ÛŸ‡/ñ¥¤Í®8†ñg‘5 \í·DÇ‚‡},“JÊŒ|w S>÷µ ÀÅexÀU0Äex1§L+«pǹFƒÈn·Q#€¬1lÇô‰¸0 Û®®ÈPfL[.pzØè: ˜ðÕô€’aþ´+›°ÅËÕ^‚ü<ÌžÐOrˆÖЬ)š |ιٱ¼kDªè”ÓñˆIœeÏ¢«y”)eÜ÷šÊH&ÝØ2 ågÒ qO5|(7¸¡@ð q 0+Œ@5³Ã­wj5EÓ% ssè@DŸ(j·+˜Ø?ÁØX¯]Ä)hõÄ>ºó'|ìÃ<6y¨[§ñÀx}l~4÷Zº§?u:&÷ˆa5) ‰Îßè·=¨< YÀÛˆúº‡`ã©õx ÏÁè;Ðfר$yZU‘¦{ºÓ=tk}«7öµËW< ”8«…Ä,ü › ·ÇPÛÓx³ª[C;¤]-ô“‡µÀ>µIæ1zŒ‘ŠÀÙL–£ï+àˆò×±ë¬ì-v\qÙ3¯y뎾½ «}'x°ð8tÙ­œäFb&†ˆp«¡¦ËŒ×Yʇ좙§Øè¢u7Àv£W‡bœr#(À€ëüT˜ PÀ ¯7?ü—úfÍ’vÅ+›íø Žñ’í«5”sX8Mc±ŒÎøËŠà¬þ-õ[&‡Hmˆ•a„N¯“`ëu0¿Ôc#ÈøÁ »ø¦Œè‚Í~Öœ4Hïè ®æySè_Uf5B@`éÝ%Píw'#T®_BHZˆ‡çcô Z5$H?ã@’§f¬Ó£ìýI×-.‚Ñ-ØæÆ1#ïvÎÂíð¹ÃÕ%kKæ_tj©Ù%¥ Eûéx%ŠC^æâhÚÓC8sq¨·PMÝÊC¸ F¿å¡£“õ¨†º~ŒVµ÷+¶c/ÜÑ¡ƒã³kÍ€më[ ¯ÅWý-A‹PÝÀ î=:¼ÀÙv/)Ù˜Æ=P9<N eB]5ì ý¢äh]®[êrèR7â9õ»bH?^óŠ!0 ŒMG@1-³ËÿwËK‰eJüµõ탥Xv0îü^±ïFW•÷6úrß½¨rßÎÇÃAí[¡º³!Û7¹î†fg¦ƒ^àLcµæ¨YbZiw§~5xAérsWÄxdBöÜã#ÀPg1+[2¬òÔ3½}©8†Þ¾Ôà‹¡e›l4–]ÁU57ô¤w²²oÐ5áHI Q-¡2rn'&;Ëg„¼×iƒÑ¨—7†½zäs¦*!Á6 Çã'€c`è ´} ø à˜×µó{]Éñí BÃ^½tK‡ày *®æx#ÓÈü!‘gŸØ‹ FEcõJ_çfî 榭wøãÖqÆöæ§•Ö)ŒfßüÁ§òð…e‡ùÇ«‚Ü`ìQà\€÷¤r㪠÷zãɃÕ/’í@æ1W]€ŽàD¸>=‡W}‚ä[3Íú„ÍF°fzÓD0PKÖG©áÈŠN熹ŸnõññyÙˆÛ·¾O{䜨ÛuÆê-z›ÂУk¨_©YÝ-ÚÆD@‚,‘ˆ®ÓüÝ­s„ÈTŠ0ñß8tK7òeªÄÕi¬” ÷îxìåä¨×®mªƒ¡—øf˜ü;y6¹Í±—x–yŒQ5^åTx [)g¡w)y$XGÈÒÌ?cã»à‘e i\C\´ãäu2þ¸/Œ¹ à5´Óx Ä)2F ,»¹±‘¾h§[°¼$Šá0[GŠÁ ðX@ð¥}·b‡•M©ÄaNÏ ønŽ-—ŠZ»v'xçÆÈ!N–mßqѹyôhÆX¸?,󹹓Ä c8ä4ÊrÇpÈiPTŒáÓ`&›‰ŽƒòÊ·?(´·<.°œûXe÷’]§¼qÎÌÜÃð@ˆÍa@‚f‚¹9=^È÷Ðn«-jë@£}DL*AeG€’üâS“° Æ0ª8ư¿“  ¨åBð„x(|Pd?7ê.8. ɹ1nqè@Vr<½ãùêýs±?äF³ng4!ªõwÂMÏ CÅ£À­Ù@7¼C[–G8Ä4󀄦hÈƸ°5ö5ëÑd»²ìh?HB´eœc8`ðÃË!¢lŒ|Ôc®ƒ‚àéL0PT;ûy°’àEvCXT×¹`0Ub<y ßð °Zó÷í/4ŒÞrÍ]ò¼Ö<Ž ™ƒL‰7Ì׎m·Ê·„–óÁQÅ»ÝZnTc— V<ÜE»‰mÐMÛ“6à¬[¾®LèynLð–=6ÁØ|ÂÎ2"° šêAŒâ7t½ö4n2Xöž°T¬5NœùóØl”*þ|ü¼Ÿ5ñÑoŒ »8Œ§«b®–ÈÛQ‰ƒ0°ì†–DZs€ŠOcÛ¹U÷,™e­ªç?HwÅ ö¤=ÄÁ•û7[QÚÝœ%)íp€£/ÈÆÐfà7±váé ‡¶8tT·=ÇH¢O¾€—xº‚±¶žp3øÃ¶y¿ Ǿž !sØj¸€‚`Ÿ[–Õ·ëtB'ù¯Z9’$|¤¶{Š;çop…ÀŒ¾Êå Yxt\äQÙ]´Ù®²ž¾òéC¹'[5À0€å;íoÙÕýiÖ„ó9 šŸ¶º­„Ctùv€l £í·]Qy-Ôy|¶mÚaƒ£ª(MêÕè÷ Þ:;;!Q“ a/ÿiZ’;QS%׈”˜¾ã>â·ñ¦É³ÚY®Á´~*kñ!wâ+åp^¬œ\„ßçz76¤•Âø]Ø’%`µ±ûÐÝ’Êê#¡œµB*'áÎFKóàGv€¡æÛ3—ã³l…– Ÿ6 ²Á•>uAvÂD’úy¶JТÆ,€Ÿíæ~*TN–[§ÚŠ Ìnàß©³ÓöºöµsVY6E³^½ü[´.»5y[pÔ³$èxy]ˆ`øÆÄà¯þç9Ù°‡Ÿª·¬8¤‰¹²qðBÈ´®6\®¢ÆÞMhÔ‘ÈoŒh« \pÝœ?ˆ9Ö/[»IŽÉQhøw7"Öx rÕù vâ7á¯xÇÉ‚@¦TJS…¥ÓÿO`®bÇs#¢%Ä^¾»ØcMÊB=u§Ÿµ\¢N˨H()¸4•M8€}Åæg2qgø‰k«A÷Ä5i¬Î`H&²Õ'í2ëË>6UÃoâ!ÑeØ¥ô½7–ºý–r»×£SÎNj°}i~–ò°­Ÿ~ÊWfg™Æ‰5l(¯Å¬VÆ‚+bKtq€³ZàEa»×á:â„øùÁÒ£.Ȧ^¸Eq]úqtXmƒ#ÊsV§O2ß /· q‡‹{‘iÆœÉܲ؛–WþÂE1¢Ù:šâOáŸN¸¢w,v9;!ÑHÙ¤[kéñôä …Ôl׉²B¥äX-ƒßQ³=Å¥çâÂgä»$6³=)ÞÆå’Cf³w¯[—™Z¶ö¦(£/#ŸžHtçÝ;ÒŽk6ëâE+·r˜ú.¶'#ÒŠô1w>rö£K÷muSß…F\ÒÔH7åâˆ1qlµ‰ -³8g »0¶òËçCM§Œ-:á–‹m£%˜M1d¨­Š™ €ªb/ß1“±]¾N¶ùw‘xØÅm=ü1—÷&ù½€¢‡#©M¸QÐ2¿Ž1bÙõÉ? 'w£­È2ÌX‡‡ßèâùïÓPÝS–‚ŶNCô»"IM¬m*Ù&úõÎÊ~–af¸ö£ZÅp‡gžd¦«X3µè3üðŸRs&~¦ºÉF3‡ØÎ“ÞDwiï¼6Æ”Ä'«ô}N \”²<<$ó„n[?Ô&G˜Žn¤`©!î[P€„˜µÂÒ«-®:b}8Ài°L ¶8ð¾Ü )â¶œ_·*†˜».XŸÌvÝmýI{à÷òØsY¿ñW¤ýÆžÞo"åZsPq¥Kš +Ι¿ü€V$ñÈÍ»3~  ý|Ä ¡Vlé8ࡌø æZ9×|xnº¿o=öÔ­á¬Åljçâöð¤ºà•58ÕMܽæäŸçP™92ì=D@rzOAKjõ§Tn×Ô- B–CÕÆ¢º¬§Ò†ÆŸ b¡î*Ö*sù°;ÓÍÈ¿s¹ØÝ’“a%ÙÖá “¬ý.†Š<iÜʞ܇‹oQN‚i€ù»tn×ì2sµÜzY¼pbÁâm1ƒ´EùfÇVK¾‡‡£Š)Ùž,§ õPj‰=z»&;Ýö;·¡Ð (;çeóšGíb&3„»öC×̘tÝÆQ{ ØÂ°Âyø·ð;G¸¸5–A(Öä«®–Ûh-±ÿ]uÂQe·^Â4h„Å#Æ\{êWµLéËü*ôÖŠê…Þeéθ-ÕŽ áK:‰˜ F‰P'ogÉ‹•ìaÇÄo€dØÃ%ß·P›ÝèÎú¥Ã)Ì]5)²©>øj$v?ùwü²— œÞ`Ç|Xë J®+oqàâRf͆RϳòÑ/Å-Ø“ÜHš€ØFN5%ЩN ܬÝ8:8 /ÞF]×2üÄ¥z+t‘K&ùÝA4!¯@Ö ƒ”õpw7Ú~Í˃J=V¿-†òσ·_n;~k&mÂËØ}¨Qž¤ZÔº~êoܹe ´S;¾9–Xsz`¿MåV‹-ÃßâzY¾`MNçV~”š–"¨Évž4&ž r×¹7¤lý‚Ú•žì q|æ|ºY ftpæ±™÷Ënê×lÛr® ¬~Ó $®únF4ùW&¬ÞæAz Ûå™WzpõÊØ|¥? ü-²ÇøŸôð¬ôaj¡¤ÅÀK”øœ#8€Ž9¼¥‰Xµè{-þY ¿ìg-|Ö[’‹?xÜm&AçuQ—ôCFßKÀacO=ÈMüÕ{\“è-F€sÌ~߸tkÝåf| zïz($Ùý<¨^- ï›úÒ?ÕX58%­µU×w¶.#``:„r0 i”èVúÕ'Ëj³‹,éU©ö5„='¾*‰*N|…]§ R®u“Ph ’Ý žL­«œCD¯øê}ú*vû±Í$^9\t í"„óÐÉÉý]#¦>åiIÁÚWZ¨vÛéxCzlnº #2ì>/â5ÕpY>k?:¦¡×t»•Äê­NPR`×±o!GENX,[©j ¤U6Õ»¦DS“ëzîÔ/bÍný&^ÃêÇv¬[w<…3­ f„„&}=ì4=[ ê™yƒ%`NÓVú]•FG³ý±EE&X ½~ñpŲjß2k*’í;ƒKc{nAúÁHHT ‚ 6¶d¿-¿&eûìʦw3s®ý9is¹˜"®Ÿ]zËT"•pãK4dÛWj#-¹b* Ååƒ,Œ‹fÓ™i1z‰)ý[Û”Ûú¬ÙÀy}HoÙ¹¾nÅxåBãWJ8*³•É"S@m",N h2Y;_–b‡¥í€þ¶ˆÂN¾RõÓš™³Åo¸Â6íéZ=N;4ùStÅæÖE¿¸xQ „þËÿmñƒ¸,îâVwkvw„Í.Hzƒ· ›8°Ëõ‘UE“e/Šõh:_p>W‘g è’…øW£Kvžz;aòŒ(û±žVl¤&ÍÏuíI”¶<ï¯òõÄ|¿ mŠv†$Yĵí«Åòå`­8®þjB³FZwQÔDNû{iüF½×º‹5:”—~"³r/7{PœÃ z´Û¶t[ÍÖ–Å|1î\ºI… UÂ}Ú NâC”þÊP¦¥š×°Mí.{}Q…5½ëÔØS®«È\Ky9CÂŽÎÔ (ƉJcßìI\5› ãÔèäzÑØªþ¸&mØåýò2 eÝ-ɧrß7f|?†ÔÓ'ôÅäsr µÖ›ƒÙ>—lhÃv¹HV£³%»@‹«œIçý–(¶£{´^ã®%ÀèíÒFÛâÆ €ÔÄ’œK8’Y{ˆÒgx´ðrÉ®d]ÀÙë8ýÄp€ Â'•´KÃ+ÿ (”¶±\£Œ*µˆúÐ1ˆmY»Vë/X!PŸ §XÃrò€Õ@ÈÒL›HöJ?LòŠ*™fÞt“üR’ìª'’¿ ·öŠÓìa5ÂïáU‹Õ~YqÔ‚lå{Gšò3D«ÍÔË•±o·ÖT…Pêxo ¯Óç¶a)ŧQ¥ÚvAT„Þ·ȶ±¶ipI†ƒêIÊ=$øQìÆîF[ZçÖÍÔQ "ÞÅÔW¼Ǻ™Ð&„ÁuÞ›7šž×¥O&Í)adPÚRÂp¥xRª“›)CLòd{Õˆ|²>Riv¡±}ë£Îæ*¿i0¡šG±m9Z6$á7Ò«?ÇCS„^Gd?4ðWá)ùQo»Y|gžK¼àæ°c),ð&çC;€c‹)=1’³VElu{u&T`bårW»ï%ÞØ¿kñ#-]zæ4ÚͱÏzÿ‚µ+ëm%ùük÷ot.sŸAÑWª& †t‡gß¹>ãªÙOlÆHDw©¶X G>ƒ¼¢~º¼1i¿£‹|}F%½ŸÃÀ¸: ÁæXêZ->#7ÀX?j`š)v/}@Ö {6:”^k‰‚)ÓÑ©Ôúçƒ*{Då4ÌP‹¦”–Á±v¤|c›Î°&Fj»/vºzÇê óõt^g!ªwL‚×)6LÅfû°£\ôChŸ÷ãšu   zæ ¥¼“±ç¨bû•\¿)3É,¦,ëcw*Œ‡÷B 3§jº,¡ æf­êNOlóV&ûÃ~¸Óa~¢šyo„O×åK[õ­ÑzŽ4VØ•`ëƒEXnlµY¿óÇí zôËÀT;çf/Ì”`Î{ûä!‹Å±]C “ §Ÿ»ÒÁ-åýL„õê–cg2¬o…ÖéÞ&ŒUÑ‚=§õ ¥EIÖk¼4KÀEÕÏ[ æ`öº‡¶‚?¾¸@²‡2Ô­éNo­oÿŒPoNŒÓðjŸÁB?]lÉxÿT-ãw»²¼½É©ÝÂ_ý\¤^€óc”°Ç¾ðìlþH—´ ïƒSºCJá§L¿WÂøÜ³ ª#É_ˆ˜éZ$ Yu9hVð{MÃÅg“öÐéõî_(“Þ½l`Ö¬cAf>·G‹&c.Q§\ÀlE»î5äXí‡ÖÚy=‘Q[š‡× ÄnI3Éö$áƒ0éè2`ÖKg\¨ÙÛ^íÔZ®;þ`¨q¯r¨_óì›ÜýÄ´5±YÑ9—L°m¾@®"šW‡<ÃD!8ˆ[i$;Å–ø­Ø0‡‡& Ä ±?o´ÏÛò­êtÄBiS7¡>è±çö¢HAÝéPàÂ<Ñ?ŽHÜ®ÄYgHvã¼7-öø1/h%[¾ä*!¨¾õ“sûÁJ‘ÆôzÖ ÒÏNØ\#è—„^HÔk¯V@¥7à(‰.«Z¼Q à©Éy–û:γTêa°¦ï©ñÅú·YÒñ×øó- æjÈ­†wZߘ*@©ÙµsÈæÖ²AÀ¢þÃ_Ñ/ïa9²/r4—=´É†|Š·À–Îxö’ÞEKûü—/¶]‹DéHkÉþ9N›¯Tº)m+†·ØPAD°‚üg;ÁÏ­)¥ÅNÓ{t\Oço„6µ;™©Õ¶û‰©ú´º´Ãx¡€bó êàL¬…î/V×<ÙçóŨÕÔ›•ž›²ÚŒ8G\gU›þme^ù®Ï<0€bõßŒŽ™îr3¥³§ÍÏ]:fz¨Zˆ¬¨o–|‚<Å~et°#7Á½“r{¸”€½«jÚ‰xÈÏû0ƨÞSS:o*ûiÅvž6£Åj"·’nÊô‰>&0†ÅWçbÏå…Á_#ÔçbÇÞ{sÊ” ö‰C•°ÞHø1YóuÝÝ ky> å;ìƒU"5?#;õ¸"ÜÓÚzíœ ˜9‡+3Cþ·Ú8µ^GdÿàOüOÉ#¦Ì@S].»!7[‰Õr–K$¸Aya¶kNªîÈOÁ-˜9¦#Zýy§Û%ÉQ!ÖZ×ÐÐÓSõ#bßyìge(rósؤ‰¤ãäLX<=.e¢ÝÎ;M°¾í¨óšˆažÓ ÁdaÿVƒmìòÏ7Áþú5+5æ>Á`VgÐWcææß•_š¶©É„f=…œ´»‡¯›˜Œ]Šhi¼që¦ ^|òÔOÿÏ'gèÂ'ÞÔ6ø«_n~Áe3’˦ãoWà„tˆ?± õJéõ¹("—jÑ_¤žs`P©¥Û£ Q>|]npVêܤAhÜcáŠOBjLßI¦AôßBSäñ€õ#‚ÿ2¨¸†Õpó Š>£­Ó¢ôjáx‚Ͷ{Ö2€èf)Jn™dR=µ"ƒîÙ°ÆïÈ38h)ã‹øñV¶Ðþ¿?}½ªAµ6|éì jÛòGíªgÜÂüÄâlšQm—³icëãÄ„ J­‰ Ü•Bí´u»G1¥6.ïs¶LÝè߆áržxÒr»œd2ŸV‚Dîàa&ÀN>?õX†k]SÐ0"ÃpYõcãŠF·íÕ(Åñ¬fØ¥f€ÖÜ*sRú½ÖÂà¦LI}ßO °M¬.ÑÊ×Xµf‰¬ )r€dâÝôb^eØ“Tâ/ e™uO—¨åÐóÛ¶¨ ‚<áýü“ðÖmOU›ah+¯Ú®~¬œ»Ž°ÑEŽeS5Ù;ZÙ¢%¥:[ü†(s&©AÒâQ+5;@6äjÎ’„ì+·y§‰ûƒ™'QÝmì“­Z³Dît‹ â§xV/`y%’pÊÒH€/óñ»sÛý<î¶åã’®®c½¨ ›ÑûÊz'µa¿òܦs^8e–>{ç¥Ì黄ðxnŽôòüi|tßt¿‘d«Å{éÇ…K~á¸ðD#îj`Æ;òJºDˆ>ü"¿Úu}# ´ wA»i³€,žº‡J6‹ÍT«šFäºèm«,Jì|”áWë°‹X)2û›´gNý5e‰Ñ¸åÅ è˜Â„NE0„ÁµŽê+}^GPЧ‡Eqšs pàó÷±Fönû9Ä ùS=K"YI³‹E&"ýñ?{qà¿°”ç_:@wRh`ºÁ"«GºwË fe¡·E/{4ײÚzþÇwHkVñySJnþ&ÛîïÉ¥“n¿KD_ß*aŠKëê4_u5jd8#¥;I±¿—zf|ôÒ8¾sKC¢Û¬bT>‹/ÝwÌñ’öUk’øVýN£÷ Ч*ŧwZÙ2lÅSæû\*y…”ž×Oä>Ié²Éãûóéê´UzK!+0!ÕÛ® è°-÷†Í87nü|¥~IuY äýHé–Œ#áÊ3‚‰%Å rJTc©ÎTß9é†ò=g4>©Ã…$ÖøÏ­ú‚ÜqÄj„íá 0‡¶ªžR¢s x2N¯ÝÊ‘U ¬HLž+ª˜ò$ì㘦8£¼Z±5Ôii(@JûÖ`L£–X™„øå½ô&çGZ­òð>rÀW²ðaW'ÂÕ-î%rë¸=±‡Wëg0J0Nð½²ö¨^Re¥¾§e}rÇ”ºw‚”óüÍN½~©m—…“¨ÖÚuæX÷;½p@ý{zPVøòøåðÔÇÏö,^¾dê½\–?HbŽ”OïZã!Œ aשæÏwE¨6â¿« ËMIåaÝ‚÷}è­zN”í;nN}Ê1Ç–ª¤r¦RذÌu(áеֈNõÉÕDöŽ”l?‘.åÛ+EXu{àÈd«ú˜ea{vV¤|Ú fÐRÈ0ú”Ê ilMÊj²”A\"ªhZ{úR>ÆŽ¦,Âe…¬;mj6)å°-€êaš ~îX¶Ì*öt¦<Flûš8Yœ‰Ÿ»¶¬¢_Ú©K76ï†YÇ{^¦avñÀžb¶¡þ’¹ˆMÆC6,¥Üžá&e™›dþƒOx{—ê,ß%½úÉr"uäò‚µµBVÛzdµ]|ZÝçÝ™%LC+ÙŒ!ôîl-`ŽÀK>¸#c·júˆošŽ9|Cå¥ÇÒÁÙæºC;¦Üí¤ËVðÇ5 +ò=ÂÄ4Ò0**Ĉꉷ² ?§²šÈ~æRñ•oéÛlþ¿?°ñT,†ªÉ<ôÆÁÜLåÊ0ƒK·gR¡N+^§ÙT*ßš$I寶ù)ÞâËŠ–YšÏ‘?\÷€lT÷Fvýtê“ zI+ࣕ¯úg£æ(‹ª1‘â#GÕ8”ƒâ2h‰üb©Ü°#LØžy upyB8 è\‰p¶ SK%×G–ì[Š.ÌY¯—qyÄ·ny0úWè£eë–>3I/ás}þAø’Ž/I¿±Rhý‡„1¶LþeŠ]v¿ ÅCñ>Z¡÷X®†]Â]N‚`»œ“F6£Tírid–¹¸)L±&ï ¢Vj9÷á–J`¨!0Wè•Æ­2»êúöŒ=Š’q+‚2’q·0¼ôÚÊ>j•rÔ$ñòu¬“¶©;¸ ºDvTŽB³l[i,¶ ñ-{'WæË»‘TéÕZ"¯Hª·k%cרã8dIõan¬DWÏ-7‹­V‘&Æ¢÷¾yÉB Ï~K ÈàõÔÛ%rH$Ï’È’6WHªÌÕÕðöÀ² ý½ Z¤Ò&«ÅMáÕÊ ÷²Ò•ÏÆâpÕ²Õ»jµØ®=¾Ånã"däIõöcøf+IñãVúj•töfSä–ŸÏ_Y‹éÖ[¥Wë’¼Fâ,86¡P*Uû@Õib[”›.$ÙôçÅOc¸ý5óÝ9§wvÍòª¼üή±¾Çž$`ºA‡ÎÆyî]‹”ÕK‹¥u·4ÚÜ7U NÖêPD ÉD^—¶˜V½Î ±Òµ©™~ËÛ±Rkôbûy¾ç¶Y„§Êi SÖD?Aùj‹ÝûHÕ–Ókd…z™x–sV»áAžr—Nº4¿‰ØJÝV»Ÿö†[“C$ÕH5¾Uq¼ c{è{R¥6«¤#¶®NzŠ5šÙäüؼ_Ì­ÿžj[..p~Å™Z•Rµ/Qß6—8&©úa¤º«[·­U¾Cöîû áÑÚ¨'µVàåü¾õØŠlÜâ›È·²?‘ðƒ×šgp­øtQ¥Ýh”!5Ž—«äºšGXNxå{teJ?äN¬FÛ4 ÇHjŽüŠMÕ÷ªp@첉ñ»pË<`½5jìR9òœgoñ˜Èÿ1w-ôë¸ñR|ºÄÉ~]@ð„´ô #+p’cêÄ®°gþ•¹u‚­Q@5﮵¦­]nŸ‡ž¢Lü#=sœ ÓbÞ ~Á“÷ÖJK¨9ÈcjÔHͺ–‘‰=rAW«";Ë_…Cr‹†%¢"‹Ò;‘é&5Wo•Ès3w-‰»O¾X¼ ¨ŸÕtè¾G«Üù`-ÍŸÊGç°Ýlj9¸ç\eDúžÔáhŽ+5º‡-’n¢›Ú\R·Ó½™¨­ºÌ+Ð*&-þÅ»€Fq8Å-¶Ví*K“(dn¯4gÅIÈ èZ3ÒŠ-®k† ræòýÚŒ»ì>ÂöÞôÙv™Jä¥ÙžÛ‰%µjç]¸SjÙ.ØÃçC¶]’Q‡ƒÔQrñ D1[¾H2”¡,üxjv÷ÐW´[‹“À6*t6H2÷Ú'“Å ¼†k­OQ"H@³+Å3Øcj§™³"´Åf뻥ñm!JÙ‚Lcôã1³Z÷¶l³…Õ÷ãvÛy€é<¨à‘̯÷2–Ëñ1²dÛ-`­kÞgeÝN:\¬ßZă›æv0Y²§ ½¦§â–´—oÈ‹ð›æa4͈±ö{ª¾ŸÅ¾ÛVsvþ°Õ'<íª5ôޤ‡ƒÚã˜Øô®Ï†ÍîÁÁ)†eiãx¬`,µ³†›·Ø‡,•à[t/IÅ'ß¡kÌzJ“±?ÿ\%‹ xçÉ)‹³=‘ˆ$R‘Ì?¦¹9Ám¤†]ÿhE0_óí­¤¤ïÎ~Ö 5Ýá©ÜÅë쌛 o¹3n–fG~sA«²Ÿ‘;ÐÓ•°%ò‡$9L:À±ÚŸu#ô<èÌìn`71ââFã$Ž·xþñt›ÛA·Ù{äE¢žÿž}wKµÝ[áÙÅÏ”XáÇ{"¹›ï‹•@*2ÊÎ P$w9³„%fªµÙÐ{7!¡• ×!Åf±‹7÷ÖÔ´R\b‘Ä'IÊ™ärõÕ~lŸŸ¬2b…Ï;Uj|µ_ÚÜ"[à ²ÈÈRSãëþ3ѓꟘÁ9ŒNl XʪB™PK¾›}³+ín_,¶Jà ayøþü <ŸŠhÊYPŒ@†ï|‚GØß¬`xÖ¦:¦¬ÄèÀÜîHO'Jä–8å×÷ÈÓ¡²Ý7±•äÜ7µ .cL:”$·u4ÞÞŽr)c˜óØåz |–gÖƒA©y‡U#o4Œ°µç üdÒùÑ9£Êøáºœ›éJ4sÊÐK•{YF’°ÇO‡n§Äìs £‡Ÿ{ÞŽúôm û4l¥±æ"Ò®-[¯ïlyOW®{¡èeàÿ±R¬DTÔ͇˜:½¼¾:¦ÌôØ%#õbwvN3VFû¼ÛB–“Ôo.™ÇÌóêŒVR5bÕcþÙUœ»Û©åzm~µÈðØ6‚¶¿íž}$õ Cüø'lÿŽý¸ÖU4Ó]êm/9®_Ði6]ºã-ì ” „ãéFR7 aU9nÄQÂg¶¼H›fÙ†—Z0RÿaËhï¡ô©´]~‹Ú8#Î@P…ôËÕÊþâŸÆÔ cŽ]ÚA²]Ý,ÙÚCÉz³¬bSÈ©1Žì±ó¦Jg,ÔŽ,SeŽØ¢£±í×ds…oÒ·TëÒ_˜Îæš©÷há ¹´äi·pLש÷ŽÌx´,@8¢}‡ÏÀÂw»o¥vÔÂuI«åÉÑ”™=ˆæ †Ý”Ü–jW ··mÀ²wû R é h^s‘„hA9YITÞìÜmŒãêÃÙ}Ø.gwóÛï©£Jû§n¶Ê\yFáRma¥¨I=õKýl»Fܺ\ù2 Ò¤M:ÂçC²%·‹BÄ¥» MÖN?²YF’†ôvå‰úEƒ™„~Ý]€ùC’¦`³Ó’Î}ä% íçe¨=ói –Ñ¢«³:ܽ:J—ΑVÒ˜)5UÊ ä" Ô‡«¢A¡yCʧ[¡†]NþQŸ‚f;ÏM]ç¸éÀ¨aÚ-ElÙ{€Ë¾™:“Ûz„ µk«,kiWpLG–árð^Ø_ ÌÞ |ia’+E°†ª€ d·ÖV—y…¿ø¡ ¤›è÷~Kt­\JëR¾”UêʵyGÒæ¹V†Ü{ÇÇâZÛ%%ÕÒ†ÆèO:NC:nŸEJNøÆ{\dgz’7$é¥<^y,õØI%œR›“ÂÊx¨=Gâ'ºµ…?úYýÔú}¤ù<é9ÒêvºŒÚÝgîQàB£¤6È·ðim''Šß‘~BS|qyM4µJ7ö™Å_7a8_="ÓIÒ€jÌhŽ^Ÿ¹ïÔ!%v&Uûz± Ø=b!"àaÈ+Œ¦\$xŸölÅÁñ†ˆ|¦Ã Luc'IY’ÔuVKjÛuVK𛨢±ïÚár‚~hD ?út1‘,}ªÁ—c›xo¯ÔnâP÷33Îãõ) A’^È ±š»üÿ|zÛf«zÕáàOÛð¯ïc[Yœ=wïGŠòPrG¨ŸÃ.õdà9™¯T]µ¿Ã¨üÕ7ËäOz1ì  8]ÏUkõ³œXZ|ÑñÙ•—Ý>èÈELR}GÍ·=ƒ]i2«Q³†~£…Ê`^®•Û“=¤?†¡Çk¤evŽd;Ú&S_Ú ÉžÛíÄq6Q¹o6мᩚه#ÂR- 2’5”Hº‚„Ý=`¶CŠ[þ#m 6…ÞƒÉÏá a“Ï|X¹›áåÀ\Ñ“ Uoª G±íý&îCÊ?–V?-îšÈ=!Il(´ÓÙ¤'IãÔ-‚¦%}Ÿ|"/ÖIë°ÏOÈÓöý!™±¸·ê+Çí°¶´Ì¨ÎFÕv9‘  Ò¨.Í5’íºUýIÕN¿UýIm7ì„®·Ã5Ñ‚£ù’h&ê±`àƒôcІ£Aû ß&¹Iæ6zبœ”¾”‘1´ õWå°=gûÖ€d$i¬ÀŒLôr)«øIú“ÊL '‰ap“ÜØØ`rÄg£À“ùCìÈ;ANMWÀÒ˜+SŒí7À9ØÑr‡Ææ ´â¹ ,=zÞ°€€}Àqa'Kpóü&}Üyt»ô±lYDÒ.dÕð9¶Iƒ¶üÐu†^˜îBåŽþ€õã-ÃÃ҉ ­'µ¼ùìwKl4K¹m8<>ÕOÌc^ÎxüfÛñÜ—c=VÅÔò{»Ô$$žÏã à=ÆðxÊAèÁØÊm¨]'øý¨1¨uÕ#£ò%Çz/œ0ÀÀã?1¬úlü$m<•¢?§k¨°Å£o•Qɇ­ Lú’üùTüìòÊ¢Û²`·Ùü:ÒÔfš…ŠÌ_Z£—Ìݨ‹£8%—wEÌÉ©²Ð« Vì Q)ä9­)SµÒ6U;°Q9´KâÁ‰‹sÔ_£LàÜ1ÿ¸|œ©ÜöAqYbaJ²Ú"QGkÔl÷ YSžÕƒ|·^Ù)?T'l­odÖ Æ†,E¡ôw2•¨™üŒä ^‚ï˜t, ?wå5Ø…Ÿ¶ÞqBñrªë2#ywÒÛT:ù4¸%}/èñΕcDsŸ&ÂÁxžîè’…"Ð45Y,5ž;m›ÝÓWÞŒMר6ô”ÏÞ“?< w£1(×ÃÅ!|¶¶ç[ãè»:î vì ËÞø¬«qx!kYRrã]6Æó0Ôeá„·”½Ê dRÝ­Ùo­_ƒÜT+2¤G,dگ׫àG&è³ ½Q]‰cmö5Í('Yñݬ3øCôÓ=?:Êåõ‘>yU«ŸØZ¢`áf9SJ‹½PæªI?]¦ Ðè·=+cG¶PÂ9ʧS/Æ”­‡Äêôä\ o‹…LÆü¹í ´¢f9Ñ4¶ìD®Ðß…»ª‚3óùw†£LÞ‰–ÑàˆÛ>º6R.$Ë™Îm;>.Mö“î‚AAsÏ6ø>†¡$ˆ»¾‹ÖŠ+Ç율ž@OBp-üËË»Ž,^ËšUŽ/î̉*/-G-“ò$§ ,I–PÍé»)€L:›œ¾.#‹zyüZýääÊrò¤[Ök)(+¢ÛFÀˆ(Ø×(º•j@ Y÷˜¹L*’œcu,É©ºMñ¬÷QYŠšS, È7! šAe‚ýy?«òχc:§| X’@b×u%æ.»ü©‚`‹Hjº”¸IšíÏÇ\5í$« (œ¥Dtç[¡ùÖ²¨5.—u|F`ÛêÞ‘ZÜ$^%ÊRÅ…ïWº» c€A²?ž×R4HÝæaEìJX{:ñc]m[ÖXÛOlÖ2oÔ„ZUà ½Î©ÚYT¼€FµÍÖç™­XÛ‘~@'y¾óœ¨µR ner–äÔ³ÚáVÎTRž å-EÖ“dÓû¨óäIЧ””ç÷6Ín3ÖPÛ%×A”lÎØuF¶ÊÓÊ¿£%§ÅnX&žB—ÉØŽò·»gèw5f26ûgùa´ÎÚ"Íð&]ɨ̾ä¿çèþåd+s;ùv%Ò aÒxà Ÿ–> Jgy0Ì´I+ü˜ÉZ’Ó ?²+§[f ³ŒSd¯ªŽ]Û—÷”åsóeÝڣؒ-u^¤ðÍô®dQ|ÊÑ5·ljvþó ‰ƒ4 ´ù¼pT<óv€Š±ùï1l»—µg:\™ÆÒyJÏïuXO%K \ÓIì”N„ÙQÓ–Ø™§¼—ÀÞü…géÜEùŒäaN_fDªœÝéËÅN™d#iòšÂ‡¹¥ ô ñkÎAc—Û`-¶k–"ÆR¿È8%‰}LžšnV"“ çø¨K ðvzÍŒ/;ñ|nÖ–·g)ÝjÂʼcv9Så㜠òèÃó籚p™õfÙöÝôÙ¢@9~¡0¤Ü#X•uŒo›Šd½ŽˆalûÖž®WKæÛy-±p´(û wðB°)ܺdó¶jBªЖnýBqÄïônô–Ef’ä|³åšåâŸJô£û6…!/[ŸðÂË^l+ßw(8y›ÊÑ=$Èb¦>•D™œ$s{¢5OEX9ðŸ˜Ò=/ÜéñÃEkñ± Åå3‰’?× qD nl³¦ç˜/å( ×_÷\Ý Ñ5%›}§Z­Ý™]´±©9œUÿeQm1u°Q5¹F¢ü✯Rm-ÇB‡®\+V™tÈ›Œ$[€a“‘Ð×ÏQ’ÀI. ½”­å‘çÒnNα¯ŒQÚ‡'¡^).Á=ÿ°‡£ßËæÍlŃfÎ !©ÉÇ£@¢¹ì×ÛçŠd/ÉEœÉÐA~ ÿa=ÙÉyï„+s=®ál IK‘3غîΟ’6;zÅ?(K[˜ÌlŒíZæBmQµ;‚(”ˆx—\N’²¢l({7»QÖ‡–ygÖQÞ‡£‹Wtƒ›‰Ä­}úz2 £€¢Qéô£ÅaÀð‰€hƒ¾k.ü¡zÜg³[û¯J›Œf=»µuIÙÙ”°ƒØ¿hp,Ç#‡A™ÙkÙZÊ”'›dKcxõÀˆb[† ÛžHCŽ}}–7]/îQ]‡zÒf ¤ äI^ä3ý‹Akí›ß2«ƒí²i*•_õAF:9§k„Í&µ“œQC›\—ƒ¶&Z>êwgÇXï°äéX/‹–oñŽ@Íá g±'§ÃæNG"Ũàù ®VÊÁš_Áê9Fðª»'U8ƒsÁ÷>aOxl—›nËîðd#Å‘¨öh­¬s}€[È,áº| ”œD¶®óƧXQûóNàŽðdôsÕÉ-Ç’Ä s{C'ð!d½¥«kŠmÁÅo^è¿Õ©H¾H\ÉhBÔ®•ˆ­]+pÝuÚjÅZ³ŽÜwmê|uSn»%5õdµ Vç«F$ë…˜/Ïoɬ Îô B'T°pÅ8!æv¨ kRj¿jZMØÚåéã<ÀÒ̤ç<ÈY,Ì\Y¼Öýà4»q¨p…_䩞kËv,³ˆ¸î:ÆY`ð"ÜD&¿ûy`'À‹k°œš3v<ÀÖyi•>XwŽ™çU¶Ñ ¨ÎýN4VƳ&+ܼÃtý^çžô7Òªœ0)Y/Œ¸XV±Æ £Ò,Ø€+#Iýnç6†"4ô¥0Ú¢yäe¿%9¬kSŸIA’‚„½jZÏrÓô„Q«fF%ÿÈÜ7r&ÕÅQ«Iöí€mòh_”ã°]¶5éI¸ø­^‰½ìâI¤ëù‰£ð‘ò·s–og£\›G81NˆÜn‡`ù"û^¦à`Çæ_•[g|6z;-;Ô#-R8/„ýÜ• ‚¬ þFXXnÁNÀ”zÌlÊÖwKƒFL¿Oe´b[ÿêÃʤÄ:½¨á>B[Xýì,õ7âw)F¨úá»ùdä„!wçÔ| ¸r«¶ÏIÊ."Å ëÝÎ$iÌÆBuMIŽâDì¨Ó°•½%¾ÛEнûhIk¶Mûùx…[º¶BLÈÛ”ý÷ŒÚ 8.>²zŠçhuš[ÑšÿnŒF7ÓÎÀ®©w:A×Å.Ká*’«µÎ×ê |Ÿ=÷ó6&>‘Õ2m°@²¼¡ÅáþÅŽ2+ÇŸ`-†»£ÇàJyæØêeų=ÜÙêÜ™\K¹ß‚Œ. Æšr»ú³¼íAmês»sˆ&U:•M6…ìCî $­r>oÔ§É/Û“´M/ÔµZļ‘h‹øÈRnN5×êïÁbܤ©ì˜ÛSÒ…ßôï-“ƒ«'[nô8ÚðoN×­o K}䣿¼ÅQ¿ô#h´÷:ËçñØ~}}žm<õ}ìnŽ­^\8óëѬ,„h“;ï•/0{’ø'u'Á@’¥-mö‘S¢VÑPbW.e·ûy¤#eàÇòlÒxqI¡y&ó[ÉC“ëb™“’l›÷£)ÿtÂLò×”ÍRù…›ì®<ôå½ʪ¼˜7O–d÷.—% DVò݆%ÈS¼~C¸K­H²@Øçú#gɶ?,eO {ɇØf+[Þ»Yædd50<±mÞßÙ䞥Ø6í‡á)®]v&óHóÚA딓\ë@üw•k±d¤Ð¥*Æ/ÇþýÂöJ]l¬ÊFrsßõßÊúlõÄn‡Oƒ8%]'̸ë’|dÛ-$yû”™vJ1mÂSY(HGÐAÄ_”ïSÇ«UëÐÉ­’˜1{¦Û,Í£›¤Ù>?{Ñ”ægoå®ZÄØu«2)næ.{êV‚ $XÇö· æƒh;–wúº_â V2)G‚Å$&>–óÆž_4ÍŸ:BAÔnz”2Àû¸^¾ Æüþf›„,^¹ Slm? £Ýâ™°IŽÀÒøñˆ«äd#‡Ñ¶É*M²cÙ7R:€dlßš¨mPÀœ SOFû;(äó0L¯yËQÔî¿…:œå/ø-jŒzo…ÃôyÒ6ïk ¨\{©qí:yR¼ùIÒ‘,c‹;SAÃï°ã¼ˆz£2h¾Ë¶K•9ãìé!ŠÔ³£VÈÈUo¥!¹Q>7Ôz0ÖMÓÅ0C„¸«6n—5Äv¶ŸcãÌÑÌèi ›ŒŽ>ÙiHLèn$’7I¿#–ÑÖÇ‚eÆ~n­¯`Ë?œW#$ï!vЇžöÃÚ&ŠîmûiH”Ü7©–}¿Á]·Ô2“W/÷ 1Á¥Üµæ¯ÙN¼ÇPÒ§äÜÙ+›"ê`;‹N×. YÃ*׆_ˆnáÆå¯æ‘MŸôdZ:¬Ë2.…ZÖ°—¥"zq&·hz¯æ+° ç¶yÈäÙ®÷ÎRrw· ­é4˜yö}8#}ˆÒ’O݇(IN’{½6ætÂiÑ 4ýû!Rñœ€$ Ô"ÃñóÁšF®±³Û¸©¶þdºóˆ_d`×ʇTH„!4q­2 ½íÑ¥õÛ½ÉCv’¼á—7 Ó·Ž³÷áhD"I.#ПX¹šÚu¶1]‘á_Ôi`™Ë‘ù=KÅ8Ù¹çQ΄ ÉÜ®˜T—·ŠÆ dº£ÓË—>Õ_ ¬/лfªáî*õ­°¦÷ÏJhàfù”lm«×7ï–äHŸ;u\÷:®ÛÇÝ“në$ó3ûÜ4Øà öIã±TAT‚ž7^.7`¡{Ó§8,S_Ñ«õÁ½Ó íêX™#Ú EùFaÀõ©pÎ]íPçrî ;—³›Œ:AjÏÌ–1aGöå& >º…QÊ>¶ÙÃÛÝ ¥Jç~K’µƒ‚áàšèã ·Š3ƒT„¥"^geÒqC toò¦lÜЭ ³X’N¨§|qÎ5ÿ¶MÊäŘۛ……§‚¬t¿t£#IŸÕ£#• X=:²ÓŽÛÌ#°k·`}¸{ªOЬ#×J‘Ç  Ø­R¿~ *K F¦'ÄRxä]lfª5lcÔ!åÈ<²ýëŒò 7ó æ‘i;i¡Ù®ÚŽÞ‚¯Ýw`xn±’Rähvz™!®ÃôšìÉ9à[½UîâW"šì²Òl'òF]Ù[·à¬{©,9J­z{ÉÑ-òÔÐiyã%jlÉKJ¢/B da—@ì¿MÌ[1ëÎ%ê½Ü ªm/¿[«_k½ê„¯V»Hhøñ@ËZ›dŠgï'C[÷4ð:'ÐPÑð!›mo¸˜¹1|DECî$Yo´ RÿA«—Á7‚¨ua²"vB§¯èÛ%f¥2QI—À'«øñgÐ@£ºCh±(}(Z¥o£ò2OrŠA©ãõJ˜†Š× 'Þ§8£\#NlŸˆñMÝnÿ`†I÷”±Ihg¯©™™3ÐH]f,áÞì0E:/ï ÐøÚÙ y‚l8czAþãÒ#ÓÝU*PqŽ /J%_ì=—À‹Il–Ší™´5y˜ÁÆà^zÈH?‹€â‹»Öò\•¾‚¿›W;„ ¦OG‰8ÄâôÌ£Óîë7û!X‡PWžx½ä+¯è"Ð\üñ9¾§=4kL “q‰ýÀ|¼`ðT$à›o­¶ ÈavU²Ç×ìv@Àæ¡È§‰Õ7Â:x›ŽäÁ’ï×7ÅØúmhŠ,:yh¾ù-NêÀ˜—؇·:/6}{Ú6j³ÜBAeryCÍCíÂêß'ÍKVŽó¸œ¾ã¶œ³¤×•­ô—öØJšç[MƹÿS)jå}ÃWT jÁ1ú¥ÅÉ‘È]#ûkPnéO‘%íIÃÓë Í­¸®°5!_ lz¬CÁþKjH< v¹P «Ê¡±i,ÜuI 38•°k- ªlþÇÒPkDœ#‘\bÛ1t?Þñçu_ÎJÛò%ÿb‰i5°€tP€»û‚\ʯө<“ŒcâÜ·Ï^j¹o\¯Eá*ä9„§¯pùNYCuÃ)œZRŒk#RHø›WR´`Jµ/ò šÀÉŽÔµVˆÑ£_ìçž.ó6åŠ_6j ÝÀÙ$ ûR¹³ÙÇElEOîóŠ—ƒ+`AI—Ëu=ÖÊ()ħ»KÕDtÙü#TÚä)ºmÉrúéü[(Yæö¼·‹5÷à#´ÆŠ¥˜œ,™ì(ºûzOcŒÄ?ø$rÄìl\S4A üôî¾w6apˆ‘ù—ƒ}¦0Ê×ýüm¼µ#F6eù1rYk¡Ï±RVŸì9ŽY’ÎØáØ~!×牻]YlûW·aµRáM¦TØ â5˜Q$~ÄQ~«íÚ3Xm§ŸÂí~q¨›–vH ŸÛÃýñQF$_l¶(ÇwóUåsÚ-ÛÙ·ÍŽ:€®ûë9ë^×oü§€K$ø£(lûzÇÁ}–¿!CXS¥jœ@ä™[ŸñæÊY$˜·oÏÕ¥Êä*AKÖ`>ñ…[¿B©‰ý®–"¾³ »¤÷~.ô  •]HA²“ׇþgÇ=§ ùdÀ $Ú“£h,‰wLi?2ƒ}.8Y’=äa_1ï'’+)\]ôª·”­ßLVºÄÛç|d`yðu¬¥ÅvM^ò&•À%UóÈc­ãñðÉRy|%ØÞàd!JI·jÓ£Äò<‹í̓\cʪd©7‹íÍ¿./]”¹ç”K2Ò1BnËp¦ó îÞ`ª6eQ<ß ü;ß=ý«¯M§šÎdÍ]Y 2@÷æ9/X‰Ã7mÿ•ä’*´%Ø®•–¨1SU7¸ÕŽóƒ[ø‚Ûuã Oo7%[’M‡vS²å³)A@þ%‹Ö9]†ÃšSf):Y¼¿³.Û“öž{¸ÖÛyl+<))¶e̽è%ËÌ<,³ñìËlD‰Ÿ!D2ï~ܽ¿7UÞ.:·Ç½yîõyPQF…svÎÆ»éäâXI,°U’ó‡J²OÜ‹û4bç’V &†ëÂþ2_pA âøÀ )ß¼cAô'sÍ·ï~w²žc„R`kà‡‘U¯-ÉãÅÎv…D%肱žUmë„pê õBØz¸…²CÕ}‡ÎÉû˜-)d)¨W<Z†ÖìW‘ÕÕìE4^£2Ñ)J‘62Élbf‚q”î@Çsã)¨>0J¹X>ÝØƒå/‰º(»î6%ñ¿¸AΫäMüÏ)¢vÞÝòД·ýhŠ™È©Y¹ãb ¼%ØŽ[PI‰•”[xd-î_+2§¬ÈÄÞì çh‚÷²µBæSçãÄ }Q´nCv ¤îWìñÆI_Çb°ù[Nï fÛžC麺λ”Ô‡…žF¶nBdz‚›Ô”Ÿ%Û'H©HTª¿!`kæK.qaÏ-‰XbÿC‚l «dØïeÚ£~°ùÀ #WHXRrqÜ$%ßÖ6Ä[cÏ uéœHêä –-ÖMûïuC¬ÎužäVi¦ž2Ž“ÇoÒ–1§´-–Ûmû*_Á«:°o¼ >KÊ~ÃY5HÁöÃðFþþ–ÄÏÚyeÍ YLuºkÀ¸q¶¹K%ViÖ>È*`&iùäÔìÂÇ0þˆŒó ²uí@V.±Ê¤ª¤äóJ4›çgðÎk¦Ž[¡¹eûgq"˜!÷’ñ!u±/g,¤<)›­Ä–,=ò¼GëñãQ[Ó™"çé[ÕÑ‹±'‰]lÂ…j÷äsP¤»å²F¦çéÓŒós§£—pÝs%ÞÁùÌT@9¸À±SÌŸz£REÂPÿ°ÊÓÓ¢ WTÃB¤aʶô9‰ úÃ*Ïrúh?³oeÉc<ƒá"Sy<ÕB¦¼IKšñÃù²m#„/y¸~‡DúÄ@K­JYVª_øHÄ™lƒ©0=”ÛÙv£õg½r‘ÐdÄRÔ৺%±GÁ4>)‚>>Rªµ!íòJt}`sFpUʧþª¶kìgÅ 4)…ñÕâ€&…¨³R’_ ô K¤ŠþÒ)3\\Yü%+RVn܆Þ×3qIOðmL{nI$’— …­KK¹¹8üÍ=.õÒ á/Ÿ«9÷òCZJ–G?•lçÚwrçèÀŸÓ®µ›fqû<8¦bŠ1—¸ÊÓb†ùZ婘­¨Kø†àüÞ*ø9ÇP/rÍâªv!qæK¹zn™/Åup+ÅÁë9’¸”²±”6CøÃeIÅ÷¯9Ù„¸¾‰ÂôœïUQJµë,ã´#G‘>½‚éï¨söKý×Z±rà4š–“)í5{J³íÖƒõ#Œ€Ì dU©ƒ]),ðð …B)^¶ &_H).£P C4¥ùámã/t¥š3ª‘ £Qù¶·fO6?–à]aï¸jÌRrä%@¸<¸éD„æôÕýtwBoûs€ZÒ7p,ÅÖÑÛÐ+£Tö0$÷Ïì wY[è¤x }þÂê ‘‚W¬÷­,o Ðq.Ý/ɸ J)Ýõ“×ó!ãBéÅ÷ZJæHDüpRcÝ­A8éõ=º~À(°¹tô#pkߊګè~+_, Vü¥‘!Æò®¥ŒË@Z—ìCŒà4Áö¥j/;Ëz”R#³%Û¬Žiéù‹ð%wœ²˜DΤ,ÃŽsÑ“Bõ[WÎZ­]íS8„ßóŽ¥”©ß^;(`£F}e-Ù‡³,©X٘ű²–úÙEÏrkìY_<ÉJnfj»–ºà §Iî»XÚt™—ð[}›G.Û¾ë”gQðU„vœ¤ž?äë/õ̆HÁ;a,³m“¿èà®=2´(kvú4&Ç$ãäªí‘”V×[V›eÕ ¤\æPõ¡ÊJ}Ñìp¤2u3XÔ÷r›ÌíÒéÕzo±’¿a¶„Hµp dªäÛöæJ-ÏàEyC$㣩[ë·ïk:k²ÚKV'fPR3‰•ÃzH…±6m”Smß“eA½»§ì@ PÊÕªÎ>Š,&„ò£ áFäüÎ1ºhµíéÀ¢z.'1¶È%޵ûI ®Cò&>¸BnȦÒ#ª®§MãH Ù°ü¤ÔQP oÕwËAá s-)KïvòþNÅeýÇ ¹%ü³"NöD×Ôzi!%ñ•ÚŠŽ óÐ…Lr@Z á61Yÿ(`94 ¥Ú—ôFjµçï~d¨]««§-UìØK-W*}ý‡_#AõÑËÂŒèŽX˜“LÆúÀNµ½tœEdklQ*• %¶„ŸriŸ‰uZ¹RWnu) ³{†¿2Õ•iª¼Œ!ÿÈôxêð<ŠÙ£:lë§60òޣו TK×Õì~jÿDªFwÛ5œúo»Þû¨ÿÝpÐ>˜SÊNyÚÇ£¾l»÷ºø·2&õJCù³,þc±K-˲}vû‡ôµFþmVõ]ŒÂ)ÂØJãJr°fæþN_¥%ÛçGcôšþÑL³Úºë²¤ÔÃ_aôíïìJƒñ>½•ÓŸ /8 (§×È6·i?ÞàŸÎ‰«+ãÞr 2l´zî¹»]ÈWñŒ&¥ÑÁy;b³M[w©¦Ž®l/#üˆíi-a¹‘Vü;W˜\@’NÃ(»9\¹Ã›k‘r˜ÊÒh64‡©,ìaTÚöælÚÕoW4¢J°k»PŠeþ›Îßk²(ÚÎsôÌÖƒî5hµºeŸ ž…WX,‡×ÄN«æxµÐȨ–[èbí¥Õ¥?HZQÚRx›¿’ÍoÖ''.­´ÐO ¹…O¥—·^Âwj_qÒ—Ü(¥ù e«véÓ.ÅúQ¶hHsVˆCZ[P$æ›7KÉk³cF8TÒ­æµjËÒÄ ã&ÞáàЄy"vyg‡4›êÁGÂÁ¦³ Z6¹dèB¨ç_78†É»`~åËø1¦åØHò‘c[\“ʤ´®D¨åïßLá0ç¶iÐ µÿ¼¤#´ ±ñÍèdQˆ¥ÅqÚè­7Ëέ8—ùÇMæh´›ú¦dk%›®O£Å´šuî ë¨Ò ŽÓøkåÔÛñèÀ𫸠ùDÐv?/ß8òN¢º)ÔWÐ ñ‚Λ”v‹Vù›ð δÃnbÓR¹ë„{’5‹¼ñ…ì&ß ªÐ¤œ§W…BKv¦[HÞåá>hr¤¡Z+ó·µ3/xB€•c—dôìøu×S/T~ŒZÔ&¬Ü~˜Qý¹O  ÙÐYÛ 6™'Žj¹6ÅõObß^3þ|þÕ‘ë§±§ÚºñÌ&…Ì%skâŸEž^nÓ©"Ý›Z¥Éú"O¼ú'ßÈÜ.1)y<ˆ=ö’.²‘•|E‚Ö½*ÔËrè£+¼¨VbpÕ )õÌùùÙɰtŸ¦ØÍ94PÀÓ:ó\|žŸD²åRKg¼P¢,« \ÐÿÔJ3³«ÏDiãØÈÝ{ß³:éAªtÂpx½MßjUí°XA0)M²ín"´xÝ%!@GnÕþH»$t>ä0-WãŠ;ó;‘þ§D™Òð‹ ½wÛ³Gí8`Æ8%’r€¸Bi"×™[.—DÐIúZì§¥Bñ,²›Ýs°äŠDLº¯Æ±"òè(ÍrÙiòšx}!]ç)´Á;Ô‰3a\ö$BmŠÙ.ð!N‘§\r>Á#øçSº¶°@aÒ“_{ù ';Ï4ÕŠ?iüœÔ/nׯµ½¤Š“Ýd¸È)ŽÛ€÷GÏØi~"«c÷+ . a èMNk õ¼@XÂA÷WpV¤,#í»¼wÖägîvÞ‘ÐÈØ½/íÃ0;(ãœ×‹jéú9Ùµß@“†ÝN•+€3-v?³¾ ó,g£™ðYîœ%ƒúç_›þ^¿ ¤2e¯ön?™ÕNe÷™em§¾-i…©á$Þ?pŠþÙ³¸(+ÜåÜÝA霜}Ç,9xô6{r5ÒÁ°3Ð Ù(Ÿ‡žç·êÍ©žn íÊô«æ²Fý",³€….D¥È܈ƒÎJÐÄIÐwEGõß¾ }zV“~!‰xÙ¼µFe¡ióÑ.P›Ü@ÏvWgôôl['&غô|ÇG7?=#el£>"ÖÙÇDRov­cì±êâiaíBçAÌ,!ÞôI}€à¤û^¸…ä%…ô&É0øËÕ:¥ûa7™Ÿ£SærþL_³×ü>ÎÐ ë†Éﻆ€èðáø¢ ¸MhêÜ«T$ŽÐ'ô*—j·×}•ñçaº”€swûÜ7¨¶ëñäИº½8Ý~KÀ¿Á ù  w@£;pÃÇc߉9²–Þbø†ÄÍÔ „øb¶SÂvY‘á. Aw†Òu·¡·w’ò˜ Yæþz×)ÉVJߣcëØv­EG½×mךȴÒicô­ïˆr£Rdšëñ.>ÃÈ83œ$%s»"Äݹ“…B›·á»" 9ÆmìÔm½»Ø ‰Þ;O~¶–P A6já—”2Q6ö£ðê' ½ãFÞ¬ykˆ¨ó„Y:f±–“˜$ÓI釈Y ¾síôd‰ZõƒEöë3›`Y;pî öqUúÑ~_¬æyêà 9NJ>èÇõÀp(«¾žvø­SÐÞÈÿ›N·¤G{0©$t+:;Jx¾È1¥Ýàõ¦twG/ºa?8”%û¼ý"ȶ–'¡¬ÌÒmƒ]Iè%·$]µÓ¯¤–8*ùOB¿;]P 'ù°5Mù±QÐdÞ´ÿC]8›$yÄ”#–ˈ‹vÖe Ãb9±§)Ò^JŒ¸ Ø<"èÆ4Œº>Å’)êú ‹è ÿ öå0y™ôàŸ²ÅÄb×ïûuØj7Ò˜¸ñS˜©7°¬92(u¼‘Á¦÷µl_W®²#z­¦¯ƒb:¿ý7šÍ’áÇï?Œôc%ë6ÙÉÕÐÃÛJE9Ž’¶݇耚!ú#,D>µƒÊ­ßQÓè9P°©¨.æôS…W‰éÜ%b»†];ùÛ&ÛOiÕhäS\1^¬5ÁÃ{F²]ûÙ9i†£«,ƒÁËÝ£ŒãŠ“ö9†Ü2ÁŸEؾK8¼$çXáJËJŒÍT™ÌØŒ˜ãAÇmåf9‡Ê޽ìñCŒð–á(ôCÙ8xå³Ñ¾ïM£t”Ÿ²ÆªX4Ød@öÈpöo–“EôvZ*à7‰ˆüQ<"0ëíªÁðæŽ¯áåÀl?nI¢f@—e35Ä‘„3 øöç,à8鮉igKûb'²pD~!ûÀ\¶Æ¾ÒöáHiR6Ÿƒ½=—Ἰ/QĚΠbà7͉Í:ºà£f6›—ò|»9ÏêøÜ¦­µˆNVùÒxI* pl‹\È\åáñ'†žržÙX6æžS³Ã"õX $^%ïúþÆk0ž:¹ÁÔå?¦b™†‘7È[qÅžCìÎ~ÍE.›zÛ4ܪB<Ï8ÝNÐ'¹Rhô°ÞºOÏÚ—Ü"}J9v¿œØUb´6ý4M£ÂcûpáÝñ•lUZª?‡·Ôå®â$qCm¿ÓqÈBÖ»T&Ëûk¢ ÝkWõbv€b\ºsŒïˆqc)ÃW ¥¼\'ˆŽûŽa…¨vo¥j“ì{$¶ÿ(fÌ_MmíMxbË…Ú}÷Å¥Þ& PÝÜ@É”øà.?@MHSåüëú}N¸±c”¼Ö:¢~Áct„ä}{°îÑõ÷¨ @ÁVý)­æ<"}ûÆ|ÚtG¹~é1Ü+˜V°?Ä `¨kg6U]„'fSÕÏååh–×ïi…F¯¾Áýíú¥q­pFŸ/Žwîµ ¶j)×j¬tiêçzÆU$j°mî-áÚÕ…Jü°¶½¤^5~y%êÇXn„U˜%®¤”ZºÃš ×ï­ÓÉUHºÙy» °’£z»2‰]§¼e¿êçÊå* lOˆµŠM«­ììJÕPɧ2´3s#îVÕ’* NªK-àêÉH3›MI$W©`<Ñ\ý|­—ÔœâúÝj9KÿÐó~¥Ê×tuá•àŽú¹ºðÊWý§×0Ö²%ª„¿W_"T¡ÌÀ?rehý~M¸©”|vŸµÒsè× C+xý®ªÃéÊPD¨ øŒ–Àl•…jýÎW ûw)Q QÊÛŒƒOàVÆÙ˜ZGq¯ A”Ý}¸»6n"’<½Cí~|»ËsU°™w¹ºpò\6T¶X\ðvÞÝõ‹®ƒ>Ä›ëâ=Ù2€ýë.Ȳas·Ã„|‹¥/È'~<’z‘oµ<¡ >uPLìáè¨èvsó©ê¯\Ÿ'„O0l›÷Óó ¿â¨åÄ‹iåèGGÉI¡n¾Š èpy¥úÝrË+Õo<À$à›˜&óÉÓéô¯'·rŽ”ø}¥¸–wô"ÝkúÎà Œ¶Ñy\*XP°½–e%}JM;hÇ?>^+]k¸Ò¯›øÄd†ÚQ—wµÚÚÞ)ÌsKQÇÄ&_;·šŒuÅÉj"sæv‡ÿøZ1¾6¸éd¿ª:åtèù—“,ä «éF,-ßTw‹´ÉÐå¹ìšueùÜãe­xrÔ丙kb]¸“ïó[«„ïgX’šÜ\c<¤¦SËß©|Ȫ&–,¨Ëü‹^\ŠŠ* ¹Vߌ+Ø^k­‚Þ»¼3h@够¿TEj=ÝðèÜ·å0s€== (>eVóܽG Õ‘>UÉprÚ³Ù3³.<8«La¬·ÚMùá9¨`D™Û¶ŒµÔÒ5£Ï+ÙAíÍ ˆÔ'ø»²Á{ô(k²~Å–Ü-ï)=äû°Go„¥&šr©ùeGaŸÞvóò¼pLl·ŒóšX–äŒsvz Æy%·HMr£ä1ØuƒjÀ_ìò3r@y€0×ß~8³;QÑý˜Ý)V¸P< QÞáΩt$InÉ6(½öT~®1wu÷ó(|‹î×\!NFýš–Æd´–Ú‰ /ÚɘԪ¤6™[G/N•ž´:S=éA¯)",É× Ò^ êuÀÛfJÙºÐÔHöX4^8œeæQÅŸR1ŸL¿Þ†æGJùlÃ˵ӷÁD„|—Ø÷½‚þijR`Ï힟g†“Uë}ËÔi¥æ¯:ÓüPŸdþa×9¼Lóü–äÐÔ¼üº˜Oæ?Òãá5§âáø?%è•opgŸw÷ý+èOJON"oZãó|ö.KW i¾¶éZø¡ZÀüáÝ7æ°ÞÑmidéBØí½Gû®Ù#_îÊËxG1‰o¤=96tª… ²ªf]ƒl*âæAλŠŠoá=w†8l}%#Òȃ¤¾n)[cðº%<.ß'Ò|A!¤uʦËAoI@€Í=`ÕteñþKêa@iœƒ»œ%‘é±o¼i'csŒÆ‚4 ïŒÊ’¹º.ª®‰–ÑN\Måq ø*>” ÆlõdRñ—ó %\iûiUèqÔg™oî/ 5wÔ@ÕÑÛ4 bfªŠ`cßôD-8¼/”ºœãù—8HÝNÚ`Œ¨_y9LuèÜ¢â£Bê49—å#бöóvTê 2<¯]ëéæ7÷ìNˆ¼ÔuæV„o_ÆFÆžÖ‘5×ÒlW¨V#ž‘§ø7KÝb¤Ûµ¯hßß!¹8ÓÚÉuRAAŸÉ!‹%¾`2tø9+—2ÆE8ñW’nþ£üná6|Thåé˜:E" î:zK Œ5¢–[!n¬sºÑRÛõ¸t¨Qµ8Ÿ”“ Ú“Q‡ŸÂƒw®Lªî¦bjióûàXWãyá ú€îÐ) ’)¥n•Ì?p*”žõsaõn{á¤ñÅ„8dýùæü«p{ûq™T?·ëg»¼T¶ËKµus?Ä`:3Ëwõ§ú±#Á€¢]Ü«ö`©¸ÌEuMbæ퉫T q~ÑÉg®b_WÙl$v•¯¯ÊQIlRk>`û‡'q˜åæs´dg»a šmëŸ7·ü˜žüÉ_aÍŽt9H̪…—¯tˆPÖÒîæÏ_ÖX¹_ú¼*äUÑW%‹Èܺà{¥çV½3ÇšµºòðZéÜÖÓTŽÉ«ž"›`­F”u<”^?kèò&ì>T7J­5=2D(%l)ü騛«ë ¾D@ýå•‹«its O›íe𢲽íÜú”muÕs•HZ]Ó \vÝB),£Øª¿Ã‰êNT*»3oØ¢Æû :9ÓÈ@Láïn“j …óoaÂögmUy•ñôIpžˆ^J£ÿ‘û)—q°­,"¹Þ®BX±­=¢³R?¡e-*dÑ"à»m/ Ÿsî00ÙÓ½4 ¿WûžÀT„µû LíS»ŸÀ4a 'p³£\œ•T<õ¡ð“=Àå7¨…âz¸ÂEI¹Tâò5Q¬‡h>½x9ÁØå"CÁ?êµIçZ>·)¦±ê)&(ÖØø o³ÁÄ?P•åØÎYvöCÆh|å™3Ôiž¥.”=9MÚ?;íñÆq… ôZk`m¦\Óô¥w:Ž Ö¶+wœ»+ .÷UZpÖíüj&gÙØÌÙù®HœÑ á¿ðÚ@eµì8¢*/j;}SÉ+ÕÛõO¤;nì'áÕw†.sWá.'!ÉM•iÓ‘A·C„bWoL›³ Y×Tg€¤Ã5³ï°=qÿ ±Ëí‡6:Ë“²‡?“dÇU©ZÎ&i¹ÐDzó¶ “+~Ü"APð69«z¥*K¶ Æ”p ©Iæö<+¿HñL ÛŠ`®ÔVNoºBMnûÌ•|k×çF(°<…Ùµ=t¢ØÓwŸh\æÈâ)#v#¬¨¢ÚÝñ;_È,›µis”7•tuó±d‚¶ þn?Üî©ÖhÐz®OA¶®]HCJPáܪ=Ô™ûÍÂaÍòsÖ~°F€¾€©væ9P6 µ"˜©Õ¬ÏRIÀR[Ìë|xè!Gm[Õ¼GÕfãA¬d; K¢ûže'ˆÌŽ(úØU¸¶C1ÂfÑhbê^’*§Én†gûüª½î©L±ëÙþá¾&}³Ã².\¡Ä*î!gs8Pì½é6¼$·tm#¬‚ë‘6×on]£Õ½Þà`÷«õ–'ùf…»â³ºÍ:Ì-•f^lS§œ›¾9Ðf^w‰VK „¥8ày`–ˆgn¶[úØèË‚bLè.9´„Ø=W4D›MþŒ=ÞƒÏìStÄ5ÏímÁyßë³ÂÈ,a½OaxÖò¤@S &ù–¥&,“òñ&²ŸlÐŽ &Õˆ¸²¹Úcל ša‡xi芨Êvéö#X7ª5Õ Ú!‘bÇLsé‹> ŒÜgŠ8KÉÑ4ªüÞâšFT±·Ù):Y[7Æ’ì¸SÚ<Û¶¯1g•*¡=Q'Í;»M&êXÌ=Í_Ûl"Û{$ ¡^šƒ,Ô.‘(ŒR«¬’ÒUÕÛcIññè„OžõAEHŽäwhÑâV»ÐÚº&2. »¸ù͵â -Õ`E–÷¿·¦Æ‘Õ¢  kÄùmJŒn’Õ¢úfœ•ô-UB‡æxBºËJÎÃòQÎø+T|'‹K<䛌(ë”Mx{m­ÕțӮEÁüƒyëÄ€w˜²ïù.Sá- f­ñÜ,ÐÀj:9Ï_¥Ù‰^†õçûth³Ï¹âÝjk¥…7,{˜ý‰%'.D¹>Ï3ý»'• Ôrâc€tðdu™«d5aÞþ¾‘Ø™ÛgëÊpn0éX*Šƒü¼êŸS ÒÓ“0Å þ™* 0Ÿ%Ç/Fq.ÝÙ>RízGÏAO<lüÞ­v?ª éê•ßy¶z5TrËT9vC‡í”ó©gÍÖL6EqOª‘ "”³#A왑ua?JúüÚo³pë˜R»ë^ÉHR{@¡l9 ñ;êÄe¹†öé®O%ÊåyNƒøoX\(àÍð×˃_¯€b½ _#•HíWÓ­ ~/N¤v ËM‡Â¯ÙíÕ‹$ƒ».ûE›+yi6‡cgê/R{†Ë~Qóº¼-?VŽw›eKãÁÍzhS£Ì¤©/3 PgZý P=¥E8^Ib¡¤F9®…ÖQ[Û.þÖÎ|(aÚä¶éÉî”g~#š²[7ÛfoŽcs–Ðz­æ 3iQØtHHßú»vÃ¥´}3}Àò ByH¡Õ½èIëD9¿ø©„[ýœyÏØW_EãµÓ ëá²ÖPÚ56Xò¿û‘dmÂÆ¾Œ]ÕÙÝÆvð86Ô—};x|TF·zßBcØZ9=ª²…2žü{³ËÝZk-:÷ì¦1œÌ×1X.`ïA2lÕ­è•§U@50õªŸ^€ëþ–޳àqó)VPœ>ÅÚÕ¶.˜AŠ•Ú,E‘ÔÌÁíz™;VÎsÇ)nγGRç®ß2†œh$EåÊ8À4ƒ¥ènC”e{R Ûk~¨ež÷9ŠjgB®çÈvS$»Þ€ŸÀ>ÍgÚ×Çé›!e} ¡›u?Eî=sZ…tZ€ËÛ‡·îê‹õ™¾ô9 þu£±¿wiޝ¼ªÎÕ}Rú"GcUÊJõ!M2…T Žâ]‘òq—Nׂ°Î”Õq¤X›åz(RÖ·`ésæ4{æ]öí1]”ÂZ7>…Ì&Us˜É 9€¿CÐZÉmf2»WÍn&+uÅáH±ççùfÂÀÃþ4ßfWVýnIa5sO=J¡ø¼ÁF$3©ê Í-ÑàVPª–Ä8Žª~A¤Ô}@)WúšbU_]§EŸÀ‚Û†Ågìãà€”uØ›6|Uøóz‹¹ÎË Ö WVØy=¶”BÓj[W¨,ŽÛÍÓ¹ºH6Qu»|œ“ŸÝ">9`ÇÜXJS[uÅÜÖqøEꉢâàj‰.·”ÌEÒÕÓGõÅÖà·=᪴Ütר©}>_~ ô5õà/…µ©:H96rrNI ¶ó|$L‰«Xš­¸;ÆbGÆŒÆ~ ›HSàN‚ tߊ«ï¤%ñ=‚Z·ÏÒ„£ ª’‰Öó® JM\xßQ»ýà,|¦PuÝiBu­§C‡­<p˜={IYdwÅLþ­1â”1!éGÕ`ËxÈÕˤK zyP1Ž/h²5k û5e e_G¹=«n©Ó±yvÑÎ]®ÔN‡ír¥vVér;@Dn¤É¢lÁO™$>½q瑬‡DûGÉ1r<±äxäpYoEµ·‰Slxrþñ Y†×Ù£Ÿóô“nãº}ËÂÜÜ)6<Ù¶?Ž*ÚX0N·_%:õ`OéÕ¡¨RÅþäÕý@¼{Hq=9Œ;¨nö{Íâ¨ø˜ÌüI•[3ãyäÓ"jîqúíS¦ë··ïv7©Ú¾€SÖ›Çút;¯Y*!s‚ßúC ƒ™ÒÀ‚wj$=i_Lä)*rÛjç8Mœ0¶Ê¶sX˜) Ü.Øup „1Ø“cÂjÕ (jÍSµ5 +±õ}Bí–!*«€Óëwà„õvS f̹®Jl$CAÅÛºQ¶þµ |)jc«}¼ÂbðÞž–™Í:¬À,‚ðá”F>·÷ñ(i³¼âˆiÚfO95RíÑ\dò€í®x¨Â~£ýí#b%?Éû†˜œ ·jƒš¡j£<%Tmì5lÓBlW »A’õúE棷}/>rlCÜ®8“Çb ó0×êEi7R¨l@c#AFû4û·àrºà•E¬®5I#/Iû^rcö¸Š‰Îî<ìmT”ÊDµ›ù‰‘Ù=å.Ñ–X þž<ö\¶š;¿B‡é4ð¤úÁrƒ!´@ð{¤ÐZxWáá;èúÙÜ0-¹.>`ý–vnÏüR›2—ƃpC´Šóø¹¶¯‡ÒHŸÒÒêX×5Qr¡§F•rÚP®;¡×wï×úO²Û€¶D%wøTvL²%¯öˆžh›Ne-0¬c¹ðMooVˆ¢¹lÜ¢MÖœeì{Û n‚GåɃ¬|@ñ‰*ËͦbvEzÊˤá%´Òì0(l˜½‡ÜÞ.'o$"i)û!Î×è ‘¸¥¥ì&F²mˆÿtƒùæw¸Xƒ×’U&dâ/_dn{~:©¯(ol¿YÚÙj|^K/Š¥%ªÂ;&Dê»-HŒðeÎC1®´¿_å ê¡VD$mz¼1×ì2Í=²õ.ghP##É¿;òì– Œ+Ø÷Z•cìˆ2)U|Û¤FŠ˜–Of#nªm^•#⚦«gNÀè˜áMo S«-“e|ÏðêmÝj¸Èáá$wKć¹$°Ò\K× ‘ÖÂ÷ÞWœ¶N4ÄRÌ"‘ê»"‘lÔ#I^{3‰ŸÉTˆ)j?9³çe6Æ0±…€öéÔ^HaCá±7 “Uߟ³Û6T±²íÈþ¤3ˆÂ?u΂­‡¥ŠþÉÞry{p HBå+F8+")Ðü›ÍVœzHZ_õà)UL=lJ;gIýäëv©3#€}m‘.LÈ2Ý5ùŤÙH3òwêÏórç]©ÖÉ„Åk`ÖŸ1ûˆôð¦xb Þ‘ÅCcùM ¶ÛqÍ@·³ÝM\&‡Z?ü y„5çG~²Ô½¬MËÔdŽQŪú›#TÁví@ Ä¡VÎêÆ¼yúv†â­k™:ÏUÁ7˜W-—5šymÝÈRåV!d6$^¸Ì ö¬¾È`'ûܾÄÊ/¬1jø¼Ø´IWZvýY[¶™%É Íl¹1·–©å³Õ<ŒêyGrY½F¬íƒ#lKu¼ÑÍHU|¾åÀȯ«o¡—láSþ¶C}ôq°ódØÁñ–©6§J˶:»ŸÃÝŽó²zvÐcô¿3µ$Ÿ'àj MÐr3vÀ4Â}I•–¢±J©å ¨XŒÓÊu(ÿpÔµãÁgëð8‰=[N6®‘Õ¤euv|¦Ÿ˜7vÅF…g%uì‹ÓHÉ;ÇkË7¦ñV]wÉróx-¿y¼¶yUŽ*mjÄ9;‹‡áÁºUÞ¾ð^ÃhOe¤»Z‰Øøx"މ°¡ÌK7]K#­JX¿„åÏmuƒAåZN i‚ïÍž'6VœGu/}yyÓx­$ÿÄ\²Ìe ± ³J Ç’xÐ/z¶ÔÃ/ndнÉqîäÄÞ;8­(æè¥µtIˆÂ쯴Æþ£~0 +;D¸ˆUœ0)Ùs*¯¬CÊc9×ÜáA† +[TXPßW‘'‡Z@rï#~¾K©1DØ¥ÛC „“ª«cjˆå²AðÖ…ïâ’xü*Ÿ0Ÿcp¿×­j솖-º$ãÊ‘µº¥œšx²xÆÇKMûaxŸzí †~Z¹®Œ=RÁÚß寧Íë6yH‹2·7ø˜°¹ŠL}Í!B˜Uz>ÏR9+C+?BëÒ¶¸Uö‡l?k®Ù~·æ ]ÆâZmHÄ]·(º†oËŽkš\áéÇ·±ÐwôíPûã;L[Ëdu/`ÛÜ…Î]qÓo-_Ù kš"OiU¡¢,BoõÓbŒÆ¨V¼óD¶”VNŸAŠÊ“ Ïçø Ù±µÒmŸ‹‚X%TµB—±ôKª Zð‡²Ù¬è'4ÛëC©ÛH{2·Çû§„WJ+Š]V‘K1ñgrCgœ8¡Ã±ŠNº=ŠVúùPßò¤’À¬$°ËN:s@#tl BÌw›m…Öuûií,ÃÏÏ‘c]`ƒÿ€ý.f\l…hfG-Þ4n¼ðòƒÞܪ¼eª©5Wtnú³EW­¥×µØ‚‘ဓl¶™@v#1š¿såÊÝ–B¥¯w¸UììþÏëg‡.sb+|vKv¼£ähÔ–¬æóûw_ÐVOPUá D±]톫¯Õµuö ZMÆÚÿSß'jô5P«@_#ƒÈ4¶¾û}+½ÓšýCâ›Vs°HƒÂ¨úEïµM±¢V{‰Lx{F¬ªc B<ž»:y™,LѪ)¶s;´îå.ÙRZ-ûÅi`Öâ¤DeØ´Þž­ì¤á{ûé\áE« dʾpé¡_ÙIÁKŸÊä[=µA†$§ɦšc‰4@Ÿ'yµyySeç¨)× 5¦¶Ó9É÷½ØÊÎ÷nàV¹™¡:ì²~ö‰í$Y[Z~öR,W×é§Õf»ÖCó…˜Åi®ÓO+<ª…XfÄšßÐàÊ;µo“. ÿ £$ž/¿XY1àå°2K'¿½4¢bÈS„ïOR•Ž•5Nlê°º­%Û.ÁÒB:+ö”»B`òÀÙßšµC*kI‘`ŴƦp^j„£µPÚ•¨iŸÃ1–•ÕÑfØÈÅžvä“›R&íZ»íÊC1T¡ë¥µìV]˶ ¶²ñ]zÕߨa; X‰øU¢±Kf–vHVl8mžâ?x Õw0OV—:ºgÉù ëÏÛ/º“”dËÔ‚DSy ÝP³¹¥E”‰´9¦¹ÚK„ZáX¾Xu6¹YZ;Q/Àö¹ C„#ö³Ò»l®ê¼µbG¬5—€aJ:o–­óãË|ÂÓw¯±\¹äW{Ï«{Ø€&?˜Í.·\íÆÔ\‹qÿ8·~CÖF<â¹ÍO È]e€WŽÃ'OŽ ý¸ÏO±mõïÍY”…0kö;_g³‡?„ä* zõYfìP …d_Ú¾NŽÝ—qŸÊá ³9W›Ù¸15ÜZH׉Ѩ¹;[gÖyØž@ÙÏ ÆZèõÃü¶´Û"`¥‹šé:ãÇjMßÈÄáXá8ÙŒÐÇÂlÄÛ¾³â" 5×%±¨·Þý¶E±‚PÊe×e sœ.ñY¯±¶ gðõe¦eúÛðs‚š¬…ŒÝ€sj ÐûÍùRí%Íl@GüUc˜Q¶¦ã ¢7+')Z*[sFzœ†4Ÿ5•ØŸ…1s¹Ðè‘O+eÙòÙeOUÆåŒv2¡Úã\7’ä“ B—H’I9ù%bm OAç¾Õý$Ai[¾WÑÈNÚ:«ív˜†t(­;~h"–nuÉú’(ïžFYw&}ºÎ jS?eü¸z¢Ã—Å—<$óÅŠ\ú©1ß?ú‡´n³0L2Òúª¶kÝÅUÛ5bÊZwÕv­3V½³ÄÛür§k)væ2Ï»< CüÀx:ú™OÃÍÏ4×Õn©ü~ f†°­_Œ”‚vXæe¡ØsĶàˆ7\Üm­÷fØvCˆgòÂç è]³½Åî¢3¥Û*ØAÑNEÙ½°ït&»úñµ%ª.ñÕiN›¨vâe5jZ¢ï¨µÍû­í,ŽfG]V£…zz˜U»HÚ‰hð¤D(uÙWÙŽUÈ÷h’QiD¸¡—ÒЪl[?ä™Ä|”/dÞð»2ùr¦IBßGšµ‘Öïx/èÜ .ÌPÂ¥çh•Â>›Öƒ³ô•#£‹£‘8âT×wîrfghV“6L¯ø¦×ùù{ñyW¯ò¦;­wn¥Îx/+À¸ynoUÿbnÛ|*ˆ¤uKH?£&ˆG¹HBˆ^’/en‰ÛF„òI|{ÝPL¥œVGœÙ”“R=0E×I˜B.™vUÒø cÙmSîé¿&ÀðÄ~ŒÒè©¶#D™iõÍÆ–KÀ—Û4z›©„eê®! Ëi̴Ӧ虇´éú;[û†æ¯bAC¸¢QD±vŒiõõ,¸(˵îEªm÷3¬Õ0•ªV?ÀÙŽ räXcäD«ãoZ_§*7r²:xÊ®SŽxlP«¶ýÈ4õ6B@ýÁc°K²±jÕ¬'Djk`™fG’y€ê)5O0Ïñµ†õ¤F9Û³lM§Ô…ê5™WšzMÇYßTœ$VZ *N“ó²ééU;@^öô Áï=Ò ’;û—oÖ”˜jƒÊI5€g€ £DËqŠE°«ûKœÂÂteRõ7 ö½$ ž),(¨Pç4á>Üñé¬ñ³†¤ o¿´g}ºM3ÓR]my#cK‹PN17E<@UI¿ÁÏD*<ª¼MAÀ9 ©ÙQz‹•qû×C”x<›ŽcOaWôôº`S#Ún†²‹ü<¨näÅÓïq!/4è:y:îø‚Ëü‹^,#âÏÁ}Æ·ç0Á™ãó£Be4|u“9ŠãósXí¨T•u=$¹S&Õ=Ñ]9vtZòsœðeA‰@î|ä­æH¡Ò6…J7F%—ÇoÅôµ“_&ú¦Î7jx]§tûe*‚ƒÍnë „Áµ:Žø"|‡âèT¥øtY^[€”“`enWcÐz¾š|ØÖq†‘¬»ž)Ñæüoõ’þ°=»Žÿ™ƒ·;!XöyÄP„§§Ü™òj6 R®‰QœÀv¯ãkL»´-Ž‚…¹Ý'×ÉÉ“ŽuU—Þ`.·mþ”Ó¤¼äãgÛå?ƒ!€±ÉH;êàÙˆ2%¶­±ÕðþÙ _æÛ±z·¼l¼Amü²e¦œªÝÆæåäcE€jýè~‹oÏÝHR2·ûÎͶNÞª›q×h Ã=´gý<¯óBh††çg°ò½±ûÞ7Ôñ=ËòCî[eT x÷ Û J â‡k†ÐkÈÇ-¬cìq^þ°¥ÖÃ\F¨";¡¹"ˆ+R1®Í¼â5ãYÅh`-w,´˜4ñ‚\§}Ôàcß *2B¢N±žóñ“¦'oûx»Øè‰X'?Ôssp7ƒ š Íy%ÚbºÄõî(SÚ› Ù~gd Ï8X ¬¨oøþ²Ⱥ%e>jMS3BcÓfÍ;öU>+oÝ‘Dœ(Ñ +ƒšn ÿ´ƒŸnìñ59û·*!^»ìL¾/E§@H4"Ÿ×u „Á.§ëëÅ.g¯±‰¨|ßñ8•Äéä½›‡È½:Ô£‰WoÆ39¦ùÑp(ÿ̾y@2B$O+hyJvmб‡¯—ö›'Û¹§„õ<ÄLHö<Ètõ|ó‘Òó±íA†¿w7PF‰ þJn„Ç.ßôÇÁ®ÀPóÕØÚJa^â¨$êœ/þ-3©Hu½d¶[y9Œ ÂßîäN*L’î°#ðÚsѨ§|láâžÛ²îSl[Ý[f~ËK3=%ßÎÖÙ»p[â–Í­¹½,*P£†|ÕU0ÎkTÛ¦ý@¼{$†F¹SïΦ/prpX oêzÜâG¹l¦rl»{ÑÊ/X$ndÆ–‡BV7i­w@˜—k>Sɵ' ©m†KÝÎÃ`³»á^¸WÀ§ Æ¢§ÀvÈž%/èSxgуJ©Ñ$Z·qq¿ ¶{R¼Ô˜Brù(E—Oü¤hvÔE¥ÈZï[Û™ìáv«;³7xúíY>H5yX|kå‹hâ€gÞ½‰Ãv“&jDq  M#Ê×å°ž/=ŽOç[ô=—ô³Î(ëi¡Aóf¿€\³ŠeäæP_Ê»°ß´ê¿ð—éj·7ì&ˆõ€v@XPz”²,(›ùÕ0H­Y–lã<>®PA¶bÀú”.G$é£"ò™ˆÇÑ7Ö’ð§”ä@Pò±a¹¸6ò¹b&kåð¦ð­ùýoŠ ”r×ÍsHºy»nâœoŸ/"p%ÅØ¸'E’Á/ņ@ž#Xád(XU°½øË9üì·x®¶ÒCL‡Ððy‚ëT.‰cšÒZr¤Y‘ض¹â•èmÏõ¤8²)ˆÁZ’HqA!‡ÊÜ®© 6’T™?qXB‚®Ã—êALƒÙ$r‘“Dr]Ƹ˜%e' @¸‚mpDËÑoöÕ—ìƒläÌëlß‹½ÕKq… ¿Û´_jðϪÔ>\GT”ìJb·ro@[c ¼I)Cé™|«dÎÇT¬×Ró¯íÔÛ)ÕäÆ¦Ø® >dÞÁK›«<68 –‡†‚9OGŒøÉ«Ù>èÖT.àò¬·á¥‘˜5&öT*ø)¶ô§‚ ¿•ûÇâòç„-’Z n&~‚æÏê·ªC’5>pš'5¾LÛ‘ÿétJ=OC¿c¼"äOÐ8¾)¦”Öç@¤•†Ç«q´W~Ž!@l/ÄÀ”Ç!I±?ìRtɬmÉ·¶S=œ‡õ[²7bÔ’\°8"ÿ·qµ=Æí¶Ôýw¶çéû»mýàáËmpš—¬é¹Ì’ƒMy$GΘ~$y œì%SiDW)‚2( Z/Ô¤é^âÙÍt?®ò Õ/?µúñ¥âÝ)¶N„S3@QÀí²ÄkÌ£FâœpsýŒý˜C·Á'êÞIÔÞ`ðv£…¥?ÝÏ^ÓK«´[Ȭ"i¨ûcÜJ}Ô*½™hCÆN“ÐIÅLšx$J½U—¤Ä‡iŽñŽ6e²ÄKâ? ·FF6IJ²ŸíÌ€¦"#AW1/ŽAöP•=OX3Î}Þ¼fܾ{²—¯Št rˆRx÷Ô"°YÈÇ"y—ÓQ »Ò-¸•Dc>Ÿ–ˆ”õ{Û[ó ¶*g#n–*„·ù³ÏxJ¦ðιø9šcc;ÒZ¯Ó•Ao µ«¿ ú*JÚcA]ÖYÀµ‚mð4¦®$ÓÕ¢ÁBô}o°¹çé &LUK.-ÑUÕ“…Âÿ»FÂHßE¾\S¥ø—*|‹2öÃñ ê&VÆ÷vô¡NÈž;‰AXɇ’å¿ÐƒÐ`ó˜=~t6MŠ DµüTF‘ã窷„1Ø^Íbˆh?í^ äN“ÑŠ2¢Ô %…HN¨‘¿F2Ý¡ÍÍ/æŸæ§¢ Ï®ùŽ ‘J5®Gƾ.©Œ/xˆ€&]Fe߉cu;ùb?^$JÁ)­,dJñv!SŠG+ ÝyÉÍlêÐÔd2¾–X6rNÑ àâO®‘Vϯy! %› <ºŠI\Þg§nX«*í”ÜýîìizX<Ñ/Û2P“ö9Ä.O'™Žc>-îH5ÿvð¤Dc;«·0³¾&$Eà‡{l¿bÏskÔ„ÉZÉQçÁò<#–ð—l`îLö³PƒU>:®˜‚¬›sÏžÔ_9:/ÌŽ¡õ„{O£ù·B"ä5NP´êí-æqÿऒ»xÝZ¹ÏOc*×òÝt¾ÀGnÛ€¹X—b:Š7膚zH`p~ŠãIÑÎøUY´AB6ÙD)„I%CÎù—ˆŒ ¨ÈìKQ\GHƒ"ËÏNüøÓ…×J²ã‚®Â§E*ø¿Ýž8Ú‡Â:2)Iý:·R,=È´&FÀìm”–”¶ÈÏ…D)R\¶N a—>ÌCV)®ÁXآǎ] ,F{o¶(•VªÔ‹Äd¥‘Äšk/(†^¹º²û"ÃÙÈë|V$,R"džºpÅ›h$R™[Ù/Í‘¼ÀKÉK9µtl’sÃEl¬ªÅwŒÞã< ìõ’Fœñ`KÁÖ-BÇçÖ Ãë"[³è¸FY‹ƒ9ü.u% @ÑÍ#¤T‘âJÆÜ(¡®XÈßò´0@ÿ9˜-ÇÑþæjŽ|gðìíÒ¥õ¸Ùp¤x{Ä(ã°çÛÏöPNž‘WGÊnêc2ˆ7ܬ`T`6é7&ÅBp|ŽÓÍ5œÿà®É_…ƒŒÄc ³ZOAF…誻&øŒ2Å`ÿê h†Qµ²Y±Ã—Â&.MLB”¹½•^¶¼ U8)ÛÀ+&—=JÃÆôCN'Ð0X ÏÔ¢£Tº\(±kqS®/²+D6bÁŠ»C€õ—r‹éŒ4EŠz̘d ÅtSÐÁÛÏŸ ìÒ¾I9õtór~¯cø¡ñø£™I„2·ËÆ,tXÊ7“¬öéÇ”m‰\)œ3ûÅç 8ð‡hA âêÇ¥ û!vì°jCÑr¡ÉR®·|ÖC•b÷ÅCWWS'dˆ‘ºÃ—ëÚ¤¹„îÝá¾Ü¬Ž àpiæÀú€ ¬RÂ3^䥺HŸ…Ð0©!K×",þ,‚“îó¡-šk•Ó¡8iNî¿“M!ë‰ÔäT‡Yª5D0»ÉÇU»3—2ÚUßv1_{ÂÁs%R“r"@ô¾íª„ {¸Ž¬~“zì@öÐ[ÁTaqLIàTEÍvÊZD¤˜ÛÈ®vÆÖ‚&hDÞCElºÊTJ¿zôG,ˆiâí2¥:\ŠT×v‹6Û媽>^½8i\‹íræeÍvžÇu¸GØÊ¿Od¤o‚d"¬sDËí5]é ÖúL#8n)a+ÕbÝ®)R¾!¤¾›V6’°y¨îs$Îíæ‹]Ò°^JbÑdU›ÀG‰MD2ÝãQYÕS<ÎŽ<H@“¢y1ûH¥H¨>-r”hå“GEjl[Î;mÌ•¯•Ç¢D uµ*™c¸D¶†”]ž‡ùuʰån ¤@™Û3ý[H=mËS"íìÓ¯[À‘RÁðGëRŒCh}làêK,§ž'ØZö!!Ò™ˆkQÃèäÔÈ+\VéfUàAJ ½’Jw¨ú Qµ¥Ñc‡jkdž’×eU·ê°Thz‡ØJTÇÆAoºjñÆúŽŸU0§¸ç“ÅÁœºe0c½Uý„Pûá„«€gÏj´B€LEMÿù¼ÙZ—85_m%< }Ô”Á½¹(›~•« ¥‡T*¿:ö3 ³M¢•8+; ¾à8 .žfMËÝÒ;Ê ^5‡oK¯y\1ØuZf«›ÊÏ­$ØQö©çîþßj\8vެ֯·?—à| Ú|›!EÈ©"Ž!ÅZÍH\rä•#kÀ6|Ðÿ%T Sæö64œ_@“Dû"jï)vó¥2Íßæ˜QNчŽ,+Ò²K!‘Ò…UËW´Ól;‚É¥OÀE‹ðKV$‡ V|ƒ§–ÿ‰VhÇæz •âÒŠm÷S1¶Ë¶2*íP}ŬÌmˆrÂ\Î*f9¡´'Ù@\³´HÖ1>ŸomÅnNiK MQYµšŽº`Û6I‹G”Hç!$C‘¶úH³¡­nÒ[›Gc"$êvÚÖ%Ã¥Ö»¤‘7?´žrlº†Õ€å¡rõ*NAÉíçÏà3lg±5Û^b\³_[‹ðašŸîY¾NIÝZ¨hö6ø‘|@—SùÒ ¹z²}Œ$Jó¡K`:b¢Ù2Ü6v¼Õ>j ¥¡/ i—Û£ÜóÁ&4Óyí¾øQúα—žBfܼvºL?¾P; >xß³¢ÛÖÏ *µp(lÞ>x©öî w) ð}5L/ÀïCBÀ²Í»6àøú(@Wb»­‹ï“ð…6TÇÒèE7]­Qé·#e‰ë{ 9›°ñ‘á6¼êaP/ l·p­GÅ‘ëÄZ£Ù?lgñïÌ7 ¬— 2¤t¾™•ÿ² '¶«û¡G‘zãJO"ëʵ™¨§&ñu¹ÝøÐþœ³bSD“Êc:­€œü$gÊÜv”‘ï&½‚©Ñ¢áŒ‘«çaòܵÅþ- ,… tÍWáhˆZ’uE$–y hécïdøÆQ[J ØB8Ìßi ôüÛwâ [ÑiO¯åL{r|Äi/öN®”N„ÊM&e)ð•¬Ùxƒ)OS)Tœ°?{ælO9܃È¡3“‰Pä–°"Î×%Šð•dÃ.É¡"R./.H[Óç—“õþ˜ù´\íã\†¤–Ã9—bÓèVàÉyWf ÂLÀáHY´ƒWp5/_à¹M{µµÄº pNxcíŸÝzÕìONeˆ8àŒN%³È.9ÙUãwV̳9j)È$v•æçƒ£ÒN| à €-¢ðAJviµX†´îT‰´õYh'¹É)¤A¥‰ÎQ8H)1Ÿ¹Ï)¼²,T ¹d`hÏÃ=N’V…Sã~Lº âa—RíÂv)Ÿ¾&†oüáV#ýòO–ÜyQh`?λѧþÁ¯H$˘7Ð.9h1vq5èB(>àʞ˻ÀM,ð(»m9ï¢ß­®>R•Êñ”¸‰X‘Á ’ˆ>22£í˜ÿ˜’Ó:q ÔÍ襷¹3WÊ#¨„D·Œ"¬^4`D4s?‰}>7æþä2Á†W׿eaÝ2r×Çföxà ³‘_ž*¶'2©/!UÏ…er>ÇžgÖ=0pKgü²ßRq€¹ŒTy- Ü%Ú߆(Óo?.C‘zKÅ—q«Ÿßa»œ¶èÔézã•'¨§—¸„òø H=·gü*{±Š2Ù—€®As¦¸tÈUV7HQj]ªBÆÑäf0èD)U£bÏßFƒë†lô7«äãù¸þs+×ÿ%»`ÉCbà oAƒUjö3˜è«ç”ƒªùŽ^‘7³°\Zê `f§–›¼øÌhÖÈe#Ê¢‚žÎ®rÀ;3¤î¨¤vO15¨eE"È}"Z\$D('Zå$¹:VúEWOt=ÿÚoÀ¯QåqJA‡âû€®JTðsߥ¤æƒ3ýƾïS. B©¾6â!Ü.ý Õ¶Í¿çeu%²ªˆV—€Q&Jµº¢~vÔÒ”€ŒÒëòãXÀᰉż-’VÔjêzƒd¢…bd'-9§—ÐÓ(jŒpü+‹êÂLˆgU‚E|’›,(¢b ð)ffÉkåy@Þ‰‡œƒâaÉðeFNwFNmT~ê Ô×(³WO§ÜÌÖß_ûou©|@–úQÝ«÷R´ÛöÖ/#ñt2˜¾Cö§ØUöãÚÃùü5êA†‚¹ŒP¶æ»dÀG:µ¨ìZÀ’óŠ>€5Hˆ)Ë«@ò°Ø0ðß_£ 'ðYO‹­8·Ëžd/QÇniÑ:uì–B¦Ñí¼ñš´4ÈqsCj;]ˆJ¶2ñoIbJÔ}«‚Xϧ&B˜Ô'¢;§To:œ f“ƒÌ%ip23ÒRÜLô-×ìÁÇý<Ê}ëAi|÷aávg#ˆ) %ÉòŠIÒú *ævé% òï†KL‚ŒÝ†ŽCN}¼;UUô¤`P‹û“d&Jȉ_DÆv,§Ú·Ô&͉ /-›Œ?š-š\+.ªŒ´ Þx­eÆñÐúëT¼Ú„@1·Ó÷Qm6önÛ‹$´ìDërÁÙR†BÇ¿í”[½Øå©d¹wÁâ…!0?– }Ðsw](ðßp(ÉC"Ã×…lG¸`”Á[‡/ vzqÁ(¶Ë¡ÿ‘þ?×cäÏßêg:,¼óqùˆV€¨²ç\‘Au6jÙ ‰'ù½žE'}­5+<¡šÌæà¶ôg ‡~í-¢$üMFX* PÁO£™Œþß%ØjjÔÃ;`?IµlÚ‡A?nÚbÅ"GsòlÐQ¡,¼¢Ð•McŽïíDhȸ&$I™Û²ç"r3K«å(~< ±‡y®Û3`Q&,3<±Ùª5­wb„uS›WE`EòLÝŽ:™cÀiKJÇØ¨Kô˜ÓELŒ5@;©à`öx[ÊDÙä'EÖœH߬äT¢KŠ™¹+Ä/‘|`< Ù [ðÄX ‹³üŒP»6¤d'!tŠ$^-§ï{j’²Ð_„+c»olÚ,cøЊ?¹§µjž1üg®'³ V,4ãœ{l{zÐÀÕëTXÂù-/tÏnÌsv0Fòá Ã_öBFÆç!7UÀHã(Ê;˜P°µÅÔÁ¡‚í…Ðåugþ‚»úybfˆcø†E'}ñž€‹¼Œ@pHêt„Jîa’m3q/°—8ÂxÛIP(º:zmÜQ-ÐHÍ>û·¸÷;ØT° P©©š†Csöï- ïø Ø¿yÉ:ýù;$Ù)‘b·¿…Œƒsg"¯To,õÖòtÏ|j'íÀŵ`ë,tï_¾ë¯oåk/˜ùÔå®·Nf–¾Ùmí+Ýœi8¾èÖs4Zo»õ3AÝv­ia°t»–M #e|úÔc¤@7€¤o/ÝyÂÔs5?Õ¶ŒSVr*„d2~« D[‘h–qù øoýE9juOŒÊç6$1г°³F¨¤HÎÞÃþ+gÉŸþ3Q9{É=:ð-Ç÷>0z-{ߥ¯Ù’pvÿ ½fD¬oò›Û]D`WBôq9˜­T²¾(±³öûK G òný#²‚º8Jʽ<_’”–.„Ð 2›[Ý×±¼0WlOp˜Û-Ç€g7^ G¡=”×ú85–.zý³…è*å:,Cl÷sÕô;Àcýîؾ–ðŸò‘u[½Ñn·i¤‡/ÚÆhSÊ…À}R”(¢úÊ­QÈë…úñ~Z×`ÿÔ,#P¬–dC3ü+^#pGý¶O¹Ã0ôeßÜ' {ûO¨ÒÉYE¦õ¹ëäÌyË7m‹kÓ‚›Û5¼$Béé»ngGÒÄð,GØêàé"NÔ´@:€pâ‚4Í…ÖÐü ‡”uo»ÝEœ¬ÅÒu6z¢(Jé:=}vöu6:Xw°ë¸H 8ÿ|ñÎô3^ XOöÓ¡Á<‚žª ~ÃÅ `¶]g Wò­ë'ª$‰¡Lûp~º&.ß”—„ƒ ¶Ã}+ 8ÏO·Zõá0â€zÎ1»Òª²y ¿ÂvOŒŸÅY…=Ùó•=% Ù×Ê}öD×ÙèàÂÖVG3FýÄ2 pDê&6Ç)`8RŽÆèømÎÆ@^‰½¼—ë=×Á¡‚í2 @t2ò”ØA å¼]»EçѱºÇdgY€GqvR ´U‰Ü“Mßæ”\²Õ¾dµ?¾e j“º-"÷Î{ù -ùÖ“ëõÔl{c«=U{¤ óúôÕͶ.ŽP½Ò„+Ãå²1 °#ÀN^¤Çdøg3ìªï¡ãs'Èj°ÚÉ‘Ò#ý áR~\Š™é&ãØ)o|d7É™\*®“䃤 îy*ûy¸ç±Ìw_œ–ùîŽÅ<³ž\9ÁüƒƒÜÝðæŸRÔ>­6 ™¶ôT(Ù·é¤D™ÛÛ‹&D0¹À¢uA:ùOz ~‹Ó‘¿%;Rrþ^O& uKÑÇêàP™ÛS%džÉس:ò1ІAK6Xa ÛÕ˜ÆîsÇ×Ü¥4üø>ä¸éäžì+m5Ç„2‹¾at‰×M¶k»ìfÄ®®AÌet–m>˜Š‹Fv² t° ¬C…@w[ZÛÁˆ‚íaP¦`ëd°µÆùN4£ûÝË]˧ŸxB«ç¿@©ÖI 7·‹ô–Œ’}Ï_!qPìh>U:­:™îˆ­óð;‚jž !ÙÅÞ¤“Ûä”MA#‹ómh­ò°¤´åÉ«;¢™¤E^yHew·ž]‹Õž³mýšªJ$@7¢TƳoµ=è5æ 1œÚÉž?='ÿ¥2'É îòeðçOŽf$ïig£úZâ†U5žø¢3‡Øw}ƒyæx7áF¤SkŒü¸Á"}? yTõ·¯FÊÁéUY#гÃU®O^ë&¦Îð†GE z÷‘ªÐÄÞôİF ëœLövT;»sšm—‘šéÎå;å„­8¯ƒý$°Ïw²ŸôÜœ¹–éo> (À땤.9Zì(K8Äs¹Ë²ÉrEfˆSüȧZçz6á"g„-ÑOsè­…*⪑∾1š­8‹°4Hvm ß`ª©îI>‰i˜Û¾×ý¿âóH±©)\”·Ó–Ð3¾½>">Û£t?¾TŹ;s˜¼/ %¿‚6Ûl t¤é –‹E× Giçã»p°Ž’—J$ÓºÉÌÕ`nŸÃ†^‘Ûe]²t­gõ¡l; –~¨Íþs"4õ–h8[ÒJócqp'¯IÏAæê‚L¬0í›ødg’Pßz]Éléœ+I‚’ž]ϹLt©Êþ“áº8à mÀ÷…94^§’E¥õÂBì(gæ#ήf³ó˜æÏ°&_êÈÎ2‰Ó ÈÜr/³?j©ú1¯×ŒÂþ ûÍFzüñ2lkýBÄþÅΚèÑI19 EÒŒXA†ßzÄXô2ìB[Ó+,ÃÏbª½ê(›K§·X??‹é×wf27¿fØçDº>8ÖƒSË°×æ`Öá'6P 8²ÃÜmPm $Õ5¾4㸭â: OÔ¯öHéæ•pÅ=?_¶..žN¶•ùg¸RÁºGvפ0ýeì1 à— Eg¸r;fêfê»®v<ìs†­su*¥BuíxzýlW´}­æaÕ–nŠrrSÜçÍv˜á£œÊmN³k®;Q¹ó £:LMç6s6ßd«Wú›µp£ ã¡LÄo¤œþ`®Æ–Âq+nþV1«ÓrÖu½îü%4±×ê¤0wúÅÿš%¶:©á§HÏž¾Qh–‚tØ–N¼gßœ'½Z_U§˜AvòSÅŽHB«1Äîé `3•fu2žôº£–jû$`¾1§úñ[lÝ’õT•>[uä½Ò7©bTgÀ¾$¹ ˜Œ%r¯LÂUñÏ:Uب֘ˆm›~!qÑr¯ô˜t%ùs5\zúÊrÖlÿboš^ rq úSEm}h:øN6Ä1K°É—3[]'ðN”^ ‘d­jz=Ñ~ ôçËH_5ZØß² aô@iœ}”»Ú§Uâ 3)åÑ«(ׯà‹X­äwÞâYâÊ¢^«ºì³j^Õ_yƒ+íõøÃ®Œã»Øj;”L6W}‰xKÇ_IøýÜs:u}@Ø)ËkÀ©—wZË\Tou«7¦`ë_ˆ ÙéÐ$Ç͵ŠY"=J§É4·nŠ5f«Úçšo V!}GoŸ[äí³ƒÍ¾Úø•zs^œeiZºÒ¬“Þ¤·ô;‰ö„íjv¹}ä:FÊ®í ë•{ñGZĸéOæÖÉ2[|ckèì÷FRªtpÊhwNÚÖmdÄìí”äš:b4~S£ûÕn¼Q´Á¡ Ûãh¡µºÓù#*¦²XJã$l®Ü²7çíä#ÄðS‚é ÕÖñ]ª­ƒèäÚ(ÛºŒQ[‡^4þœ½¶kÍ S[<ö…iÄIÝ3ŽÇ!ÇÉÜ–½zë[:ÃzDg­w’«’ë~\Û~\[sàÝH´›¿³ÉÜ)®(žN™? ÷Öö¤ §ÎVdùPo§ÜšRõKÅD ò7ýCΑ~éNÐDӤл3Wùq ‚e'ŒY1š~:âu’Í­Ù÷U_ÊPtËãþ.L°µí•²J°_-T^=ÚøÞH -²âcä¬t«dó÷á0­â¸G.ª?âù{ 3‘žk‹µß5ß.ðÊäÁ¸mÙqpGÐ$Œ‹ø{süéT}•3/Ø®ïfþÞ?s=Éá€:¯i &é¤ùŠÞJCÆü¿ñ8ðê¬y ×ìñ”ZÑ’µ Ž 0®b'÷ìÍ¢eçv0A(í´QP7¥?È0 翚å\kà^h†:lrBÆ’Þ®´ˆMãkðØ:Û—ìC]œïÖIrÒÅûn”ËÏÌÀ•ĸ_J?øŽúYªYg Î@=‰m+>Ã!ý9ªÛ1˜°<ÛE/ä&KgP ÔØóX¾¬[Éï¢!oŒÐó·Ö„¯~L@™»¤cñ}4™Þ‡MÊrCŠÏNm £? ‰„ç6ùóY²K%# ÆÊ.Òùü¸èòð±§r»>3bøØ:0Ðó“ì‚ÕòÙI‘‡Ebó^f»žfF¥]\ñ@'Ø¥ov“åñ^v^!÷àK+ v;ØMV™/ÞÃ[‚TéOævЄý-àøì©0¦y½G¦ÚNç“2¥o^çokˆ €”-]veœ­Ž¢ÃⱈBÞ¶¹vù# šÁl¦Ár"ìjà âÖ{óD×8Ÿ®¹Y ä8¢‚¡†­Ÿôì¤í7o¶ YYÚ®ìépÏš{Ê¢ÅëUç’œ&*¾í× 4``®»Ì\Î'ÞÓ³IËÖáv¶õŸ²ÜìdËë^}? ÇM™3 ÐÒÆ3mº2Ÿ7K÷KˆÙˆ±Âoÿ’&¨2òÐv¤Ž’Öí‘ Õ–°ðÛpr/²ýëÅ.ì܆O¿[ÚåFcWNF\åwÆ›–™_ž–‚èybeg½‰ðY?:¤ß¬ú@/f÷(#$…u†ß›gú ¡¾oºj2ö„0VÿáèGgÌŠ‹é«)og|¼Cú¹5nòŸõþ„bÙ§¸”lÿìÄ«2¦¼bS…0ËíJ§:ƒIäHHñ+† ä&K®ad@ú³MGvý[7aÃyÄA·òú­s€úÖo}mƒÍĨi-—Ý.á5KòÉ>Ò˜Ìí0H肘¿‘ÿ`OÅz"{G'B¤/2§ùÛy«Í:±¦½g?¼ÈõfÇ|ÔÉúÒ{v oRùô¾Õ§ }}c*i31þ» ‚ùBä€ïýŒëHì;§õy7ã&hHZÛñLbç'ÅIïÔt =ˆ-èU?$dÔ±£~þëQpLÅ´FŒš°×Ó8žÔ1¹î§g­ˆ²ü&¨ùµ°îgÉ5i€GzNà¨x” O˜wa„,TÒ ß·ÜÚN¬{@e§OÙÌd.’ÆaÍAÞâ€H’Òì,\X—–KaÔû-Ž3zËÞ]q\ïëÊcpJÎ,ÍVûÒŸÀÓ ]ü"w4 öhá`•"G!Oô¡›9½ ‰¢s¡¿(¿ë.èDDôPGÇÔó~¦e@Å+•N ×=sC^ç ºM¹î—\·3ZÍn$„ci'?Œí}ëbõ]8`¯ÀkÇîä64†B/ˆ5}7|Wcp'Ú÷]t캗~CÔ‰ÞØc\"qGy R[Ú³Ðá±Upfºqfl'µyµy»ÛXl²ÊMÚØôæû­»iß"ÓÆ‹J«¿PGeO%0Ögbˆ ~›^›jÉÉ#¨#@Ö½„R«é—÷+ þ8ŽQâK¼;Ù¦'¼Þœ|&M]3å®ô%4F*Œ¥CŒxùñz•ËßAºd?+w9׳³ïp ;¤‘ÿCߎÜÂÑšš¥Tǯ;+‰¥’÷U‹˜¶åB.”®ÁŒS|Ï|5O÷‚}-½tP†+u‡+•M½¥¢Ù;"îöéxsž/Gv³*V¼³Dog¹e–èVv|=õ’(ªõÐüÕNМ^¯n”j{–Ž×IË—òŒÿ/;À<Ɋ˻ܲØî¾/BÆE¸ þ¢ìˆTG‰$@ów ώõêã¶ä6™Ûý¸ Š ice_¥îRCZíDgQó¥»ò*D?{Ò÷q†ÿþuÑãó]m¶MN1iX­H¨Vf‚”  @JEuîÛÄ—ÄÃnG‘‰76È2·K躳‹÷( Æ"¹ŠèÇ\šK†ÒìÂw=y'‘ ‰î#2›˜/ˆ eÊOšXmÍ‹/ë{ˆNðu¾<Ù:t3 ¥aä5é«aS÷==¨QÞ¥—m¤þD”~¶k>ÓÕÆ‡Ê”ž˜v/äèª×u„ tÌÍ![”[×ñš g@M¤ðX H["1µQÿ 6{ÿÒø‡!â)O:ðZÓG_–¡…Sã þ@s€ã|U F~ªAÀu‚Ö6[ÆÑ¶~´:5ÑØØï·ë¹,}E6g±¿ÙnóóE¶“®>h ®“ÔV B'×.³«I=_)G,3™,ÜèûÆßä^¶ aúŽ`Aüu±×dËîã •ž(…ËÞÀz¢Ö Ãzêc–€îÄa$¹¸§ï þ|Þý™ˆuî(@6ç,ïe±*5¹X>Jñ±òÁy4¶[¦“ˆàkë–.[ú†ôÚ>;{Ëa¶«ÿiTË Ã°pna£îÓ6 ûËj"oåË¿qø*yû[?° }#– nµí5v§‰¼£™ô }ÿј—‡–¹¡3Ƥ²ÕÀnÚ“>‚%†ÙÛ"i¸a)¾Sqð "º}}Ð(W9è® 9¡•Õ‡Vúl#+‰âô\Æ'fà…/õ&,^4N&—Í{ó~l%â<èT8Á¹Ö ÂÈi2·ôóÙ¸;*sâó€æä2‰Edw4ÛMaÐÆH~9`ÒeI&‹é>{¤@±®1÷>|Çk)¤S†¬N–}М[ÉqŒ!âð~ƒÞí&§LVi“—·Œ¥œƒËƒôbÅqã¨`>™ÖºŸb·»«·Ò&žËlÏû,¡Û,jþ:#uÙ)—Èvô®¡ñ\ÓäNýÜyÕEÚÔÍQ^Ù™jNÙ¡·wùïCTÔŠˆ0ߎ4bE£Ao “Ã×·B;å¿ %ÅIg^eÄH^²PµT# Ït[|wœ´t(³|¬Ú¾¨‹Æ°­ŸÁÌÌyD¸ÐÀw¶·}ìágVäöq]ºÚ >Ü´'6±lÙŽÊ!Æ`ö-(çÛÍÎi¢n©mšgRëéRD–L4µ<­ :±b¾Ä¿ì2A»4FáZ·¶Ðˆ’½‰ðÕAó¼paáVÃw¨ŒÁœcÒw ®”IýÒµ&œ+ØucÚJ2ýÎ'4ø*ñµþ£g»~³; B#<?öXt§„ÛÎíYw=-/*­'L|ÂCïeäc;®9ÅNÜÑ)Q’Ž(ÜëíÖŸðcåö#ÚÈtÿpÙa±YhŠ­º±Êöñ}”’Þ¶ƒbÓÈŽZcl¢‡Ã¾ Pè)( ìi ÀW÷©‡ýdêèwH,í3ÕÒ£à̇£´k 5ÒI¨ï©ä>QpŸÐüT1ú…ï:ø5ˆâšùõË—€ŽÕ5¨•ïxœ: ÿÓc˜þ5ÈÒ€×+[Wã5´l8…[ÊòTýÚM."Á]7¹¨\0ú…x“å(¼•a¢Ao»?¾yà?±›…TÇŠG¯ƒ&t ï[Ÿ•@”ññ"~]¿]¾Ó0¿óáó¬´ªU?ë àVÞ.€OJ¯Z€Ôg…å ü˜ýmú“?_ž÷­;ÇÁE2çE8®\NA ƒ]W"ëúâÎB€Â_UUF-}ôº.ã6}_d W<"¶~Œ;_ƒ`K2û>¨.ã€A¡+#Âî"öÍu¿¨-Õ€·cת©Ö°Ähdj޽mX­îY )Ø¿‡¸€*@Só?•œëK¿8¨Ã°r„¯Êk4ôçžË’‚«±7/k™sŒªØIfTÐæ“œÙþœÄÆr颱`ºt¿Þõ[úÖ#î‰í­;¢(Ö”M®ŠDÃÑ»¼XIÒÜòm±‰]Û#ŒY-2÷ì&'üŒ¹ë c¯vßè¥_K>¥ê–|rÅáºîu{Ý{F7›éP5ƒ2ö/rÒ*‹í5žp„¬‘ P‰ºOéN…’âµ*ÚT`»´|ʶ)}ÒRxá“ î‹\¿¹—çcƒÑ²ÝÉ ”xy! ¶iߘC{ÛÊa—p×E«)Hb°ëÌa¨ähÕ7Zº¬‰&ë¸Ãl§e…^ß_Á}â|6ýŽìÍJR¹ÝL j¨3ª­Ýl^i>›‡c›aÂ+§ [í«¡°œ8ù’£²Tr™h:zŽ«EÕÁ™Eû wNãS·½.šítjŽ.s—SsˆÚa×ÅÐ(/šÞd“îqk+ý&üp.¤ü ‘\´Œš(ßSÌÚõfu´ÉÒþR+*¢ÔM&Ä’ŒxÔô,¶˜l^ ¨íÊ–?ÂWß½v8@Âíí.ÆL6ö\³8!xV.9"ùOÔ=E3¿_÷«ÙúíÈe¿€1M½ûÕŒrÐÕdjÛ¡`Q™ÛÃÜf !×6‘Ð5ÐGÏSøžÊÎ"ðà²\oU­÷S}ŸN…m¡¶ÀÞ=”²*9Pts h¢a™Ô¯ò×mG™U×?µ H[!›JRï`×­£Ôd§ß~ï <80ƒóÔCbÎG+Ä·1to¨âWP ‰£H´•^Í_ îËR s—9Â?èüVÙ¢è> :‡yFÑï Û€¿#2%ñ¨³ø~Ö¡> ' U|ܾ# ôCfšW/ }„*ŽƒSÉ€¢›EóÚ:K:õ(š?;õ§©4— Ur 4ݯMZKW3¥Ùº¨†úCDˆÜºãM³0³‹ ÈÇ mBøÓ<À¿,™}g~²ë?"4~úùÈè<è 00ØS®hN˜U‚ûáÈM¬ÇB!EŠfד@É\¢¹8IL>=v Ÿ-ÙQ?ÎõT^nFƒå:§ÙªÃz‰*mXƒõÎF+ fŸ)µFwãiømnSvL_ T/kÖ©]r ÍFº‹yH»Ì¡gúðW)âµn“…d'š[x!νæPÃØµ½€P9)ØÃl푹y×Aä( n,'É4Y ?‹C`±Ò2:@ä;imuÔl‹îiš Ü7gv‘ëZWi¤[Ù[ÍÄi]»ºÁöÂî¾oÄ+.8‘©,óÖtü£qT·¦ã·ÝÄ™®_$F$>uùM+$,>¬àFÁv+ ÒrЧö€ýÎCöSS•åÃø%$òx°› š£ŠÌ]-ü¾:Óý>l,£P(?v»‡£Ê7†òˆ¬G¡EŸÕ‹$:Šù&V-v¨›å& ÁÆå3Úçy¡ÒN±SÉ~¦äà=}’œ|¤šÏÌvœ ±ºË’ Å Óï)?Ä=öõTR¡Ì­î ?’ÅÞ÷DÚOË­20ذWd  \k9-æ*ªÚØîÞ½í+Õ+>@Øœô(Ÿ²g€öC«×¹G}K® 9ûÏŽ­Z¬|„ÛEÿ·™G¸¥Y솩\ôò†ë>FWóD[j±GJÆ–H‘ón¬BZ SÉŽ2·Ãk¥¦>D]¡›YRÉ¢‡ÅnÉçw]Tµ0V[*¥€Nò²õøveö´+®JÙy<ƒUNpáåÜYà„f)ƒ²2ªZ¨ôŠøéLÃí0¢Ø“ñ‡GÉxÌ—Ý—’W<À¿; ÷àtƒñïÇgÔ5­Õíût'K‘³û¼€`È»¬Ò%㈖§ËPËV‡íÎbËæ½”§XÃ{?…Z±8¢K-&3úÍñ[Éî(=¥»qG3 °tÜÛÕ0JÎíó°IÈB cUô/TGD¬²£Îßêš2yvqÁ´5:ë\"ŒKëgÛä/;¸kO ænêwó™©þÃWDdOnÃcw¯[™­«_ßÃOP«¤ „0„ie­^Abî'¡Z¦`¶š2¿‡Lb¥0¯;õP³]2Rj‘Ï–QdXf@ÀŽc©e°f‘èÀ×b[7!ؽ Ùçºç‡wô*½ê=¤ÇškKm…ê‘ÎmªOƒeJviHIü§™õ<íŒôΧ¯Ô‡ŒH+¥Z÷´`ÁµFØ»´»#M9:³k°W/7Šqu ºá­®òyùTiªÕ­íÈ¢»d΋ÎÏæk³Áì.¶U@_^e ptÁUV1" ‹Å¦ªÏWºöµÜVÓê^R–± cŠn;[óªH(m«æ'×ëdªR ‚#Eñ!ÌÅoæÍˆÃ`I´r£Ê• B‘…—<ñ–^C•=¼ HÕ)ÅÚýð‚ô½—}À;] h $þgzYÓíf¡sx[T•X°¥Z'7Þ¶xs§~¹AN’¹ÙÕnÜ; BŽ«ÐÒžGÕ;1ºþLÌé™}® C«Ú)Ë­6µ;Š¡®žEÁ‹Ò6Êæ¥I®áÜçJºŽ›ÜGîrýTi醪øfùÕz{‡×aów4ÛT“z´0!L==!˜ïjÛ·#6Í53’üDÛᮌǢÌs,bRJñI9£Eé« À±ÜŠ¿v¿THÃöÙöñ¡»Õìq¹0tùø–‰ŽÀZí SÎ!ÎCrsåVr³gØÍ–l盵k¡ÒŽ}Õ—þ(›Ã|Gf¾„¬xÎ9Äô™ÂòÎÎãMÈ£¢›$EI’¢—$…„E ¯ÏuÈsªþ:4‰—šƒÆ`©Áq8›+&W¢}µe7oÉØDª…#|íj;êD¼„u Ê¯Dyö(#pò ·¢}±Vö>Òí\`@_m®Ê@äËE¡©°Éê½°©9ƒ° Nhø#œ»³XIbðSZŠ|Ÿ®FõpmÛŠ ÁŠ6WMÃm¯Ú´íþªëJM³•$é¡ÙØ‘×ߨÖë!™Ç*º¹]š‡*º•ÀÁßj¤/ˆ‰¡TÕ¹˜6ä­ÓÀg—Áw~N}Ãþ;ÉfAÊ9vSÚo¥JX`ðwáš"C MlëÐÃo®VT[³kÝZQmÅ.¸ç;"lÝè€NüƒvMAi¸”lb¼â ‚}Õ=)éhi¸^m'Ži¤ªå»i*$ÌwÂ…ç61I<\ƒÉmÉ­ÁòU3‘uÑ))÷ä3ˆ,K“?Ç.³”Ùq-@9Øc•™½û²®Ë>“J¦ÝL)ÚèÉÙà á®ú·Ïm"$Ä1§ñ̯éÍ÷ÆòñÕ˪´!1΄¹Ui¡‚¡Ø¬‘Ïf æ½ÆÐ»BMÑîd»|vÎálFz„;â̹¤þœÆíš$ëЇ,¥Ziõ Ðh§ÃÇ`ÏJŸAìÏð ½5IÎTkt>%9S˜<2X†^ÜX¹-$ç,¤ï¿LÖ ÂÄ•­E$ÐÜõ„ >¥’ô9eDª:%WÉÕo¿æö/Òí€mùYw¼.¥1]‚OJ$Þ<à¸Õìëì„_{G1…Žø(&û7Ì]n>=F]‡g46%¾{k¡ FŸO|U¬TÂoò@¨‚íBוá!Ô™?ŽØCM­YÌŽ°˜_ŧÀsâ$qýªÄ€1÷*ЇÐÌ(¦|Èql¹ùu„@Ñlê«Ïǧ÷нv°T–ñ¤X1iùÊsbìàË<êº>© ò¤èæIQò¤èæI±ñ¤ýÖÏ7g±yÉ SŠwS‘þàî¶gZª½€ûcÌ’«gW*“rº "{°8gïºt àûTö` -[(ÑV|xåEû¡¹,mÕQ%H„iz´ã!skŒ¿`Ûlýq(«òyã¬ÓkërÒ¸Iú“ª-ì£á檛kA>ÇF¤VÎíRë]lÛüÐØUŽJ&œGÓ3dO‰EæIî{„˜žï¾Æ€Ås×v’…l-ê(^µ[ÁöT»oX–t¾\3?%w‹v_bЛêœN–5éÃËFΔåFv³iؾ ÃÈó ý§É*Ðò«A‘²{ø  ™úkŽ=E»¶à²PÕbÝë7ùÏíJ>’mE»OÊ‘qE{HÊ¡ù0Äó7-çåaos '¬ Ú„ÈJ^=T)v´<¡¾>ìÐP$ƒ…a!éí~c‰}Q9@̳ê÷[j¯êIÁØzîb¼”2/»—Áyôs2Q¢FL[¹uÁýì°ãu²˜1G>EVfJY'Pˆ8wS¸4ûl’”­¹!p²³V2{ÂÌÃêY«<÷!~Ø-Ur¤¥É®à4&{gY*CébkAc=̆…ý·"€t9ךC.×.e(fl8&W„pÉ5ð-•N”â­‘°Ð >*]©Ö¦§ C®ÙiPLÀ×?š­«Ú³ùx«Ûn¿ž^Q3¢6òþ8EdH N‘Ú'Y)ªö¸Å/EÆæHaÑ 6Ý~œy%éI§‚å¤S½ ã#0d$ ¤ÊªÌ•iÝÞ+•Äž&Ðï§“~Wc~A0P™èŒ> Q>ò~ÜñË6x>±V„ˆa½´“péu(Êú^ç*ÍkÝÁk¥VŸýWæÕ±‚±t»\ôZ™Î<<)|i7ÅE2AÎw_)Óaè¢ÿÑî)é¯ÍÁ=iÄþôA™?öÛEÉ›¢ê=:Бvð£IúªÎ54óŸ—íQÅ{:­"…¶«ÛÉ{+íùÜ`. 95]ÚÁˆ L"ЙÇVc7T_[£6v¯Íþ¹ðŤdQuÜ—JêÕ€>*ßnM2y2Äo¬šJw1‚ë–”ƒ Y†AbÏ÷ÓQ±ŠõðÑi¶ÝWüJ‡Ø™¼Ã¥?ÍšMÛœ®àxžÉ'½Ô&þ8hÏ)‘¢••ÍS×ËØBïÂíøLü ß™yºñù¦^¡’XEIŠ}€Ê]—EÂ&=Z¤DDIN¦4XSx³Ìq2)HQžV>£°ij1¬^?„&èâéîc—7Ô¥±-ép¨Ëôã„ãwtÚÍW7êàüÖÿ‚Qšœ‚¾pèã€.ɺ;]—]!Y„Ž\LU º4øÔð¨Ë‘ì$ÇR¿ÊFÓhÁ»jàH©uáµFPJl¢‘DIè$‚˜J‹¦M:‰ÝX¬XábT ["1¦"!0z j²K“Ò™sò¬Zp\‰Ç¹ š\c‡+I›¢Ã‡+5ßðáÊA0<è’ÄX:<è’œ7zˆRÖ ý¼Ýû[AÚìÌ=>·lg±Ó7ì]ãkƾYwëÉ“…YQ­`ý‚*%µ‘÷Ç£.Œ\)è‡ø'FbESþíò¢£É“6ùoëÔe’‰è< ŠÍcÚH–¢c;;ƒÞ!Já(P§¢ûvÔCôñâ²k ú¿H;æY~ñÒ·r¨h eGå5èДÖKb®Vÿô–F߫ިÇL«Ä/Õ×"!ÎÂÈWÄ#Œ]^cÊq„ù@wrÜp 1.I‡Z*÷È“23àmÉ»VàA±4Áº?BþåÊKúUã"T-F)σ  t”úqühºaâü4ÁHFŸò¢ ÇøžJ4jcÐ¥¬~^?Åæìp JIuNÎ?ù×¥3>L=T)]Ó@cGô“G€ ihçA'*\ ÕµCK¼)ØóEÞ Ð¤¤ê‹Àbµ-ÖAæ”ñ}§ë £>ä§×éÑzŒ4nëm|¦è® ñÂÜ®¤ /¬¿ù´Žt >þØ;eî7âÙaÕúœÔ¼‘ÏþgÁü¤D™Û¾/Ù5}_M;àútã³C½OGŽ‘ñe—- ÏÍø²Ë žŒ].[:AìZÒ˜ÑênG2¨B°],j¤Kù`¨|ÆÈàBKh’Ê-1P­O…üü­$_gD˜xH: šhs[ÖøÛyã?¬a;‘»5'OþMÍ´jÜxg ¤ØÓ¹ëNSÙq!b´ï±;¹QømÑZcVL'¨…ºîá"Íã³™c!LÉ?¤‰½µË¸É—†8$vïÕPíÎ7ø“‡Í¤ ¶\÷jPݧs ìJ1HR²7ìÇg·j7ª=HÜ2N#š-† LÛ`Ù{VË/Ü¢q&1MgýÄ_Ù6@°D*ØŸöó³D¿÷àL äwRQvË` ™d˜e-±vj°knWyÄ0c/1¢Rä3_ߣ)|?W9>>[OAã jºssmhiª¥ïYÝ[$¥àG AÍñÙô‹©›ú±<øÄ.h8)$`Gyfþ\¡xîá¤Ø/erãñëÀ:!¬ÛYÜp!CD—'yñ­öëIÂöÛO(m€Å‡Òæžñ-CÀ…Ã=üø*çãñëÈ…÷ÔEá÷êA2b€÷æ¿äàÓ YwB†Îg{øQB¶g€‹Ûšdi.m¶ wÝܵþÒ¯ Ï4»ÌkIíZÆ9Ò8íÓV\"÷¸=5€Jd—/oT"v|_”Ü)#-Ê ³Ê8,)™»øÄéð…"÷øðtwF…æAnÉÁíœË1 P\„¸×?J(#ií1ây X{E­Žâ í” gðK >RŽ £Ø›ñÒé´Ó@—(ÂRy®Ä²ãÔŸ{*·û2ŸÚQ‹±=½O0É‹÷m—qê£ÑƒT)# Lã©øœù=5]*Öi¾³23?Ï ‚˜Vª?I.$o ‡­Üòx]°ßMcvXéG ûоQovñ0· J3d”Qtz³ÌïŠ2ÚÜÅI]‚;£–«†âŸÝ7HÀ~€`–j~zàò  Oœ4¯É·\L)óO¾a󳓯Pº©:ØX? 8R1ó$š–»;ÙJ]Dσå.ž÷užN,çýÔ‹é0ôfÂd«sê2'Ÿ¡£rI²Ÿ¦²MwþHc$±kïoÂ&aÁY:мOX”ø} ¸t¶¬ê÷áÈAßG±Ýý@tÛ.¥ÖüYýHð+Ü®â(>Ï2ž¯9….bhþÊÙ*ÁÓF øQ¢“Lˆì Œ‚z9GÊî°ërŽ 2X™]¥¯RÊíÃ’gbt¿~ÕîèhâF ¨K‚&èùa÷äļ)ئ@)»ˆbqráǧF‘cJç¯òTGãG±êf>Þêß3@Ä‚­ú!µ› ª °ýÛæ$9R|£Ì>÷¡Qæ eÈÈ‚Í]¥º…=¦æqÔýÅ ŠH•–ÓtÜ·'ŸÙpÈAj”¶”-LÛ–q#Ðï´Ú²v0L%kÊwÌ×é­±Þ‚¾{¿xúÄn•°<ͧ¢O…ò’ÍòdÉÑ‚s•xö~KhøéG¯sx"WÊJöÁò­e•%þ~¶G#`ú]ÜLl†ºrãHýqBå¡û­¬toÙ5[©ŸåSìV³çô“xÚ±ø½æÖ«ÍY‰Qe¶IÜruˆ@M‹»-ÇkÞˆ6¤I!Îׇ>(.Ä­ksѽSèl(‡i¾ë`¹‡jq}:=H#ª¸º]Jb”ï8˜-Õ˜o¹iVg¥³öÇF}ÿšls )5¦„ujqA;Íî;Z­zHpvQ—ogÀ²¯e×ç°ç]–&?Œx³Û³NÁ:Æ¢¥¨’EË¡•uém¨ãƒÙéßqmÌ…ïºÍ©5ʦ >wêkÓr·RØ7 F¢¤Câ=²àK‰:D¡²9S¶¥Ö‡š™ë rwnÅaä´Ðž+‡÷™¤œ_¿OQq’ì€^Ã_3xœ»ƒÇëjÐP¿¦Ã§G—ÈS}o¹DÊÉ,!N8d²$0Ž„îOÆk˜ØËƒVJ¸ÈñT3£“¥8v;>:gŠ ÿQ¯ÃXIÖ£‡3…Ë…kâp¦ÐЙv֞Ͷ½¥`©_Ãw’O.d×êÖŽ96§ì8e1]}þÝ)ØË©ÎJt``ÐÕByW..i@àL$$jI’Xh¡÷ï ÿ½¹¹•…SÑb+ÑÅi¬“–‹ãÀÑñµ{tôGJnÝT) ’”Ï`w3I‘H7B÷çÔb›˜Rýfp™p‹k @Ÿ¥yÄÕ“¬[$–0G -ʧxžýÂlEÝ<)ßvVñïÀÅú㨮gkˆíŽ›®…Õ^6O-4ó²÷1šq®¢^®æ‰¹·Û%½ŽSf~\… wqeZ•,Z¢™×="|å8å’Ýñ®¿ ïÕ&–¿øòÓløÈX©Š•© ´¿N!ñ}õ¾2Ÿ|ÇP~:_¿Ëor—ð]toËôPõÛ²96ý^ªveðu—¹)×ZªÀH~ö³H–¢5‰˜¡T#ÖwÊ›šì§Ïhíl9A¼Œ,ò¢!’j´³ ®”¥bAéïê’4•T'Z™gñ©Z ¯»Ö¥¥VoåUyמi§‡-ÅÆVÙÔÜ>ɰJÜñÀAÐozïßÕJ°¬[O“! Éú,Y*Þ×A@âöê±ß?y£\n!÷ËÊÏ$d­õóºéÂ屿¦eT ÉêjhÍö°¨ßÃA ê-‚7Õî¼âöJƒÝÉ4)qq’sEkù5›fºñ¹ná„Z\¹2­·èSK¤ýN¨)"u”Ü(ÐÐÕ O*äX¶bf¨ò¨á‰UJ5H6âQud)øaç-!Ri(V—J®¤aÑX÷ü‰_†Cù* è|-Ký¨M"FÁ— ×Z)Ÿ6_ ç-)T´¶ FMGRúIvÅ.èA¨¡åö˜Jÿfm§?vc§­¦hyt+ÿáýL ©ËÐ+öÙ#–®³DRstc Þ”ƒD×Ê4Û0¡h“mµÉ†£Û©!ã¹õ¦‚!Óõ³šþVÆcT0^Eû6¢öµÚ*Ûüµ“eÊ=šSõô׿éý|4¾Ñr,i–ª¼OÒMñ™†ˆñÄ<­ˆâMWËG«m8ó|Üny®È‘Åê–ä<ÑÉjb¬,ÌmW¶ÆYY°Õ»uÉ®¢ž;EIì¢u³@Û'â$uä)Jzõä)Z©dÖ§”á°½·Ø_eÓ „!±»œÁBHVÀq—X—wŠ6ëóåN±¼G(ŠL|\A“êÇÒ.Rÿ vד°Lã\…(ñ?;:I â”H$ɉ6—y§-YSÄ(,,óZl‘@¼éÿÇádÉÉï¼£^(yIoµñ=Óß¹Ťº=oÊí®mä )À´yäJ#>¦]šyºÂÊ=û\­qòbÜW0’´t¤a9m®¢ÝworË” IçUÉÁŽ’ŸíXácÊ•9][YkÄz0z¬„~GßYº;›/Sžÿ _ðS›•)_Jƒ­íæ2Ë•ƒ=®æç¸UÆ´qéÄOZ êÒm2è¢ÓÙ“áø4Á¢Ÿ/G\0£ÚaĤ\Åã'¶Ôv¸^D¬ÆXuU òT}^ïÈXTë~6ÐÖöì)ÊâëêÙS”yaêÙS´ÑAqÙS2`Ĺ?éDÝ:éÀš•©êÀr«î‚…Ìf!}ØŒÀ€/onqAºT–G÷Ò0ç—Â7[÷”EäÀ¢,·\¶_ò[4æLg:7TX*¬þ¢€à¨xÀ¯½^™ð’抶j³I3o’Š’"FÛIêlÈzH!ÆZ…ŽÐYy©ó¶1îÖî<©"ï}þÚ\â‚:åe+§w¥Ýr5þ3Wàˆî°øx÷«Ü(½±Q*¬a°:Qš«ä%~fý,V»¯ŸÅt¹ôäg±ÚÝ~ëåôy³U{Oý‰ïÞÞ‰.0Ô8;¯¯£“=Øy{ÄŒG»3Ïzá´|ãæŠbëÇyg®„"€ ÚOŸ<ª:¾Fß`ͦÊ&—" Xí!¶/@—”°t8Ÿ×º´1óöÏ``|îîÙžífsç­Ë+Ú,3íXW.Äøb~0”ÈÖÛ%º&1Õãé2”—ì+N*YN´hÖ§”‚?ƒ ÉL­™ÙË’wäNÑ^ü SÖv/ñ˜!¤‡NÅFœçVà7Ö^€ ¿_ÓšÔ¦"òòM m>Q^¾I¡ Y´Ñ^6Ÿ±|Û*[6+ѧbM{ï'_ÝvhnÊ~ ­ƒ»øÙ¸:㿽*£JPas¥c¿ÿ²žttîl¸æÜCkÞ[õÄ«ef”}§úàt? ™ {ާøã÷¨˜^ J•| ÊÁxªEý)Àcµ¥E“Iå;úîvû‡3ö:Åf?Ò¯0U,v~ÿÉ.g/ŽŽ>œÁ[‡´¸éÁU†ÿíÎðÉšíÏÖb xšœ§¢_þ0z?ÐâJ§*Ò×ò±ÉjÓpžEHwiÖ 6ëšåÓ¥ÎïíÔ¯ZyÝÑeÂa_oüGV¥î¯a…˜’áDûS ’’®5Œ4"2Æ ç–¶'|ÙÉ!æMËNŸg×-PL.¸wJH‹ö‡U¸úÝW–1ßuo`vgꙤruË•L:Ò™Çîåþ`€Ç&•Þa¦~ͧä+>Ü¥v‹lœx‹Î\šûÖ$\ùŽkxIPòǼ‘'ëL‡D_yGм$ßøÞ³ÖáœxƒÂrW» ¦3RÍnŽžÇ’i>Úáªþ(iWt×é´Éž9Ý^:­éìl¸¼Q#â›ioßi9ð#^ïÆ‡õ`å"géq7Ɇ„®ôfå­R‰º'Xz&wΗÂñöÏ>¨þ&²B­þëR"•ŽònÄà0¨c{|Èj¢ÃÛy$rÑáQxŸ+~úbnd&Ëp¨ß!I¼òÕ²[bj$KÄ}{´lßRkå™ÒLÏñ®rŠw¥Ò.¶ÆX'óÛþÚõ›2á›9„î.ƒG&Œ‚Kë­•§õ­£>ÆeÚ£»®Ùß•u4?¼´9GóÃ ÔæðÛ)ùg¾öŸÂU€´ÝB;–0nåÖ¥cÙV;#5>G&E`ëùJSãÌÅni &5Os@&¾’óó¬/ßc$+wË­ˆù嫲¯´>Oy¨cØqo”+ÃÇÛ};ÉU‰‡¥Î4j&Û¨.ÏX‡íÃ0ÿ@¯ç[¯‰\}Ôè1`Þ¾ŽTŒdŸI0lcYb:h“Ç%Ê”¼p_FÛZªT–N~­SÈ',°8¿Ã-”ד–0oÚô*6t´Gœ¿€uû• ”?óÞ¿#uãdž¶@ò!ÃÚ¾´Å“…³o3l\åIµîù‰H7WÞ¹’þK#» 'ùd`!õGÌV™0û¾ãÚX¥.àog²£—jM^f {¼“ä0ÒÂZ’¼oÏàÛ/ÂrÔ¢.N{Z?œq]-¡b.Ÿ¦ïGçË­3Z5š2‡©¶¤?:‹­µ'j¬“êpO ¨kôëëá&¥Û‹6śм»ÊZ^ŒíFwÁ$Ðrîì²`è 2®BÆ•$â¯RàNŽXœäÉ‘œüä;G’\:]!WaÓrÕIÓh>¥ÆDèLn‰ï´mhó n†ÂJ«›%@A~àæ`Xùú CÎÈÞ<Œ18ÖÊôþ÷\#Ëw2»¿Iåq0}8ó,‡Œk¬Ä•)ˆŒgBPHMÊ¹Ž ÌüÔ2`ªòw‚“s&ç’sYmx97™Ã0½œ›Åä\+_š×«IÔïïB]üI¤ëK®¯›&>=€5tö|°®=ÐÒË•#rýiQ>Î@_ÿwÜãK5nvç ±JŽL¿ßÚÕE°¾©’É#IG‚";‡*HèÝ7ÓºdÃSc1µÍÒq©(iO¾ãî.ÝDÓÙr$*Öém¹I;Oq£µ›.Ÿâ»})Œ›ÎRõi2“†’ÒÙŸ§»V«%RÉÙºâh§,Œ3‡˜Z–ÂtbJ•&—Ÿ¤?Œ\tŠO |, ´t½¥„›Ë±Ú¤ÚÍoDÉL²éòÍuÒœêd†™rS̘&3t0¹ŸóÜŸh…°X$Žœ½øç¡ªÚŠ3=Sê1£š¬ ¶ÓÖ_vBEž×X2%JÄïÙšQWM•.']5aÕ`‚± šeu‘WA f÷!#˜KQFS¹¤…68Ã.Œ¨þÌ΃Äiý„@ð+¸QXÉ@¦ßáFKÐc p{ûN›~, õ>x¿Ã´Æâßß.x”RÜfrU oSý‚$å~šçÎ3$b£EƒtE ßób2ñtk:HVQŠT¹[¦\J+¶ØÍ¶£žŒ_¦€Heæ1Y†k\1ƒ†ˆ=ì/øÅòð›\…/ÅÄÏM®²¯ƒ?f艕Ká :‚7\ROü"1~ 1E¦Zå”»Ì=ª¸À:D,f#¯R„ê%ðªxây´\t ®U¶åûJB²N÷¡„óu³z’:hþÓ>£ÊY+V¬¼“á©›ž@ëá9FÐÂ7›Fôýz¬;´œÈD.\*1eœÔB 2§M­²ºÅWˆFâ¨cM$Bî .›OV.€ªž¨ -ÖI=±þï×f‡^Ž%´Dî— ‘Õ_Â71Ü–j¥ÎeUB`umüpò^–QvvE-÷ƒnÚ#¸âYm´ã|½ÈRªÈ”Á®õÔ›Bç…ž–cÞ#©¿z1gªa{ kt{0)bA Öcu‚ã#{{2/¯ÃÆ‹ÙAÝpG £š§÷ÆD5{/«šåéÇ—ä³ùz11"vÖñbb–XÓñbbá3®j“5­˜>Âi}ˆ‚ÜÕèn˜éØ¡K¡s)?¶A¦dËê§1ƒ¬™LbVir“"ß‹¢÷©µ‡T)QžfqY—@Í+­2Ý B•£ì—VyÚiq"+±»¦ceèëI*ɪ>:Û«ÐÌ+©‡QJ7jÌ]œ±Ô¥’짺åÃËÖ8X1C„ʱ™Yo·?Öd*v=ŸT"a§qË|§:Ž6ªÖ_“I ÜY=È+ðv3E‰< æ'øUp\»[± õzv·µ£”ꜗ¤|I%dt‘¸ u/ö·aó§w\"®°þÜ‚àxiÅkäPÙÝ´ºcÎÖæàC©å„ûòÊS‹fš)À¥µ-6ÿGÁ°› ÿh£ñšLRªÈ~zë³tÐ^ØÑv*²Û` -ì²²ÊèSðóê?J³t§¯K´Ý¦eÝrˆ·mg_š=R 6Áž›'·' iƒArzÈ.¹ˆo#Ý×8"nUZNi>ä8~wn"µ°û°b’¦8Ó0U†ÕNA`¹ó%Û#Õ “¦ÇÅQ'CtöÉî:÷ SÖçÇ4ŸîÆÙ Ûr‰Ùå %¡œ†¡0æ`"!¸•ìgè´,0G´9þ§Y¬E÷6i~nõ“XKXóÌÐFÍå0‰­Ž¶Æ„Q´Ü„Qü:h°ÌDËüÌY…-}½;S¨Öt˜zr=Åy –M_³oÁ(]ª.Çp¥–Ü6R)îê6ëj²c÷¯<Ùä̺¢v‘3ë¬üy Q;Ék÷uŠ=ØTZa-¡^_#“)ØpZñ׃ÊÚŠ™¿’•Êš±J¶ß•ü‹Ç™T©Õ-ôÜ—!'ÍßÊ‹/#ò=têWÕ¥Á¡Ó)w•^=p©Ø£³5Þ­Øöla´ì%Ú°‡¹èmþ TÙ…JõP-Óïë|Tf»ÂÙ àF™ N‡_|Áéâæ¶ÅÜìrü° Õ-fèÕàC¦ù (V,r%.7œ_—Zø4šxÍP±žt‚FË]òx)Å`þ&Ö™½hÔ‡(ºB@}óÖÃÁ¡â« …_ó©èE8øh'üÿ-Õ+.㿌lÙ×( ›“}æôh^ô±VfjiÆ^«ƒrÂèŠtäP#ÿGÜÆ(A:§ðq²V^kŒΪåHÔ±E2µg2B ±ŒOqÜðxs³qÒ1Q—½Ðn‚9þm¾“ûŒ77€ÙÉ}Æ'ã­^寙'ß½P—Íc¾-¤U壊À±Þ-[ùÇXËLÜs3 œ(wåZÞ‰_¹(†QmÝN~•´F@:1ßâ¬Àƒ3º4ÈVÊ~r/æZ˜íÖzÅß”5ìÄãÖ¬ž&î†âÊ?þ¿>êž 6¡=‚D*oLx÷¢jŒ”¬¯eWä¥YÓnQ ½vM { “}›ŸÕFôQa€sãÌ®~ä„4»q¨ºÔÄ8ý‹Z—Îòa͸o³Êþ”OJ‹ìÅLºÝp~È…yOÏ8]ôgµf|YÌežVÎåÑËù…»Ÿµ–®Ðo-ÅV^Kˆ'\' ,6­ ½Yêô8Ý-†–hCÜS2·c}Ôœþgçµ y¦UGËù”¡t›ÇB¸Àžä,êF›«m5šE.‘Ĭ[uP‡§*Œw[º†m”9áI[ÍË\ÆÞû¶_Û4²m?§v‰ÏðóT¯1Ä9s¤­€°‹25[N¶b; ÏÝTb¦>ò»Üº@,c1ÛxvsÄ€‹½xhjd&<šžÑ -ì…G§þË3”Àyò}²c Í9‚ÄÊ©';îý‘¦ÙãµìW’$õ—ÑõéòèÖÞ0fœÐxt{f§ ë« -¼%uU°^ี¦w6пvZâØž=ÜB·GÒËÙ¡×2ãÞƒ…Çq‚ a-ô¾v^¢ R¤^giÄ¡eî³ôÑ¥;eÜáUÙãD<Žv]£´ì—Kl)Á=;“¤g;É™$"¼?DšŒ:·ý‚Yì·r vè¤Ã_’Õ‡>;EZ·ôüä[”h"òö0îáß%0î¡ÅŽõ½Œ¹´†6úV2_µÄ%ˆ§un‹ý¦ß)3k|ó^íeÜ{TâÑ·³³`Ð\r¯úN'„„VûŠ…zõ“bo1›5ƒ‚öê`Ç’²âh€×çË[ö‹®zUUÙ¥”¾îloÝ~B H–«þªê¿™ÃwàÞtU¬oüÀÍ!Bz±&êFV°!›ëyÝ3swBv€šƒûl&»·¼H«Bï˜õ±ÛÑ91죟üYfAŽtòÑVnä›*ÔmöôéÅîm¯… Ÿ~ƒP?jDvZYGpXx¥' ÷±sžàŒîP-Ý ,~3 Üs”*è,‡j<#̪£z­ÚüEUõˆªúnAáÖçî²m)ÓÙÕö¤ð¥ê’ZÛffÑõ¨»uJ‰>W+­ŠÅ÷Í"%]-É}dcv ¬‘-ìžžÞrêEKøÉ!-\Õã¢ëë¸è”‡P…Ý¢ã°ßjxh½6£ÊzX3Áì™à•g™ .”p= a¢LC²•Œîÿ†Êó~4—J=(7§ÊÝùGðtÒ(A‘£ë§S»µÈµ&Rx#™(ÞÕ †”kæÚKDXØ/¨!Þs2•hÿ j;ãÖ~Å^opJÍÖÙN¾Å†Ð÷{|\,¤è+dàìÊãÒ- 3²4‰^N„6Û!2¨È\Jþ¾üàådC·W+öÀ't¡…[ÏÅŽnëEVþåò²®N¶Ÿdh4Ùu‡-ÀšÖİýÔ|࣮øÅß®{\¢ƒyÐÁ<¼)3hHE×ÍVõÝ*"³ •ä˜ûû –·ÁäAA¹Ñ5@\eã)þZ©Ú´3Ь®ë]£Y»Ó†øª)¦ŸM(•m×ÚA‚bzŠŸ ¶øßaLe¦mmÏÊC^Ï'ÐükÓˆ,=èŸý[Œ¾¡LôT–ñX+ƒ,bÞ¯È⣋W ¿GösÀ‡DüÄú&ƒ¦¬Wá=œcUb~>~úÁ¤‡z ?%i.fþ`¤tŒ º1_Óc)ÅàQ‰Þ²ÝëP஫vÒ i1„ùk–Ç ^m> ;l–îØÞ°í9€Ígš#V+ÀÀÏ2ŠH†¡7E:쬇ˆÔr¡ú¥1@N°ê["cÂÀ®—´àç*•&7嬉£µä†ØNa5©oÀÀþðÈ3¼×toÙ̚gÁŽé±!sqzò­¢% ºÕ¾jÃB¾Í¬€Œˆ†cvP¬O0º,˜Óv¶#7»4o0eû;njW>åÒ°dΡXZ‚‰ìqßI7±©¹ùÛr2|“qêSVt*%(á§Úk"%Kšµøwä“«óñ°DEšÕA-&åô h– oã§€$ÿ8Òž§é³Â'H´ž.“åÂ窾 ì‘j¸ÖošÌO£Ø¯^ò Äð 3†¢Ù]ü¢_s¿&øÔÖïñtˆM~k‡—'âôžÍI#aSƒØxQ"Çp2fW±*´÷æÌ‹^Ugñ3Ö˜C‹«1‡³Ô¹ýcÄÛà,ÿªÕ€(ÓB“{´~ñë&± £G5üg< K“¤°Ö cŠí#{Ÿø\·>h=ªº%ÝÜ[¤´y /œÍ1Ýú´?ýÛM?ÄÝÎrûC‘iN·¿Íjg­¹l[ÿ±ÝœÔNl÷À›ÒîµtN‚5ÕÎòcM¶1`REº±ï4½‘W(¦Õ\ˆç–òxè&#|^¶Sï˜< Ÿ§+“aßcÙÙE®•=wGþáŠÆõÖ1¿0¨éžD^‹æs- {[íšìè÷ î­šž@lâ\)ª^[×µ5­×Á¹\îšœuªÉNzŒ=jô†|"j3K@Þm׉QµÞ‹‘Š7š«ÈªÉ¬Â%#âaÚÊ ¤‹`9‘¿%é´lÆóKióý/“z7ôú“Ò¼ÑcååòîÃ?9ä\‘UYÔkÇ$Z©}o%J¥fçuSÎb¹è™õEšw#(ãys)BZä‘Zr ØÀ=yçâd»Õƒ/ÌÄHœ¸4C"FøÇs™°`;Îì™´”™b/[•ÕöàC‰Òòô·­vÌûµø}ÂeBi «!2­Ëê ÍJvT:hâûÆœôÎ29ß±¸–fۀ뇭'Y©·Y2¬P¾¾/n½iî®ð”w_£/Q©Nº %òº¤È¾‚+ˆèNþ²IhfÙ—é#‹ i [ôñÃÓ`=,[Ú€R ÌY°Ñ,§†ì«õ±Ìƒ+ÙØ7½sHiw#ÁmKÔTÂmÕâ:˜¼3`ƒœ5~vÛ6´J‰$¥¹§Ñ$kyiÿK"áÈâÇÂ^a8ŽÚŽ6œãÂJ’èpŽ -vÖÚå®6x«p.À•”(å¨[T³kôp•Ø9K ¨b.¾Ò0Ó¹gq,bg]‹*ë…މ A…Sº@Õ›{†×ÇÜ3µ®fc Ü"@o†ìÁÏÙ__îlÉžwT 8ëÇMɱáUñËŸÂOwX[²¤K Oc}@JBÐJ»¬@Þ4Û2ªxEEHÓÆ70Ä$%?/Ôνu‚ ÂTI íqÀ"‚%ÇŽèl{H,$IÐ;;TØ\‡±&øEBÒ .hƱèd7êëE¡&åXb y¬’«Ã1§ië¢LÌÑp£#¾K;†&êRÌH-ÏHd ä³‘ *Ôç{BGýŽîÞ sØW ƒÀ,ÆÝÞ@jíŠ&ÞSW]H <Ê» CˆW°{r·윋ÿ÷Møè,ŸQ=þVEˆ \¬ Y.àütØ]aÔè;îÑ-üB»X_¨ðXýð^Z¯–,d¶‘T¯–, B“Ó’©BÓa缤ä å:!'’Nl¹uV‚wNP!«‰¤º{݈×JÍõº‰«m¹Îq©× à­'å“ähXZµUuˆ+›¥È¡~Ï‚‘–‡4‘\áG¹Ù}O9èÝrãøu?Êÿ¸¥Q3óžZìàÓ(&-úzG¾ XWFq !ñŠ$cÜ£c¡„8FÓží¯î š±õŸÀ99%1¤÷¢-éÇÕÖvn5'íXÙýë«íXŸ*•ßɯ‹f™Ä}-sufð}v@/[!…Œ¤~7žƒÇyÑMBRIÇò%`ŸI?áñß¶ày"€P°»7â>°~–Ú$ óM/Ë:Õo†“¯0÷œ°m÷HãÇOö›UOn—šǨÙ/åK9ÂÍ Š9-ïá2áqkÁZ.ÈjÝpÙĉé´gœ:`ÜMc Ïâm±'”‚’"’kK\âžæE$ ÌÄÄ÷èæn è§4ô@ÔfœÆ ¼›‹ï xY.Ѻ̪籋À²‹%Îa}•>µý-TV ]™Št<¤ï1“W˜xûóî GÞ9;E¸=‰svŠPЊsv Éd¾¦ÇM™9§óVx¤Îˆ,AYÚÿY Àµ~ÊÌâé À‘°‘1% ý¨~¯`GnÆúkIË #€ã_ˆÍŽÝ½%ž^i2Ì<Ô‡Æq rÅÙC€…=ë“n#…ÏAa[Õ× ¦ËQ2³ÈbfÁ-B‘#6óÛÑý<ì¤r[¡iwf¸É콓ÙkS ÈpE¨ÊopîäÍ‘}ÛkøýM)KªÝþIÆËL¿·Â³ñ©$æ¦J?“8ãÛ]f%/±1ý¤X˜³Z¯§ÃiÇ=¡I‘%!ÌÇ äÕƒõˆYðó”šažN‰ÏhcÍ ;ˆÓæU–É2S3h6QUþ6³f 8ƒÓ}'óTŠq@…‘ù¤^“ìß{ÝtÙ#dtÑnHbÍíª0¢€*:~ǼóÖÓžaH„ùºu§î7\E]úw ª­¬¼~Ø®sk“LÙÙ}ß;õÚ}Bê>ɱ`kð$ŸÊ$àghûT«ÄÔ©ÝÅQÀ§,䞀¾Ç`øUˆ¦€ør²ì€«0ó1,Ál]—°Ñ5„¯æ7—·äìO`¹­»]ºE&*S|í_ø|-U[¤9»ùEþ‰ ÖN'žzÙpkr6¹dʸœW1âëOÌ%o­*g{’ºGÕK¯ÒrZhr?/ˆ;-c¨(kéLƒ¹”ãSËô¨d ™SmµúF».û.ÅìrÚ‰ã6þx…øaiá=©@mš–Ubåå8h,° >MNÈjQýZýCÙÏÐo«]Ýê3·Ä\§Oø6cæCf…ÕšºŸÆtŠW’ŸüNá÷]µNÒ´H¾%,=Brók¯Ù•±Ü²ÿz¹á’ ;Ù…l°Œ)å)A÷Üíèö&L.”oÝýãÌï;dWàÛ³ !H«õ¹/«ÔùyÑÇEóI¶‚ ~©ÒדçÜYÖ×ü¢NíˆÊÁõÈÕþt6x¤Òlº §‘¼EòpmkÉÃð$z&?|·/ч)`^AÈ̽%%˜áç!o¥ä;TßꙨдh ³0ó* ˜ÏR8úÁ±öfF¹¯o«º¬t°kózú´NÜ}¬¯ì|@x±éS™œcl!nöÍI¿‹‹-÷2­eÏl¤ˆµq+%¢É…]€T[›pÖÂz¸`ÞÛ›‰9½ÝVšå‡°Å;ØäT"²ÉÈ®1b[Ȱ³œJ‘ަ-3 fÍ^3³Ÿ|‹Í³8ìÇ÷Ãz57Œåܧ6‡V7_ u¾E.*…b¦ˆ3¥ K,ìA`!‘ñI!iVKýúðìb‚UË/sÄø Ö¡ß2nZ‡ÖJ"­‹’Â1,ÞßIô”\Ö– 8ßÃÿW¦Úº÷^é{KJ€‘EZðé|FÃÏW|¬Ú š©Ê%”Ô`y ®QÇ}¥”Cã™ÈÆ=“ 5)Ûi #ǰ xáÚ_NI†Ÿ?§˜X»%bÑ_4Õ-ül¼3›iC¶â¿žV¼@*nÅ®DÙ .BB©'ŒÏ* O#üÔÓ×­Ø™©ö5/QâŒO¹vg”…æ?Ž()ÔQŠ9¼CNAphnvÃê7iÔL°&o`è`Þn½ Åž4wïas›È£ú’»ì“{Óso)KY"$n‘ê¿É[¤^VN™Q=ì-^~ÖÍÞb½IvùÚ–¹›QŽÕíú4=†çn»Ï@|·MZ¶àéS¶†g]GRÔ¬¾GíFBΰÁnë,«V06PøN~[þù¥Ž“ZìÙn_&͋Բ‡šrµnÓo‰1Yµ·gK]nÄ;ŒtdW—V²´lŠªd׆”€U!¤ÙX¸vSwk¤,ƒO ¡\ÇÜDI^¯óU‚ºq¬/Jè2ƒ_ÏjÜKmÎbdWÎê~?Ã8xߪ7EÁ߂ٸt²³x¼’TJ²Ú\Ä„ŒR]ùTŒdS˜ÕÂNzóþ­Ê¦¹6*¢7¢qž7mÓèÑç]Y¤šØÞj0Ä{³÷íþÝàü,; _»=+²_t /pÜ@BT/IIë"Õ%³Cô³)*Qè€o§.Öë'\N›ÿ£r©Ÿ=L'¨clUú©¥Í‚‚8á UŒåÓ+BdO‘º;…t0Rç&7E±£ºÉN턱¥·gøOó÷í7WK@áuKR»ˆ'r‘j«Â¹nd¹ØD¿@=õµ2bãµÜäìf³P·_ ‚Ž2§|ýFÁò ªÚewRL‹›»Ð°¾Úh{¬ÔþâÌø’âÆ\Åß¼[3ž³ÖØÀeý­qG©/H¯9¤ÙbgÛ©1p5á[ŸóÒ÷³:^rÉQ 2Ñe§Ò#íRvZ iaâ(üØŸŠÌÌZ"·>!“ÐPóð™JÍú.ky€Ÿå³ó½'¥ÉSÉGÚ:Õ™&Æj‹fÆ?l¾=•@¸Eï®ÖÌ;Ù© ʘðxÓ¡Lo{\X.©8Ò¸ƒ?±´õŒFNãvæ?<Æóü ¶åé©©T,ß*ß‘lcnñ’Ãì¦VÜVAšÙô-w«0b‘’èhÅ{åøÀPj¾!+¼ VÜl&µW•ý¦´»ƒ Ï®tÞˆÛÐEi«Î4!ÏË×äLR›ÈÆŠšVcÏÞ8DsôÂZ¨öEtM·ïHs|šÙÚœÿÓ|’›Ä…¸«ò›]gƒíE ‹JämCEgÆ5š?¥Z¨cá(͇9Zë +­Ù•O¼dÇ1žRzçÝdþ¤ì`›¡EÚ­¸·à-Á±Fá³½º‘Ñ\Z¯áQSýæÌ ʉ&›øiÝÏÎ>c513¨u·9“{FÚãzÇÃ7˜Ém£|“% ,ýf´æ“kÌ,Ð5H²‚²EŽJHÏæ" ´nQ&k¡x°ÑlÛÍ´„x{ ;v%ññí§øæõ–ˆR»ÈFƒ[°HõÓöìËö%€~ºäóXm"Yiöq§ï-Õ›æ= fk¶ã%ç N®7ÙÆÛ¥Öµb© vƒö⟥¾ØÞ2Ðil¨i)`vm,Y†Êê5˜A!ýI,6Q­®K{„î2Á ¸îší ½*=ÙÑ/<µ‹œ“«ÑíÉKµû\" !mìD³Ç"†ý-ƒµöúÞhÏóú–îÏU`¤–Í4Ʈǿ†P[(¡œá$>çÕ쎚å‰xœ»;GõýÁËtGbö5ñ¸] in¾y²—'+ qy¨áµ1M¡aMpök ÌJ?x^ÈwÔgå1$| î³c!³Ìôbe=QD#E“€§Efñ€ŽhZšy/v¬þ8\õ:!©µt—Ú.éøeÒË Ê6/zó~.¹ôÚOø´º—  “ñƒÊW‰¸øN*wÀè ë7ö§$}CìiÝ·Ú%~ÒU;^éKÒ~ÙÛNÁ˜-Á*â·ˆ©í Lùê3¡ ’‘ìþˆå»nmŸæºÛH ¹êjN×ÞìY´Ö±ÐG¬øs¼üp®k–fEÊ‹Ÿ“ô wûì6uökòƒZ·õgœÃÓ/ºVÌß³Ù\¸®št,™NV.fÆô…%cn8:O7ÕE~´`¾©£ÍLɾ !.¥FAZPK><ßm: þæÝIgGýµû^ o˜³ˆQ;ñsíq(rÄqjŒjÛõ6ÿ:eG¿š˜w1µi5ÜF}Š«Ñ‘ÚŠ±Fov?zõ²GÏ›}ÚINà (ØÂ¢-Ætf*qìË}¾0=別Ë'ÏŒ”¬ŸZ8BJ— ‰ ¸þ÷càÈÍ…Þ;«= õçÔc ÌñþÌ.&Ðøëucl/‡‚u–d¤ß{Xå¡ MùƹÔxÝ. °q¦½Ã ¹1§•~ºVß ­5–Â× ªR9¢VÆüø/&gÑÕXˆÜK¬Û9"]Ôàrk–pD>3†ÆD+‹°vPçiå¦?Ü0›¯rlóŒ2öº2çRމVb–økè„¢%}§Â°  e«ã„ÁÆw:ì¦óàYŸÃ2I 28{"bi‘–!R÷È ?qx/2ØdŒ­®íŤ܋•þSævÀ·ÛÞ\åïüúÛj¬ÉN]3sƒ_øVL—Þücz”DÖ|ætš§ÌV ‘µ DA›4ù)vâÉ{ñ EAÛš¯Í†9NFŠ«‰+£ÙŠ£>ûFÑÆØoÿpN—æ!]—;`Ìyoi§ŽF†Y€â•!¯–Aò§ïÜyd6~È7rĹj—Mw•ããåÁH ‚¯ÆaE±6?-º59µ™¬12\E>!åŠl~x®ÒÁÈëØâÏ6 &«oðçgœ[ÐÁ;9þt°IᓎÙOåP#`ðÙWcñr®ÏEé1£)Љùá°ï.8œæ–hBæ/“qþ'`\õít~¨ ýj%”n²&ð£S-œ;²›êÅwìû¹ì½úïh›ôå3[1±áè̾Þc ft~¢ÆÉóqIìü­èµQO#à V%i%Ôoyx5Ø­§2ݱ’·»¥9ÊÖWÌmo&EÝtÅŠd2†xø]—HwÓ»|CjŒ¡Oºà4:Öì¦tcsuë{sÏ]|F°'¤‰£ö¬d; ÄXovß@퇖 ÷œ\„3|r¢¾5|œ‹Ém†ÚÄ.‚´¯hï’êE¯ eOvÅ\çºb&»aXg0º!9¼OˆývI¶–Ⱥ UҠȼeù–k}–S¦ ž6µË@¥„Ÿt@2¬Èåv±œÂáKn ¹]dZºp|OŸîG]K½7ÌÔwd¾fÍ>IÜ.³ÏýVFvïlh±Mí2­`© ù†“v̯ýàËráŸØéfszFšŽ+OH“"ÓK<’©tǾ%¤ð]PÖ¾0÷ýÙ~\oß{óÜÞN’½È¼ÞÎfÙoàéû´uá—²Tf¬#sñúû¾Qãê;*6üôÛŸ®h< Ýà½D­,¶XÈÍ·©]vdQK¨¨‰È{´™·ˆè˜>#€Œ+2ÇOd';ø™Z‚hå ê>õbÚdnK¦Ü‘“7Í¥Îwt[vÖš g¶…m‚3«ù ·èc`±ØYÖu£‚²œÿ£ÅÍ;#`vAÜìØ”´Ò£dõ/dúz´6gn˜Û|ÛÇEO6™êœ «Cê лÔÞŸÍ.z€³wuܵÊò=ÐÑB~E7Ÿ¸çyù´\«Bg7ʲí9kÝaÌPŸ*(5‡\ Űqê’lŸPŸôb‹‹ô0r˜^ö „Þ¡içãw»wÄ9ˆ±å-%G·Ÿþôš#ß1öÁ‰oïÚ{«±.“Õ„Þ..²¸€!élêæÄW_Òuôúkµ•ì+(¡×üSÔï #Ó‹¨Ïüxé¢6WÔ}Ž˜iÖŰf¡ò6Û¶ïË;ËOLïToú)y[Ù\oi¨ýbïpJöU¸>ÊŒ8¼Le,¨B z‘¶‹œV½ñ^à[ž¼©É„¥3/*K¿É¦ }­?Ë´Qoý)­?=ÎOBMò”èJ!§xnýÕZ¾­ó8½akŽêeˆÒüÛžÒI§ýI ”ÜvÍj€ä¸ÓdŒÎ^Ôè˘à › M¥ÿ”>à‡ •&9g4»­S˜È#ê¡/$õЭvVÐé©k–ÒjO®µZr‘«Înô½`{}RH‘²EvØqÓ£–Ù>ã2|È5üµ8$áLÇ×FNŸûÀ–G‘¿êçè'ÔzßE*º5¹]ÙTdõ©jÓ푃¨˜Y¶ôV~: ú‘Ö®@ÀÚz©Wÿ A¼ÅRß¼[Þ´6¿_PEÕ[©V–ï_]¥ZY;³«T+j¯ë*Õ ‰œDƒ›`A/‚n_ua,]UoòûJOz¹^Š•X;‚3%Wö”¥TŠlImK ¦FFvKï.fh°½à€H§S)Õ$™Ë}@eQ$|ò XrŠl¥=¨ÌäÍöBE&§ä!v—07¨ =oSX Ï φ>ÜcPR¾“îDÈÈÆÏ»@INÛ€ÛΤìÈ›é/’N6]®L›c(ˆÈ¬ÄÇr¤Ÿ<'ñ£Æ–±?¯1|0+'=΋?SÎ'vègbpÌî-,ò7ÜKØPÄjÝD%NT"Šó¦éXLâ~«aÞ{´ö[ž2ŸÙê8:/„YýfeúG²±±Ù%Rþ±PQ™Ä2y×Q°‘9 åº˜³‘î¤×á?Çê=^¯Ó´×zŠYm@¿LÀøòI­Í+Í'¹´wÔæãñx ˆ€“™™ÎGÂj8Ž}Ù”©Îx´Ç&Ém¡¹V@óCV9@A À¨{Ö¥f¾èTöÀ%þQÈÉ%þÑÎùèS¼¾rv·ñoü5õ+¯àVÒÂù€,+¤^#šXߥ³„ íréj­{étßéÎN?ôù`bœž®ƒ+ðóMŽ¡ ýñ3¼p dÂü_®B¢%À¨~¾;ï“Ô/Jëáð3Ú¾áð3ʸ±ÝŒn齜ùqŠ596èÄÐä…>Rerô“Q¹Éi…Á7MÍLN7Ô!ˆéY'm-ʳLî–ó¶gÇçŠ,í 3 'Nÿ(¾ëÖB9"“g=1À!V)k| ›¢Œ½µÂWÕûÓ;A¨^äCc¶‹ƒQ5­ÀàÚÒר¹5'`{zúÓ”–H¢n‡Às# …-Âc .ÔÂr–²' K@¹Ïž{Š,â(Ö$iDxe²ÀäÃSÙÄ>ÊMuÎ,Øœ Œõ¨%oèâ•7Œ=Í8°ÏbZ…Ýñ긻 '¶S0#ˆòf& ¾ÛÍ2‰a²l IÈ[½_~mÓp†¹9^ï6 (œdw/'Ð ×EJqNÑLÒ™,O1¿†Ú“Í÷ÑjùíOX8n®³ÚIìg[œK!´éoû.-špÔN‘ áz\ì8îh( „³øÑ(êäQ&G;å§ ëÛŠ‹fR¼@¾Ýé"”ІàxaÓSĦY6Ô ¤‚ao½[}Ьd©Þmwv!pç= ¶°z¸-À#×8ÉÒü2lvmxY¾ÆEÀ&£=ùÒ€GÆððfW>g2¡„­UšKÞï&é@Ô[.†mç]úü‰ƒÁáßl¨]¢¶mÆ`€iÖ€õµYû:!óñ½ï»ÏÈiÛ'ˆ=™`ƒLZ—¼¹_Ø,†^Òl,]¤™»ˆ‚¯°=ÏY‚™þÑ úȺ‹ ÛA )­ŒÖ a¿c¯ªÎý ¤Ò†HDÀà&-kÇÁw°…È„d²¾ì7 ¿Ü·åþ!MZÏ5™ÛÚl¯ÿäÞy,<ÕHa‚Œ Ÿãæ{™f Á¶‡B|÷?ë@‘´s¢Ú¾!L¾{{UÞÛ¾áu£rV¦8%©¼xX3 Ôµò3Ùh²¨Ÿ‘ä;Cwï¬ß4Ô¯‹}•Á¦ëP†¾/âÛS—Íé:“ÁøÊ¦ëL΋ÒåŸ9’ó¢sÁOsÛS¬§2€EËp+k*¬OZØdÓ”›9wkÔ‚Lÿ8ÓãνÐgolly-3.3-src/Patterns/Self-Rep/Codd/sheathing-demo.rle0000644000175000017500000000222113151213347017676 00000000000000#CXRLE Pos=-45,-8 # # Sheathing demo # # In this demo a construction arm is shown approaching a written pattern. # In Codd's CA, only cells in state 1 can be written, so a method is provided # to sheath these wires to get them ready to receive signals. # # The construction arm first approaches (76) the injection point ('+' shape) and # then sends the 'inject_sheath' signal 756. This causes a 6 signal to travel # around the bare wires, sheathing them as it goes. # # In this example the construction arm then retracts (4566), leaving the new # pattern sheathed but inactive. An 'inject_trigger' signal (67766) could instead # be sent, which would activate the pattern by causing a 7 signal to start # travelling through it. This latter method is designed to be used in # self-reproducing machines to cause the daughter copy to come alive. # # See construction-arm-demo.rle for an example of writing a pattern. # See golly-constructor.rle.gz for an example of writing, sheathing and triggering. # x = 55, y = 9, rule = Codd 41.7A$41.A5.A$41.A5.A3.A$41.A5.A3.A$41.7A3.A$44.A6.A$35B3.A5.A6.A$2A. FA.FA.EA.D4A.FA.EA.G4A.FA.GAB.18A$35B3.A! golly-3.3-src/Patterns/Self-Rep/Codd/clocking-on-demo.rle0000644000175000017500000000170713151213347020137 00000000000000# "Clocking-on" - a method for initializing a periodic pulser in Codd's CA # # From a starting point of quiescent cells (those in states 0,1,2) it is # slighty tricky to cause a periodic pulser to start emitting. For example, # if you just send a signal into a loop then it will collide with itself. # # One method is presented here. Three gates are created. One in the body of # the loop itself prevents the newly-injected signal from colliding with # itself by only allowing signals to go around the loop in one direction. # Another prevents signals from the loop returning back up the injection # wire. A third prevents later signals from disrupting the system. # x = 39, y = 20, rule = Codd 23B$BA.G19AB$15BA6BAB$10.B3.BAB4.BAB$9.BAB2.BAB4.BA5B$9.BAB2.BAB4.B6A B$9.BA4BAB4.BA4BAB$9.B6AB4.BAB2.BAB$10.5BAB4.BAB2.BAB$14.BAB4.BAB.2BA B$15.B5.BA2B3AB$13.9BAB.3B$12.B10AB$12.BA5BA3B$12.BAB3.BAB$12.BAB3.BA B$12.BAB3.BAB$12.BA5BA19B$12.B25AB$13.26B! golly-3.3-src/Patterns/Self-Rep/Codd/sheathing-problems.rle0000644000175000017500000000331413151213347020601 00000000000000# A demonstration of the sheathing problems in Codd's ruleset. Run # the pattern and note that the sheathing goes wrong on every case. # At the top is shown the problem in isolated form, while the bottom # row shows a real-world example of the problem in context. # # Now reload the pattern (or undo back to generation 0) and change the # rule to Codd2 (Control menu | Set rule...). Now all the examples # sheath correctly. # # To achieve this, the following three transition rules were added to # Codd's ruleset: # 0,0,6,6,2,2 # 0,6,6,0,2,2 # 1,6,6,6,0,6 # # In simple patterns it is easy to avoid these problem patterns, by # introducing delays in various places. On more complex patterns though # this is not so easy - introducing a delay in one place causes the # sheathing problems to reappear elsewhere. For patterns over a certain # threshold there is no easy alternative to using the extended ruleset. # x = 99, y = 33, rule = Codd 87.BAB$8.A14.A20.BAB16.BAB21.BAB$8.A14.A20.B.B16.B.B21.BAB$8.A14.A21. F18.F22.B.B$2.3B3.A.3B6.3B.A3.3B15.A18.A23.F$2.2A.F3AF.2A6.2A.F3AF.2A 9.5B.A18.A.5B11.4B2.A2.4B$2.3B5.3B6.3B5.3B9.4A.F5A10.5AF.4A11.3A.F3AF .3A$39.5B22.5B11.4B5.4B5$5.6A11.6A16.7A10.6A$5.A4.A11.A4.A16.A5.A10.A 4.A16.6A4.6A$5.A4.A11.A4.A7.2B7.A5.A10.A4.9A8.A4.A4.A4.A$5.A4.A6.2B3. A4.A7.A.F7A5.A10.A9.A11.A4.A4.A4.A$2B3.A4.A6.A.F3A4.5A3.2B3.A9.A5.2B 3.A9.A6.2B3.A4.A4.A4.A$A.F3A4.5A2.2B3.A4.A12.A9.A5.A.F7A5.A6.A.F3A4. 6A4.A$2B3.A4.A11.A4.A12.A4.9A2.2B7.A5.A6.2B3.A14.A$5.A4.A11.A4.A12.A 4.A19.A5.A11.A14.A$5.A4.A11.A4.A12.6A19.7A11.A2.5A7.A$5.6A11.6A55.A2. A3.A7.A$83.A2.A3.A7.A$83.A2.A3.A7.A$83.4A3.A3.5A$83.A6.A3.A3.A$83.A6. A3.A3.A$83.A6.A3.A3.A$83.A6.5A3.A$83.A14.A$83.A14.A$83.A14.A$83.16A! golly-3.3-src/Patterns/Self-Rep/Codd/crossover-unidir-demo.rle0000644000175000017500000000673113151213347021253 00000000000000# Crossover for two unidirectional paths - Codd's CA (Fig. 5.9, page 75) # # This pattern shows a configuration that allows two signal-paths to cross. # As long as signals arrive with a sufficient delay between them, signals # from the top will arrive at the bottom, and signals from the left will # arrive at the right. # # Here we've connected the output wires to make a figure-of-8 shape, to # demonstrate the crossover. # # The first signals on each channel must be a 7, else the machine won't be # initialized correctly. Set the demo running and allow the signal to loop # once around completely. Now you can change the signal to 4, 5 or 6, and # see that the crossover still functions correctly - two "type 7" # transformers convert the signal into a 7 where necessary to turn gates # on and off. # # Originally distributed as unicross.l with XLife, credits: # esr "The System Owner"@snark Tue Dec 22 11:48:44 1992 # x = 128, y = 90, rule = Codd 69.58B$58.A9.B58AB$58.A9.BA56BAB$58.A9.BAB54.BAB$58.A9.BAB54.BAB$58.A 9.BAB54.BAB$58.A9.BAB54.BAB$54.9A5.B.B54.BAB$55.7A6.BGB54.BAB$56.5A7. BAB54.BAB$57.3A8.BAB54.BAB$58.A9.BAB54.BAB$68.BAB54.BAB$68.BAB54.BAB$ 68.BAB54.BAB$68.BAB54.BAB$68.BAB54.BAB$60.9BAB54.BAB$59.B10AB54.BAB$ 59.BA9B55.BAB$59.BAB2.B60.BAB$59.BAB.BAB59.BAB$59.BAB.BAB59.BAB$59.BA B.BA5B55.BAB$59.BAB.B6AB54.BAB$59.BAB.BA4BAB54.BAB$59.BAB.BAB2.BAB54. BAB$59.BAB.BAB.2BAB54.BAB$59.BAB.BA2B3AB54.BAB$59.BAB.BAB.3B55.BAB$ 59.BAB.BAB59.BAB$59.BA3BA14B4.19B23.BAB$59.B19AB2.B19AB22.BAB$60.9BA 8BAB2.BA17BAB22.BAB$68.BAB6.BAB2.BAB15.BAB22.BAB$18.34B5.5B3.4BAB6.BA B2.BAB15.BAB22.BAB$17.B34AB3.B5AB.B5AB6.BAB2.BAB15.BAB22.BAB$17.BA32B AB3.BA3BAB.BA3BAB6.BA4BAB15.BAB22.BAB$7.A9.BAB30.BAB3.BAB.BAB.BAB.BAB 6.B6AB15.BAB12.A9.BAB$7.2A8.BAB20.5B5.BAB3.BAB2.B2.BAB.BAB7.6B16.BAB 12.2A8.BAB$7.3A7.BAB19.B5AB4.BAB.3BA7BAB.BAB29.BAB12.3A7.BAB$7.4A6.BA B19.BA3BAB4.BA2B12AB.BAB29.BAB12.4A6.BAB$.11A5.BAB19.BAB.BAB4.BAB.11B AB.BAB29.BAB6.11A5.BAB$7.4A6.BAB2.10B7.BAB2.B5.BAB11.BAB.BAB29.BAB12. 4A6.BAB$7.3A7.BAB.B10AB6.BA7B2.BA13BAB.BAB29.BAB12.3A7.BAB$7.2A8.BAB. BA4BA3BAB6.B8AB.B15AB.BAB20.5B4.BAB12.2A8.BAB$7.A9.BAB.BAB2.BAB.BAB6. BA6BAB2.15B2.BAB19.B5AB3.BAB12.A9.BAB$17.BAB.BAB2.BA2B2AB6.BAB4.BAB 19.BAB19.BA3BAB3.BAB22.BAB$17.BAB2.B3.BAB.2B8.B5.BAB19.BAB19.BAB.BAB 3.BAB22.BAB$.17BA8BA19BA19B.BAB2.10B7.BAB2.B4.BA24BAB$B66A2BAB.B10AB 6.BA7B.B26AB$BA32BA3BA13BA14B.BAB.BA4BA3BAB6.B8AB.26B$BAB19.B10.BAB.B AB11.BAB14.BAB.BAB2.BAB.BAB6.BA6BAB3.B$BAB18.BAB2.5B2.BAB.BA11B.BAB 14.BAB.BAB2.BA2B2AB6.BAB4.BAB2.BAB$BAB18.BAB.B5AB.BAB.B12A2BAB14.BAB 2.B3.BAB.2B8.B5.BAB2.BAB$BAB18.BAB.BA3BAB.BAB.BA7BA3B.BAB14.BA8BA19BA 4BAB$BAB18.BAB.BAB2.B2.BAB.BAB2.B2.BAB3.BAB14.B35AB$BAB18.BA3BA7BAB.B AB.BAB.BAB3.BAB14.BA15BA3BA13BAB$BAB18.B13AB.BAB.BA3BAB3.BAB14.BAB2.B 10.BAB.BAB11.BAB$BAB19.13B2.BAB.B5AB3.BAB14.BAB.BAB2.5B2.BAB.BA11B.BA B$BAB34.BAB2.5B4.BAB14.BAB.BAB.B5AB.BAB.B12A2BAB$BAB34.BAB11.BA8B7.BA B.BAB.BA3BAB.BAB.BA7BA3B.BAB$BAB34.BAB11.B9AB6.BAB.BAB.BAB2.B2.BAB.BA B2.B2.BAB3.BAB$BAB34.BAB12.8BAB6.BAB.BA3BA7BAB.BAB.BAB.BAB3.BAB$BAB 34.BAB19.BAB6.BAB.B13AB.BAB.BA3BAB3.BAB$BAB34.BAB19.BAB6.BAB2.13B2.BA B.B5AB3.BAB$BAB34.BAB19.BAB6.BAB17.BAB2.5B4.BAB$BAB34.BAB19.BAB6.BAB 17.BAB11.BAB$BAB34.BA21BAB6.BAB17.BA13BAB$BAB34.B23AB6.BAB17.B15AB$BA B35.23B7.BAB18.15B$BAB65.BAB$BAB65.BAB$BAB65.BAB$BAB58.A6.BAB$BAB58.A 6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB54.9A2.B AB$BAB55.7A3.BAB$BAB56.5A4.BAB$BAB57.3A5.BAB$BAB58.A6.BAB$BAB65.BAB$B AB65.BAB$BA67BAB$B69AB$.69B! golly-3.3-src/Patterns/Self-Rep/Codd/tape-reader-demo.rle0000644000175000017500000001064013151213347020121 00000000000000# Tape Reader demo - Codd's CA # # In this demo, a stack of coders is repeatedly triggered. The coded # sequence is 4666,76,5546,77,7,46. The first four sets are the commands # retract-right, extend, extend_right, and sense. These cause the tape # head to advance one square and to read the tape cell at that position. # An echo signal bounces back: either 6 or 7 depending whether the # tape cell was 0 or 1. To keep this demo simple we just delete the echo # by colliding a 7 signal with it. The final 46 then caps the end of # the read head that was exposed for sensing, and the process can repeat. # # In Codd's design for a self-replicating machine the echo signal would # instead be passed as output. See echo-discriminator-demo.rle for a demo # that shows how the echo can be used. # # Within each coder, three gates are required. Two ensure that the # outputs flow in the right direction, the third is to make sure that # the first two aren't turned off by later signals. # x = 104, y = 162, rule = Codd .19B$B16A.F9A20.24A$BA10BA7B7.A20.A22.A$BAB8.BAB13.A20.A$BAB8.BAB13.A 20.A23.A.A.2A2.3A2.2A2.A2.A.3A.A3.2A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3. A2.A7.A5.A$BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A2.A$BAB8.B AB13.A6.A4.4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A$BAB8.BAB 13.A6.15A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2.4A2.A$BA B8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7.A.A10.A$ BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A $BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2. 4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7. A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB 13.19A2.A$BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A 4.3A4.A2.4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8. BAB13.A7.A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$ BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8. BAB13.A3.5A3.A2.4A2.A$BAB8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$B AB8.BAB13.A7.A12.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20. A$BAB8.BAB13.19A2.A$BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BA B8.BAB13.A4.3A4.A2.4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A 10.A$BAB8.BAB13.A7.A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BA B13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A.A8.A5.A$BAB8.BAB13.A3.3A 8.A5.A$BAB8.BAB13.A5.A5.A2.4A2.A$BAB8.BAB13.A5.A5.4A2.A2.A$BAB8.BAB 13.A5.3A12.A$BAB8.BAB13.A5.A.A12.A$BAB8.BAB13.A5.16A$BAB8.BAB13.A20.A $BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A.A8.A5.A$BAB8.BAB 13.A3.3A8.A5.A$BAB8.BAB13.A5.A5.A2.4A2.A$BAB8.BAB13.A5.A5.4A2.A2.A$BA B8.BAB13.A5.3A12.A$BAB8.BAB13.A5.A.A12.A$BAB8.BAB13.A5.16A$BAB8.BAB 13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A2.A7.A5.A$ BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A2.A$BAB8.BAB13.A6.A4. 4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.15A$BA B8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A2.A.A9. A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2.4A2.A$BAB8.BAB13.A4. A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7.A.A10.A$BAB8.BAB13.A 7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13. A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB8.BA B13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.BAB 13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB 8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.B AB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.B AB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BA B13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB 8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.B AB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8. BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A 2.A$BAB8.BAB13.A6.A4.4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A $BAB8.BAB13.A6.15A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2. A$BAB8.BAB16.A.A9.A5.A$BAB8.BAB16.3A9.A5.A$BAB8.B.B18.3A4.A2.4A2.A$BA B8.BGB18.A.A4.4A2.A2.A$BAB8.BAB18.6A10.A$BA10BAB21.A.A10.A$B12AB21. 14A$.12B! golly-3.3-src/Patterns/Other-Rules/0000755000175000017500000000000013543257426014257 500000000000000golly-3.3-src/Patterns/Other-Rules/b2ein-spaceships-and-rakes.rle0000755000175000017500000000722513543255652021715 00000000000000#N b2ein-spaceships-and-rakes.rle #C #C Left: small fast Orthogonoid by AforAmpere, 17 April 2019 #C Speed is 48c/3066, or slightly faster than C/64 (~C/63.87). #C http://www.conwaylife.com/forums/viewtopic.php?p=75164#p75164 #C #C Right, top to bottom: small spaceships and rakes by Luka Okanishi; #C see http://www.conwaylife.com/forums/viewtopic.php?p=75667#p75667 #C Individual 4-rep (3,0)c/20 p80 G-loop spaceship #C 3-rep (3,0)c/20 p80 spaceship: #C 2 different 2-rep (3,0)c/20 p80 G/L trans-backrakes #C 2-rep (3,0)c/20 p80 trans-backG-sideA-rake #C 2-rep (3,0)c/20 p160 cis_double-barreled G backrake #C 2-rep (3,0)c/20 p80 G backrake #C x = 159, y = 862, rule = B2ein3cijn4cnrwy5cnq6e/S1c2-ai3acny4anqy5c6ek8 85b2o$85b2o5$84bo$83bobo5$84bo$83bobo10$133b2o$133b2o3$84bo$83bobo4$ 145b2o$145b2o$122bo$119bobo$119b2o$2o46b2o46b2o$2o46b2o46b2o$12b2o22b 2o22b2o19b5o22b2o20b2o$12b2o22b2o22b2o20bob2o22b2o20b2o$81b2o$108bo$ 107bobo5$108bo$60bo46bobo$59bobo21bobo$83b3o8$59b3o$59bobo5$83bobo$83b 3o$59b3o$59bobo3$83bobo$83b3o$59b3o46bo$59bobo45bobo7$107b3o$107bobo2$ 83bobo$83b3o$59b3o$59bobo4$107b3o$59b3o45bobo$59bobo$83bobo$83b3o4$ 107b3o$107bobo2$60bo$59bobo4$107b3o$107bobo$59b3o21bobo$59bobo22bo3$ 107b3o$107bobo$59b3o$59bobo6$60bo22bobo22bo$59bobo21b3o21bobo6$83bobo$ 83b3o21b3o$107bobo5$60bo22bobo$59bobo22bo5$83bobo21b3o$84bo22bobo5$60b o22bobo$59bobo21b3o21b3o$107bobo4$60bo22bobo$59bobo21b3o$108bo$107bobo 5$83bobo22bo$84bo22bobo6$60bo$59bobo5$83bobo$84bo$107b3o$107bobo3$59b 3o$59bobo21bobo$83b3o$108bo$107bobo3$83bobo$83b3o3$107b3o$107bobo8$60b o$59bobo3$83bobo$83b3o21b3o$107bobo3$59b3o$59bobo21bobo$83b3o21b3o$ 107bobo3$59b3o$59bobo3$83bobo$83b3o5$83bobo$83b3o2$108bo$107bobo2$83bo bo$60bo22b3o$59bobo7$107b3o$107bobo2$83bobo$59b3o22bo$59bobo$107b3o$ 107bobo3$59b3o$59bobo5$59b3o$59bobo3$83bobo$83b3o3$108bo$60bo46bobo$ 59bobo2$83bobo$84bo$108bo$107bobo4$60bo$59bobo3$83bobo$83b3o$60bo$59bo bo3$108bo$107bobo2$60bo22bobo$59bobo22bo6$60bo$59bobo$107b3o$83bobo21b obo$84bo5$83bobo$84bo4$107b3o$83bobo21bobo$83b3o3$60bo$59bobo$83bobo$ 83b3o8$60bo$59bobo2$83bobo22bo$84bo22bobo5$108bo$107bobo$59b3o$59bobo 3$108bo$107bobo4$60bo22bobo$59bobo21b3o5$83bobo$83b3o3$107b3o$107bobo 4$83bobo$83b3o$108bo$107bobo4$83bobo$84bo2$107b3o$107bobo5$83bobo$84bo 7$107b3o$107bobo11$83bobo$84bo5$83bobo$84bo7$108bo$107bobo5$108bo$107b obo$83bobo$84bo7$108bo$107bobo5$83bobo$83b3o22bo$107bobo5$83bobo$83b3o 2$107b3o$107bobo20$83bobo$83b3o5$83bobo$83b3o4$108bo$83bobo21bobo$83b 3o4$108bo$107bobo3$83bobo$83b3o$108bo$107bobo4$83bobo$83b3o7$83bobo$ 84bo3$108bo$107bobo$83bobo$84bo6$83bobo$83b3o22bo$107bobo5$108bo$107bo bo10$83bobo$84bo8$83bobo22bo$84bo22bobo7$83bobo$83b3o6$107b3o$83bobo 21bobo$84bo5$83bobo$84bo7$107b3o$107bobo2$83bobo$83b3o7$108bo$107bobo 9$83bobo$84bo$108bo$107bobo10$83bobo$83b3o6$83bobo$83b3o$107b3o$107bob o5$107b3o$107bobo$83bobo$84bo3$107b3o$107bobo$83bobo$84bo5$83bobo$84bo 5$108bo$107bobo4$83bobo$83b3o2$107b3o$107bobo6$108bo$107bobo7$83bobo$ 84bo5$83bobo22bo$84bo22bobo5$108bo$107bobo5$83bobo22bo$84bo22bobo13$ 83bobo$84bo6$83bobo$83b3o3$108bo$107bobo$83bobo$83b3o5$107b3o$107bobo 3$83bobo$83b3o5$107b3o$107bobo3$83bobo$84bo3$107b3o$107bobo$83bobo$84b o5$107b3o$107bobo5$83bobo22bo$83b3o21bobo7$83bobo$83b3o22bo$107bobo9$ 107b3o$107bobo2$83bobo$83b3o2$107b3o$107bobo12$83bobo$84bo2$104b2o$36b 2o22b2o22b2o19bo2b2o22b2o$36b2o22b2o22b2o18b2o2b2o22b2o14b2o$24b2o46b 2o46b2o26b2o$24b2o46b2o46b2o10$157b2o$157b2o4$107bobo$108bo5$107bobo$ 108bo8$107bobo30b2o$107b3o30bobo8$107bobo$107b3o6$107bobo$108bo7$107bo bo$108bo2$107b2o$107b2o$108b2o$104b2ob3o$104b2obobo3$108b2o$108b2o$ 103b3o$102b2obo$102bo2b3o$102b3obob2o$106bo2bo$108b2o!golly-3.3-src/Patterns/Other-Rules/dragon-curve-generator.zip0000755000175000017500000000352413543255652021311 00000000000000PKòŠÌNo-òhb{dragon_curve.rle}UÁŽÜ6 ½ïW°ØC€Ö™&ƒÛr(R¤ØMr[ ŽLÛB4’KÊ3;ùú’’Æ;»Ùödâéë÷ðs&Ž€óÌéÎï1û8BžzÆ1Ep F—1\]€¿¿þÙÁût ý޶/^þ|uý~^‚^"ñc¤Ó{H‘@fr~ðæšk·²^‰ÑÒ…G ˜–qꔀ—s<(³~q$àB͉ |~½§¢TŒ4ü'ÿEÜfè“¢I‚Ý 9M9éÝ®¢ìýÌœ2fÕ)h-šRÁ-cR6lL_¿PyG&’ |2}” 6.¢uèmà@,ÔÁÑç©Tr–qät´Z5¨ðr)j³—´H852§¦µ…¹4ûZ‹ÏBa°{ç3©R‰=Å\„/²~ºHÕnhñ’ ˆX}ð²ƒméß ìBr_DyjyTó·ÍÔ{§¯X’Ž];Þ>8f?NõÜ`/anL#LæÃáR ÓNEwdÆ8VéP%ò £©§jíç|G!ˆš ‰"º©V°Ê2¡B5-S鬊‹E‘Ì‹3Õ`"ìaŸ¦öøˆÜ7 «QÐæ† s÷ãÖdòšÒð.Ú“ÏlC‡J¯MJ¿¶S²$—™v¨¤µ2´þhÆ/i×I ¦ïàóDÑœUBî1] Am(U/4éwºŠ2ÍáÊP´Ö¬HÇFõ\¯Ù¼šê‘.EIKj õ ›è$OÇ[‡:õ|èh¯þ\ ÁÖ®2Ö°4ÏI¼š¥Zfà´¯ßcÛÙÔ(â*ÏDMáEÌúmÅ*¡( ÓýÑ:©eüy»­¬Íorž$mãÞ3'~4þ…ˆúÛ[ñU4ùýo Í6fÚ¶¿”š›5HaËî}8騵e©t¾l±¢ÿ½ zXa¬¡æ§bÝ5.Ù®4fû'ÖÜ¡ë³n% Št—•qÙ*+5Nºü‹ÀZço†lðÑËÙñ¹jðÃË ¢ŸjâQýÜb^¿ý+Âá9Üt6uØÊž~0"ælsš—°&©?m®îà ¼êà¤]vå§ø~-¿‡·öw¸úí÷wÜ~÷/PK`’ÌN2¬Ò®8 DragonCurve.rule•VKkÛ@¾Ï¯èuZ=W‚BÚ47—@ÚžÃÚZ[¦Ž’’Jþ{wg•-É%$«ùæñÍk훇_›;üÖËC×Þ>÷/ €W¸Á: ®ðÁž’ ·r÷‡ã¡•'HʱÝw^Í© ¯Pµµ+*”í®ézëMTxè»×±q8Öê$ß ¼ËúE›)àQ…£<žçîÜüüòusÐ>£ÕP!¡UÇC³íú¦ëê ¿w]¯`x{zRc4*}gtS€Ù»8’õ€ŸñOÂ0e˜1Ìß ßwý«ìkɉòˆ!çVf2#ÃØJÚn|ôšFQ ÿ…`X0 ËwKFþOOC“x[­.mäpªÃI…ÓÞœŽ‡ l蟰U¯Ä|@Ù+ÜõJ§Ö3À)ä–áŽaMTö  FM8G³ ÏÐ|‚æ”y´°ò°¶ͯ¢b†fÕ騆arŒÅ´É µ@NÈ)’LUˆÿGm"jÏ¢ža·±Ö‰ ë½,C`oV ¡QVÆE0Ë ¯¡©A‹547!íÈoÕ®{R4Î@IuŸ—l,y084-‰ ºØ—Æ£ñRþ"Ø®•GÃT>¾„sx8^4çdžÛxé{CËvj“Ò€f7–b»›Á¹+ôK“ÜhÈå!wAxy¶gp>†«ŽhˆÆç¾ìz-íOB³fÑ@þBÇ_XAƒváC6À¼ØÁƒ&Q·þÙ®©NI|ÈÀX#¹ŠYªå•¤)] M3ä¶ßМO¨pè|>é&ó-áîsÑÚpå¹Ì`—ë< ²sè3ááÅn•t¾Ô–Ï„ø|ÔÌlGþ{lµ¾‰Ó™Hü ð+ÅOœ‡Åö]¶—ÖG5ýVKKd61_¹§p#±²ƒ§³¶§aMeß=·5U¨Xâîvúæö~sÿðCë!ý×Ož¦G9Äæ‰¹A‚ÿ“wè­P)Ô Â³ÂZA‹Ö¢ª<22óMó]u™ùœœ\°>úøñ—vJä&˜K¹Ÿ‡Ž˜ÅNtyÌTwÛï¼ÐÜ„W:»Ð¹„ªÔ«âŠ ÌJá&Uö§ytÒý¾…R±5õÓî¡øPKºýJïC„{Z Factorizor.rule•VÛnÜ6}çW /À4¢´7uá¤uŸ¤ˆä±àJÔJ±D ’ìÍþ÷ΔD­ídc+ixfxæJ^~øx}Ë´7mùÍ´Œýs׃²‡³ˆëH¡ ¶Ï3M|À/Ø›¼W-$úe{¥U+ûÒèŽCªª Îj- ì@(s¨éUBn·“ƒæ`úBµ‡²S "8ËQÁïŽø1ª›þ+šw@b¯à^µ}™Ê ä—²cñ°ãRo'M –¥†¬”{£eÅ–pó öU™!ð,]°\…Ÿk¸™>_¡kàl®-Øù¤i4†Ôw¦ïMí6Fo½µloQ]ÄsÛH·nŒVº_0vùï›·×WŒéÿº^öª{ "aZ•ûbgÚ˜ì5¼3¦U¬ûZתoK‚hÔfì^¶ /¾G\ð˜'|ÉW|Í7|ËϹ@¡à"~° Ý) ôPv HÊOíO?YTI¨ó`¥ŸçR½uŸ1Tý`×g¼!O1×àyçÌÅ÷?wïMhÏ‘ð x{WVYwÔŒfÿ^@ã›{§*s 7æ\!#B 5u`éñA9Â&¬Ö¶‡Â Ý#"l‰µcòÜ$ß¡)ϸâ9ßóMÀmlÒJå= =^esºÊØ»¿YÆ?[½‚ÇfLn¶ p 62äï½zÚ…t š§¨MŽ ÅödDÄÖO(¸ŒØ8ûg­i•ήÔTwµMƒ³U2-TÆíPÙ 3††r‡Q8ÏçíÏò›DšŠc£Y%H¤] ÁQ|d'âk»þ2·0M|Ž&ª‹ˆ}kÌE³¤=MšBây³Šë ßkD‹0uøAç…C &!š*<;‡^àÁËÓÁC꫱Q ¾ ¾-SÌ„žNƒDö†Ï;mz:æÙ%ÖØ† ×òVAIÂã†Ly3¨£a2@Ì#OÏ[TE¬ëlw"mW#>qÛµ ‹ ÿ9vX¡..Éóð DE¨*~Q3²ü‰êžÛÂËè›jͬ2ŽðË_Ä£;6ʳ gRc†ôÞ»ö¼âl;s+‚ôZª”¼'Cs·3 µÏsØ+;U”:ÞÜÎÊÁדÒXÙR¬µúÒCkxWy¤àçPžùi‡Àã9c£‘#³BŒ%Z=€¾«wè{„Ùα‰öÒZ¥iF=Îã%Ââ€ÁÆwžvT¼C½Õ$˜KΪg¢_â­’fÙ[„Ákfù7í@³ ÇrÄ.é L>úœ6¦+é~Kµ—Rè™*&Ù8·6R£éP¦‰^ç52Ù꨷@ü˜ÃùLµ¤´ŽªâHõ=ÛÕ òjT^=7áæu‹ÞغAå—=9}ÂÕÞî/ÿ|ýþà cô ‘ÿñ/õô˜¤,™`éßGÁ*T!ëA‚MhƒÁñj…w{zÀð‹VE°ì%búð’ØKFÃø÷?PKºýJ £ú~Ë, factorize 84.rlePKºýJïC„{Z  ùFactorizor.rulePK{¡golly-3.3-src/Patterns/Other-Rules/life-on-the-edge.rle0000644000175000017500000000143012026730263017700 00000000000000# In 2007 Franklin T. Adams-Watters described a CA in which all the action # occurs on the edges of a square grid. Each edge can be on or off and has # six neighbors, three at each end. An edge is on in the next generation # iff exactly two of the edges in its seven edge neighborhood (including # the edge itself) are on. # # The LifeOnTheEdge rule has 3 live states with suitable icons that allow # any pattern of edges to be created. # # This pattern shows a still life, some oscillators, a few spaceships and # a couple of puffers. # x = 53, y = 23, rule = LifeOnTheEdge 12.2A15.CA17.A$28.BAC17.B$47.A.A$47.CABA$48.BC4$2.A10.A$.3A8.2C14.C3B A$B2.B7.BC14.BA2B.C$.B2AC$3.A4$48.B$48.CA$12.2CA16.CA15.CA$11.C2.BA 13.AB.C15.B$11.C2.BA12.B2.A12.B2ABAC.AC$11.B2AC15.2B15.BAC$12.2B14.B. B17.B! golly-3.3-src/Patterns/Other-Rules/Langtons-Ant.rle0000644000175000017500000000112612026730263017176 00000000000000# Emulation of Langton's Ant using a von Neumann CA # # http://en.wikipedia.org/wiki/Langton's_ant # # extra states are used to code the ant's current direction: # # -----------------------------empty squares--------------------- # 0 : white # 1 : black # ----------------------------------------------ant is here------ # 2 : ant is facing north on a white square # 3 : east, white # 4 : south, white # 5 : west, white # 6 : north, black # 7 : east, black # 8 : south, black # 9 : west, black # --------------------------------------------------------------- # x = 1, y = 1, rule = Langtons-Ant E! golly-3.3-src/Patterns/Other-Rules/NoTimeAtAll-demo.zip0000755000175000017500000001011313543255652017754 00000000000000PKÈ®ÈNø»£„Ú4NoTimeAtAll.ruelUT Çfü\Fgü\ux èÙuSßkÛ0~×_q°—œb'é õJJ7B MºJ”X‰´Ê’‘äxYÉþöÝÉvi{ˆãóÝ}÷}÷ãjù°^ÝÎ XÚµ*Er­Ûá–ow×sÆ–ë<‡³wþ(Ö —¢.¹1Ð(§Ì\­4R8^í ×>­-+ëEvœIÁ 8ó#°Æà¦@¸À•î=“ÇB×q^øÞ™ D/•æŽ è{´Nçð+t…;§˜Ä) TEÜ´2"õÐK^!­u/ ¨€EPº¯´ 3ÊâæS]!m#Â%½²;'Äo%4AjPFˆ-PžY£…jV€ø¥Bc1ÀÐãØ¢`6È,*ès1GХﱌa½´’zBª”©êà[A-Kúj뀟 "¦ÍZò⣛9M{TABhlF˜I6ðãîöØó>J"Þ¿qÄp(m`šàüÕV’£68ç¹>gìÁhõ"º†¾ÛÄñ5†sßKZˆ·y&»G”ƒ­¬¶ûc»C[å¶5öºä! >ÚÑŒEYØÊa¼ ÊOˆ±‘ ù•#–Na£¹yaÙ4n¼6'6êÞSx•é‰;3C3;±É´ÝÏ×pB€«ë»ÅÝýŠ¥)B¥ìââ3F³›1&É”oè?cyžc…¯ó/‹9‹Ûë§pÁŒP{¹±NZ[L鎺3bLÂ%œÉ·-0¢…°¦5ôÕøÎü±,Epа+áÊ:Æ>Árþ}~4iñêÚ»l׫±µ.`C‹ ¼øÉ·Â„¨h—ÿŒg(ë¾³$bâÄN‹m 2+:º—5¥¿ø‘ñ žFÏÿ%¸êÊÐ4–æÁ¨ç2Š\0«./³þÈÛ»á”A 2ko8–µt8”Yûù){~G  Aw+™¼Ñ¦ú“Ž0ôÞ ‘ø PKã®ÈN Žúø„NoTimeAtAll.ruleUT ùfü\Fgü\ux èÙ…SmoÚ0þî_qÇ”¢¼±MT“Ê:¦v¢0Qªî[e—Xuld;06í¿ïl'4´ÚB.¾{žÇwçËÅòn6…¹ZñšMìDòö?—ÀåâæÛõlú¾,70¿[Ý^Mg3xt×.ކïŽË#àŸ[õ®ha©¾œ2_M&ð¦—㸠;%Ïæ¬©©”°çšË èF0ØWL30|#©0ªÞ*ÃJP@IÅh oŒ¥–A JC6*K”³”‹.’Àjºc¨P¨‹òÌtÁd¡zÍÕÄ*¸ÇؽҢÂ5îÐn Tk¾Cµ`+5/KÌMpÉ|"°:3ÝbZJ?EÀ-n‚í7[Áí¹cQy…TÝ"*µg;¦£®2‡GÍØOæKØSi¤Å2¬o7DI*nÏ-“À~py,¤{‚ öh™ù :.¢ñZú·‘¤+­v=qUq¹m¬ …,W5ÝNÂÓÎC{nØi˜h†M»ç¶»W­˜“@¦;a ßKØ`Ï;T…z¯q.óJYâ ž?/*h$ž€6T ¹“‚?±¶¡½iAÓ œøº›»8žg¾{.e«¶J¨Í!ÌPÁuÑ`¯kj-êcBàf4©°,ìÇV#^[®¤qо‘ è+ÇTH<†µ ò‰$c?Y$ b’µo ÉÇ~"N..³Åò–Äà$#w'qJRHG#%x“ÌÙ°$9$ïãî«É§Ù”HÆ7ÕZéJ©rì> öû!æP×ÌjÎÌ´rcžkö(Xa‰|ðc!;ªÝ`cø¿â(‰Ò(‹òßG‚~?zÒO˜È œ·Zíz÷µóg¯SöÑà)z¸U´¨¢J_y²SOyTêÕâ¼^«ìãÒWžìè!IyJ & &ð4ño_­«œÅGH^;FëMN™¿Oih½Ùi“ðÍ æEÏÁêႾSÁ´«´Ç„2îLL &‘“ü/þ(\APKУÈN³>Ç?‰˜ NTAA-demo.rleUT (Sü\ifü\ux èÙ•XQo£H~·äÿЧµt;’™Œý°Fw{šËH{9ͽ›ÄìˆÇ“ûõ÷UU74$™Ù“àîªê¯ª¾ªnç§TÝ4·åc‘ôIU©Ÿon“äƒ*;•«ç¦þxS\óºVײ-ëÕ^ªBÛ"ï‹“º{QÏ}Þ¦Ÿ–‹ŸR¥TY«/Ǿ¹+Z¥7þn­šZõçB¥M}Í_>—÷ÅçæR?*+»cÓž0 ['ÔÙĿʇ:¯°x‹ešÇ§¦Ã:Í=Àœ!§~îz¬¬´jZ|Py}ÂLŸ—• ?$}›?AΫOà/:+åX«®|,«¼U}£¾bîkÓVŽ_iÉŽÁK[>C9ïÙ—ÇòtB`»d·»sþœ÷MûÇÚF¢Ç’ˆg÷T•½§TÒí‹j`¡Aun®ÅsÑ®Í:(Ü·EñßÂX!¯9l]êN’rA¹iê ¶ÀSQ«â-ñõŒW€.Ž ´Ä¦5c=ÀÄ=éD÷žý!ínͯýµ™‚A îàç$.$XÖO—¾÷É «Ë‰ŒÛ<©=¶oÐ4—ÚäKxê ùu-»‚mÓmq‚[ef`²¦MïóDÒZýçËoêYµ¢`”¸FþJLœç¦g9›¡ë¹<žÉÆ¥FpÚ.¯ØMÅ×UùGaÒåp&» ÔòNýãù†h8g-Yýì›§¦j^$LDz=^ÉǼﱕ •ÚZÕÀ… ¨§òm_6µuÖ9žªÊ_°è–âC«ߎÅÉ’ýÙP¸Í½›vëÛ¬Bûû¥>²ö|Ìái®Nåý=èU‘†f3•aÕ´–,’œ5ùß¿5¹AãOìU­îŠª¹zFû–’”W錥ºëÛ‹¬ ƒ&$ƼB‹à0œ.ÇÂÐå+LI ¦¶xÈ[Ôb×Yxœv™9KAsZœ×^ŠŠÊ °àóöx(” ³º€ˆWPÉ@ø§÷+¨Õ–gâÒ hu.PÀù{qD(„GÆÍÇz¦–ù‘[~WYO¤˜eêÚ–=MÁƒ'´¥¢FW¢¼sPÐõªâ›J!§l%3rkªê€ÐÑêÂ@ÐÁ-ô69|þDä¹ýíÓ'†oêåGþZ½ÐK°]K'ÿÅ Ìr‘d©—dºWôLͽʼÃÎKW‰wÈøN3?Ø'«”¾y‰j/Yô²4Y.²4LB“,ižòòæûlD^–‹áÕ½ÒwL¾õ ’Õrxiì%š®€@ò–¾†ž†€ !áŠ0à† Gú–lñ‡¬@GóͯôDTHŸ¬Å¤ÌJ_ã'r¾ Àû¦k•øY}k ÓŽ:AÑ }[.ìÛŠƒäáAgápeÉwALÌ!¾d>EdOÞrxÁ`ˆ€«7 üGž¼“d±Àýá%nSVÞ‰Íw?«)¤û€;žÏޱù® Ñf+»÷bóþþÇë¼2ü9½ÙRË”þDdõÊ×”Ma;èµ © é¢ -QâïflXí÷žöiL›ôZ­ƒ(F‰ØtÐÄ;„œT=.äWó<ù02²£„kKS+K eôýÈ¡0n7Ö¡à3ZŒÖ)WÑ F¸f51ãfÖU²¥ç8: ’ýÄË傆W(g_Kª9Œþ†e‡ä“@S[5BÄeh,ܳ('¤9ÉâKÕ¸óü]ºÃî:(bN8&ÚŸˆ äಗ´…Oƒœ‹!RËEhdM¢lä¥Y#V\’ë˜N$— V¤økî™´†c—¯q¢¶ëôaÕ›y«¥ Pp×ßÎH> "°øC 7&¨„Ðíµã+iêÁqÏ4,¶OË…³ùÞâz3V 03#µ!É=Ç€–ö+*zÄ”Èi€z¥·ß‘™½-!Ñ2û˜‘Ý&žïS·œl B‰ç–ÙëïÆÈ õkHš‰­ƒØzÕÅÄš*â;°Y'ÂÝÈpË ¢6‚×=‰:ö• : O6° fí‰"p©¿'ˆ™Y+ºPÙ̧°ð+éÈX´¡   3é)ô[qÍßø@?'[ÂÃv¼R¹–‹-+8$_°j4 ;;¸}ëB&¸Ëè×+b¡ 9h/å'ÞS~Oõ;ãÔ!ÞkôC„ÞbgÈ¥÷æþÄ—æt}çþŽÝýž{*·NÂoSD)œwRN¨»¨æÊ¶ÕzÜ­4vŒ…³·nþvN“¥öæl1v÷ߺe'6i!êÚ¼Ï4Y.6» šÞ ÈÍgž¶×ÊóEiBcÖœ †DÇÃÎ;¸lŽó3DÌ%6S6‚¾ññÚ9I{¦êvtÈvÕî@ I«[>IK;5ý~n+ò$]Íè¯Ï‰šö £2‰ô`žIOš;…-âc3Œô„¨³™˜%Xt@FàBúõ°â(£E%Bâ¤lDÓLÀØ•3Í?Œh@¯LmÚ CŠ ZÒ–š˜3JcôçíÑ͇a†'8M¹#¢‚ÓF3³«iT~üɼåfžñžåìÄ€'RÊÆë.h`ßî4gÁdi.g¤„ƒ›Wæ¤ïA01‚Ñ\jçG|à¯[ßMS˜†#³§GØ]V±ã î¬âY—å‚¢Q‚>œíMPÞ¡®oqV‘_aÁXõÜæôd?sß^;–±õ¸.%“mŽŽ “Éñ‰¨xáügl¼£Ýs€Ê¿g‰æ|~ظŒHœw»Ìë©åg7âC` .[ÅÛfRMÿS@Eê” ÌÁ|Йƒ w9L»§}»ð ÍlJÐl9šÏB:~ý;]R» G&}ÒƒµÙ“éÁ‹xš¦žù$:”F–ãÏ\mdø ïË—Hãä/ËÅÿPKÈ®ÈNø»£„Ú4¤NoTimeAtAll.ruelUTÇfü\ux èÙPKã®ÈN Žúø„¤$NoTimeAtAll.ruleUTùfü\ux èÙPKУÈN³>Ç?‰˜ ¤fNTAA-demo.rleUT(Sü\ux èÙPKÿ6golly-3.3-src/Patterns/Other-Rules/life-on-the-slope.rle0000644000175000017500000000175412026730263020127 00000000000000# In 2007 Franklin T. Adams-Watters described a CA in which all the action # occurs on the edges of a square grid. Each edge can be on or off and has # six neighbors, three at each end. An edge is on in the next generation # iff exactly two of the edges in its seven edge neighborhood (including # the edge itself) are on. # # LifeOnTheSlope has exactly the same behavior as LifeOnTheEdge, except # that patterns are rotated by 45 degrees. There are only 2 live states # (with icons \ and /), so it's a lot easier to enter patterns and they # run quite a bit faster. # # This pattern shows a still life, some oscillators, a few spaceships and # a couple of puffers. # x = 58, y = 63, rule = LifeOnTheSlope AB.B$2.B$A2.B17.B$B2.A18.B$.B$B.BA6$11.ABAB$11.BABA7$37.ABA$.BABA32.B .B$BA2.BA32.BA$A4.B$B4.A$AB2.AB$.ABAB2$27.ABA$27.B2.A$29.A.A$30.A.A$ 32.B$31.BA6$18.AB37.B$21.ABA30.B2.A$16.A6.B29.BA$19.AB.BA30.B.B$18.A. A33.A.A$54.BAB11$34.A7.A$34.B5.BA$35.B3.BAB$37.A.AB$36.AB$36.B.BA$36. ABA$40.B$41.BA! golly-3.3-src/Patterns/Other-Rules/Ed-rep.rle0000644000175000017500000000535112026730263016011 00000000000000# A replicating photo of Ed Fredkin - run until 49 generations. # # In 1970, Terry Winograd generalized Fredkin's parity rule (B1357/S1357) # (also known as Replicator) to an N-state version, with the parity rule # replaced by modulo-N. He proved that if N is prime then the resulting # CA will have the replicating properties of the parity rule (for which # N=2). # # As with the parity rule, the effect works with many different # neighborhoods, such as Moore, von Neumann, hexagonal, even in 3D. Here # we're using the von Neumann neighborhood so there are four copies made. # The script FredkinModN-gen.py in Scripts/Python enables you to explore # the rules for different N and different neighborhoods. # # In this demo we've used N=7 and imported a 6-color photo of Ed # Fredkin to use as an example pattern. At 49 generations four copies are # visible, as at higher powers of 7: 343, 2401, etc. # # At some intermediate generations (e.g. 196) multiple copies are seen # with color-inversions and other effects. # # Winograd, T. (1970) A simple algorithm for self-replication # A. I. Memo 197, Project MAC. MIT. http://hdl.handle.net/1721.1/5843 # # Contact: tim.hutton@gmail.com x = 49, y = 49, rule = Ed-rep ABA2B2ADE17F4E11D4B4A$2A2B2AB23FE10D2B3AB2A$4B2AD24F3E7DB4AB2A$3B3AE 24F3E7DB7A$3B2AB25F7E3DCB6A$3B2AC3FE17F6E2D2BC3DCB4ABA$3B2AC3FE19F4D 5B2DED2B3A2B$2B3AD12FE9FD3B4A3BD2EDB4AB$2B2ABE2F3E7FE5F3EDBA2BA4B3CDE D3B2AB$BC2ABD3FE7F2E5F3DB2D2BC5D2C2DC3B3A$2BA2BD10FE2D3F2E6DC10D3C3B 2A$2BA2BC7F6DEF3E5DC3D2E7DBCD3BA$2BA2BC3F2DC3BC3DEFE5DC3DE2FE4D2EDBCD 2CBA$BCA3BEFDB3AB3D5E3D3BC3DB7AB2DCD2C2B$BCA3BDFD2B2C7D4ED4BDB6A4BC5D CB$BCB2ABCF3D2E7DE3FD5B3AB2C11D2B$B2C3ABF8E5D3FE4B2DCDEFE6DE4D2B$ABCB 3A2FDF2E3FE2D2B3FD3BD2E3D2E2DB2D3E2DEDB$A3B3AEF3E2FDBA3BD3FEC8BC5D4E 4DB$2ABCB2AEF2EFC6ABE3FD2B10D3E7DEC$CABC2BAEF2E4A2B2CE4FE4D3E2FE4FEDE 3D3ED$DABC2BADFEDAD3FEB2D4FE2DBD3EFEF7E3D4E$BA2BCBAD2FBD3FD2B2D4F2E5D EF6E6DE2DE$6BAC2FD2E2DBC2E5F2DED3BD3F4E5D2E2DE$D3BC2BD2F2E4DE7F3EFC2A BD2F4E5D3EDE$DA2BC2BD3F5E8FE2DEF2B2A13DEDE$C3B2DCB11FD5F3DF2DB2AB13DE $2C2BCEDC10F2D5F3D2F6B11D2E$C2BCB2E2D9FBD4F3DB2D6B9DC3D$2B3C2E2C8FDB 2FE2FE2DB2DBD4B9DC3D$B2C2B2EDBE6FDBA2FE2F4DB3A4BC8D2C2D$3BABC2EDE4F2E DAB5F3DB3A7BD2BC7D$A3B2AEF3E2FE3DAB8DBA6BC2B2DBDE6D$3B3AB7E2DBA3DBABD 2BA6BDC2B2CBCE3DB2D$B3AB2C7E2D2BFD2E2DC6BC2DCD4BCDE6D$CBC2BECBCD5EDBD F2D2E2D3C8DB2AB9D$ECECBC3ACDF3EDBD6EDC7D3B3AB9D$CB4C2A3CF2E2DA2D2E2D 2F3ED4B5AB2C5DC2D$2B2CECBCECBEFEDCB5EFE2D2BABDB5ACD3C4DC2D$2B4CB2CBAE FE2DBDED2FE4BDB6ABC8DCB2D$10BABFE7D3BC2DB4ABCB3C6D2CB2D$2B2A8B4E4DB8A CD4BDBC2DC4DBC2D$B2AC5BCD2EF3E2DBDECBA3BC5D3B8DBC2D$BABC5BCE2CFEDE2DB D2FEDED3F2DBC2BCD2C5DBC2D$C2BC3BC2BCAB2ED2E3DE2F2E5D4CB3C3DCDCBC2D$EB A2B6C2BD5E2D6E2DB2CDC3BC6D3B2C$B4A4B5C6ED5E8DC9DC2B2C$2AB2A3B3C9ED3E 10DB9DC2B2C$2B3CE2CE4C2BDF3ED4E19DC2B2C! golly-3.3-src/Patterns/Other-Rules/HPP-demo.rle0000644000175000017500000020173012026730263016245 00000000000000# HPP Lattice gas # # J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. # # The earliest lattice gas model. Later made obsolete by the FHP gas on # a hexagonal lattice, which has better physical properties. # # Gas particles bounce around inside a box (for a simpler example, see # HPP-demo-small.rle). An area of high density has been created, this # spreads out in a circular wave and reflects off the walls. # # In 1986, Norman Margolus ran an almost identical pattern on his # purpose-built CA machines, CAM-6. It ran at 60 frames per second. # N. Margolus, T. Toffoli, and G. Vichniac. # "Cellular-Automata Supercomputers for Fluid-Dynamics Modeling" # Physical Review Letters 56(16), 1986. # http://people.csail.mit.edu/nhm/ # # States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf # # Each cell can contain up to 4 particles, each moving in one of the four directions. # Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. # Next state is simply the collected inputs, in most cases. # The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). # # To make the gas useful in Golly's infinite area, I've added reflecting boundary # states, 16-31. These work in the same way as gas particles (collecting inputs) # but reverse their direction. Contact: Tim Hutton # # Sink boundary: (or you can vent to the outside but this way is neater) # 32 # Source boundary: (haven't really worked out how to use this well yet) # 33 # x = 256, y = 256, rule = HPP 256P$PBG.NB.ONCFJGFONLCG2N2ECB2LOBOIMO2CJ.MFCKIBCKFICMDHNAKEAGOCAINLA MIEIGFALKI2CADNFIHBHFOBD.OFMCEKAJBDCGNENFNMBKECBOABAIJBFOABAMLGOIDBLD ECEIKHMLK.HMLBABDJBDGOA.DJ.FKHL.GFH2KOEOI.AHEMNDH.FDMICOJHID.KHICGM.D HGBNGCJKI.EBNJKENAOHCGE.IGIKN.A2JAOCMGCNE2OFHDNDOAKEDP$PLAMEGCEJCGL.K EDBKE2DNKD2ILODHNECKD2GNGCDCHFMLJ2DFGCJMHL2.DEBEJ2GFEIADGKL.OLCNGCNMK DGEB.HA2.BOKDFMCJCMBA.B.2AKNI2K2LNDAHKMCIJNBC2JNDBFGLCFIDMCOCBDN.ME.L IKBLIAEC2.GIDLILNGCL2GCA2FMEAMELNFJNONMICAB.JMAMGKJGEFBJIKIEFODBHGAGC HEBG2KODF.CF.EKNOL.LF2KAOFBGLOKF.EP$P.AJFJHFKD.ACOC2BCGAM2AGIAMOMDIKF HFLMFAJAOMJDL2JAFIMCKBCHGODLABLDJCFOKCHFMFKEBFEL2OHNCGFIABKICBHDAJEON OCJAFAICOGEFMJBEODLOKFBDHEGLOHIBKLEOELHFNOK2ABKO.HBN2HCAEGC.IMH.IKOJL OHKBNIF2HNFLMOGBE.BMHE2NKE2JKMCMIGLKJI.NBLEIN.OACBEH.ONFLO.AIG.E.CHA. KCDICECJGLDIOJGP$PJG.JB2HEOKCGBONCDBDKIGJF2B2IFNMCOIBL.E.ODEM2IEFOIK. E.GNMEBNOICDHDIONOKLGBF2NIBCKNB2DOED2H2DFJKIADAFAOKNM.IEL.IOFMOEC2B.D CI.IOJFHNGIH.COBJ2GONGLHLADC2M2GFDJGK.FCDALGOEI.MIM2NIKJL2FMOGMIN.CDN BFKOFIFIMELAN2JDM2KE2.LF2GENKMDHNJCNBI.CON2GIE.AM2EB2LAOBAKBGC2BIP$PL JK.JIOJAIAN.NFMOK2NFLBENMEDGIOJA2MGDMDI.GOFIF2JF2OEADHF.NEOLFGECMBLCN KCGOACMK.LABMO3JNEDKJCOHBCBMHEDIGIMABDAIGONCLFCH.DJMIOALJI2BIGE.FH.BN OJIKM.3LHGNJK2OAJGMI2AJLIBGAIN.2LENKHKEAGCG.ECK.2BMNFIA2.FMDGCALBDBHI ELH2ADMFJAEBAICOIFDIOMBKLF2H2F.BAN.FGFJ2EF2BP$PI.FILBA2NKELB2LDLG2BGE AM.B.O.N2KEGEFECLEFKMLGNKALCKJE.AEBNMKJ2LOHFKFBDLB2HDEKHJGIKLOLNA.OEJ ENJHDMKFJO.J2CB.NEFIF.MBLMDHOI.K2GADJFLJOJ.LEBFBIDGCEFGHAEAEKNAMHDK.C LHOJMKMEGHEACEIFHEMLADNAMGCLAGBHAO.2JIH3OICKJIGM2GLHDLCMFKGEIKHDMDGBO HLFOAIDNIBGB2A2NGOBNHFDFP$P.IEBIHOCLEG.ILJANHBJADCGIADO.JHMLNGJFGICIE MJKBKFHCAIFIJLJKH.GDELO.OJGC2DENANBELGBNIOE.BJHALFDB.OHOJDC.EL2HFCMAE BO2EN.DC.BGJLBLH3LODIBKJH2I2KG.MO.HLAD2C2J2NKOLKLOLOM.A2CMNJFC2BFBHG 2BKECODHAMEIOLMIMDEAH2LJONGBA.JDOMIJFBOJCHLMCNLMFAFKDA.KLJ2GFJCOABDJK DAOL.P$PGBDBDMJKI2JNMOBFGMGLOKGMFJBDLDMNKLBHKO2J2OHKFL2BK.AOMBMOIBLEM LHEOJNMFBKJKAD2GAKNDJEBDADEGDNJCM2IFM2COH3INJHONKEGIF2NMLGKGNKFEGKD.M CNEAEICNMJMOBANA.LFD2.AOLAIJKDNAF.GDHMLBABL.JC2MALGOIM2BMKE.DKLFKFACD MOKA2EGK2FMGIDIC2NCLKBOECG2ED2NBFIJCBFELFLMG2DKIH2EI2BP$PIAECH.LDCIBK CEML2AGJGMKJMEIM2KDEAIEMKEMEDAFJKCBKBDGDNICK.F.JKI.OHBGNA.CELEMND2MDN BOBEAKGDAKBICLFJ.H2BOI.GNENKNDKNCGJFHEMFALOLJB.CBIFEMGJ2G2NLHBN3IJOH. AHMCLO2FLC2E2JFJNCDJNMNMBLOLDG3NINLIGOHBDGKJDJBICLFKABDJD3LEIMJOHOHOC GON.NADLDHJFLA2JH2EAILCG2AJDF.FCP$P3IA.A2JLNGENKL.JK.EKFLOGMKJ2GICKCJ EBG.HEHKLE.GHICNMOACAIBJF.2COEJA.GDNHGJN.EJAOMDBKEKJ.LCEFAKMLOAFKEKLC G2MFNOBOJIFHOJGHC.LA2BAI.AEHLJDIBEA2O.OMI.M2BCDHEDL.EJOFKOCHDCOHEI.AB .I2OD2FNOLNK2.F.NKDF.JADE2CMKAJEA2CONHM.MNEJD.OFKBOHDIGENGOJIHKDEBAGJ IO2CFMKODBEAP$PHOM.AKLHJMLJA.JNJCJHFGEJKLEFHCILHKMDCFGFENHJNHEBKAEJIL IALFDILIME.AD2OJ2OLBFDHJ.NK.NBNKONM2NIMLHEGEIOH2MHIKIJLOMGBANA2M.IADI FGCANJHNFBGACIJEHCOAKGOKMAODNIH.ENFI.LO.NCGOKGI2DJC2FK.CBDCG2NIKBAOFL GDEOKDCFLJMIJKAO.KALMAGNCB2O2CHA.BIMFMDAGLNDBK2NOE.DBOGMI.NFDIP$POAKH 3MG2JKDJFELDOCDGBKMFJ2KMNEKIO3DGAIFL.N.FM.LBHNONGKJHDEKMCJB2GLOGKOJ.M NKANIGDFDIFJ2BGCBFJB2JCAOHI.GHA.HD.LK2CIFGBLNGFK2F2L2IMLEKIEKGNACO.NH CK2NDA2BDM.NCLOEG.DEHJBKFO2KBABIHJGKJAI2CDINEFCGHGL3GFCIHLAFCBFKIDAIB OGBLG2FEINOHMGBOAINIJA2IHJCGME2MG2ODMHFBP$PDNJKHLEKL.INOBLHDJINONB3MD IDJDEOG2ICFOLDOLB.AG.OFADJIMHGCBOMJIFLEKDMGNKJCNEMNOAI.FL.NJNKJAMOJCG F2GMC2IJM2K.IK2J.KOBEGEGH.IGINHFEKD.DOALGNKHOKAIACJAOHLCMBDICEHJCMKJM 2CAI.2CMOCBMEIAOEG2LO2DIMB2NDJGILCFKHMBAHB.BGMAFEFKHNK.FBDFHF2NHBG.GC BAME3M.NKJIOIN2IDCBP$PJ.MLJHBKEH.G2INIKCHJOBHJIFCFEMJDIO2GDCIDMAOEO2. M.I.DOEJDMIALAO.E2LCINIBNOECNLOMGKA.KIOABEIGLBIEADLOJMIL2CJDLH2A.K.GO J2BHBAFIJ.OHGBLIFBDOJDOJNHJAKOANFNMHCBKBHBIOHEFJKBDA2B.FG2ACHDOKDGIHN GHEC.N.AFBLGAFC.BFE2MJ2HMBLAL2OLFANONBDCNLNIEOJC2IEOFBIJLCIEGKCBNOE.N P$PCAIFBKFDCJM2NLBI2B2MLIN.2B.DE.LHJOHAO2DL2BLCAMKNFHKANGNMKMKAIMHKMI 2CF.OJKJABIJGJIKCJ2GINMLJGMGINKGAKCLAFJC.I2KCLJ2I3CLOKDAKBGL3JHLGOGKN FHGK2BMHLI.OAGOGKH.A.EJBJKCAF2LBG.JMNGFIBGCFIGC.2HEJFDKIMKNIGCK.HLAG. FC3AN2DHDNJC.FCM2JHLBAJK2IF2GK.2B3GNLGOEJEGOAMP$P2AEK2C2KLDEMJFOM.FBK E.OJMJHIJDIGNCJDBIFEC.BELKLBJDJH2KBFAOHI2FMJCEFI3ELMDBKNIOFEBKM3JHGEN GJ.HGOBGAFJLAKDIBMIGE.BAKAMKIOLHKGOC2GL.HNFDHJDKOFNOJELNI2EBM.MHEK.CD IOGNHBKBMOG.NOFHJD.CKMGHNAFMJGBJ.KELCMOLO2ID2LBE.JILD2J2.LNOMOKNDOIKA M2O2EHIF.CH.ENFJDKEKC2.IEP$PFMAIKHFKECHLCHLJOBHKJ2ICFNLENIBOC2GOIFAHJ BEK.IA2HIJEOJHIHCGEOF2GIAHAHOIBMLEAHJOJMFNL.BDEBNMNA2BK2MIC2JEJEHG2LM LO.D.DCHIJFK.MDF2GLILNCIEDFAJNIBDLDILBHFHCJFJMJKOHLCAHGCOFDNENICOLGOI 2EO2HMHG2MGBIEKOALOCGEONGEAKFACGKHEDALHKBG2LNL2JBOEMEJG2K2FOAEHNAO2M. GIH2OFP$PDONIEC2FNE2BAO.HMLHCMLHIE.AMOKBNEIMFLELMCBIMCOAGKMNIEJHFN.KH BDJAOENOAMAGK2MHECMBECENDHEA.KNE2MIEFJNELH2FJ.OI.2CGEBFGL2IJH.2LKOKDJ OANIKML2KLHJLI2BEHIAJELJCBDB2I2HDKBAHIN2.LIECMCL.ACGICAKBFALGCL.BOCEN HKNHF2GM.2HLMGBKDIANLMOMDFB.NFAMAOCKB2LNLJ2HG3HMFIKJ3LP$PB2FOFCN.FIJH B.EDKL.DEMENK2BMAOAHNKNBGDJOAMIFBMNIFJDMIDHAE2MGEBODMABJFCOJGKMHL2GBA KOCKI.LBMFGED.CLBGLBE.O2MADMGBLJBL.GCEOAFMEJMGNDCIBFGJCHAGFBKFJFCNMGI M2FIA.OCOCDHECDHNJIFEAIOEHDNBG.EOIKICLDLOH.CGEOF2GACNC2GJBHCGHAFAILOL GJHJKIJKNC2FHMKGOL2OBGDKLIBAEJIJEDMP$POEHNBNENIMJIEKLO2DOIEN2KJIABFKN FG2LHLHAMFBCLKFMELCE2.DKJIGFJEA.L2O.2BC3FOAFAE2FKCBI2LJHOJ.LM2AM.LKNI EDIOCEOBKNAHD.O2FAOAOCAOKDHCJHFMCFGFEOKG2ADKEMOFINKLAM.ONEOEMHIEHCMDE HOLDKODLKIDBLAOBOMHCHLI2CEOJ.JAFMBJM.DEFGMLJAODOLDOIK2CFMFLK2H.FCIODB IFJGJECDGC2IBCDP$PNFMGKGONML2BAJ.2CHI.LIMHLFKLKEF.IF2KMDLEANLKIAMLOIL IN2GHOIJ.L.CN2MFE.2M.H2KLAJ2.JILOENDALKACNEJAB.A2BA.MD.DAKFLDEJOL2G.H OLMN2O2D.F2D2OHONJKE.EHIK2MBH2.LF.FENBDEB.GEMBDECACJH2JD.ANFDOBDMGJ.L GOHNBAMEAEGCMHI2ACAN2KH2BDKCDCFEIO.MENHNM.BHLOBEDMNI.NBL2DNOM.MDCP$PK EHBJOFCGB.3B.2KDFAHB2MDAGN2FDEBKNL2HLDOEHAKLCE.OMC2LOMFHKDJDNG.NMC.DG BCFIFK.LAJEJLD2INK.D2.JMGH2IKAJOJGNEBIL.NEA2NMJ2AJIJACJBCNI2NKBMOC.I. DI2NJIDGDFAK2JMJDJOBACN.MJLN2.AMNIBHLCAGNOMJNDJBI2GMELGMNACHNCBLJ.MJ. HAI2CAODHAFEOGEHI2JLHAFGIEBIHFEGCBIJBMFKIFD.EP$PCDGLDIEAEMH2CODCFJDJG CMDLK.HAMAFGDKO2CLHJLDK.OANFNI2C.JNB2JK2BC2OCKCBIN2DBL.HOJKFKLADJCLIA 2BKFNMH.2ANBGNIHDH.CNJC2L.AEOBDC2GNEDB.DNOFHGD3.BLGELEOI2DLAKLJHCHGLF HAEHE.NDJHIONCINFMHKNBCFHAKDHEHLKIGKOLC.BKIFJANJBHANBFEGKNJN.NFKMOIKL KDN2AGIBJI2.FDEFHB2AFCBHAP$PDFMCKIAMGFAEFLDMFLJAJOADNBDCANCMJLMJAJOAE B2NIOKANMLNOLINIFGM.H.LBLCKOM2IDAB.M.AGONBHNABOLGL.HLH.ENBCBICINOB2LC NDCNGAOICLHCEDCKOFCO2DL2IGJNAGKOG.BFGFDM.ILBGDBKCNMCLMEKDIFBLBFACMAGF 2HLOBLKI2EAOIKGOHDK.CGKIBJKD.FK.IAHJNKMAGBNM.NFJEM2CGKCOGEBKCGL2DLKFC H2MG.DP$PODKN2GFE2H.M2ICKHFBKOMOGHCO.INHBGCBC2DMOH2NLEFHOGJON2J.E.KOC FCJDALIHFEOIJ2KJMINF2LBLGEOHBEFCH.HLOAGHO2JE.ABEJMG.DOJF.CE.NA2IOHJLC .NMCM2F2IOCEB2GKJBLMGN.GBKCNGNFHKECLI2GLJLM.GNFEJLF2D2HDEAOGICGANCKHE JFDLMKLA2F2AMDNCMILHLAHA2KGLFIM.MHFNMDOL2IL2IBEKCMEFLEIOP$PJDJMBLNIM. OJCMF2HELD.EILD.L.AEB2MHOIOACDG2EFICLBGNFMLFNJLGBABLBGEMADBLANIEIJELF DACOILJG.JAM2EABJEFGFBJLGK2.LMDJBCGONAIEHKJGJOJIL.O2MIAGHDFC2NJ.KM.JO NE2BJFH.ODIAFOAKHEG.LMHKJMBJKEBOEAIBOC.CBO.GIJEBH2COEJFA2MAMKDNAHCFJO JLNMAGFC.CG.DHKI.CEBFHCNCMBABE2OHBF.IP$P2NC.ON.KNA2FGOEOEG2N.HGEBEAOJ OJE2AJGOFCLEMFGNDNBK2EDCDMCF.HEFOFOHMA.ME.GMN2GBOMONEFG.CKOLDGKODMNEF DELDLBCB4AFECBNH2LAFOICNAKIJIOJ.E2MLMNOAL.NMG2OGHD2BCBG.HFHC.ILH2LDGL ABKB.2GAHJIJAFBDIDOEJGIHCGEKBK.JM.ELKNCLILC2KGOAI.LNIGJBMFCGHEMJKCHAD OHKBNIABODFKCJNIP$POEFEGIGBDLJAK2HKNCMHJFNCFNFOFDIGCKH2E.J2LA.GJ.G2.J 2LD.BDGLAGN2CEGHJCE.M2CGFJEJLDKCHFHNBKBFLJF2NFCMA.CHGLK.BCHDCDOJBNJAJ CK2OHICD2GJLHECBJNCNAN2.KNKICMDKI2HBK2NCEFCECK.ANCAIMGOKN.NBOLIDA2OMK BCIHFMBJHNI.BMDB2JNGFAMO2FMCJABGF3ANJCAJ3HF2EKEOL.DKH2NJGALMDHIMP$POB EBHG.HLJEOKIFOCE2CFBK2GJF2LGONEHOEDKDECI.LBKO2HOGE2MEKFKDCBINILGANB2K IBHCMHCN.AJBCMGHDFO.EMBOA2.CODGOD.ANL2.JBMC2F.IKFOIEMHDJKNKJ2BHLENEB. G2ECD.DBCMCE2DO2EDL2AHMHBILONEHL2MBNDCELNHKHKDJFOFH.2MHANJDBL.CDJDINH KFAGIA.GILDLDLBAM.LGMEB2KMGFKNKMIHDC.CFINOAOHP$PIEFM.LBJGJDIELBNOANLM ALBHLJ2KOJADBLHNKBFGAOJDIN.3DJ2MIMBA.EFJ2HOMNMEO.OFBIEHEHCBMIAEG2FICE .MKLEF.NGJ2FOHJE.2GHENMLMGE.KA2IBE.EIAKF2J2ML.BH.K2IF.LBENILFDBOAM.DK GMDODA.O.2INJBJ3NFGLKD2BH2.LCEFNIBN.CK2CJBKL.IBDI.JB.O.AKH.FIJ.IGOFBF MDLHIFAGEOBMDFLIAEJFCIGOP$P2CBEFLFOIDCAKBKJAFCGKO.JHMCNDK2LCJBAEFENKN KJAEONDI2.2A.JGAEOLMLDJGAD.2FKNAFJFOJOBDL2CHFMOJDOMLAHGDNB.IO.LMIOB.H M3GKBC2BCOLCDOCFCK2NMDNKFINEMG2KA2HOEDNBIDCOGOLJABODCEJ.OBGCKAGKLO.DM 2FOL2E.NBCMOKIAHMCJEHIJ.LBFDMG.FGAJBDFAOHKI2ALEDCEGKINMLDABLGOBG2FIOH LN.OP$PHM.IJI.HFN2DCDGNHKH.BANOFOJB2DIDCB.ELOGK2L.2ANB2OHDGIOGL.CBEJL OB2KGNAJH.DOLK.KFJC.O2DB2KFCAJNJNLOBAICOEMBAOH.2NDOI2MKNKJAJLCBJCNG2N HMDIGAFEMCBJB2HMBLMLMBCOEDBGCNCFDA.LJCGI2LFJ.AMLGA2DIDLDIFI2JKHFIJOIG FDGJEALMLNMOA.FMFA2.LNCBE2MEKHEL.DBKBJN.K.GEJABCJGBGHGP$PKHEBD2IFAFBJ FCGNJHEAKLGECL2BNDAGBNIA.A.OLBJHILGFHEFC2NOFKMN2CBLMEMHCK2GKJOJKDANKH GNIMGAID.ONAKJHIOJLK.F.LOENGHGNIMBKNONGJIKBHEILBMCEHGAGNIFH.AELHOHBJ 2HEB2KACBOI2C2B.OH.G.GIOIFKFOKFBDFCILNFCKCODB2HCNBGNAHNKF.FLJMFNIAHDI .L.JGOGLIDJBLACHLALCKDGCMFD2O2DIDBOLP$PHBLFJC2BO2AFKHB2EBENCNK2HEM.AC HGCFO3ENAMAIEME2DMFCFBKLHMADNKNHFGLAI2EDHLO2NBGLIKGEI.DKEHCMFNHIJNILO NLIA.EAHKA.AINIANENLFLBHA.NDBHJHKEJF2.OKJ2KI.CMIJOHMCBEFCIHOKNCAIK2L 2KGMACA.2I2.JC.MKBO.NH.2DF2HKILCKB2JNHGHJFDKLGCBI.BJDBLFBJINKEJGLBNB. COEDHIOA.NBMD.HONP$PLFNLEKCABFIGEKOGJIL2FLKD.JEMKBOCONDNKCBF.GHAIDGHM .O2GJGFCDCB.BHNHDOJNBF.IMDLFOLEAMGM2FCJALICGCEFBLNKJDNEIFLNJHJHCMOKHE MANCIHFOGME2D.KFHENHLDBHCLGJ.M2.OBKMBF.BEF.DHOFJL2BODABMJLIJKN2BAIEJO HNKHAEKJKMHJNEMCJAE.LIFHN.ELHIKIJNJNLGKIMOB2GHIKJBCHGECNK2NIBKDJDIBP$ PEHMJB2MBCL.ADHNMNB2DKDMLG.3O.HDGCED2JCFENIFJ2GFMJKAFLGMOMIMELMFKLFIG CDLCL2NOGKIJNDBHN.HNENEGAE3MCFCLKHA.J3BIK2GDCGONOCDLFJLJL2C2HCG.JBDOA JNJBJKBL2KIM.O2CO.KGNHMFGFIANLNDGJGKIMJBIMHNMBDE2CIENMGCN.KECEM.ONDJD NEOMAFJCMFLJC.DFMIGAKCOEDF2HGKDI2M2DHGOF.HLB.P$PHON2IF.DHCD.LIJKEGOIO MBIGIJH.K2.BDNEMJDHDKNBLMCBIDF2IDND.HLADJMAE2H2DOJEMGJCECFNILBD2JCHNE .OEIFKELDAGALHOJ.CDFLJADMBEL2CGECHEHAHEAECIJN.HLDLIEL2BM2NHDIDJFOLGJC DAEOJKENAO2MG.JF.NCFOBA.HNL.FJKGMFIOEODEIGDJNGOJKACENKBCIE2LH2CIAFGED IHJ2AJCME2KIFGHFME.MNIDHOIP$P3OCLOC.AOLDFBHBAEFLO.F2HJKMLBDOFDEAFENIC JFKGBH3EMO.N.IEINDFN.A.EIO.CFNHBCKLEBHKABNEGELIKC.OH2O2L.ECEDFBO.BIOI .EKMI2NCEHM2FL2BOGOGEB.BC2N2EKDCLKAMEL2OGAJKGHGNDLFKMDOLDBEDJIHJKACIF 2LM2EG.JOHGFBHJDNC2.K2DMOJMGKOMKAJA2MJF2MED2AOLA2EJKCFLEABGBCDI.KEFH. G2CIDP$PBJCM2IECMOB.EN2BGBDLKDBLDN.OKHDBDMCNGAGJBMLGMHBNH2KLOCFOGFEKJ NOEC.HOBC.MGHJOGOAJBHLO2MHJ2NLFNKHEJFMDGEL2MCD.NHI2EC2OJKBJOMIFNDN3JE OILIEJH.AOF2DH2FNB2HDGI.ILFGD2LHJCLDJLFEDED.O.LKMGJD2HICAEBHEFGOADOCB JHLGALHIJMIC.HK.AJ.FNCDCI2.2KL.HCFEKDAKGKDFO.H2OK.AMBJP$PJCOK.NGFAOID GKNFNOMAOJKEOHCHDBH.FGA2GLCN2OCBHFHNH2JOEJAIJIG.ODMOIEDCHKE2BDHMDOJ. 2BN.HFNMJCI2EJNGN2A.A.JMBHLB2IDMONB2NG2CDGKLNAKN2BJKLNOLKGNCJONIBJANL HNGBGFHELAJAJAEDIOACOKGI.GEDBEADLODLBIHJ2DCB2KB2GC.JNBAJNLJOFCMGCA.A. ACFJ2HONJD.MAJMND.N.DKMCD.2LALEIAEMBP$PD2GCH.GHDLJLG2FI2HODOIDMABAMEG N3B.JFBAECHLCHE2ILKJLOGNJLO.KNEHLO.KF.KC2GMKE2DCLAJALNMHJKD.FODJFOLCN I.G2F.KJL.ALB2NCMAHKE.KHBKNLJGOLFEBLHI2LOHNHLOGOEDJGIEFHG2DHKAJNIHL. 2FDHELHMHIGKEKLHNBOMGK2J2AFNFBKADHCFBD2CDLDLBMLBDKGJ2.NEA.LODKC2KNCBL GCMDJ.NGNMEIEIEGOP$PGHNALHOBHENMEBJNF2KIHOJ2HM.MJINEJBH2.F.LI.G.BICKN 2K.AGLFEGNOIKLKDJLGAOLMBDFOMKDHBMBCFOFEGON2I2MIGJANICBIDLEI.KLNBAC.FI .MCFOG2CJKO2KMBNFDEACMCBM.BH2DCBMD.FCE.EMALOLBEKIABMIDADMELHGNHDKMOIO EOHCJGLHNHC2AENMOMANANBGMK.LCMFAEG2KGDGONAEAIJHG.I.NLCB2FMGFBHLODCMP$ PCKBGODF2MDNH.FCELFKBFHICLOJBN2FJHDF2NCGEB.DNIH3BJBJBDLMCOD.CJEDKHGKL 2NACGCKFELG.IK.DNC.IDNE2GD.IKJNFIOCKBGIF2IKECJE2JINI2BDN.FEK.OEN.ADG 2KAL.MICGKCN.2MG.LHKDEOAOKEMHC2EJBLNIMOMAIKLD.MHCLACDGOHB2JGNLMO.BA2B LN2D2J.GC2LOI3C2.EIEF2JFEOEMK.JHFDLMNL.DKENGFIEP$PMFEGDAFBEIDNDK.OB.G AOB2GLNINCB2EBADOICLKFOELHMFOJHKHGHMNFDKCFKHDNCLEDLEFJENDMDIOBNMELDHC GL.CDNOHE.C.IEGI2FOMFHCBFNIOCADCJ.FCI.LFIMFKOILNBCLO2I2BNACG2JEHAIBEH BLIGJHNOEFEKIMCJCBENLM.MO2BNOL.INMJHN2F2GE.NL.EGKDAEMCFLI.LBOFAMCBFNB .KFLODEDG2.MLJ2KB2NJMN2GJHGMP$PCFONLOMK.NMG.GEIFLGIGJBCNLJBOAGM.IHJEM KD2.EAMCO.BEALCDHC.C2GECNDFDBNHNJKOAMA2BIK2GNH2JCALHCD2CALOFMK.EJ3DB. M3FCGOFLDGEDEL2EOAEODBKLIELCMNGHCLN2.JDLGHIFHJCGAICEDMJHDKGAHBGDE2GJM ODKGNHEFIKBFGIB.BHMKD2BCMFMHJ3I2J3FHKJOALAEGM3.H2F.L.GHDFDJ.NCK.O2BAL MBNMP$PAFLBMA2HJGJMHGDKNLILEIGAMGJFAECDBNDLIBKGJ2KOADCBFDINKGJEDKJMHM 2JGHAMHJLINJFICFJIEH2EIGMANFLMBGIGDEOKNOCI2.OFNKJDCLAHC2.IBCMLBMFMN2J IGEFONAFJIHF2LGAKOFIEJCBFCAONKBHNMI2HDCNOAJLGIBK.2IHA2EDB3ELJFDFJA2KF LH2BMGLNMINAID.F.IMKCIGIFIKGI2NODACM.JLG.2ENDM.FLNM.FP$P.NHMIKBLCOC.H ECB.JDL.EAHGMAN.K2NDHJILA2BLOMDIN2MICDNKE2IGINGJ2M.JM2HMOHKEKMOMEOKH 2KDC.2MDE.DKJIJGEKIBENGFKL2BLHOBIBCEKACBNKANIL2HOJO2JCGLBNFGKG2NG.E.E DB.DG.OJIEMFKB.3DLJLAFALMBHGEL.IHKAHCF3.CKHCIMHJMOMGD.H2G2BKJ.EGM2GOF IFBEABABHBODMAIOEMOFJHMOLGCOKANLCP$PGKMEJFEDIHGAMGLNJFJIAOM2N2LDMD2OG JHAHDIHGJKDABLNKMJEC2AFMJMJIFKLINDCFEOJ.2E.CNKMBODHNKHDO2KHFAFEKFEBE 2KLB2KDBHOGJAENANDIHLJMLCEHKCGOCHG2FEF.GHMN3ONGODJAK.BGACEBH2BIHNGO2I CHG2NHNOJLKOLB.OKFI.GNJK2.BC.IMBOECNBIKNO.GNHIKEHEHOHBMIODIHCJOANLODJ DA3NEHJFGJKEAP$PH2FNBAMKG2KOKINFADG.HEOK2MKHGH2B.KDIFJBJDJINDLEMJDGL 2KBIEC.JC.AI.GID.JDJEDFLNIMCMECNIKE2GIMDNKA2IKBOBHE2C.AFB2HNLIFHJLCEO MKNM.O.AJ.FB.JIKDFB2.M2BGBDLBH.EMHNOEKD.JCEMNICBO2NOLBGIN2IFIG.NMNDHE BGCNJBIMBEONILAM2G2JMNLBDBHOAHFHA2LGIOCMGNDBJ2AD.INJOHEKNLN.C2HIP$PLM NFKCMBNM2EOHCDGLABDA2.AKM.JKGO.ONAJMLJ2.LFMACONDHFEIG.IOMIFIEDMABFKFB O.DCK2BEF.ALIJIMAIKJOFNLFAHLNDFLO.HGCBL2A.2MBAENLDAF.EAIKDCAIANIEIMO. OBLKDOA.DBMNMAI.LGKNIEIJLEDNGKDJDAMIBCLI.LBGIL.HODNOI2CKNDMHCKL.IK2HA O.DN.ACOMOBKG.LGAKAJEGDE2NGN2JHKHDNJODM2JDF.LP$PHOJCNGKAIH2NKNAJCL2HJ LCN3KBNOCNLEOBLNEMDIDCMEFCGJA.JDJO.OAJB.LKDLJKLBMAOMBCELDKBMJHAMAC.HA FJIDBCHIHABJCHKMGHOGAOBFHL2GOMGLJOJCNANCE.CGJOBNLMHO.M.MEJOLD2B2D.L2. FKCINANGANHCNGCLFKDKOHLME2CACBNBECEALHGAJLAIKMHMENLELFDL2.GEKMD4CKOAF CIG2FMFAOCJBELNMFMBGE2MP$PJI2.D.EJFCHDNHNLB.DBL2E2BKLOFGLEBNC.I2ELNIK 2GINJOD2HDABMGAN.OMCILIFLJLEFHMCAELC.L.DHEA2HIKJDHOAOIEN2GKIDOE.MKDHJ HE2.LCIB.MJFLCEDMF.OFEFOFKEHAOH2GIKIAFOHDGFHIODHJAG2DOGH2GCKD.GONK.DL ABJAHAIDO.MIMDKHDEF.HMILFDONIH.BKFDKFJEBJKLCMDMJHAFND2A.LNAENDFBONHCH LKFCP$PCOAKG2HDKHALNEILMKDH.MFKGOA.MDMKCMFBOMGKHOKG.DIMGL2NJKHNJDBLHL 2FEACH.FIEO2NF.AEALDFIGBIMOELFBGJBHLMNCKHLG2MENFD.G2IBFNCDJGDHEGJGCD. 2CLMBOI.HBONHBLHMCA.K2FIM.EOMDALDK.MDAMAK.2EOCB.KAEAGJKAJAJ.IOLJKJHDG DJMFEMJ2IHO2AEMAFO2CFIOBEHBHOJAMDCE2.NOJEHBHJDOHFOMF2CP$PONAFKJ2.OF.H FO.LEIAHDOJGOAFOJMOBGDBJLEL.F.OBJFMDIGEJMBGFJCLHAMLECLKOA2NGHFNOIG.K 3GBEOD.JELICNJOEMGACABJE2I.FOLEK2JDKINMLNGJKIBAKBENAD.NENEOH2OGFBDL2. M2JMJFOBLACIFGKHLBJBN.HG2FDKMFBGIKCHGDLGOJMN2GAMADL2ILKENCECAFNKONI.C DFNBIJIOAM2H2OG2NLCLKC2OCKIAO.JBCIJP$PCFMOENFLCI2EAOMALCL2NMAON2DJDF 2HNGLI2G.CDBJEDNCI.AHAH.ABOAIGEJMLCNJEDF2EJO2KODAEKDLOHNB.E.CL2GD.AHJ BGAHC2OC2DG.ABNHDMJGIMAEMCDMNDHLGNMBFLNKFBFCMEH.GCGBKHCDHFHNO.K2JDA2O 3FGBKJFHKHFJEIBCKOKFICMGNEKFICHEKB.LEC2I3JC.NM.ML2BIJGJKFDLOJ.K2OME2G OBNBOLEDNFJG2JLP$PONL2H.GEDKMJGLEHAJCELB.KOEJMJFJ2B.K2BGK.HDAKAF.2OL. F3ONKEFC.JLOHONGKE2LANAJOICIJLHNMNAKOADJGEGOGF2HMFK.JMADOE.2MJNJIOCKH .BDKJBDOCMNGACD.OENEOHOBHNMFMHIO.DFHMEH.JBLHKGKLANFG3MGKDKACKHCDLEIOD .2J2HIA2DKFJAGKNE2NJGDAEMJIKIJGLH2EJGJ2FCGHIELENANMLICNI2EOHJONP$PHJC .EJNBCIFKEIODGFKAJNEGI2DHIBKBOJH.GNLEDLC.L.NAMBDCMD2.2H2AGDC.K.IF.FOE GK2DINOB.2NFEHC2JBCGH2M.BDE.B.BJHCAKFALHDINLMGFHDGCMDADIE.HMO2IHLFCEC BJCGCK.ILJ2.L.OH.JF2OANILHKJFMEG.JODJ.FKNBOHKO2HIMH3DKAF.3KINCMLEJGBC K.EMKB2FCHBKL.AMAFEN.NFANBANFLAJGN2OJEHFGLP$PFNAFMC3M.ME2GCOKAINE.2OA DLHIM2COD.NKEDGIAHDKGKMCDL2AKLO2NFI2DOAOMHJLGODIJCBI.BNL2FLNCHGO.FB2O NFDLNILGDNBEGFMGIH.D.IAIH2BGEGFDMGO.2HE2FLILKDHA2KIHMIHOGHJODF.HA.A.E 2CHACAMDONBO2JOFB.HFBIFE.HEFH2NGKDBNALKFHLKIMDMINHEMNKID.CB2K2GEHGODN JLD.ML.HJCBJAHGKB2HM2GP$PCIA3GOCAMOFOGDKL.EILEFL2KCK.IEBJNID3F2NILMNA FL2DINM2DHKGIHKOKECHLNFDEDCINEHMKNFDFAJANFGBOM.M.KCJCIEDGLHJFJKBFNKH. GKDBHLH2EJMLMKDK2FJKIOLFODIAJG.ALDEB.DKJGHFA.JKFCFHKAD2GHBMOHE2COEOKD ANON.B.OLBGDG.FGMLNCKGFMH2B2GHLJKL.GIC.EBIGCNHGJOJBJ2HGM.NFBCGNMDJI2B CP$P.FE.HFMLB.AFG2F.MOFHFM2KNJLANB.K.B2JOGAOEN.GJMHDNKMLKMJEMJIADFNG. MNDEFOMIMNOAEKLIOCJBFCLHDFAM2HOFAO.ILIMOCAMCJF.OKCGAEKGJGJE.IMDJNMFO. NFK2BDOGODEKGEBING2MHJEGCLAODGF2ENBKJOAI2CFKGOELGDBJL.IAMCKFHAE.AJL.K N2BJMLIAJD.EAOG.CJOLKOIHBNMIMKIOBFB2.AK2GADFKGEBMG.P$PAF.GI2MCMNJ2CIC EILAHDFDBOJI.MAEHEIMJM.DFJEGAJCKCDMFJKMFG2KAFGCIG3JLHL.FMEDKNJKNGIJOH NABEIN.C2MKEBJ2AIOBMNOKHMAONHAIC2JIMLGANO2JGIDICNKCH.DBLGNJAI2JNMFNJB JCIA.M2ADCDKF.IKNJGKHNMGFH.AKAN.KEKDCEHJBEDELHJEJMFELMFIDKF.OCJ.KEFDA ON.OAIFBDN2KCLKOELEBNGHOAJE2DO.P$PBAEDAKMEIDKADFDFCHL2OJ.OE.2LHCAHCHI HMJCMFM.FCOIAKID.K2MGNOKHDIK.ADNADOKFIG3KHCEK.BMCOG2AOA.OJEJLCBGLJMBN IECDCKNCGFOBN2.NALOBKIDNMJKCFLM2OMHE.J2FEMNFIFECG2ONI2.IEI2ND2.EIBFAF OMAONOJELHNHL2IANEAEBANH.BCH2LCFMJC.H2LMDNEGBJNGN.M.A2DLNKFBFHEDCNLOB F2CNAC.HBHDP$P.EBKNEKOKAKFHO.H2CKD.MIKGBLNEFENEME.2LONMHKLHBLAMNIKJMN AHCDINC.FNAG.2FDBHMEMNJ.FBHFKGBGMCJEACKNDG.GCIAEONMB.HFAFHAOELNIGDGD. MEOMKMFH2JFMELINHB2D2FJNOKBAM2NG2OJOL2GNDAKO.DOLMODJKBMBIL2IDAMNDCA2. ELMO2NIK2B2GMNBHLOAODJLGOABDBMIBDHFKHKLMFNDBJHIKAIF2DICB.LDIGP$PDI2LF BGLNANMFINJIGKAJDKCDNOABKADBNJFAONAIOAEOCANIANJKJFAFMJL.NOFAJFIGFAK2H ANEM.G2BI.ON.EDIMDINKAHCLKFKG2NGCNLMDL.KAOIGA2EGCHKFIDGAGCMBC.M.GNOFA 2LCDHKB.JIBDLC.OJDEMA.JILMLIHCEGOEG.MCAH.HAHLKCHDFCGL2NCNLHMNFBKOJFID 2ML.FKCMIBFBCMCDINF.LOJBCGOECOBEKCEH.HLI2OP$PFGMAMJ.2GMFIFKHOCADKC2J. 2KOFLBNFLBCHDL.LOH.KBF2OFO.DFLFBLFBOAGFNKC2BMDMGMFDGAFAHKIEGDGCNALCEA HLMDOFJGODG2CAKCBGJMB.HM.OKFGMGJKCGKENABDK2.CACDABDNHLN2HKGJCG.LMDJMJ FAH.FKBFA2.BLKLBDB.KH.2ANEHJG.DLJBIJEBOCMICG.GBC2GBLBG2J2FLNDOBIDFAJO C2DLNMCGJANB.HFNCILFJGJP$PEBNJMFBMNHMHC2EGDJ2DL2HBHIHJBELOFMDLHDG2NCK AFNMGCDMCFNJHNB3HGJDJOFH.K.JINEDEDFEKBF.NCLFINCIM.GIDBJG2DKCAFKCGOK2N KNCENFLAC2BOACEJDLMFCHDHN.NKBNMNCJMFLOMBFNGDKI2A2DBDJG.LAJHM3.FLFDL.J IGAM3GK3BODEAHIEOBEOJLELJ.BOHJGKDHEIANBJIBHDCDEOGFCGJAL.LDBILAEIAGEGN P$PAJMLDBND.LMN2BK.KN.HB.IJOIOLGA2E2HC.IFGAFIFLOJFHLKEID2C3O.NJMLN.LJ DBEMBEMJHILEGOJBECBMFN.AILIGKDGADMG2IADECLGKLBCMHLDMKMD2.CIKABKNKIHJF GIKOKJOD.IOMEB.ABCKHI.IMNJOHCGNCLFEBDMBKENEB.EDOMCO.C2MIJK.CO.HGOGH2I LOAEDK.J2BAKFKFAGALMLEKJDKHB2HBEHGNDOCGIFKOBGHEHNP$PF2EIJBMACFLOFHFBL KNBKIKIMEIJH.JIECHKHKGMGILELEFLJGF.N.IECKCHK.JLFDIAMK3BKFA2HIKLKFLHEI OFO.2MCLNH2LDAGK.HGBALCLM2FJGHBHLAEAIBCI.NKB.NDBN.NHMG2EINLENBGEAMJFA B.2LOG.HCAFCFBG.MCHID2KLJEHMLH.D2KGMDGMACBLMFJGIJ2HEA.EFNMG2CHNFKJGHB OAFE2KDGJCGKJELCNDEJHIKNIF2OMP$PDMAHCIMODJAGF2H2D.EINIOLBJDNDFGHEKNF. NMIKFCN2OGOICNHMNCOICF.DIEBOLMCGMOCAHLN.FDGACBDLOCIMDEG.HDNLC2JGLFHLH M.HGOH.2OIDGDEAHMKCMIBMIMHCMFGE.H.EAFICBL2GADCN2LJGHGICIFNCHLAGLELB.O C2DNOJBO.INDNGOIJCLEN.2BOLGDCADNJOF.IBJDNKNBNHMLGAFABDHFDCLMHFE.DCE.J DAHELBIAOAP$POCF.KHINOL.DABMLDLFIGAMOBNJHBGIONE2BFD2NDMIGJOKGMFMFKCA 2.F.DKMGE.KME2CI.BKELODKHKIJOMCAGIM.JG2OC2NE2DE.2LCDOH2LIBIABJGHNLH.F KMGCNINKINBEAE2ALNM.HCINOADJHLA2OIJCGABAOGOMINI.FDE2L2BCGFKFOHCMCO.DE BHIEALOF.NILCGK2LDJKLDNJNGJNFJGNJHLDLDLEHEIFI.NJI2D.CILDB2FIBP$P2ANL 2KAFOKLFGJKE.DA2DN.IHBFDNKJDFKMBMHACNK.OAGHFJMNMJMEFKLKFMO.BJNHDIAEOG HI3NOEHIBKFABIKNICG.CEOKDEOGKJINFI2EFNIGHL3JN2LJ.K2ICBLGLAK3CGNAFNAIG NKJICIOKJHO.GMHCDG.DFJCANAF.ADMI.AMJGKEKJ2GHG.JBMCAHJCKEBCIHIGKEAE2NC NHDHKLGAO2GDAHKNMFIBMAN.EBNB.NKAMA.GDHLDP$POJK2AGNMHJAOJHNJ2.OCHMHG2J BFLOKJELMHGOKOJEBMAMF.A.LKMG.JI2MGNGLNB.2LDEBCFHIMHJLCNCJ.AFBKCMKF2IM C.LEBFDNBGDODMDAJINGEGJCOFGE.JKHDENDOFAJMFLIHFMGECBDKO2L.2DE2OBAKLMBC F.2F2BGFOCNCBGKMLEFCHOGJBOAJHFJFHBCML2HAHMDBCF.IGDGN2FJB2DBLCOGLAJLJA .ADOEFINMHIHE.NIHIGJKP$PJKF2ODADJMNOGMJ2I2LOEMNDJBLE.HLHFH.FBNGHLILCE HEOE2MI2KMLNDCIOHA2NECOAMOAHIH2OAMGMEJEBACI2BJBKILK.LA.KMG2JGLBA2CHJB KGEKBKNBJHD2MDLKJHDH2KJCLNML2KNEK3HC.GMKNHF.JIOEBCLNMBFLDMIKCALHKLHC. HFGIKNJEGOFE2.ABOFONDHBH.2KCL3JH.JODFKJLADABD.GHAKIMBKIFNIJ.GDKHGLC2L P$PHC.CMELKF.H2.NOGNFECFKNBMNF.JBHMNCHAIFLKBMHJBENEHNGKACFGKIBFNBHEAL A2HDAGJLMKEDMBLK.MHCMBMIOMBILKBFKJKGEI2HEJAFJAFDEGKGKEBOJDJEAEHO2.FBO EC2N2MHM.2HOAJHDMOHDK2OIFOBOFMAIFAGF2LOF.CH2OFIBNA.2LIA.HNONHKNDJNCKN EAKOCDMHNILGBHJLFMCDCFGH.BL.KNJNJFDKHJO2F.G2OLAGM.P$P.2DJOIOKNCADLDCM KBAGFBLFAGFAMGKOMGKG.J.BGBJI2OHNDHNGIJGIJKFG2HEDIJBGMBH.ICMJIEBEJCBOF MGAHCBEMN3LF.DFJAFMHKGOBALBLBA.DJ.2M2JFDINL.HN2EM.BKG.HGOKFBGDADN2FLI N2.2DFDM2IGADIMCHO.OJOFDAJ.LJHE.NKBFE2KDHKLEDEMEJIHFLNBIDG.DN.EODHJB. 2I2JDHKHKLBHFLDHCOJHAODHDHJBJGP$PL2DBCFOLNMEJKL.MCACJK2JBIOFEOIGLCD.L HEO.HKJLMCDNKCDKMBLEFLGFMKOEK2ECJE.EJGKHFHFB.LOEMHLGJCBFH2KMBELM.OECG C.BJAHOKNIAKGLHEGKEJLEJIKIO.CALGOFIOMKD2AEBABOACIGFAJDFJEJKGBKFIB.OBF KCGFOBMCFOHIFEKAMCGMNJFIGJLHAGN.AECJAFM2LIOIOGL.LNGFEM.K.2F.D2FCD.EMH OHFGKACMNDIP$PBMKIAGBHJNLHNGEJLALDGDEODJLIHNKBNDMCMCB2FHKD2CADOF.NA2B .FLKCHGAFLGHFJKCMHILDNJEDB.DKNEF2JMJH.JMDIMO3HAC3AD.CGJDCEODNIHEHDA2D HF2JMGLKLJCB2EDEIJMFCO2JKGFBIFJFN.E2G2L2KHCKEAECO2G2CI2KCBJHIEJNOBFJ 2D.EHCAIBKJDJCJGEHNGMDMD2KFACGHLEODJE2O.CBMNDLOEFLKBLMHDFB2FP$PMFEOAK FB.INAOFJDJFLBEDB2.CIKI2OMKHNAEMJ.NLDFC2B3CLHIBCJBL.JLMGELHAMKBFJLNMJ DMKGJNCNA2IKHEMEKONDKIM2GA2NLO.MBEGAFJNE2.MCILHDJGDGIOHLN2EDNABH2ED2A KLIHIA.INICLN.MN2IOGAKJDHIGBMBN.C.NIJLFCOCDEBLNHODGL2JD2I.DGM.CGL.CGD BJOFN2.DAIGBJEKCJIG.HENH.DB.GC2HLF2JCHF.P$PJBKBMCIL2MKDMDKFIB.EJOEMHD BNALBOAOHDIAFAGINFLEBD.JH2ELIGDCINKFAHIGKAMBL2MJG2EGKGHDNKCMF2MKGF2GN LM.EBGAO.N2EJCDKHJEODILKIA.OIGIMAE.DLJDONOICNBCOAMFL.BH2KGLI3MHEOIO2A 2G.A2NJ.LDF2NAMIKF2INIELHJ.INFNOFJDJ2.JDJBHF3.JGBDIOBFDGK2O2BMHEMGKOE DGEFLD2CEMHONMLBIAFP$PIHDEL.FNMAFONCGD.FOMB2DNF2JIAHM2AKALBKEOEHJ.CLF AMDJABFB.BI2EJLDNKMGDNBJKIGKD.NGI.KBHBIBF.LEGAIO.HB2.FLOJFEMAEIKGOB2E BIDJADANBILJLOC2.IJOAD2KMELO2DOGI.ELC2AIHM3.LG.IDOIELOFHCDANJIFINLIG 2NCKJG.HFNC.GIBJMC.IA.ICKA2NKEOLIGABDLH.LNB.3MOFLFHOICHGAOM2DBHM2DGDP $PEIGFDNC2AGLMDEI2GJEBC2JCJ.HDIOCKEC2GO.MF.KD.IG.HL2IECNGJHG3B.MBGIH. J.M2FAGD.HK2HMANBFOAFKECKCH.AB.JGCJAMFBKIGDB2OBGI2CN.J.IFNLEDIJEDLMN 2MK2JE3I2EOGBCMNAFH2D.L2FKIJ2KO2DBICLF2BFDEMNH.I.DA.IJGLKLABHCJKCMADL DECEIOC.E2IKEFOGCK.H.BHDICFCBGJBN.FBOE.L.2J2O.DBP$PK2MNLEN.OCNHAJAKA 2ECG2K2JBO.BKNDIOMHKEGKI2BCADICFMLMFHADFO.EFJ.KD.LDABAJD2M.MNOH2GKIFA 2EFHCG.LFG2KDGCB.J.HAOICEF2EC.JCONJLO2EOIF.OCMINGCIBFEOCLMNILNJFGKI.C KJO2K.GFEAODMFLILDBLABLILBEIJ2BCGA2OJMIB.NEHIG.NDGJDHI2DKIONOJAJKEDBN EG2NBMAICFBOJFM4FHBFDAMIMLNEP$P2GCBI.IOCEBJIAJNODJKNJHCLOFNBJMJAOMCGB K.IHDEIDEBFLHOGHFBGJCLOLGNKFAJNF2J2H2OGKIFHCMLOHDHBM2LEKFOKF.ECKCIKNB H.DAJBOBLJMK.2ELD2HANGH2EMGDFLMG2OH.2CFJMNLJDJMHGBFJGADKLEIGAOD2CJFEL NKEJFJFMGEFINAI.BJAJALBOCEO2EFNOI.JCGDNB.CLIL.KFAEG.E.LDCE.EHDNLEHCH 2DCEJNBFEKP$PELJALEFEG2IM.MHLGHJGONBNHEH.AOKLIAK2AFH.KCNIH.DNHNFKIOIA EKEJGMEFMIBGNJOECOKL2FH2DO.EMOBCEHKA2OFDACH2CLND2HEMBO2BHDBAMLO.I2GEA 2BHN2BAEIDAHABDHIOJAHMJKOBG.FEFCBEL.2IKBGNALBC.MCBAOILFBEMBMAEOBEOGJA KGH2CA.OIAFNMFHFNHNKGEG.CAJLCEDNIMN2MFOKHMN.LNJAD.CLB.JNF2OCP$PCEFOFN IONAJN2CANLNHIJAOIOKEBJHOJIANJLF2ONJFLJNKBJEKAHALHBA3I.EOBCLJOHAOAE2G OCDOLFAC2JDLGOEC3GFNDMD2NCEKBOHIBMDJGAHDICBGHLM.HD2BD.JEGK2H2DFICHDAF DFOG.MIJE.KFNHO2.IAM3HKAMC.MEOCBKOICEFM2CDADGKMLBOAIOB.LDOBM.G2ILBCMB NHBNEHCJDHJIHFLJDM.LH.LDMEILGDKENDECBDP$PKJEDGMJ2CAODOECHDCOKECNGKFNG H2.IOCIKDHDBDGKMCOMEJODL2G2HOBJALNEN.KL2BDLGCNMO.JDKMDOFAGKECIMALM.EF CBCD2LNABKNKLBGBMHGAN2IJMCMKOGBKELNGKDJIEKHNCLJ2LGNDF2D2JMOBNG2BIEB.D FANMIJ2NBMHCJBILA.LI2NKJKAD.FEBA2JME.NMGOM2CFBKG.MG3HNCDHBOEMDA2.EBJC BONMDFIFH.JKCMGJCAP$PKOJAIBIAFHLKMAIBDLJKCJ2D2CME.2GBENAMA2KNM.GINMEC IGFO.ILFNDFLGMELMFK.2BJFCLMCHFJLDNJ.NDJBFGEO2.LHAJ2IHOID.B2IGIMKBNDF 2CLOFNJGDIGAJIBLGJBALK.NLIEHMGL.EKBOEAFDAGOJEG.EDL2OJGLIMAJMFOGN2OHO 2LIBA.ELHOGDA.LMGCI2OMKN2AKEANMAHE2CKD2.CG2HFCHDBOAOBDB2IK.NJGCBDAKHB NP$PDLNIAFDOLNHGHL2OINDNKLIB.KOBLDABMJBMKLAIONOMIGFNKB.MJCNBD.JK.CBEB 2IGJEIGLG.MDKCMAKNBH2CKJ2N.JMHLNF.NIALHA.DIOAOHB2HDH.JFOLHENOKHEMEJ.L JLF.AGABLOFIDM2NO3HMOG2KFEFGDLH2GBFA2N.NIE.MAHAENFNLCOEADJ.AO2NMEDAHG NEFJCBHBE.K.3GI2CBHDLKMFIGCIANJBLDFLEK2OJKOFCH.GJP$PNFEC.GFAECGJOACGC DOALCOEKLBODFGLKDFJNOLE.BCO.JLFDJOBEOCHANDNLMJIO2J.KJAK3IGCI.KDCIG.JN JOHLDFGNHDGCD.AOJCHN.KJKMNKJCA2LEKJNEK2MELGL.DKEFGLBLJEBDK.B.J2DHIEFB 2DF2ICA2NELNBDLENEL.DM.IANABKFAKM.MDMG2CFKAHIJ.IGLEAECKFO.BCFD2MLE2LA CI2FCNCGDA2LCKHO2DEMF.ONFKA.GP$PIEAB2MNAB.2NAC2MGHIFGOEGDMCM.EC2LHAMC F2LAICKGCKLHGHFBOE.EGACMHLF2OG.HMKONABIGHJL2CNCM.2A2.GCJB2H2FAKBIB.CI AEIOE.ILAMHFHCOANFHNIAMOF.HDLMIG.HG.IHBE2NFAEHN2OBIGEMJFEL.INBOGKG2IC ID.HEFDCKMBIH2DFEAFHKDEBHLOF2DC.KBHFBDCEN.NCKDKBDGJCJK.KM2FCGOAJBODOH DHAFHAFBJKP$PODM3CKLOIG.MAFAENAKMD2ICEIJIHGAHEMAFB.CNLJBNEAIELFBIHNBN LAFJD2ACONHLAIKLFOJIDFKOJADAMOJ2MA3.IOF.CID.KJDAECOFEBNEGF.GFI.IC2F2N CG2LHABKCDBG.JOMAJC.AMFALBEKIBNMIA2ONAGLBHJ.ALFL.LBDGB2O2J2M3AGENIGJB ELOMJGJNDCJFAO.HCIHBAK2JEFIF2CNCIHABF.AKEBOIODAJHEOAHCBADP$P2D.H2.HBH AGHBMIDJKINLMEMDNFCHOFCFEGEIEMFDCNDBJALJFHCDJIHCMCNFDHBJHMEBMNKEGIE.A ONAD2LOMBDJF.FHGJAH2M.GJN.G.CMEGK2N.GF.NLNB2NDBFH2KJOGB2IO.EMABENDJBA BOEMGLJDKDCNJCHFMAFCEDO.FHBNJB2HGANFIGCAONC.GD2.JNFHLMAG.MA.CENMA.HIH JHKMJOGCNBE.3KH.GLIC.DBALHAIEMNO.M.KMP$POICNONGEOJKCAHC2EIBACOAMN2BDA F2DEAKG2NDNJNIJ2KI.EDB2AGLEO2GMJMNLCNBLHOKEINCMIOFAKL.DJGAHDJCFAJMOJD CJDNIFNDLK2L2HAGNHENFN.ALEMOJBHOELIJE2CDO.JHFIB2CBKLCADGDK.FB.NACEGMA NL.HFEAIO2KG2CINC.BD2.DKIJGKAIKOD2FEGEN.L2NK2COIHJL3HBGEOGOLAKBH2FC2I BLEDILCOLHEOAJCAIP$PHFC.GEOELHDJD.IFAIGCBNJGJCKAOAMEJDADJGDOIBNCGL.HK I.I.GKGL.BLGI2MJFA.GLNGDNDOIAIODLOCFOAHLGBMDHLJ.EDBGI2ONK.OHELNOGAOBK LCAECDNFODFJ.OGJCEODJKDF2LOAM.O2DLFLNCK2BOHLMCOJH.CHE2NCKCN2ANIM.LND 2NLALJGBNKGBEKNE2HKDNGJHL2AMIBA.GMAOBNLGEFEHOG2A2GMHACFKONKBEAFKFDHJP $P.IKEGKAJLK2BMFMALBDMCDJNEOKHDCHI.LG.NJAIDEFOACOKBJKADJGBNKMBJOIEIHF 2CJ2IDA2CJFADNFA2.EOEKEIA2NGHLODMNDHAIBNGJKNOAIF2DE2AHLFAMCFGKHDHFGHO GD2GEFGF.BLGJ.C2.HCF.GLGI2FG.EILHEHCJK2BMDEJOADGEMCJNKGO2HN2CHEHEIM.G AKNIMK2MFAG2NJHJACK.LBNLFOCMIKLGAHCLGMIHAIH2BOC2DP$POBKGFEFILOAIAICFA BN.KCFAH2JMHB.KF2KIEFGF2BO2DILFHDFKACL.C.AKNFHJGOE.BKDACO2CJ2ENAEHDCD OEMAOEIEJANLHAK.HFJOKANMLNOLINIFGM.H.LBLCKOM2IDAB.M.AGONBHNABOLGL.HLH .ENBCBICINOD.H2DN.OA.FDFOIJLHM2JKLJC2GKDMJ.GAOJFJE2BHB2IMGHIHIGCBL.AB JDGFENGLEHDN2KCLCHEBDH.I2MHGH.P$PE2JH.GEBNHBFK2H2OGAC.LKBEJ.LAGLFNA2M HGA.KL2E2.MHENK2ALOJMIDHO.B.EOBFC.ODAODABJBNHCHMBACOHLF2HCLOLDMDAJKCL FHOGJON2J.E.KOCFCJDALIHFEOIJ2KJMINF2LBLGEOHBEFCH.HLOAGHO2JE.A2HELAOJO GHCLFEGFMA2NIAHKNOLM.NJDHCMBFHIKHGNFMAODKBL.AMHEODOGNDNBMJDJDN.OIDNHE JKFDKILCABIP$PJ2EAK2LCM.E2HDMENMEIGEOFEIDGADAH2F2BKMFDLBCDOA.COGACD2E G.C.JE.IGCAOCEAM.BDCJEHADCIGC3.C.LKMJCKH2NKCI2LNFCLBGNFMLFNJLGBABLBGE MADBLANIEIJELFDACOILJG.JAM2EABJEFGFBJLGK.DKNHLCEBJHO.M2L.DJCA.GMAHMAJ KLCEOAJGHK.A2INCFCFKNLHNHMEOMLFOEBDFNMBNFJIENEOGENOFMLABJKACP$PBMFIDC NCENC3L.LJDC.OAMONCGJLFLHMO.ONAKFNGILICBN.BIDNDNACE.IEFGKOLAMC2HO4D2A E.2JHJOJNDIDECB.OHCFGNCGENIDNBK2EDCDMCF.HEFOFOHMA.ME.GMN2GBOMONEFG.CK OLDGKODMNEFDELDLBCB.ON.C.2AMN.A.KLHMO2IJ.OHJADILNCGFLJK2NCNCIAFM.EOBF .HANK.EAECELDF2HDHOHOL2BIA2KHKAIGAKJKBP$PFHIML.NG.H.IH2JC2IMAI.AGFMLM OGIFKCLJG.HKDKNMKL2BMHMDNLJHCAIBJBHJC3LABF.NGJ.BLC.BD3CM2FIOALEA3J2B. GKIFB.G2.J2LD.BDGLAGN2CEGHJCE.M2CGFJEJLDKCHFHNBKBFLJF2NFCMA.CHGLK.J2E BGEC.BNEFOCJACFN2GN2.J.A2KJIKCACODO.JE.MKFCDEDGA2M2K.BLOF2DBIALJFOKBJ DKAOEOKN2JDBEJL.P$PAMCKEACGBKNJCLBLBCNHDIHJIDOCEME2CHMOBKEOH2A2LF.MFM L.FINH.IMAK.EGFBE.GIO2LAMJBDFH2AOJCBHANMLMLEOH2.EKC2HJ2KO2HOGE2MEKFKD CBINILGANB2KIBHCMHCN.AJBCMGHDFO.EMBOA2.CODGOD.AEKEKC.3ODKOIJDB.ALC.DN CEMGAFEDOGHIFC.A2OGA.ICDGKBKGKLJMICLKHFMIFJN3LA.LMOIAF2DMJLABN.AP$PNG LMJC2GMAKGODFGBKGKANEO2AEMN.CFHAKOKONLOGHFOILIE2.JAC.GOHKFJDFMCLHF.C. GDIO.NBFGLGOM.MLHJLB.ECLMKOJK2CM2DIN.3DJ2MIMBA.EFJ2HOMNMEO.OFBIEHEHCB MIAEG2FICE.MKLEF.NGJ2FOHJB2GMGA2O2IDCGKBDHBCK.JFHEH2ENELGDFBJAJEHLI2J MFBNGLKL2IHG.JHGC.KCDGIBNMCNKGKHEK2OJLAFAMCLP$PBNDEG.KCENHL2ND2FHIMBD KCNAG2HEIBKF.M2A.DFDKHCIFEBA2BELKMJ.GJCDAFK.DNIEDLJND.BNH2.LJFEO.FID 2IOA2F.CAD.ACFKEONDI2.2A.JGAEOLMLDJGAD.2FKNAFJFOJOBDL2CHFMOJDOMLAHGDN B.IO.LMOAGK2IENCDKNODHG.OD.GEKGK.LACMBJHMLENJNAHMBCOKMHDFKFOHNBGAM.BN AGLEMCHFOINMKDIN.EGDBKG.MIP$PCM.2J2ML.BCALBMI.CFOKHKEHB.HINKAHIDCKEND IHD2IED.DNGCIOHAGMH.HKGLKGMFOELFG3FBG.DMJDNKLOIGDNGECMGOMKIKAB.2NB2OH DGIOGL.CBEJLOB2KGNAJH.DOLK.KFJC.O2DB2KFCAJNJNLOBAICOEMBAFENGELMOCHFCG 2JBLCOJDKOHCB2ENIML2AH.BG2IEKNMD.DMKMFGCBKEB.JEMFBM.HACOHIBMLKHOFHEJE ODEO.HP$PFDH2BAJBLBAFMNMEBAGDCHBGNLHGNAMGDAEKBKNENEJFKIHKLF.2EGCBJDKH IJFNMLNKGHOBJHKJ3OFBJL.LJH.GJ.K2AK2.O2BMOGMHLGFHEFC2NOFKMN2CBLMEMHCK 2GKJOJKDANKHGNIMGAID.ONAKJHIOJLK.F.LOFBJAD2NK2FGOHACOBEFKNHNIKNM.BAIG ENBDEFIGLA2EAFGCBJM2HD.NOI.IAGDNLKGBMLM2AD.ICOIKH2CEJFJ.P$PG2JBGABFBI GEM.BGEDAKGEKJD.ID.N.G.KFCMAJOK2NA.AFBHIDNFGDNDGDMBMGHN.AENGBAM2DHLEB EF.DJOFLH.OIMHGMKOAHMFOFI.E2DMFCFBKLHMADNKNHFGLAI2EDHLO2NBGLIKGEI.DKE HCMFNHIJNILONLIA.ECLKLEBJODKIOICA.GKNICNHBLJEAJOFAKCLBEGKNFNJONOFEGJA EDLNJOMOFHFCIHA.KJENLCOJF2LCEDKJKIDKJP$PKLGLBKEJCGLGHJLOID.FIDAJBDCMI .DGOMAJ3.GLNBOFAJMDFE.M.EKJNCFOLDL2CO.KNOLKIN2GHLAIMFHGIAGH2F2AGHCIK. OC2OFKDGHM.O2GJGFCDCB.BHNHDOJNBF.IMDLFOLEAMGM2FCJALICGCEFBLNKJDNEIFGD JF.EF.FDEHEDGOJA2IDMOENLEJGI.GNKGACJ2DMEG2ABLI.LFMNGIE2FGJEL.K.ND.MNL ONMAENEIDI2BMEDJIP$PJBEJD2EMBJGLFJKLJLHIJEKMEKFJCJGM.2JE.AOMCDBNO2AHM DGFLF.MCBCOHICACKH2GKDKABK2FBK.NGHFEBNBLFMANEI2MGLNJM.HF2GFMJKAFLGMOM IMELMFKLFIGCDLCL2NOGKIJNDBHN.HNENEGAE3MCFCLKHA2.HFCM.2OEFJHFIN2OLDFMO ELOIOMHNG2OJHFELKGLCHGF2OI2HKCNIC2OAL.EBGFEAONFGDONCNMC2NFA.B.EIKOP$P ALGIAHMLIOADB.IACNBGDOFMLDKNDEOKN2MNCFLAHONG2I2JGLI2B.D.JCLKFGHOEKIMO ALBO.BGHMCBOHKEMDKCHANGNFNDJKOI.A.CAMCBIDF2IDND.HLADJMAE2H2DOJEMGJCEC FNILBD2JCHNE.OEIFKELDAGALHOJBI.DFKINJ.MDBACGJ.O2BOJEDO2ILIJHIAMGCLBA 2FDB2LBAKDCHDCEOICLN2CBEJH.BHLK.2DFGMKEDKLAJAHCKP$PECD.GJM2DJEMHKMC.H E2DMIEDBCDFCAFNBJNGFAFG.HBNOHICACDGMGJBIEOJILBGL.CAJDIBGJDFDKBK.AO.I 2.OHAOLIJA2CHMEIGHABH3EMO.N.IEINDFN.A.EIO.CFNHBCKLEBHKABNEGELIKC.OH2O 2L.ECEDFBODBMFJNMEJB2OHLM2.MGICHMKBDKNCNAEKMHGNED2.LCJMCNON.HI.OHA2JM 2HMAKELHKMGHJBEDADHNOAHEDGMC.P$PHINOG2LCIG.NJHKCEJDNLOIOG.2EBG2M2GF3K ICBKCEDFMHM.ODOJGMIKB2NECGM.MBAKF.2ONDGIKLHMJ.MACLEOE.KDEMLMILBO.2NHB NH2KLOCFOGFEKJNOEC.HOBC.MGHJOGOAJBHLO2MHJ2NLFNKHEJFMDGEL2MCOJBHAJ2B.K OCFHGKJEJK3MEGIADIJCG.MODLI2B.OMBGFAILNMOID.GBK.INILCGIN.DIEBGDEBDAIJ BLGDHLFLP$PIDCID.KFBMLOLNONEMCHLF2.IEOGCGIAEBGCLEF2JK3NIBAFBEJH.IMOH. EMAFAH2LIKOMNL.2CJEJ.EJHOCBJHIFABIH2BLOIGLGDAGFHNH2JOEJAIJIG.ODMOIEDC HKE2BDHMDOJ.2BN.HFNMJCI2EJNGN2A.A.JMBHFCOADA.CGLKDABGNBABCFBNGOD2KCOM AGBMHKIANLCNKJAMOB.GMGEIFKOMJDBELILMNIBI.LOELI.HGHFHLMOFAP$PACGFJ2HLH CBACNHB.FIKNEKLD2MHEFKMNEO2G2JDOCKEGM.CIHIAEG2.JMFLD.DHDONEHLFM2B2OAB GJEGJ.NMDM.KCNLBDE2OGCLJCDLE2ILKJLOGNJLO.KNEHLO.KF.KC2GMKE2DCLAJALNMH JKD.FODJFOLCNI.G2F.LGHMOAM2IFLFKONOI2FJLBIHIEHFKEMAOKEAJGMOGFKHI2GAOD CIHJL.F.CEBD.CGE2.CLOLMBC.OJIHOLEHCNDKP$PBHFGKJEJKBEGCALMGACDAGJAENOL HJFOAMJKL2MCKBCBOLICHJIGNAMDAEGN2EF2COMAFDCJLFI2G2.CHJNCHANMKEJNEHEFK 2C2B.EBOICKN2K.AGLFEGNOIKLKDJLGAOLMBDFOMKDHBMBCFOFEGON2I2MIGJANICBIDL .EAKFOK2EDMKJEKLNEGOF.JMDADBHE2AJHKNF.HLHKOFLNL.FKDLIKMI.A2ICMFBFCHEA H.IKBIK2NB.F.2JBIGIP$PAKMODM2DEBDNEMAKIL.FOFEHOKO2HDCFKHGBNOMFEAIL2EJ FCMANMGCG2HDIHF2AJCFJGMEG.MNFJMOFMDJABDIMGDIHINIEFCMBEHMGMH3BJBJBDLMC OD.CJEDKHGKL2NACGCKFELG.IK.DNC.IDNE2GD.IKJNFIOCKBFDHFGEOGBH2FG2IAIMKA E.OCDGAOM2HOD.HEDIO.JH.OGCDI2ELDJFB.MEJGDBAFGO.EHK.IBNMNOBHNMC.HEMGFP $P2IHCEA2BJCFO2.KHMNIFNLFNMCDAJEAOGAMJDIHONLEDKGMNOGMOM.IHEMLO.EJL.2O MO2G.GDNH.OEHLIDBG2IGDHONEKNKD2EOM.LDGMFOJHKHGHMNFDKCFKHDNCLEDLEFJEND MDIOBNMELDHCGL.CDNOHE.C.IEGI2FIJCMODCG2E2.IE.FDIK2DJF3JCDAJNC3H.DLDLK ANG.NL4M.GLJNANDJBGBE2KB2HIGACMDJHI2N.BEFEOLHP$P.GHKLICLEACLEOHAO.MK. HJLNGCHAGHBHJ2IFHKEJOLKOBG2LHEJG.AL2MJHL2CEFNF.D2AH2MEC2GJBOKGFB.BLGC .CAL.IMEAIMNOH.CO.BEALCDHC.C2GECNDFDBNHNJKOAMA2BIK2GNH2JCALHCD2CALOFM K.EJ3DCGCHFHEGMOMDLAFECLJKDEOKEHBLEBF2BNMDGBNLEOEFHF.E2ALDLFANDGC.OHI EC2GJCMCHKAMBCIGJL.DABNEKP$PDOKOLAJIDCBCNH.FJAILKIHMAEH2.DJHLKB.HGFG 2IMOIDGBLFM.AGAFGCBKHMJMGOGMNEKOFEGI2JIM.OLBGDHMGKDLM2BGLBO2DKLFBDCBF DINKGJEDKJMHM2JGHAMHJLINJFICFJIEH2EIGMANFLMBGIGDEOKNOCI2.G2BF.AJFB.OA HAHFG.2CIMAMLOFEDFDBNE.G.HFENHM.FCLHJDHOGI.LIEFOH2J2LOL2BDG2J2HJBGECI ADB2AOKP$PGMHLKAJ2H.3FKAOIO2KJBMAMKAKBOIOLBIHNEDFGEH.ICDELMCGAEFLHOJA NKMNFMLOGDIJO2DCN2EGMIDAKJLBDLMHDFLGBDO.J.BFBN2MICDNKE2IGINGJ2M.JM2HM OHKEKMOMEOKH2KDC.2MDE.DKJIJGEKIBENGFKFK.BMFI2EHEOHG2O2DIED.LAD.ML2GIC ANMCMBD2JOKANEADMCJKAKEHGLCJKBNLCNKBG2CD.KEOMALN2E.CGLALP$PMG.BGMKCDO CJDJFCGK.CHGFOE.DJEJBA2I.DNEBDCE.A.CKMHMEMDCGCKEIBOHKIJDLELBH.2CHCGMF M2H2DAGCML2E2IAFO2GEMIGKHCBLNKMJEC2AFMJMJIFKLINDCFEOJ.2E.CNKMBODHNKHD O2KHFAFEKFEBE2KLBKFLJAEJG.MNCGBMHL2CNEMDOM2H.HJL.HJGFNOMKCLGC2FLIHEF. N.MCFJLHOLKOJKECHNAOKCMKBGJEBKCFIDOKFP$PEMFI.LFELHOCNJ2KNAHDGNKEIDKBD KDOCBLHCLIMC2MF.GANJAFM2FJMIBNKDJCJLDOH2JMCAFE.HGAHEO2FGNMNKBFJLEGLHK .MNMBOKLEMJDGL2KBIEC.JC.AI.GID.JDJEDFLNIMCMECNIKE2GIMDNKA2IKBOBHE2C.A ECIKJIDBCDCOAK.NOKGFBKGOAMAHIBGCJCEHF.MOGDIFICECNBGOKEOHM2GCGKOJ2CJI 2ENF.LECL2DMHJ.MKOEP$P2NHDHEACNEB.KIHGHGICIDLCK.FLOAOLF.EKMCA.LDOCDGC ACEDIDLFLIACFLKD.OFIFNJ2HNAGCJ.MIDH.CABOEJ2CEM2OJCMO.CJNFGACONDHFEIG. IOMIFIEDMABFKFBO.DCK2BEF.ALIJIMAIKJOFNLFAHLNDFLO.HG.INLFLGHDAHAHLMLEB IHBGAGALBHKC2.GJ.AONKHIMK2HEJFOMGLHD.HF.2LIHCLI.EI2L2KIEJMFHOFINOHBLJ P$PN.CNKHFNFBOFODC2MIGDGNOCHKC2GKDKNGOGFDMHIALA.MK2C2KBEBHOMDLGABOMBE MEF2L.2G2DEF.MGAHOFIOCFO.AOFKN2AIFOL.BNEFCGJA.JDJO.OAJB.LKDLJKLBMAOMB CELDKBMJHAMAC.HAFJIDBCHIHABJCHKF.JOG.OKABOM.ADIGFNGH.ENFD2.ABMCGDHLAE OI2MKBMOHKHELMGNFOJKMFCGNM.A2COGNGIF.DGIDFCNHNHOEGP$PDGIK2DFNOKOEHGI 2HAJDLIEDJNAL.2DNO.C2LNMNFNEKLFEMCDLGLKLJGBHNGMEOMFOLJ2HIOIEOHBNKFEGA G.JOGIAMEACOLNDANHCOHINJOD2HDABMGAN.OMCILIFLJLEFHMCAELC.L.DHEA2HIKJDH OAOIEN2GKIDOE.2KCJCH.DOBAEKMDN.IEAL2HNGIBFOG2F.CJODG.DNENIJCEJEI2EOFC 2KG2CELAG.LAO.ALMJO3CHJ2FDODLEOP$PIOMAHABDNBNG2NFHNFG2CIBG.HMHKOAEBH. DKH2IOKJ2EILICJBMOJGKFO.AIBNMADHA2N2L3OKNLE3.GCLDN.LIEOCIJCFOLHA2HLID IMGL2NJKHNJDBLHL2FEACH.FIEO2NF.AEALDFIGBIMOELFBGJBHLMNCKHLGMHBEMJKALF AEBHN2GFIE.OJOEHAOB2KIGEHI.KL2KOFCBCEM2.O2DIBKOJMO.LMLDOCDLFMD2HCF2KL GFENKOAFMDP$PNBLCNAFDKBLEOINBDNAOGCKBJEJMHABI.EJDM.K.MAHA.IFJO2E2BIA 2IGFJIBI.N2FNOFCHGJLNANFLCFOCA.NOGLJFEFNHENLBAKEFAFMDIGEJMBGFJCLHAMLE CLKOA2NGHFNOIG.K3GBEOD.JELICNJOEMGACABJEIHALEDHA.OAONGNEDBDFI2BOGAHDJ 2NHIOLFHFAC2LGEKFO2DNCLG.FGHKBNHABEJIGLGBOMOCJOGNM2NK.FHI.FMP$PJENFBL FBFCFOJNJIDBN2HEGBNM2DNCADJFOMAGDHAEKJIJIDGJ2CEBEFKICMHJBJHBJ.MN.HDEL GEKEFJIH2GNLDAIOL2BA.NFEKCNCMDNCI.AHAH.ABOAIGEJMLCNJEDF2EJO2KODAEKDLO HNB.E.CL2GD.AHJBGAHC2OAD.BA.OLIBHNLFBCMNKNEJDADKAK2FOKFJBF2AN2F.IEKIB DJMNIMOKCBNKNF2DCICDOIB.MEIHN2DHNLMFOAIGAP$P2OAH2IFECKLAILBOGJNLDIA2I KMHIL2EAKNEFA2HL.OIBFMAJB2MHFBJIJE.HEJB.JOLAEJCB2COLHNMOKNLMCH2OJOIBO 2LE2FNML.EBF.2OL.F3ONKEFC.JLOHONGKE2LANAJOICIJLHNMNAKOADJGEGOGF2HMFK. JMABAJCMNMOMLHAIBNF2DJGFLIMNGF3EFGBJOBAIKBFINMECJLNANALDKCHN2AHOBAH2A D2CLIF2OCAIGFI.MJOCDP$PJBA.H2IHGNKGDN.LKBGA.OK2CJABHMCAGOLJDGKCLEO2MA IJO3IKBHNOHO.MOANJLDF.FA.FAMNBIJKAGKHINBCMBMEJKGLHGECECGNO.NAMBDCMD2. 2H2AGDC.K.IF.FOEGK2DINOB.2NFEHC2JBCGH2M.BDE.B.BJHC2LGB2LOB.2FEGCAMFKF E2CMK2LNF.ILDCDLDAOHOIJCGECMHMCAFELOCFIJCEKJKICKBELINIMJOCLH2FB.C2JIE P$PMIBOCDNMJDAMKLCKAIC2EIL.OL2CBGBJAIMKNKJMHJHMAOHFIDMNBAKFCBCJNBNH.G 2BFHCMCDMNE.G2ILMFHMK2FGJ2B.DNICKMA.I2JGKMCDL2AKLO2NFI2DOAOMHJLGODIJC BI.BNL2FLNCHGO.FB2ONFDLNILGDNBECGOH.H2IEFOGNFIB.3CNLM.MJL2CNHILABFKLC GCNBLABKLFGOHENBABLC.D2JFLCFLOFBDJLN2IFIDAKNM.3FP$PENMNKNADHICHG2DAFI GDADE2LI.2FILNABIEDM3CJLNC2OJKHBJLMBOMC.CMBDIEFCIAM2EKIMEJNHJNFMNLDM. MOGFLKCBFOED.MCGLAFL2DINM2DHKGIHKOKECHLNFDEDCINEHMKNFDFAJANFGBOM.M.KC JCIEDGLH2JN2JDOAGCHNCKANKCJOAJDOAFJ2HLIDNFLB2LHMO.2JODJEAJHONEJ.JKLKO KJBNC2EFNI2FCOAGFC2JODLENKINP$PN.EJOEHB2A.H2ALGJGMGECDKDGHLBINFANLJOC GCFE2.JAJ2COME.GELIFLFHFIK2BDLKD2EAHGLIDE2NHBJC.BEAIAJKJHMNHEHODJ2NMH DNKMLKMJEMJIADFNG.MNDEFOMIMNOAEKLIOCJBFCLHDFAM2HOFAO.ILIMO2CBMCGHIKEK FAKL.IAMDFG.D.JD.DMK2FBA2BJIN2OFMIKIJ2BDCDMBCNF2KAIEIDLOE.MNBF.BNKMLH LIOJAEOEDP$PGFLGI3ONJO2LGLG.NBIBN.NJLJNHALGNCGIGNEIKG.G.HMALG3FJFNDAE 2N2KFLMJOMIJDLOIFKBHLMIAMJM.LFGKJKLE.H.FJ2CLJNCKCDMFJKMFG2KAFGCIG3JLH L.FMEDKNJKNGIJOHNABEIN.C2MKEBJ2AIOBMN2DI2GNBJHNMEKFKFIGBDICDFICM2CBHK 2ECBOCGBIO2IG.B.HEL2F2MHLKCJBIDGLKNHJ.2LE2AIOBINKACBCKDOP$POKJDM.B.EJ .MJNK.JENGKNMAHNC3AJHMOBOJEJMHGCLCONEMBIOCLAN.ECKF2HE.GK.OEALGMA2MICO G.DJLHC.HEAFG2LABKNLGALJDOIAKID.K2MGNOKHDIK.ADNADOKFIG3KHCEK.BMCOG2AO A.OJEJLCBGLJMBNIKCH3KENIDCJAGCDIOEADINANBGJNJM.A.LI.FE2BID2C.LOCKABGH L.H.BHEF2IOCHKNILBD.JICFJDELAJHEAJP$PKCIECFMJKMEFHF.KIBGDKHBHJ2CGEK2N BMOB.2HMGKBABHCBG2NFAGL2.CI2LMJ.CNAENGI2K.DEKLNGFAIDC2JECNAJGDMJ2BFGK .AOLBLAMNIKJMNAHCDINC.FNAG.2FDBHMEMNJ.FBHFKGBGMCJEACKNDG.GCIAEONMJAGJ .E.K2AM.ADHNMBDNKEDEDLGFK2JL2DANLOAKAKJEMDFNDAIHOABAGBD2CGHMG2CED.AFO K3OJNHNGNJNO2DP$PGLKANEJNIMG.HEHDOJILOJBLGMIGHCFBFIMEMCNIECHNEJLADGEO J.HOAGFG.FLIGMDFCF2LGKBC2HB.AKMC2GKDIKAKI2EGB2CLHMNAMCANIANJKJFAFMJL. NOFAJFIGFAK2HANEM.G2BI.ON.EDIMDINKAHCLKFKG2NGFCDJ2EHIGDCNJCIDJLKOJFBH 3D.AJCJH2DCECJ2LAHJFMOALNAEOKMDJK.MFAOMBNE.LJMAM2DBGEIBNL.DCHIDP$PBFE OBCHLF2E2DJF.EBHM2FKAKND.KOHEDADHLFK.GJCHOCOJL2FOFCL.BFDKENCHFKHNKIJ. GIFIJN2JOBJEK.LA2L2EBHACM2IBHIFLIF2OFO.DFLFBLFBOAGFNKC2BMDMGMFDGAFAHK IEGDGCNALCEAHLMDOFJGODG2CGDIHFLJFJKCBHBCM.FAEOLBLENBNCHJ2MJFA2CIADBML HI2.DCDJADGACEKOJHFAGLGKFEMHOCBICJEGB2EOJLHKP$PNFJH.INAHIHGBLMKLNAG.D JBFB2HDAOCBA.N2IHFKAB.MBOIDF.FAFHDFOJDB.OA.AMLDJEILIBKFOC.BFGN2ANCGOA GNOIBH.HI.LG.BNMGCDMCFNJHNB3HGJDJOFH.K.JINEDEDFEKBF.NCLFINCIM.GIDBJG 2DKCAFEKLAK2HLGLBMAIDEFDLOMDBH2.KHDHDEKBACAF2CD3FBN2JCKFEFL2CDMLFODLA DHBIE2HFHACLNJLNCLJOACDGP$P2KMK.I.2BLEMLMDNE2JKJHDHA.CEO2NJHJLMOGDOIB IAM.IC2GONMAEJC.FJMOFLJMIMCIJKFKDJEIFNBLBAHEJNOBOC.NHEIOAEOFA.DJFHLKE ID2C3O.NJMLN.LJDBEMBEMJHILEGOJBECBMFN.AILIGKDGADMG2IADAIEFNOAMBC.BDGB 3OHGB.LGE.NBKGDGIBDMN2JBDK2JEIAKIC.EGAM.2CB.FG.EOHAKJE2MNJIELN.2OK.DJ LJKP$PCMCMFLOCFOHEKAOFIFNFJHLFDFNAKLB2MEODMCGKGCECBJFEDJ2KEMBGHNLC.GI KJFBDL2EJLJI2BDLH.LOJBD.GCGL.HIODJOGFD2NLOEFLJGF.N.IECKCHK.JLFDIAMK3B KFA2HIKLKFLHEIOFO.2MCLNH2LDAGK.HG2KOJNGJL.FMEBMIJIMF2LG2L.IOEKBGCAHLE NG.EJABD2.BFGJ.LDGEGMOBJ2OG.EMNDIFJO2BGBIF2JLKGHFMKLP$PADKLMF2GOKICEL 2DKFMFBACGKCGMAKIBGCNOBOIAM2G.LNMGODGJFENA.2JLJ2FEKIJC2AICMDH2OGAO.LN FNED.D.BEG.KFAOND2JDGAOGOICNHMNCOICF.DIEBOLMCGMOCAHLN.FDGACBDLOCIMDEG .HDNLC2JGLFHLHBD.BCEJFLNMHDMAI2FACLFNIEGHKNMKAMHKOJHIN.ONJO2LHKEFCAG 2BMKNLMCMGC.CMDOC2DJBOMD.H2KGMELHJP$PELJKNBEJ.M2BEGBKJFB.EIMEALDCKGAC I2MIH2DGNK2MCLALKCDFEI.HAEKCEOHCHFG2NMFAJNOBHFEGD.LNFMINLAHGMONCJBDIM O2CMOKGMFMFKCA2.F.DKMGE.KME2CI.BKELODKHKIJOMCAGIM.JG2OC2NE2DE.2LCIOCL H.CEJBDGAFGON.JK2BENCKJL.CMKFLI.AMGO4GLELILDIG2BGOC.FBKCFLDJLGAJLHKJ. HDJACLCMF2KHIP$PENDA.IA.NLC.JBD.NF2.NKHGINHOGC2JD3KDOCINMNEAFIAHLM.O. GAOIFBM2NGOML.OLIGLNEBJBADIFCNLBH2BNCLKONANGONHM.GCGHFJMNMJMEFKLKFMO. BJNHDIAEOGHI3NOEHIBKFABIKNICG.CEOKDEOGKJINLFIKN.DAKBIAOCBLDCDELEMACJB .NO.EJLCMFKBKLO2AICBJH2IMOLHCNMODI3MFEBJFC.KFMJ.NF2BJKHAHNFHP$PKAJKGK BG.JEGHMLE2DJFENF2OKI.BDKBMONKMEDL.HME.LFAICLDIE2JDIG2LJEGAE.BKBM.3FK HGADCHNCDFNHB2KINCLJH.IECON.OMF.A.LKMG.JI2MGNGLNB.2LDEBCFHIMHJLCNCJ.A FBKCMKF2IMC.LEBFDNBGDALDIDGODFDLKGFIKGNDJOFOAOK2FJI.FMDNMG.2I.NDOLHJM GC.2J.LFJH2LBKNHKNFEBJOIBMGACMDEDA2HAHJKP$PIHKODGNECILEIOM2NGCAJEBEMD MIA.OJHMOK2J2GEDGECGFKNOEF3AHBM.DCDHGC.HLFB2EAKI2FDOKIMAKOAEAJNIJ.ACB D.GJGMGC2HEOE2MI2KMLNDCIOHA2NECOAMOAHIH2OAMGMEJEBACI2BJBKILK.LA.KMG2J GHAOCFHAICOHKBM2BK.AFAID.2AOBJGHKJEIOCE.J2AJ2CBJHNF2GCEJANEHJ2.E2OGFA CNJFJOKDA2FBMCO.JEIHP$P.BNFD2.OAHLGIOHGABKN.GLFBL.BFAMEK2INIDNGIJDILH NOCFK.HBN2FHMDFMAHJFLMBL2MB2MFGM2JMOD2GJOBNDLAIC.FAKE2ANJDLENEHNGKACF GKIBFNBHEALA2HDAGJLMKEDMBLK.MHCMBMIOMBILKBFKJKGEI2HDEAOB2ABCNCO2BKHD. AJBIAK2NMCA.CAMH2GBMH2CNLAECJCIH.G.D.M2DILHBGKAKODAN.LKIKBKJGEJG2FBGF .P$PFIELKEKBLG.F2NFCKBNKG.DJKHNJNE.JLE2NHBDEKJO.EJNA.KCIKCDJBACLMLFGB MBJLHEIEN.C.AGKO2AMF2OB.LEGJ2OMGKDOJGIAFOHNDHNGIJGIJKFG2HEDIJBGMBH.IC MJIEBEJCBOFMGAHCBEMN3LF.DFJAFMHDAFDOLG2CIDKALGCANECJMGOAMOHINI.IKMO.F LB.FGBJEKMABFLO.L2.ODLECLO.IG.GAOJKEDKEBCLKCH2CB2CP$PDJNBODG.FONJLM2O N.D2JHEHJKFDFCALIKCMJBIGJ.EKNG.OAK.IFK.BKDG2F.HKJAKIBEFLIGFGAOGDEJE2B 3EDBILNMKCMIMEDJNMICDNKCDKMBLEFLGFMKOEK2ECJE.EJGKHFHFB.LOEMHLGJCBFH2K MBELM.OECGCOGCGBEBIGKAMDBACGJKGE2DJGNLEF.F.NFKAFMHB2HOE.BDHDJK2BNFNDB KGLBM2J2LH2BMLI.CDNKLJK2MFKEMDP$PJOK.MAOLGKOFIJICEODJAHBJM3GKJ.NE2KNE DLOD2MCMFHMLOEBC.EGLBDAJK2.JH2GCBE2BCLIAL.HEHJONDBDNLMHAIC.C.CMBG.NMC ADOF.NA2B.FLKCHGAFLGHFJKCMHILDNJEDB.DKNEF2JMJH.JMDIMO3HAC2A.LNFLGFOKC 2IL2CFM.BKDGBKACD2CH.2C.IL2FKMKFBCOELHCDGJOD2OENCL.KM2NIKBMNONFKHMBEO JMK3COFBP$PMIE.2NHNHDCM2A2MIB.KOEJ.MELKEBALNOCKIOAHKFLGCJKF.FBIKEHIHG OMGED2MFEKG.M3NAB.GJABNEIJKNM2KOFMJHJLB.GKBJI.2B3CLHIBCJBL.JLMGELHAMK BFJLNMJDMKGJNCNA2IKHEMEKONDKIM2GA2NLOJLKNHI2OEC.CGJ2.MKAFC.ABGOLHOG.E IKA2HONDHANIGOEH.BLCMJNMJOKCDL2O2IF.NEAC2IKBJO2EDKMF.AKGP$P.DGBIBIJAH OJOE.HDBDCFOHKEKH2.GEBG.2KDIGLODNGBNHLMOE2BNJMLADHNCGJ2GCJMG.IBIOH2ME F.EAGAGOIND2NIFDKCJF2MLOAHEBD.JH2ELIGDCINKFAHIGKAMBL2MJG2EGKGHDNKCMF 2MKGF2GNLM.EBGAO.NEB.LGOJBLHLC.HJMAMNIGDO2HMBHG.CHLJHCJMGIAG.HALI.GFG 2B2NFODA.INLGLAB.BIHEDBMJHGDGCBHFHFBOKP$P.DA.FJD.B2KELID3ACM.IL.DJDKF OHDODILHOLALG2MFKBOHLKNOLOG2EBDINCA.JCOLGDHF.BILGL2AHJC2MB2D2AFGDLOHL OCAKEOCLFAMDJABFB.BI2EJLDNKMGDNBJKIGKD.NGI.KBHBIBF.LEGAIO.HB2.FLOJFED MJEOG2NBJIBCGJHLAIBKE2.INDJKHLENECHGEC.LI.2DJLJM.AFMDAJMBHLAENHOC.AFN LE2AE2FDAGBNLDOMOJP$PCEM3K2AN2DNHALEHMDBANGAIHBEO.NJG2BCHD2EFB2F2DNCA FG.OHJGANO2CLJCKAJDLGO2MG.LDKFNL.HC.FKA.CAGNLJNKOMB2EGFHG.HL2IECNGJHG 3B.MBGIH.J.M2FAGD.HK2HMANBFOAFKECKCH.AB.JGCJAMFGALO.MGNIOGAOFKCBFOMEH EJFCAHGICGLCDIJB.HMOEMODAFIMEJLMGNBAEG2B2KOINKLMFNIA2MAGBOMK2ODKGFP$P MCBJCMB.NIJM2O.IFO.G.BH2LGBAHFHKDC.EOGDNHCBGMHENFILA2OLGJC.G.LCMCNDMO G.I2MJEHJEGBIED.GNALI2F.ALFANMLGNOEADICFMLMFHADFO.EFJ.KD.LDABAJD2M.MN OH2GKIFA2EFHCG.LFG2KDGCB.J.H.KAIMOHOBFCJGDBDIF.IHMLDOGA.NEKFDHEAEHNAB KM.HBM2DF.DHDCEAK2C2L2GECIANDF2.FLBDBGD.KBCFABFP$PMAK.C2DN2H.2KBD2ADL K2MADNCMOEBGFKEBDMKFCKMO2H2FDLCEBCKNKGMJNGCHIHCJHMCLBFDJMJLELJDLMLCIO BHA2DLGNM2EMBGENBDEBFLHOGHFBGJCLOLGNKFAJNF2J2H2OGKIFHCMLOHDHBM2LEKFOK F.ECKCIKNHFHN2CFJ2M2HM3KCE2BI2EHNFCEB2OAEBN2OAJIJ2CANDJ.MJFOHDIADGI.L BM.EMCI2ODEFH.FAHNIEGH3ACBP$PICFAH2K.JEGHNJOJB.J.FEIFA.LCAJCDLG.NCHMO BEO.EL2JGBM.EH.MD2MHIJBGEAFLND2H2FDAOCJFALFNCJKOJOBLAEKDHANCGIBKH.DNH NFKIOIAEKEJGMEFMIBGNJOECOKL2FH2DO.EMOBCEHKA2OFDACH2CLND2H2ECLA2HKIGJG FG.MFMJEIJBNFDJ3NACEC2BNBI2MFBIK.B.DHKD.OLHLMKG.F2GKJMCNEFOMGFCNJNF2A .IKHDIP$PJBO2CAGHEBGAIDFGCDGJGFHODEOGNOIMIFKB3GM2KD.OFIC.CNHO2IEMHEIB JHINOHG2OIEJOLJM2JOLJDLELDKNA2GACJBFIDMGBKNANKBJEKAHALHBA3I.EOBCLJOHA OAE2GOCDOLFAC2JDLGOEC3GFNDMD2NCEKBODCJABOHALEGKFGJCHN.DLADIH2JFJIHBJL C.MJN2OLNDMFJFCHGHFMCLFNA.IAJABFLCJD.2J.MHDJBNILNKHGAP$PND.OLNELG.CKI .BEMEK2BGA.FKIKH2KONHJGHBMBHLKDMBGCOCNE.LIHJEFLCM.OM3BGNGFBN2IFKJEHF. MEAOGNCGMABFELENCEKEABOMEJODL2G2HOBJALNEN.KL2BDLGCNMO.JDKMDOFAGKECIMA LM.EFCBCD2LNABC2EGF.INHCJGLMDBOHFJ2HAGELNKAB2AMEHCOJNIE.CG2DJFOKH2L.F BILDMI.BLB.FEBKIC.DMCGCMIA2CILCBNP$PLFDKH.HEB.2JHILDNBKOIK2FBCDNONDHL IHKAJFIJAMBCOLHF2K2DMOGDLOHFCF2OJGFD.GNAFJAIFM.FKO.3ACLIFBDNKCJFMKNMI GIMECIGFO.ILFNDFLGMELMFK.2BJFCLMCHFJLDNJ.NDJBFGEO2.LHAJ2IHOID.BDOKMKM IEBHE2IKOC.2JGAIJOLBAHB2IJC2BALCICJNFMGKGLFDMAGAJIHIAHGFLC.CH.IECBEKL AJIOFHB.ODJBAP$PL.CICNDI2DJKINADEIKIAJHCEMAOJN2ODJCJ2GDBONEC.CNJAFCHN MK2JA.AOLCINCDCDN.LGAB.2FDKCGCLAKAEAMIBJKMBCBIN.AEKIGFNKB.MJCNBD.JK.C BEB2IGJEIGLG.MDKCMAKNBH2CKJ2N.JMHLNF.NIALHA.GDOACMH.IHOKMJB2FEBKAJDHE NLGKDFKGLH2.KLECDH.JFEJN2CAFKL.DHGNJ2N3AEADH.EJONLCLHKEMOLJMFCP$PGJ3K BHDNIMHDJEFOBENA.LCIKHNMOHI2BMIBOFNG.KFILAHOBLBCNOBGLAB3L2KEFOAMD2HEA MLEJKN.NELBLDFOCL.2GBIBHCEIKOHJLFDJOBEOCHANDNLMJIO2J.KJAK3IGCI.KDCIG. JNJOHLDFGNHDGCD.AOJCH2MKBCKCFEBMAJNEBDKJIJ.JC.LG.JNGNEM2BE.NOKCJL.FBL CDG.DOGKIGFNMKMHNKBKHMD2MNBEDBLOF2ODLIL.P$PA.CJAMHALELCALCAL.IOKGKDMB FBEDFJGKICDBFEFKMO2IDKBLAFGAJIFGBEDBHEMKDMC2O.BGCANMBID.INDKHCBL2JCMC IBGINLF.JHCKLHGHFBOE.EGACMHLF2OG.HMKONABIGHJL2CNCM.2A2.GCJB2H2FAKBIB. CIFOK2AJ2GEGHBAKM.F.CELBEJHICOJCEGBDOJAEN.MFHFNBEM.F.CBAGKFNKIJEOFHIO ECDHGKMFCFLIGB2DEBFENP$PG.L2IANHJCIC.NCFEIDJAOBMJGEI2FD2HEFDLMFKCOLAI HBDNFKD.H.KIHLBNOHJGH.JNKLGNMI2HONJGDEIHEK2HFOB2DC2LNGKFBEO.EAIELFBIH NBNLAFJD2ACONHLAIKLFOJIDFKOJADAMOJ2MA3.IOF.CID.KJDADKAMDGH2ENC.DNDEMO 2.EICOKOJLNOHNJO.NIONGLFEJIMCBKJMF.AO2DMA2O2LKIGBIDBNI2EKFHKEFGKJBGBO NP$PIJFKMBJALAEO2GA.BLALCOBM.NLNKHFNCJEOKFINIEKFNL.NANGE.LBND.CHAG2MA DHBAN2KNCFENMCNDM2HKLFALAFDJDMEOJCOKCNDLJALJFHCDJIHCMCNFDHBJHMEBMNKEG IE.AONAD2LOMBDJF.FHGJAH2M.GJN.G.BEG.O2NM2CFGMDHJEOEBNJGOCDLHIMFOKALIO GICNDE.GABH.JNHLKCMKLEOKMHLFKHMOHDKAJNHCADBFM2IMDHFP$PFBH.KCBEBFGON2G IEABAEHLJ.GMLFBOHEB2OJN.LIFK2HLEBCGNBMIMCGNFD2LBAHK.MLOKNMLHFEGDEABEK JI.BHFMDIKJLBHECENINJKI.EDB2AGLEO2GMJMNLCNBLHOKEINCMIOFAKL.DJGAHDJCFA JMOJDCJDNIFNDG2L2AH.IKBCNJE.CHDAOBNKCGKDNCENHOEHMDL2NKDM2IL.GMFG2DJGC NADEKCMODJOCJKFAEKC.NBJOKIBCIOCGP$POGLEI.L.AG2KLAIC.G2OCA2BLCIEH2GND. ELGH.NEGHIGAMFGOKNJCFIFGEGFEJLALIMANEBGOJIAGHBO.CACIMG.IMHIANDE.AIKNB EDGCNCG.MODGBCAD.OEJBHEGJD.2L2BNG2JH.JCDKEBKLGOGDLKLCK.LEBAKILCMIDJG 2LODFIGHOHBMJDCLMCOHGEAEIMHLGMHJL.GDJHFNKDHIHALAJ.EGOM2NDL.FOBODGMF.A BCGEHDKE2GMCEOP$PF2M.JGHKDMAFC2NBDLF.EKGIMIGJ2DBHEKAJKG.LNCLOLJBJI.GE .LCMB2ANOHMOCBOEA2MEFDFNAFNHDJBF.ECILC2FJANINMEIMH2LGIFIJILNOFHF.HJHK NKNKHNCLB2OGOFEG.N.OCDKNDKDGFLAFB.FC.E2OEL.BJEIEG.KOKH2CJGKDNOHMGFMLI FIJEOJIFHKJEA.O.AMBDC.MC3NHB.NLAJFNFL2MJMKLEAD.HEBIFECMKD.AJACNP$P.O. OAODMEC2HGEIBGNJDJC.FONENFKFMLB.K.GCADHOJ2OAGBCBMJMHD.ADNJ.BFBIJKECNL KADC2NJNJAJ2LOKCN.CFMIEMBLBMAJBEBDAMJL.ALJFJD2.JKLMGEGO.EBNJHNMK.EJG. CL.3AMEADM.OCFEGOKOLA2J2C.GCLDLBJNONLK.JKL.NDKOGNJGFLIMOEIEAIHCE2ODGC H.EOCMAI.DCDAJODMCMF2MIFDBKBENCGI.HDHE.CEBIP$PBKILFAFMKJMJLCMHFKDKBI. 2H.NH.NJAKNJHKJEKFNMD.GNAOCOGMB2FEMDKGCLF2EHMAH.KBOBEINMKHN2DBF.MCMNA 2FLHI.CEHMGEDLNMJNJL.IMJMGAENE.EAILFKGHBJCOJ.O.C2F.BFCANLEDFAM2.JBE2L 2O2EBCOLIB2LICFLJEJDCI.KIJB2ALO.JGH2AC.INEGHIJHAKE2G2ACHIFM2GEDLFCHIC HCJLHDELBG.ONLFAOCNHNFBIP$PBGJF.IFHL.LHJMOBMNBADLDBO2FLMHLEJOANJKJ2EG HEC2AHFOIJHI2.LKFGK.2FJBJLJLJDJOGDI2EB2OHINACD.IJMAGILDCHBCNOGBMCAHEC DANJGF2C2FOHFO2NMCJK2.AKEB.MJHACB.K2NFB.DFM2KLKIEALFLGLJKECIFHBH2BLIA NM2G2OMK2NHL.HEAFHGKDODOGML2OMCGDLCHIF2G.KDFMKJ.O.IOKOCGMBDB2HLGHF2H. AKCBOP$PL2GM.BEOGLEKM2O.GO2JNHAMHAHFI.CFMJKBDAMJAHOFKCGIBAHC2BOLBLAOE GEIJKBHOLFM.KCN.K.OF2KDGHFB2J2EONGJGO2AIGHCAFC.DCKML2C2FGL2ABJ.F.2OH 2IBLDIOHNMJBHBDBNKECGIEIHNA.2LBEIBNJ.BKME.GFJL2HFMKFH.MKL2KCDGLCNC.BI EACEFDCEIHGBH.OGDMBGCDGC.AIOG.FHBGHNE.EKMNCDK.2IGHBED2MNP$PELK.2LJABG HMKAJFGAHBLE.FBFAHFKN.KBLAL.IJAMEOGLMJKINBDKAFHGMKIDNBGDNKBNEJNJ2AMLD ILGLO2CFMELENJILBMCIC2BL.LGEABKLFNFMJMJHFBGOAKAL2EJMBEOLMI2DKBFEKJOGF OFHMOMLF2NKGOBEAIAHGACHNKCJGNB.HIGEK2L3.ICFHBIMHLEBNFGJCLKAND2BKNCE2A CELNDN2.BHNMNAIHJEBDNHEBMIOIDA.ALKGFP$PO4BHFD2MDJAGJ2LAJKJCOHFGJCHFCM FKFND.INAJKM.NOJEKFC2OIFBNHNBHF.FIGKFEMEJKICGECLF.M.2ELIEABELMCLAFAGH NMCJ.DNLCB2OA.B.ONIJLOK2AMGBFDGCNJG.DJA.NJLIG.D.JKJINOG2FHJHFLBMDAFIF O2FODIOKNEMHAM.MJNGBICKILCKLAEGEOJHCODKBDKHBGMCFHDOCGN.NEKAI2MKEMOFNH FMLHIB2DM.JILEDP$P.HNHEDFGDFDGC2K2GJEGOJAMIHNKCA2JCMLB2NA.IHNCDNEJAEL E2HADGMBHGJGOIBIHGCD2ONCN.IMNGNOJDEC2LKBOF2JDAMHKAIFGMC2L2KMGD.CHKJLK LF.CO2MIBLHLKCDAGCGELJGOHO2EALCGJ.BIKCBFLHIELIOEOLHKCI2D2EHLKMONC2.CA N.AMJMCMAB.DBOMJEJAGH.CF.2CHC2JEDMCDBLIHJDIH.EHBA2G2NG2N.MHF2NHFNP$PC GH.EHJIFJCNCDOKDHEBAMBFEDK2HACDFOKML.M.IGJ.F.IDG2C.D.N.FLIBCBCDFCOGNB O2MANF.2MFGDJLMBKJO.NJGKND.JMJDGEOCMBLJEGNKD.EABLDAFMCM2OLHFBNIEOCA.G FK2OMEIGAFDBM2N2LIFMID2NKLOGDLIOABD2GJLAHDBAE2KOFH2BJAK2CADEMCLHJMCHJ OA.AI.HEOEJED2EGKM.MOMO2MGFN2ELILKHIENC.CKLNLAP$P2GDHIO2.JI.MHLAGCELM GFMHEDCA2NJCFHEABODCFDB2EGLDLJ2DBKELDGEM2F2HMGJCOFG.KDGN.DFKG2NDOHJKO FLHKBAKEBO.KFBKNMKLDN2OGDOMHK2GHBJLJAGOAMGHBO2AGIHENEDCALE2KEBGFGIGML NLBOBALMFBE2CJ2BDHJOFCIGFOHFN2EJFMBHMCFMCLMLMAHDOFMKEFH2IEHBLILDBCOHE NBOGFHOICFEHCBHCN2BILNDJAKMP$PHN.M.GBFL2IBFKHNENMH2NCKDCENAGEACDFM33O NA2L2JKN.HO.GMAHCBG.CI3EGLANEBD3EGF2GJAHAIGFOGDAO2EDFDMKGOLM.KLIBK.KA .DMEFHDHABECEF2KLDGBGJCBHGJGIOBAEDOKM.A2.EANLBIF3JBM.IMLIOMNK2OECHDFH CN3DMBDNH.LIN2FGDIDEMHKNKIMJMGNGKFNLIAHFJCHP$PGFIAINBGFIDKMEGK2EGM.EA KCDO.DLHDOK.I33OAMLNA2NIG.BF.HADF2HMAJFCMGIGCJCOKAJFAK2O.K2FHENJNDMEF GM.2CKDLMHGIKNCIK2BICMEAEGMLIFIHBOAK.OGHKL2CK4BAMCJDGJBHDB2CFA.JEIKNB EGBFJCGLBGHM.2GBFBHCAC2KC2JLKHMK.LBENEFKMHAKOF.K.C.HCGEOCENJHP$PCGB.M N3MBK.OKON.G2BK2HMCGD.BONOJ.KN33OKEHDJM2ANGOLDKJ2DGKMJIO.IDEDIFE2NA.D HN.J.KFGBJ.BJ.CLOFNEBKBAMAIOG.2CFIDN2CBJFKGME2DNDBGMCGIJDCIFAEKFAIGIL HD2EONLEJGMCENCNI.L2FCBKFMHLBOGCJK2LIHCKCNMJ.HLGAGMNGLDI.3MBI.NIM.CJ 2I.NLD2G.B.P$PJA2HDGN2LMAMK.OD.CJKCAHCJOL.GMBMHFOA33ONI.HLGDCHA.MKIHE NILH.GKN2.NELCB.OJMKOHLBAIDOKAGJKDIA2DLOBGKCLFHNCNLEIEDCJGAOEJ2DLJGMA NGHGB2DFNLC.2JCM2BFDCOMJFAGJIBDCOFKMO.GJIGBEO.IKIOIEIHOE.BAFGHBO.M.NF AHJDN.I.ICI2FKAEDHFIELNEFOMO3DP$PJAJ.KBKDMGCENCFGKEDKJMN.AOK2DGOLDLDF 33OM.FDKENHD2GDGD.IAF2BMACMHEDKCBLA2.CF2LAFLK2FCOKIJC2GMENA2.NLGJ.LDM O2BABIMF.LJ.OFLFDJCGBADA2HDB.2HMNF3IONENJC2OAMKMJDJIAJ2GOLGDOIOBIADGJ K2AOBDNMOKDJELEIG2CKHI.NIJK.FAMB2F2.OCHCALNGMBLJFP$PBAOJHCDCHJGKDL.DG IGNDCMOKGNOH.FIEICL33ODGF.GB2CDBKOCIHDEN.MHO2IBHGI2ELBC2FLCJCBNIBFG.H INEDFDL.G.EKBGM.OJABAIDBDHCIG2.ELHDI2GBACKONLHMDF2D.IJKDELJGL.EHJONKB AMHLOEKE.GOHMJMAN.2FLJLFAMJINGOKJ.IB.ACMH2M2KEKACBDOLHEMBMCGENCDKJLJO P$P.KHLDFODGNM2INEDLGAOC2NJL.JNFBEOKGHI33OFCKDGJENIHGLK.E.LKGN3KGD2HE LNHDHM2LIHMFJFK.FCLNCBJC2ND.HIJA2KHMDMJOJEJH.OLH.MI2AGIHMOCHNBGFB.BC. ABLB.ELKLEDBC2OGBCKDOKHE.ACFBOCAFJAE2BDEADBJKNJGFOBK2I.BHONJHCEOGDBJ 2CMADBAHOFHLND.O.GOEP$PNECNKJIMHDBKFDKHAIHGNDKJFGFGFBDFAJDN33OEFMENLF BD2MFKJEHGDAMADAD.CKGHGKMNDCM2KMN.DOIEK.H.IHKGJI.2GE2AKDNLNIN2KGDICKJ .MHMED2H.FECAM2LBI2EGJKDJ2LKIOG2EMANH2IALMFAJM.B2.HMIHEGENDNGBLEBIAGN ML2.HBJ.LGOHF.NMNLFHMNADEMO2JDOHADADGEIEP$PKCLJMKH.IHFLGFMNIHNHEDA.OC N2HCL.O2KG33OLIODO.KIAOKIHFICFNF.KH.ENFLBLONFDOHM.DBFCK2AKHO.HLJ2DCOJ .KCLIBMEM.DEL.CLAC2FAIHI.IMDAJMHIGNJOLOEDJKEB2MLKEMFO2NJFADMJEFNLMFIA EHL2GD.NGC2JAMN.LN2OACAL.AHM2DH.IHJBNFHBLDLOBJ.BFNCBEGBFHINIP$PKCH2JG BMAEJFJAGO.FHKNJ2IEBKFOK3ELBG33OLNGKHKJG2AJNDGIOINCDBJALOLBLBIO2LJ2. 2BK.IGKEIA2FHNHBH.I.NCGLAN2GKLBDIMBKMO.FAOGNECMFNKMNALC.L.AIHKDMHCLKC DM.M.HOHKBDBCIODLNIDCICN2DLOLEMCLELHOK.NGABANMDHIMBNDJHAOK.HEICG2NKIK .OBAFOFCDHGP$PJBHCBCHAKOB.GHDIEMDGJ2CJOLCMFGJE.DKA33OBDHNCL.DBIKHOBED BMENMDLBOBIMKCLKBNBNAGCB2JIKI.2JF.EKDEJKE.J.OF2M.IGDMECKMGEJCDMLEDAB. FNBGAKB2FMKEIBMEJBLBEHMOICDOM2GJI.2JI2LADJGIH2CN2IHCJLEN.DHBN.OJAD2IK NJ2BIAJEK2LA.K2.DLGCE.KLNGC2EONP$PNHKA.EFGLDHDAGLAGLKNJKIKG.DKBNLEGAF B33OLJ2OKMFILDFNMKMBOCNBDJGBM.KF.KOHGJAIMCFK2JIB2O.HG.2FNHNAMN.ACHCIE MECKHJCAKEIBD.FJIODMCBHFNGEA2KEMEKMKIMBDCKMLB.ABDOIKHOCL.E.LKDE.LGHNF KANHDOFJHK2.F2BNAKEHBFIHIG2ODKOFCAO2IH2EFH2IDI2ENENP$PLKCIMOBAHJ.AJCJ MG.JBKJIDKIALOHLAEFDF33O2J3MCFGDAKFOCK2EIBKOLBEICKM2GB.2OGBM2LEAKMHEO MDENJAF.M2NDJ2KBF.LNIBAOAOHKI2HAHDKEAO2BIEANCOMJ3G.HJIBHFMHDFJ.E.ED. 2LHNKNCOCM.DHNEHF.GML2OCIJKHKGIBCLNHEDEJGNAJLCIEJHDIOIOEGKHMEILAIBJBG MP$PAMCOM.BKEN2OENIOCIACBEAOBJOFLIK2BOMC33OHMOHJDKLKMKGOMDEIBDJG2I2NL GNEOFIADGH.L2JLHJLC2MIDEICECJKI2DJOMBKNK2D2HNAJG.KMHFHJDKE.JIDIJNL2OD E.H.INICIGJ2BOACB.OBGLICELDLCANOIDHAEIOCANECNLENDHFLD.F.LMDHKLBCEJFLG DCOHKEI2GOGCIKGINMNHDP$PIHNBNANGIHAKCD2MLBMIC2LKEJECFAMD2.CL33ODACLNB IJML.EJLELJHJNHM.LHIOHFEJLM.MFJHIMBCIG2.CMC2DOHOBN.CKMFAMCMOKMID.KJLH GLGLFOJKFAL2HIBHCIBNMOIJDCJLAGABAGLGAHGKELGLNFOHALBMKAME2.M.IOLMI.O2M C2EDN2DCIDKHLEMD2OBOJCJCMKIMAFBMAF.LDEHLEP$PFLCBEB.MO.CJHJEIMLFAJ2H.C AHDMDHDEHJH33OIAKF2JAI.JBM.ICGLEA.G2KGCBCHFHNGFON.2HDOHN2.LINEIBI.BAC MIGLAKEJGC2KL2.EIOIMFONIDOMK.ONMHLMBOAMOG2M2.CHOKFDAGFCEMNGBCBNFDADF. MAHAOEFLHC.OCKI.NH2JGEDF.AFN2GOIBM2BLNJHCH.MLFADALAGLMLCLJ.2EP$PBOACE NFOJCGOMJMAL.FMJGFBMOJCEBO.LBIA33OLJ.ONBM2K.LCABDIAFE2JFBECICAB2IAHIE I2DNMFDLAOJHGCBFIKNKGMCHG.AOFCEOBECKG2KDJMHIBMAEBN.BA2FINBCEKH2NIOKBL 2AHABELBFNIDEIHNOMBIEJHBH.FDJECABFE2NIGLDH2DCABFDFNE.NHLDJHBCMJ2AFBEN .JB2.2IJDOJ.P$PN.KNKOCMDENLNOJ2M2DHMBNEMIMANOKBH.OE33ONDFB2KCMIOCBKLD N.KG3IJDIECKBODH.JIKBNMOJHJOB2GHO2G2MLN2LGOMNEHBAHGMEOFCJ.HKJF2.NFCM. L.MDIJBCACGHMHBCMABKH.OHODLIOK4AMC2M.ANJ2CGICBCFHINHCOFG.M.MJ2G.CE2KF IBC2FOBFKJ.LAMOLNFKLDHINE.IJAP$PAF2AOL.EFDHLEOLCEO2JNBMBDKL.2J.IEDJE 33OGDJHDN2EIKD2MN.IOFOLANAELHKF.AFLKE2JFBAMC2FG.MB2F2IFIAOJDGKJNCF2MN OBCHADIFDHAHGFO.2HKDG.HM.OEHIGCDMNC.KLIACBJNCONIL2OJBAMLIOBKIACF2KF.L .NODJMAKLAJA2.L2GBFLAMBONBDMOML2CFENDEMLOK.EMOIKHIP$PGOAD2GLAIFDGFHJC HEGMFDJELHMCGLDG2OAN33OLOHMBODFMKGBLDJNJDG2MA.IKJ.DKD.IN.KDLEOJGDIOBD GDG.OE.KIFNCGL2KBMAM.2COELIAMOLFJDH2ENADNGENLGALA2.D.IJDCAMFEICBIFKAM EFIOJDKFDCFJOHIOFCNBFDB2GDIJCDBNHMECBHECNECIOKGO2.FKD2MFDBJGJOD2IOF.B LP$PDGOLF2B2AD3MCBJLN2CLHIG.KLK2NDNMKMD34OCOKCHKCIK.A2NDEODCEGAGM2ELE .HKOBN2DKNEMFAIGNKANE2GBIAMJNOJAFBHIDF2.IKCIEKG2LCNLNOGOKCEGNLKIJCBJD AIK.I2ANLNEHLGOEMAOKJKBADF2ILK.DFAJHGDEBKLDKGKMHFIGC.OMFDJEBD2AINENBE NGCD2KOIJCEC3GMLM.P$PDGNGFOFJAOLGOFC2IBGJGCLHAOJLJNFNAK.H33OHM2HCAGJK .KHO.A2ENDJ2KAHDNINJ.CG3BA.OHNBMK.GDOMNBLHDIM2JDOBLDEOIJNFA.IMAOCOIML KLM.GB.MEBEHFIGIGHJKCONIHAGEOA.H2LH2KNAGE.EFLJIDGLIONJCGFOEHKDNHONIDK .FLBJE.LFANHBIFDHENDM.IKJKE2LO2FI.N2.P$PJMKOBDAOGM2OG2O.IBMAF2DHJ2OCJ DGDBIFH33OINLMD2AFEGECGH2MIJDCFGHAHENE.FDG2.CAC2.FBDFCI2CB.LELKE2OBDI LIFEBAHNAI2HN2BMD2IAGIN.IE.HCOGELMNKAHFE2LJG2K2JKOMBL2A.G2EGIGDBM.JIO .MJFMEDBAOIAILD3J.KBADFCJMKIAMDCECOMIAMCMBCNGIAHBAFBODCDP$PEI2.2N.BNF HGNIDL.JB.DMEBNMNEOLGAB2OD33OL2HANMI2M2K.BIKJFE.EJOKLEBNKNEAKBLAKFKOF C2NCBCHCLHALAOCLHG.MFAOIFIBGEFMB.AMEAODGKINFHKIHKLMDELEON2AFO.JMBLAKF BDK.MDFDF2CIMFIHOGCAKBHNOGH.I.LN2CBHJEN.KMJDEIEMINBEOH2M.ONKBEKACO.H 2E.DKJKJP$PIOFJGCNFIODKCFMDFL.EDGLIAEFCAMAH2ODA33OGIEKBDGHELKICGNJHFN L.GEMILDFBF.GIGEHC2LMBFH.LBEFHMC2G2DCNOKOEGHDAGC.ECM.FOFBDNKGO2DOKF. 3NI2KHNBO.KCFEMHLMLFDB2DCIENJBA2DCFALMFNIHLB2.2AF2HOIDMDLBODCLNFBKAOK DNJFJLJFAODBHNMGNG.2CD.JDFCOP$PB2MGADBEKDKMN.F2.IH.JICMN.2ALIKNCJ2C 33ODCLAFACHN.GJLOKOCABHIKJGM2FBL2MCBKDNO2H.NOFMI.NIHCMG.2IOEJK2JIDF.B 2L2GNKEKAOFBA2EG.2ANB.NEFHGMIGJ.AENGNKF.ILDA2KOFAHGKIEJO.2BDJNMB2IKB 2.HJFMHIGIMDM.OFKOEONJKIN.2OKJDFBCL2GJB.MDC2GEGBE2JP$PNMIMODE.N2AFDCM KD2CGEFODEI2G.B2F2JEA34ODIJHKADOAEGIDKMJ2LMEFMK2E.I.LIMIDGE2GFEFNMDFN AIABJFKCIKJCGCJOKGFLO.M.H2.DJEFOBNAOMHBACMHM.2MCEJAINOEDOHC.2OHBNHKIK EL.JDLMHND2CGDJHNHBNGLO.BHBGNLFL2H.BD.OC.MHF.LH2OJBMJEFHK2DHCBMHLH2NM .P$PLEGIGMGFGJOELMNBDMBLBNFA3IO.DNM2G2L33OAKNALCMHABM2BHMJE2NDJBJFJ.L FNLDBMLBOMHNFMGNBCKOKHC2IM.2KCEKBDANOALOKC.DCNANC2FNJDNDGH.ODOCFOENK 2BFDOEO.FBDNFGHJEC3NCEDFNDIDGNLJFDCJ2ICBAMGNCLMKH.CH.FLKNH.BAEIHG.MKH M3DJADOLINBCFA2.EFKP$PNGBKNFM2.F2.MCGEGFDKDGAL.2HELOFKEKM34OAFH.HKI.M IOAMJANLFDHBDF.MGEFILNLD2BONAJHENODIEBHM.KLODEIEIMLEN2DMLBC2KFE2NLCOB .NONKHBN2MO2NGAEOBAD.OHGLADLFKCMDKIODFNDEJ.IGCFCBHJ.IBJLIOHBFHEMHNLEO KEADA.KIJ2EHKMOKCNOLAIAFHBKMCNM2.IB.FJP$PBCKNKLMALJANHL.MEB3MCGLE2.KG ALOE2HK33OKNK.LNA2GKDIKHEDNGIDOMH2JDNGC.K.OE.OKDCBJ2BJEC2BNOKENCDOGFA .M3OMJNHF2HAEAMOBNEOF.DAL.KNDNCOALGE2DOFO2FGNK.JAGKMGFBOM.FAN.JLNCFI. A.GN.DBND.KHAENICBKCOHKBDANDAMOB.NLNOINHBMNHNI.CI.NFMEKGP$PNHBOMK2CK 2NMIGBCOCL2B2C.EJMACMDL.CIF33ONKEOFLACIOBGC.G2I2FMGOLDODH2OCDAOF.CH2J 2O2HJEDABNJEI.FOHDIGANAONKOGABJCIEHI.OBGHK2GIHJGL2IDBOF.NA2IMO.BFCH.G ALC.BADBICM.NBJKMHFALFODLF2.GHFOKA2B2EILHCAEBNGHKEBEFOMJCMHMIHGIHLF.M KA.MN.NJP$PDFNGENDKHJ2BGI2EGDKNBAEBLJB2GCJDHMEF33OEALAGD2LJFBIDKNMANJ MKOD.DIKJLGKIFMAKMEGEMOBNBLMJ2DJKGEAIKEFLJKL.OEANGMA.NGHLFJA2GOBKIAD 2IJ.2AIJDCG.FGFAGMFLED2FBHLCNFLNJ.OEI.FJFHAGFEIFLGOCMCI2OIAM2GO2FELID LH2.J2B2MHGL2MJ.OFLKIE2OGFNI.P$PHLEGFCKJBN.ACBEABK.KBIGIFD2G.OMEGDBL 33OIMEOACGAIDEDNMNBMD.B.EJBLKMHCF.LHMAHIHE.MKE2NMOLJBAKCAB.A2EK2DJ.BJ LO2KOMHDLB.DKFIKENDJ.AIBNKA3OGDGNHLEG3F.BLID3FBMLAIH2.HALHLB.MLFKBDNF AMFNFDODLIM.IFEDEL2IFAF2HMOJNCNFBIEKAO.LEDKLF2GP$PKOIDFIKHLGL2MHEINDC GEC.I2DEMC2HANFHNBFBH2DLOKMBDO.JAHIFGKLI2JNJCKFGEMKGFLIGLEBKOACIME.FH MDEFOG.JEMAB.H3DJMNEJLA.NEDMKAHG.CDANLJK2OFLHNIDJGCLACMJ2LFDOJKO.NDMJ DIBMLDHIGFLFEBLKH2OILKODJLKO.IJC.HGLDCKIMNMBJM.BNIGDJNDFCJK.DK2CIBICH MFCJ.CDAGLGJANHLGIGJMC2.HMBP$PJKAMOHB2CFLNKMHL2BFIAFB2AMGED2LHIA.ILEK IJ2MLNJCGKNGNB2FLIGJKOKNICM.GNAGMIABDHJFLGJHGLFEJFIHDO.L2DHL2KAJFMNCM NJGDLMHJHDBIBKGNGMGKMGCFGBGBFKMBIA3INBKDJCLBIKGBLEAHDCLJKE2HKDKGACMCL NCJMJCIMO3.AKIB.HLHDJ.EA2HI2CHDLOHDBH2G2CABOBD2ACEHF.KCGJKECJGDOIFNHI FNIEGJP$P3.G2NFK.J2KFBIGC2MH.NHFBMFLAFI2CEHIGBHD2HGEM2FMFCJL2B.A.JK.C IGNBFI.BJGLJAOEMOLADOGCIKCOJFBJE.I2CNG.IJINKA2IHF.LFJGEF3DNMKIHCDNLBF JGCNAI2LH.KLNEL3FJDGBAOLCNGEJ.GHK.IMDL2.JBL.ALDOCMKNHC2O2MADINICMJI.J FCBDCGMBLNFCFHJGJID.DBOC.D2JH2FANEIFC2AENHI2LGMD.H2OLP$POBCNKN.GILIMN HEH.EJHGABEONDAMIGMBAMGIG.KC.CMNB.K.B2LOJNGK2BF2LCN.CILBO.CL.ANMHIJEA GOJLBFDEHDBECE.BC.KAHDFGFLCKDBCD.LAEGLGNFGD2NOI.2IFKAFEBILI.BLDKEAHFM BMHMLHNAJAD2J2NLNGLF2AEBIEAOEBGFH2.A.IMGJLGB.CJGLKJEHM3HEOFJLIMCHJNCL ILIAHNBKADHJMIMOBCALJ2BE2LJDELF2HP$PJOC2BANGH.L.OKIBLNJ.LK.HENEINMDI 2AO2JNOJHGMFKBCIHLDIKGMKNM.MIDCMEB.KHDFOIHEGCLKONEODBHLOANOAICKD.HKBA KMKHIEHM2O2ACHLI2EFJAFMD2MJAILHEHG3ECHICL2OAHGHEJGKBDAFOIDNHDGEC2AOIJ DNEBGA.KMLNDGNFHEBGBNLAFMIEGHLG2NDMCGKCFNAHBFKGONBC2AJD.GOBMHMLOJ2HLI LGEOKNJNLINH2EP$PJ.L2FKELJOKO2EH2KDIHCHGFOJMNI.NHFOIBNJGOHKNDLJLOBEDI LIBGBC.NFECIO2J.2EBG.D2FNEMF.B.ANEFJFBLMHAGECBLI2BDFMBHDNLBCKNIB2ANDN LI2F.CGAK.GBOAONDJM2ODLD.HNHDJIODJLEIDNHABMLNILBLHLBAINAFODJA.HCDHNE 2GJMBLI2ED2HCIJBLI.G.DF.MAKDCBKG.DHOMEI.HAFIJMDCFGH2J2KG.IBLCNCNGP$PD IKF2IAIJHIBKHBO2EADNAGKOBHDAHLOIBEKEIGAIAJCDOMGEOGHFHKL2MOAN.HCGNCBLB GO.MFDBGEADC.MILBNBGDH.ENOEAFNMKGODLJD2BNAG.NHGCBOGOKL.K2JIMOLMOHGIE. DMGLKG2F2BNAEOJO2FLKIMKGKGHONCL.FOB2EKLJFKAJ.JCI2OEJOGMCLC2J2MJIGC2KH LGACA.IB.MEOGCHNCKECFAIA.C2NHBEMKNL2B2FIEOIBMLP$PMDGLOLFBJFIHM2GNMKNC 2LAHJAMFOCBGLAGLMFGF.DI2NLGMJHMCEBOMIECHBIJ.BIKJLFKJKA2C2HMBOE.H2NMGK BHL.EOJOGLMH.2EA2DNMAI2GDLFIFL2BDMFJF2MO.O.GLBD2JBGCOBIJHAGBOJOJNO2F. GNEK2AKAIOCGCNGOA2JKGFIFCJCMGAJHGBHDOCLG3.E.MKEJOIKGN.NEFEGFBIFIGEM.H OMC2FBAI.OJ2DFJNJHNCKELHICP$P.MENBNDOIGIO.HIMO2KGFNMGDABAFHAN.NDLELKD MGAHCKMBGEAJANLED2INJDCMDNI2KAM2OFJIFIFCDKD.FMCJFE2GAFL2H2KB2ACMOCHED CNIHM.JLAD2.LJGAINHB.H.MFNLNEMG2HAEB.E.LGE3OM2EAHMNEDFLBHKBKLD2KFBLNC AFNCLC2JILAIC.ODNBFNCE.GND2FKCBHFLDBJBOEKCKMDICJGHMGLEFHM.BDAMIJIOFEA G2NI2OP$PMGFAKHGIG2HF.OINOAIF2OHAEIDAEA.MF.IEMJE2LGELEBNG2BCBNFAJGKOC KBI2.AGFHFH.MGEFDAIC2HMBON.H2MNGOCOCGOCEFIOEHBN.H.M.OFCE.F.CACHJFINMO A.JOJKDCMOIJAOMDKDMFBEAG.GMONILHAIDK.KF.2N.AGMCH2JLACLI2LDCMHCJ2DKMBD HBEHADHFLNBAGB.MCGDC.LMADG.LFH.2CMIANKAKDIELC.DEKFON2.DIP$PCBMGINJDEH 2BMJDEFNCFBC2JGBJINBI.B2KI2EO2HFCEJNMOBHKHJF2GBFCD2NKEN.IBEKEN.NELEA 2KCEIOADBMG.J.OEALFEKE.EGKOEODJFODKOCLHOHKNDNCNME2NEFDFOI.ODLFBEIMNEM .D2GFLIE.D.F3EDNFMJMLICLENLFEGACOHEGIDG2NKCGJCN.CF2JHK.FJOGL.F2KCHE.M DFDOFNJKME2.CFD.AGFDKA.COMAEHOGDIFNGAP$PADO2DANHKHGH.FEKFOFHFONK2AGDK HLAKGJ2BD.MNJEALGIJNKOAE2BJCAFA.LDO.HLHJ2A2HN2GIOAG2HADFBMA.FKBLO2IKB LELGDLBLKANILEDJMNDBH.GBKBKOMCLJLEDEOFGAIENO.G2EDCOIOIJNJMNIAGNJOIDMD EICDGJGN.NAMIF2D2IBKFMGMDMABOEBKDA.IOMJHLCM2FNEHOEFIDCGDBMEI.DHAC3DNL IKIO2.2NIFJINOHMJP$POEH.OMOGKHCBE2DGBNCD.JBNGEBJNAFHEJAFICN.JOJGCOJLN LFENFLKIEOILJFNI2MCEINAEDOLNDLOAJDFCK2GH2.OBECDAKNG.NICNIEDEJ.KHGLHAI .CHDAFOF.JBKIJ2LGKCEJAFEJFLIBDG.J.NIAGOG2HDN2FCINBAIEJCGEMEFLBILNOLFB LNLEB2F2KEOLDMIDIOLAMFJGIDGH.2KIBEDFHNCGMHJHIMLGBGKLDGMIOCLMACKHEMLP$ PKDGFB2HGDKCKGJCLDGB2ADFDNJFNLHBKFBK2ALD2G2A2NDLHOHDODEN2MI2.B.ABFDKJ OG.BD.OAJKGLFBMJBAFBNACEHJOAM.IAKNA2HC2AJFJHJEA2EK.H.JHCA2L.DONDIBMAG LHKIDIDCDMIMKELD.ON2OAELIOJGDKLOAIDCOMIOHJLECFJNBCLGHFM.2E.FAJBLIHJL 2ECOMIOFMGJEGOFDMNL.FEKIJK2HMKLCHODGJAJOFM.AEOGCHP$PG.NOJIMIACIBNFJLH JHBI2KC.FOEFG.E.BNKG2MEMCDC2JANGEMCHLNAINLKEIBMNA2BAIM.GDBCAFEHLA.2HN LDOJLH2AON2.2IH.FCIJLAHBEA2FGOBHB2GELDEFMOBOMALKDGEMNFNONH2B.KC3NLH.M NOLJ2.IMGCKOHC.J2.MIBKNBAENMHJKBMDL.2DOEIKBAEONILKHL.HDF2KDNCLCO.NOAK OHIAJLGK2JDEBOCBDJF2KD.E2GHCGP$PJABELHL3OEDBHDEKF.EMLMAKC2GE.DNLGO2CM B.EMLKA2CGK2H.OHLNHFLBELFGH.KJDOMOK.HGNHOK.DO2KEB.KFC.NKFCKAH2MEHFC2F MK2HNBNDIJAML.OANGKGMJD.J2GMKEJ.2N2F2MBKNFA2NCEFAMGE2GCNEJGIFBKJCFHC 2BANJFAFA2JNGAIMLF2KFBHJOHBCAM.FKAH2AKHFNDNIOE.HDBN2GC.MGNDJMFED2M.LN .KICDFIL.MP$PDJLBCMFMFDB.MFBIAEFO2GJ.BCFNEBNJAI2BDHLGJKMFGEIGF.NB.NAI AIOJGJGBAOF.KH2DOFNIBEMFLHMHJMO3CJIGHCGMKBC2OHFG.HKMAOIEMEHMOEAMIDIOM .BKOHFJIJFLHDF.ADBOG.E.ECBDKICNKG2FMJIBDFNCONBJNOECGDL.LBA.KO2EHDBAGF AJFBIFBKMINLAHDAB.JHAIM.LECKACMBMF.IEBODEJOHMOEFIMKNIKIMDOLP$PGAJ2IG 2NKMC2.MLOKNBMGNFLOI.OLELOFE2LM.KGEDOMECOMAEBLAMGEJ2E.IGOGOFN2GDK2AHA D.BLADFMNMKJM.HGHAEIC3KNOFCOI2GKFGO2JMDON2MKCLJI2FAGDAGFACLDHMDAL4MOK EHN2COBOACAMHDNOFHO2JNGKCIEC2.GHCHNADB.K2CHGJLGDBHG.ANBMFEHDGAH2LKHLF M.OHCBODFH2I4GHNGFBDIFB.2IDOFCDAHGIEP$PE.OIHDAG.EIGJCNF.OL2NIBIBCNJMK EICF2DFHBDIOGK2.GDKG.OCNJMLCN.GF2.OA.MBMDKGMEJDKEJAMDJKI2GIM3DEIGJIOL IOAI.BIMDFEMLKHAKHDCOJLO2NHOBEKAKAGDKDAMKGLOFIGIBA.LMHAIKMB.HIC.AJ2LI JLKGJHGJCGOHMDLOGFIMHLOEDB2HOHIMFGCFLAGI.F.EDC.IGKGEDGID2CHIJKMGAGBKJ .NFMC.O2.KJAFLNMP$PIMOF2NEBEHF.JIO.NAMBGNEHB3FJKEIFCFGIFNHLOJ.K2.AGA 2HIHEJAMGDHBF.FCINM.AONMFGHCAEFLMEO.BMIMHNOMFHNM.HIANFHDCGDJCLHNEDH.C GLCENCM2GHMGBMEMJBEHCJGDKDCAMGKLEKMI.CLGILNAGL.BAHGNOGAG.K.DGHCLJC.GD 2KIJ2NBHCBGIO2KBLME2OGA2.JHNJOHGB2EF2DIM2B2KANMGLN2LECDEBND2EAE2CFP$P LAHB2IFG.EN2IHDCDOBOHODKNOACM2OKJBH.OJKEG2COEGOHO2DABK2M2IMNHLNBAIDBG AKO.2L2GCMGFK.MG2HMFLBOHANCBLJIG.GDGALNFOLDEMDL2GFIOIMA.ENGJMBEJNEGHB IBFDM.DCGCNMO2N.LI2NOF.JKHOFAN2MNFJCKNGMKJ.GDHLH2NFBKJ2NOJCNKCKMNAIJ. CNOING2MJKM2OMHOCKEFBGOBMKGDNHEBF.GCNFEOELNEGFKP$PBMFJKLMLNGKACBO.GDO MJI.GI.CMBI2HJAB3NDCA2NG2KNBKHI2JKCALIE.CEGBOI2FENHA.FLH.IKEMBON.2LJ. FJCHGHMEOFDKNIAHGHKCNBOG2ECBGCGHABLCAHLIEBLONOKALGH.NMCBNLKMDGFLEBHNB CM.HLALOK2D.BEFHLIDLD3MALFOMELNGHCLBHGFKN2MJICBJIC.CGC.DH2CHNFOMCFEKM BOLOCJAG.NLOLFJICEKO2NK.2KP$PAIDOJ2.FNCIEF.LN2MKODGLECLDHOKIFEKMN.BML EMKIAGIJEM.LEBDNBHCKA2O2AFOLJ2KEC2IECABM2FJHIJIOGDOAHEGMONBDEHE2MLHAE 2GBDOCAJMLCMGM2CK.H.FMGDEGBIEJLEGHIEGKD.BLMJFEDNI.LHOB3EOBFBNKBAFJHBG NO2NAFKOGAHC.ABD.AHBEK2G.KDABKMJ.BMOJG2KOF.2CJELCBKGED.EGFB.KAONDBGAK HA2D2NP$PGIEFBFGFHKGNGOA.OBCFJFIKHODOJDAHOMBAKIHLGLEKDCB2DJAN2J2ICMKL JDMGALEDGKGIAMLGHELFDFGK2BLENKDOKCBCKJMDNIMCKCBMOCGEOMFJ2IGM2LIMKOLBH FLGH.A.CEILKGHAOI.M2EHKGANFGFO.FOGOAOKBNIAOHE2D.AOHEJLBG.H2N2HFEOMC.A K.LEH.MKBKO.K.GMKOHIEFNIOAIF.DF.ECIM2AHOM.IMDINLGNA.IEFLP$PLNBHJIJIKO AKFCADAONGBH.NBNDGMGIAM2F2BMHFHDN.CEA.OG.EBFIBDCJDKCNAHOL.BDAHMADFCEI LCB2KLC2FOCAEIFKBEHEGCBIJFEBMIKEGFBNADOHGJEGJFLNJOJAC.LEIFIJNC2LMBENA FD2L.EJ.DLHLFGJGIABGOJ.NJ2GBE.DANIOMHAIDBLIG2JABEGCL2FA.JNJGLIKE2I.I 3OH2DKODCKCJALG2NJABE3KFHDMOIGDMFHACP$PLGKMJBJA2EKLGDO2DNCD2HKHJGOAKA CMBFNOJF.ENEDNENGHILCHJLICEDBACAKGHDNHDBAOLHFK.DC.JILMCFLOHG2CMIELMIK NEIEJOGFLFLFLOLOKEHOJCEIAOMJB2GKIDFKL.DHCGB.DNLNOLCBHOBLHCKAMC.NJFG.F BJOJNOGBD2FMDFJAJA.BN.MFAI2OKIBAFILM2DFBAGIFLOEL2J2M2C2JG2.M2DIHBIH.K IOBONFC2J.ECLJGFDP$PALGFDICIFL.BCI.GFKIA2HKEAGLOHED2EFJFIG.LHJ2IECGEO JIJEMKEIEO.OHD.GIKGHINMELA.MEGENBNOLDCOK3ODHIDGI.LEKOJINFKNKG2EIC2OKC DLKDNEFMCDHGBDLH2EBKJCGFOC2IMOKDLJLJ.AENLEBMA2OBNFCOKALHDHME.HMFCHEF 2MILHAMCM2CG2DKECD.JLEABJCIOM2FECABJIE.OFADJKCKE.BDJBAKIHDNOBHJOMHGP$ PDFA.LAD.JLAFOGKNFMEHEFE2CBEGLHLIMLOCFNIK2DIHM2LFCAL.JHGHB.HN2.KMOFOL OCJDGJBLO2E.BH.IMLMJK2EGECOJHA2IDGIGMHALCJDAFEGFMDONJA.2MCJNLJIHE.DKJ AFDCFKGKJLM.DGOJIMIONBC.JGAKABLINABHJGKABOKNCHFKCFC.OMJ2DJAGNLG.LK2C 2OLGCOIGKMNMHEAMFKI2G2ONG.D.LEAEILOHEJLE2KDMLNIOCP$PIBCJDFBHJLCGAB2MF M.ANAMBGLODNGCDCBK.FCLBHOHBEFCIJCMGILM2CFHKINGOAFN2JDHIM.ONJGDCG2FLJC FHEMEHDCDGCLFBH.COJEBDAC2LOININ.MKADAHM2NMKBDKOENKGBL2CM.BHN2LAGHDNE. NIK2NEADGN2AELAIACFOBKAGECHEDBFBCICD2OLAHDIOE2ADHBDA.MJBNC.2BLBLA.KFG .H2MEBDIBOABNHEFB3CLNM.ACDEJMP$PJ.A.BCBLD2HMDNL2NHKA4FIAF.2FH2CMDNILF IHKD2MOBLBJMEHAOCAMHEHCDA.FG.MNF2OLBIGHDAOK.GHNJCI.EG2.JNCABKOADIABKN KA.DAKNLJHGBE2ACHG2JEAJL.JCGF2KILAONICAKLM3DFGIOG3.HOMDAIGNEFJIGMNCJK D2CJOAI.NMCNCINMDAIAHIONE2FEGM.OEAHKJ2O2HOAIACFCDJCDNGOD.EJG.GCA.MAKF GAIKHDP$PBEHCNJINJEJHIKFMDGFOKHGFD2EALHKNME2NL2GHJBKGCLCGJBGCGJ.MJFMN MBKHN.CFDLEOIFCAICMILEMDHKCLBA2HLFKCMK2MAF2COCIAHJCB.L2KFJLCKBMCFEAOA FDAIEIGHMHJI.BLDGNHOFAGLBNBDKM2EGNHAECMGCLAGANJNBJ.G2LNBMBAMAEBNDGBHM L.O.OIDOEAFAL.JOEJMOI3LJCDIJ.CL.HAIGLEJFILCMOEJC2EJGKMKP$PFLIH.KFOHLE KFD2FI.EMODKIC.OM2IHJMNEALOAJ2CFOKEJO.HKHEJ2LM2ABEAKJNAHOGHDMEMG.NDMC IHLO2DOCM.JNKABLOHJHMEOLO2GKJNH2.I.GINHC.MJMEBDL.GKMCIJDM.LMKFBJGECKJ 2.K2EALHCGF.MOG2MOLCB.C.MIOAEF.B.IENBK.2BFELD2K2E2IO.FHJ2ECEG2AK2CDGM DNEMKACBEIAD.H2G2BMEALKJAIBA2.I2NFAGP$PBM2KBHJMLC2KLON2DHMEHCDCNIE.HE ODLE2.AFAOB2AGHBAGOM.DNLIFOJNDBEHGODJ2I3.JCNHOJEBFHEFIJE.FAIEKIC.LBEN FOHMNHJK2JCGMKF.K.KDEJ2F2EMLDC.HMOJEG.ALCEJEIFLMCFODEBKGOIMDK2MNLFLKC LOIDHFGLDH.JGANJAKGEHKCEHOKCICKDADCB2.HFKMCIFCOMB2NCEFGAMJM2EMHLNHGLJ E2KNENIJDAONCJKFP$PCIFAKHE.NHAOFGLFAHJMGKDLMH2DLBEMA2IG2FAIGFH2MOMBKB .IEOEG2DKFEHDKOBKBEM.IJOCMDGOJLDBCF2LALOKBJABOHC2FLHB3JE2HIKAHE.G2CJH A.IK.HCIH.DBN.CMC.EIKCE2G.DIOCA.EJNAKDJIAC.GIOGEIK.BGH2JDJIJ.MI.LBHDN OHIHLGONAOIDKHGINGCKNAJHBIMBCFAHB.AIMOFHDKAJNLJIBABINML2N2JCEFJHOP$PN BMIJ4K.NLIOGMABDF.DHGBDOMIHM2CM.JD.OK.LIBFBONCBEIECEHMAEHELJIKMIOCDFE BO2NA.NGEMEGKHK2HBODHCEFEDALCJLGCGNM2C2JEH.J.JCMDI2MI2MBCFGKMOHI.JMJN B.FKO2LICOLM.ENOMFO.K.AC2LK.CKOLFLGMEG.OIAMFENLEKGMI.OK.D.LDCFNLC2BKF ONMKABLHNJCMLAK.DGC.G.KIEJFGCJLOBOJCMF.FJ.NHP$PIOHC.GKCNGAIGLK.HAI.J 2EONMEGDIED.AMFHL2DHBGHNLMDCK.FH2A2KICOD.HEOJEDICFLNEGOG2ENFCFDLJILOL 2.NKCNBA2DJOHGHMD2IHNHAEBJKA2CAI2AMFDCK2DHL2IG2AHJDKNDH2MCKAMCGDL2DNI AKDNJHNOAOKIEAHBHGKNLFGHJMCHEIBKOG2BANFKIBIJLCGEHGCHKBKHNL.DNKAEKIBJH OJAIL2JIGCNAEHK2GJN.DCOIMOP$PKEMH2FLGMHNOE3G2L.IG2NCILFKJCHK2AJM.OFEN ENLBNBNINCKLG2F2B.2MLHEHJIADLMHGLEJCLFHKDG2LM2JDEIFGANJB.OCENJM.ONL2K DNFGBDJAMCBA2BHFMHENCL2.MKGLMCJLEMCJDKEMGOCLHCJMKINL.EACMJ.L2C2H.HEHI FDJIGCBGLELDOJLOE.JBDBLEIEKHLNCDA2BMDN.MLC.CMFJ.KH.FOKBKGIBHFL2BM.ALF IFLANJP$PJNIDENBCGFNFKFCEJCIAL2NHCBEBMJCMIG.DHNGOHEAKABOBLMH2CB.KGIO. 2LDCFCGBLFOC2MOEJA2DFL.ALOLHJ.JLE.DLNHFGBFNL2OMIJNDMFI2ONCNCJNGJF2OBC BJLA2GMBHOHKGKDNOGALGMGAD.CH2AFHOHIDON.EGMOBM.DIL2IA2NECO2DIEFKFEMHOD GM2IJDNOF.KJCFJIJCOEJDHKNBDLCM.2AGFIMKDMGLJGKF2BDBNBODIOP$P.EA.CHBHJK GEFBFLC2DMHFHNKNLFBC.MAEIDAEMO.ACKHCBOELDB2IAKI.2HMLJMIEMHBFNIBACBI.M DFAOJG2K.H2JE2JADKHKIFOADHEG2C2IBM.OM.EMJKAFKDHCNKNEBHFOLGIG.DNDAKJFJ IGFGCJMAFEKGK2H.FENO2JOHKOKLBEH.CMJAJMJOMED.L3COHJ2HDHCBLO2.KDLAF.JBC GKIBE2I.LOINI2MADM2EI.DEFNCGLNAOBM2AP$PKMCIAB2H2CLK.MOAB.A.CLIBJI.EHB DENJBKGHFOIAEKMOEMJIFLG2.2OM2AB2IKOFEBGNKBIFDFEIGADANOJABGDB2CMI2ABFD NJKAFA2IGEDIO2MNKFADFHDN2OLKGMKJC2BIJAJICKJKMDNG2OKENF2D2MEKEANKLOIJM FALALINGL.OHDCOKCJKAEHACDLBEBHOGC2GI.ODOAOFNKALFDMIMIJMLHBH3JONIBDONL I.IMDOIFEILJK.MKP$POAOBM.EL.DGLGF2HL.FMAM2OCAIEIFHGEIDCMO2EMGDAFDLJME HLIDLIKID2.OBDEGBOCANLDIEAOEJCIAGKNHE.FLMEMIC.M3CFEFLGIF.J2DHJEMLDNJO AFBAC.JOHOMDHDONCFDBIDGMCKAHMNO2KIBMELANFINEOJBI2CBLCGLJBLNOFJI2MH.2J M3AOK2L2O.HBDJ.JB2H2DHGM.BHMOEMEBC.DLGBGMFOB.D.IOHKAMG2LANIKO2CLP$PHA IELKAJNMGEL.KJCNEG2JIF.OANKDIGHKB2E.BFO.JLCJGAIGH2BJIK2.FBIJDBODCGHLH LABOHGI.B.CKOKHKOFLJ.IJ.KGJBONFDHDCK.JNKLG2IKOACHBMEOJNKLJ2HLGNHEICAD KOCMALBEMGOGLEKLMJFKHGICMNLNGFDEB.LAEBCJEJMIDIBMLD.KLJE2BCE.KFEABOH.C OEMANFOBOEAEHGNLAGHCFDFEIEIJ.JLFKLMAN2.BCGEFIP$PKDC.EJEDOKIKO2EKBNCF 3M2EADANIJHBMECDCDIHNMLKDLEOKOF.LIAFJEIL3B.AHKMKILDKOJ.IA.ICNDMA.NG.A JD2EGBLHNG.CBGIEDEDFMBCBGAOMJBL.KBLAOMLNAHCOIGFMCGBNINDBCDBJ.GH.ON2.N IOMIMIFJFANFOKGB.2KCDHO2E.LNGJFO.JBNI.2HAFG.3GHBCDEGAGKHIFIKNAIECJBMI MHKFKED.LDOGL2MGMOMLILBDP$PFNAOHA2LMKNLMIJ.C.CDEMJ2BF2BAM3BJFN2L2EFDK LGLKDMEBNGMNOKLMNJHCOKJLDHJEFHANEHKOA.OIKEGACNK.MGL.JHODKJEHMNLEMHA.D LCJLHEBFGFOJMOEOEH2NM2ACNJB2JEABENGJNMLKAF2KJEAICJH2A2NB.EACNFIOBCG2. DKCHDBLFICOBAEOA.M2CAJDKGMBH2K.EKOJMG.GCJ.AFGFGHFGFH.JM.HIDGCOKLANCDL KJDKP$PCO.2AOAOBDGIL2M.IJCIDF2D2BMFI.BLGNAN2M2HOGI3HMIN.A.FGCKDLJODNJ DB.IHOJKNAGOJHIMDBACAEKOMNHLCHCEOAK.DKB2GNMJMHC2HGOGIJDBE2DLO2GBGBMGI KCHKMAKHAJEAENFNKDJHBNEGOJBHGEJLBMECFG.KJBIHKDKOKO2HANCIKOKABFDFL.LBK BLDAFKJOHDEBH.DH2FCAODM2NLFNKFA2FLI.DL.MELIJIFNMBKCAOP$256P! golly-3.3-src/Patterns/Other-Rules/golly-ants.rle0000644000175000017500000000303712026730263016765 00000000000000#C Two ants write "golly" in a period 34,332 oscillator. #C Alan Tennant and Dean Hickerson, Oct 2009. x = 97, y = 56, rule = Langtons-Ant 68.2A$67.A2.A$66.A4.A$65.A6.A$7.2A4.3A8.3A37.A8.A$6.A2.2A.A10.A3.A35. A10.A$5.A7.A10.A3.A2.2A29.A12.A$5.A.4A3.9A2.A2.A3.2A27.A14.A$6.A4.A. 5A.A2.A.3A2.A2.A27.A16.A$2.2A4.A2.2A5.A.2A.A.A.3A.2A.3A22.A18.A$.A4. 3A3.A4.A3.2A.A2.A3.4A.2A20.A20.A$A4.6A.2A.A.2A2.A.A3.4A2.A.3A19.A22.A $A.2A4.3A.A3.2A.A2.3A.2A2.A.2A.A4.A15.A24.A$.A2.A3.A3.A.2A.2A.2A.4A2. A.3A2.3A2.A13.A26.A$3.2A3.A4.A.2A6.A3.A2.2A.5A3.A12.A28.A$3.2A3.A7.A 2.2A.A4.2A.A3.A.A2.A.A11.A30.A$3.2A3.A4.A.2A5.7A2.4A.A2.A.A10.A32.A$ 3.A2.A.A4.A.2A5.A.2A.2A2.2A.3A2.A.A9.A34.A$3.4A3.A3.2A.3A2.2A2.A4.A. 2A.2A2.2A8.A36.A$8.3A2.H2.3A.A.4A3.A.A.3A4.2A7.A38.A$8.A4.A.A.2A2.2A 2.A5.A2.A.3A.2A6.A40.A$4.5A3.3A.A4.A3.A2.3A2.A2.3A.2A5.A42.A$3.A3.2A 4.2A.2A4.A.A4.A7.A3.A4.A44.A$2.A4.3A.3A3.2A.A.A.2A3.A.3A3.5A3.A46.A$ 2.A3.3A3.A.A.2A.6A2.3A2.A2.2A.2A.A2.A48.A$2.A4.2A3.7A.2A2.6A3.A3.2A.A 2.A50.A$2.A2.A.A3.3A.A2.A2.A2.A.3A.A.A5.3A.A52.A$2.A2.4A.A2.2A2.A4.A. 4A3.A.A2.A5.A53.A$2.A6.3A.A2.A.3A.A3.4A4.3A.2A.A54.A$3.A4.A.3A2.A.A. 4A2.6A.2A.A2.3A54.A$4.4A4.A.A.3A2.2A2.2A3.A.A3.A.A.A.A51.A$11.A4.3A2. A.2A4.A.2A2.2A2.4A.A48.A$11.A6.A.A5.3A.A2.3A4.A2.A.A46.A$12.A4.A2.A.A 4.A2.2A.A.A.A8.A44.A$13.4A4.2A.A.A.A4.5A9.A42.A$22.4A2.A.3A2.2A11.A 40.A$25.A.A2.2A.F2.A12.A38.A$24.4A.3A4.A13.A36.A$24.A3.A3.A.3A14.A34. A$25.A10.A15.A32.A$26.A4.2A2.A17.A30.A$27.4A2.2A19.A28.A$55.A26.A$56. A24.A$57.A22.A$58.A20.A$59.A18.A$60.A16.A$61.A14.A$62.A12.A$63.A10.A$ 64.A8.A$65.A6.A$66.A4.A$67.A2.A$68.2A! golly-3.3-src/Patterns/Other-Rules/animated-pixel-art-sample.zip0000755000175000017500000003244613543255652021702 00000000000000PK‡TÌNÓ‡sí.^AnimatedPixelArt.ruleí}mݸ±æ÷þ`¸P&⫨w7í¶å·ÜMp“öÛÀ±{bïz܆»ç&ƒ‹ýïKR*ªÈ*µH~`»áLŠÕ¬‡ÏyD²Nµ¨sþðïÿó/.×_>ýôîáöß?ýóöóõ·‡«ëË·Ÿ?ß^>ÜÞúû—Û—ï¾]>Þ^Þ»}÷ðéîËåîÇË»-èò5D]Þ}{¸|úryy÷ùó/ß_ýåÁÿêþ2^î.bô¿ô±wŸï~þýï=Þ»‡Ë‡»/ÿõárÿpç;¼ûòËå݇ŸÂï>{0?êOq¸ï/ýxûËåÛí×ÏïÞßúî\(ù[iäå“çrùzûíÓ݇Àëóí}ÿr1—O÷ñ5øQ%ˆZÇô/êӷˇO÷ù—¢'òÁ#Þß¾¿óFð}»üÇ»Ï?ß—|üôþãåï·÷—ûŸ~ ¯þýç»÷ÿçŸî=ÿow?û€ “ü§\_æ>¬ø­P" :<Ü}õD|ððß¾Ü~»Ä‹À+ÿš/_ß}¾}x¸½ü|ï‡úÇ»ûõ xûo¿\þòõööÃ/7?ÿí6]ŸxßÜ}úòà¼ÜDêÞ nî~úzûÕ½üö¿]>><|ýýï~ûß!âû÷w?ýÎý¼ý÷‡¯w÷÷ß¿»ÿúßÿúúù¿J3ñ_þ,!”Ö¿Yÿïêê½~öÇW_~X/Ëï/Ò¨«/·Ÿþþñowß>ÞÝ}øýåßî¼ÖW÷¿üôÓí÷O¡Ï—»/·WWÿñÎÓþ|ù×Ë 195=3;ˆinó ÇAŠAÊAªAêAšAÚANƒtƒœ5J JJ JÊ Êj”Ô<èqÐbÐrÐjÐzÐfÐvÐÓ Ý çÁŒƒƒ‘ƒQƒÑƒ1ƒ±ƒ™ã3v¬¬¬¬¬¬ì4X7Øy˜ÆaÃ$‡I “&3Lv˜¦arÃ4nœœœœœœÜ487¸y˜ÇaÃ,‡Y ³f3Ìv˜§avÃ<býÿ¼£dôŠŒ^’Ñk2zQF¯Êèe}?áûÝ‚pA¹ ]Ð.ˆÔ òyý„PÈ ¯ïç5^DáU^Fáu^Há•^J?Eÿo¼*wïãUQášø¯¬ðÒ ¯­ðâ ¯®ðò ¯¯ð ¯°Ðáâù~^dáU^fáu^há•^jáµ^laÂUöý¼Þ .¼âÂK.¼æÂ‹.¼êÂË.¼î†éàûyé…×^xñ…W_xù…×_ø üþˆ)ÌßÏ_á/ƒð×Aø !ü•þR-„¿Â_ áÂóýüþŠI„¿&Â_ᯊð—Eøë"ü…s˜‰a*ú¹è/ô—FúK#ý¥‘þÒHi¤¿4Ò_é/aÎú~þÒHi¤¿4Ò_é/ô—FúK#ÃÔs;Nnß/Lï0¿Ã3|þáã»ûq;G ãÒqØ8•Ý:Eœ>pû‡O[Dý,I¡i4µÍ³]éi»2ó¦¤Ü^¹Î˜Æ;6"î*®e×ã×T\5q‘ˆêR?I1Õ5Vm±f›Ó6æí‚Ëíi…©Ê56ìW*î9&îS\ûqq‹¸Õ5¤~`ªÛpÛK4Ûº™Öyç¯Øæ›ŠóSU«Da_Uqo4qsqŠ{ˆ{¢º†Ô/QLuUÛ•0[ì´.ǸÌĶ,TœÆ˜ª^% û¿Š{¸‰û°‹{iÜ*EÜÚÕ5¤~‡ÀT×XµM³½D·îq7ÛêUqµaªf•(ä)sùÂÅ=?îè"îÀˆêR¿Aaªk¬ÚæµÙ®„[cã¦%¶MFÅMSµ«D!Ÿª˜mÌk.榘xDLˆêR¿?bªk¬Ú–ŸÝ&Œ[_bŒÛ^¨âÞ…©N«D!ï똻mÌ¿.æÐ˜EÌgˆj iØž1Õu8µív›×n½ñ%ŠmËVq‹ÅTÝ*Qx¢ã{ ß'¸˜ëc1í"ª1¤!;`ªëpzÛÌì¶üÜ:aâ•[¬Š™SW‰Âû(ß Ùø~ÆÅ÷$ñ݆ˆïÕ5¤>9aªóJuÛsí¶K¸u^Ç #¶—¨cÂÊR@Ì2¾áÓñM›o¼\|óßÉø.ç€5¦5;nI`MXz{ c··n}‹S¿ØRµÞ‚×CAC8õ3ăÁ”á?*üG‡ÿ˜aK¾¡1 ctÊÚ˜bÒ#aÌ8gäÄ$šÉ‰=!‘Mää$›ÉÉ=!‘“MäÔ¤šÉ©=!‘SMäô¤›Éé=!‘ÓMäÌdšÉ™=!‘3Mä¶ ÛLÎî1錜m"7­AS39ƒÎÈMMäÜäšÉ¹=!‘sMäæ5hn&7ï1éŒÜÜDNl)B´çˆP¸YBœEÂXW¿¹üøóÃÏß¶§.þÓv¤ßSŽÏÜ_Æ+”z6àqØÆÛÉfÈ‚‰ÙÉl5"UÒ‘”-NèÈ :‚‰*é(J‡ƒ–'tTÉD•t4¥ÃA«:º‚Žb¢J:†Òá õ SA‡ÎeCèXJ‡ƒ6'tlÃD•t&J‡ƒ¶'t¦ :–‰*é8J‡ƒžNè¸ :UÒ™)ÚЙ+è8&ª ã‹ B‡ƒž§#¹­³¤33Q%fW¶8Ù—e;¼&"¬d”6fAò„@Øg|$Sò¡tÈÆ,¥#è“㣘˜’¥C6f¥)Á@Ÿä ¥+è<¡ÈƬ ¥#è“<¡L’'Ù˜•¥t8áOò„²tHžPdcV¥Ã ’'ÔTA‡þ­lÌÊQ:œð'yB¹ :†‰*éÌ”'üIžPs’'Ù˜õHépŸä Ím%’'4Ù˜µ t8áOò„æ6‡’ÉšlÌZR:œð'yBs›CI‡ä MveÍìÊ‚Sþ,Oèš}™æ M6f6fEò„BØg|4Sò¡tÈÆ¬ ¥#è“<¡M’'4Ù˜µ¥t$}’'´­ Cò„&³ž(Å@Ÿä =UÐ!yB“Y;J‡›'yB» :ô¶Ù˜õLépóà$O蹂Ža¢ :f¤t¸yp’' ·K:$O²1Aépóà$On5–tHž0dc6’ÒáæÁIž0Üj,éÉ“« CòÄD6æi¦t$}’'¦¹‚ÉÙ˜ÝHé(ú$O8î—tHžpdcv‚ÒÑ ôIžpÜ.é<áÈÆì$¥cè“<Ḡ\Ò1LTIGQ:–>ÉŽ»À%ËD•t4¥Ã-Ú“<Ḡ\Ò!y‘ÙJ‡[´'yÂq¸¤Cò„#³³”·hOò„ã.pI‡ä GveÇìÊ‚[µgyÂÕìË4O8²1»´1O$OLûŒcbJ>”Ù˜ÝLéú$O¸¹‚ÉŽlÌóHéHú$OÌœ¢%’'f²1Ï‚ÒQ ôIž˜9EK:$OÌdcž%¥£è“<1sŠ–tHž˜ÉÆ<+JÇ0Ð'ybæ-é&ª¤£)Ë@Ÿä‰™S´¤CòÄL6æÙP:}’'fNÑ’É3Ù˜gKép{ÈIž˜9EK:$OÌdcž'J‡ÛCNòÄÌ)ZÒ!yb&»òÌìÊ‚ÛDÎòÄ\³/Ó<1“yN³#yÂ!ì3>3Sò¡tÈÆž–'|ƒ}öÅȽ"F ÊH2àgÏPŒÜË(‘dÂ#I)üì1Š‘{%#úÅH3e¤ð³')Fîe”Œ˜Ç‚è“&£¦Œ ~’4âÁŸå”ýYÂÇHѤBŸ&èqBú w–Vö' #Eó }¦P ‡ éãÞüYfÙŸ+|Œ”á⩉!ÅŸ%—ýéÂÇHÑìBŸ/èCúèw–_ög #E }ÊP Ç éàüYŠÙŸ4|ŒÍ1ôYC6¤gðgYF±[nIЦúÄ¡PÜŽ.X|q¶§«ª=}ýeø›Ë—Û>$VÌuŒWwñc$Wè³@ZBØNš‹| Å‹¼vŒFÄù«z8L]`„ã‘ Ýö'qD§nbÃÖªC7ãÀU«[ŒlÒ †ÃÔktóA…nûÉtÙ©›Ü°îÐMâ8pÕê#›tƒá0õÝ|P¡Û~RSuê¦6lk:tS8\µºÅÈ&Ý`8L½F7Tè¶Ÿ\Òºé {²ºi®ZÝbd“n0¦^£›*tÛïä›NÝ̆í¦Ý ŽW­n1²I7S¯Ñͺíw¶l§n€=»Ý,ŽW­n1²I7S¯ÑÍåºÉý¯¹S§nÓŠí‘:tËâÀU©ÛÙ¤[ BÔ+t A…nû/\§nnÖc‡nÇ«V·Ù¤ ‡©×è&ÇR7ÅüY¼M·yÃöo©Ûu›q¸ju‹‘MºÁp˜zn>¨ÐMsjNlƒÇêPNŒ80ùjµÓÍ5C0£_£ž&Uƒb>‡p›¢N¼M;a Ú8\•Ê­‘øsÕÃaê#TV[Ìçrµé&6l­;t8\µºiݪ ‡©×è¦IÕ°?u+;u“¶1ºI®ZÝŒiÕ †ÃÔkt3¤jØŸBSº© ÛÚÝŽW­nÖ¶êÃaê5ºYR5ìOeèNÝô†=Mºi®Zݦ©U7S¯Ñm"UÃ~JÙtêf6lç:t38\µº9ת ‡©×èæÊªAì§öl§n©"™;t³8\µºÍs«n0¦^£ÛLª‘ª†©S7¨¶ÄØ¡[®JÝÖÈ&ÝR¢^¡›¤jÌÈ6ÝRµ%:ts8\µºIѪ ‡©×è&IÕ ˜#?mº¥jKvè6ã8pÕê†ï2ÔéÃaê5º‘» Rs÷¶Û„Û«­žŠ!?EÉÐRm5× iÀŒ~zô^ƒb>f}›²N¼TmikÐnÄqàªTnÜ^µlSáx¤²Úb>v¸M7±akÓ¡›ÀqàªÕM›VÝ`8L½F7Mª†ýC…d§nrÃ6¶C7‰ãÀU«›±­ºÁp˜zn†T û‡l¨NÝÔ†m§ÝŽW­nvjÕ †ÃÔkt³¤jØ:׺é {rºi®ZÝ&ת ‡©×è6‘ªaÓtêf6l7wèfp¸juss«n0¦^£›#UÃþL’íÔ rõ8vèfq¸*u[#›tƒá0õ ÝBPYm1µ¶é–ª-Ñ¡[®ZÝ„hÕ-!ê5º R5ìÇM]§n©Ú’º9®ZݤlÕ †ÃÔkt“¤jPÌã mº¥jKuè6ã8pÕê†ï2ÔéÃaê5º‘» Rs‡vÛ„Û«­žŠ!?EÉÐRm5× iÀŒ~zô^ƒb¾Ej›ªN¼TmkÐnÄqàªTnÜ^µjSáx¤²Úb¾U¥M7±akÛ¡›ÀqàªÕMÛVÝ`8L½F7Mª†ý3Se§nrÃ6S‡nÇ«V73µêÃaê5ºR5ìŸ!¨:uS¶uº)®ZݬkÕ †ÃÔkt³¤jØ?SKwê¦7ìiîÐMã8pÕê6Í­ºÁp˜znSY5„/I'ÕV›nfÞÇÝ ŽW­nóت ‡©×è6“ªaÿ¼Û©[ªHD‡nÇ«R·5²I7S¯Ð-•Õó©=mº¥jKvè–Å«V7![uKAˆzn‚T ûst®S·Tm©ÝŽW­nRµêÃaê5ºIR5ìwæNÝRµ¥;t›q¸juÃwêtƒá0õÝÈ]‰î2ô {µÕS1Äâ§(Zª­æš! ˜Ñ¯QÞkPÌ—änÓ@׉—ª- a Ú8\•Ê­‘Û«ÖMÃaê#TV[Ì—F¶é&6l=uè&p¸juÓS«n0¦^£›&UÃþ•²S7¹aס›ÄqàªÕ͸VÝ`8L½F7Cª†ý#ÒU§njös‡n Ç«V7;·êÃaê5ºYR5ì¬;uÓ¶;tÓ8\µº¹±U7S¯ÑÍ•Uƒ˜™oÓÍlسèÐÍà8pÕê6‹VÝ`8L½F·™T ûgÉÙNÝRE";t³8\•º­‘MºÁp˜z…n!¨¬¶˜%mÓ-U[ªC·,\µº Õª[ BÔkt¤jØ? Äuê–ª-Ý¡›ÃqàªÕMêVÝ`8L½F7Iª†ý.ÃÜ©[ª¶L‡n3ŽW­nø.Cn0¦^£¹Ë Ñ]†Þ‚a¯¶z*†Xü%CKµÕ\3¤3ú5êÑ{ *U »xÛ40uâ¥jk‚°íF®JåÖÈíU›¦á0uŽG*«­ý#k:u¶vº ®ZÝ´kÕ †ÃÔktÓ¤jØ¿ñNvê&7l3wè&q¸ju3s«n0¦^£›!UÃþ PªS7µaOc‡n Ç«V·ilÕ †ÃÔkt›HÕ°#ŠîÔMoØNtè¦q¸jus¢U7S¯ÑÍ•Uƒ˜™ïÔjÓÍlسìÐÍà8pÕê6ËVÝ`8L½F·™T ûçdÛNÝRE¢:t³8\•º­‘MºÁp˜z…n!¨¬¶˜ï\hÓ-U[ºC·,\µº ݪ[ BÔkt¤jØ?ùÐuê–ª-Ó¡›ÃqàªÕMšVÝ`8L½F7Iª†ý.ÃÜ©[ª¶l‡n3ŽW­nø.Cn0¦^£¹Ë Ñ]†Þ‚a¯¶z*†Xü%CKµÕ\3¤3ú5êÑ{ *U »xÛ4°uâ¥jËAXƒv#ŽW¥rkäöªmÓp˜ºÀÇ#•ÕÖþYœº‰ [Ϻ ®ZÝôܪ ‡©×è¦IÕ°¡·ìÔMnØvìÐMâ8pÕêfÇVÝ`8L½F7Kª†ý nU§njÞD‡n Ç«V·I´êÃaê5ºM¤jØ¿ðQwê¦7l';tÓ8\µº9Ùª ‡©×èæÈ§'ÍÌW·éf6ìYuèfp¸ju›U«n0¦^£ÛLª†ý;€l§n«GÝ¡›ÅqàªÔmlÒ †ÃÔ+t AeµÅ|¥\›n©Ú2ºeqàªÕM˜VÝR¢^£› UÃþ‘î®S·TmÙÝŽW­nÒ¶êÃaê5ºIR5ìwæNÝRµ5uè6ã8pÕê†ï2ÔéÃaê5º‘» Ýeè-öj«§bˆÅOQ2´T[Í5C0£_£½× RÕ°‹·Mƒ©N¼TmÍ݈֠ãÀU©Ü¹½ê©i8L]`„ã‘Ê{4©jº‰ ÛŒº ®ZÝÌØª ‡©×èfHÕ`SÕ ;u“¶ºI®ZݬhÕ †ÃÔkt³¤j˜RÕ :uSö$;tS8\µºM²U7S¯Ñm"UÃþ}öºS7½a;Õ¡›ÆqàªÕÍ©VÝ`8L½F7G>=iNUƒéÔÍlسîÐÍà8pÕê6ëVÝ`8L½F·™T û÷›ÚNÝ W¦C7‹ãÀU©ÛÙ¤ ‡©Wè‚Êj‹ùÆì6ÝRµe;tËâÀU«›°­º¥ D½F7Aª†ý»ª\§n©Úš:ts8\µºÉ©U7S¯ÑM’ªa¿Ë0wê–ª-סیãÀU«¾ËP§ ‡©×èFî2Ht—¡·`Ø«­žŠ!?EÉÐRm5× iÀŒ~zô^ƒNUÃ.Þ6 \xPmé´q¸*•[#·W횆ÃÔF8©¬¶öoOëÔMlØFtè&p¸ju3¢U7S¯ÑͪÁ¦ªAvê&7l+;t“8\µºYÙª ‡©×èfIÕ0¥ªAuê¦6ìIuè¦p¸ju›T«n0¦^£ÛDª—ªÝ©›Þ°îÐMã8pÕêæt«n0¦^£›#Ÿž4§ªÁtêf6ìÙtèfp¸ju›M«n0¦^£ÛLª†1U ¶S·T‘ØÝ,ŽW¥nkd“n0¦^¡[*«­T5Lº¥jkêÐ-‹W­nbjÕ-!ê5º R5ì_Âë:uKÕ–ëÐÍá8pÕê&]«n0¦^£›$UÃ~—aîÔ-U[s‡n3ŽW­nø.Cn0¦^£¹Ë Ñ]†Þ‚!U[¦§bÅ)J††jË4× iÀŒ~zô^ƒNUÃ.Þ6 æ:ñRµ% ¬A»Ç«R¹5r{ÕsÓp˜ºÀÇ#•ÕÖþ-oº‰ ÛÈÝŽW­nF¶êÃaê5ºR5ØT5ÈNÝä†mU‡nÇ«V7«Zuƒá0õÝ,©¦T5¨NÝÔ†=éÝŽW­n“nÕ †ÃÔkt›HÕàRÕ ;uÓ¶3ºi®ZÝœiÕ †ÃÔktsäÓ“æT5˜NÝ̆=ÛÝ ŽW­n³mÕ †ÃÔkt›IÕ0¦ªÁvê–*’©C7‹ãÀU©ÛÙ¤ ‡©Wè‚Êj+U S§n©ÚrºeqàªÕM¸VÝR¢^£› UƒLUƒëÔ-U[s‡nÇ«V79·êÃaê5ºIR5ìwæNÝ Ú‚»MºÍ8\µºá» uºÁp˜znä.ƒDwz †½Úê©bñS” -ÕVsÍÌèרGï5ìß ½‹—¾ço¬“/Õ[2Å5È7fà«TOàï†*ÄìEqO=ê™,|µêÍS³z0 f_¥ÞL*‹1U¶[½T·¸õl¾JõÖÐ6õ`@̾F½UÖe©¾˜ºÕK•ÙÜ£^¾ZõÄܬ^ŠBì«Ô¤ÊP©ÊpÝêA}¦Æõ\¾ZõÔØ¬ ˆÙW©§H­±ß›˜»ÕKUšèQoÎÁW«¾?Q© ˆÙW©GîPHt‡¢¿Ø[µ!MWµ!Æ,29k4íõF2{Uú°?Üüéú÷¿\¥/z¼LêJxÑôež/B‰+>=|#U¸sv¥Â©»ðí…!ì•ö=TøÈð|ç•ñóWú«à=Æ\ùþ£¼øÎÎ]ùx1_œ¼XwåÂù ÿ»ù2Ë«9ü9Ç¿Q7áÄî ‡oTO ]ùAvJÙ ÙÙÙÙ²²çÝ–èåK4®”™*ké¬e²–ÍZSÖrYkÆ-5f­ìJ¨Œ‹>»0:oš¼ióæ”7]Þœ³¦"kм™Ï³Ò:Ÿ/&oÚ¼9åM—7ç¬iƼ)ò¦Ì›ù´59+còilóæ”7]Þœ³¦ó¦È›2oª¼™¯&›³²6_]SÞtysΚӘ7EÞ”ySåM7óE>嬦 /z‡3j¸7nHÜP¸¡qÃàÞifàÞwfÔ˜Gܸ!qCá†Æ ƒ7ðf7c~᢭O„ ‹›"oʼ©ò¦Î›&oÚ¼9åM—7sVaÆ[²_#y[mU´uÑ6EÛí©h»¢]¤Yðó›u–3ü†·UÑÖEÛm[´§¢íŠöœ·U‘ÃTÁOe‰ g2…S™Â¹Lád¦p6S8)”Ï„Æù\ãLª1e4¡uÞ4yÓæÍ)oº¼™å5aƼ)ò¦Ì›9+“ç6aLѶE{*Ú®hç Nرh‹¢-‹¶*Ú?›§9amÑžŠ¶+ÚyªÓX´EÑ–E[m]´ ~SžñÄ4mW´ó¤'ÜX´EÑ–E[m]´MÑ.ø¹<ù çŠvžþÄ<mQ´eÑVE[mS´mÑ.øÍ8ЧÂðšpKd-™µTÖÒYËd-›µ¦¬å²NŠRŒYKd-™µTÖÒYËd-›µ¦¬å²VÆEfÙ1lŸYSæM•7uÞ4yÓæÍ)oº¼™eG©rV*OŽRÉ¢­Š¶.Ú¦hÛ¢=mW´óä(õX´ ~:OŽR«¢­‹¶)Ú¶hOEÛí<9J3mQ´s~x}ó§ÿñ—«ÿõç»úÝ¿\þñéÃÃÇËÇÛOÿøpùòóO?ÄRÿþòþã»o÷?|½ýöÃ×Oÿ¼ý|ù—ß]}7…Ûþ?~Ò~çcמáß_Þ_~3Ɵ﮾»-?™œž}ëYhYgÕ;å[7¡5«Yº¾õ<¶¦jÒ¾õ"´œyïn¥o-¡õ£üñÃ?úÖˈb•2η^…Ö4/­o½­÷·öƒyï[oBëÖ¼3Ó­o½­?|pûîÊS[ÉgÏ¿Õz¶YÁ¼.|{?ˆÍ`nn¿պ٬`^¾½ óüyø·ZÏ7+˜×…oïǼxþ­Ö‹Í æuáÛû±0Ëþ­Ö²YÁ¼.|{?æåËðoµ^nV0¯ ßÞ…yõ*ü[­W›Ìë·÷ca^¿ÿVëõfóºðíýX˜7o¿Õz³YÁ¼.|{?æíÛðoµÞnV0¯ ßÞ…á­åÑß20xºïÖÂøž=¾nÈb¸¹YßÍã‹á9Y ÏŸ/Œïùã‹áY /^,ŒïÅã‹a!‹áq‹…ÁÓ}·Æ÷òñÅðŠ,†W¯Æ÷êñÅðš,†×¯Æ÷úñÅð†,†7oÆ÷æñÅð–,†·oÆ÷–,†gëw>‹>b-Œ,ˆÍ`xkyô·«•9ã$'ÖÂøÀbaâ$'ÖÂøÀbaâ$'ÖÂøÀbaâ$o²X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°v˜›õÇ;oâ$'ÖÂøÀ‚Ø &Bka|`±0¼µ<ú[&Nrb-Œ,&Nrb-Œ,&Nò&‹…‰“œX ã‹…‰“œX ã‹…‰“œX ã‹…‰“œX ã‹…‰“œX ãk‡y¾þxçó8ɉµ0>° 6ƒ‰“œX ã‹…‰ ‰µ0>°XÞZý-'9±Æ 'y“ÅÂÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñµÃ¼X¼óEœäÄZX›ÁÄIN¬…ñÅÂÄIN¬…ñÅÂÄJ¬…ñÅÂðÖòèo˜8É›,&Nrb-Œ,&Nrb-Œ,&Nrb-Œ,&Nrb-Œ,&Nrb-Œ¬fY¼s‰“œX ã b3˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜¨±Æ ÓoeÎ8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°v˜—ëw¾Œ“œX ã b3˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜({“ÅÂðÖòèo˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°v˜Wëw¾Š“œX ã b3˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8ɉµ0>°X˜8É›,&^=b-Œ,†·–GËÀÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñµÃ¼^¼óuœäÄZX›ÁÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñÅÂÄIN¬…ñÅÂÄIÞd±0q’ka|`±0qka|`±0¼µ<ú[&Nrb-Œ,&Nrb-Œ¬æÍúãoâ$'ÖÂøÀ‚Ø &Nrb-Œ,&Nrb-Œ,&Nrb-Œ,&Nrb-Œ,&Nò&‹…‰“œX ã‹…‰“œX ã‹…‰s‰X ã‹…á­åÑß20q’ka|`í0o×ï|'9±ÆÄf0q’ka|`±0q’ka|`±0q’ka|`±0q’ka|`±0q’7Y,LœäÄZX,LœäÄZX,LœäÄZX,Lœ’ÄZX, o-þ`®×Ÿï +ÂXààÌc3rç³ýR:„áaž¾½s³ŸCJ‡0èwã'9ÌH‡0Âb(|©ßL9NüC+õ;€ñ“f¤Ca1¾ÔïÆOr8˜‘a„ÅPøR¿?Éá`F:„CáKý`ü$‡ƒéFX …/õ;€ñ“f¤Ca1¾ÔÃÄ’/À„7»×p0#‹¡ð¥~)6‡yÞ, ‹¡ð¥~07a› :„CáKý`ž‡ ,t#LµÂ—úÀÄŸÕJ‡0Âb(}Ðï&…ĉh¥~0~’ÃÁŒt#,†Â—úÀøI3Ò!Œ° _êwã'9ÌH‡0Âb(|©ßŒŸäp0#‹¡ð¥~0~’ÃÁŒt#,†Â—úa˜xL(Ù®á`F:„~YøR¿›Ã< oyƒ…a„ÅPøR¿˜›ðf!Xè†ÿey0#õ;€y¶Ù`¡Cþ—åÁŒÔïæE˜ ÁB‡0ü/˃©ßLüi°`ü$‡ƒé†ÿey0#õ;€ñ“f¤Cþ—åÁŒÔïÆOr8˜‘aø_–3R¿?Éá`F:„áYÌHý`ÂߎbGtÃÿ²<˜‘úa˜øç·þðp 3Ò!ŒÐ¯ð¥~)6‡y ·`¡C¦<˜‘úÀÜ„·¼ÁB‡0ýþGJ²lËIV””hR¼ûñwLÏú¬¹ô_<)fìÁ߈€5cÉï% ‹<)E¼d¿E"öÃsk¿›ÆÙ€}û·wÁl›uÒ¥`¼fÿÙ6uÖdqŠ3‘øÏK˜œ‡1“ Á¦±ð¤.Y8g^î/Rþ<øó—ì. ‚­¥Œü-±œ°“!³køûà Lã|O›žd³pù+Xeˆ¼å–y³™ON¼@™a0 ÿ/ʱņ ±e±ˆo*°I¹°ëü#¿âÌËγÝH”£%»b~¢Î‚=Ä|¿fÀAý˜Íü>¶2Àf°ˆiˆÍÅl婸ȼ¬þtÁž…LX²ðç¤Ë4§ß×~‚SÅaŠm¤ ßp}ø}û£]·•Dô‘ #`Ï%ÅK'$÷ñæ,Ró4ØÚ ¾ËÜ$ µˆ5)éûÏ Éž¶øø»÷éçüFëë+×=‹Ô«8&¢Ž4™¥ Ä]{‰ÎFŒÉc$ÄlÛNŸDž«™{U Ð_JÊô¶ ÜCf¨¾DBª\; U"ÿC»v¤úù- ™X^}~ý³Á¯jWö‡ÙvÝqÎôKsoXƒ];l‹·s}¡kªQªBC™šFÔI§ºkEÖq«˜6 ÔÎÓ‡ô¯SݵʿL£j½uÜ\ËvZçy/»åFS¦¡Hî­ü_ÎöÆŒµk²«k˜Ýo¸•]«ÜoÙ5Z«Ð˜Â}¬ñ€dNG÷EVìH†íûC8L™FÅd‰Ø‘Ý*m¦ §HÜC]2¢æ}ŸŤ­Û^ÜßžÌõ¥ ]Ý"TJÇC}õêÑqC\ÝvÜÈbËmóùáðžr¯º&®€w\:Þ»+à'/Sº‰ßºeßq™_ ûë§/SçÜ­YZÀ±œ˜hz‚–Y®œ8ú‡þ¨P\i±ãrâª'Ʀñ¾>ç×;‚rS4zÅ®Ÿ0‡½€³¹bÄW¶M£0bÔ}œŽ¨§ÕöË™Ø3Áܤ#GÅDzWß “m¾¦¾| k¶•”Ô'iô6º²W>JæÐµ`Y>¦½´ã(Kð‰‰Á ^EBîa§.{Åayþq«J¸Ÿ3Éã¶I½Ñ ¦ñ(Dzcöà|Õ\µàó‘+k\s`3Þ¨îh$NâÀ–#ÇJÚMZd,ô¢Ÿ9P·DS¢¢\Å“"ea Œò´CH\“qeR…yÀ Šo&Û&uü?tÅ ,ùÀeOjc}e8c„xÇx¦qxOÇþ^@-bsrÅ@€[k®šÍ!¬<™E¤˜¶¬ÁúЦ[JáW°`™’‰’J•fJKåPv÷‰\ýå„)þNå‰U®œ²s]™ÊÏM‘9*KŠP mœ¢üµµ¼0óBÍÏøê@ ÓaʪŒyV#=5>}Óh[ê¢À^@Q›÷*ù¨$Žoš±2MåJ^”“_þPK‡TÌNÓ‡sí.^ AnimatedPixelArt.rulePK™TÌNø7"ä' /animated-pixel-art-sample.rlePKŽ‚4golly-3.3-src/Patterns/Other-Rules/HPP-demo-small.rle0000644000175000017500000000261012026730263017347 00000000000000# HPP Lattice gas # # J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. # # The earliest lattice gas model. Later made obsolete by the FHP gas on # a hexagonal lattice, which has better physical properties. # # In this simple demo, four gas particles bounce around inside a box. # They pass through each other unless meeting head-on, in which case they # collide and the particles leave at right angles to their initial # directions. Although it seems trivial, this is sufficient to simulate # fluid dynamics - see HPP-demo.rle. # # States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf # # Each cell can contain up to 4 particles, each moving in one of the four directions. # Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. # Next state is simply the collected inputs, in most cases. # The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). # # To make the gas useful in Golly's infinite area, I've added reflecting boundary # states, 16-31. These work in the same way as gas particles (collecting inputs) # but reverse their direction. Contact: Tim Hutton # # Sink boundary: (or you can vent to the outside but this way is neater) # 32 # Source boundary: (haven't really worked out how to use this well yet) # 33 # x = 14, y = 10, rule = HPP 14P$P12.P$P12.P$P8.A3.P$P12.P$P12.P$P3.M8.P$P12.P$P12.P$14P! golly-3.3-src/Patterns/Margolus/0000755000175000017500000000000013543257426013677 500000000000000golly-3.3-src/Patterns/Margolus/HPP.rle0000644000175000017500000000274612026730263014751 00000000000000#CXRLE Pos=-10,-10 # HPP Gas implemented in the Margolus neighborhood, as described in: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # one particle moves to the opposite corner # 1,1,0,0 : 0,0,1,1 # two particles pass through each other # 1,0,0,1 : 0,1,1,0 # two particles collide head-on # 1,1,1,0 : 0,1,1,1 # three particles pass through each other # x = 20, y = 20, rule = HPPMargolus_emulated:T20,20 20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$12BD7B$BABABABABABA BCBABABA$20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$20B$BABABA BABABABABABABA$20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$20B$ BABABABABABABABABABA$20B$BABABABABABABABABABA! golly-3.3-src/Patterns/Margolus/TMGas_largeWithHole.rle0000644000175000017500000036264712026730263020124 00000000000000#CXRLE Pos=-212,-214 Gen=0 # Toffoli-Margolus gas, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # original Margolus states: # # 0 : background # # 1 : wall # # 2 : gas particle in an even step of the simulation # # 3 : gas particle in an odd step of the simulation # # neighborhood:Margolus # n_states:4 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,2 : 0,0,3,0 # even step: rotate clockwise # 0,0,0,3 : 0,2,0,0 # odd step: rotate anti-clockwise # 0,0,1,2 : 0,0,1,3 # contains a wall: no movement # 0,0,1,3 : 0,0,1,2 # contains a wall: no movement # 0,0,2,1 : 0,0,3,1 # contains a wall: no movement # 0,0,2,2 : 3,0,3,0 # even step: rotate clockwise # 0,0,3,1 : 0,0,2,1 # contains a wall: no movement # 0,0,3,3 : 0,2,0,2 # odd step: rotate anti-clockwise # 0,1,1,2 : 0,1,1,3 # contains a wall: no movement # 0,1,1,3 : 0,1,1,2 # contains a wall: no movement # 0,1,2,0 : 0,1,3,0 # contains a wall: no movement # 0,1,2,1 : 0,1,3,1 # contains a wall: no movement # 0,1,2,2 : 0,1,3,3 # contains a wall: no movement # 0,1,3,0 : 0,1,2,0 # contains a wall: no movement # 0,1,3,1 : 0,1,2,1 # contains a wall: no movement # 0,1,3,3 : 0,1,2,2 # contains a wall: no movement # 0,2,1,1 : 0,3,1,1 # contains a wall: no movement # 0,2,1,2 : 0,3,1,3 # contains a wall: no movement # 0,2,2,0 : 0,3,3,0 # two or four particles collide: no movement # 0,2,2,1 : 0,3,3,1 # contains a wall: no movement # 0,2,2,2 : 3,0,3,3 # even step: rotate clockwise # 0,3,1,1 : 0,2,1,1 # contains a wall: no movement # 0,3,1,3 : 0,2,1,2 # contains a wall: no movement # 0,3,3,0 : 0,2,2,0 # two or four particles collide: no movement # 0,3,3,1 : 0,2,2,1 # contains a wall: no movement # 0,3,3,3 : 2,2,0,2 # odd step: rotate anti-clockwise # 1,1,1,2 : 1,1,1,3 # contains a wall: no movement # 1,1,1,3 : 1,1,1,2 # contains a wall: no movement # 1,1,2,2 : 1,1,3,3 # contains a wall: no movement # 1,1,3,3 : 1,1,2,2 # contains a wall: no movement # 1,2,2,1 : 1,3,3,1 # contains a wall: no movement # 1,2,2,2 : 1,3,3,3 # contains a wall: no movement # 1,3,3,1 : 1,2,2,1 # contains a wall: no movement # 1,3,3,3 : 1,2,2,2 # contains a wall: no movement # 2,2,2,2 : 3,3,3,3 # two or four particles collide: no movement # 3,3,3,3 : 2,2,2,2 # two or four particles collide: no movement # x = 370, y = 432, rule = TMGasMargolus_emulated 370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABADCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCBABABABABABABABA BA$18BDBF2BF4B2F3BF3BFBF6BF2B2FBF3BF10BF4BF4BF7B3FBF3BF9B2FBF2BF2BF7B F3BF9BF2B3F2BFBF3BF6BF5B3F4BF5B3FB3F2B3F2BFB6F2B3FBF7BF5BF2BF5BFBFBF 8B2F6BF3BF4BF3B2F2BF2BF2B2FB2FB2F4BFB2F2BF2BF3BFBF3BF6B2F5BF4BFBF2BF 2BF4BFBF2B2F2BF2BF2B3FBD18B$BABABABABABABABABADABABEBABABAFAFEBABABAF ABABAFABABABEBABABABAFABAFABABABAFABABABAFEBABABABEFABABEBABABABABABA BAFEFABEFABABEFEBEFABEBEBABABABABABABABABABAFABABABEBABABABABABEBABAF EFEFAFABEFAFABABEBABEFABEBABAFABAFAFABAFABABAFEFEBAFEBEBABAFAFABABABA BABABAFEBABABAFABEFAFABABAFABABABABAFAFEBEBABABEBEBABABABABAFEBEBEBAB AFAFAFABABABEBEBABEFABABABABABAFABCBABABABABABABABABA$18BD5BF4BF5BF2B FBF9BF5BF8BF3BF17BF14BF5BFBF5BF2BFBF6BF7B2F7B2F3B2F2B2FB4FBF2BF4BFBF 3BF3B2FBFB2F3B2F2BF9BF3BF5B4FBF4BF3B2FBFBF3BF2B2F2BF7B3F4BF3B2F2BFB2F 2BF3B2F2BF4BF8BFBFBF2BF3BF2BFB4FB2FBF3B2F4BF3BF4B8F3BFBD18B$BABABABAB ABABABABADEBAFABABEBAFABABAFEFABEFABABABABEBABABEBEBEBABABEBAFEBABAFE BEBEBABEFABABABEBEBABABABEBABEBEBEBEBABEFABAFABABABABEBABABEBABAFABAB AFEBAFAFABABAFEFEFABABABABABEFEBABEFEBEBABAFABEFAFAFEFABEBABEFEBABABA BEBEBAFAFAFEBABABEFAFEBEFEBAFEFAFABABABAFAFEFEBAFABABEBABABEBABEBABAB AFABABABABAFABAFEBABABABEBABABABABEBABEBAFABABABABABABEFABAFEBABABCBA BABABABABABABABA$18BD2BF2BF2BF5BFB2F2BF2B2F8B2F15BF2BFBF4B2FBF3BF7BF 2BF2B2FBFBF2BF3BF4BF6BFBF3BFBFBF5B2FBFBF2BF4BF2B3FBF2BF2B2F2B2F2BF4B 2FB2FBF2BF3BFBFB3F4BF4B2F3BFBF13BF6BFBF4B3F8BF3BFB2F2BF5BFBF9B4F3BF3B F11BFB2F5B2F4BF3BF10BFBF5B3F5BD18B$BABABABABABABABABADEBEBABABABABABA BABEBEBABAFABEBAFABEBEBABABABEFAFABABABABABEBABEBABAFAFEBABABEFAFABEB AFABAFAFABABEBEBEBAFABABEBABABAFABABEBEBABABABAFABABABABABEBEBABABEBE BEFEFABABABABEFEBEFABABEFABEBABEBABABEBAFEBEBABABAFABABEBABABABAFABEF AFAFAFAFEBABEBEBEBAFEBEBABEBABABABABEBAFAFABABAFABABAFAFAFABABEBABAFE BAFABABEBAFABAFABEBEBABABEBAFAFABABABABEBCBABABABABABABABABA$18BDF4BF 2BF2B2F2BFB2F4BF3BF4BFBFBF8BF4BF5BF11BF2BF5BF4BF3BFBF11BF2BF3BF3BF8B 3F5BF2BFBFBF2BF2B3FBF9BF4BF6BF8BFBFB2F5B2F2BFBF2BF5B2FBF3BFB2FB2F5B2F 7BF7BF2BF2BF3B3F2BFBF11B2F3BF10BF3B2FB4FBFBF11BF5BFBF5BF6BFBD18B$BABA BABABABABABABADABABABABABAFABAFAFABABEFEBEFAFEFAFABEBAFABEBAFAFABAFAB ABABAFEBEBABEFAFABEBABAFABEBABABEBEBAFAFEBAFABEFABABEFABEFEBEBEBEFABA BAFABEBABABEBAFEFEFABABABABABEBEBABABEBABABABABABABABABEFABEBABABAFAF EFAFEBEFABAFEBABAFEBABABAFABABABEFABAFABABABABABABABABABABEBABABABABA FAFABABABABEBABABEBABABABABEBEBABABABABABEBEFEBABABAFAFABAFABEBEFEFEF ABCBABABABABABABABABA$18BDBF9BF2BF3B2FBF3BF4BF2B3F4BF6BF8BF6BF3BFB2FB FBF4BF6BF9BF13BFBF2B3F4BF3BFBF3B3F5BFBF5BF4BF2BF5BF4BF2B2F6BF7B2F4B3F BF8BFBF4B2FBF4BFBF2BF2BF2BF5BF3BFBF4BFBF2BF4BFBFBF13B2F2B2FBF5BF3BF6B 3F2B2FB2F4BF2B3FBFB2F7BD18B$BABABABABABABABABADEBABAFABEFABAFEBAFEBEF ABEBAFABABEBEBEBABABEBABABEBABEBABABEBABEBABABABEBABABABABEBABAFAFABA FEBABEBEBAFABABEBABABABAFABABABEBABAFABAFEBEBABABEBABABABAFABEFABABEB AFABABEBABABEBAFABABABAFABABABAFEBAFABABABABABEBEBABEBABAFAFEFABEBAFA BEBEBAFEBEBABAFEBAFAFEBAFABABAFAFAFABABABABEBAFEBABABABEFEFABABABEFEB ABABEBEBABABABAFAFABABAFABAFAFEFAFCBABABABABABABABABA$18BD2BFBF3BF2BF 2BF2BF3B2F6B2F5B3F9BF3BF14B3F2B3F2BF10B2FB2F4BFBF7B2F2BF2B2F3BF4BF2BF BF7BF3BF2BF5BF6BF3BF2B3F6BF2B2FBF2BF4BFBF3B3F3BF6BFB3FBF11BF7BF2BF3BF BF6BFB2F2BF2BFBF4B2F5BF8BF2BFB2F3BF4BF5BF3BFB2F4BF5BF12BD18B$BABABABA BABABABABADEBABAFEFABABEBABAFABABEBABAFABABEBABEBEFAFAFABABABABEFEBAF EBABEBAFAFEBEFEBABABEBABABEFABEFABABABABAFEBEFEBEBAFABEBEBAFABEBEBAFA BABABEFEBABEFAFAFEBABABEBABABEBAFAFEBEBABABEBABABAFEBABABABABABABABAF ABAFABEBEBABABABEBABABEFABEFEFEFABEBABABEFEBEFABABEFABEBABEBABAFABABE BABEBEBABAFAFAFEBEBEBEBAFABAFABABEFAFABABEFEBABABABAFABAFABABABAFABCB ABABABABABABABABA$18BD2BF2B2F4BFB2F8BF4BFBFB2F5BF8BF4B2F2BF4B2F8BFBFB 2FBFB2FBF9BF8BFB2FBFBF6BF3B2F2BFB2FBF4BF2BFBFBF2B3F2BF3BFBFBFBF2BFBFB F3BF5B2FBF3B2FB3FBF3BF2BF2BF3B3FBF14BFBF7BF2BF2B2F5B3F2B2F5B3F2BF3B2F BF2BFBF2BF3BFBF6BFB4F2BFB3F5BFBFBFBF5BF3BF2BF2BD18B$BABABABABABABABAB ADEBABEBABEBABEBEBAFABEBABAFAFAFAFAFABABEBEBABABABEBABEBEFABABABEBAFE BEBEBAFAFAFABABAFABABABEFABEFABEFEBEBABABABEFAFABABABABEBEBAFEFABABAB ABEBAFEFEFABABEBAFABABABABEBABABABAFABABAFAFEBAFAFAFAFABEBEBEBABAFABA BABEBEBABABAFABABAFEBAFEBABEFAFEBABEBABABABEBEBABABABABABAFABEBEFEBAB ABEBABABABEBEBABABABABABEBAFAFABAFABEBABEFEBEBAFABEBAFABABCBABABABABA BABABABA$18BDF7BF3BFBF10BF2BF2BF7B4F3B2F3B2F2B2F3B2F5B2F6B3F7BF2B2FBF B2F7BFBF2B3FBF3BFBFBFBF5BFBF3B3F2BF3B2FB2F5B2F3BF4B2F2BF2BF8B4F7BF2B 2FBF2BF5B2F2BF2BF6BF3B2F5BF6B2F10BFBF2BFBF7BFB2F4BF2BF6B3F3B2F2B2F7BF 7BF2BF5BFBF7BFBF2BD18B$BABABABABABABABABADEBABEBEFABEFEFABEBABAFABABA BAFEBABEBABEBAFAFABABAFEBABEBEBEBABABEBABEFEFABAFABEFABABAFABABABABAB ABABABABAFABABABABABAFABAFABEBABABABABEBEBABAFEBAFABAFAFEFAFABEBEFABA BABEFABAFAFABEFEFEBAFEBEBAFAFAFAFEBABABEBEBABEFEBEFAFEBAFABABABABABEF AFABABABABEBABABABEBABABEBABEFABAFEBABEFABABAFEFABABABABABABABABABABE FABEFABABEBABAFABAFABAFABABABCBABABABABABABABABA$18BDBF8BF5BF2B5F3BF 7BF2B3F3BF2BF5BF4BF2BF3BFBFB2F4BF8BF6BF10BF4B2F8BF5B2FBF3B3F3BF2BF7B 2F3B2F6BF3BFBF2BFB2F6B2F3B2F2B2F2BF2BF5B2F2BFBF5BF3B2F7BF10B2F4BFBF3B F2BFBF2BFB4F4B2FBFB2F3BF2BF6BF6BF3BF4BFBF4B2FBF2B2FBF4BF5BFBD18B$BABA BABABABABABABADABABABEFABABEFABAFEBEFABAFAFAFEBABEFABEBABEBABEFABEBAF AFABAFEFEBABEBABABABEFEBABEFEBAFABAFABEBABABABAFABEFABEFAFEBAFEBABABA BABEBAFAFEFEBAFAFEFEFAFEFABEBEBABABEBEBABABAFABAFABAFABAFAFABABABEFAB ABABEFABABABEBABEBAFABEFAFABEBEFABABABABABEBABEBAFEFAFABABABEFEFABABE BEBAFEBABABABEBABAFABAFAFABEBEBEBABABABABABEBEBAFABABABEBAFABEFABAFAB AFCBABABABABABABABABA$18BD2FBF3BF4B3F4B3FBF9BF3BF2BF11B2FBFBF2BFBF6B 2F3BFBF3BF5B2F4BF4BF4BF5BF4BFBF5BF8BFBFBF4BFBF2BF2B2F2BF13BF6BFBF15B 3FBF3BFB2F3BF2BF8B3F5BF6BF2BFBF3BF5BF8BF2BF3BF4BF7BF5B2F3BF13BF2BF2BF 2BF2B2FBF6BF2B2FBF2BD18B$BABABABABABABABABADABABABAFABEFABAFABEBAFEFA BABAFEBABEBAFEFEBEBEBAFABABEFABABEFAFEBABEBEBEFEBAFABABABABAFEBABABAB ABABABEFAFABABEFEFABEFABABEFABEFAFABABABEBABABABABABABAFAFEFEBABAFEBE FABABAFEBAFAFABAFABAFABABABABAFEBEBEBEBAFABABABABABABEBEFABABAFABEBEB ABABAFABAFABABABAFAFEBABEBABEBABEBEBABEBABABEBEFABABABABEFABABEBABAFE BABABAFABABABABEBABEFEFABAFABAFCBABABABABABABABABA$18BD3BFBF2BF3B2F8B F3BF14B2F6BF5BF2BF3BF2BF2BF2B2F2BF2BF2BFBF4BF4BF3BFBFBF4BF11BF11BF8B 2FBFBFBFB2F2B2F5B3FB2F5BFBF4BF3BFBF7BF2BFBF4BF6BFBF9BF3BF2BF3B2F2BF2B F2BF2BFB2F2B2F2B5FBF10BF3BFBF4BFBF5BF3BFB2FB2F2BFBFBFBF9B3F10BD18B$BA BABABABABABABABADABAFABAFEBABABABAFEBAFEBABABABAFAFAFEBEFABAFABEFABAB EBABAFAFABAFABABAFABEBABABABABABABAFABABABABEBAFABEFABAFEBABEBAFABABA FABEBABAFEBAFEFEBABABABABABAFEBEBABEBABAFEFABEBAFAFABAFABAFEBABAFEBEF ABAFEBAFABAFEBAFABAFEBABEBABEBABABABABEBAFAFAFEBABEBABABEBABAFABAFABA BEBABEBABEBAFEBAFABAFAFABABABAFEBEFABABABEFABEBEBABABEFABABABEFAFEBAB ABABCBABABABABABABABABA$18BD3FB2F6B3F4BF3BF2BF2BFBFBFBF2B2F5BFBFBFB3F B2FBF3B2F5BF5BF8BF5BF14BF2BF3BF7BFBF11BF4B2F4B3F3BFB2F3BFB2F2BFBFBF2B F3B2F3BFBF4BF2BF4B3F3B2F5BFBF3BF3B2FB2F11B3F2B3F4BFBF10BF2BF6BF3BF5BF 3BF9BFB3F2B2FBF8BF2B2FBFBF4BF6BD18B$BABABABABABABABABADABEFABABABEFAB ABABABABABABEBEBEBEFEBABABEBEBABABABABEBEBEBEBABABEFEBEFABEBABAFABABA BABAFEBAFEFABEBEBABAFAFABABEBEBABABABEBEBEBAFAFABAFABABABABABABABAFEF ABABABABEBAFABABEFEBEFAFABABABABEBABABABABABEBEBEBABEBAFABABABABABEBE FABAFABABABABEBEBABABABEBAFABAFEBAFABEFABEBABAFAFABABABABAFABABAFAFAB AFAFEBAFABEBEFEFABEFABABEBABABABABAFABABABCBABABABABABABABABA$18BDFBF 3B4FBF4BF2B2F3BF2BFBF6BFBFBF2BFB3F2BFBF2BF4BFBFBF2B2FBF5BF2B3FB2FBF3B F8B2F2B2FBF3B3F3B3F4BFB2F5BFBF4BF3BF8B2FBFBFBF5BF2BFBF13BF2BF6BFB2F3B F5BF4BFBF3BFBFBFB2F3BF7B2F2BF4B5F4BF6BF6BFBF3BF4BF3B2F12BFB5FBFBF2BF 8B2F6BF3BD18B$BABABABABABABABABADABABAFEBABEFABABEBABAFABEBABABABABAB EBAFABEFAFEFAFAFEBEBEBABEBAFAFABEBABABAFAFABAFABABAFEFEBAFAFEBAFAFAFA BEFEBEBAFEBAFABABEFABABABABEBABAFEBABABABABABAFABAFEBABEBAFAFEFEBEFAB EFAFEBEFABAFEBABABEBABEBEBABEBABABEBAFABEFABABEBEBABABAFABABEBAFAFAFA FEBAFEBAFAFAFAFAFEFABABAFABEBABABAFEFEFABEBAFABAFABABEBEBABABEFABAFAB ABEBABABEFAFAFABABEBCBABABABABABABABABA$18BD3BF2BFB3FB2F6BF7BF3B2F3BF B2F6BFBF2B2FBFBF6BF3BF3BF2BF3B2FBF4B2FBF3BF4BF16BF2BFBFB2F6BF5B2FB2F 10BF2BFBF2BF3BF2BF4BF2BF8B2F2BF4BF5BF8BFBF2B3F6BF3BFBF3BFBFB2FBFBFBF 3BF6BFB3FBF2B2F2BF4B2FBF5BF4B2F5BFBFBF6BF3BF3BF2B2F4BF6B3FBD18B$BABAB ABABABABABABADEFAFABEBAFABABABABEBEFAFABEBAFABEFABEBABAFABABEBABAFABA BABAFABABABEBEBABABAFEBEBABAFABEBABABEBABABABEBABABEBABEFABABABABABAB EBABEBAFEBABABAFEFABABAFEFEBABABAFABAFEFABEBABABABABABEBABABEBABAFABE BABAFEBABAFEBABEBEBAFEBABABAFAFEBABEBAFABABEBEBEBABEFEBABABEFABEBABAB ABEBEBABEBEBAFABAFABEBABEFEBABABAFEFEBEFEBABABABEFEBAFABEBABEBEBABEFE BCBABABABABABABABABA$18BDB4F7BF2BFBF4BF6BFBF8BF2B2FBF2BFBF6B2F2B2FBF 5BF2BF9B2FBFBF4BF9BF4BF4B3F9BF3BF3BF4B4F6BF5BF3BF4BF2BFBF4BF10BF4BF2B 2F7BFBFB2F2B2F3BF3BFB5F2BF2BF12BFBF7B2FB2F2B2FBF2B2F7BF4B3FBFBF2BFB6F BF3BFBF3BF2B2FBFBF2BFB2F3B2FBFBD18B$BABABABABABABABABADABABABAFEBAFEB AFABAFEBEBEFAFABEBABAFABEBABEBAFABEBABABABABEBABABABABAFEBAFABAFABABA BABABEFEBABEBAFABABEFEFABEBABABAFEBABAFABEBAFABAFAFEFABAFAFEBEBEFEBAB EBABABABEBAFAFABEBABEBABAFEBEBABEBABAFABAFEFABABEBEBAFABABAFABABABEBA BABABABABEBAFABABABABABABAFEBABAFABABEFABABABAFAFABABABABABEFEFABEBAB ABABEFAFEBAFABABABEBABEFEBEBABABABABEBABAFCBABABABABABABABABA$18BDFBF 2BFBF3BF4BF8BFB3F8B2F3BF5BF2BF7BF6BFBF9BFBF5B2F6BF3BF7BF7BF2BF2BF2BF 2BF9B2F2B2FBF4B2F7BF4BF3BF5BFBFB3F4BF2BF2BF4B2F2BF4B2F14BF3BF2BF12BF 4BFBF2B2F3BFBFB3FB3F10BFBF5B5F2B3F2BF6BF5BF2B2F6BF3B3F5BD18B$BABABABA BABABABABADAFEFABABEBABEBABEBEBEFABAFABABABABABABABAFEFABEFEFEBABABAF EBABABEBAFEBAFABABEBABABEBEBABAFABABAFABABAFEFABAFABAFEBAFEBABABABEBE BABAFABAFEBABAFAFEFEBEFEBAFABEBABABAFABABEBEFEBABABABABEBEBEBEBABABAB ABEBABABABAFABABAFABEBABEBEBABEFABABEBABEFABABABABABABABABEBAFEBABABA BABAFABABABAFEBEFEBABABABAFAFABEBABAFAFABABABABEBEFABABABAFEFEBEBEFCB ABABABABABABABABA$18BD2BF5B2F4BFB2FBFB2F2B2FB4F8B4F8BF3B2F6BFBF3BF4BF B2FB2F2BF2B2F2BF3BF5BF3BF2BF5BFBF5BF10B3F7BF2B2F2BF2BF2B2FB3F2BF3B3F 3BFBFBF5BF4B2FBF5B2F11B2F5BFB2F2B2F18B2F5BFBF2BF4BF2B3F2BF2BFBF2BF4B 2FBFBFB4F7BF5B3F2BFBF4B2F2BFBF4BFBFD18B$BABABABABABABABABADABAFAFEFAF AFABEBABABAFEFABABABABABAFEFEBEBEBABAFABABAFABAFAFEBABABABEFEBAFEBABA BABAFABEBABAFABAFEBAFEBABABABAFABEBAFAFABABABABEBABABEBABABABABEBAFEB ABABEFEFAFABEFEBAFABABAFABABEBABEBAFABABAFEFEBEBABABABEFABABABAFEBABE FABAFABEBEBABABEBEBABABEFAFABEBABABABEBABABEBEFABABEFABABABAFABAFAFAF EBAFABABAFAFABABABAFABAFEBABABABABABEFEBABEFABCBABABABABABABABABA$18B DF3BF2BF3B2F2BFBF5BFBFBFBF2BF13BFB3F2BF2BFBF5B2F4B2F5BF13BF4BFBFBF7BF 3B2F3B2FB2FBF10BF5BF3B2F8BF9BFB2FB4F3BF3BF2BF4B3F2BF5B2FBF3BF2BF5BFBF 4B2FB4F2BF3BF3B3F5B2F2BF4BFBF2BF3BF3BF3BF9BFB2F8BF2BF2BFBFBF5BF4BF5BF 2BF2BF3BD18B$BABABABABABABABABADABAFABABEFABEBABEBABABEBEFABAFABEBABE FABEBEFAFEBABAFAFAFEBABABEBAFABABABABABEBABAFEFAFABABABABABABABABABAB ABAFABEBAFABABABAFAFABABABABEBEBABEBEBABEBABEBEBAFAFABEFABABABEBEBABA BEBAFABABABABAFABABABEBABEBEBABABABABAFABABEBABABAFAFEFABEBEBABABAFAB EBEBAFABAFEBEFEBABAFABEBABEFEFEBEBABAFABAFAFABABABAFAFABAFABABAFABEBA FEFEBABAFAFEBABAFABCBABABABABABABABABA$18BD2BFBF4B2F5BFB2FB3F3BF7BF 11BFBF5BF2BFBF2BF2B2FBF2BFBFBF2BF14BF4B2F4BF2BFBF3BFBF4B2F2B2F24B2FBF 5BF7BF2BF5BF5B2F2B2FBF11BFB2F6B2FB2F9BFBF3B2FBF6BF11BFB3F3BFB2FBF2BF 2B2F2BF5BFB2F2BF6B2FB2F4B2FBF2BFBF3B3FBFBF2BF5BD18B$BABABABABABABABAB ADAFABEBEFAFABEBEBABAFABEBAFEBAFAFAFAFABABABABABABAFAFEFAFEBEBEFABABA FEBEFABABABABEBEBAFABAFABABABAFAFABAFEFABABEBAFABEBAFEBABAFABABEBEBAB EBEBAFAFAFABEFABAFAFABEFEBABAFAFABAFABEFABEBABABEFABABEBEBABABEBABABA BABABAFABABAFABABEBABABEBABABABABEBABABEBAFEBAFAFABABEFABEFABEBABEBAB EBEBEBABEBAFABABABABEBABEBEBEBABABABEFABAFABABABEBAFEBABEBCBABABABABA BABABABA$18BDBFB2FBF4BF3BF3B4F6B2F3B3F2B2F2BF9BFBF3BF2BF3B3F4BF6BF3BF 2BFB2F3BF2BF3BFBF2BF3BF8B2FBFBFBFBFBFBF4B2F3BF17BF7BF3BF3BF8BFBF9BF2B F9BFBFBF2BF3BF2BF2BF4B2F18BFBFB2F5B2FBF8BF9BF3BFBF7B3F8BF6BF3BFBFBF6B D18B$BABABABABABABABABADABABAFABAFABABABABEBEBEBABABABABABEFABEBABABA BAFABEBABEBABABAFABEBEBABABABEFABABEBEBEBABAFABAFABEBABABAFABABAFABAB AFEFEFABABEBABEBABEBAFAFABAFABABABABABABABAFABEBABEFABEBABABABABEBABA FABABEBEFEBABAFABABAFAFEBABABEBAFABAFABEFEBABABABABAFAFABAFEBABEBABAB ABABEBEBAFABABEBAFABABABABABABEBAFABABABEBABAFAFABAFAFABABAFAFAFEFAFE FEBABAFABABCBABABABABABABABABA$18BD2FBFBF4BF3B2F5BF3B2F6B2F9B2F9BF3BF 2BF8BF2BFB2FBFB2F2BF2BF7B2F8BFBFBF4BF2BFBF2BF8B2FBF2BFB2F6B4F3BF2BF2B 2F2BF2BFB2FBFB2F9BFB3F3BF4BF2BF2BF3BF6B2F3BF2B2F7BFB2FBFBF2BF4BFBF3BF 5BF3BF2BFBFBFBF4BFB2F3BF2BF3BF4BF6B2F2BF3BF3BF15BD18B$BABABABABABABAB ABADABABABEBEFAFABABAFABABABAFABAFEBABEBABEBABEBABABABABEBABABAFAFABA BABABABABABABABABAFABABABEFABEBEFEBEBABAFABABEFABAFEBABABABAFABAFEBAF ABABABAFABAFABAFAFAFABEBEBAFEBABAFABEFABABEBABABABABEBAFEBABABEBEBAFA BAFEFEFABEFABEFABEBAFEBAFEBEFEBABABABABABABABABABABEFEBABABABABAFEBAB ABEFEBEBAFABABEBEBABABABABABEBAFEBABABEBAFABABAFEBAFEBABAFEBCBABABABA BABABABABA$18BD2BF5BF4BFBF8BF2B2FBFB2F6BFBFB3F2BF2BF12BF9BF5BF2BF2BFB F7BF5BF7BF6BF4B2FB2F7BF13BF3BF4BF2BF4BFB2FBF5BF3B3F2B2F4BF5BF5B5F5B2F 2B2F2BFBF4BFBF9BF3BFBF6BF4B3F7BF3BFBF2BFB3F4BFBF8BFBFBF4BF3B3F3BFB2FB 2F3B2F3BD18B$BABABABABABABABABADEBABABEBEBABAFAFAFEFAFABABEBABEBABAFA FABABABEBABABAFEBAFEBABEBABABAFABEBABABEFAFEBEBEFEBABABABABEBEBAFAFEB ABABEBABABAFEBAFABAFABABABABEBEFEFEBAFABABABAFABABABAFAFABABEFEBEBEBE BABABABAFABAFABEBABAFAFABAFABAFAFEFEBABAFABAFABEBABABEBABEBABEFABAFAB ABABEBEBABABAFABABAFAFABAFEBABABABABABABEBABABAFABABAFABEBABABEFEFABA FAFABAFEFEFABABAFEBCBABABABABABABABABA$18BD3BF6B2FBFBFBFBF6BF12BFBF3B 5F6BFBFBFB2F3BF2BFBF5B2F2B2F6BF3BFBFBFBF2BF5BF4BF7BF3BF6B2F5B2F11BFBF 8BF5BF5BF8BF7B2F6B4F6BF4B4F8B2F5BFBFBF6BF2BF4BFBF4BF4BF4B2FB2F2B2F2BF 2B3FBF2BFBF2BFBF2B2FBF3BF7B2F2B2FBF7BD18B$BABABABABABABABABADABABAFAF ABABAFABAFEFEFAFAFABABABABEBEBABAFABABABABAFEBABABAFAFAFABABEBABEFABE FEBABEFABABABEBABABEBABEBABEFABAFABABEFAFABAFABABAFEBABABAFAFEBEBEBAF ABEFAFAFEFEBABEFEBEFAFABABEFABABABEBEBABABABABABABEBABABABAFEBAFEBEBE FEFABEBEBEFABEFABEBABABEBABABABABEBABABEBAFEFEBABABEBABEFAFABABEBABAB AFEBABEBEBABEBABABEBEBABEBABEBEFABEBABABAFEFAFEBCBABABABABABABABABA$ 18BD7B2FBFBF3BF7BF12BF2BFBF2BFB2FBFB2FB7F10BFBF5BFB2FBF3BF3BF2BFBFBFB 2F4B2F2BFBF3B2F21B2FB2F5BF5B2F4BFB2F3B2FBF8BF4BF3BF5BFB2F7BF3BF6B2F8B F8BFBFBF7BF3BF3BF3BFB2F2BF2B2FBF8BFBFB2F10BFBF2B3F2B2FB2F7B2F6BF2BD 18B$BABABABABABABABABADABAFEBABABABABAFABABABABAFEBEBABAFAFEBABABEFAB ABAFABAFEBEBEFABABABABABABAFAFABAFABABEBABEBABABABABAFEFABEFABABAFABA BEBABABEBAFEBABABABAFABABAFABAFEFABABEBABABABABABABEBEFABABEBEBABABAB EBABEBABAFABABABAFABAFABABAFEBABAFAFAFAFAFABABAFABEBAFABABABABABEBEBA BAFABABABABEBEBABEBEBABABABEBAFEBABAFABABAFABABABABABEBAFABAFABABABAB AFEFEBABEBCBABABABABABABABABA$18BD9BFBFBF7BF5BF11BFB2F10BF4BF6BFBF5BF 5B2F4BFBFBF7B2FBF5BF2BF5B3F2BF2BF7B2F16BF6B3FBF14BF2BF12BF2BF2BF4BF2B F9BF2BF2BFB5F2BF7B2F3B3FBFBF14BFBF2BF3BF3BFBF2BF7B2F5BF2BFBF4BF3BF3BF B2F2B3FBF6BD18B$BABABABABABABABABADABAFEFABABABEBABAFAFABABAFABABABAF EFABEBABAFAFEBAFABAFABABABABABABEBAFEBABABEFABABABEFABEFAFABEBEBEBABA FEFABEBABABAFEBABEFABABABABABAFAFEBEBABAFABEBEBABABABEBABEBABEFABABAB EFEBAFEBAFABABEFEBABEBAFABABEBABEBABAFABABABEFABABABABABAFABEFEBABABA BABAFEBAFABABEBABABAFABAFAFABABEBABAFAFABABAFEFAFABEBABABEBABABABABAB AFAFAFABABEBABABABEBAFCBABABABABABABABABA$18BD2BFBF2BF3BF2B2FBFBF11B 3F11BF9BFBFB3F4BF7BF6BF4B2F3BF4B2F2BF4B2F6B3F3B3F3B2FBF6BF2BF2B3F3B3F 3BF2BF10BFBF5BFBFB2F3BF4B2F9BF12B2F2B3F5BF2BF3BFBF2B3F13BF2BF6BF4B2F 3B3F6BFB2FBF12BFBF2BF3BFBF2BFBFBF2BF3BF6BD18B$BABABABABABABABABADEBAB ABABABEFABEFABABAFABAFEBEBAFEBABABEFEBABEBAFEBABEFEBEBABEBABEFEBAFABA BABABABAFABEBEBABAFABABEFABAFAFEBEFAFAFABABEBAFABAFAFEBEBABABAFABEBAF AFAFAFEBEBEFABAFABABABEBEFAFAFAFABABABEBEFAFABAFEFAFEBABEBABABABABEFE BABAFAFABABABAFAFEBABAFABEBEBAFEBABABAFEBABEFEFEBABAFABAFEBEFAFAFABAF AFABABAFABAFABEBAFABABEBAFEFABAFEFAFABABAFEBABEBEBAFCBABABABABABABABA BA$18BD2B2F3B2F4B2F6BF4B2F3BF8BF8BF3BF2BF4B2F4BF6BFB2F11BF3B2F3BF2BFB F2B3FB2FB3F10B2FB2F4B2F2BFB3F2B3F2BF2BF5BF2B2F4BF7B2F5B2F6BF2B2FBFBF 3BF10BF6BF13BF5BF11BFBFBF3B2F2BF6BF6BF4BFBF2BFB2FBF2B2F4BFBFB2F6BFB2F 2B2F8BD18B$BABABABABABABABABADEBEBAFEBABEFEBABABEBAFABABAFAFEFABABEFA BEFABAFAFEBABEFABEFEBABEBABABEBAFEBABEBEBEBAFEBABAFABAFAFAFABABABAFAB EBEBABEFEFABAFABABEFAFABAFEBABABEFAFAFABABABABAFABABABAFABABABABEFEFA FEFAFAFABABABABABAFAFEFEBABAFABAFABEBABEBEFABAFABABABAFABABABAFABEBAB ABAFEBAFEBABEBAFABABABABAFABABEFAFABABAFABABABAFAFABAFABAFABABABABABA BABEBABABEBABABEBCBABABABABABABABABA$18BDFB2F9B2FBF2BFBF9B2F2B2F2BF2B F4BF6B2F7BF11B2F3BF5BFBFBFBF8B2F4BF9BF3BF4B3F2BFBF11BF3B2F5B2F2BFBF4B FBF3BFBFBF2B2F2BF4BFBF5B2F7BF3BFBFB4F7B3FBF3BF9BFBF2BFB2F2BF3BF5BF2BF 4BF2B2F3B2FBF3BF4BFB3F4BF10BF5BF11BFBD18B$BABABABABABABABABADAFAFEFAB ABABAFABABABABABABAFEBABABEFEBEBAFABABEBABABABABABABAFABAFAFABEFEBABA BABABEBABABAFABABABABEBAFEFEFEBEBABABABEBEBAFABABABAFAFABABAFAFABAFEB EBEBABAFABAFEBAFABABEBABEBAFEFAFABEFABABABABABABAFABEBABEBAFAFABABAFE BABEFABEBABAFAFAFAFABEBABEBABEBEBAFABABAFAFEBAFABEFEBAFAFABABABABABEB EFAFAFEFABEFABEFEBEBABABEBAFABABEBEFEBEBABABEBABCBABABABABABABABABA$ 18BD4BF5B2F5B2F5BFBF3BF3B2F5BF2B2FBFBF7B2F2BFBF3BFB2F7B3F5BFB3F7BF9BF 5BF9BF5BF6BFBFB3F7BFBF3BF2BF4B2FBF3B2F5BF10BFBF2BFB3F4BF3BF2BF3BF12B 2F3B2F7BFB4FB2FBF5BF2BFBF4BF2BF5BFBFB2FB4FBFBF6BF3BFBFBF3B3F3B2FBF8BF 3BD18B$BABABABABABABABABADAFABABEBABABABABAFAFABABABABEFABAFAFABEFAFA FAFABABABABAFAFAFAFABEBEBEBABABEBABEFAFEBEBAFEBABABABABEBAFEBABEBABAB ABABABABABABAFEFABABEFAFABAFEBABAFABEBAFEBABAFABEBAFABEBABEBEBABABEBA BABEBAFAFAFAFABEFABABEBEBAFAFABABABEFABAFEBAFEFABAFEBABEBABABAFEBABAB AFAFABAFEFAFEBEFABAFAFAFAFAFEFEFEBABABABAFEBABAFABABAFAFEBAFABABEFABA BAFEBABEBABABCBABABABABABABABABA$18BD5B2FBFBFBF5B2F4B3F2BF6B2F6B2FBF 2B3F2B2F2BF5B3F3BFBF12BF6BFB4F2B2F6B3F4BFBF9BF7BF2BFBF3BFBF4BF3BF12BF 2BF2BF2BF2BFBF4BFBF3BF3B2F3B2F3BFBFBFBF3BFBF7BFBFBF2BF4B2FBFB3F2BF2BF 2BF2BFBFBF5BF3BF11BF4BF6B3F2BF2BF2B2FBFBFBF4BF11BD18B$BABABABABABABAB ABADEFABEBABEBEBABAFAFABABABEBABABABAFABEBABABEBEFABABABAFABEBEFEFAFE FEBABAFEFABAFABABEBABABAFEBEBABABABAFABAFABEFABEFAFAFABABAFABEFAFABAB ABABEFABEBABABEBAFEBAFAFEBAFABEBABABABABABABEFAFABAFAFABEBEBAFAFABEBA FAFEFEBAFABEBABEBEFAFABEFABABEFAFEFABAFAFABEBEFAFEBEBABABEBABAFEBABAF ABABABEBAFABABAFAFABABABABAFABAFABABABEFEBAFEFABAFABEBABEBABCBABABABA BABABABABA$18BD2BF2BFBF6BFBF13B2F3BF4BF2BFB2FB2FBFB2F2BF6BF4BFB2F19BF 7BF5BF6B3FB3F2B2FBF9BF6BF9B2F2BFB2FB2F10BF5B2F2BF6BF2B2F2BF5B4F2BF5BF BFBF2BF6BFBF2BFBFBFB2F3B2F2B2F3BF12BF8B2F4BF5BF5B2F4BFBF3BFBF3BF2BFB 3F5BF2BFB2FD18B$BABABABABABABABABADABABEBEFEFEBABAFEBABABABABEBABAFAF EFABABABAFEFABEFEFEBABABABABABEBABEFAFEBABAFEBEFAFAFAFAFABEBABABEBEBA FEFABABEFABABAFAFABABABABEBEBAFEBEBABEBABABEBEFEBAFABABABABEFABAFABAB EBABABABABEBAFEFEBABAFABEBABABAFEBABABAFEBABABABABABABAFAFAFEBABABABA BAFABABEBAFEBAFAFAFEBABABABABABAFABABEFAFABABABABAFAFABEBEBABAFABEBEB ABEBAFAFABEFEBEBEBEFAFCBABABABABABABABABA$18BDF4BFBF16BFB2F8BF5BFB3F 5BF2BF2BFBF4BF6B2F2BF3BF3BFB2F5BF2BF4BFB2FBFB2FBF2BF4BF2BF2BF16BFBFBF 6BF4BFB6F2BF3B2F2BF5BF5B3F5BF4B2F3BF4B2FB3FBF4BF2BFBF2B3FBF5B3F4B4FBF 7B2F2BF17BF6BF2BFBFBFBF2BF2BF5B3F5BF2BFBFB2F2BFBD18B$BABABABABABABABA BADABEBAFABEBAFEFAFABABABABAFAFEBABEBEBABABABABABABABEBEFABEBEBEBABAB ABEBAFABABABABABABABEBAFEBEBABABABEBABABABABEBAFAFAFABABEBEFEBAFEBABA FABAFABABEFEBABABABEBEBAFEBEBABEBEBAFABABEBAFAFEBABABEFAFAFEBABEBAFAB ABEFAFABABEBEBABEFEBABEBABEBABEFABAFABEFABAFEBEBEBABAFABABEFABABABAFE BEBABAFAFEFABAFAFABAFEBABEFEFAFAFAFABABEBEBEFABEBAFABEBEBAFCBABABABAB ABABABABA$18BD2BFB2FBF2BFBFBFB2FB4FBF4BFBF8BF2BF5BFBF2BFBFBFBF3B2F2BF 6BF9BF2BF2BF4BF5BF3B3FB3F4BFBF4B4F3B3F5B2F2B2F9B2FB2FBFBFBF4B2F2BF2B 2F4BFBFBF11B3F2BF4BF2B3F7B3F14BFBFBF4B2FBF4BF3BF2B2FBFBF5BFBF3BF3BF2B 3F3BFBF4BF4BFB5F2B2F6BF2BFBFBFB2FD18B$BABABABABABABABABADAFAFEBABEFEB EBAFEBEBABAFAFABABABEFABABABAFABAFABABABABEBABABEBABEFABABABABEFABAFE BABABEBABABABABABABEFABABABABABABEBAFEBABEBABEBEBABABABEBABAFABABABAB ABEBAFABAFABABABAFAFEBABAFABABABEFABEFABEBABABAFABAFABABAFABAFABAFABA FEBEFABEFAFEBABAFABAFABABAFAFABABEBABEBABAFEBAFABAFABAFEBEFABABAFEFAB AFABABEFEBABEBABABEFEFAFABABEBABABABABAFEBABCBABABABABABABABABA$18BD 6B2F6BF2BF2BF2BF8BFB3F2BF3BF5BF6BF2BF7B2F2B3F2BF5B2F5B2FB2F6BFBFBF2BF B2F10BFBF2B2F7BFBFB2F4BF3BF5BF4BFBF2BF8BF4BFBFBFB3FBF10BF2BFBF5BFBF 18B2FBFB2FB2F7B2F2BFBF2BF8BF2BF2B2FB2F8BF8B2F2BF2BFBF5B2F2B3F4BFBFB4F 3BD18B$BABABABABABABABABADABABABAFEBABAFABABAFABABABEFABAFABABAFABABA FABABEBABEFABABEBAFAFABAFEBABABABEBAFABEFEBABABABABABAFEBABABABABABEB ABEFAFAFEFEBAFAFABABABABABEBABABABEBABABABABABAFABABEBABABABEBABABABE FAFABABAFABAFABEFABAFABEFABEBABABAFABEBAFAFEBEBAFABABAFABABABABAFABEF EFEBABABEBEBEFABABEFEFABABABABEBEFABABABEBABAFAFAFABEBEBABEBEBAFEBABA BEBAFABABABABCBABABABABABABABABA$18BDBF10B2F3BF2BF3BF4BFBF18B2FB3F3B 4F4B2FBF3B2FBFB4F4BF8BF9B2F7BF4BFBF2BF4BF6BF2BFBF3BF2B2F4BFB2FBFBF3B 3F3B2F3B2F2BF3BFBFBF2B4FBF11B4F4BF7BF5BF14BF2B2F3BF3BF6BFBFBF6BF4BF6B 2F2BF2B2F4B2F2B2F2B3F4BFB3FB3F3BF3BD18B$BABABABABABABABABADABAFABABAF ABABAFABABEBEBEBABEBABEFEBABAFAFEBEBAFEFEFEFABAFABABABEFAFABABEBABAFA BAFAFEBABABABABABABABABABABAFABEBABABABAFABABEFEBABABAFAFEBEBABAFABAF ABABEBABAFEFAFABAFABAFEBAFABEBAFABABAFABABABABEFEBEFEBABABABABAFEBAFA BABEBABEBABEFABABABABEBABABABAFAFABABABABABEBABABABABABEBABABEBEFABAB EFEBABABABEBEBABABABABABABABABABABABABABAFABAFCBABABABABABABABABA$18B DBFBF6BFB2F5B2FB2FB3F4BF5BF2BF2BFB2FBF5BF8B2F3BF2BF2BF2B2F3BFBF10BF2B F3BF4B2F2BF4BFBFB2FB2F3BF4BF14B2F5B2F6BF5B3F2B3FB2F4BF6B2F10B3F3BF3BF 2BFBF11BFBF3BF5BF10BF13B3FBF2B2F4BFB2FBF14B2FBFB2F7BF2BFB2F5B2FB2FD 18B$BABABABABABABABABADABEBABABAFABEBEBABAFAFAFABAFABAFABABABABABABEB ABABAFEBEFABAFEFABEBEBABAFEBAFABABABEBABEBABEBEFABEBEBABAFAFABABABABE BEFABEFAFABABABEFAFEBABABEBABABEBABEBABABABEBABEFAFABABABABABABAFAFAB EBEFABEBABABABAFAFEBAFAFABABABAFAFEFABABABEFABEFAFEBABABAFAFABABABABE BABAFABAFABAFAFABABABAFAFEFABABEFEFAFEBAFABAFEBAFAFEBAFABAFABEBABEBAB ABABEBABABCBABABABABABABABABA$18BDFBF11BF2B3F5BF8BFBF4BF3B2F4B4FBFBF 9BF2BF6BF14BF7B2FBF2BF3B2F7BF5BFBF9B3F2BF2BF4BFBFBF8BF7BF4B3F6BFBF4BF 2BFBF20B3F2BF4BF3BF4B2FBF4BFBFBF3BF4BFBF2B2F5BF2BF5B2F2B2F5BFBF2BF3BF 3BF3BF3BF4B2F3BF4B4FBD18B$BABABABABABABABABADEBABABABABABAFABABAFABEF ABAFAFEBEBABEBEBAFABAFEFAFAFABABABEBABAFABAFAFEBAFABAFABABABABABAFEBA FABABABAFABABABABAFEBEBEFEFAFEBABAFABABABABABABEFABABAFABAFABABAFEBAB ABABABABEBAFEBEFABABAFAFABABEBAFEBABEBEBEFEFABABABABAFEFEBABABABAFABE BABABABEBABAFAFEFABABABAFEBABEBAFABABABEFABABAFAFEFEBAFEBEFEBABABAFEF EBEBAFABAFAFEBABAFABABEBAFEBEBAFCBABABABABABABABABA$18BDBF4BF2BFB2F3B 3F8BFB2F7BF8BF2BF6BF2BF4BF5B2F4B2FB2FBF6BF2BF3BF9BF8BF2B3F3BF4BFB3F7B 4F2BF2B2F4BFBFBFBF2BFBF3B2F2B2F4BFBF3B2F2B2F2BF4B2FB2F7BF5BFBF5BF4BF 3BFBF4BFBF3B3F6BF2B2F4BF5B2F2BF5BF4BFBF2B2F6BF10BF6BF3BF6BFBD18B$BABA BABABABABABABADEBAFEFEFAFABABABABABEBABEBABEFAFABABEBABABABAFEFABEFAB ABABABEFAFABABABABEBABABEBABEBABABAFABAFEBEFEBABABABABAFAFABABEBAFABA BABABEFEBABABAFABEBABABEBEBABAFABAFABABAFABEBEBEFABAFABABAFABAFEBABEB AFEBABEFAFEBABABEBABEBEBAFAFABAFEBAFABABEFEBEBAFABAFABABEFEBABAFABEBA FEFABABAFEBAFAFABABAFEBABABABEFEBAFABABEFABABEFEBEFAFAFEBABEBEFAFABEB ABCBABABABABABABABABA$18BDF4BF3BF2B2F4BF3BF3BF3BFBF8BF3BF2BF2BF2BF3BF 3BFBF7BFBF4BF3BF3B2F10BF3BFB4FB2F4B2FB2F5BF2BF3BF4BFBF2BF2BFBF6BF4BF 5B2F2BFBF10BF2B2FBFBF6B2F2BF5B2FBF3B2F2BF2BFB2F2B2F2BFBF2B2F2BF7BF6BF 3BF2BFBF3B2F3BF2B5F11BF3BF3BF2BF2BF2BFBF15BFB2FD18B$BABABABABABABABAB ADABABABABABABABAFABABABABABABEBAFABEBABEBEBAFAFEBEBAFABABAFABABAFABA BABAFAFEBABEBABABABEBABEFEBABAFEBABABEBABABAFEBEBABABAFABABEBEBEFAFEB EBAFAFEBABEBABABABABAFABAFEBABABABABAFABABABABABAFABEBABABABABEFEBEBA FABEBABAFAFEBABABABABAFABEBABABEBAFABAFABABAFAFABEBABABABABABEBABAFAB AFEBAFABABEFABABABAFABEBAFABABAFEBABABABABABABEBEFABAFABAFCBABABABABA BABABABA$18BD5BF12B2F3B3FBFBFBF6BF5B3F5B2FB2F3BFBF3BF2B3F3BF7BF3BF5BF 2BF6BF3B2F6BF7BFBF5BF4BF5B2FB2F2BFBF2BF10BF4BF3BF6B2F5BF3B2FBF5BF7B2F 2B3F4BFBF2BF2BF2BFBF3BFB2F2B3F2BFBF2BF3B2FB2F3BFBFBF3BF5BF3B2F2B3F3BF 7BF3BF3BF5B2FBFBFBF6BF2BD18B$BABABABABABABABABADEFABABEFEFABABAFABABA BABEFEBAFABABAFABEBEBABABEBABEFABABAFABABAFEBEBAFABABEBABABEBEBABAFEB ABAFABEBEFABEFABAFABAFEBAFEBAFABABABEFABABABEBEBABABABABEBABAFAFAFABA BABABAFEBABABABABEFEBEBAFAFAFABABABABEBAFABAFABABEBEFABAFAFEBABAFAFAB ABEBABABEBABABABEBAFABEBEFABAFABABABEFABEFAFABEBABABEFABABABABAFAFABA BEBEFAFABEBABABABABABEBABABEBABEBAFCBABABABABABABABABA$18BDBF3BF3BF5B F3BF3B2F4B2FBF2BFBF3BF6B2FBF8BF15BFBFB2F6BF5BFB2F3BFBFBF2B2F4BFBF3B3F 2B2F2B2F2BFBF2BFBF2BF3BF3BF2BF12BF3BF3BF6BF7B2FBF5BF4BFBF2BF7B2FB2FBF 2B2F6BF2BFB2FBFBF2BF3BFBF2B3F4B3FB2F5BF5B2F2BF5BF3BF7BF2BF4B3F7BF3B2F BF2BFBD18B$BABABABABABABABABADAFABABABEBABABABEFEBABAFABABABABEBABAFA BEBABABEBEFABABAFABEBABEBAFEFAFAFEFEBABEBEFEBABABABEFABABABABEBEBAFEB ABABABABABEBABABABEBEFABEFEFAFAFEBABABAFEFABABAFAFEBABABEBABABABAFAFE FABEBABABABABAFEFAFABEBEBABEBABEBABABABEBEBEFEBEBAFAFABAFABEFEFEBABAF ABEBEBABABEFABEBABAFABABABABABABAFAFEBAFAFABABABAFABABAFABEBEBEBABEBA BAFABEFEBAFAFEBEBCBABABABABABABABABA$18BDBFB2FB2F2BF2BFBF3BF5BF7B2F3B F3BFBF4BF3BF2BF2BF3BFBF4B2F4BF2BF3BF2BFBF2BF2BF2BFBF4BF7B4F2B2F2B2F2B F2BF2B2F6BF2BF3B5F2BF3B2FB2F2BF3B2FB2F4B2FBF8BF4BF3B5FBFBF2B2F2BF2BF 3BF2BFBFB2F4BF8BF2BF4B3FB2F5B3F2BF5BF2BF11BF2BF2BF5BF3BF6B2F3B2FB2F3B F2BF4BD18B$BABABABABABABABABADABEBABABABEBABABAFAFAFABABABEBAFABAFEBA FEBABEBEBABEBABABABAFEBABABABAFEBABABABABEBAFEBABABAFABABABAFABAFABAB AFEBABABAFEBEBEFAFEBEBEBABAFEFABABEBABABEBABEBABEBABAFEBABAFABEBAFABA BABABEFABABABEFABABABABAFEBABABAFABAFAFEFABABEBABABABAFABEBABAFEFAFAB EBABEBEBEBABAFABAFABABAFABEFABEBEBABABABABABABABABEFEBEFEBABABEBABABA BABABABAFEBABABEBCBABABABABABABABABA$18BD7BF4B3F6B2FBFB2F2BF3BF7BF10B FBF2BF6B2F5B2F3BF3BF4BF4BF3BF2B2F2BF3BF2BF5BF3BF3B3F2BF10B2FB2F2B2F 12BFBF3BFBF2B2F2BF5B2FBF3BF4BF3B2FBFBFBF4B3F2B3F5BF8BF2BF2B2F2BF3BF2B F3BF9BF14B2F3BF6B2F3B2F9BF4B2F11BF3BF2BFBD18B$BABABABABABABABABADEBAB ABABABEFEBABABABABABABEBEBAFAFAFEFEBEBAFABAFEBAFABEBAFEBABAFEBABAFEBA BAFEBEFAFABEFAFABABEBABABAFABABAFABEBAFABEBEBABEFABABEBAFABAFAFEFABAB ABABABEFABABAFEBAFEBABAFAFABABABEFABEFEFABABABABAFABABAFEFEBABABABABA BEFAFABAFAFAFABABEBABEBABEFEBAFABABABABEBABAFABABAFABABABABAFABABABAB EBABEBEBABAFABAFEFEFABEBABABEBABABABAFABEBEBAFAFEBABCBABABABABABABABA BA$18BD2B2F5BF2BF4BFB2F4BF8BFB2F2BF3B4FBFB3FBF7BF2BFBF5BF7BF8BF6BF11B F3BF2BF2BF11BF3BF5BF2BF6BF2BFB2FBF5BF3BFBF2BFB3F3BF3BFBF3BF2B2F7B2F3B F3BF2BF2B2F15BFBF2B2F2B2F2BF3B4FBFBF3B2FBF2B2F9B2F6B4FBF4B2FBFBFB2F2B FBF3BFBF3B2F7BD18B$BABABABABABABABABADAFABEBABABABAFABABEBABABEFAFABA FABEBABABAFABEBABABAFAFABEBAFABABEBABEBEFABABABABABABEBABEFAFEBAFABAB ABEFAFABABABABAFEBAFEBAFAFABEBEFABABEFEBAFEFABABABAFAFABABABEFABABABA FABAFABEFAFAFEFEBABABEFEBAFAFABABEBABABAFABEBEFABABABABABABABEFEBABAF ABABEFAFEBAFABEBEBEBEBABEBABABABEBEFABAFEBABABEBABABEFEFABABEBAFABABA FABABABEFABABABAFEBABAFABCBABABABABABABABABA$18BD7B2F3BF3BF2BFBF2BF5B F8BF5BF2BFBF4BF3BF2BF4BF4BF3BF2BF10BFBF6B4F3BF8B4F2BFBF3BF3B2FBF3BF3B F2B2F8BF4B2FB3F4BF3B2FBF5BF12BF2B2F3B2F10B3FB2F3B2F16BF6BF6BFB3F4BFB 2F10BF10B2F2BF2B3FB3FBF4B2FBF3BF2B2F3B2FBF2BD18B$BABABABABABABABABADA BABABABABABABABEBABAFAFABEFABABABABABABABABAFABABABABABABEBABABEBAFAB EBABEBABEBAFEFEFAFABABEFABABABABEBABAFABABEFAFEBABABABABAFAFEFABAFAFE BEFABABAFABEFEFEBABABEBEBAFEFEBABAFEFABABEBABEFABAFABEFABAFAFAFABABAF EFAFEBABABABABEFABAFABEBABABAFEFEFEBAFABEFABABAFEFAFABEBAFABABABEFAFA BEBABAFABABABEBABABABABABAFAFAFEBABABEBABAFABEBABABABABCBABABABABABAB ABABA$18BDF2BF2BFBF2BF11B2FB2F3BF5BF3BF8B4F4BF6BF2BF2BF10BF9B2F2BF4BF 2BF8BFBFBF3BFBF4BFBF3BF2B3FB2FBF2BF2BF3BF4BF4B2FB5F2B2FBF4B3F5B2FBFBF 4BF4BF2B2F2B2F7BFB3FBF9BF7BF3B2FBF8BF2B2F7BF4BF6BFBF2B2F13B3F3BF4BFB 4F8BFBD18B$BABABABABABABABABADABABAFAFAFABABABEBEFAFABABAFABEFABABABA BABABABABAFEBABAFABAFABABAFAFABAFABEBABABABEBEBAFEBABEBABAFAFEFABAFAB EBEBEBEFABAFABAFABABABABABEBEFEBAFABABABAFABABEBAFABABABAFEBEBABABABA BABABABAFABAFABEBABABABAFAFAFEBEBAFEFAFEBAFAFABAFEBABAFABEBABAFEBABAB ABABEBEBAFABABABABABABABEFAFEBABAFEBABABABABAFEBAFABAFEBABAFABABABEBA FABEBABABABABABAFCBABABABABABABABABA$18BD5BF3BFBF3B2F4BFBFBF2BF4BFBF 5B2F3BF6BF2BFBFBF5BF2B2FBFBF5BFB2F5BF5B2F4BF2B2FBF23BFBF14BF2BF6BF2BF BF3BF2B2F6B2F2B2F7BF6B2F3BF5B2F2BF2BF9BF3B2F9BFB2FBF4BFB2FB2F4BF4BF3B 3FBF3BF6B2F2BF6BF4B3FB2F2B4F11BFBFBF2BD18B$BABABABABABABABABADAFABEBA FABABEBABAFAFAFABEBABEBEFABABABEBABABEBAFABABABABAFAFEBEBABABEFABABEF AFABABAFABABEBAFAFAFABABABABABEBAFAFABAFAFEBABABABABABABABEBABEFABABA FEBAFABAFEBEBABABEBABAFAFEFABABAFABABAFEBEBABAFABAFABEFEBABAFABABABAF AFEFAFABEFABABAFABEFEBABEFABEBEBABABAFABAFEBEBAFEBABEBABEBEBABABEFEFE BEBABABABAFABEBEFEFABAFABEBABABABABAFEFAFABEBABABCBABABABABABABABABA$ 18BD5BF2B2FB2F3B3F7BFB2F3BF7B2F3BF3B3F4BFBF2BF5BF2BF6BF3BF2BFBF3BF9B 3FBFBF5B2F17BF12B4F5BF3BFBF4BF2BF3B3F5B2FB2F2BF7B2F9BF8BF6BF6BFBF7BF 5BF2BF2BFB6F2BFB3F13BF3B2F6BFBFBF2BFBF2BFBF5BF6B2FBF2BF7BD18B$BABABAB ABABABABABADABEBABABABEBABABAFEFABABABAFAFEFABAFABAFAFEBABABABAFABABE BEBABEBEBAFEFABABABEBAFAFEFABAFAFAFEBABABAFEBAFEFABAFABABAFABABAFABAF AFABAFEBABABABAFAFABEBABAFABABABAFEFAFAFEFEFABEBABABABAFABAFABAFEBABA BABAFAFEFABAFAFAFEFABAFAFAFABABEFABEBEBEBABABEBABABEFABEBAFABAFEBAFAB EBABABEBEBAFABAFABABABABABAFAFABABEFEBABAFAFABEFABABABAFEFEBEFEBEBAFC BABABABABABABABABA$18BDBF2BF9BFBF4B2F2BFBFB2F8BF13B2F3BFB4F3B2F3BF4BF BFBF4BF9BF2BFBF5BFBFBF6BFB2FBFB3F11BFBFBF2BF2BF2BF3BF2BF7BF9BF2BF3BFB 2FBF3BF4BF3BF3BF4BFB2F5BFB3F3BF8BFBF2BF4B2FBF4B2F9B2FBFB3F4BF6BF5BF3B F4BF7B2F2BFB5F13BD18B$BABABABABABABABABADEBAFEFABEFEBABAFABABABAFEBAB EBEBABAFABABABABABABABABABAFABAFEFABEBABABABABAFEBABABAFABABEFEBABAFE BABEFABAFAFEBAFABABAFAFEBAFEFAFEBEBAFAFABABABEBEFABAFEBAFABABABABAFAB ABEBAFAFABABEBABAFAFAFABABABABABAFAFAFAFABAFABABABABABEBABABAFAFABABA BABABABEFABABAFABABABEBABABABABEBEBABEBABABEBEBABAFABEFABABAFAFABAFAB ABEBABAFABAFEBABAFABEFABABABCBABABABABABABABABA$18BD4BFBF5BFBFBFBF3BF 2BFBF2BF3B3F6BF2BF8BF5BF2BF4BF5B2F2BF2BF6BF13B2F6BF5BFB2FBF7B2F8BF2BF 4BFB3F2BF4B3F2BF4B2F2BF2B2F2BF4BFBFB2F2BF12BF4BF14B2FB2F5BFBF6BFBFB2F 3BFBF31BF4BFBFBF2B6FBF3BFBF6B2FB2F2BF3BD18B$BABABABABABABABABADABAFAF EFABABABEFEBEFABAFABEBAFEBEBAFABEBABAFEBAFABEBEBABEBEBABABABABABEBABA FABABEBEBABAFABABEBAFABABABABABABEBABEFABEBEBEBEFEBEFABEBABABEBABEBAF AFAFEFEBABAFABABEBEBABABABEFABABABEFEBABAFAFAFAFAFABABABABABEBEFABABA BABAFABEBABEFABABEFABAFABABAFEBEFABEBAFABAFEBABABEBAFABABABABABEBABAB ABABABABABEFABABAFAFABEBABEFAFAFAFABEBAFABAFEFAFAFCBABABABABABABABABA $18BD4BF5B4F2BF2BFBF2BF14BF5BF6BF2BF5BFBF23BFBF2BF8BF3BF4B2F2BFBF2BFB FBF2B2FBF3BFBF5BFBF4BFBFBF11BF10BF2BFBF5BFB2F3BF8BF5BFBFB3F3BFBF3BF5B F5BF2BF7BF5BF6BFB2F3BFBF3BF2BFB2F2BF4BFBF5BF2BFBF3B3F8B3F4BF4B2FB2FD 18B$BABABABABABABABABADABEBABABABEBAFAFABEBAFABAFABAFAFEBAFABABEBABAF ABABEBABABABABAFABABABEFAFEBEBABABABABABABABEBABABABAFEBAFEBABEBABAFA BABAFAFABEBABABEBEBEBABEBEFABABEBEFABABABEBEBEBABAFABABABEBABAFABEBAB ABABEBABABABABEBAFEBEBEBAFEBABAFEFEFAFABABEBAFABABEBAFEFABEBAFAFEFABA FAFAFAFAFEFAFABABABAFABEBAFEBABEBABABAFEBEBABAFEBABABABABABAFABAFAFEB AFAFAFEBABCBABABABABABABABABA$18BD5FBF3B3F3BF7B2F6BF2BFBF11BFBFBFB2F 3BF2BFBF2BF2B4F5BF2BFBFBF7BF4BF10BF8B4F11B2F2BFBF4BF2BF7B3FBF2BF4BF5B F2BF2BF3BF2BFBF2BFB2F2BF2BF4BF2B2F4B3F8B3F5B2F8BF3BFBF2BF2B2F6B4F4BF 4BF4B2FBF2BFBF2B2F3BFBFBF3B2FBF6BF5BFB2F5BD18B$BABABABABABABABABADABA BAFEBABAFABAFABAFEBEFABEBEBABEBABEBABABEBAFABEFAFAFAFAFAFABABAFEBEFEB EBABEFAFEBABEBABAFAFAFABABABABABABEBABABAFEBABAFAFAFABEFABAFABABEFEBE BABABEBABABABABEBABABAFABABABEBEFEBEBEBABABABABABEFEBABABEBABEFAFABAB EBEBABABEBAFEBABABABEFABAFEBAFEFEBEBEBAFABABABABABAFAFABAFABEBABABABA BABAFEBEBABABAFEBEFABABEBABABABABABEBEBABEBABABAFAFAFCBABABABABABABAB ABA$18BDF3BF6BFBF2B2F5BFB3FBF2B2F3BF2BFB3F2BF4BF7BFBFBF7B2F3B2F2B2F3B FBFBF5BF2BF4BFBF2BF3B2F14BF2BFBFBF2BF2BFB2FBF2BF7BF2B2F7B2F4BF2BFB2FB F2BF7BFBF3BF11BF2BFBF2BF7BFBFBFBF5BF12BF4BFBF3BF2BF12B2F5BF3BFBF6BF4B 5F2BFBF4BF7B2F2BD18B$BABABABABABABABABADABABABABAFAFABABEBEBAFAFEBABE BABEBAFEBEFABABABABABABEBABAFEBABABAFEBABAFEBAFAFEBAFEBAFAFABABABABAF EBEBABEBEBAFABAFEFABEFAFEBAFEFABABEBABABABAFEBABAFEBAFABAFAFABABAFEFE BABABEFABABAFABABAFABEBAFABEBABEFEFABEBEBAFABABAFEBABABABAFABABAFABEB ABABAFABABABEBABABAFAFAFAFABEBABEFEBABEBABAFEFABEFEBABABABABABABABABA BABAFAFABEBABEBEBABABAFABEBCBABABABABABABABABA$18BDF7BF4BF7BFBF4BF5BF 2BF5BF8BFBF2BF6BF3BF6BF4BF4BFBFBF2B3F2BF5BF4BF4BFB2F2BFBF2BFBF5BF3BFB 3F5B8F6B2FBF9BF2B2F2BF10BF5BFBFB2F3B3F3BF2B2F3BFBF4BFB4F7BFBF4BF4B2F 5B2F2BF6BF2BF2B2FBF2BFBF6BF3BF3BF15B3F4BF5B2F2BD18B$BABABABABABABABAB ADAFAFABEBABEBAFABAFEBABABABABEBAFEBEBAFABEBEBEBABEBAFAFAFABEBEBAFEBA FEBABAFAFABABEBABABAFABABEBABABABAFABEFABABABEBAFABEFAFABABABEBABABEB ABEBABABEFEBAFABAFABEBEBABAFABEFABABEFEBEBABABAFABEBEBAFABEBABABABABA BABABEBAFEFAFEBABAFEBABEFABABAFABEBAFABABABABEBABABABAFEFAFEBABEBAFAF ABABABABABAFAFABEBAFEBABEBABAFEBABAFAFABABABEBAFEBABAFABAFCBABABABABA BABABABA$18BDBFBF9BFBF6B2F3B2F4B2F2BF5B2FBF2BF6BFBF2BF7BFBF3BF4B6F2B 2F4BF2B2F3B3FB2F5BFBF3BF2BF2BFBF8B2FBFBF8BF5B3FBFBFBFBF3BF2B2FBF2BFB 2FBFBF2BF5BF5B3F9BF3BF6BF4BF4BF2BF3BF5BF7BF4BF4BF4BF12BFB2F7B3FBF3BF 11B2F5B3F6B2FD18B$BABABABABABABABABADABABABABAFEBEBABEFABABABABABABAB AFEBEFABABEBAFEBEBEBAFABABAFABABABABABABABEBABABABABEFABEBEBABAFEBABA BABAFABEFABEBABAFEBABABABABEFEFABABABAFABABABABABABABEBABABEBAFAFEBAF EBAFEBAFABEBABAFABEBABEBAFABAFEBAFAFAFABABABABAFEBEBAFABABEBABABEFABA BABABEBAFAFABABABEFEBAFABABEBAFABAFAFABAFABEBABABAFABAFABABEBABABABEB ABEFEBABEBABEFABEFABEFAFCBABABABABABABABABA$18BD7B2F11BF5B2FB2FBF12BF 7B2F22BF4BFB2FBFBF8BF17B3F7BFB2F7BF3BF6B2FBF7B3F3BF5BF4B2F5BF4BF2BFBF 3BFBF2B3F6B2F5BF8BFBFBF5BF3BF9BF2B2F3BF3BFBF5BFBFBFBF14BF6BF5BFB2F5BF BF2BF4B2F2B2FBFD18B$BABABABABABABABABADABABEBEBAFAFAFABABABABEBEBEBAF EFABEFABABABABABABEBAFEBABABAFEBABAFABABAFABEBABEFABEBABABEBABABEBEFE FEFABAFABABEBABAFABABABAFABAFEFEBABABABABEBABEBAFABEBABABAFEBABEBEBAF EBAFEBABAFABEBEBEFABABEFABEBAFEFEBABABAFAFABAFEFEFAFABEFEBABAFAFAFABA FEBEBABABEBABABABABAFEBAFABEBABABABABABEBABABEBAFAFEFEFABAFABABAFABAB ABABABEFAFABABEBAFABABAFEBCBABABABABABABABABA$18BD12BF6BF6BFBF3BFB2F 5BF15BF3BF8BF17B3F9BF3BFBFBF3BF3BF3BF3BF2BF7B2F2BFBF5B2F2BF4BFBF2B3F 2BF2BF22BFBF8BF2BFBF6BF10BFBF5BF2B2F8BF3BF3BFBF11BF3BF8BF4BF3BF2BF8B 2F2BF3BFB2F2BF3BFBF6BFBD18B$BABABABABABABABABADABAFABAFAFABEBABABABAB AFABEBABABEBABABAFABEBEBABAFABABABABABAFABABABABEBABABABEFAFEBEBABABE BAFABABEBAFAFABABEFABEFEBABABABAFABABABAFEBABEBEBABEBABABABEFABABEBAF ABABABABABABEBEFABABABABABABABEFABABEBABABABABABABEBEFABABEBAFEBABABA BEFABABABABABEBAFABABEFABEBABEBAFEBABABABAFABABABABEFAFABEBAFABAFEBAF ABABABAFABAFEBEBABABABEFABAFEFABEBCBABABABABABABABABA$18BDF2BF6BF2BF 5BFBF3BF3BF3B2F7B4F3BF2BF7BFB3F2B4F6BFBF4BFBFBF2BF4BF4BFBF4BF3BF3BF2B F4BF11BF2B2F2B2F4BF13BFBF4BFBF3B2F4BFBF10BF3BF2BF4B2F2BFB2F3BFBF2B2F 3B2F6BF3BFB2F3BF7B2F5BFBF2BF3B2F5BF2BFBF7B2F4BF6BF2B2F4BF2BF3BF2BF2B 2FBFBFD18B$BABABABABABABABABADABAFABABEBABABABABEFEBEBEFAFABABAFEFABA BAFAFABABABEFABEBABEBEBABAFEBABABEFAFABEFEBAFABAFABEFEBABABABABAFABEB AFEFAFABABAFABABEBABEFEBEFABEBABABABAFEBEBAFABABAFABABAFEBAFABAFAFABA BAFEFEBAFABAFEBABABABABABAFABEFEBAFABABEFEBEBEBEFEFEBAFABABABAFABABAB ABABABABEBABABEFAFEFAFABABABABEBEBABABABEBAFABEBABABABABABABEBABABABA FAFEFABABAFEFABEBCBABABABABABABABABA$18BD4BF3BFB2F5BF3BF3BF7BF5BFB2F 9BFBFB2F6BF2B2FBFBF7BF3BFBF13BFB3F5BF4B5F2BF2BF9BF2BFBF2BF2BF2BF2BF2B F5BF2BF3BF5BF3BF2BF3BF2B2FBFBFBF10BF7BF5BFBF5BFBF5B3F7BF11BF7B2F5BFBF 6B6F3BF4BF11BFB2F10BFB2F6BD18B$BABABABABABABABABADEBAFABABAFABABAFABA FAFABABAFEBAFABEBABABABEBABABEBABABAFABEBAFEBEBEBABAFEFEBAFEBABAFEBAF ABABABAFABAFAFEBABEFAFAFABEBEBEBABEBAFABABEBEBABAFEBABAFABAFABABAFEBA FEBABEBEFAFEBEFABABABAFEFEBABABABABEBEFEBAFAFABEFAFAFABABEBAFEFAFABAB ABABABEFABAFAFAFEBABABABABABABABABAFEFABABABABABABABAFEBAFABABABEFEFA BABABAFAFAFAFAFABABAFEFABEBABABAFABABCBABABABABABABABABA$18BD2BF4B2F 5B2FBF5BF2BF6BF2B3FBF5BFB3F5B2F7BF4BF7BF2BF8BF4BF2BF10BF10BFB2FBF9BFB 3F2B2F2BF2B2F4B2F2BFBF6B2FB3F3BFBF3B2F2B2F2B2FBF2BF5B2F5BF2BF4BFB2F2B FB2FBF2BF3BF2BF3BF2BFBFBF4B3F2BF5BF6BF4BF13BFB2FBF5BFBF2BF4B3F3BFBFBF 5BF2BD18B$BABABABABABABABABADAFEBEBABEBEFABEBEBAFABEBEBABABABEFEBEBAB ABABABABEFABABABAFABABAFEFABEBEBEBABAFEBAFEBABABEBABEBEFABEBABEBEBABA BABABABAFABABABABABABAFEFAFAFEFAFABABAFABAFABABABEBAFEFABABABAFEBABAB ABABEBEBABABABABABABEFABABABAFEFEFEBABABABABAFAFAFAFABEBEBEBAFABEBAFE FEBABABEFEBAFAFABABAFEBEBABEBAFEBABEBEFAFABEBAFEBABEBEFEFABABEBABEBEB ABEBABEBABAFABABCBABABABABABABABABA$18BDF2B2FB2FBFBFBF2BF15BF2BF4BF 10BFBF10BF2B2FBFBF9BF11BF7BF7BF4BF3BF12BF2BFB2F2B2FBF2B2F3BFB3FBF4B2F 9BF6B2FBF2BF6BF3B2F3BFBFBF9BF5B2F6BFB2F3BF2B2FB2F6BF2BF3BF11B2FBF4BFB FBF3BF8B3FBFBFBF11B2F6BF3BFB2FD18B$BABABABABABABABABADABAFABABABABABA BAFEFABABEBABABAFABABAFABAFEFABEBEBABABEBABEBABABABAFEBABEBABEFAFABAB AFEFEBABABAFABAFAFABABEBEBAFABEBABABEBABABEBABABAFEBEBEBABABABABABAFE BEBABABABEFEFAFEBABABEFABABEBABABABAFABABABABEBAFABABABAFABABABEBABEB EFAFABEBABABABABEBAFABEBABABABABEBABABABAFEBEFABABAFABEBABEFEFABABAFA BAFAFABABABAFEBEBABAFABAFABEBAFAFEFABEBEBCBABABABABABABABABA$18BD9BF 5BF8BF5B2F5BF2B2FB2F3BFBF4BFB3F2BFB3F4BF9B2FBF10BFBFBF4BFBFBF6BF6BF3B F6B2F5BFBF2BFB2F5BF3BFBF3BFBF5BF6B2F3BFBF3BF2BF5B2FB2F7B3F3BF3BF3BFBF 2BF3BFBFBF10BF2BFBF2BF3B2F6B2F2BFBFBF3B3F2BF11BF4B3F2BF3BFBF8B2FBF3BF BD18B$BABABABABABABABABADEBABABAFABABAFABABAFABABABEFEBAFABAFABABAFAB ABAFABEFEFABABEBEBEBAFAFEBEBABEBABEBAFABABABABABAFEBAFABABABABEFAFABA BABABAFEBAFABEBABABEBEFEBEFABABEBAFAFABABABABEBAFABABABABEFEBEBABABAB ABABABEBABABABABABAFABAFAFABEFABEFAFEBEBEFABABABABAFEFEBABEFEBABABABA BEFABAFABABAFABAFEBABABEBAFEBEBEBEBEBEFEFABABABABABEBABEBEFEBABEBABAB ABABABEFAFEBCBABABABABABABABABA$18BDBF12B5F5BFBF2BF4B2F3BF3BF2BF7BFB 6F6BF2BF2BF6B2F2BF3BFB2F2B2FBF3BF6BFBF3B2F5B2F9BF2BFBF3BFBF2BF7BF2BF 5BF2B3FBF9BF4BF3BF16BFB3FB2F13BF2B3F5BFBF3BF3BF2BFB3F3BFBF4BFBF7BF6B 2F10BF5BFB3FBF3BF19BD18B$BABABABABABABABABADAFAFABAFAFABEFABEBABABABA BABABAFAFABABAFEBABEBABAFABABEBEBABAFAFABEFABEBABABABAFEFABABAFEBABAB ABABAFEBAFABEBABAFABABEBABEBAFABAFABAFEBABABABEBABABAFAFABABEBABEBAFA FABAFEBEBABABAFAFEFABABEBABABABABEBAFABABAFEBAFABAFEBABEBEBAFABEBABEB EFABEBAFABABAFEBEBEBABAFEBAFABABABABABABABABABAFAFABEBABEFABABABAFABA BEBABABABEFABAFABABAFEBABABABEBCBABABABABABABABABA$18BDF5B2F4BFBFBFBF 2B3F2BF3BFBF3BF5BF2B2F2BF5BFBF3B2F5BFBF11BF3B2F5BF6BF3BF2BFBFBF3B2F 14B2F6BFB2F2BFB3F5BF4B4F5BF5B2F7BF14B2F3BFBFBF3BF3BF8B2FB3F4B4F9BF5B 2F7BF6BF8BFB2FBF4B2F18BFBF15BF4BD18B$BABABABABABABABABADAFAFABEBABABE BABABAFABABAFABABEFABABAFABABABAFABABEBAFABABABABABABEBAFABABABABABAB EBABABEFABAFABABEFAFABEFABABABABEFAFABABABEBABABEBABABEBABEFAFAFAFEBE FEBEBABEBABEBABEFABABEFABABABAFABABAFEBABAFABABAFAFEBABEBABABEBAFEBEB ABABABAFEFEFEBEBABEBAFAFAFABABEBEBAFAFABABEBABABAFABEBABAFAFABABABABA BEBABAFEBAFEBABABEBAFABABEFABAFABABABAFEBEBCBABABABABABABABABA$18BDFB 2F4BF4BFBF2BF6BF4BF6B2FBF2B2F4BFBF2BF3B2F4BF14BF4B5F2B2FB2FBFBF2BF4BF 3BFBF11B2F2BF4B2FBF5BF7B2FBF5B2FBF9B2F6BF5BFB2F2BF2BF3BFB2F2BF9BF2BF 8BF3BF3B2FBFBF3BF3B2F6B2F3BF2B2F2BF4BF6BF2BFB2F4BF3BF2B2FBF5B2F4BFB5F B3FBF3BFBD18B$BABABABABABABABABADABABABABABAFAFEBABABEBABABAFEBABABAB ABABAFABABEFEBABABABABABABABABABABABAFEBAFABABABEFEBABAFAFEBEBABAFABA BABABEFABABABEFEBABABABABEBEBEBAFEFAFABEBAFABEBAFABEFABABEBABEBEBABAB ABAFAFABABABABABABABABABAFABEFAFAFABAFABEFABEBAFABAFABEBEFABAFAFAFAFA FABAFABEBAFEBEBABAFABABABABEBABABABAFABAFABABEBAFABAFEBEBABABAFEBABAB EBABAFAFABEBABABABABCBABABABABABABABABA$18BDBFBFBF6BF5BF5BF7BF4BF20BF 2BF3BF5B2F2BFBF5B2FBF4BF3BFBFB2FBFB2F2BFBFBFB2FBF2B2FBF7BF2B2F6B2F4BF BF3B2F3BFBFBF3BFBFBF3BFBF6B4FBF4BF18BF3BFB2F2BF14BF2BF2B3F3BFBF6BF4BF 15B3F4BF2BFBF4BF2BF2BFB3FBFBF8BF8BF2BD18B$BABABABABABABABABADABEBABAF ABABAFABAFABAFABEFABEBABAFABABABABABABAFABABABEFABEBAFEBABAFABABABABE BAFAFABABAFABEBABABEBEBABABEBEBAFEBAFEBABAFABEBAFABABABABEBEBEBABABAB EBABABABABEBABABEFABEBEBABABABABAFAFABAFABABABABABABEBABABEBABAFEBEFA BAFABABABABEBEBAFAFEBABEBEBAFABEFABABABABABAFABABAFABAFAFEBABABABABEB EBAFABABABEBEBEBABABEBABEBABEBABABABABAFEFEBABABCBABABABABABABABABA$ 18BD2F2BFBF5B2F4BF3BFBF3BFBFB3FBF6BFBFBFBF4BF2BFBF5BFBFBFBF7B2F2BFBF 2BFBF4BFB2F8BFBFB3F6B2F2BF2BF5BF6BF5BF2BF2BF6BF9B3F3BF2BF10B2F3BF11BF 10B4F2B2F3BF7BF8BFBF3B2FB2FB2FB2FBF4BF3BF5BF5B2F6BF2B2F3BF2B4F2BF14BF 2BF4BD18B$BABABABABABABABABADEBABABABABABABABAFABAFABABAFEBABABEBAFAB ABEFAFABABABABEBABABABAFEBAFABAFEBABEBABABAFABEBAFABEBEFABABAFEBEBABA BAFEBABEBAFEBEFABAFABABEBABAFABABEFABABABABAFABAFEBEFABABAFEBABABEBAB AFABABAFABEBEFAFAFAFEBABEFABABABEBABEFAFABEBEBEBAFEFABEFEBAFAFAFEBABA BABAFEBAFEBABEBABABEBABAFABEBABABABEBABAFAFABABAFABABABABABEFEBAFABAB ABABABEBABEBAFABCBABABABABABABABABA$18BDF4BFBF4BF4BF5BF4B2F7BFBFB3F3B 2F6BF2BF6B2F2BFBF3BF2BF8B2F7BF6B2F7BF8B2F2B2F5BF2BF2BF3B2F7BF6BF3BF2B F4BFBF2BF3BFBFBF2BFB2FBF3B2F3B2F4BF3BF3BF3B2F7BF3BF7BF3B2F2BFBF11BF2B F3B2F2BF8BF12BFB2FB2FB2FBF7BF3B3FBF6BF2BFD18B$BABABABABABABABABADABEF ABABABEBAFABABABABAFEBABEBAFEBAFABEFABABABABABAFAFEBABAFEBAFABEBABABA BABABAFAFAFABEBABEFABABAFABEBABABABEFEFABABEBAFAFABEBEBABEBEBABABABEB AFAFEFEBEBAFABABABABAFABABEBEBAFEBEBEBEBAFABABEBEBEFABABEBABAFAFEFEFA BABEBABABAFABABABABEBEBABABABABABAFABABEBAFAFAFAFAFABEBABABEBEFABAFAF ABEFAFABAFABEBAFABABABAFABAFAFABABAFABABABAFEBABAFABCBABABABABABABABA BA$18BD3BF9BFBF2BF4BF3BF2BF7B2FB2FBF6BF2BFB4F3BF4BFBF4BF10BF3B3FBF2B 3F3B2F13BF7B2F3B2F5BF8BFBF4BF7B2F5BFB2FB3F4BFBF2BF2BFBF4BF2B2FBF4BF3B F7BF4BFB2FBFBF2BF2BF3BF2BF3BF3B3F6B6F20BF2BFB2F5BF4B3F5B2F3B2F2BF4B3F 3BD18B$BABABABABABABABABADABAFEBABABABEBABEBABEBABABABEFEBAFAFAFEFAFA BABEBAFAFEBABAFABEFAFABABAFAFABABABABABABABEBAFABABAFAFABABAFABABAFAB EFAFEBABEBAFAFEBABABAFAFABEBABAFABEBABABABEBABABEBABABEBEBEFABAFABABA BABEBAFEBABAFABABABEBABABABABABABABABEBABABABABABAFEBAFABEBABEBABEFAB ABABABABABEBAFAFABABAFAFEBEBABABEFABAFAFAFEBAFABEBABAFABEFEFABAFABABA BABABEFABEBABCBABABABABABABABABA$18BDFB2FB2F8BF2BF17BF9BFBF2B2FBFB3F 5BFBF2BF3BFB2F9B2F3BF6BF9BF10BF2BFBF5BF9BFB2F9B2F3BFBF8BF4BF2B3F5BF 22B2FB2F2BF8BF2BF5B2F3BF9BF2BF8B2F2BF12B2F4B2FBFBF2BF4BF4BF2BF22BF4BD 18B$BABABABABABABABABADAFABABABABEBABEBEBEFABABABABABABEBABEBABABABEB ABAFABABABAFABABABEBABABABABAFAFABEFABEFABEBABABABABABABABABEFABEBABA FABAFABAFEBABABABEBABEBABABABABAFEFABABABAFEBEBABEBAFABAFEFABABABABAF EBABEFABEFAFABEBEBABABAFABABABEBABABABAFABABEFEFABAFABAFABAFAFAFABABA BABEBEBABEBAFAFAFABAFEBABAFEBEFEBABEBAFEFABAFABABABABABABEBABABEFABAB ABEBEFABEBCBABABABABABABABABA$18BD2FBFBF8B2FBF8BFBFBF7BFBF5BFBFB2F2BF 3BF3BFBF7BF24B4F6BF2B2FB3FBF12BF4BF7BF4BF2BFBF6BFBF3B2FB3F6B2F5BF4BF 3BF11BF4B5F2BF2BF6BF2BF7B2FBFBF6BFB2F3BFBFB2F4BF2BF5BFBF6BF6B2F10B2F 8BFBFB2F5BF2BF2BD18B$BABABABABABABABABADAFAFAFEBABEFABABABAFEBEFAFEBA BABEBAFEBABABABABAFEFEBEFEBABABABABABABEBABABABABEBABEBEBABABAFAFAFAB ABABABABABEBABABEFEBAFABEFABEBAFEFAFABABABABABABABEBABABEBABEBAFEFEBE BABABEBEFABABEBABABABAFABEFEBAFAFEBEBEBAFABABAFEBABABABABEFABABABABAB ABABEBABABABABEFABAFEBEBABAFABAFABEFAFABABEFABABABABABAFABEBABAFEBABA BAFAFAFABABABABABEFABABEBABCBABABABABABABABABA$18BD8BFBF8B2FB3F5BF9BF BF2BFBF2BFBF3BFBFBFB2F4BF3BF3BFBF12B2F3BF3BF7B2F5BF4BF4BF5BFB2F2B3F2B 2F5BF2BF2BF6BF2BFB2F4BFBFBFB2F13BF2BF4BF3B2FB2F4BFBF5BF3BFB2F2BF2BF2B FBF2B3FB3F4B3FB2F2BF3BF9B2F5BF6B2FBF3BF3BF3BFBF3BF3B2FB2F4B3F4BD18B$B ABABABABABABABABADAFEBABEFEBEBEFABEBEBABEBABEFABABABABABEBABEFABEFABA BEFABABAFEBABAFAFABEBABEBEBEBABABABABABEBEBAFAFABABABEFABABABEBABAFAF ABAFAFAFABABABABAFEFABABEBABABABEBABEBABABABAFEBABABABABAFEBEBABAFEBA BABAFABABABAFEBAFEBABABAFAFABEBABABAFEBABABABAFABEBEFABAFABABABEBABAB AFAFAFEBAFABABEFEFABABABABEFABEFABABAFABEBAFEBABAFABEBAFEBAFABEBEFABA BEBABCBABABABABABABABABA$18BD10BF2BF5BF6BFB2F12BF5B2FBF4BF2BF4B3F3B2F 5BF13BF5BF3BF2B2F3BF2B2F10BF9B2F6B2F6B2F8BFBF12BF6B4F4BFBF4BFB2F6BF4B F2BF9B2F7BF13B4F5BFBF7B2FBF3BF3B3F3B3F2BF3BF3BF4B2F6BF2BF2BF4BF6BF3BD 18B$BABABABABABABABABADABABABABEFAFEFABAFAFAFEBABABABABEFABEBEBABAFAB EFABAFABABABABABEBABEBABABABABEBABABABAFABEBEBEBABABABEFEBABEBABABABA BAFAFABEBABABEFAFABEFABAFAFABEFEBABABEBABAFABABEBABABABAFABEBABABEBAB AFEBABEBABAFABABEBEBEBABEFABEFEBABABAFABEBABEBABAFABAFEBEBABAFABAFAFA BABAFABABABABABEBABABAFEBABAFABABAFEBEBABEBAFEFAFAFEBABEBABABAFEFABAB AFABABAFAFCBABABABABABABABABA$18BD6B2FBF9B3F9BFBFBF6BF5BF2BFBF2B2F2BF 8BF7BFBF2BF3BF2B2F2BF6B2F12BF9B2F5B2F3B2FB2F2BF2BF14BFBF3BF6B2F6B3FBF 4BF5BF3BF3BF2BF3BFBF8BF3BF3BF5BF3BFB3F3BF2BFBF2B2F2BF2BF9BF4BF2B2F4BF 6BF2BF4B2F4BF11BFBF8BD18B$BABABABABABABABABADABAFAFABABABEFABABEBABAB EBABABABEFABAFABEFAFEBEBAFABABABAFABABEFABABABAFABABABEBABABABABEBAFA FABABAFEBEBAFABABABEBABEBABEFABAFABABABABEBAFABEBABABABAFABAFABAFEBEB ABEBABABAFEBABAFABEBEBABAFAFABABABEBABABABEBABABABEBAFABABABEBABAFEFA FAFAFEBABEBAFABAFABEBABABABEBEBABEFABABABABEBABABEBAFABABAFABABAFAFAF AFEBAFABAFEFEFABEBABABEBEBABAFABCBABABABABABABABABA$18BD10BFB2F7BF6B 3F7B2F2BFBF3BF2BF4BFBFBFBF4BF5BFBF6BFB2FB3FBF4BF4BF4B2FBF2B2F3BF8BFBF 7B2F7B2F11BF3B3F4BFBFBF5BFBF11BF8B2FBFBF7BF5BFBFBF6BF7B2F5BFBF2B2FB2F BF2BF4B2F2BF4BF2BF5BF2B2FBF3BF6BF3BF6B2F7BFBF4BF2BFD18B$BABABABABABAB ABABADABABABEBABEFABABABABEBEBAFAFABABABEFABEBABEBEBEBEBEBABEBABAFABA FEBABABEFAFABABABABABABABEBAFEBABABEBEBABAFAFABEBAFABABABAFAFABEBABAF ABABABABEFEBABAFEBABABAFABABABABABABAFAFAFABABABABABAFEBEBABABABABAFE FABEBABABEBEFAFEFABABEBEBEBABABEFAFEFABAFABAFEBABEBEBABEBABEBEBAFABEB AFAFAFABABEBEBAFEBABEFEFABABABAFABABEBABEBEFEBABEBEBABABABAFABCBABABA BABABABABABA$18BDF5BF3BFBFBF6BFBF5BF2BF3BF3BF2BF3BF4BF8BF15BF2BFB3F5B F3BFB2F13BF2B3F4B2F4BF3B3F7BF3BF3BF2B2F5BF3B2F3BF2BFBF7BFBF2B2FBF11BF 3B2F2BFBF3BF4B2FBF21BF2BF3B2F3BFBF2BF2B2F3BF5BF19B3F7BFB3F3BFBF6BF4BF B2FD18B$BABABABABABABABABADABAFEBABAFABEFEBEBABABABEFABABEBEBAFABEBAF ABEBABABABEBABAFABABAFABABAFABEBABABABEFABABEBABABABEBEBAFABABABABEBE BABEFAFABEBEBABAFEFABABEBEBEBAFEBABAFAFABAFEBABABABABABABAFABAFAFAFAB ABABABABABABABABEBABABAFABEBAFAFABABABABABABAFABABAFABABAFABABABEFEBA BEBABABEFAFAFEBABABABEFABABEBEBABABABABAFAFABABABAFAFABEFEFABAFABEBAF ABAFEBAFABABAFCBABABABABABABABABA$18BD2F2BFBF3BF2B2F3BF2BFBF2B3FBF3BF 3BF2BF10B2F9BFB3FBFBFBFBFBF5B2FBF6B2F5B2FBFB2F3B2F6BFBF6BF2BF2BF4BF4B FBF3BFBF2B2FBF7BF3BF3BF3BFBF3BF4BF7BF3BFBF5B3F4BF2BFBF3BF3BFB2F7BF5BF 5BF3BFBFBF2BF8BFBF6BF3BF3BF3BF2BF3BFBFBF2BF3BF5B2FBFBFBF7BFD18B$BABAB ABABABABABABADEBEBAFABABABEBEFABABABEBABAFAFEFEBEBABAFABABEFABABABABA BABEBAFAFAFAFAFABAFABEFEBAFABEFABEFABEBEFEBEBABEBEBABAFEFEBAFEBEFAFAB EFABABABAFEFAFEBEFABABAFAFEFAFABABABABABABAFABEBABAFABAFEBABAFABABEFA BABABEBABABABABAFEBAFABABAFEBABAFABEBABAFAFABAFEBABABABEFABABEBEFABEB EBEBEFEBABAFABEBEBAFAFABABAFABEBEBEBAFABAFABEBEBEBAFAFAFABABABABAFEBA FCBABABABABABABABABA$18BD3F4B3FBF3BF7BF5B2F2BF3BF2BF8BF3BF2BF4BF5BF4B F2B2F3BF2BF2BF8BF4BF5B2F3BF4B2F23BF5BF2BF3BF5BF3BF2B2F27B4F4B3F2BFBF 8BF3BFBF10B2F10BF5BF2BF4BFBF4BF2B2F2B3F12BF2BF2BFBFBF15BF3B4F6BD18B$B ABABABABABABABABADABABEBAFEFABABABAFAFEFABABABAFABAFEBAFABEBABAFAFAFA BEBEFABEBABAFAFEBABABEBABABEFABABABABEBABEBEBABEBAFABEBEBEBAFABAFEBAB ABABAFAFABABABABABEBEFEFAFAFAFABEFAFABAFEBABAFABABABAFABABEFAFABABABA BABABABABABABAFAFABEBAFABAFEFEBAFAFABABAFEBEFABABABABAFABABEBAFAFAFAF ABABABAFABABEBABEBABABEBEBABABEFABEBABAFABEFABEFABABEBEBEBAFAFEBAFABA FAFABCBABABABABABABABABA$18BD8BF3BF12B2F10BF2BF8BFB2F4BF8BF2B2F2B4F3B F5BF6BF13BF6BFBF4BF8BFBF2BF4BF3BFBF2BF5BF2B2F4BF3BF2B2FB2F4BF2BF3BFBF B2FBF4B3F10BF7BF5B2FBF6BF8B2F7BF4BF5BF10BF2BF12BFB2F3BF8BF4BFBF4B2F6B 3FBD18B$BABABABABABABABABADABEBAFABABABABABABAFABABABAFAFEBABEFABABAB ABEBEBABABAFABEFABEFEBABEFAFABABEBEBABABABEBABAFABABABABABEBEBEBAFABE BAFABABABABEFABEBABAFABAFABABEBABABAFABABABEBAFABABABAFEBABEFEBEBABAB AFAFAFABAFEBEFABABABABEFAFABAFABABEBAFAFABEFABABABABAFABABABABAFEBABA BABABEFABABEFABEBABABEBEBABABAFAFEFAFABEFEFABEBABABEBABABABEBEBABABAF EBABABAFABAFEFCBABABABABABABABABA$18BDBF4BF2BF14BFBF2BF2BF5BF3BF4BF6B 2F7B2F3BF4BF4BF3BFB2F2B3F2BF5BF5BF3B2F2BF2BF2BF4BF2BF3BF3BFBFB2F3BF2B FBF3B2F6BFBF2BF8B2F3B2F4B2F7BFBF5B2FBF4BFB2FBF5B3FBF2B2F2BF5BF2BF3BFB F5BFB3FBF3B3F4BF6BF3BF6BFBF2B2F3BF2B2F4BF6B2F6BFBFBF2BFBD18B$BABABABA BABABABABADABEBAFABEFABABEBABABABABABABABABEBABAFEBABAFABABABABABABAB ABABEFAFABABABABEBAFABABAFABABAFABABABEBEBABABABAFEFABABABABABABABABE BEBABAFABABABABABAFEBABAFABAFABABEBEBEBABABAFABEFAFAFABABABABABABABEB AFABEBABEBAFABAFAFAFABEBAFEFEBABEFABEBABEFABABEBABEBABABABABABABABEFA FABEBEBEBABABEFABEBABABAFEBABABABABABAFEFABEFEFAFABABAFABEBABABABAFCB ABABABABABABABABA$18BD2B3FBF8BF2BF3BF7BF4BF2B2F10BFB2F5BF3BF4BF2BF2BF 13BF8BF3B2F5BF6BFBF6B2F4BF11BF2BF12BF4BFBFB3F4BF6BFBFBF2BF8B3FBF3BF7B F3BFBFBF3BF3BF2BF3BF4BF2BF5BFBF2B2F2B2F4BFBF14BF3BFB2FBF14BFBF5B3F8BF 6BD18B$BABABABABABABABABADABABEBABEFABABAFABABEBABEBEBABEFABABEBAFABA BABABABABABABABAFABAFABABEBEBAFEBABABAFAFAFAFEBAFABAFABABEBABAFEBABEF ABAFABEBAFEBAFABABABABEBABABABAFAFABAFAFABABABEBAFABEBAFABEBEBABABEBE BABABABABEFABEFAFEBEFABEBAFEBABAFABAFEBABEBAFAFABABABABABAFAFAFABAFAB ABEBABEBABAFABABEFEBABABABABABABEBABABAFABABABABAFAFEBABEBABABABEBABE FABABABAFEFABCBABABABABABABABABA$18BDB3FBF3BFBFBF2BF5BFBF7BF4BF10B2F 3BF6B2F3BF2B5F3BF2BF2BF3BFBF5BFB2F2BF4BF3BF5BF6BFB2F11BF12BF3BFBF3BFB 2F6BF2BFBFB2FBF6BF2B2FBF8BF7BF2BF10B2F2BFB2F2B2F10B3F2BFB2F4BF4BF3BF 2BF2BF3BF5B2FBF4BF3BF4BF3BF5BF9BF10BD18B$BABABABABABABABABADABAFABABA FEBABABABABABABEFABAFABAFABABAFEFABEBEBAFEBABABABAFEFEBABABABABAFABEB ABEBABABABEBAFABAFABEBABEBABAFABABAFABABABABABABEBAFAFAFABABABEBAFAFA BEFAFABAFABABABABABEBABAFEBEBAFEBEBABABABABABABABABEBABAFABABEBABAFAB AFABEBEBABABAFEBEFABABEBABAFEBABEBAFABABABABABAFABABEBABABABABEBABABE FEBAFAFEFEBABABAFEBABABAFABAFABAFABEFAFABEBABABCBABABABABABABABABA$ 18BDBFBF3B2F2BFBF3BF22B2F2BFB2F3BF5BF4BFB2F10B2F2BF4BF3B2F4B3F7BF3B3F 8BF8BFBF9BF4BF2B2F4B2FB2FB2F6BFB2F9BFBF2BF4BF3BF4BF8B2F5B2F2B2F3BF3B 2F3BFB2F7BF5BF11B4F2B2F9BF4BFBFB2FBF2B3FB2F3B3F2B2F4BF9B2F4BD18B$BABA BABABABABABABADABAFAFEFABAFEBABEFABAFABEBABABABABEBAFABEBABEFABABABAF EBABEBABEFABAFABABEBAFABABAFABABEBAFAFEBABAFEBABAFABABAFEBABABABAFABA BABAFEBABABAFABABEFEBAFAFABAFEBABAFABABEFAFAFABABEBAFABEFEBABABABABAB AFEBABEBABABAFABAFABEBAFABAFABABEBEBABAFABEBABABABABABABEBEBABAFEBEFA BABEBAFABEBABEBABABABEBAFABABEBABABEBAFABABAFABABABAFAFEFAFABABABAFAB AFCBABABABABABABABABA$18BDBF2BF3BFBF4B2F2BF11BF2B4F13B2F7BFB2F5BF4BF 6BF3BF3B2F3BF2BF2BF4BF6BF5BFBF4BF3BFBF7BF5BF7BF6BFBF3B3F2BF4BF2BF2B2F 4BFB4F4BF7BF3B3F5BFBF2BF2B2F5BF3BFB2F6BFB3FBF4BF6B2F4BF3B2F2B2F8BF3BF 5BF3B2F2BFBFBF8BF9B2FD18B$BABABABABABABABABADABEBABABABABEBEBEBEBABAB ABABABABABEBABEFEFABEBAFABAFEBEBAFABEFABABABABEBABEFEFAFEFEFAFABEBABA BABEBABABABABABABAFABAFABABEFABEBEFAFABABAFEFAFABABABAFABABABAFAFEBAB AFEBABEBABEBEBEBABABABABAFAFAFABEBABEBABEBABEBABEBABABEFABEBABAFABABA BABAFAFEFABEBABEBABAFABABABEBAFEBABABABEBABAFABAFEBEFEBEBEBAFABABEFAB ABABEBABABABABAFABABAFABEBABABEBCBABABABABABABABABA$18BDF4BF4BF2B2F2B FBF2BFB2F2BF2B2FBF7BFBFBFBF3BFBF4BF10B2F2BF8BF2BF5BF4BF2BF7B3F9BF3BFB FBFBFB4F5BF4B3F6B2F3B2FBF7BF7BF2BF2BFBF3BF4BFB2F2BF4BF3BF2BF2BF6BF5BF 3BF3BF2B2FBFB3F2BFBF2B2F3BF3BF2B2FBFB2F2BF7B2FB2F2BFBF3B2FBF9BF11BF4B F2BFD18B$BABABABABABABABABADEBEBEBEFABABAFABABABABABABABEBABAFABABABE BABABABAFAFAFEFAFAFEBABEBABABEBAFABEBEBABABEBABABABABABABABABAFEBEFEF ABEBEFABAFEBABAFABEBABAFEBEFEBABABAFABAFAFABABEFABABAFABAFABAFABABABA BABEFAFABAFABABEBABEFEBABABABABEFABEBABABAFABEFAFABABEBAFABABAFABAFAF EBABEBABAFABAFABABABEBEBEBAFABABAFABABABAFAFAFABEBAFABEBEBEBABEFEBEFA BEBEFABAFEBAFABCBABABABABABABABABA$18BD3F16BF8B2F6B4FBFBF7BFB2F2BF5BF 3BFBFBF2BF3BF2BFBF4BFBF2BF4BF4B3F3BFBF2BF6BF5BFBF3BF2BF9B3FBFBF3B2F2B F3BF2BFBFBFBF19BFB2FBF3B2FBF4BF5B2F3B3F6BF10BF11BFB2FBFB3F3B2F7BFBF5B F2B2FBF4BF3BFBF2B2FB2F3B3F9B3FBF2B2FD18B$BABABABABABABABABADEBABAFABA BABAFABAFABABEFABABABABAFABABAFABABABABABABABEBEBABAFAFABAFABEFABABEB EBAFABEBABEBABABABABAFABAFABAFABABABABABABABEBAFEBABABEBAFABABABEBAFA FABEBEBAFAFEBABABABABABABAFEBABABABAFEBABABABEFAFABABAFABAFAFABABABAF EBABABEFABABAFEBABABABAFABEFABEFABEBABAFAFEFEFAFAFAFAFAFABABAFABABAFA BAFEFABABABABABAFABABABAFEBABAFEBABABAFEBABEFABCBABABABABABABABABA$ 18BDBF8B3F7B2F2BF3BFBF2B3F5BF4BF6BF10BF3BF4BFBFBF4BF9BF2BFB2F3BF4BFBF 2BF2BFBFBF4BFBF4BF3BF2BF2BF4B2F3BF3BF17BF8BFBF6BFB3F3B2F6BFB2F10BF5BF 14B2F3B2F2BFB2F2B2FBF9BF10BFBF5BF4B3F7B2F10BF11BFBFBD18B$BABABABABABA BABABADABEBABAFEBABABABABABABAFAFEBAFEBABABABEBEBABAFAFABABEFABEBABAF ABABABABEBABABAFABABAFEFABABEBEBABEBAFEBABABEBAFABABABABABEBABEBABABE BABEBABABABEBABEBABABEBEBEFABABEBABABEFEFABABAFABEBABEBABABAFEBABEFEB ABEBAFEBABAFAFAFABEBEBEBAFABABABABABEBEFEFABEBEBAFABABEBABEBEBEBABABA BABABEBABEBABABABAFABABEBABEBABABABEBEBAFABAFABEBABAFABABEBAFAFCBABAB ABABABABABABA$18BD3BF10BFBF5B3FBF3BF6B2FBF7BF3BFB2F4BF3BF7BF8BF3BF7BF 3BF6BFB3F4BFBF2B2F2B2F3BF5B2F3BF2B2F5B3F4BF5BFBF2BF3BF2B2F2BF4BF3BF6B F12BF2BF4BF5B2F4BFBF3B2F3BF6BFBFBF2B2F10BF13BF3BF3BF2B4F3B2FBFBF16BF 3BF6BF3BD18B$BABABABABABABABABADEBABAFEFEBAFABEFEBABABABEBABEBEFABABA BAFABAFABAFAFABABEBABABAFABAFEFEBEBAFEBABABABABAFAFEBABABABAFAFAFABAB AFABAFABAFABABABEFAFEBEBABABABAFAFEBEBABEBEBEFEBAFEFEFABABEBABABEFAFE BAFEFABABABAFABAFAFAFABABABABEBEBEBABABEBAFABAFABABABABABAFEBEBABAFAB AFABABABABABABAFABABABABEFABABABEBABABABABABABEBEBABEBABABAFEFEBEBEBE BEBABABABABEFABABEFCBABABABABABABABABA$18BDF17B2F11BF3BF7BF11B2FBF2BF 6BF6BF7BF3BF2B3F2B2F6BF2BFBF5BF6BF2B2FB2F9BFBF4BF2B3F3BFB2F4BF2BFBF4B F3BF4B3F2B2FBF2B2F4BF8BF3BF2BF2BF2B2F4B2F4BF3B2F3BFB2F4BF5BF3BF16BF5B F2BF6BF2B3F6BFB5F2B2FBF4BF2BF2BF4BD18B$BABABABABABABABABADEBEBABABABA FEBAFABABEFEBABABABAFEBAFEBEFAFEFEBABAFABEBEBABAFAFABABEBEBABABABABAB EBABABEBEFEBAFEBAFAFABABAFEBABABEBABABABEBEBABEBABEBABABAFABAFEBABABA BAFAFEBEBEBEBABEBABAFABABABAFAFEFEBEBEBAFEFEFEFABABABABEBABABEFABABEB ABABAFABEBABABAFEBABAFABABAFAFEBABABABABAFABEBAFABABEBEBEBABEBEBABABA FABAFAFABABABABEBEBAFEBABABEBEBABAFEBAFABEBEBCBABABABABABABABABA$18BD 6BF5B2F3BF5BFBFBF5B2F9B2FBF10B3F3BF8BF3BFBF5BF3BFBF2B2F3BF4BF25BF3BFB 2F4BF2BF3BF8BF11B2F6BF2BF3BF2BF6BFBF5BF2BF14BFBFBF5BF2BF2B5FBF5BF6B2F 2BF2B3F7B2F2BF2B2F14B3F5BF5BFB3FBF2BFBF3B3F4BD18B$BABABABABABABABABAD AFABEBABEBAFABABABABAFABEBAFAFABABABABABABABAFABABEBABEBABAFEBABABEBA BEBABABABABABAFABEBEBABABAFEBABABABEBAFEBEBAFABABABABEBEBABABAFABEBAB ABABAFABABABABAFAFAFABEFEFABEFEFABABABABABABEBABEBAFEBABABABABABABEBE BAFABABAFABEFABABABABEBAFABEBAFAFABABABABABABABABEBEBEFAFABABABEBABAF EBEFEBABABABABABABABABAFABABABABAFABABAFEBAFABEBEBABEBAFCBABABABABABA BABABA$18BD4BFBF3BF2B2FBF4B2F3B4FB4F7BF4BF2BFB2FBF5BF7BF2BF5BF3BFB2F 6B2F2BF5B2F6B2F7BF3BF6BF3BF3BF4B2FB2F3BFB2F4BF2BF9BF8BF2BF2BF4BFB5F7B F13BF2BF2BFB2F3BF5BF2BF4BF6BF12BF8BF4BF5BF6BF2BFBF3B2FBF3B2F7BF3B4F2B F2BD18B$BABABABABABABABABADEBEBAFABEBABEBABABAFABEBABEBEBABEBABEFEBAB AFAFABAFABEBABABEBABABEBABABEBEFABABEBABEFABEFEBABABABABABEBABABABEFA BABABABAFEFEFEBEBABEBABEBEBEBABABEFAFEFABAFAFABEBABEBABABAFABAFABEBEB EFAFABEBEBAFABABAFABABAFAFAFABABABAFABABABABABABABEBAFABABAFAFEBABABA BABABEFABAFABABEBABABABEBABAFABABABABABABABEBABEFABABEBABEBABABABEBEB ABEFABABABEBAFCBABABABABABABABABA$18BD3BFBF6B2F5BF3BFB2F2BF3BF10BF2B 2F4BF3BF11BF11B2F2BF12BF3BF11BF10BFBFBF8B2F2B2F12B2FBF3BFBF3BF2BF2BF 13BF4BF3BF3BF7BF6B3F3B3F4BFBFBF8BF6BF8B2F5BF3BF4BFBF10BFB2F2BF6B2F8B 2F3B2FBF4BF4BF2BD18B$BABABABABABABABABADABABAFEBABAFEBABEBABAFABEBAFA BEFABABAFABAFABABABABABEFABABAFABABABABABAFAFAFEBABABABAFABAFEBABEBAF EFABAFABABEBABEBABABABABAFAFEFABABABABABABABABABAFABABABABABABABAFAFA BABABEBABEBABAFEBEBABABABAFAFEBABEBABEFABABABABABABABEBEBAFEBABAFABAB ABABAFAFAFEBEFAFABEFABABEBEBEBAFEBABABEFAFABABABABABEBABEBAFABABABAFA BAFEBEBABABABAFABABEBEBEFAFCBABABABABABABABABA$18BD3B3F2BF2BFBF2B2FBF 3B3F9BF3BF6BF8B2F7BF8BF8BF4BF4B2FB2FBF4BF7BF2BF3BFBF5B2F6BF2BF22BF4BF 2BF2BFB5FBF10BFBF6B2F2BF4B2F4B2FBF2BFBF3BF2BFB3F5BF7BFBFBF3B2FB2FB2FB FB2F4B2FBFBF4B2F2B2F9BF3BFBF8BFB2F6BF4B2F3BD18B$BABABABABABABABABADAB AFABABEBABEFABABABABAFABEBAFAFEBEBEBABEFEFAFABEBABABABAFABEBABEBEBAFA FABABEFEBEBABEBABABABABABEBABAFABABABABABEBABABAFAFAFABEFEBEBEBABABAB ABABABABABAFEBABABAFABAFABEBABABABABABEFAFAFEBEBABABABABABEBABEBAFABA BABABABABEFABABEBEBEFAFAFAFEFAFAFEFEFABABEFABABAFABAFEBABABEBABABAFAF ABABABABEBEBEBABEBABEBABABABABEBEBABABABEBAFAFABAFABEBCBABABABABABABA BABA$18BD5B2F5B2F2BF4BFBFBF5BFBF2BF3B2F2B3FBF3BF5B2F3BF2B2F9BFB2FBF2B F2B2FBFBF12BF7B2F6BF2BFBF2BF3BF4BF17BF3B2F16BF7BF2B4F2BF20B2F4B3FBF2B FBF6B2F3BFBFB4F5BFBF8BF4BF5BFBF3BF3BFBF9B2F2BF3BF4B2F3BF5BFBF2B2FD18B $BABABABABABABABABADEFEBAFAFEBAFAFABEBABEBABAFABAFEBABEBABABABEFABEFA FEFABABAFEBEBABEBAFEBABABABABEFEFAFABAFAFABABEBABABEBABABAFEBEBEBABAB EBEBABABEFEFEFABAFABABAFABABEBAFABABABABABAFABABABEBABAFABEBABABABABA FEBABEBABABABEFAFABABAFABAFAFEBEBABABAFABABABABABABABABABABEBEFEFABAF EFAFEBAFEBEBABEBABABAFABAFABEBAFAFABABAFABEBEBAFABEBABABAFAFABAFEBABE BAFEBEFCBABABABABABABABABA$18BD5BF2BFB2FBF8BF2BF3BFB2F2BF2BF7BF3BFB3F 3BF6BF4BFBF4BF3B2F3BF3B2F5BFBFB3FBFBF4BF5B2F8BF2B2F6B3FBF3BFBF7BF9B2F 4B3F3BFBF18BF8B4F9B2F2BFBF7BF8BF3BFB2F2BF5B3F2BFB2FBFBF4B2F6BF7BF3BF 5BF5B2F8B3FBFBFBF3BD18B$BABABABABABABABABADABEFABABEFAFEFABABABEBABAB AFABABEBABAFABABABABABABAFEBEBABEBABABABABABAFABAFEBABABABAFEBABABEBA BABABAFABEBABEBEBEBEFABABABAFAFEBABEFABABEBABEFEFABAFAFABABABABABABAB ABABABABEFABAFABABABABABABEFEBABEBABABABABEBABABAFEBABAFABABAFABAFEBA BABEFABABABABABEBABABEBABEBEFABABABEBEBABABABAFABAFEFEBABABEFAFAFEFEB ABABAFEBEBABABABABABAFABABABABCBABABABABABABABABA$18BD3B2F2BF2B3F18BF 6BF5BF6B2F4B2F5BFB2F2BFBF4BFB3F4B2F2BF6BFBF3BFBF9BF3BFBF2BF9BF2BFBF9B F5B2F10BF8BF5BF8B2F10B4F4BF2BF6B3F8BF3BF8BF2BF4BF5BF7BF3BFB2FBF4BF3B 2F7BF5B2F6B3FB2F7B2FBFB2F3BFD18B$BABABABABABABABABADABABEFABAFABEFAFE FABEBAFABEFABAFABEBABABABABABABABABEBABABABABAFABABABEBEFEBABABABAFAB ABABAFABEBAFEBABEFAFAFEBABABEBABABABAFEFABABEBEBEBAFABAFEFABABEBABAFA BAFABABABEBAFABEBEBABAFABABEBEFEBAFEBABEBAFABEBABABABABABABABAFABABAB EBABEBEBEFABEBABAFAFABABABABABEBABEFAFAFAFABABABAFABABEBABEBABAFAFEBE BABABABABEBABABABABEBEBABABAFABABAFABABCBABABABABABABABABA$18BDB3F5B 2FBFBF3BFBF8BFBF19BF3BFB3F4BF3BF2BF12B4F11BF2BF2BF8BF2BFBFBFBF5BF2BFB F3BF2BF12BF2BF5BF2BF5BF2B2FB4F3BF9BF6B4FBF2BF3B2F4BF3BF3BF3B2F2B3F3BF 6B3F3BF4BF4BF3BF2BF13B2FB3FBF2BF3B2F3BFBFBF8BFBF9BFBD18B$BABABABABABA BABABADABEBAFEFAFABABEBABABEBABABABAFABEBABABEBAFABABEBEBABABABAFABAB ABAFABABAFAFABEBABABABEFAFEBAFAFEBABABABABABAFAFABABABABAFABAFAFAFABE BAFEBAFABABABABABABEBABABABABABAFABABABAFABABEBEBAFABABAFABEBEBEBEBAB EFEBEBAFAFAFEBABABEBABEBEBEBAFEFEBEBEBAFEBABABEBEBEFAFABABABABABAFABA FABEBABEBABEBABAFABAFEBABAFEBEFEFEBEBABABABEFEBAFEBABABABEFABEBCBABAB ABABABABABABA$18BDF5B3F3BF6BF9BFBF4BFBF2BFB2F8BF3BFBF10BFBFB4F2BF3BF 2BF3BF5B2FBF3BF7BF4B2F16BF4B2FB2F5B2FBF2BF18B2F4BF11BF2B2F7B4F3B4FBF 3BFBF7B3FB2F3BFBF8BF4BF8B2F2B3F9BFBFBF4BF21BF4BF2B2FBF2B3FB2FD18B$BAB ABABABABABABABADEBABABEBABAFEBAFEBABAFABABAFAFABABAFAFAFABABEBABABABE BAFEBABABABEBEBAFEBEBABABEBABEFABEBEFABEBABEBABABABEBAFABABABEFEBABAB EBABABEBABAFABAFABAFEBEBAFABEBAFABABABABAFABABEFEBAFAFAFABABAFEBABEBA FABABABABABABABEFEBAFAFAFABABABAFEBEBABEBAFAFABABEBEBABABABEBAFEBEBEF ABABABABEBABAFEBEBABABEBABABABAFAFEFAFABABABABAFABEBAFABABABABABEFABA BAFCBABABABABABABABABA$18BD12BF2BF5BF3BFB3F3BFBF5BF4BFBF2B3F5BF5BF2B 3F2B2FBF2BF6B3F8BFBFBF3BF2BF4BFBFBF2B2FBFB2F5B3F2B2F3BFBFBF3BF7BF3B2F 4BF4BFB2F5BF2BF2BF4BFBF7B3F4BF2BF6BF4B4FBF3B2F14BF2BF7BF3BF3BF2B2F9BF 18B2F15B2FB2FB3F2BFBD18B$BABABABABABABABABADEBEBABABEBABABEFAFEBEFAFA BABABAFAFAFABABABAFEBABEFABABEBAFABABABABAFABABABABEBABABEBABEBABEBEB EBAFABABEBAFAFABEBABABABAFABABABEFABAFABAFAFABABEBABAFEBABABABEBAFABA BEBABEBAFAFAFABAFEBEBEBABABABABABABABABEFABABAFABEBABABABEBABAFABAFAB ABABEBABABABEFEBABABEBABABEFABABABAFABABABEFEBAFABEBABEFAFABABABABAFA BEBABABEBEBABAFABAFABEBAFABAFABCBABABABABABABABABA$18BD5BF2BF3BF8BF3B F18B4F2BFBF6BFBFBF6B3FBFBF4BFB3FB2FBFBF3BF2BFBF2BF2B2F6BF3B4F3BF2BF6B F4BFBF2BF2BFBF9BF4BFBFBF4BF2BF3BF4BF2BF4BFBF10B2F10B3F6BF2BF4BF6B2F3B 2F3BF9BFB3F12BF2BFB2FBF2BFBF2BFB2FBF4BF2BF4BF2B2F2B2F5B2FBD18B$BABABA BABABABABABADABEBAFEFAFABAFABABABABABABABABEBABAFEFAFABEBAFEFAFABABAB EFABABABABAFEBABABABEBABABABEBABABABABABABABABABABABABEBABABABEBABABA BEFABAFEFAFEBAFABABAFEBAFABABEFABABABEFAFABABABABAFABEBABABABABEBAFAB EBEBABEBABAFAFAFEFABABABEBABABAFAFEFABABABABABABEBABABAFABEBAFABABAFA FEBAFEFEBABABAFAFAFABABABABAFABEBAFAFABEFABABABABABEBEFAFABAFABAFAFAB CBABABABABABABABABA$18BDFBFBFB2F11B3F14BF5B3F2BFBF9BF4B3F6BF2BF3BFBF 2BF4BF4BF4B5FBF3BF2BF2BF3BF6B2F2B2F10B2FBF9BF6BFB3FBF3BF15B2F3BF8BF2B 2FBF3BF2BF12BF4BF2BF5B2F3BFB4F3BF2B2FBFBF5BF9BF3B4F20B3F3BF7BF8BD18B$ BABABABABABABABABADABEBEFEBABEBABABAFABABABABABAFAFABEFABABABABABAFAB EBABAFABABAFABABEBEFABAFABABEBEFABABABEFABABABABEBAFABAFABEBEBAFEFABE FABABABABABABAFAFABABABAFABAFABEBABABABABAFABEBAFAFABABEBABABABABABAB ABEFABABAFABABABABEBABABABABAFAFABABEFEBABABEBEBEFABABABEBABEBABABABE BABABABAFABEBABAFAFABABABABEBEFAFABAFABABABABABABEFABAFABABABABAFAFAB ABABEFCBABABABABABABABABA$18BDF6BF2BF2BF2BF2BF4BF6BFBFBF3BF5BF2BF8BF 4BF3BF9BF8B2FBF3BF3BF16BF5BF7BFBF4B2FBF11BF8B2F4B3F12BFB3F3B2F3B2FBF 5BFB2F4BFBFBFBFB3F6B2F5BF3BF2BFBF10BF2B3F4BF3B3FBF2BFBFBF7BF6BF3B2F2B FBFBF2BFBFBF2BF3BF2BF2B2FBF2BFD18B$BABABABABABABABABADABABEBAFEBABABA BEBAFEBABAFABABEBABABABAFEBABABABAFEBABABAFEBABABEBABABEBABABABAFABEF ABEBEBABABABABEFABABEBABAFEBEBAFABABAFEBABABABABAFEBAFABABABAFAFABEBA BABABEBAFAFABABAFABEBABAFABEBABABAFABABEBEFAFABAFABABABEFABAFABEBEBAB ABABABABABAFEBEBABABAFABAFABABABEBEBEBEBABAFABAFAFABEBABABEBABABABEBA FAFAFABABABABABABABAFABEBABABABEBAFABAFAFCBABABABABABABABABA$18BD2BFB FBF14BF4BF2B2F6BF2BF3BFBF6BF19BFBF3BFBFBF3BF9BFB3F2BF7BF3BFBF2BFBF2BF 14B2F2BF5B2F3BF4BF2B3F4BF8BF8BF7B2F2BF3BF4BF2BF3B2F4BFBF3BF2B2FBF2B2F BFBFBFBF2B2F2BF5BF10BF6B2FBF5BF3BFB2F13BFBF9BF4BF3BF2BD18B$BABABABABA BABABABADAFABABABABEBEBABEFABABAFEBABABABEBABAFEBABABABABABABAFABABAB ABABAFEBABEFABABAFABEBABABEBABABABABABABABABABABEBAFABEBEFABEFEBEFABE BABABABEBAFAFABAFAFABEBABEBABAFEBABEBEBAFAFAFEBEFABAFAFABAFEBABEBABAB ABABABABABEBEBABABAFABAFABABAFABABAFAFABABABABABABABEBABABEBABABAFABA FEBAFABAFEFAFEBABABEBAFABABEBABAFABAFAFAFAFEBABABABAFABABAFABABABCBAB ABABABABABABABA$18BDF7B2FBFB3F2BF6BF9BF3BFBFBF2BFBF3BF5B2F4BF2B2F8BF 6BF8BF2B2FBF7BF12BFBF3B2F13BF2BF7B2FBF4BF6B2F2B2F3B4F6B2F3B2FB3F5BFB 2F28BF19BF8BF2B2F3BF10BF4BF2B2F4BF2BF2B2FBFBF4BF13BF3B2FD18B$BABABABA BABABABABADABEBABABABEFEBABEBABABABEBAFAFAFAFABAFEFEBEBABAFABEBABABAB ABABABABEFABAFABABABEBEBABEBABABEBAFABEBEBABEBAFABABEBAFABABEBABABEBA BEFAFABABEBEBABABABABEBEFABABAFABABABEBABABABAFAFABAFAFABAFEBABEBEBEB AFEBABABEBABABAFAFAFABABEBABEBEBABABABABEBABEFEFAFABABABABEBABEBAFEBA BEBEBAFABABEBAFABAFABABABABABAFAFEFEBABEBABEBABAFAFABABEBABABABABABCB ABABABABABABABABA$18BDB2FBF10BFBF11B3FBF18BF7BF2BFBF4BF2B4F8B3F2BFBFB F8BFBF3BFBF22BF5BFBF3BF3BF5BF11BF5BF2BF6BF10BF29B2F6BFBF8BF3BF2BF9BF 6BFB2F2BF6BFBF5B2F12B2F7BF4BF5BF2BF5BD18B$BABABABABABABABABADABAFAFEF EBABAFAFABABEBEFABABABEBAFABABABABABABAFABEFABABABABEBEBABABEFAFABAFA BABABEFAFEBABABEFAFAFABAFAFABABEBEBABABABEBEBAFABAFABEFABABABABEFABAF AFEFABABEBEBEFABABABAFABABAFABAFABABABABABABABABAFABEFABABABABAFAFEFE FABEBEBEFEBABAFABABABABABABABABAFAFAFEBABAFAFABABABABEBAFABABABABAFAB EBEFEBEBABAFABAFABABEBEBABABABEBABABABAFEBEFEFEBCBABABABABABABABABA$ 18BDB3F5B4FBF8BFBF6BF7BF2B2F3BFB2F2BF4BF5BF2BF4B2F2BF2B3F3BF3BF3BF7BF BF2BF2BF2B2F8BF11BF4B2F2BFBF3BF2BFBF3BFBF7BF4BF4BF5BF11B2F14BF11BF2BF 2BF2BFBF4BFBFB2F3BF2BFB2F4BF8BF5B2F2B2F3BF4BF2B2F2B3F8BF3BFBF2BF3BF3B F5BFD18B$BABABABABABABABABADABAFEBABAFABAFAFABABAFABEBAFEBAFABABABABA BEFABABAFABABAFABABEBEBEBABEFEFEFAFEBABABABEFAFEBEBEBEBABEBABABEBABEB AFABABEBEFABEBABABABABABABAFABEBAFABABABEFABABABEBABABABEBAFABABABAFA BABEBEBEBABAFAFAFABAFABEBEBAFEBAFAFEBABEBEFABABABEFAFABABEBEBABEBABAB ABEBEFAFABABEFABABABEBABEBAFABABABEFAFEFABEFABEBAFABABEBABABABEBEFABA BABABAFABABABEBCBABABABABABABABABA$18BDFB2FB2FBFBF2B3F2B2F2B2F5BF16BF 3B2F4BF4BF4BF5BF7BF4BFB2F4BF7BF9BF4B2F2BF9BF2BF5BF3BF3B2F3B6F3BF7B2F 2BFBFBF4BFB3FB3FB3F10B2F9BFBF10B2F2BF3BFBF3B2FB2F7BF3BF2BF6BF5BFBF3BF BF4BF4BF4BF2B2F17BF5BFBF3BD18B$BABABABABABABABABADABABAFAFABABABAFABA BABABAFABABAFABAFEBEBABEBABABAFEBABABAFABABEBAFABAFABABABABABABEBEFAB ABABABABABAFABAFABABABEBEBEBEBABABAFABABAFABABAFABABABAFEFEBEBAFABABA BABEBAFABABEBAFABAFEBEBAFABAFABABAFABABABABABAFABABABABEBABEBABEBABAF EFAFEFABEBABABEBAFEBEFABABAFEBAFEBABEBEBABEBABEBABAFABEFEFEBABABABEBA BEBABEBEBABABEBABABABABABABABABABABABCBABABABABABABABABA$18BDF6BF6BF 12B2F2BFBF2B2F6BF4B2FBF2B2F3BF2BF2BFB2F4BF4BF2BF6BF5B3F8BF6BF4B3FBF5B 2F4B3F12BF5BF2BF4BF2BF5BF19BF4B2F5B3F8BF7BF9BF2B2F2BFBFBFB2F2BF3B2F2B 2FB3FBF5BF4B2F5B2F11BF2BF5B2F2B3F5BFBF5BF2BF3BD18B$BABABABABABABABABA DABABABEFAFEBABEFEBEBABEFAFEFEBEFABABAFABABABEFABABABABABABEBABAFABAB ABEBAFABEBEBABABABEBABEFABAFABEBABAFABABAFABAFABABEFAFABAFEBEFEBAFAFA BABEBABABABEBABABABABABABAFAFABEBABEBABABEBABABABABAFABEBAFABAFAFAFEB EBABABABABEBABEBABAFABABABEBABABABABAFABABABAFAFABABEFEBABABABABEBEFE BAFABAFAFAFABABEBAFAFABABEBABABABABABABABABABEBEBAFABEBABCBABABABABAB ABABABA$18BD5BF4B3FBF2BF7B2F2BF5BF3BFBFBF2B2F3B2F7BF4BF3BF3BF2B3F5BF 2BFBF5BFBF2BF3BFB2F5BF2BFB3F4B2F2BF11BFBF3BF3B2F5B3FB2F2B2F5B3FBF12BF 14BFBFBF3B2FBF2BF6B2FBFBF3BF3BFB6F5B2FBFB2FB2F5B3F11BF8BF10BF2BFB3F5B F4BFBF5BF3BFD18B$BABABABABABABABABADEBEBABEBABEBEBABABABABEBAFABAFABE BABAFABABEBABABABEBABEBABABEBABAFEBAFAFEFAFABAFABEBEBAFABABABEBABABAB ABABABABABAFABAFAFAFEFEBABEBEBABABEBABABABEBABABABABEFABABABABAFAFABE BEBEBEFEFAFABABABABAFABAFEBABEBAFEFABABABEBEBEBABAFEFABAFABAFEBABEBEB EFAFABABAFEFEBABABAFABEBEBAFEBABAFAFABABABABABABABEBABABAFABEFEBAFEBA BABABABAFABABAFABABABAFCBABABABABABABABABA$18BD3B2FBF2BFBF2BF5BF8BF4B 2F2BF6BF6BFBFBFBFB3FB5F2B2FB2F4BF6BF3BF4B2F6B2FBF2BF2B2F7B3F10B2F9BF 6BF2B2F4B4FBF2BF6BFBFBF7BF7BF2B3F3B3F3BF2B2F7B2F2B3F3B2F7BF7BF4BF7BF 3B2F5BF2BFB2F10BF3BF2BFBF2B2F12BFBFBFBFBF3BFBD18B$BABABABABABABABABAD EBABAFAFABEBABAFABEFABAFABABEBEFAFAFEBEBEFABAFEBABABAFAFAFABEFABEBEFA FABEBABAFABABABEBABABABEBABABABABABABABEBABAFEBABEBABAFABEBABABAFABAB ABABAFAFEBABEBABABAFEBEBEBEBABABABAFABABEBEBABABABEBAFABABEBABEBABABE BEBABAFABABABEBEFAFABABABABEFABABEBABABAFABABAFEBAFABABAFEFEBEFEBEBEF ABABABEBABEBABAFEBEBABEFAFABAFEBEBABABABABABEFABABEFABABCBABABABABABA BABABA$18BDF2BF4B2F2BFB2F3BF4BF6B4F4B2F11BF2B2F2BFBF8BFBF6BFBF4BFBF6B F2BF7BF2BF6BFBFBF2BF3BF9B3F9BFB3F2BF4BF4BFB4FBF3BF5B3F2BF3BF4BF3BF2BF 2BF2BF2BFBF20BF8BF7B2F2BF4B2FB2F5BF4BF12BF3BF5B2FB2FB2FB2FBF3BF15BD 18B$BABABABABABABABABADABEFABAFABAFAFAFABABABABABEFABABABAFABABEBAFAB ABEBEFAFABAFABEFEBABABAFABABEFABAFABEBABABEFAFABABEBEBABEBABABABABEFA FAFABABABABEFEBEBABEBABAFABEBAFABABABABABEFAFABABABABAFEBEBEBABEBAFEB ABEBEFABEBABABEBABEBABABABABEFABABABEFABABABAFEBABABAFEBEBABABAFABABA BABEBABABEFAFEBABABABEBABABAFABEBEBABAFABABABABABEBABABABABABABEBABEB ABABEBABABCBABABABABABABABABA$18BD6B2F4BF3B2FBF6BF2BFBFBF3BFBFBFBF2BF 4BFB2FBF2BFBF4B2F2BF2B2F3BF7B3F3BF9B2FB2FB2F2BF14B4F5BF4BF2BF2BF3BF9B F2B4F5BFB2FBF4BF2BFB2FBF5B2FB2F10BF2BF10B2F4B2F4B3F4BF18B2F6BFBF2BF9B F4BFBF3BF9BF3BF5BFB2F2BF4BF2BD18B$BABABABABABABABABADABEBEFAFAFABABAB EBEBABEBABABEBEBAFABABEBABEBEBABEBABABAFABABAFAFEFABABABABEBEBABABEBE FEFEFEBABEBABABEBEFAFABAFABAFABABEBABABABAFEFAFABEBABEBABAFABABAFABAB EFABABEBAFEBABABEBEBAFABABAFABEFEBABABAFABEFABABABEBABABAFEBABEBEBABA BAFABEBAFABEBABAFABAFEBABAFEBEFEBABEBABABABABABEFABEFABEBEFAFEFABEFEB ABABAFEBABEBABABEBEBABEBAFEBABABABEBEBEBCBABABABABABABABABA$18BD3B2F 3BF11BFBF4BFBF7BF6BFBF5B2F6BF4BF2BFBF10BF3BF2BF15B3F4BFBF2BFB3FBFBF3B FB2F3BF3BF2B2F4BF2BF2BF13B2F6BF8BFBF2B3F2B2F3BF6B2F8BF8BF5BFBF2BF2BF 4BF3B2F11B3F7BF4BF2BF7BF9BF5BFB2F2BF4B2FBF2B2F2B3F2B2FD18B$BABABABABA BABABABADEBABAFABAFABABAFAFABABABABABABABABAFEBAFABEBABABABABAFEBEBAF AFABAFABAFABABEBABAFABEBAFABEBABABAFABABAFABEFABAFABAFEBAFEBEBABEBABA BEBABABAFABABAFAFABEBABEFABABEBABABAFEBABEFABABABEBABEBEBEBEBABEBAFAB ABABABEFABABABABABAFEBABAFABABABABABAFAFABABAFEBAFAFEBABAFEBABEBEBABA BABEFABABABABABAFEBABAFABAFABABABABABABABABABEBAFABEBEFABABABAFABCBAB ABABABABABABABA$18BD4BFBF5BF2BFBFB2F5B2F6BF4BF2B2F8B4F2B4FBF2B2F4B2F 3BF6BF7BF4BF4BF5BFBF2BF9BFBF3BF2BF4BF2BF2BF3B3F4BF6BF2BF5B2F4BF6BFB3F BFBFBF11B2F4BF3BF5B3F3B2F4B2F3BF4B2F2BF8B3F2BF6BFBF6BF2BF7BF3BFBF4BF 3BFBF9BF6B2FB2F3BFBD18B$BABABABABABABABABADAFEFABAFAFABEFAFABEBEBEBAB ABABAFABEFABABEBABAFEBABABEBABEBEBEBEBABABAFABEBABABABABEBABABEBABEBE FABABABEBABAFABABEBEBEBABABEFABABABABAFABEBABEBABABABEBEBEBABEFABAFAB AFABAFAFABEFABAFEFABABABABABABABAFABABABABABABABEFEBABEFEBABABABABABE FEBABABAFABABABABABABEBABEBAFEBABEBABEBEBAFEFABAFEBAFABABEBABEFEBAFAB AFAFABEBAFEBABABABEBABABAFABABCBABABABABABABABABA$18BDF4BF8BFBF19BFBF 2B2F5BFB2FB2F3BF3BF3BF9BF5BF2BF5BF6BF6B2F3BF4B2F7BF5BF2BFBFBF2B2F11BF 2BFBFBFB2F6BF2B2F2BF2BFB2F3B2F8BF7BF3BF3BFBF5BFBF3BFB3F5BFBF7BF3BF7BF 2BF16BF3BF5B2F4B2F2B2F5BF5BF9BF3BF4BFD18B$BABABABABABABABABADAFABEBAB ABEBABABEBEBABEBABEBABAFABAFABAFABEFABABABEBABABEBAFABABABABABAFABEFA BABABABABEBAFABABABABEBABABAFABEBABABEBABEBEBABABEBEFEFABEBEBABEBEFAB ABAFABEBABEFAFABABAFABABEBAFABAFEBEBEFABEBABABAFABEBEBAFAFABABEBABABA BAFABAFEBABABABAFEBEFABAFABABEBABABABABABEBEFAFEBABABABAFAFABEFEBABAB AFAFABABABABEBEBABABAFEBAFEBEBEBAFABABEBAFABABABCBABABABABABABABABA$ 18BDB3FBF10BFBF2B2F3BF7BFBF5BF2B3F3BF13BF3B4F2BF3BFBFB2F2BF9BF16BF2B 2F4BF3BFBFBF8BF4BF9BF3BF4BF3B2FBFB2FBF2BF3BF5BFBF2BF3BFBF3BF2B5FBFB2F 3B2F3BF2B2F6BF2BF2BF7BF3BF2BF5BF7BFB3F4BF2BF10B2FBF2B3FBFB2F12BF6BF4B D18B$BABABABABABABABABADABABABABEFABAFABAFEBABABAFEBAFEFABABEBABABABE BAFABABABABABEBABABABEBEBABABABABEBEBABABAFABABEFABABEBABABABEBABABAB EBABABABABEBABABABEBEBABEFABABABABAFAFAFEBABABAFABEBABAFEBABABABABEBE BABABABEBABABAFEBEBABABABEFAFABABEBABEFABABABAFABABABABABABABABEBABAF ABEBAFEBEFAFEBEBEBABAFAFEFAFAFEBABABAFAFEBABEBEFAFAFEFABEBABABEBEBEBA BABABAFAFEBCBABABABABABABABABA$18BDF3BF4BFB2F6BF7BF6BFBF2BFBFBF7BFB2F 3BFBFBFBF2B2FB2F3B2F4B2F4BF8B2F5BF7BFBF4BFBFBF2BF2BF3BF2BF2BF2BF2BFBF BFB2F4BFBF3BFBF3B2FBF2BF6BF6BF3B2F3B5F2BFBFB2FBFBF3B3F2BF5B2F3BFBF7B 2FBFBFBF5BF3BFBF7BF6BF3B2FBF2BFB3F4B2F5B2F3B2F2BF2BF7BF8BD18B$BABABAB ABABABABABADEBABEBABAFAFABABABABAFEBABABEFAFABABEBAFEBAFABEBABABABAFA BEFEBAFABABABEFABABEFABEBAFAFAFABEBAFAFEBABEBAFABAFAFABEFEBABEBEBABAF ABEBABABABEBABAFABAFABAFAFABABABAFABABABAFABABABABEBABABABABABEFABABA BEBAFABABEBABAFEBEBABEBABABEBABAFABEFABEFABABABEBAFAFEFABABAFABABEBAB EBAFABEFABABABABAFEBEFAFEBEFABABABEFEBABABABEBAFABEBABEBEFEBABAFEBAFC BABABABABABABABABA$18BD3BFBF4BF2BF2B4FBF7BF2BF2BF2BF2BF5B2F2BFBF3BF5B FBF8BF3BF3BFBFBF15BFBF4BF5BF7B2F3BFB3F12BFBF3BF5BF6BF3BF12BFBF6BF6B2F 7BF2BF12B2F4BF3BF4BF12B2F14BF2BFB2F5BF8BF3BF4BF2B2F4BF2BF3BFBF3BF6BF 4BFBD18B$BABABABABABABABABADABABEBABEBEBABEFEBABEBAFEBABEFABEBAFABABA BABAFABABABABABABEBABABAFAFABAFABEBABABEFABABABAFAFEBEBEBAFEBEBAFAFAB ABABAFAFEBABEBABEBAFEFABEFABABABEBABABEFABABABABEBEBABABAFEBEBABEFABA FEBABABEFEFABABAFABABABAFABABABABEBABEBEBAFABAFEBEBEFEFAFABABEFAFABAB EBABABAFABAFEBAFAFABABABABEBABABABAFABABABAFAFEBABABEBABABABAFAFEBABA BABABABABABABABCBABABABABABABABABA$18BDBF2BF2B4F6BFBF4BF4B2FBF2BFBF2B 3F2B2F8BF3BF12B2F3BF4B2FB2F2BF98BF2BF4BF3B2F2BF4BF2BF2BF3BFBF2B3F7BFB F2B4FB2F13B2F13B2FBF2B2FB2F9BF7BF2B2F7BF3BF3BFBFBF5BD18B$BABABABABABA BABABADEBEBEFABABABABABAFABABEBABABEFABABABABABEBEBABEBAFABABAFABAFEB ABEBABAFAFABEBABEFAFABABAFABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABEBABAB EBABABABAFAFABABABABAFABEBABABABAFEBEFABAFABABABABAFABAFEBABEFAFAFABE FABAFABEBEBABABEBABAFEBABEFEBABEBABABABEBAFABABEBABABEBAFABEBABCBABAB ABABABABABABA$18BD2BF2BF3B2F2BF3B2F10BF23B2F4B2FBF7BF5B2F2BF7B2F97BF 4BF3B2F5BF7BF6BFBF2BFBF3BF4BF6BF3B2FBF3BFBFBF4B2FB2F4B2F2BF2BF3B2F3BF 3B3F2B2FBF6BF2B2F3B4F2B3F8BFBD18B$BABABABABABABABABADEFAFEBABAFABABEB EBAFEBEBAFABAFABEBAFEFEBEBEFABAFABABABABABABABEBEBABAFAFAFEBEBABEBEBA BABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABEBABEBEBEFABAFABABEBEBAFEBABABA FABEBABEFABAFABAFEBAFEBABABEBAFEFABAFEFEBAFABABABEBABEBABABABABABABAB ABABEBABABEBABABABABABABAFAFEFABAFABAFAFCBABABABABABABABABA$18BDBF2BF 7BF2BF5BF2BF7B2FBF5B2F3BF2BF3B2F5BF3B2F3B3F2BFBF4B3F106BF15BFB2FB2F2B FBF7BF14BF2BF5BF5BF3BF4B2F3B2FB4FBF8B3F4BF4B2F2B2FBF13BF10BFBD18B$BAB ABABABABABABABADEFABAFABAFAFABABABEBEBEBAFABAFABABABABEBAFAFABAFABABA BABAFABABAFAFABEBABEBEBABEBABAFABABEBABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFE FABAFABABABAFEBABABEBEFEBABAFABABABABAFABAFEBABABAFAFEBABABABEFEBABAB EBABABEBEBEBABABEBEBEBEBABAFEBABAFABABEFEBAFAFEFABEFABABABABABABABAFA BAFCBABABABABABABABABA$18BDB2F2B2FBF15BF2B2FBF23BF3BF2BF9BF4BF3BF2BF 2BF2BF101BF6BFB2FBF6B2F3B2F13BFBF10BF2BFBF3BF4BF5BF2B3FBF2BF5BFBF6BFB 2FB3F2B2F4B2F2BF10B2F3BF5BFBD18B$BABABABABABABABABADABABAFABEBAFABEBA BABABABEBEBABAFABEBABABABAFABABAFABEBEFABEBEBEBABABAFEBEFABAFABABABEB ABAFEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEFABEBABABAFABABEFABEBABABAFAF ABABABABABEBABEBABAFABABAFABAFAFABABEBABEBABEBEBABAFAFAFAFEFAFEBEFABA BABEBABABEFABABABABABAFAFEBAFAFABABABABCBABABABABABABABABA$18BDF3BF2B 2FBF2B3F2BF2B2F4B2FBF9B3F15B2F2BF5B2F11BF2BF102BF2BF2BF3BF5BF2BF10B2F BF16BF2B3F2BFBF2BF4B2FBFBF2B2F6BF3B2FBFBF7BFBFBFBF5B2FB3F4BFBF3BF4B2F BF2BFBF2BD18B$BABABABABABABABABADAFABAFEFABABABAFAFABEBAFEBABAFABAFAB EBEFAFEBAFABAFABEBEBABEBAFAFABABABAFABABEBABABABABABAFABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEBAFABEFABABABEBABABABABAFAFABEBAFEFABABEFAFABEBABEBABE FABEFEBEBABAFABEBEBABEFEFEBAFAFABABEFEBEBEBABABABABAFAFABAFABABABABAF ABABABEBABABABEFEFABCBABABABABABABABABA$18BD16BF2BF3BF4BF6BF10B2F2B2F BF8BF2B2F9BF117BF2B4F8BF6BF2BF5BF10BF3BFBFBF5BF4BF2B2F5B2F3B2F7BF7BFB F3BF4BF8BFBFB2F5BF2BF2BF2B2FBFBD18B$BABABABABABABABABADABAFAFEBABABEB ABAFABEBAFABABAFEFABAFABABABAFAFEBABEBABAFEBABABABABEBABABEBABABABABA BABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABEBAFABABAFABABABABABABEBAFABEFA BABABABAFABEFABABABABABABAFAFABEFABABEFABABABABABABEBEBABEBABEBAFABEB EBABABABEBEBEBABABABABAFABABEBEFABABABABEBCBABABABABABABABABA$18BDF3B F6B2F2BFB5F6B2FB2F6BFBFBF11B2FBF7B2F3B2F3B2FB5F4B3F101BF5BF6BF5BFB2FB F7BF3B2FBFBF4BFBF3BF2BF4B2F11B2F3BF5B2F10BFBFB3F4BFBF10BF7BFB2F7BFD 18B$BABABABABABABABABADABAFABAFEFABEFABEBABABABABAFAFAFEFEBABEFABEFAB ABAFAFABABABEBAFABEBEFABAFAFEFABABABEBEBABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABEBABEFABAFABABAFAFABEBABABEBABEFAFEBEBABAFAFABABABEBAFABABAFAFAFA BABEBABAFABEBABABABABABEFABABEBABEBABAFABEBEBEBABAFABEFEBABEFABEBEBAB ABABAFEBAFCBABABABABABABABABA$18BD2BF2BFB2F3BF6BFB2F2BF7BF2BF2B2FBFB 2F3BF5BF13BFBFBF11BF103BFB2F10B3F10BF5B2F4BF3BF2BF6BFBF2BFB2F3BF2BF4B F6BF3BFB3F2BFBFBF3BFBF2B2F3BF3BF11BF5BFBF3B3FB2FD18B$BABABABABABABABA BADEFABABABABABABABABEBABAFABABEBAFAFABEBAFAFEBABABABABEBABEFABAFEBAB AFABEBAFABEFEBABABEFEBAFEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBAFABAFABEFAB EBEBABABEBEBAFABABEBABAFABABABAFEBABAFAFEFABABABAFABAFABABABABEFABEBE BEFABABEBEBABABABAFEBABAFAFABEFABABABEBABABEBEFEFEBAFAFABAFCBABABABAB ABABABABA$18BD3BF31BFB2F6BF2BF2B2F4BFB3F10BF3BF10BFBF98BF2BF4BF2BF3BF 2B2FBF8BFB2F2BF3BF6BF8BFBF2B2F3BF4BF10BFBF6BF2BFBF8BF6BF5BFBF3B3FB2F 4B2F2BFBF3BD18B$BABABABABABABABABADAFEBAFEBEBABAFABABEBABABAFAFABAFAB ABEBAFAFAFEFEBAFABAFAFABAFEBABABEBABAFAFABABAFAFABABEBABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABEBAFABAFAFABABABAFABEBABABABABABEBEBAFEBAFABABABABEBA FABABABABEBABEBABABABAFABABAFEFABAFABABEFEFABABEFABABABABEBABAFABAFEB EBABABABAFABABEBEBABEFCBABABABABABABABABA$18BD3BF2BF2BF4BFBF3BFB2FBF 9BF8BF4BF3BF9BF2BF3BF3B3FBF4BF4B3F99BF10BF4B2F6BFB3F2B2FBF2BF3BF6B2F 2BF6BF15B2F3BFBFBF6BF4B6F2B3F4BF2BF3B2F2BF5BFBF10BFD18B$BABABABABABAB ABABADEBABABAFABAFEBABABABABABABABEBABAFABABABABAFAFEBABEFABEBABABEBA BABABABEBEBABAFAFABEFABAFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABEBAFAFEBEBA BEBABAFABABABAFAFABABEBABAFABAFEBEBABABAFABABAFABEBEBEBAFAFAFABABABAB ABABAFEBEFAFABEFAFABEFABAFABABABABEBABABEFAFEBABABAFABABABABABCBABABA BABABABABABA$18BDFBFBF4BFB2F3BF4BF5B2FBF4BF5BF2BF7BF6BF2BFBFBF6BFBF2B F6BFBFBF98B2F9BF3B2FBF2BFBF14BF7BF13BFBF2BF7B2F7BF3BF3BF5BF8B3F4BFB2F BF4B3F3BF2BFBF2B2FBFBF2BD18B$BABABABABABABABABADABAFAFEBEBAFEBABABABA BABABABABABABABABEFABAFABABABABABEBABAFABEBEBEFABABABABEBABAFEBEBABAB EBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABAFEBEBABABEBAFAFAFABABEBABABABABEBABABABAB ABEBAFAFEBABAFABABABAFEBAFABAFABABABABABABEBABABABABEFAFABABABEFABABA BEBABEBEFEBABABABAFAFEBABEBAFABEFABCBABABABABABABABABA$18BD2F3BF3BF6B F3BF2BFB3F3B4FB2FBF5BF4B5F2B2FB2F6BF9B4F4B2F100B2F3BFBF2BFBF4B7F11B3F 2BFBFB2F2BF4B2F7BF2B2F2B3F9BF6B2F8BF2BFBF3BF6BF9B2FBFBF10BFBFBD18B$BA BABABABABABABABADABABAFEBABABABAFABABEBEBABAFEFEFABEBABABABABEBABABAF EBABABEBABABEBABABAFAFEBABAFEBABABABAFABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAF AFABABEBABEBEBABABABAFAFAFEFAFAFABABABABABEFEBABEBABAFABABABABABEFABA BABABABAFAFABABAFAFABEBABABABABABABAFEBEBEFABAFAFABABEFABABABAFEBEBEF AFAFCBABABABABABABABABA$18BDBF12BF3BF2BF3BF10BFBF4BFBF3BFBF2B3FBF9BFB 2FBF4BF6B3FBF97BFBFBF6BF4BF2B2FBF3BF5BF8B2F2BF2BF6B2F2B2F2BFBFB2FB2F 2BF6BF2BFBFB2F8BF3BF4B3F7BF7BF5B3F2B3F5BFD18B$BABABABABABABABABADEBAB ABABABABAFABEBEBEBABEBAFEFAFABABEFABABABEBEBABABABAFABABAFABEFAFEBABA BABEFABAFABEBABEBABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBABABAFABABA BEFEBABABAFABABEBAFEBEFEBABABABEFEBABEFEFEBABABAFEBABABAFABEFABAFEBAF ABEBAFABEFAFAFABABAFABABAFABAFEBABAFABABABAFABEFEFEBCBABABABABABABABA BA$18BD5BF2BF15B2FBFBF3BFBF7BF2B2F4BF3B3FBF4B2FB4FBF2BF3BF6B2FBF100BF 5BF2B4F6BFBF7BFBF2BFBF5BF9BF4BFB4F3BFBF2B2FBFBF3BF5BF3BF2BF3BF2B3F2BF 2B2F3BFBF7B4F9BF4BD18B$BABABABABABABABABADAFEFEBABABABABABEBABEFABABE BABABEBABABEBABAFABABABEBAFABEBABEBEFABABEFABABABEBAFEBABEBEBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFABABABABAFABABABABABABAFEFAFABABAFAB AFABABEFEBABAFAFABABAFABEFABEBAFAFAFABEBAFABEBEBEBEBAFABAFABABEBEBABA FABABABABABABABEBEBABAFAFABABCBABABABABABABABABA$18BD7BF6BF7BFBFBF2BF 8BF6B2F2BF2B3F2BF11BF3BFBFBF3B2FBF3BF98BF3BF8BFBF6BFB2F6BF4B2F5BF9B3F 8B3FBF2B3FB2FBF2B2F8BF9BF6B4F4BF6B2F6BF3BF2BF4BFD18B$BABABABABABABABA BADAFABABEBABAFABEBABABABEFAFABABAFAFABABAFABAFEBABABABABABABABEFABAF EBEFABABABAFEBEBABABABABEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABAFABAFABAB ABABEFAFABABABABEBAFEFEBEBABABABAFAFABAFABABABABABABABAFAFAFEBEBAFAFA BABABABAFABABEBEFABEBEBEBEBABABAFABAFABABABEBEBABABEBEFABABCBABABABAB ABABABABA$18BDFB3F5BF3BFBFBF2BFBF10BFBFBF2BF11BF2B2FBFBF6BF2BF4BF4B2F BF103B2F5BF2BFBF3BF2BF3BF2BFBFBF6BF10B2FB3FBFBF4BF2BF9BF7B2F5BF5B2F3B FBFBF2B2FBF2B2F4B2F9BFBF4B3F3BD18B$BABABABABABABABABADABABABEFAFABABA BAFABABABAFEFEBAFABEBABAFAFABABABABAFABABABABABEBABABABEFAFABEFABABAB EBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABAFABABEBABAFAFEBAFABAFEFEBEFABABEFAB AFABABEFAFEBABABABEBEBABEFEBEFAFEBEBEBEFABEBABABEBEFABEBAFABABABABABA FABABABABAFEBAFABEFEBABABEBEFEFEBEBEFEBABCBABABABABABABABABA$18BD2FBF 2B2FB3F2B2F8B2F5BF2BFBF3BFB2F2B5F9BF3B2F2BF5BF3BF5BFBFBF105BF4B2F11BF B2F3BF4BFBF2BFB2FBFB2F3B3FB5F3BF3B2F3BF3BF3BF2B2F4B2F3BFB2F12BF5BFBF 4BF3BF3BF6BFBFBD18B$BABABABABABABABABADABAFEBABABABABABABEBAFABEBABEB EBABABABEBEBABAFEBEBEBABABAFAFABEBEBABEBABABEBAFABABEBABABAFEBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABEBEBEFABAFEBABEBABAFABAFEBEBABEFABEBEFABEBEBEBAFA BABAFAFEFAFABABABABEFABABEBEBABEBABABAFABABABABEBEBABAFABEBABABABABAF ABEBAFABEFABABAFEBAFABEFABCBABABABABABABABABA$18BD2BFBF5BF3B2FB2F3BF 2B2F3B2F2BF6BFBF7BF9BF3BF2B2F10BF4BF102BFB2F8BF3BF3BF3BF4B2F3BF12BF8B FBFB3F3BFBF3BFB2F4BFBF2BF4BF4BF6BFBF8BF2BF3B2F4BFB2F2BF4BF6BD18B$BABA BABABABABABABADABABABABAFAFABABAFEBEBEFABAFABAFABEBABABEFABEBEFAFEBAF AFABEBABABABABEBAFAFEFEFEBABEFABABEBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABAF ABABABABABABABABABEFABEBABABABABABABAFAFEBEBEBABABAFABABABEFAFAFABABA FABAFABEBABAFAFABABABABAFAFABAFAFAFAFEFABEBAFAFABEBABABABAFEBABABEBAB AFCBABABABABABABABABA$18BD3BFBFBF3B2F3BFBFBF4BFBF2B2F3BF8BF3BF9BF9B2F 12BF7BF96B2FB2F3BF3BFB3FB2F24B2F2B2F9BF9BFB2F2BF6BF3BF7BF2B2F7B2F3B2F 4BF4B3FB2F2BFBFBFBF8BD18B$BABABABABABABABABADEBABEFABEBABABABEBEBABAB EFABEBABABABEFABEFAFABABABEBEBABAFABAFAFABABABEBEFABABAFABABAFABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABAFABABABABABABABABABEBABABEFABEBAFAFA FAFAFABABAFAFABAFEFABEBAFAFEFABABEBABEBABABABEBAFABABEBEBEBABABABABAB EBABAFEFAFABABABEBAFABEBABABEBABCBABABABABABABABABA$18BDBF4BFB2F2BFBF 2BF8B3F4BF2B4F3B2FBFBF3BF4B2F7BF4BFB3F4BF6BF101BF3BF3BF3B2FB2FB2F5BFB 2F4BF2B2F3BF16BFB2F2B2FB2F6BF6BF2BFB2FBF8BF8BF2B5F3BF3B3F10BF2B2F2BD 18B$BABABABABABABABABADABAFEBAFAFABABABABABABABEBABEBABAFABAFABABEBAF ABEBEBABABAFAFABABABABAFEFAFEBABEBAFABABABEBEBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABAFAFABABEFABEFEBABABAFAFEBEBABEBEBABEFABEBAFEFABABEBABABABABAFEBEBA BABABAFABABABAFAFAFEBABABABAFEFAFABABEFABAFEBABABABABABABABABABAFABAB EFEFAFABABCBABABABABABABABABA$18BDBFBFBF2BF3BFBF3BF6BF16BF5BF3BF2BF7B 2F2BFBFB2F4BF4B2F4B2F101BF3B2F5BF8B3F2BFBF5BF4BF2B3F9BF7BF7BF9BFBF2B 2F3BF2BF5BF6B3FBF2BF2BF7BF6BF3BF3BF2BD18B$BABABABABABABABABADEBABABAB ABABABAFABABEFEFABAFABEBAFABEFABABEFAFAFABABEBABEBEBABABEBEFEBEBABABE BABABEBEBEBEBEBABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABEFEBABAFABEFAFABAFEBEBABE BEFAFABAFABEFABABEBABAFAFABABABABABEBABAFAFAFEBABABABEBABAFAFABABEFAB ABAFEBABAFABABABAFEBABABAFABABEBEBABEBEBABEBABABCBABABABABABABABABA$ 18BDB2FBFBF2B2F2BF3BF2BF3B3F7BF3B3FB2F2B2F4B3F3BF2BF2BF6B2F8B2F2B2F3B F108BF5BFBF10BF2BF2BFBF7BF4B2F3BF7BFBF5BFBFBF4BF3BFBF5B2F7BF5BF3B3F6B 3FB2F7BF9BD18B$BABABABABABABABABADAFABAFEBAFABABABABEBABEBABABAFABEFE BABABAFABABABEBABAFABEBAFABAFAFABEFEBABABEFABEBABABABABEBABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABEFAFAFAFEFABAFABAFEBABEFABEFABABEBAFAFABABEBEBAB EBAFABABAFABEFAFEBABABAFEBEFEBABEFAFEBABEBABEFABAFABABABABABABABABEBA BABAFABABABABEBABEBABCBABABABABABABABABA$18BD2BF4BF3BF2BFBF7BF2BFB2F 4BF3BF6BF7BFBFBF3B2F2BF2B3F2BF2BF6BFBFB2F97BF2BFB2F2B2FBFBFBF2BFBF4BF B2F24BFBF6BF2BF2B2F3BF13B2F2BF3BFBFBF4BF5BF10BFB2F3BF2BFBF4BF3BFBD18B $BABABABABABABABABADEFEBABAFEBEBEFEFEBAFAFABEBEBABEBABEBABABABAFEFABA BEBEBEBABAFAFABEBABABAFAFABEFABABAFABABEBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA FAFABAFABAFABABEBAFAFABABABEBEBABAFEBABABAFEBAFAFAFABEBABEBABEBEFABAB ABABABABABABEBABABEBEBEBEBAFABABEBABABABAFABEBABEBABAFEFABABABABAFEBA FEBEFEBCBABABABABABABABABA$18BD4B3F3BF3BF7B2F2BFB2F8BF4BF2BF3BF2BF4B 2F2BFB2F13B3F4B3F104BF2BFBFBF2BFBFBF2BF3BF11B2FB3FBFBF3B2F4BFB2F2BF5B F3B2FBF8BFB2FBF4BF3BF2BF3BFBF2B2FB2F7BF2B2F2BF11BFBD18B$BABABABABABAB ABABADABABEBABABABABAFABABEBABABEFABABAFABABABABEBABABABAFABABABABABA BAFAFEBEBABABEFABABEBEFAFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBEBA BAFABABEFAFAFEBABAFEFAFABAFAFAFABAFEBABABABAFEBAFEBAFEBABEBEBABABABAF EFEFABEBAFEBABABEBAFAFEFEBABABABABABABEBABAFEBAFABABABABAFEFEBCBABABA BABABABABABA$18BD4B3FBF5BF3BF4BF4BF2BF3BF3BF4BFBFBF4B2F4BF3BF5B4F9B2F 6BF98B2F2BF3BFB2FBFBF3B2F4BF4BF11B2F2BFBFB2F2B3F9BF2B2F3BF3BF7BF2B2F 2BFBF8BF3B2F3BF2B4F4BFBF2BF5BF4BF2BD18B$BABABABABABABABABADABABEBABAB ABABEBABAFABAFEFAFEBAFABABABABABAFAFABABEFEBABEBABABEBABABAFEBEBAFEBE FABAFABEBABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABAFABABABAFABAFABABABAFEBABABAFA FEBEBABABABAFABAFABABABEFABABABABABEBABEBAFABABEBAFEBAFEFABABAFEBABAB AFEBABEBABEBABABABABABEBABABABABAFAFABABEBABAFCBABABABABABABABABA$18B D2BFBF5BF3BFBF7BFBFB3F9BF2BF8B2F6BF2BF2BF6B2F8BF3BF100BFB2F11BF6BF2BF 14BF2BF9BFBFBFBF5BFBF2BF3BFBF3BFBFB2F2BFB3F4BFBF6BFBF9BFBF3BFBFBF4BF 8BFBD18B$BABABABABABABABABADEFAFEBABABABABABEBAFABEBAFEBABEBEBABABABA FABABABABABABABABABABABEFABEBABABEBABABEFAFABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABAFABEBAFABABEBABABABAFABABEBAFABABABAFAFABABABABABABABAFABABAB ABABABABABABABABEBAFABEBABABAFABAFABABABABAFABEBABABEBABABABABEFABEBA BEFABEFEBABABAFCBABABABABABABABABA$18BD2BF3BFB2FBFBFB3FBF2BF2BFB2F2BF 6B2F3B2FBFBF3B2FBF2BF3BFBF5B2FBF2B2F6BFBF2BF100BF7BF2BF7BF3B2F3BF10BF 2B2F4BFBF5BF2BF6BF2BF5BF5BFBF2BF8BF3B2F7BF3BF8BF3BF2BF3B3F2BF4BD18B$B ABABABABABABABABADAFEBABEBABABEBABEBABABABABEBEBABEBEFABABABABABAFABA BAFABABEBABABABEBEFABAFABABABAFAFAFAFEBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABE BEBEBAFEBABEBABAFABABABEBABAFEFEFABABABEBAFEBABABEFABAFAFABABABABABAB AFEBEBABABABEBABABABEBABABABAFABABABAFABABABAFAFAFABABEBAFAFABABAFEBA BABABCBABABABABABABABABA$18BD3BF5B3F8BF3BF12BFBF2BF5BF5BF3BF15BFBFBFB FBFBF104BF4BF3BF3BF6BF3BF4BF2BF3BF2BF2BFB3FBF9BFBFBF4BF22BF2BF4B4F5BF 2BF6BF2BF5B2F6BFBF3BFBFD18B$BABABABABABABABABADEBEFABAFAFABABABABABAB AFABABEBAFAFABEFAFEBABAFABABEBABEBEFABABABEBABAFEBABEFABEFABAFAFABABE BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABAFAFEBEBABABABABEBEBAFABABABEBEBA BEBAFAFABABEBABEFEBEBABEBABAFAFEFAFAFABAFABEFABABEBABAFAFABABABABABAB EBABEFEBEBAFABABAFABEBABABABABEFEBCBABABABABABABABABA$18BD9BF7B3FBFBF 2BF6B2FBFB2FBF5B5F11BF4B2F5BF7BF4B3F109BF3BFBF3BFBFB2F3BF7BFBF10B3F8B FB3F2BF6BF3BFB2F4BF3BF7BF2B3F3B2FBFBF2BF4BF4BF3B2F6BF3BD18B$BABABABAB ABABABABADAFABAFAFAFABEFEFABABABABABAFAFABABAFEFABABABABABEFEBEBAFABA BABEFEBABABEBEBEBAFABAFEBABEBABEBABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBA BABABEBAFABABAFABABABABABABABAFAFABABEBAFAFABEBAFABAFAFABABABAFEBEBAF ABAFABABEBABAFEBABAFABABEFABABAFABEFABABABABAFAFEFABABABEFEBABABABCBA BABABABABABABABA$18BDB4F5BFBFBF2BF8BF4BFB2FBF6BF3B2F2BFB3F2BF11BFBF5B F2BF2B2F121BF5BF2BFBFB2F2B2FBFBF2B2F4BF2BF4B2F8BF3BFB3F2B2F4B2F2BF3B 2F11BF4BF6BF2BFB2FB2FBF14BD18B$BABABABABABABABABADEBABABEBEBABABEBABA BABABAFEBEBEBAFAFABEBABEFEBEBEBABABABABABEBAFAFABABEBEBEBABAFABAFAFEF ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFABEBAFABABAFEBABABEBABABEBAFEBAFABAB EBAFEBABABABAFABABABABABABEBABABABAFEBEBEFEFEBAFEBABABABABABABEBAFABE BABEFABABAFABABEBABEFABEBAFEFABABABEBCBABABABABABABABABA$18BD4BF5B3F 3BF4BF2BF2BFB3F4BF6BFBF3BF2BF2BF2BF11B3F8B2F4BF100BFBF3BFBF2BFB2F3BF 4BF2B2F11BFBF3BF5B3F6B2F7B2F4BFB3F5BF3BF2BFBF2BFBF13BFBFBF3B2F10BF3B 2F2BFBFD18B$BABABABABABABABABADAFAFABABABAFEBEBABABABEBABABABABABABEF EBABAFEFABAFABEBABEFABABEBABEBABABAFABABEFAFEBABEBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEBABABABABABEBABAFEBABEBABABEFABABABEBEFABAFAFEBABABABE BAFABEBABABABEBABABABAFEBABABABEFEBAFABAFEFABABAFAFABAFABABAFABABABEB ABABABEBABEBABAFABCBABABABABABABABABA$18BDBF8BF3B5F2BF2BF2BFBFBFBFB2F 5BF7BF5BF7B2F3BF2B2F2B2F8B2F2BF98BF5BF3B2F6B3F4BF2BF5B2F5BF4BF2B5F5B 2F2BF3BF8BF2B2F3BF4BFBFBF4BF5BF13BF4BF2BF5BFBF6BFBD18B$BABABABABABABA BABADEFEBEFAFEBABEBAFEBABEBABAFAFAFAFAFABABAFABABAFABABABEBEBABEBABAB EBABEFABABAFABABABAFABAFEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABAFABEF ABEBABABABABABABEBABEBAFABABEFAFABABABAFABABABEBEBABABEBABAFAFABAFAFA BABABABABEFABEBEBABABAFAFABABABABABABABABAFABABABABABABEBEBABCBABABAB ABABABABABA$18BDBF11BF11B2F4B3F4BF3BF4BF2BF2BFBF7B2F8BF2B2F5BF103B3F 5BF3BF2BF9BF4B3FBF10BFBFBF2BF6B2FB4F2BF5BF2B2FBF2BF4BFB3F9BF9BFBF3B2F B2F2BF2BFB2F2B3F7BFD18B$BABABABABABABABABADABAFEFABABABAFABABABAFABAF EBEBABEBABEBABAFABABABABABABABEBAFABAFABABABABABEBABABABEFEBEFEBABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABEBEFABABABABAFABABABABEBEBEBEFABEBEBABABAFABA BABABEBABABABEBABABABEBABAFEFAFABABEBAFEFABABABAFABABABABABABABEBAFAF ABABABABABEBABEBABABABABEBEBAFCBABABABABABABABABA$18BDBFBF5B2F2BF2B2F 4BF5BF2B2FBF2B2FBF5BF3BF5BFBF9BF2BF5BF4B3FBF102BF2BF7BFBF6BFBF4BF3BF 6BF4BF2B2F4BF5BF2BFB2F4BFB2FB2F5BF2BF10BFBF2BF2BFBF10B2F3BF9B3F3BF3B 2FD18B$BABABABABABABABABADEFAFABABAFABABABEBABABABAFAFABAFABEFABABAFE BABABABEBEBAFABABABEFABABABABAFABAFABABEBAFABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABEFEFABABABEBABABABABABABABEBABABABAFEBEBEBABEBAFEBABABABABABAB EFEBEBEFABAFEBAFABEBABAFABABEBEBABEBEBABEBEBAFEBAFABABEBEBABAFAFABABE FABABAFEBABABCBABABABABABABABABA$18BDBF4BF8BF6BF2BF2BFBF5BFBF8B3F3BF 2BFBF2B3F7BFBF2BFB2F4BF2BF99BF11BF5BF3BF7BFBF5BFB3F2B5FBF3BF3B2F3BFBF BF5BF9B2F3BFBF4BFB2F2BF3BFB3F2BF3BFB2F2B2F5B3F2B2F4BF3BD18B$BABABABAB ABABABABADABABABABABABEBAFAFABAFAFEFABAFEBEFEFEBABABABAFEBABEFABABABE BAFABABABABABABEBABEBEBABEBABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEFA BAFEBABABABEFABABABEBABAFABABABABABABABABEBAFAFABAFEBABABEFABEBABABAF AFAFAFAFABAFABABABABABAFABABABABAFAFAFEBABABABABABEBAFABEFABAFEBABCBA BABABABABABABABA$18BDBFBF2BFB2FBF2BF4BFBF9B2F10BFB2F5BFBF3BFBFBF6BF2B FBFBFBF7B3FBF102BF2BF2B2F3B2F3BF7B2F4BFB5FBF3BF3BF6B3FB3F4B2F10BFBF2B F5BFBFBF5BF6BF7BFBFB2F2BF7B2FBF6BFD18B$BABABABABABABABABADEBABAFABEBA BABABABABABAFABEBABABAFABABAFEBAFABABAFEBEBABEBABEBABAFABEBABEBABABAF AFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEBABAFABABABEBEFEBAFEBABEBEBAF EBAFAFAFEFABAFABABABAFABAFABEBEBABABEBEBABAFEBABABAFABABEBABEBABABAFA BABABEBABABABABEBABABABAFABABABABABABABAFABAFCBABABABABABABABABA$18BD FBF4BF17BF3BFBFBF5BF5BF12BF3BF2BF4BF6BFB3F2BF2BF2BF98BFBF3B5F7B3F5BF 2B4FBF6BFB2FBFBF4BFB2FBFBFBF2BF5BF3BF7B2FB4F4B2FB2F2B3FB2F2B2F20B2F2B F4BFBFD18B$BABABABABABABABABADEFAFEBABEFAFAFABABAFABABAFABAFAFEBAFABE BEBABEBEBABEBABEBABABEBEBEBAFEBEFABABABAFABABABABEBABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABAFABABABEBABABABEBABEBABAFEBEFABEFAFEFABABAFAFABAFABABABAB ABABABEBABABEBAFABABABEBABABABEBABABABABEFEFEBEBEFEBEFABEFABEBABABABA BEBABABABABABAFABCBABABABABABABABABA$18BD2BF7B2FBF4B2F3BF6B2FBFBF4BF 4BF2BF3B3FBFBF2BFBF3BF2BFBF5BFBFB2F2BF109B2FBF2BF6BF7BF2BF2BF10BF3BF 4B2F4BF2BF2BF9BF5BF5BF4BFBF2B4FBF2BF5BFBF2BF2B2FBF3BFB2FBF8BFBD18B$BA BABABABABABABABADEFABABABABAFABEBEBABEBEFABAFEBAFABABABABAFAFEFABABAB EBAFEFEBABABABABABABAFABAFABABEBABAFAFABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEF EBAFEBEBABAFEFABABABABEFABEBABABABABABEFEFABAFABABABABABABEBAFABAFABA BEBEBABEBEFABEBAFEFABEBABEBABABABABEFABABABEBABABABAFAFEFAFEBABABABAB EFEFCBABABABABABABABABA$18BDFB2F3BF4BF6BF2BFBF11B2F4BFBF3B3F3BF2BF4BF 6B2F5B2F2BF2BFBFBF100BF4BFBF2B3F2B2F4B6F2BFB2FBFBF2BF2BF3BF3BF3B3FB6F 3BF7BF6B2FB3FB2F2BF2BF3B3F4B2F5BF2BF3BFBF3B3F2BF7BF3BD18B$BABABABABAB ABABABADAFAFABAFABAFAFABAFABEFABABEBABABAFEBABEBABABABAFABABABABABEFA FAFABABABABABABEFEBABEBEBABABEBABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBAFEBEBABA BEBEBABAFEFABABABABABABABABABABEFEBEFABAFAFAFABABEFABABABABAFAFABEBEB AFABAFAFABABABABEBABABABEBABABAFAFABABAFABABABEBEFABABABAFABABABCBABA BABABABABABABA$18BD2BFBF11B3F4B3F2B2F3B5FB2F2BFB2FBF3B2F2BF5BF2BF8BFB FBF4BFBF3B2F98BF6BF6BF5BFBF3BFBFBF5B3F2BF11BFBF11B2F8BF2BF3B3F4BF11BF BFBF2B3F2BFBF3BF2BF3B2F2BF4BF2B2FBD18B$BABABABABABABABABADABEBABABABA BABABAFAFEFABABEBABEBABABEFAFABABABABABEBEBAFAFABABABABABABEBABABABAB ABABEFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABEFABABABEBABABABABABAFEBEFAB ABEFEBEBABABABABEBABEBABABABABABABEBAFABABABABEBABAFABABAFABAFABEBEBA BABAFABABAFEBABABABABAFABABEBABEBABEBABABEBEFCBABABABABABABABABA$18BD 3BFB3F2BF8BF5B2F9BF5B5F5BF2BFBF4B3FBF3BF5BF3BF3BF3BF99BF3B3FBFBF2B4F 2BFBFBF2BF4B2FBF5BFB4FBF4B2F3B2F3B3FBFBF3BF4BF3BFBF2B2FB2F3B3F6B4F5BF 9BF7BFBF2BFBF6BD18B$BABABABABABABABABADEBEFEBABABABABAFAFAFEBABEBAFEF AFEBABEFEBAFABEBABAFABEBEFABEBAFABABAFAFAFABEFABABEBEBEBABAFABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABAFEBEBAFAFAFABABAFEBABABEBAFABABEBEBEBABEBABABABE FABABABABEBABABABABABEBABABAFAFABAFABAFABEBEBABABABEBABEFEBABABABEBEB ABEBABEBABABEFABABAFABABAFCBABABABABABABABABA$18BD4BFBF2B2F2BFBFBF2BF 6B2FBF5B2FBFBFBF3BF2B2F7B2F2B2F7B2F3B2F9BF98BF2BF5BFBF4B3F3BFBF2BF4BF BF3BF6BF2BF4BF6BF10B2FB3FBF4BF3BF3BFBF2BF2BF2BF2BF2BF4BFBF3BF4BF2BF3B F4BF3BF2BFBD18B$BABABABABABABABABADEBABAFABABABEBABABABEBABABABEBABAB ABABEFEBABABAFEBABAFAFABABEBABABABABABABABEFEBAFAFABABABEBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABAFEBABEBABABAFABABABABEBEBAFABABABABABABABAFABAFEBAFA FAFAFABABABABABEBAFABABAFEFEBAFABABEFEFAFABAFEFEBABAFAFEFAFEBABAFEFAB EBAFEBABABABAFAFEBABABCBABABABABABABABABA$18BDBF2BF3BFBF2BFBFBF3B2FBF 4BFBF2BF2BF3B2F7BF5B2F4BF3BF2BFBF5B3FBF105BFB2F3B2F3BF5BF2BFBF6B2F2BF 4BF2BF3B2F2BFBF3BF5BFB2F5BF3BF3BF3B3FB2F3BF7BF2BF3BF5BF5BF5BF3BF7BFBF 5BD18B$BABABABABABABABABADABABABABABABEBABEFEBAFEBEBAFABEFEFABABABAFA FEFEBEFAFAFABEBABAFABABABABABEFEBEBAFAFABABEBEBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABAFEBAFABABEBAFABEBEBABABAFEFEFEFAFABEBABABAFABABAFEFABAFAFABEFAB ABABAFAFAFEBABABAFEBAFEBABABABABABEFABABEFAFABABEBABEFABABEBABEBABAFA BABEFABABEFAFCBABABABABABABABABA$18BDBFBF2B2F3BFB2F2BF2BF2BFBF2BFBF2B 2F3B2F10BF3B2FB3F3BF7B3FBF3BFBF108B2FBF6B3F5BF3BF3BFBF5B3F7BF3BFBF3BF 2BF2B2FBFBF5BF4B2F3BF3BFBF5BF2BF15BFBFBF14BFBFBF6BD18B$BABABABABABABA BABADEFAFAFEBABABEBABEBEFEBABEBABABABABABABABABEBABEBAFABEBABEBABABAB EBAFAFABABEBABEBABEBEFABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABAFAFABABABABABEB ABABAFAFABABAFAFEBABABAFAFAFAFABABABEBABAFEBABABEBEFEFABABAFABAFAFEBE BABABABEBABAFEBABABABAFAFABAFABABABAFEFAFABEBABABABAFABAFABEFCBABABAB ABABABABABA$18BD8BFBF3BF2BFBF2BF2BFBFBF2B3FBF9B2F2B2F4B2F3BF10BF2BF2B 2F8BF99B2FBF3BF2B2F6BFB2F3BF2BFBFBFB2F2BF7BF4BFB2F3BF3B2FBF5BF13BFB2F 5BF3BF2BFB2FBF7B2F5BFB2F2BFBF4BF4B2F3BD18B$BABABABABABABABABADABABABA BEBABABABAFABABABEFABABABABABEFABABEFABABABEFAFAFAFABAFABABABABABABAB ABEFABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABEBABABAFABAFABAFABEFABEBAB ABEBABEFEBEFAFEBAFEBAFEFABAFABAFEFABABEBABABAFEBEFAFEFABAFABAFABEFABA BEBEFEBEBABABAFEFEBABAFABEBABAFABABAFABABABABABABCBABABABABABABABABA$ 18BDF10BF3BF3B3F3B2F3B4F6BFBFB2FB2FBF4B5F12BF7BF7BF98BF4BF4B3F6BF2BF 3BF9BFBF8BF2BFBFBF4BFB2F5B2F3BF7BF5B2FBFB2F4BF4BFBF10B3FB2F6B2FBFBF 11BD18B$BABABABABABABABABADABABABEFEBEBAFABABAFAFEBABEBABAFAFABAFEBEF AFABABEBEFEFAFAFEBABAFAFABEBABEBAFEBABEBEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABEBEBABABABAFABEBAFABAFEBABAFEBABABABEFABAFEBEBAFABABABAFABA BABABABABABEBEFAFABEBEFABEBAFAFEBABABEBABAFABEBABEBABEFABEBABABABAFEF ABAFEBEBABABABCBABABABABABABABABA$18BDB2F3BF2BF6BF9B2F6BF4B2FBF4BF3BF 3BFBF2B2FBF6BFB2F3B2FB2F3BF4BF2BF4B2F3BF2BF4B2F11B3F4BFBF2BF4BFBF2B2F 8B2F3BF3BFBF2BF5BFBF4BFBF4BF6B2FBF6BFBF2BFBFBFBF2BF6BF7BF2BF4B2F13B3F 4BF6B4F6BF2BF4B2F11BF2B2FB2F2B2F4BFBF3B2F4BD18B$BABABABABABABABABADAB AFEFAFAFAFABABABABABABAFABAFEBABABEBAFEFAFEFEBABABABABEBAFEBABAFEBAFA BEBABABAFABEBAFABABABABEBABABEBEBABEBABEBABABABEBEBEBAFABABABABEFEBAF EFABEFEBEBEBABEBABABEBABAFEBABABAFABAFABABAFABAFAFEBAFEBAFAFEBEFEFABA BEBABABAFABABABEFEFAFABABAFABAFABABEBABABABABEFEBABABEBEBAFAFABABABAB AFABABABEBEBABABAFEBAFAFEBAFAFABABAFAFAFABABABABEBABEBCBABABABABABABA BABA$18BD6BFBF3B3F8BF2B2F4B2F4B3F2BF3BF3BF2BF3BFBF3BF2BFBF3B4F7BF2BF 2BF2BFBF3BF2BF9BF10BFBFB3F2BF16BF4B2FBFB2F2BF6BF9BF5BF3BF2BF22BF2BFB 2F2B2F7BF7BF5BF2BFBFBF8B2FBF3B2FBFB3F11BFBF6BF4BF5B2F8B2F6BF2BFD18B$B ABABABABABABABABADAFAFEBAFABABAFEBAFAFABAFAFABEBEFAFABABEBABEBEBABABA BABEFABAFABABEFEBABEFABABABEBABEBABAFABEBABABABABABABEBABAFABEBAFAFAB EBEBAFABABABABABABAFAFABABABABEBABABEBABAFABABAFABABAFABAFEBEBEFABAFE BABABAFEBAFAFABAFABABABEFABAFEBAFABABEBABABEFAFABAFABABAFAFEBEFAFABEB ABABABABABABAFAFEBEBEFEFABEFABABABEBEFABEBABABABABEBAFABEBAFEFEBABAFA BEBABCBABABABABABABABABA$18BDFB2F9BF3B5F3BFB2F4B3F2B2F8BFBF3BF2BF2BF 3BF4BFB3F6BFBF10BF12B2F4BF3B3F3BFBF14BFBF4BF6B2F3BF3BF3BF4BFBF2BF3BF 2BF4BFBFBF7BFBFBF3BFBF3BF4BF2B2F3BF11BF2BFBF2BFBFBFBF3B2F5BF2BF2BFBF 6B2FBF3BFBF4BFBFB2F2BF2BF9BF3BFBF3BF5BFBD18B$BABABABABABABABABADABABA BABAFABEBAFABAFABEBABABABEBEBABEBABEFEFABAFABEFABABABAFABABAFABEBABAB AFEBABABAFABEFABABABAFABEBABEFEFABABABEFABABAFABABEBABABEBABABEBABEFE BABAFEBABABEFABABABEBABAFABABAFABABABEBEFABABABABAFEBABABABEBEBAFAFEF EBABAFABAFAFAFAFABABABABAFEBABEBABAFAFABEFABABABABEBABEBAFABEBEBABAFA BEFAFABABEBABAFAFABAFEFEFABEBABABAFEBEBABAFEFABEFAFCBABABABABABABABAB A$18BD4BF2BFBF6BF2BFBF4B2FB3F2BF2BFBF3BF5B2FB2FB2F2B2FBF2B2F3BF6BF5B 4F3BF6BF4BF5B2F4B3FBFB4F2BF9BFBF7BF2BF4BFBF2B2F5BF2BF2BF2B2F2BF3BF2B 2F2BF3B2F2BFB2F2BF5B2F13B2F4BF2B2F3BF4BF9BF4BF2BF2BF10BF7B2F7BFBFBF3B F4BF2B2F7BF13BD18B$BABABABABABABABABADEFAFABABEBAFAFAFABAFABEBAFAFABA FABAFABAFABABABABABAFEBABEFABEBABABEBABABABEFABABEFABABEBABEBEBABEBAB AFEBABAFABEBABABEBABEBABABABAFAFABAFEFAFABABABEBABABEBABAFEBAFABABAFA BAFABEBABEBABABAFABABABABEBEFEBABAFAFABEFAFAFABABEFAFAFABABABEBABABEF ABABABAFEFABAFABABEBABEBEBABAFABAFEBAFABEBABABABEFABEBAFAFEBABAFAFABA BEBABEFAFAFABEBAFEBAFABAFCBABABABABABABABABA$18BD3BFBF2B2FBFBF6BF3BF 5BFBF5BF8B2F4BF4B3F4BF2B2F3BF3B4F2BF3B2FB2F2BFB6F6B2F6BF4B3F2BF2BF2BF BF4B2FB2FB3FBF5BFBF2BFBFBF4B2F9BF3BF6BF2BF3B2F2B2FBFBF7BF6BF5BF3B2F8B FB3FB2F3BF2B2FBF3B3F6BF3BFBF6BFBF2BF2B2F2BF10BFB2F3BF4BF3B4F3BFD18B$B ABABABABABABABABADEBEBAFEBEBEFABEBEBABEBABABAFABEBABABEBABEFEBABEFAFE BABEFEFAFEFEBABABAFABABEBEBABABEFEFEBABEFABABABABABEBEFABEFEBABABEBAF ABEBABABAFABEFAFAFABABABABEFABAFEFAFABAFEBABABEBABABABABAFABABAFEBAFA BAFABAFABEBABABEBABEFABAFEBABAFEBEBAFAFABABAFABABAFABEBABABEBABAFABEB EBAFAFEBAFAFABABEBEBABEBAFAFABEBABEBABABABABABEBEBABEBABEFABEBABABEBA BEFABCBABABABABABABABABA$18BD6B3F2BF6BF11BF4BFBF12B3F3BFB2FBFBF2BF7BF BF5BFBF3BF2BF2B2F2B2F6BF6B2F4BFBF4BF6BFB2FBF3BF4BF7BF2BFBF3BF5B2FB2FB 2F4BF3BFB3FBF6BF5B2F3BF5BF2BFBF3B2FBF7BF6BF2BFB2FBF3BFB2F9BF2BFBF2BF 2B2FBF3B4F3BF2BF3BF2BFBFB4F6BF4B4F6BD18B$BABABABABABABABABADABAFABABA BEBABEFABAFABABEBABABAFABEFABABAFABAFEBABABAFEBAFABEBAFABAFABAFEBABAF ABABEFABEFAFABABEBABEBAFABEBABABAFAFEBAFEFEFABAFABABEBEBABABAFAFAFABA BAFABEBEBAFAFAFAFEBABABABABABABAFEFABEBABEBEFABABABABABABABABABAFABAF ABABABEBABEFABABAFEBAFABABEFABABABEBAFEBEFAFABABEBABAFABABABABABABABA BABAFABABEBABAFEBEBAFABEBEBEBABAFEBAFABABABEFAFCBABABABABABABABABA$ 18BDFBFBF6B2F4BF2BF4B2F6B2F2BF6BF4BFBFBF2B2F4BFBF5B2FB2F2BF3BF5BF3B2F 2BF3B3FBF5BF4B2FBFBF4BF4B2F4B3F2BF2BF7BFBF5BF3BFBF3B2F7BF2B4FBF9BFBF 5BF3BF5BF7B2FBF2B2F4B2FBFBF3B2F4B2F5BFBF2BF3BF2BF3BF7BF2BF2BFBF2BF2BF B2F2B2F2B2FB2F2B2FBFB2F6BFBFBFB2FD18B$BABABABABABABABABADABEBABABABAF AFABABABEBAFABAFEBAFEBABABEFEBEBAFABAFABEFEBEBABABEBEFAFAFABEBABAFABE BABABEBABABABEFEBEBABAFAFEBABABEBAFAFABEBEBABABABABABABEFABEBABABEBAB ABABABABAFABABEBEFAFEBAFABABAFEBABEFABABABABEBABABEFABEBABABEBEBABABE BEBABABABABEBABAFABABABEBABAFABAFEBABABAFABABABABABEBABEBABAFABABABAF ABABEFABEBABAFEFAFABABAFABEBEBABABAFABABABAFCBABABABABABABABABA$18BDF 6BF5BF3B2FBFB3FBF2B2F4B2F4BF2BF5B2F3BF5B4F2B2FBF8BF6BF4BF2BF2BF2BF21B 2F2BF4BFB2FB2FBFBFBF2B2F4BF13B2F5BF4B3FBF5B2F6BF5BF2B6F4B2FBF5B2F2BF 3BF5B3FB2F3B4F2BF5BF2BF6BF2BFBFBF5BFB2F5BF2BF3BF2BF8BF7BF2BF4BF2B2FBD 18B$BABABABABABABABABADEBABABABABABABABAFEBABABEBABEBABAFABEBABEBEBEB ABABEBABEBAFABABAFABEBABEBAFABABABAFEBAFAFEBABABABABEBABEBAFEBABEFABE FABEBABEBABAFEBEBABAFEBEBAFAFABEBABAFEBEBABAFABABAFAFEBABEFABEBABAFEB ABEBEFAFAFAFABABEBABEBABEBEBABABABABABEBABEBABEBABEBAFEBABABEFABEBABE BABEBABAFABABABABAFABABABEFABABABABABABEBABABABABABAFAFAFEBAFEBABABEB ABEBEBABABCBABABABABABABABABA$18BD3F5BF2BF2B2FB2FBFBF9B2F4B2F6B3FBF8B F4B2FBF3B4F6BFBFBF2BF4BF9BFB2F5B3F2BF2B5FBF4B2F2BF10BF2BF4B2F2BF4B3F 9B3FB2F2B2F3BFB2F8BFBFBFBF4BF2BF9BF6B2F3B3FBF3BF6BF5B3FBFBFB2FBFB2F3B F2BFBFBF2BF7BF3BFBFB2FBFBF4B2F11BFBF2BFBFD18B$BABABABABABABABABADABEB ABABABEBAFABABABABEBABABABABEBABEBABAFABABAFABEBAFEFABABEBABEBABABABA BABEFEBEBABAFABABEFABABEBAFABABEBABABABEBABABAFABABAFABAFABEFABEBEFEB ABAFAFABABABABEFABABABAFABABABAFABEBABABEFAFEBABABEBABAFEBAFABABABABE BEBAFEBABABABEBEFABAFEBEBABEFABABABABAFEFABAFAFABABAFABABABAFABABABAB ABEBEBABEFABABABABABABAFEFABABEBAFAFABAFEFABABABEFEFCBABABABABABABABA BA$18BD4BFBF4BF8BF3BF2BF2BF2BF3BF3BF5BFBF6B4F6BF4BF2BF4B3F2BF8BF3BF 17BFBF2BF7BF5BF2BF9BF10B2F4BFBFB3F2B2F2BF3BFB2F3BF11BFBFBFBF6BF3BF7B 3F2BFB4F7B4FBF3BFBFBF3B2FBF2BF3BF3BFBF3BFBF4BF6BF2BF7BF3BF4B2F3B2F4BF 4B2FD18B$BABABABABABABABABADAFABABABABEFAFABEBABEFABAFABAFABABAFAFABA FAFABAFABAFEFAFABAFEBABEBEBAFABABEBABABABEBEFABAFEBABABEBABEBEBEFABEF EBABABEBABABABABEBEFAFABABEBAFABEFABABABABABABEBABABEBEBAFABEFAFEBABA BABABABEFABEBAFAFABABABABEBAFEFEBABEBABABAFAFEBEFABABEBEBABABAFEBABAB ABABEFEBAFAFABEBEBABABEBABEBEBABAFAFABAFEBABAFAFABEBABABABAFABEBABABA BAFABEFEFABABABCBABABABABABABABABA$18BDBF3BF6BFBFB2FBFBF5BFB2FB3F11B 2F10BF4BF4B4F2B2F3B3F6B3F3BF12BFB3F4BFBF2BF6BFBF4BFB2F2BFBFBF2BF3B3F 8B3FBF9BFBF8B5FB2F3BF4BF3BFB2F14BF2BF2BF4B2F2B4F5BF3B3FBFBF2B2F8B2F2B FBF4BFBFBF3BF5BF2BFBF2BF3BFB2F5B2F3BFBF2BF2BD18B$BABABABABABABABABADA BABABEFEFABEFABEBABEFAFABABEBAFABAFEBEBABABABAFAFABEBEBEFABEBABAFABAF ABABABAFEBEBAFAFAFABABEBABAFABEBABEFEBABABABEBEFABAFABABABAFABABABABE FABEBABABABABABEBABAFABABABABABABABEBABABEFEBABABAFABEBABABEBAFABABEB ABABABABABAFABEFEBABABABABAFABEFABAFEBEBAFEBABEBABABABAFEBEBEFABABAFA BABABABAFABABEBABABABABEFAFABABABABAFEFEFEFEFABEFEBAFEFCBABABABABABAB ABABA$18BD5BF14B2FBF6BF2BF9B3F5BF3BF2B3F2BF3BF4BFBFBFBFB2FBF2BF3BF2B 2FBF3B2F2BFBF14B2FBFBFB2FBF5B2F3BF2BFBFBFBF5BF9B2F4B2FBF2B2F2B2F3BF2B FBF5B2F4B3F5BF3BFB2F4BF2BF6BF7BFBFB2F2B2F2BF3BF7B3F2B2F3B2F2BF4BF6BF 2BF2BF2BFB2F2BF5BF3BF2B2FBF5BFBD18B$BABABABABABABABABADABABAFABEFEFAB ABABABABEBEFABEFEBABABABABABABABEBABABABEBEBABEBAFAFEBABABEBABEBABAFA BAFABEFEBABABEBEBABABEBABABABEBABAFABABABABAFABEFABABEBEBEBAFABABAFAB AFABEBABABABEBABABEBEFAFEFABABEFABABABEBABABEFABEFEBEBABAFAFABABABABE FABEBAFABEBABABEBABABABEBAFEBABABAFABABABABEBABABAFABAFEBABABABABABAF ABEBABAFEFAFABEBEBABEBAFABEBEBABEBABABABABCBABABABABABABABABA$18BD3BF 4B2F8BF3BF5BF3BF8B2F2B3FB2FBF6BF2BF6BF2B3FBF7BFBF3BFBF6B2FBF2BF2BF3BF B3F2BF3BF2BF9BFB6F2B2F2BF5BF6BF6BF6BF2BF6BFBFB2F14BF9BF5BF2BF3BF2BF4B F2B2FB2F3BF6BF3BFBFBF8BFBF4BF12B4FBF3B2F2BFB2FBF3BF2BF2BF10BD18B$BABA BABABABABABABADABABEFABABEFABAFAFAFABAFABAFABABABABABEBEBEBAFABABABAB ABABABABABABAFABAFABEBAFEBEBABEBAFABEBABAFABABABEBABAFAFABABEBEBABEBA FABAFABEBAFABABABABEFABABAFABEBABABABEFABABEFABABABEBEFEBEFABABABEFAB EBEFEBABABAFEFAFABEBAFABABAFABEFABABAFABABEFAFAFEFEBAFABAFABAFABABABA BAFABAFABEFABABABEBEBEBEBEBAFABABAFEBABEBAFAFABAFAFABABABAFABEBABABAB ABCBABABABABABABABABA$18BD7B4FBF3B4F4BF2B3FBFBF3BF3B2FBF9BFBFBF5BF2BF B2F2BF5BF2BF3BF2BF5BF6BF4BF5B2F15BF3BF4B4FBF2BF7BFBF2B2FBFBF3BF2B2F6B F2B2F4B2FB3F11B3F2B2F2B2F2BF2BF3BF4BFBFB2F5B2F2BFBF8B2F2BF2BF5B2FBF4B 2FBF2BFBF2BF3BF3BF2BF6BF3B2F8BF3B2F2BFBFD18B$BABABABABABABABABADAFEBA FAFABEBAFEFABEBAFEFEBEBEBABEBAFABABABABEBABEBABABABAFEBEBEBEBEBABABEB ABAFABAFABAFABABABABABEBAFAFABEBAFEBAFEBAFABABABABABABABABABABEBABABA BEBAFEBAFEFABEBEBABABEBEBABAFEBEFABABABAFABAFABEBABABABABABEFEBEBAFAF AFEBAFABABEFEBABABABEBEBABAFEBABAFABEFEBAFAFABABABABEBAFAFABABEBAFABA FAFABABABAFEFEBEFABAFAFABEBABABEBABABAFABEBABABABABCBABABABABABABABAB A$18BD4BFB2F2BF2B2F3BF16BF6BF4BF2BF3BF4BFBF2BF6BFB2FBF2B2F2B3F5BF13B 2F2BF2BF3BFB3F2B4FBF2BF3BF3B2F5B3F3B2F3B5F2BF2BF5BF3B2F2BF3BF5B4F2B2F 2BF2BF9BF8B2FBF4BF2BF3BF3BFBF5B3F6B2F2BF2B2F2BF5B3F3B2F3B2F8B2F3BF10B 2F4BFBF4BFBF3BD18B$BABABABABABABABABADABABABAFABABABAFAFABAFABAFABAFA BAFAFEBEFABEBABABABABEBAFABABABEFAFABEBEBABEBABABABEFABABAFABEBABABAB AFABABAFABEBABABEFAFAFABABAFAFEBABEBABABABAFABAFABAFABAFEBABAFABAFABA FABEFEBABABABABABAFEFEBABAFEBABABAFABEBABABEFEBABEFEBAFABABEBEBABEBAB AFABAFAFABABEFABABEBAFAFABABAFABAFABABEBEFEBABABABABABAFEBABABEFEBABE BEBEBABABABABABABABEFAFEFCBABABABABABABABABA$18BD2BF2B3FB2F4BFB3FBF 13BF2BFBF5BF2B2F6B3F5BFBF2B2FBF5B3F2BFBFBF4BF3B2F7BF2BF2BF4B2F10BF2BF 5B2F2BFBF9B2FBF2BF2BF8BF3BFB3FBF7BF6BF3BF2BF8BF3BFBFBF2BF6BF4BF11BF2B FB2F2B4FBF7B3F7BF4B2F7BF5BF4BF2BFBF6BFBF4B2FBF4BD18B$BABABABABABABABA BADABABEBABABAFEFABABAFABAFABEFABAFABEFEBABEFEFEBABABEBAFEFABABAFABAB ABABEFEBABABABEFEBABEBEBABABAFEBABABAFAFAFAFABABAFABABABEBEBEBABABAFA FABEBABABEBEBEBABABAFABABABABEBABABABABAFAFAFABEFABEBABAFEBABABEBABAF AFEBAFEBEFABABABEBABABEFABABEFEBAFEBABEBABAFEFEBEBAFABAFEBABABEBABEBE BABABEBABABEFABABABEBABAFABAFABEBABAFEBABEFABABABABABABABAFCBABABABAB ABABABABA$18BD2F4BFBFBFB2F2BF4BF4BF15BF7BF3BF3BFBFBF2BFBFBFBF8BFBF4BF BF5BFBFBF4BF3BFBF10BF5BF5B6FBFBF3BF2BF2BF4BF2BF3BF2BF4B3FB4FBF8BF4B2F 5BF3BF2BFB3F9B2F4BF2BF2BF5BFB2F9B2F5B3FBFBFBF4BF2BF4BF4B4F4BFBF2BF9B 2FBF5BF5BF6BD18B$BABABABABABABABABADEBABABABEBEBEBABABABABABAFEBAFABA BABABEBEBAFABEBABABAFABEBAFEBABABABAFABABEFEBABABAFAFABAFABABEFEBEBAB AFABABAFEFABABABABEBABEBABABABABEBEFAFEBEFEBEFAFEBABABABABEBABEBEFEBA BABABEBABAFABABABAFEBABEBAFEBEFEBEBEBABABABEFEFABEBABABEBEBABABABABAB ABABABABAFABAFEBEBEBABAFEBABABEFEBABABABABAFABABABABAFABABEBABAFABABA BEBEFABABEBEBAFEFABABABCBABABABABABABABABA$18BD3B3F4BF3B2FBFB2FBF4BFB FB3FBF4B2F2B3F3BF2B2FBFBF4B2FB2F2BF10BF2BF11BF4B2FBFBF6BF2BFB2F3B2F8B 2F5BF4BF2BFBF2BFBF3BFBFBFBFBFBFBF2B2F2BF3B2F4B3FB2FBF3BFB2F6B2F4BFBF 4B2FB3FB2F3BFBF2B2F3BFB2FBF2BF4BF3B3F6BF2BF4BFBFBF7BFBF6BFBF8BF9BF3BF 2BFBF2BD18B$BABABABABABABABABADABABABEBABEBABAFAFABEBAFABEFABABAFABAB EBAFABEBABAFAFEBABAFEFEBEFEFABEFABAFABABABABAFAFEBABABABEFEFAFABAFEBA FEBEBAFAFABABEBAFABABAFABEBAFABABABEBABABEBABABEBABABABABABABAFABABAF ABABABABABAFEBABEFABEBAFABAFEBEBEBABABEBABABEBAFABABABABAFABEBABEBABA BABABABEFABABABAFABAFABEFAFEBAFAFEBEFAFAFABABABAFEFABABEBABABEBABEBAB EBABEBABABAFABABAFCBABABABABABABABABA$18BD2B4F3BFBF3B2F2BFB3F3BF4BFBF 2BF4B4F5B2F3B3F7B2F5BF5BFB2F4BF2BF7BF3BF3BF2B5FB2FBF3BF3B3F3BFBF7B2F 2BF8BF4BF3B2F4BF4B2F11BF2BF10B2FB2F2BF2BFB2FBF12BF3BF3BF4BF11B2FBF2BF 2BF4BFBF4BF2B4FB2F6BF4B2F4B2F3BF6B2F8BFBF4BD18B$BABABABABABABABABADAB ABEFABEBABEBABABABABABABAFABABEFEFABABABABABEFABAFABABABABABABABEBABE FEBABABEFABABAFAFEFEBABABEBEBABAFAFABABABEFEBABEFABABABAFABEBABAFABAB ABEBAFEBAFABABEBEBEBABABAFEBABABABABAFAFABEBABABABAFABAFEBAFABEFEFEBE FEBABEBAFABEBABABEBEBEBABAFABAFEFABABABABEBABABEBAFEFABABAFEBEBEBABEB EBABABABABEBAFAFAFEFABAFEBABABABAFAFEBAFABEFABABABEBEFCBABABABABABABA BABA$18BD2BF2BF2B2F2BF5BF2BF3BF2BF3BF9BFB3F2BF14BF2B2F2BFBFBFBF5BF3BF BF6BFBFBF4BF4BF2BF7BFBF7BF8BF3BFB2F5BF4B2F2B3F6BFB2FBF4B3F4BF2B2F14BF 4B4FBF2B3F5BFBF3B2FBF4B2F3BF4BF13B2F3BF4BFBFBF2BF5B2F2BF5BF3BF6BF2BF 3B2FBF5BF4BFD18B$BABABABABABABABABADAFABABABEFABAFABEFABABAFABABABAFA BABEFEBEBABEBABEBEBAFEBEBABEBABEBAFABAFABABABEBABABABABEFABEBABEFEBAB ABEFAFAFABAFABEFABABEBABABABABABABEFAFAFABAFABEFEBABABABEBEBABABAFAFA BEBAFABABABABABAFABABABEBAFAFABABEBEFABAFABABEFEBABABABABAFABEBEBAFAB AFEBABABABAFABABAFABEFEBABEBABEFEBABAFABEBEBABABABEBEFABABEBAFABAFEBA BAFEBAFEFABABEBABABABABCBABABABABABABABABA$18BD3BFB2F6B4FB2F4B2F2B2F 9BF2BFB2F6B3F7BFBF4B2F4BF12BFBF10B4F7BF8BF4BFBF5BF2BF2BFB2F4BF3B2F2BF 6BF9BF9BF2BF3B2F2BFB2F2B2F2BF7BF5B2F2BFB4F6BF2BFBF6BF2B2FBF4BF2BFBF3B F8BF2B2F3BFB3FB3F14B2FBF2BF3B2F3B2FBFBFBF3BD18B$BABABABABABABABABADAF AFAFAFABABABAFEBEBAFABABABEFABABAFAFAFABAFAFEBABABEBABABABAFAFAFABAFA BAFAFEFABABAFEBABAFABABABEFABEFABABABABABABEFABEBEBEBABABAFEBABAFEBAB ABABAFEBEBAFEBABABAFABABABABABEBAFABABEBAFABEFABAFAFEFABABEBABABABABA BABEBABAFEFABABABABEBABEFEBABABEBEFAFABAFAFAFABABABABABEBABABABEBAFAF EFAFABEBABABABABABABABABABEBEFEFABABABAFABABEBAFABABABCBABABABABABABA BABA$18BD12B3FBFBF4BF3B2FBF2B2FBF5BFBF3BF5B2F2BF4B2FBFB2F7BF12BF5BF7B F8BF3BF6B2F5BFBF2BFBF2BFB2F2BF2BF3BF2BFBF2BF2BF11BFBF2BFBF3BF2BF4BF3B F2B4FBF4BFBFBF9BFBF2B4F7B2F2BF11BFBF4BF5BF2BF4BF5B2F10BF6BFBF3BF2BF4B 2F2B3FB2F2BFD18B$BABABABABABABABABADABABABAFABABAFAFABAFEBEBABAFABABA BAFABABAFAFAFABABEBABEFABABABABEBABABAFAFABAFAFABEFABABABABEBABABABEB AFAFAFABABABABAFABABEBABEBABAFAFEBABABAFABABABEBABAFAFABABABABABAFABE BABEBEBEBABABAFEBAFABABABABABABEBABAFAFEBABABABABABEFABAFAFABEFABABEB EFABABABABABAFEBEBABEBAFABABEFEFEFABABABABABABABEBABABABEFABABAFABAFA BABABEBEFABAFABAFABAFAFCBABABABABABABABABA$18BD7B2F7B3FBFBF6BFBF2B3FB F3BFB2F2BF3BF3BF4BF2B4FBF7BFBF2BFB3FBF4BF3B2F2BF6BF2BF8B2FB3F5BFBFBF 3BF2BF2BFBF6BFBF2BF6B3F3BF3B2F3B2F3BF5B4F4B2F2BF4B4FB2F3BF4BFBFB2F2BF BF2B3F6BF3BF4BF4B2F7B2F4BFBF2B2F4BF2BFBFBFBF2BF2BFBFBF2B2FB2F5BF5BF3B FBFBD18B$BABABABABABABABABADABABABAFABAFEBABABAFABEBEBABEFEBABABAFEBE BABABABABABABEBABAFAFABEBABABAFEBABAFABABABABAFABEFABABABAFABEFABABAB EBAFABABEBABABABABEFEFAFAFABABAFABEBAFABABABABEBEBEBABABABABEBAFEBABA BEBABABAFEBAFAFAFEBABABEBABABABABABABABEBAFEBEBABEBABEFEBAFEFABAFABAB AFAFEFEFABAFABABABEBABEBAFAFABABABEBEFABAFEBEBAFABAFAFABAFEBABABABABA BAFEBEBABABEBABCBABABABABABABABABA$18BD3BFB2FB3F4BF4BFBFB4F4BF5B2F8BF BF4BF2BFBF2B2F2BF9B2F5BF3B4F2BFBFBF3BF5BF4BF2BF4BF13B2F5B2F2BF2B6F9BF BF3BFBFBF2B2FBF10BF8BF8BF2BF9BF13BF2BFBF3B5F2BF4BF7B2F5B2F4BFB3FB2F 11BFB3FBFBFBF3B4F4B2FBFBFBFB2F2BD18B$BABABABABABABABABADEBAFAFAFEBABA BEBABAFABABEBEBABEBAFABEBABAFABABABAFEBABABABABABAFABABABABEFAFEBABAB ABABABAFABAFABABAFABABABEFEBEFABABEBEBAFABABAFABABEBEBABAFABEBABABEBE FAFABEFABABEBABABAFABABEFABABABEBABABABAFAFABAFEBEFAFEBABAFABABABABAB ABAFABEBABABABABAFABABABEFABABABABAFABABEBABEBABAFABAFABABEBABEBABABA BAFEBABEBABAFABEBEFABEBAFEBABABAFABEBABABABCBABABABABABABABABA$18BDFB F6BF3B2FBF5B2FBFBF9BFB2FBFBF4BF3B3F12B2FBF2B2F3B3FBFBF3BF9B2F7B3F2BF 4BFB2F4BF4BF2BF3BFB2F10B2FBF2BF3BF3BF3BFBF8BF8BF2BF2B2F3BF5BF6BF5BFB 2F8BF5B2FB2F4BF2BF8BF6BF6BF6BF5BF3B2F6B2F3BFBF4BF2BFBF3BF2BF4BF3BFD 18B$BABABABABABABABABADEFAFABABABEBABABABABABABABEBABABAFAFEBABABEBAB ABABAFEBAFABABABEFABEBEBABABABABEBEBABABABABABABABEFABABABABAFABEBABE BAFABABABEBAFAFABABEFEBEBABABABAFABEBAFEBABEBABABEFAFABABAFABEBEBEFEF EBEBAFAFABABABAFEBAFEBEBABABABEBABABABABABAFEBAFABABEFABABABABEBABEBA BEFABEFABEBEBAFABABEBABEBABAFABAFABEBEBABEBABABABABEBEBABAFABABAFEFAB AFABEFAFAFCBABABABABABABABABA$18BD3BF2BF2B2F2BF6BF2BFB3F4BF3BF2BF6BFB FBF3B2F5BF2B2FBF3BFB3F5BF3B3F3BF9BFBF9B2F18BF3BF5BF4B2F2BF9B2FBFBF3BF 3BFBF7BF4B3F2B2F3BF2BF2B2F22B2F5B2F8B4F3BF3B2F12B2FBFBFBF2BF9BF2BF6BF B2F13BF4BF2BF2BFBD18B$BABABABABABABABABADEBABABABABABABABABABABABEBAB AFAFAFABEBAFAFEBABEBEBABABEBABEFEBEFABAFEFABABAFABABABAFEBABEFABABEFA BEFAFABABABABAFEBAFABABEBABABABABABABABABABABAFABABAFABABEBABABEBEBEB ABABAFABABAFAFEFEBAFEFEBABABEBEBEBEBEBEBEBEFABABABAFABAFABEBEBAFABAFE BABABABAFABABEBABEBEBABABABABABAFABAFEBEBABEFAFABABAFEFABEBABABAFABEB ABAFAFABABEBEBEBABAFABEFAFABCBABABABABABABABABA$18BD6B2F3BF2BFBFB2F2B FBF8B3F5BF6BF3B2F4BF5BF5BF7BF5BFBFBF4BF2B2F4BF3B3F12BF6BF2B2FBFBF6BF 2BF3BF14BF2B3FBF4B2F3BF3BF5B2F2B2F15BF3B2FBF4BF11B2F2BF2BF2B2F2B2F3B 2F2B2F5BF2BF4B3F6B2F3BF2BFBFBF5BF3BFBF4B2F5BF3B2FBFBF2BD18B$BABABABAB ABABABABADABEFABEBABABABEBEFABABEBEFAFABABEBABEBABABABAFEBAFABAFEBABA BAFABABAFEBABAFEBEBEBABEBABAFABABAFABABAFEBEFAFEBEBABABEBABEBABAFEBAB EBABABABEBAFAFABAFABEFABABEFABABABEFAFABABABABAFABEFABABEBABEFAFABABA BAFABEBEFABAFAFEFABAFEFEBEBEFAFAFEBABABABABABABABABABEBEFABAFABEBAFAB EBEBEBEFEFABABAFABAFEBAFABEFEBABEBAFEBABABABAFEBEBEFEFABAFEBEFEBEBCBA BABABABABABABABA$18BDFB2F5BF6B2F8B2F2B4FBF4BF2BF3BFBFB2F2B2FBF2BFBF8B FBF3BF2BF7BF2BFBF2BFBFBF2B2FB2F6BF2B2F7BF2B2FBF2B2FB4F8BF2BF2BF3BF6BF BF2BFB4F3B2F2BF4BFBF3B3FBFBF2B2F2B2FBFBF9B2F2B4F2B4FB2F3BF7BF5B2F3B2F 2BF9BF5BFBF2BF2BF2BF5BF5BF3BF6B2F2BFB2FB2FB2FD18B$BABABABABABABABABAD ABABABABAFEBABEBAFABAFAFAFABEBAFEBAFABABAFEBABEBABEBABABABAFEBAFEBAFE BABEBABABABEFABEFEFEBABABAFABABABAFEBEBABEFAFEBABEBABAFABABABABEBAFEB ABABAFABEBAFEBABAFEFABABABEBABEFAFABABABEBAFABABEBEBAFABABABAFABAFABA FABABAFABAFABEFAFEBEBABAFABEBABEBABAFABAFAFEBABABEBABABABABABEFEFABEB ABABABABABEBABABABEBABAFEBABEFAFAFABABEBABEBABABABABABABCBABABABABABA BABABA$18BD2F9BF3BF2BF8BF7BF3BF11BFB2FBFBF4BF3BF5BF2BF2BF5BF5B2F3B2FB F3BF3BFBFB2F11BF6B2F6BF2B3F2B2F6BFBF4BFBFB3F3BF2BF2B3F14BFB2FBFBF2BFB F8BFBF3B2F2BF2BF5BFBF2B3F5B3FBF3BF2BF4B2FB2F6BF2B2F10BF2BFBF6BF5B5F4B 2FBF3BF5BFBD18B$BABABABABABABABABADABABABABABAFEFEBAFABABEBEBAFEBAFAB ABABAFEFABEBABABABEBABABEFAFEBEBEBABAFEBEBABABAFEBAFABEBABEBABABEFABE FABABABEBEFEBABAFEBEBABABAFAFEBABABAFABABAFEFAFABAFAFABABABABAFABABEB ABABAFAFAFAFAFAFABEBEFABAFEBAFABABEBEBABABABABAFEBEBABABABABABAFABEBE BABEBABABABEBABABAFABABABEFEFEFABABABEBAFAFEBAFABAFABABEBAFABABEBEFEB EBEBAFABAFABEBABEBABEFCBABABABABABABABABA$18BD12BF2B2F10BF2BF7BF5BFBF 2B2FBF3BF3BF8BF4BF2B4FB2F2BF4BF2BF7BF7BFBF2B2F3BFB3F12BFB2F3BF4BF4BF 5BF2B2F7B3F3BFBF2B2F8BF2BF2B3F9BF4B2FBFBF4BF4BFBFBF3BF14BF2BF2BF3BFB 3F9BFBF3B3F5BF4BFBFBFBF5BF2B2F3BFBF6B2F2BFBD18B$BABABABABABABABABADAF ABEBEBABAFABEBABABEFABABABABEFABAFAFEBEBABABEBEBEBAFAFABAFABABAFEBAFA BEBAFABABEBAFABEBABEBEBAFEBABABABABAFEFAFABEFABAFABABEBABEBABEBEFABAB ABABAFEBABABABABEFABAFAFABABABEBEFABABABEBABABAFABAFABABEBABAFAFAFABA BABABEBABABABEBABAFABABEFEBABEBABEBABABAFAFABABEFEBABAFABEBABABEBABAB EBAFABABEFABEBEBEBAFABABAFABAFABABABEBABEBABAFABEFABABCBABABABABABABA BABA$18BDF3BFBF7B2F9B2F7BF2BF2BF2BF8B2F6BFBF6BF2B2F2B2F10B2F13BF2B2F 2BF2BFBFBF14BF9BF2BF7BF2B3F6B2F2BF12BF7BF5BFBF3BFBF2BF3B3FBF4B2F4BF4B F3BF13B2FB2F3B3F2BF2B3FBF4BF2BF3B3F2B2F7BF4BF2B3FBF9BF3BF4BF5BD18B$BA BABABABABABABABADEBABABEFABABABABAFAFEBABAFABAFABAFAFABABEBABEBABEBEB EBAFABABABEBEBAFEBABABABAFEBEFEBAFAFABABABABABABEFEBABABEBABABABEBABA BEBABABEFAFEBABAFABAFABABABEFEBEBABABEBABABAFEFABEFEFABAFEBAFABEBABAB ABEBEFABABABAFABEBEBABEBEBABEFABABEFEFABEBAFABABABABABEFAFEBAFEBEBAFE BABEFABAFABABABAFAFEBABEBEFABAFEBABAFABEFEFABEFAFABABABABEFEBABAFAFAB ABEBCBABABABABABABABABA$18BDBF4BF2B2F3B6FBF3B3F5BF2BFBF13B2FBFB2FBF5B 2F2BF5BFBFBFBF3BF5BFBF2BF3BF3B2F2BF14BF4BFBF2B2F3BF2B3F2BFB2FBF4B2F4B 3F13BFBFBFBF3BF7BF2BFB2FB5FBF4BF11BF3BFBFBF8BF3BF2BF2BF2BFBF9BF2BF2BF 13B2F2B2F2BF9BF2BF9BF3B2F5BD18B$BABABABABABABABABADABABABABABABEBEBAB EBABEFABEBAFABEBAFEFEBABABABAFAFEBAFAFAFAFABEBAFAFAFEBABEBEFABEBABABA BABABAFABEBABEFEBEBEFABABEBABEBEBABABABABAFAFABABABEFABABABEBABAFEBAB ABABAFABABAFAFABABABAFABABAFABAFAFAFEBABEBABAFEBABAFABABEBEBEBABABAFE BABEFEBABABEFABABABAFAFEFEFEFABABEFABABAFABABABABEFABABEBEBABABEBABAB AFAFABABEBAFEBABABABEFABEBEFABABEBABABCBABABABABABABABABA$18BDFB2F7BF 3B3F4BF5BF10BFBF2BF2BF9BFBF6B2F2B2F3BF14BF3B2FB2FB3FBF3BF2BF6BF2BF3BF 3BFBFB2F5BF7B2F5B2F2BF2BF2BF3B2F6BF6B2F3B2F5BF2BF3B2F6BFB2FB3F10B2F2B 3F2BF2BFB2F8B2F7BF4BF3BF10B2FB3FBF3BF2BF2B2F7BF3BFBFB3F4B2F4BF2BD18B$ BABABABABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCBABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA! golly-3.3-src/Patterns/Margolus/TMGas.rle0000644000175000017500000001003212026730263015260 00000000000000#CXRLE Pos=-18,-14 Gen=0 # Toffoli-Margolus gas, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # original Margolus states: # # 0 : background # # 1 : wall # # 2 : gas particle in an even step of the simulation # # 3 : gas particle in an odd step of the simulation # # neighborhood:Margolus # n_states:4 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,2 : 0,0,3,0 # even step: rotate clockwise # 0,0,0,3 : 0,2,0,0 # odd step: rotate anti-clockwise # 0,0,1,2 : 0,0,1,3 # contains a wall: no movement # 0,0,1,3 : 0,0,1,2 # contains a wall: no movement # 0,0,2,1 : 0,0,3,1 # contains a wall: no movement # 0,0,2,2 : 3,0,3,0 # even step: rotate clockwise # 0,0,3,1 : 0,0,2,1 # contains a wall: no movement # 0,0,3,3 : 0,2,0,2 # odd step: rotate anti-clockwise # 0,1,1,2 : 0,1,1,3 # contains a wall: no movement # 0,1,1,3 : 0,1,1,2 # contains a wall: no movement # 0,1,2,0 : 0,1,3,0 # contains a wall: no movement # 0,1,2,1 : 0,1,3,1 # contains a wall: no movement # 0,1,2,2 : 0,1,3,3 # contains a wall: no movement # 0,1,3,0 : 0,1,2,0 # contains a wall: no movement # 0,1,3,1 : 0,1,2,1 # contains a wall: no movement # 0,1,3,3 : 0,1,2,2 # contains a wall: no movement # 0,2,1,1 : 0,3,1,1 # contains a wall: no movement # 0,2,1,2 : 0,3,1,3 # contains a wall: no movement # 0,2,2,0 : 0,3,3,0 # two or four particles collide: no movement # 0,2,2,1 : 0,3,3,1 # contains a wall: no movement # 0,2,2,2 : 3,0,3,3 # even step: rotate clockwise # 0,3,1,1 : 0,2,1,1 # contains a wall: no movement # 0,3,1,3 : 0,2,1,2 # contains a wall: no movement # 0,3,3,0 : 0,2,2,0 # two or four particles collide: no movement # 0,3,3,1 : 0,2,2,1 # contains a wall: no movement # 0,3,3,3 : 2,2,0,2 # odd step: rotate anti-clockwise # 1,1,1,2 : 1,1,1,3 # contains a wall: no movement # 1,1,1,3 : 1,1,1,2 # contains a wall: no movement # 1,1,2,2 : 1,1,3,3 # contains a wall: no movement # 1,1,3,3 : 1,1,2,2 # contains a wall: no movement # 1,2,2,1 : 1,3,3,1 # contains a wall: no movement # 1,2,2,2 : 1,3,3,3 # contains a wall: no movement # 1,3,3,1 : 1,2,2,1 # contains a wall: no movement # 1,3,3,3 : 1,2,2,2 # contains a wall: no movement # 2,2,2,2 : 3,3,3,3 # two or four particles collide: no movement # 3,3,3,3 : 2,2,2,2 # two or four particles collide: no movement # x = 40, y = 38, rule = TMGasMargolus_emulated 40B$BABABABABABABABABABABABABABABABABABABABA$40B$BABABCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABA BA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABABA$5BD28BD5B$BABAB CBABABABABABABABABABABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABAB ABABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABABA$ 5BD6BF3B2F3B3F10BD5B$BABABCBABABABEBABABEBEBEBABABABABADABABA$5BD5B2F BF2B2F2BF12BD5B$BABABCBABAFAFEFABAFEFABABABABABABADABABA$5BD4B2FBF2BF 2BF3BF10BD5B$BABABCBABABABEBEFEBABEBEBABABABABADABABA$5BD3BF4BFB3F4BF 10BD5B$BABABCBABABEFEBABABABAFABABABABABADABABA$5BD3BFB2F5BFB2F12BD5B $BABABCBABEBAFABEBABEBEBEBABABABABADABABA$5BD7BF2BF5BF11BD5B$BABABCBA BEBEBABABABABEFABABABABABADABABA$5BD5BFB2F4B2F13BD5B$BABABCBABABABABA FABABABEBABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABA DABABA$5BD28BD5B$BABABCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDABABA$40B$BABABAB ABABABABABABABABABABABABABABABABA$40B$BABABABABABABABABABABABABABABAB ABABABABA$40B$BABABABABABABABABABABABABABABABABABABABA! golly-3.3-src/Patterns/Margolus/DLA.rle0000644000175000017500000015337412026730263014726 00000000000000#CXRLE Pos=1,0 # Diffusion Limited Aggregation # # Particles move around at random until they encounter a stuck particle, # when they themselves become stuck. A familiar fractal growth pattern # emerges, as seen in many natural processes. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1 and 2. Next select-all # and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # Diffusion Limited Aggregation, in a Margolus neighborhood CA # # n_states:3 # neighborhood:Margolus # symmetries:rotate4reflect # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # # 0: vacuum # # 1: gas particle # # 2: stuck particle # # # random gas-like rules: # 1,0,0,0 : 0,0,0,1 # a diagonally-travelling particle keeps going # 1,1,0,0 : 1,1,0,0 # two particles collide # 0,1,1,0 : 1,0,0,1 # two particles collide head-on # 1,1,1,0 : 1,1,0,1 # three particles pass through each other # # # plus aggregation rules: (these seem to suffice) # 1,0,2,0 : 2,0,2,0 # 1,0,2,2 : 2,0,2,2 # x = 313, y = 236, rule = DLA-Margolus-emulated D4BD15BD2BD2BD3B2D9BD5BD2BD2B4D3BD3BD16B2D12BD12BD4BD11BD24BD28BD2BD 2B2D12BD8BD9BD5BD4B2D3BD3B2DBD6B2D2B3D2BD2BDBD4BDBD6BD15BD4BD2BD3BD7B $ABCBABABABABABABABABABABABABABCBABABCBABABABABABABABABABABABABABABAB ABADABABADABABABABABABABABABCBCBABCBABABABABABABABCBABABABCBADABCBADA BADCBABABABABABABABABADADABADADABABADABABABABCBABABABADABABADABABABAB ABABABABABABABABABADABABCBABABABABABABABABCDABABABABABADABADABABABABC BADABABABABABABABABABABABABABCBCBABCBA$7B2D3BD11BDB2D5B2D9BD14B2D5BDB D10BD11BD5BD3B2D3BD3B2D3BD3BD3BD5BD13BD7B2DBD3BDB2D3BD21BD9BDBD2BD4BD 2BD7BD5BD2BD11B2DBD9BD3B2D3BD12B2DB2D12BD2BD18B$ABABADABABCBABADCBCBC BADABCBABADABCBABABABABABABCBABABADABABABABADABABABABABABABABABABABAB ABABABABABABCBABABABABCBADABADABADADABABABCDABABCBABCBABADADABABABABA BABABABABADCBABABABADABABABADABABABABABABABABABABABABABABADADABABABAD ABABADABABABADABADABABABABABABADABABABCDABABABCBABABADABABCBABABADCDA BABABABADABABABA$8BD7BD8BD5BD9BDBD22B4D2BD3BD5BDBD23BDB3D2BD6BD7BD4BD 2BD2BD27BD12BD18BD3BD5BD4BD5BD4BD9BD4BD21BD24BD3BDBD4BDBD3BD3BD2B$ABA BABCBABABABABABABCDABABABADABABABCBABABABABCBADABABABCBABCBABABABCBAB ABABABABABCBABABABABABABABABABADADABADABABABABABABABABABCBABABADADCBA DABABCBABABABABABABABABABABABABABABABABCBADABABABCDABABCBADABABCBABAB ABABABCBCDABABABABADABABABABABABABABCBABADABABABABADABABABADABABABABA BCBCBABADABABABABABABADABABABADABA$BD3BD5BDBDBD2BD2B2D3B2D5BD7B2D9BD 6BD13BD3B2D9B4D4B2D24B2D11BD8BD4BD2BD2BD7BD6BDBD2BD10BDBD8BD35BD8BD2B 2D6BD7BDBD3BD5BD5BD9BD3BD4BDB3D3BDB2D3B$ADABABABABABABABABABCBABABABA BABCDABABADABABABABABABABCBABABCBADABABABABABABABABABABCBABABCBADABAD ADABABABABABADABABABABADABABABABABABADCBADABABABABABABCBABABADCBABADA BADCBABABABCBCBABABABABCBABABABABABABABABCDABABCBABADCBABADABABABCBCB ABABABCBABABADADADABABABABCBABABADABABABCBADABABADABABABABABABABABABA BABABABA$3BD9BD5BD6B2D18BD8BD11BD10BD18B2D17BD2BDB2D8BD18BD11BD5BD3BD 2BD6BDBD5B2D4BD6BD3BD5BD13BD8BD8B2DBD4BDBD10B3D4BD9BD4BD3B3D5BD3BD8B$ ABABCBABCBABABABABABADABABABABABABCBCDABADABABADABADADABABADABABABABA BABABABABABABADABCBABABABABABABABCBABABCBABADABABABABABABABABABCBABAB ABADABABABADABABABABADABCBABABABCBCDABABABABCBABABABABABABCBABABABADA BABABCBABADABABABCBABABABABABADABABABADABABABABCBCBADABABABADABCBABAB CBABABABABABADADABABABABABABABABADABA$4BD25BD6BD15BD13BD5BD2B2D3B2DBD 17B2D7BD2BDB2D20BD12BD2BD5B2D12BD9BD4BD25BD13BD11B4D6BD2BD15BD13BD12B D4BDBD8B$ABABABABABABADABABADABABABABCBABADABABADABADABADABABABABABAB ABADCBABABABADABADADABABABABABABABABABABABABABABABCDABABABABABCBABABA BABABABABABCBABABABABADABABCBCBABABADABABABABABABABABCBABABABCBABABAB ADABADADABADCBABABCBABABABABABABABABABABABABABABABADABABABABABABABABA BADABABABABABABADABABABADABABABABABABABABABABA$D4B2D4BD24BD6BD4BD8BD 8BD15BDB2DB3D4BD32B2D7BD2BD3B2D10BD17BD12BD2BD3BD4BD15BD4BD8BD3BDBDB 2D2BDBD5BDBD2BD2B3D3B3D3B2D4BD3BD10BD21BDB$ABABABABABABABABABADADADAB ABABABABCBABABABABABABABABABABABADABCBABABABABADABABCBABABCBABADABADA BADCBABABADABADABABCDABABABABABABCBABCDABABABABCDABABABABABADCDABADAD CBABABABABABABABABABABADABABADABABADADADABABABCBABABABABCDABABABCBCBA BABABCBADABABABABABABABABCDABADABABABABCBABABABABABABABABCBABABCDABCB ABCBADABABA$2BD8BD2BD20BD18BD10BD9BD2BD2BD7BD9BD14BD2BD8BD2BD5BD3BD5B D18BD3BD6BD28BD29BD2BDB2D13BD8BD7BD4BDBD20BDBD8BD2B$ABADCBABABCBABABA DABABABADABABABCBCBABABABABADABABABABABABABABADCBABABCBABABCBABCBADAB ABCBABABABABABABABADCBABABABCBCBADABABABABABABABABABABABABABABABADABA BABABABADADCDABABABCBABABCBADABABABABABADABABABCBADADADABABABABABABAB ADABABADCBABABABABABABABABABABABADABCBCBABABABABCBABABABABABABABCBABA BABABADABABABCBADABA$BD2BD2BD8BD5BD11BD3B2D16BD6BD4BD3BDBD3BD3BD2BD7B D2B2D2BD3BD24BDBD12BD14BD11B2D2BDBD4BD13BDBD6BD5BD12B2D3BDBDBD3B2DBD 6BD5BD4B2D3BD25B2D9BD6BD5B$ABABABABABABADABABABCDABCBABABCDABCBABADCB ABABABABABABABABABABCBABABABADABADCDADABABADABCBABCBCBCBADABABABABABA BCBABABADABABADCBABABCBABADABABABABABABABABCBABABCBABADABABABABABABCB ABABABABABABCBABABABCBABABABADABABADCBCBABCBCBABABABABCDABABABABABCBA BABABABABABABABABABABABABABABABADABADABABABABCBABABCBCDABCBABADA$9B2D 5BD5B4D7B2DBD22BD5BD14BD11B2D12BD4BD24BD5BD5BD2BD9BD4BD9BD11BD12BD2BD 12BD3BD2BD12BD2BD2BD2B3DBD2BDBD8BD8BDBDBD5BD10B2DB2D4B2DBD2BD2BD$ABAD ABADCBABCBABABABABABADABABABABABCBABABABABABADABABABCBABABCBADABABCBA BABABABABABABCBABCBABABABABABABCBABABADABABCDABCBABABADABABADABABABAB ABABABABABABABADABABABABADADABADADCBABABABABCBABABABADABABADABABCBCBA BABABADABABABABABABABADADABABCBABABABABCBABABABABABABADCBABABABCBADAD ABABABADABABABADABABCBABABABABABA$9BD5B2DBD13BDBD5BD3BD5BD39BD9BD8BD 13BD2BD3BD8BD6B2D12B2D2B2D10BDB2D3BD13BD6BDBD3BD21BD9B2D6BD11BD16BD2B D3BD8BD11BD3BDB$ADABADABABABADABABABCBADABABABABABABABABABABABABABABA BADABABABCBADABABABABABABABADCBCBABABABCBCBABABABABABABABABABABABABCB ADABABCBABCBABABADABABABADABCBABABABABABABABABADCBABABABABABABCBABABA BCBABABABABABABABCBABABABABCBABABABCDABABABADABABADCBABABCBADABABABAB ABABABABABABABABABADABABABADABABCBADABADABABABABADABA$4BD6BD4BD5BDB2D 3BD2BD3BDBDBD5BD3BDB2D8BD2BD3BD8BDB3D11BD42BD7BD8B2D4BD3B2D12BD4BD2BD 2BD2BD3BD7BD6BD2BD17B3D18B2D6BD14B2D2BD3BD11BD4BD9BDB$ABABABABADABABA BABABCDCBABADABABABABABABABABABCBCBABCBCDADABABABABABABCBABABADADCBAB ABCDADABABABADABABADABABABADABADABADADABABABADABADABABCBADADABCBABABA DABABADABCBABABABABABCBABABABABABABCBABADABABABABABABABABABADABCBABAB ABABABADABABABABABABABABABABCBABADABABABABABADABABADADABABABABABABADA BCBABABABABABABABCBABA$BD5BD6BD11B2D6BD3B2D4BD2BDBD2BD4BD6BDBD4BD3B2D BDBD4BDBD3B2DB3D8B2D17BDBD41BDBD8BD4BDBD13BD16BD2BDBDBD2BD5BD5BD3BD8B 3D2BD17BD17BD5BD7BDBD3B$ADABABABADCBABADABABABABABABABABABABCBABABCDC BABABABABADABABABCBABABABABABABADABABADABABABCDADABABADABABABABABADAB ABADABABABABABABABABABABADABCBADABCBABABABABABABABABABCDABABABABABABA DABABABABABABABABABABABABABADADCBABABABABABABABABABABCBADABABCBCBABAB ABABABABABCBABABABABABABCDABCBABABABABABCBABABABABABABCBABCBA$8BD3BD 3BD2BD2BD4BD2BD4BDBD5BD5BD2B2DB2D10BDB2D2BDBD6BD9BD11BDBD6BDB2DBD11BD 2BD3BD3BD10BD14BD3B2D13BD3BD3BD4BD13BD6BD5BD5BD2BD13BD3BD11B2D15BD4BD 3BD2BD4BD4BD4BD3B$ABABABABABABABABABABABABABCBABABABABCDABCBCBABABABA BABABABABABABADABABABABABADABABABABABABCBCBABABABABCBABABABABCBCBADAB ABABABABCBABABADCBADABABABADADABCBABABADABADABABABABABABABABABABABABA BCBABABABABABABABABCBCBADABADCBABABABABABADABABADABABCBABCBABABABABAB ABABCBABADCDABABABABABABABABABABABADABABABABABABABABABA$D3BD7BD11BD7B D2BD5BD12BD5BDBD19BD2BDBDBD5BD4BD2BD21BD10BDB2D5BD3BDBD2B3D12BD16BD 15BD16B3D12BD6B2D5BDBD3BD20BD4BD19BD3BDB2D5B$ABABABCBABABABCBABCBABAB ABABABABABCBABABABABADABADABCBABABABABCBABABCBABABCBABABADCBABADABADA BCBABABABABADABABABABABABABCBADADABCBADCBABCBABCBABABABABABABABABABAB ABABABABADCBADCDABABABABABCBABADADADABABABABABABCBCBABABABABABABABABC BADABABABABABABABABABABABABABABCBABCBABABCBABABABABADABABABABABABABCB ADABABABABABA$11B2D6BD14BD9B2D9B2D4BD12BD5BD3BD9BDBD4BD19BD2BD3BD11BD 2BD4BD10BD2BD4BD2BD21BD14BD5BD21BDBD6BD5BD5BD12BD4BD2BD2BD6BD5BDBDBDB D13B$CBABABABCBABABABCBABCBABABCBABABADABABABABABABABCBADABABABCBABAB ABABADABABABABABABADABABABABABABCBCBABABADCBABABABABADABABABABABABABA DABCBADABABADABADABCBCBCBABADCBABABABADABABABABABABCBABABABABABABADAB ABABABABABADABCBABABABADABABABABABABABABABABCBABABADCBABABABABABABABC BADABABABABABABCBADABABABABCBABCBABABABABA$2BD13BD20BD5BDB2D4BDBD2BD 3BD7BD7BD2B2D2BD2BD5B2D5BD8B2D2BD13BD8BDB2D2BD4BDBD2BD4BD3BD16BD4BDB 2D6BD5BD2B2D2B3D8BD3BD4BD5BDBD7BD7BD19B2D4BDBD7BD5BD2BD18B$ABABABADAB ADABADABABABABCBABABABABABABABCBABABABADABABCDADADCBABABADABABABABABA BADADABABADABABABCBCDADABABABABCBABCBABABABCBABABABABABABABABABABCBAB ADABABABABADCBABABABABABADABABCBABABABABABABABABABABABADADABABABCBABA BABABABABABABABABABABABABABABABABABABABABABABCBABABABABABABABABABABAB ABABADABCDABABCBABABABABABA$D10BD6BD5BDBD18BD3BD5BD11BD20BDBD2BD8B2D 2BD3BD6BD2BDBDBD3BDB5D2BD3BD3BD5BDB2DBD5BD18BD8BD2B2D24BD6BD4B2D13BD 12BD6BD14BD17BD4BD6BDB$ABABABABADABADABABABABADABABABABABABABCBCBABCB ABABCBABABCBABADABCBABCBADABCBABABADABCBABABABABABABABADADABABADCBABA BABABABCBADABCBABABCBABADABABADADABABABADABABADABABABABADCBABABADABAB ABABABCBCBABABADABABABABABABABABABABADADADADABADCBABCBABABADABABABCBA DABABABABABABABABABABABABABCBABABADABABABABADABABABABABCBADA$BD8BD11B DBD28BD2B2DBDBD10B2D11BD25B2D3BD6BD3BD6BD8BD5BD3BD3BD2BD10BDBD4B3D6BD 12BD3BD4B2D8BD15B3D3BD13BD9BDBD2BD3BD7BDB2D9BD4BDBD10B$CBABABADABCBAB ABCBABABADABABCBABABCBCBABABADABABABABABADCBABABCBABADABCBCBABABADABA BABABABABCBABABCDABCBABADABABABABADABADCBCBCDCBABABABABABADABCBABABAB ABABABCBCBABADABABCBABCBABADABABCBCBADADCDADABABABABABABABABABABABABA BCBADABABABADABABADABCDABABCBABABADCBABCBABABABCBABCBABABADADABCBADAB ABADABCBABABCBADABABABA$5BD3BD3BD4B2D4BD4BD2BD2BD2BD4BD15BD2BD2BD6B3D 4BD3BD3BD8BDBD9BD2BD7BD5BD11BD8BD12BD4BD6BD10BD24BD4BD2BD6BD3BD2BD5B 3D4BD3BD3BDBD3BD2BD3BD5BD4BD19BD7BD7BD2B$CBADABCBABABABCBABCDABABABAD ABABCDABABABABABABABABCDABCBABABABABABABABABABCBABADABABABABABABCBABA BABABABABABABABADABABABABABCBABABABABABADABCDADCBABABABABABCBABADABAB CDABABABABABABABABABADABABCBCDABABABCBABABCBABABABABABABABABABABABADA BABABABABCBABCBABABABABADABABCBABABABABADCBCBADADABCBABCBADABABCBABAB ABABADADA$2BD7BD3BD11BDB3D3BD10BD8BD15BD2BD4BD8BD4BD6BD12BD3BDBD2B2D 18BD13BD13BD12B2D4B2D6BD4BD29BD4BD7BD4BD4BD3BD13BD20BD4BD7BD6B$ABADAB ABCBABABABABABABABABABABABABABCBCDABABABABCBABABABABABABABABABADABABA DABCBABABADCBCBABABCBCBABCBABADABADABABABABABABABABABCBABADABABADABCB CBABADABABABCBABABABABCBABABABABABABABABABABCBABABABABABABABABABABABA BABABADABABABABABABABABABABABABABCBADABABABABABCBABABABABABADABABABAB ABCBABABADCBABABABABABCBABABABC$7B3D2BD10BD30BD5B2D9BDB2D5B2D7BDBD9BD 52BD3BD9BDBDBD29BD2BD2BDBD3BD13BDB2DBD8BD4BD14BD5BD9BDBD3BD20BDBD3B2D $ABABABCBABABABCBABABCBABABABADABCBADABADABABABABADABABABABABADABABAD ABABABADABABABCBABABCBABABABABADABABABABABABABABADCDADABABABADCBADADA BABABADABABABABABADABABABCBABABABADCDABABCBADABABABABABABABCBABABABAB ABABADCBABABADABABABABABABABABABABCBABABABABADABABABCBABCBABABABABABA BCBADADABABABABABABABABCDCBCBABABABABC$2D4BDBD4BD11B2D2BD15BDB2D4BD2B 2D2BD10BD11BD2BD4BDBD2B3D3BD2B2D11BD23BDB2D7BD8B3D16BD3BD3B2D6B2D2BDB D11BD2BD9BDB2D8B2D2BDBD15BD13BD6BD20BD2BDBD3B$CDABABADCDABABABADABABA BABABABABADABABABABABADABABABABABABABABABABCBABABADABABABABABABABABCB ABABABABABCBABABCBABABABABABCBABABABABADABABABABABADABABABABCBABABABA BABABABABABADABABABABABABCBADCDABABABABABABABABABABABCDABABABABCBABAB ABCBCBABABABABABADABABCBCBADABABABABABABCDCDADABABABABABABABABABABABA BCBABABABABABA$D4BD2B2D12BD2BDBD4BD7BD2BD3BD5BD11BD5BD16BD2BD2BD11BDB D5BD12BD19BD6BD6BD5BD7B2D2BD14B2D3BD6B2D13BD4BD3BDBD6BDBD11BD10BD2BD 8BDBD10BD9BD2B2D4BDB2DB$ADABABABCBABCBABADCBCBABABABADABABADADADABABA DABADABADABABABADADABABABCBCBABABABADABABABABCBABABABCDABABABABCBABCB ABABABABABCBABABCBADABCBABABABABABABABABABABABABABCDABABABCBCBABADADA DCBABABABABABABABABABABABABABABCDABABABABABABABABADABABABABABABABABAB ABABABABADABABABABABABCBABABADABADADCBCDABABADADCDCDABCDCBABA$7B2D2BD BD4BD14BD7BD11BD2BD3BD10BD8BD13BD6B3D26BD4BD3B2D8BDBD19BD6BD8BD4BD2BD 2BD13BD24B2D8BD20BD4BD2BD9B2D5BD4B2D4BD8B$ABABABABABADABABABABABADADA BABABABABABABABABABCBABABADABABCDABCBABABABABABABABCBABABABADABABABCD ABADABCBCBABABABABADCBABABABABABABABCBCBADCDABADABCBABABABABADABABCBA BABABABABABABABCBABABABABADADABABCBABABABABABABABABABABABCBABABABABCB ABCBADABABABADABABABCBABABABADABCBABABABABABABABABABABABABABABABADABA BCDABABABA$2D8BD2BD4BDBD7BD21BD10BD2BD4BD11BD3BD6B2D2B3D4BDBD6BD5BD9B D6BD5BD4BDBD2BD2BD11B2D9BD4BDBD9BD6BD2BD2BD2BDBD11BDB2D10BD3BD7BD2BD 16BD4BD2BD34B$ADABABCBCBCBABABABABABABABABABABADCBADABABABADABABABABA BABCDABABABABABABADABABCBADABADABABABABABABABABADABABADABABABADABCBAB ABABABABABABABABABADABADADABCBABABABCBCBABABABADABABABABABABABABABCBC BABABABABADABABCDABABABCBADCBABABABABCBABABABADADABABABABABABABABABAB ABABABABABCDABADABABABABABABABABABABABABABABADCBABC$4BDBDBD7BD7BD2BD 4BDBD9B4D5B2D9BD5B3DBD2BD9BD26BDB2D8BD8BD5B2D2BDB2D11BD2BD16BD9BD5BD 37BD3BD2B2D9BD3BD11BDB2D4BD12BD3BD5BD2BD10B$ABABABABCDABABADCBABCBCBA BABABABABABABABABADABABCDABABABABABCBCBABABABABCBABABABABABABABABABAB ABCBABABABABCBABABCBABABCBABABCBADCBADADABABABABADABABABABADABABABABA BADADCBABABABABABABADADABADABCBABABABABABABCBABADABCBABABABABCBABABAB ABABABABADADABABABABCBADABADABABABCBABCBABCBABABABABABABABABCBABADABA BABABABCBABA$2B2D7BDBD4BDBDBDBD2BDBD10BD6BDBDBD2BD9BD14BD11BD3BD10BD 5BD11BD3BD19BD8BD9BD5BD10BD4BD8BD3BD2BD4BD4BD5BD5BD8BD16B2D19BD2BD8BD 2BD3BD7BDBD8BD$ABABABABABABABABABCBABCBCBADABABABCBABABCBABABADABABAB ABABABADABABABCBABABABABADABADABCBABABABABABABABCBABADABABCDABADABABA BABABABABABABABABABCBCBABCDABABABABABABABCBADABADADABABCBABABABABCBAB ABABABABABABADABABABABCBCBCBABABCBABABABADABABABABABADABCBABABABABABA BABABCDABADABABABABABABABABABABADABABABADABABABABADA$BD6BD9BD3BD11BD 9BD2BD14BD11BD10BD2BD10BD9BD6BD12BDBDBDBD11BD9BDBD5BD13BD5BD5BD5B3D 10BD6BDBD8BD17BD9BD2BD2BD19BD5BD2BD5BD5BD9B$CBABABABABABCBABABABADABA BABADABADABABABABABABABCDABABABABADABABABCBABADABABCBABABABABABABADAB ABABABCBABABABABADADABADCBABABABABABADABABCBCBCBABABABADADABABCBABABA BCBADADCBADCBABABABABABCBABABADABABABADABABABABABABABABABABABABCBABCB ABABABADADABABABABABCBABABCBADABABABABADABABCBABCDABABABABABABCBABCBA DABABCBABABC$5BD6BD14BD3BD11BD6BD4BD3BDBD3BD6BD2BD10BD2BD6BD14BD6BD6B 2D3BD7BD4BD4BDBD12BD4BDBD9BD16BDBD3BD5BD25BD3BD5BD2BD11BD2BD3BD11BDBD 3BD3BD16BD6B$ABCBABADCBABABABABABABADABABABABABABABABABABABADABABCBAB ABADCBABABCBABABADABABCDABABABADABCBABABCDABABABABABCDABABABABABABABC BADCBABCDABADABABABABABCBCBABADABCBABABADABABABADCBABCBCBADABCBABABCB ADABABADADABABABADABABABCBABABADABCBABABABABABABCBCBABABABABABABABABA DADABABCBABABABABABABABADABABABABCBABABABABADABABA$4B2D6BD18B2D3BD26B D5BD14BDBD3BD2BD7BD2BD6BD11BD7BDBD12BD9B2D3BD6B2D3BDB2D16BD2BD14B2D 24BD3BD3BD14B2DBD7BD7BD7BD2BD19BD2B$ABABABABABABCDABABABABABABABABCBC BABABABABCBADABABABABADCBABADABABCBABADABABCBABADCBABABABABABABABABAB ABABADADABABABADABABABCDABABABADABABABABABABABADABABABABABADABADABABA BABABCBABABABABABABADABABABCBABABABCBADCBCBABABABABCBABABABABCBCBABAB ABABABABABCBADABABABABABCBABABADCBABCBABABABCBCBADABABCBABCBCBABCBADA BCBC$6B2DB2D7BDBD8BD6B2D4BD3BD4BD7BD3B2DBD4BD12BD2BD7BDBD14B2D10B2D4B D6B2D5BD2B2D9BD5B2D6BD2BD3BD4BDB2D14B2D4BD17BD7BD4BD2BD11BD7BD2BD5BD 4BD12BD14BD2BD5B$ADABABABABABABABABABABABADABABABABABABABABADABABABAD CBABABABABABABABABABABCDABABCBCBADABABABABABABADCBADABABADABABABABCBA BABABABADCDCBADCBABABABABADABABCBCBABCDABCBABABABABABABABABCBABABCBAB ABCDABABABABABABADABCBCBADABABADABABABABABABABABABABABABCBABADABADABA BCBCBABABCBABABCBCBABABABABABABADABABABABADADADABCBABA$4BD3BD8B2D3BD 6B2D16BD15BD4BD6B2DBDB2D4B2D21BD6BD18BD9BD3BD2B2D5B3D6BD8BDB2D6BD5BD 5BD6BD5BDBD18BD4BD7BD7BD3BDBD4BD2BD10B2D6BD2BD5BD6BD9B$ABABABADABABAD ABABCBCBABABABABABABABABABCBABADABABABABADABADABABADABABABABABCBABABA BABABADCDABABABABADCBABABABABABADABABABABABABABCBABCDABABABABADABADAB ADABABABADABABADABADCBABABABABABABABCDABABADABABABABABABABABABCBCBADA BABABCBABABABABABABABADABABABCBABABABABABABABABCBABCBABABABABCBABABAB ABADCDABADABABABABABABA$12BDBD4BD4BDBD4BD2B3D2B2DBD8BDBD3BD6BD11BD8B 2D2BD10BDBD6BD7BDBD12BD21BD6BD5B2DBDBDBD2BD3BD2B2DBD11B2D4BD21B2D10BD 6BD4BD17BD17BD9B3D3BDB2D6B$CBCBABABABABABADABABABABADABABCBCBABABABAB ABABABABABABABCBCBADABABCBABABABABABABCBABADADADCBABCBADABABADABADABA BABABABCBABABABADADABABABADABABCBABCBABABABABCDABABCBABABABABABABABCB ABABABABABABABABABABABCBABABABABABABADABABABABABABADABCBABABABCBABABA DABABADADABABADABADABABCBABABABABABABABABABABABCBABABABABABABABA$2BD 2BD10BD3BD6BDBD6BD2BD6BD18BD5BDBD3BD21BDBD7BD2BD5BD10BD10BD10BD16BD 13BD8BD33BD2BD7BD5B2D5BD33BD6B2D2BD3BD2BD5BDBD3B$ABABABABABABCBABCBAD ADCBABABABABCDABABABABABABABABCBABABABABABCBABABABADABABABABABABABADA BABABABCBABADABABABABABABADADABABABABABABABABABABABCBABABABABABABABAB CDADABABABABABCBABABABCBABABABABABABADCBABABABCBADABABABCBABABABADABA BABCBABABABABABABCBABABABCBCBADADCBABADABABABABABABABABCBADABABABABAB ABABABABABADABABA$4BD8BD15BD27BD2B3D5BD29BD9BD14BD6BDBD3BD4BD12BDBD9B 2D3BD9BDBDBD8BD2BD6BD4BD10BD4B4D5BDBD16BD4BD3BD3BD2BD13BD2B2D17BD7B$A BCBABABABABABABABABABABABABADADADABABABABABABADADADABCBABABABABABABAB ADADABABABABABABABABCBABABABABABABABCBABCBABABABABABABABABABABCBABABA BABCBABCBABABABADCBABABABABABABADABABABABCBCBABABABADADCBABCBCBABABAB ADABABABABCBABABABCDABABCBABABCBADABABABABABCBABABCBCDABABABABCBCDABC BCBABABABADABABABABABADABABABABABADA$6BDBD6BD33BD3BD7BD10BD3BD3BD18BD 13B2D15BDBD3B2D5BD3BD3BD11B2D5B2D14BDBD9BD13BD6BDBD6BD6BDBD17BD9BD5BD 8BD3BD5B2D5BD8BD6B$ADADABABABADABABCBABABCBABABABABCBABCBABABABABABCB CBABABABABABABADABABABCBCBABABABABABABABABABABABABCBABABABCBABABABABA BCBABABABABABADABABCBABADCBABCBADABCBCDADABABADABABADABABADADABABABAB ABABABABADABCBADABABABABABABADABADABABABABABABABADABCBABABADABADCBABA BABABABADABABABCBADABABABABABCDABABABABADABABADABCBABABC$3BD4BD6B2D6B D13BD2B2D2B2D4BD4BD8BD25BD4BD6BD6BD13BD10BD3BD5BD2BDBDBD10BD7BD6BD15B D2BDBD2BD2BDBD8BD7B2D11BD3BD2BD3BDBD8BD13B2DBDBD8BD9BD6BD5B2D2B$ABABA BABADABADABABABADABABABABCDABCBABABCBABADABABABABABABABABABCBABABCBAB CBABABCBABABABABABADCBCDADABABABABCBABCDABABABABABADCBABCBADADABABABA BCDABABABADABABABADABABABADABABABABADABABABADCBABABCBABABABABABCBABAB ABADABABCDABADABCBABCBADABABABABABADABABABCBADABABABABCBABABABABABCBA BABCBADABCBABCBADABABABABABABABA$3BD2B2D2BD5B2D2BD46BD4BD2BDBD6BD10BD 14BDBD17BD4BDBD5BD4BDBD9BD5BD14BD2BD2BDBD3BDBD4BDBD15BD4BDBD22BD4BD5B D3BD4BD4BD3BD3BD12BD9BD8B$ABADABABADCBABABABCBCBABABADCBABABABABABABA BABABABADABABABADABABABADADCDABCBABABABABABABABADABCBADADABABABADABAB ADCBADCBABADABABABABCBABABCBADABCDADABABABADCBCDABABABADABABABABABADA BABABABCBABABADABABABCBADABABABABCBCBABABABCBABABABABABABABABABABABAB ADCBABABADCBADABABADADABABABABABADABADABABABCDADADABABADABABABA$2B2DB D2BD17BD19BD2BD8BD4BD4BDB2DB2D5BDBDBD3BD18B3D6B2D4BDBD10BD10BD2BDBD 24BD6BD9BD3BD19BD4BD9BD14BD6BD10BD3BD23BD2BD16B$CBCBABCBABABABABABABA BCBABABABABABABABABADABABABCBCBABABABADABABABADABABABABABADADABABABAB ABCBABABCBABABABABABABABABABABCDABABABABADABADABABABABABABABABABABABA BABABABABABABADABABABCBABABADABABADABABADCBABABABCBCBABABABABADABADAB ABCBABCBCBABABABABABCBABABABADABABABABADABABABABABABCBADABABABABADCBA BADABADABABABABA$8BD6BDB2D11B2D4BD6BD4BD18B4DBDBDBD4BD5BD9B2D3BD8BD2B D4BD26BD4BD6BD10B2D5BD3BD2BD8BD4BD6BD2BD21BD18BD10BD18BD3BD4BD8B2D12B D2B$ABABABABABADABABABABABADCBADCBCBADABCBABADABABABABABABABABABABCBA BABABABADABCDABABADABABABABCBCBADABABABADABCBCBABABABABABABABABABABAB ABADABABABCDABCBABABABABABABABABABCBABADADABABABABABABCBABABADABCBABA BABABCBABABABABADABABADABCDABABABABCBADABABABABABABABABABABCBABABCBAB ABABABABABABABABABCBCDABABABCBABABABABABA$BD9BD7BD9BD28BD10BD3BDBD10B D14BD11BDB2D10BD6BD6BD13BD6BD6B2D17BD7BD2BD13BD12BD4BD3BD6BD4B2D10BD 2BD4B2D6BD3BD7BD6B2D7BD9B$ABABABABABABABABCBABABABABABABABABABCBABABA BABABABCDABABCBADCBADABABABADABABCBABABADCBABABABABADABCBABABABCBABAB ABABCBABADABABABABABABABABABABABCBABABCBABABCBADABCBABABABABABABABADA BABADABABABCBABABADABABADABABABABCBCBABABABABADADABADADABABABABABABAB ABABADABABABABCBADABABABABCBABABABABABABABABABABCBCDADABADABABA$BD3BD 8B2D6BD5BD7BD3BD8BDBD5BD8B2D16BDBD2BD29BD5BD18BD9B2D22BD2BD2BD12BDBD 7BD14B2D7B2D7BD19BD10BD7BD5BDBDBD10BD3BD6BDB$ABABABABABABABCBABABABAD ABABCBABABCBABABABABABADCBABCBABABCBABABADADABABABABCBABABABABABABABA BADABABABCBABABABABABABABABABABABABCBABABABCBABABABABABADABADABABABCB ABABABADABCBABCBCBABCBABADABABCBADABADCBABADADCBABABABABCBABCBABABABA BCBADABABABABABABCBADABABABCDCDABABABABCDABABABABABABABABABCDABABABAB ABABABABABABA$3BD5BD17BD18BD5BD2BD6BD10BD8B2D2BD3BD16BD14BD2BD4BDBD2B DBDBD4BD5B2D10BD15BD2BDBD2BD6B2DB2D9BD4B2D5BD4B2D8BD8BD3B2D6BD3BDBD 10BDBD5BDBD7BD8BD6BDBD4B$ABABABABABABADABADADABCBABABABABCBCBABABABCB ABABABADABABCBABABADABABABCBABABABCBABABABCBABABCDCBABABCBABCBABABABA BABABABABABABABCBABCBADABABABABABCBABABABABABCBABABABABABABABABCBABAB ABABADCBABABADABCBABABABABABABCBADABABCBABABABABABABABABABABABABABABA BADABABABCBABABABABABABABABABABABABABADADABABADABABADABABABABA$BD7B2D 5B2DBD4BD5BD9BD6BD11BD3BD15BD3BD16BD3BDB2D8BD9BD9BD8BD5BDBD9BDBD9BD2B D2BDB4D3BD4BD3BD9BD2BDBD5BD21BD7BDBD14BD4BDBD4BD12BDBD11BD6B$CBABABAB ABABABABABABABABADADCBADCBABABABABADABCBABABABABABABABABADABABABABABA DABABABABADABABABABABABABABABABABADCBCBABABABABABADADADABABABABABABAB CBABABADABCDADADABABABABCBCBADABABABABADABABABABABCBCBABABABABADADABA DABABABADCBABABABABABABABCDABABABCDABABCBABABABABADABABABABCDABABADAB ABCBCDABABABCDABABABABABABABA$B2D12B2D8BD14BD2BD5BDBD5BD6BD2BD28BD29B D2BD12BD19BD8BD4BD18BD7B2D2BD7B2D13BD4BD6BD4BDBD12BD4BD4BD14BDBD3BD2B D7BDB2DB2DBD$ABABABABABADCDABABABABABABABCBABABADABCBABCBABCBCBABABAB ADADADCBABABABABABABABABABCBABCBABADABADABABABABABABABABCBADABABABADA BABABABABABABABADADCBABABCBABABABABABABABABABABABADABCBABABABABADADAB ABABCBCBABABABCBCBABABCBCBABABCBABABABADCDABABABADABABABABADABABCBCBA BCBCBCBABABABCDABCBABADABCBABABCBABABABABADABABCBA$6B2D6BD15BD26BDBD 4BD19BD3B2D6BD12B2DB2DBDBD16BD8B2D7BDB2D13B2DBD2BD6B2D3BD4BD20BD17BD 4BD24BD6B2D20BD7BD4B2D4BD2BD$ABABCBCBABABABABABABCBABABABCBABABABABCB ABADABABABABABADABADABABADCBADADCBADABABABABABABCBABCDABCBABABABCBADA BABCBABABCBABABABABABABABADCBABADABABABABABABABABABABABABABABABABABAD ABABABABABCDABADABADCBABABABABABABABABABABABADABABABCBCBABABABABABABA DABCBABABADADABABCBABABABABABCDABABABABABABABABABADABABCBABABABABA$ 14BD3BD5BD15BD15BDBDB2D2BD14BDB3DBD5BD5BD2BD7B2D17BD16BD2BD7BDBD13BD 16BD12B2D6BD5BD4BD2BDBDBD5BD3BD6BDBD4BD6BD10BD2BD2BDBD4BDBD12BD15B$AB ABABABABABABABABADABCBABABABCBABABCDADABABADABABABABCBABCBABCBABABABA BABABABCBCBABADADABABCBCBABABADABCBABABCBABABCBADABADABADABABABABABAD ABABABABADABABABABCBABABABADABABABABABCBABABABABCDABABABABADABABABCBA BABABCBABABABABABADABABABABABABABABABABABABADABADABABADABABCBABABABAB ABABABABABABABCBABABABABABABABABADA$15BD11BD4BD15BD2BD4BD2BD6B3D5B3D 10BD6B2D2BD4BDBD3BDBD6BD6BD5BDBD6BD5BDB2D3BDBD8BD9BD4BD5BD16BD6BD11BD 2BD8BD11BD8BD5BD3BD12BD19B2D2BD5BD2BD2B$ABABABABCBABABABABABABABABABC DADABADCDABABABCBABABABADABABABADABABABABABABABABCBADCBABABABABABABAB ABABABABCBABCBCBABABABADABABCBABABABABABABCBCBCBADABCBABABABABABABADA BABABABABCBABABADABABCDABABABABABABABABABABABABABABABABABABCBABCBABAB ABABCBABCBABABADABADABABABCBCBABABABABADABCBABABCBABABABABADABABABABA BABABABA$BD3BD9BD5BDBDBD4BD11BD6BD4BD15B2D17B2D14BD2BDB2D13BD2BD6BD3B D4BD8BDBD3BD7BD7B2DB2D10BD8BD4BD4BD15B2D10BD2BD3BD12BD2BD2B2DBDBD4BD 14BD6BD6BD3BD2BD3B$CBABADADABADABCBABABCDABABABABABADABADCDABCBCDCDAB CBABCBCBABABABADCBCBABABCBCBABABCBABABABABADABABADADADADCBABABABABCBC BABABADABCBABABABABCBABABCBABABABABABABABCBABADCBABADCBABCBABADABABAB ADABCBABABADABABABABABABADCBABABABABCBABABADABABABABABABABABABCBCBABA BCBCBABABADABABCBADADABABABABABADABADABABCBABABADADABABA$5BD11BD5BD6B D3BD11BD2BDB2DBD16BD5BD17BD9BD4B2D4BD7BD7BD6BD14BD21BD10BD7BD2B2D3BD 5BD16BD4BD3BD6BD4BD2BD4B2D9B2D2BDBD2BD7BD8BD3BD11BD4B$ABABCDCDABADABA BABABABCBABABABCBABABADABABCBABABABCBCBCBABABABADABCBCBCBCBADABABABAB ABCBABABABCBCBABABABADABABABABABABABCBABABABABABADCBABABABABADABCBABA BCDABABABABCDABCBABABABABABABABABABADABABABABABABABABABADABABABABABAB CBABABABADABABABABABABABADCBCBCBABADABABADABADABABCBCBADCDABCBABABABA BADABABABABABABABABABA$3B2D7BDBD5BD5B2D25BDBD21BD18BD3BD5BD20BD2BD5BD 2BDBD7BD30BD4BD16BD2BD7B2D5B2D4BD5BDB2D10BD3BD9BD9BD21BD4BD6BD8B$ABCB CBABCDABABABABABABABABABABADABABABABABABADABABABABABABABADABADCDCBABC BABABABABABABABABABCBABADABADCBABABADABABABABCBABCBABABCBCBADABABADAB ABABABABABABCBABABABADADABADABCDABABABABADABABABABABABABABABABABCBABA BABCBABCBABCBABABADABADABABABCBABADCBABABABABABABABABCBABABADADABABAB ADABCBABCBABABABABADABABABCBADABA$8BD3B2D4BD5BD18B2DBD10BD12BDBD6BD8B D6BD6BD7B2D18BD10BD2BD8BD13BD6B2D6BD3B2D17BD2B2DBD6BD24BD5BD22BD2BD8B D13BD9BD4B$ABABCBABCBABABABCBABABCBCBCBABCBABABABABABABABABABADABABAB ABABABABABABABABABABABABABADABABABABABCBCBABABABABADABABABABABABABABA BABABABABABABABABABABABABABABABABADABABABABADABABADABABADABABCBABABCB ABCBCBABABABABABABADABABABABABABABADABADABABABABABABABABADABABABCBABA BABABABABABABABABCBADABADCDABABABABADABADCBADABA$6BD6BD2BD45BD9BD6BD 6BD3BD7BD12BD22BDBDBD5B2D7BD2BD24BD13B2D4BD3BD13BD8BD11BD2BD7BD16BD4B DBD14BD2BD3BD2BD6B2D4B$CBCBABCBADABCBCBCBCBCBABADABABABABADABABABCBAB ABABADABABABABCBADABABABABCBABABABABCBABADCDABABCBADABABABABABABCBABA BABABABCDADADCBABABABABCBABABABABCBABCDCBABABABABABABADADABABCBABABAD ABCBABABABABCBCDABABABADABADABABABABABADABABABABABADABABADCBABABABABA BABABABABABABABABABABCBCBCBADABABABADCBABABABABABABCBABCBABA$13BD4BD 4BD11BD2BD3BDBDBD11BD12BD5BDBD5BD4BD8BD4BD2BD2BD3BD10BD3BD3B2D10BD6BD 6BD8B3DBD4B2D4BD12BD10BD4BD7BD7BDBD3BD8BDBD5BDBD11BDB2D2BD8BD5BD7B2DB D11BD3B$ABABABCBABADADABCBABABABABABADABABABABADADCBABADABABABABADABA DABABCBABCBABABABABABABCBABABADABABABABABABCDABADABCBABABABABCBABABAD ABCBABABABABABCBABABABABADABABABABADABABABABABABABABABABCBABCBABADABA BABCBCDCBABABABABABABABABABABADABABABABABCBADCBCBADCBABABADABABABABAB ABABABADADABADCDCBABABABABABABCDCBADABABABCBA$13BD2BD4BD2BD2BD5BD5BD 4BD4BD12BD19B2D4BDBD16BDBD5BD5B2D9B2D2BD8BD2BD3B2D8BD5BD9B2D3B2D21BDB 2D13BDBD10BDBD2BD3BDBD3BD2B2D3BD5BD5BD24BD3BD12B$ABCDABABABABCBCBABAB ABADABADABABCBABABABADCBCBABADABABABCBABABABABABABABABABABABABABABABC BCBABABABABABABABCBABABABABCBABABABABABABABCBABABABCBABABABABADADABAD ADABCBCBADABABCBABABABABABABCBADABABABCBABABABABABADABABADADABABABCBA BABABABABABABADABABABCBABABABABABABADABABABABABABADADABABABADABADABCB ABABABABABABADABA$3BD14BD5BD10BD18BD7BD8BD13BD2BD9BD4BD3BD3B3D4BD15BD 4BD2BDBD5B2D4BD28BD4BDBD11B2D11BD8BD7BD2B2D8BD17BD2BD3BD8BDBD2BD3BD 14BD6BD$ABADABABABADABABABADABABADCBABABABADABCBABCBABABABCBABADADADA BADABADADABCBABABABABABADABABABCBABADABABCBABCBABABADCDABCBABABABABAB ABCBABABABABADABADCBCBABABABABABABABABCBADABABABABABABCDABABABABABABA BABABABCDABADCBABABABABABABABCBABABABABABCBABABABADADABABADABABABABAB ABABADABABABABABABABABABCBABADABADCBADABCBCBA$23BDBD2BDBD3BD8BD5B2D5B D2B2D2BD3B2D3BD15BD10BDBD11B2DB2D6BD2BD6BD5B2D5BD2BD3BD9BDB2DBDBDBD3B D7BD4BD5BD6BD9BD20BD8BD7BDBD16BD9BD12BD2B2DBD3BD4B2D3B$ABABADABABABAD ABCBABCBABABABABADCBADABABCBADABABABABABABCBABADCBABABABABABADADADABA DABABABABABADABADABABABADABABABABCBABABABABABABABABABABABABCBCBABADAB ABABABABABABABABABABADCDADABABABABCBCBABABABADABABADABABABABCDABABADC DABCBABABCBABABABABABCBABABABABADADABABABABABABCBABABABCDABCBABADABAB CBCBABCBCBABABABABABABA$10BD8B2D4BD2BD6BD3BD7BD4BD7BD13BD4BD16BD39BD 12BD8BD5BD6BDBD18BD12BD3BD6B2D25BD5BD5BD2BD19B2D11BD5BD4BDBD2BD5B$ABA BABABABABABABABABADABABABABABABABCBABABABABABABABABABABABABABADABABAB ABABABABABCDABABABABCBABABABADABABABADCBABABABABADCBABABABABCBCDABCBA BABABABABABABADABABCDABABCBCBABABABABABABABABABABCBCBABABABABABABABAB CBABADCBABABABABABABABCBABABABABABABABABABABABABABABABCBCBABABABABABA DCDABABABABABABABABABADADADABABABA$10BD2BD4BDBD4BD3B2D2BD10BD9BD7BD2B D8BD13BDBDBD2BD28BD15BD5BD2B2D10BDBDBD15BD2BDBD2B3D2BD10BD9BD6B2D7BD 2BD9BD5BD8BDBD14BD14BD7BD6BDB2D3B$ABABABABABABABABCDABABCBABABCBABABC BADADABABABABABADABABABADABABADABABABABADABABCBABCBABABABADABABABABAB ABABADABADABCDABABABABABABABABABADADCBADABABABABABABABCDABAFCBCBABABA DABABABADABABABABABABADABABABCBCBADABCBABABABABABABCBABABABABABABABAB ABABABABABADADABABABABADCBCBCBABADABABABCBCBABABCBABABADABABABABABABA BA$BDB3D7BD8BD5B2D3BD5BD4BD2BD4BD5BD5BD2BD2B2D3BD19BD3BD3BD5BD2BD14BD 15BDBD6B3D3BD4BDBD13BD6BD14BDBD7BD6B2D5BD5BD2BD5BD3BD5BD14B2D8BDBD30B 3D2B$CBABABABABABABABABCBABADABCBABADABCBCBADABABADADABABABABABCBABAB CBCBABCBABABCBABABABABCBADABABABABABABABABABABABABABABABABABCDADABCBA BADABABABABABABABCBADABABABADABCBCDABABABABABCBCBABABABABCBABABADABCB ABABADABABCBABABABABABADABABABABABABABABABCBABABABCBADABABCBADABABABA BADABABCBABABABABABCBABCBCBABABABABABABADA$7B2D15BD7BD3BD21B2D8BD14BD 10BD17BD8BD4BD4BD6BD5BDBD2BD7BD4BD12B2D3BD9BD6B2D4BD8B2DBD3BD5BD3B2D 7BD18BD9B2D9BD10B2D2BD19B$CBABABABABCDCBCBCBABABABADCBADABABABCBCBABA BABABABADABADABABABABABABCBADABABCBCBABABCBCBABABCBADABABABABABCBABAB ADABCBCDABABABCBABABCBABABABABABABABABABABCBABABABCBABABADABADABABABC BABABABABABABABADABABCBABABABABABADCBABABCBABABCBABABCBABCBABABADABAB CBABABCDABABABABABABABABADABCBABCBABABABABADABABADCBCBABADCBCBA$D3BD 4BD8BD3BDBD9BD19BD2BD2BD10BD3B2D9BD9B2D2BD5BD8BD3BD7BD5B2D4BD5BDBD9BD 7BD6BDBD9BD19BDBD2BD5BD6BD3BDBD6BDBD8BD13BD2BD2BDBD6BD2BD24BD9B$ABABC BCBADABABABABABABADABABCDABADABABABABABABABABABABABABABABABABADABABAB ABABABCBABABABABCBABABABABADABABABABABABADABABABABABABCBABABABCBCBABA BABABABABABABABABABCDCBCBABABABABABABABABADABCDABABCBCBCDABADABABABAB ABADADABABABABABABABCDABABABABABADCBABABABABABABABABCBABADABABABABABC BABABABCBADABCBABABCBABCBABCBABA$10BD7BD10BD4BD4BD5BD2BDB2D3BD8BD20BD 5BDBD10BD7BD4BD9BD6BD3BD3BD4BD11BD2BD2BD4BDBD7BD12B2D5BDBD8BD15BD6BD 5BD6BDBD2BD18B2DBDB2D7BDBD3BD2BD9BD6BDB$CBABABABABADABADABABABCBABABA BABCBABABCBADABABABABABABABABCBADABABABCBCDCBABABABCBCBABABABCBABABAB ABABABABADABABCDABCBABABABCBABABABABABABABABADABABADABCDABADABABABABA BABABABABCBABABABCBCBABADABCBABABABABABCBABCBABABCBABABABABCDCBCDABAB ADABABABABABADABABCBABABABABABADCDABABADCBCBABABABABADABABABABABABADA BABABCBA$BD3BD10BD5BD8BD11BD2BD2BD4BD18BD2B2D8BD3BD2BD10BD9B2D4BD4B2D 21BD2BD16BD2BDBD9BD9B2D21BD13BD10BD32BD5BD3BD9BD3BD3B2D7B2D$ABABABABA BADCBCBCBABABABABABABABABCBABABABADADABABADABABADABABABABCBABABABABAB ABADABCBABABABABCBABCBCBABABABABABABABABABABABABABABABABCDADABABABCBA DABABABABCBABABABADABABABABCBABABABABCDABCBABABABABABABABADABABADABAD ABCBABABABABABABABABABADABADABABCBADABABADABABABCBABCBABABCBABABADCDA BADABABCBADABABADADABABABCDA$6B2D4BD3BD4BD2BD8BD2BD2B2D5BDBD4BD15BD3B DBD10BD3BD21BDBD9BD4BD4BD9BD19BD27BDBD9BD7BD6BD2BD2BD9BD5BD4BDBD3BD3B D24BD9BD8BD12B$ABABCBCBABABABABABABABABABABABABABCBADABCBADABCBABADCB ADABABABABABADABABABCBCBABABABADABABABABABABABABCBABABABABABADABABABA BCBABABABABABABADABABCBABCBABABCBABADABABABABABABABABABABADADABADABAB ABABABABABABCBABABCBABABADABABABABABABCBADABABABABABABABABABABABABABA BABABABABABABABABADABABABCBABABABABABCBCBABABABCBABA$5B2D22BD8B2D2BD 2BD4B2DB2D15BD3BD3BD26B2D10BD8BD2BD7BD3BD14BD7BD9BD12BD3B3DBD9BDBD2BD BD3BD13BD2BD2BDB2D10B2D2B2D8BD9BD7BD5BD3BDBD4BD5B2D2B2D2B$ABABABABABC BABABABABABABABABABABABABADADCBABABCBABABADABCBABCBCBABADABABABABABAB ABABABABABCBCDABABADADCBABABABABADABABABADABABABCBADABABABABABABABABA BABABABABADCBABABABABABABABABABABABABABABABCBADCBCBCBABABCBABABABABAB ABADCBABABABABABABABADCBABABABABADCDCBCDABABADABCBADCDABABABABABABABA BABABABABABABABADABABABABA$BD13B2D13BD6BDBD7B2D4BD4BD2BD14BD5B3D8BD 10BD6BD3B2D17BDBD2BD2BD8BD5BD10B2D3B3D10BD5BD3BD10BD10BDBD2BD10BD10B 2D8B2DBD3BD5BD7BD6BDBD9B2D6BD8BD$ABABABABABADCBADABABABADADCBABCBABAB ABABABABABABCBCBABADABABADABABABABABCBCBADABABABCBABABABABADABADABADA DABABABABABADABABABABABABCBABABABADABABABABABABABABCBABABABABABADABAD ABABCDABCBABABABABABABCBABABADCBABABABABABABABABABCBADABCBABABABABADA BABCBABABABADABABABABABCDABABABABABABADABABCBABABABABCBABABADADABABAB A$5BD2BD24B2D6BD14BDB2D6BD6BDB2D11BD8BD11BD6BD9BDBDBD16BD15BDBD13BD8B 2D12B3D2B2D3BD5BD2B2D8BDBD2BD2B2D24BDBD22BD2BD6BD9BD2B$ABCBABABABADAB ABADABADABABABABABABABABADABADABCBCBABABABABABABABABABCBADABABABCDABA BABABABABABABCBABCBABCBABABCBADABABABCBABABCBABABABADADCDCBABABABCBAD ABADABABABABABCBABABCBABADCBABABABABABADABABABABCBABCBABABABADABCBABA BADABCDCBCDABCBABABABCBABADABCBABABABABABABABABADABADABABABADCDABADAB ABABADCBABABCBABABABADA$19BD10BD6BD3BD4BD8BD2BD6BD27BDB2D2BD5BD4BD28B D4BD2BD4BD8B4D3BD8BD12BD28BD2B2D4BD3BDBD8BD10BD2BD2BDB2D7B2DBD8BD3BDB D6BD3BD8B2D2B$ABABABABABABABABABCBABABABABADADABABABABADADABABADABABA DABABABABABADADABABABABABABCBABCBABCBABABABABABABABADABADCDABABCBABAB ABABADABABABABCBABABABABCDABABABABADABABABABABADCDADABABCBABABABABABA BABABABABADABCBABABCBCBABADABABABABABCBABABABABABABABADCBADCDCBADABAD ABABABABABABABABCBABABABABABADABABADABABCBABABABABA$D2B2DB2D13B2D3BD 6BD3BD2BD6BD5BD9BD3BD9BD2BD5BDBD14BDBDBD2BD3BD10BD3BD3BD7B2D2BDB2D15B D2BDBD11BD4BD7B2D5BD6BD29BD3B2D15BD15B2D2BD7BD13BD5BD4BD$ADCBABABABAB ABADADABCBABCBABCBABABABABABCBABABADABADABABADABADABADABABABADCBADABC BADABADABABABABABABABADABABABABADADABADADCBCBABADABCBABABABABCBABABCB ADABABABABABABABADADABABADABABCBABABABABABABABABABADABABABABABADABCBC BCDABCBABABABABABCBABABABABABABABABABABABABABCBADABADABABCDABABABCBAB ABCDABABADABABCBCBABABABA$BD3BDB2D6BD6BDBDBD4B2D3B2D9BD3BD7BDBD2BD3BD 3BD7BD2BDBDBD2B3D6BD3BD7BDBDBDBD3B2D21BDBD3BD15BD3BD10BD19BD11BD2BD7B D14BD8BD3BD6BD29BD4BDBD3BD12B$ABCBADCBABCBABABABABABADCBABABABABCDABA DABABABABABABABABABADADCBABABABABABABADABABABABABABABABABADCBABABABAB ABABABABCBABABABABCBCDABABABABABABABADADCBABABABABABABADABADABCDABABA BABABABABADABABABCBABABADABABABABCBCBABABABABABABCDABABABABABABABABAB ABABABABABABADCDABABABABABABADABABABADABCDCBABABABABADABCBABABCBABC$ 6BD5BD12BD10BD2BD7BD3BD2BDBD4BD2B2DBD13BD12B3DBD6B2DBD11B2DBD3BDBD2BD 3BD18B2D5BD3BD8BDBD2BD4BD2BD8BD4B2D8BD2BD3BD10BD18BD9BD10BD3BD2BD5BD 2BD10B2D11BD2B$ABABABABABABADABABADABABABABCBABABABABABABABABABABADAB ABABABABABABABABABABABABABCDABABABABABABABABABABADABABABABCBABABABADA BABABABABABABABABABABABABABABABABABABABABCBABABABCBABADCBABABABABCBAD ABABADABABABADABABADABABCBABABCBABABABCBCBABABCDABABCBABADABCBABABABA BABABCBABABABABABABADABCBABABADABABABABABABABABABABA$BD2BD4BD2BD2B3D 4BD11BD3B2D7BD5BD3B2D3BD6BD5BD4BD15BD3BD9BD6BD10BDBD13B2D7BDB2D13BD2B D9B2D2BD4BDBD10BD2BD10BD3BD3BD8BDBD4BD4BD8BD2BDBD3BDBD7BD3BD19BD7BD2B DB$ABADABCBABADABCBABCBABABABADABABABABABABABABABADADABCBABABABADABAB ADABABABABCBCBCBADABABABABADABCBADABABABABABABABABABABABABABABABABCBA BABABABABABABCBABABABABADABCBABABABABCBABABADABABABABCBABABABABADABCD ABABABABABABABABABABABCBADABABADABABABADABCDABADABABABABABADCDABABABA BADABABABABABABABCBCDABADABCBCBCBABADABC$BD9BD3BD7BDBD5BDBD7BD2BD6BD 5BDBD9BDBD5BDBDBD3BD5BD2BD2BD3BD7BD3BD10BD6BD6BD9B2D2B3D8BD2BDBDBD4BD 3BD12BDBD12BDBD7BD12BD8BD11B2DBDBD18BD14BD13BD2BD3BDB$ABABABABABADCBA BCBABABABCBCDABABCBABABCBABABABABCBCBABABABABCBABABABABABABABABABABAB CBADADCDABABABCBABABABABADADABABABABADCBABADADADADABABABABADABABABABA BABABABABABABABABABADABABABABADABABABABADABABABABABABABCBADCDABABABAB ABABABABABABABABABCDABABADABABABCBABCDABABABABABABABABADABABABABCBABC BABABABABABCBABABCBCBA$9B3D10BD7BD6BD19BD5BD3BD4BD2BDBD3B2DBD4BD6BD6B D2BD13BD6BD10BD14BD4B4DBD12BD19BD4BD15B3D2BD2BD11BD7BD2BD6BD3B2D29BD 6B2D14B$ABABABABABABABABCBABABABABCBADABABABABCBCBADABABABCBADABABCBA BABCBABABADABCBABABABABABCBABABABABADCBABABABABABADCBABABADABCBABABAB ABABADABABABABABABADABABABCDABABCBABABABABABABADABCBADABADABABABABABC BABABABABABABABABABABABADCBCBABABABABCBABABABABADADABCBABADABADADABAB ABADABCBABABABABADABABADCBABADABABABABABCBABA$9BD3BD16B2D6BD14BD2B3D 6BD8B2D4BD15BD2BD5BDBD2BD3BD3B2D4B2D13B2DBD7BD2BD9BD11B2D5BD22BD8BD 11BD6B2D10B2D7BDBD6BD9BD4BD3BD4BD4BD2BD16BD$ADABABABABABCBABCBABABABC DABABABABCBCBABADABABABABABABABCBABABABABADABABABABABABCDABABABABABAB ABABABABABABABABABABABABABABABABABCBCBABABABABABABABABCBABABCBCBABCBA BCBABABABCBABABABABADCBCBABABABABABABABABABADCBCDADABABABABADABADCBAB ABADABABABABABABADCBCDABADABABABABABABABADABABABABABCBABABABABABABABA BABABCDABADA$7B2D2B2DB3D16BD26BD9BD9B2D12BD11BD3B2D22BD2BD14BD6B2D3BD 5BD2B2D13BD8BD4BD5BD5BD2BDBD9BD5BD23BD4BDBD3BD15B2D2BD12BD2BD2BD2BD$A BABADABCBABABABABABABABADABABABCDADABABABABABABABABABABABABABADADABAB ABCBABABABABABABADCBCBCBABABABCBCBCBABCBABADABABABADABABCBABABADCBABA BADABABABABCBABABABABABABABABABABABCBABABABABABCBABABABABABABABADCBAB CDABABCBABCBABADABADABABABCBABABABABCBABADCBCBABCBABABABABCBABABABABA BABABABABABADABABADABABABABABABABABA$5BD2BDBD4BD2BD3BD15BD9BD5BD6BDBD 8B2D4BD11BD5BD2BD9BDBD5BD10BD3BD11BD5B2D6BD4BD6BDBD6BD11BD2BD7BD8BD6B D5BD8BD4BD10BD2B2D3BD23BD4BD2BD8B2D4BD3BD4B$ABABABCBABCBABABABABABABC BCBABADABCBABABCBABCDABABABCBCBABABABABCBCBABABADABABCBABABABABADADAB ABABABCBABCBABABABABADABCDABADCBADABABABABABABCBABADADABCBABADABABABA BABCBADCBABCBADABABABABABABABADADABABABABCBABABABABADABABABABADABABAB CBCBABABABABABABABABABABABABABABABABABABADADABABABCBABABABABABADABABA BABABABABABA$4BD2BD4BD5BD35BD6BD5BDBD9BDBD2BD6B2D5BD5BD5B2D9BD5BDB2D 3BD11BD3BDBDBD4B3D15BD2BD5BDBD4BD14B2D2BD2BDBDB2D2BD10BD3BD4BD3BD11BD 5BDBDB2D9BD5B2D4BDBD6BDBD9B$ABABABADADADCBABABABABABABABABADABABABABA DCBCBABCDCBABABADABABABABABABABABABADABCBADCBABABABCBADABADABABABCBAB ADABABADCBABABABABCBCBADABABADABABABABABABABCBABABABABADCBABABABABABA BCBABABABABADABABCBABABABADABABADABCBCBABABCBCBABABABABADABADABABCDAB ABABCDABABABABCBADABABABABABABCDABABABABABABABCBABABABABADCBADABA$2BD 3BD9BDBD4BD7BDBD13B2D9B2D7BD2BD15BD3BD2BD7BD3BDBD8BDBD6BDBD10BD6BD13B D4BD3BD10B2D6B2DBD3BD5B2D7BD9BD11BD19B3D3BD2BD13BD6BD2BD2BD6BD3BD7BD 6B$CBADABADABCBABABABABABABABCDADABCBABABABADABABABCBADABABABABABABAD ADABABCBABABABABCBABABABCBABABABCBCDABABABABABABABABABADABABABABABABA BADABABABCBCBABABCBABADABABABABCBABABABCBABABABADADABCBABABADCBABABAB CBABABABABABABABABABABABABABABADABABABABABABADABABABCBABABABCBABCBABA DABADABADABABCBCBADABABABABABABABABCBABA$3BDBD3B2D3BDBD4BD5BD6BD3BDBD 7BD8BD2BD2BDBD4BD4B2D3BD11B2D4BD12B3DBD3BD2BD5BD4BD3BD2BD2BD6BD5BD3BD 3BD5BD5BD2BD2B2D2BD3BDBD7BD9BD8BD11BD3BD2BD5BDB2D2BDB2D8BDBD2BD4BD6B 2D3BD4BD5B2D16B$CBABADABABABABABCBCDABABABADABABABCDABABABABABABABABA BCBABABADABABADABABABCDABADCBABABABABABCBADABABABABABABABABABABADCBAB ABABABABABABADABABADADABABADABABABABABCBCBABADABABABADABCBADABADABABA BABABABCBABABADABCBABABADABABCBABABABABADABABABABABCBABABABCBABABCBAB CBABABABABABABABABABABABABADABABABABABABABABABABADABA$4BDBD2BD4BD4BD 2BD7BD3BDBD12BD2BD4BD5BD7BD19BD24BD8B2D6B4D4BDBD4BD7BD6B2D21BD3BDB2D 2BD2BD3BD15BD10BD9BD7BD6BD4BD3BD9BD3BD3BD11BD18B$ABCBABABABABCBCBADAD ABABABABADABABCDABABCBABABCBABABABCDABABABABABABADABABABCBABADCBABABA BABABADADABABABABCDADCBABABABABABABABABABABCBABABABABABABABABCBCBABAB CDABABABADABABABABABABABABABADCBABABCBABADCBABABADABABABADABABABCBABA BABABADABABCDABCBABADCBABABABABABABABABCDADABABABABABCDABABABABABABAB CBABABABABABABADC$12BD2B2D3BD7BD36BD4BD25BD3BD7BDBD11BD2BD9BD6BD7BD9B D2BD7BD7BDBD6B2D6BD2B2DBD9BD3BD3BD9B3D5BD5BDBDBDBD5BD5BDBD3BD5BDBD5BD 6B2D7BD13BD$CBABADABABABABADABABABABADADABCBABCBADADABABADCBABABABABA BABCBADABCBABABABCBADCBABCBABABADABABABABABABADABCBABABABABABADABADAB ABABABADABCDABCBABADADABABADABABABABABABABABABCBADADADABABADABCBABABC BABABABCBABADABABCBABABCBADABABCBCBADABCBABABABABABABCBABCBABADABABAB ABABABABABABCBABABABABCBABCBABABABABADABCDABABABA$5BD2BDBD11BD10BD7B 2D7B2D11BD11BD3BD12BD3BD3BD6BDBDB2D7BD9BD10BD4BD10B2D4BD4BD5B3D2BD31B DBD3BD10BD10BD5B2D19BDBD3BD5BD3BD6BD8BD12BDB$ADCBABABCBABABABABABABCB ADABABABABABABABABADABABABABABABABABABCBABABABABABCBCDCBABABABABADABC BABABABCDABCDABADABABABADADABABABABADABCBABADABABABABABABCDABABCDABAB ABADABABABABABCBABABABADABABADCBABABADABADABABABCDADCDABCBABCDABABABA BABABCBCDABABABABABABABABADABABABABABCBABABADABADABABABABABABABABABAB CBABABADABABA$26B2D4BD8B2D5B2D2BD2BD5BD7BD4BD13BD8BD9B2D7BD2BDBD4B2D 7BD7BD9BDBD8BD4BD3BD8BD5BD11BDBD6BDBD36BDBD2B2D3BD5BD21B2D12BD4BDB2DB D2B$ABABABCDABADABABABABABABABABABCDABABABABABABABABABABCBABABABABCBA BCBABABABABABADABCDABABABABABABABCBABCBABABCBADABABABABABABABABABABCB ADABABABABABABCBABABABADABABABABABCBABABABABABABADABABCDABADABABABABA BABCBABABABABADCBABABABABABABABADABCBABADABABCBABABADCBCBABABCDABABCB ABADABABABABABADABABCDABABABADABABABABABA$9BD4BD8B2D10BD11B3D19BDBD 17BD8B2D9BDBD3BDBD4BD13B2D5BDBDB2D9BD3BD14BD12BD13BDBD8BD12BDBD6BDBD 3BD15BD12BD2BD6BD3BD12BD3B2D3BD2BDB$ABCBABABABCBABADABABCBABABABADABA BABABABABABABABCBCBABABADABADADADADABABADABABABADABABABABABABABABABAB ABCBABADABABABABABCBABADABADABADADABABABCBABABABABCBABABABABABADCDADA BABABABCBADABABABABABABCBABABADABABCBCBCBABCBCBCBADABADABABABABABABAB ABCBABADABADABABABABABABCBABCBABADABCBADABADABABABABCDABABABABABABCBA BABA$2BD5BD2BDBD3BD15BD27BD6BD2BD6BD8B2D5BD4BD8BD3BDBD5BDBD4BD3BD17BD 6BD3BD3BD4BD5BD6BDBDBD4BD10BD3BD6BD7BD3BD4BD2B2D7BD4BD8B2DB2D10BDBD 18BDBDBD11BD4B$CBADABABABABABABABABCBABABABABABABABABABADABABABABABCD ABABABCBCBABADABABABABABABABCBCBABABABABABABABABABCBADABABABABADADADA BADABABABADABCBCBABABCBABCBABABABCBABCBABABABABCBABABADADABADABABABAB CBABCBCBCBABCDCBABABABADABCBADABABABABABADADABABADABADABABABABABABABA BADABABABABADCBABABABABABADABABABADABABABABADABABCBA$D5BD11BD11BD2BD 8BD4B2DBD3BDBD16BDB2D6BD3BD20BD3BD4BD10BD5BD2BD7BD5BD2BDBD7BD4BD5BD5B D2BD5BD20BD15BD2BD11B2D3BD16BD4B2D2BD6BDBD8BD6BD8B2D4B$ABABCDABABABAB ABADADADABABABADABABADCBABCBABABCBABABABABCBABCBABCDABABABABABABADADA BABABABABCBABABABABABABABABABABABABADABABABABABADABABABABABABABABABAD ABABABADABCBABABADABABABADABABADABABABABABADABABABABABCBABABABABCBABA BABABADABCBABCBCBCBABABADABCBABCDABCBABABCBADADADABADCBADABADABABABAB ABABABCBABABCBABABABADC$4BD12BDBDBD5BD22BD7BD11B2DBD5BDBD7BD18BD3BDBD 3BD5BD4BD3BD10BD6BD6BD12B2D14BD7B2D15BD4BD2BD2BD2BD7B2D8BD11BD5BD15BD B3D5BD2BD15BDBD2BD$CBABABCDCBABABABABABADABADCBABABADABCBABADABABABAB CBABABADCBABABCBABADADABABABABABABABABADABADADABADABABABABABADABABABA BCDABABABABABABABABABABABADABCBABABABABABABABABCBABABABABABABABABABAB ABCBABCBADCBADADADCDABABABADABABCBADABABCBABABADABABADCBABCBABCBABABA BABCBABABCBADABABCBADABABADABABABADABADABADADABABABABADC$7BD6BD9BD2BD 2BD3BD21BD6BD4BD4BD14B2D12BD2BD2BD7BD8B3D4B2D5BD20BD6BD9B2D17BDB2DBDB D2B3DBD3BD27BD2BDBD4BD5BD12BD21BD7BD11B$CBADABABABABABABABADABABABADC BABABCBABABABABCBADABABABABABCBCBABABABADABADABABABABABABABABABABABAB ABABABABABCBADABABCBABCBABABADCBABCBABABABABADABCBABADCBABABADADABABC BABABCBABCBABABABADABADCBABABADABCBABCBABADABABABABABABABADCBABADABAB ABCBCBABABABCDABADABABABABADADABABCBCBABABADABABABABADADABABABCBCDADA BCBADABA$D11BD3BD8BDBD3BD4B2D3B2D2BD10BD3BD6BDB2D10BDBD12BD5BD4BD13BD 13BD10BD20B4DBD17BD9BD5BD11BD4B2D4BD10BD10B2DBD16BD12BD5BD8BD2BD8BDB$ ABABABADABABABABADABABABABABABABABABABABCBADABADCBABABABABABABABABADA BADABABCBADABABABCBADCBABCBABADABABABABABABABABCBABADABCBCDABABABCBAB ABADABABABABABABABABABABABADADABABADADABCBADABABABCBABADABABCBABABABA DABADCBCBABABABCBABABCBABADCBABABABABABABABCBABADCBABADCBABCDABCBABAB ABABABADABABABABABADABCDABABABABABCBA$6BD14BD3BD4BD4BD14BD5B2D3BD22BD 15BD5BD3BD7B2D8B3DBDBDBD8BD2BD3BD2BD8BDBD31BD19BD7B2DBD7BD3BD12B2DB2D 6BD3BD11BD4BD3BD5BD5BD7BD2B$ABADABADABABCBABABABABCBABABABABABABABABA BABABCBABABABABABABABABABABCBABADABABADABABABABABABABABABADABABABABAB ABCDABCBABCDABCBABABABABABCBADABABABADADADCBABABABABABABABABCBABABABA BABABABABABCBABABABABABADCBABABABCBABABABABCBABABCBABCBCBCBCBABABABAB ABADABABCBABADABABADABABADADABABABABADADABABABABADABADCBABABADCDA$14B D5B2D13BD12B2D3BD3BDBD4BD5BD3BD8BD23BD12B2DB2D13BD6BD10B2DBDBD5BDBD 13BD8BD10B3D2BD3B2D3BD5B2D4BD25BD15BD4BDB2D11BD6BDBD12B$ABABABABABABA BABABCDCBCBADCBADABABADABABABABABABABCBABCBABABADABABABADABABABABCBAB ADCBABABABABABABABABABADABABADABABABABABABADABABABABCDADABCBABABABABA BABABADABADABADCBABABABABADABABCDCBCBABABABABABABABABADABCBABABABABAB CBABCBABABABCDABABADABABABABABCBABABCBABCBABABADABABABABABCBABABABABA BADCBABABABCBABABABADABC$14BD3BD4BD5B2D44BD8BD3BD7BD2BD2BDBD8BD3B2D2B 2D10BDBDBD2BD3BDB2D16BD3BD3BDBD5BD2BD3BD7BD2BD39BD6BDBD3BD2BD6BD9BDBD 6BD6BDBD12BD10B$CBCBABCBABABABADABCBABABABCBCBABABCBCBABABABABABADCBA BABABABABABABABCDABABABCBCBCBABABABCBABCBABCBABABABCBABCBABADABABADAB ABABABABABADADABCBADABABABABADADADABABABADABABABABADABCBABABCBADABADA BABABABABABCBABADADABABCBABABABABABABABABABABABADABABABABABABABABABAB ABABADABABABABCBABABABABABABABABABABABABABABCBABABABA$8B2D8BD3BDBD7BD 5BD5BDBD9BD4BD2BD4B2DBDBD15BD2BDBD16BD23BD9BD12BD4BDBD3BD8B2D5BD5BD6B D4BD7BD4BD4BD5BD6B3DBD6BDBD5BD7BD9BD2B2D9BD7BDBD12BD3B$ABABABABABADAD CDABABABABABABCBABABABABABABADADCBABABABABABABCBADABABABCBABABABABABA BABABABADABADABABABCBABABABABABCDABABABABABABABCBABABABABADABADADABAB ADABADABCDABABABABABABABADABADABADADABABABABABABABCBABABABABABCBABCBA BABABABABABCDABABABABADABCBABABABABABADADABCBCBADABABABCDABCBABABABAB ABABCBABABABABABABABADA$31BD14BDBD8BD3BDB2D4B2DB2D12BD20BD3BD3BD3BD7B D4B2D4BD5B3D9B3DB2D4BDBD8B2D7BD6BD3BD3BD3BD5B3D3BD14BDBD6BD3BD12BD11B DBD2BD6BD3BD9BD7BD3BD4B$ABABCBABABABABABADCBABCBABADCBABABABABABABADA BABABABABABADABABABABADABADABADABABABABABADCBABADCBABCDABABABCBCBABAB ABABADABCBABABADABABABABCBABABABADABABCBABABABABABADABABCDABABABABABC BCBABADADABABCBADABCBABABABABABABCBABABABABADCBADABABABCBABABABABCBAB ABABADCDABABADCBADABABCBABADCBABABABABABADABABABABABABCBABABA$3B2D15B 3D10B2D2B2D14BD9BD6BD2BD2B2D20B2DBD2BD8B2DBD25BD12BD3BD8BDB2D4BD4BD 10B5D3B2D2BD44BDBD5BD2BD5BD3BD2BD7BD13BD16BD$ABABABABADABCBABCBABABCB ABADADABABABABABADABADABCBABABABCBABABABABABABABABABABABADABABABABABA BADABABABABCBABABCBCBADABABABABABABABABABABABABCBABABABADABCBCBABABAB ABABABABABABABCBABABABABADABABABABABABABADADABABABABCBADADCBABABABADA BADCBADABABABABABABABABABABCBADABCBADABABABADCBABCDABABABABCBABABABAD ABABABADABABA$D8BDBDB2DBD5BDB2D4BD10BD23BD18B3D8BD2BD3BD2BD9BD2BD3BD 10BD16BD3BD3BD14BD6BD2BD9BDB2D2B2D11B2D11BD4BD2B3D30BD8B3D3BD4BD5BD2B DBDBDBD5BD5B$ABABADCBADADABABABCDABCBADADABABABABCBABABADABABADABCBAB ADABABCBABCBABABABCBABADABABCBABADABABABABADADCDABABABABADABADABCBCBA BABABABABCDABABABCBABABABCBABABCBABABABABABABABABABABABABCBABABCDCBAB ADABABABCBADCBCBADABCBABADABADABABABCBABABABCBABABABADABABABABADABABA DABCBCBABADABABABADABCBABABABABCBABADABABABCBADABA$2B2D3BD9BD6BD12B2D 2BD10BD8BDB2D2BD2BD3BD2B2D2B2DBD2BDBD3BD5BD28B2D9BD31BD5BD3BD22BD18BD 5BD5BDBD2BD2BD5BD5BDBD11BDBDB2D2BDB2D16BD4BD2BD7B$CDCBABABADABABCBABA DADCBCBABABABABABABABABADABCBCBABABABADCBADABABABABABABABABABABABABAB CDABCDABADABCBABCDABABABABCBADABABABABCBABABABABCBABABCBABCBABABABABC BABABCDABCDABCBABCBABABABABABABADCBABABABABCBABABADADABABCBADABABADAB ABABABABABABABCBABADABABABABABABABADABABABABABADABADABABCBABABABABABC BABCBCBCBABABABCBC$2BD7BD13BD9BD16B2D3BD7B2DBD2BD6BD2BD9BD5BD17BD7BD 2BD7BD14BD9BD8BDBD4BD10BDB2D7BD4BD2BD13B2D20BD9BD5BD5BD15BD8B2D7BDBD 3BDB2D6BD$ABCBABCDADCBABABCBCBCBABABABCBADCBABABADABABADABADABABABABA BABABABABABABABABADABABCBABCBABABABABABCBABCBADABABABABADCBABABADABAB ABCBCBABADABABABABABCBABABABADABABABADABABABABABABABABADABCBABABCBADA BABABABADABABABABCBCBABABCBABABABABADABABABABABABABCDABABABABABABABAB ABABABABCBABADABABABCBCBABABABABABABABCBABADABA$7BD3BD9BD3BDB2D4BDBDB 2D8BD6BD6B2D18BD11B2DBDB2D2BD11BD2BDB2D9BDBD5BD10BD7BD5BDBD7BD5B2D6BD 2BD7BD13BD8BD16BD3BD2BD6BD6BD5BDBD6BD3BD5BD6BD5BD8BD6B$ABABCBABADADAB ADABCBABABADABADABABABABABABABABABABABABCBABABABABABABCBCBABABABCBADA BABABADABABADABADCBABABABCBABABADABCBABABADABABABABCBCBABABABABADCBAB ABABABADABADABABCBABABABADCBABADABABCDABABABABABABCBABABCBCBABABABABA DABABABABADABABABABABCBABABABABABABABABABABABCBABABABABABABABABCBADAD CDABADABABABABCBABABABA$BD5BD7B2D4BD13BD7BD3BD11BD11BDBD10BD9BD7BD7BD 5BD15BD5BD9B2D7B2D6BD3BD5BD9B2D2B2D6BD14BD8B3D43BD6BD4BD3BD15BD12BD$A BABABABABABABABABABCBABABABABABABABABABABADABABABCBABABABABABCBABCBAB ABABABABABADABADABABABABABABABABCBABABABABABABCDABABABABABABABCBADABA BABABADABABADADABABABCBABABABABABABADABABABABABABABCDABABABCBABADCBCB ABABABADABADABABABABCBCBCBADABABCBCBABABABABABABABABCDABADABABABABABA DCDABABABADABABCBABABABABABABCBADADA$D2BD15BDBD7B2DBD5B2D12BD5B2D2BD 4BD3BDBD4BD3BD4BD13BD19BD2BD2BD5BD13BDB2DBD4B2D8BD6BD9BD3B3D3BD15BD2B D5B2D22BD10BD8BD6BD5BDB2DBD2BD4BD8BD7BDBD4B$ABABABABABABABABADABABCBA BCBCDABABABADABABADABABADABABABCBABABABCBCBABABCBADABCDCBCBABABABADAB ABCBCBABABADABABABABABABABCBABADCDABADABABABABABABCBABABABABCBCDADCBA BABABABABABABCBADADABCBABABABABABCBCBADABABABABABABABABABABABABABABAD ADABABCBABABCBABABABABCBABABABABABABABABABABCBABABABABABABABADCBABADA BABCBABABABA$BD3B2D5B3D4BD4BD9BD2BD23B2D31BD20B2D2BDBD3BDBDBD11BD10BD 7BD4BD6BD12BD3BD25BD2BD3BD3BD13BD28BDBD2BD9BDB2D11BDBD9BDB$ABCBABABAD ADCBABCBABABADABCDABABCBABABABABCBABABABABABCBABABADCBABABABABABABADA BABCBABADCBADABABABABCBCBABABABABADABABADABCBABABABCBABADADCDABABABAB ADCBABABADABABADABABABABABABADABABABABABADABABABABCBCBABABCBABCBABABA BABABABCBABABABADABABABABABCBABABADABABCBCBABABABABABABABABCBCBCBABAB ABABCDADADCBABABABABABCBABA$4BDBD6BD18BD4BD2BD9BD5BDBD6BDB2D6BD6B2D2B D5B2D7B2D11B2D2B2D5BD5BD6BD5BD10BD12BDBD10BD2BD14B3D18BD3BD3BD3B2D7BD 24BD16BD7B2D9BD10B$ABABABABABABCDADABABABABADCDABABABABCBABADCBADABAB ABABABABABADABABABABCBABABCBABABCBABCDABABABCBADCBABABABABABABCBABABA BADABABABCBCBCDABADABABABABABABABADABADABABABABABABCBADABABABABABADAB ABABABABADCBABABCBABABADADABCBABABABADABABADADABCBABABABABCDADABABABA BADABADABABADABABABABABABABABABABABABABCBCBCBABABABADABA$17BD7BD2BD9B D2BD9BD4BD6B2D3BD8BD7BD2BD18BD11BDBD19BD3BD9BD3BD3BD8BD4BD2B2D8B2D11B D6BD2B2D5BD9B2D3BD2BD6BD16BD2B2D9BD14BD3BD2BD8BD5B$ADABCBABADABABABCD ABADABABABABABABABCBADCBABABCBABABADADABADABABABABABADABABABCDCDADABA BABABABADABABCDABABADABABABABADABABADABADABABABABABADABABCBABABABABAB ABABCBABABABCBADABADCBABCBCBADABABABABABADABCBABABABABABABABABABABABA BABABABABCBABABABABADABABABABABCDADCDABADCBABABABABADABCBABABADABABAB ADCBABCBABABABCBABA$12BD4BD7BD2BD26BD7BD12BD5BD6BDBD4BD11BD3BD6BD23BD 5BD4B2D7B2D2BD34BDBD4B2DBD28BD10BD9BD10B2D5BD5BD9BD3BDBD6B2D2B$ABABAB ABABABABABADADCDADCDABABABCDABABABABADABABABADABCBABABABABABABABABABA BCBCBABCBABABABABABABABABABCBADABABABABABABABABCBABABABABABADABCBABAB CBADABABABCBABABABABABABCBABCDABADABABABABABABABABABABCBABABABCBABABA BABABABABABABABABABABADADABADADABABCBABADADCBABADABABABABABADCBABCDAB ABABABABABABABADABADADADABABABA$6B2D3BD7BD6BD13BD2BD4BDBD10BD6B2D9BD 2BD5BDBD11BD2BD11B3D3BD6BD3BD5BD5BD2BD7BD17BD7BD12BD5BD4BDBD3BD2BD7BD 5BD2B2D10BD15BD2BD4BDBDBD9B2D14B2D5BD6B$CBCBADABABABCBABCBABABADABADA DADCBABABCBABABCBADABABABABADADCBADADABABABCBABCDABABABABABADABCBADAB ABCBABABABABABABABABABABABABABABABABABCBABABCBABABABABABABABABADABCBA BABCBABABABABCBABABABABADCDABABABCBABABCBABCBABCBABABCBADCBABABABABAD ADABADABABADABADABABABABABABABABABABABABABABABCBABABABABABABCBABABABA BCBCBABA$BD3BDBD5BD4BD2B2D4BD5BD15BD7BD12BDBD9BDBDB2D4BD3BD7BD5BD12BD 2BD2BD4BD6BD6BD2BD4B2D2BD3BD5BD4BD10BD8BD6B2D24BD6BD4BD6BD14BD5BD5BD 24BDBD6BD4B$ABABADABCBABCBABABABABABADADABADABABABABABCDABABABCBABCDC BABCBABABABABADADABABABABABABCBCBABABABABADABABABCBABABABCBADABCBABAB ABCBABABABADADABABABABABABABABABADABADABABADADABABABABABABABABADABABA BABCBABABABABADABABABABABCBABABABADADCBABABABCBABABABABABADADABABABAB ABABABABABABABABABADABABABCBABABABABADABABABABABA$20B2D13BD6BD10BD8B 2D7BDBD4BD5BD2BD8BD8B3DBD6BD5B3D4BDBD18BDBD3BD11BD2BD17BD13BD11BD9BD 12BD11BD14BD17B2D2B3D10B2D5BD5B$ABCBABABCBABABABABCBABABABABCBABABADC DABCBABADCBABABABABABADABABABABCBCBABCBABABABABABABABADABABABADCBABCB ADCBCBCBABABABABCBCBADADABABCBCBABADCBADABABABABABABCBADABABABABABABA BCBCBADABCBABABABADABABABABABABABABABABABABABCDCBABABABABABABABABABAB ABABABCBCBABABABABADADADABADABABABCBADABABCBABABABADADADABABABABABABA $3BD4BD2BD21BDBD5BD2BDBD2BDBD3BD14BD21BD11BD7BD5B2D2BD2B2D6B2D14BD16B D7B2D4B3D6BD5BD7BD13BD4BD2BD4BD2BD5BD2BD7BDB2D9BD12BD9BD8BD4BD11BD$AB ABABABADABABABABABABADABADCBABABABCDABABABABCBADABABABABABABABABADABA BADABCBADADABADABCDABCBABABCBCBABABADABABABADADADABABABABABADABCBABAD ABABABABABABABCBCBABABABABABABABABABABADADABADCBABCBADABADABCDABCBABA BCBABADABABADABABABABADABADABCBABCDCBCBABABABABABCBABABABABABABABABCB CDABABABCBABCBABADABADABABABABABCBA$3B3DBD20BD6BD9BD3BD13BD5BDBD3BD 20B2D2BD15BD4BD22B2D3BD6BD2BD8BD27BDB2D13BD2BD12BD5BD3BD3BD4BD16BD7BD 5BD3BD12BD12BD2BD$ABABABABABADCBABCBCBABCDABABABABABCBADABABABCBABABA BABABABABABABABABABABABABADABCBABCBABCDABABABABABABABABABABABABABABAB ADABADABABABABADABABABABABABABCBABABABABABABCBCBABABABABABCBABABABABA BABABABABCBABABABABABABABABABABABABABCBABABABABADABABABABADABCBABCBAB ADABABABCBABABADCBADABADABABADABADABABABABABABADABADABA$11BD3BDBD15BD 2B2D6BD6BD8BD17B2D7B2DBDBD11BD15BDBDB2DBD2BD2BD13BD13BD3BD5BD14BD5B2D BD5BD5BD5BD6BD5BD5BD4BD7BD5BD4BD15BD8BD11BD3BD2BD3BD6BDB$ABADABABADCB ABABADCBABABABABABABABCBABABADABABABABABABABABABCBABCBABABABABABABCBC DADCBABABABABABABABABABABABABABADADADCBABCBABABABCDABABABABCBABABABAB ABCBCBABABABABABABADABADADABABABABABADABCBABABABABABADABCDABABABABCBA BADABCBABABABABABABABCBCBABABABABABADCBABABCBABCBABADABABABABABABABAB ADABABABABABCBCBABABABABA$3BD2BD11BD5BDBD19BD2BD22BDBD2BD5BD7BD7B2DB 3D5B2D2BD15BD6BD15B2D10BDBDBD2BD4BD5BD5BD8BDBD16BD9BD10BD5BD14BD11BD 3BD3BD12BDBD3BD6BD4BDBD$ABABABADABABABABABADABABADABABABADADABABADABA BABABABABABCBADABABABABABCDABABCBABABADCDABADABABCDABADABABADADABCBAB CBABADABABABABADADABABCBABABCBCBABCBADABCDADABABABABCBABCBABABABCDABA BABABABABADABABADABABABABABABABABABABADABABABABABABABADABABCBABABABCB ABADABABABABCDADABABABABABABCBABABABABABABABABABCBABABABABADA$D3BD4BD BD7BD15BD6BDBD12BD12BD4B2D7B2D7BD10BD10BD2BD6BD2BD8BD19BD18BD5BD7BD2B D4BD4BD3BD10BDBD6BDBD11BD6B2D13BD5BD2BD2BD2BD10BD5BD2B2D2BD7BDBD$ABAB ABABCBABABCBCBADABADCBABADABABADABABABABABABADABABADCBABABADCBABABCBA BABABABABABABADCBCBABABABABABABABABADABADABABABABABABCBABABCBADADABAB ABABABABABABABCBABADABABCBABABABABCBABABCBADABADABABABABCBABCBABABCBA BABABABCBCBADCBABABABABABABADABABABABABADADABCBABABABCDABABABABABABAB ABADADABABCBABABABABABABABABABABA$B2D11BD3BD9B2D8BD9BD4BD3BDBD6BD11BD 17BD5BD17BD6BDBD14BD9B2D3BD5BD8BDBD2BD7BD2BD2BD8BD7BD2BD4BD5BDBD6BD 20BD16BDBD3B2DBDBD4BD4BDBD2BD7BD2BD3BD$ABCBCBABABABABADABABABABABABAB ADCBABADABABABADABABCBABABADABABABADABABCBABABABABABABABABABCDABADABA BABABABCBABABABABABABABABABABADADABABABCDABABABABABABCBCBABABADABABAB CBABABABABABABABADABABADABABCDABADABABCBABABCBABABCBABABABADABABADABA BABABABABADABCBABABABABABABABADABADABABABABABADABABABCBABCBABABABABAB ABABABA$BD5BD5BD14BD2B2D9BD4BD2BDB2D17BD20BD2BDBD3BD6B3DB2D4BDB2D6B2D 2BD9BD4B2D4BD5BD5BD13B2DBD2BD14B2DBD2BD14BD14BD7BD2BD6BD11B2D6B2D2BDB D7BD6BD13BD3B$CDCBABABABABCBABADABABABABABABCBCDADABCBCBABABABABCDCBA DABABABCBADABABABCBABADABABABABABABABADCBABADADABABABABCDCBADABCDABAB ABABADABCBABCBCBABABABCDCBABABABABADABCBABCBCBABCBABCBCBADABABABADABC BADCBABADABADABABABABCBCBADCDCBABABABABCDABABABABCDABCBABADABABABADAB CBADABADABCBABABCBABABADABABADABABABABABABABABABABC! golly-3.3-src/Patterns/Margolus/TripATron.rle0000644000175000017500000000465112026730263016201 00000000000000#CXRLE Pos=-25,-25 # Trip-a-Tron, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # Compare with the pattern generated by Turmites/ComputerArt.rle # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:none # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 1,1,1,1 : 0,0,0,0 x = 50, y = 50, rule = TripATronMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABAB ABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$A BABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABA BABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABCDABABABABA BABABABABABABABABABAB$18B2D30B$ABABABABABABABABABCDABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABCD ABABABABABAB$36B2D12B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABAB AB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABA BABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABA BABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABA BABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABA B$50B! golly-3.3-src/Patterns/Margolus/HPP_large.rle0000644000175000017500000010340612026730263016116 00000000000000#CXRLE Pos=-100,-100 # HPP Gas implemented in the Margolus neighborhood, as described in: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # one particle moves to the opposite corner # 1,1,0,0 : 0,0,1,1 # two particles pass through each other # 1,0,0,1 : 0,1,1,0 # two particles collide head-on # 1,1,1,0 : 0,1,1,1 # three particles pass through each other # x = 200, y = 200, rule = HPPMargolus_emulated:T200,200 4BDBDB2DBDBD2BD3B3DB2D3BDB4D3BD2B2D7BD3BD4BD4B5D2BD4BD3BD4BDB3D6B3D3B 2DBD3BDB2D2B10D2BD2B6D2BDBD2B7D2B2DB2DB2D2B2D2B3D4B4DB4D8BD2B3D4B$BCD CDCDCBCDCDCDABABCDADABCBADCDCDCBCBADCDCBABABCDADCBABABCDCDABCDCDADADA DCBCBCBADCDCDCDABCBCDABCBCDADADABCDADADCBCDCBCDABADCBABADADADCDADABCB ADABABCDABCDCBCBABCBCBCBCDCBABABCDCDADCDCBABADADADABABCBADC$2BDB3DBD 2BD2BDB3DB4DBDBD3B2D4B4DB2DBDB3DBDB2DB2D5B2DBD2BD2B5D2BD2B4D2B2D2BDBD 2B3D2B4DBDBD2BDBDB3DBD2BD2B5D4BD2B3D5BDB2D7B2DB3D2BD2B2DBD2B3D3B3DB2D 5B2D2B2D2BD$BCDCBABCDCBABCDCBABABABCDABADABADCDADADCBCBCDCBADCBADADAD CDCBCBCBCBABABCBADADCBCBCBABCDABCDABADABABCDCDABCDABCBADADADCDCBCDADA DCDCDCBABCDCBABCDADADABCDABCDCBCDADABADADCBCBCDADCBABCBCDADABCDABCBAD CBABA$D5BD4B3DB2DB4D3B4DBD2BDBDBDB2D3BDBD2BD2B2D3B2D2B3D2B4DBD2B2DBDB DBD5B4DB3D2BD4BDBDB10D3B2D3B2D2B2D3B6DBDBDB4D2B3D3BD7BD2BD2BD2BD7B2D 5BD7BDB2D$BCDADABADADABCBADCBADCBADCDCBABADADADCDADCBADCBCBADADADCDAD CBCDABADCBCBADCDCDCBADCDABABCBCBADABADCDADCDABCBADCDADCDABADCBABABCDC DABABADCDCBADCDCDADABABADCBCBCDABCDCBABADCDCDABCDADADCBCBABABADCBADCD ABA$BD3BD2B4DB2D3BD2B6DBD2B4DBD3B5DB3D2B6D2BD2BDBDB12DBDB2D3BDBD2BD2B 3DB3D3BD3B4DBDBDBDB2DB2DB5D2BDB3DBDB2DBD4BD3BD3BDB4DB7DB3D2BDB2D5BD2B 2DBD2BDBDB2D$BADADABCDCDABCBABADADCBABCDCBADABABCBCBCDABABADCBADCBADA DCBABCBABABADCDADADABABADABADADADCBCBABCBADABADCBCBCBCDCBCDCBCDCDCDAB CDCDCDABABADABABADCDCBADCDCBCBCBCDADADADCDCDADABCDADABCDCDCDCBCBCBCDA DADADA$BDB2DB2DBD2BD2BD5BDBD2BDBD2B2DB2DB2DBDB2DBDBD3B3D2BDB2DB4D2B3D 2BDBDB6DB3DBD2BDB2D3BD3B2D2BD2B2D2BDBD3B2DBD2B3D6B4DBD2B2DB3D2B3D3BD 6B2D2B4D3BDB9D2BD3BDBDB2DB2DB$DCDADADCBCBCDCBCBABCDCDADABADCDCDADABAB CBCDCBCBADCBADABADCDCBADCBABCDCBABADCDABCBABADADABCDABCBCDCDCDABADADC BCBADADABADADABADCBADABADCBCDADADABABABCBABABABCBABCDCDCDCBABCBCDADCD CBCDCBCDCDCBABADCDABADC$2BD3BDBDBDBD2B4D3B2DB2DB4DB3D2BD2B4DB3D2B2D2B DB3DBDBDB3D2BD6B4D3BD2B3DB4D3B4D3BD3B7DBD2BD2BDB2DB2DBD2B3DB3DBD3BD3B 6D2B4D2BDB4DBD3BDB4D3B5DBD3B3D3B$DADCDCDCBCDADADABADCDABCDCDCBCDADCDA DABCDCBADCDCBABCDCDCBCBCDADCDCBCBCDABCDABABADABABCDADADCBCDABCDCDABAB ADCDCBCDABCBCBABCDCDCDCBCBADABCDCBABADABADADCDCBCDCDCBCBADABABCDABABC BCBCBCBCDCDCBABADCBABCDCBA$2D3BD2B2D2B2D3B4DBDB2D2B4DB3D2B2DB3D2B2DB 2D2BDB2D7BD2B4DB2DBDBD2B2DBD2B4DB3D2B2DB2DB2D3BDB4DB2DBDB4D2BDB6D3B3D 2BD2B2D2BD2B3D4B3DB2DB3D2BDBD4B7D2B3D3B2D3B2DB$DABABADADADABADADCBADA BCDADCBCBCDCDABCDCBABABCDCBCDADCDCDABABADABABADABCDCDCBCDADCBCDCDABAB ABABCDCBABCDCBCBABABABABABCBCBABADADADADADADCDABADADABADABCBCBADADCDA BADADCDCDADABABCBADADCDCBCBABADCDCDABCDC$DBD2BDBDB2D2BD2BDBD3B3DB2D3B 4D2B2D5BDB2D3B10D3BD2BDBDBDBD2BDBD2BD3B2DB4D2BD3BD4BD2BDB5D3B2D2B2DB 3D2BDBDB2DB2DBDBD2B4DBDBDB2DB2D2BD3B2DBD2B8DBDB3DB2DBDBDB3D2B2D2B$DAD ABCBCBCDCDADADCBADCBABABABCBABCBCBADCDADCDABCDABADCBADCBCBCBCBADCDCDC BCBADCBCBABCDCDCBABCBABADCDCDADCBCDCBABADABCDCDCDCBABCDABADABADCBCBAD CBCBCBADADADADABABADABABCDABABADADCBABABADABCBABCBCDCDCDCBC$B3DB2DB3D 4B3DB2DBD3B2D2B7DB2DB2DBD2B2D2B3D3BD6B2DB5D2BDB4D4B2D2BD2B5D3BDB3D3BD 4BD2B2DBDB2DB3D3B2DB2DBDBD3BDBDB3D3BDB2DBD2B2DBDB2D3B2D4B3DB2D2BDB5DB 2D3BD2BD$BCBCDABCBABCBABCBCDABADADCDCBCBCDABADCBCBADABCBABADADADABADA BCBABCDABCDCBABCDABABCBCBCBADABADADADCBCBABCDCDADCBCDCBABADADCBCBABCD CBADADCDCBCDADADCDCBADCBCDCBABCBCDCDADABADABABCBCDABABCBADABCDABADABC BC$2B3D6B4D4BDB2D2BDB2DBDB2D4B3D2B2DB2D2B2D3BD3BDB2D3B2D2BD4BD2BDB3D 3BDBD3BDBDB2DBDBD2B5D3B3D2B2DBDB2D2BD3B2D7B6D3B4DBDB4DBD2BDB3DB2DB2D 4B3DBDB2DB2D2BDB2DB2DBD$DCDCBCBCBCDCBADABCDCBADCDCDCDCBCBCBCDCBABCDAB ABCDCDABCBCBADCBCDCBABCBADABADCDCBCBABADCDADABCBABCDCBCDCDCDADABABADC BABCBADCDADABABABCDCDCDABCBADCBCDABABCBCBCDABADCBADADCDCDADABABABABCD ADABCDABADADCDADA$DBD3B2D3B4D2BDBDBD4B2DB3DB3DB3D5BD2BD2B5DBDB5D2B2DB 2DBD6BD5BD2BDBD9B4D4B10D3B5D2BD2B7DB2D3B2DBD3B4DB5D4BDBD2B2DBD2BD3BD 2BD2B4DBD2BD2BD2B$BABABABABADADADADCBCBABCBABABCBCBABCDCBCBCDADCBABCB ABCDCDABCBCBABCDADCBABCDABABADABCBABABCDCBADABCDABADCDCBCBABCDADABABC BCBADABCBADCDABCDCDCDCDADABADCBCDABCBABCBABCDCBABCDABADABCDCDADCDCDAD ABADCBADCBA$2DB2DB2DB2D2B3D2B7D2BDBDBD2B2DB4DBDB4D5BD7B4DBDBD2B3D2B2D B3D5B2D3B3D2B5D3BDB3D3B2DB2D3BDB2D2B2DB2DBDBD3B2D3B3D3BDB3D2B5DB2D2B 5D3BD3B2D2BDB3D3BDB2D2BD2B$DCBCBCDABCDABABCBABCDADCBABADCBADCBCBCDADA BCBCBADCDCDADABCDADCBCDABABABADABADADADABCDCDCBCDCDADCDADADCBCBCBCDCD ADCDADCDADCDABCBCBCBABABADCDCDCDCDCDCBABCBABADABCBABABCBCDABCBABCDCDA DABADCBADABCBCDCDCDC$DBD3B2D2B2D4B2DB2D2BDB3DBDBDB2D2B2DBDB3DB4DB2D5B DBDBDB2D2BD3B4D2B2DBD2BD4B2D5B2D2B4D5BD3B2DB3DB3DB3D3BDB2D4BDBD2B2D 15BD2B2DBDB2DB2D2B2DBD3BD2BD6B2D3BDBD$BCBCBABADCDCDCDABABCBABCDABCBCD ADABCBABCBADABCDADABCBADABCDABCDCBADADABCDADCBCDADABCBADCBCBCBADCDABA DABCBABABCBABCBCDABCDADCDABCBADCDCDCDABABCDADCBABABCBADCDABABADADCDAB CDADCBABADADCDADCBABCBABADADCBC$BDB3DBDB2DB2D2BD3B3DBDB4DBDB2DB2D2BDB 3DBD3BD2B3D2BD3BD3BD3BDBDB2D3B2D5B3DB4DBD3BD2B2DB2DBD3B4D2B2D2BD2B3D 4BD4BD3B5D2B2DBD2BDBDBDB7D2BDBD4BD7BD2BDB2D4B2DBDB$BCDABADABCBCBCBCBA DADABADCBCDCDCBCDABADCBADCDADCBABADABCBCDABADADADADCBABABCBCBCBCDCBAD ABABABCDABADCBCDABABABCBABADABCBABCDADCBADCDCDCBCDCBABABCDADCDADCBCBC BCDADCDCDABADCDCBADABCDCDABABCBABADABCBABADA$2BDBD5BDB2D3BDBD8BDB6D3B D2B6D2BDB3D4B4DB2D4BD4B7DB4DBD2B4DB4DBD3BDB2DB2D3B3DBD2B2DB4D3BDB2D2B D4BDBD4B5D3BD3B2DBDBDB2DBD3B5D5BD2BDBDB2D3BDB$DCDCDABABABABABCDCDCBAD CBABCBADADABABCBCBABCBCDCBCDCDCDCBCDCDCDCBADCDCBADCBABADCDCDABADCBABC BCDCDADCDCBCBABCBABABABCDABABCBADABCDCBCDCBABABCBADABCDADADABCBADCBAB CBADADABADCDADABADCBABCDADABABADADADABC$3DBDB2D3BDB2D4BDB2D2BDB2DBDBD BDB2D4B2D2BDBDB2D2BD4BDBDBD2B3D4B2D2BDBD2B2DBDB2D2BD2B2D2BDB4DB3DB2D 2B3DBDB3D2BDB4D3BDBDB3D2B3D2B4D2B3DB3DB4D2BDB4DBDBDBDB2DBD6BDB2D3B2DB $BADADCBABADADCBADADADADCDADCDCBADCDADADADADABCDCDCBCDCDCBADADADABCDA DCBADABADABADCBCBCDCDABCBABABCBCBABADABCDCBABADADCDABCBCBCBADCBCBADAD ABADCBADABADCBABCDCDCBCDABADADCBCDABABABABADCDCDABCBCDADADCBCBC$5DBD 2B2DB2DB6D3B2D4B3DBD2B3D4BDBD3BD2B2D3B3DB7DB4D2B2D2BD2BDBD2B2DBDB3DBD B3DBDB4D2BDBD5B6D6B3DB2DBD2B3D3B2DBDBDB5D2B5D3B3DBDB4DBD12B2D2BDBD$DC DADABADCDABCBCDCDABADCDABCBCBCBABCDCBABADCBABCBABCBCBCDABCDCDCDCDCBAD ADABCDCBABABADCDABCDCBCDCBCDCBCDADABCDABCDCDCDCDABABCDADCDCBABCBADABC DCDABADADCDCBCBCDADABCDADABCDABADCBCBADADABABCDCDCBCBABADCBA$BDBDB2D 3BD2BD2BD7BD2BDB3DB3D3B3D2B2DBD2BDB3DBD3B3D2B2D2B2D3BDB2DB6DB5D2BDB7D B2DBDBDBD2B2D2B2D2B2D4BD2BDB2D3B3D2B8D2B2DBDBDB2D2B3D2B3DBDBD3B4D4B7D B5DB$DABADADADADABABCBADCDCBADADADABADABCBADADADCDADCDADCBADADCBCBCBA BCBCDCBABCDADCDCDCBADADCDADABABCBCDABCBCDABCDADCDABABADABABCBCDCBCDAD CBCBCDADABADADABADADABCDABADADCBABABCDABADABADADCDADADADCBCDCDCBADA$B DB2D3B2D5BDBDB6D3BDBDB4D2B3D5B2DBDB2DBDB4D3BD2B9DBD2BD4B5D2BD4BDBDB3D 3B2D2BD3BDBD6BD2BDBD2BDBD2BDBD3BD4B2D3BD6BDBDB2D3B2D2B3DBD2B4D2BDB2DB 3D3B2DBD$DADCBABABCBADADCDCBADABABADCDCDABADABADCDADADABABCBCBADABADC BABCBCDCBADABADABABCBADCBCDADADADCDCDCDABADADCDCDADADCDCDCDABABABABCB ADCBCDABCDADCDCDCBCDABADCDABCBCBABABADABCDABCBABCBCDCDCDCDABCDCDABADA DA$DB2D2B2D2BDB4D5B4D2B4DBDBDB3D2BD4BD2BD3BDB3D3B3DB2DBD2BD2BD2BDBDBD 2BDBDBDB4D2B2DB2DBDB2DBDBD2B2D3B2D3BD2B2D2B2DBD2BD3B5D2B3D8B3DB2D3B2D BDB2D6B2D4BD4BD3B3D2BD$DABADCDCBABABADCDADADCBADADADADCBABCBCBADABADC BADABADADADCDADABCDCBCDCDCDABADADCBCDADCDADCDCBCBCDCDABABADCDCDABADCB CDCDCDADADCBCBADABCBABADABCBADABCDCBCBCDCDADCDCBADCBCDADADABCDCBCBADA BCDCDABABADADCDC$2B2D4B2D2BD2B2D2B2DB4DBDB2D3BD2BDB3D2BD2B2DB2DBD3BDB DBD2BD2BDBDB3D3BD2BD5BDBD2B3DBD4B2D3BD3B2D2B2DB4D2BDB4D2BDBDBDB2DB4D 2BDBDB2DBD3B2D5B2D3BDB3D4BDB3D3B5DB5D2B2D$DCDABCDCDADADABCBCBADABCDCD CBADCDADABCBABCDADADADADABCDCDCDCDCBADCDADADCBABADABCBADABADCDCBADCBA DCDCBADCDABADADCDCBCDADCBABCDADCDCDADCBCDADADADABCBCBCBCDABABCBADABCD CDADADCDCDCBABABADADCDABADCBCBABCBC$D2B2DBDB3D4B2DB2D2B2DB2DB2D3B3DBD B3DB5DB3DBD2B2D2BD4BDBDBDBDB2DBDB2DBD3B5DBDB3DBDBD4B2DBD2BDBDBD2BD5B 2DBDBDBDBD4B2D2BD5B2D2BD2BDBDBDB2DBDBDB3DBDB4D2B3DBD2B2D2B2DB2DBDB2D$ BABCDADCDADABCBCBCDCDCDCBADCBADCDABADABABABCDABADCDCBABABCDABADCBADAB ADADCDCDCBCDADCBABABCBADADADABCDCDCBADADCDCDCBABCDADCDADCDABCDCBCBABC DABCDCBCBCBCDCBCBADADCBCBADADCDABCBCDCDCDCDADCDCDCBABCDADADCDC$2D2BD 2B2DBDB3D2BDB3DB2D4B8D3B3D4B3DB2DBD2B2DBDB3D5B2DB2D4BDB5DBD2B5DB2DBDB 2D2BDB2D4B8D5BDB7D2BD2B4D2BD3BDBD2BDBD4B4DBDBDB3D2B2D2BDB2D3B2D2B5DB 3D$DCBADCDCDCBABCDCBADCDABADABCBCDABABADCDCDABADADCDCBADADADCDABADCDA DCBCDADCBABABCBABCBCDABABCBADCBCDCBCDADCBCBADABCBADCDADABADCDABABADCD ADCBADCDADCBCBCDCDCDCDCBCDADADABADADCBADCDCDABABCBABCDABABADCDADA$DB 2D2B4D2BDB2DB3DB2DB2D2BDBDBD3BD3B3DBDB2D2B2DBD3BD4B3D3BDB2DB3DB8DBD2B D2B2D9BDB2DB2D2BDB3DB2D3BDB3D4B4DB2D2BDBD2BD3BDB4D2B2DB2D2BD2B2D9BDB 4D2B3D2BD2BD4B$DABABCBADCBABCBCDCDCDADCDADADADADCDABCDCDABADADADCBABC BADCBADADCBCDCBABCBCBCBCDABCDADCBCDCDCDADCBCBABCDCDADCDCBCBCDABCBCDCB ADCBABCBCBCDCBADCBADADABCBABCBCBABCBCDCBADABADABCDABABADADADCDCBADADA DADCBABC$DBD3BD2B2DB2DBDBD2B13DB2D2BDB2D2BDBDBD2BD2B4DBDBD2B3DBDB2D2B 2D2BD3BD2B2DBD4B2D2BDBDB2D2BDBDBD2B2DBD3BDBDB3DBD5B2D2B4D2B2D2B2D3B6D BD3BDB4DBDB3D3B2DBDBD2B5D2B3DB3D$DCBABABCBADCBCBCDCBABCDCBCDCBADADCDC BADABABCBCDADCBADABABABCDADCDCDABABCDCBADCBADCBCDADCBABCBADADCBADCBAB ADCDCBABABCDCBCBADCDCBABCBCBADABABADCDCDABCDABCDABABABCDADABADCDCBADA BABCDCBABABCDCBADADADCDCBC$BDB2D3B2D5BDBD6BDBD2B2DB5D4B2D2B3DB5D2BD3B 5D2B5DB2D2BDB3DBDBDBDBDB2D3BDBD3BDBDBD5BD2B2DB5D2B4DBD2B3D3B2D2BD2BDB D3B2DBD2BDB2DB4DB2DBD9BDB2D2BDB3D3B2D2BD$BADCBCDADCDADCBCBADCBCBABCBA DADCDABABCDABADABADCDABADADCBABCDABABCBCDABABADABADADCDADCBCBABCBABAB ADCBCBCDADCDABADADABCDABABADADCDCBABABCDCDADADABCDADADABCDCBCDCBABABC BADADABADADCDCBCBCDABCDCDADADABABC$2D2BD4BDB2DBDBDBDB2DB3D2BDB2D3BDBD 2BDBDB2DB2DBD2BD3B3DB2D4BDB5D2BD7BDBDB2D2B2DBDBDBD2B2D3BDBDB4DB3D2B2D B2DBD4BDBDBD3BD2B2DB2D2BD2B2DBD5BDBDBD3B2D3BD4B3DBD5B2DB3DB2DB$DABABA BCBADCDADADABADCBCDCBCDCBABABABABCBCDCBABCDCDABCDADCBADCBADADABADCBAD CDADCBADCDCDCDADCDCBCBCBCBCDCBCBCDABADADADABADADADADCDCDCDADCBABADCDC BCDABCBADADADADCBABADCBCBADCBCDCBCDADCBADADCDCDABADCDCBC$2B2DB2D4BD5B 3DB4D5BD4B2D5BD3B2D4B4DB2DB3DBDB5DBDB3DB5DB3DBD2BDB2DB5DB2DB2D2B2DBDB 2DBD6BD2BD5BD2BDB2D3B5D3BD3B2D5BD2B4DBDB3DB2DBDBDB3DB6DBD4BD$BCBCDCDA DABCBADCBADCBCDCDCBABADCBADCDADCDCBCBADCBCDCBABABADCBCDCBCDCBCBADCDCB CDADADADADABABCBADCDCDCBABABCBCBADADABADABADABCDCBCBABCBABADADCDCBADC DCBABADCDABADADABCDCBCDADCBABCBABCBCBABCDCDCBADCBADABA$B2DB2DBDB2D2BD BD2B5DBD5BD2BD2BDBDBDB4D2BD2BD3B2DB3DBD3B5D2BDB2DBD2B3DBDB2D4B9DB2DBD BDB3DB3D7BDB2DBDBDB3DBD3BDB3DB4DBD4BD2BD4BDB2D2B2D2B3DB3DBDB2D3B3DBDB 2D2B$BADCDADCBCDABADABCBCBADABCDCDABCDABADCDABCBABCBCBADCBABCBABABABA DABABCDCBCDADABABCBABADCDADCDCDADCBADABADABABADCBABCDCBADCBCDCBCDCDAD ABABABADADCDCDCDABABCBCDADCBCBABCDCDCDADCDCDADCBCDCBCDCDADADCBCDCDC$D BD2B2DBDB7DB3DB2DBD2BDBDB4DB3D3B2D3BDBDB2DB2D3B2D4B2D4BD4B3D6BDB2DB3D 7B4D2BD2B3D2B2DBD3BDBDBD5B4DB2D2BD2BD4B2D2BDBDBD2BDBD2BDB6D2B8DBD2BDB 2DB4DBD2B$BCDADCBCBABCDADABADADADCDADABADABCBCDADADCDABABABADADADCBCB ABCDABCDABCDABABABADCBABABCDCDABADCBCBCDADABCBABCDCDADABCBABADCDADABA DCDCBCBABADABCBCBCBCDABCBCDCDCBADADCBCDABCDADCDCDCBABADCBCDCDCBADCDCD CDC$2DBD2BDB2D3B7DB2DBDB3DB2DB3D5B2D2BD5B2DB2D3BDBDBD3BD3BD2B2DB2DBDB D2B2DB2D2BD3B3DB2D3BD4BDB4DB4DBDB6D3BDB5D2BDB5D2BDBD2BD2B2DB2D8B2DBD 3BDB5D2BD3B3D4BD$DCBADCBCBCBCDCDCBABCDCBADCDABABCDADADCDCBADABADADCBA BADCBCDABCDCBCDCDCDADADCDADABCBABCBABCDCDABADCBCBADCDABADCDADCBCDCDAB ADCBADCBCDCDABABCBABCBCDCDCDCBABADCDCBCBADCBABCDABCDADABABABCBCDADCBC DADADABCBA$D2BD2BDBD2BD3BDBD2BDBDB2DB2D2B2D4BDB2DBD3B9DBDBD2BD2B2DB2D B2D2B5D3BD3B3D4B5DBD2B2D3B4DB10D2BDB3DBD3BDBDBDB2D2B2DB4DB2DBD4BDBD3B D2B4DB3D3BDBD4B3DB7DBD$BADABCBABABADABCBADADADADABCBABCBCDCDCBABADADC DCDADCBCDADABCDADADCBADABCBADABCBADCDADCDCDABCDCDABCBCDABCBABADCBADCD ABCDCBCBCDCDADCBABCBADCDABADCDABABABCDCBADADCDADCBCDCDCBADADADADADCDC DCDCBABCDCBCDCDA$D3BD2B5DBD3B2D7B2DB2DB7DBDB6D2BDBDBD3BD2BD6B4D3BD2B 2D2B3DB2DBDBDBDBDBDB2DB3D3BDB3DBD2BD3BD3B3D3BDBD2B2DB3DBDBDB2DB3D6BDB 2D2BDB5D2BD2BDBD3B4D4B2DB5DB$BADCDCDCBCDCDADABCBADCBCDCBCBCBCDABABABA BADCBCBCDABCBCBABCDADABCBCBABADCBADCDADCDADABADADCDABCBCBCBABCDCBABCD ADCBABADADADCBABCBCBCDABCDABABABABABCDADABCBCDABCBCDCBCBADCBCDADADCDA DADABABCBADCDCBCDCDCDA$D2BDB2DB3DB3DBDB2D4BDBDBD2BDBDB2DB2DB2D2BDBD3B 2DBDB2D4BDB3D3BD4BDBD2B2DBDBD2B3DB2DBD2B4DBD4B2DBDBD3BD2BDB3D2BDBD2B 6D2B2D11BD4BDB3DBDB3DBD4BDB2DBDB2DBD2BDB3D3BDBDB$DABABADADADADABABCDA DCDCBABABCBCBCDCBCBADCDADADABCBADCBABABABCDCBABABCDABCBCBCBABCDCDCDAD CBCBADCDCBABCBCBCBCDCBABCBADCBABABABADABCDCBCBCDCDADCBABABCBADADABADA BCDCBADADCDCBCDADADCDCDCDABABCDCDCBADABCBC$2B2DBD2B4DBD3B3D3BD2B2D4B 2DB2D2B3DB2D3BD3BDBDBD6B9DB4D2BD3BDBD2BDB3DBDB2D4B2DB2DBD2B5DBD6B3DB 2DBD3BDBD4BD2BD3B2DBD4BD3BDB2D2B2DBDB3DBD2BDB3DBD4B2D2B2D2B2D$BABCBCB ABABCBCBCDADCBCBCDABABADABCDADCDABABABCBABABABCBABADCDCBCBABCBCBADCDC DCDCBADCBABADADCDCBCBCBABABCBCDABABCDABCBADABCBADCBABABCDABABADCBADAB CBCDABCBABABCDCBCBCBCBABADCDCDADCBADCBADADCBABCDCDABCBC$2B3DB2D2B2DBD B2DB3DBDBDBDB3D2B3DB2D5BD2BD5B3D4BDB3DB2DB2DB2DB2DBD2B2D3B6DBDB6D2BDB D2BDBDB2DB4DBD2BDBDB2D2BD2BD5B2DB3D2B2DBDB2DB2DB2D2BD6B2D3BD3B2DBDBD 4B2D4B5D$BADCBCDCDABADADCDCBCDABADADCDADCBABCBABCBADCBCDADADCDADCDABC BCBABCDCBABABCBCBCBCBABABADADABADADCDCDABADADCDABCDADCDADABABCBCBCBAD CBADCBCDCDADADABCBABADCBABCBCDCDADABADABCDCBCBABABCBCDADABCDABCDCBCBC BC$BD4BD2B5D2BD3BDBDBDBDBDBD2B3D2B4D2B5DB2DB2DBDBDB2DBD2BDBD2B2D3B4D 7BD3BD2B7D2B2D2B2DB2DB2DBD4BD5BD2B2D2B7DB3DBD3BD2B2DBD3BD3B2DBDB2DB2D B3DB3D2BDBD6B2DBDB2D$DABADCDADABCBADCBADCDABADCBABADCBCBABCDADADCBABC BABABCDCBADABABCBCDCDCBADCDADCDABCDCDCBADADCDCDADABADCDABCBCDABADABAD CBCDCDCDCDCDCBADABCBABCDADADABCBCBABCBADCBADCBABADABCBADCBABADCBABCBC BABCDCBCDCDABA$3B2D2B2DB3D2B3DBD2BD2BD2BDBD5B2D2BDB2DBD2B3D2B5D2B4D3B 2DBDB3D5BD3B4DBD3BDB3DBD2B2D3B3D3B2DB2DB4D4B2D2B2D3B4DB2D3BD5BDBD4B2D 4BDB6D2B2DB3DB2DB5DB4DBDBDB$DCDCBABADABCBCBABABABADADADCDADCBCDABADAD ADABADADADCBADCBCDCDCBCBABADCDADCDADCBCDADADCBCDCDABCDADCDCDABADABADA BABADADCBCBCBABADCDABCBCBADADCDABCBCDCBABABABCDABCDADCBCBADCDADABCBCB CDCDADABABCBADCBADCDC$5BDBDB3DBDBDB2D2B2D3B2D2B3D3BDB2DBD6B2DBDB4DB2D 6BDB3DBDBDBDB3DBDBDBD2B2D2B5DBD8B3DB3DB2DBDB3DBDB2D2B2DB4DBDBD3B3D2BD 2BDB3DBDBDBDBD5BD2BDB3DBD3BD3B6D6B$BABADADADABCBCDADABABADABCBCBADCDA DADADCBCBADADCBABABCBCBADABCDABADABCBABADABCDCBCBADCBCBADABADCDADADAB ABADADCBABCBADCDCBCBADABADABABCDCBABCBADCDABADCBCBADCBCBADABCDCDABADA BCBCBCBCDABABCBCBCDCBCBABADC$3BDB3DBDB7DBDBDBD2B2D5B2DBDBD3BD3B2DB6DB D2B4D2BDB2DB4DBD2BDBD2B2DB5DBD2BD6B2DB2D3BDBDBD2BDB4DBD2BDBD2BD2BD3BD 4BD2B2DB2DBDBDB3D2B2D2BDBD2BDBD2B2DB2DB4D3BD2B3D4BD$BABABCBABCBCBCBCB CDCDCBADCBABABCDCBCDCDCDADCDADCBADCDCDABCBCDABCDCBABADABCDCDADADADCDA BCBABADCDABADABADCDABCBCDCBADABCBADCBCDADADCDADCDCDABCBADADCBABABCBCD ABABCBCDADABCBABABABADABCBCDADABCBADCDABADABC$BDB4DBDB3DB5D2BD2B3DB3D BD6B3DBDBD3B4DB3D2BDBD3B2D2B5DB3D2B2DBD2B2DBDBDB5D2BD3B2DBDB2DB5D2B2D 3B3D2B2D2B2D3BD2BD2B2D6BDBD4B4DB5DBDB2D2B3D3BD2BD2BD2BD2B2D2BDB$BADAB CBCBABADADCBCDCBABADABCBADABCBCBADADCDABCDABCDCBCDADCDABADCDCBABABADA DABCDCBCBCBCBCDABABCBCBADCDCDABCBCDCBADCBCDCBABADADCBADADCBADCDABCDCD CDABCDABADCDCDABCDADABCBABCBCDCDADABADCDABCBCDADADCBABADA$B4DBD2BDBDB 2DB4DBDBDB4DB2DB6D3BD2B2D9BDB6D3BD3B3D5B2DB2D2BD2BD3B2DB3D2BDBD3BDBD 2BD2B4DBD2B3D2BDB8DB3DB3DBDBDBD3B4DB2DB2D3BD3BDB4D3B2D2B2D6BD2B2D2B$D CDABADABCBCBCDCDADABABCBCBCDABABCDCDCDCDABCBCDABADCBADADCDABCDCDABCDC BCDCDABCDABADABCDCDCDCDABCDABADADCDADABCBABCDABCBCBADCDADCDABABADADCD CDCDADABADCDABABCDCBABADADCDCBABCBADCBCDCDABCBABCBADABADCBADA$3B3DBDB 3DBDB3D4B4D2B2D3B3DB3D4B6DBD3BD2B4D6BDB5DB5DBD3BD5B2DBDBD3BDBDB4DBDB 5DB3DB2D2B2DBDB3D7BDB4D3BD2B4DBD2B4DBD5BDB2DB5DBD3B2D2BD3BD4B$DCBCBAD ADCDCDADADCDADABADABCDCBCBCBABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABCBABADADCBABADCBADCDCBCDCBCBCD ADADADABCBCBCDCDADCDADCDCDCBABABADABABCDCDCBCBCDCBCDADC$7D2B4D4B3DB2D B2DBDBD2BD83B2DBDBDB4D9BD3B3D5B2DBD3BDBDBDB2DB2DB2D2BDB9DB2DBDBD3BD3B 4D$BCDABABCBADABCBADCBCDABADCBCBADABCBABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABADCDCBABCBCBCBABADCD CBADADCBCBCBADABCBCDCBABABCBCBCDADADCDABCDADCBADCDADCDABABCBCBCBA$3DB 4D5BDBDB3DB2D4B3DBD83B2D5BD3B4D2BD2B3D2BDBD2BDBDB2D3BDBDB2D2BDB2D2BD 4B3DB2D3BDB3D3B3DB2D3BD$DCBCBCDABCBADCDCBCDCBCDADADCBCBABCBABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BCDABADCBCBABABCDADADCBCDCDCDCDADCBABABCDCBCBABABABCDCDCDCDADCDADADCB CBADCDADCBADADADA$6D3B4D4B2D2B3DBDB2D86B5DB2D2BDBD2BD3BD2B4DB2D2B2D3B DBDBDBDB3DBDB2DB2DB3D2BDBDB4DBDB2DB6DBDBD$BABCBABCDCDABADCBABADADCBCD ADCDCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABCBCDADADADCBADABCDCDABCBCDCBCBCBABCDADCBABADCBADAD CDCBCBADABCBCBADABCDCBCDADADABCBADC$B4D2B7DB3D3B6D3BD86BDBD2BD3B3D3BD BDB3DB2DB5DBD7BD2B3DB2D2BDBDBD3BD3B2D4B4DBD3BDBD2B$BADADADABABCDABCDC DCDADCDABCBADCBCBABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCDABADABCBCBABCBCBCDADCDADADABADCDABCDC DADCBCDABCBCDCDADADCBADADABCBADCDABCBCDADCDC$2B3D2BDB3D2BDBD2BDBD3B2D 2B4D84BD2BDB2DBDB2DBD2B3D2B2D4B5DBD2BD2BD3B4D4B3DBDBDB4DB5D6BD2BDBD2B $BADCDADABADCDADADCDABABABABCBCDCDCBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABADABCBCDCDCDCDCDADCD CDCBADCDABABADABADCBABCBCBCBADCBCDABCDCDADCDCBCDADCBCDADCDCDADA$5B2DB DBD2B2D2BDBD3BDB3DB5D82B2D3B2DBDB2D3B5D2BDB2DBD2BDBDB2DB2D3B4DB7DBD2B 2DBD14BD4BDBD$DABADCBABADCBCDCDCDADABADCDADABCBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDABABC DCBCDADCDCDCBCBCDCBCDADABABCBABCBCBCBCBCBADADCDADCDCBADCDCBABCBCBABAD CDADADA$BDBD2B8D2B4D4B2D5B2D82BD2B2D2B3D2B4D3BDBDB2DBDBDBD3BDB2D2BD3B 3DBDB2D3BD3B3D3BDBD2B2DBD2B2D2B3D2B$DADADABCDADCBCDADCDCDCDADCDABABCB CBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABCBCBABADABCDADCBADCDABCDADABCDABABCDCDCDCDABCBCBADADCBCB CDCDCDCDCBADCDCDCDABABCBADABA$D3BD8BD5BD2BDBDBDB2DB3D82B2DBDB6DBD2BDB 2DB3DBD3B4D3B2D4B4DBD4BD2B2DBD2B2DB2D2B3DB2DB2D4B4D$BCDCBCDCBCDADABCB CBCDCDABABADADABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABCBCDABADCBCBCDABADCDCDCDCDADCDADABABCBCD ABABADCBADCDADCBCDCDADABCBCBCDADADCDADADABABA$3BDB2D2BD3BD2BDBD5B2DB 2DBDB2D81BDBDB4D2B3D4B4D2BD2BDB2DBD2BDB2D4B2D2B2DB2DB7D2B2D3B2D3BD2B 2D2B2D4BD$DABCBCBABABCDCBABCDCBCBCDABCBCDCDCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBCDABABCDC BABABCDCBCBADCDABABCBADCBCBCDCBCBABABCBCDCDCDABCBADCBABCBCDADADCBABCD CBA$BDB5D2BDB2DBDB2DBDBD4B3D2BD85BDB2D5B6D3BD5BDBD3BDB2DBDB2D2BD4B2DB 2DB2D3BD3BDBDB3D3BDB2DB3DB2D$BCDCBADCBADADCBCBADABADADADADCBADABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABADCDABADADABABADABABABCBABABCBABADCDADCDABCDADADCDADCBADADCBABA DCBCBADADCDADCDADCDCDC$DB2D4BDB7DBDB2DB2D2BD3BDBD82BD2BDBDBDBD5BDBDBD 4B2D2B3D3BD2BDB2DB4DBD2B7D2B2D4B2DB2D2B6DBD4B$DABADABADABADCDADCDCDCD CDCDCBADABCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCBCBABCDCBABADCBCDABADABCBABCBCBABCBABCDABABCB CBABADADADCDABCBADABCDCBCBADADCBCBABADC$2B2DB2D2BD3BD3BD2BD3BDBD2B2D 87BD3B3D2B4D3BDB7D2B2DBDB2D2B3D3BDB3D2BDBDBDBDB2D2B2DBD2B2DB2DB2DBD2B DBD$BCBCDCDADCDADABABCDCDADADCBCBCDCBCBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABCBABADCBADABCDCBCDC BCDADABCDCDABCDADABADCBCBCBABCDADADADCDADCBABCDCBCDABADABCBCDABCBC$2B D2BD5B6D2B2DB2D2BD2BD85BD4BD2B2DBD2B3DBD4B2D4BDB4D2B3DBD5BD2B2DBDB4D 2BDB3D2B4D6B3D2B2D$BCDCDABABABCBABCBADABCDABABADCBCDCBABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDAD ABABADABABCBCDADCBADCBADABADCBCDADCDABABADCDCBCDCDADCDADABABCDABADABC BCDADCBABCBA$DBD3B2DBDB3DB2DBDBDB4DB2D4BD81BD2B2DB2D2BD4B2DBD2B2DB4DB 2D3B4D3B2D3BDB2DB3DBDB3D2B2DB2DBD3BD3B3DBDB2DB$DCBCBADCBADCBCBCDCDABC DCBADADABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABADCBCBADADADABCDABCBCBADCDCBCBABCDCBCBCDCDCBA DCDCDCDADADCBABCDCBABADCDCDCBCDABABCDCDA$BD2B7D2B4D4BDB2DBD3B4D81BD2B 2D4B2DB2DB5D2BD2BD2BDB2DBDB2D4BD3B2D3B4DB2DB2DB2D7BD3B5DB2DBDB$BABADA BCBABCDABABCDADCDCDADABABADCBABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABCDCDADCBCBCBCDADCDADCBCBCDA BABADABCBADABADCDADCDABCBABCDABCDCBCDABCBCBCBADABABCBCBA$DB2DB3D2BD2B 3D6B2DBD2BDBD85BD3B2D2B3DB4D2B2DBDB2DBD4BDB4DBDBDB2D2B2DBD4B2D4B2DBD 3B4DB4DB2D3B2D$BCBCDADABADADCBCBCDCBCDCDABCBABADABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDCBADCD CBABABCBCBABCBADABCDCDADCBABCDCDCBCDCBCBABCBABABCDCDCDCBCBADADCBABCDC DABCBCBC$3BDB2DB4DB4D4BD5B3D2B2D81BD3BD4BD2BDB2D4B2DBD2BD2B5DB2D3BDB 4DB4DB4DB2DB2D3B4DB2D2B2D2BD2B4D$DADCBABABCDADCBABADCDABABCBCBADCDABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABCBCDABCBADABCDCBADADCDCDABCDCDABADADADADABADADCDADADADADADA DADCDCBCBABADADADCBABABADC$5B3D2BDBDBD3B4DBD2BDBDB2D83BDB3D2BDB5DB2DB D3BDBDB2DB2DB2DB2D5BDBD2BD2B5DB3DBD2B3D2BDB4D2B5DB2DB$BABABCDCBCDCBAD ADABADCBABADCDCBADABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABCDCDABCBCDCBCBABCDCBABCDABADABABADCDCD ABCDADABABABCDABCDCBABCBCDCBCDABABCBADCDABADCBC$DB3D5BDBDB2D3B2D2BDB 2D3BD2BD81B3DB2DB7D3BDBDBDBDBD3BDB2D3BDBD2BDB2DBDBD4B2DBD2B5D3BD2BDBD BDBDBD3BDBD$BCBCBCDCBCBADCBCDCDABADABADABCDCDCBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBCBABCBC BADCDCBABCBADABCBADCBCBCBABCBCBCBABCBCBADCBADCBABADCBCDADADADCDCBCDCB CDCDA$2BD2B4D3BD2BD3B3D2BD3BD3B2D83BD4BDB2DB2D2BDBDB8DBD2BD2BDBDB2DB 2D3BDBDBDBD2BD3BD3BDBD5B2DBD2B4D3B$BCDCDCBCDCBADADABCDADADABADADCBCBC BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABCDCDABADABCBCBABABCDADCDABABADCBCDABADCDABADABABCDADCDA DADABCBADCBADADADCDABADCDCBA$DBD2BD4B2D2BDBD2B2D2BD2BD2BD85BDB2DB2DBD B2DBD2B2D2B2D3B2DBDBDBDBD2BD2BD6BD3B3D7BDB6D3BD2B2D3B2DB2D$DCBABADCBA DCBABCBCDADADABABCDCDABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABCBABABABABCBADADADADCDCDCBABCDABC BABCDADCBABCBCDCBCDABABCBCDADABADCDCBADADADCDCDCDCBC$4D4B2D2BD2BD3BDB 3D2BD4BD85B2D2BDBDBDBD3B2D2B4DBD3B2D6B3D2B3DB3DB2DB2D2B2DBDBD3BD4BD8B 2DB2D$DADCBCDCDCDABCDABADCDADCDADCDADABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBADCBCDCDCBA BCDADCBCDABCDCBABADADABADADCBCBCBADCDCBADABABABCBADCBCBABADADCDCDCBA$ 3DBD7BD3BD3B2DB3DB3D3BD84B2DB2DBD2BDB2D3B3DB2D2B2DB3DBDB2D3BDB2DB4DB 2DBDB5D4B5D2BDB3D2BD2B2DB$BABCDCBADCDABCDABADCDCBADADABABCDABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABCDABCBCBCBCDCBCBCBABABADADABADCBCBABABADCDCBCDCBCBADCDCDCDCDABAB ABADADCDCDABCDCDADC$2DBDBDB2DB7D6B4D3B3D83B2DB2DB4DB6D3BD2B2DBDB4DBDB 3DBDBDBDB3D3BDBD2BDBDB3DBDBDBDBD3B2D2BDB4D$DABABCBCBCDCDADADCDADADCBA DCBCBCDCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABADADABABABABCBABADCDADCDCDADABCBCBABCDABCBCBCDABC BABABADADCBADABCDCDADABADCDCBABCBCDC$2DB6DBD2B2D5B2D2BD2B3D2B2D81BD3B 9DB5DB4D2B3DB2D2BD4B6D2B3D2BDBDBD2B7D3B2DB3DB3D2BDB2D$DCDABADADADCBCD ADCBABCDABCDCDCDABCBABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABCBCBCBADCBADADCBADCBADADCBADCDABADADAD ABADABCDADADADCBABABCDCBABCDCDABABADADCBCDCBCDC$3B2DBDBD2BD2BDB2DB3D 7BD2BD82BD2BD2B4D2BDB4D2BD4BDBD2BDB3D2BDB2D6BD4BD2B2D5B2D3BDBD4BDB3D 4B2D$BCDCDABCBADCDCBADCBADABCDCBCBCDABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABADCBADCBCDCBCBAD CBADCBCDABCBABCDADCDADCBADABCDCBADCBCBADCBCBCBABABCDCBCDCBCDCDCDCDC$B DBD3BDBD2B3DB2DBD2B3DBDBDBD86B2D5BD4BDB2DB4D2BD2B2DBDBDBDB3DBDB2D2BD 3BDBD2B4D4B2DBDB3D2B2D2BD2B3DB$DABCDABABADCBADCDCDCDCDCBABABCBCDABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABCDCDABCDABADABCDCBCDCDCDADABCDADCDCDABADADADADABADADABCDCBABC DCDCBCBCBCDADCDCBCDABCDA$3BD2BDB2DBD2BD2BDB2D9BDBD84B3D4B2D5B3DBD2B4D 2B4D2B10DB3D3BD2BDB2DBDB2D2B2DBDBD2B2D5B4D$DADCBCBADCBCBCBABCDADABADA BCDADCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABCBCBADCDCDABCDCBADCDADADADABCDCDADABABCBABCBADCDA BCDADABADCDCDCDABCDADCDCDADADADCDCBC$2B6D3BDBDBDBDBD2BD4B3DB3D81B3D2B DBD5B3D3B2D2B4DBDB2DB2D3BD6B2D7BDB2D2BD3BDB7D4B3D4BD$DADABABCDCBCBCBA BCDADCDADCBADABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCBABADCBABCBCBCBADADADCDADADADABABABADC BCDCBADCDCDADCBCDABADADCBCDCBCBABABCDADCBADADC$DB3D4B3D2B3D3B4D2B7D 82B4DBD2B2D2B2DBDB3DBDBDBDBDB3D2B3DBD4B5D3BDB4D3BDBD5BD2B2D5BDBD3BD$B ABADCBADADABCBABADADCDABCDADCBCDCBABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABCDABABCDCDCDCDCDADCDCDCB ABADADABCBADABCDADCDCDCBABABCBCBABCDADABABABCDADADADABADADCBA$D2B2DBD 2BDBD2B8DB2D2BDB3DBD84B3D2B4DBDBD2BD2B3D3B4D4BD3BD3B3D2B3D6BD4B2D2BDB 2D2BDBDBD2B2DB2DB$BADCDADABADCDABABABCBADADCBADCDADABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABADADC DADCDADABADCBABCBADABADCBCBCDADADCDCBCDABCDADABADCBADCDCBCBCBCBABCDAD CDABCBABADA$B4D3B3D2B3D2B2D3BD2BDB3DB2D82BD4BDBD2B4DBD2BD4B3DB2D2BD2B DB4D2B6D3BDBDB2DB5D4BDBDB3D3BDBD2B2D$DABCBADCDCDADCDCBCDCBCBABCBABABA DABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABCBCBCDCBABCBABADABCBCDABABCDABADABABADABCBCBCDCDABABCBA BADCBCBABABADADCDADCDABABCDABA$BDB4DBD3BD3B7D3B2DB2DB2D84B2DBDB2DB3DB 2D4B5D4BD2BDBDBDB3D5B3D3B3DBD2BD2B4D6BDB2D3B2DB2D$DABCDABADABADCDADCB CDABABADCDCDADCBABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABCDABCBABABABCDCDABADADABCBADABCBADABABAB CDCDCBADADCDCBCBCDCDCDCBADCDABCDCDCBCBCBCBA$BD2B2DBDB5DBDB3DB2DBD2B2D 2BD83BDBD2B2DBDBD2BDBD2BD4B2D3BD4BDBDB2D2BDB4DB3D3B4D5B2DBD2BDBD3B4DB D2BDB$DCBADADCDABADCBCBADABABADADABCBADCBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDCDCBADCDADC DADCBADABABABCBABABADABABADCDCBADADADCDADABCDADCDADCBADABABABCDCBADC$ DB2DBDBD3BD4B3D2B3DBD5B3D82B3D7BDBDB4D4B6D4B3D2BD3BD2B2D3BDB5D4BDB2D 2BD3B2DB5D5BD$DADCDABCDCBADCBADABCBCDCBABCBCBCDCBABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBABADC DADADABCDCBABABCBADADCBCDABCDADABADCBCBABCDCDCBADADADCDABADABABCDCBCB ADCDCDC$DB2DBDB2D2B3D2BDB3DB3D3BDBD86B4DB2D7BD3BD2BDB5DB7D2BD2B2D2BDB D4B3D3BD10BD2BD2BDBDB2D2B$DCBABABADCDADABCDCBADADCDABCDABCBCBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABCDCBCDABABCDCBCBCBABCBCBABABCDCDADCBCBCBADADCDCDCDCDADABCDCDADADAD CBCDADCBADADABADABC$2D6B2D2BDB2D2BDB2DBDBD3BD3BD89B3D5BD2BD2BD5B2D2B 6DBD3B2D2B3DBD3BD2B2D2B3D2BDB3DBD2BD2BDBDBDB$DCBADCBCBADABADADABADCDC BCDADABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABCDADABADADADCDADCBCBCBCBCDCBADCDABADABABCDABCDC DADCDCBABCBABABADCDADCDABABABADADADCBC$B3D3B2DBD3B3DB3DBD2BD3BDBDBD 82BDBD7B2D2B2DBDB5DB2DB2D2BD2BD5BD3BD2BD6B4DBD2BDB2DB5DBD4BDBD2B$DCDA DCBADCDCBADCBABABABCDCDADCBADCBABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABCDCDCBCBCBABADABCDABCDCBA DABABADABCDABADCBADADCDCBCDADADADCDABCDCDABABCDCBCDABABADA$2B4DBDB3D 3B3D3BDB3D2B2D2BD85BDB2DB2D2B2D5B3DB3DBD9B4D2BDB2DBDB2D2BDB3D2B3DB4DB 3D3BDB5DBD$DCDABCBCDABADCBCDCBCDADABADADCDCDCBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABADABADCBCDAD ADCBABADCBCBCBCBADABCDABCBCBABADADADCBCDABCBCBADABABABCBABADADCDCDCBC BADA$2D4B5DBDBDBDB2DBDBD2BDBDB3D82BDB5D2B2D4BD2B2D2B2D2BDB4DB2D2B3DB 8DBD7B3DBD2B3DB3D4B3DBDBDBD$DADABABCBADCDCDCBADABADABCBCDADABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABCDCDCBCBABABCBABCDABCBCDABADCDCDADABCBCDCDADCBCDADCDCDADCBCDABAB ADADADADCDABADADADADA$6D2BD2B3D3BD4BDB5D2B2D87BDBD2B2D2BDB4D11B2DB6D 2BDBD2BD2BD2B2DBD2BD3B2D2B2D2B2D2BD4BD3BD$BADCBCDABCBCDCDCDCDABADCBAB ADADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCBCDABABCBCDABADCBABABCDCDCDCDCBABABABABABABCD ABABCBADADABABABCDCDCBCBADCDCDABCDC$DBDB3DBDBD3B4D2BD2B2D2BD3BD2B2D3B D2B2DBD2BD3BDBD2BD2B2D2B3DB2D2B5D2BDB3DB8DB2DB2D2BDB5D4B2DB3D6BDBDB4D 2B4DB2DBDB3DB3D3B3DB4DB3D2B2D3B3D5B3DBDBDB4DBDBDB2D$DABADADCDADABADAD ABCDCBCBADABADCBCBABCBCBCBABADADADADADCBCDCDCDCBCDCBADADCBCDCDADABCDA BADADCBADABABADABCDABADCDABCDABCBABCBADCDADCBCDABABCBCBCDABCBABADADAB CDABABCBABCBABADCDABCBCDCBABCDADADCBADCBABADC$2DBDB2D3B2DB2D2B2DB3D2B 2DB2D2B5DB3DB2D4B2D4B3DBDBDBD2B8DBDB2D3BDBDBDB3DB3DB2DB3D2BDB4DBD3B2D BD3B2DBDB2DBD2B2D2BDBD2B3D2BD2B2DB4D4BDBD3BDBDBD3BDBDBD3B3D6B2DB2D3BD $BCDADCDABADCDCDCBCDADCDABABABCDADCBADADADABADADABCBADCDCDCBABADCDCBA DABADCDADADADCDADADABABCDABADABCDABCBADCDADCBABCDABADCDCBABABCDCDCDCD CDCBABADABADABCDCDABABADABCBABABCBCBCDCBCBCDABCBCBABCDADCBABADC$6DBDB DBDB5DBDB2DB5D2BD3BD5BDB3DBDB4DBD7BD2B4DB2DBDBD2B4DBD3BDB5DB3D5BD4B2D BDB6DB2DBD7BDBDB2D2BD2BDBDBD2BDB2DB5DBDBDBDBDBD2B2DB3DB3D2BDB4D2B2DBD BD3B$BADABABCBABADCDABCBABADADADCBADCBADADCBABCBCBADCBABADCBCBABABCBC BABABCBADCBCDCBCDABCDCBCDCBCBADADABABCBCBCBADCDABCBCBADADADCBCBABCDCD ABABCDABADCDADADCDCDCBADADCBCBCBCDABABCDCBCDADCDCBCBADABCDADABABADC$B D2BD4B4DBD2BD2B2DB2D4B3D2BDBDB2D4BDBD3BDBD2B4DBD4BDBDBDB3D4B3DB3DB3D 4BDB2D2B3D3B4DBD3B4DBDBDB4D2BDB4D4B4DBD5B3D2B3DBD2B4DB3DBD5B2D2B2D5BD 3BDB2DB2DB$BCBADCDADCBABADADCBCBCDCBABADADABABCDCBABADCDADABABCDCDCBC DCDCDADCDCBCBADADABCDCDADABCDADADCBADABABCDADCBCDCBADCBCDADCBADCBCDCB ADABCDABCDCBCBCBADABABABCBABADCBADCDCDABADADADCDADADABADABCBABCBABCDC DCBC$4B3DBD3BD2BD3BDB4D2B2D3BDBD2BD2BDBD3B2D2BD2BDB3DBDBD2B2DBDBDB2DB D3BDB3D3BDBDB3DBD2BDBDB2D3BD2BDB2DB2DB2D7B3D5B2DB2D6B4D2B7D6BD4B10D2B D4BD5B7DB$DABCBCBADCDADCBCDABADADADCBADADCBABCDADADCBCBCBCBCDABCDADAB CBCDABADCDADABCDCDCBCBCDABADABCBABCBCBCBADCBABCBCDCDCBCDCBCDCBCDCDABC BCBADCBCDADCDABADCBCDADADCBCBABCBCBCBCBABABABCDADCDABCDADABABCBCDCBAD CBA$BDBD3B2DBDB10D2B3D5BD2BD5BDBD6B3DB2D2BD5B2D2BD4B2D2B3D2BDBD2B2D2B DB2DBDBDB3DB4D3BD3B2D3B3DB2D3BDB4DBD3BD4B5DBD7B2D2BD5BD4BD3B3D7BD4B2D 2BDBD$DCBCDADABCDADABCDCDCDCBABADCDADADADCBABCDADCDCBABABADABABCBCBCB ABADCDABADCBCDABCDCDABCBADCDCBCDCBABADADABABCBCBADADCDCBABADADABABABA DADADABCDABCDCBCBADADCBABCBABCBCDABCDCBCDCBCDADADABCBABCBADCBADCDADA$ D3B3D2BDBDB2DBDB3D3BDB2DB3DBD6B2D3BD2B5D7B2D2BD2BDB2D3B2D4BDBD4BD2BDB 2D2BDB2D5B5D2B3D2B2D3B3DB4DB3D2B2DBDBD7B2D2BDB3D2B3D2BD2BDB6DBDBD4BDB DBD2B2D6BD$DADABADCBADABCBCDABCDADABADADABCDCBABCDCBCDADCBCBABCBABABA DABABCBABABABCBCDADCBCDADCBCBADCDABCBCBCDADCDCDADCBCBCDCBCBCBABABCBCD CBCBCDADADADADABCBADCBCBCDABCDABADCBADCBADADABCBCDCBCDCDCBCBADCBABCBA BCBA$D3BDB3D3B2D2B2D2BDBD3BDB4DBDB2DB3DBD2BD5B3D3BD2BDB3DB3DBDB3D4B2D B2D3B4D2B2DB2D5BD2BD5B3DBD2BD3BDBDBDB4DBD3B2D7B3D5BD3BD3B2DBD2BD2B2D 2B5DBDB2D3B3D2BD3B2D$BCDADCBADCBABABABABABABCDCBADCDCDCDCBABCBABADABC DABCDABCDCBABCDADCBCDCDADABABCDABABCDCBADADABCDCDCBCDABCBCDCBCBADCDAB ABCDCDCDCBABADABABCBADCBABCDADABADCDCDCBCDADADCBADCDCDADABADCDADCBCBC BADCDABCDADCBC$2BDBD2B2DB2DB2DB3D3BDB3DB2DB2DB2D2BD2B3DB3DB2D3BD2B3D 3BDBDB2DB2DBDB2D2BDBDB2D4BD2BD10BD4BD2B4D2BDBD3B3D3B2DBD3BD6B3D2B10DB 6D3B2D2B2D3B8DBD2BD4BD5B$BCDABADCDABCDADCDCBADCDADCBCBADCBCDCDCBCBCDC DCDABCBCDABCBCDADABCBABABCBCBCDABCDCBCDCBADADABCDCDCBADADCDCDADCDABCB CDADABCBABCDCDABADCBCDABADABCDCBABCDCBADCBCDCBCDABABCDCBCDABCBCDADADC BCDADCDADADABADCBC$DBD3BDB4D2B2DB3DBDB3D3BD3BD3B2D3BDBDB2DBD3B2DBD2BD 3BD4B3DBDBDB4D2B2D3B4D10B2DB2D6B3D4B4D4BD2B2D2BDBDB4DBDB2D2B2DB2D4BDB DB3D2BD2B5DBD8B2DBDB2D2BD3B2D$DADADABABABCBADCBCDABCDCBADCDADCDCDABAD CDCDABCDABABCDCBCBCDABADABADCBABADADABCDABABABABABCBABADADCBCDCBCBABC BABABCBCBADCDCBCBCDADABCBADABCBABCBCDABADABCBADADADADCDADADABABABABCD ADADCBADCBCBABADADADADA$D4B4DB5DB2D2B5D2BD4BD2BDB2DB2DB2D3B7D2BD2BD2B 2DB2DB2D3B3DBD2BD5BD4BDB2D3B2DB2DBD2B2DB3DB2D3BD2B2D2B7D2BD3BD4BD2BDB 2DB6DBDB2D2B4D2BDBD4B3D3BDBDBDB3DB4DB$DCBCDCDCBCDABADCBABCBABABCBADCB CDABADCDABCDABCBCBCBCDCBCDCBADABABCDADCDABCDADADABABADABCDCBABCDABABA DADADCBCBCBCDCDCDCDADCDADCDADABCBCBCBABADCBADABCBABADADABCDCDCDCDCDAB CDADCDCDABCBADADCBADADADADABCDC$3D2B2DBD2B3D5BDBDBDB2DBD2BDBD2BDB7DB 2DB2D5B3DBDBD4B3DB4DB4D3B4D3BD3B3D2B3D2BDBDBD6BDBD4BDB2D3BD3B7DBD2B9D 2BDBD4BD2BD7BD3B9DB5DBDBD4B$BCDCBABCDADCBCBADCDABCDCDADCBADCBCBCDADAD ADCDCBABADABABCBCDADCDABCDABCBADADADADABCDABCBCDADCDCBADADADCDADCDABC BABABADCDCDABCBADADADCBCDCDCDCBADCBCBCDABCDADADCDCBCDABCDABCDCDADCBAB CBCBABCDABABCDCDABCDA$2D8BDBDB4DBD2B2DB3D2BD2BD2BD2BD3BDB2DB2D2BDBDBD 2BDBD3B3DB2D4B2DB2DB8DBDBDB4D3BDB2D2BD3B2D2B2DB4DB4DB2DBD2B4D2B4D5BDB 4D3B2D5B2DBD2B2D2B2DB3DB5D2BDB5D2B2D$DCDADADCBCBADCDADADADCBCDABABABA BADCDADADABABCDABADADABCDCBADADCDADABCDADADCBCDCDCDADCBADCDABABCBADCD CBADADCDABCBABCBADCDCBCDADCBABCBABADCBCBABCBABCBABABABABCDCBCBABCDADA DCDABCDCDCDABCBCDCDABCBADCDADC$B3DBD5BDBDB5D6B2DBD2BD2B3DBD3BDB4D6BD 2B3D2B2D3B2DBDB3DBDBD3B3DB2DBD3BD2B6DB2DB2DBD4B3D3BD5BDBD2B2DBDBD9B3D 2BDBD5B4D3B2D3B2DBDBDBDBDBD2B3D2BD4B2DBD$BADABCBABCBADCDCBCDCBCDABCDC BABCBCDCDABCDADCDABCBCDCDABCBCDCBCBADABCBCDCDADADADABCDADCBCDABABABAB ABADADCDCBCBADABABABABABCBABABABCBCBADADCBCBCBCDCBABCBCDCDABABADABCBA BADADABCDCDADABCBABCBCBCDABABCDCBC$D2B5D2BDB2D6BDB2D2BDBD7BDB3DBD3B2D 2B2DB5DB2D2B2DBD2B2D2BD3BD3BD5BD2B2DB2DB4DBD3BDB8DB2DBDB3DBDB5D2BD2B 2DBD7BD3BD3B2DB6DBD3B2DBD4BD2BDB3D3BD3BD2BDB2D$DADABADCDCDABABADCBCBA DCDABCDABADABABABCDADCBCDCDADCDCBABCDABCDADCDCBCDCBABCDCDABCDADCBABAB ADABADCDCBCDCDABCBCDCDCBADADABCBCBABCDADABCDABCBABCBADADCDABCBABADADC DCBCDCBADADABCDABCDCDABABCDADCBADCDCDADA$3D4B7D3BDBD2B5D2B4D2B7DB4DBD 2B2D5BD4B3DB5D2BD2B2DBDBDBDB2D3B2D3BD7BD3B2D2BDB2DBD2B4DBD5BD5B2D2BDB DB3DB2DBDB2DB2DB2D2BD4B2D3B3DBD4BD2B2D3B2DBDB2DBD$BADCDCBCDCDCBCBCBCB CDCBABCBCBADADCDCBABCBCDABCBABCDABCBCDABADADADCBADABCBADCDABABADCBCDC BADCDADADADADADCDCBCDCBABCBCDCDABCDABABADCBABCDCBCDCBABABCBABCBCDABAD CBADADADCDABCBCBADABCBCDABCBADCBADABADCBABA! golly-3.3-src/Patterns/Margolus/TripATron_BlockAligned.rle0000644000175000017500000000470712026730263020601 00000000000000#CXRLE Pos=-25,-25 # Trip-a-Tron, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # With a Margolus-block-aligned pattern, the behaviour of the CA is # different. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:none # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 1,1,1,1 : 0,0,0,0 x = 50, y = 50, rule = TripATronMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABAB ABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$A BABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABA BABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABCDABABABABA BABABABABABABABABABAB$18B2D30B$ABABABABABABABABABABABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABCD ABABABABABAB$36B2D12B$ABABABABABCDCDCDABABABABABABABABABABABABABABABA BAB$10B6D34B$ABABABABABCDCDCDABABABABABABABABABABABABABABABABAB$10B6D 34B$ABABABABABCDCDCDABABABABABABABABABABABABABABABABAB$10B6D34B$ABABA BABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABA BABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABA BABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B! golly-3.3-src/Patterns/Margolus/CrittersCircle.rle0000644000175000017500000014156512026730263017246 00000000000000#CXRLE Pos=-150,-150 Gen=0 # Starting from a random-filled square in the Critters rule # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # http://zvold.blogspot.com/2010/03/margolus-neighborhood-in-cellular.html # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 0 cells: state reversal # 0,0,0,1 : 1,1,1,0 # 1 cell: state reversal # 0,1,1,1 : 0,0,0,1 # 3 cells: 180-degree rotation plus state reversal # 1,1,1,1 : 0,0,0,0 # 4 cells: state reversal # x = 300, y = 300, rule = CrittersMargolus_emulated:T300,300 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$120B3D2B5DB3D2B2D 2B4D3B2DB3DB4D5BDBDBD7BD5BD2BD2B3D2BD107B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABADABADCBCBCDABABABADCBCDCBCDCDCDABADCDCBABCBCD ABCDCBADABADCBCDABCBCBCBADADABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 119BD2B2D4B2D3B3D2B4DBDBDB2D2B2D3BD4B2D4B3D3BD2B2D2B4DB2DB2D110B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABCBCDCBABABADABADCBCDABA DABADADCDCBABCBABCBADABCBABCDCDADADADABADADABABCDCBABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$120B3D2BDB2DB2DB2D2B3D3BD4BDBDB6D4B2DB2DB2D2BD3B 4DB3DB3DBDBD108B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD ABCBADCBABCDADCBCBCBCBABABCDCDADCDADCBCDABCDCBADADADADCBCDADABABCDADC DABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$119B2D3BDB5D2B3D2BDB2DB3DBD BDBD4BD5B4DB3D2BDB2DB3D4B4D2BD109B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABADCBADADCDABCDCBADADCDADCDABADABABADCBCDABABCDCDABADA DABABCBCDADABCDCBCDABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$122BDBDB 2DB2DBD2B3DB2D3B3D4B2DB2D3BD3B3D2B2D3BD2BDBDB5DBD4BD108B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABCDCDCDCBCBCBCDADABCDCDCDADCDA BADCBCBCDADADABABABCBADABCBABADADCBCBCBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$119BDB9D3BD2BD7B5D6BD2BD4B2DBD4B2DB3D5B2DB2D2B2D109B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABCBCDABADCDCBADADCDCDAD CDABCBADCDABADADADABADABCDCBADABCBCDCDADCBCDCDADCBCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$119B2DB2DB2DBDB2D2B3D3B4D2BD2B3D2BDB2DB3DBD2B2D 2B2DB2D2BDB2D3B3DBD3BD107B$BABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABADABABADABCBCBCDCDCBABCDABCDABCDCDADCBABCDCBADADCBCBCBCBCBABA DADCBCDCDCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$119B3D2BD2BD2BDB 2DBDBDBDB2D5BD2BDBDBDBD4BDBDBD3BDB2D3BD3BDB3DBDBDB2D107B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABADADADABABADCDABADABADADADABADC DCDCDCBCDADCDADCBABABCBCBCDCBCBABADCDABADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$121BDB2DBDB2DB2D3B2D3BDBDB4DBDB2D4B6DB2DBD2B2D5BDB4DBD 114B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABADADCBCBCBCDAD ADCBCDCDABCBCDADADADADABCDABABABCBADABCDABADADCBABCBCDCBCBCDABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$119BD2B2DBD2BDB4DBDB3DB5DBD4B8DBDBD2B4D B3D2BDB2DB2DB6DB2D107B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABCDABCBABABCBADADABABABCDADCBADADABCDCBCDCBABADABABCBADCBCDCDADADA DABCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$119BDB4DBDBD2BDBDBD4B 2D2B6D2B4D3B2DBDB3DBD2B2D2BDBD3BD4BD2BD110B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABCBCBADABCDCBCDADCBABCDCDCDABCDABCDADCBCBCDCD CDADCBCBCBCDCDCBCDCDADCBADCBADABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 124B3DBDB2DBD2BDBDBDBD4BDB4D3BDB3D3BD4B3D3B9DBDB2D111B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABADCDCBADCDCBCDADCBABADCBCBCBADABA DABCBABCBCDADCDADCBABCBCDADADCBCDADCBCDCBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABA$119BDB3DBDBDB4D3BD6B2DB6DB5D4B2DBDB3DBDBDB3DB3DB5DBDB2D 107B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABCBABADCDADABCB CDABABCDCBCBADCBCDCBCBADADABCDABCDABCBADCBADABADADABCBCDCBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$120B2DB3D2BDBD2B3D4B3DB2D3BD2B4D4B2DBDB D3B2DB3D2BDB2D2BDB3DB3D108B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABCBABABADCBABCBCBCDABADABADCDABADCBADABADCBCBADABABCDCBCBADCD CBCDCDABABCBADABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$121B4DB5DBD3BDBD B4D2BD2B3D8BD2B2DBD2BD3B3D3B5DBDBD2BDBD107B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABCBADADADCBABCBCDCDCBCBADADABADABCDCBADCDAD ADCDCBABABCDADABABCBCBCDCDCDADABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 119BDBDBD2B2D3B3D3BD3B3DBDBD2B2DBD2BD3B3D6B2DBD7BD2B2DBDB2DB2D107B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABADADADCDABCDADADC DADCBABCDABABCBADADABCDCBCDABCBABABCBADABADCBCDCDCDCDABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABA$119BD2B2D4BD2BD7BDB2D2B2DB3DBD3B2D2BD2BDB3D3BD B2D2BDB2DBD2BDB2D3BD107B$BABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABCBADABABCDCBCBABABCDCBCBCDABCDADCDCBCDADADCBCDABADCDCBADCDCDADA DCDCBADADADABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$119B2D6B2D5BD4BDB3D B3DB6DB2D4BDBDB8DB2D4B2D2BDBDB3D108B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABCDADABCDADCBADADCDABADCBCBCDCDCDABCDCBCBABCDCDABADC DABADCBCDADABCBADABCBCBABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$119B4D 2B3DB2DB5DBD3BDBD5B2DB9D3B6DBDB2DB5DB6D2BD108B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABCBCBABCBABCDABABCBCBABABABCDCDCDADCDCBADA BCBCBABCBABCBABABABCBABABADCDADCBABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$121BD3BD2B2DB2D8BD4BDB2D3B3DBDBDBDB2D2BDBD2BD2BDBDB3DBDBDBD2B3D 107B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABADCDCDABCBCBAD ABCDADCDCBABABABCDADABABADCDADCDCDCBCDCBCDCDCBCBCDABADADADCBABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$120BDBDBD5BD3BDB8D2B2DBDB3DBDBDB3DB3D3B D5B7D2BDB5DBD107B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABC DADABADCBCDCBADCDABCDABADADADABCBCDCBABCBABABABCBABABCBCBADABABABABAB CBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$119B3DB5DBDB3D2B2DBD2BD4BD 4B2DBD2B3D4B6D2B3D3BD4B3DB2D110B$BABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABADCBABCBABCBCBCDADADCDCDADCDCDABCDABCBCDABCDCDABCDABCDC BCDABCBCDCBADCBADADABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$120BDBDBD2B DBD2BDBDBDBD2B3D3B3D4BD2BDB2D2BD3BDBDB6D2B3D3BDBDB3D108B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABCDCDADABABABCDCBCBABABADCDABABC BCDCDCBABABCDCBCDCBCBADCDADCBADCDCDADCBADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$120B2D2BD2BDB4DBD3BDB2D4BD4B5DB3DBD2BDBDB2D5BDBD2B2DB2D 3BD2BD108B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABADADADAD CDABABCBADCBABCBCBADADCBCBCDABADCBCDCBADABADCBCBABADCDCDADCDCBADCBABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$119B2D3B2DBD2B3D2B2DB7D2B2DB2DBDB 4DB7DBDB3DB4D2B2D2B3DBDBD109B$BABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABCDCDCDABABCBABADCBABCDADABADCDCDCDADCDABCDCBABCDABADCDCBCB ADCBCBCDADCBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$119B4D7B3D2BDB DBD2B2DBDBDB2DB2D2B3D2B4DBD3B2D3BDBD2B4D4B2D110B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCBCBCBCDCBCDCBCDCBCDABABABCDADCDCDCBCDA DCDABABCBABCDCDADCDADADCDCDABABCDABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$122BDB4D2B3DBDBDB2D2B3D5BDB2DB4D2B2D3B2D2BDB3D4B2DB2D2B3DB2D108B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABCBABABADABCBADABAD CBCBCBABCDABCBADCDCDCDADADCBCDABABCDABCDABCBABCDABADCBCDABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$121B2D2BDBDBD2BD5B6DB8DBDB3D5BD3B3DB2D2BD3B DBD2BD3B2D109B$BABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBAB ADADCBABCBCDCDABABCBABABCDCDABABCBCDCDABCBADADCBCBCDADCBCDADCDCDCDCBC BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABA$120BD3B3D4BD3B2DBD2BDB2D5B2DB D2BD5BD5B2D2B2DBDBD2BDB8D110B$BABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABADADCDCBABCBCBABABCBABCDCDCDABABABADADABADABCDADABCBADADCD ADCBADCBCBADCDCDABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$122BDBD8B7DB3D BDBD2B2D3BD4B6DB3DBD2BDBD3B2DBDBD4BD109B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABADCBADABADCDCDCDCBADCDCBCDABCDCBCDABCBADABCDA DCBADABCBADADABCBCBADCBABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 120BD2BD2B3D4B4D3BD2B2D2BD3B3DBDBDB2D4B2D2B5DB4D2B2D2B2DBD2BD108B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABCBCDCDCBCBADABABADADCD CBADABABCBCBCBABCDCBCDADADABCDABABABADCDCDCBCBCBADADABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$120B3D2BD3BD4B2DBDBD5B3DB2DB2DBD3BD3BDB4D2BDB3D 2BD2BDBD3B3DB2D107B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BCDCBCDABCDCBCDCBCDABABCBCDCDCDCDADCDABCDCBABCDADCDCBADCBCBCDABADCDCD CBCBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$120BDBDB3D2BDBD2BDBD2BDB 3D2B4DBD2BDB3D3BD8B3D3B3D3B2DBD2BDB2D107B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCDCBCDCBABADADCBABCBCDCBCDADABCBCBCDABCDADCDCB CBADCDADCBADADADADADADABCDADABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 120BD4BD3BDB2D4BDBDB3DBDBDBD4BD2B3D4BD4B2DBDB4DB2DBDBDBDB2DBD108B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABADADCBABABCDABCDADADAB ABCBCBABABABCBABCBABADCBCDCBCBABADABCBCBCBABABCBADCDABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$121BDBDB3D6B2D2BDB2D4B4D3BD2BDB2DBDBD4B2D2B5DB 4D2B2D2BDB2D108B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB CBCDADCBADADABCDCDADCBADADCBADADCBCBADADCBABCBADCBCBADABCDADCDADABCBC DADABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$120BDBD4B3DBD3BD5B4DBDBDB2D 3BD3BD2BD3B3D2B2DB3DB3DB8DB2D107B$BABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABCDABCDCBCDABCDCBABABABADCBCBADABADABCDCDCBADCBCBADADAB CBADABADCBABADCBCBCBABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$122B4D2B2D BDBDB2DB2DB4D6B3DB4DBDBDB2DBDBDBDBD4BD3BDBD4BD110B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA! golly-3.3-src/Patterns/Margolus/BBM.rle0000644000175000017500000001213412026730263014712 00000000000000#CXRLE Pos=1,0 # Billiard Ball Machine # # A Margolus-neighborhood implementation of a rule by Edward Fredkin. # Signals and logic gates are simulated by 'billiard balls' that bounce # off walls and each other. # # E. Fredkin, T. Toffoli, "Conservative logic", International Journal of # Theoretical Physics, 21:3-4, 219-253 (1982) # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # balls travel # 0,1,1,0 : 1,0,0,1 # balls collide head-on # x = 88, y = 74, rule = BBM-Margolus-emulated 88D$CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCD$2D84B2D$CDABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CDABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABCD$2D84B2D$CDABABABABABABABABABABABABABABABABABABADCBABABABAB ABABABABABABABABABABABABABABABABABABCD$2D37B2D45B2D$CDABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB CD$2D84B2D$CDABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABCD$2D84B2D$CDABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CD ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABCD$2D84B2D$CDABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCBABABABABABCD$2D11B62D11B2D$CDABABABA BABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBAB ABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CD ABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BADCBABABABABABCD$2D11B2D58B2D11B2D$CDCBABABABABADCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D28BD 29B2D11B2D$CDABCBABABABADCBABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABADCBABABABABABCD$2D11B2D30BD27B2D11B2D$CDABABABABABADCB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBABABABABA BCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABA BABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABA BABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBAB ABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CD ABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D 11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABA BABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABA BABABABABABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B 2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABAB ADABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBAB ABABABABABABABABABABABABABABABABABABADABABABABABABABABADCBABABABABABC D$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABA BADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBABAB ABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDAB ABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA DCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B 2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D 58B2D11B2D$CDABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCBABABABABABCD$2D11B62D11B2D$CDABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D 84B2D$CDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCD$2D84B2D$CDABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CDABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABCD$88D$CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD! golly-3.3-src/Patterns/Margolus/CrittersOscillators.rle0000644000175000017500000000521612026730263020333 00000000000000#CXRLE Pos=-25,-25 # Some oscillators in the Critters rule # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # http://zvold.blogspot.com/2010/03/margolus-neighborhood-in-cellular.html # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 0 cells: state reversal # 0,0,0,1 : 1,1,1,0 # 1 cell: state reversal # 0,1,1,1 : 0,0,0,1 # 3 cells: 180-degree rotation plus state reversal # 1,1,1,1 : 0,0,0,0 # 4 cells: state reversal # x = 50, y = 50, rule = CrittersMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$16B2D32B$ABABABABABABABABABABABABABABABABABABA BABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABADCBABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$34B10D6B$ABABABABABABABABABABABABABABABABA BABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$9B2D2B2D35B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABCDABCDABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 39B3D8B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABCDCBABAB AB$10B2D2B2D2B2D30B$ABABABABABABABABABABABABABABABABABABABABABABABABA B$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABAB ABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABAB ABABABABABABABABABABABABABAB$50B! golly-3.3-src/Patterns/Margolus/Sand.rle0000644000175000017500000007403312026730263015205 00000000000000# A simple simulation of sand particles using the Margolus neighborhood # - inspired by MCell's version. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:4 # neighborhood:Margolus # symmetries:reflect_horizontal # # # The Margolus transition a,b,c,d : e,f,g,h means: # # a b --> e f # # c d g h # # # 0 : air # # 1 : sand # # 2 : wood # # 3 : magical source of sand # # var a={0,1,2,3} # var b={0,1,2,3} # # 1,1,0,0 : 0,0,1,1 # a pair of sand particles falls # 1,a,0,b : 0,a,1,b # otherwise, sand falls next to a static column # 1,0,a,0 : 0,0,a,1 # otherwise, it can topple # 3,a,0,b : 3,a,1,b # sand can appear from the magical source # x = 204, y = 273, rule = Sand-Margolus-emulated BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$94BH109B$BABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$ BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$84BF119B$BABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABA$84B2F118B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$85B2F117B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABAB ABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABA$88B2F12B2F100B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BEFEFEFEBABAFEFABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$95B6F103B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABAB ABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABA BABABABABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABAB ABABABABABABABABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABA BABABABABABABABABABABABABABABABA$153BF50B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABAB ABABABABABABABABABABABABABABABABABABABA$153BF50B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABA BABABABABABABABABABABABABABABABABABABABABABABA$153BF50B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB AFABABABABABABABABABABABABABABABABABABABABABABABABABA$89BF62BF51B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABABA$90BF 61BF51B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABAB ABABA$91BF60BF51B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABAB ABABABABABABABA$92BF58BF52B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABA BABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$93BF55BF54B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABA BABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$94BF53BF55B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABEBABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABAB ABABABABABABABABABABABABABABABABABABABABABABA$96BF48B2F57B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABAFABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$98BF45BF59B$ BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABA BABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 100BF40B2F61B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABAFEBABABABABABABABABABABA BABABABABABABAFEFABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$102B2F30B4F66B$BABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFEFABAB ABABABABABABABABABABEFEBABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABA$107B2F14B8F73B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABEFEFEFEFEFEFEFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$55BF 148B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$55BF148B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAF ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABA$56BF147B$BABABABABABABABABABABABABABABABABABABABABABABABABA BABABAFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$56BF147B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$57BF146B$BABABABABABABABABABABABABABABABABABA BABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$58BF145B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEFABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$60BF143B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$61BF142B$BABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$62BF101BF39B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABABA$64BF 98BF40B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABAB ABABA$66BF96BF40B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABAB ABABABABABABABA$67B2F93BF41B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABA BABABABABABABABABABABABABA$69BF91BF42B$BABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABA BABABABABABABABABABABABABABABABABABA$71BF88BF43B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BEBABABABABABABABABABABABABABABABABABABABABABA$72BF85BF45B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABEBABABABABABABABABABABABABABABABABABABABABABABA$74BF80B2F47B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABA$ 76BF76BF50B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABAB ABABABABA$77B2F70B3F52B$BABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFEFABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$80BF63B2F58B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABEFABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$83B3F54B3F61B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFEBAB ABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$88B4F44B3F65B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEFEBABABABABABABABABABABABABABABABABABABAFEBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$96B17F14B7F 70B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABEFEFEFEFEFEFEFABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB A$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA! golly-3.3-src/Patterns/Margolus/Sand-Test.rle0000644000175000017500000000376012026730263016121 00000000000000#CXRLE Pos=-6,-12 # A simple simulation of sand particles using the Margolus neighborhood # - inspired by MCell's version. # # Note that with the Sand-Margolus-emulated rule, only two of the blocks # of sand collapse. Now change rule (Control | Set Rule...) to # Sand-square4cyclic_emulated, and note that all four blocks of sand # collapse. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. In the Margolus nhood, # odd-numbered cells are those in the top-left corner of each 2x2 block. # In the square4_cyclic neighborhood (if you've changed the rule to # Sand-square4cyclic_emulated), on odd-numbered generations it is the even- # numbered cells that are in the top-left corner of each block. On even # generations the pattern is the same as in the Margolus neighborhood. # # These background states means that you can't just scribble on the pattern. # Either carefully maintain the appropriate odd-and-even pattern, or use the # helper scripts provided: a) First run export.py in Scripts/Python/Margolus. # b) Draw, using states 1, 2 and 3. c) Select-all and run import.py. You can # now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:4 # neighborhood:Margolus # (or square4_cyclic) # symmetries:reflect_horizontal # # # The Margolus transition a,b,c,d : e,f,g,h means: # # a b --> e f # # c d g h # # # 0 : air # # 1 : sand # # 2 : wood # # 3 : magical source of sand # # var a={0,1,2,3} # var b={0,1,2,3} # # 1,1,0,0 : 0,0,1,1 # a pair of sand particles falls # 1,a,0,b : 0,a,1,b # otherwise, sand falls next to a static column # 1,0,a,0 : 0,0,a,1 # otherwise, it can topple # 3,a,0,b : 3,a,1,b # sand can appear from the magical source x = 15, y = 14, rule = Sand-Margolus-emulated 15B$BABABABABABABAB$15B$BABADCBABCDABAB$4B2D3B2D4B$BAFEFEFEFEFEFAB$ 15B$BABABABABABABAB$4B2D3B2D4B$BABADCBABCDABAB$2B11F2B$BABABABABABABA B$15B$BABABABABABABAB! golly-3.3-src/Patterns/Non-Totalistic/0000755000175000017500000000000013543257426014755 500000000000000golly-3.3-src/Patterns/Non-Totalistic/rr14gun.rle0000644000175000017500000000040113171233731016664 00000000000000#C rr14gun #C Reflectorless rotating period 1016 14-barrelled shotgun #C Daniel R. Collazo, 19 February 2017 #C http://conwaylife.com/forums/viewtopic.php?f=11&t=1638&p=40766#p40761 x = 4, y = 6, rule = B2-ac3ai/S1c2-n3-aky4a 3o$ob2o$ob2o$2bo$3bo$2b2o!golly-3.3-src/Patterns/Non-Totalistic/p42-knightship.rle0000644000175000017500000000070112750014265020141 00000000000000# 4,12c/42 knightship discovered by muzik. # For more patterns in this rule see the tDryLife thread: # http://www.conwaylife.com/forums/viewtopic.php?f=11&t=2266 x = 32, y = 33, rule = B37/S2-i34q 16bo$15b2o$15bo3bo$14bo2bob2o$13b2o5bo$13bo2bo2bo$7bo5b2o4bo$7bobo5b2o $7bobo6bo4$2o$obo$b2o$17b2o5b2ob3o$16bo3bo2b2ob2obo$16b2o5b2obob2o$17b 2o3bobo$17bo2bo$18bob2o4$6b3o$6bo19bo$7bo19bobo$29b2o$22b2o2bo4bo$22b 2ob2ob2obo$22bo2bo2b3o$22b2o2b2o$23b5o! golly-3.3-src/Patterns/Non-Totalistic/limited-spacefiller.rle0000644000175000017500000000077713171233731021320 00000000000000#C limited spacefiller from soup, in "organized explosion" rule #C Dave Greene, 10 July 2017 #C http://conwaylife.com/forums/viewtopic.php?f=&p=46828#p46337 #C rule found by Daniel R. Collazo, 4 June 2017 #C http://conwaylife.com/forums/viewtopic.php?f=&p=44061#p44061 x = 16, y = 16, rule = B2-a5/S1e2-a35678 2bobobob4obobo$bob2obo2bo2b2o$2bobo4b3ob3o$3obo5bob2o$3o4b2o4b3o$2o5b 8o$bo2bo5b3o$o2b2o4bo2b2o$o2bobob3o4bo$2o2b4o3b3o$3o2b2obo3b4o$3bo5bob 2ob2o$o4b6o2b2o$4ob3obob2o$2b4ob2o3bobo$ob2o4b4ob2o!golly-3.3-src/Patterns/Non-Totalistic/infinite-binary-ruler-generator.rle0000644000175000017500000000202513140227320023561 00000000000000#C infinite binary ruler generator from random asymmetric soup #C Daniel R. Collazo, 30 May 2017 #C http://www.conwaylife.com/forums/viewtopic.php?f=11&t=803&p=43939#p43939 x = 32, y = 32, rule = B2ak3nr4iy/S3-nr4ent5er o2bobob2o3b3o2bob2ob6o3bo$2bob5o2bo3b3obo3bobo3bobo$ob4ob3obo2b5ob2obo 3b5o$o2bo4b2obobo2bob2obob2o3bob2o$2bo2bo3b5obo2bobob3o$10bo2bob2obo3b 2o3bo2bo$o4bo2bo2b3obo2bob8ob3o$bob2obobo2bo3bobob3o2b2o2b2obo$bo2bo2b 2obobo5bo3b5obo$bobo3b4o2bob5o2b3ob2o2b2o$b2obo2bobobo2bob3o2bo5bo2b2o $b3ob3ob4o2bo4b2o2b8o$bo3bo2bo2b2o3bo2bo2bo2bo2bobo$3bo2b3obob7o2bobo 4b4o$2o4bo2bo2b4obobobo3b3ob3o$7obo6bob3o2bobobob2obo$o3bob2obo3bob2o 2b3ob2o2b2o$3obobo3b2obob7ob2ob2o2bo$b5o2b3obobo4b3ob3obo3bo$bob2ob5o 2b2obo2bo4b4ob2o$bob4o2bo2bo3bo4b3ob4o2bo$b4obob6o3bo3bobo2b5o$2bo4bob ob2ob2o2bobobobo2b2obo$ob4obo2bob4o7b2ob2o2b2o$3ob2obo2bobob3o2bo5b2ob 2o$4b2ob2o2bo6bobo2bo4bob2o$bo4bob6o3b7obob3o$7bo4bobo5bobo4bobo$o2bo 5b2obo3b2ob5obo2b4o$b3o2bob2o2b2ob3ob5o3bobobo$3b2ob2o3bobo3bobo2b4ob 3o$b2o3b2obobob3obob2obo3b3ob2o! golly-3.3-src/Patterns/Non-Totalistic/intergalactic-cruise-ship-factory.rle0000644000175000017500000000044113140227320024066 00000000000000#C intergalactic cruise ship factory #C Brian Prentice, 26 June 2017 #C http://conwaylife.com/forums/viewtopic.php?f=11&t=2792&p=45314#p45314 x = 118, y = 5, rule = B2aei3r4kn5jnr6k/S2ai3k4iknqr5r6ai o116bo$bo114bo$35bo3bo5bobo5bo3bo2bo3bo5bobo5bo3bo$35bo21bo2bo21bo$36b o19bo4bo19bo!golly-3.3-src/Patterns/Non-Totalistic/pondpuffer-spaceship.rle0000644000175000017500000006175213171233731021527 00000000000000#C p1552 spaceship based on tDryLife pondpuffers #C Luka Okanishi, 21 June 2017 #C http://www.conwaylife.com/forums/viewtopic.php?f=&p=44806#p44806 x = 1879, y = 1900, rule = B37/S2-i34q 1227b2o$1227bob2o$1227bo3b2o$1227b3ob2o4b2o$1227bo3b2o4b2o$1228bobo$ 1228b3o2$1238bo$1238bo$1202b2o27b3o3b3o$1201bo2bo25bo2bo2bo2bo$1201bo 2bo26bobo6bo$1202b2o28bo4bobo5$1220b3o2$1220bobo$1191b2o28bo$1190bo2bo $1190bo2bo$1191b2o5$1234bo$1233bobo$1229b2o2b2o$1180b2o47b2o3bobo$ 1179bo2bo53b2o$1179bo2bo53b2o$1180b2o55bo$1236b2o$1236b2o6$1169b2o$ 1168bo2bo50b2o$1168bo2bo49bo2bo$1169b2o50bo2bo$1222b2o7$1158b2o$1157bo 2bo$1157bo2bo$1158b2o8$1147b2o$1146bo2bo$1146bo2bo$1147b2o5$1261b4o$ 1260b2o$1263b3o$1136b2o121bo2b3o$1135bo2bo126bo$1135bo2bo124bo$1136b2o 122bo4bo$1261bo$1263bo6$1125b2o$1124bo2bo$1124bo2bo$1125b2o8$1114b2o$ 1113bo2bo$1113bo2bo$1114b2o5$1278b3o$1278bob2o$1277b2ob2o$1276b2o3bo$ 1280bo$1280b3o$1279bo3b2o$1280b5o$1279bo$1276bo$1276b2o$1275bo2bo$ 1250bo25bobo$1249b3o26bo$1092b2o155b3o24bobo$1091bo2bo180bo2bo$1091bo 2bo177b2obo2b3o$1092b2o157b2o19b9o$1250bo2bo22bo$1250bo2bo$1251b2o10$ 1281b2o$1281b2o$1275b4o$1275b2ob2o11b2o$1274bo5bo9bo2bo$1275bobo2bob2o b3o3bo2bo$1070b2o204b2ob2ob2ob3o4b2o$1069bo2bo205bo3bo2bo$1069bo2bo 206bob4o$1070b2o206bo5bo8b2o$1282b2o9b2o$1282bo$1281bo2$1286b2o4$1291b o$1291bo9$1048b2o$1047bo2bo$1047bo2bo$1048b2o18$1330b2o$1026b2o302b2o$ 1025bo2bo295b4o$1025bo2bo275b2o3bo14b2ob2o11b2o$1026b2o276b2o2bobo12bo 5bo9bo2bo$1308bo2bo12bobo2bob2ob3o3bo2bo$1309bobo13b2ob2ob2ob3o4b2o$ 1310bo16bo3bo2bo$1328bob4o$1244bob2o3b2o74bo5bo8b2o$1242bo8b2o78b2o9b 2o$1241bo3bo2bo82bo$1242bobo3bo81bo$1243b2o2bo$1245bo2bo7bo38bo39b2o$ 1245bo2bo7b2o36bobo12bo$1245bo10b3o35bobo11bo$1215b2o29bobo8b2o36bo10b 2obo$1214bo2bo36bo19b2o26bo3b2o32bo$1214bo2bo24b2o9b3o17bo2bo23b2obo2b 2o32bo$1215b2o25b3o7bob2o17bo2bo22b2o2b2o2bo$1244bo8b3o18b2o22bo3bobo 3b3o$1232bo3b2o5bobo53b2o2b2o4bo$1004b2o225bo2bo2bo62b4o$1003bo2bo225b 3o3bo63bo78b3o$1003bo2bo230bo143bob2o$1004b2o374b2ob2o$1379b2o3bo$ 1204b2o28bo148bo$1203bo2bo26bo2bo26b2o118b3o$1203bo2bo27b2o26bo2bo116b o3b2o$1204b2o56bo2bo117b5o$1263b2o117bo$1379bo$1221b2o156b2o$1220bo2bo 56b2o96bo2bo$1220bo2bo55bo2bo96bobo$1221b2o56bo2bo98bo$1280b2o97bobo$ 1193b2o183bo2bo$1192bo2bo56b2o4bo116b2obo2b3o$1192bo2bo55bo2bo3bo116b 9o$1193b2o56bo2bo2b3o119bo$1252b2o2$982b2o226b2o$981bo2bo224bo2bo56b2o $981bo2bo224bo2bo55bo2bo$982b2o226b2o56bo2bo$1269b2o$1182b2o$1181bo2bo $1181bo2bo$1182b2o$1384b2o$1384b2o$1199b2o177b4o$1198bo2bo56b2o118b2ob 2o11b2o$1198bo2bo55bo2bo116bo5bo9bo2bo$1199b2o56bo2bo117bobo2bob2ob3o 3bo2bo$1258b2o119b2ob2ob2ob3o4b2o$1171b2o208bo3bo2bo$1170bo2bo208bob4o $1170bo2bo207bo5bo8b2o$1171b2o212b2o9b2o$1385bo$1384bo$960b2o226b2o$ 959bo2bo224bo2bo198b2o$959bo2bo224bo2bo$960b2o226b2o2$1160b2o232bo$ 1159bo2bo231bo$1159bo2bo$1160b2o3$1177b2o256b3o$1176bo2bo255bob2o$ 1176bo2bo254b2ob2o$1177b2o254b2o3bo$1437bo$1149b2o286b3o$1148bo2bo284b o3b2o$1148bo2bo285b5o$1149b2o285bo$1433bo$1433b2o$938b2o226b2o264bo2bo $937bo2bo224bo2bo264bobo$937bo2bo224bo2bo266bo$938b2o226b2o265bobo$ 1432bo2bo$1138b2o289b2obo2b3o$1137bo2bo288b9o$1137bo2bo292bo$1138b2o3$ 1155b2o$1154bo2bo$1154bo2bo$1155b2o2$1127b2o$1126bo2bo$1126bo2bo$1127b 2o309b2o$1438b2o$1432b4o$916b2o226b2o286b2ob2o11b2o$915bo2bo224bo2bo 284bo5bo9bo2bo$915bo2bo224bo2bo285bobo2bob2ob3o3bo2bo$916b2o226b2o287b 2ob2ob2ob3o4b2o$1435bo3bo2bo$1116b2o318bob4o$1115bo2bo316bo5bo8b2o$ 1115bo2bo320b2o9b2o$1116b2o321bo$1438bo2$1133b2o308b2o$1132bo2bo$1132b o2bo$1133b2o$1448bo$1105b2o341bo$1104bo2bo$1104bo2bo$1105b2o2$1489b3o$ 894b2o226b2o365bob2o$893bo2bo224bo2bo363b2ob2o$893bo2bo224bo2bo362b2o 3bo$894b2o226b2o367bo$1491b3o$1094b2o394bo3b2o$1093bo2bo394b5o$1093bo 2bo393bo$1094b2o391bo$1487b2o$1486bo2bo$1111b2o374bobo$1110bo2bo375bo$ 1110bo2bo373bobo$1111b2o373bo2bo$1483b2obo2b3o$1083b2o398b9o$1082bo2bo 401bo$1082bo2bo$1083b2o3$872b2o226b2o$871bo2bo224bo2bo$871bo2bo224bo2b o$872b2o226b2o2$1072b2o$1071bo2bo$1071bo2bo417b2o$1072b2o418b2o$1486b 4o$1486b2ob2o11b2o$1089b2o394bo5bo9bo2bo$1088bo2bo394bobo2bob2ob3o3bo 2bo$1088bo2bo395b2ob2ob2ob3o4b2o$1089b2o398bo3bo2bo$1490bob4o$1061b2o 426bo5bo8b2o$1060bo2bo429b2o9b2o$1060bo2bo429bo$1061b2o429bo2$1497b2o$ 850b2o226b2o$849bo2bo224bo2bo$849bo2bo224bo2bo$850b2o226b2o422bo$1157b o344bo$1050b2o103b2o$1049bo2bo103b2o$1049bo2bo$1050b2o$1543b3o$1543bob 2o$1067b2o473b2ob2o$1066bo2bo471b2o3bo$1066bo2bo475bo$1067b2o476b3o$ 1544bo3b2o$1039b2o504b5o$1038bo2bo502bo$1038bo2bo499bo$1039b2o500b2o$ 1540bo2bo$1541bobo$828b2o226b2o485bo$827bo2bo224bo2bo482bobo$827bo2bo 224bo2bo481bo2bo$828b2o226b2o479b2obo2b3o$1537b9o$1028b2o511bo$1027bo 2bo$1027bo2bo$1028b2o$1246b3o$1247bo$1045b2o$1044bo2bo$1044bo2bo$1045b 2o2$1017b2o$1016bo2bo526b2o$1016bo2bo526b2o$1017b2o521b4o$1540b2ob2o 11b2o$1539bo5bo9bo2bo$806b2o226b2o504bobo2bob2ob3o3bo2bo$805bo2bo224bo 2bo504b2ob2ob2ob3o4b2o$805bo2bo224bo2bo506bo3bo2bo$806b2o226b2o508bob 4o$1543bo5bo8b2o$1006b2o539b2o9b2o$1005bo2bo538bo$1005bo2bo537bo$1006b 2o$1551b2o2$1023b2o$1022bo2bo$1022bo2bo530bo$1023b2o531bo2$995b2o$994b o2bo$994bo2bo$995b2o600b3o$1597bob2o$1596b2ob2o$784b2o226b2o581b2o3bo$ 783bo2bo224bo2bo584bo$783bo2bo224bo2bo584b3o$784b2o226b2o584bo3b2o$ 1599b5o$984b2o612bo$983bo2bo608bo$983bo2bo608b2o$984b2o608bo2bo$1595bo bo$1597bo$1001b2o592bobo$1000bo2bo590bo2bo$1000bo2bo587b2obo2b3o$1001b 2o588b9o$1595bo$973b2o$972bo2bo$972bo2bo$973b2o3$762b2o226b2o$761bo2bo 224bo2bo$761bo2bo224bo2bo$762b2o226b2o2$962b2o636b2o$961bo2bo635b2o$ 961bo2bo629b4o$962b2o630b2ob2o11b2o$1593bo5bo9bo2bo$1594bobo2bob2ob3o 3bo2bo$979b2o614b2ob2ob2ob3o4b2o$978bo2bo615bo3bo2bo$978bo2bo616bob4o$ 979b2o616bo5bo8b2o$1601b2o9b2o$951b2o648bo$950bo2bo646bo$950bo2bo$951b 2o652b2o3$740b2o226b2o$739bo2bo224bo2bo639bo$739bo2bo224bo2bo639bo$ 740b2o226b2o2$940b2o$939bo2bo$939bo2bo708b3o$940b2o709bob2o$1650b2ob2o $1649b2o3bo$957b2o694bo$956bo2bo693b3o$956bo2bo692bo3b2o$957b2o694b5o$ 1652bo$929b2o718bo$928bo2bo717b2o$928bo2bo716bo2bo$929b2o718bobo$1651b o$1649bobo$718b2o226b2o700bo2bo$717bo2bo224bo2bo696b2obo2b3o$717bo2bo 224bo2bo696b9o$718b2o226b2o701bo2$918b2o$917bo2bo$917bo2bo$918b2o3$ 935b2o$934bo2bo$934bo2bo$935b2o$1654b2o$907b2o745b2o$906bo2bo738b4o$ 906bo2bo738b2ob2o11b2o$907b2o738bo5bo9bo2bo$1648bobo2bob2ob3o3bo2bo$ 1649b2ob2ob2ob3o4b2o$696b2o226b2o725bo3bo2bo$695bo2bo224bo2bo725bob4o$ 695bo2bo224bo2bo724bo5bo8b2o$696b2o226b2o729b2o9b2o$1655bo$896b2o756bo $895bo2bo$895bo2bo760b2o$896b2o3$913b2o749bo$912bo2bo748bo$912bo2bo$ 913b2o2$885b2o$884bo2bo$884bo2bo$885b2o3$674b2o226b2o$673bo2bo224bo2bo $673bo2bo224bo2bo$674b2o226b2o2$874b2o$873bo2bo$873bo2bo$874b2o3$891b 2o$890bo2bo$890bo2bo$891b2o2$863b2o$862bo2bo$862bo2bo$863b2o$1703b2o$ 1703b2o$652b2o226b2o815b4o$651bo2bo224bo2bo794b2o3bo14b2ob2o11b2o$651b o2bo224bo2bo794b2o2bobo12bo5bo9bo2bo$652b2o226b2o799bo2bo12bobo2bob2ob 3o3bo2bo$1682bobo13b2ob2ob2ob3o4b2o$603b2o3bo243b2o829bo16bo3bo2bo$ 603b2o2bobo241bo2bo846bob4o$607bo2bo240bo2bo845bo5bo8b2o$608bobo241b2o 850b2o9b2o$601b3o5bo1094bo$600b5o1098bo$599bob2ob2o263b2o81bo$598b3obo 2b2o261bo2bo78b2o716bo39b2o$598bob4o2bo261bo2bo79b2o714bobo12bo$597b3o bo267b2o796bobo11bo$597bo3bobob2o1061bo10b2obo$598bob2ob3obo233b2o804b 2o26bo3b2o32bo$593b2o7bo2bo234bo2bo802bo2bo23b2obo2b2o32bo$593b2o10bob o232bo2bo802bo2bo22b2o2b2o2bo$604bob2o233b2o804b2o22bo3bobo3b3o$573b2o 23b2o5b2o1065b2o2b2o4bo$572bo2bo20b2ob2o1072b4o$572bo2bo20bo2bo2bobo 25b2o226b2o815bo78b3o$573b2o20bo2bo2b2obo24bo2bo224bo2bo893bob2o$595bo bo3bo3bo23bo2bo224bo2bo892b2ob2o$596b2o7bo24b2o226b2o892b2o3bo$596b2o 5b2o1151bo$603bo226b2o804b2o118b3o$829bo2bo802bo2bo116bo3b2o$829bo2bo 802bo2bo117b5o$830b2o804b2o117bo$562b2o1188bo$561bo2bo1187b2o$561bo2bo 282b2o804b2o96bo2bo$562b2o282bo2bo802bo2bo96bobo$846bo2bo802bo2bo98bo$ 847b2o804b2o97bobo$579b2o1170bo2bo$578bo2bo237b2o804b2o121b2obo2b3o$ 578bo2bo236bo2bo802bo2bo120b9o$579b2o237bo2bo802bo2bo124bo$819b2o804b 2o$551b2o$550bo2bo1237b4o$550bo2bo54b2o226b2o760bobo41b2o146b2o$551b2o 54bo2bo224bo2bo759b2o41bo2bo148b3o$607bo2bo224bo2bo760bo41bo2bo144bo2b 3o$608b2o226b2o804b2o151bo$568b2o1223bo$567bo2bo237b2o980bo4bo$567bo2b o236bo2bo742bobo235bo$568b2o237bo2bo741bo2bo237bo$808b2o743bobo$540b2o 1276bo$539bo2bo1274bobo$539bo2bo282b2o986b2o2b2o$540b2o282bo2bo985b2o 3bobo$824bo2bo992b2o$825b2o993b2o$557b2o1262bo$556bo2bo237b2o1021b2o$ 556bo2bo236bo2bo1020b2o$557b2o237bo2bo$797b2o$529b2o$528bo2bo1246b2o$ 528bo2bo54b2o226b2o961bo2bo$529b2o54bo2bo224bo2bo860bob2o3b2o91bo2bo 13bo$585bo2bo224bo2bo858bo8b2o92b2o14b3o$586b2o226b2o858bo3bo2bo112bo$ 546b2o1127bobo3bo$545bo2bo237b2o888b2o2bo$545bo2bo236bo2bo432bo456bo2b o7bo$546b2o237bo2bo432b3o454bo2bo7b2o$786b2o433bo456bo10b3o$518b2o 1128b2o29bobo8b2o$517bo2bo1126bo2bo36bo$517bo2bo282b2o842bo2bo24b2o9b 3o$518b2o282bo2bo842b2o25b3o7bob2o176b2o$802bo2bo871bo8b3o176bob2o$ 803b2o860bo3b2o5bobo186bo3b2o$535b2o1127bo2bo2bo194b3ob2o4b2o$534bo2bo 237b2o888b3o3bo193bo3b2o4b2o$534bo2bo236bo2bo892bo195bobo$535b2o237bo 2bo1088b3o$775b2o$507b2o1128b2o28bo208bo$506bo2bo1126bo2bo26bo2bo206bo $506bo2bo54b2o226b2o842bo2bo27b2o200b3o3b3o$507b2o54bo2bo224bo2bo842b 2o229bo2bo2bo2bo$563bo2bo224bo2bo1074bobo6bo$564b2o226b2o1076bo4bobo$ 524b2o1128b2o$523bo2bo237b2o887bo2bo$523bo2bo236bo2bo121b2o763bo2bo 200b2o$524b2o237bo2bo121b3o763b2o200bo2bo$764b2o122b2o966bo2bo$496b2o 1128b2o229b2o$495bo2bo1126bo2bo$495bo2bo282b2o842bo2bo$496b2o282bo2bo 842b2o$780bo2bo$781b2o$513b2o1128b2o$512bo2bo1126bo2bo$512bo2bo1126bo 2bo200b2o$513b2o1128b2o200bo2bo$1845bo2bo$485b2o1128b2o229b2o$484bo2bo 1126bo2bo$484bo2bo54b2o1070bo2bo$485b2o54bo2bo1070b2o$541bo2bo$542b2o$ 502b2o1128b2o$501bo2bo1126bo2bo$501bo2bo1126bo2bo200b2o$502b2o1128b2o 200bo2bo$1834bo2bo$474b2o1128b2o229b2o$473bo2bo1126bo2bo$473bo2bo1126b o2bo$474b2o1128b2o3$491b2o1128b2o$490bo2bo1126bo2bo$490bo2bo1126bo2bo 200b2o$491b2o1128b2o200bo2bo$1823bo2bo$463b2o1128b2o229b2o$462bo2bo 1126bo2bo$462bo2bo54b2o1070bo2bo$463b2o54bo2bo1070b2o$519bo2bo$520b2o$ 480b2o1128b2o$479bo2bo1126bo2bo$479bo2bo1126bo2bo200b2o$480b2o1128b2o 200bo2bo$1812bo2bo$452b2o1128b2o229b2o$451bo2bo1126bo2bo$451bo2bo1126b o2bo$452b2o1128b2o3$469b2o1128b2o$468bo2bo1126bo2bo$468bo2bo1126bo2bo 200b2o$469b2o1128b2o200bo2bo$1801bo2bo$441b2o1128b2o229b2o$440bo2bo 1126bo2bo$440bo2bo54b2o1070bo2bo$441b2o54bo2bo1070b2o$497bo2bo$498b2o$ 458b2o1128b2o$457bo2bo1126bo2bo$457bo2bo1126bo2bo200b2o$458b2o1128b2o 200bo2bo$1790bo2bo$430b2o1128b2o229b2o$429bo2bo791b3o332bo2bo$429bo2bo 1126bo2bo$430b2o792bobo333b2o$1225bo2$447b2o1128b2o$446bo2bo1126bo2bo$ 446bo2bo1126bo2bo200b2o$447b2o1128b2o200bo2bo$1779bo2bo$419b2o1128b2o 229b2o$418bo2bo1126bo2bo$418bo2bo54b2o1070bo2bo$419b2o54bo2bo1070b2o$ 475bo2bo$476b2o$436b2o1128b2o$435bo2bo323bo802bo2bo$435bo2bo323b2o801b o2bo200b2o$436b2o324bobo801b2o200bo2bo$765bo1002bo2bo$408b2o351b2ob2o 772b2o229b2o$407bo2bo349b3obo772bo2bo$407bo2bo344bo4b2o2bo772bo2bo$ 408b2o343b4obo3bo775b2o$753b3o$758bobo$425b2o330b2o2bo793b2o$424bo2bo 329bo3bo792bo2bo$424bo2bo319b2o8bo3b2o791bo2bo$425b2o320b2o10bo795b2o 2$397b2o328b2o26b3o769b2o$396bo2bo326bo2bo27bo768bo2bo$396bo2bo54b2o 270bo2bo21b2o3b5o765bo2bo$397b2o54bo2bo270b2o19bo2b2o2b7o765b2o$453bo 2bo290bob2o3b4o2bobo$454b2o291bo2b4o4bo2bo$414b2o332b2o8bo2bo782b2o$ 413bo2bo1126bo2bo$413bo2bo1126bo2bo200b2o$414b2o1128b2o200bo2bo$1746bo 2bo$386b2o328b2o798b2o229b2o$385bo2bo326bo2bo796bo2bo$385bo2bo326bo2bo 796bo2bo$386b2o328b2o798b2o3$403b2o328b2o798b2o$402bo2bo326bo2bo33b3o 760bo2bo$402bo2bo326bo2bo34bo761bo2bo$403b2o328b2o798b2o2$375b2o328b2o 798b2o$374bo2bo326bo2bo796bo2bo$374bo2bo54b2o270bo2bo796bo2bo$375b2o 54bo2bo270b2o798b2o$431bo2bo$432b2o$392b2o328b2o798b2o$391bo2bo326bo2b o796bo2bo$391bo2bo326bo2bo796bo2bo200b2o$392b2o328b2o798b2o200bo2bo$ 1724bo2bo$364b2o328b2o798b2o229b2o$363bo2bo326bo2bo796bo2bo$363bo2bo 326bo2bo796bo2bo$364b2o328b2o798b2o3$381b2o328b2o798b2o$380bo2bo326bo 2bo796bo2bo$380bo2bo326bo2bo796bo2bo$381b2o328b2o798b2o2$353b2o328b2o 798b2o$352bo2bo326bo2bo796bo2bo$352bo2bo54b2o270bo2bo796bo2bo$353b2o 54bo2bo270b2o798b2o$409bo2bo$410b2o$370b2o328b2o798b2o$369bo2bo326bo2b o796bo2bo$369bo2bo326bo2bo796bo2bo200b2o$370b2o328b2o691bobo104b2o200b o2bo$1393b2o307bo2bo$342b2o328b2o208b2o510bo77b2o229b2o$341bo2bo326bo 2bo206b2o588bo2bo$341bo2bo326bo2bo208bo587bo2bo$342b2o328b2o798b2o3$ 359b2o328b2o798b2o$358bo2bo326bo2bo796bo2bo$358bo2bo326bo2bo796bo2bo$ 359b2o328b2o798b2o2$331b2o328b2o798b2o$330bo2bo326bo2bo796bo2bo$330bo 2bo54b2o270bo2bo796bo2bo$331b2o54bo2bo270b2o798b2o$387bo2bo$388b2o$ 348b2o328b2o798b2o$347bo2bo326bo2bo796bo2bo$347bo2bo326bo2bo796bo2bo 200b2o$348b2o328b2o798b2o200bo2bo$1680bo2bo$320b2o328b2o798b2o229b2o$ 319bo2bo326bo2bo796bo2bo$319bo2bo326bo2bo796bo2bo$320b2o328b2o798b2o3$ 337b2o328b2o798b2o$336bo2bo326bo2bo796bo2bo$336bo2bo326bo2bo796bo2bo$ 337b2o328b2o798b2o2$309b2o328b2o798b2o$308bo2bo326bo2bo796bo2bo$308bo 2bo54b2o270bo2bo796bo2bo$309b2o54bo2bo270b2o798b2o$365bo2bo$366b2o$ 326b2o328b2o798b2o$325bo2bo326bo2bo796bo2bo$325bo2bo326bo2bo796bo2bo 200b2o$326b2o328b2o798b2o200bo2bo$1658bo2bo$298b2o328b2o798b2o229b2o$ 297bo2bo326bo2bo796bo2bo$297bo2bo326bo2bo796bo2bo$298b2o328b2o798b2o3$ 315b2o328b2o798b2o$314bo2bo326bo2bo796bo2bo$314bo2bo326bo2bo796bo2bo$ 315b2o328b2o798b2o2$287b2o328b2o798b2o$286bo2bo326bo2bo796bo2bo$286bo 2bo54b2o270bo2bo796bo2bo$287b2o54bo2bo270b2o798b2o$343bo2bo$344b2o$ 304b2o328b2o798b2o$303bo2bo326bo2bo796bo2bo$303bo2bo326bo2bo796bo2bo 200b2o$304b2o328b2o798b2o200bo2bo$1636bo2bo$276b2o328b2o798b2o229b2o$ 275bo2bo326bo2bo350bobo443bo2bo$275bo2bo326bo2bo351b2o443bo2bo$276b2o 328b2o352bo445b2o3$293b2o328b2o798b2o$292bo2bo326bo2bo796bo2bo$292bo2b o326bo2bo796bo2bo$293b2o328b2o798b2o2$265b2o328b2o798b2o$264bo2bo326bo 2bo796bo2bo$264bo2bo54b2o270bo2bo796bo2bo$265b2o54bo2bo270b2o798b2o$ 321bo2bo$322b2o$282b2o328b2o798b2o$281bo2bo326bo2bo796bo2bo$281bo2bo 326bo2bo796bo2bo200b2o$282b2o328b2o798b2o200bo2bo$1614bo2bo$254b2o328b 2o798b2o229b2o$253bo2bo326bo2bo796bo2bo$253bo2bo326bo2bo796bo2bo$254b 2o328b2o798b2o3$271b2o328b2o798b2o$270bo2bo326bo2bo796bo2bo$270bo2bo 326bo2bo796bo2bo$271b2o328b2o798b2o2$243b2o328b2o798b2o$242bo2bo326bo 2bo796bo2bo$242bo2bo54b2o270bo2bo796bo2bo$243b2o54bo2bo270b2o798b2o$ 299bo2bo$300b2o$260b2o328b2o798b2o$259bo2bo326bo2bo796bo2bo$259bo2bo 326bo2bo796bo2bo200b2o$260b2o328b2o798b2o200bo2bo$1592bo2bo$232b2o328b 2o798b2o229b2o$231bo2bo326bo2bo796bo2bo$231bo2bo326bo2bo796bo2bo$232b 2o328b2o798b2o3$249b2o328b2o798b2o$248bo2bo326bo2bo796bo2bo$248bo2bo 326bo2bo796bo2bo$249b2o328b2o798b2o2$221b2o328b2o798b2o$220bo2bo326bo 2bo796bo2bo$220bo2bo54b2o270bo2bo796bo2bo$221b2o54bo2bo270b2o798b2o$ 277bo2bo$278b2o$238b2o328b2o798b2o$237bo2bo326bo2bo188bo607bo2bo$237bo 2bo326bo2bo187b3o606bo2bo200b2o$238b2o328b2o188b3o607b2o200bo2bo$1570b o2bo$210b2o328b2o798b2o229b2o$209bo2bo326bo2bo796bo2bo$209bo2bo326bo2b o796bo2bo$210b2o328b2o798b2o3$227b2o328b2o798b2o$226bo2bo326bo2bo796bo 2bo$226bo2bo326bo2bo796bo2bo$227b2o328b2o798b2o2$199b2o328b2o798b2o$ 198bo2bo326bo2bo796bo2bo$198bo2bo54b2o270bo2bo796bo2bo$199b2o54bo2bo 270b2o798b2o$255bo2bo$256b2o$216b2o328b2o798b2o$215bo2bo326bo2bo796bo 2bo$215bo2bo326bo2bo796bo2bo200b2o$216b2o328b2o798b2o200bo2bo$1548bo2b o$188b2o328b2o798b2o229b2o$187bo2bo326bo2bo796bo2bo$187bo2bo326bo2bo 796bo2bo$188b2o328b2o798b2o3$205b2o328b2o798b2o$204bo2bo326bo2bo796bo 2bo$204bo2bo326bo2bo796bo2bo$205b2o328b2o798b2o2$177b2o328b2o798b2o$ 176bo2bo326bo2bo796bo2bo$176bo2bo54b2o270bo2bo796bo2bo$177b2o54bo2bo 270b2o798b2o$233bo2bo$234b2o$194b2o328b2o798b2o$193bo2bo326bo2bo796bo 2bo$193bo2bo326bo2bo796bo2bo200b2o$194b2o328b2o798b2o200bo2bo$1526bo2b o$166b2o328b2o798b2o229b2o$165bo2bo326bo2bo796bo2bo$165bo2bo326bo2bo 796bo2bo$166b2o328b2o798b2o3$183b2o328b2o798b2o$182bo2bo326bo2bo796bo 2bo$182bo2bo326bo2bo796bo2bo$183b2o328b2o798b2o2$155b2o328b2o798b2o$ 154bo2bo326bo2bo796bo2bo$154bo2bo54b2o270bo2bo796bo2bo$155b2o54bo2bo 270b2o798b2o$211bo2bo$212b2o$172b2o328b2o798b2o$171bo2bo326bo2bo796bo 2bo$171bo2bo326bo2bo796bo2bo200b2o$172b2o328b2o798b2o200bo2bo$1504bo2b o$144b2o328b2o798b2o229b2o$143bo2bo326bo2bo796bo2bo$143bo2bo326bo2bo 796bo2bo$144b2o328b2o798b2o2$1188bobo$161b2o328b2o695b2o101b2o$160bo2b o326bo2bo695bo100bo2bo$160bo2bo326bo2bo796bo2bo$161b2o328b2o798b2o2$ 133b2o328b2o798b2o$132bo2bo326bo2bo796bo2bo$132bo2bo54b2o270bo2bo796bo 2bo$133b2o54bo2bo270b2o798b2o$189bo2bo$190b2o$150b2o328b2o798b2o$149bo 2bo326bo2bo796bo2bo$149bo2bo326bo2bo796bo2bo200b2o$150b2o328b2o798b2o 200bo2bo$1482bo2bo$122b2o328b2o798b2o229b2o$121bo2bo326bo2bo796bo2bo$ 121bo2bo326bo2bo796bo2bo$122b2o328b2o798b2o3$139b2o328b2o798b2o$138bo 2bo326bo2bo796bo2bo$138bo2bo326bo2bo796bo2bo$139b2o328b2o798b2o2$111b 2o328b2o798b2o$110bo2bo326bo2bo796bo2bo$110bo2bo326bo2bo796bo2bo$111b 2o328b2o798b2o3$128b2o328b2o798b2o$127bo2bo326bo2bo796bo2bo$127bo2bo 326bo2bo796bo2bo200b2o$128b2o328b2o798b2o200bo2bo$1460bo2bo$100b2o328b 2o798b2o229b2o$99bo2bo326bo2bo796bo2bo$99bo2bo326bo2bo796bo2bo$100b2o 328b2o771bo26b2o$1203bo$1202b3o$117b2o328b2o798b2o$116bo2bo326bo2bo 796bo2bo$116bo2bo326bo2bo796bo2bo$117b2o328b2o798b2o2$89b2o328b2o798b 2o$88bo2bo326bo2bo796bo2bo$88bo2bo326bo2bo796bo2bo$89b2o328b2o798b2o3$ 106b2o328b2o798b2o$105bo2bo326bo2bo796bo2bo$105bo2bo326bo2bo796bo2bo 200b2o$106b2o328b2o798b2o200bo2bo$1438bo2bo$78b2o328b2o798b2o229b2o$ 77bo2bo157bo168bo2bo796bo2bo$77bo2bo156b2o168bo2bo796bo2bo$78b2o157bob o168b2o798b2o3$95b2o328b2o798b2o$94bo2bo326bo2bo796bo2bo$94bo2bo326bo 2bo796bo2bo$95b2o328b2o798b2o2$67b2o328b2o798b2o$66bo2bo326bo2bo608bob o185bo2bo$66bo2bo326bo2bo607bo2bo185bo2bo$67b2o328b2o609bobo186b2o3$ 84b2o328b2o798b2o$83bo2bo326bo2bo796bo2bo$83bo2bo326bo2bo796bo2bo200b 2o$84b2o328b2o798b2o200bo2bo$1416bo2bo$56b2o328b2o1029b2o$55bo2bo326bo 2bo454bo$55bo2bo326bo2bo452b2o2bo$56b2o328b2o455bo3$73b2o328b2o726b2o 70b2o$72bo2bo326bo2bo725bobo68bo2bo$72bo2bo326bo2bo341b3o380bo2bo6b2o 60bo2bo$73b2o328b2o727b2o6bobo60b2o$747bobo381bo$45b2o328b2o371bo387b 2o5bo$44bo2bo326bo2bo298bo460b3o3bo$44bo2bo326bo2bo298b3o458b2o$45b2o 328b2o299bo459b2o2bo2bo$1105b2o27b6ob2o$1104bo2bo26bob3o2bobo$62b2o 328b2o710bo2bo27b2o5bo2b2o$61bo2bo326bo2bo710b2o37bo2bo$61bo2bo326bo2b o748bo251b2o$62b2o328b2o752bo247bo2bo$1122b2o19bobo248bo2bo$34b2o328b 2o755bo2bo270b2o$33bo2bo326bo2bo143bo610bo2bo$33bo2bo326bo2bo142b2o 611b2o$34b2o328b2o144bo$1094b2o$1093bo2bo$51b2o328b2o710bo2bo$50bo2bo 326bo2bo710b2o$50bo2bo326bo2bo$51b2o328b2o$1111b2o$23b2o1085bo2bo$22bo 2bo317b2o765bo2bo$22bo2bo317b3o765b2o$23b2o318b2o$1083b2o$1082bo2bo$ 40b2o1040bo2bo$39bo2bo1040b2o$39bo2bo1330b2o$40b2o1330bo2bo$1100b2o 270bo2bo$12b2o1085bo2bo270b2o$11bo2bo1084bo2bo$11bo2bo1085b2o$12b2o$ 1072b2o$1071bo2bo$29b2o1040bo2bo$28bo2bo1040b2o$28bo2bo$29b2o$1089b2o$ b2o1085bo2bo$o2bo8bo1075bo2bo$o2bo6b2o2bo1074b2o$b2o9bo$1061b2o$1060bo 2bo$18b2o1040bo2bo$17bo2bo1040b2o$17bo2bo1330b2o$18b2o1330bo2bo$1078b 2o270bo2bo$1077bo2bo270b2o$1077bo2bo$1078b2o2$1050b2o$1049bo2bo$1049bo 2bo$1050b2o3$1067b2o$1066bo2bo$1066bo2bo$1067b2o2$1039b2o$1038bo2bo$ 1038bo2bo$1039b2o$1329b2o$1328bo2bo$1056b2o270bo2bo$1055bo2bo270b2o$ 1055bo2bo$1056b2o2$1028b2o$1027bo2bo$1027bo2bo$1028b2o3$1045b2o$1044bo 2bo$1044bo2bo$1045b2o2$1017b2o$1016bo2bo$1016bo2bo$1017b2o$1307b2o$ 1306bo2bo$1034b2o270bo2bo$1033bo2bo270b2o$1033bo2bo$1034b2o2$1006b2o$ 1005bo2bo$1005bo2bo$1006b2o3$1023b2o$1022bo2bo$1022bo2bo$1023b2o2$995b 2o$994bo2bo$994bo2bo$995b2o$1285b2o$1284bo2bo$1012b2o270bo2bo$1011bo2b o270b2o$1011bo2bo$1012b2o2$984b2o$983bo2bo$983bo2bo$984b2o3$1001b2o$ 1000bo2bo$1000bo2bo$1001b2o2$973b2o$972bo2bo$972bo2bo$973b2o$1263b2o$ 1262bo2bo$990b2o270bo2bo$989bo2bo270b2o$989bo2bo$990b2o2$962b2o$961bo 2bo$961bo2bo$962b2o3$979b2o$978bo2bo$978bo2bo$979b2o2$951b2o$950bo2bo$ 950bo2bo$951b2o$737bo503b2o$1240bo2bo77bo$736bobo229b2o270bo2bo76bob2o $737bo229bo2bo270b2o75bobo2bo$737bo229bo2bo347bo3b2o$968b2o348bob2o$ 1319bobo$940b2o377b2o$939bo2bo373bo$939bo2bo372b3o$940b2o372bo4bo$ 1314bo$1314b2o3bo$957b2o357b3o$956bo2bo356b3o$956bo2bo332b2o$957b2o 332bo2bo$1291bo2bo$929b2o361b2o$928bo2bo$928bo2bo$929b2o$1219b2o$1218b o2bo$946b2o270bo2bo$945bo2bo270b2o$945bo2bo332b2o$946b2o332bo2bo$1280b o2bo$918b2o361b2o$917bo2bo$917bo2bo$918b2o378b2o$1297bo2bo$1297bo2bo$ 935b2o361b2o$934bo2bo$934bo2bo332b2o$935b2o332bo2bo$1269bo2bo$907b2o 361b2o$906bo2bo$906bo2bo$907b2o378b2o$1197b2o87bo2bo$1196bo2bo86bo2bo$ 924b2o270bo2bo87b2o$533bo389bo2bo270b2o$534b2o387bo2bo332b2o$533b2o 389b2o332bo2bo$1258bo2bo$896b2o361b2o$895bo2bo$895bo2bo$896b2o378b2o$ 1275bo2bo$1275bo2bo$913b2o361b2o$912bo2bo$912bo2bo332b2o$913b2o332bo2b o$1247bo2bo$885b2o361b2o$884bo2bo$884bo2bo$885b2o378b2o$1175b2o87bo2bo $1174bo2bo86bo2bo$902b2o270bo2bo87b2o$901bo2bo270b2o$901bo2bo332b2o$ 902b2o332bo2bo$1236bo2bo$874b2o361b2o$873bo2bo$873bo2bo$874b2o378b2o$ 1253bo2bo$1253bo2bo$891b2o361b2o$890bo2bo$890bo2bo332b2o$891b2o332bo2b o$1225bo2bo$863b2o361b2o$862bo2bo$862bo2bo$863b2o378b2o$1153b2o87bo2bo $1152bo2bo86bo2bo$880b2o270bo2bo87b2o$879bo2bo270b2o$879bo2bo332b2o$ 880b2o332bo2bo$1214bo2bo$852b2o361b2o$851bo2bo$851bo2bo$852b2o378b2o$ 1231bo2bo$1231bo2bo$869b2o361b2o$868bo2bo$868bo2bo332b2o$869b2o332bo2b o$1203bo2bo$841b2o361b2o$840bo2bo$840bo2bo$841b2o378b2o$1131b2o87bo2bo $1130bo2bo86bo2bo$858b2o270bo2bo87b2o$857bo2bo270b2o$857bo2bo332b2o$ 858b2o332bo2bo$1192bo2bo$830b2o361b2o$829bo2bo$829bo2bo$830b2o378b2o$ 1209bo2bo$1209bo2bo$847b2o361b2o$846bo2bo$846bo2bo332b2o$847b2o332bo2b o$1181bo2bo$819b2o361b2o$818bo2bo$818bo2bo$819b2o378b2o$1109b2o87bo2bo $1108bo2bo86bo2bo$836b2o270bo2bo87b2o$835bo2bo270b2o$835bo2bo332b2o$ 836b2o332bo2bo$1170bo2bo$808b2o361b2o$807bo2bo$807bo2bo$808b2o378b2o$ 1187bo2bo$1187bo2bo$825b2o361b2o$824bo2bo$824bo2bo332b2o$825b2o332bo2b o$1159bo2bo$797b2o361b2o$796bo2bo$796bo2bo$797b2o378b2o$1087b2o87bo2bo $1086bo2bo86bo2bo$814b2o270bo2bo87b2o$813bo2bo270b2o$813bo2bo332b2o$ 814b2o332bo2bo$1148bo2bo$786b2o361b2o$785bo2bo$785bo2bo$786b2o378b2o$ 1165bo2bo$1165bo2bo$726bo76b2o361b2o$726bo75bo2bo$725b3o74bo2bo332b2o$ 803b2o332bo2bo$1137bo2bo$648bo126b2o361b2o$647b2o125bo2bo$647bobo124bo 2bo$775b2o378b2o$1065b2o87bo2bo$1064bo2bo86bo2bo$792b2o270bo2bo87b2o$ 791bo2bo270b2o$791bo2bo332b2o$792b2o332bo2bo$1126bo2bo$764b2o361b2o$ 763bo2bo$763bo2bo$764b2o378b2o$1143bo2bo$1143bo2bo$781b2o361b2o$780bo 2bo$780bo2bo332b2o$781b2o332bo2bo$1115bo2bo$753b2o361b2o$752bo2bo$752b o2bo$753b2o378b2o$1043b2o87bo2bo$1042bo2bo86bo2bo$770b2o270bo2bo87b2o$ 769bo2bo270b2o$769bo2bo332b2o$770b2o332bo2bo$1104bo2bo$742b2o361b2o$ 741bo2bo$741bo2bo$742b2o378b2o$1121bo2bo$1121bo2bo$759b2o361b2o$758bo 2bo$758bo2bo332b2o$759b2o332bo2bo$1093bo2bo$731b2o361b2o$730bo2bo$730b o2bo$731b2o378b2o$1021b2o87bo2bo$1020bo2bo86bo2bo$748b2o270bo2bo87b2o$ 747bo2bo270b2o$747bo2bo332b2o$748b2o332bo2bo$1082bo2bo$1083b2o3$1100b 2o$1099bo2bo$1099bo2bo$737b2o361b2o$736bo2bo$736bo2bo332b2o$737b2o332b o2bo$1071bo2bo$1072b2o3$1089b2o$999b2o87bo2bo$998bo2bo86bo2bo$998bo2bo 87b2o$999b2o$1061b2o$1060bo2bo$1060bo2bo$1061b2o$339bobo$340b2o$340bo 737b2o$1077bo2bo$1077bo2bo$1078b2o2$1050b2o$1049bo2bo$1049bo2bo$1050b 2o3$1067b2o$977b2o87bo2bo$976bo2bo86bo2bo$976bo2bo87b2o$977b2o$1039b2o $1038bo2bo$1038bo2bo$1039b2o3$1056b2o$1055bo2bo$1055bo2bo$1056b2o2$ 1028b2o$1027bo2bo$1027bo2bo$1028b2o3$1045b2o$955b2o87bo2bo$954bo2bo86b o2bo$954bo2bo87b2o$955b2o$1017b2o$1016bo2bo$1016bo2bo$1017b2o3$1034b2o $1033bo2bo$1033bo2bo$1034b2o2$1006b2o$1005bo2bo$1005bo2bo$1006b2o3$ 1023b2o$933b2o87bo2bo$932bo2bo86bo2bo$932bo2bo87b2o$933b2o$995b2o$994b o2bo$994bo2bo$995b2o3$1012b2o$1011bo2bo$1011bo2bo$1012b2o2$984b2o$983b o2bo$983bo2bo$984b2o3$1001b2o$911b2o87bo2bo$910bo2bo86bo2bo$910bo2bo 87b2o$911b2o$973b2o$972bo2bo$972bo2bo$973b2o3$990b2o$989bo2bo$989bo2bo $990b2o2$962b2o$961bo2bo$961bo2bo$962b2o3$979b2o$889b2o87bo2bo$888bo2b o86bo2bo$888bo2bo87b2o$889b2o$951b2o$950bo2bo$950bo2bo$951b2o3$968b2o$ 967bo2bo$967bo2bo$968b2o2$940b2o$939bo2bo$939bo2bo$940b2o3$957b2o$867b 2o87bo2bo$866bo2bo86bo2bo$866bo2bo87b2o$867b2o$929b2o$928bo2bo$928bo2b o$929b2o3$946b2o$945bo2bo$945bo2bo$946b2o2$918b2o$917bo2bo$917bo2bo$ 918b2o3$935b2o$934bo2bo$934bo2bo$935b2o2$907b2o$906bo2bo$906bo2bo$907b 2o3$924b2o$923bo2bo$923bo2bo$924b2o2$896b2o$895bo2bo$895bo2bo$896b2o3$ 913b2o$912bo2bo$912bo2bo$913b2o2$885b2o$884bo2bo$884bo2bo$885b2o3$902b 2o$901bo2bo$901bo2bo$902b2o2$874b2o$873bo2bo$873bo2bo$874b2o3$891b2o$ 890bo2bo$890bo2bo$891b2o2$863b2o$862bo2bo$862bo2bo$863b2o3$880b2o$879b o2bo$879bo2bo$880b2o2$852b2o$851bo2bo$851bo2bo$852b2o3$869b2o$868bo2bo $868bo2bo$869b2o2$841b2o$840bo2bo$840bo2bo$841b2o3$858b2o$857bo2bo$ 857bo2bo$858b2o2$830b2o$829bo2bo$829bo2bo$830b2o3$847b2o$846bo2bo$846b o2bo$847b2o2$819b2o$818bo2bo$818bo2bo$819b2o3$836b2o$835bo2bo$835bo2bo $836b2o2$808b2o$704bo102bo2bo$703b3o101bo2bo$703b3o102b2o3$825b2o$824b o2bo$824bo2bo$825b2o2$797b2o$796bo2bo$796bo2bo$797b2o3$814b2o$813bo2bo $813bo2bo$814b2o2$786b2o$785bo2bo$785bo2bo$786b2o3$803b2o$802bo2bo$ 802bo2bo$803b2o2$775b2o$774bo2bo$774bo2bo$775b2o3$792b2o$791bo2bo$791b o2bo$792b2o2$764b2o$763bo2bo$763bo2bo$764b2o3$781b2o$780bo2bo$780bo2bo $781b2o2$753b2o$752bo2bo$752bo2bo$753b2o3$770b2o$769bo2bo$769bo2bo$ 770b2o2$742b2o$741bo2bo$741bo2bo$742b2o3$759b2o$758bo2bo$758bo2bo$759b 2o2$731b2o$730bo2bo$730bo2bo$731b2o3$748b2o$747bo2bo$747bo2bo$748b2o2$ 720b2o$719bo2bo$719bo2bo$720b2o3$737b2o$736bo2bo$736bo2bo$737b2o2$709b 2o$708bo2bo$708bo2bo$709b2o3$726b2o$725bo2bo$725bo2bo$726b2o2$698b2o$ 697bo2bo$697bo2bo$698b2o3$715b2o$714bo2bo$714bo2bo$715b2o8$704b2o$703b o2bo$703bo2bo$704b2o!golly-3.3-src/Patterns/Non-Totalistic/horiship-guns.rle0000644000175000017500000006774112750014265020206 00000000000000#C p420 (left) and p56 (right) horiship guns by AbhpzTa, 30 July 2016 #C http://www.conwaylife.com/forums/viewtopic.php?f=11&t=2162&p=33755#p33753 x = 1163, y = 397, rule = B2cek3i_S12cei 884bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobo2$882bo107bo$382bobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobo$880bo3bobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3b o$380bo111bo$878bo3bo107bo3bo$380bo111bo$878bo3bo107bo3bo$380bo111bo$ 878bo3bo107bo3bo$380bo111bo$878bo3bo107bo3bo$380bo111bo$878bo3bo107bo 3bo$380bo111bo$868bobobobobo3bo3bobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3b o3bobobobobo$380bo111bo$866bo11bo3bo107bo3bo11bo$366bobobobobobobo3bob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobo3bobobobobobobo$864bo3bobobobobo 3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo$364bo15bo 111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo 11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo 3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo 15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo 107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364b o15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo 3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo 11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo 111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo 11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo 3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo 15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo 107bo3bo11bo3bo$364bo15bo111bo15bo$828bobobobobobobobobobobobobobobobo bo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo 3bo3bobobobobobobobobobobobobobobobobo$364bo15bo111bo15bo$826bo35bo3bo 11bo3bo107bo3bo11bo3bo35bo$326bobobobobobobobobobobobobobobobobobobo3b obobobobobobo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobo3bobobobobobobo 3bobobobobobobobobobobobobobobobobobobo$824bo3bobobobobobobobobobobobo bobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bo bobobobo3bo3bobobobobobobobobobobobobobobobobo3bo$324bo39bo15bo111bo 15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo 111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo 15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo 39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$ 324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3b o$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo 3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo 3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo 107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo 3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo 11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$796bobobobobo bobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobo3b o3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobo bobobobobobobobobobo3bo3bobobobobobobobobobobobobo$324bo39bo15bo111bo 15bo39bo$794bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo$294bobob obobobobobobobobobobobobo3bobobobobobobobobobobobobobobobobobobo3bobob obobobobo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobo bobobobobobobobobobobobobobobobobo3bobobobobobobobobobobobobobobo$792b o3bobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo 3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3b obobobobobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo$ 292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo 111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo 27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo 3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$ 790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo 39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo 3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo 31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo 31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11b o3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$772bobobobobobob obobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobobobob obo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bobobobob o3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobo 3bo3bobobobobobobobobo$292bo31bo39bo15bo111bo15bo39bo31bo$770bo19bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo$270bobobobobobo bobobobobo3bobobobobobobobobobobobobobobo3bobobobobobobobobobobobobobo bobobobobo3bobobobobobobo3bobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bob obobobobobo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobobobob obobobobobo3bobobobobobobobobobobo$768bo3bobobobobobobobobo3bo3bobobob obobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobob o3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobob obobobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobob obobo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107b o3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31b o23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3b o19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$67bobobobo650bobob obobobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobo3bo3bobobob obobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobob o3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobob obobobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobob obobo3bo3bobobobobobobobobobobobobobobobobobobobobo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$65bo9bo646bo43bo3bo19bo3bo27bo3bo35bo3bo11bo 3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo$222bobobobobobobobobobobob obobobobobobobobobobobo3bobobobobobobobobobobo3bobobobobobobobobobobob obobobo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobobobobobobobobo bobobobobobobobo3bobobobobobobobobobobobobobobo3bobobobobobobobobobobo 3bobobobobobobobobobobobobobobobobobobobobobobo$65bo9bo644bo3bobobobob obobobobobobobobobobobobobobobobo3bo3bobobobobobobobobo3bo3bobobobobob obobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo 3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobob obobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobob o3bo3bobobobobobobobobobobobobobobobobobobobobo3bo$220bo47bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo47bo$65bo9bo642bo3bo43bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo$220bo47bo23b o31bo39bo15bo111bo15bo39bo31bo23bo47bo$17bo49bobobobo642bo3bo3bobobobo bobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobo3bo3bobobobobo bobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobo3b o3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobo bobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobo bo3bo3bobobobobobobobobobobobobobobobobobobobobo3bo3bo$220bo47bo23bo 31bo39bo15bo111bo15bo39bo31bo23bo47bo$17bo696bo3bo3bo43bo3bo19bo3bo27b o3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo$214bo bobo3bobobobobobobobobobobobobobobobobobobobobobobo3bobobobobobobobobo bobo3bobobobobobobobobobobobobobobo3bobobobobobobobobobobobobobobobobo bobo3bobobobobobobo3bobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bobobobob obobo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobobobobobobob obobo3bobobobobobobobobobobo3bobobobobobobobobobobobobobobobobobobobob obobo3bobobo$17bo694bo3bo3bo3bobobobobobobobobobobobobobobobobobobobob o3bo3bobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobob obobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobob obobobobobobobobo3bo3bobobobobobobobobo3bo3bobobobobobobobobobobobobob obobobobobobobo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo 23bo47bo7bo$17bo692bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo47bo7bo$17bo692bo3bo3bo3bo43bo3bo19bo3bo27bo 3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$ 212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$17bo692bo3bo 3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo 19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo 47bo7bo$17bo52bo639bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo47bo7bo$17bo52bo639bo3bo3bo3bo43bo3bo19bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo $212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$70bo639bo3bo 3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo 19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo 47bo7bo$2bobobo63bo639bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo 107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo47bo7bo$o7bo61bo639bo3bo3bo3bo43bo3bo19bo 3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo 3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$o7bo61bo 33bobo603bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo 15bo39bo31bo23bo47bo7bo$o7bo61bo33bobo603bo3bo3bo3bo43bo3bo19bo3bo27bo 3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$ 212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$o7bo21bo39bo 33bobo603bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo 15bo39bo31bo23bo47bo7bo$2bobobo22b2o73bobo603bo3bo3bo3bo43bo3bo19bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo $212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$104bobo603bo 3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo 3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo 23bo47bo7bo$104bobo603bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo 107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo47bo7bo$104bobo603bo3bo3bo3bo43bo3bo19bo 3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo 3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo 3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo 19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo 47bo7bo$710bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo 3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$64bobobobobobo137bo7bo47bo23bo 31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo3bo3bo43bo3bo19bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo $62bo13bo135bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$82bo 627bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3b o27bo3bo19bo3bo43bo3bo3bo3bo$64bobobobobobo7bobo127bo7bo47bo23bo31bo 39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo3bo3bo43bo3bo19bo3bo27bo 3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$ 212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo3bo3b o43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo 3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo 7bo$710bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo 15bo39bo31bo23bo47bo7bo$710bo3bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo 3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo$212bo7bo47bo23bo 31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo3bo3bo43bo3bo19bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo3bo3bo $212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$710bo3bo3bo 3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19b o3bo43bo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47b o7bo$712bo3bo3bo3bobobobobobobobobobobobobobobobobobobobobo3bo3bobobob obobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobobobobobob obobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bob obobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobobob obobo3bo3bobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobobobob obo3bo3bo3bo$212bo7bo47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo7bo$ 45bobobo664bo3bo3bo43bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo19bo3bo43bo3bo3bo$214bobobo3bobobobobobobobobobobobobobo bobobobobobobobobo3bobobobobobobobobobobo3bobobobobobobobobobobobobobo bo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobo3bobobobobobobo3bobobobobobobobobobobobobob obobobobobo3bobobobobobobobobobobobobobobo3bobobobobobobobobobobo3bobo bobobobobobobobobobobobobobobobobobobobobo3bobobo$43bo7bo664bo3bo3bobo bobobobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobo3bo3bobobo bobobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobo bo3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobo bobobobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobo bobobo3bo3bobobobobobobobobobobobobobobobobobobobobo3bo3bo$220bo47bo 23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo$43bo7bo666bo3bo43bo3bo19bo3b o27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo3bo$220b o47bo23bo31bo39bo15bo111bo15bo39bo31bo23bo47bo$43bo7bo668bo3bobobobobo bobobobobobobobobobobobobobobobo3bo3bobobobobobobobobo3bo3bobobobobobo bobobobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo 3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobob obobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobob o3bo3bobobobobobobobobobobobobobobobobobobobobo3bo$64bobo153bo47bo23bo 31bo39bo15bo111bo15bo39bo31bo23bo47bo$43bo7bo670bo43bo3bo19bo3bo27bo3b o35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo43bo$64bobo155bobob obobobobobobobobobobobobobobobobobobobobo3bobobobobobobobobobobo3bobob obobobobobobobobobobobobo3bobobobobobobobobobobobobobobobobobobo3bobob obobobobo3bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobo bobobobobobobobobobobobobobobobobo3bobobobobobobobobobobobobobobo3bobo bobobobobobobobobo3bobobobobobobobobobobobobobobobobobobobobobobo$45bo bobo674bobobobobobobobobobobobobobobobobobobobobo3bo3bobobobobobobobob o3bo3bobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobo 3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobo3bo3bobobobobo3b o3bobobobobobobobobobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo 3bobobobobobobobobo3bo3bobobobobobobobobobobobobobobobobobobobobo$64bo bo201bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35b o3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$64bobo201bo23bo31bo39b o15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3b o11bo3bo35bo3bo27bo3bo19bo3bo$64bobo201bo23bo31bo39bo15bo111bo15bo39bo 31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27b o3bo19bo3bo$64bobo201bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo 19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$64bob o201bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo 3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo 111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo 3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$ 766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo 3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23b o$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19b o3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23b o$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19b o3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23b o$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19b o3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23b o$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19b o3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo 15bo111bo15bo39bo31bo23bo$766bo3bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo27bo3bo19bo3bo$268bo23bo31bo39bo15bo111bo15bo39bo31bo23b o$768bo3bobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobo bobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobo bobobobobobobobobobo3bo3bobobobobobobobobo3bo$268bo23bo31bo39bo15bo 111bo15bo39bo31bo23bo$770bo19bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo27bo3bo19bo$270bobobobobobobobobobobo3bobobobobobobobobobobobob obobo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobo3bobobobobobobo3bobobobobobobobobobobobo bobobobobobobo3bobobobobobobobobobobobobobobo3bobobobobobobobobobobo$ 772bobobobobobobobobo3bo3bobobobobobobobobobobobobo3bo3bobobobobobobob obobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobob obobobobobobobo3bo3bobobobobobobobobo$292bo31bo39bo15bo111bo15bo39bo 31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo 31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11b o3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo 35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo 39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$ 292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo 27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo 111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo 27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$790bo3bo27bo3bo35bo3bo11bo 3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$ 790bo3bo27bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo3bo$292bo31bo 39bo15bo111bo15bo39bo31bo$792bo3bobobobobobobobobobobobobo3bo3bobobobo bobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobo bobobobobobobobobobobo3bo$292bo31bo39bo15bo111bo15bo39bo31bo$794bo27bo 3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo27bo$294bobobobobobobobobobobob obobobo3bobobobobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobo3bobobobobobobo3bobobobobobobobobobobo bobobobobobobobo3bobobobobobobobobobobobobobobo$796bobobobobobobobobob obobobo3bo3bobobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobob obobobobobo3bo3bobobobobobobobobobobobobo$324bo39bo15bo111bo15bo39bo$ 822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39b o$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo 39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo111bo 15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo15bo 111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo39bo 15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$324bo 39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3bo$ 324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo3b o$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo35bo 3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo3bo 35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo11bo 3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo3bo 11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$822bo3bo35bo3bo11bo3bo107bo 3bo11bo3bo35bo3bo$324bo39bo15bo111bo15bo39bo$824bo3bobobobobobobobobob obobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo 3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo3bo$324bo39bo15bo 111bo15bo39bo$826bo35bo3bo11bo3bo107bo3bo11bo3bo35bo$326bobobobobobobo bobobobobobobobobobobobo3bobobobobobobo3bobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobo3bobobobobobobo3bobobobobobobobobobobobobobobobobobobo$828bo bobobobobobobobobobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobo3bo3bobobobobo3bo3bobobobobobobobobobobobobobobobobo$ 364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$ 862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo 3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo 111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo 11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo 3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo 15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo 107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364b o15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo 3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo 11bo3bo$364bo15bo111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo 111bo15bo$862bo3bo11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$862bo3bo 11bo3bo107bo3bo11bo3bo$364bo15bo111bo15bo$864bo3bobobobobo3bo3bobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobo3bo3bobobobobo3bo$364bo15bo111bo15bo$866bo 11bo3bo107bo3bo11bo$366bobobobobobobo3bobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobo3bobobobobobobo$868bobobobobo3bo3bobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobo3bo3bobobobobo$380bo111bo$878bo3bo107bo3bo$380bo111bo$878bo3bo 107bo3bo$380bo111bo$878bo3bo107bo3bo$380bo111bo$878bo3bo107bo3bo$380bo 111bo$878bo3bo107bo3bo$380bo111bo$880bo3bobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobo3bo$380bo111bo$882bo107bo$382bobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobo$884bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobo! golly-3.3-src/Patterns/Non-Totalistic/Sierpinski-builder.rle0000644000175000017500000000017212750014265021134 00000000000000#C A 6-cell double Sierpinski triangle builder found by Daniel R. Collazo. x = 3, y = 3, rule = B3_S23-a4ei6 b2o$obo$b2o! golly-3.3-src/Patterns/Non-Totalistic/unit-fraction-orthogonal-spaceships.zip0000644000175000017500000003656313543255652024531 00000000000000PK–OµÍÎ^Ã<E'unit-fraction-orthogonal-spaceships.lua}mo»‘æwþö—@qøÎî ;™Á`EY$³Ÿ‚`q,K¶reÉ‘äk\ ö¿/«XEÉja±VŸ>M>¬V‘E6»y|÷pu¾;}>]ž>?ÜÝýöÓïÞ¾yü~w}þz y>_?º}üéd>½û݇ïþr¾½ÿøðãýó¯öƒÿÀ»·onJéۇ߮ïb§w?Þ†·7§›Óó—ëû·oNåßÍÏ?oŸ¯zûæo{ûæ_þò¿þôï§‘iÉýÏ?þëŸþýí›ûÿýô|~¾~úÙ§’¸¾ýüåãÃã—‡‡O?ÿÇÃÃãõÛ7O¿}ýzýüx[Š<>@Ñðx}sw}õüöͯçÇÓù|iéê㥣««KOWŸ.]]_Fºº¹Ltõù2ÓÕ—ËíD—·—;_þãÒºüåÒ²œ»KË‚¾^Z–tiYÔÃ¥eYß.- ûç¥ei—v£Ë§K»Óåó¥ciß/KûõÒ±´—ޤ½œ/I{)Õ&i/Ÿ.I{¹¹t$íåöÒ‘´—_.I{¹»ô$íåë¥'i/—ž¤½|»ô,íéÒ³´—KÏu»ü/sa/Ü…¿ñ"]ä‹íb¿°%Ó^Xwaý… 6^Øtaó…Ý.ì~áÌ…+4îÂù .\¼péÂå ·]¸ý› o/|aé/|¸ðñÿTQ/Ïõâ_\óÅ _|æ‹[¾ø_üïïnoJs2ç3¦ýÏ0Í€é%fÀ0× 4ò4°Ìg`ÆP˜ Ô[f„$°˜D©wæZÌÀ!ÅTÁ¦îZR•ÊkrŒÄ v> d®©bËEŽ ™)÷W=ý#þÎÇüðþjGôªæ\uª+‘?\P~=„èœf!3 Ô˜Ã\W€ÒMÛQü ¬2s(Ì– Bf¥D¾™‘^~­Š@º ™ª8±/BÎWGH³ä$~á&ØHäÀf¥aÖ–ù ŽÁŸ(ߌˆÈ!¸ —Mœ†|qÑø´c‘ÀÙ“Œ@á6ÖrAŽi„ú B£åÕ‚¨Ü¤¤‘2G¯ÌÜ4 ƨÿQ¶”2f„$0@#0X†DÏÌF@ÐP¥§Ê\3zM_Xýk:„j˜G@e%ùt@ž Ácf\TcFæFæÏZI`¢‘ÀÀT ¥všR£¶Šb“¾ªøY5¥Žš#±»œ¯2WH1Ù(ǬT€”ÖÑŸ7ty70Í€é%fÀ0× 4ò4°Ìg`Æ©]ÎÌÔzµ©W;Ôºôâ(¤-Ey 0ò±Ž+0™l®Ê,䀙¢ZÇó+µ?ß •™U\ ³È$"3uÝFí'åú@¥ƒdôëg:„þŸ;`$4šÓKÌ€a®+@iäi`%˜ÏÀŒSkŸ™TPJ_s6J‘3Zs54“ :Ÿ•Â,4ƒVÒ˜)ª)uÔ䉨å,-6WH1Ù"GˆÌHiíõ.ìËš"_Z¾¹.¨ñLH+_…Ñ”;r’ ,¬&Ⴥff:Ëïln#.‰&Å k5%`FH4S=e f ³ÐLZ©BfÔšœ¿!Í0ƒ…›PjAÌT`©§VŸYÃ:ªÑ‘L¢S½¢ÆX¯#‹Ÿ¿Ì®4oh ¥4Å]®æ )ù½¿rõîø–áèÛ €€fÀô3`˜ë PšyX æ30ãbffR¸<1Ei¼†u‰ºµLq¡´O·—RòÍŒôò3Õ€ t"°̺i•TÅuuXEŽ ™©é¶¨¿`¯Ñéµ.˜ˆL·Ô$TÁédkz–P€kçÐ!<ô €€fÀô3`˜ë PšyX æ30ã ff rÌ^V|BzùvAS=f’Q/A¢S©µ™ÿqç2ÃÕ é ¥´ê,¥a—“´ípRÌ+8+¦oº¨n™4Y.Ø¡Iº°•§‘e°C:Íb‹°E—c+Ýj¯‚¯Úf¥œí©"à˜–àÆêâÖ/tj]ðʯ‡ 4#  0½Ä 4MV€Ò£¶« Á|fœÂÛÌl©à$d!!½fu™bTT˪?­ÎìQÔ Mf™I4†k=gn‡T 4™§è G»jΰ³”®XN‹Õù¤˜WpVLßtQÝ2i²0\°C“ta+O#Ë`‡tšÅaˆ• Qøîè0íï|×#¡Ð ˜^b s]J O+Á|fœzöÌL Ÿu›l¢Vñ@>¨4Ç̺«Æ?ßMÈx¥øEá&%©.i”“jЉ[;TÃu2R_”\}¤3<¶Ä$Ps N%ºsW … `a¹ªs`ÆUÞtyPï•n9J™´ï.ÕP-ˆéEDØC/iú‘›° f*€ˆÌÔt“Ç1¨é.WÁ©n#ÙJ9!Û#REÀ1-ÁeÈØ±Á|¥C¸äkŒ„F@@3`z‰0Ìu(M€< ¬ó˜qŠp33)|Öm²‰ZÅùL Òk0ë®ÿüuBÆ+Å/ 7)IuÙH£œTƒNÜÚ¡®“颸¢äê#á±%&šu*™ÐK6ûeËã2\!Ó¿$í A¯P V×u˜!3\­ÎPJ[ Ñ´ƒ C%d8«èUZ‚ß_ùúhážáØû €€fÀô3`˜ë PšyX æ30ãÔ¿gfRø¬ÛdµŠò™@¥9Ö`Ö]5þù~BÆ+Å/ 7)IuÙH£œTƒNÜä¡[[×O¯aš¼érõÇÝÌü¨¯SzfCö?Êf6`FH4F^è™ÙšA+yƒûJKë`3ŸF¶Rj.+Áª>üx Cì¡FB#  0½Ä 溔&@žV‚ù Ì8õ­™™>Ç`Ónиë& j€! ÐLõ_j²‚fÐjÔm†V9‰ÆÐ\ƒ^¡2½„IK:è ¥4Òv–‹—†JþÈpᬘ¾é¢ºeÒda¸`‡&éÂVžF–9Àé4‹-Â]ä¡Öp~LKp \õqÇ7:Lû;뀑ÐhL/1†¹®¥ §•`>3Nkf&…Ëãkä3fÄ·ŠQÖdéár2öpYÜØsú_ÌI`€FÀÈ º²FÍ ÕôfŠjJ59FbvÁôdEް f*°ØFÓm:^A›Ž¥÷Õçÿ¤CÔâŸ0Í€é%fÀ0× 4ò4°Ìg`Æ©÷Í̤ðY·É&jä3Js¬Á¬»jüó?'d¼Rü¢p“’T—4ÊI5èÄMºµuýð¦É›.WHº‘£ôü,HE¶ ¦YQcU¼@¤qGnBÀ‚˜©"2SÓmQÁ^£Ók52\0# ¨˜n©I¨‚ÒÉ*¦êy,på [íUðUÛ¬”‚`‰áuaÿ‘Ñž;`$4šÓKÌ€a®+@iäi`%˜ÏÀŒSÈ™™IáÓq ŽÚÅè«=ÌI`€F`2Cç³R˜…fÐjÔm†V9‰ÆÐ\ƒ^¡2½„5ƒÏ:è ¥4Òv–‹—†JþÈpᬘ¾é¢ºeÒda¸`‡&éÂVžF–9Àé4‹-Â]Ž®t«½ ¾j›•rB4¶ã3XìýOt˜öw~ꀑÐhL/1†¹®¥ §•`>3Nsf&…ϺM6Q«x Ÿ Tšc fÝU㟟&d¼Rü¢p“’T—4ÊI5èÄMºµuýð¦É›.WÐÍÌ*ñ:%¡g6dÿ£lf£f„$0@#`䉞™€ ´’Ç1ظ/ ´´6óid+¥æ²‰í©"à˜–à=zö™á‹ç €€fÀô3`˜ë PšyX æ30ãÔmgfRø¬ÛdµŠò™@¥9Ö`Ö]5þùyBÆ+Å/ 7)IuÙH£œTƒNÜÚ¡®“颸¢äê#á±%&šu*™Ð»jx(L ËU3®ò¦Ëƒz¯t3ó£J¼NIè™=Öÿ({d¦C¦ƒ+dú—€ŒÀ5誡Õé:Ì®VHg(¥-ôCf=‘iדb^ÁY1}ÓEuˤÉÂpÁMÒ…­<,s€Òi[„!VF»ú¤é;¢U~ÐhL/1†¹®¥ §•`>3NÁyf&…OÇ1Ø´9£ÍD9 ˜*º¨¼“FUW!ÌÕ”:jrŒÄìr–›+¤˜l‘#HDfjºÉãÔtÈ«àT·‘l¥œí©"{o}Rõ+Âæ¿vÀHh4¦—˜Ã\W€ÒÈÓÀJ0Ÿ§Þ;3“ÂgÝ&›¨U<Ï*ͱ³îªñÏ¿NÈx¥øEá&%©.i”“jЉÛt˜C°Q6úe/H+>!½¼`¯C‚v…„‰4j†^¡öÒ iƒAáìÒv–Ò°ËIÚv8)æœÓ7]T·Lš, ìÐ$]ØÊÓÈ2Ø!f±EØ¢‹<ÔÒi .Aº>ŠúA‡hð?:`$4šÓKÌ€a®+@iäi`%˜ÏÀŒSL™™Iá³n“MÔ*Èg•æXƒYwÕøç2^)~Q¸IIªËFå¤tâÖÕpL‡Å%Wé -1 Ô¨SÉ„î\Ò°iÜÿ([Géà ™þ% i z…j°º®Ã ™áj…t†RÚ¦tX*ù#Ã…³bú¦‹ê–I“…ႚ¤ [yYæ;¤Ó,¶[t‘‡ZÃAú1-Áï¯"®L¿œéè þåÜ#¡Ð ˜^b s]J O+Á|f¼Æ½…™>ë6ÙD­â|&PiŽ5˜uWÿržñJñ‹ÂMJR]6Ò('Õ ·v¨†ëd:¤(¾(¹úHgxl‰I æ@J&tç’†MB—òÆü®Ð`¨‘D§’z託®Ã ™áj…t†RÚ6tX*ù#Ã…³bú¦‹ê–I“…ႚ¤ [yYæ;¤Ó,¶[t‘‡ZÃA: ÛôG:Lû{ùØ#¡Ð ˜^b s]J O+Á|fœ"ØÌL Ÿu›l¢Vñ@>¨4Ç̺«Æù8!ã•â…›”¤ºl¤QNªA'níP ×ÉtHQ|Qrõ‘ÎðØ“@Í:•LèÎ]5”‡V³Aré·¢º²]vKþÂêkô*&ê|ÀpÁŒ( bOÅü úÑÂ]– .®¼|¢CXõSŒ„F@@3`z‰0Ìu(M€< ¬ó˜qê¯33)\‡˜¢´^ÃÆ:D ÝZF×ó@àDù"-Ûm8–U#± Ø‚ ^„4­Uñ1â4rÄLÈ ¿Ù£ú ö^«‘á‚Q@ÅtKMBìNP1UÏc+Ýj¯‚¯Úf¥œí©"à˜–à÷W©®ÜÐ!šêMŒ„F@@3`z‰0Ìu(M€< ¬ó˜qŠŽ33)|Öm²‰ZÅùL Òk0ë®ÿåfBÆ+Å/ 7)IuÙH£œTƒNÜ´£4Çndiìµð!&´W0¡âÛM¨[yYæ;¤| lÑåXàÊA·Ú«à«¶Y)'Dc{Dª8¦%¸Ä©Œmë–Ñ~n;`$4šÓKÌ€a®+@iäi`%˜ÏÀŒS·š™Iá³n“MÔ*Èg•æXƒYwÕø/·2^)~Q¸IIªËFå¤t⦥9v#Kc·2:`FH4ƒÝHôÌlÍ Õ¤ž‚½F׸`Ít Þ³3"ÎÈo “TLÕóXàÊA·Ú«à«¶Y)'Á÷W¹NÅøÇ•Åå×C40 À«AÊ æº”nÚŽâg`•!˜ @a¶Tð "#O•™Ôx=Ì!Ø(EŽ´f„$0@#`ä£V`²ç¨ç*dV@©‰ÎM`µ‘v™ÕV ³È$"3uÝFí5#hz ’CQRsŒ6Ú÷W›Å¦tG‡°Ø]Œ„F@@3`z‰0Ìu(M€< ¬ó˜qêb33)|Öm²‰ZÅùL Òk0ë®ÿånBÆ+Å/ 7)IuÙH£œTƒNÜÚ¡®“颸¢äê#á±%&šu*™Ð»j(­fƒäÒo¹®ý²ŠÌ0ªb¢j l¶±"lå©XYax@7Úù@b%Õ ÉW:„Ù¾vÀHh4¦—˜Ã\W€ÒÈÓÀJ0Ÿ§~73“ÂgÝ&›¨U<Ï*ͱ³îªñ_¾NÈx¥øEá&%©.i”“jЉ[;TÃu2R_”\}¤3<¶Ä$Ps N%ºsIÃ&¡ËaYc~Wh0ÔH¢SI=tHÔK×a†ÌpµB:C)mF:, •ü‘áÂY1}ÓEuˤÉÂpÁMÒ…­<,s€Òi[„!VÂz]J{ Ã´¿—‡ €€fÀô3`˜ë PšyX æ30ã…ffRø¬ÛdµŠò™@¥9Ö`Ö]5þËÄŒWŠ_nR’겑F9©¸µC5\'Ó!EñEÉÕG:ÃcKL5êT2¡;—4lº–5æ7p…C$:•ÔC‡D½tfÈ W+¤3”Òh´á ÃÂPÉ.œÓ7]T·Lš, ìÐ$]ØÊÓÈ2Ø!f±EØ¢‹<ÔÒi .#ÆŽMþ¦ý½|뀑ÐhL/1†¹®¥ §•`>3Nnf&…ϺM6Q«x Ÿ Tšc DæB‹õUnRÒÇnR¦âhØjQÁv5¶¢÷¢½î¢U–¸î¾…áPD‡Ž¨dBw<Ì!Ø(_¸®ý²ŠÌ0ªb¦ëqÀpÁÌ@¬`O#Ë`‡t²€ŠQÍ.*å !úþÊÖŸ¿{y¢Ã´¿—§ €€fÀô3`˜ë PšyX æ30ãÔigfRø¬ÛdµŠò™@¥9Ö`Ö]5þËÓ„ŒWŠ_nR’겑F9©¸µC5\'Ó!EñEÉÕG:ÃcKL5êT2¡;wÕp9Jçäúô?ÊžŽCl0¢BÔt<`¸`³a+OÅ’ úіÂ]Ž®t«½ ¾j›•rB4¶G¤Š€cZ‚ß¿¿ýõúñéÌOX^øD~}Á–÷B‡Y™f¢8àel¥y•º$*¡+×S$é ) '{èÕÒ©dBƒ4 ŽƒtiÜ¡¤ `šAƯal\¡²ÒTn_Rç±À¢ôB£è1WH×ûH &Ñ©^Qc¬—M¦è:ñæº;4†åbö…¡’ü½ÿt}~þòöÍùâãŧ‹ë‹›‹Ï·ÿ¸øåÂü/ÿöç?ýù/…Ks¿·oìÉÅÈŸ·o^"âË&Þ¾ X DÊÅD¢Ò˜ÈS¡Øðº ‰/±ÄòJÊÖB•…uĽb¾–",PIàAôxP¹J‘)¿¦6¢¨© rMNEm:Ö´k¥«]|Ãk:4úšn6$új»[”–ñŠ,à6¶À^&ån¯¥*oØ€y[Kæ¨$8Ç×Õ=•¢Ê¤ÏÛ7ÿûÛ7§òïwõëæç«»‡§ëŸJòúþ4„oçççûó×ëÓåéó‡Ï×ÏŸnz÷|ýõÛ»ß}øð® @Ï¿¿y<_=ß>ÜÿþáñùËÃç‡ûóÝ¯®Ÿ¾Ü~{úðõêÝÛ77…þöáÃ÷ëûŸ˜åÅéÝwEÒíÍéæôüåúžuøñxû|ýÓÛ7û[ùü‡ûûé§Ïww¿ü_Š¿ÿËé/çÛû?þø×?ÿj?ø’õo§¿6§‡›Óùîî4èvzúv}ýéétóøðõtõ{z~(_Ñ\ ñéÇíó—ÓùôtUT»~¼½ÿ Lžî~\?2姇÷•ÊFó¡’ýåûÝõÓéñúÛãõÓõýóõ§ÓíýÕÝ÷O×§õøkiçûO…íÛ’óëùñöúù·JX¸?”?žþt{sýû»Û_®±èíÓÃóã÷۫Ó}1çóÃóùîöé¹$A ýÏ/דN゙Ÿ¾|ÿ†ÅÞŸNݵΕöÓíÍÍõcQµr,çb™Û¯ßïžÏ÷×ßŸŠ‘oïÁ§'ðù74Ç} •=]=–Rê Úzºzøúíö®d~üíôõûËí/§ýô?¾^ÎØ|Q[åùíÛõãLJ»R¥¦àééùû}ñÔÝo`÷óããùþóõWбðûã§ó×Óÿüpúïߝнª&_žŸ¿ýü‡?üøñãÃÕÃýóowÅŠåòën¿}úï·×?žÁ޾}ùöß¾]†ä²}ÿ ¿ÃO_¯‹ç®@Ì¡ <`3ÆE+]”ÖôôÐ+Wkru¾?}¼>Ý<|/–(š]Ÿ~NñìÅ)5#l¿ûùÿOñdSŒï¿áÄâ–=âÒ£9DûØò-]Q‚ˆ*' §X#·;%Î §@!ã´•?Óãy>í5žcô0ÎËwJRD‚8ZTÂ16J¦%WKÁ:±„ ƈÆpÚ‘Ó Dk¬äS°ÐÎùÎÇ…ÊÇ‘\¨“C U³¡0â¹±ÒhµSàËP/›õü©DÞnKŒEJTÆkº>TØóNC}®ºy,¸±4K’mèòÊ –«Ü(.ˆ*ªrUö;d$]K=ÍMÞÉ×Ë6”‡¤EÃÒ¢íҢ땈TéfGbd[#*cpJSõŽqÚk>À ¦Ú2·ŽqÞUò$ª|WþR¨^ hKi”{+5±„Üöj¨UÍÔXhIõ,dg!;‡®:üej¡8hÇDÄS½3Õ;S½¡ŒÛ{™Ívð·¹*`įºf@·Pšb‹8e*š¾%œ2• ž ±£¶&L˜Ø[l¨ÂNb»ëJšÍwÏÙ±_×(S8ÑöÖ½ö„‰*m/adcN%Ùz­5Tߣ±Ý¤Ekk\­2@(g§DUÀPªÆK©4q„˜bQÏS5\;ωZŒ­”ÃmM™vYw…‰u’’  ÔÓrœ³>"ÔYÛ¢µ™ˆhÀÕÜÚ Kîsb˜…GE±‹9×õÆèœH˜FQ0A…)1L8|Ø!¶ÎU»K¬ÛXBlfr'Ývé…ØC¿-ÄöPh±I[¨FØÆöX]k ̸ANáçy žz(Üšo,‚¨—lÅ|¬`ÑËUv-Q«ŠÞ! {Ú8É,mÈòSkYZ@¨T#lÌdâØh™–¢,†š%6Jº‰0%ÔŠ`„YXîaT²>±œÅZ£-AÖ&@½+ÙfGÓ9Ö°'δ+WB­M…q‰”6%6“º‰óBl©؎C*$‹zÙå ”¹Ê "‹­sè"»N­4‰ • AfÉÝJ4‹C±R\ð|íÆÂðná…v2Ùæ¨Õ¦Šxj¶e´¶pËU5 Á·0ò8SÙâLàs÷Þo¡«60JUÐU[‹ûvoµ¢†QïÙz"„ný:+âë6Y±{›lA¸¢ýà–ÓS‰ÝÑUû.A.Ù,]f¯åw–;|ãmÀ%ÔåÑ’;ηL€9Ó&MdÖªç <—s&³np× œåƵ´Ôÿáª¯Ã˜ï¬åš:ëXƒšôDg¸"†RÌ â9 Q•9#a«¶dQ¯p‡VqÎ4!ƒnX5ÈL§j°c WQ`¡ÀµÉ’«¢s±¤­Y™Ï5·ÔÏÅZëÈ­b™Åú©¯¦ÉuÒmscyì+Úp`nE-_6£òäâÔ6Rìåaì*Œ84W‘U ‚XÀ×ðU²uZ¬-v,p%É…ÔkL‹ ZOi1¥0”ö á¹$ z(`{‡ŽŽ>‰‚>îÌ ÙŒ+Û‡ùØ:žMTÛ¦,ƒUîÂÒHÙÊU"2s)æh~‹«@°ÂStI¶²Ê•Q³o"ÍP›Ó\ ñµõRØ•íM9]ª™»žKÜv š5ís2…º0W˜ç’“¡ó;~Rï˜q0\”\ Ø.OÉКT‰Ð.×VÛѰn€Øª\"¶+S`W¦Çn£îU3!£6¢ >²e¼çÛj#ÚD#r[T¢ Ô \ó`÷1ª­¤Q>NØ#±£™±¨œk‰Z¥2m~®DM·×°[–WªR¸ÃØì 6×ûìaÇzC£„7Ž) · †Øðã Þ28ä¼ ½8ß½4í}¯¾7-4øj$O àXMã‘æT£me@.õí±ÒÞÂ̾aD¤‘ E4Ú®‹ïaëmá–²(oé>ÂãHà-ÞJø>/à áíÉÒV¥dÄÑ;bÔŽ¼*AìX a߆HÌ?Ådj-êÊDY‰›7¡}L¡72Ù¶Öy gh€%ÇÂ*&zòA hžðn!ö)q)‘wÆd†PQjæëÖ‘As´|v£íš™©Ë%š Åj©ëdy¨ÝÖ–cn“n†ZLkóÞdm©v»–z®†(c ûqƒëP§Ç¥ºÀ²Œq‹Ü"k|gkX°8…£Ê2×6·úâNÅ‹]qåú:ØŠëºÙ ”S ¡††’½GúNl H„0ÂÖƒ/·øB]Æ…Xƒd ;°²Ðf“Áuøˆ3óTçÕÅ28‰OƳö—¸"/´bãåc8EåÊ(•O{Ö•ÊøÌÖiºUàA°p¢­õ¢¢ØšO¶¦T©¥RÉdá;Ôšµ©or²'Öé¹eÔÖ­«<Ðu­¸L¾Ëh’ÊL=•a$յބcUâ‡-UÓ:g©¶§Ç½çÛ(Àâ>ßÂs*nL¾á^‡c'Û!ÃÅ[cØyS)R)’«úÕÅ껄kÙ©Ç ·èêÇ÷'—§¶fž¼ S}0M~ó©¶æš S1†^ °]¶r1„·Ú“žàÓÖ9SORhË`䘦Iš€3BbF€¶;·˜G]‚xA%EÓ¤•Ñ!EËϺSnRö0péø²ø'Bºckm•_3¨ ¼‘M±y§(‰EÍRlA¤82µð wyŽ…InÆc;~8N&\ôˆ^Œ4³í ˜u=ta‡©$•)z‚fXâUªîI¥Ï¦,„Ò››Gª„­÷šÀ…kkn9•!eø.l9Ö×& ¶wh‰ ÄöŽbNmvžÊHJR‰ûqÃiZ*a:mÝJИû©ÊTâºpmiâ%ÛÔÏF5áñœmkzi£ö•úJu`QЬxg‘·>#H`íM<2^Çd —"aI¿¿Ý‘Ê@‘övã‘Ê`’ö02§µ=´è¯Å8$š'ÊÌ?íÀ®èÈëØÙ4 B²›êsê p¶-£MÆUîÜGTò·¼Ça.³Þ°M‹½d†\Æ…\¬ŸK©lvÑ–¹ €ÙÒ¨c»û)wêTÑ¢|Z€>ã!šùÖ9TêãÇÆ$&1Ý«¹„˜\†‚\‚l÷Σ™ºnÓîÍö¹DÞŒÓÎìh¹.‡Nø=)âMݺÖ!ê$@(U}ƷȲC‰°qkˆ‚Ì ßÙí%áØ÷¹LÚ3¿3Â-ÆÐ#Zö±Åq˜ 9+±¶l—˸}»JV ðš–”-H+Jø¢D¨sƒ&ë'à‹F©è“"ô©RR¾[‡­.‘¸Æ¡òêöÖ“=µa?‡­7lHŠ‘ ÷‘ Ç6Išî½åEßä:ÆQ•ëMŸ^ˆ.Çn™º,ÃrŠ`Õ›ô.795×n«ÐiKq4H–„Döö_lƒ9µ~Hó$º—k÷™tkX';uŽBwš¡d½yÍ¥æ2&äÒžrÚ™ÌT¡®¼ÔhÒÕ{j.±8—¸Ÿyºén–›nŽ’]˜v빌B9ÃwQ*ã}I.ã]îóÿ _+Éý&§Ðlm•ó&1Ãr_ãhïeÕØ_ò–zE(ÎÁ-ö¿mcÅj}É0C›æyQ¿ Võ6†ëãõ#l–hý/ãëK$èæ=2WH¤Ægê¢5•¾S2ùƒk^bö°l¡¬ùäžAR·þ7ÓF¢Í4ÊX"¢òLB“áHÍVl7ìº)È[“Ê'—ÏV>m•Åô¹€ÁÐEÃVBþf›VðZ¦Á3Fúm~. k«¸[•ßj ”ÈlÚÜÀ†›6ðÙÁ7}é®Q|×vsäñ­¿Ïý„… P‹çèZtiwçÖ_*Ùx[L%ÆsS׳I}ߪ ÛÕßê{ÏEýº7|eƒ•ô n/¦~`‰§tãÝž¼î%+ÂâpÄÁ!—©î¯—$²™€C-±¬—…­oa3GitÇ„xÖ°•¹…vo»:!›ðP Á›äÎuù­h‡+û[èß·XQ|STÚú [l®*_÷ÛJoòØ]'é¬Èw­†éÐqøRȷʳ-Àã“6z—bÙŵ)dѰDòg EƒÔ/6„YÃ-A2q¬ÈàÈ"/ÖOÊ2HpÐí¯±¢¦¸z³ñZû–›Fè#ù* Ý?YøgË‘ôÁ%ï­áß#ÂÀCÕåûv{jîp”»m„˜ú̬7ó­¾<‚ª`az䶕ؾ•€²•ð¹m¶­óÝDŠ¥x ½iÃêÖ\l%—Ôûë§ÂB;Þƒn{k,µÐÖŸ‚nŲÛ.V¶=6síÃgÛñÝöm‡Ë¢[銹Þ}§•šÑfßE¶åò]ÚݘÖØÊ”ì< ¹—½ßÍèsSÔוDOcù´{Ò݈ط1d‹Â^ζ¡[´iÞ^WÞcC¼ì¸;¬°†>øÒF»û-:—Ø[ŸCa p;¿ ¯f6Gˆ_‘õ5nr1vÛî¤î”Êea1x7´DŽEár?ÑcwììÈqw­1îüt“»ÓSýÝÁ‹÷ð²=>|G=}kDžý¡&r,33aŒâæBëÇ×Á ßQ‹se|ªÜDï×<‡Š*ÒòË¿Ãˉfž{™ï¡E¾=ˆÈW؇n¢Ä÷)®tò¹°ˆcß-‘í!´©ý.ïw~§oÇåî=ÚÚ„3T¼dÆú‰8±ß ¸”,Ïûö2ýØñ?˜‡AÎV ²Ç6@®„IóE@ñ®÷'{B‰Ó{2Mñ$†QH¶U§½ØUÌè½)× ¶7ê|í Ä>ÁæŠÜÙoÂ.ü~±€pL½¤Äþ=‹Ù†¥¹ÔŽMߪ¯÷˜úZú9pÙzF±dŸ6óØà&'ï‡ï½OrX‰ûf{ÝAï"¾6åkñø†,¾Ž…Zlð M‹­Íæ±m‰‘c]flkr7Ø…²w£ìàÎ>;6zÞƒ:@ü(ûî8ÃÖœQ­>]­]¨µï©³ªµwýmm'ßÖÞK¼ÝyyzœiU£4…æ½Ì½¡·—7Ô6fž,l,¿” •˜&J ÒÕ—´Ûûý…ÄRn£·ö»5êû´U;kú«O™ó«d J©4Ó6ƒ(6…lÏ'hÚ¥¦EÇ=ƒÅ¡"¶ÝX÷Šeª6¬D'ì—û{yQ¼|ZJîòuÓ’ÞÊÉ™nQ':`I¹ÞEJÊ÷)†÷nm»‡·€K¶Å“`;ÌîKzlw9ˆ–4ØÏ­”oÜ7^ù¬VÅ_¾|5¬ƒž:ì’âeØÀoÈJœ<[­SÓPLÁ¹°ÆxòmƒZOg.ü^UìêÏž‡û l¬•wCÙȧºáÍÛUsµÂC°7¿y«²Täéwuš4³¶Ü¹S±¤\W|ç'¯ƒecëˆÞo¾ç·Ô«Çà•ìþ^|IC]ãÖÝÅxdM2ll5u÷¾¡7^2¿x_Ù—|ϲ‹ŠB&:1˜¾™­Ìì¾ vÂئcàm-“¶j›þ8 Üü۪Π<µÙõºÖ‡ª\QØec ƒõ¦ži,W–únNÕñq|Êø¦PiØâ  ì¦20‰Ü‰™Eýö>lU»ÉÀSïJdl®é·‹nX€ {w*¦¼äQÞ=5EѪë4¾ ‘=ñv¡Xƒ‘ Þß®Ûïx+Hó.lg±‰Ý³ã^Âk©€©ÛP\eG\ikK¹ñ5àLØÒcöß±Ãö‡®¶î§ÌÝ´0¨X~ 3ÄͯµuÜ&mÍݰÁÂNàbUh_ðû)6ì5mн6,§¾/´W4q›ZªîÊM]l)tê [oŽ)õê&èÇ}o¼¥ß½a¥`3¥Mûjàˆqë3ˆºCÖ’ÕšÃ핵¸I“6Ô†KÛÚ%¬¯Ìã&é6kN•4K=[ÌÁO ïvîæØðd»9êöÎnŽÍ I8ÒàîÎ_6· Ž Ö`-®ÿتHß ùµž†W桞}“gí5<£ãnpÚÅÔ¹¨ªddvÙýX’}%úÜÖ÷4à6uô‡ï)nÅ;°ßÛ+„ewø $Óâ™…½Ÿ½;~)§L5\ëÓ{êÌ@3Q°J«<³ÚúDœ6Ú —{ ˆùÄÂXWNà ܵSo¤±v\Gôë=¬ÃŒ‚Ù‡ãU{ëäF}ëúVÒÞ&ê;Ä P°FgžöâÖ[#*lE, Å¨;³‹?Ñ€AáÙì/P#j•fæ 0Õõ çÚÊ„0aùŠ[£b}¦ß§³ü:‘8 ØH¿y˜ÛÑpO_ìGùd‹òçlä7G«»êÛXö¦Š©Š ó8ö€‘#âBÄ´ ™›æ–‹wŠ*ÐS%[=ª+˜ ”Hx’mD{«U†1/ój™E#@¹öŸyÀü£æpg/N€Ím%§Í( Ï)ùM1R3×IVÅÚú> ìe¶Ù®æ„¥9*Ñì‰ÒàÄ­¿×4ÔÕ‰.“~é À‹;Ù)ö a–H&ŒM™ïtP"؇› ¶,–ΘeÝcZ-î…š$ ÿxw£Øëܶ?Û¶édÂà!㻚±>‘²Ù·Õ1ût“ÌXwF`FÊN!/ Uƒáw1c`|³(Œ~™×Р¥ÀÞm›Ã 'ß8ÄIñ°·I–ç_ @aÐ"^•D°dõûÛ@ÕÚu)RYØhs¼.ždPM |*‘ûÿžãƒx„P †¡ý_-­œÁP”a@ÊÉðUäHžë=QNóÛ¾6£¥ØUÀ-Ë ]ÆŸÜç…5°x{¸ƒÎ„Sý5þÌ- 0 and N > 0. (Here M=3 and N=1). #C David I. Bell, August 2004 x = 292, y = 292, rule = B2-a/S12 140b7o$$142bobo$142bobo$142bobo7$141b3o$143bo3$154bo$152b3o$135boo$ 137bo3$160bo$158bobo$129boo$$130bo$$166bo$166bo$165bo5$118bobo$120bo3$ 177bo$175boo$112b3o$114bo3$183bo$181b3o$106boo$108bo3$189bo$187bobo5$ 96bo$97bo$97bo$$199bo$$198boo$89bobo$91bo3$206bo$204boo$83b3o$85bo3$ 212bo$210b3o5$73boo$74bo$74bo$$222bo$222bo$67bo153boo$68bo$68bo$$228bo $$227boo$60bobo$62bo3$235bo$233boo5$50boo$$51bo$$245bo$245bo$44boo198b o$45bo$45bo$$251bo$251bo$38bo211boo$39bo$39bo$$257bo$$256boo5$27boo$ 29bo3$268bo$266bobo$21boo$$22bo$$274bo$274bo$15boo256bo$16bo$16bo$291b o$280bo10bo$280bo6b3obo$279boo10bo$287b3obo$o290bo$o290bo$ob3o$o10boo$ ob3o6bo$o10bo$o$275bo$275bo$18bo256boo$17bo$17bo$$269bo$$269boo$23bobo $23bo3$262bo$263boo5$34boo$$34bo$$252bo$252bo$40boo211bo$40bo$40bo$$ 246bo$246bo$47bo198boo$46bo$46bo$$240bo$$240boo5$57boo$56bo3$229bo$ 229bobo$63boo$$63bo$$223bo$223bo$69boo153bo$69bo$69bo$$217bo$217bo$ 217boo5$79b3o$79bo3$206bo$206b3o$86boo$85bo3$200bo$200bobo$92boo$$92bo $$194bo$194bo$195bo5$102bobo$102bo3$183bo$184boo$108b3o$108bo3$177bo$ 177b3o$115boo$114bo3$171bo$171bobo5$126bo$125bo$125bo$$161bo$$161boo$ 131bobo$131bo3$154bo$155boo$137b3o$137bo3$148bo$148b3o7$147bobo$147bob o$147bobo$$145b7o! golly-3.3-src/Patterns/Non-Totalistic/JustFriends/spaceships.rle0000644000175000017500000000712012750014265021772 00000000000000#C A collection of some spaceships of speeds c/3, c/4, and c/5. #C Paul Tooke, July 2000 x = 200, y = 140, rule = B2-a/S12 6bo14bo$4b3o12b3o$bboo3bo9boo3bo$5b3o12b3o$bbo4bo7bo6bo$7bo13bo$4bobbo 7boobobbo$boo3boo12boo78boo8b4o18boo$4b3o11b3o79bo12boo17bo$bo15bo13b oo3bo67bo7bo6bo$31bo4bo64boo5boboboo3bobo13boobo$3bo11bobboo11boo71boo 3boo6boobo$bbo13boo17bo3bo73b3oboo12boobo$bboo14bobo14bobo65boo6boo4bo 13bobbo$5b3o10bo3bo10boo71bo3bobbo18b3o$oo4boo24bobboo24bo45b3o4bo18bo $o15bobboo19bo18bobo44bo3bobbo16boobo$oo3bo11boo11bobb4o18boo3bo42boo 6boo4bo12bo$4bobo12bo11boo3boo17bo57b3oboo13bo$6bo14bo11b4obbo15boo4bo 42boo3boo6boobo12bo$60boo39boo5boboboo3bobo11boo$57boo45bo7bo6bo13bo$ 57bobbo39bo12boo19bo$57boo41boo8b4o20bobo$60boo$31boo3bo18boo4bo$33bo bbo18bo78bobo$31boobboo18boo3bo73bo$14bo20bo23bobo71bo$3boo7bobo18b3o 25bo69boo$oo6boo3bo18bobbo97bo$obbobbo28bobbo93bo$oo4boboo4boo14bobb3o bbo61boo8b5o3bo11bo$3b3o7b3o15boo4bo62bo12boboobo11boobo$6b6o21b4o67bo 7bo4b3o13bo$101boo5boboboo6bo11b3o$104boo3boo8boo10bobbo$113b3o4bo10b oobo$103boo6boo4bobbo$106bo3bobbo19boobo$107b3o4bo$40bo65bo3bobbo18bo$ 8bo7bobbo12boo5boo62boo6boo4bobbo11boo$5boo7bo4bo14boboo75b3o4bo$5bobb 5o5bo13boobbobboo20bo42boo3boo8boo$3b4o5boo18bobooboobbo17bo41boo5bobo boo6bo$oo5bobobbo5bo16bobobbo16boo45bo7bo4b3o$obbo6bobbooboo12bobb3obo bbo15bobboo39bo12boboobo$oo4boboo5bo15boo6bo60boo8b5o3bo$3b5o25b6o19bo 3bo$58bobo72b3o$56boo74bobboo$55bobboo73bobbo$133boobo$57bo42boo8b4o$ 58boo40bo12boo16boobo$59bo44bo7bo18bobbo$12boo18boo5bo19bo41boo5bobob oo3bo14b3o$7bo6bo19boboo20boo44boo3boo6bo15bo$5boo5bo3bo15boobbobb3o 15bo55b3oboo11boobo$4bobb5obboo16bobooboo64boo6boo4bo12bo$oo8b3o22bobo bbobo12bobboo46bo3bobbo18bo$o4bo3bobobboo14bobb3obobbo3bo11boo49b3o4bo 18bo$oo3bo3bo5bo15boo6bo18bobo45bo3bobbo17boo$9boo22b6o19bo3bo40boo6b oo4bo15bo$113b3oboo15bo$56bobboo43boo3boo6bo16bobo$57boo42boo5boboboo 3bo$59bo44bo7bo$61bo38bo12boo19bobo$100boo8b4o20bo$133bo50bo8b3o$10bo 120boo55boobbo$8bobo30bo3bo87bo49bobo4bob3o$4boo3bo18b4o7bobobo88bo48b oobboo5bobbo$4bo22bobbob5obb3o88bo53bo12bobo$5bo4bo3bo22bobb3o87boobo 48b3o10boo$oo7boobo12bobboobb3o6bo91bo47bobbo8boobbo$o4b3o18boo5bo4boo 4bo73bo13b3o48bo4bo$oo6b4o16bo6bo5bo65boo3bobb4obo10bobbo45bo3bobbobo$ 109bo11bobo7boobo48bo$101boo4bobbobobboo4bo58bo3bobbobo$101bo5boobo22b oobo46bo4bo$118bo14bobbo44bobbo8boobbo$56boo44boobob9o16bobboo45b3o10b oo$59bo73b3o48bo12bobo$56bo3boo39boobob9o66boobboo5bobbo$7b6o48bo55bo 65bobo4bob3o$4boo31boo16boo4boo37bo5boobo78boobbo$4bobbobb4obo12b4o23b o5bo38boo4bobbobobboo4bo63bo8b3o$5b5o3boobo10bobboboo4boobo13bob3obo 46bo11bobo$oo7bobobo23boboobo13bo49boo3bobb4obo$o4b3o5bobbo8bobboobboo bbo3bobbo12boobo57bo$oo7boo4boo9boo5boo5bobbo15bo$11b5o12bo7bo21b3o$ 59bo$56boobo$56bo$55bob3obo45boo3bobboo3bo5bo$55bo5bo47bo10boobboo$55b oo4boo38boo4bobbobobb3o3b3o6bo$61bo39bo5boobo5bobobo6bo$10bo45bo3boo 58boboo5bo$8bobo17b4o3b4o20bo42boobob13o$4boo3bo17bobbob3obboboo15boo$ 4bo36bo59boobob13o$5bo4boo13bobboobb3o7bo76boboo5bo$oo7b3o14boo5bo5bo bbo57bo5boobo5bobobo6bo$o4b3o20bo8bo62boo4bobbobobb3o3b3o6bo$oo33boo 71bo10boobboo$106boo3bobboo3bo5bo6$5b3o$bboo51boo3bo41b3o4b3o$bbobbobo bbo17b4o3b4o16bo4bo40bobboobbo3bo$3boo5boo15bobboboo5bo15boo45bobboboo 4bo$4bo5bo24bobobbo18bo42boobobob3obo$5bo3boo14bobboobb4obobbo16boo48b o$oo6bo17boo5bob3o63boobobobbobo$o4boo21bo7bo18bo3bo46boobobobo$oo34bo 21boo40bo9bo$55boo43boo$57b3obo$61bo$60b3o$61bo$57b3obo$5b4o46boo45boo 10boo$bboo4boo48boo42bo11bo$bbobboobbobo27bo15bo3bo54bobbo$3boo23b4o5b obo63boobo8b3o$4bobbo19bobbob3o3bo18boo$5b3o3bo47bo41boobo8boobo$oo7bo 15bobboobb3o4boo14boo$o4b4o17boo5bo4b3o14bo4bo39bo11bo$oo26bo6boo18boo 3bo39boo10boo! golly-3.3-src/Patterns/Non-Totalistic/JustFriends/p384drifter.rle0000644000175000017500000000512112750014265021705 00000000000000#C A period 384 drifter oscillator. #C This uses copies of a 27-generation 90 degree turn component and #C a 23-generation flipping component. #C Dean Hickerson, August 2000 x = 88, y = 64, rule = B2-a/S12 38bo4b2o17bo4b2o$38bobo4b4o13bobo4b4o$35bo2bobob2o15bo2bobob2o$20bo2bo 10b2o8bo2bo10b2o8bo2bo$13b6obo2bo13b6obo2bo13b6obo2bo$11b2o9bo13bo9bo 13bo9bo$18b3obob3o3bo5bo5b3obob3o3bo5bo5b3obob2o$10b3obo7bo4b2obo2bo2b obo7bo4b2obo2bo2bobo7bo5b4o$7bo6bobob3o2bo6bo2bo4bobob3o2bo6bo2bo4bobo b3o2bo$7bob4obobo5bo3b2o2bobo2b2obobo5bo3b2o2bobo2b2obobo5bo3b2o2bo$7b o10bobobo7bobobo7bobobo7bobobo7bobobo7bobo$7bo5b2o3bobobo2b2o3bobobo2b 2o3bobobo2b2o3bobobo2b2o3bobobo2b2o3bobobo$9bo8bo3bo7bobobo7bobobo7bob obo7bobobo7bobobo$9bobob3o2bo4b2obobo5bo3b2o2bobo2b2obobo5bo3b2o2bo4b 2obobo6bo$6bo4bo6bob2o4bobob3o2bo6bo2bo4bobob3ob2o6bob2o4bobob3o2bo$bo 4bo6bobobo3bo2bobo7bo4b2obo2bo2bobo7bo4b2obo3b3obo8bo$bob2o3bo4bobo2bo 5bo5b3obob3o3bo5bo5b3obob3o3bo11b2o3bo$bo3b3ob4o2bo2bo5bo9bo13bo9bo13b o10bo$bo12bo10b6obo2bo13b6obo2bo10b2ob5obobobo$o2b2obobob3obo7b2o8bo2b o10b2o8bo2bo19bobo$obo3bobo14bo2bobob2o15bo2bobob2o17bo2b2obobob2o$2bo bobobob7o9bobo4b4o13bobo4b4o11b2o$4bo21bo4b2o17bo4b2o11bo6b4ob3o$b2obo 3b2o5bo51b2o5bo4bo3b2o$4bo8bobo54b3obo6bo$3obo2b3obobo2bo52bo6bo4bo$4b o6bo4bo48b3obo2b3obobo2bo$5b3obo6bo4bo47bo8bobo$2b2o5bo4bo3b2obo44b2ob o3b2o5bo$3bo6b4ob3o3bo47bo$7b2o12bo45bobobobob7o$9b4obobob2o2bo42bobo 3bobo$14bobo3bobo42bo2b2obobob4o$6b7obobobobo45bo12b2o$18bo47bo3b3ob4o 6bo$7bo5b2o3bob2o44bob2o3bo4bo5b2o$7bobo8bo47bo4bo6bob3o$6bo2bobob3o2b ob3o48bo4bo6bo$6bo4bo6bo52bo2bobob3o2bob3o$6bo6bob3o54bobo8bo$3b2o3bo 4bo5b2o51bo5b2o3bob2o$5b3ob4o6bo11b2o4bo17b2o4bo21bo$14b2o11b4o4bobo 13b4o4bobo9b7obobobobo$3b2obobob2o2bo17b2obobo2bo15b2obobo2bo14bobo3bo bo$6bobo19bo2bo8b2o10bo2bo8b2o7bob3obobob2o2bo$4bobobob5ob2o10bo2bob6o 13bo2bob6o10bo12bo$4bo10bo13bo9bo13bo9bo5bo2bo2b4ob3o3bo$4bo3b2o11bo3b 3obob3o5bo5bo3b3obob3o5bo5bo2bobo4bo3b2obo$4bo8bob3o3bob2o4bo7bobo2bo 2bob2o4bo7bobo2bo3bobobo6bo4bo$4bo2b3obobo4b2obo6bo2b3obobo4bo2bo6bo2b 3obobo4b2obo6bo4bo$4bo6bobob2o4bo2b2o3bo5bobob2o2bobo2b2o3bo5bobob2o4b o2b3obobo$5bobobo7bobobo7bobobo7bobobo7bobobo7bo3bo8bo$5bobobo3b2o2bob obo3b2o2bobobo3b2o2bobobo3b2o2bobobo3b2o2bobobo3b2o5bo$7bobo7bobobo7bo bobo7bobobo7bobobo7bobobo10bo$9bo2b2o3bo5bobob2o2bobo2b2o3bo5bobob2o2b obo2b2o3bo5bobob4obo$16bo2b3obobo4bo2bo6bo2b3obobo4bo2bo6bo2b3obobo6bo $8b4o5bo7bobo2bo2bob2o4bo7bobo2bo2bob2o4bo7bob3o$14b2obob3o5bo5bo3b3ob ob3o5bo5bo3b3obob3o$17bo9bo13bo9bo13bo9b2o$16bo2bob6o13bo2bob6o13bo2bo b6o$16bo2bo8b2o10bo2bo8b2o10bo2bo$20b2obobo2bo15b2obobo2bo$15b4o4bobo 13b4o4bobo$19b2o4bo17b2o4bo! golly-3.3-src/Patterns/Non-Totalistic/JustFriends/oscillators.rle0000644000175000017500000004006312750014265022171 00000000000000#C A collection of some oscillators in "Just Friends". #C These were found by a team of people (e.g, Dean Hickerson, #C David Bell, Paul Tooke, Jason Summers, Mark Niemiec). x = 621, y = 269, rule = B2-a/S12 313b6o21boo127bo100bo13bo$335bo131bobobo97boob11oboo$312boobobo17bob3o 15b5o44b6obbo6bobb3obbo18bo20bobobo$315bobo14bobbo5bo11boo57bo6bo7bo 18bo19bo5bo61b4obbo6bo7bo14bobbobobo6bo$206bo6bobb3obbo110bo4boo17bobo 16bo36bo6bo7bo20boo18bob3o67bo6bo7bo14bobbo7boobo$206bo6bo7bo34b4o5b4o 37bo25boboo16b3o11bo9boo34bo6bo7bo17boo5boo14bo71bo6bo7bo14bo3bo4boo3b o$206bo6bo7bo56bo27boboo11bo8boboo32bobobobboo37bo6bo7bo20bo3bob5o81bo 6bo7bo14bo3b3obbobbobo$206bo6bo7bo13boo5boo11b4o7b4o8bo18bo8bo8bo5bobo 6bo3bo4bo26bo9bo27bobb3obbo6bo7bo14b5obo3bo20bo66bo6bo7bo14bo8bo4bo$ 206bo6bo7bo13bo7bo14bo7bo23bo3bobbo8boboo3b3o7bo10bo4bo3bo24bobo3bobo 27bo14bo7bo19boo5boo13b3obo60b4obbo6bobb3obbo14bobo9bobo$206bo6bo7bo 10boobobo3boboboo9bob3o3b3obo21bobobobbo8bo7b3o3boobo16boobo24bobobobo 29bo14bo7bo23boo16bo5bo64bo14bo14bo4bo8bo$206bo6bo7bo13bobo3bobo12bo 11bo10bobo13b3obo6bobo5bo8bo14boobo13b3o12bobobo29bo14bo7bo26bo15bobob o65bo14bo14bobobbobb3o3bo$206bo6bo7bo13bobo3bobo12bob3o3b3obo7b3obo11b o6bo8bo11boobo11boo4bo9bobo18bo31bo14bo7bo26bo15bobobo65bo14bo14bo3boo 4bo3bo$206bo6bo7bo13bo7bo14bo7bo14bo10bo30bo8bo5bobbo13boo47bobb6o6bo bb3obbo44bo67bo14bo14boboo7bobbo$206bo6bo7bo33b4o7b4o7boo55b3obo11b5o 179b4obbo14bo14bo6bobobobbo$19boobboo181bo6bobb3obbo57b5o28bobo23bo$ 21boo233b4o5b4o43boboboo14boo235boob11oboo$18b3obb3o544bo13bo$311b6o3$ 60bo$50bo6boobo17bo3bo11bo$46boobbo11bo15bo3bo8boobo$21bo26boo12bo16b oo12bo54bo$19boboboo22bobboo6bobobo16bo13bo37bo16bo4boo120bo$18boo38bo boo17bobo10bobo11bo24boo16boo124bo$24boo20bo14bo19boo22booboobboobboo bboobboobboo19bobbo4boo140bo155bo78b4obbo6bobb6o13b17o$19boobobo20boo 15bo16bobo28boobboobboobboobboobbo15bobbobb3o118b4o22bo31bo4b4o4bo110b o84bo6bo$22bo22bo12bobobo15boo12bobo11bo3bo3bo3bo3bo3bo3bo15bo4b3obbo 4boo110bo22boobo14b3o4bo9bob3o4b3obo67b6obbo6bo25bobboo14b5o63bo6bo22b o6b5obbo$58boboo17bobo11bo12bo40boo4bobb3o113bo25boobo19bobo7bo5boo5bo 6b10o59bo6bo26bo3bo81bo6bo22bobbo6bo3bo$44bo16bo19boo10bo13boobboobboo bboobboobboo18bobbo4b3obbo4boo48bo5bo12bo13bo23boo20b4o3bo11b3o3bobobo 7bob4obb4obo75bo6bo15bo10bo85bo6bo22bobbo4bob3obo$43boo17bo16bobo10bob o12bobboobboobboobboobboobbo13bobbobb3o4bobb3o52bo5bo12bo13bo31bo20bob o13boo4bo7bo12bo7boboo3bo60bo6bo15bo90b4obbo6bobb3obbo16bo5bo5bo$6obbo 34bo14bobobo15boo26bo3bo3bo3bo3bo3bo3bo13bo4b3obbo4b3obbo4boo44bo5bo 11booboo9booboo28boboo7b4o6bobo11bo4bo10bob3o4b3obo7bobobbobo60bo6bo 112bo14bo16bob3obo4bobbo$8bo49boboo17bobo24bo38boo4bobb3o4bobb3o48bo5b o13bo13bo18boo10bo13bo7bo13bo3bo10bo3bo4bo3bo7bo6bo52bobb3obbo6bo45bob o64bo14bo16bo3bo6bobbo$8bo9boo5boo15bo18bo19boo9bobo12boobboobboobboo bboobboo16bobbo4b3obbo4b3obbo46bo5bo13bo13bo16boobo7boboo12bobo6b4o10b o4bo9bob3o4b3obo7bobo4bo52bo14bo17bo15bo12bo65bo14bo16bobb5o6bo$8bo11b 3o18boo19bo16bobo11bo13bobboobboobboobboobboobbo11bobbobb3o4bobb3o4bo bbo46bo5bo44bo10boo14bobo17bo4boo11bo12bo7bo4bobo52bo14bo13bo3bo11bo3b o9booboboo62bo14bo$8bo11bo3bo16bo16bobobo15boo13bo12bo3bo3bo3bo3bo3bo 3bo11bo4b3obbo4b3obbo4boo46bo5bo14bo9b3obboo10boobo28bo3b4o10bobobo3b 3o7bob4obb4obo7bobbo3bo52bo14bo14boobbo11boobbo11bo59b4obbo6b6obbo15b 17o$obb3obbo13b3o33boboo17bobo10bobo11bo36boo4bobb3o4bobb3o4bo45bo5bo 14bo29bo28boboo14bobo15bo5boo5bo67bo14bo16bo15bo$o17boo5boo13bo20bo19b oo24boobboobboobboobboobboo14bobbo4b3obbo4b3obbobbo45bo5bo12booboo6b9o 19boo22boboo14bo4b3o8bob3o4b3obo67bobb6o6bo16bo15bo$o39boo20bo16bobo 25bobboobboobboobboobboobbo9bobbobb3o4bobb3o4bobbo48bo5bo15bo36bo22bo 33bo4b4o4bo$o40bo16bobobo15boo12bobo11bo3bo3bo3bo3bo3bo3bo9bo4b3obbo4b 3obbo4boo48bo5bo15bo35bo23bo$o57boboo17bobo11bo12bo34boo4bobb3o4bobb3o 4bo102b4o$obb6o31bo20bo19boo10bo13boobboobboobboobboobboo12bobbo4b3obb o4b3obbobbo$40boo20bo16bobo10bobo12bobboobboobboobboobboobbo10bobb3o4b obb3o4bobbo106bo$18bo6boo14bo16bobobo15boo26bo3bo3bo3bo3bo3bo3bo12b3o bbo4b3obbo4boo106bo$18bo3b3o33boboo17bobo24bo32boo4bobb3o4bobb3o4bo$ 19boo3bo15bo20bo19bo10bobo12boobboobboobboobboobboo18b3obbo4b3obbobbo$ 19bo19boo21bo17boo11bo13bobboobboobboobboobboobbo12boo4bobb3o4bobbo$ 19bo5bo9boobbo18bobobo15bo3bo10bo12bo3bo3bo3bo3bo3bo3bo20b3obbo4boo$ 25bo32bobbo16bo3bo9bobo11bo40boo4bobb3o4bo124b5o$20bo3boo10bobboo17bo bbo45boobboobboobboobboobbooboo23b3obbobbo441bo$20b3o3bo9bo23boboo40b oo24bo20boo4bobbo128bobo313bob12o$18boo6bo33bo31boboo9bo53boo128bobo 299b7o7bo$92bo62boo4bo96bo14boo14b3o12b5o152bo11bo62b4obbo6b4obbo18b7o 24boboboo$161bo93bobbobo62bo137bobo9bobo66bo12bo49bobo$240bo14bobbobo 13bob4o27b4o10bobo135bobobobo5bobobobo64bo12bo15bo16bo16bo3bo4bobo$ 236bo3bobo9boobo33boo11b3obbo13bobo81b6obbo6b6obbo30bobo3bo5bobo3bo64b o12bo15bo16bo4bobo9bo3bo5bo$236bo3bobo15bob3o10boobb5o25b3o11bobo89bo 14bo13b9o8bo5bo5bo5bo64bo12bo15bo4bobo9bo5bo20bo$241bo9b3ob4o16bobo42b oobobo87bo14bo30bobbobbo5bobbobbo58b4obbo12bo21bo16bo25bo$234boobo3b4o 11bobo15bobo44b3obo87bo14bo18bo11bobbobbo5bobbobbo64bo12bo21bo32bo9bo$ 256b4ob3o6b5obboo12boo10b3o14boo3bo87bo14bo14b3o13bobobobo5bobobobo64b o12bo16bo16bo20bo5bo3bo$237b5o10b3obo48bobb3o6b3o85bobb3obbo6bobb3obbo 30bobbobbo5bobbobbo64bo12bo16bo16bo5bo13bobo4bo3bo$259boboo9b4obo24b4o 99bo14bo27bobo8bobobobo5bobobobo64bo12bo15bobo4bo9bobo4bo22bobo$254bob obbo30b3o27boo83bo14bo38bobbobbo5bobbobbo58b4obbo12bo22bo16bo19boobobo $254bobobbo17boo11bobo11b5o96bo14bo22b9o7bobbobbo5bobbobbo100bo41bo$ 256bo33bobo112bo14bo38bo5bo5bo5bo129b12obo$405bobb6o6bobb6o30bo3bobo5b obo3bo91b7o10b7o27bo$bb4obbo280b5o165bobobobo5bobobobo$8bo46bo405bobob o5bobobo$8bo11bo34bo39bo15bo6bo5bo338bo9bo$8bo11bo12bo19booboo8bo15b4o 7boboboo12bo6bob3obo8bo12bo14b3o$8bo10bo11bobo10bo10bo10bo10bo15bobbo 12bo8bo5bo5boobo9boobo$bb4obbo11b3o8bobo10bo10bo8boobo9boboobobo9bo3b oo9b4o5bobbobbo9bo11bo3bo7b4o$8bo33booboo19bobo8bo6bo7boo3bo9boo9bobob obo8bo13bobbo12bo102b6o8b9o8b9o$8bo12bo8bobobo9bo10bo11boboo6boboobobo 10bobbo9bo9bobbobbo7bo15bobo8boo$8bo12bo22bo10bo12bo8bo15boobobo6boobo 9bo5bo8boboo8b3obbo12bo101b3obo11bobbobo11bobbobo13bo$8bo20b7o17booboo 10bo13b4o10bo11bo9bob3obo8bo24b4o44bo6b6obbo29bo16boboo9boboboboo9bobo boboo11bobo211bo7bo6bobb3obbo$bb4obbo46bo62bo5bo23b4o54bo14bo29bo14bo bbo13bobbo13bobbo13bobobo142b3o64bo7bo6bo7bo14b10o$55bo105b3o42bo14bo 24bo9bo9bobbo13bobbo13bobbo17bob3o205bo7bo6bo7bo$206bo14bo12boo10bob3o b3obo9bo6bo9bo6bo9bo6bo8boo149b3o61bo7bo6bo7bo18b3o$206bo14bo13bo10bo 9bo13boobo13boobo13boobo15boo206bo7bo6bo7bo17bo4bo$206bo6bobb3obbo13bo bo8bo9bo7boboo13boboo13boboo13boo90b6obbo6b4obbo16bo3bo17b4o60bobb3obb o6bo7bo14b3ob4o$206bo6bo23bo8bo9bo7bo6bo9bo6bo9bo6bo15b3o91bo12bo13boo bo3boboo13bo72bo6bo7bo17bo4bo$206bo6bo23boo7bob3ob3obo11bobbo13bobbo 13bobbo8b3obobo94bo12bo16bo3bo16boboo69bo6bo7bo18b3o$206bo6bo32bo9bo 11bobbo13bobbo13bobbo12bobobo92bo12bo16bo3bo10boo77bo6bo7bo$206bo6bo 37bo14boobo13boobo13boobobobo12bobo92bo12bo18bo19b4o68bo6bo7bo14b10o$ 112bo93bo6bobb6o29bo16bob3o12bob3o12bobobbo14bo84bobb3obbo6b4obbo13boo 3bo3boo6b4o76bo6bobb3obbo$100bo8booboboo291bo20bo18bo20boo$81bo18bo11b o13bo139b6o11b6o11b9o98bo20bo16bo3bo10boobo$o7bo58bo13bobobo25bobo10bo bo10boo268bo20bo16bo3bo13bo$o7bo23b4o13bo17boo12bo17b3o22bobo20bo3bobb o252bo20bo13boobo3boboo6b4o$o7bo37b7o10b3o15bobobo11boo11b5o9bo13boboo 5bob3obbo252bobb6o6b4obbo16bo3bo$o7bo11bo13b4o11bo12boobbo14bo16bo13bo 10b3o12bo8bobobbobo305b3o$o7bo11b3o9bo12b3o3b3o8bobobo13b7o8boobo13bo 11bo13boo7bob3obbo$obb3obbo10b3o13bo26bobboo8b7o30bo11bobo8b3o9bo6bo 308b3o107bo$8bo12bo8boobobo12b3o12b3o14bo16boboo11bo11bobo20bob4obo 418bo$8bo24bobo24boo14bobobo16bo12b5o9bo13boo7bo6bo385bo7bo6bo13b3o$8b o24bo27bo18bo16boo441bo7bo6bo17bobo$8bo67bobobo13b3o14bobo426bo7bo6bo 19bo$8bo71bo31bo129bo297bo7bo6bo$95bo13booboboo124b5o36bo34b9o34bo180b o7bo6bo15bo$95bo16bo166bobo18bo39b3o13boobo180bobb3obbo6bo$208bo6b4obb o19b3o35bobo18bobo14bobo3bo35bo188bo6bo13bo3bo$208bo12bo57bobo18bobo 16bobobo12b3obo12boobobbo188bo6bo$208bo12bo19b3o33bo5bo12boo3bobbo11bo bbobobo10boo4bo15bobbo188bo6bo14bobo$208bo12bo20bo34bobobobo14bobboobo 16bobo15bo19bo188bo6bo$208bo12bo12bo15bo9bo7bo9bo3bo11boobo5bo14bobbob o9b3oboo16bobobo188bo6bo12b7o$208bo6b4obbo12bobobo7bobobo9bo7bo27boo 16bobboobbobobo13bobo8bo8bo82bo13bo8b6o$208bo12bo11booboboo5booboboo 41b3o9b3o6bob3obb3obo8bob4obo8bo8bo82bo13bo$208bo12bo12bobobo7bobobo 52boo9bobobobboobbo8bobo13bobobo50b6obbo6bo7bo13bo13bo7b3o$208bo12bo 12bo15bo11bo3bo11bo3bo14bo5boboo9bobobbo15boob3o7bo62bo6bo7bo13bo3bo5b o3bo12bo$38bo169bo12bo20bo18bobobobo9bobobobo12boboobbo13bobo17bo13bo bbo59bo6bo7bo13bob3o5b3obo8b7o$obb6o29bobobbo87bo76bo6b4obbo19b3o17bo 5bo9bo5bo12bobbo3boo11bobobobbo11bo4boo8bobboboo56bo6bo7bo13bo3b3ob3o 3bo12bobo$o37bobobb3o71bobbo10bo18boobboo107bobo13bobo16bobo15bobobo 14bob3o10bo62bo6bo7bo13bob3o5b3obo9bobobbo$o39boboboo9b8o35b5o14bobbo 10bo3b7o10boo30boo55b3o19bobo13bobo16bobo15bo3bobo27boboo51bobb3obbo6b obb3obbo13bo3bo5bo3bo9bobobboboo$o18bobbo17bobobboo37bo32bo3boo8b3o4bo 10b3obb3o13bo92bobo13bobo18bo32b3o14bo54bo22bo13bo13bo125bo$o18bobb3o 18boo12b5o7boo3boo8bobo12bobo15bobo11bobob4o9bo8bo6bo5bo10b3o56b5o18bo 15bo35b9o26bo54bo22bo13bo13bo8b7o110bobo$obb3obbo10boboboo7b3o20boo4bo 10bo11bobo12bobo29bobo15bobobbobo7bobo3bo14bo56bo162bo22bo13bo13bo125b obo$8bo10bobobboo13bo3b4o8b3ob3o6b9o6bo3bo10bo3bo9b4o3b4o8bobo3bobo 265bo22bo111bo14b4obbo14bo7bobo$8bo13boo9b4o3bo14bo4boo10bo10b5o10b5o 34bobo7bo10bo7bobo9bobbobo221bobb6o14bo111bo7bo12bo14bo5boobbo$8bo36b 3o7b5o9boo3boo39bobo14b4obobo26bobobo7bo361bo7bo12bo14bobo7bo$8bo13b4o 9boo45bob3obo9b5o9boo3bo14bo4b3o9bobobbobo11bobo7bobbo358bo7bo12bo14bo bo7bo$6obbo24boobbobo14b8o20bo5bo25bobbo11b7o3bo8bo8bo12bo5bo363bo7bo 12bo14bobobbobobbo$34boobobo56b3o3b3o9bobbo21bo9b3obb3o19bobbo360bobb 3obbo6b4obbo12bobobobobobobo$34b3obbobo97bo12boo394bo12bo12bobbobobbob o$36bobbobo108boobboo392bo12bo12bo7bobo$41bo506bo12bo12bo7bobo$548bo 12bo12bobboo5bo$206bo6bo7bo326bo6b4obbo12bobo7bo$206bo6bo7bo53b9o12b4o 276bobo$206bo6bo7bo47bo306bobo$206bo6bo7bo31bo15bob5o6bo14bob4o275bo$ 206bo6bo7bo31bo15bo5bo3boobo14bobo$206bo6bobb3obbo37boo8bobb4o6bo14bo$ 206bo14bo31b3o13bo8b3obo$206bo14bo12boo33bob3o8bo10bo163b4o9b9o9b3o$ 115bo90bo14bo14bo15b3o14bo6b4obbo10bo3b3o$obb6o90bo15bobo88bo14bo14bo 10boo20boboo3bo5bo10boboo109b6obbo6bobb6o28boboboo7bobo3bo8b4o$o99bo 14bobobo86bo14bo14bo17bo14bo6b5obo10bo3b4o113bo6bo36bobo10bobobobo11bo $o47bo14bobbo10bobbobbo12bo5bo14bobob3o130bo27bo131bo6bo36bo12bo3bobo 6b3o95b5o$o33bo13bo14bobboboo4boobobbobboboo27b3o151b9o15b5o117bo6bo 53bobo60bo7bo6bobb6o$o33bo12bobo12bobobo10bobobobo10bobobobobobo16boo 291bo6bo53bo62bo7bo6bo$obb3obbo14boo8bo10b3obob3o6b3obobo12bobobo11bob obobobobo8boo291bobb3obbo6bobb3obbo45bo62bo7bo6bo$o7bo13bo9bo61bo3bo3b o16b3o284bo14bo7bo13b3o11b3o10b3obbo10b3o49bo7bo6bo22bo5b3o$o7bo13bo9b o14b3o12b6o8b9o27b3obobo287bo14bo7bo13bobo11bobo10bobobbo10bobo49bo7bo 6bo22bobo3bobo$o7bo107bobobo285bo14bo7bo13bobo11bobo10bobobbo10bobo49b obb3obbo6bobb3obbo14bobo3bobo$o7bo109bobo285bo14bo7bo13bobo11bobo10bob obbo10bobo57bo6bo7bo14bobo3bobo$obb3obbo111bo173b5o107bobb6o6bobb3obbo 116bo6bo7bo14b3o5bo$442b5o9b5o8b8o8b5o56bo6bo7bo$239b7o13b7o25b4obo 249bo6bo7bo$207bo6bobb6o71bobo249bo6bobb3obbo$207bo6bo26bobo17bobo13bo 14bobo279b5o$207bo6bo28bo11bo7bo11bobo14bobb3o$207bo6bo26bobo11bo5bobo 11bobo4bo9bo$207bo6bo19bo43bo3bo9bo$207bo6bobb3obbo11bo38b7obbo12bo$ 207bo14bo11bobobo5boo10bobo5bo15bo14bo$207bo14bo11bo21bo7bo11b3obo9b3o bbo$207bo14bo11bob3o17bobo21bo12bobo161bo$207bo14bo11bo6bo49bobo114b6o bbo6b4obbo17b3o5bobo$207bo6b6obbo11bo6bo12b7o30bob4o119bo12bo25bobo$ 103bo15bo8bo287bo12bo12b6o5bobo$101bobo15bo8bo161b4o122bo12bo19bo3bo$ 58b7o18bo17bobo4bo307bo12bo13b4o3bobbo$81bobobo11b3obobb3obo299bobb3o bbo12bo17bobbo3b4o117bo11bo$42bo3bo12bo3bo17bobobo15bo6bo12bo4bo281bo 20bo17bo3bo122boob9oboo$bb4obbo15bobo15bo3bo12bo3bo17bo4bo11bobo5bo13b o6bo280bo20bo15bobo5b6o81b4obbo6bobb6o$8bo33bo3bo12bo3bo20bobo11bo8b4o 9bobboobbo280bo20bo13bobo100bo6bo21bo4bobo4bo$8bo13bo5bo10b4o3b4o6b4o 3b4o17bo13bo21b3obb3o280bo20bo13bobo5b3o92bo6bo21bo4bobo4bo$8bo67b3o 16b3o11b3o296bobb6o12bo13bo102bo6bo21bo11bo$8bo13bo5bo11bo7bo8bo7bo42b o437bo6bo21bobo7bobo$8bo31bo7bo8bo7bo9b3o18b4o8bo11b3obb3o418bo6bobb3o bbo13bobob5obobo$8bo15bobo52boo19bo5bobo11bobboobbo132b9o277bo6bo7bo 13bobo7bobo$8bo67boo20bo6bo14bo6bo418bo6bo7bo13bo11bo$8bo69boo18bob3o bbob3o11bo4bo134bo5bo278bo6bo7bo13bo4bobo4bo$8bo89bo4bobo155bob3obo 278bo6bo7bo13bo4bobo4bo$8bo94bobo155bobobobo278bo6bobb3obbo$103bo15bo 8bo77bo6bobb6o352boob9oboo$119bo8bo77bo6bo49bobo20bo33bo254bo11bo$206b o6bo39bo21bo10bo31bobo122bo11bo$206bo6bo20bo7bo10bob3o13b3obo11boo14bo 12bobobo121boob9oboo$206bo6bo20bo7bo10bo21bo8boobbo14bobbo9bobo3bo84b 6obbo6bobb3obbo$206bo6bobb3obbo12bobbobobbo10bobboobo9boboobbo15bo8boo 4bo11b3o94bo6bo7bo12bo5boo4bo9b12o11boo$206bo6bo7bo12bobo5bo10bobbo15b obbo7b3obo3boboo6bo4boo6b5o3bo92bo6bo7bo12bo11bo$206bo6bo7bo12bobbobo bbo10bobboobo9boboobbo25bobbo110bo6bo7bo12bo4b3o4bo7b10obb3o9b4o$206bo 6bo7bo12bo7bo10bo21bo11b5o12bo12b7o91bo6bo7bo12bobobo3bo3bo11boo4bo20b 3o$206bo6bo7bo12bo7bo10bob3o13b3obo131bobb3obbo6bobb3obbo12bobobo3bobo bo8boobb5o3b3o9b4o$206bo6bobb3obbo31bo21bo131bo14bo7bo12bo3bo3bobobo 40boo$263bobo141bo14bo7bo12bo4b3o4bo9b13o13b3o$407bo14bo7bo12bo11bo39b oo$261bobobobo139bo14bo7bo12bo4boo5bo37bo$261bob3obo139bobb6o6bobb3obb o62bo$42boo217bo5bo174boob9oboo$obb3obbo52bo12bo10bo357bo11bo$o7bo31bo b3o16bobo10bobo8bobo172b9o$o7bo10bo20bo18bobobobo8bobo8bobo437b6obbo6b 4obbo6bobb6o$o7bo10bobobo7bo10b3o14bo3bobo10bo7bo3bo20bo423bo12bo6bo 32bobo$o7bo10bo7bobobo7boo18bo5bo18bob3o8bo8boobo423bo12bo6bo$obb3obbo 10bobobo7bo10bo16bo5bo18bo3bo8bobobo3bo427bo12bo6bo31b5obboo$o7bo10bo 7bobobo9bo5bobo9bobobobo8bobo7bobbo17bobo425bo12bo6bo32bobo$o7bo22bo 11bo3bobobo7bo5bo19bobo11bobo3bobo417bobb3obbo6b4obbo6bobb3obbo24b3o$o 7bo36bobobobo7bobobobo8bobo8bobo11bobobobo419bo20bo6bo7bo$o7bo35bo16bo bo21bo15bobo155boo264bo20bo6bo7bo$obb3obbo37boboo11bo11b5o25bo421bo20b o6bo7bo$46bo189bo10bo13b3o13b3o245bo20bo6bo7bo$208bo6b4obbo14bobboobb oobbo277bobb6o6b4obbo6bobb3obbo$208bo12bo12bobboobobboboobbo12bo9bo3b 3o$208bo12bo13bo4b4o4bo10boobo9boboo$208bo12bo13bobbobobbobobbo10boo 11bo3b5o$208bo12bo16b3obb3o14b4o8bo3bo$208bo12bo16b3obb3o15bo16b4o$ 208bo12bo16b3obb3o12bo11b4o$208bo12bo13bobbobobbobobbo7b4o15bo3bo$208b o12bo13bo4b4o4bo10boo10b5o3bo$208bo12bo12bobboobobboboobbo7boboo15boob o$208bo12bo14bobboobboobbo9bo15b3o3bo$236bo10bo$256b3o13b3o$63b9o23bo$ 48b5o40bobo16bo146boo$32bo32b5o12bo10bobo16bo41b6o$obb3obbo10b5o5boobo boo13bobo11boo5boo8bobo10bobo12bo17b4o10b4o$o7bo40bobo14bobo11bobo8bo bbobbo9bobob3o39boobobo$o7bo11bobo8bobo8bo7bo15bobo9bobobobo6bo5bo6boo bobo4bo8boobobo8boobobo13bobo9b3o3b3o$o7bo11bobo8bobo8boboo21bo10bobbo bbo6bo5bo9bo4boo12bobo11bobo7b3o4bo94bo15bo$o7bo12bo10bo9bo3bo9bo21bo 5bo9bo32bo13bo25b3o5b3o73boob13oboo$obb3obbo33boboo7boobo21bo5bo9bo12b oo4bo56b5o$8bo33bo9bo3bo21bo5bo6bo5bo8bo4boboboo36bo4b3o7boo5boo75bo6b obo3bobbo10b11o$8bo44boobo10bo10bobbobbo6bo5bo9b3obobo10b3o12boo11bobo 16b3o32bo6bobb3obbo30bob3obbobo3bobbo$8bo12bo10bo15bo7bo9bobo9bobobobo 6bobbobbo14bo26bo12boboboo12bo3bo31bo6bo7bo12b9o9bo6b3o3bobbo11bo7bo$ 8bo11bobo8bobo13bobo16bobo11bobo10bobo12bo18boo7b4o66bo6bo7bo30bo15bo 11bo3bobobo$6obbo11bobo8bobo13bobo13boo5boo8bobo10bobo12bo42b6o49bo6bo 7bo13bo3bo12bo15bo11bo$65b5o10bo12bobo43boo65bo6bo7bo13bo3bobbo9bob3o 7b3obo11bobobobo$19b5o5booboboo10b5o44bo110bo6bobb3obbo17boo11bo3bo7bo 3bo11bo5bo$32bo30b9o134bo6bo7bo20bo9bob3o7b3obo11bo5bo$206bo6bo7bo16b 3obo9bo15bo11bobobobo$206bo6bo7bo30bo15bo17bo$206bo6bo7bo13b9o8bobbo3b 3o6bo9bobobo3bo$206bo6bobb3obbo30bobbo3bobobb3obo9bo7bo$252bobbo3bobo 6bo$277b11o$251boob13oboo$252bo15bo7$333bo$313b4o16bo$328b3o$298bo13b 3o16bo$272boo15b8obo16boo9b5o$206bo6bobb3obbo47b5o6bo17bobo10b3o17bo 36bo$206bo6bo7bo19b3o31bobbobo6b6o5bobo13bo14bo15boo21bo$206bo6bo7bo 48b5o3bobo17bobo8b4o16bo36bo$206bo6bo7bo17b4o10bobobbobo17boboo6bo3bob 3obobo42bobobboo3boo12b5o$206bo6bo7bo21boo33boboo6bo3bobo5bo9boo31bobo bobo16bo$206bo6bobb3obbo19bo11bobobbobo9bo7bo9bo3booboo3bo15boo25bo3bo bobobo13b3o$206bo14bo14bo3bobo9bo8bo9bo7bo8bo5bobo3bo48bobobo10bo$206b o14bo14bobbobo11b8o7boobo16bobob3obo3bo14b4o13bo18bo12bo$206bo14bo12bo bobobo27boobo16bobo22bo18bo$206bo14bo12bobobbo11b12o6bobo3b5o8bobo5b6o 12b3o13bo$206bo6b6obbo12bobbo31bobobbo13bobo20boo18b5o$237bo31bo6b5o9b ob8o13b3o14bo$276boo12bo40b3o$310b4o14bo$328bo! golly-3.3-src/Patterns/Loops/0000755000175000017500000000000013543257426013202 500000000000000golly-3.3-src/Patterns/Loops/Byl-Loop.rle0000644000175000017500000000102012026730263015242 00000000000000# Byl Loop # # J. Byl. "Self-Reproduction in small cellular automata." # Physica D, Vol. 34, pages 295-299, 1989. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 4, y = 4, rule = Byl-Loop .2B$BCAB$BCDB$.BE! golly-3.3-src/Patterns/Loops/Perrier-Loop.rle0000644000175000017500000000353112026730263016135 00000000000000#CXRLE Pos=0,0 # Perrier loop # # J.-Y. Perrier, M. Sipper, and J. Zahnd # "Toward a viable, self-reproducing universal computer" # Physica D, vol. 97, pp. 335-352, 1996 # # After replicating the loop and the program and data stacks, Perrier's loop # then executes its program, sending commands and data along the sheath between # the two stacks. # # Here are the important states: # # state in the paper description # ----- ------------ --------------------------- # 14 7 advance (used inside the loop) # 15 4 turn left (used inside the loop) # 3 A the start of the program # 4 P program instruction: print 0 # 5 P program instruction: print 1 # 6 P program instruction: move data head down # 7 P program instruction: move data head up # 8 P program instruction: if (see paper for details) # 9 P,J program instruction: jump (sign 0) # 10 P,J program instruction: jump (sign 1) # 11,12 D 0,1 data (initial sequence in this example: 1001000) # # Thanks to Gianluca Tempesti for the transition table and the pattern. # # The program in this example is just a demo of some of the commands. Firstly it # does: move down, print 1, move down, print 1, move down. Then it checks the # value of the data tape at the current point. If 1 then it repeats from the # start. If false it moves the data head up 8 places. The last two of these # require the tape to be extended, shuffling all the entries down in turn. # x = 15, y = 31, rule = Perrier .8B$BAN.AO.AOB$B.6B.B$BNB4.BAB$BAB4.BAB$B.B4.BAB$BNB4.BAB$BA6BA5B$B.N A.NA.N5AB$BC12B$BFB4.BLB$BEB4.BKB$BFB4.BKB$BEB4.BLB$BFB4.BKB$BHB4.BKB $BIB4.BKB$BJB5.B$BJB$BJB$BJB$BJB$BGB$BGB$BGB$BGB$BGB$BGB$BGB$BGB$.B! golly-3.3-src/Patterns/Loops/Evoloop-finite.rle0000644000175000017500000000635712026730263016526 00000000000000# A modification of Evoloop created to make it work within a finite # area. Extend or restrict the area of state 9 cells to change the # range of action. # # In a finite area the evolving properties are more easily seen since # only the most successful loops can survive the overcrowding. Smaller # loops rapidly outcompete the larger ones. # x = 628, y = 533, rule = Evoloop-finite 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $261I15B352I$260IBGIAGIAGIAGI4AB351I$260IBA13BAB351I$260IBIB11IBAB 351I$260IBGB11IBAB351I$260IBAB11IBAB351I$260IBIB11IBAB351I$260IBGB11I BAB351I$260IBAB11IBAB351I$260IBIB11IBAB351I$260IBGB11IBGB351I$260IBAB 11IBIB351I$260IBIB11IBAB351I$260IBGB11IBGB351I$260IBA13BIB351I$260IBI GAIGAIGAIDAIDAB351I$261I14BE352I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I! golly-3.3-src/Patterns/Loops/Evoloop.rle0000644000175000017500000000151712026730263015243 00000000000000# Evoloop # # Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on # Cellular Automata", Proceedings of the Fourth International # Symposium on Artificial Life and Robotics (AROB 4th '99), # M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), SDSR (1998), # Tempesti (1999), Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 17, y = 17, rule = Evoloop .15B$BG.AG.AG.AG.4AB$BA13BAB$B.B11.BAB$BGB11.BAB$BAB11.BAB$B.B11.BAB$ BGB11.BAB$BAB11.BAB$B.B11.BAB$BGB11.BGB$BAB11.B.B$B.B11.BAB$BGB11.BGB $BA13B.B$B.GA.GA.GA.DA.DAB$.14BE! golly-3.3-src/Patterns/Loops/Langtons-Loops.rle0000644000175000017500000000114112026730263016470 00000000000000# Langton's Loops # # C.G.Langton. "Self-reproduction in cellular automata." # Physica D, Vol. 10, pages 135-144, 1984. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 15, y = 10, rule = Langtons-Loops .8B$BAG.AD.ADB$B.6B.B$BGB4.BAB$BAB4.BAB$B.B4.BAB$BGB4.BAB$BA6BA5B$B.G A.GA.G5AB$.13B! golly-3.3-src/Patterns/Loops/Chou-Reggia-Loop-1.rle0000644000175000017500000000113512026730263016753 00000000000000# Chou-Reggia Loop 1 # # J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. # ``Simple systems that exhibit self-directed replication.'' # Science, Vol. 259, pages 1282-1287, February 1993. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 4, y = 2, rule = Chou-Reggia-1 2A$CD2A! golly-3.3-src/Patterns/Loops/Tempesti-Loop.rle0000644000175000017500000000505312026730263016320 00000000000000# Tempesti's self-replicating loops. # # G. Tempesti. # # "A New Self-Reproducing Cellular Automaton Capable of Construction and # Computation". Advances in Artificial Life, Proc. 3rd European Conference on # Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial # Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563. # # Implemented from Tempesti's thesis: # http://lslwww.epfl.ch/pages/embryonics/thesis/ # # This loop first constructs a skeleton of the right size, before # allowing the loop instructions to flow into the new copy. The loop # then opens a gate into its interior and writes the letters "LSL" # using a constructing arm, in a similar way to von Neumann's CA. # LSL are the initials of the Logic Systems Laboratory. # # The rules are not rotationally symmetric, so the letters are always # written the right way up, even though the loops are created in # different orientations. # # State Function # ------------------------loop function------ # 0 background # 1 sheath # 2 control # 3 construction # 4 destruction # ----------------------------programmable--- # 5 NOP (no operation) # 6 advance # 7 turn left # 8 turn right # 9 write an empty space # ------------------------------------------- # # In the initial configuration, the control states (2) are found in each # corner. These determine that size of the loop that is to be written. States # 5-9 contain the program that is to be executed by the construction arm, these # are not used for the loop replication. To see this, overwrite them all with # state 5 - the loop will replicate but won't write anything. # # The program contained in the loop is the following: # (read clockwise from the bottom-right corner) # 7275 - initiation sequence, opens a gate in the top-left of the loop # Advance 11,turn left,advance 2,write an empty space,advance 4 (the control # state gets converted to an advance), turn left, advance 2, turn left, # advance 2, turn right, advance 4, turn right, advance 3, write an empty # space, advance 2, turn right, advance 7, turn left, advance 2. # 55 - close the gate # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 22, y = 22, rule = Tempesti 19.A$.BFH7FG2F6EB$AI18AE$.FA16.AE$.FA16.AE$.FA16.AE$.HA16.AE$.FA16.AE $.FA16.AE$.FA16.AE$.FA16.AE$.HA16.AE$.FA16.AE$.FA16.AE$.GA16.AE$.FA 16.AE$.FA16.AE$.GA16.AE$.FA16.AE$.F18AGA$.BFI2FG11FEGB$2.A! golly-3.3-src/Patterns/Loops/Perrier-Parenthesis-Checker.rle0000644000175000017500000001207512026730263021056 00000000000000#CXRLE Pos=-11,-2 # # Parenthesis Checker - in Perrier's self-reproducing loop # # See Perrier-Loop.rle for a simpler example, and for an explanation # of the states used in the program. # # This is an implementation of the 64 instruction program listed in # the appendix of Perrier's paper. The numbers on the left # correspond to the program instructions in the paper. The program # checks that a string has matching parentheses. In this example # the string "(()())" is encoded in the data tape. After many # timesteps the program halts (the program head drops off the end) # and the value under the data head is '1', indicating that the # expression is well-formed, and the parentheses do indeed match. # # (Here we've disabled the self-reproduction part of the loop's # function simply to avoid distracting us from the computation part. # To re-enable, set (19,6) to state 1, (10,8) to state 2, and # (14,8) to state 0.) # # The data tape is encoded with '(' = 10 and ')'=11. The rest of the # tape should contain zeros. (In Perrier's loop, the tape can be # expanded as required, and contains zeros by default, so here we # don't have to worry about the trailing zeros for example but you # can put them in if you want.) # # In our example, "(()())" = 101011101111 # # Caveat: the data head must be positioned just before (above) the # first parenthesis, else the result may be incorrect. In Perrier's # loop, the data head always starts at the top of the tape provided, # so our tape contains an initial '0': 0101011101111 # # There's a slight error in the paper, where it says that the final # result will be written in the uppermost data slot. This is not # always the case. The final position of the data head indicates # where the final result is stored. # # Enter your own sequence of brackets for checking. # # Contact: tim.hutton@gmail.com # x = 34, y = 376, rule = Perrier 20.8B$19.BAN.AO.AOB$19.B.6B.B$19.BNB4.BAB$19.BAB4.BAB$19.B.B4.BAB$19. BNB4.BAB$19.BA6BA5B$6.B12.B.NA.NA.N2AB2AB$5.B.B11.BC12B$5.B.B4.3B4.BD pA3.pABKB$5.B.B11.BFB4.BLB$6.B12.BHB4.BKB$19.BJB4.BLB$19.BJB4.BKB$19. BJB4.BLB$19.BJB4.BLB$19.BJB4.BLB$19.BJB4.BKB$19.BJB4.BLB$5.2B12.BJB4. BLB$7.B11.BJB4.BLB$6.B5.3B4.BFB4.BLB$7.B11.BHB5.B$5.2B12.BIB$19.BJB$ 5.3B11.BJB$5.B13.BJB$6.B5.3B4.BGB$7.B11.BGB$5.2B12.BGB$19.BGB$19.BHB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19. BJB$19.BEB$19.BHB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$2.B2.2B12.B JB$.2B4.B11.BJB$2.B3.B5.3B4.BFB$2.B2.B13.BHB$2.B2.3B11.BJB$19.BJB$12. 3B4.BEB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$.B2.2B13.BJB$2B.B15.BJB$. B.3B6.3B4.BGB$.B.B.B13.BDB$.B.3B13.BGB$19.BGB$19.BGB$19.BHB$19.BJB$2B 2.2B13.BJB$2.B3.B12.BEB$.B3.B6.3B4.BDB$B5.B12.BFB$3B.2B13.BHB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BFB$19.BHB$2B4.2B11.BJB$2.B2.B2.B10.BJB$.B4.2B5.3B3.BEB$B4.B2.B 10.BHB$3B3.2B11.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$2.2B3.B11.BJB$4.B.B.B10.BJB$3.B2.B.B4.3B3.BGB$ 4.B.B.B10.BGB$2.2B3.B11.BGB$19.BGB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BEB$19.BHB$19.BI B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$3.2B3.3B8.BJB$5.B4.B8.BJB$4.B4.B3.3B3.BFB$5.B2.B10.BHB$3.2B 3.B10.BJB$19.BJB$19.BJB$3.2B4.2B8.BJB$5.B2.B.B8.BJB$4.B3.3B2.3B3.BGB$ 5.B4.B8.BDB$3.2B5.B8.BFB$19.BEB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$6.B4.B7.BJB$4.B.B 2.B.B7.BJB$4.3B2.3B2.3B2.BGB$6.B4.B7.BGB$6.B4.B7.BGB$19.BGB$19.BHB$ 19.BIB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$5.B3.2B8.BJB$3.B.B2.B.B8.BJB$3.3B2.3B3.3B2.BDB $5.B4.B8.BFB$5.B4.B8.BHB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$3.3B.2B10.BJB$3.B5.B9.BJB$3.2B3.B4.4B2.BFB$5.B.B 11.BHB$3.2B2.3B9.BJB$19.BJB$13.4B2.BEB$19.BHB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$3.3B3.2B8.BJB$3.B4.B10.BJB$3.2B3.3B2.4B2.BGB$5.B 2.B.B8.BGB$3.3B2.3B8.BGB$19.BGB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BEB$19.BHB$19.BIB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$3.2B2.2B10.BJB$2.B6.B9.BJB$2.3B3.B4.3B3.BDB$2.B.B4.B10.B$2. 3B2.2B! golly-3.3-src/Patterns/Loops/Chou-Reggia-Loop-2.rle0000644000175000017500000000113412026730263016753 00000000000000# Chou-Reggia Loop 2 # # J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. # ``Simple systems that exhibit self-directed replication.'' # Science, Vol. 259, pages 1282-1287, February 1993. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 3, y = 2, rule = Chou-Reggia-2 2A$CDA! golly-3.3-src/Patterns/Loops/SDSR-Loop.rle0000644000175000017500000000145212026730263015300 00000000000000# SDSR Loop # # Hiroki Sayama. "Introduction of Structural Dissolution into # Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings # of the Sixth International Conference on Artificial Life, C. Adami, # R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, # Los Angeles, California, 1998, MIT Press. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 15, y = 10, rule = SDSR-Loop .8B$BAG.AD.ADB$B.6B.B$BGB4.BAB$BAB4.BAB$B.B4.BAB$BGB4.BAB$BA6BA5B$B.G A.GA.G5AB$.13B! golly-3.3-src/Patterns/Turmites/0000755000175000017500000000000013543257426013722 500000000000000golly-3.3-src/Patterns/Turmites/ComputerArt.rle0000644000175000017500000000175112026730263016605 00000000000000# Computer Art - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # The turmite works on a painting within an ever-expanding frame. Compare with # the pattern made by Margolus/TripATron.rle # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 0}, {0, 8, 1}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,2,1} says: # - set the color of the square to 1 # - turn right (2) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_180121020081 B! golly-3.3-src/Patterns/Turmites/AlienCounter.rle0000644000175000017500000000221012675334101016720 00000000000000# A 3-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Tim J. Hutton # # Appears to be counting, but in some clever alien way we haven't understood. If # you work it out, please let us know! Adam Goucher suggested that some of the # time it is counting in base-phi (the golden ratio), if that makes any sense to # you. # # http://github.com/GollyGang/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: # {{{0,'N',2},{1,'S',1}},{{0,'E',0},{0,'S',0}},{{1,'W',1},{1,'N',2}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {0,'N',2} says: # - set the color of the square to 0 # - move North # - adopt state 2 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py x = 1, y = 1, rule = AbsoluteTurmite_0N21S10E00S01W11N2 B! golly-3.3-src/Patterns/Turmites/TriangularLangtonsAnt.rle0000644000175000017500000000102712026730263020615 00000000000000# Langton's Ant on a triangular grid. # # This turmite has the same instructions as the normal Langton's Ant: turn right # on 0, left on 1 - but works on a triangular grid instead of a square one, and # so the resulting behaviour is different. As with some of the n-color Ants, # the resulting pattern is symmetrical and growth appears unbounded - presumably # the same proof of this as in the square grid case applies. # # Rule generated by Scripts/Python/Rule-Generators/TriTurmite-gen.py # x = 1, y = 1, rule = TriTurmite_120010 B! golly-3.3-src/Patterns/Turmites/LangtonsAnt_LLRR.rle0000644000175000017500000000150112026730263017414 00000000000000# An extension of Langton's Ant to multiple colors. This example has the # specification "LLRR", meaning that on the four colors 0, 1, 2 and 3, the # ant turns left, left, right and right, respectively. # # The color of the square is always changed to the next color in order, in # a cyclical fashion: 0 -> 1 -> 2 -> 3 -> 0 # # The LLRR ant makes a symmetrical cardioid shape as it grows. The behavior # of these ants was investigated in a 1995 paper: # # Gale, D.; J. Propp, S. Sutherland, S.Troubetzkoy (1995). # "Further Travels with My Ant". # Mathematical Entertainments column, Mathematical Intelligencer 17: 48–56. # http://www.math.sunysb.edu/cgi-bin/preprint.pl?ims95-1. # # The rule tree was generated by this script: # Scripts/Python/Rule-Generators/Langtons-Ant-gen.py # x = 1, y = 1, rule = LangtonsAnt_LLRR G! golly-3.3-src/Patterns/Turmites/TriangularAnt_period92.rle0000644000175000017500000000126112026730263020624 00000000000000# Langton's Ant on a triangular grid. # # This turmite has the same instructions as the normal Langton's Ant: turn right # on 0, left on 1 - but works on a triangular grid instead of a square one. # # Unlike the square grid ant, some patterns on the triangular grid cause the ant # to follow a bounded trajectory. This pattern has period 92, and is from this # webpage: # http://www.ing-mat.udec.cl/~anahi/langton/general.html # (Although they call it a hexagonal grid after the graph joining the cells, # rather than the shape of the cells themselves.) # # Rule generated by Scripts/Python/Rule-Generators/TriTurmite-gen.py # x = 5, y = 5, rule = TriTurmite_120010 2.A$3.H$H.M.A$.A$2.H! golly-3.3-src/Patterns/Turmites/FibonacciSpiral.rle0000644000175000017500000000155612026730263017373 00000000000000# Fibonacci Spiral - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,8,1} says: # - set the color of the square to 1 # - turn left (8) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_181181121010 B! golly-3.3-src/Patterns/Turmites/Extinction.rle0000644000175000017500000000241012026730263016455 00000000000000# A 3-state 3-color Turmite discovered by Ed Pegg, Jr. # # Ed Pegg, Jr. suggested two extensions of the turmite idea: that turmites # can turn in more than one direction, thus multiplying, and that when two or # more turmites land on the same square they annihilate each other. In certain # rare cases, such as this one, a population of turmites grows and then goes # extinct. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 2, 0}, {2, 8, 2}, {2, 1, 1}}, # {{1, 1, 2}, {1, 1, 1}, {1, 8, 1}}, {{2, 10, 0}, {2, 8, 1}, {2, 8, 2}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {2,10,0} says: # - set the color of the square to 2 # - turn left (8) *and* right (2) (8+2=10) # - adopt state 0 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_1202822111121111812a0281282 C! golly-3.3-src/Patterns/Turmites/WormTrails.rle0000644000175000017500000000171112026730263016437 00000000000000# Worm Trails - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # After building happily for 4 million timesteps the turmite gets stuck in # a short cycle. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 2, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 2, 0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,2,1} says: # - set the color of the square to 1 # - turn right (2) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_121181121020 B! golly-3.3-src/Patterns/Turmites/Perfectionist.rle0000644000175000017500000000206412675334101017155 00000000000000# A 3-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Tim J. Hutton # # Seemingly random for 15.5 million timesteps before making a highway. One of # the very few 3-state 2-color 2D Turing machines to exhibit interesting # behavior. # # http://github.com/GollyGang/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: # {{{0,'S',1},{1,'W',1}},{{1,'E',2},{1,'S',2}},{{1,'W',0},{0,'N',0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {0,'S',1} says: # - set the color of the square to 0 # - move South # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py # x = 1, y = 1, rule = AbsoluteTurmite_0S11W11E21S21W00N0 B! golly-3.3-src/Patterns/Turmites/Highway2074575.rle0000644000175000017500000000247712675334101016525 00000000000000# A 4-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Stephen Wolfram # # Wolfram devotes a page to this 2D Turing machine and describes it as: "one # example where the behavior seems in many respects completely random." If you # let it run for long enough, you can see that the pattern is periodic, with # period 2,074,575 and dx=3953, dy=1912. # # http://www.wolframscience.com/nksonline/page-185 # http://www.wolframscience.com/nksonline/page-186 # http://github.com/GollyGang/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: {{{1,'N',1},{0,'S',1}},{{1,'S',3},{0,'N',2}}, # {{1,'W',0},{1,'N',1}},{{1,'S',2},{0,'E',1}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {1,'N',1} says: # - set the color of the square to 1 # - move North # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py x = 1, y = 1, rule = AbsoluteTurmite_1N10S11S30N21W01N11S20E1 B! golly-3.3-src/Patterns/Generations/0000755000175000017500000000000013543257425014363 500000000000000golly-3.3-src/Patterns/Generations/Lines.mcl0000755000175000017500000001106312026730263016045 00000000000000#MCell 4.00 #GAME Generations #RULE 012345/458/3 #BOARD 200x200 #WRAP 1 #D The rule quickly self-organizes into linear structures, with separate #D orthogonally hatched areas. To see most interesting behaviour seed #D the universe with a circle with r >= 40 and a density of 20%. #D #D Anders Starmark, September 2000 #L 41.A6.A8.A$39.A4.A8.A6.A..A$39.A16.A3.A4.AA$35.AA.AA4.A6.A..AA3.A5.3A$ #L 33.A3.A12.A..A.AA7.A..3A$31.A6.A.AA.A3.AA4.A3.AA7.A..3A$27.A4.A3.A17.A #L ..A.A..AA..A..AA$22.A..A3.A.A.A3.A4.A5.AA8.A..A7.A3.A$23.A4.A..A..A6.A #L 8.A6.A.A8.A..A5.A$20.A8.A5.A.A..A13.A.A11.AA4.A$42.A..A..3A.A5.A5.A11. #L 3A$26.A..A..A6.A8.A13.A3.A7.AA4.A$22.3A12.A7.A..AA15.A..A4.A6.A.A$20.A #L 3.A5.A11.A3.A4.A3.3A9.A4.A..A6.A$20.A4.3A10.A4.AA6.AA6.A5.A.A.A3.A.A.A #L .A4.A$15.A7.A..A9.A4.A.A6.A4.AA18.A4.AA$13.A8.A..AA..3A26.A3.A.A..AA.A #L ..A9.A.A$17.A3.A11.A3.A9.AA.A6.A.A4.A3.A8.A8.A$32.A.A..A7.3A16.A.A8.A #L ..AA3.A$17.A10.AA10.A4.A.AA3.A.A4.A.A4.A10.A8.AA$10.A5.A.A4.A.A10.A3.A #L 4.A..AA7.A7.A..A6.AA11.A$9.A5.AA..A5.AA4.A3.A6.A..A4.A4.A..AA.A5.A4.A #L 15.A$14.A28.A3.A8.A10.A..A.A5.AA3.A.A$7.A..A9.AA5.A6.A6.A4.A3.A12.A6.A #L 3.A4.A5.A.AA.A$9.A16.A3.A17.3A3.A..AA3.A4.AA3.A.A10.A$18.A23.AA13.AA8. #L AA..AA5.A12.A$10.A..A8.AA.A.AA8.A5.A..AA6.A5.A4.A3.A..A.A..A3.A.A.A..A #L 4.A$10.A.A..A8.A6.A7.A.A8.A3.AA4.A.AA5.A6.A10.A..A$4.A.A3.A3.A9.A4.A. #L AA5.A12.A10.AA.AA7.A11.AA$4.A5.A4.A.A4.A..A11.A3.A..A3.A8.A.A.A.AA.A #L 15.AA$5.A11.A..A6.AA13.A..A3.A3.A8.A3.A..AA3.A4.A3.A.A$5.A6.A6.A6.AA5. #L A.A6.AA8.A.A4.A.A.A6.A9.A8.A4.A$4.A3.A11.A.A3.A12.A12.A..A6.A19.A3.A4. #L A3.A$12.A10.A7.A3.AA.A3.A5.A6.AA4.AA..A3.AA.A4.AA12.A$..A.A8.A.A8.A12. #L A..A.A4.A5.A5.A4.A3.3A.A..A5.A3.A.AA.A5.A$13.A9.A16.AA.A4.A..A19.A.AA #L 9.AA8.A.A$3.3A..3A.A.A7.A..A4.A8.A..A12.A3.A4.A..A..A3.A9.A..A5.A$..AA #L .A3.A3.A20.A.4A.A6.A..A7.A..AA.A8.A.A9.A..A4.A.A$8.A.A4.A.A3.AA..A10. #L 3A3.A7.AA5.A22.A11.AA..A$.A3.A.A4.AA4.A..AA.A.A11.AA6.A9.A.A3.A4.A5.A #L 9.A.A$10.3A9.A.A11.A13.A.4A.A6.A5.A12.A8.A.A.A$3.A6.A.A10.A9.A.AA3.A.. #L A..A9.3A5.A8.AA..A3.A5.A.AA.A..A$9.AA3.A.A..A.A7.A4.A.A7.A6.A5.A3.A4. #L AA4.A3.A4.AA3.A10.A$A5.AA4.4A.A.A9.A4.AA3.A.A..3A4.A.A.A10.A7.A6.3A6.A #L $6.A.A9.A3.AA18.A4.AA4.A5.AA5.A9.A.A3.A3.A4.AA5.A$4.A3.A..A4.A.AA.AA6. #L A..A3.A3.A8.A8.AA4.A..A3.A.A.A9.A4.A5.A$..A3.A4.A8.A5.A..A..A5.A..A.A #L ..A5.A10.A6.A20.A$10.A8.A7.A.A8.A.A10.A..A7.A7.A7.A7.AA.A.A$A..A..AA3. #L A9.A5.A4.A.A.A.A8.A.A7.AA3.AA14.A.AA3.A4.A6.AA$A.A.3A7.A.A20.3A..A6.A #L 13.A3.A12.A12.A4.A$3.A9.A.AA..A..A3.AA4.A5.A3.A.A10.A16.A11.4A.A.A4.A$ #L 3.AA3.A.A.A16.3A.A13.A21.AA4.A11.A4.AA$.A4.A3.A5.AA3.A4.A7.A..A5.AA5.A #L .AA..A..A.A3.A.AA.A.A.A6.A3.AA3.A3.A.A$8.A..A.A9.A13.A12.A.3A5.AA4.3A #L 4.AA..A6.A8.A3.A$A23.A.AA..A4.AA11.A3.A8.A4.A7.A.A..A10.AA3.A.AA$6.A.. #L AA.AA..A3.AA.A..A3.A.A4.A3.A6.A7.AA..A3.AA5.A9.A.AA4.A3.A$A4.A11.A4.A #L 3.AA4.A.A5.AA5.A7.A4.A11.A7.A10.A$25.A3.3A4.A.A6.A.AA4.3A3.A..A3.3A5.A #L 3.AA3.A3.A..A.AA$AA5.A.A10.A4.AA.A6.A7.A..A..A..A3.A..A4.A15.AA9.AA3.A #L $.A12.A3.A..A9.A.A.A..A4.A5.A3.A3.A.A.A.A3.A.A.A3.A9.AA.AA.A4.AA$3.A.. #L A4.AA.A12.A10.A..A3.AA3.A..A4.A3.A.A4.A5.AA4.A.A3.A5.A$4.A3.3A12.AA4.A #L 4.A8.A12.AA12.A3.A9.AA4.A.A$..AA.A4.A.A6.A3.A6.A5.A6.A3.A3.A.AA5.A.A.A #L .A.AA..A15.A..A3.A.A$..A.A.A5.A.A14.A..A4.A4.3A4.3A.A11.A5.A.A12.A3.4A #L .A.A$13.A.A..AA..A..AA11.AA4.3A3.A..AA.A3.AA18.A.A$4.A.A5.A6.A6.A5.A.A #L .A..A13.A7.A.A5.A3.A4.A16.A$..A.A5.AA..3A5.A10.A..A3.3A3.AA..AA3.A12.A #L .A5.A3.A6.AA..A$9.AA.A12.3A7.A..A11.A9.A7.AA4.A10.A.AA..A.A$5.A.A.A20. #L A4.A5.AA..A..A.A3.A.A5.A6.A..A3.A6.A..A..A4.A$5.A3.A.A10.A8.AA..3A9.A #L 5.A.A.A.A.A11.A4.A5.A5.A.A$5.A6.A..A12.A7.A13.A.A5.A9.A..3A5.A10.A$5.A #L .A4.A14.AA6.A.A..A..A5.A6.A.A.A6.A..A5.AA3.A6.A$6.AA5.AA3.A3.A9.A4.AA #L 6.3A3.A.A14.A14.A9.A$6.A4.A10.A.AA..A3.A6.A..A..AA3.A4.A.A7.AA3.A3.A.. #L A..A.A3.A.A3.A$6.A..A3.A4.AA6.AA5.A3.A7.A4.AA6.A4.AA8.A.AA3.AA4.A$20. #L AA7.A4.A.A..A3.A10.AA12.AA3.A16.A$9.A3.A..A8.A12.AA3.A.A.A8.A.A4.A14.A #L ..A5.A$8.A.A3.A3.A11.A10.A6.A.A3.A..A3.A5.A8.A..A10.A$9.A3.AA..A19.A.. #L A4.A5.A.A3.A12.A4.A3.A4.A.A$16.A6.A4.A.AA9.AA.A..A7.A8.A16.A6.A$14.A6. #L A6.AA25.A8.A3.A5.AA.A4.A3.A$13.AA13.AA7.A25.A.A6.A9.AA$14.A3.AA..AA.A #L 10.3A3.A..A.A.AA4.A3.A11.AA.A3.AA$18.A12.A4.A3.A3.A..AA3.A.AA.AA7.A..A #L .A..A.AA3.A3.A$17.AA9.AA..A10.A14.AA8.A5.A.A..A$20.A3.A9.A.A3.3A.A3.A #L 23.A.A6.A$16.A5.A..A8.A4.A14.A4.A4.A..3A4.A4.A$17.A..A3.A5.A3.A7.A4.A #L 7.A..A6.A4.A3.A.A$27.A..A22.AA20.AA.A.A$19.AA.5A3.AA..A3.A4.A18.A7.A4. #L A$21.A4.A..A6.A.A5.A3.A10.A6.A..AA.A$25.A4.A9.AA.A7.AA3.A.A..A4.A6.A.A #L $38.A4.A16.A.AA.A7.A$26.A.A3.A5.A10.AA5.3A10.A$44.3A4.A.A..A3.A$31.AA #L 3.AA8.A8.A$34.A4.A4.4A8.A..A$36.A.A5.A.A.A3.A3.A$40.AA3.A3.A5.AA golly-3.3-src/Patterns/Generations/Burst.mcl0000755000175000017500000000117512026730263016075 00000000000000#MCell 4.00 #GAME Generations #RULE 0235678/3468/9 #BOARD 400x400 #SPEED 0 #WRAP 1 #CCOLORS 9 #D Burst, a generations rule related to Nova, Prairie Fire and others #D which features large areas of cells that slowly die out or decay #D into oscillators. #D #D Named after a characteristic exploding oscillator. Similar to Day&Night #D in that constructions can be built both with inside and outside #D oscillations and growth/decay. Has still lifes similar to Life. #D #D Michael Sweney, March 2000 #L 12.A$12.A$12.A$12.A$12.A$12.A$12.A$11.3A$11.3A$9.7A$9.7A$7.11A$25A$7. #L 11A$9.7A$9.7A$11.3A$11.3A$12.A$12.A$12.A$12.A$12.A$12.A$12.A golly-3.3-src/Patterns/Generations/Banner.mcl0000755000175000017500000000050412026730263016176 00000000000000#MCell 2.0 #GAME Generations #RULE 2367/3457/5 #BOARD 800x800 #SPEED 0 #WRAP 1 #D "Banners" rule collection #D #D The banner. #D #D Mirek Wojtowicz, June 1999 #L 19.AA$19.ADAA$20.DBA$17.D.ABBA$16.C..3A$15.BDDAA$14.ACCA$11.D.ABBA$6.D #L 3.C..3A$4.CC3.BDDAA$4.DD..ACCA$3.CDD.ABBA$..AAD..3A$.ABBDDAA$.ABCCA$. #L BBCA$ADBA$3A golly-3.3-src/Patterns/Generations/MeteorGuns.mcl0000755000175000017500000000117212026730263017063 00000000000000#MCell 4.00 #GAME Generations #RULE 01245678/3/8 #BOARD 180x180 #WRAP 0 #D MeteorGuns #D #D Almost any design above a certain level of complexity results in #D a slowly exploding ball of fire which then spits fairly large numbers #D of generational gliders "meteors". #D #D There are easily discovered stable oscillators and static patterns. #D A truly satisfying environment (if only finding a limited growth meteor #D gun were as easy...). #D #D Discovered by Charles A. Rockafellor, March 2000 #L 8.A$8.A$9.A$10.A7.5A$10.A6.A$11.A3.AA$12.A.A$12.AA$11.A..A$10.A4.A$9.A #L 6.A$8.A7.A$6.AA9.A$5.A12.A$3.AA14.A$..A16.A$.A17.A$.A$AA golly-3.3-src/Patterns/Generations/Steeplechase.mcl0000755000175000017500000000226012026730263017377 00000000000000#MCell 2.0 #GAME Generations #RULE 345/2/4 #BOARD 500x500 #SPEED 50 #WRAP 0 #D Star Wars Fun collection #D #D Steeplechase, p20 #D #D Mirek Wojtowicz, May 1999 #L 135.A$134.3A$4.CB118.A10.A$6.C9.A12.A6.A11.A6.A6.A..A11.A4.A8.A4.A4.A #L 11.A9.3A9.A$3.A.A.B7.3A10.3A4.3A9.3A4.3A4.6A9.3A..3A6.3A..3A..3A9.3A7. #L AA.AA8.AA$A.6A8.A12.A6.A11.A6.A6.A..A11.A.AA.A8.A.AA.A.AA.A9.AA.AA5.AA #L .A.AA7.A$BAA..A.A8.A12.A6.A11.A6.A6.A..A11.A.AA.A8.A.AA.A.AA.A8.AA.A. #L AA5.AA.A.AA6.A$C.BA.CB8.3A10.3A4.3A9.3A4.3A4.6A9.3A..3A6.3A..3A..3A6. #L AA.A.AA7.AA.AA7.AA$16.A12.A6.A11.A6.A6.A..A11.A4.A8.A4.A4.A8.AA.AA9.3A #L 8.A$111.3A11.A9.A$112.A21.3A$135.A16$37.A$36.3A15.A..A$37.A15.6A$37.A #L 16.A..A$36.3A15.A..A$37.A15.6A$37.A16.A..A49.CB$36.3A15.A..A49.A.A25.A #L $37.A15.6A47.3A25.3A$4.CB31.A16.A..A12.A..A..A..A..A24.A27.A$6.C29.3A #L 15.A..A11.15A51.A$3.A.A.B29.A15.6A11.A..A..A..A..A35.A.C14.AA$A.6A29.A #L 16.A..A12.A..A..A..A..A34.3AB14.A$BAA..A.A15.A12.3A15.A..A11.15A34.A.A #L 14.A$C.BA.CB15.3A12.A15.6A11.A..A..A..A..A52.AA$23.A13.A16.A..A77.A$ #L 23.A12.3A96.A$22.3A12.A96.3A$23.A13.A97.A$23.A12.3A$22.3A12.A$23.A13.A #L $23.A12.3A$22.3A12.A$23.A$$105.AB$105.A.C11.C$104.3A11.B.A$105.A12.4A$ #L 120.A golly-3.3-src/Patterns/Generations/Sawfish.rle0000644000175000017500000000115412026730263016403 00000000000000#C The most spectacular of several naturally occuring puffer engines #C found by Tony Smith during the first day of running Generations #C 3458/37/4, a previously neglected rule with several other #C surprises. While moving laterally at c/2, the sawfish puffer engine #C alternates left-right with period 40*2, forming 5 blocks and a #C period 250 switch engine which moves away diagonally 2 cells per #C half cycle, each switch engine phase being repeated 1016 cells back #C and 16 cells further away from the stable core axis. x = 8, y = 10, rule = 3458/37/4 4.CA$4.B3A$.B3.C2A$C7A$.2ACA$4.A$3.C4A$3.B.C2A$4.B3A$4.CA! golly-3.3-src/Patterns/Generations/Transers.mcl0000755000175000017500000000037412026730263016577 00000000000000#MCell 2.0 #GAME Generations #RULE 345/26/5 #BOARD 200x200 #SPEED 10 #WRAP 1 #CCOLORS 5 #D Transers rule by John Elliott #D #D The original pattern by John Elliott #D #D Slightly enhanced by Mirek Wojtowicz, May 1999 #L 4A$4A$.AA$.AA20$4A$4A$.AA$.AA golly-3.3-src/Patterns/Generations/Bloomerang.mcl0000755000175000017500000000037112026730263017060 00000000000000#MCell 4.00 #GAME Generations #RULE 234/34678/24 #BOARD 80x80 #WRAP 1 #D Bloomerang #D #D A wave rule that rebounds into a kinder, gentler form #D of kaleidoscopics - rounded, soft, full, and slow. #D #D John Elliott, July 2000 #L 5A$5A$5A$5A$5A golly-3.3-src/Patterns/Generations/Delta.rle0000644000175000017500000000134512026730263016032 00000000000000#C Generations 345/3/6 was noted and named "LivingOnTheEdge" by Mirek Wojtowicz in 2000. #C There is no evidence of this rule being explored in depth before Golly 2.0. #C This puffer head was found by Tony Smith in 2008 at iteration 191601 from a simple seed. #C "Delta" demonstrates how 345/3/6 bridges the border of order--edge of chaos. #C Stabilisation lengthens behind the puffer head at roughly half its c/2 forward speed. #C Mechanisms in the head show period doubling 2 to 8 then multiply by 7 before doubling more. #C Look for the illusion of space ships entering muck then re-emerging on time and on course. x = 13, y = 10, rule = 345/3/6 8.DB$7.EC3A$.ED2A.A2.DB2A$DC.AB7A$AB.A.A.A.A$2A.B.A.A.A$2A.AC7A$2.EBA .A2.DB2A$7.EC3A$8.DB! golly-3.3-src/Patterns/Generations/Nova.mcl0000755000175000017500000000046012026730263015675 00000000000000#MCell 2.0 #GAME Generations #RULE 45678/2478/25 #BOARD 300x300 #SPEED 10 #WRAP 0 #D "Nova" rule by Mirek Wojtowicz #D #D June 1999 #L 14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$ #L 14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$ #L 14A$14A$14A$14A$14A$14A golly-3.3-src/Patterns/Generations/Caterpillars.mcl0000755000175000017500000000100612026730263017414 00000000000000#MCell 2.0 #GAME Generations #RULE 124567/378/4 #BOARD 300x300 #SPEED 50 #WRAP 1 #D "Caterpillars" rule by Mirek Wojtowicz #D #D June 1999 #L 51.AB$51.3AC$51.3AC$51.AB5$51.AB.B$51.5AC$51.5AC$51.AB.B5$51.AB.B.AC$ #L 51.7AB$51.7AB$51.AB.B.AC10$52.AA$54.AA$$54.A.AA7$54.A$53.A$52.A$51.A.A #L $51.A.A$52.A$53.A$54.A8$52.3A$51.A9$54.A$53.A$52.A$51.A.A$51.A.A$52.A #L 8$51.A$51.A$51.A$51.A8$66.A$..BA46.AB14.A$C3A46.3AC12.A$C3A46.3AC12.A$ #L ..BA46.AB14.A$66.A$66.A$66.A$66.A$$3.BA45.AB$.C3A45.3AC$.C3A45.3AC$3.B #L A45.AB golly-3.3-src/Patterns/Generations/SediMental.mcl0000755000175000017500000001572012026730263017024 00000000000000#MCell 2.20 #GAME Generations #RULE 45678/25678/4 #BOARD 220x220 #SPEED 0 #WRAP 1 #CCOLORS 4 #D "SediMental" rule. #D #D From a random seed state of 30% ones, it tends to form stable #D "islands", with active coastlines and fascinating inter-island #D "commerce". But an orbit's fate is quite sensitive to the starting percentage. #D Below 25% or so the world remains sparsely Brain-like, whereas somewhere #D above 30% the islands begin to accrete into larger "landmasses", so that by #D 40% you nearly always end up with a single huge "continent". #D #D As for simple seeds, they often lead to surprising results. And the rule #D clearly has great potential from the "engineering" standpoint. #D #D John Elliott, November 1999 #L .A..A..AA.A11.A4.A3.AA.A10.A3.A.AA5.A..AA4.AA10.A7.A..AA.A.A$A3.AA..A #L 3.A.A3.3A16.A..A6.AA3.A4.AA.A4.3A3.A5.A12.AA5.AA$A.A..3A4.AA..A.A..A7. #L A.AA3.AA.AA8.A..A.5A.A.A3.A7.AA19.A$AA..A..A4.AA.AA.AA..AA5.AA..A4.A.A #L .A..5A4.A..A..A3.A..A.A3.3A3.A3.A..A$..A.A3.A..A8.A9.AA..A.A..AA3.A3. #L AA..A6.A..AA7.A..AA..A4.A.A7.3A$4.A.AA.A4.A.A.A11.A.AA..A3.3A3.A3.5A.. #L A..A.A7.AA4.A3.A.A3.A..A6.AA$..A8.A4.A.A7.A4.3A4.A.A..A16.3A.A.AA4.A.. #L A4.A..A..AA..A..A..A.A$7.A5.A5.A3.A3.A6.AA9.AA8.A6.A.A3.A..A.A.A..A7.A #L ..AA6.AA$.A6.AA3.AA..AA.AA..A..A..A18.A4.A..A6.A..AA.A.AA.A..5A3.AA9.A #L $.A3.AA4.A6.AA.A..3A4.A5.A..A.A.A..A3.A5.A11.A.A3.AA3.A8.A..AA$4.A..AA #L 3.AA4.A5.A.A.4A7.A.A7.A.A10.4A5.5A.AA.A.A3.A.AA6.A$A.4A3.A..A.4A3.A6.A #L 3.A3.A..A4.A.AA..A8.AA9.AA.AA6.A11.A$A5.A3.5A.A5.A6.3A.A5.A5.A.A..A.A #L 3.A.A.A.A.AA.A..A7.A..3A6.AA..A$.3A.A.AA..A3.A..AA.4A4.4A.AA3.A.A.A.A #L 9.A..A5.AA..A3.A4.A.A5.AA6.A..AA$.A..A.AA.5A.A..AA3.5A.A..A.AA3.4A6.A #L 3.A.A.8A5.AA.5A.4A4.A.A.A.4A.A$..A..A..AA.A11.A4.A3.AA.A10.A3.A.AA5.A #L ..AA4.AA10.A7.A..AA.A.A$AA3.AA..A3.A.A3.3A16.A..A6.AA3.A4.AA.A4.3A3.A #L 5.A12.AA5.AA$.A.A..3A4.AA..A4.A9.AA3.AA.AA8.A..A.5A.A.A3.A7.AA19.A$.AA #L ..A..A4.AA.AA..A..AA3.A..A..A4.A.A.A..5A4.A..A..A3.A..A.A3.3A3.A3.A..A #L $A..A.A3.A..A4.A3.A9.AA..A.A..AA3.A3.AA..A6.A..AA7.A..AA..A4.A.A7.3A$ #L 3.A.A.AA.A4.A.3A11.A.AA..A3.3A3.A3.5A..A..A.A7.AA4.A3.A.A3.A..A6.AA$A. #L AA8.A4.3A7.A4.3A4.A.A..A16.3A.A.AA4.A..A4.A..A..AA..A..A..A.A$3.A4.A5. #L A5.A3.A3.A6.AA9.AA8.A6.A.A3.A..A.A.A..A7.A..AA6.AA$.AA6.AA3.AA..AA.AA #L ..A..A..A18.A4.A..A6.A..AA.A.AA.A..5A3.AA9.A$..A3.AA4.A6.A..A..3A4.A5. #L A..A.A.A..A3.A5.A11.A.A3.AA3.A8.A..AA$..A..A..AA3.AA4.A.A3.A.A.4A7.A.A #L 7.A.A6.A3.4A5.5A.AA.A.A3.A.AA6.A$.AA.3A3.A..A.4A3.A6.A3.A3.A..A4.A.AA #L ..A8.AA9.AA.AA6.A11.A$.AA4.A3.5A.A5.A6.3A.A5.A5.A.A..A.A3.A.A.A.A.AA.A #L ..A7.A..3A6.AA..A$4.A.A.A3.A3.A..A..4A4.4A.AA3.A.A.A.A4.A.A..A..A5.AA #L ..A3.A4.A.A5.AA6.A..AA$7.AA.A..A5.A4.AA..A4.A6.A.AA6.AA7.3A.AA7.A4.A.. #L A..A4.A5.3A$..A..A5.AA.A.A7.A.AA..A..A.AA4.A12.A.A.AA..AA.A5.A..3A.A.. #L AA7.A.A..3A.A$..A..A3.A3.A5.A..A3.A..A4.A6.AA3.A6.AA..A.A3.A4.A5.A..A #L ..A8.A$3.A7.A.AA7.A.A.4A..A3.A.A.AA3.A.A4.3A3.A3.A..A3.A.A..A.A3.A5.A. #L 3A.A3.AA.A$.A..A..A..A..A3.A4.3A.AA3.A7.A3.AA.A6.A.A..A5.AA13.A5.A.A.A #L .A..A.A.AA$8.A4.A5.A.A8.A4.A7.A7.A.A3.A3.A..A.A.A.A.A.AA6.AA3.A..A.A4. #L A.A$3.A5.A10.AA..A9.A5.A7.A.A.A3.A.A.A4.A3.8A.A5.A4.A..A.AA..A$.3A6.A. #L A.AA8.A7.A..AA..A3.A4.A.A..A.A.AA.AA17.A3.A..A..3A4.A$4.4A.A.A.4A..A3. #L 3A.AA.A..A5.A..A4.A..A.A..A..3A.A10.AA..AA4.A.A.A.AA.AA.A..A$..3A4.A3. #L A..4A4.A3.A6.A.A11.A..AA6.A9.A3.A.A7.A3.AA.AA$9.AA..A.A6.A4.A.A3.A4.A. #L 4A3.A3.A3.AA7.A.AA4.A.4A..AA.A.A5.A6.A$.A6.AA8.AA7.AA.A.A3.A.AA.A3.A.. #L A..A.AA5.A3.A.AA.3A5.A8.AA..A.A..AA..A$.AA6.A..A3.A4.A..A6.A..A.AA3.A #L 4.A5.A..A3.A..AA.A4.3A..A.A7.AA..AA.4A..A$6.AA6.A..AA4.A6.A6.A..A7.A.A #L .A..3A..A4.A.A4.A8.A4.3A3.A.A4.A$.A..A..A.3A..A..A7.A5.A6.A..A.A8.A..A #L 16.AA5.A..A..A.A3.A.3A..AA$3.A.A6.A..A5.3A4.A4.A..A.A.A3.A.A.A.A6.A.A. #L A6.A.A..AA8.4A.A.A5.AA$8.A9.A8.A.A.A..A7.A..A.A4.A4.A8.A..3A5.AA..A..A #L .AA..A.A.AA3.A$4.A3.A4.AA..A3.4A..5A..A.A4.A3.A8.A.AA4.A3.A..A.AA..AA #L 7.A3.A..AA5.A$..A..AA..AA5.AA5.AA4.A6.A.A4.A.3A5.AA..A.AA9.A4.3A.A.A6. #L A.A.A4.A$3.A11.A.A.A3.A..A..AA5.A10.A.A.AA..A..4A..AA.AA.AA6.AA6.A5.A #L ..A..A$7.A..4A.AA6.A..A.A3.A.A4.A.A.AA.A6.A9.AA.A..A..A.A5.A3.A$..A..A #L 7.A.A.A.A..A..A..A5.A..A9.A6.A10.AA4.A.A.A6.A5.A.A..A..A.A$.A.A4.3A.A #L 5.A4.A9.AA5.A7.6A6.A8.A5.A4.5A..A6.A.A.A$.AA.A.A.A7.AA..A.A5.A.A.AA.. #L AA4.A..AA4.A4.A..AA..A6.A.A7.A.A.A6.A.A5.A$7.AA.AA.AA..A..AA3.A.A..AA #L 9.A3.A4.A..AA..A4.A.A..A..A.A.A6.3A7.3A.A.A$..A..A3.AA.A6.A6.A4.A3.A.. #L A.AA.A.A3.A4.AA5.A..AA3.A5.A.A..A5.A.A3.A4.AA$..A.A3.3A5.A.A7.A3.AA..A #L 3.A5.A.A3.A.AA11.AA..AA..A3.AA..A..AA3.A..A5.A$.A..A.A4.A10.3A.A4.A.A #L 9.A5.A4.A.AA.A.A.A5.AA.A.AA12.A5.AA..AA$.A..A.A.A..AA4.A.AA4.A4.AA.4A #L 6.A..AA.A4.A..A..A3.3A6.A..AA..A.A..A.A10.AA$.A.A.AA..A3.3A4.A12.A..A #L 4.A.A..A..AA6.A..AA.A..AA.A..A3.A7.5A..A.A.A.A.A$9.3A..A7.A3.A3.A.A.A. #L AA.3A..A..A3.A.A.A.A..4A.A.A11.A..A7.A4.A3.A$7.AA.AA9.A.A3.AA..A..3A.A #L .A5.A5.AA.A5.A3.A10.A9.A.AA7.A$5.A.A14.A11.A..AA.A.AA3.A..A4.A..3A3.A #L 3.A9.3A..AA..A..A$7.AA.AA8.A4.A8.A..AA.A3.AA..A5.A3.A3.A.A.A4.A4.A3.AA #L 5.3A.A.A..AA$3.A5.A.AA..A.A12.AA21.A10.AA..A..A6.AA6.AA.AA..A.A.A$3.A #L 9.A4.A.A.A3.A3.A..A4.A4.3A7.A6.AA.AA10.A3.A4.3A..A.AA.A$5.A.A5.A..A.A #L 13.AA..A5.AA3.A8.A..A..A.AA5.A3.A11.A.A7.3A$..AA..5A..A6.A12.A4.A7.A3. #L A.A7.A6.AA6.A8.A..A.AA7.AA$4.AA4.AA9.A..A6.A6.A..AA.AA..A3.AA5.A5.A8.A #L .A.A.A3.A.AA3.AA.A..A$3.A.AA8.A4.A4.5A3.A3.3A6.A..A.A.A.3A.A.A.A..A.. #L 3A3.A5.A.AA5.A3.AA.AA$3.A6.3A..A..A..A..A.A.A..A5.A4.A..AA3.AA..AA..A #L 7.3A.AA4.A.A..AA.A..A.A..A..AA.A$5.A..3A.A.A.3A7.3A.A14.5A6.AA.A..A10. #L A..A.3A..A5.A..AA..A..A$.AA3.A4.AA..A.A.A3.A3.A..AA15.3A5.A..AA.AA3.AA #L .A..AA.A8.A6.A6.AA$3.A3.AA..AA.A4.AA5.A.A.AA.A5.A.4A..A3.3A4.A4.3A6.AA #L .AA..3A.A.A..A4.A$.A4.A11.A.3A..AA4.A..A6.A4.AA7.A.A.4A4.A.AA3.A5.A.. #L 3A7.3A3.A$7.A.AA.A3.A..A..A5.A..3A.A12.AA..AA9.AA8.A4.A..A..A.AA6.3A.A #L $3.A6.A4.A3.A4.A4.AA..A6.A..A..AA3.A.A.A..AA..A3.AA3.A.A4.AA4.A.AA.A.. #L A..A..A$3.A6.A.A..A..AA..AA.AA..A.5A.A.A6.A.A.A..A6.A.3A6.3A.4A.3A.A3. #L A..A3.A3.A$3.A..AA..A12.3A3.A..3A..A..A5.4A7.AA.AA.A..A5.AA.AA3.A11.AA #L ..A..A$3.AA.A.A3.A.A9.A6.A3.A4.AA5.A.A5.A3.A.A8.AA.4A..A4.A3.A.AA3.A$ #L 3.A.AA7.A7.A.AA4.A3.A3.AA8.A.AA7.A.AA5.AA.A..3A.A3.AA.A..A6.AA.AA$.AA #L 7.A.A.A.A5.3A..AA.AA3.A3.3A.A10.AA..A5.A3.5A.A3.AA6.A..5A3.A.A$4.A.A5. #L A..AA..AA3.A6.4A4.A8.A.AA.A.A..A.A..A3.A..AA5.3A6.A..A.A5.A.A$7.A4.A5. #L A4.A.A.A.AA.A.A5.A4.A..A.7A5.A3.AA4.A4.A3.A.3A3.AA.AA..A.AA$.A..AA.AA #L 7.A5.AA..A5.A.A..A.A6.4A.A4.A.AA4.A.A..A.A.A10.A.AA4.A4.A$5.A.AA4.A..A #L .A.AA4.A..AA.A5.A6.3A.7A..3A4.A..A6.A4.3A..A4.A$.AA4.A..A..AA..A.A5.A #L 4.3A3.3A.A..A4.A.A3.A5.A4.A.AA4.A..A5.A.A3.AA..3A.A$.A3.A3.A.A8.3A.A3. #L A.A20.A3.AA17.A..A..A6.4A.A3.AA.A$5.4A3.AA6.A.A..A6.A.AA.4A3.3A.A3.3A #L 13.A5.A5.A6.AA.A.AA3.A$3.AA.A..AA.A4.A8.AA3.A9.A3.A..A..A4.A5.3A5.A4.A #L ..A14.A4.A$.AA.3A.A6.A3.A6.AA4.A..AA.A4.A.A3.3A..4A.A3.AA6.A3.A7.3A.A #L ..AA5.A$.AA.A6.A5.AA5.AA5.5A.A3.AA5.A6.A4.A4.A.3A4.A.AA15.A.A$4.A.AA3. #L A3.A..A5.A5.AA4.A..A..A..A..A12.A.A3.3A7.A3.A.A.AA3.AA.3A..A$.AA.3A8.A #L .A.AA3.A8.A.A3.A..A.A..A..A.A..AA..A.A4.A..A3.A..A.A6.A..A..A3.A3.A$7. #L A8.A..3A..A6.3A4.A3.3A15.AA.4A.A.A.A..AA.A..A..A.AA6.A golly-3.3-src/Patterns/Generations/Fireworks.mcl0000755000175000017500000000031012026730263016737 00000000000000#MCell 2.0 #GAME Generations #RULE 2/13/21 #BOARD 200x200 #SPEED 0 #WRAP 0 #D Fireworks #D An admirably beautiful rule by John Elliott #D #D Sample starting pattern. #L 88.A6$A58$61.A24$107.A11$37.A golly-3.3-src/Patterns/Generations/Lava.mcl0000755000175000017500000000555412026730263015666 00000000000000#MCell 2.0 #GAME Generations #RULE 12345/45678/8 #BOARD 300x300 #SPEED 0 #WRAP 1 #CCOLORS 8 #D Lava rule by Mirek Wojtowicz #D #D June 1999 #L A115.64A7.26A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A #L 115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A #L $A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A #L 24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A5.13A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A #L 62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A #L 62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.26A5.13A$A55.A59.A62.A$A55.A59.A62.A$A55.A59.A62.A #L $A55.A59.A62.A$A55.A59.A62.A$A55.A59.A62.A7.48A$A55.A59.A62.A7.A46.A$A #L 55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59. #L A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7. #L A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A #L 55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59. #L A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7. #L A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A #L 7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A #L 62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A #L 115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A #L $A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A #L 46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A #L 7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A #L 62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.48A$A115.A62.A$A41.57A17.A #L 62.A$A115.A62.A$A115.A62.A$A115.A62.A$A115.A62.A$A115.A62.A7.55A$A115. #L A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A #L 7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A #L 62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A #L 7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A #L 62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$72A44.64A7. #L 55A golly-3.3-src/Patterns/Generations/Ebb-and-Flow.mcl0000755000175000017500000000114212026730263017125 00000000000000#MCell 2.0 #GAME Generations #RULE 012478/36/18 #BOARD 300x300 #SPEED 10 #WRAP 0 #CCOLORS 18 #D Ebb&Flow #D #D A slow exploding rule with interesting internal dynamics #D within the growth boundaries. Different types of symmetries will #D often determine whether a pattern grows indefinitely or dies out. #D Presents challenging engineering problems. #D #D Best viewed with MCell standard/default color palette #D at speeds of 10 or slower. #D #D Michael Sweney, October 1999 #L 12A$A..6A..A$A.8A.A$3A.4A.3A$3A.4A.3A$A.8A.A$A.3A..3A.A$A.3A..3A.A$A. #L 3A..3A.A$A.8A.A$3A.4A.3A$3A.4A.3A$A.8A.A$A..6A..A$12A golly-3.3-src/Patterns/Generations/Perfect-spiral.mcl0000755000175000017500000000032012026730263017645 00000000000000#MCell 2.0 #GAME Generations #RULE 2/234/5 #BOARD 200x200 #SPEED 50 #WRAP 0 #D "Spirals" rule collection #D #D Perfect spiral construction #D #D Discovered by Mirek Wojtowicz, June 1999 #L .D$.AAD$.3A$DAAD golly-3.3-src/Patterns/Generations/What-a-mess.mcl0000755000175000017500000000056212026730263017063 00000000000000#MCell 2.0 #GAME Generations #RULE /2/3 #BOARD 800x300 #SPEED 10 #WRAP 0 #CCOLORS 3 #D Interesting puffer causing a lot of mess... #D #D Mirek Wojtowicz, June 1999 #L ..AB7.BA$.B.A4.BA.BA$..AAB..AA.BA$3.B.A.AB$..BB.B..BA$BB6.AA$3A.BB..BA #L $3.BB..AB$4.A5.BA$ABBA7.BA$ABBA7.BA$4.A5.BA$3.BB..AB$3A.BB..BA$BB6.AA$ #L ..BB.B..BA$3.B.A.AB$..AAB..AA.BA$.B.A4.BA.BA$..AB7.BA golly-3.3-src/Patterns/Life-Like/0000755000175000017500000000000013543257426013647 500000000000000golly-3.3-src/Patterns/Life-Like/Morley/0000755000175000017500000000000013543257426015116 500000000000000golly-3.3-src/Patterns/Life-Like/Morley/breeder2.rle0000644000175000017500000001075112026730263017226 00000000000000#C An unusual breeder. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 337, y = 95, rule = S245/B368 161boo$160b4o10boo$161bobbo8b4o$161bo3bo6bobbo$100boo62bo6bo3bo$99b4o 49boo9bo8bo62boo$100bobbo10boo35b4o6bob3o7bo9boo49b4o$100bo3bo8b4o33bo bbo6boobo7b3obo6b4o35boo10bobbo$103bo8bobbo33bo3bo7boo10boboo6bobbo33b 4o8bo3bo$91boo9bo8bo3bo34bo8boobboo9boo7bo3bo33bobbo8bo$53boo35b4o6bob 3o7bo38bo8b4o8boobboo8bo34bo3bo8bo9boo$52b4o33bobbo6boobo10bo9boo24b3o bo5bo4bo8b4o8bo38bo7b3obo6b4o35boo$51bobbo33bo3bo7boo9b3obo6b4o25boboo 6boo9bo4bo5bob3o24boo9bo10boboo6bobbo33b4o$50bo3bo34bo8boobboo9boboo6b obbo25boo6b4o10boo6boobo25b4o6bob3o9boo7bo3bo33bobbo$51bo38bo8b4o11boo 7bo3bo22boobboo17b4o6boo25bobbo6boobo9boobboo8bo34bo3bo$52bo9boo24b3ob o5bo4bo8boobboo8bo24b4o26boobboo22bo3bo7boo11b4o8bo38bo$50b3obo6b4o25b oboo6boo11b4o8bo24bo4bo26b4o24bo8boobboo8bo4bo5bob3o24boo9bo$52boboo6b obbo25boo6b4o9bo4bo5bob3o24boo6bobbo17bo4bo24bo8b4o11boo6boobo25b4o6bo b3o$53boo7bo3bo22boobboo19boo6boobo25b4o6boo10bobbo6boo24b3obo5bo4bo9b 4o6boo25bobbo6boobo$51boobboo8bo24b4o19b4o6boo36boo11boo6b4o25boboo6b oo19boobboo22bo3bo7boo$52b4o8bo24bo4bo4b4o18boobboo47boo36boo6b4o19b4o 24bo8boobboo$51bo4bo5bob3o24boo7boo20b4o84boobboo18b4o4bo4bo24bo8b4o$ 53boo6boobo25b4o27bo4bo24bobbo56b4o20boo7boo24b3obo5bo4bo$52b4o6boo36b oo11bobbo6boo18boo7boo28bobbo24bo4bo27b4o25boboo6boo$60boobboo48boo6b 4o16b4o6boo29boo7boo18boo6bobbo11boo36boo6b4o$61b4o25b4o20boo25bobbo 38boo6b4o16b4o6boo48boobboo$52b4o4bo4bo25boo47bo3bo47bobbo25boo20b4o 25b4o$53boo7boo18boo57bo50bo3bo47boo25bo4bo4b4o$61b4o16b4o6boo7boo20bo bbo16bo52bo57boo18boo7boo$53boo25bobbo16boo21boo7boo6b3obo49bo16bobbo 20boo7boo6b4o16b4o$79bo3bo39boo6b4o7boboo46bob3o6boo7boo21boo16bobbo 25boo$61b4o15bo51bobbo7boo46boobo7b4o6boo39bo3bo$62boo17bo50bo3bo4boo bboo45boo7bobbo51bo15b4o$71boo6b3obo51bo6b4o44boobboo4bo3bo50bo17boo$ 53boo7boo6b4o7boboo49bo6bo4bo44b4o6bo51bob3o6boo$53boo16bobbo7boo9bo 38bob3o6boo45bo4bo6bo49boobo7b4o6boo7boo$71bo3bo4boobboo5bo39boobo7b4o 46boo6b3obo38bo9boo7bobbo16boo$74bo6b4o5b3o39boo57b4o7boboo39bo5boobb oo4bo3bo$73bo6bo4bo5boo37boobboo67boo39b3o5b4o6bo$3bobbo64bob3o6boo5bo bobo37b4o66boobboo37boo5bo4bo6bo$bbobobobbobo58boobo7b4o3bob5o35bo4bo 6bobbo56b4o37bobobo5boo6b3obo64bobbo$bo3b3oboobbobbo44bo9boo16boobbo 38boo9boo46bobbo6bo4bo35b5obo3b4o7boboo58bobobbobobo$oo6boboboobboobo 4boo37bo5boobboo15bo40b4o8boo47boo9boo38bobboo16boo9bo44bobbobboob3o3b o$4obb3oboboobboobo4boo36b3o5b4o7b4o107boo8b4o40bo15boobboo5bo37boo4bo boobboobobo6boo$bo5boboobbobbo45boo5bo4bo7boo168b4o7b4o5b3o36boo4boboo bboobob3obb4o$9bobo49bobobo5boo180boo7bo4bo5boo45bobbobboobo5bo$60b5ob o3b4o8boo47bobbo129boo5bobobo49bobo$61bobboo66boo68bobbo47boo8b4o3bob 5o$64bo67boo69boo66boobbo$14bobo19bo33b4o129boo67bo$6bo5boboobbobbo9bo 3b3o33boo190b4o33bo19bobo$5b4obb3oboboobboobo8boobo45boo180boo33b3o3bo 9bobbobboobo5bo$5boo6boboboobboobo7b5o34boo9boo169boo45boboo8boboobboo bob3obb4o$6bo3b3oboobbobbo11bobb3o214boo9boo34b5o7boboobboobobo6boo$7b obobobbobo18bobo260b3obbo11bobbobboob3o3bo$8bobbo24bo262bobo18bobobbob obo$142boo156bo24bobbo$71boo68bob3o47boo$32bobo36boo66bo4bo46b3obo68b oo$24bo5boboobbobbo17bobboo78boobbo47bo4bo66boo36bobo$23b4obb3oboboobb oobo4boo8b3obo76bob4o48bobboo78boobbo17bobbobboobo5bo$23boo6boboboobb oobo4boo8boobboo16b6o52boboo4bo47b4obo76bob3o8boo4boboobboobob3obb4o$ 24bo3b3oboobbobbo17boboboo16bobboo52bob6o47bo4boobo52b6o16boobboo8boo 4boboobboobobo6boo$25bobobobbobo22bobobo17b3obo53b3obboo49b6obo52boobb o16boobobo17bobbobboob3o3bo$26bobbo27b5o14boboo4bo51b4o53boobb3o53bob 3o17bobobo22bobobbobobo$60bobo13boob6o45boo5boo58b4o51bo4boobo14b5o27b obbo$61bo16bobboo47boo66boo5boo45b6oboo13bobo$60booboo11bo53boboo71boo 47boobbo16bo$32bobbo28bo10boo53b4o69boobo53bo11booboo$31bobobobbobo28b 3o131b4o53boo10bo28bobbo$30bo3b3oboobbobbo24boo193b3o28bobobbobobo$29b oo6boboboobboobo4boo16bo193boo24bobbobboob3o3bo$29b4obb3oboboobboobo4b oo10b3o197bo16boo4boboobboobobo6boo$30bo5boboobbobbo19boo202b3o10boo4b oboobboobob3obb4o$38bobo24bo204boo19bobbobboobo5bo$271bo24bobo$$14bobb o24bo$13bobobobbobo18bobo250bo24bobbo$12bo3b3oboobbobbo11bobb3o248bobo 18bobobbobobo$11boo6boboboobboobo7b5o249b3obbo11bobbobboob3o3bo$11b4o bb3oboboobboobo8boobo251b5o7boboobboobobo6boo$12bo5boboobbobbo9bo3b3o 250boboo8boboobboobob3obb4o$20bobo19bo250b3o3bo9bobbobboobo5bo$294bo 19bobo3$15bobo$7bo5boboobbobbo296bobo$6b4obb3oboboobboobo4boo282bobbo bboobo5bo$6boo6boboboobboobo4boo273boo4boboobboobob3obb4o$7bo3b3oboobb obbo282boo4boboobboobobo6boo$8bobobobbobo296bobbobboob3o3bo$9bobbo306b obobbobobo$324bobbo! golly-3.3-src/Patterns/Life-Like/Morley/growing-ship.rle0000644000175000017500000000552412026730263020153 00000000000000#C A growing ship. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 196, y = 247, rule = B368/S245 66boo60boo$25b4o36b4o58b4o36b4o$26boo38bobbo56bobbo38boo$24boobo38bo3b o54bo3bo38boboo$16boo5boo44bo5b4o38b4o5bo44boo5boo$15b4o5bo43bo7boo40b oo7bo43bo5b4o$7boo7bobbo3bobbo39bob3o3boobo6b4o3boo10boo3b4o6boboo3b3o bo39bobbo3bobbo7boo$4obb4o6bo3bo3bobboo36boobo4boo10boo3b4o8b4o3boo10b oo4boboo36boobbo3bo3bo6b4obb4o$boobbobbo10bo6boo38boo6bo10bobobobbo10b obbobobo10bo6boo38boo6bo10bobbobboo$bobo4bo4boo3bo5boboobo34boobboo3bo bbob4obboo6bo10bo6boobb4obobbo3boobboo34boboobo5bo3boo4bo4bobo$9boboo bboob3o3b6o35b4o5bo3bobbobobo24bobobobbo3bo5b4o35b6o3b3oboobboobo$7bo 3boobboobo6bobbo28boo5bo4bo3boo10bo24bo10boo3bo4bo5boo28bobbo6boboobb oo3bo$9bo8bobo13b4o11boo5b4o6boo7bo44bo7boo6b4o5boo11b4o13bobo8bo$18bo 7boo7boo5b4obb4o5bobbo4b4o6bo44bo6b4o4bobbo5b4obb4o5boo7boo7bo$17b3o5b 4o4boobo6boo4bobbo3bo4bo13bo44bo13bo4bo3bobbo4boo6boboo4b4o5b3o$17bobo 6boo3boobobbo3boobo4bo3bobbobob3o10bo3bo40bo3bo10b3obobobbo3bo4boboo3b obboboo3boo6bobo$16bo3bo5boo4boo4boboo10bobbob3obo3b4o3bobbobbo38bobbo bbo3b4o3bob3obobbo10boobo4boo4boo5bo3bo$15booboboo4boo3bo3booboboboo6b oobobobo7b4o3boo3boo38boo3boo3b4o7boboboboo6booboboboo3bo3boo4booboboo $15boo3boo4boo5boobobbobobo6bo8bo5b4o4bo3bo40bo3bo4b4o5bo8bo6bobobobbo boo5boo4boo3boo$17b3o6boo9bobobo9bo3bo9b4o5b3o42b3o5b4o9bo3bo9bobobo9b oo6b3o$17b3o5bobbo37boo7bo44bo7boo37bobbo5b3o$25b4o36bobbo6bo44bo6bobb o36b4o$66boo60boo7$25boo142boo$25boo39b3o58b3o39boo$23boobo39boobo56bo boo39boboo$23b4o40b3o56b3o40b4o$68boo56boo9$28bo35boo64boo35bo$28boo 34boo64boo34boo$26b4o34boboo60boobo34b4o$27boo35b4o60b4o35boo10$62bo 70bo$30b3o28boo70boo28b3o$30boo29b4o66b4o29boo$30bo31boo68boo31bo10$ 34bo126bo$35bo22b3o74b3o22bo$32bobo24boo74boo24bobo$33bo26bo74bo26bo 10$37boo17bo82bo17boo$36bo18bo84bo18bo$35bobo18bobo78bobo18bobo$35bobb o18bo80bo18bobbo9$40bo114bo$40bo11boo88boo11bo$41bo12bo86bo12bo$37boob oo11bobo84bobo11booboo$39boo11bobbo84bobbo11boo9$50bo94bo$42b3o5bo94bo 5b3o$41boboo4bo96bo4boobo$41b3o5booboo88booboo5b3o$41boo7boo92boo7boo 9$46boo100boo$45bobbo98bobbo$46boo100boo7$49bobbo$49bobo96boo$50bo96bo bbo$51boo95boo4$60b4o$60boboo$60boo$60boo$46boo100boo$45bobbo98bobbo$ 46boo28b4o68boo$76boboo$76boo$76boo3$92b4o$92boboo$46boo44boo54boo$45b obbo43boo53bobbo$46boo100boo$$108b4o$108boboo$108boo$108boo3$46boo76b 4o20boo$45bobbo75boboo19bobbo$46boo76boo22boo$124boo3$140b4o$140boboo$ 140boo$140boo$46boo$45bobbo$46boo89bo$136bobo$139bo$138bo3$121bo$120bo bo$46boo75bo$45bobbo73bo$46boo$$105bo$104bobo$107bo$106bo3$46boo41bo$ 45bobbo39bobo$46boo43bo$90bo3$73bo$72bobo$75bo$74bo$46boo$45bobbo$46b oo9bo$56bobo$59bo$58bo3$54boo$53b3o$52boobo$52b3o3$70boo$69b3o$68boobo $68b3o3$86boo$85b3o$84boobo$84b3o3$102boo$101b3o$100boobo$100b3o3$118b oo$117b3o$116boobo$116b3o3$134boo$133b3o$132boobo12boo$132b3o12bobbo$ 148boo3$144bo$144boo$144b3o! golly-3.3-src/Patterns/Life-Like/Morley/enterprise-gun.rle0000644000175000017500000003712212026730263020504 00000000000000#C An almost-state-of-the-art enterprise gun. #C The dotted sections can be moved away from each other to create #C space for the construction of enterprise salvos. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 509, y = 559, rule = B368/S245 obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobo$$o311bo$$o145b4o162bo$132b4o10b4o$o 121boo8b4o176bo$118b3ob4o$o118bobo3bo186bo$119boo4boo$o117boo4b3o185bo $120bo3b3o$o117boo4b3o71b4o110bo$119boo4boo71b4o10b4o$o118bobo3bo86b4o 96bo$118b3ob4o96b4o3bo$o121boo98b3o3boo82bo$198boo20b3obob3o$o196bobbo 11boo6b3obo3boo82bo$198boo11bobbo4b4o4bo$o196bobbo11boo6b3obo3boo82bo$ 197bobbo10bobbo5b3obob3o$o196bobbo10bobbo7b3o3boo82bo$197bobbo10bobbo 7b4o3bo$o196bobbo10bobbo97bo$197bobbo10bobbo$o196bobbo10bobbo97bo$198b oo11bobbo$o197boo12boo98bo$198boo12boo$o196bobbo11boo98bo$211bobbo$o 311bo$$o311bo$$o145bo4bo160bo$132bo4bo8b6o$o131b6o10boo162bo$134boo$o 311bo$$o311bo$197b4o$o196b4o10b4o97bo$211b4o$o311bo$$o311bo$124boo$o 123boo186bo$124boo$o123boo186bo$$o311bo$$o311bo$222boo$o221boo88bo$ 222boo$o221boo88bo$$o311bo$$o311bo$$o311bo$147bo$o133b4o7b5o162bo$134b 4o7b5o$o142b9o160bo$143boo5boo$o142b4ob4o160bo$143bo7bo$o144bo3bo162bo $145bobobo$o143b3ob3o59b4o98bo$143booboboboo46b5o7b4o$o195b9o107bo$ 196bobb3obbo$o194boo7boo72b4o30bo$125boo68boo7boo72b4o10b4o$o124boo70b o5bo88b4o16bo$125boo69bobobobobo97b4o3bo$o124boo69b4ob4o97b3o3boobbo$ 196bobbobobbo95b3obob3o$o299b3obo3boobbo$299b4o4bo$o299b3obo3boobbo$ 300b3obob3o$o220boo79b3o3boobbo$219b6o77b4o3bo$o219bobbo88bo$$o218b6o 87bo$219boboobo$o220boo89bo$220bobbo$o123b4o39bo3bo49boo89bo$124bobbo 39bo3bo$o121bobboobbo37bo3bo140bo$122bobboobbo$o121bo6bo182bo$125boo 93b4o53b4o$o219bobbo52boboobo9b4o17bo$121bo8bo89bobbo52b6o8boboobo$o 120boboboobobo88boboobo51b6o8b6o16bo$220bobbo54boo10b6o$o277boo12boo 18bo$292boo$o277boo32bo$278boo12boo$o125boo149bobbo11boo18bo$126boo73b 3o74boo11bobbo$o125boo73boo75boo12boo18bo$126boo73bo76boo12boo$o291boo 18bo$$o311bo$$o219boo90bo$220boo$o219boo90bo$220boo$o311bo$302boo$o 301boo8bo$302boo$o301boo8bo$$o151bobobo155bo$102bo47b4o3bo$o89bobo3boo 4boo36bo9bobooboo155bo$90bobb5ob3obbo9b4o22boo7boo4boo$o82b4o3bobb5ob 3obbo9b4o22b3o5boobo4boo154bo$83b4o3bobo3boo4boo44booboobbo$o101bo45b oobo4boo154bo$149boo4boo$o149bobooboo155bo$150b4o3bo$o151bobobo155bo$$ o311bo$$o289b4o18bo$103bo174b5o7b4o$o90bobo3boo4boo42b4o125b9o27bo$91b obb5ob3obbo9b4o28b4o125bobb3obbo$o83b4o3bobb5ob3obbo9b4o156boo7boo26bo $84b4o3bobo3boo4boo170boo7boo$o102bo173bo5bo28bo$276bobobobobo$o275b4o b4o27bo$276bobbobobbo$o56boo106bo10bobbo13boo117bo$57boo105bobobbo6bob oo13boo$o56boo71boo31bo3bobo7boboo12boo117bo$57boo29b7o35boo31bo3bobo 7boboo12boo106boo$o85boo7boo33boo32bobobbo6boboo121boo9bo$86b3o5b3o33b oo33bo10bobbo121boo$o86bobbobobbo205boo9bo$88bobobobo$o88bobobo218bo$ 87b4ob4o131b3o$o86bobbobobbo11bobbo116boo83bo$107bobo117bo$o107bo138bo 3bo60bo$109boo136bo3bo$o246bo3bo60bo$$o62bo47boo199bo$56bobboboo48b3o bboo$o53b7obbo46bobobobo195bo$54bo5bob3o9b4o32bo4boo$o42b4o7bo5bob3o9b 4o32bobbooboo194bo$43b4o7b7obbo46bo4bo185boo$o55bobboboo47bobbooboo 182b4o8bo$63bo46bo4boo183b4o$o109bobobobo183bobbo8bo$111b3obboo181b6o$ o110boo126boo58bo4bo7bo$239b3o55b10o$o238boboo55bobboobbo6bo$240b3o$o 63bo247bo$57bobboboo$o54b7obbo42b4o201bo$55bo5bob3o9b4o28b4o$o43b4o7bo 5bob3o9b4o221boo10bo$44b4o7b7obbo235boo$o56bobboboo236boo10bo$64bo235b oo$o311bo$$o137b3o12boo157bo$50b3o69boo13bo3bo11boo$o48b5o36boo30boo 12bo4bo11boo157bo$47b3o3b3o34boo30boo12bo4bo11boo$o46bobb3obbo34boo30b oo13bo3bo90bobobo75bo$46b3obbobb3o33boo46b3o48bobo3boo33b4o3bo$o46boo 5boo132boobbobbobo32bobooboo75bo$46bo9bo131b5obbobbo30boo4boo$o47boobo boo108b4o21b5obbobbo29boobo4boo74bo$46bob3ob3obo106b4o21boobbobbobo30b ooboobbo$o46bobbobobbo133bobo3boo31boobo4boo74bo$229boo4boo$o229boboob oo75bo13bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobo$230b4o3bo$o 231bobobo75bo13bo117bo$15boobo$o15bobo53bobobo235bo13bo102bobbobobbo6b o$16bobbo50b4o3bo350bob3ob3obo$o14bobobo8boo40bobooboo235bo13bo103boob oboo7bo$15booboo8boboobb4o31boo4boo113bobo3boo9boo219bo9bo$obb4o8boobo 9boboobb4o30boobo4boo111boobbobbobo7b4o17b4o81bo13bo18bo83boo5boo6bo$ 3b4o11boo8boo38booboobbo113b5obbobbo8boo17b4o115bo46boo33b3obbobb3o$o 15b5o47boobo4boo86b4o21b5obbobbo8bo103bo13bo18bo15boo30boo34bobb3obbo 6bo$16boboobo47boo4boo87b4o21boobbobbobo131boo11boobo14boo30boo34b3o3b 3o$o15b5obo47bobooboo113bobo3boo114bo13bo3boo11boobo14boo30boo36b5o8bo $17b3obo48b4o3bo252boo13bo15boo69b3o$o18boboo49bobobo188boo45bo13bo3b oo14bo97bo$20bo246bo77bo77bo$o263bo3bo4boo37bo13bo95bobo19bo$242boo16b oboobbo6boo148bobo$o209boo30boo16bo3bobobboobboo37bo13bo96bobo4bobbo 10bo$168b7o35boo30boo16bo3bobobboobboo145bobboo5boobo3b4o$o28boo36b4o 95boo7boo33boo30boo16boboobbo45bo13bo79b4o7b3obbooboobboobboobb4o3bo$ 29boboobb4o28b4o95b3o5b3o33boo52bo3bo105b4o28b4o7b3obbooboobboobboo$o 3b4o9bo11boboobb4o128bobbobobbo91bo44bo13bo47b4o42bobboo5boobo10bo$4b 4o10boo9boo137bobobobo90boo156bobo4bobbo$o17bobo148bobobo138bo13bo96bo bo18bo$21bo145b4ob4o246bobo$o18boo77b4o65bobbobobbo136bo13bo96bo20bo$ 95boob3obo$o92bobboboobobbo8boo197bo13bo45boo70bo$82boo10b3o3bobbobo7b oo252boobb3o50bo$o49boo30boo8bo5bo5b3o6boo197bo13bo41bobobobo48bobo18b o$8b7o35boo30boo8bo5bo5b3o6boo253boo4bo49bobo$o5boo7boo33boo30boo10b3o 3bobbobo52bo32boo119bo13bo40booboobbo49bobo4bobbo9bo$6b3o5b3o33boo41bo bboboobobbo53bo32b3obboo171bo4bo46bobboo5boobo3b4o$o6bobbobobbo79boob 3obo56bobo28bobobobo115bo13bo40booboobbo32b4o7b3obbooboobboobboobb4obb o$8bobobobo83b4o58boo28bo4boo171boo4bo32b4o7b3obbooboobboobboo$o8bobob o109b4o33boo28bobbooboo114bo13bo41bobobobo46bobboo5boobo9bo$7b4ob4o 107b4o32bobo28bo4bo171boobb3o50bobo4bobbo$o6bobbobobbo142bo31bobbooboo 114bo13bo45boo50bobo17bo$158bo31bo4boo226bobo$o189bobobobo115bo13bo97b o19bo$191b3obboo$o190boo119bo13bo117bo$$o311bo13bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobo$$o158bo152bo$159bo$o159bobo24b4o121bo$ 161boo24b4o$o123b4o33boo149bo$124b4o32bobo$o158bo152bo$159bo$o216boo 93bo$215bob3o$o216boo4bo9boo77bo$130b3o69boo10b5oboo3boo6boo$o128b5o 36boo30boo11bo6bobobbo5boo77bo$127b3o3b3o34boo30boo11bo6bobobbo5boo$o 126bobb3obbo34boo30boo10b5oboo3boo85bo$126b3obbobb3o33boo45boo4bo$o 126boo5boo79bob3o92bo$126bo9bo80boo$o127booboboo177bo$126bob3ob3obo$o 126bobbobobbo176bo$$o311bo$$o120bobo188bo$120bo$o114bo4bo31bobobo155bo $116bobboo4bobo22b4o3bo$o112bobbobob3o4b3o20bobooboo155bo$114bobobboob o4bobbo18boo4boo$o82b4o27bobobboobo4bobbo17boobo4boo154bo$83b4o26bobbo bob3o4b3o18booboobbo$o115bobboo4bobo20boobo4boo110bobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobo$115bo4bo28boo4boo$o119bo29bobooboo111bo43bo195bo$121bobo 26b4o3bo$o151bobobo111bo43bo180bobbobobbo6bo$492bob3ob3obo$o121bobo 143bo43bo181booboboo7bo$121bo370bo9bo$o115bo4bo146bo43bo96bo83boo5boo 6bo$117bobboo4bobo281bo46boo33b3obbobb3o$o113bobbobob3o4b3o16b4o117bo 43bo96bo15boo30boo34bobb3obbo6bo$115bobobboobo4bobbo15b4o243boo11boobo 14boo30boo34b3o3b3o$o83b4o27bobobboobo4bobbo136bo43bo81boo11boobo14boo 30boo36b5o8bo$84b4o26bobbobob3o4b3o263boo13bo15boo69b3o$o116bobboo4bob o139bo43bo81boo14bo97bo$116bo4bo287bo77bo$o120bo146bo43bo173bobo19bo$ 122bobo42boo318bobo$o168bo23boo73bo43bo174bobo4bobbo10bo$162b4obbo24b oo289bobboo5boobo3b4o$o129boo30booboboboo22boo73bo43bo157b4o7b3obboob oobboobboobb4o3bo$88b7o35boo30booboboboo22boo243b4o28b4o7b3obbooboobb oobboo$o85boo7boo33boo30b4obbo99bo43bo125b4o42bobboo5boobo10bo$86b3o5b 3o33boo37bo317bobo4bobbo$o86bobbobobbo71boo99bo43bo174bobo18bo$88bobob obo391bobo$o88bobobo174bo43bo174bo20bo$87b4ob4o$o86bobbobobbo172bo43bo 123boo70bo$431boobb3o50bo$obobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobo3bobo3bobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobo119bobobobo 48bobo18bo$432boo4bo49bobo$o231bo35bo162booboobbo49bobo4bobbo9bo$7bobb obobbo417bo4bo46bobboo5boobo3b4o$o6b4ob4o216bo35bo162booboobbo32b4o7b 3obbooboobboobboobb4obbo$9bobobo418boo4bo32b4o7b3obbooboobboobboo$o7bo bobobo217bo35bo163bobobobo46bobboo5boobo9bo$7bobbobobbo415boobb3o50bob o4bobbo$o5b3o5b3o33boo48b4o128bo35bo91boo74boo50bobo17bo$6boo7boo33boo 30boo10bobo4boobo255boo125bobo$o7b7o35boo30boo9bobobobboo3bo7boo117bo 35bo91boo126bo19bo$50boo30boo9bobobobboo3bo7boo245boo$o81boo10bobo4boo bo8boo117bo35bo239bo$13bo86b4o9boo$o17bo213bo35bo239bo$18b4o$o18b3o 210bo35bo239bo$16b4obboob3o$o3b4o7booboobo5boo203bo35bo239bo$4b4o6boob obbo7boo5b4o$o13boobobbo7boo5b4o28b4o161bo35bo239bo$15booboobo5boo38b 4o$o15b4obboob3o204bo35bo89b4o146bo$15bobob3o335boobboo$o17b4o210bo35b o88b6o145bo$18bo339bobbo$o231bo35bo239bo$72bobobo$o16bo52b4o3bo154bo 35bo239bo$17b4o49bobooboo$o13bobob3o48boo4boo155bo35bo239bo$15b4obboob 3o41boobo4boo339bo$obb4o7booboobo5boo40booboobbo156bo35bo148bo90bo$3b 4o6boobobbo7boo5b4o30boobo4boo339bo$o12boobobbo7boo5b4o31boo4boo155bo 35bo239bo$14booboobo5boo42bobooboo340bo$o14b4obboob3o43b4o3bo154bo35bo 148bo90bo$14bobob3o51bobobo340bo$o16b4o211bo35bo239bo$17bo341boo$o231b o35bo90boo147bo$359boo$o231bo35bo90boo147bo$47bobbobobbo$o45bob3ob3obo 175bo35bo239bo$48booboboo$o45bo9bo175bo35bo108bobbobobbo122bo$47boo5b oo82bo238b4ob4o$o45b3obbobb3o33boo45bobo92bo35bo51boo55bobobobobo122bo $47bobb3obbo34boo30boo14bobo179boo56bo5bo$o46b3o3b3o34boo30boo12boobo 13boo77bo35bo51boo54boo7boo5bobbo112bo$49b5o36boo30boo12boobo13boo165b oo54boo7boo5bobo$o49b3o69boo14bobo12boo77bo35bo108bobb3obbo7bo114bo$ 137bobo13boo222b9o8boo$o137bo93bo35bo50boo47b4o7b5o124bo$318bobbo46b4o $o231bo35bo49bobbo143boo41bo$318bobbo143boobo$o43b4o11boboo169bo35bo 48b6o107bobobo28bo3boboo37bo$44b4o9boobbobo11b4o238b6o106bo3b4o24b3obb obboo$o56boobbobo11b4o28b4o121bo35bo48b6o107booboobo22boobobboboboboo 35bo$59boboo44b4o206b6o107boo4boo21boboo3bobobobo$o231bo35bo48b6o106b oo4boboo20boboo3bobobobo27b4o4bo$318bobbo109bobbooboo20boobobboboboboo 27b4o$o231bo35bo49b4o107boo4boboo22b3obbobboo37bo$318b4o108boo4boo25bo 3boboo$o231bo35bo49b4o108booboobo28boobo39bo$111boo206boo108bo3b4o28b oo$o110b3obboo114bo35bo161bobobo73bo$110bobobobo$o109bo4boo115bo35bo 195boo42bo$110bobbooboo240boo104boobo$o42b4o11boboo48bo4bo116bo35bo89b oo102bo3boboo38bo$43b4o9boobbobo11b4o32bobbooboo240boo100b3obbobboo$o 55boobbobo11b4o32bo4boo115bo35bo89boo76b4o18boobobboboboboo36bo$58bob oo48bobobobo319b4o18boboo3bobobobo$o110b3obboo114bo35bo189boboo3bobobo bo27b4o5bo$111boo345boobobboboboboo27b4o$o231bo35bo191b3obbobboo38bo$ 106b3o210boo84bo56bo3boboo$o105boo124bo35bo50boo83bo59boobo40bo$106bo 212boo82b3obo56boo$o231bo35bo50boo39boo30boo10bobbo100bo$87bobbobobbo 264b3o29boo10bobo10boo4boo$o86b4ob4o128b4o4bo35bo91boboo28boo10b3o9b3o 4boo30boo51bo$89bobobo130boobo133b3o28boo10b3o9b3o4boo30boo35b7o$o87bo bobobo131boo4bo35bo68booboboboo21b4o33bobo10boo4boo30boo33boo7boo7bo$ 87bobbobobbo71bo58boo110b3ob3o22b4o10b4o19bobbo47boo33b3o5b3o$o85b3o5b 3o33boo35bo6bo57bo35bo11boo57bobobo37b4o18b3obo83bobbobobbo8bo$86boo7b oo33boo33bobo6boobo102boo57bo3bo60bo87bobobobo$o87b7o35boo32boo7boobb oo14boo37bo35bo11boo55bo7bo59bo87bobobo10bo$130boo32boo7boobboo14boo 85boo55b4ob4o145b4ob4o$o164bobo6boobo15boo37bo35bo68boo5boo145bobbobo bbo8bo$167bo6bo18boo142b9o$o99bobo64bo64bo35bo59b4o7b5o164bo$98bob4o 224b4o7b5o$o96bob3obo128bo35bo72bo166bo$93boobbooboboobo261b4o$o83b4o 5bobbobb3obboo126bo35bo10boo100b4o123bo$84b4o4b3ob6obboo9b4o159b4o$o 91b3ob6obboo9b4o28b4o81bo35bo98b4o137bo$93bobbobb3obboo41b4o125b3obb3o 80b10o7b4o$o92boobbooboboobo126bo35bo7b8o79bobo6bobo3b10o120bo$97bob3o bo173b6o81b3o4b3o3bobo6bobo$o97bob4o128bo35bo9b4o81booboobbooboo3b3o4b 3o120bo$100bobo173b3obb3o82bo4bo5booboobbooboo$o231bo35bo7b8o84boo10bo 4bo122bo$152bobobo119bob4obo98boo$o98bobo48b4o3bo74bo35bo9b4o70bo3b4o 148bo$97bob4o47bobooboo195boo3b3o7b4o$o95bob3obo36boo8boo4boo75bo35bo 84b3obob3o5b4o10b4o123bo$92boobbooboboobo34boo7boobo4boo160boo32boo3bo b3o4boobboo9b4o$o82b4o5bobbobb3obboo32boobo7booboobbo76bo35bo49boo34bo 4b4o5boo10boobboo122bo$83b4o4b3ob6obboo9b4o19b4o7boobo4boo160boo32boo 3bob3o20boo$o90b3ob6obboo9b4o31boo4boo75bo35bo49boo33b3obob3o146bo$92b obbobb3obboo45bobooboo195boo3b3o$o91boobbooboboobo45b4o3bo74bo35bo83bo 3b4o148bo$96bob3obo49bobobo209b4o$o96bob4o129bo35bo97b4o10b4o124bo$99b obo177boo99b4o$o231bo35bo10boo227bo$279boo$o231bo35bo10boo227bo$$o219b oo10bo35bo239bo$220boo$o219boo10bo35bo28bobbobobbo202bo$220boo75b4ob4o 21b4o$o231bo35bo28bobobobobo19bob4obo8b4o163bo$298bo5bo20bobobbobo6bob 4obo$o127boo102bo35bo27boo7boo18b3obb3o6bobobbobo161bo$128boo166boo7b oo19b6o7b3obb3o$o127boo71bo30bo35bo28bobb3obbo21b4o9b6o162bo$128boo71b oo94b9o35b4o$o200b3o28bo35bo19b4o7b5o204bo$288b4o$o126boo103bo35bo239b o$125b6o$o125b4o102bo35bo239bo$126bobbo$o123bobobbobo100bo35bo239bo$ 124b3obb3o89boo119bo$o122b4obb4o86boboobo7bo35bo72bobo164bo$124b3obb3o 87boobboo119bo$o123bobobbobo87boboobo7bo35bo71boboo164bo$170bo50boo 117bo$o124b6o38bobo49boo9bo35bo239bo$125b6o36booboo144boo$o125bobbo37b obboo60bo35bo43b3ob4o188bo$126bobbo39bobo141bobo3bo$o126boo41bo61bo35b o44boo4boo187bo$278boo32boo4b3o$o220boo9bo35bo9boo34bo3b3o187bo$220b4o 54boo32boo4b3o$o231bo35bo9boo33boo4boo187bo$220b4o89bobo3bo$o231bo35bo 43b3ob4o188bo$316boo8b4o$o231bo35bo19boo36b4o10b4o164bo$288boo12boo36b 4o$o231bo35bo33boo204bo$127boo158b4o$o126boo67bobbobobbo27bo35bo17bob oobo9b4o203bo$127boo67b4ob4o82b4o9boboobo$o126boo67bobobobobo27bo35bo 16bob4obo8b4o203bo$197bo5bo83b4o8bob4obo$o194boo7boo26bo35bo18b4o10b4o 203bo$195boo7boo82boo11b4o$o144bobbobobbo42bobb3obbo27bo35bo33boo204bo $145b4ob4o42b9o$o144bobobobobo44b5o7b4o18bo35bo239bo$146bo5bo57b4o$o 143boo7boo77bo35bo239bo$144boo7boo$o144bobb3obbo78bo35bo239bo$145b9o$o 135b4o7b5o80bo35bo239bo$136b4o$o231bo35bo239bo$$o231bo35bo239bo$$o231b o35bo239bo$$o231bo35bo239bo$$o231bo35bo239bo$222boo$o221boo8bo35bo3bo 3b4o228bo$222boo48boo3b3o$o221boo8bo35bo4b3obob3o226bo$272boo3bob3o$o 231bo35bo5bo4b4o225bo$126boo144boo3bob3o$o125boo104bo35bo4b3obob3o226b o$126boo144boo3b3o$o125boo104bo35bo3bo3b4o228bo$286b4o$o231bo35bo17b4o 10b4o204bo$300b4o$o231bo35bo239bo$$o210b4o17bo35bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobo$197b4o10b4o$o196b4o31bo$$o231bo$$o134bobbo93bo$136boo11bobb o$o133bo4bo10boo80bo$134b6o8bo4bo$o132bobobbobo7b6o58boo18bo$133boo4b oo6bobobbobo43boo12boo$o132bob4obo6boo4boo43boo10bo4bo16bo$136boo9bob 4obo41bo4bo7boo4boo$o149boo43boo4boo5bobbobbobbo14bo$194bobbobbobbo3bo 10bo$o192bo10bo4boobooboo15bo$195boobooboo5boobboobboo$o193boobboobboo 4boboboobobo14bo$194boboboobobo5boo4boo$o194boo4boo6bo6bo15bo$150boo 43bo6bo7boobboo$o148bo46boobboo20b4o3bobbo$149bobbo57boboobo6b3o3boo$o 147boo46boboobo9b4o5b3obob3o3bo$150bo46b4o9bo4bo4b3obo3boo$o195bo4bo 10boo5b4o4bo4bo$198boo20b3obo3boo$o119bo3b4o92b3obob3o3bo$120boo3b3o 94b3o3boo$o120b3obob3o92b4o3bobbo$120boo3bob3o82b4o$o121bo4b4o67b4o10b 4o16bo$120boo3bob3o68b4o$o120b3obob3o102bo$120boo3b3o$o119bo3b4o104bo$ 134b4o$o133b4o10b4o80bo$148b4o$o231bo$$obobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo! golly-3.3-src/Patterns/Life-Like/coral.rle0000644000175000017500000000053412026730263015363 00000000000000#C "Coral": this rule produces patterns with a surprisingly slow #C rate of expansion and an interesting coral-like texture. #C From MCell 4.20 by Mirek Wojtowicz-- rule author unknown. x = 17, y = 17, rule = B3/S45678 bb13o$b15o$bo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo 13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$b15o$3b11o! golly-3.3-src/Patterns/Life-Like/p168-knightship.rle0000644000175000017500000000014612026730263017126 00000000000000#C p168 knightship found by David Eppstein x = 7, y = 4, rule = B013568/S01 bo4bo$b2ob3o$2o3bo$2bobo! golly-3.3-src/Patterns/Life-Like/alt-wicks.lua0000644000175000017500000000331012706123635016157 00000000000000-- Based on alt_wicks.py from PLife (http://plife.sourceforge.net/). local g = golly() local gp = require "gplus" local pattern = gp.pattern g.new("alt-wicks") -- best to create empty universe before setting rule -- to avoid converting an existing pattern (slow if large) g.setrule("B3/S135") local head_a_c3 = pattern([[ 23bo6bo$5bo3b2o2bobobo4b2o2b6ob2obobo$3b2o2bo6bobobo3bob3o2b2obo2b obobo$2b2o4bobo2bo2bobobob3o4bo$4bo2bo2bo2b3obo11bo$2obo8b3ob2o2b o2b2obo$4bo2bo2bo2b3obo11bo$2b2o4bobo2bo2bobobob3o4bo$3b2o2bo6bo bobo3bob3o2b2obo2bobobo$5bo3b2o2bobobo4b2o2b6ob2obobo$23bo6bo! ]], -5, 39, gp.rccw) local tail_a_c5 = pattern([[ 5bobo$6bo$4bo3bo$5bobo$4bo3bo$o11bo$3bo5bo$2obo5bob2o$bo9bo2$2bo7b o$3bo5bo$2bo7bo!]], -6, 0) local head_b_c5 = pattern([[ 2bobo3bobo$bo3bobo3bo$2bobo3bobo$b2ob2ob2ob2o$2b3o3b3o$2b3o3b3o$3b 2o3b2o$2b4ob4o$bo9bo$4bo3bo$5bobo$2obo5bob2o$2o2bo3bo2b2o$bobo5b obo$2b2obobob2o2$6bo$2bobo3bobo$2b2o2bo2b2o$3b2o3b2o!]], -6, 0) local converter_bc_c5 = pattern([[ 6bobo$6bobo2$4b3ob3o$4bo5bo$4b2o3b2o$4bobobobo$3bo2bobo2bo$5bo3bo $4bobobobo$bo3b2ob2o3bo$2bo3bobo3bo$b2o3bobo3b2o$3bob2ob2obo$2b2o 7b2o2$4bo5bo$4bo5bo$ob2obo3bob2obo$o13bo2$3b2o5b2o$5bo3bo2$4b3ob 3o$2b5ob5o3$2bo3bobo3bo$3bobo3bobo$2bo3bobo3bo!]], -7, 0) local tail_c_c5 = pattern([[ 2bo9bo$bobobo3bobobo$4b3ob3o$6bobo$3b2ob3ob2o$3bo2bobo2bo$3bobo3b obo$2bo2b5o2bo$bo2b7o2bo$bo3bobobo3bo$6obob6o$2o11b2o$2b3obobob3o $b2obobobobob2o$5bo3bo$4b3ob3o$3b3o3b3o$5bo3bo$5b2ob2o$obobo5bob obo$bobo3bo3bobo$bo2bo5bo2bo$5bo3bo$6bobo$5bo3bo!]], -7, 0) local A = head_a_c3 + tail_a_c5.t(0, -13) local B = (head_b_c5[84] + converter_bc_c5.t(0, -31))[100] + tail_c_c5.t(0, -56) local all = A.t(-25, 0) + B.t(24, 0) all.display("") -- don't change name golly-3.3-src/Patterns/Life-Like/Day-and-Night-gun-and-antigun.rle0000644000175000017500000000306012750014265021577 00000000000000#C This is a period 400 rocket gun which demonstrates the symmetry of the #C Day/Night rules, and how a signal can be sent across the border between #C day and night regions. Here a period 400 anti-gun destroys every other #C rocket from a normal period 200 rocket gun. Based on a reaction by #C Dean Hickerson. #C David Bell, April 2009 x = 107, y = 80, rule = B3678/S34678 87booboboo$76boo9b7o9boo$76boo10b5o10boo$75b4o8b7o8b4o$75b3obo7b7o7bob 3o$74b4obo7b7o7bob4o$74b4obo8b5o8bob4o$74b4obo8b5o8bob4o$75b3obo7b7o7b ob3o$75b3obo8b5o8bob3o$74b4obo7b7o7bob4o$74b4obo8b5o8bob4o$74b4obo7b7o 7bob4o$75b3obo7b7o7bob3o$75b4o11bo11b4o$76boo25boo$76boo25boo$89bobo$ 88bobobo$88b5o$89b3o$89b3o$88b5o$89b3o$87bob3obo$87b7o$88b5o$88b5o$89b 3o$89b3o$90bo$88bobobo$86boob3oboo$86b9o$87b7o$3bobbobbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo7b9o$b80o3b13o$ b80o3bob9obo$82o3b11o$b8o3boo3b65o3bob7obo$b6o12b62o7b5o$5o16b60o6b7o$ b4o16b61o6b5o$b6ob10ob62o8b3o$8o10b31obboobb26o9bo$b46o4boo4b25o$b46o 3bobbo3b24o$49obboobb26o$b81o$b80o$81o$b36ob8obb34o$b3obbo3boobobobb 11ob6obb8o4b22obb7o$4o14b4obboobooboob3o3bobb3obo3bob4o3b13obb7o$b4o 13b3obo8booboo8boo5bob4o3b22o$4o15b3o39b21o$b4o13b3obo8booboo8boo14b 21o$4o14b4obboobooboob3o3bobb3obo9boob22o$b3obbo3boobobobb11ob6obb8o8b obob22o$b36ob8obbobb4ob24o$50ob28o$b78o$b77o$78o$b76o$b76o$8o10b52obb 4o$b6ob10ob46obbo4b4o$b4o16b44o6b4o$5o16b43o7b4o$b6o12b45o3boob4o$b8o 3boo3b45o5boob4o$62o9boo$b59o5b4ob3o$b59o5booboo3boo$3bobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbo12boobb3o$70boob4o$71boboo$70b oo$70boo! golly-3.3-src/Patterns/Life-Like/ice-nine.rle0000644000175000017500000000040412026730263015746 00000000000000#CXRLE Pos=-2,-9 #C #C A 3-cell pattern runs chaotically, with average density about 25%, #C until about gen 435175. Then an iceball forms, which slowly grows, #C filling the torus completely in gen 435374. #C x = 3, y = 2, rule = B25678/S5678:T20,20 2o$2bo! golly-3.3-src/Patterns/Life-Like/HighLife-replicator-spaceship.rle0000644000175000017500000000620713171233731022064 00000000000000#C A small c/18 HighLife spaceship -- many orders of magnitude smaller #C than other known slow spaceships in this rule, e.g., the Basilisk: #C pentadecathlon.com/lifeNews/2013/01/new_highlife_velocities.html #C Luka Okanishi, 4 October 2017 #C http://conwaylife.com/forums/viewtopic.php?f=&p=51616#p51616 x = 588, y = 601, rule = B36/S23 267b2o$266b2o$267b2obo$268b3o$269bo10$280b3o$279bo2bo$282bo$278bo3bo$ 282bo$279bobo4$242bo$241b3o$244bo$240b3ob2o$239bo2b3o$240b2o12$242b2o$ 239b3o2bo$238b2ob3o$239bo$240b3o$241bo3$230bo$229b3o$229bob2o$232b2o$ 231b2o26$288b3o$287bo2bo$209b2o79bo$208b2o76bo3bo$209b2obo77bo$210b3o 74bobo$211bo12$193bo$192b3o$192bob2o$195b2o$194b2o12$176bo$176b2o$172b o3bobo$172bo4b3o4$176b2o23$296b3o$295bo2bo$137bo160bo$137bo12bo143bo3b o$150bo147bo$295bobo8$126b2o4$124b3o4bo$125bobo3bo$126b2o$127bo23$86b 3o$82b2o5bo$84bo4bo$89bo2$87bo$88bo$88bo24bo$114b2o$113b2o2$72bo$72bo$ 73bo2$71bo$71bo4bo$71bo5b2o$72b3o3$304b3o$303bo2bo$306bo$54b2o246bo3bo $53b2o251bo$54b2obo245bobo$55b3o$50bo5bo$49b3o$49bob2o$52b2o$51b2o19$ 141bo$142b2o$141b2o6$32b5o$31bo4bo$36bo$31bo3bo$20b2o11bo4$96b5o$95bo 4bo$100bo$95bo3bo$97bo4$160b5o$159bo4bo$164bo$159bo3bo$11b3o147bo$11bo 2bo$11bo3bo$12bo2bo$7b3o3b3o208b5o$7bo2bo60bo151bo4bo$7bo3bo58b2o156bo 83b3o$8bo2bo58bobo150bo3bo83bo2bo$9b3o213bo88bo$310bo3bo$314bo$311bobo $288b5o$287bo4bo$292bo$287bo3bo$169bo119bo$170b2o$169b2o$o$o351b5o$o 350bo4bo$356bo$351bo3bo$353bo4$416b5o$415bo4bo$420bo$415bo3bo$417bo$ 115bo$114b2o$114bobo$480b5o$479bo4bo$484bo$479bo3bo$481bo4$544b5o$543b o4bo$548bo$543bo3bo$545bo6$587bo$587bo5$197bo$159bo38b2o$158b2o37b2o$ 158bobo5$583b2o$582b2o$320b3o260b2obo$319bo2bo261b3o$322bo262bo$318bo 3bo$322bo$319bobo$575bo$574b3o$574bob2o$577b2o$576b2o9$203bo347b2o$ 202b2o346b2o$202bobo346b2obo$552b3o$553bo4$543bo$542b3o$542bob2o$545b 2o$544b2o3$225bo$226b2o307b2o$225b2o307b2o$535b2obo$536b3o$537bo$519b 2o$518b2obo$519bobo3b2o$520bob3ob2o$521b2ob3obo$522b2o3bobo$527bob2o$ 247bo280b2o$246b2o263bo$246bobo261b3o$510bob2o$513b2o$512b2o12$328b3o$ 327bo2bo$330bo$326bo3bo$330bo$327bobo6$291bo$290b2o$290bobo$253bo$254b 2o$253b2o9$471bo$471b2o$467bo3bobo$467bo4b3o2$464b2o2$471b2o2$462b3o4b o$463bobo3bo$464b2o$465bo2$335bo$334b2o$334bobo17$281bo$282b2o$281b2o 158bo$441b2o$437bo3bobo$437bo4b3o$336b3o$335bo2bo95b2o$338bo$334bo3bo 40bo61b2o$338bo39b2o$335bobo40bobo51b3o4bo$433bobo3bo$434b2o$435bo4$ 425bo$425b2o$421bo3bobo$421bo4b3o2$418b2o2$425b2o2$416b3o4bo$417bobo3b o$418b2o$419bo11$414b3o$410b2o5bo$412bo4bo$309bo98bo8bo$310b2o96bo$ 309b2o98bo5bo$416bo$407bo8bo$407bo4bo$407bo5b2o$408b3o7$388bobo$387bo 2bo$387bo3bo$387b4obo$387bobo3bo$386bo$384b3o4bo$384bo7b2o$394bo$385bo bobo$387b3o3bo$390bob2o$344b3o39b3ob3o$343bo2bo40b2ob2o$346bo45bo$342b o3bo45bo$346bo$343bobo13$337bo$338b2o34b2o$337b2o34b2o$374b2obo$375b3o $370bo5bo$369b3o$369bob2o$372b2o$366b2o3b2o$365b2o$366b2obo$367b3o$ 362bo5bo$361b3o$361bob2o$364b2o$363b2o10$334b3o$334bo2bo$334bo3bo$335b o2bo$330b3o3b3o$330bo2bo$330bo3bo$331bo2bo$326b3o3b3o$326bo2bo$326bo3b o$327bo2bo$322b3o3b3o$322bo2bo$322bo3bo$323bo2bo$318b3o3b3o$318bo2bo$ 318bo3bo$319bo2bo$314b3o3b3o$314bo2bo$314bo3bo$315bo2bo$316b3o3$315bo$ 315bo$315bo!golly-3.3-src/Patterns/Life-Like/white-whale.rle0000644000175000017500000000053412026730263016501 00000000000000#C White Whale - an oscillator with a very long period (160,000,346). #D Discovered by Andrew Trevorrow. x = 19, y = 29, rule = B345/S5 8b2o2$6b6o2$4b7ob2o2$2b14o$2o15bo$2bo7b5obo$2o15b2o$2b2o3b5o2b3o$2o15b 2o$2bob7o3b3o$2o15b2o$2b13obo$2o15b2o$2b4o2b3ob5o$2o15b2o$2b5ob4o4bo$ 2o15b2o$2b6o2b2o3b2o$2o15bo$2bo2b4o2b5o$2o$2b2ob5o2b2o2$4b2ob5o2$6b4o! golly-3.3-src/Patterns/Life-Like/replicator.rle0000644000175000017500000000022712026730263016426 00000000000000#C All patterns in this rule replicate. x = 13, y = 6, rule = B1357/S1357 b2o3bo2bo2bo$o2bo2bobo3bo$o2bo2b2o4bo$o2bo2bobo3bo$o2bo2bo2bo$b2o3bo2b o2bo! golly-3.3-src/Patterns/Life-Like/persian-rugs.lif0000644000175000017500000000010412026730263016663 00000000000000#Life 1.05 #R B234 #D The easy way to create Persian rugs. #P ** ** golly-3.3-src/Patterns/Life-Like/spiral-growth.rle0000644000175000017500000000123312026730263017062 00000000000000#C Spiral growth with 1, 2, 3, 4, 5, 6, 8, and 12 plows; for details, #C see http://www.radicaleye.com/DRH/B34568S15678.html . #C The spirals crash in generation 2005 and eventually stabilize #C into a large irregular p2 octagon. Dean Hickerson, 2 June 2006. x = 217, y = 240, rule = B34568/S15678 213bobo$213bo2bo$211bo2bo$212bobo2$129bo$128bo2bo$131bo$129b3o$128bo3b o5$56bo2b2o$57bobo$57b3o$60bo7$2bobo$obobo$2o$b2o70$28b6o$28b4o$28bo3b 2o$28bo2bo$30b2obo100b4o$137b3o$134b2o2b2o$134b3o$136b4o104$15b2obo2b 2o$15b2obob3o$16b2o2bo$21b2o$15b2o$17bo2b2o$15b3obob2o$15b2o2bob2o16$ 156b4obobo$159bo3bo$156bo3bo2bo$158bo3b2o$156b2o3bo$156bo2bo3bo$156bo 3bo$156bobob4o! golly-3.3-src/Patterns/HashLife/0000755000175000017500000000000013543257425013570 500000000000000golly-3.3-src/Patterns/HashLife/jagged.mc0000644000175000017500000000624012026730263015243 00000000000000[M2] (golly 2.0) #C Jagged lines of gliders, formed by a drifting collision of two #C LWSS streams, crash to form an approximately vertical jagged line #C of pairs of blocks. I don't know if the line stays within a #C bounded distance of the center line, or extends infinitely far to #C the left, or to the right, or both. #C Dean Hickerson, 5/3/2005 $$$$$$$..*$ 4 0 0 0 1 $$$$$$$*$ 4 0 0 0 3 5 0 0 2 4 6 0 0 0 5 $$$$$$$....*$ 4 0 0 7 0 4 0 0 1 0 5 0 0 8 9 6 0 0 10 0 7 0 0 6 11 $$$$****$*...*$*$.*$ $$$$.**$**.**$.****$..**$ 4 0 0 13 14 $$$.......*$ 4 0 0 0 16 $$...**$..*..*$..*..*$..**.**$....**$ $.....*$.....**$.......*$..*****$..****$..*$ $$****$*...*$*$.*$ $...***$..*****$.**.***$..**$ 4 18 19 20 21 $$...*$....**$...**$ $$$$$$...**$..****$ 4 0 23 24 0 5 15 17 22 25 .***$**.*$***$.**....*$.......*$ $.***$*****$*.***$**$ $.***$*..*$...*$...*$...*$..*$ 4 0 27 28 29 .......*$.*....**$***...**$..**...*$...*$**.*$..**$ **$.*$*$*$ .......*$.......*$.......*$.......*$$..*$**.*$*..*$ **$..*$$$*$ 4 31 32 33 34 $....**$.....*$ $$$$.....**$....****$...**.**$....**$ 4 0 36 37 0 $...*$..*.*$.*$ $$$$$$$.***$ 4 39 0 0 40 5 30 35 38 41 $$$$$$$..****$ $$$$$$$...**$ 4 0 0 43 44 .**.**$..**$$$.......*$.....***$....*.**$...**$ $$$$$*$***$...*$ ....***$.....***$$$...**$..****$.**.**$..**$ *...*$...*$..*$$$..****$..*...*$..*$ 4 46 47 48 49 ..*...*$..*$...*$$$.....*$....*$....*$ ..**.**$...****$....**$$$....*$....**$...**$ ....**$......*$$$$..****$..*...*$..*$ ..**$$**$ 4 51 52 53 54 ...*$$$$$$.......*$.......*$ $$$$$$....*$...*$ $$$..***$..*$...*$ 4 0 56 57 58 5 45 50 55 59 $$$$.***$.*$..*$ 4 0 0 0 61 $$$$$$$.......*$ *..*$...*$...*$...*$..*$$$*$ ......**$.......*$ .***$****$***$ 4 63 64 65 66 $....***$....*$.....*$$$**$ *$ 4 68 0 69 0 5 62 67 70 0 6 26 42 60 71 ...***$...*.**$....***$....**$ $...*$..***$.**..*$.*...*$.*.**$.**$ ...***$..*..*$.....*$.....*$....*$ $$$$$..*$.*.**$.*..*$ 4 73 74 75 76 .***$.*.**$..***$..**$ $.***$.*..*$.*$.*$.*$..*$ $.***$*****$***.**$...**$ 4 78 0 79 80 $.*$*.*$...*$ 4 0 82 40 0 $$$$......**$.....***$.....**$.......*$ $$$$$*$**$*$ 4 0 16 84 85 5 77 81 83 86 $$$$..**$**.**$****$.**$ $$$$.****$*...*$....*$...*$ 4 0 0 88 89 $$.*$*$**$ $.......*$......**$.....*$......**$.......*$ $.......*$......**$......**$$$**$***$ 4 91 92 63 93 $$$.......*$***....*$***...**$..*....*$ $$**$..*$..*$.**$*$ $**$***$*.**$.**$ $$.****$*...*$....*$...*$ 4 95 96 97 98 5 0 90 94 99 .*..*$.*$.*$.*$..*$$$....**$ .***.**$.*****$..***$ 4 101 0 102 0 $$$$.***$...*$..*$ $$$$$.......*$......*$ 4 0 0 104 105 $......**$$.......*$ $*$*$$$$...***$.....*$ ....*$ 4 107 108 0 109 5 103 106 0 110 .......*$$$$.....*$....****$..*****$.*$ *.**$.**$$$$$*$**$ *...*.**$.*...***$..*$$$***....*$..*....*$..*$ *$$$$**$***$*.**$.**$ 4 112 113 114 115 $$$$$$$**.....*$ $$$$$$$***$ 4 0 0 117 118 .*$ ......**$......**$.......*$$$$.......*$ $$$***$..*$.*$ $$$$$$*$.*$ 4 120 121 122 123 .**...*$**$*$$$*......*$*$**$ ..*$..*$.*$$$$*$*$ .**....*$......*$...**$$$.......*$......*$ *$$$$$***$..*$..*$ 4 125 126 127 128 5 116 119 124 129 6 87 100 111 130 ...*$ 4 132 0 0 0 ...*...*$...****$ 4 134 0 0 0 5 133 135 0 0 6 136 0 0 0 .....*$......**$ .*$**$ 4 138 139 0 0 4 0 120 0 0 5 140 141 0 0 6 0 142 0 0 7 72 131 137 143 8 0 12 0 144 golly-3.3-src/Patterns/HashLife/jagged2.mc0000644000175000017500000001776412026730263015342 00000000000000[M2] (golly 2.0) #C A variant of the jagged line pattern in which some of the gliders #C from the LWSS collision undergo 3 kickback reactions. #C #C The pattern looks roughly like this; view in a fixed-width font: #C #C F #C . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C I . . J #C . . . . #C . . . L . #C . . ...... . #C . . ...... . . . #C . K ... . . . #C . . ... . . . #C . . .. . . . #C . . ... . . #C . . . ... . . #C .. . .... #C G .. . . H #C . .. . . . #C . .. . . . #C . .. . . . #C . .. . . . #C . ... . . #C . .. . . #C . . .. . . #C . . ... . #C ............................................................................. #C A B . C D E #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C M #C #C The lines AE, BF, and DF are straight; the others are jagged. CG is #C actually two jagged lines, which sometimes cross. #C #C BF and DF are lines of gliders headed southwest and southeast. #C #C AC and CD are lines of LWSSs headed toward C. At C, they crash to form #C gliders headed northwest (CI) and northeast (CJ). #C #C At H some of the gliders reflect toward the northwest, forming HK. The #C rest escape, forming HJ. #C #C At K the gliders reflect again, toward the northeast, forming KL. #C #C At L they reflect again, toward the southwest, forming LM. #C #C At G some of the northwestward gliders hit gliders in BF, forming #C blinkers which are the other part of CG. The rest escape, forming GI. #C #C In generation t, some of the coordinates are (asymptotically): #C #C A=(-t/2,0) B=(-t/6,0) D=(t/6,0) E=(t/2,0) F=(0,t/2) #C I=(-t/4,t/4) J=(t/4,t/4) M=(-t/4,-t/4) #C #C If the collision point C didn't drift, then the coordinates of the #C other points would be: #C #C C=(0,0) G=(-t/8,t/8) H=(t/8,t/8) K=(-t/10,t/5) #C L=(t/11,5t/22) #C #C But it does drift, and I don't know if it oscillates back and forth, #C or moves slowly but steadily in one direction. (In gen 17409 it's moved #C 260 units west; in gen 72609 it's 700 units east.) #C #C In addition to the headon LWSS crashes at C, the glider+LWSS crashes #C at B and D, the kickbacks at H, K, and L, and the glider+glider -> #C blinker collisions at G, there are some other reactions that occur #C occasionally: #C #C When C drifts far enough to the left, one of the gliders on CH may hit #C one of the blinkers, turning it into a pond; this first happens at gen #C 11986. A subsequent glider on the same path turns it into a block (first #C happens at 12056), and a third glider deletes it (first at 12300). #C #C Sometimes a glider on LM will hit a glider on CG, deleting both (first at #C gen 11808). And sometimes an LM glider will hit an eastward LWSS on BC; #C this is a ternary reaction which deletes the glider and 2 LWSSs (first at #C gen 5393). #C #C Unless I've overlooked something, that's all that ever happens. #C #C The open question here is what happens to the collision point C. Does it #C drift infinitely far west? Infinitely far east? Both? #C #C Dean Hickerson (dean.hickerson@yahoo.com) 7 May 2005 $$$$$$$.....***$ 4 0 0 0 1 $$$$$$$...***$ 4 0 0 0 3 5 0 0 2 4 6 0 0 0 5 7 0 0 6 0 $$$$$$$****$ $$$$$$$.**$ 4 0 0 8 9 $$$$$$.......*$ 4 0 0 0 11 5 0 0 10 12 .....*$.....*$.....*$......*$ ......*$.....***$....**.*$....***$....***$.....**$ 4 0 14 0 15 *$....***$...*..*$...*...*$..**..*$....*$.....**$.....***$ ...*..*$...*$...*$....*$*$$*$....*$ .....***$$$$$.....*$.....**$....*..*$ ...***$...*.**$....***$....**$ 4 17 18 19 20 $$$$.***$*****$*.***$**$ 4 0 0 22 0 ......**$ $$$$$$......*$.....***$ 4 24 0 0 25 5 16 21 23 26 *...*$*$.*$$$...**$..*..*$..*..*$ **.**$.****$..**$$.....*$.....**$.......*$..*****$ ..**.**$....**$$$$****$*...*$*$ ..****$..*$$$...***$..*****$.**.***$..**$ 4 28 29 30 31 $$$$$...*$....**$...**$ 4 0 33 0 0 .*$ 4 35 0 0 0 $...**$..****$.**.**$..**$$$.......*$ .....***$....*.**$...**$....***$.....***$$$...**$ *$***$...*$*...*$...*$..*$ 4 37 0 38 39 5 32 34 36 40 $$$$$$$.....**$ 4 0 0 42 0 ....**.*$....***$....***$.....**$ 4 0 44 0 0 ....****$...**.**$....**$ $$$$$$$.***$ 4 46 0 0 47 $$.......*$......**$.......*$ $$*$.***$****$***...*$.....*.*$......*$ 4 0 0 49 50 5 43 45 48 51 6 13 27 41 52 $$....*$...***$...*.**$....***$....**$ $$$$...*$..***$.**..*$.*...*$ $$$...***$..*..*$.....*$.....*$..*.*$ .*.**$.**$ 4 54 55 56 57 $$..*$.***$.*.**$..***$..**$ $$$$.***$.*..*$.*$.*$ $$$$.***$*****$***.**$...**$ 4 59 0 60 61 5 0 0 58 62 $$$$$$$..**$ $$$$$$$.****$ 4 0 0 64 65 5 0 0 0 66 ..*$.*.**$.*..*$$.*$*.*$...*$ 4 0 68 0 0 .*$..*$ $$$$$$$......**$ 4 70 11 71 0 $$.***$.*..*$.*$.*$.*$..*$ $$....**$.***.**$.*****$..***$ 4 73 0 74 0 .....***$.....**$.......*$ *$**$*$ 4 76 77 47 0 5 69 72 75 78 $$$$$.*$*$**$ $$$$.......*$......**$.....*$......**$ .......*$$$$.......*$......**$......**$ 4 80 81 0 82 **.**$****$.**$$$$.......*$***....*$ *...*$....*$...*$$$**$..*$..*$ ***...**$..*....*$$$**$***$*.**$.**$ .**$*$$$$.****$*...*$....*$ 4 84 85 86 87 $$.......*$.......*$$$$.....*$ $**$***$*.**$.**$ ....****$..*****$.*$*...*.**$.*...***$..*$ $*$**$*$$$$**$ 4 89 90 91 92 ...*$ 4 0 94 0 0 5 83 88 93 95 6 63 67 79 96 $$..****$..*...*$..*$...*$ $$...**$..**.**$...****$....**$ .....*$....*$....*$....**$......*$ ....*$....**$...**$..**$$**$ 4 98 99 100 101 ..****$.**.**$..**$ ..****$..*...*$..*$...*$ $.......*$.......*$$$$..***$..*$ 4 103 104 0 105 4 104 0 0 0 $....*$...*$...*...*$...****$ 4 108 94 0 0 5 102 106 107 109 $$$$....***$....*$.....*$ $**$$*$ 4 111 70 112 0 5 113 0 0 0 6 110 114 0 0 ...*$..*$$$......**$$.......*$ .......*$......*$$$*$*$ $...***$.....*$....*$ 4 116 117 0 118 5 0 119 0 0 ***....*$..*....*$..*$.*$ ***$*.**$.**$......**$......**$.......*$ $$$$$$***$..*$ $.......*$ 4 121 122 123 124 $$**.....*$.**...*$**$*$ $$***$..*$..*$.*$ *......*$*$**$.**....*$......*$...**$ $*$*$*$ 4 126 127 128 129 .*$$$.....*$......**$ $*$.*$.*$**$ 4 131 132 0 0 .......*$......*$ ***$..*$..*$.*$ 4 134 135 0 0 5 125 130 133 136 6 120 137 0 0 7 53 97 115 138 8 0 7 0 139 golly-3.3-src/Patterns/HashLife/gotts-dots.mc0000644000175000017500000000152512651666400016137 00000000000000[M2] (golly 2.0) #C 'Gotts Dots': sprouts its nth switchengine at t ~ 2^(24n-6) -- #C 41 ON cells, growth rate O(t ln t): Bill Gosper, 11 March 2006 #C More precisely, at t = 215643, 3662092278363, 61439713210231265883, #C ..., = 3 (4281 4096^(2 n - 1) - 211655)/241 whereat the #C populations go 316387, 5742718768151, 103173468009186875005, ..., #C = (9280232545511 2^(24 n) - 888556308770717696)/529964572999680 #C + (614 + 1427 2^(24 n - 12)/241) n. 25 Jan 2015 $$$$$$$*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 *$*$ $$....*$.....*.*$......*$ $$*$$.*$.*$.*$ 4 7 0 8 9 5 10 0 0 0 6 11 0 0 0 7 12 0 0 0 $$$$$$$.*$ $......*$.......*$...*$....**$...*$.......*$......*$ ..*$..*$***$$$$***$..*$ 4 0 14 15 16 5 0 0 0 17 $$.......*$$..*$...*****$ 4 0 19 0 0 $$$*$*$*$ ..*$.*$ 4 21 22 0 0 5 20 23 0 0 6 0 18 0 24 7 25 0 0 0 8 13 26 0 0 9 0 6 0 27 golly-3.3-src/Patterns/HashLife/broken-lines.mc0000644000175000017500000002067512026730263016422 00000000000000[M2] (golly 2.0) #C Broken lines pattern - does it work forever? #C Dean Hickerson, 7 May 2005 #C See also http://yucs.org/~gnivasch/life/broken_lines/ #C #C A p48 gun sends LWSSs eastward, while an eastward p24 puffer sends LWSSs #C westward, and a northward p24 rake sends gliders southeastward. When LWSSs #C collide, they send gliders northeast and southwest. The southwest ones #C escape, forming the longest broken line. A northeast glider may crash into #C one from the rake, in a kickback reaction that sends a glider southwest. #C The surviving southeast gliders delete westward LWSSs. #C #C Sometimes a kicked-back glider hits another northeast glider, forming a #C block. Sometimes a block will be deleted by yet another northeast glider. #C But some of the blocks survive, and some of the kicked-back gliders don't #C meet other gliders; in that case they either delete one LWSS from the #C eastward stream, or pass through the westward stream and escape. #C #C There's just one problem: It's possible that a block may be formed close #C enough to the LWSS streams so that a LWSS will hit it; in that case it's #C possible (but not certain) that a mess will form that will prevent future #C LWSS collisions, and maybe destroy the gun. It doesn't happen within the #C first 535000 gens, but I'm not willing to guess that it never will. (I #C think that the times when the pattern could fail are exponentially sparse, #C so even if I knew that it worked for billions of generations, I wouldn't #C be confident that it always would.) $$$$$$$.....***$ 4 0 0 0 1 $$$$$$$...***$ 4 0 0 3 0 5 0 0 2 4 6 0 0 5 0 7 0 0 6 0 8 0 0 0 7 $$$$$$...*..*$.******$ 4 0 0 9 0 5 0 0 10 0 $$$$$$.......*$......*$ 4 0 0 0 12 $$.......*$......*$.......*$$......*$......**$ .....**$.**...*$**.*.*$...*$*****.*$*...***$..**...*$***.****$ $$.......*$$.*.**$.**.*$*$..**$ ...*$**....**$..*...*$*....*$.*.*$...**.**$...*****$......*$ 4 14 15 16 17 ......*$.......*$ $$$.......*$......*$......*$.......*$ 4 0 19 0 20 **.*...*$..*...*$.*....**$...**.*$*..*...*$*..***$..**$*..***$ *$*$.......*$$*...*$*..**$*...*$*......*$ *..*...*$...**.*$.*....**$..*...*$**.*...*$..**$*$.**.*$ *.....*$......*$$*$*$ 4 22 23 24 25 5 13 18 21 26 *$*.******$*.*...*$*...**$****.*.*$....*.**$.**..***$.*$ .*$**..*$..***$**$...**$*...*$***$.**$ .*$*....*.*$......*$...**.*$...**.**$..**..**$..**$....*$ $.*$..*....*$......*$**.*...*$..*....*$.....***$.....***$ 4 28 29 30 31 $$*$****$.***..**$.*.*.*.*$.......*$...*.*.*$ $$**$*.*$..*..**$.**.*.*$.*..*$..**.*$ 4 0 0 33 34 $$*$..*$..*..*$.**..*$ ....**$....***$***.**$.....***$.....***$.......*$.......*$......*$ $..*$..*...*$.*.....*$..***$....*$ .......*$*$*$*$$$...****$..*...*$ 4 36 37 38 39 ....*$$....*$...*.*.*$.......*$.*.*.*.*$.***..**$****$ *..*.*$...*.**$*..*.*$..**.*$.*..*$.**.*.*$..*..**$*.*$ *$$$$$$.......*$......*$ **$$$$$$***$..*$ 4 41 42 43 44 5 32 35 40 45 6 0 11 27 46 $$$.....**$...***.*$..*$...****$....*$ 4 0 0 0 48 .......*$.....***$.**.*$*.*.*.**$*...*.*$.*..*$..*.****$..*$ ..*$***$.....*$******$......**$**.***$.....*.*$*.....*$ 4 0 0 50 51 5 0 0 49 52 $$$*$*$$*$*$ 4 0 0 54 0 5 0 0 55 0 $$$$$$.....*.*$.....**$ ..*...*$..****$.......*$....***$...*$....***$*.....**$*$ ...**$..*...**$..*.**.*$...*..*$......**$......**$......*$.....*$ .......*$$...**$..*.*$..*$***.*$..***..*$....***$ 4 57 58 59 60 ...*.**$****.*$*....*$..***$.**$.......*$.**$...*$ .*....**$..**..*$....***$..*$*.**$*.*.***$....***$.**..**$ ......*$*.**...*$$$$*$.*....*$..*....*$ *$$.......*$....*.*$....*$....*.**$$*$ 4 62 63 64 65 .....**$.....*$......*$......**$......**$...*..*$..*.**.*$..*...**$ ...***.*$....**$..***$***.*$..*$..*.*$...**$ ...**$.....**$.....*.*$$$$...****$..*...*$ $*$*$$$$.......*$......*$ 4 67 68 69 70 .*....**$*$$$.....**$.....*$......**$ $$$$....*$.....**$*...**$*$ $$$$$$***$..*$ $$$$$$...****$..*...*$ 4 72 73 74 75 5 61 66 71 76 $$$$...**.*$..*....*$..**$...*.*.*$ $$$$....**$....*.*$..**..*$*..*.**$ .*....*$...*$...*$..*$...*$...*$.*....*$...*.*.*$ ...*.*$*.**.***$*......*$......**$*......*$*.**.***$...*.*$*..*.**$ 4 78 79 80 81 $$$$$$.**$*.*$ *$.*$.*$.**$.*$.*$*$*.*$ 4 83 0 84 0 ..**$..*....*$...**.*$ ..**..*$....*.*$....**$ $$..*$...**$..**$$.......*$......*$ 4 86 87 88 74 .**$ 4 90 0 0 12 5 82 85 89 91 6 53 56 77 92 $$$$$$$...*.**$ ...**.*$.**$*...**$*.**.*$.*..*$...*...*$..**.*$..****$ $$$.**$*.*$$.*$.*$ 4 94 0 95 96 .*.**$ $$......*$....***$...*$...**$.......*$.......*$ .....*$.....**$....*.*$$$$$*$ 4 98 0 99 100 .....*.*$..*.*$.....*.*$..****$..**.*$...*...*$.*..*$*.**.*$ **$**$**$.*$.*$$*.*$.**$ *...**$.**$...**.*$...*.**$ $.....*.*$....*.*$$..**..*$.*$..***$ 4 102 103 104 105 ......*$***$*.*$***$$.......*$ *$$$$**.....*$**.....*$**.....*$.......*$ .....*$**...*.*$*....*$.....**$*$*....*$***...*$...*$ .......*$$*$**.***$*..**$*.*.*$*$....*$ 4 107 108 109 110 5 97 101 106 111 $$...*$...**$..*.*$ ......*$..*..*$$$$$.....*$....**$ $$$$$$$.*$ ....*.*$$$$$$$..**$ 4 113 114 115 116 $......*$ ..*$.*$ $$$$...*$..**$..*.*$ 4 118 119 120 0 *.**.*$*...*.*$$*.*.*..*$*....*$......**$..*$......**$ ..*.*$**..*..*$.*.**.*$.*.*..*$.*..*..*$..**.*.*$...**..*$..**.*.*$ *....*$*.*.*..*$$*...*.*$*.**.*$.*$ .*..*..*$.*.*..*$.*.**.*$**..*..*$..*.*$..**$ 4 122 123 124 125 $*$*$$$$*$ $$.*$**$*.*$ $$*$*$ .......*$......**$......*$$$$.....**$......*$ 4 127 128 129 130 5 117 121 126 131 *****.**$*...**$..*....*$.*****$*....*$.***$...**.*$.......*$ 4 0 133 0 0 **.*$.*.**..*$*.....*$*.****.*$*.*...*$..*.*$*.*.****$*.*$ $*..**$*.**..*$...*.**$..**$*...***$****..*$...*$ ...*****$.....*$ *$*$ 4 135 136 137 138 5 134 139 0 0 $$......**$......*$.......*$$..**$..*..**$ 4 0 19 0 141 ...*.*.*$..**..*$....*.*$....*..*$.....**$ 4 0 143 0 0 5 0 142 0 144 6 112 132 140 145 ......*$..*..*$$$....**$....*..*$.....**$.......*$ $......*$$$.*...**$****..*$....**$****$ ...***.*$..*..***$..**$....****$....*..*$$.....*.*$...*.*$ .*.*.***$...***$.......*$...****$...*..*$$*.**.*$.....*.*$ 4 147 148 149 150 ......*$..*..*$ $*$*$ 4 119 152 153 0 ..*...*$.....*$..*$..*.**.*$...**$......*$$.......*$ ....*$.....*$$*.**.**$.*....**$....*$$..*$ .......*$$*......*$$$$.....*$....**$ .*...***$.....***$**....**$$.....*.*$.....*$....*..*$...*...*$ 4 155 156 157 158 *$$*$*$$$.....**$....*.*$ $$$$$$**$*$ ..****$..*...**$..*....*$*..*...*$**.*$....*..*$*....*.*$......*$ *$.**$.*$.*$.*.**$.*.*$.*.*$.*.**$ 4 160 161 162 163 5 151 154 159 164 4 118 119 0 0 4 0 118 0 0 5 166 167 0 0 *...*.*$*$$$.....*$....*.*$...*...*$....*.*$ ....*$$$...*.*$...*..*$......*$...*$....*.*$ .....*$...***$.*******$..*.*.*$***...**$.*.....*$.*.....*$**.....*$ ......**$.......*$.**....*$..*$**$$.....**$*.**..*$ 4 169 170 171 172 ....*.*$..***.*$.*....**$.*.**$**.*.**$*..*...*$..**$..*$ **.*$...*$***$$.**$..*$**$*$ .*..*.*$.*.*..*$.*.*.**$*..*..*$...**..*$ .*$**$*$*$ 4 174 175 176 177 ***.*.**$...***$ **.*.*$..*..**$..*.*$.*..*$..**$ 4 179 180 0 0 5 173 178 181 0 6 165 168 182 0 7 47 93 146 183 .....*$.....*$.....*$......*$$$$.......*$ $$$***$*..*$*$*...*$*...*$ 4 0 185 0 186 *.*..*$.....*$.....*$*.*.*$$.*$***$*.**$ ***$***$***$*.*$*.*....*$.*.....*$ $$$*$**$.**$***$***$ 4 188 0 189 190 *$.*.*$ 4 0 192 0 0 $$$$$$..*$...**$ ***$**$ ..**$ 4 194 195 196 0 5 187 191 193 197 *$.**$**$ 4 0 0 0 199 4 0 0 74 0 $$$.....*$....*$....*$....****$ $$$*$$*$ 4 0 0 202 203 5 0 200 201 204 $$$$.......*$...****$...*****$....****$ 4 0 0 0 206 $.*$*$***$$$.....**$....**$ 4 0 0 0 208 $$$...*$..*$..***$ $....**$..*....*$$..*$...*****$ 4 0 210 0 211 5 0 207 209 212 6 198 0 205 213 $$$$*$**$*$ 4 0 0 215 0 $$$.....*$......*$....*..*$......*$.....*$ $...**$.**.**$.****$..**$$..**$.****$ $$$*$*$*$ .**.**$...**$ 4 217 218 219 220 5 216 0 221 0 6 0 0 222 0 4 119 0 0 0 5 224 0 0 0 ......*$$...*$...**$..*.*$ 4 0 226 0 0 $$$$.......*$......**$ .*$.**$*.*$$$$.......*$.......*$ $...****$..*...*$......*$..*..*$$**$**$ 4 0 228 229 230 $$$$$.......*$ 4 0 232 0 0 ......*$$.....*$.*...**$*.*$...**..*$.......*$*.....*$ ..*$**$$**.....*$**$..*$..*$..*$ ..******$$$$$....*..*$$....*$ *$$.....***$....*$$....*$*.....**$*$ 4 234 235 236 237 5 227 231 233 238 .....***$ *$ 4 240 241 0 0 5 0 242 0 0 6 225 239 0 243 $$$$*$$*$ $$$$$$$.......*$ $$$$$$**$***$ 4 245 0 246 247 $$....**$****.**$******$.****$ $$$$$......*$$......*$ ......*$......*$.**$**$..*$ ..*....*$...**$..***$...**$..*....*$......*$$......*$ 4 249 250 251 252 .......*$*..*$*...*$....**$*...*$*..*$.......*$.......*$ *.**$.**$$$$.**$*.**$***$ $$***$..*$..*$.*$ **$ 4 254 255 256 257 $.******$*.....*$......*$*....*$..**$ 4 259 0 0 0 5 248 253 258 260 $$$$$.*$..*$..*$ ***$$$$***$..*$..*$.*$ 4 262 0 263 0 5 264 0 0 0 6 261 265 0 0 7 214 223 244 266 8 184 267 0 0 9 0 8 0 268 golly-3.3-src/Patterns/HashLife/loafer-gun-p8388608-linear.mc.gz0000644000175000017500000007217612362063145021012 00000000000000‹tÜ¥Rloafer-gun-p8388608-linear.mc|]ÙŽ&; ¾Gâ~bKUö€b‘\@jÎi˜†žéÑtÛÏŽ?/q’ê¡gþªÄÙÇvœ¥þðËðÇÛ×ÿúôøøï[øNùÆ¿ðåŸÜ~÷æáùFÿïnÿ¸ÿðïÛóãÓ?oýøîöüæééåáÝ_oŸ}·ÞŸîþrÿáöüþî³ûç7ïŸo÷;ü)ÄÛËÃgþgöû§§··‡w·§w·—7÷·ïßSªÇû¿¼Ü>{úðŽÜ/O·çû{jžÏ·?ßs)Oïž_>|üìåþóïx½Þ=½ûöóËÝ»Ïï>|εúóLJÇÏQÙ/Iräöù—noï>¿¿=}|¹=ýåöçÇ'ªÏ·nŸ)_d¥M£©œç»Ç<}ëFY¢TÍýëýŠ ?gwûçÃËJô—‡ww·¿>>|~ÿAêôsŠOÕBvÏOï¾5µCRR˜fHªøÆà݇§TÞï~Žãø>râ„ïîÿõr»øë›—ÛÛ‡ÇGÊðö×{BÒÝ 9Ÿ)Uçýý»—Û‡{n¶×QqÄ9ý–Ðùë»——ûïž¿û‹‡¿Ü÷gÉ%µú6áìÛïÃy|çÃãýí/O¨Yo?~öæö—»gJau§X†ô{ê;"÷OÏϦ4wŸÿãîÝËÝ_ þn<"s;ßܽܨcïÞ zïïž(åŸïç/@:üý‡§Ï?~†öþóö»”ßóíÛߦª¼Ü¿¼A,«Ç‡»¿ß‹«yÿ¯»·ïÉÙý±¨€ÏÞ ‹ýòáî÷ÏTaÊêó‡¿ Øz¼{wïèùÍG }¡oÑ·¯ÿ7üéÌ߸QãßßžþƒÖ~fäøÏo?ÞS†··÷Ÿ½¹{÷ðüÍüìñþîÃD‘ïÕ·Þ‘ûÃÃÛ»hôû—ûwŸSCî@›Ï\w"@ þ·wœÅÇw »G§÷§Bo/ÿ|º¡ÜwÔ$'ÒQS>#êZúá-×ft×ËÓÓãß^¨4*žñ$úoJŽjÓoÞ=P02ŸŸÞÞSåÿýü-K/œËóÇ??½±Oè’çï2ÎoÜ~E¡ÃŠÊGøc½bŒÀ_ýîwÏ·¯?½»ÿ6åEõúˆÿ,L†þ(ëm´|çvû%hñí:÷/yøìúóaªúóýÌ4Ö‚Rf?F½>“¨÷2z(|ªûøü4ˆ™êl¹xÕß~||yxÏh~ûžjâ|~”èèéãóã¿9/b1 mªìó‹fâu^‘qGn`þ…q²VLúšŠ±<>Üöðþž;ƒˆg ²~x`ÖñõŸÞvÿöÏ„±pœéÔâÀ”î™ó³7–Ï›;pRbhŸSæÂ1HŸÞ?|¶ð ÆÈÆ0~ûïw/o(¿çïþYùm¢¿o‹ûùÍ·ÑWÏ` #Ÿð b…”ÁÛûÏÄèþzOÌ÷Ï»ÿìEh„º °þm)ŽÖ™Ñôðxÿ¹ô)Uêããí'oîÞ¿½{÷5B1RæÀ¿>…ø¾ýöé(ëÏBÔT-ÉèÏñ9ÄGjÈw(Ú_Ÿß?½|‡rþ.1ÛôÝ£÷¯ýŒñÍÌÿÛžÙ·¥‚o^Þ>Z~$è}D‹>Ü~¾ý05ôZ–Qÿ¼Ýýãîá€ïI>o^^Þï»ßýç?ÿIUyGà ÕãZsûøöù»ÿx¸ÿ§tÎû7ïø—Ô¯¾üàáäcؼ‘&gÄÆ>`üæþÛ’”:ÀäÞçÌjî>€¯}öø‚G³aJÉ­Bàãšuýë{ê²[ûëûo‘ÄÇØ{¾û7‚ÿùôññsÐÃÓ?5BP1>r•2œLzGøýÙ¢æûoÍ,àv&"á÷/c@ÄoݨcÒoó@‰”Íon?Žßým çWäï;ô÷Ío~å‹_H·ƒþ·ã‹_ÈäÀ?ÂxaG´*4}ñ Mù‹_èì(ˆp °²ûdwcw`wgw”böh™'{²x{Šx"{ªx{šx2{ºx¸øpˆ§²çW€Û© ýÎhðwä@òØ7¿òMŠKÁŠΓò Á°¸JÅ0DȸdŸá®$ÑË-TÉ)p;(µÆÑ*zFž.rYÖc[žvm䤿GÀ'‹Œô?#ãÂñ4‚'³$"‡W·Ýb¿%¦£xÞb¼ÅzK'E¼&uÿHž"ŒW ôÐ$xç¬ý¯b.Ñ·j¥‚Eì½ÔO">P‚pË2X^õ‰r—¢s¾årËL–ä!•ñ®È…ƒ¢5ðÊLoôJì)Ò]…GòúU ³Zo¸??Á8×Böq>Zð[„æ Yñ>®¤ê¹(¾¹ÉsRî€ÕÒ¿W3¢l ýêÀjÀ¯ù /EƒX²À|`¤‰Á<È+Ò¯ð¤_4ž8g’ÅcÒš1^Ù™èÇ,ï´1º©Œtíô· I•€ žn‹@'ý"ÒøVâùè1Â’Žs!挂/¢Î}V+Ï‚ªœG*ýNE\Êä±ö hŽD¿©¥Ñ?}˜ô³œè—‡tCRNHÿ<’ õúµI’KÆVª¤–òLC M‡°´EW,ÂÕsÒ/ZÈ„ ˆ¥JÎÈáš#â ªF°²ág{¯õ¡6Xu‡kÏQF"xá`ø78`Jk•ó"™–¦ªw‚Q×>Õ]sÁðkGæBsV~¡ÈeRfj'ð˜¸à@‘Η6RxÚ:&åÑÆTFÇ|Úâ9$ƒ uî,¢²óíÉajfg£·ýrZú;s•ÐöŸ¦óÔÊËŒ /­ÒÊ1•VÎ {%XŸMÝÔ 9tBf‘Œ \X` Èd[Qß±åxæIÍÄϱT¥ÖÕqTgÕ¸ÕZ†W“\5ïÕÄœ/ õ{¶mΖ‘äµmÔ—BÈ{Ψ·)Ý*òvO¢¦Ñ¤ÁñÉY¦²[ÝšÔÌöIþûŠ­îØê3¶zÜšÕ“wƒ›=ÖÞ‹åZ=×6纻tظkÓeû,Û,¤œÀŒæìŽÄά…g}¨S·ñgÒv '3zÈkèÁ‹Ъ†'ކœÉ t‚ýÎk «ñ+MXé׬¸1âRðGžuÄ 0Þ(…¤CªÌ‰æn$%’ ±Êío‘  oâd"yJ#HQ:-Zô)ù7õì³0Îz,eíÆ(³=‡…1Ž6Å4µ)æ…ÂPo6ວksº†”w‹'V€‚>mr˜±Ÿ"ý Z±'}‘ ùÕ­¦©-e / âri»óë4ñkòh45®z'Ô)&põTÎA=mÂBNôë×…°WXK*çÔêFKœêXÒ†g1þurFs̲ÀU@$·ÂNó[ùë vê1J®çTr ÛÖ­Ø®i&Ôš§:"&cÁEp¬¡òž>òoCheMU'œ·0á¼ÿ1qìÑò­p¥È‘Puµ²ç¤_sváëê™Ì63{XN!kÙêISzÖ:ôAÌ úê¢#Qh½àì¹Ò*ë±ôNÁÒUsqã•N\À¥é)Œ6´ÈYæBV F€¦DÖ+{ýºY ´ü*œ)•ÆYrAeôL± XØ—&®–õCžÑ$Ëüê”eCõtÇr‹ À¨J2UÀ;kÎ&¤9·Ô\LËì0Ô†ÊÑÅ iû”ë¬LgU¦)Š…B y§‹ˆ®f9ÚlMˆ^Ö{^@ hZ€pe >. ­,1Ç/vNÃø’Ñ«4åˆpÑ[¸øAP¶üƒüêDP©mæ,dùä @ШR†zJ!ÂÇ* Å]¦zÈWÈPÂù$]x?mÎMN^É4 NcäÙôÆ\æ(Ckd_˜é¶MöMGöåi?€e’Àí§j•J?õäœG}=6üÕsR“´ðž‘IMs&yϤh'ÔÀÞH? ›}(m×¾ôq3ù@N—äYå\>gL¡ÉÇAcâ3‰\Ï}ÖP@wWÃÈsníꢆ‘#.Ü ml\b¦°4WÔ )s/÷:ZáHÒ¤¢ñ¡¼¸rhbòw)Œ`JÉ`þôl *[ÎQ'¼}&F1‚ìŠÜ‡kµ\MJU9- 0µ0oa9Wc †yÔ)B–"Eúiu*9Wê!@á,ŒÕY* õ4[¥KXé+Ö÷âÛÁʼ¬([VO^©¸°¾LåU=éWQ‚HUAH²_–Ôtõ>¡‘sS!k‡ä‰[cbZÇlž}Eã‚Un<%‰µÇ›P„Â(Uã´äJ•‘¾”’Â*˜€GàÚŒ$Râ´™~Ìøé}2$Ò¨ʤ• „* ìz.逨Ïqä{í¢ä™ÃTJ+ A!>dp.íqû†üHçŒû¼Êô ÆlQ}µUÛž¬yöC^c‘ätIž¼õq)c|sºªµ…ûdHCÛƒ9qÕO„}«ášÂ ð&¯q"pµš‹N1hÈõ®u_e{u¥ŽsæYņóíLžƒ~ažPµ©Ì’¼™=y±jG4ÆTKÇ^k{ç».‚‰±Åï:):(¬)à–H® nÝ0Ü£Ðh|Q:xVójìÌ<È AÀ'„Ïd×Ǽš}󼺇Irö™ØgJ-d‚H9H-c =T°pR$”ä™~Z£2Ê98¨YZUÙÀÜ4f85 lN8F¸äL?D€0ñ!òƹÅfáNb % s<ÿ:ç¿ñÓjúxÍ—>Ê‚Gì„Ô>Š™“d ¦þŽ!„–'Aýy¢m*䢔XÇ À´ÑKšèÛäêR izR» EHdH"ȉÑJ© wÃIˆøæj£eš†ìý]Šp;; á•Ñhöõ)oœw=]q”¼kp-TÚC‚pü¢){œ:)Òæš¬ÍµxW†MèShsqL©¿oB¿6åéL ±µ0·²Åyxµaö—Ѹ PÇX«K^ÐÏDm2…„B Ç! víã&ef‚hת̾²ˆ@ïGî r£ ] ÅfLJ->>4~¦*Ž¿aÃ[ ÒAûîv0fywňá›âžœ"ÐÏ¢m[Mg±ÌÚCo䃻ŽrNÒøÙyõé|„<+!€æº?¸„¤KSºMÙ'4 €Ê© ˆô«ÞL‚#“6Ô†‡~‡ðŽy4ûÆ<š2ð¨*ð”´Ï›÷œ~Q#8$­"Ð!cW­ŒÂ * ¯B.6Óä=´BµC6â xú™ÈŠ"²Â5¤‚:ÇÁ/ƒâ’¹]ˆSGDškoS•„A£659L¡¢7{•HtàyÒ/lµ>ë^kN„¨£ÖX5µÁÇ6Áë+zFT¹èdÄ+Ñ­„¬l¯ÉpA”Ó^+nU]Š MoÕAÈ¥¸D*z6‚ð2‰ø| d¨$¦¤\rm#×>Õ­Á°#•(u+§!µ„=—ÂÊ'½«[aÎBq¸¶ ¶"ÊgƒaŽž4pÄæ&Xšñ<¤H`_Ÿ©¢Ƨ؇øëÄ0Œ9&[6ÉU´ƒ8A¤_âR&½Õ&à#’¢Ž_æô Ôô›xüî¬NYÊP¬x¨'2!cðíNž¼ªN)®½ÙÀçz v][EfÌ \sXÑ<ÓEu6í©S’E{"ˆ*䊫ÆF4™1=rQ]×L«ªÝ†zˆkë(DfZTp@UWf‰ ¢4tîûŽK‰°!½Ø "JC+•‡¥g±SˆŒ¹œ33uÍÇgóÌ>Ö…}ýªÃÅÄØ'»¼Rç¦2öt]­[K£êÝäb–.èÓÆÍ©ERäªÉ›Z‹pZ‚pµc¡Ÿ-ÂÍïº v72t3LerÆ1ï ëäYõ “jâ=éÇÖÕU å0Ã Ü |\m/=ÍV¡ŠÇ´5xE‹œERŽwÖÉhE ŵcÁQVýƒ\Uˆ)"Ù Âù¨Fèü½óö™ŒåòÅ.µiçå–‰sH Š›8´ß¡ŠF.hpK¯#Íg(È•!±5ÇjH«Ú¾RÄÈG6Y#Äâ5&¥ÓË)N4¬Tf‹ô†•*r°g©ÂÊ®=‡m~5NK—Yj(Ór׌K ‚ÆÚÚh¸‡ŠµA/ôŒôSÂobr4kªôiS48äjÖÕ>9Bî"ÜSËatü”5¼€lbŒ~]Xö£5Ù%Ê‹òb»M( ®v‚kugOoµ««ëÔe¸8Õx¶Ö¹?¤Ks.W]XX&Ù™´´Oˆc;bsÏÃQ„¿ÁÉU†ƒð‹"r%#r\ixà`óz~°–‰~ªÌíâé³0;ŒHÆÎÅ›Ÿ‹—";?uë€Nò/í>»·[Û$TTkgÎ`k'åÃ2NƲ$s>‚®¬¯œÛ{шV´œ ƒ ¨¸N¹Ïuh#z·º0¬"‹È¨,J‘Ç•L&ÓÌÄ;–DÅ›¯œÏæþ®+“áÒ5<šÍ§MŠq}Ù‡¤W›D?Õª s#d’‚æ Ž×‰GÔ6F™x1 Œ‚‹Õ¦‡ùÑf£è{µGvá°\KÖ(¦Ðod-*ŽX‡Í¦W³u ˜á¸#dÉ…_À‚q¿5š¶ÃÀµÂs¦š„%^œôÁ¡bàæô‚Ö`éÒÜ—.’ÃN·i/È}®VðÊ“#Î!ŽÖbà^;ލ6”¥ãFåÓ¼p˦‹1ŸÛ«m„xà ½Q˜s y†Ñ3|kb¥C ›–uØ5×(HeYլ脛¥I‘ ws$so®”ÓO[ÈÀH\6{¨†¼BOÔ¶qmánl4¬BÁg,>8x붯X•vëZB7djs[–|"œ†']]Óöè¨êÖÝèî¬ýXµò ,:b«,âp" :£€2D CŒf“ +¡1 Ë‚Ÿ‡3®â¦C &$ÄkL¯ˆ×˜^e¯ 'kíNaTÛ,Ø÷ F©ŽS–ÂlƒºÉ³¹":#BºªPÜ)›{e%íçӖSYgÌe1¯ÁÉt ‡Ñ5ÜM:‹þȉº™;dµt7À¤°‡¨ Aj€ýImÇj@dÕÄàÌZ© +œe· D·‘y–°yB®7bãA‘)0ª^'€§YpdŒZÝ?­d&Äá¤iT!æ]¥M†ª`¶·š-]}Næ%pÑ?áTlÕ± ¬Äd›‹»€AæmW]Mej¢ª!uÒÂPK¼"¨;”¡pˆNJñÅż Kňڷ}kDgÇ:F¬& ~=máh·äÍ0ÈQš§Õ>«zgÖ¸*)6=ÄRÍhv®ë¶ Ìn²%£È:â‹4+° ä”,‹ªY%,Êm €¡ „^‚WÛ ¹¹Ê…²p®RÎ%SES’¤†¬ˆ­Ê☛Ñ?7¶†fMsÿr@¶/ªöqÝÚ=w˜d‘´âÑ쬈Ma£ÖzôÇíœ$ðC–•(tÈ[ ¤lçÅ㆙?£”Có<•Q„(ñJxÓlöˆ@~Ú­å‰7!h¬•‰w°ñV¢Yw(s0öíð­CS7)6мÂOÃm1úͲ«°(ókÀâ¶Ïý¨‹‘“Óå±KÙhî°,±rDʯŠG³u×}í’.½X"¢wYA°©üÉ X·Î!R\³§_³ìó²DJž;‹q8Æd‡Ü£Ñ¾¹ÿ²ÐJò{=ãp=ôpVí±¤ç*àäœàðmã¨*‡£^¶Ã>O+×ëŽ}¹¯ä^-÷2p“¶|±ô†#Û" %ò©N®Öà«ÔÓXžàÛ5XÈ C¼Sì D¼NÓ˜·äIØ#d¥oUoo›Í0zÛÆ:9ë(°ëÞÜå\<Íã&Ì“4âWÀ#®gPuН¢ç à´U­Ø…á2°lÃKh¾>¡èÌ"¥](ÀϰҲ°q°ª upí#Ýc~÷1ý°S'žÏ®mè¹i ¯ÄŒ˜mÝ{ ô@åôaàgÅ]Ó ¶_}}]vÌ"@á8űM(H¨+p>ÙO“-t¤ÈùÔuv PÈβ2Y7°×ø•ïûvöN…è¦&<¸×TËš--¢8Í:à‘×­úí´;<ËÛÇ™Ìz’})øØö¯ÙR„Ýö¯’i·öSE­\˜#Z´ã»ˆÄæ¶€ ˜…³ìûWÃHÙÆšÃhü¾ŒU¼OßÉø2²?U]3=¨âHÔ„Zàäúrµo˜Œo賻ɀ²ØlõHµm½€Ëj;fŽž´„}*ÓŠˆT›Õ~²Ð­ ›¦‚DÉV/›"š•áÀ=ægªùp¢uéÉeiTWÕ-¥¥G³š*‘Z³l}õкód¼"€ñbv‹—q_Œ ¨ m·l¶¥é €é‘=8Û…zƒ,8Á®´šIÒ\¼”~÷#æ4t–ÓYè¾À™×ó%.âüjü€»î”­ÏM@n·±ÄÝlbV2™h)«æNt©[ÊD#¸ó\øÊ™ $ÁÀ‹“§a4ާÁCÎrííš_̹Úmݪ¯m,Š 6×j{ò0-ø]¬®gí'PUŸB²tÙ®RDð¡»îàdý ýpâj‡}¦€Ã{}'¼xÇ6'ñÚNaœ%’“C×sžñÍÑÓ¨{ÍV¢_îÅžu§G-RšbçÛ8 Úmà×>ÜŽu#ërоm\±n7F_³Ìš…3)ödf—¹€¬´VšÔÃQ„HÙeßj‘³÷c ž8Æ æ×p˜££—½t6Jº`Ši=ÜOÙ8§q’^×E'‹0?§gI³.TÃmÔÑ“LáÔbiªëÛ ÛÅj}œ–_7VBëoz˃ßf·òı™@Ö£t€1ÁS•¶+”w M–·õ‚€ô«H3.re>ÚöY 4ÙSö ^€§`‰Ž›…‹šÊûu_:ý–9r¸î‚­b÷f‰AŽa!"½ìƒi=3ŠXÍwº‚¢Æ‚>ú”hÛJè¢)Æü0=& XØé¦Ž…ÃC¯„³h#BšÊÛ+¸ž’!ÅiTض¼Xõ>ŒÖ†PŒ.©#wÃ2U}µõ ‹]w ÀéË„¾?r_¿D¼òÊ^p!}„¶I°B|ŪšE—°8LJÕ,ºuiPg…¤Ê VÀtRXe ¦3Lç„|{^ DÍy¾™…ƒr1è^µ' ^Í!i׉‰¼Õ{iö GpÇW¶ªg£E —˜Ï±B½‹7 Œ»@@¤Å^ÍØLˆ¨ÉMS˱êNSÞÝ3.„ð=Ûëò­è+¼x°ßÅI:×d'`Ç ã¬L=GX´F45½ÈZ€ÚáœKUÀÉÆ³x¹÷:K¡TëpiÕÆ¦W‘Â+ò=("]¸†vT@ßì0¯Š\w T™ÿ²cµ¶d+8pW•õrŸ „ÿjEc‹T_]Þ6Å·¶'ì¬0’ÅÍÔX°ÖW–Ïì8} 6c±uê¬V´³t®,ÉuÍŒ%3½$yk2+'ébŸ£Ý€n?c¹X˜6ÿo­Bøâ¶õt-RérœùÚÌ^öù°:´u§$G¯ƒp»1%›óWØÌ*àÒv½ q˜2àˆ®Ý'-aÛÂŒxÉ4¢…õ&%¸V ˆÏNZ>!yU™êÂÉ €cH‚Æb„OÕ±dg;ƒéße¯žo+Êç4ÇÜò²ŠèŽ—ÊÀrݔԆò.9r<¦]c³>ݰ¦ðг°$¾Ì´ڈO¤ jˆ‚;ZµºäÇXE°zsrI9öGIc^.¥M|9Ñ¢w~!Ñà„-ÚÉÜëQb¦ßv{&Í-Êaœ›U^§óÜ« v€Íá…îe٠”f5IUUh6‘kRC¿hÀb•铵³OÄé{gǧ¡Æ‡ÿR”´r·¸×†6ý¼‰ùêr ø,çêß7ÒÈã œ<_ÙZ(¾·€wÜ¿h£ ?|}ê½Ìq-E·ûš¯n¥4¯|îËç“°»É¿¬Ë1lÆ–Å'ÕÐÏfŠ;ÍØÐfÂ%çÞÙ FÄt)4våA¥yóÁ^,§zl7õ¶Ìd…u{K¸­ãK5S€ú­gq/ý‰¤ý÷ùÄš®ïŸ©le´sΩ…Ñ½yÀhšotüŠ}]m+®•Kqu*®-ÅQÕ¶oÃu¡cÈ$‹Ç¯(œ³ìÉZ žÀ@ª/·D«˜+ÖuH95¹TÍ=gGXæo ÑÏÝ×Z±E­ïZÁ-u4ŸÔ®ìwOޱ'[á-®|Å®6 ? íܧ?øÏ}ü ¼¾þÑþ›Ë=Ñþš¤x¡ˆ_Ð|uào ¡ÎÇQPÇ"q=L¾ñ]HÃÃL­è@AÑ<dÖ¤·”õFcn( á\†…V¼Ëyõ>vtñŽo<?š¿Y$QöaÓãÔþ8>ù1}ˆPÇ2åèÙ+ûÅ—ðÍ8Ê”g]òä‘Âq¢úhÿ1úöB5t|+ìUGuйÓ\Œ|ÑqcýR/¹´)—>ç’å¥"·úˆ¾HSœ€…A°./O¸ahëR;ħÃÍk'¡22ÌgŸn0÷Ú•QŒ^Õ\œO/ã¤#J4q"WÜį‚PÛ·nõí蛾nÕp>È×ñLì—¾®ÇÊtá\?×û‰{ž-}tj«i¼5Ï…ë.f“Æ1;Ïœð>%NÀCvŽ_$ß›ãŸý›¿<âø_K†;.׺KøB–zµ4\Óõ¼ôм¼q(K> aöíã%'߸Ó¯z?ón§¶¤j–2) 09ƒmqCƒ/@¼C‘¯V”_"WŒ[·Q;¹‡æ‡ÖîÓÊd¥Â‰õ@`Ü®ïå|5“¼frr‚ éeúŒ‘Kj‰ j¾®…¨ÿ<6VTG[ô[DÞ´¯€Gmá­b,r­-"d$2F&K§šÑ×’`©ãÙGb¹þÀph%ªŠ~À g’„…blDS«v¹m>ü•Íg:/Ž™G¿ûäŽsó™ Þf³ñöU.`X¸\à(*kÌ'*\QFsÝ•Ÿ1GUÎzâ*§à‚’pNMÙâ Jÿ¦…›s1Wkh¾tÌ5K§3-±I‰p³Í}Šè `Zé©;…§1ªÄ;D÷òUæyN!ñ&ÄJÊ¥Ö§%»Ù÷æêÌ“H †™dýn?îãò¾ `üÁaz>Ü}F?¶È1,‘£õY< ”¬Çœq5•t<÷ñi`KÙ–¬»ÍZü ÕžO’|ÌgW1ô|’ÌÄáÒ›àÌ‚û¨5)ôà•*nnV'ët~ý=óHåtô]`ˆÜ¤Däœ-f?uÈòxç:«ýn­sžêœGó>|tC€ÛŒB†‚r¸ø"U<š ^KÆÕçËmZNÄ»ñ‘ÆÒ~úÖr\Aÿ”Ëh¸T͵–KÝ ŽœÂ‹yž:ˆä%sø¤S˜NY@uBŠGäŒÙ/‘ÆI:öÖsjŽFæÇëhd9æl7¢NžÌW|æflýäÉÞQâ$<ÚUFsñÅS§™IÉWš0Ã+á‘MB#ÒÆð0»r‘:z3:.\H»épuÒ%(³H„äÜÚz“ÈJkÖ%?ŒšEt¿0;¢Ï™«î×NFbC4Üvëò.‚ƒô°óÈéË—.âÕ|Æ)ä„üàm =¯ðJG×T*ÝJQ¤ÕÀ¦#³‡12Éã„]ŠJa«¯ßA¼cµI¼ã^Pñšâ£HsóóÌÚlzíÚ.p¼*>± 듊Û6wªP9f¾8¸†S…õ[<*xYˆ‹ï’eø~b[ð±æüdþ¬›¶tØ/Y§L Ówพ'8‡œ«PFØÁn½ØÚÇ~<®²ŽeÚ¤£»R'©úŒ.µÂŽ¿*j÷:;-‡+jtâ_²‰x`œ±/›HuE®­Ñ)"°Ô°:mÊÕÜ西 `Û›gˆ-ðªÒ¥2ªÝÁ}Î Êc‰ƒÿúÈŸ¦| ^ OÓ>ÎmYÐÞZþ©J“Tþíi7{r&w3–{0hUºÄá‡ÎÈq ¿€É‹×^ŠOÕŠ÷èÝɈWÅcL~1ò¶¶éÇcÝ×l”ˆµr˜5)‚ZᶺWÍúKf˜½ãZV )÷b=[­!ËPlc’xûªúþUd­°¯N\gøcšôšMÄœD—H6[Ðá– ‰/SJóÉ”.ùÌœØßçÈm¬‰…Ð;)bú‚׉¨óÍ’}Ñk~rLÃu¾uÂf¾êÂÙ@mk<`}M%/³#%3—£ ññÑ9x<”¢ÍÌØ­„À‹cxe³!|5MŒÛ_,[7Ø^¨2&¡JïÓhÚ»™Ù¡m-ŒWׂÂfǾ|%ÞÝz¬˜9vC3ÇL¨’MÃÃ$ôÅtOþ´I˜úb¨Û˜\ZNJ‡d!±ùD#†K@Ž¡%FÂ\˜}š,à¡Æ%¾°/ ´Séá"Ý‚¬äHf#ïPdaÐEñf 0O5ö  7ŠyW¸ÁQ¼+UŒ‰A¼Æ¤Æy|D¼¦ÿdñ†Õeµ×ûWÒ´2fH•ž5æ‡<4çŒGY{Öu :ùz7.³Ýãœ4ÂCR~ù’LáWP}bAPIs«®T”Uáò6¨œá®æþ:OZ­ÐÊVC¬bp6ß¹Nfj0(2W# B¢¤J¬ÿj IÖñ‹#°6_`pHˆ±WGKB¼}ÇBq†q¸‰q`E{À±‚I^ ÐUéÝzVguþ¿ÅÌ ¿I-ÊG"F ^  :ö%‹Ý­~k«™æŒcZ‡¸®õ"j˜;vu¦EÖ'uZ ]ÇëÍZî¬c¦Ã²KbnœDê‹Y¤±/ °ÈëzðŒ&e2U1Ã¥˜§_^XðòI`D®R3ç¸4ëÚÛêv{PèÔÚU–ò]*ÞÚÓ iz ÍæçhŒ/ס+Kp¯éY–¤ÍÖ§×|±Šçd3'ínm1^'a’1uxNÞÁ>·¡4SC ÿðÊx`p²/z·‘ò×üñâTmhÌii]\ì²zäÅͬ¾LøŽ2o6ß´‡È@Ùp zŠá `Â]§D©|ÃÁX£ÌQ3ë\VâÇ©8Ð¥3JMÀ0uŽg§ÉV ¤¼mIkV>ë’vS \]5ðy*J½RÕ|èÚܧó*éV¥§q¯\Rw˜ƒ.«•ÅW+•móå+xqQ ö&<ÔÄÊ×Íà…˜²‡$"UáÁPDP:1£ÒÀ1ŸR8 .44(,ˆ7Ï‚_îK™y»î¢ðO!/¦Ò0É›äw]¿K¬s~ÑaX‹VTèƒÝ6¿H¯EÌÚ,v+ÎjÒÆÁ]fÙͶ”ÓlKµnÒ‚ w[4&Óב'²o’R§s=$Ó98Nïà–Œw^ØäŸ¨¯ïZ Kº†w'ú¾Ä¬iÙÃsp`5L±“ª%ʾ"°<ÍзÚ­jÌìÇ^ ëvQÙOF˜ö pð¯Î}Û5›FLÀñ%1xhŽ.ÖQòpH³}g ‡àïPwÄ»Lˆ3"¹Z óL·ÆnFבª,¬JË,¯ˆGrDnûDì&—žë¶žTóu—fÉBŽFÅ^…p¾&·§pY2ªÆ™Ùm yAFð¶ê{ê¨òY;ã)-^»ûZ+Éš[wêL#1ªi…ç¥Ú ¢9~&¦åe^—u^W˜MlËC'g¯ÆtNëkó°-› …1x¡u)´B™†/Ë5å€SÖt@V¸•®žðQ&Dµê,•ïu_Ó<|{˜N[™-jAc²IÆöm*ëBaY"½Ú›Ð/ëvt¬wl¡(¼DÇŽSr‹xí*Q¼€uÐÑ0Íiš>ZÆ—r]§QÞ®bF£w˜§V[»dfwYÚ‘Ëa8B”xž Y ®KF¾}¸ë ”G¬V©{îa¨£ÃFÃÅ»­k]ˆÆz6Í'´^ľlÕPï>AU*ÛTžÌ÷ÊÐKRO†Ž‚ò—)ž.D9±#d±²Ñ]'×FÛ\Áa]ôžísÓ;­É:Ï÷þUã•ñ(Úd•®‘ÝÀªÙ<|jÔîÁ3[OÆ/ä+W£Á×t)À¡*®ŠÄô=Eñ¦kóYŸ°-ø2¼t¦ÅÅïó¤âä5QðÍòË|ŸnP‹ñÜ(LÆ`D'øÑå± È-UV>˽(GùÍvÉùR+žó«âÁæc8¢â‰rD¾ À à¹bïB÷-ND æÀÆ)÷ª>„K¹v‹N™Þ–±wKÑίp£òœM–ܬ‡OÀ¶žòµ ñÆkÇÙ$ÁYûN½{l;*4Q[Û}rAEÊãê«&8ƒ^o¢›C7Œ¸¼éˆ¹H—!+¼>í+£ùþEôÕ Qt¿¥ùLœYº›º³eŽ:’;MØ—Tlè6•cA²Vû ÷ð`ì.?Ýð266j&K=û¨g†—t(}t©)ì_õ+³† “¯§7Ä:!›Y5ÚKncÕ=H @cÕMb¶ ²êR$fä¬T}¦Û¦xØd©…j'š/—áu]Aé|>ºâ(¬0€„ä:’ ùöWý:jñCŒx‡!F¼ãînñŽo›‰w|‹]¼ãkì ×ñÐTéã÷Ø`ˆ„ø‚åÈîh‚€ÙÅØR%¹ØlÞöCiú2VB+ ?®„Tœ».øœ7.(q èÓZ[JàÙ³N”5,{Ù‰l”ôÜ Ûo´|›;RD½néRì‰G$5ŸÔkŒ¶Ö³/]—ŽeæN¹ŽC'.voóEÛÌ>ÂÓP }îíë’PÀ§Ìê’™ 4:>© K `+OG”– –ÚŸë>jÓžX.ä«pœc)¸ÚÂÝ«(Ì+ sß–ÅRß6éò}!^±æèÀò=-ѳ!¦D•Ð˾ålÇrésfÕ(Ÿoû˜·œñQw¼8Ð7,Õmk½›{fÃISÕ$ee<ÀØ'd+ÙW%Û¬eâ!÷¼&ȯôÓÃZnÓ%S¸0üB¡Í¸FÑyNðÜ—\¼ ð‘ÑÒB¸8Û!òåô§/n’¶·-IOÄÐbУÛp‚{òó5‡´_݃Îà6nRtb`Z–Œ\ñDXYŠ®¾“Ç@Í›NgÍCP£©›íòzŸu0|ò6ŽõS×ãqêSµ ®2¾«aaRa¸šÜp`‹J ®~ Óg~EzœJ Ô8]$Peß ƒWPeßЃŠä—èð#¼*€i\¶Ñã]÷ šx¹ û^h.ÞTg臤Bô£cÑÕ&ººùV@Ú€i69È&vÎ6Í®ËV8N]»î—VøHéÃT)%/µcôÍÙV+‚•ÃØBaóPqzå°<7O÷\ÂUe¨,Eì[*ºÇÎp+°ýÆÜfžÄÙvƒ;ÛÌØw®”¦cѳmÅ~U…÷b _kA*&¿8§ºn–à)ø¶_ÑL¥,CÏæ}€Æ4ˆUÚd|íèFGë-ÀpJ3€&òH»ó!"@Û`ë4óy„\öYÕó•Þ±:•ÑRÎ)ÙZˆs$­¸-dF¸ÓF^Þ÷>(¬”u=¢ œ¯õš{¸t+²:ÉT#™21‘:*—öÊùz!$¯’qMÎuÿ輟æõØ>'\æm|µÇÜ´ ~Ö´uäá80«sÍÃÌße9Àè­“å<'J ™ÑñUú¿˜ÇÊÆ±’G3ooÛ¶6¬Ó½Ï¤šï´q/Û2Õ´ìfÂ2戣ëî´­Eù~ŸFÂÑcœ­…RDÍ·éZ(ÜF"Jp¹2wžô-`Ë¡K¯¹¤DT(^t9(yäý d”K‘Èe£ÜÈ»|î6ŽoKg,jÕ¼_mÙŒk••¥«凼ð xÄe)ÓÑŒ°<+u¾Lw¼’ ê;$À‚Góscn·Ô{°–‘¬=¦‡S5ßð!±^E´¤åa6î‹86Nkt¦Wý"g˜×ޤ2ßs&íÂu¹—…Îr‰ 2¡båÞ)¥vçÞ-Z ›™\Õâl¹åùîˆ} «<õCÜê8hí•AضCÊì´îõoœ‰keÁÉø²_žÐž"rR£]pw(Fqew-6âa”ÝŠS¶ÈTø7ÒÓ»VD¼á•a»YÄK‹p÷mêËžËG°­ùðµ,xU:!\DŠ^Á‡Â¥ˆbÐp7wRÀ+L±ZfE¸„°c;γ7m)š%íZnÕ£ÑvÊç)È¡ŒP)ŸB’Cð·\%¦)çò­DQ¼Ò~vÛÖVÇŽ¨8Žíô“›Á9“æÈƒTβ\A0¶÷„åH€ß ‰Ôjg5_ò㥂AAÞxëåD +ó>Tß«Œ 67B+¬gÍ#Gàõ8´P¸“_üxÓ†D cÉz†aӦˬ›ýy¦ÃB„(ñ2¾JìŽÛ |6kãÚJRYé+¾™ÃuÑÐ|qÑÓRc`š×Ü&ÆaeI^—uÛa¡}Ž[|±§)Ⱥ%g5& #Úž@ˆXCÅ ÙÈ7¤á;•˜̾”±òÕsHB-|l o_F†HBïd§šµqÂM]èµ&?x:P[ó„ÚU„‘”]’·ù€cw*jw§Š;¤ê b@ÑÜ€ÅWÝ9ÁÀ1ó²^3|ùIñÖW6x’›þr_"Û8jY£rÝ•”<›b”3óaŸín¤b¾i“z2–#ˆF·Þ‘ô#¸ËÆøÌ¥q)»ö‡Ü,åØQ‡JLUPê‚8Æ‹ÜT!e¯¥H'ò=úÈS¹hø×óŽF˜÷d¯¯òŠ·Ì Ù'çI¼¯î±¥Ýtû>Öëý#”ÚDœvT) t5îºooÝ †ØŠ^N9ޝ;ÏäóÖÀ´¶îêUMÜïM™ïÖÔ‚ôãÊüõ.’;˜¬È4øâPă¯9]¯XaMs›çÏâÇ—M¥p±×˜¯o'ÇÐËQ„?£¯ Ør7Þ†ˆ4[9ýò¿Äœ#‰—ð6ŽuK)‚ê¸2‹êyifL¾Ab¹L†’ê%™æ»œY0h)Ý›•¢ÕÐä;€ª)9Ž‘äÐÒ%IžéÁ2ͦG—ýH\ Nkû2y9q2]Ö¾)VåS#Ü,>à˜ˆ\Í”Ֆ»/lŽÙ=¢»®\FǘŒB~2 „#énY¸™‹¨xºîc\öm #MÒ"Ë9Æ)•iÚï®H 0ÍÈÓª[&^ojŸÖ›˯ŒG5EÆïŠ9Ö­5Õò’â*·Y­êHF/f¤cPêVËá¶AYšÎŒJY[€Ï ‘D:e `P7,'´}mÍU;Ù^ wJ GÚà6û»|¢}Y»\‡SŠh¡ÚBT:=Œà ˆÆÈ&Ý7WÑ7_ú­Ôn™cV¡6m¯4$*^fé·Hi"0š%f˜·*-²„­R£%zâî°\±&NUŦƒvJTzo³í”B¾Âݹ,+Ù— p÷õ´û-$‘&©³À§"üÐíøǦXxQnò-oö…ÑÑfEvkÌÙàVƒßê‚Wãuø¯gàü<î D«ˆ|/»çhiENÛ=·ã××…æC~É#’ê泂/¡¬à­·“sÄj…5Õ׸`mõ½Õ¾ÿ*®÷»¨N¶Üÿ6‡ÂO#mb‚*ÇbÂ|VçhÇ€mÔuµ î:‘ѱ‘.Ü#WŽ6ˆˆzIN)2ˆÖ¡[D¸ãù\È’/ÊŸþD ㋞ðªÊ‡{)µpA‰ ¼P]eŽ@ÄÁy–1ŒÚd@Cȸ [¼}Rɨ€ñõSñÚˆ,âe6f× Ù1Ö îçÉï6’;̧‹‡Ži_Ée"r‘“–Xñh–½]BŸVü¦q ¡u].YâJî™Ç¸&ÏÁ»‡W)Ùq*®àN&êõ“ ~5þNd¹ÎD&ßLà,twËÐxhk³]*@]åQ¨ØýSÛâv’éØˆp[Iðò+à‘Ãu7“7n+ȈVÍäíÛw¶]9,´Ô•*š«BëŠÿ«ëJ²,XQèVjP£?¨*îcõ.„FþÌs|HØ"vˆè„éûa A¢hïA>¶§ªÍeÃ`Žï™Ðk}3T<%…3ƒŠyÔä`†xó©.<[TEWuá{¢¹¥¤P·Z‘UcÌc |Ÿ!¾NÆÔP¬œŒ>%¥€“SçHб¬CÃH²Å@Âì (@‚ô±¨¡c$ØÞá^«ÒÕðÏ·Õ—ý~:ÆI¾õ×*ƒÿNÒçLO»^I¨EaÏ:}TKÅDñ‡þds¦}ì»3ŸMxbT\k\—ƒŸ ww=Ò”÷Rp/)àPT½»>޲ӗÉ܈Ž}åh^À1í›­øÍѼÀQvgýëzw)*¡¨{½f÷”NAføéœÒ©;¡±3Bžc·Áré‹«·v[ȫ艔¦çx$ÁºmF+ópeè8{<]‘ÖÈÅ<`º´_“`ÚîÉ,G\^€“OF ùðŒ!2*Pw<ò¨ûA\z/ŸÈŠ/Ô#WÊ%àá+(à/éÑÙØ$Ó‚Qñ0kvÕÐÉ*yÑô´óýXÏ“9ó­]ºð½z'ך >>/¯‹!åºQ¢o¡·´­H‡°êéL8+¨ÄÍ‘ ¯<Ñ6D^|²EW+æl cIE-X¬Kª±bÀ K]XÎnt<ÒyðHçÁ#eÜêQ¥^ïÚî6²çþõ2-;Rñv À¹[v#š÷ÕãbnÕ¼()¾æÎ7ÕžßL¥¿ËõˆýÕèÓÎÖ.´VÛZÌãy’‘g\\í€G4‘®Ð¹rWà/O9(¾E²Ii»g°ŽSÃ=Úí ,s±$šÝ¨hGFëstWª;øL©™-—׳y`|È -|f¾Ø9‡çÈòâgÀ™Á“½Š(&¨™áw1ÁA÷ö7²ï6ïÒ—]‘ÆgÞö÷Æ,{qi?Ë×–Ž„v<`½Lþ™udäU‘]±ÈiÈ5€lÛ„8•«k†î¥KÞ@Z†ÜÌ÷µ®:h›¢C â )œÓZÙXЩª¹gÔ"Ö¿K𥥅Æ"´ØG40œÕíÝ‘ 8Nm8©Ò$? L´+)^³»ÝúÜWªz°É?VlY]¹ŽÒ5í^=Ò-˜ ðˆ:Œ'ú'à’LÖʺn@ˆX yë òz뢜§þ<-Ëñƒû¦åÐÝS™¾¦Ú)âRª"®|®btÊô(oO¦¨—Ϫó1$GÛÄoüY’[ø¿Æ.þ¨:­mäOj<øEk‰2±7878‡Ò”\JcÕlJÞ´°3®€wðÓßuf ~¬QgNXKiVùã ²³¼n¡]·T† ÙÝFòM¥LÏó%e®agç!8ÀÅåóûM¥ï^®îñçý1$1á¬,–8]]sÔ‘WµµESóª¦ÖÝ|   d¬¸kÌÜ@š`¾˜. yßÀ¸FâzRÙ½µ0ï¡„Äóy+"–²íó®o·Ql£bò)çI9ºƒC‚,s·M~[,­G!±{N¥O £äœpVvëÛÜH7¹ÜÈNùäŒhÖkðÓáä`3¥ÌE@Æ|qiãž»?Ž«üé›o=€ó†É@o©°Æpk!ø4dÜ—‘Òtà~EÌû%— Kƒ_È‘Þ7Ÿþ »Þa›7?ð3Q{cSÇ(NL0¨g©‘'Ê@Ò^œ'ÓEŠr,Êjúe±Aó¹€ÏõŠ!ý¾øÞº<µÄ 5Kkÿ„#nƒcm${¹Èœ$‘$~H¾mNaJ?gÿÖvÁæµíùÕ¸Ö2žûõÄQjÚ÷¨_âö Ï¡0+0º'©€=IøÛ!¿’Q3˜eÈdŒûY[¡EÁòÌÑàu(©)”ÐÊUÒPJò‰³wÀ!”Á^>2ާ¤K(FÉ[;dõÏðEom†9Î’ÐrÜ¢´ÈSšHÂy¬¸½o)®ùîZ<ÞÝe?ÀÄZ}×&EüJ.¦¢õJ÷az–4a'Ôš€çîäg§‘çhKi÷åÆÞóB"~kúDà|l0½ÌNr>¯.FòÜF*`=/#5¯(ëž.úÎSÛ>±\c•ÅZÍéçµ—Ût×K…R|7ÅÃàóh~–$ì¼V„ ÀY•ÚN¶Ô}!Ö|‚-9jÙlgio3A(žFo˜#7€ß«¾­‘¾”<$&Ë}jx¦ž6à:´ûH_d=Ç€-n]Ü©˜µM3!Æk €Ëê¦ÀâÄÐ̳ÃU†“€œ1zÎîe·XË—‘‚FÁÏü!ËTã}=ûQÇ>b÷C6¯eÀ½^r¯–b«ñÅñªÄ©fà^€au§›>˜·‚>£}F/úßo?b`¼lÂ#ÁáÝ™.ב¥.“ÍwºÒ÷¿šz ôdÅ‘HchøFìfÜ4çÎñ™}K²;½å”´êìW‰Cøµaß²9àçýî36i—FùsK9~Ï—†B6œmÅ^gFâCÊ(²w%;†g¥÷%w„–ä10št„‡C xF9Œ®Xütäˆ XbÈVr$4ïmÛ´Œàã88¼Ì›º——Ï‚uõ‘åzÒÞkÓ¢›Õ†RdCÈÚŠMª¥¡a< pFÜ‘<‰ÅñýŽÓ|èzÇ QbI9ÃàF4. ¬—Z)KQŒ9Š’f—ð 6Ïl™@¶m@vžãZ°H»nr‹XªYò)ÞOÌéQòÙ=1‚“ N?¡3d €*Ñt ä:„F òm¶cèʘ§éN|,MÙé²v›˜Ð*‡A8ï·ÊªU¤»E Ão€ö¿ä3§IÍû$ÈUoYÒÏ©;ôÒß#>Öôe^.ƇWµ­NO¹SIRÚ#mÂY†ë£¥¾eIEfÚQ|KTþ–0ÌV·62[æ¤KÈ?Œ3 Úò¦é3&€^tÉs>ÃKm¹ÌZÕ[̵uâÍ¡xËŽ‡üõÊòÑeo›¢¬˜`ñ3àð–ýk‘¿t€Q¶Ènq#ÏuK6J{öµ%Ó•{€ÏSlïÙÿb‘Qc£ykl4/_j\()˜#%g÷œ>‡zÄiã` 6ÊÆ %UÆ*Φ3à²n”9qüè¯Á4âÆüaðˆ*SÚ§LÑú£{qÈ~϶⨠H0 ÞÞlI!#ÌJ=Arº>SØzäi!ÁóPððzBú B°é ùKȶWMr¨›OÎ&`÷fˆ{9¼ê^ ït¯^#-ø 8˜Ó.!oU·þ&þ¦´ 7àô3œJ)rKîªÍC¤å11ì¹_¨ !nƒ¡ú—¡K©ÝË/™*¦¶,¦zj [Å,ä@Ȱê0ºò¹Ë¹kö´ÝÁëÔyê[¸6çEd1d‹Ò«Ç˜ÀÕþÞPXpCÅtvZjÃ×-r躲gÌá1NÞ¿®•q¶ÌܲºN1ÉÁêìÖûŸ+’9Cd‹^¥äå {ªË:†’u%«–Yæ}ÓT^ ñ~ƒ×<¢vkrZ ޾·ÚƒžÚj£¡|õ ¸§”ã~L©Nz›úe7Qs 0<ñy@îÔë&@í¤<κYL^Z_(OœõŽÇˆ€ß|äÝ.FZá:àq“¡”áÖ3s÷%XÎ<^ü¨mÀ2}޵àUl´ORm,ñºN§?1¸®áí«@n+„zj{®M›á^:Å»`׿7ÍËØ?"×\ü˜‡ÒqÎV 1c=‹:`¢ôr«`Yº-+ÿRø¼ëKÈÓb8!Ö o«~aÞÞîÞ:j2ïxË­f;ßÚü!r"­õ`íû#¿Ú÷Ã7ᣴÞ™Ó¿õ'o8'¢½£v_‰"‘‰I (öä8òZÏ]»…pFÓ§ðÍóà¨ÜÏ%Çsñ‡sGÒâÐXß=Z ›—Ùà¤ÙdÕórå:1R¶”î½¶  Õi[ã)¡úIÇ®W@ɬg(<ÿ`Ÿ>LU ÛGDø+ÐGYß÷žr$]l¨Rí RRh EÊ¥{áÈÇ`áâeCê+E½_{¥ßD§ß$$ø8œ$ pN“kzlsøl£5>aæLQƒÈ€çaÿy­Ÿ3=Á­wß}D"òωm'ù:À*ÍÆ@vo¡–z¼kDÏZ=TÝ€$„Œ@Õ#ð¥¤Oœ´¨­Òèxcr¿ €(¹ý°RvVM÷ꉶ¼äáU2Öb|Hos/ ök=ì•O2(ÿ¥÷(Pœˆêœ˜ÎãÈ{¤4Ÿ(S™nŠ@V›)K°=`ªŽá 2œíÜÅ«d_ou¹²eƒT«ø|5¨öì_Ò}jÿÌddâ=…™ŸâÍpñðßõ]:2­Uõek( ÕË:l;ƒÕÆLr/¤G!-ú»åbXA$®–c¹5ÿþšËÈȹˆ¼¢°¬{„n~8 d÷"¨¾Òó`%|ÅtƒrlËÿ:’}Œâ³æŠSr4˜A3‰lù¼¯ÏTJr1M.¶—‹­BmÙc–…\ K8ͲÑÐÁ×-ííèeLݽ\õ™et&n?аZw} Øø¶ÞäZÞh€Ú!@¦ßd Gj õP9DšÎÈdéPpXl Þ3-Ò:ªµ4¼Ý½ó4›u=ÔeÓ·_톘†,nèf´æè¯äøHN>ÏwŒWØy„]–5 D5´ÃCpmÏý›àÓ8ªÊR6}ýûQ¶&™_Ó÷c @ÌÛHÝ£Y!VjÉ]« ú…ÏûMùv#}[bëlÒ C¯Mïs‘cþê¶ûSa;´?ß…¤ß—RÒ‚×"¨Ó‡%ã|>¢€òQ‘PÅ‘õ^¬5÷,û «{@þôÜÉs )FÀ%Ά HÎÁ®—ú8î çbpäV§ ¡†xó´'›Õ¢§¶AZ§de…ÐCõ-Ó([$Ï.-@ô:´ŸáIqÕ,7j?x[„ðâ4M|Ÿ¥íR8O ^Y ùý C~ÎJ~_žhµëÜã`ðj§$¡ÇÚ¹žò+½zÿ^øföˆ—8øºŽ:ï#Â- ·ñÓàô¨"“§-@&¡9§s )Øg¿lä[àÉkëëà“î)§»Lȯ—LîÔÍÈZRBøƒ5ï<¬-%o/!ÚV/i>‘K˜—£xÔ€Ö7ð2`|®{S&Õ×Cï¶±ägµŒ®wËÌçx’B:_{¶Û ET€Á(ª1GY‰# s¤ït¬úªCzóÖ!½yùº1rÍ-ëàìµ9{TÒxbEC;;GƒØÎnKºô܆KÒÛz*`„¼Ì´þ88Còm½H§y'À’ãÉ})·l”#ؼïWÐãý ‘uIƒ€@¶ÓÜîmǾÆÖT–-éÒªb!²2ÄÃ@ÎA, ÷¶ü`3\‘ àÛXòaø·nȰ°÷œÓÒê ­*Û“òý ʦ |¾œlH›—@+C®9”}”:ÉõèɨýëZNŸƒìïݘɫN} ½gªÕ àJß{ö½îZžˆ\*%Cò¡•…Ï¥ÉT¤ìQN^ªoTVbt½è1dï€Ûiþ¡˜²Ì? ؈o•fH*Nu]®v¬A Ηw—˜C©ý~égêa¡Z$y–œ: '¥:سÚϲgÓÄ#X‚Ò.äk“Õ·ÁÝÓqèöçÖ Ÿf5käÌvÏ”gC\1¤¤b+ÞoRŸ“^™Q÷Ì.¥4D‘™³Ž³“„Àäçõ< çT^z‡ñù,Q)ÿ»wÝä†~-ûîºï'OÍÙÚ#ïgQ\õĵÃÙF×Y•Kv£õ>;¹Î™ð2äü Ýq/HöôÀû6›•Ä‘pflØÓ`ÎX@Ɔ}tg¡a!–‡Óí¾V×yhîÇSŒŸÅsù,“ÁZjdK¢½Þ©DPo©õì+:ϾÊ˳ñî‰ì‘ßrä08ÄéãC ÈXõ¯ƒ}U*cZ—Ù-¤ aÞ ð â"$~, / ¦ZË–Jýâ×xí´ÏUú_o•5÷Z¶î}â{ì<Ó÷¾ "†©“Ë×2¦ÇXïFÇp$ý·n_éÈ4³RƲÆ8^,ÕŽ` ù¡ö¤Œk†éÄìÛø$§Ö? Õõ­ítkZû€­)°3¿e§[T @äæX`ÊÛtZ›T­ŒÁa¬²£‡ÕqטŠÔ×û»Ðpª?Ö#›¢' ¹•žÂ&ÎMݵú{t¢U£ Š[D€ÓDôøÜÖ`m¯V³Ziד2~Ϊ¦CUk¢v=˜uú˜„¦d<" ò+"Á¤ˆ›jkæhôѽ0H)JÏ®‡²ûõ0­äfÄ^¹˜ø¥ž*Y¯»0Q^îïšFy¹Ixdyg•—©†ÀzK‡7ù@åCd[oqÙÅÌ@aPÍZ+_Ý·s9ú£Éƒ3à÷²ø9ÎÕí¤ˆçƒŠ‘õ”$,`ŽzæbÅrh—ÐZéHÎHQ 2öSÔ»#-ÍØO™u3ü€0ú ¤åe¬_zdþùž=E6ý< 6¦Ôsb¯€Sv$ÖóeŽÚY‘®Ðcñ—0j}| ܳ½îØÌ[ÜÜæuç¢Úc’Gã4¾a¾'t§g±§æ=ô|c…œ!%E€ë}Ÿ?_â!ZOä²Â仿jñ¾¨Ë믧—åó, Ù“WêæK‰4öGȸ–Iî=l~,%d)ÙüDÞeu•~Óì¹Áªöã¼Ç1MŸ÷z8²JÃoâ_Ãß—Ç–82SOk›š)?Ç'aøò>7-šq‰‡|€ìÑ­æŠ;î@Ž­ð¶{Š/·"ú ïˆºAµN¯CQ9dyø8Ã2 àu[nÁÑsì%z|æŠZå]$Üo Û}ݧ̶9ÎüäS=EǨ%~a´z|½™¥›aEð.Té†u ‡SfÙ<É1ïñq\ƒÈõøTk™Ï ½SgLÆÿýß?öbë?pâÅV|ÒKtÆXNJÂoу[Ï Q@6K ü7î¤hTRDGRlI’KDCÉ“ë%¢y>òÞ|C50oó*ï‡Âð¡ÃûÝJ¼ÄÜ<à€CÑD~´,}BŽÉÕ‘hcm§,šÝ·M!˜:ÄÜr>ðC,—„íûBbtué1N¶“Â5Àt?¤E«}Æay?WC~€¼ïÄ"àÚ "}‘]¦¶mYZí¢=¨,lHZ@Ž{žƒ¼*°ž8GPö ÄÅRuBuƱÎ7¿!á%~ì|Þ–{×Ó«Û•ÿjh6'$ŠÑx ÎêÎû=ÀÕÕÚÚ±‹„¤ y‡,sZ1þ/㼑ì²âž¦Ó m-`ð1l>hZ]m@¦ÕyÀudV™–Y„X5\–!0O_â&Ê€‘éaŸÈd[Ó‘ 䈾8Ó*%V¼Pƒx ¥Oq¯þi{¬ó÷¹üN- º¶„´ç==ýèŽÈò¹û¤VY¤8Fl#€¼þ˜+š2- æ•õ… ÔV­å%û@-®vpíÑP¦2úFY&çõfÚ}±T‰¤Ð ú9¾U²WáS&,½h$_*%«È´ge6ºUd²‘¼òÇe$áSðr\a°Á)µ¬Àò*ͬ°Ýå³ï¥™%¾@NºÝ%rÕÔ†Ïs­B =iv e+e¡$îP/Û²q{ìÈàéZh@¢¬Ë°³¹Egßù0†6üXAÄO’̘*~(Ÿ06àÇÒœ?dZr{ §WÝ{[ü©#d|Ù,ioHŠk[pbh¥Ò{h|Oueä4½ XƒnÌÅ”<ïWz׌v—ÒÌ}$_­3ôž}>¤€ûeQ&£|›1KŒYìm6ã*±H”XâvRJE_$îNœ‡ÑÔßO†t‰Ó&Œ>•ÍKÍ×O¤‹ ˜a«þ ïb^,û–°K*'! æ}·Hòh gE}µ; 7ïÛ«·Ñ¢ÚKÉLki€=ÐxBü!8µ];$Ƥ˜”Ë­ôZ*]RËE÷¾•dsTÎÒ`\÷qµÈÓòÎóÙ£¾ó‡„ßœí;ã¯IÑ“e…¦ü¶@sõܼJm^Ý»Þ3Ÿ>¥­jÞÒ7œ4·Í²ÜŒ8¡GM/oØ–êñÌWÓÓÛfiñè£ûõM]#—xè pˆ\õç³o g%¿ÚTRÕÒ–?^uÂTi·‘ÑzÎfÂ3KJc퀼¯v=bl $…úàX§©XV }Ö:MG—òÂ}9´?‘©OK¼z˜R©§š¼oíoŒ/Dôvë„”SN䃤à¨BïNqƒCK3ïO©Ím»´:°®/œïÂþ2‹µÍiô½E¥£eÎ+ίìA¼®q~dÌV 6Â¥Ÿ³Õg€¤Õ&ä#=yäWrï‚÷Ò”ø>cà-•EM<"58¥Ÿ÷UžÔz¡ ˜xZøä(ŽáH >EAÆ{öæ[Δ%µ€lNûã&,D¶?¸Úf]hÀ¦hv>i†ä$Fî«“OðQ“ËÀ3÷Cc†Ì'd€ x•áÏÓ:!©” ¾žcµøÓãõð÷uDç#ºõùá#ì<ÂúFP¢¬U€ ˜ª3(UÅç×3]¹¬®gº,î÷½±5f¦—oè– šŽÐ¬Ñ:òÄÞÈ݆¥º®cyùº9ÊCßøÌªÌ½Ñë©ÒÒ».CsF”gŽ¸Þ øu(×qw]ŒÜ«ÇH3i™Îx?Þµš×eÙ1x?Ÿí­{`º^Š>î٢؀Çýê”2]¯N!ß'¯@f,Ší9àl‚É^+Æ|a½ ŽuP&Çêã=‚–F¯ÀÒ¡Üàoä±]¥d:´[ÖÿÒô´j`¾2`urç$á`>]æ?-JLc<¹µ§i¬a‰L§Ó²ÝÊ$÷ÉfËÊzTù\€CTîå«=­ô2Ã&£Ÿ"§Ù^·u„§ºÞܳ¬J´1-*Ô¤*Ôcvš±ÃŸÈœÖòaÌBÆì¤Ó;¤*±—ÒáLL²5îbŽBû2ërǘïW²Jö1Çñ„õÕæèeC)†”>ïû=Ó»0€æ]Cæ-Ü$ìÓy|”·Õþ\l~`ç¨)˼ëÒ!@‡(íõy\œ™qqÐx¿ã…!=8ެ·u dGÀ’õTOß6yÍHï¤ôðe–aåûÕ¯øñS(œƒ\{>oý4ùò¿˜fW¤C!ËÌQ|̶øpäV Áô’mۇǒ:•;âUÞ# Êt¿éH!¹Ðï·ŒùÅBŽ \\, ö#“Bþ2ä{8ë<‚‹U¥† ÑnCþ7¥93Ÿ1ã^÷ûr¬§ź'‡«Ø)OÆddÀY}ª>JûQ”u\mVî£×ÉûžøšFd ¸Þl¼ž£¡93 ´†ŒQ*6º€ë¯‹ç îµ^I²'É£'&F‚©¾.©+Ê@¾¦€9ßÔ…NÏrÛŸžƒó¼þÒ£¹Zp,VÊ'ÃΗ¸€ÜT–¦ßK$4ª®¡Xœ¾ä[ÏLÔ²’¬'Í.B,3€ ìjëç䨿@wÀ=ïz¨ Ÿ(õ†¨f\Þ +•þ–ïY°O-öÂY.}D© dèL‘­ì¶l®õäZ{ïXÖkC+/=¼%¥|j\ôUš´|‚à’ŒÇ`¾D^ÏKåbȲ0zRè>é^u(·Ú^ñQ¼Í­‹ö’€”Ði²oSÌ«¦|¨ dæåã)î2ðÅN‹iª×a8ªæ‰¬s F¥îçAǪÔhÁ €{T “5üæ”Ñ5z®"J/1ǽJG,¹Îmêˆy½(~ÞúZd_5}Ͳ”>8|kл•h„†àdŒ¡ž³àh¥AŽd ƒµWNHR³êÄgcÑ!XZü5Ê×JƒzqÝÔû%|'/ÕŽXA[y8KÎc+=­ºÁó9­‡•9ò´; Æ]AD;àžø0 ˆX ”"´{κÞýÄðLeÄH ˜3Çkµ#[·µ¯,„p˜9¬¥‹YÓœ~Øìœi³ŸFQMŸLoù¿½CÆî•Ú£½¥{õ'±ø]4½Y-ú¾í>çqr¶n  µ¦ÃÇ™–u±Þý<ä 3G]]ûÆÝšO2Ü´ŸÇãõÂI8ãx3°ÿõ€RJþñ<Ù‘Áù ‹}³<ÁùyܾªS àZã‚Û´úê:úêÚ}uõ\kr¹-|Ü/9´*œ/ÇCEç¶×¦n»¶×ÒÐ r8O”˜4Ì#ê\¾Òys’M{]Èd“©^ü äØG«[¢Ü=!#ÓÇn™Fhz(5K[÷E÷Œ(?'¯V”âÇ¿zµ›eZuB;Û¾µÏhÁL£åù ËzïwjfÇIAšŸã®`v6|çX –(|o·ÃѤ—ÒCN4|NYa m‘º“7Ø` ¶6l8o¨‰6ÃÅ|nIÙ Bä‹däShL©5à ü3j€1¯†—Ü;ÃËî]áóÖä\—Ì0ò{Z¢•]1zHûšÖ}©ax±Ÿ’b´,çÓ¾ç¹U½ÞÉ¥Fà×”ÚÛÎmdÁi²p2;i¨eÙëºo¬dÇq†¶W&Ìï³Ì‚|P'Àò=·ÒgF¾Žüp2 /¡^É×ºŽ¾!íhnéGs—a{3÷Z7÷ãÌþ‡ëŠûž:õÙ¶ñ$õDC0 8jŸ}8ëÕ_Áø)}"mWoÔ~÷F){‚Ç7åjA 8ï‰Y3 Ù£‰ÙœÏÃzÅ·dÅ…ŠÔ³+vÎø²¢"â.Td5|Â,-ú°D+}?ÞÏf˜tôº¿·î:GÍ?õŒŠWçí"•`~TmÍãˆNr=QŸÏ¾^­BF¾D#!—ÜoŒ‡#úJÉ9` j„ÄøaÀÑ4K¸À ~μóAì™ùè+Ÿ!å2ùm.Óóú>QJ\¹=ɸ35±z\¤ÇÇ‘z£IZ<™ ˜QCy6X¢½—ø}‹$F+køhVr– å%ôû"µzýÕ=JÔòZ8+J´ßvÜ_Æýdr«1<.!ضÏ;CÚ$g?3<§ ¾mÙ#XÞÀD<ú¼?ÊóÉ®J»?YXù}S [¯yÑhÙß«Ä*¶¶o-·o˜,µÎ›2 K‘†ˆë­_ÖEæ÷¡BYyUä‘é±*ê@æ¹qY”âóeÂ:¦á††ÀÙ‰ýû”>×ï§R¢ !Ge+ˆVÿ:‘·ØñÙ…ÕÒñƒé}q,·AÀ÷mЉ”"7J³P€GT;îq6‹EÑ~#_Œ’ý[O+\@Jw³ë{¸+uÀáÞu?½øFjM¦âvYú¯Ëˆ(}Ÿ·Y‹”¥çTLµh¬ý´—, â}!ReÁb?7/ ø£Á^¯ŒËî'Í3ýœÝUbÕñÜ£°â}‘ Ajf/¢™2æž«”1“”(2ã{-Ž£¸ØŠèŽ<ž]«Ìò¬W–G=E°¤Ö­Ù›<¨uÞ¤ÕÍLêÈg@†¤êz‚W{¡f)›Xvu /A_‘D$:DZoªgþjt3fžÙ‡•É@æ`k¸®@ö`fc1r‚ø5Y0«§Épl‹kÅŠ& ù¾-;úÊ÷ÇL17p­ÏÍgK–”Aà|·#[ÉVÖp®bÀÕ¢†sÆí` ÷šc ú‹ì#v0mñ~ ¹rw†¢œ»³ñÔ[Fkœï˜Vב–R•2Vp+K=C‹•ÃÊGZ,ÎÿKæ`‹¶æ-Úšw½‡¡Ñî]K<ˆÏ=/äB¾žªQ5úŒ¶à˜†ÈkMÀ†ŒS¬ûqFm9,!dÞŽµ!ÄpÚó4Ý7S_>¼ôœÛ\Û‚áGl›ŸžÚ—uÑ÷©wÉE}£ÙR„½«ØS68 Ñó¡KÀ d,w﵇Hõå1žì§è‘Ôh{ã°D£>˜“ñc±l_wä2㉚7 éR{ûÖ•\t ‚Ö·ÔV[ImÇX÷=\ g5g÷«ùÀq]©ƒb,?ñ#ˆ:"=êÅ2DAj>ô-À[X2e|íóé5„ÕlD²K5rm7ا(; |¥íã©ìmʉ‡¦àp‹Úˆ÷Y@fHwä2û“×[€k³gné³ï{hÒ·YU°y“¸$jb=~üâ!QN»J¶|qÛSýjdzü€ØòbA¢àNü, ÛÖyÑ—~$¾ŒðŠ{)¼ê^ït¯„w¹7’ê{§{)Ø‘JÙŸ1'ý×ÿþ‡?Ü„78nÆÇ-y8@ ˆØáü(íÑ~ßðn¤Réä·H0c% ûµl§¢ÆÇDã7‹K(Ã8 g¾Ê… vƒÿœ¿øVT¸Ê d!’LϧÁép@‹øyÓ0#Ë´h Ç®V«ÊÎ’W„ìk ô¾tŽúÆ!ë3NË¥àV7qÕ³mÏÖÂo5C‚ Yªâ2I6fJŸd³Wµ=J†@Ïþ}º]I#LÚ±ÇXŽl^öŠus]•®»ÚÒø×<¢ U1ðÙJ çðáŸS}$8^ °J p&œ•ÍÖíƒüœáçÕ³؆ÆkPˆQéѳQÀŽ*Wa³¬Q¬ŒW”æpа¼x)VdI·»ã&WúÕåÍ®œ¨;HýZPã*Ÿ×›ÌiÁZ€»a˜òªð´}ßð  „"±éß1àÍí6ˆQ&Í@ï[1q?ÛÛámÛ;àíÛKðŽíexi{^Þ^…W¶w«ۻàéí¼k{1íÌî#;B ðË`zÿ?ÙÊþª‡golly-3.3-src/Patterns/HashLife/metapixel-parity64.mc.gz0000644000175000017500000010473512026730263020121 00000000000000‹ß!õHmetapixel-parity64.mc­½Ù®49’&vOÀøE£ÚÛ‹/-èbz4H€ZÂôs!h€¬¬¿ªRÊM™Yšî·¿Ï=âœÌj)«þ$‹íf4Òÿ÷ÿ9ýÏ¿ù_þó¿ÿwß}ùå«¿ùç/ßþýó—o¾ýò·?üòõWßý¸üøí¿}ü›ÿôü‡üwÿ”òãßüûç/þæçgûÿWß?‡ÇðÔ7ßÿéùßþüÍ×~þôåÿþË7?}ùùùøöÛYžxòO_~‘ŸÏ¯~yþù—_~üû¿û»?±úçþòÓ×_þøÃOú²|ÿå4Æ¿±ÿ¿|ÿÍ/ϯ¿|ûíó÷ÿòü‡Ÿ¾ùúËóøË—çßüñ«V”Öµ>ÿöùó?aí×þoÑCëòùÍ÷üáwÏßõó—ç_ýòË—Ÿ¾ÿùwmöx~õüñËOß>þú§o~üåùËϯþòËß}õË]Jk†>~þòÅfK˜Ø„–ßûß~þñ‡_–¯øîisþßþéßýÇÿð÷ÏúñË—?<þåË??ÏÿšÛÔÎÿº?¿úéËóO?üð‡åùœÌ7_¾ÿåùÕÛœž_ÿù«ïÿ„¹ÿòç/míiŽÝ:øïXôç¯~þó·ßüñËó믾n?¿o ~nóüî &þß¾úé»ç_~\žÿù§iëýú§/_ýl}}÷Õ?óÝ_¾CoèãùÝ—ï~h­~þòË/hòÍ¥U[Õß*xž_ÿð}«ûKÃ^ëû§¿|ßü¦t™ûÿý?Øw?ü¡!W‡þûgûïǯ~úæ—ÙËòÓ·_„6ÿoZþÐæòí4ù‡-×çß=ÿ©} Á÷_¾ùÓŸÿÃOn eÏÿç‡ïŸÿøå/ß}õ}ërÝäÏÿþoþñ¿üî÷ÿáwÿáwÿÔþÿ»ú/¿û/¤“ßÿþ‡Ô¿þæß|a¿ûÝï„f¿ÿòÆ–~ÛÿùÏyþO &ϳuü÷kþû”IoÿÿCæ%¸èçß`ɇÿ[uXà°üFY?üåû?4ÿ±QÈï¿úúÿBO öoû|å€~þøÓøKc¡ïÁGúòC#€ÆRÏ_~úòý~^žÿéË¿ýòõ/ßüðýÏÏ?þÔèD‚®öòÏ{yþ^ùæûÿ³µb¥·<ÿÇ6Ò7a(cW#žF_ß}×(ÿçç—þ姯¾f9ÆH l=ñ¿¹ýï±à¿y’Y*ûÅÚߤÀÚI3yÖŸ^æÞÍû{ÈPúÕèÍÛ@­ÿ[Ma:ö½‘x£o°ŒÞg¸ øˆ”r›ð#,7RöbtÿBª)ÑØÃžš­Éý©e~åûbâ4ûSåÂÿ|" ‰ ø6ûÇmȶ”qi/ kM¨4È- —ÇÞ|ƒ®²óO#>?ÆûÇøü@Z9-ÍÓ'_@9þÿüB£Tò–¯ô³ð7Ê›ãóóÜ‹;mi³QHs|ŒS³öúÀ™r^v_ñc‰éWoË{¸Ld͈ËÛlß ºC+€wVÒíˆ6Äu »‘ Gr¹§0è˜9j%ÿñpPúÎqЦM>éÇÌÿ"È;.#¼º\4ÙúæïCÚ Èêòõ1«Ìà„oH>üPÎŽ¤ðà<ØjŽ­¹Ö.’å÷äKõ…Îã3¿Ò×ÃÁ4qÇØа‰¼4êüv×Üõ0îæÉ›¥~lÜ|@RW—è½G¡¸‡Ù„ʤ ñå[‹›!Òíë1®:>7À¹‰ê\ø ž:¾ðÃD^èÔÉòW@äMDÓÃ',Àï‚?è\4¸Ê#oÜlÈð›œÅ ¿Ì$7þMl*O‹Ø´z—ò9÷º+¨ó€¤aå>ßœN“KÙ9–vL9P¦Ï¿™—`  ÔvçÅËn€RDlœQ„6ŸÔ†Cƒ—•¾B‰Ì:)”'ãôÆ~7®º‰šw\”[Xø€ñ¨ƒ‡¹¤œ—ñÉnDŒÖ„j*·£‚a1Põc •)Ї¥¦'¾|LªPûâ‡7ñ8E{â1 ¿Õ§Ã4åi+˜ÃÛš¦ ƒƈýä—}0«C&ü–’ó0‚ÌHå×ÜÙÖIzv‘Ò©|VÖžÃlC=¸»#{g6"6Ô{Í ‚¢¡]‡ø7¢™ï5¹Íï«ÇÑÞ1ámÀiü\æ·Õ+âûçÝÚútW¨‘mƒ ñ²ØWízëïÚ º(xÐkߣx¡úþM©\Òwc1¬ÎÝ%ˆ“œœ£Þ@Ø÷f'v\÷5 VõèÏuEsv¨ ž–¬x2ÁLýŸMâ(”Fèø„_V×¢ÀraJ)d?¦yüqwvŸ}@ÎNÕÒÜùQ!#E´ÜÉ÷ü«„uô%ó 3ÞƒŒÐY´;ý=wè[£æ2$3ŸÔåÿã¹<ûP>öF‹L{¶É³XýC‚GJ«ªñI ÚÆ8À>2£ôôáئáÇl²~vÑ3^Ñòêuò±¼¬yä\«ŠŸ‹ ¥xÀÂ;`ŽÌN]‡Ü)Dgã?¯{t1€tˆ}2âk㸡^šÝƒTÖàññð¤ e™Òç2ãjzÁ„÷¾˜ì ¿ÆÂ”{¨£ÝMž‡&n„â‚V¼µfv~ò,e‘<5‰¡ü(ëv»%X8ÊsÖvé>é]Gõ&<ÞÐ`oåÖƒu×&ÂÇŽëËi7ÊþgÁ½ uïw©«—e63í³yöéÙ¶7ZùCåÍdÜ/(6ò1A§ÔåÐè˜ÚäzèÖ¾Þº*Io¥â—×§dý¯ƒÝÓYxqÖœ–.¤úœ_ :<£-4`§Í´N·q¾Q¨N6ky3’´bŠXè>8Ý౿^(@wKhQÇã*j,Æ(³B}érqZ³Î㊽¨Ë:_ŠzÅ2ë1Òyçr©#"V{ ømzçsŸðؼÛíÊÃ÷É?áë%ðÔì~ôìtåͦÎP.(æ9Í;,†ÑÞZ²÷ö-€ã±˜2·I›Ø|ÂÈy?”ËŨ6ÒB˜ϾíàO:ÅÚˆ&!³6¯¡z Dx±·™Œyo¥Š_3‡½ìáÔ5/Aíæ>##o׿øŠ_ÉÐû¶ñVïh~÷e|úFÞ·Úixx¹ÙˆKàU“ŒþÉS¯´éƒ½¶ýxŒ·ž—®ÇFªî8*ÜÆYš·R•gœgù¾óé«ÝÉ!w7"BsaÕéÅBìí„SôùÎëþ`hÖA3{¹€]^z h}Ñ¡ÞféË}QõaÆ6-êµúÛHg3çB_Ng•>BP_áïÒíù :º#OÝ û ŽpÄÈòé`Khù0Å'^çöà¸wfèb)¶|ÜšŽ«˜>&‚ð´ÓÚ´öNt±déFêX:Ï}ÅïÛU[,{…”†Õ‚Óf£>B×s ˜QɌ䟱†áÉ7Äu{¦K¹H6·&¼ö=Š:ùLc«—&ñ³Ãj†4½G±‡¡nÄ6¿´¾ÏûVKbê–Óhh¿iËÿ>NIZÆõD¥à¿nŠuÐ{Ÿ>>—ùeuØ7y<ƒ±æ³Ç ºo×ø~ƒí^ý2×½Øú…ó\:…Gçn`Ëï¥ãîÖø¾„×BoÿÎ})‹ÙÚF˜óíyÕjªnM.*Â3o?osý¨yœÔìFþ­é Ç-o&ðñT?hûf–o¦Û%Ü¿ >ù¾Ð‘ÌÍ­X×^|WÉþ«—‘̽| ›5¡ù$¶0Ñcz³ö zíh7ÏÈí‡Ù«Y«æ‘Ì`VÒžìÙeT…“jÍ<û²Ý1ž|¿Üùn>º4}˜P ¾¹ÿóT{Øfß…Ø4õV¡ê%ðÚÄ!—±Òeüüò%j›Çäëò?Á¥ëõݫ֕KקàŠ%³Á^—2›é-ï¦Ö2ݽk6 Å/ôÙ;3ˆÝ»ôI·ß¹o¨ºZPhßl”·ÏĪ>;lœ£h mã0¯=À{+-ï­ûô^×›ÁÃ0±‘7ù¨õrÕoäal(Ù û—þi3˜½Û©‹¹ÀX‹Qö¢"Ä7=Œ&¶í`sp¿IÛëÖ~–ge6þMM,Ûî“‹yÊú R©K¾åƽn`XCÛdt­]K“º·ï¸µ [dùÁò–ê—eª³›5 WA?÷°8\ô—^HÐ ºû¼o ¸75`È•ˆ¼÷ùÚiºU¿%àø%vÙÎ …*ÂãÂï6ç­É(µT3÷F]lÝDøÍ¯¼·%óÛn—.‰>„Å;qð¶yÌšz³WºhxØ9_öµ/‹i¶¾lŸlêÜ»ØÃÎ\“ÏëÎ׋íÑê—`ÖöƯ,?½­–IÆvEiþnà¡&’sY˜²!ÒR'¯t55M·"ï³Û#á)gÕª½'- TîÜc"¤7U]`B».Þ€½¬cÐÉY~„¤w ië‰MÏOèèœÆfŸ©U•±½iZßÝó›xÞXrÔ§¡Á0ØÐ­“³ýèêÕ 5ædŒãøª‚ß6˜¦·åo¿|ÐðÞC°i%ŸIÔ¡ÃòMfé]t°™/cZBaÄ€‘Hø >¥çЮÓs/tn u#©ˆÊ[“)ur}ÓêU¯ô&©€ù·4ú°¯x‚½Ûo•Ìûá¥êÑ;Ÿ<úÁª¤îVUá+X&ó²Õ9õb{v0e­v Z{ºu–™SY祲wj")ößEÅ+Š¢T‹$Êe§×G¢BèU¯”:ÖŽ,ô¶6ðì ¸–å^>êÑy˜ãøØë²cýôYmäãOÜã4 Ôõ9î ,x- EÝ…ö2ÇñP4 x7F«a,¾QäÁïJïÅž”8–¾†‹¤Xº8\ÞßÇ»ËÚYoÚ¿"ï•:œÖ"Úÿ=de³íwiA¯u¢f…ö óø/aí^0Å_ãýEfPw²¾áI¬¨O1=š™Í§¦ˆÖMÖ'{íG“¤XÃz@ÙR=¹èð‚>GÃM:ôó‰i7üÐf½Ž?û?[ªsó¯Óà3Ï^`Óœõì—¹gP‹lî?CÖŸO´®ºg!ðí4PÔÜÍ>yzüˆû.k^EˆŠåø{%Ò›•RÍÂ}‰ô>ºÆê¹±—kö?„¾"Ï œ~¥,Þq$'¯è‘ùÅèð¥ÃGôŸ5Ê2u„Ú«ÃTlªæÙ"È*7¦Ù:ÌÆ}BÙâËI¼¨ö¸'Ý Ì´éPÔK­X ÅVfRÄ#Ø2mäÅ7×~²ýÀU^äb×´Åí¡H¡ÂÈɤsï4šËé-XQ]tñƒ¨ªÏg—´“’©®×uc9ÅŸúœcáåË­›Ó?RÉ£“k´¢Ü@zÓÐ 0³ kù@>G›exfìåƒuÄ >æ°\[Ðg¤±L·>w’b”ÃA»X³5;=9i†Ù¹"ÒÒ°[ÛøSþhÔ¦bØš.‘Ñœkƒ_LÑ)æ;gÄ?zÂÜšY·“Uœ»þ}ûTGã¿ÛNŽ —è.”z±Í¦óÏÒ;uk}ˆ9Î&] ”"ôˆÊ<"W‹‚ÓáXñgl© pCª _mdcv¨/q'«SÆâ$Õ©Í€»Ø¹? \ŠÿÞy¨´Nɘ›mË$û WXt#¬»Õ;åÚ·±~š^Ê–ÏŸ™¦×q‚ŠWú0›= ˜et0ŠÚ(y&Ó1‹“J—¿ö‹ÆÒ©+ҹӜٚ½¤ÏiЍê]ºy:»çÏ.aF¡Îôìí‰e,ëëÔºe¶;5zç½j‰Ô6-&f¬H…âl,;Ô¨at/29ú0ÛIXÑ6¨ƒ‚$]Ò Ý.÷¹.sÐè:·  ýCšŒµCOJGs<+b̨¿L>ÆÙa>Ïæ•>Lv¼ù=Ľ;ïÏ»‹¡ç#jÑ;B¬BáÄrÐ&(ýj,¦ÔoÒÊ8ô1»ï×0OöÍM½6Ã\Ÿmß]\fï©©A×ù¾?a3ŸìøÈäF ŒPêíÇpµ¬é‘l€uÔ=>± zgoM0W–½åÍP·ÚNoËKù/XpcÅÒ‹B˜%ü ÏÇæL$tyÖ©/L$˜0CyŸîÃôþ2÷à@, Â"ëÝäpiiK43'Âæf„V·@µLÖ…¯ãÄNÞ–=¹˜ñ=2-¾I¬G ‚“tà@´”ñåÑ0¿Åæ÷b÷ofy  ç_×½ÕHKÝd³úi˜€IÅiîróaSžç Š¼»G_‘›¥(!;K÷¿ ú -3þ‚Þ XxÀúýËh=nR?sQp VÓÈn³]ïT=9½-iQ„Ê]7›½4ê­ùìâJ‡}ÙØ~R Of™.K‡Ÿ-~6½«1ãÒú!‹›;ú¼¤r²2ûë@ÔúÉôç©jý"JÔdumÓç*˜¶6sÄ%¹zº¦å·Øù¡áûµB5 +)©ô­‡Q¿ÖöRÅUcy;Ì.ž]@š¸4(ºhè!ø´ÎAéY«QA„) ÿzWN=-”©Ó²ÕÌþÌÜý i¡Où\nå‘Vš"sóز{¾]Qrë÷WZM—è¡ÜÄÕü2§Å“·‡Fõ¨èŠ”;ÍÆ:]§ÞÝymØùÎ,Ç¥«­4é=«ñgå‘À>}Kàz¥´Éù±Ïà¥ÙØÁÀ˜·Ï7¢Ý¿XÝV0 Ù—[#Û•"7†}(¯ˆ‚Ôÿ*ñY³ðx]U÷6ù1½/[ºY¢Ò½‡\7t²ŸbÝ•=Fäf¬pêÜ—ª£>ÌçD*Ð0àƒO½Ô¹à¥¼÷YÊœ ù¦¸5ü]< xáëþÜØIèÙ Ÿ¡_Ks$š>í‘'¥J´žü›0d7ô¥ádnÞ{g«%šÝƒ—Ü+{ðJ¯Á¶¾šW𠕯 xDHØß—â[GŽ vE/Šhš_*FD„j h EEÔ;*^H ÒÛto;´õ‰ô uÊ•œ§œö;¡|Ðrœh˜‚ò³íì-Æ.b;•‹ó}fW .'¬Öçf¨Mj” m:µËÜÂôQÕ ‰úŠ†Æ ³Ù ¦¦æZ‰&ÏìÏ-½b˜É'åo‘ê´hâ+<ýp•éÊî#Lû=ØÐ{{,Ñks {|'adîé"½› en:âäc…âÙ‹|·Ò„Œú§=vÝ?¥C›>3À~ú1Åôz˜`/üÈÎX¼Ñøð£OÈ({~?uµ³Ív6C:ÆÆˆš¼\Õ¬ÆÔûìr(´dÐÆóü¯yPŸáúâ<ûow_œÐßPì¢`]]&E3@k:),óP£†Ž$=ÄÎŒ¼]ÜYá4®c ËpÄö¼ÕÀê£ù³Ì/åÕ#põËã¾xZºâ‰ÈuêñÒ»AAÐçkÂ}W ‹G!–§y íâgäcc®X>L¿T…'\;Ô+—ù>y|Ÿ%V3Ï #é³ì³Cõ2>JD ð³uXÆnbm òkîúâN]øF> Ãhäæz‹àòPÊlæP)Ÿ qH5æ¸úûËèTX£Å¦c´é^à.•ù¬‘·ñΗ>j¨@|gÕϾ¼²8ÏÁv¹Ö™†«pÞÔ¾VFj|xãIWõ¦æSþÁ õï¿ëŽœ1ÔMjuù éê0ê©ìßd—ˆ3‹AÐÑÞÎù`ò’[mü+–Ûc¿Ú Ö\íãaT⎂Ú꯻kˆõ(¨lÅÆÆ®rõ¡.#.öo™ ùá9¯FkÒ§Äl'ïP&x#ÕÞ ¨ºXmâBŠý›×uš Ú.<ª¦ß­ÇÉõ‚8/^fÏ;ŸNûû¨a ‘7. u²³ 5o-@[aw×xº\’ÇÂŽšÔØÉqýe¥¡óPªÖËdSÐ äá‡ÃÅ)Á¤Ÿ UY³‚ß[š»=OaäÈæ³ÂëF±£ØQºW öè³-þÑÙÌîiÜdÒÈ9tøJýÊ,[X\ª©7,‡©Îa²qÖ/0›  ¦¿KLi>™Žœègd7ðýO êÉuÕìÚ`š¦]Γ³/çf³Ç†²ª¥ƒqv)d ð#‹èXﱄ¦¦0C;k&Zy]¼Ï‘ú¼}ïÔ:ZgÓÒ'ûZ‡¦ƒX è½QÆÒçO‚Ö[tÒ8Mð>¥]¬px©š¦®”–y~Sž˜¦Þü1ÂØÆ7ÞYÞ Cⳇ—ßúð´˜È7 2‚ʉu t=}¹áe—b—A±6Ê×¥‹ªˆ€9ÖâcÙÃÓ|ïõÖêN*‘3^±<ùDg/Ñf[‡Ñ¿ÞÚsCÍkË…ÄòXtæ³#,àxZ^V7÷«ô÷&cסù€åùö{qëv™£µ9lh!a¥ËîX³H… bMÀ÷²yÑE¥q{Ð9³:÷«~£[:1‰\¼Ç‹¼âþ-†ëß4ŠS[æØæVæåÍ W'<ÕÅèðÀ´Ñ²ci6áÇ8 i§W‡eŠ­"YGEšï·ÌCo!ÚÉÖº˜>…ïo@ÁëæÅGÕo0öˆDÞ§å^í¡Ó­DÏl‡^¿ÜDg/~g§0€•A^J,Ú¡qâÙ Þe¶í5RcL«½­4hÈ9 aØw: ʉÖGXfM`q®.þcä×ÙAw?†¶!éãÖßòþsiþL'BýSˆC¼¯ Ͻ£š)N{Ôýç0íŽé)„ÙÇÆK¤){Âëƒð\”ä——º.ë‡ç¦²Á… h¥–ù6Ú0£>¬ëŠ[óÉš§±¢C¢ï¼ôúNš¾ªhL à4¶1H½ñȽî1öê>yLŸrZèÑ”¡×»aÙ‹{xIÚ:• é¥Î6&ë—¨X#xûø±%86Ÿ?Ö§<¿ÎÅqð®J» £¿i3Ù–×Xá]Þ‹#—Äz•þÅëß–hìN/=,˲¼~gþQu`¨ØjøpYÑÉÖ?úƒSè"¬dœÃ;qÜÜÒc¹±±wlR¡›íT‰,ºÕg~'Ÿa“/ ` Tj׳Å¿YÕ#°«'cç(or{B&8   ëL0³ ó¨üpÁcÕE©ð2CGÐ09V[" Í#Ì­Ù‘1TO·½'ž7{S9ÝWí£ß‡ªi$Æ¡ò½(ª–®nÏ0Œ¾gv«ü+)2TaKfÄ &¿ò”cÐ «Šb׈SI(ŒÒÅ`,ºÁp¨Ù›½[ù[Z4¾¹ ÂqeÆ!³æ‹+^F”s<²UDûˆÿwî¯~8Hßþ¸o]αóiàê{g¹ùÃlÎÙbdî úŸ9Çë3ðæñ9‡²‹à 0oÂbîO½º’w׿Ãfž3ýy«Pýª“¼ÕÐ(κúǛ֋ŠcoeŠbl9½LHÚu÷è^·¸ …£=â¯(;î-w ,ÌÚ7«M§X°µ£vžocÝ¿D*¿!Úq¶h®H¥Ø*Bb¸r~itû°Êw:ú¡b€~ gh¸oõ¯açðÈ([ òþµv0ôŸ÷‰öš¥sÕûÚ_¯wr¸-nÕv cšâÑŽ»œ{Ñ©ÓÐd¹ñZ„ÓÒÁ{ëøWÅeØo|àƒö£ ž—›€X^»Ñv0ÞŒÖ!*òNøßÚ:’n_Þ·žæ;@Æ F(ï_Vòî_þÍsyÿ´JËÿ¸=ò¾‰ÃzÓaΓ;ýKWJ“óÐÐl +ô† (¢úV?q@Î|o+'ìÜ«ˆ¨—ŸðmJK—ͯ­%†: èÈ]=æÿ-OÝÅÖLï¾ ”\­È3Zü§—:ûmÚÆËG!äKp–œÃ?+[”MCÛ®ß9Å9Ž¿|ÚtÈKÓÄF9Rî‡ð[/NƒQŠÝ6‰u/Š]¿>àêÞ‘Ê»6“³œoU7þ¹?yäU&¼Pè;%Ñ5¶“aÇž>hd"å}Õ½ø=}GJ ÍOOƒr ¢"²ßØVåÂX¼¼EJï,xQ• »Ž(×xo^—×'Ç‘ï¡O«R.Ÿmã-R·d)}j+Îê‹Î0óëS2½ÎQ(¼{`éä2bO¦íÆÏü¦Òûýmà ŸÍ,cQozøEBÌoû{y.к°åÒ}ë×f£LÑMÓ÷úì‰{ãO•ý;‰÷æùQgÜ«B÷4˜Þ,"2üÛU~Àß7¡Þ-æ@6¬$ö8Ø ï›È²{‹>ÓàáŒx Ÿµ7U«ï-þÆ }½íkî=ùÆMPŽ[wï{6x輪óhuXëç)A¼½©éUq·EÞ~áüç—/A: ï¦_ìÎ[».ϹÎ7 d Ô7츌~Ø]í¿ÃëM»¾<aµüö¦·6/âl°Žß6¿ ·Í¦±õ ZŽÌû¸ÓE”ù»ú÷bg`”åþŒ¼iþ¾ño{ö¯ÊŒœP9-˜›lË!Ö¾á•f>™Ç|küÕ^ÒûZ,­µ+ã7Ö³ÊÙ²Be¿~³³Ø2OsXeÐ_7¬¬±K2¸·Q>}àµå@u¯´'ÇÏQM|8é^–áË»‡?`þwŒ;>::Æ„Q ‰·Ä·©øQ»@ä™?øüt™Ã2"Ónz]úû?˜ç]† ûÕæ¿©õ{ }Ðú£Å}ÔüC ˜ÜyóìÛNîU¯²d³·Ñ¿:ox¿ïÇ KTç>1µ©Õв<¢—VqñöõÞè×åÁGOÜQy+ýø¹O çןú×<ôW>õ"¼o”Ñ%â'ký€¾Ç!nx³ë£ÆÙé`Ëî ù^¼|PÜA.FHì¥ÑM|ø7—çñ_øòÛšßçq³Ø;•Þû ËŠñ»VA“½™ØûPqdVå¶Yîe`2u-]¹sQ®6¤YŸ±Õ,ÝÞ˜,X8ëeï]èÓ‹Õ,Þ© ZϽXÚæaç.Ì2–M`¶IJ¡LiÑ™õ_½Ò+zÙ2<°ŒL^ñ‡<=>ý°£¿‹'“O<ôŒæ¼ˆèõbkKGöXH±ö?Öi'Ö»\R à@2º45 ËL4ÎÑû˜T‚Í}ºIk V‚5›‡Îp6ÆÝÉH.²ç^Þ¥sk¯5VØ¡8w¶—=¤yr¼ÜP×;ø«Ë]Ũ»òïqQ…ÒòóÜ!o$®]h‡›•yËÅg1XDCŒmZLEš¦ô_K88J?·ˆ­¡S¾‘Àày#ïmq2 rH$—уSÓë—‡wòI뇂ݱ«™¥F[2–/±[× ‹ŒY™kàèAPzS׳?<ù—¦¦¡¸O;Uع7]æñgG~hjÜá8ŽUãªã²vÎÁ÷ù.>׎Q›R*âc:f¼#U[vö AÕ¥+„©Ó?"X¶“¬Æ¹ivK¼×x€ÇnŸ½Qÿ;Ï÷œ£GÒi»·\3¶‹Ü°,Vmô& “7Àû—G˜B''K„¿ÓÊc˜û]i§ž{u熗&>N§Š¸'‡—‰EjŒ°óU˜BlÔUÓ;ý‡WG9¹»Zixà¾apC ŠEýÛMÓm ­Ïo–rû°7U™Ü^\~;»1á3‡§–ÙåQ˜“í@¹!("VúÒû§y}fêrßÄ„NâÞöF¢s Õ{¨g=ÏÖÒÑý¢yé „·ÀÛßßÚ,.oZߣ<ÑþZvé· Tþ†W†fÛfÚ(‰­ñwÅ­=?´YLª˜âìt†¼?´ôm¾ÛOoyí;ðßÛÞäᇠm}/ÕŸJª{³Ž#ÿòyCÿü Ù»&s6o7ñ×ÜØdøû:;xÞ÷öVS¿¶úäK\hìÍ—X;ëíz½‰O'ù¸5zC/7’z…ÉíóÓþ_ÔYh+ÕÒ_ÒUû÷׆#ÍÍ/Jb„ðG ™çéeM¿öÌ(c^Z/=40Ëš‡®§éå1_ÑØNwûÆ¢—gnõ*–*Z©Yúó 8ØSÃüz ©«ÉÌJN¸ gË—_% RU{Šþ^?ö0õ'~ˆžröù¿¯îÅ^™b[þ›ÝqËüÑ_:õæËã–ÃøFŒ¸$Öæ=º,>¯!B8–-cÙݺ©÷*YªXͧ®×CC]ß/ ÿî¿GD{ûe™û©‹±ÔÐuzõ2; ®„Qj¼”/¦C—âìöçìÞ¡b"0¥¡…i:zg ~é"ç¾¼16åÐךÁë³âEû2tEbìKZfŸú2O¥–þsždB£ÁwÙ>TZ•U ÒM5BœŸ­·žtŒ²ís2À-ŠÚÊ!dümúÐÔT‚#Û™°·Xn‹T"~ig rë6±7G.ÀÐ:BoøÝ‡ïõ}£V˜‡AF‚Ò|]AØØè]›%‚d˜Zo2¶ée¼4^îjhˆphu[ohö2Ôk(j\êKó Æuë‹}m·P|gÀ¡sY·"­{Äë·?rêÀµó¸ßØìÞ*|ªM×›,³É(WŽúoh±ô†"Õ?†Ú[´çqô6xCDoÈå•w>˜ÉÒÉxl<¿â¯[§=0}ÚÀ7)ç_˜ƒõúÈ2²ËÀ®o§6Ý 3»•w?AWh@ée¼ÿµ¨þ(ŸK´ÏÛÿƆ·u}Þü‰¾kçß>iÿÛ¦ñ¦Õ_Ñù¯Ìy”\±~ª¾!ÜÛšòýì>À'«ª{QløöÛÐÀâ2SFÄ(ðüR«l$ý„äÇEeɼH™ÚRgöÝÄq;n±Öñ蹉X÷Àùo²¶Êמ4  íô²e /&jƒ¥-—9dUI™7ë[QÕöF÷ÓÝþ{ð°£®‹yÝ“+‹è$Ͼ"}«Á4½RŽu½Â—Ô¯\’ô×ì†ÒEA1µX,ÃÔšCt©4F]¸¸ŒäÓ{¹føöº«CÿCé prž÷"KѵÓ+ ¤j±'Õ’™CÝ=*0}PnF8“áqž|r]y¡i ë­ÃÌf5°ãðpä¾a*Ž :=LK˜˜¹¼†Pnàš,âÕ¡ãõŽË±ÜdÅb«Ój#7Ãjü0j ò©sø²ÌËò¾áb‰\ÇÆd‡ËÜîVƇª/ôfsY¢(|aDGÖ¬‘ªùM)V¡ nü¯l½|²;qªGäUj»YÕd–ä­x1Q rùVãCy…>ûg ÜÝ8Lü¨9̰?ó¢ý'·fsÒ¢Odûݦ{áb£¸ÍÜw­x·Ž|™ZdD9ÛÎ×ýø†äûAEY|YŸW@B(‹<÷(U—Q~Ôäïó‰²Rü!wÿãUÖŸoXÄ5.Á‹š;¹y‰AÎ ÖN‚¸ÅѨ4D*q–ö:™Eÿ¦AcÆ%¾ìŠörâmÛŽè ¼¸Î7D _B£qƒO}êylaíüïk¥KÓ9ö~÷¾z…YIs_í0/#ö›"œ–pwˆ+îœ9^Š—[±ÍlVûC¿Yý4L`jl\ÐfóëfÊ)´0ÂvŽU‰Ë î–€‡è½º œ(.~€?¨ó)à¿i27)¯Ü+—·dá2ã®ÇoÝ[³ò®v˜¢Wª<.h[õøÇÜ ¦O±ëñ¥ ­¦¸ Jgc4a,î-ún{2/­œrâ—Zu÷c\ÎÍq’]îÍ´ÕýË<ÎÿÃvËÛfý3| Íúœ£_F^ŒíìËôZ&÷vJ/­^±üQ›Ï½%£[ýJ_ËK[`>‚Olöá¤^TšWŒó›Ì=\„ƒnõª oBô{Zê¤æaR¡~r¶‰}¹Ðõ"n¾MsleÚ¢ ´d‘c½•Ò$ØQn„ @ðjû2VÄ5Ïa>¨q–ÁKò |bõþ'–ʸó˜lçµvlfÊl —±H!Ò‹bÐzž7|…²»ñ0NM%ºÊÐùµÆâ±Ü0ÓA~«ì”7uQW¾)íe¦¸Bݽ¹-±sëð„c5UŸ<µÜdzie7Q9Žî8 tÿR´ÄQ_* ƒTÝK_'®á¸ø%V.ïk,t=·Úp:ì¥xq“ÆJ›Ák?¸/q¥wÍj_µãP99Âi¤Ë—ºXiæÃªûü]rÍ#Dzùc"“¿YUT»ïj?!(¯„yèË›·ÏɃ±Ø¡5/o‘Vò"¶Þ-ôóÚ—ê®åüK¬_ >ªu´½N=ëZãÃÖÕûo—w¯þ°û^ õÓëŒ:Kƒna !um˜ùôÚµ‹eÿâÖÇ2–Èn%Ëü¦™9†½P\èØ®Ëú M»Gr(ŒE‘¢4¾5|‘u ŲiÛ •YÉ›FÃr÷Üž"v,¼¡8 øµÇd˜ ¿¾4ð‡¦0/ƒEÞKÙko÷g— ¸oåîTÞ‹—Á"„ÊmÄWYs“1cq2o‹_+>êçƒöË‹m8Ê'»¾†ü÷°U ¿o÷ŸŠÕ¡`~W0`jѧ>xb¾ýÖéÏÃOü˜_~Ï÷ßÓйUëà³™V^ü^M»7ü”àç­@[<îK¹Ív¾/]¼›yøé?æ¨ïSÛzøûš‡¾ Øƒ³ÿì'Áì7aFÒVôžøž}ÿ­óÇÿ±@%¯%m†S/6WsçæP0O}|Á·8¿Q;/yþ°tŽ¿Ã³N2[HJÁä=>¬µTgo¬ÄÑáÆoaUqIS'()5Ü<üùþ}ÒÁ¦Hü=zž¦0…ÖL³þ0HÚwÿÚÅWäºGpúCæ³×݆ø‹?ìɹÿv¤<&‡’<—,¿½;ýéýœLä\v/F “¥E;M¨Kld£¿­¿ø?úr¾!ãβ #ÈQüc²ŽD~wZ›{AŸ†ÍK8Ë+¼BÁÔÅ„Á83ãáøÓh.Ðßì¿bK¨ÕN&$µ‰£€Ø»œºÝà=VíBV~+¹ÙºÃÂý§i+Ð}›ð³o":íÆ̨ïqÓgêb;c½nÇͲKÔ½t§jû%@í¿BM\Élû¯þ3øzÆ”úÛWæ“/Ò˜L~XŒÍ»Xì¿ýI'ø3üèΆ©øsøÕÌ8Óm„iâ’Ó½îÅœÍìe,xg]ü[|‘øûågð^FãUy*üìßÇš¡ÓÞl¾u!Áþ± Nwž4æì)V¼¸GÓ2xAÓP5/ƒ™<Å0Ö4gÈÕßCíXgsè*v6_NÇ0+RÊ»¤_n¾E0‰ƒilÖì¤(œûX¢QU|=nº!›ÅK•‘ÐëƒãÄ\CÍö„;tj0ÌnöôgÇ““J!ÞØ¥âXcò·ËÆ$˜£jüFGÒ¸‹ðyäVsè«<ÓsÿömåÿJû–å»–þmç·³}»¼l[Ÿµ}ÝÒðL+G—ka{ø™ùmë-/ýV‡§·::­0ÇÞSÿÊá7ï`ÛC_[î_K!…ÁŽgÂ\V°½\Ö¸Skå;¿&+M%Žwõ¯gÿz =¤l³Øû„ª•)¤í6nÂ’ D/làmß®ûå+:o“CW™Ý{ªÃÆ@“މ_Û»UoqT,jë°ØÖg“$# H*Û¸> Z Ú' Úòm[é_/kkËÚêØ0dXƒ=RB_D:ŸÙ!ÉÒˆ2‹ЄjŸ½]ˆH¾wø&pf[á(^è0‡¯² ðN ðQög飗CÐh +‘hs{úzfà'§g®øÅ¹°²S+Á‹¤í¨¸xÈw2ÈXfÝñÿÎcFôÇÑÄ’B~^Ì~ô‡wâµ¶V[›šÕ>ÀÖÈdk8Ë×óÊ*¤ŠòžhS7Dø¿É§*“â—Á°àO¥8º®giXÞA…Ù–Œ9;ÃÕ«~²Eµ¢r”bÅ2õÒÉ•äâ-=kn–. ÉSžMk&+ñ–K S]è­³óÔy¤0Š‚2¡õ¸·ÿ7¸ì$¶ €ã°ÆK8¦=#ˆ "ªìWÃFûqžÏ³WA¢[ZZ#­¥Ä¹’Ø¢ >/µÌ©îFøÛº=¯È°9uá_OÃçÞg±­—CædœUV ¹Aër<#®Z(=¢(ÉWh°e#°†@bÚ¨j#>EQÖ«Cør¶Øt-´Öâ+kÔŸmÞWûQmä³+Ë…ÊDÆÕÕÕeëÐT&F~¼.5ª£Uà¥påb²b§ÿÖà âyíÂéÚÇ.É;Û¨ù(–.%Õú¡L¿Di\Ç­£ Çƒ4Ý’uš ®ýÁ ­+•~UÛŽÕžm$NvÚ{_ÇJÚà•Ú´RêS#5Q|€ms#Å-òðV/¹©ÑWc÷&t9³-ePÚÓµ ¯¤w‘Æ÷Vß&·cÎdÊãÌ,AJA¶·©]Ï}e{’‘P`“¢­ñÞm0i³*Ô­Ò÷S¨ñ ù¡Þ„YmL“‘eÝš¤ñoµéº¶ 38¶uZ©Ö†ï­ý>iÑl; jof©Éf€Lm±\kÐç­ŸYÀXÛÄKur]›ÄÚ›äo_,ˆík%g“w 4æñ<ñIÔöl”*º·ëˆ4^ «šÂâl¯ýl¢ç$Ð é²=·±2ÀqD j;I†ÅWZ€ˆºïq9;ÕÍŽcÏíV'Ê³Ó W(q.þ“!rƒt‚Â# =¯ÆRM‚ŸÀ>—Ø$giH‚„q´ª òtƒh vöØN×fàˆr©%]¢ð ƒoûáÝV€Å­ÍíÂÏu ý” Dj´F: ©Q#ÉjoVÊådj`HM"¥¶Þj]gŒTUûl%hœJÉÔ•ýN"xuÊní`Ú é qÅmíÁÚH^ÍÀzpXJú‰÷ÑÞ_Á^ÐÀ@i(N#rS¯Yx¦™ ú kìlRÞŠËû ¼\J?ŒškQ-¹¦rÒ1†çzʇX7ÇɱŽã꘦€"‹·¥ƒ²2>œ 6°9«7“l» £*š™fv…œº Ú‚Ý/±k€´¦ÛŽc'\N4-µëìVÔ$,fÓ˜:?s‰à\HX®ôâ#çšÕJÖàgÉjM„m¢ù–6C¨TÕx·‘Õ!T’©"*¦“]æku+•&ëÖ4µþR=ˆ¶T¡q‘”WCìFû“ò$±%Ìx‘h/@j]i§ç«ý ¦<šÖ:VXRTìM ”©˜ „±> ôìÂmëºXÞõÉFDÜ‘é]mšªfƒØßGg£wë¼u0ò¾—'VvQmߔюfvîÑ<ÛÉ–§È¡ŒŽ7 ˜6Q´R½7É”U|5ªmsÉ«U„9¬©›¦f“dÊÒdsStÔv`O³èF ‡L¤ŠR!Ñ51R*°}‰\I?ú© "P™ÜLB#k-‚Õ*IÅyÊôÆ¡Ѱ®2æU´ZCGãÀ½ù') ­*eH<ô Ìu1ŠÉ«ƒÔ˜†ˆ¬ªŽö ò'mEÅCÞ„*Ìi°6^º¥Y ©|\œLÈŽSeÇÕ´|Ó^”}´\RŠá4mZ”MEV—¢vC“#½¥Ô%((ê€ZˆPw{|§÷uäÁàÌ—H¹KD{c؆ÚÜlþJÁÑܸ‹›9¤5Ef``£é[¥Æ•æ’Om"Mÿ—-"7“•ýw³â'Ú-I 6>´­ÚfÊú èS{79w6KŠÊÿ b 7MZË2är—VÐÚ8ó4±î1€k-›yiµ^²ÕO Aà¡MlÓ&3þ4꺲ÎÔ|fœ'~‚p×¶&¶8 [œg÷všÁ*å‹?MlІN5g¡ój– œÆ¦ŸÀÛYtJƒwR!©{ŽØó³8}Ve÷¦–›¾iAiÄbe—˜ÑjhSY…æwÕ A¦ÇÞœ5ô뎢Jý@ˆ$ÃâKÕTÔ.¢pcàâTúçjîßÑ3Qb¦+ü\XV ׌š÷ÔQØ>Ú«‹Øîª—öDc†Tžgbœª(¦æa«¡Õ¤†cW`nø ÉX+9ÒuK;iüZOj.«jÊ0¶.;Nšl„e꧘"3) Û¢”®<ñÚ€…º>V©‡is¶ð¬R×Ñã.'ÑT‹CR¸Àgœä2=·wÿ3Ó-5,R¯èКè×ÃKy)F³ÙÌÎ30N²ó)²ÃøKùo“)òá28`ÕÊ)´?¨$Z6ÃÔ–gÜu­]T©êlªµ9ljÇæR;2TåÙè¶ / cõ5ï‡ÇC¤kú&J¸óßÌÖ†k¢œú–u›Ù8‰z®ÖÁíØÄºî››÷o¯ìòêŽ@©dHΊ%øø MÀö¢´Á'Ÿ‡8ôxTíZàh=îÍ+M^‰NYw&MUPÍ—³QÞtq—ØØ!ÛéÐzë*»± Ì ªGí×}ˆ]%x7•ÎGbüèÇzÜG8>zmEpí‚)­À{tG±YËÍë»(|›ÜhĈ4ÅlÚjÚ0{hk¸Ç37Zp/@ªÙ±½™`Ù@À0Àš‡Ãq¹Ú+Õ.®¦›­ †¼’Žì ÄsîÆÈ Ôp Ï®’Ý6€teZËMDq#%nf R‚‰ÓW6±àÄúÊ6–Äà6¶h±¼hU„MpE—¥uS’£|z&¡ø”`…8É ©ùJ}ˆ$94è×Ö顦fuçäkƒOLïÊNIj̺Û*êð¹'ÓÙêõÀg<`qp“£184QÃ]#.‰ÊŒ&×ÞQ]ùÿ«áö"RëÿÜ Óo§Ò ²Ø Fw†'“Öiv8d§O©-NClp·º©äNØ"Èn<ÈÐØ²&mJB©!è Š¯¡š q›­Þ˜¢Æt-cRLιÂLbªœâ]pÁW„…1pË8b²Š¦º%Ð7rƒ®!ŽŒD%~A\®v¶Bf«ö;1tXÕ|hÒP<¿-uê/‡ÄƒÔ¡nÄáôv Qê-÷ °Á ©èÔ5Ž¥I‰ØÎºA34âÕËVUö©ž$xVCbûÉq—UÚB(·Ç®“¾bßxmJX¶Ð2`„ Џ ”¹ÛÓÔÊz“ZºU &R¥"¤ç„ <¯Œ-‹±êh*«kÕ¬TÐæ‡S{j+!DßÈRlùu ;yTÌ2Ù$Hk36óAC ”g_ ö×ND3§ˆ¬­F§¢6¢7(np‘V:+pN³ø‚Œ‘+ŒUš5\ÕCÜ+Ž|ÖMiÁHpD º:aPê‡æK·Š}@Þ¸jïtD‚ž(Fëzëw“Í£*5I+ËÓÍåz"Tm‚ S c1eæ[“yE-ë“Q„-“ÈËF«{º\^n WÓ]mµIRõ/v¸1 3Æ>Ä ãùõôm©6É„Å6nSf1·¯µnÚ½ î¯°¹¿a Kã{QXd¨ ³ŸF¾Ñ»è+æ´%»zÄ ´$²Ï†ž }…ÎÊ{·÷šz¦­o‰¬ÝO'É n£ê²§f0,Ù ëÚ¸YbÌBo¤=©†Oâd’KãI;…Åõ„!ºy4¤ì]«6“ÑdÒÙ“ºvýÖƒ°ÞžF#U³7ÔC”"øÊHUCj%`MK]b/ok×n;‡'U'…–åðpâ}Š ~#”FÈ VÑšå’Œ¯¶è‹B?à oS?¸·"|ßÔ"wƒÙtÎ4¿åßj›MXUFL›ã°KóAfx‰'ˆ4<ÚÔN†Y3uÐÞ¥_9¨ŠÒé,æW×ä‡}•'’§2Xb=ÄÅlš‹›7M¯=²‹¶Rþœ$i»hLâ:ˆ²ÓäÈÆX°ì_q9§²XÇŽÛðЩ$+´ œæ67UiëS=áKR˜žbðûh¢_&™ŠoK´Û IÕCñæ Õ]ãw×ÕGãqµØŒêúl4@c‚»¤dŸXÁ…Æöâ‘¥ ˆWÛª`´ê°Øff#•ÁŸÌ9lÊþð&{ô°‚W4Ï 2Z”w…Àª°ŽÔNÝ’ïµ6Öæ&Y•Ì÷¡,[B’;Ä–-ˆå·,ô·ÑjkH‡…й!wÁê,Æ ²¥pZØg 1,›& –D=»«ŠN¾“ é%kD¯Â1lÓ%±7}C>&_í Å2Â|Ц¦˜¿©†pF“K]chÚT!#x Ü< Ñm}NêË@Û,º•Q0¶mfÛM+êf’"¸-1}:J× ª„B’€L&†#Û§‚„¶×PFÒž q)aBJ¤¹ Á]*¡œ½<Ý Jš;ÐpÅåT„¶Ê.zˆî/HVôÐZ† è* ½¡ƒMùmD¦Å³Uµ\ÎöyºOwb—p=±¹ƒÄ W ·h„„=*(jä*° )‘D)¸o'€ cÚÝôËûŠ™fDí»H°ÀÃæ6&³ ºÓ(¼2vQuOç éòа€8©²gÜOê1œUˆÜÝ2Š…;vDÚ¸Ÿ$²‘ñ¤Kƒ[Ù®Lºð/¡ÛËÄyS"›xþ´Jž—G˜Úº¡š™ôE¹àj\MÔ„v6F˜vàšÛ$¢tÛÜ5©*u¹¿qŒù=ºU",'ÛjæØ9Ëí pnøSP0·ØànÃ6W;‰>nª¶MZhZ4 ÿ5§H\a†¸H8åtâ†0[Åãdœ Ë]%l4Äøç†žòè‰íxëå0„N…Þj!5rEŒ¼²cjº2%~Ø”¯¹"øÉRè:Œû7l6B?‹&¾1ú|^02€º¢'-ã³Qº8öGØÌËh¹$ÑA5éû*îSŸð¼-ÍNˆóuë*ý(„1»Ëûˆ‰º%°aw¬­¦ù;Ìm áCb©ëiI HÌjTº]ž°¶±³ÅÊçve&X$à„äñU.Ýþml+é5¶Ž]-×w9¦Î­ ažn8Ö Q]kË„>×=ͪw‰\Úe[»QgC1ÌÃܨD(°pôtaÁ…Û1qǧlùXíÚ¬”Ž P+£È L§á®”r2…« b.j-ÁØßv @ªŒØ]köÖÅÆ½jÒîH\l§ê@4¯û0N•»…Ãø;­!žt].y÷+¦”`÷+É6R"vOÿJaË©Ñõkä1È¡¢•fv‹TÜ ¦%ùpg¤ÑÏ ™ÇA~e¨¾"XA;„aQ !j£€Ã.%ŽF•š×ÔL K¼Ú7]‘€¨úä†ptóçávM›3÷»S23AH•¥—7õËt.O«’“@ž…:äKÁ>6s]Nç<ì]JZ'4´ ÷€ 6ÊUÈåM¶òÄGovdCì1zàåîØKJɧÝr2 .vM7DÁÚïfwË(›§ª[§'ìÏ3ÛVZ¢—lÆÃª< ¶™ˆÊ¢ä4 j÷¼öæéÂॽƒu“ ZÙf[!7[)Œ„CŠïµk¢…Ó ü¼"‰é>ÕíP?,5j?{%½Á¶0ÍNH³âíÃS¢|kät²fjï Ú%¾dÃnE8`mº.ßU£•ì‚Æ»¥ CèQÙmrEg¼tA¸ÿ”!µŠ•bØ h±!RÐ:Åjªÿ$+VعwÑ # ‰º{üp?±J\­Q> MM{—혒Nüõ‹YÈ¡D0—®qcû|F{vOØÓÊô(]nFœŒ«¦Ü<;Ø4”tá3ñ·Î°ƒ³áÁ r™û„Gêñ„öT,þÃÊÆFXûarˆsjèÛ-åj££tµ§Î²o6†?4oN= µ.‘çCC$FÔß*2½ Q}Ç̆4ÆI#‚¦ $Ù ³¤‰ŒUà×úÞ¸É%v÷º†1 m¥¦—ôRuZ= Xá¢* •1®˜¢}SE¯³«&N@¾Ts¢DœÔ¶œ{'"Êt ²O]IJêñz8æ4u‚}+ÆlNÇ`wŠŸr>¹K©Y!0æg>›-¡lâ¥Âä#ŠÄ];dkMí`7ž‰˜g“'ç®Á"íÕ‘©\´†Z %ü¿âC‚F¾O8¬6ؤƒ¨µÆyŒ>îÛ‹yMžÁΘéÑÝÃê§ešÕf5‚t‘†?sß4_4¯Îù¾‹}APíl·{Ž&“X·SOZHþÅÛn9¿[ˆ87æfj)ćk¦•6\kÙYB†‡q›¦ÊÂYé\g´r®ºeÛÇ,žøM³fW€òhƒ&Ê| DaáÐì%G! ã¹JWwZjS¨1•Wè‡Ë>4E!aW%5éдÆK¬úž³Ù3îI;EóQbv¬Ì€µùsì*|¤ Á Ã=Y¼3üa6¿ïÚmT˜»1ï)ηjoúî§ åz¥è¯l<ÒØÂò[:Å{Ü´`lÂ-‡¢ISc!„±ã àðIŽIöü¾ší/91’$¾_!Ó²Bª#µ ‰âe•ÕWîe‚ÍØãµ’ÎžˆÒ%Z’%Ö>¶0ŒT“¦UE§acŠºI× çç€òغ·ÜŒM%BÔ;וéÙçØ,¡ô‰5l4pé¶nç©J{èÎçˆS¢d~Äß*3˜-E§yh”ãÜBóQœÝì8¢ºPØÙ=éXWêüc£¹tqïÚMx¬šF!»"»#ÙO]>Mmb‡ò޳Bv–‰‰LÙˆ +ÜriB¨îN+ÐæN7T%Æ©PÅÓ´­‡; ›†ÊŶý QÁ v¨ î“HZ|8ï¶·¦;à~r›¨“뮈ls·QÌ@\ÈsYƒŽFø¤r‚P†ã`«Èµzº.Ã#~P•à‰ù›4ÛÊÎ õêÛ‚º™‚Ç5Ƀ|è"ªÁŸ—nKdÚÉÕ;‡îüÈR‡*Ýœd?䥎Yñ$+꾲춉Q:ìÁª bª­÷ôTVxc| Wo§ïçqû2UwF։ŞÀ†œeDpðM¾ÈŽÑÙDŒlC•Û Ê¢’¡fîåÑT©«Ôvái*¦zà°e™úyÒt^{*úuPê7bc¬og‚$ФM£;ÌÇ:$®rA–ôqÔD“ÓP–½!.°¯’0\j ôég2¨B%0Óu8C©ÎŠè‹•ÉÆ®Îƒ”¨é•;¹(ÄÂ1# }C.º¸ÍâÁY!âà¶ÃÎjç E|yõ!õ¡Œ¨4Ú^„ÅiT »ÆüÃS#UÉ8…å\¨6’É`դŠq³Òl¼°5}y .Ãì©ÜSÞ(_³ž 'œÁ»ÝnÊY2äv!bPóýhð¶‰MÅÞ=ð³‘!xbØS¸Šé {~Ç%“؇eÓ¢Tqµ%¶žRß’mFž³’”Ú™‰‚„µÔ‘A,g}l"Çîv´WƒŸdÉ_Öof"ìkº÷þôEC¤–#ÂdéÕ@ׯ÷]¢.^a\r/d±7:ŽQëÓ-õ ^MáÇó32*Ru›ç‰ ŸM”å™Y²%êtôç6cß³ÃëGîÔ ºêAð­^º™FãAÖÆuñi ZV?ˆ{Iè"(¸‹Z×÷ÙÏÃók0xÚ¸Q·"KŒü¢IÖZ¨gŽÕ¬.#„pº‹%/‡¹¦«ÓRØÐs0-š™{$žY/’gÌškgÖ3v܇æ¹9¸ íê¶ný¬íÒmàídŠ) h5N¡_ŸÇHЇ¸,´‘}v`“­Ée„G¢)áb"«×Iž=»éÙº®z ™š„:g·L<ö¸¿Rÿm¦a7…˜ááQTêŽTü0zPä+À…eÛ=p³¿Ša¯s` Ì÷‚ R )Óãeó|ê.´è cTÄ7u+é T˦$¬Ä$¼ÖçðxØ!CšKaCr·§ãK•ø—˜KÏlôÙ¯‚€$OðJ¢CVI–ê¹n…¥¤»3Æ*h93CÁˆ•!G†;Põä®Ncf‰È'L‹'r™Ìú„+-ðU/…w'/37¡wÏÔm‚}%¨2†¤.‡¢¶¡"Çl$ ©ç"‘¬ÈÝáoœ¿rÌ‚ ZõÇ®ñÿíp§JèÜ$g©¡s~æŽ&•%™Eá¬ÏϘ(C¬I’Oˆ‡4¤˜UÙӘ銗¬ ûË÷ëÒx‹ˆnÙh(IÏôÀÜoF9Ýr0)ËFìÊ®1/`Ã!Û {V˜@J]ÉÅ3а‹ÙT9Q{ôí­ ›dOFÁMPÇþ¢¢8³æéàðŒx?²†SÀåv›beĽÉœþC"'¹± =’—É;õv6‰5ƒÇwåœäe Ù[%9 eHkÂÜJM¤›æWÌ\PáLYÚhùdììÙOŸ—)ÞL:HbÕ­´÷·j‘ÁU"õ<;¤!–óRU‚•R¹5®ßV?ܱ]LŒÞ 6 ø*Zwlüuhx‚{äà¦fËÙŽ ™LWfî ĘT‘eÏ›‘éç±ö}–cïw>ðØ®¹ÚWWsO™•+ñZ5a¼ÉøÛÁ¤?ª¬ƒÇ4×—uÀ|ŠÇdóêjMÂP ”ux¶¬1•ER’oïÃ^OÔ )‹è»†jãÉ]¶p$·VN\ýDÁAºáøµS¸kHhwK4Œ©/;¤{}ŠTBHÌ«ŸwåöäåK?·¬‰س>ÆôDîß&Ù#Áå‡oýè–D ΙXËG3N¦=@àé™søWç8f&z³s?âî˵‰1¢¬G%e¿ê¼Ì¢ —~nW Ï6ÏtöN¹TG\Tuõ\o];‹Ë¶G¯! 8Jº+Î$ñÌ>â𒔺nãÙQÙèÉjâñ0œ©ë¾\ÁƒÙ4¡-?wIëAî‘ì,èÆ‹&o@¸[Kí‹]¤ÊQ½cß æ B›Þ³Cà‘Êõ`'•&õ8í­®‘: øèZÅï–ý®„X´t¸•#C«&{rÉY˜H#\u3ß|¸†¹=Bóæ±Í*Û_™F6vILôe¸­Æ uGÌ~’°œg¢<õ~žf>óÐÁ𰇫֕^ƒ£(zÚ)gÈ~žÒ²2Ð#›ˆm%’~)#6ùõì\σÛõ²ß™'®,ÀGr’hn“÷ûÍ‚ZEeâ5¶‘Ñ’LÄ•P$Ü€ K8ä´!öÒréOàêfZ¤«Bº ‡¶Y9HR=å@õª'3ÙaqS,êÝ%MAx:ܦ†*–¼‡îÜðn '<ò{òÝšô®…ÀÍ«)´sÂ2"N¤05Ž@š}fÒ$ÏXpS›qÏꃃ‚XÎb5ãõÄìVêæiSc$·lY·ëx&½öÀbœ\©¬ ^²ç<üÀ¹-ü|ÊÆäE5Z YÁY/ii‹ ÷ä$=AERÙ•¦zpHýêLFi ¬(Ô,<(ä ±VõX#…ÄA±€ ¹ðãxö; :{D•û¼à¸øJ6Äj¿FÒ¶[Š·¨¼?©Îêõs‚浪¶ÓeRüÔ¨£Ìvÿ4g¢ËÇ5ÉM.R…óC=üm¸ã…•_²M¯.<Ö‹Ô…CˆH?Ôm €|Ì2Çy„¤æ"®8ò¼¦•·Å0 Wd‰XHz.ÈCdÊwHñÈg•ð–öUïsÑISN‰G­Ä[4†'Þ6óf…„‘_—öÙ¤=iNÏ•)ÊGviÑ&¦€¤7Ò¨c¾$þ=Šú) @¨Æ:’vzÚža‡ˆ—ìF‡ä‡\:ÒåK3Håx¾Ýþ¤y‚{ }DgŸ¨ƒˆ¢]¯ˆØ ÏÇâÆn±˜ŽÑ$oI[­N•[üy¼x–¡èòa¢Áçiç׉~œ«Ò¢PNáÚ7‘ O½ekÃ-)à}½Úà¦Î²«³®[ª$©ªjÓ*ÀˆIjÔÑѹ3i&J=uÆjê]â«\a W»(ØÎ²€r±ŸÏ.¡h Â8Y“lã¼ÒȺÐy€ ò.õˆ ®9jëiXm‚cOÝmP4l’¨cDDÌ {°VDO‹á<Ýÿ”šØÅIïA5UyËö/@{bí\"+‘ãÖ5eÖÈøLhÕu±uÁÝM~…w'Ѷâ¡tÜ©VÍ'D«§lÒÒê!U… 6js=A,׊‚E̵ÚFØ%eMëm„ƒ¢ê̾sué‡Ì UŽfë¨9%v=G6!aR˜¢â+~|7ß$øæ¤ñ#év«rYªk!eb1Ça¡íxÔªÉô@[”F[VáE3½6Þ†½NÉ•2­q †?W³[Už™÷è·"Rp*‚Þ![Ì2s⾌¸U3©ocšK¤65H׆P°TúH“P‹§MÄÓh¤Ø£ÛɰœêB5êztƒX•˜DwĤ…AF3»;óŽx=nAŽò.ÇTW‚úRÃén‰‰¸½vÚ!WéÐõ—¡®Dí·mjuãOZ±WÁÞI-‹À@ÅHeÇd‡j ÑV*O7¬YnUÒ%'X¡O;Ìï® W«š¤Ð} ¿•vô¤6‘VÇ%I6¸g©›þÁ&ÙÕ&‰¦ð60€°c§‡,S—I&·‰E|OèíNnL sp{´l^1„‘õoþÑš Àî‹OÌ<—îP€Â䨨ÈÖídk²k\I*Ü‘¾©‡YkБÈAÉÜ”°qÌc’óÈ«ÕÁë¤ì×f÷šv½‘VÍÊ–ã"©*žý¶±.ÅÌ_F”IâÛÏ~a§©ôÔë<â> Ha-?-NF€SHýêÆÑÞf˜]\™ {õÇíæ!k·ÜÖíÆ•yาI˜r—j">¢…+|&fr°EsÚN¸é0Ÿfa÷WŒß‡E ˜7,Ùë’!Fk™½Š;é”)„»)᪺«ªî@³h–Þ¥:.ÄøÙžýRÌhOJâ²Jv¶C *6‰?ï»Î¾›±—š±Ñoìž%룘Jêý•f:êÌD·+ž„ îY«¦%âtÔh¯˜§¤š¨‹:ùzÿ¦ìx©èéÙ£ÿáš2iñ £-Á\kãQ•»þ´Zä"]º8Ï*òfŒ]C»»)V‚-}T âö«§k¼çÔ]ú‡ß—º+·ËعýÉ]s®¹*ZQÓóã!_åB¸µØoFúb¥h$¬z£¯Ô×-þA‹vÎH‹5N+ãeÞãïCZ÷Áwy¾ž¬‡Y%kWÚ¯>#Ozh(Õç“7¦œÕ=ÙÅ–±ûd-m Çkxb7€\a{ZÊŠ›ÿfâ(§Ž¥ï}éõ¼ÁmíSѤ–Oàäô7›Wé¦O©÷D(eÖ3aõ\û°ÉÑ"Ó‚¨8"ÆAïÛ7­<µM’α¦ã—ÁÄãËCl´ÅÛó²²ÓÐsh#Ỷ‰ŸF{§ù]äÒž‹Û½ý!‹;’ â>i¾sŸÏI¨Èó–-‡ûŒtrWijlô¬WòžNþÉþ›AgG=Ž¿6±ó ß•M9rrX[ÿ‘…Ó!`9ŠS…5Þåãe".¶FÂæé6yØ7³CÍ&ï‹¿7Ôé5ûü Õ‘6Ÿóµ: tì\œÔ'G±LSÒtÚ‡P‹²Æ€ Æ~«Í‹²L®£ 7Æ©kGÀ•ã²ÚüäÉô1Î;VÎKç”d¬­Ê7‘J¶fæ*%Êu©ï9<ÉU˜VdÆh› _ ÝÏ­HÏD&ºŒ5»0qibÇ„c@å&ƒ¹HvÐS3Ç23‘_aæ.9;ôy‰Œ ²îÏ54v>´ß(\9‹ »wv ¹Ä²™(^„%]~Eœ `LÔÅšB¥ˆ?›¦‰‹.œD„Æ¥“SÉ©ªÊ:làCøQ;®)0¯™ÈÊÉÆ»DzRd ³(;Êï.t®¢jûoÑž'Ó³÷ÃA çty'õ«OÜfjò¯‹JÑ Qth©*î¿E¿™œ7ù&ƒ‹”`qY!`É8€H`lŠÁæyK%¯ÿVÉ;J¯4}f¿_®ñŠÉ[7ù!ZɛԔ™¾\{øNŽW¶5›üì=_&vDò êæî "¢ötA×;e(Ó25m¢ÛvÅë3h²8˜hòGŽ’ö‘ƒˆ1&"-ÖxK`4&òdÍ&¡:QÏèÄêsm»M:[㘢o&Ô‹] ´·½°¤i¾þ[„wÿ½¹0èúD¡ë*Á4ˆé@ý£/ìâýà5JóÓy›×±½XíüðJ“¶8EŸäæ¨_Qí÷´³k˜>Ôþ@)ö‡õ›È¶*—wð2áº{o£½–þ‘ù’Øš“X}H¢HIvºº2Ê$_ö ™ÙûHN‡ŠßThá´þ.$£|ˆõ‘W^¸z"p 6yÖØÂÕ¼Ûãr„0é/î@+¤î ¿!^°‹3ßT°ñöuÆâÏb4†É dI™Wþ‚Ïw*ÔœyvYN‰ !'Dón«Ï‰õ48²ÆFy, `¹é¤µ’äê „ï ªò±[×jW½½.o\o—åU€C¼•`â¤rE]7‘2ELGxxi×ÌR4°ò>P;Ò.L‰›HRåùgæœlB'‰‹ÇËW€’tŠí„ðf=’EîÈU=I^ÏÀ¹1R-ÓŒää,¢Æˆ`ÏjnÁN8Xž2ç BV.E¤xë^éŒ6Øeðü[× ù+ÙS™˜&É_U¨!Rpæü‡ì D)S=Lb‰±Q{g¹Š6!¡+]—k>v•¢ê  G”Ó¦ú1å+ª”Ô'Œ“Ó&ûP´C’mÒí3n'È›øE¸0¤'ÐÝ%b1;Çäjæ* FÞ%Åo'©>qSì‹Ûëhüdœ@Luïtù³€)oÁ¼ÇŠNŠã®ºguȬ R’ÒÜS!·"0]²KhÇœjVÙ»ƒK\ÒF3É›ÀJrcö&làç…¨3Ë7hs¹fA@Ò-Ò¡‚DÆFÐ2¯<–Ay]k@PÚÔ:0 ­ê‡dÚ\#E§jÜÆÓcLaÞyÉ­%$;6™D[ð:q}tÆq¾F  xÕ÷)sy£XÈØî £fyKEâ) —¿I—ˆ#¡¡qÊ%GaÓÆk`«Û,ÇÙŸÎìv•.þ2vFžzF¦[BNwJÑ4ÜÔåÏÛ)3»¿m‡œ} »_A05^M9òji4¸QœE1!\g±äÁØ%©hß»ëÚ…+²áòv©asˆ²>é *¥äD~mŽ«!’†3òéSŠÚùLACV ¯ ‡4‹åÙ ¸c#¸ØÚéäʵp`&UñœqWFÂÙ¢LËä†Úh§åD ‹ N;C”`—ƒR”â9 @{äM3ÝCFnœŠ&ŒO3‹Ÿ,«@´ÒB‰7»àêÞ¼ÑÌÌë–FbOGî”’Å.Ë8P@íã0[Â¥é¬% \\š„DoT1£K÷6ö>×,÷”&¼ØÃ¨Ò]Î c-g&ÑAÜ×lËf4á6ßœÄõJn¹g18³ÛqǦ¡â/ ¤ € e¦ïåZ•åðcàæSíàJœÃϼ37¹s„ÕìæLd§ÊÂËûFÙ&é ʃ•Nj$.Sظá'G€ ½º\^“Ú^Yüœýi«“… E"é¼­óôG`‹är(*eë:¥Ü—P…æ’\.Û=zäésn=\¡iª¶p÷ÇN˜$¾úvfqRÎ\%Eöe2Ü…TxDC|Çë4-·iT8qŽErêÐ@yR¸Vcà/œžÙÎn£&·ª%m[×&ÚÜ®ó"ÉA~-…·Ü¸¼§d­Vcnµ`DúÕ µÑ»Ê|üeDáuŹV¥bèŠ3ÈVsf=.†‚©º3÷¤D›éñyËb…øsŸ°ð@º:»¸ÀN`X-þ‡;yÕœgïE_‰Ö¤‹ëíËØ‡w«”Ã|åE嫌+2.:íÒH%ÃQö¨g710r/s¯[„sF ±Í%îTàe[i«›7Á‚I±Åû ¸9‘%p˜Óy©cPÒ¡‰”³: h­Üˆ„Ü“ÌxOY5ª„ÜÿœLåco,á4Aæ{&²zQINÆ·1Ø=®‘IȨË+ÁH¼ûWH©NLã8… ø.#×fÝj†(K—5šð”§:i±&åî³½åUÄëŸ%˜”i*Ó]Ü©[’޲í.»¸I ^Ë »e§Âp!œ‘°Š²x^=H‘Ò„ø"ûä¨4:Pwrµ@IQ—n™‚M³Xú¸C$áNTi ¦ŸºèÝTÂYC"¯1ƒ—:'¼ÍHxCß;ÙM,1êÅô4÷øö"vý!29H\ÅM™éœà¬Uf5ν¤Ò=[œÂÉ!(‰ûà²Fy±µ—*-Ëžq!µ Ag‰•žÁJ9é¥d\m—SQËVæ×‡oÓ•¶»éœE‡êD£zbô*H¶°4Tæ!§p“ MYk8ž·3røµUãÁ¾¶26ÁÑò<{3"lÝÔ½TG/3hÛÅ8Ît°8õši:á-2Éî'wCÓ«ÑïL¶Ër½T³Z×ù-è`¶vçþÌ~)FŸ5«‹^”5ð¸ÖNð•Þ%å䜒;aÇ·&¼X"]\h½0y¥‰GÉ*æTftFóvì7Ñ•™q­ÊB¨8Q•qp+1Gòd€#÷÷Àa: ̘^­ô"ViÂ[°Ì*ÕÄ‘¤„”™³ŒdÁ„+|ÒµKD†&±Ú'§­§)!ßñ¥ÕêÑ£c‰DŠÖΛˆp•Wß/Ä¥¡9¹W›y #nÞI”¦GÎe ¦‹Ñ¢t¤ÑeRÀ‚Ø%z_Ï1 OýdþrHp²¸Ñ”D^Àø…n  WÎͨ Sv®Ñ€Ç5'òRþÆ5 á¬ÌDËL¿*KFIæÜ`(*¹q q:Hƒ¦T‡c!œ“/¼ˆ95y'¢ ,‹PkJfÃìdehHä ´é\ÄÁ¨þ@—©ˆ/‚Ĭ­vc½ªê‡®ë$—Ð|2öÂ݃Ä1Ì6áÍÝÂϼKŒ¯aüLYp2©B÷<ò*¦clå. ÑìÈ»€1Ëô ‰¯½ÙpÚNŠR7ïpí£—ŒD˜tÝÃ¥ŽË›M·®$\ûœΛ¡ŽâFÚ0«]·¦R:ÄUSGUÃdfšœ¼Ä¼öðN¢÷OÝ´Oí¯ÌèpwaÛ:Ýþ—¨•Ü+–×dKFþP®J¥I< ”ˆ¨Ëƒkº¹3ië[2òz–T´MGD’-9‘·Ãíè¼vK?[(Yü8Êg×äEÿTº ‹loèF-´‹GÎ=ö‹Æ ÍõLìV15hDfì¢óxýK™p"ëer†„Ç8†ø…Œiè>Eq˶ìÆW-º™äv ° n µR\ì“. .g3µ9QCrÆ–sº¨™wó<Ù†§ù1 QlJÒC.B³4¨z¾îQM'¼’ÑUõÊûw¸Í·zH@@‡E(<¥‡©¨Œ%ðpËþ¢EÅí¤ÔaÀwn`…æ´n!Ø'¡d;5æ l²‹°1q(UZ³¼í ´PEEâBæÖx¡Q–ô+ÆpF) «n¤ùå’üQ™¤cü%Sà¢AÍP%r!äsåaP‚€I¨BHrµww+Ï Œ8ûzJ“MSí»¤jÉL¿^É&»gt÷®kw›Vf‰³…è"ç}Þ9/îHeUÀÍjîHãÏ)þîÉII§'ÏÑÔ3@ŒïŠÜOWÆŒ3(¨/0ãΘ=<Ÿºj†BæÍĈtÕÑ($2£UÓÀ%ÝdêŒÌó<+¯üØmÛæ$WÉK*W^‹ŒÐPæƒÜÐÈúª…î¢$¤ñ勸–wµz¾qFFOfboÈ­²½#§°O’aë©ð\™ìÕÙŒÀ¹Êf*ÅC¦nk¹!Õb1pÃp­R@Wž’.a…‚É1J‘ØôÙ…)Ì®6 Å^Ʀ™8.’`å»7}™H2Ïrs"©Ê¶Q‘Œî#p·D‰S”3´ûNàU*;‚”8W‘2@T®èÓakMäœ ˜™i§Jü½´k‚¬¹>‰oøÊÝêÊzi˜H4Qõìâ}Ó±˜Ä­ú›ò•PU–ÍMaä]¥•©l¸)Ÿ„õ³… »Ûâf:¸LËE…ŠiA²rÁ¢M®N…Ç<“x&yÑ¢Ùìð3 5lÑkNµO8je‰°¹Ÿõ’×z+CÑ /96¬R› ’È™Š;—“@\Q]*2PSÌ/>¨/m[Tøfד*b½dš{ø&$˜Wâc™Ã¤I#ä=žU¡ƒ6bíulg[h¤í¼Az­¦2‚YW/&äÿä,µbñƒy ijõTÙŠ93Ü¿ºœ^oâVl:qÁ!úÊað¢ÁÓ¤JîÔÁmp@½:¬K‘Ó%‡ÏxëxqÔ–vÜå8TÎŒ2-묑Mó¡ì¡#n‘bG)W&ðHœï-Èåì{‚™ç ¡wlgÿð‹GxJ/®bhå¬ l®§Hråfñz¼,Õ8ûÌRŸ+3ÔkrC‚IÀÜÛÎ`vn\+C’ø/vïE{°Še d…€, 7¢þ*¦ò%×8Óø,~zOÔnYU‰At˜ræi êg=©·J6¾K*ãÈKÜ„Ñ5HZT²%Úç«H`5Qs­j+Ò6}H`{§Ô'ÊOá–t‰ Ì0ä¬vU–ûŠ]Ìà (tÒ ”W1¾iB|/ _†r‰d¢¥Oë/¨IÝ,L–7w\º£ø‡‘3.ËËЗ‰oÉLf±'2‰­Júrbä¿°a5Å™+§É´8°o¡ºÍ…[›)zèt¬„‡Y4 @i—©ãSÞª&¯àú&†BËÙ6× ÑÔ1Âl&ä‹V­ÄÞÕ©ö9ßdÄôÔd}ÉËÖ·˜“¼\Ì÷ª:éGÀã ­BÄbJ°?ãµq7Ævqæw±žäRQÓs㆙÷îTy;5¥ª1ϳ†×’løóˆxVÖŽ’è)ÓÔu ÀÉÜ­áÄKΧ&¨v}ÀÜ"¹_! @¶¹ƒÞÉxÌS¾˜B8›’¤”ßÑ–ž¥-t^Ed\ .較€‹âD«ÔŸ6=„ñ‘”Ê™£|XÀЖ9VÌ19xOŸ‚4ÕRΟËA/Ѻra?uÜÕp— QÎöHújC®˜ N€3&Ô“<.;¯àä„…:˜ ÊúË0”…0yÙ:ϤšÃABa—ežÄR§"ÜËȉֵ”VÃ6a¾_ºÌK:Üý-Ö3¢ú6–\ÑTiůü&àç+Û‘8¸]ÓfÍV9AÀ _Qf¯pÐÊA(®DÝ.h J)'˜wöxˆ»#¯OÂo^R •àâ)]‰ÐëyúÊH뇠RÔú±Z/P^‡jkÖ“LŠv½I°MXs|WŠÂßW¯ª2{‰ñ$„üæc¤ܤRu5ü~ú¸¤ÞÈépd%<²8¿q\eàÃPpp¥*‹äbèFJÚ‡¸‹‡6²\òqöaçädD‡ˆ¼ÇW§P9¶¬ô¬&.“@r ·Œelxt:®õÃØsUéãVÖg!,xRå8¥GXAÈmÉxcH>UʮƹÛÕq|<‚‡MåÄÁ¸õ¹ËJP.à's6°Ð/p®¾þ‘~÷ˈú9cÒYàªÛS-"Wd\úÒ_Ó¹ÚdJ–äq%ÿ½ËbL“rí§®‘ NÁËlЩ=…K¶!¿ʇ!‡wU¡ŸDJÉFD›`[)Áñ¦*æéº_`›dj†7(W¤èdvU˜‡Šq*Ôs%ÎyÀ µ7(f¼·ˆðp”ìYèCî7'úN>*ͪTDG¨DVõÛõÇiêBU´Ì©˜øW¹.ãôµdUÀ÷Aj&œUò‹fÉÙ Ff¡³e}E–fóPÓ¤ó›Ì®Ù¨F($]*X]IÛS- Õ¯ÂQ"¿Ÿ®OdÎÉ‘/&“pã&¤uÈœøâ;.ꤔ½t’öKŸ¹jÁ§›²Ñìλœqãu9R(žÂ;HÜS¡GÔ«ìÍÕ¥¨Ì£›bI ÜÅèzº‰(X Ú50{ØV_š°‰aêPã@h[4õÓM;•o—~ ^¢Q]ñ]VX­üºä®ZQV¾ekÁº|fgHÜÚìk"‰— ãí89%©bU6ìâ=âøY‘ËìÊZ\âàäWë^…L;—¢òb¦‚ô®²ªØSÅÑ•£¨§›(º4&häÌ cOã³MÓã{áMU˜ÆÐ‰aj»Zj~èÜÈÆ½âÇ ›ƒAqñ}¤¹|jPˆ²}º „᱇ÛVFü0ÄK2YdÒ•µª>r寶ÇÁË“¼qfUãCEUÆ'ñMõxñ ߉y$t3µõsÊb.‡ @}uŠ r0×KĬk]ÊÔÑ,­ŽU÷]r¼’;nGlKÒ^x¿õ䂸Ï,d[Ò)Œ¨ÆlJ”j~_œÝ5£ŠV®®ò}œGXCá)Ók3‚+ÌmæðL§)ÈÛ-i75U/äOÌ·!ªàJ‹¹Ó¥“äÞ% À[:T4«Ïót/E<7¡UEŽâ•mº8…Ø·jÈ%mIÛ‹©~e5ÄœÙÝpá}$]^æ›qÝD@þ‘ÔÉŒŠe-Õ‰½¬ l¯˜G~ÖÞU®Wî¼i(œ*¶ÕDírå¥rPAÞÏ{]ºT @ Nëä 5øwOG`bCü ×¹¯E#œt,IWì¦g7ø…"NWv±¦à†<ÞzHÐÈÞls(ÚŠÛùJú;q¬¬c™{Y”BßÜÚ»H œnA<¢àèfAaY/õøä¥ëeÝwý퇂¸I›¤¬õP2ÀÎkæû쌌’е<² Q›¢ie* ë,+–´«Öü2Á^p^«¬ôz ŽXg¤wg¾ÍN•Î)ñKØãà4œ>.\¶RÐ(G…£à(‰VtÙTK¨¹øt—Jq %À­«`~'Z0¡Bd‰¼-x³YªÏ ®Ì©]Õ‰0\4e6­þ™ f;«ƒ„`"GùØdFxˆøÆ+¨“¨L¤'ÞR| ’E‡ñý³|õ,n›Ý6±¡.7>m$·*ÀÄ«­3dåFåÒyB=:¯"2¬ª÷+i·‰e54$€ÜD©›„ëìð£à&"ÒéÊÆPJ‘Û¶¨dT°ïf iŠ¥ÉõÃR¸Ô‚4¼’\&7P Tòˆ"J¨ì -¬{S3b5 BýWB†oÔC¼‹‰Z±0+Y_%–D™‚®Ú„&Ô z€ŠÏx›¨·Î4í“¥Ç"º(ЗùgÂg¬=„°5RLôhBQñ§‡Ø=ô:îBÈ'_¦F»¥`G>_|­9Vxmj\J¸æé4!Byë8\ù.´ ëÕ5&ôtÏ› 1Tp„¥uŠœ‚#¹©:)8ÇPp?[Æ­!ù<V… ÖGR‰æÑ—‹hÉ‚}“Ê»› È©‰,)‡ GEU)lÅùV7¸»~]amjDœd`€Œ]µˆWsS4€©²Ò#™ù¤¸£DáR/qg4¼õôPJ·#N] _’õMZƒÌßiÂA*”¡tWÚµ: 4*Û)$„YãN‚Ç’Ä¢’ãÿ2ÂÃ9±’Žê¿Óæf;_hVR^Çû7WZè£ÄRðZèl[wjbuº¡åLñ.v…F•hÝ —‘·^¸-‡ïäkF>DIÓ ‰Óð;,Òªaï§G۟ϸâ«lxÁ.u–mÚ²Ñä)+ý‘$Œ)Ö!òÍ˶»«ga§MijG» R3‹8¾*¦Ý5¤öôà”p§iõäTÁâK‚/§ú4kwe,)Ú™¯ÊË8¦SpÙXÙ!ŠDð`¢[!ˆ8%:wò-ß"”pš°`ϼ`+³d:²¥|½ÚAúd)òx Ž“ìE7Î%·"ó¸$¾fŒ£! ’—²ö ù ÒÄFLA~w›eêiøO$p|bƒ©zIª(ź2]šÂÛØq/QÁöX©ÉÔ˜\luPI—,›*&N æà²áÂî’OYô8ÎJ—"¯ƒg[&éÂÞ+…Q‰K$950o]Ç ªøš™>×É×RÒs“¨Gä tm9mì4$9¾§u•9àæ¼ŒWñœÈoíݧµˆÇ VÁ1¯‚;^ ^Øš/Á ÎEd¤”|hC‚JFÙ"êA¡ÔbDªáká šÌC'ÜWÈ!€Yom˜Sˆ‘- @ï—<%`ã¥í§‡ ||ß­¡}i°8™òÓ€¨%’Ð WѶ U²„g ||¿‰ªF@×d”J¥`ÿ3ãXjÁY±¦™D&šß"^EœOiKÁ¹’I¦çH†ØÞ/ERõ…5˜v¨¬qB`cS³²ÃÖ­ñ±eWf«´ewæ/ŸAFiè·’%Ñt×–üK÷!.ý;g„VWÔ(ïÓ#ÿãì2,ʨfë²K_Wõg) ‘BÜ [ï\ (‹Å†‡×ì·?âGi¨ØéB·Rž¾E"Ó” /ÞØÂ°Ýq£Ð\¦\îSp¯HabðE%]xQÆE|ÃtÛ.e6ŠH<Œ8IV&¦_ƒ*î*+?ƈfR–laubÂŽrƒ‘†ÒNù…©ˆƒSG¨ _ѵi¤X#áXÙÀUz5mwúi(2ZVAî‡2H”EÔ¤‚V|Ûss-AÉ™wÐOJ$…CªW²Ä¥b!îI60Hd Í„ª ÄJQMj¿eÞ ‚E$afÌ\^¥aß Î´*3IJNj­d4§¸i MHõ´„gŸê½sšu¯;ÂLÀÜE¿J¯«¸tëCv5aÀ0ŒL/öœ4Ø}f8Ó0¤ýî6) ø€YB³=þ$Šà®.%ùö€ Ù”9*W™i¥rÕ¢WOÇK[ZÕDðÀy*pÉ! G°å D:‰bú«Y÷x-XVŠÀZ(zÛ^¥`Æye•¶xÝ’y¦º/³+-jTzc[À3yëùíŸ̶'_ˆ‹pŽ.Q _‡ ËNé~I)µ7Š‹^ÒvG³ªà0-ŸàÀý;us¸Y äÑà§£}p85S*(P5¼³ /ÿÔ# h ¤_àÐÄ…9\ÖéÈNýY§ÀRFßAä"ºÒÞ: ¸¬sñ`ô™ì\>)„NÿÎi§L3âk$â2ÔÁ¡N›<º!æû³9x,9Ò²1ñPÃÀˆ—¤¡Œ€PaÁÆ[A`žÓ”Ԣ֣̻V°& ’Úäd‰DØÛ }–ÛJXi\2º@)»ã´ðÒ §„Ø¡=!Ær‰ ^ìÄ“ Iú…ØÀfeŠ$8v,€KiK-À C܈Ò&r(ñFÃMR¹8è<)]ª¸Ã¥0ö¨Ë°[Y†Ê¶¤šÈ0o‡/€4R…Æw#zÂÚÁ̽؂ 6>[Œ„O²Ž–vrçÎ ®t‘À‚û业 Å’€™3%úTz.-WÇJÄÒÉ›»ÚS‚Œ¼Ù,@7s…ÑøBjò¡!lq+È„\*\2‰-("©É0¬28é‹3ÇŠ ™LAK\ŒüZ)éë‘€Xg3ß–:Ë:§SùžTҦȶäG²êJj—™BÊck¢`¯¡ )…Ô R8/#ü$4»a'6w6>„L€å\à•S9®ë²’ª•@ªÉ„,8\BÖܹ0n#ƒ¡ ¼Ø~Ê ÙØ òR.Â!ð £+.Ëd[¡[’ÑübšOÆÝdL£H~Çì+QË™!„]hž!E¤"Ý‘ dÍ+ÛnD­‹¬¨$î©#²òÒaÔÃÁŠ æ$’0…ƒä&sJÕ *bmëÊŒè"ÙAÄÌf8°ü×Êb„ RúÛ³rP¨`£¨œ"êOÀ>@¡»| Jà7Vz&ðe+Þ$/5«x‰M]Ù]‘^Hª83UÎU(1ˆƒÖ‹Ð8¥{rR–¿À¿»•븩ه»^H˜)”NËqª<¦\ uŸPÆÝåIÞÌÍx² vo¹Ò©Ý·õc@R¥‰hEƒPLJ4±KTEÜI>Ia5ضEôëʰ ÆÍI§‹øoÁž„j¼ËrGS„¬ÜC(· “‚#)ÉPÀ#ßœ”xY‰zu—ÉëÐJsH ©ÜR¥)t©}AK]Hý‡½t€–ñ‚Â=B™Í‰_èí/A®N-L°Áé–Fä5¶4+Ó³p!qA®(Jy#l•·æ¹tD U@¯ƒ(‡ØUwÆ+ÞT×íèª0‹Dé †´ê%Š¥S$* íB€Îµ‹üƒ4A$°y ³$¹Dè^T44Œ•$£­Òì½’àì˰Ð">¯+Ðè%r™âz˜âž¤®«ãÒ¾±åX‘¤Tã¸re«ƒŒGm½iC¼$çÒ ·î.±$Â2ŸË¾&èk?;Ä1{¡%Á^¹a‹®Èä*ѽ²í%ÆÌ••+û)üÕWŠ| •P—ÈWZUÎÆë *ögiŒ€ɾ¿Õ‘¯(íN%ùŠý§|Û®.¹¡ãöýu0Rʱ›d8õ À$©ÑÚÛ™dCÈth¬cSÛ’$•´jßEÌ*1óÚB%ÞU(W~"J’p}E²O]‰± ˜Î]Ú.e^5W… × ƒ^Uɽn¸)„ Ç«Ab‡]í×Ê’›êcÚ* ÈÔÅmnl;u ˜°S1­B]§…LɆ8ò § á@”„çÙ(Jý|=4W3à8³ƒC$ ?sËëšLtRt‘Ñ6% #jU¼¯œ¤î³x÷•BME QzRÊ‹ 6×I]¯+÷gá‹\bÕqk„*((ˆb[«“Bä4*/Œ!ÛäÌÎ&¢Å)ÌV£û]XI^!Våu¤„µˆžº+9UáÆý2ïÍ„_„²hyÊ:jùR2àÑÀÜuå$(YHUj$ ²®E” ý šoíºtƒüT.€Tñ+*P¹H^Þv¼ªÚ£¢´³Lž´IÛŽNæ5Èà‹Êrëh…h·ïÓ¹y‹Èý•²é¯óRXˆ¹ˆ/Ü»ºWäSe]A]ñÆEm$°8 „å¦O»ó¤i(°£j®‚ ºˆ´zŠI}¾ø¢\ç¡øß‰YB“ÄÔ [ÕEe éâ`4"Ľ˜B^ùf@‘N§Æ*̵öæê¥Lr™³v’8asÈŽé²¾t¼~Í:{Óá Hëÿ¤ñD!‡Uœ»Ò¥(óJÍfS‰L7O%²ˆ±ËTxUáp˜8§¬SgÚeçA@­»c+›%î2O|Ÿ]dC \oY3!¶›,¢*‚ŸÀìñë0wRbíõ¸:jA«)÷lj ´-Yùº ž÷0d—ÄUÞºYå®rÚ}”ž´0Šx6º§/ZìLM‹}˦›WSÌeŒ(¬ŠÎCì@ רç)F&\ÀfóÞæÁÕf ˧©‰zq½´®ÛXZ˜8voËÒÞ¶u¤»ŠüûŠ„ØŠ¤;|Ç‘U‘Ò\‘{pâ£-¹muãí¶h˜@ûmÆÛ¸¹D|œØB²fÍ:Nfu³WàÙc+ÀP‰°/Ýj¥¸*¦"¬"½»"Ó X+|i‹`çgÎ;qŒÌ¡d†œ¾5I€ï°è,' Ç€\=LÅlÏbšMÂW$Wdˆ£ôÀŸ¦1+¶ÑÚL¤G¸c‰m3Þj¿*@) ‡jåLO€nMã’°©]‘ÍZq¡"ùm! ‘—S3«N¶E.nE"~ÅÍ+W»ÒD š2ç%=lм,¥5 H­E‘Šk{8<€¥ [»bûˆ!Èj6î,ªÈUïØG4¼jj’á½"™BQ_d܃ÓÃD@}#ãÙæ%ÕÌ9¢ ÷° ¸ð0‘x¶=€;e$Ò©@ß~Áv{j"@8â%£ ìp¹´ŠEÕðKg“•¡¸´QŠ0jáiXü®°¥W3åߎR4Øn¼D+h9äGTl1W¤á 24¨{€ɯhK5ÒÊdž=I DAžkÊ8âÃâ*BÎÝ‚˜qƒLÅ­W(€šG¢YÅ{+Þ¢ÅÑ1&õÛÉ.YW! Kó‘’˜Z‘~Y‘tÊgÑàbßhßø…£sB’Ê9³îÒßì¥Ðº© {°í!tEuwVr cͼƛ½°nÃ7¶xlì›SD·…m3õ®?¯xý!> ÏÙú«ôKÅ ;‘/Q”Ç1Ï;WÜÃÑ) ±Á_‘¿ÃîÎwÝÝ&”«$³ôZ´ÇAòéƒÄ•ì}%iØÜתMæ˜Vr +á³Gx–øµÈ5·×?o‚&È·ÂNšb;H<®¸Ü³}Óbap\ÂVñ*ŒÞ廬ȕ¨È]«…£Ûûâsè$Ø{Å”ÀdÈ»m?µÑë¼zë³·WÖ|( s7 ²"q+ï÷bodÔÂèËÎ[Y›6Ò?k!Ù’ýšey/æä^‹×{1ìdi}½/öÖièûz-^ïÅoúîÅa&ÈÎhu|`n¼êÅÈ ¬H$ìÅàŽØ:õâØº'4,øSñ§#÷NŠ«ýáĬ8üÙ^Zg+^/->¼$ö­¾ô-Þ;‘6¥ÓbM¿½  5ç>äú¾˜K­/3AëæŸËì@ßâd„^¼ÅâÓþŒÅl}yq’bíñÞ·>zïD}é„?Â7-.^Rb'}H,>í/CîÔãe&lÝ@Å1°@HYdVœç`1Ô«þ)±xõ?¯ÅÉ‹«g/ú¾ÿ‰Å{ÿ‹ëK߇—±“>$š¯—!¯·Å°ñq{Ü}H´nö3‰ö7îÆ¬8 ÐþZÌvrÄâòIqõâS‹w/ú>nbñéß®{'u}i}Ý[k|žkº ]óaq¾÷ ã ï&'ïUÀo¨ƒºá>²6)†zÓ@§9XRÌt»óg[žßù<º… ;›ÿ_f9ÃQãgolly-3.3-src/Patterns/HashLife/hashlife-oddity2.mc0000644000175000017500000000074612026730263017166 00000000000000[M2] (golly 2.0) #C Slight variation on hashlife-oddity1 #C emits an unprecedented glider burst at 5e10. #C Bill Gosper, 26 February 2006 $$$$$$$***$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 $$$...*$....*$.....*$....*$...*$ .....***$ 4 0 6 0 7 5 8 0 0 0 6 9 0 0 0 $......**$.....*$ $***$..*$..*$.*$ 4 0 0 11 12 $$$$$.....*$......*$..*...*$ 4 0 0 14 0 $.......*$$.......*$ 4 0 16 0 0 ...****$$**$$...****$..*...*$......*$.....*$ 4 18 0 0 0 5 13 15 17 19 6 0 20 0 0 7 10 21 0 0 8 0 5 0 22 golly-3.3-src/Patterns/HashLife/wolfram22.mc0000644000175000017500000000017712026730263015640 00000000000000[M2] (golly 0.9) #R w22 #C Golly supports Wolfram's 1D rules. #C Rule 22 generates a nice fractal pattern. $$$$$$$*$ 4 0 1 0 0 golly-3.3-src/Patterns/HashLife/hexadecimal.mc.gz0000644000175000017500000007254512026730263016720 00000000000000‹úÁ Fhexadecimal.mc”}[ɑ޻ý‡2<°$bDWfVÞ¼€ygµz°ÃX?6ÐCöpÚK²ÇÝÍ‘fýÆQ‘—S$‡ìˆ¼_#/‘‘Qyþ÷_ýÿÙ~ÿîñýû_6÷Úÿá·¿ùÿ¸ýåþïwßÝ¿yøp÷þõ‡7¯ßýûþËßÿøöáÝÃËö#…¿•ðíÍã§/÷OÛÃÇí?þíî—ß=oÿýá‡û×ÛöÝÃóËÝÇ—íéþýÝËÃÏ÷œËãÛŸÞß}¤2>>ß¿§ÈgA”Z2úýóýýöÏŸ>>ÿg®Õ_ÞüëýÓë§÷÷ø–s¸ûøv»ÛÞ¼|¾×¬‘íË÷ÛïþúOÿò§ßm?ݽPVŸQ«¿Ü=ÿøðñÝÿéïw~zÿü_ G~y çöã%‡óùîÃýöýåúÓýÓÃãÛo·ƒ/*ðü-ûüãÝGF’àýÝÓ»û?>¿¹{Oéþ~ÿ~ûp÷† ¼úåÛío/?RÂíîíÝO/÷oQé7ÿº}¸óãÝLJ篥_©ìžž_ÎôŸ~z{÷BûþþUÿÿ}z~!ëTð»{Ê–ÚûøqKû¾srÉB[ó†J»¿{~ r~Ozz|÷t÷áýò(¤Ú~xzü°í;<þüçíû_¶Ç÷ÏÒ³ßzážøøøóýû—_¶¿Ýß==S×þ°ýÿOÔ ïùõøô@U#šý|ÿôŒÚŸ¨}B`Ê„K¢NoÙÿeûð¬Ñ9øÿé/n§SeÈúÝ.ý ÝòßžÞÜoß}ºÿv«Û_ïžÞü¸ù}Ïÿ°}xüù”ûé´Ë‘¾ ¿5ÿùéžzªë*¼ ¢áã§÷oÑ;OŸ>b€ü(„ò}{ßHF-ºÿi{~ø7´åÿÔn2"ì?“í¥ËôÛíáåwp=Ñ`ùDC‚ºÿáÃOOÿçx»{9GèÝß>|ú@£àÃãÓ/¶ÕàwÛóý wÛïÿLÄÜþëö?žî¸ºÿøæ¤u&2ÁL{yz|¿½Ü}ÿ‡ííãý3‘ìe»ÿû›{ê‘_?=mw?ß=¼¿ûžrùŸú+Õø=S¾œÅÏO/ŸˆvR>†5Õû…r5¨C¨Fx¡oQ ú·ÛÛ'šfÔ;ïßËP¡šß=Ø»x‡AþËöüŠ¿{û35úîUêí§û–Oi)jýÔùFþ½zõÿ^}£>°ÛNÿÝæû›ÈÖ°í¿ýMbëkfkÜâoSÈ‚ÿ©Y¬•­y+ÍZ`uµnnWìrì"Ãyryqú#W×Aä:ké\Q\‰þ¬ h5êõ+BÔºÖ&W€*Ç{ ‚Þb}Á¦¸`ÂÂÙ^¯`p¶šjÉ¡Q“Š\Õ-µóÔÝ~óaóåŠpþCàèxݲ0 XÄ‹"-ôóyóE¨êé/n½aPsqÚ0éóïÇKp[ðJéu°ÃP:DãèW”KùX©œÍ™ >›òÊ*²ïK–µ:N†-º"„-¤í ¡MµïûT’™‡$^¼Ä­9£uG<‹×ò_‰‰ˆl±¡2æ>µ[QGJ±hbÍn.!V­¼e;ªôºµåª½Z'Ž'³ª•¥ 4÷ˆîŒ~‹âꈷ)Ä¨Õ uÛÊcDnC*Æ-¦-fé ùPQņ˜¯õ…aíF‰$n4pîV² Jû–Ü–ü––¾Ròµ­§Öù©Da:šEJÂ\LiKY§¸e-ëF¸5æuÖ¢á'~Õ ¨[æÅØÉÐé*<µ¥å>ÕÓp=;á:³S+ª?Œ’¶L8Ê´KTµ²e¿å„½%Ь [¤ÊæF¹ˆ­ÑdSSס\·²+EQ{ -^§€¶z¶tƒG-KÐ+.’MX Tb/ ³ ëÜѱoå®çù7]“á¯.ô·’¶"Cˆ[!ÎF‰Å [ñ… ÊÞ#Ñ-Ì鮄<3óC R=ù!RèwÎi¢¬K·q ¥™êÃÂ~®LÃÎ`5Œ‰ oio¾=:‚cÜL®üÀEd]7çwŒ7‰´°ÒSëÄY—÷¡&g6ô0‚Y µö‘ d‚ÂÄq…¬žÁ¡Ôžï71ácÝ<Ó5ó$ò8ëeì 1›M‰aý"ãÔÒ7êM± ãÊ•žES{.xݵú®èÕ,ÖÍ:Æ0¨†Þ>:g´É‡gn>È*¡]³06®tlêòCVÉžÆjC´øqŶè–œš»ö#d‚BPÑý0¬y.ºFD«÷ÚŽ®$®ìŒqòélb-kô%ÔR·f$HLäVTÌdÍ­a…k,,òºÕö5!Û¥´I2)WOKÍ•” `mõLŽÀ¡=r² Ô×FЇCM ³#…ÈÚ¨º8OЗšÿÊËHЏ!Mâ­6’í`7÷óÕÆî Å@£y]¦ŸÇEwW'‡ìì®ì0#£²ž´ée’¡.BÊÐéñî¹£+ò«!ù¿p}F¨Ž ä’¿–•ß7‹ªG›¼uÉ1üÛ¢ÒŸ5áö6¡ØÊòNxÙ$-GË_âhaÓˆ°Ò™ Aݼۛô!1m¼s ß²ú6U\Íä âÏÍÝjf’+¤DêÏD†pÄR3:.ûJ÷µûû!>Z8µÑ3 ½;[ê ;ýšŸíaèKfÍPž€‘Y{@$H2ÒÉ_ƒŠq}KVs³´!-ž}‰ã&Õf³ìkèh;#ð[tí ¥H\ %‚Y[ÌR‘y²øLPÉRw¬[,¶æK¯v>ÆXC.¤0Æz§›Énëõ2Ð¥Õþpg›½ã&æé+Xkq·Ysæ=úUw$c–XÊΜ¾Œk;R,ܺõ¹É<†UÜÈ}-èÙ/³ªÄÀx‚€ÝOFÉÒ;ÚmåhåˆúuÎMÒM1òå>f‚Âé¨dEa‰ òŠä1¦2‘=¡ô›#ÔrKz¢'5l=ðX¯ß:_iÚ8§‚Z‹ÄµækÕné*­uXù¤¦þÈ», ÆÚ÷Gc¼a±]ÏÖ 9¨tœœV>IÚ ¼’«fËWövYR"(ät‰)—¸ 9ë¡Êx8 ›œ`€=¦™—+°Ê’IðÊÙ¾:wºD±&wë‹çbÁq‹mZ÷ž©L#º²°;‚HGAø"ï·Œ¬i—cÃî” p‰&‹mö›Ä¾–¿±¶v§ bëî&+ûjÒ“PA&(¨**÷9¡ÊšTYM8‹bt_Vz)»:vJEzjæ‹Õ ÕDû®«\§ªÇ®Ïvرs¬ùêÙ^•ïü-ºMü‹Ý–aÐua–•xj‡»'°ËAG SˆZÉšuXV$)âÄ-ä¬â4!ïº-¶>9œ#ÐQ· ¤‹•Ø¢ZF‚#šz­Ù"d\yãŹ¦m-aÔË<— uGK¦f¸U ¿œ€W‡Ã‚DNG¦3ÜØÝUÆÜ>;¡ “ ÊÄJª93œv£1±«pßbHí8kâ\A–[‹kýÞÖ%a'pž€Žš€aþ\/]Öëz¾6VD-Zt$H™BýÖ³ja$ùXΜñ(Ýoå:M“CõŒö­V2çqàÉP'xiª¥nÉ&qÊ—ÏšÌchùc’«é°Îœ¯?:÷Šêf‚B@mŠ"_!GâWfgÞ±˜ðÈG„é‹@T»¢Üãk?ê0鄤Zº_ €õs7æVf!¨(³ÝµËl¶9ÚdNGL™<‘žœžà@.ž¼Ž–¤fI!ÉzKíªm¾³ÙZ7¨Æ&´Xó˜›e§¶LØêœ''}S!nIÊð”+¶EŸÞœí´üÙÓï6ÒPªÎ8îCS‚⤈âÏúåBx„¡y£ü^­¶l˜ÊƒÎû¾Jd¬z¬zz9“u‹e7¡KáT¢Ùw­ ±š…&‰æQc¯0@Vºa$¼+™Ç *¶–wT@$Hçˆ.™¨@ Ú®Z)×ÍÑI‚ôu‹ûNà´{®$ŸWc>î±r³¿š=°=Ÿ‘±™qO,šÇÎ}SÕ%6ž)’ÕÀ,[t¼(L›½ÌÝbMÞhû–¬fqº•'¬–ÄTëU9­.‰fɵ2D¥§èJѲÙæ[+ Tòt¼Œ4Ú‘—Ô /ؘ#]ŒW5Iæ¡ã±h€ZWy@$À,§rdräKÖuZ×yòÊúnI{3;`ãâMÈ9J?Æ\ÊM60zêÿ°8ߟúו®ô)èT>`ݬ' $‚Ì^ªwûº£*MC (ðåqãIÞ(±AÆíÈðätOÛwa/V®æW²2¦8{ÏØ¬S;‰ ”¶)ÇCpµ´gô‹.‹§M¤‰žgió?´ã¥;ËÊfçääd9:'c 03AAE¦Ž¹äbÒ[ èÛ²còaàHBgúõòmíH‰+žÁA{¶ ù+˜A«Ó¹ôŽBà˜1Ѻ[»sРe ó¾;ÿL9DiF†Ó ÜÌc:‚X•jWÈ«èr:/}0,jgàE“ÔÎuœ´÷ÀÄŲ8O€£ÇÔÞ[K§Æ°\"A²ëîXÆÙÎM&¥k÷ˆ0f ‚ud¡nªÊñF05Ü…¥°Ó ¡¾’­øòæhãf/-«ÇV3‘ Y‰ËÍ ¢fZ¦î u”ÈOç´–´{åP'uAuþ>³Ó¯wP”2r¶Ìˆé2ã·Ô$9_qÞºžžÉÀP(ÔiIÚ3A%O0¨’¯dù•k¶4ÒñÒK&ïÑ_8‘ŽËvruC/ûS[0rÍ °wÒ_N¢Ü¤³­?¿fI2Bx¦;øE=Î×TÉgŽSÎþô‰€µÒŽv €ò mD©ÒWSŽecm+Ñü}¿ä×T³›Ÿ•#9à¡ ’)t ’1c²òt2Ãxp[…½ÄE$iäqH'3ÉtÕÃÔ÷Ök£tx‚ r1M¯tÕ»\Nkò1/Ì„m—)µ>òz4ËÍ$b®ã£7xSy•z-º­2¼ªÐk¹TÔ»T£¦k«C;# $‚|Žû…Éy Vu¹!²K¢Ëû &’n9Zhrž `Bà|‘7-!)ŠèlÜ·"ã˜gÜÈL¬d]i” ãAùUU#íò Ý šMƒ¦d°Q³U%œ #é d/œv8ƒW/n°ŽÌ€H€’õ2 õR&ëI½LN -mÇét\Û}=pi€hZ¼i)dçÖ0«›T}¾ð뚊'°Cæ´ˆ!Û`*¹Ñ½$v—ÆIVûR¤ÿBUμ^‡¼ÛV~‚°ª~%V9†¸GK%ëq–¯­ÍëÛºiµâ/£¸‰5rÚ/7¯•R]Ùh[·Í}%)¤€ ¯õ/çßnò Fõ®¼;Oäæ“,èQ˜‘{´²&£5’3·+¦TCS—}«vgÚ®ñn¨dGå‚YYu}¨ÞÜ"»$—ßiœ$ðj®äË.‹ ¾v]t¶¦MºÛ$þ”~`ß,Á*Ï5SšW·ìwGàO‚¹"ó˜ä$ðm ÌÛ´vlë@Ób×Jì²PMc)Rµ¡e›Î¾¢rao„ð…Ýîsº·O·Wj9ÆÇ5eÑTµXjµjàXÄÊä¶ZÈÈM×lÖ%RÖµAÜæ*s :ûiº“Ž!òðLÇàÉôcÉy¬;ý•V,ü˾o¬Ù¤ó¥yÂÏ–ˆ#d‚B „Œ»é|˜îÁ‘Ç¡*)vÇhŠ·:8îàxtŸŸéˆ³Ù. MÅÕböšŒýX°®(* ¬zv}ôÔ4îÈênqU¶òt!Ú‡Ö™“Ñ[¿ëZ•‚̰{ä®MÉöÛN\w‚½}i<Þ´J‡sâÙ™õèŸÓ¹ŠdÇ]2Y½Ž¾äÉĉ‘ÉyˆŸ»䨻ÀW ¬rÎ[ã}ôV¥šX[â^-Ô¸•Ïeß…3øÝº¢8G€‚h¬°-ÏC…R¥hYº<¸QÖyñÍAË+uònÙ/a®…rd•›ZÝ,™ÅƒlúbTêµTáˆù¬?Ø™ˆ š§'иÅe1;Y™1C3³=Š¿Ø²ÐX-²Cަukpž ¢`= ƒü#AB³Ä™e‘,»g' H©ë°+AŒ"娻 ­¿•2žbcÅâd^ÿqØå ÿ_.Û—w´½|¼û˜©üN™™ È]&âÍçäµ¹ëF`âÕwGàuÐ^¿ÔÈxDiGe@.Ÿi¸L"m9¥AHÕsS¯®>¬E¼åœfŒ¦E˜Ž¬´8Æ/÷”ëÊ—n`¬d ìyÏÌq¯›ÇH‡éº£Õ$–d{¨qö³–u˙ţãx²6æýTÔ)`#.¾X×ãÔtLÔÉÊ.¸Õ¼©Ç§‰íë„¥Rf$Hý'Jœ¨Ï·aNj™ZV… n®ÉyKªäá ¨K yaþfèa²7}ÃnŸ¾Ø¬Çý²ä ËI~]]J„ãz9Xe® q¤î%”-VdZmœ%ØJ ä™-ÝG0¦á`F›¶ ›É÷ÍkY½9å’«öQ©ž À.Ó¾îŽ ­Ÿ,‹îÎü-ùÍûáÛ·Ü¥‚ºÕÝôÀ:™g•Çl†=`ýÊÜ*µwnS·Eë7¹U³Ã¡fP¬rdFá«tížÖe8µ<îñ‡¹IF÷LP¨‡QNVyé¾ú¬½_ƪÜ0M±W¬cÒÜy hÞÕeÛ^‰ ‹ÚZ4®/ý=kÏ”O/ÒhT›š©õØ«Yys%Tõ;#ð`sǬ®”b¯×ÞW¶OKj-)bá%3‰bÓ–ö·I3<»äÑЩ÷ìËvœ «^`«j!¨›##ì&Lé$ð¼Ð E‘H8ó ž 2$ªG!™<Aä5¹’Óy‚J^‰™µâ 9³œiK¨|4(pÞÚ—WrÛX=vÆn~µ)G6sêëëz4휭4Œ­ž ÚQeyN*0‘QÂm0›ÊJ=2g[à!ιâ0®Úšpí+}o¬Çpí§è€Áî<ÆjŽÏ* ]3*3Œ\†i3m 9Âñ ˆ‰ÇÉQÉŠê‚äÐV8AÔÆO+Qš[íùŸvËÊî î>Ó¯µ²Îáø™–]djkFöÁ¢6ÿ6c‰œ=P8Û»“Ö¾"î(güš ü|Ó ²h#•>’Ci=®ÚweÅ‚‹ „:7O¯vPµú:.pI Fÿ!óÌrp†ÛqH €³TàÔÿ¨Aà9+‚¸-ç/g"ªWódÖ€ùû>$ @41/n_wáaì^Qª‘¥Ìõ ¥UÙÏ–£ñ½¦U±Är²íÑØŠl•¬„Âä€üp Ÿ ½î Çô –j¼Ø’jSªžº/$ ÕÐûÒõèØü-ÏСA†õ!µÞÏiÚ~ÝZ¸~û'†bTÔXM§™èVa\ör¾²š6M€ØçÞ> Žƒé€ò¦ƒi½$ÕοÔöCBݤ$ '‘íSƒ¶»Za™?›ôpŠ“<Æ·÷§Îåæ©ŸRf4 ³¼Òž §: 3y¢§Z®nCñV„,e+'ÍËYëŠ*åÈÉWЯn’Ão'(móésL/Í]~ ,ÑÓ¬h`ËÇúýÅ™R‰—‹/Wƒ­ÚÁ6/ÁÑÀhú8È:Ã}Ï0G8›“©À#ŠìG…G™˜Æ~Yä ]ÍR€NBÔýæ×õ¯¦ž¯þòM ”øUwûÆ} ¿LÏ·ÅÚÕ•QJ@¹ux „ØrîóÕ<Âô¾m24u–ÛQëí q­-…¨8:Û‹Gƒ¹¦¯}¿ ²mïã[7—?0¿d2½5f¢¡cæ]þÚ¨º9Â@ÈŸÝ-ïI³?†7<€œ ï34ŠGw¨¹õêÊü“ ì™éâ2PA4;v ùš:‹[NÎï@¤‚Å ±ÀìÁbMš3ª ;GXWçq”™¤YhÏrm >lA4#ÏųmÚ”"…È©~,ü3¼¼ÐÇp„™¸|GeåôUMÐj"PÊx‰â–ƤnˆUuŠ„Â>‡É8Ý!1ÕvS%ëé³|ña<Ì1=L%ÚAfõ}Èk½Xã¦Ù°£^ÙŒrG*@ _”Δàç„t‡ƒÃÛÔ <‚îÎqôCÏÇ÷çÓ“¥V™³ÔñsS‹Y&ĘH±¾$‹ (u$*Œ"PÊmeÈýx»FÉKñ Ð}œ÷œKªué»Mdö×ài<­#gp­/ICj†¢ô ¯¥É†µ4î’Cª ;= ¿Ë7¨;78ˆ—ëW0#‚ú¯yÙÛvèó{b[¢Ìfî{UÛhª<—ÏF£Uº¸z ÚÊwLú ›:Áïì‰mOœ… ·<Œzõ † $|½D3/Ý àh¡âa5@ (4-Øë^¬_â‘M+ä<ÜÁªùz qÐ{Wá逎nÐϥݓÒßøxZÍ‹eJ÷\[6f-Ä/?½®:Œú3sŸ»6¹¡‰ar6(|†‡ Ù€t*³Íâqœȵ{ñ‹Ã,ÿÒc.½¢C3ú þc·n~° FõœvÓs·—¸Ö @§‡òã88vž¦°…E±ÂHhK TŠÖ‘rD ÛË„zËØ2™5SöëCDz{ÁVÇI€¾\ˆ8…œÑ™*ºÃî—ùåYéîñÉg£„Åhr£åºå ¶E s‘ŒyÝzV¶Ö81£,ÉlsåkD(¸r·$+錖m×¾`e¤õ)Œ$Hèh$ˆE|c›bѳÖõèË;>ëÃâbåÀ[¯—O^Zï„zçÈ )²7R\/ˆëÂu}ô³Þ†Œ Fl3TØê®éZoæ<öfN@¥õfbÔùÎ÷J˜bÁÓüB³Ì‼ôL ;y9²öÔ"£¸±‡]÷§Iu/%W,˜ È’€2PªÖ‡í¨º(¡GumD‰×9X³x>E¹„ô!‰ßa»Àµ1«JŒ®™]ã5¦QHÈdc·&è‡Ã’hP\¨ÎºÐªPE„;óÖ.¢ÕW¬?Ka Šð@cQ+<ÐÈX¨~áÊY„=]œ·¦nœÃPæÕ,¿ö*ËpT©ymy¶R´á u;±aÏ„˜çgdÃ…îø?5ÎH¿ð¤Òe£IÂ&¥Ip–“€Ú[#W! êhéп´ ®Œ‚ÝnŽ}:š´îkž¯X¥Å¶çèÂ5[Zu}b[2Vc5'òþ² ?xa-`ëY ¸AÛ°7ÚzÏFh«Hp‡xxiÌ(‹œúê•òQ“vˆ?le¯Mµ Œ"PÊB¹°ži¯îÀL<|ñ´Âõ%˜mqr;nöÝõ ÏñCëìã;ûð@±uv¨â«„¾ú唋_ ±Ý .uh= êw j††Å`ç²·:ú¾½¼1Öò¿ëË`+1µ^‰y=Ò†XZ¯Ä(FmCð|]‘~ ⺬šPƒÙóùý‹Š9}¯Ë!Y lŠÖ€”®Ž²6|¾|”U¤Ù :.R‰Q&”÷=©in\KÓLABcÂrù–ÐçÕ%àä¸ëYà 1ý‰Û"P²™=Pn4ÏNŒb«üº‰I›MóÏärkU¢àÝ‚‹òãç“óÁçêúzþáºq§)ŒâHDå1CIzí¢¥Œ“—õ]çMhå)Jª“õŒAyȨOBL{‡b°ÓùÅ3‰†¡ýˆm•gõüüà!xú•¿á±€õ×JQd*@ cÙ›,»—‰Œªÿ³Þeÿ’åô’žÆ×,O-DJ\U˜â;c#^Np: Ô&LfÄñr§iÀÅ4¤…é<—íL ”u²”• ÈXÖW-Ý8­ì /ÂuØzœœƒpJœÚ ýIÖ$èëïvY—h€Æ´´–›‘¶f©Z“€Îu¸zñã_¤–‰kT_çï™wÇ“ÆÍaa¶–·f‡C»V;î(ÁiÏ:¨^‰]h•«žÁ3ÃR:á6§Y4’/ÞpÑ1rV…* BúÎcT~´A$.+%È?±Møû¸'  ”úùd4X 3ëná}¦ÉÁ¢ÌeÝàí£+@¨¬ßÎÞB€¥Ó^œï4¯Ÿ Uþþ¶Ì[»×Ö‡èÛ"õ›(ëôÛu§:i¨bá@3ª´iÓ¯¤ê1ì@ncÃëC Lvˆ³º³RÑ'Žª·—/$æWu´«=$ °¥{­ÆÛû° Ú*åòÂÄÑ×;­-Ýp™eý.reÌ× (±“ÛÖo‚çÄ›•<<_G²÷ BkÍÓ.|†=Ãê” È:hpì@(Á›ˆ Ó!¶çîdoo«‰MÝ=§ë]ó‚Ñsð‚0bÐÆ¬Gø' ^ǧ{™Â®&͉ÐåÑs)¢²‘v>še=°¡ƒJÒ¤ xæ7Nrkaò@ˆqmh<,Ø)·H(•~ò%çtÃ8®Qe_ùÏé¹ø¶Ã)}Ôa¿ƒåbfäÅ+ó'@k=Z¿é`Ë(Iz¶ï@ˆÃóµ¬K·feë[T[Z¦]·Ø'}pí@^ˆóÅwG¹î¢†[Yo^R¨­¿ƒÇ>©±®2c³\é‰}åyä›ë ªÎßFXˆVgÎêúÂEØ…FÍ4åNX·¶2«Ê\]ñ§¨+ÆõCÀŸU#’)¡Íeÿu9d´Ûþ5ûn9Š(±3Ú4‹(µqTñÅ´'ããá_©?h,ƒ/jgÔOR™ä€<üj±;¸žï¾P è•û"PG@ @œ'²^ý‚½°`·më(I•P–¯ßË–÷Ù³­²o“;÷kp; £Ñ0ñ‘UŽužB÷­ÀÛ[£jÚ`žï÷¹ÃŒ´ê¨¡þEw"»™†·òk£Ý2µj ª¶jÑ1Ýr矠FCµÕÇ *éœõ}øit-e$EI@ºÎ–ÀFÝÛtÊâ§P)VñðR‹Ï?„"qn?TÐõ¡”TE ÄHúºÞÖo/ûÉ"QuúŸD8 ñ²…¥4ý‡¼ïc?Töt­„=ÈÈvÖBƒM»têÑ»€EÕ/ïæ5Ìt©i«Ô4gó^Ʊ,èâ²}èûyˆ‘y­’òõ¿$lËÂ*ôQI­Q9»Èy ãýò^áÅAœ™ °wY<‚x¤E*>n9뮯§™UUóF$!µ`­vtTÒ®_KßÃÏ÷-6àWIæºK¨~ó¬in;FöŒú ~¸PêuýVU”yty]s‹.2¯-øó?ã-kÓ”‡½M‰&„Èy ¾Â#´Ñà3átœ&ÍlΛ‚éÀèß"?Î!IÁ¨H'‡ÚO_­³}Î%iŽ] ×FpˆâÑÔ_³ËâAÍîô9ËJKsýȼvæ¨nÏF8 €ìsõ—ͰÀQ fÙ& ¼í0Îõ¾f8Ø'ÕEš£å`©O7o‚nBC'Á4} ÐzT.ÕËT‡GãàògÖö$¦ ËÈ«êÝ2o%J9²ä•ZQ>¶ì³uS@2ã—K‡b•ÞGaiÖí¹Y–ˆ€ýu«ZÁu œ›bgjZo~KU_pŸ¸.~Ψխ*+=ʵ†N«PàÜ·Ã iOó;OËÅÞåî)Ò¯aJÃù‘e5ëPŸ“ÃLÂQ}A9 êÉû¡æ.‰^\%;ÆU…LŸéÇ6ccç”ô}ÁIyMe`½<­åT¨#Å™L@‚*!^¬J§¶ª)b¢ãÞ¡Ç_k’s¯îÜ´,F(QEÛ:‘Â`äö4¼ê\ün~W1tBfäDcBwrJº~ ø$„8<ДdHÄŒ0Tà-jÕŸdsð+zBª.ãê}~ñh]i×,~wl¸£y„ƒØd„µx1‚ÎÛÆ!T¢ñ®Æ¨¬¯Zšl5m«¯%‹QiJC4pÕ]W3Wú±Vý´hr£ž5áÆ Lg[½êiÄáp‰¸‹eââç£÷El5o)Â,²6²=µ5¢µ5l~ß§oTód¹É _ÇRVÈÅØú‘Z£ âv„óK7QÎÒïÜóˆpH. (_Jï åR“®~Ô°ó±ŽuÞ4/¿;'†²5«ŠÞá¼Ä¡ýö!½e¥­‹Õ¸Td¤ÙŽs @ì<[~£ê‹_ßžU¨³ ŠP?Êö;ëJZ>ø–5`$ô:±°hÞÅ-´Cï—ÍÁ×χoÎXå°N-ÇO¬,… ø¨Xhyg TáMõå±ÁÍ`o8ƒ·§¿uÅ„?“ÔÇaý]UgOŸâ mTí§ñx±°´š™ ¤c·qe Š ×r’˾~Cp®•þLEXH\±HlŒ/˜(nÿNص%Ê®ªÚ®¬&DyýïØ=#”à#óî"ŠÆ$€ˆˆ–ÄÓêñHGßܺ,½}±çpYuj{^Ѐè¿gùÖgî柃­MÇ3lì©.ò½Á§>bŽ'Y» =/?š;2€ éÊ¢Ž²õã ½o¯Ô1KäB¶Öˆ®5ö^nÈ€÷¦àE¾ÔhM¹‘n –kdõ5ý£9¦¸}E}õSgœ@ÞËæ?ÿ–r¾^'þ×p‘Í}~ÿ=FÞ4` aó«zxq àë<|Üwe" •®?ÊSæ¨Ð?·Xƒ×Ô €—ôv©'Å=†ëA¾o ðüS$ö®…GXÌÃꆮÃ9ŸðíÈ6ë)ç+D¾ÆÚ 9Œ|u?R  æL´ºý?]HƲ?dßîŒ|©–¼ËRd‰`©V—5¯~p ÿ—Ë»Õ&õBh¯¦+_„’ tŠá=£!7&®Ÿâìü…õ%Pù  TÖf=íëTiŠ-Ÿ¡!ÏïÂN0›1RÚw£ìŠa^·4Ö¤©,ÂÚ¾¿<õqd÷Zýß1õ!°©^Ô¼´Ÿ‚#‚À“9ÿ눛FÑ$4ç9¥ø2XkN*µ¹AJj¿ÿ]¬¤_C`@À/µlO}È pµÐRŒ2}ËаwaeÀ~?P–M—Hwê{±'V3ÊÌÌ•îû¯ß€ýs‡¹ü^Ý_ñ‹@Šâ8üÂì o â@áúä7…ëœ\*Û|ëXóü›² ·øØ¸o9' +ÀŒt¿ÿ!*—_µÃqˆ”ÀSó̉skølØCáùÕ'¿ÿ³|ý·Øm÷DicÏâx$H|~Ùà¸ä'”¾\Ks˜A#.èý¸vPÿÏèB~ZF[p„fÿ†W•%n »©7ÓhôuXýÄšâØ[ðèaþ~·÷x™U–¦„~û׉q'äû>Èr‹C½pËÌÌu‘ÛŽ®çÌ–ˆÇãÔ×?ü'·O4ª&ù9–  <ؽCéhÿ¿ù Î]=o ë‰8ÜLf@u)×Ó} ð9§DzçY©äNÀþuÿóXÐY3üBQ­:ß•®îŒwt¶ØßOdàÅq%ŠD«ì’Ñ`ì«…GÐy3;PÙ£#^2I™`e£¶íV/“ŠEîè œ‚À†‚ˆ¯7 à¶»¶J#}:«¹£eØ:ÿ¹w˜ð(oŸàïE[®& ×׉rå.ÉDE”î”´G“=*qÑ`øº;?[‹–jVQ"¦wû¤¤r À±qM7î£0Š€)vñô”ŠÉ¸ŒÖB*ûxÛG u6½Ï¿iýŠñ/ôöZ‘ÞГ×Û5 êµê=ëí«Ï¡ êT¯À^S)Ͼ§ÿ&Ñ­­²;@z*‚ܤÉåß+ê˜ü“Ç·zK}¤òZᶉªwðÚ#‘»p¾»ë&¨õ°³â»Lã½Øô ·yÔ®p² êíðiŸß‰’B\÷ Úú•>.n¹@Üq߉ÝÞp“ƒNHÁ,£X»¢Õöi#è¾ù3jæ¶ø€ÐZ ˜uHY¢F4ò|(‰ŸT í9e{FÕ áîJÉÎãçùR 0 Ò^ôJ¡Ê)©ŸÕæëU›­ý£÷Úa¾¿”¥ =ÿ:XUÿwöf(5PØhH¬#Ú=³/EŠoÜÛ 5Öú“'¨ óÿ#d‡tm¡ú9,®3v³n<ºc!€´åš×:€Ä èÈ<@7Z§B-]™œ;CV+_—ZKÿsCjUÔ Àÿ°j7›þ–š}o]½’Ôß |„ì/žh4 "—)v…°äSjC½Žz‰6}t_“×z?$â ý‚¥ÔÀP£á¢/“åÁݹi¿väݳÔÓu*ŠË×&ºlU¶Ø¿#˜¸Î€¯‘'_e2ðfC¥àâ3Œ‰_0PÔh[rúØŸ_ÃÛ¹s7–¬¾# óø¦ë?ÔÏPêÕ(†ÓÕ• àÓ(PV…õé‹7]4 óõº§¡Ž«ÑOˆsÆ…Õ÷ õUÕj ¿ d:€X{^šþ8ãè 0Ù×3ˆFßh)Ì—*º4öÈHÅ{yùø¬è¸ÃÑ·FÖ»)Àˆemó Ç ˜î{bàä%­£À_ÇXW‚ét áö²ðµA Ë‹k¿ÍnŒ´ ã¯ý¶4 J@Xðð |¢1)”^<‡¥è¯ŸÂùÿùµÍÏãaÚÅeY’v³\Ê#öPɱҬÀ5à ¸•zþ‰}äiÿ{ xû¯üI4ÿ=EçS›í»Eî<‡Wò Ýõ ]ŠgµÎïw\ŸÈ‚hŒç C÷¡¬@§D9ÿkG€ØO¯Iÿ¦¢ÂXO¯ÂðùH(⌴×ÎC¡äÑv×6Óέ!%HõýF=O6³Ç-&¥¹1€(À¨­«È€m»ñœ<˧s¦ @ß¶I¡¬­Û¤Ð”ÛA–@d` 5\BÝÉ%„ºs{ïí(e\R†£É|ÈC}g·(ô’·)4)ÕáÅ)´Ü©¾K5mRÍħT3Iµ³Èm¬•Èù§üq6ã¨ß­Nx ¾(ÛÙN¨¶É$óY¹ä•µÃ0~òʽä•m•«U’ +«¸QV’·uŒã› I ´U¦÷€ íR&zH™0À¨û2ñEʘtJƒhº)>O‰j‹šdíP­HС]Y9´kŠ–â‹K.£ÕheD…1eFuÊžÚ”•¨ä»ìç’½ÑRä£N·Ùð 8ö<[|6H¼ÅˆÇè"¢c|Šè°UD‡ÄÄyæÄ^ÀΛ߃­ïçI‡­ç`ø8,¯$¡Î°›ýgç!k}S·ûQj‡ˆ74aøHÿèmÞÖå}yX€ R€ ±êhgP€‘]9Ûèõ­My ÈY mÙê1Õ7N‰B:N–+%ƒ:¨!H-#p  ËyÆ1PýU[û+ Þ\Ús÷Wimí¯#LÜØQ»¨£‚@äßÎÓ€§8â?Œ ô‰£§J“ì©è¥Õ«ËÇå­ñîå­Äx{+Rœ!¥¨$ýÉÞùvöVé=GÝ{«tÞ{«tɆœfÛel•TI÷d°t{50RŽÔ*GBOÊrí#ê!GÒGÉQ¤`HCJwÝþÞ/Åozv/~Óøà7ÙÂoé4ùM àeû­*™Z0Z¸Œæ^Œ&?ÌXaN¥«“àL¨$,;Y/6r Œ;ŸCFZ%oÍhCòÁÒ6K6§-ë6¾”´—ä +¥¤EôVÒ@U„„âÆ4óý—9Ì<Ñ©~)<ÑRxÈõ5Ü”#¥«¨)o·H ‚€þDM¼DMÇ¢‘Kg™ý€èÔÈiAQíf†Œ´E¡õ¨÷e¾Ê CQÀõ¾C>wè*¸lSpÕP8rN†ZvJé𜖅ؤtC>ã©V[÷€LQ²>U‘Ñ”&ûÝ» ›\2lºË0ºV½Æ&ÄfшÏ'ûs±·Cˆõ9¦cþkÄ©L dy‘b—O)v]¥Ø{Ü8¶ÃGKˆ!¿¨ãßB¬O)?äZ@–Hkè¢÷J‘FŽ·J¤õéS¤ÝR¤õ)‡!‡Ñp‰,ÞOy•€/CXÛ1ÝÒö‚^/Ó®é¼Ê«Ÿ¼êc(”kÝDVÛHÅzwQ¿s¥98jŒ z ŽzŽšƒ£pŠÓžgΓ}RuY¬Ú?-Víe±"§ñ^Æ^ j0öÒ[l¨­\§uZÜ©äS ñvË"(D?AQzrÆ¥”ºï°Èè7ž+ù=w´ÇëICað¡Ù\ºR—*÷Ÿ.U¦S¾˜ùâ°|ë‡|ñXäKs W2Zn¯>ª)ðžüür_©´ºœ­ƒ·bÅ…v1¾ÄLdŠ™µÝS»^S±sƺ’i¬~Õg‘?mŸò§}•?ñ¸‘€ØÝ:9“ÞÏzVTÔb¤©!Õ±JœÚœSLév½Ïaî:68ZñXˆþ“SåRhƒV¹ä)—²Á:8*)‡9¨ã2´UŠD§ ˆéá_¶ŸZ»GÕÆ$ë \®¸OÎ[J²Ë“é%O6Ï$¸j'ÍSÏS½Ý¶Œ“þkÁi‘/çOùrYåË{ܨ۱à éÃâ6·T÷u $¤©u1žR‰ÈM®"ýúÉÏi¼ˆÄ *æÒ5…튢GÈëÉ$¢c  ,×óH>˜D«á=Z2‰ÀØœ‡–¶wP—Ÿ»¿Ý.fr~ÒÖ·øÁrÿ·_Ë©\vîÁca>Û'óÙ“ùÈAå)'ÿn§EÒP­÷÷!´òWz‹¤‹\+þЦõŸOXÏÉQ±¯n'^OÐ烣ÚVŽ2MŽ €þ|>õÉ€Ÿ3Š9X;9­áôÙ§MÏä“5uì¬W»XŸš‹IÏd}mˆ5ä:ÒYó¶PÇàO&Y™ ÷-.ºY¨á“ŒÉÍÑa+GÃdXŒË8z¸mêÛõm/ ŸŒ‘æé0žz#½„zÍcpú¤¤Ž†¤ õ!)vJŠ €ERüKR|“”ñLI±·°ÏÿÇœ}ÿ’çk£æû$f¸N–ºÄ«"â·ˆ8)×û\²§„¹EHn ±çCB€^%ÄàºÅe•'ÄãvUÛS²œo^Ãz øk-zäúzw£äµpHŠ=%)Öd蕟š2Ç’¯aÛÚ!Ö€×Sû%@®RaÏ” kŠÂ¾üœS ëS$ ¹uÐרn}Ô¬õrÌY÷O>ÒsÏEZ­üN“K¤ÆÍM¢•Ä[Ç–­L‹j$ãÇ+êÅ+²}Ü~jÖù¿R~¦uﯸ]=Ø^OeúàóÊ«n“Wä(”Òéß=Øx,ìb»û'Ð~±KÖù)S;Ò&}ažÐ'ó„Ï¿lRÖ÷}$–¨1¾z¥l½RBc‡ÖäiÆe'Ô¶VÖ…Äúú1V´«\ŒýkŠYßTñ\Ó‹ÍúÙ%ué’ã«KŽ­KJ›lÖ·ð7¤'È+ð¨ño €ÊÀóäTô¶r%–‡j/V‘û Û%dÜbé\2Ûýf}7ñÌè0ñžô”“ÓlÕ¦ŸBecÕìÆqcEä”D…ŠÇ=Ž”•orâ}õ´ôôU´œ·[¤Øê ?ѲrÒ›)àH?SѶ§ÔøóÔì?í” û*5–Rã†BZWï„c´Cß“C9IóG“ï‘;ß²}mN-nÇ´Ý[Û—/ÛÛ§îðVº¹÷  bóïIœ·š”!gË$½3R¾ùw@ÍþT¯%¢ý›ŽøæJsx§s¥¼ÌŒÃwOCïÁÅ÷Uï 0JºUXP üCèYdÀÿÉ€wFaKØ|9Nt/ìY<…x—’K÷¬aݳaKó 9_ùÈO-Î¥OM‚ª“Ò\“*gšLì/:²äÀŽœîÎ~çñAD¶•ˆ4&™8æºrÌžÉ1ïc ŸÕZVrº“èyžuÀ¢%“"ßw&Ee¨d«ÀK2 9Ý'šeŽDe»9té7äâÚÖŒ?·=KÏ2ODŽÒŽn«c(–­òìiH3@ô4‚/‘¶r@ň§~¡ÐëüÓ¦¢Gqù},¿/>›ƒ£ô4G!§£ïÓÌ@ݹÖÇŵԇÃw}HÏ2+D®Õ eÅóxÆóøXII´ö xã5©5I3,€<”m'5ÉräAÎ3Þ2ü|’ÛJÊî“”À}p°uäA9„eÙ Ëz–s"n¶x^Pâk‡ÊÒR´WéËÙª,ôJ^<¸ø¥IPi!–è!w2>ˆ%¶‹mKÀºß ”ÔÀc´LžÛ¡‰ò¾ÓL颙æhÝš©®4Ó±ÒL-%s ¹¨ÈðU2—¥EäÚºDÿ‘Y½È<’ÌÓî§A„Z²ŠåÐrâ‹Òc£´Ê¤ô`ßíÝVé±C)Û­”’¢¾nj@Ѧ—- œ¾£2~¢þ·j¶M5ÿú‡?‹ñnYUýò£ò¦£–8¤äR/.‡zñEY;LeíÓ°EÚV+h[y£ö\jÈMmXj`wödÇ%à(æ@Iš£eÈ?’ÈÙ2FžNð5ÑÒÉXIÇ)N"Vq:%º‰†n¢¡=Gó58+•ZÛDyýD•Ýül:?Q—þ¥ã¤›Z ÒÅšGÛØÞvlo;zúýÏ}=uȶ®‹›™†”|ë÷6tý®_jÜÅ{(#Šýè%öφ ~sK/±¾²z]®G!°ÚäÓ lF½¤ÉËFo*<Á> ÿ’·¾åÌç#^Œš?¹âûœQ²Ô0DárŒNWŸóÅq ®Ÿƒ3RH«Î7½<Ò?|Ô—Uäæ ‰tÏÈ 4êÉ‘þPi~n<5¿Ì§fXÓk¾Ô˜rƒô¨î;y ¤¯Ý×ÚžÿڳŒºËÁ¥Þ®},\)9ÔŽyRòãdÇЇKiÏÈ# P?ú{¬åjµÛ7ï.ÕK‘ëK°ECëk¼‹\›dqåRGJ’ûØ~î0Šäý‹ä}%yo>IÞArJ뽄~ŸIuê;©ˆ.RÁQZ±s¯„"]÷31âÑ2mÔÔŃ9cžùˆ™º¯œ iuôIŸŽ>kíîI,kOb-êòÈž„WObËuà#gÍÙed wŠ¢ðx ¨‡ëb¼ÐÁxi\¯&òÁxÑ•ñ”}…#ý€ô5ñ%‚VõîJÏֶˇöK>”–]ܹuà-‘›µªŸ¬Õqv2 móá6F*´ØÍÚ±)ÉÑÖ°BJ÷pET¢í–…ä£ÈOtÑ«C·±x1-æhÜߦíPÀÕr®eÎ. Öaì¢x>„Áxå) À$Ó’ ¼[R-;¤;¡‚Rc%5p,žk+Ô=^Ò©ñ[j<»­ù÷†Rù”×Û¼ë>2ô‘Ö šÆNm£+åèŠtÏmûhÀÒÖMùŒ”\ÁÎÃÞå0Þž²Ü†½3Šhß& „x½Ü½Mȶ ‚OA ‡Q8Ýlã{ªT ´ÇºÛ¥zÄB'ñ6µŠy;9NÍË»tqœú§Ê§Þï¹uÚØ9Øõfo—•½]Óü%(d݃àPc[Tb!úKL—½¹%(†Ä'^‡O“JPƒr½4æâžž•÷$^ƒÆïiõeQ&ï©øf}Õ˜]¼çV¼³uÁ¥tõvâ`óÎ{–‹÷¬ÙÛi÷ƒQÌM³ÉÕEòTÐcôðˉ2žLCíþ="¡U„‹"ÙÑkÕÃE÷¨Íói{±`hœ¿ƒ ˆô©kûà ö•ƒ<&@)gß!ÌDØjÈèô¸˜£Vž„»cŽç³cŽ+þÈDêÝΡw¿;æà•+#Õä½óÃ8Rï]g¶5³tÖDÐ9ªÎjë&Ð&ÁÈ3Tõè _È5"«5’K…›ÝØ`Ô š}ù*êS ÝØQ‰F—¡ |Ëů 09ÕÀÝÆsweÌlq‘]Z\/iñQ]y]ÒG‘ïÖÆE§Úß—„Q£ßÒ4-j€±ú‰ ¯sféá°ú¶ôùY½å-EÚÒÒGNR,øñÕ}zs¸½|ÛUf;‘¸]Ö 7Úý%C Ë.æ& !š~¢3ÒH[ŒP)ù¶‹¹—yƒ\…ñž}‡;‘zà‘š‘ºì¤]!…뼇ûÏÔíG÷àî{÷zSéH¦KG¹êHn<Õ…´ê1ÖuI¼ÎaAu ã)ݧÄLcg/ÙÅ^ZL™›•ß³Wæþ!ÓLÅÊé`å§L³¬ìb-Rm³Wf.v±Uà®êÜ.j:Öq?b ˆ´éQïOØ4….Jàzµ{ö ¤®\ägr‘…/ù©Ì8ç®ÉÙ°UWŸ„MVk›¬öRñnJ;«•/V«ÔÙ©yôÚØHD„Ê£¡¶»AYýƒãY ¡º‰óh¡íù-$Æ·ð=gNÌÔx܆|s:á飣1N^²¼dÐzÇ;¬H[yI}ò’€oÛϺ\ÊZ$ºm…X‚ÓÇ–ÁZ¡¡ÉváÙ±lÙÙ.z±]Æ¿óHò²ÆMGÈö0|‡æ!~áÍ7øíÐíµPQùƒˆ*+Ŷ¡#¡<¯p+j ¥–w|çoåÛL—ôêÜ”q)ÏQʳ»µ}„”‡æ·æKÉa)ã[s;7{YšS~Òo2¾§Ób›þ´¾M“ï…]1.†ȯçÙ¢.MÏ«.éiG¹ínI1ÿà­?+oG*;ð Þÿ³ƒ8¤Ü(•3D‹ðò.º³ËÇÅ.·ŒººÙ¥Ï‡÷è+ÎÈ%ØçØôå/¶¡;©ô)ã¹#Þ§öX¢p>‰rlèãGàyIikûŠ¢Þ‡I+¯<üÀ?\Sí­FAY”µGøÝ¢ÔÛ/¬m±(÷åDíÛñh@ôMôû¡•ñi&vùdb×d"r7Ž-t®3Rø–µûÊ3:¶{ÔIP(lýdz^k J´F]í~B%ù`­³'MO¯ŒÃüsÑ}QOÉw¦ðe ‘GÓ¬c|úâ ©Zf-M£|Z)ËB¢¬?2ð"º'g‡œ°h¶aœ¾rV“³RkϦٚmáã¸LžÎ#HÏh 5ÞÙjr±Õö•'[]—At‹êU2Žm Õ=vH¨Oõâ­Ô‹Ó>$¸SÎeëQ×ÂùX gc.Úσák=çIÁ_)4Ž,ãÜÈíë„bž­Ê:Q*¹‘ªê8Ùâi»äŽÇw4Úû(±”ÜÑڲÖ¯ÇCïEÏѸLÝ@\úÈUÜW2ZXψdí‡-4šofê¹G‚F'÷ƒÒý¦t§ÍЗ}³ÂèÙ«&â K8ãd-ô¥ZÊñþ¼o¬Î:Îï¤sRTg{¡”vÅ:0‡Å…÷¯&¹¾št?JÝ Dëyö9*×@=ÈO[ÌO/F#yèk4|ÌŠ7€ET˜oê,Ô¥1E…=O5zN*²mÒr™ƒƒNòìt“vÑMz­öýÑÏØíèg"G?ýQV¸ú™Œ¹–›»¬Ç ñ¢Ÿ>ûrÁ¸—Tì+ý„&ýÄPH‹3ô)]:m'{ÚîXª;¡t\„R«µË¦Ò²C>F·Ë“<Æ fU(f¤ôvY "r5:]Æ— › Rßäj¤þÛÓˆ*僃=.ÇÖ{ôC*ÞÆúN?£‹~1Ц<˜!å·ö¡j{.Òcw¹{H_?Ýd‰¹À:(e|ê‹oç‘à›‹n8MÙqÞ59G Ù?Üõúpå‘»â‡û—ÉgÏsÆöÙ®Óåq‘í¬&Ô£ïÙ¨-GÚ"'{?×ç°ñ-X‘"¦§HÌ}ÑHû1|î3TkǶL»g¨@ÒÊÀ\«µöpYÞß»í¶;<ØÖÖ¿çPi¹°ŠôùâýëÅ·ý¤Ö¼¶  ×¡Žé0ÿ+bÆz̵‘û oÝöOë~}-²R¡Ì%=ä©~ËÑ*TbÀ|Š €þÄ€1 ‘´òî1“¨åa¬–ÊìOßzð8wˆ,,aú` óÊjS–ÈP(ëz½Œ{§¶ñ8„‹ðÍ…à’ñ'tŒw•{}’Ð!eŸ$²~’´MÊDC¿YCÕÀ üÏ‘ªxè WAuàÑ1a„µÓÌaÞ:ðþ;>/}Ñ.%´í”Ð~QBiFáïûdLks$reå#WÛÏ×Éé.™êûÜÈF<›LË¢³ÑfgP]޳JÌP‰Šƒ| ®¶ ®–á¸6:Àbßû5°Z ¬A%L“¬ÌýG&q,^äWíWÍj÷ÊaNK·¸IóIZˆxÌ„M6˜*˜Ê,ÿ"$¹Cæ ]Èÿ¤ô¬·ÐÛ;¼tùñÒŸâ¥ëêeàð2œÆ•¹·>ÁwŽú½ȶr4móÂ]‚¡€ûS“`ʈüa 5j'éç–ô<.•=Éàm“`nµW…ýøØûHx WèOŒ¯À7ÙvQµq|ÛáðõÛáëm?E§ÛÐ@ Uˆc‹KH7Rtõþ.`EÔŽÏh@‡‰÷ñ£`ç¢`߆¡6͵mjX˜ã—_Ê郜^°Ð›¾èM½ÓëÝQ(?…= Ì ÐO×m_T³ãøjT±ƒ7ä;on¿¯sËeÿ#P×™v•àÌ»Jp–U%d8#å5ÀÇ³Ç VÄn :€,“çÇ2Öb™LÕ©_Rý Ñq¡E Yh¡›“"'…´8)ビb+'ÓwìÒ|? à™„ÕVËø»Vwí;Ç”.Ž)W FNÃVSr4Ï'i´21„!e¨7¿œÏ>>Ü|T€rñƒ¢¥'hÞÍŸoÓÒG-€!· Ò_°Ä›!UsªçËkè3/“|" $D®\n}&j嵟c‹Z¼ªS“Cš~…U(T¦PXôå¿!÷gŽúì6¾{ÛeÂû%NÇÞp©†åà¸ëÂqb$ã6ÒöazÖ}#-?ÏìùW'@¶ýoxÚzv%ÊÓ¬ˆË¬RV2zUÀw€mo¯-¦åe•Gþ´Ê9h¿X]®ëÉ<¨Ðóÿ‰ ž‚"Š „#%¹ò’4ÔÁ/X÷å RŠÔXë¡+µpÒºã Þb-Z÷¶ 4šó¥}­…º¡*Õ:×@ù`A/»m“½Œ¨\ßžà ò[h©Ö D^Î72äjE¹þµâ¡c3P4 ¹)iÙM 4L(¢oŸ*M_©!ãæ ?ü\‚³™»‘üw"R‰0¤82¿œõî}}ø VD* À)"2E„G‰ˆlÊÑõ„>ø.¼òû¤ªt€˜$ÿããe"R‰0¤,>?^k̘£tžíµÍ)P·¿`E4Qàƒ&*?šh+š¨–1 @Úa –]ö°^份²}Øw¸ ½…À!':SƒÒ»Œ (-7tÖ1.aµï}›öñ“DËi›é D?—“qK˜ÂÅ㬈ÚiЃ/6~|1*¾˜mÃD-Gá_Äö¶ÊêðIlsÆLí{µå¼l“¡s8A‰'„ö›Ðn[\4±îj¢Ì2nðÖÆAê DOfF·¯3á®ðiä(Òò8M‹ü¡²È£’lˆ4vC{mSÀ@´àZË“Þìå´ {-·éƒPk\OhiNMÄeN9V{0x°ô™n½¦õÍž*¢¶1³ ¥@ÑÊ÷gï4­K>G„!¥“%ÝRÇ¥Åù„¹ùí)ÀЍ^ˆÐ÷^Ôˆ~üèž½¨ŸÜøKSzžÆáÉ·Γð$þ‹:úÓk|Йo:3í*²­¡FRšeARˆ¤4Ûå* áþ‚±J¹¼ R.ýGUö’r¡Ší]ê3ZÎ$ËÔV‹ØòElÙˆÍIlaÿþʼ£ZÒ'œ¸Nr(@¾•Úiµ×”ο¿ˆqgc)ê%­5ä^ug©Ž‹¥ËæÒ±yȸŠÑò-7Žsœ‡„Ë|èh ÉàÁ—•݆ô,ˆÃ.hCÆÑs†ýx<¤zÎð#z·››µr ¢0Óhe¦¦Ê²€k¢](ÐsšÌ~O;ÝÍ.ºÿDÔÝvg/.“°„õ> ët6>`™…çÿarëk=´ E$€“Þ>éí\ôvO'n¬þz—ó¤GîOË.‹\:5'â²aä•FðÀo¡gß&ˆ‚‘±^¶MùSÊ~O){;΄m›ü F7R´NÃàº÷i¸i[§á¨ª»¾êqT.’úª7ÛÏaû(ÐûS'f¢}б÷…Ž=瀽9 )%,D—©ï£@ﲓ­ëE¶+sNQ:¡»hÜä“lôìJ¿S;ŒT‡é\c3mÔ¥¬ˆR`ÙE·“þÈ›‹šH+jg¬F -ù ªmNçðD|Ñ›7zw›ô&C!ð½ýqE žs]Ån*òÎzp…Çζ‹+œ'·:¶žRîwé‰è ¢@ðd›”ë¸4€j‹l“°!V} àG—ÐçÇ3ÑêÚŽ€’£K(•z°Hee‘¤jÑ€Ù0v-Ú›ý=4‰Þšd” S¦ð}£ñ±<¢¿`C`¾\:àT#cª‘ÁE³aË^,—Ü‹µK»=+K¬*ú&¤•Ž#UËprþoVБ­Ùt§£‹ŽfåOwÅjÊwÊEª†T DÛéòÕtsÁЍ¹£ÐC©ø$vއHo:[Þþ{‹©þ?e".ä¦CÌ'aÝQH0sî:›ÎõJ Ò\dßû:=¾÷ujμ©^Ùõ.µ¾Ë#5 Qž4¯}X¯!Î(×R³$j«½Mé8¤&?{»+¨f‚xtÒ®.Q*»šz_íj_ÿŸ¥|ÚL˜hâr¼ßŸƒä³kø¨î9]ÝJ™„Ãe>ž@ôÉ¢Óì¹Ø uQ™@†ÅfN$¸F¶Ú»O‡øù`·•9=™CŽÂ~¸k˜úî®!æœ,9yzûù´Ìˆm·ÌˆýÛ2“Ý,£sIsIò9jArfôeò’£ªÁEž/_b-›Xó˜”ðT…›ÕKÚJ2RjßI©t‘RyVMY<Ÿ‚*¸LB«Â&¡ÕoYd¡¬ˆCG8•ǘÊc,Ä|ÚÄë_k¤\üšÔÓû¤ž†Xqcø7ìY¹¡2¹1Þ¶L“ŸI$£¿,i²Cªí–jÛ¥šüáÝòA¿F|rÃìEø3¹á­¸Q«í-VÛk©4î"€±¯3€rýqÈ{qÈÇj1ï®ò*ó³QÙRæÝPØB•X€F¬ZÄú(ób§7?EïÈôJ+úg_èáÇÖ… ü2à[xA!ލzæÖ·ÇȈÄ<i¾mKSº+_þyù r/~LøÄhw¯òá^åÛ½ÊÊ*Ûü«‚*H "•CJ1&]»}/_Ó#‡‚fz2Rû‘±{‘‘úa`¬1(ç]3ÉIW2¦÷”‰F†=¦ôd$ßÉx/D2ãžãõ¯:q¯Êüñª,ë«rß8κ,bPW9XňH%Š7—g²JZ²jÕ(%W­ã.zÁŠ(–‚ä`©è¥Ò‹¥2Vûp_ÃcùR*ú|Ú‡,†ÂŸRáþr (Àc¼‡MPûO{ñsh•ת¯uT„Ǿ®Îê˺:¤“â£Ý±³›[BQ‰vÅ̃4¥˜yÈ~Âm‹‹dLJ¬Ý{2ôUÖ4éú~¤¥…Ãb… ׆1æß~L¤hý? •m·ÊÎý˜R»ÏËûTÊU-ñDx"‚ب‹K›ôö~Iø<úUÚ¾þÆÎ/Ø„è!ásâÈN%áÛÄQv%ç¬Q¾f²ÍÙRñ»£rœûþ÷+–cÖ(÷¬QŽ]Û¶#5üxÕûØ[ × ‚<›Iëç·ãU[ÉIäåzÕ–r"‚AºËE†`F*†T4Û£"uj¾F!]Éw¹N/Ø%@0À¡ù¤¿š‰Ò|ÒÇõWwòðÒ”áEoú¢7mônS4¤ ûOÚË F žö ö-® 凼Ð-/4ŽXÇì‹B¾/¼ ?û«ðNóÎÎ jo]-¿ Ó¾Ú*̉Y~$æ…Ä1BNË8N˜BªâÓc²ç]ŽÕÿ«ëJ²-9qèVjà‘> ^ûßXå ‚ÁKç±>OÝ•@¸8@r DÕ_uUiLj€(ïËTOWA¾~ÓLõ<= ÍÅQDTG©OÁÕÆ»e¡µK„ÖëiBy„mm>ÉxÜE>†lŒ@JæÍyäø\í¨X`€F™;RÈ1ŒW§WêßV0¹ÜÔý>zX1·Btß…h4…èKˆÏ)ÄhCˆ‡÷(· ÕX@× *¢àKD!ÓÔIVS§ó¢¶1)Œ˜‰{œC&ƒF©pš„Ž —üBŸmU¸¼Üªóçhúô3vôC'ú© kª¤,uXëËß¡Ú3kikÒÖä8 ”{Õ}këI¶1)Œ‰´•"ˉ§¢ÑŠö¢Ó`¼:mßYyHó¹Bñ 1í!HÝ$ÖË `(È’õ¸e`}ï Z›2°ç … V橉 üáݰGÀå¿uLŒ¤ †ô ÙÕ1©0E­ÒFùヸíD¾üQ‘Ù‹?ªUÚ˜·½û™GïäyòÑpÚÝp{齘W7MãœÈñÎÀcd| ô©hBgï¥^eZ¬‰<¤0Ê«‰‚½Z“·W»ÎB:®ð𢛖i;„ò«±´ÒXÚ×Xš$2¹v0bµƒÕ?Åt Ö‘²CÃÔ«D4.‰h–Ø&@P5‘*³^;ïft|£ño4Ù¿ÑZQ<Óy.l5ïÝi~’ùñIõ“,¯OòV»ÈêíP2§Á@jcR<2•̵(pJœ%sHaT%óÉCÉjȱ¥dQ…Uèña]·ŠcQØB~ t€÷©dA 6L™1ˆ ð4ðý]Ê«ýn/î‘UÙ.9d¯í·úá¯hÉƒÔÆ¤Þ:åvˤ맯ì)Œâµhïá´ÛC¶X`‚”ÝFÃø0F ²„aúCf»0ô3šÈôaçýù*~äãàǘV†éÇö)¬´Š[VYµC÷¼WA9]‚r.¶žy9!Ö‘<.À]–Ir Ÿ¢ôóÁøN4²,‡?ŠÇ …± F¡Ãø¿R÷\Æ?dΗα†ök ‡¡¨mOðºBè?d¹ËÌeÊ,™{ÀIŒøÿeþàKš5*¹N„xF=o£žVå"FÕÁ3¶ùöü™‚Ê#FíN¤ú¹T¾\ cUÂh "µFS¼(ËzG;ŽG'mÛ}ÊPŒ¼AÞvÐsšîh ½/ŒÈàµo£:ŸÇÑpÆÝpF·ºZÚÑŠÕpÂ*îÆ1ú¸-}S¿7uŠùC £h}ƒHÕú  ó6;d{X9Eê:)“’ž¢±=!K\j‰_mg”¶3ú'€‡0•¸_ÆS,Ë¡NpkÛ%ö¢ä]øPòàœxK«îu!K§WˆÀÏܼú„†ðC cSu=T]ì•lª.÷VYâÜn•u&#ôØZÀæ˜`K “Þf!‘‰T0ƒÏÅÿ×Ĺ˜ë¹zÝÚz«^ ¡9Hm ¼šÇXŸB0º—Ó Ha7…0ÑCémn¼”Þ|? ©‡!Ñ©¸#eW†wôÍy¯]¨pú!ç]<ú‰Ç™²ù9£J\½Âp«+á^åâqÉųÎÁ¨d];èƒÔƤh0xÊ%ä–K÷|Ha”EòñC.¯\B—\"É–º4Ù³Ÿ¿Î‚t´‰t6™>£3T‰÷:_iØô ØŒ¥ßÕå [«.Ù.—ƒþuÓµºdã‡FÑòlrhyŽ`øH,ÓžÍ÷(B::P§i×qÃ\OèÅAŒ~ƒœv¿=‘Ù™\£…ܾ٫UÉ~Y•DË\€^Hô< v;_$•ã ¢Ó{ù\— “äÇ'Ó>Êó“‰@Þù•pD¾×þ5I­ÈIY¡àvAÁ}ƒÂÙ¦²1×Çd¹;e-Šë,x½Óu6§ëlò %Ÿ[xê:Sʱ…'å—¶íÐ1Mè8‘ÉõP¦:c‘rh‹ÜÚ"^›y¦œ(IVãÔöÛãX«wq*)¿i_©í24;DjG…Rÿ‘Æ‘|Ú¥ ²"ºL3^W¶%­Wî4ª˜_˜ÍeN´ú‡f™še¾0XüMM”Û·£†ù/5ñ¢&¦Kdr=mŠTµôCMüV_ˇSzzíЛè¿õMÕ¡:Á‡ê„¼°-ØB7Ø„UÚ^'ò\‚™;lþ©Nàƒó]ÃJ ùÀ‚ÎÆ›.GøWÀE>à¦TpS/pÓnwÀªuZ4øÓj+þ´™¾döóÔ±leyJ[ 6¦í 6–ÖU‹Ò5B  ¤6F ƒñnm½];ìgT*˽GYzHal- R†o`Œá›Îe<Ìwn‘;„zœhŠüøß~ãêÚ¤Úô©/ôµ½qÂp5QiÏÊ´븩TôI/ôÉ&ØTúOÈŠ½ÿFÞN4ø\¤¬®ÊdrÜ÷Nt@ÉüBÉmAɲ¢¤õ1䫽”²Pö½ëFü”s”|ÊÈ”ýÌ]&Ó}ã$ò‹>‡rË­Üò*7«åpµ¥í(ûÞ5>FlŒ@jµ6åV~Haš, U@ô‘Ú+"¥%"õm²"¿ÉŠô""Íbt´YÛ—ÏÀè?¤d´KI>µ×@&ø„êBŒ|Óª¡°©0W>*«`ænišº7ð¯€È|Ê×¢Ê×ò’¯·O€¼‰šŠ”!uÆ[ÁÕ4†_²pq]´}®·HÛ¶p“ëpøŠ¼ÇaÉü48ñËàD18Þ'ò4}e‹EЬ"1Qôìã)Z! » Øë¨å¾ ¹¿>×–íŒ@fߎI%'4{í…07åM¾šFcyÍ7£K~ÇôÆeů ñ…iþ²9YlNÄÄÒìm·9™­šœÞ•ìG{ÚÏö,ݨաðéX0”Ö½ýĺ÷…5 Åóàoj\—( Þñfówx˜ ÖTo¤uÖ’ÖAPpÆx×XײÑÅq^=x’óQ`ÑvääøCÛhŸ„æzܼ†@¸Üf{]ê o«ß;G˜ûÙa*HRvµÆW ÑN’( ^È@Að+:¿˜Œ_xA&¤Æ­=Ÿ l†^Vu»ƒ,óÞù!#Ô~˜ƒäss²%ð¥óé¹Bò÷xüçZ¢ÐôýŠç ¤ƒ‡O’çžO,8S†’ÀcG)Ìé÷ ãñÇG9uüÀ-ŸeP˜7p0¢At}›t["cÃqwjD úi?ºÔz HþI1uÕ-Àµ'Gq_íHɸT$ÀFÊh¼X¢LCéG´hôþû÷¿ÿäÏÿxuby^Q! üì Ž!•σP©÷Ûÿ¤XFiÃ_5¹ËÃe”Ã1º…-ð‰`ƒX[`©€ÑñFx6½¼{ßøy5a”b¤Þ7ÊçG[þ¤ rø+€Í¶ Å¸'øOIC BÅ Ìó¤ºj )ȸœÌþð¸6 ¸¥ƒªôï\ÿýgPüþÙ ³ ¥qáñud<A*†Fž€Rž˜ôÀ»ƒØ“z<“à½í@ϧܸu”¦ K€™£)è_¾?$Þ¦àòGp›ÍAPm^{ÍAÜÍÁl‰s…©1`—¹%3æ6þfn£˜ÛlkÜ3ÚÝ8ìjR)Ï«’f‘×®†/»š:û—1j@óÛϤ4øvÚÁÌâRÐrCÒ¡ÒâEVÔh—U|²JCæì„CO‰¾”ÐV™ZüPP–«¶¸³²(àãjßó>aHiZÛŽÎȤ»-›·~“¢Sæ«5H~kÜUöŽìtðd_K63ˆöݶQwøP§ž%>Ò¯/•ïOhuÌ÷ƒ¤‘%{,>0P¢Uo UÝRü§BJlK/“«÷HröIû×1RÊi¾Öx4…xvâ«ù"•Í‘ê~¦pï_TÿUÈË%±½Šä+c}™ô‡XÞŒ”#eG´3¾¢‘¿¶M÷ E´Ú62±õ‚æ?l›íí Oͱ’5–•xÎ…h±qSïUyœ.åqžFFRŒˆWh¥ߦ¸Üþ"./Ø{ì'h÷¤hW´ý’è O0è—ëWðìÈÄn«†Æt¾6ï :…~% dÓšÈBɶ Åe %™}48DŒÊ(ÑÀÇ·€Õp‹1à«ÑUò4’©ÅHîŽaÈõ9!b6«wŽz™‡MÌË&r›FÀUæÙkùÛ=ÿÁ&HÏ¥«gÀ“§<‚BbͳrÓé]ùªqn­RW°A”® )n«¨3}a¥Îž÷VüÜÜ¥O|‡(“7»ÌmÚen†L™½¼¿µaÜG¡D •¬m˜ƒá(¼f)^ª‘gê—¼hvLçÆiWÕ°éKyyý’«‚a¸-²$E+°#w¤òšG¹\s«S*ÌýÂL;ÂÄa dr R#Ç”³VPØ.P>Ï%ï¹o5EVÖ–eØ™ÒR–®ËÏ®ËêŠá×x9‘i%­ñ²“ë4t”ù‹©dÙM%ËÀùë‰aÞØ)ªuÖMÝõ!´„! ¿²–e>YešÅ®ã„¿ j=VñíaQ[.ÖF’m7’Ì1%¯Of¯Û¿(Z?„o\…or ßô‹µçSB¾—.N»mùSÐÞvAcRÌmVe ð¤£#E·¬]vY»1‚áóÂÙ$În ù Õ×äÇêÂLâW_…1(]·®ƒ+ù!ÆÐ]ŒfSŒÑAl´uÜQ”%|_&qEÝDFy×MåÊy˜¿¼Í_ÒŒ—Îý×ü}ïHRt·_©{û•¶ÛÍrîIs”Ø`O™°§|£i­î çÝGùT¼Tî3oÁ”ÝFæ´‘Ò:ˆîÛ°5ö£i%Šxz–cD*÷ˆTzÛ½5¡2ÌíV”¤õ=½L†üøž®Û÷ÈrSÁÏ&›ïÞwï÷»Ó9©.Ì QµùB¨®õ|ß:ÚÒÛ€m›)4–øã+^kÑ̽¶F‚r‰”]¶@xïï ÷u¡«<#¤ŽénáÃ(ˈízf`Úl>B +Îêö^8@rI]æltNÆ5 æ> #Ô§3ˆð±c®Å)xÑ*x±Kð²Sãv#,¹#¬£ü ‚†¯l*…y}¢v1ßÅ­÷…ªBÚÛ’Å ŸúfdEãÀNóv¥­‰‰2ß…4ü)à¿ ŽÀ¯w@ÑŸ1È“/k ÉhßaˆLû½ïY^aq ²|4›È³õo}·÷ÃRÜþ½`òn)ü ©7~Ê 68£T_ÆÂ­¾ªûõª5Š¡ RÆxÕè³ÚÝç0I§‡ï£H )nì`Ø[GƒW ~m•VkÛ­òÀ1Û³sêO2©XÜÌÄ” bêbÚNÆÛ+RÆ^‘2kEÒV¢º¢"Ù·­a¯á{ç±mN­_Úd¡­MkÓfwÓæ{{Ý£À'XALœ»ñT{«°iï6íTa‹ËYþÚ§î!µ1euÜeh4R~îÿÔ¯µö:y¯=rn%¤ì(G}aG¡C\MzÊoâ"©AxO¹ëÆ~…â‡P(7¡h—)B&·×îù£âØüGoÊ>pùŠãª1ÍR%ÅzIŠmÞÛOJAVì'¥€±|«Š «6@¥Wz‘•åD¥Rç˜3Ÿá…¥è¾o »m€Ê>Ǭü)¸HìljrŸ¨i›¨‰ïîÃÈ:ô[oýVþ¦:ŽŽ˜j9Œr$~ÁH™üQÑRU\kíÀÕú‹«ÆÂÕèÜË\q5©ŽhjúW³WýtÔÄ7Û*ÝéP=Ë ¢· DÎe9Ñ&ˆã”x·D/aèÀÐ#pTÄ$Ù²*¿ûC*ƒÕ  §ñ€ Ç–5ˆÊu‡lïqȶO-F"dZ’ÅíÜè‹RVçf5Ä—¸â—I‰bRœ¦¸v>kÀŠ<]xQäaraÊ%ÂÔ: áˆÊU5Ë»UYïms 9 {7"UbeL%7¤îk»{Œ5™¢úÖ8J(K±‡”aÌ ðYnÕFk²4ÆÐ[5Æ}óN¶ï †)Œe¿7³û¥Ö¥ªuÑõÈ~5÷`ú®9§-¬HŒ–Eå1&è|”‡†2JÑæâÍ´v¢T¿i#*úaħ~É´—-j5îþ—Í(L%6ŠfíaOÜiî2sǶt?Jù¼Ÿ‰ Æ5¦sÓéÄ“ ¤žy„ÇE‘¨Í‹qVؤ]°I/çÒöœŒØðgâ(<î"GÑYi&(b5 LÝ~RA‘¨MƒIþEÛŠÐE@´—eÝìÕãÛ”+*ªŸÕ(aë‘å[´¨#öàP`ä± zÍåÚ[ñæZåYÂŒÖAø¨â&/ªÖV7-U⺢xÓ]Å-Ž*n²¡ïíG÷¾UqӝЛ!“Êz¸”Ð:È—jæÍµŠÃí‡î¯GKÍDïMr­«—jÑŸK`ÑãXp1ós7í@­L]¨…>¤2Öâ7â‡Ø"^±…,±E±!kÝ'ûan“~È"y—…Ç”E6æÖ,EÊ|}Çá¼öÏRI¯Rɸ¤’ÅMÿŠú¨Þú` µ1)ŒQ‘º·ëJø £yÄeR¶ë‚ñ‚ímºê Åò¤T¿{ï½vöý×Â¥—…KoíÅÛ{‘£SÓä˜ãñnWï^q+Ê:f~aª¾9NãMi1úƤh0> IÊè–»n­¸  ¬=¤2bä QÛB§|Á'ýÚBçvnô©às9´ þ>Ë~Ï >wÝ;˜UvöŠ<Ç…<çBúðß5Xú´Dl{ dñ(Áz¡Á ½Ì1Cµ3): Het¢™È1fpm/ú²Æ ®¥è²O”ºríÝ»Êmg\÷Õ(—Oï•@lƒžÅíPz ½æ½µ-œ&Pò¶l~m‚ÝÒö!m4Òv!-Òv mþÊÞŒŒȉ´O¤mCÚw¤Û³s—qÿ³˜­O˜@ÞE?ï(ÊdŸL½gK°<Ö|´Q'_Žb"õïùDÃ]|à Qaxù£›³–‰Ògolly-3.3-src/Patterns/HashLife/catacryst.mc0000644000175000017500000000232212026730263016014 00000000000000[M2] (golly 2.0) #C catacryst -- a 58-cell quadratic growth pattern #C #C This was at one time the smallest pattern known pattern #C with a faster-than-linear growth rate. It has since been #C surpassed by "metacatacryst". #C #C You need to run this at least 41,000 generations to #C see anything interesting happen. #C Nick Gotts, 21 Apr 2000 $$$$$$$......*$ 4 0 0 0 1 5 0 0 2 0 6 0 0 0 3 7 0 0 4 0 8 0 0 5 0 9 0 0 0 6 10 0 0 7 0 11 0 0 8 0 12 0 0 0 9 $$$$...*$..**$*..*$ *.*$.*$ 4 11 0 12 0 5 0 0 13 0 $$$$......*$......*$....**$...*$ ...*$...*$...*$ 4 0 15 0 16 5 0 17 0 0 6 14 0 18 0 7 0 0 19 0 8 0 0 20 0 9 21 0 0 0 10 0 0 22 0 $$$$$$$....**$ 4 0 0 0 24 5 0 0 0 25 .*$.*$..**$....*$....*$....*$....*$ 4 0 0 27 0 5 0 28 0 0 ......*$......*$.......*$ 4 0 30 0 0 5 0 31 0 0 $$***$ 4 33 0 0 0 5 34 0 0 0 6 26 29 32 35 7 36 0 0 0 8 0 0 0 37 9 38 0 0 0 10 0 0 39 0 11 0 0 23 40 ......*$....**$...*$...*$...*$...*$ 4 0 42 0 0 5 43 0 0 0 6 0 44 0 0 $$$$$......*$$......*$ $$$.*$**$.*$$*$ 4 0 0 46 47 .......*$ 4 49 0 0 0 5 48 0 50 0 6 51 0 0 0 7 45 52 0 0 $$$$$**$.**$.*$ 4 0 54 0 0 5 0 0 0 55 $$$$..*$.*.*$...*$....*$ 4 0 57 0 0 5 0 0 58 0 6 0 56 0 59 7 0 60 0 0 8 53 0 0 61 9 0 62 0 0 10 63 0 0 0 11 64 0 0 0 12 41 65 0 0 13 0 10 0 66 golly-3.3-src/Patterns/HashLife/unlimited-novelty.mc0000644000175000017500000000127312026730263017513 00000000000000[M2] (golly 2.0) #C nick-gotts-n type rake interaction with apparently unlimited novelty #C (screenshot at 4.9e8: www.tweedledum.com/rwg/nick-gotts-g.png). #C The interaction of the downward puffer's trail with the first #C bounce of its backrake produces two very sparse LWSS waves. #C Bill Gosper, 27 Feb 2006 $$$$$$$..****$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 .*...*$.....*$....*$$$..*$...*$...*$ $....*$...**$ ..**$.*$$$$..****$.*...*$.....*$ 4 0 6 7 8 ....*$ 4 0 10 0 0 5 0 9 0 11 $$$$$$$.*$ $...*$..**$$$$$..*....*$ 4 0 0 13 14 5 0 0 15 0 6 0 12 16 0 *.....*$*......*$*..*$***$ .*....*$**....*$......*$......**$ 4 18 19 0 0 $$.*$*$ 4 21 0 0 0 5 20 22 0 0 6 23 0 0 0 7 17 0 24 0 8 0 5 0 25 golly-3.3-src/Patterns/HashLife/mosquito5.mc0000644000175000017500000000213412026730263015765 00000000000000[M2] (golly 2.0) #C mosquito5 -- a 71-cell pattern with a quadratic growth rate. #C Nick Gotts, 21 Oct 1998 $$$$$$$......*$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 0 7 11 0 0 8 0 12 0 0 0 9 $$$$...*$....*$*...*$.****$ 4 11 0 0 0 5 0 0 12 0 6 0 0 13 0 7 14 0 0 0 $.......*$.....*$.....***$......*$ 4 0 0 0 16 $$**$ 4 0 0 18 0 5 17 19 0 0 6 0 20 0 0 7 21 0 0 0 8 0 0 15 22 9 0 0 23 0 .*****$*....*$.....*$....*$ 4 0 0 25 0 5 0 0 0 26 6 0 0 0 27 7 0 0 28 0 $$$$$$$.....*$ $$$$$*$.*$.*$ ......**$ **$ 4 30 31 32 33 5 0 34 0 0 6 35 0 0 0 7 36 0 0 0 8 29 0 37 0 9 0 38 0 0 $$$$$.......*$ $$$.*$**$.*$ 4 40 41 0 0 5 0 42 0 0 $$$$$$***$ 4 0 44 0 0 5 0 0 0 45 6 43 46 0 0 7 0 0 47 0 8 48 0 0 0 9 0 49 0 0 10 24 0 39 50 11 51 0 0 0 .......*$...*...*$....****$ 4 0 53 0 0 5 0 54 0 0 6 0 55 0 0 7 56 0 0 0 $.....*$......**$$$$.....*$......**$ .......*$.......*$......*$$$$$.....*$ 4 0 58 0 59 4 0 32 0 0 5 0 60 0 61 6 0 0 0 62 $$$$$$$*$ 4 0 0 64 0 5 0 0 65 0 .*$.*$**$ 4 67 0 31 0 4 33 0 0 0 5 68 0 69 0 6 66 0 70 0 7 63 71 0 0 8 57 72 0 0 9 73 0 0 0 10 0 74 0 0 11 75 0 0 0 12 52 76 0 0 13 0 10 0 77 golly-3.3-src/Patterns/HashLife/puzzle.mc0000644000175000017500000000141712026730263015354 00000000000000[M2] (golly 2.0) #C At 2.3e12 (www.tweedledum.com/rwg/gottspuzz.png) this pattern seems #C to have regularized: the last twelve bursts from the left formed #C a geometric progression of trapezoids. But the top two corners #C of the next "trapezoid" are missing, as were several previous. #C To see that the trapezoid progression is exactly doubling, #C click with the up/down scaling cursor on the limit point. #C Bill Gosper, 27 Feb 2006 $$$$$$$*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 *$*$ $$....*$.....*.*$......*$ $$*$$.*$.*$.*$ 4 6 0 7 8 5 9 0 0 0 6 10 0 0 0 $$$$......**$.....*$ 4 0 0 0 12 $$$$***$..*$..*$.*$ 4 0 0 14 0 $$$$.......*$$.......*$ .....*$......*$..*...*$...****$$**$$...****$ ..*...*$......*$.....*$ 4 16 17 0 18 5 13 15 0 19 6 0 20 0 0 7 11 21 0 0 8 0 5 0 22 golly-3.3-src/Patterns/HashLife/nick-gotts-2.mc0000644000175000017500000000102112026730263016233 00000000000000[M2] (golly 2.0) #C nikk-nikkm1r90-w4s164 #C by Nick Gotts (see http://nickgotts-eventful.blogspot.com/) $$$$$$$......*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 .....*.*$$....*..*$....**$....*$ 4 7 0 0 0 5 8 0 0 0 $$$$$..*.*$.....*$.*..*$ 4 0 0 10 0 5 0 0 11 0 ***$ 4 13 0 0 0 5 14 0 0 0 6 9 12 0 15 7 16 0 0 0 $$$....*$.....*.*$......*$ 4 0 18 0 0 $$$$$$$*$ 4 0 0 20 0 5 0 19 21 0 $$$*$$.*$.*$.*$ 4 23 0 0 0 5 24 0 0 0 6 0 0 22 25 .*$..*$.*$*$..***$ 4 27 0 0 0 5 28 0 0 0 6 29 0 0 0 7 26 0 30 0 8 17 0 31 0 9 0 6 0 32 golly-3.3-src/Patterns/HashLife/totalperiodic.mc0000644000175000017500000000276212651666400016676 00000000000000[M2] (golly 2.7) #R B3/S23 #C Total periodic, by Bill Gosper. #C #C Without the block, every cell in the universe is aperiodic. #C #C The block starts to delete the nth shuttling glider at time #C 14 - 35 (-1)^n - 2 n +=A0 (1 + 12 n) 3^(2 + 5 n) #C 28478, 13286000, 4778186074, 1537671920812,... #C each time lurching slightly northeast. Thus every cell in #C the universe is eventually permanently vacant. #C #C Neil Bickford has "shewn that" no shuttling glider escapes #C the reflecting walls, although all that is required is that #C infinitely many hit the block. $$$$$$$......*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 0 3 $$$$...**..*$...**..*$ 4 0 0 0 5 5 0 0 0 6 .....***$....**.*$....***$.....**$ $.....*$....***$...*..**$...***$ .....***$.....*$.....*$.....*$......*$ $*$$$*$ 4 8 9 10 11 $$$...***$..*..*$.....*$.*...*$.....*$ ..*.*$ 4 13 0 14 0 $$$...***$...*..*$...*$...*...*$...*$ ....*.*$$$***$****$**.**$..**$ $$$$$....**$...****$...**.**$ 4 16 0 17 18 $$$$..*$.***$**.*$***$ .**$$$$$...*..*$.......*$...*...*$ 4 20 0 21 0 5 12 15 19 22 .**$****$**.**$..**$ 4 0 0 24 0 $$$$$..*$*...*$.....*$ *....*$.*****$$$$$.....**$......**$ $......*$$......*$.......*$ 4 26 0 27 28 $$$$$$$.*****$ $$$$$.....***$....*$ *....*$.....*$*...*$ ....*..*$ 4 30 31 32 33 .....**$.....*$$$......**$*....***$*....**$*......*$ $$$$$*$**$*$ 4 35 36 0 0 5 25 29 34 37 .....**$ $.*$..*$..*$***$ $$$$$.......*$.......*$ 4 0 39 40 41 ....****$$$$$...***$.....*$.....*$ ....*$$$$..**$**.**$****$***$ 4 43 0 44 0 5 42 45 0 0 6 7 23 38 46 7 0 4 0 47 golly-3.3-src/Patterns/HashLife/triple-Snark-wick-extruder.rle.gz0000644000175000017500000005024113151213347021771 00000000000000‹ ¬}]%GrÝ{þŠ6T«ÝÊï,‚aˆ`?л)ns99EÌ µÚïŠsNdÕí鹂´œ¾uëÖGfdĉùÿüô¯ï?üåÇçüî‡w><ÿøôÝñáÓç¿|÷ùýñáéÝÇŸ>Ù‘Ïï?ürüòéÇ¿==ÿÇçç>òôù‡ÏÏO}ÿÝ¿} ÿðÏOOO¿|ºwüüþùÓÓñýÓ»§õÿüü;ø¯Þ}ü·§Ïß½ÿùùéý‡óÔç§ï?á4^ãæé/?¾ÿóóǧóAžßýtþs||þ³ýâÝÓŸ_öó„O?¿ÿøîÇ?Úþç»~ú—óúžÿð”âÓÿùåÃóSZcÿÃÓþîÓù»ó=>>z~÷ñ»žÞ}øó“þüåóûß>Ÿ’wÞÿvŽÄOç¹ÿëßÎÛ?áÔÿþçóöÿ÷OÿrüòÝÏÿøôôŸ?¾?Îgùô”ZŠ¥<}¶°±ËüïïÏS<‡é‡wŸžž?¿ü凧Ÿž:>þíéÝ¿¿{ÿã»óÙÿp¾÷ùóŸß}þüüñÃ9€?þøôñ—Oß¿ûtàüûü4þ_y:>žÿÔ§wߟ_<}ÿþÃûO?Ø¿ÿüéüôñÓçÇÉúîoßW×Û<÷î—OÏO?½ûð7^êó™~8ßùœÜs>‡åÑ}ÿËç_>>óóu~øüùçÿú§?ýõ¯ýãy§¿¾ûÛï¿>ÿüéOç´ýòÓ§?ýûûç¿~>§ú»?þüÃÏÿíç*%ò?Ÿÿôn×ø§:§¤Ö?<ýíü+Žÿp¾ë9ÿôô?òŸþ5å°¥¶§c±ŽÝþûQx¤ìå8ÿJ»ý?>Ûú?œÑýcÀÓÁkdûɲųâ¶}þµ•¿]Ïúy®ýË{ûpðG9îù<ÓþÊû‘Ïßò1cå-âyëÈ«æ2Ÿ<Žgi;û|¢Â—Kþàz™Í?οq­O^òtéó!wÿK÷.ÑF…¯o7çýrÓ_ù8ß?Û3Ÿ/ÁËø-³îV–1ÎqÆ“ý2ÙßÍŒ±8Gç6!æWf$F=þWæå>-áÍyY³ó5;«Ý0VL >Û=².c… Ÿ3Ôy—±á´ó»攃©™\FÃÅlŒF³kÂ(ÕW§ñå,Æ´¿2“64Ó n7ÎÁ)ÝGdŒóQÊyN;?åcã({Ó%ý>áíŤ7l3¿ÏÜ0ƒ¼ÌØì^¯ûê”S„þ÷|¢¿¾PìWç4Ù ¥ø‘tlEkrdÌù¶þÊÊ oˆÀ¨¸voúÛ.iOÒìÏm}‹ó !cÀö‡¥kW¶Ë,£ÛGŒ_®øl/[ÑwüÓ$&®E£¢D‰ß¸d(-Ã^’×±ÈÓxþ™ío{¥s4V“µ88bqŇª/ìIm¤âæÚ"™šÀï0¸&XMxJÜz+Êb`·ü¶ÆEËÑõF‘èšÀ“Џžo’]º6S*ýQÀ¶tJKš Lbv>û×:•Œ”^…–à‚Àlãî•y ]7Õq/¨ûœpà¦Îº•gØÈûÛ–t³¹ #ÛÒÅC$L.Ö+o5ì°°±úâ Pã’6¸µðÀ8ŸƒŸ$!/–­÷Z]“=HlL3¼à]x#Nܤ8Ö„ûÙ|×?”/h¶q‘©Þº NLij·¾ñ)9ì89ÑÒõ©²ÛžZÊÞÐÔþ:竞‹˜‘3JòkÉH¡èu³udr‡;?žßa^»=i\ÏK5»D„*ëç¯ÏQ…Èu»PMxª¶™-áú=¿‰¸¯IÚ˜K+I¨Ÿ©Oc©>¯Â`ëÝb-Óð_âßÜŠ=H+SínL^XÍSJµ V}>5ÊÚ1³{3Zç‘¶SøŸŒ3Ò7ÈÈœj}‰WÀÿV7F*wþè¼ .ŸcnÆÊé°H0A=c\ð[ªéj¿¥ܨ°F؉äúw\›kA †¶­¸¬ÙÀˆY¦TB‡ŒÇf7Tñx×D=•dè_à®8Kƒ?¬²¾¦èË]ba5¤™|­„¥›(™üBpíSò?±äº­æ%>æjÙ)ȵðð¸L¤!nxªÇ⪊ÑE²CKà *Ã.P’;qFN¦Ú1Χfkà¸è´<ÆoÚO¡çô¯«¸iÁJF{òó﬿ÏÑ/\;!íïC+ù4Hf171VŒÀ¹’´nêe ¹†¨þnÈÄìÆi§ë »±JǸíÝxô^¤úðÖ\ãø=óy #hOì Úfï ¼‚9´1 p~AlÃdJAƒÛ6{"èùMr<¥¹s*òµ]¹Ør;€¥š[¢óX§Ž\l+ô[ÜôŒçªlƒªŸsfWšÇuÓKâ¾1i€¨Å•–Ñž?®ýZ‹CŸ1+ªeLUœõZçÛh`²©0q&@Áù·Ý‡a&à¸n`ËQU.È4¤„X­á)M5Ÿc®À0ñ¶ŒMëöÆ6èK‘:a­¼†éZ–Å.CËnSmØÚ†M6Ä6—… tIƒ£ žy ;ɸŸj>0Uöt°ý)_ s…|óåào„DÜ“„‡ãJÿbÓF»¾6ÉÜyØ}.û˜Ïkƒ`Ça"»ë¡º:Ïh4€xpšìH Š&Øëƒê…Ú‡°/QŠìmhúrÇœ›ìQ ¾_ˆuÖ©¡ðøÍŸ¶ ò%»g‡í4€ÉΡåºK͆[¶2l ›uØ^6BŸà©OMÿG~ù bOnR܆¶F¼Õâ\îD]¶¨ÃùÁ†«p@¸ä ÞÌDõYºû©vAd›s. [ša¹áÊsb`RVlÌ‚oB´¼ÔŒçE 50´'°Ä/4´Ç<ºÃë“Yc“h?³q!AÓ\Dƒ³d?³u¼q¹'â†ÛáµS„Í¢ÐñË”8õX˜f<‡½Õ€v$œ4'ë<’ùù¼ ß.Á¤vÜ®À¼w\„‰7·/¹r4{«–3m¸»go®;8Yx(B¯›7‹3LWGfçe¦ ýjf§Ò(cìíícÎŽ³“…ÑKðÄæ¦ £#\"¼fÈÙ†C š-è¤vÀD Úmh ÅzÔ)Ó.çv¥½4ÍGmøÒ 4Ýö)qªñ]἟֟пnôíº#Smyí.K[¡R° n3„¤Kêu"ºµ"è lM²„É =UÎ*›|ŽY$®;•‰˜;}ÓsIN?Nß  ~c•~¾ÐBÖ„ÑÔÞy)£V€8‡vþ1$Éç9¾±­ä(Ž$T _ÊÂtÁúVr*Ó7_òpÁã—c›ðÒªo¸ò tÎ;ç?—‡ýè­ó2£2ìucîvuÕ¿6ç6Î:×÷ Z4½n ÉRëÉ"ŒbôÍÓÔÙB”=O«“Ì_Ì’®DÒJ«Å/•¥ÎÌf“Ç2#J׆.…ŸDr£fܤ•lÅS‹Æ±ã½£)¬K…:9ŸƒìAÔ}eípcì{8 Ï4Ügø+H ©,Kì»C§HólK3¶MKf2ãôl¤˜˜ÔÖ§“c£X ÅE×[˜Àcâikq—×.#””]ä`ã¹ÄöX”6Rß`"|°0Ï›ÐÂy ØŠm÷goPï.¿[q[>抾@Þ£L¸«X `öœQ€‡G'¬â™>Ìô.(ÑÀ– ¾Ša@³ëÝH- q6ýKé/¨EHÝ‹¯ÔðØô‰]uˆº} \ÌÕ`P)@ÖTeí]—×°!Â+ÂÛàt W¡är@ª|ˆ‚#ç™ÑHèSá 㣜¯ªî˜âà¿>üˆk̉ã©*;™ôpÈÖž?1‰;‡¬­Zɉ’E;Ç“K—sÄäþR8L5ÙÌ¥÷ieÔ[oÔ‹Râ»Ùs8ED9 º$\-XÜÒ:¯9ü€Ð×9Í›fçV³Õùœ€)€¼f[¡ö€YÍn¤àÆœçßÁ…™"fê-Ø)/Ùš$ ë¨ʧL¼W "6i*LBqW¢˜´%xµÐ¦iaì€B¹F‰QHZæIºŠ.áy†¯Û´±¶¨mW{õ(ZV[ˆ­@ÄrÅ•í\*’ˆwÌ8¿ª— 2Å)€Õœ´/_kФmE>Q»·}£ç`QÝòn­Óý¤›ÐilÒýödàa*F†reÀGûÁ5Õ¢F‚eÎrœ*À&ä.ÜÙCe×8Èæ1¶!lj—gð|Wå"È@xQ>õ±²þP?¿É²NYо*l>Oè’ÞK á1axÁAœhU›L^Û. ‚ò°gÚäp`u”γ6Ý˜ŽæÔÀ©–¹Ä9MÅc0‰­ûƒNuªJ€Ì‚ÈÅàZÉŒV¼)áî.Nì òôÕb+ˆ+‹.rÜ&—éŒWèrÊ[× …Zv…aæ‹ ©×©m‚Ä5ò7”x8I+§¤¿Èîâoš‡„µqýC|^"ÿ“óôd6x;E±ám@YqB&L:A¢}‘&›«k*ª€$,tj:Ì×ü¶ˆSñÃEür‰s*Í? ²:\c( çNðK¡ž³¨—Ub8Ròði3ÌÉ$ ¦ËpÅ[£dë$ú1S •IgDÝËX^rUZ káC zS“šŽÚùÔTM E‘Ï€vˆû§·åV¦H"oªä– Ø *™D³{¼ÃÀ’ÚŠHÀó.òÅF2Æ$—YåŠ9«š<¨–©…FWì÷tºŸsžÅÖh¿ðWÏ¥´ÉØŸ 7ÓîÀL:XiÊžÙ&ñîL$:ýÎ/¤[Ü"mÒ´@ LTw÷OÉ>±ÏˆC'㋉ØsDH,U©{5˜[ý—&¸pjÙsY X„ >ÌD+ÞÍ(%Æ¢>ŠŽ‡†•‚ŒiU¡|\é÷ê–ÝACرȉJó¹,aƒ2N˜NhÒ!e›œXZ=míp—w½¹”øy(€ç˜_ã²³Xœç æžËpåjÍRQÁlB׿Kœ§ÂçOô”bËK™çS6®–p~Q|zÛr±çÏ Ûä“0û‚¾'ºs©F„t³K¸Tˆc<>B%¥:#½OK›$HÈÄôŸK› ŒË#oÛ<‡bv =•Yšq¥"[rw‹=×\Bp.í“Þa”33àfú£®Z¸…´Û6æXÕKœñš –U0i¥ºÝü,W~v„ÁX{£Ðo òmN1Ú׃˜ÂÜÜS‡¥èof§eoêøñ"¬lýfÖèt“é$²bŸYZ=‡1*$Q¥?æ¼ÊëmAÓ´‘£˜w2:Ùûä‹ûYzq6ÀÙ¡ù® hú|T¦9é2nI¾˜­€,¥ w»@?ÓºaÉeqɰ¬›?Xº<ùs5"ð ø“Ü]1 …“Áö‰]—c¤W”¶X)2{W·3m.ó20 ðÒpµn"L•@WóPzÑ) l¦Wïœ"BÊXÓXœ”ï¸ ™Pš¶$å²´F°,GF|#ØÏKÚ 8l«OÐΜ$kåà &°íÌh«˜}r8#2ý¦Ca¾MKQÉ/–,¦ù'e F¼¸Ê4­6ÉNcN'1j¢¶(\™‡ÒÇ]¾-–5k$‰E›V¹C)Ãg¥'>Ý["¼L#`FîˆÎNfþ"äx[>Ì|Ÿ‘9ªuVœAOéÔ™6[»3dªû\ÄHZ(“ÎôPÒMR°ÓGéluW±È¦ÄP¦ÞÎù¿­l»’µ"ˆøJª Ç’¹ÄˆP^òünQJ”«ÑYAi×` ££MyÄ q¾„pÕŒ4ìêÙt™4AH“ÔóÈ`¾aC¥D¦zB”u#• OCpS‹´Q¦²&ÙBeµô=SŸ7&»ÀžT,ù‚$×(0š: :‚ÓÜ“-Ja]sc'pBtb›jFÞÒ"îâÔn% œZ¦€ÊÉ•f…/L3ËQWŒ s ‚ó1œãåÌ7ÊI4:á&œú›uº‘i¶±’“"pLAe¬"¯ì«“!¤Ì2Ï´0‹s^#†WPÚ#At8Ä3#Já_),âî\²¢š8­uz•ëHP?Ð’SÁEŒ½LKÅ€læ ¡©fá(›,€kÃh±Eã_ àº,â1Imy ÄÙŠ60b¸aù^q³œt¦ l&ž¼Á¢-` Ô‘! ¦˜§4“¢*ëkj½Á”\»ì‚OK-B'!:~°Ù/D ºgº¤ku#·<Ü«;¢6þju«ÍáÞ¹Ò̉¤ŠW{¸‰ÃFÞÖa9)kfuk#’£Ã¤ÞB“.B"¨ÑG™ë$S°"Ö M¦-Z‘íâ…1ˆ„€2rˆæ-%ÏàEÑ”ÙÑL@å´ÚW’%«£ˆ¥ÉJFAr‡pƒYãCGZç7YLC=Ù#YIë‚e«¨@àu $¹ü®É[”ŽKµÌ…,¾qñ>Þ<­HñRÇÒ–f&Ö‰wºPº)ã(œ•¬Ð1Ì:Gî¶פ‹ZRšy§¨ô¬”åy¢åm£‚Ç{G⊱7ª3{8x?È‘(¥ûE°¸u+“(ZuZfÞ—kÖ%ª³Í€ò˜9†ëw"©«fô;tôÇB£å O8FºIixti9ËxòÊø¨l2Í™’%H¼+’Ã)c á2µSèEŒ§pœ8£¤”œmƒŠ†RYÝaâUuj–%ÄŸrA#Þ–(ÙY%ùêw‚ór<™vã 8¤_”ÈCÌNœ”.H†a±yNó5*,}Žå² k0MÅg*Ãù«‡à›ÍÊÊ–8,ÛzW_ˆb€L‡Ž 3W(Lʦ*6 äbÑËnUçYš”UHÞ¦ƒ(C×Yé2¹g²PÈ=Iô®„eÐ΄¶‘c5f°Æ#Iø˜×jO %(ciU“'ž±Ú+ÿÎ? ¹2¸x8Ø\]CI»3h»óìÄE¢=ÙKÂ:‘ÿœÑÙÑ`e>>ÍcIÒ˜Ô´ypg°‘õO-×^yl¾PBV˜Xœ_‹íÒ4à)µRј!oòŸ)[-ˆÛ}õÙ‰Y¾FvëæfÉ&šuôð›YnO䑊'A*8…ôž³ÎwÖ‹Ë&_<>¨PSq8/*¸Ç Á*²àÎÄÒK‚l”ÈšyZèlñÉWq.ÔU¯_È.zi,}¤O²pzaš.9G¹fôfT-S¹ä¶ ú¤76`õ:SÝlJ~nÇe²fB—Ö§\%¨‘{›‘BÈÜàm|ÑxB_÷c<26à…K›ûbë‹0GSž"1•§²ÎðÅÿ´Õ`õ“ÛR‚ç¼bŽ›Š(“]‹Z³a¡N®Ù0AyóÄYÕÎQ+L˜}ÍÓn&VQ"Årg6OˆD!쵺}†X  é‡S°AµŠ•=p8ëtÎÓtŒba‘Ìܸî!ë`+S[fj"ýËC 3à[Ý!âŽì2qáW ºã¦Q̽8/»3=({"ÓÂÊå2¦:tì`“ ¯Z/á¦âŽ´2bÿ™GÖN픩DíØ¯dÜÐs„«âGäæìW º3ºfò  Ñò¬r°/4ʤ1'(È‚±ÍOËnM¢P¢¡%Èzñ,ÃæXwQs®TcŸÄÂÅ Wµ„ˆIóC>k½y>(àgAÍiÑ0uÀz0änìKUð†ºƒ(šŠ#ÛÀ3'ÎÉHvõ4ªYÌoIyÛu÷Ìû¾°¥I)»W†±ÎŸ¼~=Ú­—'Uúy£B—XBÏ…"Ë(.LHµÎ×ç©Êö‹ÀwD„äžäIlÃÔÛEcÑ.³{ÈÂIÝdþ’L£…^ïq3Wăì4&1¦I[ÐÎOùüª_ié–õ™{ÅbdÝÊYÕªbîÌZÿ <¡,[àŒDy¬D[`O°­ {*~Û.•` ¥6¤ *â¦$q £Îav ñdg¼‘žß´ü”˜…îÄ·ÉÖ„åæ¿Ò9 ¤g/ >kõ%1û¹»É„æì즢*`¤Ù¨ «ÚcxV•Ï?¨~vU”ûÂ|„!Ø=ÂV …Ujêà{sj2ÜñÁµ4I&’Rô]IäðÚI0‘ƒ—#Cö>šÄµ{z‚§/Éë.Bšr[f¢žH.ÏUHàgÂÉd›ôîA#抻0‰-uî}¤ŽÆŠ,t§ã%/ÍšF(Ûp•á^)ÌWR¦ÎÅîìJÌcz± €¬º/¤NlÕçU9\ê¹#W6Ë8W15\eHË \®tæ<$•Ij¯F‡ ·*JçUîao5ƒy…Ϩ…´‘F¼:£êˆ­²KIœiñËŒKyç<¬<å¥zÙ}-Ý]5¤˜¢Û•ë@CæEøðN Ü®ð «1l€+ð!°¤ßDrv‡Ñ´ÕƒñBnùf˜Berj¾“âáQ Õ&RSyA•Ÿ4+¸{Ú½땆(ƒ`׿<Ž0jéž&ž­'æ°IO¥^]夃¸”å‚Ð"“‚,3îÞHÁ!‚§%1Ý¢xh–)g½Ì <#Wß«¢¤ù8)4o‡ “s}¾¯}ñò§ˆ$4wž‚ÊiÌæŒß?¾øÏW¿¼þ®?†œ®ÎZ=€&[ Žæöø°á­/îÿ3=#å±då5s‘1å|–-&^Ñóue…ÄÓâŸÞüOxóõ²ñ ¦¨:±2×3\0çBIô«z8²sQ§™ÏB¸ŒÔÖ[H`¨D¸3 å‹HS CŒÊúå3[6>¾3žš…ü„ó2óù®c¯ŽÊ5›üœÄ÷RòWv"鋉‹.·‚¬µ«)Â\¹Üû/d}­ƒ+iä7æéL1ð'›n²·+HöÊßáá‹"½²ù(¼õ³—˜­ùæOèRG¼ýâ啾ßp§c02’z$CŽéŽRHÕ¢ ÄÃöâ³]$¿zFÐU³Q»oR_^è­Ïá•4¯>ÍðSo¾öÈð[ç•bÔ°~ùHáÍg>1 ~,»d76D lMðF8§_ˆ{¬räöùå÷ƒãèŸÃ'ü†ÏHBJ¯]æ–äÍë¼|PÄn׎~ƒßð@¿@È/ÅßX +ÓÆµìÕÊ‹ «®ñ)Ý?aôO€øö P°{ëûû§ðµ/¿¸0tÙ+߇ÇG{|Ø4b(äí[„ë#±¨ræìb ÒLªé`;‘úÎ[…—~í3¬=®ùw]æõÏáï½>‡oþ2ë½ êÕ†”ýœèis ý¯í7ÿÞüî©¥Äÿú•Âõ'%æ÷< {ÆýÎ×øO¿ÌÉ•½+ƒ Þe%Ú¿>Ûá«'ÈGyõ²E8æA&ß%{á÷ëoÞ…%SÍ“Ø7”q2„“ PB}¡þ¾QeÍOHþRÝÅë×±fµ¼}Õðí:ókŸ~Ãe8Jî«Ã‡@³nMÆ&ƒy}ósH®T¿<‰Bt7–>BçÀgû¦ú‹‡ùû.@äÄMª ó= l`”ö¶ïôòŠ#Ѫ u¾óW á·`¼W?×ë.I¶Î8 8T´Þ¿å¾¯|¿õzŽt”¯\„µN‡üu˜­ÞòŠ¿å?«ÖëáUg‚ú!ý %)¡¸Þ>Û\S[ÎC4šñ·]8|Óݽèûå·î ¹ÍŽ ƒ{¢¬¿Ax!À›ÍO>^^v~ÿ«ðx‘u¿¶šÊÓÅáJSDéoÊ©¿F'¼J$àw‡=Üïðâl›Î¿åÊþ0Kšm:A€uÅ> Bp;·,lðéóŒª&a”Àx¼B-¼|FO;¸è–·y”7GƒãÛ¾}õ2ª„ze°«ïçMäðNd~lZ PŸXyüŠØÁ ¬×O˜—ÏÚ¤@)7 Ì›‚÷ê—á÷Œ â<à’§nðŠšƒT*IŸº[ÑØòrQ@¨¿X¯‡ NÒ\|ú›ŸÃ×OÀ ¿8¡ÑÝ~¸GøêMÞü<}v ¿ç"/?‡·N`v„Íûµñ§Ç°°l”¼oxsm$EÒÇßöI¼Š>¶¯ç°ýŽË…ßû¿é2>>:kÌf{ê£ ²VMá‚–/÷-ŸÃ¯þ j¿zM¹(hû»ž#2ÂõðÚç Ô¸ç Ov5¡óDÎ\¨HZ¾pýù÷üõŸf8Á¤üæk…¿ûA~ÇeDâ©|Rx"°лºy”ÈmðM3~Ÿˆ¼%2/OèwfäW¯þžGø¦wjú¼³€Jy°Ui—ݳ%™F•]¯ØáWõŒZf|õHÀO¨¦³ÎË= ²‡ÊäØñ0­¥¾ýZF¼°œ§Íb8åÆÐà0Kâë&ñÑÂ1Þ ¾yÎ+‡bßg<âËk…W/þÚ0€-ö¥U ßl—Ý—þâfðQîï›´\ÕêçÛç¨J­m™ÂGî~A?¬/ CÜ7¾€–ùu´)üø&P| Îຠ¦·ðpøf|™6~yKðýLdw¿ÄÂ/F7XÊöm@`~yݱ¿Çþ«nÏ7ùLWHêÐt—GÞvξåoù[á:pà=¾Çê÷T„¼Í2ïÅÁøƒ;üÚÿˆ œ'ÙUÎú†gKýš<^ W˜¬z ÷óoÉÀ`”;ß¼’ p#¼ûà Ò&X"Y¹áÕŠÜæÙ¨rg½¶¡B¦Uff~`–ŠÀT«µL7ö'#'ý~¨ïÜo‡/¤mžêÃ)W¥~}ë˜z‘ ¸zRö5 å6gÆÜ=¯Áœ™’-\_¦ß ÏïD„qáÈ…dj²kÜÎs¸œpyÏ/}k^òËã³óàªk3C?R½|-(S…‘¡ï_9QyóÍ@©WÇÌ }Èï¢Æ›^Œ98‰èÍV·k“c¶3Ä‚Rú–ÒhŽˆÎ¼•Ûʨkº™#wݹ†ƒEÅéYÉa³Â ôäm…ºöa€ÚË~–9Ú^˜ÊÆÙ$¤,Ózu- Ìæ…£L›Ímðo2W&Î_š$j´¸o<öX¨Ö.Ü”Ü ÿ/)½~ŠèØiA6Ý(Êáb ,Kˆžå˜Ø"í³¥8HV¸¯>k`xvæ®Ö+¦¾ð5™ Eº“‰ŸÜëÆìƒå]1% ö^dP§”d¬Â Þ K—dFð´¯SDa¥IˆÜ\•ÑÒ¤ÆCGã^¢jÝ«&´5¥Ã×{ö âÆc…–_}WÂæ„­èÓè[b© ;ãᘋô-¡ñ^"ÅóÆ%Щ©"ÞÎkŽ4ÒÕi#0Ím»Á®…)ÉÕkЫü-‡Jé8·Ãœ[ŽlúCT4Ijѹ+ù&*{-¹$ÎòžsA âmIµâ/ªð¡&ôôÊ{!¶=#6L ÚßýØ3N ¼îƒ|V¶¾RŠT–ã»ïû½”Í„5/·ƒ½Ò—°ÙgªxáÜ]ϸ!OÓÃðÇî¶Ç-V‰ÌšÍ\ß"ƒö9 t}Ž.¨^ûc5€ê·‡Öeójt´¼„äb$ûJÍ<û&ñƒéÚÅÕz±ÉVZäjîºM6tÐÖ¦8y³…]BÊÌ‹-Üß—£¶D¢u ç›ÿ{µh¡â®2ÍëýØ9r35°ÝÀ*ЛñDss°©Hš Ê ×jŸ-uQÅEÅ'âvQèÛÍDt,2»N3ÑØXàH_‘jQÑ ÞlåDkU_bÓÔ¶Ï~cȶ"+HBé,¼<ˆbð¶cfg¸ÕIݽhQÓWž^.éQejRÑè‚b}ãÙŽfîþ:·<6Á¼¶ôHjbÏNð(ÍbW-lr¼Åý¡^%­*€‚GÉMƘ¢ÞÁ<ïíV,X~ Dn²HŒ%.Ä$ú žûŸ~OÚÒ•J¥•T*¶÷ä6-1ã?yšu3œ§ ż/ãÚŠ qCÄ›j²ø³Z%|Ù†²>–20ï¾ëK%ó˜TÏ­Áñôv33IÎöæØv¯ð…7Ö^I]±4ǹVÖ¹–¯Í¢ìÔã” ß…%ꪤg}¶ô ælxÉs!*qu›ØmB–’[õeÈ›ª:½çˆJáÊúZÚUý¬ýf-§|'oMÌ“VYüQ|û6ûUc}K¿Š™®‚ü[m^Û·p˜š&T-$‚€â2Kí]eòh’Éé]"7+ªFJÿf+NöÐP ;úÓOD±tS8Ñ;ôú7 †ìð_`k0äÚl¬nÍÆØ¦Õ¹JUÿ,)º¹¨ñ¶š«Æ ¯y»sGƒ¾Ê1h LJ«ÇÝö€“Ù[õ<›Äã1Ëìåž$'Ž#4ÃpÞOôúÆm˜Ö8‡OÈrLnÚºÝv`¦—ž‰â¼"¡2Œnµ¹ì7BÈ<„IS+QUO2‡€ÝÛ’\~.pìÞš–]ÂÐæÒÂq7ÔÐy@g—­Ï[Õ9|×à Û¦ æ ‡œ›k„ÔE®m™*¤r-úÛH6£{Ô ›'gdÒcî*ä?¦kUØù¢Äæ*Úƒ:yw×7à *þZ»ëÇ%7íÙ«;}AçD.~Øç€(ȬŒNÔYíÂIØé)²ƒ(˜Ö4åòØEìöh³Ôw÷àÑu&rKToÙÄŠöº«¢»yŸË ¸rcÐ ª´¦²Ë?ÃFÑj‡ 7¢ˆ<§™ ¾9Œ™hvqÙ˘¨…û9‘\ÁÔ^=µé×G†3±ï­'ÀÙ’ ÛítAVÙQ›‰ÜVÏáì5*yVÍ­ïÌX§¢ÉÅ!¨:72˜$ªÑ¶©8i±I\3ç%5w˜}àNaA”‰,wÅîæ •”Ü yÛ…¼&ÕáÞÑTGi.úÄTmQL©` Wâ˜ÔHv²Fs³ì?Lj›gýjØŒ%]­}µæð”Ø?{?íZ»±I J%nåf"l@çŽ:i)̳¯Äq1ðrs;Û»;«mӊ׶ޘh6 $I´¡YYU§¤vé†êñ'Š8Î3õTw±³{!/f¯¡¦;èÑš#2š‡OF„ZH.Óó‡c[‘ÅÊûîÈ ç‰¤÷œn$tñ½Î}7?Gm !ÍÑHBøÑwsB÷î1 µ@"8dshùÝÙ»‘°[´O‘é;øîé‘A™ÉƒîN<%úÆØÝ…èºxÖÙL TmR¬^£Ïœ&ä,Šø¸š¦Š.!XÀ0sﳄ%¦ìÇ+…Hù*žÊÉ475™=ÄÚ4vÉ÷²ÍÛdO»‚Œ¹»ñ ;˱7n¡–äj42I`Wp’ÞE…È#/{›Ö)tD ÙéI•â釓ޓ•eHJ†ªa~q\ô¡’µÍ˜‹ öW»•Sõ™apZ> V–µª„¹“'R÷4·„ŸU±L`ÍB­´ÎW›^ 2S&ÙÒ§U…¶Rgh(µ¹O3"¹‰êÔkQž-âjD^'‡ ×°îÌÕÁp/£ÍÍIéE+q/m´ ôKÊ`eùð«šg› Ò¶IxLÒ®®Ü2ß·MpÛ@|Œ[ #±ÜÔüùêÔ‹ó¸†[ok, vº_PÞ’2´2÷÷¸·@ÎLˆÃW› ã’Ç䔂öSr¾)‰S"wÈç¨d´©éÀ± [é¤ ³VîÒ¸ä´ÍG÷Ü„¬oä!­ÌCS8›ƒ*ÄäE`í#‹I±_bHîË”% Ù³˜xŠ’¬Lÿs+C<ÉßWÅVÙ¡7ãHv=1LZ]< ™Q¸ÁC›5úDŠY',€Å–ªÌ*ôEéäM;#$§È!K¯NŸ;­Ó(tÄ×k{ 6…çz°ûwO‘£5.kæñÌD6´_[ùŠåI‡ïš˜”·rlW—¼0uYUú‘\ÂYÍ–#øý= æ¦C˜¼9ã=@L ‰…Ò¼–²zúzÄ– ~î\…UÃÎI- ÒU#‘X0yscZYrj‰_ePoÖ;ì~” LîàÁê&4"Fµ("s·égMú‰«ŒnCÁîSUT[:MZ‹s†.\dEI‘žD 8?µ¸¥Ñ”gj7óU³ÓfÎí¢+¸ž RÈŠÂÓÙ‹K]‘µ©çBŸ]ajZàË"±£`oý§êXâŸÙ"z4]žš¾Ï›#û³û,qĄ̃Þâa¢‚ÑE©²›ëΤŠîLYË“ÁÚ=7²ßögT¢jŸ;ø#qûÉÛréî“C'1,ˆµ`] (ˤ*'¹¯.l€¿´~ÓÚ8Y $(–æë¨ßÝs(nä¹)*xLµŒ¤$VðÑT²ÝØ_pó¤œÈб¾ËZX6B ~VDÅÔä6s[žKÏw1dG~¨6fþ^^fa /¶~°/oÆ­¯aîV]¾)Ýß©TðƒrL_1ƒÚ[Læ)Mî6+1´ gbM£`«Q@rÎèö«;dJÏQÔŸ¥2“#§`€YJ^žç®¤Õã%bóŠ$© Mg7”™ß·ÏAM$mrùÍü<*uw7º;<|ÍìHDú=‡™9޲b—"_zÙ\Ó&lC.µmíþÃTµÊ£ÊÂÝ&œ'ö)~ÚÇ#„Sšf!+ЖDd!ù‘â²ßõ™Ó†ïPñ3ª½Wj÷½.-ºÏ7¼ÈÊWÕšê+ù|3Jª=„ˆDˆ”¡Ö¸ÀNÀ[µÃH‡d€~ºh\BØrÇNA$A‘®™é}§{”²ñÎõa’8-ÝU” k’ -+h•N¹AÜ¥"ûlSQwSï)Åî@ʘw]¼¸‘0‘ìmó8VžQ îv˜=ßí`D¸´k뾩XQeÎ|/Ì™»xèx½^á¢ÀTʱ^z2Í•¹ e°Ò#0ãΣÉ9jBBòð½Rº²“vžÄdeUsÎͬîáW×Ý‹ŸéœtêOß÷ô5^@̼û¯ióØ ŠdHžâ…€ô•–UË|êóuú±£+ o¡ÇàufÖ¼+‘iŠ\á*Íé: PÐDÄËÆèµ÷+zy ±Ÿ^;f%€L*Û”>É­;±6 ƒM‰Iï•É”[9iËòP°ZòðŒ/š$´iLf†˜+gÉYµUÝñÔ O3s8‡Ë8SZ *òä`ŒN‚Ú§Õ|°½yW!9}ص=Ú!º›rÚ”(ë\’°¶¤W‹ î“ÁðH¼ª¼ðÅå5xm^öÀ¾ödl´V`»sÇ=16ŶåcÃí=' ÌÁ~mãOð¹Ú“g$øaG—ˆÉð¸Âô+Á4֕ݸã=L­j0±S§–ÊX©ä˜´À—Ý~©ók›`°BéFÂÄ[NÒR˜¾°y®`õ´äÍÆÝù!œˆz•¤¬ì·Uf5!¶ÔèŽ$€™,WifdêXî¤Æ,IíÂŒs ò<4&¹ ‰ú«ú¶Pcâ Æ’èCeTÖ6ƒ1ܵˆ\#v¿iþ}BX`Š:'²nÌî‚yˆTDa æÑ3I>ë6¬IlQî>¦y4kÄoÝÜq)ûâ("Vn¤)¼È„X]»^`ždžØš´ÑÚp¬Î´Õ‰f‡yBª‹\aŽGåÓÈ.} É F69¿Låpö¼ßg›m2â LvE“nÀŽm¨ÆÙ|¡;{¦ÝÚL'…è;±ñ„cVÍ%?­ž©Bô òf^Šd§&úõ*C¬Í9‡œæzµxåêµtm oOy«•Ò,í[žÝ¡Üg•Š_ü$ׯT{x§Uª/=Î ãXä‰'‰0*}ó?å³¹jG± ®çd÷ª5¦ [èÑ6º3Í¡n6Sm“ˆg„ {“gcoN)8¤Ÿç\­XÀ>“[/ó.ÓÏÝO‰ÅñQ-†Ê!¹SynkÑꥫ}e žâÆ<{/.dÅ9ænE¥›‰í(æ¤ ¯£Dã#ÏBÙÊmÚ;QÎÒÈó0iŽ+›†žFgW8·LÉQœjöÒT~¸|eXp+l¾gE±·¯ä$Ú”(?¢€ÌØ…wIñþ ’‡¬Íä3v2äþ¨Üpæ2§Y}b£b– ÜÛRRòycu^HŒ–6䆚4;`÷,kÀ(‰2v©‘P  PÁ+]•ü3âØWìgŸÛ‹lOÇX†ü"¥s©Œ/mÊÜ,ôú1ßIyÚÔÊ^šMÄÙPJœ!%Q©õ æel­dÛb‡Ñ6…¬pqr½—è0.u/2u´«Œïj™blj:B%ÜþQ pBD6$`üŠAˆ$àãœG›¦A|[QÐt©dÁ ÑQ­i[e&” ËZ>Kð-'ÝË>’rˆÕô)ÒÒzµ±R'èR–,ëÝÍ&3#¶õ™¯µ+ñ jSš"äKO3΋}SUÕ6£Tç Ô!›io›qƒMÊ$ĪR׫`(¹îÙÑDki’rlÄ ´“)sTmÖB+ýE?:Úy.Â÷êÑKˆ8lÙÕd¹´KÕ*?Bñ¬ª¯'»8ä zO•xk¢6¹&LÞ˜û£î/Êúºç0–f8m´1ŸÆ®„y0úDSEîúqtÙ·.”v¦ 7Vï`j°e1L‹bìHŽÏ^Ò³$@:3­Wûkgþ)¸Œ'(C'C›¼utóOò!ŽÈ™Ð©»ÞÚÌ>{.¿…Ô÷&çE1àS3¬Ì”OÅKÆ]ML½¼Íä–®NZâ<⤹+¬»¾ëƒD=}ÐwÙg…UTz8~¸Ûe“y÷À:4èGŽówóA®Àù'‡)óKñ=Š“¶>æ#+‹VN½‡h«7ÄN§üÒŠÑÏW8 Ê«œqˆS”Ö=#8Ê—ò¸f‹ŽÕÄc ºë,43Ëì®qöËTE4µ/»°ª¬ã<Ù5vu{•jT¿YÕ‡Ü?ðw!RE5<¨3MùæÛw ×™Ë0òvó|›ó#° w3]Ë*vpÀ³È uK5L%oÅ š–‘Ì/°ÝÒ›ÎR31=j-mÌØš)Š£Õ´e]¯‡à3[¬ù«mU‰èÉjÏ1êM©Ûw Ö›\ ˜µŠ3 b0ñü~ú‚q¾ûª¦ g»â•ÐI TªÓ{aóˆWVîçæ‹b†.Ј²«°–Ž7W)²ìqJ•]æK¹ž`l¡èÞ¨LUôNÐÎ)¡wòêñ”„–KGï¦ 7SޏóðòÌÈØ€Fé èúoix[¸47=„ºìÌçÙ¨Ïä,B2ÚÏ®¥MwnUðKß®Ü(u_«¯ªlϳb.ã¶Nª%ɤ)=õ”QMÞgwš¦Ì"™" Ô 8u6!•eË:.¥é õµWHr¹Â(&ךW)e~í´|Vš¯~aÍK:ú,ÚÍúø•Ö0÷–³o¨zZ„´É-/¦7ˆj>V–šQ ¬“ª,ã÷Œ10£±1ísÊ—“5œé@ÞÔ=Ä”åÄ*Q$߬MdçGôiÍýóìûƒ¨«}£ìJ©Ê! …,˜[¦él,Çh!‚(¦~aƒËiWdêôÊš~DÔÚ¶Ç+_·¸SÇüøAC 꼋ˆ)““$Ø<¿ð æ•ü¯Êòšý„pËDŽj€ §!²è0ÍÚuy÷<ÛcOy lÕUwßèpíÎ*ÁuÕW*±æ’Í>×’Æê²~Ï]Ôâ?O;`É¢fqôôÃ]%¬nÇÏsª$àž ¦¤±+!mgˆºwÉϰU‡u¢O€ðMgºd›%†8rì^©x&¡TQª´+¦´‡Ÿ8‡Yiž¸Iq—S˜_Û1³ým‘y3,¦jO6Á-ÐPTUamB8ñŸÓ†¯S_E¬­!–€ö‰ÖÞ£ì8…Á sè,BD¡ãøÆGH*€5 ßk]¯ìiNõæ‚!‹ƒÅ*“B_HÓ"ü?Wø=`("D^ÄŠ£Ç °ª3a)2Óî™|\ðA P¢ ( ׎“&íê%G¿Plц¶%å²±7w¢pàq¤Š¢$0%H»À{Âíg¼o¬3È®DHÏv%:ÄšÔ#º´0Õ iïI \‘Ý“;ûÍ¢µ£X(®6Ëá˘áQg¾Ã-^ºéU!w à =ݺ«jsŒ¸+%gWîõÄø6®Ý/4Â5îKßyš(š» zg—$‘Õ§ÙvE$Á…¨Ÿ!yé¼€7à²ëNÊ þD~4OÓ$í± /V)Éã«TâÝe·”9âð®6y_½(ÚÊ~ «zžºÊëü§ø?–ÃÅõµ ¤ØÞš®õéÌj(Q}ÖÆ½˜Q¦[>.“])°}ZvŸ¼~~(}Ó&t/ðÆœFÁñ ³®µ2opj×GãZ&JŠbÖaE‰ælP2…hòü·ÌéÊ>k=jÆ„¼EžˆGa#®<—§Pšg ¥³p»@ ;˯Ýgˆœ Ó‹)YŽR\'cèYe}*ZŒm}±|®•´hàLéŸC‹€âêù`W úsÃeÔÒ:GînʶýfÊ܌Ɋe ÝM^¿¢yÜzuƒò30ÂböýPø²Ç$m™ê1ý t÷"}JN…éjCµšØsÉ$GÏáEP¹@ž 'ÏÁUÚ¤Ý8âáCxŒ¾;r9ýÔÖ—ÌúçW-‡†{ÀÅ0§+ÜshQb‘c v¯MÉW¸€z“¬Á²‘r›ÐKÎu×&ª]D_£âg÷Ù•~y\…âÐÿ'MY•¯¨~u’ÕÙA‘Ò+<\2襂UÃVÑLJÙxì·”ó´†Ò{b¡`r_ðÙ¯σäÝu½IŸ V Ç ±Õ騜'Ò˜pÈS6ùÄZ^«uÇPÚ¿\YTÂoñXoW¢·¯‹Þ°Ò¯AÆ=ð®ö> ÉcšÓŽ48'×w=$ç‡,lvñœÔiÞ¦Ž; s NØjÚ= ^K˜¢¾s×~SË!¨OÉñÅxŽ!ª+]†wòq]4h©¯¦f Mœ¼²§àÞ3’—âÝóžvé¦ëî†ÚŽ„»h|Eu Y¹6'ÿ:ŒLp(±˜3W Nêµj :?RUŽ›%õâ”\Ÿi’€oCšÓ| 2¯)~aÈ8@U¦€IÛ}o 7+j†?uÓúÊrž«9¼\Î×<Ýçèù™Ó¾2?•â“qŸ‹ÿþ?ÿÿj°ó¾ígolly-3.3-src/Patterns/HashLife/demonoid-c512-hashlife-friendly.mc.gz0000755000175000017500000025207113543255652022323 00000000000000‹ „½Û®-É‘$ö¾¿b]@KšÃ »„ Í£ 4‚pÈêî°YÙ3Ö×+ÜÌ<"r6D¢öÉ•+Wfd\<übnþýoöþ7ÿëþð/Ÿù»ý·ó~þÏù7ÿÑòÇßü»Ïÿå·ù‡ÿõ—¿ûùßüÝŸùù¿_×üî75Ùç¿ÿùý㯿üþûçç¿ûõÿôË~þýçú—Ïÿé÷¿ýÇÏÿãûçøõ¿üî~þóßþÅïñùù—_þø÷øùßüî~ûÇ?þü‡Ï¿üüÛ?ÿî>ÿôç_ÿþÏëú¿ýËþò§ßþù/?ÿí÷ÏÿøO?ÿi]þÿþüùË_>Ë3Ûçï~þÃt›ßÿòÛ¿ÿõ¿]-ý>ÿôóŸùõ÷~•ý?–>ÿí§=³§jŸÿôËïþó_¾óÿþ·ÿõçÏÿðçŸþãÏÿÝgz>ÿ÷ßýÓ¯ÿéç?¯kÓô+þáŸþéOÿýo~ó»_ÿøÏ¿ý—?¬×üþ»_ÿñ7÷ëŸÿË?þå7ÿõ—ŸÿùŸ~ýÓ/¿ûþ§øÓÿø§ÛJÏßü ÿüë?þç_þó/¿‰Þùø‰ÿûîÿûöí§òù¬ÿ§Ïç£âÈÖQÃQ^GGÏgù:ªSGí#=:ì)ép|¬±ðƒuÙGʼûãÇEW¤ô‘ø,¿ò#ñi~éGâóüÒÄ'ú¥‰ÏôK?®ö¯78ûþãCo÷m¿æ~áo_⇆ߢð0KxÐúÚ¯\—ÓþÝ3o4¿ùæÿç•?ñ’ÝÊoü€_™?ÁÚ§õõ,Ó‡^j_ü~5þX?ÏkXÐÓÞ®oñÝ~'´+çÏ\ð2Ù>3ºz ©Ù§ù›å†QÍ·ùézè7=”Ò8ü|»¾Õ´Hë!EÇv®Œ;áÒ¢«5ÁÖ•u5§pj”¦9VÖ?šdy|–ñWºäÛ_íê÷­)ÚúÓÕw×[­ËkÞͨ%ZÜ>+gk­hGÅdD;*;(Þ÷äæ—÷iÞ½í4CrWËûâVöòju¯¯fŸ­}hù¯šVÛy˼nÐøàî§KúÒˆî/Óy¶gܸ—÷=溸7ýîÛ~Ÿ>î–¯Y¥F¬8âÉÒÑöÏajþÈ貆gÖÏQ–ˆ(þƒºîP”íã_Y»?ëÑœsv²-c~Τ7«Ïiû½®cÆœβ~:9¦OÀ)1Å 8ûø‰þ€˜›xm¾AzÞ>¦½1ë~é±õ ~IOy-í³¤¿®m.îôø]úkÐÖ¹õ˜ôH>3¶_§$¾G üôõëÖéÌþÂÅüÈð™+ Q°+÷$‰ oMа&ƒ$¼í—¶„~Ldé’èÉL«èÛ ÉŽTHVϰ$ã •`Hv&ÙxOGt»q)­ d7!§kþ¸?ä½þí§³º üPãr?Ëþ¹áŠqŸÏ¦TžÓ ‰Ë´D"Ú]Lã˜Ò½˜]¬‡_ëÁKîæDc Ù–rÄÍê÷TÐÏ,Ú:kŠ7wiæŸ1¤KƦ%9Ö¯|£Z×Q-Ü ÒzÀü*žSí~ó7|!Š=D{öIMûÑžàg8]Þ\~¥Z·o|\ !’ZûqïIã²åânk›×CЭ=‡t}Óù”ÄÙÊ]boÔçö½ž®Þ‚2Ä9†g¿U‚ÔL}Þ#9øP½ÐØ£24*pÑSð§oרŠQñÛ¯—MSp‰Åõ„ê–ì|ÎÐH4žU¥VIô]se†tú×4×Îv:}vÏGoL.+ÏåVöåKµEÆ:âgކIXêå½C1÷öjÿ6îGX¾$\yºdâÒn(7]çÖþ ±¦wµäÿ%ƒÉ.M,™¯ŒÑ\›¥ì‚>UtwóÅÕZ CzÒú\C·µÐD¥ø®ùí(—§Û 3Ž£iëØ.Eö‹ñ­…6 ³é¸œZRÖ¬n­Ü¬m½Ü–n¹÷\³qts³ùñӻѥ¦~ßb¯Ce÷œû)tÙ¿¾uÛšÙb9sürÑZôã Jºk¨Ì~ËÝ“ºS_ÿ­ãbšòµ¶u¿Æ?ÛžþFµ}a\–ì +|8úÂ(89š–ù½+ä³î§$Ù(¶&fk=‹Ì¨oò)T õ*™zJ ý+µ³ûšäj?ë ûžU¬ä­Í/ úk‚ÙÖ8÷´i®Ž[Ó]2wO·Vø”º¹­Ùâv·¸á\ؘ´ÎµÀ¢]ý`W¹1ãÉŸs¿eè!žÇ¹³¹˜=zkó‡,™h¸Öù£VÊî¦H¸o‹Ur椵aXçG¦ý¸œî.£lœ1óT=lU ¢ÙE2~!ex‰ø «æ# ÐænѤì·ó«lúŽlsoøåÚoÖ‰=Dc(íÔ.õÔ.ýÔfôL*ç541òÈq‡þ¦Es(?_7ÿüÔkwÎŒÅ/ZéúkÏÕm÷I[»‚T²œRãçxòZvy Û±nq³u”Î~±úç<Çã:¤^Ôo.ïDâ:Ééè%y[ñѹÙM_ôïúq4‚u?ç e¶z @6u€ÔЭü'Ü—/½u˜œÙ’ å6/u5ç´*C–ä%³s6—A“ÿ 5#Íd¬ÙœµPEOÎÇ*ͲÛaÉg΄ÄgÇTè±`Çe¬å²'C¡‹Çz,xG†àÎRJ³FË]+šÐwó¬¹c@ôçµL8ÑýÒéê@Î\î3à ҽ¹"BÞ–DQRh®ã­ §ý’¤Åðbi1 8/–lµ¥Á·ŠùUÓ,/],‰ ¥ìÛ}aÞ…®,¹Z츱üL»øò'ú·a¿û1—ëÛgq;=ñ 9;¿(/ßèidÎë?î#e­Ð‹ Íþ_»š{¼ë1÷Cçç™ ¥œ)W¤úY;ݰôÑR¸¿•íìÄЭ]£¸7ÓMü¿¢ì.ål/eÉU6=,Äý‚õê ýPÚ§¥^^•ìŸWÓ–´-µª©s¿:¢v½tc%¿u‚²kiPc½ƒ+ºžt¤Æåë,ÛÙY–¸-ÛßY–Ô+í5WÚeQæ×ÝÎÍæiF¿Æ¡ôë¼éu˜+K$—¾¸Vaé.HÊ6í1.KÈ”ægÛ—©õí‹Eã÷wg¸œå .ŒúHûîeÄ6»6ÁÒýЬ%ðh}?.ˆk^ì7±é–%n‹ V™]±ß¾¯¾úiîy¹„ssrwù·/‡ÿ—~¡XÜwÚëg6 à}§ ýµÚu›ùy ÖŒÆÕÇÿK[ƒ¨»¯>aap–,-K¦×§‰ÛŠr’®IX] ¯¿]·÷D~f^m­i7E>>»ê’ªU’´–û]ë6oVƒJ4ƒÛàðwðÓ’d£½4/™ùãb©{Dê‘Zý¿;ZkÙvâê ·uþÃ*®µï»RŠ|>~Ýðꥹֵâ8/Ù–õŠí¸´êãµQªÔz['µíu»fWm÷uÛ÷˜9KG¨kÍÔ6ö[sæPJuȧKíéL‰î¡±˜ꕞ¯íÁ'[•ÿÇ¿‹ÖԥƾՅÚû–jWÜæô_?r­Ž³ß. 0(ê–¶ Ù­7Zk¼Žóô ã7n¾El¥‹/6s ÜêzíôY|KÈÖíi­3D>æÿÚ¨ªÏCé³årÔYÁUì‹ê鿸wãêbõ­ë|q*Ö—l­[¶¶ÇÿK{®Xmk¸)ósÙZA[r¸=÷À´'öfJ ^5ÔmÛýèô%«ÛŽ-íc¿asÑŠ¾ÜwN9Í—¥ÁÒfGKGݯ4Ar×7ãÚçZò‡ß¿™æñ8š\óµ°7Ÿf¨k;5p¯²Î¤õ_Ÿ[ûÍ¢;|&7ºÇé–CvOÜÏïÕÖÙ$åîÞ›¯M€–Ëu#íZ~I»ºvǶ$rSW¸ å}/–Ùm»L× Ë™­mÛ±î¦)!üa0Ôâ÷ëËŽ{ÜBÜp¼þ©|•dß¿ø·ö­$p*ÂàoUnH‡V„þðýþ÷û··6F4ì8ÜÚ±yÆÌ—kKX7x¾øý.·K‚¸§~¸ÆgKж–k«•£]i?}Û‘ÂÖ¢SÙ­±ëÂrmÉèÖìí ÿPûÂ4¿Q夒{Ó¡ “ñîÑo¯æ£[ÌëÖ£=¯+ˆD4iÉ<>1…¶äcƒ†Ü ÷´æqüzÜ@÷Müòþq=g·§_ë úrz%jÆX™²z‡œŽÄW ¬ÛòhtÌFC!­ÿJ‡¼¥Üe½"^ç%·KtÅ=‡§Å3&·úéÝ–„o³ØÀWYskºXhðÁ´½95ygù¤q^x—TN ø>áðìtÎJkÚ‘²¾xbýáNÚ¥.÷§]ãôrm÷‡¨·zßÓ¹]‡ ïrÐöt Í+·ÜÚžê–õºNÕý¸/}¥'N’xèöKZÌU<ÒÎÌèvðzMìFÃøˆšï¯ пøi»ˆ7¡K·pÖí2—o76i®3¦Çú­zVo]a¬a¬¯mˆÞêùK G Ê—”cõ%¹{qP‡NÞ—èïÅåzH_›V/Ž®ið„õµ‘t¢Þ½à·õ­Æ—¡ÆwØM½pâ®vñññb5Ý/ö£Š*YX²¶×=0U“³¶k%õÊïlý×/äÞOß÷êïpàö¶gh»šF×-'K;>ËcfðÛs«FA÷uXT̸ÞúËØÑ÷Þ¾Š°Þõì`# g Ó°_‚Ô?¹í¿]oÜ=<Û¡ø÷%ñ{ozR4±÷ã²ðßÌóŽ#vn?Žç÷´T´`ÜQŒ®=¥oÉÙ!Q;dgѴг—¤lw°lñ2ð>…}úé²í",|>©s÷y-9oy‹³Ñi«£À|uo»<>ãáõã9ñÞñÚ—`y÷ÅÕ—‡Õzg÷Ùú\\Áé2ÇS?¾Îæ×ªOtÍxîaÏ–‘ΰŒtbÀ#]1à‘nXƒ ƒµæã•.Ñé=>Òñ‡öÇ Íñž¦ß¿´ÖÑw1]‡aôO¦©8Û¼c9vÝË]ƒ[ {/™a\2Ãz  TŽú~©3ã¨c‰Ï‘O[F~o*_”<-‡ü„_]ã±¥è¸<{#óÎTqÊc ËQ|T†-˜QÒyˆqY ap…»ÐCå„F ›£Ï17$C7òî²zõþ’­£jSÍ{IAåæ2\­†‡a,ñ9äMåšc‚ þDµñÖý˱JGäh!•ÚÇ–¼[Žvô%eòÀªK¢ŽæÚÍàeTÿÆÁÝÅ?7Eã€*F»;blâè×’éÇâ•4…FSÅU,ãtÍ;¹ Ú<–!?:ÔŠÂÏ«µ½Ks¹õ±¤æêƒ­ü°kÅž8ÆÝ(ÿLµoÜ!0ɵïg}ÄÅšB#„‡tÀ:^=5x•ƒ †÷iÉ4ƨõgÏöIW˨o@Û˜ÜQ†À©céŸêé‘¶—(—îIa5“W®¶Ì ôs÷ u’ ]›Öô_Ì'f΀8ŸO¸W‡ÝÚs—ùÓ½ôl&2Þ¥­ÿ¼?&µßõïô6õ)Ad˜=£9¬7qõP–u"âƒõá éàWþÊ{moÏ7Ú2+o§Èë_jß¿ËÂüÿ oæ’Ù ÄLÛé}eð1±#þô±ÃIç/b=ïÛ»™»ÿçÓs‰ôii; çÚ &Á³zão¼ÕzŒþQ+ß[Z˜¹zÒñ9~ÈÆØRešÿ·ÞÏÝÕ×s‰U.Žéc°´Îióã[ôÐOL¨ø+&؃¸ìvçMl sé×/í~*Ua.)>Bì Ì{BÂ÷ÝízüÑ1(lÙ10ýE—,žÅQàIO[7Ü1¼¹v•Y~_Âhm©ÑI…å,F13¿qPíNBùék/¡3j,û¹sÐáõ(º³ÞÁù½wÞúß |ÖpÌÌúë¬ï£ÍunQ1}‚µG­ —ùlv·¦Ý-øþýò N¨Ú·.:ÀËùõS\÷–p³± SîèÙÑqØ“æÚVgw„ÀĆ8«¶¿Y<âëšHݯæ«Î~$äb]z¡Êf?žÔÙ·vƒµ…–o×òê–%}ç¸wÓ9|ûžªWÏŒö~cyPçÑãßο²”Þ{×Üùý ðεIÌy5çÑiæ¼Ô ™úå¾oKuί÷Bó®WÂ5éyŽz·>Ä}^ÀiïªõU¹¦ 7ÿXŠë˶»q}pÔ6õNeÿƒ}cò÷ž­cB=˜ˆÜ/qÂ:ë’·«gÈj{:}µ>p}àÔ™ü°eÎË¥Æ%·¾ŽéŸžØ}‰£²Ÿ¼!½ë0_ïoÞ]Æm~– Þ~,fÛk±¦g9}­;Ì[dž$¢x²\Ïë äÝ:ÔWT ×=ôž·!œíDKÔÁÐØg;l¿îO—|b:Kf'–»µ—¿ínéÔ¸]±ÂõA窚Q¶‚üSlº1æëË[ܬ¡‚óõÑû¾Zñã \ø“ÕIH]±˜âõzeáy9MêË ôÃÒÝ#°®ì¯Ù_Çç.Þö‡ô|°­nÑØ¤»Îfhe_7OBj%Fì«ÈòëÐL™yšÿ´õ= Ký~9O{zÌåúp.×§˜`³q{˾µq*íºûÜù@O¾s÷Ö7÷Þs/^73××mwæì×\ž>“}4ù¦ÓûhÜÁ·++¥çõØôœ8wJ¯T œHñT$rEë"f’Òóe&z÷Œ²g|ªM&,y.\Z}ü”IçŸSÌ¡³G§tßÖ‡×NROûSô®ÏžéRÿ•ô!\³ÓéåŽNi{Q¼W_k©ûïøˆeý¬?ÚDRº[ma–ž™ðcŽÇK2'zÄ»ES„Öˆ ÛžOéæ)å3jø(Î4¹ä™oÉÁTÞËÆ76“ì–}ŠL¿ä¯ŸiÜOIµÉßß`'(’Ò"aÝöt®¯ÁÇÖrLk›œ¹_¦H©q¿ÌÏ>'è·þI<å\z¨× J—“$ !³CVgËöˆ)_ó—Ôòšå5«[ëžLÊÿ$ Î8y"œw«æsõž®Gyû!H—vfÜO¡R¦;$yŽQRNœ^±]"(µK¥û¿kŸÇaÓÚ­×û]{ÝtÜÚ“[DêÚÜÒË=ÄþÅw…ç©9ĶÇÌê×lØ–Á+»3ú·ÏÝÄqÍèt™ ‰Ùq~_¡è’gÇ¡#>sBw5Û¿œÐMïï_$&o&OÈLž°‘\ÁÜ&VܬÏþYL¶–³9øÒÓ,Ó<¢#75Òö z³w%Ÿ{–ׇK™LÒ¶¹s$ ¹IE~Ãq xTz‰¨P#,ýøIÛçdJ¬H¶£…Ã?„’蹟υ H¶·wŒm_÷®m‹D²-s{;/Ö¥¶½þÜ>åû‡_1sîìúpI¬ßâO;7쟩]иñbƒøA‰2ˆxw9ø­–€÷†·S=y®ÝÜš§{’m´ó:4ÿS_bo”ø²ï…ÁÀ²[§ñÝÀ2º<·Å`ùÚ},Ÿhh²£¨Ÿ5ñʆò1ÙfwÀ‡ð]ã­çÁÈ&O¥; ½yo ÷"1?/yºÝÚ/8wŒm_"u:ã)4u²òª°µ¿êÁß¾N‘9w[ýóŒ;ÜŽoR†ºNê~EŽøÔ¢’}1ÖîÑ<ØÓÂ…ŸAª»Áðy÷p=CGI8‘x‘ŒVŠ…ÀgÚ^2¬?Ê|æþ%Oû[&•P4k{Ý8®›¤$<¥­·ã?_ö”J6¼ íVw·£ì¹¯&y:ž7¯É2ñáAösz§Ìúo{zÝTj†mŸ˜~– êùÿ?#C²FW(¨Éú1µ’'¥ÈÓcwŒûÕ°&¦³‰!õ™GîÁ¦ºÁ(÷‘oˆà÷:sð4Iôf£ßO>Œ¤d= Ä<ÝÄ\Sg³ FÀðÜ-u—ÆÞŸž'öbµ²â#–ÜëmôkåLouã+RGöÂõÇðŠÔºB v¶äi¯ãhprøYb¾dòÈu lJš#nŠ[¾ºDýÁLÅõßW”pƒï./@ 4‰K¢º•ÛèNFÔšñe€§P®;J;Êuæ^%OŠXú¥m@ÙÌMD7ÏÉ}ÂѦÀ¡aî½TÇ’M¯ò¿dv›é{üaÏÙˆKÀŒ•Jðß•Üö8mÝ=•kçJ‘™È^’¤ç`•K¤Fr"×A)/3é¶›þîA¾ µrO_[úØIOÛõt똄ü5\—j¥Â˜(%^W¼3P\O³ëžöÔIc_†¢Å<…pËm¯‘|ewæ.=i/•¨Ðá]*;Í5iÏfÄ7Ñó-ah*I“|2”Æ…ÙíRÝK _dÊb„ÊãZPB¦Ò¤2È‹ÝЊOisÑYmÄ(®ãy–:]ÅŒLà!ˆ‹¦ŒF%¼8Ï…±[g¯…r/¿úkOT°m¡B ‰WØà4"GŸ{?¹‘<¬˜Ê`÷qoð@È:Åì\t¾”aœßʧk¸,Cð—¬ì==â§èúõ]ë÷t9ï ÿU4œ­ë_fÊó‚‡6ÍîTKL“Ä´N¶Híy {O¢$¦ï^›ðöUn>ÑÔ vÍ”¦@ijw<µ]< ©=צÜÞèU‹• ü³C¯M—ÞÆêwÿgjïPnK*§¥Ë Ù¶G&p˜,mßsaS`év7¤4y²%[‘ôµó•$li-éo”!Úеԯ2F╽éÙ³ëœA¨UÓ®Yá¶Ý‰³—ZÓ®œ÷ÔìŠÆ7»£ñÊÔɧLL˜•Nø’œJ!y¾gòtLÚëÅ_p‰„ŒÌKŸkÊ]NLÏtxÞ:l—ýx¸Ýbõ0'/§©ºÄì:f¿Iê ÅÜÎ “Ô.R»ÔʱËQ{/ks{š÷?k·fíQŠmXŠë…¥@Kظ¢0¼wTå 2:Û N˜€`RS uŽq÷žŸÇCèRwÌÐ:®ç=ôRáºîÏdL@S£¾Õ±Žg '.¯o$³°÷n÷{k/Ì,´ô/“G¶u#(6ckØYٜȒ|ÇvÄšÕba6D˜šÜh·F³ÂÝë\Ú¶2‘€xƆ¡˜ÔûÑD!ß:nW¯7Ðç-9åÀïØ œ£T(nŽyLÌÍtÐG^Ê Ó3a|ÃzkpÖâ’²ÝVb™jôÌ31€ömcD– Ÿâ4é¥ôšÌ·ìoãËTB”hÚ´XkšA °5n :å”k}‡V•ʽ[:T ¦<îubónTØÛÛ8 À ÙžcoI[]‡éبôÖ´ d‘^ŠÜªä©Ãÿ±-úÜ 'œbH»i?˜ø%CÚJcõ›r?!«ÓcÙ‰Ì\ÉSÅSÊ+°º7}Ïü|GU{še²B˜0÷zºBÊ} ΄{Ü!å¾9v«àwf_ækð#”Â;’@)¼ûEAAÐà™%žŠÚhîÕfÛ¾ˆáE!æ• —é¸nïRÏú±æwÏXÞ» à§žº՞ˑÊVÚ¥€öVÎÉ1º¸Ž’熥ž·Èôßè½$^µ4#it°]²ôî.P°™1š<951gô¡«ëôvyÅ®“<†!rÖ÷]ûP}íÿ ¡ËTÒäŠ]êõOžþŒ@n¯¢÷T¨Ì0%p/ ‘ôCîn«—íÞë¥2ö”»ó,‘³@w7óFìðv„æÓ[ aÛñ½klÖïÎV®Jõ¾È†JL?M‹¾!ÖéöÖuŠ´Î0¶§®só9²ˆFÚoÞ·°c–ò‰25y¶iò̾a†xÚ5Íõƒ˜P¢­ËË9ðÝçü¹#ô3âáàÀ }0©/‰MsÏÓ‘eðûq״Õ» Å^ï úÇØè•»êØQ™›:V錀¬;NŒyOòùRá¦v­|¬)Íò¾ý8:¯¸+3L1"dk‚µÓç¼ÑjHÃÔ{=4¸Ž“:¹\¾‚òö+ "wËÜ.7ç`1è#œþC$¼pÎßkôш´øiìƒ}¿ zœ¬É“W×5\Ïó†'p·¥áw‰œÎ×},ë8a¬&·§]Íî†o…sòùjøöäG¾Ü¿ÃbGÁ‡{7¯Ý`ضcèP¦üö¹Ðgà/¸YÏí¢—«Ot]Ø€ñãÂÇ&ÏGÚ‹‘­ ɬ¼GÙ‰o“ܘ†ûÑ»“P OŒ]je÷có%Ö”ÜyµÊÎ:ö娹ÃëPöùödl5ò_ž¯Q€[UΫT¤Q}¡HCŒ®‰®Lô+θðåºý±ÉîáÑOÌ]…¥¹NqFEÜx°ø“v“»B’§¼bŒË(ŽœW΃½ý(Dz_qª Ez{à÷åÈ?tÜãYζÕi´pƒä°´Ö9ÈéÑ*}ƒÞ|n ž!›Ì×O1?œ=Bލ!G¾Ã(†b¹ÝŽÀLãåŽÍ>âÊEÏ/ņ~ 8Z5ü1á]uoe×'ï÷Ž}h„52:7!¦ö&Ï2]çÜuÐ.†ˆöH‹eKÇå;ˆÄX6c\(aù b¥Ž—XóÕጫŸèhƒiïUø2µt±½iÙ½3÷‡\i»Ó)Ü”HZRd•®ƒ*/Ó¶žx»5½·k·”Ü"ÄRžãye –îù4w¤5l‚L71g–~ÐIõži¯ô$Mª÷ÌÝMž¶»N‰¢Þ^lü\°…y‘¤y±¬—{|q%_s؈©nOJšÔé=£Õ'÷¢Zk4Ö ü?xã$—UŽŸo/æ:†´cb,¤XšÞ½¹Oô¿á= S"úîÃÁÓɈŸ›)ë˜,꾓äð4z,ÛÆãò[÷–÷Rã„û²Ã2þ°„©Õ8ýyšno~Šêù¨ß³ŸC1ˆÄLïä‰ßë\=.˜‡þŸ `ãÕ4<Š gIÞøõuŒeÂ&lÔ6a&µ}bR2YÇ;µ¦mPH†Y”÷c}Ë7¦‹%ÏEIäKö$¸WוkošÛ˯àöCèénÑõ&Tæ˜ü´%ÒÄËQöÏØ€f-—F[°ÙÚI)Çñ3kmær‹Ííä?ÐØ~lm€Ñ8Êp(î“8zr’ëÎëO(ÒÑç "œ[YBõÙÖÙ®’ëói¶Õ ¢2ûkü-‚•S¨K€éØ"†m}“ü»Œ[ÒÄxwj_3æÈìnó®Á9®I×¼ÃH9‡í›¿ÀJ§F“ó.#æo¥¼+À±GÆ=›bÆgÝžsGÃ?v »•æË¤’ÏTÚ䙲iŽ/‹@~.«TÄOð8"07"“¹±É“a× ¬ÂÄo„¯§à€ù9¥Ö»!7'6Ð[aõjÏW«S Õ”¯êA÷u¬8@îǨ³çŠØólú \ñ6:ÞY6 Ž]+1fÛš{ÈÌ“c}!;¦öyIS{¶"ÄÉÜÀ<¬óé¶Í6ŸÃø7ô“Q6cµŽ 5ožä;Øzø¶ÈÖ):¨èˆt£ƒŠ9ØÉ]Žë\lhÖ¯¹â½ö\ñ^{Bû烥ý³ªÊ#ÐÛ›…×€ñD—õU½|Bþ‚r è dÌÙ#À¾yoš€?íhò7z†×lÇÌÊÆ'G¾ú:4ô’±áä,u\/xaõ#M§¼-U Œ¹µÈN]Ç„cÈí_æ½®ªÚ£ô,¯Äò`Ï0¥Þº¿ÜxˆÖ©Âfà*µ0Btl¡Ì|¾É•½ø(5éãdÿDªƒ1ãÖƒ!ëp¾ú:õ»­ƒL. ¼[e×U½Lòãü±Ñ'Šjp)l-Ƙzkp1{Fáå×g„c{auùÐü­““È[Üt€¦æI¶ /ϾB+Ãmd#]}ÕÊÕWíRˆí ~ ^=÷É“‚@ȺŒ#»³sfr+ú÷uc˜ÿêîPsÔ™vévµäÆåëˆÞçÔµ*³Á„mÆòø# ‘°¯1‘nf¾t¼sX©æ”ëçµrµ`ÜK÷ «?Êíhlœ ¬¼åÍ_ÇõrÝíÜ;Ó»›_A)(X/õ°ZlÏs§1×&Ÿ®=óZóÔ£ÙN}ÉĽ¿Ûƒ†‹{R2"ìÞÞuL)µ‡êÒý+¥;.ËÇ(}h`A±gǤÁ~ß¶ºñ^•§šÿñÙ¬öƒމó{K›÷:qÔ· Ä<µÔX¦åù'Ùe{›×ЀFßió Ýx§ÐzÍ3m^6%ÿú;-%}òblªH¾v‘ty¼-m¯‘±šW¡šÖ0Óu`ÌÝE ~o»æðv€AíÁÚuíäÏÕc~œ±jU¶Ò?sÍö«†¥w ¹†«šÎˆŽ\DÑk§‘o­áË£ŸíÄÒ«dœ>xkÑþÊWcLï5Oç] |YÚÒÚ^P™Š9Ææ<ÑëôOcv´yN±¥Â¦™*[êÊ Ë[*WXÞÒ :„ÆvMaª#î•smÔ¬^;.u™šõäÄå1E*S~á¼YǨº¬éX{?Ýu-- [é`—÷ÅU)÷7ôðÁŽvoèÏeB·]:gÌX8Æ|^K»åŒ-pE7®BÊ Çæ[jœò•­l>åûkTýŽxxy`è¥òPpûN½þÐíÖv{¶ãôåq9ü´ŸEÝÙ¶N¡Ñ½ý€±]Š©[/®_Kã„|-½¨sÜþÀMÈÃÄx¦*kìû®p¹„þ{eöËÝg 2grF ÎIˆ»ÉY?ÔH?f=6¢OÌëA®SšõŒ¼¸‡kƒÏÛ¨‰™ðæE1YCð™~ @V•}ðª˜ÞúHáæ d¾/ÀfÏaÑc¸1É—8Þ‰°·1Õ—ØÝ t‰™Ò¿*~q¹Á“=G»2 x‘üO~æ(pîûÏ´¿D#UOÒ 3½±Ï3CÁ˜dŒ‚ GÖE4ýÒÚ¤gDþÿ èÓ>4ÛA%X:úR ˜ð#ó~E2M”h`oØN“·ÞÔôsvéƒË!C¢œžmWÁìøžž=]ʽ\šLQ0æüšgûš!aÀè1O([ º’8{·ð×)ä ˜‰å’unïWÊÁ ½Þqí¥­Ä =·Ë€™SÃRØLÌÉÂffªzñRäØR(\Ïå*¥~†ÛQ,Þ¶È÷cñÉ À°¨µÉ·¨ïTUÏaø¼­<¿· ÿâ¨PÝ {yrîúÕ £y2ŒyÑ1bûë½Í>š ʃÐËW*¿³]Aÿt©»fÛáLï æIþ£%nwXcãt• wkUÚô !H7Á£Óö$ÞyÂH•„lav§G<ÊÁ)Ì\s_Ç\M ?î\¹Mo‚_P Ò·e^šm£4ÕY'Z0ä }gQÀ3A”áï²ö¹©Ò-"m/ù°µSRÚîM ”ÞñprJ”¹Ôöä`L£QŒDÔ#*͇Á÷ø1 ÿù\ºÙ#ü&݃5QC= sÀ<Øé./ [z³ ¹ãx–0Tæê°–ÜêÒØòÊ¥!Ôl‘;¼d4K&òš§™—ñó1ã牼¹Â#]êa¾\¨v§b®|õÉ7ðÃXó&“1ed£x°Ü æ5CßÙX‡¥W¶IßžüÇR<,ÓÁÄŒbó\âõgë–—þÓ1lúÆÙ2ÁèaL FÔpiˆkÓðÉ&`3€¾–éó÷l…uŒéÏê¢æ‹jâôg6µy™RËXxД.L’åÛ­•íR‹#U˜ˆT¾~¾ˆçyWs3»MÜÞÑúxºq|×q½L²ãØÝ •²ƒa™äÌ—ÎqÓLqÖ/º%ËånÀaŹ”1 L«àJöƒºå'ÉTYf ã·°à³ô§†ÀÃÀœe˘M媪[fWÿÖKµŒŒa6¸ž-Ë/!ŽÚ°3Ô§¼ š\£"ÊP˽DêK]sû¬Û~b¡g•Ú5æ ¯²Qx¹–¯™ßE v›å–_ž"G¾KÿfF±9ŠØ˜—˜XË}!d>7‚È [/a ?oý‡~,fÝš§0›×åLç³]íÈô̜͊yg]i„¸“ìЧ¼Paô¿‡~j1w»vÛXê]X#¿ÒÆ,kÕvøN— ‹Ü¼Öçåµí|ä§.Ô"2œGîÂ7Ï&öûŽ*£¡/gu{%#-÷n]b%$¸.³¢Á]–óSuè| ¼dšÊ@öƒ|Tú­¨žD:íáÌ.¦nÆìbnž e¹`É¡m+}ØÚëxò‘Ú{½°©¿ª «¾kx†1FžøOøÎÊ£\Á–¯I^®´SZ±ê¦kSPáô½+lÞŸö[FïùÝ]ڔ형;ïú¹k¸„±ˆîMDž±•0-JŠ:kT™‰Ç3&ËR‡ÉJT ÒåL÷F¼e%«M“Á¦_½·³`,«Jg±¤lò퓇PçD"-Þ˜‡ŒøÁ:Ö‚‰2 ˜‚Ço‡8ÆEÆhÌ ö¨Ý:d¹F½~èR¹#wa#-w9zo’;ÕÀ)z[$ŠYÑ\:ÅsQZzÞ¨9¨œ(ìð!ïM–)ÈœVà 2&sš×)($̃6¯$ºN±â5±¨æyÙëò@iäæ çë\ùØjÌ5ûäꦎuR¡T0<¢úŸ/'N5'×2X8eí' ü]€&öæ-¬o±Â˜¶)˜4z*ëúŽ oî#Á.~·³¹ˆ+ÂURº§ò1ÝêžÑ#— t ¼±çïxã5µ£º•v)ÌV^ÿ°AÇÐgJ?J“™ÖïÀÅ$žpº"dd4@ÀÝJ¤ÆôEI%Âîš¶h¥o”¤•®&ò¹BŠlr?¸è,ê¶Z‰´¥™/Ó»ìH÷E;Y Ýt̸„ËÆ4góÄecƲ1aÐ]SƲn¾¾[X¤;!™î%Pªsˆ ­–©þÈðd†-â*CܹUnï%Œí€ñˆ¢Mr’9—E$Çï?sÈu ¿kß™'¯?l5˜”öóÇA`ù•Û¨~£LÞ»ÍTh`¾)NF0¯V.#†Þá”u%åÃ+¼DPº„œr¨1Ž öh=ÖFåöÃ4k$Xm!Ûé§ý@Z,ßW¸hùO4qõpà1©Úªøî’¿Hƒ½X• †µÖ&‡—7÷ì%̰ĭrí¸å´Îí¬EäìƒYaÓÒø°ßšgH3Á¿qÒ¿AwDÄ»O»‘Õ~iÔõìFU)ýáÌFpÁí,ÄkuýÄÛ;”.PÓË#0›šÆ*^»:œ‘Ì#¯Æ\ëÛ%¥tp«ªÜÕTçǪ\_¾#ÔÁžä&YJd¼+Y>äb_Þ7Ö3fJŒƒ\ú¦Â¸ê‘y¼Pr“?"áý„õp«öÓ°ÝV1ƒ'Ãb+JAMuÛ&tªYêÓ˜"í°åuæ Íf¨ g‘ÃÖ×° ™§í*Ž5ntךÓ+˜§x[³^(PPéòÑX¸tˆø±oÒÔXŽÀsòÎëøÂÅfK? vÖµ·0!Ô«ÖeÑ0›Þ¼0ò:wŒV΃D¤¨8›>1Åøu"I‘ÉóåšJê–¸éé%Å{ð€Ê_±ÙÃü5éVƒéØe¢¹h|sn²°€:íUu½Qû0…èª9ƒÑ +¸Åpa#ë'Ž)p¨tt¯E?Ù¢U9°¾={R@i²¾í3…«{dßo›/÷ìeÃ1ˆ±40ÈŸ×1»@½âîÞžûmìèûC8¢nA'˜¯u¯÷§`ùFÛ“µA²x¯ ­0KTc±Û5jë¼,Á.>·{!z‘™ïæùhÖ¨‘—ætš@\š8Çwq±$<Ç!»IŒyàð²wÚÎϽ Sà=IE¿`<àñÆÒ‹ÆºWŒTw¦€©†a°ž“@X_{ç®C‹UëÜx˜Yyilp,Õµ×5€› ¤b¼ ù& bfí*Z.=ö ï¯}ÏÝÌtß 0Øs(ºÏñ7 ¢ÝXß±Á±-õNµC%‘ýuæé›çÛ[gÿ¡ïõZí¢ôvåÂŒiâæIãP6­G¿ðSø ú†,+L¨d3S28 ÅüŽ_°Sú TBaVÓ¼x“_1Ü<’¹þ°?.ôg8Ñʼ…X]^þ ß‹ïô6©˜+Þ…'‘•µóÆŒ…ŒÙxdZ1T÷^äô²ÁnéSÀÀªÅÁ1˜—‹a\dßq¼mϺVÊ9(X/^טw=´¼´.ÕÏ-~{uƒ§Ã‘÷͘ n^©ÕÁ¾Ì¨2w"®?¾ҧ,båž>Û”a¼ ÕãdÚð~žy­Nai <؆—?Ž9% ) ) Ý 5×1÷?æÀ˜/×¹ØÑSÆêIýæ-Ö¯À¦r?¢‡÷†ææ'±èdŠ!ú˜?­ÑÅ6¸è˜rnža²þP"öw±U'’«[ð ±uXÔD6G´nk—ǤÍq¬!iÒX+DZ6übªºy–®E"ùeÛ8Fú“ÐëëþñJÍ.‘ôÒƒ-‰Ñ)ÆzÉÆìsøZ½brXɇ/íy- f“Ãð^j¦lÈ)3¿}Ê‹ðÐT\Ù°5GîºyÙvÌO÷ø›[£ ÃÏÕâa”Qi±2? õòÖüP7#ôG!lÈ{完8ù Ž´sÄöÚWÙÉ´È ˆ°i.lÈw…Á¨‘qü=A”}©HƒÞv'1ñ²híž`nƒ¦h û1š¨9Î^x§“XŽEŸgáÃøBÍ=*„½J—{l£2œqjÔ#’IúÅlo㔈¦ŽKM‰â•Fð9˜²Œ¦úCαø­HD¾`Ñ23ÍØ£ì1àhã3ƒ>1/ž¼Na«cº¼ùÚ²¡ø q׿ÙîëÜ+N *•1îÖì ÎÄt)fNÀY:hË®ºýìGUå çƒ»Ž· {½b2Í Z4PÆ-š1”Lê=‰Ô¿mÞÉNR´ ð0Ýj'-ºGPÝ_ÉìŒõ*“æÌ`u»s>é6YàlæüŒÅ±.É 1QѼàŠ3’D˜ËnܺÁvf“TUÆüvs¿—MRUÉ@éd¬-WÊžã‘ÚN™¹íÔS"¹N÷@š;×yÎ#x5©ÇÐ÷ ‚påÌÖõ¬ƒ™4}Í¥íÚf =|tÚ¤Ã"˜þRž²×аž6ÙŒ¡ÍØš¦aÔ‰{7¯›dÓêkúíXfJ÷Ñ.ö±'àw€˜Õ l†ol2 …©ïô%0õý!ò&T÷`+kwb³oŽæùî—y ðØš–x žÂ@ÀOfx9çõ‡2žùöN„h"s®1ßîÄŒ»ùù1 üþøšÂ‹ÂssÔ±M7)Ͱ OŒŽÃ)`Ž ?%Èí˜q8t”õÑç)n·_çÓ<;ž Fz0“•C…)ð¦ ˆŽ·1Ï‚—›ië59"ùM»(nÑ_ë•Ó58î5ÆFŽRݱvg#U}×A 2ISAæ)šn Q+§]’CEÅ×°dhÝOq‰Ølù“¾iع·MH•Æ­dæµ·mÞù¡RÚI[l‚â<øtú&¿¡j759xˆ™o3¨qqJš( ¡v—¶yU-zv¥ûkàDà~æ¹X6ÇVŒ|[™ÙñƒÔ¿0W˜änì±AÉ ÎsímÅ`ë&þ’ErR„æßJ¾ù:|çLó¹OÙLL…§Í4‰NcF;uïȺ}^]q•«³9CÕpܯƅbvŠ• þF³™ËêV¡^ŒCðÚ¯8§òÁºŸÂ–Î2ÕæõÉÖ)néä0«ë\Ö¹ahù ‹‡Å!p²<‘*™Ÿ íÀ¯ÆQÁ_|ï²’ÄÞ’ŸH5÷!‚š9î×稖p1ç(!=ø!ZGêQË{]Ü5Дò“¶•˜™¿Sº ßçÅzf’<²×1–¢aˆÕd&íg‘®Sê½ žV9˜;,4aW‡fwVz䱇XoÍ=7ù -«µ„ÏÞávDºT19jÜf¾Ñ„»ŽÃH ž•˜îÙ„ë¸âi´ÜZÇ /)¿y›2LÆL*€ìÕ«³'Ê/“ɲA!{AiˆÅ"§á–ìYóÙÓå“”b9;~þcÑ z‚N¢ó£úuÃÛÈнØ6}c Ì.gwà4ùJ›¿`Ú\@QUϰy¶ !Aîü²ñx~ÊúEÁs`e/œ¤¿d¥Û»@_Çíµ£‚"”‘ÖƒÀ73‡>qÊÔÓ\×=¨¤¢²7Ýǧqž*䚟³æzø¹X’ ;tfÁêMbHÜDf=`‘Oe¯1eÒ'R~°éäGtŒÙ[Æ}'+ÃÿÁ4kåÊ™Ï*a•’£€µäÌ;\£ÂBjÝŠ‰·¢*;?=4¹^ü¤&oh2æÌZÖ™ ÷ eCß)Oi§¦e"˜›@ž™Ë¬a-µgp)IùÎ>)—ÒàÞê!õw\~ªü¼iyóHægD7¬‘(W v#uü†çOÎÀé/8 h=¦ 2™¾£aEë"’ú2ÙžaÙägr>(d2ñ€‰w#¼ÚcáÙ3S1Ý/óÂÖ]£Püœ¹`ÈÎúY ‚a“»u„ì¶FüˆFŒR-Ïð°dê“î½È ¬-™©öHGÎéGÖŽtø TŽJfŽ»G¥2Ëcoo\äâÄfAlIV¹l?À’WæŒ`½§ØÆ AÐD‚tÆò?œøÈ(î‘þË<4•ë½ì¹_=J œ~á…ªìØBÙÅÙúCOñÁ'™­&LÀƒ9ž–•sîÚÒ:¦ÄOÚ;1”ÜI£tNwŽMN›`Ä‘w*ùQ`gÉ)çóÚz;U’E¶KÏ¢d]˱†1”=£~ýZÏaN%6ù­_í$nÞ÷8eƒd*Ä9aBÃé6ÞDt`<å;ç VÏ©°]Ü(Ü _Ç]›ÙWk&­?S°¼›üjg܈jYÐ@ h3OhCW½•Iù™Iù™IùîãÊ SNùd—–$γ19r·¡É¾œàŽÓ#¦ÅÕ4  "% ² C»'!'xÚrï y+œNUÍôåÙÙ˜YŒ={²læà¼¤SG8'²>2ÎK'¾„IðKøÙ}rò d•øóï°´Ó )èû&›èÞèhR_–âSÍ©ï\åuÜðbšq³Ž±K&í\xO€ 2Ý;]n³ 9ž1?™-{ Ù4BÒ|AI'¥œ“23á0”I¥‚Dp6,ÉÌû5^í œ¨Œù8JqOZçA.Ì]’óÚÑÓ¼wôôÎn@™ÐžÙ¡2”E&–Y¼Їœæ…釄úŒ’uÈpxV¨y¾{_ެ‰É¹çø‰l@7d¶,{ž¿¿)qn¬SY~±wbH¢è²ËQÕÛI”?Þèê‹ '< ™ ÞðFfÇKV’¾—Ž[½Ç~<à˽jŽuщ¸ÖçâVd4:ø8Á³2Õùâp¾eK%zÏý§ÿ}Ä ˆgcä'“é {jØ:7¹2!3³\_ƒ¸Ó(Ÿ[q7»¼…𢇳§ý{ p¤À{pÌ÷¨üà8ôQ/¿"¹ŸÊ!“Ê¢™KUPaiöà{f0^ˆhï*:Ïtû:Nx{:é ‰¬¥?/ŒJV•nêÊÄJË=ÈY÷fSñ.#¿†l„/ußÀu Jª,=Ü=ÙÙHHÉu|@=mS9æOL&Â]¼Ù@#“#C<9d²j\ú‰C(ÙÚ»¶BÄÁ3y`Ë8M@QúÜ×ÛIxMXÞ R}pyoU„xpl\––™‚{(ÇCÙï¥+… Íf“q6öÁ][ˆ ì´ŽþòÄ+$ôP囃րx¥úÊ‹Á¥.ë‹õÑê“}#é!£Ô’b¯£m"XE2ÙàP̦yˆ Ÿ=Û?[ãl½b:±º#݉959œˆiTÙbpg&…@L2Qd2dGÆdQd =Ç=´%Sà‹Ý<¯R,\kþPäz¼v9ÈÀEwò3¼­,ül4˜¨±¹Ã`²€ÎUê’‰+ÙêÎ]̤ÈÊš%¹'•Z_óAÏŒXWÈH9Y1 XŸ3ª˜îd]Âí©Ê×à˜šhøúU68O޾JãšÛšL䲞ËÀꙺY†JA†LÕ2*Óg—9÷0Ü:‡ÅõPµÜ$ Šå*A¦y,I·Ñ/WzbÎe²ЀÍÏ =´ ¥CÐY ™eÌéoÌ@ÉeÒäÌ»ÁlfŽˆº3SrdhDie.ÒRqúCF½"&*M¶®C)Üu9ßÀ%elDìØ¢%¸^Ú¿À`wÀ`Huçá•’v;²å‚üÂ]Æx Â/Ù¹ræ¶DêØÈë˜êtVy oðS ´[•Λl6ø Å4Á@ðƒe¤öÈÜ(Xf o0+(&g¢¡CÚÉ‚@­dÝ„3a7dVG¦MÎe³6C¸åó¶×¯‰¤ nm‡Wr„y×ç ¶·œ!åh8‘dÖpfÂ9³ž+IˆL‚tv¦ânÜœ!›N ­La·®Ü—Lê rœCù<øºÞ+lìÔ*÷(;)ç±nÖ1ƒM¸«ãir¸Z¸ H\ÿÆ:N|*á°þ'Ì’<´I;½¦KŸq¢P4®×Ô™£jNªÇÈZŒð²yÞvö¥´Îz7mpų‰Z¡,Ðúâ4Û¦o”žñ<ûÌBêë þ¢ ©òý_žˆ;2…ëÚͺ¤ó~4?Ä "k|R…›Q$÷ÓÕOߌwä’)BØØaÃé.WµMäB瑦ëó$F¨šÃ¬ðL§ÿ#½ÁP—½ò.„äz@¨€:3“9!;÷A.´²*´û‰S–î´­„¹SH™fÁdqe®"ùÅ¡2{ìJ™Ð÷¬í~ÐjòlнÝ›ïXÑÀYd*v…yZr4äý™ À¶g/½Î÷€»vváë¬A‚uŸmaû»Ì¦+—=%ž6O¶B‚³”¯Ú ¹”½›íÉ£3@€¼É…›Q O‹ÏnF,ïžÜ‘½ŽG[lö.Ì^¢Ý×"I½Ê D°h¡«>>©HË•]ëÌN‚ dW»mèRß`ÒðÀÛÁ¬kÎp‹Á”몄îŽÛpTeõâÔMLlø~~lšÃ'¦ÀM‹œ cKä:àÊlœ´‚àß+í8ÏrÛ°°Hù‰` 3ý©DVõeëKãQTšÝj$ þuÄó YÑ+Éð–u69üƒ>`m s!`PÛq{”“@ä)FâãËBb8* o_ !OÄ¥øxåúάïnä­c&l&I=Äø…%ùnlpì³±mÀ\P xýC3Ì•å‚rÀëvû" Ée•žxNîÐÏìA@)¼EôŠköŒy„¶o¬.*–NîDÜT!¦ò~*ÄîMÿLÆÊ™l·–÷ª“Ø‹Ó}úµÊ;@.ú~.Ö¯uö ¦Uá"©B©º–š8°1z*U&CvÊš õ]5 *ÍàÃÍœ›©ý:¦5×çÒ‰ø­(s™#CÒߣbÛ©¨ô½éN@u»Ô®ƒ2ñ”{¢~£Rä#ç ’Í•»™º›+£PUκ„¯¯V)vUñ%‡nÞ0èÖŽ[æM†ð¸uÝA¨8÷T²Ê*õQ׿‡ù~O¿44(¥çfÉAu¦\¹w±høÉ¼2òExÔÏ&*•çSÜé{å &ÐLFð®cÅ¢šN‘—ûôƒÈªØ™ÐBë./y%Üâbíó‰Xòu3ëÄg˜õÇØš˜Yt!;÷Â:E£´YL¶Lº‹›°Ÿ!÷Ì¡nȃÀ†AndMäZ»· 8æ{ïà¸ÖÀMÅM« Weù ÷«^ö€ÒOŒ±òöD™aˆÊO^vÈm®´¢˜ß‘”aý¡Åtåê&¬îL *­SéòÌDeÄà̹UxŒ;|})"î™,Ñ™ùù(瘅šk"òj¯iÇ©EÎ…N®±ÕxPÛ†šç ú¸Ì¸<*?äÚEƒU¶ü9A¼™äÄ?Â6IÈGÅÜ*Þ%g8*Ò²ØÞ" FOZU¡eŒB?)bYñ>– óŒ2IàØnà³ó$^‰^#WÔ½h=ƈö3=äJ_€Ú»Ë_c¥¾é~¸ˆÂ¬úåЕ\r îm䋨 ú™< uZÇo¼`X™^'¬W«O;¢ªÎä.áɨÀ¡£&Qjh< *âßìlªQÿnÈWÊ;–ë7ë˜CÞèvtg@n™©äÔÁQf¼5‚ú‹_ «¶Šÿ„½@ÛËkGçVòß é°5ODèÅŒ$¸znà­ÎMö˜oQ­°ÕEL 8U»HEsÛ©nQÁwWLoûö[H¹W‰]¸Ü>lÞù.ߪÝBÀ ”œ~ž‘$ÏÒYÇ•ê=³Ujàðs02`öÚ'kKðäŒuL]…}ŸVbcPµ…Ë$æ€{°OÕ|7ÞšÊLÈ{\ÀO’ÏâkZTnjVúPÈÚ€lÃÜÚ‘ÿkÖÉi¶i&\fMø…Ëo…’ ¨!â— Wñà˜]+.T·M«¦Í ½}»Þ6N˜L `¯aé]î™k!wÂXZÌž,)Y¶º§æÖ|Ôo5ì Àt¦=à`«Üv”¢·­DG bx“EÐà(ôzŒysõøÐþÐ  š÷~‚†ˆÈhðìeˆ´y"§„ÞÛ>ÎPÒ‚—!·Éš²p jÙQÖ5®hˆ0eéšœ¿©Š†õ«cüÿAçî]¼,A’j…x ¦Rgåþ%Ö ÐîÑuîÑõúKZU9æLâáÔzÜZ£ÚdE §1ð P~î” =ÀãÉí¥ú S—I¼€Ôèµvl«ƒ¡Š3µ!s)¡¿Ž;¤Žöuï}ÁDmO%ÎNÃðr…ïè×UÑF¤'²d'bžhÜø„Ú +¤üs o3Ø/‡¥˜ 3©ˆÙé¦Ñ/›;_4•înùxc¨¦*Ê”÷ý¥#u)“ÌÖ)!»qXÝYسÉÒN—¨î›Ìì*ÚøÊ çfî±5t‚÷Dë¶Ú:E·ü£°>JÂé€ÄWáLþÂuŠ»>º•ײ8ü-×)ê¢ûgF¼‹ú44hbùÅTŒŒÅ‹K· 5“´¬“v wæ{ Üó^·ÀàÀFU5¨ûø}Ý|GÒRî0¼2²zåߥ)pšutzv÷^v–†Ä™ä¶‘ó}/Ò«”{9ˆóyÅt·Þn§Ë`E¡´½ ¤`€Ýœ;PQ‚ß>‘A¸B1oå®zœx¹ÎžÐö”{'þv§ÆÐæážG°b?¨½yÌ>nšÇÌ$Ó2HÖ1¬¤r¼3ðÔU¼½ˆ½¹óÏ-+X•¶?eÆNMd lçÜÇÉÂÈóê8Ï á[(Ò†˜N$D’.>Gǵ% ¡XOä&Dx¤…h«=‚û—ÁÞ¤C©ÎÊàïªj<®–ôItÙ&2ì·>³`ééµ>6¹\äÜ´öy¼Ö¶“2óöAÌŸûo’lÁó¶lY´q*ÿ¼øw,"TbÓóÐóÇ˾È#êÆ ¡Â`ŒÉ Lëp26€9"¤FçÕZÜ9™)áà¾Ï#½2áø½8ºP¾ˆú&YP›y#J(q¸xOp•Ô j5½j*ÅÑ65…Ef¤Aís0øûà ¢MC4Dy(Ô4m@ÉÏEÀa†÷'(rÔlüõaíÉÃn[nˆqŽò`؉/öµ3ÙÖ? …ÎÐG½¦}vþ—u¤ÐÙ ý,c®Pÿ‘CÜ= ÚІøôC¤C"ˆnè•b²HJx±¡¼Â(Kí­å„ö¢xDD~ÉŠ•Iþ@ è8Uï˜zŒ½ÆTo9“‚Ѻ1(Õ¸E:n1ùÊŽ’`„ü yßI*ãcÒºbèð¡u3Á‡P˜-p¶ Ü‘ ~UΚÙ[Xuª—Eûà1µ5–ÖG°Í\ c)å xócŸ…;Éú_cP+û?~sBbØir´­ï·Êb‡?+³¼ôˆò$¾ËäùÁÕ^©ö¤Ý@d°xgßÉÌO‚É_Ë’·T……îªÚ›U_ô‘€¾ˆp›|^,7æ›ümG!‘G÷S`=­ïóEmµÕÂ< ºc—pWÑL¬µƒæqŽâ‰Åèk‹ŽÌÐ\ ¹:Pu¨8¹„4×â5¢’Z·gGê®cÀèâ~åì=r<&}ag¹–7•ˆK€ïí…D°ðË#ì•Éþà*au‰ió!<Þ “ xûŽøA!ÃÄúÇ»¥Šû©îô¾‹—D°x2¡]žîþOXI!¢t¥mz ¡+¬ãŽ1¨œÛÕG."á…D€øÖbu/äŠz»O€Ù+c®M¬ãÊN¦Í—±Æ Û[ÕâépM—‡¿8ä)湎S÷?möq“ïãDn/(OIÜn¼›¼–Š·>i®®Ž‘Ô&Øœ7ñœØü cg€{—tF¼+*𦠪(ÐVäüððcIÜ”‚b}ÆŽ´gës¦\è’X“g0‚Ïß{:îO^ò¯½‘'¬´£Ð é# é#^)‡A~/šÎ…4c߯Šä(’pf‘ºù( …ŽŠ®Þþ’€‘(¤@AçâL ¯TøfÍÏãÉm(É.˜II›!<°1AÐ]w!Ðzå!¸c†îxÛE±S¯²‚Öî*xThbÚ^äe¼öìõ=Mx@d‘á°Nõhû:žxa¨ªT0®Jq%me¦¤r2‘ó$F°+3Û"æVB…*‰z`;ÔŠ¶ à¾'j¬xZI$4rZI€òUÂ\Û®³©e'˜•Dôy¡3y„Å=× SdpüP‰ ª„È?ÔcŽåÄ•'„×[\uÀ¨å!ȵ$e/ùC*[[iF»XM ª±@+ê ^¾6QÆlKR$í€UÈN¸fqÞ |Cù<|"«îwWUtu{kÚ|`IŒu Ñ‘€j~Q nˆkÁÇ óñç–ð–uÞ¨{/÷"}øÔ±"Vx§§Ô ¤u<¢¤mJúÀ8AIt³82;(žGb”ÈyçðEÜÔ®;¼‡è$n7¥Ëø}ænûSXj¨([Ó#ìØq!á³ÕcBm¢m^œº¢¤yGÖLà4pÅÜž.†…Fôž]¼1ë"zN]2µeYMŽ+,D…’ãí‘?¥Ø+2€)jU¹:a¬êÃð kmŸ],vç’˜þ¹òžÞ˜”8´L-î¸S2®õAÙÒW¸¦u•p ~cêƒ"ôÏ/y‰ØTDêúŸíœ¦.,ÞIÄ(¤udhÃø‰*}ërÆÐ›€@R€H@ÉS¨Tg ‚0Áam,~ëÎA N¡ÁUÛlšÏÎRÝóìB=<À3P$J: „·Ž9—¯ë¸s¤h=èëžÇB†bˆ]¼è·Bzˆ;¥òb¦$ídQƒ¸uî=/=è…l7Q¡›ZtN‡67Mp2fÔÀ:)N±$"Ì ÍàÜÎ *Á’×+d•p/ñ:D[›Õ´0qO!^sç¥v#Æ~Í6Mñ’i‰BÂ#ë˜f&yDf½ð1 ˜aL¸vHÉ !µzôUnE”L[!+^T2Ày…là§„HhÐ× ÒUDåáDŒÅƒáyƒ³=ø7¤šøÍAÖØ8ûM8 ¦€©díܼÈWÍl¯‡ÎìÉBõÙ“N›…ÊXÿ®mP£? û“0wÏrCÑEx”¿ˆÂÂ&¤±ˆ‚ÓæEÁýRâZÛ……¨XQDq»Ð™U\È ÁìÉšä·M ÊBHÖ$A®–\¹‚¡_ck ;„¿9ñâ%¨!J®‡Ó¬‰Œ. ©þÙ¢OǬcR¯\ˆ›\Vx»’[9 ¦P!ÉIJ°qн Á{ Ï©ûÀKnWE2VÀè#Gt„c(JFŠSÉ¢BzpJeW“°D°¼ò‹ÿõ‰ I‘½¼a8gñÞqx¿ââí”PÜ=ÔWÈ q&‚Ò’ {Ü¡ï’G¬Dp^°ˆA/Áa|’¹% GSrHrHH NÜ«–ðñBÊ‹gb«´íǓ؈^8P‹Ìz²aŒPT%3 }çMQx©d‰M8˜«dàh¥^<øíÑœzü=]!œá(Ë3Þ•9²ˆß>_L€l½d0Á®¨ ¸¢C iÒ›C&é¥<‡Ærfð¦ªåš1ø‡NrßÄFŠÑå 了´,«-¥<Ò¶ =¸¶å*ïJ£¥ø/h=‘y‚*|‘õDr Ÿá¥(éG61ß#mÖÆ± F¥6Ëß^.Ç»¥~´É;¥XXwÜ6‰%Ì%P)&ï´K™(V–ýYÈ‘¼¢Ñz&BpÙR·?4 è` (>»B† $5¬cl©Þ¾â¥Í $ˆ<ˆ,ô£P%þ~`¼Ÿ†`é”"_Ó:à¨çM SÑÒÕCÏßÀ4¦¿«ëÁcòëüÏÌ/€Jñõ[%9~Š$”y´¾ŠE·‡ÍXDĉ)=h3’ðt ëmF²k³XœL"ôO°>À@Ìô 8Kq. é¤vûŸÊæ“ `+_[Û–OÔñfêVnýºÄÛä€ÜÆX^¡åM6™Q¹ ›ªû!†\KÄ å•K^µ¼TÈ-á@ìRA![HDQ*O©¼XäÁ꫎Úl qÞBQ~§QŠÓFlŠˆ£*|$h£qCmI¶[”„J%]Á0yÔªjP8\¹*Aj»×¹ øîùëJ%¢rWs fC ¨¼¯„¢Öå*^:~#¸Wì£2Æ ¦T•õFÐ….ã «ËÇjÖËAÔT’Z)÷MŽ*P7‚þ«GxÙHàþÙu˜øL)}U0•Ø0KÍÔíÙ[.y*HL¥W;w­ÇÐXÀ —PƒRiU1‹`üu¼ Ø!àÜ .`„! ìô¥–WaªBâÒRihUúœàf®4´jø:+IJÍ1šd<*¤ùÀš,µŒÜœÀ%êqúZÐý…S?`%Ÿð:«L#>§–×¾äŒË@~ä£E‹´)%*Ký2ˆt‚‘*÷!G·—Ú.:¢‡œ=íM;®€°è!.~…RÛìTÆ—ªì0÷ÒÔvÈvUêÜc‰´X&Äe)6€=†’¨!µ2Öñ<[6·Á>J‡Ø;o¡ðç^¤žuýJí2*!•F’añÁ¥Oÿ:G øµGˆqÃ×%Ð}N*a¨.„ð‰Å–ΞÚCp FtŸ×¾| ¾„[Õ²Á–WÀ^§7a†&‘Æ„ ë˜O1SŒk’V¤ì“°‚ ïön=[¾­›¤`Ø(d…Ð`ÿàx˜ÕÑFö`D¥s±j£ROTŠ-¨_… sÖk4¿üLÂy1àTy©štt6>‹Vœt.©Ú#!;Äê~ŽA]2Qe|³{ÛøŠmVj]iÌeu £´³Û Så¹G8YÛ³ÁBë-f)`…×ñÆË|Îzn´°É…´Þ«¥¥K¾E™ÓÒį3£¾d±WÍ€à´ÚRC »F®=x²z÷r&•˜VÈ$Q‚Y¢F¢´!5Þ‡F~À º(æÓÃ;gnRÞ­eÆÄå.DCܪà~ˆ/8‰¼Ï˜L¯ÚÑEìõ6¦È(±´oï”I1$±:·"1@pqLÎÔ~5ö‘¢ñ©…Þ2ÚS^ª>D¼„['h¢?Ùæ‡ÂÈÌ]ìh¯i1d–€#¯æå)[~•ªú â>Œ“¥‡©åüÓ?cMv^B©Pàhc|…4ædO%êŸDH;ñ–=á6…œÅ&Ü®?P3‹³LV1`ϱF„‹"7*¨;€­]àQ…%{D©”ïŠryÈ©³‡ü¾¨Ýk»U³;GsTÉtÜ:¼«Ì¡Ž©tQÒ®•Wú•¶;7ci ¹íq7¨v嚆$”˜,HµßU»½ãŽH„ Îz­ål³“1Q)ÐqVU—oÐd'/8)Š;y0ÆYVGñsòF$™ ¤‘ú|‚‰]&ŽÓ,ÜJ ¸qX]Éëûi¿ Æ®Ä&Çj(äj6ðH¥P9“|3ƒ] òC×iJéþAð²RV€¿ÆQqkÙz[:gCõù¬E¡¼@¶ô~ Ö‹D(Suj}ñ¯Õx! vî†ir-,ʼn‰@`7é*F(ÌHÔªG[©¯´ÖˆˆM žôÀûuZ}„Äð•Öq¯>àÕ|veæPÎUÏ™H›|Ÿ;¹»tæIÅDÙˆ•lY5Ñ›ˆ1?Zkð9ö we¡Ò:è·cøBYw9 ¼úd·ÛAü]¼š¤‰EÐTØjƒîÀ µXÇŠE-a. ™îOhLäöA@z°<‡€{ñ\Ë^¿{é T•*ÿ[g–h9ªìÐÿ3Š‚éaþ{„–ÀÞyßGU:ÛÆD§àÛLaÀ뤖5]½Ý§u8ö0€`ïTí¯PU¼øÓV¡SÎqÿ¤]Wéùø^rÿjRŠ©«hq8Þ@ AžšÆ T>¬T§D†)ìÕÌ7\½8RÈ)•š˜Úë<6n‚DŸÙKñ?¼BG/æ¤å—“?µçbtƒ£BçÄC —uÒU ½ˆ¾>ù•óªq<Â…Æ}ê’‘tN$¼ê<Å«ÛÜjy{("6Hºoìk¸>SªSüÀ¨H fžÙcLí Íã\g twwÖ·æÉšSEƒEžãöO 9eÞb1·zìÙv¾õ$Õ·úñ±Æe7Qp;`–Ë[!¤`â‹’®BIï>9·ëP5:Ö I3¶PQÈylÙ±W¹@n\Åuf‘Ç~ŠªÆ¡=Óõ í­_G¼^‰5D@3;i•YÎÇÔ%cº;Íñã^ òú” /@Å"Qzè7G¨ÂŽ Z󔢚ôáuŸ* ƒ¤™¿õï3žRÝ7qöHc¡š}Bp9 H (ƒM¿vâòeT”Ei\„o®RZÎf<°A˜0êÔ³žÐ ªÚZíË|‹/b£¢ š&-ŸÄx˜Ò9#~Þ–ÃOÉí¹U וÖíe Ú]’Z§z!&E+¨-j4ïÿQ´¢ñP”'{Ÿ×u–à0ádÀPñßs¨çg•õœ¯¸”zatÚ«£ù8›ð)g£cÖKGÊ  ?Dúƒd¨î})çOÏúSÚ L„«W¹)X‹VÓS¨'g!è½·xÞ?Én£–Öã&=ö÷Ø«èXŸí"À_ @µÄ³Ti * 3‘£phë¡68 ÏÜ;Þ ' ϯXºV˜±z~ê—ñj/¶“ÅZ—Ž».Y.d¹î‚~WÍuÚxvk‰ÞµëMX΋,^ ¾dOåoõÉ 2˶É)ùEø¥H8h'b °VBœ¬Ü^›æBdžç OOÍ]¼yJY*Ü…íZ7o£übBìâ-ÂDÏ›îøàŽ+zGjר{eF † Ùº°_‹HIøîeû1FŠ•vï#Y(%æç”z˜©' µ®:/ûrI#Áúþ͇¢2LÏ>!ÏjQ©hd¡ Îàm:6Ì—?Í]îÈTƒÆ’Ro…˜"ñàÞVFcó¶*¹ÖšŸ‹‚æMíÐpÄ(Ü”þ%˜<¯‹Ž)EZ«ñõ༠¹®ö–€/´ë»÷?Ïמäª.&é^]€ò†R¦K¤Á•œ¶ÚLö.…„†–.}Äîxú®öñÊ»X*|!{´¯y(~šöŽªyŽÕ/KBRéŠ|×T|¶+èƒÇe\9ÀNÓa?¢Œb²sA±^e(c7ýS¯95ªeyíXSÕÀEm$$BööýÂs–Pç¹ð©²áˆ³ô½̨ñ ´_Á׺H®ù+aš¨0V}Y²K6I?¦îÅv,+D…ôƒDe1ÁÞ{ÅK§³L:ý=‹Xz-?]\u•¿‹Èyçõs¹™ÀÉûAÐE3Ê2I*qø”gf’ „î 2½Ik°,5ø3Úó\yàÛXvM¦yéï»çhá {ãíòêý” ½r$ìí1Ô`?Y;¼€Ñ­Œp‚qEfæß¿TM%Ú\Û£ª=N¶'™ £®scÇÇ;ª†›ºTÌüY¦±¡©¥jîÞÖT…ÔãÊád£j£¸Ühª-¡0O1é¾iÆèÄçÞ2÷Šò[$yZÔ’n;s÷ñHY1ß~¦ÄhÆÕðQ횫ȯå¦ßòÄþ‰b¾—W÷K­yºÞ´ê1i\ë󄸃÷6Ôåƒï8vLªÆ²Jí±bGÛ,o)mþgŸ‹J×óß?ªïÆ›bWTw[°LÄÕÉ™&=}ùñB{Z“èb-¢áçàFXÑõ^µç-Wµ§~ €Çm\jßgàPöö­©FÀpý ZÊ"ð2¸À¨oK¦©™Ø"6o¹œ™Ð\cć‡]¼—?ô9¬˜ ²AZövy_Žê ¦œL–bÌqQ%ói¹v9sïVÇY‹´pb½õɉ¹_TU»>¬þTÛsg‡EëÀ¡^nÓfƒ"ÅFÓwƒgB>ÀÞn?®]ñ%î„ÞW©×Âö“µhþÞö/Y :¨ö/kð}uÃqâ1†¿/Ø3"ôlÁD¡Ö.ø¥ÁEñÀÎ^³.F¯™A1dÐ#µ‡«ê`ZÆzûÛc¶¤¥¿E^N<Ó÷Ät%ÿݰ¾¬@·ýÒ[|ÏV¯´d’˜woÆN|dšzc†ÆôàuöäWE9>jª, 2 Ó‹•kÞúq{DEÛžIM©ÆC/÷1öüyèU?½N&Þ@oy2åg‚?¶A3ñåÞ»œÇ‰OJõª[óÂtÊž=f ˆ z+’ÇýeC8¡úº¾ì»Ê]‚sbÅ¥¸“ý?š?ZÏö=öŸ*Õ§özqíPJ´¤²d¦OGUt³·Db{ëØ†è?–ž—†WåWã°?pe âTFßÛë1£B½·‡žÉT{ôüæ)ç=¥Ûñûœ/Y'Wvÿ&Æté5 x>œ¯ º‰fº‰ˆì[¢·êØóKÆZ•©3ºP¬j†r´dmØ–T§jéØ¨Ø…ðî~ß{\ áÝ=ìàÕjܰ‰úò—%·ý4>7¨!Îwxý4áâû‚¥bÿAéoÉ|Émþ¨ŠCðCö†ÜÍ• O=¥¨i ´ýsãÿvª¬Í/rU^PPg…‚4§¸8³WFvú[¨¬Ñ}ÖqΪ†=õŽ·øÝΣøC&(­K fæÆ–À9…»Ö0Ty¹ )<€öx‡jªÊ/æ(þ è°Š^™½í³‚D:+óÔV©K“UK–©ñBš5ãÛ†ÜÒ¯V¼èvÑ{ÙÿDs@ÅÔ{5R¹‰ƒoÿŠšæ–éG"O‰›fÒ *+]‡_-xÚ©àïä¼gc›Lݘ‹½ >`¿z~`hŠSÒsº5u¾²QÞsTõÆ!ßÍçHÓ7È(¢ ÔÒ?qIǯ¸Ú†vMP!o7M&÷qIK¢ðkÈ{($j&£h0i(dÜû*_f÷›ÒÙÚÉ 5±Q«h­óVüÞÎÀ‡žäÛØÒz—-*=AüŸsyûŸ³nÜí§Z%©—\õÖdMÝ#0¥aœ¥å/2«-©4ÕhNЍ°¥5>éÙ@~ÂÔÓ’¹f£‡úY®ç²"Í–©O¡eTDp ݑРŸžù]m¥V¬íY­ÂÍDÛ`Åvã ,²œŸŽuÏ#+ž§äìo "¤{Qa#”ãb„RñÙgH3“rC>©*Qn1M•â¶ûÄ]:u£Ë‹²bÿ¡\0ÛìmÕV£+KOŽ–q ÐFšÂz4šY”mA_¡Œ·™‚‚^êÓßQçÿL~½Û£…ÞÈÞNœöÊAh¡ÛòÇš3óZëÞǘ«–QÈ'p;@?aßÁK5ø-j™ðêPpî ™2ø*Ä+¸· ¯‘nA×ÑrÃÞ›ðÇ L¾Â½'íê©]ÃÈäî¡é¥?šsOÌêvîáÞµêUxŸf» gxÿ`þS35ù^—ûP¦ÃEƒô4«Ýª ÐýÞE㬧ÏÛ_d[#ÿ| í[®k™¶H€w9A ܧª¤-+oÝuë{6$DW±¹›2|2Ø,p+óàNAÀ‡{ÐâCÔ[Ыo^ßû ¾‹%Œ½¯Èç»Üç7ºjQ±Ý‡.kù¨ôœÄYuù} ’xU¬Ç|-éÉ@d—SJÜÎdP¼¼ê©\XºÔ3ßL ø‚}ŒXh´Ì¥nYIÁåE޽m¹ïw©„‘÷d¢–HƒoÙ CÝ×"_åØ!Ñwj¢ ¿}ÓU|(Ïš§YÕÒº° Ø»"›å_ÃÕ“”u ¢‹Cñp&Ö%Jˆý§6‰w3·EQŸrõ¥1*1 B ÐI;v,´Ý~¡­œd!| ?ǯ|äçƒÐµ*8j#:’ÞOó?ôýnšŒYØ N˜)0Bcg3ؼQÑ«èÜGÞ`Åm~Ðyd%[I§¿^ÖV¬++Zœ½Á¢O”ˆÉ1ªˆÖ‚òBÂb‰Z:ÇÕoT ’|(~1âùB~Ë›!@¶&¢¥(¼ü½ ž”z˜ƒ ÖÍf`åñEBx¡˜ùY_æÊßÖວd ®‹Û¹‹c†ó¡Án!|H ‹xþOˆ‘àÀj»u³—íÀÂrKøª6sž”ÜN2ƒpÖé]ˆûãÌ~Ð|¹Ŭ)ÇEè ¥ÊÔÈ‹³X6~ð_ÄêÚŠDd¶R™­&pÔˆV>¯bš©X‹u@„W¸¡g1=-¶.‹÷L?ÖÐ9ÏVˆ¾d ºˆ$‚ Ðઈ[Xâ¶£R.J0²#ù”¸ù°·rÑý…¼Y•3ŸÞÉŒ‚Ír¤ëp@‹ÞO¾¢Z1Ì­f ›šgáñû¹_¢.Ñt·âŒ I4‚¤ï##Ç~jb½d$ŠÍT9)Á8Žƒ+ûûáÆ<bÿþ4¹%Ûˆ%‚K$숞´XZ–¢AnÁj^&Õ òÄÏöó“(õ!Œ¨o]°o4è-ŒxïÐ[4/RH-µ‚`Õwm®ý‹A‰<ªºÛu.SuàzM¥*Â…|*í UNq„µ¹a°Å›ÞÊâ㲺Fø:ÛU ¹Üþ²œ#n]œÅû"#.¡;t]­xlZ]|1 õPo¶ú@–ØD¿÷4¯b6ˆ,„Îâ!w{IÂØb5…í~å­’>tï`üËÞ¶³m"ß¿œ"ÐiFBô í,ܪÅÃ"Ú— †t]Z0^èÆÞŒCEz÷ÈX¢EGa©¢e½…ZmÜa2V'bŒI϶@Ùî}ÏÁ%ÆÂB© ¿uö?༌ù‹¬3X-“i @«„]²ôàÒÛÛ"Ï3›Šy“!\á‰î_|ƒ¯‡_"‰VÕ›Õ ¾ëq«êÍjÕÞL«2bÛe…îòÛ¡tºÖL!Áå‚«G$N«x,9ö”îÝyâëäÕ!ý ºØ÷XÜÂjUJ]0hÈ$ìíÁ; g¯ ½*½xAžî‘ÎG²ªÄ)ê¯ñ ^õ–Æ ÌkUöK¦ho—_+idD¶°•Š!UE¯Ûš†aœ¦H1èÄd™z[%,«þ÷Æú)µþ­ &ÃVA‚©.XÛ¯0è´©ò…£ÖR1 µÝFèV¯y»ÝÕ{®D(‰<ÒSwq›s§ÁrAѳ*©ØV«€ ÛM‡T„­BâÍÌ­&l‘ViÑÚ°÷”ל«ZIá©Ø¨fi‰ÏO?øý–€õÅ·ÕÝdw}P÷ð‘å£Ô*ü‚I ®!«âº ™Ô"¸‰LÑÓª»÷†23ä–Ê~U¸¥ã)5ÎC7fæó%E€sB&ÑtŽù­ìqµ.½×Ø* HX’‹çK®³²w\'Kž/ùd)3n½÷…Þ™?Ϧß{õõR`Ç«Îc‘LNš[ñ–þòìvî÷Gâ£U¬ŸŸ'’¬•j}­ÒÙx¤‚2‚#w}:Ûà´³P¢7¡™C^g],_ÈQ4.…¾eéŠq ¼8Ó§.s_Y;•°vëKs¬=o5¾Šy~ïr«Ævûä|¼ô´æ+B¢BÎ]uHSi¶f½©øV"öXñ‡Öå2Zòw¥e·çÆÞçO‹°' a­™»IÚÅï{k_uúÖÒõÃ_jH›¶èlj8 ƒ§µcïGláT·’}üüS_Š`3çØõ—$O¨î4~‡zÊs”Ñ»@« žÇhúF܇|º†"‡Ñ¨ÁˆÕ2@UÀ.QœHî÷ù”‹èqo z±H“ŠH§¢ggéèü¢Jš^1¶êLùY oñ7UµÉÀ?š£ÇÖôu_]•h7SR¸Ò…Äc€¡‹BðÞ–1ƒtB%{cÖ,ƒ9´ïðNÔrù!>¼ñGn]’€Ö N{ÊgXcõ:)jfÄP ’Œ2gM8å-’5Yã]¥>nnáÃ3”º{±ºŽb\Üü®]«Œ±[ßö2g`¯FS•²¢%9Ѧ$>žò`­`Ì•xÚÞ–”Ûš»®Ô^‰Æý¿5 «Õ Mrôv͵ƒÔùÞw 3»f†Ž½a»F–Zœv{ß_+|“U¿Ë71!>Óy…Zî{á[ÀL mV¤å$™ÿ9ŒaeÀ¸Eþuoc,ä¡ùö#‰º dá&gñÍœµøìº)ÌR,jg4`ÛZ(+àŠka3 ‡º˜¸ãÓ7•Òð¹íþ¶ÿe!%•€Aêsjm:y%Dh"Ë×`¶YÖ¨š5ó=EHß\5kôÔEÃ{;{hNGA9&ß_¨Ö  ŠÉ[ìq›g¦ÎÕƒ6kB±Ku–Dé…É-}kƒ´vôt7Nº2r:­-W©ú9×Q&¢Çòe w~·¶|j t“%ßöS€ÛÿS:ö£Éõ1”iˆwëÃj`ÂJÈC¶Žjck>2>àÒÐ7|/Lu¿_¦e"ÕÒI^†eÜ~FûÁy@Ôús9äÍÍØ,9üÁ~3jo' :mXמ>ô8ùV‹ ¥…:éb„jÝ‘¸R§ŠÖ>*áÞ¥‹õü¹”Ñ/Œ†BiâÉD®{Ð ÿêÆÐï !åCÝs tìr™ž?œéˆ+åbt_”¨{æü@£ÆZøù†ÇÒ:¿Â]c`¦ÞRv…N•ãIKfôJhþöl¢‚¸”æ8ǃ &‚ÿÎÑ5X7r”•÷v¹ÎÞi×ji¤pò\jÃ)}Ñ.'B€ZcÿÑÿ;NS}aƒ}Ch¯½-ºÅË4IŸ"ÙÚtB¯~§Óÿ~’—j>àFiuƒ§¶™}ÕÕ>íºÇôì†.— Ê ÕÎ{½ÊyŠ”€LŽu¹uêýB]mÊ­“' tW ð€Þ$­kUÞ¨•"?ØB¥¨EjÒê=úA`¢Aõå„ZÆtEwÃïß‚qÖ¼7+1Á ö·úómmÝý¨aè¢[b‡IH…¶ïᓆÿDpÞ{}¯®†âóÏiÍfˆúˆ÷QÌÌ`_[!é@ÔMWÔo÷kë†`‹Â¨Iâ&N„Q+ÂÁˆSžS¿85=™ñ~‹jëݬkäì½}¼°?‘À;bQÄ:-AeYà“!«QˆüæX$6”d-‚‚Ü¿’ƒˆà¶Ëk¥ŸÔO.ï´ 7$uPî~¨µtT¶.Õ€u:íÉ|šë êÝ¿cînëØ“:nQ?9ÅŒ±[hkÿªe? ‰ñ‹ª%$ûxÇë²q7µó)ÈhÄÁÓ‚…ÃU¢&棃ׯü¥³v¬u·xÓDl¦a8`\:"õ¶Ýjõ hªÒåF†¡ío¶ßñ&+ræûß©rÈ?›jßO>9ý0ȃØÕ/kÒtä=…ünÃ#2HN Æ8(_‰Ø‡“1'†@†ÊE.ÿN.× Û¥lÈêIÑyˆ$¾ÁǾ7È6âõ#%RÄ6 Å@Ϩ™N#í©êæ ˜]È•)D!GtáíÍv-Ìmz‹ÆÂ ¸ÃåDš³PÃ*ºÃj=âðóàÜHÍðLw:–S½Â@Åx…™»ÑF´ûîMxWZ¹’Ä)ûöÛ…qº¯YSfdˆ2áJé>=âˆ'‡ô†Û ø,Íl Ž0Ù-Ø[’FK»4.ûÓÙ@<\:ýìò†‹g¡l =Èëùób„‹Yìs± „$i×XÖWOG딯¹ÆHý·—ÏMᤫ¼pS¨bŸœ†a®‰6$?Ü ñÆd–W“®0¶¶Ube( ,IÝ«¡)=LŒSS°?œ"ÿU¶»<mô_ (ªr‘ïÊiZÔØ`€ú›n¢¸a”¶‚´¥‰gCÏEð(¿è'No&yWDKA]2Ýu9#ÒºÚI*š–ùý‡²áô)Gž‘þÈ‚?BÚáÐLŠð Ê µ?5(7ÚÐ :<”<†{njX`<'¹ì}0ë꼤“Z±«8Så¸jchKqÒ%°gKŒ· ªjÃÒ†Z'á‹j‡P£ Hãý±-zÏÛ lCÓß6X¤šfÿv$â žRÉY³þePê1#GÕ«§ám2£{‹h¡`9~Joå7 €†—Ÿeao,®¡ÏNyóIøåÒŠá0é}¤@#!ý§¾Ïé8Àåèq­‡BÊŒð~é|Ýü£¶¶uFdIe`nÎÂKAÿVà*¸6ôbfmpm´ù¼…jÓm4QVI>!4¼z§fí¦$ÙÿþÍ߯R}laúÚ$vž„|A>°·udPå3rãT¶€VÉo…6–x÷.¹-ó g&EÚÆý9…ºÆm汄Lcñÿ‘aoPX¨&W›¶m¢s’ï‚62°è(’5ÓmÜž ç·§œ~Ê_„“€6¦tˆÛ<šsq!tˆì —…q›É|Ú2Ø 'r+d#mµ±ý¿ù5¨G®5‰°Íúi*?Á_N–Rµqnš&éHhºp6?ïý<ùÈ6¢úÖ J>É£K†9E§N9¹Š[žtkò³Mç!v8Éë‚%þþUªW³¹WdZÀñL2‘‡¢C£Ù~ÛÝŸN]¡éòãýìhÍIä—ÀDÌ€Ž£ÁÐáeÀ™Æã„µù‘ïúTx,íX¦‚ºOZü÷ EŸæâ¶;åÓþ¦,PG+ªÃø@¡ù•ÐQjfD)ÖâûçÛïëókq÷S»|¸£š#µŠó‰™w£±Ê…‹»7¹Ñ‘ßo^Fú¬Ø>`œ—}~¯&¡’/lÖù†ÏßÚdM ¬‚ô$îb QƒøÞE4Cë6U°9‰fèÒJñ•í}õžÒ˜>,Ry}6ÒvMÜa0Âp³¨4¸7NsE8M¯ö¡¾Â©ºîŒIG¹ëjµ¹n)°ØæÈqsº–ˆF  à/mR”ø$Eÿ¤“Ê­VbpRC›–ö WÔÜè&Û~ïÄ)ì¬:ŸV„í·L%8õ¯ÊüÂU)˜aÀæ)F\®§ ‡n#E½º-à!ëÁu ?`¹»lZæ¹ÁPz1‡}k™âdŸ.À“õæ/ ùÏáXÎÇy1óš?È;4ñq z³·µ£V[¸€æ[ë\¨ Bï1š‰ßªIƒˆƒ–‰JOÏ:a.ËÉéJ Jˆ”·¡%\¼døÔ q¦n¥7C¾2Ól øýZ´Æ´^iµï Ò—i7Üz¡ù—ÆøvÌ4•š5ZbC#Wáxè/ŽªnáÈÞà†³ßH]ù§îðüPF ñ+fö‰wQÚ[yqÜÞ=Î}œ|ÈB!eGž±-sgâ—.E[æL›bè{1}¡Ðj8 Ó´\8‹Åq±„.”‡£Yµ-f‰¿“Á]GÈ9&O%ÝÐ?ušòKsäšæ"¥þû‡ѪoŠoµº«Zíݧ*Th¼@5ÉŒÇYN¼¸_GéšFz)9½6¤A—Þ\âWzzÿ˜3é]l"/¦ÜáQF»Zƒõg)q#вnUd%–ØZœëüÁuo-Ê«s×´+«Qou4ö58õö>Z'ÖüÁ3Ä@ºTíñåCu$%¤K'7‚$Ö¬EÙkðäjoÒßJ’½=è=¨[¬[\E ö¥Õ–ÎôÃKÃ÷Øàöhp{lSÛr&VbXó«MuÀÃËžXéí¾8‰þÝ´#\=ÜYyÎu ö‘üørªjøôgdçÛ„ýò˜ C ¤ð’tpkáXd/;iau¢qgØÖíÂFv r­[€Š"‡VJ“R¢ê×:‚¤:M´|tá·•Ò>ã@¸š· ?2I0c´€† ØÿÌm;æÛÏ&<ÉßþÊG•Œ¡Ô¡ÖÑ=7öoùpÉðÇG\Ô*<ºþèþ»å ÂÙÛóëY3K‚œüŒC°o‡·²?vÔ‡L{#î´Ã "Ýð@Ù¤‡(9Í‘b¸0|‹ßBüR bNíPÄÐÍø(ˆþ2~(Õ‡)9BïíÔú^ZÙ 6uNÁ:Åçîæõð”ú#:ÅþXXÓ«šð~'`ÿý±ºÊW¦Ñ¹¡»P_µùo2ÞwuÕvÞ­:ÓšÕvM~ªñ+ýœ¨Ôijdgos¯Ít;1íé®îOõMêg’ ÞC¯ÌCàûÓŸãSuÕÅ @Ö#pÛ{³{‰–áý͘´þ†9§Ù¬ÃÐ1Uw)T¿i›O!°,/§&¢m–“üà%ï¥ÐKvWÔú÷…¬>¦˜'·â™c)ã_"¡Ð!ýØg§C¤Ä=úg\ÝOwF¬aÎÒõg8È3xŒªËá…jM×\|°ã¬¨ó+‹ešQºPý|ÿ"ªC0*¸—e¬?¶mþþÌ3A&Ÿ™Íè éÏô§%ïµG4¶÷ýæ Ĩ)GןÛV-ûFµ?ÄQ¥ ÑŸuV`«:<§i°~ QG1’\‘ŠËû¾©û¸·™§Ì?ñÚà@¡)çcÉÒkÉÊ‹é:”žž Q8v¸ATŠÚÛU·ìY/l勒Џôœ¿ú#ˆ½žœ”Ø;>šÈë¯øÃï&=‹_†lÄ…ÓÃ6ÙW´/9ú†OŸ[ø²'}xûò&ÖàvÓ›—‡—³Óy‚¿ž,KH¨ƒ/î>×Eð;48ÑU.`O–б-Òªžõ]¾w¥Oéö™ o€ØÝ8‹ž>¤O9å[³†)ÀÙ?ÑŒH¶x{®ô$sæZÇÁŠõô¡æ¬óy­™šþ£Eçau"jO Òúáé æžr>;€_Òxêüº¡·±Û¦÷̧Ëå­r+¾è‰-ŒfOâ²ï&‰Û°dîXéÐ(åPÍ·o×i•Ç1µÅÌêJOn»Þ4’8:s©›ë>²ý¿O¿ðiaË9ñ8gù(‹±õÃåvó1É®MŒIO{kÏûÊé µ–h;Ø»ðÅ -É1×ö>ùbÝ„,±ƒ'/ BëŠèTó¬é¥%_üÜÿm‡Ž"u6ÒÊ2Ö—ˆSøCê©Ñë^,P:e¿ô{»êy(VÉ·LŠÜ\×½†>]*c£³OWâ+çK:º›)D†Éôf¢ÙKË䡈R§f‘ر”´;m9@6y–tË ÃŒ«®a|V¯qf¡ÄU: S/a°xQW‹îmÖ/(Kºü´4?w¯ŸçþöØ÷tÉ5^®##Ýñéc–w Ó7M½îÉAW}oAñ“òÕ{{~M¥´Ynç¢Ø«8ôdƒ”UçXü ÞÚbbNzWÃMëŸ~ƒè:Ô‘®—:X´S8I$v‡æÇ¹7ŽT"ÙhʨçúÞ5ÜÒÌÉù‰ÁìPH™¹ç‡Uj]¤ÜþÏ Õr]û Ÿµ˜¦3È@ÜßðÕöëù¹)Ý`ºŽ¤ÇÞÿƒq‘¾þÀÒ ‘1”‹ÿXK©`‹Þ®çôRժȑz^tÿæëƘõP,ô,ÌÉþƒ(?Öþ¬0¬S¤Õ§´·_¼Ü]T|áåöæû±Ýž—Û‡hõ\ÕêÙ?)úçô. Ÿ ßq¢rþU^î>éa]®ÈHÁ'Ë9Ÿï¡G¡w%ÃY3W¾tëãb1*@õ²\~¾›# Î0žRUÏFìï ÎÀFÝIy³!zR ¬NÔG¢çòÓá{´W©-ª\Ø3f B ]héù¼FõOºKiÏ[è:É=»Y0¢\ßZÙÌw5@Á(Ò= ɸÿ ® Ï9“†4 ¸PZúÂët{M°ùr”YÞbFTn”šZÕˆ´‡á÷¹wÈáê1Ô¬ï¡òÞ .ªÄ×’ômMþ©ª$˜°»Ù 3"ÌGÍãfÉ>Ädr{6X?Çø6’ã‘Gk7Ht=÷¬iRA:QxLJ”ÆîD;«æ=÷3#„iìYNøŽØ£Û/n¼ˆWœÞ3ôštJAƒ^ Ä2X€ :îJ«öæ­ñÂô«azçiˆÏ¦ÆW|!=;·ØMÒs?3ê0žŽùä݇ Ó) ‘Wž/&gc>zþÈ@ÃëµwŒZsw_°•;¼Ûví…nÒ³Ðú=»{­Æ“̸Ñ U|e:{áþî®×7“ ˆq›ô  9¡t¬™X¿Ï(¿mÝ4¿þ@]tØARY×;+t!÷|‚°üÖÓ"ë@v$?o ¡çWë2 ÊîÌÎË3¯Æ-—Ñ£“*(3ñÈ£u akSÔ•Ï+ô´_ÀŽë dB–y2ô½”|a?½ }Ù2 LÆÞ&™Tä9ìGˆÿ]û•nhÊä­Dedÿ@ÓžÜàÂÔjb&õgü´PÈè …Æ,CJí"ñRåwh;rLœä^N¼¯‚•ƒcD(cÈõ¤]\èŰh+¾.ÊÛË‘Òë£@˜Ò‰¦8"h€0û{B%Àb3Me0îc&gán«î»5%~ж©ƒ±Dä{ŸRLÈÒÊÚÆ€ÿ½Ð²{ox%Nbu(Eä•5Ã÷C*’ã4– 3*e¾ë3 /¡“(ï—T·æ5jÝ” {6‘ø£‘ÝŠÔBéöÍνÕùV>ãoÅ›½!¯ºÙ¹(8qcXŠÏoÝ Ÿ«ó2ÖDö Ù/¯=àNµâ;ÖáéhÕ(/e‘½‹rzXuÓˆô%нÀ€¥/Éí«aGõøEçÑ鉫‡ »ŒÎ¥Û{Êâ¾hµœC/”ùÒëÑÿÒ?Öò” QB/ÂŽtz0ÅN±wåOúè’‰}GÒqr&žó~0S{·&a`QÕN¦« 9-. %“}œT…ç›»¿b%K-³zlƒOi¢üãN,/I/ÏE’¡G>øD¼¶Xp÷¶³šE «úK(•òÊá½èæýh‡á±Ÿ÷Ò!/›©5w:”"b2é•8Îô¡®Øë©¥™ª^ø¼e£9¶˜Ì¿Ë+éœØS¹>0d¤>='5¸BÇX¬à,˜Ñ{H¸qUPÈç‡ ½…ìОtù„5y>Ëè±í}åú0J%ÉKÎ~ C¿h§bo“±Æðÿ”ˆ×ÌtQfû8½âU³í5x>¸Òn Šg‡J$“«¸¬ç9­s«˜iÜ[A*÷¶Î* :4ù#BÍ´ îÿŽq‚H¤š]/Šì@ÍzuDÒ«‘óE•Ívnáò£HžÛ¤ê–±–MÚ?á.Ë»ÐÖÂ]³u¿¢Þ²/ š4ŒLE} PÔÅêÇÌÀXÄLÍîñ`ÌâmüG-¦WòŒµ’’Ñžø¼'ô_+ž: wø©òVho¤DÝ+áÜ!ÙrÏjõsÅXKñy¹—Ò‘{-€R1 "Ã¥½/È‘lOud¿'ÏH;º­NÒ̵›Š¸P¯J8V a’•>VêPì ù:µ'qÕ¬Ê?’.s¯®šU³û÷Úg_ʪjâ2HFUzt)£—+®½¨ó ìÕ½q»€ï`ËZk_æqé’á?—<ÏŠA|àVkùÓUò.j‘øÉx‘+ûg¬ù—Ý9LT WHH‘PQwªÃ(1Ú2Š…Á{¦t åJ ß`ˆ‡­µË£Ì%«ÖO¸„š˜‡y‚Ë"0pi(AÙë<ë! ,ÖɈÇÙ»|wøÃÊrÔyË“ÈÈÐã‰-+ÆbW ÍŠ)j¿»í NäE<î{þà ^‹Xƒ€|t,¢'.ÖÓ©HÜ ö1` ½bØ:Ÿ²šÖö>Î:Ïüÿh¨§uq1”°£ÒÚ+æ Vð(W&Hz=1SSç•9Ò˜‘¯öÕˆárÃüaË(ã¡bÞ!!GëÞþáȧ» 7ƒzf¬7ã.¾NpŸO·ÒÙÁÏc‚^ä"P!DÔŽŽ‡XϬ!Þ›ebt Ù8w•c·¡=îPh±OüPíx3âwsGõþºœÓ‡¿ùéhãú,rSÛ}•[oî˜R:ôU*ÙZM8Ò#Ú˜ñÙ¾véoÿÚN#ô!ç55Ý©¸ö÷¸»,ï/í“§µ9kí´à¯ÐcHj3¨Cb8ÐþR‰¦ÁTLÿ‘ AÀ+˜?ýM×È)ëT~qÐù$cw`õ[@Çé¦L¡ž>¬ÞÌTIÅ&ÖǽKfP¥” ¤Ã#ÞªõòÂ?¤ ÄÛšï_ÒâÞz;kA‡-ìØ~'±/Dõ£†a3­H«:DÑ\ôŸQ!*Š}šŒYynåÁ¼!Á¬µ·Y¼ w°ZÕ—®âÍ%0Õ¨)…MZ ŠD±ˆr^xèºÎó•(qé/^WÖñ(ºX¿0h¼\lÄjªþ5bµ6먌´é±Fz:°¾½óïD+Bßô@]„/èÜý{p•u)Å~Ò%‡Enl¢‘%ëmÒ ·^Ëg±&ÏKÇÑÛ¢ïò„mT6/IŠ&BÑGj w€2µ–æ®fžã¢mÙãf®È©_ý«Ñ)6äׯºxooϬ­õÆ]7õ†8Y?ö98¨?&ˆÎ_oûG^9¶m6Ökƒ»r•~`1~€ÖÎȉÂå_¦‚nR‘p"zgÝ…TÈ\X…Ÿ&¬ t'EººwÁ˜ÅLÈD;Mï”Øàõƒ®ã'¶UÛ†æL²½£}Æ+2½Â?¯¡‰ÿÕÄœ›¢ÚÔ6«žÃ×z­XbVèµÁÊÒ³3$ñ(™¡†'2t÷z‡Ž¿Cl"ÚðÞ¡ãïàˆME*âhë0 f yFd˜Ñ­zQxpmvÈDÔ=­ûÁ‰ô/¡Ísz‰Kµ~CØÉ^> 7¿ûeˆØ?ÑœFÜIøœÞ ìLJ¢9Ý B.äÙ Níê|/ûe¦ Ö§çit.¦ÇÉf?~÷I~é0Få@%qCÉâîmˆ<„†ÝÛ8š]YÒLRÝUç+'`èP‚H^Ä÷G~ÝÊx….‰Á÷îÙRÏ(_¼?MuMï½LÔñ¹þå/3‹{§°¥2@oÌf¬¦B‰ŽÚyå`ž¾\Gûã“6ÿù(™òh̳’ôv(uKhâÅøv/eÅM½J…®Ç©Œ¹A"*!½ƒ.1U K ˆÿÞàŒÅ»ƒøïz%µ!k®¢Ïœ>ªòêèï&NO^vÁÊRµïÔ!! ‘.mïôd­KbX9« iÔÎñm”@­"úxÑ ¯[ ´Ã4ÒÁùE‡:­†¥èÞÅî [e‡f¤D›Aï>;m¦kA |BF†RP“`™øNu_b[{›OªL¡$;mÛ–á9þŒ+ yˆûØç†Þ1᪠Õx•ª;Ä÷N+«ì.5·¸‘“’ÛÄèCr·†âLXfëß1èë66ô~„ÐID}oL¥_ÆŸ½ýR%\€‚?ز>:¡N‰\ŒNb¼»®ÄúнŠÄCwË ÄŠZ-WfI²fŒQà$1EE°·UꦇN*ä+Q¿‹–мð‡³“‘} W îèØ²à$Ñû9$Œ$Ÿ4LÝœ$Me%BŠkªa ”NŠK™åX¯tš>ðÖbaû?ÕäFÀ¯_ž»Á¸9' jÊ€éŸò¢²Lbb›¢LVÿÅ—’œ;=ö},>¢é.…x+½uñÛ]øé8£¦Ó‡¿E݆ '3ïEY”ñ†½³½¹‹9u]fÃ2a‡Nkk2iü¸3‰>NŠ‘¢ÉY©¿ÈX„Ö‚WŸöÙ Ü/ùHŠž§ÿ÷GbÌ«Y‡W$ཀྵÛ>ÏÞ@–n"](‚ݸ uµÇ!fý…sʺõIK[˜±>a=:=9PUv›[>‹æt_@¨Ï¹p:Á|û´2Gª! tÉ_YDuvM!+/O­ƒätšÌ`(é0”¤hsì0”trÅ@¥&mÛaVŸ™D2z8¡¼‘ßf™Ìàº'ï ø”:_ø×Œð°$'ÃÿÕ›,:ÁýŽDEa¬ƒñÒ£™pJ­¦ŸiØñeÜfF½<“6²«}iƒãDhV‡åïóEZ†Xƒ Œ®@^´vð݇N—M xü1cSÌ‘ûySÁ,µ·™ÓP©¤héA[s5ÓÂ̬ eíh¤(Ç”H [Œå6™°ô4Íz¦*}nóH`Ç„©ã]nlgõ•e;­›§¶ˆ.ÎsŠq‘€Ö3À)ÚeyVc§påf;´` $ Xëq˜¬&§7)Ju;ëzý¬³±ÀªlϧH Äfnhšl ‘’ú$³9MϵÿîI¬™×ƒ‘·c^†ÛÂý}¸â ~É0éˆ,~Á¸êÚbEÝÛD<å~_c(ùòœÔݾa³&@”iøJŸƒuøÜŠóë/5‰›Âó°–Mè»uÖsóq© wbWˆêÄSkAr '@öoHý|Éþ÷6“—XO¥™éÆé4XîÍ\Öœ©I?“©ÆÆW‚·Ow„ERîP °á>'½yÂ:½ÞËå,ññarb«¼7ÍÍþb˜Ñ7 ífe¢aØJ:l%'å/ø­gwÈâo•ý¹-~î#Šñß¿e2€˜ Â’a ÀKòA*)¼@®Ëà5£óüwbµ%ôB“°ûÕf¶þ˘'m¥f"‰¾¤ÂÖåêpZ(‰v¸Iè\χž0lÕþ’Û›Cï€]8Órµ[_þ~ÞѺ ` Â^w:º•ºåª/mYzê£~ ±;7Ö'›~OÚÎI K§FØHõ˜¹2Î&èG@-ZàP/JIIÒ ív‰¢DÃÆ¢Ô´¯h…+e|ºeÐÂ<³—FÚ3{ÍB"?e†¸2µÙÀWÆô‹Ô'´<=œU iXú*bíJ:è«\'A¹5:Πíß%ÙÂÓ¹©Œ¶E7?‰cÆyOC dȾÉ~£}q¿Í_ÌÉ}¯„¿DmÑ}ÂuZ æœM~ŠE¶ ûÒa(KL_4ª`…ZÃãD„ j›3m©ìx€(”:¤!Ý#­7 f²i‚:¼µç«±ü"k‘¦Õè‰<ÒxL:’÷Áâä´¨ÞUüQ±•µò0Œ–sËTÕt[ú¤ùIA·ñï#‡q.dŽ•˜–|p û‚û{•±‚Ý·8¯¼N+Á¢•À&‚Ø;‰Æª9×ÏÀÀè¢tK=É= ©­ätCàÐr‡³Â"ÞêDàÚ¯Ÿ¶Æ§©ôFÓÑÜ®¿Õ˜¦¬v^CsúÊô!áÐïm–6¿‡Þïøbí¾Ì@E’Ò®|%)âè¾^¦5ñÒ8Ä_v¨‹ã4Ç~BŠcÉ)Å0ا²&ƒmY€0õkz°‰±ÔU°æ—ò8|Ì /¸e¸q8;&â·ì0'ð¡¶|šoû2W$çßî´ÊxyA°¬¨¦¸hOü5ƒÛ(‡Ã7Ȉ՚{¹B‹ƒ)Z’ÉÒ\Hd^Õ*œÇ©@^úœd¤l%9@,ãyX–‘ºXåx/ËL‰è.Ïã•Y~‚&èx ¢¡V\¢·ÐA{"ïQ‰à*ë˜írŸgü´yj6*ˆ Þk¸¡¥)ÌÏURœ7û×;Ä|ˆ#ñóqO2µ»`„: Ü %¨|b½`$ ÷¶$ÓVºÍVAç÷¸% ,ºK—lÆ“|"7ÆÆ=ÉŽÇ] ºŒàxngþò×Ï«™£*†¹KâNö¶æG’+7 i‘Üÿrî.¾^·}ÊãJKÁ¨Ù>}Ð(Œ§p»®ã MðÒ†î(ÞX…Løç ÿáÊ0™¨ÌWZã"åRßÊÃGI•–W+~S¥›šˆš ©… œâ·õÌ…Ê\8M 1î53ÈåðãTÕùŒ/5{#L®ÛÓ;Cåˆ"Ï3‰Lme+ .˜ñÔñ³¢QzÏé_é¢gæ&MˆG5KøØ öÝ»mÈþ¬u–N{aJÙ ö¸M•ë†e#ÜÞÛ²KùÐwúDD‘ŸÌK —Îgy…Ñ¢+'*‡¨q¡êSš[§€ 9äÇ#‘íáwpì]…a?¬–ñé¤s•]ìŠèõ+šÑý£PyïçÞÿx:¿ÙŠ—v½Þ½Gj@Tòå†ûaK–Ï6hš%ÿ©ó®;ý£K“Ü£ÑÅî=¯Vèñ¶ÌGìªØ½͉ˆ‡U’œÿÊÑ|‚Ht+Þ5žé´V<îd¬±táfï]k,]¸`#X”4?‰˜£nêô0·Ñ&Á½hŠâç8Øó½y{þCŒ—bó9zÅ·¶Z»£Ø­B<1bD´~ æšq6s0¿¾W‚…Iùá‘ÃIYKWS¿`­FC¨Õ»˜EÆŒ’éâ©î÷£ðnéA߯Q=èëA'ƒ±ý“þæ­ÂH YÕŠ̺¾bÑ¿’á6ô8œåu»Ž"UânÙA_Ô·Au¤ccåYÜî"A+%)Z.ZôÂ…Û0)Ä^#ûíÊÉ-4#-îûcèÒR9Òd!Nb‡ü}YyÍyKʈ®ÈÜFVÏÁ0›J°ôŒü ‹R»yé€x þ™‡ µºitÿFI2ÐHJtNQm Ó hÝÏéy²j|*Ò-˜*5;TSŽÑÌUL–·j2û¢s1¼Ù=í{z`DÑ”s‘]?Sbeè˜ÈUŒ iñÞáp6ºèïíxEWg˜%"™Ê4i¨¶iÂÖ%>Í‘³™D””£– 3Ô]ó\ø?Z2‚Ý ‚£d±-DnMTæ‡ò{7>”† ynbœh†‘mé`TÄjoÓàAó©úµz__|›û:8u 0¢(<ÈÅ>Z¨×;ú·–üµÂn¢ÂûÈêCØÈÇç²·ib­ÄFg6]žÀ¹÷}±L_•]µ«¸%½`ÚÈNjê¯ðfï¥Ax[ÔÔ–Q¨é :j†¹r·˜½1Ï_@ÕÿÔ51ÀŸ·(¤Ž`KáŽNÙ$&Wði á~ãNö¦ºýœîjç¤Èö/¾w×;Ãѫފ-ÈÕÒ±áàg¿).«)ˆ¤5HG_tvé*^ S¥DVwdõ‘ï]rîdúÈŸC§QTå¹_ct˜ šµÏ3“±™b¹eöžZyL§~»ª/ƒ¸è qµÈŒ_:QPÆ#›)HÇçà!ÈwF`0`HÙ·3Ì2 vI|'`1Måò é·”K©å™,]-ÊÏ+`E<°·Ç›0·ºo¤d6+'Úqš3¡Zôäìó0ÔˆW*$É^™/îìŸçë[ªÁÐŒ#‰4¸ú½GžŒ3HÔ@<Œ,ÌÊa‰ÖÒ²¨£Z*‰ü~äŸ÷Q|SÓ}”1®‹;žg\HÖ×:² ÅÊ|ã|@ëv9ïíúß§õX½y{}÷䣲 ›úÝǺ·Öñl½€9 èRœË~š±;ñ-h›Ù9üýw²¤$ ÂsKdÄ3°=H §ÈF1¹¥@Ÿwo+a–·|®`¯ì³ðG·u”ç\¯µâOÎ Ä={ð%÷mÉŽYUŽ»þ¢­Ïs(R7}bù’¾¼ý"C¢‚‘•ŠÄEB¢h¸<ŠðHGWÄO¿jÞwa¢˜yÏçT–¬@9Ýh¹…5%‘9Ђ·oãù¼`³³lkJò¨éøÁiŒßŽûËS÷G¨¶HSôO¼÷ÈiJÌÎrÒ¬^̘=Q2â%¥SéS–#N¨€O¬tÞˆº¾Yå:«‘ úѧ ž¼p¢p¯É¥6Ì›"Þ”oŠ4êG¡®7ÛÍdXLM•’\ Ù>R†n\,À Û ¾HŠBÀS½|„‹å’ó(oÇÝÞV8Mf9êÙ#\3¬¬²èXGA7ÇóŠdÒn²yÏjk)݆W÷æâdç(HxŠÄ¼îÓ%K­•ÅQZ{_‡*{¢!G¡Xh3õ¥j`Œ¿í_ Òÿá)†Y a ž÷/òÍ~§y²Ûåà1Ê;øý̱ÞtsTÿ†¦kº­·#Ä5Þ'D.‚kj7ƒÝ Éœ…(Èú,Á¦˜:ñ6z\šÞ‘â ‚û„°Ì•ý”®’™²ŽÄô ­u`o³To ÊÂQÆ72E­ÑÜI|$ËÑ8Q‘éïêܱp—yž“4fÆŸÅ̞褼$MöŒÊ+]hùs6Z2§V—p¨°ÀL·¤”ßUŠi@¡›qkœ•~ûJÌŒ…ɉ‰!‚IŠÔ$FA†`ïÓ'ÞÏ(p>¹âçª4n:ØÏêŸQŒëzHŽÇµA ;)ç¨,°&¤>/ôýK¤œ„îŸ&!Œö8­4™ÃŸ2Š…½cL šdÀ£¬^LF‡N=–ŠìŽÙú@ÊK’>&”Ð CþÄYôÃ3å@­j¡ä3ªF=¹ÖJW€!¥D¤6jòÒ|ÔÆkìK×wPÞhØÔF, £j%üàæè÷ ^Ïi²Ù?Ôj¹¥½Ý¿ÉŠ|}³U £žŒfU†;ÃzuÁ-?‰hè²G•ýçn‹ämœE_ñyU¿ùþƒ,rp8Ö\_ðc¸ï7é=`S¹@(Û’ƒ_ÒH2a!2‰Õjo®×lÈí;«¯ R)V‹=„(â‘Á¬¢?žÿ¬>‚Ù˜K´»Ú×rè€,ÊöwG ïEš _Ràt5°Å]§—å`KáËã‘1ÃG’3*Ü£’ä„‹%PP^Ó¬UJè±Kÿ+×r*ËÕ8ÍQI€†•Qoo‡´ãfœ«ÅŸg‚…p;zfß)¨U´Úùêçnœ2–·Ú˜fÛ\ú9Y ˆ]rT$Gª$ “&|-:Ti‹ 2¿(£UMÉö²Ó€—î¹ß%Äx£~¬]µz‘™ˆ¸9)#28w{’cÄL›oœÈ‚sá\TuÞú\ ߬¹Á‡1 ÃârÝ^Cª8oô A½¸o¬ö·Ê$+º:²1Òg¯­äJð âbêïa¢…`•ºže­J;‚©SµJŸu6dJÌîù(òà´ÎPë~ÖÇž*â· ¤:ó‚®KH*/»*(NÄ’‰/(Ím#áö¨/sØ)×y&9fpœ,BªÏÇN .®ûôB›Ô|T‹Œ¸vд,U/ßvΗM:£¢û½‡ß¶ëPjP`֢פ¼sDl´åºNûoÅ”,#bu±ù‡è~ÇdK­2cýxî ;K‹2êh0»Ÿ„AWÊ$ŠP{6Þ¿¬gEjŸlsÎ5O!ùæF!ø-¶m#Ú8&m !G“0ø84Ma&[’·÷É,vm+1ƒ‚–·D"ÇÍ?1ŽƒJ8®.˜–à*>âFFåÈ„)„dIÛh†y†w×’¼ývн )ËOØ".–‹Ÿ‰üùvß5•!Q  ®CÃ<ë¯ç⬴±WKÏI$@ŽSÙÄ*6ÌÖ¢©k1£¢Üq5Œ`_‰©Ö®‚zžVxžËUbPGÕØèûÓ•âÈñ§[9Y_ßî°œæKî¶ÔCåo¹‘öìº-aÐ+•*â=g]ÌXSm(G1-sœÃ R“`ø – X¨U†Wßû“c‰bWEö9†³K˜Ò-9R8{âx¨1/§¿ÉÅ…\ß¿ ¨Ü”w(Îp&PÉU¿b.+j¤ÈÑšç2-kª¸¶öaÖ÷õNÛÇžFv|šRr1¯F²ÜŠ:½/HÙþÖ!cÁ™"è%†‘+èô=Ÿû Dzyܲ2ü"ªÏBçŶ©8Ô„çÔƒý¼ýM<æå®–v¥‹8Ëi 3Àà¨ØªJÝüC™uàŽótoÔú 7ú9ðü̲ô%ˆ…eÀÂ"2нwM„/µ]>Eß*Š4¬Ÿ9g>_ÅxsÚA04L×Ò†ÀÔCLC#Â2¥w›\m­m>¯Ñ4a¤›§î‰hÆNŒFÃ?…Pý¶í›ÜLg½ÜÝéÍ—‡ ”29Pa`‹›,kèžEÄ€ˆå¶’íXíC}ùT¾xêш‰šì¡Â˶þ·Ò-xeyNö9HXôËrþއÑÚ3‹¼'mô)ò âüæé Z¦\ž]-Ö²½EXp+ñyz¼6!q3º–BqÖ6âï~å”)÷ÁÈB„Ø 5O³5PF7G¤æ{˜"ÂxHBÀ‚‡ÙŸßÊëqú{¬Ú’™¡#Jœ…*\xp£«aŸÌËm‡glÀXRÂS=y6Ëy‹Éþ•cÄxb¥Þ¾¾)”ž.‹(5Cå1Jƒöðºo{À¦’E¹·/Ô7̼ÛÊ÷nwÖuxP#AâÜj0#ÔºEÚ ¦gÇÔuD¼·5­?Œ|Váœ@t噵|t‹½i°üœR é“)>ÌúH—ÑÁü~‘ϯ³´­yÜ­P7µ‹©Ü­g›´¯+kµ¾€Šó|©¾’y {{3ãð¦à£wt ¹:£×K6 ¼ü>êv®#ùωð·›NÄ×óˆ•f¶1Ý—ëº"E7'éI¯¥2ÇyŸqÓ£·O† h6|77U‘…\²§ô¤w¦®ŒÑO4>‹¸×Cö†ß5ŒdIF­Ä„‡PfÈÊÓ·¹-’fˆrÅEø¢Ãv9'~#VìÕ€9EÝÚ£‹_eÿ!') µ{ûd²B$æxë·ßgôþ-¾±»•ðœzçë>áUW’stBP9y½£ÕÉë¼è±(äK+·=Ãåñ3ي΂_þzÉåø±ÀÐÒ¸Ubé=ÙoZ÷rˆKØVF·4k¸ÈJÍFK‰ÞÄÁjÁDÿ}žfT˜—Ð<é£èJ‡›×NI¥5Ó×#²Ô[¶Š—¼×Nï𲘳KªnÀË’¶õíñ…3ÞrYã©k¯oÒ ÙºAyéÃ0X*åNuÙºHÈÿ‡ïá6Ðo«cŒ7‡9`ê‹™|¬_ Î5xÓs"æÍòL>áà^IZÓ5§u|dRÍ”®p%báJ¯å»¤4µyŽ[¦ ÏCºÑZθR8Ú1{ÇÀÚ]Áwq*ÁòÐåÃÄ–C»43È+IrŒçäMT;ã—ZÕ¡ínüËpùOur¸Yo š/å“Öp¯(5kžµü)û×`å Àóˆo:î×$ü¢½ ˜a½‘S>ïófJ¤Þqºò³$þñÔ´X˜‚EžÚ ¤Ù ÛÊi‰0V‚¡ÃX—WöðÀÉÈC‰bìÙÎ ŠNLY¤@Ír‰]DÓ óÖ¨ô¶ILÈ©¡F3ר9Wy£µnŒB¡Ì*}qc*\åxNÝ€1DÂñ#XWâ.¬s‰¡FŠ14$Ä)L5j;A¼r\¥^äOãÏ¡ ] çÙ«1šWQI¯ê´‰8“= 7™š’€@Œv¹1ưþA¬•ƒ¨"™•rŽ££À¸rÕ¯`Ô"UãT«`[°­P‚íŸ9ZÇ1AEWc@MYN¹CÌ»./Ò¾&© ™§O1,”Âá”k'{ # À¶~“Oõ>AOúÞ§Z{$ö>ô7ÏHB"–¿b&øãÝ``)ÍøÛâ,P±ÿhæÝqºÒõrD =ˆhÉïwÎýÈ”) «éӼѺÞh –·½¼Ñ c}ÞE5ØCÍ}xëB”šüö¼=ü_Ýã«‹0†uÞ.–t¨’΂`‘ß|ÖøA€1Îr>Hk ¢VÑ1(ð ¨Ú²QÏéºQ»uP…dË'N¨¦TàU4®~–v÷²f·ôEÕOñQGRóÑÇKR–î]ž²³-¿1Lfß_i#]|ï5_ÂÂ}óy¹‹1^ž¬@5k@¬¹µtöíâ;NÂz,SçÙúô–ª*¯€å> ˜Qq´ó[°í çskJÆ“þÍ–±øÃ ÙÒ |¡ëö—Ó0%¨Œâ»æ˜fÀÚ¥=O¾t:¥ IL‰JƘ¨´Ž±î(á@ªQÓÉ ºå,zÖt%­ƒRÎÛÛ2ýé ]Ô·ž“j‹×†ôÆHI hLg;£Ì7"I•šÔž Õq×ap‘š3åö¤*ûÌùõ.E9” ‰iÒQñjOóq`ÂL½éêÁ˜NhN8:5ßf¿9Ö­?šˆnÌ~… &9ŵyòtñ¸°±pݬzz0Ú9UY¿LÆÂÀçÁ—R›™PXf<ü¼è÷üûð¾Ãݘ𱤮GqðäzN 2£)# kBôchËb3q îÅ×>Ý»7ÍÒöeº}æ±WIûÞˆÉ4‚-g¨SôÝÅb Y‡K 1f¥â^ìX—›Ž=T+I÷Þl\ž¿=B|·‰2ZDu\Ã\Fì41Óš á£OÈȲK—‘;ÜûLÌñ>O£®Õh;މ+öÄ(ÎMZK+W>ånB~g“J»âËþ°ú Vžtð÷1¦ ¢s•Á}°rùŸ»!bœîbX:°†]TåZDåh€K:pt—2àiÁhÃÓ²wq%}E( ªb5ƒ8¦ó¿ZÓŽbP3¨Æ,¼#&^’-©ªüá «œhøV¬Òºr…Ƥƒ/ç»âºCçæŠLF·íÑ›+š“9m"„ýwË +rÜÑq'1°·û\dÖy ÒŸwŽn6³#X¦§vêDGÊHä·KIÉ1'Iû¥m–jª†3l}¤@5®0ž sÌuØeL1ûñbÝL¹h| †ËïášîmˆM_ d‚LÖ¹Ãy¤‹œÅ%ÕËç˜ù9éᛚ…âyÜ+ -$¯Šrù_Oaû1úŒad¡Yj½1§ ÊqW¦š˜Æz¾î‘4¡  ƒÜ£EH‹>¦…:Þ°hZ¼Û¼-š‹ eë•^×_\-¿©ô§ëV™¶Åøä¸¡¨\cž-8§éúv•. ›¦B?ƒç}P»Ò¹æ¹œ†{YHo@Ýh –Ûùt ¼cÝ¢¸º×ËÙdZc9‘CTˆV– ƽÝß“NóÛß$šS”f W{ÓÊëý™e»i盪ƚ-GQ,]@\à‡ ÈÞE>y!`¤,Ï*¬ÄéÖ…rVâ£Ý Üû±lIЕšœ\šÌo´™˜Ï¶N$¾¦fÙÿ·“ Ë!ÞÞà†+™¸GÿFrËÌ/Ö6XáY i_ý˜_-ë‚_ÄßÂÀUIK®óa5I¨¯þ]Fû‹ækQûÁ"„µw5ß2qD”VóœÍ‚ws„Án³÷µßh5Èÿ^¥Ñj†|·©m%^>ÚÓÖœ‚˜IIÄA{Þmá=:feþ|aû,$µÂÉ]Ø>>L Â&qІ+DócÙ­á\ÿ Ì¦ÑD#—·úIPÏcÎ$ئ=OhØ\Ô|5Ý ¤gj@ÆrƒÃ’=¬+ŒÀ"ÿISœYÜ;¯„]zì(Kz 'P²œž§'X¤1ó«õÜ>8·|¸‰Ç:¶naû–\QñÒ¥Ñhxôâ‹´Àß… ?ùà€-Û¿pú–£Öv»¼à}û}¼Ê¬1ŠHX›žq¥»Á¼.j¯Zt7Àmôz¹ÁaÉŠÜu,78àVfÖ*G"|Ü`¼¨gbé•E)}Ñâ‡^}Žö°¼rù¢rÎíçÃÇ.böÀäííõ®‰?•œl¾‚Ø…k;WøæƒœÃ§Y4?RfœÈÃ*¸ÜÛ±âí?X“¶Ñ}IëÿÑyÕëªÓE¹ý[¹Eþœî¢i—Xÿ¶‡kцŸvž½›X+wjˆ×|=—ãM¡ÎGðï SŠˆövÓ“° #<ƒ¬%é®:7§ëŒŸƒ¼Å4¶-‰.‡>×+k€îÆ|ò Ë+>ÙÞ¥§Œ‚Ô„¬ås˘e~#õ:@; ƒû¡²žøæB²íí®±OoÄ©Ø_çfÿdýdJXø&ß+PaMZÈä¶Ì¡… ‹æeÎÛÚg¯’…8ÖªJ?ÐdõÛæ| wKh Ó½=vëÄ "<Î|ìYÌç( Åv}œó\øæ‘É™„k—›Ayÿ½SÀžç<®‰’ó1÷"·Üt·Õ º’|t„GeœÕë–g‘S–<»ê¹WA[¦3I³­ÄÊÐëåF(í*È„ÄEEš½]¾^1êêçeÊàÝHµÏôyÓ´)“KÝû´—vMFù¾X£f|42.àã»L/,šªÐnÄ EÛ`"ÂþrýÝ„ b?ˆÏç,Î-¶ÛòrPÔ0-éj‡ZM¯ÄôÏ{7F f{gl»0¶EUv˜­f K¤•D=ù2Î)‚¤L-q‘QÞ÷.«áé A;r‚qÎùо‡ºä‹•Ói”·è:1÷j[¹â¶æÃÈógb¢w@|ž!/”ùW£ú~ë;@+¦)%åò˜ýü‚5…Ã+b㉒Ù|¨ÚD1moÏ¿Åa‰¸­‹@Û¸€xƒáÅé,°r7áÞÎzΗŠl>ë‡Lß­é9Œ†:ic™ÄìσL`ì^tÈ”`/ê'ªùóAó23ï5N”N7e$ „圧%uÿ=ó&䓔˛¶|a Ö_cHÚ¿½}Ó=•èŸë銕–N²Úïò¸ &q…Mh[TuœÐ¶ì]˜î°I¼pJâhþ'Ó0SBæÁie¹3OŸÙΙ¬*Äí—|¾¢¼Aq©ûÎ &™3ãÌ ”¸ih\⃙)sÓéØ{—< ™Îz çœß´øô¦Y[àU!¤N;"_¤ê'eìHïMÝàÛn7_Ñ`ßÏ”?`ð[­ŸÔŽ„0—w4Dðmÿ£æEâ[|íÞ…VpNý6*¼äû…îB‡ÏÑœ¦˜ZÎL ƒ¶üL˜V²Ð¼Y¥™Ì6ÆÍ,†NÓmF^qFÞ}еà¿Óq‘…•ýaÈq@ýמP£è’3Ö¨¸dÍçñö6yZ³ÜQ oÑ7« a‚jQVsÂáb }e†]Ûo¼gA wóp¸L8\¦9\"§9Íá2ጡð  ë×£›oošv&öl'#=ôöãÜGn uH‰húÑ?yïúB¢½ ]ùú—%`:=Ý,lÇiq–”΄Ïe¦Ç9“ê0xEñ"ò‰“O2Úá3‘{ ;–d_É,áLý†(–C(«Ÿ“xž™p+F cˆìrº=jª £Ï4ÒoMÅœoMuKœ|@”¸´ÿ ÿò1ÝꀎŠPÏèL¿L2N•ïI5õ— áp2‹*Ÿðº<~<~ž¾ø­|Vjí7®æÃnbFáÉæáv‘3vÌýäKÌx¥—á>‡½Áckƒ_xoã ¥«ªŒ,{_EÜŒx0©‡VnpŽ„ D£Ãcï;1J½ÖØ{Yäf 3 Á„™†NpÈÈ&„-êÒœÑsÒÄñÞ†“´¤¬Â}ËèdÚôJÄ(pÍ:uɽ²Î¬pžro€l6*ê7Å_h?+5R†ê+°w{›VM×Ê%z<¤ñ{n§¡õ9Ý(S7½¨f@›d,@~ÎüЈ>uˆ¦2%%i#Z¡š“*ú†rU¥cº<‹{[и—›˜ ('7ÔwLÿ/0¹œùÿe 6LH=r´ËÌLôPFšàpf§;UÖ¯†ç G¼3Òiûçk]8Ì$h=úÖ} ŒèŸêï$†CQÊ艦ã>K h<§ËZö£r¥ÑÌvMkìÃÀçä¶aí»S=¢?Åd`5W¥©ÅcSN˜xA®wTÆ9z@œ¸ÚÑ/+Å;ft$Ř¥J`•:ÖàWfI¹½ÒÓwD6Vñ·8´¿©âßòöjí#é·]Ú\ËÏ¥m0Áølâ§`*  hÎ ï‹?Le6³s¸VÙ¦ª™½?ÅbtY.äK§N¡ ¯ ’Æ'ï« ig€í(<åÅÌQ(¹Œ™3Ѹh\žyy»«"ëHÔហϪu² ð‹&* À:¿)Zf¾ëbüuÓvI¯ 13È7È5œ7c—Y&,b7Þ»Þ|ÁekÈ´«Ç`Í‚ˆ 9©øÆ›1ÅËMÍØeG¸Æ6P/RåA^­ |À¯VÅ>jq"R<5®C˜x˜_¦™_&*tEP0¿h;á¾wh5~‡˜qæ`ŠtL –«+ÔŠÚ‡ŒW1ª=ûH aIÆ+¥Øžßý#³hg†`|ÔhŸÎC´i„"Ƴ}.V³¦3”×Ú^ˆƒ;ÞÃý‹~<éX. äèà¹t)Ž ƒ PCçD‰,Ñ9ÑÁ.Më’Æ¸%ˆ-f0É ÷œ/uñ,g9BAÊïÕoY2‘ÙýtèÎRÈ4ò¢#ÚV¹[—S1šPg16B_ú– y§ŒH¯ˆ-~Ï'–ã ³?ÓþøÇ(‹™à,´A‰ƒ÷7‹»!ôâј°÷§!Í— Þ_sÙÀ…C™*t•=Xm¼~Sy†gUóººS©Ç.OmBØÅ>¦6t7yèéÚëkh–Ë ¡ÜžO-ö¶ˆq¾vþSÜYá©"ç_:ŸVy®Ò$ò‹xfFØä·}gHJ?wcös5–Mx."ë6igîý€q…Z'á¼mj{XW%å,*,/™²´PˆæË•÷+ñçRÿ†±ò(êçy ‹| ímeeœ' ©¿°:'É|ìB–Mà’û@~I»¸åq†•¢ 3š g™v^ʪ§tä´í•´#ãÊ2<Šw*uGç2ûP«Ä¶7EU3'+ se,¦©^šµ¬L‹4¡zQ›ló˜LZç㺋‰êRß÷:ž"üØ"ws ±6 z³‡Qúë }‹ h ¥u¥»f«¦ï¸úñ:ÜoCq¯Èy{q~Q¬»­7“GæNc·ËÞCÉöegu*”–ˆ¬´X}HÀ€öØ䨧ÌŒ,â¬ÀÓ"WV²eÄð>™v'8®Ïíä2Öq(gMAé–öœm¶ÆH´-˜“`Öd·¸Ç¶Â«l©«Á|Q°'ܲ¼J$ö¶bÒêΆXr+1è¼D¿`è ¥kº¡´"0{^#PÑñõ€–í“~âÛÅzÑ‹ÄV—Yx ¬.ñ"…ÌÞ.˜ÛÙ£qÍÔÅÆU*r¬¹ˆ=gV¸:ñŸ„žJW­挃Àv¸ÔéÀÍgu xÂì²OF96ÊDµ¼ÌDA œ‰‰p>Ò¡Ò¦š”]ËobüYË¥Ž ØÖÈ“­åS¢¾=|Zev4ÂyaWJfðÜ|ÕÊ Ó·°·=È墴g°ÙiÖŸføªdøëô“1›ÕY¥FÑï[ÑkËoÁÒ±#.«ª_^/S]qÚ=°¯8ÝDˆˆ$#d/>’Œõ h[È"s;‡á›`èÉ×V6@І~>ÞŽ¤Ãì§Û¨Å>2jº!q÷G\O€LT^ûL|*vò›ó üTŸ¦u o¡°y/%@ÛºGk:Lmã—¥û£ˆ"^ o\ôìùúõ•sÀ®U´­©ÑMzÞbÏL £ë°™Mñ×Ðü;ƒâeM ÅŠ¼=3XŸæ_"’J×â/he/¯,Ð<«N'y_y·j{èô=SÞ}ú„ãeÿQ0)ñ:d ³QÈjN)ƒÊJ,j ©R˜½x!ˆçÂ9H§ƒ–ÚÝ<4-åÔ„Ìã\FaºT*ü0ýôÄÓ‹ÆPö´ }-üFA^ׯuMñF|*ÁÔTf7ÐEL5ºæy'Tó k‘QæñÜ3Ò餸 Nú†u–FkÓâ»+økX6S½LÓÃAkª— ýËŒF¬6ç~ä6c‰Ör5£/q‡¢?ZÖø0ÝPÞ­ŽiÃŜͩ¼þc'× ÕjÑ Á¿­®µ>¤{4ûƒÚ±ƒ/ ž—Iƒ7)x^ÆPuØÍA¿@)õámË*R|ëˆ!ˆ|ÑQ_~ÜæY} 4wßOð&Zªû`+,“²ÚŒF_½Ñç³3/šÕyNœ{23ò8½°³]ð¥¼'„RÚåB„΢Ãy¥$¾æ«·t QÉœ¦¬·!ûtú6^p˜_D-¾·?J24§P*-ÃN˜é Ö¹>K%U –_Ê—Þ´mD- lEÏP¥°j~ÎP¾Lôsräð§Y_fÇäfxšõeZ­vÊb,OêÙÑJƈ†A`Ÿ,临Ã_uÇý¿ùõ*h¨pG¥0 röIîV•s`ü…s0õ;Hú5~Ívç{y›Í¢"òtC " 8ž/ÏÖ)¸M¸]@fÂP3égP#æ¯|ßó–ñK>˜¦o~;i¹°P¤‚M÷"0>t/ºÑÑÌÁgqÔS쯷ˆ) 0‘ÉâÜ´6‘K'#Ø`N+ßoáHf\®Fú#È,?nïiΜ /sd/g £}s±¨õí!& .Š;P,˼Ý%5¸QÉ1!iv>’â;_ã@ȈÂèU{³Hjëîd £Ë½á‰ ãK|cŒo,ˆuA Qm1¥zjïë›/d>I=ª¸Psÿ¤í¤É‹¨ÒD¤âÀä <èmÛê Ú¢ˆ0aùBEfp)¥~’–ãxDƒwzäFÒUz* ÞLç §ô’÷µæIôÊz à8· vÞNÈ_œU|èì»-ùoaD¿¤¦?t†ù¾ö L `X@ŽÉº4 ¸œP¿LØ`Â$N3¿Ljÿ5&ø æͲãŽNRnÀôÿpΨݞޓuÒ.Ó<.M,ŒÊ¸ùQrÀ%brpKó}”NåH6H­’ƾK¬ã(S ³›E6iˆâsÂìÒ—âÇQÞl´lwÔ¬~P(í¥Æ/ª9ê®G?·¸·™iÔc”»‡ÿå‡ '}%Þ$èq¾Òõ¡“ ãE§Blj2rµ±z[gji Ét–1ña>B @†õä>aih͇âB´“Æä¥é¬«ÑM“RÌ ‰¨é4) Ÿ&Âèï¿Qe ߺ_IŒˆ‡q8çBn…ó* ®¼ä/Ñrr¢]§ÎÇçw«èœÏsN}’±ã`]&¥?3Á(77]úƒWEÔjsºôç(-Ôôö¾z*{‡:(qÊÛ»X£qjšÝ$$Áã\|Å4Yõ‹’1ó  œç鸈γç¡áÏýù­íIì· cšn-Lò$J‡…Õî ¾M“: {HåæÏô….3Ú7ªÄq4' Ñé:`° ³,nW(¨-9Mi½7€/@T¡¦þ$0¼Eó›’"YÛçŒ*ÙÔsp¹rf¨Íù&Bó„cèÐÏDe?@_qÃæ…ˆÂod uw.qÍòá›üö€ºŽK™Åô×Cb ÊÛ: =, ôƒwr¬ÅXšÈ]ÓÚ3 ]º™ðYÞÝ„mš+=†hNÐ&ü7S} óe@ÛÛö{]KLDMuþDˆî™F³ÄM`Bø¡ª¿SÒF“ʶp¡3poÙÓˆ1UþÉë²*É´bðq3ì9Çù¿©‹Dˆ_&Ä/%šîæì^óÌ|É$&,/dü9œy‡0eÎ~f§:—åU"U’¡årŒ[… qó ýH0¿ÌéóNÓ¾LÓ¾ðÁå‰ÎI]ºëQÞ¨í9õÞIqï‡ ýŒ(BÏ̯Yë©<¥¶ÖMyÕb¨ä­ü¤Ö¸í±Þã&·Œ…0%"Ùi¥­0JPWÖî4évGçòDßr¦W”¤òãèY&¨-h\t_"Qb[çtÄœç3›HÝ"’\SíÁ¼tO'1>é€;l¡þíýÇ·Üê<ᄤEîÂÚõ:sq“Ž5Ï×t£ÖüÒ‹ «€œDcên‚ž`eÈ4®Çy‹›Ä;Î6=/â`šëMG@”°WË*Íy´öïÌ,}D¢ŸP¾póKjF“¯Mj®s!h4§ÌóþküA£½Ï_éBÍ((hêC^Nâý]‚ã«—UËÉ$€¥8®Ùã +K iEÊi‘Ê,¦û$0¶HxS)²âG¤âkz| } ^æ°Ïk¡ÈCç0ÉYFÛž“M_&½€Î¢HOkŽºMB;š:q¦T*C+ÃG¡ã4-–ÅÜ£*¾ .Ë*í“×|Ê6•î5Û ¥ê÷*#›¹ŒøÔ˜À-ûVöïSæ1 ÿ¥‘ÃÍXEnm£´Ä®ƒð4§_æŠ×tšQ‡uÐ 0A1H˜Ó’ÆÁNè^h psø“ÇïcÞÕ§»Ã,ãB5TÃ,¡ƒ©fï cœ(ïÎà€9W -òî&Yy«Î‹°­ËÉk_®õ©ÍÕ,­§EI¹A…iµsöf’^´Ár»€D¨/¿h˜ÊÌ[ Á\—%þšŸßxa•=ÍÔäb®™Œt:|*®¦)_”Gô%žáçæï# `\À\"°Õ™ŠøAC,Tý&u. «Ãd‘j0=v±Ç˜49œ¯†:̄䴨ë‚û`cÒ“nŠ!hohJ7²~j²šöå•?o°lœˆºÀ„: R¤_ðê ’ù ËþŦñ›ÈIð4Í0}Ä^”‰Ñ^'æ æý§¬Áœ&P©d BâL¸_æziÏT/$û– R½pÑelš—pkêÀÈsK¬iH!VGEŒü<ÌTzàUà]´:Øaa¥6Ø×ô!,9B±øœ¥QrÅ:—¡èqS¢SZ7ŸY[½É³ý–ÿË®, ð”Ú!WØ$~ë!õ÷t½I²ä<Ò³;ÏUä F5øLìÅýoìÊñÀ)EÖ«ÌÞ é(ÅÆ8°]Dÿ¼à}á nÍ-›û²/hæº<çÚ§)θî‹5,ÌÏZ{/ÛvAÈŒØ×†FEšÏgølmS²V `)í´]Ü{¾‰Ù×uR;ŒoÊzT‹îÖ$-(;3þ¦»º~Eë L+öêë.Ú ïˆ¨çó­›²|6‰} ³/ƒÇƒB€˜ 7Ͷ™}ˆÙÖF‰NEÈÿ})6 @ Щ°ðôcŸë±+©W“!gÿþªž‰[6ߤçíìˆ\îhç7Á”gá¯DUÛÞ×;6"˜4¨Ý™Á©…Fkl¢ø#C1TsH¾E¢oÂȾ Õù|îjÊêwŒE&2ù¼XhzL…¦`hlÎÜj¹áÎ:hÆ”ª¯e¡™ÍKÝù¨Úüöuç~C‘߆j¦2œà;ÛD楗º)Qó»/™â£4"‡Á©¶ñ!ž?±qw—OñdýùÍYDv›*&r.^˜ ï—Öñ°øeM©sÙ°³à(ذƒTâŽìÃÌøÖó†S¦ÅÒ´ËubåRr×@ÞTÁI~G@ˆoÝóo ñe9ƒM„RXø 3Ì.Išý¼ÇR>.¤æ×xuÐÊ• Þ±ä½í"5Ž ;VÀMâ›FiÇBSô,Ô‹?ÿ<çà³IѨg–†Þ;­p‡@Û°ÁHÅr—²ÿÙ€£.CýírÅì#¹faë…Äm,”°K¥ŸE}> OšN^àå¨ä+;Ù:ó¡T £1r.Xð€pS®?îxŸÊámbŒˆ¥møaž›Ý4&>7†·%VbØ?çÞÅðçDOi¯2=Õ m·G³’Y¡d9Å»øÚzG T ”<(ÎTE~ ÊôkéÙŸªußoGªz›Éo.¸äÇþý fq»K–ö]R7áÖÚ!#,ð|^ÿæðEo8%c å‹vL ÆÛepów—,Ã-W¾‚®‡txn¢Àj;l€cU¹©l°rAŒÖA±ô†‚C0¢ç³ü,“‚Š+`bü÷þS¿­rÕªûÙ¡Ô*0×!ޏ ú0(ÍÀíoÉ#Û†˜ÅcK€®üÂKw±íT^´¶ ~wqºsÅRÄfYR{%&°ˆavq}È6+ÌvÙIÄ vÔiÄŽsQýóò¨]¯K¨¿I h'pÍJš©¥>ŸQ¯´Ì} ­â'BQmÑúâw¦©ËXóhýí”®"¦‘Í47”…#Ø9†Ü»Ü9ÇP‡p}}É…Õ|™gÞ¦@êýu¾=‚²ÜºC±Ð]2l*˜ Mïq÷6åBµçÉ¥;¹ò0nžÎ:ê·ÚõúÚ»(º­}¾K^AÌ©DaS§ÏHp-Ê5«‚„¹ãE´Õ_s’ló6ÛKÔ¨o‚çÛ41²“ëÅ„ÛüÜqš®R¤8ÀéèS2ÙáVŠdî®r7ÂxÒ }>ÿM­½’e¥XÛæ{)Þ(æ¥TîF½T}ÖZ KŒˆwð½ý¦°K‘.Ü"|‰W¹ýZjœÃÔ%†¥N;ÈJF…©¶Xh#2f»¿˜ï·† »Ôÿw°ZD1–“Z¼èxMß·áØ ¾} lE˜–»ªê}›&ÐzÏç§-ÑȦ=WŒ×á?¬'þ³«¶¾çj†—¾"ÞJPÆQê•ÄÁ¬‹‚(f“ÁÜÕåVÛd/X«* vmÎ`®õî«ýÊqˆ_eHÙe[Šrl‘ñm¸^¬í©Îq‘iÍÚÈÚéVÇÙ±öEëšVјþÙWÅ-/:֣ĥÐ?oúÛ©oµ?¿¼×ÚÚÒP»=µë)ÊØ¼ïž=ܵL8ˆ°¹++Ü3ª/x>+y¹«Á;‚뻎“¼ÜÁž Xê.ÊŒîàÚ¦y ؈z˜ - @cç‡ëº?Dzoš(ÚJ$4Ö»çs¼– Ñ®DK[]#)r 1è‹–çìvðÔÍ)2… ©ÈÑ:zʸ¦™.SMǯÎw•KzÖôÈ·fòül‘i ¾MnqÊvÅ „#†jnz}f—BzQ ýú‰zÐ]µÕÝɬ–(׋*¥xâ}þ>¥é}Цn‘°ö/Ùsá:k{”dý‰Út¨ˆôvŨoDô9Å2§9¤òþMEŸ+ qÛ¶ÊÊœnìzŸŠòg¯åä^VoUµî² ØX@²¶Ç§/òÇåVÉÀ®FßGȨnÆFçÐr¸½PÈ”é†ÛÖëÍ(ú®ÉzÝš‹Ú5¢´j³2½\ò%€8Àªwµ ƒJ}Ö?¢«ø¯Õ"¼S—#„K Â+™"µ:X7ý­æ_¼ôÆöG¤WU»iÿ;‹I¥v¹QYî"/QçìæÐæ6ÑK2r7LôoÊ>VK¾rлIi7+‹> ß ¤ ‹La$7J3ÎŒßì8‡ ˆ¸ÂÌAø¤ûSŽÏçtU#¿âˆñf‹xNvEG· f¶‚ê C½ÊdwšíÒ÷]F´'ûŸWÜ”ž®»ˆÜ¼8J²ü6H´)áßí•vV6îM¥»öÓýuM¬ª(óŸŸ2*«Yl“»ÈMjÊîf´`Œà†nFÅ3»ÝMkq B„Ý §0ØÊõÉ/ù™¹øM!7à’ÃÍ€‚jÿ±…ÜÒ†·„Õ¬µh¸Û»©&b6íìAYj¦h×gJ5Élœ6¨ŸE‚ê¶´ÀvU¨k›”Õ§Ò/›rI7í¦¤ànÝ<˜:Õé-m>=¸í6¥Ì½Û ®iëX›œ%–!ÔÖ DŒgì÷L a˜}‡4{ØôóÚÌ!pž U7ÕKlbjdìw;1a…w+Cøª^0DÀœY#Ëv6u…›ÎÅämZ3o' 4ÔÿÖ,UYüŠà•¾¸ß~cc´0åà‹ ”¨B‡îÐhÓ(ë9¯¦WÀºû¡Œ¬a˜ïHçïX7¬0Å*æ™Y[—Å”nÝG–ë µCxTqΆ&nóÈ­‡º¶MS¦˜Rt7LTm>m±ÂËl<»Y’—>R-€+’Ç›-ö[°!KÚ-‰Òtj½‰lùBä¶¶£O¬ý‰êÆ~gTƆô¨þk7vHƒ•d•4p¢Ï9ª5â÷p _l¨¶ù1+l=š|k˜„ýòÛt|ÒíÌ$DÖÏÿˆ‹L‰´hê`î¶OVt7ï=O´Gó7ÓÐÛ¬ÞŸüB#ƒ´°žÏø¹2þ€9í \ÐÀ$¦5žÛ8^!d¿ŒØó‡è¹ð ±:8¡çÔ©È{>¿Ät÷íMŒjI´Œï…â"ÛŠÒm3ä2,Ðçr&ªE”Â,èøŽˆlû9%MBÞŠ8ÿë#wj2¥vËN[ôéì‘}èu¼=r†·¶¹ð$Nø˜ tCŒ¥]ÏG94¦š ÍŽg#ƒç¦kl <'X¹ }‚)¾Yüï9À¿{€Uø0ª«JKî6éóÚÃIúy¹38bÙ"­v£™ .Èãàf< jÍ‘áÝ ‘LRöQIê9'"ÇÆ9»܇‘½Ægí…#×½^Ò¹Ò+7R…æfZ÷líH_‹šæÖ›×¶™5’ûiý«ü¾‡`¤f›„9ât[Ÿ`1£RõÑ›júËê]<ãç*Z^]goP›aÛ™ `ÿØßÝEÛp–àÖŠ›:¬ãëÑ <[ß’uÙo>H:"ÍMoõ,öÊlhgÈ,ކç5Œâ|N|éM¿Žú0)vE1½dd2vNþ¾s×pÌ6W ?î‚Ñ·ö¼ É‘ë§66¾HìTÿÀ_ø‹±M<Ÿ) t"ÉEì¥NÛ5§øt»²"̹ç3‘â7‰û\yJq›XÂ+)v¼Ür‘ v&`„{à(&댆ñÓ=0¯ E‰ õÌãªÅŒï&.¦™©½³ZW‰jݦБGá” öèÍ,Ð ªèí8"Žѱ ,(‰‘“E-¨,éArõõ+?¼a„ùF2OÝxÖaªýöïÁNGò‚Pæ =Õzš·ËñnÝäv¦1rзÏeä­æ»iŒ—-ôùüa4>ÂI›Ž:lifµ+3A{8Ø‚߉Ò«#E8rqð„îa½ûØ®Æ .°Âór^Æu¶:½H'>FÔ7ü»ð¤)àWÂm•à=ÿœ_„ãÔÌÌó€„ú<„j*ÂÕ—öÛrv;8[p¦Çw·ÓêÍ;%fε–«îžZ|}|yÎc¹g>g‰<+ñˆãç¼@ ÃFç>6‹{ÝpÝE‚Å]ëñs‚,1¿´cœí Œ —;ˆ#6ü/îïb½6~j^X²¡RRúƒgß÷[/~*ð6B# ™>Ÿµ™Ê;ªPöDp¥¯†¢"| ÓtOï°r‹*HäL›-{‰™& €èÔXŸ[} Üä.`€ó¬ƒ!Á}ì—”ø Ý8Q­ÝV$ÊZyûsÓŽÂÕ$̧A&zR{’Äóœ;+À(]DññœÃ  .£")°ÕI³¨êbÇŸ£Ÿµ®oYáBH’ûAÆöEqš1 íI~pV Ù˜u“âÑÉqj‘¥.š2i{ÚÙ“Î<Û¯jü3è’õ‹Î‡ƒ4n8huªw¼°Œ'æl.D÷'ÎÞÔú_¨üœbŸNºƒ›æ9Ç>1>£p4Þ'B/ʺA‰U]*ÕÞöe‡Þ£¶¸Œ«.ûnæðÛ9½G ­ôÅ74ýœË)ór¯—M\=ØÌ %ÐTlÈÉôŸòúf}U†dáJ"¨óà-\°§R‡¢_ÚAmI˜È8"Ó4ja@“ÚŠ®•ÞÉjýØQŠé>Da"§¹ô~ðŒ–æj˜Ð¶Ž •xÄ\ÁÌ£ âœ2“ uO¸L#.4õ²•@è!ÒhÝÚP &šw=l– ± ²,«Dña€¹õ® ~™@Í‘ZU¥wñ ]KÕóÒŠ€Q- œ:sçB:¯…e!…àëŒúrôRå8Ö… cÌ¡©JOoÚ8° òžw®}D?Á­Ã, õ8¹«KÖIÛ–i&SÏñü™eÙÑа&{dŽÁ¹²©õÌD„Ù è;ÂG‹½UwÚ¦5ˆ›ïþõ0]ÛÿbÞ§ŽS„Bàï €oføsn¯£–a>C‹—ƒ;¼Ï¼ÂDð~oiožéS.»n&©ó)s$wrh°ÔäÙ ,‰ísJ¾ÌDâÚËŽD**RÚËŽ¬:*ÉyÎÝ é[÷16JfE,F¨8,1¿8õü2k¿XVêt6ƒƒï’oÒK;»BiRØI £¦×ñ³1ç¸-Óu ´O‚yÑ=ÞF#H³Wõ­©6 dÌbçÃ…®7§ÊO¤ò2¯¦Ó {½TÙ ê=•a0‘§]˜™ÐÀ.\RŠ«äZb®T¹n1X‹:ù A Ôe¡xëþ>Kêc»Æ[ó[ÝÕK… .ÊÐÀ^4ÇÞpÜt'ŒöĸRÚ]§Ñ®·¸ô#í…—ÀÕñ×ÕêûuZ@V¼bùû{ 5ý ¯ØœiŽvF”²+3—e˜uF|Ȉ¾¬Á°F®P8«5<¬s›]ÃcZQ‰Þ4;_δ-&˜?k Sm‡¿ÔÎ~øÿ‰“Mtï^–¬ZiŠò¿è{ÙA2zÝ‚Ñdã ¨T¼×%›RUº…´#a²ÅûN}¨ðzÕ‘ö¥Ûy hˆÜ½Q†$T(ש):öúù £ÛE|{‰.t¯TØŠGZÇ©] ‚dߊê™ë­âÓ`‚Ái›‘A9§D–ëâï°Èý19',ò2—+–c¿ÏÀ¬ ótÝÆ¯ÅhêÀfÄ7|1Õº¬Šž˜ÏÕy! 8HOO?Ó¸YYŠ lMëBD=pØ¥ìIµXÞ@ïó¥FÃð)Ù‰ä• âÜ7<\Ù‰W&^™œ¹‹ù7= íi²6L¿^^lFƒ¸¿Ëº„²$¸¹ÜÃï>L¯ÏFrO5æ.¿¥õùþ˜'@Ž­îWEü[>óiwwÜ}çbg‡Ç¬q|›_Õu¸°—I,PRíýÐóÅÕ9ÑO»¸"ÕŒËÃL˜.' 8¼ÍѸIÉâê šø—(äÍI%ùŒfvÐL|mcÕX˸WilcGvp6" «³Y¦^~çÓúYÛíobXtýf¹Üy€‹“…n„K¦ >ÎÖ·Ã.$FtéðÜï3?µ‘§w×ÁüÄ:#29Á‡N+QñàóUüs=£*ã_`öÊU^Bª\1™Ê{+ÓÇÆ6jz­FÛƒl¼²ÒT§Ús¤çDï¬ò.Vµâ—®@ĥⳠcl6Õ¹/†ZðÓü5ÅÛžßÖó0¡x-.*Ô¨–ûêÐWà‚b}-&æoŒk•îŠ $ ‘ÀÁ™;À}<ïâQrAîHÀÅe¹cñ¼Å¿å¯siq0ü.p/žüž/ØTÉÿä)^´$³g;uœÏfvs_Þ'â*üºmðË?ë\ååןIÇÛì,¼;¡Õô r ¶)9ïÉ8¶§ƒÜR±Ç2l†‘¿¶A´Ù+w°Uë‹æºé2Øê•­N fý÷¹4 Í&ú=V5÷:pŒ8±Á R èh¢a]¾ –¥«Oj%2\¾+|Áz±JVõ‡¸¢Ÿƒâ~…>ðî—îURÙêà”!;b ^IÒrËöPT1_Ê6LÚaãw-–˜°šýBnTDð(ˆü* ¸O~#ÚtÒg±â×B ~•«T•å§.£R«p¼Oü‘šÝVsu¨ªçˆM4ÇÁtŸ%—_Z ÉJäªZz‚'vÍ1hÇÁ*ÅÑ©—ÜÆ5"‡Áç‹Îý±¶SyhBŠ8G ­rÁ‰ú 0ô :èMmCÐâ(‡Âuj—+ päþrãœ]Õ[,ä:⬈ò¹ëuE4´×jß°ÿï`41޶ìj‰i¶ªp±"xÿ3 Êþjš/µ³P‡#ªÞ8°?RÍS~s–û._ò¬ç<Ê_¤/_4þ Ë«¦ {¿8ÙßVL®ú  ÷=åCG_ã€ðÕ4QêÀ@¨!U…ìø!5šðê]"Óø\JJVx¦ žœ’ZŠõ«ÃòóW¾c.ýÞd}‡Ñ&'Ùôú9ϸÅszp¾yN¯w¿U$öâ‡B7TŸÿ¦ÕB|âð(G§Ñ,BÁ„wª5Gfa´·|Rg*¬S‹UVÍ;i\\2BªwU³ëTíå0qe"8¦NúÅ ¼ÔŸ·~Ÿ½æ ½ÎÂvFBØéO $ø±õ¥ô]KŽÙ!ê}:.·ÔšòMW½?Ü.ÂIƒä¼eŸDyÉí!:XHòºãÃ?ID5Äêã@â ¡h™|>‹¤¾9†ÖGåBÌüé¨-v2~uŸUr{•ç‘í8ÈUr;!Ä%¹J:½»9{'óT;ŽFôßwYÜõ›£h8ÎÓ‘ªˆ(±-„gª1]=#¤¢¿¹µ‘Lñ¦*XJ qõǤo3•"ÄÁýÙFôe¢&RW¯1ùZ*™^°ëdÙ¾¬òŽŠ‰©Î pÕÓyGÝ‘ìµÑߨü|¢ç›#ï7îùF‘Å^| ‚#ÆEd×ÄY®ˆëŸ#MüsP×ù¯V¿òWE5ú˽å±$Ë¢U,y¨p²·2}z*Í‹%Ït§`<.Í•²'Þ®ž—Ê™êœ} @‚^Õß#5+›§9TlHþ59éðÌ=UlWROO 8½Öڻ‰?çÄ”úŠ6kci‡Ã‹qš>‹•ã¼ze¸MH¦"±*‘áÔq=êªL9qI»/Ÿ–µÊj°ÐDqÇSóÓÛדq^¨À›“;(B\eÊ0ß6˜Ø %¸¢Û~ÕU«R<öF*ir[oWšäë9=’óÅn1d;ÙèáFõÊ:Ý [³&øÐkŠ¢ÉòvÜlYµ‘ؘVŒ©YÀú¡[•—3"¢š*³¦Ó!TÚàm¥¸tµ\ÊÕdy§x›2´K¶Ëýl¬7WWjãhÓSTky;ós@ÖÇ æÈ„IÚMâ ®©÷õ¿¦Tãõu Ŷ>¬Ò2Çë”æ!vìŶõïŠ~-(>âsÀ$=Wá+Þ›eâ,¼é‘QeßLnÜ©NæWN®`A“ýêüØø¢&8—“†ÎësµAB78lÊ‘‰£çð­z´Ø4ÐM¾êuʯãkÓ?€'ÁVÊ XϤŒ™rÎÍ_á4aJ®œ=ì­KÖmóßîóä0•Ç)¹žC©·K]tŒr¢wål?«IÑ×dtŽ?§RæTõEóF¡'>L^´‰2ÍI›ØuäC>>°z¸RéyNvFâ‡ý¢×aìiEÉ”®mÃ|\I Mnîý`(Â@)|s~bŸ$ ]¡+Ô’Äù:‰ =to/( 9§"CÁŒ8C~°œhA„Â4Ú"Ñ"èÇRާ eÿ7Vöéß™dÖ\ÄKWþücΈ€Hâ)€‘|h¥ÕjxV˜¨äp5¨Ì7÷Ø OŠBðúÂZu®´š|Å]dç¶ò=VR$’ bç•9Ó)“µƒgΊI$ŠDù6a-ÚE‰"wY£Ý ¥²Ò^\*«€¥nžøÔKã¤ã{ßg.[3åæ\°¿ÇBEñP,iwTFp(:ºVåJŒ×'mŽ n:pͨuÞZûËeíc“G:>ÃZ¼ZVôг´0 û‡rŒÓõ-M®ýα{räV®_V#†gŽs“d=ô_ïŸþ9 r 7ýÄøX4â¤ÿók¤ ’k9q«ÛÄõù*pщg5¢Ž ‘ê‚êYSÈ[Í…¶'NæâØYj‹7žH5ûs0ÎÈÕ®ÈV>¯ýØnÏQI„V™¿9>Óaâ BæÓ´¿b[¤Û4¾ïhwÚ5$!býg23hNÉ\Caò…”y\¨½<ÄÍâÞ\ÍBÕº»šZ‘¡·nG¾Ÿlþrÿÿöš¢-gD]cøv;;ò9 ”襷´ZÅÇɆ£$ùö#æfꔫ›E^öqwê³ßÆ!r…×ÉȾµaz›¥…ÀB€¡¤¶H•\êÚoqõöe›W™(à X²¾µÉйëB;4†LäqvÝÍн¹Ö›:ü¾u³§GëbübÐi½¸ñ5_U„Ë[" ¸½ø®ì´¯l³wDó!TÿÅ–ëµÏ‹W›­Ù‡c#ÅêRh×íÍÐÌú¬ôM>޵ߪ}Ž" 1ÒT˜|äm«)Ñ”E&®>ì#q@ÐÛ8²~Ѿí®N²^,ÛïÎEjš8ÌFå<×µ\+×í2\Ûª€ôö)‹ £¶¥®ù¥Št¶g¾¹ÖEØó|1ïö‰Œæ'hÓŠÕe0P£½ßã]íEßP¶ƒkýxÛMÆÝM¤Ó»CÄ™{:°õ±Î4d¢*^€NÖ.Sqt/@Ð#µ¸ä~7Iqa'Â+£E-×›H0¬ŸwìO™ç°™µâH+ºˆ¬›0#`›=áÃà ½C@3ÆÄ«¤ä° Al‚¸Xss{ ‚ö–ÿjÚKÅo§úƒÚ}c|ƒy1.ͤ†µéð5¼A•<*s/D©2o¼QÄœ#0)`9ŒI Äò(LÄéÜøH­škLÊyµŠ ya>XdÀ.JÏ#™h«k0eØãË­¸T%Êì"ÎYéj^–Ñ,²'½óÇ•™ãðË&ýéâ<}º€qƒS`s¹9î+;Ç€BAoKAÅtRƒ*5´ðr\üº§fÇ " "ãm¹ã:K{bP Ežt)cЛ/î/ñé³lÙâYã~×Ri\{4P6Ø­8PH®»ì¼Zžý‡O¥·we©Vÿe,4×Yxˆr¡Ú3„LšL ÷PzŒ+2‘ØÚéïבtâÛƒKÔdRa“U¦rŒóv«jg[ïP¶H½ù>ý}ìy±ÔLÊBÇ!r©Ùvwœª˜~C¼‰l›×á“©·’„Q…çÂÉ©éÐÊLI¿Zê÷=žÆdˆF(w8=Ûb]åö½r튢[=“ n5×6e|KÅ¥g]M2´&È ç6xݹ{Í):ëA¯G‚ÒÄû¡¡¸ä£ZU•°ãIœ ïU¬I¾q?7v³ANu-w³Úȇ3zÖŠå²ðú:jœ¦ DÉKÀ,4ÖuªÃî‘Öñ4u¾pAÖ z 'x# HšÐ“I‹ÁY **›f5?J†$/¸‰’ù¦ÜŠD ¸Oo-Ç7·;±bRòFÍÄMØš˜"¬%Sûlͤšˆ”`R!· k\ à\{ìô;©Ë•Êw|‘¤TgÑ¿:ô0PoóF„fS?Å£<Ø`'J»Ý ì~DOÔëør}‹àÒ×PTžXCî×>]<ÜþQÞÍq"R]ÄÜVÖäLgõ=#mCîÏáâ«û° ¤ÚcäÄ‹×vØŽdßçvÔmlv#M¥rká›ÎÒN䤨ffi¡Tª~¤ÌÒÂçÔIM’´ `Ö”ÉÕ¥ þBw‚ý.ØŠÞªy¤±fyá”WÒÅÅ ÑÇs¯¤TÔòȰ)ËxÖúçËJ÷ÞåW‰¨Ný™ »’æôzñ™Õl×Q¬Òû…Û5ýªšh«¸ªZWò{ Q. ³22á}{\6rÎ×e¯ Š#ƒS§AÆð•͸sÁÑV?¼MÜÿ–ì[¤óͨ̕+‚ :MXüNjÂÔDd‰ÌÝÞY²™%¯ÌÈtÔDš4q?Õ#Í[,„EKQñiv?ínñ{ …çmÏìä6ìY›Wˆ-eÁ³ê¦DxÅåkCw¿.ó×ÊZCÞ$HêOÃݯPšÉó»‚æˆ!Ÿº1\»È OÁ8¡² ?<)ˆk¬ë#à' d2?ìOc¥ÐÓ…TGAÂí)›:Ó&RQ¿]ù|ûXHq0}s»/ÜŸ±’nEw&ª ypzªTÚM:…c Ož!AËE®äfÚ‰´¯9àlr4éBn›‘çÞc9ª cR¿ÇX ‡‚ˆiô‹ï‘C3Ï箲`þ(áû›PájEȯöCÙk8Fœga‘üö-}í|!Ž*à³BôÏÏET  @ö œè6´(6ê–ÄQª0¶Ñ(\Ÿ÷?š«|sgi@öËM¹y):莗@Ê4—FbTæºûUKs#×sJÙ A§‘,Ôtý§B¶Óȸ‰êå;Q`š §Jªäü¯dãZÉd|ŒÙ5.ßÈ9Suü F⊯¥h‘ ’îvR\P²&ÁÁü‘JˆëÙ’+Iû­å¹^œvï^ÿ׉OGhVnu8,B¬³N†âü3¤Ùmáç©B1˜æ¡{6wFœ;ýîoÍ·øÔ þÊ‘…ë]n‚oo¨òÊË%=æ[ºX§5·y˯’Óo‹RÞ‡ô¦ŒúùêròCo §G‡: ù–1ƒÑ;q|®éË”:¨“â_Ðß¼›e‡|9ÙµXL—Kèœv±d›œª¾¥•ݬzc½}ø!YˆïàOicp¼òm§²r'y\ËHe!Œ™4¡òÃ{óºÝ÷7,7'UÉ ÿ,ˆ#t(²ê­ÝqiÓ=Èøoât¦ÏoonÒüU\G¶æHÝ|ÁËå>ã*AQp5‰(Ð6÷íMUr¹™"ɸ¥~k‘Š'/©—+9,@'“Ø:¨¯Ñövg?§× ¾>BÃOåÚ}Â4]¼ÈÛ€B3ÂG\2 )·r¹›ÚÙ+{€.h×8cß1cˆžíTìáegk·_„mÍî´– %è/h\»mÞPØ]HÛBO _PJnÄYÙð¡ÓÔ\éÉjWÐΚö¢ ©´,]Û8dçoFOz²£åc/ 9&˜½D–ÕïZSÐU¦{"bä WÍÀû¶Æçe¹UÉ™œò÷Úœ;Ü'JDOº¡uQ´ïeH DSƒ8p°ÑEDÞ‰‘nHïãm³”Ç¢¢ÿ ² G̰x¢ºÛߟC0Õ‰“ª8è̬ù¾ÓôÝ÷‡@:`ý i`K¶›ôdãzѸW8·bšÖ¡¥îìŽþž6jõíÑoïuÓŒœÃlâ}óòi»©å–(îÎ“Š‰_úˆ§ÉØRuKšº˜éžW!é²îÈÆ>;ïöλÏλ!1ê¨[kÇR¤ž¶É·f’%ÀÊß”IA\<Ñt§£>újÖ`‹k5Wµ—ýÿ¾Ã;Ø_ÜcŠïŽÀÅÙE›xõâÚùš®[#ì3¶a†žIpDÉÔ[6é.ŸÞÿFxu<¥AO›Tå²O¶õ]Ø+lIÄR’µ”ý}AxŸš‹á¹M}Hëa±Vó Ì\§¶'…sþN´X§éãÃôà`“R—˜¢hž–Di+_5ÜÛÒæÍ“GtÕ³-¦@MóÏ¥Ù º—~„u«@UbUƒE»À?]nÁë8Å;•nÁDàYqÇè§~Bü3úïÄS¥Ì­IŽN¢ÿ¥*:\±|&Ba§i¦Ež<*%ÜeÈÿ­a…F ð_–öbŒ•žù·ÙŽ+àaø#PÌ%MvPi²ƒ!ÀÌ#ÁìMÔ¼só Á=µÚ̃­ƒ Dfl’øüÖÀ‹)놙~0©ò)†G¶v¡Dû÷7ƒógs/˜]¼ksDƒï/Ç[w£¨oi‹kA+tÚ°hÃxœ‘õ9!–SnS­ ¦"‘ë¼–5ö‰L˜*¨\ó<éô\œß‘DªÖl¢ÔYFŠö õÖoOÅ,þÚœ5ÂØÌBBÆËú“ÓY÷ø}Ë\'|uFB~ sâš ùÐÓ{æ‰ü$®éÜ|}ÎòðfGžÒ8ÈámâC–Ô•Ã[¶’êKúøoòP$é9 gfM¬¤H„hÉ}Þ žø,ÈýÇÏTbñ¬¨²™bwÏný«$p®2ßTÁŠnM 96Ê=óN§~ˆ`/ðËoævf}¤¬\§î§°Ø¶¯+dû®A(6ªû“‘´q¥Ë ½˜œ ¿/&˜ìõÍâêŸõ±Xé`j»s²}â$CÄY#Z ;ù‰ÜpoY8er›…ùÈ(|V ÔV‹ë4”пµI…Ðü»<Õ)Œ*ñ?ýŠB©ÚÅÄßÊûŽH¢Ÿƒì¬rŒ¿ÓiŠ޳ÃÙ¢¯Z—‚ªhžtæ€îötèU>ÃR âPù$‰ /+¥æw0æþÀ«óÎØRýdSº~Ôª™©Å:Éü9©¢ˆHw´©ˆìë%qRbGOV`4‰2r_‰k€^¾bub¯A”Î+{q…OÐ ©Ï„·bV—ÖRoÊ&º*if®@‘€ÿóa¤ bñ³@àÆ¥¸–¥q.ùi‡–ê ìž&†˜ïŽ’uJ&W5c·FñâN͘âÀâ}7G鋱ÈÒ¬ö@ÿ)«,&‚*%9,J²@½¢æ%( 4ì(%ŠõÆõš€±–Ç›ä¦jg(çåhl÷ý:މ+ÁCSªR’®¸¡¢¢‘±7Ÿ˜Qnì–Ží–"¶ø×E͹ñÁÒ^_=ÏÈx‘7©¬|ž˜OnŒùZ°£×§m¼—ký,w޲r©±–ÄìÜ™ž//“jp´Ü©W§›=O7Ííw0 ¿jÇ#¶~Âqö%Nºd˜˜ýˆ]ùi¯7/W`rªžMË«+K¼ŠpJY`Í´ù¨¥ŒaVã\–ߥsÝŸålaÀ=¶¤Eb$¼‹Šý¯8©¬@øÐTØ•„kgaÕ¸¬}úêþòÓeòó9íNÙ]o©ZÏrûñn€ÚK£âvŸßgÜßÙçhË|Üj}™½ËhŒÈÔ€ÖJKŸž¯ÀQ6xâ¬õµ!Ea*ÅÍuäUa“À 4krűI§’¬úý/ÌŸXq…’á«øÌÊ{–ó‹'Ý/<¢Tá‹Ï‚æ¬Q© /î‹ p¨k¿%]_ªeÜž§œC±Ô F”Ob½˜þ)6³ ËRYûp² {Ã}^j‡R©í)ÐD].æ~г¹òT|SÇì#ð]Íøì¼‡ô©Œå)õ¬E&€JLQ¨Yý•^tP˜L*ª ìORЊ†ŽÙŸ‚Ý)öëd*f€ù³Î¯r"¢z*ôƒôÿ\À²^ +xôÈø:¬"þ9ïLÌNµjÆÜgýðÖ¹µ[\ß(ýsàñO”¶¾ØÆ=Þ+˜Ktm¨õZyÞ E*Å׈^âpŧyà ´)6øªì¯5´F+³Ó1SÊɤÁA—:ŽvýÍG‚ñ©à€”P_.&ëp0FF“8 ¼M߈ÕŽ‹¾nÌ^Z”­£Ó#èy)eÛOáC©Y>Pª·Rè †D ¢xÖ½Ü?«Jsñ·"}, <Ï¡Uó>/ µºßxQôõ³ WYûr|ê-™µçr±«*:™R/Ù+§r²¨}ž±Wµ“êOA¾SlÏT®²ÁÛ“õ¡ˆ"/¨‡|Ju7·wœjM‚¢G°Z›lOApý7qÄ%Ùž TY[äµ¥R.«Ž†·%—!UùX2™aalÂÙr3‡èø¥ MÑ™"•å›PqÒ”eÕVEW£P,4qUô(‚H7¸.ô¹–½?ì— <ç4°ÉêòtWÔ.¾µ_gðט¨·ëqzÀa”ÔôòMV¶íiÐÌ¡l;ø ƒsßdO.•“Ùÿ7NñÐ$ k*©Ó’7’P›L›³?qj(*§B-.aµ¶œ áÈËå°ØLr—šàd-Hð—š,ü\¿î*„ éÇ—¸š õ¹”pvå&–<¸þÚ&6»íÅG€\Ág¾ºßjÞ\+ô[qÝvå…—v+Ò)Œ€`¢jþ±™w›\c†™…%KP¼zFrƒžÜ‘Ò¹k Q³àëQšvm ÅJspNT7g‰Ú~•õV&:á|ÓtZ2ŽÃÈ+k[jŠ›‚,ŒÉL,v£Û‘·oH¨RÁÑV¾2gˆý€ŠªYƒþÊßãè?o»àš¡¬~¼‰A:E)S¡Ðo¥³=?Á6$Ë¥oJ\ ¤PŽrCqJ6ö&Iµî-WÝ_Å#Õ¨möc:¬Ý÷[‹B)yHêœnß~ÞO²”–$Id3IwÜò-–•ªâ ¨xJßK4~‰Š 5 °¿Ö<©a’Xœõ¢êªâ©i©šãáµØ¿‰}›„Q1PõaæÖûÓýŽk·4¢ÏþMå×vС˜dµ ¤K€ üPGßhF  ·Œ¯4ïÃ6´+#¶Ÿ¼òøRÉýú™û EŠ rü¢—mÐì®Â#UäT•¦©t›Éâƒåž'Êä,ûs)`[ù™Í»pûЇ\ŸßOÁhÁã÷çÀÅ5KÄHùyH²/EöÑs0Eû´RJr4ˆê±èƒñâdþ‹ÁMr¶$sSoþ«ò׬&àªv…šüÿPn2/Ð  ˆËÒO8TЕ§égÈ8yÿ¼ÐQ×MÃŽ„lsf¶|¡Ä2ÊèNVo¼ ž¯(d?„ÿ5Œ‰fȨ¸ˆ+üêfŸð¦’EVÕJ=`@ýâ•Fw÷:Gªsû!([Ás Dm>¾éËžÓYKƒ~*c¢uë˽¯Þ\êòˆIºV{ñ*¶$†è÷N¨ÃüPn)®r>„`Þ\¬$Ö穇­-1Zî.Õç “[1»‹œìXN+ok_%a²ôyee¸ª·-fm¿ Ÿ£{û…Jj4™]¾í‰ÃþU\…¬…2ÀËÜ‚¥[¼ q÷AšþT”BO|4~‚W‡ñIÜe[ÿ –A4Qp¬§µûYM&†`^qÖq…AáøZ!ŦPü,ÈG:®Þ?lõÞ/J÷{ßÕ.aÏš”Ò©—=õ8÷Þa’â¬Èè‘7KˆVÊôëBˆ†É§%”:€X?’ÄJ¯fu®IT¡ª„O.°Mœ¦& X`&• Yð¢Ùëo¥oæØºuZ»˜}äÿõ“Íž,«&V™²Ý!âÎ…#='=Ø¡¬‚€1uÔäb†Ùžº7äc}¹—QÜÊõ9PdpòX±7 &ó€ Aè Dƒãâ—L©t»¸€ûÍìÝ%஢˻޶bA½Ódîý°§Æ£‰hµ±3 uôSøÐC9ÜÑá4.°7Qn-Rú·V€Ôhê`¼öWݺmŒÛf uçi‡‡~Ož³“N¸µ]+ èâKBÐÉLQÐí,@·hÏÍUà| fs6iÞ$43Ï¡cJ–ÇuÓØý „[£2ÙØ—˜(¤µ¨/|¶o’­U÷Cë E9äw½ç[r.5U)}uV£À ÕðÁzÙϪÞa¨(ÐOMÒÍP2àÚüõй¬Q¿ÑÄÒ /TE·’Íû%Já`Œç2¥wM›ÖÇ}ïÊBßÔ•*FòlP=׬2®®!~.^ŸuÖþn²|iƒè Y3¹Á3(¦ ï^Yé\`rê‘׃úçGm@Vî¨OÍX=Hn=P|)ïäW­&Üù8Ê—¯Ì‘»ùΑï$~W´:r Ì¡«¶CÍD†I%5 .´²ùMo|Vù°¥¤²©Fn‚6JÂ¸Ž‰`ßÝb(‘Ï–•Àˆ6Ï%@ž=/Dî}ﳓm/?;÷Œq]¯Æê¨û˜e4–Yä©u¢Syþ*ÝO°@(EzZk;[mQæf¸|¶Œcð sÕ]†íˆÑÌõ,á֥ʔ‡ %©¢ÜwZ.'^Ê»ÀV¼£QÎO¯üÃdìÚEÅm•WiÐn ±nŸ,aŽÅLa‘UØt¶ôDšf <ۨ؉ƒûÏËs·¿Þï}µÉý@ógZÎ@E¡ã !ª94 9~~ ¹Q¾±³ENlÊt ~V„礿ÁÍæYs†|Ù ‰ bJV#â*áè,ÕWÝ¿ë›Í/¼šiBf9~ΚegèlýÎTS*XHÓSN¨ #G,=A£½š%òµÆI¿×Ò ŒmêÅa€á”A+ù£A_±uš= ŸTëg £J®e€Æè® ×kÐÎû¬êZ¸nEÂ}†×ð4¸OƒÆIÄo¼æŽD¹ñBFõLo.ñòcF-q$Äi/þÒùûÄDÇ‹De걂ßÞ¥’ÏžÖçD‹ÒEì3:|\Æ€.J&]ćûüîpfŒÕïwuÿƒp޶âZH؆Øñt¬œ rŠ™‚ªì3. ðÇ¥.ËXÐ;•a­)ðB}« …õ”_ôB6q2 i».¼P–ä…*ðB͉ÝJÀ©Ë `yƒ ¸“Ñ crbZ`ƒÊ‡_.-칌¨ŠòÏQVÇEóýÝóŒ‡Âf‚¶ªxródèŒÚ 4 Å"ÓÒ§Wþ|taÓT· I"m§¢ÿiÐG,I¬›5òe‡\Ø¥l®D˜Ž“)0 +÷mG}^’8`tX…46°è¸ûV®"0[ÔÂWO–”Õc ÒŒ¬ù3éJÊÑÁʬéntý¬®É¾vâ‹}|™–;üôe¨PŽű^DXjŸÜ­»û]ÄÁ²,RÇ‚Ÿ±Oé7(P½·)àoëÈŽ´'l#)F>ò§Jv³î¤v]ųÔs#y.3·åiÕÚ ßU V?ô œ–À}Ïí»YŠƒïi„îeοø%i;ã†S‘yžjžA¸ì ‘WAc5 ½«d/;ºJÓ4u°eµvU™ŠÚ‰ ø¢ MIžzB@1Ee–^P5ýêAùg•¢4H5#›Ü Ú§¡§ 6–yïÉ ¨x¸Ž’+\åMi¶óö›²Z쪯…Ô¨`úEê@jØ”‘áÉk²Ïæ—ª{Ï'¯¦WQ†Xæ G‘ håÖ,¥2°s”*çYÓcú'6eÒYéŽdg€RâiJìë@iÑ_ùÅ|Ú…-U™9Pûi{çm˜x·H08§ðPÊ™ ñËtIö)`{0VŸflùRA$äof„tRh[æ8/Ç…¶ž*N9®©Öã–hdeüÊáV2~ Ò ~Is•âqE×KVf½®³ºÔ¨ P+̆ÆÜœ\gŽæ!iĘcµº‚;²† ð˜fåWî&¹£ÊœçAåW !×*àI­õLâZÄŸ‰Ä}>m]äáU DÖêŒÂ­:AÏ Ó}jç›+×hH*…9CON9¨“Vÿ,“bg4ó‡ùbà„;TœÎ€­‡[ ø.¿¢ÒfªñŽ%uWì±uBæõW¨Å”ÑQ‹ \5„4ÉMj9ʵÚ]ò›Ÿð¬¹£Š ¥Th^æ½> –#|ŠŽ†À‹ìËœÛÍ[ì<c°? õÃ×t?so—íÌ.4O”'—ieZ©-DÜ•UVË´/ºŽ„V™GÎ \ A[‰3‘ŒàŽ(O't)—MérÑOF ¹ì É-é/þye$øÐdÓD•u<Ú£*î2yfwbÅΜuŠ«§œ¤Ï]z»²ëÓ¶Òg˜qÏæ›Ð.j |Š›ÁSåÊ•-ʉý•Ž®KWŸ¹]ÇSAa¡|h"M_”(¾Q«œŸZÍ'ñó‹ì8eyò.¸)z”Žj†;=„5³"¦Š¸÷n7aXÂŽK€äJnDöXeäUÄ–L|>/ß0'âR°Â«hgíb‰¯„ÅÑèåÊÌaÔ˜%ÙFêe¶QOi¢Aá©b~/#*+}Þ„pÆ)ƒV=ãÆavèÅà•¨ä5/m!ØÉâñŠãñ9˜ï&(#ˆØ~0(&áæí~Þ7{‰µ‹‰¢Ê:ˆ«ÕQ9CðLo¤¤L¬¶³`”‚ Ì›5KŽ®×Ý‘Ö_u¦ \m=Ë1ª,šæº ý@l´ŽÊÖyèÂcé]ÀLQú¨^'ëK=p%¶íëhÆ5ý­ ü2D|ƒeÙ÷Ƀ¼Æ5þ­$¨ðÕ6)•ÕØÑw…Æ3”UG«ÛÏ%&…iz„ñ)x\Q÷ä0÷ƒ.™žÎ«Ÿw8Q!­\ 1蟌Ým›‡*¸FýŸbK³ØÛÛp¼uÉlLÒ[ö•Áï(ÜÚäçê´L–ÞÙ¸ÆÒ7}±ãf\$8}¯3?–ã?æðÙáç_o€¿E 4Ø”ý=Œ¼Æå%qÛ¡$pIø« ^Káç 9²l\3n˜cnR@'£Å³ä ˜…wDú \'¹½Œ¶²\!1¢å.å¹’Ê0y´cªN#¡’b•uÌv ¦`w*M@³esx­x9Ë‹g”ÙÊD/Â’uß|)G’<ø[Nö²¢ííKÈDh›åO†ærzcíTÑýŒ‚Ú¿Æ3ÄE÷7LíJr[Á6|3}—•¶ár¾å*¦Ú/wî¤è¾Z—©¨û\óA8Üð$ôס+ Û/&Áô¸å6)oXå{üp™DñhÖ% _¹žRà¶êuµo¿2‡·‹&Uy6cgï$_+:`ÜÀEõ,GêsJ½ì è¦Ý´HîA²~:("Ï}ø'îó=¡˜“ŠñÝNùÖ›iaÂü¨Ž¬é¹š›€¬ÄíÈ3”TP1–ÊÉbøÉž?„N Çe¹;šð2ýì*Yª¹ÐßÖмýn»J¯Z·¢±ÀÉ®2DPXYws«¡N&Ús[þ§Æ«$R…÷¡Ì£ä½‹X¤ê¹ÄUœ—õqº4Óâ-߀ >Y¶a•rÎøÆÆ¨Øí4w3f(¾6¦í2 ÈvH<~‚n Wüô{2YÕ í¤~8LP7¨¯‚a?·Y3ùApïæK Ý3ù½Š™ “Œ0B-q*°F¡öZbxªáÃY¯qd×k%{Œ3ý¤"Íw3!Ô²€l,ÃÛls <‡É€Õs µ µ5ÓÙ¨~µÐli† Qú‘"h^½‘çcÏêæb„ÈC$Uš“CûÈu}´û>)³›u1SôœñE1ŒszâTo#c õr+7:º?Æxßgƒ Zµñ8Äw:¶ä>QbŠ(‘G3|6À{õ7rü"šµ'ø1ïH8LpM—{­Oléã{U‚dAf:®lï‚¡Cxž`—T“_3ÿ,häàœ07ÇnPØ}YøFèmºôoô,«Ž>JÅ`%›.Á%’5G÷Á!™LªÜ§PèÎB!¬nmw÷véÁ±fú2ü륥‰Ø<·—5hR‰{t¤hþZ‚êå¸d¼}üK£:ÑtÛÎ)sÛÅ¡èáE5Ä7x`ëó7z°/ø/½Ð>^)íÜÐUß!K§Ký"bˆã‚fí1_äí¨b{s…¡ÄÈm‚Õʳ®Ô¦šgu™8A(¥õ¶tKæ±v±ã/;„±Ç/ê÷ %7ö*c$7œÜÏa|rUÀ.‡ý°‰PôšäÜ‚Ì%P1¡T1Èõ.¿ˆÓ´î”0ÂÍ‚ñá“ôÌžls4.Xkö—úb×—Ë(Ö *q>ƒÁQ>§¶³àáyTCB“:JËÖö.‹KxÔÞ  rIc ÀUùP˜_˜©er¢ePµ™ûì?;U[Ϫ²6€*ê´3]ˆ†qÒºóÚ‡@ªlàûCÍA9M릷ŽpãugëØC7_%±AT±ÉÀ'•Ô‘Òj(¨¸xV‘ÍøÉe¬“,ÆíÊ!RÞb(»m©Œ@?øQ+|ÆÖä]ÔùG°í™ö€‰êùžú2K‡ €C(ÐßÌm+HÄ´ÁFòû­Å½(ÛŠàlMÙIXL˜:€Z3#vÙ:ëLnÇ@zKô#2 MX"\²õ‘¨šª‰ÊʶÀoæwà͆~ƒSÊY”7—žÙÊ>uAf÷†ùt±h~êÌ‚Q gTmŠ'€n*O±º«)U¬„¶%›Ü`¬f=î6¼šG¡°ÉrQ'•™dkdêàÔ¯0`åÝÐ#3R8ȘUïUá´eÇW¼6,——q¥{•õ»5ä¾Â=7¾üœœU@;aLE÷'Žòõ%­NôÆùªqQúQ»´Ð­80±³€h§´h„Ý=~Ñ@š¬ Èþ,à ¸€³ŒÜ3¢Û,œe£c!3².kxÒïïò ”Sà­V šFÎKR’KM©£1é$ Æa¥r¿,—%t ¶šãä‹Ìxk`*7á´Ï6x9ÖÊŠmˆO\m ¼T»‡À&.ôÀ¢Ø×Ùu ƒµÝõÛt’nÙeÝ3Éyný ÍÀÍ’8¿#öÈì°g°@ÞÅ¿&ìaNïÉX-@ þW6uð²º@ZÍd¤ÚF[J`Xu'»Ó#䑨}®‡;¿^ÅmÇ V¹^mI1œÖõ]Å%¤Ü{Þì­†ŽHŽF‘gZ€wÿà«ñ1¼í’ÕëãІr/í°è^SÇVü“ mUSJè9‹wX¯ãp]°13Ý…Rxí$Fëù®ë‰jf¸­bHßÜÓÒzöÝ\ã% Wrc“{ÄSãV¯æö“X¸¡BŠÊz©(7/š‘q‰LäÑ®"\Ü_˦´z}5–£ƒ¨N7÷áÙjô= bQÉ=ÅíÚŸvõê~m^ë4^”½uÑñ›uù2»•9U$©iJÍ+Y’ê1žãÚGºµÄLåÌC†g¨ÔOÁe½Æ÷ †ŸV)IQÔëeÚ²¹õÖÌ|๸äÕÑVæÏK²îÚþ o¯µ^ÙïãLñF%öƒ´àæÏX€—&+¬âRù¹À»UC‰œî9¨<Á0j+šß1e™rÁ$å± <¸Uâì C”u1^Õv‰Áçzõ¤U1úKZ¡×½þü‚“”øæwÎÔYvM^®!îjK’Tb ?DïQ+ÀÌŽq©ËѯWj%TÖ¥~§yïp†Uª¤ Ç‹X'…š$ÁÕ±a¹^²›Fq¤ ûNÖºé§Ïx V/5–¢e*Ýžª÷Ybï\g´\Ìø'΂¸£ê,Jmz%ž1^=Æ7Iñ|ëöOÒz6XKy‡¿õ+1•°¸ e`Æ(p‘õÚõû2„qºçŒ» z^ɾ¸¹¤ÊÁK*“gþ9™k5{§æ®¨½×öLÄy „j-Õ˺ò¡Xûœ,î:mã0uÖâZÜçÁIhjqcôÝ:44BàÍLg° Š5Foói–ùeïêYÜëJÄ6×¾V £ `~Ô$€US)8«FäRЧòV‘Aÿ²?r|qØà0 ؉j)™p-ºlý›S4o%>òØ#åo÷D«‰Åƒ1.uýeä>WÞ\ß½l…CÊæW–eZuÉ*)hÇ£Fvœú™j®zëªQÚ5Ù¦÷Ç®DGŽæÃdbÝHË>.qa¯§F—a ‰ºLßwä,B-&fÞ}ø•LÜ$¥Ñhi€}®åÖÛÐä!›[o1±AXÒ3-—?ÆnŠ/ˆªµÜ}ÃÝi¸vKŠ †"‘òãÚwíJužÔÏËÞ!ù µŠ£*ÀéÓäô«A*å+E¥óû‹¬ê´¤!¯/{– ¦ÃLŸs Þs*¼*­å#AlfŸxDRÃGŽÇ[7qµW&ƒž 0}Š'¤¬´2<ÔÇÇt+Ôõd… ™¹ôy5 c_.…ZÜÖu¼|Gù‰Ä؇ŠÃvµp·#Î<Í4œ¡ž·Ó^½gzHi ÄR‘£Ça WÉfP)øå± !/]õì3Ÿa®÷wCFÐÔ¤ÝêEupyÀ Ì*8Ãs€ÅÚ™Ÿ““ÐZ3xµ;¿IåœvݲÜÿ .±š —ªT¼ð»ì8ɺ¨t;†©Ö77B±ÚÑ~›)4“ñžÍÁÔŠ•ÛÃÞ•“¬³w{§z»úóΑ ‘¢ËŒJX ›ž„\X¡P~”Ÿ /FÐÿIÆ2­ûa e®‹ÖʆÂÒ͵0j)0Aµ€”zþU@ÔZ@wSªP@cù»Ø ø¨ÓK¢á9–»Gû'ôáÏÁíîa·þ;Ì‹ˆn'1þ Z }Šz…c‹¦T«ÑÊ ®P#GlòoÒæXjä¼LE!H·¥eX¾UŽæ*F¶i<¼h0÷‚bB¡åļ‚Å¡nÉM(’ô-´hÜž\vªÑRê«~u®#mòœÕ4¹eõVƒ¥lEMÙû‚òÅ"V2ooüI/õ,t aB/–ZÓcÛ|³TµºV:ˆ¢˜(—öÔé[‘GœúÝêGÁ=­S͵ä•nJŸ â®—¹{%Å;¦Û–p©ZG&Íž˜YïrýÙ6I[yɬ‚tÜËæÈãI?åÔª@¥*¬V­Ê+©FKäÙ–‚µÕŸ¤ñ"ªn'©î!_´—~Ò§ýö\¬F~>±ŒB)Õ®ˆ 5%æG3TÓ)Öan)&UÊSS!)‰:Â’jN©xÌTi¬õìÁµ{؃ËU*? ©~æ³çE²–aFµ:1†Úß\sˆ(ÙLUÅCVÕï;­5E]“KLF/Ÿ ©®ÈÝærÏ£åÀµfY'gd—…ІyQ¯ª®5i5}<¢\Tª©žT:ù:鸼õ[Î/ äc©ñ¶%Ùû4LR=Öˆ8 ë¬ó²Äý§Ü ͬ¸ò´3ð jÄ}¨T…všåe²Ú±¾ù’ë¯Æ€ÍèÏa9;äŒúAË@I@Æ!êngƒèlë‹w@âÅøÉ\E×xQló+̺µÚO}z¡15ø$ö·l>@\¸ãᥠüGÀ®O¢2$,y\aBò˜BAKM_*ëþPL\V–R¨ (ì-iq\ËOüö=%ß*΋ǥe7L›M/äÎî·í¨ÉlSLÓí‘RðÞ)U²† ÁªíêÞ÷ ðÃ#Q“½u+X1X ¿1 Ï5æ PStrö볓ÿ¬N† >®£ âi÷ìÊ-Ž ižpXµ Ÿ¥ÿ‚×õë‘!s¬}¹®4¯tè`y#h¹Ç¦ëÖÉ\l’//0ɸBTâ§µ«Cþ¹ì#@z!ÇoR„9çÀ^•ãÆ‚©uÄñ¨öº1ip†â[;knƒ!Ù|°íî\Ch^ÉÂTˆø*¢\ò7ÖEž¼6 ýÊæm…ÂM –ˆ”‰ÿÛÏÄÖ«!7TóVÆ‹µÈ[lc‹½éÙjƒ¡•·R#»©áØ.R_—*¤e# ‹™_w<{s—À‚!‚êÚ”´}kûc$ä®zCÆ3sØþlS^ÌZóÀˆ|NJuàTƒûf¯ H/#ïe†ºH‹WÖ±ÎvkX´EU³S›‚n E·™ótnùÄTK ¼[ˆäJˆÍ‘âféZÃ<¦ jCžñ(ºÃIzQ%ÕNýWcˆ¤tß/b$}˜ÍÖ=ú¤>;P= D¡b\ÅYÙ€nÔ•<ÿ )[@ãz‘‡ó¦¨–Òi9Ñܨª„í³ÈŽVݰÑÞe° ”,çx3ç·v oÛ´ó6¿ðÁ j*ªMÿ ¯ [µ[iœ@1d ñ–[Ú¦Ð;ê1nÔžgßÛ`ã0aIˆÑ#ª½Í¿^ƒwÄ>zËúžÚŽâd$k]$b ‚6j6^Ë%&É Yj…å‰B7UNèÁægk€kªg-wK“«„¹ÿ]¼`ªÐïÃQ³¼8Î.çåÆÂÊ×ì€rc+˜¦ŠlJÏ¥UzÏkëŸbùF©’º;À™Ÿë,ȸºÅ|öþ‡Gå³]T¡ëK&Á`ÜÚÕmÎîÞ(’9ôïú¶æåòw,OÚ§²Èð¼ñ÷_ªÒAíås±VAe„ŸÏûå¯Qa£É¹‹¢õ >åx^ûðlŠ¥äÉôiÔ5ådeÇóoÇò­L±éèè?„C„]»cs›UF¤î±…þ=c¯'8’S’Œ¡=§£ÿcÌŠ „hœ GÂØýìW;({Â[0›SU5FPo੸Þ!åP ‰µ}µ¼™A1CšU„iã¤¬ÝÆ¢à†¸Öîx™ ÅNÑ]%íÚ!ºëfU®PÁ9‘ÙítãF.*…ä •V°þá®d¶‚çÔȘڋ I›ž5jOÙû«üD—í6]°eØBè(CUؤKyü*? þöZþ|£Z]hÉ:øØ1¥¢WDz¬×\x(í1 ƒ?ev÷a¥¨IÉà®wÞPØP|wß”Ÿ{ÃøWá¥BåqúÜtËhœ÷ôt;gÕÖîÒ Ú3›\à¯××3vÈÛØZ¹™8l0ÕRáìªÂR k“¨·D«] d`¯„ôж³õæ€ƪvÇ–{óc«£MyáD…x«(,©¯…xÏ·Ù§<ãÔ¯7p;Á"“†Ÿa¶KÉt Š:Õß½ˆ!âóǬ÷úÓ3åW;éÃêÉ´ƒV<±‰sßůÆd©.Tø§ZµØîc-€8ÜU‡÷œÐ¾ÒíÕAp¶ÇôSµçžÌÁ~CÒÇ( ÆiûÌ݉‹ŒµI"JÁÿçbÏÆéH«f#>sú¯ :øw*¾º=»±ú‡×_D(âóíûB‘!·±Ow9;0¡ö¾²Ë³üƒ³^ò©öY‘¿,’ˆŠE ¿uP2b~°fd5+å4ŠÄ=¨µ›ÚÒÅþ- &´ÆP«\¯m»¢’©Bµw»ß–Ë”jçÑ •S¡0OÙ¨ÔýŸÕ#šµvr Ô*yø…±ó©ëŒ+”ˆH¡ ø Oö4þ½UràŽÿzÅ=÷Z¬îÎ;Ú/¿Ðõú }g']'Œ5Ž«UÿÝ[i¢R̬²Ùç@]k¼B¼6“9]Ãè·“ò&ž"÷lž©Š¯Ñ¶šnª):AµE1ågº#.è¨lœ'_Fšç/zu“»äú®”_n&ã†öÃAÎ6Sæ=SH´h@e¾¿ sðE0Ê*÷î0¯£3¨÷Õ Ã>uwµËZ r¼AÁc&]#5æ ÍWzAÓ›÷J°¸E†Å†W§Q\C[ÖYÓOÝ*dp‹‹Íšu¼â–èÒíàó9^êØZV&ä×Û•Ô:ÎÎJz‹Øp++ÍZ]ã6£J@ng˜2™ Y¸JÛYBòao® Bz×`ž©:h I¦*5u{7Îþjìˆëx‰/£ôg%Y"ìÀÍ9³Ý=AÌ7$VTBiÚˆ’‰wDºN3ËĹÜí†÷IùÆÃ>®=(œŒ¡Ú.;A'}Vgqx[€'JTq'Œ2,¢tñPLkšeN»ZÕF‘{ß°Ìós5~$}Ö=Þ7Üsø÷Ñ2†‡?DTTFÕPŽ9v‹Š{±Ù!ÊŒ±¥‡íÈÛbLó8­Ù /TD¢‘Æžñoèóû]‡.зÚ…'1/¡%¼¨Žé¡¯4UËu(—{–O“¢V¸Œƒ§Pú ¯™¯ø>V\í±4O³å Nƒrºœe`3ãehqŸÚê:–ÇÌÄ9Ö+¾›QÿrÝåš‘KAz%íF™Õ*^HáVÙ,ÔŸùU"]úçUJ`Ô°ê`5£“tÈ2Hó¬ÀÍ Z lv°¬X´âí% ëv§@0‘àणÕŒ¦â¨mMä€Pÿ5ïK0 Ì-(›žéžî£›w^¸dy[ñ¡r­Ä0ÇÅv _ëuâf%uåUo¯Ô®ÏÊ ÔÞ06úåïó\ø&˸¡+ˆbö?Bà-o„Iz5ª×¸‘iV´èST!˜²Õ;,o ŸIØß±<_nB š×õõFáœ:mñM÷BÏ»ò5ûÓ®­©¤T RgF—¡«òÚ;‘§°$­ríêר–uÌ¿‡Ï}÷4_¡8Ønë¤"©€,!qRöÑJC'½r‰4ÝP|nèÀpÀPóCœ•’ày³Ÿ×‹ÇBmÂ!b#] Õ&{ebvf‘­ °Înîtîë³Õ³»C›*$VT–¬;7P‰éÎ8BUÒ4\jž |&V ,ŠþB›q>O}²à@Ë»ô“ù+c_ _‡?¢òòÎ@¼å÷‡EP‘ͽm¡OÃ’‹žÑ°døžê}q?b›Û‰G‚á BÓæú×:\i¶´w¢¦½@`àú;þþÑYþÑyD:ûqŠ×˜øìžî×»îΞMº–!˜ù[jB¬©¢‹èÂ+#MŽm#½~õùîGrh¦™4Å2¤º /êœLݧè_¶PUæ+ás’¸Ó|ìZ¿¦“¸ÓI\­f“ª0S9¼>aá‡È!‚–ÜŽðµºj£âv<«©”X` Áô£íêÅa—×÷9Ï ò†;•U§™-ê$wLbošÙ¢BÓÿªµ3‰jS€»¿×Ÿ_”uŠ8‚ÊÀ%Ê^'ÕñÄÁýKd†Ñ,„¤šó¹p:‘è=áÙ/WÃȺ¹hõUJ0U4+97µZ‹•=ʹ2+#?óÓAÁ»k6à æ³’FѤŠvr{r‹ý¿ Dé›üŠ¡Ò-{)!ÄšpIX¥³Óðdˆž‘Ž ¹¿'íawðËÄY(ݵtÇ;OP}ª?Џ… |ºù…ì{Éðz/¥õsª¶%«ƒëî@ϳ§NämëüÐ[ÔI©mÖ 0׿ÕZq‰"h·C:Æ–ÏD²¦$\Ið¡~Ríá±AS²ÔÔ0ñMýh¥â¾t;„µ ƒ’ñ´rgÝŸÚ‚•;ëLé€Kg™@š#g'!ôE)<¥²8%®{®Á-…Nïƒ~xNoaœkÚ ¦×Ð"wY‘ìe!¬ÓÅ)ËG…_Vh©"šR@'¬«ë½É3#™òŒò}’8‰ !>—¬ ‹²q ¼d·lcVâA\Ò¶ *Ú1&V¤ÚæXÑn|§»àò½°dë-;¼+kz8é<;Fq˜BÐUÔZØ; 5ꡘªVEJ¡ôËQÓ™¯_—1«®¤TÍ(Z}Ôó‰@É2£üåp¬ ÅJÓ[Y€0Àã`ß,íMBŸYIr¢}À¼“$f)ù$òêÄ)Ê'g>£4ë‚ʱBHåìÆjÖ®6ˆìîÄmRF¡>»¾Ucãø¼7v´X>¯žæ¥$HŠ<í\çf9_ƒeJ-ƒ‘XvÄXè5¼oÉ„×0é Oó IFÁîq^Åõú  ¼Þ/Æ6 ¯Ë›%9ñšÈgåº׸ÿ“¥V? ÏTâæ­BfÅy9¹*· †õñ ~ƒá5âc9 l.*ªw–ªÐ*ÂÕ‘Ãlƒchˆp¿w^¬ÚnjTï5 —’`Sº)¥ƒê"#çÀÝ?‘ÐóÌì~¦þÚ\jP=žºòM÷m-æ3ïò7°á”TY™·aÍyüf‹j8frpÄk7‰tP])®ÆŸY¸òq…Ñ@CäANÁ²bßà&럘]ä×µ’ ¥R¶œ)²¬¤P­¤æÉäà²I|;ãå¶%y•qÊë¶%”Üq p1®) Xá‚,”*uefÍ’îdd·(elRÃ¥rë6ÜN±æ•:vj¢óÕÚC+ÃxØ¡ç8úõuÁv}m×B;ÝTˆôç%j`dªaÖ•šzC€8×> î6~¹Xv9ÌRF]+Ææ1_£®oEœ¿ž€ Ï'>8ž@âHoûôjîS•˦8l§Ý—ëÓ/¥'ÅÜD’‰—«e!Èçè lS(W¨ªîÎw¬æ(31²k8÷A+ ^3MV½ËËZoÁˆÑ‚æA#Šéå·ŠZDàšðLr« UÝ.É…™ª€ Œ"¯Â_1n~òöð”ã¼~°Lþb1PVx’#±þü'þ÷ÿ÷ÿÕþ«tø'_±ˆ¦þÐŽÛ®ù?_}>Ä×t¿ç>q2þÿGo»ZާÍäWÿWù‡L¤ÿ\p??E>Å Ì”Sϱ¥øâ›q÷ÿþ48ÕšøÏŸ8ëg‹¿ä¯ÅzlAŠTÔÔÕ[Y^õ%¥Uš)õ–k~º@a™÷hýÙŸ#“§äáþã0‡ûIõ5tWˆgšUê¨3 LqT$ú[nÚòr¿;ÕòL @”Û[œx…°0†Ù/À¥äWM‹Åï{è³hSrqS›§n_:¦9‹éýx{žGÃÕ1úÞ¨Ÿ(wÔÄõ›EÇR*bñì^œn«ñi-¾]ÄéLÈ£¸{UÿÛ?¿EX,®ZíÏSYñ§][”¾ñ¯—É3žÏýmÐcsó9V|.ô4G¡¶à6CŸücüŒ¼ë€°|ÁB{á{Kf-Ý¢ï_œ¿¿]ôÛ¤ú±E}»AÎê{Ôþ|ôg@ü³³rñÈ ÷sÛõß1Ÿƒ`×ìÐOg·ëÏù½÷uÂõCoŸáÞRNv£ë4-|36ÌŸÛÖgZ„”qü÷þ߉ðó¸ÚêÝ`ÅN¶é Ô˜^³uޱ§§Åc7®íçÅm!Nüâž}ïmÂÿcN~{üy°óýþíñ¾?#ó?ÿ;.GL”ÿ~zuüL’áI2ú¿/î³6Óã½q´¾}0òv÷ç…èe¿-Ÿçê™ ŒzkðMõâLïmÏ|áÛ‡^æû¶*ûw0‚ŽÖw Ïû.«¯9§¿kk:-^ü÷»ô+ÓÛQÿŒsZµrbÚDåp•¼È¸ú¼øŽL³ßq2õÄkÿ¼Í™/ŽŒç·e÷Ï”~6”ñŽ˜®?WÎÖ¶‡ß}¿]rïß[íXÿ™?ÿ?ëÆ³…d?_?ݬÊöòϦúÏâ±Æàþƒ,‹û>gîMÞÿíleÖƒa)âlŸ×>±µ8_N£ÚïV6¡fß'Žû÷ÉÿxÝqKGŽÿ®ß‘î?îåŸuª‰I~Ä•¶7Ðc+^ÚTh'lHýŸ;—žSœ‚>ßl~oV8—TYq{Î4ý÷föµ«ä"íÙwÓö*,ôg†ÇsÊ·ùÏÿÙqòéú±ØšüÿvÕþí?JEc0z˜Æ7r_~·s„þ4zÎDã›üwæ$k*‰þ+ίïšó3É û?ã{þtÈ,ß™?kô?ëÿ»D}W¦ç ¯ª ò–ßß¹m¶üϪނT€» í¨žYÛ Á"ÿzp_àÛé’„ùÞvz59Sª$´Ë¿ñój—^-L@Œô©±¼Ô™ªÁö«úÅ~v‹q&ç?Ï|w¡Ï[£ßßÅ;Ÿ<,f_6ßÛøý—ûgšÞ‘·¼ÏT½i¢>ï3U÷;U\|WµÇ÷…ŽýΤ½~îëboˆ_W(µ”̬–Ü•5›à”ܲ»®dÓ1!²È&«P"µðÿŠ®Ò3­õŠF–û }>¸µ>Ôc©ÙâõMIV¿™êeý%Â×:ŽŒ’5¦:ñÎà ”ˆ7­’97)üBÒ¦Rœ\°+Mªlþ¬±uôŠÆJ£Y8é½1’ß§#ͺșö©^3†+‡†'p»‰Æ¾Q/™ŸïÃÎQÝ 4Q’ei×ù(NO4š¡žQ½v/·(WS^Óâó3Ké¶n™sù±ø’‹NìÇØöcîY`UVĉËÖ¥c)r~utpï»Ë1­ã{ú«Í£œ•gu3¡y$Á»d”ÐÄ<¯åC?øZ>|èY:i„ˆB ÍÂBW—Ò„hÝàÿöñöÎçÈkºé:$Û]nÖýÞÓ&Ê›VòDÿAýÀ!’Þ¯s+€užKêÎýÊpø‡`€pº‘ÏSãÍ$ÂOØ´Ôu(a‹ŠÐ%\i7ꆂcnØ?ëÚ*”+å¾×aóêh?h–‹8aþÅæ½%½7%Õ”Kn>ñ'‹@qa)c÷n³ÂȰ‰~á¶*¹ÎebÃV9DA\ùŒO¼‚rå Ê•*¨IïQ“¸I£_ Ê˵ZˆîR‹þÖk„aN°`äòiÞ²m\y8©>Í]ÈìÖjìå0θ·>9ãRŽG†þÍço|Lƒ“Þœóv?¬½Ÿf>Iš.¶c‰€T rŠ`!w1) bH¡ç\@ÄźWÃϼ7A¤œ^“¼á—d7ôô&ŸZ|öjâV¬Uº·¾ð,/¦3‘–:©Pמ š<:ø››åjÏôðEÙQ…/Pž$Ìrr˜å$›åŠEPÞ5¨šq±¾©ÕÀhX´Qî]ˆg‚½©¢cJôlƒ¨]Û jÏHBÔ^‘ ^ç˜H#S¶;ʼnØñÅ?[y5‰”¤·àvGåcuœÍ3žgðòIdNš ÅAVZ“œŸ‰‘^X±faC¢^ý¬WwBgÛŸ#$MÚþ,ÜSÞÈù6­p¯0؆`·Ú7‘N1ºü =‡S »9¶ÃÙNEð£MÒý° ÏúZ¿ÑIJÂb̸É\,PÄ€1^bË:MvVºÈô½LDž633!4*²5 >”c±3¯ìÈYÝ„ÖxZÒò¨JçQjëÿ»/BÈ iöÎ7aHÝ-‡„¿ä›qõò#§ž@­Nè]eiíTéÉÞà*Éî кhˆ— É¶KN]2òï㤇ø˜Çè3Ö_Ûåx-gÙæû{ã9BT¬#͇”øB„+ ÷½YöLnv0–Èr:ÔìT,ÛªXy7‰¨qjÒÊ•, !Mwªf‹EóSV<Ù^wάôsbóÞ žNKŽûÉN>fC`œõ¼wzÂüñÜÿÂà(ët"¸=ÆÓF Ò?ŽQ@ýEWY /«ßû•'Ò¿G1žLI„Dê¯lôÎ7eVÛëßáì°‚ô”!¾@²¼ñ<s‰¨BAH˜@N=ìÕ.aµ°Il ™ÎÙ*³»ín5Y°Ñžiœ«™Úßê™C4ó8‡`Ôg½ƒ“óúy“õzÿíÁß@‡//Ýò "Æ$¡µ¬¿7Ú©–'¯ï¥óäÈäà€·°ÃF¤Ö²ÙEc¤ұÁd§j.½ËYÜûWC{ß íãlhŸGQë(*¹+~VB^Ôø/zu“wd0$5²W± II×/ Þ³ømÐ üò˜êŸËÏŽ—ø@ÛTÝæLd™¼ æÍF¾ýeÿëÊD”¾€ îf¦‚ëøï:æçë]37r×]Æf¯ëdz)ÇD3ob­°j+ÛíÔÌfp¿¤›ËJ˹Z|{¾Þ»(KÁAyäïc’Ý…—½Œ|u wÛûýÃs©/lc{˜¤p~ ˆËëcûØ£Ýjo:|¿÷Êkw ûߺyòûå5ëWî5ˆÕ_7eb{)ƒ…hXô³/¥ZpFõûu§ê#·r.œ$4ê\v±²‹žøæ´.¸ºY¡ ŽžÁĪBâûXÊiºiT–nÿàé°xbJr2ÕÔP,`×-«ï÷DÜ÷_½æ•Ñ¡j”Bñe€Ó UÑGÛÝCùÛúcöàa=™ ù„×Î2¸`?‡t€5:d3ÝíœÙ¦O©ßd¾j«·¶ÏBSäp½]0 ã¹C›¼Þ›fåùßÛöÀö0k¢'¡åvSùŽQþ=Þâ;ÀhÒ{&5½óZôꤡAkzxP½~ 4 œ½?ЛêÕdçCÓ\®–q]Ç M÷…ÜáÙ©÷}¬J0 „|%6!pkî°@ñÃ?B1:”:Ä=1DQùZ ,è¸Â‚ÇPŽžQ[Ä‘7¾3ÙnÆ>ÝÌEþÅÆšá«Y30—Þší\—‡pÝgÚm!}ÎL‰W;¾Ë¶Ï®¬d Òy"¯'/ï+órU¦A0ÔOi¦ÛþŒ@ñÄÒŸ¬£ëÐ¥¯<‹Â&È3 õ9º9€&ÛN:wŸ~ÆTŠÔm&iáU'Ý„+£ÊÆà×ûÕæJ´ëFñ0s"ƈó¨•]–žÒ6.gDÎ6úÍû×nÐHýºW7@g , ‡¢H¦¼øÜZ윆gÌ;{«4`QÓZ`£ä‡Gm8؃u¶ð@›h¼‘=°õñæý´]´ *â=;@‰‡„Íêm×…TÚÂiʹ#7ÞÛD„’®ƒp  ô¤Ÿ·SÁ³Ö’×ÝpÕ&@هܭ“ÇÐÉßWñ Ùôs•³àú“@P)13% ˜ #º8àóÓáü}‡-豩fo«É¥|ÎQ‰`tßèëð£æfæáÃPÖ8[¾©d •ßôÊBÞ^.éâð rc¹‘+9Û hšÑ¤æ"íÙ=G˜þºCŸ=d„,‘¾wQ»ÛÉü-vmbÜù<°#oWJÛ…§<Ê ÷0“¡‡ ²vùPë€ZÙT_d&<ÓÄKiˆ{ŠÆNl “ûx;»f'3‘XdÂ2/Ös†óÎYÞ&ö³ì6T®Ç ûÍ,%M¡üy»óçYè›ð´ ϲQ­ÆË•F4È;HU\™ÇòRÛVЮ€Câj.gu2JYÒ[žD ™5ÓÍNa-ÑÖÚŽí6áPå¶ŸhŬ,}æ–8šžñìÙš üÓ¥I–6DdÚ~'øâDüø=Ͷ‘¨ƒKöz |Þß+S†G6ªÆŸìM9¦µsìbúæ9zP Wc¯çŒ5Š·¶e{Óį»äj"Î+‚iÌm††ög~7êÚ#ãIÅp{ß_p®–|“O1ØáHX)Õñs­û%Ñ«¶ÎÒN¼Ì„0¡ÍÎ-¹ëÈ/çÁ”Ú<†mT3;z÷£?B¢|²W%¿á;#‰`c´-ØÝwž¦à!“çÂXd®h”« åf‚ÿè‚ ºÔNqάbhè Ê÷çL ô„hNÇÓ=¿Üç´Ægr¸¢V–=Cﺨ¡‘-ôŠÿÌd^c ¦í7UžÕð}êiÃ, Ygw^rÄ µfÞ±š±~'P-“»´oŠH…x²® «úD°ãˆñ)˜ï½1(:ñ8ÙðÿæûÜLæ‡teÔɼ‰Ú‹i{ß)¯:…0^SXüÄ ÅUvÁŠÊ Á;wÌ$ÂsÖ ¢O @háŽ\à ¨œgãè,¹âºN³aªÍ3l¥ìµNæ …k•šËvϹ•œ e¯¼ýÖZçˆÉÃÐýþ+y­òcûèƒÔ÷½ª›RCpL$6<‡|þ¾ØXè6·×!•|ìÓù÷óù„þNÃÜ”qÿEü±Ø²ÀiV%·Xà„B/è`«Rh(!4„›kž%M—èA,“–·B3 ¬|ÁɶܱpÇ:Áëw¬ܱ.fˆ"CK =?MŒæ<—©b…1u–!6Íe§|[a-joÃ+Ï´E¯l #zt£äQÉøÙ †C÷îß$ã‰Áÿ)\½¾è@´–uyýÿÿ^âÛU§golly-3.3-src/Patterns/HashLife/metapixel-p216-gun.mc.gz0000644000175000017500000011761012026730263017712 00000000000000‹P#õHmetapixel-p216-gun.mc­ýY¯,I’&¾û¯p€°iȲ2ÓÅ–"øÀf× ›‹~ Ø@däÍÌ@EƉˆì잇ùíÔï“EEÍüœˆj22¯w5]DeÑÅþÿ%ýŸÏõ¿þïÿÃÿ—/¿|óãwÿéË÷ÿðüå»ï¿üÝ×_¾ýæ/?Î?~ÿß<þ«ÿíù¯óßÿSÊÿêxþòçï~~¶ÿóÃsh†Vßýð§çßþüÝ·~þôåÿû×ï~úòóóüúý÷ÿy~¢åŸ¾ü"?Ÿßüòüó/¿üøÿ÷â㟿þõ§o¿üñëOú2ÿðåTÆ¿±ÿ¿þðÝ/Ïo¿|ÿýó÷ÿùù¯úîÛ/Ïó×/ÏõÇoZQZ–úü»çÏ?þÚ¯í¿A­Ëçw?üñëïž¿ÿæç/Ï¿ùå—/?ýðóïôx~óüñËOß?þö§ï~üåùË×ç7ýåë_¾ùå‹N¥UC?ùbÐ'Ðüûï¿þéç¿þ2ûõ/OƒùßýÓÿ?þã?<ÿéÇ/_þðüù—/?þü<þCn ÿa{~óӗ矾~ýÃüü׿»/?üòüæ ¦ç·þæ‡?ö_þü¥M£µæØ­ƒÿ–Eþæç?ÿÝ¿<¿ýæÛöó‡Váçç_¾ð¿}óÓ_žýq~þï?ýç6ßoúòÍÏÖ×_¾ùOßýå¯Aoèãù—/ùÚjýüå—_På»?J­6«¿Sô<¿ýúC{ö×F½Ö÷Oý¡5ü•¥tš÷ÿ?CØ_¾þ¡W‡þ‡gûïË?¶y÷Ãßý˜Öíï»ý2ÿåÛ6“ïþРúþ *ÿë\Ÿÿl¬¹áù_¾ûÓŸÿõ§?7³«çÿòõëO­âªÿ=ÿ»õoÿýïþíïþí?þî÷Oíÿ¿û§ÿ»OVùýï¿þ' þÛïþøÝ¶þÝï~'lûן0¨ôØþûýôÝóÿÝÐò<Ÿkù‡5ÿCYÈrÿÏ#xþé¯?üîùo¾ùßýáùŠšçš Ázž‡ÕUýÛßþ6÷íÏó_¿ýnþò‡¿þýÿßÐù÷ß~ó÷¿Ïõ熫¿Gýy&5ÿÍ—&ÉÿÓwßþó—Ÿ~þúãnÿ_ž¿ÿòå‡ç÷_¿þ3ø¤‰l«÷ÝJ_~&çüÀÿñ›Ÿ¾ûæ‡_DR1 %¶ùùï~øþ»þÂ*¿{þøõë÷??¿þ<þµéŽD‡€„Ï_¾´ñ—ý駯{6,ÿ¹‰Â/MDò~ùæ÷Mÿm´ß=þŠ–ÿþë÷ü雿ü×??¿ýþ›Ÿn´ú¶‰Ñ×\-±ø™ççÿôõo_þã—Ÿ~÷lZCÅø/dhp÷7­+¨ °~ëý§/€(þL}ÑôLk÷ó7ß÷‹ð»"êþ…jïûÈ_Ûпÿ¾Íí÷ý¥qpë?|÷ÇË_¿o¨hcPÛ|Ê= [“öTÆ×Ÿ¿ýîûÆÃm o¾ÿú×ý l@YSŽmú¿°É›nüú7 ý|Ûòû/2(;k#ýøÓ×?üµ©Â¦Ê¾ûú¢YÚ6ÊôÏœ¦úó_ ¦ÙÆøþ›¦jñ¾‡·&ÿüߊjÿ¡~þó׿Aè~þóó¿{ž&ô sù Ñôå?ýòÓ7ßBÿøSÓ}£¿áݼñë‹ÿMíÿM/ù3ɃÙ~ñé„oR`õ¤š´õÖóÔ»™cJ¿ú½z¨Uàÿc­W€BÇž¦ù-,¡K¯Õ«),±ZïÔJ^·ZÞÇxx¼¬®÷3MCWïîÓy"§\~„éFΞïo¬ú"'šxX«Éª\[ÍÓ{,_'Áì­1‚Ê™ÿäD42ADðúÇeÈ6•qj7µªVæfEá­Ùû/ØUq¾Òi¤çÇtÿ˜žh+ç¥éõÉpŽÿÿ#DߨaÔJ^óÎ?3ÿwá¼)¶Ÿ¦^ÜyK«Jr€ñ1‚fõµÁ™Œsn»Îøƒ±Dˆvˆ³·é=\§ºf¤åÚ7„îØ è”u;¡pÃ.l‘\oÇIG3E«ä?ŽJÃå/‚hÆÑô“þ™ø_DygÂyÄW׋¦[ß|>¤Þ@¬®_“ê |!‚Èá‡zvd…á`­)Öæ\»J–ß/ŸªOtÛüJ_GK°Äb`ùUêòvµÜ÷2®îÉ›©~ìÜ|„@rW×è½GḇùÄÊKQãÓ·G¤û5Öcœul7้æ\'ø ºŒ¾Sð 7>u¶ü”}Éôp€ù]ñàç ]Š^D® À(2ü¦äFõÂ/SGÉE‚“˜JkQ›ÖCïRþN}„@î_§J@ê4i˜@'ù£ãè{CÓ×˵ìK;¥)¯Ï¿Y”`¨Ô‘v•Å›g7`)6B±Í–Zq¨p›éKÖ—bùe’âM/âwApª‹ªy'Á¸…‰6x€ý#ã<-»1zj©Ü ŽÅÀÕW^?Ì)5;9Èå㥵O~øqQ¯èO<^Ãou¤uSZ[Á~\æô :(Ðða‚ØÅO~Ùß æuÀo9é1 #Dª¿¦.¶ÎÒ“«”Î哊ö õîŽâ‚ÙHØðÜŸ\0(Úmˆ·¸0Ít}2°Ûôþñ8Ú;!¼ øÿÎÓÛÇâëß«·õé0nP£Ø†â6Ù»u½ô÷Æl…Î]Ü0tïûa/\ß¿)—«SúNaÌFÕ©‡È—3a´ÛJ‚ø^üÄNë>çA`ì½]§Qtg‡g!Ò’¿L1Ó~Åv£K•Òˆø6ƒ8E–+Sj!ûñšÆ×`WéÙ$tj–¦.Š)¢çN¹ç§6óèSf U3Þƒÿ±3kwú{êØ·J7á2…43[êtBüŽñ\Ÿ}¨{¥YÀž x’sò{þä‘òªZü‡gÒ‚µ1 °¿Ž™Q{úpm¯áÇdº~rÕq^ÑóêÏäÏ|›ó(¹ö(þmȨÅÞ!sxàÄìŒÑmÈ•Cʘÿ¹7÷ìb@é1údÄ{å¸$¡nÕ®I*«ðøxxrŠÌÀéS@™Iƒ·zÝ(á½Ï¦{Â°'åhw—ça‰‰ £¸¢• o=†‡¹Ÿ´¥.’V/ñ1TeÞî·GeÎêÎ=&½Ú¨^Á”ÇìµÜ{0¦îÖDäØ a}ù/íFÅ_ð,´W¥îý#uó2Oæ¦}gϾ°¾¡Ðʪo^&ýBbcS„¤®‡ÆÀÔ€ë©[ûzIèª&½”„Ÿï­dþ÷A‚íé"<»h¾æ®¤:Ì7¬m´†&ì´š£Öù6•êË ±š'I¼"Õ¾ ŽGwxìÓ éî Íêãx^Eý‚ÙeR¬Ï]/¾æÅ¬ó8c/êºÎ§¢Q±@c=F>ïR®#uBÄÇ&ýcÞùÔ«w¿]eøá1ù'rb½™š<Žžœ¯¼Ú« ”+Ši ÅCõŽ‹a´·žìµ‚} èxÌfÌ hS›À¸‘8ï‡v™£×F^èÓâÉ—¼¥s¬hÒ)kp çÀ¤A{— ï¥Tékî°—=œ»¦9˜ýQ¦­ãnçe'h@«ýмÔj¬!`jž|5Uƒ@Mo²BI²î)›VójÎæ­¾âÃ(ÓŤ褜–Öÿ@*}""1‡òðÀzSï1w5òks²i…™u~°ˆÝº•0Ý«pó«Z®¯± LN_³‘‰J)~<º4+J&2«ç’pÒ…/ü™:DÆ^¯ñßÙÐû¶ñU¯d~÷el}aïËÓ×Ðx¾øˆsUÓŒþI«;oú`÷ºñ6Ásëz¬4êJÓáû8sø¡HóZjòLòl8·÷oþú,FwvˆÌ݈P]Dõuó{=‘mße݆j5“‰—+ØùÖk ë͆z¹O÷fêÄõ§úÛH3—BŸN•>B0_ásîþ|0ŽÝQ¦.Ø}„ G8Rdþt°9Ô|Šb‹›à\ŽkÁ`†.Æ‘bÍÇ¥ê8‹×ÇLZ;¯½æ€ÃÞ‰£.–ÌÝIKö¹Îøá}»i‹ewLiZ-m6ê#t=†ÌÈαU -ß0×¥M×r‘m.U øÓ÷$êìókݪĿWƒ6ü ê5‹= ua¶éVû ÷å)™©{N££ý¦.ÿûxKÒ<Î'ÿu1¬ƒÝû´yø;OŸ«kcÜôUˆ Æ'Ÿ57ì¾ãû¶ëã¬{±öMò\;…¦Sw°å÷Üiw©|½Ðë¿ÁsŸÊl¾¶1æti¯VMíÁåÓ,à¬ú ´yû÷ëGÕ#P“;ù—ª7‰›ßð1¨Ô}åp»†{Åïc…O¾…Š7>ØÜ‹uëàÅW“ìøxÙÜË_a±&T -Môx½™{H †D½öF²[däþÃäùTÝ#`RÖ~YÛy4…//Ô'ÓäÓöÀøåëå.wÓð§kÓ‡)Õà›ú?ß a ú®Ä^¯^+<º%~B8ä<>t?ݾDkóxù¼ü#„týyªuÂÃùÛÓa„AQÅ’Ép¯S™Ì†ôšWWkž†îÞU{ Å7þìÆ®] ö¤{ï¿\TÝ,(¶/>ÊÛ6ñQ‡ãŠƨZBÝ8̽§yoµåµvï®¸Þ †‰•¼ÊGµç«ª~£cEÙ¡¸~é ‚É»}u5k6ΞU…ø¢‡ñäÖ ›´¾¶°ú“´Q’Ùø31G:>l¸>^®F¤•õ´R×|óEú³A`l/ãkeÐZšŽÐµ}ïÄÕ¨=p´E‘|!¯9Ìzž‡¡º¸Yõ0qUôS/ì‹ÃÅx鯂VYÈÝá¾LàZÕm(W&òÞ§ j_¯Ëã· ¿Ä.»Â¹q¨±êìû:9_cµÏ̪êØ^5"­¯nøÆ*ŸÄ‘íi¨0 6tëìl?ºyuF{2ÆÊq|5Áo+¼^oËß~ù âµ‡àÓÊ~&Pc„ŽË7;K¯ªƒÕ|¯9F ‹„¿¡Ò§üêu~î….m£.,Iy©ra¥Î®ojÝíJ¯ò‘ ˜~K¥ûºá30ìÕ§xkdÞ/>|"z瓦ÌJž]FSxGËË¢l N½ØÚ®¬=ƒÕž‡îF[ e¦ÇT×y©¬šJŠýwUq'QÔj‘åBù¬âto BtçÔñé(BoŸ™×<_ËG;: 0ŽÍîÓŽÏ_Ÿ=rüi…Ëdœç†ºý*Ç#YÓ÷ÒPÔCh/sE¯ná†Âè5ŒÅ޼ø]鵨7%Ž¥oÁp•KgÇË»âëxW];ëMý;ñîÜñ X³Xü÷™M¶Þ¥ý©Û-0/´hšÇ‰h÷‚Wü5þÐ_uq_Ö÷#´ÄŒ:ˆáèÑÄÝ|êŠè³—õÉ^ûÑ$)Ö´Þ#p¶<~¹êð‚À#¤á^–:ôó‰©7üÐj–½Ž?û?[ª°ù××3O^`àÁ¿FöóÔwP‹nî?î?´;nº'!Èík਩»}Òzü˜ûªkî*DÕrü=èéÍŠÊ©æáÞ2½n±zDnâå‡ý©¯(ó‚$£_©Ç ³wÙÉtÌÈùÙøðÖá#ÆÏšeyu„§ƒTP Ô. ÓddÕ¯É:L&}ÂÙËÉ&x1íqMº˜+úÒªCQ/µbE€[™iÏ` ZÉ‹/¡ý˶è©ò"W»f-."„ÆN¦{§Ñ-˜çÈoÁӈ梫ߘDU{>¹¦})›ê|Ý6öœSü©íœ ·/—>.AÿÈ%ήыréMEÃÀdÂ*¢å9Œeh3öòÁ<"€)L×&ôŠi.Ó½ÏÙƒ¤˜åpÔÎVmÍÎOΚ:7DZV‹coå|@ã6UÃVuŽ‚æRôøl†N)ß%#~è s«fݾìA`Ì©Û߇ñ¹ƒ::ÿÝwrR¸Fw¥Ô‹ š.?sŸì«{ëCÎq2íj¨} GT¦‘¸Z‚§Š·±©*¨®|µ’Ù±>Ç•¬Î³³Tç6Cîl#<¦Žü 0Dq)ý{çá¡uXÆ Þäd›G$iÞo¸Â¢;aýÛå¹s®}Ÿ¿^·²ùó6¯×}œ`âß•‡>Ìg fžŒª6jž—Ù˜ÙY¥ëߎûÙ cé«Ò©óœùš½¤ÃôФê]º{:¹çmçQxfvöý‰y,ëóÔgódwjôÎû£9rÛk65cEª'Ùá‰:F×"Óã¡óDm:ØIQÒ5ÍÐí|…už‚EWØ‚yt4ô?Úèe¢zR>šâYF=øeúitΦˆói²¨ôaºk”Íw_<í1›"îÝyÞ]L…(œhE¯±ŠŸ –£‚6EéM4«1›Q¿h+“P¯îòíšu,¬†4ÔBÆ–¯^AtŸ·O¨/@Γ÷Ô‹Ôç몡·0h_vBÏq v¥ÑK½þ˜Ñ¦UèæÀµNÝÇ'NVïì­—æö´÷1¿êò´³ä|« ÿ'o|0÷¢‰ Ÿ¡íp²Î´FWyWn÷QÞ)öXL¦caÐ'ÑŸï^‰+T›¢yB_Ž.J¨uÉe °®Ÿ&vhð2í—k"_FÓâ‹R{.¸y­ƒ¢¦Œ?«øfƒïæ$÷oæœ I —Ÿ×µÖÈKÝ«³ç¯Sœ¯©«Ö‡#÷\Q‰v‘ú -fóƒi Dx úõËè*=iÒPtž\ÙyíQÜæÞ^¹úåü"¼¤E+Wóebv«8<· ÖK´–ncý—RøeÎë«¢ êãõ¾lêûž§y\PÐÙþŸ}ð°'–ܱIb…ë4Ããh¡ƒð9“ 6Løà¯^êRp+ï½DÑŸ‡2E!'h¾W\¾>gÏ¢„ ^x_Ô; =[³ð7ôkjiŠLÓÁeRiCëÉ¿‰@v×_*¾,6|ÅÞÅjŽŽøZ÷‡=ã¥„× ]ŸÍ=ÃÃ; öy+¾tôá¤GhÉ4ÝŒ„- 6yêQg줸±@ä·×µîP;<÷LJäÇȨóP®òã2å¼ß僚# •g[œM]%Äzªfóì:dŽ7 ®'ì©Ãf¸Mž¨ ÖtŸÎSW¯ š¨Ï8PÈÉiÂ0™Ï`fjêù˜èòLÞnî ÇAN}Äšà AWz;›šf ­>„óN(»Žð ŠÁ3½·ÇC÷8mÇÿ°f8 øåÚ$¬«Li]Ûwïô1zOG|ùXaáyò"_ý4ý£ÁìÀªÝu·ÁÆ¿Ní‡QTÛ ¸}D˜Çl&?Ø ¯ÆÈn¯[ãGÈ8hzºº`»C:ÅÆô›¾\s`|®®–Ur9ÓhkR¿Hž;t‚¹Z2êiú/i¨m8¿gÿí‘3úŽ­³ã ««è!è“Î ó4«äu¼ó¹ž " ¿“Z ÇgŸ^GY„spk.…At^ÃÕ:ožÞFn|xå—ÎêÍ“OåTƒuÔÏ)~×>¨‹Öêú)`ÒÍa´)ò°w|Ñ]¢ LÍ̆ýÁF{=—ƒ——\žÆø`¾4ûÕ ñ©áÕþ< @eíÙìÏ®$R=**›±‰±›\mt¡eÄÙþÍ“?´óÄkô&” f;{‡gÀ «ö ÁÔÅǦ.¤Ø¿ù³ÎsÁÚ…¦êú]z¼i®á¼xž|û+д7øøÛG爾q©ÀN¦Ô¼Nôm†=’7æézIš…å7yb'Ñõ—•†ÎC©z//A¸"?/Î ¦ýL©Êœý^Ó"ñéFŽb>"üÙ¨v”:Ê÷ªÁêPs…fòH㢓æÀΡÃ;÷*²lbqªfܱ@ (°ê‡ŽMQ×ß5¦T™Ž’øgÐd ð ý#põËmÕäÖàõzär™œ|:Ÿ=V”YÍ“k!›ð@™D§zçˆ9T5ƒùêY5qЂÊëê}ŠÜçõ{§>ÑÑ;{ÍØßP;TÔj ï…3æ>9o5*Z¯ÑEHS8!úü•zñyÄÃíÑëÕÒöÔ‡ÙV’ç|‡þ,~¹¨Î^üž.Na+¡€ÜJ,Û¡yâÉÞy²• uRgL{z™i°S¨ï|42”3­0OºµÅ¥z¨8ûQ"ÜfÛýê†dPP¤Kóû¿ƒNó6]÷¿Bâý³Ðî×¼"؃¢î?°;¥/¬ •çÈSÖŸå9+ËÏ·g]×í^gÍB SÐÊ-Óe´¢>¬ÛŠKõ—4½Æ}å¥?ï¬é³ŠÎÄ€®±¡‰aêMDîÏc/áÙ'Í´•óBϦ ½^Ë^ÜÓKR×¹d H/u±1]?G À'B·›Í!°ù¼YyºÃâ4x÷H» £¿©ó²%¯ñwy-ŽRŸ«vð/fX/ò6Gg÷uëažçùþe„ü£ÇA b­áëŠÎ¶þ§7|….ÂLFÞ©ã^á²a0–›{ǦºÛ.I•ØdÖ¥žù•}†i¼|á¡v=Rü›=qä »yp6v‰ò*—à0€ ¬ ÁÜ‚.£òÃ!T'¥^À B'Ð+Pr|<®Ÿ«pEœ[µ7*cxü¤íÍ8ñüÚ›‡¯ë¬aôûðè52ãðð½*ÍÝ]Ú4Œ ß »=ürdx”a,™ˆ N~¥•SÐ…YEµkÌ©,Féj0]p8<Ù«½›ù[^4¹¹*Âqf&!“æ“3žG’w<ŠU$ûHÿ‚C8÷/n´ooîK—Sìü5 xõµ³Ý|a²àl66÷ ýc Èñç³9xÓØÎ±ì*8Ì‹²˜z«{(y m>¬æÛ©?¯ßm’×*E¨û_ÿó¦ö¬êØk™¡k¾nI½]ŸÍ®hFå¨Eø+êŽë@óÕ PûbµÙK¶vÒNÓe¬ë—Èå—1Ä:N–Í­kEL̃TN·J—?öð~D¬¢ßŸþªétý=íš|@‚±Ö ïïOçBoèy´?™»T½úëÏïCËc;êñzÅCW=w³¨¯¡Ê|‘µˆ§¹£÷Òñ¯ªËˆ°ßØàƒú£žæ‹‚˜ïÝh½oFë y§ü/uH—/ïk¿¦+BÆ$F(ï_QòîïÿfXÞ·V-cû?.MÞ÷/yX¯:Ð1Àüò ŽêJyr*šoa…ƒÝEU_žHˆ3]ëŠÆ «×G$Ôí‰|iîºù^[r¨£‚ŽÒõQ3GøoiuU[x¨ðz÷m¨ ìjE¾£UÐ/xº=³ßfm¼|TB>É)ü³²YÅ4Ôíö NqüùÓª#BnU/uäȹâw¬=;F-vØ4Öµ(v}oàž½c•wu^v&sº<ºÈϵåe»N¸qè;#É5Ö“aÇž>¨d*åý£kñ{)þŽœª™~ Æ%¨Š(~c]Õ cñü–(½³MDS6Vì6~à\“½i_î-Ç‘¯©O{¤R>ÙÂ[änɶô©¯8i,:EÄL÷V^ˆ¨Þ5˜;»ŒÔ°Ýù™Þ<ô~ÛpÃßg汨W½6¾iˆém·v×E,ç[ß«:EMßôY‹kåOý;÷¦ýh3®B÷Tx½™Dø·³ü@¾/J½{Ìm>˜IìqðÞW‘i÷ÒáŒt(Ÿ´75«ï+ÍýF€>ËÞö9÷ž|á&¤F,Ç¥»‡÷=>nÁê4z@×ú÷J” ÞÞ<é"—EÙ¾Iþ ÇÓíKÐNƒÆ»XÀ›ßy©×õ9çùÆ€ œúFç1»šýwt½X×[“ˆ«ù·W½Ô¹©³Á;~[ýª@ÞV{µ/Ørb~ÜìãNg1æïž¿W;±Ù4õ-ísÿ¬Û›VóXôzß·ýL¹¾­~Õî«ùì.P¾áÎ:ŸÀ1]ª…°µ—ô¾fÛÝÚmòFëŠÍìád›ÂÃ~«g—´yzMq`™Ú¿pX™cW4Þ2D —Q>mp¯ù ¨º>´–ãßÑZ|ôÇçyøò®ñ:àüŽMÇø˜8 ,ñ¶’„¢?ª÷Š郿ŸNs˜ÆÀäoê½îSßáp^UÙ8±_­þ›j¿GÚµ?šÜGÕ?¤€é7mßvr}t×%㘽Ž~ì¼mð~6ÞåæhÕ0u­Õß²íD·ZqòöõZé×õÁG-®¤¼”~ÜîSÆùõVÿ%þ…­nÊûÂ]#~2×ø{âB7»rj„Nï ›/¬pÝ—ïÅóÅåba„Ån•.êÿ¹> ~ áóo«~…ãâ¸w.½ö¦ãâwµ‚%{ØûŒqV•¶I®{pòê(›»qç¤ÜlHµ±=™»¿ñ²œá¤wÈw% ­g{2{§Bè—ù}w j‡¿p0ÉXÀd@J¡€4+dýWèzÙ<4˜Ç/ðg==Mý°À³ï)3™x¨_û ÁD ~aOX\•IÊmjáœç<Ù%Ê7úMc5áëv²ÅnmœæX4ß÷ çù6cÜÔiw‰œ“î5_ÁG4×-ä¬ ãÊOüÒ=4]$úMÍ£ÈöøÙ8Q_]0hʘº~hòàRX·ñš[ÖIk[fM=¸3ýVUùå ïó!”순m•ÌØÆ¦ô°]³}\È2GÛùN…J«TÆ¿f ~C=«¤LkÒ2aÇÆd½¾.ÂŒG×HîQXWS1ªµ¹«#kvZû‡uÚ™õª—T8’Œ/MD é‰î„sò>^ªÁ¦®áã¥O WB5ƒC!œL°Cw2’«ì©—wíÜÕÚý‰v,N]ìe)iz9].¤ëü‹ËÝÄh¸òïqVƒÒóòÓÔ1o,®]hÇ›•yÍÙ¡<¢!ÕöšÍDš¥ô_s88j?÷ˆ­¢s¾±Ày%ïmv6 zH4—ñƒsÓýËÃ;ù¤öCÑîÔÕ ¦Æ[2–O±{×]ŒŠ†ŒI…kèAQzU·“7~ùç ¥^Cq;°UXˆ¹V§ñg'~¨jÒá4ŽÆYÇi î\‚¯ðÎk§¨ôAçŠØLÇŒƒw¢jÍ.ž!·:wƒðê|çM„Êê’=qišÜïO<Áã·¿½Rÿœ¦k.Ñ#kŒ¼ÝkÎA˜ƒØEi˜g{lô*ŠÓÄû—G¡³Ç@“9âßyå1À>ÅPÚ¹çú¸KíŠÓ¹"NÇÙáXäÆˆ;OQb¥î¬šÝé?üqD‘³»›Å‘‡é7ªZÔ/±Þëu™C$k§ó›©\þØ °LoÏ®¿ˆÝŒ˜ò™B«yr}`ò¡)EÂJEŸzÿë_îm^]P ®u/,:^íè±F}óód5l1.šæ>ÐÀhq%<ˆý¥ò¥n âü¦ö5Ëýß¡f×~óÀåode¨ö¸ `Þ¡ýˆšØ*xWÚZû¡ÎlZÅ gçË0äµÑÜWû.bÿz;È ·ïЭ{чV´ùݪ©®Õ:üËçýïÕÞ ô²`óòà¢þz…‹˜ Ÿw®èyßÛ[K}¯õÉ—8ÑÞìÍ—øô¼·GèqŒ&>òq©ô†_.,uÇÉåï§ýßÌY¨+§ßé¬ýû½âÈsÓÍHŒþ5ÓôºÍé×ÚŒ:æV{î©i˜Ö4týzÝšùŒÆzºÚ7ÝÚ\ž«˜?xÐJÍÓŸ¦€ÅÁŸàèi¤n^æVàž$œlÛÄøúÕªÚSŒ÷úñ°‡™?‰Cô°³Ãÿþq/¶ôÊ+Öå¿É#÷Ìý]Vo¾<.[ߨ×ÄZ½'CçÙá2„cÙ<–]½ûÈz½’í[õ?öd„ÓÐë¡©ÀnïgÅß#¡½þ<´Gö`Ðnj"|Š´^û¥c„”m‡É4w,j-ÇɷɈI‰Ör=á_ôáÖŒ¼&ƒœ?^ÝL^פyòÜéüöË é}ëÜ~*çÎ-³‡$½VVtxÞ16²¿V‰ Á _Qç*—w¦v|9ì“M´?s®} ©KT{}:8Î9“O!àÂj¼""ÝGèO<:÷ÏI-ÒkÀIü1õ.ý2—Ž‚øñðôÂÁˆPFÅéÆì5Îä¢\Éšu½†sPcªV4‡ÉFŽîT˜â·ëÃË7l\â,±ÕQÂø94p*‡ê}bÈGãhxˆ¬yÿãg—ò7˜èä›;Æ®¼¢ÅWªû_®á"ʽˀ«ke›p·ø}ô¡ª™'¶ a¯1_&©L|«g(zëXÇ›££· 8´FC§¯Ð[G~a§ëóÆh¦a@‘`4ï3+½«3G”  õ*c^9pÆ­ò|5CÓ0‘À„C­Ë|CµÛP÷TÔ8Õ[õ Æyó‹}u·ð ø*€C—²î%D^÷Œ×oorEê µÓ8‘ßXíZ+üUŸ®W™'ÓQnõßPcî5 E® O/ٞǵé'bð†‰Þ°Ë]v>€dîl¯ÿ+^æõyõ4j¨ø®žû¤þoãM­Aç¿ó¨¹âó!©ú†q/sØ÷³}€Of1<îE±âÛoCË˼z2"f§ÛS#é'l~œUי΋œ©5Ò°¾è.Žûq³ÕŽ'ÐMÅzÎ/««r훦Bᬩ^6Ï¡ãÙTmˆ¢´æ<…]URæÕúÒC4µ½Òõ·ÿž>ìÄëlQ÷ËE ’'Ÿ‘¾Üà5Ý9Ç:‹Qá-õ+w%=$4»tVÔGJÍ–Ë0³æ} •T› Œ"ƒ-œ] Föé=„½æøögU‡þ-‡Ò'àì6´÷"Û¢ž¾îˆG³µTOf Ï®Y×åöÀçetœ^Cç\WF^hÖÂzë83¨qGé@é|ìlÐùá5À,ä5 „rC×Ë2^;þÜi9–›®˜mvúØØÍ¨ŠÚ„ƒ~ê>ÏÓ<¿¯8ÛF®ÀŒc厲@Ãyêw/ãCÓz3Xæ¨ o‚èÄš4S5½yâNŠ=P~E]w}f|ŸtÇìÌkƒuÝä\uØõ„!µÃz«$Ð_ ‡cÍà1ãúr}4½†ïQpÓÏãàqL~ºTêéRÐû"÷æÏo¨§eú´SúÚEäW´. ·ªöÅ3E˜uþŽ@¹r™£¦™úÓ^5ÈÚE!ufÈIü$û†òËŒôË­¶êÊâV¥ë ·Šóݾ<îÕBÞÿýt/ƒÎïÐ2p^ï"ï…ìm­7:æ‚?ó >¨ š+ ágUoRož^oŸ‚zEv´ýÕúz3û+ åó»N‡™Åç³aÎØw­ÿ-ø¦’Y‡Žp¿c;ÿò¦žë’hæw=z…Î|ŸU»“ú-œoäõ=;^MèNù¸òaíù”]™S#"¤¾›=z™'y)žM¨^¾<ñ¡ü>ùߘ,¸VºH˜ÄQS€°·¹Yÿ—{H“i1&²õn³Š½p¶QÜgî«Ö޼KG>M-2¦œlåëz|ËFöýàAYbY‡+!”Ežz–ªëÀ¨¿nò×úD])ñ¢»ø#ëÏ,âçEMݼÄ0gkç!ÜìdT‹"—¸Hû3¢ÓÁbÆ)ÞVE{9é6uGò XžÝæ!†/¡Ò¸À§1õ4Ö°zþyèÚtн_£¯þÀ¼¤©Ïv€Ë˜ýb_ó€¸+Æ•v.·âùRlMêè7{þ‡š›”²|ÁÌ8…ÆØÎÀñQ â|£Ýã½>î 'ª {úÁŸ>ëÎèÍ· U^&M*+ׇó[¶pqµã—î­ƒÉy÷tѦ¨ÕÃq:wÄYv¾VÓZ×/Óÿ‡õæ·Õúßð%Të0G5>²ëÙ—×ýiî-H·Zw*TçóJoÙèÃZ¿Ò×üÁÔæ€˜ð«}Ôͤùƒ¾—…‡³0r°­þ(Ø›ý~ 5¨i*<¹ØÄ¾\éz‘7]‹^S¬eÖ¢ ¶€.Èñ¹•Ú$øQî„ HðÇöe|ç<x:R#”!Jr>qzÿˆ¥2î4n¶ó§vlfÊl [áX¤éE1i=í^¡ìê<Œ ©FW:ÝŸX~#–e:Ê/;çMóh+ß”ö²@3\áÙµºM±KëИ±çšÆGŸ´š ®ãØCÙEU¾ŒFWš¾¿ÍqÔÛC£à®¥wÀ5¿Ä‡óû':ŸËÓp:ìV<»Kc¥³Apï' wá9ÎôjÙÂÓ»u¾FŽñ4òåíY|yæÃGWø]sM#FzùUb¢¿™U4»ïž~ÂPþtPæ¡/nÞ¶“†±Ø±5Ío‰frS[ï&úùÓÛãnåüK|>|ôÔÉv=ëVãà ÖÕû o§w}üa÷½@ž¿îu§2&ÝaëÚùëÞµ«eÿâ¬y,7”]JæéM5 {¡„б^×õÁšv%?ŽäX‹"Dm|©xÓuŲ׀¶—YÉ›JÃtƒô\Z;^H|ïÀ)ä×[oôº¡y,è¨òne÷Þ®mç`¸/åT^‹çÁ#”ÊeÄ»®¹è˜±8h™·Å÷õóAýùæŽúÉn1†c ÿ=lVÃïKÁõ§Ru(˜Þ ”šµÕ-¦Ëo~âÇtû=]¿†Îí±>™kåÏ/ƒ_Óï ?%ùy)ÐëT.ÐNשKt3 ?ýÇtAõtñ­‡Ÿ±¯ièk@Š5œüg? f¿‰3²¶â ÷< Ä×ìûom̯øªym,©l>̼¬ÎM¡`zõñ…Þ:à4üÆÓi( ÄóÆ‚Ð)þmÖ ˜”‚—÷ø°nÔS¼²2GÇ¿=†YÅ)½:CI©Ñæáíû÷—öŠìÁߢ§×+¢Øšâפ? “öÝ¿võ¥î‚þPà£9ôºúÑñ‡µœúo'ÊãåX’–qÊòÛ»ÓŸÞàÉô aÎu÷lœð²mÑÎÛèoë/þÄ>‡/ÈxÃI&d b1޼¬#Ñßצ^ÐÁ0¸D²ü·â+¼ú¯¸a0Bf2Ïþ›üW¬©€ÚÓ—)I­`jÅ8 ìì]¾ºßà=WíJV~+»Ù¼ÃÄý§Y+Ðu›ð³/":ïÆ̸ïq±gb=½îÇM²JÔ£tçjû%Hí¿Â“8“ÉÖ_ýgˆõL(õ·ÏÌ ^>I2ùa96ÿíj±ÿö–ÎñgøÑœŒRñçð«ÿ˜r^—^Ó—|]ŸÝÜ©Ñ͞ǂwÞõÇ¿%‰¿o?Cô2:¯*Ságÿ>>:íÕ¦K’ì "¸Ó°1d¿âƒ[xôš‡(è5<šæÁM~Å4Ök@ΰ{TOÇgC7±“År:†y‘RÞ5ý|‰-‚K\cóf_JÂ!¨±?stŠCS¥×ãâ¡‹2(nŒ…î GÀÜBMÖÂ:u&w{zÛñéIå¯ìZq|bú·ëÆ$˜¢iü€ÆGR¹«ði”VWsè«<ÓsÅ¿ömáÿJû–å»–íþmã·£};½l]žµ}]ÓЦ•£Ë‚ÆZØ?3¿­½æ©ßêÐz-¡£Ã sì=õ¯~õÖ-ôµæþµ„Rl&Àš0ƒõèå2Çu­•oüš¬4•8ÞÙ¿ýë>ô²A±u€ªÒz7aÊD¢6ô¶oç@ùŠÎpè*³{¯bCuÜjÒ>Ò!ñë~`³Çk“Z;.ÖåÙÇ$Ë*RÇÊ:΄¬vAk¾@°–þõ´º6­µŽu#!†UØ"'ôI¤ã™M’L]‘(PŒˆ&V;ôŠta"ùÞñ› Á™uE¢Èx¡Ã¾FÌ&à;u6, GÙž¥^v!£M¬D¦Í­õùÌ ONÏ\ñ‹°ðaç&>„,’G´£âê!_Ù cšuÃÿ»ŒÓï{kˆ²B~ž@̶÷ÆéZ[­µÁƒjµ°66YÍòù<³*©¢r t#ÔŽÿ›~ª8 ‡•êè<Ÿ¥Qym Ugk2áìWÏ>äÉ&ÕŠÊpPŠGÌÔS+ÉÕ[zÖÜ,]“‡´MK¦(ó–S°S]é­³ãP8REQÐzÜÚÿ^¶Îk†‰À q˜ã)ÓÚa„C£Š*ÛÙ¨Ñ~Çóèö ÑŠM--‘×ÒFæ\ÈlQ§àZ`ª›1þº¬Ï3 lN]ù×Ãè¹u(ÖådL&Ye‘¶NÀ#ÒªõÒ=ª’|† k6k$¥«VÒS e=;†O‹UçÒXk)>³ÆýÙà>Ûj#ÝX¦¨TÖ 2În®N›‡ö :1Êãyú¨Ñ-‚/ÅÛ¨“;ÿ· GPÏKWNç6vIÙYGËGµt*«¦Ðuú)FãÜ/;´éš¬ÓDTpîVøhYhô«²Øº/Ö¶±8Åië}í hÃWj`¥Ô5@#ƒ5U¼ClscÅ5Òx­§«ÜÔø«‰{Sº„lMÁ”Öº6åµ’õNòøÖž7à6ÀL¡ÜÜØ¬t{í|n ë“„›m•·6hÃIƒªÐ¶6NßáÆî”zSfµ uNÆ–umšÆ!^k³umBæp¬Ë&µ6V­Þkû}УY72ÔÖÌRÓÍ@™úb¹Ö`Ï[?#³ ±6ÀKuv]šÆÚšæo_vLˆõk¥dSv ,æþ<ð@ÔÖ¶)JUÝë¹G/°UÍ`Ús;šê9ˆ´Bþ€„nÏm¬ tìуZ²áNµÆ™Ö=¢n[œÎF³E·cßrû‡Ù‰ñlã4Ìjœ“ÿdˆÜ0`ðH;a*Xϳ‰TÓà¨Ï)6ÍY‘ aœ,»Zƒ¼Ü`šÅŸ]<Öí$¢œêI—¨<(àë¶{·hqos=@ðcYC?eãD€‘Ú$ ­±N#BjÜH¶Úš—rº™RÓH©Í·Z×#Uµ>k §R35Ce¿“(^Ùý¢ B[¡½a N’¸ÑÖÆòêÖÀT2ÈOºþþñ‚uJ#qj‘›yÍ"3Í]hØO˜c“ÒèV\߯å*XjòaÜ\‹ZÉõØ10“v8ëN,ïâÝìÇÚ÷³Sš Š"Þ¦ÎÊøãl°BÌùx5Ͷ™2ªb™éfWè© ¢ Ðd!hÑí¿$A}ºuß7âå@ÕR»ÍnEMÚ&ì´ù™S„äBÃr¦'›KV/VƒKîXk*lËßİ4‰hRUT“ÝÆV»pI¦‰¨'7¾Ìçâ^*]ÖµYjý%¬ºmªÂã¢)ÏFØ•þ'õIbM¸ñ¢#ÓžÀÔ²ÐO1ÉWÿB¹7«µ/ð¤hØ›(Z1A %RrøÙ•ÛÚm±:ª¼ë“•H¸=Ó›ú4UÝñ¿÷†ÎÆïÖyë:aä r/5Ìì<¢ Z ¾© í9@vlÑ=Û(–‡è¡ŒŽW˜>I´Ð¼7Í”U}5®m°dèÕ*ÊÞTOÓ³é@ eiº¹:Z;ˆ§yôM€wc¢C©bTÈtM” jŸ¢WÐ~jC…(ÔÆ&W£ÐÉZÁ‹µFJrñNY†1ÝEp@4"¬{ã«L§y«ÖÈÑ$pk±ÁAh³J=ˆpAx šÐUÍÑ–Á^¤µ¨zÈ«p…E# ×fÃK÷4 ,õŽ?'a€+Ýq¨î8›•oÖ‹ºžKJ1‚ªÍвªèêRÔohz¤×”g Š6 ¡êÜÝšoŒ¾ö<8œù-wŠjoÛH››Ï_©8Zøpqµ€´¦( Ll4{«Ü¸Ð]Rç©ÒìéqÚ$rS1YÅ3/>ÐîIR ´ñamÕ7Ë0ÖO`ŸÖ»ÉÈѤ³y°P4þ; £iòZ®Ð!§‡´BÖ&™‡©uϜ˘hY-J«õ”y¨}j‚ ­â›6͘ñѸëÌ¢87pó±›Cpø Æ]ÚœXc‡nq™Ý6øAê«–/Þ<šNøœêΠæÅ<Í>A¶³Ø”†ï6´BÒð±ågqþ¬*îÍ,7- zÓƒÒŒÅÂ.w9¢=¡OQTeºßU“™{ J ÔD=0®Û‹õ)’ /U3Q›¨Â (l‚µCŠSuì‹…{ÎĈ›º/ˆsáY]7 >xÜSGaý¼{fh«®b{¨^Z‹& ©8>Äçm÷übȃtKßTicþ›ÛÚhM’ÓÞÒ£n™“hçjÂŽU¼;о…ÿðùB4Á/¯´‘J&ƒä¬TB\?ä ø^Ô6øËöP‡žªÝ ì­Ç­y`¥é+±)ËǤ™ê¦ùt1Ê«Nî[3d:po]Da71A€¹Âô¨ÿº ¹«„è¦2øHÌ?€üXë»àJ¯Í¡]p¥5ØànH"6o¹E}'•oÓƒ+Ѧ€¦Í¦ ³³‡6‡k>s¥7€ð¬šÚ«)– ¬E8—³=D½ÑâlÖ±Ñj`(ûÅiïÈ^Á<Çf‚ÜPÀðˆiàê)Ùu¥ÈP¦Õ\E•‘6BQÊèj"5˜}eN¼¯lcIn%`“Ï‹^EX„€Tt]ZWe9ê§gŽO ^ˆ³¼°šÏ¤ñ‡h’]“~mžžjj^wN>7ÄÄŒþ`ìĤ&¬I±.bŸ[2›­QbÆ9špAÂ3¬†—жLsÑ5eÆsM§¤êËêȃº¨‹eŽê1ð†® ´“îCS5\5â”hÌèrmÔ•ÿ?mOb µþö¸ ýz(ŸÐ ‹¿Ðxtcz2é³½ ͆€ìpÚä4ņp«‘›Fî€/"‰ì&ƒLÐ!pÒ@NÍHA¯0|ÔÌP0‰Û|õ&•8f€”è“crŽnzTSåèê@¾ - 0BÂ-SáˆË*z˜æ–H_) :?¤82ø uu¸ÙY …­ÚïÄÔaU÷¡iC‰üÖÔ¹¿ì’Ò€º1‡óÛ9d©×Ü“þÁ#H ƒ¦bP×$–.%r;Ë ËИWs,kUݧv’èYŒ\Èí'§]Vm ¥ÜšcžðÚŒ°,¡eà q(sµ§™•墵t©@]¤J &LÈÈ I3D^K– .âÕÑUÖЪY¹ Á‡Sj-!EߨRbýu+y4Ìl’¤¥9›y§£Î3†¯ëk²JSdÖãS11”° ´H ƒ§YbAæÈǪÍ­ê.áG>ꪼ‹ä 482Ýœ0)uBBó)†[Ŷ (oRµu>¢BAOT£u¹ô»ÊâQ•ˆš¬•¥u ¹žH‚@«PFÓTÃXÌE™ûÖt^QÏú`ÖiË$ú²ñê–N×—+tÂÙlW 6MªñÅæ7lÆÜ‡ac>¿¾,Õ€L˜l“fe&sûŠQ목Ýæþ ‹û+Ö‘à°4¹ƒEÊpûéÄᣋ>c‚µ+ÛÕ=.Р&‰}4òœ°è ÔpVÁغ¿×Ð3­}Idé¡x:ÈVs˜U—µ8uƒáÉ®˜×ÊÅF#%ØIu|š§œšOÚ¨,Î'ÑÕ³!eëVµ¹üÈ&“Ïž´Åðëמ„͈ö4{Ü©zž½‘ªÉWfªQ+kVêy]º6[9n BWfÄw"›ú57F„<Ù:¤€v“þ‹‡Ñ¢ߘ}>N8  CуžñÑ8 ]û=,æeI4‰^’ì ºtBÆm‘ð)AÎwDÞ¶ÍN‰¨óeí&}/š„5»Ï{uI`ÅêX›M‹%6¸ÛT»äR—Ã6-`cVãÒõô kK?[¼|.Wf¢ENØüà(>k ¥û¿Mle{­„cUËí]Ž[ç¦0w늬®Õå†>·=Í«„t‰^ÚdY»qg#1ÜÃܸD8°pôtbÂ…Ë1yǧ,ùï˜íÒ¼<,öod,$CáG5„/‹-¿œ™Yëæ>”N p+³È MM¦.ÔrÂÙ±µ–à쯛$ UG¬È®5 këâ㞃‚?tÓ®H^l£é@6¯Ç0Ε›¥Ãø;-!Ÿtž®y·3n)ÁêW’e4l‰Ø|ûW KN7h_£ŒAM¨4·[ü¤âQ0=ɇ#ï|®Øé°ï”W¦ê+’ôC˜•´v@­TpXÂ¥ÆÑ¬R‹šš d¯¶Ug$(ªüÎŽ.þ<ܯi0s½;%s„õáPÙöòf~¹Ë7‰UÙ“@…‰:ì—‚ ¼¯º.yX»”m4аrÀ dÜ.X(W%—WYÊ“½ù‘ðOÄéA”»a-)Y&Ÿ~ËÁ,¸8 X5]‘k¿›Ü=£l‘ª.u¾a§ø>³u¡'zÊb<¼Êf›Q™C”= صù¾öéÂᣵƒe•´²Ì¶@o"¶P‰„_k×ÎodðãŒ,¦ël4?¶Bý°­QÛÑ2lÓýà ۬¸Fûð-Q¾4r8[skï ¤Ú)±d£nE:`i§¯ªQ‰Êî‚&»¥)CØQYmzE!^vKº ÝÈûRÅK16Cj¬È´NñA+BóŸ„aÅ ;¶®:á¤aã„®?’Hµ]–ÖôØVã¹óhúäØt!X´½2•“ÖT ´$’_—BzHÒÈg⎀«þÀ í f­I³›àöä¾&ßÁΜéÞÃÃê§ešÕ ƒÁv‘F? ßMŒ4_4¯Áù¶‰APíb·ùMnb]=i!ûרÞ6Û󻆌sî@an-…úpË”£ÑFh-+KØááNܪ[e¬t©A0Z «.Ùö1‹oü¦[³)By´A7 ¸›ßWíVÌÍ„÷à[­7c÷C•r=SŒWVžibaû[:Çí[\´`nÂ=‡ªI·ÆCHbÅA0Àá“+’ÝóÛb¾?¢äÄL’Høv†–Z[»°Q¼,2ûʵLˆ{<òÙYºDoBv‰µ?kØ0Œ­&ͪŠMÃÂ> 3l“ÎÁÏã±öh*¸9 º•Y{¬\Wn8)>ûjZÀŸ˜ÃJ—aKáržš´‡®|.9%K@áGþ­r³m‘Ái:å8·Ðb"g3?NAÔ +»ëJ›¿¯t—N®]» YÓ)dWwlöÓLS›Ú¡¾#TèÀÎ2q#Ag“]"¨ä —\šª›ó ¬‡…“ÃÀã4¨iÚÊÖÆUSåâaÛú„˜`p;L×Id[|8ï¶µªð~p™¨³ë¦„l°KØ(ÌÀ\Øç²ôI%€HP†ã`‹èµz¸-AÀ#qP•ä‰Å›tÛÊÆêÕ—u1Íu?’%Ùè$©!Ÿ§.KdúÉÕ;»®üÈRÇ* Ý‚d?ä¥Eñ (êºvÙí®l³tXƒRäT[ïé©¢ôì&ø’®^_Ïãòtª®Œ,=‹5{–‘ÁiÈ7ý"+FGS1² U.'(‹j6¦š¹–GW¥.’PÛD¦itšéAÀ–ôã ë¼ô­èçN­ß˜¹¾ldMZ5+°ÁXy¬Cò*'tXGMtsÊöD¯È l‹l !µ$úôÇ34¡’˜á“e8C©ÁŠØ‹…›Ýœ(YÓ3›sR‰…cF ûнè6KgÛ9A7°vT;oÀ,(òË‹§ i'Ø„:¢RÑh}Q‡q1üz8óß1˜Jæ)lÏ…Z#³Þ¡-¨›…n㉥éÓspnOåšòfLy;Ìz0p„èvݹ(g›!×󃚯Gƒ×U|*ö•Áþ…«è‘Þ°æ·ŸÄ6ô(‹¥J8¨5±ô”ú’lsò\”4  ÜÎ(ØÐ¡ž:vËYdßÜæjø“]2¤—õ›¹þ5Ã{o}Ò鉥&ˆ»HEz1 ´ñu—h‹8—\„ƒÆ »ØÇQËÓ=õ¼šÁçgdTlÕm‘'vø¬b,Ì’5ñPßAÇxn5ñ=:.1HäF ª«¡ž_ë©‹itdnœW‘˜ªeñƒ¸§¤.‚;iu}ýØ}ßb Ž"O+ê주è&kŒ +ÔwŽÕ¬!#”pϺ‹'/‡¹wn/V5‚ ¥°¢ïÁ´lfî™xîz‘}Æ|rnÜõŒ¡y.EÎn»º¬[Ç8k=ux=¸Å´:‡ð¯ŽÏc$ÅS\Ø,´R|6`“¥ÙˈˆD·„‹‹¬Q'eöè®gëºêfZÚœÍvâA±Çõ•Êüos »+Ä}žÅC]щCÆè†|º°²l«îöWqì&: Á|-Ê •°eze¾ìDbþD C{CÇ…žtŒŠüñªa…‰jY”„÷‘¸ ¯Uä9<vÈÐæ²°ˆ#¹YëÄüR%ýe!æÔó+cö³ !MÁ¼²Ñ!«&KHuá\·âR¶»3Ç*d92SÁÈ•a W êÁU&ÌLQ¸Oìe²ë©´ÄW=ß½ÌÝ„ÝE>S— ¶…¨Ê’~ºŠZÃ9f#YH=‰ÍŠ\ýùÆYð3ÇÝ@A«žâØ4ÿ¿îÀ«ìYjäÜB¤{G“ê’Ì¢pÖ’çGÜ(CªÉ&Ÿ®w©H5«º§ Ó/X˜ö—ïç©ùQݲÐP’žé»#Ñ<œ ºå`R–#,ÌØ•!]cQÀŠC¶+Ö¬@JÝÈÇ3‹°ËÙT9Q»÷å­‹d'OF!LÐÀþ¤¡8²îÓÁá‰~d‡ €ëíbeƽéœþÃFNJcÁöh^nÞyh´³âH¬9<¾j,ç$OSPØ‘½V²¶ éÆš¸„´Òé¢ùw.¨r¦.m¼|0wöì'€Ó o&$ñêúûkµÌà"™zžÒËqª)ÁLiÜšÔCn«îXOnŒÞ 7Lø*Y‘wlòµkz‚känÍ–³ 2˜.ܹ+㦊,kÞÌL?÷¥¯³ì[¿óÀ6Ý«}vc°sï)weÁK<ݰÙdþmç¦?š¬Çt¯…Oë‚ÙŠÇdóâfMÒ0 Ôuh[–¸•E¶ $_Þ‡¿.‘&¸!RÕwÔ&“›,áÈÞZ9Qpö+éŠàçFå¼!áÝ5Ñ1¦A>í@®õ)Q¡¡1Ï~Þ•Ë“§OýX³n¤Àšõ>nOäúm’5\N°ûÒ®aÙAÒœëàù莆ƒÛ ðôÌ9â+ès3»ÙйíqHå`Ì(ëQIY¯:Nó(¥ëøÄw@fv{‡\ª#!ª†z®·.]ÄeÙ# ×’…e»+Î$ñÌ>òð²)uYdz£²Ð“ÕÅãa89R×|9C³ê†¶üÜd[öÉÊ‚.¼èæ ˜ki}±Jƒ­r4ïXwƒ{ƒTÁª÷ìyär=ØI£‰D=N{kh¤(>ºT‰»e½ë€!^ =]@måÈТ›½ ¥ä(ÜH#Ru1ßb¸F¹=B÷Íc™U–¿ 3Œ¬Lì’™ËpY Ž˜ÿ$i9߉òÔûyšûÌCK®zWz Ž’èiG¤pœ!ûyhËÊD,"¶™ÈöK±é¯g—z”¨X¶¨§ýÎ<™pfA>6çasÝmÊ~¿CH«¤¬C¾Æ¦":Z6q&TÉp' È¹kˆµ´\z \ýÀ–†éª˜.ØCÛ¼lR=ä@õ¢'3ÙQqU*êÝ%Í@øv¸UULy! v]¹áÝ"šN:xä÷à!»%é] ) ›WS`ÓÎÏ\˜8‰ÂÕØCêè#“'yÆ‚‹Úd@¨{>n8Ø©ˆå,Vs^@‡´’p7O›š êp¸eͺ\Ç3éµ'ÎãÔäªhe5ð²{.1ÈÜÛÂϧ,Ⱦ¨Æ«aWpÖKZÚdÃ=9IOg0@‘­lBJ3=8¤~v!£6PQnv†Z«z¬‘Jb§ZH …\ø±?ûPÁ=£Êu^hp\|% bµ_ £ iÝl‹—¨¼?yœ5êç%ßISm§Ë¤ø©Y f™íþXÎÄs’›8€\lÎðG²áŽ*¿d™^Cx:­'¹ ‡±ýP—-€ìàã.sœGHê.âŠ#ß×´ð¶îÂ]"’ž ò™Ê6Èx泫ÊtKÛ¢÷¹(ÐÔSÑE/qBÀщ·À½Y adå×µ}6mOžÓse*G‡Ê‘]Z´Š+ ÛéÔq¿$þ=ŠÆ)à@˜Æ:²vzÚšq‡Œ—¬F"†ä¹t¤ë—æÊñ|»ýI÷=P n÷qøÄ„]ØB´ékáùXÜÁ%³1ºÉ[¶-áV§Ê-ÿ¼ ]|—¡ØÊa¢ÁßÃί“üž8W£E¥œÂµo¢žzËÖŠ[R ûzµÁÅœe7g%\·T%IRÕÔ¦E.—Ô¸£“sã¦Aº(9\ôÔ«™wÉ{,r…^í¢l`+Ë‚ÊMÔ~>º†¢$#°š'YG¸Ò(º°yÀ ö]ê\sÔæÓ¨ÚÇ–zØ dXe£Ž5+âÁ§¢zzZ çévÄ÷àÔÄ.Fj鈬Ê[Ö°~Þoç]‰=nÝRfÍìpŸ™cC­‹Ú`.¶`.¸ºIǯðî$úV<£#œŽ;ժń¨õ”EZz=$£šp!ÃJk®ç#¨‚åº@1°Øw­¶6Ù€²¤å2ÂNUud_¹ÚƒöB@掆GóuÔ¿ž‰#H‡&ލÄÊ»ßÍ͹9èüÈv;ÍU¹.Õ¹31™}·Tv¹Õ2ilc–K´6-H·†0°4úØ„'©WO«¨§ÑI±;G׃i9µ…fÔíè µ21ÉîˆK ‡Œn>V;7î;âõ`¸}{”79¦ºÕ§:NWOLÔí¹ÑѼŠh‡n¿Œt%Z¿uU¯38êÔŠ¿ ñNêY*&@ª;Ž ;ÔJˆµzRyºaÉr«’N9Á }Úa~e8[µ$…ᑸû­´c$µúˆô:NÙdƒ{–ºë|’M}’è ¯ƒˆ8v~Ⱥ™Ü';Bô==¡·9¸3%ÂÁåѲ:zÅÆ®»ðÞv/ 0¡ˆ\0‹\z@“£¢¢[×}Эɮq%«pEúÄN=@MªÁFbJ梄c“œ—À°Z½ÎÊ~mæp¯i·iÑ]Ùr\CT"Mųß6Öõ¢¸‚YòËÈ2I~ûÙ/0ì<•žz=ƒ GÂ'A)¼å§åɈp*é½_Ý8úÛL³K(l¯^ã¸^"dí–˺ݹ²W6‰PnòO]ÄGôpEÎÄM¾pNß 7æÃ¼"¬þŠóû°L÷ ËîuÙ!Fo™½J8éœ)Œ»*ãjºiªn ³hžÞ©:-ÄùYŸýRÌèOÊÆeq”ì lÇ@U ¬’Þ6…¾»±§º±1nì‘5룘Iêý•æ:éÍĶ+„!Y«¥%âtÔè¯X¤¤š˜‹:8ùzÿ¦¬x©êéÙ£;ÿẴDÑ—à^k“QÕ»ÞZ=rÑ.] f}3æ.‚£]‚‰]•*Á—Þ«$qûÕÓ5Þsê!ýÃïKÝTÚe âÜ>r·\‡[®ŠZ´ôüó¯r!ÜRì73} ¹RÔ½ÑWž×5þA‹vÎL‹UN óešÞãï]j÷Á7i_>‡Yd×®Ô_"Ozh$ÕöÉ+SÏꋬbËØýG²š¶„ãOxb3„œa‚[jÊŠ«ÿæÆQ‚Ž©o}êõ¸ŒÁeíS&Ñ´–ppú›Õ«tÓAê=K™Ï¹aõXú°ÉÉ"`AUì‘b»wƒm«><´N’Î1§ý§Áǧÿ†Úh“·ö2³Ãȳk%™ÌÀŽ£­ó€ü.Žr©ÏÉm^—Éí‚ÉuŸt¿s‡ç V¤½íaã‘wF:ËBÏr&ïéàGößÜttÒãøkC;?ñ]Å”#'ǵõEh4í‚–½8WXåMþì2MäÅ–ÈØ<Ý&}1;ÐA.QԘʓ9›†êL±?/¨¯Ï­]ì6êDmcŠA¼(˜ð\üá½õ&’fùúoQÞý÷êÊ ÛÅ®›³ fõ7Žr¬¼°‹÷ƒ×¨Í—m^sÄúâµó?4m‹SôInŽJˆÕO»Æé]ý”b}X¿‰n«ry/®kð÷Vúk Û?v¾$llÍI¼>l¢HIVºº1Êd_öŠ™»÷±:íª~S¡‡ÓúS¼ò.ÞG^xáêÄúäYs;HWónÓ ÂMwxqjaëö7¤Â VHqæ› VÞ¾Î\üQŒÇü†<»`¹‘”yå/ä|£AÍ™g·±Ë)q"”á„l~Âmõ9ñ9ެ¹Q ÄŽÜtÐ[IruPÂ÷„Œ@U@€„„ýØ­kõˆ«Þ^—WNŽ·Ëò‚*à! ÝJpqR9£­Î«h™"®#"¼´éÎRT²ò6p;64¤M„7‘¤ÊóÏÜs² Ÿ$N/_IÒ!¾Ò›YìH½#Wõ$y=ac¦*z¦›“³¨c‚-«»…:á`yÊ„A”¬\ŠHõÖ£Ò=8mðËù·®Áòg²V™”&ËŸU¸)rpæü»°ì D)6:§º›Æb¥õÎrm†®tžnùØUfLȪ',t$QN«ÚÇ”ÏhRpŸNN«¬CÑIØl›°Ý>ãv‚¼J\„ËÓA~ߢ³KL®æ®Âaä]Rüvë…!¾¸½ŽÎOÆ ÄT·ÎÐÿ8 ˜òÜ{̸Ѥ8íªGV»@M”’u°Í=J+Ó%»f€uÌ©fePá‘­û1¸Ä%­Œ7“¼¢$7f¯"~^بûWó|ƒ5—kDd»EÚ5C(ØHZæ…§Ñ’(/K J«zÆ¡UãLŸkäèT̓[yzŒ[˜7ž@ro ››N"÷5D¸>:ã8_cPp¼Úû”9‹¼R-d,w†Q³¼¥"ñ”…ëߤSÄ‘ÐP9凣°iå5°Õ}–ýè“OGv¿J'š8cŸzÆN·„=Ý)E×pÕ?¯‡@.!vÛ%ûq?ƒ:àÖxu äȸ¥uÒðZÄ ŠbJ´ÎâÉC°KRÕ¾õе+Wì†Ë멎Í.Æú`0¨œ’åY¬9®†LØ4œ±Ÿ>¥h,d•ô öfñ<·ql$C;Ÿœ9ˆ̤*‘3îÊH8[”é™ì"P+ý´œèaÕicŠâ²S‹R=gAs¼i¦GÈØ§ª ãÓÁÌ'Ë,­´”FâÍ.¸º7¯t3󲦑ÙÓž;§dñË2¤0û8Ì–piG:j Š—&‘±UÜèÒ£­ÃšåžÒ„{WzÈ™á¬åÌMtP÷µ'Û²9M¸Í7' ½’{îYÎì~ܾjê£ø‹i h¹S÷r-*rhÀ¸ÅT¤çð3ïÌMa6›Ù¹²ðò¾Qwà€IÚ©…òà¥Ó†‹ +üä6H/®——¤¾W–xgÚìd¢Â‘ØtÞæyxø"¹ìJJYºN)÷)Tá¹$—Ëöˆž y†À„­§+t›ªMÜ㱄&‰¯~Á…Y‚ ³€VI‰†u™Œp!ÑØñ<ÌÊ­šN\‡c‘œ:4TT®ÕÔä §gÖ£û¨É½jÙ¶­sëNé€Ôy‘ìÁþZ(2*o¹qyKÉj-&ÜêÁˆö«9`ket•Ù|uDáu’Å9åbØŠ#èVsæs\ WuãÞ“}ZlÏk/Äú„'€÷2ÔÙÄyÀv‚Ãjù?œØÉCªæ8z/úJ´¦]ÜnŸ&>¼[¥”˜öà+/*_`R‘qÑi×Fªö²E;»Šƒ‘³D™[]#ž3rˆ –¸R—m¥µ®^w&¥ïƒàâD–ÄaNÇ©AeJ‡.RÎ$ ¶J7¶@$ì=ÉÌ÷”E³JØûŸ“™|¬%œ&È|ÏDÖ(*ÉÉø6»Ç52 ;êòÂC0’/äú¶T'nã8„ ø.°#çfÝꆨH—%ºðÔ§ ´x“r÷ÙÖ‹ò"êu‹ÈÏ’LÊt•.n´-IGY7×]\¤ŽN¯e†ß²Ñ`¸ÎØ°ŠŠx^uÕ»©Ä³0†T _b?.uN8x›±á }o7ñ@Äm¨{TÓG°\ãÛŠøõ»ètîÀÆUÜ”™¡ ÎZen Æ¹—Tzd‹S89$%q\Ö,/–öR¥g¹22®¢¤aè,¹Ò#x)£”Œ«ír*êÙ \Íqø6i½ºÎIH´«£N2j$ƨ‚l OCuö®’¤)K çÀózD ?×¢f\#8Â×fÆ*8ZžÇdoF†­‰›†—èenZ7qŽ3,‚^3]'¼E&Ùýäîh¼ãÎäi»,×K5¯ué˜_ƒmekîìé'ÑbŒY³† áI]ƒˆké _}0PRIÎ)y¶¯qÙ1áh‹%Òɉ&Ü “ºxÔ¬âNefà4¯ûvQ] Û#Ó.¡UYB 'ª2n%î‘<˜àÈý=p礓ˆÕJ/â•&¼˼RÝ8’”‘2÷,c³`Â>éÜ$#C—Xý“CŠ–ÃŒ¯øÒkõìŽñ±d"ÅjçUT¸jŒ³¯âÒМ<ªÍ¼…7ï$jÓ=çH20ÓÉlQÚÓ2©ÅÇ àAl’½¯Ç˜§}²x {Hp²¸ñ”d^ ø…a °WŽÕ¸ Sw.1@Ä-'ö3¤,ò+jÒY™-3ãª,;J2ÏàGaWÍKˆÓNÔ4¥ìL ã|á Ü@¼È©é;QMY¤ZS2f£(ÃBbBä"Fó¾LEblÌZkwÖ«š~ØJñNR mÂs/\=H<ÃÝ&¼¹[ä™w©Bð5Ÿ© nªÐ5¼ˆëÆ[¹jÂ}t;ò&hÌ,ñ¹Õ [IQîæn}4á’±&{piãòj€ãÖ•„kŸ3òÀyÕ$Ô^ÜI Úti*¥]B5 T5Mf®ÉÁKÌkOÿç$vÿÐEûtÒÿÊÌ÷¶ÍÓýaqÉZɽbyI6eìÊU¹4I” uzbI—p&­}IF^Ï’ŠÖé„H²ä#'0òº»—îégK%KGýì–¼èGe¨ ¹ÈƒgNŠ’šEØÒ™p–,qsÓ!ìté”xQW'ë­ÓÇn‹Œ™¸}\QV×^%*“çO— ô)ñkÞ?ã¸R–7,dÝ€ )2×x§Í)3®«Kxá{»¤36^ê»IL ¤ªô6IöIŽÙ³¿º8ÑäDwyÓÆ´U;•cзâÎÅ5>Rñœg Kï©dÓ·æú`^q;Q^‡@Mü„W$¹•Aù.dª¶!ðKY6¤3$ÿä­é0EEö¶Êsi=†%ä¬ù¼´Ñ¾r¯ܱ¢¬È<*/Ý*Ìâ“£pÕSÂi¨Ìwë&DNØà™pÍP*›¥òÊ¥#3i„ÃÙ#®ŽIXaȶ§EÃù°¼¡ µœÐ&9רO:ƒtK42±[ÅÔ¡±‰Íãõ/lB@–Óô y ‰ ™ÓÐ7|Šá–eÙ•¯Zt3ÉíAÜj¥¸Ø'’\ÎæjP#rÆ’s:i™7‹<ņ§ùƒ&¨6eÓC.³t¨ú~1Ü£šx¥ «é•÷ïp™&nñ”€$€vËPø^”ž¦¢1–ÄÃ<û“—“RÇß¹ZкR…`„A­@Ö¸W`•U„•‡R¥7ËÛÎÀ UL$N d^`eÙ~¥ÊÁ(tÕ…4¿\’?“´¿³ì8éPóT‰Ž\HùœyX”$`’TÝátêÛßÓ¡&”Æè8‚¾ª\_å¥^®p]Ö-«kh/§MDLDö û鉭C €˜}=ÏB–å €»*˸M&gœ¢§ÀÒF¶¿…ûz€E‰ªO Cî –èàxåiʤÐ!¼­°Kž]÷ôL’¤Nª²ä³ÚêÈq¡m× kí\v4[¨—Κ é[« E^øÒªû³t^ËðzÕ*MsÌLBJd‘LÆÙÅÖÅ7‡ˆ³Ñpµö9eÞ/b¦#®Ð¨ŸSÔýôš}÷[ŽaÆ&÷òAnLçz²gejD$bZÜn›¹‘¸ê'‹$ºÁ^–B‹å³/åÈ1.%¼– *bï ËûU²%Ä%Ý‹!Äèóv`X²ö%Ý iR­!o·Ë¢/ZÃM_‚˜}EGÌ “¼jrã%ÂC*ú3˜èrJt Ñ9¸<3ì rP…‘äjïVAúvJ7›¦Úwüm²UKÞÐ`öõLì–U!0Ü;/¢Ý}Zg ÙEÂ}\%/îHeQÀÅj®Hããx÷ æӃçhê0ÆwEn‡cæÕ'„qcΑO]t‡BæÍÄÈtÕÉ(,vF«%¦ƒK¾É´™çyxœ;µSZÌu\I \#²ØbŒ¬ÓWÕ}‰K¦6AËgΔ/98™|̙܎ñ›u“s–+aºd‘hå& ÞD€d‘+˜é G[&é-D¬±k’4Ýá\tor.UW¢dkµÔ( •÷Ne›Ö£p«zõ%JÅAâÃÿä&\\DÕ©¹_hPF ˆj[£z÷)&z¼x/MÂÕ"ÙÒ¨ï@ËØL’«¸ÿxaR'ºÂT¶Î ‰»ñeÉ«Ýét3— y=g±gXÏÍÜ}¸¸½ ÓË*6¯Á¾ D°LÀy8(‰ùÓV÷ÈÅJ=oÌ`‚ºI•¯BsÑÉÌøpɉËmIV‡°h’¡dsæ& Él09Æ…#ýVœìX¦Ï™wÖKVR^­’W[ßÊѯ¼r³°g ¤ø;ø¾ÊS©°ÚrºÜ Ý>e•.ÑêûÿÖU^V@Š6«¦­ŠÄ.YT6Ðä¼³XTºæ¼P+óÝs|5$Y×JÅ/)cI7¥5¬HIW&íà“g3:Ü¡”K uRÊ¥¾Ržqž-ç4«¼’@…U¤‰rªÿ)÷vv$ÉåSK§rߪãg%"Ã2  ™2Þõ˜¹þ€e~;~íj7Ô1=DU 7ç¬ÂÏ·¼ªdTø+Ï÷ø‹\¹c ‹ÓYA¦ILL5#”«x…¸†"ãÂÓÄýY2çŒm™9v,ûg]öϲ;ê<-ÌVf2OɯâXGk€âh'#Hbº¸‰“¼¼Sa•W£Õº;–°º’‹xUR1ÄߊŽ33¹hþ§Á¸Ê §½ÍpÕ¶òÊÍ–mJ5‚ñ¤råµÈH e6ä‚FÖW-l eCOPÞÔ·¼«Õ÷gìèÉÜØÄr«,ïÈ©@$ì“ì°õ­ðœ™¬Õ݌ĹêfÅ]@·„µÜƒŒk1„a¸V©  3OI§°ŠApÌR$VÝ…G6Ê·« h¹—¹inM°ðÝ›>Ml2Ïrs©Ê²Q‘#\Gàj‰2§gX÷(«Uv)1p,¢e@¨\;Ó§Ýæš(9A1s§!‚*‰÷Ò¦d-ôI|ÃWî^WÖKÃD£‰é¨GW龜ÅMÜj¿©_‰UaÉÐ\ FÞTÛÑx{ †‹±òA¼Ñ>‹CQh°»/n®ƒë´\äP¨¸´! ',Öäì\¸»‘d2ÏM^ôhV;üCà G` Kôº§‰Ö'µ²°¹Ÿõ’×y+SÑ`/96¬Z›e#g6.îRJ‚pEtªnØEÉÀLqñN{iË¢"7›žTï%ÓÝÃ7aÁ̼›Ó&9Œ·xV…N ꈷ̱m¡“¶ñ饚 ÈHfe\½˜°ÿ'g øh‹Ì3¬€øØ¦VÕ­€™éþÅõôrQ·âÓIÕWvÞ¦Urç.ƒóêÙq]zŠœ!9¬xÆ[w ‹£µ´ã.û®zftéYgÍl*Ì»Š‡&ޏDŠ¥\¹Gò$xoA.G_Ì< »c+û‡ _"ÂCzqC(÷des=E’+‹—ý6U“ì#Ëó\¹C½&w$¸ ˜ëaëÜΕsEbH6þ‹ß{Ò¬ƒaY[!!KƤ?‹™|Ùkœé|?½'f·,jÄ :Ì8ó4í³žÔ[d7¾;Kªã(K\„Ñ9ȶ¨žeKôÏÑÀê¢æZÕW¤o ë öF­O’"-éE™‘`ÈYýª,÷»šGP¤A)/â|Ó…Üù^¾ åÍDOŸÞ)^P“†YŠ˜,oî8uEùO#g\–—a/ß’+”ÌâOd2[•íˉ™ÿÂŠÕ g®“Ûâ ¾…æ6.m¦¡3°ÞéîæUФM@ÙÇV’Þª¦¯ú&¦BËEØV· ÑÕ5ÂÝ:Ü/Vµ’zgçføç|“·§&ëK\¶¾Åäåb¾VÕÑÈ8Ÿph&ÇP’ý¯u Š»3¶I0¿‰÷$—Šš[™7̼w§ÊÛh)Õ܈{ž5½–dÁŸGijưv”DO f®K@Næh '^r>tƒj·Ü[$÷+dAØ6w4 :yÊ3ˆ»hç¥ Ü*ø²:A^Å]'™ (Ɉº0)°W;¹Cm*s>Ëx @•`†µT¢ ƒè¢ÎúO V°=±"þì}^Œzâ (är.(ó=†'+ò €)ªM6æ³çWÚ´F‡tÓÍ&0ÝH“dlÅÐL‰ò—D°Å³¾‘bªéùz5æ×ì\×.Ì#{D27¿„båù*¹»Ž§%ÏAWsܹ|ç¸yØ4—ŒhéÂÔ¸Ä =–¤CËÍ2…ëŽð52¼ÿ3ûFoªqºöîñð¥¹fÊ¢‹ä‰Ì{El!®÷©h|Í8k5¸=#×z T¨²ÊXÅܺÔWsÉæ 'Ù€u)øyFÞœ«\…´¨Å9ÄkKؾ›åT å5ÆæÂê K—ÓÌsæ*…1_'ã›_£fË|û_8X«mZ§“îJ¤'#wIöDÊÌ,tå×­ÒƘðºèz!G„Ví[f)‚¦MƒÖB…l¿Ñ< cç$¿wu¹å¡P[IؘÃÙ8ØÌï f!¾…2°\È EPšH¸wÜ1»Ò3^³ÁWŽðýàø€½Ù)åÛÒÀ¸Æ4ãÉì#£ñNhJ’R~G]x [–º°yxq1q5¸üA眭òü0ðÆÇ¦TBŽˆa`[`¬€19zAªj)áçtÐK4Á®GØw1Úeb”ÐîI_mȳâN1±ž¤¹,ll¼‚“ wp7(ŸŸF¡,Œ!ÄËÖy&×쎛Ló •:á^6 %Z×RZÚÄùvê4OépÛõ·xÏÈêÛXrES¢¼ò› Ÿ¯lgFbçtN«UÛ‰X•A+bE^ñ ”X\HºMÈ”R˜7ö¸K¸#¯OÂo^RŒˆ•àâ)‰ðëqøÌÈë»RÌú¾X/0^»Zk>'›ízÛ“P›¸&|WŠâßTzÉñ$„üf3ònR©:~?|\òoä‚vس2Eœß8® ðn$Ø9SÕEr1tceí]ÂÅ]X»\ò~ôáçî”d8D»¨¼ÇWA¨[fzTÓ '™I°½†[Æ2¼€:W”ún⹨öÀq +óG[( žTÙé^ö¶d¼1$ªe“Üõì4Þ‰¡ÃªzbgÞúØd&(€ ò“ª9¢ò ž«O‚ÒïvSï¢gL; ^UæåÎÆÅmy΃F`nÁóbäãp‡Œ¸s¦gWZY5“¤ýë",ç\è¶ÍP·¹¦P&Ùã驤”> adÖU)MäsŒ}f¡oÌ:¨VÅ‚á\eFȽ±®Ø$5_Ò¶“óà»nCäÐBlQ¹¢ãºÒ—¾øšÎÅ€)½-ÙãLþ{“ɘ%åÜ#%’‚—Ù Sk…K¶¡¿Ë»‡wUáŸDNÉÆD«P[9Áé¦&æé¶_p›4£Œ+¶(0›Ì]Õ8 ê±æ<`…µ7(f¼·ˆøp’ììYøCî7'ù6Œf5*b#T#«ùíöã0s¡&Z`*¦þU¯Ë8Å}-™轓›‰gÕübYrv†™YØl™_‘©êšty花Z4ÁBÒ©BtЕô¸>ÕRû*%úûéöD`NN|q™DWa­]`â‹ï8©ƒZRìÒAÞ/rµ‚Ow9d>bÙ;ž7a8“Æó4v¤R5£Ô®Îð¶Xê§»vªßNý#TUueÌqßTŸð˜»`BS[?‡LætÌÕgç°ž¢fÕYë&P@Gµ´8=ÔÜwsÊQðJ"¬¸±-I!<ñ~ëÄóYض¤CQÙ”D(Õý>9›[FU­œ]åû8÷0‡ÂS¦çj W¸·™Ãs;MÁ¾Ý’63S%ñò8}ÞF¨‚+-æ”ÎJÐ{§ oéPÕ¬1ÏÓ£ix¬Âj‹Å+ë*|q³¯Õˆ! JZ“ÖWýÌê<ˆ;³¹ã.Ê{O:½Ì7ã»™€ò#['3N(–¥Tgö²(²½b]ø=X[7¹þpãM»``áPµ­.j×+»•ªð~ÞóÔ©ŠbqZ¯`ŸPÃt4&5$8qûR48ÂIÇ’tÆîzv‡_8RðtfW{ .Èã­‡D= Ý› †¢µ¸,Ϥ¿ÇÊ:–…QtÀ)äñÕ½½“ Bp òG7 ö–åÔˆO^º^–mÓßžp(È›4 e®»²V^3ßggl”„¯¥É*Lµ¯J¦…U ¨¨¬³ÌX¶]µê§)ö‚óZeaÔSpÄ:c{wæÛìÔè’ß8Eƒº²hX´vÕ Ââq±”ÙL´Æ ˜õ¨Žv0‚ˆPiæcˆÐˆôÆ+¨“˜LlO*¼¥ø"‹ ãûgùêYÜ6»®â;Â\®L:4zÚÈnU‰W[gèʕƥ˄&z®":¬jô+i÷‰e6t$@ÜD­›Dêìð£Ð."¶Ó••©”"·mÑȨbßÌAÓK“;'†©pªÛðJrÜP 4ÐÈC#Š*¡±'¶0ïU݈Å<_‰¾Qò.&ZÅÂ]ÉúÊ(ñ$Ú Ø)XpàªÍAxB£ð§'¨ØvÇÛÌÀ¸u¦YŸ,=±E¿,>9ãÓ][Ó!ÅT¦!„%z:€Ýîã.„|ðejô[ VäóÉךc†çªÎ¥¤kžžA&„#×NÃ…ïB[1_m¨9¡§GÞ$¡‚#,m¬Cô ÙMÍIÁ9†‚ûÙ2n ÉÇ.¸*4xô>’jt¾XTKê›VÞÜeÐD†€&º¤ì6 U¥²•à[ÃàúuƒµªqP€2vQÔ#^,LѦêJÏdæƒêŽ…S=%œÑôÖÓS)Ý8t‚â|É®oòtþF*P± £»Ð·¨ÕY¨à QYa!@;u KJJþËçÄJÚ«ÿN«»í|¡YIYdïß\è¡’KÁk¡³-Ý©‹Õù†ž3Õ»øšUv¦õ>\ƾõÂe9¼x'Ÿ‹ò.Fº˜MHÊo·L«¦½Ÿžmx~>㊯²Jâ«ÔY–iËJ—§,ŒG’¦x‡Øo^ÖÍC=K{<=AhFS;Ú\‘jžYÔñ)X1ë®)µ§'§D:ͪ'ç ®Ÿ’|94æ [»©`IÑ&Ä,xU^Æ1‚ËÆÊº #P%Bà !Ä!Ù¹ƒoù¥„Ó„kæK™%3-…8àëÕvò'K±§à8IÁZt“\J+v—Ä׬Qp4!dIòR–ž$?ÀšXˆ)ØßÝ ìI=Mÿ‰&À‘1˜š—D¥ŠRÌ+3¤)¼÷,•šÌŒÉÅV;tɲ¨bêj!.ì.ùÉÁŽã¬t)ò:xÖå&]ø{¥0+qŠ&§æ­ëxƒA•X33æ:øZJFnÒ툼€¡-ÁÆJSÁ&§Â÷´.nÎËxOÁ‰üVßcZËØqœ`ó*¸ã¥à…­ùšà\dÁî ‚m%ïšÄ¤’q¶¥ˆzÒC8µ“júZ¤‚n÷¡ï ôP€]om˜C˜‘- Àï§%<%aã¥ í§§ }|ß­¥}j²8™ñÓ„¨(%²Ð í`WQѶ U²¤g }|¿‰(šF`×d”Êx¥`ý3ãXjÁY±f™Ä&ºß@"^Eœ©KŹɦÇȆXÞ/E ¶ê‹hpÛ¡ŠÆ…EÍR(k÷4ÇK–M…­Òw”Õ™]¢|&E¥¡ßJ‘DÕMsX¢ðO]‡8éôo„µ4¯¨YÞ§gþGè2<ʬfëºS_g© ±…¸a¶^¥X ' ®(X3nGiªØùB—Rž¾D"`JÒolaÚn¿px.3.ØîSp¯HáÆà“Fºð¢Œ“ô†ë¶ž*lT‘hŒ=Õ/vç0ï^vD˜@)¸“q•&^KpéÒ‡(ìjÊ€i/ö…=i¦°;d8Ó(¤ýn”&|‰À,©ÙžCpŠT—’|y@•, L‡êUî´R½jÙ«§§ã¥.½j’Œ†Ndà88ˆä#Ør"ƒDqý@Õ¬k¼–,+Ep-½®w-˜qE^Y¤.^·d‘©®ËlÊ‹š‡ÝX—=ÈL^»ÌT.o_WšGìäh•„8ÂÝ|¯Ñé6÷f’-Øô\N¹àÂÞ¦ÚÑÃFK!ªGW"Ÿ¾:'J†ï‚“€(² ƒt÷oïn³ÕÈ“£m‹VhÝ)u‹Ç÷[Ó² d(û ù%)X‹®qXâ_ˆénô] À²|‹·œ+/¸l­áD¸A‚²K‘ˆ Ê‚y²ìz§¤ž½>4µ/¼ ³A½Zé&íîó’¸ÚSI,}}R×]¢Å8k·Pí)SÆ  %„fi¹x«ØÄ×f² 3ÊKR4>”õ 1“Ç…Œ+гoœ­²ŠÆ¥ç[ø†bUs\Q»maÐÅÓ§/Ü zO3•L½‹©äÉSV›FëSèf¯º rxg²T6²l¥s“Å…ddSøZ3`sQ HouÙPbãaSGëaÄT+y˜F]H”è¹QÐxnG8,I¹Ò…Î]ˆ‚Ðjî„ÑEHˆÐFA›Ùhε8UWŠzŒÅÓðºìç¦qÓð— ˆÛUÜa0  eíHɵ»ÿ pɪ4‹åVd.ðH- Ÿ¡ä‹ƒï¥æžœ*U ­+ýOßuAT3ä:!ñÌ­’ÚÖõܧ¯²Š÷öfQÁÍ™FØÓ këˆO_%IXá花êQ³š»²kyÞwÜH Æ0»jƒÞ‚5ÖÕrÉdró‹Ë.…¥ÒÑ×ÄŇX/Jæ‡EÊo…&F¼•àŸäôeôapb¥iQ{«Aœ}3#X™†>)\ìYÕ£/êÙTæ^5Ø=©è0Myï©@†8º’8ß ®dd–¯a• š=ÐßÁ‚oÉ 8PªœP°RFã±/­HŠ!ïŠÙÌ<‘ZRÔeÈ ' NTá½âƒßN|dÖ=øB\@@_¢±8–Úý”RZo'›žRwCµª p˜–í€8HÿFEÝn–‚xtøhï„§fJ¥nÀFÍï,ÃË?õ(jÁÁëtya—á 0ž‘ –2û&/PÑe—¶ÔÅ™`®€̃Óæ²súäýÁÜñ5’‚qjçP‡„nAйÀÿlž SÄžé»1ñXÃÀÈ—l=B)©Â‚…·‚Ä<Á”­E­G«Vð& 64àdŠ$ÄËàmËe%Ì4N]`)»#Xø€vÁ†Sblמc9E0/Vˆ òI‰$¢ýBm`±²ÀD¦ÀÐRêÒ pÁ7¢4@vA%`4Ü$U°ýB&¥K`wø£ÎmV+ ¶¡².9‡¸&±Íëî Táñ͘ž¸v4s-¶`Ûcტ£¥ÝùA˜JÙXpŸgsb¢˜(s¤$Cʯ"¥åìT‰T:xsWk%ÄÈ«A¾i’+‚ÆRS®ˆ ‹£XA&æŠpáâ˜Idh!Y D†c…ì,ˆA OBŠ™BAORŒýµ )ùk•€\gA0ߦ>Ë Ó¡rO.i ².å‘¢ºÛRhy,M¬5lJ!wƒŽÓ? ÏÃoØHÍ•D¡à9ÄFåP‰+ź¬äjej:! Í£”P47NŒ‹ÃØÁP^l?€B1v†‡ Lð˜Në HÇkà—¬Ð› O ’xÿ'*9ÌâØ”·¨E¹¯Ô|6ÕÈ óT#‹;Í„WU»©sê: ¦]wîDÔ²9µ²yâ®ó$öÙD÷0¥Àið–5Sb›é"š"Ä Ü=~îNJ®½îg'-x5å>ð¶€¶)«\W¡ó†ìš¸Ê[7«ÜUN¿Ú“ÞF‘ÈF×4¢óE[SÄc_³ÙæÅ s3 ‹’s?PÒ5yŠ“‰°ù¼88Û¬ ¤`út5ñ\ÂA/­Ë:–n»Öei¯ÛºÇ¦»Šý÷b+6Ýá;¦ˆX[š+öøÓ&½muåí¶¨˜Àû âŠeÜŠ½DlNja³fÍ:Næã„¶PWáÙc+ÀPa+^ºÕJqULÅN°ŠíÝ;P€¹â®ûÊ—f±~~&܉cd%:|kšßáÑÙžäy/¾õýÀô@ìåhÏØDi’íÅØEX±íðmq¬ ‹¤÷Å¡vì;ÝŠ¯¼äZ»ë³âW­ÜˆÍ?W’³FŽwþ!õV©`ßš["ÍO©†æÚß2vVã ›õ3t–Æ5‡¡ÃǪìöÁ·{è`«ø ÒP?XÇ~†1Öð± ˆÚÞ j #º¨1à"t³ Ã;zTž6i–¯mìoûóªÙqÖ‡‰µûŽÍ°YGÌ¥+uB[çï|¸AÄ­Þè{#»ô°¾é!]ù)P6_i=€vØøiÝýcuŒ;²—zíøŠ¯ÈÖ÷ñzíu”Ãüv CÛëÌcëÈç©3ä 7±#«G1ñ18É0ôbÜ2°Õ}¤ô{Óý¦õ-G|€Œá_nÈƹI‹ô¸JAˆ»¨q4(à #Ž’cÀQzÓY‡³FRôɲøŒZ9Å F;/:‰ºÑVÛçW¯Š[» ò9:¨˜ý¢Šú8C=ÅG0VÁt™óïe67é鬾%´t%tÓêALÖAL.Ú7Ú“€Œ7Åùãâh«uå ücûk'oôv2²ø­“H¨ëtBßë­ïõcÜ]-ûMüMôbµíJ×ÈÃZÿ&ñr–nè¡+‹åMÙêð÷²óM½<Î`]®cÕ “ÖåíÜGàUÚ×7eË›²¡mñÖ‡¹Yè+ƒk‡—v´õ./.^DÆ`ØkÖX;½!ðèJx±ìõ¼º€d½›$^}™Oü  ,Î÷œ¿{óõ2º@g.Ç'–úd练ü¸“w=µóo=ƒàw˜‹SG4æÄkè89S§nÂÖçÍð]Ý΋•idà­3rwÓU)‚]ÔÄòÞÑL×+ÇïžÊ-ĸ+Æ;S3èsåòtÃ`èT:ЕêUÝÜFJ×>ÞO¸›T3—7 Îؼöª£O4ßUI¤¨ÞBà™ëjá•Õî^þ•oä /%¸cÝÝq!ÇéIÜ}®˜¬¸Ñ~ñœ¡‚^}C¸ñÖ­Tzc¹ÞÙC|¼·4ëo*Ï€‹âg®àPè™æ7?(‹ °Îx·lôÜFR±9œØƒŒv ¶ôÑþ ¡ëšßC¿€Ã¨÷£F«ó1*ǾUAA_ߢWA̘©£†1bžá2€XG÷6øl9ƒƒ£y㦋–OwÒ¾S`ý÷ÅCÜwáë¡ø³Õ;~¯gßö0˜ò›òt?ñ“Á¬‡0Îòƒ†¨d:N Ûä„6·ˆldð]~ë¶ÞŠÁó¸æÊ.¹’”»ûxu®é%ËtŒžßÍ“YÞ¤.!|ºûwnTu÷›ÚŽ òƒ øƒ lƒðŽÞâàÆJïÒ|kï‡4Î:O@¿yÙÁϽ%Z·!a÷Æ›õ¶)]}ä!ãû>©&k÷Œ/w~õq¥Í¥áBæ .ûÝ׌:AøèÕ^eß'>ºv+MÀÿq%ª_nÜy¾á숵õ¯ü.uP>>Ñ7Yƒ4ÜÕªúpNlmêÞÍûÔ”rب:À7•¼Ì¨V—0D}Ëà„t9ÿÀ_wG‡£gó×ÀÑÁà™.BõÎŽ€’ûWãž½0Üï!³~¼ÁkgÕž VüYc–ËÅçšÀ$ܵÞUKŽêÕß™ùèC9óÁ†¸°Kü/Ô°½uE>*¾§vÖOŠïnÎ=•drTÁf;¼2½™üð\R1«‘ ³ZwކЯ  !pLÂ|È/mƬÀèd_Òµ°«´õ&¼÷ð¿cb”ÒªøRàEC$ýS°š8]*±€ À+þxaoûІØêWYVÜïÒ>v-¶ûtµ'2ô[Æg%i;ð.6>à=gí£ô&¥z7UÜ:QqUû؇i”c˜Æ0Qäröñ«\Þ`ˆ©6Ùí&•Å áF¤¡'n£‘z§ íVæ8Úù¡m±ª·ÖV£è³Âz=n«8:^q’]Š1z^Q¿tvQ¿%#¯Â°e§G´zŦEòíG`Z÷shŽýØþÞ>V-Þ¬9v'Ô#—{òYéð1¸œ~w [vpä”Õb™ŠÛdq’=ò!>´WÔ;ö±Ø!g™ñö*ápkÅííC‹OgŸ¡iÛ­Ë“<–ÐV‰”wã™^ïVPq¢XÊp€ š;‡zE™n[ rô &eÊŠ#¹ÕÞÑè|‚« „¢8FmUyÇcݔ߱Y½â\xÅiâŠ+ø¥8Ù¨³)fc1p–—kqfß{,Îlg«7§X»ê‡€Ÿ³¯¿eH/FS¨Sœ´¯›‰!TœK®[¶!{±|hñià@Óà´¸L‚s8 *U-1mlµ±Øq^”ùñmT'ïmîäÀÆ'2îÀ7Õ%|VMý”Èû•ÅÑ_U\˹Æ»¨fÙ¨%÷Ú¿9ÀTÀNÕ¹I—86]ñ® «wŒó8ßÍC8UŽ Ô&‘Ï®`9ØFfPuPÈ΋ª4Ü"ß‘'ò‚Ýе&w“ÉÅÈt°¶©8HnfÇp¬nÔ¨ä íÔâóùë¶2àr#¤ü¶¦c£ž7Ó¡†ÅTFîÈäÖc#¬˜ÁV¼sÄ .Õ¨8z­'Å»G5Ž•e1®Þ Yh¶±7±^:R1¬b?$ŽÛ:x;XM•rt'”‚°LêTúÃBà0ZݨþZœÎ¯Û!4=ºG 3Xã|L=/Ï›¿ip\øÙícï ßh/´OëoïÃÉûÖzÂ&ÆýPuÉ [4Õ‡keeakq– æ8X&LC‰Tñ43ëw”)…Ü—¨E„kLºñ­êyhUÜÐÒ‡¹äé"yUNp¾õÍTp~8N%gŸ àèt}ë ª)R2A¤1TÉÀiúºkXtžQç/x@øÏ€Ñn=ÔÿІƒ:ÿj8vö´®—¾ÅžGìû­yÄ R7àDËÜ¥Ä<LfU©ã»(ëNtž‡“e ë¾*/ÑbtÚµ•peQ¯;Í«~ÓÎè=€c`ëðJ²>·bsÃÛÆF_ņ™šà§›‘wU¼,N Ý“K1ÙSºÐþÀjê‰{˜ÔVîQtÞS”MŽÉäë¬EÁ®†BÌ•%Б»{œëæºÐjS$Þ3Ö¬§ÒiWð”cÝ”GaÙsôpÂõ7ß|—pÁà›ïÎ-OwÒÄL(HÑVâ:˜é˜F«–.Z\­wu…Âx”»53Ê*ÁRÁ.èÉQw(êH6ºåۇܽ“ÉEZ‡b1fB–ãZ{O—Ú;…¡†MÉŠwóž|–;-^œüNO&¯bA¥Puv òc’6ôÍ,Gõ»« iŽÔSÌù^ÔZUž¬jQm•÷é‚Óx·&%ÙLš›cœ®¸»ÊëܤŒó?ž½¬T—.àÒYª®Ñš’Gw‚­é^µ~ï’mG“ïÜ•+ß±Á¾ëHe`ÚI;&ÁnŸ‹‚Ú3rÃXïo'·ûÛ:äõV°Ë¼!Ù›9Å•rtjwÖ?b\ϳÍRõØ5a‘qpB_œ¯ÝXs¾pýbŽ‹b`¢ŠÁ\y‰4”X;ýŽâû}ÑéVÁäìª)`¸©p…0ꊆ°ììnWˆœÝ²Kœ©}Þ\äÌ ­H¾E×q—<ÇÞ!®û]¬]2£‹Udރ秶̾© Å¥áU.3­xs§ØO:t9,'° üZî¼k¤­]R­”§ÇÛZŒ)î§Ù³Cða)…‰ ›º›°¿sóLÜ.ÖÝü*™æêJïØ3Ô³"¹\3%nžéª3ètðC@3 ʹ[©}a?SZûéô7G‘Î cÐÌbKd0¼XM§EÁé‹m´é_üi €6F5¸PU¹©¦Ý îYêʉ€¿sóöåšîØùì}îa_-pj'¢k¼»ÆLÅjÏ¢Ãi®°ÄdŸ>}jz­ª-p‡JÅeN·FÖýÔN˜#­¨"Ñc³#)¯‹§3’³Ÿ~‹,æÊzõÈ~2ˆä;M#˜ØìƒÖS檣Xƒx’DcŸ&¼ÿÁ\eËQÒ©d‚Ðb4 ,3cÀ©oŠkµGPéQwÞUFT¼œ&}ʈʬï¼àˆ1Úöˆ±c17L-ºÔÁÍ|¯Ì¬‡²ÈAa!Ñ)$š6õÙU’#Zå+àZÜêºïÑ­&WˆpYB]B^}pKžw»Ë ¾ò±Z†ÅDü †R­ Õ걪»Œ Dk3~JxVûL «² *êÊBD­°P ®1¢v¯jåHîuUuhvèjÎ`J‚„ºhå!þ' ¡ñ²Ç>ÐÎb® ÐJ§á0È`ûÔåFbˆzžAYÐì1 ºXÖc1M|HbRà•©ÝŽ­R_?!¤Z Ê¥žƒßÞ'ª; îUæ5(…EeÖ(±¦XP&ÙÝmtŠÓ~k›2•—4&nU1Ùt•°?õfµHíXÖ¯º*WƒlÕÈs–r>Ìé\L±à†õÐàî`þþÂAOUóð§àU BqYÞ¯ÝkëÅ­¡6M¡v¢ŠÙ¢ÏCÃR =€»Ÿð¡¦%HtÅbˆh|ƒ„̸¹¦ÖÉóG_M2ç^ù† ]µ S„¸7«\ S¸™Ãà—qõÏ"kuœ—±l‰GÑ´6ܽ¦/¦h“V8‡26æ9ª«³š;y¥äʬÏ,3fTm¥½Ò9Q#ç*øÎÜqG´»ù¯”ª5.î5.žºxhYíUÝ0ÜSØ>TSbaýÌR8|…'š5*d$ÜÛµá¶È ÷µM‹QÆ WèµC‹Qq‘Šø8µ? S¸m­}¬Z|àã‚Q“xfÞݽá:Ì ÷l¶ssŸ{Ù|N¸slKLö5ß]a¡bÞ^)ó)úó§bÅ)`WÙm¼uo ?n.Ûß0Ü*ø=4’ÐdÃe‡í£†LÍ¡™pIç†K#ÛÇÙëU~¬¡uáõ¡!Øï©ÞpÑä†û¥ƒo„"m: lH‚âòÒ ¯›b1l.ŽÜp…å†ûM¥ÁlàâÍö‘; |URÿ…ÚØ¥£qXûu.ÒÇv ç¹I1`8XýƒwQ ;†47ÜÆØ>6-F°;. m‡óó#ƒzñnç‹ñF ¯rÞp*ŠñžÕ Ëm¸Æ´}ìZ\ðoÐÀxoœ£¸—ëµëuÀ­¸*¶}qpQá†W8¶t—ª£$ ‹¶#Nî<³áe{[¶›kðgã‹:í18÷ëm¸e±}(%A‰ >Æ}§íCáƒÇ•Á¾xñnûPøàqáÂÔ ×$n¹(|ð»pm膗&·E 8òm¸®}ì7Èm¸õàáB³ o‰Üpÿžcx°+nÒÛp‰žKL `c|3æ½s>^ŒÝ>² ÖÆK»Ú‡B·÷ìm¸’oÃÕxR|JóÃÆûá®?G'/ëÕ­RhmG ø¡z…ÂΫÝÚð4Fƒe2x:ƒ§Q|²úOã@}Û솫þ–ðë_®ñÛð^ß 7íµƒÅxƒá†{ 7\=¸•uÑ⌂TX“WûXóÓªp\Œ§+ŸK)˜™e\›ÛGÖbŒ™Xc™µüÉÚú/YÝpbûÐæ`Xܰ·É•£X—émÜZÀ­,æz·p+KHÅR¼9¬5Þü¹áþ¿öqj1É‚Ë[=<Câ2» ·Ïmxõ­»¼4ð4®½CÁÿ¤Ž_h-golly-3.3-src/Patterns/HashLife/hashlife-oddity1.mc0000644000175000017500000000077612026730263017170 00000000000000[M2] (golly 2.0) #C Forward-shooting switchengine interacts with a dirty Schickoidal #C backrake to produce complex long-term behavior. #C Bill Gosper, 26 February 2006 $$$$$$$***$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 $$$...*$....*$.....*$....*$...*$ .....***$ 4 0 6 0 7 5 8 0 0 0 6 9 0 0 0 $....*$.....*$*....*$.*****$ $$$$$$$......**$ 4 0 0 11 12 $$$$$$$**$ 4 0 0 14 0 .....*$$.**..*$.***$.**..*$$.....*$......**$ 4 0 16 0 0 .*$.*$*$$*$.*$.*$**$ 4 18 0 0 0 5 13 15 17 19 6 0 20 0 0 7 10 21 0 0 8 0 5 0 22 golly-3.3-src/Patterns/HashLife/ruler.mc0000644000175000017500000001070112026730263015150 00000000000000[M2] (golly 2.0) #C This produces groups of LWSSs headed west, with gaps of fixed size #C between them. The lengths of the groups form the 'ruler' sequence, #C 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 ... (Sloane's A001511). The first #C group of length n is emitted about generation 96*2^n. The pattern #C uses a Corderman eater puffer found by Paul Tooke (Jan 2004), a #C p48 glider gun by Noam Elkies (Jun 1997), a p8 glider reflector by #C Noam Elkies (Sep 1998), and a p24 LWSS puffer (source unknown). #C Dean Hickerson, 4/20/2005 $$$$$$$.*$ 4 0 0 0 1 5 0 0 0 2 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 $$$$**$*$ 4 0 7 7 0 .......*$$.......*$.......*$ *.**$$*$$.*$.*$ $$$$$$......**$......*$ ...*$***$$$***$***$.**$ 4 9 10 11 12 ......**$ *$$$$$$.......*$.......*$ $......**$......*$.......*$ 4 14 15 0 16 5 8 13 0 17 $$$$$$**$**$ *$ $$$$$$$...**$ 4 19 0 20 21 $.......*$......*$.....*$$...**.*$....*.*$.....*$ $$*..**$.****$*$ 4 0 0 23 24 5 0 0 22 25 $$$$$$$.......*$ ...*$ ......**$.....*.*$....***$......*$.......*$ $*$.*$*.*$.*.*$*..***$.**.*$..**$ 4 27 28 29 30 $$$.......*$.......*$.......*$$.....***$ .....**$......**$ 4 0 32 0 33 ..*...*$.....*.*$......**$..**$.*.*$.*.....*$**.....*$ 4 0 35 0 0 $$$$$*$*$ 4 37 0 0 0 5 31 34 36 38 6 18 26 0 39 $$....**$...***$*.*.**$.**$ 4 0 0 41 0 5 0 0 42 0 $$$.*$..*..*$.**.*.*$.....*$ $$$$.....*.*$....**.*$....**.*$...*$ ....*$....*$ 4 44 45 0 46 $$$$$*$ 4 48 0 0 0 $$$$$.**$.*$ $$$...**$...*$ 4 0 50 51 0 5 47 49 52 0 $$$$****$*...*$*$.*$ 4 0 0 0 54 5 0 0 0 55 6 43 0 53 56 $$...**$...*..**$....**$......**$..***.*$.*..***$ $$*...**$***..*$...**$***$*.*.***$..***..*$ .**$...****$...*..*$$....*.**$..*.*$.*...*$....*$ ......**$..****$..*..*$$.**.*$....*.*$...*...*$....*$ 4 58 59 60 61 $$$$**.**$.*.*.*$.*..****$*.**...*$ $$.....**$......*$......*$.....**$......*$......*$ *.*....*$*.*...*$*.....*$*.*..*$*.*.*$*..*$**.*.*$...*.***$ 4 27 63 64 65 .*$.*.**.**$..**$.....*$$$..***$..***$ .......*$.**.**.*$*....**$...*$$.*$$***$ ..**$.*$***.*$....*$.**..*$..*...*$.....*$ 4 67 68 69 0 5 0 62 66 70 ****$.....**$*..**.*$..*...*$**....**$.*.....*$*..*.*$**.*..*$ .*.**.*$.*.*..*$..*..**$ 4 9 72 0 73 *$*...*.*$**.*..*$.*.*$......*$...*.*$*.**$*.*$ $$$....*$...***$...***$$....***$ *.*....*$.*.....*$$$...**$...*..**$....*.*$...**..*$ *.******$...*.*.*$****...*$..*$..*$.**$****.*.*$....***$ 4 75 76 77 78 .....*.*$.....*$......**$ $*$ 4 80 81 0 0 5 74 79 0 82 6 0 71 0 83 $$.....**$.....*$......**$$....***$...*..**$ $$.**$.*$ ...**$.....***$.....*$$......*$....*.*$...*...*$......*$ 4 0 85 86 87 $$$$$.....**$.....*$ $$$$...**$...*$.*.*$.**$ 4 0 89 90 0 ...*$...*.**$....**$.......*$ $$$$......**$.......*$.......*$ $$$$$$.*$**.....*$ 4 0 92 93 94 5 0 88 91 95 $$..*...**$*****..*$.....**$*****$*.*.*.**$*...***$ $$$$$$*$.*$ $*...****$*...*..*$$**.**.*$......*$.....*$......*$ **$$$$$*$.*$ 4 97 98 99 100 $**.**.**$..*....*$.....*$$$......**$***...**$ .*$.*$*$$......**$.....*.*$*..****$*..*...*$ .......*$$......*$......*$.....*$....*$*....*$*$ *..*$.*..*$***.*$.....*$**....*$*......*$.....*.*$...***.*$ 4 102 103 104 105 $$$$.**$.*$.*$*.**$ ......**$.......*$......*$ *.*$*.*$..*.**$*.*.*$*.*.*$..*.**$.**.*$....*$ $$$$$$...****$..*...*$ 4 107 108 109 110 5 101 0 106 111 *.**$...*$***$*$*.....**$**.**..*$***.*.*$...*..**$ 4 0 0 113 0 .......*$$$......*$......*$......*$$....***$ .......*$.......*$$$...**$...*..**$....*.*$...**..*$ 4 0 115 116 78 ...*.*$..*..*$...**$ 4 118 0 0 0 5 114 117 119 82 .*$....*.*$....*..*$.......*$....*$.....*.*$.......*$ ..*....*$..*.**$.**.*.**$.*..*$...**$...*$*.*..*.*$*.*.*..*$ *.*.*.**$.*..*..*$....**$ 4 121 122 113 123 ****$$..**$*..*$.**$.*$..*$.**$ ......*$.....*$ .*$.*$*$ 4 125 126 127 0 5 124 128 119 0 6 96 112 120 129 7 40 57 84 130 $$$..****$.******$.****.**$.....**$ 4 0 0 132 0 $$$....*$...**$...**..*$ $.......*$.......*$*..*$*...*$....**$*...*$*..*$ $$$.******$*.....*$......*$.....*$ .......*$.......*$ 4 134 135 136 137 **$***$*.**$.**$$$$.**$ *.**$***$**$ 4 139 0 140 0 5 133 0 138 141 6 0 0 142 0 $$$$$..*$.**$.*.*$ ...*$....*$*...*$.****$ 4 0 144 145 27 $.......*$......**$......**$ $***$****$**.**$..**$ $$$$$$$*$ ..*....*$..*...**$.....*$.**...**$*.*....*$ 4 147 148 149 150 .....**$.*...***$..*...**$*..*$..*...**$.*...***$.....**$.......*$ $.......*$$..*$...*****$ $$*$*$*$ 4 81 152 153 154 **$*$......*$.......*$$*$**$*$ ...*$....*$....*$*****$ 4 156 157 0 0 5 146 151 155 158 $$$$$$.....***$....*$ $$$$$$*$*$ *$**..*..*$.**$**..*..*$*$....*$.....***$ *$$$$*$*$*$ 4 160 161 162 163 5 164 0 0 0 6 159 165 0 0 7 143 0 166 0 8 131 167 0 0 9 0 6 0 168 golly-3.3-src/Patterns/HashLife/metacatacryst.mc0000644000175000017500000000216212026730263016665 00000000000000[M2] (golly 2.0) #C metacatacryst -- a 52-cell pattern exhibiting quadratic growth. #C Found by Nick Gotts, December 2000. $$$$$$$......*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 7 0 11 0 0 0 8 12 0 0 0 9 13 0 0 0 10 14 0 0 0 11 15 0 0 12 0 16 0 0 13 0 ......*$....**$...*$...*$...*$...*$ 4 15 0 0 0 $$$$$......*$$......*$ 4 0 0 0 17 .......*$ 4 0 19 0 0 5 16 18 0 20 $$$.*$**$.*$$*$ 4 0 0 22 0 5 23 0 0 0 6 21 24 0 0 7 25 0 0 0 $$$$$**$.**$.*$ 4 27 0 0 0 5 0 0 0 28 $$$$..*$.*.*$...*$....*$ 4 30 0 0 0 5 0 0 31 0 6 29 0 32 0 7 0 33 0 0 8 26 0 0 34 9 35 0 0 0 10 36 0 0 0 11 0 37 0 0 12 0 38 0 0 13 0 39 0 0 $$$$$$$.*...*$ ..*.*$*..*$*$*$ 4 41 0 42 0 5 43 0 0 0 6 0 0 44 0 $$.......*$$$.....***$ 4 0 46 0 0 5 0 47 0 0 .*$*$$*$.*$ 4 49 0 0 0 5 50 0 0 0 6 48 51 0 0 7 45 0 52 0 8 53 0 0 0 9 0 0 54 0 10 55 0 0 0 11 56 0 0 0 12 0 0 57 0 13 0 0 58 0 14 0 40 59 0 15 60 0 0 0 $$..**$.**$..*$ 4 0 62 0 0 5 0 0 63 0 6 0 0 64 0 $$$$.......*$ $.*$*.*$*$ 4 66 67 0 0 5 0 0 0 68 6 69 0 0 0 7 0 65 0 70 8 0 0 71 0 9 0 72 0 0 10 0 0 73 0 11 74 0 0 0 12 0 75 0 0 13 76 0 0 0 14 0 77 0 0 15 0 78 0 0 16 61 79 0 0 17 0 14 0 80 golly-3.3-src/Patterns/HashLife/wedge-grow.mc0000644000175000017500000000216512026730263016073 00000000000000[M2] (golly 2.0) #C 26-cell quadratic growth pattern: a forward-glider-producing switch #C engine repeatedly overtakes a crystal formed by collision with #C sideways gliders produced by a c/12 rake assembly. When the #C switch engine reaches the crystal, a reaction produces an #C orthogonal block-laying switch engine and restarts the crystal #C production at the c/12 rake boundary. #C Nick Gotts, 17 March 2006 -- closely based on Bill Gosper's #C 41-cell O(t ln t)-growth pattern from 11 March. $$$$$$$.**$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 7 0 11 0 0 8 0 12 0 0 9 0 13 0 0 10 0 14 0 0 11 0 **$.*$ 4 13 0 0 0 $$$$$$$.......*$ 4 0 0 0 15 $$$$$$*$.*$ 4 0 0 17 0 5 14 0 16 18 .......*$......*$ 4 0 20 0 0 5 21 0 0 0 6 19 0 22 0 7 23 0 0 0 8 24 0 0 0 9 25 0 0 0 10 26 0 0 0 11 27 0 0 0 12 28 0 0 0 13 29 0 0 0 $...*...*$....*.*$.....*$ 4 0 31 0 0 5 0 0 0 32 $$.......*$$$$.......*$ 4 0 0 0 34 5 0 35 0 0 $$$*$.*$*$$.***$ 4 0 0 37 0 5 38 0 0 0 6 0 33 36 39 $$$*$*$*$ 4 41 0 0 0 5 0 0 42 0 6 43 0 0 0 7 0 0 40 44 8 0 0 45 0 9 0 46 0 0 10 0 0 0 47 11 0 48 0 0 12 0 0 0 49 13 0 0 0 50 14 30 0 0 51 15 0 12 0 52 golly-3.3-src/Patterns/HashLife/logarithmic-width.mc0000644000175000017500000005527212026730263017452 00000000000000[M2] (golly 2.0) #C Patterns whose population grows logarithmically have #C long been known, but this is believed to be the first pattern #C whose *diameter* grows logarithmically. It is based on a #C blinker puffer that can be deleted by its own output (a blinker), #C or push a block out by 8 cells. #C #C By Jason Summers with Gabriel Nivasch, 16 Aug 03 #C #C Analysis by Dean Hickerson: #C #C Let g(n) be the generation in which the leading puffer is in the #C same position as in gen 0, the block is 8n units to the right of #C its initial position, and there are no blinkers in between. I.e., #C the puffer is on its way to push the block from position n to #C position n+1. g(n) is always a multiple of 240; the first few #C values are: #C n 0 1 2 3 4 5 6 7 8 9 10 #C g(n) 0 240 720 1440 2400 3840 6000 9120 13680 20400 30240 #C g(n)/240 0 1 3 6 10 16 25 38 57 85 126 #C #C Letting h(n)=g(n)/240, we have the recurrence #C h(n) = h(n-1) + h(n-3) + 3. #C #C Also, #C h(n) = round(C * R^n) - 3, #C #C where #C R = (2 + cbrt(116 + 12 sqrt(93)) + cbrt(116 - 12 sqrt(93))) / 6 #C ~ 1.465571231876768026656731225219939108025577568472285701643 #C #C and #C C = 1 + cbrt((13113 + 151 sqrt(93))/17298) + #C cbrt((13113 - 151 sqrt(93))/17298) #C ~ 2.82110012372929333835936935875070702572316547898891137253679 #C (C satisfies 31 C^3 - 93 C^2 + 16C - 1 = 0.) #C #C Since the diameter in generation g(n) is 8n + O(1), we find that #C the diameter in gen t is asymptotic to A * log(t), where #C A = 8/log(R) #C ~ 20.92898063664810844728999060141708775230924963625537466402 $$$$$$$....**$ 4 0 0 1 0 5 0 0 2 0 6 0 0 0 3 7 0 0 0 4 8 0 0 0 5 9 0 0 6 0 10 0 0 7 0 11 0 0 8 0 $$$$$$$.**$ 4 0 0 0 10 ....**$....**$$$$$$...***$ .**$ $...*.*$..*****$.**...**$.**...**$$$....*$ 4 12 13 14 0 5 0 11 0 15 $$$$.....*$.....*.*$......*$......*$ $$$$......*$......*$*.....*$.*$ 4 0 0 17 18 $$..**$.***...*$**.....*$.*....*$**$.***$ $$.*.....*$...*...*$$....*$...**..*$.......*$ 4 0 0 20 21 ......*$.....*.*$.....*$ *$$.......*$$.......*$ ......**$.....***$....****$...**$....****$.....***$......**$ **$***$****$...**$****$***$**$ 4 23 24 25 26 ..**$$$**$*.....*$......*$......*$.......*$ $$$.....**$*....*$.*....*$.*.....*$**$ $.....**$.....**$....*$....*.**$.....***$......*$ ***$***$.**$ 4 28 29 30 31 5 19 22 27 32 6 0 0 16 33 $$*$*$$*$.*$.*$ 4 0 0 35 0 *$$$*.**$...*$..*$**$ $$$$$$.......*$.......*$ $$$$.*$*.*$...**$...**$ 4 37 0 38 39 $$$$$$$**$ 4 0 0 41 0 5 36 0 40 42 6 0 0 43 0 $$$$....**$....**$ $$......*$....*.*$..**$..**$..**$....*.*$ $$$$$**$**$ ......*$$$.....*$....*.*$....**.*$....**.*$....**.*$ 4 45 46 47 48 ..**$$.*$.*$.....*$..*$....**$ $$$$$$*$ 4 50 0 51 0 ....*.*$.....*$$$$$$......**$ .......*$ 4 0 53 0 54 $$***$***$$$$...**$ $......**$......**$$$......*$.....**$.....*.*$ ****$***$.*$$$$$.....**$ $$$$$$$.....**$ 4 56 57 58 59 5 49 52 55 60 $$$$$$$.....*$ 4 0 0 0 62 .......*$......*$.....*$......*$.......*$ *****$.....*$......*$.....*$*****$ $$$......*$.....***$**..*..*$**..**$ $$$......*$*.....*$*$$.*$ 4 64 65 66 67 .....*$....*.*$.....*$.....*$.....*$.....*$....*.*$.....*$ $$$$*$.**....*$.**....*$.**$ .....*$$$$$*$*$ 4 0 69 70 71 5 0 63 68 72 .....**$$.**$.**$ ....***$.....**$ 4 74 75 0 0 5 0 76 0 0 $$**$**$ .*....*$.*....*$ 4 78 79 0 0 *$ 4 81 0 0 0 5 80 82 0 0 6 61 73 77 83 ...**$*.*$.*$ 4 54 85 0 0 **$ 4 87 0 0 0 5 86 88 0 0 $$$$$.......*$$.......*$ 4 0 90 1 0 $$$$$..*$...*$...*$ ****$ $...****$..*...*$......*$..*..*$ 4 92 0 93 94 ....**$$$$$$....***$...**.**$ ...**.**$...*****$..**...*$ $$*$ 4 96 0 97 98 $$$$$..*$.*.*$.**.*$ 4 0 0 100 0 5 91 95 99 101 ...*$..**$..*.*$ $..**$..*.*$..*$ 4 0 0 103 104 .**.**$.**.*$.*.*$..*$......**$......**$ .**$.**...**$......**$ ......**$......**$$$$....**$.....***$......**$ *$*$$$$.**$**$*$ 4 106 107 108 109 $.*$*.*$$$***$***$.*$ $$.*$***$***$$$*.*$ 4 0 111 0 112 .......*$.***$.*$..*$ $....***$$....*.*$...*****$..**...*$..**...*$ $$$$$*$*$ 4 114 0 115 116 5 105 110 113 117 6 89 102 0 118 7 34 44 84 119 $$$$$$$....*$ 4 0 0 0 121 ...***$..**.**$.***.***$.***.***$.***.***$.***.***$..**.**$...***$ ....*$ 4 0 123 0 124 5 122 0 125 0 6 0 0 0 126 $$.......*$......*$$.....*$.....*$ $***$...*$....*$$.....*$.....*$ 4 0 0 128 129 ......*$.......*$ ....*$...*$***$ $....*.*$....**$.....*$ 4 131 132 0 133 5 0 130 0 134 ....**$$$$.....*$....***$...*...*$..*.***$ $$$$$$$*$ ...*****$$$$$$....*..*$....*.*$ 4 136 137 138 51 ...**$..**$..**.*$...***$$$....**$.......*$ $$$$$$.**$ ....*$.....**$......*$.......*$.......*$ ..*$**$*$$.....**$.....**$ 4 140 141 142 143 $$.......*$......*$......*$......*$.......*$ $**$.*$.....***$.*..*..*$.....**$.*$**$ 4 0 0 145 146 5 139 0 144 147 ......*$.....*$.....***$ 4 0 0 149 0 $...***$$$$$.....*$....*.**$ $$$......**$......*$.**....*$*..*$.**....*$ ...*...*$...*****$..**...*$...*****$....***$.....*$ ......*$......**$*$ 4 151 152 153 154 $$$$$$....**$....**$ 4 156 0 0 0 5 150 155 0 157 $......**$......**$$*$**$***$**$ $$$$$.**$.**$ 4 159 160 81 0 $$$$$$$......*$ $$$$$$$.*....*$ ....***$......*$ .******$.*....*$ 4 162 163 164 165 5 161 166 0 0 6 135 148 158 167 $$$$$$....**$...*.*$ 4 0 0 0 169 $$$$$.*******$.*.****$.*******$ $$$$$$$*.*$ 4 0 171 0 172 $$$$$*$*$*$ .....*$$$$$$...**$....**$ $$$$$....*$....**$...*.*$ ...*$ 4 174 175 176 177 5 0 170 173 178 .....*.*$......*$......*$......*$.....*.*$.....*$ $$$$....***$...*...*$..*$..*$ $$$$$$*$*$ 4 0 180 181 182 $*....**$.*...**$*$ 4 184 0 0 0 5 63 0 183 185 *...*$....*$*....*$....*$*...*$*.*$ 4 0 187 0 0 $.......*$.....*$....*$....*$....*$.....*$.......*$ $*$*$....**$...*$....****$*$*$ 4 189 190 0 0 5 188 191 0 0 .....*$...*...*$*...***$.*...*$.*$*$....**$....**$ 4 193 0 0 0 5 194 0 0 0 6 179 186 192 195 4 90 92 0 93 4 0 0 94 0 $$$$$$$...*.*$ 4 0 0 0 199 4 0 0 172 0 5 197 198 200 201 *.*..*$...*.*$ $$$**$**....**$ $..*.*$.*..*$**.....*$...*...*$**.....*$.*..*..*$..*.*$ 4 54 203 204 205 *..*.**$*.*$ $$$$.**$*.*$..*$ $$**$**.**..*$...*...*$.*$*......*$ $$$*$.*$..*$..*$..*$ 4 207 208 209 210 .......*$.......*$ .*$*$ 4 212 213 0 0 5 206 211 0 214 6 0 202 0 215 7 127 168 196 216 .*$ 4 0 218 0 0 $.....*$......**$$$$....*..*$....**$ $$$$*$ 4 220 221 0 0 5 219 222 0 0 6 0 223 0 0 7 0 224 0 0 8 120 217 225 0 $$$$$$$...*$ ..*.*$.*.**$**.**$.*.**$..*.*$...*$ $$.......*$.......*$ 4 227 0 228 229 $$$$$$$...**$ ...**$$*$*$.....**$ 4 231 0 232 0 5 0 0 230 233 $....*.*$.....**$.....*$$$$.*$ .***$.*$ ....*$.....**$....**$.....**$......**$......*$.......*$ 4 235 0 236 237 $.**...**$..*****$..**.**$..**.**$...***$ $$$$$*$ $...**$.*..*$*$*......*$*$.*..*$...**$ 4 239 0 240 241 $$$.***$*****$***.**$...**$ 4 0 0 243 0 ......*$....***$ 4 62 0 245 0 5 238 242 244 246 $$$*****$.....*$**...*$....*$ 4 0 0 248 0 5 249 0 0 0 6 234 0 247 250 4 0 0 0 172 5 0 0 0 252 $$$$$.......*$.....*$....*$ $$$$$*$*$....****$ 4 0 0 254 255 $$$$$....**$....**$*$ 4 0 0 257 0 5 0 0 256 258 $$......**$......**$ 4 0 260 0 0 4 0 187 0 171 5 261 262 0 0 ....*$....*$.....*$.......*$$...*.*$....**$....*$ ...*$....**$*$*$ $$$$...*$....**$...**$ 4 264 265 174 266 .*$.*...*$*...***$...*...*$.....*$..*$..*$...*...*$ ....***$ 4 268 116 269 62 $$$.......*$.......*$ 4 0 271 0 0 $$$*$*$ 4 273 180 0 243 5 267 270 272 274 6 253 259 263 275 $$$$$$**$.**$ $$.......*$......**$ 4 277 0 81 278 $$.**$*.*$$..*$.*$ $....*.*$..*...*$..*$.*....*$..*$..*...*$....*.*$ 4 0 0 280 281 .....*$.....*.*$......**$$$$.....**$.....*.*$ $.......*$....****$...****$...*..*$...****$....****$.......*$ 4 1 0 283 284 5 0 279 282 285 $$*$$*$ 4 0 0 287 0 $$$.***$ 4 0 0 0 289 $$$$$$$.......*$ $$$$$$$..**$ 4 0 0 291 292 5 288 0 290 293 $......**$......**$.....*$....*$.....*$......**$ $*$*$.*$..*$.*$*$ $$$$$..**$..**$ 4 295 296 297 0 $*$ 4 212 299 0 0 ......**$......**$ 4 301 0 0 0 5 298 300 302 0 $......**$......*$.......*$ ...*****$..*.***$...*...*$....***$.....*$ $*$$$$.**..**$.**..**$.....**$ 4 0 304 305 306 ......*$*......*$ ..***..*$..**$ ......**$......*$......*$..*$..**$...**$...***$...**$ $*$$......*$......*$......*$ 4 308 309 310 311 .....**$.....**$ 4 313 0 0 0 ..**$..*$ 4 315 0 0 0 5 307 312 314 316 6 286 294 303 317 4 0 90 0 0 $$$$$$$**..*$ 4 0 0 320 0 $$......**$....*$...*$..*$..*$..*$ 4 0 0 0 322 5 0 319 321 323 $$$.*$..*$...*$...*$...*$ $$$$$......**$.....*.*$.......*$ 4 0 0 325 326 $.***$ .......*$......**$.....***$......**$.......*$ 4 0 0 328 329 5 95 0 327 330 **...*$**..*$ $..**$.***$**$.*....*$**.....*$.***...*$..**$ $$$...**$....*$$...*$.*$ 4 332 0 333 334 ...*$....*$......**$$$$$.....*$ $**$**$ ....*.*$....**.*$....**.*$....**.*$....*.*$.....*$ 4 0 336 337 338 5 335 339 0 0 ..*$.*$$$$......**$$.......*$ $$*......*$......**$....**$......**$.......*$ $*.*$..*$$.*$.....**$..*....*$*.*$ 4 341 116 342 343 $$.......*$......**$.....***$....*.*$....**$ $$$*$**$*.*$.**$ $.......*$......*$..**..*$..**...*$......**$......**$......**$ $$*$*$ 4 345 346 347 348 5 344 349 0 0 6 324 331 340 350 7 251 276 318 351 $*$.*...**$*....**$ $$$$$$.*..*$.....*$ 4 353 0 354 0 5 0 0 355 0 6 0 0 356 0 $.......*$.......*$ ......**$*.....*$*.....**$.......*$ 4 0 291 358 359 5 0 0 0 360 $$$$$$..*$***...**$ $$$$......**$......*$.......*$ **...**$.*...**$**....*$***...*$..*$ .......*$*.**..*$*.**..**$**$ 4 362 363 364 365 $$$$$*$**$***$ $$$$.....**$.....**$$.**$ **$*$$$$$$*$ .**$$$$$$......*$.....***$ 4 367 368 369 370 5 0 0 366 371 $$$$...*$.**.****$...*$ $$$$*$.**$*$ 4 373 374 0 0 .**$**$ ....****$...**$....****$....*$.....*.*$......*$ $*$.*$**$ 4 376 377 0 378 4 0 0 243 354 5 375 379 0 380 6 361 372 0 381 .*...*$..****$$$..***$.*****$.***.**$....**$ 4 383 0 0 0 ***$.*.*...*$.*..*..*$.*.*$***$*$ $*$*$ 4 137 0 385 386 5 384 0 387 0 $$$$......**$$.....*$ 4 0 0 0 389 5 0 0 0 390 4 0 0 0 229 .....**$$$$$$$..**$ $.......*$*.....**$*......*$ ..**$*$*$*$..**$..**$ 4 0 393 394 395 $$$$$..**$.**$...*$ 4 0 0 397 292 5 392 396 122 398 6 388 391 0 399 $$$$$....*$...*.*$.**...*$ ....**$....**$$*$.**$$...*$ .**...*$.**...*$...*.*$....*$ 4 47 401 402 403 $$$...*$.**$..**$ ....*.*$...***$..***$...***$....*.*$.....**$ 4 0 59 405 406 5 0 197 404 407 4 0 383 0 0 $..**$.*..****$..**.***$ $$$$.....*$.....***$.....*$ 4 0 0 410 411 $$$$*.**.*$*.**.***$*.**.*$ $$$$*$*$*$ 4 0 0 413 414 5 198 409 412 415 *.**$$$$$.**$ $$$..*.*$..**$...*$ $$$.....**$.....**$ 4 417 418 419 0 $$$$$...*..*$...****$...*..*$ $$$$$**.*..*$**.****$**.*..*$ 4 421 422 0 0 5 420 423 0 0 $$$$$$.......*$......*$ ....**$....**$ .....***$....***$.....***$......*$.......*$ 4 0 425 426 427 $$....**$...*.*$.....*$ ....**$...*..**$....***$*....**$*......*$ ..*$.*.*$*...*$*...*$*...*$.*.*$..*$ 4 182 429 430 431 5 428 432 0 0 6 408 416 424 433 7 357 382 400 434 $...**..*$...**..*$.......*$ ....**$*....**$*....***$*....**$....**$....*$ $$$$$....**$....**$ 4 436 437 0 438 $$$$......**$......*$ ..*.*$..*$$$$*$*$**$ $$$$.*$..**$..**$..**$ 4 440 441 271 442 .*$$.....*$....*.*$...*...*$...*****$..**...*$...*****$ ....***$.....*$ 4 212 444 0 445 5 439 443 0 446 $$.....**$.....**$ 4 0 448 0 0 5 0 449 0 0 6 0 447 0 450 $$$$..*$..*$..*$ 4 0 0 452 0 $$$$$$..**$.**$ ...*$$$$$....**$...*.*$..***$ 4 51 454 10 455 $...*$.**.****$...*$ $*$.**$*$ $$$$..**.*$**.*.*$**.*.**$.....**$ $$$.*$.****$..****$..*..*$..****$ 4 457 458 459 460 5 453 0 456 461 $$$$$...**$...**$ 4 0 0 463 0 5 0 0 464 0 .***$..***$...*.*$....**$ 4 13 466 0 0 ....**$ .****$.*$ 4 468 469 0 0 5 467 470 0 0 6 462 465 471 0 7 451 472 0 0 8 352 435 0 473 9 226 474 0 0 $...***$...***$..*...*$.*.....*$..*...*$...***$ 4 0 45 0 476 5 0 0 0 477 $$$$$$....**$**.*..*$ $$$$.**$.*.*$....*$.*..*$ **..**$ ....*$.*.*$.**$......*$....**$.....**$ 4 479 480 481 482 $$$$$$*.*$..*....*$ ......**$....**$......**$.......*$ .....**$.*$$..*$*.*$ 4 291 484 485 486 5 0 0 483 487 *$**$*$*$$$....*$..*.*$ $$$$......**$......*$....*.*$....**$ **$**$**$..*.*$....*$ $$$.....**$....*.*$....*$...**$ 4 489 490 491 492 $$$$$$....*.*$..*...*$ ..*$.*....*$..*$..*...*$....*.*$ 4 494 0 495 0 $$$$$*$.*$**$ 4 0 0 291 497 $......*$.....*$.....***$ 4 0 0 499 0 5 493 496 498 500 $$$.....*.*$.....**$......*$ $$$$$.....**$ $.*$.*$.*$ 4 502 503 504 0 $$$$.*.*..*$*..*..*$.*.*..*$ $$$$*$.*.**$*$ 4 506 507 0 0 5 505 508 0 0 6 478 488 501 509 $$$$$$......**$.....***$ 4 0 0 0 511 $$$$..*$..**$...**$...***$ 4 0 0 227 513 $...**$...**$ ..*.**$..*..*$..*.**$.....***$......**$ $..**$..**$ $$$$...*..**$..*...**$...*..**$ 4 515 516 517 518 ..****$..*....*$...*...*$...**.*$ ...**$..**$..*$$$$$...*.*$ $$$$....**$*..***$....**$ ....**$....*$$$*$.*$*$ 4 520 521 522 523 5 512 514 519 524 $$$$.**$.**$ 4 0 0 59 526 .....**$ $.......*$$$$$...*$....**$ *****$.***.*$*...*$.***$..*$$$......**$ 4 528 0 529 530 $$$$$$.*$**$ $$$$..**$..*$*.*$**$ 4 0 0 532 533 5 527 0 531 534 ....**$$...*$....**$ .....***$.....*$.....***$......**$ 4 536 537 0 0 *$*$*$**$.*$$.......*$ .......*$.....**$.......*$.**$*.*$*$*$ 4 539 540 0 0 4 0 0 0 243 $$$$.....***$......**$...***$...**$ 4 0 0 354 543 5 538 541 542 544 6 525 535 0 545 $$$....*$....**$...*.*$ 4 0 0 0 547 .....*.*$$...*..*$...*$.....*$....*$ .......*$......**$.......*$$$$$...*$ 4 162 0 549 550 $$$$$$..**$..**$ *......*$*.....*$*......*$..**$..**$ ...**$..*.*$****$***$ 4 552 0 553 554 5 548 0 551 555 .**.**$$*.....*$$**.*.**$ 4 0 557 260 297 5 558 0 0 0 6 556 0 559 0 $$$$$.......*$.......*$.......*$ $$$$$*...*..*$****$*...*..*$ 4 561 562 0 292 5 319 95 0 563 $$$..**$.****$.**.**$...**$ $$$$$$$....*.*$ 4 383 565 0 566 $$$$$...**$*****$...**$ $$$.......*$......*$ $$$.......*$ $$$**$.*$*$ 4 568 569 570 571 $***$*$$*$*$$......*$ ...*..*$..**$**...*$..**$...*..*$....*.*$ .....*.*$....*$.....***$...**$ $*$$**$ 4 573 574 575 576 5 0 567 572 577 4 0 358 0 0 $*......*$*.....**$.......*$ ..**$*......*$*.....*$*.....**$..**$..**$ 4 580 581 0 0 5 579 582 0 0 *$****.**$.**....*$$*$$.......*$.....**$ $$$*$*$*$ 4 584 585 0 0 $$$.**$.**$$.....**$.....**$ 4 587 0 0 0 5 586 588 0 0 6 564 578 583 589 7 510 546 560 590 $$$$**$**$$....**$ 4 0 0 0 592 $$$$....**$..*...*$.*.....*$**.*...*$ 4 0 0 594 0 $$.......*$......*$.......*$.....**$ ....**$*$.*$..*$**$..**$ $$$$$$.*.*$*..*$ 4 596 597 598 0 .*.....*$..*...*$....**$ $$$.*.*$.**$..*$ $$...*$.**$..**$ $$$$..**...*$..*****$..**...*$ 4 600 601 602 603 5 593 595 599 604 $$$$$$.....**$.....**$ $$$$$$$...***$ 4 0 0 606 607 ..**$.***$..**$.....**$.....**$ ..*****$.*...*.*$..*...**$ $$$$..*...**$...*****$..*...**$ 4 609 610 611 0 $$$$$$..*$..**$ 4 0 0 613 0 5 608 0 612 614 *$..*$*$*..*$.*.*$ 4 616 448 0 0 4 0 0 116 0 5 617 0 618 0 .....**$.**..**$.**..**$ 4 0 620 0 0 ...**$...***$...**$..**$..*$ $$....*.*$.....**$.....*$ $$$...**$.*....*$.*....*$.*....*$...**$ 4 622 623 624 624 5 621 625 0 0 6 605 615 619 626 $$$$...*$...*.*$....*.*$....*..*$ $$$$.......*$.......*$$...**$ 4 0 0 628 629 $$$$*$*$ 4 0 0 631 0 5 0 0 630 632 $$$.......*$......*$......*$......*$.......*$ $$$$$$$......**$ 4 438 634 0 635 5 0 0 0 636 ....*.*$...*.*$...*$ ...**$$$$.......*$......**$.....*$ $$......**$.....*$.....**$$.......*$ .....**$$*$*$......**$$.**..*$***...*$ 4 638 639 640 641 $$*$*$.*$.**$...*$*$ ..**$$$*$$$.....**$*....*.*$ 4 643 0 644 0 *.....**$.......*$......**$.....*.*$.....**$ *$**$*$ 4 646 647 0 0 5 642 645 0 648 .....*$....****$.....*$......**$ 4 0 650 0 0 4 337 0 243 354 $$$....**$...****$...**.**$.....**$ 4 0 0 653 90 5 0 651 652 654 6 633 637 649 655 $......**$......**$.**$...*$ 4 657 0 0 0 $$$$$$.......*$......**$ 4 0 0 0 659 5 0 0 658 660 $$$$$**$..*....*$****..**$ $$$$$**$..*....*$****...*$ 4 0 0 662 663 $$$.....*$$...***$...**$...**$ 4 0 0 182 665 5 0 0 664 666 ......**$....*$...*$..**.*$...*$....*$......**$ 4 0 54 260 668 5 0 669 0 0 ..*....*$**$ ..*$**$ $*.....*$.*$.*$.*$*$ $.***$...*...*$..*....*$$$$.......*$ 4 671 672 673 674 *$.**$*.*$..*$ ....*.*$.....*$$$..**...*$..**...*$...*****$....*.*$ $$$.*$..**$..**$..**$.*$ $....***$$$**$**$$....**$ 4 676 677 678 679 4 0 54 0 0 4 0 468 0 0 5 675 680 681 682 6 661 667 670 683 $$$$$$..**$...*$ ..**$..*.*$.....*$..*..*$.....*$..*.*$..**$ ...*.*$....**$$$.......*$...**$...*.*$.....*$ 4 0 685 686 687 ...*$...**$....**$....***$*...**$...**$...*$ 4 0 0 689 0 5 197 198 688 690 4 565 0 0 0 $$$$$.......*$**....*$**....*$ 4 0 0 0 693 $$$$$*......*$.*....*$.*....*$ $$$$$*$.*$.*$ 4 0 0 695 696 5 409 692 694 697 4 631 528 0 0 $$...*$..***$..***$$**...**$**...**$ $$...*$..*.*$.**....*$.**....*$.***$..*.*$ 4 0 700 0 701 ...**$ 4 0 703 0 0 5 699 702 0 704 ......*$.......*$$$$..**$..*.*$..*$ $$.*.*$.*...*$.....*$.*....*$.....*$.*...*$ 4 0 706 631 707 .*....*$*......*$ .....*$...****$..*.*.**$.*..*.**$..*.*.**$...****$.....*$ $$$*$ 4 709 213 710 711 .*.*$ 4 0 713 0 0 5 708 712 714 0 6 691 698 705 715 7 627 656 684 716 8 591 717 0 0 $$**$...*$....*$..*.**$....*$...*$ ....*$..*.*$**$**$**$..*.*$....*$ **$$$$$$$......**$ $...*$....**$...**$ 4 719 720 721 722 $$$......**$......**$ ..**$..*..*$$......*$$....**$...*$ $**...**$**...**$.*****$..*.*$$..***$ 4 724 725 0 726 5 0 0 723 727 .**$.**$$.....**$.....**$$$.*$ ***$***$$...**$...**$$$.*$ 4 0 729 724 730 5 0 0 0 731 *....*$**..****$*....*$......**$ 4 733 647 0 0 $..*.*$...**$...*$$.....**$.....*.*$......*$ 4 735 0 0 0 4 0 0 92 0 ....*$..*.*$...**$ 4 0 738 0 0 5 734 736 737 739 $$..**$.*.*$*$*..*$*$.*.*$ ...**$...*$.*.*$.**$$$$..**$ ..**$ .*.*$.*$**$ 4 741 742 743 744 $$....*$...**$..**$.***$..**$...**$ *.*$*.*$..*$..*$..*...*$....**$**...**$ $$$$....*$....*.*$....**$ 4 746 747 124 748 5 745 749 0 0 6 728 732 740 750 ......*$....*$....*$...*$....*$....*$......*$ *$*$$*$$*...*.**$*..*.***$...**..*$ $$$$$....*.*$....**$.....*$ 4 752 753 754 59 $$$.......*$.*....**$.....***$*.....**$*......*$ $$*$***$.*.*$.*..*..*$.*.*...*$***$ 4 756 757 59 81 5 0 0 755 758 $$.....**$....*.*$...*$...*..*$...*$....*.*$ 4 116 0 297 760 $.......*$......*$.....**$..***.*$.*..*..*$..**$ *$.*$**$**$**$.*$*$ 4 0 0 762 763 5 0 0 761 764 ....*..*$....*..*$....*..*$.....**$ 4 0 766 0 0 4 766 0 0 0 5 767 768 0 542 ...*..*$.***..**$...*..*$ 4 0 528 0 770 $$.*.*$..**$..*$ ...*..*$****..**$...*..*$ 4 0 772 773 299 4 0 0 354 653 4 0 0 90 92 5 771 774 775 776 6 759 765 769 777 4 93 0 0 0 $$$$$$....*..*$..***..*$ ....*..*$ 4 0 780 0 781 $$$$$$....*..*$*****..*$ $.......*$$.......*$$$$**$ $......**$$.......*$ 4 783 784 781 785 5 779 0 782 786 $*$**$ .......*$.......*$$$.*$.*.....*$.......*$*$ $*$*$$$.......*$ .*$.*$$$$*...**$*****$**.**$ 4 788 789 790 791 *$..*$...*$...*$...*$..*$*$ $$..**$..**$ 4 793 794 0 0 5 0 319 792 795 $$...**..*$...**.*$.......*$ ....**$....*.*$*......*$.*..*..*$*......*$....*.*$....**$ $$.**$.**$ 4 797 798 799 0 .......*$......*$ *$*$*.....*$.....*.*$.....**$.....**$.....**$.....*.*$ ......*$ 4 801 802 0 803 5 800 804 0 0 $$$$*....**$**...**$*$ **.**$.***$$$$$$.**$ 4 806 807 0 13 5 808 0 0 0 6 787 796 805 809 $$$$$.....**$....*..*$...*****$ 4 0 0 0 811 5 95 0 0 812 4 383 565 0 0 4 0 93 0 0 $$$$$.....**$....*..*$*..*****$ 4 0 0 816 137 $...**$..*.**$...**.*$...***$...***$ .......*$.......*$$..*....*$$***....*$**.....*$**$ 4 0 0 818 819 5 814 815 817 820 ....*..*$.....**$ $$...**$...**..*$ ...**$.*...*$*.....*$*.*...*$*.....*$.*...*$...**$ 4 0 822 823 824 5 0 825 0 0 $......**$.....*.*$.......*$ $...*..**$$.......*$ $*$*...*$....*.*$.......*$.......*$.......*$....*.*$ 4 822 827 828 829 $$$$.......*$.......*$ .*.*$..*$$$*...**$*...**$*****$.*.*$ $$$$*....**$*....**$*$ $.***$$$$$$.**$ 4 831 832 833 834 4 0 124 0 0 4 0 13 0 0 5 830 835 836 837 6 813 821 826 838 7 751 778 810 839 $$$....**$....**$ **$**$$$$..**$ 4 0 0 841 842 5 0 0 843 0 $$......**$.......*$.......*$.......*$ $$...**$****$*.**$*.**$***$ $.*$..**$.**$$....*$....*$....*$ $$$......*$.....*$.....*$.....*$......*$ 4 845 846 847 848 $$**$.*$.....***$....*$.....**$.*$ $$$$**$..*$..*$.*$ 4 0 0 850 851 4 0 0 0 291 $$$$$$****$...*$ 4 87 0 854 0 5 849 852 853 855 6 844 0 856 0 5 0 0 0 380 5 0 0 654 737 6 0 0 858 859 .....**$...**.**$...****$....**$ $.......*$ 4 861 862 0 0 ...*$..*$ 4 864 0 0 0 $$$$$$.......*$ *$.*$..*$..*$..*$.*$*$ *.*$.**$$$....**$**$*.*$..*$ 4 866 182 867 868 *$**$.**$.***$.**$**$*$ $.....**$.....**$$$$.......*$.......*$ 4 0 0 870 871 5 863 865 869 872 $$$$$$**$ $$$$$....**$...*..*$...*..*$ 4 0 0 874 875 $$$$$.......*$$......*$ $$$$.*.....*$...*...*$...*$....*$ ......**$$$$$....**$...*..*$...*..*$ 4 877 878 879 358 5 0 197 876 880 4 0 743 0 0 $$$.......*$.......*$$.....**$.....**$ $$*$**$**$$..**$..**$ $$$.......*$......**$......**$......**$.......*$ $$*$.*$....**$....**$*$.*$ 4 883 884 885 886 4 0 87 0 0 5 882 887 0 888 *$$$$$.......*$.......*$.......*$ ...*..*$....**$$$$*$.*$ $$......*$......*$$......*$$......*$ $$*......*$..*...*$..*....*$...*$..*$..*$ 4 890 891 892 893 ...*..*$....**$ $$......*$.....*$......*$ ..*$****$.*.**$.*.***$.*.**$****$..*$ 4 895 896 897 260 4 803 81 0 0 5 894 898 899 0 6 873 881 889 900 $$$$*$**$.**.*$.*..*$ $$$.......*$......**$.....***$......**$.......*$ .**.*$**$*$ $....*$..*.*$...**$ 4 902 903 904 905 $$*$*$....**$....**$....**$*$ $$....**$....**$$**$**$.....*$ ....***$...*...*$..*.***$...*****$ 4 907 908 81 909 5 198 409 906 910 4 93 861 0 0 4 0 0 98 0 5 692 912 913 0 $$.**....*$.***..**$.**....*$ $$*..*$*...*$*..*$ 4 915 916 0 0 ...*$....*$..***$ 4 918 0 54 87 $$$$$.....***$.......*$......*$ 4 0 0 0 920 5 917 919 0 921 $$$$...*$...****$....****$....*..*$ ....****$...****$...*$ 4 923 59 924 528 $$$$$$$..*$ ...**$..**$ $$$.......*$....****$...****$...*..*$...****$ 4 926 0 927 928 $$$......**$......*$$.......*$ 4 0 930 121 47 5 925 0 929 931 6 911 914 922 932 7 857 860 901 933 *$*$ 4 0 0 212 935 5 0 0 0 936 6 0 937 0 0 $$$..*$.**$***$.**$..*$ $$$.*$.**$.***$.**$.*$ 4 0 0 939 940 $$$$$$$.*$ $$$$.....**$......**$.....*$ *.*$**$ 4 0 942 943 944 $$$$$$....*$...*.*$ $$$......*$......**$.....*.*$ ..*...**$..*...**$..*...**$...*.*$....*$ $.....***$....****$....*..*$....****$.....***$ 4 946 947 948 949 $.....***$....*$$...*$...**$ *$*$$$.....*$*....*$*$ ......*$.....*.*$.**..*.*$.**....*$.......*$....*..*$.....**$ 4 0 951 952 953 5 941 945 950 954 .....**$....*.*$....*$...**$$$......**$.....*$ ....****$.......*$$$$$$.*$ ....*$....*$....*$.....*$......**$ ..*...**$*.**..**$..*$.*$ 4 956 957 958 959 4 124 0 0 0 $$*$$.*$**$ 4 962 0 0 0 5 960 961 963 0 6 955 964 0 0 7 938 965 0 0 8 840 934 0 966 9 718 967 0 0 10 475 968 0 0 4 0 0 291 854 5 0 0 970 0 ...**$...*$.*.*$.**$ 4 0 972 0 794 4 972 0 0 0 5 0 0 973 974 6 0 0 971 975 4 862 864 0 0 $$$.......*$......*$......*$......*$......*$ 4 0 0 0 978 5 977 0 0 979 ...**$...**$ $$*$.*$..*$..*$..*$..*$ $$$.**...**$$..*...*$...***$...***$ 4 0 981 982 983 5 0 0 984 0 ......*$......*$.......*$$$$$.......*$ 4 0 986 0 0 $.......*$.......*$$....*$...*$...*...*$.*.....*$ $*$**$.**.*$.*..*$.**.*$**$*$ 4 988 989 0 0 $$$$$..***$..***$.*...*$ $**...**$ $$$$$$$..*****$ 4 991 0 992 993 5 0 987 990 994 ..*$..*$.*$*$$$.*.....*$*......*$ $$$$$*.....*$.....***$**...***$ $...**$...**$$$......*$.....*.*$.......*$ 4 996 997 87 998 $**$**$$$$$*$ 4 0 0 1000 0 $$$$$.......*$......**$.....***$ .......*$......**$.....*.*$.....**$*$*$....**$....**$ ......**$.......*$ ....**$*$*$ 4 1002 1003 1004 1005 *$*$$$$$**$**$ 4 1007 0 0 0 5 999 1001 1006 1008 6 980 985 995 1009 7 976 0 1010 0 $$$..**$..**$ .*.***.*$..*...*$...***$....*$$$$...**$ 4 1012 1013 0 703 5 0 1014 0 0 6 1015 0 0 0 7 1016 0 0 0 8 1011 0 1017 0 9 1018 0 0 0 10 1019 0 0 0 11 969 1020 0 0 12 0 9 0 1021 golly-3.3-src/Patterns/HashLife/metapixel-galaxy.mc.gz0000644000175000017500000010435312026730263017720 00000000000000‹#õHmetapixel-galaxy.mc­ý[Ï4I’Þç¯H@ˆ 4ƒ~ˆÃ,ö‚Ôr Hh(ðBX5=5Ý…íîê­ª††ÿ^þ¾€Ãk²¶ÞÏ<ý½¦ÞÝ7×ñê=áÃúë`üíó²Æ7déΉ_d 0ΫþÛó}Iø³tä½>â÷1ÏWŸÞH<ŽÑXFï³NÜ|EJ¹Mø–){1ºêDJ4ö°§fkrj™?Cù¾˜8Íþ”F@¹ðÿŸƒF"ˆ¾Íþu²-e\Úƒa­é•¹EAøxìóÀ7è*;ßñ4âók¼Ï/¤•ÓÒ<}ã (Çÿÿ ‚ä0J%où¤Ÿ…ÿ»QÞŸŸç^ÜiK›Br˜ãkœšµ×æ8Èl”óXØ}Å_Œ%r@¤C\½-ïå2}5#.o³ý€è­ÞYI·#Ú×)ìF&Éåv\tœÂ c樕üÇËAéc8ÿÅ)šr4ù¤3ÿ‹ ïD¸ŒðêrÑd뇿/i7 «Ë×׬2ƒ¾!AøðK9;’‹ó`«9¶æZ»H–ß“/Õ:ÏüJ_/KÐÄc_@Ã&òhÔùí®¹ê7`ÜÍ“KýÚ¸ù €¤®.Ñ{Bq/³ •IAãË·7C¤Û5Öc\u|n€sÿÕ¹.ðxê<úIÀyЩ“寀,È›ˆ¦—OX€ß~йh"p•FÞ¸Ùá797Š~™;Hnü›ØTž±i=ô.åsî#tÿ:VPçIÃ:Ê_}2¾8&—²s,í˜r Lßþf^‚>0PÚ–Ý¥ˆØ8£m>© ‡•>¡DfÊ“qŠ?zc¿€WÝDÍ'.Ê-,|ÀxÔÁÃÜ¿RÎËød7"FkB5•ÛQÁ°¨ú5ÐÊèÃŒRÓ“_¾&U¨}ñÛxœ¢=ñš†ßj ÈÓašò´ÌáÇmMSA‡/cÄÎ~òË>˜Õ!þHI¯yAf¤òkîlë$=»HéT>+kÏa6ƒ¡ÜÝ‘=‚3ê½æAÑЮCü‰ÑÌ÷šÜæÏÕãhŸ˜ð6à4~.óÇê¯ñýónm}sW¨‘mƒ ñXìS»Þúû ¶ÇB'. zöý2Šªïß”ÊÕ(ý$0ÃêÜ]‚8Éɉ0êí$}ovbÇu_óÀ°aU¯þ\ÇQ4g‡ºàiÉŠ'ÌÔ_ñ¹Ñ$ŽBi„ŽOø±‚¸– SJ!û1Í㻳«øìrvª–æÎ )¢åN¾ç_} ¬£/™O¨˜ñüc„΢Ýéï¹Cß=˜ËvÌ|R—üwŒçòìKùØ-2íÙ&OtÎ^`õ/ )­ªÆy$-hãûtÈŒÒÓ‡ `›†³ÉúÙEÿÍxyEË«×ÉÇòXóȹV?2Jñ€…OÀ*™0º¹SˆÎ2Æž{t1€tˆ}cÄgã/¸¡ÍîA*kðúzxR²Ì@és™qƒ?5=0á½/&{Âï—±°å^êhw“çe‰¡¸ •-†—™ßx–²HžšÄÆP~”u»Ý,å9k»tŸô®£zh°·rëÁˆºkácG„õå¿´e³à^…º÷;ŒÔÕË2›™ö­yöéÙ¶7ZùKåÍdÜ/(6ò1A§ÔåÐè˜ÚäzèÖ¾Þº*Io¥â—çS²þç A÷t^œ5§¥ ©>çT‡g´…ì´™ƒÖé6Î7 ÕÉfc-oF’VLk݇ǫ<ö× èn -jãx\Eí‚ÅeV¨/].NË@bÖy\±uYçKQ¯Xfc=F:ï\®#uDÄjcÿ±Mï|î›w»]yøå>ù7øÄz <5»=;]y³©3” ŠyÅCó‹a´–ì½} àx-¦ÌmÒ&6_p#r>%ä²B1ª´Ð¦Å³o;ø“N±6¢IHǬÍk¨^‘^ìm&cÞ[©â×Ìa/{9uÍKPû#O[?FÝNËŽÐÈ€ÖzŠ´Äjl!ÓÔ8ùÀ=ªª†š?ld…’ÀdÝR6©æÍœÍZbeäù¦RtQŽKë@•ÖK,¡´{-]ŒüÚšlYaeÄ-b·®%Löê\ýª”ë{lC•ñé´š(”âŸWçfé@D¦õœÓL:ó…¹ÏÈÁÛõ/¾â'zß6~ÀêÍŸ¾ŒOßÈûV; /7q ¼jÒá‹Ñ¿ñÔ“6}°gÛ¯Çøàyt=6PuÇéPá6Î~(м•ª<ã<Îõý‡O_å@èN‘¸»š «N ±·NÑç;¯ûƒ¡YÍlìåvyôÐúСÞféË}¨ú0c›õZýí¤³™s¡/§³J!¨¯ðwéö|PÝ‘§nÐ}…G8bdùæ`Khù2Å'Œs{pÜ; 3t1Ž[¾nMÇUL_AxÚimZ {'ºX²t#u,Èç¾â—÷íª-–=!¥aµà´Ù¨¯ÐõfT2#9Çg¬axòqÝžéR.’ͭɯýŒ¢N>ÓØêÑ$~vX Òð‹¦÷(ö0ÔØæGëû¼oµ$¦n9†ö‡¶üï딤e\OT þë¦X½÷ÍÇÃç2CYݶÁM^Ï`¬ùÖãÝkü¼Áv¯~Ì5B/¶~pžK§ðèÜ lù½tÜÝß—ð,ôöàÜ—²˜­m„9ßžW­¦úàö×4à¢ò <óñó6ׯšÇIÍnäßš>8nù0¯§úEÛ³ü0Ý.á¦ø}lðo¡áƒŽdnnźvðâ»Jö‡X½ŒdîåSج Í'A°…‰^Ó‡µ‡ `ÔkoD»yFn?Ì^ÍZ5d³’ödÏ.£*œ¼PkæÙ—íŽñäûåÎwóðÑ¥éË„jðÍýŸ§BØÃ6û.Ħ©· UÀOh‡\ÆJ—ñóãKÔ6¯É×å‚K×ë»W­ *—®O‡AKfƒ½.e6Ò[ÞM­eºûÔlŠôÙ;3ˆÝ»ôI·?¹o¨ºZPhßl”ÏĪ>;lœ£h mã0ÏžFà}”–÷Ö}zOÁõað0LläM¾j½ÜEõyJ6†Bàþ¥Ú fïvêb.0Öb”½¨ñM£É—m;ØÜoÒöú„µŸåE™SKÄãË6ûß×äbDž²~‚Tê’o¹q@¯ÖÐ6]+F×Òd„îí{'.F­ÂÁY~°…¼å°êe†êìfÍÃÂUÐϽ°,ý¥ ZcAwŸ÷m÷¦l¹‘÷>ß@;M·ê¿Ä.»ÀyP¨"<.ü.aqÞšŒRK5soÔÅÖM„ßüÊ{û‡(™?v»tIô%,>‰ƒÍcÖÔ‡½ÒEÃÃÎùÒ°¯}YL³õ}`ûdSçÞÅvæš|^w¾^lV¿³¶7~²üô±Z&Û9¥ù§=‚—šHÎeaʆHK|¼ÒÕÔ4ÝŠ¼Ïn„§œU{Lh¨öž´$P¹sM4ŠÞü©ºÁ„v]¼ {¬cÐÉY~„¤w ië‰MÏOèèœÆfßR«*c{Ó´¾»æ76 ð¼>°ä¨OCƒa°¡['gûÑÕ«jÌÉÇñUl0MË?~ù¢á½‡`ÓJ>“0¨B‡å‡ÌÒ»è`3_Æ´„ˆ#‘ð}“žC»NϽй-PÔ¤"*oMn¤ÔÉõC«§^éM¾Róoiôe_x‚½Û•Ìçá¥êË‘;ßxô‹UIÝ­2ªÂ'X&ó²Õ9õb{v0e­v Z{ºu–™SY祲wj")ößEÅEQªE’ 勲Óó‘¨zÕ“RÇÚ‘…>ÖžײÜËG=:s{.;ÖOߪ|üÍ·Å8ÍuýEŽ{‹†ž¥¡¨»Ð^æ8Цoâ†Âh5ŒÅ7м#øS齨“ÇÒÓp‘K‡Ë§âûxwY;"ëCû'òžÔñâ´Ñ>øï%+›m¿K z­ë-0+´h˜Ç k÷‚)þè/2ƒš¸“õý ObE}ŠáèÑÌl>5E´n²>Ùk?š$ÅÖ{Ê–êÉE‡ô ¼Bn²Ð¡ŸO|I»á‡6³èuüÙøÙR›Ÿyö›þàü«g¿Ì=ƒZdsÿ²þ|¢ÝÈpÕ=ûo§¢ænöÉÓã¯@ÜwYó!*–ãïA–HoPTJ5 ÷é}uÕ=rc/×8ì}Ež 9ýJ;6X¼ãHN^Ñ!#)ò‹Ñá£ÃWôŸ5Ê2u„Ú«ÃTlªæÙ"È*7¦Ù:ÍÆ}BÙâËI¼¨ö¸'Ý Ì´éPÔK­X ÅVfRÄ#Ø2mäÅ7×~²ýÀU^äb×´Åí¡H¡ÂÈɤsï4šËé-XQ]tñƒ¨ªÏg—´“’©®×uc9ÅŸúœcáñåÖÇÍé©äÕÉ5ZQn }hh˜Y…µ| Ÿ£Í2<3öòÅ:â_sX®-hŠ3ÒX¦[Ÿ‹;I1Êá ]¬ÙÀšžœ4Ãì\iiØ-Žmü)È4jS1lM—ÈhεAŽ/¦èó3â=anͬÛÉ*aÎ]ÿ¾ŒÎ}ª£ñßm'G…KtJ½ØfÓùg鋺µ>Äg“®J‘zDe‘«EÁép¬ø3¶T¸!Õ…¯6²1;Ô—¸“Õ)cq’êÔfÀ]l„×܆.ÅïÌff™Œ¢6JžÉtÌâ¤Òåo‡ýâ…±têŠtî4g¶f/ésš"ªz—nžÎnÀù³K˜Q¨3=;E{bËú:µn™íNÞy¯Z"µM‹‰+R¡8Ë5jÝ‹LŽ€¾ÌvV´ ê `gI—4C·Ë}®Ë4ºÎ-¨GCÿЇ&cíГÒÑÏŠ3êÁ/“O£q6G˜Ï³y¥/“]#o~úâaÅqïÎûóîb(DçùŠZôŽ«Pø±´ JD£‹)õ›´2õæÎß.Y—@Â:`A#A= dd9õ"û ¹}A}r™½§^¤6_ ý ›íd'ô†aÖ.4z©·#ÚÔ ½j TëØ}}ÃÈê}´Ò\Ÿö>–CÝj;I.ò_0òÆŠ¥…HLøžNÖ™Ôè"ïN aà>Ê'ÁÞ‹Ù¤b, ò$ÚóÝ*qjK4Kh ËÑD ­n±l™¬Ëglj¼-{rIäÛhZ|j¯@«u`R´”ñeã0¿Åæ÷0’û73Ά †s‰¯ëÞj¤¥nÕYý4LÀç4wÑú²)ÏsÐVÞÝ«¯È-×W¢¥û_}‹Ù‡Aµ ,<`ýþe4•^7©+ºÌ.ì¼õÈn/3oïT=9½-iQ„Ê]}›=õÖÀÜzñ¶ÃÖml?)†'3^—¥ÃÏ?›jVŒ˜ýiý’ÅÍ }^R9Y™ýu jýd‹ *vŠT…’eT NbQר¡ë:ªO_zQ ó2#Æ…»›‡ºÌå·x¡áyýY!Ou½%•¾a1Jègm/Uôui2–wÿe©CÁléÙ%¦ÉOƒá œ†‚ì,´ µZ&,Lýë]½:±Lã*dªÃ´l5³?3wßIZèS"cyä«·f#ÑßÜ<¶ìÞr—HA¶Üúý•ÖCÓ%z57ù5?æôßðäí¡Q_*º"ÝN³1NW²÷€6ì\gÖæÒu…Vš8ŸU¥ø³ª»4ˆsXÏ+¥MÎ}fc[Þ>?Èzÿb=tãÁ€d_nlçTŠ8Ù‡äs‹}Déb ó.{ä¹ªî¡ Òcú\¶t;EÅ}Ó¼n èd?ź/*{\ÉíZáÔ96¸/3TG˜Ï‰T aÀŸz©sÁ£¼÷YÊœ ù¦¸{5ü]<ˆxásOoì$ôl…ÏЯ‰¥9MŸöÈ“R¥ZOþM²[þÒp2×p ‚½³ÕíðÁ³î•=ै×]_ÍwSË9Ÿ©³5«]$õ>;Ü -õ<ÿ·<¨Ïp}qžý·{6Nè(vQ°.ƒ.®¢… 5–y¨QHr(bgFÞ. ­p×±„e8bû@Þj`õÑ2ZæGyGõ\ýòº/Çž–®“"rz|à—ô®@Pô9Çš0BÄuëâ‹¥Ãi^B»øùؘ+Ö†ÓÔªð„+Ž ƒzå2ß'ï³Äuæ9€a$Ýa–}¶s¨^ÆG‰ˆ~¶îaËØMl¢ D~Í]_Ü©«ßÈgažÜ¼r‘â\c™ÍRê"Åb¹!f©6ÄW߯ý k´ØtŒ6ÝAœÃ5ßjäm¼ó¥êßYµ„ó/¯ƒ,Îs0kn…u¦áfµÏÊH/o<éª>Ô|“ÿGA0hGý;ÇïºÁg u“Z]>Hº:Œ:E*{Ç7Ù%¢ÀÄÌbÐt´·s>˜¼äVÿÄŠåöد6ˆµWûxÙ•¸£ ¶ºÅëî$b= *[±±±«\}è†ËÀˆ‹ý[fC~xÎã®Ñšô©1ÛÉ;Ô… ÞHµ7ª.V›¸bÿæuæ‚¶ ªéwëñ!¹ˆóâeö4ö)à´?ðõ·¯ÊyãR';›Pó6Ñ´vOÞˆ§Ë%y,ì¾ID×_V:¥j½L6­pA~8\œLú™P•5+ø½¥yâóFŽl> ¼n;Š¥{•`¯>ëÐràÍìžÆM&-œC‡Oê7P`ÙÂâRM%¸a9L%€t“³~yÁØe0ý]bJóÉÔpä”@?ƒ$»q€7èUO®«f×Ó4èržœ}97›=6”U-Œ³K![ð€YDÇz§ˆ%45…ùÚY31ЂÈëâ}ŽÔçí{§¾ÐÑ:›–>ÙßÐ:4Äj@ï2–¾8j´Þ¢³†p‚÷ù+íb}„ãjšºRZæùCmxbšzó×cßxgù€‰o=¼üÖ‡§ÅÄð@¾•TN¬K ëèË /¸œ» еQ¾.]TEÌ´˾˜žæ{¯·VwR‰œñÄòä½D;˜mþEÿEüzkÌ 5Ï–7 ‰å±è&ÌgGXÀñ´2ÍŸéâD¨ qˆÏuá¹OT3Åi‚ºÿ¦Ý1}#…0ûØx‰4eOx}ž‹’üò¨ë²~xn(k\˜€Vj™o£ 3êú®¸5Ÿ| y+:$úÎK¯ï¤é«ŠÆÄ®ñAcƒÔÜë^c/¡îéSN =š2ôz7,{q/I[§’#½ÔÙÆdý5ko_?¶ÇæÛõ)ÏϹ8>Ui—aôm&Ûò+¼Ë{qä’X¯ÒÁ¿˜b½ñÛÝéÑò,ËóË8ó¯ªCÅVÇˊN¶þÑœBa%ã>‰ãÞà–/˽c“ Ýl— J|dÑ­ž8ó;ù ˘|¡R»ž (þͪFùƒ]=8;Gy“Û2ÁaeXg‚9˜Gå‡ ¨.J­€Ç ASÀäX=îŸ+sE˜[³"c¨žnû0N<¾ö¡rº¯Ú F¿UÓHŒCågQ0T-]Ýž `üÌìVù/¤ÈP„a,™u7˜üÊSŽA(¬*Š]#N%¡0Jƒ±èárdoöiåiÑøæ.Ç•‡Ì>š/>¬xQÌñÈVí#þîÜ¿øá }ûã¾u9ÇΧy€«ï äæ{ ³9g‹‘¹7èæ¯_ÌÀ›ÇçÊ.‚ƒÂ¼ ‹¹?õt%ï®Í—Í<úÛ­BõS'y«¡Qœuÿô­ÇÞÊÅØrzLHÚu÷è^·¸ …£½â¯(;î-w ,ÌÚ7«M§X°µ£vžocÝ¿D*¿!Úq¶h®H¥Ø*Bb¸r~4º}Xå'ýŠP1@>ü34 Ü7ÈúgØ9<ò ÆVƒ¼Ö.†>àó>Ñ^³t®ú\ûëõNN÷¡Å­ÚNzLS<óq—s­: M–¯E8-¼·ŽU\F€ýƾh?ŠÑ¸ày¹ ˆåÙ¶€ña´QáOÂÿÖÖ‘tûò¹õ4ß21Byÿ2°’wÿø7ÏåóÓ*e,ÿãöÈçþ%ëM<†9Oîô/Q\)MÎCC³-¬pÐ2 ˆê[ýÄ9ó½­Hœ°p¯"¢5>áÛ”–.›Ÿ­%†: èÈ]_=æÿ-OÝÅÖLŸ¾ ”\­È3Zü§Gý6mãå£ò%8KÎ៕-ʦ¡m×ïœâÇ_¾ÙtÈ£é b£Œ)÷KøŽ­§Á(Åî›ÄºÅ®Ÿ8††ºO¤ò©ÍdG2ç[ÕîOÞyÊ„…~R"]c;vìé‹F&R>WÝ‹?sÐw¤´Ð<ðô4(— *"ûmU.ŒÅËG¤ô΂7UÙØ°ëør÷æ%|y>9Ž|}Z•rùlo‘ºm$KéS[qV_tŽ€™ŸOÉô:CD¡ð饓ˈ=™¶?ó‡Jï÷· 7|4³ŒE½éýᇄ˜?ö÷x.к°åÒ}ëg³Q¦è¦éç }ë‰{ão*ûOïÃó£Î¸W…î¿h0}XDdø«ü‚¿oB½[Ìl¾XIìq°>7‘e÷}¦ÁÃñ@>koªV?7ZüúVô¶¯¹÷ä7!l4B9nݽ¼ïÙà¡ó¨Î£Ôa­Ÿw¤ñö¡¦WÅyÜVyûÁùÏ/A: ï¦vç­]—ç\ç2Pêv\F?ì®ö?áõ¦]DX-¿½é­ÍCœ ÖñÇæwò±Ù4¶¾AË‘ùõc_wºˆ2ÿTÿYìÄÇæ¹§´/ýKÐnžZÆ¢/ÀûùÙo ×ÍïÒ]}5_Ým–ŸFx’Î7æ1ßš·µ—ô¾Ëní:ù¡õÅǬr¶ä„PÙ/õ윶ÌÓ–¥ý ‡•5vAãOOá6Ê7x¶œ¨î•öäø9j‹/'ýõÃË2|ùôð2àÿŽŽþ1aHâc#q1D8~Õî ùDæ/>¿¹Ìa‘h7=—þ¹Ã/æyeãÂ~µùojýh_´þjq_5ÿ&w><û±“{ÕS–Œcö6ú7@çãŸWãýX\a‰ZÝ'¦¦µÚ[–Nôho_ï~]|õÄ•·Ò¯Ÿû&áüúSÿ-ý Ÿzïet‰øµ~Aßã7¼ÙSãìôÚ°åF ÷¼|/^¾(î  #$öhtþÍåy|à×¾ü¶æ÷yÜ ÷N¥÷þ²¢_ü©UÐd&ö9b™U¹m–ÛÞ˜LdKWî\”« iÖgl5K·7&‹Îz…|úôb5‹w*ˆžÌî{bPÛ¼ìøåƒYƲ Ì6I)”)-:³þ«WzE/[†–ñÉ+^ᬧ‡©_vxñœ2㉗ڵSp&¢óó ]ƒÇ¤µ+ÁšÍCg8c‡îd$Ùs/ïÒ¹‹µgv(Îíe+iž/7ÔõþÅå®bÔ]y‰Žw‰¸¨Béqùyî7×.´ÃÍʼåâ³,¢!Ô6-¦"MSú¯%¥Ÿ[ÄÖÐ)ßH`ðˆ¼‘÷¶8™9$’ËèÁ©éùåå|£õKÁîØÕS£-Ë—Ø­ëÎ †EƬÌ5pô (½©kÙž|Ë SÓPܧÈ*lÄÜ›.óø³#?45îpǪqÕqÙ;çàû|ŸkǨM)ȃNñ13Þ‘ª-;{†ØêÒÂÔéÎ,»JVãÜ4»%Þk<Àã·ÏÞ¨ÿç{ÎÑ#iŒ´Ý[.™ÛEnX«6zÉŽàýË+L¡“Ç€“%Âßiå5Ì}Ž®´SϽºsã‰Ó©".ÇÉá1±Hv¢ Sˆº±jz§ÿðê"'wW‹# Ü7 nT±¨_b»iº­!¢µãùÃRnöþ+“Û‹ËoGbW#&|æðÔ2»< sò¡(7EÄJC_zÿô/Ïg¦.÷MLè$îmo$:Zíేzòól-mÑ/š—>Ð@hq'<°ý­ñ­mÀâò¡õ=Êíß¡e—~Ë@åxehöº `Ö¡ýˆ’ØpWÜÚóC›Å¤Š)ÎN—aÈûCKßí»±ýôql?ÿÞö&¿lhë{TSRÝ›uù—o7ôÏ/š}h2góVq½ÁM†¿Ï ÜÁó¹·šúÙê_âBûc¾ÄÚ)Xo¯ÐãèM|s’¯[£ôr#©'LnŸßìÿ¡ÎB[©”þxHWíߟ Gš›Jb„ðW ™ç鱦_{f”1ÖK Ìòæ¡ëiz<æ+ÛénßXôxæV¯`ù¢¢•š¥?ÏŠƒ=5Ìÿ¥§‘º˜Ì¬ä„{p¶´‰ñí*Uµ§èïõãa/Sâ‡èagŸÿçê^lá•)¶å¿Ù=·Ì_ýUV¾¼n©ŒĈKbmÞƒ¡Ëâó"„cÙ2–Ý­ûHz½’å­ú‡Õ,qêz½4Øõý¢ðïþ{D´·_–¹¾K}]§W/³³ààJ¸¥&Ì£|1º„g·?g÷1€) -LÓÑ;[ðK9÷å±)‡¾Ö ^Ÿ/Ú—¡+c_Ò2ûÔ—y ,µôŸóì  þ¸Ëö¡Òª¬bnªâüh½õ¤c„mŸ“>héPÔV!ãoããmår¿håÒŒ¼ƒœ>¦®fokÜ<{ìtùXÇ2zÄ:·ŸJ¹KËâ.IoÕ™Õ&:Ôwˆä¯M¢@ðÂ)Ê\¥òNÔNƒ“Ï}¶…ö:§Ú×Ú¹yµ÷ÚÁpÊ™} ÖbŠ€t¡×¸wîgÕHÓ“øcî](øe-ñÏËà KœFœeœ®Ì¦q%7áP6à¬Ë¥0œO5¶°jEKXl¤èŽ…9~»WÞ¾yµQ‰“L„VIpã—ð€c94ï sG>*GkI?Òþ×u·òèè[:Æ®¼¡ùW*û'—pä €Þe€Õ½±-¸kü>úÐÔT‚#Û™°·Xn‹T"~´3¹u›X‡›ƒ£?`h N¡·üîÃÎ÷ú>Q+Ìà #Ai>W66úÔf‰ ¦Ö›Œmzã@ÆË] ÍÃB­në ÍC=CQãR̓@×9¬/ö5¶ ßBE@ð‡6ÎeÝJˆ´î¯ßþȨ×ÎãB~c³{«ð©6]o²Ì&£\9ê¿¡ÅÒ[ ŠTÿjoÑž×ýÑo°Á"ú@.OÞùb&K'ã±ñüyˆÙ:íé› |“rîñ…9øPÏG–‘]vý8µyèf˜Ù­¼û *¸BJ/›àý¯Eõï@ù¶Dûvûߨð¶®o7ÿB¢††ŸÚù·o´ÿmÓøÐê_Ðù¯Ìy”\±~ª~ ÜÛšòýÖ}€o¬b¨îE±áÇoC‹ËL=£Àó£VÙHú É‹Ê:“y‘2µ¥Î4ì/º‰ãvÜb­ã t±îóßdm•¯=i*.ÚéeË:^LÔ/J[.sȪ’2oÖ·¢ªíý÷àa'^óº'WÑIž}Eúrƒi,zRŽu½ÂGêWîJz‰kvC颠˜Z,–ajÍ!: Tš  #ƒ.\\ Fòé=„\3|{Ý€Õ¡‹¡ô8¹ Ï{‘¥h„Úé ©ZìIµdæPw L_”[…Îdxœ'ŸC§\F^hÚÂzë0³Y ì8<¹o˜J§c'ƒNÓ&f.¯a ”¸&‹xuèx½ãr,7Y±Øê´ÚÈͰŒÚ‚ƒ|ê¾,ó²|n¸X"W ƱqYÀá2÷…»•ñ¥ê ½Ù\–( ŒèÈš5R5¨q#Å*”§(ëîuF±¦ƒ8Fg¦% Öe“SÕmÂ.' ¨}®F2û{áÐC ¬e4Fb\^."æiø7ý2ÇôÉÏ·A<Ý zÿ‘å>|ü†–qY&O;¦ï]DÚqAë òhj_ 8s$áXçásœ” —%Jš¹×ö¦×nil³ø„ÅÓÀÙßV¤_­mT&]î Xx4\žfô­º7 qÿÏ˽ º|Ë@ya¼ÿ}f²­>ȘüÌ‚ø¢H®È„ßjúèüí–yúX?2êØQ÷ÕfèëÃêï(p/Ÿ:V냜‘ïÈZú RðC#ÓÑ7çý‰ìüˇv.K¢›?õè :ñ}«ÙÕçù_?“ã]…~ ”¯ÿ7¶^¾Ù8Õ#ò*µÝ¬j2KòV¼˜(P¹|«ñ¡¼ÂFŸý3 în&~ÔfØŸyhÿÉ-¤Ùœ´èÙ~·iÅ^¸Ø(n3÷]kÞ­#_¦Qζóu?¾áE#ù~QÑG_ÖçÊ"Ï=JÕe`”ß5ùk}¢¬HÁÝÿx•õçqKð¢æNn^b3ƒµÓ nq4*Å‘Jœ¥½NfÑ¿iEИq‰]Ñ^N¼ÍcÛ=”×ù†ˆáKh4nð©O=-¬ÿ}Vº4cïwï«W˜•4÷Õó2b¿)Âiw‡¸âΙãQ¼ÜŠmf³ÚúÍê§aãPË`ãò€6›_'0SN¡…¶p¬ H\¸[b¢÷ê.p¢¸°ÚÏþf]7F¶]h27)¯Ü+—dá2ã®ÇoÝ[³ò©v˜¢Wª<.h[õøÇÜ ¦O±ëñ¥ ­¦\ŒÇ¥3ß³¸Œ‰nÂ|oÑpÛ“y´rʉ_¾hÕÝq97sÄIv¹7ÓV÷/ó8ÿ/Û-›õÏð%4ësŽb|y1¶³/Ó³6Lîã”­žXþªÍ·}$£/[ýJ_ËK[`¾‚Olöå¤*Í+ÆùMæ.BÈA·zUÐ7!ú= -uRó0©P?9Ûľ\èz‘7ß‹¦9¶2mÑ‹Z2ÎȱÞJiì(7B xµ}+âšç0ŸÔ8Ëà%ù¾aõþ'–ʸó˜lçµvlfÊl GáX¤éE1h½ ϾBÙÝx§¦]eèü¬±øF,7Ìtß*;åÍC]Ô•J{Y@„)®PwonKìÜ:"/¬ä!¶>-ôÛµê®åüK¬_ ¾ªu´=§‡u­ñeëêsƒË»WÙ}/úé9£NcãRÆ [˜BH]f>=»v±ì_¼ÂúXÆrÙ­d™?43ǰŠ ÛuY´iòãH…±(R@”Æ·†Y7ÐP,›°=¨ÌJ>4–¸çöt±cá ÅÁÏ“a‚üúhàM0/ƒEÞ£ìÙÛýÙ%(î[¹;•÷âe°¡rñ)kn2f,Ræcñ³â«~¾h¿Ù-Æ0 ä¿—­jø}+¸ÿT¬ó§‚S‹>õÅóí·N~âÇüø=ßOCçV­ƒÏfZyýmð{5íÞðS‚Ÿ·mñº/å6Ûù¾tñnæá§ÿ˜o ¾O]lëágìkú€bÎþ³Ÿ³ß„I[aÐ{@â{öý·>ÌSüÇ•¼6–4¶¾L½Ø\Í›CÁ<õñß:à<üFí¼ PäùÃÐ9þÏ:8ÉšÏ^w?"â/þ°'çþÛ‘òšJòd\²üöîô§÷#p29hsÙ½%L–í4¡.±‘þ¶þâOüèËyù†Œ?8Ë‚Œ@ #Fñ¯É:ùÝimî}6/á,ÿ­ð SÿãÌŒ‡ãO£¹@³ÿŠ-u¢V;™Ô&VŒBF`ïrêvƒôXµ Yù­äfë ÷Ÿ¦}¬@÷mÂϾ‰è´ l0£¾×MŸ©Cn`ˆíŒõº7Ë.Q÷Ҫ헵ÿ 5q%³í¿úÏàëSêo_™L¾Hc2ùa16ÿíb±ÿö'4âÏð£8¦âÏáWÿ1àL·¦yˆKN÷º‡95šÙËXðɺþú·ø"ñ÷ãgð^FãUy*üìßÇš¡ÓÞl¾u!Áþ± Nwž4æì)V<Ü£i¼ i¨š—ÁLžbk€3dêï¡v¬³9t;›/§c˜)å]Ò/7ß"˜ÄÁ46kvRN},Ñ(*¾^7 ]„ÍâQe$ô|pœ˜k¨Ùžp‡N †ÙÍžþìøarR)Ä»TkLþvÙ‚sT_ ÃèHw>Üêb}•wzoø×¾­ü_iß²|ײÿíüv¶o——më»¶¯[žiåè²àa-l¿3¿m½å¥ßêðôVBG§æØ{ê_9üæl{èkËýk #¤0ØñN˜k ¶³—Ë·qj­|ç×d¥©Äñ®þõì_¡‡”m{ŸPõ¯2…´ÝÆMX2è… ¼íÛuŸ |Eçmrè*³{obCuØhÒ1â!ñëq`·ê-ŽŠEmÛúîc’d©Ce×D Tû@[¾Í`+ýëemmY[ÛF‚ k°GJè‹Hç;#$YºQf1šPí³W  É÷ßdÎl+E æð5B6Þ©“a>Êþ.}ôrma%mnO_ï üäôο8Vvjb%x‘4¢ùNˬ;þßÿþ8ÚƒøCRÈï €ÙþðN¼ÖÖjkóA³ÚØ™l gùz_Y…TQ¾Àmꆨÿ7ùTeRà2ü©G×õ. Ë[#¨¢0Û’1gg¸zõñÀO¶¨VT΃R¬8B¦^:¹’\¼¥wÍ ÁÒ%!yʳiÍd!Þr tª ½³uvž:FQA&´÷öÿ—½“ÄVa0pÖx Ç´g1B¡QD•ýjØh?Îó}öŠ#H´bKKk¤µ´“8W[Äç%°–9ÕÝ[·÷6§.üëiøÜû,¶õ`ÈœŒ³Ê $7h]΀gÄUë¥G%ù ¶lÖHLUmħ(Êzu_Λ®¥‘ÖZ|eú³Íûj?ª|ve™¢PقȸºººlÚƒÊÄÈ×å£Fu´ ¼n£\LVìôßœA<¯]8]ûØ%yg5ÅÒ¥¤šB?”é—(ë¸uôx¦[²NAÁµŸ X¡£u¥Ò¯JbÛ±Ú³ÄÉN{ïëX)@¼R›VJ]âaj$°&аmn¤¸¥SÞêå"75újìÞ„.g¶¥  J{º6ᵑô.ÒøÞêÛävÌ™Lyœ¹‘%H)Èö6µë½¯lO2 lR´5ÞÛ  &mV…ºµQú~ 54 Ô›0«©s2²¬[“4>ã­6]×dǶî¢Qk#ÕÚð½µß'-šm'Aí Àì 5Ù ©-–k ú¼õ3â1 k›x©N®k“X{“üí˱}­älòNÆ<Þ'>0‰Úžm‚RE÷v‘Æ tUSXœíµŸMôœZ!}@B¶ç6V8ŽhAm'Éð XãJëQ÷=.g§Ú¢Ùqì¹ýÃêDy¶qä %ÎÅ2DnNPxÄ´çÕXªIðØç›ä, I0Ž–CµAÞnMàÏÎÛéÚ Q.µ¤Kdðm?¼Û °¸µ¹@ø¹n¡Ÿ²s!€HmÖH§!!5j$YíÍJ¹Ü€L ©I¤ÔÖ[­ëŒ‘ªjŸ­S)™š¢²ßI¯NÙí¢L[!½¡ .¢¸M¢=XÉ«X.KÉ@?ñ>Úû+Ø Ú( Å©qDnê5 Ï4s¡A?aMJÃ[qy¿—«@©ñ‡Qs-ª%·óÀÀTNÚ!æÑð\Bùëæ89Öq\ÓPdñ¶tPVƇ“Á6gõf’m7aTE3ÓÌ®SD ñB¢û%v P‚öÂtÛqì„ˉ¦¥vÝŠš„Ål³Sçg.œ Ë•^|ä\³Z)Ðü,¹C­‰°M4cÃÒfH@•*¢ï6²:„J2UDÅtr£Ë|­n¥ÒdÝš¦Ö_BªÑ–*4.’òjˆÝhRž$¶„/2¢íH­+íã|µ¿Á”GÓZÇ KŠŠ½IR „P"ÖÁ§ž]¸m]«ñ Â»¾Ùˆˆ;2 ½«MSÕlûûhàlôn·®FÞÁ÷ÒâÄÊ®3ê ­à›2Ú‘ÃÌÎ=šg;Ùò9”ÑñÓÆ ŠVª÷&™²Š¯Fµm.rµŠ0‡5U`Ó4Âl2LYšlnŠŽÚìi}càÃHà‰TQ*$º&FJ¶/‘+ àG?µBj#“›©Qhdm E°ZC%©ø /C™Â8t ¶£ÑU¦Ñ¼ŠVkèh¸7ßà$´U¥ ‰‡„¹Î F1yuÓ‘UÕÑžA^भ¨xÈ›P…y# Ö¦ÃK·4 4õ‹s€)Ùqªì¸š–oÚ‹²–KJ1œ‚¦M‹²©ÈêRÔnhr¤·”ºEÐ@ ñênïô¾Ž<œù)w‰ho ÛP››Í_)8šûwq3‡´¦È l4}«Ô¸Ò\Rã©M¤é?âã²Eä&b²²ÿnV|âD»%I!ÐÆ‡¶UÛ,CY¿}jïÆ#gãÎfi@CQùT ô¦Ik¹B†\îÒ Zgž&Ö=p­c e3/­ÖKÖ¡ú©!<´‰mÚ$cÆŸF]WÁ¹ƒšÏà ‚óÄOîÚÖÄd‹óì¾ÃR3X¥|ñÇA£é‚MÑЩæ,b^ÍRÓØôx;‹NiðnãA*$uÀ{~§ÏªìÞÔr“¢À7-(X¬ìò³‘"Z mŠ¢"«Ðü®4ÈôØ›S¡&â~ÝQT©‘dX|©šŠÚEîac¬\œªCÿ\Íý;ºs& @ÌÔc…Ÿ Ë äº“ñA30àÞ: ÛçÃ#C{uÛ]õÒžhÌŠÃóLŒS%ÃÔ Evi#ÿm2E>\¬±Z9…Öá•DËÆa˜ÚòŒ»®µ‹*UMµ–Ã"‡MíØ\jÇC†ª<Ý6át¬¾æýðøbˆƒtMßDi#wþ›ÙÚpM”SßÒ¢n2'QÏÕ:¸›XwÀ}s3àþ­ ó•`‚]^Ýh#•LÉY±¿¤ Ø^”6øäó‡ª] ­Ç½Y`¥É+Ñ)ëä©êªùr6Ê›.î[#d;:Po]E`76ƒ¹Aõ¨ýº±«ï¦ÒùHŒ?ýâXû‡ÀB¯­®]0¥ÕØaî"6k¹y}…o“ƒ‘¦˜M[Mæ`m ÷xæFkîH5;¶7,Xóp8.W{%°zÃÅÕ´cs¢UÁ÷O²ÓѽxÎݹŽáÃÀÕC²ÛF®Lk¹‰(#n£äÑÍ DJ0qúÊ&œX_ÙÆ’Ü&BÀ-–­Š° ®è²´nJr”Oï$Ÿ¬'y!5_I£‘$‡ýÚ:=ÔÔ¬îœ|mð‰éýAÙ‰"IYw¢b[E¾÷d:[½øŒ,nr4æ‡gh;u/!mæ<£iʈç–. Õ—ÍqQW‹Õs  Ýh&͇&j¸kÄ%Q™ÑäÚ;ª+ÿ5Ü^„@jýŸôqcúíT:¡B{¡ÑèÎðdÒº£1͇ìô)µÅiˆ îVC7•Ü [DÙ» CvÀ¤MI(5#½Añ5T3BÁ n³ÕST˜R¢eLŠiÀ9W˜éQL•S¼«.øŠ°0¦n™GLV‘ÃT·úFnÐõ!ÄÑ€‘¨Ä/ˆ«ÓÕÎVÈlÕ~'†«šMŠç·¥Nýåx:Ô8œÞ®!J½åôA¢#$ºÆ±4)ÛY7h†F¼cÙªÊ>Õ“ÏjèBl?9î²J[åöØuÒWì¯M ËZŒ°A72w{šZYoRK· ÔDª”`B„ôœ4ƒç•±E`‘à"VMeu­’• Ú<àà`jOm%„èY #í ¿®a'ŠY&›dimÆf>h¨òŒàkÁþÚ‰h†â‘µÕèTÔFôÅm.ÒJgÎi_1r…±J³†«zˆ{őϺ)í"ø ŽHAW' J]àÐ|‰âA±ïÈWíŽ(PÐÅh]oýn²yTÅ£&ieyº¹\o„  M0£aªa,Æ¢Ì|k2¯¨e}2j‚°eyÙhuO—ËË 2ájº«M 6IªþÅî7 dÆØ‡8ac<¿ž¾-Õ&™°ØÆÍ`ÊL æö£ÖMC»Ôý6÷7ì#Á`i|/ ‹ •aöÓˆÃ7z}Ŝ֡dW¸Aƒ–DöÙÐsA£¯ÃYcïö^@ï´õ-‘µ»âé$YÁÍaT]öâÔ †%»a]7KŒYè” 'ÕðiBœLri”eKHr‡Ø²±ü6‚…þ6šCm é°:7ä.XÅØ A¶N û 4†eÓÔ’¨gwUÑÉw4½ dèU8†mº$¶ó¦oÈÇä«¡XF˜OÑÔôïó ÕÎhr©k M›*äco¡€›g!Z£­O"ÐI}¨sbbÛ‚E·r# ƶÍ,cû£©`EÝËLR·%æÏ OGéZA•PH²ÉİsdûTÐVãÊHÚ“!.%LH)4·!¸«S%”³—·TIs®¸œŠÐVÙEÑýÉŠZËÝA%`A¡7t°I ¿­‚€È´x¶ª–ËÙ>O÷éNì®'6w¸ ኃáM‚°G¥ÓeC-\6!%’(÷ípaL»›Þ`¹c_1ÓŒ¨} xØÜÂÆdvAw…WÆ.ªîé\!`£@^G ÕCö,ƒû}póI"†³ ‘»[@1£pÇŽH›÷“D62žtiðc+[Ø•Iþå1t{™8oJ„bcÏŸVÉûòS›C7T3“¾H \«‰Ú‚ÐÎÆÓ\s›D”n›»&U¥.÷7Ž1¿G·J„åd[ÍœÃ#Gc¹]Î j æÖÜmØæj'ÑÇMÕ¶I M‹&á¿æ‰+Ì §œNÜf«xœŒt¹ë±„†8ÿÜÐS=±r½<†Ð©Ð[-¤Fn ˆ‘WÖcL BW¦Ä›ò57B?Y B@‡qÿ†ÍÃFègÑÄ7FŸÏ FðBWô¤e|6J£@Çþ›yYM"—$:¨& q_Å}Jàóž·¥Ù á!Ðq¾n]¥Eƒ"f×`y11P·6쎵Õ4_b‡¹M!|H,u=-i‰YJ·ËÖÖ"v¶Xùܮ̋œüà ¾jÀ¥Û¿m%½Æv±«åú.ÇÔ¹•!ÌÓ Çº!ªkm™Ð级Y•à.‘K»lk7êl(†y˜•Žž.,¸p;¦ îø–-ÿ«]›•‡Íþ„…`(ìȳ÷eµí—+3jÝ̇ÒQje¹©ñ4œÃ•RN¦pµAÌE­%ûÛ.H•¢kMÂÀÞºØ¸× àOMºÓ‰‹íTˆæuÆ©r·p§5Ä“®Ë%ï~Å”ì~%ÙFCJÄîé_)l95Ú ~<9T4 ÒÌn±“Š{Á´$_îŒ4º£ó¹!Óá8ȯ ÕW+h‡0,*a!d@mpØÂ¥ÄѨRóšš d‰Wû¦+UŸüÁŽnþ¼Ü®isæ~wJf&éà²ôò¦~™ÎåIbUrÀ³0P‡|)˜ÀÇf®Ëé<‡½KI뤂†–TÀãpÁF¹ ¹¼ÉVžøèÍŽl€}"F¼Ü{IÉ"ù´[NFÁÅ`À®é†(XûÝÌàneóTu«ãô„âyfÛJKô’ÍxX•Ô6QC”œ$Bíž×Þ<]|¢4°w°n’A+Ûl+ä&B`+…‘pHñ½vM´pz#ŸW$1Ýg£ú±ê—¥Fíg¯¤7ئùà iVÜ£}yJ”oœNÖLíÝ "T»Ä—lØ­¬mB×å»j¢’]Ðx·4a=*{¢M®èŒ×Â.÷Ÿ2ä±V±Rl»-6D Z§øC-BõŸ„`Å ;÷.:a¤!qBw_î'V‰«5ʇ¡©iï²³CÒ‰¿~1«9”æÒ5nlŸÏhÏî {A™¥KÂ͈“qÕ”›'c›†’Ž"|&þÖvp6<¸A.sŸðH=žÐ~€ŠÅX¹ÃØk?LqN }»¥\mt”®öÔYBöÍÆð‡æÍ©G¡Ö%ò|hˆÄè‘ú[E¦·!ªï˜ÙƸÑ!iDД$Ûàaa64‘± üZß7¹Äî^×0F¢­Ô´â’žCªŽB«+\T%¡2ÆS´oªèuvÕÄ È—jN”ˆ“Ú–sïDD™n@Öã©+II=ž‡cNS'Ø·bÌát vp§ø)ç›»”šcŽQqæó¸Ù‚Ê&^*L>¢HܵC¶ÖôØv㙈y6yrîº,Ò^™ÊEk¨RÁ/ðK!>$hä+ñ„#Àjƒ=°A:ˆZkœÇèã.°½˜×ä쌙Ý=¬~Z¦ÙXmvP#Hiø3÷ÝØHñEñêœï»Ø4a`ÕÎv»çh2‰u;õ¤…ä¯Q¼í–ó»…ˆscî€a¦–B|¸fÊQiõ–%dx¸·iª,œ•Î5pF+çª[¶}Ìâ‰ß4kv(6hò¨ÌBÍ^r2ž«tu§¥6…#Qy q…~¸ìCSvUR“Mk¼Äªï9›=ãž´S4%fÇÊ hQ›?Ç®ÁGzÜ0Ü“%¡Á;Ãfóû®ÝF…¹óžâ|«ö¦ï~ªP®WŠþÊÆS -,¿¥SܱÇM Æ&Ür8 š45B8;ŸäX‘dÏï«Ùþð’#IÂáû2-+¤:R»(^VY}å^&ØŒ=^+éì(]¢5!Ybíc ÃH5iZUt6ö¡˜¡›tÝp~(­{;ÁÍhÐT"Dí±s]™>p‘}ŽÍZ@ŸXÃF—nKávžª´—î|®8%J@æGü­2ƒÙRdpš‡F9Î-4…ÀÙÍŽÓ)ª …Ý“Žu¥Î?6šK÷®Ý„Ǫi²+²;’ýÔå#ÑÔ&v(ï8+t`g™˜HÐÉä ¹Â-—&„êî´íaîäp pCUB`œ U‰¤Å‡ón{kºî'·‰:¹îŠÈ6wq%Á Ä…<—5èh„O*'ˆe8¶Š\«§ë8<âU ž˜¿I³­ìÌP¯¾-¨›)x\ó‘,0ȇ.¢üyé¶D¦\-°sèÎì!u¨ÑÍIöC^êø‘O²¢î{!Ëîpa›¥ÃŒ ª ¦ÚzOoe€ç0Æ—põvú~· Sugdí‘Xì lÈYF§ßä‹ìMÄÈ6T¹ ,*Ùjæ^M•ºJ@mž¦Òiª[–©Ÿ'Mçµ§¢_¥~#6Æúv&ØHMÚ4*°ÃØx¬Câ*dHGM49 e 9Ñâû* CÁ¥–@Ÿþ8q&ƒ*T3L0Y‡3”꬈¾X™lìê<@‰š^Ù웋B,3Ú7䢋Û,œ¥r@ n`;ì¬vÞ€QPÄ—WROðʈJA£íEXœFŰëaÌ¿<5bP•ŒSXÎ…j#™ V}@Z¬7+ÍÆ [Ó—Çà2ÌžÊ=å݈òq˜õd8á ÞívpSÎ’!·ë ƒšïGƒ·Ml*öîŸ ÁÞÂUôHoØó;.™Ä>ô(›¥Š;¨-±õ”ú–l3òœ•4 ÔÎL$t¨¥Ž b9ëc9v·£…¸ü$K†ø²~3!`_Ó½÷§/"=°Ôñ K¯¸6¾ïuñ ã’›px!‹½Ñq̈Zßn©oHðj ?žŸ‘Q‘ªÛ4ϥșÀ]hW·uëègm—no'SLa@«p ýêø8aZ¼‘ËdÖ%\i¯z)¼;y™¹ ½‹x¦nì+A•1$ít9µ… 9f#QH=‰dEîþ ã,ø•c6\Ъ§8vÿo‡;PBç&9K {ðƒ4w4©,É, ç`-x~ÆDbM’|º@<¤!ŬʞÆLW¼`eØ_¾_—Æ[DtËFCIz¦æŽxó0jÌé–ƒIYް0bW†pyÙnسÂRêJÎ(žQ„µX̦ʉڣoomØ$»x2 n‚:öÅ™5O‡gÄû‘5œÊ.·Û+#îMFàô9Éé¼LÞy©·³áH¬<¾k,ç$/PÈÈÞ*É)CšXs–àVj"Ý4¿bæ‚ gÊÒFË'cgï~ø¼LñfÒA«n¥½¿U‹ ®©çÙ! ±œ—ª¬”Ê­q=ø¶úáŽíbbôn°aÀWÑŠ¸cã¯CÃÜ#ï05[Îv¬PÈ<`º2sW ƤŠ,{ÞŒL¿µï³{¿óÀvÍÕ¾º28˜{ʬ,X‰×ª ûàMÆß&ýQe<¶ ¹¾¬ æS<&›WWkF€Z ¬Ã³e©,’*|{öºxš N¸HYDß5DPOî²…#¹µr¢àê' 6Ò 'À¯Â-XCB»[¢aL…|Ù ÝëS¤BBb^ý¼+·'/_ú¹eM¤Àžõ1¦'rÿ6É .'8|ëG÷°ì qÎÄ:X>šÑp2íOϜÿ‚<Ç13Ñ› œû‡t_®MŒe=*)ûUçe½ôs»x¶xæ ³wÊ¥:⢪¨çzëÚY\¶=x-QxÀQÒ]q&‰gö‡—¤ÔuÏŽÊFOV‡áäH]ðå ̦ mù½KZrdgA7^4yjÄÝZj_ìÒ UŽêûn0o*ØôžT®;©4¨ÇiouÔ¥À'@×*~·ìw0 Ä ¤… (À­Z5Ù»KÎÂDá꬛ùæÃ5„Èíš7mVÙþ‚hÌ<0²1°Kb¢/Ãm5nL¨;bö“„å<å­÷ó4ó™‡Ö„=\µ®ôEÑÛŽHá8Cöó<–•ÙDl+‘ôK±É¯wçz”¨Ø¶¨—ýÎ<™pe>’óÜ@s›¼ßoÆÔ**믱¥ˆŒ–d"®„"æYÂ!—  ±—–KW?0ÓÒ ]Ò9´ÍÊA’ê)ªW=™Éî ‹›bQï.i ÂÓá65T±ä• 8tç†w‹h8éä‘ß“‡ìÖ¤w-¤n^M¤–¹q&…©q‚Ôè3“&yÆ‚›Ú$@ˆ{V7Är«¯'f‡°’P7O›#èp¸e˺]Ç3éµÎãÔàªHeUð’=—èäáÎmáç[6$/ªÑjÈ ÎzIK[l¸''éé :(’Ê&¨4ÕƒCêWg2JeE¡fáA!gˆµªÇ)$Š…TÈ…Ç»ßÕ Ü#ªÜç…ÇÅW²!VûÅ0*¶ÝR|¸EåýIuV¨Ÿ”x'Uµ.“â·F-e¶û 9]>®Inâp‘*œ_êáhÃ/œ¨ü’mzuái´^¤.BDú¡n[Èàc–9Î#$5qÅ‘ç5­¼-†Y¸"KÄBÒsA"S¾C‚ŒG>»¨Ü€·´¯zŸ‹NšrJ<ºh%®Ø¢1<ñ¶˜7+$Œìüº´Ï&íIsz®LùèT>²K‹61$½‘Fó%ñïUÔOB5Ö‘´ÓÛöÄ;D¼d7>$?äÒ‘._šA*Çóíö'Í{ Üíã :øD„¬@¤ízEÄVx>7Fp‹ÅtŒ&yKÚnuªØâÏ›àų E§>O;¿Nô{à\•…r ×¾‰Txë-[nIïëÕ7u–]•pÝR• IUU›V¨@LR£ŽŽÎIƒ4Qr¸è©3VSï÷Xå ½ÚEÉÀv–”»ˆý|v EHÆÉjœdç•FօΑw©GLpÍQ[OÃj{ênƒ¢a“D; "bV؃µ"zzX çéø÷ ÔÄ.Nzªé¬Ê[Ö°ÚkçY‰·®)³Fv˜ÀgêØ@ë¬6¨‹=¨ înÒð+¼;‰¶Ïè¥ãNµj>!Z½e“–VѨ*\аQ›ëùŠ`¹.P,2ð`®Õ6Â. (kZo#Ugö«#H/8dnh¨r4[GÍ)±ë8² ãÂÄ_ùðã»ù&9À7'I·ÓX•ËR] )‹9 hÇ£VM¦Ú¢4Ú² /šéµñž0ìuJ®” h[0ü¹šÝªòÌ ¸W¿‘‚SlôÙb–™÷eÄ­šI}Ó\"µ©Aº6„‚¥ÒGž„ \Ÿ¼1å¬î±È.¶ŒÝ$ki[8^ûä ÜóÐRîTÜü7G9u,}ïK¯çm nhŸ²ˆ&µ|' ¿Ù¼J7}J½'B)³ž «çÚ‡MŽ™DÅ1vz8ؾiå©m’tŽ5ç¸ &_þb£-Þž—•†žCÉbNLüì0Ú; Èïâ —ö\ÜîíYÜ!L÷Ióû|NBEž·l>Üg¤“»"že£g½’÷tòOößÌ:;êqüµˆ_ø®lÊ‘“ÃÚú,t˜ËQœ*¬ñ.‡,q±56O·Éþ™j6y¬x_ü½¡N¯Ùço¨Ž´ùœ¯ÕI Ã`çâ¤>9Šeš’¦Ó>„Z”5l0ö[m^ü“er½1nL];®—Õæ'O¦÷ˆqÞ±r^:§$cmUÖ¸‰T²53W)Q®K}ïÌ™0àI®ÂDx°º 3FÛ\øé~nEzî 2Ñe¬Ù…‰ˆK;&*7ÌE²ƒžš 8–™‰ü 3wÉÙ¡ÏKd•u¯¡±ó¡ýîDáÊÁXTؽ³°°[èÌ%–ÍDñ",éòÛÀ(âdc¢Ö(†Ð*EüÙ4M\tá$* 4.œêHNUUÖa£ÂÂØqMyÍDVN6Þ%Ò“"c˜Õ@Ù T~wé¤sUÛ‹ö8™ž5¸8§Ë;©_}â6S“]TŠnˆz CKUqÿ-úÍä¼É7\¤D‹Ë K6ÀDcS 6ßÈ[*yý·JÞQ²x¥é3û}ørWL֘غÉÑJÖØ¤¦ÌäðåÚÃwr¼²­Ùägïù2±#’oV5w_¨µ§ ºÞ™(C™–©iݶ+^ßA“ÅÁD“¿ús„”´tD¤ˆ1i±~Àƒ\£ 1‘'k6 Õ‰âxß@'VŸk»Øm2ЉØÇ…x0¡^졽íÁ’¦ùúoÞý÷æÂ ë…®«Ó ¦õ7Žrl¼°‹÷ƒ×(ÍOçm^sÄöbµóÃ+MÚâ}’›£|EµßÓήq`úPû¥ØÖo"Ûª\ÞÁË„ëì½öZBúGBæKBbkNbõ!‰"%ÙéêÊ(“|Ù+\dfï#:*~S¡…ÓúS¸Œò!ÖG^yáê‰ÀÚäYc;Wónˤ;¼¸­ºƒü†TxAÂ.Î|SÁÆÛ׋?‹Ñ&¿#Î.Al$e^ù >ß©PsæÙmd9%.„<œÍO¸­>'ÖÓàÈå±€€Ad䦓ÖJ’«ƒ¼'DªN@HÈÇn]«E\õöº¼qq¼]–TIðV‚‰“ÊuuÞDÊ1áá¥]3KÑÀÊû@íHhH»0%n"I•矙s² $./_JÒ)¶›YôH¹#Wõ$y=çÆHU´L3’“³ˆ#‚=«¹:á`yÊœƒY¹‘â­{¥G0Ú`—Áóo]ƒä¯dOebš$U¡„HÁ™wðB²(¥HtNõ0‰%ÄFíå*Ú„„®t]®ùØUbLˆª'lt$QN›êÇ”¯¨RVPŸ0NN›ìCÑIH¶MH·Ï¸ oâárÀt’ž@w—ˆÅì“«™«0y—¿¤úÄMa°/n¯£ñ“q1Õ½Óä?Φ¼ó+n8)Ž»êžÕ!³&HI:HsO…ÜŠÀtÉ. sªY Thdïv .qIýÍ$oF+ÉÙ›°Ÿ4j þÍ,ß ÍåšaI·H‡FA˼ò4Zåu­AiSëÀ(´ª’isªYpO1…yç $·–ìØdq|lÁëÄõÑÇù‚âUß§ÌUäb!c»3Œšå-‰§,\þ&]"Ž„†Æ)—<…M¯­n³g_|:³ÛUºøËØyê™n 9Ý)EÓpS—?o§Ì\\ìþ¶rö)ì~qÀÔx5 äȨ¥uÒàZD pÅ„pÅ’c—¤¢}ï®k®È†ËÛ¥†Í!Êú¤3¨”’ùY´9®†LHÎȧO)jç3 Y%¼‚Ò,–gƒâ>Žàb#h§“+Ö™TÅsÆ] g‹2-“Cj£–-,‚:í Q‚]JQŠç,aì‘7Ít¹q*š0> Ì,~²¬ÑJ i$Þì‚«{óF33¯[‰=¹SJ»,ã@ @µÃl —v¤³– (pqi~½QÅŒ.ÝÛØû\³ÜSšðb£Jw93Œµœ™Dq_{°-›Ñ„Û|s×+¹åžÅàÌnÇ›†>Š¿(*‚–™j¼—kU–ÃŒ›Oµƒ+q?óÎÜäÎV³›3‘* /ïe˜¤ƒR(V:u¨‘¸La㆟B‚ôêryMj{eñGpö§­N*‰¤ó¶ÎÓ-’Ë¡¨”­ë”r_BšKr¹l÷è§ ̹õp…¦©ÚÂÝK8a’øê\Ø™ÅI8 p•iØ—ÉpRá ñ¯Ó´Ü¦QáÄ}8É©CåIáZMŒ¿pzf;»šÜª–´m]›hwr¸Î‹$GùµdÞrãòž’µZ¹Õ‚éWs€ÖFï*óñc”…×HçZ•Š¡+Î [qÌ™õ¸ ¦êÎÜ“mZ¤Çç-‹âwÌQ|ÂÀ{éêìb<à;aµøNìä!Tsž½}%Z“.®·/cÞ­RJ {𕕯F0®È¸è´K#• GÙ£žÝÄÀÈY¼Ì½nÎ1Ä6—¸S—m¥­nÞw&ÅïƒàæD–ÀaN祎AeH‡&RÎê$ µr7R rO2ã=eÕ¨rÿs2•½±„Ó™ï™ÈêE%9߯`÷¸F&!£.¯<#ñBî_!¥:1ã*à»@Ž\›uwª¢,]ÖhÂSžê¤Åš”»Ïö^”W¯{~–`R¦©Lwq§nI:ʶ»ìâ&u4*x-3ì– Ã…pFÂv*Êâyõ EJCbà‹ì’£Òè@ÝÈÕ%Eu\ºe 6Íbéã‘„;=R¥5|˜~ê¢w#P g! a ˆ@¾Ä ~\êœpð6#á }ïd7±@Äl¨GÓgÐÜãÛ‹Øõ‡Ètæ q7e¦Sp‚³V™ Ô8÷’J÷lq '‡ $îƒËåÅÖ^ª´,7zÆU„Ô*%Vz+夗’qµ]NE-[™\s¾MWÚî¦sj¨ê‰Ñ« ÙÂÒP™‡œÂM‚4e­AàxÞÎÈá×VTK`GøÚÊØGËóì͈°5vS÷R½Ìd mã8ÓÁâÔk¦é„·È$»ŸÜ ML¯F¿3yØ.ËõRÍj];ä· [€ÙÚû3{øI¤}Ö¬.PxQÖÀãZ;ÁWzt””“sJî„[ÜvL8šðb‰tq¡ ÷Âä•&%«˜S™ÑÍÛ±ßDWBzd:ĵ*k¡âDUÆÁ­ÄÉ“ŽÜ߇é\420czµÒ‹X¥ oÁ2«TG’RfÎ2’®ðI×.šÄjŸœR´ž¦„|Ç—V«GwŒŽ%)Z;o"ÂUb\}¿—†æä^mæ-Œ¸y'Qš9G”˜.F‹Ò‘F—I5>V b—è}=Ç€<õ“ùkÈ!ÁÉâFSyãº1€^97£‚LÙ¹FgÔœÈgHYøWÔ$„³2-3ýª,%™gpƒ¡p¨äÆ%Äé j˜RvŽ…pN¾ðf ^äÔäˆ&°,B­)™ ³“•¡!‘ƒÐ¦p£ú]¦"¾³¶ÚõªªºR¬“\B[ðÉØ wÄ0Û„7w ?ó.U0¾†ñ3eÁɤ ÝóÈ«˜nŒ±•»$]´¿2£ÃÝ…mëtû_H\¢Vr¯X^“-ùC¹*•&ñ€R"¢.B¬éæÎ¤­oÉÈëYRÑ6I¶|äFÞ·£óÚ-ýl¡dñã(Ÿ]“ýSé*H,ò䙓¢¨fR:Î’%&7BÞÈ K—ø#@ˆš:Yo>Û4 ÏÄôqDYM{Ý”¨ _¾`\~(³O9(ŽCãþÇ•²¼a!kR.¤ÈÜkà6—x̸®.á…sìíÎØy©ï.N2M0 ªÒBÚ%Ø'1DÏÚü…Ñň&%ºÉ›v¶ ®:(ƒ¼s.ƨñ'y–°õžJ6yk¦ÖÓ‰ò68jjä'¼Ú É­ Jw!RµŽ_Ê’D®ü“·J¤ÓMØÇ.NÌ¥í¶³ÆóÒNýÊ\1˜cEI‘qT^ºUÅ'Eᪧ„ÓP™ï<Ö$DNHðL¸f(•Ý yãVŒÌ#3q„ÂÙ#®ŽIØaÈ–Ó¢î|ØÞÐZ.hœ{ìAš%ê™Ø­bjÐˆÌØEçñú— 2áDÖËä q ñ ÓÐ7|Šâ–mÙ¯Zt3Éí`AÜj¥¸Ø']\Îfjs¢†äŒ-çtQ3ïæy&² Oóc¢Ø”¤‡\„fiPõ|1Ü£šNx%£«ê•÷ïp›*nõ€€‹Px.JSQKàá–ýE‹ŠÛI©Ã€ïÜÀ ÍiÝ(B°OB'Èv kÌØdacâPª´fyÛh¡ŠŠÄ „Ì ¬ñB£,éW*ŒáŒR@WÝHóË%ù£2IÇø;K¦ÀEƒš/ J4äBÈçÊÃ& “x j§KßþžNU¡TFçäUåþ*/õrÑ€ë°o™XÝâ@G¹l!¢"²'l—¶NE21û~ž¹,ë&î¢,ã6™t]q‰K;ÉNìæõžŠâU_ê†Â!<è,ÑÑÁñÊÓ”‰¡Sh[ç(ytÝÃ3I‚:©Ê–Ïf»ÿ!ĶC#4lupÛM Ðl®^ºjv*¤munÆyåK?(î¯Òi$ÃëUwŠ413P.‘M2çeXWOc£Ájëkʼ_ ÑÅLgÜ¡Q;ª¨Ûé5{ö[ŽnÆ.÷òAî çz°gchD8âˆZÜn›¹‘¸ë'›$š`+Kg‹å³oåÈ1Î%¼– "âè ËûU²Ä%Ü‹!Déóv X’ö-Ü iR­!nwȦ/ZÃM^™}GGÌ“¸jrå% C ú+¨èr‰w Þ9¨<Óí |P…äjïîVžAqö;õ”&›¦Ú3þvIÕ’74˜~½’MvÏ*èî]7Öî6­Ìg ÑEÎû¼s^ܑʪ €›ÕܑƟSüÝ““’NOž£©g€ß¹Ÿ®ŒgPP_`Æ1{x>uÕ …Ì›‰éª9¢QHæLjDZ›5É9Ë•° \²I´1‰‚7 Ù$Âf:iÆQ—Ix k†ïš$ŒDs8ÍMÎ¥êN”lpmÅlå½SÙ€ý(ܪÞFF¢¾x©8è@xã_LbÀÅEû…¥§¯¶=TPcšb¢Å‹÷Ò$\-’-ŒŠAð´Œd’\ÅüÇ “;Ѧ°uJHÌÆ—-ìv§Ë'˜¹]Èë9‹eža?73û qs{¢—]l^ƒ}‰`™çá $ê»gK§½Ã$WÛ(÷¼3r€j’*_…欓ñá–·Û’ìaÓ$CÈæÌ$ ‰l08Æ#ýVíØ¦Ï™wÖKTR^­’7ÛßÊѯ¼r³°g ¤ð;ù¾ÊK±°ÙvºÜ ÝþÊ.)L¢ÍóÿöU^V@Œ6­¦Oñ]²ˆ6$Ð丳hTšæ¼P+óÝsæž|58Y÷JÅ.)cK7¥-ìHH7í`“gS:L‚P Ê%†º(¥Rß)Ï8Ï–s ’U^I Ì*ÜD¹Ôþ”{;;äò©FÆ¥c¹§êøY‰H°Œhä‡D…w=fî?`›_׎_‡ê 5LOUBÍ9+óó-o— eþÊó=~Æ"Wf ta8+ð4‘‰¥f„‘r«×Pd\xš˜Ÿ%kÎHÈŒ±cÛ?ë¶–ì¨ë²8 [Ý™É<%¿‰bme˜D`G;AÓÄPœäíà ›¼­Öñ°†Ý•\Ä2¨Š!¤øVtœ™ÉEã‡8 Æ]Ním…›>+¯üØmÛæ$WÉK*W^‹ŒÐPæƒÜÐÈúª…î¢$¤ñåC|Ë»Z=ß8#£'3±‰7äVÙÞ‘SØ'ɰõTx®Löj‚lFà\e3•â!S·€µÜƒŒj±¸a¸V©  +OI—°‰BÁä¥Hlzì” fWÐb/cÓLI°òÝ›¾L$™g¹¹F‘TeÛ¨HÆ÷¸[¢Ä)ÊÚ}'ðªN•AJ œ«H *×Nôé°µ&rNÌÌ4„S%þ^Ú5AÖ\ŸÄ7|ånue½4L$š¨Žzvñ¾éXLâVýMùJ¨* K„æ¦0ò®ÒŽÊƒÔ6\”OÂúY ŠB…Ýmq3\¦å"‡BÅ´ Y¹`Ñ&W§ÂcÈF€É<“¼hÑlvø‡Š†À¶è5§‰Ú'µ²DØÜÏzÉë¿ ½•¡h—V©Í„GIäÌFÅËI ®(€.• ‡¨)æÔ—¶-*|³ëI±^2Í=|ÌŒ+ñ±‹ÌaÒ$‡òϪЈA±v‚:¶³-4ÒvÞ ½VÓÁ¬Œ«òr‡Z±øÁ<ƒ 4µzªlÅœî_]N¯7q+6¸à}å0xÑàiR%wêà68 ^Ö¥‡Èé’C‹g¼u¼8jK;îr*gF™–uÖȦÎùPöÐÀ·H±£”+x$N‚÷ärö=ÁÌsÐÐ;¶³ øÅ#<¥W14€rV6×S$¹r³x=K5Î>³ÔçÊ õšÜ`0÷ö3˜׊À$þ‹Ý{ѬƒbÙY! K¨¿Š©|É5Î4>‹ŸÞµ[VUb¦œyƒúYOê­’ïÆ’Ê8ò7at ’Õ£l‰öù*XMÔ\«ÚŠ´ dØÞ)õ‰òS¸%]"(3 9«]•å¾bóp 4åUŒošßKס\"™héÓ:Å jR7K“åÍ—îh þãaäŒËò2ôeâ[r“Yì‰Lb«’¾œù/lXMqæÊi2-ì[¨nsáÖfŠ:ëƒáaV AÚe*Çø”„·ªÉ+¸¾‰¡Ðrc¶Í5C4uEŒ0[‡ ù¢U+±wuj†}Î71=5Y_rà²õ-æ$/ó½ªFúðø„B«±†ìÏx­Aܱ]œù]¬'¹TÔôÜÆ¸aæ½;UÞ@M©êFÌó¬áµ$þ<"žÕ‡µ£$zJà4u]p2÷@k8ñ’ó© ª]0·HîWÈmî`€w2ó”/¦‘Îk•y+ãËîiwdn $CêÊ ÀQí䥩¬ùT(ãE€2«ì¦[K!ºÒ‰.jœ¡ÿDç`‰Ñ+bOAßçÕ°'–€Î\Îe¾ÇðbCž0AµK¢a¾z|¥-k4HwM6êF˜$#C#%J_âÁúFŒ©¤çëÕ_³s]‡äˆd&¿bãù*¹»Ž§%¯ASóÔ¹}ç¸YØT—ôtÒÒ…‰qñº/Iƒ–É2…ûŽâð52¼ÿ3{¢7Å8M{7ŠxøÒL3%ÑUâDf½Â·Óˆy*ê_ÓÇ^ nÏȵžªì2VQ·ÎõÕLFÒ…YÂI°/;ÏЛs•«VÕ8§Xm é»YNÕ_£o.¤N·t½L=g^¡Rhóu2žü%[æÛ¿øÂÁZ-iFº ‘ŒHÌ’è‰L(3J°Ò”ß^ÔJ;}v|¼`uÑôBŒ'¬Ú·ÌR8M»: l…Ù~ãñ,„“ü>Ôä–JÁ(RIø0‡³qÌïtfÁ¾…d`¹Š 4Ë$aÞ1cw¥g¼fƒ¯áûÁñúf?¥”oK5âÓŒw$³_ŒŒ‡Φ$)åw´…¥°gi ‡GWƒË:ï à¢8Ñ*õ§Ma|$¥ræh0´eŽsLÞÓ§ Mµ”óçrÐKc4®GØOw5ÜeB”³=’¾Ú+fÃàŒ õ$ËÆÆÎ+89a¡fƒ²þ2 e! A^¶Î3©æpÐAØe™'±Ô©÷òðb¢u-¥Õ°M˜ï—.ó’÷C‹õŒ¨¾%W4AZ±Á+¿ øùÊvF$.A×´Y³ƒ€UN°ÂW”Ù+´ƒrŠ+Q· @ƒRÊ f£Ç=âîÈë“ð›—Ãce¸xJW"ôzž¾2Òú!¨µ~¬Ö ”סښõ$“¢]ïGl֜ߕ¢ðÀ÷Õ«ªÌ^âE< !¿ùé7©T] ¿Ÿ>.i€7rA:Y ,ÎoWø0\©Ê"¹º‘ƒ’ö!îâ!¤,—|œ}Dع9Ñ!âïñÕ)TŽ-+=«É…‹Ä$P\Ã-c^Ž+Bý0ö\Uzà8†•õãY žT9NéVr[2Þ’O•²«qîvuàaS9q0n}î²€‹øIÅœM¬ô œ«/‚¤ßý2¢>DΘt¸*ÏË1œ›ÛRσF nójèãp§Œxp¥WZY%“ ¤þë*$çT‚Ùí»nwI¡DrÄÓ[9H1}ÀH¬›bšÀç(ûʂޘ pP¬Šù(òŒ {g[ÑIª¾äَΓKì²E‘Ïöd‹È×…¾ôÅ×t®6™ÒŸ%y\Éï²Ó¤\û©k$‡‚Sð2tjOá’mÈoòaÈá]GUè'‘R²Ñ&ØVJp¼©Šy»îØ&™šá Êi :™]æ¡bœ õ\‰s°BFmÆ Šï-"<%{úû͉¾“ D³*Ñ*‘UývýqšºP-s*&þU®Ë8Å}c-Yð}š g•ü¢Yrv†‘YèlY_‘¥Ù<Ô4éü&³+F6ªÑ I— ÖAWÒãöV Hõ«p”Èï·ë™srä‹É$ܸ i2'¾øŽ‹:)%E/¤ýÒg®Zðí&‡¬G4{‡ó.gÜx]FŽЧð÷Tèõ*;Esu)*ó覄X’w1ºÞn" ÖEƒv ̶՗&lb˜:Ô8ÚMývÓNåÛ¥Bƒ—hÔcW|—ÕV+¿.¹«–C”•oÙÃZp€.ŸÙ·€6ûšHâ%Ãx;NAÎFIªX• »8B8~Vä2»²—88ùÕº—A!ÓÎÃ¥¨¼˜© ½«¬*öTqtå(jàí&Š. š93èØSÀøãlÁôø^xS¦1tb˜Ú®Öƒš:$7²q¯xÆ±Âæ`PF\|ß#i._‡¢lßnaxìá¶•§ ñ’ŒCV™te­ª\ù«íÃqð²Æ$oœYÕøPQÕ…1ÇI|S=^|Âwb ÝLmýœ²˜Ë!P_"ˆÌõ1«ÆZW2u4K«ãCÕ}W§¯$ÂŽ[ÁÛ’t†Þo}¹ þ3 Ù–t #ª1›’0¥šß—gwͨ¢•««|çÖPxÊôÚŒà s›9<Ói òvKÚMM•ÄËã0éómˆ*¸Ò¢Aî4F餹w ð–Íêó¼ÝK‘ÏM¨CU`‘£xeÛ„.N!ö­2äDI[Òöbª_Y1gv7ÜExI——ùf@w'$u2ã„bYKub/«B Û+æÑ…߃µw•ë•;oÚ §Šm5Q»\9D©TP…÷ó^—.UˆÓzyB þÝÓQ˜ØàÂuîkQç'KÒ»éÙ ~¡HÓ•]ì)¸!·ôD²7Ûжâ¶@¾’þN+ëXæ^DÖ¥Æ7·ö.§[(8ºYCXÖK=>yézY÷]{À¡ nÒ&)k=” °óšù>;#£$t-lBTǦhZÙ‚ŠÂ:ËŠ%íª5¿L°œ×*+½ž‚#ÖéÝ™o³S¥sJ|ãö88 § —m§4Ê‘Dá(8J¢]6Õj.¾Ý¥RœB ðÅcë*˜ß‰L¨Y"o Þl–ê;ˆ+ó†EjWu"ÌM™ME«A¦€‚ÙÎê`!ØÅ‘F>6™"¾ñ ê$*éI…·_‚dÑa|ÿ,_=‹Ûf·MlG¨ËA‡†O[É­ 0ñjë Y¹Q¹tžÐ@Ϋˆ «êýŠGÚmbY 7Qê&á:;ü(¸‰ˆtº²1”Rä¶-*ì»h€birgGýİ.µ ¯$—É ”•<$¢ˆ*{B ëÞÔŒXÍ‚Pÿ•áõP ïb¢V,ÌJÖWF‰%ÑA¦`Á«¶¡ õÂß â³ÞfjÄ­3Mûd鱈. ôeþ™ðk!l ‡=†BGüíáv½Ž»òÉ—©Ñn)Ø‘Ï_kŽ^›—®y{Mˆ†@Þ:W¾ mÃzõA ½Ýó&h aic"g àHnªN Î1ÜÏ–qkH>U¡Â£õ‘T¢ƒyôåÀ"Z²`ߤòî&ƒ2dj"KÊaÃQà@QU [q¾Õ î®_WX›' cE-âÕÜ `ª¬ôHf>)î(Q¸ÔKÜ o½=”ÒíˆS(Æ—d}“Ö ówšp e(Ý•¶E­NBÊv aÖ¸S§`ã±$±¨äð¨Ä¿ŒðpN¬¤£úï´¹ÙΚ•”…×ñþÍ•:Á(±¼:ÛÖšXnh9S¼‹]¡Qe'ZwàÃeä­nËáÅ;ùZ…‘QÒÅtBât ü‹´jØûíÑö—Çç3®ø*›^°Ke›¶l4yÊJ$ cŠuˆ|ó²íîêYØãíBSšÚÑî‚TãÌ"Ž/Šiw ©½=8%ÜiZ=9Up§ø’àË©>ÍÚ]KŠvAfÁ«ò2Žé\6V¶C"<˜èV"N‰Î|Ë·%œ&,Ø3/ØÊ,™Žl)„_¯v>YŠ<ž‚ã${ÑsÉ­È<.‰¯Y#ãh@Ȃ䥬=H~‚4±SßÝfÙƒzþIŸ˜GÆ`ª^…*J±®L—¦ð6vÜKT°=Vj25&[TÒ%Ë¦Š‰ˆ9¸l¸°»äS=Ž³Ò¥ÈëàÙ–Iº°÷JaTâIN Ì[×ñƒ*¾f¦Ïuòµ”ôܤêy][N;MIN…ïi]e¸9/ãU<'ò[{÷i-bÇq‚ƒUpÌ«àŽ—‚¶æKp‚s‘ÙAi%Ä ’Q¶…ˆzÐC(µ‘jøZ¸‚fóÐ ÷r @Ö[æb¤E‹ÐûeO Ø8Gi@ûíaCßDÀw+Ah_,N¦ü4 *B‰$´AÈUD´íB•,áßo"B†ªÐÁ5¥Ò_)ØÿÌ8–ZpV¬i&Q‡‰æ7€ˆWçSÚRp®¤E’é9’!¶÷KE†T}a ¦*kœØØÔ,…ì°uk@c¼DlÙ•Ù*mGÙ9ÄËgQDú­dI4Ý5†%ÿÒ}ˆ‹FÿΡ•Æ5ÊûöÈÿ8» ‹²0ªÙz§,†„ÀÒ×UýYJB¤7ÈÖ;—Êb±áÄaÁõ{ÆíøQ*vºÐ­”·o‘È4%è‹7¶0lwÜ(4—é¤ûÜ+R˜|QI^”qß0ݶK™"#N’•‰é× Š»ÊÊO…1"‚™”%[X˜°£Ü`¤¡´S~a*bãàÔ@ÁêÂWtm)ÖH8–@6p•^MÛ~ŠŒ–•Aû¡ eQ5© ßöÜ\KP²@æô„Iáê•,q©Xˆ{’ B™B3¡j±RT“Z À/AY§·‚`GI˜ó—F©EØwA‚ó­ÊL’’“šG+ Æ)nhR=-áÙ·‡úEïœfÝëÆŽ00EwѯÒÀëj.Ýú]M0 #ÓÄ‹½E`#'ÍvŸÎÅ4 i¿»MJ¾`–Ðl?‰"¸„«KI¾= Â@6eN§ÊUfZ©\µèÕÛÃñÒ–V5QFE'…fö¦*§w&[e#ÉV7YLHz6…¯54WÕ€´ÆÑ6‘ Å7’:Z›H$†ZIÃTê‚¢DË€Ês¿€aIª|Ì”.4hBdB«ºB&¥#Bif£9ÕâT])j1Ãë¶Ÿ«Æ]Ý{\2 LPèlW1‡A€”­%×nþÓÁ%©R-–G‘9¸€#¥(l†’ov 2ÞKÍ=8Uª"ZwúßžuAPÓåºÀñŒmÚÖýܷﲊõö!¿¨àæLCì刵}Ä·ï(,ôptÇXå¨iÍCɵ¼Ÿ7â¨ÑÍîŽÚ · u·\"™L~f9¤°Túê’8›ãKÃãÍQÉü#J‘‡2ÄZ¡Šk%Øã)}mœXiAÄÞfJgßL VƆ!O 7{6µè‹Z6•±Wuv/ :,SÞ{*3ÃMIœoPS2ËÁ×°ŠÍhï`óA·¤(UJ(H†”ÑxìKG+bȇB63N¤šméò‚ÄÉ‚Uø U|òÛ…?™mO¾3à]¢¾8–Òý’Rjo:½¤íŽfUÀaZ>Àûw êæp³È£ÁOGûàpj¦TQ $jxg^þ©G@Ñ H¿À¡+ˆ s¸¬Ó‘)œú3² N¥Œ¾ƒÈ Dt9¤‡=u@q%X+æâÁ†i3Ù¹|RþÓ¤dcâ;¡†/+H=B)¡Â‚·‚À<§)©E­G™ v­`M$´Éɉ"°-¶%@ú,·•°Ò¸dt$RvÇiᤠN ±C{BŒ äA¼Ø!.ˆ'’ô ±ÍÊIpìXÿ—Ò–Z€†¸¥MäP⌆›¤ rqÐ/xRºTq‡?JaìQ—a·² •mI9„5‘%`Þ_i¤ ïFô„µƒ™{±l|¶ Ÿd-íäÎ?œ\é")€÷Éq5Š%3gJ2ô©ô*\Z®Ž•ˆ¥“7wµ§y³Y€nç £ñ…Ôä+BCØâ,V ¹"T¸:d ZPDR’aX!: dpÒgŽ9A2™‚–¸ùµ:SÒ×!"±Îg¾-t–uN§ò=©¤M‘mÉdÕ•Ô.3…”ÇÖDÁ^CAR ©¤p^FøIhvÃNlîl$|™Ë¹À7*§r\)Öe%U+T“ Yp¹„¬¹saÜFCAx±ý” ²±ä¥\„CàAG7W \.–ɶB·$¢ øÅþ4žŒ»É˜F‘üŽÙW¢–3C»Ð:c ­¡qJ÷ä¤&,v+×)pS³w½40S(–ãTyL¹@ê>1 Œ»Ë“¼™› ð,dìÞr¥S»oëÇ€¤þJ/ÑŠ¡ ™”hb/–¨"Џ“|’ k°m‹è Ö•aAŒ›“Nñß‚= Õ4x—厦27X¹#†PnA&GR’¡€G¾9)ñ²þõê.“ס•æR¹¥JSèRû‚–ºú{é-ã…{„2›¿Ð9Ú_‚\Z˜`ƒÓ-È jliV¦gáBâ‚\Q”òFØ*oÍ3r!1航€^Q±«îŒW¼3¨®Û1ÐUa‰Ò iÕKK§HTÚ…kùi‚H`9òfIr‰Ð½¨hh&+IF[¥Ù{%ÁØ–a¡E|^W ÑKä2Å!õ0Å=5H]WÆ¥}c˱"I©2ÆqåÊVÚzÓ†xI2Î¥nÝ]bI„e&>—}MÐ×~vˆcöBK‚½rÃ]‘ÉU¢{eÛKŒ™+*WöSø«¯ù*¡.‘¯µªœ×TìÏÒ)’}7~«#_QÚJò- ûOù¶ \]rCÇíû9ê`¤4”c7É4pêAIR£µ·)2ɆéÐXǦ¶%I*iÕ¾‹˜Ubæµ…J¼«P®ü>D”$áúŠdŸºc0»´!]ʼ.j® A ¯+½ª.’{ÝpSŽWƒ8Ļگ• $7ÔÇ´!U©‹ÛÜ"Øvê" 1a-¦4bZ…»N ™’ qä,N0Â( ϳ# Q” úùzh®fÀqf‡H@!æ–×5™è¤è"£m" JF<Ô<ªx^9IÝgñî+…šŠ@ ¢ô¤”l®“º^WîϹĪãÖU"PPŶV'…ÈiT^C:·+È™MD‹S˜­F÷»°’¼B¬ÊëH k=uWrªÂûeÞ› ¿eÑò”uÔò¥(dÀ£¹ëÊIP²ªÔH4d]‹(ú4 8ÞÚu?èù©\©:ã1,VT( r‘¼.¼íxU1´+FEig™»È†¸ Þ²fBl7YDU?Ùã×aî¤ÄÚëquÔ‚VSîA h[²òu<ïaÈ.‰«¼u³Ê]å´û(=i `ñltO#_´Ø™š"û–M7¯¦˜ËQX‡Ø®QÏSŒL¸€Íæ½Íƒ«Í*@ –OSõâzi]·±´ q¬—¶Ž^W‘i_‘úZ‘^‡ïX r­*’—+² N|´é"‹­n¼Ç ¨¼Í­bö"kˆ/HˬYÇɬNx‚©‘6{l¸û©"åµâõZ­—ÂTä|U$rWä4¡«Â­ö•¯Çb,úÌy'Ž‘9”̳÷ÆóøÛͲï¸p ÈÕÃ(Ìö,¦ÙdyEzyE.8Jüiº±bìÍDz„ã•Ø6ãýõ«”|8T+gztk—„í늼Պ“iÞh ©‡ œšYu²-²n+Rî+îX©¸Ä•&JÐŒ9/éaS„àµ(­Q@j-ŠT\ÐÃ9à,yÙíD AV°q;QEVzÇ>âÞU“ ïiŠú"ãœ&êCÀÏ6¨fÎU¸q]À…‡ ŒDÀ³íÜ)Ë6H%úð >°¯SÂ/½€l`qËõT,ª†_âicC¼¡¤"ë°âÞÛÖ½”‚sqoGEÂgŻ͸PŒ]WÄa¯â¬‚Rß&QÉŪ6]>FÛÑïŠ!wé£ #’®Ê%$En™Súåšö¬”¹ ïÈrñËm`MÂ;6([-àZY1Úf² P°Ë éµ ‹_ÆI›pˆÌ4>9…]ÈfeÇÈd$#D“îñmÃé„Ñ}&¥ ±¿pòurõëF …ØÒ ­1z€Ñh(; á5ŒCƒ,ñz ð*³áÛÑê):°3N™TÜÊ"s&‘7 HênrìÀKr^Ì"âØÖž¥Î­I×H’&´G¬¨Èd¨¸ÿ—E«Ë5ÊM –Ëd¾Nú‰¢†soŠ9´>øRŠã4À€Ä[(ù0¹ ó<@§–fà ÉO@‰<ùšIca¾xsfŀд—6%‘Úì—9ЏÄÎFICNUU¼nÕlv›6ÑBü¾ºÐÁY˜š©‡@ÅØ»"D@‰ Bé©¢ˆD@DSDæ^ºQ¼õR¤}WÙbmß̰!q Œ •®mìtxÃf‡RþZ?ô0L–8¢Š=Ï>^gÈ”êZ…éT•/’âoòn*vÖ*nêe'E¯4¢F+ ŠMŠt‹Öž}!‹µ"å³b›´ý)lKYBª¦rj&{8ñ¸ ¤—ë¡ã0×¾âÅHœ&BaMA±7UÜ­Sq nÅõ),Ř ¤MV¤D±V²Í Çö’TÑš©º™9d&ÌÀxk çÈéK2³îÔßìïBl³?eý˜hiïÛB)­Æ*;–ì…u\$ÛËìwB{À„èÁ¶…GN6ÄCŒ÷T¼é=’òqÍLEv!ä3\'¥@|piÅK¤³èz•¢´A@œH Ö‰o2›üÅœK±9CT %¨–C¨ª9䛀D‡Ä±V•¥ÝÁbt\ù­Jqºå:öº”ˆ®vY‘ðU‘y[q+_ÅE¢ñqH˜þ8Æ.ì‹l–ÏsRÚ”ëáâÆÝÖ^'"EU-¼Xæ¿eøÄ ÓµâR¿Š+EïÅèµy)ŸZÅÇi­‡Nz±·¾†¾½õõy&×ç¾{ñ0¬“‚|TΆ9ô1‰Ë’*6ûÛŸS‹ûŸ3 ¬sÝÂCÇÏñÏõ(¾¾QüE'V¼ß瞌í®o?{½n>÷}=:f ¼Ä:’‚ã^`78ƒË+BH¢­Èÿ©¸5YŠ7ÿSùçQ¼?Šþøsj1ÿ\ö­éeƒÜõOá#ZŒN6ï¤iéDzüØwü¦¾Ü;‘!S,îuXe3ÒÃ,Þŧ·ys –`•P5MÇJ1Tný¯HåiªãQ(Vä"Õ¦mµød–àO?üa„á òö§¾þ/0Èm¡tßgolly-3.3-src/Patterns/HashLife/nick-gotts-1.mc0000644000175000017500000000073012026730263016240 00000000000000[M2] (golly 2.0) #C gosblor4c2-gosblor4c2f-s17sw51 #C by Nick Gotts (see http://nickgotts-eventful.blogspot.com/) $$$$$$$..****$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 .*...*$.....*$....*$$$..*$...*$...*$ $....*$...**$ ..**$.*$$$$..****$.*...*$.....*$ 4 0 6 7 8 ....*$ 4 0 10 0 0 5 0 9 0 11 6 0 12 0 0 $$$...*$..**$ $.*$*.....*$*......*$*..*$***$ $..*....*$.*....*$**....*$......*$......**$ 4 0 14 15 16 $$$$.*$*$ 4 0 0 18 0 5 17 19 0 0 6 20 0 0 0 7 13 0 21 0 8 0 5 0 22 golly-3.3-src/Patterns/HashLife/linear-propagator-p237228340.mc.gz0000644000175000017500000006404013151213347021244 00000000000000‹BH£RReplicator-p237228340.mcŒ]éŽ%; þßOqˆM0Te!6›X„©n‹azèéa{züÙŽ¤æ"æÞ>I¹²8‰c;Ž“úÝOÂïo_üËÓ›7ÿ¾…WùKwŸýîíWŸ<¾¿½»yyx~{£èýíÝ'÷ï¾úþ“Ç?¿<üéöæñíÃýóíùáÝ›Ç×÷/OÏ·Ç··ï>½ýçý¿¿ðþöƒû¿=Üžþ|ûñãŸ^¡¸ŸýùöòÉý=?Ü^ß¿½=x‹Â~ÀøüíéýËíáÏ~|ýøðöåÍ¿¿‚ÒþôŠzâßÿíþÍ›‡çÛÛû#T'¡ùÉË㛇÷¯n·Þ¿ùóWß?þçávÿöO·¿¸¦ö0À*§ò¸Ö?>ÜþüôRiÕhÆÏÞ¢™·o?¿þäñ„'5óþ…r ÓíöÉËË»¯ík¯¹ÕoÐÔ×OûÚŸŸž?üíý×þñøðÏ—§w¯_½ûäÝ·þüÍðù—ožÇQ>ÿ‡üÙw½§õ+jˆ÷$E_><¿}&>¾¼§Jÿòø–úëýËý µäÏ/ÔÐëWBh_‰é¸½<¾þë{t ·òÝóÓŸ>¼~xO·‡Ý¿~¹½~z÷oêöðæÏ[å¬RÀ«ãñîþùá-Ú8þß<½þ+úŸŸŸþvûÛý_ßþåöçÏ4Ï(ýñ’üãAµ?¼xûúAë»QϽùãöÏO_r{¹ÿ+%~úe|™ZM#Ä í÷[#ny&30z¥Ýö‹oQˆ!úÏÇ—O(HõðF7¾'ªûä韜ú5 úËó‡×\çýóßnÿ|zþëûoPLy÷/·û?>}x¹…?œ™òRN„yxý>}øË'ZÎßÞ½yxYÛðú߯ßÅãï‡Ï_@þyÿæ¯#ïÓŸ?­å_ù~uûæíøúmù÷îé݇7HÎúqôòj$?†éUþ‰äúîÔFTøçÇç÷/Ô {üê/ßÞ?ÿuäËœ¯¾Ššï—Ô;š:íUç´¡¼ªRÿäþ‘æÌÓŸ˜°>¼}Ätºãûôl¸•‘µ½*TÍÏ>¼¼£îý%MŽwD÷4v ?q†o«© ZŠü;š»T×Ò´O)?úÛßþôHà7ÿ‚gó•eô1¡ž1Á„ŒÞ<UÓK"nTôþÍÓ?¿JmúÇÊûË›Ç?QoŸ<Üÿ áIè÷—ߟ&î«Û¯ß¾ÿûéÞ@No©°™FQÔã[æ‹?||Oyþýš&_ rïŸÿ¤”JéA„oÿýò r?â%µ’‹úêW¹´‡7|ú'½afxÿö5^ýñþõ_)ãöòÉWnüðDÀܾðBXÒ¤ø·ÿ°4™ßÅSüý “Ôw(+=ÍyWýå‰S¿ ÷áÝ«™fSä‘Ëãö1Bƒÿ]ðŒçÛùø†‡ûó›ÐÌ—Œ0›”Ôãyœ1|}+齌»ÍÁ?qÃièþò—‡g!‚ÿû>%#4¾óëýø{2YÀ‰:+ÿ˜nLè½×Ÿ<¼§áv\_}z-?ÿH¿ÙýééŸoo_üÌ—¬×úñJúí<«£ oþ¹TåTû ¼ôãÿîAÁÂßSuo¾úá½õŸî_¼¸yÈγ•3ÕÙÍßþFdùÕ7OODŽ?ýÍíõãóë/Ïÿþ=ð‡¿<2ñó”ýÙÏkíµ†TªÕ ±ñBhÿ…V;zÝ[ðø–ºÅʨµŸ­õø•±ÞÿèÃ?=¾¿ÿ#Mbš•_õ~ãYŠD(IИ¬ïTxþß²üÿ#!̆ãìáÕZo9½÷DÝ¿ ùŠØÿhw¨ªܨÖ÷/n߉_ûeˆwŸÃ¿WòïËŸ»ó¸G>÷eü‡·évÐç-Üe ñ€—#éJôÞòæ[ѼõvÜ!ÿÓL\ š¼£²ƒÓŸ'2¡2)MóP¦‘üŒHFÙ(ý©èÝ•[ºµÛng¹«x_Üð‹Ç6üeÅÙ1 H˜UÎzº@µrº¬Ê¤€|'M³lž1« iÆCòõ»¹¿,Y½¥£çOï…[š=iŒ¨G¢ác…aY5RõüæR³vÚ(µÞb¿erþµÔéÄO¸óÒøß(p.8ñ÷Ü—ݤÑYȤX£)W×ÎLñ–hÌÛ-w”PËþœ¶ÅPÊá–eà“¥u1 ¥æ»mä>ç}"¥ ¼Ö¾É™LI Mï[ÁàFÂŽ^ž·r2)·B½ÂèÉÏ6}^ŽÎåÿµ¢’n…æ“N(ªµÇ¶tþ*È^É]Þ†;}s%MV9íÇù­T:“ê(cd-ø©ŒI·šoµÝyžz4A26`ÖNTzJM¥)#Rbþs9{´ôce¤ šÌ¾[¸5úm<'K»ÕóVû­õ;ïît£¥Jc™Y#œ„{@ÆxëÉ«g›ñ½Øøú€ôfãÖ»±‡ó ßH¥ÇÓ†|äÕt‘28Ïùë yb  |p…6k¨Χh"}ðÜ¥È@ÊË:™ Q™À¹Ós ¿t÷)ÔBïŠà¥Ì¿êd•Á´#¿pàu"}yL¡wÂ)ôwÒ_¸săJ”é/ £&ÄÐJüA¸”½W®>Në&?šŸ (,#þ묥uz ƒ|(ï*A«>¥;b9Dk'tNzÎw]Þ [¹;ËWïÎÓÚÝì¡ßq<¤ãîLöpÞÙÂÝYì!ÞÕÒÝÙì!ßQÝã¡Ü…Ãê]8í¡Ý…`ý.ÄÍC²‡óî*ŠõS™ÆÓD½×É:j4Sþ¦Œf,N¸²ŸA¦'*åì•þ¨“ÁÔ÷ P«ÚR´7%"•þ˜qñ€Dúœèd†Þ44ºÆ©iœõ!âáÔ‡„‡ Q ’>TD<œúðô!ã!êCÁCÒ` õSä°ë?ŸÛyÀMìFãÑAû6JàÅ£K;W½‰… ­«ž«Oa€œ’°¶z¤V1yšR ÇaÃ,šæéü½wz˜Ï)¿³,ŒÂb‹šúeë­8Ó_jc¹Ê"“Y“sâìÐpÑg€=—*E Æq‡"+ý5‚ô¾„P0¯O¢uS*ä.Úù CñPåáä‡&.3€ª˜TùᔇÌA ?Dy¨üä¡ñC–‡Î‚Ї*'?4yüÐå1ˆ‡<È@0à.¶¹ÈÿÐŽ¨ŒHéãCm¾0²Ii1Ü E”!TkËôGCA\ý‚¤É#ús‹Oþ"k¸Ê;‘Lß—‚Ay>-?ºˆ LÕO(¢ÐX “þºRPÈc¾pÞQ¤TœÃ4—dÙ©„Oœ ×(~ê›r×éw^Z8zÝš¯{MEóy7—೺DiK9é/I[,g¾k#ž~5òØ›6åèѼžž¾O_#Z[ÇSBkKÕ'’ÇhJÓÇb2ÓÍÀ\d\S7ž¼–¯u0Ë¿vã—?ÚÄu2ýÚ:Ýà´N§ß:Ìà h}O¯‹)Y7Ÿs“{˜›ÜI9A0^&b3”uñ”Ú¸ ÕÝÈU½Ý¬wwow<„iéÃéZǼ#×u€MÏü:ño$8^ï*ý¶Ñï„D”º z8­QŸ¦ûj¥g\' A’WyfTy–½Ê³r•m®²Ò¡–Óc@ËÙÀ–M¨`qpjß §•¡3œœ¢}Åà] ¥4P…Ù@sƒ~ûŽl¤A¢ßsB6럩Ù#¢‹ÿ$‹©;nJ"Pú­—z×Û§zÓ±tRŒ£“Z»šv|vpZ¼ÑoÚ+O7b"“ʼn˜è׉‰œ˜¦å´²zm,†âmª§ïõên‹‡¡_ç0ô0sÊ_Fw¯MX·Œz¬ RÚ-NJ;ýŽú½žŽz¢+íôp.õÄ`jd2eÑ N¯¢(M0üÚ- %PÂ,´K1 iŒd¬ËòG'à¾7›€ÜèQã»™_ü½­Äq+ýÚÒÚàÄ_è×ù =´…£0¼`CÂַ̮œiµkqšCôk:ÅmYšCôësˆæ9Dmëì|ŒžƒŠzB1òY²õ-p¤ÀfI¡‰R´1KJÔ!õñÙ†´ä…•`µÙ´·Eg¢ýVúÝ—À¹r?Tc†'fH¿Î é!-º{]/2cXêh%¥àV–ÑJÚºKÀa'ÿ‰-g°eú½`¶L¿3&mÁ$+vAþQÚb×åEmŪMXuƪ_°‚€~g¬z„êúÂ9ÛËTlåbÛ¥XÌõrø\§‡u®Û°%®V”0 ³` Ò¼dÂNó ®",8—¾Ê*´Ð!CuP•ó “Æ[wS^æéXèOÚ±êô*ˆÝFŠSXO0u$2i““‘eÉÜúãP ƸŽ,9J–&Y°ü˜–%c¾œPuLééœ%¨¨¢Ø)µ`M!LBTÈ`BÕ°BóÂ51û¤Ðl…–a.p&é´çSSöå&5©\´æÂZs¹hÍ…µæâZ3@yŽ0˜Sá¾……þP¹Õ¡ŽV“`-pLÒ“ʤ &‰1I3&iÅ$yßÉ(§ê]åŒÝ ûƒ°SßPÏ£Nõ|ò€Å>,Óf*¨¢ó¾V%Ž™. Íø+kS3MIúµ)ipž’ež’ež’ÀwtzÁ”¤ n¤VxJ2`¿P©–ÖCi2ÔF1d 1²D­¥{‡J-Ö?L‰yôO=—j¡ r5zØQ¯É Íj½³qv뿯ƒ·š9†ÁÝ,q¥mäÕ˜¼Ú…¼“W›É«9yQ«¨Ð½¨ÊEµKQ<|}¾¾_JÅ éXV–â6g¨vt,C‘,ਃ£væ¨%S*ÐðUz mua±èú*ȺRêakN=¨gè×zÆàÔ3ôë=CyµÄ3µ©¨ÊEµKQEMÆ`z˜{†R¹àz†‚¸’÷Ì2i!–ƒ5‚,}G1Øü°YªZ5U§J}”`,©!cn‘˜LÇä©cX™—£6ãÂ2k“,ydÑÆµ«Œz8e>Q¬Ñ°S¡øúÂz2»ŽÏ•UXR,¸ŽPI5#Èf¯%Ù*é·ìãFŒ¼Ó¯Ûèè¡/ªÚ†Å$³õ›!§¸LÚS§ß<œf{-=ªfK1 UGŸ¥6ï|š³PÍ„•Åa,«¶W)~Á 6dúqÊ+N¹ÎжqL}Œ#+è`Ó«A¤–ÓI³P £8úa£ØLO&ßžj7ò)EÊPý1&Ÿ¡‡QŒè‰ú>} èªz‰b¦÷ª8Õ:ˆ¼œÂÎ]d™}U5)Š%Iab¥J–®S“[²”Ñô*T_mÂR–y怠¹Œ|Œ20y Õ‘% á4›ŸMªm稶¥µÐR4E™Û’`ˆ5éÏÚÇtlÚÓN—Ñuá…Ò¤µ6H]ºŸ£Ðö‹›ìŽ ',D‡ìΨ–r*)P¬Hµ^KÔ«Õ"œ¤ÇzÇÈSŠ®¤Ðø!¦høÉjK£‘ƒ 8 L}5{ ;‘DÄNèר‰Á‰Ð¯³z˜Ø 6­ykz.¸Mvî;7ýƽ`عé7O/ü•P¬Ž²±m6•ÝQv8ö²ÙöÒÜöPeuÔ¹½M£*ÌŒ@%.јKPPmŒÒN 7J¡ë(ŠuÖ=E\ˆ'@×Q ûÀ+Ejµ@@j飖˜¥Œde@·  ÒˆuÁ8+™ïˆY¡˜«AÕ e<,ÑðèŒG:) »²[B|íÇ)ŠZÝαãÑ£˜Ùj4hùX–z˜V2»Ê². „Á²D®%«œ¦XÔ;-2w!aZ@˜VBŒÕ3TÕá?¥Z4Sªí£ÚLÑh³ºåâ"g(a\åLr†b2PE)ˆbZF^ÄÁ«‹·E«ðºÅ£‘ÔÒ¦j²še•‹—f”0.ÒŒ†)s_ Ó*tZÊèd³-ôAðæ$…voþ¢úÁ²¬ë­ [غ°£qMF¿© ™bÉ»Ðå&Á‹ËM)cÐiT¦?:«,IÑ·éÑÚ¨€L€<š™]¨qlTa@Ðùâ¼Í—žÔ¶èƒ½ÚK òhm¯®Ëx¡  +´k¡ÞüµÐ~0êÃhO1™¦Ç€¸Ù9xVBÐûòTÊÈV´Ê2øGg›ªíP¬­ ØÆê 8ñºøì§n Pì\ñˆuXu|šJ–hY@§„Ç©³á°y«æÙr™ ÑQξÚ¨%RK=Ô3 qKÀÏ™ÝA ˆÌr(Qû;·ÜT wÌ[åH‰EÖŒª ¹$¤’êÃpÓŸ !ûé ¤¬ÀMö‚™œSþuG€¿oúu;8=ØÖ ;÷õJçØ~Ù‰íØ‰¥ß0µìÄRN1âÅ̧ÓW÷¤»dµaqZìXœ±Ê¬2c•g¬rœ´zLó"3 ÏkJœÇPYE¯Š,\w/"¸Š{Š5Q/ƒIU¡“Ü”c—ÝBZ%¸R±Mè¶Oè’&.Á€Õ6RfÔ `;“RK˜h¤DC¬3ÓÛ"ó·ŽU¸ ž­æèd„XßÄ}@ LÌ–,Yò˜Y ŽDAˆÕê s ( –¥s–vÌS>¼¶´S÷tl¨]ƒç÷àw$[žžmµ|P ó©åìª0ìYT SLñ4¦Ñµžl °3ª)ÄA§”Ñ£•]‡‚s°YàQ¨BNÌEz=ãéuѰîUéïbXÖ²ÚÅ8BtH½l{ȹé±)0‰YIEŠF/” Ÿ“eQ‡Ù .Ô"„*¨.º9TÌi’H’.û—Já BÕ,}RHUçiUAªbQ¶‚òúO@i’—$k„j3„tÝfm9uÖz¦.™¨àyVâM³v…s݃/˾$™7á’6kE,:ï<“bìVN&-@|(Øà…ЇBA%L$ºñ(9†Åˆ÷|ÄŒƒ4„0k`e.´rˆ›ËB§àÃÖòØ´ªj=È „ÉåPˆ -¢~®®;@¼ÀîþF¾(}ßg`Ž‹î”JáˆºÙÆç…+×’FÑNŽvꢔfîÈÒŽ¬þˆžc;ÎY²«˜’u!LÆ”W‚r­ ó¶°«Nß¹j)ÞÓ,ÚfC9÷uã»­œÞ…/ÌË8)fšÊÈ•ú¬„„ã3tÌÕ¤ë±hËÀ.üÖ6øJÓ¢½S ÄÛ&;†¹ÇHj]=g}1¢#hP y…) (<áÜ)¡šîN¹Vë\¯Zr±yQëf~*E‹én [Õô®‚Ž<a5P2 oA(œ8b ¸8sB±–ÚZþTÛ h$)^¿²g·¥¨Rãü:h&Gº+Ò¼¤ê:GíÞCîûe÷o@ÚÍ« 2!ùC¹CcÝ­ÔÞÀ¯”‚Ù±ô<ݳtvæà7äKårV|å¡<ÝÃÔß ,5&îH#祴=¹Pé ½QôoªF7ñR%Ìnò\å9ÛÌQ¾#~:¬[A›³7 =^è*˜¢ î}^æ èô¡ucSÆÝCT¥j'Ú ´"ÙÓÉP.H†Ùn%Ìr„ªš0*‚À°ÃaJ%1ç]6ùFKž•nÁz’U!5Ô„ª!š]ô-wç¹ê¶ž­\{–j7+xtcÄšRA˜ÕcVóyÚŠæ›ÜâSµ Ýhe© *DŸÖ–ÊwËÇJ+1MTtQ)iðZ_PíÛ^|Oë^Rg³|$Ù 北\ñØs %|=¥¥¡[?ŠKMq¶7ù‰J’¤åd7tžº×ìê NÇE"Ââ•5éÖáõh7O-WPý(§ ¼˜”… — ¶Åi¢äƒ¯õ'åˆf°ë–ˆ7I½ý©ùˆ§Á¦¬z>´únÍÏr†€ØÆðÎøéœù¾WŒI†yöTN€xÇ2ãC¨–D…ñщx£× Æ2@Âøè ú`|t@VG{³jGß© çâ›ÀfàÅ9©ÁBFC©h_‡¸ì4âMugBß|ó’ôO[QíÜ«§Öˉpn=#° þ†Žh!°3Zþ†i!ðSZx²cZ¾Ãë¶1, !6ð@€XÝëP Ú§Í:¬©±<­{Q‹Ù4²m¡J D‹ 4ÌTu/eïÄ6u"Cèiõ„!ScÉNÛz’¦¢a4ŒG‡gã’0”“%Cò… ¢J²Cæ!*‹“ÜÝfó`ȇâh b: ´øÑ›!Ï ªàøöX`º~£¹”] ŠÎF¨$Œ¨vvg³€€DgƵe€Ú²Oq»ÎCg§toK“†ã¨ pê Ѹÿ™» ¤ló•Îà[ûʼ½à? TW~DÛºŽJ îå $ŇÊW~@¥ÏtÂ/—ËZ%Ζ7¸`LJíâ‡#^Ó¦dZlÊ,$Æ8޵Ÿ;B‡ ¥:m››ñ™ɘƒ¹X3ŠövfA@A:Ä7éh}#¤„DÕŒJÝÁz¨Cùõ⋸{[.®“pƜʔIÉ»TëÚz¨lÿÜO_Ò¨ÐñåJbÍÖÅ/œSThþÕè>)Óì+IÚâ¹@±¢%w+¹­š?¯e(ר›×DÁ/+p‘KÏÛ^põ¡nºæ=¬`"Ëâ@ÙF«^´ácþ„§uµŸ*4¶ÑOa%Ûèa#äÈj,Þ$_¯¡ûÊ ë:ÙáSbYU!yÝ–U4fË¢€t$»Íd¬Ï|Vøix¼ ˸פû“dƒZPÚ5©ªòMiÍU<Ôo„Ù1jwgA¨Ý‹¨ªÒ^6¯"¡÷næ¿<<\ ûy¾¤iÒ’&#ÔáE4«ï’O?ÍVÝSy·7™u€hÿgbZÕ5÷ò@=‚hЪºa¢bØ CÉéñ¼ã^RIŠòÞSÆ„‚ÖØœ“¸†éÖO$q âa>¾]ð"¬».îñ2n›­h®Õ…²8Œ$€|ˆx…ˆP—õˆª+ý¥¤ä’”{—Kt){,]•@èµÓ¢E’`Ñ‚Ð)„Šæþ‡•t€ÊP?Ý+«T­¿¯«O€Ì{ôY[Gº1Óå¤ ‹¥ž›Ò·9-D@ò¼Ç›ñ9›Ë0“ú9ZMÔ.S$«dA¡±VU+Z† ¤k>ÆB’EtÐ$ûù (.UÞòÖb[\ÓH_fnÑ òõ´DÄ›¶œŽdôxAAj^‹)ã˜Î¼Jš¡L¹ UÜ÷ _óe¶ 3+¢²}[ƒ{ÊLÞÕ’D™ä0ª" ¶ÐI°2"€¤ÒèK%©òA¬Ú-ÍG"WëÓdlm¸¤ær¾ÍçÏfG©-SïˆÃç[?<¯ ð"\Šî§ ˆ¹àU·Öö$ô_ÏÒ¦D-9‹_… ϧü¥u,'Ï¥*TÇX}¤ñ&,¦ @â®_•‰/ø9<_gnEý@‹‹E¾§¢ ÔG´éV³£´¹ÀQ×l‹ZJ=ùÖ $ì*/ðF±æ­?ÁÈ¥Þ]‘7­^Ë^tšËv¾`F±K¯m® €(áÀ¿YkoÖ|È ¶qH4nzPDì´Œy›ïG 'm¼²ø‹&¸fs›ÛÆ%JT,Åp* sÉÅ•¸¯ˆ—ƒ¤Ñ J{]IÓ”•-ä$•D¢.Bmj¸Ý˜$Ý|±¨7€,±| ·“ ÒC1A¨«wDÓîòŸZ§XÙÜåZÑÚ§‚•Ô|½ÉÖ Âl-ˇ v´Á6/Ž>†„Tõmó#Λ’)M*¸‚²»Ý»[^Ø€$%ѱ›ˆ¨¢í«Â"n™„×ÐRmkpµÇwú•3³E¨ÃhŠ´Û5Ñll—êÇkDa™Bh]²õÀ$o¤µN`«e›š²ß®—Z[U&hX bSÃÔNê5yÑÛ!&š×š¦î.§4Õ¼2,ê¢]¢4#°†q0SvPâo𞀛npIPš*ª˜@T"wš‹[‚t« ›ÏéÆ¢Û¾yÓš ¾o.G`ƒ5µŸÒT9- à[ª~’/L®§ýy×$ëäÈ€d¯«nîÐ1n éÂNjlÁÞ<ë0"zÎ ¾ƒçê0^¤Õ Bˆfi½ï1ò… 0-¼^\Vê¾ú­¬ó~ãrà†MN–è<…á|ƒ¨ïú‚xsþie6/H¶,ísu˜aϸaÁU®Ò®˜LÔÕ§o2Ÿ·}¥È[0îèæûÓ­Y¬¢$„©ÊgY Ö`uéKq[¨äÝPAh˜/ ©mÊׄ4t¾õ£(«×l´ô]@9?3îÁ†IŽ·FÚá¶V&Äv% mL ÖÌñÙf¸*æÜ‡^V“TÛUô&ÙlåS Hë]žNÝi8'ýýº-’19™ñª¡÷:¯*Q<Ÿ¢иíp[y“üÚý »]륫G6­×)ˆ¥»¦ ;ϪÃýѸ³(ÂW'ÛæžU'ךе$å-ˆ*½Œ‹‚UzIl6PŸ"ºÙ¶^O¸Ù€V(R(ñÚ ‡ 5¶<ýÈ™•¼o@åTã0¢mlqm^¶T¯¡PG}Ýêc÷€|Ò°Üä©é+µJl®d$/¼ìÑ ³›ï(è’¯z>h)‹ãÔGQ×íºÍ,T›³S?:ãKàŒ|÷UœÞ©ì&CWq ð»8èiºt6áb¿ŒÃòõs*žh»"ˆ—≻vy.¾ÏŽuxV£¢â‡%‚UAÍ [ ÁÍÏ4Eöf6Ü`… ìx4Üa…À/±ÂÓ|_žË¢¤RÃ= mQQK¢:çÜTÍü¢De Ð)s®²ôP]ø|µ€d‡‹®Z fL‹W7Ÿ„Ø–›”Hð¤fe:Ôæ»3 J‚ˆvõ±ßm0Îk›ˆ7jݶ”iô´Ú{=­öž6¶ŸEè}ŠÚÜäÜD›$Íʺ‰M<| Ì-,Û!Oºþd¶yÈvBÝ.â<Çç[BÚèÙ’`î¢l¬¦%ë”gޤEéœG´Gs»„¨¢û:Œü¼ ƒt*ÝÆ‰¿`±/S4Ó¾¢c+¿fÓeàzó o§{h‹×ÖÆfðæ—NgñòI/¶Š6ÎZ ªˆ'S¢™X*@ ÂG@b-À4}dÌå/¤Õ^’G—Å1¢mØF|ƒR·±œ2Ê¡xz—sl¾lµ‰\aˆÔ7Ú*a®G1Ý-Ù‹ã=^´Ç]6¾• ¡ZíÛ*yœîÝ”’V·í€T/B4Ž“›}° ©†èFá"Øy6X¯UE{H0DÛ:ëØ‹f󾦲%_3gYÆ  ¿ÙŸˆúu€âr+¯¡L)rÕIKW…ÑqÖîP²]¥’8»_¥Qp¢PµQé§-ïüx=Ä2_à-IÓ$‰pc:‚ùxN#\¿¼"ɾ±_JŹ…ætµ¿[Oæµ^ÛrŽi¢Ý+p½‹ ‰”îñR¯gkK_á…šíûµgçðßJî¾UØÙ˜†p,<™‘@TJ š„4º™œù¶…†‘Á9.- 'É0©ÍÀ€³_½‰*ΤÉ;‡ÊI?Y`>Ÿ†EVŤ ãë Gq÷aÈÌ 0~ê!Ù.zàÌÛ›ö\PrEt7Íñ97¼h~T'ï‡p´/ã±;Ê’Ú`EGÌ3€xi# mQ{0¶û1˜‰!iÞËô±;ˆ¨ñµù|êFikcu”úX°oVçž«³;λ׫ÏhòúÛ Å—vƒUÆK;„‡µ?‰£ÃÉu€ªÝO/úÌé#Ûÿ6sÝ÷bäs=ÆÍ‡ÆÆ:Õ—šO5Dñìˆç§> ÚùìæDUSÚo"Ëìê7Ș…ʵþ>tW·ÜrPhóÅÂåÂþ±w´ ç_öù$‹Ó®³w|3Aßuv\ùÒøwLðäG8\Jòˆ«öíÈu(_ -Rh] mûųÜ69>8HÓiÒò:gÇQéä— "¹ÁVN˳æ‚a[0l†­o›úÝ?‹1ˆÖ)$𑀂_)º-ŸIÈjšÉ7£K#º®gÕ‰Ô’M¤®©¤¡¨ó%/ ó¦WÖe\;÷C±Ù|}a³\äMpÐM6éW&®ý X ‹À,žêâ*gyK¯Ç…ñˆBÛB¨ºEOñ&›ôˆ# ë!JdTÓ ÞÆU\Ž•H ¾£å¬ÇNr!0?EˇW(¢~Ó÷‡\Âpšpì[?I* îþ¤²qѸ܉ÄÜ_O½xÉÃù(9£Ö‚Š5ž­“k¶NR(¾Rÿ«”Ï¢Ä[þFñÜ®ÏÇtý¸$‰~IœoìàE^½-R¼ÕQ‹VUÅãå©•5# ^¼T­!¼x$&yñ†æòéWáV9Ì~¬çº€Ê¦ÅdN™û¶gX!t¬Ê±ÜÖ‚D‹¹.Ágú’lÑÏž»o6^(çCT;¼8Yð^ÂÓèYŽÐc_L¥xÑ/¦ÒlõÛ9ÕÕb€7*>Õ{×V\¼Ø,cÌH½ì<®¤ðõ#l|ÈQ¨ VÏ×åCˆj‡×hÞŽýºX½ë"Li”TšzI ª¤B³µ иÞÖ‰×wŽ’‘´xÙë¦;ÀM'%M×øÉeio?Wÿ €tú"ÍíL­{ëzÒÖ5#‚í³˜oZ]õ›$µ¶fwøo@™BÖ»êéôù¨ŸõxC­{ x¯6~²Âoׂ„ÀÏqC&¢Bà4ÇÈ‘+#G£R¨É$oyLòs¬øêt-Ê~â4 ’cŇhkæ¶ù7Öß´X[×ëè2]%Ì´£ùеEEæIð2@û ¥z¬ž+x÷DPÐ9 ?lçbkœ¿¸$IÀÐæÉ©XW[}=i€TÅˮҟOÒ•¼™é7J¾8_ µ\dÂÂCJ>›ˆÊÌÄ]5e€dfž.‰Ûκ[T}[EÒ”qe5.15.ú$7Ïש:¢2.þ¶­ç—]q¡úFQìû‚0xQ˜›•ó ªû¨ÃZ a±Jˆuq¿–\Mš'ž›Z]IùÞh‘¹'^°šwïÒÖ‹v`&ôëp|=AIǾ!¢§YÖ}‰!$yÝ^vKT³›à%[Õ’Š—= a¶né}8þøn˜~•Í—ió ‰åBírDãz-µ`ýÎD뢨š³¢ëï¡Ðp":ëišÖU­.–yÓhßYS¢y1@çv\V°ž3FZ¯ïLv4i;‰Dµ["±CÉE6]@uu‡ë,†)8ýn­¬[9"ôdhL2ÞœV2 =ä3s»M¼Òüü„J¦¸^s‚Ī["Z–Ðð‚GwûuûÑ>;“lãûú–F6h%µ~seµˆiðÔq2ñé< [Oôv„UDÒì¹´»Ç…¥ˆVé¢Ó2@bö#¶m4Åì—°šÖ.H‡j²~nÓ5ƒ\Zæpw±¯=–Di\Qãù²à9nqC”PŸ]jYUÒTm7¤±µˆhßöõŽS¿Ô­ð¬ŸSRåÞ—Q˜/LW².6ˆ¦ÍÏ™8ñfg:ÆàÓˆ*âÙ©> âvá ¢Xz!ô©X̃Éå©{0I’ ì^­Cxãx—ä§Û}ûÏÝÖ}‰ë”Hze,› 6´BŸŸU§Pñ)TOó›·¯r¹OuU'á"7 ÜÿÆÞÀÿ{·à©-ªN3Ñí{§$”¤c£QÖå(- ·êðUo®Ìá)¯ÕÙ׸qÐŒ/Ä.„xð’ÚÔ¾Ö¹}ý¢ÊáÒ™Ž ÌR/ïŸËÆQåâ¹²”W®åU)¯-åõµ}\Cô6™ &&aª„‰¡ ¥ðÊBZ@Mg–]xFƒ °&ÁÃæ… Pud©( ‹ âÈÒ¤6d}°Ý÷&ýÑ`_€öæ‘*ã 0 (Ó Ñ <+†¬»Â-¯è+äì3äþ¦3¢á˜ óÝŸxNR-U¹t*JÒy…·i4h#§毅HÚ:áIÓ¶"è<‰H:‚sÆ3†Ñ:btðv+>¦©x|ÔA¹_¥ø¶ß×ñ‰Ñˆ+ÚPät&ôiWégÞ¢@R]d š¤÷†#¢¢#e¹dJ@"û²ìQ He_å=j5¸Ò¿‰Póq!TÍ7<ǹá9­ãŸ³ã˜Ç[Šºp%@¼gr[?•J×TŒ{ÿ"§Q7ï!<¬– ò:@A‘9â8õ…—óç…%M^vÕ¥6ÂkTV- „NÓ|å5BÓruBÃk§3ZJUñBg$:?†'Ÿåi”‡o2ã•-žñÐ/cÙæÂq\Îqñ4w2 ñ^n^¸uö‚ ××̃WÞÑ„wô…wî#_™æ7Ê; nEsC¨áv…Ķƒ £è„”?CëW¤:#UG O§w¨xƯ•:‚$o¹+H§(ûB(h§ª4&Âáíåñ!qõ¢x&h}2[$›_§V«ä:Mª^Ä 7“¾€Dl©)]@„9“ /äj ™x½ûp9yE`_eò7$¸ô¹ûÂ1ñYàù7{éðý.þ¹ø.ÅÓÒ®#(KñuŽ hÓƒ‘uæoºõO<|Fû'Kð¦Ï">6m6‹ÆÚe|c…W‰cLܘs¾¡¯,^ˆÝ¹z ñÁCs™}ÃÔ…hÛÇ2„—ÔC+ìÖB6·ÄD@ÈÈÖoN”Œc[ˆ‘\Á»ô2ýjÑ|Õò‰ͣÑ&]:¼í[GÁ)Šm!fl`Ðyá{ÓXLRG«‘=Àx LÌJËúHÆbYj!tÚÚ>ý>¡ûq)½Ÿ—™ÜƒY_|¬÷Á òm¬Ëqjv)D¨¢C¯5r+êEd×j Ú¥…îøO·|È`È`:/ÊÖQgeKR }{Zk{Ê ŠH-#K/„Ú7ˆ^2¨pö9|-«[Yœ ¯V=&ð¨L¦4ÉHpË ÷Ûç[H2ŠgUQ@YËJ—Ó©ÅW/¾ ƒï6p7ˆ›Úv«S=µ¨qq3¢A1íÖ]A9y½f{sU™\bvL.2/Ç÷mýF‰+Wá×Dø5~ Œã9Ås&/$è…‚IHE?m¯«s]é˜ëJç¢'4m¿ýl¤$÷ˆT­ox£ bª=¤ûÙÜàoÖQ(·a HŽà*ž2@rp_Íë##)Dl­¼t* ¼ŠàâžKC:·èãi¶èã¹,lºêæµI7ú¬‹ª]Ÿ¥ËB\ 9±º’DZxqÊdŠúls…¿†å×?‘ìv|Í$6›ckXiûD™ëîRw=.’¦ùªDó¹p˜¹ãÿ28ÛšøÖèl‹î!L^ãG˜[WŽQVS'ó*KÕ-Ë{®)öµö|â  häע꫓bÜãÏnéÁfbE. AX§UÓ â±´†³<¢Úõ“3ø÷øÜ#+‚üø„+¢Á™“Þ,É$Uš•å•öؽ[ íɹ¼6¨WÏØ/Õv½èe´–ÕÁF^j¢é‡“ú˜]­LT¢©Ò²ŒO™«A×ãg}¸"ª\¤ó0 H¹-˵Ëú?3ª¯Tûi³³9¡.ˆuiíuêõ6l@âéÔ®bÑ1[ò¥kξ y€š¡À{ VAM#Á ú½l~^-{—~QE‚ ‰­ÑÌz¤Õ¡_4>hÃÝ;z~UQ˜šv`ƒeŒàTOCB}êIZXO°O=@Áˆ„›Íœ÷¢ÛÄM)Bêæ5vAiÂk×€zÂdGèD’ÂÎJx€ð&M:„âWÓRy×§¢sý#©Ú‡ê8té÷·  HÖY8\jÌCnôU)«d‚_vìrD3 ë¶h@ò†¶%´!¬ý k%½¸V‚§ó£Ë~Öo¤E–rx¡Œ¨~Ž×ˆðí¨HtñØûHÂ| žÚÚ#mleÑi6èj¿QÔu¼ë~:@.\zt½ßç†ßd¥cmÀ®~E¾ziɼŽ`²¢‘çúx›¦"¨ðjÓ;"½Aš‹XÔ3zvÂ=†7êÒï`½²cuƒìô „÷²/'ðW Îu2±V‘§¹³]>GšÍ] ]Ã"Ú|$<•;;¸¦šÎU¥è°¢x™†,ÝÌ·QÄZ‘€ÆâV'¦R1Ù:Ü·ã¡J úÔsp£@pÎ=çn³ œßÐZ7™¦Zbžj!¹% Ë\I•JÚRÉl³§çt¬{®H¢oOµ˜³Pè(Y‹£ÐeÈü¸ðãU²!ƒCJƇÝh\Hâ g^TIš´2”êûÝðy«H²Íg€h>#Xæs9־΢»ð«s•vjZ¢Qš.Ǿ”¶ndº÷MVI$õÉ<ÒK£øa·ï¤z8¢Ú­E€­`”è&CR$\º»« o£twã”€ÒæBÑÎQTÙܬ܈·î¨äêß°b¯»¥Ü_bœ¥øS sˆb|ñÊ<ßåR€XÓØ;@yßêÁ#ÌZ¼€ˆ8y²ã¢f,C6]Pí—VŸ}m5@F¯äÍ<\º–ù7ÁíBƒ%¸Äf(¤ò±IZ8k!šuÎhY<}4cݶq]ý­ƒmŒ}¬ÖÈíùâD§ÐhûÇhûmÿøÚþAàÛ?xRÓæªÃ¯@ }H£68vopÕ7#¾tÈÊm_:×}k.c`0|Á ¥ Iý&šeGr„Ñ1ÐI’æmrMÕ/xŽ›¬( TrÒËê,ý¦­rÍ/Ň&ÅçäÅg÷4õߥx¤JH]½ø6Ë#Ýp2e×iÝÍ4œ­è—M ­¯š Ï ëf;©¸Î*¢^´ðlák²úP”Ñ ÝzCQ*ÖÉm `ó†È†yÊ(ÌóÛp÷5I¥l­û¯y¨¿»f+7aI¢ºt(t¾K‡òA2„^v;¤Í"줺ûÆ*É(#¢ÇÅ PZÇQw;!Re/‹C„ÁæW«ûæYwUd2î\ÌWç!Ht§~j¼U" Eõ¨–êО¶樒±'ϘÕqE$¢EFwd PÕiáH„¨euŸuÌó}Š…C׈ž3‹â6Tw¥©­,¹Ða^ÊBžqå¢EŸ» ºrÖ…/7Yð Ã~ÍQ¡Á®#Ä‚^S…•qtª*3õ.©Üv(ΰ:®×2k†’¤N¢IAÂâí&*vøŠºsŒ]S'óòºvŒùÂ1äB„Áú€å%BÇ;diÜ×% "!ÎfªCgw¬.J;ßéÁ3î¸ÔUB#êlÒgÏfàn£cÆÉL¶ÔjQÑ‹äí¢D7%š ¶Yo×â³ÈŬÌYߤcèß—²RÞ1FpüƦºÙÜ,© xNiÏ8Åh•Áïà†(ô­Ï Ì04…ÊéšÑÁ)#º€˜F벦GSIg X@i¨ÍÛAoÏ„GX}í\¥O|õ†LM—u±ŒÕÔʈðÖ– ׌ª rt¤Úǘ`ûR‰Ì ^¼vù¸\Q§óïûÔñZº(ß^Æ“Ól<›d÷iC–ÖÕPð¢tÚTgC|›$ Îɧ Õ·YâiYÕËjc«tÓ·©»×}X€Î]¹¦}A›o|‘2@Î,øŒ3ú¡}¶´¬ÁÑü]™'y¬õÕO5mÐ wÀœÙ8äÙl’ZI6 3%üL ž¶3%jeâW°§ÓÉÍÉœ^õ ÙÓè«¹ŽŽ:hø¦:Pž×g3V¤.î6HRYfù# ítoR&×LþÄ¡¦äæ¬0ªz}Z*v¦Dh¬ƒ¯é¨(+Í/ž¾¹èÓwµgÖ2Y«4—p ªoãƒÑCø]˜ï¿ã•éoD¾Û–!õ˰…û|‹CRR4({ÎÉÍF×ÃaYñ Á3*ãŠFDE¡ dÝòâGÅ«C=í³žðCZã}‘÷¶yA·ÊæH½?á©HYÏPÕ£:_øk¾¸¯òéÑó ÅLhÑìÚOx¼Ø/j“æ¦%M‹6P@cÂSu²h£¡4ªJçÅߘù^ÅÍ{Í×®x›VŸ{R{ÔAQ‡~h”ˆÖ]‡Ë“ñªY?ð¾Â<Ä)ÅecV‹s½3©fH4rÿÆõyÒ6Ðvó¢EKr]žï“(Y?0r¦Þ²®Ñ²èߊ(ª•~ ¢|?ÂÃú¡è(ʪP@IFQö·$VŸ˜lUÈ÷4Ì ¾«J@u[–Õ÷ZíνDyǺþBÝŠérˆ†ëð ,n——•.ÊnóòXR->{ñU:b8v"Ú¦^ô€NiÇ.x8WÎI.]ð”ÖÏÆ8—hÊÎâì™aLoçŸÃ·ÑvåŸYÕlŽÒ4W“ðìÉ`¥;O7ýËU;©Ñ›rÉÂàÅCü <­ÏtQåCA_sT‹Åyp_gÒMãTÇu;ku ?YN›Rž–Æu9ˆ¢AU!š·#ëùÐlueƵUBTQ0„&`Óàåœì šö «Ó8±ôä%Ú*¹ƉEkÆì‹à5¾¢ŠhÝæå²,Á42zχC$"O@X‚Ä7™ (Wð%xR[Øy±G—ĉïZGXÖ3/U³X¤Í³Mæ«Î‡ }?/F´»ÕigÇrïB§–Ÿë^V¢^Ÿ9ùˆ$!ýQKﳜ}g{iÜfˆè¹ó¸³mü’‹ÕŒÑ0囥Ú8ñ×ušo$PýçÈ_ú7.ÈoÆ”­ádˆhÌþÒÄñ1UD£`:¾B‡hòV_Íh×M°]LC¨"Ú´Æâ5.硱‘OÄ…™ãÆŽÀ™9žl©°íš&0`>&bgI6“tù˜ÆjѦW5ï\¨.4Ñ}*á%[ܳѣgSŠ®ÞûU)ºFÑ|¡2ºÉöˆù³Dè%ù­€à(Œ©†a7*;†­ÁÃ…AD¬lM¤ñîQ2Âé…Qø¾*)Ÿ§Ñ%‰…Á ßçvø K€Q9 RfÙ¥.»m¯QÞ!>mFö®ÁK®¯KFÂÇUqéÀa“ÅÛ¥›eàçs¾¶Gâ|aþ½¬k{€œ‡ó%YU/A´…üV!õÞÞ’˜{sü›XQ.A¨Ѩ©ÎU´àUv° ew> ªTÓYô ¨®«X69îFZʯÖÈÉþngPv—ÇwÊ ‚ÄðHA4õ|×z 1ϨÛ?ãz2Ö‡9ÆwU2³"†°¯‡ÜªÖ•žy|¶•¢*=óø4EUzR¦¡SÓÒÔׇ.§|É#‰ò¼äPYuá÷L)£m'‚©ËØ<¤'=®­¦5Ít0Qu†1 ð6¬>h‡æK+ÿ(_(ij-Ò[ãƒéˆ^—pGY×<ì±µï%ÅË^’fAxî)(N)î{cÄ4dÄä›@Ê*ÃÓ´Ÿ¥2oÛ'Bj'ˆÔVl–O«fÎgÉ8¾T€è)}“¯<ÌÓ}2]îî1h}!I¬nð–eªg¼*^|•fo Ú„PS1Båo€~ÒXü™#zˆ“ÀÎI2³AÞ\Mœx•¬'x½SIÉM¹«V—Òæd ÆuçýÙŒ%äµt ª3¶°-C@çêÞ‹ºí’—Už"µcZíZ¢ /®eçÅ´z™DËîc\w›2(ör;èûºšlíM<¿«è £z¢"?ûßXïDÒ¶çô3—W‘ "š¤A½ìF }#3¥Wg˜ˆn“¶öIm&â×-_0¯{F­2ådª>)j³­>PöPò~Ù ©×’z›™§Q{ÿ‰¾À‹’7¶›ëOÊ}³o›œ[‚õ;v°\ ì©7ø Î[È @Áy?á Ðô¿BÊheßüƒ¾*âÇîâñyëc Ôv»ÚÔÀ`wKòøÊìyAÑ£fadù¾Ý2@ŸÉJE˜¸ pPò+êÖÃTƒ9 v6ÔÜ|/ç?pYÒu[Y€Š®ÛÊDÉûJ¹k±Z" ¹w6Û!üÄg€ 0ŸZT¸¸‡N&_Ѱ¨_AýÔ¤~¾5.ÊݬNĺ 9®µR ïó(grvVÐcI!ì¬bhÓƒg!ƒ&¿ Àeý’ªµ:S™"0“‰³Ã#Møé¼Fk¢Ǻ©§’ú˜ëãj»z½³*zF“®’çœ'IníQé•,¹¡=ïB¿3»¯Ï3Þï|òî?ñB²D)w줫æ«‚E<¡»YÌó0³ÐHôèåmùÚèeÜŒù€vâjñ..sù £:_tE-;SN*—+j­7]Ýâ\ó<ÍŠ†A½ÌÂÔËHêe»ˆ3§ˆ‹#þlÃÁ¢o‡#®éét,5gõúd›Q“Žäª–Æ)aúh¥&JÐFkÉ}$­«XCË(˾¨Æž-7¥ìthiqü:üô•q[²læhåä¨PL4äsG 9²&6@;Ùeú Q{Cx–µ×½±µºý“¾|–+CÔ.®xhÖA!8¿vœPŽ\\±ëF‰¬7€¤o “qôhtý¬yÇ+ëuOíòJºÆÌhm94߆ôM_Šã=¦‹Ú\ %zÜÕ#vQ†,á1H/_Ý÷Z´2 _>n_ƒÊ\ŸÅk$êJÙK¹5Ê/C÷ÊŠå¬Ïô ІÅúr9ûBUu§Y3Áª¼ŽäaÞ.KZ*ï¸*±·{س4>骋ú6˜Úê ¤ûÛ=¥JVû— TÓÖ—ŠŽ†Z Cr,Ý»®PÔ=Ùw*ìQ9x\^«$gGõF·Ùvíj/%ðP†ÖÆ£ºLXj —`Ëûôh_z“ª÷8Fö˜µ¤[rÔ¨Ûó1y<îïÙöÙOâÙ¨ }ÅË?[óé1…ÉæÓ£&'îÀ1@œœ˜3w[F¥Íâ=]önɦ6‹÷“Ûå™ßž[+FC­†”’ÌYWß㼂_KÒ£µ¯½jU8FßRÚÏÂa¹æï¸¸›![õBKœ®ZùÞŽéݦ„iyF¹Í<+là—‚Ñá³–ê> úl&­¾W±(M”tÑþxd¾°Bí®`Œ$eâv Qr¾Yßg—¹{ ÀöèYckK?ê48HÝ«’÷¸gJ!”(£„× î¼¹é<þ„Z±,œW¡·ÜÑh!:ã×.´öã%Ù¸tÎ:Fy%s˜º¢ÇžÔ×UÆ\¸ä»õÔ*K>ž5{¼µí”¯XÔÚ–”¯Ð¾óuRkîîÓèŽÑ*ô;¬û,§#†C8‡C$31Û^¨ÉqL¯°ïX~®é#]\ÕÜåì¡CSzE{tÌ4H­ °);sD“9*>ù$¬;@¾Ýc4AËî¿*= [¸h"J#_lT˜óÃèê×JðºåGás€ð(Ñ«a( ›E8ÑÆ§¯å¶œ®'žŒÇ‘Ë­#HŸVȯ>û¾û\óÞúœhÈç‘>€Â«Á£TD@ Q† À£ù@F@y_Äü:f‘ÊÝOî«;®'ßx½bæçg4ä$uˆ“Šf€ô“]hܿȴ¦óf¾×gˆ¿F‡³h®î“oþP:ÆÓpWCvJ'%S'üPlð‚ŸÐÀìpåBºÞÇѯѣû¥åà‹ÖwÏ =æät­ìÕí6,Þ''X®À%9ŒK?&¨’¡*"ß<ò‹‹€&æ @A*]‰žVjIê §\Òn«­ú<Í5ªG œs´#WQ/nqzÍbºîdb”ãŒÓ£½%S÷l> ½Ö¦|ŸÛÔ¢\)¼ï›|‘»"€õû‹Èï/¢×ýEòû–ü]9¸ò:0re¨³î.˜>]ð¾»`>ºÖ…¶“_”g«ñhÇI€ì»ËD(G2Ff0¦f5”F ò¹B¿ {XK…8„wR×ú’*šŸY×ïÛ¡÷͇›Q:ÞǪ?q[IÔîØíþfšU½ÐyÄ8œú1®39?Å¢¿Ž K©¼õ<Î@n ŒÖ¹E‡Ÿökê§‚¨jš’¯–6 zªf€,°KRz¯$â¤tŽv®Sö†Ž…Ç1ò3RZ»";ϵ(pq!ND¼;¨Â(ç3‰oc Õƒ=­«g½Ì`— §x­Ùó ~ 'b­”¥<•«‡§´ð¿| A›¸Š«˜BåÎZöáIóóhPK hv§N µðSÔ(f­ìñ>*ƒòJ‰óÝQÈF?†Å[Š ôö?kž©âµö8Î;m€®¦«™÷õFµ2ŒCÏhîí£M±2ˆo•=ÖxTöË ˜§5¤¹µ×4S-™ÃWû0Þ&kI$ nñÌIu§ú ,ßÉ2›á*EDÌYå"Âò¾çöÒT/˜•7æ ™=öëêlW-òý\ŒƒbÎú®§ƒ¸ßœ¹et1‰ø¥¾N·;È¢ÖlÑE¬åÛêœæÓð©PâuP5üf*WÃ_êÏ”4t\ÉÕyÇlQÆf%Õ‡Öb²d>Ùu?“=~î, ês{ÔwÚÎm5ÚñBc%ƒúy†çh~eöê:÷/ÑP¢ÇxGIE-é1B1EE«Gë¹Ñëßn²ÖmkQ–0i^§}z…ø‰ÎS.í.rÚ†µ*iÉÓ#Wêœð`¯ƒÌEN8ç¶ÕS…Fzòåž¡j­$ÇV߬¢e}[eÓ w5 ɱ’“¾ž\ôôh5­žÅÖÕc=ëç0@aXñ82P§¾¿v­†Q;©îM²ÉÑc8”xüÄçöÔÏç|ÕWükŒóã§]‰~̾ùB#÷Ì 4£!UÃít¹EvkÌõû'? è{€bź²Xd‘ç¶Ëd~RßlïçÈçÌL„æ¹ã•ßÌ™¥Ç—®]¸‚úG)Ÿ¼dµíÃÕ²µk]Ÿ°äÖ–ô (׉ˆÎÜ€FŠÜÚ= °#Eê—Ö"B\ÕÒ¹/QQ¯e^=zd€8Ç‘†ãŒ€f(÷õ 2´±æõ"ÊiŸ·T-¹]ü"ýŽ¥ ]ä ß·î^Î"Kä;¸Eœ»GjÂ.${½.Êï›ûÛbêm*\ÛYS–vmî’:U{uÞ]E5ƒ¶zMôaieîOZ<u\Zµ4!jÑ™dÐ*ôN=ððbXß¾tû ‹VNPv?aÍøh@Öíñ%«;ÖN*~j'«ðÓêÁ–ß÷Nª•h5Œ=¨vž„ViBNô/"4cL½¡^ÿáEW j…Àã R-IÕå\•2¡Ô£4›ç™lƒZèß÷Ít×tZH´–˜hÔ«œ‚ŠúÓïËž  þX=ªŒ»” EÞ~ùõÅÁº[Š«•:>ëøpS’¡xÚŒ8(õò¯Ô{}Œ'JjÃRÔà×8ùÛ£nøINÅPNzT¼¥Þ¤{c Œ§Ñ¸\þýÂAýK¦tHvÉ,ÕÇ¿ú†+Ý.ã¯#vøÕ=º.ÉEj©¶o©´úÚœfº‚~Ejk¾c·’¯–ZOH¢eõá'>¥ ÔÏϪèún ¯ÀeɉuËÈ™ß;ß£Ê .熄_‘„’ú‡QvÀ¯HBY£ËQšÅ™XŽR-Gi¹{‚ 8{ZÏŠµp¥©ŽÅh7ðwÆçi§Ñ`E×¢'•f’JaHßA÷Õãpsià’d)i¿…w bmnо¢GËwˆ åÞês9óƒeÎr¸k9zãÚT¸`àïÁkR‹9¨Õ6eŠÚö²b]QÏ'ÞÅ+_›a©Q^IO¡ÚC$ˆ T£Í‘ùkV9ŠŸ«/7›ÓU¤ Š9gk };;o£„^®O.¸J2“ˆ[J|eù ±å …Ÿ!¯d¸Î½ûÉzIêåËhZÝü‘^ßÿ¬9o¿çz¿ x>®!éÊÑÖ˜C¯Ç˜µ:’.Y+–ã¨1k¥t¶Æ¬å_Ðu9ÈnŸåWðŸØ!…è·\â爆{ À’XÔ›?÷\·÷@¶jÅ™é{gdÜöÎj;­¢yÜš®N… z4b_1goI5^ë–ßãú.çzøn?_‹Æ#8rzpeøºxÌ#i]÷²X‘ú¨ãrOb_)/IÂãèa2ï®àö÷<êtêŸü]<õ·Ÿ  ~õ±ÍËŽŠÃ`•†{‰ÓUqx<†^ÊXð3»£{Nïq^Ùãü$J¯­Eg¶#jï|¡ÉýŠš¥|~@µôÔKYÐ%I׺úEø[øLxG­v%@«ih„/Ô,Ú^;‰XìDxf®ƒÄ™ã™¹RŽI9`´bX2D¹éq ©E‚@rß*Û4“Z=E•Ÿ}žyU­¢äqÚÐòƺ ݤí{á0ní˜*í}Å­¼í‚uü4ûeêzÜW÷È7©¥b9ºq!ÞâÏùðgÂl=®‹£ûÖžó¦Ô²4¾z„"ü4_›`ý¦æý€h½$'Ö¬åè‘KçpÌÚZ¡nŽY[+ÔÍšRø €uw|Ë8Ýq€Jä‰!´+÷ñSÑ%”ëØ#bŒþ_¸ø³rŽõ\B$…Þüµk ¹µ΀R垌6 ¹/º5tŽ& +˜ÛÒ¢,¹Íò‹úe}uKjiØŽ.‹=£•¤Î{‰ïð­L€…ÆÔ_pU9ÚF®ØÛ¾ñÚ¹} €¸Ÿg~î§åßÃGûî‚:©|%© Ð(ß4ûªƒù¢y$ÃOT¸0kQÎ?ø=û³åÃËï—úmŸÙÁ-1—‹Ôo1VTQkŸúh&úÛÍEYœ€0ÍÛÏ—œz í›åSgá‚Ü£ÌUO_cÅÇ(xÿNwÍÝì>´ÖÔ9ç"¦ÀI¡:d”‹ªCJuÈL;TâæÄzP‹…ªahLY9B­ýæ= H~‰F CÐoƒ@_ST½¡ 9è^®÷Ü8Ö™,Ô-ÉÑ{‘”{ ¹/vg—Ä7²Þ’{qºMþ°µ>[±;x¿Ýô\B¶‘,|Dή$Õæçª²qW•¡å§Ýêüg ßÉÕ°µFGºLÿãzj5´ +]Ÿ_†8 -† ñÁUš¼§FÈ3Úx¤~èÍ&;qÿ‹òK•Pêy& 0xõ(3ö)ãê§Ð/nÇ×Qkæ¶[K.± ×oCF™¾¯ÀÖ zœ&qÞÙõÎŽ%ü¤G*lå.xÃ~MÈTÝ-1•žû†U¹ï•È\g ™¼ŸñÚ{$¢þ޳ø5Ùß±ÖÈ2¥û9l+ÐÛá4¯;¢°eW± ÷(¯|íå ¯×Њ$¨¹+²¨pEö¥ÍóÒ üÄùB÷ºe‰o¬k¥öJ%Öµò ·hHW›C '—n-R#TïH«Ç']Ë¡´ª¤ÖºVˆ;ú-yeR;+%d¯³R=aRÂÔþ‚RÆ÷ˆ•îy ¿¬3 :s/Ú‡²*áÝ!7$Éæ]GÕë3‘ËJãt« ¾×/oX–Ö¯—AY¢ô|ó›í•íÝwA‹Àµ ÷D%½ZZ=j陨¥/ï#¨QrB† Ü.“ù‰ORè8¡ãûWÐCê´y}2Ú[¹3ò<Ð{;pþ0Xß”_£j(r;ðžÛ" Áóú-›  ¸¼‡ÆÙJùø$6 rž0h§RS÷”W Î 'g×Z³Ί®™¸`Gë^@­þõªÍA„íL¾± Â꺕Ǡ¡O¬Œ€i÷N¦V†|n\ú¬Yñø£ŸÍªÕeD¨µ=½¶fàÊøÆšU+ü+".vf;‰ë9?Üë OZªãµ{*ßÒž: Á{¶W~Iϵ›Ìâ~Ñ%äN»Þ‚ŽrzöwÄÏÉçSü=ÚêæPkæê¼©ØFñg˜C<Îfè°ƒý¡ #´Q®¤kïkKWg¿Î®»[:[B<@Ö\JºÖ]ký²ֽfEye0 ’£½Úu[ ÇÎËP šeûh`ZjIR¿´ó~nr\t7@ã¼Ö,YH3ÏÕõ,3pQšÛÑŠó[„r%sHÎ,MAµ+{,[ß,9Ýf•gÒà–vÌ—†fi6§½¢á®†A¼Q†¡!j¯êð†LŠ‘æÉ(>»nÊY´Qi×<êÊô&-bj¡cò3-;¿ _¸ðÞV&ͧ;©î\OÒ™#ã ù)È-Û1§ÊVv<Ï)X<Î ;V]ݲ’I[×Dû!ÑásÒ3ø¦gèŒ:1F[øÓ»V+ˆ8JÉÞãÔ„U¦”Ev“Õ\›ó¼~˜,'rºÐÊÞ2±rÄÝ!*ô!¡´’ùwÅë³~{AFÐúžâ^ÇÜ­8Þ›t<'mÍl‡:¿…~è^_º×Êaº×¥(G2*ö[mj2jp °.ËjÞ`GoTBÄxôÃåF)”±Bckµ#§²®FîK­¼”ž‡ÞÈe?4jd‘0ªÑ™&ÛÈ‚HÉΜn©Ðé íâўΣJ ¶ˆûZE­m{ôÎ~ûâ´Ý¢U¾ºmÞ)¯_PàòèŽJ-±­wj «Å5€ýRÁ cEcü§ÏìèA¡­±Ú½EIõÆ' Dcx' ˜³U¯¤Qiè¤,y†×<2`MUšŒ•XƒÎñR^MSñ#qBÕ,Æ®2 vóvqÇɵ\=Žqé Zœ vÅ’l½ÒamiùÂRµ¦Ó¤#ç³®Ï%cD­øˆ’å3SŠ›0š ЕRwç‹A-u$-d0­²‰Ì¢G_:h¦CÑ졼TQ¿ªU ²­ µ¹Jô¸«Ç[9³Ì>ûËÚ÷è÷•ßQÍëbæ½ÃOçç:¡ã;öPè<îŒ[W0("?û•– ¥‚x”¡ðG¥@‘% mÊ(’=ô¸^‘íòô¨}G2t®çïýó÷ßÿõןþï9Tî†ü…ÿëeU $öó'þ󟼊ßJxÄO¿ÏÅÿ¿XŽÎæðbþlǦøë­GyöÞˆû&öïèTW£³&Ø é¹O ÿÅQw9ï6Z0þ1Ç/è÷-þ¼_êMСsB­[]>­Å0ÜXùÄ?ûç•Å¿¿ßóírÆéõZþöŒ®\ÄþŠú¢ß¦ÑÊ)Œa¨á›Qoþ¼éýÚÓî?d:é ÈÀ? ÿl¯Ç“ÏëÓóV¤1|‡b{É2nŒHn¬õØÑïÓ˾ÿÙ‰e/üÃ÷ßÙ"èjbÿsÞ=ò[80Æ\£E àÄ?‚_†¿ô9aðà ’or ÀÀ;~¹ÛOüã$ª›xuù¹{Ö¨backward glider turning convoy #C (labelled "A") right by 15N cells and up by 3N cells. #C 3. Move the entire right/rear section (labelled "B") down by #C 24 cells. #C 4. Move the left-hand glider reflector (labelled "C") left #C by 60N cells and down by 12N cells. #C 5. Repopulate the loop with 120 gliders spaced 165+5N #C generations apart. #C Paul Tooke, 4 January 2005 x = 2468, y = 910, rule = B3/S23 2085bo$2084bobo$2083bo3bo$2081b2o2bo2b2o$2077b2obo9bob2o$2076b o3bobo5bobo3bo$2076bobobobo5bobobobo$2077b2obobo2bo2bobob2o$2079b o3bo3bo3bo$2079bob3o3b3obo$2082b2o3b2o$2082bobobobo$2082bobob obo$2081b2obobob2o$2080bobobobobobo$2079b2obobobobob2o$2078bo 3bobobobo3bo$2079b2obobobobob2o$2083bo3bo2$2082bo5bo$2078bob2o bo3bob2obo$2077bobobo2bobo2bobobo$2082bobobobo$2077bo3b2obobo b2o3bo$2078bo2bob2ob2obo2bo$2079bo2bobobobo2bo$2078bo5bobo5bo 2$2079bo3bo3bo3bo$2080bo2bo3bo2bo$2081b9o$2081bobobobobo$2082b 2o3b2o$2082b2o3b2o2$2079b3o7b3o$2081bo7bo$2078bo3bo5bo3bo$2078b o4bo3bo4bo$2078bo13bo$2078b5o5b5o4$2086b3o$2088bo$2087bo2$2116b o5b2o5b2o5bo$2114bo2b2ob2o2bo3bo2b2ob2o2bo$2112b3o4bobo3bobo3b obo4b3o$2112b2o2bo2b3ob2o3b2ob3o2bo2b2o$2045b2o65b3o2b3o4bo3b o4b3o2b3o$2046b2o23bo7bo33bobo2bo15bo2bobo$2045bo19b2obobob2o 3b2obobob2o28bo23bo$2062b3obob3o9b3obob3o$2062bo3bobo5bobo5bo bo3bo$2066b2o6bobo6b2o$2063b2o9bobo9b2o$2063b2ob2o15b2ob2o$2004b 2o61bo15bo38b2o5b2o5b2o5b2o$2003bobo114bo3bo3bo2bo3bo2bo3bo3b o$2005bo114bo3bobob3o5b3obobo3bo$2071bo5b2o5b2o5bo28bo5b2o2b3o b3o2b2o5bo$2069bo2b2ob2o2bo3bo2b2ob2o2bo26b2ob3o15b3ob2o$2067b 3o4bobo3bobo3bobo4b3o24bo25bo$2067b2o2bo2b3ob2o3b2ob3o2bo2b2o 25bo3bo15bo3bo$2067b3o2b3o4bo3bo4b3o2b3o26bo2bo15bo2bo$1963bo 104bobo2bo15bo2bobo$1963b2o104bo23bo$1962bobo7$1921b3o$1923bo $1922bo6$1880b2o$1881b2o$1880bo2$2083bo5b2o5b2o5bo$2081bo2b2o b2o2bo3bo2b2ob2o2bo$2079b3o4bobo3bobo3bobo4b3o$2079b2o2bo2b3o b2o3b2ob3o2bo2b2o$1839b2o238b3o2b3o4bo3bo4b3o2b3o$1838bobo239b obo2bo15bo2bobo$1840bo240bo23bo3b2o$2109bobo$2109bo4$1798bo320b 2o$1798b2o319b2o171bobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obo$1797bobo491bo105bo2$2291bo105bo$2117b2o206b3o$2064bo50bo2b o9bo3b3o5b3o3bo144bo33b3o69bo$2063b3o50b2o7b2ob5ob2o3b2ob5ob2o 172b2o2bo2b2o$2061b7o55bob2obo5bobobobo5bob2obo139bo26b2obob2o 3b2obob2o30bobobobo25bo$1756b3o301b2o5b2o45b2o6bo3bobo3b5ob5o 3bobo3bo165b2obobob3obobob2o29bo7bo$1758bo297bob2obo5bob2obo41b o2b2o7b3o5b2o3b2o5b3o142bo25bobobobob3obobobobo61bo$1757bo297b obobo9bobobo40bo3bo4bo2bob3o13b3obo2bo166bo2bob2o3b2obo2bo29b o7bo$2055bobobob2o3b2obobobo41b3o7bo23bo141bo27bobo2bo3bo2bob o63bo$2056b2obob2o3b2obob2o250bo5bo34bo7bo$2058bo3b2ob2o3bo220b o29bo2bo3bo2bo65bo$2059b2o2bobo2b2o65b2o5b2o177bobobobobobo32b o2bobo2bo$2063bobo61b4obobobo5bobobob4o139bo31bobobobo67bo$1715b 2o343b2obobob2o57b3obobob2obo3bob2obobob3o169b2obobob2o33bo7b o$1716b2o343bobobobo58bo3bobo13bobo3bo138bo31bobobobo67bo$1715b o345bobobobo59bob3o5b2ob2o5b3obo168b2obobobobob2o31bo7bo$2058b 2obobobobob2o56b2o21b2o139bo27bobobobobobobobo63bo$2058b2obob obobob2o7bo5b2o5b2o5bo28b5o15b5o168b2obobobobob2o31bo7bo$2057b o3bobobobo3bo4bo2b2ob2o2bo3bo2b2ob2o2bo29b2o15b2o142bo32bo3bo 68bo$2058bob2obobob2obo3b3o4bobo3bobo3bobo4b3o$2062bo3bo7b2o2b o2b3ob2o3b2ob3o2bo2b2o188bo31bo5bo67bo$1674b2o398b3o2b3o4bo3b o4b3o2b3o219bobo3bobo$1673bobo384b2o5b2o6bobo2bo15bo2bobo189b o26b3obo2bobo2bob3o62bo$1675bo381b4obo3bob4o4bo23bo41bo7bo167b 3o2bobobobo2b3o$2057b2obo2bobo2bob2o64b2obobob2o3b2obobob2o134b o27b4o2bobo2b4o63bo$2057bobobobobobobobo61b3obob3o9b3obob3o162b o2bobo2bo$2060bo2bobo2bo21b2o5b2o34bo3bobo5bobo5bobo3bo131bo28b o4bobo4bo64bo$2057bob2o2bobo2b2obo10b4obobobo5bobobob4o30b2o6b obo6b2o163bob3obobob3obo$2057b2o2bobobobo2b2o9b3obobob2obo3bo b2obobob3o26b2o9bobo9b2o132bo28b5o3b5o64bo$1633bo428bo3bo14bo 3bobo13bobo3bo26b2ob2o15b2ob2o162b3o5b3o$1633b2o447bob3o5b2ob 2o5b3obo31bo15bo136bo105bo$1632bobo447b2o21b2o215b2obobob2o$2059b 2o3bo3b2o12b5o15b5o184bo29bo2bobobo2bo65bo$2059b2o3bo3b2o15b2o 15b2o220bo3bo$2060bo3bo3bo222bo32bo3bo68bo$2060bo7bo254bo5bo$ 2061b2o3b2o223bo28b2o9b2o64bo$2059b3o5b3o250b2o9b2o$1591b3o465b 2o7b2o221bo27b2o2b2o3b2o2b2o63bo$1593bo464bob2o5b2obo250b2o7b 2o$1592bo468bo5bo223bo26bo2b2obo3bob2o2bo62bo$2056b3o11b3o246b 2o2bo5bo2b2o$2056b2ob3o5b3ob2o218bo105bo$2057b4o7b4o$2058b3o7b 3o220bo105bo2$1550b2o739bo105bo$1551b2o$1550bo740bo105bo2$2291b o105bo$2084b2o211b2o$2083b2o206bo6b2o44bo52bo$2085bo211bo46b3o 17b2o5b2o5b2o5b2o$1509b2o780bo51bo3bo14bo3bo3bo2bo3bo2bo3bo3b o8bo$1508bobo495bo3b3o5b3o3bo282bo3b3o5b3o3bo14b3o4bo14bo3bob ob3o5b3obobo3bo$1510bo492b2ob5ob2o3b2ob5ob2o42b2o5b2o212bo12b 2ob5ob2o3b2ob5ob2o11b3obob2o14bo5b2o2b3ob3o2b2o5bo8bo$2001bob 2obo5bobobobo5bob2obo5b2o25b4obobobo5bobobob4o215bob2obo5bobo bobo5bob2obo9b2o3bo16b2ob3o15b3ob2o$2000bo3bobo3b5ob5o3bobo3b o4b2o24b3obobob2obo3bob2obobob3o203bo9bo3bobo3b5ob5o3bobo3bo30b o25bo8bo$2004b3o5b2o3b2o5b3o7bo2bo23bo3bobo13bobo3bo37b2o129b 2o47b3o5b2o3b2o5b3o35bo3bo15bo3bo$2001bo2bob3o13b3obo2bo4b2ob o2bo21bob3o5b2ob2o5b3obo38bobo127bobo33bo10bo2bob3o13b3obo2bo 33bo2bo15bo2bo10bo$2003bo23bo10bo2bo20b2o21b2o38bo131bo46bo23b o$1468bo569bobo21b5o15b5o204bo105bo$1468b2o580b2o13b2o15b2o45b 2o$1467bobo580b2o75bo2b2o159bo19b2o5b2o5b2o5b2o63bo$2127bo4bo 176bo3bo3bo2bo3bo2bo3bo3bo$2059bo3b3o5b3o3bo49bob4o158bo17bo3b obob3o5b3obobo3bo61bo$2056b2ob5ob2o3b2ob5ob2o46b2o2bo7b2o5b2o 5b2o5b2o53bo93bo5b2o2b3ob3o2b2o5bo$2054bob2obo5bobobobo5bob2o bo45b3o6bo3bo3bo2bo3bo2bo3bo3bo51b2o74bo17b2ob3o15b3ob2o61bo$ 2053bo3bobo3b5ob5o3bobo3bo45bo7bo3bobob3o5b3obobo3bo50bobo92b o25bo$2057b3o5b2o3b2o5b3o14bo3b3o5b3o3bo24bo5b2o2b3ob3o2b2o5b o127bo18bo3bo15bo3bo62bo$1426b3o625bo2bob3o13b3obo2bo8b2ob5ob 2o3b2ob5ob2o21b2ob3o15b3ob2o147bo2bo15bo2bo$1428bo627bo23bo8b ob2obo5bobobobo5bob2obo19bo25bo127bo105bo$1427bo660bo3bobo3b5o b5o3bobo3bo19bo3bo15bo3bo$2092b3o5b2o3b2o5b3o24bo2bo15bo2bo129b o105bo$2089bo2bob3o13b3obo2bo174bobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobo$2091bo23bo57b3o$2175bo$2174bo$1385b2o$1386b2o $1385bo3$2097bo3b3o5b3o3bo$2094b2ob5ob2o3b2ob5ob2o$2092bob2ob o5bobobobo5bob2obo$1344b2o745bo3bobo3b5ob5o3bobo3bo$1343bobo749b 3o5b2o3b2o5b3o$1345bo746bo2bob3o13b3obo2bo$2094bo23bo5$1303bo $1303b2o$1302bobo$2144bo7bo$2138b2obobob2o3b2obobob2o$2135b3o bob3o9b3obob3o$2135bo3bobo5bobo5bobo3bo$2139b2o6bobo6b2o$2136b 2o9bobo9b2o$1261b3o872b2ob2o15b2ob2o$1263bo876bo15bo$1262bo6$ 1220b2o$1221b2o$1220bo4$2319bo$2317b2o$1179b2o1137b2o$1178bob o$1180bo6$1138bo$1138b2o$1137bobo4$2079bo$2080b2o$2079b2o$1096b 3o$1098bo$1097bo6$1055b2o$1056b2o$1055bo6$1014b2o$1013bobo$1015b o6$973bo$973b2o$972bobo7$931b3o$933bo$932bo6$890b2o$891b2o$890b o6$849b2o$848bobo$850bo4$2277bo$2276bo$808bo1467b3o$808b2o1338b 3o2b2o2b2o2b3o$807bobo1338bo5bo2bo5bo$2150b2o3b2o3b2o$2154bo2b o$2151bo8bo$2148b4o2bo2bo2b4o$2153bo4bo$2147b3o12b3o$766b3o1377b o2bo5b2o5bo2bo$768bo1378bo2bo3bo2bo3bo2bo$767bo1381b2obob4obo b2o$2148b3o2b6o2b3o$2149b2o10b2o$2121bo26b3o4b2o4b3o$2122bo29b 2o4b2o$2120b3o24b3o4bo2bo4b3o$725b2o1420bo3bo8bo3bo$726b2o1419b ob2ob3o2b3ob2obo$725bo1421bobo12bobo$2146b2o16b2o$2150bo10bo$ 2150b2o8b2o$2150b2o8b2o$2150bo10bo$684b2o1462b3o10b3o$683bobo 1467bo4bo$685bo1464b2obo4bob2o$2154bo2bo$2150bo3b4o3bo$2150bo bobo2bobobo$2153bo4bo$2151bo8bo$643bo1507bo8bo$643b2o1506bo8b o$642bobo1506bo8bo$2150b2ob2o2b2ob2o$2153bo4bo$2149bobobob2ob obobo$2149bobo2bo2bo2bobo$2149b2o2bo4bo2b2o$2149bob3o4b3obo$601b 3o1546bob2ob2ob2obo$603bo1549bob2obo$602bo1550bo4bo2$2152b3o2b 3o$2148b5ob4ob5o$bobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobo2078bo6bo$o73bo2073bo2b2o6b2o2b o$560b2o$o73bo486b2o1584bo2b2obo4bob2o2bo$560bo1585bob2obobob 2obobob2obo$o37b2o6b2o26bo2075b2o3b2o3b2o$34bob2obo6bob2obo2094b o3b3obo2bob3o3bo$o32bobobo10bobobo21bo2074bo12bo$33b4obo8bob4o $o33bo3b2o2b2o2b2o3bo22bo$34bo3b2obo2bob2o3bo467b2o$o33bo4b3o 2b3o4bo22bo443bobo$36bo3b2o2b2o3bo470bo$o33b2o3bo6bo3b2o22bo$ 39bo6bo$o38bo6bo27bo$35bo4b2o2b2o4bo$o10bobobobo16b3o3b2o2b2o 3b3o22bo$10bo7bo15b2ob3ob4ob3ob2o426bo$o34b3o3bo2bo3b3o23bo403b 2o$10bo24bo4bo4bo4bo426bobo$o34bo14bo23bo$10bo26b2o8b2o2096bo $o35bo12bo24bo2069bobo$10bo24bo14bo2092bo2bo$o34bo14bo23bo2069b 2o89bobo$10bo24bob3o6b3obo2184b2o$o36bo10bo25bo361b3o1797bo$10b o26bo3b4o3bo389bo$o36b2o8b2o25bo362bo$10bo7bo17bobo3b2o3bobo$ o10bobobobo18bo3b2o2b2o3bo24bo$38b2o6b2o$o35b2o10b2o24bo$35bo 14bo$o33b2o14b2o22bo320b2o$396b2o$o36b3o6b3o25bo320bo$38bo8bo $o34b2obo2bo2bo2bob2o23bo$36bobobo4bobobo$o33bo3bobo4bobo3bo22b o$38bo3b2o3bo$o35bo2b2o4b2o2bo24bo279b2o$36bobobo4bobobo303bo bo$o73bo280bo$35bobo10bobo$o36bo10bo25bo$36b2o10b2o$o34bo14bo 23bo$35b4o8b4o$o32bo4bo8bo4bo21bo238bo$33bobobo10bobobo260b2o $o34bob2obo4bob2obo23bo237bobo$38b2obo2bob2o$o40bo2bo29bo2070b o$41bo2bo2099bobo$o37bo2bo2bo2bo26bo2068bo2bo$38bob2o2b2obo2096b 2o$o73bo$37b2o3b2o3b2o222b3o$o73bo198bo$35bo2bo8bo2bo221bo$o34b 2o12b2o23bo$34b2o14b2o$o32bobo2b2o6b2o2bobo21bo$35bo2b2o6b2o2b o$o39bo4bo28bo$34bob2o10b2obo178b2o$o38bo6bo27bo156b2o$35bo2b 2o6b2o2bo179bo$o34bo14bo23bo$40bo4bo$o39b2o2b2o28bo$37bo3bo2b o3bo$o36bo3bo2bo3bo25bo$38bo2bo2bo2bo141b2o$o35bo3bo4bo3bo24b o113bobo$35b5o6b5o139bo$o33b3ob2o6b2ob3o22bo$37b2o8b2o$o36b2o 8b2o25bo$37b2o3b2o3b2o$o40bo2bo29bo$36bo2bo6bo2bo98bo$o35bobo 3b2o3bobo24bo73b2o$38b2obo2bob2o99bobo$o38b2o4b2o27bo$36bob2o 6b2obo2095bo$o39b2o2b2o28bo2069bobo$39bo6bo2096bo2bo$o39bo4bo 28bo2069b2o$39b2o4b2o$o38bobo2bobo27bo31b3o$42b2o64bo$o38b3o2b 3o27bo32bo$39b2o4b2o$o38b8o27bo$40b6o$o40b4o29bo2119bo$2194bo bo$o64b2o7bo2119b2o$66b2o$o64bo8bo2$o20bo7bo44bo$15b2obobob2o 3b2obobob2o26b3o$o11b3obob3o9b3obob3o23bo11bo$12bo3bobo5bobo5b obo3bo24bo$o15b2o6bobo6b2o39bo$13b2o9bobo9b2o$o12b2ob2o15b2ob 2o36bo$17bo15bo$o73bo$104b2o$o73bo28b2o$105bo$o73bo$bobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobo3$2145bo$145b2o1997bobo$145bobo1995bo2bo$145bo1998b2o6$187b o$186b2o1876bobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobo$186bobo1874bo247bo2$2063bo247bo2$2063bo247bo 2$2063bo247bo$227b3o$227bo1835bo247bo$228bo$2063bo247bo2$2063b o117bo129bo$2181bo$2063bo117bo129bo$269b2o1906bo3bo3bo$268b2o 1793bo110bobob2obob2obobo122bo$270bo1902b2obobob3obobob2o$2063b o108bo3bo9bo3bo120bo$2172bobobob2o3b2obobobo$2063bo112b2obo3b ob2o74bobob2o44bo$2173b2obo9bob2o70bo$2063bo81bo30b2o2bobo2b2o 81bo42bo$310b2o1832bobo29bobobobobobo73bo7bo$310bobo1750bo79b o2bo31bobobobo126bo$310bo1833b2o32bobobobo75bo7bo$2063bo114bo bobobo126bo$2175b2obobobobob2o72bo2b2obo$2063bo110bobobobobob obobo122bo$2175bo2bobobobo2bo72bo7bo$2063bo113bo2bobo2bo125bo $352bo1907bo7bo$351b2o1710bo204bo42bo$351bobo1823b3o3b3o74bo$ 2063bo110bo3b2o3b2o3bo72bobob2o44bo$2173b3o4bobo4b3o$2063bo113b o2bobo2bo125bo$2176bobobobobobo$2063bo110bo5bobo5bo122bo$2174b o5bobo5bo$392b3o1668bo111b5o3b5o123bo$392bo1761bo$393bo1669bo 88b2o157bo$2153b2o22bo3bo3bo$2063bo112bob2obob2obo124bo$2177b 3obob3o$2063bo112b2o7b2o124bo$2176b3o5b3o$434b2o1627bo111b2o9b 2o123bo$433b2o$435bo1627bo111bo2bo5bo2bo123bo$2174b2o2b2o3b2o 2b2o$2063bo110b2o2b2o3b2o2b2o122bo$2174bo2bo7bo2bo$2063bo247b o$2145bo$475b2o1586bo80bobo164bo$475bobo1665bo2bo$475bo1587bo 80b2o165bo2$2063bo247bo$2164b3o51b2o5b2o$2063bo102bo43b4obobo bo5bobobob4o76bo$2165bo43b3obobob2obo3bob2obobob3o$517bo1545b o145bo3bobo13bobo3bo75bo$516b2o1692bob3o5b2ob2o5b3obo$516bobo 1544bo146b2o21b2o76bo$2113bo3b3o5b3o3bo29bo5b2o5b2o5bo28b5o15b 5o$2063bo46b2ob5ob2o3b2ob5ob2o24bo2b2ob2o2bo3bo2b2ob2o2bo29b2o 15b2o79bo$2108bob2obo5bobobobo5bob2obo20b3o4bobo3bobo3bobo4b3o $2063bo43bo3bobo3b5ob5o3bobo3bo19b2o2bo2b3ob2o3b2ob3o2bo2b2o125b o$2111b3o5b2o3b2o5b3o23b3o2b3o4bo3bo4b3o2b3o$2063bo44bo2bob3o 13b3obo2bo21bobo2bo15bo2bobo126bo$557b3o1550bo23bo24bo23bo41b o7bo$557bo1505bo155b2obobob2o3b2obobob2o71bo$558bo1657b3obob3o 9b3obob3o$2063bo109b2o5b2o34bo3bobo5bobo5bobo3bo68bo$2165b4ob obobo5bobobob4o4b2o24b2o6bobo6b2o$2063bo100b3obobob2obo3bob2o bobob3o3b2o14b2o5b2o9bobo9b2o69bo$2164bo3bobo13bobo3bo18bo2bo 4b2ob2o15b2ob2o$2063bo101bob3o5b2ob2o5b3obo20b2o9bo15bo73bo$599b 2o1564b2o21b2o20b2o$598b2o1463bo101b5o15b5o16b2obo101bo$600bo 1567b2o15b2o19bo2bo$2063bo143b3o101bo2$2063bo247bo2$2063bo247b o$640b2o$640bobo1420bo247bo$640bo$2063bo247bo2$2063bo247bo2$2063b o247bo$682bo$681b2o1380bo247bo$681bobo$2063bo247bo2$2063bo121b 2o5b2o117bo$2177b4obobobo5bobobob4o$2063bo112b3obobob2obo3bob 2obobob3o108bo$2176bo3bobo13bobo3bo$722b3o1338bo113bob3o5b2ob 2o5b3obo109bo$722bo1454b2o21b2o$723bo1339bo113b5o15b5o109bo$2180b 2o15b2o$2063bo247bo2$2063bo247bo2$764b2o1297bo247bo$763b2o$765b o1297bo247bo2$2063bo247bo2$2063bo158b2o5b2o5b2o5b2o66bo$2220b o3bo3bo2bo3bo2bo3bo3bo$805b2o1256bo156bo3bobob3o5b3obobo3bo64b o$805bobo1412bo5b2o2b3ob3o2b2o5bo$805bo1257bo156b2ob3o15b3ob2o 64bo$2220bo25bo$2063bo157bo3bo15bo3bo65bo$2222bo2bo15bo2bo$2063b o247bo2$847bo1215bo162bo3b3o5b3o3bo66bo$846b2o1375b2ob5ob2o3b 2ob5ob2o$846bobo1214bo157bob2obo5bobobobo5bob2obo61bo$2220bo3b obo3b5ob5o3bobo3bo$2063bo160b3o5b2o3b2o5b3o64bo$2180b2o5b2o32b o2bob3o13b3obo2bo$2063bo108b4obobobo5bobobob4o26bo23bo63bo$2171b 3obobob2obo3bob2obobob3o$2063bo107bo3bobo13bobo3bo113bo$887b3o 1282bob3o5b2ob2o5b3obo$887bo1175bo108b2o21b2o114bo$888bo1283b 5o15b5o$2063bo111b2o15b2o38bo5b2o5b2o5bo58bo$2207b2o21bo2b2ob 2o2bo3bo2b2ob2o2bo$2063bo143b2o12bo6b3o4bobo3bobo3bobo4b3o54b o$2181bo3b3o5b3o3bo21bobo4b2o2bo2b3ob2o3b2ob3o2bo2b2o$2063bo114b 2ob5ob2o3b2ob5ob2o18b3o4b3o2b3o4bo3bo4b3o2b3o54bo$929b2o1245b ob2obo5bobobobo5bob2obo24bobo2bo15bo2bobo$928b2o1133bo111bo3b obo3b5ob5o3bobo3bo24bo23bo56bo$930bo1248b3o5b2o3b2o5b3o$2063b o112bo2bob3o13b3obo2bo106bo$2178bo23bo$2063bo247bo2$2063bo247b o$970b2o$970bobo1090bo247bo$970bo$2063bo247bo2$2063bo247bo2$2063b o247bo$1012bo$1011b2o1050bo247bo$1011bobo$2063bo247bo2$2063bo 247bo2$2063bo247bo$2193bo3b3o5b3o3bo$1052b3o1008bo126b2ob5ob2o 3b2ob5ob2o96bo$1052bo1135bob2obo5bobobobo5bob2obo$1053bo1009b o123bo3bobo3b5ob5o3bobo3bo93bo$2191b3o5b2o3b2o5b3o$2063bo124b o2bob3o13b3obo2bo94bo$2190bo23bo$2063bo247bo2$1094b2o967bo247b o$1093b2o$1095bo967bo247bo2$2063bo247bo2$2063bo247bo2$1135b2o 926bo178bo7bo60bo$1135bobo1098b2obobob2o3b2obobob2o$1135bo927b o169b3obob3o9b3obob3o51bo$2233bo3bobo5bobo5bobo3bo$2063bo173b 2o6bobo6b2o55bo$2234b2o9bobo9b2o$2063bo170b2ob2o15b2ob2o52bo$ 2238bo15bo$1177bo885bo247bo$1176b2o$1176bobo884bo173b2o5b2o5b 2o5b2o51bo$2235bo3bo3bo2bo3bo2bo3bo3bo$2063bo171bo3bobob3o5b3o bobo3bo49bo$2235bo5b2o2b3ob3o2b2o5bo$2063bo171b2ob3o15b3ob2o49b o$2235bo25bo$2063bo124bo3b3o5b3o3bo29bo3bo15bo3bo50bo$1217b3o 965b2ob5ob2o3b2ob5ob2o27bo2bo15bo2bo$1217bo845bo119bob2obo5bo bobobo5bob2obo18bo80bo$1218bo963bo3bobo3b5ob5o3bobo3bo16b2o3b obo$2063bo122b3o5b2o3b2o5b3o19b3o2b2obo74bo$2183bo2bob3o13b3o bo2bo8b2o12bo2bo$2063bo121bo23bo10b2o10bobobo14b2o5b2o51bo$2231b 2ob2o7b4obobobo5bobobob4o$2063bo178b3obobob2obo3bob2obobob3o42b o$1259b2o931b2o5b2o5b2o5b2o27bo3bobo13bobo3bo$1258b2o803bo126b o3bo3bo2bo3bo2bo3bo3bo26bob3o5b2ob2o5b3obo43bo$1260bo929bo3bo bob3o5b3obobo3bo26b2o21b2o$2063bo126bo5b2o2b3ob3o2b2o5bo26b5o 15b5o43bo$2190b2ob3o15b3ob2o29b2o15b2o$2063bo126bo25bo94bo$2191b o3bo15bo3bo$2063bo128bo2bo15bo2bo96bo$1300b2o$1300bobo760bo247b o$1300bo$2063bo247bo2$2063bo247bo2$2063bo247bo$1342bo$1341b2o 720bo247bo$1341bobo$2063bo247bo2$2063bo247bo2$2063bo247bo2$1382b 3o678bo247bo$1382bo821b2o5b2o5b2o5b2o$1383bo679bo138bo3bo3bo2b o3bo2bo3bo3bo82bo$2202bo3bobob3o5b3obobo3bo$2063bo138bo5b2o2b 3ob3o2b2o5bo82bo$2202b2ob3o15b3ob2o$2063bo138bo25bo82bo$2203b o3bo15bo3bo20bo3b3o5b3o3bo$1424b2o637bo140bo2bo15bo2bo18b2ob5o b2o3b2ob5ob2o41bo$1423b2o818bob2obo5bobobobo5bob2obo$1425bo637b o178bo3bobo3b5ob5o3bobo3bo38bo$2246b3o5b2o3b2o5b3o$2063bo179b o2bob3o13b3obo2bo39bo$2245bo23bo$2063bo247bo2$1465b2o596bo247b o$1465bobo$1465bo597bo247bo$2248b2o5b2o$2063bo182bo3bo3bo2bo53b o$2246bo3bobob3o13bo7bo$2063bo182bo5b2o2b3o5b2obobob2o3b2obob ob2o26bo$2246b2ob3o9b3obob3o9b3obob3o$1507bo555bo182bo14bo3bo bo5bobo5bobo3bo23bo$1506b2o739bo3bo13b2o6bobo6b2o$1506bobo554b o184bo2bo10b2o9bobo9b2o24bo$2262b2ob2o15b2ob2o$2063bo202bo15b o28bo2$2063bo247bo$2192b2o5b2o$2063bo120b4obobobo5bobobob4o102b o$1547b3o633b3obobob2obo3bob2obobob3o$1547bo515bo119bo3bobo13b obo3bo15b2o84bo$1548bo635bob3o5b2ob2o5b3obo15bobo$2063bo120b2o 21b2o17bo6b2o76bo$2184b5o15b5o24b2o7bo3b3o5b3o3bo$2063bo123b2o 15b2o6bo26b2ob5ob2o3b2ob5ob2o47bo$2211bo25bob2obo5bobobobo5bo b2obo$2063bo146bo2bo2b2o18bo3bobo3b5ob5o3bobo3bo44bo$1589b2o619b o4bo24b3o5b2o3b2o5b3o$1588b2o473bo146b2o3b3o19bo2bob3o13b3obo 2bo45bo$1590bo621bo26bo23bo$2063bo156b2o89bo$2221bo$2063bo155b o7b2o5b2o5b2o5b2o61bo$2185b2o5b2o31bo3bo3bo2bo3bo2bo3bo3bo$2063b o113b4obobobo5bobobob4o23bo3bobob3o5b3obobo3bo59bo$1630b2o544b 3obobob2obo3bob2obobob3o22bo5b2o2b3ob3o2b2o5bo$1630bobo430bo112b o3bobo13bobo3bo22b2ob3o15b3ob2o59bo$1630bo546bob3o5b2ob2o5b3o bo23bo25bo$2063bo113b2o21b2o24bo3bo15bo3bo60bo$2177b5o15b5o25b o2bo15bo2bo$2063bo116b2o15b2o112bo2$2063bo247bo$1672bo$1671b2o 390bo247bo$1671bobo$2063bo247bo$2219bo5b2o5b2o5bo$2063bo153bo 2b2ob2o2bo3bo2b2ob2o2bo69bo$2215b3o4bobo3bobo3bobo4b3o$2063bo 151b2o2bo2b3ob2o3b2ob3o2bo2b2o67bo$2215b3o2b3o4bo3bo4b3o2b3o$ 1712b3o348bo152bobo2bo15bo2bobo68bo$1712bo504bo23bo$1713bo349b o247bo2$2063bo247bo2$2063bo247bo2$1754b2o307bo247bo$1753b2o$1755b o307bo247bo2$2063bo146b2o99bo$2176bo3b3o5b3o3bo15b2o$2063bo109b 2ob5ob2o3b2ob5ob2o113bo$2171bob2obo5bobobobo5bob2obo$1795b2o266b o106bo3bobo3b5ob5o3bobo3bo110bo154b2o$1795bobo376b3o5b2o3b2o5b 3o268bobo$1795bo267bo107bo2bob3o13b3obo2bo111bo155bo$2173bo23b o$2063bo247bo2$2063bo115b2o5b2o123bo$2171b4obobobo5bobobob4o$ 1837bo225bo106b3obobob2obo3bob2obobob3o114bo113bo$1836b2o332b o3bobo13bobo3bo228b2o$1836bobo224bo107bob3o5b2ob2o5b3obo115bo 112bobo$2171b2o21b2o$2063bo107b5o15b5o28bo5b2o5b2o5bo66bo$2174b 2o15b2o29bo2b2ob2o2bo3bo2b2ob2o2bo$2063bo156b3o4bobo3bobo3bob o4b3o62bo$2220b2o2bo2b3ob2o3b2ob3o2bo2b2o$2063bo136b2o18b3o2b 3o4bo3bo4b3o2b3o62bo$1877b3o341bobo2bo15bo2bobo135b3o$1877bo185b o108bo7bo14b2o25bo23bo64bo73bo$1878bo287b2obobob2o3b2obobob2o 23b2o172bo$2063bo99b3obob3o9b3obob3o5bobo12b2o99bo$2163bo3bob o5bobo5bobo3bo6bo27b2o5b2o$2063bo103b2o6bobo6b2o10bo19b4obobo bo5bobobob4o70bo$2164b2o9bobo9b2o26b3obobob2obo3bob2obobob3o$ 2063bo100b2ob2o15b2ob2o26bo3bobo13bobo3bo69bo$1919b2o247bo15b o31bob3o5b2ob2o5b3obo101b2o$1918b2o143bo152b2o21b2o70bo31b2o$ 1920bo295b5o15b5o101bo$2063bo155b2o15b2o73bo2$2063bo247bo2$2063b o247bo$1960b2o339b2o$1960bobo100bo236bobo8bo$1960bo341bo$2063b o247bo2$2063bo247bo2$2063bo247bo$2002bo257bo$2001b2o60bo196b2o 49bo$2001bobo255bobo$2063bo247bo2$2063bo247bo2$2063bo247bo2$2042b 3o18bo154b3o90bo$2042bo177bo$2043bo19bo155bo91bo2$2063bo247bo 2$2063bo247bo2$2063bo20b2o225bo$2083b2o$2063bo21bo225bo2$2063b o97b2o5b2o5b2o5b2o127bo$2159bo3bo3bo2bo3bo2bo3bo3bo$2063bo95b o3bobob3o5b3obobo3bo125bo$2159bo5b2o2b3ob3o2b2o5bo24bo3b3o5b3o 3bo$2063bo61b2o32b2ob3o15b3ob2o21b2ob5ob2o3b2ob5ob2o79bo$2125b obo31bo25bo19bob2obo5bobobobo5bob2obo$2063bo61bo34bo3bo15bo3b o19bo3bobo3b5ob5o3bobo3bo76bo$2161bo2bo15bo2bo24b3o5b2o3b2o5b 3o$2063bo141bo2bob3o13b3obo2bo77bo$2207bo23bo$2063bo247bo2$2063b o103bo143bo$2166b2o$2063bo102bobo142bo2$2063bo247bo$2207bo3b3o 5b3o3bo$2063bo140b2ob5ob2o3b2ob5ob2o82bo$2202bob2obo5bobobobo 5bob2obo$2063bo122bo14bo3bobo3b5ob5o3bobo3bo79bo$2185bo2bo16b 3o5b2o3b2o5b3o$2063bo122b2o14bo2bob3o13b3obo2bo80bo$2204bo23b o$2063bo247bo2$2063bo126b2ob3obo113bo$2190b2o4b2o$2063bo126b2o 119bo$2192b2o2bo$2063bo130b2o115bo$2170bo7bo$2063bo100b2obobo b2o3b2obobob2o126bo$2161b3obob3o9b3obob3o$2063bo97bo3bobo5bob o5bobo3bo123bo$2165b2o6bobo6b2o$2063bo98b2o9bobo9b2o124bo$2162b 2ob2o15b2ob2o$2063bo102bo15bo128bo2$2063bo247bo2$2063bo247bo2$ 2063bo247bo2$2063bo247bo$2064bobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobo$! golly-3.3-src/Patterns/Life/Rakes/spider-rake.rle0000644000175000017500000000726112026730263016660 00000000000000#C p360 Spider Rake #C Nine gliders travel in a figure-8 loop, trapped by c/5 spiders, #C liberating one glider each time. The gliders in the loop collide #C with the prepulsar part of a c/5 spider combo to form a Herschel #C traveling downwards. The Herschel is guided by other spiders, #C producing a glider with the correct parity to form a large period #C spaceship - in this case, p3240, which can be divided by 9 to form #C a p360 spaceship. The Herschel on the left side is then killed, #C but the Herschel on the right side is pushed a little further to #C liberate one more glider before it is killed. #C On the far right side, another c/5 spider-prepulsar spaceship #C reflects the forward gliders, making this a backward rake. #C By David Bell, June 3, 1998 #C From Alan Hensel's "lifebc" pattern collection. x = 500, y = 127, rule = B3/S23 34bo5bo346bo5bo$33bobo3bobo344bobo3bobo$32bo3bobo3bo342bo3bobo3bo$33bo bo3bobo344bobo3bobo$34bo5bo346bo5bo$5boo5boo5boo5boo19boo5boo5boo5boo 288boo5boo5boo5boo19boo5boo5boo5boo$3bo3bo3bobbo3bobbo3bo3bo15bo3bo3bo bbo3bobbo3bo3bo284bo3bo3bobbo3bobbo3bo3bo15bo3bo3bobbo3bobbo3bo3bo$3bo 3bobob3o5b3obobo3bo9boo4bo3bobob3o5b3obobo3bo284bo3bobob3o5b3obobo3bo 4boo9bo3bobob3o5b3obobo3bo$3bo5boobb3ob3obboo5bo8bobbo3bo5boobb3ob3obb oo5bo284bo5boobb3ob3obboo5bo3bobbo8bo5boobb3ob3obboo5bo$3boob3o15b3ob oo9boo4boob3o15b3oboo284boob3o15b3oboo4boo9boob3o15b3oboo$3bo25bo15bo 25bo284bo25bo15bo25bo$4bo3bo15bo3bo17bo3bo15bo3bo286bo3bo15bo3bo17bo3b o15bo3bo$5bobbo15bobbo19bobbo15bobbo288bobbo15bobbo19bobbo15bobbo3$47b oo$47bobo$47bo7$334boo$333bobo$335bo4$55bo7bo300bo7bo$4bo5boo5boo5bo 24booboboboo3booboboboo288booboboboo3booboboboo24bo5boo5boo5bo$bbobboo boobbo3bobbooboobbo19b3obob3o9b3obob3o282b3obob3o9b3obob3o19bobbooboo bbo3bobbooboobbo$3o4bobo3bobo3bobo4b3o17bo3bobo5bobo5bobo3bo64boo216bo 3bobo5bobo5bobo3bo17b3o4bobo3bobo3bobo4b3o$oobbobb3oboo3boob3obbobboo 21boo6bobo6boo68bobo219boo6bobo6boo21boobbobb3oboo3boob3obbobboo$3obb 3o4bo3bo4b3obb3o18boo9bobo9boo65bo218boo9bobo9boo18b3obb3o4bo3bo4b3obb 3o$bobobbo15bobbobo19booboo15booboo284booboo15booboo19bobobbo15bobbobo $bbo23bo24bo15bo292bo15bo24bo23bo5$244boo$243bobo$245bo6$389bo$47bo5b oo5boo5bo159boo131bo5boo5boo5bo8bobo$45bobbooboobbo3bobbooboobbo157bob o128bobbooboobbo3bobbooboobbo6b3o$43b3o4bobo3bobo3bobo4b3o155bo128b3o 4bobo3bobo3bobo4b3o$43boobbobb3oboo3boob3obbobboo284boobbobb3oboo3boob 3obbobboo$43b3obb3o4bo3bo4b3obb3o284b3obb3o4bo3bo4b3obb3o$44bobobbo15b obbobo286bobobbo15bobbobo$45bo23bo288bo23bo3$154boo$153bobo$155bo7$ 317boo$317bobo$317bo7$64boo$63bobo394bo$65bo393bobo$466bo$459b3o3bobo $$11boo5boo445b3o$3b4obobobo5bobobob4o405bo3b3o5b3o3bo$bb3oboboboobo3b oboobobob3o401boob5oboo3boob5oboo$bbo3bobo13bobo3bo17bo5boo5boo5bo361b oboobo5bobobobo5boboobo18bo3b3o5b3o3bo$3bob3o5booboo5b3obo16bobbooboo bbo3bobbooboobbo358bo3bobo3b5ob5o3bobo3bo14boob5oboo3boob5oboo$3boo21b oo14b3o4bobo3bobo3bobo4b3o360b3o5boo3boo5b3o16boboobo5bobobobo5boboobo $3b5o15b5o14boobbobb3oboo3boob3obbobboo357bobbob3o13b3obobbo12bo3bobo 3b5ob5o3bobo3bo$6boo15boo17b3obb3o4bo3bo4b3obb3o339bo7bo11bo23bo18b3o 5boo3boo5b3o$43bobobbo15bobbobo334booboboboo3booboboboo45bobbob3o13b3o bobbo$44bo23bo332b3obob3o9b3obob3o44bo23bo$356boo5boo5boo5boo22bo3bobo 5bobo5bobo3bo$354bo3bo3bobbo3bobbo3bo3bo24boo6bobo6boo$354bo3bobob3o5b 3obobo3bo21boo9bobo9boo$354bo5boobb3ob3obboo5bo21booboo15booboo$354boo b3o15b3oboo25bo15bo$354bo25bo$355bo3bo15bo3bo$356bobbo15bobbo11$360boo 5boo5boo5boo$358bo3bo3bobbo3bobbo3bo3bo$358bo3bobob3o5b3obobo3bo$358bo 5boobb3ob3obboo5bo$358boob3o15b3oboo$358bo25bo$359bo3bo15bo3bo$360bobb o15bobbo28bo7bo$405booboboboo3booboboboo$402b3obob3o9b3obob3o$402bo3bo bo5bobo5bobo3bo$406boo6bobo6boo$403boo9bobo9boo$403booboo15booboo$407b o15bo! golly-3.3-src/Patterns/Life/Rakes/2c5-spaceship-rake-p240.rle0000644000175000017500000006735512026730263020435 00000000000000#C p240 c/2 forward rake for a 2c/5 spaceship. #C This is the first rake in which the output travels in the #C same direction as the rake, but at a slower speed. #C Rake constructed by Jason Summers, March 2003. #C Synthesis of 2c/5 spaceship mostly by Noam Elkies. x = 1376, y = 297, rule = B3/S23 1215boo$1199boo13booboo$1198b4o13b4o$944bobbo249booboo14boo$943bo254b oo$943bo3bo$926b4o13b4o$926bo3bo281boo4bo$926bo274boo9boo3b3o7bo$927bo bbo269bobbo12booboo4boo$1199boobbo11b3ob3o4boo$940boo4bo253boobbo11boo b3o$929boo9boo3bobo6bo246b4o12bobo$928bobbo12bo3bo5bobo275bo48b4o$928b obbo12bo3bo5boo274boo7boo24bobbo12bo3bo$928booboo11bo3bo250boo30boo5b oob3o20bo16bo$930boo13bobbo21bo227b4o4b4o29b5o20bo3bo13bobbo$946bo12bo 8bo3bo224booboo4bo3bo3bobbo22b3o21b4o$959bobo5bo230boo6bo6bo23bo48b3o$ 959boo6bo4bo234bobbobbo3bo17boo$926b4o5boo30b5o241b4o9boo8boo32boo14bo bbo$926bo3bo3booboo4boo274b3o5boo39bo18bobo$926bo8b4o3b4o18bo254booboo 6b3o33boo4boo20bo$927bobbo5boo3booboo9bo8bobo252b3o5boo37bo6boo18bo$ 410boo530boo11bo8boo247b4o9boo38bo7boo17b3o$409boob4o532bobo4boobbo 253bo3bo49bobbo3bo$401boo7b6o531boobbo7bo253bo55bo$400booboo6b4o533bob o4boobbo254bobbo81bo5b5o$388boo11b4o537boo11bo276bobbo11bo17bobbo5boo 22bo6bo4bo$386bo15boo537booboo9bo275bo13boo17bo8b4o21b3o4bo$385bo6boo 3boo543b4o285bo3bo10boo16bo3bo3booboo29bo3bo$385bo7bobbo546boo286b4o 29b4o5boo5boo26bo$385b12oboo561boo11bo304booboo8bo$390boobboob3o560b4o 10bobo303b4o3bo4bobo9boo$395bobo561booboo10boo256b3o3bo42boo3bo5bobbo 7bo$396bo563boo269b5obboo45bobbo6bo8boo$386boo412bobbo426boob4obo42boo 3bo5bobbo$385booboo409bo168bo262boo47b4o3bo4bobo14bo$386b4o409bo3bo 160b6o309booboo8bo15bo$369bobbo14boo393b4o13b4o156b8o3bo309boo26b3o$ 368bo413bo3bo172bo8boo281bo$368bo3bo409bo176bo6b3o276boo4bo$368b4o9boo 12boo386bobbo173bo5boo276booboobboo45boo$374b3o5boo10boo566boo281b4ob 3o44booboo$374booboo6b3o8bo399boo4bo359b4o80b4o3boboo41b4o$374b3o5boo 401boo9boo3bobo6bo350b6o83bob5o42boo$368b4o9boo401bobbo12bo3bo5bobo 153b4o183boo5boob4o82booboo46bo5b3o$362bobbobbo3bo17boo26boo364bobbo 12bo3bo5boo138bobbo12bo3bo181b4o5boo88bo46bo3bo3boobo$353boo6bo6bo20b oo25bo4bo362booboo11bo3bo144bo16bo184booboo91booboo45bo5bo5bo$352boob oo4bo3bo3bobbo18bo3b3o17bo370boo13bobbo21bo122bo3bo13bobbo181boo92b5o 46bo5bo3b3o$353b4o4b4o29b5o16bo6bo6boo371bo12bo8bo3bo120b4o292boob3o 46b6obo3bo$354boo37boob3o16b8o8bo383bobo5bo147b3o162b6o104boo58bo$385b oo7boo24boo393boo6bo4bo307bo5b4o110bobbo$363bo20boo41bobbo351b4o5boo 30b5o127boo14bobbo161bo5boboo109bo$94b4o258bo3bo4bo20bo40bobo352bo3bo 3booboo4boo152bo18bobo162bo3bobboo109bo3bo$78bobbo12bo3bo256boo4bo3bo 3booboo42boo364bo8b4o3b4o18bo130boo4boo20bo159bo98b4o13b4o$77bo16bo 259boo5bo8bobbo41booboo49bo313bobbo5boo3booboo9bo8bobo128bo6boo18bo 159boo98bo3bo$77bo3bo13bobbo256boo13b3o7boo34b4o50bo327boo11bo8boo129b o7boo17b3o156b4o97bo$77b4o283bobbo11boo23boo11boo49b3o333bobo4boobbo 136bobbo3bo176booboo98bobbo$365boo14bo20bo5boo393boobbo7bo138bo182boo 125bo$104bo296bo6b3o393bobo4boobbo168bo5b5o154bo93boo19bobo$82bobo18bo 297bo8boo386boo11bo138bobbo5boo22bo6bo4bo123b4o25boo91b5o18boo$81bo3b oob3o12b3o247boo46b8o3bo384booboo9bo137bo8b4o21b3o4bo128bo3bo9bo14bobo 89bo4bobb3obo$79boobob4o4boo258booboo14boo33b6o386b4o147bo3bo3booboo 29bo3bo123bo11boo107bobb3o3bo3boo$79bo4b5o5boo257b4o13b4o36bo55bobo 330boo148b4o5boo5boo26bo126bobbobboo5b3o104boobbo7bobo14bo$79bo3bo5bo 4boo13bo244boo13booboo93boo348boo11bo133booboo20bo135b3o6b3o7bo97boo7b oobo14bobo10bo$80b3o8b5o12bo261boo30boo55bobo5bo348b4o10bobo132b4o3bo 5b3o7bo131bobbobboo5b3o7bo19boo87boo15boo9bo3bo$82bo9boo14b3o290booboo 46boo5bobbo352booboo10boo134boo3boboo3b3obbo4b3o128bo11boo11bo16bo90bo 26bo$118b5o279b4o45boob4o3boo353boo152bo3bo6bobo121boo12bo3bo9bo26bo6b o111bo4bo$78bobbo5boo29bo4bo279boo47b5o6bo302b4o56bo139boo3boboo3b3obb o120b4o4b4o3b4o37bo8bo68b4o5boo25bo4b5o$77bo8b4o24bo3bo266boo66b3o5boo 302b7o4boo47bobo137b4o3bo5b3o122booboo4bo3bo22bo20b8obo68bo3bo3booboo 4boo17bobo$77bo3bo3booboo23bo5bo3bo260b4o70booboo301boob3oboobbobo42b oobboob3o134booboo135boo6bo25boo5boo18boo71bo8b4o3b4o16boo$77b4o5boo5b oo18b3o5bo261booboo11bo11boo352boo3boobbobboo36b12oboo135boo146bobbo 21bobo3boob3o89bobbo5boo3booboo$92booboo12bo274boo5bobbo3boboo9bobo38b 4o318bobbo37bo7bobbo318b5o104boo5boob3o$93b4o3bo8bo280bo3bo4b5o7bo40bo 3bo7boo302boo4bobo38bo6boo3boo317b3o12boo97bo5boo11bo$94boo3bobobboo 283boo4bo4bobbo48bo10boo301bo8bo40bo166boo129boo18bo25booboo94boo7bo 10bobo$98bo3boobbo6boo275bo3bo4b5o49bobbo8bo299bo52boo162booboo119boo 7bo17boo26b4o95bo5boo11boo$94boo3bobobboo278boo5bobbo3boboo4boo357bo3b o213b4o32bo85boo5bobbo17bobo13boo11boo90boo5boob3o$93b4o3bo8bo259bobbo 5boo3booboo11bo6bobo29boo325b4o54bobbo157boo7boo24bobo84boo4b3o32bo 105booboo73b4o$55b4o33booboo12bo258bo8b4o3b4o18bo30boob4obo7bo299boo 67bo162bo7boo24boo86bo3boo15bo17bo6boo3boo94b4o57bobbo12bo3bo$39bobbo 12bo3bo33boo29bo243bo3bo3booboo4boo51b5obbo7bo297bo70bo3bo156bo3bo8bo 7bo123bo17bo7bobbo97boo57bo16bo$38bo16bo67bo244b4o5boo30b5o25b3o3bo 304bo6boo3boo41b4o13b4o156bo5bo7b3o4bo122bobo17b12oboo110b4o39bo3bo13b obbo$38bo3bo13bobbo63b3o275boo6bo4bo36bo298bo7bobbo43bo3bo126boo44bo5b o7bo6b3o99boo20bo23boobboob3o110bo3bo38b4o$38b4o69boo288bobo5bo41bo 298b12oboo40bo114boo13booboo42b6o116b4o18boo28bobo112bo$110booboo273bo 12bo8bo3bo23b4o313boobboob3o41bobbo109b4o13b4o163booboo49bo114bo$111b 4o257boo13bobbo21bo25bo3bo317bobo155booboo14boo165boo15boo24boo125boo 53boo3b3o$51boo13bo45boo256booboo11bo3bo47bo322bo48bo6boo13bo86boo199b ooboo21booboo167boo9boobbo3bo5bo$51boo4bo7bo47bo5b3o248bobbo12bo3bo5b oo41bobbo308boo55bobbo5boo13bobo286b4o22b4o33boo5boo3bo74boo3boobo36b oobbo11bo5bo3bo$40b3o13b3o6b3o43bo3bo3boobo247bobbo12bo3bo5bobo22bobbo 325booboo52bo9boo4bo8boo153b4o131boo24boo33boob4o5bobbo71boob3ob3o36bo bb3o10bo9b3o$40bo18bo50bo5bo5bo53boo193boo9boo3bobo6bo23bo28boo231bobb o65b4o52bo6boobo4b3o106boo14bo23bobbo12bo3bo138boo52b5o9bo72b7o38bo4bo 10bo5bo$40bobo3boo7b5o50bo5bo3b3o52b4o203boo4bo31bo3bo7bo15boo22b4o 205bo70boo53boo4b5o6boo104bobbo11boo23bo16bo141b4o24boo26b3o10bo73b4o 41b5o11boobo36bo$41boo7bo20bo38b6obo3bo52booboo121boo118b4o4bo3b3o15bo 5bobbo12bo3bo204bo3bo48boo73bo4b3o3boo15bo11bo71boo13b3o7boo22bo3bo13b obbo136booboo24bobo33boobo89b4o29boo27bo22bo3bo$70bo48bo38boo15boo107b oo13booboo65bobbo53boo5boo20bo16bo191b4o13b4o48b4o24boo48boo24bobo7bo 3bo68boo5bo8bobbo30b4o155boo5boob3o15bo37bo90bo3bo56bo22bo$70b3o6b5o 73booboo121b4o13b4o64bo57b3o6bo8bo10bo3bo13bobbo187bo3bo63booboo24bobo 73boo7bo52b4o18boo4bo3bo3booboo52b3o140bo5boo41b4o98bo8b6o14bobbo5boo 21b3o20bo4bo$39bobbo5boo29bo4bo73b4o120booboo14boo65bo3bo53boo5boo9boo 9b4o205bo68boo5boob3o15bo84bo4bo31bobbo12bo3bo18bo3bo4bo20bo181boo7bo 8bo31bo3bo98bobbo4bo5bo12bo8b4o43b5o$38bo8b4o28bo36bobbo19bo19boo122b oo83b4o13b4o31b4o4bo3b3o9boo77boo140bobbo70bo5boo58b4o5boo30b5o9bo21bo 16bo29bo20boo24boo14bobbo139bo5boo8bobo30bo110bo18bo3bo3booboo$38bo3bo 3booboo25bo3bo3bo30bo22bo246bo3bo24bobbobbo3bo7bo74boo13booboo163bo47b oo7bo8bo48bo3bo3booboo4boo18bo17bobo19bo3bo13bobbo47boo7boo12bo18bobo 133boo5boob3o12bo30bobbo107bo4bo12b4o5boo5boo$38b4o5boo5boo19bo7bo31bo 3bo18b3o25bo3bo13bobo101bo21bo74bo19boo6bo6bo49boo3b3o28b4o13b4o142boo 19bobo46bo5boo8bobo47bo8b4o3b4o17bobo15boo20b4o34boo37boob3o7boo4boo 20bo113bobbo5boo3booboo19bo145boo29booboo8bo$53booboo12bo4b3o20b4o13b 4o42b3o5boo13boo104bo17boo76bobbo14booboo4bo3bo3bobbo22b3o9boo9boobbo 3bo5bo20booboo14boo141b5o18boo41boo5boob3o12bo47bobbo5boo3booboo17boo 75b4o4b4o29b5o7bo6boo18bo113bo8b4o3b4o37boo158b4o3bo4bobo$54b4o3bo8bo 12boo13bo3bo57b3obo9boo9bo100boobbo3bo14boo94b4o4b4o22boo5b5o6boobbo 11bo5bo3bo22boo158bo4bobb3obo39bobbo5boo3booboo19bo64boo5boob3o84boob oo4bo3bo3bobbo18bo3b3o8bo7boo17b3o111bo3bo3booboo4boo37boob4obo153boo 3bo5bobbo$55boo3bobobboo31bo60boo8bo6bo108bo5bob3obbo107boo30boo5boob 3o6bobb3o10bo9b3o42bo137bobb3o3bo3boo36bo8b4o3b4o90bo5boo60boo13bo8boo 6bo6bo20boo16bobbo3bo132b4o5boo23boo5b5o11b5obboo156bobbo6bo$59bo3boo bbo6boo23bobbo57bob8o3bo3bo106boobbobobb5obo140bo5boo9bo4bo10bo5bo47b 3o136boobbo7bobo14bo21bo3bo3booboo4boo90boo7bo59boo4bo7bo18bobbobbo3bo 11boo4boo5bo11bo171bobo4bo4bo11b3o3bo153boo3bo5bobbo$55boo3bobobboo52b 3o39b4o7bo3bo12bobo93boo3bo5booboo14bo97bo44b5o11boobo33bo11bo3boobo 137boo7boobo14bobo10bo8b4o5boo23boo5b5o64bo5boo49b3o13b3o6b3o22b4o11bo 14bo40bo5b5o131bo6bo175b4o3bo4bobo$54b4o3bo8bo32bo10bobobo3bo40bo8bo 16boo9b3o83b3o7bobbo13boo93b3o3bo45boo27bo19b4o10bo6bo147boo15boo9bo3b o40bobo4bo4bo57boo5boob3o50bo18bo36b3obboo7bo8bo7bobbo5boo22bo6bo4bo 101bobo34bo3bo26bo142booboo8bo$53booboo12bo30b3o10bo7bo67bo8b5o110boo 91b3obo3bo18boo52bo7b5o7bob5o14bo6bo141bo26bo45bo6bo47boo12booboo59bob o3boo7b5o36b3obboo8bo14bo8b4o21b3o4bo105bo3boo34bo12b4o11boo143boo$54b oo44bo3bo15boo5bo39bobbo27boob3o93boo25boo80boo6bo18boo21bobbo5boo21b 3o5bo4bo5boo6bo18boo169bo4bo11bobo34bo3bo42b3o12b4o60boo7bo20bo24b3obb oo7bo15bo3bo3booboo29bo3bo98boobob3o8bo10boo26bo3bo10boo$100bo4b3o19bo bo28boo6bo32boo83boo37boob3o78bob5o14bo6bo19bo8b4o28bo11b3obo3bo18boo 127b4o5boo25bo4b5o11bo3boo34bo43boboo13boo28bo61bo19b4o11bo20b4o5boo5b oo26bo100bo4b3o19bobo25bo16bo$100boobob3o8bo10boo28booboo4bo3bo23bobo 86b4o4b4o25bo3b5o79b4o10bo6bo25bo3bo3booboo29bo3bo7b3o3bo148bo3bo3boob oo4boo17bobo16boobob3o8bo10boo28b4o25b3o32boo10bobo59b3o6b5o6bo3bo11b oo33booboo8bo116bo3bo15boo5bo28bobbo173boo$72boo28bo3boo34bo15b4o4b4o 3b4o17boo86booboo4bo3bo3bobbo15boo5b3o82bo11bo3boobo25b4o5boo5boo21bo 4bo14bo149bo8b4o3b4o16boo17bo4b3o19bobo11bobbo12bo3bo25bo32b4o9boo29bo bbo5boo29bo4bo5bo51b4o3bo4bobo9boo104b3o10bo7bo15bobbo190booboo$60boo 9booboo27bobo34bo3bo14boo12bo3bo10bo6bo5bo81boo6bo6bo20boo105b3o41boob oo8bo9bo47bo5boo116bobbo5boo3booboo11bo23bo3bo15boo5bo12bo16bo61booboo 39bo8b4o28bo11bobbo48boo3bo5bobbo7bo108bo10bobobo3bo14bo195b4o$58bo4bo 8b4o56bo6bo33bo7boo4bobo10boo90bobbobbo3bo7bo116bo43b4o3bo4bobo7b3o11b oo30boo5boob3o128boo5bobbo3boboo22b3o10bo7bo17bo3bo13bobbo58boo41bo3bo 3booboo25bo3bo3bo24bobbo34bobbo6bo8boo122b3o15bo3bo11boo179boo7boo$57b o15boo57bobo4bo4bo29bobbobb4o3bobboo8boo96b4o4bo3b3o92boo65boo3bo5bobb o19b4o4b4o22boo5b5o134bo3bo4b5o22bo10bobobo3bo17b4o87bobo29b4o5boo5boo 19bo6bo25bo34boo3bo5bobbo112bobbo34b4o11bo182bo7boo$49bobbo4bo5bo10bo 23b4o5boo23boo5b5o35boo3bo5boboo110boo5boo12bo78booboo14boo51bobbo6bo 18booboo4bo3bo3bobbo22b3o134boo4bo4bobbo38b3o109bobbo43booboo8bo8b3o 30bo3bo29b4o3bo4bobo14bo97bo44b3obboo7bo175bo3bo8bo$48bo8b6o9bo3bo21bo 3bo3booboo4boo57bobbobb4o3bobboo112b3o6bo9boo80b4o13b4o46boo3bo5bobbo 19boo6bo6bo164bo3bo4b5o18bobbo121boo53b4o3bo4bobo39b4o29booboo8bo15bo 98bo3bo40b3obboo8bo173bo5bo7b3o$48bo3bo18bo5boboo17bo8b4o3b4o55bo7boo 4bobo114boo5boo11boo80boo13booboo45b4o3bo4bobo29bobbobbo3bo7bo146boo5b obbo3boboo19bo54boo13bo50b8o8bo44boo3bo5bobbo49bo22boo26b3o96b4o13b4o 24b3obboo7bo3boo169bo5bo7bo$48b4o19bo5boo20bobbo5boo3booboo11bo7bo35bo 3bo10bo109b4o4bo3b3o109boo46booboo8bo37b4o4bo3b3o9boo132booboo11bo21bo 3bo50boo4bo7bo51bo6bo6boo49bobbo6bo47boobo165bo3bo17b4o11bo7boo170b6o$ 34b4o33b6o37boo5bobbo3boboo5bobo33b4o121bo3bo7bo160boo54boo5boo9boo 102bo30b4o26bo6b4o13b4o23b3o13b3o6b3o49bo60boo3bo5bobbo39b3o10bo163bo 15bobbobbo3bo11boo7bo$33b7o4boo74bo3bo4b5o3boo159bo228b3o6bo8bo104bo 30boo27bobo21bo3bo22bo18bo58bo4bo53b4o3bo4bobo39b5o9bo37boo125bobbobb oo6bo6bo$32boob3oboobbobo73boo4bo4bobbo165bobbo224boo5boo112b3o48boo9b oo22bo26bobo3boo7b5o60boo54booboo8bo40boob4o5bobbo36booboo128booboo4bo 3bo3bobbo22b3o$33boo3boobbobboo73bo3bo4b5o57b4o122bobbo168boo30b4o4bo 3b3o15bo146b4o33bobbo23boo7bo20bo60bo44boo52boo5boo3bo39b4o129b4o4b4o 22boo5b5o$42bobbo68boo5bobbo3boboo59bo3bo120bo171booboo28bo3bo7bo15boo 146booboo89bo58b4o76bo74boo7boo122boo30boo5boob3o$36boo4bobo68booboo 11bo61bo124bo3bo168b4o28bo28boo146boo91b3o6b5o45boo77bo76bo7boo156bo5b oo$34bo8bo70b4o74bo123b4o170boo30bobbo182bo51bobbo5boo29bo4bo42bo67boo 11b3o40bo31bo3bo8bo127bo$33bo21bo59boo77boo295bo48bobbo163bobo49bo8b4o 28bo47b4o63booboo46boo4bo30bo5bo7b3o120b3o3bo$33bo3bo18boo75boo63b3o 121booboo162bo3bobboo41bo106bobo53boobboob3o47bo3bo3booboo25bo3bo3bo 41bo10bo57b4o45booboobboo29bo5bo7bo121b3obo3bo18boo$33b4o18boo75b4o11b o43boo3boo3bo115b3o5boo161bo5boboo41bo3bo103boo48b12oboo47b4o5boo5boo 19bo6bo42b3obbo4b3o58boo47b4ob3o29b6o129boo6bo18boo$17boo87bo24booboo 11bobo40boob3obobbo115b5o6bo160bo5b4o41b4o104bo49bo7bobbo65booboo17b3o 48b3o5boo61bo48b4o3boboo161bob5o14bo6bo$16b4o85bo26boo13boo42b9o115boo b4o3boo161b6o58bo144bo6boo3boo64b4o3bo5b3o57bo6bo60bo3bo50bob5o162b4o 10bo6bo$15booboo11bo73b3o35bobo46b4o120boo5bobbo225bo90bo54bo77boo3bob oo3b3obbo55b3obobo59bo5boboo45booboo167bo11bo3boobo$16boo5bobbo3boboo 109bobbo176bobo214b3o3bo94bobo56boo78bo3bo6bobo8bo46bobboo61bo5boo49bo 185b3o$22bo3bo4b5o100boo68boo331b5obbo7bo87boo132boo3boboo3b3obbo7bo 48boo3bo59b6o47booboo186bo$21boo4bo4bobbo95b8o8bo57b7o124bo165b4obboo 28boob4obo7bo220b4o3bo5b3o10b3o47b4o112b5o165boo$22bo3bo4b5o7boo86bo6b o6boo57boob4obo117boo4bo165bo3boo31boo233booboo187boob3o164booboo14boo $16boo5bobbo3boboo11bo85bo73boo3bo118booboobboo164bo5bobbo263boo76b4o 110boo168b4o13b4o$bobbo5boo3booboo11bo5boo4boo87bo4bo192b4ob3o165bo10b o51bo285boo3bo71b4obboo201boo13booboo$o8b4o3b4o17bobo94boo74boo4boo 113b4o3bo166bobbo5bo49boo171boo112bobboo73bo3boo180b4o35boo$o3bo3boob oo4boo18bo108bo3boo57b3o123boboo168boo4bo51boo169booboo52boo56b3obobob o69bo5bobbo176bo3bo$4o5boo30b5o99bo6bo57boo122booboo167bo230b4o51boob oo53bo6bobo8boo60bo7bo140bo35bo$41bo4bo98bo190bo167bo4bo228boo53b4o52b 3o5boo8boob3o59bobbo3bo139bobo34bobbo$32boo7bo103b5oboo53boo124booboo 166bo290boo52b3obbo4b4o6b5o61boobbo140boo87boo$6boo24bobo7bo3bo104boo 52boob3o120b5o167bo4bo28bobo255bo5b3o45bo12bo6b3o61bo130bo103boo$4bo4b 3o3boo15bo11bo105bobo53b5o119boob3o167b5o30boo253bo3bo3boobo45b4o4b3o 70bo4bo40boo84bo$bboo4b5o6boo129bobbo53b3o121boo205bo253bo5bo5bo45bo6b oobobobo65bo45boob4o62bo17b3o$bbo6boobo4b3o130bobo639bo5bo3b3o47boo3bo 4bobo6bo58bo4bo41b6o61bo$bbo9boo4bo8boo763b6obo3bo13bo34b4obo4boobo6bo 57b5o43b4o64bo$3bobbo5boo13bobo116b5o650bo14bo38b4o4boo6boo$5bo6boo13b o118bo4bo664b3o39bo5bo6bo172bo118boo$146bo56boo118boo118boo118boo118b oo357b3o4bo112bobbo3bo$bobbo142bo3bo50bobbo116bobbo112boobbobbo112boo bbobbo112boobbobbo362bobo112boo3bobo$o148bo52bobbo116bobbo112boobbobbo 112boobbobbo112boobbobbo113boo118boo118boo6bobbo108boo6bobbo$o3bo198b oo118boo118boo118boo118boo114bobo117bobo117bobo6boo109bobo6boo$4o13b4o 775boobobo114boobobo114boobobo114boobobo10bo$17bo3bo178boo118boo118boo 118boo118boo114booboboo113booboboo113booboboo113booboboo9bo$17bo182bo bbo116bobbo116bobbo116bobbo116bobbo116bobbo116bo3bobbo112bo3bobbo112bo 3bobbo4bo$18bobbo179b3o117b3o117b3o117b3o117b3o117b3o117b7o113b7o113b 7o$$18bobbo179b3o117b3o117b3o117b3o117b3o117b3o117b7o113b7o113b7o$17bo 182bobbo116bobbo116bobbo116bobbo116bobbo116bobbo116bo3bobbo112bo3bobbo 112bo3bobbo$17bo3bo178boo118boo118boo118boo114booboboo113booboboo113b ooboboo113booboboo113booboboo$4o13b4o655boobobo114boobobo114boobobo 114boobobo114boobobo$o3bo198boo118boo118boo118boo114bobo117bobo117bobo 117bobo6boo109bobo6boo$o148bo52bobbo112boobbobbo112boobbobbo112boobbo bbo113boo118boo118boo118boo6bobbo108boo6bobbo$bobbo142bo3bo50bobbo112b oobbobbo112boobbobbo112boobbobbo482bobo112boo3bobo$146bo56boo118boo 118boo118boo477b3o4bo112bobbo3bo$5bo6boo13bo118bo4bo664b3o39bo5bo6bo 172bo118boo$3bobbo5boo13bobo116b5o650bo14bo38b4o4boo6boo$bbo9boo4bo8b oo763b6obo3bo13bo34b4obo4boobo6bo57b5o43b4o64bo$bbo6boobo4b3o130bobo 639bo5bo3b3o47boo3bo4bobo6bo58bo4bo41b6o61bo18boo$bboo4b5o6boo129bobbo 89boo50b3o236boo256bo5bo5bo45bo6boobobobo65bo45boob4o62bo17bobo$4bo4b 3o3boo15bo11bo105bobo89boob3o46b5o56b4o176boo111boo143bo3bo3boobo45b4o 4b3o70bo4bo40boo84bo$6boo24bobo7bo3bo104boo90b5o45boob3o40bobbo12bo3bo 174bo112boob3o142bo5b3o45bo12bo6b3o61bo234boo$32boo7bo103b5oboo91boob oo45boo42bo16bo292b5o141boo52b3obbo4b4o6b5o61boobbo229boo$41bo4bo98bo 102bo89bo3bo13bobbo179boo52bobbo52booboo139b4o52b3o5boo8boob3o59bobbo 3bo166bobbo$4o5boo30b5o99bo6bo93booboo47boo38b4o196bobo51bo60bo138boob oo53bo6bobo8boo60bo7bo166bo$o3bo3booboo4boo18bo108bo3boo95boboo46b3o 64bo175bo51bo3bo54booboo137boo56b3obobobo69bo5bobbo166bo3bo20bobbo$o8b 4o3b4o17bobo94boo107b4o3bo47boo4boo57bo228b4o56bob5o192bobboo73bo3boo 170b4o20bo$bobbo5boo3booboo11bo5boo4boo87bo4bo104b4ob3o113b3o282b4o3bo boo27boo164boo3bo71b4obboo147boo43bo3bo$16boo5bobbo3boboo11bo85bo109b ooboobboo43boo3bo43boo4bo298b4ob3o29bo4bo85boo76b4o110boo115bobo25b4o 13b4o$22bo3bo4b5o7boo86bo6bo6boo95boo4bo43boob4obo39booboo3b4o294boob oobboo28bo90booboo187boob3o112bo27bo3bo$21boo4bo4bobbo95b8o8bo100bo44b 7o40bobbo4b5o16bo171bo105boo4bo29bo6bo6boo76b4o3bo5b3o10b3o47b4o112b5o 140bo22boo$22bo3bo4b5o100boo156boo44bobbo9bo14bo172boo35boo73bo29b8o8b o76boo3boboo3b3obbo7bo48boo3bo59b6o47booboo140bobbo20bo$16boo5bobbo3bo boo109bobbo88bobo103boo8boo15b3o169bobo34boo109boo90bo3bo6bobo8bo46bo bboo61bo5boo49bo164bo$15booboo11bo73b3o35bobo82boo5bobbo41b4o67bo227bo 76boo37bobbo77boo3boboo3b3obbo55b3obobo59bo5boboo45booboo162boo$16b4o 85bo26boo13boo78boob4o3boo40b9o91b5o169boo5boo3bo67boo20boo38bobo77b4o 3bo5b3o57bo6bo60bo3bo50bob5o137boo3boo$17boo87bo24booboo11bobo78b5o6bo 38boob3obobbo50bobbo5boo24bo4bo4bo167boob4o5bobbo64boob4obo16bo26boo 88booboo17b3o48b3o5boo61bo48b4o3boboo136bobo6bo$33b4o18boo75b4o11bo81b 3o5boo40boo3boo3bo9bo38bo8b4o22bo5bo173b5o9bo65b5obboo41booboo71b4o5b oo5boo19bo6bo42b3obbo4b3o58boo47b4ob3o29b6o105bo6bobbo17bo$33bo3bo18b oo75boo99booboo47b3o9boo38bo3bo3booboo22b3o4bo3bo169b3o10bo66b3o3bo43b 4o9boo60bo3bo3booboo25bo3bo3bo41bo10bo57b4o45booboobboo29bo5bo7bo96b3o 7boo16bobo$33bo21bo59boo165boo14bobo18boo17b4o5boo5boo26bo179boobo119b oo10bobo59bo8b4o28bo47b4o63booboo46boo4bo30bo5bo7b3o103boo17boo12bo$ 34bo8bo70b4o110b4o48bo22boo13booboo30booboo206bo102boo28bo62bobbo5boo 29bo4bo42bo67boo11b3o40bo31bo3bo8bo136bo3bo$36boo4bobo68booboo11bo98bo 3bo46bo22b4o13b4o31b4o3bo5b3o183b4o76b4o29b4o121b3o6b5o45boo77bo76bo7b oo137bo$42bobbo68boo5bobbo3boboo96bo50bo3bo17booboo14boo33boo3boboo3b 3obbo180bo3bo75bo3bo27booboo121bo58b4o76bo74boo7boo131bo5bo4bo$33boo3b oobbobboo73bo3bo4b5o95bobbo46b4o19boo55bo3bo6bobo180bo79bo32boo5boob3o 56bobbo23boo7bo20bo60bo44boo52boo5boo3bo39b4o90boo12b4o5boo24bobo3b5o$ 32boob3oboobbobo73boo4bo4bobbo77bobbo109bo30boo3boboo3b3obbo181bobbo 76bobbo34bo5boo54bo26bobo3boo7b5o60boo54booboo8bo40boob4o5bobbo36boob oo74boo13booboo10bo3bo3booboo4boo16boo$33b7o4boo74bo3bo4b5o3boo71bo 112b3o28b4o3bo5b3o166bobbo76bobbo51boo7bo53bo3bo22bo18bo58bo4bo53b4o3b o4bobo39b5o9bo37boo75b4o13b4o10bo8b4o3b4o$34b4o33b6o37boo5bobbo3boboo 5bobo70bo3bo11boo33b4o42bo11bo3boobo26booboo26bo150bo79bo56bo5boo37b4o 13b4o23b3o13b3o6b3o49bo60boo3bo5bobbo39b3o10bo113booboo14boo12bobbo5b oo3booboo11bo$48b4o19bo5boo20bobbo5boo3booboo11bo7bo72b4o11bo35bo3bo 39b4o10bo6bo27boo27bo151bo3bo11boo10boo50bo3bo7bo38boo5boob3o38bo3bo 50boo4bo7bo51bo6bo6boo49bobbo6bo47boobo116boo45boo5bobbo3boboo6bo$48bo 3bo18bo5boboo17bo8b4o3b4o98b3obboo7bo30bo7bo34bob5o14bo6bo50b3o149b4o 11bo11boo51b4o4bo3b3o21bobbo5boo3booboo17boo28bo54boo13bo50b8o8bo44boo 3bo5bobbo49bo22boo26b3o117bo3bo4b5o4bobo$48bo8b6o9bo3bo21bo3bo3booboo 4boo99b3obboo8bo3boo25bobbobb7o28boo6bo18boo209b3obboo7bo8bo56boo5boo 11boo7bo8b4o3b4o17bobo28bobbo121boo53b4o3bo4bobo39b4o29booboo8bo15bo 118boo4bo4bobbo4boo$49bobbo4bo5bo10bo23b4o5boo23boo5b5o72b3obboo7bo3b oo31boob3obbo28b3obo3bo18boo39boo167b3obboo8bo64b3o6bo9boo8bo3bo3boob oo4boo18bo50b3o109bobbo43booboo8bo8b3o30bo3bo29b4o3bo4bobo14bo79boo4bo 32bo3bo4b5o$57bo15boo57bobo4bo4bo65b4o11bo10bo25bobbobb7o30b3o3bo59boo boo165b3obboo7bo65boo5boo12bo7b4o5boo30b5o26bo10bobobo3bo17b4o87bobo 29b4o5boo5boo19bo6bo25bo34boo3bo5bobbo82boo9boo3b3o7bo17boo5bobbo3bob oo$58bo4bo8b4o56bo6bo64bobbobbo3bo11boo33bo7bo14bo25bo61b4o159b4o11bo 7boo55b4o4bo3b3o61bo4bo23b3o10bo7bo17bo3bo13bobbo58boo41bo3bo3booboo 25bo3bo3bo24bobbo34bobbo6bo8boo71bobbo12booboo4boo17booboo11bo$60boo9b ooboo27bobo34bo3bo50boo6bo6bo36boo12bo3bo17boo6boo44bo5boo28boo154bobb obbo3bo11boo4boo50bobbobbo3bo7bo54boo7bo27bo3bo15boo5bo12bo16bo61boob oo39bo8b4o28bo11bobbo48boo3bo5bobbo7bo72boobbo11b3ob3o4boo17b4o$72boo 28bo3boo34bo51booboo4bo3bo3bobbo15boo5b3o6b4o4b4o3b4o18bobo17boo30boo 5boob3o26bo5b3o137boo6bo6bo23bo40boo6bo6bo20boo18boo24bobo7bo3bo22bo4b 3o19bobo11bobbo12bo3bo25bo32b4o9boo29bobbo5boo29bo4bo5bo51b4o3bo4bobo 9boo71boobbo11boob3o24boo$100boobob3o8bo10boo66b4o4b4o22boo5b5o4booboo 4bo3bo43b4o4b4o22boo5b5o24bo3bo3boobo135booboo4bo3bo3bobbo22b3o34boob oo4bo3bo3bobbo15boo5b3o9bo4b3o3boo15bo11bo24boobob3o8bo10boo28b4o25b3o 32boo10bobo59b3o6b5o6bo3bo11boo33booboo8bo85b4o12bobo44boo$100bo4b3o 19bobo66boo33bo3boob3o5boo6bo32boo12booboo4bo3bo3bobbo22b3o24bo5bo5bo 136b4o4b4o29b5o34b4o4b4o25bo3b5o6boo4b5o6boo50bo3boo34bo43boboo13boo 28bo61bo19b4o11bo20b4o5boo5boo26bo100bo30b4o$54boo44bo3bo15boo5bo108b oo17bobbo20bo6boob3o10boo6bo6bo53bo5bo3b3o137boo30boo5boob3o35boo37boo b3o6bo6boobo4b3o52bobo34bo3bo42b3o12b4o60boo7bo20bo24b3obboo7bo15bo3bo 3booboo29bo3bo96boo7boo21booboo$53booboo12bo30b3o10bo7bo155boo7b5o19bo bbobbo3bo7bo41b6obo3bo169boo7boo51boo25boo9bo9boo4bo8boo72bo6bo47boo 12booboo59bobo3boo7b5o36b3obboo8bo14bo8b4o21b3o4bo70boo30boo5boob3o19b oo$54b4o3bo8bo32bo10bobobo3bo75bo7b3o16boo51bobo7b3o26b4o4bo3b3o9boo 37bo173bo76boo20bobbo5boo13bobo71bobo4bo4bo57boo5boob3o50bo18bo36b3obb oo7bo8bo7bobbo5boo22bo6bo4bo64b4o4b4o29b5o29bo$55boo3bobobboo52b3o75b oo9bo15boo23boo13b3o56boo5boo9boo180b4o12bobo61b3o7bobbo13boo23bo6boo 13bo39b4o5boo23boo5b5o64bo5boo49b3o13b3o6b3o22b4o11bo14bo40bo5b5o64boo boo4bo3bo3bobbo22b3o29bobo$59bo3boobbo6boo23bobbo93boobo6b3o17bo21bobo 13b4o55b3o6bo8bo44boo134boobbo11boob3o58boo3bo5booboo14bo84bo3bo3boob oo4boo90boo7bo59boo4bo7bo18bobbobbo3bo11boo4boo5bo11bo105boo6bo6bo23bo 29boobboob3o$55boo3bobobboo31bo98bobo3b3o41boobo12bo3bo6bo48boo5boo53b ooboo131boobbo11b3ob3o4boo51boobbobobb5obo34bobbo62bo8b4o3b4o90bo5boo 60boo13bo8boo6bo6bo20boo16bobbo3bo109bobbobbo3bo7bo9boo25b12oboo$54b4o 3bo8bo12boo13bo3bo95boo48boo14b3o6boo42b4o4bo3b3o15bo38b4o132bobbo12b ooboo4boo53bo5bob3obbo34bo67bobbo5boo3booboo19bo64boo5boob3o84booboo4b o3bo3bobbo18bo3b3o8bo7boo17b3o94b4o4bo3b3o8boo24bo7bobbo$53booboo12bo 4b3o20b4o13b4o101boo27bo9boo3b3o6bobo41bo3bo7bo15boo40boo134boo9boo3b 3o7bo53boobbo3bo14boo22bo3bo78boo5boob3o12bo47bobbo5boo3booboo17boo75b 4o4b4o29b5o7bo6boo18bo74bobbo24boo5boo34bo6boo3boo$38b4o5boo5boo19bo7b o31bo3bo18b3o78boo38boo56bo28boo40bo145boo4bo66bo17boo23b4o13b4o68bo5b oo8bobo47bo8b4o3b4o17bobo15boo20b4o34boo37boob3o7boo4boo20bo72bo28b3o 6bo34bo$38bo3bo3booboo25bo3bo3bo30bo22bo81bo97bobbo64bo3bo214bo21bo39b o3bo66boo7bo8bo48bo3bo3booboo4boo18bo17bobo19bo3bo13bobbo47boo7boo12bo 18bobo77bo3bo24boo5boo37boo11boo$38bo8b4o28bo36bobbo19bo55boo22bo27boo 87bobbo45bo5boboo272bo71bo5boo58b4o5boo30b5o9bo21bo16bo29bo20boo24boo 14bobbo60b4o13b4o19b4o4bo3b3o49b4o$39bobbo5boo29bo4bo109booboo14boo31b 4o85bo49bo5boo127boo78boo66bobbo61boo5boob3o15bo84bo4bo31bobbo12bo3bo 18bo3bo4bo20bo103bo3bo35bo3bo7bo50booboo$70b3o6b5o111b4o13b4o29booboo 85bo3bo45b6o128booboo14boo59booboo14boo112booboo24bobo73boo7bo52b4o18b oo4bo3bo3booboo52b3o61bo39bo63boo$70bo48bo76boo13booboo30boo15boo38b4o 28b4o181b4o13b4o59b4o13b4o112b4o24boo48boo24bobo7bo3bo68boo5bo8bobbo 30b4o83bobbo36bobbo184b4o$41boo7bo20bo38b6obo3bo90boo48booboo20bobbo 12bo3bo40bo172boo13booboo60boo13booboo113boo73bo4b3o3boo15bo11bo71boo 13b3o7boo22bo3bo13bobbo123bobbo165b6o$40bobo3boo7b5o50bo5bo3b3o140b4o 19bo16bo44bo188boo78boo133boo53boo4b5o6boo104bobbo11boo23bo16bo82boo4b o37bo49boo110boo5boob4o$40bo18bo50bo5bo5bo141boo20bo3bo13bobbo28b3o3bo 408b4o52bo6boobo4b3o106boo14bo23bobbo12bo3bo67boo9boo3bobo6bo29bo3bo 40b8obo106b4o5boo$40b3o13b3o6b3o43bo3bo3boobo163b4o45b5obbo7bo399boob oo52bo9boo4bo8boo153b4o67bobbo12bo3bo5bobo27b4o41bo8bo105booboo$51boo 4bo7bo47bo5b3o212boob4obo7bo400boo55bobbo5boo13bobo223bobbo12bo3bo5boo 41bo31bo6bo108boo$51boo13bo45boo221boo424bo48bo6boo13bo86boo137booboo 11bo3bo48bo32bo$111b4o186boo3b3o451bobo155booboo14boo45boo74boo13bobbo 21bo14b3o3bo40boo95b6o$110booboo175boo9boobbo3bo5bo34bobbo8bo392boobb oob3o41bobbo109b4o13b4o42bo4bo88bo12bo8bo3bo11b5obbo7bo129bo5b4o$38b4o 69boo175boobbo11bo5bo3bo34bo10boo388b12oboo40bo114boo13booboo41bo21boo 84bobo5bo15boob4obo7bo129bo5boboo14boo$38bo3bo13bobbo63b3o162bobb3o10b o9b3o32bo3bo7boo387bo7bobbo43bo3bo126boo43bo6bo6boo6bobo83boo6bo4bo11b oo144bo3bobboo13bobo$38bo16bo67bo164bo4bo10bo5bo38b4o397bo6boo3boo41b 4o13b4o155b8o8bo5bo52b4o5boo30b5o160bo18boo$39bobbo12bo3bo33boo29bo 164b5o11boobo442bo70bo3bo159boo68bo3bo3booboo4boo54bobbo128boo17b3o$ 55b4o33booboo12bo181boo27bo34booboo393boo67bo170bobbo59bo8b4o3b4o18bo 33bo131b4o17boo$93b4o3bo8bo209bo7b5o18b3o5boo405b4o54bobbo166bobo61bo bbo5boo3booboo9bo8bobo31bo3bo126booboo$94boo3bobobboo181bobbo5boo21b3o 5bo4bo16b5o6bo404bo3bo212boo88boo11bo8boo32b4o128boo$98bo3boobbo6boo 171bo8b4o28bo20boob4o3boo405bo52boo161booboo92bobo4boobbo$94boo3bobobb oo180bo3bo3booboo29bo3bo16boo5bobbo406bo8bo40bo165b4o91boobbo7bo44boob oo103b4o$93b4o3bo8bo176b4o5boo5boo21bo4bo25bobo409boo4bobo38bo6boo3boo 154boo39boo52bobo4boobbo39b3o5boo103bo3bo9bo$92booboo12bo191booboo12bo 5bo449bobbo37bo7bobbo138boo57bobo45boo11bo42b5o6bo102bo11boo22b5o$77b 4o5boo5boo18b3o5bo180b4o3bo8bo5b3o438boo3boobbobboo36b12oboo134b4o56bo 46booboo9bo41boob4o3boo104bobbobboo5b3o19bo4bo$77bo3bo3booboo23bo5bo3b o179boo3bobobboo46bo402boob3oboobbobo42boobboob3o133booboo11bo92b4o52b oo5bobbo109b3o6b3o18bo$77bo8b4o24bo3bo188bo3boobbo6boo37boo402b7o4boo 47bobo136boo5bobbo3boboo91boo60bobo105bobbobboo5b3o7bo12bo3bo$78bobbo 5boo29bo4bo179boo3bobobboo15bo29bobo403b4o56bo143bo3bo4b5o81boo24boo 11bo137bo11boo9boo14bo$118b5o179b4o3bo8bo10bo486boo151boo4bo4bobbo4boo 74b4o22b4o10bobo121boo12bo3bo9bo8bobo$82bo9boo14b3o190booboo12bo10b3o 483booboo10boo138bo3bo4b5o4bobo72booboo21booboo10boo121b4o4b4o3b4o$80b 3o8b5o12bo193boo512b4o10bobo131boo5bobbo3boboo6bo58boo15boo24boo134boo boo4bo3bo$79bo3bo5bo4boo13bo210bobbo493boo11bo118bobbo5boo3booboo11bo 66booboo176boo6bo25bo6boo$79bo4b5o5boo223bo479boo147bo8b4o3b4o79b4o47b o137bobbo20boo5boob3o$79boobob4o4boo225bo3bo474b4o146bo3bo3booboo4boo 16boo63boo44b6o132bo27bobo5b5o$81bo3boob3o12b3o213b4o474booboo9bo136b 4o5boo24bobo3b5o74bo20b8o3bo133bo34b3o32bobbo$82bobo18bo694boo11bo171b o5bo4bo67boo3b3o19bo8boo130boobbo11bo56bo$104bo699bobo4boobbo173bo60b 3o9b3ob5o18bo6b3o130bo5bo9bo10bo46bo3bo$320b3o3bo476boobbo7bo174bo3bo 54boo3bo9b3o8bobo12bo5boo130boobbobo9b3o8boo46b4o$77b4o238b5obboo476bo bo4boobbo143boo17boo12bo55boobbobo9b3o8boo15boo11boo122boo3bo9b3o8bobo $77bo3bo13bobbo219boob4obo471boo11bo8boo128b3o7boo16bobo68bo5bo9bo10bo 27b4o122b3o9b3ob5o$77bo16bo224boo462bobbo5boo3booboo9bo8bobo127bo6bobb o17bo71boobbo11bo36booboo134boo3b3o$78bobbo12bo3bo236bobbo443bo8b4o3b 4o18bo129bobo6bo94bo34b3o12boo142bo$94b4o236bo11boo434bo3bo3booboo4boo 150boo3boo25boo67bo27bobo5b5o22bobo110boo$334bo3bo5bo4bo432b4o5boo30b 5o145boo6bo5boo67bobbo20boo5boob3o22bobbo108b4o69b6o$334b4o5bo471boo6b o4bo144bo6bo6b3o57boo6bo25bo6boo18boo116booboo69bo5bo7bo$343bo5bo465bo bo5bo125bobbo20bo6bo8boo55booboo4bo3bo43b8o8bo107boo15boo54bo5bo7b3o$ 343b6o453bo12bo8bo3bo119bo22boo7b8o3bo55b4o4b4o3b4o37bo6bo6boo124boob oo53bo3bo8bo$786boo13bobbo21bo121bo3bo32b6o57boo12bo3bo10bo7bobo15bo 140b4o55bo7boo$784booboo11bo3bo143b4o13b4o20bo72bo7boo4bobo6boo17bo4bo 135boo55boo7boo$784bobbo12bo3bo5boo153bo3bo93bobbobb4o3bobboo5bo19boo 193b4o$784bobbo12bo3bo5bobo152bo15boo85boo3bo5boboo217booboo$785boo9b oo3bobo6bo155bobbo10booboo78bobbobb4o3bobboo220boo$796boo4bo178b4o9boo 66bo7boo4bobo$982boo10bobo65bo3bo10bo$783bobbo177boo28bo67b4o217boo$ 782bo180b4o315booboo8bo$782bo3bo175booboo113boo201b4o3bo4bobo$782b4o 13b4o160boo5boob3o103booboo11bobo186boo3bo5bobbo9b3o$799bo3bo165bo5boo 103b4o10bobbo190bobbo6bo9bo$799bo168boo7bo103boo11b4o186boo3bo5bobbo 10bo$800bobbo165bo5boo105bo11bo188b4o3bo4bobo$963boo5boob3o104bo3bo 197booboo8bo$948bobbo5boo3booboo17boo93bo5boboo178b4o5boo5boo18b3o5bo$ 947bo8b4o3b4o17bobo92bo5boo180bo3bo3booboo23bo5bo3bo$947bo3bo3booboo4b oo18bo94b6o182bo8b4o24bo3bo$947b4o5boo30b5o275bobbo5boo29bo4bo$988bo4b o101boo211b5o$979boo7bo105booboo173bo9boo14b3o$953boo24bobo7bo3bo101b 4o5boo164b3o8b5o12bo$951bo4b3o3boo15bo11bo104boo5boob4o159bo3bo5bo4boo 13bo$949boo4b5o6boo136b6o159bo4b5o5boo$949bo6boobo4b3o138b4o160boobob 4o4boo$949bo9boo4bo8boo295bo3boob3o12b3o$950bobbo5boo13bobo295bobo18bo $952bo6boo13bo319bo$$948bobbo315b4o$947bo319bo3bo13bobbo$947bo3bo315bo 16bo$947b4o13b4o300bobbo12bo3bo$964bo3bo315b4o$964bo$965bobbo! golly-3.3-src/Patterns/Life/Rakes/weekender-distaff.rle.gz0000644000175000017500000003627413307733370020473 00000000000000#N weekenderdistaff.rle.gz #O Ivan Fomichev #C 2c/7 adjustable-period rake, constructed on May 22, 2014 #C Many but not all periods of the form (16982+224*n)/q are possible. #C http://www.conwaylife.com/forums/viewtopic.php?p=12047#p12047 #C http://conwaylife.com/wiki/Weekender_distaff x = 281, y = 2206, rule = B3/S23 202b3o10b3o6b3o10b3o$224bobo10bobo$202bobo10bobo6b3o10b3o$203bo12bo8b 2o4b2o4b2o$230bo2bo$204b2ob6ob2o10bobo6bobo$227b10o$205bo2bo2bo2bo5b3o 6bo4bo$220bo2bo5bo4bo$206b8o6bo8bo4bo$209b2o9bo$206b2o4b2o7bobo3$196bo 12bo25bo12bo$195b3o10b3o23b3o10b3o$194b5o8b5o21b5o8b5o$194b5o8b5o21b5o 8b5o$195bo6b2o6bo23bo6b2o6bo$196b3o3b2o3b3o25b3o3b2o3b3o$199bobo2bobo 31bobo2bobo$201bo2bo35bo2bo$199bo6bo31bo6bo$200b6o33b6o$200bo4bo33bo4b o5$230bo12bo$229bobo10bobo$228bo3bo8bo3bo$229bo2bo8bo2bo$229bobo4b2o4b obo$230b3o3b2o3b3o$233bo6bo$232bo2b4o2bo$236b2o$233b3o2b3o2$186b3o10b 3o$186bobo10bobo$186b3o10b3o$187b2o4b2o4b2o$192bo2bo$188bobo6bobo$189b 10o$191bo4bo$191bo4bo$191bo4bo31$228bo12bo$227b3o10b3o$227b3o10b3o3$ 230bo3b2o3bo$228bob4o2b4obo$228bob4o2b4obo2$232b6o$231b2o4b2o$231b2o4b 2o7$230b3o10b3o$230bobo10bobo$230b3o10b3o$231b2o4b2o4b2o$236bo2bo$232b obo6bobo$233b10o$235bo4bo$235bo4bo$235bo4bo9$183bo12bo30b3o10b3o$182b 3o10b3o$182b3o10b3o29bobo10bobo$228bo12bo2$185bo3b2o3bo34b2ob6ob2o$ 183bob4o2b4obo$183bob4o2b4obo33bo2bo2bo2bo2$187b6o38b8o$186b2o4b2o40b 2o$186b2o4b2o37b2o4b2o13$163bo12bo$162bobo10bobo$161bo3bo8bo3bo$162bo 2bo8bo2bo$162bobo4b2o4bobo$163b3o3b2o3b3o19bo12bo$166bo6bo22bo12bo$ 165bo2b4o2bo20bobo10bobo$169b2o25bo12bo$166b3o2b3o22bo12bo$197bo3b4o3b o$201b4o$197b4o4b4o2$199bo6bo$200b2o2b2o9$196bo12bo$195bobo10bobo$194b o3bo8bo3bo$195bo2bo8bo2bo$195bobo4b2o4bobo$196b3o3b2o3b3o$199bo6bo$ 198bo2b4o2bo$202b2o$199b3o2b3o3$164bo12bo$164bo12bo$163bobo10bobo$164b o12bo$164bo12bo$165bo3b4o3bo$169b4o$165b4o4b4o2$167bo6bo$168b2o2b2o23b o12bo$196b3o10b3o$195b5o8b5o$195b5o8b5o$196bo6b2o6bo$197b3o3b2o3b3o$ 200bobo2bobo$202bo2bo$200bo6bo$201b6o$201bo4bo4$154b3o10b3o23b3o10b3o 2$154bobo10bobo23bobo10bobo$155bo12bo25bo12bo2$156b2ob6ob2o27b2ob6ob2o 2$157bo2bo2bo2bo29bo2bo2bo2bo2$158b8o31b8o$161b2o37b2o$158b2o4b2o31b2o 4b2o4$160bo12bo$159b3o10b3o$159b3o10b3o3$162bo3b2o3bo$160bob4o2b4obo 23bo12bo$160bob4o2b4obo23bo12bo$196bobo10bobo$164b6o27bo12bo$163b2o4b 2o26bo12bo$163b2o4b2o27bo3b4o3bo$202b4o$198b4o4b4o2$200bo6bo$201b2o2b 2o35$162bo12bo$161b3o10b3o$161b3o10b3o3$164bo3b2o3bo$162bob4o2b4obo$ 162bob4o2b4obo2$166b6o$165b2o4b2o$165b2o4b2o4$193b3o10b3o$193bobo10bob o$193b3o10b3o$194b2o4b2o4b2o$199bo2bo$195bobo6bobo$196b10o$160b3o10b3o 22bo4bo$198bo4bo$160bobo10bobo22bo4bo$161bo12bo2$162b2ob6ob2o2$163bo2b o2bo2bo2$164b8o$167b2o27b3o10b3o$164b2o4b2o23bo3bo8bo3bo2$199bo8bo$ 195bo7b2o7bo$197b3o2bo2bo2b3o$198b2ob2o2b2ob2o3$200b8o$201bob2obo6$ 192b3o10b3o2$192bobo10bobo$148b3o10b3o29bo12bo$148bobo10bobo$148b3o10b 3o30b2ob6ob2o$149b2o4b2o4b2o$154bo2bo37bo2bo2bo2bo$150bobo6bobo$151b 10o35b8o$153bo4bo40b2o$153bo4bo37b2o4b2o$153bo4bo14$129bo12bo$128b3o 10b3o$128b3o10b3o3$131bo3b2o3bo$129bob4o2b4obo19bo12bo$129bob4o2b4obo 18b3o10b3o$160b5o8b5o$133b6o21b5o8b5o$132b2o4b2o21bo6b2o6bo$132b2o4b2o 22b3o3b2o3b3o$165bobo2bobo$167bo2bo$165bo6bo$166b6o$166bo4bo9$161b3o 10b3o$161bobo10bobo$161b3o10b3o$162b2o4b2o4b2o$167bo2bo$163bobo6bobo$ 164b10o$166bo4bo$166bo4bo$166bo4bo8$164b3o10b3o$163bo3bo8bo3bo2$167bo 8bo$163bo7b2o7bo$165b3o2bo2bo2b3o$166b2ob2o2b2ob2o3$168b8o$169bob2obo 6$160b3o10b3o2$160bobo10bobo$116b3o10b3o29bo12bo$116bobo10bobo$116b3o 10b3o30b2ob6ob2o$117b2o4b2o4b2o$122bo2bo37bo2bo2bo2bo$118bobo6bobo$ 119b10o35b8o$121bo4bo40b2o$121bo4bo37b2o4b2o$121bo4bo14$97bo12bo$96b3o 10b3o$96b3o10b3o3$99bo3b2o3bo$97bob4o2b4obo19bo12bo$97bob4o2b4obo18b3o 10b3o$128b5o8b5o$101b6o21b5o8b5o$100b2o4b2o21bo6b2o6bo$100b2o4b2o22b3o 3b2o3b3o$133bobo2bobo$135bo2bo$133bo6bo$134b6o$134bo4bo9$129b3o10b3o$ 129bobo10bobo$129b3o10b3o$130b2o4b2o4b2o$135bo2bo$131bobo6bobo$132b10o $134bo4bo$134bo4bo$134bo4bo8$132b3o10b3o$131bo3bo8bo3bo2$135bo8bo$131b o7b2o7bo$133b3o2bo2bo2b3o$134b2ob2o2b2ob2o3$136b8o$137bob2obo6$128b3o 10b3o2$128bobo10bobo$84b3o10b3o29bo12bo$84bobo10bobo$84b3o10b3o30b2ob 6ob2o$85b2o4b2o4b2o$90bo2bo37bo2bo2bo2bo$86bobo6bobo$87b10o35b8o$89bo 4bo40b2o$89bo4bo37b2o4b2o$89bo4bo14$65bo12bo$64b3o10b3o$64b3o10b3o3$ 67bo3b2o3bo$65bob4o2b4obo19bo12bo$65bob4o2b4obo18b3o10b3o$96b5o8b5o$ 69b6o21b5o8b5o$68b2o4b2o21bo6b2o6bo$68b2o4b2o22b3o3b2o3b3o$101bobo2bob o$103bo2bo$101bo6bo$102b6o$102bo4bo9$97b3o10b3o$97bobo10bobo$97b3o10b 3o$98b2o4b2o4b2o$103bo2bo$99bobo6bobo$100b10o$102bo4bo$102bo4bo$102bo 4bo8$100b3o10b3o$99bo3bo8bo3bo2$103bo8bo$99bo7b2o7bo$101b3o2bo2bo2b3o$ 102b2ob2o2b2ob2o3$104b8o$105bob2obo6$96b3o10b3o2$96bobo10bobo$52b3o10b 3o29bo12bo$52bobo10bobo$52b3o10b3o30b2ob6ob2o$53b2o4b2o4b2o$58bo2bo37b o2bo2bo2bo$54bobo6bobo$55b10o35b8o$57bo4bo40b2o$57bo4bo37b2o4b2o$57bo 4bo14$33bo12bo$32b3o10b3o$32b3o10b3o3$35bo3b2o3bo$33bob4o2b4obo19bo12b o$33bob4o2b4obo18b3o10b3o$64b5o8b5o$37b6o21b5o8b5o$36b2o4b2o21bo6b2o6b o$36b2o4b2o22b3o3b2o3b3o$69bobo2bobo$71bo2bo$69bo6bo$70b6o$70bo4bo9$ 65b3o10b3o$65bobo10bobo$65b3o10b3o$66b2o4b2o4b2o$71bo2bo$67bobo6bobo$ 68b10o$70bo4bo$70bo4bo$70bo4bo8$68b3o10b3o$67bo3bo8bo3bo2$71bo8bo$67bo 7b2o7bo$69b3o2bo2bo2b3o$70b2ob2o2b2ob2o3$72b8o$73bob2obo9$20b3o10b3o$ 20bobo10bobo$20b3o10b3o$21b2o4b2o4b2o$26bo2bo$22bobo6bobo$23b10o$25bo 4bo$25bo4bo$25bo4bo14$bo12bo$3o10b3o$3o10b3o3$3bo3b2o3bo$bob4o2b4obo 19bo12bo$bob4o2b4obo18b3o10b3o$32b5o8b5o$5b6o21b5o8b5o$4b2o4b2o21bo6b 2o6bo$4b2o4b2o22b3o3b2o3b3o$37bobo2bobo$39bo2bo$37bo6bo$38b6o$38bo4bo 7$34bo12bo$33b3o10b3o$32b5o8b5o$32b5o8b5o$33bo6b2o6bo$34b3o3b2o3b3o$ 37bobo2bobo$39bo2bo$37bo6bo$38b6o$38bo4bo11$38bo12bo$37b3o10b3o$36b5o 8b5o$36b5o8b5o$37bo6b2o6bo$38b3o3b2o3b3o$bo12bo26bobo2bobo$3o10b3o27bo 2bo$3o10b3o25bo6bo$42b6o$42bo4bo$3bo3b2o3bo$bob4o2b4obo$bob4o2b4obo2$ 5b6o$4b2o4b2o$4b2o4b2o33$35b3o10b3o$35bobo10bobo$35b3o10b3o$36b2o4b2o 4b2o$41bo2bo$37bobo6bobo$38b10o$40bo4bo$40bo4bo$40bo4bo13$6bo12bo25bo 12bo$6bo12bo25bo12bo$5bobo10bobo23bobo10bobo$6bo12bo25bo12bo$6bo12bo 25bo12bo$7bo3b4o3bo27bo3b4o3bo$11b4o35b4o$7b4o4b4o27b4o4b4o2$9bo6bo31b o6bo$10b2o2b2o33b2o2b2o6$39b3o10b3o2$39bobo10bobo$40bo12bo2$41b2ob6ob 2o2$2b3o10b3o24bo2bo2bo2bo$2bobo10bobo$2b3o10b3o25b8o$3b2o4b2o4b2o29b 2o$8bo2bo31b2o4b2o$4bobo6bobo$5b10o$7bo4bo$7bo4bo$7bo4bo35$37b3o10b3o 2$37bobo10bobo$38bo12bo2$39b2ob6ob2o2$40bo2bo2bo2bo2$41b8o$44b2o$41b2o 4b2o3$6bo12bo$5bobo10bobo$4bo3bo8bo3bo$5bo2bo8bo2bo$5bobo4b2o4bobo$6b 3o3b2o3b3o$9bo6bo$8bo2b4o2bo21bo12bo$12b2o25bo12bo$9b3o2b3o21bobo10bob o$39bo12bo$39bo12bo$40bo3b4o3bo$44b4o$40b4o4b4o2$42bo6bo$3bo12bo26b2o 2b2o$2b3o10b3o$2b3o10b3o3$5bo3b2o3bo$3bob4o2b4obo$3bob4o2b4obo2$7b6o$ 6b2o4b2o$6b2o4b2o5$7bo12bo$7bo12bo$6bobo10bobo$7bo12bo30bo12bo$7bo12bo 29bobo10bobo$8bo3b4o3bo29bo3bo8bo3bo$12b4o34bo2bo8bo2bo$8b4o4b4o30bobo 4b2o4bobo$51b3o3b2o3b3o$10bo6bo36bo6bo$11b2o2b2o36bo2b4o2bo$57b2o$54b 3o2b3o15$70b3o10b3o2$70bobo10bobo$71bo12bo2$72b2ob6ob2o$37b3o10b3o$36b o3bo8bo3bo19bo2bo2bo2bo2$40bo8bo24b8o$36bo7b2o7bo23b2o$38b3o2bo2bo2b3o 22b2o4b2o$39b2ob2o2b2ob2o3$41b8o$42bob2obo8$38bo12bo$37bobo10bobo$36bo 3bo8bo3bo$37bo2bo8bo2bo$37bobo4b2o4bobo$38b3o3b2o3b3o$41bo6bo$40bo2b4o 2bo$44b2o$41b3o2b3o8$35bo12bo$34b3o10b3o$34b3o10b3o3$37bo3b2o3bo$35bob 4o2b4obo$35bob4o2b4obo2$39b6o$38b2o4b2o$38b2o4b2o5$39bo12bo$39bo12bo$ 38bobo10bobo$39bo12bo30bo12bo$39bo12bo29bobo10bobo$40bo3b4o3bo29bo3bo 8bo3bo$44b4o34bo2bo8bo2bo$40b4o4b4o30bobo4b2o4bobo$83b3o3b2o3b3o$42bo 6bo36bo6bo$43b2o2b2o36bo2b4o2bo$89b2o$86b3o2b3o5$232bo12bo$231b3o10b3o $231b3o10b3o3$234bo3b2o3bo$232bob4o2b4obo$232bob4o2b4obo2$236b6o$102b 3o10b3o117b2o4b2o$235b2o4b2o$102bobo10bobo$103bo12bo2$104b2ob6ob2o$69b 3o10b3o$68bo3bo8bo3bo19bo2bo2bo2bo2$72bo8bo24b8o$68bo7b2o7bo23b2o$70b 3o2bo2bo2b3o22b2o4b2o$71b2ob2o2b2ob2o3$73b8o$74bob2obo8$70bo12bo$69bob o10bobo$68bo3bo8bo3bo$69bo2bo8bo2bo$69bobo4b2o4bobo$70b3o3b2o3b3o$73bo 6bo$72bo2b4o2bo$76b2o$73b3o2b3o8$67bo12bo$66b3o10b3o$66b3o10b3o3$69bo 3b2o3bo$67bob4o2b4obo$67bob4o2b4obo2$71b6o$70b2o4b2o$70b2o4b2o5$71bo 12bo$71bo12bo$70bobo10bobo$71bo12bo30bo12bo$71bo12bo29bobo10bobo$72bo 3b4o3bo29bo3bo8bo3bo$76b4o34bo2bo8bo2bo$72b4o4b4o30bobo4b2o4bobo$115b 3o3b2o3b3o$74bo6bo36bo6bo$75b2o2b2o36bo2b4o2bo$121b2o$118b3o2b3o15$ 134b3o10b3o2$134bobo10bobo$135bo12bo2$136b2ob6ob2o$101b3o10b3o$100bo3b o8bo3bo19bo2bo2bo2bo2$104bo8bo24b8o$100bo7b2o7bo23b2o$102b3o2bo2bo2b3o 22b2o4b2o$103b2ob2o2b2ob2o3$105b8o$106bob2obo8$101b3o10b3o2$101bobo10b obo$102bo12bo2$103b2ob6ob2o2$104bo2bo2bo2bo2$105b8o$108b2o$105b2o4b2o 3$134bo12bo$133bobo10bobo$132bo3bo8bo3bo$133bo2bo8bo2bo$133bobo4b2o4bo bo$134b3o3b2o3b3o$137bo6bo$101bo12bo21bo2b4o2bo$101bo12bo25b2o$100bobo 10bobo21b3o2b3o$101bo12bo$101bo12bo$102bo3b4o3bo$106b4o$102b4o4b4o2$ 104bo6bo$105b2o2b2o26bo12bo$136b3o10b3o$136b3o10b3o3$139bo3b2o3bo$137b ob4o2b4obo$137bob4o2b4obo2$141b6o$140b2o4b2o$140b2o4b2o8$89bo12bo$88bo bo10bobo$87bo3bo8bo3bo$88bo2bo8bo2bo$88bobo4b2o4bobo$89b3o3b2o3b3o$92b o6bo$91bo2b4o2bo$95b2o$92b3o2b3o15$68b3o10b3o2$68bobo10bobo$69bo12bo2$ 70b2ob6ob2o$101b3o10b3o$71bo2bo2bo2bo19bo3bo8bo3bo2$72b8o24bo8bo$75b2o 23bo7b2o7bo$72b2o4b2o22b3o2bo2bo2b3o$103b2ob2o2b2ob2o3$105b8o$106bob2o bo7$101b3o10b3o$100bo3bo8bo3bo2$104bo8bo$100bo7b2o7bo$102b3o2bo2bo2b3o $103b2ob2o2b2ob2o3$105b8o$106bob2obo11$105b3o10b3o$104bo3bo8bo3bo2$ 108bo8bo$104bo7b2o7bo$106b3o2bo2bo2b3o$68b3o10b3o23b2ob2o2b2ob2o2$68bo bo10bobo$69bo12bo26b8o$110bob2obo$70b2ob6ob2o2$71bo2bo2bo2bo2$72b8o$ 75b2o$72b2o4b2o34$103b3o10b3o$102bo3bo8bo3bo2$106bo8bo$102bo7b2o7bo$ 104b3o2bo2bo2b3o$105b2ob2o2b2ob2o3$107b8o$108bob2obo2$72bo12bo$71bobo 10bobo$70bo3bo8bo3bo$71bo2bo8bo2bo$71bobo4b2o4bobo$72b3o3b2o3b3o$75bo 6bo$74bo2b4o2bo$78b2o$75b3o2b3o22bo12bo$104b3o10b3o$104b3o10b3o3$107bo 3b2o3bo$105bob4o2b4obo$105bob4o2b4obo2$109b6o$108b2o4b2o$108b2o4b2o$ 68bo12bo$67bobo10bobo$66bo3bo8bo3bo$67bo2bo8bo2bo$67bobo4b2o4bobo$68b 3o3b2o3b3o$71bo6bo$70bo2b4o2bo24b3o10b3o$74b2o27bo3bo8bo3bo$71b3o2b3o$ 107bo8bo$103bo7b2o7bo$105b3o2bo2bo2b3o$106b2ob2o2b2ob2o3$108b8o$109bob 2obo34$70bo12bo$69b3o10b3o$69b3o10b3o3$72bo3b2o3bo$70bob4o2b4obo$70bob 4o2b4obo2$74b6o$73b2o4b2o$73b2o4b2o7$66b3o10b3o$66bobo10bobo$66b3o10b 3o$67b2o4b2o4b2o$72bo2bo$68bobo6bobo$69b10o$71bo4bo$71bo4bo$71bo4bo7$ 71bo12bo$70b3o10b3o$69b5o8b5o28bo12bo$69b5o8b5o27b3o10b3o$70bo6b2o6bo 28b3o10b3o$71b3o3b2o3b3o$74bobo2bobo$76bo2bo37bo3b2o3bo$74bo6bo33bob4o 2b4obo$75b6o34bob4o2b4obo$75bo4bo$119b6o$118b2o4b2o$118b2o4b2o13$135bo 12bo108bo12bo$134bobo10bobo106b3o10b3o$133bo3bo8bo3bo105b3o10b3o$134bo 2bo8bo2bo$134bobo4b2o4bobo$102bo12bo19b3o3b2o3b3o110bo3b2o3bo$102bo12b o22bo6bo111bob4o2b4obo$101bobo10bobo20bo2b4o2bo110bob4o2b4obo$102bo12b o25b2o$102bo12bo22b3o2b3o115b6o$103bo3b4o3bo145b2o4b2o$107b4o149b2o4b 2o$103b4o4b4o2$105bo6bo$106b2o2b2o4$260bo12bo$259b3o10b3o$259b3o10b3o 3$102bo12bo146bo3b2o3bo$101b3o10b3o143bob4o2b4obo$101b3o10b3o143bob4o 2b4obo2$264b6o$104bo3b2o3bo149b2o4b2o$102bob4o2b4obo147b2o4b2o$102bob 4o2b4obo2$106b6o$105b2o4b2o$105b2o4b2o7$98b3o10b3o$98bobo10bobo$98b3o 10b3o$99b2o4b2o4b2o$104bo2bo$100bobo6bobo$101b10o$103bo4bo$103bo4bo$ 103bo4bo7$103bo12bo$102b3o10b3o$101b5o8b5o28bo12bo$101b5o8b5o27b3o10b 3o$102bo6b2o6bo28b3o10b3o$103b3o3b2o3b3o$106bobo2bobo$108bo2bo37bo3b2o 3bo$106bo6bo33bob4o2b4obo$107b6o34bob4o2b4obo$107bo4bo$151b6o$150b2o4b 2o$150b2o4b2o13$167bo12bo$166bobo10bobo$165bo3bo8bo3bo$166bo2bo8bo2bo$ 166bobo4b2o4bobo$134bo12bo19b3o3b2o3b3o$134bo12bo22bo6bo$133bobo10bobo 20bo2b4o2bo$134bo12bo25b2o$134bo12bo22b3o2b3o$135bo3b4o3bo$139b4o$135b 4o4b4o2$137bo6bo$138b2o2b2o9$134bo12bo$133b3o10b3o$133b3o10b3o3$136bo 3b2o3bo$134bob4o2b4obo$134bob4o2b4obo2$138b6o$137b2o4b2o$137b2o4b2o7$ 130b3o10b3o$130bobo10bobo$130b3o10b3o$131b2o4b2o4b2o$136bo2bo$132bobo 6bobo$133b10o$135bo4bo$135bo4bo$135bo4bo7$135bo12bo$134b3o10b3o$133b5o 8b5o28bo12bo$133b5o8b5o27b3o10b3o$134bo6b2o6bo28b3o10b3o$135b3o3b2o3b 3o$138bobo2bobo$140bo2bo37bo3b2o3bo$138bo6bo33bob4o2b4obo$139b6o34bob 4o2b4obo$139bo4bo$183b6o$182b2o4b2o$182b2o4b2o13$199bo12bo$198bobo10bo bo$197bo3bo8bo3bo$198bo2bo8bo2bo$198bobo4b2o4bobo$166bo12bo19b3o3b2o3b 3o$166bo12bo22bo6bo$165bobo10bobo20bo2b4o2bo$166bo12bo25b2o$166bo12bo 22b3o2b3o$167bo3b4o3bo$171b4o$167b4o4b4o2$169bo6bo$170b2o2b2o7$166bo 12bo$166bo12bo$165bobo10bobo$166bo12bo$166bo12bo$167bo3b4o3bo$171b4o$ 167b4o4b4o2$169bo6bo$170b2o2b2o11$191bo12bo$191bo12bo$190bobo10bobo$ 191bo12bo$191bo12bo$192bo3b4o3bo$196b4o$154bo12bo24b4o4b4o$153bobo10bo bo$152bo3bo8bo3bo24bo6bo$153bo2bo8bo2bo26b2o2b2o$153bobo4b2o4bobo$154b 3o3b2o3b3o$157bo6bo$156bo2b4o2bo$160b2o$157b3o2b3o36$189bo12bo$188b3o 10b3o$187b5o8b5o$187b5o8b5o$188bo6b2o6bo$189b3o3b2o3b3o$192bobo2bobo$ 194bo2bo$192bo6bo$193b6o$193bo4bo7$191b3o10b3o2$191bobo10bobo$192bo12b o2$193b2ob6ob2o2$194bo2bo2bo2bo2$195b8o$198b2o$195b2o4b2o8$144bo12bo$ 143b3o10b3o$142b5o8b5o$142b5o8b5o$143bo6b2o6bo$144b3o3b2o3b3o$147bobo 2bobo$149bo2bo$147bo6bo$148b6o$148bo4bo13$124bo12bo$124bo12bo$123bobo 10bobo$124bo12bo$124bo12bo$125bo3b4o3bo$129b4o24bo12bo$125b4o4b4o19b3o 10b3o$156b3o10b3o$127bo6bo$128b2o2b2o$159bo3b2o3bo$157bob4o2b4obo$157b ob4o2b4obo2$161b6o$160b2o4b2o$160b2o4b2o6$157bo12bo$156b3o10b3o$156b3o 10b3o3$159bo3b2o3bo$157bob4o2b4obo$157bob4o2b4obo2$161b6o$160b2o4b2o$ 160b2o4b2o13$126b3o10b3o23b3o10b3o$125bo3bo8bo3bo21bo3bo8bo3bo2$129bo 8bo29bo8bo$125bo7b2o7bo21bo7b2o7bo$127b3o2bo2bo2b3o25b3o2bo2bo2b3o$ 128b2ob2o2b2ob2o27b2ob2o2b2ob2o3$130b8o31b8o$131bob2obo33bob2obo5$132b o12bo$131b3o10b3o$130b5o8b5o$130b5o8b5o$131bo6b2o6bo$132b3o3b2o3b3o$ 135bobo2bobo26bo12bo$137bo2bo27b3o10b3o$135bo6bo25b3o10b3o$136b6o$136b o4bo$171bo3b2o3bo$169bob4o2b4obo$169bob4o2b4obo2$173b6o$172b2o4b2o$ 172b2o4b2o34$133b3o10b3o2$133bobo10bobo$134bo12bo2$135b2ob6ob2o2$136bo 2bo2bo2bo2$137b8o$140b2o$137b2o4b2o6$131bo12bo$130bobo10bobo$129bo3bo 8bo3bo$130bo2bo8bo2bo120bo12bo$130bobo4b2o4bobo120bo12bo$131b3o3b2o3b 3o120bobo10bobo$134bo6bo124bo12bo$133bo2b4o2bo123bo12bo$137b2o128bo3b 4o3bo$134b3o2b3o129b4o$267b4o4b4o2$269bo6bo$270b2o2b2o4$134b3o10b3o$ 133bo3bo8bo3bo$178b3o10b3o$137bo8bo$133bo7b2o7bo27bobo10bobo$135b3o2bo 2bo2b3o30bo12bo$136b2ob2o2b2ob2o$180b2ob6ob2o2$138b8o35bo2bo2bo2bo$ 139bob2obo$182b8o$185b2o$182b2o4b2o13$199bo12bo$198b3o10b3o$197b5o8b5o $197b5o8b5o$198bo6b2o6bo$199b3o3b2o3b3o$165b3o10b3o21bobo2bobo$165bobo 10bobo23bo2bo$165b3o10b3o21bo6bo$166b2o4b2o4b2o23b6o$171bo2bo28bo4bo$ 167bobo6bobo$168b10o$170bo4bo$170bo4bo$170bo4bo9$166bo12bo$165b3o10b3o $164b5o8b5o$164b5o8b5o$165bo6b2o6bo$166b3o3b2o3b3o$169bobo2bobo$171bo 2bo$169bo6bo$170b6o$170bo4bo4$197b3o10b3o2$197bobo10bobo$198bo12bo2$ 199b2ob6ob2o2$200bo2bo2bo2bo$164b3o10b3o$163bo3bo8bo3bo20b8o$204b2o$ 167bo8bo24b2o4b2o$163bo7b2o7bo$165b3o2bo2bo2b3o$166b2ob2o2b2ob2o3$168b 8o25bo12bo$169bob2obo25bobo10bobo$199bo3bo8bo3bo$200bo2bo8bo2bo$200bob o4b2o4bobo$201b3o3b2o3b3o$204bo6bo$203bo2b4o2bo$207b2o$204b3o2b3o10$ 152b3o10b3o2$152bobo10bobo$153bo12bo2$154b2ob6ob2o2$155bo2bo2bo2bo2$ 156b8o$159b2o$156b2o4b2o13$133bo12bo$132b3o10b3o$131b5o8b5o$131b5o8b5o $132bo6b2o6bo$133b3o3b2o3b3o$136bobo2bobo21b3o10b3o$138bo2bo23bobo10bo bo$136bo6bo21b3o10b3o$137b6o23b2o4b2o4b2o$137bo4bo28bo2bo$167bobo6bobo $168b10o$170bo4bo$170bo4bo$170bo4bo6$164bo12bo$163bobo10bobo$162bo3bo 8bo3bo$163bo2bo8bo2bo$163bobo4b2o4bobo$164b3o3b2o3b3o$167bo6bo$166bo2b 4o2bo$170b2o$167b3o2b3o91$249bo12bo$248bobo10bobo$247bo3bo8bo3bo$248bo 2bo8bo2bo$248bobo4b2o4bobo$249b3o3b2o3b3o$252bo6bo$251bo2b4o2bo$255b2o $252b3o2b3o19$236bo12bo$235bobo10bobo$234bo3bo8bo3bo$235bo2bo8bo2bo$ 235bobo4b2o4bobo$236b3o3b2o3b3o$239bo6bo$238bo2b4o2bo$242b2o$239b3o2b 3o7$231bo12bo$230bobo10bobo$229bo3bo8bo3bo$230bo2bo8bo2bo$230bobo4b2o 4bobo$231b3o3b2o3b3o$234bo6bo$233bo2b4o2bo$237b2o$234b3o2b3o!golly-3.3-src/Patterns/Life/Rakes/2c5-engineless-rake-p185.rle0000644000175000017500000001357612026730263020616 00000000000000#C engineless p185 2c/5 rake: Paul Tooke, 14 December 2004; #C some updates by Jason Summers, 15 December 2004. x = 531, y = 201, rule = B3/S23 392bo$390b2obo$388b3o$387bo2bo$386bo$387bo2bo2bo$388b4obo$390bob3o$ 381bobo8b3o$378bo4bo7b2o$377b3o4bo6bo2b2obo$376bobo12bo2b3o$375b2o2b2o 4bo6b2obo$376b2o2b5o4$342b2o32b2o2b5o$341b3o31b2o2b2o4bo$307bobo15b2o 12bo36bobo$307bobo2bo11b3o11b2obo35b3o4bo$306bo3bob3o8bo2bo2bobo5b2o 39bo4bo7b3o$307b2ob6o7b2o3bo2bo6b2ob3o37bobo6bo2bo$307b2obobo2bo5bo9bo 7bo51bob2o$310bobobo2bo3b8obo10bo49b3o$310bo3bo2bo12bo14bo$311b2o2b2ob 12o12bo3bo42b2o$312b2o3bo14bobo6b2ob2o$318b15obo7bo48b3o$282b3o58b2ob 2o43b3o$280b2ob2o33b15obo55bobo$278b2obobo28b2o3bo14bobo56bo$278b2o3b 2o26b2o2b2ob12o$278b2obob2o25bo3bo2bo12bo$280b3o27bobobo2bo3b8obo$284b o22b2obobo2bo5bo9bo$284b2o21b2ob6o7b2o3bo2bo$283bo4bo17bo3bob3o8bo2bo 2bobo16bo21bobo4bo11b2o$282b2o4bo18bobo2bo11b3o18b2ob2o20bo5b2ob2obo5b o$283b5o19bobo15b2o17bobobo15b2o3bo7bobobo6bo2bo$284bo58b2o3bo7b2o6b2o 3b2o3bobo2bobo6b2o$344bobo2bo5b2ob2ob3o5b2obob4o2b2o5bobobo$345b2obo7b ob2ob2o3b2o3b2ob2o10b2obo38bo$357bo5bobo2bo7bobo10bo38bobo$349b2o7b2o 2bo3b2o10bo3b3o2bob2o37b2o$348bob3o12b2o15b2o3bob2o$309b2o36bo3b3o4b2o 2bo3b2o10bo3b3o2bob2o$308b3o37bobo6bo5bobo2bo7bobo10bo$306bo42bo6bob2o b2o3b2o3b2ob2o10b2obo$305b2obo46b2ob2ob3o5b2obob4o2b2o5bobobo$304b2o 50b2o6b2o3b2o3bobo2bobo6b2o$305b2ob3o53b2o3bo7bobobo6bo2bo$306bo19b2o 42bo5b2ob2obo5bo$308bo16b2o43bobo4bo11b2o$312bo14bo$309bo3bo$308b2ob2o $309bo$274bo35b2ob2o$273b3o$253bo18b2o2bo$251b2obo17bo3bo137b2o2b2o$ 249b3o20bobo141b4o$248bo2bo159b2o6b2o$247bo25b2ob2o133b2obob5o$248bo2b o2bo20bo134bo3b2o$206b2obo13b2o24b4obo156b3o$205b3obo13b2o26bob3o155b 3o$204bo6bo9bo5b2o24b3o20bo$205b2obo2b2o8b3o3b3o22b2o18bo4bo133b5o$ 206b3obo2b2o4b2o5bobo23bo2b2obo13bo137b7o$208bobobo7b8o24bo2b3o19bo 131bo3bo$209b2obob2o12bo24b2obo16b2o135b2o2b3o$209b2obo3bob10o45b2o 127bobo6bo2bo$215bobo12bobo40b2o2bo124bobo$211bo4b17o41b4o121b2obo11b 2o$275b2o121bob2o12bo$211bo4b17o165bo3bo10b2o$215bobo12bobo158bo6bob2o bo8b3o2b2o$209b2obo3bob10o162b5o4b2obo10bo3b2o$209b2obob2o12bo160b2o4b o18bo2bo$208bobobo7b8o162bo4bo18b2o$206b3obo2b2o4b2o5bobo162b2o9b4obo$ 205b2obo2b2o8b3o3b3o161bo10b2o2bo$204bo6bo9bo5b2o158b3o12b2o3bo$205b3o bo13b2o160b2obob2o12bo$206b2obo13b2o160b2o3b2o$385b2obobo$288bobo96b2o b2o65bo$273bobo2b3obo4bo4bobo94b3o63b2o$273bobo2bobobob3o4b3obo88bo71b 2o$272bo3bo5bo3b3o6bo89bo$273b2ob5obo7b6o87b3o$273b2o4bo4bo3bo170bo$ 275b2o8b3o3bobobo162bo$277bo7bob3obobobo14b2o146b3o$279bobo4b2o21b6o 104b2o$279b2o27bo3bo72bo3bo28b6o$280bo27bo4b2o70b2o2b2o26bo3bo$308bo2b o71b2ob2o2bo26bo4b2o$382b2obob2obo26bo2bo$310b2o69bo3bo5bo$310b2o70b3o 34b2o$306b2o2bo72bo7bo27b2o39bobo$306b6o103b2o2bo40b2o$305bo77bo7bo23b 6o40bo$306bo5bo69b3o29bo$306bo5bo68bo3bo5bo23bo5bo$382b2obob2obo24bo5b o$307bobo73b2ob2o2bo$306bo78b2o2b2o25bobo$306bo3b6o69bo3bo25bo$216b3o 87bobobob3obo98bo3b6o$216bo90b3obo103bobobob3obo$217bo93b3o102b3obo$ 311b2o2bo104b3o$420b2o2bo6$493b2o$492b2o$494bo3$502bo$7bo4bo488bobo$6b ob2obobo45bo73bo73bo73bo73bo73bo70b2ob2o$5bo3bo11b2o34bo3bo14b3o52bo3b o14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo2bo$5bobo12b ob5o11b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo 18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o17b2ob2o20bo$5bo 2b2o6bob2ob3o3bobobo5b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob 3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo 12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o 15bobo20b5o$2b2ob2o5b4ob2o6bo7bo4b5o13b5o14b2o16bo18b5o13b5o14b2o16bo 18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b 2o16bo18b5o16bo20b2o4bo$bobob2o2b2o6b2ob2o4b3obobo6b3o52bo3bo14b3o52bo 3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o39bo4bo$2obo 28bo63bo73bo73bo73bo73bo73bo59b2o$b2ob3o24b2o493bo$5b2o23bobo489b3o$ 30bo114b3o354bo17b2obob2o$5b2o23bobo105bo5b6o6bo59bo283b2o3bo14b2o3b2o $b2ob3o24b2o103b2obo2b2obo3bo5b2o54b3o2b3o281b2o2bo15b2obobo$2obo28bo 90bo2bo8bo11bo7bo57bo218bo67b4obo16b2ob2o$bobob2o2b2o6b2ob2o4b3obobo 90bo2bo3b3o2b2obobo3bob2obo6b3o50b2o3bo211bo4bob3o8bo79b3o$2b2ob2o5b4o b2o6bo7bo88bo4bobo7b2o3bo5b2o6bo52bo2b3ob3o205bobo3bo3bob2o4b2o$5bo2b 2o6bob2ob3o3bobobo79bo11b2o6b2o5bob2obo5b2ob2o2b3o50b3ob6o192b2o6b2o2b 2ob2ob2obobo7bo54b2obo$5bobo12bob5o83b5o8b2o4b3ob2o3bo4b3o4b2obob3o57b 3o192b4o3bo4b2obob3obo2bo9bo51bob2obo$5bo3bo11b2o86b2o4bo9b6o18bobobob o253bo4bobobo10bo5b3o6b2o50bo3bo$6bob2obobo96bo4bo15bo3bo13bo3b2o60b3o 20bo171b2ob2obo8b4o2bo8bo3b2o50bob2o$7bo4bo98b2o12b6o18bobobobo53b3ob 6o18bobo171b8obo4b2o4bo6bob3o54b2obo$111bo11b2o4b3ob2o3bo4b3o4b2obob3o 51bo2b3ob3o17bo3b3o176b3o9bo5b2obo2bo56bobo$107b3o13b2o6b2o5bob2obo5b 2ob2o2b3o50b2o3bo22bob3o177b3o14b2o2bo59bobo$105b2obob2o10bo4bobo7b2o 3bo5b2o6bo56bo24b2o179b3o9bo5b2obo2bo$105b2o3b2o11bo2bo3b3o2b2obobo3bo b2obo6b3o52b3o2b3o192b8obo4b2o4bo6bob3o$105b2obobo12bo2bo8bo11bo7bo60b o17b2obo172b2ob2obo8b4o2bo8bo3b2o$107b2ob2o24b2obo2b2obo3bo5b2o16b2obo 56bobo2bo170bo4bobobo10bo5b3o6b2o$109b3o26bo5b6o6bo15bo2b3o39bo14b2o3b o172b4o3bo4b2obob3obo2bo9bo$145b3o24bo2b2obo38b2o14bobobo173b2o6b2o2b 2ob2ob2obobo7bo$172b2o42bobo15b2ob2o185bobo3bo3bob2o4b2o$173b3o13b2o 46bo188bo4bob3o8bo$133b2o36bob3o12b2o28bo213bo$132bo2bo33b4obo15bo$ 132bobo33bo2bo2bo42bo$133bo33bo46b2ob2o81b2o72b2o$105bo62bo2bo41bobobo 81bo2bo70bo2bo70b2o$103b2o3bo60b3o40b2o3bo81bobo71bobo71bo$103b2o2bo 63b2obo38bobo2bo81bo73bo69b2ob2o$103b4obo64bo40b2obo14b2ob2o207b3obo$ 231bo213b2obo$218b2o10b2ob2o213b2o$100b2obo113bob3o9bo3bo195b2obo13b2o $99bob2obo45b2o64bo3b3o11bo195bo2b3o9b3o$99bo3bo45b3o65bobo10bo199bo2b 2obo9bo$99bob2o44bo70bo9bo201b2o$100b2obo42b2obo77b2ob3o198b3o$103bobo 39b2o79b2o201bob3o$103bobo40b2ob3o75b2obo196b4obo$147bo80bo197bo2bo2bo $149bo80b3o192bo$153bo77b2o193bo2bo$150bo3bo272b3o$149b2ob2o275b2obo$ 150bo37b3o240bo$151b2ob2o31bo2bob2o$187b3o$188b5o$190b2o$189bobo$190bo $188bo$185b4o2bo$184b2ob2o2bo$185b2o2b2o3$191b3o$185b3ob6o$185bo2b3ob 3o$185b2o3bo$189bo$187b3o2b3o$192bo! golly-3.3-src/Patterns/Life/Rakes/c4-sideways-rake.rle0000644000175000017500000012735412026730263017534 00000000000000#C p4508+32N c/4 adjustable-period sideways glider rake. #C This rake has an engine convoy at the front, two convoys #C forming lines behind that, and a V-shaped convoy at the back. #C The recipe to create the next rake in the series is: #C - Move the top line convoy orthogonally right by 6 cells. #C - Move the left line convoy orthogonally down by 6 cells. #C - Move the V-shaped convoy diagonally back by 6 cells. #C This will increase the period by 32 generations. #C The modifications can be be made in the opposite direction #C to form the earlier rakes in the series. Moving the convoys #C by 300 cells creates the first rake in the series (period 4508). #C Note that each rake has to be run a few cycles before it becomes #C fully populated and begins to emit gliders. #C David Bell, 14 October 2005 x = 3285, y = 3306, rule = B3/S23 18boo$17boo$19bo$21boo$20bo$$19bobbo$11boo5boo$10boo5bo$12bo4bobo$8bo 5boobbo$7boo5boo$7bobo8bo26b3o$17bobo25bobb3o$10boo6bobo25bobo$10boo7b obo29bo$20boo27bo$bo6boo3bo37bobo$oo5bobbobobo9boo18boobo6bo$obo3boobo 3bobo7bobbo16boo3bobbobbo$4bo9bobo7bobo10b3o4bobbobbo3bo$3bo11boo8bo 11bo6bobbobbo3bo$3bobbo33bo3bo6bobo$19bo17bobbo8boo$18bobo17bobbo6b3o$ 18bobbo9bo7bo5bo3bo23boo$19boo9bobo8boboboobo23boo3bo$29bo13boo29boboo $29boo16bo28b3o$27boo47bo$26bobo15bobbo30b3o$25bo45boobo4boo$26bo44bob oo3bobo$65boo4boboo3b3o$64boo6bo5b3o$65bobo4boo4bobo$65b3o4boobboo$20b oobo41boo6bobo$20bo3bo42bobo3boo3bo$20bo4bo47b4o$22boo45bobo$24bobo44b 4o$71b4o$19bo6boo44boo$18b5o4bobbo$12boo4bo6boo$12bobo11bo$12bo5boboo 6bobo$13boo4bo4bobo$13bobbo6b3o403boo$13bo6booboo403boo$15bobobobbo 399boo5bo$421boo5boo$17bo4bo400bo4bobobboo$18b4o403boo3boob4o$425boo 10bo$437bo$431bo$431bo3bo$430booboo$430bo3boboo$431boob4o$436boobbo$ 437boobo$34bo403bo$33b5o400boo$33bobboo400b3o$35boobo399boobbo$442bobo $38bobo398bo3bobo$439b6o$31b3o6b3o398b3o$26bo4bobb3o4b3o$25boo5boob5ob 3o$25bobo3b3o4booboo$37bobo$27b3o6bobbo$26b3o7bo$28bobob4obbo$30booboo $30b6o15$512bo$500boo9boo$499boo3bo6bobo$501boboo15b3o$453b3o47b3o5bob o4booboo$453bo49bo6boobobobo$456bo48b3obo6boboo$453bobbo49boo7bo$454bo bbo48boo5boo$455bo52b5o$457bobo$459boo$460bo$459boo68boo$458b3o67boo$ 453boobooboo61boo5bo$453bo3boboo60boo5boo$453bob3obbo62bo4bobobboo$ 458boo65boo3boob4o$457b3o65boo10bo$537bo$531bo$456b3o72bo3bo$456b3o71b ooboo$530bo3boboo$455boo74boob4o$455bo80boobbo$537boobo$538bo$538boo$ 538b3o$466boo70boobbo$466bobo73bobo$466bo8b3o61bo3bobo$469bo3booboo61b 6o$469boobo68b3o$472b3o$$469bo3bobo4bo$468boobob3o3b5ob4o$468bo3bo8b3o 4b3o$467boo5bo3bo4bob3o$467bo6bobbobbo6bo$468bo8bo10bo3bo$474boboobo7b o$473boo13bobbo$473bobo13bo$$475bo$473boo$$473boo$473boobobo$476bo3bo$ 473boo5bo$475b5o4$612bo$600boo9boo$599boo3bo6bobo$601boboo15b3o$553b3o 47b3o5bobo4booboo$553bo49bo6boobobobo$556bo48b3obo6boboo$553bobbo49boo 7bo$554bobbo48boo5boo$555bo52b5o$557bobo$559boo$560bo$514boo43boo68boo $513boo3bo39b3o67boo$515boboo34boobooboo61boo5bo$517b3o33bo3boboo60boo 5boo$517bo35bob3obbo62bo4bobobboo$519b3o36boo65boo3boob4o$512boobo4boo 35b3o65boo10bo$512boboo3bobo115bo$506boo4boboo3b3o109bo$505boo6bo5b3o 34b3o72bo3bo$506bobo4boo4bobo34b3o71booboo$506b3o4boobboo111bo3boboo$ 506boo6bobo38boo74boob4o$508bobo3boo3bo35bo80boobbo$514b4o119boobo$ 510bobo125bo$512b4o122boo$512b4o122b3o$513boo51boo70boobbo$566bobo73bo bo$566bo8b3o61bo3bobo$569bo3booboo61b6o$569boobo68b3o$572b3o$$569bo3bo bo4bo$568boobob3o3b5ob4o$568bo3bo8b3o4b3o$567boo5bo3bo4bob3o$567bo6bo bbobbo6bo$568bo8bo10bo3bo$574boboobo7bo$573boo13bobbo$573bobo13bo$$ 575bo$573boo$$573boo$573boobobo$576bo3bo$573boo5bo$575b5o4$712bo$700b oo9boo$699boo3bo6bobo$701boboo15b3o$653b3o47b3o5bobo4booboo$653bo49bo 6boobobobo$656bo48b3obo6boboo$653bobbo49boo7bo$654bobbo48boo5boo$655bo 52b5o$657bobo$659boo$660bo$614boo43boo68boo$613boo3bo39b3o67boo$615bob oo34boobooboo61boo5bo$617b3o33bo3boboo60boo5boo$617bo35bob3obbo62bo4bo bobboo$619b3o36boo65boo3boob4o$612boobo4boo35b3o65boo10bo$612boboo3bob o115bo$606boo4boboo3b3o109bo$605boo6bo5b3o34b3o72bo3bo$606bobo4boo4bob o34b3o71booboo$606b3o4boobboo111bo3boboo$606boo6bobo38boo74boob4o$608b obo3boo3bo35bo80boobbo$614b4o119boobo$610bobo125bo$612b4o122boo$612b4o 122b3o$613boo51boo70boobbo$666bobo73bobo$666bo8b3o61bo3bobo$669bo3boob oo61b6o$669boobo68b3o$672b3o$$669bo3bobo4bo$668boobob3o3b5ob4o$668bo3b o8b3o4b3o$667boo5bo3bo4bob3o$667bo6bobbobbo6bo$668bo8bo10bo3bo$674bob oobo7bo$673boo13bobbo$673bobo13bo$$675bo$673boo$$673boo$673boobobo$ 676bo3bo$673boo5bo$675b5o4$812bo$800boo9boo$799boo3bo6bobo$801boboo15b 3o$753b3o47b3o5bobo4booboo$753bo49bo6boobobobo$756bo48b3obo6boboo$753b obbo49boo7bo$754bobbo48boo5boo$755bo52b5o$757bobo$759boo$760bo$714boo 43boo$713boo3bo39b3o$715boboo34boobooboo$717b3o33bo3boboo$717bo35bob3o bbo$719b3o36boo$712boobo4boo35b3o100boo$712boboo3bobo137boo3bo$706boo 4boboo3b3o112bo26boboo$705boo6bo5b3o34b3o74boo28b3o$706bobo4boo4bobo 34b3o68bo5bobo27bo$706b3o4boobboo107boo37b3o$706boo6bobo38boo69bobo3b oobobo20boobo4boo$708bobo3boo3bo35bo74bo7boo18boboo3bobo$714b4o111bo4b o5boo10boo4boboo3b3o$710bobo116bobbobb6o10boo6bo5b3o$712b4o136bobo4boo 4bobo$712b4o136b3o4boobboo$713boo51boo72bo3boo6boo6bobo$766bobo69boob oob4o6bobo3boo3bo$766bo8b3o61bo8bo11b4o$769bo3booboo62boo6bo7bobo$769b oobo85b4o$772b3o69boo12b4o$859boo$769bo3bobo4bo$768boobob3o3b5ob4o$ 768bo3bo8b3o4b3o$767boo5bo3bo4bob3o85boobo7b3o$767bo6bobbobbo6bo85bo3b o6bo$768bo8bo10bo3bo80bo4bo7bo7boo$774boboobo7bo87boo7bobo4boobo$773b oo13bobbo85bobo4b3obobboo$773bobo13bo93bo3boobboo$879boob4oboo$775bo 104b7o$773boo$$773boo$773boobobo$776bo3bo$773boo5bo$775b5o8$852boo$ 852bobo$852bo$853boo$853bobbo$853bo$855bobo$859bo$857bobbo$814boo41bo bbo$813boo3bo40b3o$815boboo36b3ob3o$817b3o31b3oboobb3o$817bo33bo7boo$ 819b3o30bo6boo$812boobo4boo33b5o$812boboo3bobo35boo$806boo4boboo3b3o 34boo$805boo6bo5b3o34boo$806bobo4boo4bobo33bobo$806b3o4boobboo35boo$ 806boo6bobo37bobo$808bobo3boo3bo33bo$814b4o36boo$810bobo$812b4o$812b4o $813boo10$885boo$884boo3bo$886boboo$888b3o$888bo$890b3o$883boobo4boo$ 883boboo3bobo$877boo4boboo3b3o$876boo6bo5b3o$877bobo4boo4bobo$877b3o4b oobboo$877boo6bobo$879bobo3boo3bo$885b4o$881bobo$883b4o$883b4o$884boo 4$960boo$960bobo$960bo$963bo$963boo3bo$963boobbobo$964boboobbo$964boob ob3o$964bobo3boo$964bo5bo$950b3o17boo$950bo12boo$951bo10boboo$953b3o5b o4bo$954b6oboo3bo$957bo4bo7boobo7b3o$956bobo4boo5bo3bo6bo$955b3o12bo4b o7bo7boo$954bo17boo7bobo4boobo$955bobo16bobo4b3obobboo$956b5o19bo3boo bboo$957boobo15boob4oboo$977b7o5$52bo$51boo$51bobo$$54boo$54boo$$50bob oo$49b4o$49bo3boo4boo$54bobb3obo$61bo$53boo4bo$53boo4b3o$54bo3bobbo$ 54bo5b3o$55boo3b4o$63b5o$65b3oboo$62boobbo3bo$70boo$67booboo$69b3o$68b obo$69bo6$1001bo$1000boo$99boobo7b3o881bo5bobo$99bo3bo6bo882boo$99bo4b o7bo7boo871bobo3boobobo$101boo7bobo4boobo876bo7boo$103bobo4b3obobboo 877bo4bo5boo$109bo3boobboo877bobbobb6o$105boob4oboo$106b7o$1002boobboo $1002bob4o$1002bo4bobo$1010bo$1009b3o44bo$126b3o926boo$126bo9boo871bo 45bobo$127bo6b3obo827b3o$129boobboo831bo42boobo45boo$130bo838bo39boob 4o42boobb3o$134bo831bobbo40bobb4o45boobo$130boo3bo831bobbo40boo47bo4bo $129boboboo5boobboboobo818bo90b3o4bo$129bobobbobooboo3boboobo820bobo 86bo5bo$128bo4boo6bobo6bo821boo72boo12bobobboo$128boo9bo7boobo822bo71b oo$128boo7b3o10bo821boo73bo9b3o$136bo10bobbo820b3o75boo6booboo$134bo4b o10bo815boobooboo75boobboobbob3o$133boobbo10boo816bo3boboo78boobobboo$ 134boo830bob3obbo79bo4boo$134boo835boo33boo42boo3bo$134b3o833b3o32boo 43boo$1007bo42bo$134bobo872boo40booboo$134bobo832b3o36bo44bobo$134bob oobo829b3o$134boobbobo862b3obobbo$135bo5bo826boo33bobbo$135bo832bo37bo bbo$140bo863bo$138bo865b4o$983bo16b3o4bobo$982boo16bobbo$982bobo17bo$ 1001boo3boo$985boo14boo3bobo63boobo7b3o$985boobb3o9b3obbo65bo3bo6bo$ 97bo891boobo13bo65bo4bo7bo7boo$96boo889bo4bo10boboob3o63boo7bobo4boobo $96bobo887b3o4bo11boo5bo12boo49bobo4b3obobboo$986bo5bo11b3o6bo11bobo 54bo3boobboo$98b3o872boo12bobobboo16bobo12bo52boob4oboo$97b3o872boo32b oboo16boo51b7o$99bobo74bo797bo9b3o39bobbo$101b3o71b5o796boo6booboo37bo $101b3o71bobboo796boobboobbob3o39bobo$104bo72boobo798boobobboo45bo$ 101bobbo875bo4boo43bobbo$100bo3bo75bobo794boo3bo47bobbo$96booboo3bo 872boo53b3o$95boo7bo68b3o6b3o792bo50b3ob3o$97boboobbo64bo4bobb3o4b3o 792booboo41b3oboobb3o$103bo63boo5boob5ob3o794bobo41bo7boo$100bobo64bob o3b3o4booboo840bo6boo$101bo77bobo846b5o$100bo68b3o6bobbo848boo$99bobo 66b3o7bo850boo$99bobo68bobob4obbo848boo$98bo73booboo851bobo$98boo11bo 60b6o849boo$98boo10boo915bobo$110bobo913bo70bo10boo$1027boo67b5o6boo$ 113boo981bobboo8bo7boo$113boo983boobo5boo6b3obo$1107boo3boboo$109boboo 988bobo6boo$108b4o925b3o66b3obo4bo$108bo3boo4boo917bo9boo54b3o3bo4bo$ 113bobb3obo917bo6b3obo54bo7bo$120bo919boobboo58bo6bo$112boo4bo922bo$ 112boo4b3o924bo61bo$113bo3bobbo920boo3bo$113bo5b3o918boboboo5boobboboo bo$114boo3b4o917bobobbobooboo3boboobo$122b5o912bo4boo6bobo6bo$124b3ob oo909boo9bo7boobo$121boobbo3bo909boo7b3o10bo$129boo916bo10bobbo$126boo boo914bo4bo10bo$128b3o913boobbo10boo$127bobo915boo$128bo916boo$1045b3o $$1045bobo$1045bobo$1045boboobo$1045boobbobo$1046bo5bo$158boobo7b3o 874bo$158bo3bo6bo881bo$158bo4bo7bo7boo868bo$160boo7bobo4boobo$162bobo 4b3obobboo$168bo3boobboo$164boob4oboo$165b7o6$185b3o$185bo9boo$186bo6b 3obo$188boobboo892bo$189bo895b5o$193bo891bobboo$189boo3bo892boobo$188b oboboo5boobboboobo$188bobobbobooboo3boboobo881bobo$187bo4boo6bobo6bo$ 187boo9bo7boobo873b3o6b3o$187boo7b3o10bo868bo4bobb3o4b3o$195bo10bobbo 867boo5boob5ob3o71boobo$193bo4bo10bo867bobo3b3o4booboo72bo3bo$192boobb o10boo880bobo75bo4bo$193boo884b3o6bobbo77boo$193boo883b3o7bo82bobo$ 193b3o884bobob4obbo$1082booboo79bo6boo$193bobo886b6o77b5o4bobbo$193bob o963boo4bo6boo$193boboobo960bobo11bo$193boobbobo959bo5boboo6bobo$194bo 5bo959boo4bo4bobo$194bo965bobbo6b3o$199bo960bo6booboo4bo10boo$197bo 964bobobobbo5b5o6boo$1175bobboo8bo7boo$1164bo4bo7boobo5boo6b3obo$1165b 4o17boo3boboo$1180bobo6boo$1185b3obo4bo$1182b3o3bo4bo$156bo989b3o34bo 7bo$155boo989bobb3o31bo6bo$155bobo989bobo$1152bo33bo$157b3o990bo$156b 3o993bobo$158bobo74bo909boobo6bo$160b3o71b5o905boo3bobbobbo$160b3o71bo bboo899b3o4bobbobbo3bo$163bo72boobo898bo6bobbobbo3bo$160bobbo977bo3bo 6bobo$159bo3bo75bobo896bobbo8boo$155booboo3bo975bobbo6b3o$154boo7bo68b 3o6b3o896bo5bo3bo$156boboobbo64bo4bobb3o4b3o897boboboobo$162bo63boo5b oob5ob3o899boo$159bobo64bobo3b3o4booboo904bo$160bo77bobo$159bo68b3o6bo bbo904bobbo$158bobo66b3o7bo$158bobo68bobob4obbo$157bo73booboo$157boo 11bo60b6o$157boo10boo$169bobo$$172boo$172boo$$168boboo$167b4o$167bo3b oo4boo$172bobb3obo$179bo$171boo4bo$171boo4b3o$172bo3bobbo$172bo5b3o$ 173boo3b4o$181b5o$183b3oboo$180boobbo3bo$188boo$185booboo$187b3o$186bo bo$187bo8$217boobo7b3o$217bo3bo6bo$217bo4bo7bo7boo$219boo7bobo4boobo$ 221bobo4b3obobboo$227bo3boobboo$223boob4oboo$224b7o6$244b3o$244bo9boo$ 245bo6b3obo$247boobboo$248bo$252bo$248boo3bo$247boboboo5boobboboobo$ 247bobobbobooboo3boboobo$246bo4boo6bobo6bo$246boo9bo7boobo$246boo7b3o 10bo$254bo10bobbo$252bo4bo10bo$251boobbo10boo$252boo$252boo$252b3o$$ 252bobo$252bobo$252boboobo$252boobbobo$253bo5bo$253bo$258bo$256bo7$ 215bo$214boo$214bobo$$216b3o$215b3o$217bobo74bo$219b3o71b5o$219b3o71bo bboo$222bo72boobo$219bobbo$218bo3bo75bobo$214booboo3bo$213boo7bo68b3o 6b3o$215boboobbo64bo4bobb3o4b3o$221bo63boo5boob5ob3o$218bobo64bobo3b3o 4booboo$219bo77bobo$218bo68b3o6bobbo$217bobo66b3o7bo$217bobo68bobob4o bbo$216bo73booboo$216boo11bo60b6o$216boo10boo$228bobo$$231boo$231boo$$ 227boboo$226b4o$226bo3boo4boo$231bobb3obo$238bo$230boo4bo$230boo4b3o$ 231bo3bobbo$231bo5b3o$232boo3b4o$240b5o$242b3oboo$239boobbo3bo$247boo$ 244booboo$246b3o$245bobo$246bo8$276boobo7b3o$276bo3bo6bo$276bo4bo7bo7b oo$278boo7bobo4boobo$280bobo4b3obobboo$286bo3boobboo$282boob4oboo$283b 7o6$303b3o$303bo9boo$304bo6b3obo$306boobboo$307bo$311bo$307boo3bo$306b oboboo5boobboboobo$306bobobbobooboo3boboobo$305bo4boo6bobo6bo$305boo9b o7boobo$305boo7b3o10bo$313bo10bobbo$311bo4bo10bo$310boobbo10boo$311boo $311boo$311b3o$$311bobo$311bobo$311boboobo$311boobbobo$312bo5bo$312bo$ 317bo$315bo7$274bo$273boo$273bobo$$275b3o$274b3o$276bobo74bo$278b3o71b 5o$278b3o71bobboo$281bo72boobo$278bobbo$277bo3bo75bobo$273booboo3bo$ 272boo7bo68b3o6b3o$274boboobbo64bo4bobb3o4b3o$280bo63boo5boob5ob3o$ 277bobo64bobo3b3o4booboo$278bo77bobo$277bo68b3o6bobbo$276bobo66b3o7bo$ 276bobo68bobob4obbo$275bo73booboo$275boo72b6o$275boo4$296boo$295boo$ 297bo$299boo$298bo$$297bobbo$294boobo$293boo4bo$295bobobbo$300bo$297bo bbo$298bobo3bo$298bobo3boo$299boobbobbo$299bo4bobo$304bo$$303boo3bo$ 303boo3bo$304bo$304bo$305boo3$300bo46boo$299b5o31b3o9bobo$299bobboo31b obb3o6bo9bo$301boobo31bobo16boobo$341bo4boobbo3boobbo$304bobo32bo6boo bboboobbo$341boboobo3b5o$297b3o6b3o41boo$292bo4bobb3o4b3o32bobb6o$291b oo5boob5ob3o33b7o$291bobo3b3o4booboo36b3o$303bobo$293b3o6bobbo$292b3o 7bo$294bobob4obbo$296booboo$296b6o6$313b3o$313bo$316bo$313bobbo64bo$ 314bobbo62b5o$315bo64bobboo$317bobo62boobo$319boo$320bo64bobo$319boo$ 318b3o57b3o6b3o$313boobooboo52bo4bobb3o4b3o$313bo3boboo51boo5boob5ob3o $313bob3obbo51bobo3b3o4booboo$318boo64bobo$317b3o54b3o6bobbo$373b3o7bo $375bobob4obbo$316b3o58booboo$316b3o58b6o$$315boo$315bo55$404boo$404bo bo$404bo$407bo$407boo3bo$407boobbobo$408boboobbo$408boobob3o$408bobo3b oo$408bo5bo$394b3o17boo$394bo12boo$395bo10boboo$397b3o5bo4bo$398b6oboo 3bo$401bo4bo$400bobo4boo59boobo7b3o$399b3o66bo3bo6bo$398bo69bo4bo7bo7b oo$399bobo68boo7bobo4boobo$400b5o4b3o60bobo4b3obobboo$401boobo4bo68bo 3boobboo$412bo61boob4oboo20bo$409bobbo62b7o21boo$410bobbo89bobo$411bo$ 413bobo90boo$415boo89boobb3o$416bo93boobo$415boo91bo4bo$414b3o90b3o4bo $409boobooboo90bo5bo$409bo3boboo77boo12bobobboo$409bob3obbo76boo$414b oo79bo9b3o$413b3o81boo6booboo$497boobboobbob3o$500boobobboo$412b3o86bo 4boo$412b3o83boo3bo$498boo$411boo85bo$411bo87booboo$454boo45bobo$453b oo$455bo$457boo$456bo$$455bobbo$452boobo37boo$451boo4bo35bobb3o$453bob obbobb3o29bob4o$458bobbo26boo4bo3bobo$455bobbo3bo25bobboo9bo$456bobo3b o20bo4bo3bo7b3o$456bobobboo19boo5boobo3b7obo$457boobb3o18bobo3bo3boobb o$457bo28bo10bobbo3bo$463boboboboo14bo4bobbo6bo3bo$464boo3b3o13bobbo 11bobbo$465bo6bo$469boobo28bobo$470boo30bo$470boo$470boo$471bo8$513boo $501b3o9bobo$501bobb3o6bo9bo$502bobo16boobo$507bo4boobbo3boobbo$505bo 6boobboboobbo$507boboobo3b5o$516boo$508bobb6o$509b7o$511b3o3$529boo$ 529bobo$529bo8b3o$532bo3booboo$532boobo$535b3o$$532bo3bobo4bo$476bo54b oobob3o3b5ob4o$475boo54bo3bo8b3o4b3o$475bobo52boo5bo3bo4bob3o$530bo6bo bbobbo6bo$478boo51bo8bo10bo3bo$478boobb3o52boboobo7bo$482boobo50boo13b obbo$480bo4bo50bobo13bo$479b3o4bo$479bo5bo52bo$466boo12bobobboo49boo$ 465boo$467bo9b3o56boo$469boo6booboo54boobobo$469boobboobbob3o57bo3bo$ 472boobobboo56boo5bo$473bo4boo58b5o$470boo3bo$470boo$470bo$471booboo$ 473bobo6$497b3o$497bo$500bo$497bobbo$498bobbo$499bo78boo$501bobo73boo 3bo$503boo74boboo$504bo76b3o$503boo76bo$502b3o78b3o$497boobooboo71boob o4boo$497bo3boboo71boboo3bobo$497bob3obbo65boo4boboo3b3o$502boo65boo6b o5b3o$501b3o66bobo4boo4bobo$570b3o4boobboo$570boo6bobo$500b3o69bobo3b oo3bo$500b3o75b4o$574bobo$499boo75b4o$499bo76b4o$577boo$524boo$523boo$ 524bobo$524b3o$524boo$526bobo$$528bobo$530b3o$530bo$529bo609bo$524bob oobo4bo603boo$523booboobo602bo5bobo$523bobo4bo600boo$528boo601bobo3boo bobo$528bo3bo602bo7boo$527bo3bo602bo4bo5boo$1134bobbobb6o$527bobbo$ 526boobo$526bo613boobboo$525boo613bob4o$525bo614bo4bobo$526bo621bo$ 1147b3o$$1147bo$$1147boobo$1147boob4o$1148bobb4o$1149boo4$1109boo$ 1108boo$1110bo99b3o$1112boo96bo$1111bo91b3o6bo$1203bo6bobo$1110bobbo 90bo4boob4o$607boobo496boobo95b4ob5oboo$607bo3bo494boo4bo94boo7boobo$ 607bo4bo495bobobbobb3o$609boo502bobbo$611bobo496bobbo3bo95bobbo$1111bo bo3bo94b5obo$606bo6boo496bobobboo94bo6bo$605b5o4bobbo494boobb3o94boboo 3bo$599boo4bo6boo498bo108bo$599bobo11bo504boboboboo92bobo$599bo5boboo 6bobo501boo3b3o$600boo4bo4bobo506bo6bo91bobbo$600bobbo6b3o511boobo91bo bbo$600bo6booboo513boo93boboobo$602bobobobbo515boo93boobbobo$1125boo 94bo5bo$604bo4bo516bo94bo$605b4o617bo$1224bo3$586b3o$586bobb3o$587bobo $592bo$590bo$592bobo$585boobo6bo$584boo3bobbobbo$578b3o4bobbobbo3bo$ 578bo6bobbobbo3bo$581bo3bo6bobo$578bobbo8boo$579bobbo6b3o$580bo5bo3bo$ 582boboboobo$584boo$588bo3boo$591boo$585bobbo3bobo$592b3o$592boo699boo $594bobo684b3o9bobo$1281bobb3o6bo9bo$596bobo637bo45bobo16boobo$598b3o 634boo50bo4boobbo3boobbo$598bo636bobo47bo6boobboboobbo$597bo689boboobo 3b5o$592boboobo4bo634b3o56boo$591booboobo638b3o49bobb6o$591bobo4bo639b obo48b7o$596boo642b3o48b3o$596bo3bo639b3o$595bo3bo643bo$1240bobbo$595b obbo640bo3bo$594boobo637booboo3bo$594bo639boo7bo$593boo641boboobbo$ 593bo648bo$594bo644bobo$1240bo$1239bo$1238bobo$1238bobo$1135boo100bo$ 1135bobo99boo101bo10boo$1135bo101boo100b5o6boo$1138bo200bobboo8bo7boo$ 1138boo201boobo5boo6b3obo$1138boo210boo3boboo$1137boo205bobo6boo$1133b ooboo110boo99b3obo4bo$1133bo4bo108boo9bo87b3o3bo4bo$1133bob4o4boo104bo 6boobo87bo7bo$1137boo3boobo105boobboobbo87bo6bo$1137boo4bo107b4obbo$ 1137boo4bobo107b3o94bo$1139bobboobo108bo$1138boo110b3oboobo3boobo3boo$ 1138bo4bo3bo102b3obbobo3bo3boob3o$1139bo4bo4boo103bobbo3bo9bo$1145bobo 3boo96boo4bo7bobooboobo$1146bo5b3o94bo9boo8boo$1149b3o105bobo9boo$ 1151bo103b6o8boo$1152bo3bo98bobbo11bo$1151bo103bo$1152bobbo100bo$1153b o102bo$1256bo$$1255b3o$1255boobbo$1259bobo$1256bo3bobo$1195bo60b6o$ 1183boo9boo62b3o$1182boo3bo6bobo$1184boboo15b3o$1186b3o5bobo4booboo$ 1186bo6boobobobo$1188b3obo6boboo$1189boo7bo$1189boo5boo$1191b5o4$1211b o$1210boo$1210bobo7boo$1217boobo$1213boobboo76b3o$1213boobboo76bobb3o$ 1214boo80bobo76b3o$1214b4obo81bo73bo$1213boboboobobb3o4boo67bo68b3o6bo $1212boo9bobb3obooboo66bobo64bo6bobo$1212bobobb3obboo6bo3bo59boobo6bo 64bo4boob4o$1211bo11boo9boo57boo3bobbobbo66b4ob5oboo$1212boo7b3o7boob oo51b3o4bobbobbo3bo67boo7boobo37b3o$1221bobo9b3o51bo6bobbobbo3bo117bo$ 1217b3o12bobo55bo3bo6bobo119bo$1217bo15bo53bobbo8boo77bobbo43boo$1220b o67bobbo6b3o76b5obo42bo3boo$1217bo71bo5bo3bo77bo6bo44boo$1218bobo70bob oboobo79boboo3bo46boo$1218bobo72boo91bo39b6o$1297bo85bobo40bobboobo$ 1217boobo192boo13bo4bo$1217boob4o70bobbo38boo46bobbo25bobo10bo6bo$ 1218bobb4o110boo47bobbo25bo11bo$1219boo115bobo46boboobo25bo7boo3bo$ 1336b3o46boobbobo24boobboobobb3o$1336boo48bo5bo27bo5bo$1338bobo45bo33b obo3bo$1391bo26boboo3bo$1340bobo46bo27booboo$1342b3o72bobbo$1342bo76bo bo$1341bo77bobboo$1336boboobo4bo$1180boo153booboobo$1180bobo152bobo4bo $1180bo159boo33boo$1181boo157bo3bo30bobo$1181bobbo154bo3bo31bo$1181bo 196bo$1183bobo73boobo76bobbo35boo$1187bo71bo3bo74boobo36boo$1185bobbo 70bo4bo73bo34boobboo$1185bobbo72boo74boo33boobboo$1187b3o73bobo71bo35b oboboo$1183b3ob3o148bo34boobbo$1179b3oboobb3o68bo6boo107bob3o$1179bo7b oo68b5o4bobbo100boo5boo$1180bo6boo62boo4bo6boo85b3o15boo$1183b5o63bobo 11bo85bo19bobo$1185boo64bo5boboo6bobo82bo18boo3bo$1184boo66boo4bo4bobo 88boo15bo3boo71bo10boo$1184boo66bobbo6b3o90bo3boo10bo3bobo69b5o6boo$ 1183bobo66bo6booboo94boo11bo75bobboo8bo7boo$1182boo70bobobobbo99boo12b 5o69boobo5boo6b3obo$1182bobo170b6o11booboobb3o19bo56boo3boboo$1181bo 74bo4bo93bobboobo18bo19boo50bobo6boo$1182boo73b4o81boo13bo4bo11bo3bobo boo16bobo54b3obo4bo$1342bobo10bo6bo12bo78b3o3bo4bo$1342bo11bo21boboo 22b3o50bo7bo$1345bo7boo3bo42b3o51bo6bo$1345boobboobobb3o45bobo$1349bo 5bo49b3o50bo$1349bobo3bo49b3o$1347boboo3bo53bo$1346booboo54bobbo$1346b obbo54bo3bo$1348bobo49booboo3bo$1348bobboo46boo7bo$1401boboobbo$1407bo $1404bobo$1405bo$1404bo$1403bobo$1403bobo$1402bo$1402boo273bo10boo$ 1402boo272b5o6boo$1676bobboo8bo7boo$1678boobo5boo6b3obo$1687boo3boboo$ 1681bobo6boo$1413boo271b3obo4bo$1412boo9bo259b3o3bo4bo$1414bo6boobo 259bo7bo$1416boobboobbo259bo6bo$1416b4obbo$1270bo10boo135b3o266bo$ 1269b5o6boo137bo$1269bobboo8bo7boo123b3oboobo3boobo3boo$1271boobo5boo 6b3obo122b3obbobo3bo3boob3o$1205boo73boo3boboo130bobbo3bo9bo$1204boo 68bobo6boo129boo4bo7bobooboobo$1205bobo71b3obo4bo125bo9boo8boo$1205b3o 68b3o3bo4bo16b3o115bobo9boo$1205boo70bo7bo18bo115b6o8boo$1207bobo67bo 6bo20bo114bobbo11bo$1307boo111bo$1209bobo68bo27bo3boo107bo$1211b3o97b oo108bo$1211bo102boo105bo$1210bo97b6o$1205boboobo4bo92bobboobo105b3o$ 1204booboobo84boo13bo4bo104boobbo$1204bobo4bo83bobo10bo6bo108bobo$ 1209boo84bo11bo113bo3bobo$1209bo3bo84bo7boo3bo109b6o$1208bo3bo85boobb oobobb3o112b3o$1302bo5bo$1208bobbo90bobo3bo$1207boobo89boboo3bo$1207bo 91booboo$1206boo91bobbo$1206bo94bobo$1207bo93bobboo6$1255boo$1255bobo 37bo$1255bo38boo$1258bo35bob5o159b3o$1258boo30bo6bo4bo157bobb3o$1258b oo29b4o3bo5bo158bobo$1257boo30bobboo10bo161bo$1253booboo25b3o5bo6boob oobbo158bo$1253bo4bo24bo6bobbo3boobboo3bo159bobo$1253bob4o4boo19bo4b6o 4bobo157boobo6bo71bo$1257boo3boobo20b4oboboo6bobbobo151boo3bobbobbo70b 5o$1257boo4bo23boo12boo3bo145b3o4bobbobbo3bo70bobboo$1257boo4bobo36b3o 147bo6bobbobbo3bo72boobo$1259bobboobo36bo152bo3bo6bobo$1258boo44bo147b obbo8boo79bobo$1258bo4bo3bo36bo148bobbo6b3o122boobo$1259bo4bo4boo183bo 5bo3bo73b3o6b3o38bo3bo$1265bobo3boo183boboboobo69bo4bobb3o4b3o37bo4bo$ 1266bo5b3o183boo72boo5boob5ob3o10b3o26boo$1269b3o190bo69bobo3b3o4boob oo11bo30bobo$1271bo272bobo7b3o6bo$1272bo3bo182bobbo71b3o6bobbo7bo6bobo 23bo6boo$1271bo261b3o7bo11bo4boob4o19b5o4bobbo$1272bobbo259bobob4obbo 11b4ob5oboo10boo4bo6boo$1273bo263booboo16boo7boobo9bobo11bo$1537b6o37b o5boboo6bobo$1581boo4bo4bobo$1567bo5bo7bobbo6b3o$1567bobobob3o5bo6boob oo$1567boobo5bo6bobobobbo$1520boo47b8o$1315bo203boo3bo46b4o10bo4bo$ 1303boo9boo205boboo61b4o$1302boo3bo6bobo206b3o$1304boboo15b3o197bo$ 1306b3o5bobo4booboo199b3o$1306bo6boobobobo197boobo4boo$1308b3obo6boboo 195boboo3bobo74bo10boo$1309boo7bo193boo4boboo3b3o73b5o6boo$1309boo5boo 193boo6bo5b3o73bobboo8bo7boo$1311b5o196bobo4boo4bobo75boobo5boo6b3obo$ 1512b3o4boobboo87boo3boboo$1512boo6bobo83bobo6boo$1514bobo3boo3bo85b3o bo4bo$1331bo188b4o84b3o3bo4bo$1268b3o59boo184bobo90bo7bo$1268bo61bobo 7boo176b4o3boo82bo6bo$1269bo67boobo177b4o3bobo$1271boo60boobboo180boo 4bo86bo$1272bo3boo55boobboo187boo$1275boo57boo190bobbo$1278boo54b4obo 186bo$1272b6o55boboboobobb3o4boo176bobo$1272bobboobo53boo9bobb3obooboo 177bo$1259boo13bo4bo52bobobb3obboo6bo3bo175bobbo$1259bobo10bo6bo51bo 11boo9boo174bobbo$1259bo11bo60boo7b3o7booboo176b3o$1262bo7boo3bo65bobo 9b3o172b3ob3o$1262boobboobobb3o62b3o12bobo169b3oboobb3o$1266bo5bo64bo 15bo170bo7boo$1266bobo3bo67bo184bo6boo$1264boboo3bo65bo190b5o$1263boob oo70bobo189boo$1263bobbo71bobo188boo239b3o$1265bobo261boo239bo$1265bo bboo67boobo187bobo232b3o6bo$1337boob4o183boo234bo6bobo$1338bobb4o182bo bo234bo4boob4o$1339boo185bo239b4ob5oboo$1527boo238boo7boobo3$1773bobbo $1772b5obo$1772bo6bo$1773boboo3bo$1781bo$1778bobo$$1299boo372boo104bo bbo$1298boo372boo105bobbo$1299bobo371bobo104boboobo43b3o$1299b3o371b3o 104boobbobo42bo$1299boo372boo106bo5bo42bo$1301bobo75boobo292bobo103bo 50boo$1379bo3bo402bo46bo3boo$1303bobo73bo4bo292bobo104bo51boo$1305b3o 73boo296b3o157boo$1305bo77bobo293bo153b6o$1304bo373bo154bobboobo$1299b oboobo4bo68bo6boo286boboobo4bo136boo13bo4bo$1298booboobo72b5o4bobbo 282booboobo141bobo10bo6bo$1298bobo4bo65boo4bo6boo286bobo4bo140bo11bo$ 1303boo66bobo11bo291boo33boo109bo7boo3bo$1303bo3bo63bo5boboo6bobo287bo 3bo30bobo108boobboobobb3o$1302bo3bo65boo4bo4bobo290bo3bo31bo114bo5bo$ 1372bobbo6b3o330bo111bobo3bo$1302bobbo66bo6booboo292bobbo35boo108boboo 3bo$1301boobo69bobobobbo232boo59boobo36boo107booboo$1301bo311boo3bo56b o34boobboo108bobbo$1300boo74bo4bo233boboo55boo33boobboo111bobo$1300bo 76b4o236b3o54bo35boboboo110bobboo$1301bo315bo57bo34boobbo$1619b3o89bob 3o$1612boobo4boo85boo5boo$1612boboo3bobo66b3o15boo$1606boo4boboo3b3o 66bo19bobo$1605boo6bo5b3o67bo18boo3bo$1606bobo4boo4bobo69boo15bo3boo 129bo10boo$1606b3o4boobboo73bo3boo10bo3bobo127b5o6boo$1606boo6bobo78b oo11bo133bobboo8bo7boo$1608bobo3boo3bo78boo12b5o127boobo5boo6b3obo$ 1614b4o74b6o11booboobb3o77bo56boo3boboo$1610bobo79bobboobo18bo77boo50b obo6boo$1612b4o63boo13bo4bo11bo3boboboo74bobo54b3obo4bo$1612b4o63bobo 10bo6bo12bo136b3o3bo4bo$1613boo64bo11bo21boboo80b3o50bo7bo$1682bo7boo 3bo100b3o51bo6bo$1682boobboobobb3o103bobo$1686bo5bo107b3o50bo$1686bobo 3bo107b3o$1684boboo3bo111bo$1683booboo112bobbo$1683bobbo112bo3bo$1685b obo107booboo3bo$1685bobboo104boo7bo$1796boboobbo$1802bo$1799bobo$1800b o$1799bo$1798bobo$1798bobo$1797bo$1797boo275bo10boo$1658boo137boo274b 5o6boo$1657boo3bo410bobboo8bo7boo$1659boboo412boobo5boo6b3obo$1661b3o 420boo3boboo$1661bo416bobo6boo$1663b3o142boo273b3obo4bo$1656boobo4boo 141boo9bo261b3o3bo4bo$1656boboo3bobo143bo6boobo261bo7bo$1407bo242boo4b oboo3b3o145boobboobbo261bo6bo$1406b5o238boo6bo5b3o145b4obbo$1406bobboo 239bobo4boo4bobo147b3o268bo$1408boobo238b3o4boobboo151bo$1650boo6bobo 149b3oboobo3boobo3boo$1411bobo238bobo3boo3bo146b3obbobo3bo3boob3o$ 1658b4o152bobbo3bo9bo$1404b3o6b3o238bobo152boo4bo7bobooboobo$1399bo4bo bb3o4b3o239b4o149bo9boo8boo$1398boo5boob5ob3o239b4o157bobo9boo$1398bob o3b3o4booboo241boo156b6o8boo$1410bobo402bobbo11bo$1400b3o6bobbo402bo$ 1399b3o7bo16boo388bo$1401bobob4obbobb3o9bobo387bo$1403booboo6bobb3o6bo 9bo379bo$1403b6o6bobo16boobo$1420bo4boobbo3boobbo377b3o$1418bo6boobbob oobbo379boobbo$1420boboobo3b5o385bobo$1429boo385bo3bobo$1386boo33bobb 6o386b6o$1385boo3bo31b7o389b3o$1387boboo33b3o$1389b3o$1389bo$1391b3o$ 1384boobo4boo$1384boboo3bobo$1378boo4boboo3b3o$1377boo6bo5b3o$1378bobo 4boo4bobo$1378b3o4boobboo$1378boo6bobo$1380bobo3boo3bo$1386b4o$1382bob o$1384b4o$1384b4o467b3o$1385boo468bobb3o$1856bobo$1861bo$1859bo$1388b oo471bobo$1388bobo463boobo6bo$1388bo464boo3bobbobbo$1391bo455b3o4bobbo bbo3bo$1391boo454bo6bobbobbo3bo$1391boo457bo3bo6bobo$1390boo455bobbo8b oo$1386booboo457bobbo6b3o$1386bo4bo457bo5bo3bo$1386bob4o459boboboobo$ 1390boo461boo$1390boo465bo$1390boo$1392bobb3o456bobbo$1391boo4bo$1391b o4bobo$1392bo4boo$1396boboo$1398boo$1395booboo$1396boboo$1396bobo$ 1397boo4$1391b3o$1391bobb3o$1392bobo$1397bo$1395bo$1397bobo$1390boobo 6bo$1389boo3bobbobbo$1383b3o4bobbobbo3bo$1383bo6bobbobbo3bo$1386bo3bo 6bobo$1383bobbo8boo$1384bobbo6b3o$1385bo5bo3bo$1387boboboobo$1389boo$ 1393bo$$1390bobbo3$1406boo$1405boo$1406bobo$1406b3o$1406boo67bo$1408bo bo63b5o$1474bobboo$1410bobo63boobo$1412b3o$1412bo66bobo$1411bo$1406bob oobo4bo55b3o6b3o$1405booboobo55bo4bobb3o4b3o$1405bobo4bo53boo5boob5ob 3o$1410boo54bobo3b3o4booboo$1410bo3bo63bobo$1409bo3bo54b3o6bobbo$1467b 3o7bo$1409bobbo56bobob4obbo$1408boobo59booboo$1408bo62b6o$1407boo$ 1407bo$1408bo$2006bo$2005b5o$2005bobboo$2007boobo$$2010bobo$$2003b3o6b 3o$1998bo4bobb3o4b3o$1997boo5boob5ob3o$1997bobo3b3o4booboo$2009bobo$ 1999b3o6bobbo19bo$1998b3o7bo10boo9boo$2000bobob4obbo7boo3bo6bobo164b3o $2002booboo13boboo15b3o155bo$2002b6o14b3o5bobo4booboo148b3o6bo$2022bo 6boobobobo153bo6bobo$2024b3obo6boboo152bo4boob4o$2025boo7bo19boo137b4o b5oboo$2025boo5boo20bobo137boo7boobo$1985boo40b5o22bo$1984boo3bo67bo$ 1986boboo67boo3bo137bobbo$1512bo475b3o66boobbobo135b5obo$1511b5o472bo 69boboobbo134bo6bo$1511bobboo474b3o65boobob3o134boboo3bo$1513boobo466b oobo4boo65bobo3boo142bo$1983boboo3bobo65bo5bo140bobo$1516bobo458boo4bo boo3b3o51b3o17boo$1976boo6bo5b3o51bo12boo11boo134bobbo44b3o$1509b3o6b 3o456bobo4boo4bobo52bo10boboo9boo135bobbo44bo$1504bo4bobb3o4b3o455b3o 4boobboo57b3o5bo4bo9bobo134boboobo42bo$1503boo5boob5ob3o455boo6bobo60b 6oboo3bo9b3o134boobbobo43boo$1503bobo3b3o4booboo458bobo3boo3bo60bo4bo 13boo136bo5bo43bo3boo$1515bobo467b4o61bobo4boo13bobo133bo52boo$1505b3o 6bobbo463bobo65b3o161bo50boo$1504b3o7bo468b4o3boo56bo25bobo134bo46b6o$ 1506bobob4obbo466b4o3bobo56bobo24b3o179bobboobo$1508booboo471boo4bo59b 5o21bo168boo13bo4bo$1508b6o477boo58boobo20bo169bobo10bo6bo$1991bobbo 75boboobo4bo164bo11bo$1991bo77booboobo172bo7boo3bo$1993bobo73bobo4bo 171boobboobobb3o$1997bo76boo33boo141bo5bo$1995bobbo75bo3bo30bobo140bob o3bo$1995bobbo74bo3bo31bo140boboo3bo$1448bo10boo536b3o44boobbo63bo136b ooboo$1447b5o6boo533b3ob3o43boo4bo23bobbo35boo135bobbo$1447bobboo8bo7b oo519b3oboobb3o44bobo25boobo36boo137bobo$1449boobo5boo6b3obo518bo7boo 40boobb5oboo21bo34boobboo138bobboo$1325boo131boo3boboo523bo6boo39boobb 3o5boobo17boo33boobboo$1324boo126bobo6boo530b5o35boo4boboboo3boo21bo 35boboboo$1325bobo129b3obo4bo528boo36bobo3boobbo3b4obboo17bo34boobbo$ 1325b3o126b3o3bo4bo16b3o509boo37bo6bob3obbo6bo53bob3o$1325boo128bo7bo 18bo511boo40bo6boo59boo5boo$1327bobo125bo6bo20bo509bobo40boo12b3oboo 29b3o15boo$1485boo505boo91bo19bobo$1329bobo126bo27bo3boo500bobo58bo32b o18boo3bo$1331b3o155boo500bo61bo34boo15bo3boo159bo10boo$1331bo160boo 498boo59bo35bo3boo10bo3bobo157b5o6boo$1330bo155b6o600boo11bo163bobboo 8bo7boo$1325boboobo4bo150bobboobo602boo12b5o157boobo5boo6b3obo$1324boo boobo142boo13bo4bo595b6o11booboobb3o107bo56boo3boboo$1324bobo4bo141bob o10bo6bo595bobboobo18bo107boo50bobo6boo$1329boo142bo11bo590boo13bo4bo 11bo3boboboo104bobo54b3obo4bo$1329bo3bo142bo7boo3bo586bobo10bo6bo12bo 166b3o3bo4bo$1328bo3bo143boobboobobb3o587bo11bo21boboo110b3o50bo7bo$ 1480bo5bo592bo7boo3bo130b3o51bo6bo$1328bobbo148bobo3bo592boobboobobb3o 133bobo$1327boobo147boboo3bo597bo5bo137b3o50bo$1327bo149booboo601bobo 3bo137b3o$1326boo149bobbo600boboo3bo141bo$1326bo152bobo598booboo142bo bbo$1327bo151bobboo596bobbo142bo3bo$2082bobo137booboo3bo$2082bobboo 134boo7bo$2223boboobbo$2229bo$2226bobo$2227bo$1473bo752bo$1472boo751bo bo$1472bob5o746bobo$1468bo6bo4bo743bo$1467b4o3bo5bo743boo93bo10boo$ 1467bobboo10bo741boo92b5o6boo$1461b3o5bo6booboobbo834bobboo8bo7boo$ 1461bo6bobbo3boobboo3bo835boobo5boo6b3obo$1462bo4b6o4bobo849boo3boboo$ 1464b4oboboo6bobbobo838bobo6boo$1465boo12boo3bo750boo91b3obo4bo$1480b 3o751boo9bo79b3o3bo4bo$1480bo755bo6boobo79bo7bo$1482bo755boobboobbo79b o6bo$1482bo755b4obbo$2240b3o86bo$2241bo$2237b3oboobo3boobo3boo$2237b3o bbobo3bo3boob3o$2241bobbo3bo9bo$2236boo4bo7bobooboobo$2236bo9boo8boo$ 2244bobo9boo$2242b6o8boo$2242bobbo11bo$2242bo$2243bo$2243bo$2243bo$$ 2242b3o$2242boobbo$2246bobo$2243bo3bobo$2243b6o$2245b3o16$2282b3o$ 2282bobb3o$2283bobo$2288bo$2286bo$2288bobo$1433boo846boobo6bo$1433bobo 844boo3bobbobbo$1433bo840b3o4bobbobbo3bo$1436bo837bo6bobbobbo3bo$1436b oo839bo3bo6bobo$1436boo836bobbo8boo$1435boo838bobbo6b3o$1431booboo840b o5bo3bo$1431bo4bo841boboboobo$1431bob4o4boo837boo$1435boo3boobo840bo$ 1435boo4bo$1435boo4bobo837bobbo$1437bobboobo$1436boo$1436bo4bo3bo$ 1437bo4bo4boo$1443bobo3boo$1444bo5b3o$1447b3o$1449bo$1450bo3bo$1449bo$ 1450bobbo$1451bo7$1493bo$1481boo9boo$1480boo3bo6bobo$1482boboo15b3o$ 1484b3o5bobo4booboo$1484bo6boobobobo$1486b3obo6boboo$1487boo7bo$1487b oo5boo$1489b5o4$1509bo$1508boo$1508bobo7boo$1515boobo$1511boobboo$ 1511boobboo$1512boo$1512b4obo$1511boboboobobb3o4boo$1510boo9bobb3oboob oo$1510bobobb3obboo6bo3bo$1509bo11boo9boo$1510boo7b3o7booboo$1458b3o 58bobo9b3o$1458bo56b3o12bobo$1459bo55bo15bo$1461boo55bo$1462bo3boo47bo $1465boo49bobo$1468boo46bobo$1462b6o$1462bobboobo46boobo$1449boo13bo4b o45boob4o$1449bobo10bo6bo46bobb4o$1449bo11bo55boo$1452bo7boo3bo$1452b oobboobobb3o$1456bo5bo$1456bobo3bo$1454boboo3bo$1453booboo$1453bobbo$ 1455bobo$1455bobboo$$1477boo$1476boo$1477bobo$1477b3o$1477boo$1479bobo 75boobo$1557bo3bo$1481bobo73bo4bo$1483b3o73boo$1483bo77bobo$1482bo$ 1477boboobo4bo68bo6boo$1476booboobo72b5o4bobbo$1476bobo4bo65boo4bo6boo $1481boo66bobo11bo$1481bo3bo63bo5boboo6bobo$1480bo3bo65boo4bo4bobo$ 1550bobbo6b3o$1480bobbo66bo6booboo$1479boobo69bobobobbo901bo$1479bo 980b5o$1478boo74bo4bo900bobboo$1478bo76b4o903boobo$1479bo$2465bobo$$ 2458b3o6b3o$2453bo4bobb3o4b3o$2452boo5boob5ob3o$2452bobo3b3o4booboo$ 2464bobo$2454b3o6bobbo$2453b3o7bo38boo$2455bobob4obbo24b3o9bobo$2457b ooboo28bobb3o6bo9bo$2457b6o28bobo16boobo$2496bo4boobbo3boobbo$2494bo6b oobboboobbo$2496boboobo3b5o$2505boo$2440boo55bobb6o$2439boo3bo53b7o$ 2441boboo55b3o$2443b3o$2443bo$2445b3o$2438boobo4boo$2438boboo3bobo$ 2432boo4boboo3b3o$2431boo6bo5b3o$2432bobo4boo4bobo$2432b3o4boobboo$ 2432boo6bobo$2434bobo3boo3bo$2440b4o$2436bobo$2438b4o$2438b4o$2439boo 19$2514b3o$2514bo$2507b3o6bo$2507bo6bobo$2508bo4boob4o$2510b4ob5oboo$ 2511boo7boobo3$2517bobbo$2516b5obo$2516bo6bo$2517boboo3bo$2525bo$2522b obo$$2315boo206bobbo44b3o$2314boo207bobbo44bo$2315bobo206boboobo42bo$ 2315b3o206boobbobo43boo$2315boo208bo5bo43bo3boo$2317bobo205bo52boo$ 2530bo50boo$2319bobo206bo46b6o$2321b3o251bobboobo$2321bo240boo13bo4bo$ 2320bo241bobo10bo6bo$2315boboobo4bo236bo11bo$2314booboobo244bo7boo3bo$ 2314bobo4bo243boobboobobb3o$2319boo33boo213bo5bo$2319bo3bo30bobo212bob o3bo$2318bo3bo31bo212boboo3bo$2357bo208booboo$2318bobbo35boo207bobbo$ 2317boobo36boo209bobo$2317bo34boobboo210bobboo$2316boo33boobboo$2316bo 35boboboo$2317bo34boobbo$2353bob3o$2349boo5boo$2330b3o15boo$2330bo19bo bo$2331bo18boo3bo$2333boo15bo3boo231bo10boo$2334bo3boo10bo3bobo229b5o 6boo$2337boo11bo235bobboo8bo7boo$2340boo12b5o229boobo5boo6b3obo$2334b 6o11booboobb3o179bo56boo3boboo$2334bobboobo18bo179boo50bobo6boo$2321b oo13bo4bo11bo3boboboo176bobo54b3obo4bo$2321bobo10bo6bo12bo238b3o3bo4bo $2321bo11bo21boboo182b3o50bo7bo$2324bo7boo3bo202b3o51bo6bo$2324boobboo bobb3o205bobo$2328bo5bo209b3o50bo$1655bo672bobo3bo209b3o$1654b5o667bob oo3bo213bo$1654bobboo666booboo214bobbo$1656boobo665bobbo214bo3bo$2327b obo209booboo3bo$1659bobo665bobboo206boo7bo$2540boboobbo$1652b3o6b3o 882bo$1647bo4bobb3o4b3o878bobo$1646boo5boob5ob3o879bo$1646bobo3b3o4boo boo879bo$1658bobo881bobo$1648b3o6bobbo881bobo$1647b3o7bo16boo865bo$ 1649bobob4obbobb3o9bobo864boo93bo10boo$1651booboo6bobb3o6bo9bo856boo 92b5o6boo$1651b6o6bobo16boobo949bobboo8bo7boo$1668bo4boobbo3boobbo951b oobo5boo6b3obo$1666bo6boobboboobbo962boo3boboo$1668boboobo3b5o958bobo 6boo$1677boo873boo91b3obo4bo$1634boo33bobb6o873boo9bo79b3o3bo4bo$1633b oo3bo31b7o876bo6boobo79bo7bo$1635boboo33b3o880boobboobbo79bo6bo$1637b 3o915b4obbo$1637bo919b3o86bo$1639b3o916bo$1632boobo4boo912b3oboobo3boo bo3boo$1632boboo3bobo912b3obbobo3bo3boob3o$1626boo4boboo3b3o916bobbo3b o9bo$1625boo6bo5b3o911boo4bo7bobooboobo$1626bobo4boo4bobo911bo9boo8boo $1626b3o4boobboo922bobo9boo$1626boo6bobo922b6o8boo$1628bobo3boo3bo919b obbo11bo$1634b4o921bo$1630bobo927bo$1632b4o924bo$1632b4o924bo$1633boo$ 2559b3o$2559boobbo$1639bo923bobo$1638boo920bo3bobo$1638bobo919b6o$ 2562b3o$1640b3o$1639b3o$1641bobo$1643b3o$1643b3o$1646bo$1643bobbo$ 1642bo3bo$1638booboo3bo$1637boo7bo$1639boboobbo$1645bo31b3o$1642bobo 32bo$1643bo34bo$1642bo37boo$1641bobo37bo917b3o$1641bobo32bo922bobb3o$ 1640bo34b4o921bobo$1640boo33bobboo925bo$1640boo35bo925bo$1676bobbo925b obo$1673bob6o917boobo6bo$1654boo16b6oboo916boo3bobbobbo$1654bobo15bobb o915b3o4bobbobbo3bo$1654bo19boo915bo6bobbobbo3bo$1657bo17bobboo914bo3b o6bobo$1657boo3bo9bo4boo912bobbo8boo$1657boobbobo9boboboo913bobbo6b3o$ 1658boboobbo10boobobbo911bo5bo3bo$1658boobob3o10bo4bo913boboboobo$ 1658bobo3boo15bo915boo$1658bo5bo11bobo4b3o915bo$1644b3o17boo12boobo$ 1644bo12boo22bo916bobbo$1645bo10boboo$1647b3o5bo4bo$1648b6oboo3bo$ 1651bo4bo$1650bobo4boo$1649b3o$1648bo$1649bobo$1650b5o$1651boobo4$ 1656bo10boo$1655b5o6boo$1655bobboo8bo7boo$1657boobo5boo6b3obo$1503boo 161boo3boboo$1502boo156bobo6boo$1503bobo159b3obo4bo$1503b3o156b3o3bo4b o16b3o$1503boo158bo7bo18bo$1505bobo155bo6bo20bo$1693boo$1507bobo156bo 27bo3boo$1509b3o185boo$1509bo190boo$1508bo185b6o$1503boboobo4bo180bobb oobo$1502booboobo172boo13bo4bo$1502bobo4bo171bobo10bo6bo$1507boo172bo 11bo$1507bo3bo172bo7boo3bo$1506bo3bo173boobboobobb3o$1688bo5bo$1506bo bbo178bobo3bo$1505boobo177boboo3bo$1505bo179booboo$1504boo179bobbo$ 1504bo182bobo$1505bo181bobboo7$1681bo$1680boo$1680bob5o$1676bo6bo4bo$ 1675b4o3bo5bo$1675bobboo10bo$1669b3o5bo6booboobbo$1669bo6bobbo3boobboo 3bo$1670bo4b6o4bobo$1672b4oboboo6bobbobo$1673boo12boo3bo$1688b3o$1688b o$1690bo$1690bo73$1641boo$1641bobo$1641bo$1644bo$1644boo$1644boo$1643b oo$1639booboo$1639bo4bo$1639bob4o4boo$1643boo3boobo$1643boo4bo$1643boo 4bobo$1645bobboobo$1644boo$1644bo4bo3bo$1645bo4bo4boo$1651bobo3boo$ 1652bo5b3o$1655b3o$1657bo$1658bo3bo$1657bo$1658bobbo1188bo$1659bo1189b 5o$2849bobboo$2851boobo$$2854bobo$$2847b3o6b3o$1701bo1140bo4bobb3o4b3o $1689boo9boo1139boo5boob5ob3o$1688boo3bo6bobo1138bobo3b3o4booboo$1690b oboo15b3o1141bobo$1692b3o5bobo4booboo1131b3o6bobbo$1692bo6boobobobo 1135b3o7bo38boo$1694b3obo6boboo1135bobob4obbo24b3o9bobo$1695boo7bo 1141booboo28bobb3o6bo9bo$1695boo5boo1142b6o28bobo16boobo$1697b5o1183bo 4boobbo3boobbo$2883bo6boobboboobbo$2885boboobo3b5o$2894boo$1717bo1111b oo55bobb6o$1716boo1110boo3bo53b7o$1716bobo7boo1102boboo55b3o$1723boobo 1105b3o$1719boobboo1107bo$1719boobboo1109b3o$1720boo1105boobo4boo$ 1720b4obo1101boboo3bobo$1719boboboobobb3o4boo1083boo4boboo3b3o$1718boo 9bobb3obooboo1079boo6bo5b3o$1718bobobb3obboo6bo3bo1080bobo4boo4bobo$ 1664b3o50bo11boo9boo1079b3o4boobboo$1664bo53boo7b3o7booboo1079boo6bobo $1665bo61bobo9b3o1081bobo3boo3bo$1667boo54b3o12bobo1088b4o$1668bo3boo 49bo15bo1085bobo$1671boo53bo1100b4o$1674boo47bo1103b4o$1668b6o50bobo 1101boo$1668bobboobo49bobo1158b3o$1655boo13bo4bo1209bo$1655bobo10bo6bo 47boobo1151b3o6bo$1655bo11bo55boob4o1148bo6bobo$1658bo7boo3bo52bobb4o 1148bo4boob4o$1658boobboobobb3o54boo1154b4ob5oboo$1662bo5bo1213boo7boo bo$1662bobo3bo$1660boboo3bo$1659booboo1224bobbo$1659bobbo1224b5obo$ 1661bobo1223bo6bo$1661bobboo1222boboo3bo$2896bo$2893bobo$$1685boo945b oo260bobbo44b3o$1684boo945boo261bobbo44bo$1685bobo944bobo260boboobo42b o$1685b3o944b3o260boobbobo43boo$1685boo945boo262bo5bo43bo3boo$1687bobo 75boobo865bobo259bo52boo$1765bo3bo1131bo50boo$1689bobo73bo4bo865bobo 260bo46b6o$1691b3o73boo869b3o305bobboobo$1691bo77bobo866bo294boo13bo4b o$1690bo946bo295bobo10bo6bo$1685boboobo4bo68bo6boo859boboobo4bo290bo 11bo$1684booboobo72b5o4bobbo855booboobo298bo7boo3bo$1684bobo4bo65boo4b o6boo859bobo4bo297boobboobobb3o$1689boo66bobo11bo864boo33boo267bo5bo$ 1689bo3bo63bo5boboo6bobo860bo3bo30bobo266bobo3bo$1688bo3bo65boo4bo4bob o863bo3bo31bo266boboo3bo$1758bobbo6b3o903bo262booboo$1688bobbo66bo6boo boo865bobbo35boo261bobbo$1687boobo69bobobobbo866boobo36boo263bobo$ 1687bo946bo34boobboo264bobboo$1686boo74bo4bo865boo33boobboo$1686bo76b 4o866bo35boboboo$1687bo946bo34boobbo$2670bob3o$2666boo5boo$2647b3o15b oo$2647bo19bobo$2648bo18boo3bo$2650boo15bo3boo285bo10boo$2651bo3boo10b o3bobo283b5o6boo$2654boo11bo289bobboo8bo7boo$2657boo12b5o283boobo5boo 6b3obo$2651b6o11booboobb3o233bo56boo3boboo$2651bobboobo18bo233boo50bob o6boo$2638boo13bo4bo11bo3boboboo230bobo54b3obo4bo$2638bobo10bo6bo12bo 292b3o3bo4bo$2638bo11bo21boboo236b3o50bo7bo$2641bo7boo3bo256b3o51bo6bo $2641boobboobobb3o259bobo$2645bo5bo263b3o50bo$2645bobo3bo263b3o$2643bo boo3bo267bo$2642booboo268bobbo$2642bobbo268bo3bo$1936bo10boo695bobo 263booboo3bo$1935b5o6boo696bobboo260boo7bo$1935bobboo8bo7boo953boboobb o$1937boobo5boo6b3obo958bo$1711boo233boo3boboo959bobo$1710boo228bobo6b oo964bo$1711bobo231b3obo4bo959bo$1711b3o228b3o3bo4bo16b3o940bobo$1711b oo230bo7bo18bo942bobo$1713bobo227bo6bo20bo940bo$1973boo937boo79boo$ 1715bobo228bo27bo3boo932boo67b3o9bobo$1717b3o257boo1002bobb3o6bo9bo$ 1717bo262boo1000bobo16boobo$1716bo257b6o1007bo4boobbo3boobbo$1711boboo bo4bo252bobboobo1004bo6boobboboobbo$1710booboobo244boo13bo4bo941boo62b oboobo3b5o$1710bobo4bo243bobo10bo6bo940boo9bo62boo$1715boo244bo11bo 950bo6boobo53bobb6o$1715bo3bo244bo7boo3bo948boobboobbo54b7o$1714bo3bo 245boobboobobb3o949b4obbo58b3o$1968bo5bo953b3o$1714bobbo250bobo3bo954b o$1713boobo249boboo3bo951b3oboobo3boobo3boo$1713bo251booboo955b3obbobo 3bo3boob3o$1712boo251bobbo960bobbo3bo9bo$1712bo254bobo954boo4bo7boboob oobo$1713bo253bobboo952bo9boo8boo$2932bobo9boo$2930b6o8boo$2930bobbo 11bo$2930bo$2931bo$2931bo$1961bo969bo$1960boo$1960bob5o963b3o$1956bo6b o4bo961boobbo$1955b4o3bo5bo965bobo$1955bobboo10bo960bo3bobo$1949b3o5bo 6booboobbo959b6o$1949bo6bobbo3boobboo3bo960b3o$1950bo4b6o4bobo$1952b4o boboo6bobbobo$1953boo12boo3bo$1968b3o$1968bo$1970bo$1970bo9$2970b3o$ 2970bobb3o$2971bobo$2976bo$2974bo$2976bobo$2969boobo6bo$2968boo3bobbo bbo$2962b3o4bobbobbo3bo$2962bo6bobbobbo3bo$2965bo3bo6bobo$2962bobbo8b oo$2963bobbo6b3o$2964bo5bo3bo$2966boboboobo$2968boo$2972bo$$2969bobbo 42$1891bo$1890b5o$1890bobboo$1892boobo$$1895bobo$$1888b3o6b3o$1883bo4b obb3o4b3o$1882boo5boob5ob3o$1882bobo3b3o4booboo$1894bobo$1884b3o6bobbo $1883b3o7bo$1885bobob4obbo$1887booboo$1887b6o5$1870boo$1869boo3bo$ 1871boboo$1873b3o$1873bo$1875b3o$1868boobo4boo$1868boboo3bobo$1862boo 4boboo3b3o$1861boo6bo5b3o$1862bobo4boo4bobo$1862b3o4boobboo$1862boo6bo bo$1864bobo3boo3bo$1870b4o$1866bobo$1868b4o$1868b4o$1869boo20$1875boo$ 1875bobo$1875bo$1876boo$1876bobbo$1876bo$1878bobo$1882bo$1880bobbo$ 1880bobbo$1882b3o$1878b3ob3o$1874b3oboobb3o$1874bo7boo$1875bo6boo$ 1878b5o$1880boo$1879boo40boo$1879boo40bobo$1878bobo40bo$1877boo45bo$ 1877bobo44boo$1876bo47boo$1877boo44boo$1919booboo$1919bo4bo$1919bob4o 4boo$1923boo3boobo$1923boo4bo$1923boo4bobo$1925bobboobo$1924boo$1924bo 4bo3bo$1925bo4bo4boo$1931bobo3boo$1932bo5b3o$1935b3o$1937bo$1938bo3bo$ 1937bo$1938bobbo$1939bo7$1981bo$1969boo9boo$1968boo3bo6bobo$1970boboo 15b3o$1972b3o5bobo4booboo$1972bo6boobobobo$1974b3obo6boboo$1975boo7bo$ 1975boo5boo$1977b5o4$1997bo$1996boo$1996bobo7boo$2003boobo$1999boobboo $1999boobboo$2000boo$2000b4obo$1999boboboobobb3o4boo$1998boo9bobb3oboo boo$1998bobobb3obboo6bo3bo$1944b3o50bo11boo9boo$1944bo53boo7b3o7booboo $1945bo61bobo9b3o$1947boo54b3o12bobo$1948bo3boo49bo15bo$1951boo53bo$ 1954boo47bo$1948b6o50bobo$1948bobboobo49bobo$1935boo13bo4bo$1935bobo 10bo6bo47boobo$1935bo11bo55boob4o$1938bo7boo3bo52bobb4o$1938boobboobo bb3o54boo$1942bo5bo$1942bobo3bo$1940boboo3bo$1939booboo$1939bobbo$ 1941bobo$1941bobboo4$1965boo$1964boo$1965bobo$1965b3o$1965boo$1967bobo 75boobo$2045bo3bo$1969bobo73bo4bo$1971b3o73boo$1971bo77bobo$1970bo$ 1965boboobo4bo68bo6boo$1964booboobo72b5o4bobbo$1964bobo4bo65boo4bo6boo $1969boo66bobo11bo$1969bo3bo63bo5boboo6bobo1219bo$1968bo3bo65boo4bo4bo bo1222b5o$2038bobbo6b3o1223bobboo$1968bobbo66bo6booboo1226boobo$1967b oobo69bobobobbo$1967bo1311bobo$1966boo74bo4bo$1966bo76b4o1225b3o6b3o$ 1967bo1299bo4bobb3o4b3o$3266boo5boob5ob3o$3266bobo3b3o4booboo$3278bobo $3268b3o6bobbo$3267b3o7bo$3269bobob4obbo$3271booboo$3271b6o5$3254boo$ 3253boo3bo$3255boboo$3257b3o$3257bo$3259b3o$3252boobo4boo$3252boboo3bo bo$3246boo4boboo3b3o$2270bo10boo962boo6bo5b3o$2269b5o6boo964bobo4boo4b obo$2269bobboo8bo7boo954b3o4boobboo$2271boobo5boo6b3obo953boo6bobo$ 1991boo287boo3boboo959bobo3boo3bo$1990boo282bobo6boo969b4o$1991bobo 285b3obo4bo961bobo$1991b3o282b3o3bo4bo16b3o945b4o$1991boo284bo7bo18bo 947b4o$1993bobo281bo6bo20bo947boo$2307boo$1995bobo282bo27bo3boo$1997b 3o311boo$1997bo316boo$1996bo311b6o$1991boboobo4bo306bobboobo$1990boob oobo298boo13bo4bo$1990bobo4bo297bobo10bo6bo$1995boo298bo11bo$1995bo3bo 298bo7boo3bo$1994bo3bo299boobboobobb3o$2302bo5bo$1994bobbo304bobo3bo$ 1993boobo303boboo3bo$1993bo305booboo$1992boo305bobbo$1992bo308bobo$ 1993bo307bobboo7$2295bo$2294boo$2294bob5o$2290bo6bo4bo$2289b4o3bo5bo$ 2289bobboo10bo$2283b3o5bo6booboobbo$2283bo6bobbo3boobboo3bo$2284bo4b6o 4bobo$2286b4oboboo6bobbobo$2287boo12boo3bo$2302b3o$2302bo$2304bo$2304b o141$2243bo$2242b5o$2242bobboo$2244boobo$$2247bobo$$2240b3o6b3o$2235bo 4bobb3o4b3o$2234boo5boob5ob3o$2234bobo3b3o4booboo$2246bobo$2236b3o6bo bbo$2235b3o7bo$2237bobob4obbo$2239booboo$2239b6o5$2222boo$2221boo3bo$ 2223boboo$2225b3o$2225bo$2227b3o$2220boobo4boo$2220boboo3bobo$2214boo 4boboo3b3o$2213boo6bo5b3o$2214bobo4boo4bobo$2214b3o4boobboo$2214boo6bo bo$2216bobo3boo3bo$2222b4o$2218bobo$2220b4o$2220b4o$2221boo19$2255boo$ 2227boo26bobo$2227bobo25bo$2227bo30bo$2228boo28boo$2228bobbo26boo$ 2228bo28boo$2230bobo20booboo$2234bo18bo4bo$2232bobbo17bob4o4boo$2232bo bbo21boo3boobo$2234b3o20boo4bo$2230b3ob3o20boo4bobo$2226b3oboobb3o22bo bboobo$2226bo7boo22boo$2227bo6boo22bo4bo3bo$2230b5o24bo4bo4boo$2232boo 31bobo3boo$2231boo33bo5b3o$2231boo36b3o$2230bobo38bo$2229boo41bo3bo$ 2229bobo39bo$2228bo43bobbo$2229boo42bo7$2315bo$2303boo9boo$2302boo3bo 6bobo$2304boboo15b3o$2306b3o5bobo4booboo$2306bo6boobobobo$2308b3obo6bo boo$2309boo7bo$2309boo5boo$2311b5o4$2331bo$2330boo$2330bobo7boo$2337b oobo$2333boobboo$2333boobboo$2334boo$2334b4obo$2333boboboobobb3o4boo$ 2332boo9bobb3obooboo$2332bobobb3obboo6bo3bo$2278b3o50bo11boo9boo$2278b o53boo7b3o7booboo$2279bo61bobo9b3o$2281boo54b3o12bobo$2282bo3boo49bo 15bo$2285boo53bo$2288boo47bo$2282b6o50bobo$2282bobboobo49bobo$2269boo 13bo4bo$2269bobo10bo6bo47boobo$2269bo11bo55boob4o$2272bo7boo3bo52bobb 4o$2272boobboobobb3o54boo$2276bo5bo$2276bobo3bo$2274boboo3bo$2273boob oo$2273bobbo$2275bobo$2275bobboo4$2299boo$2298boo$2299bobo$2299b3o$ 2299boo$2301bobo75boobo$2379bo3bo$2303bobo73bo4bo$2305b3o73boo$2305bo 77bobo$2304bo$2299boboobo4bo68bo6boo$2298booboobo72b5o4bobbo$2298bobo 4bo65boo4bo6boo$2303boo66bobo11bo$2303bo3bo63bo5boboo6bobo$2302bo3bo 65boo4bo4bobo$2372bobbo6b3o$2302bobbo66bo6booboo$2301boobo69bobobobbo$ 2301bo$2300boo74bo4bo$2300bo76b4o$2301bo$2325boo$2325bobo$2325bo$2326b oo$2326bobbo$2326bo$2328bobo$2332bo$2330bobbo$2330bobbo$2332b3o$2328b 3ob3o$2324b3oboobb3o$2324bo7boo$2325bo6boo$2328b5o$2330boo$2329boo$ 2329boo$2328bobo$2327boo$2327bobo$2326bo$2327boo241$2631bo$2630b5o$ 2630bobboo$2632boobo$$2635bobo$$2628b3o6b3o$2623bo4bobb3o4b3o$2622boo 5boob5ob3o$2622bobo3b3o4booboo$2634bobo$2624b3o6bobbo$2623b3o7bo$2625b obob4obbo$2627booboo$2627b6o5$2610boo$2609boo3bo$2611boboo$2613b3o$ 2613bo$2615b3o$2608boobo4boo$2608boboo3bobo$2602boo4boboo3b3o$2601boo 6bo5b3o$2602bobo4boo4bobo$2602b3o4boobboo$2602boo6bobo$2604bobo3boo3bo $2610b4o$2606bobo$2608b4o3boo$2608b4o3bobo$2609boo4bo$2616boo$2616bobb o$2616bo$2618bobo$2622bo$2620bobbo$2620bobbo$2622b3o$2618b3ob3o$2614b 3oboobb3o$2614bo7boo$2615bo6boo$2618b5o$2620boo$2619boo$2619boo$2618bo bo$2617boo$2617bobo$2616bo$2617boo! golly-3.3-src/Patterns/Life/Rakes/forward-LWSS-rake-p90.rle0000644000175000017500000003627012026730263020234 00000000000000#C A c/3 period 90 forward MWSS rake, shooting a period 90 MWSS stream #C which travels ahead of the puffer. This works by taking a forward #C period 90 LWSS rake, and converting each of the LWSS's into MWSS's #C using two period 90 sideways LWSS rakes. The "hammer" reaction #C converting three LWSS's into a MWSS was found by Dieter Leithner. #C David I. Bell, August 2002 x = 269, y = 475, rule = B3/S23 171bo$90b3o77bobo$90b3o61bo14bo3bo14bo$70b2ob3o13bo3bo13b3ob2o37b3ob3o 13b3o13b3ob3o$70b2o4b2ob2o21b2ob2o4b2o36bo6bob3o21b3obo6bo$69bo2bobo4b 2o7bo5bo7b2o4bobo2bo36b2o3bo5bo6b2o3b2o6bo5bo3b2o$76b2obo2b2o4b2obob2o 4b2o2bob2o51b7o3b2o3b2o3b7o$82bob2o11b2obo55bo2b2o3b2o2b3ob3o2b2o3b2o 2bo$77b3ob2o2bo3bo3bo3bo2b2ob3o51b2obo4b2o9b2o4bob2o$77bo3b3obo4bobo4b ob3o3bo57b4o2b2ob2o2b4o$75b2obob2o4bo2bo3bo2bo4b2obob2o47b2ob4o7b2ob2o 7b4ob2o$74bobo2bo8bobobobo8bo2bobo45bobob2o5b2obob3obob2o5b2obobo$72b 3obo2bo5b2obo2bo2bob2o5bo2bob3o40b2obo10b2obo5bob2o10bob2o$71b2obo9bob obob3obobobo9bob2o39b2obo9bobobo5bobobo9bob2o$70bo3bo9bobo2b2ob2o2bobo 9bo3bo38bobo10bo3bo5bo3bo10bobo$85b3o2bobo2b3o72bobo$86bob2o3b2obo67bo 3b3ob3o3bo$84b2o3bo3bo3b2o65bob5ob5obo$84bobo4bo4bobo65bobo9bobo$86bo 2bobobo2bo69bob2obob2obo$86bob3ob3obo68b2obob3obob2o$86bobo5bobo69bobo b3obobo$83b2obobo2bo2bobob2o63b2obob2o3b2obob2o$83b2obobo2bo2bobob2o 63b2obobo5bobob2o$86bobob3obobo67bobobo5bobobo$85bo2b7o2bo47bo21b2o5b 2o21bo$59bob2ob3o49b3ob2obo14b2ob3ob3o20b7o20b3ob3ob2o$58b2ob2o4b2obo 16bo7bo16bob2o4b2ob2o13b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$57bo2bobo2bo3b 3o18b3o18b3o3bo2bobo2bo11bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2b o$58bo5bo3bo3bo13b3o5b3o13bo3bo3bo5bo24bo2bo5bo6b2obo5bob2o6bo5bo2bo$ 71b2o4b3o5b2ob3ob3ob2o5b3o4b2o41bo2b4o5b2o3bobo3b2o5b4o2bo$71b2o2b2obo 9b3ob3o9bob2o2b2o44bo3bo6b2o5b2o6bo3bo$72b2o4bob2o9bo9b2obo4b2o40b3o2b obob2o5b9o5b2obobo2b3o$77bo2bobo3b2o7b2o3bobo2bo48bo2b2obob2o15b2obob 2o2bo$72b2obo2bobobobo13bobobobo2bob2o45b2obo3bob2o9b2obo3bob2o$76bo8b o11bo8bo56bobob9obobo$83bob13obo64b15o$166b3o5b3o$171bo$171bo$188bo$ 73b3obo106b2obobo$74b2ob2o105b2o4bo$72b3obo2bo103bo2bo3b2obo$68b3ob2o 4bo109bob2ob2o$67bo119b6o2bo$63bo4bo2bo2b3o108bo2bo9b2o$53bob2o6b2o6bo 3b3o5bo15bo63b2o13b2o5bo3bo3bo3bob2o4b3ob2o$52b2ob2ob2o3bob2o2b5o4bo4b 3o11b3o62b2obo11bob2o4b2o2bo2b2ob3ob2o2b2o4b2o$51bo2bobo2bo3bo2bobo3bo 10b4o9b4o62b2ob2o9b2ob2o4bo2bo3b2o5b2obo3bobo2bo$52bo5b2o3b4o6b2obobo 8bo7bo67b2ob2o7b2ob2o9bo5b2o5b3o$61b2obo22b2o5b2o68bobo9bobo19bob3o25b o$33b3o25bo22bob2o7b2obo65bo13bo22b2o24bobo$33b3o25bo21b2obo9bob2o64b 3o9b3o32bo14bo3bo14bo$13b2ob3o13bo3bo13b3ob2o28bob2o7b2obo66b2o9b2o29b 3ob3o13b3o13b3ob3o$13b2o4b2ob2o21b2ob2o4b2o150bo6bob3o21b3obo6bo$12bo 2bobo4b2o7bo5bo7b2o4bobo2bo112b2ob2o33b2o3bo5bo6b2o3b2o6bo5bo3b2o$19b 2obo2b2o4b2obob2o4b2o2bob2o165b7o3b2o3b2o3b7o$25bob2o11b2obo125b2ob2o 39bo2b2o3b2o2b3ob3o2b2o3b2o2bo$20b3ob2o2bo3bo3bo3bo2b2ob3o39bobobobo 74bo3bo40b2obo4b2o9b2o4bob2o$20bo3b3obo4bobo4bob3o3bo38bo2bobo2bo71bo 7bo44b4o2b2ob2o2b4o$18b2obob2o4bo2bo3bo2bo4b2obob2o35bo3bobo3bo69bobo 5bobo35b2ob4o7b2ob2o7b4ob2o$17bobo2bo8bobobobo8bo2bobo34bo9bo68bo3b2ob 2o3bo33bobob2o5b2obob3obob2o5b2obobo$15b3obo2bo5b2obo2bo2bob2o5bo2bob 3o32bo9bo72b2ob2o34b2obo10b2obo5bob2o10bob2o$14b2obo9bobobob3obobobo9b ob2o33bo5bo71b2o2bobo2b2o31b2obo9bobobo5bobobo9bob2o$13bo3bo9bobo2b2ob 2o2bobo9bo3bo30bo9bo71b2o3b2o33bobo10bo3bo5bo3bo10bobo$28b3o2bobo2b3o 46b3o3b3o131bobo$29bob2o3b2obo48bo5bo126bo3b3ob3o3bo$27b2o3bo3bo3b2o 179bob5ob5obo$27bobo4bo4bobo179bobo9bobo$29bo2bobobo2bo183bob2obob2obo $29bob3ob3obo128b2o52b2obob3obob2o$29bobo5bobo53b2o73b2o3b2o48bobob3ob obo$26b2obobo2bo2bobob2o45bobo2b2o78bo46b2obob2o3b2obob2o$26b2obobo2bo 2bobob2o44bo2bo77b2o2bo47b2obobo5bobob2o$29bobob3obobo48bobo2b2o73b2o 3b2o46bobobo5bobobo$28bo2b7o2bo48bo3b2o107bo21b2o5b2o21bo$2bob2ob3o49b 3ob2obo128b2ob3ob3o20b7o20b3ob3ob2o$b2ob2o4b2obo16bo7bo16bob2o4b2ob2o 127b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$o2bobo2bo3b3o18b3o18b3o3bo2bobo2bo 105b2o18bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo$bo5bo3bo3bo13b 3o5b3o13bo3bo3bo5bo105b3o30bo2bo5bo6b2obo5bob2o6bo5bo2bo$14b2o4b3o5b2o b3ob3ob2o5b3o4b2o31b2ob2o81bo37bo2b4o5b2o3bobo3b2o5b4o2bo$14b2o2b2obo 9b3ob3o9bob2o2b2o33b4o78b3o2bo37bo3bo6b2o5b2o6bo3bo$15b2o4bob2o9bo9b2o bo4b2o33b2obo79bo4bo32b3o2bobob2o5b9o5b2obobo2b3o$20bo2bobo3b2o7b2o3bo bo2bo39b3ob2o77b3o3bo33bo2b2obob2o15b2obob2o2bo$15b2obo2bobobobo13bobo bobo2bob2o31bo2b2ob3o77b2ob3obo34b2obo3bob2o9b2obo3bob2o$19bo8bo11bo8b o34bo3b2ob2o75bobo2b2ob2o42bobob9obobo$26bob13obo39b3o2b3o2bobo72bo2b 2o4b4o41b15o$87b2o3bob3o70bo2bobobo4b2o42b4o3b4o$81bob2o5bo2bo2bo70b3o 11bo46bo$31b2obob2o43bo7b3o2b2o72bob3o6b3o44b2ob2o$32b5o44bo2bo5b2o2bo 74b3o5b2o32bo12b2o5b2o$30bo7bo9bob3o28bo2b2o5bo118bobob2o9bo5bo$33bobo 11b2ob2o31b3o90b3o30bo4b2o9bob3obo$29bob2obob2obo6bo2bob3o31b2o119bob 2o3bo2bo5b3o7b3o$28b4obobob4o6bo4b2ob3o56bo30bob2o56b2ob2obo10b2o9b2o$ 27bobo9bobo16bo53b3ob3o25b2ob2ob2o52bo2b6o8bobo9bobo$27bobo9bobo7b3o2b o2bo4bo48b2o6bo23bo2bobo2bo48b2o9bo2bo7bo11bo$28bobo7bobo7b3o3bo6b2o6b 2obo33bo3bo2bo3b2o25bo5b2o4b2o31b2ob3o4b2obo3bo3bo3bo8b2o7b2o$31bo5bo 9bo4b5o2b2obo3b2ob2ob2o31b4o44b2ob2o31b2o4b2o2b2ob3ob2o2bo2b2o6bobo9bo bo$27bo2bo7bo2bo11bo3bobo2bo3bo2bobo2bo11bo17bo3bo44b2o2bo17b2o11bo2bo bo3bob2o5b2o3bo2bo6b2o11b2o$27b3o9b3o5bobob2o6b4o3b2o5bo11b6o14bobo2bo 42b2o17b2o2b2o17b3o5b2o5bo$61bob2o19b2o3b3o17bo61b2obo2bo19b3obo22bo7b o$30b2o5b2o25bo20bob2o2b2o79b2o2bo20b2o25b2o5b2o$29b2o7b2o24bo21bo4bo 81b3o49b2obob2o$30bo3bo3bo48b4o135b2ob2o$31b2obob2o49b2o90b2o55bo$25b 2o4b2o3b2o43b3o95bobo20bo3bo20b3o5bob2o$24b3o6bobo19b3ob3o18b2obo97b2o 16bobob2ob3o27b3o$51bob2o4bob4o14bo96bo3b2o16bo2bo6b2ob2o22b4o$50b3o3b ob2o3b2o3bo11b2o92bobo16b2o2b2o2bo3bo2bo2b2o12b2o3b2o3b3o$31b2o3b2o11b o3bo3bob2o5b4o11bo4bo86bo19b2obob2o2bo2bo4bo2bo5bo5b2o3b2o3b2obo$25b3o 3b2o3b2o12bo9bo3bobo3bo15bo2bo82b3obobo13bo3bo4b2o17b2o15bo$25b2o14bob o16bo3bobobobo13b4o2b2o79bo2bobo15bobobo2bo2b2o15b2o$41b2o17bobo4b3o 16b3o2bo80b2o3b3o21bo$42bo25bo14b3o3bobo80bo20b3o$84b2o6bo76b2obo$91b 3o76bo3bo50b2o3b2o$31b2o3b2o50bo82bo3bo49b2o3b2o$31b2o3b2o49b3ob3o77bo 2bo$87b3obo81bo51b2o3b2o$31b2o3b2o187b2o3b2o$31b2o3b2o2$60bo140b2o$58b 4o139b2ob2o19bo$37b2o15b2ob2o3bo3bo128b2o4b2o2b4o15b2o$37bobo14b2o2bo 5b4o127b2ob2o4bo4bo13b2o$38bobo12bo2bo7bo3bo117bo7bo3b2o7b2o13b3o$39bo 22bo2bobo7b3o107b4o9b2o$37bobo23bo7bob2o3bo101bo3bo3b2ob2o31b2o$36b3o 31b3o3b3o2b3o95b4o5bo2b2o32bo4bo2bo$31b2ob2ob2o30bo3bo4b3obobo93bo3bo 7bo2bo31b6o$30b3ob3o33bo7bo4bo95bobo2bo42bo2bo3bo$29bo5bo4bo38b2o102bo 38bo5b2ob3o$32b2o5b3o179b3o$29b2ob2o4bobobo177b2ob2o$37b3ob3o177b3o$ 38bobobo179bo$39b3o$40bo5$217b2o14b2o$44b2o170bo2bo6bo4bo4bo$30bo5b2o 5bo3bo168bo4b2o2b2o4bo5bo$25b3o2bo4bo2bo4bo172bo2b4o2bo5bo5bo$25bo10bo 2b2o2bo4bo166bo3bo3b2o8b4o$30b2o7b2obo3b2o117b2o49bo6bo8bo$26b2o2bo7bo 57b2o67b2o66bo$28b2o10b2o54b2o123b2o9b2o$29b2o8bo181b2o$39bo17bo147bo$ 40bobo10b2obobo145b2ob3o9bobo$40bo12b2o4bo142b3o5bo9bo5bo$36b2o3b3o8bo 2bo3b2obo136b2o7b2o10bo4b2o$34bo3bo3bo14bob2ob2o135b2o4bo19bo3bobo$32b 2o3bo18b6o2bo33bo65bo34b3o4bo19b2ob2o$32bo2b2o17bo2bo9b2o28bobo63b3o 21bo5b3o5b2o3b2o19b2o$31b2o2b2o17bo3bo3bo3bob2o4b3ob2o19bo66bo16b3ob3o 6bo2b3o2b2o2b2o17b3o2b2o$31bob2o19b2o2bo2b2ob3ob2o2b2o4b2o15b2o3bo62b 2ob2o14bo6b2o5b2o6b2ob3o21bo$34bo19bo2bo3b2o5b2obo3bobo2bo14b2o2bo15b 2obo24b2ob3o13b2ob2o16b2o3bo2bob4o3b2o2b2ob2o29b2o$23b2o8b2o23bo5b2o5b 3o25bo12b2ob2ob2o23b2o4b2o11b2ob2o61b2o8b2o$23b2o8b2o32bob3o40bo2bobo 2bo21bo2bobo3bo11bo2bo26bo34b2o$33b2o35b2o23b2o2b2o5b2o4b2o5bo29b3o2b 3o7b3o24bobo$95b6o5b2ob2o40b3obobo6b2o$97bo7bo3b2o40bo4bo$109b2o41b2o$ 118bo22bob2o$116b3ob3o17b2ob2ob2o$78b2o35b2o6bo15bo2bobo2bo34b3o$78bob o29bo3bo2bo3b2o17bo5b2o4b2o30bo$78bo30b4o36b2ob2o29bo$108bo3bo36b2o3bo $109bobo2bo34b2o$113bo$238b2o$23b2o180b2o31b2o$23b2o30b3o107b2o37bobo$ 55bo40b2o67b2o39bo$56bo39b2o$85bo22bo42bob2o22b2obo$81b3ob3o18b3ob3o 37b2ob2ob2o16b2ob2ob2o$80bo6b2o16b2o6bo35bo2bobo2bo16bo2bobo2bo$81b2o 3bo2bo3bo6bo3bo2bo3b2o37bo5b2o4b2o4b2o4b2o5bo$91b4o4b4o56b2ob2o4b2ob2o $91bo3bo2bo3bo56b2o3bo2bo3b2o$89bo2bobo4bobo2bo54b2o10b2o$90bo12bo123b o22bo$8b2ob3o20b3ob2o183b3ob3o18b3ob3o$8b2o4b2o16b2o4b2o182bo6b2o16b2o 6bo$7bo2bobo3bo14bo3bobo2bo182b2o3bo2bo3bo6bo3bo2bo3b2o$14b3o2b3o4b3o 2b3o199b4o4b4o$16b3obobo2bobob3o201bo3bo2bo3bo$16bo4bo4bo4bo199bo2bobo 4bobo2bo$17b2o10b2o201bo12bo29$186b3o$186b3o$166b2ob3o13bo3bo13b3ob2o$ 166b2o4b2ob2o21b2ob2o4b2o$165bo2bobo4b2o7bo5bo7b2o4bobo2bo$172b2obo2b 2o4b2obob2o4b2o2bob2o$178bob2o11b2obo$173b3ob2o2bo3bo3bo3bo2b2ob3o$ 173bo3b3obo4bobo4bob3o3bo$171b2obob2o4bo2bo3bo2bo4b2obob2o$170bobo2bo 8bobobobo8bo2bobo$168b3obo2bo5b2obo2bo2bob2o5bo2bob3o$167b2obo9bobobob 3obobobo9bob2o$166bo3bo9bobo2b2ob2o2bobo9bo3bo$181b3o2bobo2b3o$182bob 2o3b2obo$180b2o3bo3bo3b2o$180bobo4bo4bobo$182bo2bobobo2bo$182bob3ob3ob o$182bobo5bobo$179b2obobo2bo2bobob2o$179b2obobo2bo2bobob2o$182bobob3ob obo$181bo2b7o2bo$155bob2ob3o49b3ob2obo$154b2ob2o4b2obo16bo7bo16bob2o4b 2ob2o$153bo2bobo2bo3b3o18b3o18b3o3bo2bobo2bo$154bo5bo3bo3bo13b3o5b3o 13bo3bo3bo5bo$167b2o4b3o5b2ob3ob3ob2o5b3o4b2o$167b2o2b2obo9b3ob3o9bob 2o2b2o$168b2o4bob2o9bo9b2obo4b2o$173bo2bobo3b2o7b2o3bobo2bo$168b2obo2b obobobo13bobobobo2bob2o$172bo8bo11bo8bo6b2o$179bob13obo12bob2o$208bob 2o$184b7o13bo3b2ob3o$184b7o9b3ob3o2bo4bo3bo$182bo9bo6bo5b2o2b3o4b4o$ 181b2obo5bob2o6bo2bob2o9bo3bo$180bo4bo3bo4bo8bo4b2o4bo2bobo$179bo15bo 5b3obo9bo$180b2obo7bob2o4bo3bo16bo$84bo95b2obo7bob2o4bo2bobo3bo6bo2b3o $83bobo97b2o5b2o6b2o6b3ob3obobo4b5o4b2o$67bo14bo3bo14bo78b2ob2o5b2ob2o 3b2ob2o3bo2b2o3bobo4bo2b3o3b2ob2o$63b3ob3o13b3o13b3ob3o74b2obo7bob2o3b o12b2o3bobob5o4bo3b2o$62bo6bob3o21b3obo6bo75b2obo3bob2o6bo2bob2o2bo12b 2o3bo2bo2bobo$63b2o3bo5bo6b2o3b2o6bo5bo3b2o76b2o3bo3b2o8bo2b2o2b2o16b 4obo$71b7o3b2o3b2o3b7o32b3o51b2o3b2o15b2obo$69bo2b2o3b2o2b3ob3o2b2o3b 2o2bo30bo2bo51bo3bo14bo$70b2obo4b2o9b2o4bob2o31bo55b3o16b4o$76b4o2b2ob 2o2b4o37bo44b2o29b2o$68b2ob4o7b2ob2o7b4ob2o30bobo40b2obo$67bobob2o5b2o bob3obob2o5b2obobo$64b2obo10b2obo5bob2o10bob2o$64b2obo9bobobo5bobobo9b ob2o79b2o$64bobo10bo3bo5bo3bo10bobo79b2o$83bobo$77bo3b3ob3o3bo$77bob5o b5obo89b2o$77bobo9bobo88bo2bo18b2ob2o$79bob2obob2obo90bobo17b2obob2ob 2o$78b2obob3obob2o90bo15b3obo2b3o2b4o$79bobob3obobo40b3o60b3o4b3o5bo4b o$76b2obob2o3b2obob2o36bo2bo59bobobob3obo8b2o$76b2obobo5bobob2o39bo59b obobob4o$77bobobo5bobobo40bo60bobo4bo2bo$58bo21b2o5b2o21bo18bobo49bo5b 2o13bo6b2ob2o$51b2ob3ob3o20b7o20b3ob3ob2o64bo3bo2bo4bo12b2obob2ob2o$ 51b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o63bo5bobo4bo9b3obo2b3o2b4o$50bo2bob 2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo68b3o10b3o4b3o5bo4bo$62bo2bo5b o6b2obo5bob2o6bo5bo2bo52b2ob3o34bobobob3obo8b2o$66bo2b4o5b2o3bobo3b2o 5b4o2bo56b2o4b2o14bo17bobobob4o$69bo3bo6b2o5b2o6bo3bo58bo2bobo3bo12b3o 17bobo4bo2bo$64b3o2bobob2o5b9o5b2obobo2b3o60b3o2b3o6b5o7b2o16bo$67bo2b 2obob2o15b2obob2o2bo65b3obobo4b2o3b2o5b2ob2obo4bo12b2obo$69b2obo3bob2o 9b2obo3bob2o67bo4bo6b5o5bob2obobo4bo9b2ob2ob2o$76bobob9obobo75b2o10b3o 7b3o5bo12bo2bobo2bo$77b15o38b3o48bo8b3o5b3o4b2o4b2o5bo$79b4o3b4o40bo2b o56bobo7bo4b2ob2o$80bo7bo41bo60bo2bo4b2o3bo3b2o$79b3ob3ob3o40bo56b3o2b 3o3bo9b2o$79bo2bobobo2bo11bo29bobo53b2o3bobo$97b2obobo84b3obo2bo$97b2o 4bo84b2o2bo2bo$96bo2bo3b2obo76b2o4b4o2bo$101bob2ob2o75b2o4b2o3b2o$100b 6o2bo82bobo$98bo2bo9b2o$76b3o11b3o5bo3bo3bo3bob2o4b3ob2o$76bo15bo5b2o 2bo2b2ob3ob2o2b2o4b2o$78bo11bo7bo2bo3b2o5b2obo3bobo2bo$78b2o9b2o11bo5b 2o5b3o102bo$78b2o9b2o20bob3o14b3o86bobo$77b3o9b3o22b2o13bo2bo70bo14bo 3bo14bo$132bo66b3ob3o13b3o13b3ob3o$82bo3bo45bo32bo23bo8bo6bob3o21b3obo 6bo$82bo3bo42bobo29b3ob3o14b2o5bo9b2o3bo5bo6b2o3b2o6bo5bo3b2o$83bobo 74bo6b2o13b4obobo17b7o3b2o3b2o3b7o$82b2ob2o74b2o3bo2bo3bo7bo3bo19bo2b 2o3b2o2b3ob3o2b2o3b2o2bo$81bobobobo83b4o7b3o4bo16b2obo4b2o9b2o4bob2o$ 171bo3bo6b3o4b2o21b4o2b2ob2o2b4o$80b3o3b3o80bo2bobo9bo4bo14b2ob4o7b2ob 2o7b4ob2o$80bobo3bobo81bo32bobob2o5b2obob3obob2o5b2obobo$81b2o3b2o112b 2obo10b2obo5bob2o10bob2o$80bo2bobo2bo111b2obo9bobobo5bobobo9bob2o$81b 2o3b2o112bobo10bo3bo5bo3bo10bobo$219bobo$130b3o80bo3b3ob3o3bo$90bo39bo 2bo79bob5ob5obo$88b2o40bo82bobo9bobo$88b3o39bo84bob2obob2obo$81b2o3b3o 42bobo80b2obob3obob2o$81b2o3b2o127bobob3obobo$212b2obob2o3b2obob2o$81b 2o3b2o124b2obobo5bobob2o$81b2o3b2o125bobobo5bobobo$194bo21b2o5b2o21bo$ 187b2ob3ob3o20b7o20b3ob3ob2o$88bo98b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$ 88bo93bo3bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo$88bo91b2o16bo 2bo5bo6b2obo5bob2o6bo5bo2bo$181b2o19bo2b4o5b2o3bobo3b2o5b4o2bo$83b2ob 2o42b3o72bo3bo6b2o5b2o6bo3bo$83b2ob2o41bo2bo67b3o2bobob2o5b9o5b2obobo 2b3o$85bo5bo40bo70bo2b2obob2o15b2obob2o2bo$90bo41bo72b2obo3bob2o9b2obo 3bob2o$88bobo38bobo80bobob9obobo13b3o$81b3o2b3obo122b15o13bo$80bo4b2o 128b4o3b4o14b2o$81bo2b2o4b2obo126bo13bob2o2b2o2b3o$82b3o6bob2o123b2ob 2o10b2ob2ob2o5bo4b2o$216b2o5b2o7bo2b2o3bob2o4b2ob2o$90bo126bo5bo14b4o 6b2o3bo$90bo126bob3obo10bobob2o8b2o$90bo123b3o7b3o9bo$214b2o9b2o6b2o 18bo$58bob2o151bobo9bobo4b2o2bo4b2obo3bo3b2ob3o$57b2ob2ob2o65b3o81bo 11bo7b3ob2obob2ob2ob2obob3o2bo3b3o$56bo2bobo2bo65bo2bo81b2o7b2o4bo2bo 5bob2o6bo9bo2bobob2o$57bo5b2o4b2o17bo41bo82bobo9bobo3bob4obo3b3o3bobo 2bo3bobo2bobo3bo$66b2ob2o16bobo40bo82b2o11b2o8b3o2b2o10bo4b2o2bo2bobo$ 66b2o3bo14bo2bo41bobo102b2o4bo16b5o$66b2o4b3o11bo129bo7bo12bob2obo17b 2o$73b2o11b3o127b2o5b2o$87b2o128b2obob2o14bo2bo$86bo83bo37bo9b2ob2o15b o2bo$86bobo80bo38bo$78b2ob2o86b3o47b3o$86bo3bo24bo3bo$87bo24bobob2ob3o $88bo2bo19bo2bo6b2ob2o91b2o$106b2o2b2o2bo3bo2bo2b2o91b2o$106b2obob2o2b o2bo4bo2bo3b3o$105bo3bo4b2o13bo2bo$105bobobo2bo2b2o15bo81b2o18b3ob3o$ 114bo17bo80bo2bo14b4obo4b2obo$106b3o20bobo81bobo11bo3b2o3b2obo3b3o$ 214bo11b4o5b2obo3bo3bo$100bo124bo3bobo3bo9bo$97b5o123bobobobo3bo$96bob ob3o123b3o4bobo$96bo3b3o118bo5bo13b3ob3o$101bo3b2o113b3o15b4obo4b2obo$ 97bo3b2o2b2o112b5o10bo3b2o3b2obo3b3o$79b2o18b2o3bo91bo21b2o3b2o8b4o5b 2obo3bo3bo$79b2o33b2o76b3ob3o15bo4b5o8bo3bobo3bo9bo$114b2ob2o72bo6b2o 13b3o4b3o9bobobobo3bo$108b2o4b2o2b4o8b3o59b2o3bo2bo3bo7b5o4bo11b3o4bob o$81bo26b2ob2o4bo4bo7bo2bo68b4o5bo5bo16bo$79b2o18bo7bo3b2o7b2o8bo71bo 3bo3b2o2bo2b2o27b3ob2o$79b3o2b2o12b4o9b2o17bo69bo2bobo3b3obobob3o24b2o 4b2o$78bo5b2o7bo3bo3b2ob2o25bobo67bo8b2o2bo2b2o3b3o18bo3bobo2bo$79bo4b o7b4o5bo2b2o52bobo50bo5bo4b3o5b3o5b3o2b3o$79bo3bo7bo3bo7bo2bo51b2o52b 5o6bob2o3b5o2bobob3o$81bo6b2o2bobo2bo61bo53b3o4b3ob2o2b4o2b2o2bo4bo$ 86bo2bo6bo117bo5b3o4b2o2bob2o6b2o$86bobo131b2o5b2o3bo4$216b2o$216b2o8b o$130b3o$129bo2bo93b3o$132bo$132bo$129bobo31bo26bo$159b3ob3o11b4obo5b 4o$158bo6bob3o7bobo2b2o3b2o3bo$159b2o3bo5bo2b2obo2bo4bo5bob2o$167b2obo 2bobo2b2obo2bo3b3obobo$169b2o2bob2o2bo2bo2bo4bobobob2obo$169b2o3b3o2b 2ob2obo2bobobobob2ob2o20bo$172b3o2bo2bobo3bobobobobobo4bo12bob2o2bobo$ 170bo2bo5bo3bo4bobobobo5b3o9b2obob2o4bo11b3ob2o$172bo17bobobob2o2b4o 10bo18b2o4b2o$192bo5b3o2bo12b3o4bo8bo3bobo2bo$130b3o57bo7bo4bo13b7o3b 3o2b3o$130bo2bo13bo36b2o4bo3b4o2bob2o22bobob3o$130bo16bobo21bob2o8bo2b 2ob2o2bobobob2ob2o23bo4bo$130bo16b2o21b2ob2ob2o4bo3bo2b2obo8bo28b2o$ 131bobo35bo2bobo2bo5b4o13b2o$170bo5b2o4bo2bobo2b2o$179b2obo2bobo2b2o$ 56b2ob3o117b2o4bobo4bo$56b2o4b2o14b2o101bobobobobobo8bo$55bo2bobo3bo 13b2o119b2o$62b3o2b3o129bobo$64b3obobo$64bo4bo13b3o102b2o$65b2o18bo 102bobo$54bob2o26bo103bo$53b2ob2ob2o69b3o$52bo2bobo2bo68bo2bo44b2o$53b o5b2o4b2o65bo43b2o$62b2ob2o65bo45bo$62b2o3bo38b2o21bobo$62b2o41bobo57b 3o$107bo57bo$166bo$155bo$154b2o$154bobo2$64bob2o22b2obo34b3o6bo5b2o$ 63b2ob2ob2o16b2ob2ob2o15b2ob3o14bo4b2o6bobo$62bo2bobo2bo16bo2bobo2bo 14b2o4b2o11bo6b2o5bo$63bo5b2o4b2o4b2o4b2o5bo14bo2bobo3bo$72b2ob2o4b2ob 2o30b3o2b3o8b2o$72b2o3bo2bo3b2o32b3obobo6b2o$72b2o10b2o32bo4bo9bo$119b 2o2$119b2o$118bo2bo$118bo2bo$117b2obo$118bobob2o$115b2obobo$115b2obobo bo$116bobobo2bo$117bo2bo3b2o$116b5o2b3o$117b3obob2o$121bo$121bo! golly-3.3-src/Patterns/Life/Guns/0000755000175000017500000000000013543257426013701 500000000000000golly-3.3-src/Patterns/Life/Guns/pseudo-p34-gun.rle0000644000175000017500000001577512026730263017024 00000000000000#C Pseudo p34 gun based on two p102 Herschel factories. #C Karel Suhajda, 18 Apr 2003 -- from Jason Summers' "guns1j" #C collection, which now contains the smallest known glider gun of #C every period between 14 and 999. A separate "guns2j" collection #C contains a selection of small higher-period guns. #C Construction methods are known for glider guns of all periods above #C the minimum of 14, and also for true period guns above p61 #C -- the period of 'true' guns matches the period of the output, #C unlike pseudo-period guns such as this example. As of this #C writing [September 2006] true guns are unknown for 36 periods. #C It is quite possible that true guns exist for all these periods, #C but current search programs are unable to perform exhaustive #C searches for oscillators at anywhere near the periods neede to #C make direct glider generation possible. #C In general, prime period guns need more space than composite #C numbers, especially multiples of large powers of two or three; #C in the latter case, various doubling and counting mechanisms #C can be used. See p97307852711.rle in the Oscillators folder, #C which is trivial to convert to a prime-period gun. #C P34 traffic-light eater from Jason Summers' "jslife" collection. x = 243, y = 157, rule = B3/S23 185boboo$183b3obobbo9bo$182bo4boboo7b3o$178boobbooboobo8bo24bo$177bob 3o3bobbo8boo22bobo$155boo7bo12bo4boobboboo18bo12bob3o$154bobo7b3o9boob oobobobo4bo3bo12b3o9boo4bo$154bo12bo7bobbobobobbobboobobbobo14bo7bobb 5o$152boob4o7boo8bobo3boobobo3bobbobboboo9boo8bobbo3boo$151bobo4bo16b oobobo3boboboo4bobboboo18boobob3obbo$151boboboobboo8bo4bobboboboobobob o5bobbo15bo8boboboboo$150boobo3boobbo6bobobb3o3bobbobobobo5boo16bobob oobboobobbo$149bo3boboobbooboboobboo4bobbobobboboboo8bo11boobboo7bobob oo$150b3o4bo4boboo9boo4boobbo22boo9boobobo$152boboobob3o14bobo4bobo34b obobo$153bobooboo15bobbobobobboo33bobbo$176boo4bobo36boo$178b4obbo$ 115bo62bobbobo$101boo10b3o66bo40boo5boo$100bobbo8bo45bo63bobo5bo$99bob obo8boo43bobo62bo5bobo$99boboboo53boo61bo3bobboo$97boobobo3bo3bo43boo 64boo3bo$97bobbobboobobbobo41bobo22bo41bo5bo$94boobobobo4bobbobboboo 37bo5boo18boo39bo4bo$94bobboobboboo4bobboboo36boo5boo17boo41bo$95boo3b obbo5bobbo110bobo$97booboobbo4boo$97bo4boo7bo48boo8boo59boo$98b3obo57b o8boo25boo7boo17booboobbo$100bobo59bo8bo23bobo6bobbo14b3obob3obbo$101b o59b4o32bo5bobobo10boobo4bo4b3o$74bo85bo4bo37boboboo5boobbooboboobboob o$12bo47boo10b3o60boo23b5obo34boobobobbo3bobo6bobboo3boboo$11bobo45bo bbo8bo62bobo21boo3bobbo10boo22bobbo3b3o3bo8boobboobobo$9b3obo44bobobo 8boo15boo5boo37bo22bobb3oboboo5boobboo19boobobbobobbo15bo4bobo$8bo4boo 11bo31boboboo25bo5boo35boob4o18boobobobo7bobo23bobboo4boo7boo7b4oboo$ 8b5obbo8b3o29boobo4bo4bo19bobo39bobobobbo21bobboboobboobbo25boo4bobo8b o12bo$6boo6bo8bo32bobboboboo3bobo19boo39boboboobboo19boobobo35bobobobb o8b3o7bobo$5bobboboboboo7boo28boobobboo3bo4boobboo19boo34booboobboobbo 20boboboo7boo24bo4boo11bo7boo$5boobobobobbo37bobboobobboo9boo18bobo33b o3boboobboobo19bobobo8bo26b3obo$8bobboboo6bo14boo16boobbobobo31bo35b3o 4boo3bo20bobbo9b3o25bobo$8boobo3bo4bobo12bobo18b5obbo68boboobob3o22boo 12bo26bo$10boboboo5boobboo8bo20bo4boo4bo65bobo3bo$10bobobo10boobboobb oob4o17b3obo4bo$11bobbo14bobbobobobbo19bobo4b3o68bo$12boo17booboboobb oo18bo31b5obo38bo54boo$32boboobboobbo47b3oboboobo85boo5boo$5boo5boo18b oboboobboobo45bo4bo4b3o35bo47boo$6bo5boo19bo4boo3bo45boboobboboo3bo33b obo64bobo15boo$6bobo25b3obob3o47bobboo3boboo34boo66boo15bo$7boo6bo20bo 3bo50boobbobbobo9bo19boo8boo45boo15bo17bo$11b4o78bo4bobo10boo16bobo8bo bo12boo30boo32boo$10bob5o21bo54b4oboo10boo19bo3boo5bo12bobo23boo$11bo 26bo58bo37boo5boo13bo23boo$95bobo55b4oboo10b3o61boo$37bo57boo56bobbobo bo11bo61bobo$11bo24bobo112boo4boobo10bo25boo3bo33bo$10b3o23boo112bobb 4oboboo35boobooboo13boo12b4oboo$7bobobobobo24boo107boboobboboo3bo34bo 7bo12boo12bobbobobo$6boboo3boobo23bobo106bo4bo4b3o34boo6bo25boo4boobo$ 4b3o3bobo3bo18boo5bo107b3o3boobo37boobboo26bobb4oboboo$3bo3b3o4booboo 16boo5boo24bo42bo40bobobobo38boobboo25boboobboboo$3boobo3b3o4bo50b3o 38b3o41b3o72bo4bo4b3o$4boboobo5bobo7b3o43bo20boo14bo120b3o3b3obbo$4bo 5bobbo3boo8bo26boo14boo11boo6boo15boo86booboo30bobobobbo$bboob4ob4oboo bbo6bo27boo27boo8bo101bobobobo30b3o3boo$bobobobbo5bo3bo83b3o49bo23boo 16bobbobo$bo4bobb4o3boo109bo25bobo23bo19boboo$ooboobboo4b3o25bo6boo48b ooboboboo21boo24boo23bobo16boo3bo$3boboobb4obbo25bobo4boo51bobobbo20b oo21boo28boo13bobobbobo24b3o3bo$3o5bo3bo28boo9boo48bob3o42bobo43boobb ooboo23bo5boo$obb3obob3o40boo13bobobboo24boo20boo27bo5boo73bobb3o$bbo bbobobo57bobboobbo23bo4bo15bobbo25boo5boo74bo3b3o$boo67boobbo24bo20boo 82booboo19bo7bobo$6b3o59boobbobo20boo3bo102bobboobo19bobbo5bo$47boo47b o105bobo4bo21boo5boo$39bobo5boo44b3o6boboo17boo10bobo51boo12bob4oboo$ 7bo32boo51bo6b3oboo17bo12boo51boboo12bo4boboboo$6bobo31bo26bo3boo26bo 24b3o9bo51booboboo9bobbobboboboo$7boo57bobo3bo27b3oboo20bo43boo18boob oo6boobboo3bobo11bo$3boo61boo3bo30bobo64boo10b3o5boobboo6boboobboboobo 12bo$bbobo31boo32bo12boobboo13bobo4boo60bo12bo5bobo5boobo4bo4bo11b3o$ bbo5boo26bobo27b5obo10bo4bo14bo6bo70bobbo5b3o5bobob3obob3o$boo5boo28bo 27bo4boo11b4o8bo10b3o72boo16bo3b5o$34b4oboo26b3o11b3o3bobo4b3o10bo92bo 33boo5boo$34bobbo3bo27boboo4bo3bobbo3boo3bo104boboo32boo5bo$32boo5bobo 28bobo3bobo3bobo8boo103boobbo36bobo$31bobb3o4boo32bobobboboboo19boo94b oo36boo$21boo7boboo4boo3bo31bobboobo3bo5bo12bobo99bo28boo$20boo8bo3bob o3b3o33bobobbob3o4bobo11bo100bobo27bobo$22bo8b3o3boobo34boobobobobbo5b oobbooboobboob4o97boo28bo$5boo5boo19bobobobo35bobbo5boo9boobobbobobobb o84boo7boo$6bo5boo20b3o39boo4bobo15booboo4boo82bo7bobo$6bobo7bo18bo42b 5obo16bobob4obbo40bobo36bobo7bo5boo$7boo6bo62bo4bo17boboobobboobo40boo 36boo7boo5boo5b3o$11boobb3o54bo6b4o19bo4bo4bo40bo60bo20b5o$10bobo21bo 38bo29b3o3b3o95boo6bo17b3obob3o$11bo21bobo24b3o8b3o5boo24bobobo85bo11b o24bo4bo4bo$33boo25bobbo15boo25b3o85bobo12bo21boboobobboobo$11bo25boo 21bobbo130bobo11b4o19bobo3boobbo$11bo25bobo21bobbo128boob3o8bo4bo17boo bobbobboo$32boo5bo20boobbo96bo37bo7b5obo14bobbobo4bo$7bobo3bo18boo5boo 17b3obbo17bobo22bo55boo29boob3o6boobbobobo10boobboobboob4o$6boboobob3o 41boo3bo18boo22bobo53boo30boobo7bobboobobboo5boobboo8bo$4b3o4boo3bo15b oo16boobo3bobboo20bo22boo97boobobboo3bo3bobo12bobo$3bo3boboobboobo14bo bbo15boboo4b3o48boo89boo5bobboboboo4bo14boo$4booboobboobbo3boo10bobobo 73bobo68boo18bo6boobo4bo$5boboboobboo4boobboo5boobobo61bo6boo5bo67bobo 16bobo8boboboo7boo$5bobobobbo10bobo4bo3boboo59boo5boo5boo66bo18boo9bob obo8bo$6boob4o11bo6boobobbo58bobo79boo10bo19bobbo9b3o$8bo21bobbobobob oo147booboo18boo12bo$8bobo10boo7boobobobobbo22boo38boo84bobbo$9boo11bo 8bo6boo22bobbo38bo78bo6boo$19b3o9bob5o23bobobo36bo79bo$19bo9boobo4bo 23boboboo9boo22b4o78b3o$29bobbob3o22boobo4bo4boobboo21bo4bo$31boobo24b obboboboo3bobo24bob5o$56boobobboo3bo4bo13boo10bobo4boo82bo$56bobboobo bboo19boobboo5boo5bobbo70bo9bobo$57boobbobobo8boo14bobo4bobboboboboo 71boo7bobo$59b5obo8bo16bo5b3obobbo73boo9bo$59bo4boboo7b3o19bo3boboo69b oo17boo$60b3obobbo9bo10boo7boobobo70bobo17bobo$62boboo23bo8bobobo70bo 21bo$86b3o9bobbo70boo21boo$86bo12boo$$186bobo$187boo$187bo6$195bo$196b oo$195boo7$203bobo$204boo$204bo$$214b3o$$212bo5bo$212bo5bo$212bo5bo$$ 214b3o! golly-3.3-src/Patterns/Life/Guns/vacuum-cleaner.rle0000644000175000017500000000242712026730263017227 00000000000000#C Double p46 gun found by Dieter Leithner pulls blocks and beehives #C Dean Hickerson, 2/21/97; from Jason Summers' "jslife" collection x = 90, y = 97, rule = B3/S23 boo23boo$boo23bo$24bobo$6bo3boo12boo36boo5boo$oobboobob3o50boo5boo$oo bbo4b3o$4bo3bo$5b3o$44boo$5b3o36boo$4bo3bo$oobbo4b3o25boo$oobboobob3o 25bobo5boo$6bo3boo25boboo4boo$21boo15boo$boo35bo$boo20bo$23bobo12bo23b oo5boo$20bo17boo21bobbo3bobbo$20bo5bo10boboo4boo17booboo$20bo5bo10bobo 5boo16bobobobo$22bo3bo10boo24bobobobo$22bo38bo9bo$22bobbo18boo14bo11bo $22b3o19boo$65bobo$62bo9bo$62bo3bo5boo$32bo31b3o6bo$28boobbo34booboo$ 27bo5bo13boo$26boobbobo14boo$27boo3bo$28b3o34bo7bo$41boo3boo18bobobobo $28b3o9bobbobobbo17bobobobo$27boo3bo6bo9bo15bobooboobo$26boobbobo5boo 9boo14boo5boo$27bo5bo5bo9bo5bo$16boo10boobbo7bobbobobbo5bo$15bobo14bo 8boo3boo6b3o$15bo$14boo$$28bo5bo22boo$26bobo3bobo21b4o$27boo4boo20bobb obo$54bobobboo$53bobo$52boo$43bo8b3o10boo5boo$43bobo7bobo9boo5boo$43b oo9boo$$63boo$39bo5bo16b4o7boo$40bo5bo14bobobo6bobboo11boo$38b3o3b3o7b oo5boob3o4b6o11boo$54boo8boobo5b4o$64boobo$$64boobo$64boobo5b4o$30boo 31bobbo4b6o11boo$29bobo32boo6bobboo11boo$29bo34boo7boo$28boo9boo$40bo 10bo5bo$37b3o9bobo3bobo$37bo12boo4boo$62bo$61bobo$61bobo$62bo5$64boo$ 64boo$$67boo4bo$67boo3bobo$72bobo$73bo5$75boo$75boo$$78boo$78boo$$81b oo$81boo! golly-3.3-src/Patterns/Life/Guns/golly-ticker.rle0000644000175000017500000003641412026730263016730 00000000000000#C GollyTicker-Take4, based on Alan Hensel's Decimal Counter (1994). #C Created by Brice Due Sept 2005, modified by Dave Greene Sept 2006. #C #C Info: The graphic logo displayed by this 'ticker tape gun' was #C designed around the phases of a period 8 oscillator known as #C Kok's Galaxy, found by Jan Kok in 1971. Period 8 means there are #C 8 distinct patterns (called 'phases') which repeat cyclically, #C one phase per Life generation. The 'ticker tape parade' shown here #C is bounded on the left by two columns of these Galaxy patterns. #C At any given moment all 8 phases are present in different places. #C #C The 'O' in 'GOLLY' is represented by one of the 8 phases of Kok's #C Galaxy, while the two 'L's are derived from another phase -- #C divided and rotated. The memory loop technology is borrowed from #C Alan Hensel's Decimal Counter, listed on Dean Hickerson's webpage: #C http://www.radicaleye.com/DRH/dec.counter.html . #C #C P.S. In hash mode at step 8^6, the tape appears to run in reverse! #C And if you are new to Life, you will gain some insight by pondering #C why the Kok's Galaxies at the left appear frozen when running in #C hash mode at step sizes above 8^0 -- or in regular qlife mode at #C step sizes above 10^2. Hint: Life is all about timing. x = 2993, y = 747, rule = B3/S23 2354b4o7b2o$2353bo3bo6bo2bo12b2o$2353bo10bo2b2o11b2o$2354bob2obo4bo2bo $2357b3o6bo2$2357b3o6bo$2356b2obo4bo2bo$2355bo8bo2b2o$2356b2o6bo2bo$ 2357bo7b2o3$2390b2o$2390b2o4$2469b4o7b2o$2384bo5bo77bo3bo6bo2bo12b2o$ 2383b3o3b3o76bo10bo2b2o11b2o$2382bo2b2ob2o2bo76bob2obo4bo2bo$2382bo3bo bo3bo79b3o6bo$2384bobobobo$2472b3o6bo$2381b2ob2o3b2ob2o77b2obo4bo2bo$ 2383bo7bo78bo8bo2b2o$2471b2o6bo2bo$2472bo7b2o3$2390bo114b2o$2389b3o 113b2o$2388bo3bo$2387bo5bo$2387bo5bo$2388bo3bo191b4o7b2o$2499bo5bo77bo 3bo6bo2bo12b2o$2388bo3bo105b3o3b3o76bo10bo2b2o11b2o$2387bo5bo103bo2b2o b2o2bo76bob2obo4bo2bo$2383b2o2bo5bo103bo3bobo3bo79b3o6bo$2383b2o3bo3bo 106bobobobo$2389b3o195b3o6bo$2390bo105b2ob2o3b2ob2o77b2obo4bo2bo$2498b o7bo78bo8bo2b2o$2586b2o6bo2bo$2587bo7b2o3$2505bo114b2o$2504b3o113b2o$ 2503bo3bo$2502bo5bo89bo$2502bo5bo76bo11b2o$2503bo3bo76bo12bobo99b4o7b 2o$2584b3o27bo5bo77bo3bo6bo2bo12b2o$2503bo3bo105b3o3b3o76bo10bo2b2o11b 2o$2502bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2447bo50b2o2bo5bo103bo3bobo 3bo79b3o6bo$2446bo51b2o3bo3bo106bobobobo$2446b3o55b3o195b3o6bo$2505bo 105b2ob2o3b2ob2o77b2obo4bo2bo$2613bo7bo78bo8bo2b2o$2701b2o6bo2bo$2609b 2o91bo7b2o$2573bo34b2o$2573bobo34bo$2573b2o45bo114b2o$2619b3o113b2o$ 2474bo143bo3bo$2435bo38b2o141bo5bo$2435bobo35bobo141bo5bo$2435b2o181bo 3bo191b4o7b2o$2729bo5bo77bo3bo6bo2bo12b2o$2618bo3bo105b3o3b3o76bo10bo 2b2o11b2o$2617bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2562bo37b2o11b2o2bo 5bo103bo3bobo3bo79b3o6bo$2561bo39b2o10b2o3bo3bo106bobobobo$2561b3o36bo 18b3o195b3o6bo$2620bo105b2ob2o3b2ob2o77b2obo4bo2bo$2728bo7bo78bo8bo2b 2o$2462b2o352b2o6bo2bo$2463b2o352bo7b2o$2462bo225bo$2688bobo$2688b2o 45bo114b2o$2734b3o113b2o$2589bo143bo3bo$2589b2o141bo5bo$2588bobo141bo 5bo$2733bo3bo191b4o7b2o$2844bo5bo77bo3bo6bo2bo12b2o$2451bo281bo3bo105b 3o3b3o76bo10bo2b2o11b2o$2451b2o279bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$ 2450bobo224bo50b2o2bo5bo103bo3bobo3bo79b3o6bo$2676bo51b2o3bo3bo106bobo bobo$2676b3o55b3o195b3o6bo$2735bo105b2ob2o3b2ob2o77b2obo4bo2bo$2843bo 7bo78bo8bo2b2o$2931b2o6bo2bo$2932bo7b2o3$2850bo114b2o$2401bo37b2o408b 3o113b2o$2400bo39b2o406bo3bo$2400b3o36bo407bo5bo89bo$2847bo5bo88b2o$ 2848bo3bo89bobo$2959bo5bo$2848bo3bo105b3o3b3o$2847bo5bo103bo2b2ob2o2bo $2792bo37b2o11b2o2bo5bo103bo3bobo3bo$2791bo39b2o10b2o3bo3bo106bobobobo $2791b3o36bo18b3o$2428bo421bo105b2ob2o3b2ob2o$2389bo38b2o528bo7bo$ 2389bobo35bobo262b2o$2389b2o302b2o$2692bo2$2965bo$2554b2o408b3o$2555b 2o406bo3bo$2554bo225bo181bo5bo$2780bobo179bo5bo$2780b2o181bo3bo2$2681b o281bo3bo$2681b2o279bo5bo$2680bobo224bo37b2o11b2o2bo5bo$2906bo39b2o10b 2o3bo3bo$2906b3o36bo18b3o$2965bo$2504bo$2504bobo$2504b2o4$2631bo$2630b o303bo$2630b3o301b2o$2933bobo2$2493bo$2492bo303bo$2492b3o301b2o$2795bo bo4$2619bo$2619bobo$2619b2o7$2382bo$2343bo38b2o$2343bobo35bobo$2343b2o 5$2773bo$2773b2o$2772bobo2$2332bo$2331bo$2331b3o$2861bo$2860bo$2860b3o $2497bo$2458bo38b2o$2458bobo35bobo262b2o$2458b2o302b2o$2761bo3$2623b2o $2624b2o$2623bo3$2447bo$2446bo$2446b3o6$2876b2o$2877b2o$2876bo3$2136b 2o$2136b2o4$2562bo37b2o$2561bo39b2o262bo$2561b3o36bo225bo38b2o$2198bo 627bobo35bobo$2198b2o626b2o$2197bobo2$2688bo$2688bobo$2129b3o3b3o550b 2o$2129bo2bobo2bo186b2o$2129b2obobob2o187b2o262bo$2129b2o5b2o186bo225b o38b2o$2251b2o297bobo35bobo$2251b2o297b2o$2186b2o$2187b2o262bo$2131b2o b2o50bo264b2o$2129bo2bobo2bo312bobo224bo$2129bobo3bo3bo3b3o530bo$2129b 3o3bo3bo3bobo530b3o$2137bo2bobo2bo$2139b2ob2o130bo$2274bobo$2274b2o$ 2803bo$2175bo627bobo$2137b2o5b2o29b2o67b3o3b3o550b2o$2137b2obobob2o28b obo67bo2bobo2bo148bo$2137bo2bobo2bo98b2obobob2o147bo303bo$2137b3o3b3o 98b2o5b2o147b3o301b2o$2366b2o335bobo$2366b2o$2263bo37b2o$2262bo39b2o$ 2246b2ob2o11b3o36bo$2244bo2bobo2bo539bo$2244bobo3bo3bo3b3o530bo$2163b 2o79b3o3bo3bo3bobo530b3o$2164b2o86bo2bobo2bo167bo$2156b2o5bo90b2ob2o 130bo38b2o$2156b2o231bobo35bobo262b2o$2389b2o302b2o$2144b2o546bo$2144b 2o144bo$2252b2o5b2o29b2o67b3o3b3o$2252b2obobob2o28bobo67bo2bobo2bo148b o$2252bo2bobo2bo98b2obobob2o147bo$2252b3o3b3o98b2o5b2o147b3o262bo$ 2481b2o297bobo$2481b2o297b2o$2416b2o$2215b2o200b2o$2215b2o144b2ob2o50b o$2359bo2bobo2bo$2359bobo3bo3bo3b3o$2156bo7bo44bo5bo143b3o3bo3bo3bobo$ 2155b4o3b4o42b3o3b3o61bo88bo2bobo2bo$2155bo3bobo3bo42bob2ob2obo54b2o4b 3o89b2ob2o130bo$2156bo2bobo2bo42b2o7b2o53b2o3bo3bo223bobo262bo37b2o$ 2156b3o3b3o42b2o7b2o58b2ob2o223b2o262bo39b2o$2207b3o5b3o41b2o15b2ob2o 487b3o36bo$2209b3ob3o43b2o$2211bobo62b2ob2o86b2o5b2o98b3o3b3o$2208bo2b obo2bo59b2ob2o86b2obobob2o98bo2bobo2bo$2207bo2bo3bo2bo58bo3bo86bo2bobo 2bo98b2obobob2o$2208b2o5b2o60b3o14b2o71b3o3b3o98b2o5b2o$2163b2o113bo 14bo2bo299b2o$2163b2o128bobo300b2o$2294bo236b2o$2330b2o200b2o262bo$ 2299b2o29b2o144b2ob2o50bo264b2o$2298bo2bo172bo2bobo2bo312bobo$2298bobo 173bobo3bo3bo3b3o$2271bo7bo19bo24bo5bo143b3o3bo3bo3bobo$2270b4o3b4o42b 3o3b3o61bo88bo2bobo2bo$17b2o2251bo3bobo3bo23b2o17bob2ob2obo54b2o4b3o 89b2ob2o130bo$16bobo2252bo2bobo2bo23bo2bo15b2o7b2o53b2o3bo3bo223bobo$ 16bo2254b3o3b3o23bobo16b2o7b2o58b2ob2o223b2o$15b2o2198b2o87bo17b3o5b3o 41b2o15b2ob2o$2215b2o107b3ob3o43b2o144bo$2309b2o15bobo62b2ob2o86b2o5b 2o29b2o67b3o3b3o$2308bo2bo11bo2bobo2bo59b2ob2o86b2obobob2o28bobo67bo2b obo2bo148bo37b2o$2308bobo11bo2bo3bo2bo58bo3bo86bo2bobo2bo98b2obobob2o 147bo39b2o$2309bo13b2o5b2o60b3o14b2o71b3o3b3o98b2o5b2o147b3o36bo$2278b 2o113bo14bo2bo299b2o$2278b2o128bobo300b2o$15b2o11b2o2379bo198bo37b2o$ 7b2o7bo10b4o2414b2o160bo39b2o$4bo11bobo7bob2ob2obo2379b2o29b2o144b2ob 2o11b3o36bo$3bobo2b2o7b2o12b2o2bo2377bo2bo172bo2bobo2bo$bobob3o2bo15b 2o2b2o2b3o2376bobo173bobo3bo3bo3b3o$bo2b6o16b4obo2b3o2349bo7bo19bo24bo 5bo143b3o3bo3bo3bobo$4b2ob2o16bo2bo3bo2bo2349b4o3b4o42b3o3b3o61bo88bo 2bobo2bo167bo$3b6o2bo12b3o2bob4o2350bo3bobo3bo23b2o17bob2ob2obo54b2o4b 3o89b2ob2o130bo38b2o$2bo2b3obobo12b3o2b2o2b2o2351bo2bobo2bo23bo2bo15b 2o7b2o53b2o3bo3bo223bobo35bobo$3b2o2bobo15bo2b2o2356b3o3b3o23bobo16b2o 7b2o58b2ob2o223b2o$8bo17bob2ob2obo2295b2o87bo17b3o5b3o41b2o15b2ob2o$4b 2o24b4o2296b2o107b3ob3o43b2o144bo$31b2o2408bobo62b2ob2o86b2o5b2o29b2o 67b3o3b3o$2438bo2bobo2bo59b2ob2o86b2obobob2o28bobo67bo2bobo2bo$2437bo 2bo3bo2bo58bo3bo86bo2bobo2bo98b2obobob2o$2438b2o5b2o60b3o14b2o71b3o3b 3o98b2o5b2o$2393b2o113bo14bo2bo$2393b2o128bobo$2524bo$2560b2o$4bo2bobo 17bo2bobo2496b2o29b2o144b2ob2o$2b2obob3o15b2obob3o2495bo2bo172bo2bobo 2bo$3bo6bo15bo6bo2494bobo173bobo3bo3bo3b3o$2b2o5bo15b2o5bo2468bo7bo19b o24bo5bo143b3o3bo3bo3bobo$2500b4o3b4o42b3o3b3o61bo88bo2bobo2bo$3bo5b2o 6b2o7bo5b2o2466bo3bobo3bo42bob2ob2obo54b2o4b3o89b2ob2o$2bo6bo6bobo6bo 6bo2468bo2bobo2bo42b2o7b2o53b2o3bo3bo$3b3obob2o5bo9b3obob2o2467b3o3b3o 42b2o7b2o58b2ob2o$3bobo2bo6b2o9bobo2bo2413b2o105b3o5b3o41b2o15b2ob2o$ 2445b2o107b3ob3o43b2o$2556bobo62b2ob2o86b2o5b2o$2553bo2bobo2bo59b2ob2o 86b2obobob2o$2552bo2bo3bo2bo58bo3bo86bo2bobo2bo$2553b2o5b2o60b3o14b2o 71b3o3b3o$2508b2o113bo14bo2bo$2508b2o128bobo$15b2o2622bo$16bo2658b2o$ 3b2ob2obo6bobo7b6ob2o2640b2o$2b2o2b2ob2o6b2o7b6ob2o$10bo22b2o$2b2o22b 2o5b2o2581bo7bo44bo5bo$2b2o5b2o15b2o5b2o2580b4o3b4o42b3o3b3o61bo$9b2o 15b2o5b2o2580bo3bobo3bo42bob2ob2obo54b2o4b3o$2bo23b2o2588bo2bobo2bo42b 2o7b2o53b2o3bo3bo$2b2ob2o2b2o15b2ob6o2581b3o3b3o42b2o7b2o58b2ob2o$3bob 2ob2o16b2ob6o2525b2o105b3o5b3o41b2o15b2ob2o$2560b2o107b3ob3o43b2o$ 2671bobo62b2ob2o$2668bo2bobo2bo59b2ob2o$2667bo2bo3bo2bo58bo3bo$2668b2o 5b2o60b3o$2623b2o113bo$2623b2o2$2790b2o$2b6ob2o16bo2bobo2757b2o$2b6ob 2o14b2obob3o$9b2o15bo6bo$2b2o5b2o14b2o5bo2698bo7bo44bo5bo$2b2o5b2o 2719b4o3b4o42b3o3b3o$2b2o5b2o6b2o7bo5b2o2696bo3bobo3bo42bob2ob2obo$2b 2o12bobo6bo6bo2698bo2bobo2bo42b2o7b2o$2b2ob6o5bo9b3obob2o2697b3o3b3o 42b2o7b2o$2b2ob6o4b2o9bobo2bo2643b2o105b3o5b3o$2675b2o107b3ob3o$2786bo bo$2783bo2bobo2bo$2782bo2bo3bo2bo$2783b2o5b2o$2738b2o$2738b2o$15b2o$3b 4o9bo$2bo4bob2o5bobo7b6ob2o$2bo4bo3bo5b2o7b6ob2o$5b2o4bo21b2o$2b2o4bo 2bo14b2o5b2o$bo2bo3bo2bo14b2o5b2o$bo2bo4b2o15b2o5b2o$bo4b2o18b2o$bo3bo 4bo15b2ob6o$2b2obo4bo15b2ob6o2755b2o$6b4o2780b2o6$2814b2o$4b2o2808b2o$ 3b4o$2bob2ob2obo16bo2bobo$7b2o2bo13b2obob3o$2b2o2b2o2b3o13bo6bo$2b4obo 2b3o12b2o5bo$bo2bo3bo2bo$3o2bob4o6b2o7bo5b2o$3o2b2o2b2o5bobo6bo6bo$bo 2b2o10bo9b3obob2o$2bob2ob2obo4b2o9bobo2bo$6b4o2752b2o$7b2o2753b2o$ 2807b2o5b2o$2807bob2ob2obo$2808bobobobo$2808bobobobo$2675b2o130bo7bo$ 3bo2bo8b2o2658b2o78b3o3b3o$7bo8bo2737bo2bo3bo2bo$8b2o6bobo7b6ob2o2719b o3bobo3bo$2bob2o6bo4b2o7b6ob2o2718b2obobobobob2o43b2ob2o$2bo2bo3bo23b 2o2718b2ob2o3b2ob2o41bo2bobo2bo$bo3bob3o16b2o5b2o2719b3o5b3o42b3o3b3o$ o11bo13b2o5b2o2773bo5bo$3b3obo3bo14b2o5b2o$3bo3bo2bo15b2o2786b2o$o6b2o bo15b2ob6o2779b2o$3b2o21b2ob6o$5bo2617b2o137bo$6bo2bo2613b2o136bobo$ 2668b2o5b2o83bo3bo$2667bo2bo3bo2bo82b5o$2668bo2bobo2bo82bobobobo$2671b obo86bo3bo$2560b2o107b3ob3o67b2o$2560b2o105b3o5b3o65b2o15bo3bo$7b2o 2607b3o3b3o42b2o7b2o81bobobobo$8bo18bo2bobo2583bo2bobo2bo42b2o7b2o77b 2o3b5o$3b3o2b2o15b2obob3o2582bo3bobo3bo42bob2ob2obo78b2o3bo3bo$b3obo3b o16bo6bo2581b4o3b4o42b3o3b3o84bobo$bo4bob2o15b2o5bo2583bo7bo44bo5bo86b o$5bobo$3b2obo4bo5b2o7bo5b2o$3bo3bob3o4bobo6bo6bo2642b2o$3b2o2b3o6bo9b 3obob2o2641b2o$4bo10b2o9bobo2bo2607bo$4b2o2502b2o128bobo$2508b2o128bo 2bo94b3o3b3o$2553b2o5b2o77b2o95b3o3b3o$2552bo2bo3bo2bo172bob2o3b2obo$ 2553bo2bobo2bo173bob2o3b2obo$2556bobo177b2o5b2o$7b2o2436b2o107b3ob3o 43b2o131bo5bo$4bo10b2o11b2o2415b2o105b3o5b3o41b2o$3bobo2b2o6bo10b4o 2470b3o3b3o42b2o7b2o$bobob3o2bo5bobo7bob2ob2obo2466bo2bobo2bo42b2o7b2o 53b2o11bo$bo2b6o7b2o12b2o2bo2464bo3bobo3bo42bob2ob2obo54b2o5bo5b2o107b 2ob2o$4b2ob2o17b2o2b2o2b3o2463b4o3b4o42b3o3b3o62b2o2bobo98bo6b2o5bo$3b 6o2bo14b4obo2b3o2464bo7bo44bo5bo62b2o102b2ob2o3bobobob2ob2o$2bo2b3obob o13bo2bo3bo2bo2691b2ob2obobobo3b2ob2o$3b2o2bobo14b3o2bob4o2694bo5b2o6b o2b2o$8bo15b3o2b2o2b2o2525b2o168b2ob2o11bobo$4b2o19bo2b2o2530b2o184bo$ 26bob2ob2obo2489bo$30b4o2359b2o128bobo87b2o$31b2o2360b2o128bo2bo85bobo 114bo5bo$2438b2o5b2o77b2o71b3o3b3o8bo113b2o5b2o$2437bo2bo3bo2bo149bo2b obo2bo11b2o108bob2o3b2obo$2438bo2bobo2bo73b2o75b2obobob2o12b2o107bob2o 3b2obo$2441bobo76b2o75b2o5b2o11bo110b3o3b3o$2330b2o107b3ob3o43b2o237b 3o3b3o$16b2o2312b2o87bo17b3o5b3o41b2o$17bo2368b3o3b3o23bobo16b2o7b2o 309b3o$17bobo2366bo2bobo2bo23bo2bo15b2o7b2o53b2o254bo$18b2o2365bo3bobo 3bo23b2o17bob2ob2obo54b2o5bo90b2ob2o154bo$2385b4o3b4o42b3o3b3o62b2o86b o2bobo2bo$2386bo7bo19bo24bo5bo62b2o79b3o3bo3bo3bobo$2413bobo173bobo3bo 3bo3b3o$2413bo2bo172bo2bobo2bo$2414b2o29b2o144b2ob2o$2445b2o$2409bo$ 2278b2o128bobo87b2o235b2o$2278b2o128bo2bo85bobo235b2o$2323b2o5b2o77b2o 71b3o3b3o8bo89b2o5b2o$2322bo2bo3bo2bo149bo2bobo2bo98b2obobob2o210bobo$ 2323bo2bobo2bo73b2o75b2obobob2o28bobo67bo2bobo2bo211b2o$2326bobo76b2o 75b2o5b2o29b2o67b3o3b3o211bo$2324b3ob3o43b2o144bo$2322b3o5b3o41b2o$ 2271b3o3b3o42b2o7b2o$2271bo2bobo2bo42b2o7b2o53b2o$2270bo3bobo3bo42bob 2ob2obo54b2o5bo90b2ob2o$2270b4o3b4o42b3o3b3o62b2o86bo2bobo2bo$2271bo7b o44bo5bo62b2o79b3o3bo3bo3bobo$2474bobo3bo3bo3b3o289b3o$2474bo2bobo2bo 297bo39bo$2330b2o144b2ob2o11b3o36bo249bo39b2o$2330b2o160bo39b2o286b2o$ 2493bo37b2o$2383b2o211b2o$2278bo103bobo211b2o$2277b3o87b3o3b3o8bo89b2o 5b2o$2276bo3bo86bo2bobo2bo98b2obobob2o$2276b2ob2o86b2obobob2o28bobo67b o2bobo2bo$2276b2ob2o86b2o5b2o29b2o67b3o3b3o$2259b2o144bo386b2o$2259b2o 15b2ob2o511bobo$2276b2ob2o511bo38bobo$2271b2o3bo3bo551b2o$2271b2o4b3o 89b2ob2o458bo$2278bo88bo2bobo2bo$2359b3o3bo3bo3bobo$2359bobo3bo3bo3b3o $2359bo2bobo2bo$2361b2ob2o50bo$2417b2o$2416b2o$2481b2o320b3o$2481b2o 320bo39bo$2252b3o3b3o98b2o5b2o186bo249bo39b2o$2252bo2bobo2bo98b2obobob 2o187b2o286b2o$2252b2obobob2o98bo2bobo2bo186b2o$2252b2o5b2o98b3o3b3o3$ 2389b2o$2389bobo35bobo$2254b2ob2o130bo38b2o$2252bo2bobo2bo167bo386b2o$ 2244b3o3bo3bo3bobo554bobo$2244bobo3bo3bo3b3o266b2o286bo$2244bo2bobo2bo 274bobo35bobo$2246b2ob2o50bo225bo38b2o$2302b2o262bo$2301b2o$2366b2o$ 2366b2o$2244b2o5b2o147b3o$2244b2obobob2o147bo$2244bo2bobo2bo148bo$ 2244b3o3b3o2$2538b3o36bo$2538bo39b2o$2312bobo224bo37b2o$2313b2o$2313bo $2676b3o$2412b2o262bo$2412bobo262bo$2412bo$2838b2o$2838bobo$2251b2o 585bo$2251b2o335bobo$2324bo264b2o$2325b2o262bo$2324b2o$2688b2o$2688bob o$2423b3o36bo225bo$2423bo39b2o$2424bo37b2o3$2600bo$2601b2o$2335bobo 262b2o$2336b2o$2336bo2$2435b2o$2435bobo$2435bo3$2900bobo$2901b2o$2901b o8$2872b3o$2872bo39bo$2873bo39b2o$2912b2o11$2634bobo$2635b2o$2635bo2$ 2734b2o$2734bobo$2469b3o262bo$2469bo$2470bo8$2745b3o$2481b2o262bo$ 2481bobo35bobo224bo$2481bo38b2o$2520bo2$2619b2o$2619bobo$2619bo10$ 2630b3o$2630bo$2631bo3$2768b3o$2768bo$2542bobo224bo$2543b2o444bo$2543b o386b2o56bobo$2930bobo$2642b2o286bo38bobo10b2o2bo5bo$2642bobo325b2o10b 2o5bo$2642bo327bo15b2o3b2o4$2986b2o3b2o$2554bo434bo$2555b2o429bo5bo$ 2554b2o$2941b3o44bobo$2941bo47bo$2653b3o36bo249bo34bobo$2653bo39b2o 282b2o$2654bo37b2o284bo3bo7bo$2981bobo5bobo$2850bo133bo3bo$2849b3o129b o2bo3bo2bo$2843b2o3bo3bo129bobo3bobo$2843b2o2bo5bo130b2ob2o$2847bo5bo 127b2ob2ob2ob2o$2848bo3bo128b2o2bobo2b2o$2982b3o3b3o$2665b2o181bo3bo 130bo5bo$2665bobo179bo5bo$2665bo181bo5bo$2848bo3bo$2849b3o137b2o$2850b o138b2o$2840bo$2838b2o$2839b2o114b2o7b3o$2954bo2bo4bo4bo$2843bo7bo102b o2bo4bo5bo$2735bo105b2ob2o3b2ob2o100bo3bo8bo$2676b3o55b3o218b2o8b2o$ 2676bo51b2o3bo3bo106bobobobo$2677bo50b2o2bo5bo103bo3bobo3bo102b2o8b2o$ 2732bo5bo103bo2b2ob2o2bo105bo8bo$2733bo3bo105b3o3b3o100b2o8bo5bo10b2o$ 2844bo5bo101bo9bo4bo11b2o$2733bo3bo89bobo126bo7b3o$2732bo5bo88b2o124bo 2bo$2732bo5bo89bo$2733bo3bo$2734b3o113b2o$2688b2o45bo114b2o$2688bobo$ 2688bo$2817bo7b2o$2816b2o6bo2bo$2728bo7bo78bo8bo2b2o$2620bo105b2ob2o3b 2ob2o77b2obo4bo2bo$2600bo18b3o195b3o6bo$2601b2o10b2o3bo3bo106bobobobo$ 2600b2o11b2o2bo5bo103bo3bobo3bo79b3o6bo$2617bo5bo103bo2b2ob2o2bo76bob 2obo4bo2bo$2618bo3bo105b3o3b3o76bo10bo2b2o11b2o$2729bo5bo77bo3bo6bo2bo 12b2o$2618bo3bo89bobo99b4o7b2o$2617bo5bo88b2o$2617bo5bo89bo$2618bo3bo$ 2619b3o113b2o$2573b2o45bo114b2o$2573bobo34bo$2573bo34b2o$2609b2o91bo7b 2o$2701b2o6bo2bo$2613bo7bo78bo8bo2b2o$2505bo105b2ob2o3b2ob2o77b2obo4bo 2bo$2504b3o195b3o6bo$2498b2o3bo3bo106bobobobo$2498b2o2bo5bo103bo3bobo 3bo79b3o6bo$2502bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2503bo3bo105b3o3b 3o76bo10bo2b2o11b2o$2584b3o27bo5bo77bo3bo6bo2bo12b2o$2503bo3bo76bo12bo bo99b4o7b2o$2502bo5bo76bo11b2o$2502bo5bo89bo$2503bo3bo$2504b3o113b2o$ 2505bo114b2o3$2587bo7b2o$2586b2o6bo2bo$2498bo7bo78bo8bo2b2o$2496b2ob2o 3b2ob2o77b2obo4bo2bo$2587b3o6bo$2499bobobobo$2497bo3bobo3bo79b3o6bo$ 2497bo2b2ob2o2bo76bob2obo4bo2bo$2498b3o3b3o76bo10bo2b2o11b2o$2499bo5bo 77bo3bo6bo2bo12b2o$2584b4o7b2o4$2505b2o$2505b2o3$2472bo7b2o$2471b2o6bo 2bo$2470bo8bo2b2o$2471b2obo4bo2bo$2472b3o6bo2$2472b3o6bo$2469bob2obo4b o2bo$2468bo10bo2b2o11b2o$2468bo3bo6bo2bo12b2o$2469b4o7b2o! golly-3.3-src/Patterns/Life/Guns/Cordership-gun-p784.rle0000644000175000017500000020303412026730263017706 00000000000000#C p784 six-engine Cordership gun: Dave Greene, 2 May 2003 #C Herschel-based insertion of 37 gliders into three salvos x = 1285, y = 1065, rule = B3/S23 906bo6boo$906b3o4bobbobo$909bo5boob3o$908boo11bo$915boob3o$915boobo3$ 904boo3boo$904boo3boo4$900bo$899bobo$900bo7$917boo$917boo5$939boo$929b oo6boboo$929boo5bo$907boo30bo$908bo26boobo$905b3o27boo$905bo$932bo$ 931bobo$931boo$935boo16bo$935bobo14b3o$914boo14boo5bo6boo5bob3o$915bo 14boo5boo4bobo4bo3bo$864bo6boo39b3o26b3o5bo3bo$864b3o4bobbobo23bo11bo 27bo3bo3b3obo$867bo5boob3o20boo39bobboo4b3o$866boo11bo18boboo36boo10bo $873boob3o18b3obbo35bo7bo$873boobo22bobobo32bobo6bobo$900bobobo31boo3b oobboo$901bobb3o34boo$862boo3boo33boobo$862boo3boo34boo$903bo3bo$906bo bo40bo$907boo41bo$858bo44boo43b3o$857bobo42bobo$858bo43bo5boo$901boo5b oo$935boo$935boobboo$939bobo$940bo$943b3o$875boo60boo3bo$875boo61bo3bo 3bo$935b3o4bobbobo$935bo8bobobbo$945bo3bo$949bo$897boo47b3o31bo$887boo 6boboo79b3o$887boo5bo82bo$865boo30bo53bo25boo$866bo26boobo53bobo9boo$ 863b3o27boo54bo3bo9bo$863bo84bo3bo10bobo$890bo56bo3bo12boo10bo$889bobo 32bo21bo3bo24bobo$889boo56bobo25bobo$893boo16bo10bob3o21bo27bo4boo$ 893bobo14b3o11boobo16bo19boo15bobo$872boo14boo5bo6boo5bob3o10boboo15bo bo17bobo17bo8b3o$822bo6boo42bo14boo5boo4bobo4bo3bo12b3obo13boo18bo19b oo10bo$822b3o4bobbobo35b3o26b3o5bo3bo35boo13boo27bo3bo$825bo5boob3o21b o11bo27bo3bo3b3obo16bo19bobo40bobobbo$824boo11bo19boo39bobboo4b3o21bo 10boo5bo38bobbobo$831boob3o19boboo36boo10bo21bobo9boo5boo37bo3bo$831b oobo20b3obbo35bo7bo26boo55bo$857bobobo12b3o17bobo6bobo21boo60b3o$858bo bobo13bo17boo3boobboo21bobo44boo11bo$820boo3boo32bobb3o10bo23boo25bo5b oo39boo10bobo$820boo3boo33boobo61boo5boo51boo$861boo97boo27boo$861bo3b o92boboo27bobo$864bobo90bo26boo5bo$816bo48boo93bo23boo5boo$815bobo43b oo70b3o20boobo$395boo6bo412bo43bobo70b3o20boo$391bobobbo4b3o456bo5boo 65b3o25bo$389b3oboo5bo458boo5boo68b3o14bo7b3o$388bo11boo491boo41b3o13b obo9bo$389b3oboo498boobboo37b3o13boo9boo$391boboo502bobo56boo$898bo42b o14bobo$833boo66b3o36bobo8boo5bo$399boo3boo427boo60boo3bo40boo8boo5boo $399boo3boo490bo3bo3bo32boo$893b3o4bobbobo30bobo45boo$893bo8bobobbo28b o5boo40bo$903bo3bo27boo5boo38bobo$409bo444b3o50bo74boo$408bobo434boo7b 3o47b3o31bo$409bo435boo7b3o79b3o$823boo26b3o81bo$824bo26b3o55bo25boo$ 821b3o27b3o54bobo9boo74bo$774bo6boo38bo85bo3bo9bo72b3o$774b3o4bobbobo 61bo57bo3bo10bobo69bo$777bo5boob3o58bobo55bo3bo12boo10bo58boo$391boo 383boo11bo57boo33bo21bo3bo24bobo42boo$391boo390boob3o62boo15b3o34bobo 25bobo43bo$783boobo64bobo17bo8bob3o21bo27bo4boo27boo9bobo$830boo14boo 5bo6boo5bo3bo10boobo16bo19boo15bobo26boo10boo10bo$831bo14boo5boo4bobo 4bobobbo10boboo15bobo17bobo17bo8b3o31boo5bobo$772boo3boo49b3o26b3o4bo bbobo13b3obo13boo18bo19boo10bo29bobbo4bobo$369b3o400boo3boo36boo11bo 27bo3bo3bo3bo36boo13boo27bo3bo30boo6bo4boo$369b3o7boo475bobboo3bo20bo 19bobo40bobobbo26boo15bobo$369b3o7boo432bo3bo36boo9b3o21bo10boo5bo38bo bbobo27bobo17bo$372b3o26boo410bo4bo35bo7bo25bobo9boo5boo37bo3bo28bo19b oo$372b3o26bo366bo46bobobo32bobo6bobo25boo55bo31boo$372b3o27b3o362bobo 46bobobo31boo3boobboo22boo60b3o$404bo363bo48bo4bo34boo25bobo44boo11bo$ 377bo440bo3bo61bo5boo39boo10bobo$376bobo504boo5boo51boo$377boo440boobb o94boo27boo$355b3o15boo447bobo91boboo27bobo39boo6boo$354bo17bobo448boo 90bo26boo5bo39boo5boo$354bo3bo5boo6bo5boo14boo423boo97bo23boo5boo47bo$ 354bobbobo4bobo4boo5boo14bo390boo31bobo70b3o20boobo$356bobobbo4b3o26b 3o38boo6bo340boo31bo5boo65b3o20boo$357bo3bo3bo3bo27bo11boo21bobobbo4b 3o372boo5boo65b3o25bo$361bo3boobbo60b3oboo5bo409boo41b3o14bo7b3o$358b 3o9boo36bo3bo16bo11boo364bo43boobboo37b3o13bobo9bo$363bo7bo35bo4bo17b 3oboo371boo46bobo36b3o13boo9boo72booboo$362bobo6bobo32bobobo21boboo 370boobo46bo3bo53boo78bobobobo$363boobboo3boo31bobobo387boo6bobb3o48b oo38bo14bobo60boo16bobbobo$367boo34bo4bo388boo5bobobo44boo3boboo36bobo 8boo5bo61bo19boboo$403bo3bo32boo3boo328boo26bobobo46bobb3obbo36boo8boo 5boo60bobo16boo3bo$440boo3boo329bo24b3obbo44b3o5bobobo31boo82boo13bobo bbobo$402bobboo366b3o26boboo45bo8bobobo23boboobbobo45boo50boobbooboo$ 401bobo369bo29boo56bobb3o21boobobbo5boo40bo$401boo397bo3bo57boobo26b3o 5boo38bobo$405boo43bo348bobo61boo75boo160boo$405bobo41bobo347boo62bo 30b3o205boo$400boo5bo42bo352boo88bo3boboo$400boo5boo394bobo15boo44bo 26bobboobo$373boo407boo14boo5bo6boo5boboo43b3o9boo10bo3bo$369boobboo 408bo14boo5boo4bobo4bo46bob3o9bo10bo63bo$368bobo361bo6boo39b3o26b3o9bo 42bo3bo10bobo9bo60b3o$365bo3bo362b3o4bobbobo35bo27bo3bo4boobo42bo3bo 12boo3boo64bo$365boo368bo5boob3o21bo39bobboo4boo43b3obo17bobo64boo27b oo15boo$364boobo3boo59boo300boo11bo19bobo36boo31boo22b3o18bo51boo42boo 15bobo$363bobb3obbo60boo307boob3o19bo3bo35bo7bo24boobo21bo19b3o3bo6boo 38bo34boo25bo117boo$362bobobo5b3o366boobo22bo3bo32bobo6bobo27bo16bo19b oo5boobbo5bobo9bo16boo9bobo33bo25boo116boo$361bobobo8bo393bo3bo31boo3b oobboo25bo18bobo17bobo5boobo8bo9boo15boo10boo10bo22bobo$359b3obbo45boo 357bo3bo35boo30boboo14boo18bo9bo9boo7boobo30boo5bobo22boo73boo$360bob oo366boo3boo33bobo70boo18boo13boo27bobb3o28bobbo4bobo97boo$329bo31boo 45bo3bo317boo3boo34bo91bobo40bobobo31boo6bo4boo$329b3o30bo45bo4bo6boo 353bo71bo10boo5bo39bobobo28boo15bobo$332bo77bobobo5boo314bo37bobo69bob o9boo5boo36b3obbo28bobo17bo35bo$331boo25bo52bobobo26boo291b4o36boo70b oo55boboo29bo19boo32b3o$346boo9b3o52bo4bo24bo283bo6boo3bo32boo70boo60b oo29boo52bo$346bo9b3obo52bo3bo25b3o279bobo4bobo4bo30bobo69bobo44boo11b o3bo83boo20bo$344bobo10bo3bo83bo280bo4bobbo35bo5boo64bo5boo39boo10bobo 90boo16b3o82boo$333bo10boo12bo3bo51boobbo311bo8bo29boo5boo63boo5boo51b oo92bo19bo82bo$332bobo24bob3o53bobo311bobo69boo70b3o27boo86bo20boo11b oo66b3o$332bobo25b3o22boo31boo313bo69boobboo66b3o27bobo85boo32boo66bo$ 327boo4bo27bo21boboo27boo317boo72bobo65b3o22boo5bo39boo$316bo9bobo15b oo19bo16bo13b3o14bobo318bo73bo41bo21b3o25boo5boo38boo$315boo9bo17bobo 17bobobboo14bo10b3o6boo6bo5boo14boo412bobo20b3o$314boboo7boo19bo18boob oo11boobo11b3o6bobo4boo5boo14bo307boo60boo4b3o34bo3bo19b3o184boo$313b 3obbo27boo13boo7bo10boo16b3o5b3o26b3o39boo6bo256boo61bo4b3o35bo3bo23bo 181boo$315bobobo40bobo36b3o4bo3bo27bo35bobobbo4b3o316b3o5b3o36bo3bo14b o7b3o116boo90boo$316bobobo39bo5boo10bo20b3o4boobbo39bo21b3oboo5bo319bo 10b3o34bo3bo12bobo9bo91boo3boo17boo91bo$317bobb3o36boo5boo9bobo31boo 36b3o19bo11boo329b3o35bobo13boo9boo92bo3boo110bobo15boo$318boobo55boo 25bo7bo35bob3o19b3oboo287bo48b3o36bo18boo79booboo13bo66boo50boo15boo$ 319boo60boo20bobo6bobo32bo3bo22boboo268bo17b3o81bo8bo14bobo77bobobobo 12boo64bobo$319bo3bo11boo44bobo20boobboo3boo31bo3bo294bobo7boo6bob3o 78b3o7bobo8boo5bo60boo16bobbobo14bobboo59bo$322bobo10boo39boo5bo24boo 35b3obo295bobo7boo5bo3bo78bo11boo8boo5boo60bo19boboo13bo3bo58boo$323b oo51boo5boo61b3o33boo3boo244boo11bo14bo3bo53bo25boo6boo81bobo16boo3bo 13b3o12boo$319boo27b3o96bo34boo3boo245bo25b3obo65boo20bobo45boo35boo 13bobobbobo16bobo10bo16bo$318bobo27b3o92bo287b3o27b3o53b3obo9bo20bo5b oo40bo51boobbooboo16boo11b3o7boobobobo$318bo5boo22b3o91bobo286bo30bo 53boboo11bobo17boo5boo38bobo91bo7bobooboo20boo$317boo5boo25b3o21bo66b oo314bo57boobo12boo10bo53boo127bo$351b3o20bobo69boo44bo264bobo31b3o20b ob3o17bo6bobo182b3o$351b3o19bo3bo68bobo42bobo263boo20boo9bo45bo6bobo 184bo$348bo23bo3bo64boo5bo43bo268boo27bo3bo21bo27bo4boo209boo$346b3o7b o14bo3bo65boo5boo311bobo14bo3bo7bobbobo16bo19boo15bobo208boo46boo$345b o9bobo12bo3bo39boo324boo14boo5bo6boo5bo4bo9bobobbo13bobo17bobo17bo60bo 195bobo$345boo9boo13bobo36boobboo274bo6boo42bo14boo5boo4bobo4bobobo12b o3bo13boo18bo19boo7b3o47b3o197bo$352boo18bo36bobo278b3o4bobbobo35b3o 26b3o5bobobo17bo17boo13boo28b3o46bo200boo$351bobo14bo41bo282bo5boob3o 33bo27bo3bobbo4bo15b3o18bobo42b3o46boo$351bo5boo8bobo36bo285boo11bo60b obboobbo3bo21bo10boo5bo39b3o34boo42boo15boo$350boo5boo8boo36bobo4boo 60boo223boob3o20boo26bobo8boo32bobo9boo5boo38b3o35bo42boo15bobo$371boo 31bo3bo3bo61boo223boobo22boobo25boo8bo7bobboo22boo56b3o24boo9bobo32boo 25bo$324boo45bobo29bo3bo5b3o313bo24bo7bobo6bobo21boo87boo10boo10bo22bo 25boo$325bo40boo5bo28bo3bo8bo310bo35boo3boobboo21bobo44boo11bo52bobo 21bobo141boo$325bobo38boo5boo26bo3bo47bo234boo3boo32boboo36boo25bo5boo 26bo12boo10bobo51bobo22boo73boo66boo$326boo74bobo47boo234boo3boo34boo 62boo5boo26boo23boo53bo4boo92boo$370bo32bo47boboo372boobo26boo37boo15b obo175boo$370b3o77b3obbo6boo269bo92bobb3o25bobo35bobo17bo175bo42bobo$ 373bo78bobobo5boo268bobo66boo22bobobo22boo5bo35bo19boo34bo140bo41boobo $372boo79bobobo26boo198bo48boo89bobobo23boo5boo33boo53b3o139boo27bo16b 3o15bo$313bo73boo9boo54bobb3o24bo198bobo43boo68bo3bo18b3obbo120bo171b 3o11boo4bo14b3o$313b3o71bo10boobo53boobo26b3o196bo43bobo68bo4bo18boboo 121boo20bo152bo10bob5o17bo$316bo68bobo14bo53boo29bo240bo5boo65bobobo 18boo3bo122boo16b3o127boo20boo12bo20boo$315boo57bo10boo12bo26bo29bo3bo 266boo5boo66bobobo14bo3bo3b3o121bo19bo126boo33bo3boo26boo$330boo41bobo 5boo17boboo22boo31bobo299boo40bo4bo11bobo9bo118bo20boo11boo68boo52boo 23bo3bobo26bo$330bo42bobo4bobbo18boo21boobo31boo299boobboo37bo3bo11boo 9boo72boo44boo32boo69bo50bobbo23boo3bo25bobo31b3o$328bobo9boo26boo4bo 6boo41bobb3o26boo307bobo42b3o11boo79boo146b3o51boo4boo44boo4boo32b3o$ 317bo10boo10boo25bobo15boo19bo16bobobo10boo15bobo308bo38boobb5o10bobo 226bo37boo20bo44bobbo26bo10b3o$316bobo5boo31bo9bo17bobo17bobo14bobobo 11boobo5boo6bo5boo14boo222boo67bo37bobboboo4boo5bo265bo18bobo45boo27b 3o5b3o$316bobo4bobbo29bobo7boo19bo18boo12b3obbo16bo4bobo4boo5boo14bo 223boo60boo44b5o5boo5boo189boo73bobo16boo34boo42bo4b3o$311boo4bo6boo 29bo3bo27boo13boo17boboo14bo9b3o26b3o283bo3bob3o32boo3boo142booboo58b oo3bo70boo52boo41boo4b3o$310bobo15boo26bo3bo40bobo18boo16boboo4bo3bo 27bo280b3o6boobo30bobo5bo39boo100booboo5boo55bo$310bo17bobo26bo3bo16bo 22bo5boo10bo3bo18boo4boobbo39bo24boo6bo197boo36bo8boboo30bo5boo40bo77b oo3boo17boo7bobboo53b3o169bo$309boo19bo27bo3bo13bo23boo5boo9bobo32boo 36bobo19bobobbo4b3o245b3obo27boo5boo38bobo58booboo15bo3boo19b3o3b3obbo 78boo111bo32bobo$330boo27bobo56boo26bo7bo35bo3bo16b3oboo5bo199bo3bo 123boo58bobobobo12bo22bo3bo5bo4bo28boo49bo59b3o48bobo15bo11boobboo$ 360bo14boo3bo41boo21bobo6bobo32bo3bo16bo11boo189boo6bo4bo46bo32bo86boo 16bobbobo12boo21bo3b3o3b5o28bobo49bobo15boo40boboboo45bobo13b3o11boo 11bo$364bo10bo3bo42bobo21boobboo3boo31bo3bo18b3oboo196boo5bobobo79b3o 87bo19boboo13bobboo16bo10boo30bo52boo15boo40bobobbo46bo13bo27b3o$363bo bo10b3o10boo26boo5bo25boo35bo3bo21boboo174boo26bobobo53bo25bo90bobo16b oo3bo12bo3bo58boo116b3o58boo29bo$364boo51boo5boo62bobo201bo24bo4bo54b oo24boo90boo13bobobbobo14b3o12boo164boo7boo32boo3boo40boo$156boo202boo 25bo3bo88bo8bo199b3o25bo3bo54boobo8boo74bo45boobbooboo15bobo10bo165bo 8boo11boo20bo3bo51boo$157bo161boo38bobo25bo4bo86boo4boo34boo3boo161bo 85bobb3o8bo72b3o70boo11b3o7boobo173bo18b3o5b3o48bo$157bobo159boo38bo5b oo22bobobo85bobobbobbo33boo3boo188bobboo53bobobo10bobo69bo88bo7boboo 23boo105boo5boo35b3o15bo9bo46bobo$158boo198boo5boo23bobobo21bo67boo 229bobo55bobobo12boo10bo58boo122bo106bobboobboo37bo66boo4boo$391bo4bo 92bo225boo33bo20b3obbo24bobo42boo138b3o104boobo107bobbo$392bo3bo17b3ob o68boobo228boo28bobo20boboo25bobo43bo140bo105bo23boo85boo$389bo23boboo 66boo5bo40bo187bobo14b3o9bo3bo20boo27bo4boo27boo9bobo168boo74bo23bo74b oo$387b3o3boobbo15boobo66boo5boo38bobo165boo14boo5bo6boo6b3o10bo3bo16b o3bo15boo15bobo26boo10boo5bobo3boo155boo75boobboo18b3o71boo$386bo9bobo 12bob3o40boo73bo167bo14boo5boo4bobo6b3o11bo3bo14bobo17bobo17bo9bo36boo 5bo146bo86bobbo20bo$157boo151booboo71boo9boo53boobboo192bo6boo37b3o26b 3o5b3o15bo3bo13boo18bo19boo45b3ob3o145boo56boo29boo$157boo4boo144bobob obobb3o72boo18bo37bobo196b3o4bobbobo33bo27bo3bo4b3o16bobo18boo13boo27b 3obo38boo3boo142boo55bobo$163boo144bobobbo3bo12boo59bobo14bo42bo200bo 5boob3o19bo39bobboo4b3o17bo19bobo40boboo28boo15bobo28boo15boo153bo92b oo$308boobo7bo11bo60bo5boo8bobo241boo11bo17b3o36boo33bo10boo5bo40boobo 27bobo17bo28boo15bobo152boo91boo$307bo3boo15boobo59boo5boo8boo37b3o4b oo203boob3o17b3obo35bo7bo25bobo9boo5boo37bob3o28bo19boo19boo25bo$308bo bobbobo14bo81boo33b3o4bo204boobo20bo3bo32bobo6bobo25boo87boo41bo25boo$ 162boo143booboobboo10bo38boo45bobo32b3o5b3o55boo169bo3bo31boo3boobboo 22boo61bo72bobo310boo3boo$158boobboo159boo41bo40boo5bo29b3o10bo55boo 170bob3o35boo25bobo44boo11bo77boo73boo66boo147boo19bo3bo$157bobo163b4o bo37bobo38boo5boo28b3o201boo3boo31b3o63bo5boo39boo10bobo151boo66boo15b o131bobo5bo9b3o5b3o$157bo12boo154b3o38boo75b3o201boo3boo32bo63boo5boo 26bo24boo236bobo132bo5boo8bo9bo$156boo11bobo151boobboo83bo278bo93b3o 27boo232boo133boo3boobo$169bo18bo133bobb3o84b3o77bo197bobo91bob3o26bob o39boo50bo278bobb3o$168boo18b3o60bo18bo50b3obboo87bo275boo90bo3bo22boo 5bo39boo48b3o139boo127bo8bobobo$191bo59b3o6boo6b3o51bobbo88boo25bo48bo b3o6boo141bo42boo70b3o20bo3bo23boo5boo87bo142bo42bobo83b3o5bobobo$190b oo62bo5boo5bo55b3o28bo74boo61boobo5boo140bobo40bobo69bo22b3obo120boo 20bo121bo41boobo85bobb3obbo$187boo64boo12boo55bo29b3o72bo9bob3o48boboo 27boo54boo6bo56bo41bo5boo64bo3bo19b3o125boo16b3o118boo27bo16b3o15bo66b oo3boboo$187bob5o163bo69bobo11boobo48b3obo25bo51bobobbo4b3o97boo5boo 64bobbobo19bo3bo123bo19bo146b3o11boo4bo14b3o70boo$193bo117boo15boo26b oo58bo10boo12boboo79b3o46b3oboo5bo134boo39bobobbo13bo7b3o119bo20boo11b oo136bo10bob5o17bo66bo3bo56boo$188boobo74boo42bobo15boo41boo42bobo24b 3obo20b3o25bo30bo45bo11boo133boobboo36bo3bo12bobo9bo118boo32boo68boo 43boo20boo12bo20boo65bobo24bo32boboo$188booboo68boo3boo42bo25boo33bo 43bobo52bo28bo73b3oboo144bobo39bo12boo9boo72booboo146bo43boo33bo3boo 26boo51boobboo57bo$261boo46boo25bo32bobo9boo27boo4bo27bo21bo3bo27bobo 74boboo145bo37b3o17boo78bobobobo142b3o53boo23bo3bobo26bo52boo27b3obo 32bo$176boo156bobo21bo10boo10boo26bobo15boo19bo16bobobbo28boo227bo38bo 14bobo60boo16bobbobo142bo53bobbo23boo3bo25bobo31b3o37bo8boboo30boobo$ 176boo156boo21bobo49bo17bobo17bobo13bobbobo9bo16boo164boo58boo4bobo36b obo8boo5bo61bo19boboo105boo88boo4boo44boo4boo32b3o37b3o6boobo30boo$ 357bobo38b3o7boo19bo18boo13bo3bo9bobo14bobo86boo3boo71boo59bo3bo3bo36b oo8boo5boo60bobo16boo3bo104boo72boo20bo44bobbo26bo10b3o40bo3bob3o6b3o$ 192boo78bo79boo4bo39b3o28boo13boo17bo12bo3bo5boo6bo5boo14boo65boo3boo 129b3o5bo3bo31boo82boo13bobobbobo42boo136bo18bobo41bo3boo27b3o5b3o42b oo14b3o19bo$192boo76b3o78bobo15boo27b3o42bobo18b3o10bo3bo4bobo4boo5boo 14bo202bo8bo3bo23boboobbobo45boo50boobbooboo17boo3boo17boo136bobo16boo 34boo4bobo35bo4b3o49bo8b3o18bobo$269bo46bo34bo17bobo29b3o39bo5boo10bo 16bo3bo5b3o26b3o209bo3bo22boobobbo5boo40bo78bo3boo156boo52boo5boo34boo 4b3o45bo15b3o15boo5boo$269boo45b3o31boo19bo29b3o38boo5boo9bobo16bo3bo 3bo3bo27bo163bo46bobo27b3o5boo38bobo76bo66boo48boo195bobo14b3o19boobbo $319bo51boo28b3o56boo18bobo4boobbo38b3o60bo88b3o46bo76boo77boo64bobo 49bo145bo22boo21boobboo15b3o19boboo$297bo20boo144boo15bo10boo39bo58bob o78boo6bob3o76b3o124bobboo59bo51bobo15boo92bo32bobo21boobboo17boo36boo 5bo12bo$295b3o16boo90bo11boo44bobo18bo7bo35bo3bo59bo79boo5bo3bo76bo3bo boo120bo3bo58boo52boo15boo91bobo15bo11boobboo26bobo42bo11boo5bo12boo$ 294bo19bo90bobo10boo12bo26boo5bo17bobo6bobo32bobobbo117boo26bo3bo77boo bboobo121b3o12boo209bobo13b3o11boo11bo19bobboo38bobo15boo12boobo$198b oo81boo11boo20bo89boo23boo26boo5boo17boobboo3boo30bobbobo120bo25b3obo 52boo9boo144bobo10bo211bo13bo27b3o8boobo49boo14bo13bobb3o$199bo81boo 32boo85boo26boboo55boo35bo3bo118b3o27b3o51boboo10bo74bo70boo11b3o7boob o211boo29bo7boboobboobbo3bo34boo16b3o3bo8bobobo$175boo22bobo158boo39bo bo25b3obbo91bo122bo30bo51bo14bobo70b3o85bo7boboo23boo135boo32boo3boo 40boo14bobbo4bo32bobo15bo6b3o5bobobo$174bobo23boo158boo39bo5boo22bobob o22boo67b3o146bo31bo10boo14bo12boo10bo58bo123bo136boo11boo20bo3bo51b6o 5bobobo31bo5boo10boo8bobb3obbo$174bo225boo5boo23bobobo87bo150bobo29boo 9boo11boobo24bobo57boo27boo15boo77b3o146bo18b3o5b3o48bo11bobobo29boo5b oo19boo3boboo$173boo258bobb3o18bo3bo61bobo49boo98boo20boo7boboo10bo10b oo26bobo42boo42boo15bobo78bo103boo5boo35b3o15bo9bo46bobobboobo6bo4bo 61boo$434boobo18bo4bo61boo50boo102boo24b3obbo49bo4boo38bo34boo25bo182b obboobboo37bo66boo4boo3boboo7bo3bobboo54bo3bo$312boo117bo3boo18bobobo 67boo150bobo14bo3bo6bobobo16bo19boo15bobo26boo9bobo33bo25boo182boobo 107bobbo26boobboo49bobo$312boo17boo3boo91b3o3bo3bo14bobobo68bobo128boo 14boo5bo6boo5bo4bo7bobobo14bobo17bobo17bo9bo16boo10boo10bo22bobo208bo 23boo85boo21boo8bobo44boobboo$199boo130boo3bo91bo9bobo11bo4bo64boo5bo 129bo14boo5boo4bobo4bobobo10bobb3o12boo18bo19boo7bobo31boo5bobo22boo 73boo133bo23bo74boo44bo45boo9boo$199boo4boo131bo12booboo72boo9boo11bo 3bo65boo5boo22b3o100b3o26b3o5bobobo12boobo17boo13boo27bo3bo29bobbo4bob o97boo105boo27boobboo18b3o71boo47b3o51boo$205boo68boo60boo11bobobobo 78boo58boo55bo103bo27bo3bobbo4bo14boo18bobo40bo3bo31boo6bo4boo199bobo 28bobbo20bo114boo3bo$271boobbobboo52boobbo13bobobbo16boo60bobo14bobboo 35boobboo55bo3bo6boo119bobboobbo3bo15bo3bo10boo5bo39bo3bo28boo15bobo 156boo42bo28boo138bo3bo3bo12bo$272bo3boboo52bo3bo12boobo19bo61bo5boo8b obo37bobo59bobbobo5boo78boo37boo30bobo9boo5boo37bo3bo28bobo17bo35bo 120boo42boo164b3o4bobbobo12bo$192boo78bobobo42boo12b3o12bo3boo16bobo 60boo5boo8boo39bo62bobobbo25boo56boobo35bo7bobboo20boo56bobo29bo19boo 32b3o257boo71bo8bobobbo8b3o$148bobo42bo10boo67booboboo40bo10bobo15bobo bbobo13boo82boo31bo67bo3bo25bo61bo32bobo6bobo19boo61bo29boo52bo260boo 81bo3bo$147boboo41bo7boobboo70bobbo4boo20boboo7b3o11boo15booboobboo50b oo45bobo29b3o4boo64bo26b3o55bo35boo3boobboo19bobo44boo11bo87boo20bo 325bo$129bo15b3o16bo27boo5bobo74boo6boo20boobo7bo90bo40boo5bo28bob3o3b o62b3o29bo56boboo36boo23bo5boo26boo11boo10bobo90boo16b3o320b3o$127b3o 14bo4boo11b3o34bo12boo194bobo38boo5boo26bo3bo5b3o64bo85boo60boo5boo51b oo92bo19bo276boo3boo114bo$126bo17b5obo10bo36boo11bobo195boo72bo3bo8bo 63bobo180bo3bo25boo86bo20boo11boo243boo19bo3bo114bobo$126boo20bo12boo 20boo26bo18bo251b3obo74boo88bo90bo4bo25bobo85boo32boo243bobo5bo9b3o5b 3o111bobo$116boo26boo3bo33boo25boo18b3o250b3o54bo16boo91bobo88bobobo 22boo5bo39boo137bo187bo5boo8bo9bo92boo16booboo$83b3o31bo26bobo3bo23boo 57bo58bo18bo139bo32bo71bobo92boo65bo21bobobo23boo5boo38boo135boo43boo 8boo133boo3boobo110boo$82bo34bobo25bo3boo23bobbo54boo58b3o6boo6b3o139b 3o84bob3o5boo6bo5boo14boo67boo89bo4bo209boo42boo8bo42bobo93bobb3o127b ooboo$82bo3bo31boo4boo44boo4boo51boo64bo5boo5bo87bo57bo85boobo4bobo4b oo5boo14bo67bobo67bob3o17bo3bo184boo79bo41boobo82bo8bobobo93boo34boobo $82bobbobo8bo26bobbo44bo20boo35bob5o58boo12boo86b3o54boo85boboo6b3o26b 3o38boo6bo17bo5boo64boobo23bo181boo78boo27bo16b3o15bo64b3o5bobobo93bob o39bo$84bobobbo4b3o27boo20bo24bobo18bo42bo163bo68boo9b3o59b3obo3bo3bo 27bo34bobobbo4b3o16boo5boo64boboo15bobboo3b3o116boo170b3o11boo4bo14b3o 65bobb3obbo32boo60bo40boo$85bo3bo3bo42boo7boo25boo16bobo37boobo118boo 15boo27boo68bo10b3o67boobbo60b3oboo5bo53boo38b3obo12bobo9bo91boo3boo 17boo173bo10bob5o17bo63boo3boboo32boo60boo$89bo3boo41boo7bobo42boo38b ooboo72boo42bobo15boo42boo51bobo10b3o61bo10boo36b3o18bo11boo52boobboo 51boo9boo92bo3boo169boo20boo12bo20boo69boo35bo$86b3o213boo3boo42bo25b oo34bo41bo10boo14b3o22boo38bo7bo36b3o19b3oboo63bobo35bo18boo79booboo 13bo66boo108boo33bo3boo26boo56bo3bo56boo71boo$91bo63b3o60boo82boo46boo 25bo33bobo9boo29bobo25b3o61bobo6bobo34b3o21boboo64bo40bo14bobo77bobobo bo12boo64bobo117boo23bo3bobo26bo32bo23bobo24bo32boboo22boo47boo4boo$ 90bobo32bo26bobobobo59boo155bobo22bo10boo10boo29bobo25b3o21bo3bo36boo bboo3boo31b3o96bo35bobo8boo5bo60boo16bobbobo14bobboo59bo117bobbo23boo 3bo25bobo52boobboo57bo26boobboo20boo27bobo$91boobboo11bo15bobo24boobo 3bo216boo22bobo5boo40boo4bo49bo4bo40boo36b3o89boo42boo8boo5boo60bo19bo boo13bo3bo58boo117boo4boo44boo4boo31b3obo17boo27b3obo32bo27bobo18bobo 29bo$83bo11boo11b3o13bobo25bobobboo75boo163bobo4bobbo38bobo15boo19bo 16bobobo80b3o32boo3boo51bo3bob3o30boo81bobo16boo3bo13b3o12boo118boo28b oo20bo34boo8bobbo26bo8boboo38bo8boboo30boobo29bo19bo31boo$81b3o27bo13b o24bo5bo77boo77bo80boo4bo6boo29bo9bo17bobo17bobo14bobobo116boo3boo48b 3o6boobo28bobo45boo35boo13bobobbobo16bobo10bo120bo29bo18bobo32bo3bo8b oo27b3o6boobo38b3o6boobo30boo35bo14boo23boo$80bo29boo38boobobbo154b3o 79bobo15boo24b3o7boo19bo18boo12bo4bo79bo92bo8boboo28bo5boo40bo51boobb ooboo16boo11b3o7boobo103b3o30bobo16boo32bo4bo40bo3bob3o42bo3bob3o6b3o 52boo4bobo38boo$80boo40boo3boo20booboobo5boo147bo46bo35bo17bobo22b3obo 27boo13boo16bo3bo79bobo101b3obo25boo5boo38bobo91bo7boboo23boo78bo33boo 50bo4bo39boo49boo14b3o19bo33bo3bo3bo$70boo51bo3bo20boo11boo147boo45b3o 32boo19bo23bo3bo40bobo100boo179boo127bo165boo50bo50bo8b3o18bobo29b3o5b o3bo$71bo48b3o5b3o18bo210bo52boo23bo3bo39bo5boo10bobboo84boo43bo56bo 32bo171b3o164b3o43bo50bo15b3o15boo5boo23bo8bo3bo30bo$71bobo46bo9bo15b 3o35boo5boo145bo20boo78bob3o37boo5boo9bobo87bobo41bobo86b3o173bo176bo 32bobo48bobo14b3o19boobbo33bo3bo28bobo$72boo4boo66bo37boobboobbo143b3o 16boo83b3o56boo83boo5bo42bo60bo25bo352bobo15bo11boobboo22boo21boobboo 15b3o19boboo35bobo30bo$77bobbo107boboo143bo19bo85bo61boo79boo5boo102b oo24boo351bobo13b3o11boo11bo14boobboo17boo36boo5bo12bo24bo$78boo85boo 23bo131boo11boo20bo87bo11boo44bobo51boo135boobo8boo72bo63boo122boo105b o13bo27b3o16bobo42bo11boo5bo12boo$90boo74bo23bo26boo103boo32boo86bobo 10boo39boo5bo47boobboo134bobb3o8bo70b3o63bobo122bo119boo29bo16bobboo 38bobo15boo12boobo$90boo71b3o18boobboo26bobo183boo41boo24bo26boo5boo 45bobo18bo118bobobo10bobo67bo66bo124bobo15boo49boo32boo3boo40boo60boo 14bo13bobb3o$163bo20bobbo28bo185boo37boo110bo19boo116bobobo12boo10bo 56boo191boo15boo49boo11boo20bo3bo51boo3boobbo3bo34boo16b3o3bo8bobobo$ 186boo27boo223bobo26bob3o98bobo93bo20b3obbo17boo5bobo40boo42boo15boo 226bo18b3o5b3o48bo5bobbo4bo32bobo15bo6b3o5bobobo$440bo5boo23boobo74boo 4boo59boo49bobo20boboo17bobbo4bobo41bo42boo15bobo182boo5boo35b3o15bo9b o46bobobb3o5bobobo31bo5boo10boo8bobb3obbo$122boo315boo5boo23boboo72bob oo4bo60boo48bo3bo20boo19boo6bo4boo25boo9bobo32boo25bo182bobboobboo37bo 66boo4boo3bo8bobobo29boo5boo19boo3boboo$122boo229boo117b3obo20boo47bo 9b3o108bo3bo16bo3bo15boo15bobo24boo10boo10bo22bo25boo182boobo107bobbo 18bo4bo61boo$353boo17boo3boo99bobo14boboo50bo8bo109bo3bo14bobo17bobo 17bo9bo30boo5bobo21bobo208bo23boo85boo20bo3bobboo54bo3bo$372boo3bo92bo 3bo7bo11bo50boobo120bo3bo13boo18bo19boo38bobbo4bobo22boo73boo133bo23bo 74boo39boobboo49bobo$76boo3boo296bo13booboo70b3o7bo4bo13bo47boo123bobo 18boo13boo27b3obo28boo6bo4boo92boo134boobboo18b3o71boo33boo8bobo44boo bboo$77bo3bo19boo213boo60boo12bobobobo68bo9bo5bo9boobo16bo80b3o74bo19b obo40boboo26boo15bobo229bobbo20bo117bo45boo9boo$74b3o5b3o15bobo209boo bbobboo52boobbo14bobobbo16boo51boo9bo3boo9boo18b3o78b3o7boo69bo10boo5b o40boobo25bobo17bo229boo143b3o51boo$74bo9bo15bo133boo77bo3boboo52bo3bo 13boobo19bo59boobbo3bo33bo24boo51b3o7boo68bobo9boo5boo37bob3o26bo19boo 34bo332boo3bo$93boo4boo89bobo42bo19boo56bobobo42boo12b3o13bo3boo16bobo 58bobo5bo8bo24boo80b3o26boo47boo85boo53b3o121boo134boo74bo3bo3bo$93boo bo92boboo41bo20boo57booboboo40bo10bobo16bobobbobo13boo59bo5bobo7bobo 38boo7bo3bo53b3o26bo44boo61bo81bo124boo45boo87boo71b3o4bobbobo$97bo8bo 64bo15b3o16bo27boo81bobbo4boo20boboo7b3o11boo16booboobboo73boo5boo8boo 39bo8bo4bo52b3o27b3o40bobo44boo11bo85boo20bo149bobo159bo8bobobbo$94bo 9b3o62b3o14bo4boo11b3o110boo6boo20boobo7bo134boo33bobo10bobobo83bo40bo 5boo39boo10bobo88boo16b3o149bo169bo3bo$95boboo4bo64bo17b5obo10bo242boo 45bobo21bo10boo12bobobo55bo66boo5boo26bo24boo90bo19bo148boo126boo3boo 39bo$97boo4boo63boo20bo12boo20boo220bo40boo5bo20bobo24bo4bo20bo31bobo 99b3o27boo84bo20boo11boo243boo19bo3bo37b3o$40bo117boo26boo3bo33boo220b obo38boo5boo19bobo25bo3bo19b3o31boo98bob3o26bobo37boo44boo32boo54bobo 186bobo15b3o5b3o112bo$39b3o59bo57bo26bobo3bo23boo230boo61boo4bo49bob3o 8b3o15boo101bo3bo22boo5bo37boo134boo189bo5bo9bo9bo111bobo$38b3obo32bo 24bobo22b3o31bobo25bo3boo23bobbo114bo18bo156bobo15boo15boobbo16bo3bo8b o17bobo77b3o20bo3bo23boo5boo173bo189boo3b3o130bobo$39bo3bo30bobo24boo bboo18b3o32boo4boo44boo4boo114b3o6boo6b3o156bo17bobo17bobo14bo3bo9bo3b o5boo6bo5boo14boo55bo22b3obo400bob3o110boo16booboo$40bo3bo28bo3bo27boo 18b3o10bo26bobbo44bo20boo4boo95bo5boo5bo148boo8boo19bo18boo13b3obo10bo bbobo4bobo4boo5boo14bo42boo6bo5bo3bo19b3o182boo69boo136bo8bo3bo111boo$ 41bob3o28bo3bo8bo40b3o5b3o27boo45bobo18bo5boo94boo12boo147boobo27boo 13boo18b3o13bobobbo4b3o26b3o35bobobbo4b3o5bobbobo19bo3bo179boo69boo 136b3o5bo3bo130booboo$42b3o22b3o5bo3bo5b3o40b3o4bo42boo34boo16bobo65bo 134bo67bo40bobo19bo15bo3bo3bo3bo27bo11boo20b3oboo5bo10bobobbo13bo7b3o 8boo104boo273bo3b3obo95boo34boobo$43bo26bo5bo3bo3bo43b3o4boo41boo52boo 67boo91boo15boo22b3o62bo43bo5boo10bo23bo3boobbo60bo11boo10bo3bo12bobo 9bo6b3o80boo3boo17boo147boo123boo4b3o55boo38bobo39bo$47bo18bo3bo6bobo 4boo214boo47boo42bobo15boo25bo62boboo38boo5boo9bobo19b3o9boo36bo3bo18b 3oboo21bo12boo9boo6bobbo60booboo15bo3boo166bo42bobo86bo96bo40boo$46bob o16bobobbo7bo54bo210boo3boo42bo25boo16boo64boo56boo25bo7bo35bo4bo20bob oo18b3o17boo14b3o59bobobobo12bo66boo106bo41boobo81bo25bo33bo3bo35boo$ 40boo5boo14bobbobo13bo49bobo209boo46boo25bo32boo111boo20bobo6bobo32bob obo49bo14bobo13b3o42boo16bobbobo12boo64bobo105boo27bo16b3o15bo62bobo 24boo31bo4bo$40bobboo18bo3bo13bobo49boobboo11bo266bobo32bo54bo11boo44b obo20boobboo3boo31bobobo49bobo8boo5bo59bo19boboo13bobboo59bo136b3o11b oo4bo14b3o56boobboo24boobo29bobobo71boo$41boobo18bo18boobboo21boo14bo 11boo11b3o264boo26boo3bobo9boo42bobo10boo39boo5bo24boo34bo4bo32boo3boo 12boo8boo5boo58bobo16boo3bo12bo3bo58boo139bo10bob5o17bo55boo27bobb3o 27bobobo23boo47boo4boo$42bo5boo14b3o19boo17boobboo12b3o27bo290b3o3boo 10boo43boo23b3o25boo5boo59bo3bo33boo3boo8boo80boo13bobobbobo14b3o12boo 163boo20boo12bo20boo74bo8bobobo27bo4bo24boobboo20boo27bobo$42bo5boo11b o42bobo15bo29boo201bo87b4o56boo26bo148bobo45boo48boobbooboo15bobo10bo 164boo33bo3boo26boo64b3o5bobobo6bo21bo3bo29bobo18bobo29bo$28boo13boo 15bobo19b3o20bo16boo40boo3boo32boo55boo91b3o86bobb3o54bobo26bo3bo91bo bboo48bo5boo40bo74boo11b3o7boobo106boo51boo23bo3bobo26bo68bobb3obbo64b o19bo31boo$28boobo13bo14boo20bo29boo51bo3bo20boo11boo55bo91bo46bo33boo 6bo5bo54bo5boo21bobbobo22bo66bobo50boo5boo38bobo89bo7boboo23boo82bo49b obbo23boo3bo25bobo31b3o33boo3boboo6bob3o18bobboo35bo14boo23boo$32bo8bo 3b3o16boo17bo16b3o4boo4bo48b3o5b3o18bo69b3o88boo45b3o30bobo5boo3bo4boo 49boo5boo23bobobbo20boo65boo48bo49boo125bo43bobo34b3o50boo4boo44boo4b oo32b3o39boo9boobo16bobo31boo4bobo38boo$29bo9b3o6bo15bobo33b3o4bo5bobo 46bo9bo15b3o35boo5boo28bo138bo29bo7bobobo5bobo81bo3bo19boobo68boo43bob o176b3o40boo35bo36boo20bo44bobbo26bo10b3o22bo13bo3bo9boboo16boo5boo26b o3bo3bo$30boboo4bo8boo10boo5bo33b3o5b3o3boo4boo66bo37boobboobbo145bo 20boo28boo8b3o8bo85bo18bobb3o67bobo43bo96boo81bo41bo73bo18bobo23boobo 18boo27b3o5b3o26bo11bobo13b3obo18boobbo23b3o5bo3bo$32boo4boo19boo5boo 29b3o10bo8bobbo107boboo144b3o16boo42b3o8boo78bobb3o18bobobo64boo5bo 139boo198bobo16boo24b4o6boo42bo4b3o11boo11b3o7boobboo37boboo24bo8bo3bo 30bo$97b3o20boo9boo74boo23bo144bo19bo132b3o7bo14bobobo65boo5boo137bo4b oo195boo41bo3bo6boo41boo4b3o11boobboo17boo20bo15boo5bo35bo3bo28bobo$ 36bo54boo4b3o29b3obo74bo23bo83bo47boo11boo20bo129bo9bobo11b3obbo39boo 140bo29boo6bo238b3o74bobo42bo11boo5bo12bo23bobo30bo$35bobo49boobboo36b o3bo71b3o18boobboo82bobo47boo32boo129boo9boo12boboo36boobboo138b3o23bo bo4boboob3o238b3o53bo21bo42bobo15boo12b3o23bo$36boobboo44bobo39b5o72bo 20bobbo39boo44boo219boo17boo36bobo141bo26bobbo9bo149boo90bo19bo32bobo 23b3o38boo14bo13bob3o$29boo9boo45bo42b3o95boo39bo265bobo14bo3bo33bo3bo 142boo24bo3bo7bo5boo145bo109bobo15bo11boobboo18boo3bo37boo16b3o3bo8bo 3bo$29boo52bo166boo15bobo171boo92bo5boo8bobo36boo130boo40bobbo6boo5bob o86bo57bobo15boo90bobo13b3o11boo11bo11bo3bo3bo32bobo15bo6b3o5bo3bo$89b oo29b3o41boo84boo15boo128boo42boo91boo5boo8boo36boobo3boo58bo5bo60bo 32boo6b3o16bo84boo59boo15boo91bo13bo27b3o6b3o4bobbobo31bo5boo10boo8bo 3b3obo$81b3obo3bo30b3o41boo230bobbo155boo31bobb3obbo58boo5boo48boo9bob o31bo25boo84boo29bobo150boo29bo5bo8bobobbo28boo5boo19boo4b3o$80boboo6b 3o301bo4bo108boo45bobo29bobobo5b3o54boo8bo47boo10boo10bo20bobo140boo 100boo32boo3boo40boo15bo3bo63bo$80boobo8bo300b6o15boo3boo88bo40boo5bo 28bobobo8bo36boo25boo70bobo20boo73boo66bo100boo11boo20bo3bo51boo9bo3b oo54bo$78bob3o35boo3boo267boobo18boo3bo89bobo38boo5boo25b3obbo63booboo 4bo72bobo95boo180bo18b3o5b3o48bo7b3o4boobboo49bobo$119bo3bo19boo248bob o25bo88boo73boboo45bo3bo16b4o3bo73bo4boo229boo5boo35b3o15bo9bo46bobo 18bobo44boobboo$80bo35b3o5b3o9bo5bobo213boo34boo24boo132bo31boo46bo4bo 6boobb3obboboobbo3bo58boo15bobo228bobboobboo37bo66boo4boo20bo45boo9boo $3bo112bo9bo8boo5bo211boobbobboo52boobbo12booboo117b3o30bo48bobobo5boo bbo7b4o3bo57bobo17bo33bo195boobo107bobbo29bo52boo$bbobo129boboo3boo 212bo3boboo52bo3bo11bobobobo119bo79bobobo8b3o6b5o4boo53bo19boo30b3o 196bo23boo85boo23boo4bobo$bbobo128b3obbo216bobobo42boo12b3o12bobobbo 16boo101boo25bo54bo4bo10b3o11bo53boo50bo124boo73bo23bo74boo36bo3bo3bo$ booboo16boo111bobobo8bo123boo82booboboo23bo16bo10bobo13boobo19bo43bo 73boo9b3o54bo3bo12bo12b3o102boo20bo102boo74boobboo18b3o71boo33b3o5bo3b o$22boo112bobobo5b3o124bo85bobbo4boo16boboboboo7b3o11boo13bo3boo16bobo 43b3o71bo9b3obo72boobo9bo106boo16b3o178bobbo20bo106bo8bo3bo$booboo131b obb3obbo103boo22bobo83boo6boo17booboobo7bo29bobobbobo13boo47bo68bobo 10bo3bo53boobbo13b3o118bo19bo147boo28boo139bo3bo$bboboo34boo96boobo3b oo101bobo23boo153booboobboo61boo57bo10boo12bo3bo55bobo12b3o116bo20boo 11boo134bobo169bobo$o39bobo96boo107bo265boo41bobo5boo17bob3o55boo131b oo32boo136bo91boo77bo$oo40bo38boo56bo3bo103boo265bo42bobo4bobbo17b3o 22boo28boo91boo214boo90boo154bo$42boo37boobo32bo24bobo367bobo9boo26boo 4bo6boo19bo21boboo10b3o14bobo91boo461bobo$85bo57boobboo352bo10boo10boo 15bo9bobo15boo19bo16bo14b3o6boo6bo5boo14boo533bobo$8boo72bo32bob3o27b oo351bobo5boo30boo9bo17bobo17bobo18bo11b3o6bobo4boo5boo14bo181boo237b oo3boo88boo16booboo$bboo4boo47boo24boboo30boobo8bo143boo98bo18bo107bob o4bobbo28boboo7boo19bo18boo14boobo15b3o5b3o26b3o178boo69boo146boo19bo 3bo89boo$bobo27boo20boobboo26boo30boboo6b3o143boo4boo92b3o6boo6b3o102b oo4bo6boo28b3obbo27boo13boo18boo17b3o4bo3bo27bo115boo132boo146bobo5bo 9b3o5b3o104booboo$bo29bobo18bobo54b3o6b3obo3bo152boo95bo5boo5bo104bobo 15boo26bobobo40bobo37b3o4boobbo39bo79boo3boo17boo282bo5boo8bo9bo68boo 34boobo$oo31bo15bo3bo35bo19b3o14boo247boo12boo103bo17bobo26bobobo39bo 5boo10bo33boo36b3o79bo3boo301boo3boobo85bobo39bo$8boo23boo14boo37bobo 18b3o8bo372boo19bo27bobb3o36boo5boo9bobo25bo7bo35bob3o60booboo11bo66b oo244bobb3o84bo40boo$8boo38boobo3boo25boo5boo15b3o15bo141boo165boo15b oo62boo27boobo55boo25bobo6bobo32bo3bo60bobobobo10boo64bobo106boo126bo 8bobobo85boo$47bobb3obbo26bobboo19b3o14bobo96bobo42bo10boo108boo42bobo 15boo92boo60boo22boobboo3boo31bo3bo44boo16bobbobo12bobboo59bo108bo42bo bo7bo74b3o5bobobo$46bobobo5b3o24boobo19b3o15boobboo21boo68boboo41bo7b oobboo103boo3boo42bo25boo84bo3bo11boo44bobo25boo35b3obo46bo19boboo11bo 3bo58boo109bo41boobo7bo76bobb3obbo121boo$14bo30bobobo8bo12bo12bo5boo 36boo17boobboo50bo15b3o16bo27boo5bobo107boo46boo25bo88bobo10boo39boo5b o63b3o47bobo16boo3bo11b3o12boo155boo27bo16b3o3b3o9bo65boo3boboo73boo 47boo4boo$13bobo27b3obbo21boo12bo5boo11bo42bobo52b3o14bo4boo11b3o34bo 12boo168bobo89boo4bo46boo5boo63bo49boo13bobobbobo14bobo10bo16bo168b3o 11boo4bo14b3o69boo74boobboo20boo27bobo$14bo29boboo21boboo12boo15bobo 38boobbo52bo17b5obo10bo36boo11bobo168boo86boo7boo18b3o93bo68boobbooboo 14boo11b3o7boobobobo62bo107bo10bob5o17bo65bo3bo56boo20bobo18bobo29bo$ 45boo21b3obbo13bo14boo96boo20bo12boo20boo26bo18bo198boo38bobo7bobo17b 3o92bobo105bo7bobooboo20boo40bo40boo43boo20boo12bo20boo64bobo24bo32bob oo21bo19bo31boo$46bo23bobobo8bo3b3o16boo34bo3bobboo39boo26boo3bo33boo 25boo18b3o87bo108boo38bo5boo22b3o92boo141bo41b3o39bo43boo33bo3boo26boo 50boobboo57bo44boo23boo$71bobobo5b3o6bo15bobo32bo4bobbo7b3o31bo26bobo 3bo23boo57bo84b3o147boo5boo25b3o21bo71boo138b3o77b3o53boo23bo3bobo26bo 32bo18boo27b3obo32bo19boo4boo39boo$72bobb3obbo8boo10boo5bo31bobobo5b3o 3bo34bobo25bo3boo23bobbo54boo83bo46bo137b3o20bobo70bobo139bo77bo53bobb o23boo3bo25bobo70bo8boboo30boobo21bo4boobo$73boobo3boo19boo5boo29bobob o8bo3bo3bo31boo4boo44boo4boo51boo86boo45b3o135b3o19bo3bo64boo5bo271boo 4boo44boo4boo31b3obo35b3o6boobo30boo20b3o9bo$74boo61bo4bo13bobbobo8bo 26bobbo44bo20boo35bob5o52bo78bo131bo23bo3bo65boo5boo107bo18bo127boo20b o44bobbo26bo8boboo40bo3bob3o6b3o44bo8bo34bo$74bo3bo54boobbo3bo16bobobb o4b3o25boobo45bobo18bo42bo50bobo56bo20boo129b3o7bo14bo3bo39boo141b3o6b oo6b3o128bo18bobo45boo27b3o6boobo39boo14b3o19bo34boboo29bobo$77bobo49b oobboo24bo3bo3bo29bo12boo34boo16bobo37boobo53boo54b3o16boo132bo9bobo 12bo3bo36boobboo144bo5boo5bo131bobo16boo34boo42bo3bob3o47bo8b3o18bobo 35boo30bo$78boobboo44bobo8boo22bo3boo28bobo10boo52boo38booboo107bo19bo 57booboo71boo9boo13bobo36bobo147boo12boo131boo52boo41boo51bo15b3o15boo 5boo$71boo9boo45bo30b3o34bobo203boo11boo20bo54bobobobo77boo18bo38bo 248boo149bo44bobo14b3o19boobbo$71boo51b3o38bo32bo93boo109boo32boo54bob obbo16boo59bobo14bo38bo91boo15boo143bo145bo21boo21boobboo15b3o19boboo$ 127bo3boo31bobo125boo198boobo19bo60bo5boo8bobo36bobo4boo84boo15bobo42b oo70bo27bobo15boo92bo32bobo20boobboo17boo36boo5bo12bo$123bo3bo3bo33boo bboo11bo308bo3boo16bobo59boo5boo8boo36bo3bo3bo77boo25bo42boo3boo63boo 29boo15boo91bobo15bo11boobboo25bobo42bo11boo5bo12boo$122bobobbo4b3o22b o11boo11b3o123boo182bobobbobo13boo81boo31bo3bo5b3o75bo25boo46boo64boo 138bobo13b3o11boo11bo18bobboo9bo28bobo15boo12boobo$120bobbobo8bo20b3o 27bo122boo181booboobboo49boo45bobobboobo23bo3bo8bo75bobo278bo13bo27b3o 9boo17bobo29boo14bo13bobb3o$120bo3bo29bo29boo364bo40boo5bobboboo22bo3b o86boo292boo29bo8boobboobbo3bo7boo25boo16b3o3bo8bobobo$120bo33boo40boo 3boo32boo197boo114bobo38boo5b3o27bobo191bobo136boo32boo3boo40boo13bobb o4bo32bobo15bo6b3o5bobobo$121b3o20boo51bo3bo20boo11boo197boo17boo3boo 91b3o5boobboo64bo151bo40boo137boo11boo20bo3bo51b5o5bobobo31bo5boo10boo 8bobb3obbo$45bo99bo48b3o5b3o18bo229boo3bo94b3o3b3o10boo22b3o182b3o39bo 150bo18b3o5b3o48bo10bobobo29boo5boo19boo3boboo$44bobo98bobo46bo9bo15b 3o35boo5boo193bo92boo4bo5boboo3boboo16boobo3bo137bo46bo146boo5boo35b3o 15bo9bo46bobobboo7bo4bo61boo$44bobo99boo4boo66bo37boobboobbo109bobo18b oo60boo93boboobb3obobobbobo3bo16boboobboo135b3o45boo146bobboobboo37bo 66boo4boo3boo8bo3bobboo54bo3bo$43booboo16boo85bobbo107boboo111boo14boo bbobboo52boobbo96boo3b3o8b5o37boo9boo108bo197boobo107bobbo25boobboo49b obo$64boo86boo85boo23bo112bo16bo3boboo52bo3bo79bo74bo10boobo106boo20bo 176bo23boo85boo20boo8bobo44boobboo$43booboo116boo74bo23bo26boo101bobob o42boo12b3o80b3o26bobboo39bobo14bo109boo16b3o174bo23bo74boo43bo45boo9b oo$44boboo34boo71bobo6boo71b3o18boobboo26bobo19boo36bo44booboboo23bo 16bo10bobo85bo25b3o30bo10boo12bo26bo86bo19bo145boo27boobboo18b3o71boo 46b3o51boo$42bo39bobo70boo80bo20bobbo28bo22bo37boo45bobbo4boo16bobobob oo7b3o11boo40boo15boo26boo27bo29bobo24boboo22boo83bo20boo11boo132bobo 28bobbo20bo113boo3bo$42boo40bo71bo103boo27boo22bobo34boo46boo6boo17boo boobo7bo54bobo15boo41boo42bobo26boo21boobo82boo32boo134bo28boo137bo3bo 3bo$84boo67bo160boo178bo25boo33bo38boo4bo49bobb3o170bo80boo163b3o4bobb obo$152bobo41boo295boo25bo32bobo9boo26bobo15boo19bo16bobobo171bo174boo 70bo8bobobbo$50boo100bobo41boo320bobo21bo10boo10boo16bo9bo17bobo17bobo 14bobobo172b3o172boo80bo3bo$44boo4boo47boo52bo289boo73boo21bobo38bobo 7boo19bo18boo12b3obbo434bo$43bobo27boo20boobboo342boo96bobo37bo3bo27b oo13boo17boboo432b3o$43bo29bobo18bobo53boo3boo357boo20boo4bo39bo3bo40b obo18boo90boo147bo151boo3boo113bo$42boo31bo19bo55bo3bo19boo136boo198bo bo19bobo15boo28bo3bo39bo5boo10bo3bo66boo3boo17boo146bobo130boo19bo3bo 113bobo$50boo23boo14bo56b3o5b3o15bobo136boo4boo179bo14bo19bo17bobo28bo 3bo37boo5boo9bobo70bo3boo165boo131bobo15b3o5b3o110bobo$50boo38bobo4boo 49bo9bo15bo133boo9boo179b3o31boo19bo29bobo56boo69bo307bo5bo9bo9bo91boo 16booboo$89bo3bo3bo69boo4boo89bobo42bo193bo51boo29bo61boo65boo60boo 109boo133boo3b3o110boo$88bo3bo5b3o66boobo92boboo41bo172bo20boo86bo11b oo44bobo66bobboo52boobbobboo105bo42bobo93bob3o127booboo$56bo30bo3bo8bo 70bo8bo64bo15b3o16bo27boo169b3o16boo89bobo10boo11boo26boo5bo66bo3bo52b oobo3bo107bo41boobo82bo8bo3bo92boo34boobo$55bobo28bo3bo77bo9b3o62b3o 14bo4boo11b3o37boo158bo19bo91boo51boo5boo66b3o12boo42bobobo106boo27bo 16b3o15bo64b3o5bo3bo92bobo39bo$56bo30bobo79boboo4bo64bo17b5obo10bo36b oobboo46bo98boo11boo20bo85boo25bo3bo102bobo10bo16bo23booboboo136b3o11b oo4bo14b3o65bo3b3obo93bo40boo$88bo82boo4boo63boo20bo12boo20boo12bobo 48bobo98boo32boo84bobo25bo4bo102boo11b3o7boobobobo16boo4bobbo142bo10bo b5o17bo63boo4b3o55boo36boo$114bo117boo26boo3bo33boo12bo12boo5bo31boo 177boo39bo5boo22bobobo116bo7bobooboo17boo6boo119boo20boo12bo20boo70bo$ 113b3o59bo57bo26bobo3bo23boo20boo11bobo4b3o171boo36boo38boo5boo23bobob o21bo254boo33bo3boo26boo31bo24bo25bo33bo3bo68boo$112b3obo32bo24bobo22b 3o31bobo25bo3boo23bobbo31bo6b3o9bo161bobbo107bo4bo191bo91boo23bo3bobo 26bo32boo22bobo24boo31bo4bo19boo47boo4boo$113bo3bo30bobo24boobboo18b3o 32boo4boo44boo4boo30boo18b3o86boo72boo109bo3bo17b3obo167boo90bobbo23b oo3bo25bobo31boobo17boobboo24boobo29bobobo21boobboo20boo27bobo$114bo3b o28bo3bo27boo18b3o10bo26bobbo44bo20boo22b4o11bo85boo180bo23boboo170boo 89boo4boo44boo4boo31bobb3o16boo27bobb3o27bobobo26bobo18bobo29bo$115bob 3o28bo3bo8bo40b3o5b3o27boo45bobo18bo22b5o10boo148boo11boo102b3o3boobbo 15boobo245boo20bo44bobboo25bo8bobobo37bo8bobobo27bo4bo28bo19bo31boo$ 116b3o22b3o5bo3bo5b3o40b3o4bo42boo34boo16bobo22boobo8boo151boo8boobbo 4boo3boo90bo9bobo12bob3o247bo18bobo47boo25b3o5bobobo38b3o5bobobo6bo21b o3bo33bo14boo23boo$117bo26bo5bo3bo3bo43b3o4boo32bo8boo52boo35bob5o156b o3bo4boo3bo91boo9boo264bobo16boo34boo12bo29bobb3obbo42bobb3obbo25b3o 32boo4bobo38boo$121bo18bo3bo6bobo4boo21bo61bobo103bo104boo51b3o12bo12b ooboo79boo18bo250boo52boo12boo27boo3boboo42boo3boboo6bob3o14b5obboo28b o3bo3bo$120bobo16bobobbo7bo26boo26bo35boo99boobo106bobo64boo11bobobobo 77bobo14bo320bobo34boo49boo9boobo12boobobbo28b3o5bo3bo$114boo5boo14bo bbobo13bo23boo24bobo32bo102booboo107bo59boobbo13bobobbo16boo60bo5boo8b obo320bo32bo3bo46bo3bo9boboo13b5o5boo22bo8bo3bo30bo$114bobboo18bo3bo 13bobo49boobboo11bo15bobo213boo58bo3bo12boobo19bo60boo5boo8boo353bobo 48bobo13b3obo13boo3boobbo32bo3bo28bobo$115boobo18bo18boobboo21boo14bo 11boo11b3o13bobo89boo3bo165boo12b3o12bo3boo16bobo81boo333bo11boobboo 22boo21boobboo31bo5boboo34bobo30bo$116bo5boo14b3o19boo17boobboo12b3o 27bo13bo90boo4bo148bo16bo10bobo15bobobbobo13boo35boo45bobo330b3o11boo 11bo14boobboo17boo20bo15boo5bo36bo$116bo5boo11bo42bobo15bo29boo109bo 148boboboboo7b3o11boo15booboobboo51bo40boo5bo329bo27b3o16bobo42bo11boo 5bo12bo$102boo13boo15bobo42bo16boo40boo3boo32boo61boo6boo115boo20boob oobo7bo90bobo38boo5boo328boo29bo16bo42bobo15boo12b3o$102boobo13bo14boo 50boo51bo3bo20boo11boo69boo116bo126boo324boo32boo3boo40boo19b3o38boo 14bo13bob3o$106bo8bo3b3o16boo34b3o4boo4bo48b3o5b3o18bo197b3o453boo11b oo20bo3bo51boo3boo3bo37boo16b3o3bo8bo3bo$103bo9b3o6bo15bobo33b3o4bo5bo bo46bo9bo15b3o35boo5boo154bo468bo18b3o5b3o48bo5bo3bo3bo32bobo15bo6b3o 5bo3bo$104boboo4bo8boo10boo5bo33b3o5b3o3boo4boo66bo37boobboobbo580boo 5boo35b3o15bo9bo46bobobb3o4bobbobo31bo5boo10boo8bo3b3obo$106boo4boo19b oo5boo29b3o10bo8bobbo107boboo168bo18bo393bobboobboo37bo66boo4boo3bo8bo bobbo28boo5boo19boo4b3o$171b3o20boo85boo23bo169b3o6boo6b3o84bo309boobo 107bobbo18bo3bo63bo$110bo54boo4b3o32boo74bo23bo48boo122bo5boo5bo87b3o 308bo23boo85boo23bo3boo54bo$109bobo49boobboo39boo71b3o18boobboo50bo 121boo12boo89bo307bo23bo74boo32b3o4boobboo49bobo$110boobboo44bobo116bo 20bobbo52bobo223boo308boobboo18b3o71boo8bo34bobo44boobboo$103boo9boo 45bo140boo27boo24boo177boo15boo42boo295bobbo20bo79bobo35bo45boo9boo$ 103boo52bo172bobo158boo42bobo15boo42bo296boo103boo39bo52boo$163boo73b oo90bo155boo3boo42bo25boo32bobo9boo393bo30boo4bobo$155b3obo3bo74boo89b oo155boo46boo25bo22bo10boo10boo349boo41bobo30bo3bo3bo$154boboo6b3o392b obo21bobo5boo365boo41bobo27b3o5bo3bo$154boobo8bo392boo22bobo4bobbo408b o28bo8bo3bo$152bob3o35boo3boo157boo220boo4bo6boo448bo3bo$193bo3bo19boo 137boo4boo133bo79bobo15boo402boo3boo36bobo$154bo35b3o5b3o9bo5bobo129bo 13boo131b3o79bo17bobo381boo19bo3bo38bo$77bo112bo9bo8boo5bo130bobo144bo 46bo34boo19bo381bobo15b3o5b3o112bo$76bobo129boboo3boo131boo144boo45b3o 53boo382bo15bo9bo111bobo$76bobo128b3obbo331bo436boo3b3o130bobo$75boob oo16boo81boo28bobobo8bo125boo11boo159bo20boo441b3o111boo16booboo$96boo 82boo28bobobo5b3o81bobo42bo7boobboo157b3o16boo434bo10b3o111boo$75boob oo99bo31bobb3obbo83boboo41bo7bobo160bo19bo435b3o5b3o132booboo$76boboo 34boo96boobo3boo64bo15b3o16bo27boo6bo12boo135boo11boo20bo248bo187bo4b 3o96boo34boobo$74bo39bobo96boo68b3o14bo4boo11b3o34boo11bobo135boo32boo 44boo200boo187boo4b3o95bobo39bo$74boo40bo38boo56bo3bo64bo17b5obo10bo 50bo18bo198boo201boo249b3o38bo40boo$116boo37boobo32bo24bobo63boo20bo 12boo20boo26boo18b3o590bo62bo36boo$159bo57boobboo17bo31boo26boo3bo33b oo49bo588bobo24bo32bo3bo$82boo72bo32bob3o27boo16boo32bo26bobo3bo23boo 57boo584boobboo24b3o30bobobbo70boo$76boo4boo47boo24boboo30boobo8bo34bo boo31bobo25bo3boo23bobbo52boo587boo27bob3o27bobbobo23boo47boo4boo$75bo bo27boo20boobboo26boo30boboo6b3o33b3obbo31boo4boo44boo4boo52bob5o144b oo455bo8bo3bo5bo22bo3bo24boobboo20boo27bobo$75bo29bobo18bobo54b3o6b3ob o3bo38bobobo8bo26bobbo44bo20boo42bo144boo17boo3boo431b3o5bo3bo5boo22bo 32bobo18bobo29bo$74boo31bo15bo3bo35bo19b3o14boo38bobobo5b3o27boo45bobo 18bo38boobo165boo3bo15booboo415bo3b3obo5boboo22b3o30bo19bo31boo$82boo 23boo14boo37bobo18b3o8bo46bobb3obbo42boo34boo16bobo38booboo171bo12bobo bobo392bo20boo4b3o5b3obbo18bo54boo23boo$82boo38boobo3boo25boo5boo15b3o 15bo43boobo3boo41boo52boo152boo60boo12bobobbo16boo376bo26bo8bobobo16bo bo31boo4boo39boo$121bobb3obbo26bobboo19b3o14bobo43boo130boo119boobbobb oo52boobbo13boobo19bo375b3o22bo13bobobo15boo5boo26bo4boobo$120bobobo5b 3o24boobo19b3o15boobboo21boo16bo3bo127boo120bo3boboo52bo3bo12bo3boo16b obo399bobo13bobb3o17boobbo23b3o9bo$88bo30bobobo8bo12bo12bo5boo36boo17b oobboo19bobo32bo215bobobo42boo12b3o14bobobbobo13boo373boo21boobboo15b oobo18boboo24bo8bo34bo$87bobo27b3obbo21boo12bo5boo11bo42bobo24boobboo 11bo15bobo108boo105booboboo23bo16bo10bobo15booboobboo388boobboo17boo 20boo14boo5bo35boboo29bobo$88bo29boboo21boboo12boo15bobo38boobbo7boo8b o11boo11b3o13bobo108boo108bobbo4boo16boboboboo7b3o11boo200bo216bobo38b o3bo11boo5bo37boo30bo$119boo21b3obbo13bo14boo49bobbo6b3o27bo13bo219boo 6boo17booboobo7bo213boo218bo42bobo15boo12b3o$120bo23bobobo8bo3b3o16boo 34bo3bobboobb3o6bo29boo489boo221bo39boo14bo14b3o$145bobobo5b3o6bo15bob o32bo4bobbo12boo40boo3boo32boo654boo4bobo34boo16b3o3bo10b3o$146bobb3o bbo8boo10boo5bo31bobobo5b4o51bo3bo20boo11boo655bo3bo3bo32bobo15bo6b3o 5b3o$147boobo3boo19boo5boo29bobobo9bo48b3o5b3o18bo665b3o5bo3bo31bo5boo 10boo8bo4b3o$148boo61bo4bo5b3obbobo46bo9bo15b3o35boo5boo622bo8bo3bo29b oo5boo19boo4b3o$148bo3bo54boobbo3bo5bobbo3boo4boo66bo37boobboobbo632bo 3bo$151bobo49boobboo12boo10bobbo107boboo634bobo4boo54bo$152boobboo44bo bo8boo19boo85boo23bo27boo607bo5boobboo49bobo$145boo9boo45bo42boo74bo 23bo26bobo202boo15boo396bobo44boobboo$145boo51b3o45boo71b3o18boobboo 27bo203bobo15boo397bo45boo9boo$201bo3boo112bo20bobbo28boo203bo25boo 446boo$197bo3bo3bo136boo232boo25bo387boo4boo$196bobobbo4b3o392bobo388b o4boobo$194bobbobo8bo69boo246boo73boo386b3o9bo$194bo3bo79boo246boo198b o262bo8bo$194bo529boo273boboo$195b3o527boo274boo$119bo112boo3boo344bo$ 118bobo112bo3bo19boo324b3o492bo$118bobo109b3o5b3o15bobo132boo193bo490b obo$117booboo16boo90bo9bo15bo90bobo42bo171bo20boo490bobo$138boo109b3o 3boo89boboo41bo170b3o16boo475boo16booboo$117booboo127b3o76bo15b3o16bo 27boo168bo19bo476boo$118boboo34boo91b3o10bo63b3o14bo4boo11b3o174bo9boo 11boo20bo492booboo$116bo39bobo93b3o5b3o62bo17b5obo10bo177boo8boo32boo 456boo34boobo$116boo40bo93b3o4bo65boo20bo12boo20boo148boo3bobo499bobo 39bo$158boo92b3o4boo21boo31boo26boo3bo33boo146b4o505bo40boo$195b3o118b o26bobo3bo23boo154bo4bo175bo327boo$124boo68bo62bo22bo3bo31bobo25bo3boo 23bobbo139boo11bobb4o174bobo$118boo4boo47boo19bo3bo32bo24bobo21bo4bo 31boo4boo44boo4boo103bo35boo11booboboo174boo360boo$117bobo27boo20boobb oo19bobbobo30b3o24boobboo19bobobo8bo26bobbo44bo20boo88boo51boo43boo 442boo47boo4boo$117bo29bobo18bobo25bobobbo27b3obo27boo20bobobo5b3o27b oo45bobo18bo88boo49b3o45boo17boo3boo418boobboo20boo27bobo$116boo31bo 19bo27bo3bo22bo5bo3bo8bo40bo4bobbo42boo34boo16bobo206boo3bo423bobo18bo bo29bo$124boo23boo14bo35bo22boo5bo3bo5b3o41bo3bobboo41boo52boo146boo 66bo422bobboo15bo31boo$124boo38bobo4boo25b3o22boobo5bob3o3bo296bobo64b oo441boo23boo$163bo3bo3bo31bo18bobb3o5b3o4boo44boobbo199bobo46bo59boo bbo421boobbo3bo38boo$162bo3bo5b3o27bobo16bobobo8bo54bobo199boo46boo58b o3bo422bobbo4bo$130bo30bo3bo8bo21boo5boo15bobobo13bo51boobboo11bo183bo 94boo12b3o420b3o5bobobo$129bobo28bo3bo31bobboo17b3obbo13bobo42bo11boo 11b3o260bo16bo10bobo422bo8bobobo30bo$130bo30bobo33boobo18boboo15boobb oo21boo13b3o27bo258boboboboo7b3o11boo113bobo317bo4bo27bobo$162bo35bo5b oo14boo20boo17boobboo12bo29boo237boo20booboobo7bo128boo319bo3bo28bo$ 198bo5boo11bo3bo38bobo16boo40boo3boo32boo187bo164bo$184b3o12boo15bobo 42bo7boo51bo3bo20boo11boo184b3o486boo$184b3o14bo14boo39bo12bo22b3o23b 3o5b3o18bo197bo$184b3o10bo3b3o16boo34bobo4boo5bobo20bo25bo9bo15b3o35b oo5boo$187b3o5b3o6bo15bobo32bo3bo3bo7boo4boo15bo16b3o31bo37boobboobbo 104bo$187b3o4bo8boo10boo5bo31bo3bo5b3o9bobbo30bobbo73boboo106boo$187b 3o4boo19boo5boo29bo3bo8bo10boo31bo3bo49boo23bo106boo$252bo3bo32boo18b oobobo50bo23bo$192bo54boo4bobo33boo18booboo48b3o18boobboo$191bobo49boo bboo5bo55b3o49bo20bobbo$192boobboo44bobo140boo90bo$185boo9boo45bo34bo 35bo163bo$185boo90bobo32b5o4boo153b3o$239boo4boo30bobo33bobbo4boo$237b oboo4bo32bo32b3obboo$236bo9b3o62boobb3o383bobo$239bo8bo26boo3boo29bo 389boo$235boobo37bo3bo19boo9boobo387bo$235boo36b3o5b3o15bobo10b3o$273b o9bo9bo5bo13bo$159bo132bobo3boo212bo$158bobo19bo110bo3bo214bobo$158bob o18boo111bo3bo8bo205boo$157booboo16bob3o110bo3bo5b3o$178boboboo110bo3b o3bo371bo$157booboo17b4o56bo55bobo4boo368boo$158boboo18boo14boo40boo 56bo376boo29bobo$156bo39bobo38boboo59bo403boo$156boo40bo37b3obbo31b3o 23bobo403bo$198boo38bobobo29bo27boobboo$239bobobo28bo3bo27boo$164boo 74bobb3o21boo3bobbobo8bo$158boo4boo47boo26boobo29bobobbo4b3o$157bobo 27boo20boobboo27boo22bo3bo4bo3bo3bo$157bo29bobo18bobo31bo3bo18bo4bo8bo 3boo$156boo31bo15boobbo35bobo16bobobo7b3o$164boo23boo48boo5boo15bobobo 13bo$164boo38bo3bobboo26bobboo17bo4bo13bobo$203bo4bobbo28boobo17bo3bo 15boobboo21boo$202bobobo5b3o26bo5boo36boo17boobboo$170bo30bobobo8bo13b o12bo5boo11bobboo38bobo$169bobo27bo4bo22bobo12boo15bobo42bo$170bo28bo 3bo22bo3bo13bo14boo39bo$227bo3bo8bo3b3o16boo34b3o4boo$201boo25bo3bo5b 3o6bo15bobo32bob3o3bo258bobo$229bo3bo3bo8boo10boo5bo31bo3bo5b3o256boo$ 230bobo4boo19boo5boo29bo3bo8bo256bo$231bo63b3obo$235bo54boo4b3o$234bob o49boobboo5bo$235boobboo44bobo44bo$228boo9boo45bo44boo$228boo70bo29bob oo$281b3o4boo9bobo27b3obbo$281b3o4bo11bo30bobobo8bo313bo$281b3o5b3o40b obobo5b3o312bo$278b3o10bo41bobb3obbo315b3o$278b3o13boo38boobo3boo$278b 3o13boo23boo14boo245bo$286boo31bo15bo3bo243bo$202bo84bo29bobo18bobo 217bo22b3o$201bobo83bobo27boo20boobboo211bobo$201bobo84boo4boo47boo 212boo$200booboo16boo71boo$221boo$200booboo123boo$201boboo34boo45boo 40bo200bo132bo$199bo39bobo44bo39bobo201boo128boo$199boo40bo46boboo34b oo201boo130boo$241boo44booboo$308boo7bo$207boo78booboo16boo7bo308bobo$ 201boo4boo47boo30bobo24bobo308boo$200bobo27boo20boobboo30bobo24bo311bo $200bo29bobo18bobo35bo26bo$199boo31bo19bo113bo205bobo$207boo23boo14bo 324boo$207boo45boo108bob3o204bo$246b3obo3bo111boobo8bo$245boboo6b3o 108boboo6b3o167bo$213bo31boobo8bo109b3obo3bo171boo$212bobo28bob3o127b oo169boo$213bo101boo52bo260bo$245bo69boo9boo45bo255bo$322boobboo44bobo 254b3o$321bobo49boobboo$322bo54boo4b3o$383b3o$318boo4boo19boo5boo29b3o 10bo$316boboo4bo8boo10boo5bo33b3o5b3o$315bo9b3o6bo15bobo33b3o4bo$318bo 8bo3b3o16boo34b3o4boo$314boobo13bo14boo$314boo13boo15bobo42bo$328bo5b oo11bo42bobo$328bo5boo14b3o19boo17boobboo165bo$327boobo18bo18boobboo 21boo163bobo$326bobboo7bo10bo3bo13bobo191boo$326boo5booboo11bobbobo13b o$332bobobboo12bobobbo7bo253bo$297b3o33bo18bo3bo6bobo4boo244boo$266bo 29bo32bo26bo5bo3bo3bo246boo$265bobo28bo3bo27b3o22b3o5bo3bo5b3o$266bo 29bobbobo8bo16bob3o28bo3bo8bo$298bobobbo4b3o15bo3bo28bo3bo27boo$299bo 3bo3bo17bo3bo30bobo24boobboo$260boo41bo3boo15b3obo32bo24bobo$260boo23b oo13b3o22b3o59bo$252boo31bo19bo20bo$253bo29bobo18bobo76boo4boo$253bobo 27boo20boobboo70boboo4bo$254boo4boo47boo69bo9b3o$260boo121bo8bo$379boo bo$294boo83boo4boo$252boo40bo65bo9bo15bo$252bo39bobo65b3o5b3o15bobo$ 254boboo34boo69bo3bo19boo$253booboo104boo3boo$274boo$253booboo16boo$ 254bobo151boo$254bobo151boo$255bo75boo$472boo$329bo3bo115bo20bobbo$ 329bo4bo41boo71b3o18boobboo$331bobobo8bo31boo74bo23bo$332bobobo5b3o19b oo85boo23bo$333bo4bobbo21bobbo107boboo$334bo3bobboo15boo4boo66bo37boo bboobbo$281boo74bobo46bo9bo15b3o35boo5boo$281boo9boo41boobbo17bo48b3o 5b3o18bo141boo$288boobboo44bobo15boo51bo3bo20boo11boo127bobo$287bobo 49boobboo21boo40boo3boo32boo129bo$288bo54boo4boo15bo29boo$284bo64boobo 14b3o27bo13bo$290boo19boo5boo33bo8bo6bo11boo11b3o13bobo$282b3obo3bo8b oo10boo5bo31bo9b3o14boobboo11bo15bobo173bo$281boboo6b3o6bo15bobo32bob oo4bo16bobo32bo174boo$281boobo8bo3b3o16boo35boo4boo16bo207bobo$279bob 3o13bo14boo58b3o$295boo15bobo42bo17bo3boo41boo52boo$281bo12bo5boo11bo 42bobo12bo3bo3bo42boo34boo16bobo$294bo5boo15bo20boo17boobboo7bobobbo4b 3o27boo45bobo18bo$259boo32boobo19b3o15boobboo21boo5bobbobo8bo26bobbo 44bo20boo$292bobboo18b3obo13bobo32bo3bo31boo4boo44boo4boo$228bo28bo3bo 30boo5boo15bo3bo13bo33bo34bobo25bo3boo23bobbo93boo$227bobo27bo4bo35bob o16bo3bo47b3o31bo26bobo3bo23boo94bobo$228bo30bobobo8bo26bo18bob3o6b3o 4boo64boo26boo3bo33boo87bo$260bobobo5b3o22bo23b3o7b3o4bo75boo20bo12boo 20boo98bo$261bo4bobbo24bobo23bo8b3o5b3o72bo17b5obo10bo121boo$222boo38b o3bobboo22bo3bo28b3o10bo73b3o14bo4boo11b3o117bobo$222boo23boo43bo3bo 29b3o28boo56bo11bo3b3o16bo27boo$214boo31bo15boobbo23bo3bo30b3o24boobb oo67boo5boboo41bo$215bo29bobo18bobo21bo3bo57bobo71bobo5bobo42bo$215bob o27boo20boobboo18bobo59bo124boo$216boo4boo47boo19bo56bo$222boo131boo$ 347b3obo3bo$256boo88boboo6b3o$214boo40bo89boobo8bo$214bo39bobo87bob3o$ 216boboo34boo95boo$215booboo106bo9bo9bo5bo$236boo88b3o5b3o15bobo104boo $215booboo16boo91bo3bo19boo105bo$216bobo109boo3boo125bobo$216bobo242b oo$217bo113bo$330bobo41boo$293boo35bobo41boo$293boobo34bo$297bo8bo45b oobbo81boo$294bo9b3o44b3obboo57bo20bobbo$295boboo4bo38boo8boobb3o56b3o 18boobboo$297boo4boo37boo8boobboo60bo23bo126boo6boo17booboobo7bo$243b oo85boo85boo23bo126bobbo4boo16boboboboo7b3o11boo$243boo9boo45bo27bobbo 107boboo63boo57booboboo23bo16bo10bobo$250boobboo44bobo21boo4boo66bo37b oobboobbo61bobo56bobobo42boo12b3o$249bobo49boobboo5bo10bobo46bo9bo15b 3o35boo5boo17boo15boo27bo56bo3boboo52bo3bo$250bo54boo4bobo9bo48b3o5b3o 18bo60boo15bobo37bo44boobbobboo52boobbo$310bo3bo7boo51bo3bo20boo11boo 66bo37boo47boo60boo$245b3o4boo19boo5boo29bo3bo16boo40boo3boo32boo66boo 35bobo110bo$245b3o4bo8boo10boo5bo31bo3bo5b4o6bo29boo260boo3bo$245b3o5b 3o6bo15bobo32bo3bo3bo3bo7b3o27bo241boo17boo3boo$185bo30b3o23b3o10bo3b 3o16boo34bobo4boo12bo11boo11b3o242boo$184bobo29b3o23b3o14bo14boo39bo 27boobboo11bo$185bo30b3o10bo12b3o12boo15bobo42bo22bobo$219b3o5b3o26bo 5boo11bo3bo28boo8bobo22bo131bo$219b3o4bo29bo5boo14boo20boo6bobo8boobb oo14bo133b3o$179boo38b3o4boo27boobo18boboo15boobboo6bo14boo13b3o4boo 41boo52boo28bo44boo$179boo23boo48bobboo17b3obbo13bobo39bob3o3bo42boo 34boo16bobo27boo44boo54boo32boo$171boo31bo19bo29boo5boo15bobobo13bo39b o3bo5b3o27boo45bobo18bo72bo56boo11boo20bo$172bo29bobo18bobo34bobo16bob obo8bo42bo3bo8bo26bobbo44bo20boo141bo19bo$172bobo27boo20boobboo31bo18b obb3o5b3o4boo34b3obo31boo4boo44boo4boo158b3o16boo$173boo4boo47boo26b3o 22boobo5bob3o3bo36b3o31bobo25bo3boo23bobbo160bo20boo$179boo78bo22boo5b o3bo5b3o34bo32bo26bobo3bo23boo184bo$192b3o60bo3bo22bo5bo3bo8bo66boo26b oo3bo33boo125boo45b3o$193bo19boo39bobobbo27b3obo27boo57boo20bo12boo20b oo125bo46bo$171boo20bobbo5boo9bo38bobbobo30b3o24boobboo57bo17b5obo10bo 149b3o$171bo16b3obb4o8bo5bobo38bo3bo32bo24bobo62b3o14bo4boo11b3o148bo$ 173boboo12boobb3o6bobo6boo39bo62bo65bo15b3o16bo27boo6boo$172booboo13b 3o10bo49b3o143boboo41bo7boo173boo$191bo118b3o4boo81bobo42bo181bobo$ 172booboo133b3o4bo126boo108boo46boo25bo$173bobo24boo108b3o5b3o233boo3b oo42bo25boo$173bobo23bobbo104b3o10bo238boo42bobo15boo$174bo25boo105b3o 294boo15boo$193b3o55bo55b3o3boo$250b3o35bo9bo15bo231boo12boo$249b3obo 34b3o5b3o15bobo230bo5boo5bo$250bo3bo8bo27bo3bo19boo150boo75b3o6boo6b3o $251bo3bo5b3o26boo3boo170boo75bo18bo$252bob3o3bo164boo$253b3o4boo164bo $200boo52bo81boo88bobo$200boo9boo45bo77boo89boo96boo6boo20boobo7bo$ 207boobboo44bobo9bo255bobbo4boo20boboo7b3o11boo$206bobo49boobboo4boo 130boo120booboboo40bo10bobo17booboobboo$207bo54boo3boboo106bo20bobbo 119bobobo42boo12b3o16bobobbobo13boo$202b3o61b3obbo32boo71b3o18boobboo 117bo3boboo52bo3bo14bo3boo16bobo$205bo3boo19boo5boo29bobobo8bo22boo74b o23bo115boobbobboo52boobbo15boobo19bo$201bo3bo3bo8boo10boo5bo31bobobo 5b3o10boo85boo23bo119boo9b3o48boo14bobobbo16boo$200bobobbo4b3o6bo15bob o32bobb3obbo12bobbo107boboo181bo14bobobobo$198bobbobo8bo3b3o16boo34boo bo3boo6boo4boo66bo37boobboobbo128bobbo41boo3bo17booboo$198bo3bo13bo14b oo39boo11bobo46bo9bo15b3o35boo5boo129boo23boo17boo3boo$198bo15boo15bob o38bo3bo8bo48b3o5b3o18bo172bo24boo$199b3o11bo5boo11bo42bobo6boo51bo3bo 20boo11boo155b3o$174b3o36bo5boo36boo17boobboo12boo40boo3boo32boo51boo 15boo86b3o$143bo29bo38boobo19boo16boobboo21boo12bo29boo102boo15bobo85b oo$142bobo28bo3bo33bobboo19boobo13bobo40b3o27bo13bo107bo78boo$143bo29b obbobo8bo23boo5boo19bo9boobbo43bo11boo11b3o13bobo106boo23b3o50bobbo83b oo$175bobobbo4b3o29bobo16bo68boobboo11bo15bobo133bo50bobbo35boo46boo$ 176bo3bo3bo33bo18boboo7bo3bobboo47bobo32bo133bo51booboo13boo20bo$137b oo41bo3boo28bo24boo6bo4bobbo45bo3bo48boo171boo14bo19bo$137boo23boo13b 3o66bobobo5b3o42boo50bobbo187b3o16boo$129boo31bo19bo29b3obo28bobobo8bo 41boobo3boo39bo4bobbo47boo140bo20boo$130bo29bobo18bobo27boboo28bo4bo 27boo21bobb3obbo41bobbooboo29boo16bobo34bo126bo$130bobo27boo20boobboo 23boobo28bo3bo24boobboo20bobobo5b3o27boo8bo4boo30bobo18bo32b3o76boo45b 3o55boo$131boo4boo47boo21bob3o57bobo23bobobo8bo26bobbo44bo20boo30bo79b o46bo36boo19bo$137boo106boo25bo22b3obbo31boo4boo44boo4boo46boo79b3o81b o17bobo$211bo55b3o26boboo31bobo25bo3boo23bobbo129bo81bobo15boo$171boo 97bo3boo21boo32bo26bobo3bo23boo214boo4bo$129boo40bo94bo3bo3bo23bo31boo 26boo3bo33boo184boo24bobo$129bo39bobo93bobobbo4b3o62boo20bo12boo20boo 184bobo23bobo$131boboo34boo92bobbobo8bo62bo17b5obo10bo84bo49boo46boo 25bo24bo10boo10boo$130booboo128bo3bo73b3o14bo4boo11b3o81boo48boo3boo 42bo25boo34bobo8bobbo$151boo110bo6boo71bo15b3o16bo27boo51bobo53boo42bo bo15boo44bo$130booboo16boo92bo9bo8b3o4bo89boboo41bo153boo15boo44boo$ 131bobo111b3o5b3o15bobo88bobo42bo200boo8b3o12bo$131bobo114bo3bo19boo 132boo10boo82boo12boo91bo8bo14bobb3o4bobo$132bo75boo37boo3boo164boo83b o5boo5bo89b3o10bo18bo4bobo$500b3o6boo6b3o86bo27b4o4bobbo$206bo3bo289bo 18bo113bobo6b3o$196boo8bo4bo81boo337b3o9bo$196bobo9bobobo8bo71boo338b 3o6b3o6bo$196bo12bobobo5b3o413bo13bobo$210bo4bobbo138boo260boo29boo$ 211bo3bobboo114bo20bobbo124boo6boo20boobo7bo93bobo38boo5boo$158boo101b oo71b3o18boobboo26boo94bobbo4boo20boboo7b3o11boo16booboobboo53bo40boo 5bo$158boo9boo41boobbo44boo74bo23bo26bo44boo45booboboo40bo10bobo16bobo bbobo13boo37boo45bobo$165boobboo44bobo18boo11boo85boo23bo26bobo42boo 44bobobo42boo12b3o13bo3boo16bobo83boo$164bobo49boobboo14bo11bobbo107bo boo26boo88bo3boboo52bo3bo13boobo19bo62boo5boo8boo$165bo54boo4boo9b3o3b oo4boo66bo37boobboobbo114boobbobboo52boobbo14bobobbo16boo62bo5boo8bobo $161bo64boobo9bobbobo46bo9bo15b3o35boo5boo118boo60boo12bobobobo79bobo 14bo$167boo19boo5boo33bo11bo48b3o5b3o18bo224bo13booboo81boo18bo$159b3o bo3bo8boo10boo5bo31bo9b6o51bo3bo20boo11boo204boo3bo94boo9boo13bobo$ 158boboo6b3o6bo15bobo32boboo4bo14boo40boo3boo32boo185boo17boo3boo93bo 9bobo12bo3bo$133bo24boobo8bo3b3o16boo35boo4boobbo10bo29boo236boo118b3o 7bo14bo3bo$101bo54bob3o13bo14boo49b3o9b3o27bo13bo344bo23bo3bo$100bobo 28bob3o36boo15bobo42bo8bo10bo11boo11b3o13bobo346b3o19bo3bo$101bo31boob o8bo12bo12bo5boo11bo42bobo6boo18boobboo11bo15bobo108boo236b3o20bobo$ 133boboo6b3o25bo5boo15bo20boo17boobboo21bobo32bo109boo160boo40boo5boo 25b3o21bo$134b3obo3bo27boobo19b3o15boobboo21boo22bo305boo41bo5boo22b3o $95boo45boo25bobboo18b3obo13bobo177boo96boo32boo87bobo27b3o$95boo23boo 14bo32boo5boo15bo3bo13bo46boo4boo41boo52boo27boo96boo11boo20bo88boo27b 3o$87boo31bo19bo34bobo16bo3bo57boboo4bo42boo34boo16bobo137bo19bo94boo 51boo5boo$88bo29bobo18bobo34bo18bob3o6b3o4boo40bo9b3o27boo45bobo18bo 38booboo95b3o16boo92bobo10boo39boo5bo$88bobo27boo20boobboo26bo23b3o7b 3o4bo44bo8bo26bobbo44bo20boo37boobo98bo20boo85bo3bo11boo44bobo$89boo4b oo47boo25bobo23bo8b3o5b3o37boobo31boo4boo44boo4boo58bo118bo52boo31boo 10bo49boo$95boo73bo3bo28b3o10bo37boo32bobo25bo3boo23bobbo52bob5o68boo 45b3o32boo19bo31boobo10bo44boo$107boo8bo51bo3bo29b3o28boo52bo26bobo3bo 23boo54boo73bo46bo35bo17bobo30bobb3o7b3o26boo5boo9bobo$106b3obo5bo12b oo37bo3bo30b3o24boobboo51boo26boo3bo33boo48boo71b3o79bobo15boo30bobobo 39bo5boo10bo$87boo16bobo3boo7boo7bo37bo3bo57bobo65boo20bo12boo20boo49b o73bo80boo4bo6boo33bobobo40bobo$87bo17bobobboo5bob3o5bobo38bobo59bo66b o17b5obo10bo49boo18b3o160bobo4bobbo30b3obbo27boo13boo18boo$89boboo13b 3o9bo8boo40bo56bo71b3o14bo4boo11b3o47bo18bo138boo22bobo5boo32boboo7boo 19bo18boo14boobo$88booboo13b3o14bo108boo66bo15b3o16bo27boo5boo11bobo 155bobo22bo10boo10boo17boo9bo17bobo17bobo18bo$119bo4bo99b3obo3bo85bob oo41bo7bo12boo82boo46boo25bo33bobo9boo18bo9bobo15boo19bo16bo$88booboo 27bobo100boboo6b3o83bobo42bo6bobo94boo3boo42bo25boo34bo40boo4bo6boo19b o21boboo$89bobo24boo105boobo8bo127boo7boobboo95boo42bobo15boo42boo44bo bo4bobbo17b3o22boo$89bobo23bobbo102bob3o150boo140boo15boo27boo59bobo5b oo17bob3o$90bo25boo110boo133boo200bo60bo10boo12bo3bo$109b3o91bo9bo9bo 5bo132bobo95boo12boo86b3o72bobo10bo3bo$166b3o34b3o5b3o15bobo131bo97bo 5boo5bo87bo76bo9b3obo$166b3o37bo3bo19boo145boo79b3o6boo6b3o161boo9b3o$ 166b3o10bo25boo3boo159boo4boo79bo18bo146boo25bo$169b3o5b3o191boo252bo$ 169b3o4bo442boob3o30bo$169b3o4boo73boo91boo229boo42boobo31boo$116boo 133boo92bo101bo126bobo38boo5bo30boboo$116boo9boo45bo170bobo99b3o124bo 40boo5boboo26b3obbo$123boobboo44bobo139boo29boo102bo63booboobboo50boo 45boboboo28bobobo8bo$122bobo49boobboo5bo106bo20bobbo55boo75boo23boobo 7bo29bobobbobo13boo82boo33bobobo5b3o$123bo54boo4b3o32boo71b3o18boobboo 52bobo100boboo7b3o11boo13bo3boo16bobo60boo5boo8boo38bobb3obbo$119bo63b 3obo31boo74bo23bo51bo116bo10bobo13boobo19bo61bo5boo8bobo38boobo3boo$ 118bobo4boo19boo5boo29bo3bo8bo9boo85boo23bo50boo115boo12b3o12bobobbo 16boo60bobo14bo40boo$117bo3bo3bo8boo10boo5bo31bo3bo5b3o8bobbo107boboo 119boo58bo3bo11bobobobo78boo17b3o35bo3bo$116bo3bo5b3o6bo15bobo32bob3o 3bo6boo4boo66bo37boobboobbo118bo59boobbo12booboo72boo9boo12bo41bobo$ 115bo3bo8bo3b3o16boo34b3o4boo4bobo46bo9bo15b3o35boo5boo116bobo64boo87b o9bobo12bo3bo38boobboo$114bo3bo13bo14boo39bo11bo48b3o5b3o18bo159boo20b oobboo40bo88b3o7bo13bobbobo41boo$115bobo12boo15bobo42bo6boo51bo3bo20b oo11boo71boo94b3obboo33boo3bo92bo3bo19bobobbo66boo5boo$116bo12bo5boo 11bobboo38bobo15boo40boo3boo32boo7bo63boo95boobb3o13boo17boo3boo94b3o 19bo3bo66boo5bo$129bo5boo36boo17boobboo11bo29boo220bobboo14boo117bob3o 22bo71bobo$128boobo17bo3bo15boobboo21boo12b3o27bo13bo45boobo43boo68boo 147boo5boo23bo3bo20b3o72boo$127bobboo17bo4bo13bobo41bo11boo11b3o13bobo 46boboboo39boo68boo107boo39bo5boo22bo3bo92boo$127boo5boo15bobobo13bo 50boobboo11bo15bobo46b3oboo217bobbo38bobo26b3obo93bobo$133bobo16bobobo 7b3o52bobo32bo49boo53booboo161booboo38boo27b3o95bobboo$130bo3bo18bo4bo 8bo3boo47bo122bo15boobo163bo45boo24bo26boo5boo$130boo22bo3bo4bo3bo3bo 44bo125boo20bo84boo32boo41bobbo41bobo10boo39boo5bo63bo3bo$129boobo29bo bobbo4b3o40b3o4boo41boo52boo21bobo13bob5o84boo11boo20bo42bobo42bo11boo 44bobo27boo34bo4bo$128bobb3o21boo3bobbobo8bo39bob3o3bo42boo34boo16bobo 36boo102bo19bo85bo61boo24boobboo3boo31bobobo$127bobobo28bo3bo27boo19bo 3bo5b3o27boo45bobo18bo39boo100b3o16boo53boo87boo27bobo6bobo32bobobo$ 126bobobo29bo27boobboo18bo3bo8bo26bobbo44bo20boo39bo102bo20boo28boo19b o28b3obo37boo5boo9bobo27bo7bo35bo4bo$124b3obbo31b3o23bobo21b3obo31boo 4boo44boo4boo32boo18b3o125bo29bo17bobo27boboo40bo5boo10bo23b3o9boo36bo 3bo$125boboo59bo23b3o31bobo25bo3boo23bobbo33bo18bo124b3o30bobo15boo28b oobo40bobo19bo22bo3boobbo$126boo56bo28bo32bo26bobo3bo23boo22boo11bobo 141bo33boo11bo31bob3o27boo13boo18bobo17bo3bo3bo3bo27bo11boo$127bo55bob o4boo53boo26boo3bo33boo14bo12boo12boo166b3o5boo41boo19bo18boo13bo3bo 15bobobbo4b3o26b3o$182bo3bo3bo64boo20bo12boo20boo14bobo24boo24boo140b 3o6bo32bo9bo17bobo17bobo14bo3bo12bobbobo4bobo4boo5boo14bo$181bo3bo5b3o 61bo17b5obo10bo38boobboo45bobo44boo106boo10boo26bobo15boo15bo3bo16bo3b o11bo3bo5boo6bo5boo14boo$180bo3bo8bo62b3o14bo4boo11b3o39boo47bo44boo 73boo31bobo9boo27boo4bo27boo20bo3bo10bo17bobo$179bo3bo74bo15b3o16bo27b oo179bobo32bo43bobo25boobo20bobo12b3o15boo$180bobo3boo88boboo41bo155b oo25bo32boo42bobo24bobb3o20bo35boo$161bo9bo9bo5bo89bobo42bo155bo25boo 16boo58bo10boo12bobobo57bobo$161b3o5b3o15bobo131boo11boo142bobo15boo 25bo69bobo10bobobo59bo$164bo3bo19boo138boo4boo10b4o129boo15boo22b3o72b o8b3obbo87bo$163boo3boo158boo15boobbo5boo15boo4bo141bo74boo8boboo56b3o 27b3o$344boobbo4boboboo16booboo15boo6boo17booboobo7bo143boo24boo57b3o 26bo$345bobbobboo5bo17bobbo15bobbo4boo16boboboboo7b3o11boo129bo25bo57b 3o26boo$209boo135boo6bo3bo13boo6boo10booboboo23bo16bo10bobo125b3o81b3o 7boo$209boo140bo5bo14bo8bo9bobobo42boo12b3o123bo32bo50b3o7boo$352b4o 17bo6bo10bo3boboo52bo3bo77boo127b3o$273boo54boo23bo18b3o14boobbobboo 52boobbo76bobo38boo5boo27bob3o$250bo20bobbo27boo24bobo40b3o20boo60boo 74bo40boo5bo30boobo8bo$177boo71b3o18boobboo26bo24bo42bobo83bo73boo45bo bo30boboo6b3o$177boo74bo23bo25bobo21boo42bo15boo61boo3bo122boo32b3obo 3bo$165boo85boo23bo26boo66bo14boo42boo17boo3boo18booboobboo73boo5boo8b oo44boo62boo$164bobbo107boboo152boo43bobobbobo13boo59bo5boo8bobo37bo 69boo$159boo4boo66bo37boobboobbo195bo3boo16bobo58bobo14bobboo38bo$158b obo46bo9bo15b3o35boo5boo95b3o98boobo19bo59boo56bobo$158bo48b3o5b3o18bo 240bobobbo16boo51boo9boo11bo3bo37boobboo$157boo51bo3bo20boo11boo127boo 98bobobobo68bo9bobo11bo4bo40boo$167boo40boo3boo32boo127bobo98booboo70b 3o3bo3bo14bobobo66boo5boo$167bo29boo178bobbo19boo32boo119bo3boo10bo7bo bobo65boo5bo$168b3o27bo13bo165boboo18boo11boo20bo122boobo10bo7bo4bo68b obo45bo$170bo11boo11b3o13bobo107boo57bo32bo19bo123bobb3o7b3o8bo3bo68b oo45bobo$178boobboo11bo15bobo107boo91b3o16boo89boo5boo23bobobo89boo50b o$177bobo32bo166bo36bo20boo86bo5boo22bobobo22boo66bobo$174boobbo126boo 71bo59bo86bobo25b3obbo92bo$305boo81boo45b3o49boo37boo26boboo$173bo3bo bboo41boo52boo109bo46bo51boo41boo23boo26boo5boo62boo36boo3boo$172bo4bo bbo42boo34boo16bobo37booboo67b3o137bobo10boo12bo26boo5bo25boo36boobo 34boo3boo$171bobobo5b3o27boo45bobo18bo37boobo70bo138bo11boo44bobo21boo bboo3boo35bo$170bobobo8bo26bobbo44bo20boo41bo265boo21bobo6bobo32bo$ 168bo4bo31boo4boo44boo4boo51bob5o130boo70b3o56boo22boobbo7bo35boboo24b oboo$168bo3bo31bobo25bo3boo23bobbo51boo61bobo71bobo69b3o38boo5boo9bobo 32boo37boo22b3oboo$204bo26bobo3bo23boo56boo58bobo46boo25bo42boo25b3o 39bo5boo10bo21bo3bobboobbo62bo11boo$170boo31boo26boo3bo33boo48bo58b3o 3boo42bo25boo20boo19bo23b3o42bobo18b3o15bo4bobbo3bo27bo35b3oboo5bo$ 213boo20bo12boo20boo25boo18b3o65boo18bobo21bobo15boo29bo17bobo23b3o28b oo13boo17bo17bobobo5b3o26b3o37bobobbo4b3o$213bo17b5obo10bo49bo18bo88b oo22boo15boo29bobo15boo24b3o7boo19bo18boo13bo3bo12bobobo4bobo4boo5boo 14bo44boo6bo$214b3o14bo4boo11b3o33boo11bobo105bo72boo4bo6boo39bo17bobo 17bobo13bobbobo9bo4bo5boo6bo5boo14boo$216bo15b3o16bo27boo5bo12boo71boo 12boo96bobo4bobbo38bobo15boo19bo16bobobbo7bo3bo14bobo$234boboo41bo6bob o84bo5boo5bo97bobo5boo40boo4bo27bo21bo3bo27boo$235bobo42bo6boobboo77b 3o6boo6b3o95bo10boo10boo29bobo52bo9boo20boo$279boo10boo77bo18bo106bobo 9boo29bobo24b3obo20b3o31bobo$498bo41bo10boo12boboo57bo$279boo217boo51b obo11boobo53bo30bo$278bobo202boo68bo9bob3o53b3o27b3o$279bo12boo190bo 68boo65bob3o25bo$286boo4boo187b3o54boo25bo53bo3bo26boo$286boo138booboo bboo46bo57bo78bo3bo5boo8bo$427bobobbobo13boo86b3o78b3obo6boo6bobo$426b o3boo16bobo85bo81b3o16boo$260boo165boobo19bo117b3o48bo$261bo166bobobbo 16boo116b3o$261bobo164bobobobo59boo72b3o10bo$262boo23boo140booboo59bob o38boo5boo28b3o5b3o$286bobo204bo40boo5bo29b3o4bo61boo$286bo205boo45bob o29b3o4boo60boo$285boo252boo$518boo5boo8boo39bo$519bo5boo8bobo37bobo$ 519bobo14bobboo35boobboo$438boo80boo58boo$438boo73boo9boo11bo3bo65boo 5boo$279boo232bo9bobo11bo4bo64boo5bo43bo$279boo233b3o3bo3bo14bobobo68b obo42bobo$516bo3boo18bobobo67boo44bo$263boo254boobo18bo4bo61boo$263boo 253bobb3o18bo3bo61bobo$449boo34boo5boo23bobobo87bo$275booboo148boo19bo 36bo5boo22bobobo22boo68bo34boo3boo$275boobo150bo17bobo36bobo25b3obbo 92bobo33boo3boo$259boo19bo148bobo15boo38boo26boboo55boo35bo3bo$258boo 14bob5o149boo4bo6boo46boo23boo26boo5boo17boobboo3boo31bo3bo$260bo13boo 159bobo4bobbo44bobo10boo12bo26boo5bo17bobo6bobo32bo3bo22boboo$277boo 156bobo5boo46bo11boo44bobo18bo7bo35bo3bo19b3oboo$278bo157bo10boo10boo 88boo26boo36bobo19bo11boo$255boo18b3o169bobo9boo25b3o56boo19boo4boobbo 39bo21b3oboo5bo$256bo18bo173bo36b3o38boo5boo9bobo16boboo4bo3bo27bo35bo bobbo4b3o$243boo11bobo190boo35b3o39bo5boo10bo16bo9b3o26b3o39boo6bo$ 244bo12boo12boo161boo47b3o42bobo18b3o14bo4bobo4boo5boo14bo$244bobo24b oo162bo47b3o28boo13boo17bo13boobo5boo6bo5boo14boo$245boobboo181b3o48b 3o7boo19bo18boo13bo3bo9boo15bobo$249boo181bo61bo17bobo17bobo13bobbobo 26boo$494bobo15boo19bo16bobobbo28boo$270boo223boo4bo27bo21bo3bo27bobo$ 500bobo52bo24bo3bo$250boo248bobo24b3obo20b3o25boo29bo$244boo4boo11boo 180boo54bo10boo12boboo49boobo26b3o$244boo16bobo6boo171bobo38boo5boo18b obo11boobo48bobb3o24bo$261boobo6bobo170bo40boo5bo21bo9bob3o48bobobo26b oo$262boo9bo169boo45bobo21boo60bobobo5boo$263bo3b4obbo216boo7boo25bo 47b3obbo6boo$268bobobo196boo5boo8boo12bo74boboo$270boo198bo5boo8bobo8b 3o76boo$245boo223bobo14bo9bo79bo$244bobo224boo18bo37b3o$244bo219boo9b oo52b3o$243boo219bo9bobo12bob3o35b3o10bo55boo$465b3o3boobbo15boobo37b 3o5b3o55boo$467bo23boboo37b3o4bo$470bo3bo17b3obo35b3o4boo$469bo4bo$ 436boo5boo23bobobo21bo42bo$437bo5boo22bobobo64bobo$437bobo25bo4bo66boo bboo$438boo25bo3bo71boo73bo$442boo51boo5boo64boo5boo38bobo$441bobo10b oo11boo26boo5bo65boo5bo40bo$442bo11boo44bobo70bobo$438bo61boo71boo$ 437bobo56boo71boo$436bo3bo37boo5boo9bobo70bobo34boo3boo$435bo3bo39bo5b oo10bo3bo68bo35boo3boo$434bo3bo40bobo18boo72bo$433bo3bo27boo13boo17bob oo70bobo$434bobo7boo19bo18boo12b3obbo31boo35bo3bo21boboo$435bo9bo17bob o17bobo14bobobo26boobboo3boo31bo3bo18b3oboo$445bobo15boo19bo16bobobo 24bobo6bobo32bo3bo16bo11boo$446boo4bo49bobb3o23bo7bo35bo3bo16b3oboo5bo $451bobo26boo21boobo31boo36bobo19bobobbo4b3o$451bobo24boboo22boo21boo 4boobbo39bo24boo6bo$452bo10boo12bo26bo20boboo4bo3bo16bobo8bo$463bobo 14bo43bo9b3o17boo7b3o$465bo10boobo47bo4bobo4boo5boo7bo6bo$465boo9boo 45boobo5boo6bo5boo14boo$450boo71boo15bobo$451bo89boo$448b3o94boo$448bo 32bo62bobo$480bobo58bo3bo$479bo3bo57boo29bo$480bo3bo8bo46boobo26b3o$ 481bo3bo5b3o45bobb3o24bo$482bo3bo3bo47bobobo26boo$483bobo4boo45bobobo 5boo$484bo50b3obbo6boo$488bo47boboo$487bobo47boo$488boobboo44bo$492boo $519boo5boo$519boo5bo32boo$524bobo32boo$524boo$520boo$520bobo$521bo$ 525bo$524b3o$486boo35b3obo49bo$482boobboo3boo31bo3bo47bobo$481bobo6bob o32bo3bo47bo$482bo7bo35bob3o$489boo36b3o$477b3o4boobbo39bo$477b3o4bo3b o13b3o11bo50boo3boo$477b3o5b3o14bo11b3o50boo3boo$474b3o6bobo4boo5boo4b o9bo$474b3o6boo6bo5boo14boo$474b3o14bobo65boboo$492boo63b3oboo$496boo 58bo11boo$495bobo59b3oboo5bo$492boobbo62bobobbo4b3o$523bo39boo6bo$491b o3bo25b3o$490bo4bo24bo$489bobobo14bo11boo$488bobobo5boo7bobo$486bo4bo 6boo7bobo$486bo3bo17bo$$488boo$511booboo$511booboo$511booboo$517bobo$ 514boo$515bo3bo$515bo$518boo$519bo$514bo4bo$514bo3bo9bo$516boo9bobo$ 528bo4$518boo3boo$518boo3boo3$510boboo$508b3oboo$507bo11boo$508b3oboo 5bo$510bobobbo4b3o$514boo6bo! golly-3.3-src/Patterns/Life/Guns/p59-gun-with-Snark-reflectors.rle0000644000175000017500000001631412250742662021724 00000000000000#C Smaller p59 gun #C #C By Dave Greene, 2 May 2013, using Mike Playle's Snark reflector. #C Based on an earlier p59 gun by Adam P. Goucher and Jason Summers. x = 299, y = 239, rule = B3/S23 118b2o3b2o$118b2o2bob3o$122bo4bo$118b4ob2o2bo$118bo2bobobob2o$121bobob obo$122b2obobo$126bo2$112b2o$113bo7b2o$113bobo$114b2o$121b2o$121b2obo 98b2o3b2o26b2o3b2o$122b2o99b2o2bob3o22b3obo2b2o$123bo103bo4bo20bo4bo$ 223b4ob2o2bo20bo2b2ob4o$223bo2bobobob2o18b2obobobo2bo$124b2o100bobobob o20bobobobo$124bo102b2obobo20bobob2o$125b3o103bo22bo$127bo$136bobo78b 2o48b2o$137b2o79bo7b2o29b3o7bo$126b2o3b2o4bo80bobo5b2o28bo3bo4bobo$ 124b3obo2b2o86b2o34bo5bo3b2o$108b2o13bo4bo125bo3bo3bo$109b2o12bo2b2ob 4o121bo2bobo2bo$108bo13b2obobobo2bo92b2o27bo3bo3bo$123bobobobo94bobo 28bo5bo$123bobob2o97bo33bo$124bo130bo3bo$229b2o24bo$137b2o90bo8bobo15b o$128bo8bo92b3o6b2o12b3o$127b3o5bobo94bo6bo13bo$126b5o4b2o15bo$125b2o 3b2o21bo115bo$124b3o3b3o18b3o87bo26b2o$125b2o3b2o107b2o27bobo$126b5o 109b2o$93b3o31b3o$95bo30b3o$94bo30b2o83b2o$126bo54bo29b2o$123b3o55b3o 26bo$123bo60bo$183b2o69bo$153bo16b2o48b2o33bo$110bo27b3o12b3o14b2o48b 2o31b3o34bo$110bobo25bo17bo115b2o14b5o$110b2o27bo15b2o9bo103bo2bo13bo 5bo$167b2o101b2obobo4bo7b3o2bo$92bo67b3o3b2o12b3o26b3o13bo46bob2o3bobo 9bob2o$92b3o64bo4bo13bo4bo24bo4bo11bobo44bo5bo3bo5b4o2bo$79bo15bo129b 2o7b2o34b3o5bo3bo5bo3b2o$79b2o13b2o59bobo2bo3bo13bo3bo2bobo16bobo2bo3b o20bo34bo8bo3bo6b3o$78bobo74bobo3b3o6b3o6b3o3bobo16bobo3b3o6b3o10bobo 34b2o8bobo9bo$154bo15b3o15bo14bo15b3o10b2o46bo10bob2o$86b2o66b2o15bo 15b2o14b2o15bo69b2ob2o$86bo67b3o14bo14b3o14b3o14bo15b2o7bo21b2o$83b2ob o68b2o14bo14b2o16b2o14bo15b2o5b3o20bo2bo$83bo2b3o7bobo53b2ob2o13bobo 15bo14bo15bobo20bo39b2o$84b2o3bo6bo2bo53bobo81bo4b2o22b3o13bo$86b4o6bo 2bo48b2o4bo81bobo20b2o22b3o$86bo11bo3b2o45bo20bobo15bo14bo15bobo13b2ob 2o18bobo24bo$87b3o12bobo41b3o5b2o15bo14b2o16b2o14bo14b2o21bo$90bo13bo 41bo7b2o15bo14b3o14b3o14bo14b3o19b2o$85b5o14b2o65bo15b2o14b2o15bo15b2o $84bo73b2o10b3o15bo14bo15b3o15bo33bo$64b2o17bo2b2o69bobo10b3o6b3o3bobo 16bobo3b3o6b3o6b3o3bobo30b2obobo$63bobo16bob2obo69bo20bo3bo2bobo16bobo 2bo3bo13bo3bo2bobo29bobobobo$65bo10b2o4bo73b2o7b2o96bo2bobobob2o$74bo 2bo2b2ob4o77bobo11bo4bo24bo4bo13bo4bo30b4ob2o2bo$74b2obobobobo2bo79bo 13b3o26b3o12b2o3b3o35bo4bo$77bobobobo139b2o38b2o2bob3o$77bobob2o37bo 104bo9b2o15bo10b2o3b2o$78bo28bo10b3o114bo17bo$108bo8bo52b2o19b2o27b2o 14b3o12b3o$91b2o13b3o8b2o51b2o18bobo27b2o16bo$82b2o7bo100bo$82b2o5bobo $89b2o34b2ob2o51bo28bo$126bob2o49b2o30b2o$126bo53b2o28b2o$49b2o67b2o4b 3o$50b2o66b2o3bo3b2o70b2o3b2o$49bo22bo13bo36b4o2bo20b2o45b3obo2b2o$71b o13b2o22b2o15bob2o21b2o43bo4bo$71b3o5b2o4bobo20bobo12b3o2bo21bo45bo2b 2ob4o32b3o$80bo27bo13bo5bo66b2obobobo2bo32bo$77b3o27b2o6bo7b5o68bobobo bo36bo26bo$77bo35b2o10bo70bobob2o65b2o$114b2o60b2o19bo68b2o$100bo76b2o $100b3o73bo33b2o$103bo97b2o7bo28bo$102b2o61bo35b2o5bobo15bo10b3o$165bo bo40b2o14bobo9bo$105bo59b2o58b2o9b2o51bo$34b3o67bo2bo179b3o$36bo71bo 177bo$35bo22bo9b2o3b2o24b2o4bo29b3o106b2o40b2o$56b2o10b2o2bob3o23bo4bo 3bo27bo53bo53bo8bo$57b2o13bo4bo22bo2bo5bo2b2o22bo54bobo11b2o31bo6bob2o 4b2o$68b4ob2o2bo24b2o8bobo76b2o5b2o4b2o31bo6b2o2bo4bobo38b2ob2o$68bo2b o3bob2o24bobobo6bo84bo6bo30b2o3b2o2b2o34bo12bob2o$71bobobobo26b3o7b2o 80b3o43b2obo34bobo12bo$72b2obobo83b3o32bo31b2o15bo35b2o4b2o4b3o$76bo 24bo3bo57bo63bobo12b3o24bo17b2o3bo3b2o$100bob2obo56bo64bo13bo9b2o14b5o 20b4o2bo$34bo27b2o36bobo3b2o118b2o5bobo6b5o5bo13bo5bo5b2o15bob2o$34b3o 26bo8bo26b2obobobo2bo40bobo68bo11b2o11bo5bobo12b3o2bo4bobo12b3o2bo$37b o25bobo5b2o27bo2b2ob4o40b2o69b3o10bo9bo8b2o15bob2o3bo13bo5bo$20bo15b2o 26b2o34bo4bo45bo72bo19b2o21b4o2bo2b2o14b5o$20b2o56bo22b3obo2b2o113b2o 37b2o3bo3b2o21bo$19bobo57bo23b2o3b2o11bo140b2o4b3o$25b2ob2o12bo34b3o 41b2o132b2o13bo$25b2obo13bobo75bobo53bobo75bobo13bob2o$28bo13b2o132b2o 41b3o34bo12b2ob2o$28b3o4b2o140bo11b2o3b2o23bo57bobo$4bo21b2o3bo3b2o37b 2o113b2o2bob3o22bo56b2o$2b5o14b2o2bo2b4o21b2o19bo72bo45bo4bo34b2o26b2o 15bo$bo5bo13bo3b2obo15b2o8bo9bo10b3o69b2o40b4ob2o2bo27b2o5bobo25bo$bo 2b3o12bobo4bo2b3o12bobo5bo11b2o11bo68bobo40bo2bobobob2o26bo8bo26b3o$2o bo15b2o5bo5bo13bo5b5o6bobo5b2o118b2o3bobo36b2o27bo$o2b4o20b5o14b2o9bo 13bo64bo56bob2obo$b2o3bo3b2o17bo24b3o12bobo63bo57bo3bo24bo$3b3o4b2o4b 2o35bo15b2o31bo32b3o83bobob2o$3bo12bobo34bob2o43b3o80b2o7b3o26bobobobo $2obo12bo34b2o2b2o3b2o30bo6bo84bo6bobobo24b2obo3bo2bo$2ob2o38bobo4bo2b 2o6bo31b2o4b2o5b2o76bobo8b2o24bo2b2ob4o$44b2o4b2obo6bo31b2o11bobo54bo 22b2o2bo5bo2bo22bo4bo13b2o$44bo8bo53bo53bo27bo3bo4bo23b3obo2b2o10b2o$ 11b2o40b2o106b3o29bo4b2o24b2o3b2o9bo22bo$12bo177bo71bo$9b3o179bo2bo67b 3o$9bo51b2o9b2o58b2o59bo$62bo9bobo14b2o40bobo$59b3o10bo15bobo5b2o35bo 61b2o$59bo28bo7b2o97bo$87b2o33bo73b3o$120b2o76bo$31b2o68bo19b2o60b2o$ 30b2o65b2obobo70bo10b2o35bo$32bo26bo36bobobobo68b5o7bo6b2o27b3o$60bo 32bo2bobobob2o66bo5bo13bo27bo$58b3o32b4ob2o2bo45bo21bo2b3o12bobo20bobo 4b2o5b3o$97bo4bo43b2o21b2obo15b2o22b2o13bo$93b2o2bob3o45b2o20bo2b4o36b o13bo22bo$93b2o3b2o70b2o3bo3b2o66b2o$172b3o4b2o67b2o$87b2o28b2o53bo$ 86b2o30b2o49b2obo$88bo28bo51b2ob2o34b2o$207bobo5b2o$106bo100bo7b2o$60b o16b2o27bobo18b2o51b2o8b3o13b2o$45b3o12b3o14b2o27b2o19b2o52bo8bo$45bo 17bo114b3o10bo28bo$29b2o3b2o10bo15b2o9bo104bo37b2obobo$27b3obo2b2o38b 2o139bobobobo$26bo4bo35b3o3b2o12b3o26b3o13bo79bo2bobobobob2o$26bo2b2ob 4o30bo4bo13bo4bo24bo4bo11bobo77b4ob2o2bo2bo$25b2obobobo2bo96b2o7b2o73b o4b2o10bo$26bobobobo29bobo2bo3bo13bo3bo2bobo16bobo2bo3bo20bo69bob2obo 16bobo$26bobob2o30bobo3b3o6b3o6b3o3bobo16bobo3b3o6b3o10bobo69b2o2bo17b 2o$27bo33bo15b3o15bo14bo15b3o10b2o73bo$61b2o15bo15b2o14b2o15bo65b2o14b 5o$40b2o19b3o14bo14b3o14b3o14bo15b2o7bo41bo13bo$40bo21b2o14bo14b2o16b 2o14bo15b2o5b3o41bobo12b3o$13bo24bobo18b2ob2o13bobo15bo14bo15bobo20bo 45b2o3bo11bo$13b3o22b2o20bobo81bo4b2o48bo2bo6b4o$16bo13b3o22b2o4bo81bo bo53bo2bo6bo3b2o$15b2o39bo20bobo15bo14bo15bobo13b2ob2o53bobo7b3o2bo$ 29bo2bo20b3o5b2o15bo14b2o16b2o14bo14b2o68bob2o$30b2o21bo7b2o15bo14b3o 14b3o14bo14b3o67bo$4b2ob2o69bo15b2o14b2o15bo15b2o66b2o$4b2obo10bo46b2o 10b3o15bo14bo15b3o15bo$7bo9bobo8b2o34bobo10b3o6b3o3bobo16bobo3b3o6b3o 6b3o3bobo74bobo$7b3o6bo3bo8bo34bo20bo3bo2bobo16bobo2bo3bo13bo3bo2bobo 59b2o13b2o$5b2o3bo5bo3bo5b3o34b2o7b2o129bo15bo$4bo2b4o5bo3bo5bo44bobo 11bo4bo24bo4bo13bo4bo64b3o$4b2obo9bobo3b2obo46bo13b3o26b3o12b2o3b3o67b o$5bo2b3o7bo4bobob2o101b2o$5bo5bo13bo2bo103bo9b2o15bo27b2o$6b5o14b2o 115bo17bo25bobo$8bo34b3o31b2o48b2o14b3o12b3o27bo$43bo33b2o48b2o16bo$ 44bo$175bo$88bo28bo55b3o$72bo13b2o30b2o52bo$72b3o12b2o28b2o53b2o30bo$ 75bo94b3o30bo$74b2o93b3o31b3o$57b2o109b5o$28bobo27b2o107b2o3b2o$29b2o 26bo87b3o18b3o3b3o$29bo115bo21b2o3b2o$146bo15b2o4b5o$45bo13bo6bo94bobo 5b3o$43b3o12b2o6b3o92bo8bo$42bo15bobo8bo90b2o$43bo24b2o$39bo3bo130bo$ 38bo33bo60bo36b2obobo$37bo5bo28bobo56bobo35bobobobo$36bo3bo3bo27b2o58b 2o32bo2bobobob2o13bo$36bo2bobo2bo121b4ob2o2bo12b2o$36bo3bo3bo125bo4bo 13b2o$32b2o3bo5bo34b2o86b2o2bob3o$31bobo4bo3bo28b2o5bobo80bo4b2o3b2o$ 31bo7b3o29b2o7bo79b2o$30b2o48b2o78bobo$171bo$44bo22bo103b3o$40b2obobo 20bobob2o102bo$39bobobobo20bobobobo100b2o$36bo2bobobob2o18b2obobobo2bo $36b4ob2o2bo20bo2b2ob4o$40bo4bo20bo4bo74bobo26bo$36b2o2bob3o22b3obo2b 2o71b2o26b2o$36b2o3b2o26b2o3b2o71bo26bob2o$176b2o$183b2o$183bobo$176b 2o7bo$185b2o2$172bo$171bobob2o$171bobobobo$170b2obobobo2bo$171bo2b2ob 4o$162bo8bo4bo$163bo8b3obo2b2o$161b3o10b2o3b2o!golly-3.3-src/Patterns/Life/Guns/gun-p165mwss.rle0000644000175000017500000000342212026730263016510 00000000000000#C p165 MWSS gun based on a three-gliders -> MWSS+glider+LoM reaction #C by Dietrich Leithner. David Bell and Jason Summers, 5/2002. #C From Jason Summers' "jslife" pattern collection. x = 178, y = 218, rule = B3/S23 125b3o$125bobo$125b3o6bo$125b3o5b3o$125b3o$125b3o$125bobo5b3o$125b3o$ 133bobo$133bobo$$133b3o$111boo6boo$110bobbo4bobbo$110bobbo4bobbo11b3o$ 110bobbo4bobbo12bo$111boo6boo$$137bobboo4boobbo$136bo3b3obb3o3bo$137bo bboo4boobbo7$139bo$139b3o4bobobbobo$138bob4obobbobbobboboo$120bobo23bo bobbobo$120boo$121bo$139b3o$139b3o$44b3o93bo$45bo94bo$45bo94bo$44b3o 92bobo$$44b3o$44b3o92bobo$140bo$44b3o93bo$45bo94bo$45bo93b3o$44b3o92b 3o$$51boo6boo$49bo4bobbo4bo$49bo4bobbo4bo$49bo4bobbo4bo4bo$51boo6boo5b 3o8bo$65bobobo6b3o$65bobobo5bobobo$66b3o6bobobo$67bo8b3o$77bo$$67bo$ 66b3o8bo$17bo47bobobo6b3o$16b3o46bobobo5bobobo$15bobobo46b3o6bobobo$ 15bobobo47bo8b3o$16b3o12bo45bo$17bo11boo$30boo$$17bo79b3o$16b3o80bo$ 15bobobo59bo18bo$15bobobo59bobo$16b3o49bo10boo$17bo49boo$67bobo$78b3o$ bbobbo4bobbo64bo$3obb6obb3o63bo$bbobbo4bobbo$$81boo$82boo$81bo$$48bo$ 46boo$47boo$58bobobbobo$54boobobbobbobboboo$58bobobbobo$$22b3o52b3o$$ 21bo3bo50bo3bo$21bo3bo50bo3bo$$22b3o52b3o$88b3o$88b3o$22b3o52b3o9bo$ 89bo$21bo3bo50bo3bo8bo$21bo3bo17bobo30bo3bo7bobo$44boo$22b3o19bo32b3o$ 88bobo$89bo$8bobboboobobbo69bo$8b4oboob4o69bo$8bobboboobobbo68b3o$37b oo6boo41b3o$35bo4bobbo4bo$35bo4bobbo4bo$35bo4bobbo4bo$37boo6boo$$51b3o 66boo$52bo66boo$52bo68bo$51b3o$$51b3o$38bobo10b3o$39boo$39bo11b3o$52bo $52bo$51b3o26$159bo$159b3o4bobobbobo$158bob4obobbobbobboboo$166bobobbo bo3$159b3o$159b3o$160bo$160bo$81bo78bo$79bobo77bobo$80boo$$159bobo$ 160bo$160bo$160bo$159b3o$159b3o23$117b3o$119bo$118bo$100boo6boo$99bobb o4bobbo$99bobbo4bobbo$99bobbo4bobbo$100boo6boo$114b3o$$113bo3bo$113bo 3bo$$114b3o3$114b3o$$113bo3bo$113bo3bo$$114b3o! golly-3.3-src/Patterns/Life/Guns/7-in-a-row-Cordership-V-gun.rle0000644000175000017500000025404612026730263021215 00000000000000#C p726 V-gun for seven-engine-in-a-row Cordership: a 21-glider salvo #C meets a 27-glider salvo, following a recipe posted on 7 May 2003. #C The p726 Herschel factories are made from matched pairs of stable #C glider reflectors; they could be replaced by Herschel factories #C of any desired period >726. #C Dave Greene, 30 Jun 2003; Cordership eater from 4 July 2003, #C based on a glider-extraction reaction found by Karel Suhajda. x = 2325, y = 2210, rule = B3/S23 150bo$122b2o24b3o$123bo23bo$112bo10bobo21b2o$110b3o11b2o$94bo14bo$94b 3o12b2o$97bo64b2o$96b2o64b2o3$97b2o$97b2o17b2o$116b2o$167b2o$167b2o4$ 113b2o32b2o$113bo20b2o11b2o$115bo19bo$114b2o16b3o$110b2o20bo$110bo$ 111b3o$113bo3$100b3o$100bo2bo$99bo3bo$99b4o16b2o$100bo18bo$117bobo$ 117b2o$110b2o2bo$105b2o5b2obo$113bobo$198bo$71b2o5b2o90b2o24b3o$72bo5b 2o91bo23bo$72bobo85bo10bobo21b2o$73b2o83b3o11b2o$77b2o63bo14bo$76bobo 63b3o12b2o$77bo67bo64b2o$99b2o43b2o64b2o$76bo14b2o5bobo$76bo14b2o5bo$ 96bobo46b2o$74bo3bo17b2o47b2o17b2o$72b3obob3o11b2o70b2o$67b2o2bo4b2o3b o10bobo120b2o$67bo2bobob2o2b2obo11bo121b2o$69b2ob2o2b2o2bo$70bobob2o2b 2o$70bobobo2bo38bobo$71b2ob4o14b3o22b2o42b2o32b2o$73bo17bobobo13b2o6bo 43bo20b2o11b2o$73bobo13b3o3b3o11b2o52bo19bo$74b2o12bo4bo4bo63b2o16b3o$ 87bob2obo2b2obo23b2o34b2o20bo$87bobob4o2bo24bobo33bo$62bo23b2ob2o4b2o 27bo34b3o$62b3o19bo2bobobo2bo29b2o35bo$65bo18b2o2b2ob4o3b2o$64b2o24bo 8bo19b2o$79b2o9bobo6bobo17bo$79bo11b2o7b2o15bobo$77bobo24b2o6bo4b2o$ 66bo10b2o24bo2bo4bobo53b2o$65bobo5b2o29b2o5bobo53bo$65bobo4bo2bo24b2o 10bo35b2o15bobo$60b2o4bo6b2o24bobo46b2o15b2o$59bobo15b2o7b2o11bo$59bo 17bobo6bobo9b2o$58b2o19bo8bo24b2o$79b2o3b4ob2o2b2o18bo$84bo2bobobo2bo 19b3o2b2o5b2o$54b2o26b2o2b2obob2o23bo3bo5b2o2046bo$55bo25bo2b2o2b2obo 28bobo116bo1934b3o24b2o$55bobo22bob2o2b2obobo29b2o88b2o24b3o1937bo23bo $56b2o22bo3b2o4bo12b2o20b2o85bo23bo1939b2o21bobo10bo$68b2o11b3obob3o 13bobo18bobo74bo10bobo21b2o1961b2o11b3o$68b2o13bo3bo17bo19bo73b3o11b2o 2000bo14bo$101b4ob2o2b2o35b2o34bo14bo2015b2o12b3o$85bo15bo2bobobo2bo 27b2o5bobo34b3o12b2o1961b2o64bo$85bo13b2o4b2ob2o29b2o5bo39bo64b2o1908b 2o64b2o$98bo2b4obobo35bobo38b2o64b2o$85bo11bob2o2bob2obo13b5o17b2o$84b obo10bo4bo4bo12b3obob3o11b2o2084b2o$52b3o30b2o11b3o3b3o8b2o2bo4bo4bo 10bobo43b2o2019b2o17b2o$54bo26b2o17bobobo10bo2bob2obo2b2obo11bo44b2o 17b2o2000b2o$53bo26bobo18b3o13b2obo3b2o2bo76b2o1949b2o$80bo5b2o30bobo 2bo2b2o128b2o1898b2o$78bobo5b2o30bobo4bo14b3o113b2o$78b2o39b2ob4o$101b o19bo17bobobo13b2o$100bobo18bobo13b3obob3o11b2o2017b2o32b2o$100b2o20b 2o12bo5bo3bo55b2o32b2o1938b2o11b2o20bo$104b2o29bobob2o2b2obo23b2o30bo 20b2o11b2o1951bo19bo$104bobo28bob2o2b2o2bo24bobo31bo19bo1965b3o16b2o$ 99b2o5bo3bo23b2o4bo2b2o27bo30b2o16b3o1968bo20b2o$o18bo79b2o5b2o2b3o19b o2bobobo2bo29b2o25b2o20bo1992bo$3o6b2o6b3o93bo18b2o2b2ob4o3b2o51bo 2011b3o$3bo5b2o5bo95b2o24bo8bo19b2o31b3o2008bo$2b2o12b2o109b2o9bobo6bo bo17bo34bo$127bo11b2o7b2o15bobo$60b2o15b2o46bobo32bo4b2o$15b2o42bobo 15b2o35bo10b2o32bobo$10b2o3b2o42bo53bobo5b2o36bobo$10b2o46b2o53bobo4bo 2bo24b2o10bo72bo1970b2o$108b2o4bo6b2o24bobo58b2o23bobo1969bo$107bobo 15b2o7b2o11bo60bo24b2o1970bobo15b2o$107bo17bobo6bobo9b2o41b2o15bobo 1997b2o15b2o$106b2o19bo8bo24b2o26b2o15b2o$20bo106b2o3b4ob2o2b2o18bo$ 18b3o44bo66bo4bobo2bo19b3o$17bo47b3o34b2o26b2o2bo2bob2o23bo$17b2o49bo 34bo25bo2b2o3bobo2105b2o5b2o$46bo20b2o34bobo22bob2o2bob2obo20b2o5b2o 2076b2o5bo$44b3o16b2o39b2o22bo4bo4bo12b2o8bo5b2o2081bobo$43bo19bo52b2o 11b3obob3o13bobo7bobo119bo1851bo114b2o$30b2o11b2o20bo50b2o13b5o17bo8b 2o91b2o24b3o1851b3o24b2o82b2o$30b2o32b2o83b4ob2o2b2o6b2o88bo23bo1857bo 23bo83bobo$149bo2bobobo2bo5bobo77bo10bobo21b2o1855b2o21bobo10bo73bo$ 147b2o2bo4b2o8bo76b3o11b2o1901b2o11b3o11b2o35b2o$146bo2b2o2b2obo31b2o 37bo14bo1933bo10bobo34bobo5b2o$133bo11bob2o2b2obobo23b2o5bobo37b3o12b 2o1931b2o12b3o34bo5b2o$132bobo10bo3bo5bo24b2o5bo42bo64b2o1825b2o64bo3b o33bobo$61b2o70b2o11b3obob3o9b3o18bobo41b2o64b2o1825b2o64b2o2bo34b2o 17b2ob2o$6bo54b2o17b2o47b2o7b3o7bobobo10bobobo17b2o2006b2o36b2o11b3obo b3o$6bo73b2o46bobo7bo22b3o3b3o11b2o2011bo35bobo10bo4bo4bo2b2o$2bo125bo 5b2o3bo9b3o4b2o2bo4bo4bo10bobo46b2o1955b2o4bo37bo11bob2o2b2obobo2bo$2b 3o121bobo5b2o20bo2bob2obo2b2obo11bo47b2o17b2o1917b2o17b2o4b2o49bo2b2o 3bob2o$81b2o43b2o30b2obob4o2bo79b2o1917b2o75b2o2b2obobo$4bobo74bo67bo 9bob2o4b2o13bo117b2o1815b2o112bo15bo4bobo$5b3o60b2o12b3o63bobo8bobobo 2bo15bo117b2o1815b2o111b3o14b4ob2o$7bo43b2o16bo14bo63b2o10b2ob4o2047b 2o13bobobo17bo$6bo44bo14b3o83b2o8bo17bo3bo13b2o2014b2o11b3o3b3o13bobo$ 30b2o20b3o11bo85bobo7bobo13b3obob3o11b2o2026bo3bobo3bo12b2o$31bo22bo 92b2o5bo8b2o12bo4b2o3bo45b3o10b2o32b2o1855b2o32b2o28b2o23bob2o4b2obo$ 28b3o17bo18bo79b2o5b2o20bobob2o2b2obo23b2o23bo9bo20b2o11b2o1855b2o11b 2o20bo27bobo11b3o10bo2b3o4bo$28bo19b3o6b2o6b3o108bob2o2b2o2bo24bobo19b o2bo11bo19bo1881bo19bo29bo27b2o5bob2o23bo$51bo5b2o5bo86bo23b2obob2o2b 2o27bo20b2o11b2o16b3o1883b3o16b2o27b2o16bo12bo2bo3bo2bo19b3o$50b2o12b 2o85b3o19bo2bobobo2bo29b2o19b2o7b2o20bo1887bo20b2o37bo2bo8b2o3b4ob2o2b 2o18bo$154bo18b2o2b2ob4o3b2o44bo2bo6bo1931bo28b2o7b3o9bo8bo24b2o$108b 2o15b2o26b2o24bo8bo19b2o23bo10b3o1925b3o30bo6bo10bobo6bobo9b2o$63b2o 42bobo15b2o41b2o9bobo6bobo17bo26b2o9bo1925bo32bobo4b3o3bo4b2o7b2o11bo$ 58b2o3b2o42bo60bo11b2o7b2o15bobo1997b2o3bo4b2obo25bobo$58b2o46b2o58bob o24b2o6bo4b2o2004b5o29b2o10bo$155bo10b2o24bo2bo4bobo2010b3o3bo30b2o5bo bo$154bobo5b2o29b2o5bobo2014b2o4b2o24bo2bo4bobo$154bobo4bo2bo24b2o10bo 2021bobo24b2o6bo4b2o10b2o$149b2o4bo6b2o24bobo61b2o1911b2o58bo11b2o7b2o 15bobo9bo$68bo79bobo15b2o7b2o11bo63bo1913bo58b2o9bobo6bobo17bo7bobo$ 66b3o44bo34bo17bobo6bobo9b2o44b2o15bobo1913bobo15b2o24b2o24bo8bo19b2o 6b2o$65bo47b3o31b2o19bo8bo24b2o29b2o15b2o1915b2o15b2o25bo18b2o2b2ob4o 3b2o$65b2o49bo51b2o3b4ob2o2b2o18bo6b2o1997b3o19bo2bobo4bo$94bo20b2o56b o2bobobo2bo19b3o2bobo1997bo23b2obob2o2b2o$92b3o16b2o30b2o26b2o4b2ob2o 23bo2bo1867bo156bobo3b2o2bo$91bo19bo32bo11bobo11bo2b4obobo24bob2o1867b 3o24b2o128bobob2o2b2obo$78b2o11b2o20bo30bobo9bobo10bob2o2bob2obo21b2ob o5b2o1866bo23bo102b2o5b2o5b2o12bo4bo4bo$78b2o32b2o31b2o10bo11bo4bo4bo 12b2o9bobo5b2o1865b2o21bobo10bo91b2o5bo5bobo13b3obob3o11b2o$27bobo140b 3o3b3o13bobo6bobobobo117bo1775b2o11b3o94bobo5bo17b2ob2o13b2o$28b2o58b 2o82bobobo17bo6b2o3b2o89b2o24b3o1791bo14bo78b2o4b2ob4o$28bo58bo2bo82b 3o14b4ob2o2b2o9b2o86bo23bo1793b2o12b3o74b2o7bo3bo2bo$87bo2bo65b3o31bo 2bobobo2bo8bobo75bo10bobo21b2o1739b2o64bo77bobo6bobo5b2o$87b5o64bo2b2o 27b2o2b2obob2o11bo74b3o11b2o1762b2o64b2o77bo6b2o4b3o2bo$90b2ob2o14b2o 46b3o27bo2b2o2b2obo34b2o35bo14bo1900b2o26bo2bob2o4b2obo11bo$92bo16b2o 17b2o28bo15bo11bob2o2b2obobo11bo14b2o5bobo35b3o12b2o1899bobo5b2o18b2o 2bo3bobo3bo10bobo$128b2o43bobo10bo3b2o4bo12bo14b2o5bo40bo64b2o1789b2o 57bo5b2o23b3o3b3o11b2o$174b2o11b3obob3o33bobo39b2o64b2o1770b2o17b2o57b obo30bobobo17b2o$170b2o17bo3bo13bo3bo17b2o1878b2o77b2o17b2ob2o9b3o18bo bo$129b2o38bobo33b3obob3o11b2o1831b2o132b2o11b3obob3o8bo14b2o5bo$129bo 39bo5b2o14bo8b2o2bo4b2o3bo10bobo44b2o1784b2o131bobo10bo4bo4bo2b2o18b2o 5bobo$116b2o12b3o34bobo5b2o14bo8bo2bobob2o2b2obo11bo45b2o17b2o1899bo 11bob2o2b2obobo2bo26b2o$99b2o16bo14bo34b2o33b2ob2o2b2o2bo77b2o1912bo2b 2o3bob2o6bo$99bo14b3o73bo12bobob2o2b2o129b2o1862b2o2b2obobo6bobo$78b2o 20b3o11bo74bobo11bobobo2bo131b2o1734b2o32b2o78bo15bo4bobo7b2o$79bo22bo 86b2o13b2ob4o14b3o1850b2o11b2o20bo77b3o14b4ob2o4b2o$76b3o114b2o4b2o5bo 17bobobo13b2o1847bo19bo63b2o13bobobo17bo5bobo$76bo116bobo2bobo5bobo13b 3o3b3o11b2o1848b3o16b2o62b2o11b3o3b3o13bobo5bo5b2o$188b2o5bo2bo8b2o12b o4bo4bo56b2o32b2o1770bo20b2o70bo3bobo3bo12b2o5b2o5b2o79bo18bo$89bo18bo 79b2o5bob2o21bob2obo2b2obo23b2o31bo20b2o11b2o1792bo45b2o23bob2o4b2obo 106b3o6b2o6b3o$89b3o6b2o6b3o83b2obo24bobob4o2bo24bobo32bo19bo1802b3o 45bobo24bo2b3o4bo109bo5b2o5bo$92bo5b2o5bo86bo2bo23b2ob2o4b2o27bo31b2o 16b3o1803bo47bo27b2o5bob2o23bo83b2o12b2o$91b2o12b2o83bobo2b3o19bo2bobo bo2bo29b2o26b2o20bo1852b2o29bo2bo3bo2bo19b3o$190b2o6bo18b2o2b2ob4o3b2o 52bo1900b2o3b4ob2o2b2o18bo25b2o15b2o$149b2o15b2o29b2o24bo8bo19b2o32b3o 1876b2o19bo8bo24b2o24b2o15bobo42b2o$104b2o42bobo15b2o44b2o9bobo6bobo 17bo35bo1877bo11b2o4bobo6bobo9b2o58bo42b2o3b2o$99b2o3b2o42bo63bo11b2o 7b2o15bobo1913bobo7bo7b2o7b2o11bo58b2o46b2o$99b2o46b2o61bobo24b2o6bo4b 2o1854b2o59b2o4bo3bo3bo24bobo$199bo10b2o24bo2bo4bobo1860bo64bobo7bo24b 2o10bo$198bobo5b2o29b2o5bobo1860bobo15b2o45bobo5b2o29b2o5bobo74bo19b3o $198bobo4bo2bo24b2o10bo1862b2o15b2o46bo10b2o24bo2bo4bobo73b2o18bo$193b 2o4bo6b2o24bobo59b2o1888bobo24b2o6bo4b2o10b2o56bobo7bo9bo2bo$109bo82bo bo15b2o7b2o11bo61bo1891bo11b2o7b2o15bobo9bo22bo44b3o8b2o$107b3o44bo37b o17bobo6bobo9b2o42b2o15bobo1891b2o9bobo6bobo17bo7bobo20b3o47bo$106bo 47b3o34b2o19bo8bo24b2o27b2o15b2o1877b2o24bo8bo19b2o6b2o20bo49b2o$106b 2o49bo54b2o3b4ob2o2b2o18bo1900b2o5b2o16bo18b2o2b2ob4o3b2o49b2o20bo$ 135bo20b2o59bo2bobobo2bo19b3o1897b2o5bo14b3o19bo2bobo4bo58b2o16b3o$ 133b3o16b2o33b2o26b2o2b2obob2o23bo128bo1773bobo14bo23b2obob2o2b2o57bo 19bo$132bo19bo35bo25bo2b2o2b2obo125b2o24b3o1658bo114b2o40bobo3b2o2bo 54bo20b2o11b2o$119b2o11b2o20bo33bobo22bob2o2b2obobo21b2o5b2o96bo23bo 1661b3o24b2o82b2o44bobob2o2b2obo53b2o32b2o20b2o$119b2o32b2o34b2o22bo3b 2o4bo12b2o9bo5b2o85bo10bobo21b2o1663bo23bo83bobo30b2o12bo4bo4bo109b2o$ 201b2o11b3obob3o13bobo8bobo88b3o11b2o1685b2o21bobo10bo73bo30bobo13b3ob ob3o11b2o$201b2o13bo3bo17bo9b2o72bo14bo1724b2o11b3o11b2o35b2o52bo17b2o b2o13b2o$191b3o40b4ob2o2b2o7b2o68b3o12b2o1739bo10bobo34bobo5b2o38b2o2b 2ob4o129b2o$193bo24bo15bo2bobobo2bo6bobo71bo64b2o1685b2o12b3o34bo5b2o 38bo2bo3bo2bo128bo2bobobo$192bo25bo13b2o4b2ob2o9bo71b2o64b2o1632b2o64b o3bo33bobo45b2obo5b2o75b2o50b2o2bobo$150b2o79bo2b4obobo32b2o1748b2o64b 2o2bo34b2o17b2ob2o24bo4b3o2bo49b2o4b2o17b2o42b2o5bo5b3o$150b2o17b2o47b o11bob2o2bob2obo24b2o5bobo1819b2o36b2o11b3obob3o22bob2o4b2obo11bo37bo 4b2o61b2o6bo6b2o$169b2o46bobo10bo4bo4bo25b2o5bo51b2o1769bo35bobo10bo4b o4bo2b2o18bo3bobo3bo10bobo35bo76bo$218b2o11b3o3b3o31bobo51b2o17b2o 1743b2o4bo37bo11bob2o2b2obobo2bo19b3o3b3o11b2o36b2o75bo$214b2o17bobobo 11b5o17b2o71b2o1724b2o17b2o4b2o49bo2b2o3bob2o23bobobo17b2o34bo2b2o69bo b2o$170b2o41bobo18b3o10b3obob3o11b2o126b2o1673b2o75b2o2b2obobo25b3o18b obo33bo3bo68bo3b2o$170bo42bo5b2o21b2o2bo4bo4bo10bobo125b2o1622b2o112bo 15bo4bobo26bo14b2o5bo34b3o12b2o56bo2bobo$157b2o12b3o37bobo5b2o21bo2bob 2obo2b2obo11bo1750b2o111b3o14b4ob2o42b2o5bobo34bobo10bo16b2o40b2o2b2o$ 140b2o16bo14bo37b2o31b2obo3b2o2bo1860b2o13bobobo17bo52b2o35b2o11b3o14b o41b2ob2o$140bo14b3o76bo10bobo2bo2b2o1861b2o11b3o3b3o13bobo30bo73bo11b 3o20b2o21bobo$119b2o20b3o11bo77bobo9bobo4bo14b3o71b2o32b2o1751bo3bobo 3bo12b2o30bobo84bo22bo23bo$120bo22bo89b2o11b2ob4o88bo20b2o11b2o1662b2o 32b2o28b2o23bob2o4b2obo44b2o108b3o$117b3o117b2o9bo17bobobo13b2o57bo19b o1675b2o11b2o20bo27bobo24bo2b3o4bo40b2o114bo$117bo119bobo8bobo13b3obob 3o11b2o56b2o16b3o1689bo19bo29bo27b2o5bob2o23bo14bobo$232b2o5bo9b2o12bo 5bo3bo64b2o20bo1692b3o16b2o27b2o29bo2bo3bo2bo19b3o14bo5b2o$133bo18bo 79b2o5b2o21bobob2o2b2obo23b2o39bo1716bo20b2o49b2o3b4ob2o2b2o18bo16b2o 5b2o79bo18bo$133b3o6b2o6b3o109bob2o2b2o2bo24bobo39b3o1735bo28b2o19bo8b o24b2o103b3o6b2o6b3o$136bo5b2o5bo87bo23b2o4bo2b2o27bo41bo1732b3o30bo 17bobo6bobo9b2o121bo5b2o5bo$135b2o12b2o86b3o19bo2bobobo2bo29b2o1773bo 32bobo15b2o7b2o11bo120b2o12b2o$240bo18b2o2b2ob4o3b2o1833b2o4bo32bobo$ 193b2o15b2o27b2o24bo8bo19b2o1817bobo32b2o10bo46b2o15b2o$148b2o42bobo 15b2o42b2o9bobo6bobo17bo1818bobo36b2o5bobo45b2o15bobo42b2o$143b2o3b2o 42bo61bo11b2o7b2o15bobo1819bo10b2o24bo2bo4bobo64bo42b2o3b2o$143b2o46b 2o59bobo32bo4b2o53b2o1776bobo24b2o6bo4b2o10b2o22b2o23b2o46b2o$241bo10b 2o32bobo58bo1719b2o52b2o4bo11b2o7b2o15bobo9bo23bobo$240bobo5b2o36bobo 39b2o15bobo1720bo52bobo3b2o9bobo6bobo17bo7bobo23bo$240bobo4bo2bo24b2o 10bo40b2o15b2o1721bobo15b2o24b2o7bo16bo8bo19b2o6b2o$235b2o4bo6b2o24bob o1792b2o15b2o25bo18b2o2b2ob4o3b2o$153bo80bobo15b2o7b2o11bo1835b3o19bo 2bobo4bo122bo$151b3o44bo35bo17bobo6bobo9b2o1835bo23b2obob2o2b2o75bo44b 3o$150bo47b3o32b2o19bo8bo24b2o136bo1708bobo3b2o2bo72b3o47bo$150b2o49bo 52b2o3b4ob2o2b2o18bo10b2o5b2o90b2o24b3o1708bobob2o2b2obo70bo49b2o$179b o20b2o57bo4bobo2bo19b3o8bo5b2o91bo23bo1568bo115b2o5b2o5b2o12bo4bo4bo 70b2o20bo$177b3o16b2o31b2o26b2o2bo2bob2o23bo8bobo85bo10bobo21b2o1567b 3o113b2o5bo5bobo13b3obob3o11b2o62b2o16b3o$176bo19bo33bo25bo2b2o3bobo 34b2o83b3o11b2o1593bo22bo94bobo5bo17b2ob2o13b2o63bo19bo$163b2o11b2o20b o31bobo22bob2o2bob2obo38b2o63bo14bo1608b2o20b3o11bo82b2o4b2ob4o94bo20b 2o11b2o$163b2o32b2o32b2o22bo4bo4bo12b2o24bobo63b3o12b2o1628bo14b3o76b 2o7bo3bo2bo94b2o32b2o$243b2o11b3obob3o13bobo24bo67bo64b2o1575b2o16bo 14bo60bobo6bobo5b2o$243b2o13b5o17bo46b2o43b2o64b2o1592b2o12b3o61bo6b2o 4b3o2bo$276b4ob2o2b2o32b2o5bobo1650b2o64bo41b2o26bo2bob2o4b2obo11bo$ 276bo2bobobo2bo32b2o5bo1652b2o64b2o40bobo5b2o18b2o2bo3bobo3bo10bobo$ 274b2o2bo4b2o39bobo46b2o1714bo5b2o23b3o3b3o11b2o72bo$194b2o77bo2b2o2b 2obo18b2ob2o17b2o47b2o17b2o1610bobo2b2o78bobo18b3o9bobobo17b2o73bo3b2o $194b2o17b2o45bo11bob2o2b2obobo16b3obob3o11b2o70b2o1610bo2b2o35b2o44b 2o17bobobo9b3o18bobo57b2o7b2o4b2o2b2o$213b2o44bobo2b2o6bo3bo5bo12b2o2b o4bo4bo10bobo120b2o1559bo2b2o2bo13b2o17b2o48b2o11b3o3b3o8bo14b2o5bo57b 2o14b2o$260b2o2bobo6b3obob3o13bo2bobob2o2b2obo11bo121b2o1560b2o2bobo 13b2o66bobo10bo4bo4bo2b2o18b2o5bobo48b2o14b2o5bo$256b2o6bo10bobobo17b 2obo3b2o2bo1665b2o118bo11bob2o2bob2obo2bo26b2o48bo21bo$214b2o39bobo40b obob2o2b2o1666b2o131bo2b4obob2o6bo72b3o2b2o7bo$214bo40bo5b2o13b3o19bob o4bo15bo1772bo13b2o4b2obo6bobo73bo3bo7b2o$201b2o12b3o35bobo5b2o36b2ob 4o14b3o66b2o32b2o1669bo15bo2bobobo7b2o74b3o12b2o$184b2o16bo14bo35b2o 46bo17bobobo13b2o50bo20b2o11b2o1645bo39b4ob2o4b2o80bobo10bo16b2o$184bo 14b3o74bo24bobo13b3o3b3o11b2o52bo19bo1582b2o32b2o38bobo6b2o13bo3bo17bo 5bobo81b2o11b3o14bo$163b2o20b3o11bo75bobo24b2o12bo3bobo3bo63b2o16b3o 1583b2o11b2o20bo39b2o6b2o11b3obob3o13bobo5bo5b2o91bo11b3o20b2o$164bo 22bo87b2o38bob2o4b2obo23b2o34b2o20bo1598bo19bo61bo3b2o4bo12b2o5b2o5b2o 79bo18bo4bo22bo$161b3o115b2o34bo4b3o2bo24bobo33bo1621b3o16b2o35b2o23bo b2o2b2obobo106b3o6b2o6b3o28b3o$161bo117bobo8bo23b2obo5b2o27bo34b3o 1620bo20b2o30bobo24bo2b2o2b2obo109bo5b2o5bo33bo$274b2o5bo8b3o19bo2bo3b o2bo29b2o35bo1642bo30bo27b2o2b2obob2o23bo83b2o12b2o$175bo18bo79b2o5b2o 10bo18b2o2b2ob4o3b2o1701b3o30b2o29bo2bobobo2bo19b3o$175b3o6b2o6b3o97b 2o24bo8bo19b2o1680bo58b2o3b4ob2o2b2o18bo25b2o15b2o$178bo5b2o5bo115b2o 9bobo6bobo17bo1719b2o19bo8bo24b2o24b2o15bobo42b2o$177b2o12b2o114bo11b 2o7b2o15bobo1720bo17bobo6bobo9b2o58bo42b2o3b2o$305bobo32bo4b2o1721bobo 15b2o7b2o11bo58b2o46b2o$235b2o15b2o40bo10b2o32bobo53b2o1672b2o4bo6b2o 24bobo$190b2o42bobo15b2o39bobo5b2o36bobo53bo1678bobo4bo2bo24b2o10bo$ 185b2o3b2o42bo58bobo4bo2bo24b2o10bo35b2o15bobo1626b2o50bobo5b2o29b2o5b obo$185b2o46b2o53b2o4bo6b2o24bobo46b2o15b2o1628bo51bo10b2o24bo2bo4bobo $287bobo15b2o7b2o11bo1695bobo15b2o43bobo24b2o6bo4b2o10b2o66bo$287bo17b obo6bobo9b2o1696b2o15b2o45bo11b2o7b2o15bobo9bo22bo44b3o$286b2o19bo8bo 24b2o1726bo18b2o9bobo6bobo17bo7bobo20b3o47bo$307b2o3b4ob2o2b2o18bo 1726bobo2b2o24bo8bo19b2o5b3o20bo49b2o$195bo116bo4bobo2bo19b3o2b2o5b2o 1711bo2bo3bo18b2o2b2ob4o3b2o24b3o22b2o20bo$193b3o44bo41b2o26b2o2b2obob 2o23bo3bo5b2o54bo1657b2ob3o19bo2bobobo2bo30b2o26b2o16b3o$192bo47b3o40b o25bo2b2o3bobo28bobo58bo57bo1595b2o5bo24b2ob2o4b2o27bo29bo19bo$192b2o 49bo39bobo22bob2o2b2obobo29b2o58b3o27b2o24b3o1595b2o5bob2o22bobob4o2bo 54bo20b2o11b2o8bo$221bo20b2o40b2o22bo4bo4bo12b2o20b2o85bo23bo1603bobob 2o22bob2obo2b2obo53b2o32b2o7b2o$219b3o16b2o56b2o11b3obob3o13bobo18bobo 74bo10bobo21b2o1487bo114b2o13b2o12bo4bo4bo96b3o$218bo19bo57b2o13b2ob2o 17bo19bo73b3o11b2o1510b3o108b2o16bobo13b3o3b3o11b2o86bo2bobo$205b2o11b 2o20bo80b3o5b4ob2o2b2o35b2o34bo14bo1529bo22bo84bobo15bo17bobobo13b2o 86b2obobo$205b2o32b2o82bo5bo2bo3bo2bo27b2o5bobo34b3o12b2o1527b2o20b3o 11bo67bo5bo10b2o2b2ob4o14b3o105b3o$213b3o106bo4b2o5bob2o29b2o5bo39bo 20bo43b2o1495bo14b3o11b2o35b2o13b2o17bo2bobobo2bo$216b2o108bo2b3o4bo 14b3o18bobo38b2o18bo3bo41b2o1495b2o16bo10bobo34bobo5b2o6b2o18b2obob2o 2b2o75b2o$211b2obob2o95bo11bob2o4b2obo13bobobo17b2o58bo1560b2o12b3o34b o5b2o14bo12bob2o2b2o2bo49b2o4b2o17b2o$166bobo42bo2b4o94bobo10bo3bobo3b o12b3o3b3o11b2o61b2o5b2o1500b2o64bo3bo33bobo18b3o11bobob2o2b2obo11bo 37bo4b2o$167b2o42bo4bo96b2o11b3o3b3o8b2o2bo4bo4bo10bobo43b2o14bo8bo 1500b2o64b2o2bo34b2o17bobobo11bo4b2o3bo10bobo35bo$167bo44b4o20b2o71b2o 17bobobo10bo2bob2obo2b2obo11bo44b2o16bobo4bo1571b2o36b2o11b3o3b3o10b3o bob3o11b2o36b2o$214b2o3bobo14b2o17b2o51bobo18b3o13b2obob4o2bo72bo2bo3b 3o1573bo35bobo10bo3bobo3bo2b2o7bo3bo17b2o34bo2b2o$220b2o33b2o51bo5b2o 14bo15bob2o4b2o13bo59b2o2bo50b2o1519b2o4bo37bo11bob2o4b2obo2bo29bobo 33bo3bo$220bo85bobo5b2o30bobobo2bo15bo61b3o50b2o1500b2o17b2o4b2o49bo2b 3o4b2o11bo14b2o5bo34b3o12b2o$306b2o39b2ob4o78bo1553b2o75b2o5bobo12bo 14b2o5bobo34bobo10bo16b2o$256b2o71bo19bo17bo3bo13b2o1548b2o128bo2bo3bo 35b2o35b2o11b3o14bo$256bo71bobo18bobo13b3obob3o11b2o1548b2o128b4ob2o 14bo73bo11b3o20b2o$243b2o12b3o68b2o20b2o12bo4b2o3bo55b2o32b2o1566b2o 13b2ob2o17bo15bobo84bo22bo$226b2o16bo14bo72b2o29bobob2o2b2obo23b2o30bo 20b2o11b2o1566b2o11b3obob3o13bobo16b2o108b3o$226bo3bo10b3o88bobo28bob 2o2b2o2bo24bobo31bo19bo1591bo4bo4bo12b2o13b2o114bo$205b2o20b4o10bo85b 2o5bo3bo23b2obob2o2b2o27bo30b2o16b3o1503b2o32b2o28b2o23bob2o2b2obobo 22b2obobo$206bo40bo79b2o5b2o2b3o19bo2bobobo2bo29b2o25b2o20bo1505b2o11b 2o20bo27bobo24bo2b2o3bobo22b2obo5b2o$203b3o21b4o6b2o6b3o93bo18b2o2b2ob 4o3b2o51bo1540bo19bo29bo27b2o2b2obob2o24bo5b2o79bo18bo$203bo23bo3bo5b 2o5bo95b2o24bo8bo19b2o31b3o1538b3o16b2o27b2o29bo4bobo2bo19b3ob2o84b3o 6b2o6b3o$230b2o12b2o109b2o9bobo6bobo17bo34bo1540bo20b2o49b2o3b4ob2o2b 2o18bo3bo2bo86bo5b2o5bo$355bo11b2o7b2o15bobo1597bo28b2o19bo8bo24b2o2bo bo86b2o12b2o$288b2o15b2o46bobo24b2o6bo4b2o1595b3o30bo17bobo6bobo9b2o 18bo$243b2o42bobo15b2o35bo10b2o24bo2bo4bobo1600bo32bobo15b2o7b2o11bo 45b2o15b2o$238b2o3b2o42bo53bobo5b2o29b2o5bobo1634b2o4bo6b2o24bobo43b2o 15bobo42b2o$238b2o46b2o53bobo4bo2bo24b2o10bo1640bobo4bo2bo24b2o10bo51b o42b2o3b2o$336b2o4bo6b2o24bobo58b2o1591bobo5b2o36bobo50b2o46b2o$189bo 145bobo15b2o7b2o11bo60bo1593bo10b2o32bobo$187bobo145bo17bobo6bobo9b2o 41b2o15bobo1604bobo32bo4b2o10b2o$188b2o144b2o19bo8bo24b2o26b2o15b2o 1547b2o58bo11b2o7b2o15bobo9bo$248bo106b2o3b4ob2o2b2o18bo1594bo58b2o9bo bo6bobo17bo7bobo$246b3o44bo66bo2bobobo2bo19b3o11bo1579bobo15b2o24b2o 24bo8bo19b2o6b2o74bo$245bo47b3o34b2o26b2o4b2ob2o23bo10bo1581b2o15b2o 25bo18b2o2b2ob4o3b2o46bo2bo8bo44b3o$245b2o49bo34bo25bo2b4obobo35b3o 117bo1502b3o19bo2bo3bo2bo49b4o8b3o47bo$274bo20b2o34bobo22bob2o2bob2obo 20b2o5b2o98b2o24b3o1502bo23b2obo5b2o53bo4bo49b2o$272b3o16b2o39b2o22bo 4bo4bo12b2o8bo5b2o99bo23bo1530bo4b3o2bo46b2o2b2o5b2o20bo$271bo19bo52b 2o11b3o3b3o13bobo7bobo93bo10bobo21b2o1529bob2o4b2obo60b2o16b3o$258bobo 10b2o20bo50b2o13bobobo17bo8b2o91b3o11b2o1525b2o5b2o5b2o12bo3bobo3bo49b 2o10bo19bo$257bo2bo31b2o66b3o14b4ob2o2b2o6b2o71bo14bo1428bo112b2o5bo5b obo13b3o3b3o11b2o38b2o7bo20b2o11b2o$257bo2bo116bo2bobobo2bo5bobo71b3o 12b2o1427b3o115bobo5bo17bobobo13b2o34bo2b2o8b2o32b2o$258b2o115b2o2b2ob ob2o8bo75bo64b2o1377bo22bo91b2o4b2ob4o14b3o$374bo2b2o2b2obo31b2o51b2o 64b2o1376b2o20b3o11bo46b3o26b2o7bobo4bo15bo$203bobo155bo11bob2o2b2obob o23b2o5bobo1516bo14b3o46bo26bobo6bobob2o2b2o$204b2o154bobo10bo3b2o4bo 9bo14b2o5bo1518b2o16bo14bo28b3o27bo6b2obo3b2o2bo$204bo57bo26b2o70b2o 11b3obob3o9b3o18bobo54b2o1479b2o12b3o35b2o26bo2bobob2o2b2obo11bo$260bo b3o24b2o17b2o47b2o17bo3bo10bobobo17b2o55b2o17b2o1407b2o64bo32bo5bobo5b 2o18b2o2bo4bo4bo10bobo66b2o$258b4o2bo43b2o36bo9bobo30b3o3b3o11b2o78b2o 1407b2o64b2o29b3o7bo5b2o23b3obob3o11b2o48b2o17b2o$258bo2b3o81b2o9bo5b 2o14bo5b2o2bo3bobo3bo10bobo128b2o1451b3o9bobo30b2ob2o17b2o44b2o$258b2o 3bo81bobo6bobo5b2o14bo5bo2bob2o4b2obo11bo129b2o1452b2o10b2o17b5o30bobo $260b3o46b2o43b2o30b2o4b3o2bo1565b2o45b2o11b3obob3o23b2o5bo$260b3o46bo 67bo9bobo5b2o1547b2o17b2o44bobo10bo4bo4bo2b2o18b2o5bobo40b2o$296b2o12b 3o35b4o24bobo8bo3bo2bo1549b2o64bo11bob2o2bob2obo2bo26b2o41bo$279b2o16b o14bo34b3o2bo23b2o10b2ob4o91b2o32b2o1371b2o128bo2b2o3bob2o6bo61b3o12b 2o$279bo14b3o50bo3bo28b2o8bo17b2ob2o13b2o58bo20b2o11b2o1371b2o129b2o2b o2bobo6bobo60bo14bo16b2o$258b2o20b3o11bo53bo2bo28bobo7bobo13b3obob3o 11b2o60bo19bo1500b3o14bo4bobo7b2o76b3o14bo$259bo22bo65b3o24b2o5bo8b2o 12bo4bo4bo71b2o16b3o1518b4ob2o4b2o82bo11b3o20b2o$209bo46b3o17bo18bo79b 2o5b2o20bobob2o2b2obo23b2o42b2o20bo1487b2o13bobobo17bo5bobo94bo22bo$ 210b2o44bo19b3o6b2o6b3o108bobo3b2o2bo24bobo32bo8bo1429b2o32b2o44b2o11b 3obob3o13bobo5bo5b2o113b3o$209b2o68bo5b2o5bo86bo23b2obob2o2b2o27bo31b 3o8b3o1426b2o11b2o20bo56bo3bo5bo12b2o5b2o5b2o79bo18bo16bo$278b2o12b2o 85b3o19bo2bobo4bo29b2o30bo2bo9bo1439bo19bo33b2o23bob2o2b2obobo106b3o6b 2o6b3o$382bo18b2o2b2ob4o3b2o58b2o1450b3o16b2o31bobo24bo2b2o2b2obo109bo 5b2o5bo$336b2o15b2o26b2o24bo8bo19b2o37bo1453bo20b2o27bo27b2o2bo4b2o23b o83b2o12b2o$291b2o42bobo15b2o41b2o9bobo6bobo17bo35b2o1477bo26b2o29bo2b obobo2bo19b3o$286b2o3b2o42bo60bo11b2o7b2o15bobo35b4o1472b3o53b2o3b4ob 2o2b2o18bo25b2o15b2o$286b2o46b2o58bobo24b2o6bo4b2o37bo2bo1471bo34b2o 19bo8bo24b2o24b2o15bobo42b2o$383bo10b2o24bo2bo4bobo43bo17b2o1490bo17bo bo6bobo9b2o58bo42b2o3b2o$382bobo36b2o5bobo61bo1491bobo15b2o7b2o11bo58b 2o46b2o$382bobo32b2o10bo43bobo14bobo1492b2o4bo6b2o24bobo$377b2o4bo32bo bo54b2o15b2o1498bobo4bo2bo24b2o10bo$296bo79bobo15b2o7b2o11bo1573bobo5b 2o29b2o5bobo$294b3o44bo34bo17bobo6bobo9b2o69bo1454b2o48bo10b2o24bo2bo 4bobo$293bo47b3o31b2o19bo8bo24b2o54bo1455bo59bobo24b2o6bo4b2o10b2o66bo $293b2o49bo51b2o3b4ob2o2b2o18bo142bo1368bobo15b2o42bo11b2o7b2o15bobo9b o22bo44b3o$322bo20b2o56bo2bo3bo2bo19b3o10b2o5b2o92b2o24b3o1369b2o15b2o 42b2o9bobo6bobo17bo7bobo20b3o47bo$320b3o16b2o30b2o26b2o5bob2o23bo11bo 5b2o93bo23bo1412bob2o2b2o24bo8bo19b2o6b2o20bo49b2o$319bo19bo32bo25bo2b 3o4bo36bobo87bo10bobo21b2o1411b2obo3bo18b2o2b2ob4o3b2o49b2o20bo$306b2o 11b2o20bo30bobo22bob2o4b2obo37b2o85b3o11b2o1438b3o19bo2bobo4bo58b2o16b 3o$306b2o32b2o31b2o22bo3bobo3bo12b2o28b2o65bo14bo1478b2obo2bo2b2o57bo 19bo$385b2o11b3o3b3o13bobo26bobo65b3o12b2o1448b2o5b3o20bobo3b2o2bo54bo 20b2o11b2o$385b2o13bobobo17bo27bo69bo64b2o1395b2o5bo2bob2o16bob2obo2b 2obo53b2o32b2o$401b3o14b4ob2o2b2o43b2o45b2o64b2o1400bobo2b2obo3b2o12bo 4bo4bo$402bo15bo4bobo2bo35b2o5bobo1398bo114b2o9bobo13b3obob3o11b2o$ 416b2o2b2obob2o37b2o5bo1400b3o108b2o13bo17b5o13b2o$337b2o76bo2b2o3bobo 22b3o18bobo48b2o1353bo22bo84bobo6b2o2b2ob4o$337b2o17b2o44bo11bob2o2b2o bobo21bobobo17b2o49b2o17b2o1333b2o20b3o11bo73bo7bo2bobobo2bo$356b2o43b obo10bo4bo4bo20b3o3b3o11b2o72b2o1354bo14b3o11b2o35b2o31b2o4bo2b2o75b2o $402b2o11b3obob3o16b2o2bo4bo4bo10bobo122b2o1303b2o16bo10bobo34bobo5b2o 24bob2o2b2o2bo49b2o4b2o17b2o$398b2o17b2ob2o18bo2bob2obo2b2obo11bo123b 2o1320b2o12b3o34bo5b2o14bo9bobob2o2b2obo11bo37bo4b2o$357b2o38bobo42b2o bob4o2bo1405b2o64bo3bo33bobo18b3o9bo5bo3bo10bobo35bo$357bo39bo5b2o38bo b2o4b2o13bo1392b2o64b2o2bo34b2o17bobobo9b3obob3o11b2o36b2o$344b2o12b3o 34bobo5b2o38bobobo2bo15bo1463b2o36b2o11b3o3b3o9bobobo17b2o34bo2b2o$ 327b2o16bo14bo34b2o47b2ob4o85b2o32b2o1359bo35bobo10bo3bobo3bo2b2o26bob o33bo3bo$327bo14b3o73bo27bo17bo3bo13b2o9bo42bo20b2o11b2o1286bo65b2o4bo 37bo11bob2o4b2obo2bo5b3o13b2o5bo34b3o12b2o$306b2o20b3o11bo74bobo26bobo 13b3obob3o11b2o7bobo44bo19bo1299b2o45b2o17b2o4b2o49bo2b3o4b2o23b2o5bob o34bobo10bo16b2o$307bo22bo86b2o28b2o12bo4b2o3bo20b2o43b2o16b3o1302b2o 43b2o75b2o5bobo32b2o35b2o11b3o14bo$304b3o114b2o37bobob2o2b2obo23b2o36b 2o20bo1298b2o3b3o122bo2bo3bo10bo73bo11b3o20b2o$304bo116bobo36bob2o2b2o 2bo24bobo35bo1320b2o4b2o122b4ob2o10bobo84bo22bo$416b2o5bo11bo23b2obob 2o2b2o27bo36b3o1322b2o90b2o13b2ob2o17bo13b2o108b3o$317bo18bo79b2o5b2o 10b3o19bo2bobobo2bo29b2o37bo1322bo91b2o11b3obob3o13bobo9b2o114bo$317b 3o6b2o6b3o101bo18b2o2b2ob4o3b2o1386bo3bobo97bo4bo4bo12b2o3bob2o2bobo$ 320bo5b2o5bo103b2o24bo8bo19b2o1370b2o8b2o32b2o28b2o23bob2o2b2obobo16b 2obo2bo5b2o56b2o$319b2o12b2o117b2o9bobo6bobo17bo1371bo9b2o11b2o20bo27b obo24bo2b2o3bobo20b3o5b2o56bobo20bo18bo$452bo11b2o7b2o15bobo1394bo19bo 29bo27b2o2b2obob2o85bo22b3o6b2o6b3o$377b2o15b2o54bobo24b2o6bo4b2o1396b 3o16b2o27b2o29bo4bobo2bo19b3o87bo5b2o5bo$332b2o42bobo15b2o43bo10b2o24b o2bo4bobo55b2o1346bo20b2o49b2o3b4ob2o2b2o18bo3bob2o82b2o12b2o$327b2o3b 2o42bo61bobo5b2o29b2o5bobo55bo1369bo28b2o9bo9bo8bo24b2o2b2obo$327b2o 46b2o61bobo4bo2bo24b2o10bo37b2o15bobo1366b3o30bo10b2o5bobo6bobo9b2o42b 2o15b2o52bo51bo$433b2o4bo6b2o24bobo48b2o15b2o1367bo32bobo7b2o6b2o7b2o 11bo42b2o15bobo42b2o4bo3bo3bo46bobo$432bobo15b2o7b2o11bo1470b2o4bo6b2o 24bobo59bo42b2o3bo2bobo3b2o45b2o$432bo17bobo6bobo9b2o1475bobo4bo2bo24b 2o10bo48b2o46b2o2b3o2b2o$431b2o19bo8bo24b2o1460bobo5b2o29b2o5bobo100b 2o$337bo114b2o3b4ob2o2b2o18bo1462bo10b2o24bo2bo4bobo$335b3o44bo74bo2bo bobo2bo19b3o4b2o5b2o1457bobo24b2o6bo4b2o10b2o124bo$334bo47b3o42b2o26b 2o4b2ob2o23bo5bo5b2o1399b2o58bo11b2o7b2o15bobo9bo124bo$334b2o49bo42bo 25bo2b4obobo30bobo116bo1288bo58b2o9bobo6bobo17bo7bobo70bo53b3o$363bo 20b2o42bobo22bob2o2bob2obo31b2o88b2o24b3o1288bobo15b2o24b2o24bo8bo19b 2o6b2o26bo44b3o$361b3o16b2o47b2o22bo4bo4bo12b2o22b2o85bo23bo1292b2o15b 2o25bo18b2o2b2ob4o3b2o53b3o47bo$360bo19bo60b2o11b3o3b3o13bobo20bobo74b o10bobo21b2o1332b3o19bo2bo3bo2bo57bo49b2o$347b2o11b2o20bo58b2o13bobobo 17bo21bo73b3o11b2o1355bo23b2obo5b2o55b2o20bo$347b2o32b2o74b3o14b4ob2o 2b2o37b2o34bo14bo1396bo4b3o2bo58b2o16b3o$474bo2bobobo2bo29b2o5bobo34b 3o12b2o1395bob2o4b2obo58bo19bo28b2o$472b2o2b2obob2o31b2o5bo39bo64b2o 1315b2o5b2o5b2o12bo3bobo3bo56bo20b2o11b2o15b2o$428bo42bo2b2o2b2obo16b 3o18bobo38b2o64b2o1315b2o5bo5bobo13b3o3b3o11b2o44b2o32b2o$428b2o28bo 11bob2o2b2obobo15bobobo17b2o1309bo117bobo5bo17bobobo13b2o$427bobo27bob o10bo3b2o4bo14b3o3b3o11b2o1313b3o115b2o4b2ob4o14b3o$378b2o78b2o11b3obo b3o10b2o2bo4bo4bo10bobo43b2o1270bo22bo87b2o7bobo4bo15bo$378b2o17b2o55b 2o17bo3bo12bo2bob2obo2b2obo11bo44b2o17b2o1250b2o20b3o11bo75bobo6bobob 2o2b2o$397b2o54bobo36b2obob4o2bo76b2o1271bo14b3o74bo6b2obo3b2o2bo129bo $453bo5b2o14bo17bob2o4b2o13bo114b2o1220b2o16bo14bo35b2o26bo2bobob2o2b 2obo11bo64b2o49b3o6bo$451bobo5b2o14bo17bobobo2bo15bo114b2o1237b2o12b3o 35bobo5b2o18b2o2bo4bo4bo10bobo44b2o17b2o42b2o5bob2o4bobo$398b2o51b2o 41b2ob4o1316b2o64bo40bo5b2o14bo8b3obob3o11b2o45b2o61b2o7b2o3bobo$398bo 75bo21bo17bo3bo13b2o1283b2o64b2o39bobo18b3o9b2ob2o17b2o109b2o3b2o2b2o$ 385b2o12b3o71bobo20bobo13b3obob3o11b2o1391b2o17bobobo30bobo107b2ob4o$ 368b2o16bo14bo71b2o22b2o12bo4b2o3bo55b2o32b2o1316b2o11b3o3b3o23b2o5bo 39b2o66b2o4bo$368bo14b3o91b2o31bobob2o2b2obo23b2o30bo20b2o11b2o1269b2o 44bobo10bo3bobo3bo2b2o18b2o5bobo38bo66b2o3bo$347b2o20b3o11bo93bobo30bo b2o2b2o2bo24bobo31bo19bo1263b2o17b2o45bo11bob2o4b2obo2bo26b2o35b3o12b 2o58bo$348bo22bo4b2o94b2o5bo5bo23b2obob2o2b2o27bo30b2o16b3o1264b2o77bo 2b3o4b2o6bo58bo14bo16b2o38b2o2bo$345b3o27bobo14bo79b2o5b2o4b3o19bo2bob obo2bo29b2o25b2o20bo1215b2o129b2o5bobo6bobo73b3o14bo39bo2bobo$345bo27b 3o6b2o6b3o95bo18b2o2b2ob4o3b2o51bo1237b2o131bo2bo3bo7b2o75bo11b3o20b2o 18bo3b2o$369b2obo3bo5b2o5bo97b2o24bo8bo19b2o31b3o1367b4ob2o4b2o91bo22b o20b3o$369bob2o2b2o12b2o111b2o9bobo6bobo17bo34bo1334b2o13b2ob2o17bo5bo bo115b3o16bo$502bo11b2o7b2o15bobo1369b2o11b3obob3o13bobo5bo5b2o112bo 17b2o$433b2o15b2o48bobo32bo4b2o1290b2o32b2o56bo4bo4bo12b2o5b2o5b2o79bo 18bo$388b2o42bobo15b2o37bo10b2o32bobo1295b2o11b2o20bo31b2o23bob2o2b2ob obo106b3o6b2o6b3o32b2o$383b2o3b2o42bo55bobo5b2o36bobo1308bo19bo32bobo 24bo2b2o3bobo109bo5b2o5bo36bo$383b2o46b2o55bobo4bo2bo24b2o10bo73bo 1236b3o16b2o31bo27b2o2b2obob2o23bo83b2o12b2o$483b2o4bo6b2o24bobo58b2o 22b2o1239bo20b2o26b2o29bo4bobo2bo19b3o$482bobo15b2o7b2o11bo60bo24b2o 1260bo52b2o3b4ob2o2b2o18bo25b2o15b2o$482bo17bobo6bobo9b2o41b2o15bobo 1283b3o32b2o19bo8bo24b2o24b2o15bobo42b2o$481b2o19bo8bo24b2o26b2o15b2o 1284bo35bo17bobo6bobo9b2o58bo42b2o3b2o$393bo108b2o3b4ob2o2b2o18bo1366b obo15b2o7b2o11bo58b2o46b2o35bo$391b3o44bo68bo2bobobo2bo19b3o1364b2o4bo 6b2o24bobo6bo25b2o105b2o$390bo47b3o36b2o26b2o4b2ob2o23bo1369bobo4bo2bo 24b2o4bobo3bo20b2o107b2o$390b2o49bo36bo25bo2b4obobo146bo1247bobo5b2o 32b2o2bobo21bo99bobo$419bo20b2o36bobo22bob2o2bob2obo20b2o5b2o89b2o24b 3o1248bo10b2o32bobo121b2o$417b3o16b2o41b2o22bo4bo4bo12b2o8bo5b2o90bo 23bo1201b2o59bobo32bo4b2o10b2o66bo38bo$416bo19bo54b2o11b3o3b3o13bobo7b obo84bo10bobo21b2o1201bo61bo11b2o7b2o15bobo9bo22bo44b3o$403b2o11b2o20b o52b2o13bobobo17bo8b2o82b3o11b2o1224bobo15b2o42b2o9bobo6bobo17bo7bobo 20b3o47bo$403b2o32b2o68b3o14b4ob2o2b2o6b2o62bo14bo1241b2o15b2o27b2o24b o8bo19b2o6b2o20bo49b2o$524bo2bobobo2bo5bobo62b3o12b2o1287bo18b2o2b2ob 4o3b2o49b2o20bo$522b2o2b2obob2o8bo66bo64b2o1231b3o19bo2bo3bo2bo58b2o 16b3o$521bo2b2o2b2obo31b2o42b2o64b2o1094bo136bo23b2obo5b2o57bo19bo$ 508bo11bob2o2b2obobo23b2o5bobo1204b3o159bo4b3o2bo54bo20b2o11b2o$507bob o10bo3b2o4bo9bo14b2o5bo1209bo22bo105b2o5b2o21bob2o4b2obo53b2o32b2o$ 434b2o72b2o4bo6b3obob3o9b3o18bobo45b2o1161b2o20b3o11bo93b2o5bo9b2o12bo 3bobo3bo$434b2o17b2o49b2o7b2o8bo3bo10bobobo17b2o46b2o17b2o1163bo14b3o 96bobo8bobo13b3o3b3o11b2o$453b2o48bobo7bobo20b3o3b3o11b2o69b2o1163b2o 16bo14bo45bobo32b2o9bo17bobobo13b2o$503bo5b2o14bo5b2o2bo3bobo3bo10bobo 119b2o1129b2o12b3o43bo4bo27b2o7b2o2b2ob4o14b3o$501bobo5b2o14bo5bo2bob 2o4b2obo11bo120b2o1076b2o64bo46bo4bo27bobo6bo2bobo4bo15bo53b2o$332bo 121b2o45b2o30b2o4b3o2bo1211b2o64b2o49b2o28bo9b2obob2o2b2o65b2o2b2o4b2o $333b2o119bo69bo9bobo5b2o1336b2o32bobo3b2o2bo49b2o4b2o6bo6bo3b2o$332b 2o107b2o12b3o65bobo8bo3bo2bo1327b2o2b2o5bobo5b2o14bo9bobob2o2b2obo11bo 37bo4b2o8b3o2bo$424b2o16bo14bo65b2o10b2ob4o82b2o32b2o1161b2o46b2o2b2o 7bo5b2o14bo10bo4bo4bo10bobo35bo12bo2bo2b3o$424bo14b3o85b2o8bo17b2ob2o 13b2o49bo20b2o11b2o1142b2o17b2o47bob3o7bobo31b3obob3o11b2o36b2o$403b2o 20b3o11bo87bobo7bobo13b3obob3o11b2o51bo19bo1155b2o69bo9b2o17bo3bo11b2o b2o17b2o34bo2b2o7bobo$404bo22bo94b2o5bo8b2o12bo4bo4bo62b2o16b3o1105b2o 119bo14b2o11b3obob3o31bobo33bo3bo7b2o$401b3o19bo18bo79b2o5b2o20bobob2o 2b2obo23b2o33b2o20bo1107b2o133bobo10bo3b2o4bo2b2o21b2o5bo34b3o12b2o$ 401bo21b3o6b2o6b3o108bobo3b2o2bo24bobo32bo1265bo11bob2o2b2obobo2bo21b 2o5bobo34bobo10bo16b2o49bo$426bo5b2o5bo86bo23b2obob2o2b2o27bo33b3o 1136bo138bo2b2o2b2ob2o31b2o35b2o11b3o14bo49bobo$425b2o12b2o85b3o19bo2b obo4bo29b2o34bo1134bobo139b2o2b2obobo10bo73bo11b3o20b2o28b2o$529bo18b 2o2b2ob4o3b2o1195b3o9b2o32b2o96bo2bobobo9bobo84bo22bo$483b2o15b2o26b2o 24bo8bo19b2o1174bo11b2o11b2o20bo79b3o14b4ob2o11b2o108b3o18bo$438b2o42b obo15b2o41b2o9bobo6bobo17bo1200bo19bo65b2o13bobobo17bo9b2o114bo17bo$ 433b2o3b2o42bo60bo11b2o7b2o15bobo28bo1172b3o16b2o64b2o11b3o3b3o13bobo 8bobo132b3o$369bobo61b2o46b2o58bobo24b2o6bo4b2o28b3o1173bo20b2o72bo4bo 4bo12b2o9bo5b2o$348bo21b2o158bo10b2o24bo2bo4bobo32b2o2bo15b2o1177bo47b 2o23bob2o2bob2obo21b2o5b2o79bo18bo$349b2o19bo158bobo5b2o29b2o5bobo52bo 1175b3o47bobo24bo2b4obobo109b3o6b2o6b3o$348b2o179bobo4bo2bo24b2o10bo 38bo11b2obo1175bo49bo27b2o4b2ob2o23bo87bo5b2o5bo$524b2o4bo6b2o24bobo 17b2o36b2o2bo3bo1225b2o29bo2bobobo2bo19b3o86b2o12b2o$443bo79bobo15b2o 7b2o11bo20bo30b2ob2o1261b2o3b4ob2o2b2o18bo$441b3o44bo34bo17bobo6bobo9b 2o17b3o38bobo2bo1232b2o19bo8bo24b2o27b2o15b2o$440bo47b3o31b2o19bo8bo 24b2o2bo34bo3bo4b2o1234bo17bobo6bobo9b2o42b2o15bobo42b2o$440b2o49bo51b 2o3b4ob2o2b2o18bo1283bobo15b2o7b2o11bo61bo42b2o3b2o$469bo20b2o56bo2bo 3bo2bo19b6o5b2o29bo1178b2o61b2o4bo6b2o24bobo59b2o46b2o$467b3o16b2o30b 2o26b2o5bob2o26bo5b2o30bo1178bo66bobo4bo2bo24b2o10bo$466bo19bo32bo25bo 2b3o4bo24bo2bobo35bo81bo1096bobo15b2o47bobo5b2o29b2o5bobo$453b2o11b2o 20bo30bobo9bobo10bob2o4b2obo22b3o3b2o89b2o24b3o1097b2o15b2o48bo10b2o 24bo2bo4bobo$453b2o32b2o31b2o10bo11bo3bobo3bo12b2o8bo10b2o86bo23bo 1178bobo24b2o6bo4b2o10b2o$386bo158b3o3b3o13bobo7b2o8bobo75bo10bobo21b 2o1179bo11b2o7b2o15bobo9bo70bo$387bo75b2o82bobobo17bo18bo74b3o11b2o 1202b2o9bobo6bobo17bo7bobo25bo44b3o$385b3o16bo57bo2bo66bo15b3o14b4ob2o 2b2o34b2o35bo14bo1203b2o24bo8bo19b2o6b2o24b3o47bo$402bobo56b2o68b4o14b o15bo4bobo2bo26b2o5bobo35b3o12b2o1176b2o5b2o18bo18b2o2b2ob4o3b2o52bo 49b2o$403b2o57b2o3bo63bo3bo27b2o2b2obob2o28b2o5bo40bo64b2o1123b2o5bo 16b3o19bo2bobobo2bo57b2o20bo$463bo4bo15b2o46bo2bo26bo2b2o3bobo13b3o18b obo39b2o64b2o1128bobo16bo23b2obob2o2b2o59b2o16b3o$466b3o15b2o17b2o27b 3o14bo11bob2o2b2obobo12bobobo17b2o1121bo114b2o42bob2o2b2o2bo59bo19bo$ 503b2o43bobo10bo4bo4bo11b3o3b3o11b2o1125b3o108b2o46bobob2o2b2obo56bo 20b2o11b2o$549b2o11b3obob3o7b2o2bo4bo4bo10bobo44b2o1081bo22bo84bobo32b 2o12bo4b2o3bo56b2o32b2o$545b2o17b2ob2o9bo2bob2obo2b2obo11bo45b2o17b2o 1061b2o20b3o11bo73bo32bobo13b3obob3o11b2o$370bo133b2o38bobo33b2obob4o 2bo77b2o1082bo14b3o11b2o35b2o54bo17bo3bo13b2o$371bo132bo39bo5b2o29bob 2o4b2o13bo23bo91b2o1031b2o16bo10bobo34bobo5b2o40b2o2b2ob4o$369b3o119b 2o12b3o34bobo5b2o29bobobo2bo15bo21bobo91b2o1048b2o12b3o34bo5b2o40bo2bo bobo2bo15bo$474b2o16bo14bo34b2o38b2ob4o38b2o1088b2o64bo3bo33bobo47b2ob 2o4b2o13bo$474bo14b3o73bo18bo17bo3bo13b2o1095b2o64b2o2bo34b2o17b5o26bo bob4o2bo77b2o$392bo60b2o20b3o11bo74bobo8b2o7bobo13b3obob3o11b2o1166b2o 36b2o11b3obob3o24bob2obo2b2obo11bo45b2o17b2o$390bobo61bo22bo86b2o10bo 8b2o12bo4b2o3bo56b2o32b2o1087bo35bobo10bo4bo4bo2b2o20bo4bo4bo10bobo44b 2o$391b2o58b3o114b2o3b3o22bobob2o2b2obo23b2o31bo20b2o11b2o1080b2o4bo 37bo11bob2o2bob2obo2bo21b3o3b3o11b2o$451bo116bobo2bo24bob2o2b2o2bo24bo bo32bo19bo1074b2o17b2o4b2o49bo2b2o3bob2o25bobobo17b2o$563b2o5bo26b2obo b2o2b2o27bo31b2o16b3o1075b2o75b2o2bo2bobo27b3o18bobo39b2o$464bo18bo79b 2o5b6o19bo2bobobo2bo29b2o26b2o20bo1026b2o111b3o14bo4bobo43b2o5bo40bo$ 464b3o6b2o6b3o92bo18b2o2b2ob4o3b2o52bo1048b2o128b4ob2o44b2o5bobo35b3o 12b2o$467bo5b2o5bo91bo2b2o24bo8bo19b2o32b3o1142b2o13bobobo17bo54b2o35b o14bo16b2o$466b2o12b2o88b3o17b2o9bobo6bobo17bo35bo1142b2o11b3obob3o13b obo32bo74b3o14bo$569bo20bo11b2o7b2o15bobo1190bo3bo5bo12b2o32bobo75bo 11b3o20b2o$385bo138b2o15b2o26b2o17bobo24b2o6bo4b2o1102b2o32b2o28b2o23b ob2o2b2obobo46b2o87bo22bo$386b2o91b2o42bobo15b2o34bo10b2o24bo2bo4bobo 1107b2o11b2o20bo27bobo24bo2b2o2b2obo9bo32b2o115b3o$385b2o87b2o3b2o42bo 52bobo5b2o29b2o5bobo1120bo19bo13bo15bo27b2o2bo4b2o9bo13bo16bobo117bo$ 474b2o46b2o52bobo4bo2bo24b2o10bo1122b3o16b2o12bo14b2o29bo2bobobo2bo5b 3o11b3o16bo5b2o$571b2o4bo6b2o24bobo59b2o1074bo20b2o7bobo39b2o3b4ob2o2b 2o18bo18b2o5b2o56b3o20bo18bo$570bobo15b2o7b2o11bo61bo1097bo28b2o19bo8b o24b2o82bo22b3o6b2o6b3o$570bo17bobo6bobo9b2o42b2o15bobo1094b3o7b2o21bo 17bobo6bobo9b2o98bo24bo5b2o5bo$569b2o19bo8bo24b2o27b2o15b2o1095bo32bob o15b2o7b2o11bo122b2o12b2o$484bo105b2o3b4ob2o2b2o18bo1152b2o22b2o4bo6b 2o24bobo$482b3o44bo65bo2bobobo2bo19b3o1178bobo4bo2bo24b2o10bo48b2o15b 2o51b2o3b2o$481bo47b3o33b2o26b2o4b2ob2o23bo1178bobo5b2o36bobo47b2o15bo bo42b2o4b3o4b2o$481b2o49bo33bo25bo2b4obobo1204bo10b2o32bobo66bo42b2o3b o8b2o$510bo20b2o33bobo22bob2o2bob2obo21b2o5b2o117bo1067bobo32bo4b2o10b 2o49b2o46bobo2b5o$508b3o16b2o38b2o22bo4bo4bo12b2o9bo5b2o89b2o24b3o 1009b2o58bo11b2o7b2o15bobo9bo99bo3b3o$507bo19bo51b2o11b3o3b3o13bobo8bo bo95bo23bo1013bo58b2o9bobo6bobo17bo7bobo$390bobo101b2o11b2o20bo49b2o 13bobobo17bo9b2o84bo10bobo21b2o1012bobo15b2o24b2o24bo8bo19b2o6b2o$391b 2o101b2o32b2o65b3o14b4ob2o2b2o7b2o78b3o11b2o1036b2o15b2o25bo18b2o2b2ob 4o3b2o$391bo220bo2bobobo2bo6bobo62bo14bo1093b3o19bo2bobo4bo124bo$610b 2o2b2obob2o9bo63b3o12b2o1092bo23b2obo2bo2b2o77bo44b3o$609bo2b2o2b2obo 32b2o43bo64b2o1064bobo3b2o2bo74b3o47bo$596bo11bob2o2b2obobo24b2o5bobo 42b2o64b2o1064bob2obo2b2obo72bo49b2o$595bobo10bo3b2o4bo9b3o13b2o5bo 1149b2o5b2o5b2o12bo4bo4bo72b2o20bo$525b2o36bo32b2o11b3obob3o31bobo 1149b2o5bo5bobo13b3obob3o11b2o64b2o16b3o$525b2o17b2o17b2o27b2o17bo3bo 11bobobo17b2o46b2o991bo115bobo5bo17b5o13b2o65bo19bo28b2o$544b2o16bobo 26bobo31b3obob3o11b2o50b2o17b2o972b3o113b2o4b2ob4o96bo20b2o11b2o15b2o$ 591bo5b2o14bo6b2o2bo5bo3bo10bobo68b2o975bo22bo85b2o7bobobo2bo96b2o32b 2o$589bobo5b2o14bo6bo2bobob2o2b2obo11bo120b2o923b2o20b3o11bo73bobo6bo 4bo2b2o$545b2o42b2o31b2ob2o2b2o2bo133b2o944bo14b3o11b2o59bo6b2ob2o2b2o 2bo$545bo66bo10bo4bo2b2o1080b2o16bo10bobo35b2o26bo2bobob2o2b2obo11bo$ 532b2o12b3o62bobo9bobobo2bo1099b2o12b3o33bobo5b2o18b2o2bo5bo3bo10bobo$ 515b2o16bo14bo62b2o11b2ob4o1046b2o64bo3bo34bo5b2o14bo8b3obob3o11b2o$ 515bo14b3o82b2o9bo17b5o13b2o49b2o32b2o928b2o64b2o2bo34bobo18b3o9bobobo 17b2o79b2o50bo7bo$494b2o20b3o11bo84bobo8bobo13b3obob3o11b2o49bo20b2o 11b2o999b2o33b2o17bobobo30bobo59b2o17b2o42b2o5b3o5bobo$495bo22bo91b2o 5bo9b2o12bo4bo4bo63bo19bo1013bo37b2o11b3o3b3o7b3o13b2o5bo59b2o61b2o4b 2o2bo3bobo$492b3o16bo18bo79b2o5b2o21bob2obo2b2obo23b2o37b2o16b3o1007b 2o4bo37bobo10bo3bobo3bo2b2o18b2o5bobo126b2ob2o3b2o$492bo18b3o6b2o6b3o 109bobo3b2o2bo24bobo32b2o20bo990b2o17b2o4b2o37bo11bob2o4b2obo2bo26b2o 126bob2o$514bo5b2o5bo87bo23b2obo2bo2b2o27bo32bo1012b2o75bo2b3o4b2o6bo 79b2o66bo$513b2o12b2o86b3o19bo2bobo4bo29b2o32b3o958b2o127b2o5bobo6bobo 79bo66bo3b2o$618bo18b2o2b2ob4o3b2o60bo958b2o129bo2bo3bo7b2o76b3o12b2o 54b2obo$571b2o15b2o27b2o24bo8bo19b2o1129b4ob2o4b2o80bo14bo16b2o43bo$ 526b2o42bobo15b2o42b2o9bobo6bobo17bo1097b2o13b2ob2o17bo5bobo96b3o14bo 40bo3bo$521b2o3b2o42bo61bo11b2o7b2o15bobo1097b2o11b3obob3o13bobo5bo5b 2o93bo11b3o20b2o19b2ob2o$521b2o46b2o59bobo32bo4b2o1020b2o32b2o54bo4bo 4bo12b2o5b2o5b2o79bo18bo6bo22bo$619bo10b2o32bobo1025b2o11b2o20bo29b2o 23bob2o2b2obobo106b3o6b2o6b3o30b3o17bo$618bobo5b2o36bobo52b2o984bo19bo 30bobo24bo2b2o3bobo109bo5b2o5bo35bo17bo$618bobo4bo2bo24b2o10bo53bo986b 3o16b2o29bo27b2o2b2obob2o23bo83b2o12b2o52bo2bo$613b2o4bo6b2o24bobo45b 2o15bobo988bo20b2o24b2o29bo4bobo2bo19b3o153bo$531bo80bobo15b2o7b2o11bo 47b2o15b2o1011bo50b2o3b4ob2o2b2o18bo25b2o15b2o112bo$529b3o44bo35bo17bo bo6bobo9b2o21b2o1051b3o30b2o19bo8bo24b2o24b2o15bobo42b2o$528bo47b3o32b 2o19bo8bo24b2o4bo2bo1051bo33bo17bobo6bobo9b2o58bo42b2o3b2o$528b2o49bo 52b2o3b4ob2o2b2o18bo5b3o1086bobo15b2o7b2o11bo58b2o46b2o$557bo20b2o57bo 2bobobo2bo19b3o130bo961b2o4bo6b2o24bobo$526bo28b3o16b2o31b2o26b2o2bo4b 2o23b4o5b2o92b2o24b3o966bobo4bo2bo24b2o10bo$554bo19bo33bo25bo2b2o2b2ob o27bo5b2o93bo23bo969bobo5b2o29b2o5bobo147bobo$541b2o11b2o20bo31bobo22b ob2o2b2obobo22b3o2bobo87bo10bobo21b2o969bo10b2o24bo2bo4bobo147b2o$541b 2o32b2o32b2o22bo3bo5bo12b2o8bo2bo3b2o85b3o11b2o944b2o57bobo24b2o6bo4b 2o10b2o66bo64bo$621b2o11b3obob3o13bobo7b2o9b2o65bo14bo961bo59bo11b2o7b 2o15bobo9bo22bo44b3o$621b2o13bobobo17bo17bobo65b3o12b2o960bobo15b2o40b 2o9bobo6bobo17bo7bobo20b3o47bo$654b4ob2o2b2o12bo69bo64b2o908b2o15b2o 25b2o24bo8bo19b2o6b2o20bo49b2o$637b3o14bo4bobo2bo34b2o45b2o64b2o953bo 18b2o2b2ob4o3b2o49b2o20bo$652b2o2bo2bob2o28b2o5bobo1063b3o19bo2bo3bo2b o58b2o16b3o$572b2o77bo2b2o3bobo29b2o5bo1065bo23b2obo5b2o57bo19bo$517bo 54b2o17b2o45bo11bob2o2bob2obo34bobo48b2o1040bo4b3o2bo54bo20b2o11b2o$ 515b3obo71b2o44bobo10bo4bo4bo13b5o17b2o49b2o17b2o993b2o5b2o19bob2o4b2o bo53b2o32b2o$514bo3bo119b2o11b3obob3o12b3obob3o11b2o72b2o880bo112b2o5b o7b2o12bo3bobo3bo166bo$513b3obo116b2o17b5o9b2o2bo4bo4bo10bobo122b2o 829b3o115bobo6bobo13b3o3b3o11b2o153bo$512b2obo76b2o39bobo31bo2bob2obo 2b2obo11bo123b2o832bo22bo91b2o7bo17bobobo13b2o153b3o$513b3o76bo40bo5b 2o28b2obo3b2o2bo969b2o20b3o11bo75b2o9b2ob4o14b3o$513b2obo62b2o12b3o35b obo5b2o29bobo2bo2b2o991bo14b3o73bobo7bobo4bo15bo$515b3o44b2o16bo14bo 35b2o20bo16bobo4bo14b3o976b2o16bo14bo58bo8bobob2o2b2o40b3o32b2o$515b2o 45bo14b3o69b2o20b2ob4o85b2o32b2o889b2o12b3o35b2o29b2obo3b2o2bo39bo9b2o 4b2o17b2o$541b2o20b3o11bo70b2o4b2o17bo17bobobo13b2o52bo20b2o11b2o836b 2o64bo38bobo5b2o19bo2bobob2o2b2obo11bo27bo9bo4b2o116bo$542bo22bo83b2o 3b2o8b2o7bobo13b3obob3o11b2o54bo19bo849b2o64b2o39bo5b2o19b2o2bo4bo4bo 10bobo35bo123bobo$539b3o107b3o5b2o3bo2bo8b2o12bo5bo3bo65b2o16b3o957bob o29b3obob3o11b2o36b2o122b2o$539bo110b3o4bobo2b3o22bobob2o2b2obo23b2o 36b2o20bo960b2o17b5o9b2ob2o17b2o34bo2b2o$651bobo5bo27bob2o2b2o2bo24bob o35bo939b2o45b2o11b3obob3o29bobo33bo3bo$553bo18bo79b2o5b4o23b2o4bo2b2o 27bo36b3o917b2o17b2o44bobo10bo4bo4bo2b2o19b2o5bo34b3o12b2o$553b3o6b2o 6b3o89b3o19bo2bobobo2bo29b2o37bo917b2o64bo11bob2o2bob2obo2bo19b2o5bobo 34bobo10bo16b2o$556bo5b2o5bo87b3o5bo18b2o2b2ob4o3b2o930b2o128bo2b2o3bo b2o29b2o35b2o11b3o14bo$555b2o12b2o85bo2bo4b2o24bo8bo19b2o909b2o129b2o 2bo2bobo8bo73bo11b3o20b2o$656b2o21b2o9bobo6bobo17bo1026b3o14bo4bobo7bo bo84bo22bo$613b2o15b2o47bo11b2o7b2o15bobo922b3o118b4ob2o9b2o108b3o43bo bo$568b2o42bobo15b2o45bobo32bo4b2o921b2ob4o83b2o13bobobo17bo7b2o114bo 43b2o$563b2o3b2o42bo53bo10b2o32bobo55b2o869bo2b2o4bobo32b2o44b2o11b3ob ob3o13bobo6bobo159bo$563b2o46b2o52bobo5b2o32b2o2bobo55bo870b3o7b2o11b 2o20bo56bo3bo5bo12b2o7bo5b2o$665bobo4bo2bo24b2o6b2o2bo37b2o15bobo875bo bo15bo19bo33b2o23bob2o2b2obobo19b2o5b2o79bo18bo$660b2o4bo6b2o24bobo5bo 42b2o15b2o895b3o16b2o31bobo24bo2b2o2b2obo107b3o6b2o6b3o$659bobo15b2o7b 2o11bo966bo20b2o27bo27b2o2bo4b2o23bo85bo5b2o5bo48bo$659bo17bobo6bobo9b 2o988bo26b2o29bo2bobobo2bo19b3o84b2o12b2o45b2o$573bo84b2o19bo8bo24b2o 970b3o53b2o3b4ob2o2b2o18bo149b2o$571b3o44bo60b2o3b4ob2o2b2o18bo971bo 34b2o19bo8bo24b2o25b2o15b2o$570bo47b3o63bo4bobo2bo19b3o4b2o5b2o991bo 17bobo6bobo9b2o40b2o15bobo42b2o$570b2o49bo32b2o26b2o2bo2bob2o23bo5bo5b 2o991bobo15b2o7b2o11bo59bo42b2o3b2o$599bo20b2o33bo25bo2b2o3bobo30bobo 116bo880b2o4bo32bobo57b2o46b2o$539bo57b3o16b2o37bobo22bob2o2bob2obo31b 2o88b2o24b3o885bobo32b2o10bo$537bobo56bo19bo39b2o22bo4bo4bo12b2o22b2o 85bo23bo888bobo36b2o5bobo$538b2o43b2o11b2o20bo49b2o11b3obob3o13bobo20b obo74bo10bobo21b2o838b2o48bo10b2o24bo2bo4bobo$583b2o32b2o49b2o13b5o17b o21bo73b3o11b2o862bo59bobo24b2o6bo4b2o10b2o$701b4ob2o2b2o37b2o34bo14bo 878bobo15b2o42bo11b2o7b2o15bobo9bo68bo$701bo2bobobo2bo29b2o5bobo34b3o 12b2o878b2o15b2o42b2o9bobo6bobo17bo7bobo23bo44b3o$699b2o2bo4b2o31b2o5b o39bo64b2o865bob2o2b2o24bo8bo19b2o6b2o22b3o47bo$698bo2b2o2b2obo37bobo 38b2o64b2o865b2obo3bo18b2o2b2ob4o3b2o50bo49b2o$685bo11bob2o2b2obobo15b 5o17b2o976b3o19bo2bobo4bo55b2o20bo$599bobo12b2o68bobo10bo3bo5bo14b3obo b3o11b2o1004b2obo2bo2b2o57b2o16b3o$597bobobo12b2o17b2o50b2o11b3obob3o 10b2o2bo4bo4bo10bobo28bo14b2o929b2o5b3o20bobo3b2o2bo57bo19bo$595b2o36b 2o46b2o17bobobo12bo2bob2obo2b2obo11bo27b2o15b2o17b2o15b2o893b2o5bo2bob 2o16bob2obo2b2obo54bo20b2o11b2o$597bo82bobo36b2obo3b2o2bo41b2o33b2o15b 3o897bobo2b2obo3b2o12bo4bo4bo54b2o32b2o$680bo5b2o13b3o16bobo2bo2b2o94b o4b2o27b2o748bo115b2o9bobo13b3obob3o11b2o$634b2o42bobo5b2o32bobo4bo14b 3o81b2o2bo27b2o748b3o109b2o13bo17b5o13b2o$634bo43b2o41b2ob4o100b2o781b o22bo85bobo6b2o2b2ob4o164bobo$621b2o12b3o63bo21bo17bobobo13b2o67bo781b 2o20b3o11bo74bo7bo2bobobo2bo164b2o$604b2o16bo14bo62bobo20bobo13b3obob 3o11b2o870bo14b3o49b2o31b2o4bo2b2o157bo5bo$604bo14b3o78b2o22b2o12bo5bo 3bo55b2o32b2o791b2o16bo14bo33bobo5b2o24bob2o2b2o2bo75b2o77b2o$583b2o 20b3o11bo84b2o31bobob2o2b2obo23b2o30bo20b2o11b2o808b2o12b3o35bo5b2o24b obob2o2b2obo11bo37b2o4b2o17b2o78b2o$584bo22bo96bobo30bob2o2b2o2bo24bob o31bo19bo768b2o64bo38bobo30bo5bo3bo10bobo37bo4b2o$581b3o115b2o5bo5bo 23b2o4bo2b2o27bo30b2o16b3o769b2o64b2o38b2o17b2ob2o9b3obob3o11b2o37bo$ 581bo18bo18bo79b2o5b2o4b3o19bo2bobobo2bo29b2o25b2o20bo881b2o11b3obob3o 9bobobo17b2o33b2o$600b3o6b2o6b3o95bo18b2o2b2ob4o3b2o51bo902bobo10bo4bo 4bo2b2o26bobo34bo2b2o$603bo5b2o5bo97b2o24bo8bo19b2o31b3o855b2o43bo11bo b2o2b2obobo2bo5b3o13b2o5bo34bo3bo$602b2o12b2o111b2o9bobo6bobo17bo34bo 836b2o17b2o56bo2b2o3bob2o23b2o5bobo33b3o12b2o$729bo11b2o7b2o15bobo871b 2o76b2o2b2obobo32b2o35bobo10bo16b2o$660b2o15b2o48bobo24b2o6bo4b2o821b 2o113bo15bo4bobo10bo59b2o11b3o14bo$615b2o42bobo15b2o37bo10b2o24bo2bo4b obo826b2o112b3o14b4ob2o10bobo73bo11b3o20b2o$610b2o3b2o42bo55bobo5b2o 29b2o5bobo924b2o13bobobo17bo13b2o85bo22bo$610b2o46b2o55bobo4bo2bo24b2o 10bo925b2o11b3o3b3o13bobo9b2o113b3o$710b2o4bo6b2o24bobo58b2o888bo3bobo 3bo12b2o3bob2o2bobo115bo$709bobo15b2o7b2o11bo60bo799b2o32b2o29b2o23bob 2o4b2obo6bobo7b2obo2bo5b2o5b2o$563bo145bo17bobo6bobo9b2o41b2o15bobo 799b2o11b2o20bo28bobo24bo2b3o4bo7b2o11b3o5b2o4b2o73bo18bo$513bobo48b2o 142b2o19bo8bo24b2o26b2o15b2o813bo19bo30bo27b2o5bob2o6bo28bo72b3o6b2o6b 3o$514b2o47b2o55bo108b2o3b4ob2o2b2o18bo860b3o16b2o28b2o29bo2bo3bo2bo 19b3o87bo5b2o5bo$514bo103b3o44bo68bo4bobo2bo19b3o859bo20b2o50b2o3b4ob 2o2b2o18bo3bob2o82b2o12b2o$617bo47b3o36b2o26b2o2bo2bob2o23bo881bo29b2o 19bo8bo24b2o2b2obo$617b2o49bo36bo25bo2b2o3bobo155bo747b3o31bo17bobo6bo bo9b2o42b2o15b2o$646bo20b2o36bobo22bob2o2bob2obo20b2o5b2o98b2o24b3o 747bo33bobo15b2o7b2o11bo42b2o15bobo42b2o$644b3o16b2o41b2o22bo4bo4bo12b 2o8bo5b2o99bo23bo785b2o4bo6b2o24bobo59bo42b2o3b2o$643bo19bo54b2o11b3ob ob3o13bobo7bobo93bo10bobo21b2o789bobo4bo2bo24b2o10bo48b2o46b2o48bo$ 620b2o8b2o11b2o20bo52b2o13b5o17bo8b2o91b3o11b2o812bobo5b2o36bobo144bo$ 619bobo8b2o32b2o85b4ob2o2b2o6b2o71bo14bo829bo10b2o32bobo144b3o$615bo5b o129bo2bobobo2bo5bobo71b3o12b2o839bobo32bo4b2o10b2o$612b2o2bo132b2o2bo 4b2o8bo75bo64b2o727b2o59bo11b2o7b2o15bobo9bo$611bo5bo130bo2b2o2b2obo 31b2o51b2o64b2o728bo59b2o9bobo6bobo17bo7bobo70bo49bo$610b2ob2o120bo11b ob2o2b2obobo23b2o5bobo847bobo15b2o25b2o24bo8bo19b2o6b2o26bo44b3o47bobo $551bo28bo30b4o3bo115bobo10bo3bo5bo20bo3b2o5bo850b2o15b2o26bo18b2o2b2o b4o3b2o53b3o47bo46b2o$552b2o24bobo31bo4bo43b2o72b2o11b3obob3o9b3o7bobo 8bobo54b2o836b3o19bo2bobo4bo57bo49b2o$529bobo19b2o26b2o33b3o44b2o17b2o 49b2o17bobobo10bobobo7b2o8b2o55b2o17b2o817bo23b2obob2o2b2o55b2o20bo$ 530b2o82bo65b2o48bobo30b3o3b3o11b2o78b2o683bo158bobo3b2o2bo58b2o16b3o$ 530bo199bo5b2o13b3o4b2o2bo4bo4bo10bobo128b2o632b3o156bobob2o2b2obo58bo 19bo$728bobo5b2o20bo2bob2obo2b2obo11bo129b2o635bo22bo104b2o5b2o6b2o12b o4bo4bo56bo20b2o11b2o$681b2o45b2o30b2obob4o2bo778b2o20b3o11bo92b2o5bo 6bobo13b3obob3o11b2o44b2o32b2o$681bo69bo9bob2o4b2o13bo786bo14b3o95bobo 6bo17b2ob2o13b2o$668b2o12b3o65bobo8bobobo2bo15bo786b2o16bo14bo79b2o5b 2ob4o149bobo$651b2o16bo14bo65b2o10b2ob4o91b2o32b2o692b2o12b3o75b2o8bo 3bo2bo149b2o$651bo14b3o85b2o8bo17bo3bo13b2o58bo20b2o11b2o639b2o64bo78b obo7bobo5b2o148bo$630b2o20b3o11bo87bobo7bobo13b3obob3o11b2o60bo19bo 652b2o64b2o78bo7b2o4b3o2bo78b4o$631bo22bo94b2o5bo8b2o12bo4b2o3bo71b2o 16b3o776b2o27bo2bob2o4b2obo11bo63b2ob3o3bo53bo$628b3o19bo18bo79b2o5b2o 20bobob2o2b2obo23b2o42b2o20bo778bobo5b2o19b2o2bo3bobo3bo10bobo44b2o20b ob5o50b2o$628bo21b3o6b2o6b3o108bob2o2b2o2bo24bobo41bo742b2o58bo5b2o13b 3o8b3o3b3o11b2o45b2o20b5ob2o50b2o$568bo84bo5b2o5bo86bo23b2obob2o2b2o 27bo42b3o720b2o17b2o58bobo31bobobo17b2o58bo4bo2b2obo$566bobo16bo66b2o 12b2o85b3o19bo2bobobo2bo29b2o43bo720b2o78b2o17bobobo10b3o18bobo58b2o3b 5o$567b2o17bo169bo18b2o2b2ob4o3b2o739b2o133b2o11b3obob3o9bo14b2o5bo39b 2o17bo5b3o$584b3o123b2o15b2o26b2o24bo8bo19b2o36bo681b2o132bobo10bo3bo 5bo2b2o19b2o5bobo38bo$665b2o42bobo16bo41b2o9bobo6bobo17bo36b3o815bo11b ob2o2b2obobo2bo27b2o35b3o12b2o$660b2o3b2o42bo60bo11b2o7b2o15bobo35b2o 2bo827bo2b2o2b2ob2o7bo58bo14bo16b2o$660b2o46b2o58bobo24b2o6bo4b2o36bo 3bo828b2o2bo4bo7bobo73b3o14bo$757bo10b2o24bo2bo4bobo41bob2o16b2o682b2o 32b2o95bo2bobobo8b2o75bo11b3o20b2o$756bobo36b2o5bobo41b2o18bo683b2o11b 2o20bo62b3o30b4ob2o5b2o91bo22bo$756bobo32b2o10bo60bobo696bo19bo64bo2bo 11b5o17bo6bobo115b3o$552bo175bo22b2o4bo32bobo71b2o698b3o16b2o62bo2b2o 9b3obob3o13bobo6bo5b2o112bo$550bobo117bo53bo3bo21bobo15b2o7b2o11bo67b 4o684bo19bo20b2o57bo2bo10bo4bo4bo12b2o6b2o5b2o79bo18bo$551b2o115b3o44b o9bo2bo21bo17bobo6bobo9b2o67b3obo684bo40bo46b2o10b2o11bob2o2bob2obo 107b3o6b2o6b3o$667bo47b3o7b2ob2o19b2o19bo8bo24b2o53b2o684b3o37b3o46bob o24bo2b2o3bobo110bo5b2o5bo$573bo93b2o49bo7bobo41b2o3b4ob2o2b2o18bo780b o48bo27b2o2bo2bob2o23bo84b2o12b2o$574bo121bo20b2o8bo47bo2bobobo2bo19b 3o10b2o5b2o806b2o29bo4bobo2bo19b3o$572b3o119b3o16b2o30b2o26b2o4b2ob2o 23bo11bo5b2o112bo719b2o3b4ob2o2b2o18bo26b2o15b2o$693bo19bo32bo25bo2b4o bobo36bobo89b2o24b3o698b2o19bo8bo24b2o25b2o15bobo42b2o$680b2o11b2o20bo 30bobo22bob2o2bob2obo37b2o90bo23bo702bo17bobo6bobo9b2o59bo42b2o3b2o$ 680b2o32b2o31b2o22bo4bo4bo12b2o28b2o75bo10bobo21b2o701bobo15b2o7b2o11b o59b2o46b2o$759b2o11b3o3b3o13bobo26bobo73b3o11b2o663b2o60b2o4bo6b2o24b obo$759b2o13bobobo17bo27bo58bo14bo680bo65bobo4bo2bo24b2o10bo$775b3o14b 4ob2o2b2o43b2o35b3o12b2o679bobo15b2o46bobo5b2o29b2o5bobo$792bo2bobobo 2bo35b2o5bobo38bo64b2o627b2o15b2o47bo10b2o24bo2bo4bobo$790b2o2b2obob2o 37b2o5bo39b2o64b2o704bobo24b2o6bo4b2o10b2o67bo$566bobo142b2o76bo2b2o2b 2obo43bobo813bo11b2o7b2o15bobo9bo23bo44b3o$567b2o142b2o17b2o44bo11bob 2o2b2obobo21b2ob2o17b2o814b2o9bobo6bobo17bo7bobo21b3o47bo$567bo162b2o 43bobo10bo3b2o4bo20b3obob3o11b2o45b2o756b2o24bo8bo19b2o6b2o21bo49b2o$ 776b2o11b3obob3o16b2o2bo4bo4bo10bobo44b2o17b2o712b2o5b2o17bo18b2o2b2ob 4o3b2o50b2o20bo$772b2o17bo3bo18bo2bobob2o2b2obo11bo64b2o712b2o5bo15b3o 19bo2bobobo2bo59b2o16b3o$731b2o38bobo42b2obo3b2o2bo128b2o666bobo15bo 23b2o4bo2b2o58bo19bo$731bo39bo5b2o14bo23bobob2o2b2o129b2o551bo114b2o 41bob2o2b2o2bo55bo20b2o11b2o$718b2o12b3o34bobo5b2o14bo23bobo4bo15bo24b o643b3o108b2o45bobob2o2b2obo54b2o32b2o$701b2o16bo14bo34b2o47b2ob4o14b 3o21bobo646bo22bo84bobo31b2o12bo5bo3bo$701bo14b3o73bo27bo17bobobo13b2o 6b2o645b2o20b3o11bo73bo31bobo13b3obob3o11b2o$680b2o20b3o11bo74bobo26bo bo13b3o3b3o11b2o44b2o32b2o594bo14b3o11b2o35b2o53bo17bobobo13b2o$681bo 22bo86b2o28b2o12bo3bobo3bo56bo20b2o11b2o594b2o16bo10bobo34bobo5b2o39b 2o2b2ob4o$678b3o114b2o37bob2o4b2obo23b2o33bo19bo624b2o12b3o34bo5b2o39b o2bobo4bo14b3o$678bo116bobo36bo4b3o2bo24bobo31b2o16b3o572b2o55bo8bo3bo 33bobo18b3o25b2obo2bo2b2o76b2o$572bo217b2o5bo11bo23b2obo5b2o27bo27b2o 20bo574b2o54bo9b2o2bo34b2o17bobobo25bobo3b2o2bo56b2o17b2o$573b2o116bo 18bo79b2o5b2o10b3o19bo2bo3bo2bo29b2o26bo645b2o6bo13b2o36b2o11b3o3b3o 23bob2obo2b2obo11bo43b2o$572b2o117b3o6b2o6b3o101bo18b2o2b2ob4o3b2o53b 3o642b3o20bo35bobo10bo4bo4bo2b2o19bo4bo4bo10bobo$694bo5b2o5bo103b2o24b o8bo19b2o34bo641b2obo13b2o4bo37bo11bob2o2bob2obo2bo20b3obob3o11b2o$ 693b2o12b2o117b2o9bobo6bobo17bo675b4ob2o12b2o4b2o49bo2b4obob2o24b5o17b 2o38b2o$826bo11b2o7b2o15bobo678bobo57bo13b2o4b2obo47bobo38bo$751b2o15b 2o54bobo24b2o6bo4b2o625b2o53bo58bo15bo2bobobo42b2o5bo35b3o12b2o$706b2o 42bobo15b2o43bo10b2o24bo2bo4bobo630b2o128b4ob2o43b2o5bobo33bo14bo16b2o $701b2o3b2o42bo61bobo5b2o29b2o5bobo727b2o13bo3bo17bo53b2o49b3o14bo$ 701b2o46b2o61bobo4bo2bo24b2o10bo48b2o678b2o11b3obob3o13bobo31bo74bo11b 3o20b2o$807b2o4bo6b2o24bobo59bo691bo3b2o4bo12b2o31bobo85bo22bo$806bobo 15b2o7b2o11bo42b2o15bobo602b2o32b2o28b2o23bob2o2b2obobo45b2o109b3o$ 806bo17bobo6bobo9b2o42b2o15b2o603b2o11b2o20bo27bobo24bo2b2o2b2obo41b2o 115bo$805b2o19bo8bo24b2o2b2obo656bo19bo29bo27b2o2b2obob2o23bo15bobo$ 711bo114b2o3b4ob2o2b2o18bo3bob2o657b3o16b2o27b2o29bo2bobobo2bo19b3o15b o5b2o$709b3o44bo74bo4bobo2bo19b3o663bo20b2o49b2o3b4ob2o2b2o18bo17b2o5b 2o79bo18bo$708bo47b3o42b2o26b2o2b2obob2o146bo562bo28b2o19bo8bo25bo104b 3o6b2o6b3o$708b2o49bo42bo25bo2b2o3bobo20b3o5b2o89b2o24b3o559b3o30bo17b obo6bobo9b2o10bo3bo107bo5b2o5bo$737bo20b2o42bobo22bob2o2b2obobo16b2obo 2bo5b2o90bo23bo562bo32bobo15b2o7b2o11bo10bo110b2o12b2o$735b3o16b2o47b 2o22bo4bo4bo12b2o3bob2o2bobo84bo10bobo21b2o595b2o4bo6b2o24bobo9bo$734b o19bo60b2o11b3obob3o13bobo9b2o82b3o11b2o623bobo4bo2bo24b2o3b2o53b2o15b 2o$721b2o11b2o20bo58b2o13b2ob2o17bo13b2o52bo9bo14bo639bobo5b2o29bobo 53b2o15bobo42b2o$721b2o32b2o91b4ob2o2b2o6bobo51bo10b3o12b2o639bo10b2o 25bo74bo42b2o$848bo2bo3bo2bo7bo52b3o11bo64b2o564bobo30bobo24b3o3bo6b2o 10b2o48b2o$846b2o5bob2o31b2o42b2o64b2o539b2o24b2o32bo11b2o7b2o5b2o2bo 5bobo9bo76b2o$845bo2b3o4bo24b2o5bobo650bo24bo33b2o9bobo6bobo5b2obo8bo 7bobo75b2o$832bo11bob2o4b2obo24b2o5bo652bobo15b2o24b2o24bo8bo9bo9b2o6b 2o78bo20b2o$800bo30bobo10bo3bobo3bo9b3o18bobo45b2o606b2o15b2o25bo18b2o 2b2ob4o3b2o129bo$752b2o46b2o30b2o11b3o3b3o9bobobo17b2o46b2o17b2o628b3o 19bo2bobobo2bo123bo8bobo$752b2o17b2o26bobo26b2o17bobobo9b3o3b3o11b2o 69b2o628bo23b2ob2o4b2o76bo44b3o6bobo$771b2o54bobo18b3o5b2o2bo4bo4bo10b obo119b2o602bobob4o2bo73b3o47bo7b4o$827bo5b2o14bo6bo2bob2obo2b2obo11bo 120b2o602bob2obo2b2obo71bo49b2o6b2o2bo$825bobo5b2o23b2obob4o2bo710b2o 5b2o5b2o12bo4bo4bo71b2o20bo36b3o$772b2o51b2o32bob2o4b2o13bo582bo114b2o 5bo5bobo13b3o3b3o11b2o63b2o16b3o35bo$772bo75bo10bobobo2bo15bo582b3o 117bobo5bo17bobobo13b2o64bo19bo$759b2o12b3o71bobo10b2ob4o82b2o32b2o 483bo22bo93b2o4b2ob4o14b3o78bo20b2o11b2o$742b2o16bo14bo71b2o13bo17bo3b o13b2o49bo20b2o11b2o482b2o20b3o11bo77b2o7bobobo2bo95b2o32b2o$742bo14b 3o91b2o9bobo13b3obob3o11b2o51bo19bo516bo14b3o75bobo6bobob2o2b2o$721b2o 20b3o11bo93bobo2b2obo3b2o12bo4b2o3bo62b2o16b3o517b2o16bo14bo60bo6b2ob 2o2b2o2bo182bo$722bo22bo4b2o94b2o5bo2bob2o16bobob2o2b2obo23b2o33b2o20b o536b2o12b3o37b2o26bo2bobob2o2b2obo11bo133bo4b2o27b2o$719b3o27bobo14bo 79b2o5b3o20bob2o2b2o2bo24bobo32bo505b2o64bo40bobo5b2o18b2o2bo4b2o3bo 10bobo131b2o6bo27b2o$719bo27b3o6b2o6b3o108b2obob2o2b2o27bo33b3o502b2o 64b2o41bo5b2o23b3obob3o11b2o135bo5bo$743b2obo3bo5b2o5bo87b3o19bo2bobob o2bo29b2o34bo611bobo30bo3bo17b2o78b2o52b2o3bo$743bob2o2b2o12b2o82b2obo 3bo18b2o2b2ob4o3b2o673b2o17b2ob2o30bobo58b2o17b2o42b2o13bo$847bob2o2b 2o24bo8bo19b2o607b2o47b2o11b3obob3o8bo14b2o5bo58b2o61b2o10bobo$807b2o 15b2o42b2o9bobo6bobo17bo589b2o17b2o46bobo10bo4bo4bo2b2o3bo14b2o5bobo 132b2o$762b2o42bobo15b2o42bo11b2o7b2o15bobo589b2o66bo11bob2o2b2obobo2b o26b2o$757b2o3b2o42bo59bobo24b2o6bo4b2o539b2o130bo2b2o3bob2o6bo78b2o$ 757b2o46b2o48bo10b2o24bo2bo4bobo52b2o490b2o131b2o2b2obobo6bobo78bo$ 854bobo5b2o29b2o5bobo52bo610bo15bo4bobo7b2o75b3o12b2o61b2o$854bobo4bo 2bo24b2o10bo34b2o15bobo609b3o14b4ob2o4b2o79bo14bo16b2o43b2obo30bo$849b 2o4bo6b2o24bobo17b2o26b2o15b2o594b2o13bobobo17bo5bobo95b3o14bo44b3o30b obo$848bobo15b2o7b2o11bo20bo557b2o32b2o46b2o11b3o3b3o13bobo5bo5b2o92bo 11b3o20b2o20b2o34b2o$767bo80bo17bobo6bobo9b2o17b3o558b2o11b2o20bo58bo 3bobo3bo12b2o5b2o5b2o79bo18bo5bo22bo20bo$765b3o44bo34b2o19bo8bo24b2o2b o573bo19bo35b2o23bob2o4b2obo106b3o6b2o6b3o29b3o21bo$764bo47b3o53b2o3b 4ob2o2b2o18bo578b3o16b2o33bobo24bo2b3o4bo109bo5b2o5bo34bo18bo$764b2o 49bo57bo2bobobo2bo19b6o5b2o567bo20b2o29bo27b2o5bob2o23bo83b2o12b2o53b 3o22bo$793bo20b2o27b2o26b2o4b2ob2o26bo5b2o589bo28b2o29bo2bo3bo2bo19b3o 176bo$791b3o16b2o32bo25bo2b4obobo24bo2bobo116bo474b3o55b2o3b4ob2o2b2o 18bo25b2o15b2o135b3o$790bo19bo33bobo22bob2o2bob2obo22b3o3b2o88b2o24b3o 474bo36b2o19bo8bo24b2o24b2o15bobo42b2o$777b2o11b2o20bo32b2o22bo4bo4bo 12b2o8bo10b2o85bo23bo515bo17bobo6bobo9b2o58bo42b2o3b2o$777b2o32b2o44b 2o11b3o3b3o13bobo7b2o8bobo74bo10bobo21b2o514bobo15b2o7b2o11bo58b2o46b 2o$857b2o13bobobo17bo18bo73b3o11b2o538b2o4bo6b2o24bobo$704bo168b3o14b 4ob2o2b2o34b2o27bo6bo14bo559bobo4bo2bo24b2o10bo$705bo184bo2bobobo2bo 26b2o5bobo27bobo4b3o12b2o558bobo5b2o36bobo$703b3o182b2o2b2obob2o28b2o 5bo29b2o8bo64b2o454b2o50bo10b2o32bobo$887bo2b2o2b2obo34bobo38b2o64b2o 455bo61bobo32bo4b2o10b2o66bo76bo$808b2o64bo11bob2o2b2obobo12b2ob2o17b 2o56b2o11bobo490bobo15b2o44bo11b2o7b2o15bobo9bo22bo44b3o72b2o$808b2o 17b2o27bo16bobo10bo3b2o4bo11b3obob3o11b2o78b3o486b2o15b2o44b2o9bobo6bo bo17bo7bobo20b3o47bo72b2o$827b2o26b2o17b2o11b3obob3o7b2o2bo4bo4bo10bob o43b2o18bo11b2o2bo534b2o24bo8bo19b2o6b2o20bo49b2o$749bo105bobo12b2o17b o3bo9bo2bobob2o2b2obo11bo44b2o17bo10b4ob2o535bo18b2o2b2ob4o3b2o49b2o 20bo$749b2o118bobo33b2obo3b2o2bo75bobo3bo7b3o531b2ob3o19bo2bobo4bo58b 2o16b3o$751b2o75b2o39bo5b2o14bo14bobob2o2b2o82bo45b2o494b2obo23b2obob 2o2b2o57bo19bo$753b2o73bo38bobo5b2o14bo14bobo4bo15bo114b2o490b2o5bo24b obo3b2o2bo54bo20b2o11b2o74bobo$752bobo60b2o12b3o35b2o38b2ob4o14b3o605b 2o5bob2o21bobob2o2b2obo53b2o32b2o74b2o$752bobo43b2o16bo14bo32bo25bo18b o17bobobo13b2o594bobob2o8b2o12bo4bo4bo164bo$798bo14b3o48b2o23bobo8b2o 7bobo13b3o3b3o11b2o479bo114b2o11bobo13b3obob3o11b2o$777b2o20b3o11bo51b o23b2o10bo8b2o12bo3bobo3bo55b2o32b2o400b3o108b2o15bo17b2ob2o13b2o$778b o22bo91b2o3b3o22bob2o4b2obo23b2o30bo20b2o11b2o403bo22bo84bobo8b2o2b2ob 4o$720bo54b3o83bobo29bobo2bo24bo4b3o2bo24bobo31bo19bo415b2o20b3o11bo 73bo9bo2bo3bo2bo$721bo53bo86b2o24b2o5bo26b2obo5b2o27bo30b2o16b3o437bo 14b3o11b2o35b2o33b2obo5b2o75b2o$719b3o67bo18bo53bo25b2o5b6o19bo2bo3bo 2bo29b2o25b2o20bo439b2o16bo10bobo34bobo5b2o14bo11bo4b3o2bo49b2o4b2o17b 2o$789b3o6b2o6b3o92bo18b2o2b2ob4o3b2o51bo478b2o12b3o34bo5b2o14bo11bob 2o4b2obo11bo37bo4b2o101bo$792bo5b2o5bo54bo36bo2b2o24bo8bo19b2o31b3o 422b2o64bo3bo33bobo32bo3bobo3bo10bobo35bo107bo$791b2o12b2o53b2ob2o30b 3o17b2o9bobo6bobo17bo34bo422b2o64b2o2bo34b2o17bo3bo11b3o3b3o11b2o36b2o 106b3o$861b3o30bo20bo11b2o7b2o15bobo528b2o36b2o11b3obob3o11bobobo17b2o 34bo2b2o$849b2o11bo3b2o26b2o17bobo24b2o6bo4b2o530bo35bobo10bo3b2o4bo2b 2o7b3o18bobo33bo3bo$804b2o42bobo15b2o34bo10b2o24bo2bo4bobo528b2o4bo37b o11bob2o2b2obobo2bo8bo14b2o5bo34b3o12b2o$799b2o3b2o42bo52bobo5b2o29b2o 5bobo509b2o17b2o4b2o49bo2b2o2b2ob2o25b2o5bobo34bobo10bo16b2o$799b2o46b 2o52bobo4bo2bo24b2o10bo510b2o75b2o2b2obobo34b2o35b2o11b3o14bo$896b2o4b o6b2o24bobo58b2o410b2o128bo2bobobo12bo73bo11b3o20b2o$895bobo15b2o7b2o 11bo60bo411b2o111b3o14b4ob2o12bobo84bo22bo$895bo17bobo6bobo9b2o41b2o 15bobo508b2o13bobobo17bo15b2o108b3o$894b2o19bo8bo24b2o26b2o15b2o509b2o 11b3o3b3o13bobo11b2o114bo$809bo105b2o3b4ob2o2b2o18bo567bo4bo4bo12b2o8b 2obobo168bo$807b3o44bo65bo4bobo2bo19b3o475b2o32b2o28b2o23bob2o2bob2obo 21b2obo5b2o161b2o$806bo47b3o33b2o26b2o2b2obob2o23bo127bo347b2o11b2o20b o27bobo24bo2b4obobo24bo5b2o79bo18bo63b2o$806b2o49bo33bo25bo2b2o3bobo 124b2o24b3o360bo19bo29bo27b2o4b2ob2o23bob2o83b3o6b2o6b3o56bobo$756bo 78bo20b2o33bobo22bob2o2b2obobo20b2o5b2o96bo23bo364b3o16b2o27b2o29bo2bo bobo2bo19b3ob2o86bo5b2o5bo59b2o$757bo75b3o16b2o38b2o22bo4bo4bo12b2o8bo 5b2o85bo10bobo21b2o365bo20b2o49b2o3b4ob2o2b2o18bo91b2o12b2o59bo$755b3o 74bo19bo51b2o11b3obob3o13bobo7bobo88b3o11b2o410bo28b2o19bo8bo24b2o$ 776bo42b2o11b2o20bo49b2o13b2ob2o17bo8b2o6bo65bo14bo423b3o30bo17bobo6bo bo9b2o44b2o15b2o$774bobo42b2o32b2o82b4ob2o2b2o6b2o2bobo63b3o12b2o422bo 32bobo15b2o7b2o11bo44b2o15bobo42b2o$775b2o160bo2bo3bo2bo5bobo2b2o67bo 64b2o403b2o4bo32bobo61bo42b2o3b2o$935b2o5bob2o8bo71b2o64b2o408bobo32b 2o10bo50b2o46b2o$900b2o32bo2b3o4bo31b2o524bobo36b2o5bobo$899b2o20bo11b ob2o4b2obo23b2o5bobo525bo10b2o24bo2bo4bobo$901bo18bobo10bo3bobo3bo24b 2o5bo51b2o485bobo24b2o6bo4b2o10b2o$850b2o69b2o11b3o3b3o30bobo51b2o17b 2o408b2o58bo11b2o7b2o15bobo9bo$850b2o17b2o46b2o17bobobo10b5o17b2o71b2o 409bo58b2o9bobo6bobo17bo7bobo72bo55bo$869b2o45bobo18b3o9b3obob3o11b2o 126b2o358bobo15b2o24b2o24bo8bo19b2o6b2o28bo44b3o51b2o$916bo5b2o14bo5b 2o2bo4bo4bo10bobo125b2o359b2o15b2o25bo18b2o2b2ob4o3b2o55b3o47bo51b2o$ 914bobo5b2o20bo2bob2obo2b2obo11bo528b3o19bo2bobobo2bo59bo49b2o$695bo 48bobo24bo98b2o42b2o30b2obo3b2o2bo541bo23b2obob2o2b2o57b2o20bo$696b2o 47b2o25b2o96bo66bo9bobo2bo2b2o567bob2o2b2o2bo60b2o16b3o$695b2o48bo25b 2o84b2o12b3o62bobo8bobo4bo14b3o71b2o32b2o445bobob2o2b2obo60bo19bo$840b 2o16bo14bo62b2o10b2ob4o88bo20b2o11b2o305bo112b2o5b2o5b2o12bo4b2o3bo58b o20b2o11b2o$840bo14b3o82b2o8bo17bobobo13b2o57bo19bo318b3o110b2o5bo5bob o7bo5b3obob3o11b2o46b2o32b2o$819b2o20b3o11bo84bobo7bobo13b3obob3o11b2o 56b2o16b3o322bo22bo91bobo5bo8b2o7bo3bo13b2o$820bo22bo91b2o5bo8b2o12bo 5bo3bo64b2o20bo323b2o20b3o11bo79b2o4b2ob4o4bobo$817b3o16bo18bo79b2o5b 2o20bobob2o2b2obo23b2o39bo366bo14b3o11b2o60b2o7bobobo2bo15bo$817bo18b 3o6b2o6b3o49bo58bob2o2b2o2bo24bobo39b3o363b2o16bo10bobo59bobo6bob2o4b 2o13bo166bo$839bo5b2o5bo50b2ob2o31bo23b2o4bo2b2o27bo41bo380b2o12b3o58b o6b2obob4o2bo179bobo$838b2o12b2o48b2o2bo32b3o19bo2bobobo2bo29b2o368b2o 64bo3bo34b2o26bo2bob2obo2b2obo11bo66b2o98b2o$903b3o7bo28bo18b2o2b2ob4o 3b2o394b2o64b2o2bo34bobo5b2o18b2o2bo4bo4bo10bobo46b2o17b2o$896b2o6bo6b obo27b2o24bo8bo19b2o417b4o23b2o34bo5b2o14bo8b3o3b3o11b2o47b2o109bo$ 851b2o42bobo13b3o42b2o9bobo6bobo17bo417b2ob2o24bo34bobo18b3o9bobobo17b 2o153bo$761bo84b2o3b2o42bo60bo11b2o7b2o15bobo416b2o2bo2bo15b2o4bo7bobo 26b2o17bobobo9b3o18bobo152b3o$732bobo27bo83b2o46b2o58bobo24b2o6bo4b2o 53b2o363bo3b3o15b2o4b2o7b2o30b2o11b3o3b3o23b2o5bo41b2o$711bo21b2o25b3o 180bo10b2o24bo2bo4bobo40b2o7bo8bo365bo2bo2bo29bo30bobo10bo3bobo3bo2b2o 18b2o5bobo40bo$712b2o19bo42bobo163bobo36b2o5bobo39b2obo7bo5bobo316b2o 51bobo61bo11bob2o4b2obo2bo26b2o37b3o12b2o$711b2o64b2o163bobo32b2o10bo 40bo2bo6bobo4b2o317b2o51b2o75bo2b3o4b2o6bo60bo14bo16b2o$777bo159b2o4bo 32bobo51b3o464b2o5bobo6bobo75b3o14bo$856bo79bobo15b2o7b2o11bo54b2o4bob o3b2o454bo2bo3bo7b2o77bo11b3o20b2o$854b3o44bo34bo17bobo6bobo9b2o60b4ob 2o455b4ob2o4b2o93bo22bo$853bo47b3o31b2o19bo8bo24b2o45bo2b3o343b2o32b2o 44b2o13b2ob2o17bo5bobo117b3o35bo$853b2o49bo51b2o3b4ob2o2b2o18bo10b2o5b 2o29b2o92bo252b2o11b2o20bo44b2o11b3obob3o13bobo5bo5b2o114bo33b2o$882bo 20b2o56bo4bobo2bo19b3o8bo5b2o29bo65b2o24b3o265bo19bo58bo4bo4bo12b2o5b 2o5b2o79bo18bo50b2o$880b3o16b2o30b2o26b2o2bo2bob2o23bo8bobo101bo23bo 269b3o16b2o32b2o23bob2o2b2obobo106b3o6b2o6b3o$879bo19bo32bo25bo2b2o3bo bo34b2o90bo10bobo21b2o270bo20b2o27bobo24bo2b2o3bobo109bo5b2o5bo$866b2o 11b2o20bo30bobo22bob2o2bob2obo38b2o84b3o11b2o315bo27bo27b2o2b2obob2o 23bo83b2o12b2o43bobo$866b2o32b2o31b2o22bo4bo4bo12b2o24bobo68bo14bo328b 3o27b2o29bo4bobo2bo19b3o142b2o$749bo195b2o11b3obob3o13bobo24bo69b3o12b 2o327bo55b2o3b4ob2o2b2o18bo25b2o15b2o102bo$750bo194b2o13b5o17bo46b2o 49bo64b2o309b2o19bo8bo24b2o24b2o15bobo42b2o$748b3o16bo210b4ob2o2b2o32b 2o5bobo48b2o64b2o310bo17bobo6bobo9b2o58bo42b2o3b2o$765bobo210bo2bobobo 2bo32b2o5bo428bobo15b2o7b2o11bo58b2o46b2o$766b2o208b2o2bo4b2o18b3o18bo bo429b2o4bo6b2o24bobo$897b2o76bo2b2o2b2obo18bobobo17b2o52b2o381bobo4bo 2bo24b2o10bo$897b2o17b2o44bo11bob2o2b2obobo16b3o3b3o11b2o56b2o17b2o 313b2o47bobo5b2o29b2o5bobo$916b2o43bobo10bo3bo5bo12b2o2bo4bo4bo10bobo 74b2o314bo39b2o7bo10b2o24bo2bo4bobo$962b2o11b3obob3o13bo2bob2obo2b2obo 11bo21bo104b2o263bobo15b2o20bobo17bobo24b2o6bo4b2o10b2o66bo$958b2o17bo bobo17b2obob4o2bo35bo103b2o264b2o15b2o22bo19bo11b2o7b2o15bobo9bo22bo 44b3o$733bo183b2o38bobo40bob2o4b2o13bo20b3o410b2o18b2o9bobo6bobo17bo7b obo20b3o47bo$734bo182bo39bo5b2o13b3o19bobobo2bo15bo421bobo11bo2b2o24bo 8bo19b2o6b2o20bo49b2o$732b3o169b2o12b3o34bobo5b2o36b2ob4o438b2o11bo3bo 18b2o2b2ob4o3b2o49b2o20bo$887b2o16bo14bo34b2o46bo17bo3bo13b2o55b2o32b 2o314bo13b3o3b2o14bo2bo3bo2bo58b2o16b3o12bo$887bo14b3o73bo24bobo13b3ob ob3o11b2o55bo20b2o11b2o198bo124b2o5bobo2bo16b2obo5b2o57bo19bo10bo2bo$ 755bo110b2o20b3o11bo74bobo24b2o12bo4b2o3bo69bo19bo211b3o122b2o5bob2o 19bo4b3o2bo54bo20b2o14bo$753bobo111bo22bo86b2o38bobob2o2b2obo23b2o43b 2o16b3o215bo22bo103bobobo20bob2o4b2obo53b2o30bo4bo$754b2o108b3o114b2o 34bob2o2b2o2bo24bobo38b2o20bo216b2o20b3o11bo91b2o4bo5b2o12bo3bobo3bo 89b2o$864bo116bobo8bo23b2obob2o2b2o27bo38bo259bo14b3o85b2o7b2o4bobo13b 3o3b3o11b2o$976b2o5bo8b3o19bo2bobobo2bo29b2o38b3o256b2o16bo14bo69bobo 12bo17bobobo13b2o6b2o66b3o$877bo18bo79b2o5b2o10bo18b2o2b2ob4o3b2o66bo 273b2o12b3o70bo7b2o2b2ob4o14b3o21bobo64bo$877b3o6b2o6b3o97b2o24bo8bo 19b2o266b2o64bo50b2o29bo2bobo4bo15bo24bo63bobo$880bo5b2o5bo115b2o9bobo 6bobo17bo267b2o64b2o49bobo5b2o23b2obob2o2b2o75b2o28bo$879b2o12b2o114bo 11b2o7b2o15bobo312b2o72bo5b2o24bobo3b2o2bo49b2o4b2o17b2o23bo3bo$1007bo bo24b2o6bo4b2o311b2ob2o71bobo29bobob2o2b2obo11bo37bo4b2o41bo2bo2b2o$ 748bo188b2o15b2o40bo10b2o24bo2bo4bobo316bo4bo16b2o53b2o17b2ob2o8bo4bo 4bo10bobo35bo49b3ob2obo$749b2o141b2o42bobo15b2o39bobo5b2o29b2o5bobo58b 2o256bo3b3o15b2o57b2o11b3obob3o7b3obob3o11b2o36b2o$748b2o137b2o3b2o42b o58bobo4bo2bo24b2o10bo59bo258b2o4bo72bobo10bo4bo4bo2b2o4b2ob2o17b2o34b o2b2o46b2o2bo$887b2o46b2o53b2o4bo6b2o24bobo51b2o15bobo209b2o51bobo73bo 11bob2o2b2obobo2bo26bobo33bo3bo49bo$989bobo15b2o7b2o11bo53b2o15b2o210b 2o51b2o87bo2b2o3bob2o23b2o5bo34b3o12b2o33b3o$989bo17bobo6bobo9b2o425b 2o2b2obobo24b2o5bobo34bobo10bo16b2o17bo$988b2o19bo8bo24b2o396bo15bo4bo bo32b2o35b2o11b3o14bo$1009b2o3b4ob2o2b2o18bo396b3o14b4ob2o11bo73bo11b 3o20b2o$897bo116bo2bobobo2bo19b3o285b2o32b2o56b2o13bobobo17bo12bobo84b o22bo27bo$895b3o44bo41b2o26b2o4b2ob2o23bo7b2o5b2o269b2o11b2o20bo56b2o 11b3o3b3o13bobo4b2o7b2o108b3o24bobo$894bo47b3o40bo25bo2b4obobo33bo5b2o 282bo19bo70bo3bobo3bo12b2o5bo4b2o114bo18bo5b2o$894b2o49bo39bobo22bob2o 2bob2obo33bobo116bo171b3o16b2o44b2o23bob2o4b2obo20bobobo132bo$923bo20b 2o40b2o22bo4bo4bo12b2o21b2o88b2o24b3o173bo20b2o39bobo24bo2b3o4bo19b2ob o5b2o127b3o$921b3o16b2o56b2o11b3o3b3o13bobo24b2o85bo23bo198bo39bo27b2o 5bob2o16bo2bobo5b2o79bo18bo$920bo19bo57b2o13bobobo17bo23bobo74bo10bobo 21b2o194b3o39b2o29bo2bo3bo2bo14b2o3b3o84b3o6b2o6b3o$753bobo151b2o11b2o 20bo71b3o14b4ob2o2b2o18bo73b3o11b2o217bo67b2o3b4ob2o2b2o18bo3bo36b2o 48bo5b2o5bo$754b2o151b2o32b2o88bo2bobobo2bo40b2o34bo14bo280b2o19bo8bo 24b2o2bo35b3obo45b2o12b2o$754bo274b2o2b2obob2o34b2o5bobo34b3o12b2o280b o17bobo6bobo9b2o18b2o33b4o$1028bo2b2o2b2obo35b2o5bo39bo64b2o227bobo15b 2o7b2o11bo19bo39b2o$1015bo11bob2o2b2obobo19b3o18bobo38b2o64b2o228b2o4b o6b2o24bobo17bobo37bobo42b2o$1014bobo10bo3b2o4bo19bobobo17b2o340bobo4b o2bo24b2o10bo7b2o19b2o18bo42b2o3b2o$1015b2o11b3obob3o18b3o3b3o11b2o 283b2o59bobo5b2o36bobo27bob2o16b2o46b2o$938b2o71b2o17bo3bo15b2o2bo4bo 4bo10bobo43b2o238bo60bo10b2o32bobo27bo3bo$938b2o17b2o21b2o28bobo37bo2b ob2obo2b2obo11bo44b2o17b2o219bobo15b2o52bobo32bo4b2o10b2o10b2o2bo$957b 2o22b2o27bo5b2o14bo19b2obob4o2bo76b2o220b2o15b2o54bo11b2o7b2o15bobo9bo 12b3o$980bo27bobo5b2o14bo20bob2o4b2o13bo114b2o199bo42b2o9bobo6bobo17bo 7bobo13bo$1008b2o43bobobo2bo15bo114b2o200bo26b2o24bo8bo19b2o6b2o71bo$ 958b2o71bo22b2ob4o330b3o27bo18b2o2b2ob4o3b2o55bo44b3o$958bo71bobo23bo 17bo3bo13b2o324b3o19bo2bobo4bo58b3o47bo$945b2o12b3o68b2o24bobo13b3obob 3o11b2o307b2o5b2o8bo23b2obob2o2b2o55bo49b2o$928b2o16bo14bo72b2o21b2o 12bo4b2o3bo55b2o32b2o228b2o5bo34bobo3b2o2bo54b2o20bo$928bo3bo10b3o88bo bo33bobob2o2b2obo23b2o30bo20b2o11b2o116bo116bobo34bobob2o2b2obo57b2o 16b3o$907b2o20b4o10bo85b2o5bo33bob2o2b2o2bo24bobo31bo19bo129b3o114b2o 22b2o12bo4bo4bo58bo19bo$908bo40bo79b2o5b2o7bo23b2obob2o2b2o27bo30b2o 16b3o133bo22bo86b2o25bobo13b3obob3o11b2o44bo20b2o11b2o$905b3o21b4o6b2o 6b3o95b3o19bo2bobobo2bo29b2o25b2o20bo134b2o20b3o11bo74bobo24bo17b2ob2o 13b2o44b2o32b2o$905bo23bo3bo5b2o5bo101bo18b2o2b2ob4o3b2o51bo40bobo134b o14b3o73bo19b2o2b2ob4o$932b2o12b2o99b2o24bo8bo19b2o31b3o37b2o135b2o16b o14bo34b2o41bo2bo3bo2bo$1062b2o9bobo6bobo17bo34bo38bo152b2o12b3o34bobo 5b2o14bo20b2obo5b2o$990b2o15b2o53bo11b2o7b2o15bobo173b2o64bo39bo5b2o 14bo21bo4b3o2bo$945b2o42bobo15b2o51bobo32bo4b2o174b2o64b2o38bobo41bob 2o4b2obo11bo$940b2o3b2o42bo59bo10b2o32bobo286b2o17bo3bo20bo3bobo3bo10b obo63b2o$940b2o46b2o58bobo5b2o36bobo290b2o11b3obob3o19b3o3b3o11b2o39b 2o4b2o17b2o$1048bobo4bo2bo24b2o10bo245b2o43bobo10bo3b2o4bo2b2o16bobobo 17b2o36bo4b2o$1043b2o4bo6b2o24bobo58b2o177b2o17b2o44bo11bob2o2b2obobo 2bo17b3o18bobo34bo$1042bobo15b2o7b2o11bo60bo178b2o76bo2b2o2b2ob2o20bo 14b2o5bo34b2o$1042bo17bobo6bobo9b2o41b2o15bobo127b2o128b2o2b2obobo36b 2o5bobo34bo2b2o$950bo90b2o19bo8bo24b2o26b2o15b2o128b2o130bo2bobobo44b 2o34bo3bo$948b3o44bo66b2o3b4ob2o2b2o18bo289b3o14b4ob2o23bo58b3o12b2o$ 947bo47b3o69bo2bobobo2bo19b3o270b2o13bobobo17bo24bobo59bobo10bo16b2o$ 947b2o49bo38b2o26b2o4b2ob2o23bo125bo144b2o11b3o3b3o13bobo25b2o60b2o11b 3o14bo$976bo20b2o39bo25bo2b4obobo122b2o24b3o65b2o32b2o55bo4bo4bo12b2o 22b2o79bo11b3o20b2o$944bo29b3o16b2o43bobo22bob2o2bob2obo20b2o5b2o94bo 23bo68b2o11b2o20bo30b2o23bob2o2bob2obo34bobo91bo22bo$944b2o27bo19bo45b 2o22bo4bo4bo12b2o8bo5b2o83bo10bobo21b2o80bo19bo31bobo24bo2b4obobo34bo 5b2o110b3o$943bobo14b2o11b2o20bo55b2o11b3o3b3o13bobo7bobo86b3o11b2o 104b3o16b2o30bo27b2o4b2ob2o23bo8b2o5b2o79bo18bo13bo51bobo$960b2o32b2o 55b2o13bobobo17bo8b2o70bo14bo122bo20b2o25b2o29bo2bobobo2bo19b3o96b3o6b 2o6b3o65b2o$1067b3o14b4ob2o2b2o6b2o66b3o12b2o17b2o124bo51b2o3b4ob2o2b 2o18bo102bo5b2o5bo69bo$1084bo2bobobo2bo5bobo69bo30bobo31b2o87b3o31b2o 19bo8bo24b2o100b2o12b2o$1082b2o2b2obob2o8bo69b2o30bo33b2o87bo34bo17bob o6bobo9b2o$1081bo2b2o2b2obo31b2o236bobo15b2o7b2o11bo54b2o15b2o$902bo 165bo11bob2o2b2obobo23b2o5bobo94b3o140b2o4bo6b2o24bobo52b2o15bobo42b2o $903bo87b2o74bobo10bo3b2o4bo9bo14b2o5bo49b2o45bo2bo144bobo4bo2bo24b2o 10bo60bo42b2o3b2o$901b3o34bo52b2o17b2o56b2o11b3obob3o9b3o18bobo49b2o 17b2o25bo148bobo5b2o36bobo59b2o46b2o$937bo72b2o52b2o17bo3bo10bobobo17b 2o69b2o25bo4bo144bo10b2o32bobo$935bobo125bobo30b3o3b3o11b2o105bo18b2o 75b2o58bobo32bo4b2o10b2o$934bo2bo125bo5b2o14bo5b2o2bo3bobo3bo10bobo 123b2o76bo60bo11b2o7b2o15bobo9bo172bo$933b2ob2o73b2o48bobo5b2o14bo5bo 2bob2o4b2obo11bo102bo99bobo15b2o41b2o9bobo6bobo17bo7bobo171bo$934bobo 74bo49b2o30b2o4b3o2bo115bo100b2o15b2o26b2o24bo8bo19b2o6b2o83bo88b3o$ 935bo62b2o12b3o69bo9bobo5b2o117b3o143bo18b2o2b2ob4o3b2o67bo44b3o$981b 2o16bo14bo68bobo8bo3bo2bo86b2o174b3o19bo2bobobo2bo70b3o47bo$981bo14b3o 79b3o2b2o10b2ob4o86bo20b2o153bo23b2obob2o2b2o67bo49b2o51bo$960b2o20b3o 11bo83bo6b2o8bo17b2ob2o13b2o55bo19bo178bob2o2b2o2bo66b2o20bo80bobo$ 961bo22bo94bo7bobo7bobo13b3obob3o11b2o54b2o16b3o150b2o5b2o20bobob2o2b 2obo69b2o16b3o78b2o22bo$958b3o121b2o5bo8b2o12bo4bo4bo62b2o20bo152b2o5b o8b2o12bo4b2o3bo70bo19bo101bobo$958bo24bo18bo79b2o5b2o20bobob2o2b2obo 23b2o37bo179bobo7bobo13b3obob3o11b2o56bo20b2o11b2o88b2o$983b3o6b2o6b3o 108bobo3b2o2bo24bobo37b3o176b2o8bo17bo3bo13b2o56b2o32b2o$986bo5b2o5bo 86bo23b2obob2o2b2o27bo39bo172b2o6b2o2b2ob4o$985b2o12b2o85b3o19bo2bobo 4bo29b2o211bobo5bo2bobobo2bo15bo$1089bo18b2o2b2ob4o3b2o238bo8b2ob2o4b 2o13bo$886bo156b2o15b2o26b2o24bo8bo19b2o194b2o31bobob4o2bo$884bobo111b 2o42bobo15b2o41b2o9bobo6bobo17bo195bobo5b2o23bob2obo2b2obo11bo$885b2o 106b2o3b2o42bo48b2o10bo11b2o7b2o15bobo197bo5b2o24bo4bo4bo10bobo75b2o$ 993b2o46b2o58bobo24b2o6bo4b2o51b2o145bobo18b3o9b3o3b3o11b2o57b2o17b2o 98bobo$1096b2o3b2o24bo2bo4bobo56bo147b2o17bobobo10bobobo17b2o53b2o117b 2o$1096bobo29b2o5bobo37b2o15bobo151b2o11b3o3b3o9b3o18bobo172bo$1096bob 2o24b2o10bo38b2o15b2o151bobo10bo4bo4bo2b2o20b2o5bo$1084b2o9b4o24bobo 220bo11bob2o2bob2obo2bo20b2o5bobo49b2o$935bo67bo79bobo5b2obo2bo3b2o7b 2o11bo235bo2b4obob2o30b2o50bo$936b2o63b3o44bo34bo8bo2bo5bobo6bobo9b2o 222bo13b2o4b2obo9bo70b3o12b2o96bo$935b2o63bo47b3o31b2o9b2o8bo8bo24b2o 207bo15bo2bobobo8bobo69bo14bo16b2o77b2o$1000b2o49bo51b2o3b4ob2o2b2o18b o8b2o5b2o115bo91b4ob2o10b2o85b3o14bo78b2o$1029bo20b2o56bo2bo3bo2bo19b 3o6bo5b2o87b2o24b3o58b2o13bo3bo17bo8b2o91bo11b3o20b2o$956bo70b3o16b2o 30b2o26b2o5bob2o23bo6bobo93bo23bo61b2o11b3obob3o13bobo7bobo103bo22bo$ 957bo68bo19bo32bo25bo2b3o4bo32b2o82bo10bobo21b2o72bo3b2o4bo12b2o8bo5b 2o122b3o$955b3o55b2o11b2o20bo30bobo22bob2o4b2obo36b2o76b3o11b2o70b2o 23bob2o2b2obobo20b2o5b2o79bo18bo25bo$902bo110b2o32b2o31b2o22bo3bobo3bo 12b2o22bobo60bo14bo85bobo24bo2b2o2b2obo108b3o6b2o6b3o$900bobo189b2o11b 3o3b3o13bobo22bo61b3o12b2o84bo27b2o2b2obob2o23bo86bo5b2o5bo$901b2o189b 2o13bobobo17bo44b2o41bo64b2o30b2o29bo2bobobo2bo19b3o85b2o12b2o$1108b3o 14b4ob2o2b2o30b2o5bobo40b2o64b2o56b2o3b4ob2o2b2o18bo163bo$1109bo15bo4b obo2bo15bo14b2o5bo145b2o19bo8bo24b2o26b2o15b2o117bobo$1040b2o3b2o76b2o 2b2obob2o16b3o18bobo146bo17bobo6bobo9b2o41b2o15bobo42b2o72b2o$1030b2o 3b2o2b3o2b3o75bo2b2o3bobo16bobobo17b2o44b2o101bobo15b2o7b2o11bo60bo42b 2o3b2o$952bo76bobo3b5o23b2o44bo11bob2o2b2obobo14b3o3b3o11b2o48b2o17b2o 83b2o4bo32bobo58b2o46b2o$950bobo76bo3bo2bo2bo23b2o43bobo10bo4bo4bo10b 2o2bo3bobo3bo10bobo66b2o88bobo32b2o10bo$951b2o76b2o3bo4b2o3bo2bo61b2o 11b3obob3o11bo2bob2o4b2obo11bo118b2o37bobo36b2o5bobo$1034bo3b5ob4o57b 2o17b2ob2o15b2o4b3o2bo4bo126b2o38bo10b2o24bo2bo4bobo$1033bo7b4ob2o16b 2o38bobo38bobo5b2o5bobo175bobo24b2o6bo4b2o10b2o$1042b2o20bo39bo5b2o33b o3bo2bo7b2o178bo11b2o7b2o15bobo9bo69bo$1051b2o12b3o34bobo5b2o34b2ob4o 187b2o9bobo6bobo17bo7bobo24bo44b3o$1034b2o16bo14bo34b2o44bo17b2ob2o13b 2o47b2o32b2o56b2o24bo8bo19b2o6b2o23b3o47bo$1034bo14b3o73bo22bobo13b3ob ob3o11b2o47bo20b2o11b2o57bo18b2o2b2ob4o3b2o51bo49b2o77bobo$1013b2o20b 3o11bo74bobo22b2o12bo4bo4bo61bo19bo67b3o19bo2bobobo2bo56b2o20bo106b2o$ 1014bo22bo86b2o36bobob2o2b2obo23b2o35b2o16b3o68bo23b2ob2o4b2o58b2o16b 3o99bo5bo$1011b3o114b2o32bobo3b2o2bo24bobo30b2o20bo95bobob4o2bo58bo19b o96b2o$938bo72bo116bobo6bo23b2obob2o2b2o27bo30bo110b2o5bob2obo2b2obo 55bo20b2o11b2o84b2o$936bobo184b2o5bo6b3o19bo2bobo4bo29b2o30b3o101b2o4b obo5bo4bo4bo55b2o32b2o$937b2o18bo66bo18bo79b2o5b2o8bo18b2o2b2ob4o3b2o 58bo100bobo4bo8b3o3b3o11b2o$958bo65b3o6b2o6b3o95b2o24bo8bo19b2o138bo 17bobobo13b2o$956b3o68bo5b2o5bo113b2o9bobo6bobo17bo133b2o2b2ob4o14b3o$ 1026b2o12b2o112bo11b2o7b2o15bobo133bo2bobobo2bo$1152bobo24b2o6bo4b2o 136b2obob2o2b2o$1084b2o15b2o38bo10b2o24bo2bo4bobo142bob2o2b2o2bo76b2o$ 1039b2o42bobo15b2o37bobo36b2o5bobo50b2o90bobob2o2b2obo11bo44b2o17b2o$ 1034b2o3b2o42bo56bobo32b2o10bo51bo92bo4b2o3bo10bobo43b2o$1034b2o46b2o 51b2o4bo32bobo43b2o15bobo93b3obob3o11b2o$1134bobo15b2o7b2o11bo45b2o15b 2o96bo3bo17b2o153bobo$1134bo17bobo6bobo9b2o18b2o162bobo38b2o112b2o$ 1133b2o19bo8bo24b2o2bo2bo141bo14b2o5bo39bo113bo$926bo227b2o3b4ob2o2b2o 18bo3bo2bo141bo14b2o5bobo34b3o12b2o$876bobo48b2o23bobo89bo114bo2bo3bo 2bo19b3ob2o165b2o34bo14bo16b2o$877b2o47b2o25b2o87b3o44bo39b2o26b2o5bob 2o24bo5b2o138bo73b3o14bo$877bo75bo87bo47b3o38bo25bo2b3o4bo22b2obo5b2o 137bobo74bo11b3o20b2o$1041b2o49bo37bobo22bob2o4b2obo22b2obobo117bo25b 2o86bo22bo$1070bo20b2o38b2o22bo3bobo3bo12b2o13b2o89b2o24b3o21b2o114b3o $1068b3o16b2o54b2o11b3o3b3o13bobo16b2o86bo23bo23bobo116bo$1067bo19bo 55b2o13bobobo17bo15bobo75bo10bobo21b2o22bo5b2o$1054b2o11b2o20bo69b3o 14b4ob2o2b2o10bo74b3o11b2o44b2o5b2o79bo18bo76bo$1054b2o32b2o70bo15bo4b obo2bo32b2o35bo14bo148b3o6b2o6b3o75bo$1174b2o2b2obob2o26b2o5bobo35b3o 12b2o150bo5b2o5bo78b3o$1173bo2b2o3bobo12bo14b2o5bo40bo64b2o96b2o12b2o 43bo$1160bo11bob2o2b2obobo11b3o18bobo39b2o64b2o155bobo$1159bobo10bo4bo 4bo11bobobo17b2o143b2o15b2o101b2o24bo$1160b2o11b3obob3o10b3o3b3o11b2o 147b2o15bobo42b2o82bobo$914bo28bo141b2o69b2o17b2ob2o7b2o2bo3bobo3bo10b obo44b2o119bo42b2o3b2o77b2o$915b2o24bobo141b2o17b2o49bobo29bo2bob2o4b 2obo11bo45b2o17b2o100b2o46b2o$892bobo19b2o26b2o14bo145b2o49bo5b2o26b2o 4b3o2bo77b2o$893b2o64b2o192bobo5b2o27bobo5b2o129b2o$893bo64b2o193b2o 35bo3bo2bo131b2o$1105b2o69bo14b2ob4o$1105bo69bobo15bo17b2ob2o13b2o188b o$1092b2o12b3o66b2o16bobo13b3obob3o11b2o143bo44b3o$1075b2o16bo14bo70b 2o13b2o12bo4bo4bo56b2o32b2o61b3o47bo61bobo$1075bo3bo10b3o86bobob2o22bo bob2o2b2obo23b2o31bo20b2o11b2o60bo49b2o61b2o$1054b2o20b4o10bo83b2o5bob 2o22bobo3b2o2bo24bobo32bo19bo73b2o20bo91bo$1055bo38bo79b2o5bo24b2obob 2o2b2o27bo31b2o16b3o78b2o16b3o14bo$1052b3o19b4o6b2o6b3o84b2ob3o19bo2bo bo4bo29b2o26b2o20bo81bo19bo13bo2b2o62bo$1052bo21bo3bo5b2o5bo86bo2bo3bo 18b2o2b2ob4o3b2o52bo101bo20b2o12bo5bo59b2o$1077b2o12b2o85bo2bo2b2o24bo 8bo19b2o32b3o98b2o34bobo2b2o59b2o$931bo247b2o18b2o9bobo6bobo17bo35bo 134bo3b2o$929bobo16bo186b2o15b2o45bo11b2o7b2o15bobo172b3o$930b2o17bo 140b2o42bobo15b2o43bobo32bo4b2o$947b3o135b2o3b2o42bo51bo10b2o32bobo$ 1085b2o46b2o50bobo5b2o36bobo$1185bobo4bo2bo24b2o10bo144b2o$1180b2o4bo 6b2o24bobo59b2o75b2o17b2o$1179bobo15b2o7b2o11bo61bo76b2o$1179bo17bobo 6bobo9b2o42b2o15bobo174bobo$1095bo82b2o19bo8bo24b2o27b2o15b2o175b2o$ 915bo177b3o44bo58b2o3b4ob2o2b2o18bo117bob2o2b2o47b3o42bo5bo$913bobo 176bo47b3o61bo2bo3bo2bo19b3o114b2obo3bo47b3o40b2o$914b2o176b2o49bo30b 2o26b2o5bob2o6bo16bo118b3o12b2o34bo43b2o$1121bo20b2o31bo25bo2b3o4bo7b 2o149bo16b2o$936bo182b3o16b2o35bobo22bob2o4b2obo6bobo12b2o5b2o89b2o24b 3o11b3o14bo$937bo180bo19bo37b2o22bo3bobo3bo12b2o9bo5b2o90bo23bo3bob2o 9bo11b3o20b2o$935b3o167b2o11b2o20bo47b2o11b3o3b3o13bobo8bobo59bo24bo 10bobo21b2o2b2obo21bo22bo$1105b2o32b2o47b2o13bobobo17bo9b2o57b2o23b3o 11b2o74b3o$1204b3o14b4ob2o2b2o7b2o54b2o6bo14bo92bo$1205bo15bo4bobo2bo 6bobo62b3o12b2o$1219b2o2b2obob2o9bo66bo64b2o$1218bo2b2o3bobo32b2o42b2o 64b2o54bobo$1205bo11bob2o2b2obobo9bo14b2o5bobo164b2o$1136b2o66bobo10bo 4bo4bo10bo14b2o5bo167bo$1136b2o17b2o48b2o11b3obob3o31bobo45b2o$929bobo 223b2o44b2o17b2ob2o11bo3bo17b2o46b2o17b2o$930b2o268bobo31b3obob3o11b2o 69b2o$930bo269bo5b2o21b2o2bo4b2o3bo10bobo119b2o$1156b2o40bobo5b2o21bo 2bobob2o2b2obo11bo120b2o$1156bo41b2o31b2ob2o2b2o2bo$1143b2o12b3o61bo 10bobob2o2b2o$1126b2o16bo14bo60bobo9bobobo2bo$1126bo14b3o76b2o11b2ob4o 14b3o65b2o32b2o73bo$1105b2o20b3o11bo82b2o9bo17bobobo13b2o49bo20b2o11b 2o72bo$1106bo22bo94bobo8bobo13b3o3b3o11b2o51bo19bo85b3o$1103b3o113b2o 5bo9b2o12bo4bo4bo62b2o16b3o80bo$1103bo16bo18bo79b2o5b2o21bob2obo2b2obo 23b2o33b2o20bo82bobo$1120b3o6b2o6b3o109bobob4o2bo24bobo32bo104b2o$ 1123bo5b2o5bo87bo23b2ob2o4b2o27bo33b3o$935bo186b2o12b2o86b3o19bo2bobob o2bo29b2o34bo$936b2o289bo18b2o2b2ob4o3b2o$935b2o243b2o15b2o27b2o24bo8b o19b2o$1135b2o42bobo15b2o42b2o9bobo6bobo17bo$1130b2o3b2o42bo61bo11b2o 7b2o15bobo$1130b2o46b2o59bobo24b2o6bo4b2o$1228bo10b2o24bo2bo4bobo52b2o $1227bobo5b2o29b2o5bobo52bo$1227bobo4bo2bo24b2o10bo34b2o15bobo$1222b2o 4bo6b2o24bobo17b2o26b2o15b2o$1140bo80bobo15b2o7b2o11bo20bo$1138b3o44bo 35bo17bobo6bobo9b2o17b3o$1137bo47b3o32b2o19bo8bo24b2o2bo$1137b2o49bo 52b2o3b4ob2o2b2o18bo$1166bo20b2o57bo2bobobo2bo19b6o5b2o$1164b3o16b2o 31b2o26b2o2b2obob2o26bo5b2o$1145bobo15bo19bo33bo25bo2b2o2b2obo24bo2bob o$1140b3o7b2o11b2o20bo31bobo22bob2o2b2obobo22b3o3b2o$1140bo2b2o4bobo 32b2o32b2o22bo3b2o4bo12b2o8bo10b2o$1140b2ob4o83b2o11b3obob3o13bobo7b2o 8bobo51bobo$1142b3o85b2o13bo3bo17bo18bo52b2o$1263b4ob2o2b2o34b2o30bo$ 1247bo15bo2bobobo2bo26b2o5bobo$1247bo13b2o4b2ob2o13bo14b2o5bo$1181b2o 77bo2b4obobo13b3o18bobo$1181b2o17b2o45bo11bob2o2bob2obo12bobobo17b2o$ 1200b2o44bobo10bo4bo4bo11b3o3b3o11b2o$1247b2o11b3o3b3o7b2o2bo3bobo3bo 10bobo$1243b2o17bobobo9bo2bob2o4b2obo11bo$1201b2o27b3o9bobo18b3o12b2o 4b3o2bo$1201bo28bo11bo5b2o29bobo5b2o$1188b2o12b3o26bo8bobo5b2o29bo3bo 2bo$1171b2o16bo14bo31bo3b2o38b2ob4o$1171bo14b3o45bo2bo25bo18bo17b2ob2o 13b2o$1150b2o20b3o11bo46bo4bo23bobo8b2o7bobo13b3obob3o11b2o$1151bo22bo 57bo5bo23b2o10bo8b2o12bo4bo4bo$1148b3o84b2ob2o26b2o3b3o22bobob2o2b2obo 23b2o$1148bo84bob2o29bobo2bo24bobo3b2o2bo24bobo$1233bo2b2o23b2o5bo26b 2obob2o2b2o27bo86bo$1162bo18bo52b3o24b2o5b6o19bo2bobo4bo29b2o83b2o$ 1162b3o6b2o6b3o53bo38bo18b2o2b2ob4o3b2o110b2o$1165bo5b2o5bo91bo2b2o24b o8bo19b2o$1164b2o12b2o88b3o17b2o9bobo6bobo17bo$1267bo20bo11b2o7b2o15bo bo$1115bobo104b2o15b2o26b2o17bobo24b2o6bo4b2o$1084bo31b2o59b2o42bobo 15b2o34bo10b2o24bo2bo4bobo$1082bobo31bo55b2o3b2o42bo52bobo5b2o29b2o5bo bo$1083b2o87b2o46b2o52bobo4bo2bo24b2o10bo$1257b2o10b2o4bo6b2o24bobo$ 1258bo9bobo15b2o7b2o11bo$1258bobo7bo17bobo6bobo9b2o113bo$1259b2o6b2o 19bo8bo24b2o98bobo$1182bo105b2o3b4ob2o2b2o18bo99b2o$1180b3o44bo65bo2bo 3bo2bo19b3o$1179bo47b3o61b2o5bob2o23bo62bo$1179b2o49bo59bo2b3o4bo86bo$ 1208bo20b2o58bob2o4b2obo86b3o22bo$1206b3o16b2o62bo3bobo3bo12b2o97bo$ 1132bo72bo19bo51b2o11b3o3b3o13bobo96b3o$1133bo58b2o11b2o20bo49b2o13bob obo17bo$1131b3o58b2o32b2o65b3o14b4ob2o2b2o$1145bobo146bo15bo4bobo2bo$ 1146b2o160b2o2b2obob2o$1067bo78bo160bo2b2o3bobo$1068bo225bo11bob2o2b2o bobo$1066b3o206b2o16bobo10bo4bo4bo$1223b2o50bobo16b2o11b3obob3o76bo$ 1223b2o17b2o31bo14b2o17b2ob2o76b2o$1242b2o45bobo99b2o$1289bo5b2o$1287b obo5b2o$1243b2o42b2o$1116bobo124bo40b2o24bo$1117b2o111b2o12b3o37b2o23b obo68bobo$1117bo95b2o16bo14bo37b2o23b2o69b2o$1213bo14b3o82b2o66bo$ 1192b2o20b3o11bo54bo29bobo$1138bo54bo22bo64bobo24b2o5bo$1136bobo51b3o 16bo18bo53b2o24b2o5b2o$1083bo53b2o51bo18b3o6b2o6b3o$1084bo127bo5b2o5bo 54b2o$1082b3o126b2o12b2o53bo2b2o$1280bo3bo72bo$1269b2o10b3o2b2o68bo$ 1224b2o42bobo15b2o68b3o$1219b2o3b2o42bo$1133bo85b2o46b2o$1134bo$1132b 3o3$1229bo$1227b3o44bo$1226bo47b3o$1226b2o49bo83bo$1255bo20b2o81b2o$ 1253b3o16b2o86b2o$1252bo19bo80bobo$1119bo119b2o11b2o20bo78b2o$1120bo 118b2o32b2o79bo$1118b3o$1139bo$1137bobo$1138b2o2$1270b2o$1270b2o17b2o 4b2o$1289b2o4bo$1296bo$1295b2o35bo$1290b2o2bo35b2o$1290bo3bo36b2o$ 1277b2o12b3o$1058bo48bobo24bo143bo10bobo$1059b2o47b2o25b2o125b2o11b3o 11b2o$1058b2o48bo25b2o103b2o21bobo10bo$1240bo23bo$1237b3o24b2o$1237bo 3$1334bo$1334bobo$1300bo33b2o$1299bo$1299b3o24bo$1325bo$1124bo200b3o$ 1095bobo27bo$1074bo21b2o25b3o$1075b2o19bo42bobo$1074b2o64b2o$1140bo3$ 1304bo$1302b2o$1303b2o$1272bo$1271bo$1271b3o20bobo$1294b2o$1112bo182bo $1113bo$1111b3o16bo$1128bobo$1129b2o4$1276bo$1274b2o$1096bo178b2o$ 1097bo170bobo$1095b3o170b2o$1269bo2$1118bo$1116bobo$1117b2o4$1247bo$ 1245b2o$1246b2o2$1111bo$1112b2o$1111b2o6$1249bo$1249bobo$1243bo5b2o$ 1242bo$1242b3o3$1116bobo$1117b2o$1117bo103$1397b2o$1397b2o7$1405b2o$ 1405b2o2$1384b2o$1385b2o$1384bo$1391b3o11b3obo$1390bo2bo10bobo6bo$ 1389bo4bo9bobo2b4obo$1389bo5bo8b2o2b2o2bobo$1389b4o2bo10bobo4bo2$1393b o$1394b2o3$1400b2o$1399bo2bo$1400b2o2$1412b2o$1411bo2bo$1405bo4bo$ 1398bo4bo2bo2bo$1397b2o4bo2bo2bo4b2o$1397bobo3bo5bo4bob2o$1398bo5bobo 4b3obo$1397bobo4bobo$1397bobo3$1395b5o$1394bob4o$1393bo$1394b2o$1369bo $1367b2ob2o25b3o$1364b5o$1364bo2bo$1364bo2bo$1365b2o$1359b2o$1359b2o4$ 1375b2o12bo$1374b2ob2o10bo$1374bo2b2ob2o6bo$1367b2o5b4o4b2o5b2obo$ 1367b2o6b2o2b2ob2o5b2ob2o$1357b2o31bobo$1357b2o$1375bo$1373b2ob3o$ 1374b2ob2o$1374b2obobo81b2o$1375bo2b2o81b2o$1375b2obo$1365b2o10b3o$ 1365b2o12b2o$1377bob2o$1377bobo$1378bo$1331bobo135b2o$1331b2o136b2o$ 1332bo$1376b2o$1375bo$1375bo$1375b7o$1350b2o12bo11bo5bo$1349b2o13bo12b 3o2bo73b2o$1349b3o11bo13bo4bo72bo2bo13b2o$1357bo6b2obo10bo2bo74b2o14bo 2bo$1346bo4bob2obobo5b2ob2o9b3o91bo3bo$1345b2o4bo2bo2bo7bobo105b3o$ 1345bobo3bobo84bo$1346bo91b2o$1345bobo89bobo30bobo$1345bobo116b2o3bo3b o$1463bo2bo7b2o$1464b2o3bo5bo$1325bo17b5o121bo6bo$1324bobo15bob4o122b 2o4bo$1324bobo14bo134bo$1325bo16b2o128bo3bo$1472bo3bo$1345b3o125bobo$ 1308b2o163b3o$1308b2o145bobo$1333bo114b2o3b2obo$1332bobo113b5ob2o3b2o$ 1332bobo113bob2obobo3b2o$1333bo115b2o4bob2o2bo$1448b3o5bobobo$1448b3o 7bobo$1316b2o17b2o105b2o$1316b2o16bo2bo103b2o$1328bo4bo108b2o$1326bo2b o2bo110b3o$1326bo2bo2bo4b2o105bobo$1326bo5bo4bob2o103bo2bo$1327bobo4b 3obo108bo$1327bobo115bobo$1423b2o20b3o$1423b2o$1413b2o$1413b2o$1409b3o $1408bo2bo32b2o$1408bo4bo29bo2bo$1407b2ob2obo29b2o72b2o$1407b2obo2bo 17b2o11b5o68b2o$1409b4o18b2o15b2o$1410b3o8b2o22b2o2b2o$1421b2o22bo2b2o $1407bo38b3o$1405b2o40bo$1406b2o$1507b2o16b2o$1430bo77b2o15b2o$1428b2o b2o8b4o62bo$1426bo2bo3bo6b2o4bo$1425bo3bo4bo5b3o4bo$1424b2ob2o5bo7bo5b o$1425bo3bo4bo5b2o73bo$1425b2o3bob2o6b2o2b2o4bo62b2ob2o$1420bobo17bo9b o58b2o2b4o10bo5b2o$1419b2ob2o17bo2bo3bo60b3o11bo2bo6b2o$1420bo2bo18bo 64bo2bo11bo$1421b3o19b2obo60bobo13b2o$1445bo$1375bo$1373b2o5b2o$1374b 2o4b3o36b2o$1379bo2bo35bo2bo98b2o$1379bob2o35b2o99bo2bo$1377bo3bo37b5o 96b2o$1375bo4b2o41b2o$1375bo5bo38b2o2b2o$1377b3obo38bo2b2o$1378bo24bob o15b3o111b3o$1379b3o14b2o3b2obo17bo$1396b5ob2o3b2o109bo10bo5bo3bo$ 1364b2o30bob2obobo3b2o109bo8b2obo5b4o$1364b2o37bob2o2bo119bo9bo$1389bo 6bo7bobobo$1388bobo5bo9bobo109bo$1388bobo6bo120b2o$1380b2o7bo128b2o$ 1380bo14bo$1381bo13bo3bo91b2o$1372b2o22b3o93b2o$1372b2o6b3o108bo25bo$ 1381bo99b2o33bo$1381b2o10bobo85b2o33b2o$1392bo3bo84bobob2o31bo$1397b2o 84bo33b3o$1392bo5bo84bobo31b3o$1392bo6bo83bo3bo$1380b2o11b2o4bo82bo4bo $1380b2o17bo83bo3bo$1395bo3bo83b2o$1395bo3bo$1396bobo111bo$1396b3o109b 2ob3o$1507bo2bob3o$1502bobo6b2ob2o$1487b2o13bobo6bo2b3o$1487b2o12bo5b 7o2b3o$1477b2o22bo2bo5bo3bo2bo$1477b2o16b5obo2bo5b7o$1494b2o6bo7b2o2bo $1493bo2bo4bo10bobo$1493bob3ob2o12bo$1492bo2bo3b2o$1493bo3bobo2$1485b 2o$1485b2o3$1498bo$1496b2o2$1470bo$1448bobo18b3o$1448b2o18b2o2bo21b2o 2bo$1449bo18bo3bo21bo2bo$1468bob2o13bo10bobo3b2o$1468b2o13b2ob3o5b3o5b o$1482bo2bob3o4bo7bo$1477bo8b2ob2o11bo$1477bo8bo2b3o$1482b7o2b3o$1485b o3bo2bo$1468b2o15b7o$1468b2o15b2o2bo$1487bobo$1466bo21bo$1466b2o$1466b 2o$1445bo$1444bobo$1444bobo$1445bo19bo$1464bo$1464b2o$1428b2o36bo$ 1428b2o35b3o$1453bo11b3o$1452bobo$1452bobo$1453bo3$1436b2o$1436b2o7b2o $1445bobo10b3o$1444bo$1445bo2bo3bo5bo3bo$1448bo2bobo5b4o$1446b3o3bo9bo $1447b2o8$1637b2o$1637b2o4$1630b2o$1631b2o$1630bo$1645b2o$1645b2o5$ 1631bo$1631bo$1653b2o$1653b2o7$1640b2o$1639bo2bo$1640b2o2$1656bo$1656b ob2o$1655bobob2o$1654b3o4b2o$1648b2o4b3obo2bo2bo$1647bo2bo4bo2b3o3bo$ 1648b2o14bo$1657b4ob2o$1658bo2bo$1614b2o45bo$1615b2o42b2o$1614bo3$ 1599b3o33bo$1634bo$1599b2o32b2ob4o$1605b2o27bob5o$1605bobo26bo6bo$ 1605b3o27b3o2b3o$1605b2o29bobob2o$1605bo30b2ob2o$1637b3o$1638bo$1628bo b3o$1627bob3obo$1626bo2bo3bo$1630bo$1627bo4bo$1607b2o19b4o$1607b2o$ 1597b2o32bo$1597b2o12bo3b2ob2o10bobo$1609b2o4b2ob2o9bo3bo$1618bo11bobo $1617bo13bo$1616bobo82b2o$1616bobo82b2o$1616bobo$1605b2o$1605b2o$1589b 3o$1588bo3bo2$1593bo115b2o$1588b5o116b2o$1589bo$1621b3o$1621b3o$1603bo b3o13bo$1565bobo34bob3obo4b2ob2o2bo$1565b2o34bo2bo3bo4bo3b4o3b3o57bo 19bob2o$1566bo22b2o14bo7bobob2obo63b2o10b2o5bo2b2o2b3o2bo$1589b2o11bo 4bo13bo61bobo9bo2bo4bo6b2o3bo$1603b4o89b2o5b2o4b2o4bo$1586b2o117bo$ 1585bo2bo17bo100b2o$1585bobo17bobo$1583b2obo17bo3bo$1583b3o19bobo$ 1583b2o21bo97b2o$1703bo2bo$1704b2o$1565bo$1564bobo$1564bobo$1565bo17bo 126bobo$1582bo126b2ob3ob2o$1581b2ob4o113b2o6bo4b4o$1548b2o32bob5o110b 4o5b3o5b2o$1548b2o32bo6bo120bo$1573bo9b3o2b3o97b3o8bobo4bo10b3o$1572bo bo9bobob2o98bo2bo9bo$1572bobo9b2ob2o97b2o3bo7bobo$1564b3o6bo11b3o98b2o bobo6bo$1564bo2bo18bo99b2ob2o8bo3b2o3bo$1563bo3bo120bo11bo$1556b2o5b4o 12bo91b3o10b2o15bob2o$1556b2o6bo14bob2o88b2ob2o8b2o16b3o$1578bobob2o 87b2ob2o27b2o$1572bo4b3o4b2o87b2o$1571bobo3b3obo2bo2bo$1578bo2b3o3bo$ 1564b3o20bo$1580b4ob2o$1581bo2bo78b2o$1584bo78b2o$1582b2o3$1690bo$ 1651bo37b3o$1650b3o$1671b2o9bobo4bo3bo$1671b2o8b5ob2o4bo$1650b3o8b2o 18bo3bo2bobo2bo$1651bo9b2o25bo3$1682bo$1684bo$1681bo$1667b2o11b2ob2o$ 1641bo24bo2bo12bo$1639b2o29bo$1640b2o23b2o2bo11b2o$1680bo$1680bo2bo$ 1678b2obo$1680bo2b3o$1678b2o$1684b2o$1681b2ob2o$1682bobo$1683bo$1665bo $1664b3o2$1657bobo4bo3bo$1609bo46b5ob2o4bo$1607b2o40b2o5bo3bo2bobo2bo$ 1608b2o37b4o12bo2$1647bobo4bo$1649bo$1604b2o41bobo$1604b2o40bo$1629bo 17bo3b2o3bo$1628bobo17bo$1628bobo18bob2o$1629bo20b3o$1651b2o2$1612b2o$ 1612b2o$1637bo$1636bobo$1636bobo$1637bo3$1620b2o$1620b2o$1633bobo$ 1632b2ob3ob2o$1632bo4b4o$1631b3o5b2o$1633bo$1640b3o7$1981bo$1821b2o 157bobo$1821b2o158bo3$1975b2o$1975b2o23b2o$1967b2o31bo$1968bo29bobo$ 1829b2o137bobo27b2o$1829b2o138b2o4b2o$1975b2o2$1807bo201b2o$1807b2o23b obo132b2o40bo$1806bobo10bo11bo3bo131bo39bobo$1817bo2bo9bo5bo132bob2o 34b2o$1815b2o13b3o4bo130b2ob2o$1815b2o14bob2obo152b2o$1815b2o151b2ob2o 16b2o$1817bob2obo146bobo$1819b3o147bobo$1819b2o149bo3$1824b2o$1823bo2b o$1824b2o2$1831bo$1831bo164b2o$1836b3o145bo11b2o$1837bo144b3o$1823bo5b o6b3o119bo22bo$1818bobobobo4b4o4b5o104bo11b3o20b2o$1819bo3bo4bo3b4ob2o 105b3o14bo34b2o$1807b2ob2o7b2o8bo4b2o92bo14bo16b2o34b2o$1810b2o7bobo 15b2o89b3o12b2o$1807b2ob2o7bo2bo108bo58b2o$1809b3o7b2ob2o106b2o59bo$ 1803b3o4b2o179bobo$1810b2o8bo3bo167b2o$1795bo8b2o14bo3bo106b2o$1795b2o 23bo3bo106b2o17b2o$1794b3o24b3o126b2o$1789bobo2bo$1789bobob2o$1789b3o 2$2017b2o$1783b2o162b2o32b2o34bo$1783b2o162bo20b2o11b2o35b3o$1949bo19b o50bo$1948b2o16b3o$1809bo134b2o20bo42b2o$1810bo133bo64b2o$1800bo10bo 133b3o$1799b3o11b2o132bo$1791b2o6bo2bo3bo6b3o$1791b2o9b2o2b3o7bo$1781b 2o19bo4b9o$1781b2o18bo6b7o113b2o$1800b2o8b3o114bobo$1799bobo125bo25b2o $1799bo4bo121b2o25bo50b2o$1799bob2obo129b2o15bobo50bo$1802b2obo128b2o 15b2o52b3o$1803bo203bo$1789b2o12b2o$1789b2o12b2o$1803bo$1758bo43bobo$ 1756b2o45bo$1757b2o4$1800b3o145b2o2b2ob2o$1800bo3bo128b2o13bobo2bobo$ 1784bo16b2obo127bobo16b2o3bo$1785bo146bo19bob2o$1775bo10bo15b3o126b2o 16bo2bobo$1774b3o11b2o12b3o143bobobobo$1774bo2bo3bo6b3o158b2ob2o$1777b 2o2b3o7bo$1771bo5bo4b9o$1766bobobobo3bo6b7o$1767bo3bo13b3o$1767b2o$ 1767bobo$1767bo2bo172b2o$1767b2ob2o171b2o$1749bo$1748bobo17bo3bo$1748b obo17bo3bo$1749bo18bo3bo$1769b3o$1932b2o$1732b2o199bo19b2o$1732b2o199b obo17bo$1757bo176b2o15bobo$1756bobo187bo4b2o$1756bobo186bobo$1757bo 187bobo$1934b2o10bo$1933bobo$1740b2o12bo178bo$1740b2o12bo176bobo$1759b 3o168bobo14b2o158b2o$1760bo170bo15bo159b2o$1752bo6b3o186b3o161bo$1752b 4o4b5o185bo159b3o$1751bo3b4ob2o347bo$1752bo4b2o350b2o$1760b2o325b2o$ 2087b2o6$2099b2o$2099b2o$2113b2o$2113b2o$2117b2o$2117b2o5$2095b2o38b2o 6bo$2094bo2bo33bobo2bo4b3o$2095bobo31b3ob2o5bo$2096bo31bo11b2o$2129b3o b2o$2131bob2o3$2139b2o3b2o$2139b2o3b2o4$2149bo$2148bobo$2149bo$2087bo$ 2087b3o$2090bo$2089bobo$2090bo2$2131b2o$2091b2o19bo18b2o$2091b2o17b3o$ 2109bo$2109b2o3$2114b2o3b2o$2114b2o3b2o$2141b2o$2141bo$2142b3o$2144bo 3$2085b2o$2084bobo$2084bo$2083b2o49b2o$2134bo$2095b2o38b3o$2095b2o40bo 7$2100b2o$2099bobo$2099bo$2098b2o19$1795bo$1793b3o$1767b2o23bo$1768bo 23b2o$1768bobo68bo$1769b2o2b2o37bo25bobo$1773b2o35b3o15bo10bo$1809bo 18b3o5b3o$1796b2o11b2o20bo3bo$1796b2o32b2o3b2o8$1767b2o52b2o$1766bobo 16b2o34b2o$1766bo18bobo45b2o$1765b2o20bo44bo2bo$1781b2o4b2o44b2o4b2o$ 1781bo2bo23b2o3bo25bobo$1783b2o23bo3bobo26bo$1774b2o33bo3b2o26b2o$ 1774b2o20b2o12bo20b2o$1797bo10bob5o17bo$1794b3o11b2o4bo14b3o$1794bo16b 3o15bo$1808b2obo$1808bobo2$1764b2o$1765bo$1765bobo$1766b2o2$2063bo$ 2062bobo$2063bo$1784b2o$1738bo6b2o37bo$1738b3o4bo2bobo31bobo$1741bo5b 2ob3o29b2o$1740b2o11bo$1747b2ob3o$1747b2obo3$1736b2o3b2o$1736b2o3b2o4$ 1732bo$1731bobo30b2o15b2o$1732bo30bobo15b2o$1763bo$1762b2o303b2obo$ 2067b2ob3o$2073bo$2067b2ob3o$2068bobo$1749b2o296b2obo17bobo$1749b2o18b o277b2ob3o16bo$1769b3o281bo$1772bo274b2ob3o$1771b2o275bobo$2048bobo$ 2049bo$1761b2o3b2o$1761b2o3b2o$1739b2o$1740bo$1737b3o$1737bo3$1795b2o$ 1795bobo$1797bo$1746b2o49b2o235b2obo$1747bo286b2ob3o$1744b3o38b2o253bo $1744bo40b2o247b2ob3o$2035bobo$2035bobo$2036bo4$1780b2o$1780bobo$1782b o$1782b2o2$2028b2obo$2028b2ob3o$2034bo$2028b2ob3o$2029bobo$2029bobo$ 2030bo6$2015b2obo$2015b2ob3o$2021bo$2015b2ob3o$2016bobo$2016bobo$2017b o7$1997b2obo$1997b2ob3o$2003bo$1997b2ob3o$1998bobo$1998bobo$1999bo9$ 1972bo$1971bobo$1972bo3$1992b2obo$1992b2ob3o$1998bo$1992b2ob3o$1993bob o$1993bobo$1994bo10$1902bo$1900b3o$1899bo$1899b2o$1845b2o31b2o$1845b2o 32bo$1879bobo$1880bobo$1881bo3b2o$1885b2o2$1863bo$1862bobo39b2o$1862bo 2bo38b2o$1863b2o$1915bo$1852b2o59b3o$1852b2o58bo$1912b2o6$1839b2o$ 1839b2o$1843b2o42b2o$1842bobo41bobo$1842bo43bo$1841b2o42b2o$1854b2o$ 1854b2o35b2o$1891b2o2$1856b2o$1856b2o$1891b2o$1891b2o8$1865bo$1864bobo $1864bobo$1863b2ob2o16b2o$1884b2o$1863b2ob2o$1864bob2o34b2o$1862bo39bo bo$1862b2o40bo$1904b2o2$1870b2o$1864b2o4b2o$1863bobo27b2o$1863bo29bobo $1862b2o31bo$1870b2o23b2o$1870b2o3$1876bo$1875bobo$1876bo! golly-3.3-src/Patterns/Life/Guns/2c5-spaceship-gun-p416.rle0000644000175000017500000021216312026730263020145 00000000000000#C p416 2c/5 spaceship gun: Dave Greene, 11 Apr 2003 #C 64 p416 guns driving 60 Herschel-based glider inserters #C to produce four construction salvos totalling 63 gliders. #C Synthesis of 2c/5 spaceship mostly by Noam Elkies. x = 990, y = 979, rule = B3/S23 864bobo$867bo9boo$863bo4bobboo3bobbo$863boobobboboo3bobobo34boo$867boo 8bobbo22boo10b3o$881bo20bobbo3boobbobbobo$878bobo22bobo3boobboobboo$ 871bo29boobo8boo$871bob3o25b3o$873bobbo24boo$735bo131bo6boo33boo$725b oo8b3o129boo37boo3bo$724bobo11bo5bo117boo9bo32boo5bo$723b3o11boo4bobo 117bo7boo33boo6bo$723boo19bo12b3o103bobo6bobbo13boo22boo$726boo5boo22b 3obo102boo7boo14boo18bo8boo$725b3o5boo23bobobo144bobo8bo$759bobbo143bo bbo6bobo$760boo119bo25boo7boo$725boo7bo6boo128bo8bobo$725boo6boo5b3o 122bo4boo9bo$732boobo5boob3o117bobo3bobo27bo$733bobo6boo3bo12boo103bo 33bobo$734boo6boo3bo11bobo138bo8b3o4bo$725boo16b4o11b3o150bo3bobo$724b obbo30boo150bo5bo$724bobobo23boo7boo$725bob3o22boo6b3o$727b3o12bo101bo 18bo$741bobo100b3o6boo6b3o14boo$742bo17boo85bo5boo5bo17boo$760boo84boo 12boo26b3o$18boo867bobbo11boo$19bo734bo132bo14boo$19bobo205bo524bobo 92boo17bobo21boo3bo$20boo203b3o8boo515boo92boo3boo11bo9bobo11b3obbobo$ 218bo5bo11boo614boo12bobbo8bo14bobbo$204bo12bobo4boo640bobobo3bo4bobb oo10boo18boo$202boobo12bo18bo629bobbo3boobobboboo20boo7b3o$201bo26boo 6bobo455bo121bo51boo8boo24b3o5boboo$200bobobbo22boo5bobbo445boo8b3o 119b3o15bo7bo48b3o4boobbobbobo3bobo$19boo179bobbo30bobbo445bobbo10bo5b o89boo24bo14b3o5b3o53boobboobboo3bobbo$19boo4boo174boo480bo12boo4bobo 12bobo17boo31boo6bo15bo13boo6b3o18bo7bo56boo8boo$25boo187boo4b3o11bobb o445bo19bo12bo20boo30bo6b3o15bobo11boo6bo19boo6boo$212booboo19boo445bo boo5boo23bobbo51bobbo19boo$212bo8bo463boo5boo23bobobo48boo3boo$201boo 9bo4bobobo496bobbo$24boo175boo10bo8bo490bo5boo$20boobboo189b3o11bo6boo 446boo25booboo34boo$19bobo80bo18bo80bo13bobbo6bobo6bobbo445boo21boobb oobbo35boo7boo$19bo12boo68b3o6boo6b3o79bobo5boo10bo4bobo4bobbobo468bo 3bo30bo7bo9bobbo8b4o50boo$18boo11bobo71bo5boo5bo81bobbo5boo26bo469bobb obbo5boo7bo12bobo28bo4bo48boo84boo$31bo72boo12boo79bobbo15bobbo11boboo 464bobo4bobo7bobbo4boobo12bo17bobbo8bo139bo$30boo187bobo12bo449boo16b oo14bo6bo26boo5bobbo11bo3b4obboo124bobo$199bobbo17bo462bobbo15bo15bo5b obobbo22boo5bobo11bo3bobbo3boo124boo$117boo82boo480bobobo23boo5boboobb obbo14bo17bo12b3obboo$112boo3boo565bobbo23boo7boo3boo13bo3bo28b3o$112b oo91bo482bo12bo43bo14boo4boo55boo$32boo171bo479bobo12bobo35boo5boo13b oo3bobo55bo$31bobo171bo495bo17boo17bo8bo17bo38boo3boo13bo$31bo687boo4b oo11bo4bobo18boo39bo3bo13boo86boo$30boo91bo7bo14boo53b3o521bobbo10b3o 3bobbobboo21boo26b3o5b3o92boo4boo$121b3o5b3o14bo24boo571bobboobobbo6b oo12bo27bo9bo92boo$120bo7bo18b3o6boo13bo15bo7bo11b3o17boo496bobbo15b3o 4boo6bobbo12b3o$120boo6boo19bo6boo11bobo15b3o4boo31boo495bobbo5boo10bo 11bobbobo14bo11boo$169boo19bo3boo528bobo6boo26bo23boobboo20bo18bo$137b o51boo3bo530bo18bo12boboo23bobo24b3o6boo6b3o75boo$135bo3bo597boo4bobo 12bo26bo28bo5boo5bo78boobboo$40boo98bo584boo11bo5bo68boo12boo81bobo$ 40boo91boo5boo583boo8b3o43boo4boo109boo12bo$133bo8bo61boo67bo461bo43bo boo4bo110bobo11boo$47boboo82bo4bobo63boo17bo47b3o8boo494bo9b3o23boo84b o$47boobo83b3o3bobbo78bobo12boo25bo5bo11boo497bo8bo23boo3boo79boo$139b obboo79bo13b3o23bobo4boo505boobo38boo$57boo80b3o38boo21boobo5boo23boob o8b3o12bo512boo$58bo35bobo43bo39boo22bobo5boo25bobo5bob3o22boo6b3o438b o3boo$30boo26bobo34boo95boo11bo12b3o10boo5bobbo4bobobo23boo7boo437bobb oo3boo51bo$30bobo26boo34bo95bobbo9boo12b3o18boo5bobbo30boo441bobo4boo 51b3o15bo7bo88boo$32bo108boo49boo4boo4boo14boo25boo31b3o435bo8boobbo 28boo24bo14b3o5b3o86bobo$32boo108bo55bobo3boo9boo6b3o55bobo420boo11boo 5boo3boo6bo7bo15bo13boo6b3o18bo7bo87bo$141bo13boo3boo38bo13boo3bo3bo 43b3o12boo420boo10boobo17boo4b3o15bobo11boo6bo19boo6boo87boo$141boo13b o3bo39boo13booboo3bobo13boo25booboo446bobo17boo3bo19boo$153b3o5b3o26b oo24b4o4bo14boo6boo17bobboo447boo18bo3boo77b3o$51boo5boo93bo9bo27bo12b oo18bo22boo18boo4boo545bobbo$51bo6boo4boo122b3o12bobbo65bobbo6boo536bo 3bo$49bobo12boo109boo11bo14bobo25boo5boobo31boo6bobbo373bo160boobobo$ 32boo15boo30b3o91boobboo23boboo23boo6bobo5b3o5boo23bobobo363boo8b3o66b oo90booboo$32boo47bobbo61bo18bo13bobo23b3o13bo18bo7boo5boo22b3obo364b oo11bo5bo41bo17bobo63boo25b3o67boo$80bo3bo61b3o6boo6b3o14bo25boo12bobo 4boo10boo4boo19bo12b3o366boo10boo4bobo12boo25bobo17b3o62boo95boo$63boo 15b3obbo63bo5boo5bo58bo5bo11boo4b3o17bobo380bo18bo13b3o10b3o12bo19boo 93bo$49boo8boobboo16b4o63boo12boo13boo4b3o42b3o8boo5bobo17bo380bobo6b oo23boobo7bob3o22boo5boo23boo69b5o54boobo$49bobo6bobo117bo4b3o44bo16b oo398boboo5boo25bobo5bobobo23boo5b3o22boo70bobbo54boboo$51bo6bo12boo 102b3o5b3o496bobbo5bobbo7b3o34boo80b3obboo$51boo4boo11bobo5bobo80boo 12bo10b3o488bo5boo7boo7b6o31bobbo70boo7boobb3o$70bo7boo76boo3boo23b3o 459boo26bobo22bo3boo20boo4boo4boo49boo20boo7bo$69boo8bo76boo28b3o459b oo21boobbooboo22bobbobo19boo3bobo55bo30boobo20b3o27boo23bo$671bobo3boo 27boo24bo38boo3boo13bo30b3o17bobb3o27bo23bobo$666bo5b3obbobo3boo7boo 37boo39bo3bo13boo31bo17bob3obo25bobo23bobo$667bo4boo9boo7bobo46boo26b 3o5b3o61bobo29boo23booboo$33boo132bo7bo14boo124bo331boo15b3o15boo8b3o 31boo12bo27bo9bo60bo$34bo36boo92b3o5b3o14bo24boo30bo66b3o8boo320bobbo 32bo10boo11bo18bobbo12b3o19bo18bo55boo$31b3o36bobo91bo7bo18b3o6boo13bo 15bo6boo7bobo21boo34bo5bo11boo320bobo25boo5bobo6boo7boo5bobo15bobobo 14bo11boo6b3o6boo6b3o54bobbo11b3o$31bo38bo93boo6boo19bo6boo11bobo15b3o 6bo6boo22boo20bo12bobo4boo333boboo23boo5boboo5b3o6boo5boo15b3obo23boo bboo9bo5boo5bo57bobbo9bo3bo23boo$69boo142boo19bobbo53boobo12bo18bo322b 3o13bo45bo12b3o24bobo12boo12boo55bo3bo10bobbo12boo10bo$161boo70boo3boo 50bo26boo6bobo322boo12bobo37boo4bobo39bo85bobbo11b3obo10boo4boo4bobo$ 54boo5boo99boo125bobobbo11bo10boo5bobbo337bo17boo7boo11bo5bo36bo90bob oo11bo3bo11bo3boo5boo15boo$54boo5bo99bo127bobbo6boo4b3o15bobbo356boo7b oo8b3o49boo11boo48bo5bobo4bo10boo12bobo10boo28boo$59bobo228boo6bobbob oobbo394bo43b3obo3bo12boo3boo43bobo3boo5bobo23bo11boo$59boo187boo49boo bbobbo3b3o10bobbo418boboo6b3o14boo43boo5bo5boo$55boo125boo62bobbo17bo 38bobo4bo11boo352b3o63boobo8bo123boo$43boo10bobo21boo101boo82bobo12bo 22bo8bo429bob3o121boo9bobo$43boo11bo22boo165bobbo17bo12boboo6boo13boo 5boo300bo62bo5bo52bo132boobboo5bo$224boo21bobbo5boo26bo5boo14bo297boo 8b3o60bo5bo52b3o6bo8bo7bo52bo31boo24bobo3boo$59b3o24boboo134boo22bobo 5boo15bo6bobbobo21bo3bo13boo276bobbo10bo5bo53bo5bo29boo24bo14b3o5b3o 49bo32boo12boo12bo$59b3o24boobo146boo11bo25bo6bobbo5bo17bo14bobbo275bo 12boo4bobo12bobo17boo31boo6bo15bo13boo6b3o18bo7bo48b3o44bobo11boo$59b 3o90bo82bobbo31bo4bo7boo5bobo5boo22bobbobo275bo19bo12bo20boo20b3o7bo6b 3o15bobo11boo6bo19boo6boo97bo24bo$62b3o85b3obo30boo49boo4boo4boo19bo5b o13bobbo5boo26bo276boboo5boo23bobbo51bobbo19boo146boo22b3o$32boo9bo18b 3o84bo3bo32bo55bobo3boo19bobo16bobbo17bo12boboo279boo5boo23bobobo48boo 3boo189b5o$33bo8b3o8boo7b3o4boo77b3obo32bo13boo3boo38bo24boo37bobo12bo 314bobbo244boob3o5boo$33boboo3bo4bo7bo15bobo75boobo34boo13bo3bo39boo 37boo3bobbo9bo7bo317b5o7boo52bo28boo3boo158booboo5bo$34bo5bo4bo5bobo 17bo76b3o46b3o5b3o26boo45bobbo5boo7boo303boo20boo3bo3boo55bobo27bobobb obo159bo8b3o$38boo4bo6boo18boo75boobo45bo9bo27bo12boo50boo302boo19bo3b oo49boo10bobo29bo4bo131boo37bo$39boobbo106b3o79b3o12bobbo17bo12bobbo 340boo35bo17boo11bo29bobbobbo16boo113bobo$42bo107boo30bo18bo17boo11bo 14bobobbo16boo4boo5bobbo353boo5bobo12bobo62b3o17boo115bo$33b3obbobbo 140b3o6boo6b3o17boobboo23bo19boo5boo6bobo352bobbo7bo12bo200boo4boo5boo $32b3o4boo49boo93bo5boo5bo24bobo23boobo12bo18bo319boo32bo6bobbo23boo7b oo21boo164bo5boo$90bo93boo12boo24bo26bo12bobo4boo330bobbo16bobo12bo5bo bobo23boo5boboo21boo6bo157bobo$88bobo174bo5bo11boo318bobobo16boo5boo5b oboobbobbo15bo15bo12boo17bo159boo$47boo22boo15boo131boo4boo43b3o8boo 319bobbo16bo6boo7boo3boo16boo14bo11bobbo16b3o161boo$21bobo23bo23boo 124boo23bo4boobo43bo333bo12bo40bobo4bobo7bobbo3boo4boo49boo129bobo10b oo$9boo9bo27b3o141boo3boo20b3o9bo373bobo12bobo45bobbobbo5boo3bobo55bo 131bo11boo$8bobbo3boobbo4bo25bo141boo25bo8bo56bo335bo17boo27bo3bo12bo 38boo3boo13bo108boo$7bobobo3boobobboboo63boo139boboo52bo353boo4boo21b oobboobbo7boo39bo3bo13boo108boo15b3o$7bobbo8boo22bo9boo33bobo140boo52b o359boo25booboo17boo26b3o5b3o137b3o$6bo32boobboob3o3bobbo34bo261bo321b o5boo12bo27bo9bo111boobo22b3o$7bobo29boo4b4o3bobobo33boo111bo7bo14boo 53b3o66b3o8boo316bobbo12b3o146boboo19b3o$43boo8bob3o143b3o5b3o14bo24b oo90bo5bo10bobbo282boo5boo23bobobo14bo11boo156b3o28boo$55b3o66boo74bo 7bo18b3o6boo13bo15bo7bo11b3o17boo18bobo12bobo4boo12bo280boboo5boo23bo bbo23boobboo156b3o7boo19bo$125bo26bo47boo6boo19bo6boo11bobo15b3o4boo 31boo21bo12bo19bo280bo19bo12bo26bobo25bo18bo126bo17bobo$11bo7boo104bob o3bo19bobo95boo19bo3boo50bobbo23boo5boobo280bo12boo4bobo12bobo24bo26b 3o6boo6b3o111bo14bobo15boo$10bobo6boo105boo3bo20bobo64boo48boo3bo50bob obo23boo5boo282bobbo10bo5bo36bo33bo5boo5bo90boo21bobo14boo4bo6boo$10bo bo59boo79boo62b5o103bobbo316boo8b3o42bobo4boo25boo12boo89bo22bobo19bob o4bobbo$11bo10bo20boo7bo20bo135boo6boobobo103boo5bo321bo43bo3bo3bo129b obo21booboo18bobo5boo$22boo19boo6bobo16b3o88boo44booboo4bo5bo108booboo 25boo335bo3bo5b3o126boo46bo10b3o$21bobo27bobo16bo89bobboobo40bobbo4boo 4bo62boo45bobboobboo21boo334bo3bo8bo24boo160b3o$11bo28boo10bo111bobbo 39bobbo5bobo65boo17bo31bo3bo356bo3bo34boo3boo$11boo27bobo82boo22b4obbo bo3boo4bo40boo6b3o65boo16bobo12boo7boo5bobbobbo357bobo40boo100boo$6bo 33bo52boo5boo23boo4boo16bo3b4o5bob3o7bo41bobo65bo18bo13b3o5bobbo7bobo 4bobo352bo144bo39boo$5bobo4bobbo35boo40boo5bo30boo16bo4boobo3boobo7bob o85boo21bobo6boo23boobo7bo14boo16boo288boo190bobo38bo23bobo$6bo5bobbo 6bo28boo45bobo49bob4obbobboo10boo85boo21boboo5boo25bobo6bo15bo15bobbo 281bo4boboo50bo133boo4boo15boo18b3o27bo9boo$13b3o5bobo27boo4bo40boo43b oo9boo116boo18boo24bobbo3boobo5boo23bobobo280bo6b3o50b3o15bo7bo101boo 4boo21boo18bo19bo5bo4bobboo3bobbo$22bo33bobo35boo47boo9booboo112bobbo 17bo26boo4boo7boo23bobbo274b3o12bo28boo24bo14b3o5b3o99boo67bo5boobobbo boo3bobobo$41bo5boobbo5bo24boo10bobo33boo24boo63boo49boo4boo4boo4b4o8b 3o40bo12bo266boo9boo3bo3bo6bo5bo7bo15bo13boo6b3o18bo7bo143boo9bo12bo9b oo8bobbo$40bobo5b3o31boo11bobboo26boobboo43bo46bo55bobo3boobboob5o6bo 41bobo12bobo263boo8boobbobo5boobbo6boo4b3o15bobo11boo6bo19boo6boo8b3o 99boo30bobbo3b3oboobboo32bo$5boo34bo7bo75bobo24boo22bo44bo13boo3boo38b o7boo6bo6bo22boo17bo290bo5bo15boo3bo19boo56bobbo98bobo29bobobo3b4o4boo 4b3o3b3o16bobo$4bobo89bo3bo24bo12boo12boo20b3o44boo13bo3bo39boo7b3obo 3bo21boo5boo309boobbo17bo3boo80bo87boo8bo30b3obo8boo$4bo91bo4bo22boo 11bobo93b3o5b3o26boo18boobbobo22boo320bo99boo90boobboo3boo30b3o24bo$3b oo27boo23boo39bobobo34bo95bo9bo27bo12boo33boo420boo3bo90bobo61bo$8boo 22boo23bobo39bobobo32boo130b3o12bobbo32bo260bo165bo78boo12bo61bo9boo$ 8boo49bo11boo27bo4bo149boo11bo14bobo25boo5bobo249boo8b3o65boo93b3o79bo bo11boo70boo$59boo11bo19boo7bo3bo110bo18bo19boobboo23boboo23boo5boboo 248boo11bo5bo40bo17boo64boo111bo$54boo16bobo17bo123b3o6boo6b3o23bobo 23b3o13bo280boo4bobo12boo24bobo82boo26boo83boo58boo$54boo17boo15bobo9b oo115bo5boo5bo27bo3bo21boo12bobo4boo280bo13b3o9b3o12bo111boo116boo25b oo$19bobo63bo4boo46boo78boo12boo29boo36bo5bo11boo248boobo5boo23boobo6b ob3o22boo6b3o21boo67bobbo115bo$10bobo9bo61bobo50bobo117boo3boboo42b3o 8boo249bobo5boo25bobo4bobobo23boo7boo21boo69b3o115b3o$9bo8bobbo51bo10b obo50bo120bobb3obbo43bo260bo32bobbo4bobbo6boo22boo12boo79boboobo116bo$ 4boobbo4bo3bobobo49bobbo10bo50boo93boo22b3o5bobobo302boo13bobo4bo12boo 6boo7boo22b3o10bobbo70boo10b3o77boo98bo$4boobobboboo3bobbo20b3o27bobbo 112bo38boo3boo22bo8bobobo301boo13bo4boo4bo25boo4boo17bobo4boo4boo49boo 20boo13bo76bobo96bobo$8boo8boo21b3obo8bo17bo115boo36boo37bobb3o299boo 13b3ob3o4boo29bobbo17boo3bobo55bo35bo79bo4boo5boo68bo15bo$42bobobo3boo bboob3o127boo77boobo319boo6boo29boo23bo38boo3boo13bo33boo79boo4bo5boo 33bo33bobo5b3o$43bobbo3boo4b4o26boo179boo320bo7bo7boo6boo13bo23boo39bo 3bo13boo29boobbo86bobo37bobo33bo5bobbo$44boo8boo30bo180bo328bo8boo6boo 47boo26b3o5b3o42b3o88boo38bo7bo7bo24bo3bo$87b3o100bo46bo7bo14boo308boo 17boboo55boo12bo27bo9bo43bo93boo41b3o5bobo23bobbo$89bo56boo40bobo44b3o 5b3o14bo24boo30bobo249bobbo74bobbo12b3o171bobo10boo28boobbo5bo25bobo6b oo$68b3o75boo41boo43bo7bo18b3o6boo13bo15bo7bo7boo22boo226bobo25boo5boo bo5b3o5boo4bo18bobobo14bo11boo8bo18bo131bo11boo28boob3o39bobo$79b4o9b oo140boo6boo19bo6boo11bobo15b3o4boo8bo22boo227boboo23boo6bobo6boo5boo 6bo15b3obo23boobboo8b3o6boo6b3o127bo45b5o29bo12bo$44boo8boo10bo11bo7b oo3bobbo58boboo126boo19bo3boo261b3o13bo18bo4boo12bobbo3bo12b3o24bobo 15bo5boo5bo96boo15boo14bobo37boo7bo15boo13bobo11boo$43bobbo3boo4b4o6bo 11bo3boobboo3bobobbo56boobo74boo70boo3bo263boo12bobo16boo4b3o11bo5bobo 39bo15boo12boo95bo16boo13bo3bo35bobo23boo13bobo6boo$42bobobo3boobboob 3o6bo12bobboo8bo70boo65bobo354bo17boo5bobo11bo5bo36bo128bobo30bo3bo36b o12bo28bo7boo$41b3obo8bo38boobo67bo33bobo31bo372boo6boo8b3o42b3o4boo 121boo8boobo18bo3bo36boo11bobo$41b3o26b3o22bo68bobo32boo422bo43bob3o3b o14boo116boboo17bo3bo27boo13boo6bobo$64boo70boo27boo32bo118boo67bo278b o3bo5b3o11boo3boo133bobo7boo19bo14boo7bo$63bobo70bobo113boo63bobo17bo 47b3o8boo267bo3bo8bo16boo134bo9bo17bobo48bobo$65bo72bo113boo62b3o17bob o39bo5bo11boo204b3o59b3obo149boo21bobo15boo48bo9bobo$76boo4boo54boo 176boo19bo12b3o11bo12bobo4boo279b3o148boobo7bo14boo4bo61bobbo8bo$54boo 19boo5boo210boo23boo5boo22b3obo7boobo12bo18bo138bo63bo5bo52bo6bo132boo 15b3o7bobo18bobo60bobobo3bo4bobboo$54boo21bo216boo22b3o5boo23bobobo5bo 26boo6bobo127boo8b3o61bo5bo52b3o15bo7bo107boo4boo14boo9bobo18bobo10bo 27b3o20bobbo3boobobboboo$164boo140boo34b3o7bobbo4bobobbo22boo5bobbo 127boo11bo5bo54bo5bo29boo24bo14b3o5b3o105boo22b4o4booboo18bo10bobbo14b o8bob3o21boo8boo$157boo5boo4boo50bobo80bobbo31b6o7boo5bobbo15boo13bobb o140boo4bobo33boo31boo6bo15bo13boo6b3o18bo7bo129b3o38bobbo9b3oboobboo 3bobobo$157bo12boo48b3obo30boo49boo4boo4boo20boo3bo15boo17boo163bo12b 3o19boo20b3o7bo6b3o15bobo11boo6bo19boo6boo172bo10b4o4boo3bobbo$155bobo 61bo3bo32bo55bobo3boo19bobobbo34bo6bo7bobbo127b3o6boo22b3obo52bobbo19b oo236boo8boo$86bobo49boo15boo61bobbo33bo13boo3boo38bo24boo42boo3bo7boo 127boo7boo23bobobo49boo3boo174boo10boo38boo$86bobboo5bo41boo78bobbo33b oo13bo3bo39boo37boo28bo5bobo136boo30bobbo230boobboo7bo11boo26bo$41bo 44b4o5bobo71boo47boo47b3o5b3o26boo46bobo6boo20b5oboobo134b3o31boo53bo 25boo154bobo6bobo9boo23b3o$40bobo3bo33bo7boo6bo68boobboo48bobbo44bo9bo 27bo12boo31b3o7boo25bo137bobo86bobo23bobbo141boo12bo7boo15boo17bo$41bo 4bobo8bo21bobo8bo64boo7bobo53boo80b3o12bobbo18bo11boo36b4o3boo128boo 12b3o60boo10bobo26boo140bobo11boo23boo49bo9boo$46boo8bobo21bo6boboobo 62bobo6bo12boo42bo67boo11bo14bobobo15bobo5boo7boo6bo27bo4bobbo140boob oo41bo17boo11bo22bo3boo24boo48bo68bo51boo5bobboo20boobboob3o3bobbo$57b o28bobo4bo63bo5boo11bobo110boobboo23bob3o15boo5boo6b3o5bobo5boo22bobbo bo140boobbo17boo6bobo12bobo51bo4bo25boo47bo69boo49bobbo3bo3boobboo16b oo4b4o3bobobo$85bobbobboo64boo17bo83bo18bo13bobo24b3o12bo24bobbo5boo 26bo137boo4boo18boo9bo12bo52b3o77b3o87boo27bobbobo3bo7boo20boo8bob3o$ 71boo12bobbo7boo77boo83b3o6boo6b3o14bo39bobo4boo16bobbo17bo12boboo129b oo6bobbo30bobbo23boo7boo21boo178bobo31bo5b4o37b3o$40boo7boo20boo13bobb o6bobo164bo5boo5bo21bo36bo5bo11boo24bobo12bo130bobbo6boo30bobobo17bo5b oo5boboo21boo178bo29boboo42bo$39bobo5boobo35bobbo8bo163boo12boo13boo 49b3o8boo4bobbo17bo144bobobo23boo5b3o4bobbo17bobo11bo12boo189boo30bo 45boo$39bo7b3o37b3o8boo192bo3bob3o43bo16boo163bob3o22boo5boo6boo20bo 11bo11bobbo168boo55boo$38boo8bo44boo194b3o6boobo226b3o12bo19boo19bobb oo13bobbo3boo4boo49boo56bobo59bobo54bo16boo$43boo5bo42boo44boo36boo96b oo12bo8boboo240bobo17b3o19b3obo3b3o8boo3bobo55bo57boo62bo53bo3bo13boo 14boo$43boo5boo88bo35bobo91boo3boo22b3obo239bo17bobo19boboobb3obbo13bo 38boo3boo13bo57bo62boo53boo5boo24boo6bo$48boobbo84b3o36bo93boo91bo197b oo5boo15bobbo5bo12boo39bo3bo13boo68bo106b3o4boo32boo$49b3o85bo37boo 124bo61bo204boo13b3o3bobboo23boo26b3o5b3o79bo88boo20boo35bobo$48bobo 30bo281bo226boo11boo12bo27bo9bo79b3o86bo59bo$80boboo223bo294bobbo12b3o 204b3o16bobbo35boo$55b3o26bo5b4o66boo5boo112bo7bo15b3o51b3o207boo5boo 23bobobo14bo11boo79bo5bobo4bo100bo16b3o35bobo$43boo8bob3o22bobbobo3bo 7boo61boo5bo111b3o5b3o14bo24boo236boboo5boo23bobbo23boobboo19bo18bo40b obo3boo5bobo148boo3boo$39boo4b4o3bobobo25bobbo3bo3boobboo66bobo110bo7b o18b3o6boo13bo15bo7bo9bo21boo180bo19bo12bo26bobo23b3o6boo6b3o40boo5bo 5boo50boo97bobo10bo$39boobboob3o3bobbo27boo5bobboo70boo111boo6boo19bo 6boo11bobo15b3o4boo9bo21boo180bo12boo4bobo12bobo24bo27bo5boo5bo108boo 16boo5boo32bo39bo11bobo$43bo9boo106boo22boo140boo19bo3boo9bo3b3o197bo bbo10bo5bo36bo30boo12boo61bo64bo5boo31bobo8boo25bo15bo$149boo10bobo21b oo160boo3bo14bo194bo5boo8b3o42bobo4boo98boo28boo7boobo24bobo37bo10boo 3bo19bobo$149boo11bo205bo191bobo15bo43bo3bo3bo80bo19boo27bo8boboo25boo 47bo4bobo19bo$192boboo154bo210boo58bo3bo5b3o22boo52bo47bobo41boo49bo$ 165boo25boobo112bo3boo35bobo79bo188bo3bo8bo22boo3boo47b3o45boo41bobo 10boo$165boobo134boo3bo3boo35bobo10boo65b3o8boo177bo3bo37boo139bo11boo 74boo$169bo72bobo51boo4boo4bo41bo11boo17bo40bo5bo11bobbo176bobo165bo9b o37boo23boo27bobo$166bo76boo51boo5bobb3o71bobo12boo11bo12bobo4boo191bo 165bobo21bo23bobo23boo29bo$138boo27boboo4boo23boo41bo62b3o72bo13b3o8b oobo12bo17bobbo181bo161bobo6b3obo8bobo23bo56boo$139bo19boo8boo4bobo23b o136boo21boobo5boo23boobo6bo26boo5bobbo182b3o15bo7bo134booboo4boboo11b oo22boo51boo$139bobo17bo17bo23bobo134boo22bobo5boo25bobo4bobobbo22boo 5bobo160boo24bo14b3o5b3o105boo34boobo40boo46boo$140boo15bobo17boo23boo 146boo11bo32bobbo4bobbo32bo105boo31boo6bo15bo13boo6b3o18bo7bo98boo4boo 32bob3o27boo12boo$152bo4boo183boo5bobbo9boo33boo6boo139boo15boo13bo6b 3o15bobo11boo6bo19boo6boo98boo49boo19bo$151bobo145boo40bobo6boo4boo4b oo22bobobboo47boo121boo16bobbo19boo161boo26bo9bo17bobo$140bo10bobo30bo 115bo42bo12bobo3boo21bo3bob3o28b3o15boo137boo3boo182bo36bobo15boo$138b obbo10bo30bobo10boo101bo13boo3boo38bo20bo6bo6boo27bo345bobo35boo4bo6b oo31bo21b3o$138bobbo40bo3bo9bo102boo13bo3bo39boo20bo6b5oboobboo6boo15b o235boo94boo13boo15boo23bobo4bobbo28boobo20b3obo8bo$139bo42bobb4o5bobo 4boo108b3o5b3o26boo28b3o8b4o4boo6bobbo14boobo4boo225boo94boobboo26boo 23bobo5boo15bobboo8bo25bobobo3boobboob3o$177boo8boo5boo5boo4boo102bo9b o27bo12boo26bo35boobbobbo6boo59bo56boo9boo187bobo51bo10b3o9bo3boobboo 3bobobbo22bobbo3boo4b4o$153boo22boo8b3o17boo137b3o12bobbo24boo14bobbo 22boo6bobbo48boo8b3o47bo7boo8boo64boo109boo12bo63b3o8bo7boo3bobbo25boo 8boo$127boo24bo179boo11bo14bobo25boo5boobo4bobbo5boo22bobbobo48boo11bo 5bo26bo12bobo5bo76boo24b3o82bobo11boo7boo65b4o9boo$115boo10b3o24b3o 147bo18bo9boobboo23boboo23boo6bobo4bobo6boo26bo61boo4bobo12bobo8boobo 12bo18bo89bobbo84bo19bobo$114bobbo3boobbobbobo25bo37boo108b3o6boo6b3o 13bobo23b3o13bo18bo6bo18bo12boboo69bo12bo10bo26boo6bobo21boo65boobo84b oo18bo41boo$115bobo3boobboobboo15bobo45bobo9boo99bo5boo5bo17bo25boo12b obo4boo10boo24bobo12bo51boo7boo23bobbo5bobobbo22boo5bobbo21boo172boo 42bo$113boobo8boo22bo9boo35bo5boobboo98boo12boo57bo5bo11boo6boo17bo65b oobo5boo23bobobo4bobbo30bobbo10boo87bo137b3o$113b3o29bo4bobboo3bobbo 34boo3bobo131boo4b3o42b3o8boo6boo86bo31bobbo5boo44bobbo70boo6bo6bobo 136bo19bo10boobbo5boo$113boo30boobobboboo3bobobo38bo12boo120bo4b3o44bo 104bo13bo18boo23boo14bobbo4boo4boo49boo20boo5bobo4bobo145boo10bo6boobb oo3bo3bobbo$149boo8bobbo37boo11bobo103boo12b3o5b3o146bobbo12bobo4boo 34booboo15boo3bobo55bo22b3o3bobbo3boo76boo56boo10b3o9bo6boo7bo3bobobbo $163bo49bo100boo3boo12bo10b3o144boo20bobo33bo4bo19bo38boo3boo13bo22b3o 3boo75b3o4bobo54bobbo3boobbobbobo20b4o5bo$160bobo49boo100boo28b3o161bo 6bo18boo13bo3b3o17boo39bo3bo13boo21boobboboo75bobbo6bo36boo17bobo3boo bboobboo4b3o3b3o17boobo$117bo7boo143bo73b3o157bo3bo3boboo10boo6boo14b oo4bo3boo21boo26b3o5b3o34b4obo56boo18bo4bo4boo35bo16boobo8boo36bo$116b obo6boo12boo37boo91boo227boo6bobboo13boo26bobobbobbo6boo12bo27bo9bo35b o3bo56bo67b3o13b3o$116bobo20boo38bo84bobo3boo79bo139boo6bo8bo3boo21bo 18boo4boo6bobbo12b3o71boo30bo25bobo19bo5bo43bo13boo$117bo31boo7bo17b3o 86boo58bo7bo15b3o138bobbo6b4o4boo24bobo5boo22bobbobo14bo11boo59bo3b4o 22bobo24boo$127b3o19boo6bobo16bo37boo49bo57b3o5b3o14bo24boo115bobobo 10boobo9boo5boo6bobbo5boo26bo23boobboo59boobooboo22bobo5bo5bo33bo4boo 78b3o14boo$129bo27bobo53bobo106bo7bo18b3o6boo13bo15bo7bo7bo23boo60bobb o13bo9boo5boobo3bobbo17bo12boboo23bobo13bo18bo30bobboo29boo3bobbo34bo 3boo15boo5boo58bo14boo$128bo18bo10bo54bo108boo6boo19bo6boo11bobo15b3o 4boo5boo24boo64bo12bo19bo17boo4bobo12bo26bo14b3o6boo6b3o30bobbo20boo7b o8bo4bo29bo3bo17bo5boo48boo7bo$116b3o27boo51boo5boo4boo50bo13bo92boo 19bo3boo6boo86bobo12bobo18bo3bobbo11bo5bo35b3o20bo5boo5bo34b3o19booboo bbobo15bo29bo20bobo53boo$112bo5bo27bobo50boo5bo58bo10bobo112boo3bo111b o16bobbo5boo8b3o45bo3boo13boo12boo34boo20boboo10boo8bo29boo3boo15boo$ 111bobo4boobo36bo35bobo7bobo56b3o11boo247boo16bo43bo3bo3bo66bo20bo8boo bboobbo5bo9boo22b3o19boo$112bo6b3o6bo28boo36boo7boo381bobobbo4b3o85b3o b3obo8bo3bo4boo4boo10boobo9bo19bobo10boo$120bo6bobo33bo31bo4boo383bobb obo8bo12boo72bo18bo5boo16boboo30bo11boo$128bo25bobbo4bobo23boo10bobo 203boo177bo3bo22boo3boo227bo6bo$147bo6bobbo5bo24boo11bo3bo73bo60boo64b oo17bo99bo59bo31boo140boo47bo38boo3bobo$146bobo5b3o47boo16boo56bo59boo 64boo16bobo12boo84bo60b3o168boboo40bo5bo29bo8boo5bo$111boo34bo55boboo 15boo54b3o125bo18bo13b3o83bo186boo34bo7bo43bobo4b3o26bobo$110bobo89b3o bbo174boo21bobo6boo23boobo138bo130boobboo29bobo9bo41bo15bo19bo$110bo 93bobobo20boboo149boo21boboo5boo25bobo83b3o51b3o15bo7bo82boo24bobo28bo bo5boobo27boo28bobo$109boo27boo23boo40bobobo19boobo161boo36boo6bobbo 114boo24bo14b3o5b3o43bo36boo12boo12bo27booboo4boo8boo19bo30bo$114boo 22boo23bobo11boo27bobb3o181bobbo34bobbo6boo59boo17b3o11bo7bo15bo13boo 6b3o18bo7bo42bobo48bobo11boo46bo17bobo57bo8boo$114boo49bo12bo19boo7boo bo132boo49boo4boo4boo18boo4boo24bo43boo31boo4b3o15bobo11boo6bo19boo6b oo42boo51bo59bobo15boo58boo7bobo$165boo11bobo17bo9boo96boo36bo55bobo3b oo17bobbo19boo8b3o74boo3bo19boo144boo59boo4bo26boo23boo17b3o8bo$160boo 17boo15bobo9bo4bo24boo66b3o34bo13boo3boo38bo22bobbo18bobo11bo5bo68bo3b oo104bo80boo43bobo24bobo8bo14boo19bo3bo4boo$160boo21boo6bo4boo14bobo 24bo67b4o32boo13bo3bo39boo22bobo12boo3b3o11boo4bobo120bo55bo82bo43bobo 10bo13bo8booboo38bo$126boo54bobbo4bobo19bobo24bobo66bobbo43b3o5b3o26b oo47boo3boo19bo12b3o105bobbo53b3o80bobo42bo10bobbo10boo43boo6bo$116boo 7b3o55boo5bobo18booboo24boo67boboo42bo9bo27bo12boo33boo6boo5boo22b3obo 107bo136boo15boo36bobbo15boobbobo33boo4boo$116b3o5boboo50b3o10bo198b3o 12bobbo32bo6b3o5boo23bobobo39boo60bo4bo111boo40boo38bo16boobbo3bo35bo$ 110boobbobbobo3bobo22bobo26b3o111bo85boo11bo14bobo25boo5bobo29b3o7bobb o21bo17bobo63boo111bobo100boobbo31bo3bo$110boobboobboo3bobbo20bo9bobo 132boo83boobboo23boboo23boo5boboo26b6o7boo21bobo17b3o177bo64boo35b3o 27bo5bobo$114boo8boo22bobbo8bo72boo56boo88bobo23b3o13bo24boo20boo3bo 16b3o12bo19boo59b3o115boo21boo41bo9b3o24bo27boboo$148bobobo3bo4bobboo 26boo39bo148bo3bo21boo12bobo4boo17boo19bobobbo15bob3o22boo5boo23boo 177bobo38b3o10bo32boo24bo8boobbo$149bobbo3boobobboboo26bo38bobo5boo 144boo36bo5bo11boo26boo18bobobo23boo5b3o22boo177bo40bo13bo21boo7b3o20b obbobo3boobboo3bo$150boo8boo31b3o18boo15boo6boo4boo47bo84boo3boboo42b 3o8boo40boo4bobbo6boo4boo30boo188boo48bobo25b3o5boboo22bobbo3boo7bo$ 175bo19bo18boo29boo45bobo85bobb3obbo43bo49bobo5boo6bobbobbobbo28bobbo 104bobo118boo9bo22boobbobbobo3bobo25boo9b4o$175bo87bo29boo82b3o5bobobo 58boo31b3o15boo3bo4bo15boo4boo4boo49boo54boo118bobbo3boobbo4bo18boobb oobboo3bobbo$175bo12boo8boo62b3o112bo8bobobo56bobbo18bo11boo22b6o14boo 3bobo55bo56bo117bobobo3boobobboboo22boo8boo$161bobo20b4o4boo3bobbo30b oo28bobboo121bobb3o54bobobo15bobo5boo7boo22boboo18bo38boo3boo13bo106b oo65bobbo8boo$149boo9bo10b3o3b3o4b3oboobboo3bobobo29bobo10boo15b3obo 122boobo56bob3o15boo5boo6b3o4boo16bobo18boo39bo3bo13boo106boo64bo$148b obbo3boobbo4bo24bo8bob3o30bo6boobboo18boo123boo59b3o12bo24bobo15boo29b oo26b3o5b3o167boo16bobo$147bobobo3boobobboboo10bo24b3o30boo4bobo60bobo 84bo74bobo24b3o31boo12bo27bo9bo109boobo54bo62boo8boo$147bobbo8boo14bo 63bo12boo6bo42boo160bo17boo7boo30bobbo12b3o144boboo55b3o55boobboobboo 3bobbo$146bo28bo62boo11bobo5bo43bo179boo4boo7boo23bobobo14bo11boo192bo 55boobbobbobo3bobo$147bobo101bo7b3o227b3o6boo22b3obo23boobboo219boo33b 3o5boboo$250boo257bo12b3o24bobo223boo33boo7b3o$188boo7bo304boo4bobo39b o155boo9boo5boo94boo$166bo21boo6bobo16boo273boo11bo5bo36bo158bobo10bo 5boo$159boo5boo28bobo17bo273boo8b3o49boo151bo12bobo$159boo4bobo29bo15b 3o284bo43b3obo3bo151boo13boo$186boo25bo38boo289boboo6b3o21bo18bo126boo 83boo$186bobo5bo56bobo289boobo8bo21b3o6boo6b3o125bobo10boo32b3o36boo6b oo$186bo5b5o54bo29boo258bob3o34bo5boo5bo129bo11boo25bo6bobbo42boboo$ 192boob3o38boo5boo5boo30bo26bo269boo12boo90boo74bobo4bo3bo44boo$192boo bbo5bo33boo5bo38bobo23bobo21bo210bo142bo31b3o41bo5boo8bo38boo$156bo36b 3o5bobo37bobo39boo24bobo21boo351bobo29b3o48bobo5bobo35b3o$146bo8b3o28b o7bo7bo38boo67boo20boo246boo105boo15boo12b3o49booboo3bo35boboo$145bobo 8boo27bobo49boo341boo3boo117boo9b3o53bobbo33b3o3boo$146bo4boo9bo23bo 38boo10bobo76boo267boo28bo99b3o28boo24boo34bo13bo$154bo6bobo61boo11bo 65bo7boobboo296bo100b3o7boo19bo14boo23boo21bo11bobo$150bo3boo6bo78b3o 16boo40b3obbo4boobbobo295b3o22bobo45boo37bo17bobo13bobo23boo18bo15bo$ 150bo5boo19boo23boo36bo19boo20boo17bob3obobo7bo4boo225bo89boo45bobo37b obo15boo14bo12bo31bobo$152bo24boo23bobo35bo3bo37boo4boo15bo3bo5boobo3b oo225b3o15bo7bo64bo32boo11bo40boo4bo25boo11bobo31bo$145boo5bo5bo45bo 35bobbobo21boboo17boo18b3o3bo180bo30boo24bo14b3o5b3o95bo11boo45bobo29b oo6bobo$144bobo57boo36bobobbo19boobo37boo4bo4bo15bo134boo21bobo7boo6bo 15bo13boo6b3o18bo7bo92bobo58bobo29boo7bo$144bo7bo4bo41boo13boo27bo3bo 53bo11bo4bobo15boo132boo22boo6bo6b3o15bobo11boo6bo19boo6boo41bobo48boo 60bo10b3o75boo$143boo7bobbo43boo14bo19boo10bo66b3obobo14boo168bobbo19b oo90boo123b3o74bobo$148boo3b3o59bobo17bo8b3o40boo25boo187boo3boo70boo 39bo202bo$148boo66boo15bobo14boo31boobboo290boo51bo142bobo46boo$228bo 4boo15bobo29bobo296bo49bo71boo26boo33bobo9bo40boo$227bobo22bo29bo12boo 128bo205b3o69bo28bo32bo8bobbo41boo$186b3o27bo10bobo22boo27boo11bobo37b o80boo8b3o65boo177boo30b3o22b3o28boobbo4bo3bobobo$159bobo24b3obo8boo 13bobbo10bo65bo40boo78boo11bo5bo40bo17bobbo62boo48bo5bobo4bo43boo4boo 32bo22bo19bo10boobobboboo3bobbo$150bobo9bo24bobobo3b4o4boo9bobbo75boo 39boo91boo4bobo12boo11bo12bobo82boo48bobo3boo5bobo41boo81bo14boo8boo$ 149bo8bobbo26bobbo3b3oboobboo10bo218bo13b3o8boobo12bo17bobbo112boo5bo 5boo101boo9bo12bo57boo$144boobbo4bo3bobobo27boo9bo70boo141boobo5boo23b oobo6bo26boo5bobbo21boo156boo5boo40bobbo3b3oboobboo66b3o$144boobobbob oo3bobbo68boo40bo143bobo5boo25bobo4bobobbo6bo15boo5bobo22boo109bo47bo 5boo39bobobo3b4o4boo10b3o53boobo8boo$148boo8boo69bo39bobo144bo26boobo bbobbo4bobbo6bo25bo11boo119boo39boo7bobo43b3obo8boo72bobo3boobboobboo$ 216b3o11b3o19boo15boo24boo118boo26b3o4boo6boo7bo4bo31bobbo82bo16bo19b oo38boobboo4boo43b3o22bo18boo8boo30bobbo3boobbobbobo$218bo13bo19boo40b obo118boo21b5o3bo20bo5bo19boo4boo4boo49boo30bob3o13bo64bobo7boo64bo14b oobobboboo3bobbo30boo10b3o$189boo8boo16bo76bo120boo20b5ob3o25bobo19boo 3bobo55bo32bo3bo12b3o50boo12bo6bobo10boo52bo14boobbo4bo3bobobo41boo$ 188bobbo3boobboobboo20boo8boo56boo141bo3boobobo26boo24bo38boo3boo13bo 32bob3o64bobo11boo6bo11boo35bo36bo8bobbo$189bobo3bobobbobboo16boobobbo boo3bobbo31boo75bobo88boo11boo6boo37boo39bo3bo13boo34boboo65bo15bo51b 3o36bobo9bo$187boobo5b3o22boobbo4bo3bobobo30bobo75boo85bo15boo6bobbo 45boo26b3o5b3o46b3o66boo13bobo49boobbobboo40bobo$187b3o7boo27bo8bobbo 32bo75bo67boo18bo57boo12bo27bo9bo45boboo80bo3bo48bo3bobboo$187boo38bob o9bo31boo141bobbo15b3o22bobbo12bo17bobbo12b3o79b3o81bo3bo49boboo$236bo bo175bobo25boo5boobo4bobbo5boo4boo16bobbobo14bo11boo67boo80bo3bo50boo$ 415boboo23boo6bobo4bobo6boo5boo19bo23boobboo148bo3bo27boo60boo7bo$303b oo111b3o13bo18bo6bo18bo12boboo23bobo14bo18bo105boo12bobo7boo19bo61boo 6bobo$199boo102boo112boo12bobo16boo18boo4bobo12bo26bo15b3o6boo6b3o105b obo12bo9bo17bobo26bo42bobo$199boo24boo205bo17boo6boo11bo5bo59bo5boo5bo 110bo22bobo15boo27bo43bo$225boo26boo55boboo136boo6boo8b3o43boo4boo14b oo12boo109boo22boo4bo30bo9bo32bo$254bo55boobo154bo43boboo4bo169bobo28b obo40boo5bobo$251b3o257bo9b3o166bobo10bo18bo4boo9bo25bobo4bobbo$194bo 56bo262bo8bo13boo152bo10bobbo24boo5bobo30bo3bo$193b3o314boobo23boo3boo 158bobbo25bo6bo32bobbo5bo$192bobboo96boo215boo30boo160bo21bo4bo39b3o5b obo$186bo4b5o78boo5boo10bobo153b3o276boo34bo15bo$185bobo3b4o44bo34boo 5bo13bo355boo36boo30boo23boo15bobo$186bo4b4o7bo27b3o5bobo38bobo13boo 156bo52bo144boo37bo29bobo23boo16bo$192booboboobbobo19bo5bobbo6bo39boo 172bo52b3o15bo7bo154b3o30bo$193bo4bo3bo19bobo4bobbo42boo170bo5bo29boo 24bo14b3o5b3o107boobo41bo31boo$194boobbo24bo39boo10bobo149boo18bo12boo 6bo15bo13boo6b3o18bo7bo106boboo78boo54boo$194b4o30boo33boo11bo3bo33boo 111boo18bo11bo6b3o15bobo11boo6bo19boo6boo147boo5bobboo29boo54bobo$185b oo9bo31bo50boo33bo147bobbo19boo195bobbo3bo3boobboo83bo$184bobo27boo23b oo37boboo30bobo145boo3boo213bobbobo3bo7boo83boo$184bo12bo16boo23bobo 35b3obbo12boo15boo60bo139bobo4bo139boo21bo5b4o83boo$183boo11bobo29bo 12bo37bobobo11boo78boo137bo4boo4bo134bobo17boboo93boo$188boo6bobo28bob o11boo37bobobo83bobo3boo138b3ob3o4boo133bo20bo54b3o$188boo7bo29bobo6b oo14boo27bobb3o82boo79boo66boo6boo49bo81boo64bo8bob3o$228bo7boo15bo19b oo7boobo26boo55bo62bo17boo74bo41bo8bobo123boo15b3oboobboo3bobobo$253bo bo17bo9boo27bobo101bobo12bobo82boo7bo42bobo6boo124bo16b4o4boo3bobbo28b obo$254boo15bobo9bo30bo104bo12bo83b4o48boo123boo9bo19boo8boo28bo$200b oo64bo4boo41boo52bo13bo32bobbo23boo7boo21boo41b3o120boo51boo70bobbo8b oo$199b3o22bobo38bobo101bo10bobo31bobobo23boo5boboo21boo165bo60bo62bob obo3boobobboboo$188boo8boboo21bo41bobo99b3o11boo31bobbo31bo12boo177bob o61bo60bobbo3boobbo4bo$184boobboobboo3bobo24bobbo8boo15b3o10bo148boo 32bo11bobbo177boo15boo41bobbo61boo9bo$184bobobbobboo3bobbo23bobobo3boo bobboboo10b3o176bo4bo5boo5bobbo3boo4boo49boo144boo43b3o72bobo$185b3o 10boo25bobbo3boobbo4bo189boo3bo4bobboo4boo3bobo55bo70bo119b3o$186boo 38boo9bo58boo85bo46bobo7b3obbo9bo38boo3boo13bo67boo119bobbo$238bobo26b oo28bo86bo30boo23bo4bo8boo39bo3bo13boo68boo57boo36bo22bobo$267bo26b3o 85b3o30boo23b5o19boo26b3o5b3o138bobo35bobo21b3o6boo$268b3o23bo74bobo 69boo7boo12bo27bo9bo138bo38bo6b3o6bo14bobo17bo$250bo19bo99boo77bobbo 12b3o76bobo93boo44bobbo5bobo12b3o17bobo$227boo8boo11bo119bo45boo5boo 23bobobo14bo11boo63boo3bo98bobo40bo4bo13boo19bo12b3o$226bobbo3boobobbo boo7bo12boo8boo42boo5boo88boboo5boo23bobbo23boobboo64bo3bobo96bobbo33b o5bo21boo5boo22b3obo$225bobobo3bo4bobboo16b4o4boo3bobbo41boo5bo89bo19b o12bo26bobo72boo96bo3boo33bo4bo20b3o5boo6boo15bobobo$225bobbo8bo8b3o 10b3oboobboo3bobobo45bobo89bo12boo4bobo12bobo24bo171bo31boo7bo15boo22b obo15bobbo$224bo9bobo27bo8bob3o44boo90bobbo10bo5bo36bo70bo135bobo23boo 22bo18boo$225bobo24bo22b3o40boo95boo8b3o42bobo4boo62bo105bobb3o5boo18b o12bo20boo$252bo53boo10bobo104bo43bo3bo3bo63b3o103boo9bo18boo11bobo19b oo$245bo6bo53boo11bo148bo3bo5b3o168b3o7b3o20boo6bobo24boobbo4boo$245b oo76bo143bo3bo8bo168b3o9bo20boo7bo25boobbo4boo19boo$237boo5bobo75b3o 70bo70bo3bo245boo5bobo20bobo$237boo18boo4boo8bo47b3obo70boo69bobo242b oo9bo21b3o$257bobo3boo8bo48bo3bo68boo71bo161boo5boo72bobbo8bo21boo$ 257bo65bo3bo303bo5boo56bo15bobobo23boo7boo$295boo27bob3o302bobo59boobo 15bob3o22boo6b3o$296bo19boo7b3o70bo233boo45bobboo8bo21b3o12bo$233boo 61bobo17bo9bo69bobo141bobo93boo40bo3boobboo3bobobbo31bobo4boo$232bobbo 61boo15bobo80boo141boo93bobo10boo28bo7boo3bobbo34bo5bo11boo$224bo6b6o 31bobo38bo4boo225bo94bo11boo29b4o9boo42b3o8boo$223bobo6bobboo29boobbo 6bo30bobo321bo105bo$224bo10bo4bo27b3o5bobo29bobo$230bo4bo3bobo19bo15bo 18b3o10bo320b3obo$240bo19bobo8bo23b3o108bobo220boboo$230b3o28bo9b3o 133boo220boobo$267b3obboo133bo219bob3o27boo$223boo42boo3boo36boo326boo 19bo$222bobo27boo13bo9boo31bo318bo9bo17bobo$222bo10bo18boo13boobo6bobo 31b3o325bobo15boo$221boo8b4o33b3o8bo33bo326boo4bo6boo$226boobbo3bo34bo 9boo364bobo4bobbo$226boobbobbo40boo30boo8boo327bobo5boo$231b3o40boo26b oobboobboo3bobbo327bo10b3o$302boobbobbobo3bobo340b3o$308b3o5boboo$237b obo68boo7b3o$240bo77boo116bo207boo$226boo8bobbo21b3o173boo206bo$222boo bobboboo3bobobo21b3obo8boo11boo7boo138boo204b3o24b4o9boo$222bo4bobboo 3bobbo23bobobo3b4o4boo8boo6boo344bo19bo5bo7boo3bobbo$226bo9boo25bobbo 3b3oboobboo7bo18boo7bo195bo138boo10bo5bo3boobboo3bobobbo$223bobo38boo 9bo24b3o3boo6bobo193bo127boo10b3o9bo6bobboo8bo$300bo15boo192b3o22bobo 99bobbo3boobbobbobo29boobo$301bo14boo217boo101bobo3boobboobboo4b3o3b3o 18bo$256boo5bobboo268bo99boobo8boo$255bobbo3bo3boobboo364b3o23bo$253bo bbobo3bo7boo167bo196boo24bo$257bo5b4o173boo74bobo143bo9boo$253boboo52b 3ob3o3boo118boo75boo154boo$254bo58b7obo195bo$304bo8boobob3o207bo119boo $260b3o40bobo221bo120boo$259bobbo41bo8b3o211b3o$259bo3bobboo45bobo122b o$258boobobobboo42b4obo123boo64bo5bobo4bo$258booboo32boo13bobboo5boo 116boo65bobo3boo5bobo156b3o6bo$259b3o33boo14b3o6bobo182boo5bo5boo157bo bbo4bobo$312bo9bo320bo26bo6boboo5bo$322boo200bo110bo6b3o24bobo3boo$ 317boo203boo110bobo4bobboo24bo4boo$262boo53boo184bo19boo110bo5b4o6bo 22bobbo$253bo248bo141bobo3bobo22boo$252bobo247b3o139bobbo3bo34boo$253b o15bo374bobbo38bobo$261boo5bobo34boo143bobo192boo28bo12bo$262boo5bo35b 3o143boo181boo23boo13bobo11boo$261bo43boobo8boo132bo181bobo23boo13bobo 6boo$307bobo3boobboobboo310bo12bo28bo7boo$252boo52bobbo3boobbobbobo 309boo11bobo$251bobo53boo10b3o315boo6bobo$251bo67boo316boo7bo$250boo 419bo$255boo413boboo$255boo417bo5b4o$649boo19bobbobo3bo7boo$639boo7b3o 21bobbo3bo3boobboo$639b3o5boboo22boo5bobboo$268bo364boobbobbobo3bobo$ 266boobo363boobboobboo3bobbo$252bobboo8bo371boo8boo$251bo3boobboo3bobo bbo$251bo7boo3bobbo$252b4o9boo$482boboo161boobbo$481b5o166bo160boobboo 164b3o$481boo3bo160bo4bo165boo160b3obbo$484boo163boobo162boobo162b5o$ 484boo164b3oboo159bo6bo158boo$487b4o160b6o165bo165boo$486bo3bo160boo4b o158bo6bo163bobo$485boobboo160b3oboo160boboboo159bo3boobo$481bobbo3bo 158bo6boo157bobo5boo156bobo6bo$481b7o159b7o159b8o158bob7o$$481b7o159b 7o159b8o158bob7o$481bobbo3bo158bo6boo157bobo5boo156bobo6bo$485boobboo 160b3oboo160boboboo159bo3boobo$486bo3bo160boo4bo158bo6bo163bobo$487b4o 160b6o165bo165boo$484boo164b3oboo159bo6bo158boo$484boo163boobo162boobo 162b5o$481boo3bo160bo4bo165boo160b3obbo$481b5o166bo160boobboo164b3o$ 482boboo161boobbo17$451bo62boo$451boo60boo$450bobo62bo$$502b3o$502bo$ 503bo16bo$519boo$519bobo4$452boo$453boo$452bo8$539boo$538boo$519boo4b oo13bo$424b3o91boo5bobo$426bo93bo4bo8boo$425bo108bobo$534bo$$404boo$ 405boo$404bo$533bo$192boo8boo219boo107boo$188b4o4boo3bobbo219boo106bob o$188b3oboobboo3bobobo217bo$193bo8bob3o$204b3o$$200bobo102bo220b3o$ 198boobo101b3o8boo88b3o119bo7b3o$199boboo93bo5bo11boo90bo120bo6bo$192b oo4booboo92bobo4boo101bo129bo$192boo6bo40boo5bobboo28b3o12bo104bo$187b oo9b3o39bobbo3bo3boobboo22bob3o22boo6b3o84boo$188bo9b3o37bobbobo3bo7b oo21bobobo23boo7boo83bobo$188bobo8boo41bo5b4o26bobbo6boo22boo227bo$ 189boo6boboo37boboo37boo7boo22b3o82boo141boo$197bobo39bo48boo4boo17bob o80bobo141bobo$198bo94bobbo17boo65boo15bo$194boo10bo87boo84bobo83boo$ 194bobo8bobo71boo13bo87bo$190bo3bo11bo44boo26boo114boo67bo3bo$189bobo 59boo61boo80boo66bo4bo$190bo65boo55bobbo78bo70bobobo8bo$256bo22b3o5boo 4bo18bobobo150bobobo5b3o$229boo23bobo23boo5boo4bobo15b3obo108bo43bo4bo bbo$229boo23boo21boo14boo3bo12b3o100boo8b3o42bo3bobboo$128bobo146b3o 17bobo114boo11bo5bo$131bo9boo135bobo17bo127boo4bobo12bobo20boobbo$127b o4bobboo3bobbo94bo40boo152bo12bo26bobo$127boobobboboo3bobobo58boo32bob o173boo7boo23bobbo23boobboo69boo39boo$131boo8bobbo58boo33bo4bo10bo158b oobo5boo23bobobo14bo11boo65bo3bobo38bobo$145bo95boo10bobo26b3o131bo31b obbo12b3o77boo3bo40bo$142bobo97boo10bo110boo49bo13bo4bo13boo12bo27bo9b o42bobo35boo$215bo30bo33bo5bo77bobo46bobbo11boob3obbo3boo21boo26b3o5b 3o79boo$213bobo29boboo31bo5bo79bo15b3o29boo13boobo7bobo10boo39bo3bo13b oo69bo$190b3o21boo64bo5bo97bo45bo4bo6bo11bo38boo3boo13bo$131boo57b3obo 8boo44bo55boo76bo49boo5b3o6boo3bobo55bo$131boo58bobobo3b4o4boo40bo32b 3o20boo127bo14boo4boo4boo49boo$126boo64bobbo3b3oboobboo37bobbo164boo 44bobbo$127bo65boo9bo35boo171bobbo44boo$127bobo110boo4boobbo130boo30bo bobo23boo5boo23boo41bo$128boo100boo148bobo31bobbo23boo5boobo21boo37boo 3boboo$230boo14boo134bo35bo12bo19bo60boo4b3o$247b3o32boo131bobo12bobo 18bo61boobboo49boo$145bo107bo26bobbo17bo129bo16bobbo61b3o6boo44bobo6b oo$144bobo104boobo45bobo12bo53bo79boo64bo3bo3boo43bo8bobo$129bo9bobo3b o91bobboo8bo6boo5boo14bobbo12boo3bo12boboo51boo142bobo3booboo53bo$128b obo9boo94bo3boobboo3bobobbo3bo5boo15bobbo5boo3boo21bo49bobo3boo138bo4b 4o$129bo10bo95bo7boo3bobbo5bobo21bobo5boo5bo16bobbobo55boo137bo$237b4o 9boo7boo22bo32bobbo54bo84boo3boo$136b3o124boo52boo142bobbo19boo260boo bbo5boo$136bobo108bo14bobo17boo142boo18bo11bo6b3o15bobo11boo6bo19boo6b oo207boobboo3bo3bobbo$136bo108b3o15bo18boo13boo127boo18bo12boo6bo15bo 13boo6b3o18bo7bo207boo7bo3bobobbo$136bobbo104bo14bo36b3o147bo5bo29boo 24bo14b3o5b3o213b4o5bo25boo9bo$136bo107boo12bobo35bobbo17boo133bo52b3o 15bo7bo225boobo20bobbo3b3oboobboo$135bobbo3boo113bo3bo29boo4boo16bobbo 133bo52bo253bo20bobobo3b4o4boo$134boboo4boo86bo25bo3bo21boo6bobbo485b 3obo8boo$133boobo92bobbo22bo3bo21bobbo6boo22bobbo129b3o58b3o267b3o$ 134bobbo91bobbo10bo10bo3bo22bobobbo22boo5bobbo188bo32boo$134bobo94bo 10bobo10bobo24bo26boo6bobo188bo3bo23boo3boo203boo7bo$130bobo109bobo11b o26boobo12bo18bo189bobbobo8bo13boo208boo6bobo$129bo9bobo101bo4boo35bo 12bobo4boo203bobobbo4b3o218boo11bobo$130bobbo8bo88boo15bobo9boo37bo5bo 11boo148bo43bo3bo3bo222bo12bo28bo7boo$130bobobo3bo4bobboo58boo8boo12bo bo17bo55b3o8boo130boo6boo8b3o45bo3boo14boo12boo191bobo23boo13bobo6boo$ 131bobbo3boobobboboo57bobbo3boo4b4o8bo19boo7bo3bo44bo122bo17boo4bobbo 11bo5bo35b3o21bo5boo5bo193boo7bo15boo13bobo11boo$132boo8boo60bobobo3b oobboob3o7boo27bo4bo152boo12bobo36boo4bobo12bo26bo15b3o6boo6b3o199boo 30bo12bo$203b3obo8bo40bobobo153b3o13bo23bobbo17bo12boboo23bobo14bo18bo 198bobbo40bobo$203b3o50bobobo153boboo23boo5boboo4bobbo5boo26bo23boobb oo229bobo5bo34boo$254bo4bo153bobo25boo5bobo6bobo5boo6boo14bobbobo14bo 11boo229boo5bobo24b3o$207bobo44bo3bo154bobbo32bo8bo13boo17bobbo12b3o 234bo15bo24bo$208boboo202boo15b3o15boo23bo17boo12bo27bo9bo44b3o151bobo 33bo5bobbo$207boobo29boo11bobboo89bo85bo4boo9boo6boo47boo26b3o5b3o43bo 3bo25boo124bo33bobo5boo$165bobo39booboo4boo22boo10bobo40boo5boo43boo 83bo5b3obbobo3boo6boo37boo39bo3bo13boo36bo23boo160bo15bo$166boo41bo6b oo34boo41boo5bo43bobo88bobo3boo17boo7boo24bo38boo3boo13bo33b3o26bo174b obo$166bo42b3o9boo33boo42bobo111boo21boobbooboo21bobbobo19boo3bobo55bo 30bo208bo$209b3o9bo34bobo32bobo6boo112boo26bobo16b3o3bobobo18bobbo4boo 4boo49boo30bobo16b3o$194boo13boo8bobo29boo5bo33boobboo145bo5boo6boo8b oo34bobbo81bo17bo$194boo13boobo6boo30boo5boo32bo3bobo149bobbo4bobbo30b obbo10boo101bo16bo$210bobo84bo115boboo5boo25bobo4bobobbo22boo5bobbo21b oo105boo132boo$211bo201bobo6boo23boobo6bo26boo6bobo21boo105bobo131boo$ 114boo8boo77bo10boo12bo71b3o111bo18bo13b3o8boobo12bo18bo$110b4o4boo3bo bbo75bobo8bobo12b3o69b3o111boo10boo4bobo12boo11bo12bobo82boo221boo$ 110b3oboobboo3bobobo75bo11bo3bo11bo68b3o111boo11bo5bo40bo17boo64boo 221boo$115bo8bob3o89bobo9boo71b3o42boo64boo8b3o65boo251bo24b3o$126b3o 90bo83b3o43boo73bo156bo162boboo$303b3o42bo230boo167bo8boobbo6bo5bo$ 580boo162bobbobo3boobboo3bo5bo5bo$417b3o82boo3boo237bobbo3boo7bo5bo5bo 18b3o$417b3o84bobbo19boo218boo9b4o20bo8bob3o$114boo132boo156bo10b3o49b oo30bo6b3o15bobo11boo6bo19boo6boo192b3o4b3oboobboo3bobobo$114boo47boo 5bobboo73bo157b3o5b3o52boo21boo8boo6bo15bo13boo6b3o18bo7bo173bo25b4o4b oo3bobbo$109boo51bobbo3bo3boobboo26boo39bobo160bo4b3o74bobo31boo24bo 14b3o5b3o174b3o27boo8boo$110bo49bobbobo3bo7boo26boo39boo160boo4b3o76bo 56boo14bo7bo179bo69boo5bobboo$110bobo51bo5b4o469boo108boo68bobbo3bo3b oobboo$111boo47boboo247bo230boo177bobbobo3bo7boo$161bo32bo34boo179bobo 210boo4boo13bo123bo10boo44bo5b4o$196bo32boo15boo72b3o83boobboo49boo9bo 111boo36boo5bobo134bobbo8b3o10boo28boboo$128bo63bobbo21b3o26bobo73bo 83boo11bo40bobbo3b3oboobboo102boo3boo38bo4bo8boo115bo10bobbo7bobobbobb oo3bobbo28bo4bo$127bobo61bo13boo8bob3o28bo72bo97b3o37bobobo3b4o4boo63b o38boo57bobo113bobo5boo3bo9boobboobboo3bobo34bo$112bo15bo36bo7boo17boo 7boo4b4o3bobobo29boo134bo9bo27bo35b3obo8boo66b3o96bo115bobo4bobbo16boo 8boboo$111bobo5boo43bobo6boo17bo8boobboob3o3bobbo136boo28b3o5b3o26boo 35b3o77b3obo206boo4bo6boo28b3o$112bo5bobbo42bobo11boo25bo9boo83boo52bo 17boo13bo3bo39boo106bo3bo8bo25boo12boo143boo9bobo15boo25boo39boo$118bo 8bo37bo12bo122boo49bobo17bo13boo3boo38bo108bo3bo5b3o26bo5boo5bo155bo 17bobo57boo6boo$119b3o3bobo23boo23bobo33bo16boo69bo51boo19bo55bobo34bo 30bo43bob3o3bo26b3o6boo6b3o139bo3bo7boo19bo57bobo10boo$126boo23boo15bo 7boo32b3o16bo142boo49boo4boo34b3o19boo8b3o42b3o4boo25bo18bo41bo97bo4bo 27boo56bobo10bo$167boo40bo17bobo89boo101bobbo38boobbobboo13bobo11bo5bo 36bo92boo99bobobo39boo43bo10bobo$117bo48bobbo39boo16boo20boo5boo62boo 101boo39bo3bobboo12b3o11bo5bobo39bo88bobo99bobobo38boo43boo9boo$116bob o41bo5bobo81bo5boo61bo11boo78boo51boboo17boo12bobbo3bo12b3o24bobo190bo 4bo31boo49bobo$116bobo6boo32bobo5boo81bobo78boo78boo51boo22boo5boo6bo 15b3obo23boobboo187bo3bo32bo9bo40boo3boo$117bo7boo33bo15bo17b3o54boo 234b3o5boo4bo18bobobo14bo11boo224bobo6b3o14boo16bo12boo$175bobo17b3o 10bo35boobo7boo112boo150bobbo12b3o201boobbo11boo19boo5boobbo13boo15bob o10bo$176bo23boo5bobo34boboo6bobo112boo96bo54boo12bo27bo9bo55b3o111bob o10boo25bob4o31bo15bo$151b3o45bobbo4bobo45bo44b3o164bo19boo47boo26b3o 5b3o55bo7b3o104boo37bobo49bobo$151bobbo45boo6bo4boo22boo63bo155bo9bo 18boo13bo23boo39bo3bo13boo44bo6bo102boo41b3o8bo41bo$112b3o35bo45boo15b obo21boo12boo48bo155bobo42boo23bo38boo3boo13bo52bo100bobo51bobo$112b3o bo8boo26boo40bobo17bo33boboo44bo160bo4boo9bo26bobbo17boo3bobo55bo154bo 5boo31b3oboboo8bo$113bobobo3b4o4boo18bo3boo40bo19boo7b3o21bo48boo121b oo3bo40boo5bobo20boo4boo17bobo4boo4boo49boo152boo5boo30bob7o$114bobbo 3b3oboobboo18bo44boo28b3o24bo44bobo101boo19bo3boo40bo6bo12boo7boo22b3o 10bobbo242boo3b3ob3o$115boo9bo24bo10boo60b3o20boobo108boo19bo6boo11bob o15b3o4boo35bo4bo18bobbo6boo22boo12boo109bo$151b3o8boo57b3o23boo44boo 64bo18b3o6boo13bo15bo7bo37boo20bobobo23boo7boo13bo7boo96boo124bo$152b oo67b3o68bobo65b3o8bo5bo24boo53boo28bob3o22boo6b3o12bo8boo96bobo112bo 8b3o52boo$153bo67b3o53boo15bo67bo14boo77bobo30b3o12bo32b3o44bo173boo7b o55boo$276bobo62boo26b3obo82bo46bobo76bo3bo173bo6boo13boo14bo$175bo30b o11bo59bo62boo16bo8boboo83boo47bo17boo11bo46bo3bo170b3o22boo15bo$173b oobo28bobo9bobo6bo64boo66b3o6boobo88boo60boo10bobo47bobo171bo24bobo6b oo3b3o$159bobboo8bo31bo12boo7b3o63boo68bo3bob3o43bo45boo72bobo247bo7b oo18bo23bo$158bo3boobboo3bobobbo27bobbo13boo6bo61bo69boo49b3o8boo110bo 274boo22boobo$158bo7boo3bobbo28boobo14bobo4bobo137bo36bo5bo11boo386boo 7bobboo8bo$159b4o9boo28b3o11boo5bo5bo18bo115bo39bobo4boo119boo3boo210b oo53bo14bo3boobboo3bobobbo$146bobo54booboo8boo5boo21b3o114bobo24b3o12b o127bo3bo19boo191bo29boo22bo14bo7boo3bobbo$146bobo20bo33bobboo37bo113b oobboo23bob3o22boo6b3o20boo24b3o24boo29b3o5b3o15bobo11boo6bo19boo6boo 142bobo27b3o7boo12bo15b4o9boo$147bo19b3o34b3o23boo13boo112boo11bo14bob obo23boo7boo19boo14bo8bob3o24boo17b3o9bo9bo15bo13boo6b3o18bo7bo143boo 27boobo5b3o$124boo8boo30bo26bo11bo24boo140b3o12bobbo30boo24bo8b3oboobb oo3bobobo81boo24bo14b3o5b3o175bobo3bobobbobboo10b3o$123bobbo3boobboobb oo26boo25b3o141bo9bo27bo12boo16b4o11b3o32b4o4boo3bobbo51b3o53boo14bo7b o48boo39boo85bobbo3boobboobboo$124bobo3bobobbobboo56bo140b3o5b3o26boo 21boo6boo3bo11bobo35boo8boo181bobo38bobo71boo12boo8boo12bo11boo$88boo bbo5boo22boobo5b3o18bo42boo128boo13bo3bo39boo10bobo6boo3bo12boo97bo 130bo40bo56boo15boo36bo10b3o10boo$84boobboo3bo3bobbo21b3o7boo17bobbo 106boo62bo13boo3boo38bo10boobo5boob3o112bo163boo62bobo33bo19bo9bobobbo bboo3bobbo$84boo7bo3bobobbo19boo27bobbo10bo94bobo63bo55bobo3boo6boo5b 3o116bo60boo29boo69boo63bo35b3o27boobboobboo3bobo25boo5bobboo$89b4o5bo 54bo10bobo95bo15b3o44boo49boo4boo4boo7bo6boo177boobo22boo3boo71bo61boo 38bo30boo8boboo22bobbo3bo3boobboo$99boobo61bobo113bo94bobbo44boo162bo 8bo12boo177boo41b3o20bobbobo3bo7boo$101bo63bo4boo107bo96boo44bobbo158b o9b3o235boo24bo5b4o$134boo17boo15bobo9boo29boo10boo127bo9boo22b3o5boo 23bobobo97boo16bo43boboo4bo67bo162boo28boboo$134boo16bobo17bo40bo11boo 127boo8boo23boo5boo22b3obo80bo17boo6boo8b3o43boo4boo13boo12boo37boo 105booboo29b3o18bo3boo26bo$139boo11bo19boo7bo3bo25bobo38bobo93boo3bobo 30boo19bo12b3o66bobo12bobo24boo11bo5bo58bo5boo5bo36bobboo105bobo18bo 10b3o17bo5boo31boo$88boo49bo11boo27bo4bo25boo32bo6boo23boo43boo22b4o 36b3o17bobo83bo12bo37boo4bobo12bo26bo14b3o6boo6b3o32boobboo105bobo17bo bo28bo6boo31bo$88boo22boo23bobo39bobobo62bo5boo22bobo43boo21bo4bo25bo 10bobo17bo80bobbo23boo7boo5bo18bo12boboo23bobo13bo18bo33boob3o105bo18b obo28boo37bo3bo$83boo27boo23boo39bobobo95bo66bobb4o23bobo10boo97bobobo 23boo5boboo4bobo6boo26bo23boobboo62boboo121boo4bo24boo8bo34boo5boo$84b o91bo4bo12boo52bo96booboboo23bobo109bobbo6boo23bo7bobbo5boo22bobbobo 14bo11boo63bo122bobo15boo13bo8bobo32b3o4boo$84bobo89bo3bo13boo15boo33b obbo100boo24bo111boo6bobbobb3o17bo8bobbo22boo6bobbo12b3o79bo17boo90bo 9bo17bobo12bobo6bobbo13boo19boo7boo$85boo34bo89bobo33bobo15bo81b3o147b oo23bobbo30bobbo6boo12bo27bo9bo39boo3bo17bobo67boboo17b3o7boo19bo13boo 7boo14boo28bo$120bobo39boo11bobboo33bo34bo16boo106boo3bo126boo16boo6bo bbo16boo4boo21boo26b3o5b3o37boobo21bo69boobo16b3obo27boo56bobbo5bobo$ 121bo3bo11bo24boo10bobo36boo25boo22bobo3boo81boo19bo3boo9bo111bo4bo24b oo17bobbo16boo39bo3bo13boo25boo114bo3bo84b3o6boo$102bo21bo11bobo35boo 64boo29boo31boo6boo19bo6boo11bobo15b3o4boo9bo21boo75boo16bo44b3o17bo 38boo3boo13bo25boo4bo97boo11bo3bo56bo$101bobo20b3o10bo40boo90bo33bo7bo 18b3o6boo13bo15bo7bo9bo21boo47boo26boo12bobbo45boo13boo3bobo55bo28bobb o3boo93boo12bob3o54bobo$86bo10bo4bo26boo47bobo124b3o5b3o14bo24boo91boo 10b3o40bo19boo41boo4boo4boo49boo20boo5b3o4bobo107b3o40bo4b3o8bo19bo$ 85bobo10boo29boo42boo5bo13boo111bo7bo14boo53b3o3b3o53bobbo3boobbobbobo 58bobbo5boo44bobbo70boo13bobbo106bo40bobo3bo29bobo8boo$86bo10boo32bo 41boo5boo12bo253bobo3boobboobboo8boo15boo5boo23bobobo4bobbo32bo11boo 87boo111bo11boo24bo5bo29bo10boo3bo$94bo97bobo194bo56boobo8boo11boo14bo boo5boo23bobbo5bobobbo16bo5boo5bobo22boo187bobo10boo70bo4bobo$92boobo 35b3o58boo195bo56b3o24bo13bo19bo12bo10bo21boo3boo5bobbo21boo188boo88bo $150bo145boo91bo56boo20b3o16bo12boo4bobo12bobo8boobo12bo3boo12bobbo 206boo$91bo31boo4boo19b3o143boo3boo167bo16bobbo10bo5bo26bo12bobo82boo 136boo3bobo$91bo31boo28bo147boo82boo82bo18boo8b3o47bo17bobbo62boo136bo 4bo5boo$91bobbo57boo55boobo171bobbo16bo93bo67boo200bobo3boo5boo$99boo 28boo78boboo171bo18bobo12bobo37boo195boo111boo61boo$90bobboo4boo9bo18b 3o156boo12boo80bo19bo12bo40boo35boobbo5boo148boo174boo$110bo20bo3boo 65boo85bo5boo5bo81boboo5boo23bobbo69boobboo3bo3bobbo297bo35bo14boo$93b oo15bo23b3o65boo82b3o6boo6b3o80boo5boo23bobobo68boo7bo3bobobbo66boo3b oo220b3o36bo13boo$91b3o29boo8boboo149bo18bo113bobbo73b4o5bo54boo16bobb o19boo199bo37b3o$87bo18b3o3b3o4boobboobboo3bobo35boo248boo84boobo33boo 15boo13bo6b3o15bobo11boo6bo19boo6boo118boo30boo15boo$86boboo29bobobbo bboo3bobbo34bo214boo14bo106bo34boo31boo6bo15bo13boo6b3o18bo7bo118bo48b 3o7boo$90bo8boobbo6bo9b3o10boo33bobo214boo6b3o5boo99boo95boo24bo14b3o 5b3o117bobo11boo35boobo5b3o38bo$86bobbobo3boobboo3bo5bo10boo45boo223bo 6bo4bo39bo57bo120boo14bo7bo119boo12bo38bobo3bobobbobboo4b3o3b3o17boobo 33boo9bo$44boo8boo32bobbo3boo7bo5bo19bo262bobo7boboo13boo22bobo3bo49bo 3bo275bobo37bobbo3boobboobboo16bobboo8bo36bobbo3b3oboobboo$40b4o4boo3b obbo32boo9b4o24b3o61boo200boo3bobb3oboo11bobbo22bo3bo11bo33boo5boo272b oobboo39boo8boo12bo6bo3boobboo3bobobbo31bobobo3b4o4boo$40b3oboobboo3bo bobo69bo23boo40bo191boo13bo4bo13bo29b3o8bobo32boo4b3o124bo30boo3bo111b oo6boo59bo6bo7boo3bobbo32b3obo8boo$45bo8bob3o68boo22boo15boo23bobo123b 3o62bobbo31bo41bo37boo126b3o29b3oboboo55boo61bo39bo19bo7b4o9boo33b3o$ 56b3o109bobo23boo123b3o62bobobo23boo5boboo203b3obo22boo4b3o4bo54boo62b obo37b3o$49boo119bo137bo10b3o63bobbo23boo7boo30bo45bobbo124bo3bo8bo12b oo7bo3bo56bo62boo40bo79bobo$49b3o37boo5bobboo11b3o55boo136b3o5b3o70bo 12bo41boo6b3o14boo29b3o125bo3bo5b3o22b3o109boo50boo78b3o$48bobboo35bo bbo3bo3boobboo8b3o10bo184bo4b3o44bo22bobo12bobo4boo33bobo6bobo14boo96b oo16bo43bob3o3bo25bo46b3o62boo4boo123bobboo$48booboo33bobbobo3bo7boo 13boo5bobo182boo4b3o42b3o8boo28bo5bo11boo21bo7boo96bo5boo10bobo5boo8b 3o42b3o4boo13boo12boo42bo70boo20boo51boobbo5boo39boo5boo$44b6o40bo5b4o 17bobbo4bobo64boo160bo5bo11boo35b3o8boo20boo8b3o54bo38bobo3bobo11b3o3b obo11bo5bo36bo21bo5boo5bo44bo16bo57boo15boo36b3o8boobboo3bo3bobbo39bo 5boo$44b3oboobo34boboo28boo6bo4boo18boo40bo119bo25boo12bobo4boo10boo 37bo35boo3boobo42boo8bobo23b3o12bo6bo12boobb3o11boo4bobo39bo14b3o6boo 6b3o57boo56bobo41bo10b3o9boo7bo3bobobbo39bo8boo$39boo8bobbo34bo26boo 15bobo17bo28boo11bobo116bobo23b3o13bo18bo73boo7bo36bo3boo10bo22bob3o 22boo5boo5boo19bo12b3o24bobo13bo18bo57bobo55bo42bobo5boo19b4o5bo42b3o 7bo$40bo8bo63bobo17bo9bo5bobo29bo12boo112boobboo23boboo23boo6bobo79bob o35bobo4bo31bobobo23boo5b3o7boo5boo22b3obo23boobboo143boo42bobo4bobbo 28boobo37boboo5bobo$40bobo7bobo60bo19boo14boo30bobo124boo11bo14bobo25b oo5boobo79b3o36bo37bobbo40b3o5boo23bobobo14bo11boo182boo4bo6boo31bo38b oo7boo$41boo8bo60boo27b3obo36boobboo133b3o12bobbo18bo95boo76boo67boo6b obbo12b3o152boo40bobo15boo$99boo39boboo42boo98bo9bo27bo12boo16bo103boo 106boo31bobbo6boo12bo27bo9bo117bobo29bo9bo17bobo$99boo39boobo142b3o5b 3o26boo20b4o6bo3bo12boo75boo7b3o48boo39boo15boo6boo18boo4boo21boo12bo 13b3o5b3o119bo20boo6b3o7boo19bo58bo$58bo45boo32bob3o23boobo104boo13bo 3bo39boo9boobbo10bo12boo75b3o5boboo48bobo37boo24boo17bobboo15boo21boo 16bo3bo13boo107boo20bo5b3obo27boo12boo42bobo8boo$57bobo44bo61boboo104b o13boo3boo38bo9boobbo8bo86boobbobbobo3bobo52bo20boo16boo42booboo16bo 21bobo14boo3boo13bo129bobo4bo3bo12boo26boo43bo8bobo4bo$42bo5boo8bo18b oo23bobo35bo46boo86bo55bobo3boo5bobbo3boo3b3o84boobboobboo3bobbo51boo 19bobo16b3o4boo35b3o12boo3bobo55bo131boo5bo3bo10bobo21boo59bo3bobo$41b obo4bobo26boo23boo19boo11bo22boo20boo4boo85boo49boo4boo4boo6boo6bo93b oo8boo47boo25b3o17bo3bobbo6boo40bobo4boo4boo49boo138bob3o11bo22bo64bo$ 42bo5bo74boo10bobo21boo20boo141bobbo9boo33boo132boo26boo17bo4boo6bobbo 5boo31b3o10bobbo189b3o35bobo23boo$135boo188boo11bo32bobbo156boo7boo23b obobo4bobbo30boo12boo35bo155bo37boo23boo$86bo52boo172boo22bobo5boo25bo bo156b3o6boo22b3obo5bobobo23boo7boo21boo21bobo126boboo29bo11boo$85bobo 51bobo171boo21boobo5boo23boobo177bo12b3o8bob3o18bo3boo6b3o21boo22b3o 125boobo28bobo10boo$86bo15bo31boo5bo214bo13b3o121bo49boo4bobo24b3o12bo 3bobo148boo70boo49bo$101bobo22boo6boo5boo128boo55boo25bobo12boo121bob oo35boo11bo5bo39bobo3boo77boo68boo47boo18boo52bobo$89bo4b3o5bo24boo53b oo87boo54boo8boo17bo140bo8boobbo21boo8b3o47bo17boo11bo32bo4bo14boo49b oo4boo13bo46boo17bobo37bo10bo4bo32boo$55boo30boo5bobo29bo22boo30bobo 32b3o110bo7boo154bobbobo3boobboo3bo30bo67boo10bobo34boboo63boo5bobo78b o5boo31bobo10boo35boo$55boo31boo4bo16bo38bo30bo36bo276bobbo3boo7bo110b obo30bo3bobo66bo4bo8boo69boo5boo32bo10boo$65bo45b3o36bobo27boo35bo278b oo9b4o112bo32bo3bo81bobo117bo30bo$63bobo48bo36boo589bo117boobo29bobo$ 64boo47boo207boo3bo293bo3boo217bo48boo$97boo97boo104boo19bo3boo281bo9b oo3bo19boo195b3o14bo55b3o$42b3o43boo6boo99boo54boo6boo19bo6boo11bobo 15b3o4boo31boo225boo21bo9boo4b3o15bobo11boo6bo19boo6boo109boo34bo17bo 44bo8bob3o33bobo$42b3obo8boo31boo106bo56bo7bo18b3o6boo13bo15bo7bo31boo 225boo21bo9bo7bo15bo13boo6b3o18bo7bo109bo35boo16bobbo36b3oboobboo3bobo bo22boo9bo$43bobobo3b4o4boo88boo103b3o5b3o14bo24boo337boo24bo14b3o5b3o 46bo61bobo61boo30b4o4boo3bobbo22bobbo3boobbo4bo$44bobbo3b3oboobboo89bo 64boo39bo7bo14boo325b3o3b3o53boo14bo7bo47boo61boo53bobboo4boo34boo8boo 22bobobo3boobobboboo$45boo9bo59b3o12boo4boo11bobo63boo65b3o454bobo134b oo58bobbo8boo$76b3o22bo17bo11bo6bo12boo12boo48bo70bo323bo250boo14boo 57bo$99boobo26bobo6bobo24boo115bo3bo323bo49bo198b3o75bobo$65bobo4bo12b obboo8bo17boo11boo8boobboo100boo25bo8bobobbo323bo48bobo40boo119boo30bo 38boo8boo$53boo9bo7bo11bo3boobboo3bobobbo19boo19boo100boo3boo20b3o4bo bbobo373bo3bo34boo3boo101boo17bo29boboo32b4o4boo3bobbo$52bobbo3boobbo 4bo3bo11bo7boo3bobbo15boo5boo125boo23bo3bo3bo43bo331bo3bo8bo24boo35b3o 58boo8bo18bobo31bo8boobbo18b3oboobboo3bobobo35b3o$15boo34bobobo3boobo bboboo16b4o9boo12boobbobb5o72b3o75boo3bo45b3o8boo322bo3bo5b3o61bo7b3o 49bobo6bobo11boo6boo27bobbobo3boobboo3bo22bo8bob3o34bobbobboo$14b3o10b oo22bobbo8boo9b3o35boobbo3b3o6boo67bo81b3o35bo5bo11bobbo260bo16bo43bo 3bo3bo65bo6bo53bo6boo12bo38bobbo3boo7bo33b3o33bo3bobboo$13bobobbobboo 3bobbo20bo44bo21bo11bobo12boo51bo39boo12boo24bo26bo12bobo4boo274boo5b oo8b3o42bobo4boo25boo12boo31bo48bo22bobo39boo9b4o70b4o8boo$13boobboobb oo3bobo22bobo39b3o22boo11bo6boo4boo10boobboo31bo44bo5boo5bo24bobo23boo bo12bo17bobbo259bobo4bobbo10bo5bo36bo33bo5boo5bo80bo19boobboo25boo99bo 10bo$17boo8boboo61bo38boo5boo11boo3b3o10boo22boo40b3o6boo6b3o17boobboo 23bo26boo5bobbo267bo12boo4bobo12bobo24bo26b3o6boo6b3o77bobboo15boo12b oo15boo17bo90bobo$28b3o61boo56boo4bo5boboo3boboo19bobo40bo18bo17boo11b o14bobobbo14boo6boo5bobo268bo19bo12bo26bobo25bo18bo24b3o51b3o29bobo9b oo23b3o88boo$29boo120boboobb3obobobbobo3bo112b3o12bobbo17boo13bo269bob oo5boo23bobbo23boobboo64boboboo50bo30bo11boo26bo29boo$55bo7boo13bo73b oo3b3o8b5o16boo59bo9bo27bo12boo17bo287boo5boo23bobobo14bo11boo63bobbo 3bo79boo38boo29boo48b3o$54bobo6boo12bobbo28booboo74bobo59b3o5b3o26boo 47boo5boo9boo285bobbo12b3o76boobo70boo23bo53boo45bo$54bobo11boo7bobbo 10bo18bobo51bobboo21bo47boo13bo3bo39boo37boo5boo8boo7bo270boo7boo12bo 27bo9bo43boo70boo4boo16bobo41bo11bo44bobo3bo4bo$17boo7bo28bo12bo10bo 10bobo17bobo26boo23b3o71bo13boo3boo38bo24boo7boo22bo5bobo12bo230boo23b 5o19boo26b3o5b3o45boo74boo15bo3bo38bobbo10bobo23boo18bo4bo10bo$17boo6b obo13boo23bobo21bobo18bo26bobo25bo72bo55bobo3boo19bobobbo15bo18bo12bob oo222boo4boo23bo4bo8boo39bo3bo13boo34bo90bo3bo5booboo18bo10bobbo11boo 23boo22boobbo6bobo$12boo11bobo13boo12boo9boo23bo4boo40bo48boo49boo49b oo4boo4bobbo18bobobo3b3o8bobo6boo26bo203bo17boo19bobo7b3obbo9bo38boo3b oo13bo34b3o89bo9bobo18bobo10bo62b6o6bo$13bo12bo28bobbo20boo15bobo9boo 27boo49boo98bobbo34boo8boo4bobbo5boo22bobbobo186bobo12bobo38boo3bo4bo bboo4boo3bobo55bo34b4o99bobo18bobo74bobbo$13bobo38bo4bo18bobo17bo88bo 95bobo3boo10bobbo30bobbo4bobbo30bobbo189bo12bo39bo4bo5boo5bobbo3boo4b oo49boo20boo11bo3bo90bo8bo14boo4bo42bo33boo$14boo9bo24bobboobooboo17bo 19boo7bo3bo15boobo146boo5boo14bobbo5boo22bobbobo39boo186bobbo23boo7boo 3boo32bo11bobbo70boo12b3o90boboo9boo9bobo15boo29bobo$23b4o22bobobboo5b o15boo27bo4bo15boboo146boo5bo15bobo6boo26bo5bobbo14boo202bobobo23boo5b oboobbobbo31bo12boo85bo73boo17bobo21bo17bobo13bo15bo$23boobbo22bo6bo8b o38bobobo191bo18bo12boboo6boo15booboo200bobbo7bo23bo5bobobo23boo5boboo 21boo71bo75bobo17bo9bo3bo7boo19bo12bobo11bo$22bo4bo3bo30bobbobo36bobob o11boo113boobboo78bobo12bo24bo4bo201boo7boo23bo6bobbo23boo7boo21boo70b o5bo72bo7boboo16bo4bo27boo12bo10bobo$21booboboobbobo23bo9bo35bo4bo12b oo113b4obo9bo38bo11boo17bo37b3o3bo13boo195bo5boo17bobbo7bo12bo112boob 4o73boo6boobo18bobobo47boo3boo32boo$15bo4b4o7bo24bo4bo40bo3bo131bo11bo 37bobo10boo49boo3bo4boo14boo202bo18boo5bobo12bobo82boo25booboo108bobob o45bobo29bobo5boo$14bobo3b4o32bobbo178b3o47bobo52boo6bobbobbobo220b3o 41bo17boo64boo25boo97boo13bo4bo43boo30boo$15bo4b5o32b3o28boo11bobboo 183bo52bobbo6boo4boo18bo187boo74boo90boobb3o93boo14bo3bo43bo32bo$21bo bboo62boo10bobo239bobobbo22boo5bobo186boo167bobo159bobo$22b3o75boo184b oo3boo50bo26boo5bobbo220boo248boobbo11boo28boo50bobo$23bo80boo160boo 19bobbo53boobo12bo17bobbo218bobbo132booboo113bobo10boo29bo6boo33bobo9b o$52boo50bobo3boo62b3o40boo6boo19bo6boo11bobo15b3o6bo11bo18boo20bo12bo bo4boo199boo5boo4bobo16bobobo48boo3boo79bo116boo48boo32bo8bobbo$52boo 45boo5bo4bo64bo40bo7bo18b3o6boo13bo15bo6boo12bo18boo34bo5bo11bobbo183b oboo5boo4boo17bobbo33boo16bobbo19boo172boo81boobbo4bo3bobobo$99boo5boo 3bobo61bo42b3o5b3o14bo24boo29bo5bo61b3o8boo185bo13b3o3bo12bo20boo5bobb o6boo13bo6b3o15bobo11boo6bo19boo6boo122bobo81boobobboboo3bobbo$28boo 82boo106bo7bo15b3o52bo69bo195bo12boo4bobo12bobo17boo5b4o22boo6bo15bo 13boo6b3o18bo7bo8boo106boo4bo5boo39boo20bo18boo8boo$28boo216bo52bo265b obbo10bo5bo40bobbo45boo24bo14b3o5b3o7bo4bo104bo4boo5boo41bo19bo$63bobo 10bo164boo323boo8b3o119b3o15bo7bo117bobo47b3o24bo$54bobo9bo9b3o222b3o 272bo121bo40bo102boo48b3obo8boo22boo$53bo8bobbo13bo129boo29bo3bo459bo 29bobboo141bo12bobobo3b4o4boo4b3o3b3o4b3o10boo$16boo30boobbo4bo3bobobo 12boo30boo97boo3boo23bo4bo458bobo29b3o140b3o13bobbo3b3oboobboo16bobobb obboo3bobbo$16b3o7boo20boobobboboo3bobbo46bo102boo13bo8bobobo459bo3bo 170bo17boo9bo12bo7boobboobboo3bobo$16boobo5b3o24boo8boo34boo11bobo115b 3o5bobobo461bo3bo8bo12boo54boo90boo40bo11boo8boboo22boo9b4o$18bobo3bob obbobboo65bo12boo118bobbo4bo43bo419bo3bo5b3o12boo54bobo56boo53bo19bo 22b3o21bobbo3boo7bo$17bobbo3boobboobboo25bo39bobo63b3o33boo12boo14boo bbo3bo42b3o8boo6boo358bo43bo3bo3bo71bo58bo54b3o41boo19bobbobo3boobboo 3bo$18boo8boo16bo10b3o40boobboo62boo32bo5boo5bo59bo5bo11boo5bobo17bo 322boo6boo8b3o42bobo4boo127bobo11boo44bo65bo8boobbo$47bo8bo39boo6boo 62b3o28b3o6boo6b3o15bobboo20bobo12bobo4boo16b3o17bobo303bo17boo5bobbo 10bo5bo36bo20boo12boo98boo12bo44boo61boboo$45b3o8boo38bo102bo18bo14bob o26bo12bo23boo19bo12b3o274boo12bobo23bo12boo4bobo12bobo24bo17bo5boo5bo 111bobo108bo$94bobo66bob4obo58boobboo23bobbo23boo7boo6boo5boo22b3obo 271b3o13bo24bo19bo12bo26bobo13b3o6boo6b3o104boobboo3boo70boo7bo$42bo 51boo66bob3o62boo11bo14bobobo23boo5boboo5b3o5boo23bobobo269boboo23boo 5boboo4boboo5boo9bo13bobbo23boobboo9bo18bo104boo8bo54b3o13boo6bobo$41b obbo60boo56b3o3bo72b3o12bobbo6boo4boo17bo34boo6bobbo268bobo25boo5bobo 7boo5boo9boboo10bobobo14bo11boo143bobo40bo10b3o9boo11bobo$41bobbo10bo 43boo4boo63bo36bo9bo27bo12boo6bobbobboboo16bo33bobbo6boo269bobbo32bo 25boo4b4o6bobbo12b3o157boo39bobo5boo15bo12bo28bo7boo$43bo10bobo20boo 20boo65bo5boo33b3o5b3o26boo21boo3bobbo16bobbo5boo18boo4boo279boo15b3o 15boo20boo3bo8bo6boo12bo27bo9bo163bobo4bobbo14bobo23boo13bobo6boo$54bo bo20boo15boo71boboo24boo13bo3bo39boo16booboob3o12boo6boo17bobboo302bo 4boo9boo6boo13boobbo6boo21boo26b3o5b3o110boo46boo4bo6boo16boo23boo13bo bo11boo$55bo4boo32bobo67booboobo24bo13boo3boo38bo18bobboobbo39booboo 301bo5b3obbobo3boo6boo10boobo3bo3bo15boo39bo3bo13boo98boo4boo21boo16bo bo15boo53bo12bo$43boo15bobo33bo62boo3boob3o26bo55bobo3boo14bo5bo40b3o 12boo293bobo3boo24bo6bo20bo38boo3boo13bo104boo4boo15boo16bo17bobo22b3o 38bobo$42bobo17bo8b3o22boo60bobo4bobo5boo20boo49boo4boo4boo15bobboo55b obo270boo21boobbooboo23bobo20boo3bobo55bo110bobo22b3o7boo19bo22bo5bo 26bo7boo$42bo19boo10bo82bobo6bo78bobbo27boo15boo6boo31b3o271boo26bobo 25boo4bobo12bobbo3boo6bo48boo109bo24b3o28boo18boboo4bobo22bo4bo$41boo 27bo3bo25boo56bo87boo44bobbo4bobbo30boo301bo5boo6boo18bo13bo13boboo 156boo24b3o41bo6b3o6bo7bo15bo5bo$69bobobbo24bobo65bo66boo23boo5boo23bo bobo4bobobo23boo7boo303bobbo4bobbo31bo12booboboo183b3o37bobo6bo14bobo 9bo4bo$67bobbobo4boo20bo65b4o65boo21boboo5boo23bobbo6bob3o22boo6b3o 268boboo5boo25bobo4bobobo23boo5boboo9boobobo3bobboo176b3o38bo21booboo 7bobo5bobbo$67bo3bo5bo20boo64bo3bo88bo19bo12bo12b3o12bo288bobo6boo23b oobo6bobbo23boo7boo9boo3bo3bobboo142boo32b3o61bobbo8bo6b3o6bo$67bo7bob o86bobbo24boo63bo18bobo12bobo23bobo4boo282bo18bo13b3o11bo12bo30boo3bo bbo146bobo21boo72bo3bo22bobo$68b3o4boo88b3o24boo63bobbo7bobo6bo40bo5bo 11boo270boo10boo4bobo12boo9bobo12bobo27bobbo4bo46boo102bo22bo13bo11boo 45bo27bo$52boo11bo192boo8boo55b3o8boo270boo11bo5bo40bo17boo9bo3bo50boo 102boo21bobo10bobo10boo$52boo10bobo102boo98bo57bo280boo8b3o55bobo7boo 10bobo179boo11boo$64boo103boo447bo58boo210boo$68boo22boobo581bo210bobo 51boo$68bobo21boboo147boo3boo638bo5boo6bo39boo$63boo5bo152boo19bobbo 16boo430boo3boo123boo33boboo22boo5boo5boo49bo$63boo5boo13boo87boo6boo 19bo6boo11bobo15b3o6bo13boo15boo415bobbo19boo102boo34boobo36bobo48boo 12boo$85boo87bo7bo18b3o6boo13bo15bo6boo31boo380boo30bo6b3o15bobo11boo 6bo19boo6boo55bo138boo$175b3o5b3o14bo24boo436boo31boo6bo15bo13boo6b3o 18bo7bo98boo46bo11boo$40bo136bo7bo14boo517boo24bo14b3o5b3o43b3o53boo 44b3o11b3o7boo$40b3o699b3o15bo7bo45bo100bo14boobo5b3o$43bo698bo72bo16b o82boo15bobo3bobobbobboo31bo$42boo787boo98bobbo3boobboobboo29boobo$ 166boo579bo83bobo98boo8boo23b4o5bo$75boo89boo3boo27b3o575boo182boo7bo 3bobobbo$76bo94boo27b3o62b3o411b3o63bob3o23boo3boo156bo25boobboo3bo3bo bbo$76bobo110bo10b3o62bo415bo65boobo8bo13boo105boo29boo23b3o27boobbo5b oo$77boo110b3o5b3o66bo413bo66boboo6b3o120bo16boo14bo25bo$60boo96boo12b oo18bo4b3o44bo459bo43b3obo3bo121bobo17bo12boo25boo$60bo98bo5boo5bo18b oo4b3o42b3o8boo431boo6boo8b3o49boo14boo12boo90boo18bobo$58bobo95b3o6b oo6b3o16boo41bo5bo11boo413bo17boo6boo11bo5bo36bo22bo5boo5bo112boo5bo$ 58boo96bo18bo17boo25boo12bobo4boo10boo6boo390boo12bobo16boo18boo4bobo 39bo15b3o6boo6b3o115boo45b3o$75boo116b3o23b3o13bo18bo6boo17bo371b3o13b o18bo25bo12b3o24bobo14bo18bo114boo6b3o25bo10b3o$76bo7b3o102boo27boboo 23boo6bobo5boo16bobo12boo355boboo23boo6bobo4b3o6boo22b3obo23boobboo 145boobboo3b4o21bobo$41boo20boo11bobo5bo104bobbo9bo14bobo13b3o9boo5boo bo5bo18bo13b3o353bobo25boo5boobo4boo7boo23bobobo14bo11boo120boo17boo 13b4o21bobo$41boo15boo4bo12boo4b3o107bo8b3o12bobbo6boo3boobo24bobo6boo 23boobo352bobbo18bo23boo21bo8bobbo12b3o133bo17bobo8bo3bo20boo4bo$58bob o3bobo100bo9bo12bo4bo9bo12boo6bobb4obbo3bo20boboo5boo25bobo352boo16bo 25b3o21bo9boo12bo27bo9bo96bobo11boo4bo10boboo20bobo15boo$60bo4boobboo 96b3o5b3o13bo3bo8boo21boob5o4boo12boo40bobbo360b4o6bo3bo12boo6bobo20bo bo5boo16boo26b3o5b3o82boo12boo12bo4boo24bo9bo17bobo$60boo7boo84boo13bo 3bo19boo18boo17bobo3bobo11boo35bo5boo360boobbo10bo12boo6boo19boo4bobb oo7boo39bo3bo13boo70boo24bobo29b3o7boo19bo$155bo13boo3boo38bo19boo5boo 18boo26bobo365boobbo8bo44boo4bobboo8bo38boo3boo13bo37boo4boo47boobboo 29b3obo27boo$112b3o41bo55bobo3boo13boo5boo19boo21boobbooboo358boo5bobb o3boo3b3o56boo3bobo55bo37boo5bobo46boo34bo3bo$114bo40boo49boo4boo4boo 13b3o4bo43bobo3boo359boo6boo6bo61boo4boo4boo49boo38bo4bo8boo68boo5bo3b o$41boo27boo41bo91bobbo9boo33boo24bo5b3obbobo3boo353boo33boo6boo18bo 25bobbo102bobo23b3o42bo6bob3o$41bo22boo4boo134boo11bo32bobbo24bo4boo9b oo354bo32bobbo4bobbo15bobo26boo103bo11bo13bobo10b3o29bobo5b3o$39bobo 22boo100bo27boo22bobo5boo25bobo5boo15b3o15boo353bobo5boo25bobo4bobobo 15boo6boo5b3o22boo103boo15bo9bobbo29boo6bo$39boo124b3obb3o21boo21boobo 5boo23boobo5bobbo32bo353boobo5boo23boobo6bob3o22boo5boo23boo100bo3boo 10boobbo13boboo37bo11boo$164b3obo68bo13b3o6bobo25boo5bobo372bo13b3o9b 3o12bo19boo67bo53bo4bo11bobboo9bobbobboo36bobo10boo$152boo9bo4bo67bobo 12boo8boboo23boo5boboo364boo4bobo12boo24bobo17b3o61bobo3bo7b3o44bobbo 15bo10b3o42boo$152boo8boo3bo38bo11boo8bo8bo24b3o13bo372boo11bo5bo40bo 17bobo63bo10b4oboo41bobbo15bo25boboo23boo$56boobo51boo49bo3boo37bobo 10boo7bo35boo12bobo4boo365boo8b3o65boo65bo11boobbo41boo43boobo22bobo$ 56boboo5boo45boo49boo40bobo19b3o48bo5bo11boo363bo148b3o41boo69bo5boo$ 64bobo44bo51b5o38bo78b3o8boo494boo11bobo100boo14boo5boo$49boo13bo222bo 569boo31boo16boo$49boo12boo138boo3bo531bo3boo111bobboobbo25bobo$183boo 19bo3boo9bo519boo3bo19boo91boob4obo26bo62bo$134boo6boo19bo6boo11bobo 15b3o4boo9bo21boo463boo31boo4b3o15bobo11boo6bo19boo6boo44bobbobbo26boo 59b3o$92b3o39bo7bo18b3o6boo13bo15bo7bo9bo21boo463boo17b3o11bo7bo15bo 13boo6b3o18bo7bo48boo87bo$94bo40b3o5b3o14bo24boo575boo24bo14b3o5b3o 138boo$93bo43bo7bo14boo53b3o3b3o507b3o53boo14bo7bo$89bo828boo$39boo48b oo128bo509bo188bo$40bo47bobo128bo509bo49b3o134bobo$40bobo83boo31bo59bo 509bo49b3o39boo93boo$41boo83boo3boo92boo552b3o10bo23boo3boo111boo$131b oo24b3obo62boo556b3o5b3o23boo117bo$147bo8boboo66bo510bo44b3o4bo145bobo $147b3o6boobo567boo8b3o42b3o4boo145boo$82bo35boo12boo16bo3bob3o43bo 524boo11bo5bo68boo12boo87boo$39boo40bobo35bo5boo5bo16boo49b3o8boo6boo 506boo10boo4bobo12boo25bo28bo5boo5bo88bo$40bo39bo35b3o6boo6b3o20bo36bo 5bo11boo4bobbo17bo477bo10bo18bo13b3o23bobo24b3o6boo6b3o83bobo11boo21b oo$27boo11bobo37bo3boo30bo18bo16bo39bobo4boo36bobo12bo463boo8bobo6boo 23boobo23boobboo20bo18bo83boo12bo5boo15boo$28bo12boo36boo3bo66bobo24b 3o12bo23bobbo17bo12boboo460bobo8boboo5boo25bobo14bo11boo135bobo4bobo$ 28bobo51bobbo61boobboo23bob3o22boo6b3o4bobbo5boo26bo505bobbo12b3o144b oobboo5bo$29boobboo47boo63boo11bo14bobobo23boo7boo5bobo5boo22bobbobo 486bo18boo12bo27bo9bo109boo8boo$33boo40bo5boo77b3o12bobbo6boo22boo9bo 32bobbo470boo14bo4b4o24boo26b3o5b3o$75bo4boob3o39bo9bo27bo12boo7boo22b 3o42boo465boo4boo13bobo3booboo13boo39bo3bo13boo$81boobobo38b3o5b3o26b oo21boo4boo17bobo6boo22boo3bo454bo17boo21bo3bo3boo13bo38boo3boo13bo$ 81boo3boo25boo13bo3bo39boo16bobbo17boo6boo22b3oboboo436bobo12bobo37b3o 6boo9boo3bobo55bo97boo28boo$34boo46boobbo26bo13boo3boo38bo18boo42bo7b 3o4bo439bo12bo42boo14boo4boo4boo49boo96boo4boo23bo$28boo4boo41boo4b3o 28bo55bobo3boo13bo44boo8bo3bo3boo430bobbo23boo7boo3boo18b3o12boo9bobbo 152boo23bobo$28boo45bobbo5bo6boo20boo49boo4boo4boo57boo10b3obbobbo429b obobo23boo5boboobbobbo5boo10b3o12bo11boo179boo$74bobbo13boo70bobbo44b oo6boo26bo437bobbo31bo5bobo25boo5bobo22boo$75boo87boo44bobbo4bobbo30bo bbo430boo32bo6boboo23boo5boboo21boo$152boo22b3o5boo4bo18bobobo4bobobbo 22boo5bobbo434boboo25bobbo4b3o13bo$152boo23boo5boo4bobo15b3obo6bo26boo 6bobo433bobboobb3o21boo6boo12bobo82boo106boboo$174boo14boo3bo12b3o9boo bo12bo18bo441boo45bo17boo64boo98boo6boobo$29boo79boo62b3o17bobo25bo12b obo4boo442boobbo5boo6bobo55boo5boo157bobo$28bobo79boo63bobo17bo40bo5bo 11boo430boo3boo11boo64boo158bo14boo$11bo16bo147boo65b3o8boo449bo15boo 46bo160boo13boo$boo8b3o13boo58boo156bo447bo26bobbo$boo11bo5bo66boo598b oo4bobbo22bobobo49bo3boo$13boo4bobo12bobo648boboo5boo23bobbo49boo3bo 19boo$20bo12bo127boo3bo518bo19bo12bo20boo31boo4b3o15bobo11boo6bo19boo 6boo41boo$oo7boo23bobbo103boo19bo3boo14boo501bo12boo4bobo12bobo17boo 31bo7bo15bo13boo6b3o18bo7bo41bobo$oobo5boo23bobobo53boo6boo19bo6boo11b obo15b3o4boo14boo15boo484bobbo10bo5bo89boo24bo14b3o5b3o42bo$3bo15bo15b obbo53bo7bo18b3o6boo13bo15bo7bo31boo485boo8b3o121boo14bo7bo110boo$3bo 14boo16boo55b3o5b3o14bo24boo551bo258bo$obbo7bobo4bobo74bo7bo14boo833bo bo$boo5bobbobbo25boo911boo$10bo3bo26bo41bo739boo29boo$6bobboobboo21boo 3bobo35boobbo739boobo22boo3boo$6booboo25boo4boo34bo5bo112boo8boo618bo 8bo12boo$boo5bo68boobbobo5boo39bo62boobobboboo3bobbo614bo9b3o$obbo74b oo3bo5boo39boo61boobbo4bo3bobobo552boo16bo43boboo4bo121boo$obobo23boo 5boo42b3o47boobo65bo8bobbo534bo17bobbo4boo8b3o43boo4boo13boo12boo91bo$ bobbo23boo5boobo89bobb3o65bobo9bo519bo12bobo24boo11bo5bo58bo5boo5bo90b obo11boo$5bo12bo19bo37boo12boo26bo8bobobo56bo19bobo518boobo12bo17bobbo 16boo4bobo12bo26boo13b3o6boo6b3o73boo12boo12bo$bbobo12bobo18bo38bo5boo 5bo27b3o5bobobo56boo539bo26boo5bobbo5bo18bo12boboo24boo13bo18bo73boo 24bobo$18bo16bobbo35b3o6boo6b3o27bobb3obbo43bo13bobo537bobobbo22boo5bo bo5bobo6boo26bo21bo5boo124boobboo$36boo36bo18bo26boo3boboo42b3o8boo 543bobbo32bo6bobbo5boo10bo11bobbobo14bo10bobo124boo$126boo36bo5bo11boo 13boo529boo41bobbo15b3o4boo6bobbo12b3o9b3o$123bo3bo21boo12bobo4boo25b oo548bobo5boo6boo25bobboobobbo6boo12bo9bob3o13bo9bo$122bobo23b3o13bo 579bo4bo4bobbo5boo6bobbo10b3o3bobbobboo21boo8b4o14b3o5b3o$118boobboo 23boboo23boo5boboo558b3o3bo4bobbo13boo11bo4bobo18boo19bo19bo3bo13boo 63b3obbo20boo$29b3o86boo11bo14bobo25boo5bobo544boo12bobo8booboo26bo8bo 17bo38boo3boo13bo63b3obbob3o11bo4boo4boo$13boo14bobb3o96b3o12bobbo7bo 24bo545bobbo10bobo9boo28boo5boo13boo3bobo55bo63bobbobbob3obboo7boo9boo $13boo14boo4bo60bo9bo27bo12boo6b3o24boo559b5o15boo26bo14boo4boo4boo49b oo60boobbo10boo7b3o$32boboo3bo56b3o5b3o26boo27bo19boo544bobbo12boo16bo bbo5boo13bo3bo26bobbo110bo3bo19boo$34boo3bo44boo13bo3bo39boo17boo18boo 27bo515bobbo5boo22bobbobo4bobbo14bo17bo11boo111b4o6boo$34boo3bo44bo13b oo3boo13boo23bo17boo41bobo3bobo514bobo6boo26bo5bobobbo22boo5bobo22boo 22bo86boo8bo$34bobo48bo33boo20bobo3boo46bo9boo4bo516bo18bo12boboo7bo 26boo5bobbo21boo22bo3b3o80bo$33bobbo47boo15bo16bo16boo4boo4boo45bobo8b o534boo4bobo12bo10boobo12bo17bobbo44bobbo3bo76bobo24boo$34boo64b3o31bo bbo44boo11bo532boo11bo5bo26bo12bobo67bo4bo9boo65bo25bobo$99bobboo31boo 25bo18bobbo543boo8b3o47bo7bo9bobbo9bo38boo3bo8boo44b3o46bo$39boo58bo3b o19boo21boboo5boo4bo20bobo553bo58boo7boo10bobo42bo54bo48boo$21bo17boo 59boobo19boo21bobo6boo4b3o16boobo18boo7boo583boo20bobo37bobboo56bo$6b oo12bobo16boo61boo43bo18bo13b3o18bobbo6bobo605bo38bobbo115bo$5b3o13bo 18bo40boo64boo16bobo12boo22boo7bo645bo115b3o8boo$4boboo23boo6bobo39boo 15bobo34bo11boo17bo36bo9boo601boo3boo145bo5bo11bobbo$3bobo25boo5boobo 55bobbo33bobo10boo59boo608bobbo19boo111bo12bobo4boo$3bobbo91boboo32bob o64boo6bo573boo20b3o7bo6b3o15bobo11boo6bo19boo6boo60boobo12bo17bobbo$ 4boo5bo89bo33bo64bobbo579boo31boo6bo15bo13boo6b3o18bo7bo59bo26boo5bobb o$10bobo26boo60boo98b3obo597bo5bo29boo24bo14b3o5b3o59bobobbo22boo5bobo $9booboobboo21boo91boo3bo67bo597bo5bo54boo14bo7bo61bobbo32bo$10boo3bob o94boo19bo3boo9bo47bobo604bo5bo48boo91boo$4boo3bobobb3o5bo40boo6boo19b o6boo11bobo15b3o4boo9bo21boo23bo762bo3boo22boo$4boo9boo4bo41bo7bo18b3o 6boo13bo15bo7bo9bo21boo24bobbo8boo595b3o48bo3bo95boobob3o22boo$4boo15b 3o15boo23b3o5b3o14bo24boo80bobobo3boobobboboo642bo4bo36boo56bo4b3o7bo$ 5bo32bobbo24bo7bo14boo53b3o3b3o44bobbo3boobbo4bo585boo57bobobo8bo21boo 3boo51boo3bo3bo8boo$4bobo5boo25bobo156boo9bo588bobo58bobobo5b3o21boo 56bobbobb3o10boo$3boobo5boo23boobo107bo61bobo587bo15bo43bo4bobbo90bo 26boo$23bo13b3o108bo657boo8b3o42bo3bobboo81bobbo30bobbo$16boo4bobo12b oo16boo91bo657boo11bo5bo66boo12boo42bobbo5boo22bobbobo$4boo11bo5bo31b oo3boo756boo4bobo12bobo20boobbo26bo5boo5bo43bobo6boo26bo$4boo8b3o43boo 82boo679bo12bo26bobo22b3o6boo6b3o41bo18bo12boboo$14bo129boo17bo641boo 7boo23bobbo23boobboo18bo18bo59bobo12bo$162bobo12bo627boobo5boo23bobobo 14bo11boo79boo17bo$47boo12boo81bo18bo12boboo628bo15bo15bobbo12b3o92boo $48bo5boo5bo81bobo6boo5boo19bo627bo14boo16boo12bo27bo9bo$45b3o6boo6b3o 78bobbo5boo4boo16bobbobo617boo4bobbo7bobo4bobo29boo26b3o5b3o44b3o$45bo 18bo79bobbo12bo17bobbo599bo17bobo4boo5bobbobbo25boo39bo3bo13boo33boo$ 179boo599bobo17b3o12bo3bo26bo38boo3boo13bo29bo3bo$144bobbo618b3o12bo 19boo8bobboobboo21boo3bobo55bo29bo3bo$144boo618bob3o22boo5boo11booboo 25boo4boo4boo49boo29boo18bo18boo$158boo603bobobo23boo5b3o5boo5bo38bobb o80bo18bo18boo$157bobo19boo582bobbo6boo30bobbo44boo94bo5bo$153bo5bo19b oo583boo6bobbo29bobobo23boo5boo23boo82bo$144boo7bo4bo614boo4boo18boo5b obbo23boo5boobo21boo82bo$143bobbo6bo25bo597boobbo17boo9bo12bo19bo$143b obobbo6bo15boo5bobo596booboo25bobo12bobo18bo63boo42b3o$144bo26boo5bobb o582boo12b3o42bo16bobbo63boo$145boobo12bo17bobbo581bobo74boo87bobo$ 147bo12bobo4boo596b3o31boo129boo16boo$161bo5bo11bobbo583boo30bobbo129b o16boo17bo$168b3o8boo582boo7boo23bobobo164bobo$170bo592b3o6boo22b3obo 50boo3boo109bo12b3o$783bo12b3o54bobbo19boo69b3o6boo22b3obo$776boo4bobo 33boo30bo6b3o15bobo11boo6bo19boo6boo20boo7boo23bobobo$764boo11bo5bo34b oo31boo6bo15bo13boo6b3o18bo7bo23boo30bobbo$764boo8b3o97boo24bo14b3o5b 3o23b3o31boo$774bo64b3o57boo14bo7bo24bobo4b3o9boo$841bo106boo4boo3bo7b obo$840bo112boobbobo7bo$954bo5bo22boo$933boo20boobbo23boo$928boo3boo 13boo9bo$844boo82boo17bobbo$826bo17boo101bobobo23boo5b3o$811boo12bobo 16boo102bob3o22boo5boo$810b3o13bo18bo81boo12boo7b3o12bo19boo$809boboo 23boo6bobo81bo5boo5bo22bobo4boo11b3o$808bobo25boo5boobo78b3o6boo6b3o 20bo5bo11bobo$808bobbo113bo18bo27b3o8boo$809boo5bo157bo$815bobo26boo$ 814booboobboo21boo$815boo3bobo$809boo3bobobb3o5bo$809boo9boo4bo$809boo 15b3o15boo$810bo32bobbo$809bobo5boo25bobo$808boobo5boo23boobo$828bo13b 3o$821boo4bobo12boo$809boo11bo5bo$809boo8b3o$819bo! golly-3.3-src/Patterns/Life/Guns/p690-PT-Cordership-gun.rle0000644000175000017500000001505612026730263020230 00000000000000#C 15-glider construction of a 3-engine Cordership. #C p690 gun shown; minimum repeat rate is 542 generations. #C Construction cleanup reaction found by Jason Summers. #C Paul Tooke, 19 January 2004 x = 517, y = 471, rule = B3/S23 115bo$106bo8b2o$105bobo2b2o4b2o$105bobo2b2o4b3o7b2o$106bo3b2o4b2o8b2o$ 115b2o62b2o$115bo63b2o$23b2o78b2o3b2o$23b2o78b2o3b2o2$105b3o116b2o$24b o80b3o115bobo$23bobo80bo23b2o90bo6b2o$22bo3bo86b2o14b2ob2o6b2o80bo2bo 2bo2bob2o$22b5o86b2o15bo2bo6b2o37bo42bo6b2o2b2o$21b2o3b2o102bo2bo44b3o 31b3o8bobo28b2o$22b5o73bobo28b2o44b5o42b2o28b2o$23b3o74bo3bo71b2o3b2o 29bobo$24bo65b2o12bo9b3ob3o10b2o78b5o$90b2o8bo4bo7bob2ob2obo8bo2bo27b 2o47b2o3b2o$104bo7b2o7b2o7bo2bo6b2o2b2o14b2ob2o6b2o37b2o3b2o$41b2o57bo 3bo8bob2ob2obo7b2ob2o6b2o2b2o15bo2bo6b2o5b3o73bo$31b2o7bobo15b2o40bobo 11b3ob3o9b2o29bo2bo13b3o46b2o2bobo20bo$31b2o6b2obo15b2o102b2o19b2o28bo 6b2o4b3obo3bo12b2o4bobo$40b2o141b2o26b2o7b2o3b2o6bo13b2o3b2ob2o$17b2o 22bo120b2o14b2o6b2o6b2o30bob5o18bo5bo$17bobo141bo2bo12bo2bo5b3o5b2o11b o2bo16b3o24bo$8b3ob2o4b3o20bo102b2o15bo2bo13b2o6b2o17bobo2bo40b2o3b2o$ 8b4o2bo4b3o18b2o102b2o14b2ob2o18b2o12b2o4b2o9bo12b3o33b2o$12b2o4b3o18b 2obo15b2o101b2o20b2o12b2o4b2o6bo14bob5o30bobo$17bobo20bobo15b2o143b2o 8b2o10b2o6bo13b2o5bo3b2o4b3o$17b2o22b2o162bobo18b3obo3bo12b2o4bob3o2bo 4b3o$207bo19b2o2bobo19bob2ob2o4b3o$186b2o66bo8bobo$186b2o75b2o$53b2o$ 54bo$54bobo8b2o119b3o$20b2o5b2o26b2o6bo2bo7bo111b3o70b2o$20b2o5b2o33bo 7b2o3bo177bo5b2o$62bo6bo5bo176b3o$62bo7b5o176bo3bo14bo$63bo2bo117b2o3b 2o60b2ob2o13b3o$65b2o118b5o78b5o$76b2o108b3o63b3o12b2o3b2o$77bo109bo 64b3o13b5o$77bobo8b2o84bo93bo3bo$78b2o7b3o83bobo93bobo$84bob2o9b2o73bo b2o94bo$84bo2bo4bo5bo67b2o3b2ob2o$84bob2o5bo72b2o4bob2o$87b3o3bo3bo75b obo70bo7b2ob2o10b2o$88b2o5bo78bo48b2o19b3o7b2ob2o10b2o$223bo19bo10b2ob 2o$210bo10bobo19b2o7bob2ob2obo$19b2obo3bob2o66b2o111bobo9b2o29b3o3b3o$ 19bo2bo3bo2bo67bo83b2o19b2o3b2o3bo40bo5bo$20b3o3b3o68bobo10bo69bo2bo 18b2o3b2o3bo27b3o$98b2o9b4o67bo7bo18b2o3bo27b3o$108b2obobo3b2o61bo2bo 3bobo19bobo27bo3bo$107b3obo2bo2b2o61b2ob2ob2ob2o19bo27bo5bo$108b2obobo 70bobo52bo3bo$109b4o70b2ob2o52b3o$110bo$130bo$20b2o108b3o119b2o5b2o$ 20b2o111bo118b2o5b2o$132b2o47b3o3b3o$180bo9bo$180bo3bobo3bo$14b2o165b 3o3b3o$14bobo165bo5bo$9b2o6bo223b2o$5b2obo2bo2bo2bo116b3o104b2o$5b2o2b 2o6bo115bo3bo$14bobo8b3o$14b2o116bo5bo$25bobo104b2o3b2o$24b5o$23b2o3b 2o$23b2o3b2o105bo92bo$134bobo89b3o$134bobo88bo$26bo109bo44b2o5b2o35b2o $27b2o107bo44b2o5b2o$133bo2bo86bo$29bo104b2o86b3o$221bo3bo$25bo2bo194b o$25b2o193bo5bo$220bo5bo$221bo3bo$222b3o4$228bo2bo$231bo7b3o23bo$227bo 9bo4bo21bobo$227b2o8bo5bo19bob2o$233bo8bo19b2ob2o10b2o$52b2o14bo7b2o 145b2o5b2o8b2o21bob2o10b2o$51bobo13b2o6bo2bo12b2o130b2o39bobo$50bo6b2o 7bo8bo2b2o11b2o137b2o8b2o23bo$41b2o7bo2bo2bo2bo7b2obo4bo2bo154bo8bo$ 41b2o7bo6b2o9b3o6bo149b2o8bo5bo10b2o$51bobo173bo9bo4bo11b2o$52b2o14b3o 6bo153bo7b3o19b3o$65bob2obo4bo2bo18b2o129bo2bo28b2ob2o$56b3o5bo10bo2b 2o11b2o4bobo160b2ob2o$56b3o5bo3bo6bo2bo12b2o5b3o159b5o$11b2o42bo3bo5b 4o7b2o21b2o158b2o3b2o$10bobo13b3o5b4o12b2o2bo5bo38b2o$9b3o4b2o8bo7b2ob o12b2o3bo3bo37bobo$2o6b3o4bo2bo7b2obo7bo18b3o39bo$2o7b3o4b2o10b2o5b2o$ 10bobo247b2o$11b2o15b2o5b2o58b2o3b2o$16bo9b2obo7bo57b2o3b2o$15bobo5b4o 7b2obo12b2o$14bo3bo4b6o5b4o12b2o45b3o162b2o$14b5o67bo10b3o162b2o$13b2o 3b2o66b2o10bo$14b5o58b2o2b2o4b2o$15b3o38b2o19b2o2b2o4b3o$16bo39b2o23b 2o4b2o$86b2o$86bo4$92b2o$74b2o16b2o$74b2o$15b2o$15b2o2$93bo5bo$92b3o3b 3o$91bo2b2ob2o2bo$91bo3bobo3bo$93bobobobo$72b2obob2o$90b2ob2o3b2ob2o$ 72bo5bo13bo7bo$63b2o$63b2o8b2ob2o$54b2o3bo6b2o7bo$54bobo3bo5b3o$55b5o 6b2o$56b3o4b2o$63b2o4$51b2o16b2o$51b2o16b2o$75b3o$74bo3bo13b2o5b2o$74b 2ob2o13b2o5b2o2$74b2ob2o$76bo$148bo$147bobo$147b2obo$69bo7bo69b2ob2o3b 2o$49b2o3b2o12bo2bo3bo2bo68b2obo4b2o$40bobo8b3o18bobo61b2o9bobo$40bo2b o6bo3bo17bobo60bobo10bo$31b2o10b2o6bobo18bobo60bo$31b2o8bo3b2o5bo15bo 2bo3bo2bo55b2o$36b2o5b2o24b3o3b3o$35bo4bo2bo$40bobo4$46b2o5bo$27b2o17b 2o4b3o$27b2o22b2ob2o2$50bobobobo12b2o5b2o$69b2o5b2o$51b2ob2o61bo$51b2o b2o60bobo$53bo60b2o3bo$114b2o3bo9b2o$28bo85b2o3bo9b2o$27b3o80b2o4bobo$ 26b5o78bobo5bo$25b2o3b2o77bo$20bo87b2o$19bobo$7b2o10b2obo$7b2o10b2ob2o 3b3o15b2obo3bob2o$19b2obo4b3o15bo2bo3bo2bo$19bobo24b3o3b3o$20bo4$22b2o 4b3o$22b2o3bo3bo$27b2ob2o$28bobo15b2o5b2o39bo$46b2o5b2o39b4o196b2o$28b obo64b4o195b2o$27b2ob2o63bo2bo5b2o$27bo3bo63b4o5b2o$28b3o54b2o7b4o$84b obo7bo$84bo206bobo$83b2o204bo4bo$289bo4bo7b2o$293b2o7b2o2$289b2o2b2o$ 289b2o2b2o$21b3o5b3o258bob3o$21bo2b2ob2o2bo261bo$22b3o3b3o261bo$23bo5b o$63bobo224b2o14bo$63bo2bo223bobo12b4o$66b2o237bob2o$64bo3b2o4b2o214bo 16b2o$66b2o6b2o215bobo$55b2o6bo2bo224bo$22b2o5b2o23bobo6bobo220b2o4bo 10b2o$22b2o5b2o23bo230bobo4bo10b3o$53b2o228bobo2bo14b3obo$284bo2bo14b 2ob4o$286bo16b3o2bo$37bo3bo242b2o4b2o12bob2obo$21b2o13bobobobo8b4o235b 2o14b3o$21bobo10b2o2bobo2b2o6bo2b2o6b2o216bobo23b3o$16b2o6bo9b2o7b2o7b o2b2o5b2o215bo3bo21bo2bo$12b2obo2bo2bo2bo9b2o2bobo2b2o7bo2bo228b2o20b 3o$12b2o2b2o6bo11bobobobo10b2o224bo5bo21bo$21bobo13bo3bo237bo6bo$21b2o 30b2o206bo12bo5b2o4bo$52bo2bo204bo11b3o11bo$35b2o15bo2b2o5b2o196b3o9b 5o5bo3bo$35b2o14bo2b2o6b2o207b3o8bo3bo$51b4o209b2o17bobo$267bo15b3o$ 264bo2bo$264bo2bo$27b3o234b3o$26bo3bo232bo$25bo5bo5bobo223bo$26bo3bo4b o3bo$27b3o5bo12b2o210b2o14bo$27b3o4bo4bo8b2o210bobo12b4o$35bo239bob2o$ 35bo3bo212b2o6bo16b2o$37bobo212b2o7bobo$261bo$262bo10b2o$262bo10b3o$ 273b3obo$272b2ob4o71b2o$273b3o2bo71b3o$260b2o12bob2obo72bo$260b2o14b3o 70bob3o$276b3o70b3ob2o$275bo2bo74bo$276b3o70bob2o$277bo71bo3bo$353b2o 3b2o$354bo3b2o$352b3o$352bo2$344bo$343bob2o$343bob2o10b2o$344b2o10bobo $355b2obo4b3o$356b2o$357bo2$343b3o$339b5ob2o$338bo2bo5bo14b2o$338b3ob 5o14bo$344b2o16b2o3$346b2o$346b2o14bo$358b2ob2o$361bo2bo$359bo6bo$359b o2bo3bo$360b4o2b3o$360bo2bo2b2o$338b2o22bo3bo$337b4o20bob3o$335b2ob2o 22b3o$337bo4bo20bo$336bo2b2ob2o$336b2o2bobo2bo$337bo2bobo2bo$338b2o3b 2o$338bo3bo$327b2o13bo$326bobo10b3o$325b2obo4b3o$326b2o$327bo$308b2o$ 308b2o2$332b2o$331bo$332b2o3$316b2o$316b2o14bo$328b2ob2o$331bo2bo$329b o6bo$329bo2bo3bo$330b4o2b3o$330bo2bo2b2o$332bo3bo$331bob3o$332b3o$333b o51$470b2o$470b2o6$457b3o10bobo$459bo10bobo5b2o$458bo9b4o6b2o$461bobo 4b2o$460b4o4b2o$459b2obo$459bo2bo$459bo3bo$460bo$462b2o5$467b2o$466bo 2bo11bo$469bo3bo6b3o$466b5o3bo5b3o$468bo6bo7b3o$469bo3b2o$469b2o2$457b 3o2$451bo5bo3bo43b2o$444b3o4bo6b4o43b2o$446bo14bo$443bo2bo$442bo2bo$ 435b2o7bo$434bob3o$433b2o3bo3bo5b2o$435bob2o2bo6b2o63b2o$431bo81b2o$ 430b2o$420b2o4b2o4bo$420b2o4bo2b2o$427b2o$428bo5$428b2o$428b2o7b2o$ 436bo2bo11bo$439bo3bo6b3o$436b5o3bo5b3o$438bo6bo7b3o$439bo3b2o$439b2o$ 510b2obo$510b2ob3o$516bo$510b2ob3o$511bobo$511bobo$512bo$487b2obo$487b 2ob3o$493bo$487b2ob3o$488bobo$488bobo$489bo6$451b2o$451b2o4$478b2obo$ 478b2ob3o$484bo$459b2o17b2ob3o$459b2o18bobo$479bobo$480bo! golly-3.3-src/Patterns/Life/Guns/2c5-spaceship-gun-p690.rle0000644000175000017500000007670412026730263020162 00000000000000#C p690 gun for a 2c/5 spaceship. #C Based on a glider synthesis primarily by Noam Elkies. #C Jason Summers, 28 Oct 03 #C (Note: The first gun for this spaceship was built by #C Dave Greene in April 2003 -- see 2c5-spaceship-gun-p416.rle. #C This one was constructed independently.) x = 871, y = 854, rule = B3/S23 21boo$21boo5$844boo$844boo$21b3o$20bo3bo$844bo$19bo5bo817b3o$19boo3boo 816bo3bo$844bo$38b4o799bo5bo$22bo6boo6boobbo14boo783bo5bo$21bobo5boo5b oobbo15boo784bo3bo$21bobo13bobbo802b3o$17bo3bo16boo46boo$14b4o3bo64boo $6boo5b4o4bobbo13boo776boobbobo$6boo5bobbo4bobbo12bobbo768boo4b3obo3bo 12boo$13b4o5boo12boobbo15boo751boo3boo6bo13boo$14b4o19boobbo14boo757bo b5o$17bo20b4o774b3o31boo$86bo742bobo3bobo10bobbo7bo$85b3o728b3o12bo3bo 11bo7boo3bo$51boo32b3o727bob5o5bo11bo7bo6bo5bo$15boo5boo26b4o7boo746b oo3boo6bo3bo3bo5bo3bo6bo7b5o$15boo5boo25bobobo6bobboo11boo5boo3boo719b oo4b3obo3bo3bo11bo8bobbo$49boob3o4b6o11boo5boo3boo726boobbobo8bo3bo14b oo$52boobo5b4o30bo733bobo3bobo$52boobo39boo$16bo5bo63bo3boo4boo8boo10b oo729boo$15b3o3b3o28boobo29bobobboo4b3o7boo10boo728bobbo$14boobbobobb oo27boobo5b4o20bobobboo4boo750bo$14booboobooboo26bobbo4b6o11boo8bo8boo 751bo$17booboo30boo6bobboo11boo17bo665boo85bobo$15bobo3bobo28boo7boo 698boo85bobo$14bobbo3bobbo736boo86bo$17bo3bo740bo$14bobo5bobo66boo668b obo$15bo7bo67boo668bobo82boo3boo$762bo83bo5bo$117b3o$22bo93bo3bo726bo 3bo$21bobo91bo5bo5bobo629boo3boo82b3o10boo$116bo3bo4bo3bo629bobobobo 94bo3bo$19bo5bo91b3o5bo12boo620b5o94bo5bo3boo$22bo94b3o4bo4bo8boo621b 3o95bo3boboobboo$19boo3boo58b3o3b3o32bo623bo12bo96bo5bo$83bobbo3bobbo 31bo3bo617b4o109bo3bo$83boobo3boboo33bobo611boo3boboboo109boo$741boobb obbob3o$19boo3boo720boboboo$15boo5bo724b4o$15boobbo5bo97boo624bo104boo $123boo672boo55boo$21bobo773bo$22bo764boo6bobo$12bo104bo5bo613boo17boo 28bobo5b3o$11boo8bo94b3o3b3o612boo15bobbo18boo7bo6b3o$10boo4boobbobo 25bo67bobooboobo612boo23b3o11boo7bobbobbobbo$oo7b3o4boobbobo25b3o64boo 7boo612bo20bobo3bo19bo6boo$oo8boo4boo3bo29bo63boo7boo611bobo14boo3bobo 3bo20bobo$11boo37boo63b3o5b3o611bobo23boo22boo58b3o3b3o$12bo104b3ob3o 614bo19bo3bo83bobbo3bobbo$18boo3boo27b3o64bobo724boobo3boboo$18boo3boo 27b3o29boo5boo23bobbobobbo$84boo5boo22bobbo3bobbo609boo3boo$20b3o93boo 5boo610bobobobo14boo5boo$20b3o713b5o93boo5boo$21bo28boo3boo680b3o15bo 9bo68boo5boo$51b5o669bo12bo16bo3bobo3bo$52b3o668b4o28bo3bobo3bo$53bo 663boo3boboboo28bobo3bobo$143boo572boobbobbob3o28bo5bo$143boo577bobob oo106b3o3b3o$20boo701b4o107bobbobobbo$20boo703bo107bo3bobo3bo$739bo94b obbobobbo$739bo96bo3bo$834boo5boo$52boo62boo5boo607boo99b3o5b3o3boo5b oo$52boo62boo5boo607boobboo3boo90b3o5b3o3boo5boo$$142b3o$141bo3bo610b oo5boo$140bo5bo609boo5boo$140bo5bo5bo681b3o$143bo6bobo583boo3boo91b3o$ 141bo3bo3bobo11boo668b5o$142b3o3bobbo11boo667boo3boo$143bo5bobo587bo 92boo3boo$150bobo586bo$152bo548boo$701boo$732bo7bo91boo3boo$732boo5boo 91boo3boobboo$148boo582b3o3b3o92b5o3boo$148boo584booboo95b3o$734bo3bo 95b3o$731boo7boo$731boo7boo107bo$79boo620b3o31bobo68boo40b4o$79boo619b o3bo26bobbo3bobbo64boo39boobobo$699bo5bo26b3o3b3o105b3obobbobboo$699b ooboboo141boobobo3boo$142bo5bo545bo153b4o$141b3o3b3o543bobo140bo12bo$ 140boobo3boboo27boo501boo9bo3boo4bo29boo5boo94b3o$178boo501boo9bo3boo 3bobo28boo5boo93b5o$178boo512bo3boo3bobo129bobobobo$143bo3bo30bo514bob o6bo102b3o25boo3boo$143bo3bo29bobo514bo109bo3bo$177bobo623bo5bo$77boo 3boo94bo624booboboo26bo$68bobo8b3o732bo20bobo$68bobbo6bo3bo613boo115bo bo19bobo$59boo10boo6bobo93boo3boo514boo108bo4boo3bo9boo8bo$59boo8bo3b oo5bo94bobobobo623bobo3boo3bo9boo8boo$64boo5boo103b5o624bobo3boo3bo19b oo$63bo4bobbo105b3o626bo6bobo20boo$68bobo107bo12bo622bo$190b4o$189boob obo3boo$141boo5boo38b3obobbobboo497bo5bo$74boo24bobo38boo5boo39boobobo 501b3o3b3o83bo22boo$74boo23bobbo87b4o501bobbooboobbo81bobo6bo14bobbo$ 98boo10boo79bo503b3o5b3o69boo9bo3boo3bobo6b3o$90bo5boo3bo8boo555boo 106boo9bo3boo3bobo5bo3bobo$89bobo6boo5boo560boo117bo3boo4bo6bo3bobo3b oo$75bo5bo6bo3bo6bobbo4bo679bobo14boo$74b3o3b3o6b3o8bobo80boo16boo585b o17bo3bo$73boobbobobboo3boo3boo89boo16boo590booboboo$73booboobooboo26b oo556bo124bo5bo$76booboo29boo555bobo124bo3bo$74bobo3bobo583bo3bo124b3o 6boo5boo$73bobbo3bobbo583b3o$76bo3bo584boo3boo131bo9bo$73bobo5bobo116b 3o600bo3bobo3bo$74bo7bo27b3o86booboo566boo31bo3bobo3bo$110b3o86booboo 566boo32bobo3bobo$109bo3bo85b5o453bobo145bo5bo$198boo3boo451bobbo4bo$ 90boo16boo3boo532boo6boo5boo32boo5boo90boo$90boo118boo435boo4boo3bo9bo 27boo5boo65bo24boo$176b3o3b3o25bobbo441boo11bo100b3o$101boo5boo66bobbo bobbo16b6o7bo6boo433bobbo108bo3bo$100b3o3bo4bo64booboboboo15bo6bo6bo6b oo434bobo107bob3obo$90boo5boboo5bo69boo5boo15bo4boo7bo553b5o$90boo5bo bbo4bo6bo88boo7bobbo455bo$97boboo9bobo97boo456b3o$100b3o559boo3bo3bo$ 74boo5boo18boo97bo461boobbo5bo107bo23boo5boo$74boo5boo95booboo16bobo 464bo5bo102bo4b4o20boo5boo$176bobbobobbo13bo3bo3boo459bo3bo103bo5b4o5b oo$176bobo3bobo13b5o3boo573bobbo5boo$105boo23boo44b3o3b3o12bobobobo 463bo3bo109b4o$105boo23b3o43boo5boo13bo3bo463bo5bo25bo81b4o$120bobo9b oobo5boo33boo5boo481bo5bo23boo82bo$120bo6bo4bobbo5boo28bo4boo5boo13bo 3bo464bo3bo25boo$106bo5bo13bo5boobo29bo3bobo25bobobobo464b3o$105b3o3b 3o7bo4bo3b3o33bo3boo26b5o27boo437bo$105bobooboobo9boo5boo32b3o31bo3bo 27boo473bobo42bo24boo$104boo7boo84bobo503boo40b4o24boo$104boo7boo85bo 505bo32boo5b4o$104b3o5b3o3boo3boo614boo5bobbo$106b3ob3o25boo522bo7bo 75b4o5bo$108bobo8bo3bo14boo520booboo3booboo74b4o4bo$105bobbobobbo6b3o 106b3o518bo$104bobbo3bobbo5b3o504boo34bobobobo$105boo5boo25bo58b3o5b3o 20bobo395boo32bo3bobo3bo66boo$138bobo56booboo3booboo18b5o428bobbooboo bbo66boo$137bo3bo55booboboboboboo17boo3boo428b3o3b3o87b5o$137b5o56bo3b obo3bo18boo3boo429bo5bo87bob3obo$121boo13boo3boo23bo31bobbo3bobbo30boo 388boo79bo47bo3bo6bo5bo$121boo14b5o25bo31b3o3b3o31bobo468bobo46b3o6b3o 3b3o$138b3o24b3o62bo3boo6bo7boo458boo48bo6booboobooboo$139bo89bobobobb obbobbo7boo466bobo45b3o7b3o$229bobobboo6bo419boo5boo47boo$128bo101bo8b obo383boo3boo30boo5boo48bo48bo7bo$126bobo63bo46boo385b5o104booboboo17b oo$118boo4boo64bobo6boo5boo418booboo128boo$118boo4boo65boo6boo5boo21bo 386boo8booboo104bo5bo$105boo5boo10boo102bobo377bo7bobbo7b3o119boo$105b oo5boo12bobo98bo3bo3boo370bo3boo7bo115booboo8boo$128bo98b5o3boo370bo5b o6bo117bo7boo6bo3boo$192bo33bobobobo375b5o7bo124b3o5bo3bobo$190bobo34b o3bo384bobbo126boo6b5o$191boo423boo131boo4b3o$133boo25bo66bo3bo438bo 78boo17boo5boo$133boo25bobo63bobobobo436bo98boo5boo$163boo4boo56b5o 437b3o$163boo4boo24bo31bo3bo390boo$163boo31bo31bobo391boo92boo19bo5boo $160bobo24bo6b3o32bo392boo92boo18b3o4boo$160bo27bo433b3o3b3o76boo3bo6b oo14booboo$186b3o433bobo3bobo76bobo3bo5b3o$134bo5bo8bo472bobbobobbo77b 5o6boo7bo5bobobobo$133b3o3b3o6b3o15boo40bo415booboo80b3o4boo8booboo$ 132bobbooboobbo4b5o14boo39bo508boo17booboo$132b3o5b3o3boo3boo54b3o17b 3o5b3o487bo5bo3booboo$147b5o74booboo3booboo468boo28bo$147bo3bo17bo56b ooboboboboboo468boo16booboboo$148bobo17bo58bo3bobo3bo384boo5boo$149bo 18bo58bobbo3bobbo384booboboboo$228b3o3b3o385bobbobobbo30bo$622b3o3b3o 29bo$149boo13boo3boo489b3o$149boo16bo$164bo5bo$165booboo84boo5boo445bo 26boobo3boboo$155boo9bobo59boo5boo17boo5boo444b3o17boo6bobbo3bobbo$ 155bobo9bo60boo5boo469b5o16boo7b3o3b3o$146b3oboo4b3o8bo494bobo40boo3b oo$146b4obbo4b3o502boo52bo$150boo4b3o504bo51bobo$133boo5boo13bobo556bo boo10boo$133boo5boo13boo45b3o502b3o3booboo10boo$201bobbo502b3o4boboo$ 204bo417boo5boo84bobo$204bo417boo5boo85bo19boo5boo$161boo25boo11bobo 50bo7bo473boo5boo$161boo24bobo$186b3o4boob3o53b3o7b3o$185b3o4bobb4o54b ooboobooboo426bo16bo5boo$177bo8b3o4boo59b3o3b3o426bobo15bo5boo$177bo9b obo65bo5bo415boo10boobo4b3o6b3o$176bobo9boo476boo9boo10booboo3b3o$175b ooboo485b3o21boobo12booboo$174bo5bo384boo98bobboo19bobo13booboo$177bo 132boo253boo99b4o20bo15bobo$174boo3boo13boo114boo356bo26boo3boo5bo$ 162bo5bo25bobo479boo18b5o$161b3o3b3o25b3o478boo19b3o$160boobbobobboo5b o19boo367b3o130bo$159bob4ob4obo4bo19boo367b3o$161b3o3b3o5bo18bobo71bo 7boo286bo3bo136b3o5b3o$160b3o5b3o24bo71boo6bobbo12boo16b3o251bo5bo136b 3o3b3o$266bo8bobboo11boo271bo3bo135bob4ob4obo$177boo88boobo4bobbo30bob o253b3o108bo28boobbobobboo$177boo13boo3boo69b3o6bo30b5o362b3o28b3o3b3o $192boo3boo108boo3boo361b3o29bo5bo$268b3o6bo29boo3boo240bobo140boo$ 194b3o68boboobo4bobbo40boo137boo92bo3bo116boo3boo17boo$183bo10b3o67bo 10bobboo11boo26bobo136boo85boo5bo120boo3boo$183boo10bo68bo3bo6bobbo12b oo17bo3boo6bo7boo213boo4bo4bo128bo$174boobboo4boo79b4o7boo31bobobobbo bbobbo7boo220bo132boo$174boobboo4b3o122bobobboo6bo229bo3bo119bo3boo4b oo8boo$161boo5boo8boo4boo124bo8bobo232bobo118bobobboo4b3o7boo$161boo5b oo13boo134boo354bobobboo4boo$183bo89boo401bo8boo$274bo33b3o147bo226bo 20boo5boo$274bobo7bo23b3o146b3o84boo14boo144boo5boo$275boo7b4o19b5o3b oo139b5o83boo14boo$189boo26bo67b4o5boo10boo3boobboo16boo120bobobobo 212b3o$189boo25boo67bobbo5boo10boo3boo20boo120boo3boo195bo16b3o4boo$ 215boo4boobboo58b4o367boo8bo6bo3bo3boo$214b3o4boobboo57b4o154boobo99bo 99boo8boo4boobbobo4bo5bo$215boo4boo61bo48bo89boo12b3obboobbo3boo6bo85b obo13b3o3b3o76boo7b3o4boobbobo5booboo$205bo10boo88boo3boo19bobo88boo 13boo6bo3boo5bobo83bo3bo12bobbobobbo86boo4boo3bo$204b3o10bo88boo3boo 18bo3bo103b3o3boo10bobo84b3o12bo3bobo3bo86boo15booboo$204b3o100b5o19b 5o104bo3bo13bo3bobo77boo3boo11bobbobobbo88bo14bo5bo$308b3o19boo3boo 120boo3bobbo96bo3bo96boo3boo3bo3bo$202boo3boo99b3o20b5o104bo3bo12boo6b oo6boo85boo5boo94boo3boo4b3o$202boo3boo123b3o104b3o3boo9bobbo3bo3boo4b oo84b3o5b3o104b3o$190bo5bo136bo89boo13boo6bo10boo6boo67bobo22b3o5b3o 95b3o$189b3o3b3o225boo12b3obboobbo15bobbo67bobbo4bo123b3o$188boobbobo bboo6bo138bo97boobo16bobo59boo6boo5boo125bo$187bob4ob4obo4bobo100b3o5b 3o26bobo177boo4boo3bo9bo$189b3o3b3o5boo102b3o5b3o29boo4boo177boo11bo$ 188b3o5b3o4boo13b3o87boo5boo30boo4boo178bobbo$203b3o14bo89bo3bo32boo 185bobo136boo7boo$204bobo12bo88bobbobobbo27bobo326boboo3boobo$205boo 100bo3bobo3bo26bo86bo6bo226boo6bo3bobo3bo$308bobbobobbo113boo6boo225b oo6boobbobobboo$308b3o3b3o112b3o6b3o14bo83boo133b3o3b3o$430boo6boo13b 3o83boo134bo5bo$338boo91bo6bo13bo109booboo$338boo106bo4bobo109bobo$ 253b3o190boo4bo110bobo$255bo52boo5boo128bobo116bo$189boo5boo56bo53boo 5boo15bo5bo$189boo5boo133b3o3b3o110boo222boo5boo$331bobooboobo110boo 222boo5boo$330boo7boo$330boo7boo170boo$330b3o5b3o25boo143boo$332b3ob3o 27boo$334bobo203bo5bo$262bo68bobbobobbo199b3o3b3o$235boo24boo67bobbo3b obbo65boo5boo19boo102bo3bobo3bo$234bobo23b3obo9boo55boo5boo66boo5boo 20boo101bo9bo$233bo6boo17boo13boo158bo104b3o3b3o$224boo7bobbobbobbo17b oo$224boo7bo6boo19bo103b3o283boo5boo$234bobo127bo3bo282boo5boo$235boo 24bo247boo3boo$260boo101bo5bo171booboo$182bo15boo7b3o29b3o5boo10boo13b oo87boo3boo130boo8bo3bo27bobo$180bobo14bobbo4bo4bo11boo15b3o5boo11b3ob o9boo98boo124b3o8b3o24booboobooboo60boo$178boo8boo7bobbo4bo5bo10boo14b o3bo18boo109bo3bo114boo9boobo5b3o24bobbo3bobbo60boo$172boo4boo6bo10bo 3bo8bo26bo5bo18bo103bo4bo5bo8boo35bo67bo5bo4bobbo32bo9bo$172boo4boo9bo 8boo8boo28bo3bo122bobobboobo3bo8boo35boo71bo5boobo32bobbo3bobbo103bo5b o$180bobobbo53b3o123bobo3bo5bo44bobo3boo5boo29boo24bo3bo3b3o36boo5boo 103b3o3b3o$182bobbo12boo8boo62boo57boo5boo26bo5bo3bo29bo7bo13boo5boo 29boo26bo5boo148bobbooboobbo$201bo8bo61boo57boo5boo34boo30boo5boo194bo 40b3o5b3o$186boo7boo8bo5bo10boo141bo40b3o3b3o192booboo$188bo6bo9bo4bo 11boo141bo42booboo$199bo7b3o62b3o133bo3bo93boo5bo92bo5bo$196bobbo72b3o 96boo32boo7boo90boo4bobo$185boo3boo170boo3boobboo32boo7boo95bo3bo90boo boboo$185boo3boo217bobo99bo3bo$186b5o214bobbo3bobbo94b3ob3o101boo$187b obo49boo29boo3boo129b3o3b3o96bo3bo94b4o4boo$239boo30b5o235booboo93b6o 6boo6boo$187b3o82b3o135bo5bo11b3o3b3o26boo3boo42bobo93boboo3bo5b3o5boo $273bo88boo3boo40b3o3b3o9bo3bobo3bo27b3o45bo94bo5bo6boo$260bo147boobbo bobboo7bo3booboo3bo25bo3bo21boo117bo8boo$259bobo146booboobooboo7boboo 5boobo26bobo5boo15bobo7boo116boo$252boo4boboo103bo45booboo12bo7bo29bo 6boo17bo7boo$252boo3booboo103bo43bobo3bobo72b3o$187boo69boboo13bo132bo bbo3bobbo43boo44bo3bo139bo$187boo70bobo14bo134bo3bo45bo3bo11bo30bo3bo 76boo17bo5boo35bo$260bo13b3o87bo7bo35bobo5bobo31boo8bo5bo8bo3boo108boo 8bo8bo5boo20bo14b3o$364boo5boo36bo7bo32boo8bo3boboo6booboboo9b3o85boo 6boo6bo5bo6b3o25b3o$364b3o3b3o61b3o23bo5bo6boo6bo10bo7boo3boobo3boboo 62boo5b3o5bo3boobo33boobo$366booboo63bobo24bo3bo8booboboo9bobo7boo4b3o 3b3o71boo6b6o6booboo23b3o$267boo27bo69bo3bo62bo3bo24boo11bo3boo9boo15b o5bo75boo4b4o7booboo23b3o$267boo26bobo65boo7boo59bo3bo39bo111boo16bobo 25boo$295boobo4boo58boo7boo234bo$295booboo3boo62bobo58boo4b3o87bobo51b oo16booboboo51bo7bo$295boobo44bo19bobbo3bobbo54boo49boo43boo52boo73b4o 3b4o$295bobo46bo19b3o3b3o104bo3bo43bo70bo5bo50bo3bobo3bo$296bo41bo3b3o 131bo5bo157bo13bobbobobbo$283bo52bobo136boobo3bo8boo41bo62booboo4b3o5b 3o23bobo11b3o3b3o$282b3o52boo137bo5bo8boo13boo5boo17boo42boo21bo7b3o3b 3o24boo$281b5o15boo61boo5boo58boo44bo3bo24boo5boo18boo70bob4ob4obo$ 280boo3boo14boo61boo5boo36boo5boo13boo46boo125boobbobobboo12boo$409boo 5boo189b3o3b3o13boo$268bo5bo177boo5boo15bo131bo5bo$267b3o3b3o25b3o148b oo5boo14bobo97boo3boo16boo$266booboobooboo5b3o16b3o170bo3bo97b5o17boo 28bo16boo7boo5boo$265b3o7b3o4b3o190b3o98booboo46bobo13bo4bo5boo5boo$ 431b3o39boo3boo96booboo8boo37bo13bo6bo$267bo7bo154booboo142b3o7bobbo7b o26b3o13bo8bo$283boo14boo3boo124booboo151bo7boo3bo25bo15bo8bo$283boo 15b5o125b5o103bo47bo6bo5bo41bo8bo$301b3o35bo89boo3boo101bo48bo7b5o43bo 6bo$302bo34bobo197b3o47bobbo52bo4bo$289bo48boo82boo123bo41boo16boo5boo 29boo$288bobo129bobbo28b3o3b3o84boo60boo5boo$281boo4boboo128bo7b6o18bo bbo3bobbo84boo$281boo3booboo73bo46boo6bo6bo6bo21bobo173bo3bo10boo$287b oboo74bo45boo6bo7boo4bo21bobo98boo25boo32boo10booboboboo7b5o$267boo5b oo12bobo72b3o54bobbo7boo22bobo17boo71bo7bobbo23boo31b3o9boboo3boobo6bo 4bo5boo$267boo5boo13bo132boo27bobbo3bobbo13boo70bo3boo7bo52boboo5boo3b obbo5bobbo5b3obbo5boo$452bo7bo86bo5bo6bo45boo5bobbo4bobbo3boboo3boobo 7bobboo$548b5o7bo45boo5boboo5boo5booboboboo9boo$303bo60bo191bobbo7b3o 46b3o12bo3bo$296boo4b3o20bo39bo190boo8booboo46boo3bo24boo$296boo3bo3bo 18bobo36b3o87bo112booboo50bobo22bobboo$301booboo18boobo4boo117booboo 91boo17b5o50bobo5boo14b3obbo5boo$301booboo18booboo3boo163bo47bobbo16b oo3boo50bo6boo14bo4bo5boo$324boobo123booboo41bobo145b5o$301booboo18bob o124bo3bo41boo45bo101boo$301booboo19bo42bo83b3o164booboboo$301bo3bo6bo 53bobo90boo84boo72bo5bo$302b3o6b3o46bo6boo90boo86bo21boo5boo5boo35bo3b o$303bo6b5o43bobo214bobbo3bobbo35b3o$309boo3boo13boo28boo215bobbobobbo $329boo213boo3boo28bobo$200boo5boo255bobo77boo3boo16boo8b3ob3o$200boo 5boo163bo90bobbo4bo73b5o17boo6b3o5b3o$311b3o56bobo89boo5boo75bobo26boo 7boo$311b3o57boo81bo5boo3bo8boo82boo15boo7boo$296bo7bo148bobo6boo10boo 70b3o8bobo16bobooboobo$295b4o3b4o23b3o120bo3bo6bobbo89bo6boobboo7b3o3b 3o36boo$295bo3bobo3bo6boo14booboo59bo60b3o8bobo89bobbobbobboboo8bo5bo 37boo$296bobbobobbo7boo14booboo60bo57boo3boo30bo67bo6boo$296b3o3b3o23b 5o58b3o94bobo66bobo$216boo109boo3boo154boo68boo16boo5boo$216boo358boo 5boo$320boo$318bobbo$309boo6bo7b6o194boo25boo$309boo6bo6bo6bo159bo33bo bo24boo$296boo5boo12bo7boo4bo157boo25boobboo6bo$296boo5boo13bobbo7boo 159boo24boobobbobbobbo96boo$199b3o5b3o110boo198boo6bo96boo$199bobboob oobbo244boo39bo29bobo8b3o86boo$200b3o3b3o245boo38bo30boo99bo$201bo5bo 7b3o276b3o39bobo86bobo$214bo3bo105boo23boo184b5o5b3o3b3o71bobo$213bo5b o5bobo96boo14boo7bobbo181boo3boo4bobbobobbo72bo$214bo3bo4bo3bo102b3o6b o4boo7bo6boo172boo3boo3bo3bobo3bo113boo$215b3o5bo105bo3bo5bo6bo6bo6boo 182b4o3b4o113boo$215b3o4bo4bo8boo66boo23booboo6b6o7bo191bo7bo69boo3boo $223bo12boo66boo43bobbo89bobo92bo85bobobobo$200boo21bo3bo101booboo15b oo94bo92boo84b5o$146boo52boo23bobo103bo109bo3bo179b3o42boo$146boo189b oo3boo101bo94bo85bo$338b5o99bobbo196b4o$338booboo100b3o90bobbo93boo6b oobbo14boo$195bobo126bo7bo5booboo193boo95boo5boobbo15boo$148boo45bo3bo 123bobbo3bobbo5b3o299bobbo21boo3boo$185boo12bo127bobo289bobo20boo23b5o $185boo8bo4bo4b3o119bobo97bo191bobbo44booboo$199bo5b3o95b3o21bobo98boo 180boo10boo18boo23booboo$195bo3bo4bo3bo93bo3bo16bobbo3bobbo93boo181boo 8bo3boo15bobbo23b3o$144boo3boo44bobo5bo5bo91bo5bo16b3o3b3o282boo5boo 16boobbo15boo$145b5o54bo3bo75bobobboo11bo3bo33boo272bo4bobbo18boobbo 14boo$145booboo55b3o13bobbo44boo12bo3bob3o4boo5b3o34boo203boo5boo65bob o20b4o$135boo8booboo74bo7b3o34boo13bo6boo3boo5b3o13boo147bobo74boo5boo 118bo$127bo7bobbo7b3o71bo9bo4bo11boo36b5obo27bo148boo201bobo$126bo3boo 7bo80boo8bo5bo10boo39b3o17boo7bobo112bo36bo200boboo10boo$126bo5bo6bo 86bo8bo72bobo6boo114bo235booboo10boo$127b5o7bo83boo8boo53b3o12boo6bo 119b3o102boo132boboo$135bobbo146b5obo10bobbobbobbo223booboo131bobo$ 135boo21boo63boo8boo34boo13bo6boo10boo6bo113bo110b4o132bo193bo$159bo 66bo8bo33boo12bo3bob3o16bobo13boo5boo93bo17bo92boo326bobo$159bobo58boo 8bo5bo47bobobboo17boo14boo5boo91b3o15boo421bobo$147b3o10bobo42boo13bo 9bo4bo207boo419boob3o$141boo4b3o11bo3boo38boo17bo7b3o635bo$141boo3bo3b o14boo54bobbo49boo588boob3o$145bo5bo121b4o289bo297boobo$146booboo122b ooboo285b5o$245bo29boo163bobo119bo5bo$146booboo92bo3bo192boo124boo$ 145bo5bo96bo192bo121bobbo$146bo3bo92bo4bo189bo131boo$147b3o94b5o187bob o129booboo$147b3o113b4o170boo129boobo$262bo3bo296bobbo3bo$157b3o9boo 95bo296b7o$156bo3bo7boo29bo62bobbo$156bo3bo9bo26bobbo362b7o$157b3o25b oo10b5o361bobbo3bo$185boo10b3oboo37boo195boo129boobo$140boo7boo47boobo 38boo194bobo129booboo$140boboo3boobo48boo237bo131boo$140bo3bobo3bo290b o121bobbo$140boobbobobboo6b3o39boo81bobbo154boo124boo$141b3o3b3o6bo3bo 37boobo38b3o26boo15bo153bobo119bo5bo$142bo5bo7bo3bo24boo10b3oboo9boo 26b3o19b3o4boo11bo3bo276b5o$157b3o21bo3boo10b5o10boo25bo3bo17b5o6boo9b 4o279bo297boobo$180boo15bobbo37bo5bo15bobo3bo5b3o589boob3o$180bobo16bo 39bo3bo16boo3bo6boo596bo$240b3o26boo172boo419boob3o$269boo63boo5boo81b 3o15boo421bobo$141boo5boo47boo135boo5boo83bo17bo420bobo$141boo5boo46bo bo15boo13bobo193bo64b4o181boo189bo$195boobo15boo11bo3bo258bo3bo180bobo $184boo10boo29bo203b3o56bo179boo6bo$167boo14booboo9bo22boo4bo4bo201bo 57bobbo174bobbobbobbo7boo$167boo15bobbo32boo5bo48bo155bo39boo196boo6bo 7boo$184bobbo9bo29bo3bo43b3o193boo202bobo$185boo9boo31bobo42b5o194bo 108boo91boo$195boobo15boo57boo3boo70boo229bobbo32boo22boo$185boo9bobo 15boo134boo115boo68boo5boo38bo32bobo20bobo15boo10b3o$184bobbo9boo268bo bo67boo5boo38bo27boo6bo19bo17boo10b3o$167boo15bobbo47boo24bobo203bo 114bobo23boobobbobbobbo19b3o26bo3bo$167boo14booboo47boo24bo3bo9b3o304b obo23boobboo6bo47bo5bo$184boo79bo5boobb3o305bo33bobo49bo3bo$261bo4bo4b oo61bo7bo274boo51b3o$265bo66booboo3booboo4b3o288b3o$261bo3bo9boo71boob oo113bo113boo3boo44boo7bo17boo$261bobo11boo58bobobobo6booboo61boo27b3o 19boo113bo5bo44boo7bobo15boo$333bo3bobo3bo4b5o62boo25bobbo19bobo60boo 111boo$235b3o3b3o89bobbooboobbo3boo3boo60bo30bo82boo51bo3bo$235bobbobo bbo6b3o81b3o3b3o98bo3bo91bo7bo36b3o$234bo3bobo3bo4bo3bo81bo5bo17boo84b o90bobbo3bobbo53boo$234b4o3b4o3bo5bo104bobbo79bobo95bobo47boo7bobo15b oo4b3o$235bo7bo5bo3bo96b6o7bo176bobo47boo7bo17boo3bo3bo$250b3o96bo6bo 6bo6boo168bobo56b3o19bo5bo42boo$250b3o96bo4boo7bo6boo164bobbo3bobbo30b o44bo3bo43boo$334boo14boo7bobbo174b3o3b3o31b4o42b3o$334boo23boo206boo 9b4o41b3o$491boo36bo37boo9bobbo17b3o$251boo238bobo34b3o41bo5b4o17bo17b oo$251boo238bo35b5o40bo4b4o18bobo15boo$330boo187bo6boo3boo44bo8bobo11b oo21boo$306boo5boo13bobbo7boo178bobo5b5o55boo34boo$306boo5boo12bo7boo 4bo180boo3bo3bo55bo$319boo6bo6bo6bo62b3o101boo12boo4bobo$319boo6bo7b6o 65bo101boo12boo5bo$328bobbo73bo113bobo22boo$330boo187bo24boo56boo6boo$ 235boo5boo357bobbo4bobbo$235boo5boo93boo3boo242bo14bobbo4bobbo$338b5o 225boo5boo9b3o12bobbo4bobbo$322boo14booboo206bo18boo5boo12bo12boo6boo$ 322boo14booboo204bobo38bobo24boo5boo$339b3o197bo5boo42bo25boo5boo$538b obo4boo12boo36bo$321b3o47boo164bo3bo3boo12boo35boo$306boo5boo6b3o46bob o164b5o5bobo40boo4bobo$306bobooboobo57bo163boo3boo6bo19bo5bo14boo$307b obobobo223b5o26b3o3b3o$307bobobobo25boo197b3o18boo6boobbobobboo$306bo 7bo4boo3boo13boo198bo19boo6bo3bobo3bo$320b5o242boboo3boobo$321b3o43boo 198boo7boo$322bo43bobo$308booboo22bo32bo$306bobbobobbo19bobo17boo141b oo118booboo$306b3o3b3o19boobo17boo140bobo108boo6bo5bo$307bo5bo20booboo 3boo10bo142bo109boo$334boobo4boo216bo48bo5bo7bo$306boo26bobo26b3o173b oo18b3o6b3o44bobbobobbo$306boo27bo29bo173boo17b5o5b3o44b3o3b3o$364bo 192boo3boo3bo3bo$552bo13bo5bo$551bobo13booboo$277boo5boo13bo251boobo$ 277boo5boo12bobo62b3o88boo83boo10booboo3b3o5booboo$297boboo47bo16bo88b oo83boo10boobo4b3o4bo5bo$291boo3booboo47boo14bo186bobo13bo3bo3boo$291b oo4boboo46bobo202bo15b3o4boo$298bobo267b3o$299bo$312bo$277b3o3b3o25b3o 60boo5boo70b3o122bo34bo5bo$277bobbobobbo7boo15b5o58bobo5bobo68booboo 120bobo32b3o3b3o$276bo3bobo3bo6boo14boo3boo56b3o7b3o67booboo81b3o28b3o 4boboo32bobooboobo$276b4o3b4o85boob3ob3oboo67b5o41boo5boo31bo30b3o3boo boo10boo22booboo$277bo7bo87b5ob5o67boo3boo39bobbo3bobbo31bo36boboo10b oo22booboo$292b3o80bo5bo115bo9bo69bobo34booboo$292b3o16b3o62booboo82b oo32bobbo3bobbo70bo$311b3o149bobbo30booboobooboo59boo3boo$454b6o7bo6b oo25bobo64b5o$453bo6bo6bo6boo24booboo64b3o$290boo3boo14boo62bo5bo71bo 4boo7bo102bo$284bo6b5o15boo61boo5boo71boo7bobbo66boo$283b3o6b3o42boo 34boboo3boobo79boo67boo$282bo3bo6bo42bobo34boboo3boobo150bo$282booboo 19bo31bo3b3o29b3o3b3o115b3o3b3o$282booboo18bobo36bo29b3o3b3o114bo9bo 17bo$305boobo34bo115boo36bo3bobo3bo16boo$282booboo18booboo3boo144boo 37b3o3b3o17bobo85boo5boo$282booboo18boobo4boo184bo5bo64boo40boo5boo$ 277boo3bo3bo18bobo262boo$277boo4b3o20bo$284bo$$246boo5boo184bo$246boo 5boo15bo167bo$269bobo166b3o12bo5bo$268boboo180b3o3b3o$247bo5bo8boo3boo boo109boo68boobo3boboo$246b3o3b3o7boo4boboo109boo37bo54boo$246bobooboo bo14bobo148boo53boo158boo5boo$245boo7boo14bo140boobboo4boo31bo3bo39boo 135boo5boo$245boo7boo27bo127boobboo4b3o30bo3bo39boo$245b3o5b3o6boo18b 3o56boo5boo37boo26boo4boo$247b3ob3o8boo17b5o55boo5boo37boo4b3o24boo10b o$249bobo28boo3boo97boo6b5o23bo10b3o$246bobbobobbo128b3o5bo3bobo33b3o 41b3o14boo$192boo51bobbo3bobbo120bo7boo6bo3boo76booboo13bobbo35boo5boo $192boo52boo5boo119booboo8boo40boo3boo38booboo5b5o7bo34boo5boo$282b3o 102boo40boo3boo38b5o4bo5bo6bo129boo$282b3o88bo5bo93boo3boo3bo3boo7bo 129boo$484bo7bobbo7b3o$373booboboo52bo59boo8booboo$282boo147bobo68boob oo122bo7bo3bo$193bo65boo3boo16boo149boo17boo5boo41b5o121bo8bo3bo$192b 3o147bo5bo84boo17boo5boo16boo22boo3boo120bo$192b3o65bo3bo8boo5bo60bobo 3bobo59boo5boo14b3o$261b3o8b3o3bo3bo57bo3bobo3bo58boo5boo13bobo50bo 149boobo3boboo$190boo3boo64b3o5boboo5bo61bo3bobo3bo80boo50bobo138boo3b oo4b3o3b3o$190boo3boo72bobbo4bo5bo56bo9bo132boobo4boo134bo8bo5bo$269bo boo9boo125b3o3b3o38bobbo23booboo3boo12boo99boo16bo5bo$246boo24b3o66boo 5boo26boo31bobbobobbo37bo27boobo120bo17booboo$193bo6boo8b3o14boo17boo 25boo101boo33booboo39bo3bo23bobo121bobo5boo9bobo$192bobo5boo8bo3bo12b oo199boo25b4o25bo45b3o5b3o67boo5bobo9bo$191boo17bo4bo191bo11bo8boo73b oo24booboo3booboo74b3o8bo$186bobobboo18bo3bo127bo3bo60bo9bo84boo24boob oboboboboo75b3o$184bo3bobb3o40bo5boo99boo67bobobobo113bo3bobo3bo75b3o$ 177boo5bo6b3o17bo3bo16bo3bo3b3o75boo5boo13bo3bobo3boo58bobobobo41bo23b 4o44bobbo3bobbo74bobo24boo$177boo4bo4bo3bobbo14bo4bo20bo5boobo14boo56b oo5boo13bo3bobo64booboo41bobo21boobbo14boo29b3o3b3o75boo25boo$184bo8b oo15bo3bo12boobbo5bo4bobbo14b3o55boo5boo14b3o64bobbo3bobbo37boboo20boo bbo15boo$184bo3bo21b3o14boobboo9boobo5b3o5boboo55b3o3b3o21bobbo57boo5b oo32boo3booboo21bobbo148boo$186bobo51b3o8b3o5b3o56bobo3bobo21boo100boo 4boboo22boo149bobo31boo5boo$240boo8bo3bo5bo57bobbobobbo130bobo173bo14b oo16bobo5bobo$320booboo104bo5bo22bo23boo163bobo15b3o7b3o$249boo3boo 172b3o3b3o44bobbo46boo113b3o4boo10boob3ob3oboo$351boo75bobooboobo27boo 7boo5boobbo15boo29boo112b3o4bobb4o7b5ob5o$343bo5bo3bo76booboo38boo6boo bbo14boo135bo8b3o4boob3o9bo5bo$342bobo3bo5bo75booboo47b4o151bo9bobo19b ooboo$318boo5boo15bobobboobo3bo8boo65booboo201bobo9boo$318booboboboo 16bo4bo5bo8boo162boo106booboo$318bobbobobbo22bo3bo109boo3boo57boo8bo 96bo5bo17boo$318b3o3b3o24boo111b5o55boo6bo5bo98bo20boo8bo5bo$193boo5b oo138boo3boo117booboo47boo5b3o5bo3boobo95boo3boo17boo7boo5boo$193boo5b oo138bo5bo117booboo47boo6boo6b6o121bo6boboo3boobo$251boo212b3o59boo4b 4o121bobo5boboo3boobo$251boo88bo3bo181boo107bo21bobo6b3o3b3o$342b3o72b obo216bo22bo7b3o3b3o$418boo114booboboo94bo$418bo$534bo5bo115boo3boo$ 406boo5boo13boo5boo29boo169boo17bobobobo$209boo195bobooboobo13boo5boo 29boo67booboo97boo18b5o$209boo196bobobobo123bo120b3o$343boo62bobobobo 232bo12bo$325boo16boo61bo7bo229b4o$209bo115boo316boboboo$208bobo427boo bbobbob3o$193bo7bo5bo3bo217bo106boo100boo3boboboo$191booboo3booboo3b5o 196booboo17boo104boo106b4o26boo$206boo3boo117bobo73bobbobobbo14boo152b oo5boo54bo27boo$194bobobobo6b5o117bobbo4bo68b3o3b3o168boo5boo$192bo3bo bo3bo5b3o117boo5boo70bo5bo$192bobbooboobbo6bo73boo5boo28bo5boo3bo8boo 355boo5boo$193b3o3b3o81boo5boo27bobo6boo10boo64boo5boo267bo14boo5boo$ 194bo5bo19bo97bo3bo6bobbo73boo5boo266b4o$220bobo7bobo86b3o8bobo347boob obo$223boo6boo84boo3boo355b3obobbobboo$223boo6bo448boobobo3boo$223boo 388b3o65b4o$193boo25bobo4boo211bobo172bo53bo12bo$193boo25bo6bobo211boo 140bo7bo22bo53b3o$229bo211bo8boo215b5o16boo$229boo219boo129b3o7b3o72bo bobobo15boo$582booboobooboo73boo3boo24bo7bo$188bo394b3o3b3o104bobbo3bo bbo$165boo5boo12bobo263bo131bo5bo109bobo$101boo5boo55boo5boo10boo97boo 5boo159bobo215bo19bo10bobo$101boo5boo68boo4boo96bobbo3bobbo27boo110b6o 14bo215bobo17bobo9bobo$178boo4boo99booboo30boo109bo6bo14b3o212bobo16bo 3bo4bobbo3bobbo$186bobo95bobobobo139bo8bo15bo213bo18b3o6b3o3b3o$188bo 95bobobobo140bo6bo229boo16boo3boo$282bo9bo139b6o201b3o26boo$199bo81bo 11bo345bo28boo$198b3o439bo$181boo14b5o83booboo388bobo$101b3o3b3o7boo 62boo13boo3boobbobo52boo21bobbobobbo385bobbo4bo$100bobbo3bobbo6boo78b 5o6bo50bobo21b3o3b3o291boo91boo5boo$100boobo3boboo86bo3bo6bo49bo6boo 197boo117boo83boo4boo3bo9bo$180b3o15bobo4bobbo49bobbobbobboboo152boobb oo4bobboo24bobbo172boo28boo6boo11bo$180b3o16bo6b3o49bo6boobboo8bo10boo 131booboo6boobo23bo7b5o163boo38bobbo23boo$117bo47bo7bo76boo7bobo16boo 10boo135bobo6bo24bo6bo5bo164bo38bobo23boo$116b3o44booboo3booboo73bobo 8boo16bobo147boo4b3o24bo7boo3bo101bo$115bo3bo78boo49bo212bobbo7bo100b 4o141boo$114bob3obo45bobobobo5boo3boo13boo48boo178boo4b3o27boo107bobob oo140bo$115b5o44bo3bobo3bo4b5o109bo133bobo6bo131boobbobbob3o128bobo6bo bo$164bobbooboobbo5b3o102bo5b4o128booboo6boobo12boo116boo3boboboo129bo bbo5boo$108bo56b3o3b3o7bo102bobo3boboboo127boobboo4bobboo12boo122b4o 121bo11boo$106booboo55bo5bo21bo89bobobbobbob3o8boo269bo12bo109bo9bo3b oo$106booboo16bo65bobo89bo4boboboo9boo281b3o113boo5boo$122bo4b4o62boob o94b4o292b5o111bo4bobbo$105bobobobo10bo5b4o61booboo3boo90bo163b3o126bo bobobo30boo5boo31b3o42bobo$128bobbo5boo54boobo4boo79boo3boo167bo3bo 125boo3boo30boo5boo31bo$106booboo17b4o5boo26boo26bobo36boo5boo41bobobo bo166bo5bo202bo64boo5boo$101boo4b3o17b4o34boo27bo37boo5boo42b5o167bo5b o267boo5boo$101boo5bo18bo156b3o171bo130bo106boo3boo$285bo170bo3bo127bo bo107b3o$135boo5boo313b3o128bobo106bo3bo$135boo5boo14bo299bo130bo108bo bo$97bo59bobo428boo109bo$94b4o58boboo428boo$93b4o53boo3booboo298boo 128boo$86boo5bobbo53boo4boboo298boo260boo7b3o3b3o$86boo5b4o5bo54bobo 125boo412boo19boo6bobbo3bobbo$94b4o4bo55bo126boo412boo27boobo3boboo$ 97bo73bo451boo5boo$135b3o3b3o7boo17b3o449bobbo3bobbo90bo$134bobbo3bobb o6boo16b5o58boo5boo382bobbobobbo90bo$134boobo3boboo23boo3boo57bobooboo bo385bobo93bo$105b5o105b3o15bobobobo384b3ob3o$104bob3obo104bo17bobobob o382b3o5b3o$105bo3bo106bo15bo7bo381boo7boo85boo3boo$106b3o61b3o449boo 7boo88bo$107bo42b3o17b3o450bobooboobo86bo5bo5bo$623b3o3b3o87booboo4boo boo$150bobo41b3o37booboo385bo5bo78boo9bobo5booboo$149b5o17boo23bo35bo bbobobbo468bobo9bo$106boo34bo5boo3boo16boo9bo12bo36b3o3b3o463boo4b3o8b o5bobobobo$106boo32booboo3boo3boo27boo49bo5bo383boo44b3o28b4obbo4b3o$ 140booboo15boo19bobo439boo44bo30b3oboo4b3o15booboo$160bobo76boo429bo 38bobo17b3o4boo$139bobobobo5bo3boo6bo27boo46boo468boo19bo5boo$150bobob obbobbobbo7boo17bobo$140booboo5bobobboo6bo7boo19bo10boo5boo407boo$135b oo4b3o7bo8bobo40boo5boo406bobo8bo129boo5boo$135boo5bo17boo84bo370bo6b oobbobo111boo15boo5boo$245boo361boo7bobbobbobbobobo26boo5boo75bobo$ 191boo51boo4boo356boo7bo6boo3bo27boo5boo74b3o4boo$190bobo50b3o4boobboo 362bobo118b3o4bobb4o$131boo42boo15bo51boo4boobboo363boo110bo8b3o4boob 3o$130bobo8bo34boo56bo10boo379boo3boo98bo9bobo$129bo6boobbobo32bo57b3o 10bo379boo3boo97bobo9boo$120boo7bobbobbobbobobo90b3o391b5o26bo5bo64boo boo$120boo7bo6boo3bo486bobo26b3o3b3o62bo5bo15boo$130bobo98boo3boo418bo bbooboobbo64bo18boo7b3o3b3o$131boo98boo3boo390b3o25bo3bobo3bo61boo3boo 24bobbobobbo$138boo3boo513bobobobo46boo46bo7bo$138boo3boo58boo5boo499b obo$139b5o59bobooboobo22bo420booboo3booboo43bo20bo27bo5bo$140bobo61bob obobo22bobo421bo7bo66bo28booboo$204bobobobo21boo499bo16b3o$140b3o60bo 7bo20boo394boo119booboo$232b3o393boo119booboo$233bobo494boo17b5o$234b oo428bo65boo16boo3boo5bo$205booboo453b3o40bo52bobo$203bobbobobbo450bo 3bo38boo34boo16bobo$140boo22b3o36b3o3b3o449bo5bo37bobo31bobbo15bo3bo$ 140boo24bo3boo32bo5bo450bo5bo70bo7b6o6booboo$165bo3bobo490bo3bo63boo6b o6bo6bo5bo3bo$171bo38boo485boo31boo6bo7boo4bo6b3o$210boo450bo3bo15boo 5boo5boo41bobbo7boo7b3o4boo$661bo5bo14boo5boo7bo42boo23boo$657boobbo5b o14boo5boo$126boo43boo5boo477boo3bo3bo15b3o3b3o$126boo43boo5boo36boo 445b3o16bobo3bobo$215bobo446bo17bobbobobbo79boo$214b3o4boo461booboo72b oo7bobbo$213b3o4bobb4o425bo107bo4boo7bo$205bo8b3o4boob3o420bo4b4o104bo 6bo6bo6boo$126b3o76bo9bobo429bo5b4o104b6o7bo6boo$126b3o75bobo9boo424b oo9bobbo6bo106bobbo$125bo3bo73booboo434boo9b4o5b3o17boo5boo79boo$202bo 5bo443b4o5bo3bo16booboboboo$124boo3boo74bo446bo7bob3obo15bobbobobbo67b oo3boo$202boo3boo452b5o16b3o3b3o68b5o$171b3o3b3o579booboo$170bo3bobo3b o578booboo$169bo3booboo3bo22bo555b3o$169boboo5boobo22bo$171bo7bo23bo 621boo$825boo$$124boo79boo$125bo79boo554boo$122b3o636boo$122bo48b3o 488boo$171bobo488boo$170bo3bo507boo$170bo3bo507boo$$171b3o4boo644b3o$ 178boo643bo3bo$676bo145bo5bo$676boo120bo3boo19bo3bo$672boo3boo111boo4b oobob3o13boo5b3o$182bo494b3o110boo4bo4b3o13boo5b3o$180bobo494boo117bo 3bo$173bo5bobo487boo5boo10bo108b3o29boo$172b3o3bobbo11boo473bobo5bo10b 3o121boo3boo11bobo$171bo3bo3bobo11boo473bo18b3o107b3o10b3o3b3o5boo6bo 7boo$134boo5boo30bo6bobo484boo54boo5boo53boo9bo3bo7b3o7b3obbobbobbobbo 7boo$134boo5boo27bo5bo5bo502boo3boo31boo5boo53boo3boo4bo4b3o4b3o7b3o3b oo6bo$170bo5bo508boo3boo98boo4boobob3o4b3o7b3o8bobo$171bo3bo622bo3boo 6b3o3b3o10boo$172b3o9boo5boo618boo3boo$184boo5boo495bo94boo$687bobo$ 689boo$689boo$688b3o$687bobo92boo3boo$687boo94b5o$82boo638b3o5b3o50boo boo$82boo89boo548b3o3b3o51booboo$173boo546bob4ob4obo50b3o$722boobbobo bboo$133boo7boo579b3o3b3o$133boboo3boobo580bo5bo$39boo41b3o48bo3bobo3b o40boo5boo$39boo41b3o48boobbobobboo40bobooboobo594boo$81bo3bo48b3o3b3o 42bobobobo595bo$135bo5bo43bobobobo596b3o$80boo3boo97bo7bo597bo$39b3o$ 39b3o69boo5boo687boo5boo$38bo3bo68boo5boo687boo5boo$37bo5bo142booboo$ 38bo3bo98boo41bobbobobbo530boo$39b3o99boo41b3o3b3o530boo$185bo5bo616bo 5bo$807b3o3b3o$80boo109boo613boobbobobboo$81bo62boo45boo526bo86booboob ooboo$47boo8b3o14boobb3o55bo5bo3bo569b4o89booboo$47boo8bo3bo12boobbo 56bobo3bo5bo567b4o88bobo3bobo$57bo4bo72bobobboobo3bo8boo550boo5bobbo 87bobbo3bobbo$33boo23bo3bo73bo4bo5bo8boo37bobo510boo5b4o5bo84bo3bo$33b obo77bo3bo24bo3bo46bo3bo518b4o4bo81bobo5bobo$24boobboo6bo21bo3bo50bo3b o26boo47bo525bo87bo7bo$24boobobbobbobbo20bo4bo70boo3boo45b3o4bo4bo8boo $28boo6bo20bo3bo12boo57bo5bo45b3o5bo12boo$33bobo21b3o14boo34boobo3bob oo63bo3bo4bo3bo610bo$33boo76b3o3b3o14bo3bo44bo5bo5bobo529b5o41bo33bobo $112bo5bo16b3o46bo3bo537bob3obo38bobo$185b3o539bo3bo37boo34bo5bo$728b 3o32boo4boo37bo$729bo33boo4boo34boo3boo$771bobo8boo$773bo8bobo$784bo$ 136boo590boo54boo19boo3boo$118boo16boo590boo78bo5boo$118boo619boo22boo 40bo5bobboo$739bobbo18booboo14boo$186boo543b5o7bo17bobbo15boo25bobo$ 186boo542bo5bo6bo17bobbo43bo$121bo608bo3boo7bo18boo53bo$113bo6bobo608b o7bobbo73bobo$112bobo3boo3bo615boo21boo44b3o4boboo$112bobo3boo3bo9boo 626bobbo43b3o3booboo10boo$113bo4boo3bo9boo618boo6bobbo15boo33boboo10b oo$120bobo630boo6booboo14boo34bobo$68bobo3bobo44bo641boo52bo$70bo3bo8b obobboo20booboboo689boo3boo$66bo11bo3bo3bob3o4boo13bo5bo690b5o$65bo3bo 5bo3bo3bo6boo3boo14bo3bo629b3o60b3o$66bo11bo5b5obo21b3o629bo3bo60bo$ 70bo3bo12b3o653bo5bo$68bobo3bobo666bo5bo$87b3o656bo$84b5obo653bo3bo$ 68boo13bo6boo3boo648b3o$68boo12bo3bob3o4boo649bo$83bobobboo$113boo694b oo$113boo630boo62boo$745boo$34bobo14boobo5bo3bo$29bo4bobbo12bobobo4bo 5bo9boo$30boo5boo11bo4bo9bo9boo$25boo8bo3boo9bobobo5bo3boo$25boo10boo 12boobo6b3o$34bobbo$34bobo24b3o$60bo3boo$48boo15bo9boo$48boo9bo5bo9boo $60bo3bo$41bo$40b3o$39b5o$38bobobobo$38boo3boo3$41bo$40bobo$40bobo$41b o$40boo$40boo$40boo! golly-3.3-src/Patterns/Life/Guns/infinite-Corderships-gun.rle.gz0000755000175000017500000003022613543255652021630 00000000000000‹ t}Û®íÆ•Ý{}żÝëF²4‚¤ÈC ¿À´Ž,¶¨ÈR:¯çcΪµ ÃG{­Eë2¯c^ø‡ÿññãOßÿøÓ¿~ù§¹ùîË/ÿáÇŸÿþOùí§o~ùë—oþòÿÒþçÇ¿Þýî×ÿòå—1Ž?ýôÝÇýîOûø_ߟéÿòñ¯¿ýôñëúõãûùò÷g”xðÇß¿üïß¾üôç/÷÷ßýøý÷_~ùòÓ¯Ëtìþ~ýõçÿüí·¾ú÷?ýÇ_üþË7¾ÿöí÷÷/¿ýíïßþŸ¿üû¯÷Ï?þù›Ÿøù¿üüϽ·mûÃÏøOú¿ÿü1öíÿaœù¿üö×/Ïßÿ­~ûo¥¦6¶«Ü/ûÏ}ÙËu7|sžW»Ÿ¿ž/ÊÅÏö‡þ‡{²L¸±Üc®|n(§^÷]wçßöýÕsÆö)å~U~¸óÀ×öÅó-G=.ÿ»çç’þêeØXüO{õ SßN^eÿ}þµ‡c=ﶞ熆¹úÏC{ÝÞ>§^ª-à góÚµz}Áénˆ=êÎ~Ú± `ŸŠÿ=·ô¨Ï‡ž±!ŸÒv»§á¯†Ë6¶ÝDz7í3Ǽ1å|â†#¾?}ª<ƒç—Äy?{õü‘í¦ª>×VûlÓl¾â÷£·)âšT?ÁQ°½wµsÝý'}ãj>ãçKœÔx&óìx¿üHž=³3°­³ƒMôÍjM’É›NÿÍû{ÌïêÅØžÕëÄÛÁ_´U›ôê½r¡ve*ñÄzÀìßIb|˜í v¥=cƒ{0~jõ|î ÁÆÙTìGnh¼ùªÞí±áêýÙÙ^°3› Úv'Íç:OÛ5…ó¨*o=è1ñpôýédYmdQeë“*[_N»ÙMöÐÔ¹˜ú}^ï½lKºËÎÕ6í‚ÝÕËü®ƒ jÅ~=O±]´ö¦sï;µgû¥â:‘k"½êRPÁsŠWÛˆûJÂuÁ+(ð~(£=ô™ì‹çÿï­î¶ñù¹Ú®Ù5z'Yâ¾ÊÓÔ\UãΓCÙ$Ú;_èI78ìÙa¬<݃MüŒØN27,?’e} ˆ(aÖŸõØü§Ác¸õÈ–R Œî’B„k‚(žl÷üF–·­ÜíêÒ‚uãAùfB+ÕÝ.Ì “_ÝùÃè1Ú³ Çj”Q±ãàÙ§7·ŸX˜QáaÖ‚MÓ%¶âççŽjøšt“ö¢#: dqm(Žwò{.º škµ|fÓìÏÂAŒŸÏ®‰çLñg£’Òö\ŠÄUȨ‡^“Äá‘h ¾/Æ1¶ÛÜWì@ÃîUÒ&5ƒ]Ô)OÉîÊS¥  ÌËÏ&6u±Ù<³ß+'ò| ½ºc)l©Q@~˜³ÌUW‰F $x6.MtûrÊ~}VÑi±Ï›IÓ8­“#èIÐtÍx–¦¾|&c{>€$³ËI<¼‡šáçC" ä»»ÔÁç¤/ŠT©¤?9§Ülb&†jÒfd•/y>Úæ‚ž)Oˆ7L¦9ûCáLf|5()ˆê¢³£ô•)ß9&¥ä0¿¸y”ÆBþvóÀXÉ®âMb˜NSíÐÖØB3›ÜÌÕ,&}¦Š„üz8rÔE›öõÙðò.óŒH„8 h”'‰DêwI~aÅÐ¥:7«L¸96Úfs苲]:˜:N’3V&Érà쥻íC¥2Âá¥g¥ƒÀÿàÛÜõ+ckí†*¢ÈFÆèÏTì«Lã¬æS`ž â¯dø”ɳÐçò·@R] }š…±¯<\›¨ËæI3fþVeÿv+äR±=ÀH!¹óöÌÎTnÓÎ+‡L×6 +T¶C†/I©¶•g]‰®–©XX)›íN-PÏuÄJA[&²ÚÆÙT>pv1k BÊÜóÛ†çU3lëpƒíÐYÚÏ0¡§G³Ãe§ÏÏs#Ë9ï± ~%0™fb Ö٠ÀƭVÂ2~|l3™ìë6×–EN å„)aË®]6(tðó]!Y”ûä‰XYÒ§™”gãÃë0q¡ílöHx+ÏvÊ/ê—y1H e9’‹¸{~”ÕËùIÐá7‰¹œ?éOÓ(ý’£|N9÷ÈT|8¾rüé8Wá–(Ýä耰Ïò&Ü^ÕÒŠ ‚wk1¹2áªz‡§@“|ˆŒÈ6¶{(d÷SŸmËo§Ô·9A¬:›GÅó*cø¡é:Ù7 ÝâbЉ(P•U ¬P‹t¿¦hKæÞæBãÌM*šrB·å”Ì&¯CšªÂÖä ÀKms‚¶ŸíaC´a€Öó-]”|n lhÿ X&CvmܘN;!h‘ßËT‘Ñ×ÏÇiŸ2|2°v­¤<ÊÇïÕfŠ…ˆ¬Î_ d¦û.ëŸÃ&èe¿CC8¼‰ýº¹ƒ§XBjð°{ ÅàW/giÌᙋg-Y3~—êígš7y·{>òûÙ¹z°ÈÌ7Oq@ºõå˜mùô—lìþ.§›è²NK†®šƒ8“á"É…~ú·ÎަäR =ô­ë«²›ˆ,YþPu[¡ ½|Y.·}hÞeî >Rf8”avÅŠU$74¦^’€‰9ýÏ3ço‡åpÖ锤“¦Jq`+N ÏßP¯Liql~ó†9Ûß®²íZ%ÏÁ@õ‹÷…ì7mðp€$z ¼È08K3ãÇÓ‡@¯]ÐnjÁƒeÛ€W–WFÅeN•dÞʤÌLîZИ™XNå¹I&Åšx(ø+æÁL!¾B=ö¯¸PVˆ”î<“1 ›ï`dr¶w¶·Ï1´NÏš ƒ™­½;ärVÛa»n¸9“¿Ê¤|~ÄŽ "ÑTpGì!„íÎÓ4˨ð mÝ)]nš° ¾Á1-lkT d†ÐÃxƒ¥\Ý´4î–qFнý„†õ¹»0Q)§V€Îµ ý™º!”ŸÁñüA½†=„ñSäºZÖ”Rm¢º—³"eÆ.„o°Bb›Õ1#£{JxÃ³é ›K+£¶\ò…QÚ ±;Þ¤WvLÑÝ`aetA©[«„EÎø¬ìý@§Kªò³8üðfEàdOYIT(9VÏq£D6ñ)œaÿp<Ö!¹L ´;J±Ã¢Àoé p$ UúÁ=Á~ø è3íà´B0å`¬Ê U>dyȃò¯2ˆÆy~ÔE =ðpÆÌô#T8f ˜0ÃÿIHN‚V¥£äcÈó|æ…Æ)XAŽ;ðû»@7¶LNå@ðxèc†¿w8î¤t…Éa'@kÈœù,É h`˜Çú¶ßñNëv:Í'¸´õýÙh8÷œ‚ `M½‰æM:[X´ã S(Àï9'ÀIìnz1¼ây"¶¤e›ñ)ÏÂe%ŒWX#ý=†½ Ÿ¼§»Ü~® [×i⨠ñTîœhqaôü²Û)aݵé  #µ”•»ó|A„&Úó 'à¨â_¥(é(>Ô£"kÏOÜ@ă2}ã”Ï·øÚs™ÒC¨6䆴ÿg¸l`ýÊÃμ $pÙ#”C\½ bJ”‚7¡VLÙDÖ~w™Ï+°K+bz„‡ªãƸú©rªÇ4UsvkÉ6 "¢c…ç°»cXè/>z¢l«‡œ™½Ôd! £Ø pj¯ Þ•ïgµQ¶OÎy‚=A—³º³lŲ­:}7ÍË›#4H’Ù¤ÔXº—I²¤Ê}8ûeOôý¤A8Ù·Èç· ®‹ožåªA€Î I÷€Ññ;êdsT< œ† D*¿½;ö$°âÉÙ>Á U#ÐNrùcñ¡5º\?C\Æ¾æ ¡gšhÿwµÑ6£í= EJ¿ƒ$d"Rx–‡Î›Û•y?ïz+™P.Vc˜‰ ?ä‘ š\XQׂú‘à9õ…Kug$¬Ÿ+D–ÄØßaï( |Pu/ZŽ9dÇ5H¼Ø7x¨phiëIJZ@û„Id§›˜¨œwÐ<±$?'”ñL†Ãñ/HS8”c*Ϙ’Yf£LÞÊ#kœ®R.À'FZvÞå…»²éÞØšJ’"„4qŸ\µ•)ló8Íô¨.׌8‰B}r+ìmšdúŸE©ÚŒ›+A‚.nš ã^\~8æ%BÐŒg¾²o‡@ÿ˜‚!˜ Db3Æ€+Ÿàc.ª!0/äFѨŠhöÔw¸Ó…Èü†°3-Ùä2¤·Bù0I`-Á,!-{VSv”“–r‹°et5`7¤í=¼Ú%fe:×X¦±=³8·7Ez®N?Fîá¾øCªc·– 6¦ иá<,ÝÕ¹h*Êè,Œ·rwöÕÎ…„™‘cÜR<Ü#–‰ê¥tWÉ@¦`!e%ÑRoŸô`¡© õ«Ýš¤‹_Ö˾SÛ( Îórñ#”³+E”Zê À°P™.gefhù*õ"gŽP#ãÐù¹Rvpì[¨Á»ÆÖíƒ9üå=¯-ËënžêƒuØvˆùiËN¶ n_¨ü;‰tD?%Æf&õhé…ƒ&>…!&[ÐX#1ž÷ºxzÌ t¤`z+U36!}Üžî)½T¾Ð•Ù—v¶à·53œ6ò'¬1ï:!°{Äò*!€€?ZÐÏ(q´°sf±N8Ô”Î|ù7Á›jt—¨"œO_pxTvæ¡ÐQR¾ðY=Òjq”ÀUTî´#”^‰ß5JWZîf9zìé¼RDÏy ²ƒŠGý^Ô}\1Z( ÷–ïˉâx娶¡+”LB‡'„$MœÎZ©½}rߺÙGÓÿ’0_•°’Ø’5’•áé~˜’Õ׺˜´‡þ〰TÉÆËœW€"œÃóºq—î“mY¥<‚†-&…*íLDLU¥}®?Þý»°ãó¬òÆW¯‰Â;Š˜;6G­PV²öyxÏî’qŽkAÖçNê$p4»@5 h™‹ðܪ,2Úáþ, b%Þg±:½uMÅ5Zä…µÓ½“!tOQOµè:O“'!wì›×”:F%³s³/4T• B>#M š+kÎÿ±J:djÕ¯ý“D¹™yèô-­)“¾êᨽrHPI(àoþU¬õ+Ge„±aBÂëQt™! 0>L>½°õKVì*=Ë5s¿Íò†Ó236İÒÕ5v°\ÊË£P‚÷C…Æð±Òž‰J½…ƒá¦ Nò£ 4òHçÅÓV&Íœ\ÄqküF z”­]in¡òP"÷;>ÌÑ´t¢ÎáÔ”ëåH ‹â°Çî\\vZ‚÷ù<™œE+ä™z©¹\¢<6uÉ´+ÚôŽÜ¥ŽÒfú'‘AÈ]À$MÌC Üy0 ±`˜RéÎ/ÐjEÀ”çTb—¸Â¦¤^PüpßÜß߬дZô*ÀÎHL^ã3@‡‚©¶©•¹ä!Be4û4}~L0ÁiY /Ý+%‰Ñ²“w¸‡;Û¤`(z)"°{ŽY*¹ß9”·ìbZº¼Éµé«„©5§¼~©’ñB0“á—#µÉk蓞qüôÅè ãçIuóªeA&ª[ƒnùd"Ç3“#µÜ[å8Q;Óˆlš ¡“Äƒ¯²Êþ w9›ážŽº8 Ї$¾iHºÏÍãäVcîƒñ "},^é¹#ÊI¥uþáq^ؾ:Ç>låÍs2pN)¤9øˆ 2ôØv9RöE÷dÂ,u@Cs D€åðÃí Š…‹e¶Õîuƒ} ˜—gÀæl‘) ýŽX/E¬´VGáÓâlŒUf’ˆelâtLŠœ’cV•ÁÒbéDC0Æ-;‡“y»»¢ï~ÖC;ún‘EÔȹ„_ì9²ÎKC0‚Ç›+ôK¤nƒ¿q„s5S(}åÎ0BYÈŠçGDkXOÃBѪþwæâ”ñÒMæp„A%\žòêË8˜ýÝëÕU ¬”¹•ÎToP–×¢”%ˬlïò9˜lh+A¤ñšž)|çmTs¥LG–éºÝ¶Ë…¼¶ ‹¬Dæ\Sú¿Ü6…ÎV¿¦k²Ãiî 3)†V·´¬áæ Ó:|÷8_(Qüœ3,2˜º”θ•ÅHHv“&:#j+Ò²©µòÑm¡æO_ýH™Û½úu›CW¨ÈA²Q)òM"wåEA’} ù|y6A•Ö­¼2Éú–$#bÿœ32CF³ ñrÐ@jB¹Øy ôŸº£êSÑa+5Ï( HíQšžx¡\‚_’C…d;f}øy7™é@`y']²eÇŽ£–E jÚRPÊÔ—¦!½Âê>{ÌݧõʨðÓ6Ç©¯¢L']uQi—g³ì—2,€â ‡ j—?©ÃcS%îØÙEæ–ÏX½?D Ã8ööuâ<†™·q,Éý q l¡zëìCYÞÆ€iK(Å’:+ôª†Ú/Wt)*ã[:¦WÝ?‰Ì°$¬#_žj½ŒØ—àUUԫ‡Ê)bâç!ÆWûR²%£ªöfå »ÕZ“M•põÞ½Hvze-¡PñäÅTacb.pÝó[¸‹wOùèË‹!çhäÁOŠâA#ƒñu ëU²gÞÓ+Ä8tpéÖÞN$̳ݔ ž¿ v½ óà7í÷î‰÷¡Š¯ÀJ—ÜQýLÿaöÏË/ÜÔ€C59ãRy\›öU˜Wé5p£„`Vå{0o_Mgˆ·Ð᛾ÞÅD{‹M3{µrÔÙ!ÃÔÈMCÄøQ&t ö:]z©·m 墬͘¾9íCÁ"‹ÀvŠW¼ KÝŽz)ýd_è<Ýëo—ÚyDÀ–x:â‹p±šoG9®¥í½ÏœEÒn爀/CPq8‘gï_Aá¬b˜âÔ®¼†øÊqDšTĆ´dé æF Œ²íR8žì«4G ðÄFz‚K`VfgMj L[áù9´Øªƒ³£TàÒ˜@çíî ¬‡–h…¸%&ñtÁ·õ 0+å\ËV›ó·`]æýÑ2E0©¸»ŽºÝ|“A,7Ú-âR™YÊ'%–%¡EÅ}B2° b›‹Òc­®Ê§â¢¬lt`}»û†Ë›ÛÆ)$?bw(fãÔ~¯öˆ^zY3“Iȉ‰I™*1ºÇ:ÖªÎÐ',C…ìN­¥lÒD0l†Ât±>š]ÆçÍ31˜µ°ÃÛw@¨ †aïl‘‡ÿ]]‘É6jŽ/8Ñ›SÐ)ÃÈ­wq¦0xRŸ\ÀYõKu 4’¶ýRÇ¢ÀLº½ÆêšÑJÁ{ð6½‡HÆ&’ÓÜò`iFÒ n€Åöì¾dÜÊZUéÑ®’f€I °{‰·h “1Ôj¯°í†üZ/ÐHKàG!“rÝáλtFæ«íc}_ZK(¯ùrÚ¬N÷Ù{ôEC¥Ld±93Žo‰wj ¯Ö£þÙ.ží)Y›x©;Î\1{/%*öÈÉ%¾r)Æè}wät¬¯=L[‰$:Öô…6Ÿù’•=ÔeWó  th"¥qÙ1éšØ‹@²Ìsÿ[iÜî– ¡Àq .ˆäk–\Å›õ¸g¿kªWdPI.×ÌÒ¨Ú›¢?3ý~kDA=KÓN¦¸UBÊ)r?ý¢~/ÑÞcŸ>¦Y)œ´áòXº{qÑÛèQ+NóúS|<R[$¢•R•ék $1_j¯Ôª‡ «0a7 i†ÛãEF)ê‚a8h¬ñKõt†’¿] Q”Í9±àkÀ¬Z}ûá…†2Q;™#½n\^g`%OâDŠ*²Üç—/õ’Pí r.[ØÒE6ýJJ‰ð€ŠøäΫÀqä3…úÏr蔉GåvJú–ìç ’¢©G­V=ô€Üfa'Â9èÄq· Gá‹#õ]V‹ê ÓÀ]5òH/¶¡èÞº¤d)ÿÃñØ ý~j\N¼vc‡{1Îâ Îú)¸A–Ù£¿ë.)éUUÖŽŽ‰=Ž6Šlfø«a €|9º«’„ü>}~(‡C\sZÄ0Ž˜8ĆcKÔÑ2`U÷],€[ZU>D¾/ÿ(胇x*nÁT'!ßD׺|ƒ¢°e9Ü &@É&)˜dô%’äP'$Ë’@p–%ºxâ½Mó6fÅUQZj¬Ü.7;´Ða LÚ#kÒ-Æ*‡¬ôvëµöì¶}ÂŒçNCUèR çz¨”CHE¹ÑìÉ.ök-·›]QÐ}îJbÇ®ÝÙE‹g´¥É‚‘ÇìÓŒk‘®¡ì’û0™öSìt«qs麰)Ø”.¬D8}æ¡ ©c=noé+L*7ÅüšRøÁ­Ðúêùʘ‡\†ñ9˜òX,!ëU[mS¼ŽÃ ï Šø-:˜ÞÁ1ïÛ+ˆéëÛVGØ}•†t&ÓGaCî¾_Î6‘sÔ½±‚ðµè•@Ëíá’™hS™Q!ne±5*N…õÓ„½'šç\ÝHú´Uz!¤GÖU²0„i ¨o3ªGù¥¸ ,1Ø;FÅ#%J†+Q§Ç0«^à¡Råºènè}ˆÇ•p+Ë=ª§Ô§í7YÑŒ*žìqÍ6wI˜˜{L‚j&4Jµ©\pc¥M™³Wt9æK2–_Á;ª–̶؀¹0o…ÇØ"d&ŽC”žæ¡\2cÙšU=ŽO¡9¯—š]ìá´š-IP;eY*ÍÁx7â¼T AÌû*‚5š¢²È—…؇¼ŠûšIàPs`"næñºSÚTU]›´»líB¤ÚT@MÍeî¶úz…Ç RÕÊ·¬C]Ñ‘ú Š„tÚdá-M‘?ÝOe§òã¯òKêAn¨Ë³‹ÊÏoGΫÛ-´S_,šïg_ Õ/™£ ©nº–ÁÉ5»½Ðñ—E…h«p{_1ÚQž»4´Úd—¹  Gr À¼Ôüq\ÞêZÙ\ ËLÉ×J”ç$îGF‚r´¾ªnu 1A•˜îxý¦íº3OÖäÄÊêzßLîÅÆžQϳ%²¨Ÿ6-€wì™dùí*N'×H·°à|Ù+AIÌšV(pn¯®1=q(K³Ëz7 bã W¶ ó.ñ˜: È®Vžýò:Ût1›¹1íZšcÜÃßç’' tÿ†~éu¤÷I<\Z%C‘j¢à1U1Sx%>g ˆr,fEž ð(‘…äk*7`¸ÚSÚÌ2M“¤^lŠYqð¨bdGÈ%c¢c¬^) ùraJµþe‹©S—Ñ+ïs¥GÄþêI:ðP¼ž]kç ‰“QC*½Ý5(ôõI^ÓK·ˆ:ùP8•_A3j•eH;2ü„Cò7HQÁ°¨L~@QÇ娌 ¦.î¯:„W$î”ÐŒE9]ea‹åkÄ@[§H@NË«ÌW~˜¬gû·-¤ÐáPðnQĪÉ:!¦ø•ù(ì[#[Ȭ„¼Ð\¤{7ˆEšIèy„[Eo¢“æxÔP¤p¸Ür32IÀèšyÏu1žE­ÜL½ñÌUñQØCÊDRpQ¹"ÙÕ-^Ô‘Fá>_¼ÎÚc†É­vP MÕê/¾›Ì-°ä%øn÷2ÏX!䦇®!–.õÀË2ßܲc®J8ôûí!z¹µœÏ!£DÉE/j‹’„¼“@çáW¾Õ9•²AÎÆ\ŸKðšScŸ¤E]OE¸O÷Â0ÀòF53¥×ñæ¡™”Ëñ© *ß/õ¦DTÖLÇÓ騗و>841U…Ç$2¼Ue¾UÐØ=ù;ØÔ^¢¢y ýV'Mï‘ÜQ\1™»L¿IÌžõ¦ H µ$ÜÕÄ•wÔ—æÞÁÛm啇Š4¹¥ðS Q(Ëà–z»—ÍÓû[ä劂yXZT*^Ëâö¬Ð®Rg]Ó@-e™”m®MÜ|©•®çÉ_ô¦ðK‰”M¸½ø‚â©&Á™>ªŸzyn ±xºŽÜ54W.îï ˆ3uÜ?=ÔÌmt—ºÌ×Üœ´H²C›;ÔO‰«¯’§ÅšgeÂlªñ!Ïz–ÕzHXLP«"A¾ƒ3åZ²…{Ô1)+,M~¬tÑ‹š sºkÐ nõ/ã1äyçV‹Né6ñõ"Ž—E„JOÃ+œ,©Š½†I y3Q§ì, çJ T$ZvB'˜ÓÄ™ }µ07<ɾ3)äd~ïP>åû[oAÿ:Zoq:[)É|iÉЦË`v`p¥·UÊ“é5h™ÉÖ…½T#üHOiÂÎò¦Cq°˜ö„—çéÏœ =ÆE] ˜Ú6OðÓišžÆ0×OpŽÉ¢«H,žTŸjmLŸ@ß±á(Ró”D¢4K‰“È4&ËÅcF( WvOç|ÏÃ[b¢ü­– 8dõ¹'nÝ“è ñûu{CeÛ;7 Ôº{w¨Ä‘ubÅm^ïpú" @øCzëƒÖ±|[H¥ÄQ½³ÌiP3ÞBPÞ»Ú‘Ô»‚t‡2õ¢ ¨Âfg8º¡8}æ¹#!HmÖÈK/&—]à‰ôÌF|²(L‘fúôQœ]¢ÜªÎ—ds^*Úôô&G&%XGú(k½Â&F¡ÊúK“7äo6°¸¹s5:^t<Χ×8C¸@9êõ>ØVŸ æq²3Ár¨:bcñãTÑ‹ 1NöQø.EÄ·7ŽGÞmWjÆÌxnjK¬†¸&êÆ<˦¬Ÿ9ŸZH™0/µð.¯S¢c:”æÈj<..—@Âv®Áî¯$/ƒ%†ûæ"é•ÙR;º¶à@3o›žZB ‰j‹='4q»È޳j ÅÍ<¦E_™]Ô«Wr¬(Ùý_{O%X dà miÚ’i`;sº+¦Ë¸®“¶) y&ª­MÅO|Ó›Lf³CjCµš³ýí7³î^pBªUëj-,ÁiÒÍ;P1ÈØH{kZÐí½jãV—eTnŠªö“Ýq8OUNƒÆ;ʨ”ù¦6½Û¢uöºV1(É|U$k‘”€ó“ª¢Hx"ϊЂT*öº«#c9N¼‚ëÅZ}O ºH%U/U 0½%¢¼†µ2lËÓÚíˆv›‰+FÖCØ]h¿köÒ’·Ëû%¢ËÏPÒ1dR«‹2Lx,;,éÌ d ˆÊl^kÎ~¨aóí…>Fuz/–¼‚qò4l8ê4-^;ºûø| ÇÞƒ£çå{^zyZ¤™ã5‹xa%_ÑýWUª[¨¸I#Êݽ‘—^Ÿ@õÆ"_·.jcn¢¨N6 ™«’ ¤'aЯG[À×ïM´´ËÓ  ÉÀOb ðÛ†v¨U¶¤‡_mâIÒÞ6$¸E…ê½^ÃU‚<|EÞuÊF&Ø™âEˆÃåÕrÚ·J`~«òqQ03Kº˜X-ñ7õFí¼Ø[R_·8š%©ÌàPÊ@‘XåPè©®þB—BOê7ʰ}IÓÀk®‡ŠŠ™x@ w8~Øß~ßÈ.3…5“M:Ãdî2¨ºEj’-çü¸›ÊS!ßÒ{ Kä².‡ÄäA€P6ÜöôV;B1ç—°––-Ê6sv‹‘ôŠž®œýŠbI¯!lÂüTm|ÐJÈ^ÿX¼SUA¾³taðЮ֮b;=ê…ËÞÖ:1Gš›ó@qI½|› ¼œ° áÒ¥ ^E'â~IÇUqŠ+i¶9ÙâÐóI޽I˜Ád ©X»©ÓùbDp}RùÊ^Ké ¯:üe§)昪ŒãËa˜Êçצ%Q¬ºÆÙdÐlÓfÒîš…[çâñS÷œz™÷0·T #•ÑmR#ž–×ùK¢ÿ£0R'ɪˡ:þl.à~xY AÈc¾Q×ßݰ7}'ù|yð„_Šq† ÔËwaÉ ˆB&æàçëm_àýDݸêúñÔ¼Ÿ/:«qPÒ{¿‰"îú –Çs‚4@Ô§üe¨Â/cËËßD‚‹JMý)øŽŒ›”»¿A²+Á˜9€UÅhx1Ø4 ò|õ¶)}ù‹jZP%FjXH¢v¿SΩ>w핃ØÓá?{´*/_ æõº¢{|1ŠI#Õ 2smøºP;­—®Sˆ÷õ›ä¦ Ò×¼ ‹hCÏ"ô­ªú˜A³Í=fÏu ¹+\bþ¹ ¡L9xñ%"Ù{\â Ñ)ÂçæÇZ§¸ågä¸pÔ@ø"«h㊬º|àp?î’ÑP¹Ã ¿¢¦ãÕ¿ï‹>*|;ê ¬Ú:•o3=ä‹Â|5¨þÆ×K6¼Â¹ñž¯f„ÿüË™·*@Ô–ßÊÅYøÁþCÝ„W5ÿÐôBvüÛIé­öx«ã¥Wœ܃^d5MÚVߪižçUJc”û?¥ÿÿÿ˜!­è‹golly-3.3-src/Patterns/Life/Guns/period-52-glider-gun.rle0000755000175000017500000000501413543255652020070 00000000000000#C period-52-glider-gun.rle #C p13-assisted pure p52 glider gun by Entity Valkyrie, Chris Cain, #C Matthias Merzenich, Adam P. Goucher and Dave Greene. #C http://www.conwaylife.com/forums/viewtopic.php?t=&p=65762#p65762 #C http://www.conwaylife.com/wiki/Period-52_glider_gun x = 126, y = 97, rule = B3/S23 64bo$62b3o$61bo$61b2o2$57bo$56bobo$46b3o2bo3bo2bo$43bo2b2obobo4b2o$42b obobo4bo$43bo3b3o31b2o$39bo6bo26bo7bo9bo$38bobo2bo2b2o13bo11b3o2b2obo 7b3o$37bo2b4o16b2o14bo3bo7bo$38b2o2b2o2bo13bobo12bo12b2o$40b2o8bo25b3o $40bo8bo$41bo7b3o30bobo$38b3o36b2ob3ob3o$38bo38b2ob2obobo$82b3o$57b2o 23b3o$56bobo$50b2o4bo$48bo2bo2b2ob4o$48b2obobobobo2bo13bo$51bobobobo15b 2o$51bobob2o16bobo34b2o$37bo14bo57bo$36bo70b2obo$36b3o26b2o2b2o6b3o24b o4bo$65bo2bo2bo4bo18b2o6bo4bo$56bo6bobo10bo2bo14b2o7bo3b3o$55b3o5b2o12b 2o17bo7bo4b2o$54b5o8bo2bo14b2o22bo$53b2o3b2o7bob2o9b2o4bo23b3o$54b5o9b ob3o7bo5bobo15bo7bo$55b3o7b3o3bobo7b3o3bobo13bobo$56bo8bo7bo9bo5bo2b2o 9bo2bo$73b2o11bo2bo2b2o10b2o$53b2o31bo$24bo29bo32bo23b2o$9bo13bo27b3o 30b3o9b3o9b2o2bo$9b3o11b3o25bo32bo13bo9bob2o$12bo27bobo23bo30bo12bo$11b 2o27b2o23b2o11b2o11b2o17bo$41bo23bobo10bo11bo2bo17b2o$80bo9b2ob2o13b3o 2bo$3b2o55b2o14b5o11bo14bo3bo2bo$3bo9b3o45bo13bo11b2o18bob2ob2o$2obo8b o3bo40bo3bobo12b3o7bobo19bo3bo$o2b3o5bo5bo37b3o4b2o15bo6bo22bo2bo3bo$ b2o3bo4bo5bo28bob2o4bo21b4o5b2o16bo8b2obobo$3b4o4bo5bo28b2o2bobo2b5o11b 2o3bo3b2o7bo12b2o8bo3bo$3bo8bo3bo2b2o18b2o8b2ob3o5bo10b2o4b3o2bo6b3o10b obo6b2o$4b3o6b3o3bobo18bo5b3o2bo3b2o2b2o18bob2o4b2o3bo18b3o3bo$7bo13b o18bobo2bo3b2obobo8bo15bo6bo3b2obo19bobob2o$2b5o14b2o4bobo8b2obobo2b2o bo3bo9b2o13b2o5bo2b2obobo21b2o$2bo24b2o8bobobob2obo2bo12bobo21b2obobo b2o20bobo$4bo23bo8bo3bo4bobo5bo32bo3bo4bo19b2o$3b2o29b2obo3bob4obob4o 16b2o15bo3bob4o20b2o$34bo2bob2obo4bob3o18bo14bobob2obo$35b2obobobob2o bo23b3o11b2obob2o2b2obo19b2o$38bo5bob2o25bo14bo4b2ob2o$38bo49b2o25bo3b o$39bo24bo42bo6bo$24bo39b3o38b3o7bo3bo$25bo8b2o16bo14bo21bo14bo11bo$23b 3o3b2o2b3o2b2o11b3o12b2o11b2o5b5o13b2o11b2o$29bo2bobo4b2o9b2obo25bo11b o$30bo3bob2obo10b2o37b2o31b2o$33bo3b2o30b2o17b2o32bobo$69b2o16bo17b2o 17bo$20bob2o44bo2bo32bo2bo16b2o$18b3obo42bo2bob2o32bo2bo$17bo4bobo27b obo9bo2bo39bo$17b2o3b2obo27b2o10bobo33b2o3bo5b2o$25bo28bo46bo3bo6b2o$ 25b2o14b2o48b2o9b3o$42bo49bo$39b3o47b3o8b2o$39bo42bo6bo11bo$63b2o18bo 14b3o$63bo4b2ob2o8b3o14bo$60b2obobo3b2obo$59bo2bob2obo4bobo$59b2obo3b ob4obob3o$62bo3bo4bobo2bob2o$62bobobob2obo2bobob2o$63b2obobo2b2obo3bo $65bobo2bo3bobobo$65bo5b3o6b2o2b2o$64b2o8b2ob3o2bo2bo$71b2o2bobo2b5o$ 71bob2o4bo15bo$80b3o13bo$82bo11b3o!golly-3.3-src/Patterns/Life/Guns/loafer-gun-p210.rle0000644000175000017500000001074112250742662017042 00000000000000#C p210 gun for c/7 loafer spaceships #C Shannon Omick, 18 February 2013 #C http://conwaylife.com/forums/viewtopic.php?f=2&t=1031#p7466 x = 226, y = 195, rule = B3/S23 174b2o5bo20bo$174b2o5b3o18bobo$184bo5b2o11bobo7bo$183b2o5b2o11bo2bo6b 2o$203bobo2b2o4b2o$202bobo3b2o4b3o7b2o$202bo5b2o4b2o8b2o$213b2o$213bo$ 127b2o54b2o3b2o11bo$126bo2bo44bo11bo13bo$126bo46b3o7bo5bo10b3o$126bo 45b5o7b2ob2o$126bobo42b2o3b2o7bobo$126bobo43b5o9bo$127bo44bo3bo9bo$ 173bobo$174bo18bo11b2o6b2o$124b2o3b2o47b2o13bobo8bo2bo4bo2bo$124bo5bo 9b3o35bobo12b2o8b6o2b6o$141bo31b2o4b3o22bo2bo4bo2bo$125bo3bo11bo30bo2b o4b3o22b2o6b2o$126b3o11b3o30b2o4b3o8b3o$178bobo$140b3o35b2o$140b3o$ 208b2o$140b3o16b2o19b2o26b2o4b3o$141bo18bo19bo24b2o6b5o$130bo10bo18bob o6bobo6bobo23b3o5bo3bobo$128bobo9b3o18b2o5bo2bo6b2o17bo7b2o6bo3b2o$ 129b2o36b2o26b2ob2o8b2o$165b2o3bo37b2o$125bo41b2o25bo5bo$124b3o41bo2bo $123b5o41bobo22b2obob2o$122b2o3b2o8bo79b2o$123b5o10bo78bo$92b2o29bo3bo 8b3o71bo4bobo$92b2o30bobo82bobo3b2o$125bo43bo38bo3b2o$168bo8bo30bo3b2o $144bo23b3o5bo31bo3b2o$124b2o17b2o31b3o30bobo$124b2o17bobo64bo$132bo9b 3o9bo60b2o$130bobo9b2o11bo26bo12b2o18b2o$91b3o11b3o20b2o12b2o9b3o26b3o 10b2o$90bo3bo33b2o55bo29bo$89bo5bo8bo3bo19b2o54b2o28bobo$89b2obob2o8bo 3bo15b2o4bobo69b2o10bobo$123bobo6bo68b2o12bo$105b3o15bo79bo$92bo29b2o 16b2o3b2o$91bobo46b2o3b2o65b2obob2o$91bobo11b3o33b5o66bo5bo$91b2o49bob o68bo3bo$90bo13bo3bo22b2o40bo25bo10bo3b3o$89b3o12bo3bo22bobo8b3o27b3o 10b5o8bobo8b2o$88bo3bo29b2o2b2o6bo36b2ob2o8bob3obo18bobo$87bob3obo11b 3o14b2obo2bo2bo2bo35b3ob3o8bo3bo$88b5o4bo28b2o6bo35b3ob3o9b3o9b3o$98b 2o31bobo36b3ob3o10bo10b3o$97b2o32b2o37b3ob3o22bo$171b2ob2o$172b3o38bo$ 103b2o68bo15bo9bo13bo$103b2o84bo8b3o11bobo$104bo2b2o73bo5bobo7b3o10b2o b2o$182bobo2b2ob2o18bo5bo$105b2o75b2o2bo5bo20bo$5b2o182bo8bobo9b2o3b2o $5b2o82b2o95b2o3b2o6bo$89b2o$69b2o26bo116bo$69b2o26b4o74bo12bo25bo$98b 4o72bo13bo26bo$98bo2bo63bo8b3o10bo$4b3o91b4o51b2o10bobo$3b2ob2o11bo51b 2o16b2o6b4o51bo3bo5bo2b2o45b2o$3b2ob2o11bo68bobo6bo53bo5bo3bobo25b2o 21b2o$3b5o80bo18b3o41bo3bob2o2bobo25b2o$2b2o3b2o10bo36bo30b2o17bo3bo 40bo5bo4bo19b2o$18bobo35bo86b2o7bo3bo24bobo$67b2o3b2o31bo5bo30bobo8b2o 25b3o$4b2o12b3o35bo11b5o32b2o3b2o30bo16b2o3b2o13b3o$3b5o47bobo10b2ob2o 26b2o40b2o16bo5bo14b3o$3bo64b2ob2o25bo3bo43b2o33bobo5b2o$5b3o10b3o34b 3o11b3o15b2o8bo5bo4bo37b2o12bo3bo17b2o5bobo$7bo79b2o8bo3bob2o2bobo51b 3o27bo$5b2o11bobo76bo5bo3bobo81b2o$5b2o12bo35b3o40bo3bo5bo62bo$99b2o 69b3o$19bo35bobo58bo28b3o21b5o$2o3b2o12bo36bo59bobo5bo20b3o20b2o3b2o6b o$obobobo59bo49b2o6bobo17bo3bo20b5o5bobo$b5o5bob2ob2o38bo9bobo3bo51b2o 35b2o6bo3bo3b2o12b2o$2b3o7b4o2bo37bo9b2o3b3o69b2o3b2o11b2o7bobo4b2o12b 2o$3bo7bobo2b2o52b5o96bo5b2o$11b3o7b2o46bobobobo44bo10b3o45bobo$11b3o 6bobo46b2o3b2o44bobo8bobo47bo$10bo3bo6bo79bo18b2o9b3o$10b2ob2o44bo39b 2o30b3o13b3o$58bo13bo27b2o29b3o10b2o$49bo8b3o10bobo57b3o10b2o$2b2o45bo bo19bobo57bobo9b2o$2b2o45b2o21bo58b3o10bobo$13bo58b2o71b2o$12b4o56b2o$ 11b2obobo55b2o$10b3obo2bo49bo77b2o3b2o$11b2obobo49b4o75b2o3b2o$2b2o8b 4o4b3o42b2obobo63bo$bobo9bo6b3o41b3obo2bo61bo2bo10b3o$bo17bo3bo41b2obo b2o62b3o3b2o5b3o$2o64b4ob3o55b2o4bobo2b2o6bo$18b2o3b2o42bo4bobo54bobo 4b3ob3o$27bo46bo55bo5b2o3b2o$27b3o44b2o61b2ob2o$11b2o5b2o10bo77bo$10b 3o3bo4bo7b2o20b2o3b2o16b2o31bobo$2o5bob2o5bo57bo30b2o3bo37b2o$2o5bo2bo 4bo6bo29bo3bo8b2o5bobo30b2o3bo37b2o$7bob2o9bobo30b3o8b3o5b2o31b2o3bo 28bo$10b3o40b3o5bob2o37b2o3bobo29b2o$11b2o48bo2bo36bobo4bo25b2o4b2o$ 61bob2o36bo18b3o11b2o4b3o$29b2o3b2o28b3o33b2o17bo3bo6bo3b2o4b2o$29b2o 3b2o29b2o51bo5bo4b3o7b2o7b2o$30b5o83b2obob2o3bo3bo6bo8bobo$31bobo93bob 3obo16bo$128b5o17b2o$31b3o87bo$120bobo$120bobo$121bo18bo$34b2o99bo4b4o $34bo85b2o13bo5b4o5b2o$35b3o82b2o19bo2bo5b2o$37bo103b4o$23bo116b4o$21b obo116bo83b2o$20bobo201bo$14b2o3bo2bo199bobo$14b2o4bobo199b2o$21bobo$ 23bo2$34b3o$33bo3bo$14b2o16bo5bo$15bo16bo5bo$15bobo7b2o8bo$16b2o5bo2bo 10bo$22bo7b2ob4o$22bo6bo2b4o180b2o$22bo7b2o29b2o153bo$23bo2bo34bo2bo9b o142b3o$25b2o29b2o7bo7bobo143bo$16b2o37bo2bo6bo8b2o12b2o6b2o$16b2o16b 3o19b2o7bo9b2o9bo4bo2bo4bo$34b2obo23bo2bo11b2o8bo4bo2bo4bo$32bo4bo23b 2o12b2o9bo4bo2bo4bo$33b4o20bo19bo10b2o6b2o$33b2o21b3o$55bo3bo$16b3o8b 2o28bo10b3o$15b2ob2o6bobo25bo5bo6b2ob2o$15b2ob2o8bo25bo5bo6b2ob2o12bo$ 15b5o35bo3bo7b5o11b2o$14b2o3b2o35b3o7b2o3b2o10bobo2$96b2o$20bo75bobo$ 19bob2o9b3o51bo4b2o6bo7b2o$19bo11bo3bo49bobo2bo2bo2bo2bo7b2o$30bo5bo 48b2obob3o6bo$19b2obo43b2o5b2o10b2ob2o6bobo$17bo2bo8bo7bo29bo5b2o10b2o bo7b2o$17bobo9bo7bo19b2o5b3o18bobo$57b2o5bo21bo$30bo5bo$31bo3bo$32b3o$ 18b3o$17bo3bo$16bo5bo$17bo3bo$18b3o$18b3o4$19b2o$19b2o!golly-3.3-src/Patterns/Life/Signal-Circuitry/0000755000175000017500000000000013543257426016155 500000000000000golly-3.3-src/Patterns/Life/Signal-Circuitry/Turing-Machine-3-state.rle0000644000175000017500000027454412026730263022677 00000000000000#C 3-state, 3-symbol Turing machine: Paul Rendell, 3 February 2000 #C http://rendell.server.org.uk/gol/tm.htm x = 1714, y = 1647, rule = B3/S23 247boo$248bo$248bobo$249boo6$257boo$256boo$258bo5$265bo$264boo$264bobo 6$272boo$271boo$273bo5$280bo$279boo$279bobo6$287boo$286boo$288bo3$244b oo$242bobbo$241bo15bobo35bo$233boo6bo10b3obbo3bo32boo$233boo6bo19bo32b obo$242bobbobboo7bo4bo4boo$244boobbobbobo7bo5boo$249b3o5bo3bo$257bobo $$302boo34boo$242bo58boo36bo$241bo61bo35bobo9bo$241b3o96boo8bobo$349bo 3boo6boo$349bo3boboo4bobo$349bo3bob3o4b3o$272boo36bo39boboboobbo4b3o$ 272bo36boo40bo4boo4b3o$234bo34boobo36bobo49bobo6boo$234bobo34bo89boo7b obo$234boo31bo104bo$269bo102boo$268bo$$317boo$227bo88boo$226bo91bo$ 226b3o31boo$259bobo13boo19boo$261bo14bo19bo58bo$276bobo8boo5bobo57boo$ 277boo8boo5boo29bo21bo6bobo$103bo180boo38boo19b3o$103b3o113bo63b3o38bo bo17bo27bo$106bo112bobo62boo58boo26b3o$105boo112boo31b3o32boo8b3o75bo$ 254bo32boo9bo56bo18boo$108bo144bo44bo54b3o6boo$258bobbo4bobbo27b3o42bo 9bo8boo$256b3obb6obb3o60boo7b3o8boo9bo$212bo45bobbo4bobbo27b3o31boo8b 3o$211bo85b3o33bo$211b3o31boo92boo3boo3b3o$115bo128bobo26bo23b3o39boo 3boo3b3o$114boo130bo25b3o23bo49bo3bo17bo5b3o$114bobo154bobobo22bo58bo 11boo4bo3bo$271bobobo21b3o39boo6boo3boo3b3o9bobobbo5bo$272b3o63bobo19b o14bo3bo$204bo68bo63boo20boo15b3o$204bobo131boo36b3o$204boo31b3o98boo 22bo$122boo115bo33bo67b3o3b3o11b3o$121boo115bo33b3o76boo7bo3bo14boo$ 123bo147bobobo75boo6bob3obo6boo5bo$271bobobo76boo6b5o6bobo6b3o$197bo 74b3o75bobo20bo8bo$196bo76bo50bo12boo3boo6boo$196b3o31boo92bo$130bo98b obo13boo19boo55b3o12bo3bo$129boo100bo14bo19bo72b3o3boo3boo$129bobo114b obo8boo5bobo24b3o45b3o3boo3boo$247boo8boo5boo26bo30b3o31bo6b3o$254boo 36bo31bo22b3o8boo6bo$189bo63b3o35b3o30bo12boo8b3o7boo6bo$189bobo62boo 68bo13bo9bo$189boo31b3o32boo8b3o21b3o30bo10b3o$137boo85bo32boo9bo22b3o 29b3o9bo22b3o$136boo85bo44bo89b3o$138bo89bobbo4bobbo27b3o21b3o51boo5bo 4bo3bo5boo$226b3obb6obb3o50bo30b3o20bo4bo4bo5bo3boo$182bo45bobbo4bobbo 27b3o22bo31bo18b3o5b3o3bo3bo6bo$181bo85b3o21b3o30bo18bo14b3o$183bo31b oo$145bo33bo34bobo26bo23b3o58bobboboobobbo$144boo32boboo34bo25b3o23bo 58boobbo4bobboo$144bobo31bo62bobobo22bo59bobboboobobbo35bo$177boo62bob obo21b3o74bo29boo$242b3o64bobo32bobo27bobo$243bo65bobbo31boo$121bo190b oo47boo$121b3o83b3o100bo3boo45bo$124bo27boo55bo33bo68boo48b3o$123boo 26boo22boo31bo33b3o57boo5bobbo6boo43bo$153bo21bo65bobobo55bobo5bobo7bo bo15bo44boo$163boo8bobo65bobobo55bo19bo14bo44boo$161bo3bo7boo67b3o55b oo19boo13b3o44bo$152bo7bo5bo76bo50bo$125b3o24bobo4boobo3bo33boo92bo$ 124bo3bo26boo3bo5bo32bobo13boo19boo55b3o$141boo12boo4bo3bo25boo8bo14bo 19bo$123bo5bo11boo12boo6boo26bo24bobo8boo5bobo24b3o126bo34boo$123boo3b oo22bobo28boo3boobo25boo8boo5boo26bo30b3o33bo59boo35bo$152bo29bo3bo3bo 33boo36bo31bo34bobo57bobo34bobo8bo$166boo13bo41b3o35b3o30bo34boo96boo 8bobo$128boo36boo13bo3bobbo35boo68bo143bobo7bo$128bobo38boo10bo5bo4b3o 32boo8b3o21b3o30bo143bobbo6boo$130bo10boo26b3o10bo3bo7bo32boo9bo22b3o 29b3o142bobobboo4boo$129boo9boo27boo12boo8bo44bo120boo76bobo3boo4b3o$ 126bo15bo16boo5boo9bobo18bobbo4bobbo27b3o21b3o58bo36bo37boo38bo5boo4b oo$126bobbo28bobo5boo10boo16b3obb6obb3o50bo30b3o25bo35bobo36boo50boo7b oo$126bo31bo19bo19bobbo4bobbo27b3o22bo31bo26b3o33boo39bo49bo8bobo$157b oo78b3o21b3o30bo59boo79boo22bo$185boo5bo160bobo78bo24boo$125booboboo 17bo16boo16bobo5b4o17bo23b3o58bobboboobobbo45bo$148boo17bo18bo6b4o15b 3o23bo58boobbo4bobboo125bo$125bo5bo16bobo16bobo5bobo15bobbo14bobobo22b o59bobboboobobbo95bo$168boo5bobbo14b4o14bobobo21b3o74bo89boo28boo$126b ooboo47boo12b4o4boo10b3o64bobo32bobo87bobo$128bo47bo3boo10bo7bobo10bo 65bobbo31boo$178boo22bo79boo62b3o13boo19boo$175bobbo8boo13boo76bo3boo 62bo14bo19bo$130boo24boo17bobo8boo25bo68boo63bo15bobo8boo5bobo58boo$ 130bo24boo23bo7bo23b3o57boo5bobbo6boo73boo7bobo5boo51bo6boo$131b3o23bo 21bo31bobobo55bobo5bobo7bobo15bo64b3o37boo18b3o8bo$133bo45b3o29bobobo 55bo19bo14bo64b3o37boo18bo27bo$212b3o55boo19boo13b3o63b3o9b3o26bo17boo 26b3o$213bo50bo74boo32bobo86bo$195bo68bo73bobo33boo7bo3bo54bo18boo$ 164bo29boo67b3o74bo5boo6boo27bo3bo52b3o7bo$163boo29bobo148bobbo4bobbo 82bo9boo$163bobo6bo58b3o110b6obb6o26b3o33bo8bo9boo8bobo$151boo19bobo 57bo30b3o33bo45bobbo4bobbo62boo7b3o$152bo19boo58bo31bo34bobo44boo6boo 63bobo5b5o$152bobo8bo67b3o30bo34boo83b3o39bobobobo$153boo8bobo98bo66b 3o92boo3boo3b3o$164bobo35boo27b3o30bo68bo26bo22bo3bo47booboo$164bobbo 33boo28b3o29b3o66bo26b3o21bo3bo47booboo4bo12boobboo3boo$164bobo36bo 154b5o63boo7b5o4b3o9boo5b3o$163bobo4boo59b3o58bo91b3o39boo6boo3boo6bo 10bo3bo3bo$163bo6bobo59bo30b3o25bo133bo20boo15bobo$172bo59bo31bo26b3o 131b3o36bo$172boo57b3o30bo59boo103bo6boo$210bo112bobo99b5o5b5o8b3o$ 209boo57bobboboobobbo45bo101boo6bo12b3o15boo$209bobo55boobbo4bobboo77b 5o74b3o7bo3bo14bo$268bobboboobobbo79b3o77bo18b3o6b3o$284bo75bo63boo3b oo6boo7boo3boo7bo8bo$249bobo32bobo138b5o7boo20bo$249bobbo31boo125bo13b ooboo$252boo62b3o13boo19boo55b3o12booboo$217boo31bo3boo62bo14bo19bo24b 3o28bobobo12b3o3boo3boo$216boo34boo63bo15bobo8boo5bobo55bobobo18bobobo bo$218bo23boo5bobbo6boo73boo7bobo5boo24bo3bo28b3o20b5o5bobo5boo$241bob o5bobo7bobo15bo64b3o32bo3bo29bo22b3o7boo4bobo$241bo19bo14bo64b3o80boo 9bo8bo7bo$240boo19boo13b3o63b3o9b3o21b3o44bo$309boo32bobo65bo10b3o$ 225bo82bobo33boo7bo3bo52b3o9bo23bo$224boo84bo5boo6boo27bo3bo20b3o28bob obo31bobo$224bobo88bobbo4bobbo82bobobo18boo5bo4bo3bo6bo$314b6obb6o26b 3o20bo3bo28b3o20bo5bobo3b3o6boo$269bo45bobbo4bobbo50bo3bo29bo18b3o6boo bboo3boo4bobo$269bobo44boo6boo104bo$269boo83b3o21b3o$266boo33b3o111bo bbo4bobbo$232boo31bobo35bo26bo22bo3bo55b3obb6obb3o$231boo32bo36bo26b3o 21bo3bo57bobbo4bobbo5bo$233bo30boo62b5o98bo30boo$354b3o39boo33b3o27boo $396boo65bo$208bo190boo47boo$208b3o83boo103b3o46bo$211bo28bo52bobo103b oo48b3o$210boo27boo21boo31bo93boo5boo8boo43bo$239bobo20bo65b5o55bobo5b oo8bobo15bo45bo$250bo9bobo66b3o56bo19bo15bobo42boo$249bobo8boo68bo56b oo19boo14boo43bobo$238bo8boo3bo$233bo4b4o5boo3bo128bo$212b3o18bo5b4o4b oo3bo33b3o13boo19boo55b3o$211bo3bo12boo9bobbo6bobo26boo8bo14bo19bo24b 3o28bobobo$210bo5bo11boo9b4o7bo27bo8bo15bobo8boo5bobo55bobobo33bo94boo $210booboboo21b4o29bo4bobo25boo7bobo5boo24bo3bo28b3o33bo60boo34bo$238b o31bobo3boo34b3o32bo3bo29bo34b3o57boo35bobo6bobo$253boo14bo3boo36b3o 164bo35boo6bo3bo$216bo36bobo13bo3boo37b3o9b3o21b3o175bo7bo$215boo37b3o 12bo3boo4boo32bobo65bo140bo4bo4b4o$229bo25b3o12bobo5bobo33boo7bo3bo52b 3o143bo4boboboo$214boboo10boo24b3o7bo6bo8bo5boo6boo27bo3bo20b3o28bobob o62boo74bo3bo3bobbob3o$213bobboo10bobo15boo5bobo9boo18bobbo4bobbo82bob obo25bo36bo38bo36bobo6boboboo$213b4o28bobo5boo9boo18b6obb6o26b3o20bo3b o28b3o26bobo32bobo37boo46b4o8boo$245bo39bobbo4bobbo50bo3bo29bo27boo33b oo38bobo47bo9bobo$244boo40boo6boo227bo22bo$212boo3boo53bo5boo44b3o21b 3o89b3o79boo22boo$215bo37boo16bobo4b3o104bobbo4bobbo45bo$212bo5bo17boo 16bo19bo5boobo16bo22bo3bo55b3obb6obb3o42bo80bobo$213booboo17boo17bobo 5boo7boo7bobbo15b3o21bo3bo57bobbo4bobbo5bo118boo$214bobo20bo17boo5boo 16boobo14b5o98bo90boo29bo$215bo49boo11b3o6boo35b3o39boo33b3o87boo$215b o49b3o10boo7bobo76boo125bo$265boo22bo79boo62boo14boo19boo$262boo11bo 13boo78b3o60bobo15bo19bo$217boo25bo17boo10boo93boo63bo15bobo9bo5bobo 59bo$217bo25boo22bo6bobo82boo5boo8boo73boo8boo5boo51bo7boo$218b3o22bob o21bobo28b5o55bobo5boo8bobo15bo65boo38bo18b3o7bobo$220bo46boo30b3o56bo 19bo15bobo62b3o37boo17bo27bo$300bo56boo19boo14boo64boo3boo32bobo16boo 26b3o$461boo8b3o75bo$351bo73b3o34bo7bo3bo54bo18boo$282boo66b3o74bo6bo 6bo28bo3bo52b3o$251boo7bo20boo35b3o28bobobo72bo6boo6boo28b3o52bo10boo$ 250boo7bo23bo65bobobo33bo44b3o6b3o82boo8boo$238boo12bo6b3o55bo3bo28b3o 33bo46boo6boo64boo7bo21bo$239bo77bo3bo29bo34b3o45bo6bo64boo7b3o$239bob o6bobo257bo5b5o$240boo6bo3bo65b3o97boo51b3o39boo3boo3b3o22booboboo$ 252bo37bo60bo65bobo50bo3bo$248bo4bo35boo59b3o66bo27bo22bo3bo48bobo5bo 13bobbo5bo$252bo36bobo26b3o28bobobo92b3o22b3o39boo7b5o4b3o10boo$248bo 3bo4boo90bobobo25bo65booboo62bo8boo3boo6bo9bobobbooboo$248bobo6bobo57b o3bo28b3o26bobo62b3ob3o64bo5boo3boo5boo16bo$259bo57bo3bo29bo27boo63b3o b3o61bobbo$259boo183b3ob3o61booboo$318b3o89b3o31b3ob3o63boo7boo$297boo 56bobbo4bobbo45bo32booboo72booboo8b3o15boo$296boo55b3obb6obb3o42bo34b 3o74bobbo7booboo14bo$298bo56bobbo4bobbo5bo74bo63boo3boo5bo10booboo6boo 7b3o$371bo139boo3boo8bo7b5o5bobo9bo$336boo33b3o138b5o7boo7boo3boo6bo$ 336boo175bobo$339boo62boo14boo19boo56bo$305bo33b3o60bobo15bo19bo56b3o 13b3o3boo3boo$304boo33boo63bo15bobo9bo5bobo24b3o28b5o19b5o5bo$304bobo 22boo5boo8boo73boo8boo5boo24bo3bo52b3o7boo$328bobo5boo8bobo15bo65boo 32bo3bo53bo7boo5b3o$328bo19bo15bobo62b3o33b3o43boo26bo$327boo19boo14b oo64boo3boo75bo25bo$431boo8b3o65b3o$395b3o34bo7bo3bo64bo$312boo83bo6bo 6bo28bo3bo51b5o26bo5bo$311boo83bo6boo6boo28b3o21b3o29b3o19boo5bo4boob oo$313bo43bo44b3o6b3o50bo3bo29bo21bo5b3o13boo$356bo46boo6boo51bo3bo48b 3o10bo5bo4boo$84boo270b3o45bo6bo53b3o49bo25bo$85bo417boo6boo17booboboo $85bobo6bo23boo233boo33boo51b3o58bobbo4bobbo$86boo4bobo23bo201bo31bobo 32bobo50bo3bo56b6obb6o$90boo18boo3boobo200boo31bo36bo27bo22bo3bo57bobb o4bobbo5bo$90boo17bo3bo3bo201bobo29boo63b3o22b3o59boo6boo6bobo28bo$90b oo16bo306booboo63boo34boo28boo$92bobo4bo8bo3bobbo298b3ob3o62bobo63bobo $94bo3bo9bo5bo180bo118b3ob3o63b3o48boo$98b3obbo5bo3bo181b3o116b3ob3o 64b3o47bo$110boo186bo81b3o31b3ob3o63b3o49b3o$297boo28boo20boo31bo32boo boo56boo5bobo7boo17bo25bo$102bo223boo21bo31bo34b3o56bobo5boo8bobo15bo$ 101boo225bo9bo8bobo67bo57bo19bo15b3o43boo$101bobo232bobo8boo125boo19b oo59boo$82bo235bo5boo9bobo220bo$82b3o231bo3bo3b3o7bobbo$85bo234bo5boob o5bobo35boo14boo19boo56bo$84boo213b3o13bo5bo4bobbo6bobo26boo5bobo15bo 19bo56b3o$298bo3bo12boo9boobo8bo26bo8bo15bobo9bo5bobo24b3o28b5o33bo94b oo$109boo186bo5bo20b3o30bo5bobo25boo8boo5boo24bo3bo65bobo58bo34bo$86b 3o19boo187bo5bo20boo31bobo3boo35boo32bo3bo65boo58boo34bobo5bobo$86b3o 21bo229bo17bobo38b3o33b3o126bobo34boo5bobbo$85bo3bo213bo36boo16bobbo 38boo3boo204boo8bo$84bo5bo211boo32boo3boo15bobo40boo8b3o195bo3boo5bobo $85bo3bo212boo37b3o13bobo5b3o34bo7bo3bo196boo6boboo$86b3o211bobboo11b oo23boo7bobo4bo9bo6bo6bo28bo3bo51b5o26bo35boo73bobbo6booboo$117bo183bo bo11boo16boo5boo9boo13bo6boo6boo28b3o21b3o29b3o26bo36bo74bobo8boboo$ 116boo183boo14bo14bobo5bo10bo20b3o6b3o50bo3bo29bo27b3o32bobo38boo46bob o8boo125boo$116bobo213bo40boo6boo51bo3bo92boo38boo38bo9bo9bobo125bo$ 331boo41bo6bo53b3o135bo36bo22bo125bobo7bo$299boo3boo59boo106boo6boo44b oo81b3o20boo125boo4b4o$299boo3boo34boo17boo4bobbo42b3o58bobbo4bobbo42b obo236b4o16bo$324bo16bo16boobo7bo40bo3bo56b6obb6o43bo81bo154bobbo8boo 5bobo$89boo210b3o19boo16bobo5boo10bo7bo17bo22bo3bo57bobbo4bobbo5bo119b oo154b4o14bo3boo$89bo34boo175b3o19bobo16boo5bobo8bo8bo16b3o22b3o59boo 6boo6bobo88bo28bobo154b4o3boobobo4bo3boo$90b3o30boo177bo47b3o12bobbo5b oo9booboo63boo34boo88boo188bobbo3boo5bo3boo$92bo32bo225b3o11boo7bobo7b 3ob3o62bobo123bobo191bo10bobo3boo$350b3o23bo7b3ob3o63b3o79boo19boo214b obbo8bo4bobo$349bobo24boo6b3ob3o64b3o61b3o15bo19bo234bo$304boo43boo4bo 6boo20b3ob3o63b3o64bo15bobo10bo4bobo234boo$304bo26boo21bo6boo22booboo 56boo5bobo7boo17bo37bo17boo9b4ob3o51bo8boo$132bo172b3o22boo22b3o6bo22b 3o56bobo5boo8bobo15bo66booboboo51b3o7boo$131boo174bo24bo54bo57bo19bo 15b3o63b3obobbo32boo16bo12bo14bo$131bobo310boo19boo81boobobo32boo17boo 26b3o$549b4o35bo47bo$512boo9b4o23bo7b3o55bo18boo135boo$370bo67bo72bobo 8b6o29bo3bo52b3o154boo$339bo7bo21boo66b3o73bo7b8o27bo5bo50bo11bo147bo$ 338boo7bobo19bobo33b3o28b5o33bo45boo6boo83boo9boo$139boo184boo11bobo6b oo55bo3bo65bobo44b8o26bo7bo31bo28bobo$138boo186bo77bo3bo65boo46b6o27bo 7bo30boo7bo$140bo185bobo5bobo68b3o115b4o67bobo5b3o30boo3boo150bo$327b oo5bobbo218bo5bo38b5o32bo141bo11b3o$337boo165b3o50bo3bo38boo3boo3b3o 22bo5bo137boo14bo$335bo3boo36boo127bo51b3o40b5o3bo3bo4bo17booboo134bo 3bobo12boo$337boo37boo58b5o26bo37bo27b3o65b5o12b3o11boo3bobo133b3o$ 147bo186bobbo6boo32bo26b3o29b3o26bo66bobo65bobbo3bo5bo6bo9boo5bo133bo$ 146boo186bobo7bobo57bo3bo29bo27b3o64b3o64bo3bo3boo3boo5boo11bo4bo133b oo$146bobo197bo57bo3bo124b3o64bo195b3o$346boo57b3o125b3o64boboo191boob oo$106boo335boo6boo44boo34b3o65bo9bo175boo6booboo$106boo277bo56bobbo4b obbo42bobo34bobo73boobo9b3o15boo144boo7b5o$384boo55b6obb6o43bo34b3o76b o27bo147bo5boo3boo$384bobo55bobbo4bobbo5bo138boo3boo3bo3bo9bobo16b3o 123boo3boo3bo$154boo287boo6boo6bobo136bo5bo3bobbo9b5o5b3o9bo123boo3boo 3b3o$153boo268boo34boo146b5o8boo3boo6bo146bo$105b3o47bo267bobo173bo3bo 3b5o8boo3boo5bo136b3o7boo$105b3o316b3o79boo19boo71b3o3boo3boo156b3o23b o$104bo3bo316b3o61b3o15bo19bo57bo21b5o158bo23boo$392boo30b3o64bo15bobo 10bo4bobo56b3o21b3o5bobo175bobo$103boo3boo8bo272boo23boo5bobo7boo17bo 37bo17boo9b4ob3o25b3o28booboo21bo7boo5bo174boo$117bobo42bo230bo21bobo 5boo8bobo15bo66booboboo26bo3bo26b3ob3o28bo7bo173bo$116bo3bo40boo252bo 19bo15b3o63b3obobbo25bo5bo25b3ob3o9boo23bobbo152boo3boo14b3o$116bo3bo 40bobo250boo19boo81boobobo58b3ob3o10bo23bobo156bo19bo$116bo3bo398b4o 26bo7bo24b3ob3o7b3o173bo6bo5bo$103b3o10bo3bo361boo9b4o23bo7b3o18bo7bo 25booboo8bo176boo5booboo$107boo7bo3bo37boo240bo80bobo8b6o29bo3bo52b3o 27bo5bo151boo7bobo3boo$107boo7bo3bo37bo240boo82bo7b8o27bo5bo17bo5bo28b o20boo6bobo3bo161bo3bobo$108boo7bobo36bobo240bobo42bo45boo6boo51bo3bo 51bo6boo3bobo8bo136b3o12bo5bo$106bobo9bo37boo11boo273bobo44b8o26bo7bo 18b3o49b3o11booboo6boo135bo3bo$106boo60boo274boo46b6o27bo7bo70bo12bo5b o5bobo133bo5bo$170bo322b4o94bo6bo21bo144bo5bo5bo$440boo84bo5bo57boo6b oo17boo3boo144bo7bo$101boo3boo331bobo32b3o50bo3bo57b3o6b3o6bo158bo3bo 5b3o6bo$101boo3boo299boo30bo36bo51b3o59boo6boo6bo162bo14boo$113bo12boo 278boo30boo35bo27b3o85bo6bo7b3o156bobbo15bobo$103b3o8boo11bo49bo230bo 94bobo64bo66boo126bo$103b3o7boo12bobo6bo7bo31boo325b3o64boo64boo128bo$ 104bo23boo4bobo5b4o30bobo203bo120b3o60boo3boo49boo14bo124b3o$132boo8b oobbobboo231b3o118b3o65b3o48bo140bo5bo6boo3boo$132boo10b3obboo234bo81b oo34b3o65boo50b3o143bobo5b5o$132boo11bo6boo230boo29bo20boo28bobo34bobo 57boo5boo8boo17bo25bo143boo6booboo10boo$134bobo15b3o259boo20bo31bo34b 3o56bobo5bo9bobo16bobo175booboo9boo$120bobo6bo6bo4bobo8boo260bobo8bobo 6bobo125bo19bo16boo44bo132b3o12bo$104boo15boo7bo11boo5boo7boo24boo237b o3bo6boo125boo19boo60boo$104boo15bo6b3o14bo3boo7bobo22boo226boo10bo 220bobo$113bo29bobo14bo24bo225bobbo7bo4bo334bo$112boo30bo15boo241b5o7b o7bo52boo19boo262bo14boo$111boo4boo283bo5bo6bo7bo3bo24boo5b3o15bo19bo 57bo36bo168b3o13bo22bo$110b3o4boo267b3o5bobboo3bo3boo7bo9bobo24bo8bo 15bobo10bo4bobo56b3o34bo182b3o22boo$111boo4boo3bo262bo3bo13bo7bobbo27b obo5bobo7bo17boo9b4ob3o25b3o28booboo33b3o180bo24bobo$103boo7boo7b3o13b o54bo191bo5bo20boo29bo3bo3boo36booboboo26bo3bo26b3ob3o93boo125boo$102b obo8bo6bo3bo12boo52boo192bo3bo36bo19bo40b3obobbo25bo5bo25b3ob3o92boo 126bobo$102bo16bob3obo10bobo52bobo192b3o35b4o14bo4bo40boobobo58b3ob3o 94bo113bo12b3o$101boo17b5o261bobbo33boboboo4bo12bo42b4o26bo7bo24b3ob3o 195bo9b4o3boo8b3o6boo$387b3o32bobbob3o5boobo3bo3bo5boo9b4o23bo7b3o18bo 7bo25booboo196bobo6b4o3boo8b3o7boo$387boobo13bo17booboboo5b4obobbobo6b obo8b6o29bo3bo52b3o27bo35boo132boo7bobbo3booboboobbobo25boo$388bobo12b oo15b3ob4o6boobboo13bo7b8o27bo5bo17bo5bo28bo28bobo33bo142b4o4boboboobb oo25boo$112bo276bo13bobo13bobo4bo33boo6boo51bo3bo58boo32bobo39bo97boo 4b4o3boboo33bo$109b4o4bo11boo68boo218bo41b8o26bo7bo18b3o93boo39boo96bo bo7bo$101boo5b4o5bo12boo66boo218boo42b6o27bo7bo155bobo95bo$101boo5bobb o17bo70bo185boo3boo59boo9b4o94bo6bo178bo8boo$108b4o274bobobobo34boo23b obo41bo5bo57boo6boo43b3o130bo34bo$109b4o274b5o36bo16bobo7bo41bo3bo57b 3o6b3o6bo37bo130b3o33boo31bo$112bo275b3o20boo15bobo5bo7boboboobbobbo 42b3o59boo6boo6bo37bo166boo31boo$389bo20boo17boo5boo6bobo8bo17b3o85bo 6bo7b3o235bobo$122bo84bo204bo24boo13bobo6boo10bobo64bo126boo$122boo82b oo229b3o12boo7bobo9b3o64boo124boo$110bobo8bobo82bobo223boo3boo24bo9b3o 60boo3boo80boo19boo22bo106boo$110bo3bo321boo25boo8b3o65b3o62boo16bo19b o94bo34bobo$114bo10boo264boo43bo5bo7bo22b3o65boo62bobo16bobo10bo4bobo 94bobo34bo$110bo4bo7bobbo264bo27bo22bobo4boo22bobo57boo5boo8boo17bo37b o17boo9bobo3boo51bo43boo81boo$114bo7bo269b3o23boo22boo5bobo21b3o56bobo 5bo9bobo16bobo64boobo53b3o125boo$102boo6bo3bo7bo271bo23bobo111bo19bo 16boo65booboo34bo16bo130bo$101bobo6bobo9bo91boo315boo19boo82boobo34boo 16boo$101bo21bobbo5boo79boo421bobo35bobo$100boo23boo5bobo80bo421bo8bo 85bo34b3o$134bo300bo162b3o44bobo83bo37bo$134boo298bo22boo66bo36bo37bo 7b8o28bo3bo82b3o34bo61bo$426boo6b3o19boo66b3o34bo37bo8bob4obo28bo3bo 180boo$412boo11boo31bo33b3o28booboo33b3o44b8o28bo3bo180bobo$222bo190bo 13bo63bo3bo26b3ob3o115bo3bo33boo$221boo190bobo5boo67bo5bo25b3ob3o92bo 22bo3bo32boo$221bobo190boo5boo99b3ob3o92bo22bo3bo34bo4b5o67boo$424boo 63bo7bo24b3ob3o62boo52bobo39bob3obo30bo34bobo$424b3o38bo23bo7bo25boob oo62bobo28bo24bo41bo3bo31bobo34bo$424boo38boo58b3o27bo37bo27bobo66b3o 32boo111boo$421boo8boo31bobo23bo5bo28bo28bobo133bo125bo19boo$421boo8bo bo57bo3bo58boo64b3o65boo124b3o21bo$229boo202bo58b3o192bobo123bo$228boo 203boo252bobo123boo$230bo300bo6bo81b3o65bo28bo$530boo6boo43b3o130bo$ 472boo55b3o6b3o6bo37bo34bobo93b3o87bo38bo$471boo57boo6boo6bo37bo36bo 63booboboo113bo38boo$473bo57bo6bo7b3o136bo5bo113b3o36bobo$237bo272bo 110bo64bo3bo119b3o$236boo272boo109bo65b3o79bo39bo3bo$236bobo267boo3boo 80boo19boo129boo19b4o$511b3o62boo16bo19bo94bo34bobo10bo7b4o39bo5bo$ 480bo30boo62bobo16bobo10bo4bobo56b3o35bobo34bo9bobo6bobbo39boo3boo$ 479boo22boo5boo8boo17bo37bo17boo9bobo3boo26bo30bobo35boo44bo3boo4b4o 83boo$479bobo20bobo5bo9bobo16bobo64boobo29bobo29b3o81bo3boo5b4o6boo73b oo$502bo19bo16boo65booboo27bo3bo28b3o11boo68bo3boo8bo6bobo74bo$244boo 255boo19boo82boobo28bo3bo28b3o12bo59boo8bobo19bo$243boo361bobo29bo3bo 28b3o9b3o59bobo9bo20boo69boo$245bo361bo8bo21bo3bo28bobo9bo18bo34b3o5bo 20bobo39boo39bo$568b3o44bobo20bo3bo28b3o27bo37bo4boo21boo40bo31bo5bobo $487boo43bo37bo7b8o28bo3bo19bo3bo58b3o34bo28bo38b3o32bobo3boo11bo$486b oo43bo37bo8bob4obo28bo3bo20bobo164bo17bo17bobo14boo$488bo42b3o44b8o28b o3bo21bo183boo16bobbo13bobo$252bo361bo3bo61b4o136boo3boo15bobo$251boo 338bo22bo3bo60b6o140b3o13bobo$251bobo273boo62bo22bo3bo59b8o44boo42bo 50boo7bobo4bo$526bobo32boo52bobo59boo6boo7bo34bobo43boo40boo5boo9boo$ 495bo30bo33bobo28bo24bo61b8o8bobo34bo42boo40bobo5bo10bo$494boo29boo35b o27bobo86b6o9boo120bo50boo$494bobo159bo23b4o131boo49boo$590b3o61b4o 210bo$259boo208bo183boboboo$258boo209b3o180bobbob3o182bo$260bo211bo 117b3o59booboboo28bo155boo$471boo50boo28b3o94b3ob4o9boo17bo155boo$502b oo19bo31bo34bobo56bobo4bo10bobo16b3o94boo90bo$501boo10bobo5bobo30bo36b o57bo19bo113bo90boo$503bo8bobbo5boo125boo19boo94bo18b3o87bobo$267bo 230boo11boo78bo173b3o18bo$266boo230bobo8boo3bo76bo176bo$266bobo224boo 6bo9boo50boo19boo129boo50boo80bobo$481boo6boobobbobbobbo10bobbo23boo5b oo16bo19bo94bo34bobo133boo$480b6o3boobboo6bo11bobo23bo5bobo16bobo10bo 4bobo56b3o35bobo34bo133bo$471boo3boo4boboo12bobo27bobo6bobo7bo17boo9bo bo3boo26bo30bobo35boo201boo$473b3o22boo28bobbo5boo37boobo29bobo29b3o 126bo110boo$472bo3bo36bo6bo10boo43booboo27bo3bo28b3o126bo112bo$274boo 197bobo36bobo5bo8bo3boo41boobo28bo3bo28b3o125bobo$273boo199bo36boboo6b o9boo43bobo29bo3bo28b3o124booboo84bo$275bo234booboo9boobbobbo45bo8bo 21bo3bo28bobo28bo34b3o57bo5bo84boo$475b3o33boboo5b3obbobbobo7b3o44bobo 20bo3bo28b3o27bo37bo60bo86boo$475b3o13boo14boo3bobo7b4o14bo7b8o28bo3bo 19bo3bo58b3o34bo58boo3boo116bo$490boo14bobo4bo9boo14bo8bob4obo28bo3bo 20bobo277boo$492bo13bo41b8o28bo3bo21bo244boo32bobo$282bo222boo77bo3bo 61b4o201bo$281boo190boo3boo58boo21bo22bo3bo60b6o187bo10bobo$281bobo 190b5o35boo15bo4bo3bo20bo22bo3bo59b8o44boo139bobo9boo$475b3o37bo16bobb o5bo43bobo59boo6boo7bo34bobo65boo62boo7boboo$476bo22bo15bobo4bo8b5obo 3bo19bo24bo61b8o8bobo34bo66bo61bobo6booboo$498boo16b3ob4o11bo5bo18bobo 86b6o9boo99b3o61bo6b3oboboo53boo$498bobo17booboboo11bo3bo7boo76bo23b4o 111bo63bobbobbobbobbobo52boo$518bobbob3o12boo8bobo9b3o61b4o201bo6boo4b o55bo$289boo228boboboo25bo72boboboo193boo6bobo26boo$288boo230b4o6bo19b oo70bobbob3o191bobo7boo26boo11bo$290bo187boo42bo6bo30b3o59booboboo28bo 163bo51boo$478bo50b3o5boo81b3ob4o9boo17bo163boo21bobo3bo9bo12boo$479b 3o24boo28boo22bobo56bobo4bo10bobo16b3o185boo3boo7bobo44bo$481bo23boo 31bo22bo57bo19bo204bo3bobo7bobbo42boo$507bo110boo19boo54bobboo159bobbo 41bobo$297bo263bo132bo3boobboo119boo$296boo263bo132bo7boo120bo34bobbo$ 296bobo223bo162boo8b4o125bobo6bo7bo17boo18bobo$522bobo20bo103bo34bobo 138boo4bobo5b4o37boo$514bo7boo20boo65b3o35bobo34bo142boo8boobbobboo32b o$499boo12boo29bobo33bo30bobo35boo178boo11boobboo64boo$500bo12bobo63bo bo29b3o215boo7bo10boo6boo52boo$500bobo5boo68bo3bo28b3o217bobo4bo10b3o 5boo54bo$304boo195boo5bobo67bo3bo28b3o219bo4bo10boo$303boo204b3o66bo3b o28b3o232boo39bo$305bo204b3o65bo3bo28bobo28bo34b3o166boo40boo$509b3o 40boo24bo3bo28b3o27bo37bo207boo$508bobo7boo31boo25bo3bo58b3o34bo241bo$ 508boo8bobo32bo25bobo337boo$520bo59bo304boo32bobo$312bo207boo98b4o261b o$311boo306b6o247bo10bobo$311bobo304b8o44boo199bobo9boo$560bo56boo6boo 7bo34bobo189boo7boboo$559boo57b8o8bobo34bo188bobo6booboo12boo$559bobo 57b6o9boo223bo6b3oboboo13boo38boo$596bo23b4o226boo7bobbobbobbobbobo12b o39boo$594b4o252boo7bo6boo4bo55bo$319boo272boboboo261bobo26boo$318boo 272bobbob3o261boo25bobbo10bo$320bo271booboboo28bo260bo14boo$567boo21b 3ob4o9boo17bo246bobo12bo13boo$566boo21bobo4bo10bobo16b3o245boo12boboo 43bo$568bo20bo19bo60bobo201bo15boo42boo$588boo19boo58bo207boo55bobo$ 327bo336boobbo4bo179boo22boo$326boo336boobobboboo180bo34boo$326bobo 266boo58boo11boo184bobo6bo7bo17boo18bobo$575bo19bo23bo34bobo125boo71b oo4bobo5b4o37boo$574boo10boo5bobo23bobo34bo123bo3bo74boo8boobbobboo32b o$574bobo9boo5boo24boo158bo5bo13boo58boo11boobboo64boo9boo$569boo12boo 193bobbo3bo13boo58boo7bo10boo6boo52boo9bobo$567bo3bo10b3o200bo10boo63b obo4bo10b3o5boo47bo6bo7b3o4boob3o$334boo230bo5bo10boo30boo159bo3bo3bo 10b3o65bo4bo10boo54bobo12b3o4bobb4o$333boo230bobbo3bo13boo28bo158boboo 3boo12boo78boo55boo3bo12b3o4boo$335bo236bo13boo25b3o31b3o125bo11bobo9b oo5boo68boo55boo3bo13bobo$563bo3bo3bo41bo35bo124boo11boo10boo5bobo124b oo3bo14boo$562boboo3boo37bo39bo139bo19bo121boo3bobo$562bo44bobo198boo 119bobo4bo$561boo27boo14bo3boo3boo298boo12bo$342bo247bobo13bo3boo3boo 298bo12boo$341boo248b3o12bo3boo290bo10bobo$341bobo248b3o12bobo30boo 139bo119bobo9boo$591b3o7bo6bo30bobo137boo110boo7boboo21boo$583boo5bobo 9boo37bo138boo108bobo6booboo21bo$582bobo5boo9boo14boo270bo6b3oboboo22b 3o$582bo33bobbo260boo7bobbobbobbobbobo24bo$581boo36bo260boo7bo6boo4bo$ 349boo268bo270bobo26boo$348boo266boobo271boo24bobbo$350bo265boo154bobo $578boo192boo129bobo3bo7bobbo$579bo193bo130boo3boo7bobbo$579bobo6bo7bo 20boo203boo80bo3bobo8bobo$580boo4bobo5b4o19boo20b4o132boo46bo96bo$357b o226boo8boobbobboo31boo7bo132bo46bobo7bo49boo$356boo226boo11boobboo31b oobboo3bo132bobo10bo34boo7b4o47bo34boo$356bobo225boo7bo10boo19boo11boo bbo123bo10boo9b4o42b4o46bobo6bo7bo17boo$586bobo4bo10b3o17bobo137boo21b oob4o5boo33bobbo5boo40boo4bobo5b4o$588bo4bo10boo20bo138boo19b3oboo3bo 3bobbo31b4o5boo44boo8boobbobboo$601boo8boo174booboo3bo7bo29b4o52boo11b oobboo$601boo8bobo174b5o3bo6bo29bo55boo7bo10boo6boo$613bo175bo3b3o7bo 87bobo4bo10b3o5boo$364boo247boo156boo26bobbo5boo83bo4bo10boo$363boo 406boo26boo7bobo95boo$365bo251b3o190bo27boo66boo$619bo152bo14bo22boo 27bo$618bo152bobo11boo52bobo5boo$770bobbo11b3o52boo5boo$769bobbo10b3o 64boo10bo$372bo410boo22boo41b3o7bobo$371boo396bobbo34bo42boo6boo$371bo bo236boo139bo19boo16boo9bo4bobo39boo9boo$609bobo137boo37b4o7bobo3boo 40boo9boo$611bo138boo31bobobbobb3o5boobo57bobo7boo$782bobbobboo9booboo 46bo11bo7bobo$773boo6boo9bo6boobo47bobo19bo$773boo4boo3bo8bo5bobo48boo 20boo$379boo400boo10bo6bo$378boo277boo123bobbo$380bo221b3o52bo84bobo 38bobo85boo$604bo41bobo6bobo84boo127bo$603bo42bobbo5boo86bo99bo14bo10b obo$649boo191bo13b4o9boo$647bo3boo92boo95b3o10boboboo$387bo261boo95bo 107bobbob3o$386boo250boo6bobbo96bobo10bo94booboboo$386bobo206boo40bobo 6bobo87bo10boo9b4o90b3ob4o$594bobo40bo96boo21boob4o5boo80bobo4bo$596bo 39boo97boo19b3oboo3bo3bobbo78bo$757booboo3bo7bo76boo$758b5o3bo6bo6boo 53boo$759bo3b3o7bo6boo30boo22bo$394boo345boo26bobbo40bo19b3o$393boo 346boo26boo42bobo10bo6bo$395bo74bo116b3o224boo9b4o30bo$470b3o116bo161b oo4bo66boobobo27boo$473bo114bo153boo6boo3boo66b3obobbo27boo$472boo266b oboo8bo3boo66booboboo4boo$740bo84b4ob3o3bo$402bo337bo36boo38bobo6bo4bo bobbobo5boo$401boo337bobbo33bo40boo13bo3boo5bobbo$401bobo70b3o103boo 159boo16boo9bo4bobo40bo14boo13bo$473booboo101bobo176b4o7bobo3boo71bo$ 473booboo103bo171bobobbobb3o5boobo36boo37bo$473b5o170boo40boo60bobbobb oo9booboo34bobo33bobbo6boo11boo$472boo3boo169bo41bo52boo6boo9bo6boobo 37bo33boo8bobo11bo$614boo23boo5bobo33boo3boobo52boo4boo3bo8bo5bobo53bo 30bo11bobo7bo$409boo204bo22b3o5boo33bo3bo3bo61boo10bo6bo55boo28boo11b oo7b4o$408boo68bo136bobo8bo8boboo26boo13bo71bobbo69boo52b4o$410bo66bob oo91b3o41boo8bobo6bobbo26boo13bo3bobbo24bobo38bobo123bobbo$477bo11boo 83bo52bobo5boboo29boo10bo5bo25boo157bo7b4o$488boo83bo53bobbo7b3o27b3o 10bo3bo27bo87b3o68boo4b4o4boo$477boobo9bo136bobo9boo27boo12boo119bo67b oo5bo7bobo$475bobbo147bobo29boo5boo9bobo36boo85bo85bo$417bo57bobo148bo 9bo20bobo5boo10boo37bo115bobo53boo$416boo219boo18bo19bo38bobo10bo74bo 28boo$416bobo146boo69boo18boo59boo9b4o72b3o26bo$497bo66bobo85bo38bo13b oo7bo12boob4o5boo66bo38bo41bo$496boo68bo56boo26b4o10boo24b4o11bo6boo 11b3oboo3bo3bobbo63boo36b3o15b3o13bobo5b3o$476b3o17bobo56boo67bo25boob obo10bo25b4o7b3o7bobo11booboo3bo7bo99bo20bo14boo4bo$475bo3bo75bo68bobo 8bo13b3obobbo9bobo5boo16bobbo7bo24b5o3bo6bo6boo91boo18bo15bo5boo$474bo 5bo65boo5bobo69boo8bobo12booboboo10boo5boo16b4o33bo3b3o7bo6boo$424boo 49bo3bo64bobbo5boo81bobo12b4ob3o18boo12b4o4boo10boo26bobbo65b3o26bo44b 3o$423boo51b3o52bobo9bo92bobbo12bo4bobo17b3o11bo7bobo9bobbo24boo66boob oo24bo45b3o$425bo50b3o52bo3bo7bo13b3o76bobo20bo17boo22bo105booboo24b3o $504boo29bo7bo15bo75bobo21boo13boo25boo8bobbo12bo69bo9b5o43boo$479boo 22boo26bo4bo7bobbo10bo76bo38boo34bobbo11boo59b3o8bo8boo3boo41bobo$479b o25bo29bo10boo162bobo12b3o60bo7bobo57bo23boo3boo$480b3o40boo6bo3bo175b o11b3o61bo9bo42b3o38b5o$432bo49bo39bobo6bobo8bobo178boo22boo21bo26bo 11boo28bo3bo38b3o$431boo89bo20boo21boo57bo85boo34bo20b3o26bo9b5o17bo8b o5bo38bo$431bobo87boo20bo6boo14bo58b3o83boo16boo9bo4bobo19bo29bo13bo 17bobo6bo5bo$512bo36bobo7bo4bobo61bo99b4o7bobo3boo20boo27bobo8b3o19boo 10bo$511boo17boo19bo6bobo3boo61boo94bobobbobb3o5boobo36boo16bo9bo31bo 3bo3b3o$511bobo17bo26boobo160bobbobboo9booboo34bobo16bo10boo6bo25bo6bo 17bo59bobo$531bobo8bo15booboo150boo6boo9bo6boobo37bo27boo6b3o19bobbo6b o18bobo49b3o5bo3bo$532boo8bobo13boobo151boo4boo3bo8bo5bobo77bo18bo28b oo11boo32boobbobbobo7bo$439boo102bobo12bobo69bo90boo10bo6bo77boo19bo 41bo30bobbobboo7bo4bo$438boo103bobbo12bo70bo91bobbo82boo3boo21b3o39b3o 30bo19bo$440bo102bobo4boo77bobo91bobo82bobobobo21bo41bo32bo10b3obbo3bo 3boo$519boo21bobo4boo77booboo163boo3bobo5b5o26boo69bo15bobo5bobo$518b oo22bo8bo75bo5bo129b5o3b3o22boo3boo7b3o26bobo18bo44boo5bobbo21bo$520bo 109bo131bob3obo4bo28bo8bo29bo17bo36b3o5bobo7boo21boo$543bo83boo3boo 129bo3bo4bo86b3o36bo5bo$447bo94bo221b3o130bo5boo$446boo94b3o220bo84boo $446bobo109bo63boo60boo145bo18bo$527bo29boo63bo62bo133b5o8boo5boo7bobo $526boo29bobo49bo10bobo62bobo8bo65boo54bob3obo6b3o5boo7boo$526bobo79bo bo9boo10boo52boo8bobo64bo6bo39boo7bo3bo11bo6boo8bo36boo$606boo3bo20bo 66boo59b3o6boo39boo8b3o12bo6b3o7bobo33bobo$515boo18bo70boo3bo21b3o63b oo59bo8bobo29bo19bo20boo8boo36bo$454boo60bo18bobo68boo3bo23bo63boo98b 4o28boo6boo$453boo61bobo8boo6boo66boo3bobo85bobo4boo93boboboo19boo5bob o6boo$455bo61boo7bo3bo34boo35bobo4bo86bo6bobo91bobbob3o18bo6bo$525bo5b o32boo36bo102bo92boboboo20b3obboo$525bo3boboo33bo34boo102boo85b3o4b4o 8boo13bo18bo$525bo5bo245boo13b3o6bo9bobo30bo36b3o$526bo3bo3boo240boo 13bo3bo17bo30b3o36bo$462bo64boo5bobo241bo34boo67bo$461boo73bo253boo3b oo$461bobo72boo35bo239boo$572boo239bo$572bobo220boo5boo7bobo195boo$ 785bo7bo4bo3b3o6boo24bo36boo134bo$784boo12bo5boobo29bobo33bobo134bobo 7bo22boo$784bobo5bo6bo4bobbo29boo36bo135boo7bobo20bo$469boo321bobo9boo bo215boo6boo8bobo$468boo332b3o218boo4bo3bo7boo$470bo109boo46boo48boo 122boo8bo210boo3bo5bo$579boo47boo47bobo130b3o9bo197bobo4boobo3bo$581bo 49boo38boo3b3o130bo12b3o5bo189bo7bo5bo$631b3o28boo7boobb3o114boo15boo 14bo3bo36b3o160bo3bo$631boo28bobo5b3o4b3o39boo71boo31boo3b3o36bo162boo $477bo143boo5boo8boo20b3o4b4o6bobo5boo30bobo73bo73bo153bo$476boo142bob o5boo8bobo18b3o5bo3bo6boo5bobo28bo6boobboo99bo190boo$476bobo109bo31bo 19bo19b3o4b4o16bo28bobbobbobboboo99bo191boo$587boo30boo19boo11boo6bobo 5boo16boo27bo6boo102bo$587bobo62bobo7boo44boo7bobo$652bo54bobo8boo80bo 58boo$651boo35bo18bo91boo3boo3boo13boo3boo4bo22bobo$688b3o15boo91bobo 22bo5bo5boo22bo$484boo190b3o12bo113bo3bo25boo175bobo$483boo191bo13boo 114b3o16bo3bo182boo$485bo109boo72bo7bo128b3o17b3o184bo$594boo71b3o$ 596bo69bo$666boo5bo131bo45b3o$673b3o45bo82b3o46bo$492bo183bo7boo35b3o 79bo3bo21boo21bo11boo140bo$491boo151boo29boo7bobo5b3o29bo37boo41bo23bo 34bo139boo$491bobo109bo40bo18b3o10b3o5bo6bo3bo27boo37bo39bo5bo21b3o21b o7bobo140boo$602boo6boo23boo5bobo32bobo10bo5bo63bobo39bo5bo23bo19bobo 7boo$602bobo6bo22bobo5boo19bobo10bo3bo9bo5bo63boo41bo3bo42boo123bo$ 611bobo5bobo11bo28b5o9b5o123b3o43boo123b3o$612boo5bobbo10bobbo24boo3b oo7boo3boo8bo159boo126bo$622boo9bo27boo3boo8b5o9boo153boo5bobo122boo$ 499boo119bo3boo8bobo40b3o10boo34bo117bobo7bo142bobo$498boo122boo11boo 41bo10boobbo31b3o116bo152boo$500bo109boo7bobbo8bo31boo25bobo17bo13b5o 114boo153bo$609boo8bobo10boo28booboo24boo17b3o10boo3boo$611bo19boo30bo bbo46bo93boo$663bo15bo32boo93bo$666bo9boo10boo3boo113b3o169bo$507bo 156boo10b3o9boo3boo30b3o82bo168b3o9bo$506boo169boo299b5o6boo$506bobo 109bo58bo12b3o21b3o9bo250boo3boo6boo$617boo19bobo18boo3boo10bobo11b3o 20booboo7b3obo248b5o$617bobo19boo19b5o11boo13bo21booboo7bo4bo247bo3bo$ 639bo21b3o6bo42b5o12bo248bobo$662bo49boo3boo10bo250bo$672boo3booboboo$ 514boo172boo500boo$513boo162bo5bo5bo28bo259bo211boo$515bo109boo19bo39b 3o5boo21boboo28bo226booboo$624boo21boo29booboo3bo7boo21bo10b3o17bobo$ 626bo19boo32bo46bo3bo15bo3boo222bo5bo$659boo42bo13boobo5bo5bo14bo3boo$ 660bo42b3o9bobbo8bo3bo15bo3boo222booboboo$522bo134b3o46bo8bobo10b3o6b oo9bobo3boo$521boo134bo47boo21b3o5bobo10bo4bobo$521bobo109bo27bobo15b oo12b3o10b3o27bo19bo$632boo19bobo5boo7boobbo4boo26bobo16boo7boo19boo$ 632bobo19boo6bo3boobboo3bo17bobo10bo3bo16bo459boo3boo$654bo11boo7bo16b 5o9b5o5b3o5b3o$671b4o16boo3boo7boo3boo3bo3bo4bo250boo211bo3bo$691boo3b oo8b5o3bo5bo255bo212b3o$529boo176b3o5bo3bo253b3o213b3o$528boo178bo7b3o 254bo$530bo109boo19bo31boo21b3o$639boo21boo28booboo$641bo19boo30bobbo 22boo170bo$693bo15bo9bo171b3o$696bo9boo12b3o171bo293bo5bo$537bo156boo 10b3o13bo170boo292b3o5bo$536boo169boo478b3o3b3o$536bobo109bo58bo$647b oo19bobo18boo3boo10bobo476boo3boo$647bobo19boo19b5o5bo5boo477boo3boo$ 669bo21b3o7boo$692bo7boo187bo3boo3boo$707booboboo173b3o3bobobobo302bo$ 544boo340bo7b5o301bobo$543boo155bo6bo5bo172boo7b3o303boo$545bo109boo 19bo21boo24boo170bo288boo$654boo21boo20boo7booboo11boo460bo$656bo19boo 32bo472b3o$689boo42bo443boo4bo$690bo42b3o442bo30bo$552bo134b3o46bo144b ooboboo290bobo29bo$551boo134bo47boo144bo5bo291boo27b3o$551bobo109bo33b obo9boo12b3o10b3o143bo3bo6bobo$662boo36bo8boo26bobo143b3o7boo$662bobo 31bo4bobboo17bobo10bo3bo153bo$696boobobboboo16b5o9b5o429boo$700boo19b oo3boo7boo3boo424b4o4boo$721boo3boo8b5o156b3o266b3oboobboo41bo$559boo 176b3o156bo3bo260boo8bo43bobo$558boo178bo156bo5bo259boo53boo$560bo109b oo51boo171bo3bo283bo$669boo51booboo170b3o282b3o$671bo51bobbo170b3o281b o$723bo15bo421bo19boo$726bo9boo162boo258b3o61bo$567bo156boo10b3o161bo 258bo3bo61bo$566boo169boo145boo3boo10b3o254bob3obo58b3o$566bobo109bo 58bo146boo3boo12bo255b5o$677boo19bobo18boo3boo10bobo146b5o193boo21boo$ 677bobo19boo19b5o11boo148bobo195bo21boo70b3o$699bo21b3o6bo353bobo6bo4b o10boo66bo3bo$722bo163b3o196boo4bobo4bo10b3o88b3o$732boo3booboboo345b oo7bo10boo53b3o9bo5bo17bo31bo$574boo513boo11boobboo7boo49bo9boo3boo18b o28bobo$573boo162bo5bo345boo8boobbobboo7bobo47bo65boo$575bo109boo19bo 182boo200bobo5b4o14bo$684boo21boo29booboo74boo70bo203bo7bo15boo57boo$ 686bo19boo32bo77bo71b3o282bobo$719boo97bobo6bo64bo195boo85bo32boo$720b o98boo4bobo56bo204bo85boo31bobo28bo$582bo134b3o81bo22bobo55b3o204bobo 8boo6bobo68bo28bo31bo$581boo134bo83bobo19bobbo54bo208boo6bobbo7boo51b 3o11bobbo58b3o$581bobo109bo45boo43bo17bobo19bobo54boo214bo11bo51bo3bo 13bo$692boo33b4o8boo43boo16bobbo19bobo8boo259bo62bo5bo$692bobo31bo7boo 44boo3boo15bobo22bo8bobo258bo62booboboo$726bo3boobboo49b3o13bobo3boo 29bo259bobbo5boo65booboboo19boo$727bobboo53boo7bobo4bo5bobo28boo260boo 5bobo86boobboobboo$777boo5boo9boo12bo286bo12bo6bo57bo5bo15boobbobbobo 41bo$589boo185bobo5bo10bo13boo61bo221bobo12boo6boo72boo9b3o40bobo$588b oo186bo93b3o213boo7boo19boo57booboo11boo9boo42boo$590bo109boo19boo52b oo92bo8b3o187bo18boo76boo10bo36bo$699boo20bobo145boo6bo3bo184b3o17bo 22bo55bo46b3o$701bo21bo152bo5bo182bo41b3o56b3o42bo$723boo77bo74bo3bo 183boo39bo61bo22bo19boo10boo$803boo73b3o225boo82b3o9boo19bobo28bo$597b o204boo11boo61b3o181bo113boo11bo3bo7bobo19bo31bo$596boo190boo24bobo 245bo16bo96boo10bob3obo8bo49b3o$596bobo109bo80bo23b3o51bo195bo15boo 108b5o$707boo80bobo9bo10b3o51b3o209bobo$707bobo8bobo69boo8bobo10b3o49b 5o248bo80boo7b3o$716bo3bo78bo3boo9bobo5boo40boo3boo9b3o177boo3boo51boo 79bobo5bo3bo$704boo10bo82bo3boo10boo5bobo25bo24bo3booboo176bo5bo50bobo 79bo30b3o$704bobbo7bo4bo78bo3boo19bo25bobo20boo4booboo310b3o9bo5bo17bo 31bo$604boo102bo7bo83bobo21boo25bobo20boo3b5o177bo3bo28bo51bo49bo9boo 3boo18bo28bobo$596bo6boo103bo7bo3bo6boo72bo49bobbo11b3o9boo3boo177b3o 6boo19boo8b5o36bobb3o46bo65boo$594b3o8bo102bo9bobo6bobo121bobo12b3o 203boo19boo6bob3obo33b3o5bo$593bo103boo5bobbo21bo109boo9bobo3boo213bo 30bo3bo33bo7boo56boo$593boo101bobo5boo23boo107bobo9bo5bobo244b3o4boo 28boo63bobo$696bo141bo19bo245bo6boo92bo32boo$695boo140boo19boo200boo 48bo94boo31bobo28bo$612bo448bo39boo106bo28bo31bo$611boo270boo173b3o3bo 20bobo14bo29bo59b3o11bobbo58b3o$611bobo269bo174bo5boo19boo12b3o30bobo bb3o10b3o38bo3bo13bo$870bo13b3o176bobo20bo12bo32boo15bo3bo36bo5bo$869b 3o14bo216bo33bobo8bo5bo35booboboo$588booboboo273b5o230boo31b5o7boobob oo49booboboo19bo$867boo3boo228bobo30boo3boo84boobboob3o9b3o$588bo5bo 540boo3boo62bo5bo15boo4b4o3b3o3bo31bo$619boo458bo71bo69boo7boo9bo4bo 28bobo$589booboo24boo249bo186boo19boo36bo34bobo52booboo11boo17bo35boo$ 591bo28bo248bo172bo14boo19boo35b3o32bobo42boo10bo36bo$1040b3o13bo61bo 32boo42bo46b3o$872boo165bo55boo20boo34bo42b3o42bo$588boo282bo166boo55b oo37boo15b3o43bo22bo19boo10boo$589bo283b3o219bo40bo14bo3bo64b3o30bobo 28bo$586b3o38bo247bo244bo12b3o14bob3obo49boo11bo3bo29bo31bo$586bo39boo 421bo20bobo46bobo11bo12bo4b5o50boo10bob3obo54bo3b3o$626bobo420boo19boo 46bo3bo21boo73b5o53b3o$1048bobo20bo47b3o23boo129bo$1034boo3boo47bo28b oo3boo114b3o35boo$1034bobobobo47boo147bo3bo$1035b5o47bobo170b3o$1036b 3o125boo58b3o9bo5bo17bo31bo$634boo401bo26bo99boo60bo9boo3boo18bo28bobo $633boo418bo8boo73bobo85bo65boo$635bo417b3o7boo72boo16boo114boo3boo$ 1056bo81bo16bo9bo70boo33bobobobo$1055boo99b3o5b3o68bobo34b5o$1117boo 39bo4bo3bo67bo32boo3b3o$1034boo82bo46bo69boo31bobo3bo24bo$642bo392bo 79b3o13boo29bo5bo70bo28bo31bo$641boo389b3o22b3o55bo14bobo29bo5bo53b3o 11bobbo58b3o$641bobo388bo24b3o5bo64bo32bo3bo53bo3bo13bo$1043b3o10bo3bo bbobo63boo33b3o53bo5bo$1043bo20boo7bo146booboboo$1044bo10boo3boo11boo 12boo145booboboo$1072bobo12bo20boo$1078boo5bobo20bo125bo5bo30b3o33bo$ 649boo426bobo5boo11boo6bobo161booboo30bobo$648boo426b3o17bobbo6boo127b ooboo30booboo31boo$650bo400boo22b3o17bo129boo10bo32b5o$1051bobo22b3o 16bo6bo64boo56bo43boo3boo$1051bo16boo7bobo15bo7boo14bo47bo58b3o$1060b oo5bobo8boo9boo5bobbo6boo11b3o46b3o57bo5boo$1060bo6bo20bobo7boo6bobo 13bo47bo64bo78bo$657bo403b3obboo20bo17bo14boo109b3o80bo$656boo405bo23b oo143bo80b3o$656bobo$1058b3o63bo144boo$1058bo63booboo143bo$1059bo207b 3o26boo$1113b3o5bo5bo139bo28bo$1113bo173bo6bobo25bo$664boo448bo6boobob oo159bobo4boo24bobo$663boo623bobo30boo$665bo400boo89bo130bobbo$895bo 170bobo22bo65b3o128bobo$893b3o170bo22boo69bo24bo91boo8bobo$892bo197boo 29boo30bo5boo24b3o88bobo8bo$875boo15boo227bobo27b3o34bo87bo19boo31bo$ 672bo201boo245bo28bo11bo24boo86boo19bobo31bo$671boo203bo249boo22boo9bo bo132bo31b3o$671bobo188boo262bo33bo3bo$862bo5b3o202b3o51b3o31b3o$851b oo7bobo7bo202bo8bobo44bo29boo3boo195boo$851boo7boo7bo191boo11bo7boo 278bo$838bo4bo10boo27bo178bo20bo278bobo9boo$751bo84bobo4bo10b3o25boo3b oo3boo168bobo7bo41boo29boo3boo151b3o31bo25boo8bo3bo$679boo70b3o80boo7b o10boo26bobo178boo7bobo40boo28bo5bo151bo31bobo34bo5bo$678boo74bo79boo 11boobboo35bo3bo182boo37bo49bo23b5o111bo31boo34bo3bobbo$680bo72boo79b oo8boobbobboo8boo26b3o183boo69bo3bo13bo22bob3obo178bo$830boo4bobo5b4o 12bobo26b3o183boo70b3o10b3obo23bo3bo180bo3bo3bo$798bo30bobo6bo7bo15bo 209bobo5boo107b3o176bo5boo3boobo$796b3o30bo242bo7bobo76bo30bo175bobo 13bo12bo$795bo32boo58bo193bo24bo51boobo181bo22boo13boo11b3o$687bo107b oo64bo25b3o192boo23boo52boo166boo14bo52bo$686boo67b3o5bo73boo14bobo4bo bo23bo3bo215bobo163bobo54boo12b3o12boo37boo$686bobo65bo3bo4b3o72bo15b oobboo3bo24bo155bobo18bo126bo79boo85boo$753bo5bo6bo71bobo7boo4bo3boo3b o21bo5bo142boo6b3ob3o14bobo85bo9boo3boo24bo80bo84bo$753booboboo5boo49b oo21boo6b3o8boo3bo21bo5bo142bo6bo7bo11boo18boo66bobo9boo3boo17bo5bobo 181bo$817bo26boboo12bobo8boo13bo3bo109boo21bobo6bobo6boo5boo5boo4boo 17bo3bo65boobbo7b5o18bobobbooboo63boo116bo$800bo16bobo6bobo15bobbo7boo 4bo9bobo13b3o111bo19bo3bo6boo21boo4boo16bo5bo67bo9bobo19boobbo5bo63bo 69b3o26bo15b3o$645bo16bobo91bo43b3o15boo6bobbo14boboo5bo19bo127bobo9bo 7bo16b3o22bobo4bo8bo3bobbo12boo45bo6b3o36bo66bobo67b3o20bo3b4o37boo3b oo$644bobo13b3ob3o27boo59bobo32boo3boo6bo25boo16b3o4bobo16boo127boo8b 4o4bo4bo12b3o24bo3bo9bo20boo43b3o15b3o23boo3boo64boo4bo61bo3bo17bobobb oboboo36boo3boo$627boo14bo3boo10bo7bo25boo60bobo9b3o32boo23bo3boo15boo 5bo155boobobo4bo15bo3bo8b3o16b3obbo5bo3bo3bo10bo44b5o115boo76boo7boobo bbob3o$627bobo13bo3boo3boo5boo5boo27bo59boo9bo3bo20bo3bo23bobo7boo179b 3obobbo3bo3bo10bo5bo38boo3boobo41boo10boo3boo8bo106boo60boo3boo6bo3bo 10boboboo38b3o$628b3o12bo3boo3boo100bo37b3o26bo4bobbo5boo174boobobo6bo bo11bo3bo8bobo36bo41boo11b5o10bo18bo160bo5bo10b4o8boo29b3o$34boo6bo 586b3o12bobo23bo82b3o9bo5bo20b3o25boo4bobo6bobo24boo148b4o22b3o8b5o35b oo53bo3bo8b3o17bo101bo58bobbo3bo12bo9bobo12bo16bo$34bo5b3o585b3o7bo6bo 11bo12bo81bo3bo8boo3boo65bo23boo27boo121bo34boo3boo68bo21bobo18boo9b3o 99b3o63bo24bo10bobo$24bo7bobo4bo580boo5bobo9boo14booboo91bob3obo79boo 8bo15bo26bo133bo23boo3boo37bo28b3o22bo19bo22boo76b3o12bo43boo8bo3bo3bo 25boo10boo$22bobo7boo5boo578bobo5boo9boo62bo49b5o4bo85bobo41b3o128bobo 37bo29boo26bo11bo34b3o20bo76bo13boo43bobo6boboo3boo5bobo$12boo6boo597b o34bo5bo5boo3boo28boo59boo4bo78boo31bo12bo129boo37bobo26bobo26boo9bobo 35bo17b3o78bo57bo8bo13boo5b3o20boo$11bo3bo4boo596boo47b5o29bobo57boo4b obo58bo51b3o168bo10boo7boo6boo49bo3bo11boo39bo146boo14bo5bo22bo$10bo5b o3boo632booboboo7b3o76boo18bobo21bo5bo5b5o3boo16bo53bo166bobo11bo5bobb o4bobbo49b3o12boo7boo93bo106bo9bo9bobo18bo$10bo3boboo4bobo644bo77bo20b o21b3o5bo3bob3obo3boo13b3o40bo11boo168boo10boo3b6obb6o46boo3boo15boo4b 4o9bo78b4o73bo39bobo8boo11bo5boo$10bo5bo7bo688boo24bo5bobo42b3o3b3o4bo 3bo3bo57boo174boo5boo10boo4bobbo4bobbo69boobboob3o9bobo75boobobo100bob o8boboo22bo5boo$bboo7bo3bo21bo607bobo66bo24bobo3boo57b3o33bo28bobo159b o12bobo4b3o17boo6boo74bo14boo75b3obobbo20boo77bobbo6booboo20b3o$bobo8b oo22b3o607boo52boo12bobo5bo17bobo45boo3boo10bo33bo192bo10bo71boo3boo 126boobobo21bobo5b3o57bo13boo6boboo32b3o$bo21bo11b5o587bobboboobobbo7b o8boo42bobo7boo4boo5boo16bobbo44boo3boo44b3o188b3o10bobbo4bo63bo5bo 117boo8b4o3boo17bo6bo3bo54boo12bo3boo5bobo31bo3bo$oo22boo8boo3boo586b 4oboob4o60bo8boo13boo15bobo8boo12bo277bo90bo103bobo9bo5bobo22bo5bo39b 3o12boo13boo8bo31bo5bo$11bo11boo602bobboboobobbo23boo34boo10bo12b3o13b obo10bo11b3o39boo4boo230bobo69bo3bo13bo103bo19bo22bo5bo38bo3bo16boo5bo bbo41bo5bo$11b3o648boo54boo3boo7bobo4bo9b3o12b3o31bobo5bobo4bo70b3o 158boo70b3o10b3obo102boo19boo65bo5bo14bobo5bobo45bo$14bo650boo55boo9b oo14bo48boo6bo6bobo5bo55boo4bo3bo135boo256bo43bo5bo14bo53bo3bo$13boo 21b3o626b3o54bo10bo28boo3boo30bo14boo3bobo54boo4bo5bo134bo105bo151boo 18boo25bo16boo54bo$36b3o612boo12boo95boo3boo19boo28bobo57bo3bo5bo123bo 8bobo6bo8bo37bo51boobo148boo19boo22bo3bo71bobbo$16bo634boo9boo53bo71bo 27bobbo64bo126b4o5boo7b3o4bobo37boo52boo147boobbo16bo27bo4bobo68bo$15b obo9bobobbo6bo622boo52boo68b3o29bobo20boo40bo3bo125b4o16bo4boo36bobo 202bobo41bobbo5boo68bo$14bo3bo13bo5bobo675bobo67bo32bobo19bobo40b3o 126bobbo15boo248boo41bo9bo69b3o$15b3o13boo4bo3bo698bo51bo8b3o9b3o5bo 21bo41bo127b4o104bo9boo3boo188bo80bo$13boo3boo8bobobo5b3o700boo47boo8b o3bo8bo29boo159boo6b4o18b3o82bobo9boo3boo17bo167b3o$31bo4boo3boo697boo 20boo27boo6bo5bo8bo20b3o49boo114bobo6bo21b3o83boo10b5o18bobo121boo3boo 8bo28bo$31bobo729bo36bo3bo30bo44b3o4bo115bo29bo3bo8bo86bobo19boo122boo 3boo8boo$31boo727b3o38b3o32bo45bo5b3o111boo28bo5bo8bo21boo45bo176bobo 32bo$724boo34bo40b3o77bo8bo142bo3bo7b3o22boo43b3o15b3o145b3o42boo$19b oo702boo309b3o32bo44b5o162b3o43boo$20boo703bo73boo20boo4boo22bobo165bo 81boo10boo3boo162bo$19bo727bobo50bo20bobo4bo14b3o5bo3bo163b3o79boo11b 5o29bo$748boo9bo23boo12b3o21bo6bobo7boobbobbobo7bo166bo91bo3bo28bo$ 748bo8b3o24bo12bo10b8o13boo5bobbobboo7bo4bo16boo146boo70bo21bobo18boo 9b3o$41boo713bo24b3o24bob4obo19bo19bo16bobo179bo7bo28b3o22bo19bo142boo $41bo690bo23boo23bo26b8o19bo10b3obbo3bo3boo13bo177bobo7boo26bo11bo34b 3o140bo38bobo$29bobo10b3o686boo102bo15bobo5bobo191boo6bobo11boo13boo9b obo35bo137b3o39boo$32bo11bo686bobo102bobbo21bo213bo24bo3bo11boo159bo 42bo$18bo13bo795b3o7boo21boo86bo115bobo5bobo25b3o12boo7boo$17b3o9bobbo 715bo79bo120boo70boo3boo36bobbo5boo24boo3boo15boobboobboo9bo$16b5o9b3o 714bo5b3o73bo114boo4boo13boo54boo3boo9b3o23boo56bobobbobboo9bobo$15boo 3boo648bo76b3obbooboo61boo21bo23b3o72boobboo4b3o11b3o70b3o21boo3bo55b 3o15boo$668bobo81booboo62bo21boo24bo72boobboo4boo9boboo58b3o3b3o4bo3bo 22boo20boo3boo31boo188bo$669boo13bo39boo13boo11b5o62bobo8bo5boo4boo22b o82boo10bobbo58b3o5bo3bo5bo14boo6bobbo17bo5bo219boo$19bo662b3o40bo12b oo11boo3boo62boo8bobo3boo4b3o104bo11boboo59bo5bo5bo3bo14bobo7bobo36bo 207boo$19bo661bo43bobo5bo6bo90bobobboo4boo109bo10b3o5boo24boo37b3o15bo 30bo3bo13bo$681boo43boo5boo55bo40bobbo6boo7boo86boo15bo9boo5bobo24bo 54boo31b3o10b3obo$15boo717boo51b4o10boo28bobo7bo8bobo85boo11bobbo19bo 21b3o$16bo467bobo21boo224b3o49b4o11boo27bobo19bo5boo90bo23boo20bo102bo 171boo$13b3o468bo3bo19bo220boo3boo50bobbo40bo21boo3bobo90bo148boobo 169boo$13bo474bo7bo9bobo224boo8boo41b4o69bo77b3o11bo73b3o73boo168bo32b obo$31bobo450bo4bo4b4o8boo225bo9bobo5boo34b4o125bo20boo86b3o276boo$30b o457bo4boboboo246bo6bo37bo23bobboo4boobbo88b3o21boo4bo77bo3bo276bo$30b o445boo6bo3bo3bobbob3o245boobb3o61bo3b3obb3o3bo90bo19b3o3bo89boo9boo 43bo9boo3boo$30bobbo441bobo6bobo6boboboo250bo55b3o6bobboo4boobbo90boo 18bobo4b3o10bobbo8bo52boo3boo6bo9boo41bobo9boo3boo$30b3o442bo18b4o307b o132boo18bo10bobo61b3o54boobbo7b5o157bo$474boo20bo309bo43b3o101bobbo3b oo5bo3boo3boo54bo59bo9bobo158boo$485bo21bo275b3o66bo77bo20b4o3boobobo 4bo3boo3boo107bo6b3o167bobo32bo$485bobo17b3o274bo3bo64bo78b3o17b4o14bo 3boo111b3o15b3o190boo$55bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobb o26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo6boo17bo374b oo52bo16bobbo8boo5bobo112b5o208boo$39b4o11bo14b4o11bo14b4o11bo14b4o11b o14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o 11bo14b4o11bo14b4o11bo14b4o11bo30bo275bo5bo46boo43bo41bo10boo16b4o16bo 112boo3boo8bo$39bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo23bobbo275boo3boo6b5o14boo19bo35boo5bobo40b3o21boo5b4o 129b5o10bo18bo$39bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o 11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b 4o11bo14b4o12bo10bo291bob3obo13bobo9boo5bobo34bobo5boo40b5o19bobo8bo 73boo54bo3bo8b3o17bo$40bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo 26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo25boo9bo3bo 289bo3bo14bo10b3o5boo9boo10bo12b3o47boo3boo18bo84bo14booboboo35bobo18b oo9b3o$489bobo10bo292b3o11bo11boboo17bobo10b4o8b3o72boo85b3o54bo19bo$ 499bo5bo290bo12boo10bobbo19bo11b4o8b3o160bo11bo5bo57b3o179bobo$484bo 14bo5bo154boo138boobboo4boo9boboo31bobbo9bobo237bo179boo$105boo377boo 14bo3bo156boo123boo5boo5boobboo4b3o11b3o29b4o10boo48b3o121booboo37boo 202bo$105boo376bobo15b3o156bo125bo7bo9boo4boo13boo20boo6b4o8bo52b3o56b o66bo39boo8bo$97boo688b3ob3o15boo35bobo6bo12bo110boo110b3oboobboo9bo$ 98bo398boo148boo140bobo17bo36bo19b3o50bo54boo4boo13boo94b4o4boo9bobo$ 98bobo6bobo360boo24boo147bobbo186b3o7boo71bobo49boobboo4b3o11b3o98boo 13boo$99boo4bo3bo359b3o3boobo19bo137boo6bo7b3o3bo178bo79bo3bo48boobboo 4boo9boboo48boo238bo$95boo8bo360boboo5bo3bobbo153boo6bo6bo3b5o176bo81b 3o58boo10bobbo49bo236boo$95bo8bo4bo356bobbo4bo4bobboo160bo7bo3booboo9b oo244boo3boo4bo51bo11boboo46b3o238boo$57bo3boo24boo3boobo9bo360boboo4b 4o5boo160bobbo3bo3boob3o8boo253bobo55bo10b3o5boo37bo24bo37boo$55b3o4bo 23bo3bo3bo10bo3bo7boo342boo6b3o3bo7b3o161boo5b4oboo214bo50boo40boo13bo bo9boo5bobo61b3o34bobo$54bo7bobo5boo13bo21bobo7bobo340bobo7boo11boo 171b4o213bobo92boo13boo19bo64bo33bo$54boo7boo5boo13bo3bobbo26bo340bo 21boo7boo7bo157bo169boo44boo92boo34boo62boo32boo123boo12boo$73boo10bo 5bo4b3o6bo13boo338boo21bo8bobo5b3o325bobo122boo14bo128bo129boo13boo$ 73b3o10bo3bo7bo7boo385bo5b3o327bo122bobo12bobo127b3o141bo32bobo$60bo 12boo12boo8bo7boo386boo439bo17bo14boboo129bo173boo$60b3o7boo9bobo413b oo3boo431bo163bo127b3o45bo$63bo6boo10boo413boo3boo378bo33boo15b3o163bo bbo125boo$62boo18bo800bo33bo50boo18bobbo8bo67booboboo28bo121boo$881b3o 30b3o51boo18bo10bobo28bobo35bo5bo25bo3bo120b3o6bo$89boo5bo723b3o91bo 69bobbo3boo5bo3boo3boo21bobbo35bo3bo28bo123bobo5boo76boo$70boo16bobo5b 4o722bo136b3o19b4o3boobobo4bo3boo3boo6bo6bo10boo35b3o26bo5bo121boo4bob o32bo43bo$71bo18bo6b4o720bo137bo20b4o14bo3boo10bobo5bo8bo3boo62bo5bo 160boo33boo7bobo$71bobo5bobo15bobbo24bo371boo443bo17bo19bobbo8boo5bobo 11boboo6bo9boo65bo3bo162boo32bobbo5boo$62boo3boo3boo5bobbo14b4o22b3o 372bo441bobo25bo11b4o16bo11booboo9boobbobbo5boo60b3o14bo168bobo15bo$ 62boo3boo13boo12b4o4boo16bo372b3o392bo50boo25bobo3boo5b4o28boboo5b3obb obbobo6bobo74b3o166bo3bobb3o10bo$80bo3boo10bo7bobo15boo371bo392bobo77b oo3bobo8bo24boo3bobo7b4o13bo73bo169bo19bo$64b3o15boo22bo706boo74boo82b o34bobo4bo9boo14boobbo69boo167bo4bo7boobbobbo$64b3o12bobbo8boo13boo 704bobo152boo3boo34bo36b3o25boo194b3o13bo7bobobbobboo$65bo13bobo8boo 23bo698bo152bobo37boo39bo24bo185bobo8bo9boo3bo3bo5b3o$84bo7bo21bo834bo 17bo79boo25b3o182boo9bo8bobo5bobo$83bo30b3o833bo82bo42bo183bo8b3o7bo$ 83b3o33b3o775bo50b3o58bo24boo242boo$118bo3bo775bo110boo22boo75boo3boo 152b3o32bo$896b3o105boo4boo13boo72bo13bo155b3o33bo$67bo31bo17bo5bo681b 3o192boobboo4b3o11b3o71b3o5boobbo5bo186b3o$68boo28boo17boo3boo683bo 192boobboo4boo9boboo72bo3bo4bobobbooboo137bo15b3o$67boo29bobo705bo202b oo10bobbo71bob3obo3bo5bobo136boo17bo$76bo880bo51bo11boboo22boo3boo43b 5o11bo138boo16bo$62b3o11bobo876bobo55bo10b3o5boo6bobo70bo155b3o$61bo3b o10boo20bo806bo50boo40boo15bo9boo5bobo6boo5bo3bo$60bo5bo31bobo802bobo 91bobo11bobbo19bo6bo7b3o224boo6boo26bo$60bo5bo32bobo15boo114boo563boo 104boo90b3o11bo23boo13b3o145boo12boo61bo4bobbo4bo22bobo$63bo10bobo22bo bbo15bo115bo562bobo182boo12boo12bo100bo85boo13boo60bo4bobbo4bo23boo$ 61bo3bo9boo22bobo13b3o116bobo4bo25boo530bo182bobo14boo10bo98b3o98bo32b obo27bo4bobbo4bo$64bo4boo4bo11boo9bobo4boo8bo119boo3bobo24bo696bo17bo 15b3o108bo3bo130boo13bo16boo6boo$60bobbo4bobo15bobo9bo6bobo130boo3bo 14boo5bobo697bo40bo30boo69bob3obo81boboo45bo13b3o$60bo9bo15bo20bo130b oo3bo13bobo5boo645bo50b3o39bo31bo63boo6b5o82bobo63bo$61bo23boo20boo 129boo3bo12b3o654bo5boo77boo5b3o10bobbo8bo4bobo63bo95bo63boo56bo$58b3o 179bobo12b3o653b3o6bo77boo18bo10bobo3boo65b3o92boo5bo115bo$58bo182bo6b o7b3o531b3o127bobo8bo21boo59bobbo3boo5bo3boo70bo92boo5boo112b3o$246boo 9bobo532bo128boo7boo21bo35b3o19b4o3boobobo4bo3boo163boo4bobo32bo$247b oo9boo531bo137boo11boo7bobo35bo20b4o14bo3boo202boo$61b3o104boo758b3o7b o3b3o6boo19bo17bo19bobbo8boo5bobo205boo24b3o$63bo42bo61boo759boo5b4o4b oobo22bobo37b4o16bo13boo3boo$62bo42bobo80bo731bo9boobbo4bo4bobbo23boo 31boo5b4o82bo165bobo$36bo149b3o729bobo10bobbo3bo5boobo55bobo8bo30bo3bo 47b3o8boo152b5o60bo$36b3o129b3o14bo597boo134boo14boboo3b3o58bo42b3o51b o8bo34bo116boo3boo57bobo$39bo49bobo13b3o60b3o14boo52bobo540bobo157boo 53boo3boo42b3o50boo5b3o33b3o94b3o19boo3boo58boo$38boo50boo13b3o131boo 543bo143bo68bobo106bo34bo87bobo8bo$54boo34bo15bo133bo687bo50bo17bo143b oo86boo9bo$53bobo100b3o770bo50bo63boo93b3o88bo8b3o$55bo110boo3boo755b oo48b3o64bo92bobo$106bo48bo3bo7b5o754b4o112b3o92bo3bo97b3o92bo$105b3o 47bo3bo8b3o9boo3boo739bo115bo56boo3boo31b5o97b3o19boo72bo$38boo3boo22b oo36b3o61bo10bo5bo46bo541b3o321boo3boo30boo3boo119bo70b3o$38boo3boo22b obo86b3o30boo40boo544bo93bo132b3o93b5o13bo18b5o81bo15b3o17b3o$62boo6bo 14bo95bo3bo4bo41boo542bo92b3o132bo96bobo12b3o19b3o80boo17bo18bo$40b3o 3b3o9boobobbobbobbo14b3o17bobo74b3o5bobo8boo20boo636boo5bo118bo17bo 109bo23bo82boo16bo57bobbo4bobbo$40b3o5bo9boobboo6bo17bo17bo49b3o32boo 7bo22bo637bo6boo63boo50bobo113b3o11boo122b3o54b3obb6obb3o$41bo5bo19bob o8b3o6boo110bo12boo7bobo12boo615boo3boobo71bobo50boo44bo265bobbo4bobbo 6bo$67boo86bo3bo39bo7bo4boo7boo14bo614bo3bo3bo74bo94b3o213boo6boo58b3o 25bo$78bobo28bo45bo3bo8bo30bo8boo5boo17b3o531boo66boo13bo83boo92bo137b oo12boo61bo4bobbo4bo55bo26bobo27boo$77b5o8bo16bobo56boo32bo4boobbo5b3o 6bobo7bo515bo5boo9bobo66boo13bo3bobbo153boo15boo136bobo12boo60bo4bobbo 4bo55boo26boo28bo$76boo3boo5booboo15boo46b3o8boo32boob5o6boo7boo522bo 3bo3b3o10bo69boo10bo5bo154bobo30bo53bo68b3o10bo32bobo27bo4bobbo4bo15bo bbo4bobbo86bobo5bo$58boo16boo3boo103bo20bo4boo11bo526bo5boobo11bo65b3o 10bo3bo137bo17bo32b3o50bobo68boo43boo13bo16boo6boo15b3obb6obb3o85boo3b 4o$42b3o14bo27bo5bo90bobo25boo533bo5bo4bobbo10boo65boo12boo11bo128bo 52bo49bobo3b3o29boo28boo47bo13b3o41bobbo4bobbo91boboboo$42b3o14bobo6bo 37bo78boo560boo9boobo9boo4boo50boo5boo9bobo15b3o125b3o51boo50bo4bo7b3o 22bo28b3o63bo142bobbob3o$41bo3bo14boo4bobo18booboboo11bobo48bobo40bo 207bo133bo133bo80b3o11b3o4boobboo45bobo5boo10boo14b5o236bo5bo3bo18b3o 94boo116bo26boboboo$64boo50bo39boboo8boo3boo6bo16bo208b3o131b3o131b3o 78boo13boo4boobboo45bo19bo14boo3boo240bo5bo17bo39bo133boo3boo35bo26b4o 8boo$40boo3boo17boo51bo39bo3bo8b3o7b3o15b3o17bo191bo133bo133bo93boo53b oo35b5o155booboboo19bo19boo24boo3boo8bo3bo51boo5boo132bo5bo33b3o20bo7b o9bobo$64boo27boo10b3o7b3o41boo8bo3bo5b5o32boo191boo132boo132boo94bo 64bo25bo3bo150b3o27b3o19bo24bobobobo9b3o52boo4bobo32bo162boo18bo12bo$ 66bobo23bobo10b3o52bo9bobo5boo3boo8bo23boo619b3o24bobo151bo4bo5bo17bo 3bo18bobo9bo13b5o9bobbo91boo101bo3bo56bobo18boo11b3o$68bo24bo12bo64bo 7b5o10bo646bo24bo135bo17bo26bob3obo18boo8b4o12b3o10b3o93boo24b3o74b3o 67bo26bo$61boo17bo11boo85bo3bo8b3o645boo13bo144bobo22booboo18b5o28boob obo12bo10boboo74bo192bo24boo$61boo17bo11b3o85bobo24boo647boo143boo24bo 52b3obobbo22bobo76bo43bobo143b3o$80bo12boo11bo72b3o23booboo645boo11bo 212boobobo24bo75b3o42b5o120bo$91bo13b3o16bo45boo6boo25b4o657booboo211b 4o3boo140boo3boo117bobo$40boo19bo43b3o14bobo45boo7bo17bo8boo561boo90bo 163bo57bo5bobo117b3o19boo3boo118boo5boo$41bo18bobo60boo31bo5bobo11b3o 6boo10boo570bobo88bo4bo5bo152bobo64bo9boo5boo3boo84bobo8bo102boo49boo 6bo35b3o$38b3o18bo3bo8b3o80bobbo3bobbo10bo8boo9bobo572bo71bo7boo7b3o 146bo13bo3bo63boo8bo6bobobobo84boo9bo102bo29boo18bo7bobo33bo3bo$38bo 20b5o10bo17bo12bobo50bo6boo21boo12boo16bo550boo69b3o7boo11booboboo138b o12b5o74b3o4b5o86bo8b3o102b3o27bo25bo3boo12bo$58boo3boo8bo17b3o12bo47b oo3bo3bo3boo19b3o10bo3bo14b3o618b5o5bo156b3o11boo3boo47bo27bo5b3o177b oo6boo16bo27bobo9bo13bo3boo10bobo17bo5bo$59b5o26b5o70boo21boo10bo5bo 16bo616boo3boo176b5o19boo25b3o34bo97b3o77bobbo4bobbo44boo8b4o11bo3boo 11boo17boo3boo$60b3o26boo3boo35bo30bobbo5boo5boo5boo13bo3bobbo14boo 312b3o485b3o21bo24bo85bo49b3o19boo56bobbo4bobbo27bo25boobobo11bobo3boo $61bo28b5o37bo29bobo6bobo3bobo5boo13bo89boo110b3o265b3o352bo19b3o25boo 84boo14boo55bo56bobbo4bobbo25b3o24b3obobboboo8bo4bobo$90bo3bo35b3o40bo 3bo23bo3bo3bo49bo30bo110bo3bo129bo3bo131bo173boo198bo112bobo14b3o15bo 15b3o17b3o58boo6boo25bo28boobobobbobo14bo29bo$65boo24bobo56boo3boo16b ooboo24boo3boobo48boo19bobo5bobo110bo3bo129bo3bo131bo175bo10bobo308boo bbobbobo12boo17bo18bo74b3o18boo28b4o3bo16boo27boboo$64bobo8bo16bo57bob obobo53bo47bobo11b3o5bo3bo3boo112b3o265b3o171bo12bo7boo150bo95boo54boo bboobboo12b3o16bo57bobbo4bobbo43b3o30bo38bo12bo$66bo7b3o49boo23b5o54b oo55boobbobbobo7bo251b3o305bobbo9bo8bo148bobo95bo59boo8boo4b3o17b3o54b 3obb6obb3o21bo3bo15boo63boo6bo11bo3bo$126bo25b3o110bobbobboo7bo4bo384b 3o170booboo9bobbobb3o150boo53bo42b3o65bobo3bobo77bobbo4bobbo6bo16bo3bo 14bobo63bo5b3o12bobbo$92boo20bo9bobo26bo12bo97bo19bo385b3o171boo11b3o 3bo206b3o43bo43bo20b3o4bo27boo6boo58b3o69bo13boo8bo5bobo20b5o$74b3o15b oo19bobo8boo13bo25b4o95bo10b3obbo3bo251b3o488boo41b3o78boo7b3o18boo4b oo25bo4bobbo4bo55bo20b3o47boo14bobbo6bobo3boo21b5o$103boo7boboo21bo26b oobobo3boo89bo15bobo119b3o265b3o354bo124boo9bo5boo10boo31bo4bobbo4bo 55boo70boo8boobbo3bo7bobo24boo3boo$74bobo25bobo6booboo22bobbo21b3obobb obboo76boo5boo5bobbo132bo3bo129bo3bo131bo170boo3boo179b3o37boo3boo76bo 10boo5bobo10bobo29bo4bobbo4bo15bobbo4bobbo109b3obboobbo7bobbo24b5o$74b obo24bo6b3oboboo25bo22boobobo82boo3bobo7boo132bo3bo129bo3bo131bo170boo 3boo175bo5bo37boo3boo94bo13bo15bo16boo6boo15b3obb6obb3o47b3o54boboo16b obo26b3o$62b3o36bobbobbobbobbobo24bo24b4o82bo5bo144b3o265b3o170b5o177b o173b3o41bobbo4bobbo60boo44bobbo8b3o4bobo28bo$61bo3bo8b3o24bo6boo4bo 26b3o22bo89boo278b3o305bobo176b3o139bo36bo100bo3bo8boo43boboo15bo12boo $94boo6bobo38bo1020b3o13boo3boo14boo100bo3bo7bo40boo6b3o26bo$60bo5bo 26bobo7boo739b3o297bo18bo3bo7boo3boo3boo91boo3boo62bobo5bobo7boo15boo 7bobo$60boo3boo7b3o16bo1050boo16bob3obo6boo101bo5bo19b3o40boo6bo26b3o 6boo$75bo16boo150bo823boo73bobo17b5o14b3o163bo5boo12bo15boobo$244boo 610bobo210bo112b3o94bo3bo82bobo4b3o8bobbo$63bo35bo143bobo596boo15bo 172bo33b3o114bo19b3o74b3o82bobo16boobo25boo$62bobo32bobo743bo15bo170bo bo33bo283b3o11bobbo7bobboobb3o28bo$62bobo24boo4boo601boo140b3o13bobbo 171boo170bobo144b3o12bobo7bo3bobboo30b3o$62bo26boo4boo11boo588bobo139b o16b3o308b3o31b5o134bo9bo9boo3bobo6bobbo37bo$62bo32boo11boo590bo435boo 32bo30boo3boo131boo10bo8bobo5bo8boo$62bobbo31bobo600boo435boo30bo31boo 3boo132boo9bo8bo$63boo34bo23boo100boo9boo12boo114boo131bobo130bobo501b o43b3o13bo86boo65bobo6boo$114b3o6bo101bobo9boo11bo115boo4b3o123bobbo4b o123bo3bo404bo140b3o11b3o86bo$114bo9b3o99b3o7bo6bo4bobo101bo10boo6b5o 112bo8boo5boo116bo7bo409bo138bo3bo9bo90b3o13boo84bo$115bo10bo100b3o12b obo3boo102bobo7b3o5bo3bobo110bobo5boo3bo8boo110b4o4bo4bo8boo393b3o152b oo65boo6boo16bo14boo47bobo31bobo$226b3o12bo3boo108boo6boo6bo3boo110boo bo6boo10boo109boobobo4bo12boo533boo3boo74bobbo4bobbo29bo50bo33boo$218b oo5bobo13bo3boo94boo12boo9boo107boo10booboo6bobbo107boo8b3obobbo3bo3bo 494bo71boo56bobbo4bobbo61bobo16bo$130bobo84bobo5boo14bo3boo94boo12boo 9boo107boo10boobo8bobo107boo9boobobo6bobo494boo35b3o33bo56bobbo4bobbo 61boo17bo$122b3o5bo3bo82bo24bobo107bobo132bobo131b4o503bobo34bo3bo29b 3o58boo6boo63bo16b3o$103boo3boo7boobbobbobo7bo5boo74boo25bo108bo11bo 123bo9bo123bo235bobo303bo5bo28bo74b3o73b3o$105b3o7bobbobboo7bo4bo4boo 220bobo134bo133bo223bo189bo116booboboo67bobbo4bobbo43bo99bo$104bo3bo5b o19bo228boo132b3o131bobo223bo187bobo188b3obb6obb3o21bo3bo15boo61bobbob oobobbo26bo$105bobo6bo10b3obbo3bo497boo223bobbo185boo190bobbo4bobbo6bo 16bo3bo14bobo61b4oboob4o24b3o$106bo7bo15bobo724b3o318boo9b5o60b3o69bo 29bobboboobobbo$115bobbo1002boo56bo8bob3obo58bo20b3o47boo14bo$117boo 1003boo52b3o10bo3bo59boo70boo13b3o$371bo749bo47boo5bo13b3o20bobbo4bobb o118bo$105boo265bo133bo133bo413bo114bo21bo19b3obb6obb3o47b3o65boo$105b oo263b3o131bobo134bo413bo114b3o40bobbo4bobbo60boo114bo$97boo282boo122b oo8boo122b3o7boo402b3o116bo100bo3bo8boo111bobo$98bo282bobo131bobo131bo bo621bo3bo7bo114boo$98bobo7bobo272bo133bo133bo462bo74bo58boo3boo62bobo $99boo6bobbo272boo132boo132boo461boo73bo58bo5bo19b3o40boo25b3o$95boo9b oo1005bobo72bobo5bo121bo24booboo$95bo8boo3bo237boo30bo101boo30bo101boo 239bobo328booboobbobo52bo3bo89booboo$61boo25bo4bobo10boo240bo28bobo 102bo31bo101bo31bo210bo202bo123bo5bobboo53b3o90b5o60bo$62bo24bobo3boo 12bobbo6boo229bobo6bo20boo102boboo5boo19b3o101bobo6boo19bobo210bo200bo bo126bo130b3o19boo3boo60bo$62bobo5boo14bo3boo16bobo6bobo220bo8boo6boo 115bo8bo7bobo114bo8boo6boo20boo207bobbo201boo123boo3boo127b3o84b3o$63b oo5bobo13bo3boo27bo218b3o11boo4boo112b3o12bo4b3o111b3o19boo227b3o451bo 9bo$71b3o12bo3boo4boo6bobo12boo216bo14boo4b3o110bo13bobbo4b3o109bo15bo 6b3o475boo201boo10bo$72b3o12bobo5bobo7boo230boo13boo4boo111boo13boo4b 3o19bo90boo14bo6boo462bo14boo94bo106boo9bo$60bo10b3o7bo6bo8bo7bo251boo 8boo114bo7bobo7boo11boo109boo8boo453b3o13bo97bo48boo65bobo$60b3o7bobo 9boo273bo9bobo113boo6boo8bobo9bobo109boo8bobo431bo19bo112b3o48bo$63bo 6boo9boo286bo16boo94bobo18bo16boo115bo16boo414bo18boo95boo66b3o13boo 70boo72bo$62boo305boo15bo116boo15bo116boo15bo413b3o116bo42boo6boo16bo 14boo47bobo20bo70bobo$387b3o131b3o131b3o526b3o42bobbo4bobbo29bo50bo18b 3o72boo$89bo5boo15bo276bo102bo30bo133bo441bo84bo44bobbo4bobbo61bobo16b o18bo$70boo16bobo4b3o15boo217booboboo154bo147bo457boo128bobbo4bobbo61b oo17bo57bobboboobobbo$71bo19bo5boobo11boo377b3o12boo94b3o5bo30boo455bo bo110bo18boo6boo63bo16b3o55boobbo4bobboo$71bobo5boo7boo7bobbo24bo206bo 5bo127boo3boobboo30boo92bo3bo4boo28bobo215bobo223boo3boo118bobo32b3o 73b3o56bobboboobobbo6bo$62boo3boo3boo5boo16boobo22b3o342b3o5boo28bo93b o5bobbobo245bo219bo6bo5bo119boo51bo131b3o25bo$62bobobobo13boo11b3o6boo 16bo210booboo46boo81bo3bo3bo42boo81bo3bo46boo203bo217bobo25bo139bo3bo 15boo61bobboboobobbo56bo29bo26boo$63b5o14b3o10boo7bobo15boo211bo48bo 83bobo47bo83b3o47bo204bobbo215boo7bo3bo11b3o139bo3bo14bobo61b4oboob4o 56boo26b3o27bo$64b3o15boo22bo265bo9bobo84bo36bo9bobo83b3o36bo8bobo204b 3o226b3o11bo195bo29bobboboobobbo16bobboboobobbo86bobo6bo$65bo13boo11bo 13boo240boo21bobo8boo98boo16bo3b4o8boo98boo23boo7boo439boo7boo142b3o 47boo14bo42boobbo4bobboo86boo6boo$79boo10boo22bo233bo20boboo109bo14bob obboboboo108bo18boo4boo448boo124bo76boo13b3o41bobboboobobbo90boo4boo$ 84bo6bobo21bobo214boo15bobo4bo12booboo92boo15boboo3boo7boobobbob3o90b oo15bobo5boo9boo4b3o446bo127bo14bo78bo142boo4b3o$84bobo28boo216bo16boo 3bobo12boboo93bo16bo3bo3bo10boboboo92bo16boo5bobo8boo4boo440bo132b3o 14b3o7b3o65boo142boo4boo$84boo244b3o20boo3bo12bobo90b3o6b3o17bo10b4o 90b3o27bo12boo440bo153bo17boo132boo3boo35bo29boo7boo$119b3o208bo22boo 3bo13bo91bo8bo12bobbo3bo12bo91bo26bobbo12bo441boo151boo5bo3bo8boo131b oo3boo33bobo20boo7bo8bobo$118bo3bo230boo3bo115bo12bo5bo134bo454bobo 157bo3bo7bo134b5o35boo21boo17bo12bo$66bobo48bo5bo231bobo130bo3bo132bob o455boo5boo195bobo101bobo58bo19boo11b3o$67boo48booboboo232bo133boo5bob o125boo5bo5boo450bobo146bo4b3o40boo25b3o171bo$67bo9bo293boo124boo5b3o 123boo6bobo449bo4boo3boo124bo12bo48bo24booboo73b3o68bo24boo$76bo294bob o124bo5bo126boo5bo217bobo238b3o124bobo11bobo72booboo142bobo$76b3o292bo 11bo97boo22bo9bo133bo209bo215bobo3boo3boo8bo3bo124boo10booboo6bo64b5o 120bo22boo$62b3o31bobo282bobo97bobo30bobo130b4o208bo215boo4bobobobo9bo bo136bo5bo5boo40b3o19boo3boo120bo5bo$61bo3bo30bo3bo267boo9boo12boo86bo 20bobo8boboo10boo108bobo6boboboo9boo193bobbo216bo5b5o11bo140bo7bobo5bo 34b3o144b3o5boo42b3o$60bo5bo7bo25bo16boo114boo133boo9boo12boo107bobbo 6booboo10boo108bo3bo3bobbob3o8boo194b3o223b3o150boo3boo10b3o25bo9bo 102boo48bobo5boo$61bo3bo9boo19bo4bo16bo115bo100boo34boo6boo88boo20bo 13boo6boboo86boo36bo4boboboo432bo10b3o154bo26boo10bo102bo29boo25bo3bo 33bobo$62b3o9boo24bo14b3o116bobo5bo24boo67bo34b3o7bobo86bo18boo12bo3b oo5bobo87bo32bo4bo4b4o410bo33b3o135bo18boo19b3o4boo9bo103b3o27bo24bo5b o12bo18b5o$62b3o22boo7bo3bo4boo8bo119boo3bobo24bo68bobo10bo21boo10bo 86bobo9bo7boo13boo8bo88bobo8boo24bo7bo411b3o170bo15b3o20bo16bobo78boo 6boo16bo27bobo8bo13bo3bobbo12bo16boo3boo$68b3o15bobo7bobo6bobo131bobo 17bo5bobo69boo9b4o9boo5boo101boo8boo12boo5bobbo99boo7bobo12boo6bo3bo 422bo167b3o14bobo22bo94bo4bobbo4bo43boo7boo13bo17b3o16boo3boo$60boo8bo 15bo20bo130bobbo16boo5boo80boobobo7bobo5boo110boo4boo6bobo5bobo108b3o 4boo6bobo6bobo423boobbo172boo6bo3bo59boo55bo4bobbo4bo26bo24boo4boboo7b o3bo3bo$61bo7bo15boo20boo130bobo15boo87b3obobbo6bo118b3o4boo6bo117b3o 4bobbo5bo440bo16boo5boo3boo141boo5b5o37bobo20bo55bo4bobbo4bo24b3o23b3o 4bob3o7boo3boobo$58b3o179bobo13b3o88boobobo6boo119boo4boo5boo118b3o4bo 6boo438b3o16bo7b5o141bo6boo3boo37bo18b3o58boo6boo25bo27boo4bo19bo29boo $58bo22bobo158bo4bobo7boo3boo84b4o3boo124boo6boo123bobo7bo462b3o5b3o 150b5o38bo18bo95boo27boo23boo26booboo$82boo163boo9boo89bo5bobo124bo6bo bo123boo5boobo463bo6bo152b3o39bo57bobboboobobbo24b3o48bo51bobbo$82bo 165bo10bo97bo133bo133bo604bobo17bo39b3o55boobbo4bobboo24bo17bo64boo6bo 13bo$61boo105boo187boo132boo132boo231bobo369boo3b3o32boo18b3o56bobbob oobobbo6bo18bo82bo5bobo10bo$60bobo105boo687bo205boo3boo161bo13boo24bo 93b3o17b3o62bobbo8bo4bobo6boo11boo$62bo43bo81bo668bo208bo9bo158bobo7bo bo20b3o25bobboboobobbo56bo70bobo12bo10bobo3boo$36bo68b3o78b3o668bobbo 202bo5bo4bobo157b5o6bo22bo27b4oboob4o56boo19b3o47boo9bobbo3boo5bo3boo$ 36b3o50bo79bo15bo55bo615b3o204booboo6boo16boo138boo3boo22bo33bobboboob obbo16bobboboobobbo49b3o48bo6b4o3boobobo4bo3boo23boo3boo$39bo50boo76bo bo14boo52boo824bobo26bo138boo3boo20b3o17bo42boobbo4bobboo60bo44b4o14bo 3boo24b5o$38boo49boo14b3o59bo3bo68boo824bo24b3o130bo34bo20b3o41bobbob oobobbo49b3o9boo43bobbo8boo5bobo27b3o$167b5o894bo24bo121bo8boo35boo22b o102bo9bobo43b4o16bo11boo16bo$53b3o49bobo58boo3boo1040b3o7boo57boo102b o50boo4b4o27bo$55bo49bobo48b3o8b5o911bo132bo142boo3boo19b3o41bo6bobo7b o17bo7bobo$54bo100bo3bo8b3o897boo14bo130boo30b3o109boo3boo61boo7bo27b 4o4boo$105b3o47bo3bo9bo10booboboo881bo13b3o153boo6bo3bo109b5o63boo5boo 11bo16b4o$38boo3boo21boo88b3o21bo5bo45bobo834b3o166bo122bobo83bobo5boo 8bobbo$38bobobobo19bo3bo112bo3bo3boo41boo837bo167b3o3bo5bo32b3o102boo 41bo12boo3bo14b4o25boo$39b5o19bo5bo15bo19b3o74b3o5bo42bo983b3o21bo3boo 3boo5bo25booboo73b3o26boo40bo12boo3bo4boboboo3b4o26bo$40b3o3boo10boobb oobo3bo15b3o18bo63bo19bobo9bo20boo631bobo358b3o5bo30b3o24booboo101bo 55boo3bo5boo3bobbo30b3o$41bo3bobo10boo3bo5bo18bo78boo22boo8bobo19bo 635bo356bo3bobbobo29b5o23b5o144bo9boo3bobo10bo36bo$47bo16bo3bo18boo67b 3o8b3o30bo3boo6boo7bobo12boo621bo231bo132boo28boo3boo21boo3boo131bobo 8bobo7bobo4bo8bobbo$66boo10b3o74bo3bo8boo30bo3boboo4bobo6boo14bo618bo bbo229bobo123boo3boo33b5o160boo19bo$77bo3bo73bo3bo8bo31bo3bob3o4b3o10b o7b3o620b3o230boo163bo3bo104boo55bo9b3o6boo$90bo65b3o8bobo31boboboobbo 4b3o7boo8bo1010boo9bobo105bo17bo$76bo5bo7bo9bo66boo16bo16bo4boo4b3o9b oo1019bo10bo107b3o14boo83bo$58boo16boo3boo6bobo8boo84bo25bobo1017bo10b 3o95boo6boo16bo13bobo47b3o34bo$59bo28booboo6bobo82b3o25boo1019bo9bo95b o4bobbo4bo113b3o$42b3o14bobo7bo17bo5bo74booboboo923bo132b3o21bo26boo 55bo4bobbo4bo61bo16bobo$41booboo14boo4b4o20bo15bo92bo899bo153booboo25b o55bo4bobbo4bo59boo18bo$41booboo19b4o18boo3boo11b3o8bo44bo6bo5bo24bobo 895b3o120boo40bo17b3o58boo6boo62boo$41b5o19bobbo45bobo35bo6boo38boo16b obo1000bo31bo5bo4bo16bo151bo$40boo3boo18b4o4boobboo36boo35bobo5boo7boo boo5b5o33boo1002b3o37b3o55bobboboobobbo24b3o16boo56bo$66b4o5bo16b3o10b 3o44boo17bo6bob3obo8bo24bo1004bo28booboboo59boobbo4bobboo24bo18boo59b oo3bobbo3boo25bo$25boo42bo22boboo83bo3bo7bobo664bobo379bo78bobboboobo bbo6bo18bo17bo61b5o4b5o23bobo$25bo35boo31boo9bobo72b3o9boo11boo650bo 380bobo94b3o17b3o78boo3bobbo3boo24boo$13boo8bobo35boo17boo11boo10bobo 73bo22b4o649bo248bo132boo93bo70bobo13bo$13boo8boo55boo9bobo29bo80boob oo648bobbo243bobo227boo19b3o47boo14b3o$16boo71boobbo11b3o16bo45boo6boo 26boo649b3o245boo163bo23bobboboobobbo49b3o48bo17bo$16b3o21boo80b3o45b oo7bo589boo497bobo22boobbo4bobboo60bo55boo$16boo23bo19bo100boo12b3o6b oo9boo571bobo497boo23bobboboobobbo49b3o9boo113bo$6boo5boo23b3o5bo13b3o 9boo31b3o54boo12bo8bobo9boo572bo475bo108bo9bobo114bo$5bobo5boo23bo5b3o 12bo3bo7bobo32bo47b5o6boo19b3o7bo6bo16bo550boo475bo5boo100bo124b3o$5bo 37bo14bob3obo8bo78bo6bo5b3o19b3o12bobo15b3o890bo132b3o5boo73boo3boo19b 3o41bo25b3o$4boo37boo14b5o26b5o57bo4boo6boo19b3o12bo3boo16bo890bo214b oo3boo61boo26b3o$89bob3obo35bo30boo7boo5boo5bobo13bo3boo15boo446b3o 439b3o162bo52b5o63boo24bo3bo$90bo3bo34bobo30boo7bobo3bobo5boo14bo3boo 83boo244b3o739bo52bobo$91b3o36boo41bo3bo24bobo3boo80bo111b3o130bo3bo 129bo3bo602b3o80boo41bo20boo3boo$75bo16bo57boo3boo16booboo25bo4bobo47b oo19bobo6bobo110bo3bo129bo3bo129bo3bo657b3o26boo40bo87bo$64b3o8bo75b5o 54bo48boo13boo3bobbo5boo110bo5bo129b3o317bobo500bo128bobo$38boo3boo21b o7b3o49boo24b3o55boo46bo8boobboob3o5boo386b3o186bo233boo307bo86boo$41b o23bo60bo26bo112bobo3bo3bo3bo3boo113bo7bo451bo234bo19bo115boo158bobo8b obo$38bo5bo47boo22bo7bobo11bo27bo98bo8bobo5boo115bo7bo448bobbo234bobo 5boo10boo115bo158boo$39booboo30b3o15boo20bobo7boo13bo25bobo97bobbo6boo bbobbo387b3o184b3o235boo5boo9bobo115bobo7bo43bo48boo55bo9b3o$40bobo32b o28boo6boo23b3o25boobo4boo90bo13bobo118bo5bo129b3o566boo12boo111boo4b 4o3boboo34bobo48bo17bo$41bo33bo27bo3bo4boo51booboo3boo76bo6boo6bobo 132bo3bo129bo3bo129bo3bo431b3o10bo3bo114b4o4boboboobboo29boo49b3o14boo 69boo72bo$41bo33bo26bo5bo3boo26boo23boobo82boo4bobo7boo133b3o130bo3bo 129bo3bo431boo10bo5bo113bobbo3booboboobbobo55boo6boo16bo13bobo47b3o20b o73bo$75bo26bo3boboo4bobo23bo24bobo82bobo4bo278b3o563boo13bo3bobbo112b 4o3boo8b3o52bo4bobbo4bo98b3o72b3o$62b3o9b3o25bo5bo7bo24b3o22bo89boo 412b3o429boo13bo120b4o3boo8b3o51bo4bobbo4bo61bo16bobo17bo$61bo3bo28boo 7bo3bo35bo974bo3bo3bo114bo12b3o52bo4bobbo4bo59boo18bo56bobboo4boobbo$ 39bo6b3o11bo5bo26bobo8boo1013boo3boobo125bobo6boo28bo18boo6boo62boo73b o3b3obb3o3bo$38b3o5bo13booboboo7b3o16bo21bo1011bo125boo7bobo28bo108bo 56bobboo4boobbo5bo$37bo3bo5bo27bo16boo22boo1009boo135bo26b3o31b3o16boo 56bo73b3o$36bob3obo32bo39boo126boo1019boo60bo18boo59boo3bobbo3boo55bo 29bo26boo$37b5o21bo36bo143boo612bobo465bo17bo61b5o4b5o55boo26bobo27bo$ 62bobo32b4o142bo613bo467b3o78boo3bobbo3boo14bobboo4boobbo56boo27boboo 5boo$62bobo24boo5b4o12boo584boo157bo517bobo13bo41bo3b3obb3o3bo85bo7bob o$54boo7bo25boo5bobbo13boo583bobo156bobbo464b3o47boo14b3o40bobboo4boo bbo90bo4b3o$54bobo39b4o12bo587bo156b3o440bo14bo9b3o48bo17bo141bobbo4b 3o$54bo8boo32b4o599boo596bobo14b3o19bo55boo142boo4b3o$63boo35bo22boo 100bo10bo13boo114boo132boo131bobo663boo17bo6b3o9boo173bo21bo7bobo6boo$ 115boo6bo101boo9boo12bo114bobo132boo4b3o123bobbo4bo676boo7bo9bobo131b oo3boo36bo20boo6boo7bobo$115bobo6b3o94boo3boo7bobo4bo5bobo100bo12b3o4b oo113bo10boo6b5o112bo8boo5boo686bo144b5o35b3o19bobo17bo12bo$41boo72bo 10bo99b3o13bobo3boo96bo4b4o8b3o4bobb4o109bobo7b3o5bo3bobo110bobo5boo3b o8boo680b3o41bo25b3o73booboo77boo11b3o$41bo184boo15bobo100bo5b4o8b3o4b oob3o112boo6boo6bo3boo110boobo6boo10boo675bo46boo26b3o73booboo93bo$42b 3o16b3o154boo5boo16bobbo94boo9bobbo9bobo107boo12boo9boo107boo10booboo 6bobbo671bo10booboo45boo24bo3bo73b3o68bo24boo$44bo16bo41booboboo19bobo 85bobo5bo17bobo95boo9b4o10boo107boo12boo9boo107boo10boobo8bobo672bo 235bo$62bo61boo3bobbo84bo24bobo106b4o8bo122bobo132bobo682b3o8bo5bo5boo 41bo20boo3boo142b3o$103bo5bo7boobboob3o5boo6boo74boo24bo108bo12bo121bo 11bo123bo9bo697boo40bo147bo5boo$116bobo3bo3bo3bo3boo4boo220b3o131bobo 134bo222bobo458booboboo5bo6bo181bobo6boo41b3o$104booboo6bo8bobo5boo 363boo132b3o225bo474b3o35bo102boo42boo5bo5boo35booboo$106bo8bobbo6boo bbobbo726bo473bo26bobo8bobo101bo29boo24bobo35booboo$69boo20boo22bo13bo bo724bobbo473boo25boo114b3o27bo23bo38b5o$69bobo19bo24bobo738b3o455bo 45bo9b3o104bo27bobo7boo12bobbo17bo16boo3boo$57boo10bo11bo7bobo25boo 1194bobo6bo7bo120bobboboobobbo44boo6bobo12bo18bobo$58bo20bobo7boo280bo 133bo808boo6boo6bo62boo56b4oboob4o27bo23b3o5bo8bobo5boo9boo$58bobo5boo 9boo26boo262bobo134bo133bo680bobo47b3o20bo56bobboboobobbo25b3o22b3o5bo bobo6boo5bobo29boo$59boo5boo9boo26boo263boo132b3o131bobo750b3o93bo26b 3o4b4o16bo27b5o$69boo6boo18boo282boo132boo122boo8boo677boo3boo36bobo 17bo74b3o18boo26bobo23boo30bo$69b3o7bobo16bo282bobo131bobo131bobo677b 5o20bo17bo56bobboo4boobbo23b3o47boo51b3o$69boo10bo16bobo8boo272bo133bo 133bo660bo17b3o95bo3b3obb3o3bo23bo82boo6bo10bo$66boo31boo8boo272boo 132boo132boo657boo4b3o12bo19boo19bo56bobboo4boobbo5bo18bo82bo8bo10boo$ 66boo27boo9boo6bo263bo932boobbooboo5b3o24bo19bo73b3o18bo74boo3boobo6b 3o10boo$95bo9b3o6bo232boo30bo101boo30bo101boo30bo667booboo5bo23b3o24b oo3bobbo3boo55bo20bobo48bo12b3obbo5bo3bo3bo$61boo24bo5bobo10boo240bo 28b3o102bo28bobo102bo31bo209bobo454b5o6bo22bo26b5o4b5o55boo68boo9bo3bo 9bo$62bo24bobo3boo14boo6boo229bobo5bo125bobo6bo20boo102boboo5boo19b3o 208bo456boo3boo22bo32boo3bobbo3boo14bobboo4boobbo98boo6bobo4bo8bo3bobb o22boo3boo$62bobo5bo17bobo18boo6bobo220bo8boo3b4o116bo8boo6boo115bo8bo 7bobo229bo483b3o17bo41bo3b3obb3o3bo47bobo9boo42boo16bo5bo23bobobobo$ 63boo5boo16bobbo12bo14bo218b3o12boboboo113b3o11boo4boo112b3o12bo4b3o 228bobbo479bo20b3o40bobboo4boobbo49bo11boo41boo17bo3bo25b5o$71boo15bob o14boo12boo216bo14bobbob3o111bo14boo4b3o110bo13bobbo4b3o227b3o434bo8bo bo34boo22bo102bo10bo43boo18boo11boo15b3o$71b3o13bobo5b3o6boo231boo14bo boboo112boo13boo4boo111boo13boo4b3o665b3o6boo58boo102bo50boo4bobo28bo 17bo$60bo5boo3boo7bobo4bo9bo256b4o9boo122boo8boo10boo110bobo7boo660bo 6bo23b3o135b3o48bobo6bo19bo6bobo$60b3o7boo9boo13bo259bo10bobo112boo7bo 9bobo10boo109boo8bobo658boo142boo3boo19b3o39bobo6bo28bobo4boo$63bo6bo 10bo287bo16boo95boo18bo9bo6boo115bo16boo663boo7bobo110b5o62boo6boo11b oo18boo$62boo305boo15bo95bo20boo15bo116boo15bo664bo7b5o33b3o73booboo 25bo37bo17bo3bo17boo$387b3o131b3o131b3o641bo20b3o3boo3boo5bo26b3o73boo boo25boo53bo5bo16boo24boo$66bo28boo14bobo218boo3boo50bo102bo30bo102bo 30bo640b3o21bo3boo3boo4b3o24bo3bo73b3o25bobo52bobbo3bo8bo4bobo26bo$66b o3boo17boo4bobbo13boo221bo130booboboo17bobo134bo669bo3bo4bo29b5o191bo 9bo3bo29b3o$71bo16boobo7bo12bo219bo5bo152boo13bo118b3o12boo654bob3obo 4bo27boo3boo21boo3boo153bo3bo3bo5bobb3o35bo$71bobo5boo10bo7bo25bo207b ooboo128bo5bobbo30boo92boo3boo34boo654b5o3b3o194bo9b3o7boboo3boo$62boo 3boo3boo5bobo8bo8bo23b3o208bobo3boo133boo28bobo94b3o35bo215bobo641boo 10bobo7bo$63b5o12b3o12bobbo5boo16bo212bo5boo41boo81booboobbobo41boo81b o3bo46boo205bo585boo54boo9b3o6boo$64b3o14b3o11boo7bobo15boo211bo4bo43b o84bo48bo83bobo47bo206bo466boo9b3o105bo17boo47b3o$65bo14b3o23bo267bo7b obo114bo6bo9bobo84bo36bo9bobo203bobbo467bo9b3o106b3o15boo46b3o$79bobo 24boo8bo231boo22bobo7boo98boo16bo4bobo8boo98boo20b4o8boo205b3o464b3o 121bo14bo48b3o34bo$79boo4bo29bo233bo20boo111bo14b3o3boboo109bo19bobob oo671bo9bo11bo84bobboboobobbo79bobo32bobo$84bo30b3o214boo15bobo5bo12b oo94boo15bobo4bo12booboo92boo15boboo3boo10bobbob3o668bobo20bobo25boo 56b4oboob4o79b3o33boo$84b3o246bo16boo3bobo12boo95bo16boo3bobo12boboo 93bo16bo3bo3bo10boboboo670boo19bo3bo25bo56bobboboobobbo60bobo$330b3o 21bobo15bobo89b3o7boo11boo3bo12bobo90b3o26bo10b4o659boo32b3o23b3o129b oo$330bo22bobbo17bo89bo9bobo10boo3bo13bo91bo21bobbo3bo12bo660bo31boo3b oo4bo16bo74b3o17bo37bo$66bo52b3o232bobo117bo12boo3bo128bo5bo674b3o37bo bo54bobboo4boobbo23b3o17boo$67boo49bo3bo232bobo131bobo7bo122bo3bo677bo 38boo53bo3b3obb3o3bo23bo17bobo62bobobbobo28bo$66boo32bo7bo8bo5bo233bo 132bo6boo125boo5bobo687bo77bobboo4boobbo5bo18bo78boobobbobbobboboo25bo $77bo21boo7bobo6bo5bo374boo5boo124boo5b3o681bo93b3o18bo82bobobbobo27b 3o$77bobo19bobo6boo10bo250b3o131bobo124bo5bo681b3o92bo20bobo48bo14bo$ 77boo39bo3bo248bo12bo120bo11bo121bo9bo208bobo554boo68boo15b3o$95bobo 23bo226boo22bo8b4o96b3o31bobo130bobo206bo493bo22bobboo4boobbo98boo17bo $60boo3boo28bobbo18bobbo227bobo17boo10b4o9boo86bo20boo9boo12boo107bobo 8boboo10boo194bo494bo20bo3b3obb3o3bo47bobo9boo54boo$62b3o8bobo22boo17b o115boo113bo19bobo9bobbo9boo87bo19boo9boo12boo107bobbo6booboo10boo194b obbo489b3o21bobboo4boobbo49bo11boo$61bo3bo8boo20bo3boo16bo115bo100boo 32b3o8b4o5bo79boo19bobo12boo6boo88boo34boo6boboo206b3o577bo10bo115bo$ 62bobo9bo23boo15b3o116bobo5bobo22boo67bo33b3o8b4o4bo80bo19boo13b3o7bob o86bo32bo3boo5bobo678bo5boo100bo69bo54bobo$63bo23boo6bobbo6boo8bo119b oo3bo3bo22bo68bobo10bo19b3o12bo85bobo10bo7bo13boo10bo86bobo9bo22boo8bo 677bobo5boo99b3o67b3o54boo$68boo16bobo6bobo7bobo132bo19bo4bobo69boo9bo bo10boo5bobo100boo9b4o9boo5boo101boo8boo12boo5bobbo688boo80boo3boo19b 3o39bobo24bo3bo$60boo5bobo16bo20bo131bo4bo14b4ob3o81boobo8bobo5boo111b oobobo7bobo5boo110boo4boo6bobo5bobo772b5o62boo24bob3obo$61bo7bo15boo 20boo131bo12bo4booboboo83booboo7bo119b3obobbo6bo118b3o4boo6bo730bo51b ooboo25bo37bo25b5o$58b3o20bo158bo3bo3boboo5b3obobbo83boobo7boo120boobo bo6boo119boo4boo5boo728bobo51booboo25boo$58bo23boo158bobobbob4o5boobob o84bobo4boo125b4o3boo124boo6boo733boo52b3o25bobo128bo$81boo164boobboo 6b4o86bo5bobo125bo5bobo124bo6bobo946bo$260bo96bo133bo133bo944b3o$168b oo187boo132boo132boo684boo159bo9b3o$60b3o43bo61boo686bobo453bo157boo 10bobo$62bo43bo81bo670bo452bobo6bo7bo36bo48boo54boo9b3o$36bo24bo43b3o 78b3o670bo453boo4bobo5b4o36bo47bo17boo47b3o$36b3o49bobo94bo54bobo613bo bbo457boo8boobbobboo29b3o48b3o15boo46b3o19boo$39bo49boo78bo16bo53boo 615b3o457boo11boobboo82bo14bo48b3o20bo73bo$38boo49bo15b3o60b3o12bobbo 54bo1075boo7bo10boo52bobboboobobbo79bobo17b3o72bobo$106bo60bo3bo10bo 1136bobo4bo10b3o51b4oboob4o79b3o17bo75boo$42bo10boo51bo59bob3obo8bo3bo 1135bo4bo10boo52bobboboobobbo60bobo78bo4bo$42bo9bobo51bo60b5o11bo1150b oo7boo118boo77boob4oboo$54bo51bo49b3o21bo5bo1147boo7bobo28bo31b3o17bo 37bo79bo4bo9bo$96bo8b3o47bo3bo20bo5bo47bo1110bo26bobo31b3o17boo129b3o$ 38boo3boo21bo30boo55bo5bo20bo3bo46boo1111boo26boo32bo17bobo62bobobbobo 58bo29bo26boo$39b5o21bobo28boo84b3o4boo42boo1172bo78boobobbobbobboboo 54boo29bo26bo$40b3o20boo3bo16bo19b3o45bo7bo28bo1216bo82bobobbobo21bo4b o60b3o26bobo6boo$41bo16boo3boo3bo16b3o18bo46bo7bo6bobboo17bobo8bo21boo 1181bobo48bo14bo44boob4oboo88boo6boo$45b3o10boo3boo3bo19bo17bo61bobo 20boo8bobo19bo634bobo594boo15b3o44bo4bo101boo$47bo17bobo19boo65bo5bo6b oo33bobo7bo8bobo12boo619bo523bo14bo59boo17bo143bo6b3o$46bo19bo41bo46bo 3bo6boo17bo16bobbo6boo7boo14bo619bo524bo13b3o7bobo9boo54boo143bo6boo$ 78b3o25bobo47b3o7boobo32bobobboo4boo10bobo6b3o620bobbo519b3o16bo7bo11b oo194b3o5boo7boo$77bo3bo25boo58b3o31bobo3boo4b3o9boo7bo622b3o538boo7bo 10bo175bo21boo5boo7bobo$76bo5bo7bo94bo15bo5boo4boo11bo1180bo69bo73boo 3boo34bobo20bo18bo12bo$58boo16booboboo6b3o7boo82bobo26boo1187bo4b3o67b 3o114boo39boo11b3o$59bo29b3o8boo66boo3boo9boo26bo1187bobo3b3o39bobo24b o3bo72bo3bo93bo$42b3o14bobo7boo28bo6bo64bo28bo1198bo3bo44boo24bob3obo 72b3o93boo$60boo6b3o16boo3boo12bo61bo5bo24bo1189bo10b3o8bo37bo25b5o73b 3o69bo$42bobo20boboo5bo12boo3boo11b3o52bobo6booboo25b3o17bo1167bobo8b oo3boo6boo195bo14bobo$41b5o19bobbo4bo3bobo80boo8bobo5boo3boo32boo1169b oo20bobo188bo6boo14boo25b3o$40boo3boo18boboo5b4o83bo9bo20bo25boo1197bo 184bo4bobo41b3o$40boo3boo21b3o4b3o14boo11b3o63bo7bo3bo9bo1221b3o138boo 42b3o10boo35bo3bo$69boo21bobo11bo73b3o8b3o1220bo27bo9b3o101bo29boo23bo bbo$61boo16bo14boo10bo73b3o673bobo555boo24boo10bobo102b3o27bo22bo38boo 3boo$61boo14boobo12boo11bo98boo652bo536bo44boo9b3o104bo27bobo7boo11bo 21bo$77b5o11boo11bo16bo30bo48booboo651bo537bo5boo47b3o76boo3bobbo3boo 43boo7boo11bo22bo$77b3obo7b3o13b3o13bobo21bo6boo16boo6boo23b4o649bobbo 535b3o6boo46b3o19boo55b5o4b5o26bo22boo15bobbo5boo9b3o$40boo38bo41boo 21bobo5boo15boo7bo24boo563boo86b3o543bo48b3o20bo55boo3bobbo3boo24b3o 21b3o6bobo8boo5bobo$41bo103boo15boo12b3o6bo10bo572bobo680bobo17b3o73bo 19bo25boo6boboo16bo30b3o$18bo19b3o19b3o42b3o54bobo11bo8boo9boo573bo 637boo3boo36b3o17bo75bo19boo27boo4b3o16boo26boo$18b3o17bo21b3o8b3o32bo 50boo4b3o15boo3boo7bobo4bo17bo550boo636bobobobo98bo4bo77boo51boo$21bo 37bo3bo9bo15boo3boo10bo46bobbobbo4b3o19b3o13bobo15b3o1174b3o10b5o97boo b4oboo26bo82boo16boo$20boo50bo57bo21bobooboo4b3o20boo15bobo17bo1167bob o3b3o6boo3b3o18boo80bo4bo9bo17bobo81bo8bo9bobo$58boo3boo25bo3bo36bo19b o3bo6bobo6boo5boo5boo16bobbo15boo1167boo3bo3bo5bobo3bo20bo93b3o81boo9b oo5bobo6bobo10boo$91b3o35b3o19b5o6boo7bobo3bobo5bo17bobo464b3o719bo13b o23b3o27bobobbobo58bo20b3o61bobo7bobo5boo8boo$91b3o56boo3boo16bo3bo24b obo3boo193bo132b3o130bo3bo721boo3boo28bo25boobobbobbobboboo54boo68bobo 6bo5bo8bo$151b5o17booboo24bo5bobo47bo20boo121bobo130bo3bo129bo3bo750bo 35bobobbobo21bo4bo65bo35boo6bobo13bobbo27boo3boo$23bo40boo9bo76b3o55bo 47boo14bo4boo120bo3bo128bo5bo129b3o749b3o17bo44boob4oboo50b3o10boo35bo 5boboo13bo30boo3boo$22b3o38bobo8b3o49boo25bo56boo45bobo8boob5o6boo117b o3bo452bobo560bo20b3o44bo4bo64bobo40booboo14bobo$21b5o39bo7bobobo48bo 140bo4boobbo5b3o116bo3bo127bo7bo315bo517bo9bo35boo22bo101bobo53boboo 15boo12boo15b3o$20bobobobo46bobobo14boo23bo6bobo11bo25bo101bo8boo5boo 117bo3bo127bo7bo315bo517b3o5boo59boo102bo50boo3bobo29bo16b3o$20boo3boo 47b3o15boo20b4o6boo10bobo25bobo99bo7bo4boo7boo111bo3bo451bobbo517bo5b oo23b3o186bobo4bo23bo4bobo17bo$65bo9bo29bo7b4o20boo28boo4boo91bo12boo 7bobo110bo3bo128bo5bo129b3o184b3o517boo29booboo135bo41bo7bo29bobo3boo$ 104bobo6bobbo50boo4boo83boo7bo22bo111bobo130bo3bo129bo3bo726boo6booboo 34bo73boo3boo20bo39boo7boo12boo15boobo$23bo79bo3boo4b4o23boo25boo81boo 5bobo8boo20boo111bo132b3o130bo3bo706bo19bo7b5o6bo26b3o103boo35boo20bob o14booboo$22bobo50bo27bo3boo5b4o22bo23bobo84boo4bo412b3o706bobo19b3o3b oo3boo4b3o24bo3bo72bo3bo26boo59bo13boobo24boo$21boobo49b3o26bo3boo8bo 23b3o20bo85bo5boo1120bo3bo20bo13b5o22bob3obo72b3o26bo58bobbo13bobo25bo $21b3o38b3o8bobobo16boo8bobo36bo1234b5o33bobobobo22b5o73b3o88bo8bo5bo 27b3o$20bobbo37bo3bo7bobobo15bobo9bo1271boo3boo4bo27boo3boo171bo9boo5b obo7bobo35bo$20b3o37bo5bo7b3o16bo21bo1262b5o3bobo204b3o7bobo5boo9boo$ 19bo3bo36bo5bo8bo16boo1285b3o5boo192bobo8booboo6bo$18bo5bo38bo53bo125b o1136bo38bo106boo17bo35boo8b3ob3o4boo$19bo3bo5bo31bo3bo34boo15bo125boo 1162boo9bobo105bo18boo35bo8b3ob3o$20b3o7bo31b3o34b3o140bobo611bobo549b o8boobo106b3o14bobo44b3ob3o$28b3o32bo25boo5boboo598boo159bo545b3o9b3o 109bo61b3ob3o32bo$89boo5bobbo9bo588bobo158bo535bo9bo10bobbo81boo3bobbo 3boo77booboo34bo$96boboo8boo590bo155bobbo536bo19b3o25boo55b5o4b5o78b3o 33b3o$63boo34b3o598boo155b3o534b3o18bo3bo25bo55boo3bobbo3boo60bo18bo$ 63boo35boo21boo99bo25boo115bo132boo132boo746boo30bo5bo21b3o73bo54boo$ 123bo98b4o6boobboo12bo115boo131bobo132boo4b3o739bo32bo3bo5bo16bo75bo 18boo35boo$37bo77b3o6b3o94boboboo5b4obobbobo5bobo93bo5boo13boo4boo112b o12b3o4boo113bo10boo6b5o739b3o30b3o7bo57bo4bo48boo$18boo15bobo77bo10bo 93bobbob3o5boobo3bo3bo3boo92bo3bo3b3o11b3o4boobboo103bo4b4o8b3o4bobb4o 109bobo7b3o5bo3bobo740bo38b3o55boob4oboo26bo18bo63b8o$19bo16boo78bo 103booboboo4bo12bo101bo5boobo9boo4boobboo103bo5b4o8b3o4boob3o112boo6b oo6bo3boo839bo4bo9bo17bobo81bob4obo29bo$16b3o84boo3boo108b3ob4o14bo4bo 95bo5bo4bobbo10boo107boo9bobbo9bobo107boo12boo9boo767bo93b3o101b8o27bo bo$16bo89bo22boo86bobo4bo19bo96boo9boobo11bo107boo9b4o10boo107boo12boo 9boo765bobo92bo20b3o63bo53boo$103bo5bo14bo4boo86bo22bo3bo105b3o10bo 121b4o8bo122bobo779boo92boo68bobo14b3o$104booboo9boob5o6boo6boo74boo 22bobo107boo9bobo121bo12bo121bo11bo826bo4bo65bo35boo18bo$44bo60bobo9bo 4boobbo5b3o5boo220boo132b3o131bobo800bo23boob4oboo50b3o10boo35bo17boo$ 45bo60bo9bo8boo5boo497boo225bobo570bobo25bo4bo64bobo$43b3o60bo9bo7bo4b oo726bo574boo83bobo68bo56bo$73boo6boo33bo12boo726bo552bo5boo100bo68bob o56bo$53bo19bo7boo34bo739bobbo550bo4boo168bo3bo53b3o$51bo3bo7boo6bobo 44boo250bo486b3o549b3o106bo41bo25b5o$51bo3bo7boo6boo298bo133bo133bo 851boo3boo20bo39boo25boo3boo$53boo5boo43boo262b3o131bobo134bo799bo81b oo35boo25b5o$59b3o6bo36boo397boo132b3o800bo50bo3bo26boo62b3o$60boo6bo 13bo298boo132boo132boo788b3o51b3o26bo65bo$46bo16boo5b3o7booboo296bobo 131bobo131bobo841b3o157bo$45bobo15boo5boo311bo133bo133bo912bo86bobo$ 38bo7bo25bo6bo5bo297boo132boo132boo739boo169b3o86boo$37bobo338bo133bo 880bo157bobo8booboo$38bo12b3o25booboboo261boo27bobo102boo30bo101boo30b o745bobo4bo9boo84boo17bo35boo8b3ob3o$51bobbo293bo28boo103bo28b3o102bo 28bobo746boo3bobo7b4o35bo47bo18boo35bo8b3ob3o$51bo10bo285bobo5bo125bob o5bo125bobo6bo20boo208bobo539boboo5b3obbobbobo28bobo48b3o14bobo44b3ob 3o17boo$44b3o4bo3bo6bobo13boo260bo8boo4bobo116bo8boo3b4o116bo8boo6boo 232bo537booboo9boobbobbo28boo50bo61b3ob3o18bo73bo$45bo5bo10boo14bobo 257b3o13boboo114b3o12boboboo113b3o11boo4boo231bo538boboo6bo9boo51boo3b obbo3boo77booboo16b3o75bo$38b3o4bo6bobobboo20bo257bo15booboo113bo14bo bbob3o111bo14boo4b3o227bobbo539bobo5bo8bo3boo49b5o4b5o78b3o17bo41b6o 28b3o$39bo39boo256boo15boboo113boo14boboboo112boo13boo4boo229b3o540bo 6bo10boo51boo3bobbo3boo60bo18bo59bo6bo$39bo29bo8b3o274bobo9boo119b4o9b oo122boo8boo10boo766bobbo5boo62bo54boo78bo8bo$35boo5boo16bobo5bobo7boo 276bo10bobo120bo10bobo121bo9bobo10boo765bobo6bobo28bo32bo18boo35boo78b o6bo8bo$37bo22bobo4bo3boo8bo287bo16boo115bo16boo115bo9bo6boo770bo29bo 51boo115b6o7b3o$61bo5bo3boo296boo15bo116boo15bo116boo15bo771boo26b3o 31bo18bo63b8o58bo$46bo20bo3boo314b3o131b3o131b3o829bobo81bob4obo21b6o 31boo29bo$45bobo20bobo261boo3boo50bo76boo3boo50bo133bo913b8o20bo6bo59b obo$38bo7bo10bo11bo10bo251boo3boo130bo130booboboo880b3o63bo44bo8bo59b oo$37bobo17b3o19b3o384bo5bo1063bobo14b3o43bo6bo$38bo12b3o6bo17b5o251b 3o34bo95booboo33boo93bo5bo870bo22bo35boo18bo43b6o$50bobbo5boo11bo4boo 3boo250b3o34boo95bobo35boo955bo13b3o7b3o10boo35bo17boo$53bo6b3o7booboo 3b5o252bo34bobo11boo83bo35bo12boo81booboo46boo82boo120bobo600bobo16bo 18bobo$53bo7bobo14bo3bo301bo84bo48bo84bo48bo84bo119bo604boo15boo6bobo 68bo116bo$50bobo7bo3bo4bo5bo3bobo293bo6bobo123bo7bobo121bo9bobo84bobo 6bo110bo630bo68bobo116bo$60b5o15bo267boo22b4o6boo98boo22bobo7boo98boo 21bobo8boo86boo6boo109bobbo620b3o72bo3bo72b5o36b3o$59boo3boo3booboboo 273bo21b4o108bo20boo111bo20boboo99boo4boo108b3o621b3o4bo41bo25b5o71bob 3obo$60b5o267boo15bobo5bobo11bobbo91boo15bobo5bo12boo94boo15bobo4bo12b ooboo99boo4b3o730bo3bo3bo39boo25boo3boo71bo3bo$44boo15b3o15boo252bo16b oo3bo3bo11b4o92bo16boo3bobo12boo95bo16boo3bobo12boboo99boo4boo721bo8bo 5bo6boo35boo25b5o73b3o$44boo16bo16boo249b3o22bo16b4o88b3o21bobo15bobo 89b3o7boo11boo3bo12bobo104boo8boo713bo8bo3bo8boo62b3o75bo$330bo23bo4bo 15bo88bo22bobbo17bo89bo9bobo10boo3bo13bo105bo9bobo710b3o9b3o8bo65bo$ 355bo10bo121bobo117bo12boo3bo131bo739bo184bo$355bo3bo4boo123bobo6bobo 122bobo132boo736b3o35bo102boo42bobo$63bo293bobo5boo124bo6boo124bo870bo 37b3o101bo44boo$60boo437bo139boo854boo24bobo8booboo101b3o$43b3o5b3o6b 3o8boo299boo131b3o131bobo843bo35boo8b3ob3o102bo$51bobbo6boo8boo299bobo 9boo119bo12bo120bo11bo826bo6boo35bo8b3ob3o77bobobbobo$43bobo5bo9bo310b o10b3o96boo22bo8b4o130bobo204bobo617bobo5bobo44b3ob3o17boo54boobobbobb obboboo25bo$42b5o4bo8bobo305bo11boboo9boo87bobo17boo10b4o9boo107boo9b oo12boo196bo617boo52b3ob3o18bo58bobobbobo27b3o37bo$41boo3boo4bobo5boo 306boo10bobbo4bo5bo87bo19bobo9bobbo9boo107boo9boo12boo196bo672booboo 16b3o93bo41bo$41boo3boo287boo27boo3boo9boboo5bo79boo32b3o8b4o5bo79boo 19bobo12boo6boo207bobbo630boo3boo36b3o17bo41b6o48boo38b3o$336bo32b3o 11b3o3bo3bo76bo33b3o8b4o4bo80bo19boo13b3o7bobo205b3o619bo10boo3boo37bo 59bo6bo$61booboboo268bobo8bo21boo13boo5bo78bobo10bo19b3o12bo85bobo10bo 7bo13boo10bo826b3o112bo8bo60boo$46boo289boo8bobo11boo5boo101boo9bobo 10boo5bobo100boo9b4o9boo5boo168bo666bo3bo3bo4b3o3b3o18boo79bo6bo8bo17b 3o32boo$46boboo11bo5bo282boo8bobo5bo113boobo8bobo5boo111boobobo7bobo5b oo166b3o664boo3bob3obo3bo5b3o19bo80b6o7b3o17bobo$49bo300boo8bo121boob oo7bo119b3obobbo6bo174bo668boo3b5o5bo5bo17b3o27b8o58bo20b3o$62booboo 283boo7boo121boobo7boo120boobobo6boo174boo706bo29bob4obo21b6o31boo19b 3o32b3o32bo$44bob3o8bo6bo282bobo5boo125bobo4boo125b4o3boo880bo35b8o20b o6bo51b3o10boo20b3o30bobo$44bo11boo289bo7bobo125bo5bobo125bo5bobo877b 3o17bo44bo8bo50b3o11boo53boo$44bo11bobo298bo133bo133bo876bo20b3o43bo6b o51bobo10bo$66boo289boo132boo132boo829bo45boo22bo43b6o52b3o$66bo733b3o 653b3o5bobo23b3o32boo134boo3boo$67b3o729bo3bo54bobo598bo4boo24b3o169b 5o$69bo787bo600boo5bo23bo3bo34bo134b3o39bo$43boo3boo748bo5bo52bo623boo 17bo26bobo104bo29bo41bo$45b3o16boo9boo621bo99boo3boo52bobbo599b3o18bo 6boo3boo4b3o24bo3bo72b5o26boo68b3o$44bo3bo14boo9bobo619b3o158b3o600b3o 19b3o14b3o24b5o71bob3obo24bobo$45bobo10bo6bo7b3o4boob3o609bo788bo40boo 3boo71bo3bo$46bo10bobo12b3o4bobb4o609boo104bo695boo3boo22b5o73b3o$50b oo3boo3bo12b3o4boo718boboo665bo27boo3boo23b3o75bo$50boo3boo3bo13bobo 723bo657boo3boo5bo57bo181boo$55boo3bo14boo723bo3bo654b5o4b3o192bo46bo$ 46boo9bobo741bobbo655b3o36boo106boo17boo33boo48b3o$46boo10bo742b5o655b o26boo9bobo105bo19boo33boo49bo$801b5o683bo8bobboo105b3o15bo$800boo3boo 679b3o11boo108bo$801b5o680bo13boo83bobobbobo$692b3o99bobo5b3o51bobo 618bo23bo23boo54boobobbobbobboboo$691bo3bo98boo7bo55bo615bobo48bo58bob obbobo70boo3boo$690bo5bo98bo63bo603boo11boo17bo5bo21b3o93bo34bobo8b3o$ 691bo3bo160bobbo603bo31bo5bo21bo41b6o48boo33boo8bo3bo$692b3o162b3o604b 3o29bo3bo6bo56bo6bo46bobo34bo9bobo$692b3o771bo30b3o5bobo55bo8bo93bo$ 1506boo56bo6bo8bo17b3o$779boo7bo695bo80b6o7b3o17bobo$690boo86bobo5boo 17boo678bo91bo20b3o$691bo86bo8boo16bo677b3o54b6o31boo19b3o47bo16boo$ 688b3o86boo27b3o730bo6bo51b3o10boo33boo17boo$688bo119bo705bo23bo8bo50b 3o11boo33boo$1515bo23bo6bo51bobo10bo$1513b3o24b6o52b3o$1497boo$779bobo 76bobo631bo4boo$779boo76bo632bobo$780bo76bo633boo111bo34bobo$857bobbo 712b5o26boo33boo$857b3o662bo49bob3obo24bobo34bo$782bo737bobo50bo3bo$ 756boo22b3o738boo51b3o$756bobo14bo5bo795bo$758bo12boo6boo692boo$758boo 12boo700bo158bo$1474bobo4bo95boo17boo33boo$1475b3ob4o6boobboo34bo47bo 19boo33boo$777bo699booboboo5b4obobbobo30bo47b3o15bo$776b3o698bobbob3o 5boobo3bo3bo26b3o49bo$776b3o699boboboo4bo12bo53bobobbobo$856bobo620b4o 14bo4bo48boobobbobbobboboo$774boo3boo78bo621bo19bo53bobobbobo$774boo3b oo78bo637bo3bo3boo82bo34bobo$751bo104bobbo637bobo5bobo81boo33boo$751b 3o103b3o647bo29bo50bobo34bo$754bo9bo12boo728boo26bobo$753bo9b3o10bobo 757boo30b3o$753bobbo5boobo9boobbo788bobo$757bo4b3o11boo790b3o$754bo3bo 4boo11boo790b3o47bo$756bo19bo781bo9b3o10boo33boo$753bo5bo784bo13b3o7b 3o11boo33boo$753bo5bo16bo5bo762bo15bo6bobo10bo$754bo3bo17bo5bo760b3o 14bo7b3o$755b3o12bo6bo3bo778bobbo$770bobo5b3o77bobo703bo$760boo8boo85b o703bo3bo$761boo94bo705bo10bo34bobo$760bo96bobbo699bo5bo7boo33boo$421b oo5bo19boo105boo5bo19boo105boo5bo18bobo139b3o692bo7bo5bo6bobo34bo$421b oo5b3o16bobo105boo5b3o17boo105boo5b3o15bobbo48boo782bobo8bo3bo$431bo 14b3o12bo103bo13boo10bo4bo102bo13boo10bo6bo33bobo782boo9b3o14bo$430boo 5boo6b3o8boo3b4o99boo5boo5b3o10bo4bobo99boo5boo4boo3bo8bo5bobo32bo14b oo794b3o$437boo7b3o8boo3b4o105boo6boo10bo7boo104boo6boo9bo6boobo46bo 794bo$447bobobbooboboo3bobbo5boo109boobboo11boo4boo107bobbobboo9booboo 22bo23b3o791boo25bo$448boobboobobo4b4o5boo109boobbobboo8boo4boo81b3o 24bobobbobb3o5boobo22b3o24bo781boo33boo$420b3o31boobo3b4o89b3o30b4o5bo bo89b3o29b4o7bobo3boo18b3o799bo7boo33boo$461bo91booboo30bo7bo90bo3bo9b o19boo9bo4bobo820bo5bo$420bobo130booboo9bo132b3o36bo15boo3boo11b3o782b 3o$419b5o9bo119b5o8b3o117boo3boo6b5o35boo14boo3boo11bo$418boo3boo7b3o 12bo104boo3boo6b5o128bobobobo69bo23boo56bobo701bo10boo3boo$418boo3boo 6b5o9boo117boo3boo8bobo116boo3boo9bo83bo60bo699bobo12bo$430boo3boo9boo 131boo131boo11boo37boo21boo7bobo60bo698bo3bo4boobbo5bo$431b5o144bo132b oo8bo4bo36bo16bo4boo7boo58bobbo698b5o4bobobbooboo17boo$421bo9bo3bo153b 6o106bo20bo6bo35bobo8boob5o6boo65b3o692bobobboo3boo3bo5bobo19bo$422boo 8bobo20bo4bo95boo8b3o19bo6bo104bobo18bo8bo29boo4boo7bo4boobbo5b3o759b oo4b5o11bo17b3o$433bo19boob4oboo103b3o18bo8bo103bobo18bo8bo29bo13bo8b oo5boo761bo5b3o12bo17bo$424bobbo27bo4bo102bo24bo6bo101bo3bo19bo8bo30b 3o10bo7bo4boo771bo25bo$424bobbobo132bobo8bo15b6o101b5o21bo6bo33bo10bo 12boo795b3o$420bo9boo130boobo5boo122boobobo11bo10bo4bo46bo807bo$423bo 6boo6bo123booboo5boo120b3obobbo10bobo10boo49boo759bo34bo10boo$420boo8b oo6bo123boobo129boobobo11boo823b3o6bo24b3o$427bobo8bo123bobo131b4o840b o3boo24bo3bo$427bo135bo133bo841bo5boo22bob3obo5bo$1539bobbo19boo6b5o6b o$858bobo682bo18bo17bobo$571bo285bo683bobo19b3o13booboo$571bobo283bo 684bo22bo12bo5bo$571boo284bobbo720bo$857b3o718boo3boo$1539boo3boo5bo$ 418boo132boo132boo851bobobobo3bobo$419bo133bo133bo852b5o5boo27b4o$419b obo8bo122bobo131boboo850b3o25boo8bobboo$420boo8bobo121boo132bo853bo27b o9boboo$430boo125boo133bo874b3o$423b3o131bobo130bo876bo13boo$423bo133b o133bo866bo23bo$424bo1134bo$1544boo11b3o$856bobo685bo31booboboo$859bo 685b3o28bo5bo5bo$698boo159bo687bo29bo3bo7bo$431boo131b3o131bobo155bobb o718b3o6b3o$431bobo130bo133bo158b3o$431bo133bo1000bo$1564bobo$1565boo$ 501boo132boo132boo$501bo133bo133bo826bo$489bo9bobo70boo48bo10bobo69b3o 48boo9bobo824bobo$398bobo86bobo9boo32bobo36bobo46bobo9boo34bo35bo48bo 3bo8boo809boo15boo$398bobbo84bobo44bo3bo34bo46boo3bo44bobo34bo46bo5bo 813bo4boo$401boo82bobbo23bo24bo81boo3bo21bo23bobo5bo73bobbo3bo20bo793b o$399bo3boo5bo75bobo23b3o18bo4bo4b3o73boo3bo21b3o21bobbo3b3o79bo20b3o 789b3o$401boo6bobo70boo3bobo6bo18bo21bo5b3o70boo3bobo6bo18bo20bobo3bo 3bo69bo3bo3bo24bo74bobo$391boo5bobbo6bo3bo68bobo5bo6bobo15boo9boo6bo3b o4bo3bo68bobo4bo6bo18bo10boo8bobo6bo70boboo3boo24boo73bo745bo$390bobo 5bobo8b3o69bo14boo26bobo6bobo5bo5bo67bo13b3o16bobbo6bobo8bo5bo5bo31boo 34bo107bo746bo$390bo16boo3boo32boo32boo34b3o5bo17bo3bo67boo36bo5bo16bo 5bo31bobo32boo107bobbo741b3o$389boo55bobo67b3o4boo18b3o104bobo4boo17bo 3bo32bo71boo70b3o$446bo192bo11bo25b3o92boo780boo$505boo131boo131boo 782bo$489bo14boo132bobo132bo781bobo5bo10bo$488bo17bo7boo3boo101bo25boo 3boo101bo25boo3boo767boo5boo9boo$488b3o24b5o102bobo23bobobobo100bo26b oo3boo775boo7bobo4bo30bo$437bo6bo15bo6bo9bo38b3o51boo6boo13boo6boo8bo 10boo25b5o91bo9b3o806b3o13bobo26bobo$436boo6boo7b3o3boo6boo8b3o17bo19b o51bobbo4bobbo11bobbo4bobbo7b3o17bo18b3o50bobbo4bobbo11bobbo4bobbo7b3o 17bo18b3o772boo3boo15bobo26boo$407boo26b3o6b3o6bo4b3o6b3o10bo16b3o41b oo25b6obb6o9b6obb6o9bo16b3o17bo5boo16boo24b3obb6obb3o7b3obb6obb3o8bo 16b3o12bo3b3o4boo770boo16bobbo$408bo27boo6boo8bo4boo6boo10boo19bo12bo 28bo26bobbo4bobbo11bobbo4bobbo9boo19bo11boo9boo17bo26bobbo4bobbo11bobb o4bobbo9boo19bo10boo4bo5boo49bo720bo17bobo$405b3o29bo6bo15bo6bo31boo 11boo25b3o28boo6boo13boo6boo30boo10boo26b3o91boo10bobo60b4o734bobo3boo $405bo106bobo24bo107bo25bo169b4o9bobo721bo5bobo$486bo356bobbo5boo5bo 728bo29bo$487boo228bo32bo86bo5b4o5boo5bo728boo29bo$448bo37boo31boo61b oo32bo36boo62boo31bo36boo48bo4b4o10bobbo757b3o$448boo32bo36bo63boo30b 3o35bo62bobo30bobo17b3o15bo54bo14b3o$447bobo31b3o36b3o59bo32b3o17b3o 16b3o71bo19booboo15bo3bo15b3o$461bo18b5o16b3o18bo71boo38bo3bo17bo70boo 18bo5bo24boo10bo35bo$460boo17bobobobo14bo3bo4boo7bo74boo18boo3boo13bo 5bo3b3o6bo74bobo20bo16bo5bo3bobo6bo37b3o$434boo24bobo16boo3boo13bo5bo bbobo5b3o49bo26bo17boo3boo13booboboo5bo4b3o48bo7bo37boo3boo13boo3boo5b o4b3o36bo6b5o17boo$433b3o3boobo50bobo3bo5bo4bo4bo49b4o3boboo68bo4bo49b obo5b4o72bo39boo4bob3obo16bo773bo$423boo5boboo5bo3bobbo47boo6bo12boo 40boo5b4o4boboboobboo67boo40boo4boo8boobbobboo46bobo18boo45bo3bo6bo8bo bo771bobo$423boo5bobbo4bo4bobboo34bo11bo5bo3bo23bo28boo5bobbo3booboboo bbobo53bo54boo4boo11boobboo47boo66b3o7boo7boo773boo$430boboo4b4o5boo 32bobo17b3o22b3o35b4o3boo8b3o32boo18bo60boo7bo10boo44bo6boo9bo50bo3boo 4boo$433b3o3bo7b3o33bo18bo10bo11bo39b4o3boo8b3o17bo34bo9bo51bobo4bo10b 3o49bobbo7bobo53boo4b3o$434boo11boo19boo9bobbo19bo10bo11boo41bo12b3o 17boo32boo8booboo51bo4bo10boo52boo6bo3bo52boo4boo$446boo7boo10boo10bo 19booboo8bobo65bobo6boo10bobo9boo22bo76boo7boo22boo22bo8b3o33b3o22boo 15bobo$446bo8bobo11bo10bo17bo5bo6booboo64boo7bobo22bo14bo5boo7bo5bo63b oo7bobo22bo29boo3boo33bo22bo15bo$457bo19b3o18bo11bo5bo74bo19b3o14bo96b o19b3o14bo54bo31boo6bo775boo$338boo52boo63boo18bo21boo12bo77boo18bo16b 3o13booboboo74boo18bo16bobo84boo6bobbo772bobo$338boo50bobbo116boo3boo 245boo93b3o775bo$377bobo9bo7b5o118boo3boo216bo23bo867boo$377bo3bo7bo6b o5bo46bo26bo43boo3boo56boo24boo22bo9boo73boo22boo22b3o8boo$381bo7bo7b oo3bo45bobo24boo22bo9b3o9b5o46boo7bo3bo22boo22b3o8bobo61boo9bobo21bobo 20b5o6boo31boo$367boo8bo4bo7bobbo7bo44boo3bo23bobo10bo9b3o7boobo10bobo 46bobbo5bo5bo23bo20b5o8bo62boo12bo42bobobobo7bo29bobo$367boo12bo10boo 43bo8boo3bo35bo9b5o6boo61boboo4boobo3bo34bo8boo3boo7boo67bo4bobbo33bo 8boo3boo39bo21boo16bo$377bo3bo37b4o14boo7boo3bo35b3o6boo3boo6boo11b3o 45booboo4boo5bo34bobo19b3o75bo32bo77bobo5boo7b3o$377bobo8bobo27b6o13b oo9bobo46b5o8bobo38bo6bo11boo7boo4bo35boo20boo39boo6boo17b3o4bobo33b3o 75bo6boo8b3o$389boo26b8o20bo3bo47bo3bo8bobboo35boo6boo12bo6bo3boo47bo 13bo36bobbo4bobbo16boo5boo121bo$371boo16bo26boo6boo9b3o6bobo51bobo48b 3o6b3o17bobo36bo14bo49b6obb6o15boo37boo95boo3boo$337b3o29bobbo7boo20bo 14b8o10b3o6bobo36boo14b3o48boo6boo18bobo35boo65bobbo4bobbo17bobo34boo 96boo3boo$336bo3bo27bo7boo4bo17b3o15b6o12bo8bo36boo17boo48bo6bo20bo36b obo16boo47boo6boo7boo10bo37bo17boo8bo21b3o52bobo$335bo5bo18boo6bo6bo6b o16bo19b4o9boo50bo16bo24bo39b3o66bo9bo54bobo66bo8b3o22bo55bo$336bo3bo 19boo6bo7b6o17boo30bobo68b3o22bo40bo67b3o5b3o55bo67b3o4b5o20bo44boo10b o$337b3o29bobbo60bo8booboboo55bo4b5o11b3o39bo8boo3boo55bo4b5o62boo3boo 55bo3boo3boo53bo9bobo7bobbo$337b3o3boo26boo20bo48bo5bo5booboboo47bob3o bo6bo54bo5bo28boo29boo3boo61boo3boo28b3o87bobo7boo10b3o$344bo47bo50bo 3bo28b3o12boo9bo6bo3bo6b3o87bobo23bo6b5o63b5o8b3o20bo10bo10bo64bo3bo7b oo$344bobo5boo24boo3boo7b3o49b3o7bo5bo17bo11b4o7bobo6b3o6b5o53bo3bo6b oo3boo17bo10boobboo6b4o4bo3bo64bobo8bo3bo18bo10boo9boo8bo55bo3bo7boo$ 345boo5bobbo23b5o31bo8boo51bo7bobobbobb3o5boobo6bo6boo3boo23bo8bobbo 17b3o9b3o25bobobbob4o5boobobo4bobo35boo38bo5bo23bo4bobo7boo3boo4bo15b oo38bo3bo10b3o$356bo9bobo10booboo29bobo6bobbo29booboo24bobbobboo9boob oo41bobo10bo28bo3bo22bo3bo3boboo5b3obobbo4b3o32bo3bo5bobb3o16b3o8bo3bo 22bobo13b3o24bobo38bo3bo$335b3o18bo7bo3bo10booboo22boo4bobo7bo3bobboo 26bo25boo9bo6boobo8boo19bo5boo3boo3bo5boo3bobbo25bobo23bo12bo4booboboo 6boo25boo3bo5bo9bo3bo24b3o22bobo15boo12boo12bo38bo3bo$334booboo3bo13bo 7bo15b3o13b3o7boo3bobbo7bobboobb3o49boo3bo8bo5bobo3boo4bo6bo11bobo5boo 3boo3bo4boboboo3b4o23bo23bo4bo14b4ob3o4bo26boobboobo3bo8bo4bobo22b3o 21bobbo16boo5boo4bo52bo3bo$334booboo4boo7bobbo7bo4bo26bo3bo12bobo16boo bo5boo41boo10bo6bo4bobo4b3o3bo12boo10boo3bo14b4o5boo40bo19bo4bobo4b3o 28bo5bo16boo4boo28boo9bobo17bo5bobo4b3o50bobo$334b5o3boo8boo10bo20bo8b o5bo12bobo4b3o8bobbo5boo5boo20boo6boo5bobbo21bo6bo30bobo5boo8bobbo5boo 5boo20b3o5boo3bo3bo22bo6bo29bo3bo17boo4boo5boo20bobo5boo3bobo24bo6bo 51bo8boo3boo$333boo3boo24bo3bo6boo8bobo6bo5bo14bo15boobo12bo20bobo5bob o6bobo21boo12boo23bo16b4o12bo23bo4bobo5bobo22boo37boo18boo11bo23bo4bob o5bo24boo$355bobo8bobo6bobo7boo10bo31b3o16b3o5boo12bo5bo46bo40b4o14b3o 5boo12bo5bo88bobo14b3o5boo18bo101bo3bo$355boo20bo17bo3bo29boo19bo5boo 17boo47b3o37bo19bo5boo17boo88bo18bo5boo17boo41b3o58b3o8bobo$356bo20boo 17b3o127bo14bo246bo12boo44b3o7bo$397bo144bo244bo13bo55bo$334boo13bobo 188b3o256bobo55bobbo$350boo25bobbo215boo132b3o66boo56b3o$350bo12b4o14b o10b5o64b3o131bobo134bo$362bo3bo10bo3bo9bo4bo66bo133bo133bo116boo$336b oo28bo11b4o14bo65bo316boo67boo$336boo16boo6bobbo25bo3bo382bobo$342boo 9bobo37bo155bo230bo$342b3o10bo31b3o157bobo$333boo9boobo11bo19bo14bo5b 3o145boo173boo$333bo5bo4bobbo10boo18bobo4bo5bobobo4bo42boo9boo112boo7b oo9b3o120boo9bobo39bobo$338bo5boobo9boo4boobboo10bo5bo5bobbo6bo41bobo 7bobo112bo8bobbo9bo120b3o10bo38bobbo3boo$334bo3bo3b3o11b3o4boobboo16bo 5bo54bo8bo5bo72boo23boo5bobo12bo7bo5bo117boobo11bo33boo5b3oboobboo103b oo$336bo5boo13boo4boo22b3o53bobbo13bobo72bo22bobo5boo13bo12b4o115bobbo 10boo31boo3bo3bo3bo3bobo76bobo24bo$358boo86bo13boobo71bobo6bo12b3o21bo 11boobobo114boobo9boo3boo29boo5bobo8bo78bo23bobo5boo23boo$359bo25b3o 48boo5bobo14booboo71boo6b4o8b3o11boo5bobbo11b3obobbo104boo5b3o11b3o28b oo5bobbobboo6bobbo78bo24boo5boo23bo$383bo5bo18boo25bobo5boo15boobo81b 4o8b3o9bobo5boo14booboboo103bobo5boo13boo27bobo6bobo13bo75bobbo34boo 10bo7bobo$377bo5bo5bobbo15bobo24bo24bobo3boo77bobbo9bobo8bo24b4ob3o 101bo23boo5boo19bo21bobo6boo69b3o34b3o7bobo7boo$376bobo4bo5bobobo14bo 25boo25bo4bobo76b4o10boo7boo25bo4bobo99boo24bo5bobo17boo21boo7bobo105b oo6boo$377bo14bo75bo75b4o54bo133bo51bo102boo9boo$385b3o80boo74bo57boo 132boo50boo101boo9boo$904bobo10bo$894bo11bo8b3o$883bobbo7bobo17bo$415b 3o449b4o11bo11boo18boo$415bo451bo3bo10bo3bo12bo$416bo450bo14b4o12boo$ 868bobbo26bobo$$895bo$423bobbo8bo140bo318boo12boo3boo$423bo10bobo137b 3o317bobo12bo5bo$419bobbo3boo5bo3boo134bo$416b4o3boobobo4bo3boo134boo 331boobbo3bo$415b4o14bo3boo466boo4b3o$415bobbo8boo5bobo3boo437bo7bo19b o$415b4o16bo4bobo434bobo5b4o$410boo4b4o22bo432boo8boobbobboo$409bobo7b o22boo431boo11boobboo$409bo465boo7bo10boo$408boo161bo299boo4bobo4bo10b 3o$570b3o297bobo6bo4bo10boo13bo$569b5o296bo21boo7boo5booboo$568boo3boo 294boo21boo7bobo$903bo3bo5bo$903boo$572bo334booboboo$572bo$$568boo$ 569bo$566b3o$566bo$907boo$908bo$905b3o$905bo! Date: Thu Mar 2, 2000 2:16am Subject: A Turing Machine A Turing Machine in Conyway's Game Life I put this pattern together mainly using patterns that I created in the 1980's. The basic design has a Universal Turing Machine in mind so design expands easily to 16 states and 8 symbols. I have a design for a Universal Turing Machine which fits in that size. This is the first fully working Turing machine so I made it small, just 3 states and 3 symbols. It takes 11040 generations for one cycle. Turing Machine Program The program I chose is one that duplicates a pattern of 1's. With 2 1's on the tape to the right of the reading position it takes 16 cycles to stop with 4 1's on the tape. This takes over one hour on my computer. The numbers for each state transition are State,Symbol,Direction State \Input Symbol 0 Symbol 1 Symbol 2 0 Find next 1 2,0,R 1,2,R 0,2,L 1 Write 2*2 0,2,L - 1,2,R 2 Convert 2 to 1 Halt - 2,1,R A P240 gun has been placed to insert the instruction "Next State = 0, Symbol = 0, Direction = R" when the blocking glider is deleted. This starts up the Turing Machine. I have put an extra fanout in the addressing of the finite state machine to give a trace of the operation. Paul Rendell 02/03/00 golly-3.3-src/Patterns/Life/Signal-Circuitry/p30-racetrack.rle0000644000175000017500000001111112026730263021121 00000000000000#C A very long period oscillator: 1800 generations. In more humorous #C moments, known as the glider racetrack. Sometimes you're a glider, #C sometimes a spaceship, and sometimes just a hole #C -- David Goodenough #C #C This uses several reactions: #C #C The glider starts travelling SW, and enters a three-glider->LWSS #C synthesis found by David Buckingham. There are two parallel streams #C of gliders moving in opposite directions, a NW P30 and and a SE #C P60. When idling, these fall into eaters, but when *THE* glider #C arrives, a single instance of the synthesis takes place, sending a #C LWSS west. The gun firing SE has to be P60 to let the LWSS escape. #C #C Next, the LWSS hits a glider going NE from another P60 gun, and is #C converted back into a glider going SE. I'm not sure who this #C reaction is due to. #C #C Next, the kickback reaction with a NE stream from a P30 gun is used #C to turn the glider around so it's going NW, and send it back #C through the stream from the P60. As far as the LWSS + glider to #C glider synthesis goes, a P30 gun would be OK. However, since you #C can't get a glider back through a P30 stream without a crash, I #C need a P60 stream to let the glider back through. #C #C Now it goes to a shuttle that turns it NE, and then it hits a #C stream of SE gliders from a P30 gun. When it hits the stream, it #C destroys exactly one glider in the stream, creating a hole. When #C idling, the stream hits another shuttle that turns it NW, and then #C runs into what would be a P30 gun, except that the inbound stream #C keeps it permanently turned off. This is part of the switchable P30 #C LWSS gun found by David I. Bell, AKA an in-line NOT gate for glider #C guns. When the hole arrives, it allows a single glider to escape #C NE, which is promptly turned SE by another shuttle. #C #C The glider then runs into the westbound output of a P120 LWSS gun, #C in a reaction found by Dean Hickerson. It undergoes the same #C glider+LWSS->glider reaction, creating a glider going NE. This is #C then reversed to SW by the "ping" reaction with a PD, and at that #C point it's on its starting path. It continues SW, and once again #C enters the three glider LWSS synthesis, and thus the cycle repeats. #C #C David Goodenough, January 1995 x = 308, y = 176, rule = B3/S23 161boo$162bo$162bobo7bo$163boo5bobo$168boo71b3o$168boo12boo56bo3bo$ 168boo12boo55bo5bo$170bobo$172bo65bo7bo$238bo7bo$$239bo5bo$240bo3bo$ 241b3o4$84bo$83bobo$66boo15boobo$66bobo14booboo3boo$61boo6bo13boobo4b oo$57boobobbobbobbo13bobo$57boobboo6bo8bo5bo$66bobo7bobo$66boo9boo5$ 85bo$86bo$84b3o40boo$127bobo8bo$118b3oboo4b3o6bo7bo$118b4obbo4b3o5boo 5bobo$122boo4b3o7bo4bo3boo3boo$127bobo13bo3boo3boo$93bo33boo14bo3boo$ 91bobo50bobo$92boo51bo$268bo$267bobo$266boboo15boo$131bo117boo9boo3boo boo14bobo$100bo30boo112b4o4boo5boo4boboo13bo6boo$101bo28bobo112b3oboo bboo12bobo13bobbobbobboboo$99b3o148bo17bo5bo8bo6boobboo$274bobo7bobo$ 274boo9boo$175bobbo56bobbo26bobbo$174bo59bo29bo$123boo49bo3bo55bo3bo 25bo3bo$108bo15boo48b4o56b4o26b4o$106bobo14bo155bo$107boo169boo$278bob o$159boobb3obboo81boo7boo$159bobb5obbo81bo9bo9bo$116bo43b9o83b9o10boo$ 116boo5bo33b3o9b3o77b3obb5obb3o6bobo$115bobo5bobo31bobbo7bobbo77bobbo bb3obbobbo$126boo4boo24boo9boo79boo9boo23boo9boo$126boo4boo151boo9bobo $126boo152bo6bo7b3o4boob3o$113boo8bobo126bo26bobo12b3o4bobb4o$112bobo 8bo126b4o6boobboo11boo3bo12b3o4boo$112bo131boo3boboboo5b4obobbobo6boo 3bo13bobo$111boo131boobbobbob3o5boobo3bo3bo4boo3bo14boo$249boboboo4bo 12bo6bobo$250b4o14bo4bo6bo$252bo19bo$268bo3bo$268bobo11$20boo$20boo4$ 19b3o$19b3o$18bo3bo$17bo5bo142bo$18bo3bo101bobo39bobo$19b3o101bobbo39b oo$114boo6boo10bo6bo$114boo4boo3bo8bo5bobo$122boo9bo6boobo$123bobbobb oo9booboo3boo$124bobobbobb3o5boobo4boo$107boo20b4o7bobo$109bo20boo9bo$ 96boo12bo8boo$17boo77boo4bo7bo8boo$18bo74boo5boo8bo$15b3o67boo5b3o5bo bboo4bo13bo$15bo69boo6boo6b5oboo12boo$96boo4bo19boo$96boo$$110bo$111bo $109b3o$114bobo$114boo$115bo3$64bo53bo$62b3o51bobo$61bo55boo$61boo49bo $112b3o$115bo$114boo$$117boo$116boo$118bo3$50boo$51boo$50bo74bo$124boo $124bobo6boo$133bo$134b3o$136bo$99bo$34boo61b3o$34bo61bo35boo$25bo6bob o61boo33boo$22b4o6boo99bo$13bo7b4o68boo$12bobo6bobbo67bobo50boo$11bo3b oo4b4o10boo57bo50bobbo$oo9bo3boo5b4o10boo97bo3b3o7bo6boo$oo9bo3boo8bo 9bo98b5o3bo6bo6boo$12bobo107boo9booboo3bo7bo$13bo108boo8b3oboo3bo3bobb o$22bobo108boob4o5boo$23boo60b3o46b4o$23bo63bo47bo$86bo$27boo$27boo$$ 14boo$13b3o3boobo55boo$3boo5boboo5bo3bobbo50bobo$3boo5bobbo4bo4bobboo 51bo$10boboo4b4o5boo8boo$13b3o3bo7b3o7boo$14boo11boo$26boo$26bo$59boo 9b3o$51bo7bobbo9bo$50bo3boo7bo7bo5bo$50bo5bo6bo12b4o$51b5o7bo11boobobo 3boo$59bobbo11b3obobbobboo$59boo14boobobo$76b4o$77bo! golly-3.3-src/Patterns/Life/Signal-Circuitry/high-bandwidth-telegraph.rle.gz0000644000175000017500000031253213140227320024037 00000000000000‹âLjYhigh-bandwidth-telegraph.rle|T]«Ô0}üаën»_^á"~ >\ñAÁ紶Ѷ©Ét×þ{O’vë–m2Éœ9çL’Gï裮êu¦ºâ¢ ©I¸áʪ¾¦‹ÆôîÝ{zvgTÉ–ÞÕʪ\0z¯]ߨñùø3ƒvëVu¹ÑŽ>ªÔÜ+JOôI”n“#­)¹¡œÙAÙ:ùäðµFZâz悌•ÚT¦S 9]ùܵZ|mÇ]á¨Ôg¦L‹ D|fÀÞ·$:ÿáV”¤ŠïƒÝU$5#Þú¡)é@nȆɘùµˆñ'…¥î™›ˆ`ÍPÕ)c®QY~1)`*”(rf°9Silع˜©Q« ±RYj¸Z¯ l5Ï"Lu5ÆôŽ~3ûgÁ‚F ÏûK&êH°N¦ü–SÏ•ŒÕ•† ߸¾Ç¼‡7ªYX½ Àp3Â3Õ8-_j%Ô‚@©Qò^5úd¬cJ.Vç Þ}^³îbï´„a |× ‘›®ÔÕ`•hÓ¡]ƒøý™™81PÝx©yöù-7æ‚XAbÖ‹‹w€‚·8Áyít£n'dñÊT#l;؉¾ Ò2µÜ¡»raŽd£qWA((Ý!yͳEkï,:Þk·¿‘aZÑ‹Sw³²7ü§¸§v‘¦§æÒ¡ÕaQ†ð§€^´]¬±8uÁ¥–HâŒS$Ü÷·‰–“>Z¾ÇþÖÌÚ36Î>Ø¥'„èwJBlW2ÿ÷¢œO0²’¦ Mõñ¶´^5ÁŠ™©&Ç^„åïîmº©uN±ÖU5‡º*N!–ÙèˆnçLš²Ù’}ÖA»ÃÊ£ ãÔF;:äÞ(2mÓd$„ÓßÐÚ Úw 0qƒŽ[%QU@é–cUÄðÍûÃå!ØrN3ÑÊÐd0P£Ï(ÉÞ^û ‘Ú0Œ‰„J¿(·X‚’&“Tê|AÜ®ÅÀGªKÎýÏšv–HðΕµ¼Åqß °”Kí'Ðt>p·Œ¦–“I’ïs{óŽy5˜ UF=>ãXíʶâ(ö~F+#*ÅoL`c‡È÷'¿3«ÙºÁ?KaÆ›Ú[tŠSÏe§æ µ¦‡Âw¡©+RÕ”'‘Þ`!Dh—„*e–;N låSlxYä÷Odˆ©H܆ù8š{5ÉÂØÜMzj@|m_»'PKK[rÖv9ÉêhSnáÈîûJ¨87‡€ò³~lÂê¼ßgrO*Ëb{ê`¢oZÈ S%Z¼pÃÄ »éhÂo2•±+¬Ïãø“ÀÁ¸ÌÆoŸúíÙhù›¾àe‚L‘é9 6 Ú7¦ªÍÃü¿2Ïü…±dâ(3PVá ‡ã‹›¾vXaZ¸ë#qöÖÏswëùèoD<ƒcf‹RíšðÁý·qìö8´*yÂ;)~enú”o:Ü+t"úý<ä Ú fNûïMVƒò"aÄþ«‚ƒ¢Ø¼ ¥åúÇ…ÙæÖƒ@tKñWbo§èþÿ5œƒc©zzU{c†.zÑV쎩|°G'ﻵVJ’Wè¼Ø©Û“øxr6~M$m7¤T+e=„€™M‰pª½ô¢SÊöä6ĂƦø7ä®…}&B T}ÃrÇ #—¨†ËákÆÿ[(ÒByÜTRõ ½<ÆÏa‹è¶pë]dò›t€ýøt‹ÑQ@e#­¶ŒŠúxÃ`tPÕˆ3òž8ÅÆÑ­G‰s$b 9}ž¼«¾™Sª¢Á):ôTL9ÊsdôcÌAIka…wpî=Øð•¨Sʦ̼ QÇ›Ãf/¬àÃø½ëObz;{y¥ÿFj=è_x.Ûˆy¼gìJ (ßé:-Òk~U›’)Ø¥æ“q‘t†§°ê³GœÓÆššâjj¼}ôW§¤·•™G/æg[З¨Âó,º™ƒr¥•‚þNRÀÇj€AÉA®¾lBfÏâ[236ØM„{öH´Ïý—1—ÔÖêîWša&2{r!øž ¹Än‘V 'ìœi„½.å$¾*„º¯HoLÜ4ž×N®IXUÄU\ Hô[24*rÅ/žrEöD,†"Ÿ¸Ž>¸È•HMüèÒ㛵=á@´·…Â= %FŸ¬}ß}c/zyçqù9u õMˆåGþØ6³£)b§4¶|¦Cäÿîþ4?E°;–|éhµf»–w׸ƤmÒ…ÉPÔlÚ¬ƒu  Ÿrõ—ôô‘qK¹Ö ÿQl•‘‘VÖÄ” qäR¤)° òU¡ŠæÛöKoq-f|ºN¢í³rCV,Jí.=jmShÆy¦™ºUmàd4¾±±P¡$GÑ×Ëè )D9†”?¾…œÎ¯(Ý&nQã)òþ\Èvõ¿HÀ)è‰5ܘV%pLÖôjíÄôgÙvbÇ+Ô7|¾TIgØ¥1ã–} 챞œU –8ŽFíShŸªž¹v2UÍÌF06&Ì— j¸„èP‘IA òz§L¡øoYKD×I¹å‰Š#£WÒºÞ¼¸äwu\óÐlZ—ѱ2§ @s ÖøÐs癕òÀÝY¡,N3nõVl Ÿ]; R}óxƒêµ9s†ôïê[ ¬[ ë•D?:ËVG­ÞùrJÈLO!UFÂØö;™ýÙÑÍ_ÂÐý5ÛGBnB$Oúøå„SО¬Äz¿Ì(@Èý¥‰šv~àŠ"„WáÛÄ_|4@î7hbÝÛžíc£z­‚œ6)¢Ò'ÄMŠÓV7DÉDó–Ÿ=i¦êŽsÞò]÷›»í.îÖPm/"Ê‘%Š)²ÔE‰Ì?õ'ë=¥óḯ¤’Îáh¡áˤšõÞIIn%»>oâ±VpÄò@æás”5x¤Ì7¥õêú¶‘Ô¤lÛ焌%vþS*¡õá¤Ê_áæ{ð$p¢S¦CùÄNw§:K/[ˆ;´'¿}Um?`Ц!“T+h: ´z°­&wÌtFhéu(]¿`Ê {޽y oÏ顽áÎNI…6ØD Zë¤w@m -Ã1™C2ßdÇ75ä6Úc}“%Øñ œßøe¯ÖþaETwe¿ê7ªVJ‚€ ‰Æœ¥£G›bÝ£ç[ ²ŸŸ×h,§¬Š­ð¢çšGe 3IøNþ˜îH—/«X-·¼*Í14Ub1¬Š„¤Fµ~à'¡@òÞ„9«¶Ó[W¡ hºe'½TÓ»J´íýb"mÝ™>ÀS»Ý:Dñƒdߣ"ûðZzÁg(Ö%Ž:.×é&©º úÌ ÒŽn§ ˜ç?V#7@Eø¸F?c‡J ™ žR«ü“1Š<î>q‘[UŒãÖÒ°:UìACÂþçht‘¶x‰JooÊPœ¿ À¥ÝIYçÓ¬æÀrÄÎô ’ïØäm©Y²k¨NÀV©rQþùø#Îv±øø ðŸs+Sz¦ •Þ¨‹ZÊ2uÛNÚô™D¼1E½ž,à"¼¿Â#¬LªÑ±€8]†*dÈÄ‹'0åˆÌÁ»ªOOøVÕrÒ¯d @~vômˆêu¤š ¨G–[w¥¤’pˆ+ nVH1A'gÓc*’z‘i\˜Ð°©u#öt·KÿQŠH~ñžÁ„{©ª§ Ê"ê ‹èŽµ-0pášx«Ó ô[] ©Çd] ¡ÿVpÎíÖVÏAìx—ö)ag/#ä€8ÛrCª~‹$éP‘ˆáì§Í=L”Q 'üûoÎCŒ¼E ±´ξøÍü6E,ñ€´S’K.).¤è²ë¬4ÂÎ݆(‡„[l×êêçm@»/a¼Žœ|ó}†gÓ×0Ù ë2d⮌äx¨¹ÇÓUæ9}äqûrÁEn§Â‹–s.tÙÒ‚N„™áã»»o“*CÂ¥žž/‡Šc ½ÄBŸˆE:.R4ØœBŽc¢åêŸmÕ1îÚ†ÒÇË}Ì .\qd®)NS‚½ÿÒWFªýš¼1¤/ ,üuÍâê°zŠFW2 · 3ÐVÍÞ¿.¹)V<“Ð'=a« Óo¹òö{ö¬iu6<™ºò‘n`)ýë—8ßu®îYJ¿Õ·A²Ú¥xÕݨô¬¸ƒÖ^eè.ÿ;ï쥃Ö4ͨ³3PÐjq3tjT™Îû Çö@âåmÈ\‚éRìné<¯m¡u˜¦U{&¦€–îä|1óÆ*¯ÂtŒºèg)›õÌ»òmÏa4pñ”‰wŒuLƒ`ùïV£Ÿ e½Nx/ÏxšNѯ×Ãä"7dÎtKek[N, d©ïçóE»§ômVyx¼œù7Íó&å Ù‡Ô­°Žy‘q3óºm,v °Ë‘´í±:(JÈc%¹øu€#Læ ‡)w&kñÕ2ðQ‡”ìÝÂãø­_Œž ‘Qƒ¥Ë&“‚r8÷®´`cÌÞ¿PQõ‚¯·Sjwm Yg“ýb x4å4€nênØTIg2Í~c|2Êk#]zBseôɶNÏ4ÜØ8±J?ˆ^weŒFf©²Ýb9#”¬9|è¬\ìq—ÿy^Ù‡gµÄZ¿šU­ƒXm·C2ƒ†o-ÕÓcµ[‰Ð6‹$bð‡‘¿ÙéZÞ|½,ž:BLÄ~½]N‚åga[ƒ4–Uå/[ÈŠ°¡r¨zA¶óƒù,ÍŠ¶}Íì°?¿ ƒÎüJùÊm_¾Ð¶NvÑ/èvó44ìù?¿Z¬£Àý&æ‰D³’ò5É»2 ð«ºΆgã ∎»õÔÁ WÉf Õ×:TçµÜÓ~5Â+\|e3¸î禨Ò4_â¤oò£Ö0°†ÖvG=þÓÉfìÔLí]ç–dI Ñ-¹üövØûÿƒ>™éº·˜è˜®’e—¬gJ´#˜^ýL?$%_“p‹Ë(ë^Ü&Àá¦èFɤ]4Íb¤™Ìx(4– «y*#]uv²Û!ŠI&}íÑʼn]{¯{‘6·4æw‹}eEä·.Ÿ7¾SêËÃ1­áãYmAâ~‰¢D[¯ŽDoKp0TyA*Ub.ƒIîïÔðÙ’P¯Æu¡s[ê- '¶×m[0"­¼_;H‚™vÞÏ”go·²Ök}„ÚG¿xb1®1ë2ë™ÇÝ»\-i®í­ghSïï·+?S¦|žExÐÛ %ðçÌ4µ»Û1©‰ç%°`@ß\þÛ1Ä;u‰Ê) ÞÁNgŸ’1N-…‹ÀÆØVojˆÊ,ÁŸhRØ‚e›ùHù !­8~ñg“œ†Î›¸=<ìK}Šö¦ˆVÁβÑÍtÙc\ˆãi/T¾šNÜ~þ¤N6ü“šª¼%›¿Q9"8>ûÇ䲂¥>Ñ臰îþç;#…éTvž¦ý’ÇX*±ÐðÎØß¬²Ú§©íë+Y ó{³ ¥ùÄ@„äÁXäë—Æl«û`ˆÒÒ·ËÙkÉ¢±Ôrßñ›Ï]å —zÿÇh?Id“fúFùxó¼]äeö—t=ÂŒxÑ>i)ù|± Réñø Е»´×ÄMH¦ñ˜P º€‹!üpÓƒÁÍÿüâ¬s­²š°lYJƒy™*«lØ!&gE²ô‘}6ã;N·.æÔX°uB!;nå öÅ ‚J0½½ÃYð*u ÎÜ,_®½7j«ØÚ…f´Ø¤àØôÚ&¦óm_Ä]ÌË ëB^éj¢ÑS7ëùX7!%(#.Xø¾ƒ•Ç([r;¥ §lòàYµÅ¡úH¥l´',—–‚"lÊ}§n6 øôš`,KãÑVò·“ç„ßæ¡ªŽje_®ëD)äzI¨I†Næs QFü¼Á:ŸÀtkm1¯y ¬¨ƒ!Œ@Ü’¿zZïÊ{ûü5Ô/Ö’ Úa…Ê&,¤Á±œc«{â½K^¹ 7>S«¡û£ðµüÄ/ …”öT„Îïôñ'ºŸÇ»+ê‚nbh¨}¸/ÑûOn9ˆÁ Æõ(¢©‘†Õà€Iê_Éæðrë^M_ÇÞk èÃyç±ûH¹Í%gcU~§¢íµ&t™. éÙñ´§ùX(fFb8B¾v4àhVÐ÷”ÓYß@Ó±ð7 +Ñ÷2ÆÎÁám?¢uÆÊ˜§Õª¯lM‡'R•IeÌìäˆë`Úiá‚ëÆ1t®@¼ îæèA¾ÔDÉxÂô1ÕÇó^Œ X>rÎ?¹¨I~·#0š[o‡“ó³óîh dHBF¼ ªŸÜ¼ ,eWì¼YuÕM„’hRê")Vù²¶è´raóAPubjèå•82/ÅY G§V! €Ë;uB-Íú3  w‡®Ò…ý9q¬¡„xLGz»”ˆ ´fs9:Æ–Ý«•i°sý¢~¸žÍÎp¢Ì!åÛR¹ZÒ {Û:”ún2¹Á?åMfß`±èNšñØ«³9Rýç‹\Ö0­KqÎï 6'Üùª‹í]L2® ylç¿I#¾Suqh£ÿÔ_Ï#ÿIJÍIs¿–©a¼yPS¹y/Y©˜¢7ŒÌ‹c¦óøÆØQë?F”Ó¨º€éôÊ’¤‡Ñ`rÓ ã%ŒÈÂñ—&ü1ÿTIÇpŸis)ÇV„Ú‚†[@ØÂì[±ž$D‹ŠûÑ_eµîO ¹“"ò|ê„€mUyˆX¾B÷ëü ’bhÜcè“øEïáÞ[íâö窴®ôçòÍÝfŒumÕ·¨ãWö$8964‚,o³³œxEpFÐæ*¦‘>ß±æ¸ÔíM8CXçü&/¿…¬¶‘šTµDÀu7Ì žx“œoí®‘¾Of OöUG±Ù^kN½À]=¹ßãè9ï}}„³\“¿n¾`h,y=w¤Ö9Yµ øùUFK„-̼<ž6¤´”¯ãåŽkSýˆòNBáì³y쇯:Š¢<iÈZå˜7ž° •éh›½¸D¤å «Ü’(tké_%ûy<‡·ŽýBò#Q¹û͈+ØÔåø®µK GÄfîP¶1qÞ «‰ÒÅûSù]ꦄÝ|ˆˆÔ›e«†âü©ÈÅQÏÞ§½±åb´#)°‘&n®>öwiM:žð²?dÕÜ ±À±C–»7Ùý»ª×„x‚*t«ü9KV…ZœWöiSVƒaÉ5cœ;]ŽSŽ8^ÀwH¯%j2ŸeJ×·›éÊÙo1Õ VE¸Âq.Ô_ú%#§ª ¦ûCÌrñT¤Ä¬—;üŒÍ?ègô¿ÁVÉ™þPhÆjÙÏ|ßcW0 úQɆº~¹8xì˜ib޾Üðex ÆÂö4;Á¬/€†ßŽL„û]“¦‰}C7CŸ§Ó–_f9+©sÍ®Dò<7¦ï ¡)Ímý~šI?ÇÚïz7èÝG1½7à!\}¨+33ÉÚ/žÆ¨!’IP–?ÝÝIÁ&¡Å¬}…f ä«\ÃÁ%pÌ:^ZP‰ÔS³²Ç;NÜR²YÅ $¶:Uãú޹¬ ºÊÂsEš]ÈH8ψ D§0¹†1솻¬-GëWf¡ˆ¦sŽBѤm›ñŽ ê¼.¬;:=µL…<ð'>q&Èj{5¶˜öƒ¤NÇgü‰æf15¢1&“KóU¼éËÙç]â.ͳÜ/óCñD—í€àíi{o@+÷¢Ïöòä6(í Û‹Ž¢—YPRKý2V-q û@ŸÛàÞ-a/CI€ªFuЍUm2ì3þŒWÿ»ò.g«9€qrVz2”àO­9–®ò%Š ¹Xê2DΗòOâÞönì‹·[¾^ñªó ÷û ¸ålÆÂÍvŸZð5Ï·ûÞ:äjª$|­6Ëœ3Øåì6gx Y°G ɶlYª½¥„4üôÄgpÃ-–µJÒÜ©­>ÒÎë°K¹D$Ø¥îF“ݤ~g‰ìînö¯{Å:¹1üŒð§¹PܱdfÃØ'ñÜ`!ÃeÁÕ~ñHq/²µÈblÕ÷PABPDòÖ~¦Û|֡ФLÛ ´­ž R³–¹¿¬ÞRÕ_¾þLd©0 °Oçtuc¾ù¼Žñ²@&HT À¯±€(F»rˆÀ ¥»Ò»oY%î¹ü5¡¤ð ÷G>ï”ósò$X´©˜ÂCŽßvIùDx?ÎÔ¡óßÔŸ J<²LUe h]¯ÿ7ÐQ|?>•…£!xgM¥€5 ”h)Oð5~Z'ÁΤ]I òhD…„¾._j¶)h‹1‹]ˆG;}Gõ1³àq;ÓVM»2ÄHpxïK˜P¢à Ï!âj? ùŠð*¬#-ö³Y§iÊ­Z·âolþÂä˜âëmÒ4K…ÉHÄÜ\‡ ìÒRµN Vž>"ƒñ` ˆÕ⡵Õ.äŸßݧcƒ1¡<„.K?’'¼tZýêãR}N%ÿf¥ìu¯£S¼êÂ:¼ìY·”·±d|é;ãø£å'±Wã{;Ñ-ΟÀ”­¡^˜º3_ ¯¿3uœŒ._ß—j®ÇMþš,w^±"n{–ñxb7C’nX4¥úüØöÉv¥ƒ÷Œbí ¹=‰„uø+™¬z>‘~ãÝÏíZPHö¸ý¨ºIPGÜõÖ+T¹D‚Ìñõ ·„ Û²à[ªr#Õ´nRAWÂ5ÚÇcNÁ~‘Üj層 ŸÿM€††ã}7+€ëʨŽþÜr°”u_xˆªÜ1üM…r{E=Méæk.ˆ:µB<~ëN 6*·Õxˆ¼é·ã‘Ã)ÑÑßìhî–ŒŠ î)…e…(€—åo§Í8‰ó-". †ÚY$G¼j°7XÁ…:ì«“GsËAÛžÖ'ã%ç5X²­Ög´û¼v­­gÄÌ $³ËÞè;™){áÖu=~µ@Õ¡w ŽÇ€3BÄI$¦?,³é&àFV"-´ED®Ÿ«Âêv¬é6‹öUrr ’eŸ¤Á\€ÛÖ“©L˜»’ wnjYfO%ŽK0ùcI)ÎK—TGò”®©ÕšLH RðÞ%Y¶©p Áq]ñ<ü³å ùšÂ6‹d «QK|Á‘tMìªj¬G]C¶;¿.ÈçMDÏT£Ç92eé©û[L’¢:R˜!{”q“Õõdçbc«e"±rŸ¿ÓÔsÒ˜Ê=éÊ:K­·S1“þýTPhïûE#6V'ÌÒQ+AC5oû¤›Uß鋚ÉP\ î*þdŸí\Î`œ’ÛvÜ[ižâ;Xÿ΋l2 Ý£ô[ý=?2¹œ*D›¸³¢€‰Š]YœHDŸ;Z*¤ðÉ¡ÌÃ-mÑ1îN<;sìÔÒç1â^P­êɆG>R°+†ÔP¡gEQaN¾rWn&A‡;<]ƒ±;ÞPkgâÝ×î°aí9gå¤àÎ:Úg†g;ç —È\x¶»\uþèoë?Í#/˜Xì¤É¬+4Ë';ƒÞ£ÜS¡´“¥"<|‚øJ0Åè¨¯É -Íe¼aÙ'B›]’Ÿ’qsâ5†€à#à¨Ö•ý‹Ö4¤ f»Cs²Šq»äÑÔûKE!S§êHaÈO+ŽR.0Ky~­xÊô_êщñ’ÐÎ(¦k,(Ë5hZzÕ ƒ>ç5ã|É.–ž!l×ð¸Ã“Øc¶Š P7]¼*’ËSI±:ý¬¤4»c–‚ðÞ Ví#ãôö¼h’–æ^ãí’jŠ l.ž”"wW46—ªôÈ8§\äpd¿õ?2ÚK`^çÄ4Ù’¦ûÛÛ¹ð–¾Ðí¡@ÙÐòì©6¾ØŠÞ ]v{‘‡›“ü±Bâ ¨s-‰ ¬VaqÞÃ'KÆb¶ã$fÏÙÀ®j& a -OìtbuË_rR¹^¬ù³—”­…„ÄYÛ9ˆŸÌ¢ÿ§CÓƒ'¡óÑÆ¿*rÇo5)½ 6˜Ä8¨!±1­XPÂËå㉸á+GþDùv*Ï $y‹›Ìp¯°í¨ï>ìM®P.C&ó7â´µk=u('•µTË{|ãyèÀ€Âbd'*æxN‘&¥XŸ¹ 1ÕEÇc²’ã?ëVkód‡%ÝCaªy€LzmlÊ/>Ošà̉üJ†{{Æ¡rK€®P´6¿sÇx‹÷DT•pyd>âœëñ¾¦™3ðÜK Ù>.qtk!¨ÔeǸužüSî‚!‚(³ÓêMÆXE޲«IàDí-C_eäì/có|;œ Àÿ—?4þ¯òžzÐÄ;+MfÜ ®8"g Ò„„nœQ“ö!E„€d)f„ì_ëe£–¹¯^Å쮩ï.×¹ ¸^1­Âh¨Ê% @zxÀ'§)Ñ´lÅÚq]ݬë0¥ !l”š«*3,¸ãJbB¡ž±‘ü:÷÷A`º¾¸ÜD€dÞ•àMºÜhC]9ãDThQlO‘q3â6bLjæêcX×!Úá³d¯TØ•3 *pa+Ž·‰'—Ñ/E–pߦËÇtpi-NßΖÚOª]ÓÍ dÝ!ü6€®j#y>_UGvÌêb*RCÄ­`¢l¨JˆaU‡ç”ÆÓÁÛ¯¢lon˜¡ú¡è¢uÛ³q®Qó¡Q=¸‘$,4ÍFnÒÑ Ã=œi.ïö›ÇVËágÊ›Å*l¶ÂVÈW$Š ‡Û/.l–¾¬qªÝGkÒQÀ*Ï'P>×—ÁLÜÖòåÌâ¶±“&O÷ú‹N{I¨¢¼Ä\0â(=S¡tÅ bÏ—ùnŠ8zï4‰¾9Pˆ è\ñ:…•Ú­ÏJ6ö¨—º°]°d©ÿXºÎä,°"]e“¹6g>Š,ÀóöuR /1jÞå~5AQÏä*Ž8,'ÃɃ}è Ÿ5ª›v(xæq½Ï°i2]0w€Ü8+ßp=ÎB¶5 ]ˆ¡˜ð醎ž?ešÞþÈx­®)­U?hû…/S£ü¸ec4<9Ô[y9aÁÁCìËÅA‹[SåÓû…<¤`X» Îä´ÓíõÂݺҬ©È©K^YØ”«ºhI¡‡ǵ^çk_QøTŽ58órt™Øºò³ëÛ†8ø®²uw;…­âLŸ4‹dˆB—rÍÌ‹#/!üAÅ@sº§1ýÆÅœ¸«˜ ¡¯4ŠüjÝkc˜x¶í¢àƒãŠª’Fïú¥¨é®ËCnÙ&‹SjËs b¬ÉY¬Y¢â¢¬¡B2 Ib˜Î~@qgŸS„¬é©Z4eð° ñh²3‘ÆA×dŒJ£n@莧{º:F¯#S¾õ\wðÃe!m°*6Û3LAwÏØaV#ŠE°œtGi¼Ÿóׯ~LUQ¼±Vò‡‹„{0‹ÔªŸR#鬂 œÀ‰£á”óºÌ¾@"zYÐÈ,yjë™IÃÃAiDýŠõñ…¨R]z& Í¥§íáxRèP\R?5²¢Ò‡TÿBìvœSöy©)æÁæ Î)~ÆÃÖmT÷ÐbÉ8tE2ªÊà ñ‘c@þøÐ !l—_~ÕxRÅjGýQƒˆE‘¿ÈêC»3ĈÀe4egnÌUsm­51°nwÞ+VÞF/‹.èÉHæE|ûøI:o¸ÌXK¯üàûÚç~®…à8pëÕÖ¢‚-͉¾¸;‹ ± J1kZÆT›¸jeG‚·†à×èÉAÁ÷Äjjc$® AhT׌Ã`=dîkŠ‘»7µ ‰«¡]E›K†…Æ")ýÜbW6ÅÕ•$=Dµ l9þ˜ç˜›ÇóP]Ä8®¨ÌTuñ&ã"1¨³òm®!ú´ð8It‰9+ÀžðáfwÍ¡+_=Mˆ4f¨7ahçÅ—‘z6ßðr¯Lp´ëÇû¼;ÛXŸáâûð[>äÉä¬uîãÁÝR:0W;v—`“+»¡­a¬èƨáûdÌ’p™5€WFM8jß‹…| žg‚K ŠÚ´ô(‡=”½ æâc@i:®¶â^ŸU“Zr;oXÜdî^¨*ÂØï¯½âš¡MÒáºïÉHµçòÚà9¹Óå}›ó©óvÏkñø™1.à ¨› Õɤ‚/eq:~À%¿I‘é×ÜÚl_kÍ¿€?ó%Yc¾ÓXà™sš.C¾üÙõ´³€@^^ظ÷L^¨?¶È&]ý˜Øôè9U ÿ5 ÒaY¥#<ñg§u±w;Y£X4€ûðÞB•¤xfÂ[á·ã]蜧?rU¼ €Aj|ºp1]Ù’lÅß5Y­À/Ò|K:'aËŸÉó™˜<Û†¡'™²‚·ÔÎ T”çI¯¢“ÆÁã ±[}ûµ»ZHºƒqt.F»4µÞã¡§üWÀ«Å e8†ùèèâ©ÿÌêär ,LÀô"Îݧ:T’دE M8UfmM3&®»Í&ƒºKéL×år¡¥YªÈŽàTÍÌÉ»`÷J‘8mzÁA˜ªl35:·ÂAM`Š‚€ç!>éQ£îˆ%èš!ΜTc¡Í EožâÆ·3êôÜtÙ¸ ?M²ɤ »Áç{Åz?U€Ì¯…DpÇóÓ¿‘θMl¶‰—öÀ—ä’‘2Ýýl·šT„Õ‡u$…%Îdïµ²<ý…ص¨ªžVw¨­PùmIÜ:\Êâ{(î“t E‹WêC“cÎxõ 8Ô7ÎZI VÖ?ƒ«^(®‰BÕ)ëœEŸâ¸¬F‡~—¸cH¬äëÄž*­Ã_åz¤ ¥mT¼š„ã¨SÌô <(>âNZO~ªS€£AyÄíxè´ŸËOÝ1E¬=”[²¿^X3åkŽ—€Ú®Í=H"j|ãçÙÏöN©DAN4ö‡"Q‘|O­éUl +Ks¦,Cy$U9îÚÕ ¯è‚Uh¾""¼ÝËr0ž/†n¼}ÍNrÍŸòN3†'„ÃÚ„oL¥­2[Ž^ËxZå4çqqµõR¨`IœQÄèŠRªÅáú°7RŒ ½XÄ[§”æðý3ELÅÓ¥Q T8t¥†‰•×&õÝ`ƒß³žgìZÐûË š`”JyPê żP¼Ý¢A®^4ˆ!Ã^•ñ«Ô_þ…8ÃEÅ@ŸÔ¡§M†ÿÙßm:†#c¦÷†!ÈuMA6".eJu÷/±h9˜}vK+Gˆ`w·uO]§Ò)8ÿ¸üû¨‡ä¡ÎDÒ@>ÅÐTÕ³’YìSš]µèœO'î€9ÛœÃ5œw£ç1ÔN%…¯±¹¨¼¡ÁÀŠñº*]­U²-°2¨9æƒIsI—}‰€“×´jK"†ü ÏààD«„{£¬?šä:#& 1˜U BxCBÚMÙ7dœÓÅ}œ›ŽTòœ“±Ó:;g¸î»þùëmÅüèë9Í+›8Ëè$H³Å¡$ ŽuÂ=OËéƒäQGÉ÷ô$ž¹ÚUf̘ ìE/>FÎÄIãÓIMýx^M„E¾¨±Z {lí¼¶Š>s'p©¹Á)ƒE$ô¶Av+ÀÅÃA•+VBh•Œ¬±5SÒs~Ý8²Ú„ Ò¹ª‡-Jð.[Geïy/X0ôÖoA¸â¶Fv ÈzQBH™p?º¶>N“·ðЏW±d¥.L ÁlšÀ‰J7Ø3Oi‡e#Só÷lHO>ù 9çC÷ÅêÃ(,ÿ ß2à9ô­âZ(Nïd^i‡ùYÉlWÎŒÉíCuQúSþÇ\SthØ(wÉÄÜ¢¾oÝ ÷…Ib¾›h桚 YX£p§Å¸BØ&j"6D½ãFG[jwS/§µCR¬îÛël¶úY¸­yµ0™Ùóˆ`Õ£4Û©ñÔÙŽ›ñÐÈ®þð…pn)3¥!ï5¢”[ñÛÂ/ôEzÀÿ¢§§ôƒÑúú¹Žëº°`øuPö`ÊÍM^âÚUºYGÇNåH5ÁmíïàŒ0Ϊv «š›Ê›¾m¯¶½øj{ßŲ*ùÙªÕ(ö@çEᣠ6¤®àõšZþä~*‡wX©ìÖLÏa ÔX&9œ™ðóY,* Grf©g»X~¯#þMi8Ô´·/€×#ʱG@ˆÑçKV^BÀÁ~Oñ#Øu"]î±$“B€Eâê~‚ Ï/,Ûþgd¢‰š–$j?™ó¢J…¨tÕ*ÿW©dŒœs™W£Ú»%JXQ¤ûeþóÝûa¦µ>¸õæ.(º‰ª@"e¤¹Ëž¿¶üxmÚæÀê5Kf ¾´A´[Ø!Þ`èã[ h%H%K΃X÷eÁ¤“­óª©1–-°bØÂ—ǃº˜×Öý…iˆ)º²kFþ¼ñ÷]›Ã\µºæ ©´#ÈA¼pþ¿¹BÊè^©-}åt‚L”·ýS·¦)$¹>jktžßSõ†ž³)IŽÞ g¹HÄU‚‰Íã0=¢[³ˆ‚=p¨ýŸûM›½ËÅq¶¤Û…Û žø!¤Ö)ÒÉí"NƒPC‘vêŽþ'³…}§¦ŸÎsþ¥G³÷|‹á̯ûÏ´;B<ºsCpÞ š€qÜàhz¶A©J†åJÀŒÎù—VÎÞ»A–‘VÀs ÍöÚ–ÁãŠkqž”dš"1`ó‚ÚæKµõË··(8‚ÐÌùJQÝAòòi±S#ÂÙ=*Ê3w hõÃhdÐP$ÅÔÙñ€ÍO lî\³r€‹ák¬§t¢(:Coà4‹B÷pÄ\†ŽÎyLƒ|˜ÚåÛs¼)ÍzJI*¡¡¦h‡‰L†Œ¢äUŒêÚ–Îo)XŸ.mO‘Á]ÜA¹l.´Ø#½f}¡m~#Èîƒò]~üì¢aÂ‰îØØ ]¢™*aF˜†•º"¸||bÕ¢ ¿·ÀhzìTM€1gœ¡¶TŠâ©@3êÓBÖÍH–éáì(yX"U®ûš•Fdsgß|l„Çsi˜ÖÑxŽ7×}¼’Õ›Ñ{N{žA·ïíÂËš‹w_j£·©"Éœ³ , ¿A^ZaÔèJH¬^Ä<ƒw|<Ýõ¿ eû^Îß1=âúH'­‰Ñqí§xDÜ‚›Cí›¶À¹9t‚Þ,Ô•Ðôr^IóYD¼Gs@_]ÉVæA©o±¥„ 3K¨FD÷µP{çÔ”š¯oš’!­íz¿GºÍÕé¥Z^ð ÂŽaþZ–´fL·!%?Û7?¸FSa‰ë5·3?h€Ò# óÖà•L ûp/ã!˜Mc%–úoÐì!]ë6†S·•}¹5ç](š:ŒÂ,œ®8¦À½\ªÔ¤$DM´4 :Èš§=Í[nªnŒ€`îçÝ49Ž*Nå) îÁæ-Ö …¦øI âElEêÆ¿QÁ¢Pd@éH](U(Ý©=®_GÛÿ´míäØïÅ©p3œÎ®Å‡;OO ¥~<[¦ÃÒ–{x[Æ è©*Šåøˆoç›ØŒ×;ûaµ=UwNõ2jò¸GY8ŽÁç‘"qËÌÀÎßÙ»jµ,¡vÉ$¶åeŒdàÙ;¾ˆ–=-ò¥ÏÝ‘¢°÷-ØJúúQ<3P^4IØÔ«W]¤ùG¸ð.‚’,IùÚîU6‰¦”äš­™SíÀv¡Ó™X~p}û”¯’´ÛµµYÓɃ½äˆé(š2¦A B Œd¨Î¼"ßä¼sDÛùûöéB$}s~˜åR¢t*±#Ca€ïšà½UšÊ}!ϧБp3~aƒô·Q×»SWÈ ÷»kpüÚ­j#SórõQ%4íýXz- B¥”e iDép-{n)‡š|˜¡é¯Pï ¯§÷ÊŒ»Dö°óÊiDNVc…P’ð™"gÇÚ6¯ «É¡#Ý;˜ÈeBÅxäbÖ5 B¹ƒ>Ï7Ýè…â8ŒM™s˜J…< ea„!“›ÎåÞl7bHÌstç¶§!wØ -fgoë;¾¸KàX7Lì/îñøÑ¯åð«óšì3s=Ev—d“ˆ¬t?Ë¿ê>)’1Bsr"†œ+ ‹ïn…Ŭh)Äg­£œoù6®ô„dŸ"üÌÒ€ó9Z#ªÑ/ò{ Uß|ËúðÕ)²…úQ³v®×ËÙ`Ê™¸·<¯kÉ3ޏYQÐ éóÕ;ƒpÊFȇ—“eˆ¯ÑMøž,^;eúx;Dð”2ã~-ÄŠîË3¨~|ëíPèGþIûâ…‚†ÃÒ’S¦©¬íDÄû1|¶Å 0ÔtíØ,‹úBÍBü/Ü›ŒÔƒ± »C·UC¸í­Ýë MùîÃèc¼fDÝÖ„ƒÃÜÄÆê³¥ƒ‘Yf}óÉßßñ0žm*q÷…ÌJoÊÞn}î,ûTC.éä—5,ÛÝÔÇÝo>?¹QGŸæÈV§† 8ôÌ~ÀµÀ´ÎÝÄâN³n¶aÍï~7CÇ @À›_h{¿RkNM[3_<³™³BQY›V‹ý¼¢c¥uó«Ï{oG!!Þôß•ãóÂïS‡ƒsÖ¶l´Â¢éL»áª\&I™Ý©•“œr}¶ž¸ƒ‰Çœh›5ÕÆ©O˜†EÃÈU&Þ~—ʸvÝú5n¯Œ™ÉôÎTì9óøëtáiˆ*Ÿ?êÎ]œÐv?öWÂãu²Ý¿íó&Þë‹0¦Hœä£ßÕœû±ªá¼b·`,ÎßÄ…~“Ù^—b=KËïýû†ðùDm û>G?vé Å!¼ª»Ï}èKþZç W6Y ÍjÊåÌv¿ á–c ˆÐÜòÄQr?y¸CPƒŠBDqjè.ÿÒ­U©´Œ‚‹‘¾[ðí9Ç¿úUä[LÕjº¼ë?¢ÝfR.MM6!ÁÓsC.aå¼@Í:ô,uGsly+â:>‹…?Šw“Š‚OÆÍ¬jÞD øè¥–¤:9†|IMØrN¨—¦e©¡*wÓyUšN± Z7ytû‹”K«%_úÑμùúŽÁZ˜Á2Ì5¿2 Æð³•WÊSÆb?=‡pgRUv&“Æi?Ü^,›è¸ÖM  øº©Í†>ž&XAæ‚«š Ë%C˜à+k¾]˜Éˆº+¤BׇñGqâ²nð¯¢:›û ¸*?»..º1å[¸‚_ ⮚ŽI^üýæ¯ÄG9·(Ÿg2˜XP½,ªäæÓ¶6pê×øºtçþ1'é,÷¸v¢X jp8aÜ÷¨c¹šÎ#vYúpF+%À·zmjvž-¤‰¨í´ûbÆ’LâðÒ€æT‘E…jTf8!Îø­àÌnÃî÷[¹6¸ìr070§Ãå[˾Bx<6…˜òoÍï 3¹(þ–í´ªÅ–,Í¡"/ÙDyFv—,–é +rÇPbFû¡ty~¢XVS8XÝ:Cê"&.²k_å¬ oÃÓZ-«ž­Û~x!òËìÉuóSˆ±yj’e(®'óMG…΂±NÃušj…wòz¢«§oVè¶ùSv†Ãe'jÜ…ûeøèvʵã1<è "ØÊG,>&ÆiçïêÊ#®Á¨d~ÃeÀQ`ÈCÒW°7§‚ìèU‡1]ûÒü邹Nì*±&¿Àd£ gZR݆F®do¿ZìÝòȼEA‘1‡"©w®þ[óE=YµÛ6DÕ8­˜@Ù`Øp’uþý,Æ[u0ö[" / H&J Çã•4H¥úTŠ¥L·¥þŒ†#wf£8þy£‘%jÔèª>žýÛHflO2É—¨ˆGå8H!Dßjr'+0žBÑ?¬c ýútäc‹éÉ?×ÃU êR\(w~ZM½P0=5iò@Xos‰Y%¨R‡&À´2r Í}‚<©=ÖtóN<ÇüŒàÃiÉ©…–ǧ[Œy%ªÞVšA9x2N¡Bžî¾ý „tOÈHp/ùù·._•S©º³PJ äŽ¢Š˜J^ÓÚ§¼Âñ¦Ê«I¤Ž3¤k=R‚ø.¡i™mÊE§h†æÖAZ‰Ãªéõ1VÓ,a½|¹[žÛ‹C€$c¥’ÍFmÅÏa5Ž7A¯­B\edÊcUR‡6V ?AŒpÎB4né<Áƒ¿ÔµIfŽÈz⌵՟7̃PÐÒöz™óI£\lͬs~” ó:z'SM~»ÊΕïT2wÖÒÈÚÈ¢ ’/Ê3l¸4¶†òÕ‡¼Š­p b½8¿¯-~“^yâ¼KÚCø“zƒ 1r|>ÈÑî3È.Hù£cÇM1=ÀfÏõ„"ûÏì„€âa×VU ÆCð·Ê•·òÊ¢…n±8FO{à Ódyé‹«{¨ ´.# >é ~è 2™¢©{jLÒc«Gµƒ3^|6U* büót x•ÜC ‡`[{Ê®.].v@ÒI;Áu<ùj=­§Ha ¼ '¹¡Oª%ͲúQÅ+ä/1fx…‡ÛÅæ¥þ®À:igí~LSk[ãwÇlébký@¨b”(]n¢…½ÖŒæ¸âR‡¡i ˜À!–8ü1ά^@lD‰GçN5'§7×ôΊx[ƒÖœ“x&-cîR ŽuµÄ?™Ÿ/ùHu$Ÿ²ée3ÓHñ—ÝÑHÎÙ;•iˆ¢2ðø2¾•{"EX¦Ëë°cÙ/ûIƒ1·ÿIùâláĹR2Ü^H7`1)QššEM‡Ìb¹¡¸ÌD{|:ÓjšGT€ˆW—i4Oú©ñ:ÞàJ/Ý4 GB¸ëeæÍ^ù«ûܪ~¸µ½sMëªvú[Þᡚ¥4E—¡ôÀ¡ªÊ_2L§q—%\ð!ǤøÚ‚˜Ž@ ¼UÍáW^‰»}ÆÎ §¤—yF‚áPA 0{äóïh4’y&D·Uƒ~‘ó= ʨ¿–ÿ‚{èÓ¨‘ñNï8¼PäãJŸ3›r\ä×Âôîö!Ù°ìòIrŠTXó+…åþO¡Í=óÜÝøcYþŸXžb‡l¶]´ãÊ^-㦵ŠnÖêxÁñ“—#ïP¬’dúBÄîip–Zhp'@=)Õ-Yåø£î|Uß'(òÔG÷3`gå¼£º;ÿgWÖ°›¸è;)4NBñ×'!ìTÀù.ù\Nü¾æ4%î«·dè²GÄâÅÿ˜‹#:—üºíNütŒ2 8Ë’•,» ,úP¨ƒ4Ü6My«Ç=í Ñ›ýX–%—¹ÔÖA$ âÎÀJö…’g'qÏý@…¢†AÙ»`Pw¾`†ƒ‡àÅÒêy}¬Ëy£NÚþdg P°‘Õußši’äðIcåþR—Ô?蛾óü&¼¡­Þi}Þi' Íx+Fw©ˆVQ¹®ß¡B&ç<›îÍGD1VEäÃuB¼äO‡ô|ó‡™8fÓ@Žp>,±ÍyÍUcu«ÓZ±BPYª”^­9GZ01œÒK"çëØÆ–í)æIžb=å#¬‘¯RKÎzCA1K“|ÿÏ ëZIË€4q×°Z¯>©(¯4Ús7¥qm –±Ñúû•µî© BäñÖ\H—ú¢È{UŠŠÍAåC±¬F?¹¶×˘¡cT%æPý'³y\à˜HÉU“—Ø[—Íå÷Ÿ\fW݆älMô0lÿ¡µÜ`nÁ ïÐáQÀ³šW™Ëqw‘ÖG—)•1 uŸ„GEà‰øÝðHAqgxÞ¾ EJvž»V,*Lìì! ÃtÛ„Ñ’‚¶âƒÜÉìt™-¼Õ–6›Ãül¯äêözh3àc‰77Šid îþßs2á‚Õl~ ¹WÒSæA»ä‹´Ú9^¾ÞÕµ±’!©ßÍtއàdÆñ4üàv@P!P}ˆB‰g(-a—G«Ï C¿h5j¼dpyæNð8RË&<1K•ÉSËòÛBl‹¼@ ÏrïJž¿ÁÙ$ ¾J³¦S;ΟШ«’Ÿ÷Xhk}o¥Ûõ{"^ Û= ð†Ïxéf`qRpåsuµÌÖ§05-V¼[nü9†Ÿ!"ï=Û…8?ùQF{[ÉSPšåú2ŸÒbGÅMñûL7[½ø²i;ÛâÌ&ß[tûç8sbQ~Ø¿Ã'šN–QË“Š¬®ŠÆ.X»1„‚=Ií½C¼¯á7p(޵ðÍKïˆJ,j¤&²hi,üöÑš—Æ] âÏ… &þ;§ø‡ï¯f¦¼›Œý1B¹¬âÃÎîé%Š` JöûùXþ„¿Ç$‚×w´Ÿ2/‹øÆ¸ˆ>9î™®?eiLIïNkÙº°MáP– ?{†jƕѿ¶óvQ%J³%­KˆV+‰%Ad5:n˜€¥Ü»\êÜÌ`oŽw¨SPàœ¹cµKb4N²aïùèÊ™Mèrãë»xùˤ××q¦M],•kZƒ®°g ûâOˆÕ„0ÖS_šöŠ<ýuÎâ¥=žô®R%Ÿ¥CöËX÷üH+$z6Éö17‚a=LÔD(œêŠm§Áq‡¾ží €)²îÔ\$Óý!a:]þSGÜØ˜xumð ÛCÝOœ*15ò Ö`ò¥ŒUyð,9à[Pšè¦Xý¤U\)P_^롪U í0µeÞ0­„ ,¬ù3nôÞÇMóŠ ûòº‡<Š7˜¤IÉ@‘*,ÐôÑT„ÊjVÄ’õNwSÉ\¤¿C›œwÕWAï‚eG£:z²Õþkó>‘aåú쵑màªåp¬›âç`4ESão‰8:!…_Ãö²Å‹qà&(ìÅ÷Ç»¦â¹N¹=õcwR:ÿ35‡éE¬a éùã­Îe1jÇ~’pçFÕbhµý9F”âÒdm6 ÃŒ@nxà:ü…Gï?ðý†ŒôékçgX4;™DÓA†¢½S™Ì’¤šTpže¶Í¤ëÜŠbæ,Þ©ÐTT¿‡¾?çfRy)ÎÿÃñ,ö¤Þ %ݦBâÄ$CéÕÄf ¤áLe“ßÃwE#ä[MÈàRû;儼@Ej½«²˜Dü›ŸR‰ÄZpZælRѸjcIÎаcØ a _ʰƒ2o¤'·~Š©Ñ›‘i0¸(-ß±ã*È §PèDš&÷QÈ'ʡΫ™¼Ï‡8ÐF-R@DV¶Ý9®Û¹ÜÌF0;Cˆo#’)„r?¶óªˆs4ŽsÜjöšlcÞ[öúÍÆ<_îÌœrKÚäÇô ”[]φ»15¦£užì©¶ ¿˜…"›,7åétÙ+_EÇ1šÚàOï"QUR¼2‰¹ôË3b§•cYä”ËÄZŸ[)kQƃu!J8ýÒHE‡ˆ9°Âïf¶²¹ÇÀuÛ§2}ûË5p>½Úa^·â1À ?wEÍÊ“oO‚÷ ïÙÊbvÔÅköu–‹G_o€ç£Õ¯©ˆgC§Iý`º‚««µ+ÿ¡_›1]*ïç<úkX¹˜ˆ½ÞÞ1ý*|ÇKK¢[3BÈßÅy`’­ô `e­÷ÍFö>Tß›NÜßòbá ›´œ<«fJH²¡PŽï‰­“u‘EÈ7S×Oº<»÷~÷‡¾‚¿¾èôw®)aë&à%tZˆ,!ñ""™òaî>„y-É×›A_óº¯} Kã½€r*2Ü "‚á뇀dåcž#÷=†!ìîö/Í¢3K'–“Ib(ò½¬)E¦?#Îç‘ú}¶·p:Àƒë|pb^],Ëònû»jê³>æ}j¾Ð"3Ãè¡a-j²R§†+ÐÀ5Í–_"iÈ­›iVÞƒi…£\ehY8÷2ç…åb¢Ý=Öv?‡Ò19àcUÁCräØhÏ*ßëd&ú|»€xÅד~ÛOv@>Íkïz¨]Í _ü+þUÎh¦íÇzÅðÍý·ÈºÏP[²"zxRC~…3€C1 ¯¾è¼$²M¼ÍK±è¢èóü}gSízDlÌO\}œÏ1/>úòMpNLÑÜk&ðÛX¾k0“iP¢íw ÷çˆu(÷/†Ï7®¾½¹ÕB(•îŒí,ö*׎Ó¶L¬Üàá:¨Ç4Ò‘yÅ ßîßé/või¢eJü y/"MsþWN~áóëN6wç õàADnõ:š é|R»o2¸zÇpŒD%žRÚ[Q¡ÝúhÇ ¹ªG;Z6ëk“%W“ÓMûŠh-ž}úÀl±6uˆJlÈ{ªÉc5½©ò-„U§š3Gç@¬ŒÊ'ÂÀ =9Nhã‡ìîŽ](åõ&ƒ|Þ"Õxݬ¹unç-”d geaÒ¶‹£E‰ÇúDr96ÔÄm¹z÷¶lØ£›Òå 1’Ý{q•<‰ãgõ¹úëÓÄXRó³< û›Æ*jÞÐémXØÝW™èzLÀm*3Ï‹$ÔÂàc(ê½ü\vô™’š= hµ‰‚WvÏš\Úže6k‹î·ã z¼`P«<¿ÊU¸—sC°Zšâ& ÿ¡JÎvÂPˆÉÞväÊÕ+’²˜ËÑcÄ¡Gx,GŒÜ í Êò,,[ ^Áê.æÙ¨%cH‡æ ÌÙ»‘%<®O< “fvÄ)\ Q½7^Ÿ„å€Û6¯íûtÌ9ô5*\LåÓÈž­¶-^X"´®'Wʲ<Gaµ ë–¼++¿s^{BršÁß½y±Æy:;*½Ëx=Å£W×'‘XS~ uý´Ö´½œfJÙJuÚOü‰„ƒ¯‡fx]þÚ0—c$ª—–Î#4>¡äÇÎÙ˜9}Ä\È“ ¾kPj¼ö?¨Æž.ÝИìv]×dd/TI‡‹G°È“ºã·î3Á_SÁ“n–´3êÓýd®ö2hj“>`Zƒ<Ø•üzÝWlmêS/q9Ÿ2’5'™)³fÇÕá݇uvþl('ÖKÒÿ§ŒÂ]rî ­ÕçÇðÛ¶rü3¬ËåÄÉ,ŠÛÌ“&ø`çÕÿ½ h3€»â¬ã¹.ÆÌ[è¿í–À^uÐãK~g™éׄqœF¥3ÕÃÁBâ‡o±› ÛÃ8pÒUW_–³5æt—µöü! ÷ž=ÆS×EW©6'•€ËÐK×G„ÃÛSÐχ Ü«p&>+5»/§á0Ùêq±`¦~¦ w’©']"ó%«FáÍîûSàÝpÒØ›ì`ØûïI4q ©É‡·Iæ*ðuþ6õ¬fƒMLÚ=æ¢\RÕb«|û úxƒÀ"<–1O÷S(ov]ÀþZÆ6\~veXÚ— ·Ñ6ÕUè$z^ºªJr|iì*ågŸõìªÆñ& ûÖyæFˆñÅ~NU57ƒ±9Š}-p“$‚Èüšl¸ÔޏÚbÝÜè`¡Ì[ÈSG±xHÁü­>Wºâ1D·‰Mˆ|Ôj!ðxT ™Â­ù½£˜4¡Eµ ·»O«ôŒßyKÝqưZn~[™’ØQo 6×>åô÷|ÜqÍ­Æyàg±ü!nóäKӸ߳¼ªµûA\FÊcÕôcQ¼V¨‹@Îñ‡×<Í6×!Q½×RäÑOòÉL< ÆáÍÅYXìwÒÈLJü¹ >ÇÈéwØN&q‘'s4ל“¡p,þú{:â#)BïŸKÚ•–@omX1ìà”–£ª)'FJÔ)ÑÚåYªfE÷ä:èýQ§6ÅÏ^D Â=vX˜C_ù…Æy’Ú÷¦Ôg5úÜ ÃÝͧՋÞçŠôè-QUØz „9/8¨ÕÕ4Ë4Ur}ã.ˆ0¢]¶©%”}Ï᥆]ÎÁÕü»ÉÀËøVØî`q2µ¤#ˆáüZTî ‰pƒnÚYFŽÇv ˆ[C3ÜVQ¬nð¢óuþTî«æ¿ÿ æ6ypF{wküû°ñzM_K¾µ'cºIq4W‡°‘ŽMÂõqàÐ;âqúb4‘°lb³ü×:om•ïIÒØ½¡äÖ"ó ¿ ĨÀ•Y¦ðÔ<ÓHTNa¾{eìDO‚š}ÓƒÖ©2§t'^˜*¿é”ßYÔ°Ûí &h4]n[tå/›òØñ¥& ËËŽ• -kµŸ—Ïa–{3•Ù✑Șžô´G3–XªÖõ™Ñ•mhÕmb@í$þ\6V±[ 1OR®‰ ol¼$禉‹ºÐvmªäê™Öz â*ÄOïü. Ç£â¬G¸–AÍëGeŠJ~¦é‰à8{›Ú54¶g1cFö8ÀáqáæQ ’@½t꧘wÚ¾EqR%õ™…µØùGSÞ•›wÇ×èsxðÇ-88·•q.Á‡–x¨±ld²ïYýN$ìL‹šÙwÍ—¡aòHOÞ¨ Ÿyú,C§" V,_Qå °t¨ÿ¦ë “¹q{scš¹BN‚ËsÇé¸[Þ‹Ô,_rpS\òlc¾·ÛË0ì#-ÿµvNRz(IfÜöáA9\q«hú²á¹:æB‡N!©{즒÷Nû£}ü^c:˜¼Ç)«b&fß0uú¦ˆ 3CATkC¹ÙÜŽ-m?µÔ¤ï Ré¿(¿ûFîáT'Ï‘ó9pû*ƒDTˆEó§=ñò™h.²^ôR\Û¸€þ¥þnq°(N½·q¯‹ räx(…óhð+Ï  qoŸ§$±ºgü­ßËëü#é5&áÄá\êìæ`5'>êŽüYå;xï†og:¾‹o%øÞª(ìóVd 'vвƒú ºWQôì gtDèáD›]sÏ÷v z< ò¼Õ«»±íê %Kø‘$à$º©_ :Ft%L]³±÷Äž¬^Í~oc§þÛW&!Þ*øâýaè#U4«þ'MGMt0Û $V'³ä'oÉè‚GtJB¡’梭­ìr/Æ”dÕ¿ÏËíµI)yŠ…1t¥\¤«›Ù!a€}Õ5c à›3÷?ifš³Š_Ó Å>ýˆèõˆÙošø€äYùº¡•K‰ÇgOªG”€{ûÈlξâºS'i—£î«ù-¾@ GEÂï1•fƳHa&ìåŽUõˆ´X©&´—ümß°hûµa\^Ú÷ŒC5Üu›}Мd’ǹ‡J##Î-miNí‘ϳ<ÿÁ5Q"®ƒâüÐ1Ð`3æëàƒzÖ­W6VÖE¢fÐÅ×¥¹ÚŸÙ¬wKY•p­´¼5CBx˜Òù–®V,‡Â§ ¸u&Ÿ– hÇž ÛÚ.BÀ™~öÝQeth0ç"2c]Ϲ5ÙÆJR1ßÚÚ©¼Fû,ŽÔ/zL`Y¨Ø£cØi1:øöå8äœ{mL\œ@ÚÛqÕ\§ú4ø¥þNµÄrÉ+ÉÙª$Ãz¶ÕÆLê¤+}Œb¨iôÙ=n°òš—Nnïx‰~"Ó:‹ä SÖ^šæ×ݶ1Õa›¾ÅJÈ} !þ` "2N$7ns¯€!æ³8óþ*¦£»³­õlÄ• nyk[´n"òò >ʽÐ>|8Q¸åʄ߆P÷ 5®2uâ¨;›1éŸgo¯i2(Ÿ9MèGlBמaøtŽÅ…k ¸kšN{g“›»scÅûzrf÷4.ƒÜSN& tœ ‚^þIû ˆbu=%g-o+WYðMT¼hc;ãh]¸ò†L¿¥;wX!P=¶@ XÑ'“¼~ß‘ì€*ü?G±¡e•O†Ù=¿"»>Wpsµa]Ä4š"^w6HI-O7ê” Ñ§Ë')tío) .)Ž(öXß’å1¥Ðç”gðg,¹ÎÁµÙ¯¶üL/(jc÷ÌíPÓÓ]=õ®n&¹E»[–5ÌX[ŽF뎪&Yy,ˆ4;~ŸóHÜØÒv,GÙ 4ËÐàÁMŸH¹ì¡ÎàndÀL™€ÿÔ¯_ÇôI]Ã/dÄä¸X*d˜›=Ûh @ÆÙábå[=EØ¥bü ûô}ìKvˆ×ïWád– šnB‘¤ï"Oëh°HLNµá¸ªÓNnx*Í6€|÷»>`ÌVbüjÐä¿©z|DcdÕ5Ç2í§æˆ(ûœ„cì `]&îMüKW÷'P…ˆ³TÁ›cÉfž!Rm8(k<¾¿€Ì;©¦±ÉÙòÐ.dÄg-”ÚUÖI5:¥+ت¢LØð†ôÚX0«Kɬ Cjá?Ä ÕåùƒX’ÌýPlé™$1Qïz&‹Ös—š°aA¥oãŽ)0½Z@³S’ßaì©2Z\“®KM姮ВP1ϵ•³ãÅ?³æî˜ž" CUÔbPë$"qÖ¾rqŽÞðØæ#Ô/è…¹8¥P[íÄó0"°ÃDðÎ/ÏiÄÜÍMZKY%Эtç+êÏÈŸ¡æXï%#ä¿Î¼ŒÃz£P¦Ÿ¦7ع–œ˜,d ‡ôjb”haîäR aä¬Aøú‚‰M¢8L}i<ÂÚÞF·P7ƒZÕ,㽩ïȇuÑÑnÊÛÿa-»5W‰@óCο5ô*!PÞ$kÐ$ TÀ:ŽÔ<ºÈJb=düä‘Õªñ˜êï»”à@˜¼w «o ö^²yX™¨Ü(À •›vÛWž8Æîw€™,Ú)¦­~þÕµ‹ Mß­ÓCm¹Mat»ex€ŒÇ‡¬þ_ ¡Ã4'⤣+±â)ÁEïíŠ*SXÏD}ßÝØTGOÆ‚Jp„ûÎZP/´E“džÝ°ÝBÒs7!Ó…­…¥%$VH’8Nwb MÆ0™nàÏKCk>ghhð›ÆÁnÕmö•cêð~¶À[®lµ¢qøòdh`UÎ5'Tyâf–'MF¤¶¦6KÀýuÔ#¿Ÿ17Dï’Fò…&v=|®[&¾ÈüAß|NÄOÖƒ8xüS¸õ­ÑµR*Tõÿ¸žî´×;Žé‚œiïh^k¾ï™€é‹tDº 9‰Y"›­È»˜EÌ ¾ùáNt y”þt¡w(ëÐL¸†o ¢øŠGÌ?5™ÉÏíTO»>¾võL6Ôï–gßœ°±#ÆGôtì¢RÝ ‘@Û'Ù´é»hÁƤ@š7TÊ{Úe ]Cû}ZìÆÀì68òeÆ’š S¾Ã˜Öë;åCz¼Bf ª¿cðݳ˜,LæaÿñTIƒ•Ía36yvRØÔ‘8UŠmÖsååäû‚Aq®fˆêWí”KIB Ù}ØÄ š•¹üb{ŽÂ5sæzìòYµvÜbúÈ¡œÀf^ôWŒ à¾ãhïÓcÂEåšX!á¾I¸ýÎpúm`[ûÌÑêHØ™ô+qñk¿Wù D:fÅahØŽSÍÔö$ã1læ”WþÜ.“/ÒHÅ9.ÇÅ=!TcXe¶¤¶E‰ }ïô÷"z}#“`¼W9®õ”öc¶»Ã ú&=¹£Ü zHàÞy.~ö"H¥ÓçÏi¥NEŸnž+ã³·#m0Ÿ™ñ:.n ±ýo7Th‰O` ŽêSâfyÝi"Fv*í[$’¿œõYÚÝõÎ;29fŠæ±ÄQŠž¡$XÑ—,ò+IêÐH8Tœzšw_¸À“g$§™2¢+jTÖ~n9ƒõ£{ò%_sÏÖHÆ$¬¯I?@h0u rL¤±‰{ýV÷ëEé;Åï×0j[³wµ¨‚ž<Ü‹Ö2L<Úð¿PlØÎÒøŠø"`2©Î·^Geq&OÅ,Õ¼&ÉÿÃHûm&€û<±*MM؈šp•m‰Êæ˜;+ûXwgÜ-&¾Bªòxpt©D.0½ËE=ć ’á%=|î~¢J¢@(…óNRëþçþâˤ’Bn}yšÜ•@Sb|X¤LÊb_¡PÃÀÉaåžkÀ½wQW¨¬¡ÂŠŠû•o Î|¼/‰ËÙŸ›‰Ûzmj”S­ÊuE¦“Pö zô*xë"ê<³^>x²@&5´°\ x¯x½ò”˜F\+0çJý J‘0(¡ÇÀI#¨y69¬<Õï¦÷n;K¦ÓµûËô!(%øÜï4'Ÿîô*’üàaÂã=Û³Ó¢…£jõlÁØ@ez—‡mfìÌãÂZb9Cë^zþ£ŒPO»ÀŽxÜÑ•àaêûg¾‡j¦,¡€u¦If£Îð—p~“s€šÎÞ=Œ(hÒ…ÞB¢L¥B:Ž‘êý+¶'ó>{Ñ|Ͼ=N²!ÂF\Oꜩjlsã¡™¤5¶—ü$—RˆgPoçµ=ØøôÙ¨9ž3\¿&‹àãòþl¸<”9jûª6›¬š×K¬Uí³^ùÔÙÖrÀŠñL9Âó ðóÌ+ÉŸ 5•¹` ;öµW†ŠIàvRV'.™‡giœù¼2°U‰DЯ‚jû³/à5Ç”&Ôõ¥ªÃìásc㓨|“c³NÏ-i Ë®wv óãÁ&?G5ý$x¬'§“ϱºª£UC¹å` A@kíN"Ð ­Wj‰’*îУ”Ç%KŽcŸãTQÌ…T²lNóúÓÅ5¥p ,ÿ™(eü‰|F×Cx¡LÁš^’FSj;Xgoã÷,¥uT J§{lft¾Ø…ùôO’¡ÿcJ3wZ×¾yð4?!{¦i£v³S˜§à¤&AOãuÙ¤ìå)o&0qnBä‰&Q!"&p]„LáÜS Äá)ügŽîÌ+h–íj@¾—I P—¬™B?.ªúä:åS“__Þp²1®•ýѤJ¥Ãh¢¦úB¼¦³ÞEtnjY ›)”<‡’&5šm¯à‰ÐsÉ–ÊþˆrÁx¤FW¢ŒÚâ&DIK<Ó]³&ʇ„# _̽«¯BÊM‡#ªûÁG% ¤ÉÚéÂ}#áqÿGZ󈿯íÐA"µbÞÜPµõ”iPzþ·&.K×eC8Jv½†_“V”œŸ€^:–‘5 þ%EqS­œr8ŸN= ·B€‚Â1†ÆqþHiâ2!n­öBIJ½Õ±!“15ICbd>¨HÌ5ϵëª-û{zl"f÷kzf£©@£)Ú»™v’{nëé?Ϫe õ?a6ãžýõtŽ:›™Â€™ÚªÙ»d´°„rˆQ }ó’‹>m%¶Šß±N§»á/mú±çÇÛÌrb(¯í”µhˆ£dæ5VrhÜäΫ³?âNg?cg$>Ó†u=I¯Õt †ß@x[³9Û”iìÅ;œÉc@¾ »]C‰:?Ž™Ú»†vxÁøÅqk;¾ÔT{Á¬kµ\C¹>†eé¼çÂ¦à’‘ÃaÉyŸ£X#»z,†éÖL"¥LªŒÉNçÆñ£Üq ¦s²6Ú"N!Ym"XšUŠ„V|‚1oªjTª!—ß—Âù5¤ 'Ü£I„ióÔµ¡>54z/:«¨pºæ ]ÀJ¶N*8tÒ*ï3# M!åE\dßð;8‰{Ä s \‹¤eêóð ’™Ä.·kh[ ´ æ3%Ír*¾Jg¾ãŽÔ+FO„ç*e!P—¥²Ö¯wnë@î™)ümô‰ ØS ‰ÚÈ0è=ÕÔ4QÑfrcÕlýbï­¬›A¤f̳è?1ÖÜùjÔ Õ„Åûå+nh–c³µ'>|ïý6ƒóRu1š_˜P”Z¶ý‚Äæ¢°Y@)Ùq‡ ÑÇÈ¿Ígϲ9/¡ç¬Ò0¿‰¹¬‡¢/vj¿К~¸®g—Wû4ôÝX”î0(”LÚ£;ôRU±“o)ê¦.ý{ü*û3%Kfo"ІhA‡k ÉÒ¬Ò—¾cWš@–åýþÓΑ–,KƒâàJ82ÒFZ…Ž~tÜ2¨# ›ŸCQþ¨÷2i“ªÙSYÏ€dVW– þMŽ{¹€Á”MÛl¡gÎËb³Åh¾ÒŠ#,ù³z£zÏÜŽ6” 6Roô»và •½‘1õÎ`ˆ1V¢ŸÑf_œ²,ÉØu Û6ù™Ö†%Q¬-kRÙÖšÃK{RU¼£ˆ>/kÑDpQ€éFI{ ¨äFË›k:#°ŠëÂ>Gþ%Чd\Ͱ'&¡¼¡å%ý|h¿¿u®2ÿ§ñ0ߊä$‰M84v«éïl|.ó.›|_Î0‘“’ÌZÚìÎ"*Yø8h-¬/×xrÝS³kÿ=#ÕN}¼™Ås¢'³à:kH´ëÎôìö+íÂÅÁäÔž¦Ô®š”*tMä’¶‹‹køwsA™P.çž]Od ÕÕN¤Vê±A÷éP‘<±–>¾& áÆWˆ¹ÿœšÝ%îp@È=–ƒ;ÔëÓŠg"ªfÖö)ý«ú ¨Šœî]·­‡f5x`Þÿs ¹<\’c¨ôºs"MÎñŸÝÅáÆ¡‰5²4)5ÜÓ2vKcUÛÿŒÓº£´Î(î€ëSü.SoÈj ûæ'GÊ:™ãABnóÎQˆà‰[>QÎì”’öã´—?.±ÖE%±‡ôµÚ™CÌœ˜­kì;8ôHç-C-$I,¡·'ô ²Ó”1Û‘ük`˜Zf±pl¦Bíò$ŠÈ,$ ]Z¨¢7^%Øém~i¡Lîg:#XÏ·ÄÅ«}«Þ³DáÝ5„wi¢È¤ ¥éØBiZ±e©¬{±Ù˜È£Ã]¨ê3cæäÉydóÕj¡­û‚7“x"Î+Š74–«$¥ãšÌ¥évvœÔ°OÀFV Ú©||uPצà•aõjw®$·ì¿qMßÐjBÞs!AN¿Qø¬6ƒ—¯<ÛLeªV^œ5ólºçiNï9½;4‹ DÐtÊeÉ–&”:z¹C‘þ…qI%¤¦ÙqÛýÐ!Ö ݧ39M®ùs¾Ùu,wI¬Á9;)èSdžâ x'iŠyxTGXŒuâÞ¾¢ÞZà.ã.uþ Ø{¹ÁÔãðꎪöÙùØpÃü'5Nÿjáâ‹K—ÝcŒÏ Å„®4å\Õ¦‰KÌÜ+bî ¨ˆ³PÝý…íaïSÉÚblÂQÒ¢¨îÍ#PvÚé]ÉP yž×¦¹œ®ÒeF)5½“<–V¸*ï=—-_¹ ôˆ0;¨5CsòI0ýŠB0=(ˆ] ,!©Tpá‚+U¡4vb†Wk7ÆY颥ÛB§¾‚ûììp)kÀ5oW«Þ€›‰ t2¬H–®!Ŷ{Œ¬ºá(º®X´!vt]»ÓýµÚ‚(;v2à[T¤ŸSœNqžI’‡HÏ¿ií a^TÅBÝ“•±+€F 7†Ði¾@©öN“ÄÕåúPQó+âógŠàO^˜§Ö¸2B “+=3àÙ«(|Õ< Oš+t÷Uä"< âUÆv(&ˆ¶96›ôâƒ7jí˜xT¤Zäº3[é²8NXIÃú~J<0æ¼Ì „&Ÿ¡ç÷·å†Õßê>½kJMè®Bxš-šÚ*+§v¹?¹ZójîÄ~ñ@ç'ãÒÄvéàE<®wøb ½£æ–TðÍAÒ‹Zé;Õ¹á]¥mrc|-¡¢ok—¯ÌV!®tf¹?”)< »æ ÝOˆZµ±~DB¾â ñ˧ûÐ{K«9–܈Yî è0óÆzð“æñ¨©ÚÑ“Uq)2t?="2âD¸ÜdÊ»=¿á#[ïæ6Z=Λ¢} ¿]ƒÉÏÄ Šç7êž÷,Qu½Œ[ïáK*©ìmއ÷Bަêe¿-š8MÕºáôü J9@`ˆ7½›«ª=×*+ªà®É¶MÙ‹Û¡Ñ·&DÌ?ßÝÙ¹˜­®d–-û3¡»Æ 1žR‘u1ô”SQ(ææ$«n5¢¯’CÐWNA‹ŠÏ¬èó!B1Ôfƒ5N[wL(sè-5Vïþ’SK!åÊŽÎæ)̀ߋÿ-&gšwYzµ\ú”p°È[’\,‹Û0R.P'×h‹)­Xçzò‰g¹rxW3>4îÛ]®˜íf‡cVVÀÃS~u*ÅYsMH›®Û1‡€RÙnͳ®GBk¼{žÙë—8"$ å–kÝל|‹[åI3÷´÷mÍ$à:°WÜöˆGš37izâA.Ì¢®™Òr6”O.ï[óX#97]‚@¨“תJî÷iÿðX¿`Å.)’ LŸË‡öeíŠ`ÏLçëYŽë•xßú¶õ…¿8ŽÃVtx¤wþIذ°,A.ÈÁßßÝ‚íyhÊÄ~p;¨2–!P¿Á‰¾¾¢’ÉÒž0(Có} D£R†p³¿ßóDëA†+±Ùýñ?¤ Ì ÷ÊÝGƒè†]¶Ò2yQ7~½få¢/þ;Ñ\V/”/°ùK€Ÿ@ ?eZ˜ÇÄÍ,áDa¥à°áC¦˜O0k¯׊4#rΤHémµ#,¨m‚¯7b^†r×'c]ífQÎ=¨ýç>éqë óg.:M¿NÞ¡‰÷g²ò Ûp97’M ?ž4çÏ&6AÔ…¶o#äI?zxâ•z@:NÑE-Aê´Wμ:*ïÀG”-Þ•º&‘n>6)ÑWÍÙ\X—.Ä º5Q‘°”Ú˜U)¨¨Y‡ÐÔ%6Dwš¿{ f×WB¾±íÒqÇßz¾Çá˜àìô€l>v’¢Þ=µÔ yÃHT&äZ×uõTÁ*r¨ÕÄ  j®$æ¬1 ŽïHLˆ©Y¾'CƒÝŠ —Šð 0È |EÜFzÁÈpÏ-_àO'Î ëÑ$ jlÌ)"nر[ŽÝe¼/+;sÊ¿”]Yrå6 ¼L àvªÜÿ/5½@’Ÿã8UIÆ/ãñˆ Fƒoû(fÃvI7I‹8«X¬›ÐÌŠUj|©¶ ˜B^„]ù‡à_ØÇù‹}\‘Q.8: Þ ŒHÜŸØ›Ge¹¨Ñ[Nuÿý)~X¡»²˜‡JS[[º¢/yëb$øbÿÈXªjŸÊ'.)¼î9™ Y%w³ä‰H­ˆ?pšQ‘+ì¤K¯.ÑÆô# keçÏÛ¦H®ûvT²° ‰8%¼ù¯ö²IªªE(*MÛPÝÔ¾Ä(à¢#ÏV°Ðª|ù::̦¿!JÒ¤§ÂM¹Ä ‰âžKÃþé!§'MÚµ$?¤.ŒOëÒWÈëX:@uQKUN0=‰uX1iØQ¹Åÿ“‚œËµ¶MAç=,v]Qäd»‰£\µÞµ¼ÕBµán4ÅøBo¿(gÈÜá0à=› Ì#Ä1•¼«°œY€'‚С¦)]Í˦˜jMþ•% W-S'” (ãrãëê¦Óõh¡ ƒÐ“,OìíUj‡üðÇ‹[g\”йzXfP&o˘¹ÚeBZqŠ  |]àËiæ7µûýØû˜ôN«óZ¼bíÖÓÿ‹•//gL[á1xŠeÒ“>˜o+Ÿm!s¿Ç&+"€çÔ4Òë"xË?HCü‚ÆŽJ2àÒ©yŸú]ñ$È;ç;ë™ÿînÇÆ“®:Ä8Ö”²Óftè\ ¬ldÓó¤tÓÈ>ŽÄ×]V?PâN ‡Õí<¾Õë£K+ÎÁª'r!_¼yŠz^ÝÚL†J)Vý¡Íª¡¬šZ×^Å×ñ )Q€ ôòyu7ÎM*WÀX‹[Í„£…‘!ޏtí!¤„Ü6Í|•ÒaÀ²ü-‘lòž+´j;—ôèh:Ю⚗öÉÒ_tI”Ç\è—3ݨâ¶I!>£a¿¹ .Hœ@Náæâ”N‚³ð÷VômÈuŸ¶Ã+=”—˜Æm| [ÏúŽðÇ´B¿Ìõ Œ}‰°µþ ¯Ÿ9•âÜÜ$¾ÌѯcÝØE“·’X*®ì÷¯ð(eEa»†Äîa*V#2¨ªmÚ‡Vø®ÎÅzw°¶òî:hÛÒ÷}Ñø3jtôÝÑaY^èÆ; ÷Õ.tÀ^Wy®o?Y_+øî²¶É!ÆÎ{½­[!$ý›Óoß„ÅMT¼›QX où…Ž+_ºfî×ÂÅܱüáfZ& ]%­¬²‰¾°µ¶<_¿ˆ¾¿´xTpꄘ¦`ÚgCœ‚ySãza{Þpq¸+7²Èï,l矓m#üŒœ`¸ž3n%}Ẋ4MöFx«y©½Î¡å¬¾’záCGlÛY¨V9t…ØV]ô…mÉ^‘=áÅ«wyqþÖŽ¼q±nFô,âs8„´‚gÂä[: >©ÿÐíRï·gª2ÝÖ‚KŒw·)¡Õ ³úÉ9Æï|'‹ËyÑâm%Â!&颤³Ö_¶™ÐÀ(N(þ­ i,9ßC^Æ&„ù[M[+"P«Î`€>•ÂqHPõ˜ %ò©ã¿TVú'±mä»ÙD€Ò5ï·*oéÎ6&îÇúĶ|Žì³”‰U½ú`xRÇ¥ÎÌéðOôÖ^î÷²Ò#€xÄcô{·±[T§È¨T°>Q&NUü<ÆÐÆ«Ju—Ùë;WL?'ÓûøðwñYËóÀË6ðŠOòû"©§Eðä/ «RÞ zè<‡¢ÏŒOZϾ/Ü+y>·é,ña=†“*H…“mÊ3y1µíqËD³G ƒÊdå·”@}j¿Še[½ñJOcFGÉ®¹Ž’.fëôgO‘õò¬LPÓ® xZÇh ~M´8ßq‹–Wå3Ïúõ!]gÜŒŠq`ÄÑ­›©ŸÂâDj0Ϥ¤ø`‹nÇ Ž?ˆ$·–:¿kj•7Øq<¿{Èjß &·Mßd9O$……'Ž<á@É—V2¥®fB¦5)Y¶¥Æ…ו„¶ñsb¨Ûb\ ¡ÍæV}:¯ã&éñ ÁWÄDvϦ[ˆìdÆõ!ÕŒ—þkæNfâj}mÉgWyKíE­ÿêÏjý=XH!µ«±ˆ<*-Êà†ŒÃÈ ¹EoyÓ­ˆÃÐðð€Õ‡¿Ò}Tè Oü‘ÖÖRbÙ9ŠÔm'j§“ý r2®î¦ÜóŒàñÙm~žQW™oÊô‹?è,›-„,øJ§z¯úw3§…ãii/¤Â|¾}jkœšKa4†Ç—‹Ts穲Y¨PK»/CYý£­E8‡g=”é,5ø â<X¾Ø°È?²"ca‘@DlìÀQ³˜î‡kfiíýØzat̤G›MuÊ‹»mÃg b”LJ€Ê ;ÁFÒ’‚ö¼i ‘"’ÑŽ¾w¶¯)ƒ1ýpᤵV Ö,)2.ÎK»ÅëƦQ¾4èÑ>ß×ꙥ…-zßšxÉÈi½6IgBºY‡h=d¤snPj¹”ÞÔÓíZ•d©Ø½Vn õ?§Æ-^õ­Ÿ›ãÐ-‹–¼nÄø•šõˆZŸsÕ+h-7Œ›è SɃý¶…ðªmvèælÖÈ  ²K3Ü->ÌãÕ\G¦…Cº«î¢n¢ÌB»¼ÁëÔÒ}GIífjÙŽþ,§7ÍQ4ª=,^!¤Ev³swÆ÷¡_þÙ¡ØÎñnªi(Pw²g@¢‡i*ƒ§l!êC5\¸Ú¤.£›#÷2(U3ÝÞ)ô+î>¡šx¼ô·çÇæ£`s´D¦§Û†M„V]’Œ¢k­ÇÉâ|wÖï”Ôû˜rÕy%‚þðð2S<‡ÒOÒõÔ /˜ Æ!åÕú¡s"‹O[¨!nа;(Ðv¤Koœ?ES* É£j:›ð×à]™‘ÊŸ‹X·FEþ¤áÞƒ†Vå0ª¤¨ã÷H_zµ9„0 ¿=ÏëØæ­SiîPþU׊zŠGIÊ—3Ö0,.œ†úouy4Êh h†®37¾[·Ü:\Ï)½§9Ê’$ö¿ç~M¤#Û ômKiT£LÖº„F[¤Ô,N„"£=Z 6ÎÑßï ˆ%t?ÜÈy\]ã¹o5V¾g…@û‰°òúFR«1m œ¿)«9dsIËùêLiŽžYOÓ| ë¯joÕbX­´o9Ê|"~º©É8¼³J úà;Ñ„Ÿ/¤#%<æ¦jŠ:²Ûgg)Ÿç{Á~ ÷an,GŸQŽ0Iyho"<æ¸üz"j€’µ”Ó Á©«y÷˜¥Î-7L‚LŸiAò*­ I}C!GáE×Ìú%w-8DöÊ4¯ û¶ù©gµóEmôòLσç.—Wœãr)¬ Ì=²ÔéÕ°ß®¸üì\“ ~i+!zesÂ_GqÈ‹cDMá’išÛe¸IT¥®¼o(4@¢õ‹ŽØÞG±s øf Ìë÷0iÚp‘¹V¥“ïÊMU—pÏ!(ÁZLI÷AˆÜˆOþ²=¼§²tü­‚Èñû¼æœVBŒ=c±Ú.iÎ$G 'N4€ 1ø¯ø°M+t+]a‡5è’7üÊâ"ÓÈÇ[ Ñõ…Z/ưS>zã›Ô+n"vôýˆ—èS _œÌÑÝm•Ëæß·±÷v >“… 1b[è-[&ÉoOâI]¤ƒþÙzkzšÜÜ(¼­èýÝFm‡Ÿ«*ux¿4wE-> Àu%Á´õÕšR%²šo¤ÀCN‘Ìí«Ž°5öãpo›c! á6h£(p¡S*·¬£naýÇÑÆzã| W9܆hùÙ&›7©ËÏ-=£-PÁ1ÿÂf-QôÜqž7ѹêÒî¦E«/¹BÉöN¡.Ĩò9ª/uÙÌæ–T¤‚ /ˆ©._¨rÏôù‘÷ÔX¿uOñ1îÍL<Í‚3ý¹±å¯÷c~Zk·×yÚxy^Y#GbSÜ4n«eˆ’˜,†%ÍcM7x7Þ‹øè({?!r¦µSÔ©‹çÑ+÷,d܉é²ÄDøk¡ M°‰„ÝñqëŒ÷4·ÖÍOs—XWlÖÑ}KÐ<úÊXÎ/ô èÓjp¹²{Í<´è„AHˆ î:¯ðä=¬±Ý ))¢Ýív‰V„ÕHõjS»úèôl6¤y]±h(A =Zôp©<· ! Ì4’$àÍïU:s¬ëËœ¥ÈÄT˯ …ën/†©Ñ*aæ¯HnsâäÕ‚0õÁÍ@†ˆ4…Bl-¤õÓAâÜ)-¹º¦® jªÀÀdÒÍŠ?²TÜll51À¥Ø¿ïcì:kC8~ÂaSlÁÿÙ¬…]RÊök&Tc«ˆÎ1n®.µ ìÜIª˜õn\æQlU‹r“H0ýŸ&59lÕ#ÖM׿ýGÈŸ»…CRðr-§‘Pª2ƒS‚ƒ- +,~,¡×Ñ¢Û\iŠÈd ŒÙý¥6º­¨AF×·)œÌo´š.ÎÒÔt½ë|]¾"Èq1ÐÕXr5àŠ—+¸¶H± ¶„ÒÛpM )céšeSÂåéâR#Ñ llkÂv«<„ñ4u„·h{˜¦˜NäÇÑ‘só¹-G$ZE·ßI?´nX[w†j‰¼ãÍá³%ž Sq3ü ›ù`ÙØwÐÞEá`„÷ —àï~éŠQ®Š¾”Mz’{»hÊNé–­ÊUìjÊóú½¥_dо„ß^7 .úz­Ï×t ¼ÞL©¶'«l^âÞTÜí×¾BT,YV’µšY‰´¤š‡´U&*(ÃÄÑÃ|4c“Õ¢è†-Û¾½5v–Šó°‡]¾ÇÓ#§¥Ö»‡:d|c᜷jy<ÉWP½§½cý÷¤°Ö²ª"ÑñW¬¨±šT–#ãE†kÐÐ%ÝÔhOéY®£¢ÛÜ–§Ù¦Ø—vplTl\ä9Ÿ=ßîç¹*ýÑÀDØw0¾Âz(Ì[Gñ –-¡r9-ZoÖ_ Æëk}Œ,ÃÁ ) ÉŽûÔá˼…[–.^9!¢—)p.³:äDGðÃ;–2%9B'!¦OT=hp§íø¶¼šÉK’‘Ú òq®ªFɩִ4–òV›ð ¯­jùÇ0µa¡2õsÏÂÔøn1Ët6Ÿ Ÿ¼¬|mÛó¦S±ÿY× ‡ÆßE^ 2 =+ÃÁàJ»“$>Ò)ÞÇðX¬ƒ$ÃíLö,YÂG±ÜîŸ}ìw÷]ºìA²¬Üx.–P÷°ŽXv¼¼5Mb£.bHLüpÿ‘mm¨ñ5‰ó./Cäžž¸°ªØýƒ×Œrs‡\ªEaÁ:œ8À‚Å^ î1w©GqjYæ9U#ÿ,ôŸz$1ÍãV*¡Å}«–„™çáaŒ„á ]î¢ü;•‘#ñŒÌ1 ¹1OˆSàìÐu,pNŽÝËïævÓfùZÓiqÏ»c”÷õ¯Áymcð:~¯m’Šmá_×Sž°™u=|€g–Å.ŒPÆf¨üøŽF…,š1nu~²E†éS©ªò($@ÝB¦8•Õ• *™`œ‚»VjSݹ¨qȹ7)7—íׯ†hÞ&¹ƒ\ìîŸì(kéÇßûܪÑTZó°]h<æñÔ= /ÕìÇÃ)]Ûµx–¢`:ïºÅy~+ƒƒ‰D=ù–áJ•ãŒi¼/ÎyÑAj8Ì4þ¬¤L…ˆ½äÚùÒÝd8nMIs°ÿB;Ô>o¾ôƒ9M–Žw>¦þ¹«ÞlªÚF™Z;ö»þM¾?ßë¦T“y[wÈÍww²×ug`ÿÂë‚JñWžÒCì’üêi‚eЇwË’,/ ¦ã´ŽÝG3=rÉ&À:P{ &¤ë"çNö*†b ·8ùŠzÒä}„Â|°¦ðÖ q•â¼À$;àëÁ>K1—ÞS¾¨†iÂõaß?†pMDQ;ã*½œŒà:vZû¤³às}öÞ+µZ—ó¡³CEϪjw²¾ŸµX’¹}Ë×ñ ß¿WmyZnë˜Lõ¶U£„Ö M˰mwšé•~- \`bi{l?ŒÿľŠì½¸ t–é#í÷të¥Tu1¿ÑÇ»ƒçO‚_0hQ„¹^c £|ö¸ILC¾M™‰û úÓ–ÌÂtéàµ>±²FžA}>X€-ÈäÍṵ³u4x6­v>qÔ\G_౫4`lHâ4Bñ Ã-ƒþ½ä¿dÌ/`K6L‹u+¼´¸ á¬MUŠôõ<ª{æ­þBå¤h1¬Aø _ÇlRxı`¼þ³­-Ô{>[ežó1O¾«,(åÀð)H›Tk€i§Ö 4¯€ªë]†+ñ©î€ºŒUX\tW\j»JК0ןŒøtp¿)V:ºì76¯†.%»°*¾ÞÁ6‰uPÈöV…µq»Údw‰åó’Qíì?ˆ:ÈlÃRF³XDt«y†æb®ËÆ_BlXdpcÎüW=˜8Uå‚-4èh]ŽºÕÀŽVãˆ_¡Úlg n ùZ6Ææî’9a_¤$OéGÜbdóѳíwdÍ(©ü‹› ­ˆ×f ‘òJ•¹tœ4¦¿ Õ}‰ËHv¡î‘fu÷”GEw"v€È™. èYÝF˜Û2ˆG9$­š}Uë˜q"»rØiÖý’ãCÖ²äç9FêL ‡å‹Þ^Jì yšö¦‘™£ÜÌ£Vw˜B7š’3lÝ` êA—‹¤¯øçò§w É,*µ7Ëô¤Ñ1¢5ÖkÄ[’AMe¥¶æúECNOØçÆÓ2¼ä+¹þ.(f)“Ë™öد%Ìaì[`Æ}îM9ã~,Þí¢Ò@ëš%–Vm!Ûâo«;ÁQîÐè“»¾9}IUE¦‚™÷J|žTP˜fýJIs 1·¬H5žJ'úÐ^Òæ×ên&­‚O¸ui«3ÕEŽZ0“’lX–p–*W¯“ð¦@Mƒí+rk¹°ƒgž¡º—¦ïF)øxܳמ APï–W.Ðf ˜LâQ72˜tЂßû8{“ŒÄÒÉgɳ9CKS N}Mp õ|…ëNôïÙM.Eðì§Œyz¹"kõP,ÐrÉ‹#¾ÂPü{i¹WÖ‹c^ñ›ð¡±VFÛû«we ¡¶c´DÎ)/Ú,H쀄"’t]µ_¦œÇhŽT%çmüÔ²ÇJ:ËÔu"öò‡h4¥›2óÔM ç²®ŸÓrùlD5ÀÉ´¨>³–dê®k™Ò¼Y†n ¸ba¬Ú•tE/¥ÆÃ°!Ty?¢PÞŽ­Q8¾œÅÊÅÿÁê®, ãÔÍ#xâ…Ÿ[(¥+5=xë‹Öó¦Ì{¢ðàð?x¡êÏK(<ÖÅ„Ï{x,‚jzÍ9—y#éZ~fÞPëÑÈlæûP™¤‹&çÚ6%\c=ZƒœËµ¼Õ}ˆMÎÌÔŒÅÌOÚ7¯Kx}¹Àlʨ¶<Ùۑ󞸳LLÎôÊ©U­»èʤ=8`^Ñ}ŒÇÜ^yF p=°z± ?´íz«W]%>Ë4û/¿©ó¶±rà/_U³˜ŽâþkÚÇ‹p¬ßf™&YÍAF"ОÈ%>UKÁø®Ôf„o°ØñcïI°B=~wêAüsMÞäÒǧ@'º³%6½=”pTº/ûž«´2,ˆÍˆ˜të›LDsä¡æÆ²u¹ ·<תô8+‚¾ª‹5€¦sÄÆ–#E*„žàÊÅú&f ,A¼Ö+Uj:VÕÕ5L`&">TãÉ´ZaÏרùÀÆ9/ŽÀ窸¹•>Iö×Àj¥NìR¡nÐBé_ѯüδóªí[DøÕ-§Œ*öo5î®(ÀYÈ:xÅpY÷äùÑR)Ì_Zˆ›\Ì.’C ÎiÜLå²Áû l;ô<ª HùŽ€¢óëv™,)[»nâ%ŽqÓL‹äBðºóÙÍí^n¯Ë:ݤ¢,yæåÒˆå[À½¹Æþ>ŒJû„Pö#e ~²vE×zWÜ K¦+.«ŠTnÄå^²Ç$œ¼VšÖ¥V {|ßKÕ/‡òÝ8Á“o_láÁŽjÀEöàea…”ÆíJ8¥îЇXb1XˆÓÓŸßÛy1ÝrOð—"Þqš¡ÞyÏïVg¶„øY&ûÿÔ Ø -lR—Þ5i,Œ„=ÑXe¶çºq6¶«¡y.b;ŠÓ`3Å鵨~wò]%↹52 ‚¸ Û|pýÖx‰³¶SP.w!Ø=‡`³}Ë/Õ‡¶<‹æ96Sò/˰ß  ç4ý€Y‹¯"žÖ@{ ƒ‚°0Êa´Á̯O5Åà›{—yV.ºÎ$áuÒÀòŸ^_²€ÂîzÚ§ˆ&Šl  Y™Išø7â)íHG)m¤îÙ$RŒYrxŒCJ1Ÿ3óÛ.‘ )f˜Z3†Ù‚î†e4¹äNP,xGRV{WÍŠ¢µñÅÕr2׉(9fѱ™Ò黋ù™ª«9ë‘ç¼Kêý¬c©8Ϊ¤j2ŠÕ¾*\¤q¯9¹¡J-X=ÝžaÍϨ¾ ÑæÞÌ…‰„G@ª&í­žp4WÕ÷ÐÝ ÀZ./4j¼Û¶­’#óÁõ€“u?j"³÷ÇÄÛ Æ7δÑòL-^O|jšÎ¤_µÀ1/DÈŠ†M=ÒøËIôú9S_)û‰âöp6¬Iu±76ò®’{XS#±,©îèV±Ò>b±›b³ì‹Â[­_«ž]®³”KÇÝe“RÉDàùÝ<ý#Ðó‹€­]Sà]c%»ÿõ’­û}ZŽ"FŽ¥³ájU£äütX<´ ž•pÓkí1ø4ôWQÈxèž³¸Bê¶ü:xÿWSm© Ž„x8AúvÍSÞf¥‰ó¥sóS̬Q3$bÝ?âKwÒ0X› á$ü‚]wU–4È)˜£Iê¥b—»ðá®ãH˜§Õ[¾=æð¼@°µ²Qµ®ÐÏÉ«æu޼¾ˆ5ÇÕÎ,¥îG¼Ãg{à‰§W›‘‹òæ¨xr×'ÑÙÄ*°ùϵ{†ÕrÄQ/—ûúxq‘lÝå åB*c]€)ÀaõH) vIæÅ1£œÜ"ËÙ/Ðo ‰m™Ù‘) ðît‹wG<ï+B¡JmœJFfSÂ<=b)¢+J0q’¯Øw®æIGfZ,ÓãƒYÎkrrÑðsâ€ò‹;™*o@dèû‡‰èKFÐ0RÄ£sã”3êO™FEUÙK>é½N`,iT—¢úHÿÇ6‡Ñé0îJQ‰áëÑùdbÿÎwRqÍÒ/a•k;'Ü<èpNÿ°wfIÒ1¾’«T‹}.Àý߈Pæ'Û44[ðÀÌ ÿÝ®M¥%•Y½½q—Ksä¡õ¨KØ#¸qd°ÒHµf¯h{f#ï¼y7'o‘wê<•ðL7=µÇkKØœL*"\~3Mz-Ê`‚IA ›¼VŒLÚ4âyËŽ þ3ì0Þ5H§&Üxt@ðHE†ó-Q*³Rȸ fÅEÈ8Ì›n¿Š—r&Ú~ÍnIWåÚ³i6áµN«D2— …/[ð¨q»ïqÓ¨B}f°ê‚Â:þ¾î¶ü} N"÷£¡ÕðI=M³”'c¨«‚P;‹€r&Á uã¸lðB†‡F²RGÙ<¾¹ 8…ôÿ’Áéª]ÄÌC·È•¢J®J1M´˜Ï:µóÝì°4 ˜ŸbÝ,8 ‰Où<ÎA[N@ˆí¶‘éÓv\¼;9E‰ûö8XÒ:*´ÆxP‡ZY…‹N±@»çl´Ž«m#NÏaÕ´"Ž¡ôŒg[–õ-$î÷#ïÍ4”ˆ€Æ2+w_ŽÍ¨2¸‡·DïGzTÊ{i.)?¯ò$úC¨Pwð{äÍ©E¬p·6)šõy'¾u‡<á¹æ>°ß«q cÎ¥Ú9‹®4dÜUöÙÀªMr Q½q—'g‚„+ƒ86´meKôÅÜ¥^'ârŠ«SwÇ$`}9{žG‚ÎÏU;ÇóG,´ÛéCiº€£/,ÂiU_'7ƒVªZ’^Ñ Çe`Ã8ààñ(h­¼ºQ‚AZÒ¥_îÎWJÝ¡š~ M‘]ENªKOŽNŽL÷ÝòŸÃ»AZo†]IÈ34 ®áÆ)ÇgQOœ‡ Ó/!ö+Jb˜°"aÓ g+£sz¡Š'^ðK§áN¼ª¨~4 Ó”ÎQÀç°¼r"ªÜ<…qéÃr›—äd‹C¯‡ZËZ *g…V‡”…‡ Ð åìy>È:¬ly|@žúÁ÷ ¡5)Ç€ŠwZÚÊs*+÷ ›b˜_˜ëÛ ®‚Lrøèò©´§iAšÀh;˜¹Z?”ÂÌ€u0S¨ð%S˜X€=£«Ûñ¥ÎŽqhs9º‹Uí oDI˜+e`Ar ¤¾Ú›¶tµˆ_½kÖ4i*†[ñ¼EÊå¼·xí#䈋ÀL>‘³®l‰_$qÍZ*îìšQæx§)G ò’t?¦·Ðû;ÿ5Õ ¿uí¬‡Oò_pì7”ß§²„ày™®jÚ Ø ì3÷î4EÔšÜ'—Æi9°,7â""Dõ-qPe1ò¦!EÍ;Wµ+Š®f³[h³)ÔX*“àûÐëEñš^(b1h(}Ò ¦eXÄ6ªfyÓ}¥øÔ‹*šhìcÞsPÒñØ€s7p.zþ7jø…(ž1-ÎÆ cÚ¦¦ùëuêAµª" P52øÌˆ1ÉÃ@œ‹´åäoãÑ*Öâš—È!£SmYŸsª—ˆ~þ#Å¿“6:T:”pŒJ :WUIó9Ó½xÁ“ÕQ‡vì |^ K2K¢8“+¯z!.Zu°@Ö£¤ iKnACrM»ŠVZŒ ûN‘'#ž|>ã) ^G¡›}LH¥æ4@m¸ôTR_îÝuÇ(kFPçKî•Æ€jÎa«1‡!Q-Þ‚»`CçÝ'Ë«S‰.SËíÓ匭`|ö*Џçؘü3È1OžTްÓ]ÀŸ]$ïäºr@ˆVuP¯Š‘ã§¡Ô‰$`™ƒFäç/{0á·¥á/ʞ͋tjO­R°3ãªÕÖ©kï:=™…)1ú‚ýº)Ž)o‘ÂÏŒh7¥ÀcÖöghâÉzŠKîtËCÒÌÐÉ‹j?”ÞÌI—®Â¾[_f~¨CC£ÎQeÌ­yÇím†Å¨C0öÕ6V“8ÆJ,Vçòpß{<ìhø8 ‹€Ù°šNÿoú Y/ŸÄ@w”• ­dÔª´¥üežK&·59=i-½î¿¢º…—·WOÄì}ÔaëÔ´á‹Ò¦o$·mõ-Ü} Ñ.RF‘}|3“âRuCN«캽‰€ûö OâËt¹‹S­ yñ*6þ¬tiàê8tS¿‡«õ9î¹ÙïuÎìš ŸCõ ޱf«>–=zsn½+l{i+#œ´_^`·ÛIK3,©Ò"t6kŠ:d¡âM¡K\$‰dª:·é¬ýSìçÖN âÏ6ÂH×uìe* €4jŒqTx4%h~"â=*¨¿\Ôx¢+ü*Cƒâ cÅÍñ¢Xô½ò¦WJïœëTର"à´Šu'u ;€óR \ù>‹¯ªh ÄÓÐL>enðL›n*ð>̈Xy›út]Á­V¹^ÆÞî+k¾82B=Ÿü06§Y„Èàòt¬‹,Ef°ÑiD–;Aõ3Õˆœuƒu®”Ë)çál×Çp)̇z&4/̹®t”…ñßPÌŽ¢ÖFpðªÑ’'K絆·à½³úüçÜ]MÀ虌 ‹– Ôs¿&ÊwR¬åƒÔ”$äž ÇÿE%"WQâ§KC³ uíTLªÉúToÁTÑÆqKÂˆÌ &É­$?;‹€Bø·»ÈWæ‚(Ñ%få¡Öù`ˆÝÆöMœœ³ÒJMŠ]ý"UÍ'KóäÖ Mf’Þ„´iܹ 9Füj‡åÿº¡{í.Æl’¨…†úÚœ šO5úäXÀǦ¬p&A DZ¸gõ‹»’2† ëáxWÝ7%ﰫǤ·ÑìQÀbé¯>HEe™,ÓÁ-.ô™µ¬æ7Î+s+yéÕ…ä¦[ÈþžÒivo¿r±á›Ô‡NÐN®ÂÃÙÉbz0M—&¸@ÝÌÙÀE‘í:ÃiµÇÜ%£rÆ¿¢Ð6?  d. @æ^†é ί­rÃÐ Þš°a·´ë(ËWƒÛ‘ã\I‘Ùg`‘ƒ»ijùÏ /ï·i¾œvݤ|y ¤NÈ$U=)“âu²š•FRW<3Ô£ÁæU]y™ÅÒæìÌ‹#zÔ& Û°Í­k%/Äû~ªçzŽ;¥éw ;\<@‡ÃXÎîåò‘Àèåi/e`ŒÞ]1ÑQNªiªŸí‚‹^‘âUÞÈÒe;õ$©a{a/¼íq­éœV"Ã¥$kŒ9ÚË2ÔZŠâÔB$‡»·µùâÊ4øôrÙM±7˜X=‹N)Ô›¼€KιF­¨|ûÒBÒæº¼ N ƒ)0jTôð/ÐdËÅ¢—Óî‚Bù;´áI‹^°¥9»ü2%r(ƒ˜%h<—£­Eèê-äØîÁØïü‚WGÖ(V;nUHôáJæw~ÑEyÏf&)ŸÑêXêR‚rÔògð&Â>{ñ„ähß$é7ìxL`_( ŒnX6{å6Ñ4™…úû1HÚp)špPn^'Zò6¥"åö|_ئPÏnQžúCLò’Ȭ›ïS úÂÛŽ†¶Üä”ONëcµô&òô·Œ†°ŒÝT*‡í®±@ ªQ55ÓöÐgoÖ$Ðá:ú‡¥(n‰tóÛ+5ý+âË*RJþsY¾;BOg7=0¾ÔC¤MÇébÑË…«kJ½ÔÄÏï´+õt—LˆPŒ†°xZÍõK"Ç!ÓÓlwûû€J2BQ°!½›P*섌n©üÇÛÆ‰OˆÔ5O1²`$ðû»;ØÊÁ–b:u·!¸ ¨U/h“‚dW¤xó%2<Æ ÔºXùör­°_¤Ú($ö³ib£”"ÅK ¡’lÚà½Vý£b®M.aé9£ù†ºÏŠ*‡HzðMé ±ÂEÙ9ên°—Šø2´AÞ¬{ ¼Œ¹£ ÔM£ÂÏ<9Iõ£©Pà³JQk‡Ý*œ®ÒUÊ}?9)RY•íéƒ 0no(‚æ“.š d8Â?0î|ظYïÛõÈÝ()t•*±ÞêOÃÑÇS]žFùöv¾}˜× ?0Îͱ¾T çE¦Nf?€J¤ÅËsUÉã½Úg$®îBø³#Íiˆ•ëï–‰)-¬mlî1/ƒ¦¶¼P› užÅ¶Y¢ìyC­EöY\ýçŠ"~Jσ¬;zuØïYl{ŸÿÞÈáûóŸ¼ô¶ºªä¾Å(5´=³p'b®‡UzcËö6Â;§CïìY>Pï-L&aÝÎ4H­‹ªªðÖQ9¸)¶÷v|õD³hÈÒ«2±Æ,«&P1:iç-âɘµìä>G0b!È t`ÐΦœ=ǰñ¹ý¡Ã…Áb^~r([%,ûM'gÈH.ñüôoAMRóq–>+Å9ëg:;¦`!s_6çæ»Ïqa`4hcºÂQ}ŠA}êOÝKÌ@kãU!ᘹ5®jg…i»g{lä98ˆî>ÿeE®ˆ[iØø`ˆD3WÊ~³'º¹·1ç‚Êÿ¤ž·j–$(K¸O7`#æÔÍ©YF“ Ž¡ý9—Áº‰yx˜ô® væk÷Vâˆ`Έ–½Ÿg†6ȼ2—¢}áH »‘“1_|—Ðäг0g÷%ê$´úD*R2Ì:îLÒÃWÙ ¢mtKh,fݾ#2¤U ¿¢¼Û® 4G.æš¡ÄÎ K2´¹i¶íág“î×(nÔåK<Äî´È¡EŸOcڱʀ9"6ü ¢²þ8|j¡n›ïpÍ÷üˆ1¡ ¦”;Æ©íéaÑã ©&LÚÛð¯÷ž°éæñ.s¬`„>ä%ŽMªøNâ2®9vš ºNŠ:·„Æi¤zhÕàrªj-„ g$ÓVyD›ÁçÂÏBÔ¾FÉéÔ²O¬ÖÝãµÄB®-Až´è—ªÃÛêŽTžT Ú™¡Žç‰Œ­Zù@óòÃø<ÍHþ6Cüz©ôï{Ne”®üI÷p·— Å&æ~ µ yèo$ ¬Â5ã pÔîT‹´rÙ…Å~;µK––:a3 \Ï“f5w\È(‡ÕÈíüRî9x2°ï‘—C=sIJoºéí{:qzahñ‚£À… Ü*»q^D7Èi‚“Ì–¯Âðùe·«¶$šketDö˜¡å[u\« •« ±›âT¾¢É­-ÙÇãb!sºa;]Ë"uÚx@k¸8 ÆÂÌú˜9½¾l·B´¬Õȳ}(¦'Ù°u(AlE­j1B¬¼äM^g8E¥u]ÄÄ.*(Q%â,½¸ƒ®Í€b&Âl;Ù!e’hÔ|*û*—'Ç›Ìb­ “ T|ôœ ™;z”~àý;ׯ¨Ž¦|]&˜ŸERxTk2““3°€Wdígb`d•(§ëL&~ËÉÕêJá²¢­—Iœ%œ1º„Ž’C< K…!ÀPÍXüºŠfi¥&ê*è]E˜üåI —QÙ HOø–ÇÝv’ÚWŽ7X™ÓÂôä@]EM}¾]UÔÐL¶Ð^8(fÍþIw-h”ãmtÔ'Sd‚Dp/Õ)ûµÃì^À(ÿ’ãiÇ'Í [!qW>rbÊw$Q:8)]¶ 霴ÍCÀÁaäð3ÁU—\rs¤èÐ!G™G¹iiæ¸ Rgò@±ÒY"·*hrügi…ªHVÁH‰áÛÑ]Z)š÷[~¼]l}“BBΕñºÎPFR†Ä>kyÀx•λ$>:šWbÐC 7à”ƒ:?Ý ˜•ÚÑmlbÎã0TæÙ@ôkcÀ¨vw‘s HΖ U‡_)^n¹uŽD@Îw꺟s§‹æh.†(øN‚Ê;M,YkµÃú43ïêºÍS¨%¢¥U+·/·œ+8°N'^`4^ØÍ¢‚ß,¾6å‘üa`f`‡[Dà1ÄábJ?)F[sz¸ajÝldàY‰IáZ­ $ò."ê:ŠMâzUìIh¡÷”~^°$˜cY6\.ƒ* ÝPðѶ€Bm†¶Þ­›p‚a¶#¼\7?O8¯Š–æ¶÷oüør±™ÑœœLÉáÛoBIÒ5¹¥˜ÿ³â}ÁU.µªNsœŒgJÑÜ-áãc:yÇ­z¹ûMq‹,­Ä '3´Yïäf‹;Æ—ËIÖ;)p3a—8-;ÕiÅM±é>te•ðWœøXÑ_k 6»¢f£×…‰÷¤œªÏ©‰`lS*gíã™ i§\ÄÒÕL”,íÍ'XËr?s=U˜Îqf #_ø‡´ééTšeÖ^`¡Ãi£ÌãKµ¦V Ø,· ÕÝg†žÃQr/d·$,³éãZ(‡/áÃÐp x%†Ìb+Û©-«B¼&Pa—f0³dæÁ› ßìJTN7úõÝâ¶ýdÜú—· ò3<ìÜ=(¯Ö¦Ù+,憮PéÍõºz‚99kA{ðL"X•|Rˆ.1a ¡m ëAVÜLú«`$<èë4ê-I¦™Ì¡·¢þÛ¡ÿ€1Œ²ª"q·–Úéy+Â7)öd¶¦¨©úp^'þ7'¼ˆVÀVîõI’/OÉR^J=,¯ÿ %åÄéO›¬9åb¤i@«agŶ/ŽÊÒ?P,\ôcÒèN4Í¥¤*–8ªÌ¥9z‰qjŠ?ÿ š³B½ÿ´ù«e‘¯êöÀBW…†ªDÕáò:ÕU36…™I­†1¹’„˜"cº{eÝ-·Æ±?ç}czíL¿ß€YT6Ã<&öþ49Õ¦#ÃNµ{´ääF ”žæ*‰„Œwev-ý©¢=¾ +°3¼kLZÜ—}²ÔÃ3@×î™-•ËÖñ8Ié•hÜ ?X¬Sñ&Ý–u†@¥Zú¦ƒù6 ¸ˆ+(,e¸¢Œhï¿T¸…Çøä÷´ÐûÙÚö޶ɬè+ˆ–›b‚X1·AB¨äT/9ËH›³éÙíÂÿ„ÚqÂE­Ò¶ÜS^¬GMÎÆöÎoƒxäր쑰¬*ß^ at‹´ôý§½'I]^ðNZLq ùJzŸ6Sµð™_Ò® áXÀB»íMµÌ™_ý¦³ÌšU›´M~ÞEEÙÖ;zÈY–kšõ‹@•+»º±Ñë|¹»¢q5œHx^Ýy æ~(_Û¡Ë,O»íNÊðÕq‘.v§ŻöSa1_ó‹XY’Ùoî9 áÄ]á+^%mØ_Žó3߯í¼|'(T–z+qªâ+»€y»Dd¢Zê·ÚæØšöã©§(¡ÆlÔÛ3äÇÇH €º;nååÜuCG3ê €,ýüüóý;fËØu,ˬ+7¤o–Ð_Ù€6§ ãâ8iÑóO¬Ï¿×Úl¸Z4CŠ$ùØ‚¬‘[F¢Y“,^ê݉ΧMöqG&Rû¤aå«Zc?ÖG±µ2šŽèÜ7J¨]öØ#§þû¿­û•Oóñ°£¼š ±Gç/·ãÌ•ÌÉÎÏþÂ9 J©—Îé?Çixÿ ½ ’¨ å÷?ƒ%»ßòì?LeX¯ÂüÊ[ð†ñõÙT4ý˜Ø·@;?s]*PBŸìú+hxÒ¡K¯|f®3½0” »6©’¾±*2)6õTJ µ€“uÔ·”ûà'$«ÕgR}ç¿î1_¿ÛŒ“ ±Ùù–-​|è¥Ïi62GÉàÙðÓsî!LðRÆùåceãL¥í¾~ʘöaÖýžöëS]ºøò¹¿5XÝ÷¡faï­çèö—íÿ1S~mTb±qÀUË/Àãj±¾?ðo?îHôïŸ_kVAÁÙ—uø¾ú¿=,—àd JÛ÷°UFWªºSÝ8šgãßnÆÆcC:3éÛ¹«jP"£û-ò<™vŽ9™"Úã[wͫѮ¾ÏêÜÛÀê”Iߟ?ÂízÿSÎqH<îX°÷ Árñ툭Ø?ßã½|ï·ù«ßœ†?ùýÿóü¹ç1†ø½àÎMa¾=g¼Ç§‘àûO<°š·üüþ¾¿5ª÷ÿüÇsÿ#Wëÿçù|ž?½ƒßóGwð€çÝø-Ÿfýù­ìzÓÇVþ3¦ZÓó¯\öÿÚóØ!Œ§—úåqþ‚IÆ Ë8ÙǸdíÂÿþò8oëû/_¬ÿÊó|³½YÍø}Ö÷Î˽í)¨øŒºÿÌfû2ª?·+‡â·Ýãõ¢ÿWž§,®6ó—mü{`çû–ýnqI²eÿ¬“à§©-ûÿ¢ÿ+žç÷xÃ,û_ÚÊ<Îwø·½aÞç·S_G †èï±Í G¯Ðö0<Ô`ëS§Ô ,Òg–ZÈg'¾AÛjá Ž“ö½XîþR mpñ¥–×ïší~R6×El¼Í·_ ðB&Þõäi*X€>Î-²ù 'ÎÀûqtñÝÆ•-m÷³çÖô7žX“؇%q ¼S|ôÛ|¶Eèdä­ Jé¸[VÄñ“·¶°^Ï ú}ùճбêYè˜iÂäÊXÛîkm>Vz–t¼V:^CVœ0CPù®âsm¾Ë/hâØÍ~Íýí3ýpŸ/{g–5 „áËpµ6K×áÜÿâ_Úf<ETX’"c«µ´ZCü}¿‘¯Ï‡ç>^pfž¯ú@ýÐ9˜Þì›÷É?8TÿÛÃÏþ¬nVsþ´nvsþ°nöe>Z7¬sLcëÂĘ2ÜçH Í °ÛØà ?§"´’‰z%¼ÈŽKtcDÀ´ ÿ@[xýÉ¡«îBù­Y’º\$°DbBº€ÍŠú4t ‹s‚îæãp;ÉWYÊÂ-mKk"?ukÉÅÿ¶'ÏÒ j]]ÎËÊqVÎ地ݔ}²Ìèæu@AW_Á¶oŒ¬‚iúÖ~¼Ì¿Æ—ÐB™ðµÌKÑ6jmâ½DË›¤<0JKy‹Œ[Â…9m Iy„A $MP/@Þøù¶Oÿï•|+»œƒ°‰% ºFTßyl ³2©X¼ÛX Ki -çx–w©ÔkY;hÄ—ðP’fx¶Ë‹›¶ªÏöŒ!U7ÂyñÿF`įj` £†0Ï}]QÒïI|@¬Šy»%÷ºÐ÷ ºû6»1Õó@¬9³GS5VÚ¤­ÓWªN«–¤ãßÒïÜŒ! ÈÌ5iÃÇxÇz®ó†xf¤¤¼ßŒ3.¾äÚ^ŒSR4lv¨]P“ò¼ÌŒÆ ²yé‚ab¥±¦«Š­T8ê"ý´0ëI…Ürš/ÉÆóØ9‹í¥é=ƒ‚½'†æì4êÞÑ™²0sÍ´ôÏÞ¦æëâŽE,%éu*º.šˆ€¨¡*m‰\ΰܿX™Ý¦…•ö΃k úB”ØÚ\ᘠfûFnVW0—‡š0Ô$Gþˆ‚JÙ‹ý¢ŽœnQyf×côz"̹ü='„QïS) ’T5‡ˆ÷LvmŒ„#OÂéUÞ6}–O"⓼µÝ5ü¸ðߢm£lʉ¶C3¤Úå•Î RåfÍ”‰NõHu1; Û˜Jos¥¤9¬–ó/ÎQ©iyÚ˜£t‰63ˆv?´6çT¼5Ófklž•°)á©,ævJNê<8ùøãQ­…õ›Cô V>¸†J:¡Š/Z‘Þîpø8Šï“g–ü*«Ê™Yªt¾Lž¾ëbbjnCÆWÆ. –^=ÎAj¤-Ö4m§Èz=äB@½vÍ*ò¿ˆ™TÙå]–ý!crC_x™XŽ@Ÿø{@ìø<¸héíWî)¦y"/ŽFaÚ>y,i–ÑçæAû{ƒü4íKœ-òK«°÷” ²; ÃW2—4vm²~Syn¤aàmr¤’üÇ*ˆØ¾x0ŒŽ³ˆ+ «¿ñôW¸¦Å(…¬WðT„w¦ä>÷ˆŒÑp‚ÚÛ³{¦Â#Zå‰Î€l´È«\‰Uñ; H£Ýãwâlv;òLƒ+,Ûðàqeý4¿ 9ƺ³\£!ÈN`ÝÍ.‘®‡–q;}¯¬s˜Åù­ê¬)%À+˜õªÌ5ƒ'S\Ç®e÷±4%ÍÞìì%mô#åýjIWüä›Ñæ·prZ ÑgíÀœÈLÖGŠDC‰vHΛye£ÔÞW`GÞ³ §CþúZRÛÓÞ©ž"´CSºÐÂèw$È( —×\#åE1kêŠî²"ÓæœbS» ‰î…\_˜Qr·ü…h;÷»ëâå¯[ÃÁÑà×ùÍ©cQjwžŠqE»mXÁgY'ÓŸÁW·T€Ê¢?\5mw"ÏŽÙ¯%<šÞ ”»I¶US1]Ápü†•„ÂI»h³|×ÛͲ[¾º¢èM…wçȨé JÑ Ï‰Z½qìWšBª °1?ö¢5W•Ÿtž¼jã¦9?O¬Tûÿ SâVI9_:YB’i¾}fjþm¥è=zÖ'Ur=-¶]VsO´ç4ä¡”Ìs<˜ò☠’_zÑ‘ñKH}åëÊ®l©a`2`[ò– ÿP‹º›™ÃÛ›¹²-ËR©4u¨­¶¨Œ«ð!Ú)ÆïGëeÁ]¿½%};.±ðwíüœáåŠî£ux§¾‚‡ýëõê{u:×#‹{v·ê µhЄÄw * ô¥]îIå r(ÜËØ·þeH|®§ôænJÁRBë‡UÕWÃÒSÉÃäZPéþ7^­|KN¾þÁe;k ^LعˆBºÜÖà Ê|'ÓÙ»yÛ%=Ì<†’Ž!gTˆMjËê+–Ç¥ùâøÝ(¥µ’ºÈ·žµKùŽ.©9(©F’·Þ ܎Ơ›*¼…'&³”vg>KV}^ˆç[)ìV†dÍ€ƒúUjVEçPíÏ 4£äËÏ6öfiUÿЈl‹š\¾ŒÏ2V8Àç¿<¬„w&¼Q+å×RÕ®Ò2F¡×K¿© Ï£úG¥:4z‰šb V­þtËÙþü––TÜ%Ȇˆ ‹§ª——‘„+b*¶éûkŒ@g2p°r >ˆBsy7ƒÂ–”êjˆµ¸Y°Jòà àé%IÙ "þÙÊJpb,£â´X`çVsaªåÆAÝßÒÝ•—%aÈàõ„ÎRLFZ")…uæ€.m•¶F+p0xt¥«1¶Ä[òN=‘ ù,pÛ@iµÀÀâêÆ‡ûò~uˆ—jvû†®Vš0˜¾Cdx‰´&cáBZ¥ò±‰¸#БǺef ZªTÎi¿Iåç”6Žår; µžºñ4üù,æ,G,eKÛ]®z¸ñÁsÀ6¤&ñª9˜ê!¿æFǤë¸bhÎ%ä¤+¦nÕ1~O k$p5V¥1h`."p}ûÐÈÀ¨±§ú,êqM½dglF‰B>àÔsŒ[rãU]°æŒ-‘šEL¯l¾ŠÃq~Ñ èY¶ .ņ(o¸¤ˆt(_’ULÜŽôÛ4$Ï´ôàmĆÈÔ?î°:™DÛ æÒû¹…-| ôO:7;(=»„mxDƒ6Û!`!Tå à@§¬¦Ò~DP”zlÏx Étœñºþ‚ƽq'0G5¬ãÐa8# -ªP^Õgs­ÜÚ·r¯8¼£*ý€øÀùšþBòG#äb_ ¢’^ªy3ÃÕ&ö¹ë¤wÔŸßÂÁ¥‘¸\`®†€U'\RxV‰¨ 3 ÇÚ‘ÏþUôCsÔ7›;ˆœ+h¸C\bÌ0qP¥e÷¸æ+™"†œ B/Ï­8ÈÿÖA@¤ZfHI’͇ͳêzàRe)ŸtŠâŒ’¾í"ªD,$^×w¡¯e*¿!ø|PcÃXã¸|ø¥3|¹ó­?µ«6bY‚7>PBßê= Y¬ç—´V:™)ˆ¦ `Ê>²ÄNFÒ}îã·ˆW£–5\ ¨ ¶HÿâýÀ·áÿV"Pkc¢`½©5Ü›Køy¢›|,eiTæ0ÅNl¡O‰q¯[t’YN@fݲ/\ÉSBìÉÃ*§¬LuÈ™`C´@±\[Õü°„PV®B¥(@¶«@J“IiLOàT+[º«ÕtZZ$îáFIj÷)5ƒÂÀÛoiQ-ò†µö Ö¶ö‚åB!¢6ÈR÷o–A-2èÂM)KÞ*û2¥F›Ê|fXÿé’„Hv–§.Œ˜ û¤kñ«½ÜzÓ·Ÿü]!Y`%H£ÐVÊ¥ú\UÄ~w|¦ }Q ¢À·ƒŒ}©w …nŸà´+,E³pð¹’ ì‚—¼‚!¡{I›‹ÉêËhËŠÿ¨r6x2«§Uí È~ñè–{îŽýÕÙÑúì;×åÚoÊIǧœRq­Æé•ãùÌQêU“óÂSªl\¼ñ*´Á—i]n“ÝG^l…Ò„¼/QÖ~j¹¨­êÿHj üÌQ–W™øs±W{Ï;Îü ‘쾺U-*£ÚêßD÷‡¹°bäAŠÇð¸ZïH6‰8 §ÕäÖ_³B¡y©ûh¯p ¦VX -ßZ„’ 8Ë•Ïýü0³¹+ Ï«¬Jï›9!R ½VŽ7ýz^à¤øbe½ZH_П›ÇNî ÍX§þâU|°®–ÞA[ÂóMrvYÞUÐt lNkƒ³Ú\ô®#•_³y„í­)¹áâƒÂæDØ|cÅ3a–+Þñ—ê`ÿ…ʼn2s>d‚ ò’uÙÊh;mt¤Gzh³æ-“ ³\öÎG_‰#ü„é\ ¦É,/–¦8RM FôúÓZ5j põ@dt ·zÚÀêu©U•³ô¢TRЭ­7Ì©X”,á$§Ú×àS'\ÄüL¢ÔËäøüeUU—v`=,ÙÆ`Ëx ÖdzÊ`øàç-û~×2NP{^^­uÔZ˜lµ)íÚX-h˜…GØØ°+ÂâÙþ!¥`µ>ÔVq­j¡ªÃ2u×uÀ£]›ÝˆÉMf¶Á>î*•ëÒ­:KcÜøh6ITç­@áwÆÿ6‚[ˆÌ •oó­TcÌkº¹ÕîÙëÈUîdX†õ((‡^|>þªuÆü©Z@>ƒÿøòãK!Y%;V4ëjô— kµ™NQÕ8XüÙ(]lTá4/”ÈII?G nŠìøZƒp‰U®¯à'p‡ê3nêåïæÐ= 4=¶W¢„R/ ía#XÖÌýÀŽX¦¹Wâ  º­h…S&ʳb±b/ÙW,ˆÌþr¨î"ŠL¦:mœB­G…Ñ^jÒøˆ/¨½à9+¯ñ¯W ÓÓ“ÀáYï gKúöÒ5?a|5QL᜕K_™ˆݤ,þÞT—a›®ÀFòó ÿõ5¿ –àl÷ÙüíLÇL 3zìê?;µÿ Äþ³ôÎaËQµ®+¥ :­G@äòbênÀ?âÿãS@º[‹‚ÝæåHAÂ4Eâݾ"™0ï¾jˆsÒçÃSÁ‡§ðÜI0/[ŽÛ¹K,Àˆ ñ¸3Ë‘ªº™näjÇêxrIÀ¸˜|n‰Ñ&Ä1*²Ë£õØU‘~¥­eA_ä›õ]`úfl<¬ºPóójHØ@÷nû ûi’‹‰ŠfÒ×¢Q‰àêJA´²ÒYô§ÍuimÃc-ÞóRã¡§q*üU­t咽îFÇiâµÃwãIõéH´ÅJF ÌÖLNÃíµùpïüœè¿»,¦hp|úþ¬ŠIó²©S˜Ðø(rñû‚12ß$û«—‚ÄÌ£¾$§‹·çàû°Ê(€¦ ÔÿyyÈ­Ü+`ãóæËV"«Á) Ãoai|ã·Ë0Œâñâ­2çú÷ÊÌ¢)€ÙÌ·è¢r`ß¶ <ç]Zj6EŽ¿ËÆ.Ý¿dæ|V†lÐä‘nõÎ%£/_¶²“U¤YûÛðä‘bèVc›ÏŒsÚæûãõÒù r@Õn_4áh< _§mMéNŠèÚøysÈVWÇ/)|çf2¹¥E1Ic§7Ô:ˆ3uAxÔ™r<¯ýÅõ¹š€{›¾ˆøÃ!Clf5ìa^ÌÄ×üÔþ7‹†ó?Iâ«ì fíØêðîsÛ&rŸN!ضqbUáë`?¶0²ûšH‘ÕÍLÀå#üæ_Œ_HHð¹$SìÁn&^ð9Ý k·ðj ÎbrD£hÎVÎüÛœFšñcÐ þøéÔ?ã0ë‚7Üé~y†;N赈¿»ˆÎ&  %ünœ ¼q•Üó´eÑ·˜ÊØ6¬¦´‰LÎ kŽ¢Ž&™Úªå4|™•:ñigwËêŸC€ÞÎ:oõõ[õšašmwÖKÀòŽôÑ„(å}S(ŠÁÐXW7/Ö©AÛMØý1 &œ[vš=üGϽS>B’ÆŒ°­+ÓÙëеÚMîoå™]]ÓÛ5'2\v M‡zþ²M;Ë »_ö uø“DQ9ÁaÒî+èA:=ÆüÌå%.±õfˆ°8?ö騯¹€¥_ܶýæñ¤aÞ/À•'š#4¶ëž¿Úƒ}9æžÁ²‰+·ƒàóž&qTÖz»° É0»ËÍ"Ðõ9Ì ‰ú Ëet:,„±„™‘\ª˜Yt<&P‹¯V* ="y,§ÿñ¼=Ðèd¯È€û'¥ñ^‚^Ψän{»WW±ÈAý‰gt¡zîÌX!©áÖ½ï¯ Á Å0Žu\‰ÀIãáY—â¬Æºº•ØM¤N쎆k^¤µþ¦¤@ Ñ7ãâc é¹}WƒìTŸ³½`€¶§žÌ,¬á;ÜÀ]\¼Í¸žÒ‰b8Oem´²Z²wrCSÖµ9 Ópê7–¶óUéÍãÇ?öAú_63_dÝÊPÌJZ>zÿ·Rå º>ƒeˆÉªÊŸóÓÜ‘ç!‰{`ø;—ÿÖœyøÍ5ú I HŠ‹¸yÇ+òMpÆ^^y¾=pÀÞÀ~t ŸÊs•ƒewž;A¸©×a[†…>¾™ Hâ3o”®}ðøå,f—çRÔ‰ÿ9ªã6õO¶÷ŠS)XÇM›tUâ²xçxRÌ1øßJÖ›Vö¨U©Ì¿¯B¢F¡‰Cvð+“ÆÅ;ì}îºÌŒÐ =mÿÂsö£ß’Ýô8nà·Â¤ä: Y¸e&iŒ(N¶ˆ½Æ aXÂÏ«+RpŽÐ×É-ùÚ}›wã´J­€î\ð÷5ôöÿ˜ ¢~pßýc$`ü3üTȵé÷®’#8-~Ó%Òb¢þ”ÈZb¸]ÜÞž³ÙÛ3ôðÂù`‘¾·¥ƒãkš4ÝD(XQP ðÝîX~{iX^2 <°b:&&¾ —ˆ ¨®ÎéQ?¿vœA<Œð´W/hAŠá®Ö†£ªqƉ²¡7L7ë£)I™­y#ßE¯©±_SÉî&ûIŒ Á]“u‘-Ʒ¡xVõÞf ÑìBhZ¡ Kdó7lå4) L%à—?¨»}½îŸ)Þ MYŽ Û/’™‡O…M Š0K1Š«M¿Nã¡*Cèr©NÂë´fâ$@K^ˆº‡!7lù!Pô·^(_À3–ë%×¾Â)§ù:dݺ¬"D®KÚ4HæËiP§aˆµù ´ ¸ýZ˜Ú‡D.p‡q3‘‡°-ƒËBÏÚi"„™¨(É{,!ô]54ªAû\nW $-Q§ h,›fêý.îmMÆ!8¦ã×I$XŠÎÜx¥‡<²±Åd2,¬ÔJ“œ0.67ÍìJ6Ã{1„~˜ÆÞذUQ£Vó·óµ§&WéסW` ©uÇèšÍM ñÞ-rÖ`–!–/ße½űœé±³E˽˜“ö2û>#¾º2&»ëÅMpš‰É$ZJtÝÓmÙ ±aIêÖ¨•¤E`8ŽÒkº#¶Ž'îœÖ*po³¯9×ÌÏžDR<ËèWÑTÏpTš“ïù†ÓÎ3 -"A*+$?¤LÛ~‚5Fu^¯kò0ICî6ƒdCÒgNŽZdk‘ý‹}Á:6¶)Im&mÊ9¦Ä“n3~kHCtAXë3;³Qd(ãPÀ9e?\y2,bÉn¯¬Q.ÇÿΔ€ÅcQL`;ÊSìÏʦó××ߌ ý]Íy`º„^€cƒÌkGP]eó®··¹eE¥ÙÀv„Ezy¼Zˆ5SýÅƆûÓì´[úIPDvCpÔ/ÉÖ$ Xs°.¬‡1ôöÿL¬E*ñïüp0ÀHúÃM´ÓžŸ&%&éôT/¬Õ¤I»N&¿¯©‚ﻂڱwmÑÜ䆿Φî?m¥vÔÝ|Yqž'{Ð P ÏÑuœº€çW[3]h!þýkÛÁmä¯ë™õt‹,éÍ:§YM£X»*ߨÓx°zPá°L†e\·Î6`Ï"›ê4{kŒ»ã•B¼bب ßu_SKÌmïˆW:†*Ë$ÎQý7Ppˆ<ˀݱ=Ȫvf _Ý‹ãÐǻɅÐ{ $q£b¡d<—3Sxë0·2ùªóguLúÞÚ÷!bb¸`¡R ƒ: G¬á”a§‰:X…WwPÕù™‹z$*ÝsiÀ~²ÂBƒzfËcúlÉ‹!ß‘Pm–¶I{zìv„ßj@<'„2kJ­¡°×cB¸äQ@¶Òö‚˜Ï9k£Iˆ!›‘Ñ5ÂÅ úç`ÿf캮#Éa`2 €$hÓ¹.ÿ¿»-ƒîÖŒFûÞ™5Òˆ -z·ÂÂnÛNáb{ ão’0ʬ—lóY'y d’Ìô—¨áy5~EÑÙ|ÍF§V~·®°7ã`MKÕrìG&éòÝc—¹J÷µãL²|øÜ£à"–-dSöXÕr$>D£ËÕ‰’à>L®fÇaöÖ©áè´G¹Ü§1Ø3»tUþHS…‰wf•³zóªh¦¦Å\´^ Í»RýƒÊUÙä ‹¡VèåÖŬYK!øÈ¢À´µöÅÍH2ä|V«áÂ*v1…Ÿ¨ÝQ§Ù*ǘ¡†s:²¾ïcÎÖQªé¼|MÒƒæŽQ÷•&+B˜E½¦ú0ætE¯rPQ4"-ºúæPÞ܇©ÅØR·óô=&ë7Ç4hûà…µ«¢å¯~ {™=;ÒpýhÁ1ÁäůõFsìÁįú¥6]â|ò„L”(%S²¤isµÌvhÀÙ¥‚¾‘Hó$³W§ïÏ®Pܹ“Ì: ƒØ YÙcE$êPSZ vÍ™ªhUœ©ùÈ; ¾ï‘gÖ*û~‚ù@ógG·Î§Ùï?örãMe§×¡TÇ¥c³r”MñÃT0Mð`3 :¢4U–¹Ç|§öNü;æ­ª³is«ŒYiàÙlN‡ týÑ~²€­ítœ¾¥>*@ƒHàE1÷kKUMÇ«21Òj}$YG&‰˜§= 108q^ú·dÓo bhE®xšñìUM,Ãq©SeTTZ`ôs1òhZ&m+ã4¼z>Úa”ÃLä&å¼q½gf'‡ða/ä¥NGÏzè†C–tòæç]ð¥P ¼ü⢒1­­cáÛuZ%ÁØ2~ÞcÓ»iÂèHb=YÑf›*ãeÇ}ôMᎠþ æÔ«^óñÍ×Ü(âý9¤¥à, Å`û:t‰¨ƒš€ºjÚZ íaSr¶Å9kåq§d\v—’=ÏÓ R„*# MÁä-fH¸”ïÆ fBaSÁ&ÂÂ)øtâž ÚÜ3çÓ{0q3ðšÎ”OjC¢w^‡A¬ÅÄ縧ÓÐül7LÀ¹~^B<Â3¬Ÿ lYïÇ9@'aà¶«ÖD±á¨¥rå#r ö? ó¦4¶Ddc—˜Na_Ãõ²ªGîò;û$; EtVI"Õ44Š~ô2,‰ÇÒî$ÓºJ»².vŸ*]$u)pN?ow%â™ö®–[½™÷pA¼šÂÚ¹o&½69 ÒVD¹ä=¨Žë#G2'˜å°æ‹®7y2UMØRO gú[îê%ÚêZÓfÑ ƒÎrÀé¼°¢çš i¼OìÒÞ¸Ï0Ûlr£THJá±5à:Ð8Ú°®ÔÛ‰·’jPÕÊ:'rÆ»ÃæY9\êf*ÿJ÷Ímše¿sÒqQ^ù¯KNøŠÃÇÆ„“À›‹—[8e{¡$‡”lÂàÿ‰.'F‡EºTSWšD0 3UñhÇŸ.7Ì0í&ng gc˜'ð8vøˆ-èB&w†­ !ë.W·Æ.sÉhŽÀ¥¯Ê¦ÛIÝr …€ ÖèìyI­v#äÞ“R§Ä\vÄKˆ€ ‘0\xIÊ=e;QÀĤŠöÁ»YÇ1Š7´zHLÔ'â’,d@&rsìÌ­·€0o §×Qôy–?íP§g¿dSÀ>áœ4Ç™™[l„*gêáLtXeh£¼3!5ƒú é…^Û¾+š V¶Õ&w!qR1öYž D5Ëuëp…|ÝZäûtëÝË»ÀÝí‰3ȬNàCÎZ¾§8bSðŒ8¢5ã´DQ¸j 8dì.ô;êQ4æ’c$eì™»{4,Árj’FoÂPKjêA%AŠ©)3Ê>ñ•ÍæöjM=”ïÄȽIÒ÷nü‘&[Qé'ég¹¼ÒüCÒt—ôŒ â}¥Xw”La¬ Oœ€ì;¼+Ð{Ëö*\©‚[fǹ'e V•øÛAµ¹­Oƒ~¿Mƒ‚@—iM)"÷Z ΚYmÄ43ô9én[~>ñJ£®o)eˆUŸØ7–.ÖJŽØñQ¤ÒöSaºëŽÎI¹ò1‹fŠ’G‡O‹¬d¥hG>K½GŒñ]Ù«5 —øN½|"…µ‹Åãy1;?%åéÖ?K7ÌT›/„1uˆ¯¡lG¸ÚÿJ¹]<”ÁEàtgG°Gm LHÂ+Õ3¤ë7#êý`Yþ.d˜4ŸHaSò°Ã 6YÅ”@ÅWˆNå"îqXµÅþ|:ƒŸ(®åC§*í)Vø´¦°¸Ù\”'ÙæÎÍíC¦ðuÖRäÖßLŸY#‡Ê“Úió’Ë@ø ÂÅHG~È):bŒ ÇÆm‡F•73Ö븢[“ÉÌ7 ž©Qþìr¶W‘Ä¿lXx#[mE„κ}íÖ.:®“-ÐêÂè7™"òWßL‘ÌÙVÓ+Æ)öÊå°;ƒŽ|ÍIh2<÷%‰1Ã%Ü›»ÝœF»2ÍñµÀ&F¹xwœƒéÚ¹›Tw~-l|•p°{”:ß´—•Tƒ¯•ö*eq-NFT¯5¤: Eλ*¨) ¤læÜ%Å«‹”«+ì IW!•]ºm©ÌùaxûÌ´cQËý•‹¯^ ßnîˆ)†?ªí¥‹<›9l‚ ô.žŸÃZêt ã¦ñ_ϦS«\u™GXUÛtçhjÜÓÊ©X&|—{¥5\Ia®‡è®pàª!›´õD±ÆXUfGÅÔêPÛŠjQ‹áSŠ\ÍŽ*èD°ãÒ C$Þë·袔öÆ\X5È (ËU™qïßÜ!Õ/…À.5m¯=RŒŒöLW¼ùÚº"ÊÑÒû—bwAG¬‹F(g±ºîóG9î‹Ú¿©fÈÊ«„LÙDÈ”M57ˆªQ[™;ˆA[vÁô¦£pe4¨™=]‹Ñú#tñØ•oý" Hu¯¼CÊ{7Ñ}¹¶[fŸWººäØ,]²¸3wÝ;Ј×4Õ£E¦PäpΞ—±‡nÜà•³YP;˜Œ#œ!cC";¥ãÁÅ!ŸZê ·Æ3Êo|æœõŠÃ«.";<žm`üîâ`Ú¯éÛ ˜võÅ- Y¢¨¸TšIBùa×Nºìp»è9D$ÀÔÃEY #Í\ÓÉDŽL ÍT“<™èʾ»8ÈŒðØI-˜E²ïߤr¨µS öì5Y·«†°Š”.ì¨%š{¥¦$ùn˜–ÆSuÁÇLÇEÄÿ„uÿªÑŠÕP»šðÈŽ±1fjÏÑÌ ×-’u­e:¶‹pDm²ws\E‡UTéÛÒQõ,ÆœW·{‹ì3¥¹ÂIÊÂSö3lW‹ÌƼ«72/¥ôdèˆ(Ñù±‡›”˜ºfFÚ9³Å]Su ú2éM=æ"¢ƒ(þ^DÕThþTH.˜êìnÅêx¦½Â7Ý3®Î fd£ºú-}˜5¿« W °BŠSöPÿÉìmØ‘à¹s±ˆA®lâldË£#¹C-óè“¬Õæí±='½2šoýˆ¸U¥f'8û²¾w„Îþ°õJ¢Ux=‚÷ŒÒà8\ÙZòXTb=Ñ=E<¾H©îã¼OðǪlÞSoìbœ`?B’šX¡z÷ºUÙ9<þߥ:³ÂI¼Þ®XLø34Œô„³¯W¿$¸ö„TÆ2µÞ£åŸ, X ‘ÁÔ®PýðN9@KA-úbzÍÞÜe»ì‚}™¬¾âÍ‘5ŒQçEY"ç¹êÚ^r™n×…ÜD \a#¦±&ú…K/§s­Y ž† ë’m¹8n’VþZ(U±3 m7X«TÍÄCL¥—22%qÝn§N‡£|`CXc4ü‚ âunWí8Û¸¦TZ,çDGZì…¨ÉÁ¸¯vHÞÛ»ééÆèZÎ-¹ÄjYÀJíÐÜ`Õ‘O”—=®8òO*è#F‡uo}´ÕEºY¤5>úìx&µöëVI’ã\ävÁ.x¢Á“€§ÍeÓ¤ýåc3í‡eƒøˆÈÍ4ˆ idýÓ/6…:˜µ ;²3cd¤ŒòB~§—nÁ 6/}¡ˆãk‚lCv3‰|àEÝæÞ¼i *÷š_Ä™‘™µÍAwÒÅMð%7«R¿Ñ¨µc*œŒ@ˆæO©œ>ad,1ØêCT‘ºXî¼oÎ0ý4>&÷F¨É÷©ÁZlEC{ÂS­Ô˜nAåŒÂI’ 2´M½x‹ú÷dc±^å!w¢òÃŒºaͬžR•Dq–ž¹7—:û˜¹”é}[lip¢‘±nÝ¥V7eVû(zà£:_jÏw¨Åf‘ìáécÌÍ´9‚/ é”|wtŒ/6Š!%$+®À˜€ž‹·©Ø3#úeïKèHpHâ£û•Nq@tìêÛúß(³7Öc§ÁQ¼ÛULøPœ¦Ï ÏÙŠp”-s]³M8I,úídÅçËì¸êD‘+«Ãopª•Œ ë\'?ä9œ»¾­ ¢ B’¡•3„ˆKúP „§æp#T»‡XÎçæ3nô$« ¸ñ䵑Z}ÔcC°sg#',÷l+.Öû¼ü’°jÿ¹ã;h¦H²ŠÕïµÄ¯³4èªáOHdû¦Xè©,ëIlØÚÌ4[Q¡?ŠÎbò€EÁ<ÍMKo!. t•ô;ê– A••ÿ‡Kº‰ þ^0œ V¢ÀÔÕ4y)Ê ã¢’°O~Éæê¾]:¨q½sî Ä“ºBÞdÀˆSºˆá,fË ª¹Qb½§P-¿ýÊe„ßKгw œõ{qȰëX3“šÞƒ¤ì0­‘ºªÓy,wAÐðÀib˜š†[ úÓ/ Ò£°1Kõꛇ٧52ˆ%²›h=üv˾Z¹y’Ô2åQn‹ I]jºÉ‚*´Îó×(ŸV§µ¨ò|®•0ÌþÍølÞ@œ6w¤H(ȇX]ÚÆàÙQ.z¯(2ÏÖw¿¸SdÊÚ³†£Xí²ÄÁO'#$ì«…›w¹¤HÛ{VrTFhŸíòJÝ'XcSáûüÄs#QÙ]á¡×ÝvöuŸ'Y¥ ›•–#à„õw~y–`КÅÃÇJPõŠò¦(?2wlÑÈ: ÐÀÛ8ݯ,UÁ_M¡©9|-AÚ8ɶd{.œh¦¬”7ù«ø.Vl·²ìåqc-¿b“Àj’®<k1Pì×Sœ+‰V5ñ€‡j–%»£§ÙöŸ†Ò%I†.´›ë±áØÉH'~%õõEÛ¾ÏÍ¿gôm(}÷‚x¡<õ±| /Á›n>[^® ªáØ(‰ª·ö¬Þ:~d rÙ\r¯UË6¦›O¼‘dæç#4Y a%‹3Z"‰&$WÔ˜a¼ hf¾¨ÈóÜŒ±œÑ¾ÜÛLŠÌØ.)Hü&D@½p‚çBMDë_Éì_*Åå.sÁûf¨œ¸ÙBË[+U#ï)øÜësB\K·e4*0ºÐ„]eàž>7'ä¬Ù~Є$ߎ÷|+bжþ¾È‰™ÄD{û°˜H§œ´–=‰zÒK§kÚŒWªÎ[[]舃~ù¸K¹»DŸèàJð5‚&æ€qϹeÁÏñ«Ep}Œö¾V ¹\×ô3&²®g=%£8ɹ]î]Ãüœ2£Ýw|7Z¯¶š]Î…„>Î-%¤ÙT É‚.Üòö9Ü&°½&=5x i=7E³nuã³æ.b§éÎ^¬ìp‰2ßgCÝöy¤¡ÑeG¿¯é ¾Çq\ŠóUר¼ynÒ}T•7ÞI¥62|˜]Ý•´ªP5©Ù7HÄû`ÇRl'g4Çõ¸†ÛS³Biˆøk•’iɤôn§<Ó‰Gª5sJ·ùMŠÜƒÄ×9¨ìóëžEiœ+x¬›_w>ÉàUO:3ø“.ê’ÙaUa =Ú‚#e”±~÷I“ïì¥ Ý[u'¦G×3ßÍE\—æG˜‚㑹s!ŠiCrM¶êmzí~vu† T­b:ÎcÎraúµ5 ‰éÁJx,H±ïjû}éÒ‰Ì^™ïrÁØ²ÄÆ™ú-¨eÆÌc twâͱs#LÏCuÊÍ·Þä.úm Ù¥BÀ”floÈ÷®œ;Eæf+8†›[0õ>HüCÙR(àáÐ|Gb³GfVMöÍ|~Ö ¥žªyü_f eVeiTžZ14–4J¨&à]XiÀ”#ÉÈ«óÃÿ¬`gp_ÜP逫ª0 Þ›S?Ö*›aBȉªæ³æ#jÓ§V YµÃ"ñ0 (ÇÓ霠7FàÙ+b‹ê`ÍÌRݶœ±5ï¬×wõpÇÆ|­ç¿ JšbFŽõáS3”ò´þZ÷‡J%çÝ8ÄÀ‡  aü÷jCØ…(˜9U00Õ+1I%™[ÔšÞgEUš*Ö8'Êí[Ê6Øžãsm‰){þ_íb1»ÓË0¦Ã ƒPN¾W+*ĪWƒÓyÖ-?U-[OØÈª™ŽÕã|ÌÐI±^[†õÁ$s‹[t²“Ï;V7×D¢_Yê\€‘þŒ+0àN,4GéßúûÈl˜,ÒQÇUÎQDPsî÷‰¨Ç úǪ(÷gzÜfo~{tX'·Ê‰Ý kI57:.%6Qæ÷]ÒÞ7Ø©ÊÛ<¤'² à¡øÐ`ÉÞ¼¾‚Ãx\,Í|$"võÁýö;d'çcm•›CÈÙ¾o fëqoÒšB¤ ŒÎ0¢I$k.í™);GÓIîó$ˆë¿ ï?‰Iñ¯=øŠ³' Ê`X|ŠÕŸS¿8x|¨Àn#dhÛ:ÝCvËJuÚ°jóº"ÚßôrižÅöH‰Øå P÷·±èžŠÔéê¯= Û|=Æã¸¿„N¿VawGwD}JG¿kø¬ÇLÇD¬ó#¢:T6Ó™µ;·l3Æ8„¸ž·3,FËFÔÚAë²fÏ7¨˜š¬õ­TA¢ä×jgcícc-š1dxŽ6…'•Há㎘LË0)ÎawAt~àÊDÝrpxuºü•L B9’ŽþíÉÕ;éûµ3iTÉ ŸGnbÑ[ñ¾Oó^É]¼iga9lÔÈ({Ü\)z½mÊ3qåúã§’cÆæIºUÏë×OÍ&AþåÎÏÛ™·ï?MæSÝWÓ݇ŸÒqY qô(÷…ýÜÌYëLÒÜ}ù˜]¥òcª‡JZM®ÿo¹aØjߣGæÒ•ëÒËù÷:³££ºoé) Êf-*á\°ò›QÚÝ!·«¸KÐõÂò²Sݳ™ííjZr¡ÊZòȹ9ŸNÎr÷\\” žû1ò£wbdÔãŒãêÔ ’ ²?XÔq~í/{<Äׯ¢›Ì+Th9ÄqͰÔôPRjAû[Ýjx ל0œ;ò©Îñ˜RL1À-3øNp~átþãýŠŸj¹µ¿rg¦÷¤2e‡y9Èl /I«_êµØ’-Ãð\-ZO¹€8¸ªæpè]j³oW— 5«¡l)­_·ªÍïKsÍ»ºî\ò;Î}S_@ñºà$ ”hýf£|Öµ«Ä» ¸»wš›rƒ_7ÊF8õ1² $Ë„Ç$Šjaü/5ÜgSMµÇ?¯ëGF«µ™d×÷šÐÕCÚM‰´d{„¶8ïü=OÊíÜÇ0bjGòZÉÇZ·š.}¥ÇtW¿KftçÖÛîR.ëî…¬]|Œ5kõó"¡=&€s*F_ˆ8ƾ¶y÷í§&ù†ü;é•g*T5àèE*N…¾m8Ÿ ¡]Öʾ™9‘µ!-õ¨ ÓÎU»p‡¿¸fc¢µë†ÌbMµaµ×Éâ=úk2•êjyÛdÀ§zç0w]˜,Ô’™®‹råÑŠÒ~¥2DB—.+h@þÅ5OÑ$C9èCÔ·õ“Z#©_oE1ÌÐ2jëÚý·’ìsÝXEbøŒ-Ÿó WBV7ˆˆQÌÈsº3ÃÌ [ßJ^EãÁ¨ÚÆD¤fnvNäàO_!Ì7º?u„þ;]±¤@ “j ضËlUm½Ëܵ‚´ÆkH%ÐÕ‘­\Âp:E2*:ÈVª`OuSá-l[¦Ÿk¦ã„L÷PY (]¡>pćCF;¬„m¾½®¹˜”á“ ÚQï“W§ŒÖXõ/¾Zc’­fº›"ÚðOEÑ~ßX<ÙØÆ8®B¯?xg.§^Ô,Xã„(l$©4Ógñ«}7 L㺧¬;•¬eÄrÉWÿË®NÌŽ.XÕz î³'pÃd˜l­"ÖöpƒÊÆu¸÷[Î@lý19Æ(l°¸¦ð”uԄ̇Á¦ Õ£½m%²öûÖJÔŽ‡°ö»çÉOþFÂ.w`³°j¡ë·Î¡û¤ ;àýq¡ŸÖRžšâÁšÕ© †êp43—.®u'l5õ¹¿¨¤é×»}{{Þ]9¯csÞ¢Sàœ¼M\»íüÉ Óu{ÿ½·–l÷û%è¡YÝmgÓ”ÖÛù)·Í«£°Ÿ.-Aò¸Þ2ÄŸ«®³ŽŒ`)—ûÕÍW %—?5›,¯A„þò¡…(¢éfÖÎzË÷¸@$õ2¯èÓ´¢»[ ¤XLþÒËKÌ ½}ÙŽ3ÜMó+ß5ûà&_í>Ç|_(ŠâàOlú±lê·ùDý!eñÂó5±±|Ík×¼ ×&·fÙÏm:ï×É9JáØ‹À,/;Ò[¯Àɲü OS¿nö¹ ;ìWÈ¥Ö´0¿·Óœ­HÏ×÷œ??kûp5`-¦S0t<žý›!Q9rnBàÖþºÝÅ]ÓTcM­`ÅrG™f¸f Y„ÓÓ- î±µ®Æ`[>°åÝrº3”Q¬¾‹s0‰°ªß–2èiŒéýðLz=uYálÄçÚm4¾b½vl¹4§PtZµËù+Ì1äPœÍ‘EzápÒÚÅ((ìû6KöïýxÄqþXPÜf¥›3lÃUqµe*ˆòŸb–(”h‹1â[{ä68ŒÍçvl´o‘yÒL'ŽÿóhX†aaø°‰LŒŒäUUf4Ãshï ±2¡ E›ÜWÅ5/3t^ÿ3Ùe*gGvËq~ñFƒÜFƒ{áëc_êÄ$4Çs}šŠk9å·_°õ¢{ílã¿À13y–V—áecpm­h5•£µù;ÜþL8å¸ÄG¯g*Z<'/ëŒ×tâW(˜˜Yqkzœ¸‚ñõ߸¸ß~*®“»äÿÂöã>áæCñi¸àA&Gî)6ÒeÿÅôÙÑ(,9H˜¾¿gŲ͟¸)LÓÐýuÞTgìá)6¿ Ò&hœœ¶\\‡m§ HYrÁªÍ[^yc9·LÞÆå‰IÖ4:ðgòÿŽ‘"Œ©°!‡Ù¼e¯ì¹uïð¹Iε(,MKČՇœ <“ö+0Ûl‡ Y.£¨*¾¬øÛÙ_Ð%šLë¹Ê-rZ Ƕ—pkj'âx—mætjBª–à2Ü9!â`Ä+é)üí¼Å^3Å¥‡ P€Ù%ëEòS¦½]¡oîÎC™‘¿µçÜšØô>ý FÆœ[&þ'žáP׎'´w×&û,»7ÆÏ]’µTì?''1Hf­ãbÙÂ@lò5:‘GXdY..F¼a3UÎ¥…îrðÐÍõNòJ:V =!²B8X…{ñ‚¯&œp€µ J Ð]†²­AÁà Ì÷I5«cµ¡ŸÁ`ϨùýLb~­¡•ÆÞö\Iqô+ä¹»ÿ/9âùºzQ²ŒÁëÔ‡Ø9£#6J•¦éñ@¬¾!à¬Ã &9_Rœ—³íŸqÉkWùOèÈÞΧ´­XHfºWM;_ÄÓÐúù6LI”Üóse8A߉:¬÷º»Joö÷Ô%Çœ·e|ˆ“s,$³RMt¿¸ÏY£@—ðà,T8QöR1ÍÓ³;ùWUŠP-¡­æi¯->A†Ýäò2<w÷&*øtÅ™>W«­¢mȪiOÔ”ÍXÀF×Ú¯†­( A‰ú]c|G{TµÈ3ûŽå)(\9¯eŠ£ÈX;”›¹8ó_]©õúÅŠË6xý„—C5°Z^œ¶ RæñGT(6ׄwx Kº¸ˆDäNÉÚ4D=v¯üÙÓá±Æò×”3ƒŽØ‹Ð­R­5ô"å{Ý Ø®©ƒÒ`‹7Ï÷ž2¯ ‡©ö»Ã\Ô©NïÝ ‚ýÞ›A‡‹Hq;£Ë`ÍÑævˆVWÃhhô}ñg„’·Æ([¼Sp¬Ó¨\;Û)ÓL_»T#Äd]X77^ØKõÚfÌzšÖO°Ü(w¾+ö–àP„‚=ê5OéˆÕXWÐfSuK{ØOˆúŸk*žÊ³d<*ï)¯qìuÇ̹#Ë¥ºÞ:æ‰ÒõÎÌì\™-k‹ |âiÓ_&œ¤_\+Lsený ¸ðY<ó,¹¯~µÉ H€•b ïœÄ·)ìý «; Å÷´Ñ5«^í¤ë³®É€ä­=ÿqv]W»Ó@° °´ŠíÐý¿Öö—á2÷ú×*n˜YÇÕÇxx2!Ó.8ž­èÚXi‘ÝR–e×cZÆ›®^©ãü‘+šÕôÔ[‹Ê¿Ó¿5¾cfGY©œÆ÷—‚݈À¦B |¹êgw”±6nfOÓ06=0õ~]¹"·†|…ŒKyÍ zVXL…¨îŒæýwéA_±D ¿L:"=#1U挋Ç_iÕ˜››¢\Û ý<ÏfYýK›^§ y‰þž8tì¢2V)g™>ö”7¸ö£Ž^³U;Ø@C‘˜Dg(²2º¢ÏíDÒøï©EÎΞ-–^}˘ðc"Pˆìeëõðð/Œ‘Òl¦àßKÛ Ø(7£ö·©Æzd“üvé6¹³ta1ýú`tŠe#Ú-…w‚™“pÌ- »CµÞs/2xdžqŸ}eÜÙ/UÝP˜‚`v¨y2VÈEk {Nîí+º;O1¶{rSüóì«ä/³þlŽÊäÍ–Í$TãÛÏÀeÕíWѺ’• ØÏè<ÔbÕÂpæÄAlÎW³ ¨G‚³‹é··íË’©–DâHÓyL†RìþeãVçŠk‘|:#³J|ŽËß—ä&‹”7ý…¾^åÆ)³ß …;¹‹œ¬ß*çyÄý:âL8„ÁÂE*缩4j°ÿº 1N  .Éüçt(Öê¥VB_ívg,5@Ø#–°FÓ›.dâÜÊÿ»Ñnø¯¦ðzߢpÊCe¬Xú’$¾pí‡$ª&ù޲ìsÝoíB^i÷1OéTCÕÙä.ÙŸà•å~®C:áZ Ä a¡¾ªð@@”?õcžÕžú›Â/çÄ…fð{Ñ0ér—HR…fêØëž{½‹ À}ÄXöÙÍØbªXZÒ9Áå¡U‚ñbªMRžÈÁ÷&Ç›J¯Ã¢ä$çÇ:<îÀ>¥•|r_2\(/>_›0ÀJN/+ý4$QqcõÎf«~Hå·™TúúÇ”3·Ycþ<$.J7!ÓôÚfð¾B/çqûBÖr(ûCxÃÕ…è–åxõ4/QlëTY¹º#Ô¹ÐwZ)K/$PSÍ cÝŸ€³ªÞwá«~M‚ÎÂÃ…ÍS¡áq,†°×¨vUe=$B1”' fïÆ[%´6~–vë_/ û‘Ó¾²@ªcš—sf݇@œS}j—¬Ï–õ+P³o“­¹Tç°ä‡ŒÚŒ¹°B<`ôÙL±Å7m*¹aYéËóý#ð¥°áv€C‰Ï/iOEf¡]PÏa»:9†¡—+H\Éò=–*s4Æ Á!gâ“ðNen Y1N AÔ“°÷Æ-ú;!¾ FµãöÛæ™i ®ÈX;WE^þ†Ä-áIw‘ð½`lS_%0±×¤'SžŸIë²4ýTLϸÁ¯ò^¢5YpŠsƒj0K7U=¯½‡|(ìnD•ô<Íá^›ÇDè õ½§ŒàÄZÅÁoÒÞQ÷š/Ç@Zê î®+-ú²51$fþTQè1O ´¸2;úv´›Ç5¢ IãGˆŸ&[ÊNžô‡¦%ÈwhS%ì%‡ÁèT†¾¤]z2’·Û¥îÐßAI¼ß³£q|‹**^¾˜…eo»-ÊO]ðîáH(ú8P)í³ÊÚýsJ:²ù‚%†ª«GkÝOÕS:ƲúC–ôfô†K°(ا<$Õvš{0W°(ܬä |Dz“i59@j¼MŽF`¨·‡r¬;íï ÓðZ#…óL¾„ª—¾BÐY;ï©JÂ:I®FÁŸÑuB¯ˆý„-æ`ç+ülgTwp4L™$AnfQKâï8C¥E—¶ÀO®t~H£Ú««uØCì4•0Tcݾ'i¢JK )𶉠Å)·r1è€ä[¹Ùï^>kµ±Hå_Þž'c§<2Ø!ѧTyŒXlG&ºZ®r ¿<ºØ×¥Q{cȹÛåØéu;æ/°Qçnt’äLÏAÔCQ„Dj€w&äÊVúÙRÈÁÁ >z›ßIbµË@qŸ ÑWM o2¼}m9iªÒÓkVØ–¢.2ûoVŒ¦?_ËÓø”ªêx«(äX×(æÿ…—–J{-k1»ô1Ȉ$ýDüœƒdý†Û¢pà\òÿ1¤ÿ¶vtêljðŽ"B`çq6l"ˆol7Ö9Ô½Z²Sã›ÿ^Èý¿§}µ°öšvÒÝÈüP×&༱Ì$Þ †‡q }Ï‚UIËÕÒƒ‰¿ÃJ÷Æ«ªãØ!ôöu¾ˆõ¸‚W D…(oùs¼ÄÂâÖAxÈÿÑLr( üE&ßù Ú{œÃVÙ•^MF{47JµZ§ÈD‰-kG'Od¥Mö p/ßHá ¹ \ '>\ZT|ŸC~¸ö…G^Ù{à)æg_¨ðT»Ä¼é06–öb **)KÍSîÞ<Ìü&™…­nðSu˜7;Pº¤óq.°}EÒGëT ÇuµÑ~œkøÚE;gñb&ÐZ«7Sæ¡Ä‰F(èoQË>ÂÓT®.“M/‡_säì %”/°hŒ®n¯R½xpÍe5 ôžÔNý€a~ÞÁf¨Ž 2ͬ;žNˆ¸’ŽEK)dÆ-y=uÜ%ŒOle™×¦ÍÔYÊpçÉ”jõÁ5˜Úh—,ŸÙ/C°°yÁ- ø78p_¢>#7ÇɺÉ_Õ=Ž <” [jÄ7ÓE*›æÛ4ç˜;ªßÂx\J~ (Ò¯9ö}‚ Üu¡9©Œ:FX·ñ%?»ž`Æ}­ÏŸÈ€|"ã;ËvòÆž™MÓqËÛü[úX½¥`Ñæá2SçÜý•Ý)ð’êŽtÙ6¬'NQhû˜Eÿ„U]ažPxtg» ÇTÛp Z}£eètÀäè°Û©~vo¥ˆ¼x0I®Â—dW_¦™CŸ€^}qMyK¦k§µ¶uǺæ÷7üu‹ÞÕÐ-²\ËåëN;}jLÃqÈÄéà" ˜½n]aSGw¤>ƒû¦ÒÌë9@á )ð8u ùŠÂnsšYfX^l .¥±´³çST"ycm _n™jë º£¾ã¬Tr¹IŽÓ’2©ìÝü: HZo*Ê1ºîwè6?ó©êÐ|ªZª¾S5ÖvLžÍ1‡æŸ©2nb9xÑn†½òòÌjŸoÝÑ– ¡Îû¸N© ?¶ÒdŸ ºZD;|‰GøüÝÔBI ìl¸ÒbT¤[.¥} /Ú¢‘ÏõNŽ™×Ö©b×OùyòÍ}øpÓt£–Ý=>U?ÏN7 Å<çÊ3Ôu'xñðÂ@þêÀ~í±Rét0d’âˆÕ‚sµ>0å«HªŸ‰aÿ ÁÞÈR锬‰Qs¤K³HˆhÛ²°‘·5K$GD0]÷Pãm±’P·¦µ‹K~Ãùr¹evìo€yHla±Žéôk$\¾£¼¤H»rÚ‡IWU);Ðu!Ï%ºÚà/4óº/fÜ«“Ñ–uHì5lõ)ü7BŽŽ³"þ+cøìÅ;íÚ0‰k)ÜóÐçM<‘çþ5‰EÈÒŠL@ñ\šŒøXž„ðk…ÑüX}éF%œ-¢¢¦ãWàLŠˆy(B`4dœñìX4ýV"lc ýB9q„À&®×¥^Åžß²Ötc®AU”KýöŽÍo»1;ß-Æ î«vÕ0™5–Bq4à'g ›¬sx£¨ K­ðV†6ŒZq®Ú1é'ö$à€*€œ/¿¿µ¸þ;ŸsÛªi› ó”Ûö±â ãÄ«¬ÆFДr ¦]eÝöÚ d¯Éµ¸c*7ÐvLDÚÓeLÇ[NïW‚«µ…Ù^Æ’…“G¢qhˆÁNÝ^wÒÌr6œ“ø!•¢¤Y¿•kú ®F‡d`ì4×Qb=º×µMYåS†º°&®ôp ¦¹ÁBçõ±ZÃ\âuHð£{©€Úä—d¤ð <ò˜üˆ×C½HþwT ³ÀŽÕ’W€§˜’µÛ‹A€* ’…ß8Rͨ™y¡¦Ü‰–6÷×>k¶Õúg×ÐOšŒÑ°é­‘M—°´3•5 !Á¥_ ÇB“R} ³†¦91ÖÛ­š[Çpeá¸é È"H@ü;#KÇãqXµÜvY枆úó‰sk7Å[wO¸2bbgKÚvD¶É IVÜ7µÞÆ—b×GßbLÜõçÚ6!™œ#äO=ûqusSêâh´?XÌ»ëz—i4+æÉ“ø®Ø«Éa¬ÖX~l²·OÕã]§Ð'Dk#Páõéöòv‘¯¡ÁVpp[f)É€×àJ <ßv½»i7WÌþêƒñ¤¿-îÊÚíêÐGyl<ÀŠ?Q¾4~“xJŒ3£sãÓ—•<¢¸Ûð‡9ÈkÐN3MMž6 Ú´‘ÌkNÖ’qˆYûÙÒ+x]Øõª1Â)´èj¯;LG!õ#›jôzÕ›2‹Ù›[jÒäö ±¦£2f³8ôÉÊØá®)!3Ž'Ã5 ×ÕÛø7±ê…I$ªœoM l#†ÂX«Å`›4±4ä0jæý°}kÕet95¨ÐŸÉ,©uÞ™Bì&ñžïj°5€¨**ÛšF±ýíCÓC¬`Õ×÷v+'|ÊÔ©v_«9õ;³*‡á ‹{ÔiØ#ÃiŸ~ñ§.8º¨Nâá|[mÅ›J§œ~NÛ_û#ì¯6Î?g=3Šêˆƒ:d[£e7íSI^×ô-ÆT¿†YT0ž¥®ÌTlä”uWÚ*.EÖ{{£q…³}iŸhûlŒôËÛjÓʯ0=Á—Ûƒ^]ÂàNqžýÅu\¢¬·ùT ö ÿPÒ É/gS¾vO©Ô•ÊIücÇ0>‘f'PMôæœ(§œ‡f>”4qc·"|Ò9ÚÊ^`ÁµÊ´-–λ#ÓÆÊ#Ф„Ì08»æììÄÓy­DÎÿ­ƒ¢U];ã‚]P.ÊÃVÛKöjÀ˜?~—µ&ÕYšÑÞÖëVÍü_ÍŠð­q¢áÁš9b@YóL7Ì„×ÎZ6Î, ŸŠ†u°²Œ¹Þ]Xwn>Ý~Ô™b?Bé‰iÒÍ"ö„-ß ƒÛús±P©h4 رÚ×¾X>’²Xâ €+f¨Òcë ‘KÊ%L#Hû+dfu†£òë¡.ŸÚBH  ñ‹›ýUb€Iôv¸“P ôÌG_Y n¼·>·4åêåuíGCÙÅ/¦XPÕæEùn*öËêÄL¾©›»K„Ðožï#·½j-)ò‡É=Õ+û~aÓcJ¿Ô*ª©Ê#ôü>Y۩ΫIȪñ}uÊ—†Õ,x«C\7ÀËü£ìbRI|ö¡òè— ±mšz$ú­Ëý² ‘œ’Jë’ÀƒÕ$p„낲gI«€+ÅÑÚý èë7Ïo¼*1²NÌùޱ>pYWÎÎfõN.l,©,·Sµ,äRá(ÿŒ12x+Õi|¿TÕ–t.íÚelµuöuÜ2ê‡z—qåÒ+& 5ž‹mÒ®Ðê$dzi®Ç{¯¤ x6©A°jØìÑNøɆ¨›ö+"žàþ«==–©Û2h)ÀÁÙ[ñPbc|æ†d$e€Oã(?´*€Ñ\ÉãÁžM %áTÈ ÚH¬kÏ$ךKAð¾Ò/òÂ,G*'¯‡|[î0_ÜšÌ8¡æ"m!™^Î6‘ÿF~^\&²™èrˆ{ø4ÙÁ/ÏX¦ëäØ>òîLñÐJíúùà dZvñZy‹PŠÙø¬Û÷ì:Ö›ƒ!POniáTݲ¯ô,Š)5¬T‹ú^ë+zôÃ|Uñ·MZ£ÓË7š€#,Â-‚m†7àïŒé¢pœÉŽRÅ)9Žš,nhÇíÇ[~Á™9yDÛ£à»M3\Lbm€¨gl¾K\©ŸXÑËÑt€àL÷šÐªD‡Å>Ì^hÂåZº` „É϶„ÒX …Ò½Ñ%½[Rø¼S6î¹6«3x|îÐCx Ч1¾pÉyk Äñ··lo®ö]*M«JˆI à²ðprÀýMéEºhÌÐ>³sjžÒݼÕë>ßXƳÁ}ë[–”suO¼v" f'×½øÒFn‚KÀýçÞèknžc > Í|M…^ÚR#d [ø R]‘°´ÎÂk+©wÕµ8p›0¶j_£Ä…\¾7ä|éOº=÷_×Co‹S c¾×è¬é§òqΉÚ'¶vßÛ¶=¸VÉÇgrú;¯ë†ÆP„¼J¥Ó»œ)¨Væ÷ƒðï]¼^ÌΚYW²Z‰ª^MMA–=í\FÏVÃż ï¼ù6û;;Ÿ0xÄŸùܱ/: ô–ès]½ýØš{I±ƒºoò ¯¤„×j—IX,]uóimåw\¬éß‹xHÃØÆéÚLÞÅ/é|À”:3¿K™r*0JŽ6`ohQ½ÁÈ',ŒÚ/t€C)h»lÓçMjß8ÈíyÑ™2²çS¥ª°>–ýŠ¥Và’¤¢ïbKp½ÞÀ–yªâÛȾ/«?›.Ž·AÖͨA¡‰›(ÂÃ[¢*MÖl¯¥*Rã’Í/¥A¶ŽØËB"lþ¹]ÂëƒÓìnQoÑØ—3¤äñâFJ6,A*mϪ=0ýªÃ5J²ÂÏ ™¼ †„ Ÿ ýІǪÿÌpd<-sø±Øl³„þHì,}æ°¾DJT×#”ÈjÛÔëâ¹7E‡å´åÓJ§»8%“ôñ¥|Ø¡u¼kÇà&|€›îª}X±uf˜Í3ÕoâѱéÈÒ%;y4³ ˜›H˜Rkʧð®6ÂÄêÛXöz0ë5ø&³pî…»T%j½ŸÚ76ÌìfÀð]üŸÿÞÈ3ÙŠ—¸yë¶}$ eÛUÙ¸Q`)?“¶ƒ×$¬–ÈæÎü/{nÔlù$†ÈNƒwUMþ´ú;_áC1]£12çZ“†Nt‘ÁqqŠiy|–‹(¶¾/6£¨ ¶Ü‰å !Øž N_ÎpƒÝt±±Šã¢_Yã3ËC·fªDXéç&ŽÂô9óSw¦Ê&wõ…œ>…øžf¢09„ê÷‚³¼”I÷%`†ò¹\*8›u5å61Çðñ÷ Â6(¶àv:xíA¥´~(Ʀ!È&æ+?¬ƒ_1þ/øh³)ü‚fxâ?0ÓnU|NGËÌÙ'%¦ÁI £® ‰þ®×÷×%uH×bÌ*䟺OÌÞV‹*QæÃœzB‘§l‹.²ŠEóçH={âE+im‚Ú"¤ú½¯CƒÎ¬:§ s°zú´ñøjÖº®Hz)EA阕«Âб´K Iæk\R´¢®ÆÚâæˆäh¾·oØÈ²¯ÃŠÔŸ.à™ƒ[Œ18¢Aa¥mB¦àú Ù%ßå¿S_…„a» Sh ­.´0Ã=è*Y0žnÁ·Ò’ÑϯŸˆaÊêVóºÛ ¨®ì¡PÄÄ$M˜¼Jd»â©­>¯­Åã4üþ6oH«GÓÁ5â^o’ª(HH±_É·ÜÛ­¶±2Uæ’¬§€þrô𼻈-†ŠïP)© Â:ΰO—MUBSv‚ä"÷£CZ3®.©-Ó§h©ñÊÌ-Õ>9œ×+Úr½ºE…/Y>j=¬H »@ÚþRíƒ50'NéCÏSSžÍ婸;L$õ“¾Óz¨„íá×¹€&´.;10…õ·…ÊÔàlþ^çž“\Ñ_ªgUÔkë‹9¾ÿcb8iv¤ÄyhŲ Îâ4¬ •¾Ä4ÅrÄŽa>´†á°¦Ø{:‘ ›å)@Ø"˜eæõÿ[é|®ú¾Y¥„ÚJùÈÓä#?`9reíT&ëê&¶[içSÍ3V3µ¤|îæC"G4.´'ïêë—ê:‚ºÿæså-:ñT°ˆ]<¼ö_š-Ò±`3ñZh+SQ‘mÝB1Ìæ?zJa”Îã€s-ª5z×`¡[ªQ¨·wQŽ7·˜ËkVð?2YÃﮞ*ð¡2bÖtÛi_ž ÷ÈÄ¿Ö W`%/ZWâ`âtnâAÿ¨Q~ªâæÙ×÷ \Le²;fYGkB}ÜE) jšñ2·2U(sMù:‹™%»Ÿ¬Ãíû<ô/„3Xim•ÏÅ|çZί[ÉßËq 1¼iž­5O@#zbþ჈uº˜ÆkØv™_dþRûçß çò7~m±¸¥HpZ–²ÛaÑ1ûmu&ÃǼõ¨[Z] •ü™Ö¤Zf&Íùàîȃ<‰èàUŸòà¼t“8ýCƒÌ³GïæAq0 a@"œ¹¨²Ö¹à|7ð*cñ¾T= - ´ƒZÉŽ»­n"@Çg @a‰DGý‹Ç˜È‘8Ì`{Sv÷¸®C¶âÏi×x®kÝ V ]mì;Ø›7j§*ŸÁò(kQeËIfɧ¾–nÖÅé"‡ »Re«ÄtZfw;L.W¹Ksr ×®±ÿ ‡à¨¤µ!˜I‡ß:S:âa °&ÚO/ÑØ‚7pÓÂjîXÁY…µ%)0ØÁ9lŒW)O¯:|ˆ3s¯÷&«QýØØ…!wX]ÔUaƒ=gOÕölÏ ¥DftªºI*3Áwöç?˜²í¡¾®F”õª—“ü¢›„ { (\hbüZf«þ¦ù“«©­óÚz*D4XÊÝfé)ëéïxç*¯ËOøÌ#¶º7åîWø¶ãH ªD„»Šz’q—4ã˜K7(]ã¦×;­YÁGê<šxyð•Åò¹ê·¦œ~eCYEí %#ÇUN#ð%ª2n°Ù œ³‡düYQÖ ]êêiŒ2)È´ sû*ÞÄ—eïuŒ_ûrP…6 ª´" _)9²_Ét…_iSUbËÂxf²FüT÷kL”5ûHÓ[6ÿC­{i¥Î…‡Ø›9ÿÚOP¬–#É´v 5ˆW)qíÕQ› ¡5L0 ,ó7mW–eÉN7S °-ÛaìÿˆA™Ywxýàph ‡ª[eI ÕßX²øv aFõaÜf)ý¯‹x‚LfÓùJM¬:ÛX‡„VÏn=EëToÛflÞ:üX¿“áÀ¬á´¦˜ŸB¹eoðìW4»–žµŸ¸'J,tOU4GÒ‡P'JLÅ—Á‹8W‚f K®[ã§Ê¯t `ÀÆÓ2ÁÁ½ÖøL‹ »Ôk{õ½¯HÌí ½RYmóLvë v¬OŠâ®&Ã'ƺCFh4ìrZn·tHÁÍþ¶ó«y؈2™´8W¤ lqR.+b¢f„„È—iúó@;W¿¤Æú ž…_¯Í¦çYnuƒUœ>uüá!—sILØèÃbÅYÈêº0sÂÝfOÜßðì~b³($«tgUùÿÈÑÖA¯vë|·n;Ünzê¿5¿v)ÜÃx4ùÆHfð}\9Œî ²º AB! ’5wJ2v~&¦2€AKjpõ"S]"j²N0"¡(1×+o3ö…~[÷^Ø?_;c ?™€R ¸¾À­¼gÂ²Ž¿¬ ŠæÎþŒ²z›ˆ9ÛçúzžœS|Îë³ËXÃýN& À`}ÇÚÌ43kâÂ@ü\2 ¢_Ê?‘ZÌñKƒל0¶EàDã‹’D³Û1ø˜Ú|å,1~ı¦Æ…>ä0¸x`?Ê„3'Tï¨mõÛ×Y Û¿–,Eу! ž~&Âéïî±òÊõ0ƒÆr JºN¡Â8áŒÐàŒ»Øõ}•uçN÷Lš:æµ|ñÃå’ú!…wÿZŠl°+9ã‘#›l_½Å9ÚÔ3h•Ù¡¡¶…ï0ÓZÖ~!@†¶™.—QJ¥JET™ÑtŸ~~1TÚxPĪ©©}ëÊœ¸¤ó¡¸¡AÌýÂ`»Þ£ä8 ^Ä€RBä Õ7ÂÁÕ üòlU\Ú:Ó£”gê`ÇH$VæO±Èñ¥";þKþ*f9Ab#·ËMÔÎöcQ²ô€{‘rë9×Ìžm¥‡Øš´Ztk9G7dSŽÁ0ã2ŽíN©”Ýï,7bELzdÚó#vh%|Åš [~œ?L·¾Nxu‡g¶“¼<”¸lÍù9’ù&бÇß,Þém_;¾…Rsk'V"x®àm÷Iu…µq9§Ö®Ó«üaTeûjDnm»ÿ: †j— ÚßÁ"å–'@àõmà!ýÐÅÔ#Úy½eÙË\^žyÜèöÒD8Ö ¤ êéåBp;‘ ¥íþ­4b°þº?H[GjBÙÏ–NmŠJåAé¿;ö®¹õªR?ÜzN¸¹…nÔCƒ}ýh6ãªØç©bœ ñ˜›0 ެS¦kö|•¤Qò»“¾ÏyéUõlCª;Î?$`û„tB'Μµ:6´m$GkazâHŠ\;÷ghU9`ý>ÕÊô ä;üWSˆˆ.²ÈwÐi2ÁDâ°’'8 ãÔÝß…ºßíøàŸô1=îþh`1÷+ŽŠíþ^ó¼fyÓ×KŸO²Û'¦:˽™ ¸ DzↈPÌùÐ9@<Œcýiê­lâë*è GͯŒ5àÍ KýФVU¼ã4á dŸ¬'Ò+AA*׫ÍEÛKî áž*p:_Hا"©q;µkgD;Õ¢\)2¼Ø»It¨ÖjùÙχ.&ždàGm—gÊ)%“eYQž¶ŸMÕU¿pCžº §>#&€:Ëz¡qîð¼ÅU…SöG[¹1XDçð×Z-ärï/e/½“ó&}ža¼ÜõÿW"}hx%¶ ¦—ý{ª*¬ ‹4¬õ»èèl×Ëé²þ¤Ñ™üÐ~†gk' tµÒÞçOjg:]6ûÇc-ò¡Œ¬àßu 'Á\ ‹%Æ-i»0ùGŽÖæà6ÊQÊßoÚÙ?há’þ*G^뺢ôÞdã4gŒµÊPgÎÇ™Y;úPÎi)m`up¯º ú~xkYK1Rbr‡%8^€[,ÏŸC·UÇ?^°!z¤©ú©f…vˆ­ SÛ"M¼[¢ºªÛx¸q!û§·kvÓŒb†P‚“^JZdƒŒÿË=sÜÑ\e.÷‘Ú &ýTï¨k8Gd*yÁu“8h:¸Ÿ"òú¹É|S+°ëßÇsëÙÚ·$ãÝ¢ ?G²*Dµ}3±ÖS]#¦33¨u[(X›’î$Àò@| ?>QÝ*þåøTJŒ,ÿ÷ŠÒö’¶e0YOp–ã®Åwëìʽs›¥•'²–ÃŒc„Ó7¿I) ½Ðæù(ÜšL🟣ç [ωø‡7FýÀÖ’Oª¼˜BÉ·J=hÝ·„ ir½<§f(ˆO±fˆxÒ¿ÃÇu¦¦’bbxC'Óg6ð†ƒ”î…¤›‚uk!jã ÞöcµïÝîcê¥ïôrƒøÁ4*¶É(vëþ%˜\»âêfáïzgœ©Âfcèœ5†–ÈÔ{zYÏâÔC‡ßK$}‹ÕçŽ1¯N9ûÖezm_˜x…º]ŽfŒöís‘n…q·z¯;èäI©Sßp|•oÉ×+ýÚ™ØÓ_µLÎé8·Ôì>ØLµe¿U™èüÅ8XeáX»Ð$Æ·u½5ðÚ[åGaZ¤²­°'‰Ã¿ôÙ›¥^[3ýV,"©³=š$.|¯^ñ¾µ]vn›Bþ’i—¨_:=ÌjBÔž%¿v;~àÁÂ$0%Jâ”ïqèw(ôn>˜ñ›ÝÔ>5,œeOô=£ˆýØØ©-÷ S=£ÝZ9Þ$¹¦|ØCwãçPpS\†@`ô'°ts-£;â`B‰*ÅïJñ®p^í΋âÓŽU¸Ä¬Q3ñj\CÂ">Ä.°Ûã¤â\qj±_qêÝê÷)}¸}È‘š¹ßyö9ÛØ§%/þˆ>f°A ™”z·„’¥ŽeWi8„ê6*v êJ[<ëqþdÝ¢;F{_àÒñy%KB¥~ë2eŽ’MXçÈTdïñIÊÎíÙÃ"Ÿ4ÁŠíÚúm^Ç*úì>‰WÏ?@ªÛnx,ßúªˆÆôHõ`´2½g÷¸(™£šê}²ú©æ…+E×F§FÓ3É´Îý—ž‰I¿VÇÒÞ82¦èi{-Ÿœ›k×\ߨ¹MîäE¦9\¦ÑÖ%¸”Kª>šbÃaühSØÁ.uÛžîÇI5õר³‹r9·ØzÉÇþ$â6E­žž¾&?g¤¢çŽÒ‘YZ÷œ]„5²¦£~\ÉN{oyôáäýz`ÍDøm&µü‚œÝ¯ªxä^Ù©3ß3œ‹ÔäkòþãK÷ã›Ì}xN »«Írø»©eqÜ Â‰tÙsö7¹Ücù®z½ë÷¾/HÄ”™lßqôØ/UÆ´«ÉN24á•ÓÚÂeë²ÉÍ®Q,ÏH³râŽÚé)=ñæ]ûGÄhÔ’ldžëžäÀ‡`RëžGèÅ?ÌÚ™99—íWôø‘©l˜‰i—I- ¹¦œÛ35Ù Slr£™›J ¯oðõÎeîú \Žy]ÊZ#›K6»€m_çÆ'¸›LqnR`úå@_>ʺö\>öq5}z#&ë÷ðfø¾»Ä°] :WDtŸ7¦þR63JÄÕ**ÕÇ„ƒu1Ã%”sžâ0YÇi·Qg^$¯:0KËëºGwø~––ÎùÙy³ïýœr>Éô3Ò¸Ù‡R†“Õè´®3Á(è"sô±¬XÁœ$\;’g‰É£Yé:(¹T;cíðjŽbË›„›+%­äl4m»sä‡ìò±Í™6yuKÒ­Äê’…$°+0q%e˜â¬¸«fy ¦%¹¿²Vîôl…kzº0C{=f bÕO-#•á l×γ›Ó{W"Óeù¾ŽéQÎ2Sê[3§>¦Ø9ì~Ð÷íD´FÖÂN<º@e‹µa]Dõﯧù3X]ÇxmXvpA¤ƒ©­ÎOWh_‹¾<ϰfÑ=¸e©c¸‚’á)R‹}  öøÛ•óáÑæHÍIúr÷õ»¹{Õß½ph”ÛG…aEF´¶Æ2÷¡$Z’·4Í),þsº§WaʼnÌânaÖ¯+}sCŒ§©dZ—9äŸ]L¶ÅÐÞ‚Õ£%PÍÃSÿ¢…N?ÝÒrµ˜Ò‚RÞ£žRcf›(rgSÃ{ã‹då;9FöÔ)/…‘ìbjLwö$Ý~j¼ïN^*±>¡ìuÞ•·j°à‚‡ñ,¥•†q’­¡®ënw¹D"üw ÇOÈÅO%­MŽXFt¶¡øw’1 C Ú85rA{úýÚ~ l[¬»!1;Î×&?ž4è‘å¢ã«Ì\êÁ¦È3wÍVè·< åÎV™à¡E çÄÔk˜Ù4­¤÷¿D°£Èÿ‚s&C=Öü*®¶ÚÕy¦n®oóåBÚtWæíù|L4( Ã.q<Þ<0¬#øsD>`gòè3\]û¸É+Ï”m&AÁþ¦h(ê2¯®FuAlJòfSµÒRQ|JPÒñ|{8A”þª–JYH$e×»1êtô딓¨‡œvc×ßk\ÒlëŸyœ¢`¢=—ã;δ–è¾’v>ÄÞ>%k4%9d$ÀÖñð¨¼.L¤€ƒ [Œ'1qšŠ£IœùÕ*ôG:¾d©ö/8w°>ÐÑb½7åv 5®îóĬO¸ÕÚÙ»ž‚½ ms¥œžÂCïdÕq˜Ky 'nuœ€§aF’Ëâ`[?‹ Kˆ‚¿½uÑCmŸCßЦ¶ëË[8^¶ $—=ø: cUÎ\Œ£欃Î)¡°¤21•AªÍ\aDÁZÆ\ÉmòCtåÆ]…[áà »ê|ý,H 8ïj›ÌØÏzݺÎÑ×GÜÑ.]^ÜÑELäRZP¦(v—„ äz98qzGÁá+YHîŒðitå4ùw½’Š‘j‡…c&FvTªÁÁ+úg˜¹ha&-­°ŽBŒŽyǹ `µmÒq̹’bÌ$›±‰0ÁÇqá™ ,7CÊ$Ý:¼]&ÖGUþé8C®â¼à´Ÿ…Ãfêe‹¿Áê›R_IŽþNß͈ÄnîˆåtÉN¹Ÿ!Q2#–¤™ ørgIìp”%%'¬J·×Ô«¾ô)r~ãPÖ•a¢p¹(ÌÀ`|…ò1œ§¸7„H¼yM5mî蟔ްÙOk én\d…¦þ[.yvÂS2÷xÕŽë&amõ‰3$3uwÒIоévúJX“!!E($"û+B…JêQ<…®ÆCX÷¥s#¶Xw0Ç~n3û7F0®.ƒÒ‘ÀõüiÄÔ¡û¨:Æ©Kj»óÄÕÆ Š¡ ý€UvãX¾ó/¬ÍÕîŒÆžšœJ‘àØ'õc9Þ`…ÏÑ *îkíåŠfCÌΈ,w¥4Ó ÌØS¬f1V¾[´¬ÝPë®VŽýHÖ Ÿ‹Ëýž²ÑÊá= cú‚»B½Ôq˜]阜sslWª-Îm¢©©%ã¡oÝOÊ1—Ÿ†D}¶•‹¢?Ixs•øìñÈÑjÑö³?`­ƒˆÂD€¸L´£±$ø%¸aÂÉF§©å…V‡…#:mÑÕVJ“ø½ü9*’rö ;EÌï ËãÇC\i"¯8€¯ØkÒ,¥‘»å~p”ìÏ ëåVú‹t+¦^Š/¹Þÿ2Üj&¬__=¸æ§¹0žåÀãqåÏ®ø…/®Ç«FÌÎ'ʇ3«í¿ÀfûmÇñŠù¾OŸ%œkІØê“zRÿÎ]saÊQvÓq4W&ø¸L|›Õêq·ë¡‘Üšæp¯Çp|¯ré^¾¨`Nïu ê†TFó³Ä'è×5T½gŠ@Ãí5U¤½ÌÒæš5:-ôÒ_5È"°ÖSîp N"FÒ²m4m q20zîq¬Àê<_ÖWÜz¥†X¸"Øï¿ÔHø¬Ö^¯~Ž”(Áߨï -!ÄGJò†¦Vf=ô>枢âæa‚ñEÀ™õÈÝ1J±Îˆîe¤-à6Éç·€S¿øC-ßúé8Däui»Ï×LC3÷%rGz· ³õ—¢ ²½•WŸ4Üi(:E#™“?M»c\B{‹þ\Ïù4z6¢ Ó[Òº; ‹8¦—úM~YeÐ’‘+âmˆÍ çZ ^ „øÿg6þ&Ñ•9œX|h¾KÍ·†@Z˜#[u¾}-Š4SZ­@ÜxWôy5oqó‹^È‹²\±\c­Û4`;£Ä~®n-»(Óg›_HšåµÅZ¿wYŠe$™æÛ ‹Í°‡¥¦Ÿ/D¨·2À“¨#¯q–ñ¦Êr/£ùíxÜnö˜&?¢s¿Û uu•ž2z.JfvJ¯«¡y÷ßõkRþïÝú„È×’£§ôé,¾¼c¿ð{^åê+¥„¢ð츴ŒÒe¬¥ªûè„3\ód,°­¤6zÍQ´G;²úöeúua~†És’pá;µïìœa‰zÈNHÝFä æSçKI¥ZgØÏbêGh#öD#ŠËSW•{™ QQ˜ù|Q]»S’Âþä3 _<‡Œöžˆyú{eß4`SžœYTƒB;<8/e“žž¨C¼z·äâö–’u˜Ø1¾P¢WRoY]¡XÙ¢Ëêս霡ÁšÜWþMã4êÄ¡b`‰I|.ƒLF@ö@BÖk"†ãº¿ùnáÑ1™jY ×%²×—\Ù±…;þôƒŠ!œ|'¹ÊNS»•Í,§ŽÐ.Ô?¨pÄ¢»û½¹èŒQc(e{«ÔÉ„ yŠK¾Ê°òó+ïj ”E;Uÿ×±<ÄpóÅU}¦À]Ôdx,m+ÈÕò¶F|…¯£²ìf…)µÈý»6A“UðQŒÉâ|J(­\u¹ræ¾[¡GBAë¦ï÷bœî¢E~ï™-•4w׋ŒQí÷@6bªðÝĆr~ž!~ çÈê¬õ—|cÝ´¥å¬qÞT]†´ÞUÆ,'ß Û¼ñäo§…ÔßbRž¯gÞ˜Ò_$Nüð%ÌžíЙà‡§U0Ÿhþü¾VsÚã™G~…‚ÁNÊS?8>KÓeé’:ƒós'Ï„¹ÖIä˜ok¡\³z>ÃÌÉñ{év%°ÙtœÌ‹§wx•IÊl©ÔèC»kÇ1ÂË@œ`Ôæ!Ó™QäáyeÇ´{ãeÎ'TL'±ó¼èìxV<üÃCK*C =†e•Þó?“sãZ<ËzŸÍhèzEÅ1lUɨ©\ÜYå^?ñ`ž}ëËÐQ¢ØÀp„a»B8B™†¯¦âÂE L:]úl7;RIzV¼6T Ý<œgÃŒûðãÒ!æÍi_ˆ1ÏþóQî¦î-œúâ8b VÔ¨"LB.šm£ä7éÕÜaè{ÒÛž¿êÓÇyû®ÎЪþ Épšg±zsùN±²\œÚÍ1] Iÿ«*iÖûLÔ³&YpáBpÂÒÔo¦Y¸dÀJ%0Šk³fcpÝ-mÞŒÇy[ý_ɰ{²~öŽTÃ,†0dwåþ·/œ˜mÃbœ`O­¼ êšl,%ûä ©“éøª¼ªÂ‘›³@h®yš‹ñ¨aý÷Ÿ~ÑQh¤ZL]™õãÞòâ¼Þé;@Ûu˜«ì¦ÿÀl—„CÉÊ…›“– eЉjzíœà`¤éÞ‰´xÎ’º9Oñ‚Ÿ–`ùèwÉýÜpaM’É+¿0ÔÊAd{MØH ¸¢mÄ:.4ævËçàSÙrí±•<÷ž`8ßÙ'ûUŠ¡‘%}¿{dxz7,Í¡ùà6xå;š=9W2‚ã0Åi¹·ÁÖWk@.æ«È¡Œ¾ˆ¼ÙÖe‘­[ØcæÝ¡Š%ÇËf+õW62”k2ïPŸÇ(bðÉÀýèþ+VÇZï蓱6,чf\‹\c½pAìä¹1 .YL¶4`ñ5µ€* Š_Z¡Æí~:¤ÜcF±1¾S2îä‚q ÒÝ·e€/UŽu&Õ=áò7ªVÅ€ƒN±Œ–© e:™¾s®qƒ/Ð1°·¥}íeòäQ½ìÇñ3[¼¨åµ«9‘mxdðdÿ¿¶úV!DÙg˸òT³‘Æ|òpVH4äCŸ°Lb"õÙ>¸ O‘P¶é³߃ÉDÆ"ß% – V% ô…‡ õÜW®M:« ~d#…Uz­]Žü‰\þgÇÔ ïÙ}>WV>ÖñJmTtpq45P­Ð«·œ¡´ þˆ&¬[<ë¾—ãÍõ2xºÎo ‰íò¨Es¢k?Uœ5³ÓÁŠòì~Õ› /~r> ¾¾äÖS(mâ»G$V·¦è ¦â<¾ —ÎIwv8ÝöþE[ÀzöZ‘)Eòª¢'¢;Å'ùDc7w3¨e õ§2eþUaÄÐL¸[T¹ò©È+"ŒW¨“ÝqñjÔ¬ìU¤þôg[,‰ÛIš/žôºˆ»‹Zn¼ï•-Û&.¸Êªž¥æØ~HÊ¡˜Hªîb5Ãã4•%‘¹·¸Üˆ"Ü.äoÛ tv&q`Ðö…]ùÎÁ6Ö„–CW÷°‹%G(qð¿¡Ÿá{ëkçSiÊnSœL¤Õv1Ì üÐ~1wüGÂõõ+Nv¡dÁér!º\QóEFŠøm‰äòò\ž’VÔGpÝV(«’Wü±Ç{,öüzW.RŒ3™cYX§þH)o«y¿£g Ç@‹Qü'™¢÷ª‡‡‰"¨ý¯ Ôuv?àW#f†ÉNGL9@ô‘Ư‚›}•õNÿ¦ðÌ‘_á¢âd±<—¾¥‡g·—®z!ežë£XÛÏ‚sµ”R U§€èJ¤o¸ë~« ³‡Íä5+G"YœR ˆÏÁRBs»~š8Á¹/ÈÒ˜’ZTøhòÏ^õ좴Ç…— =¸às¾- ¥píI«äSPß>{sðæÞ¢BM“z–LV”’kÙ&§1ß—‚ìÁÏq¾ua5:#ÉIª‰ð³‚£ÁÀ?Ä{äûå9@ï* â y5ãðáù¨Òî½x{Fc×[-ÇvQqÔVïÜ«FHøYv1¦õbö«úÃ$ ^Ü0¦:uwÒÿ"Ç=š˜1¾‹68MaønNã #Ï»:Ys°>À)‡)ÓÔÍÃ~ ¤³¤Ž'à;#9½ Ìõ›4ä%ýrå0¶À}§í'¤£ÕpÑ×:ÂÎ' §°'† éHááShÌÁ÷nÎçd6g¼€8&ÒžoüÙâÏSD4šUòU¼Ó²ër· ðN5S™ü zíêÎl®ßj$#n7½â-e™^гÞ)ÀÆJA1+—å “ÑÄðôþ­îòMã3È…ÆÍ(L.SS,Íxíòƒ(9½²z½ØSz°üä,'8û•”ñеÎyݱ AÁdnåÖñQ`¥yÖ„Ÿ}k}œF6mf[€ ÞþFM, ¥|§=k.2åüj‰_àžÔÔ }þ ­˜AwnŸù½=²È~?ü'wlÌ^Z¤îó» à¥œ@ Ñíã}‡wÔrÑyhV,´èÞšu¦Nrš™˜ÈüñF¥ MDû[túz\¿$2nUnŠÐ»÷Ji“õ'5¡¤õyê”&a ’ÚbÞxU§–·XóË ÁΙíàA¸³Þñ9oyï4£•…œíWf³çÄðÅ^qþ°Â³ á5 ÀYãt¼ßQ&Ë{Y…H(MÖYóú“æÎE6ÑÜXi¿Ë(Ã$½bN¢GU¶éVÖuW™~œã‡j2ÛÁ2'qi8ÝýŸ½“_%½æù基’Á 4É1îzgbmîˆRÀA"gedÀ’ù¡…G4æøEJ'µÚgñÇx êÜ zKë=ìIŸ¦P»©©Þê7šz‘×ÙÀó ?ÕG1yÔà–Ã2.dü‚Ìx|¬xhÖxÍwÏ´yŠDv¥d­ÚÝ[`ò6ðØLø3ãÛŠ)_ e¨ œãºÓ~coüÜ=õξєl½ÀÈʈŠ"·¡’ãgeA}ä ŸaÇŽ,¦¦›ª>¸À—è÷¾·bÒq˜·Å ¥îðO&øBÎ+U Ê_¦£Ð¨Ý—x^CGaè1¬>äà g¡*c¼‡YpÁ©éÎü¶³•'ÞM‘:íû:ïR¾›L@b̤›lnÕp{xˆýù®Ø÷¿ò¼?*Î˜Ë L¿˜¯:ÐÖeÖq¤OÏ"Îã5#vþ(qýÏàx¦EÖ“Ò ÄœyŸýˆÔ^ï‰afÞdàUìýà;P3ë_é?Ç<ȵZ® ˜µ²ã–)Æ<,C­©¸$õ ¬ÿæ¨}Pó‚8áÌ\/°ÿNo3>zÆÇg~~Ž¥0¤åÌàwWšrÈÉŽ ‚ŒS~ÊqAV˜YNß8×-UiØÒö&™ü³¬<9c6V"ˆñ¶áÝ?*tÄBÒ>fWÖÚgQvφVR Ä®H»‰k|ÜÓ"þ*àò³BR„êP#.òx ×ô€yÓðPÜÖdê(‹I™A6u個SUÖ­äE7Ê8‘v³9Bm:ùW|é)ê‰LÁtÓƒG~½¨)cä8YV—å´Ï¦E¢ÂG\6z6± —ŸYÝ«Ãj €ÄuŠg'WÌsê&9ø•‰eöÞ%‡A}·éÔ-)'Ón´çm‘Wv€ó[¹è("¨¢þõè[j—KÎyy|@‘ìL‘*zy40VÔ4™”¡¥¯ã;êSAˆ¶òÀbÅ—k,øŒ­g¢:·Vžæ0}sñg&"5½V®’N¤†¯>ÌN.u¢¸öÅ«Ÿ ù€ß@"¬ò+HÔÅi SºE*Ù&fpjÎß$‰ÔrRƒþÔlin8AßY«¦ÅåfI§Á¯<Þ¿1þ GÂx8 ÊA7à~ËûxD†1ד'}nu@´.–T2"e’SèE(øMQ±Éù”—‚ñÈ5ÿ·Ôg­chRqŶ–±öïÜÏ÷]d«¤l,ì‚…¨j•KË0b¤àAtœµ°(.©¸çKís@Óú¡O6ÿÁ’4_Œ{¯^IK`gQ§dÓ~çi&CXS¬£ À‘SCªþYêÔUõ#£5Ƨx²2³3ßj±çw2g-»¦.Žÿ¹zHгÁö;h Jlõ™5çES…ÊJq_3Gî)·9îœkä³§sšÂÊËÅZ}VFí+Œ„¥ã {QŸ¹W Ÿ‰›h¿SÃG_WûEíE협~(.Ï4fúÿÏɺÁµO5›És? çhŽœHÄõQÕ…¥¡±ånÐ5Yµ_¬KÚ\ž"õ8 ­+Ò·› NÞxÃò0¼wQ…š½±wH·U\ÏtöH’L/j8·_ââNç·§“i÷°í^¡RxþD‡j!®Õ$íR-wY×û“­kÿÓ¹„‹gçÑ­ä{n)ñ«{¿Ò Y<šh‰, /x8Õг#ˆòÍÛnû¸í5rÌBbܺ¾D¸æƒò-Ë2ƒR`™áo ÝMêu}Çíà1‰³}Õc¥ê¡ÒäÄ œx”såCåä¦"ÅÝì–ˆQÉSÏ©fH+ëZëûö2.Ê–3(N®›u•õåÃ92^n:¥0·«uÂ#•O¸apó:mƒ’ë”j ßæï©áî•]äÓ/äp~øj C~â}¼€~=ðí`ræòXê63öÑÒÄÐê´N;¹.˜ò"Ây­~²š9R¼"©¤ßúÃuÚ:Kb?~&’>Ô-…rÇ;îI‘¸½¶CËY~µÙ[ø@GvRf%ZyL‡äÕºe9†ç'x-f‹)½¥ÇØv"0B4ïÛ¨_½¸4Uø‰i<(–çã8?`ƒßUhcqÏ!ê~5s‚,°v‘Ù¬&/´brSŽлÁC’2ÇM’ÞOÛ®±”ÜèžìskÖ ð…<ŒÃ€È ùü÷×àyb¦á”ò½w;½Åñ?r£•ŽAŽßU´fh¯Ní5@°jÚìR­iW…Áh¬³©çÁÖŸ{ƒ0›GŠ,m#µË;ð†¨C;¾C³j‘A‚JiLØ×6i*ž¸ÅV>æHyΗ"²N<8 ýÙj%*³(—LÛPhÒ¦òà»Jܦ~©3¥6ºÜ .@­†¯R@à‡!ÊG4¯?TV{_˜~•ƒò„&ùZiÛ²X­egI9Ígùát™žœ"×2cXe6‹98ÓŒf?{÷’¯ÜþþǧöùT;_"m;Ž Ëί€ž‘ÀªÊа—'=ÝWÅþÿ"Q'q \M‡¹Ñnp᪩wJ„ø!ä`% (›ã!9ÅHXYš^Ö(ð›%ÓìM¡^9¯4u÷œòÂà"ÖŽ³EýÔ«öݤ& Y9±®îÄ*ßÁ<«zü–¤¬edz¿MwKPP­UFC"€]+×0çLM©ñT™£¢Û*lL¬ËdD–Ãd Ðä®Þ—KèÆÿÔ-™ËŒ–¸œK7¯Åñâ* ^ðQ¬X4ìðËa¹ráÞ6¹±e9--~C2ó·öÈ4ϰ£gž/y)Fìš‚D•˜nã d¿%ÅÏÿö´Š]ÕA%êöR%%ɉé$ëõ.92»?vZ,eîƒBO’JY}еlwùNy`üåWõ ù]J7EšO­*Øç'€úž ]Q:³(ƒ{@b6‡ÅÀŒñ¯æ'‹ŒjQa“gå²A„›78ñÛU1œ›«‰>I¿±ÐKÇktkjmªì´*ß|_)Ûó¿Ö8!ÁÞôšŽLAÌ;Á»-]Í[ žÒLXÄ;Â÷Y)xª¬‘« 2¬óm@±Z{Ùæ˜IÖOL—ŽðätP¹/§”M`­凒ù‚±t.ƒòÉ:ÉÚ,ø.&ø™÷y$º„lcÇá=¤a »Âm¾½$µ÷ªZX…lk¾P:1©‹i_"îšicôô®W¦ÉaBå[û>•x8j®¢"ctŽ»ýò íjâ äUÏ裕‰Ý* 6­õâ„6ù‚6¿ 9öÒp1W–Z(Ú—z¼ï¶Ž[«Ä«2Ìþn«S"xUÛñ!¾ƒ_<\!O*ªô®‚f½èÅ¿µ·Ç¥SYÓј§NÅ,ј­WN5:mÌ¿ ž†{¼àYÌGD«–qž™`\ðWíí9ÕßÚ•Ø_ã, Œ¯ò^„Þ¹9•)N½ Ùý臾,+(?‚Pëh ³8»d}qU¢ŽðJzÕ¤NðzÏ׿hžðÍ¢)É$Ô@µ‰…ôÑÐøy±m¿¥tÕ‹Çù9Z¹Ù¥`vrD‹"­Ž]ÐNO Î£Ãß³ ó@¢$I£¸Š.¢j÷¾ÆˆtÔ ËYýjŠ“æ\ÚßÒ<§&Q ÀGyÉßþt±ë4ä#tÇ/ìû]»oÌ[VÖ<™»^0˕ݴ°M³h0¶¢êºª¨<èÔw25‡óY\Ìs?7&þø•ÇÕcõÓ‹_Ãx`?wä‡IJ˜EɃ ±`„ 6J‚x3ŽÞå¦~@ OÚŸ’«->‚Sd$¹º˜ƒY€“1v€ ö ê8‘9ŸdéÀöçZO“*Šæ-Ï®èuoátÞ0˪჋F‡QÙ¨sän™ö¹~ë[ÈF_+$v®6Ȉ‘ï¾ÖŠTûÜ ÀÔµô»xðyQyòRšUjé-—ò­ÚÆŒS6ï$éØbbØsXc1‘¢Û£ŒÓ“\º%ÚxÖoJuPYÄÒ¾åF÷ß«Àê(ìRYyÚÆÝ“ Må;×Ú*OëȳÞ˜»ýÒì6–sž9Éô±ì)Þ_x7ë]B{2¸z&#ðx¿C+øêÕZê/ê³ Á¥Ú(ìWaXSí¼">rç“Û?Xã ,²n¸±KÎR’˜›Q¤ ÿA¨H¥û—L¢”Êl².·3ƒ?cþaÞ¿w<ËÂP`o)ÀQñ^/µ%ƒøÜ^yí'‹uìß9YvŒý‡©yzÃizƒŸ)¾Q§©7‹`À ÈøóîÉ-Nj¿#Ýûoã×’.6ÛÇ|»øýèY±iNú#³7êâˆäºxnA‚gêYÁ® ˆ¡0B¡pØË¨àðÌÈlú=—ŽP†"T³b$/£t„ù*Øéx¢ëÅq£ÿ2ÏÊ·q¹õŠŠÓÕ|îsJüù«Gd¾™u•ÐR·nWX{,'«;­`Æ5µ®X-^z±6Žì}þßÿ¾Ïçôz y‰{1ާì~õþ¡4ñ2ñ•N…5?f{ŸVJ<ûÐöƒÂ±`ÁÖñ¬Si:EfñWþ»}ž'œó Û?~l³Ë¯y´Åªp õCjÝÝuYʳ÷KŽbTу„3R_U¢C€Ì¯þÐúîî,äÑ?Ÿç¿ï“ÿ®ÏùýUý;X„eÂ9'ý€ÍõcC¸³D;GÆÞ2ò´9çêØ:j˜Ï¼kÐ@„•©œ”zù[ˆÁÕ=aÕ׊œZŽìV<ôbƒ®ø‰ç?â¡¶5»ª›Ã"´¯yu%&j‹7tXü° óМ "¼Š.ñ6ã,” çD”جû&û»‡òTÎ:ËìN¬ýw-Yj_òÜ™åÎ:“ŠãŸxh´õÿ>€½úÏ8=Û|QÈ,O£×üT‹Æíæ«Xÿ,5>ÆRˆ¶{µ6àß3 þºAåèe]¡S•' :ä=»daܨI(÷ƒÌdg&ñ%W>N³\Óˆžó`¾6(öîÛÿ¯výõe«jÿ %ó !Ý4jÊ(?dñŽÜsÙv¤Jáe9GösU~Š~@5$ÚVk_Ÿé´NÞó;Æ;rPèÈhGÔ)Pç_Du¨A*ܨY}Ì+aøNÍz$úF›Ì3ÈìHÈóLiýºƒdd¸Êî²ã=¿s3A–?†6¨rEÿ¢‚eZ.-ê{?冴’ÒP²RZ퓽Ô ÕöÂ5U]?é° oÔå¯#È}Í®rËã,ø\¾bvI·U ÎiØÑ/‰›Ò%Æ›2Î’ãºVæ ­g…NFX›?•nú"¿°°¤ÊÜs‘=ÙÌõªl™?{¶_5NÎ! Ê˦áöÅ •ö`RAÍ&TräE÷÷êo›© NÄ€Eù“ ¿;äºó¼à Z\u„X|넲Ía•¤¾KøL" E%X8£_´ÛrÀSo"ÜCòO s«½Oã¯*ZÆÌüÏð}5û‘/äVoÝÌ´Š ò¦µa¶%')H~0aºØ‘ã=Û3§™‡«T‹ ŠJU£ßoà€?µ36c ®ÒesR{YjšY6 CV:fE3:ñ…®W6ïß•¼ŒëêW-àê±±îÐtžËIHLò+¬PIjOžÆ0uheÆŸMï¦óºTݼЫkóV¸6§ßé†Á·U["ø±·|ŠÁ÷ BÞ`?Á3rRÛyµªæG“r&C–8Šö&k ûMxÖ áS!c!NÐÏÂ`^JD€©þs»ø¸µaÌþ˜Á„rX˘ecrk'n»&31—”ÑàákdØ:3‰=‡¡¨¯Ÿxd%1Ž ûÀH” Dcò¦D«˜R©pÞ•\‘w¨ñ¦Çüüêç7šU±üãÅ]F^­L˜W·ªwÝݘÚÊÉæÑH†JC_*(¸4"„©+“·IFÒ¨Ô¢u¥Çem2SKv!ß´:Ÿi9ÝØ‚®6þ'i¶?‹ÏÝUþð¡·Moú“¼šÆôWÂOÕ(ýöB_=yÍKƒårÍÝÑ£™=f¥§¥ô¬¢ìûaÚùc•ƒÉÔt¾‰Æ™ëÑ®ƒ÷FvVjȯMÄÉQóä㤽ÅM͒˪R^Úòe’áÊïyÖopß¼ÆÎ3}ð+RîEûÖëëAZŒáƒlTQýa•ý©¸Í ÇÏùè¸!RëõnnëÂ\z)똹)ìÕF=´òæ+¶–ùr×¶ J€Ì¬qW›•ÝUAQ%B„{oBªƒ_‰® œ×X¹¾P¦ øçƒ³Øä+†*æauh;Î'F¿´QAÆþz:,¨°5a™=~³ƒLÐH3‘•íUbзòAC…LU›º4kç3ßâòÌQ8-„ñ”ÆÜóâs%¹ÿˆuÐØ¹ ½Ïò,AêckÙrŽvf(||Ö×侫װÁ¿{ØÝaÞ•?ûF`+ÆÑp@Šu 9XÚ³ßgñ•Ãï|X1^Ü8‡žá“~¨m×Z/”ÉŒ’svò¸üЧØó¶ç/³úMä&æ#ØE£y¤}gº¯; äq¯Íw‡/‹š.}Z…‹øk†µŽ7¦Z­×R¾gù›äŸ¤ýÝmóý¿£Ï_ÜB?år±$³æZLZµ²¿—ª•´ºü¤µ'H‡bÚ¢öQ̪o¥š,Cm°Çì+8þ†AË]¼zÎ|’'ö¥tvaÁDW*\ 7¹p# Ëóì@AŽvÓ?ÞëõÊ4<)U°NŠøxã³zÕØç¹0a…½ÂJd}yƒgO'HÂ$a«)?¾ šõÓ0ÓȸoD}üÔZ¬§&k‚&z¹±’@?Áª’ +1fk-ý©åI-²Ñ&0¦ƒ«^Ã)BM”.3ÙJiúB#ˆé¬WãüâŒ/JPãà̵k•§3o™Øä“¼/ÌšqìɯyÓ9—(ÜA¶Ò‹À;{k jcø ÞÉyu ±ïÁää€é³ =]æyyHC-ÇûE.SMø].BMU¯"4²¾?2è¹ þ+™ |ÉIŒ À­I4~eÑ‹–eKb…áJ#Í—IA­»k\`‘òû¦ Q=?U)Ì;ýŽaýÁT5X‰™¾R6ç!÷ÉÜ›Q–.³“jmÕùH² ":^¬3ëÁ¥Â=pF[‹ôØÔiÕÇÜg‘ïD8 å=_d7óøKÒŸ1ýauå”n,”ÔÂÛV¬+%¿‘ýæóÉ↑­GÃË‘³•&€ÌWéåÁ$öa¡I’yŒå-“œ°Y\t$aÏúy!ÂÚ¼h«º'dt•Z>Ów }”¡šáêÛöê^d+®©žwØXiH iB¹ï3›Óéª Rª0ø ƒÛ 2ÿqÌt•ê[&`íÛm©é6}fæÃwëŠnG:Fv DP“ù÷ºÆ¾+ŸöŒ÷át€ÏÄļ*§× /ÐÇxîÑôs‚Ÿ=ø8R„½WFnY0›E§ïö«èç¼°îOásálZ-ç)É:1¢¥:ÿ³¯q0 */5&²u€W~Ö|i©ñSë“En²ú®7Y¾)=„õ¤p³V¦K¦ËÞ£jp[­¼n¡‡Rè×{ù£¦c7×»–YeÊÚM‘sâäi2h¼yÍeTqXVœç½¯ ¸n¡"3üW}$é&9à‡šwÝ!§î©”?|1Ñîâ¦uÖlêPÎK!ç9 ÷I’rß=µ]©)Öx‹T…èžN=°$p7ù·Ù9rjsø»ô4ÆÍh.ct˜7Ez!è'£FŽÑLóº¹Ù3Ðçx=XÊ1O÷€bd>+£F¾&ã!KŠ·n;—ŠO%€z-x ¶ãƒÖ3iy9Ší=jÈ_©2d¸Û¾dÞòuÆ‹Ìh÷k»S1½­ _ÏþݱŽ+áVV‰Ôœ-(ƒÙ‰G_¢Ú^èñH?lãsîcƒÓDìÊ 2(øeøËo4K²Öý+ƒ×å ZöLO#»£>K÷¬ei 㺶¶Yët(í©ázî†ï¿8€{±®Kµèt,užux` GÒ<ÞæÄ”Í&57ÿ£¶JœS?µ=X굞¸H|;A^¦Üð Uèx¹¢.Š Ç‡PÓ$6ÐÌÜÒ·œ×Lä'ånšN`ù_,¨v#¸+.ã¡Ç9vº¹Ë-|VË8Wã¶°!‡B×5B QÔÊ «_”§Bgʈ%½ˆs òS\æ_øÚJyË+OªM¡Ê¡Æ)¨;5µøØÒ—Vü1TFÄÁó ?ÚƒŠM^º^žùÁÚiÖÅ9‡Äkš6·%ýÐc¥4¡µ¿ÎåY )¬ý„7tûîùïÁÆö²€ów¤Ùê­<>e«ø4T/ÃRׯ¤bÞâÙ$ÅÚ®7kóMR‘DG,µüoBC4¼‘÷w¬rõ=–´%ë|ºìf#´z’ºif?xRê”)å‚Í¿ÑQ¿†®][/¥Zµ²ÊYym&¶=ž™ISúÈéͽ”~ë|G•Ð!ϘÓcáË —íÉ©Ãp^Xu­0°þÆ¥käKËsÜÌâýÔž”À±Gf;-Ôk>ôv^'ûv•“ ‰U%¡à蕇°›7õ•E×C4ÇU>rçšµë½N`!Øy°O8`ZêBó¨'3oöá–r¯;S1€MتÀ¨þæÈí’â í CÎðôc䀔0è×ô¿Ï *í+îÙ =ᶸF Ž4©0|õÈ ºýƒ'!Dß"š§þgCZQª€…Rè…3'Ž ÂÌEš€î9Ø’<²"NœIX†Æí»@û\Ÿ‚¿ ƒ÷Uæ°‚‡FK mðf«®I®Rµ9ÎYETéØþŸ´E«5¸‡¶œ.ž¥I‚UnQoÚ„£»Ñ•)q„¹¸þã~Ux•Uâ8#y7U¼H ö.ZH~–ƒæ»¢°ÒÙ¯|Wdìp—y@™1Iv†÷ì]Ȥ&üÿ¡!澂Ø* wÙãmcayÝÖ##}$©œ‹ ÏÔYe{}ƒ†j­+íüäÃýÌvÍ@»»Ëášg{# »XÓpzeoÂt¾…M©Ó“¼[>ÏVC€¢QñÏ}Ù¢kb<×g‘-[°`7Mš£3==Îöކ@ØI„̹ÞvŠoSZïCdñœ—yÎ-4Cç³¶„1da9Ã'¯­uÛ(Ûæ#Ù™Ñö6»Õt¹þUÚµ%Ë’ÓÀ"X,À¶üÜ`ÿùP•»{‚aæÞsºmWù%¥R©ý@rìÙga+)½ìJ²9g+Á´žÆñêŸ,6숦ñû´Óßj{Â/áSÁhBsYzk:”A[À‚ä4L œ<·(Ç;’Ħ²…µÐ7üSx{)¥2’E<{òb×ä¶&Ý¿º¤÷P˜·â©”Á^Äk½Š¼%€‹ðúE+FiG¤Ð*/¢ÉÙ´&e_œEÒ\-Wa ÐŒw¿Šµ™hÖYè´›ŒþB«ôDœ ^ÐyJL3PžæÞ‘ŒÊ*.;DÐ|÷*Ì›æj3ƒœ˜ör­å|Ï#Ïì÷® ëÌiÁ¹Ô'ÂHØ·ø²ãE¤½yg¤[³ =vhŸ À+yG—QFc a<Œ6zG–Îø'º4æ’,@þ¯išY7&mm6X5ÜRxøíóùÕôÜ÷ xÎ}aR¦uì™jT&4 ,¥ê¥ÝT³Öõ*˜§£,§7BÑ2[b†F’?¥0Š©õyªIÿT&WßR™üs—ÿ ;ÚCKâYJ‡]*ÒÎ}Ê¥ó9q”Æ{åŒ,.îóI.«…÷ŒcÒ ä Æ ½T÷m¶!"ùœ£þ mt—WøŸÞU}#ž4öé|—>ç”G*§6Œ]$ÃÂmøÍ1Û’ ãMNLWÂnÉ m$É ‡²Ã|¦M´ÂCjÉH)BÖnJ¾;bK0¬„Ãb“»_-Í¿`¥$·üT&zòîË`O›dè=ÑZŒˆÖò"‚õ:"à‚•ÐHP=t×’ÞŸž#a¢7YÑ$à>ˆë²0v`·|ùvšÛ<2—àrÂÉ)Y¬ÙÙ«ÍÃdŠ ¢qSìݱç¿W‹)akýM™ÝÂNyc…x¨‡ÇT¬ý‹"FÌ æy)îT4âãÓÔܱުʳõ Åá`¥?wÐX Ël~\ÀíMûEÿbX¨ïû' ³³eÍî/ñjŒ×Ž0¸=S^8þñšvM»z\بÿÇkÂvê?ôÕÐNôc½~• žñRMÛ³‰»ó"èϽ E3>2¡ÍôŸ \‚ÎzF{á þiÝkV„S¹Ø" ‡L8M*3rÇÛìÎG4N#Ü©$‚ìÃE¿Jòs¼z»hWÜæ7ñê„)ͼj§¸0–ÙŸqi¥1—lÈV„…QNúùS~”D˜D@ÿYrڸ˞`tºc %!+Ág$ªC¨¹ð¬Ùª„…ßÛüXL8ñ¿‡€y/æÑÆ’¶*´ñšRZ1/«.ÈûÕêñ™m™ÜŸ—>[Óv‹ŽÙ”08 A;#2ÝQC‰½Çð¶'³ªö¾eÄ„UŸòâì,´ÌÙÛK•Ãê!Z㸧ëê9}þ7Jêe°»ã+–TÇ*Û4Lªá.ãðØÓé´ý»ˆ3KEª´Kþ Ã0Y¼Cp±(FlæI>¸}´9ÞIîðM“Aãªþñ†NnÒoÃ@«F0/Ô«kg4Fr|ôF AêÈ~j¤Êˆåß3;§ÆÁãû†TÑšä¼jÓ…žïMÌÔˆt&0×5QÞË“QºöƒÖÀ_«Äv-~š¸¯} %Œn‡—°S‰³™!…åú‹¾²Âp•# û ˜Ž#Òfo›ÉÒ™j'ËÁ_b ð~ƒÐG! %øÃYDøÛèÙqøé´°ä¬tÉúuFDˆÁoSo†ñ®W¹Ü³[¸M=+Ë”ã•!z±OšÁH•‹Üì!ä‹·:G.cæ,,¦Ú£L•J2¤Ö§DB˜ÅNØÈðCz<ŽÕ#GßÎÉ(|±Ë ÙÄ•h·0WŒâ"Šœ•;¼säü÷ŽiÅÖä5enÀDó“åÑr}ß3*îJí$YC}àp¬ˆx›ª;v30Bâw»S”‡zù´v8DüB e|ú/DŽ>4‘zM¹ ³4ršAG&ˆ\ÇûÜÛPn&ËW¦°ÀÅCÛÀ<˜&:¹1ðƒk7öø¦'àÒÃŽ–¡;o–¤âSF#~2äÿ‡ßSìmªA’…– Ñd»xËŠ:…u滾£¯ÌÏUþ4Ýå| Ð#ßQèdê„ú$4»ä±vsqÖÄÐ…hW$/ÅM8…Ç(ŽãPˆ îâ8Œa%5Óoïÿ—ñ—•RŠOÎ:Êß-éÕ-Üä©òÍñ4Ä£dÕîñÖÞY™ŽÙJ¤wuÂÓ¨ ¬Àg'nÑÓùý˜üÈÝçžìç/@ªqi_<ø†—Öz¸\´Ýã)ïi\­/õ´]…Nð1\?Oðš.¨ýȱÖÍ~¸ðž…¬eà¯ðJ`GÝiüŽƒÛõ¥nø¹Ä³¢Ú–]&Ý Õ8%&if\­•†n¶n ¿ó?D²{u™tô/Ñ4‡ÒMpU¿—÷²dp´\l«Í!é̯p3g«üqÉ4~ŠÂ›c‡EľoEô°G†ÃŒX›;ç¿ 3Œ‘u¸Ùò²:½ç¾*%xÚË ™= @fhL¾ 8ï?‡{GásQûÎäž‚¯üɬ© VŒ ¯?ÒÎùC¯¤wMº‡sEÛ‡JÛùCÕÖûƒj¨‰ èˆqˆbÇ9¯Ðæ+°Ùö·Ø>'ÆÅ¡EyrSÖóÅ»„â_t#¥ïyE$1yöôå‰ùn'äù´%ÅY“­¾£‰•G ygxMC§½Þ˺Óf>ÊŠ½?‚ £»µ0¥¾š'Ò.‹¿e7`hr‹BÒ`·«`æÑpjû4ä% @ÝsÇq|W¦Œ“|×ÙNÿA$º@²ܨ+$8ÉÕŽUu^Ë3 Ýq…ѸõZ€‹ôn—jÅ‹>pÑ™šVÔ£séßÚY3o”IRñ—¾ö¥ÕÀ6ÞMN{JÌŒÁ= î'ðÈ È²Ä·ÖBuɯÁ;¯‹]raqÐОFÙK»bSÞŠ^˜Wš&¨8Û¯ ͧ>å#L鋎íZXN-Þf3íâ†%y†#E£&›¯µ å’¾¬e´ üŸ«Ïr‡yŽbÛœaÈlr:›j‚•²dæô˜?¢2 ‹r+5rV\ª0àΩUàlvÜÉûo‚F£à˜ð„=õÎÆWDv6 ‚"›ž/sðûraÛi¬Oú¼Iåö®uÑ¿…dÞS¾mc5ëåÄÕÙ›y¶·’rÐî¼1R0íþ+Ä…&»tV 9ZïC¬`${[üŽ4åçÕ4Y©ˆÜ/åqúÊó#° Tþ®t±–ª:X%Üì¤Õוyš@Ày>%èPoò3š uƒå”6‘z^©HÆ./Ët¹&ÓQÒ)ΩžoÖL¬ñŸBÄèÐÝà…¼«ÖMæ\ídu}ôL¶ÅÔ듳ýŸÐ~"™©ž¬…¶$K¾`7í—ËéCˆ:…ÃÁÄaØžçè•yMlÄ¢CGûÖÀàvr—M[ Ìub¤a(BDÀ|Ãñhç?òÒ{žÛuÒgAƒz"jdB@› øÑ=äÐbÆDï¨OŸ²Õoз¼6yÀÛ²‰‹ÎL¯ÅîRʆ% F~vû­p›¿mV½mãâÇ’ÛKÂê37Pµ.±Ê×VüÖ™—ÛêêZRç¶nØyðhÍ.¤ôT²ƒSî"w¢C7€Ï@¾1öv–ŸíÖ<öýcŒkŒQÝŒ-Ì~b§<+ÛŸhûtŠúõ Y®º÷úÚÏÙÚLaòêp ©Â ªÏ,U=’P·ùÕ%0/KvõvÞŠÀõè¾· “êØ9 ûgnjYbÈ•6õ`Ÿí#ûåeØmW<ðqfÄÌ®T±°iÝ6§¾PÚu<†6Vè ª‡ì…ªö‡ò²Y/ðûEÕžZ\æÎ¢ñŸTº¡÷–J%GÏ«®bˆZ: ”²ïæÅvrÃç cávÇúÑ!0za: ;Ði(_Øù tlÛ´×±­ÊËTg'-fÂ>/ªÒ\ÿʇ£ŒMÄÃ5^;zH<ö—¡N6@oÏ7qí 𜟉šÞ¯–X ëx®Ç¤'ê¶øÆÚá7U,]åÌ;ù2>ÕuyPTäŠc¼|âãû x× Õ®·»âG.eÀRJ6õØÚûB@Юìlg‚þ$øÝÝB>í !ïXhÛcø‹hZRû$¬ˆWw(ùëFÇMÜ^–—¡ÆPy¿ë³tÎúŠ+U¾kÍñ pD‡¹D`ÑÞ¢ ç?WùO‹~M"n÷ÊßGŽÍ†¡’–g—œMj‹ß˜øÄs:$&tâÞ4å³Pøg¸·*ô_‡]LVK»ïxz[[–t$·O|º,¶}”<$ÚÝ–ÿOdx}„¢z]&Ÿ+ÿ_š#]k¿?€óïfèWz}Uçƒ&/T4¶Ób¢ß]Ä+\—Ô\Л¶gæ•„åëù| Ð!ë-ÔñÅo9ýÈò´¸Z]"4[ü„™5QSÆý£Ås–•YéÊ4ƈ1ÕsCÄRä òÎÉrÖx< —¿Ø åZí+êþ¸V:K`e¶<ŽOÆü }Üñç0p­Üi¯–é|pÖzÔ%+]ÙþǸ/ä^¦äjes‰æ®ÃóöËâ^±x·Zî‰y@là²H­–?!ëtÔ–±3oŽËãùDoWÀ¯k^ˆq®FôÒu¾“7n›á5s+•l¼HÉÅSµÅÑB…û™9µ«~á¹ã­hrdîD/$‰â½ j@}b¹ÑÕi„âp>%Ý4NqAÔ¼¼p^à hÑx®5§ÇW3\d*ô}¶QG’íì‰ùµf[Z¨©ë=¢–ââmvŸ³Ó…Je9k=W´ ýjsñ›R±êë[>å/ñwÔ+|ÀÖ´Òæ  Rÿ7ĹÜD‡ü+Ï1Â㪷9Fjƒ–õ *³¢šcNÍ“z[_}]–sÄø=2~$#‡­¬õšF\ÕZh7µ9¥,Ä}°“bíÍ~a°³4—ÙÊ+yt©Ö®®º"J='òmÕÜóŒƒñ{°ý#ƒªrH ŒèF4øŠ˜jÈýAa™ù7ìè&êíG´oÀJmãg;ÂdÑF¨Êó¤+æ8´0œ:ô‚I߯ _×îàÚŽ¡K1¡Ö3yÙÖ§èÿ“•‚õiÍš¬rí¸Cm@1c›CŒßï[¢ u¯diÝÝV”ïÏ(ùøu>µÚCsšîÔsBZGA rå£ë‹Ç´,¼pžÆ~YA…ˆNMT»Z“Bœ¬kêËwÂ6=*ê€Kfß1XÔÑ«²ØÂm«Œ` ‹‡™ŒÓ–±š¼k¢+HÁqï³ÓiSSý)o¬ZGØ[Ñ•ÅæÙ=xèù·ù£ËŠªõ‰ÑàXÆ&c©Š³_ÝL£‚Y½šÑorà‰¾öé\Å0qiqY.Î2ÿ%_E<[GcèÁŽ706;ÌkŸ)T!„%7‹òšêÄ‚‡.÷vm¹ˆžš…¥OèåÁ<±ÇA¤M·V ÝÞÝÉd£!̹HKÛ3ƒtkmÞÓŒG V†üêÏho-6Ú›øõ §Dê„ûÿa Lí¥NZM„+èýH¾Àz¸P"yº‹“—p[ÿ!ðf ¡…Ðîi6×ÿøoC±Jå×Q'S'•;%&Âeÿ£l,•Ùç $âÑâ&çòsãψÿ¢ôß‘†;Õ~ÑɃÿÄÑ+­üCµÛpA‚ÕN51£ý)‘ŸÝ ê„Æ „ÆkQ4/„Ï9ädõý„4’;˜X©U§×§¡œI;}³ƒã(Ü0ÌI\ËÂ+Þó;sªâ&Óò‰æLÂïòöt•ÂÇ£F7Ýpæ°Ÿ’‹XÜÈìGà†–¢ð±çs9ò8Ù›DàÃùm¸aoÀ=¤Yê;êAH:ÏLª2­oÛ3¶…Ûj'ŒÏø:zƒKmáãÉYdG4Nœ+-Ç•ÖwÛÝeÞ¢þÂþ{myøôIœÉ"ÑMh¸'Œ[6Ü›Ð$¿ÿžjüÕíKÔÔ¬^ü¹B—ñ’ôzu5·Þ¨T[³Úa<Âhöí”×=LtÚ?‘yÕµÂtdZê GÅ'{ -À¸éSÜ®Ão™¾Íq“™z0M6T¶æž’óq)öw +ÿ’Òƒ‡¦§ßGáÝu‚Cæ—3påc~‹n¾zaðnƶ¡"«Mš “ Í²j~?˜0[¢«}ãíhñ‚žá 3LQ3œKoÊÄ‚ï‡ö¶k¶oÛ±áÌ#P€Rý±>ÞºXáµø3ïg—fyéÇð잸ջ?áÛ~l[õµæp+ÎòIÁÎ.CËíÜœ@Fއj/%D.æ!~? ¤ãû‰%5,?5'õ’ ñ#¥C7Â&. 2{HÓAŽv}2ÙŽâ|¨‹q%ñä–“ÙèA äœòE¯Ö¬$’ÔÒPoÃç?O¢pÍ“§’)¡Þo<›C»‘%¦ìä÷ú%+GµÜ˜6Ûú€šÚ$5w¼4õ4Ût\ê?Qlˆ{”w¶KuŽ«\<7°ûO Ûm܈×pÐŒè)ö—˜úZ?k-ÂÄ“ÈÚ³•E|í4KÇG$<Šk4ðFŠZ¯†V¹Ô%PDCÛf÷ƇDÿ¥«„Ú:¸YWh—ÎcœUÒ‰j(o·ì$h5eC o¸´m¢ÿ£Kç;Kј"Ùy€€ƒÄ„åf5̲!»Øu`S$]­ôã,·á%¢°f×}m]éúj«» ­ ZJ Tb.ñr¸â}…û ¶øx°1„™þâ“c? ¾]Gâ¶Ê 2 xƒá÷n+¥m‡wQÑJ¦–ŠK3«!åì9ñ Ú9Áxðqèn¢üjb¥9Yörô#7Ó¶ß~h}cl&ú¶l™At¶íJ’5ÊpÍwoY3¡Ú–J§k²8û0X÷  Á§ñrðiôæ§ÃŸõ5«O÷ŽÂ+Q‹Dœ•ÖdpÛb=ˆÐ[ºA–~ŽÞÙ\„'°Õfg¿`@@Š3Óœš;zÌ–ríL8hêýûŠDƒ63‡eµxŽê@èÂHê § bnn¬e”P¶ê‚§@I®ªºŸ4}î@ax*ø#JÍ]ãÁ.ïLñAVjòm×[I×´˜öðð+K7°·¾D&ÐÒ .9PN»Q”QdpàSœÿÚ«ôGåâ/Œ»`[ %RB3§ãY–Ôõ(·X3ÛÏßÈ{Qg ú«gy=ø¾3ߊÚtª²vS»ç•žvJ.N¤€/\bÚ•çSPÚ2c³}á¡™ûL©tmê=¯ÕÉr°¹ßÑïä±ÞîýØöu²¼4ò$’¨nû¥š¼]µ3‚‹ó¾V!ŠÔ*Â$ù¡Bc™Z¤~Uå‘ ¶sÓçS•ëAÚý=yÔ ÉY]³…=êèË?eúúËw‚¾wAX8¥‹q¶ZÈÝ’…©sí|8Ô‹À]B}ÊÂÐù/@j”wê_m”û"ã0Ô/àb­4÷9âFG²+:?ÊG2þ^¯+G»Ú$Š€56އ$mˆmÞ²®'üGËÓ¨I€ÄóˋӬJ 8½o¼=Fyj–—§ê-Ê,Ó• '=ˆos&šZš¨³J"w—ÖGåœ#ìÞOe™ óMN&'(cex¢ýï¯ Ñz4Ãéhõ?àCÄ æÐCÊ›cßwª o¶ID¹¦÷ñƒ^<“ÙØÂ_0¬æóì|&õ"¨X>l(j(J~Ðô†ÛMhís·ÈÛ×AËM›NGò4­a_(ñ–½Ãi®JNONRZVÚ¨üŒ>¹º+ùÆ¢km…_tt¦ƒ`˜­+±Pé;ƒ â6&\Î’ø‚Ž!+ ÔIlÞ‚YÖ¿DËšõûa oàÉVÙ|…ÙÖÎ]¥|øÕúÌŽŽrµ¦9Þ 8GÐÚJ²-‰N4p^KÆJ¼û?ó´U‰„¤éáT%‘ ­ÑE²Ï1>9xE¾85Báß?À¶2̽ý{k§ö¿ŽNb )†ˆGú—z·?¾êvHscäAh²ã(Ò»zøå¦¾É¨™Ê^¥ŒK"”ßqÇê|&£P»óèÆHª—Þ5¶Ÿªîf©’èâÄ©«‹ˆ³}/„Oû„ûÕKŠ¥Vá5¡âèMs¸ íZR¼Ê'ßnÂþÆP9×0ä‡8•aE`¼ØˆnÎË3_ˆ(uk5öÜ®JÕC­jÁ…‘B#Øtùf7¢ØÒêû’ßwAü¶ ¦á»ûjòªT…VTuІ'ƒý’»X}ݲü¶ëÈBÙÛïA劗ÜP®‹ÿ!B†‚í´2ªô¬jØà@9¨øÛ´·™R4~DZòV¶eUÍ÷Ù¸W.Tá(Žaú“1ÍOlŽÍyCÛîzT,¶ËÃ{gO(,ã i•›m˦.+Œœ•õ”×@™oɤÕ8>˜ ½K\ëXy„ÃBJÍZà#w†@ÑäÒ`ɾ°€N[G–‰z“Ÿ(²-6´*·­'$ŸBn7ûÆ<½ªs²ÞPB/ëfÄ>ê˜\!?ïgš¤½S+œ·ÊÖ–ˆ? ×øÛJÚ³7$Ñ9û _MF»âBC°8¼ÎÛ!CÔ[AÞ'Ýö‹ˆ»z]®EÌ]ï䡹`~Y¶½T¢ËþìÊडû2\Öµ§ZQ÷•ðˆxâ)Ä}ƒ0N³OÓxzwF¸° ò_¤^ßÒ5T‹ýÀמûÆÂç)AoHgJ@u‘PÁÙÕ4y-GRj {-ãÁßXNl8΋%h{X†Š ×¦×£ûL]Ngµt ‡%€H»6+¬t>=ä€(v³5å0WYI¼¡ŠXŠ4qÞ—ß±%Šåà-ñ<¦º¾Ñ&&÷Œ®[™+µàc«aÒ5óŸóÓ߀Å7%¹È /š€;ßMÚKërBíèå“\ü(¥n;‰ ¿†Q=_¶G?ÉÌ 7m¬D´ tCea!ã,t‚LÜåsvW«™kÚ“bŽÑ>œŠÊ83¬"÷öµÅÚ·®UcyÒñK8¿Î§ªê%´oƒ=¢Ù+CSÞ–3ç<ÖÉ0"BwSi ñãV‰çiõLÀT›¶Î+Snµ${4®d6¿]…8a%Á¾KB‘dm6û$Ç-•¦!àˆ”èž…p-ã>ÐvV§|êôy*_‰pýóþòCY¾s#;ûni¤:]¬žm¦¸Km Ñ1µ@/ÉÊ£´Pº&½¨A£v¬ø¯“–Ó÷6ÿWf&PQÔB×òdÓ[mÞ¸^àz2“CGû‘©×SW‡¯Sþšå§[^h§\;27b<§Êz‹·¥XÁhÆÁQîeÓ%^kªtã³7DØñŽ•NéTmt¦{¦ó@׫m?%Øb¾¤ÅQw ¶2½•|4Q朦ßðaø¾”• é¿!Ù>:2£p!EOåþqÆîR¨}ªÌFyÃÅQ›nÝó5¼‚o™@1çÀ¼Š8Ãï’H,ÐТÙmOæz¶™]šï›9ŒzŒÎ…fdÌ%,T]¯í_0Ðo ŽÁ…U2 K§KÐÛ±é6¤f­m¶Ç!¹zºg·a^´\“#ò3™]]âd(Ëo$â¹û(Å\ìã:[û$%©ëVë/L§ÏÜL»}@Il]6µF¼Íy5¶Õzô —®)ð«sä…Ëœb(IœIúq°ÌàÄ l‡ÿnž,šf^w¼bålúÆacâZ’îrh|èo…6)úB »e¬ã‰ÜÔ.³´ùÀŽ®i«ØøéKχ±-ÅbIý^Ò ¢°€5ì³êñƒ”¬&ï—Ïf46fMÅx¥ä j"»¦\„ 6Áno.À2k® ¯<ÈÌ }‘®¸Š«8š;Ž>Ý3´Xg®ÈjTÝùD5°îó.l“êp?SIÐ[ÃN„|2£R.X¹òTÙ|=’U¬g¤Û­åÏ^§_é²wÐ=þOdvù¸ÎM°EÐU¦®…{s….iꑇû¾íhL»’¸ë«tuº/ÕÄàúUjriD¼m瀒šßìkð¶ ‰mxRìµèB7ø1!ÇæÏôF 'V¸\o¬x,XÀ,í*±Å`÷‡ç•u¥ìe¼Õ)Þs¿bÌ$KŽ¡Û­÷ô5\¢ «3‘áöÍaÌÇìþïÈsmÏ臈…îõæ@ÚÀaªKݲƒ .ÖMƒÔ÷Îæ†‚IªHN4BãGKéþöJW±ÚÆ_´h\¦Æ¦¤6Îàñ­L)ÐŽ%ÖO qmªFó+!¶¡„ MkºCZ•WÅ{nl­ΉÁ‡‡¦wRMø6Aºû PSƒ|~;ŒO$z\fºíÒ*Ùè*·~Ãk>[.ƒºÐý¼­õ®–E[M±)*˜fö#™½­Ê·É-48ær[ìSìÑ÷qä—üv¼sÖëÞÜ¡hï‹Ì5ŠN¯Þ/‹]wM,Õ8aeï+w]¡Ó­LÓëlL€`›²„Iyé7ͼa´\‚ƒ²äŒ²§ K.™G57ýƒ<äC)…AGûWš:›~®lÜP3Þ›¢V•F^' È÷Ù$*kÝ ‘ Ñê¸\ldÉо*·TÀ2›Ÿñ#A½îKäúyÉŠéà-.ä9Õ¤ÂNÓ Md”†?èÞ«QÁÎhQ²Íf’Êf›.vÇi=æ­Â‚#ÐÞâ*¿¼?懸ä|ÈPýƒUeú£q­:³à|£M­•D¯ò YŸ…[´oh©[Fzo¹¹Á‘¨è ÚNI<òòà›ê/{ôŠoÒøãûöY&YW±ºVÉŠs˜üÞÂŽ¤ú±éË ·)þ²ü_cè …ù;C+ÜÞ­ 6Â^À¨ºå ]FKxþì•‹lé ,¥²k „ôÃü°Pq¯ÜÂsëì1 Lg‚†xÈB|ê¯à¨Ö±CcOýM.z$âÚŸ²<í:9§|ËQß–uI3&jcÛ¶èa`¢¿‰vƒÐßæêU5Ñ““•™E¯*5¶°›gù†HG³³(1p6ä?³)¿h'K¼Lµþu"­ZÍ$¦o¡ÿ"ƨ 'Í¡ùË:t ÿ}ôGÁ&í'6ÑSb‘Ì.#¢à캄u­:¼îí'A_‘‰]®_¾-ßæt¬jUH9ØÇ•DRëÖpÊ¢iâ·m÷9”3¿ç$(€ šËàp ÈXáÓtBJS“ñ.€i”ÛÔcåÍd¢dølÝUˆ®ÒØ 7”QêÔÉ@ûU±mÇ‹×HQ-EBD­1 b›ùÉ1uÃ#i‹bêÆ¤ÿ¬|ÍD!‡ÕHÌëhï©¿*Ó@&)LfÍMb¤{üˆëä3 zÔ˜fg*$ÿ$¯ñd£FÞ•^‰Þh¸d©îþŠét+•ˆY l·4ü8Õ]ûAÃÄ2ýtÅœŸ}Þ€ëŽ+Žƒ„/'<Ь´ä{·F•3z lVÙçã›T~ .>]Þ¼L9~Wö£ySq/q!P“`Œn'Fè·=ü¾Æ=µshY¢[U³½m³|û6ä|¦¯Ì_ Žhß«Œò:”çxÀrÐmó‘dzÛ^ *¯êÒék.k(#¼¦X)ÁU‚Ù“Q‰œßÈñŽïÈ O5Y_ù6u…Õ¥´FÞ¸pä=Þ‘—9 ¨ÑÊIØ´#d=WÃs‹ãÆß8rh•J_jú5ÝB´ pÒIÙ++¹¡³ÐÒ Å ¾Ž}œôB«¬LÂsàAA’/ñÐåE4£@dØß¼¨Œífr*rpzŽ¢knw¾ç¯âÉÙºàc7Žwãó* «ñß’\~ôx³¼oóvq&µn>U·ÎRgR)Ù}¶§8P¸rƒ bÞ2ÝŠà.?–VnÓ$ß2»ºc< (ªL¸Ö–K=»¤þæÝÇ“3–õcÍxoäxâ=K"‡J.™\„xu’$ëŠ÷i®ÏøAüp ­VÀûWqÿÓ•÷,’²bù.r9·z“8 †eHëL]Â[UtJÅf5F¶;“c1YÏ‚ùžŽrÓé޼tzðX¶âÑqî›Nû,]Ýü×Å«N|'Ud`õJ &>ݯ­vØKFúRˆÐÁØ®]iI| ïtý&ŵxCš$oE¿Išc–ƒ´ðÛX¡¤C 6Ž£ï*”((Gß÷*E|¢ŠÀMDõ5”ìeÖ´°Œ“§Å%˜uŽÖ6ÏÚ‘Ê)gÚ䥼 'ˆEìFŠ—0:Å=f ‹׆„SdæUfjœÀwt™Ïæ²úZ~îu­‹<ì³ýF›YÓM&8'’ð0Þ4ſtf&8 ŒNòç¢ÂÕ PŸ|ä²Ù[8¸ÿfþ³ÉžžÜk)G™;À=NKàps…ãÉgœ¨B®µ<¼ø/¿§z5% ]%{ÌŸµ-§u’ƒa\lÙÑMZ %gÓ–J×°U:¿1mÞ«ŒK* A‡ïƒ\2îÆÈƒB»zþ "„/Lø¦NC½‰/H…@@l`¥±·7YÇûáƒÚ®¨þ²‚²¼Ž>ŸÏIóÆÄcUîLÇñ½Ì¸·?,á%¾lwh>VMí)Ò&‹r&pó8xgÑö<3Zè´Š•>ú(ö¡u¼ØÇ„ÿIZЙVô¿âtöŸÅëaMP0²‚ EdÛO:ìtI I|†æT_—ÉŽ‡)L®Ë3K—aílûÓxÊÁNê›V’½˜SGP½dYgÕ!y•æO¤ÑøC KΤiè +û:ªÔ“~ä í™Þbâš;‡ NÚärg χ‚6Ú§ãã#7+OëÍñPæ† >^Ú$„I¿cKsg%¨oX§ÉÉ£×0KLu2öܬ´¾Ú‚EÚ<±K˜2{B?Ÿ`¸Jo^UŒÂú®ð,׿î=ù_iå#a(ÍÑoúx¯l¹ÊrAÏ&ͲéE^”™´íÞ_Ô”µ½ßÙ11‡ (£•׺­Ó±K?®¨ÀüÝ”3L¶ò/†}Þ×5Ø•#¶®-mñ´¿è`¥4äˆ4 lF·©Ù¦,>Zí-@e^}µ¦ƒÛ.Q–¶)¿+F?$†ð¤dä`¤‘¢i‡ð®ÛiÏxî’µªÚfOíBY²û‘ÜmŠrxóGaðbOxÞáш°÷ɰù­ïf³Tºä䌴gÞ,vµÝ«Ð¦Dp©ü›QN:¡óæ+Ô%ȇ6Ö¸Zd›•~1Óô&ž2¦X‚ðÖEXtÈë¸C£B<×åQ†µµ‚»¤—$j2 ¦’‹œƒMwEÄ\è#À·Cwœ®ç<çÀ£Rfx?Ô#GÎ~HÈ‹øhoj'l­a2´Á?Qãö-Ôx¿Ëì·«¤À\;= 1ÉoØø»£øK9ëhsÊ+T¢ùp[§‚M¥9Þ²0Üà+¤³áø©¶KÖm¨ôÍü¥å3Tð%Š6†«Ñƒyˆ.¸°qà^bûWøÁ¼ò.»[ö_Ï?¦Mj¥¹ŒU‚\¾òôu¶üù~Ê1‘^¦˜-E 1`+ߨMûÖhïK·q´•²OŠ&“s½;à-DxÜj;\ÄiT ïjÉF(Î2q¥Ö7t›¤x<‰÷èÛ«ð[ºú‚µfF¿„¨:Õ‡¦.ga†äÐbØÿÛ‡ýü¬,Â"w¤É2h›ËŽâ‡t}k*âµ?¤ ¢èârí>ÃöÁ—¬PN¯VhÛÚ,"LÏ££O_lÊãnÌ3QöƒÕÑE/Àa A5‹FÔÑ*ýVRv¨(𥠏Æ}ôRÛ@ô<*›Ûä|ÇÃ$‘µ '&0–d‘i›ñU‚k»§{ÿ„ÅGáÉ<³j£ƒ.+ºmgC•¾fÖÄÉ OÕî7@¾–Ž›&PÅT*ÞÌ“JZGSÌD(›º W/Ó!±ã•ø§Ü á~®Ñ„êÁ©ØüUÊ{Ɠۋ¯²È‚šLç`Œn;F=³0:Ê KS±ÚD\òÙ ÚDƒ)QhÝ ™ ÉIw2£—²Â¹ °1‚¦œáο¿bÚb½ÛL‡o”£æ &׃#‡ý:ßüá}CØnÞÉ*©—¢²iÀéPm^'^&_ùQUMŠR¡šyDX n#¸r°7ÔÄmÑ©Ó@#˜Š¡.4²üÍÛ„ÃfO|óŒïj¨FŠq‰ÓŽ _oN2í/Ûp<Ü1û³MTIÁtjU­¹Ç³NÆevv¾ÑHh˜MQ ~c¾MFìú&.Ds~ͶTð7ne„‹ß-jáá¶Ÿm彡Ejt…¬™òÃøÕð÷Îÿ­ÃÅ./8Mcž¯/}Ûe¼ÀpÕ¶çÅF@Ü_½Q6O·Îóɤ¿°Lôh7#ÿ\ð:µØëÚzÆQpÇËŸ9„¹dCÂÚš+õÈ*/¨ÁPl»;õñ pÔà,É×GûF¤FÛL}ÊÞ®Žµ22óAçŸÉ@“ø1î{à»ó«ë:¬÷g/ËíÜWö9 1õÓô>€ŸÝ쓃·JÜIÏF1 Œ÷·¤úêôÔSP_þNÚï‡ë”žràý\‚êl)³s_³ýg9ÂÙ^˜£ÆéE&îP¡ZÊë.êÀY{h–lÔàäJæ1G阳žÍ„uF€+¦7ô†³j.œkƒÇ¨~2` m èÐSKO œm¡A ®‰ƒØ'ÓÖšÝçjt ÒÊ–Ð(ë „Ú ~Á-$OÒì•Q¤_ßU³xЫ‚DG©y¾áhësv€cY¡ÍTòTŒµL¾#N˜ø÷uF/Ð?éói/ý¨¶0$ñ g¡*`ÞcU—­Uæ㢣1ôŽQ N_¾I‰}‹ó昡 ¹CAcûËwÐtoë¦H.Uç[úx¦§~s- Ññ˜õGžËkábÀ®Æg>S©N€›—³j@‹M¼½öÝö²mµ]\aÕ//}p4Š'“ç ãmæÈê«æTå‡ùKÖWœzÆÆÞnC 4·»¯?­o"¶¨ýèß~_9»íð¯¤*à‰«oúz;-2¥•Ÿ‘*4ÉŠUöÚdƒžmÝpc™àdï¡l2z‹îx“¹€AŽÜsŠ_/V»vV=5ô-\5»·“¶po³I}ÊvÎ×PÖçÐçUZ5òz+ì’Rqw'ç¢TÌzŒðŠiFÞlˆYyAn¹†=jõíÉì6»Ô„ü[-eö81C§Ž<…¥å$g$ŠØØm®o(ÒèW¶öŽ2ý<*Zè¶Ç žÏOä#jVƒÐ_H]Æò|hÿUìÍD ÂýOáÿ…Ÿâ¨ì¿ ‰òÿnÐ0b៑aÅ^ Ðú‡n)ÜØ?ÿ´|ÄA „½ð+’ÄG¹¼ƒ€¯¶5tykpüÌÑß¹)ÿý±ç¶›ÍäkÑ?MYÓj6Äú¯ƒ¿?Ÿÿmçúü˜ßpCݯõ×ç×ýS©/7Óâ÷×ÿl,ñ94ñ ÜI8¨üºe×’Cê.ž8üù8Œ[éæoßß^þU­¯ß­šÍà}]Ýécw›1®L§gÅÃs‰ÃE‚»’¢œ(aGÿµ·3^ÿáCùó÷Ûùþüw'+›9þú¯Ï/ÿôþZ_nÎÍüþúï±Äø=BúRÖ«àžªŒ£öŽ ’1\sÂçø÷ˆ‰_^ŸÀxžO¶s}æjjñþ°?ÁF–âöå¯ÞÿÕKè0°ÇÓª„ CÛáþ[õ]–‰ œBÖˆÚE…‘ggîú¡=‡à{ñ}€*SákÇéWÀC`ØÓTǾýó3ÓñÕIãóêyMÏpEžýcWðâ`رﱼs°q}Oñ·¿þå_“«%Iiogolly-3.3-src/Patterns/Life/Signal-Circuitry/Unit-Life-Cell-512x512.rle0000644000175000017500000003307112026730263022171 00000000000000#C Width-512 Unit Life Cell, rebuilt from David Bell's original #C width-500 version to better match Golly's qlife/hlife algorithm. #C Very minor changes to circuitry; period is still 5760 generations. #C The original version, with some background info, can be found at #C http://radicaleye.com/lifepage/patterns/unitcell/ucdesc.html. #C From David Bell's original pattern notes: #C Here are some approximate generation numbers for important events #C which occur during the 5760 generations which make up one #C generation. Some of these events only occur if the Cell is LIVE. #C 0: Current state glider starts from pair of long boats #C 400: Current state glider arrives at fanout device #C 600: Output gliders escape from the fanout device #C 900: Missing LWSS turned into boat to hold Cell's current state #C 1800: First glider arrives at the glider detector to be turned #C into a block #C 4000: Last glider arrives at the glider detector to be turned #C into a block, and the high period glider guns fire #C 4700: Stream of 10 gliders starts sweep through glider detector #C to count the number of blocks in the detector #C 5200: Gliders from stream react in the Life Logic circuit to #C calculate the new current state glider #C 5700: New current state glider arrives back at the pair of long #C boats #C Dave Greene, 17 September 2005 x = 511, y = 511, rule = B3/S23 oo507boo$obo505bobo$bobo503bobo$bbo505bo6$130bo$128b3o$127bo63boo$127b oo62bo$125b3o50bo10bobo103boo$124bobo50bobo9boo104bo$124bobo48boo3bo 106bo5bobo$125bo44boo3boo3bo105b4o3boo$170boo3boo3bo104boobobo$177bobo 94boo8b3obobbo$122booboboo49bo95boo9boobobo$122bo5bo157b4o$123bo3bo 159bo$124b3o$$383boo$383boo5$125boo$125boo3$382b3o$381bo3bo$380bo5bo 83boo$380bo5bo83boo$383bo$381bo3bo$366boo14b3o$366boo15bo$$380boo$381b o$378b3o$366b3o9bo$366b3o$365bo3bo99b5o$402bobo63bob3obo$364boo3boo23b 3o5bo3bo62bo3bo$389boobbobbobo7bo63b3o$387bobbobboo7bo4bo4boo57bo$386b o8bo10bo5boo$386bo11boobbo3bo$386bo9bo5bobo$380boo5bobbo5boo75bo$379bo bo7boo3bobo76bo$379bo14b3o69bo5bobo$369boo7boo86bobobbooboo$369bo96boo bbo5bo$370b3o100bo$24bo347bo97boo3boo$24b3o386boo21boo$27bo373b3obbo5b o3bo19boo$26boo369bo3bo9bo5bo3boo$395bobo4bo8bo3boboobboo$30bo362boo 16bo5bo$30bo362boo17bo3bo$29bo203bo159boo18boo$231bobo37bo30bo86boo4bo bo$223boo4boo40b3o28b3o83bobo6bo$26boo3boo190boo4boo43bo30bo82bo78bo8b o$26bo5bo196boo31boo9boo29boo81boo45booboboo25boo7b3o$231bobo8boo18boo 200bo3bo5b5o$27bo3bo201bo8bobo189bo5bo22boboo6bobobobo$28b3o213bo61b3o 147boo5bobo7boo3boo$226bo17boo60b3o126booboo15bobo$225bobo77bo3bo127bo 17bo$215boo6boo3bo44booboboo174boo8boo7boo$214bobo4boobo3bo44bo5bo24b oo3boo133bo19boo7boo$26boo185b3o4b3obo3bo45bo3bo150boo12bo28bo$27bo 176boo6b3o4bobboobobo8boo37b3o144b3o4boo12b3o6boo18b3o$24b3o177boo7b3o 4boo4bo9bobo182b5o6boo18boo22bo$24bo189bobo21bo20boo3boo154bobo3bo5b3o 37b5o$215boo21boo180boo3bo6boo7b3o30boo$260bo3bo147boo15boo$229bo31b3o 149bo15boo$227bobo31b3o149bobo7bo47boo3boo$228boo44bo34boo103boo7bobo 46b5o$36bo236bo35bo116boo4boo18bo19booboo$36b3o184boo48b3o34b3o95boo 16boo4boo17b3o18booboo$39bo98boo82bobo87bo95boo16boo22b5o18b3o$38boo 99bo72bo11bo198bobo23bobobobo$139bobo9bo60bobo45bo162bo25boo3boo$140b oo8boo49boo12boo9boo31b3o$149boo4boo44boo12boo9boo31b3o14b5o$148b3o4b oobboo54boo6boo42boo6bob3obo$149boo4boobboo51bobo7b3o32boo3boo3boo7bo 3bo127b3o62boo$150boo60bo10boo32boo3boo13b3o127booboo61boo$151bo74boo 5boo43bo128booboo18boo22boo$226boo5bobo171b5o17bobo22bo$40b3o192bo8bo 29bo5boo124boo3boo17bo24b3o$39bo3bo191boo5bobo27bobo5bo159bo16bo$38bo 5bo181bo16boo28boo6b3o156boo$39bo3bo182bobo33boo19bo151boo4boo$40b3o 166boo18boo31bo147bo24boo4b3o7boo$40b3o164bo3bo17boo32b3o144bo20bo3boo 4boo8boo$206bo5bo16boo34bo145bo18b3o7boo$201boobboobo3bo8bo4bobo4boo 168boo24bo3bo6bo$201boo3bo5bo9bo3bo6bobo165bobbo5bo13boobbob3obo$40boo 165bo3bo5bobb3o12bo164bo9bo13boo3b5o$40boo73bo93boo24boo155boo6bo13boo $114bobo275boo6bo12bobo8bo$115bobo283bobbo9bo8bobo$116bobo104boo178boo 18bobo$117boo103bobo199bo$224bo4bo29bo29bo$227bobo27bobo27bobo$120b3o 105boo28boo28boo131booboboo$122bo85bobo210bo5bo$121bo85bobbo3boo206bo 3bo$198boo6boo5b3oboobboo200b3o4boo$125boo71boo4boo3bo3bo3bo3bobo206b oo$125bobo78boo5bobo8bo$126bobo78bobbobboo6bobbo$127bobo78bobo13bo$ 128bo92bobo6boo$221boo7bobo193boo$232bo148bo4bo39bo$232boo145boob4oboo 38b3o$222bobo156bo4bo42bo$221bobbo19bo29bo29bo$211bo8boo20bobo27bobo 27bobo$210bobo5boo3bo19boo28boo28boo$210boobo6boo$198boo10booboo6bobbo 5boo$198boo10boobo8bobo5bobo154bo$210bobo19bo102boo48bobo$211bo20boo 102bo46boo$336bobo6bo37boo$163boo57boo113boo4bobo37boo$163boo57boo118b obo34boo4bobo$160boo10bo4bo163bobbo11boo20bobo6bo$148bobo8b3o10bo4bobo 162bobo11boo20bo$148bo3bo7boo10bo7boo13boo146bobo31boo16boo3boo$132bo 19bo10boobboo11boo14bo148bo49boo3boo$130b4o14bo4bo9boobbobboo8boo14bob o5boo9b3o11bo29bo29bo29bo76b5o19boo$129boboboo4bo12bo15b4o5bobo4boo11b oo5bobbo9bo9bobo27bobo27bobo27bobo77bobo21bo$124boobbobbob3o5boobo3bo 3bo16bo7bo6bobo21bo7bo5bo5boo28boo28boo28boo101bobo6bo$124boo3boboboo 5b4obobbobo35bo21bo12b4o172b3o22boo4bobo$130b4o6boobboo40boo20bo11boob obo200boo18boo$132bo36boo9boo22bobbo11b3obobbo199boo17bo3bo$25boo6boo 125bobo5bobbobb3obbobbo21boo14booboboo199boo16bo5bo$24bobbo4bobbo124b oo6b3obb5obb3o38b4ob3o166boo31bobo4bo8bo3boboobboo$24bobbo4bobbo125bo 9b9o42bo4bobo166bo33bo3bo9bo5bo3boo$24bobbo4bobbo134bo9bo48bo163b3o38b 3obbo5bo3bo$25boo6boo115bobo17boo7boo48boo162bo52boo$151boo$151bo$$ 162b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o$161bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo21boo$136boo27bo29bo29bo29bo 29bo29bo29bo29bo29bo21boo$137bo23bobbo26bobbo26bobbo26bobbo26bobbo26bo bbo26bobbo26bobbo26bobbo$137bobo4bo8bobbo285bo$138boo3bobo10bo282b4o$ 141boo3bo5boo3bobbo57boo206boo10b4o9boo$37boo102boo3bo4boboboo3b4o54bo 207bobo9bobbo9boo$38bo102boo3bo14b4o5boo35boo7bobo198b3oboo4b3o8b4o5bo $35b3o56boo47bobo5boo8bobbo5boo35b3o6boo4b3o27b3o27b3o27b3o102b4obbo4b 3o8b4o4bo$35bo56bo3bo47bo16b4o28bo15boobo11bo29bo29bo29bo106boo4b3o12b o$91bo5bo13boo47b4o27bobo4b3o8bobbo10bo29bo29bo29bo112bobo$86boobboobo 3bo13boo47bo29bobo16boobo213boo$86boo3bo5bo10boo74boo3bobbo7bobboobb3o $92bo3bo10b3o74boo4bobo7bo3bobboo$94boo12boo81bobo6bobbo$99bobo9boo5b oo73bo8boo$99boo10boo5bobo$100bo19bo$120boo5$196boo9b3o11boo14b3o27b3o 27b3o$105boo9bo71bo7bobbo9bo11bo17bo29bo29bo$104b4o7bobo69bo3boo7bo7bo 5bo4bobo16bo29bo29bo$99bobobbobb3o5boobo68bo5bo6bo12b4ob3o$98bobbobboo 9booboo3boo63b5o7bo11booboboo$97boo9bo6boobo4boo71bobbo11b3obobbo$95b oo3bo8bo5bobo78boo14boobobo$67bo16bobo10boo10bo6bo96b4o$62b3oboobboo 12boo5boo5bobbo112bo$62b4o4boo13bo4bobo6bobo119boo$66boo22bo130bo$89b oo119bobo6bobo$208bo3bo6boo$200bo7bo$199b4o4bo4bo$198boobobo4bo13b3o 27b3o27b3o$160bo26boo8b3obobbo3bo3bo11bo29bo29bo$158b3o26boo9boobobo6b obo10bo29bo29bo$157bo41b4o$157boo41bo$23bo187bo$19boobboob3o34boo144bo bo$19boo4b4o26bo7bobo3bobo138boo$23boo30b3o5bo5boo84bo$13boo15b3o25bo 11bo82booboo56boo$13boo17bo24boo131boo22boo$31bo120bo5bo32bo$36bo154bo bo6bobo21boo47boo$34b3o115booboboo33boo5bobbo3boo16bo48b3o$33bo50bo 104bo8boo5b3oboobboo7bobo$33boo49b3o100b3o6boo3bo3bo3bo3bobo6boo13b3o 27b3o5b3o$12b3o72bo98bo11boo5bobo8bo22bo29bo5boboo$11booboo50bo19boo 98boo11bobbobboo6bobbo21bo29bo6b4o$11booboo50b3o131bobo13bo25boo$11b5o 4boo47bo113b3o27bobo27bo$10boo3boo22bobboboobobbo17boo113b3o27boo28bob o5bobo$20bobbo15b4oboob4o27boo8b3o27boo104boo18boo3bo3bo5b3o$24bo5b3o 6bobboboobobbo27bobo6booboo26bo35boo68bo24bo7bobobbobboo$16bo5bo6bo3bo 44bo8booboo24bobo35boo34boo25bo4bobo23bo4bo7boobbobbo15boo9boo183boo$ 15boboo9bo5bo52b5o24boo23bo39boo3boo3bo24bobo3boo25bo19bo13boo9bobo 183bo$15bo12bo5bo51boo3boo46b3o40b5o4bobo5boo15boobo29bo3bobb3o10bo8bo 6bo7b3o171bo10bobo$79boo57bo44b3o6boo5bobo14booboo30bobo15bo7bobo12b3o 170b4o9boo$15boobo9bo41b3o5bobo58bo44bo17bo13boobo45bobbo6boo3bo12b3o 163boo3boboboo$13bobbo11boo39bo3bo6bo5bo49bobbo59bobbo13bobo46boo8boo 3bo13bobo5boo155boobbobbob3o$13bobo12boo38bo5bo9boobo47bo66bo8bo5bo57b oo3bo14boo5bobo159boboboo$27boobbo36bo5bo12bo20boo24bo3bo60bobo7bobo 10b3o52bobo24bo160b4o$28bobo76bobo26bo62boo9boo12bo53bo25boo161bo$29b oo43bo9boboo21bo23bo5bo83bo$73boo11bobbo43bo5bo$14b3o56boo12bobo44bo3b o$13bo3bo8boo3boo38bobboo59b3o45boo$12bo5bo7boo3boo39bobo108boo32boo 116bo$13bo3bo54boo36boo105boo116b3o$14b3o11b3o69b3o7bobo41boo182bo$14b 3o11b3o55b3o13bo8b3o40bo49bo22boo108boo$29bo40boo3boo8bo3bo11bo10b3o 32bo4bobo49bobo20bo$70boo3boo7bo5bo20b3o32b4ob3o39boo12boo9boo5bobo$ 85bo3bo13boo5bobo32booboboo41boo12boo9boo5boo$15boo55b3o11b3o13bobo5b oo32b3obobbo55boo6boo$15boo55b3o11b3o13bo42boobobo53bobo7b3o$73bo19boo 6boo43b4o12bo41bo10boo120boo3boo$28boo54boo6bobo24b3o25bo12b3o55boo 120bo$28boo55bo8bo23bo3bo36bo58boo117bo5bo$82b3o74boo30boo145booboo$ 70boo10bo34bo5bo67bo147bobo$71bo45boo3boo57boo6bobo148bo9bobo$68b3o 109b3o6boo149bo8bobbo$68bo108boboo167boo$85b3o82boo5bobbo165boo3bo82bo $87bo82boo5boboo167boo82b3o$76bo9bo10boo81b3o166bobbo5boo71bo$75bobo 19bo19boo35boo3boo20boo167bobo5bobo70boo$63boo10boobo8bobo5bobo20bo 241bo47bo$63boo10booboo6bobbo5boo18b3o14bo22bo3bo42boo19boo135boo44b3o $75boobo6boo28bo16b4o20b3o16boo26bo19bo128bo52bo$75bobo5boo3bo44b4o19b 3o16bo27bobo5bo9bobo126b3o52boo22bo$76bo8boo46bobbo27bobo6bobo28boo5b oo8boo126bo77booboo35boo19boo$86bobbo43b4o25bo3bo6boo37boo135boo117bo 19bo$87bobo34boo6b4o26bo49b3o211bo5bo35bobo7boo6bobo$123bobo6bo28bo4bo 40boo3boo133bo121boo7boo6boo$123bo17bo20bo48boo133bobo77booboboo42boo$ 122boo15booboo18bo3bo16bo27bo133bo3bo124b3o6bo$164bobo14b3o161b5o125b oo6bo$138bo5bo35bo163boo3boo49boo3boo71boo$180boo163b5o51b5o72boo$138b ooboboo201b3o52booboo$347bo53booboo$402b3o21boo$427bo$424b3o$424bo$ 400boo$138boo261bo$139bo36b5o163boo52b3o$136b3o16boo18bob3obo163bo52bo $136bo17bo3bo17bo3bo15boo144b3o$153bo5bo17b3o16bo145bo$153bo3boboo17bo 6bo8bobo$153bo5bo23bobo8boo50boo20boo$145boo7bo3bobb3o18bobo62bo20bo$ 144bobo8boo4b3o17bobbo62bobo6boo8bobo$144bo37bobo63boo6bobbo6boo$143b oo38bobo18bo55bo$185bo16b3o48bo6bo$159boo3boo35bo49boo7bo$160b5o36boo 53bobbo$161b3o92boo$162bo$$199bo$198b3o$198b3o$$159boo35boo3boo$160bo 35boo3boo$157b3o16bo$157bo18bobo38boo$177bobo19boo16bo$177bobbo17bo7b oo7bobo$177bobo20boo4bobbo5boo$166boo8bobo21b3o7bo$165bobo8bo6bo18bo7b o$103boo60bo16b3o17bo7bo$103bobo8bo49boo15bo3bo20bobbo$98boo4b3o6bo7bo 58bob3obo19boo$94b4obbo4b3o5boo5bobo58b5o$94b3oboo4b3o7bo4bo3boo$103bo bo13bo3boo$103boo14bo3boo$120bobo3boo$121bo4bobo84boo$128bo82bobbo$ 128boo66bo7bo5bo7b5o$194b4o5boo5bo6bo5bo$107bo72boo11boboboo4boo5bo7b oo3bo$107boo53bo18bo10bobbob3o11bobbo7bo$95bobo8bobo53b3o13b3o11boobob oo14boo$95bo3bo65bo12bo11b3ob4o$85boo12bo10boo52boo23bobo4bo$85boo8bo 4bo7bobbo77bo25bo$99bo7bo80boo25b3o$95bo3bo7bo110bo$95bobo9bo83bo17boo 6boo$108bobbo5boo72b3o15bobo$28bo81boo5bobo74bo14bo$28b3o88bo73boo$31b o87boo45b3o$30boo133bo3bo$164bo5bo$165bo3bo25b3o$166b3o25booboo17b3o$ 166b3o25booboo17bo19boo$194b5o18bo18boo$14bo15boo3boo156boo3boo$14b3o 13bo5bo127boo$17bo147bo$16boo13bo3bo126b3o46boo23bo$32b3o127bo48boo11b oo9b3o$224bobo7bo3bo$224bo8bob3obo$234b5o$198boo$198bo$26bo172b3o66bo 5boo$16boo3boo3boo7bo165bo64bo3bo3b3o$25bobo5booboo193b3o36bo5boobo$ 17bo3bo209bo33bo5bo4bobbo$18b3o11bo5bo193bo32boo9boobo$18b3o253b3o7boo $32booboboo235boo8bobo$286bo$21bo264boo$20b3o249boo$19bo3bo248bo$21bo 211b3o28bo5bobo$18bo5bo207bo3bo26bobo4boo$18bo5bo206bo5bo24bo3boo$19bo 3bo207booboboo24bo3boo$20b3o11boo226bo3boo$34boo217boo8bobo$252bobo9bo $252bo$251boo$231boo$232bo$229b3o$229bo$21boo21boo$21boo22bo$45bobo8bo 267boo$46boo5b4o4bo262boo$52b4o5bo259boo6bo$52bobbo9boo209bo36boo5b3o 6bo$52b4o9boo204bo4b4o33boo6boo$53b4o214bo5b4o43boo6boo$56bo209boo9bo bbo43boo6bobo$266boo9b4o53bo49boo$276b4o5boo47boo48boo$276bo8bobo$287b o$287boo98bo$386bo$386bo3$382boo3boo$385bo$382bo5bo$383booboo$384bobo$ 385bo8bo$77bo307bo6bobo$76bobo312bobo11boo$76boobo4boo304bobbo11boo$ 76booboo3boo305bobo$76boobo312bobo$65boo9bobo315bo16bo$64bobo10bo306bo 24b3o$64bo318bobo22bo$63boo319boo22boo$101bo$101b3o301b3o$104bo300b3o$ 103boo299bo3bo$403bo5bobboo$375boo27bo3bo3boo$375boo28b3o$106bo271boo$ 105b3o270b3o5boo$105b3o270boo6boo$368boo5boo$73boo28boo3boo257bobo5boo 35b3o$73boo28boo3boo257bo14boo27booboo$366boo12bo3bo11bo14booboo$60boo 32bobo277boo3bo5bo9bobo13b5o$60boo11b3o16bo3bo277boobboobo3bo10boo12b oo3boo$73b3o9boo5bo286bo5bo20boo$85boo4bo4bo283bo3bo21boo$92bo8bo280b oo42bo$92bo3bo4bo323bobo$71boo3boobbo13bobo328boobo4boo$72b5o3b3o342b ooboo3boo$73b3o7bo23boo316boobo$74bo7boo23boo281b3o32bobo$57booboboo 325bo3bo32bo$412bo$57bo5bo324bo5bo16bobo$388boo3boo17boo$58booboo$60bo 52boo$73bo39bobo275bo26boo$71boo35boo4b3o273bobo25bobo$72boo8boo3boo 15b4obbo4b3o272bobo25bo$84b3o17b3oboo4b3o275bo12boo5bo$83bo3bo25bobo6b oo268bo11b3o3bo3bo$84bobo26boo7bobo264bobbo8boboo5bo$57b3o25bo18bo19bo 170bo94boo9bobbo4bo5bo$56bo3bo12boo3boo15bo7bobo18boo167b3o105boboo9b oo$65boo8b3o16bobo4boo3bo9boo174bo103boo6b3o11bo$55bo5bo3boo7bo3bo15b oo5boo3bo9boo174boo101bobo7boo11b3o$55boo3boo13bobo6boo15boo3bo288bo 25bo$76bo7boo17bobo288boo24boo$100bo3bo$70bobo5boo19bobo$71boo5bo20bob o$71bo7b3o18bo186boo3boo15bo$60boo19bo205boo3boo13b3o$60bo245bo114boo$ 61b3o33booboboo185b3o14boo109boobboo$63bo33bo5bo185b3o125boo$98bo3bo 187bo$99b3o$67bobboo15bo364boo$66bo3boobboo11boo331boo18b3obbo5bo3bo$ 66bo7boo6boo4boo331boo13bo3bo9bo5bo3boo$67b4o11boo4b3o205boo112bo9bo 13bobo4bo8bo3boboobboo$82boo4boo197b3o6bobo111bobo19boo16bo5bo$79boo6b oo7boo4boo183b3o6bo4boo3boo90boo11bobo9boo7boo17bo3bo$78bobo6bo8bobo3b o183bo3bo12b3o92boo11bobbo7b3o7boo18boo$78bo19bo4b3o196bo3bo104bobo5bo boo5boo4bobo$77boo19boo5bo179boo3boo11bobo104bobo6bobbo4bobbo5bo$304bo 105bo8boboo5boo$422b3o$301b3o119boo$301b3o4$205bo84boo7boo3boo$204b4o 82bo9b5o$203boobobo82b3o7b3o$192boo8b3obobbo83bo8bo$192boo9boobobo$ 204b4o3boo$205bo5bobo$213bo$213boo3$301boo$301boo22$bbo505bo$bobo503bo bo$obo505bobo$oo507boo! golly-3.3-src/Patterns/Life/Signal-Circuitry/Unit-Life-Deep-Cell.rle0000644000175000017500000003764312026730263022130 00000000000000#C Deep Cell by Jared James Prince. A slight modification of David #C Bell's Unit Cell -- see Unit-Life-Cell-512x512.rle in the same #C folder. For the original pattern and some background, see #C http://radicaleye.com/lifepage/patterns/unitcell/ucdesc.html. ) #C #C The Deep Cell runs two Life universes instead of one. The two #C universes (referred to as A0 and B0) do not interact with each #C other. The ON/OFF state of A0 is found every 7680 ticks and is #C indicated by the presence or absence of a glider between the #C 6 boats in the upper left quadrant. The state of B0 is indicated #C the same way but offset by 3840 ticks -- thus the state readout #C occurs every n*7680 for A0 and n*7680+3840 for B0. #C #C This version is set with A0 initially ON (indicated by glider in #C boats) and B0 in a pre-start ON state (indicated by 3 blocks in #C the vertical chamber in the lower left quadrant) so B0 will be #C officially ON in 3840 rounds. To start A0 OFF, delete the glider. #C To start B0 OFF, delete the 3 blocks. #C #C An infinite tiling of Deep Cells allows for an infinite hierarchy #C as follows: Set universe A0 to generate an arbitrary Life pattern. #C Set universe B0 to generate another layer of Deep Cells. This #C new layer has two universes, called A1 and B1. Set universe A1 #C to generate an arbitrary Life pattern. Set universe B1 to generate #C another layer of Deep Cells. This new layer has two universes, #C called A2 and B2. Set universe A2 to generate an arbitrary Life #C pattern. Set universe B2 to generate another layer of Deep Cells. #C This new layer has two universes, called A3 and B3... #C #C Written in 1998 but couldn't be tested properly, forgotten, then #C remembered and tested in 2004. x = 499, y = 516, rule = B3/S23 49boo$49boo4$48b3o$48b3o$47bo3bo$46bo5bo$47bo3bo10boo$48b3o11boo5$47bo bo13bo$47bobbo12bo$oo47boobo9bobo432boo$obo58booboo430bobo$bobo45bo10b o5bo428bobo$bbo46boboo10bo432bo$50bo9boo3boo3$44boo3boo10b4o$45b5o11bo bboo$45booboo7bobooboboo$45booboo6bobbo$35boo9b3o8bobo3boo126boo$35bo bbo25bo126bo$181boo6bobo103boo$39bo141boo6boo104bo$44boo12booboboo71bo 41boo97bo5boo8bobo$37boo6bo12bo5bo69b3o33boo5b3o6bo88bo3bo3b3o7boo$36b o5b3o14bo3bo69bo36boo6boo6bo92bo5boobo$42bo17b3o70boo46boo91bo5bo4bobb o$181boo91boo9boobo$33boo3boo243b3o$33boo3boo243boo$34b5o$35bobo$58boo 71bo251boo$35b3o21bo70b3o250boo$56b3o70b5o$56bo71bobobobo$128boo3boo 246bo$382bo$33boo347bo$34bo96bo$31b3o96bobo$31bo98bobo247boo3boo$131bo 251bo$19boo110boo247bo5bo$20bo110boo248booboo$20bobo8boo98boo249bobo$ 21boo8boo350bo$5boo21boo6bo3boo341bo$5boo20b3o5bo3bobo324boo82boo$28b oo6b5o325boo82boo$6bo24boo4b3o$5bobo23boo347boo81boo$5bobo373bo81bobbo $6bo371b3o68b3o$378bo70b3o15bo$448bo3bo$3booboboo437bo5bo11boo$3bo5bo 356b3o32bo46bo3bo11bo$4bo3bo356bo3bo31boo46b3o$5b3o356bo5bo19bo5boo4b oo$364booboboo19bobo3boo4b3o7boo47boo3boo$23boo366bobobboo4boo8boo47b oo3boo$23boo366bobbo6boo59b5o$367bo23bobo7bo46bobo12bobo$366bobo11boo 8bobo55bobbo$366bobo10bobo8bo59boobo9b3o$3boo362b3o9bo16boo$4bo364boo 7boo16bobo51bo$b3o18b3o344bo26bo53boboo$bo19booboo344b3o78bo$21booboo 346bo$21b5o384bobo23boo23bo$20boo3boo378boo3bobbo22boo7boo3boo8bo$398b oobboob3o5boo6boo23b5o9b3o$397bobo3bo3bo3bo3boo4boo23booboo15bo$5boo 389bo8bobo5boo21b3o7booboo14b3o$5boo23bo365bobbo6boobbobbo22b3o8b3o14b 5o$30b3o201boo160bo13bobo50boo3boo$33bo199bobo35bo30bo86boo6bobo$32boo 189boo7bo6boo30b3o28b3o83bobo7boo$25boo196boo7bobbobbobbo32bo30bo82bo 45boo3boo4boo18bo$25bo206bo6b3o20boo9boo29boo81boo46b5o6bo18bo$26b3o 204bobo5b3o18boo172b3o4b3o13boo$28bo205boo6bobo192bo5bo15boo7boo$35bo 123boo83bo17bo13bo186boo3bo$6bo27b3o123bo68boo13boo15bobo10booboo184b oo4b3o$5b3o26b3o123boboo5boo58boo30bobo182bo24bo$4b5o152bo7bobo43bo10b oo34bo10bo5bo26b3o136bo$3boo3boo22boo3boo126bo4b3o7boo33bobo7b3o77bo3b o135b3o$4b5o23boo3boo124bobbo4b3o6boo36boo6boo45booboboo24bo5bo117bo$ 4bo3bo155boo4b3o31boo12boo9boo5boo21booboboo38booboboo116bobo22boo$5bo bo161bobo32boo12boo9boo5bobo20bo5bo160boboo22boo$6bo162boo44bobo20bo 21bo3bo13bo141boo3booboo$215bo22boo21b3o11bobbo28bo112boo4boboo11b3o$ 3boo273bo27bobo103boo13bobo$4bo27boo194boo44boo30bobo104bo14bo$b3o29bo 194boo44bo32b3o103bobo5boo$bo28b3o241bobo32boo103boo5bobo$30bo244boo 32bo114bo7boo$310b3o95boo11bobbo7boo$234bo29bo47bo95boo14bo$184bo25boo 9boo12bo29bo9boo3boo139bobo25boo3boo$182b3o25bobo7bobo10b3o27b3o9bo5bo 139boo$155bobo23bo19boobboo6bo8bo5bo221bo3bo$42bo110bo3bo23boo18boobo bbobbobbo13bobo46bo3bo170b3o$42b3o108bo51boo6bo13boobo46b3o171b3o$45bo 106bo4bo8boo42bobo14booboo$44boo107bo12boo42boo15boobo27b5o$147boo4bo 3bo69bobo3boo22bob3obo165boo23boo$47bo98bobo6bobo70bo4bobo22bo3bo145b 3o18boo23bo$46bobo97bo88bo23b3o18boo125bo3bo43b3o$45bo3bo81boo12boo88b oo23bo19bo125bo5bo29bo14bo$45b5o81boo91boo55b3o122bo5bo26b4o4bo$44boo 3boo125boo3boo41bobo35boo19bo125bo28b4o5bo$45b5o161bobo13bo34bo144bo3b o26bobbo9boo$46b3o128bo3bo28bobbobboo6bobbo21bo13b3o13bo128b3o27b4o9b oo$47bo130b3o28boo5bobo8bo22bo14bo14bo128bo29b4o$178b3o20boo4boo3bo3bo 3bo3bobo6boo13b3o27b3o123bo37bo$201boo6boo5b3oboobboo7bobo168bobo17boo 4b3o$210bobbo3boo16bo169bobo16boo3bo3bo$54boo96bo58bobo21boo155boo11bo bbo$54boo72booboboo17b3o237boo11bobo6boo12bo5bo$155bo23boo44boo177bobo 7boo12boo3boo$128bo5bo19boo23boo44boo177bo$424bo$46boo81booboo23bo63b oo199booboo4bo$46boo83bo24bobo61bobo207bobo$155bo3bo62bo198bo5bobbobo$ 155b5o51bo220bo$154boo3boo13bo35b4o207booboboo4bo$51booboboo75boo20b5o 13bobo22boo9boobobo6bobo10bo29bo29bo134bobbo$133bo22b3o13bobo23boo8b3o bobbo3bo3bo11bo29bo29bo134boo$38boo11bo5bo76b3o20bo14boo3bo31boobobo4b o13b3o27b3o27b3o$38boo96bo39bobo31b4o4bo4bo$52booboo118bobo33bo7bo$54b o120boo3bo38bo3bo6boo$172bo6bobo39bobo6bobo146boo6boo37boo$173bo4bobo 51bo145bobbo4bobbo36bo$39bo125boo4b3o4boo52boo143b6obb6o36b3o$39bo16b oo106bobo58bo152bobbo4bobbo39bo$38bobo15bo106bobo58b4o151boo6boo$37boo boo15b3o66bo29boo6bo3boo37boo14boobobo$36bo5bo16bo65bobo28boo9bobo37bo bbo11b3obobbo168boo$39bo84bo3boo36bobo30b5o7bo11booboboo168bobo$36boo 3boo81bo3boo3boo32bo3boo25bo5bo6bo12b4ob3o167bo$124bo3boo3boo35bobo25b o3boo7bo7bo5bo4bobo16bo29bo29bo78boo$114boo9bobo41bobo27bo7bobbo9bo11b o17bo29bo29bo24boo50bobo$113bobo10bo43bo36boo9b3o11boo14b3o27b3o27b3o 25bo49bo6boo$113bo222bobo8boo37bobbobbobbo$112boo51bo171boo7bobo37bo6b oobb3o$164bobo178b3o4boo25boo6bobo7b3o$36boo126boobo7boo167b3o4bobb4o 20bobo7boo6bo3bo$37bo109bo16booboo6bobo167b3o4boob3o20bo16bo5bo$34b3o 110boo15boobob3o6bo16boo149bobo28boo17bo3bo$34bo100boo11boo14bobobbobb obbobbo17bo150boo48b3o$134b3o3bo7b3o14bo4boo6bo17bobo5bo8boo205boo$ 131boboo4b4o5boo25bobo6boo11boo3bobo6bobbo206bo$124boo5bobbo4bo4bobboo 26boo7bobo14bobo7bo3bobboo201bobo7boo$124boo5boboo5bo3bobbo38bo13bobbo 7bobboobb3o201boo6bobo$134b3o3boobo18bobo21boo13bobo16boobo205bo13bobo $135boo25boo5boo9boo20bobo4b3o8bobbo10bo29bo29bo29bo104bobbo6boobbobbo $71boo90bo4bobbo7bobbo21bo15boobo11bo29bo29bo29bo103bo8bobo5boo$23bobb oo4boobbo34boo95b3o9b3o35b3o6boo4b3o27b3o27b3o27b3o69boo33bobo3bo3bo3b o3boo4boo$22bo3b3obb3o3bo110bobo20b9o38boo7bobo166bo34boobboob3o5boo6b oo$23bobboo4boobbo112boo19bobb5obbo48bo163b3o42boo3bobbo$149bo20boobb 3obboo48boo162bo49bobo3$172bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26b obbo26bobbo26bobbo$158b4o14bo29bo29bo29bo29bo29bo29bo29bo29bo$157bo3bo 10bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo$136boo 23bo11b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o$70b3o64bo20bobo$69bo 3bo63bobo7boo294boo$68bo5bo63boo7boo4bo277b3obbo5bo3bo$69bo3bo70boo6b 5oboo58boo160bo46bo3bo9bo5bo3boo$37boo31b3o70b3o5bobboo4bo57bo161b3o 42bobo4bo8bo3boboobboo$38bo31b3o71boo5boo8bo8boo34bo9bobo164bo33boo4b oo16bo5bo$35b3o58bobo48boo4bo7bo8boo33bobo8boo164boo33boo4boo17bo3bo$ 35bo59bobbo48boo12bo33boo6boo3bo214boo18boo$73boo19boo10bo6bo46bo33bob o4boobo3bo216bobo$73bo12boo4boo3bo8bo5bobo43boo33b3o4b3obo3bo218bo$74b 3o9boo6boo9bo6boobo68boo6b3o4bobboobobo$76bo18bobbobboo9booboo67boo7b 3o4boo4bo$96bobobbobb3o5boobo78bobo$101b4o7bobo3boo75boo$102boo9bo4bob o$120bo88bo3boo28boo28boo28boo78b5o$120boo85bobobbobo27bobo27bobo27bob o77bob3obo$208boo4bo29bo29bo29bo78bo3bo5bo$95bo3boo283b3o5bobo$93boo3b oo285bo5boboo$94boo4bo289booboo$196bo8boo14boo168boboo$112boo80bobo6bo bbo14bo170bobo8boo$112bobbo71boo4bobo7bo3bobboo7bobo171bo9bobo$102bo3b 3o7bo70boo3bobbo7bobboobb3o6boo184bo$101b5o3bo6bo6boo68bobo16boobo189b oo$100booboo3bo7bo6boo69bobo4b3o8bobbo$68boo29b3oboo3bo3bobbo80bo15boo bo$68b3o29boob4o5boo96b3o$62boobbobbobo19boo8b4o105boo$62boobboobboo 18bobo9bo118boo5boo28boo28boo$66boo22bo130bo5bobo27bobo27bobo$89boo 122bo5bobo7bo29bo29bo$80bo131boo5boo$78boo110bo5boo13boo$79boo107bo3bo 3b3o11b3o$192bo5boobo9boo3boo$57b3o100bo26bo5bo4bobbo10boo$57bo100b3o 26boo9boobo11bo$36boo20bo98bo38b3o10bo$21boo12bobo119boo37boo9bobo$20b 3o14bo170boo$19bobobbobboo125bo$19boobboobboo26bo98bo$23boo30b3o97bo$ 13boo43bo154boo28boo28boo$13boo42boo131boo20bobo27bobo27bobo$152boo3b oo32bo22bo29bo29bo$36bo28bo86bo5bo32bobo9bo20boo$34b3o26boo127boo8b4o 18bo$33bo30boo18bo68bo3bo31bo11boobobo6bobo6bobo$33boo49b3o67b3o30b3o 10b3obobbo3bo3bo6boo$72b3o12bo98bo14boobobo4bo$66bo5bo13boo98boo14b4o 4bo4bo49b3o11bo$21boo43b3o4bo129bo7bo30boo23bo10boo$12b3o5bobo19b6o21b o141bo3bo27bo22bo11bobo$11bo3bo6bo18bo6bo19boo143bobo27bobo8bo$10bo5bo 11boo3boo5bo8bo68boo104boo18boo7boo$10bo5bo14bo9bo6bo69bo35boo68bo27b oo4boo5bo$24boobbo5bo7b6o67boobo35boo34boo21boo7bobo26b3o4boo3bobo21bo 7bo184boo$16bo7bobobbooboo47boo5b3o26bo23bo49bo21bobbo5boo4boo22boo4b oobbobo21b4o5bobo182bo$15boo7bo5bobo48boo4bo3bo21bo25b3o49bobo5bobo15b o9bobo23boo6bobbo16boobbobboo8boo169bobo6bobo$15boo14bo36boo3boo11bo5b o22bo22bo53boo3bo3bobb3o10bo11bo24bo7bobo16boobboo11boo169bo3bo4boo$ 13bobboo13bo39bo14bo5bo21bo23boo41boo3boo9bo19bo45bobo12boo10bo7boo 159boo12bo$14bobo51bo5bobboo104b3o10bo4bo7boobbobbo48bo11b3o10bo4bobo 4boo155boo8bo4bo$14boo53booboobbobo7bo95bo3bo10bo7bobobbobboo63boo10bo 4bo6bobo168bo$70bobo5bo7boo95bobo11bo3bo5b3o71boo21bo164bo3bo$29bo41bo 14boo96bo14bobo79boo21boo163bobo$12boo3boo9b3o40bo13boobbo16boo$12boo 3boo8bo3bo54bobo16bobo28bo$26bob3obo54boo18bo27b3o$14b3o10b5o102b5o44b oo$14b3o56bo59boo3boo43boo150bo$15bo56b3o9boo3boo23bo220b3o$71bo3bo8b oo3boo22bobo38boo182bo$70bob3obo35bo3boo36bo47boo9boo12boo108boo$71b5o 10b3o9b3o11bo3boo17b3o4boo8bobo47bobo7bobo12bo110b3o$86b3o11bo11bo3boo 17b3obbo3bo7boo39boobboo6bo8bo5bo4bobo111bobo$87bo11bo3boo8bobo4bo18bo 5bo47boobobbobbobbo13bobo3boo111bo3bo$15boo85bobo9bo4bobo16boobo3bo51b oo6bo13boobo115b5o$15boo85bo15bo3bo16bo5bo56bobo14booboo113boo3boo$ 101boo15b5o17bo3bo17bo39boo15boobo115b5o$28boo54boo31boo3boo18boo16b3o 56bobo117b3o$28boo55bo5boo25b5o36bo60bo119bo$82b3o5bobo26b3o37boo30boo $70boo10bo9bo27bo70bo$71bo107bo9bobo161bo$68b3o108boo8boo161b4o$68bo 88bo16boo4boo169boobobo$156b3o11boobboo4b3o167b3obobbo76bo$156b3o11boo bboo4boo169booboboo74b3o$72boo9b3o11boo80boo171b4ob3o71bo$64bo7bobbo9b o11bo19boo35boo3boo18bo173bo4bobo70boo$63bo3boo7bo7bo5bo4bobo20bo35boo 3boo199bo47bo$63bo5bo6bo12b4ob3o18b3o15boo67boo19boo135boo44b3o$64b5o 7bo11booboboo20bo16bobo40boo26bo19bo128bo52bo$72bobbo11b3obobbo36b3o4b o18boo16bo27bobo8bo6bobo126b3o52boo$72boo14boobobo36b3o4bobo16bo7boo7b obo28boo8bobo4boo126bo117boo19boo$89b4o38b3o24boo4bobbo5boo40bobo131b oo52bo64bo19bo$90bo33boo6bobo4boobo15b3o7bo46bobbo183b3o24bo38boboo3b oo9bobo$123bobo7boo5bobo17bo7bo46bobo183bo3bo22b3o38bo3bo3bo8boo$123bo 16boo18bo7bo45bobo186bo23b5o46bo$122boo40bobbo15bo30bo185bo5bo19boo3b oo38bobbo3bo$164boo15b3o162b3o51bo5bo65bo5bo$138boo3boo11boo22bo220bo 3bo67bo3bo$138bo5bo11boo22boo164bobo53b3o25bo44boo$345b5o80bo$139bo3bo 200boo3boo$140b3o35bo165boo3boo75boo$178bo248bo$177bobo244b3o$176boob oo243bo$175bo5bo218boo$138boo38bo222bo$139bo35boo3boo162boo52b3o$136b 3o14bo191bo52bo$136bo14bobo42boo144b3o$149boo45bo145bo$149boo6boo3bo 15bobo4boo7bobo$149boo10bobo14boobo3b3o6boo50boo20boo$145boo4bobo9bo 14boobo5boobo56bo20bo$144bobo6bo8bo17b3o4bobbo56bobo6bo9bobo$144bo42b oobo57boo4bobo9boo$143boo40b3o16bo48bobo$185boo15b3o47bobbo$201bo51bob o$202bo51bobo211boo$199bobbo53bo212bo$159boo3boo32bo270bobo9bo$161b3o 33bo3bo268boo8bobo$160bo3bo34bo279bo3boo$161bobo32bo5bo276bo3boo$162bo 33bo5bo276bo3boo$197bo3bo278bobo$159boo22boo13b3o280bo$160bo22boo$157b 3o15boo307b3o$111boo44bo16b3o40boo265b3o$109bobbo58boboo42bo265bo3bo$ 108bo7b3o3bo48bobbo4b3o28bo4bobo264bo5bo$100boo6bo6bo3b5o47boboo5boboo 25b4ob3o266bo3bo$100boo6bo7bo3booboo41boo6b3o3boboo24booboboo269b3o$ 109bobbo3bo3boob3o39bobo7boo4bobo23b3obobbo$111boo5b4oboo40bo42boobobo $120b4o8boo30boo43b4o$117bo4bo9bobo75bo$117boo15bo45boo3boo11boo$116bo bo15boo47bo14boo$180bo5bo$181booboo301boo$182bobo302bo$101bo7bo73bo20b oo8bo273b3o$99bobo5b4o72bo20bobbo6bobo273bo$91boo4boo8boobbobboo83boo bbo3bo7bobo$91boo4boo11boobboo82b3obboboo8bobbo3boo$97boo7bo10boo61boo 13boboo4b3o9bobo4boo$99bobo4bo10b3o42bo18bo13bobbo15bobo$101bo4bo10boo 43b3o13b3o14boboo7bo7bo$114boo7boo40bo12bo11boo6b3o4b3o$34bo79boo7bobo 38boo23bobo7boo5boo$34b3o88bo63bo14bo10bo$37bo87boo61boo15bo9b3o$36boo 180bo$166b3o22bo25boo$39bo125booboo21b3o$38bobo124booboo24bo16boo$37bo 3bo123b5o23boo16bobo$38b3o123boo3boo40bo$20bo15boo3boo$20b3o$23bo$22b oo$42bo193boo$43bo151b3o20b3o15boo$41boo151bo3bo19bo$41boo121boo27bo5b o19bo$165bo27bo5bo$22booboboo133b3o31bo14boo$22bo5bo133bo31bo3bo12boo$ 23bo3bo167b3o$24b3o3bo165bo29boo7b3o$30boo194bobo5bo3bo$29bobo9bo156b oo26bo$40b3o155bo34bo5bo$39b5o155b3o31boo3boo37bo$38boo3boo156bo74boo$ 275boo4boo$233boo30boo7b3o4boo$27bo204bobo30boo8boo4boo$27bo12b3o189bo 43boo6boo$26bobo11b3o189boo43bo6bobo$25booboo206bo49bo$24bo5bo202bobbo 49boo$27bo12boo194bo35boo$24boo3boo9boo230bo$260boo8bobo$231booboboo 22boo8boo$26bo236boo$26bo204bo5bo25b3o$25bo237boo$232booboo16boo5boo$ 234bo17bobo5boo$27boo21boo200bo$27boo22bo199boo$51bobo7bobo167boo$52b oo7bo3bo166bo$65bo163b3o$61bo4bo4boo156bo$65bo5boo$61bo3bo$61bobo257b oo$319bo3bo$318bo5bo$274boo37boobboobo3bo$272bo3bo36boo3bo5bo$271bo5bo 41bo3bo8boo$266boobboobo3bo43boo9bobo$266boo3bo5bo56bo49boo$272bo3bo8b oo47boo48boo$274boo9bobo$287bo$287boo96bo$384bobo$383bo3bo$383b5o$382b oo3boo$78bo304b5o$77bobo304b3o$75boo3bo9boo293bo$75boo3bo9boo$75boo3bo $71boo4bobo316boo$70bobo5bo316bobo$70bo323b3o4boob3o$69boo322b3o4bobb 4o$107bo286b3o4boo$107b3o285bobo$110bo285boo13bo$109boo298b3o$383boo 23bo$383boo23boo3$112bo$111b3o292bo$110b5o290b3o4boo$79boo28bobobobo 258bo30b3o4boo$79boo28boo3boo257bobo$372boboo27boo3boo$66boo33bobo267b ooboo10boo15boo3boo$66boo12bo19bobbo268boboo10boo$79bobo9boo6boo267boo 3bobo$78bo3bo8boo4boo3bo3bo3boo255bobo4bo31bo$64bo13b5o16boo6bo259bo 16bobo18bobo$65bo11boo3boo16bobbo3bobbo255boo15bobbo9bo7boo$65bo12b5o 3bo14bobo5bo264boo6boo12bo7boo6b3o$79b3o4b3o285boo4boo3bo10bo7b3o4bo3b o$80bo8bo22b3o267boo21bobobbo5bo$63boo3boo18boo293bobbo19boobbo5bo$66b o317bobo26bo8boo$63bo5bo341bo10bobbo$64booboo12bo319boo9b4oboo7bo6boo$ 65bobo10boo320boo11b4obbo6bo6boo$66bo11b3o321bo14boo7bo$66bo12boo38bo 302bobbo$79bo8booboboo24boo301boo$78bobo33boo4boo290b3o$78boo8bo5bo15b oobboo4b3o289bo$110boobboo4boo266boo3boo18bo8boo$89booboo25boo7boo260b 3o30bo$69bo9booboboo5bo27bo8bobo258bo3bo29bobo8bo$111bo18bo259bobo31b oo8bobo$63b3o13bo5bo14boo7bobo18boo259bo43bobo7bo$62bo3bo4boo27boo6bob o11boo311bobbo6boo$61bo5bo3boo7booboo22bobbo11boo283bo27bobobboo4boo$ 61booboboo14bo7boo16bobo295bobo25bobo3boo4b3o7boo$90boo17bobo278boo13b o3boo23bo5boo4boo8boo$76bo34bo183bo94boo13bo3boo3boo29boo$77boo5boo20b o186b3o109bo3boo3boo29bo$76boo6bo20b3o184bo103boo8bobo24bo$85b3o16bo3b o183boo101bobo9bo24bo$66boo19bo18bo288bo31b3obb3o$66bo36bo5bo284boo31b o$67b3o33bo5bo318bo$69bo34bo3bo313boo$105b3o314boo$78bobo228bo133bobo$ 77bo14bo196b3o15b3o125b3o5bo3bo$72boobbo4bo8b4o194bo3bo13bo113boo8boo bbobbobo7bo5boo$72boobobboboo7boboboo192bo5bo12boo112boo6bobbobboo7bo 4bo4boo$76boo10bobbob3o191bo5bo133bo19bo$89boboboo332bo10b3obbo3bo$85b oo3b4o8boo4boo177bo139bo15bobo$84bobo5bo9bobo3bo178boo14b3o115boo5bobb o$84bo19bo4b3o175boo3b4o124bobo7boo$83boo19boo5bo174boobbobbo9bobo114b o$287bobo4bo7b5o112boo$288boo11boo3boo$301boo3boo$$285boo3boo$285boo3b oo9boo$299boobo$206boo79b3o9bo$204bo3bo78b3o$203bo5bo78bo11b3obo$198b oobboobo3bo94bo$198boo3bo5bo94bo$204bo3bo8boo$206boo9bobo70boo$219bo 70bo$219boo70b3o$293bo5boo3boo$301b3o$300bo3bo$301bobo$302bo4$301boo$ 301boo10$bbo493bo$bobo491bobo$obo493bobo$oo495boo! golly-3.3-src/Patterns/Life/Signal-Circuitry/single-channel-spiral-growth.rle.gz0000644000175000017500000004741213151213347024704 00000000000000‹ ä}Û®%GrÝ{~Å1T€_ä™Ê{¦Á°eðáz7ÐEõˆ q¸‰&©ñü½+ÖZ‘Uûôé )¿Ò°ÏÞuÙU™‘qY±"òoþþåúðñÝ/ÿüññ—_¾ùðãËß?~üË»¿þûŸ_þׇ?½ùõç?þó‹ýç‡÷ÿá»ïßýøãû^þñÇwÿååãûï>üôþáoþþ忾û×÷/ÿýãû÷?¾ÿÛ—_þç¯?¾I{ìûr¼ûùý?½<~~ýçï_þüþÏ}y÷¯ï>üðîøá|È_¾?/ÿéÝ/¿¼ÿøãË_>üðÃËÇ_|ùÓ»ŸÏ/ø0ï~yÿ»¼<>žÿÔ—w:¼üéÃ~þÞFäÃ/?ŸŸ>þüËËŸÞÿåå»ÇçÿúÝ/·ÿî¯ßýð~=Î÷¿üòÓüã¿Ã¨þpé¾{üùz|üõÏ?ÿñ_?¼ÿË/Ÿ>|÷‡Ÿ¾ÿé?ýôw¥cö7?•Òg²ëÿÏËß½ÄÙÚß¾üõü+íû9 ýáýùá¿ä?þcÊa¦v¤Çfÿ<ûwÂoÊQç_é°ÿÇgûCÿ‡3º üyÌó;?Å“ã<góƒýNµóvüH²Ûè—+öüÁZnO×vÿÕÿ¬zètþ.Žûמ"Ùþ9ªžÿð‚\Ök&»?oW< Ø£ÙMb9BòWåëïxä¸^ù<3®Ï¸õù« ·¬Íþ[òùu˜|{~ø_•7(Ѿœâeì~xôsHžåsØÂ#f\‘pfÁ<äí·N^¸f¯Üæs‘oƒ/x#ÌåèÓ>Œ>0Ù¹ãÓ8Ÿ2Ÿßô5¿‡O‹aÙÆvñÄUø7=ZõÁ:8§5rçü<ÏÙÔ=Ö{gÍbs1Ã\†¦7ÖŒ¶öƬŽjÕüÝ Zç—öä}ç;<ëÑ“½ÅÃ¥ Ï‚Õßt·±l¼9æt·'°ã矟pAÊXÝŸMÂÌùQ9q£s"G;_wR6Ã8ŸóÑðÆû| Á9ZX”©óãŒWXMˆîq>÷ÄÛi–|Ìüm+<ÜäœoÓR5†œÿó~s@°#n·3ãù}аCÓ+!IÛù¼ÅÞg^Œùø™Ø ?ÅÆšËú’ò$2œ Ž –ˆ¿¾»Ö‘óíʸûYçË/î|*¬ZOŸWáùçh—t<ë ŒJi·LçS–r /t†*?ðc“+bï|½IáŦÜć2)­çDÛ/ÈÒ¨¦4ìU|Ý^á9ëZ[çßÐ&æ®{«e¤[ê& 1VŽ·]™x¢8‡Ç´^æTF #¿ÍGÈ>A&õÛ” àùc“\ã%]T®—þ&š°ÛH&aµò“!NDx$LvåáL<È€èžvM=FÙž.¦òÚl…Ïi¸­›°¦n"ažêÀî0+ᮽû7Rm¾1”ç–ô§-ðìw¶éíB‚Yœ 0ùRÑV?%Ô ‘K)­'aì¶²"îP°øQË`=Æy—ã<ð[xŸnÃi“ ÔŸE› à$ §Ô(BÒ剢ÏåˆþªqP®£ÉX°Áⲃ…ˆQ’H+!6Šs[?ü’ ÆãS¨ÓÞç?<|´¡˜Ý–X×âÆ7çËåvÿbœSuSm€;$cÓ{<ª«ˆ%åÛ(u{âÈv×5”ÉgþNö=GØ¿µ¥H-[!Œ§u˧š2™<&ŽîAÝnc‰/3¾¥r·/cî÷å•vi©§Evº”°×j¾ÃËÀEÒT=á|èúÀ/lµDª«›G÷ÉÊ&ð2”7å Ù,Û8ÛÈuü×´ÞsÚÝ{ßöÐOöç)¾¥>Ea˜LÌó<;ãe«þ\Xñàz©Ò“˜¾Ôt쮦f?xj))[ˆÙ$#ÊøŽi*{×_Ù§F3§ü€õßNŸ£Û$ª†h(ž&ŒXw0ý”™'Ë!üÉÕLór2õ·Û¼SÍÛ•)Kçcq‹!$_¼õZ<jcçòÉÔ \Ü0U2…óíà)¸±¸M”ûN+jcÜÔh¥õ°«ã±~®æÚΰ;ŲËÜ\³ewÂ%ž§s.y8MíFŸ´è¾êúµ~5&üæ&®Ðfj¡A$:<Ì:— ¤=“ûtû@%xÎwÔ!XZ –+\,µü´Îªüþ¼ðbç,ÂÀÅŽk ÆŽEÖ#¾Þœ8ÄH¦ýöƒ«#x~¶—oölns©ú wÎ<¯tYs„¸¤Z[ãžp–tåÛÙue©¦Ó¤Í›l˜F8_ R1õ$p‹:§ŽîÌzÓ=¸";ð.ùL§I·…¾°&š1З+þ:®KIþQ3é´F jºR3›Cq1E^)#UF z°Á™¦.¨hC‚â‡xbNìsì2O8×}¹raN›¦Ý†¢Ømà‡7;–àª\k¾Mûœ®hGcÁ 0Bx{›fذ}„qÆðɧ b°û:'ñ&xÇ+Ì'Þ´Óƒ‚ )W{ôUÇ.AûBôÆál‡†éP6˜IS‘pJ”]÷NÝšb®T­q7-òÖì‰sÛ©9àÕ"Ú‰ð…ì ÓŸPœ‰fl˜Mh­a €í9²´¿dÔD &ItúÔ‚Ir„’Œ–"my\³n2ö€—zŠÕÝ}n§Ú¡p×0i@ 5.FøÈ×ÄC ÉîjžÙ3FCgX†g6eÙ)ˆÏRƒ?bŽ,…@÷ ÎhËäò"#}zÞLA`!'ª+ä³3§4Õ%fR v(i¥ÓÀEKôBñDâáúHI^K}Í(íÆa_6M*æ VÜüƒóÀÀÄyo2lËË XB"xT'1¼;š Ÿ<@Ôâ\Ó áêðCGÚo°.–áN+pmÝœV’÷ݯÁèÐj{>Üå7A-no)i¿«£0%Κ€&ƒEû¦ hƒ½:(^‚]šqºw‘öœk‚W·T.>ÔÕÅvÊd(dW+:1Šç´ÙD¤Hçîš ¦®.<­5×þÀašE·ö˜‰ð'E®‹¥ð ¦³†"ìóO Ìœ\¦f(Psw[˸¦ñŒã¸æ¡^äUZHþL·§ æîüÞ‚XZÓFçÇpEó>åéÂÅICPbÃPärÇè±qlpîñ(Ô3råá!ØêC‘;Ťp]ïËŸî”óØi é~H9&/¹l0þ˜¬»ª6³X½—½»"ŒJ—oøê8gkçÇ}÷Ù­f©fØná¾a)ðÄx?Ñ”w?hö#b›ßû<(gÚ C6‰Ù¬ÚK›É€‡Hctø 2_øšÈ[Ç`É2Ÿ{›CKЕÁ[•—°…V/bëªvèKÛ—=äÐà¨E.ÀXXiTÌD …cPKÀÑ‚„ìœÛA#Ç¢Á’ç dÑ‚ù…)˜h—G¥©Q\™H“„IˆMèôÔ¹2Ñ9Á“BÜRðwÅìJèZ޳ï• ™îD=v>ØXAT5'–so£±îøíÁ¨8kQG½8”âðŠ[pÈm²(os©B¹wôü+‘5{º+DyA\ÃvÓó´!Kì 1|ª ¨¢ž%ó6åT—H `5˜DäžÖ×ö4ˆÓ Fê º<’t¨\¹ƒVýí¸LhéïŸãKìGè×îês«ˆ"žp¹ýV¤ç_©áj‡‹ÈÙ9C ø~ðVÀ] ˆ>¤éna\¦@x±Q¬ðT¹žš©ÓZÖÙ¦)mFÓJƒdY^Š.;ä±F÷íš[DwÑNŽ_@9_?4Së6G ú¤p!Wˆ!^ªp+h¦a̪½SÊ*¶6"ÃNƒ€Jy*rfxgvà&´¨…è4¡†®¸Cs꥛̓ϸE a¦»2 Žît:ÿ~ü²Ò4f§×÷¢ÆËO³‰' €«)`aŒËp _CèÉ7eEyëôÐèóg`½zãÏO®n–ëÞ5WÝïte™0âÁeœ¾tÛ©¿w]Ùðý9 sýt-…:>J+ ZühÜ…ÔÀLçeuøæ»í0ØD°#÷báÿ¹ªÏ?46…*ªšc íGD>ê&6)#¬ï ¥i¸‚ë­¬†¡çBßé¨&É|¿VBKK&¹ÎeE#Zò°¿¡á4ÇãÒ§ Åâ¬ñŒЉèŽ3•L÷Ü—¾ÃÃÀÇoãê•P)ÙW£D)½#˜ždÏïÍi°˜#3)Ð{vÛY¸î¶šº‚,ÕO;DU‚Ûbî‚ òî× Idî+"Ž]1¹âáHâtÓ”þ*:~¥#û[¤ÆaÑ… Ã(ÀiE|Tfqµ.®ÒŠDÛ“ûk\›¹K‚#FA‘õ-‚,dT\!÷æÂJDO7 ©/ï1Qü´4ÍFL¢›xဠêr[ M›*®¡0Ãg)ƒ*[? ®Øë™¶k‚fÎ#ˆÑçòàÒÓ6àqëd¨œ5x‰Á\O‹ÃÒmK¬Ä4Æt;”)EŠs¹†áƒœw¹áäô'ܯ)B®PÍ„á×j£É –LyòŽá„M¨OUÉŒ?´Ô•C1'?Ôý¦‹[”ÑÊ–…I2ö̦Õ4!ÒžÕÌì×5s+P\4ÂZ'Ä/hW–a@˜íáVøP¡ €„ú*ÄQ{ù΃sÅnD+ßÌ ž²ã™¡1á­ -{½|ïãüMî‚gãDÚú‡ rÌŒ­¸¥ÙJæj…ÜæCù§ M„…–‹/¯¤ žé‡ùF¹yŒž„`SMX7ÛC÷ZÒµ˜ð9òÇ€ˆîƒ²5¡0“ÐrS´pð˜¥ÿ#bz.IH4Tζ€q§W®]êq,0ƪwÉÔ’”¼»ÜšYþ¤{ÔThX>­ ‰9ÖèRóYާ?ÖA»–xE–W‚Ão¤ýµ‡çÆ(£Å¦:»*b–ue#`æ!¨A QÌfŠ%vϧÀnw™t úÚ¤}mVß·È…bâß”|ƒMŠðõË$oĹ> ¸@šË4YD“‰Lgœ00n´Ñ°&¼øW0´¥ìîÕÂpq”˜ÜLÑ„Hé¢:ÃCæ8Ke‚h€_-ù¥qÒ¡àŽTf¯p%T"ÖcêR²C^P¢-ƒË]ÜBÙ0Í$6<¤¸á{Œ$;É \>´zhtñլȸÐz]áBéx&àd:—™ÆP…~_\OsrqÇTêP©–Ä·LÇò”¢ ¡ò}T ‰hÛ&Ͷϊâyyn¥V·ÒöÊ‘,œÐÓR’U–s§Ý~j¡‰ˆ¬ñ)[ñHát¹¯Œ¢ÃçÜR²8¥ìÄìZs]îNÀÓF`m#¾ì±™²"S{ygq‡üÀ{ -Ò µ§ *G„›wq,³~n6D "ç.#G\ Å3$Ô¢°6+u ]m6©| ct_> =zñy¬¹ˆº<¤ÂÊRr²G¿%ÃRÚc($bÊ~(Æ"Áힸ/éC²–q‘ÙÔ‚ñBÜ1Ë øJXJ¼ªûÅiBÁƒ1ÉZ)1E2±j ƒ± ‡®OJ—ŠÌLÄQ1“yéÄÃóÜßwžóWäDyîÄÉxÅyj¡w‹e˜˜¬’A Pä†G™ŠÂÚ:EIÓ‹³!Ï@ C0Ç„a!Šº ¤_vn ™6éÍð{ ŽX³2ŽfC¨eêt0y Xœóß<>ÊHŒfrr.mÞØ±.‹©bIÖò¡iîºpÊ##D‰CÍØ28Êkƒ]#¡ÄÛù`I¡`ª±’aDÃ5Œý`žcvMM$Õ0Š£Òè3 ½Œ“¹ðÎ^ +К&‰bײ¶à‰<¤äsõˆ_xZ±ÔÚ,ëk†ƒbcº#ª¬¶”Â\«(Ðrðñé~×+oæî5uë\4å®õJNDH*@Sfýôƒf LU¦Œ‰;d }˜½ä|‚‡xúÝ$?0§tž¹Ö˜¼2»9æ® SF<ôHül§‚*0`ØÌÕ£bL¦N²xð°ë,ŒL]L¸R¦¹^qvŒ"ŒOY¡Á{5F)âcÚ:æF»]ЊBWÚÊDôXQGAÒŠ–;ƒn=ü3¡¢ÒÒ8žsH n´iôm¦À²Újá§’ÿAÊB÷€.hÎ!u±¹¥YAÑÖõØ_÷ß{ö`z;!Ü`/;† }ÉÙMiäíËÙ¤Pò÷‡Âµpã Ò7-ô˜E|…ª 3ÑV0TàÌ…Ìî73Dâ;¢¾®è¼¸¬ B8¶†èß_»t“K¢…”PÁ™ ¥mæbÈzipS„`=a•·¦E•ø`Ó¹qr¢ƒòkr`;2T e¶.‚vZ‰[ýÙ)òaY`ä`žSqg8Ï'F䃚ꡛ9þX_ì>†Ô9K^ˆ[§´f}!Ž@FðCFÓÑ£à'gúòÅËJ·è …Ì(1Aâ$9ÕSv0FŽD¦»HJOw.À¼0oúc2ÂÈCëËògT¡“Y¡Õˆ_8[N+òð‡2Œ˜¼' ²‡"kÁ*æ§v_[IÎMà¢÷ŠXeü‘ªBŔܳ¡Ï@ ~@„`P6ˆO¦t3Xˆžäg¥ ‘åoZè>TÐÈùXÁgaÈT®Ò´˜H BÁ‰@gOXàÚ\›ò}UÅ^`±|_‰ÝÓÍÎÁ„ ,Ôäv{iÎ…'npœ(tàÕçÊ×ä–™ÇÚ =þÚ”ò¸{1ÈKsŽ¢ˆ0<þÙ+–oJÓ'É+÷mDÈé})­BO¼^Ž¢Þý"KŒײ‚}Ihr.ŒyDEÕ'×ÍrðʹlÁµb^m&©z,ee”‚”†Æ$,À°¤Ìˆ‘í¾€ÿBmç[ ã3ÌeÐ.xz_Á­eÒŒ\µe+G²,3î´RŽœë±Ó ðçÄÌ^Üöm¸>&çÖZ<•ÜA”S6%L˜êb`TdáBmqõ‘¶¯b/_£íu?î%œçÐze¨k8¼‰A„‡"L¥Fq˜GEO2<ô«LÕh-©BKßXö¥Lw°‰v$X{Ö¬x|ež-¡Ï}¬×9Ïî”äòð \1ˆ»2Æ…mÃêe ¨‡l‰ÒºOˆ=He(S×ECíÝqCéFrŠ KYƒøI\r÷ßs(«j®Ç!ÄGÉN‘¤KòlñøT4\åPaIÑ=gžŸFôHR€6–Xˆ¤YlÕÆålÅõ¬ònà8,Y¶k+J‘·`Æ­îK 軲3¨—ºËT‚†8%<ÜÁ¤bæè Po"õpb„ë9Sú›”0X'3ظj[Ì9×rD\dx¼––ׯbéä\×’‚›ÞHÊBúa,ž÷Î ÑÓh>¢xÃC+×KyÝ>4â ¥£ÿ§‚&ˆª°¤|ˆ0å¯D­æôeïDÊ.‹Ä‚Нr#¤ðÌ" ;ÆQù™‘˜Ô¢_mrAÃdðsó¯NJy$žÄ®ŸT/€ˆ›Ô=ë™’ºØªU$åa©^k2éÄ\ §Ê3#ü´:´°ñPY¡;Â2«¢’BZ0æd‡Âh‚ÅaUOif¬ÜQ°«_óA‚×Ìå«ùŽ÷.Âç&Êb®…ä~5·LÄÁÉK@ÜÕã¢g¡[Éf+¶‚˪óÅ_JN6@–-+œ¬P½Kùõ[y“²þ¸6œ(R¯ìîk+¤cÅ/£eU· XñXñ#zf W$0Qˆ±Ðà.®>;’m¨× ïD?ƒGº»w6ÔÅîÉhW: ©ÕÑ9[²a#y#UЧ"³¼V?¬uB-ÂÜæz+{4{µ ‰¾ÖÈëE xÁÕÉ8.h ú¹ã‚joËUÛð!Üè‹ÕÉbtôºXçÐ+cENV»8€ùˆ¨á6D6Ä¡5Ò‘`N?-3£tQ°ì₨Õ÷7Õ: …n 뺲ÛâÏ• ²œŠBɦåðY<?bê'Ãk[<*24A-|•CûùÖ£kǰ€9uî:Võ€æX‡Â’¨2ŽEI‚®Ì»ð–c3beá‘&Í´™× éžYvR];S½¾b0¡&œÈ8 é@Y18õ÷¼œ>¨=&ùÜû’)‹ KPËkHí -GúTôÌ_̪ˆðªØÓÌôgÀ Åfvš\‘ÝÓ5»3rÕBç²’¶¸ ‰Œ¼>6ÝŠ¤Sö9rœ·Bi_Ü\8d‚k¤)ûJM+G‘Ks¢{W’#šÓAh}ÙLš‡TWŽÄJ¼ \—•¹lÒU›ÙÞpÅüWÎÒBA¥ô½ к°”)W|©™@K¹­¿+V‹÷”“-Eoµt×ûxöFI0cÒ-£FG‰˜%ðû‡SÓ¥ÑA4_ÄK–>°5ª¶$Ñc‘ P—ÈaÐ*1¯ù·FÓ\ÈûZ‡b¾^™Ž¾ÑC<Ùÿ·…Üœ»t¦¸ &‘x—ãVP‘Ýÿ^}¾þó¹+"‹²Ÿ¾3òIºõ¿}huˆs°;^%·_çi`Þ:‘¨d¾!T[^ÂÆ"ôÁð ú¥®Î¿ó?° -O62ØËà̤ Ÿ¿êT;0øŸ;l5é~˯ùobͯ¡ÁÛãXIKST„‘L å¶>‡×_à³Ý1î’·>‡7.¡' oÔLÄuëôê^ gÛÐ…7ïå2¿þ ës¸¾@§e}dšeЏ>óu-Nç€ ©ô'ce2qy˜O“;üÙÏÁ.(¿á‚OÏ>ph}§·H¯NÌœ‚7ïQþ–¿á¾ò9p%ÝNÐüéœ-ÎUΔG~ ‚e¨€ÛØmÍUþô“e¬ÎÏÚ›gX%öëË?=]é>¹+ùéTÑB–¾ÿ\â»Ô7ÑÐÅÏ?qxûuÒã¸ý(ü£¿ñ?/ ¢™ñÓüœ?ÿiÎó7_óÙÏÁ_ú)|•¹@ß¾Yø}¿þÉÓ€ãQy}ÚVî b†äÕ×zaµ9Ý«Äv`üó›þ2µ^?ý:|ëõ_þë+·yúq½È['‡óƒ|å6œÎ‡yë„erÀ㌗P´ß0Ç&Kß|›s¼uÊÀ½}—§ú†ß ¿å‡_Ãò“Ûœç!YhåÒ=õ ÚñRhœ‚gùŒ~üD=R¶·pÅÁúéU_ø™ðÛ~õ3:5<©cS9ö¿×÷ÙùRh%t³tnÔ—¬|#ú¯Xºp}áþ¶Ee\¿æÇ·ýÚç?óÇÃ×ýÙþÊf<ÎæöeŸùþ?Oúñ/û±ê-3u˜ñbÌý¬ýø6_ñµø…k&ŸÑT_焯;„_þÞ÷nsÿa˜» ¥7×þä[÷Ú ßBÓˆ!ü4´eãÕ<>f1¨FcÆ'W„7Nôà#yËÊã­ «¦ò aÊvû–H%<Ýò~xJ¼¾%ö _9ý“¿·Lo¤ˆ à#9žû©ø3&v ƒé -äŠçèuhITPÃfÔ¶f)°ûY\I&櫘÷é[¢ãPAø!CKrãAvܪů£ XÝÞ[ÔââºsWšO/Õøä§óÂxûöo`Œû U>< ¼Ãw"^‹­*“¹u ²]ê0©i˜²ßPðήÔîu‹í¿‰gç$Ï]OÅ<ÿrdPúßH<_å^o Ê%¥ë•9´F8tû7.üìXß<Þ˜ç7&fËûçñ™$ñô%äóöá­‹V3XŒm–·†¿Í’ý/Z’rÜ—…Æ]À}å*ƒñíõòdŸ‡µÖA[8Þ¾üéPøÂ±ßð4áþÛ:ŠÄÔõQµ´<€ù|­âÃÛèægÿ³ôü Ý´ž|D½ÐsS8ÈoøÌnÛ·›dé²×'FÚÆÏÝ+|Ã9_þÌX0é¿ñø9i›A^‰Ñ¤ Þ$YF{Ìöo³×Ò Ãuˆ;|Uò7-WéòϺ44>‡×_¼ýùÓÛyˆ<1|öÊû礷ýì)_}¢8ùË?>{ýêøÈ9­Ñ™ÞÞYšÊ“lëÁ!%†%_ÿÒï¾´ñU«Zþý¶‹ÀóñðMãýïÇM¶¾ S¬þƒ­ÒÕö›¨ôCÊ‹H“BÑ·>‡¯ðMŸÃí‹©5ö;îÖûñ{ïÁgË/¹Òn¢ù­…uj vdSè¨uýùoùëÿ—ÛP)}rf½Vu_õ:QÛäß)t÷Éþ7Jqø·ÞàÓe€î+×ܤ¼.(ª² «}8#ý¾´³IWòÜ^Åk-¾A¥+"û¥ðÞþô ·a¥ð'ºòö©0Ù ˆÑí,ÄÓQ3dîQqmèÝeÍÄÛÆ _¶³ŸÿÌ»«O×WNø¦~£åÿÚçà_´Ã ­¿`¾‰C*FɯMöí 8”M9j¯ïe"8.bÑw@t @;ßæ—å‡À}s»pèOÏøV_ïæb†ßëóúç•W¿ì”îoÞoŸm…[~8£±¡iÛïˆt´Ûèo “^Å2á÷…YO÷•¼c î?8/et÷9ùò¡¿‹®ÿ9¡ÜV¶œ!ŸZÍŒŽßC÷óx3ª¿ý‡GöJÎÕ™ÕØ?,¨W,}dŒÎ"·“lI2/÷ÒCvD=*` Њ.¾…ì¼~â~|ã Â4^ˆŒâãÈ6+Igâ™PL’ô‡{øó„’‘ÖôùˆtUákÁ‰CñX?¬¦ÓÔ8P)“¨™4PžÇ âü ÿç[b婸%dß·²ê œµÇ®vÚCÔž³p£dFù=Ÿ°H@ùñE”E×YÍÁ?ÃŽ>›¯z¨*n¬®wF 笙 Y¬”•@1C~÷ä±þEÆÕîƒW;¤Yªà=EäE‹uI.rCêæÔ¹cuCyp%ªé„ª{¥ob}Qåý½¤Pu?¢sƒ™=ô̪æDÎ4Ù;ðf–P`Í‚m ÒbÄ©‡^õ k° ~:ÈezHÕi×,ìâ­ß2]ýP © Aë¹:ŸÈº<¼/"ë4àlîíx )Êšb¥bX²|¬Ò˜¶Þ_<¸¶¯`%ñ¹TÀ­;Ï#–GîÀ§ÖÂÐ \*-'Ç{‹i›(Ò™ðN[´’ä±°c0nÕCº61¬õ¹IBjpñì µÉ€ËŸý–öN-I•`ˆ’¯5•à‚þ°iû¾š²¡«CçS¡¼™kÔd/:ËãÀŽ3Ð:]ÍÄ6dÐ$ª‰+2W‡ÊùØè¥6Tip`¦fÕN-|*Q3†‡5¼ÜÖ‡¥ÌÞæß׃i_{æËL Š·¡½ëe6“mËŠr&;ÁLv\Š½Ææ(ËâòbÍ“¦ÒêLÔ–©QØjµ[½]amÌäu¢þV`l]°¯“L9'² ¾ðn‘skTu—&Ö¤7‰Lê•›ÿ];à˜Ü³Õ3½Fáâsƒ’ª T,0µá.ú:¹E~^½•µ× nÂ’Ïás:œÚš–d›:ÞÔÝ'Q‚ô€«¯/ ­ØsKï s£Ó³ ½ S[½T JHAPws°θšã†Ýµ ˆ+—FÏ ! —Ð1pØP.>«Øl§v¹ÝEñ…jáÖ€$Æ£i¨ðŽ;bìÈvHåkUb-wo¯Y]²#ùEa_Ä`;=^WÈd§$¯^¾¬ÕË·FìÕ›ƒ±2$¯Â!Ÿ§5M+òcuIõ’úe¦a‘<©]Ø8ÁÍÖh±`Vƒ¢›½ARâ?ÜÃR©g½Œõ jÏ]0¨‹½ÉÊ¡Þ ìËTÓ"ßÓܳ.gzYÍZ¹1“²àƒ©m/"\_™J‡Œ´é¦/ùë`÷úì]¬Rt[b¤°Ù@ƒ¦B¨"Lªz¨ðº"ÒLI¯=ØXˆEbâÆ™³&UA­l©kàš7î¿ÇrÃÎâÃD@#]»º²G[æuHZcÆÅ Ÿ_›úyGbt˺ú2µx©lÔHPǨºGÕóûª=_3ÜÜ,#ï­šP{ÁF”ôbHkl×Òsg z“‘îóØÛaEBã¡›3óP«y‹-q_0t0bû“q÷ Õ†JêŒÍIØÐ½(‚Páœì-ûÜ“zN±Ð:c£‚@-ŸU·ØÝÑ]OÎu{5OÜ•Aõ7De5Ç%”ìªëÆ´ß,êÉ]Oøì%žúrôŠcs„•IÎÜr}Ì5Rz2íð29Ž/w;D›ÃL; iœX$¤YÕ‚Ož+La¬+®VG›zí:© ©%Ó<„b)´û,¤] iͰsŸ7ò‘Ë‹ý¬ãBΔ±BÐE„bÇ_%Ѽ¨kk°³,#ÖÛ­T†)宨æH~£¥ÿ ûÊoqÕ/­mãù÷ÞÂP-Õôž5Xx14®Ì3±ƒ‚ÔA↙æÎ4 Yݹ‘v®Áo6¬nE­àµ×¬d°Ã£oT· ƒ@;‚ŠÃÞ›RÛ»î\kÜ4OZ gçC½¨¤Ø¿’{x˜¾è^ßœ‘Ù%PÝ(¡ÈFýÏÒ1­åü«<~ £ 8í¼DÊP­9ÝêT‰ù¥p&qÓ6‹úáí’êÚ¡ù$PÃîMdb¨§¸òÎý~­º« ¶Z0n·ÃÁ2G1xçž«˜ßK ½½çÁ” ò‘Ü_T#V~ÇUßÇæ_ìêÊâRÜ©yy‹jW½Ä/¨¬ÇLoÆ»‚hF\ª|_ۘЕ­íîOG³ìÔãµR|S¾ÕÔŒª7¥' ÒÑ`ŠöÞtg÷Èí¶äÚ÷ºNØ2•ÞÌc.ýB̉o²¸Ä½Ñsƒ®I¿  :{ˆS¤a;3ô!¢X“[¾\À‰ÇJ{q#– {‘|["B3¾C•÷Jdâj&’íNG’DIöâ®$e<7(¢ƒ9„jÈuéém ¿ Oæö0Ë»D‹­eyA8‚\í»;d Ó5sjФÎQa¾;¾ÉÉæŽòÜ%µµ  šœpÛbžÙym®gZoL­Ç……Êú ꬾqlÍyUÚ7ãô›Ó‰½1³o0ŠeyBæ#ɆiÇ:n¾–Õ°á~_hSƒEeBt¹3£;FLX @ ¶FVÑÚÕœ n­uרøΫI Ÿ6”PŒT°Ò‡bg._¶ªJÉ»A7ûÏ,¾¨Ó­ó5Ï¥²ÑαRç:¼d2ÖÈ*ëŠß¤WEÂ&èùXÑR f1M]Î%€AÉVµ7ÌÚ¬Ó|)Íûª¬¥‚ζð§–WyºÜ„j› Û‰ía?]$uá–åÛÞ%źºh‰.#e|’—5Û2·^Ùßõw’“#xÑßÔ õFþO1²º«¶‚1´ÆY)â´œæáðZ\oZC‚"Ç]]\ä@)Hê7]$±Ù§ gØÃmеyk£˜Ñ’(à:ƼÝ5U©ÍÝôW]Ûù²t‹ñžv‘IéºÃ;È®—§J…b,ÚÉFŒ·Á1Æ}]~{9umžÁääiíÂÀˆq p µóÁF5ÅÉ›m)yd¿zÇìË+Lœ9;ëj[SW?&î$wwEY7 JÅþkÃà pàrêm…‡½M£v ®¸-oÃ}h¸ø<^fÕˆi»˜z3«²¿êšwmÍ“äˆøµÞ¼„ x½¾_yí+÷±\‹Ü7\D75g ¤-Ì„Ž«2¨¹5a®]µ–æ+$\÷jçû5µÄS7djÉy\ ö`;´9‘¯p÷bb[÷ 9’²1oThTê±\›@“BÀžìy9@ÜØ·x'g9IðqœSŽ‹Ùaý~¹Á $ú²âŒüƒ fr R÷TRCOpzZöF.ye›ÚÚ£5¤ ­á Ü’šJàb`" ’´=‰»uiµým}Í2Ϧw ûÊäMô~{c®Լϱ^[ñEÇý3´õ <ÌÆìlúX=f.„Ó6¶QÆþíÔN´•гhhËíFÏó.…VꦣՙÉ\Áz[ÑžfÊ1ûþ@ùÆÆÚ˜¤&™¶±ÍÌΟõ]Y·TVÖ_|³@T»ŽýÚ±zŽNfAȨéM:InTj "afŸ+º4|47·'#;ã[þRÐjS…LÙhKú¿ê²(ŸGæ>¼K·™^7o1¾ìs©k®çÃ{E²ë{™q»ê©a€Æ® ¿ËÚ$¶ÍSF‰è1mÔ@—õ„äÂ:—{ô¨Î-­l'g¡Î埄ì™K7ß™ëFmä¯þ Þª+ÑÑÊ±š©qöîÞ °@ZôêéÝeWÆ€?ˆ¶{µ9Qgm8ˆûö•7¹8Oˆ§4©‡ò5to¼qôê{ ï‰Ø‘\—åë£å߃5‚Šv<Þé©ãcCWîHRnÛ#hï$˜nv5$³F2g‹'â¢C{ëì ­Ô/Ó‘à\°Ÿ•QdºÑ`ᬇÜE݇é­²G¥’òÎJ£¿Ì]¸®ôìá*›+;]–º8G $0¤+fòé \Ó¸Ø&yAÏb'æiti‡J¹Bf · ê°öÚHAܦ^.ßMẗò:•Y'$‚㕎:4*›×C36õ=´ÒŽD­J~‰ÿ?;.Öl”7X¨™J°o¾ ûž7s§ÔðVqû'S]ÐÈx¿½äóM]ÄN¸Øä6ˆhAH„΢6™ÚÊ@ìê2TN¦ÔÀ^.+Ý–QöÂé¬2’~™ºÂâüÊÔj9®}ËBvËLÒ3gT?åPv‹YVØe5tñçYqY5o¾•zx„t†7+­®Òý;[ØFµÍãéA‹•{öƒ'¸»6'‚äŠfžcdÔ"±,R¤íùˆ7µÝ(¼w uQÃI„Œsob)L¨øIL~ŒE&sÃÞp@âýÚ2ðp5ÕfÓî{–.wAHÛ‹¦¥Öo¡êça›ßó®E ¤°¯;hþI´£ÐLÅ`“Š[ê¦5ŒS®Î$€@y©xG@ÉHbµøCÆf+Úì–•û Ò8î , øò“0²e³ˆEnYß/ˆ»ÉÏyø®ìˆ–«ËaïÉK}0a6ïNÇ¥kû*ÝO+AÈŒA°¢T‚Ýáî|ˆ>½Ó"ΟWÔ妤†à@y¤™}opX:ý…öÀ^eŒT®ƒS"Ñln"NšBìrß’ðâ9ªãº7Æ Åûs²‘¤¢gÕñHï2LmiªD rkXkA ž)¯‹.Qõq#ÑÓ$iqJ$DÌÁ‡P‘9n‡ÑŸîïhEU%(:›Ü ŒgcO7.Ìô…Æi:ûºy¬S²²ì|"ºOq)Š^;\韂z²IÇißk¬ÈÌì´o!oªÖzCòQ{\£|Dƒ}'À=¨³¶¢¥Ìrˆˆî²"2ÍUz澕I_ôU¼\$&É@¯¨çÎâ Yå=þ¶}q¦è¹–ÁרýR9÷&h“ÜêK/­âPóæ­ŒìW›A ÍWdBä0ºòáçó ÷ÔÓÝýã]Æ53ÆÅîdËÜ â ¬‹aÀéá³A²3©²CØ& ß›¿3JÆ»ŸÞÊ&n”ªõ–ñ)nu©(í¼‹:ØÝrv‘o°ÏÔ—HÑöJÕ‡&3^9ܼ &sWC`nƒ9°ñxBC¿©a®ï}rOºÚ3Ì»ÞÕÊ Ú¢Ú‰Ë›b^Å}öú& ³_B?E—ý=Q| ‹¤Ÿ¹ÿ ð;© ú"U°§sáæ¦[ÑX­ÆÍølq_$%Ç~ M)µªn¼ü§”#É (˜|Z[u<Ç;€w†´lÔy%[éÎI÷Ý¡oššht˜÷í;öa«š¢kÁq¿K߉‡$~zÏÚâEPm–ÚÞWÞ)m>ˆSóZ e÷ý±´ÿQî ØºÛdŒ<›Ôý9´dÇ*ˆŒz™84&Hl>r\-ó·ZÈtow­%ì͹õáØÖ•eÞÊŒK`0°¿Wë϶x+Œe´ûY}äëº „ Lqxfó±ÁT·!bç+.Fl¾*“föÛ!kd«˜j¯ý„šáuk;pq;¹ÃK±÷º\¾ê¥&‡ç pÛªÀ2¹kä‹,w·ÐfÞY2AF<”^…{¨ê·¶,Á†=jÔ‘ì m˜† „Ÿö'%½NoWB¯ïÐjç ömwEþfŸöËíí¬zdˆAy÷e=óÜ,[Œ®Áµ Ó–ÀFFeÞŸ­öŠŒMhj¤»…Jûm[®5¦¤vÙðP¼qßrtú6#ÚŽ™û0žZsjÒhÏd(7%¾¸ÙåGÄj×fAºör%@êjf—"¿‘=I¬`Ý á¶:”Rè¾.']Åߘ3,%W™][Ìð ,¯¢ÀMŒI=ž>×j[÷b6ìì1¯„$‚c†ˆÉiRÝ.wÍÈòÊP¿À$Zñm4´ 1('"½‚2uý©Á-Þ0j3Zµùg÷Ñ># åÅ)q$ÂÇ÷\"»“ÁwoUËݳó!Dé´mí*V®ÉÕ«0 HÇbj8ö«­Çy jÖM2™ËöÕŠè|ŒUïÂMÛO G€õ¼h§‚È#HsIJޗ›}Ú/LOuL9y±WHhTá~”tY"An®`ö20S‰üó0àˆEøD–öÁ-‹º,XijåÙÅMqtrƒÐª™“†¬“cuO—†±dîfTäX(ò%U«7 Ÿ6Ñòâ…œºY8—]õ0X)ÊE½uSÀõg”WÖ˜ÅCMRÈðÂ?[ZÐÅ…¦xLJ—sæÚ3|P%1Å€ð/*¸šRZ `”à+<°¹2Àݵ QÊ¢ò|Oܦ«d¢®&bxÉE!\ [²GâjAÓÖº’E a«:Ä980›íwM´ÕQó÷úñœàÌô˜¤@éª+¤ã´Í¨‡>TfÕ„¾Qš2ªO( tÐJ>$…YT5,É‚ª¯aEÉò£º"Î?šOf㾿óÚZÆžB`^íòž)„¾àJt®&/Á lN}òF Ôåøs'2ƶ^… oI=Ùå ±R+,€›´0>jË^;‘Ý0ß"U݉fw-¯ âƒUÖ 3âÌ-= àJŒØ°{d!v4 €­Æèѽ•(¼x²È…i•V=Ž»ßjK±N9Ùo@ ¤°oÔÖÙ¤g1¯Smµ±òר&~uš¶áXs%ñ1‘Š´Í*à4.ÿóÀ^êÞ˜\®"¹ð íGwúªy9,ÊÒÞÛ°,…ÀâBcW7Ò€£G$B¶Û—NÎó.‹ÇGžòRX*…=×l¿òi-àjL‰0d… 9¹W4†Ã›]€ËRU5½‚ ç¦^+!ª§^‚Ú»gCˆ‚:qU„tXé)ú ” o“ï{*L‘šáãuE¹,˜rgW5ôƒUX‘ùÍq,¶Hg#S8ÝÓU—|9C«3ƒÐÈ|)yjCÇêbϯ!£©MCè˜ãe!E§rÎJUÑjCÞ€bže*ür™©£êî~¶ õ¤]wœƒDª—úa)P·&z{!uÈ ×OÚ” žÍÌýû±;> ÒªÇ±ŒåyÍ¢ßÐI6åœååìïtU‡ž‚xÙ«ÔGÂÝDÒ£÷½BìFbž3$“è¤5#EDRºY=úi9/4*`}œß[l¿?‘MÎ/Y ¸S+o\M"§ð”ðÝ„|‡ë+ú·9i/\›4ÄTÅÁ¤Ä¯îÜëhù -žTwc«va—4Ò NÁE1á£Õ%8‹ ÙF‚ ázz>$àxHù $ëTzjgÉŽ; ‰);;äUx –Å ÃÉ Û ¿i0Óµœ3É}áó<8ÃYÙ“ìu§ Ád WUÚé©OõQ›Þ²ÃpÀ«ÚÚÕ©%Ñ£¢ÏyÅR!m^~Ì,8q+3ãêõŸúô±-ÑÔ‰Há­h…ªŸe.Àä×ås“Eµ4–bÊõxBxN­Ç•êú3€ÃNM§\LƒÂdœ"%Ѹ«Þ*sµ$‹¯({&?—(gYrl3ç©eÃnþòùF¬'G:$°~†²eà(Uã9PöiƒïqJì”nåÕRP Ãw¦N7ÂêU0Õ;…‘×&šÇƒ”Ê•f®—§pžœÝ'C[†ŒQ¾¶ÈšvZt—G°©àDz’³­„¦”rh@J¹í£誥!“ªì©HVzw-É1âL…--MeC¼®-³ÑH¹ò$bWc‚ÂŒb÷—[ìóÏK+Vš/(öôìßâ¨Q0#mï²–8ÓþÈ>YÒlÞžš•ücBYµYn½¸ë*3RûŠ XV€"?e¯E²¨€õã£zZ©î# ZÖf8‡”¢,…®þôô†'Pl©°Z£yZÔ‘øÙÕ•uÕßww)óÜÉf÷ãéoÒã|x³SXX·»éˆ ^`pø Ü[“M4³Éúi0 Ó$[yµû€ †M°•ýÝð†íXÉ!ÔÀz®!A˜ŸPÀ3¤P¶{“ÕPˆWä¬9”¯‘ê~áÞNÅ&‘9·Ž 0 < »¼9è_ytdÊ£«W“˜æ€ÃDG¢Û­ºÄõi•ÙùÄm‚ŽÀADqK#ÀþÍìíÕúµþíñ9ß \Ô = rîUQ’D„4…Æ/³¬ÖÈ÷d]Ü*„1íÉq7F1§ HîÖáoòЍexkÜ߉Û,ýÄó$0Rç"w™Ö5üÃg¹JWawõÝwg¥1Ÿö2Ħ yÕ6¸ÿBZ¹Ž­!ÇÍP(½‚c3“—Þë*?âcQð9ÒI©B„’Ú]L€›ÿ;Ánðh']åÎ×h\®^ÀW#‚²#Ö9â ÒG`ö<*àÌ-@è¥ w…ƒyc¹“„„œ‚Ðöœ)W3&6 XJËéøø&þ<öÕƒÏsŸSÝ“¼_Oc8’9àéJo4Óq{AЇMKu üˆ#º¾P 1Ö~9”„ëϯ œ‘Bf“C„HQ€s@ý ´ŒjðiÈÔéY‰¨\:©XL•ïšdªwÀ¥Þííš:$²R³ú°'ÏeÓ·Û -²7ECCX±ÇûÃL±©à6íA…C¦$¨éàj…GÂÌê TÜbv¸BØ;þ`yéùʼnI vÎ/¦h½êª edG=ØØ[ŠQ±”ow`¬?¿Íü ìúÑ˱Z(Ä'Fp]g½^_ø¹Ñ/TŽêµ‡C[‹£LQ놙òð0UʤP.Õ"_æT XȈ²è1ÑnÆè°‹N;h®õÙ™…Ë@ æÙBÔÇRr;•îØÅ¶x¨#Š8w&=¾`³ÌŠˆI\eý”1gpD 4ú]å7¶y¡Q}ˆG(¹¨Â'þÆ:åq×:—Â$Ú6«|0$OÛ± ŠWIJ¢3A8˜º'L£O,ÂY`ÉœLæn·z×Û SÕÜ¥lïè{xêmñïYõžol}¶f"‘eúQŠ2-òP„AcŽ*_>CÇîË€ æè`Ý0 ÂMç9ƒàG-îWßocÛ»{±ö_¢"ÈL­VP€>jr$¼Ô÷rÉ”†Ý×ï1Á"}@¥%â»~9I@]¬¡ósåg¯:¿é‡÷Ô¸"€{Ï•?§Úô’¡“ È„ákÁ^\“‚ÝnA¨Jú\”^¼Ê¿¯lW`¾5¦GÍ^ÓÕÎÀmÛÎP!y±•r$"}ß0¬™náXUФGÄ*L(šK×W«ŽÎžç¼ »]M:±Te§[6[k‰ØÝ ‹îYµªh™SU4Pn,’H7/þœªx‡Æ`¦¦ïôÇ ZF­ú`ÜQ‡æ‹tqñŒÏ€S¯uu.5©ðü‡¾bŒÞÑõºi›÷¡Mct3ûL;l3[£2–bTfWj ¬Qþ *‚¸ÅHU´r]8¾š<˜lä“ɈC• 5›'•ÉÜŸVÛÖÍéC’è qÐÌ̺ýŠ (¯ <2AR^- ûæ¾,æ¢ÆyŒ-5˜NÙ'ÕÀ^#,>ês‘wé OôáËüÓL<»&Å•“‰Ì ŽqµÀ?’–¼U/“ bh"ºL_w0Ȱ™`vÀŸæ’ !ÆžÁeÙ ¡Swû!Ë‘Þì|ñ<Ü(ÜlÆéf–àÒ3ìiù‚hŸò{J+I~ü#‘Ÿ¥\Òp‡ÎäÓž©IYUn+=Mâ}Här{#ßz¸î!ŠAÒê‘4axë¸ó­Afš@'VB’ÚÞn*ú Õ¨›?}Uâ½c¥…¦¨BÊ KûX` «]˜Å)¾¦3Òñ^ù#¥¤›à«ëœ‰pûýaS²„”â±úFc J“Þ%é )b–]ñ×%L¥Ü%êAßòý^ –µÇÅ«ÃS⥕9›ÃÓ[Š/”À£ºT©Rd9Ú÷] ¨(ñ’y©t6ê×+ñ 92§²û6™x-þÖ’‹à õ§â¡ ?UJ¯t0 ê8ÁDK3ÇV©`>H[ó¨7âu¤L…“›C|qrãÍÃÔߨâŸU¿Ec„rY9Ù·úù ªx·¬Ÿ*‡;YNg÷¡î¾%j¸˜Š3ÌqáÇêßgâA˜œ²¦æ[¦…›ŽjÂ}ôKýÛVÏ}@ÃïÑû€†¯ŽhLÕŠØ=‹ÿþ»ðÿÿza{`Íégolly-3.3-src/Patterns/Life/Signal-Circuitry/stargate.rle0000644000175000017500000000715312026730263020407 00000000000000#C Star Gate: the paradox of an apparent warp-speed spaceship tunnel. #C This p60 device allows lightweight spaceships to jump forward in #C the Life universe at the superluminous speed of 15/14 = 1.071c. #C Specifically, LWSSs entering from the left jump by 30 cells along #C their path in 28 generations. The Star Gate implements two copies #C of a reaction in which crashing gliders create a Fast Forward #C Force Field which allows LWSSs to travel by way of a tunnel effect. #C Dieter Leithner, 26 Oct 1996 #C From Alan Hensel's "lifebc" pattern collection. x = 155, y = 133, rule = B3/S23 25boo85boo$24bobo44bobo37bobo$10bo12b3o4boo34bo4bobbo35bo13bobo$5bo4b 4o8b3o4bobb4o31boo5boo8bo16boo7bobbo6boobbobbo$5bo5b4o8b3o4boob3o26boo 8bo3boo5bobo15boo7bo8bobo5boo$oo9bobbo9bobo35boo10boo6boboo25bobo3bo3b o3bo3boo4boo$oo9b4o10boo44bobbo6booboo10boo14boobboob3o5boo6boo$10b4o 8bo48bobo8boboo10boo21boo3bobbo$10bo12bo59bobo20boo16bobo$21b3o50bo9bo 21bo$34boo19boo16bo21boo7bobo$5boo28bo19bo17b3o19b3o6boo4bo$5boo28bobo 6boo7bobo25bo15boobo9bobo$36b3o5bobo6boo24bobo4b3o8bobbo9boo$38b3o6bo 30bobo16boobo$5bo32bobbobbobbo29bobbo7bobboobb3o$4bobo32boo6bo8bo21bob o7bo3bobboo$3bo3bo8b3o25bobo9b3o7bo7boo3bobo6bobbo29boo23boo$3b5o10bo 25boo13bo6bobo4bobo5bo8boo11bo17bobo22bo$bboo3boo8bo40boo6boo5bo28bo 13boo6bo11bobo5bobo$3b5o13bo30boo18boo28b3o7boobobbobbobbo10bobbo5boo$ 4b3o12b3o31bo58boobboo6bo9boo12boo$5bo12bo18bo6bo8bobo65bobo8boo3bo10b oo$18boo18bo6boo7boo21boo42boo11boo12boo$9boo25b3o5boo15boo13b4o11boo 33bo8bobbo10bo$8bobo4bo12boo30booboo10booboo10booboo29boo10bobo9bobo$ 10bo4bo11bobo31b4o11boo13b4o21boo7boo21bobo$29bo32boo28boo22bo32bo$ 106bo7bobo$13boo3boo79boobo3b4o4boo$14b5o4boo68boobboobobo4b4o35boo3b oo$15b3o4bobbo66bobobbooboboo3bobbo35bobobobo$16bo49bo24b3o8boo3b4o6bo bo27b5o$6b3o11bo43bobo15boo6b3o8boo3b4o7boo29b3o$5bo3bo12bo42boo15boo 7b3o12bo11bo30bo$21bo70bobo$4bo5bo82boo$4boo3boo41bo6bo83boo$30b3o20bo 6boo81bo$30bo20b3o5boo50bo21bobo5bobo$7bo23bo77boo22bo3bo3boo$6bobo8b 3o90boo5bo19bo8bobo$6bobo106b4o14bo4bo7boo$6bo10bobo26bobo65boboboo4bo 12bo9bo$6bo9b5o17b3o5bo3bo62bobbob3o5boobo3bo3bo$6bobbo5boo3boo11boobb obbobo7bo42bo19booboboo5b4obobbobo$7boo6boo3boo9bobbobboo7bo4bo41b3o 15b3ob4o6boobboo19b3o$30bo19bo30bo14bo5bobo5bobo4bo31bo3bo$30bo10b3obb o3bo3boo23bobo13boo5boo6bo29bo7bo5bo$18bo11bo15bobo5bobo23boo7boo12bo 5boo27boo9bo3bo$16boo6boo5bobbo21bo33bo48boo9b3o$23bobo7boo21boo32bobo 57b3o$15bo7bo43bo6bo16boo4bobbo26bobbo$22boo44bo6boo19bo14b4o11bo$16bo bbo46b3o5boo20bo3bo10bo3bo10bo3bo$18boo76b4o11bo14b4o20boo$112bobbo34b oo$135boo8bo$135bobbo6bobo$130boobbo3bo7bobo4boo$129b3obboobbo7bobbo3b oo$119boo5boboo16bobo$96bo5bobo14boo5bobbo8b3o4bobo$94bobo6boo21boboo 15bo$95boo6bo25b3o$130boo$$82bo6bo$83bo6boo$17boo28boo28boobb3o5boo$ 15booboo25booboo25booboo$15b4o26b4o26b4o9bo$16boo28boo28boo9boo$87bobo $$128boo$128boo$112boo26boo$111boo27boo$88bo24bo$88b3o$91bo51bo$90boo 36b3o11bo$142bo$128bobo$127b5o$103bo22boo3boo5boo3boo$93bo8boo22boo3b oo8bo$92b3o7bobo33bo5bo$91b5o43booboo$90bobobobo43bobo$90boo3boo44bo$ 127boo12bo$126boo$93bo31bobbobboo$92bobo32bo3bo$91boobo37b3o$91b3o40bo $90bobbo43bobo$90b3o44boo$89bo3bo44bo3b3o$88bo5bo23bo22bo3bo$89bo3bo5b o17boo21bo5bo$90b3o7bo16bobo20booboboo$98b3o$131bo$129boo$130boo$111b oo$110bobo32boo$107bo4bo12boo18bo$88boo15bobo17boo19b3o$89bo16boo40bo$ 86b3o26boo21boo$86bo29bo21bobbo$92boo22bobo9bo3b3o7bo$90bo3bo5bobb3o 11boo8b5o3bo6bo$89bo5bo9bo3bo16booboo3bo7bo$88bobbo3bo8bo4bobo13b3oboo 3bo3bobbo5boo$95bo16boo12boob4o5boo7bobo$86bo3bo3bo17boo13b4o18bo$85bo boo3boo18boo14bo20boo$85bo23bobo4boo$84boo23bo6bobo$118bo$118boo4$17b oo28boo28boo$15booboo25booboo25booboo$15b4o26b4o26b4o$16boo28boo28boo! golly-3.3-src/Patterns/Life/Signal-Circuitry/reflectors.rle0000644000175000017500000004135613543255652020761 00000000000000#C Fast, low-period glider reflectors. #C #C Clockwise loops: #C These are color-changing reflectors, commonly called "bouncers". #C They work for any period >=22 that is a multiple of their period. #C #C Periods 5, 6, 8: Noam Elkies, 16-Sep-1998 #C Period 7: Noam Elkies, 1-Aug-1999 #C Period 15: oscillator by Karel Suhajda, Dec-02. #C P5 reflector later improved by David Eppstein and Noam Elkies. #C #C Note that there are two possible positions for the spark #C in the p6, p7, and p15 versions. Examples are shown of each. #C Originally from Jason Summers' "jslife" pattern collection. #C #C Counter-clockwise loops: #C These are color-preserving reflectors, commonly called "bumpers". #C Most of these are variants of a mechanism found by Tanner Jacobi #C in April 2016, with different oscillators providing a one-bit #C spark. These reflectors work for any period 34 or higher that #C is a multiple of the oscillator's period. #C #C Mnemonic: #C The words "bumper" and (color-) "preserving" each contain a "P". #C The words "bouncer" and (color-) "changing" each contain a "C". #C #C Perimeter: #C Around the outside of the stamp collection is a glider racetrack #C with a period of 5040 ticks. If the length is changed to any #C non-multiple of 5*7*8*9 = 2520, or if the glider is moved forward #C in the track by less than 2520 ticks, then one or more of the #C reflectors will have to be adjusted. #C #C The p22 bumper was not included in the racetrack. This would have #C required building a much longer period 11*2520 = 27720 racetrack. #C #C http://conwaylife.com/wiki/Bumper #C http://conwaylife.com/wiki/Bouncer #C x = 528, y = 416, rule = B3/S23 35b2o139bo14b2o$34bobo139b3o12b2o2b2o65b2o$28b2o4bo144bo9b2obo2b2o65bo bo$26bo2bo2b2ob4o139b2o9b3o72bo4b2o$26b2obobobobo2bo221b4ob2o2bo2bo$ 29bobobobo80b2o65bo76bo2bobobobob2o$29bobob2o81bobo63bobo5b2o71bobobob o$30bo87bo4b2o57bo2bo4b2o72b2obobo$114b4ob2o2bo2bo56b2o83bo$43b2o69bo 2bobobobob2o209b2o$34b2o7bo73bobobobo130b2o80bobo$34b2o5bobo74b2obobo 131bo7b2o73bo4b2o$15bo25b2o79bo132bobo5b2o69b4ob2o2bo2bo$15b3o238b2o 76bo2bobobobob2o$18bo89b2o227bobobobo73b3o$17b2o90bo7b2o219b2obobo73b 3o$109bobo5b2o223bo63bo10b3o$110b2o294b3o5b3o$9b2o317b2o79bo4b3o$9bo 21b2o296bo7b2o69b2o4b3o$6b2obo22bo233b2o61bobo5b2o$6bo2b3o4b2o11b3o 234bo63b2o79bo$7b2o3bo3b2o11bo22bo214b3o140bobo$9b4o21b2o14b5o214bo 136b2o2b2o$9bo15b2o8bo13bo5bo64b2o284b2o$10b3o12bobo7bobo12b3o2bo64bo$ 13bo13bo8b2o15bob2o64b3o$8b5o14b2o21b4o2bo66bo$7bo2bo22bo11b2o3bo3b2o 284b2o$7b2o22b3o11b2o4b3o286bo$30bo22bo287b3o$30b2o5b2o14bob2o286bo$ 36bobo13b2ob2o$38bo2$44b2o$44bo$45b3o$20b2o25bo$19bobo5b2o$19bo7b2o$ 18b2o138b2o$157bobo2bo$32bo124bobobobo146bo$22b2o4b2obobo122b2o2bobobo 143b3o$21bo2bo2bobobobo121bo2bobobobo142bo$22b2o3bobobob2o109b2o8b3obo b2ob2ob2o139b2o$24b4ob2o2bo110b2o2b2o4bo10bobo$24bo3bo4bo114bobo3bo3bo bob2obo$25bo2bob3o116bo4bo7bo2bo73b2o$26bobobo110b2o11bo3bobo3bo75bo$ 27bo112bo2bo2bobo6b2ob2ob3o74bo$143b4o9bo4bo74b4o$142b3o11bob3o74bo4bo 56b2o$140bo7bob2o2b2obo76bob5o55bobo5b2o$139bobo7bobo3bo2bo63b2o10bo6b 2o53bo7b2o$139b2o8b2ob3o2b2o63b2o2b2o5b2obobobo2bo51b2o$149bo76bobo4bo 2bobobob2o143b2o$153b2o72bo6b2obo2bo68bo76bobo$148bobobo2bo77bo3bob2o 64b2obobo75bo$146b3ob3ob2o68b2o7b2obobo65bobobobo63b2o9b2obo2bo$27b2o 68b2o3b2o41bo3bo2bobo24bob2o42bo8bobobo28b2obo30bo2bobobobob2o32bob2o 24b2o2b2o5bo2b4o44b2obo$28bo68b2o3b2o41b2o2bob2obo24b2obo39b3o9bo2bo 29bob2o30b4ob2o2bo2bo32b2obo28bobo4b3o48bob2o$27bo122bo2bo23b2o43bo12b 2o28b2o38bo4b2o38b2o27bo5bo2b4o42b2o4b2o$27b2o68b2o3b2o47b2o25bo86bo 37bobo45bo33b2obo3bo41bo5bo$97bobobobo73bo88bo36b2o45bo25b2o8bob4obo 41bo5bo$27b2o70bobo75b2o86b2o83b2o25bo8bobo2bobo40b2o4b2o$28bo69b2obo 77bob2o84b2obo77b2o24b3o7b2obobobob2o41b2obo$27bo74b2o75b2obo84bob2o 78bo24bo9bo2bob3o2bo41bob2o$27b2o74bo79b2o80b2o4b2o75bo37bobo3bo41b2o 4b2o$102bo81bo80bo5bo76b2o35b2obob2o42bo5bo$27b2o73b2o79bo82bo5bo73b2o 42bo44bo5bo$28bo74bo79b2o80b2o4b2o74bo37b4obobo41b2o4b2o$27bo74bo76bob 2o84b2obo75bo38bo2b4obo42b2obo$27b2o73b2o75b2obo84bob2o75b2o39bo5bo42b ob2o$385bob6o$384bobo3bo$384bo2bo$189b2o194b2o$188bo2bo73bo12b2o$183b 2o2bob2obo72b3o9bo2bo$183bo3bo4bo75bo8bobobo72b2o$184b3obobob2o73b2o7b 2obobo71bo2bo97bo$186bobobo2bo80bo3bobob2o69bobo3bo94b2o$187bo3b2o77bo 3bob2o2bo2bo70bob6o91b2obo$187b2obo78bobo2bo4bobobob2o69bo5bo89bo2b3o$ 177b2o7b2ob4o2b2o68b2obo2bo4b2obo2b2o2bo67bo2b2obobo79bo8bobobo$177bob o6bo6bo2bo68b2obo2bo5bo2bo3b2o68b2obobobo80b3o5bobobo$178b4o5b3o2b2obo 54b2o16bo2bo5bob2ob2o73bobo85bo2b3o2bo$180bo13bob3o51bobo17b2o6bo4bo 70b2obob2o83b2o3bob2o$184b2o8bo4bo52bo16bo9b4o72bob2o2bo88b2o$179bobo 2b2o7b2ob2ob3o46b4ob2o2b2o22bo61bo9bo2bobobo2bo72bo10bo3bo$179b2o11bo 2b2obo3bo45bo4bobo2bo24bo59b3o7b2obobobob2o82bobo$170b2o15bo3b3o6bo2bo 42b2o2bo2bob2o25b2o62bo8bob2obobo71b3obo3b2obo2bo$171bo14bobo2b3o5b3ob o41bo2b2o3bobo73b2o14b2o8bobob2obo61bo8bob2o5b2obo2bo$168b3o11b2obo2bo 2b2o2bo2bo4bobo38bob2o2bob2obo6bo60b2o5b3o21b2obo3bo62b3o6b2obo8bo2bo$ 167bo3b3o8b2obo2bo3bob2o2b5ob2o38bo4bo4bo7b2o58bo2bo2bo4bo14bo3bo5b3o 66bo3bob3o11b2o$166bo2bobo2bo10bo2bo3bo3bobobobo42b3obob3o7bobo58bobo 2bob4obob2o9bobo2bob3o69b2o18bo$166bob2ob3obo11b2o5b2o2bobobo44b5o69b 2o2b3o4bobobo6b2obo2bo2bo4b4o72bo$165b2o2bobo2bo11bo8bobobobo120bobo3b 4o2bobo6b2obo2bo4b2obo2bo68bo$164bo2bo2b4o21bobo2bo81bo4b2o5b2o26bob5o 2b3o2b2ob2o5bo2bo5bo72bobo$164bobo7b3o19b2o82bobo4b2o5bo25bob2o5b2o4bo 4bo7b2o5bobo66b2o2b2o$161b2obob2o4bo3bo104b2o9bobo24bobo3bob2o2b3obob 3o7bo8b2o66b2o$161bobo3bo2b2ob3o74bo41b2o25bo2bob2obo2bo2bobobo100b2o 15bo$164b3o4bobo75bobo36b2o30b2o7b2o108b2o12bobo$157b2o3b2o2bob2o80b2o 36bobo43b3o94bo6bo15b2o$155b3obobobo3b6o73b2o41bo142bo$154bo4bobo6b3o 45b2o27bobo9b2o171b3o$153bobob2ob2o53bobo27bo5b2o4bobo75bo87bo$90b2o 61bobo5bobo35bo11b2o2b2o27b2o5b2o4bo76bobo86b2o84bo$82bo7bo9bo53bo2b2o bo2bo5b5o26bo10bo2b2o119b2o85bobo82b3o$82b3o3bobo7b3o54b2o2b3obo4bo4bo 24b3o11bo2bo71b5o39b2o68bo27b2o32bo42bo$85bo2b2o7bo59b2o2b2o6bo4bo32b 2o67bobo6b3obob3o36bobo9b2o15bo5b2o5b2o26bobo26b2o2b2o26bobo5b2o5b2o 28b2o$84bobo10b2o58bo7b2o3b3o34b2o13b2o52b2o6bo4bo4bo35bo5b2o3b2o17b2o 3b2o5bo26bo3bo29bobo26b2o5b2o5bo$85b2o68bobo7b2o45b2o7bobo53bo5bob2obo 2b2obo34b2o5b2o5bo15b2o9bobo27bo3bo29bo39bobo$85b2o6bo61b2o13b2o34b3o 3b2o7bo34b2o25bobo3b2o2bo76b2o29bo3bo32bo35b2o38b2ob2o$86b2o4bobo75b2o 32bo4bo6b2o2b2o34bo25b2obo2bo2b2o73b2o34bo3bo8bo15b2o4bobo30b2o43bob2o $86b2o3b2o70bo2bo11b3o24bo4bo4bob3o2b2o34bo21bo2bobo4bo75bobo34bobo9b 2o15bo3bo3bo29bobo42bo$86b2o3b3o69b2o2bo10bo26b5o5bo2bob2o2bo32b4o19b 2o2b2ob4o76bo36bo9bobo12b3o5bo3bo8bo20bo35b2o4b3o$162b2o2b2o11bo35bobo 5bobo30bo4bo8bo15bo121bo20bo8bo3bo5b3o12bobo9bo31b2o3bo3b2o$94bo66bobo 53b2ob2obobo30b2ob2obo5b2o16bobo118bobo29bo3bo3bo15b2o9bobo35b4o2bo$ 94bo66b2o45b3o6bobo4bo29b2o3bo2bo5bo2bo15b2o78b3o38b2o30bobo4b2o15bo8b o3bo20b2o15bob2o$b2o203b6o3bobobob3o29bo2b2o2bob2o4bo2bob2o98b2o7b2o 20b2o35bo32bo3bo18bobo12b3o2bo$bo2bo204b2obo2b2o3b2o31b2obobobo4bo2bo 2bob2o91bobobo2bo2bob2obo2bo18bobo39bo29bo3bo17bo13bo5bo$2b5o14b2o49b 2o13bo117bobo4b3o41bo2bo2b2obo2bobo84bo8b3obob3o2b2obo3bobo18bo5b2o5b 2o26bobo29bo3bo15b2o14b5o$7bo13bo51bo12bo116b3ob2o2bo3bobo38b2obobo3bo 3bo75b2o6b2o8bo4bo4b2o5b2obo18b2o5b2o5bobo26b2o2b2o26bobo34bo$4b3o12bo bo51bobo10b3o113bo3bo4b2obob2o40bobob2o81bobo5bo2bo6b2ob2o2b3o2b5obo 34bo32b2o27bo$3bo15b2o53b2o105b2o19b3o7bobo43bobobo8b2o74bo5bo2bob2o7b obo2b4o3bobo73bobo$3b4o96bo74bo2bobo21b4o2bo2bo44bo2bo8bo70bo2bob2o4bo 2bob2o7bobobo4b3o2b2o72b2o$b2o3bo3b2o67b2o21b2o73bobobobo8bo11bo2bobo 2b2o46b2o10b3o67b4o4bo2bobo10b2obob4obo2bobo74bo$o2b3o4b2o66b2o22bobo 71bobobo2b2o5b2o11bob3ob2obo61bo71b3obo3bo15bo4bo2bo2bo65b3o$2obo75bo 2bo93bobobobo3bo3bo2bo10bo2bobo2bo129b3o5bo20b3o5b2o66bo$3bo79b2o88b2o b5o2b2obo3bo2bob2o8b3o3bo129bo3bob2o7b2o15b2o49b2o15bo6bo$3b2o66bo10b 2o89bobo4bo2bo2b2o2bo2bob2o11b3o129bob2obobo8bo67bobo12b2o$71b3o101bob 3o5b3o2bobo14bo132bobob2obo9b3o64bo15b2o$74bo26b2o72bo2bo6b3o3bo15b2o 130b2obobobob2o9bo94b2o$11b2o60b2o4bo21bo74bo3bob2o2bo11b2o139bo2bobob o2bo100b2o2b2o$12bo61b3o3bo18bobo10bo64b3ob2ob2o7b2o2bobo141bo2b2obo 101bobo$9b3o63bo4bo18b2o10b2o66bo4bo8b2o147b2obob2o101bo$9bo64bo4bo31b obo66b3obo13bo144bobo100bo$73bob2o106bob2o2b3o5b4o140bobobob2o84bo18b 2o$73bo17b2o3bo85bo2bo6bo6bobo138bobob2o2bo82b2o11b3obo3bo$72b2o20bo2b o84b2o2b4ob2o7b2o138bo5bo84bo2bo8bob2o6b3o$94b3o91bob2o149b6obo82bo2bo b2o5b2obo8bo13b2o$49b2o43b2o7bo82b2o3bo151bo3bobo81bo2bob2o3bob3o24bo$ 49bo51b3o34b2o45bo2bobobo153bo2bo81bobo36bobo$46b2obo50bo20bo16bo46b2o bobob3o152b2o79bo3bo10bo27b2o$43bo4bo37bo13b2o18b2o14bobo47bo4bo3bo61b 4o15bo151b2o$42bo4bo22b2o14bobo5b3o23bobo12bobo48bob2obo2b2o60bo4bo12b 3o150b2obo3b2o$42bo3b3o22bo14b2o6b6o31b2ob2o51bo2bo65bo3bobo10bo152bo 2b3o2bo40b2o$43bo4b2o21bobo23b2obo30b2o55b2o67bo3bobo9b2o150bobobo5b3o 36bo2bo$48bo23b2o25bobo35b2o124bo74b2o84bobobo8bo37bobo$49b3o49bo29b2o 4bo125bo5bo11bo55bo2bo81b3o2bo48bo$43bo7bo25b2o22b2o35b3o119bo2bo4bobo 10b3o50bo3bobo82bob2o$42bobo34bo49bo3bo6bo120b2o4b2o9bo5bo47b6obo84b2o $42bo2bo30bo3bo47bo125b2o11b3o8b6obo45bo5bo87bo$43b2o36bo47bo3bo28b2o 16bo74bo27bobo45bobob2o2bo131b2o$69bo6bo3bo49bo30bo2bo13b3o74bobo12bo 7b2ob2o2b2o45bobobob2o127b2o2b2o2b2o$69b3o35b2o22b2o23bo2bo2bobo12bo 78b2o12bo7b2ob2obo49bobo130bobo2bo2b2o$47b2o23bo4b2o29bo47b5obob2o11b 2o102b2obo48b2obob2o128b3o$47bobo21b2o35bobo25b2o24bo2bo95b2o20bo48bo 2b2obo130b2o$49bo27b2o30bob2o23bobo19b3o2b3o7bo89bo66bo2bobobo2bo13bo$ 49b2o23b2ob2o31b6o6b2o14bo18bo4b4o6bobo85bo3bo15bobo47b2obobobob2o11b 3o$72bobo12bobo23b3o5bobo14b2o17bob2o2b3o5b2o92bo65bobob2obo12bo$71bob o14b2o18b2o13bo34bo3bo2bo5b3o86bo3bo13bo3bo47bo2b2obobo12b2o$71bo16bo 20bo49b2obob2o111bo52bobo3bob2o24b2ob2o75b2o$70b2o34b3o51bobobo9bo85bo bo15bo3bo48bob3o5bo5bo15bo2b2o5b2o69b2o$106bo7b2o43bo2bobo9bo104bo53bo 3b3obo4bobo15bo4bo2bo2bo83bo$113b3o43b2o2bo95bo20b2o51bob2o4bo3b2o14b 3ob4obo2bobo68bo12b3o$112bo2bo20b2o15b2o103bob2o72bobob2o5b3o12bo2bobo 4b3o2b2o66bobo10bo17b2o$113bo3b2o17bo17bo103bob2ob2o7bo12b2o49bobo22bo bo2bob2o5bo67bo2bo9b2o16bobo$133b2obo17bobo45b2o52b2o2b2ob2o7bo12bobo 48bobo9bo9b4ob2obo2bob3obo68bo2bo12bo14b3o$96bobo31bo4bo19b2o41b2o2bo 54bobo27bo41b2o6bo10bo8bo4b2o3b2o3bob2obo74bo7b3o13b2o$97b2o10b2o18bo 4bo29bobo30bo2bobo54bob6o8b3o11b2o41bo27b3o3b3o2b2obo3bobo65bo2bo3bobo 9bo9b2o$97bo10bobo18bo3b3o28b2o16b2o9b2obobobob2o54bo5bo9b2o4b2o48bobo 27bobobo2bo2bob2obo2bo65b2o4b2o10b2o9b3o42bo$108bo21bo4b2o22b2o4bo16bo bo8bob2obobobo56b3o10bobo4bo2bo48b2o28b3o3b2o7b2o60b2o10b3o63b3o$107b 2o26bo23bobo20bo15b3o3bo56bo11bo5bo55b2o25bo75b2o27bo47bo$136b3o20b3o 32b4obob3obo73bo55b3o86bo28bo12bobo5b2o39b2o$126b2o10bo54bo11bo62b2o9b obo3bo48bo2bo86b3o26bo12bo2bo4b2o$125b2o39bo27b3obobob3o64bo10bobo3bo 48b2o19b2o69bo9bob2o26b2o12b2o$b2o124bo2bo36b2o27b2obob2o63b3o12bo4bo 54bo14bobo67b2o9bobo41bo41b2ob2o$bo2bo100bobo22b2o34b2o98bo15b4o53bobo 14bo81bo40bobo42bob2o$2b5o14b2o83b2o21b2o209b2o19b2o52bobo13bo6b2o5bo 33b2o43bo$7bo13bo84bo84b2o167bo2bo54bo11bobo5b2o4bo71b2o4b3o$4b3o12bob o112b2o20b2obob2o27b2o168b3o51bo4bo2b2o6bo2bo4b2o4b3o15b3o51b2o3bo3b2o $3bo15b2o100b3o10bobo17b3obobob3o27bo142bo25b2o51b2obo2bob2o7b2o31bo 10b2o44b4o2bo$3b4o116bo12bo16bo11bo154b2o7b2o3b3o16b3o9b2o51b2o43bo10b o2bo29b2o15bob2o$b2o3bo3b2o110bo13b2o15bob3obob4o32b3o119bo2bob2obo2bo 2bobobo17bo9bobo106bobo29bobo12b3o2bo$o2b3o4b2o142bo3b3o15bo20bobo119b obo3bob2o2b3o3b3o14bo12bo107bo30bo13bo5bo$2obo152bobobob2obo8bobo16bo 4b2o120bob2obo3b2o3b2o4bo19bo6b2o136b2o14b5o$3bo111bo39b2obobobob2o9b 2o16b2o127bob3obo2bob2ob4o19bobo61bo99bo$3b2o110bo40bobo2bo30bobo127bo 5b2obo2bobo22bobo60bobo$156bo2b2o41b2o117b2o2b3o4bobo2bo13bo6b2obobo 57bo2bo10bo43b2o$116b3o3b2o31b2o45bobo117bobo2bob4ob3o13b2o4bo4b2obo 57b2o10bo31b2o7b2obo2bob2o$11b2o104b2o3b2o80bo117bo2bo2bo4bo15b2o5bob 3o3bo69b3o15b3o4b2o4bo2bo6b2o2bo4bo$12bo102bobo4b2o80b2o117b2o5b2o2bo 21bo5b3obo87bo4b2o5bobo11bo$9b3o104bo6b2o70bo2b2o129b2ob2o24b2obo3bobo 50b2o33bo5b2o6bo13bobo$9bo113b2o69bobo2bo145b2o12bobob2o2bo49bobo40bo$ 111b2o10bobo59b3o6bobobo147bo12bob2obobo50bo41bobo9b2o$112bo7b2o2bo60b 3o5b2obob2o143b3o11b2obobobob2o48b2o12b2o26b2obo9bo$109b3o7bobo3b3o56b obob2o3bo2bo3bo142bo13bo2bobobo2bo55b2o4bo2bo12bo26b3o$109bo9bo7bo55b 3ob3o3b3o2b2obo157bob2o2bo57b2o5bobo12bo28bo$118b2o65bob2o4b4o4bo156b 2obob2o66bo27b2o$193b3o2b3o160bobo82b3o10b2o$193bo2bo161b2obobobo57b3o 9b2o10b2o4b2o$180b2o11b2obob5o155bo2b2obobo57b2o9bo9bobo3bo2bo$181bo 12bobo2bo2bo157bo5bo54b2o13b3o7bo$178b3o13bo2bo160bob6o55b3o14bo12bo2b o$178bo16b2o160bobo3bo58bobo16b2o9bo2bo$357bo2bo62b2o17bo10bobo$358b2o 79b3o12bo$439bo$453b2o$453b2o$55b2o$53bo2bo$35b2o14b5o$36bo13bo$36bobo 12b3o$37b2o15bo$51b4o$46b2o3bo3b2o408b2o$46b2o4b3o2bo408bo$54bob2o408b obo$54bo412b2o$53b2o2$471b2o$45b2o423bo2bo$45bo425bobo$46b3o423bo$48bo 150b2obo61b2o5bob2o$199bob2o62bo5b2obo$197b2o4b2o59bo4b2o197bo2bo$197b o5bo60b2o4bo197bo$198bo5bo64bo197bo4bo$197b2o4b2o59b2o3b2o195bobo2b2o$ 199b2obo62bo5bob2o189b2obo$199bob2o61bo6b2obo$203b2o59b2o9b2o$203bo72b o187bo2bo$204bo59b2o9bo190b2o$203b2o60bo9b2o$199b2obo61bo6bob2o$199bob 2o61b2o5b2obo2$3b2o$3bo2bo493b2o5b2o$4b5o14b2o475b2o5bo$9bo13bo481bobo $6b3o12bobo481b2o$5bo15b2o478b2o$5b4o270bobo2bobo214bobo$3b2o3bo3b2o 261b2obo2bo2bo2bob2o211bo$2bo2b3o4b2o254bo10bobo2bobo$2b2obo262b3o$5bo 265bo$5b2o263b2o237bo$279bo6bo221bobo$273bo3bo2bo4bo2bo212b3o3bo3bo$ 13b2o257bobo2bo2bo4bo2bo213bo4bo3bo$14bo234bo18b2obo2bo2bo2bo4bo2bo 213bo4bo3bo$11b3o234b3o5bo11b2obo2bo4bo6bo215bo4bo3bo$11bo235b5o3bobo 13bo2bo227bo4bo3bo$255bobo15b2o226b3o3bo3bo$254b2obo14bo235bobo$509bo 2$254b2obo$255bobo26b2o5b2o$247b5o3bobo7bo14bo3b2o5bo$248b3o5bo8b2o14b o7bobo$249bo14bobo12b3o7b2o$285b2o$285bobo$256bo29bo$255bobo$256b2o$ 252b2o7b3o12bobo15bo$251bobo7bo14b2o9bo5b3o$251bo5b2o3bo14bo8bobo3b5o$ 250b2o5b2o27bobo$286bob2o3$270bo15bob2o$268b2o16bobo$268bo2bo14bobo3b 5o$194b2o72bo2bob2o12bo5b3o$194b2o14bo45bo6bo4bo2bob2o19bo$208b3o43bo 2bo4bo2bo2bobo$192b6o9bo46bo2bo4bo2bo3bo$191bo5bo9b2o45bo2bo4bo2bo$ 192b4o60bo6bo7b2o$189b3o2b2o7bo12b2o53bo$189bo2bo9bobo8b2o2bo54b3o$ 192bo2bobo3b2o10bo3bobo54bo$190bobobo6b3o10b3obobo35bobo2bobo$190b2o2b o21bo3bo31b2obo2bo2bo2bob2o$194bobo7bo7b3obobobob2o32bobo2bobo$185b2o 8b2o7bo6bo2bobobobob2o$186bo24b2o2b2obobo$186bobo30b2o$187b2o$214bobo$ 192b2o$194bo17bo3bo$191bo3bo15bo$196bo15bo3bo$191bo3bo17bo$214b2o$191b obo58b2o6b2o225b2obo6b2obo$219b2o30bo2bo4bo2bo224bob2o6bob2o$187b2o30b obo28b6o2b6o227b2o8b2o$187bobob2o2b2o24bo29bo2bo4bo2bo12bo12bo202bo9bo $184b2obobobobo2bo6bo7b2o8b2o29b2o6b2o11b3o12bo203bo9bo$184b2obobobob 3o7bo7bobo58bo14b3o201b2o8b2o$187bo3bo21bo2b2o54b2o6b2o205b2obo6b2obo$ 187bobob3o10b3o6bobobo37bo2bo20bobo205bob2o6bob2o$188bobo3bo10b2o3bobo 2bo37b3o2b3o7bo10bo3bo3b3o195b2o8b2o$83b3o104bo2b2o8bobo9bo2bo33bo2bo 2bo2bo5bobo10b4o4bo196bo9bo$83bo106b2o12bo7b2o2b3o34b2o4b2o5b2o20bo 197bo9bo$84bo127b4o37b2o4b2o5b3o19bo196b2o8b2o$199b2o9bo5bo63b4o4bo 198b2obo6b2obo$200bo9b6o53bo9bo3bo3b3o197bob2o6bob2o$197b3o50b2o17bo9b obo$197bo14b2o37bo28b2o$212b2o37bobo33b3o$252b2o34bo$288bo2$280bo$258b 2o18bo2b2o$216b2o37b2o2bo18b2o$216b2o14bo24bo$230b3o240bo$214b6o9bo19b o221b3o$213bo5bo9b2o18bo34b2o184bo$214bo3bo29b3o33bobo183b2o$211b3o11b o30b2o28bo$211bo2b5o5bobo29bobo9bo17b2o178bo$214bo3bo4bo2bo21b3o3bo3bo 9bo196bo$212bobob2o6b2o23bo4b4o206b2o$212b2o2bo32bo19b3o5b2o4b2o180bob 3o$216bobo30bo20b2o5b2o4b2o184bo$217b2o30bo4b4o10bobo5bo2bo2bo2bo181bo bo$248b3o3bo3bo10bo7b3o2b3o183bo$256bobo20bo2bo$256b2o6b2o221bo$248b3o 14bo45bobo2bobo166b3o$249bo12b3o11b2o6b2o21b2obo2bo2bo2bob2o146bo14bo$ 249bo12bo12bo2bo4bo2bo24bobo2bobo14bo134bobo13b2o$274b6o2b6o43b3o134bo $275bo2bo4bo2bo43bo137b3obo7bo$276b2o6b2o44b2o140b2o5bobo$311bo6bo153b o5b2o$309bo2bo4bo2bo5bo144bo6b3o$309bo2bo4bo2bo4bobo$309bo2bo4bo2bo3bo 2bo138b2o13bo$311bo6bo6b2o140bo13bo$464b3o$464bo$459b2o$460bo$460bobo 9bo26b2o7bo5b2o$461b2o8bo28bo6b3o3b3o$471b3o26bobo6bo2b2o2b2o$501b2o4b 2o2b5ob2o$465b2o42b3obobo2bo$464bo2bo38bo2bobob3o$465bobo38b2ob5o2b2o 4b2o$466bo40b2o2b2o2bo6bobo$509b3o3b3o6bo$473bo35b2o5bo7b2o$474b2o21b 2o$473b2o21b2o$446b2o7bo5b2o35bo$447bo6b3o3b3o$447bobo6bo2b2o2b2o40bo$ 448b2o4b2o2b5ob2o38bobo$456b3obobo2bo38bo2bo$453bo2bobob3o42b2o$453b2o b5o2b2o4b2o$454b2o2b2o2bo6bobo26b3o$456b3o3b3o6bo28bo8b2o$456b2o5bo7b 2o26bo9bobo$511bo$511b2o$507bo$505b3o$490bo13bo$490bo13b2o$164bo117bo$ 164b3o115b3o206b3o6bo$167bo117bo75b2o129b2o5bo$166b2o116b2o58b2o4b2o5b 2o2b2o127bobo5b2o$343bo2bo2bo2bo3bobo132bo7bob3o$343b2obo2bob2o4bo145b o$346bo2bo136b2o13bobo$345b2o2b2o8b2o126bo14bo$359bo124b3o$360b3o121bo $176b2o116b2o66bo$169b2o5bobo108b2o5bobo45bo2bo4bo2bo149bo$169b2o7bo 108b2o7bo43b3o2b6o2b3o146bobo$178b2o116b2o44bo2bo4bo2bo148bo$502b3obo$ 165bo117bo222b2o$164bobob2o4b2o106bobob2o4b2o212bo$164bobobobo2bo2bo 105bobobobo2bo2bo210bo$163b2obobobo3b2o105b2obobobo3b2o$164bo2b2ob4o 108bo2b2ob4o208b2o$164bo4bo3bo108bo4bo3bo209bo$165b3obo2bo110b3obo2bo 207b3o$167bobobo113bobobo208bo$170bo117bo!golly-3.3-src/Patterns/Life/Signal-Circuitry/chase-the-glider.rle0000644000175000017500000012433312750014265021703 00000000000000#C A pattern which "chases the glider". #C Here a glider is bounced back and forth in increasingly long #C paths using convoys which arrive just in time at each end point. #C Each bounce pushes the path of the glider further out by 7.5 cells. #C The convoys are triggered by returning LWSSs from the bounces. #C This shows a "race" between a diagonal signal and two horizontal #C signals. Two advancer lanes are required so that the horizontal #C signals can "cheat" a bit to allow the convoys to be built in #C time to be used. Thanks to Jason Summers for showing me the #C elegant bounce reaction used here. #C David I. Bell, April 2010 x = 1717, y = 1627, rule = B3/S23 158boo19boo$159bo19bo5bo$159bobo5boo8bobo3b3o$160boo3bo3bo7boo3bo$164b o5bo11boo$163boobo3bo$164bo5bo9bo8boo$165bo3bo9b3o7boo$167boo9bo3bo$ 177bob3obo$178b5o9bo$191bo7boo$191bo7boo3$187boo3boo$177boobbo8bo$179b obo5bo5bo$181boo5booboo$182boo5bobo$180boboo6bo8b3o$180b3o7bo7bo3bo$ 197bo5bo$197booboboo$175boo3boo8bo$178bo11bo$175bo5bo18bo$176booboo18b obo$177bobo19bobo$178bo8b3o9boo$178bo7bo3bo7bo$185bo5bo5b3o$185boobob oo4bo3bo$180boo13bob3obo$180bo15b5o4bo$181b3o22boo$183bo21boo$166bobo$ 164bo3bo21boo$164bo19bo5bo$157boo4bo4bo14b4o4b3o$157boo5bo12bo4boobobo 5bo$164bo3bo3boboo5b3obobbo23bobo$166bobobbob4o5booboboo24boo$171boobb oo6b4ob3o22bo$184bo4bobo6boo$123bo25boo40bo6boo$123bo24b4o11boo26boo 31boo$122bo24booboo10booboo56bobo$148boo13b4o41bobo11bo6boo$127boo35b oo42bobbo10bobbobbobboboo$126bo49boo21boo10boo9bo6boobboo$127boo24bo 22bobo20boo8bo3boobboo4bobo$148boobo3boboo17bo27boo5boo11boo$148bo9bo 44bo4bobbo$149boo5boo9boo39bobo$146b3obb5obb3o5bobo$146bobbo7bobbo7bo 35boo20bo$147boo9boo35boo8bo19bobo$141boo40b3obbo5bo3bo6bobo7boo7boboo $142bo36bo3bo9bo5bo6boo6bobo6booboo10boo$142bobo5bo8boo16bobo4bo8bo3bo bbo12bo6b3oboboo10boo$137boo4boo3bobo6bobbo14boo16bo19bobbobbobbobbobo $137bobo7bobo7bo3bobboo9boo17bo3bo3bo10bo6boo4bo$137bo8bobbo7bobboobb 3o8boo18boo3boobo10bobo$147bobo16boobo7bobo23bo11boo$148bobo4b3o8bobbo 9bo23boo21boo$150bo15boobo55bo6bobo$164b3o60bo4bobbo$164boo51bo7b3o7b oo$216bobo8boo4bo3boo4boo$209boo4boboo7boobo5boo6boo$170bo38boo3booboo 7booboobobbo$168b3o44boboo6bobobobbobo$167bo48bobo7b4o$142bo24boo48bo 9boo$142b3o$145bo6boo10bo74boo$144boo6bobo9bo73bobo$152bo70bobo11bo6b oo$223bobbo10bobbobbobboboo$162boo3boo45boo10boo9bo6boobboo$146b3o8boo 4b5o46boo8bo3boo8bobo$145booboo6bobbo4b3o52boo5boo11boo$145booboo15bo 52bo4bobbo8bo$145b5o11bo61bobo10boo$144boo3boo8bo75boo$160bo80bo$240bo bo$150bo79boo7boboo$149boboo76bobo6booboo10boo$149bo69boo7bo6b3oboboo 10boo$219boo7bobbobbobbobbobo$149boobo9b3o63bo6boo4bo$147bobbo78bobo$ 147bobo12bobo65boo$161b5o$160boo3boo80bobo$160boo3boo80bobbo$232bo6bo 10boo$148b3o80bobo5bo8bo3boo4boo$147bo3bo11bo60boo4boboo6bo9boo6boo$ 146bo5bo11boo58boo3booboo9boobbobbo$147bo3bo78boboo5b3obbobbobo$148b3o 15bo64bobo7b4o$148b3o81bo9boo$162bobbo$162boo90boo$253bobo$149boo87bob o11bo6boo$149boo87bobbo10bobbobbobboboo$229boo10boo9bo6boobboo$229boo 8bo3boobboo4bobo$234boo5boo11boo$233bo4bobbo$238bobo$$256bo$255bobo$ 245boo7boboo$244bobo6booboo10boo$234boo7bo6b3oboboo10boo$234boo7bobbo bbobbobbobo$243bo6boo4bo$244bobo$245boo$256boo$255bo6bobo$257bo4bobbo$ 247bo7b3o7boo$246bobo8boo4bo3boo4boo$239boo4boboo7boobo5boo6boo$239boo 3booboo7booboobobbo$245boboo6bobobobbobo$246bobo7b4o$247bo9boo$$269boo $268bobo$253bobo11bo6boo$253bobbo10bobbobbobboboo$244boo10boo9bo6boobb oo$244boo8bo3boo8bobo$249boo5boo11boo$248bo4bobbo8bo$253bobo10boo$265b oo$271bo$270bobo$260boo7boboo$259bobo6booboo10boo$249boo7bo6b3oboboo 10boo$249boo7bobbobbobbobbobo$258bo6boo4bo$259bobo$260boo$$277bobo$ 277bobbo$262bo6bo10boo$261bobo5bo8bo3boo4boo$254boo4boboo6bo9boo6boo$ 254boo3booboo9boobbobbo$260boboo5b3obbobbobo$261bobo7b4o$262bo9boo$$ 284boo$283bobo$268bobo11bo6boo$268bobbo10bobbobbobboboo$259boo10boo9bo 6boobboo$259boo8bo3boobboo4bobo$264boo5boo11boo$263bo4bobbo$268bobo$$ 286bo$285bobo$275boo7boboo$274bobo6booboo10boo$264boo7bo6b3oboboo10boo $264boo7bobbobbobbobbobo$273bo6boo4bo$274bobo$275boo$286boo$285bo6bobo $287bo4bobbo$277bo7b3o7boo$276bobo8boo4bo3boo4boo$269boo4boboo7boobo5b oo6boo$269boo3booboo7booboobobbo$275boboo6bobobobbobo$276bobo7b4o$277b o9boo$$299boo$298bobo$283bobo11bo6boo$283bobbo10bobbobbobboboo$274boo 10boo9bo6boobboo$274boo8bo3boo8bobo$279boo5boo11boo$278bo4bobbo8bo$ 283bobo10boo$295boo$301bo$300bobo$290boo7boboo$289bobo6booboo10boo$ 279boo7bo6b3oboboo10boo$279boo7bobbobbobbobbobo$288bo6boo4bo$289bobo$ 290boo$$307bobo$307bobbo$292bo6bo10boo$291bobo5bo8bo3boo4boo$284boo4bo boo6bo9boo6boo$284boo3booboo9boobbobbo$290boboo5b3obbobbobo$291bobo7b 4o$292bo9boo$$314boo$313bobo$298bobo11bo6boo$298bobbo10bobbobbobboboo$ 289boo10boo9bo6boobboo$289boo8bo3boobboo4bobo$294boo5boo11boo$293bo4bo bbo$298bobo$$316bo$315bobo$305boo7boboo$304bobo6booboo10boo$294boo7bo 6b3oboboo10boo$294boo7bobbobbobbobbobo$303bo6boo4bo$304bobo$305boo$ 316boo$315bo6bobo$317bo4bobbo$307bo7b3o7boo$306bobo8boo4bo3boo4boo$ 299boo4boboo7boobo5boo6boo$299boo3booboo7booboobobbo$305boboo6bobobobb obo$306bobo7b4o$307bo9boo$$329boo$328bobo$313bobo11bo6boo$313bobbo10bo bbobbobboboo$304boo10boo9bo6boobboo$304boo8bo3boo8bobo$309boo5boo11boo $308bo4bobbo8bo$313bobo10boo$325boo$331bo$330bobo$320boo7boboo$319bobo 6booboo10boo$309boo7bo6b3oboboo10boo$309boo7bobbobbobbobbobo$318bo6boo 4bo$319bobo$320boo$$337bobo$337bobbo$322bo6bo10boo$321bobo5bo8bo3boo4b oo$314boo4boboo6bo9boo6boo$314boo3booboo9boobbobbo$320boboo5b3obbobbob o$321bobo7b4o$322bo9boo$$344boo$343bobo$328bobo11bo6boo$328bobbo10bobb obbobboboo$319boo10boo9bo6boobboo$319boo8bo3boobboo4bobo$324boo5boo11b oo$323bo4bobbo$328bobo$$346bo$345bobo$335boo7boboo$334bobo6booboo10boo $324boo7bo6b3oboboo10boo$324boo7bobbobbobbobbobo$333bo6boo4bo$334bobo$ 335boo$346boo$345bo6bobo$347bo4bobbo$337bo7b3o7boo$336bobo8boo4bo3boo 4boo$329boo4boboo7boobo5boo6boo$329boo3booboo7booboobobbo$335boboo6bob obobbobo$336bobo7b4o$337bo9boo$$359boo$358bobo$343bobo11bo6boo$343bobb o10bobbobbobboboo$334boo10boo9bo6boobboo$334boo8bo3boo8bobo$339boo5boo 11boo$338bo4bobbo8bo$343bobo10boo$355boo$361bo$360bobo$350boo7boboo$ 349bobo6booboo10boo$339boo7bo6b3oboboo10boo$339boo7bobbobbobbobbobo$ 348bo6boo4bo$349bobo$350boo$$367bobo$367bobbo$352bo6bo10boo$351bobo5bo 8bo3boo4boo$344boo4boboo6bo9boo6boo$344boo3booboo9boobbobbo$350boboo5b 3obbobbobo$351bobo7b4o$352bo9boo$$374boo$373bobo$358bobo11bo6boo$358bo bbo10bobbobbobboboo$349boo10boo9bo6boobboo$349boo8bo3boobboo4bobo$354b oo5boo11boo$353bo4bobbo$358bobo$$376bo$375bobo$365boo7boboo$364bobo6b ooboo10boo$354boo7bo6b3oboboo10boo$354boo7bobbobbobbobbobo$363bo6boo4b o$364bobo$365boo$376boo$375bo6bobo$377bo4bobbo$367bo7b3o7boo$366bobo8b oo4bo3boo4boo$359boo4boboo7boobo5boo6boo$359boo3booboo7booboobobbo$ 365boboo6bobobobbobo$366bobo7b4o$367bo9boo$$389boo$388bobo$373bobo11bo 6boo$373bobbo10bobbobbobboboo$364boo10boo9bo6boobboo$364boo8bo3boo8bob o$369boo5boo11boo$368bo4bobbo8bo$373bobo10boo$385boo$391bo$390bobo$ 380boo7boboo$379bobo6booboo10boo$369boo7bo6b3oboboo10boo$369boo7bobbo bbobbobbobo$378bo6boo4bo$379bobo$380boo$$397bobo$397bobbo$382bo6bo10b oo$381bobo5bo8bo3boo4boo$374boo4boboo6bo9boo6boo$374boo3booboo9boobbo bbo$380boboo5b3obbobbobo$381bobo7b4o$382bo9boo$$404boo$403bobo$388bobo 11bo6boo$388bobbo10bobbobbobboboo$379boo10boo9bo6boobboo$379boo8bo3boo bboo4bobo$384boo5boo11boo$383bo4bobbo$388bobo$$406bo$405bobo$395boo7bo boo$394bobo6booboo10boo$384boo7bo6b3oboboo10boo$384boo7bobbobbobbobbob o$393bo6boo4bo$394bobo$395boo$406boo$405bo6bobo$407bo4bobbo$397bo7b3o 7boo$396bobo8boo4bo3boo4boo$389boo4boboo7boobo5boo6boo$389boo3booboo7b ooboobobbo$395boboo6bobobobbobo$396bobo7b4o$397bo9boo$$419boo$418bobo$ 403bobo11bo6boo$403bobbo10bobbobbobboboo$394boo10boo9bo6boobboo$394boo 8bo3boo8bobo$399boo5boo11boo$398bo4bobbo8bo$403bobo10boo$415boo$421bo$ 420bobo$410boo7boboo$409bobo6booboo10boo$399boo7bo6b3oboboo10boo$399b oo7bobbobbobbobbobo$408bo6boo4bo$409bobo$410boo$$427bobo$427bobbo$412b o6bo10boo$411bobo5bo8bo3boo4boo$404boo4boboo6bo9boo6boo$404boo3booboo 9boobbobbo$410boboo5b3obbobbobo$411bobo7b4o$412bo9boo$$434boo$433bobo$ 418bobo11bo6boo$418bobbo10bobbobbobboboo$409boo10boo9bo6boobboo$202boo 205boo8bo3boobboo4bobo$202bo211boo5boo11boo$192boo6bobo210bo4bobbo$ 190bobbo6boo216bobo$189bo$181boo6bo6bo239bo$181boo6bo7boo236bobo$190bo bbo231boo7boboo$192boo230bobo6booboo10boo$414boo7bo6b3oboboo10boo$55bo 358boo7bobbobbobbobbobo$54b3o366bo6boo4bo$53b5o366bobo$425boo$436boo$ 435bo6bobo$47bo389bo4bobbo$47bo379bo7b3o7boo$46bobo377bobo8boo4bo3boo 4boo$47bo5b5o361boo4boboo7boobo5boo6boo$47bo6b3o362boo3booboo7booboobo bbo$47bo7bo369boboo6bobobobbobo$47bo378bobo7b4o$46bobo378bo9boo$47bo$ 47bo12bobboboobobbo377boo$59boobbo4bobboo375bobo$60bobboboobobbo361bob o11bo6boo$433bobbo10bobbobbobboboo$35b6o383boo10boo9bo6boobboo$34bo6bo 382boo8bo3boo8bobo$33bo8bo386boo5boo11boo$34bo6bo386bo4bobbo8bo$35b6o 392bobo10boo$445boo$451bo$450bobo$440boo7boboo$439bobo6booboo10boo$ 429boo7bo6b3oboboo10boo$429boo7bobbobbobbobbobo$438bo6boo4bo$439bobo$ 440boo$$19boo436bobo$19boo436bobbo$442bo6bo10boo$441bobo5bo8bo3boo4boo $434boo4boboo6bo9boo6boo$19bo414boo3booboo9boobbobbo$18bobo419boboo5b 3obbobbobo$17bo3bo419bobo7b4o$18b3o421bo9boo$16boo3boo$464boo$463bobo$ 448bobo11bo6boo$448bobbo10bobbobbobboboo$439boo10boo9bo6boobboo$439boo 8bo3boobboo4bobo$444boo5boo11boo$443bo4bobbo$448bobo$16boo$17bo448bo$ 14b3o448bobo$14bo440boo7boboo$454bobo6booboo10boo$444boo7bo6b3oboboo 10boo$444boo7bobbobbobbobbobo$453bo6boo4bo$454bobo$455boo$466boo$465bo 6bobo$467bo4bobbo$457bo7b3o7boo$456bobo8boo4bo3boo4boo$449boo4boboo7b oobo5boo6boo$449boo3booboo7booboobobbo$455boboo6bobobobbobo$456bobo7b 4o$47boo408bo9boo$48bo$48bobo9bo418boo$49boo8bobo416bobo$58bo3boo6boo 391bobo11bo6boo$58bo3boboo4bobo390bobbo10bobbobbobboboo$58bo3bob3o4b3o 7boo371boo10boo9bo6boobboo$59boboboobbo4b3o6boo371boo8bo3boo8bobo$60bo 4boo4b3o385boo5boo11boo$70bobo385bo4bobbo8bo$70boo391bobo10boo$475boo$ 57bo423bo$57bobo420bobo$57boo411boo7boboo$469bobo6booboo10boo$459boo7b o6b3oboboo10boo$459boo7bobbobbobbobbobo$468bo6boo4bo$50bo6boo410bobo$ 49bobo5boo30boo379boo$44boo42bobo8bo$43bobo3b3o26boo7b3o4booboobo386bo bo$42bo8bo4bobo19boo6b3o4bobb3obo386bobbo$33boo7bobbo6boobbobbo27b3o4b oo3bo372bo6bo10boo$33boo7bo8bobo5boo27bobo380bobo5bo8bo3boo4boo$43bobo 3bo3bo3bo3boo26boo373boo4boboo6bo9boo6boo$44boobboob3o5boo35boo3boo37b oo322boo3booboo9boobbobbo$51boo3bobbo5boo32bo31bo8boo328boboo5b3obbobb obo$56bobo6bobo28bo5bo27bo5bo6boo6boo318bobo7b4o$67bo29booboo28boboo3b o5b3o5boo319bo9boo$67boo29bobo30b6o6boo$99bo32b4o4boo352boo$34boo63bo 40boo351bobo$34bo443bobo11bo6boo$27bo4bobo93booboboo343bobbo10bobbobbo bboboo$26b4ob3o435boo10boo9bo6boobboo$9boo14booboboo96bo5bo334boo8bo3b oobboo4bobo$9bobbo11b3obobbo66boo374boo5boo11boo$b5o7bo11boobobo67boo 29booboo339bo4bobbo$o5bo6bo12b4o101bo346bobo$o3boo7bo7bo5bo$bo7bobbo9b o473bo$9boo9b3o314boo156bobo$337boo146boo7boboo$131boo351bobo6booboo 10boo$131boo341boo7bo6b3oboboo10boo$474boo7bobbobbobbobbobo$483bo6boo 4bo$27b3o308bo145bobo$27bobo3boo301booboo144boo$26boo5bobbo459boo$19bo bo5bo9bo297bo5bo153bo6bobo$17bo3bobboo11bo6boo451bo4bobbo$10boo5bo10bo 8bo6boo289booboboo145bo7b3o7boo$10boo4bo4bo7boobbobbo449bobo8boo4bo3b oo4boo$17bo7bobobbobboo444boo4boboo7boobo5boo6boo$17bo3bo5b3o449boo3b ooboo7booboobobbo$19bobo463boboo6bobobobbobo$486bobo7b4o$487bo9boo$83b oo$83boo255boo167boo$340bo167bobo$96boo243b3o149bobo11bo6boo$96boo245b o149bobbo10bobbobbobboboo$484boo10boo9bo6boobboo$484boo8bo3boo8bobo$ 489boo5boo11boo$488bo4bobbo8bo$493bobo10boo$96b3o406boo$82b3o426bo$81b o3bo10bobo411bobo$80bo5bo8b5o400boo7boboo$81bo3bo8boo3boo398bobo6boob oo10boo$82b3o9boo3boo388boo7bo6b3oboboo10boo$82b3o404boo7bobbobbobbobb obo$498bo6boo4bo$97boo400bobo$95booboo400boo$95bobbo$80b3o15bo418bobo$ 79booboo3bo7bo421bobbo$79booboo4boo6boo404bo6bo10boo$79b5o3boo412bobo 5bo8bo3boo4boo$78boo3boo409boo4boboo6bo9boo6boo$96boo3boo391boo3booboo 9boobbobbo$91boo4b5o398boboo5b3obbobbobo$91boo5b3o400bobo7b4o$99bo402b o9boo$$524boo$78boo443bobo$79bo428bobo11bo6boo$76b3o429bobbo10bobbobbo bboboo$76bo5bobo414boo10boo9bo6boobboo$82boo415boo8bo3boobboo4bobo$83b o14boo404boo5boo11boo$98boo403bo4bobbo$508bobo$68bo$68b3o455bo$71bo 453bobo$70boo443boo7boboo$514bobo6booboo10boo$504boo7bo6b3oboboo10boo$ 504boo7bobbobbobbobbobo$513bo6boo4bo$514bobo$515boo$70boo3boo449boo$ 73bo9bo441bo6bobo$70bo5bo4bobo443bo4bobbo$71booboo6boo433bo7b3o7boo$ 72bobo441bobo8boo4bo3boo4boo$73bo435boo4boboo7boobo5boo6boo$73bo435boo 3booboo7booboobobbo$515boboo6bobobobbobo$516bobo7b4o$70boo445bo9boo$ 71bo$68b3o468boo$68bo469bobo$523bobo11bo6boo$523bobbo10bobbobbobboboo$ 514boo10boo9bo6boobboo$98bo415boo8bo3boo8bobo$96bobo420boo5boo11boo$ 97boo419bo4bobbo8bo$523bobo10boo$535boo$541bo$90bo449bobo$89bobo438boo 7boboo$88bo3bo436bobo6booboo10boo$88bo3bo426boo7bo6b3oboboo10boo$88bo 3bo426boo7bobbobbobbobbobo$88bo3bo435bo6boo4bo$88bo3bo436bobo$88bo3bo 437boo$89bobo$72boo16bo8b3o445bobo$73bo27bo445bobbo$73bobo5boo17bo431b o6bo10boo$74boo5bobbo446bobo5bo8bo3boo4boo$85bo438boo4boboo6bo9boo6boo $85bo438boo3booboo9boobbobbo$85bo7bo436boboo5b3obbobbobo$81bobbo8boo 436bobo7b4o$72bo8boo9bobo437bo9boo$72bo141boo$71bobo140boo338boo$72bo 480bobo$72bo465bobo11bo6boo$72bo465bobbo10bobbobbobboboo$72bo456boo10b oo9bo6boobboo$71bobo10b3o127b3o312boo8bo3boobboo4bobo$72bo13bo8b4o115b 3o317boo5boo11boo$72bo12bo8b6o113bo3bo315bo4bobbo$93b8o437bobo$65boo 25boo6boo110boo3boo$64bobo11boo13b8o455bo$54boo7bo6bobo4bobo14b6o455bo bo$54boo7bobbo3bobo6bo15b4o113boo331boo7boboo$63bo6boo15bo123bo27bo 304bobo6booboo10boo$64bobo19b3o123boo23b3o294boo7bo6b3oboboo10boo$49bo 15boo19b3o124bo22bo297boo7bobbobbobbobbobo$49b3o165bo18boo305bo6boo4bo $52bo31boo3boo126bo326bobo$51boo31boo3boo454boo$71bo484boo$71boo160b3o 319bo6bobo$70bobo150b3o331bo4bobbo$53b3o167bo9bobo311bo7b3o7boo$52boob oo84boo69b3o4boo3bo7b5o309bobo8boo4bo3boo4boo$52booboo6boo24boo50bo69b o3bo3boo10boo3boo301boo4boboo7boobo5boo6boo$52b5o7boo23bo41bo7bobo68bo 5bo14boo3boo301boo3booboo7booboobobbo$51boo3boo5bo12b8o6b3o38bobo5boo 69bo5bo328boboo6bobobobbobo$70bo5bob4obo8bo27boo12boo77bo332bobo7b4o$ 69bo6b8o36boo12boo75bo3bo15boo314bo9boo$69boo63boo78bo14boobo$70bo60bo bo76bobbo15bo339boo$131bo78bo357bobo$211bo18b3obo318bobo11bo6boo$67boo 3boo134b3o23bo318bobbo10bobbobbobboboo$51boo4boo8bobobobo134bo25bo309b oo10boo9bo6boobboo$52bo3bobo9b5o471boo8bo3boo8bobo$49b3o6bo10b3o477boo 5boo11boo$49bo20bo477bo4bobbo8bo$553bobo10boo$35boo192boo3boo329boo$ 35boo26boo166b3o337bo$63bobo164bo3bo335bobo$58bo4bo8boo4bo152bobo326b oo7boboo$56b3o13bo5b3o151bo326bobo6booboo10boo$55bo17b3o5bo467boo7bo6b 3oboboo10boo$55boo3bo14bo4boo467boo7bobbobbobbobbobo$60b3o18b3o102boo 370bo6boo4bo$63bo18bobo101boo44boo325bobo$62boo17bo3bo146boo326boo$42b oo37b5o$41bobo36boo3boo490bobo$32boo3boo4bo6boo3boo24b5o491bobbo$34b3o 13bobobobo7b3o15b3o477bo6bo10boo$33bo3bo13b5o27bo477bobo5bo8bo3boo4boo $34bobo10boo3b3o9bobo487boo4boboo6bo9boo6boo$35bo11bobo3bo9b5o10boo 105b3o366boo3booboo9boobbobbo$47bo14boo3boo9bobo103bo3bo371boboo5b3obb obbobo$36b3o23boo3boo9bo104bo5bo371bobo7b4o$36b3o144booboboo372bo9boo $$67boo93bo421boo$67boboo91b3o24bo393bobo$34boo3boo29bo94bo16bobo3boo 378bobo11bo6boo$35b5o10b3o111boo15bobbo383bobbo10bobbobbobboboo$36b3o 10booboo11bob3o10b3o99bobooboboo368boo10boo9bo6boobboo$37bo11booboo11b o13bo3bo102bobboo368boo8bo3boobboo4bobo$49b5o11bo120b4o374boo5boo11boo $48boo3boo23bo5bo478bo4bobbo$78boo3boo483bobo$185boo3boo$174b3o4boo5bo 397bo$64boo3boo10bo84b3o7bo4boobbo5bo393bobo$52boo12b3o11bobo82bo3bo5b o10booboo384boo7boboo$37boo26bo3bo10bobo81bo5bo16bobo384bobo6booboo10b oo$37boo27bobo13bo82bo3bo18bo375boo7bo6b3oboboo10boo$67bo14bo83b3o19bo 375boo7bobbobbobbobbobo$50boo27bobbo83bobbo403bo6boo4bo$50boo28boo85b 3o404bobo$167boobo19boo383boo$67boo99bobo19bo395boo$67boo100bo21b3o 391bo6bobo$193bo393bo4bobbo$577bo7b3o7boo$166boo3boo403bobo8boo4bo3boo 4boo$166bobobobo396boo4boboo7boobo5boo6boo$167b5o397boo3booboo7booboob obbo$168b3o404boboo6bobobobbobo$169bo406bobo7b4o$577bo9boo$$599boo$ 598bobo$583bobo11bo6boo$583bobbo10bobbobbobboboo$168boo404boo10boo9bo 6boobboo$168boo404boo8bo3boo8bobo$579boo5boo11boo$50bo527bo4bobbo8bo$ 49b3o531bobo10boo$595boo$84boo515bo$49b3o32boo514bobo$590boo7boboo$49b obo45boo490bobo6booboo10boo$49bobo45boo480boo7bo6b3oboboo10boo$579boo 7bobbobbobbobbobo$49b3o536bo6boo4bo$84bo504bobo$83b3o11b3o490boo$49b3o 31b3o11b3o$50bo45bo3bo506bobo$81boo3boo7bo5bo505bobbo$34bobbo4bobbo35b oo3boo8bo3bo491bo6bo10boo$32b3obb6obb3o49b3o491bobo5bo8bo3boo4boo$34bo bbo4bobbo538boo4boboo6bo9boo6boo$83boo499boo3booboo9boobbobbo$83bobo 504boboo5b3obbobbobo$82bobboo504bobo7b4o$84boo12bobo491bo9boo$84boo11b obbo128boo$85bo9boboo131bo383boo$230bobo7boo371bobo$79bo5bo12bo132boo 7boo356bobo11bo6boo$79bo5bo9boobo138boo10bo4bo343bobbo10bobbobbobboboo $80bo3bo6bo5bo138b3o10bo4bobo332boo10boo9bo6boobboo$81b3o5bo147boo10bo 7boo4boo324boo8bo3boobboo4bobo$90bobbo146boobboo11boo4boo329boo5boo11b oo$97boo3boo136boobbobboo8boo334bo4bobbo$24bo4bo62boo4b5o142b4o5bobo 341bobo$22boob4oboo66booboo143bo7bo$24bo4bo68booboo513bo$99b3o513bobo$ 79boo524boo7boboo$80bo156bobo364bobo6booboo10boo$77b3o157boo355boo7bo 6b3oboboo10boo$77bo160bo355boo7bobbobbobbobbobo$82bo520bo6boo4bo$81bo 17boo503bobo$81b3o15boo138boo364boo$239boo375boo$69bo154bobo5bo382bo6b obo$69b3o150bo3bo6bo383bo4bobbo$72bo149bo10bo8bo364bo7b3o7boo$71boo 142boo4bo4bo14b4o361bobo8boo4bo3boo4boo$215boo5bo5bobo9boobobo353boo4b oboo7boobo5boo6boo$222bo3bobobo8b3obobbo352boo3booboo7booboobobbo$224b obobobo9booboboo358boboo6bobobobbobo$229bo11b4ob3o357bobo7b4o$242bo4bo bo357bo9boo$249bo$249boo378boo$74bo553bobo$73b3o537bobo11bo6boo$72b5o 7bobo526bobbo10bobbobbobboboo$71boo3boo7boo517boo10boo9bo6boobboo$72b 5o8bo518boo8bo3boo8bobo$72bo3bo532boo5boo11boo$73bobo532bo4bobbo8bo$ 72b3o538bobo10boo$71boo552boo$72bo558bo$69b3o558bobo$69bo550boo7boboo$ 619bobo6booboo10boo$609boo7bo6b3oboboo10boo$609boo7bobbobbobbobbobo$ 618bo6boo4bo$619bobo$99bobo518boo$91bo8boo$91bo8bo536bobo$90b3o544bobb o$622bo6bo10boo$621bobo5bo8bo3boo4boo$90b3o521boo4boboo6bo9boo6boo$91b o522boo3booboo9boobbobbo$91bo528boboo5b3obbobbobo$91bo529bobo7b4o$91bo 530bo9boo$90b3o9boo$103boo539boo$73boo27bo540bobo$74bo15b3o535bobo11bo 6boo$74bobo8bo5bo536bobbo10bobbobbobboboo$75boo8bobo3bo527boo10boo9bo 6boobboo$86bobo530boo8bo3boobboo4bobo$86bobbo5b3o526boo5boo11boo$73bo 12bobo8bo525bo4bobbo$72b3o10bobo8bo531bobo$71bobobo9bo$71bobobo570bo$ 72b3o570bobo$73bo561boo7boboo$634bobo6booboo10boo8boo$87boo535boo7bo6b 3oboboo10boo8boo$73bo14boo534boo7bobbobbobbobbobo$72b3o12bo545bo6boo4b o$71bobobo558bobo$71bobobo559boo26boo$72b3o6bo10bobboboobobbo542boo15b o$64bobo6bo7boo9b4oboob4o270boo269bo6bobo6bobo$62bo3bo13bobo9bobboboob obbo270bo272bo4bobbo5boo6bo$55boo5bo25bo275bo7bobo262bo7b3o7boo11b3o$ 55boo4bo4bo20b3o271b4o7boo262bobo8boo4bo3boo8b5o$62bo23bo3bo262boo5b4o 265boo4boboo7boobo5boo9bobobobo$62bo3bo18bob3obo261boo5bobbo265boo3boo boo7booboobobbo10boo3boo$50bo13bobo19b5o269b4o7bo263boboo6bobobobbobo$ 50b3o308b4o4boo265bobo7b4o$53bo310bo5boo265bo9boo20bo$52bo20b3o587boo 3bobo$52bobbo19bo587bo4boboo$56bo17bo586bobo5b3o$53bo3bo603boo6bobbo$ 55bo10boo602b3o$52bo5bo6bobo294bobo13b3o269boo7bo9bo3bo$52bo5bo8bo22b oo270boo14bo271bo17bo5bo$53bo3bo18boo6boo4bo272bo15bo261bo6bobo12bo5bo 3bo$54b3o17bo4bobbo4bo3b3o544b4o6boo12bo7b3o$74bo4bobbo4bo5bo535bo7b4o 21b3o$74bo4bobbo4bo540bobo6bobbo$76boo6boo318boo221bo3boo4b4o$356bo29b oo16boo210boo9bo3boo5b4o$354boo30bobo227boo9bo3boo8bo$60bo294boo29bo 241bobo$60boo567bo$52boo5bobo576bobo$53bo14boo3boo329bo234boo12boo$50b 3o349booboo232bo4bo7bobo15boo$50bo18bo3bo570boo6bo17boo$63bo6b3o274bob o43b3o5bo5bo235bobo5boo$36boo24boo6b3o274boo44bo$36boo24bobo283bo45bo 6booboboo$630boo$59bo13boo4bo549b3o3boobo$57b3o13bo5b3o537boo5boboo5bo 3bobbo$56bo17b3o5bo536boo5bobbo4bo4bobboo$56boo3bo14bo4boo318boo223bob oo4b4o5boo8boo$61b3o275boo6bo53bobo225b3o3bo7b3o7boo$36bo8bo18bo273bob o5boo16boo35bo228boo11boo$35b3o7boo16boo273bo7bobo15boo40boo234boo$34b 5o5bobo290boo67bo235bo$33bobobobo25b3o274bo64b3o$33boo3boo25b3o13boo3b oo254b3o64bo$47bo16bo3bo12boo3boo257bo$46boo3boo3boo5bo5bo8bo3b5o257b oo19bo$38boo6bobo15bo3bo8boo4bobo277booboo9boo15boo293bo$38boo12bo3bo 8b3o9bobo297boo16boo291bobo$40bo12b3o27b3o33bo242bo5bo25bo292bo3boo6b oo$38b3o12b3o63b3o554boo9bo3boboo4bobo$36bo33bo51bo234boo3booboboo307b oo9bo3bob3o4b3o$36b5o29boo49boo224bo340boboboobbo4b3o6boo$37boo13bo16b obo274b3o6bo21bo311bo4boo4b3o7boo$51b3o28bo262b5o11boo14bo9bo311bobo$ 50bo3bo26bobo260boo3boo10bobo12bobo8boo310boo$35boo3boo10bo27bo3bo277b o12booboo6bobo$36b5o8bo5bo25b3o278boo10bo5bo305bo8bo10bo$36booboo8bo5b o23boo3boo263boo10b3o13bo308bobo4b3o8b3o$36booboo9bo3bo296bo9boo11boo 3boo305boo4bo10bo$37b3o11b3o14bo279bo15bo327boo9boo$67b3o278bobbo$66b 5o50boo3boo219booboo27b3o328boo$65bobobobo51b3o222boo29boboo318bo8boo$ 65boo3boo50bo3bo236bo17boo318bo$123bobo236b3o15boo318bobo$38boo84bo 221boo3boo8b5o12bobo318booboo$38boo28bo277boo3boo7boo3boo9boobbo286boo 8boo19bo5bo15boo$67bobo277b5o9b5o301boo9bo4bo17bo18boo$51boo14bobo11b oo265bobo10bo3bo309b3o5boo13boo3boo$51boo15bo12boo40boo237bobo310bo6bo bo5bo30bo$68boo26boo25boo29bo193b3o12bo324b3o8bo20bobo$68boo26boo54b3o 532bo9b4o19bobo7boo$68boo81bo225b5o305boo7boo3bo19bo8boo$83boo66boo 209boo12bob3obo313b8obo3b5o$83boo277boo13bo3bo315boboobobbobbob3obo$ 378b3o286bo30bo3bobo4bo3bo4booboboo$349boo28bo286b3o5boo34b3o5bo5bo15b oo$83bo12b3o250boo314b5o4boo35bo7bo3bo7bo8boo$82bobo579boo3boo38boo9b 3o8bo$81bo3bo10bobo50bo532boo3boo19bobo19bobo$81b5o9b5o48b3o228boo297b oo3b5o20bobo18booboo$80boo3boo7boo3boo46b5o227boo288boo6boo4booboo21bo 18bo5bo15boo$81b5o8boo3boo45bobobobo518bo7bo3booboo9b5o17bo11bo18boo$ 82b3o61boo3boo515bo15b3o9bob3obo16bo8boo3boo$83bo584bobbo25bo3bo4boobo boo38bo$97boo568booboo26b3o5bo5bo37bobo$95booboo49bo518boo29bo7bo3bo7b o7b3o20bobo7boo$95bobbo49bobo557b3o8bo6boobo21bo8boo$82bo15bo49bobo 531b3o33bobo5boo11b5o$84boo9bo53bo516boo3boo9b3o32booboo5boo9bob3obo$ 83b3o10boo51boo515boo3boo8bo3bo13boo15bo5bo5bobo8bo3bo4booboboo$83boo 64boo516b5o8bo5bo12boo18bo8bobboo7b3o5bo5bo15boo$84bo64boo517bobo10bo 3bo30boo3boo18bo7bo3bo7bo8boo$83bobo10boo3boo579b3o54boo5bo3b3o8bo$84b oo5bo5b5o566b3o67bobo4boo13bobo$89boo7b3o608boo7bo19bobo4bobo11booboo$ 90boo7bo609boo7bo20bo18bo5bo15boo$78booboboo632bo9b5o29bo18boo$726bob 3obo25boo3boo$78bo5bo6bo635bo3bo4booboboo38bo$92boo575boo48boo7b3o5bo 5bo16bo20bobo$79booboo7boo576boo48boo8bo7bo3bo7bo7b4o19bobo7boo$81bo 19boo635b3o8bo6boo3bo19bo8boo$101bo580boo64bobo5b8obo3b5o$102b3o577boo 63booboo5boboobobbobbob3obo$104bo624boo15bo5bo5bo3bobo4bo3bo4booboboo$ 729boo18bo20b3o5bo5bo15boo$81boo663boo3boo18bo7bo3bo7bo8boo$81boo686b oo9b3o8bo$768bobo19bobo$739boo7bo19bobo18booboo$739boo7bo20bo18bo5bo 15boo$747bo9b5o17bo11bo18boo$756bob3obo16bo8boo3boo$106bo650bo3bo4boob oboo38bo$107boo3boo635boo7b3o5bo5bo37bobo$106boo3bobbo634boo8bo7bo3bo 7bo7b3o20bobo7boo$768b3o8bo6boobo21bo8boo$109bo668bobo5boo11b5o$111bo 665booboo5boo9bob3obo$110bo648boo15bo5bo5bobo8bo3bo4booboboo$759boo18b o8bobboo7b3o5bo5bo15boo$776boo3boo18bo7bo3bo7bo8boo$799boo5bo3b3o8bo$ 86boo710bobo4boo13bobo$86boo681boo7bo19bobo4bobo11booboo$769boo7bo20bo 18bo5bo15boo$109bo31boo634bo9b5o29bo18boo$107b3o31boo643bob3obo25boo3b oo$106bo6b3o671bo3bo4booboboo38bo$106boo5bobbobbo7boo650boo7b3o5bo5bo 16bo20bobo$113bo5b3o5bobo649boo8bo7bo3bo7bo7b4o19bobo7boo$113bo8bo4bo 670b3o8bo6boo3bo19bo8boo$85b3o6b3o17bobo4boo685bobo5b8obo3b5o$84bo3bo 7bo710booboo5boboobobbobbob3obo$83bo5bo5bo29bo663boo15bo5bo5bo3bobo4bo 3bo4booboboo$83booboboo35bo663boo18bo20b3o5bo5bo15boo$101booboboo26boo 3booboboo660boo3boo18bo7bo3bo7bo8boo$96b3o35boo693boo9b3o8bo$89bo6bo4b o5bo13boo3boo11bo5bo682bobo19bobo$88boo7bo24b5o672boo7bo19bobo18booboo $102booboo16b3o14booboo654boo7bo20bo18bo5bo15boo$87boboo13bo19bo17bo 664bo9b5o17bo11bo18boo$86bobboo37b3o685bob3obo16bo8boo3boo$86b4o40bo 686bo3bo4booboboo38bo$102bo26bo10bo668boo7b3o5bo5bo37bobo$101bobo35bob o667boo8bo7bo3bo7bo7b3o20bobo7boo$85boo3boo8bo3bo33bo3bo685b3o8bo6boob o21bo8boo$88bo11b5o33b5o695bobo5boo11b5o$85bo5bo7boo3boo31boo3boo693b ooboo5boo9bob3obo$86booboo9b5o33b5o676boo15bo5bo5bobo8bo3bo4booboboo$ 87bobo11b3o21b3o11b3o677boo18bo8bobboo7b3o5bo5bo15boo$88bo13bo37bo695b oo3boo18bo7bo3bo7bo8boo$88bo36bobo731boo5bo3b3o8bo$124b5o729bobo4boo 13bobo$123boo3boo699boo7bo19bobo4bobo11booboo$123boo3boo699boo7bo20bo 18bo5bo15boo$837bo9b5o29bo18boo$88boo756bob3obo25boo3boo$88boo23b3o 731bo3bo4booboboo38bo$113bobbo722boo7b3o5bo5bo16bo20bobo$101boo10bo25b oo698boo8bo7bo3bo7bo7b4o19bobo7boo$101boo10bo9boo14boo717b3o8bo6boo3bo 19bo8boo$114bobo7bo743bobo5b8obo3b5o$121b3o11bo731booboo5boboobobbobbo b3obo$121bo11b3o713boo15bo5bo5bo3bobo4bo3bo4booboboo$132bo716boo18bo 20b3o5bo5bo15boo$132boo732boo3boo18bo7bo3bo7bo8boo$889boo9b3o8bo$122b oo764bobo19bobo$122bobo734boo7bo19bobo18booboo$119boobobo734boo7bo20bo 18bo5bo15boo$119bobobo5b3o735bo9b5o17bo11bo18boo$121bo6bo3bo743bob3obo 16bo8boo3boo$113b3o4boo755bo3bo4booboboo38bo$112bo3bobb3o5bo5bo735boo 7b3o5bo5bo37bobo$116bobb3o5boo3boo735boo8bo7bo3bo7bo7b3o20bobo7boo$ 119b3o766b3o8bo6boobo21bo8boo$112bobo5boo776bobo5boo11b5o$121bo8bo766b ooboo5boo9bob3obo$106boo11bobobo5boboo746boo15bo5bo5bobo8bo3bo4boobob oo$106boo11boobobo4bo749boo18bo8bobboo7b3o5bo5bo15boo$122bobo4bo3bo 762boo3boo18bo7bo3bo7bo8boo$122boo6bobbo785boo5bo3b3o8bo$130b5o783bobo 4boo13bobo$130b5o754boo7bo19bobo4bobo11booboo$129boo3boo753boo7bo20bo 18bo5bo15boo$130b5o762bo9b5o29bo18boo$123bobo5b3o772bob3obo25boo3boo$ 105b3o5b3o7boo7bo774bo3bo4booboboo38bo$104bo3bo4bobbo7bo774boo7b3o5bo 5bo16bo20bobo$103bo5bo3bo785boo8bo7bo3bo7bo7b4o19bobo7boo$103booboboo 3bo804b3o8bo6boo3bo19bo8boo$114bobo811bobo5b8obo3b5o$927booboo5boboobo bbobbob3obo$109bo799boo15bo5bo5bo3bobo4bo3bo4booboboo$108boo799boo18bo 20b3o5bo5bo15boo$926boo3boo18bo7bo3bo7bo8boo$107boboo838boo9b3o8bo$ 106bobboo837bobo19bobo$106b4o10bo8bo789boo7bo19bobo18booboo$119boo7b3o 788boo7bo20bo18bo5bo15boo$119bobo5b5o795bo9b5o17bo11bo18boo$105boo3boo 14bobobobo803bob3obo16bo8boo3boo$108bo17boo3boo804bo3bo4booboboo38bo$ 105bo5bo817boo7b3o5bo5bo37bobo$106booboo818boo8bo7bo3bo7bo7b3o20bobo7b oo$107bobo16boo820b3o8bo6boobo21bo8boo$108bo17boo830bobo5boo11b5o$108b o16bo831booboo5boo9bob3obo$125b3o811boo15bo5bo5bobo8bo3bo4booboboo$ 129bo809boo18bo8bobboo7b3o5bo5bo15boo$125b5o826boo3boo18bo7bo3bo7bo8b oo$127boo850boo5bo3b3o8bo$108boo868bobo4boo13bobo$108boo839boo7bo19bob o4bobo11booboo$124boo3boo818boo7bo20bo18bo5bo15boo$125b5o827bo9b5o29bo 18boo$125booboo836bob3obo25boo3boo$125booboo837bo3bo4booboboo38bo$126b 3o830boo7b3o5bo5bo16bo20bobo$959boo8bo7bo3bo7bo7b4o19bobo7boo$978b3o8b o6boo3bo19bo8boo$988bobo5b8obo3b5o$987booboo5boboobobbobbob3obo$969boo 15bo5bo5bo3bobo4bo3bo4booboboo$126boo841boo18bo20b3o5bo5bo15boo$126boo 858boo3boo18bo7bo3bo7bo8boo$1009boo9b3o8bo$1008bobo19bobo$979boo7bo19b obo18booboo$979boo7bo20bo18bo5bo15boo$987bo9b5o17bo11bo18boo$996bob3ob o16bo8boo3boo$997bo3bo4booboboo38bo$989boo7b3o5bo5bo37bobo$989boo8bo7b o3bo7bo7b3o20bobo7boo$1008b3o8bo6boobo21bo8boo$1018bobo5boo11b5o$1017b ooboo5boo9bob3obo$999boo15bo5bo5bobo8bo3bo4booboboo$999boo18bo8bobboo 7b3o5bo5bo15boo$1016boo3boo18bo7bo3bo7bo8boo$1039boo5bo3b3o8bo$1038bob o4boo13bobo$1009boo7bo19bobo4bobo11booboo$1009boo7bo20bo18bo5bo15boo$ 1017bo9b5o29bo18boo$1026bob3obo25boo3boo$1027bo3bo4booboboo38bo$1019b oo7b3o5bo5bo16bo20bobo$1019boo8bo7bo3bo7bo7b4o19bobo7boo$1038b3o8bo6b oo3bo19bo8boo$1048bobo5b8obo3b5o$1047booboo5boboobobbobbob3obo$1029boo 15bo5bo5bo3bobo4bo3bo4booboboo$1029boo18bo20b3o5bo5bo15boo$1046boo3boo 18bo7bo3bo7bo8boo$1069boo9b3o8bo$1068bobo19bobo$1039boo7bo19bobo18boob oo$1039boo7bo20bo18bo5bo15boo$1047bo9b5o17bo11bo18boo$1056bob3obo16bo 8boo3boo$1057bo3bo4booboboo38bo$1049boo7b3o5bo5bo37bobo$1049boo8bo7bo 3bo7bo7b3o20bobo7boo$1068b3o8bo6boobo21bo8boo$1078bobo5boo11b5o$1077b ooboo5boo9bob3obo$1059boo15bo5bo5bobo8bo3bo4booboboo$1059boo18bo8bobb oo7b3o5bo5bo15boo$1076boo3boo18bo7bo3bo7bo8boo$1099boo5bo3b3o8bo$1098b obo4boo13bobo$1069boo7bo19bobo4bobo11booboo$1069boo7bo20bo18bo5bo15boo $1077bo9b5o29bo18boo$1086bob3obo25boo3boo$1087bo3bo4booboboo38bo$1079b oo7b3o5bo5bo16bo20bobo$1079boo8bo7bo3bo7bo7b4o19bobo7boo$1098b3o8bo6b oo3bo19bo8boo$1108bobo5b8obo3b5o$1107booboo5boboobobbobbob3obo$1089boo 15bo5bo5bo3bobo4bo3bo4booboboo$1089boo18bo20b3o5bo5bo15boo$1106boo3boo 18bo7bo3bo7bo8boo$1129boo9b3o8bo$1128bobo19bobo$1099boo7bo19bobo18boob oo$1099boo7bo20bo18bo5bo15boo$1107bo9b5o17bo11bo18boo$1116bob3obo16bo 8boo3boo$1117bo3bo4booboboo38bo$1109boo7b3o5bo5bo37bobo$1109boo8bo7bo 3bo7bo7b3o20bobo7boo$1128b3o8bo6boobo21bo8boo$1138bobo5boo11b5o$1137b ooboo5boo9bob3obo$1119boo15bo5bo5bobo8bo3bo4booboboo$1119boo18bo8bobb oo7b3o5bo5bo15boo$1136boo3boo18bo7bo3bo7bo8boo$1159boo5bo3b3o8bo$1158b obo4boo13bobo$1129boo7bo19bobo4bobo11booboo$1129boo7bo20bo18bo5bo15boo $1137bo9b5o29bo18boo$1146bob3obo25boo3boo$1147bo3bo4booboboo38bo$1139b oo7b3o5bo5bo16bo20bobo$1139boo8bo7bo3bo7bo7b4o19bobo7boo$1158b3o8bo6b oo3bo19bo8boo$1168bobo5b8obo3b5o$1167booboo5boboobobbobbob3obo$1149boo 15bo5bo5bo3bobo4bo3bo4booboboo$1149boo18bo20b3o5bo5bo15boo$1166boo3boo 18bo7bo3bo7bo8boo$1189boo9b3o8bo$1188bobo19bobo$1159boo7bo19bobo18boob oo$1159boo7bo20bo18bo5bo15boo$1167bo9b5o17bo11bo18boo$1176bob3obo16bo 8boo3boo$1177bo3bo4booboboo38bo$1169boo7b3o5bo5bo37bobo$677boo490boo8b o7bo3bo7bo7b3o20bobo7boo$678bo509b3o8bo6boobo21bo8boo$678bobo7bobo507b obo5boo11b5o$679boo7bo3bo504booboo5boo9bob3obo$692bo5boo479boo15bo5bo 5bobo8bo3bo4booboboo$688bo4bo4boo479boo18bo8bobboo7b3o5bo5bo15boo$682b o9bo503boo3boo18bo7bo3bo7bo8boo$683bo4bo3bo526boo5bo3b3o8bo$681b3o4bob o527bobo4boo13bobo$1189boo7bo19bobo4bobo11booboo$1189boo7bo20bo18bo5bo 15boo$1197bo9b5o29bo18boo$1206bob3obo25boo3boo$673bo533bo3bo4booboboo 38bo$673boo15bo508boo7b3o5bo5bo16bo20bobo$672bobo13bobo508boo8bo7bo3bo 7bo7b4o19bobo7boo$689boo527b3o8bo6boo3bo19bo8boo$1228bobo5b8obo3b5o$ 1227booboo5boboobobbobbob3obo$1209boo15bo5bo5bo3bobo4bo3bo4booboboo$ 1209boo18bo20b3o5bo5bo15boo$665boo30bo528boo3boo18bo7bo3bo7bo8boo$666b oo30bo550boo9b3o8bo$665bo30b3o549bobo19bobo$1219boo7bo19bobo18booboo$ 1219boo7bo20bo18bo5bo15boo$1227bo9b5o17bo11bo18boo$647bo9boo577bob3obo 16bo8boo3boo$646bobo7b4o577bo3bo4booboboo38bo$639boo4boboo5b3obbobbobo 40bo523boo7b3o5bo5bo37bobo$639boo3booboo9boobbobbo37bobo523boo8bo7bo3b o7bo7b3o20bobo7boo$645boboo6bo9boo6boo29boo542b3o8bo6boobo21bo8boo$ 646bobo5bo8bo3boo4boo583bobo5boo11b5o$647bo6bo10boo590booboo5boo9bob3o bo$662bobbo53bo519boo15bo5bo5bobo8bo3bo4booboboo$662bobo52b3o519boo18b o8bobboo7b3o5bo5bo15boo$716bo539boo3boo18bo7bo3bo7bo8boo$716boo561boo 5bo3b3o8bo$711bobo564bobo4boo13bobo$711boo536boo7bo19bobo4bobo11booboo $712bo536boo7bo20bo18bo5bo15boo$670bobo584bo9b5o29bo18boo$670bo3bo591b ob3obo25boo3boo$654bo19bo592bo3bo4booboboo38bo$652b4o14bo4bo4boo577boo 7b3o5bo5bo16bo20bobo$651boboboo4bo12bo5boo23bo5boo3boo541boo8bo7bo3bo 7bo7b4o19bobo7boo$646boobbobbob3o5boobo3bo3bo28boo7b5o561b3o8bo6boo3bo 19bo8boo$646boo3boboboo5b4obobbobo31boo6booboo571bobo5b8obo3b5o$652b4o 6boobboo44booboo570booboo5boboobobbobbob3obo$654bo58b3o553boo15bo5bo5b o3bobo4bo3bo4booboboo$1269boo18bo20b3o5bo5bo15boo$991boo293boo3boo18bo 7bo3bo7bo8boo$668bo323bo316boo9b3o8bo$668boo26bobo293bobo7bobo303bobo 19bobo$667bobobbobo21boo295boo7bo3bo272boo7bo19bobo18booboo$673boo22bo 16boo290bo272boo7bo20bo18bo5bo15boo$673bo40boo286bo4bo4boo273bo9b5o17b o11bo18boo$654boo350bo5boo282bob3obo16bo8boo3boo$653b3o3boobo339bo3bo 290bo3bo4booboboo38bo$643boo5boboo5bo3bobbo335bobo284boo7b3o5bo5bo37bo bo$643boo5bobbo4bo4bobboo22bo598boo8bo7bo3bo7bo7b3o20bobo7boo$650boboo 4b4o5boo19boo618b3o8bo6boobo21bo8boo$653b3o3bo7b3o19boo627bobo5boo11b 5o$654boo11boo648booboo5boo9bob3obo$666boo7boo622boo15bo5bo5bobo8bo3bo 4booboboo$666bo8bobo621boo18bo8bobboo7b3o5bo5bo15boo$677bo638boo3boo 18bo7bo3bo7bo8boo$677boo660boo5bo3b3o8bo$1338bobo4boo13bobo$681boo626b oo7bo19bobo4bobo11booboo$682bo626boo7bo20bo18bo5bo15boo$679b3o635bo9b 5o29bo18boo$679bo646bob3obo25boo3boo$1327bo3bo4booboboo38bo$1319boo7b 3o5bo5bo16bo20bobo$1319boo8bo7bo3bo7bo7b4o19bobo7boo$1338b3o8bo6boo3bo 19bo8boo$1348bobo5b8obo3b5o$1347booboo5boboobobbobbob3obo$1329boo15bo 5bo5bo3bobo4bo3bo4booboboo$1329boo18bo20b3o5bo5bo15boo$1346boo3boo18bo 7bo3bo7bo8boo$1369boo9b3o8bo$1368bobo19bobo$1339boo7bo19bobo18booboo$ 1339boo7bo20bo18bo5bo15boo$1347bo9b5o17bo11bo18boo$1356bob3obo16bo8boo 3boo$1357bo3bo4booboboo38bo$1349boo7b3o5bo5bo37bobo$1349boo8bo7bo3bo7b o7b3o20bobo7boo$1368b3o8bo6boobo21bo8boo$1378bobo5boo11b5o$1377booboo 5boo9bob3obo$1359boo15bo5bo5bobo8bo3bo4booboboo$1359boo18bo8bobboo7b3o 5bo5bo15boo$1376boo3boo18bo7bo3bo7bo8boo$1399boo5bo3b3o8bo$1398bobo4b oo13bobo$1369boo7bo19bobo4bobo11booboo$1369boo7bo20bo18bo5bo15boo$ 1377bo9b5o29bo18boo$1386bob3obo25boo3boo$1387bo3bo4booboboo38bo$1379b oo7b3o5bo5bo16bo20bobo$1379boo8bo7bo3bo7bo7b4o19bobo7boo$1398b3o8bo6b oo3bo19bo8boo$1408bobo5b8obo3b5o$1407booboo5boboobobbobbob3obo$1389boo 15bo5bo5bo3bobo4bo3bo4booboboo$1389boo18bo20b3o5bo5bo15boo$1406boo3boo 18bo7bo3bo7bo8boo$1429boo9b3o8bo$1428bobo19bobo$1399boo7bo19bobo18boob oo$1399boo7bo20bo18bo5bo15boo$1407bo9b5o17bo11bo18boo$1416bob3obo16bo 8boo3boo$1417bo3bo4booboboo38bo$1409boo7b3o5bo5bo37bobo$1409boo8bo7bo 3bo7bo7b3o20bobo7boo$1428b3o8bo6boobo21bo8boo$1438bobo5boo11b5o$1437b ooboo5boo9bob3obo$1419boo15bo5bo5bobo8bo3bo4booboboo$1419boo18bo8bobb oo7b3o5bo5bo15boo$1436boo3boo18bo7bo3bo7bo8boo$1459boo5bo3b3o8bo$1458b obo4boo13bobo$1429boo7bo19bobo4bobo11booboo$778boo649boo7bo20bo18bo5bo 15boo$778boo657bo9b5o29bo18boo$1446bob3obo25boo3boo$1447bo3bo4booboboo 38bo$1439boo7b3o5bo5bo16bo20bobo$1439boo8bo7bo3bo7bo7b4o19bobo7boo$ 777b3o678b3o8bo6boo3bo19bo8boo$777b3o688bobo5b8obo3b5o$776bo3bo686boob oo5boboobobbobbob3obo$1449boo15bo5bo5bo3bobo4bo3bo4booboboo$775boo3boo 667boo18bo20b3o5bo5bo15boo$1466boo3boo18bo7bo3bo7bo8boo$1489boo9b3o8bo $1488bobo19bobo$754bo704boo7bo19bobo18booboo$754b3o22b3o677boo7bo20bo 18bo5bo15boo$757bo18boo689bo9b5o17bo11bo18boo$756boo18boo698bob3obo16b o8boo3boo$757b3o15boo700bo3bo4booboboo38bo$758bobo15bobo690boo7b3o5bo 5bo37bobo$757bo3bo15boo690boo8bo7bo3bo7bo7b3o20bobo7boo$757b5o726b3o8b o6boobo21bo8boo$756boo3boo735bobo5boo11b5o$757b5o15boo3boo713booboo5b oo9bob3obo$758b3o4boo10boo3boo695boo15bo5bo5bobo8bo3bo4booboboo$759bo 5boo4bo118boo587boo18bo8bobboo7b3o5bo5bo15boo$769boo8b3o108bo605boo3b oo18bo7bo3bo7bo8boo$770boo7b3o97boo7bobo628boo5bo3b3o8bo$780bo98b3o6b oo628bobo4boo13bobo$865bo15boobo604boo7bo19bobo4bobo11booboo$863bobo4b 3o8bobbo604boo7bo20bo18bo5bo15boo$762boo92boo4bobo16boobo612bo9b5o29bo 18boo$764bo17boo72boo3bobbo7bobboobb3o624bob3obo25boo3boo$782bo79bobo 7bo3bobboo626bo3bo4booboboo38bo$758b3o22b3o77bobo6bobbo623boo7b3o5bo5b o16bo20bobo$757bo27bo79bo8boo623boo8bo7bo3bo7bo7b4o19bobo$758b3o757b3o 8bo6boo3bo19bo$1528bobo5b8obo3b5o$758booboboo762booboo5boboobobbobbob 3obo$883bo625boo15bo5bo5bo3bobo4bo3bo4booboboo$758bo5bo116bobo625boo 18bo20b3o5bo5bo$882boo642boo3boo18bo7bo3bo$759booboo785boo9b3o$761bo 786bobo$880boo637boo7bo19bobo$880boo637boo7bo20bo$895bo631bo9b5o17bo$ 887boo6bobo638bob3obo16bo$760boo116boo18boo637bo3bo4booboboo$760boo 114bo3bo17boo4boo623boo7b3o5bo5bo$875bo5bo16boo4boo623boo8bo7bo3bo7bo 8boo$874bobbo3bo7boobobbobo650b3o8bo7boo$881bo8bobobbo662bobo8bo$872bo 3bo3bo10bo665booboo$871boboo3boo659boo15bo5bo$871bo667boo18bo$870boo 684boo3boo$1551boo23bo$1551bo23boo$1552b3o3bo16bobo$1545bo8bo3bo$1139b o405b3o9bo30boo$1137b3o408bo39bobo$1136bo410bo30bo4boo6bo$1136boo409bo bbo8boo16bobobbobbobbobbo7boo$1551bo7boo4boo10boobob3o6bo7boo$1133bo 414bo3bo12boo10booboo6bobo$1133bo416bo26boobo7boo$1134bo412bo5bo23bobo $1547bo5bo24bo$1548bo3bo$823boo306boo3boo411b3o18boo22bobo$824bo306bo 5bo426bo6bo21bobbo4bo$824bobo6bobo728b3o4bobo5boo11boo5boo$825boo5bobb o3boo291bo3bo430bo4boo5bobo4boobboo3bo8boo$831boo5b3oboobboo285b3o430b oo14bo9boo10boo$829boo3bo3bo3bo3bobo703bo14b3o9bobbo10bobbo$831boo5bob o8bo7boo709bobo11bo11bobo$832bobbobboo6bobbo7boo708bo3bo7bobo$833bobo 4bo8bo702bo14b5o7boo28boo$840b3o3bobo701bobo13boo3boo36bo$846boo703boo 14b5o3boo14boo9bo4bobo$833boo5bobo290boo433b3o5bo13b4o7bobo3boo$833boo 6bo291boo434bo6bobo6bobobbobb3o5boobo$1577boo5bobbobboo9booboo5bo$ 1545boo3boo31boo9bo6boobo4b3o$1559bo21boo3bo8bo5bobo4bo$1546bo3bo9bo9b o12boo10bo6bo5boo$833boo712b3o8b3o6boo15bobbo$832bobo712b3o17b3o15bobo $834bo733boo$1568bo$820boo745bobo$819bobo745boo$818b3o4boo4bo706boo65b 3o$809boo6b3o4bobboobobo705bo5b3o57bo3bo$809boo7b3o4b3obo3bo696bo5bobo 15b3o11booboboo28bo5bo$819bobo4boobo3bo695boo5boo6bobo9bo46bo5bo$820b oo6boo3bo673bo5boo13boo13b5o7bo6boo4bo5bo31bo$830bobo8boo662bo3bo3b3o 11b3o12boo3boo12b3o40bo3bo$831bo9bobo665bo5boobo9boo3boo7boo3boo12boob o4booboo31b3o$843bo660bo5bo4bobbo10boo31b3o6bo34bo$843boo659boo9boobo 11bo32bo$1513b3o10bo20boo59boo$1513boo9bobo20boboo3boo52bo$1525boo23bo bbobo53b3o$1553boboboo11boo39bo$1545bob3o4bobobo11boo$1545bo10bo$1545b o8bobbo$634boo921bo$634bo918bo3bo$622boo8bobo391boo481bo8bobbo35bo$ 622bobo7boo392boo480bobo10bo32bobbo$613b3oboo4b3o875boo3boo3bo5boo3bo bbo18boo3boo5bo$613b4obbo4b3o874boo3boo3bo4boboboo3b4o17b3o5bobobo$ 617boo4b3o880boo3bo14b4o15bo3bo3boboboo$622bobo883bobo5boo8bobbo16bobo 4bobo$622boo885bo16b4o11bo5bo6boo$566bobo457bo498b4o4boo4bobo$564bo3bo 456b3o497bo7bobo4boo7boo$556bo7bo460b3o507bo13bo$555b4o4bo4bo8boo302bo 653boo13b3o$554boobobo4bo12boo300b3o141boo3boo522bo$543boo8b3obobbo3bo 3bo309bo144boo3boo$543boo9boobobo6bobo309boo$555b4o$556bo469bo$567bo 457bobo534boo$519bo20boo23bobo307b3o146boo535b3o$518b4o18bo25boo307b3o 141bobobboo535boobo$517boob4o5boo7bobo333bo3bo138bo3bobb3o535b3o$501b oo13b3oboo3bo3bobbo5boo470boo5bo6b3o536bo$501bobo13booboo3bo7bo339boo 3boo130boo4bo4bo3bobbo527bo71boo$489bo12b3o13b5o3bo6bo27boo454bo8boo 526bobo70b4o$486b4o3boo8b3o13bo3b3o7bo15boo9bobo454bo3bo533boo70booboo $485b4o3boo8b3o24bobbo16b3o10bo456bobo607boo$478boo5bobbo3booboboobbob o25boo20boobo11bo77bo$478boo5b4o4boboboobboo48bobbo10boo75bobo$486b4o 3boboo20bo33boobo9boo3boo70bobo$489bo25boo6boo9boo6boo5b3o11b3o69boo3b obbo$516boo4bobbobb3obbobbo4bobo5boo13boo69boo4bobo$522b3obb5obb3o4bo 23boo5boo68bobo9boo$503bo21b9o6boo24bo5bobo7bo61bo9bobo219boo$504boo 18bo9bo39bo5bobo73bo219boo$503boo19boo7boo39boo5boo73boo3$512bobbo$ 516bo11b4o26b4o1136b4o13bo$512bo3bo10bo3bo25bo3bo1135bo3bo14bo$513b4o 14bo29bo1139bo12b3o$527bobbo26bobbo1136bobbo$500bobo1204b5o$499bobbo3b oo1117bobbo77bo4bo$490boo6boo5b3oboobboo62boo1050bo81bo$490boo4boo3bo 3bo3bo3bobo61bo150boo895bo3bo5boo69bo3bo$498boo5bobo8bo7boo40bobo6bobo 150boo189boo705b4o3booboo70bo$499bobbobboo6bobbo7boo38bo3bo6boo342boo 712b4o$500bobo13bo39bo7bo1069boo$513bobo39b4o4bo4bo31boo122b3o$513boo 39boobobo4bo13b3o20bo101b3o20bo50bo$543boo8b3obobbo3bo3bo11bo20bobo8bo 91bo20bo48b4o136bo54bo57bobo560boo$543boo9boobobo6bobo10bo22boo7boo91b o68b4o16bo101bo18boo52boo56bobbo558booboo$555b4o38boo11boo11boo78b3o 60boo5bobbo8boo5bobo99b3o16bobo51boo11boo43boo6boo553b4o$556bo39boo11b 3o7bo3b3o140boo5b4o14bo3boo96booboo59boo7b3o7bo3b3o34boo4boo3bo3bobbo 553boo$567bo30bo11boo5b4o4boobo74b3o68b4o3boobobo4bo3boo3boo90b3ob3o 58boo8boo5b4o4boobo31boo6boo6boo$565bobo43boobbo4bo4bobbo5boo67b3o71bo bbo3boo5bo3boo3boo90b3ob3o69boobbo4bo4bobbo5boo33bobbo3boo$566boo44bo bbo3bo5boobo5boo80boo63bo10bobo97b3ob3o70bobbo3bo5boobo5boo34bobo3bo$ 616boboo3b3o77b3o11boo62bobbo8bo98b3ob3o74boboo3b3o49bobo$570boo51boo 79bo11bo26bo149booboo82boo50bobo$570boo114boo16bo37boo150b3o8b3o125bo$ 687bo15b3o16bobbo4bobbo8bobo132boo16bo11bo8b6o$556bobo51bo76bobo9bo20b 3obb6obb3o38bo3b3o97bo27bo8bo6bo12boo29bobo$555bobbo3boo124boo8bobo10b o10bobbo4bobbo39bo4bo99bobo5boo26bo8bo11bobo28boo62boo3boo$546boo6boo 5b3oboobboo37bo89boobo9boo5bo54b3o3bo99boo5boo27bo6bo12bo31bo4bo57bobo bobo$546boo4boo3bo3bo3bo3bobo36bo89booboo7bobo4bobo169boo25b6o49boo58b 5o$554boo5bobo8bo7boo79boo22b3o10boobo14bo3bo71boo95b3o8boo69bobo58b3o $555bobbobboo6bobbo7boo42bo35b3o35bobo16b3o67bo4boo60bo34boo8bobo80bo 50bo$556bobo13bo38boobboo6b4o21bo8boboo23bo3bo10bo15boo3boo59boob5o6b oo6boo48b4o29boo13bo6b3o70bobo$569bobo34bobobbob4o5boobobo3boo15bobo6b obbo23bo3bo91bo4boobbo5b3o5boo31boo14boobobo28boo19bo3bo58bo8boo3bo9b oo$569boo33bo3bo3boboo5b3obobbobboo16bobo5boboo118bo8boo5boo39bobbo11b 3obobbo17b3o91b4o5boo3bo9boo$597boo5bo12bo4boobobo8boo11bobbo7b3o5boo 15b3o13b3o75bo7bo4boo34b5o7bo11booboboo17bobo27bo5bo58b4o4boo3bo64boo$ 597boo4bo4bo14b4o9boo11bobo9boo5bobo32bo75bo12boo33bo5bo6bo12b4ob3o15b 3o27boo3boo58bobbo6bobo65boo$604bo19bo23bobo19bo31bo68boo7bo46bo3boo7b o7bo5bo4bobo14b3o12bo79b4o7bo$604bo3bo39bo21boo13b3o70bo11bobo8boo45bo 7bobbo9bo11bo14b3o12boo69boo6b4o59boo$606bobo148boo11bo65boo9b3o11boo 13b3o11bobo68bobo6bo62boo$660boo22bo3bo61bo6bobo9boo105bobo82bo$660boo 6boo14bo3bo31boo26b4o98boo24b3o64bobo4boo8boo$669bo27bo8boo6boo4bo26bo boboo96bobo7boo50boo29bobbo4bo$669bobo6bo6b3o9bobo5bobbo4bobbo4b3o22bo bbob3o97bo8bo50bo29boo7bobo96bo$670boo4bobo18bobbo3b6obb6o5bo22boobob oo107bobo7boo27bo4bo7b3o24boo3bo103b3o$674boo22bobo4bobbo4bobbo27b3ob 4o9boo93bo4boo6bobo14boo4boo3boob4oboo7bo26boo104b5o61bo$642boo9boo10b obo6boo23bo6boo6boo27bobo4bo10bobo90bobo11b3o16boobbo7bo4bo30boo5bobbo 6boo92bobobobo59b3o$642bobo9boo10boo6boo9boo56bo19bo69bo8boo11boo10b3o 4boobo8bo4b3o40bobo6bobo6bobo91boo3boo$633b3oboo4b3o7bo6bo5bo9bobo5bo 57boo19boo66bobo6bobbo24b3o4boo57bo19bo$633b4obbo4b3o12bobo16bo6bobbo 135boo4bobo7bo3bobboo20bobo61boo19boo69bo86b3o$637boo4b3o12bo3boo22boo 136boo3bobbo7bobboobb3o20boo153b3o21bo$642bobo13bo3boo23bo10booboboo 125bobo16boobo23boo11booboboo132bo19bobo61bobo$642boo14bo3boo167bobo4b 3o8bobbo22bobo11bo5bo131boo19boboo60bobo$659bobo3boo31bo5bo128bo15boob o24bo12bo3bo154b3o$660bo4bobo179b3o6boo33b3o155bobbo59b3o$667bo31boob oo143boo7bobo171bo19b3o$667boo32bo156bo171bo18bo3bo$682boo174boo169bob o16bo5bo57b3o$670boo9bobo344booboo10bo5bo3bo59bo$670bo12bo5boo170boo 164bo5bobboo4bo7b3o$660bo7bobo17bo3bo168bo9boo5bo151bo5boo4b3o75bo6bo$ 658bobo7boo17bo5bo7boo149boo5bobo10boo4b4o145boo3boo85boo6boo$648boo6b oo29bo3bobbo6boo148bobo5boo10bo7b4o9boo224b3o6b3o$647bo3bo4boo14bo14bo 149bo12b3o26bobbo9boo225boo6boo$646bo5bo3boo14boo4boo8bo3bo3bo135bo4b 4o8b3o27b4o146b4o87bo6bo$636boo8bo3boboo4bobo10bobo3bobo9boo3boobo134b o5b4o8b3o16boo7b4o4boo140boobbo$636boo8bo5bo7bo16bo19bo97bobboboobobbo 20boo9bobbo9bobo7boo5bobo7bo7bobo139booboboobo$647bo3bo24boo19boo95boo bbo4bobboo19boo9b4o10boo6bobo5bo19bo145bobbo15boo$648boo145bobboboobo bbo30b4o8bo12bo4boo19boo139boo3bobo16bo$659bo177bo12bo178bo24b3o59bo4b o$660boo129bo56b3o205bo57boob4oboo$659boo130bo324bo4bo$790b3o209boo25b ooboboo$663boo337boo25bo5bo$663boo189boo174bo3bo$790b3o61boo175b3o74bo $650bo140bo315bobo$647b4o3boboo133bo50bo263bo3bo$639boo5b4o4boboboobb oo127bo49boo263bo3bo$639boo5bobbo3booboboobbobo126bo38boo8boo4boo5bo 252bo3bo$646b4o3boo8b3o7boo115b3o37boo7b3o4boo3bobo148b3o101bo3bo$647b 4o3boo8b3o6boo165boo4boobbobo11boo135bo3bo100bo3bo$650bo12b3o175boo6bo bbo11boo157bo82bo3bo$662bobo125b3o49bo7bobo147bo5bo14b3o7boo74bobo$ 662boo127bo59bobo146boo3boo13bo10boo75bo$791bo61bo166boo$775bo242b3o$ 775bo224boo15bobo$774bobo222bobo4boo8bo3bo$775bo223bobbo4bo8b5o$775bo 223boo3b4o7boo3boo$775bo229bo10b5o$775bo224bobbo13b3o$774bobo226bo14bo $775bo$775bo237boo70bo$998booboboo8bobo69bobo$1013bo72bobo4boo$998bo5b o81bobbo3boo$1086bobo$999booboo70boo9bobo$1001bo71bobo9bo$1073bo$1072b oo$1015b3o$1014bo3bo$1001boo$1001boo10bo5bo$1013boo3boo3$1016bo$1015bo bo$1015bobo$1017bo$1017bo$1014bobbo$1015boo! golly-3.3-src/Patterns/Life/Signal-Circuitry/advancer.rle0000644000175000017500000000226012026730263020352 00000000000000#C p30 glider advancer #6, advances gliders by 60 generations. #C The device uses six copies of David Bell's p30 in-line NOT gate. #C Speed of information transmission within the device: 13/36 = 0.361c #C Dieter Leithner, 27 Dec 1993; from Jason Summers' jslife collection. x = 135, y = 144, rule = B3/S23 38bo$36bobo$37boo14$22bo$20bobo$21boo12$68bo$66bobo$67boo4$bbo$obo$boo 8$52bo$50bobo$51boo18$32bo$30bobo$31boo11$88bo$86bobo$77bo7bobo$76boo 6bobbo11boo$65boo8boo4boobbobo11boo$65boo7b3o4boo3bobo$75boo4boo5bo$ 76boo$77bo10bo$89bo$86boo5boo$86b3o4b3o$79bo7bo7boobo$77bobo15bobbo5b oo$70boo4bobo9b3o4boobo5boo$70boo3bobbo8boobobb3o$76bobo7bo3bobboo$77b obo6bobbo$79bo8boo19boo$109bo6bo$101bo5bobo4b3o$100boo5boo4bo$84boo13b oo12boo$84b3o11b3o$75boo9boobo9boo3boo14boo$75bo5bo4bobbo10boo18boo$ 80bo5boobo11bo$76bo3bo3b3o10bo$78bo5boo9bobo13bo$96boo12b3o8bo8boo$ 109b5o6bobo7bobbo$108boo3boo4bo3bo$120b3o11bo$118boo3boo$104bo27boo$ 105bo4b3o18bo$103b3o4b3o$$109bo9bo8boo3boo$108bobo8bo8boo3boo$107bo3bo 7bob3o5b5o$108b3o19bobo$106boo3boo11bo$121boboo5b3o$121boo3$116boo3boo 8bo$116boo3boo7bobo$117b5o$118bobo$$118b3o8bo$109boo17b3o$109boo16b5o$ 126boo3boo3$119boo$119boo7b3o$128b3o3$129boo$129boo! golly-3.3-src/Patterns/Life/Signal-Circuitry/heisenburp-46.rle0000644000175000017500000000422512026730263021165 00000000000000#C Period 46 pure Heisenburp device #C Detects and duplicates a stream of gliders without influencing it, #C even temporarily. The reaction used works for any period >= 35. #C Jason Summers, 29 Jun 1999; from "jslife" collection. x = 213, y = 209, rule = B3/S23 187boo$186booboo$187bobbo$160boo25bobbo4bo$150boo7bobo26boo5b3o$150boo 6boobo36bo$159boo27boo5b3o$160bo26bobbo4bo$187bobbo$160bo25booboo$159b oo18bo7boo$150boo6boobo15bobo$150boo7bobo16boo$160boo8$190bo$191bo$ 189b3o5$186bo$186boo$185bobo10$174boo$175boo$174bo$183boo$184bo$184bob o$185boo12boo$197boobbo$197b6o$197b4o4bo3bo$205b7o$163bo48bo$163boo40b 7o$162bobo32b4o4bo3bo$169b3o3bo21b6o$167b5obbobo20boobbo$171boo3bo22b oo$165boboo3bobbo$163b3oboo3b3o$162bo$163b3oboo3b3o$165boboo3bobbo13b oo$171boo3bo13bo$151boo14b5obbobo$152boo15b3o3bo10b3oboo$151bo34boobb oo$188b4o$184bobboboo$184bo3b3o$188boo$186bobo$186b3o3bo$193bo3bo$188b oo8bo12boo$140bo47bo5boobbo12boo$140boo46bobo5boo$139bobo38bo8boo3b3o$ 179bobo$179boo8boo3b3o$188bobo5boo$188bo5boobbo12boo$165b4o19boo8bo12b oo$141boo21b6o23bo3bo$140boob4o16boob4o22bo$141b6o17boo$142b4o$$131bo 47bo$130b3o45boboobo14bo$129boobo45bo4bo13boo$129b3o47bobo14b3obo9boo$ 129b3o51boo10boo13boo$130boo5b3o43boo11boo$137bo46bo12bo$138bo$197bo$ 196boo$195boo13boo$161boo14b3o16b3obo9boo$161boo12bo3bo17boo$115bo58bo 4bo18bo$114bobo57bo3bo$114bobo$113booboo31boo23bo3bo$149bobo22bo4bo$ 149bo11boo12bo3bo$161boo14b3o$187boo$187bobo$189bo$131bo5boo5boo43boo$ 130b3o4boo5boo$130boboo$113booboo13b3o$93bo18bo5bo12b3o$93boo36boo27b 3o$92bobo16bo7bo40bo$111bobbobobbo41bo$111b3o3b3o$137b3o3b3o$136bobbo 3bobbo$136boobo3boboo4$188boo9boo$172boo15boo8boo$172bobo10b5o$152boo 8b3o7bo12b4o$109bo5bo36boo8bo3bo$108b3o3b3o45bo4bo17b4o$107boobo3boboo 45bo3bo17b5o$123bo65boo8boo$124bo6bo31bo3bo20boo9boo$110bo3bo7b3o5b3o 29bo4bo$110bo3bo14boobo19boo8bo3bo$129b3o20boo8b3o$70bo58b3o7bo$70boo 58boo5boo$69bobo66boo8$119b3o7boo8b3o5b3o$118bo4bo4bobbo7bobbooboobbo$ 58boo57bo5bo4bobbo8b3o3b3o$59boo57bo8bo3bo9bo5bo$58bo60boo$127boboo$ 119boo6bobo$118bo8boo$105boo10bo5bo$105boo11bo4bo$119b3o8boobo6boo5boo $130boob3o4boo5boo$136bo$130boob3o$128bobbobo$128boo21$24bo$24boo$23bo bo10$12boo$13boo$12bo9$bo$boo$obo! golly-3.3-src/Patterns/Life/Signal-Circuitry/loafer-mwss-signal-loop.rle.gz0000755000175000017500000001267213543255652023713 00000000000000‹ ”[ËräÊqÝ×WÀºXX¡y Þ€" Ù {#i!‡÷Ù3lI0Øœ;}½+ÏÉ, 9÷JᘘîFU¢ù8ù¨âO¶›O§—÷ß.—÷—óç§›‡÷ÛöüáåáôáóßÝOþc{¸{=>½,K}7øáÏ7߇0ùÙýôïÃÝŸ†Ïç»6Âëöžc ÿýþv{úùôòÚ~oOÃk£y9¾.pøz9]†¿=ݼ|¹¼“!†áòýåüô¹µÞ<Ý ?ß¼œ·¯—á?O/—ÛûÓÃûõærº.Ïç×6àexÝÚ O·÷/ÛÓùï'Žà']ºo¾œÚXÃüžºÇáåt{~>½¾_ï‡×oÛðå|ûe½¹ýrùp½—Ã7¯ç¶¬ùføÍÝöu}8Ý)£Ú\Û×óëo~ÏUœnnïí:_%ÖÓ§íå4œ_‡ÓwÐ&R2n«íž#<žnïožÎ—ÇwàÅÍð|jܸӡÀÍã$Ï7m#7Û·¶:Žðéåtnï·óíiØ>a—wçOm÷mîáõüئº ÿúØÆœûaþt÷?_/¯­óÒÈ9Äï>¾Ÿÿ2Ü6®§6óÓI¦½yúÎéÖïÃãös¦­ÎÏÓû»Óg™òåôéátûº½pŒFÕ†8=<46œo>omµßÁåû××çßüøíÛ·MK¾Ý|8:µŸ—¾>^>þ|>}{ݞϷžïŸÿøü‡¼ÔzÆ—ûßáÃ2ÇwÃ÷ö£¤¦/_Ní÷¿Åký9®ÛØ>bû,ë‚<æ5lajmÞ·ÇÚÚ}Š(qižmÛæö䤽½ÞڃСQ^ý$­aŒ“tÖöÑn˜f IÚ<ëæbéTÖÜæ“çÂEÅ }øé=¹enk™eÞ²´Oç³,ºd¦q‘.²ùlDò¢|nò°HY/¾¤Í{!sòÕfý‚NùL2Tʺÿ7¿KcGÜ·Tåctø=b%E†X÷‡M¾ªí{õðqxr¿D2zÙDÀ¬[œI`ÏAsÕä~CÉâbBý0ÊÞìþåd‘Ev-ß»ˆ2@Ô‰“;4 YüU2.“Y2—ðÚ–ƒw\Íú©ò/Q[øŸËk^Ùáú;o(Æ%èV¦þÆjë–õ„µJ#%æVe,¶þÉãÒºe\™{+Öâm¶C˜ÂZеSÛþ_ƒô©ÅòaU’ðí9à¿æ6JÔ.%’dåõ?zustbw;¬Wõ &W„õ =b²Ðƒ&E‡O1ú±”#¹¶Oµeµì\å!«UöïÖ:®¤¢TösÝ­X[Œ7»ŠÚ†ýh:åJ©W ¥]ƒ}ceÀÊö%d¹Ë¦5PPÀM¼à£ ; ´ |½a´ì,ç ¾Ø˜"\Hœbçx‚f:Ò6óUtD¯¶Å:¶W¶]¸¢eQ§ .I}Kkbcƒ†J äV®±Á-^mË!·¹$¯þdëÍkôÁ„÷ØÕLAPV™Ü—gÙ{äÚ„Tç £ŒeŠª¸í'Üv +A׆ǮnBB~Ë[XŸ£sÊ:D" áÄ[Š~ék˜H%>Ð%ÉÙ Eæ‹Ck ˆ\½IjÆÓZ3×9C7¤A&t ˤ—-eâÛÏæmDS¥ÁÊ©RSéBÊ_¤¬ó\©éª‚¢±òÛ±hVšuz8í4Û¨AÐN8‘¹Ï£ZÒœÆ\¡àØô™.?·ÕbM‘’±Qè7!Á”3ƒ‹¹&‹ VH[8aÉ(P%m#‡j°¤ °óו>&Xy:k!SYÀÊÀ J €eµH½í ›÷¡ëî­ ´iö:´§¤2¨<‚“sãÒ˜ êå­Å8Žö•ѪL¸£Kλ¤VƒkDÒ=©š™F*”åJàƒŽðJ> JåÈdM¾Ö®‘"7’èòÂH8gOªÝWË ¾{ ¯‚ÙÑžÁ8¼¨ÈOËÃHhrÊÅ<8ãKUåµ9$ñI§…ût7YŒÝ¥ ÖYõuÑiÁ*—¨%Q½¡5p»ö­µm"1ìöp69x¸“¾ØqÜï½1PÑC£pwègòå›’:2×çº#I’‰gŠ6ø]O°c†gÅìÆuâ'*~°Ä¦ÑŸžŠ¥vɘƒE "väá!6¡’ÜOhÔ4¡š“À7ö0Q$ibŒƒÍJ³"»ÐFc5ãæ´ÂScPa´0rt šfù0u6Ç^sßHø°ø¥*—‘ !ö›„¦qwwÍ·%æ4оm™w– 8Â]cYÖ0å<Cƒ´oÓØªÂ”Ùà¢ÄjÂtGɅ®Ie-›z£ú³Œ,|ç€óÿ4¢Ì—à2¨ÈÑ _ Mè® æ5/ ÄmØ –LxEæ?§' }„@Ü]Ù•ñO‚Ñ;s~™|hÍ3]Ÿ 4·åTdÛ‘ÞcÁBªï3'ÆC²/Õ©~K³É1¨Gi†-Æ|Ž–àK6á5$Ì!ðS3IX—n]Õ. I2,V{¥˜Bjª«( ‹¡L³­„òˆ<Â,ørqÅ¢-Uœ¥Oyµ( " ì/ç`êá@•³N‡ÎhX„À]ár& ìmæ èhêéŒÒ¬ŽÝpü"àÈ(ºáÓ„0~koÀ¬»Áî6%Rð…xëƒæjœYmª€Y:ùDyq¸D*ð›Â!+ 1•$¶`…$‚8R¯ ˆ4H1ÏÈí¦ÉX€ô:Cx¦IÓh …ÐùCݧôEÔˆZ3Æ” ]U f¢JyGß—g(tåî´…1K$ä™ûJ+UØÁ¾Õ[å.PD~éÎT˜ îG}ÙÑ}ðxÀF8à‚_hHÌ‹á²Ü¯|©<ûÛ㺔ŽÈ½ ÀK=¾Љº LÒï$Ít«œàd@îÅÛ¦rç‹hðT@ÊYÕ¹«F“‘ô‚DH+P/Ž=üòA³\Cv€J¦ú2˜p°a3:a”—´þ¨¢eø>[‘°-/:{sMÄ=ã3Âú™¾„yµ•ž5…Ÿ Éœ ‰Ì1^•8ˆÚTW",óÖY$‹CAÍ#Œ!hÚÔØÙ Ÿ•®Œa)]íy¦ò’h:w”#A´€á âlhGÊR4h>Ä™z‚µÆT "µvYÂzǸ¼ÑïY«Þ«·+™¸èq[PEîä² |-¾_TYOß'¯†TÉl]`œC9®ÛÅÉà‰«t_mžÑìaÑÌPý’'7s´z'ùœ,2l+Jë1HѪ¸ð)zà‚yÇöBì_Aö¬%˜õpRBÒîùÛ€Ž;úPräàås¢ncÅà(X,¦M$-€»l$©P"»&âõíÌ/{e¢k"έ©„ s_lƺð$ESPòi¦ê ô\)@S`ëÂÛ —[Võè!X…@ |#k‘ ä-™y³r1SV ó! ‚ϼnâûÌÔžþ²Ú®I*Á’wMÔ$ù‚éäÂô³ƒÂ¸Ä¤Vü†ñ…ÍÂÊreüØûî”yìä™h»“ó«Ã¸Ðµ©?¹9+šHòóÄb‹Û³„iÕЯM_¨ZxO¨jmI÷F‡!DÜ=fójHª¶b2®Z†È| ÙMº^cŸMåz.ÀÃŽÜ=~wÅä©Ãñ²TdõÐ =d½Y+szð¬$Z_àžÔÄW=N5šÙÌÖ"ÏÂÎtÄÐŽ³r8;Ö{Â8Õà Y¨ÁüjEšXr´KðÌž¦«å7B,ÙL²Ø%¾Z‚‰Í"ðb…AéN–†ô«j¶W½^Û«©‡ç6¯pA¶•Gð¸[ª±Ìƒùy´Î$tȸåqÙMnSw“J0tÆÝذ2µJÀ÷¹®ª^¨4R7&b!¶o&Ȭ¯Io´ ɈajìI…‰Ý^™÷é9åªY”÷e$VÒûÕÅ™3_7O][¶HK`€6ÁÁWœ¦x¸HòaÖý³žœX#ª&>® ¯gÅiŒ(x95ÜMoœ§Ôís´Â;Ô¤AÊÒ±Š·KY’îˆ)’½ÅàR’Ìhç]«¹?9݉vÛ”W] Ø•q‰·b㶘Ik^³ô«íyÚÌ3: ,ÐWµÜhé$—J1GU’¼j’ë{1ÞqñŒ|¨}P+•§×¿A iñ¾RPÐÿp 0¸† "êU^]Mz'-\å²Eí4dM`õr ³½³Ók%­Å˜LšÑä>|Të¤Q3ÄFPõÛT§b˜Ã‹ý•@±ö@9h­ŠG=Ü}ÕàTóþØÉWÝ”.øÇh×çÈlä»Â`ÏijטWr\„9Õ[aP¯3âNl¿à]Cìh&2jÄz®À.Ãè1éj'B¤âÁ‘'d €jRÁp‘pˆVÎ çÕOÞJÕrºÅt_aÔ¬@ÐL•Ý<žÂâŠøqD¢š«0ÂY™´ÕÉ÷Êù6éRºIú  öÕ‹Èž Ϻ¥ãj{ꢪŠJJ´ëQPKAª¬·YXz*‡ƒ RÉAërˆîX4 ® ` ¯ÛÈ”±;X%O¬P W?íX®"ׯde‰"Ñ/á[À\PNš°êÌS/wÁù‘{U/Ú1°Ç ¦^Ä+ñvg6¶Z/]‡‚É<X­|3ñ~׈TH ¹dPÛ®€~cG©u¿&M¨&î*j·¤Ûw[LI-ò"­”d±lÔãï‹FfÈ4!jÀ0ÂÝê½úBWÁ>áì¦7e1LÒdcÙcŒ~Í˹ËÈr%½‘‡õ,U%Ö­û 4ýÍœ-09ŽÄ;)x®A¯†À©C·Q"-­VÔÒí]‡ÉŒS#]I¿\»Í3•~'Y+«¼õÊ ˆþñ.Ì«nV-Åòz¤c“?3Ûx:„°cQ´5áy›×c¢íRC­§z;¼¬zÄërÜsA*¬7…›‰#^Y:æzCâQot7Qu(ÇÁ:Dï猼TEÃÛ‚²[Ö/"Ó1 #1 [ ˆ¬ ·É*髯h£‰àp«¥ÔndÒõ¢èü¹ŒÙ 5ä ?KÿpÌø‰±Â›ŸqL„ˆ^ýǯqÿÿÿòpŸKG;golly-3.3-src/Patterns/Life/Signal-Circuitry/reflectors2.rle0000644000175000017500000003032712026730263021026 00000000000000#C A selection of 90-degree glider reflectors. #C Note that this is not a complete collection of #C known glider reflectors, and that in many cases #C there are better ways to reflect gliders than this. #C #C The loop on the far right is a demonstration #C of how a herschel loop can reflect gliders. This #C is the only known way to reflect p57, 58, 59, and #C p61 glider streams. It is demonstrated at p60 #C because the other reflectors would be very large. #C #C p33: both by David Bell, May 01 #C p45: by Mark Niemiec, 6 Jan 96 #C p88: by David Bell, 27 Dec 99 #C From Jason Summers' "jslife" pattern collection. x = 583, y = 289, rule = B3/S23 473b8o$473bob4obo$190b3o125bo154b8o$43boo145b3o125b3o$44bo105boo3boo4b oobo25b3o128bo$39bobbo55boo50boo3boo4boboo28b3o124boo115boobo6boobo51b o$bboobo6boboo23b8o52bo59boo4boo26b3o81boobo6boobo43bo102boboo6boboo 49b3o17boo$bboboo6boobo21boo8bo46bobbo52boo3boobbo5bo27b3o81boboo6bob oo41b3o100boo8boo4boo28bobo15bo20bo$6boobboo25bobboboo3bo46b8o48bobobo bo3bo5bo108boo4boobboo4boo38bo103bo9bo5bo24b3o7boo11boo20bo$6bo4bo26b 3ob4oboo43boo8bo49bobo4boo4boo108bo5bo3bo5bo39boo4boo97bo9bo5bo23bobb oo4bobo32boo$7bobbo35bobbo42bobboboo3bo48boobo4bo5bo21b3o86bo5bo3bo5bo 44bo97boo8boo4boo23boob4o46boo$6boobboo26b4o6boo43b3ob4oboo51boo3bo5bo 18bob3o85boo4boobboo4boo34boo6bobo99boobo4bo5bo26b3o47bobo$bboobo6bob oo21bo4bo58bobbo51bobboo4boo17bobobo88boobo6boobo36boo6boo100boboo5bo 5bo14boo60bo$bboboo6boobo21boo3boo49b4o6boo50bo3bo5bo18bobbo4b3o82bob oo6boboo144boo4boobboo4boo14bobo70b3o$oo14boo28bo45bo4bo57boo3bo5bo18b oo88boo4boobboo4boo37bo104bo5bo3bo5bo16bo28bobbo39b3o$o16bo24b4obo44b oo3boo57bobboo4boo14boo7bo5bo78bo5bo3bo5bo36boobo104bo5bo3bo5bo43boobb oboo17bobo17bo$bo14bo25boobobo53bo53bo5boobo16boo7bo5bo79bo5bo3bo5bo 34bo107boo4boobboo4boo42bo4boboo15boobbo17bo$oo14boo20bo5booboboo46b4o bo52boo4boboo16boo7bo5bo78boo4boobboo4boo34boboo106boobo6boobo51boo17b o19bo$bboobo6boboo21bobobboobobobo47boobobo78bo95boobo6boobo25boo10bo 108boboo6boboo44boo4bo38bobo$bboboo6boobo20bobb4o4bobbo42bo5booboboo 74bobo9b3o82boboo6boboo24bobo179booboo$36b3obb3obbobob3o39bobobboobobo bo75boboo131bo$39bo3boobboo4bo37bobb4o4bobbo206boobo4boo7boo132boboo4b 3o66bobo$38bobbo4bobboboo38b3obb3obbobob3o204boobobo3bo7boo132boobo3bo bboo23boo3bo37bo$38boobo4boboobo42bo3boobboo4bo72boo8b3o121bob4o149boo 3bo22bo3bobo36bo$42b4o5bo41bobbo4bobboboo73boo7bo3bo120bo155b3obbo8boo 12bo3bobo35bo$36b4oboobboob3o42boobo4boboobo83bo3bo121b3o154boobbo6bob o13bo4bo34b3o$36bobboboboobobo48b4o5bo83bo3bo124bo7boo9boo134bobbo6bo 12b3o5boo8bo24b3o$91b4oboobboob3o85b3o118boo4boo7boo9bobo132bobbo6boo 12bo17b3o$41bo4bo44bobboboboobobo209bo24bo134bobbo41bo5bo7boo$185b3o 125bobo157b3o41boo4bo7boboo$43boo51bo4bo82bo3bo13b3o109boo10bo195bobo 6bobbo$184bo3bo13bo122boboo203b3o$42bo55boo84bo3bo7boo5bo121bo194boo3b obo4boo$41bobo141b3o8boo128boobo191boob4o$40bobbo53bo230bo193b3obbo$ 41boo53bobo425boo$95bobbo96boobo126boo6boo148bo41bo$96boo86b3o9bobo 126boo6bobo145b3o$197bo137bo144bo$42boo138bo5bo7boo131boo4boo137boo3bo bo$41bobbo137bo5bo7boo14b3o114bo132boo9bobo4bo34boo$41bobo9bo43boo83bo 5bo7boo14bo117b3o130bo11bo40bobboo$42bo9boo42bobbo92boo19bo118bo130bob o16bo33bobobo13boo$52bobo41bobo8boo75b3o4bobbo123boo144boo13bobobo33bo 16bobo$40boo55bo8boo82bobobo124bo147boo10boobbo52bo$108bo80b3obo122b3o 148boo14boo34bo16boo$38bo4bo51boo92b3o124bo152b3o46bobo$466boobbo48bo$ 33bobboboboobobo12b3o32bo4bo261boo104boob3o44b3o$33b4oboobboob3o10bo 54boo68b3o174bobo104boo47bo$39b4o5bo10bo28bobboboboobobo12bobo67b3o36b 3o135bo107bobboo$35boobo4boboobo39b4oboobboob3o10bo69b3o36bo246b3o71bo $35bobbo4bobboboo44b4o5bo82b3o34bo246bo70b3o$36bo3boobboo4bo39boobo4bo boobo82b3o351bo$33b3obb3obbobob3o15boo23bobbo4bobboboo81b3o335boo3bo 10boo$33bobb4o4bobbo16boo25bo3boobboo4bo14bo344boo57b3ob3o$34bobobboob obobo19bo21b3obb3obbobob3o14boo344boo14boo43boo3bo$35bo5booboboo40bobb 4o4bobbo16bobo359bo45boobboo$39boobobo44bobobboobobobo380b3o45boo$39b 4obo45bo5booboboo381bo44boo$43bo50boobobo428boo$34boo3boo53b4obo357bo 69boo$34bo4bo58bo358b3o69bo$35b4o6boo42boo3boo221bo15bo126bo6bo59bo$ 43bobbo42bo4bo222b3o11b3o125bobo6bo57boo$35b3ob4oboo44b4o6boo218bo9bo 129bo4bob3o7boo46bobbo13boo$34bobboboo3bo53bobbo217boo9boo132boobboo7b o47b3o10boobbo$34boo8bo45b3ob4oboo175boo5boobo6boobo161bo5boobboo5bobo 45b3o12bobobo$36b8o45bobboboo3bo177bo5boboo6boboo160bobobo13boo45bobo 16bo$36bobbo49boo8bo176bo4boo4boobboo4boo158bobboo6boo52bo15bo$41bo49b 8o51boo3boo4boboo111boo3bo5bo3bo5bo158boo6bo4bo51boo15boo$40boo49bobbo 55boo3boo4boobo117bo5bo3bo5bo23boo3boo135bo4bo70bo$96bo62boo115boo3boo 4boobboo4boo21bo3bobo3bo135bobo70bo$95boo53boo3boo3bo23bobboboobobbo 81bo3bo5bo3bo5bo26bobo213b3o$150bobobobobbo23boobbo4bobboo79bo5bo5bo3b o5bo20bo4bobo4bo210bo$152bobo4boo23bobboboobobbo80boo3boo4boobboo4boo 21booboobooboo$151boobo6boboo116bo5bo3bo5bo25booboo187bo17bo$155boo4b oobo34bo4boo70boo4bo5bo3bo5bo216b3o14b3o$156bo8boo32bo3boo72bo3boo4boo bboo4boo219bo12boobo$155bo10bo31b3o4bo70bo6boobo6boobo220boo12bo$155b oo8bo110boo5boboo6boboo177boo45boboboobb3o$156bo8boo153boobo3boboo127b oo14boo43boobboobbobo$155bo5boboo33b3o120b3o3b3o129bo59boo3bob4o$155b oo4boobo34bo122bo5bo127b3o60boo3bobb3o$199bo256bo66b3o$199bo323boo$ 199bo283bo40bo$198b3o135b3o142b3o41bo$215boo119bo137b3o3bo$215bobo119b o133b3obo3bobo$198b3o14bo246boo8booboo3bo34boo$199bo263bo8booboo39bobb oo$199bo263bobo8bo7bo33bobobo13boo$464boo13bobobo33bo7bo8bobo$479boobb o39booboo8bo$321b3o3b3o153boo34bo3booboo8boo$321bobbobobbo188bobo3bob 3o$320bo9bo188bo3b3o$474bo41b3o$227bo91bo11bo143bo40bo$226boo91bo4bobo 4bo143boo$226bobo95bobo147b3o$320bo3bobo3bo139b3obbo3boo$320boobbobobb oo139b4obo3boo$bboobo6boobo23boo279b5ob5o139bobobboobboo43boo$bboboo6b oboo23boo280bobbobobbo138b3obboobobo45boo$6boobboo4boo58boo244boo3boo 139bo12boo$6bo3bo5bo59boo387boboo12bo$7bo3bo5bo447b3o14b3o$6boobboo4b oo448bo17bo$bboobo4bo5bo$bboboo5bo5bo301boo9boo125bo$6boobboo4boo302bo 9bo30b3o93b3o$6bo3bo5bo300b3o11b3o27bo98bo70bobo$7bo3bo5bo20b3o276bo 15bo28bo96bo70bo4bo14b3o$6boobboo4boo19bo3bo418boo15boo51bo4bo6boo6bo$ bboobo6boobo20bo5bo33bo384bo15bo52boo6boobbo8bo$bboboo6boboo20bo5bo32b 3o380bo16bobo45boo13bobobo$39bo34b5o378bobobo12b3o45bobo5boobboo5bo$ 37bo3bo31boo3boo377bobboo10b3o47bo7boobboo$38b3o33b5o73boo3boo4boobo 289boo13bobbo46boo7b3obo4bo$39bo34bo3bo73boo3boo4boboo305boo57bo6bobo$ 75bobo83boo68boo5boo232bo59bo6bo$36boo38bo75boo3boobbo69boo5boo230bo 69b3o$37bo4b3o107bobobobo3bo23boo5boo276boo69bo$34b3o5bo33b3o75bobo4b oo23boo5boo275boo$34bo8bo32bo76boobo6boobo302boo44bo$77bo79boo4boboo 301boo45b3o$158bobboo4boo298boobboo45bo$157bo3bo5bo64bo5bo229bo3boo43b oo14boo30b3o$157boo3bo5bo62b3o3b3o229b3ob3o57boo30bo$50boo106bobboo4b oo61boobbobobboo217boo10bo3boo90bo$50bobo31boo71bo5boobo63bo3bobo3bo 218bo$50bo33bobo70boo4boboo63boboo3boobo215b3o70bo$84bo145boo7boo215bo 71b3o$527boobbo$483bo47boo$481b3o44b3oboo$480bo48bobboo$57b3o419bobo 46b3o$57bo33b3o91boo7boo127boo3boo132boo16bo34boo14boo$58bo32bo93boboo 3boobo41b3o36boo5boobo4boo3boo24bobbobobbo132bo52bobboo10boo$92bo92bo 3bobo3bo41b3o37bo5boboo4boo3boo25bobobobo133bobo16bo33bobobo13boo$185b oobbobobboo40bo3bo35bo10boo31b3obobobob3o131boo13bobobo33bo16bobo$186b 3o3b3o40bo5bo34boo9bo3boo3boo21bo4bobobo4bo145boobbo40bo11bo43b3o$187b o5bo42booboo47bobbobobobo21bob3obobob3obo149boo34bo4bobo9boo42bo$200b 3o73boo9boo4bobo27bo5bo188bobo3boo55bo$200bo35booboo36bo5boobo5boobo 25bobobobobobo187bo$201bo33bo5bo34bo6boboo9boo22bo4b3o4bo183b3o$231boo 3bo3bo35boo3boo14bo23b11o7bo134bo41bo$231boo4b3o41bo14bo24boo7boo5b3o 134boo$186boo5boo42b3o36boo4bo13boo38bo135bobb3o$186boo5boo82bo3boo14b o38boo134b4oboo$243b3o30bo6boobo9bo169boo4bobo3boo$243bo32boo5boboo9b oo167b3o$244bo220bobbo6bobo$308bo156boobo7bo4boo41b3o$212boo94b3o19boo bo132boo7bo5bo41bobbo$212bobo96bo15boboob3o147b3o17bo12boo6bobbo$212bo 97boo14b3obo4bo121b3o24bo8boo5b3o12bo6bobbo$325bo4bob3o122b3o34bo4bo 13bobo6bobboo$85bo240b3oboobo124bo35bobo3bo12boo8bobb3o$84bobo240boboo 8b3o116bo36bobo3bo22bo3boo$83bobbo252bo118bo37bo3boo23boobbo3boboo$ 255boo48boo33bo116bobo66b3o4boobo$33bo49bobo169bobo47boo$32bobo47boo 171bo242booboo$31bobbo47boo8bobo362bobo38bo4boo$83bobo8boo214bo147bo 19bo17boo$31bobo60b3o213bobo145bo17bobboo15boobo4bo$bboobo4boobo16boo 51bo10bo214bobo146bo17bobo17boobobboo$bboboo4boboo16boo8bobo40boboo 224bo145b3o39bobbo28bo$6boo6boo15bobo8boo50bo96boo4boo122b3o133b3o70bo bo$6bo7bo27b3o36bobo10bo96bobobbobo120b7o144bo60boo$7bo7bo15bo10bo37bo bbo9bobo97bobbo119booboobobooboo140bobo47b3o$6boo6boo15boboo58boo97bo 4bo119boboo3boobo141boo46b4oboo$bboobo4boobo28bo38bobo10bo89bobbo4b6o 118bobo7bobo149boo32bobo4boobbo$bboboo4boboo15bobo10bo40boo99bobbo5b4o 119bobbobobobobbo149bo20boo11boo7b3o$6boo6boo12bobbo9bobo39boo97booboo boo125booboob3obooboo149bo20bo15bobo$6bo7bo26boo38bobo13bo86bobbo127bo 4bo3bo4bo148boo17b3o$7bo7bo13bobo10bo54boo52boboo6boobo19bobbo5bo122b 3obobobob3o168bo$6boo6boo15boo47bobbo12bobo52boobo6boboo17boobooboo5bo 123bobobobo$bboobo4boobo17boo48bobo13bo51boo8boo4boo17bobbo3bo126bobbo bobbo$bboboo4boboo15bobo13bo36bo14bo52bo8bo5bo18bobbo3bo3bo123boo3boo 193b8o$45boo102bo10bo5bo25b3o324bob4obo$28bobbo12bobo58boo42boo8boo4b oo352b8o$29bobo13bo58bo6boo38boboo4bo5bo$30bo14bo13boo36bo12boo39boobo 5bo5bo$58boo52bo42boobboo4boo$45bo8boo4bo95bobbo5bo$43b3o8boo49bo49bo 4bo5bo$44boo58bobbo47boobboo4boo$107bo43boboo6boobo$49boo44boo8bo45boo bo6boboo205b3o$95boo22boo249bo$46boo19boo50bobo71b3o175bo$67bobo34b3o 12bo72bo3bo$51boo14bo36bobo85bo3bo$41boo8b3o50bobo85bo3bo$41boo8bo52b oo11bo75b3o$116bobo$51bo14bo50bo$51bo13bobo40boo8bo9bo$50bobo12bobbo7b o30bobo8b3o6boo63b3o$50boo23boo30bobo17bobo$51bo13bobo7bobo29b3o80bo5b o$64boo52b3o69bo5bo$64boo52bo71bo5bo$54bo10bobo40bo9bo65bobbo$54boo50b obbo8bo65bobbo4b3o$53bobo9bobbo37bo11bobo61boobooboo$54bo10bobo39b3o 10bo63bobbo15b3o$54bo65bo63bobbo15bo$62boobo54bo61boobooboo14bo$54bo 10bo52b3o63bobbo5b4o125boo5boo56boo5boo$52b3o129bobbo4b6o120boobbo7bo bboo48boobbo7bobboo$53boo8bobo126bo4bo77boo3boobo6boobo23bobbobo7bobo bbo46bobbobo7bobobbo$54bobo8boo51b3o72bobbo79bo3boboo6boboo19boobobobo boo5booboboboboo38booboboboboo5booboboboboo$65boo53bo70bobobbobo76bo8b oobboo4boo17boboobobobo7boboboboobo38boboobobobo7boboboboobo$63bobo54b o70boo4boo76boo7bo3bo5bo23b3o3bo3bo3b3o48b3o3bo3bo3b3o$119bobo163bo3bo 5bo18b4obob3obobob3obob4o40b4obob3obobob3obob4o$62bobbo54bo154boo7boo bboo4boo17bo11bobo11bo38bo11bobo11bo$62bobo211bo3boobo4bo5bo19b3obobob 3o3b3obobob3o40b3obobob3o3b3obobob3o$63bo152boo57bo4boboo5bo5bo20boobo boo7booboboo44booboboo7booboboo$216bobo56boo7boobboo4boo$216bo67bo3bo 5bo$275boo8bo3bo5bo$276bo7boobboo4boo$275bo4boobo6boobo$275boo3boboo6b oboo5$318boo13boo48boo13boo$318boo13boo48boo13boo$318boo13boo48boo13b oo$5boobo6boobo18boo$5boboo6boboo18bobo281boo7boo54boo7boo$9boobboo24b 3o277boobo7boboo50boobo7boboo$9bo3bo24bo3bo$10bo3bo23boobb5o136boo12b oo$9boobboo27boob3o106boobo6boobo15boo12boo120boobo7boboo50boobo7boboo $5boobo6boobo19boobb5o107boboo6boboo29boo122bo9bo54bo9bo$5boboo6boboo 19bo3bo109boo8boo4boo28bo$9boobboo4boo18b3o8b3o99bo9bo5bo13b3o12bobo$ 9bo3bo5bo17bobo10b3obo98bo9bo5bo12boobobboobb3obobo$10bo3bo5bo16boo12b obobo96boo8boo4boo14boobboobb4obo40boo3boo77bo7bo56bo7bo$9boobboo4boo 31bobbo98boobo4bo5bo15boo10bo40bo7bo75b3o5b3o54b3o5b3o$5boobo6boobo26b 3o5boo99boboo5bo5bo70bobo77boobo5boboo52boobo5boboo$5boboo6boboo25bo3b o103boo4boobboo4boo68boo3boo75bo11bo52bo11bo$44bo3bo103bo5bo3bo5bo149b 3o11b3o48b3o11b3o$44bo3bo104bo5bo3bo5bo255bo$45b3o104boo4boobboo4boo 171boo81boo$154boobo6boobo60b3o110bobo80bobo$154boboo6boboo61b3o109bo$ 191boo$190b3o$44b3o144boo45bo5bo71booboboo58booboboo7booboboo$30boo11b o3bo140boo39b3o5bobo3bobo68b3obobob3o54b3obobob3o3b3obobob3o$30bobo10b o3bo148bo31b3o5bo3bobo3bo66bo11bo52bo11bobo11bo$32b3o8bo3bo142b3ob3o7b 3o30bobo3bobo4b3o60bob3obob4obo52b4obob3obobob3obob4o$31bo3boboo5b3o 142b4o5bo5bo33bo5bo5bo63bo3b3o4bo57b3o3bo3bo3b3o$31boobo5bo147bo6boob oo5bo45bo64bobobob3o53boboobobobo7boboboboobo$34bo5bo147bo11bo114boobo bobo55booboboboboo5booboboboboo$31boobo5bo14b3o131booboo6bo115bobobbo 60bobbobo7bobobbo$31bo3boboo16bo134bo5b4o116bobboo62boobbo7bobboo$32b 3o21bo135b3ob3o116boo70boo5boo$30bobo8boobb4obboo139bo$30boo9bobb6obbo 146boo$42b10o144boo44b4o$39b3o10b3o141b3o42bo4bo$39bobbo8bobbo141boo 43bo3bobo$40boo10boo188bo3bobo$64b3o181bo$64bo183bo$65bo153b3o23bobbo 16b3o$219bo26boo17bo$220bo45bo$$192bo10boo$191bob4obboobboo$190bobob3o bboobboboo$73b3o113bobo12b3o$73bo116bo$74bo115boo265boo$190boo12boo 167b3o80boo$190boo12boo167bo84bo$374bo! golly-3.3-src/Patterns/Life/Signal-Circuitry/heisenburp-46-natural.rle0000644000175000017500000000065512026730263022634 00000000000000#C Glider Flyby with glider Out of the Blue: #C p92 Conway-Space Natural Heisenburp Duplicator #C Brice Due, 8 January 2005 x = 46, y = 51, rule = B3/S23 8b6o5b4o$8b4o7b2obo$11b2obo7bo$13b2o5b2o2$13b2o5b2o$11b2obo7bo$8b4o7b 2obo12b2o$8b6o5b4o12b2o2$39bo$39bo4$41bo8$36b2o5b2o$35bo2bo3bo2bo$23b 2o11bo2bobo2bo$24b2o13bobo$23bo13b3ob3o$35b3o5b3o$35b2o7b2o$35b2o7b2o$ 36bob2ob2obo$36b3o3b3o$37bo5bo3$36b2o5b2o$36b2o5b2o11$2o$b2o$o! golly-3.3-src/Patterns/Life/Signal-Circuitry/signal-turns-and-fizzles.rle.gz0000644000175000017500000001440013171233731024057 00000000000000‹ ´\ÍŽìÚêÏLzîšß5ÆukJ 7Qbi˜?F>1ë¹¶/+ìwçk!ýÞ>xÝììI×uëjcõi÷ÿý_\A3c"¥ÙøÜ§£+¸†'%U\¯îDÑQ·~^pyŸ`‹NÍ„H#íW]Ç|qÕÑôAÓ1>ïWùøE)Yý\Ù”}Yµà¿®)YfÐNüéä '¢s`26ÍÎP›L©x.7ÇÒÚzzwÇʬsÍèâø)}õ×,÷ëwÙ/‚¦MÇ'ˆQŽÊÊbM?Ä.½S!.uÅZ•¥tÖkˆþÙvtq¡ü°©£íÙ©þœPá÷N_ɼ<¤\²±ó0÷æ´¯dþöžIdp HHÕ ºLb!èw}ó–8‚-ùµEïO?¶v“Îè võm¤bPnó°M®“WýЧÎc’yîѽûÛÞÛaJ ªª<¡úþ*»ÓC}˜®È= Ðå!ƒ´q•´oºô£«_vééiÁ2Lyí ȦÝU%g›~ŸLõ]ÄÖæwéOn]‚NZ/é‚5YT—õéJW‚Fµ#»Mý±GïN~Þûv˜>» ÅZ±1P^T´iîüºM¯N,Ý&2¡€±×æÄoµSã—|ô»±[ŽË_¸ìÓ‹]·ý¬I¿¸oá¶ù#/Û&jŸ´Slj4]ôi›~yó5£3žMÉý,;pɆL½4]ûºC^÷¾CÑ[0‰0É ª÷]þt9=ô×¥_ÝœÖâÛªû]ºß²tÓÒW¬ÒùªÛ×Ê÷.ñÛÓŸvég7`‡î\V3ÒÅ—¸ûÒ—e*ϽÕ~ûñ¥ÉëÓ_zuâåï¡.),wâfwéÍŸÁ)YçžnQ_;¦æïÖ¡×§~Ò¡_sƒÏÎêK§.UÚ…­ß“dˆ<Öv £Ò'µÁìË4×ÔôWãǯ›ô›ûà̱Ϛûlàä' D㣾x¨“³T†©âmÁr>°rRÜ0»úÓýòæ.G}$„Ôt¢nQŒaëu5|ðf1 o«9RmáW<©ƒÚÅ¿nÓŸÜ<Ú¤²¸^FÔ¢‰¢ñŒêßìÂÖ0Û~À®º†\»¶“ÊóÞœ}KŠ!(å£6ýô†§mzuB6eˆJã¡Q«67_œñíìÂÖ)Ltæ*vaâ!2²¿˜§jÖ&Míß7é'Ëîôm6_´ «Ë[ÎÉÒ…ì /ùAP'¶¤(Ÿ¿îР^çÜ“b› ©¼œMqf_d*§¹ln[¿KâÀ)1‰ÆÂF’·F‹¾»àÍ/ئk¡4t̆ø¶´[\‡Ê aUÔ‡0çŠ]®UHŸ©AúµÚ}F6ÌÓ èú`IbÐ\>ÇÌ]<ù·/ÑP;_´$ðغ}‘ßë½?W ôù ,3Žå0%P5óR'ü„Ê‘!é]…÷Ëe^ÿŸÕçÏÚŸ² ¶ŠrxgIÆòÄö_0û2ùÃA’jÃð$òìký¡¥Ÿ\üºIóáܦξãElœéÇ -Ãóê‡>¸fþ©¾-çpŒ$ ZÔç¹Äç‡Hÿ¦Ô×Ü“Š\ò–Ä•íšÐ2‹Æ,¿úÓ80§y]2ïéŸA¯âÒÃæ#çI¼÷X,ö›ÊÝü3²7ø«»8*ˆ¹Nè´¢Á£\CCl1õD™ðŒòÅr|¤NÇÖ‡=I)ø6´üåIÈgòjp„î¡.Ƥ±zš)aD)3‘Ó¡9Д7§aETŒLZÚ}ášb§è­¾ÌæžAMëö¶aÊàh`=3LÒ)œý–Äa .Ëí1'›ÖÝHÅÉwë'j À‹-¥!+ZðcܼŒ ŸfÎÞô!8§D#N­¬wx€x"Þ´¤­*RyyÙ¡§°•>D™îᾄT=ïq𣭏û9VQNzâžä·ÝÆøq‡¾¿®´{]|ŽØojRé pÀ®¥Ïç¸îuFÐÝóG !âÿÝÇ%ái·†ÕŸWCRÕ½kÒ·W¼hÖuBíù¸0¡øû|¤™ƒó²AŸ\dš„Æ»ôý ÝÀœ€}öt—Õœ«kmÂeFkFÔ6Ã^òøu^PÞW æ8¦Ô™2Y7¤ºíÀ|dwp`B]HŽd !mÖ€i5lÃÀ¬FzÕ»…ì>¶üŽçºk”Y$ó„)ˆ:V¡p} YŠ6wÛ^6@ÃÇ&÷OpV—ˆI›€+žŽDs\ÖMv1!Þã-„‚iíÓÓ‡÷f W\Mr­Îûor׳¿"qùs“&=* eöðdì/êäâ”{D7<´à>*" ü Ÿ¨Lj(Ÿ³»Ù-‚XLØ‹¤r¸q$£íÓuë6#oAɼ!aË€ügX”0…¦cJ¿ ¯Lߎ #6ÄcÔ2,™ë›= JO> `ìnÖbÉ^Ö03Í[ä¸3šSb$¯!yú\ÖºU•òã–¶Ésç–‚?Ä7ó¤:©{ãÕöJgÁjÛÛ ¯>‰¤y ˜dª˜Ýº®_É?Ü€E €¬@›Š»˜³Õ ‚ªŽõ3†ÏßÕÏCL¬ó¥¾EvÛy”4Ú&ZË¼ê¤ ™Äœµ ácpšmwÖ1¹Ü¬`!½á¬ ÑU 0.»íØ»TÙ¤ï<\› xäëZ/ÛgRpõÈ¥Ë(hLw)NÙ¥ÁѺê|OîJß‹±GñÊüP3±ÈDJcf “|ijtKÔð”Z@­¹Â¶6Kš2q:ƒá#NJ ÝÏôétnf÷ÅßžëT†NëÀÖ<(à¶ÙBV÷×(óPd¦û§žâÏl¾sµÌ¨-t¸©ë@ã&ß-ÇßLþœ8«ªF9-hnŽá‡)˜¶z ™Ý7%‚Iç@ÀÃFJ°¯ŸlmSBÖQÁðŸè—3ÏbI{y ›Ñs÷ûÄn¤RÍùs0À‚Â…èÊ„bÜýëÀÜ,YxºøO]q¤5ù¨år·5û¦ôôôYƒaiφbƒ26]žô·dÊ$7ç-PèÄGr°Ì>»ËAñ¸óbgMš|÷kk/‡E4¡b³.ÛÚc ‡×öŽêDñ̇F+v 8@.ê ! °ÜŸ&…‚ÔÜúp×wçÂÝ3³®ÀûžÙCd Ù‚æ“AÕ[´³Ã¡ gK²;ûdŒý²nZ™h 7þØ•ˆ’üTº!z%)PI庞òP³L±‹¥j0m”"d„ìuwêˆí7{2^ͱå²Cé0«USÑpêä«ÏQN zº‘Þ•…`Ö<•ÇõÈôÀÂcWi1Í-Ô*3±<Ô"Çt•92…?¥ Õ2î࣪±:ü1ì’o wd~ZžuשQœ¸‡ÓØ–)Çž¤‡U溪N|Üï2„MP}'èyK³9)#7é¹ãñÖ1v|äih7ÃlêpЯnP<hKY{Š€Üë‰w˜M¡Ö®b¶€·Îæ‘Lò´¨¥2ê&Ý¢©™ÈþusDk¸U›«L|B§‹Z∭ØR„S*t±‚• VöÂ÷«6M…B¼áqUçux€÷wà²)åÉÑÏ/B°ä/€MÜ£ÀùîʳK?oµîÃYï!Ä éÄx…©¾Fe’m*_¦¬`±,ÄŒüÛ²žºçÄ‘HŒ€ â¹âqÄ(°óÌA\#:ÙR&¼¼«¨4"°áˆMa™§¶r g àj¦„Á!ý+æ<—QºY'J’~aÎæ± giö^æB6Ç´¥6êxš>îÑVÇäÔcW0d7 ÿ¨?nÕëÔ-îQØý"u:/³êž­ºù2HËÄíCåµRÜaÓpÏ1ÆWon‡õ“dIz¥ `¶#·êhž;ÖÏ£XQÄjÀŽ\˜ …œÖq趲ʟômfÒ¼ç˜æ’Ex8ûÎt|qFço¯ûëg“iï’MzªØŽor/·ãÖqsŸðÖ¼ä%WrŸ*1´8ʵûÒ{ž"­ ƨ?ƒðŽ?à¸yvÉPÃÇq„ŒM5ìÙ"&ÛÔ³Æ`Ž´¾¤­¹¦nwðÑí!,v;6xx|Z¹™”@w¨óÙI9­Âç/3èÊæj<^ûÞïC\w˜Ò¯’0j•ç|t·ÅQÊàÅK:OoÏ„m&°q³}r“ZTx€°zu;oÒêî/×§£ßâ8ç<¥ýn(,j²Ãô?|<7Î Œß#¸ÇÄh¨yÖÒîI[xfõ®ÖÉ®›Ì2®æ/Jœ¯&êU@,M_I±š’Iñ拼0éHÍßf¯P "ÏÉF4ô²[ïD  B¿òÚNòléyÛŸª=Œ…ÚÓÝÜhÖy²*y¿îÓ¹f3M“Ê×½u,¨¿<7CpꓟE‹l·²Æ¤œ›ýYìÆ ž¿ÑxûñktWÕ-$¦ØîljWm{ùª6ûìSõ=²Ëûn«Ñrñ¼e ºú6½Í5ӫւצ/ª¬øE š¼1~õJ…]Î5¿þñ/Ó~G`4©]½r¾ús_7|Jm3  O¡R=RÊ>¿vÓïe¤½"˜ZßnýæW$£êF$ß¼õj_©xø’túå&y=£"½$£åÃ1˜û ×ãäéžú­ŽOBy}l-_©7Z4‘°–˜0å#$½[ãf|½®nßTŒÎíjPQE|ñ„¨˜vF¤Sª¼–IzEXS6NÎçt} °ÓÕ\ž`¬|¸»5Ò–âÒ ‡²ò‡û|7LwܺæoÈ{4{{lÜ£¢wº„¾R:ÛQ5¥(QŠ¿¤ú™bpÂ$„Lw€5‡yØ;H=v¾H¸”ÁB}kÓI¯óNùe°¦¬ž'&ƒ=¯Èu™Yø‡ÎÌ '*öæhU‰=Hë±?±«ðH’ªbeüð]Ía÷ž1®ŒäVvÍ)ÉU‚3^¯¼ìϼ+VV?Rº(h.É·=t×T§Ócv9µÓM¥ëšÝûz¤ø—!À¸'¢jåIîåÓnè D^·¶¼3-dÒØW7•X{3€½ÓíÂnvU‹kÚÈ>EuÆšÎf>gB² %¦úe¢rL©UðS’§ò Û X;ú9xØg2˜ºÔyõhöÓ¾¸‡¥à®yÂ2ú=Ä®CÜ·:)älj†‹}{ÌŽuÉYê$å—ôú È)Ç›-EóÐpàêmõ|kÆâÙ–©Ã¶±ê´É0Ìb–¬¨õF¶´iQñ>zžl¶·à¼­DwDÕ¥“³”…]ØFô½#èÄ'âÄüû‹À˦éÜ-žk:¢';Ìbá½%‰¦ù(¬I`"sI·TG§ÇýÈ[0HþrcåÛ¾E1—¦¥‚X¸ºñéo•ຠ%»Zzå mõݾ$Û“OOáX.¡`67bIìïxéFtȦ‘ôé*‰Ä>ªWÉ{n¿KÑ ]m£sÔÌÐioq^¿ZhY9È$SY:?‘h±ÏâX¸`}WcížÞÒÁ¯~À0°¥#FÕ“^#@.Æ[ÍŸ{€#«ÛƒëáúI¡4îpåRâaÊ^Ù3¬Œœ)Gõ+ŽùQ>š #yÜ •¶÷÷€ì[bÀŽl ‰Ö²Ë4=nrÜ£‹&W–ö~õr‰Äè€cl&% „›J„ÃfÅn3e2¶±ló¼|ž4ÙÛ.±ƒNF&žf·NkDZÉÞ3â)íµ1+1.ûBK b-¹}B[Ó{v;f¾ ï3‘¾!tu/X?†ìDÿ”æÑºŽÑK⿤ý6Í.õ†üÏ©Ÿ,B¾q€¾aApFìè,ǘâÐöÉÉR=äó|Ï:­Î vÉ,³›Î%ñÄŽ—ÜÈxùfD±Ó‚NÓ–ò„1_ø¢%×’}°ùìåuî9xªë¬ï9•›SåâÕãúY[ÕÒõ+Ïh0-T&Ÿî›ñ}1O i„:9NlÎðÌÀìqÿÆt¦÷XÄìX_¡±•&Çu›yš-lŽÀ4àœ`²±ÈO6à`›êFTO7tù¡8àK˜³¶•ùÃå¶žƒhñä4³ñÛŒ7ûZal.°ñª7 zìeoðá•bË—0^8Gí}%˜ž¸[œñ.Ÿ Ÿi{v¢¥ö•ÍÞq‘ñª½ŒµO[Á(¬.ÄWn§³‰³‘­‘%ø)ññ;,9¹àE —iš†–j0O^òƒê*¸,øHŸcøøéNò%%pÍôá©g8hI T|GDß?Ø,¾N¥ÅGB¬rã0%p´ÒÁæ´qÂÕ fvÏU‰ºœšN*Íò;š•*Í«¤JH!ó´Yh+‘š°1²~©¾C›Íjêi±ÄDJ3µYËÖk™¢>]€ñÒ¨:“}*#–äkžž5jå7þÍâ# ÇÑ_3rÖˆoMì\ýXn¸­Ù—è1Qd.Ù¿è\añ±1ÿY³cÿAÿÿÿržAdgolly-3.3-src/Patterns/Life/Signal-Circuitry/traffic-lights-extruder.rle0000644000175000017500000016375612026730263023357 00000000000000#C Traffic lights extruder. #C Slowly creates an outward-growing crystal of traffic lights. #C By Jason Summers, 30 Oct 2006. #C Based on an idea by David Bell. x = 3141, y = 2078, rule = B3/S23 2794boo$2793bobbo$2796bo$2796bo$2794bobo$2794bobo$2795bo3$2792boo3boo$ 2792bo5bo$$2793bo3bo$2782boo10b3o$2780bo3bo$2779bo5bo$2774boobboobo3bo $2774boo3bo5bo$2780bo3bo$2782boo$2814bobo$2813bo$2808boobbo4bo$2808boo bobboboo$2812boo$$2818bo$2816b3o$2815bo15boo$2815boo14boo3$2804boo13b 3o$2804boo$2817bo5bo$2817bo5bo$2817bo5bo6b3o$2796boo31bo3bo$2795b3o7bo $2795boobo4booboo7boo11bo5bo$2796b3o17boo10boo3boo$2797bo4bo5bo6bo$$ 2802booboboo19boo$2827bobo$2817boo8bo$2808boo7boo8boo$2807bobo21bo$ 2808bo19bobbo$2807boo22bo$2807b3o$2808boo$2806bo19booboboo$$2826bo5bo $$2807bo19booboo$2806b3o20bo$2805b5o$2782boo20boo3boo$2782boo21b5o$ 2805bo3bo$2806bobo20boo$2807bo21boo$2783bo$2782b3o$2781bo3bo20boo$ 2780bob3obo19boo$2781b5o4$2773bo$2770b4o4bo$2769b4o5bo$2762boo5bobbo$ 2762boo5b4o$2770b4o$2773bo3$2370b3o684boo$2369bo3bo683boo$2368bo5bo$$ 2367bo7bo$2367bo7bo531boo$2907bo$2368bo5bo519boo9bobo$2369bo3bo518bo3b o8boo$2370b3o426boo85boo3bo5bo23boo$2799bobo84boobboobo3bo23boo$2799bo 91bo5bo158b3o$2379b6o507bo3bo158bo3bo$2378bo6bo508boo158bo5bo5bobo$ 2377bo8bo534bo133bo3bo4bo3bo$2378bo6bo534b3o133b3o5bo$2379b6o534bo3bo 132b3o4bo4bo8boo$2918bob3obo139bo12boo$2919b5o140bo3bo$3066bobo$2824b oo211boo$2824b3o209b3o$2818boobbobbobo207bobobbobboo$2818boobboobboo 207boobboobboo$2822boo215boo$$2828bo205bo$2826b3o205b3o$2825bo15boo80b oo95boo15bo$2825boo14boo80bo96boo14boo$2924b3o$2830bo95bo105bo$2814boo 14bo199boobo13boo$2814boo14bo189b3o10bo13boo$3020b3o6bobboo13boo$2826b 3o3b3o184bo3bo4bob5o12bo$3018bo5bo4bo3bobo10bobo$2830bo188bo3bo5bo4bo 11bobo$2830bo3bo185b3o6boo16bo$2830bob3o3boo3boo185bobb4o$2833bobo195b o3b4o$2823boo14bo3bo181bo7boo3bo5boo3boo$2814b3o5bobo15b3o182boo10bo6b obobobo$2813bo3bo6bo15b3o181bobo18b5o$2812bo5bo222boo3b3o$2812bo5bo8b oo205bo6bobo3bo$2827boo10bo194boo5bo$2818bo19b3o$2817boo18bo3bo$2817b oo20bo$2424bo390bobboo16bo5bo180bo$2423bobo390bobo17bo5bo179b3o$2422bo 3bo389boo19bo3bo179b5o$2422bo3bo411b3o179bobobobo17b3o$2422bo3bo445boo 146boo3boo16booboo$2422bo3bo387boo3boo51boo169booboo$2422bo3bo387boo3b oo222b5o5bobo$2422bo3bo596bo18boo3boo7bo$2423bobo390b3o203bobo31bo$ 2424bo391b3o203bobo28bobbo$2817bo55bo149bo30b3o$2873bo148boo$2839boo 31bobo147boo19boo$2432bo4bo401boo30booboo146boo$2430boob4oboo430bo5bo$ 2432bo4bo435bo$2816boo52boo3boo168boo23boo$2778boo36boo227boo23bobo$ 2778boo293bo$3071booboboo$3067b4o3boobo$3065bobbo3boo$3064bobbobb3ob3o $2870boo192boo5boo3bo$2871bo192b3o5b4o$2868b3o193b3o4bo4b3o$2868bo195b 3o4boobbobbo$3064b3o9boo$3064boo$3064bo$3062bobobo$3062boobobo$3065bob o$3065boo17$2477bo631boo$2476bobo628bo3bo$2475bo3bo621boo3bo5bo13boo$ 2475bo3bo621boobboobo3bo13boo$2475bo3bo626bo5bo10boo6bo3boo$2475bo3bo 627bo3bo10b3o5bo3bobo$2475bo3bo629boo12boo6b5o$2475bo3bo634bobo9boo4b 3o$2476bobo635boo10boo$2477bo361boo274bo$2835boo4b4o263bo$2835boobboob 3o263bo$2839bo268bo$2485bo4bo$2483boob4oboo339b3o10bo258b3o$2485bo4bo 341bo10b3o$2833bo8bo15boo239boo9b3o5boo$2842boo13bobbo234boo3bo17boo$ 2857bo236bobo3bobo$2857bo235b3o5boo$2831boo12bo11bobo233boo$2831boo11b oo11bobo236boo$2844bobo11bo236b3o19boo$3117bobo$3117bo11bo$2855boo3boo 233boo30bobo$2855bo5bo233boo17boo9boo$3107b3o4boo9boo12boo$2852boobbo 3bo245b5o6boo6boo12boo$2851boo4b3o224boo19bobo3bo5b3o7bobo$2829boobob oo17bo230bo20boo3bo6boo10bo$3073bobo6bobo29boo$2829bo5bo237bo3bo4boo 30boo$2844boo217boo12bo$2830booboo9boo217boo8bo4bo$2832bo244bo$2856bo 216bo3bo$2854booboo214bobo$2834bo$2833bobo17bo5bo$2832bo3bo123boo$ 2832b5o16booboboo100boo$2831boo3boo$2832b5o$2833b3o$2834bo$2961bo$ 2959booboo$$2958bo5bo$2530bo325boo$2530bo325boo100booboboo$2529bobo 577boo$2530bo427b3o144boobboobboo$2530bo302boo122bo27bo119bobobbobboo$ 2530bo302boo123b3o22b3o120b3o$2530bo451bo124boo$2529bobo432bo17boo131b o$2530bo431boo149b3o$2530bo581bo15boo$3112boo14boo$2980bo126boo$2970b oo7b3o125bobo$2534bobboo4boobbo421boo8b3o119boo4bo$2533bo3b3obb3o3bo 410bo5boo4bo129boo$2534bobboo4boobbo410b3o4boo10boo3boo$2957b5o15boo3b oo$2956boo3boo$2957b5o157boo7bo$2957bo3bo15boo139boo7b3o$2958bobo15bob o122b3o16bo5b5o$2957b3o15boo148boo3boo$2956boo18boo123bobo$2957bo18boo 122b5o5boo$2954b3o22b3o117boo3boo4boo13boo$2954bo144boo3boo18bo$3114b oo11bo$3114boo8bobbo$3104boo18booboo$2975boo3boo122boboo18boo$3107bo$ 2976bo3bo$2977b3o122bob3o16boo3boo$2977b3o122bo20boo3boo$3102bo21b5o$ 3125bobo$$3125b3o$2978boo$2978boo121boo3boo$3103b3o$3102bo3bo$3103bobo $3104bo21boo$3126boo3$3103boo$3103boo$$2583bo$2583bo$2582bobo$2583bo$ 2583bo$2583bo$2583bo$2582bobo$2583bo$2583bo4$2587bobboo4boobbo$2586bo 3b3obb3o3bo$2587bobboo4boobbo32$2636bo$2635bobo3$2635b3o$2635b3o$2636b o3$2636bo$2635b3o$2635b3o3$2635bobo$2636bo$2641bobboboobobbo$2640boobb o4bobboo$2641bobboboobobbo32$2689bo$2688bobo3$2688b3o$2688b3o$2689bo3$ 2689bo$2688b3o$2688b3o3$2688bobo$2689bo$2694bobboboobobbo$2693boobbo4b obboo$2694bobboboobobbo33$2740bo$2739b3o$2738booboo$2737b3ob3o$2737b3o b3o$2737b3ob3o$2737b3ob3o$2738booboo$2739b3o$2740bo4$2747b8o$2747bob4o bo$2747b8o4$2706boo$2705bobbo$27boo73boo77boo77boo88boo27boo56boo77boo 77boo2111bo$27boo73boo77boo77boo87bobbo26boo56boo77boo77boo2111bo$181b oo166bo29boo2325bobo$181bo167bo30bo2325bobo$4boo20b3o50boo77boo20bobo 54boo88boo20bobo27bobo20boo10boo77boo77boo2133bo$4boo20b3o50boo77boo 20bobo53bobbo87boo20bobo27bobo20boo10bobbo75boo77boo20b3o$102bo78bo57b o110bo29bo135bo77b3o$102bo136bo178bo97bo76bo3bo2106boo3boo$101bobo133b obo88bo186bobo74bo5bo2105bo5bo$5bo18boo3boo69booboo53b3o17boo3boo52bob o87bobo17boo3boo23boo3boo17b3o12boo96booboo74bo3bo$4bobo18b5o69bo5bo 52b3o17bobobobo53bo18booboboo62bo3bo16bo5bo23bobobobo17b3o11bo97bo5bo 74b3o2108bo3bo$3bo3bo18b3o73bo54bo3bo17b5o142b5o47b5o17bo3bo111bo55b3o 2131b3o$4b3o20bo71boo3boo50bo5bo17b3o74bo5bo61boo3boo16bo3bo26b3o17bo 5bo28boo3boo72boo3boo51booboo2155bo$bboo3boo70b3o75bo3bo19bo53boo3boo 84b5o18b3o28bo19bo3bo7boo3boo17b3o54b3o75booboo2153b3o$78bo3bo75b3o74b o5bo16booboo64b3o71b3o8boo3boo16bo3bo52bo3bo74b5o2152bo$77bo5bo17b4o 155bo67bo84b5o18bobo52bo5bo17b4o51boo3boo18bobo2130boo$77booboboo16boo bbo131bo3bo173bobo20bo53booboboo16boobbo75bobbo$100boobo133b3o274boobo 74boboo$3bo410b3o155boo2136bo$3bo22bo53bo20boo54bobo167bo74bobo89bo20b oo54b5o19bo2112bobo$3bob3o16boo53bobo19bo55bobbo17bobo148boo16bo33bobo 17bobbo88bobo19bo55bo20boobo2113boo$16boo7boo52bobo9boo66boobo7boo6boo 69boo6bo70b3o8boo6bobo32boo6boo7boboo23boo10b3o52bobo9boo66b3o8boo8bo$ 8bo7boo61boo10boo77boo7bo69boo4boo4b3o64boo9boo6boo33bo7boo34boo4bobo 58boo10boo68bo8boo2119bo13boobboo3boo$5boboo69bo22booboboo51bo96boobbo 3bo64bo72bo29boo4bobo51bo22booboboo51boo2129b3o12boo3b5o$5boo70b3o15bo 5bo5bo51boboo78bo86bobo9bo11bo46boobo15bo14bo3b5o49b3o21bo5bo51boo19b oo3boo2102b5o16booboo$76bo3bo13bo7bo3bo53bo21b3o54bobo17bo5bo63boo8bob o9b3o23b3o9b3o9bo17bo16boo3boo47bo3bo21bo3bo74b5o2102boo3boo8bo6booboo $26boo3boo42bob3obo12b3o6b3o58boo3bo11bo3bo54boo17boo3boo73boboo7b5o 21bo3bo8bobo25b3o16boo3boo46bob3obo21b3o66bo8booboo2103b5o10bo6b3o$oo 3boo10bobo8b3o45b5o4bo78boobbobo9bo5bo152bobo7boo3boo19bo5bo7bo23bo76b 5o4bo68boo3boo11bobo6booboo2103bo3bo8b3o$oo3boo10boo8bo3bo54boo3bo62b oo3boo6booboo9bo3bo50bo86booboboo9b3o8b5o21bo3bo9bobo8boo3boo4b3o14boo 69boo66bobobobo11boo8b3o2105bobo$b5o7bo4bo9bobo54boo4bo63b5o9b4o9b3o 50b3o24bo71b3oboboo8bo3bo22b3o10bo5bo5b5o4b5o12bobbo7bo59boo68b5o2129b 3o$bbobo9bo14bo55boo4bo63booboo10bobbo8b3o49b5o22bobo59bo5bo3bobo4bo 10bobo23b3o10bob4obo4booboo3boo3boo10boobbo5boo131b3o2129boo$12b3o140b ooboo13bo59boo3boo8bo12bobo69bo5bo12bo38b4obbo4booboo20b3oboo138bo 2131bo$bb3o80b3o68b3o14bo60b5o10bo11bo62booboo5b5o56boo6b3o22bobboo3bo 141b3o3b3o2113b3o$234bo3bo8b3o11bo64bo102boo2269bo$29boo58bo14boo77boo 50bobo13bo9bobbo72bo14boo23boo33b3o22bobbo66bo10boo62bo14boo2125bo$29b oo58bo14boo77boo51bo13bobo9boo73bo14boo23boo13b3o17b3o24boo65bobo9boo 62bo14boo2124b3o11boo$89bo161boo84bo169boo73bo2139b5o8bo3bo$2721bobobo bo6bo5bo$bboo14boo57boo14boo61boo14boo61boo14boo72boo14boo45boo14boo6b oo14boo61boo14boo61boo14boo2133boo3boo5boobo3bo8boo$bboo15bo57boo15bo 61boo15bo61boo15bo72boo15bo45bo15boo6boo15bo61boo15bo61boo15bo2146bo5b o8boo$16b3o72b3o76b3o76b3o87b3o47b3o34b3o76b3o76b3o2143boo3bo3bo$16bo 74bo78bo78bo89bo51bo34bo78bo13bo64bo2139bo4bobo5boo$23bobo72boo420bo 70boo2130bobo3bo$22bo75b3o74boo74bobboo88boo39boobbo41boo78bo6b3o70b3o 2129bobobboo$17boobbo4bo65boobbobbobo69boobobboboo69bo3boobboo80boobb oobboo31boobboo3bo36boobobboboo69b3oboobboo69boobbobbobo2129bo$17boobo bboboo65boobboobboo69bo4bobboo69bo7boo80bobobbobboo31boo7bo36bo4bobboo 69b4o4boo69boobboobboo2129boo$21boo73boo77bo75b4o11bobo72b3o42b4o41bo 78boo77boo2133boo$172bobo92boo73boo84bobo2293boo$267bo$$28b3o453bo179b o$27bo3bo182b3o177b3o85bo3bo87b3o85bo3bo2067b3o$26bo5bo4boo174b5o175b 5o89bo85b5o89bo2065b5o$36bobo174b3oboo174b3oboo83bo4bo85b3oboo83bo4bo 2065b3oboo$25bo7bob3o178boo178boo85b5o88boo85b5o2068boo$25bo7bo3bo$35b oo2751bo$26bo5bo2755bo$27bo3bo197boo178boo78boo98boo78boo6bobbo2068boo 37bo$28b3o188b4o5b4o167b4o5b4o20boo54b4o87b4o5b4o20boo54b4o9b4o2054b4o 5b4o20boo$50bobboo163bo3bo5booboo165bo3bo5booboo17booboo53booboo85bo3b o5booboo17booboo53booboo4bo3b4o2053bo3bo5booboo17booboo9b3o3b3o$49bo3b oobboo163bo7boo170bo7boo18b4o56boo90bo7boo18b4o56boo6b4o2060bo7boo18b 4o$49bo7boo159bobbo176bobbo29boo145bobbo29boo2125bobbo29boo15bo$50b4o 2734bo$682bo2105bo$59bo450bobo35bobo131bo$57b3o36b4o33b4o41boo31boo44b o33bo44boo96boo31boo44bo33bo41b4o33b4o52bo$56bo15boo21bo7boo23boo7bo 36boobboobboo23boobboobboo36boobboob3o23b3oboobboo36boobboobboo88boobb oobboo23boobboobboo36bo4bobboo23boobbo4bo36bo7boo23boo7bo$56boo14boo 21bo3boobboo23boobboo3bo36boobbobbobo23bobobbobboo36boo4b4o23b4o4boo 36boobbobbobo88boobbobbobo23bobobbobboo36boobobboboo23boobobboboo36bo 3boobboo23boobboo3bo2146b3o$96bobboo31boobbo43b3o25b3o46boo31boo46b3o 95b3o25b3o46boo31boo41bobboo31boobbo2146bobbo$180boo27boo127boo96boo 27boo2312bo$45boo47bo43bo34bo43bo34bo43bo34bo97bo43bo34bo43bo34bo43bo 2147bo$45boo47b3o39b3o34b3o39b3o34b3o7b3o29b3o34b3o95b3o39b3o34b3o39b 3o34b3o39b3o2144bobo$80boo15bo37bo15boo6boo15bo37bo15boo6boo15bo8bo28b o15boo6boo15bo80boo15bo37bo15boo6boo15bo37bo15boo6boo15bo37bo15boo$80b oo14boo37boo14boo6boo14boo37boo14boo6boo14boo7bo29boo14boo6boo14boo80b oo14boo37boo14boo6boo14boo37boo14boo6boo14boo37boo14boo$62boo7b3o570b oo$62bobo5bo3bo96bo47bo68b3o125bo9b3o46bo38boo112boo14bo$46bo15bo28b3o 13boo15boo45bo14boo15boo14bo19bo25boo15boo4bo55boo69bobo8boobo12boo15b oo14bo39boo4boo15boo60boo15boo9boo13bobo$44booboo7boo11bo5bo31boo15boo 25bo19bo14boo15boo14bo8boo8b3o10bo12bobo15boo5bo41bo12boo69bobo11bo12b oo15boo14bo38bo6boo15boo25bo34boo15boo10b3o11bobo$57boo10boo3boo13bo5b o43boo9b3o7bo76bo3bo9boo10b3o150bo8bobbo120bo14b3o63boo12bo$43bo5bo6bo 32bo5bo29bo13b3o7bo3bo4booboo5b5o48b3o15bo10bobo10boo67boo91bobbo48boo 60bo8bobo12bo3bo62bo$89bo5bo28bobo12bobo6bob3obo12bo5bo12bo49bo5bo20b oo66bo94bo13bo35bobbo58bobo6boobo11bob3obo4b3o7boo$43booboboo19boo53bo bo22b5o3bo5bo3bobo4bo10bobo29bo18bo5bo21bobo34bo111booboboo6b4o11bo31b o3bobo6bo51bobo7bo3bo10b5o4bo3bo5bobo34boo20boo3boo$68bobo19bobo32bo 11bo30b3oboboo8bo3bo28bo9boo3boo3bo3bo23bo34boo7bo8bo10bobo81bo5bo6boo boo10bo31bo4bo6b3o14b3o34bo8boo34bo15bo40bobobobo$58boo8bo11b3o74boobo boo9b3o8b5o28bo5boo3b5o5b3o59bobo5b3o6b3o10boo82bo3bo8boobo28b3o11bo 10b5o5b3o7bo66bo5bo11boo7booboo39b5o$49boo7boo8boo9bo3bo5bobbo5bo8bo 65bobo7boo3boo32boo4booboo49b3o22b5o4b5o4boo3bo3boo7b3o69b3o3bo6b3o38b 3o11boo3boo3bo3bo5bo17bo28bo3bo16boo3boo10boo48boo3b3o$48bobo21bo5bo5b o5bo6boo7b3o13booboboo44boboo7b5o35bo3booboo10boo17boo3boo12bo3bo20boo 3boobboo3boo3boo7bobo5bo3bo74boo5boo9boo3boo13bobo9bo20bo5bo21b3o13boo boboo8bo3bo34bo6bo5bo34bobo3bo$49bo19bobbo6bo3bo13bobo5b5o12bo5bo17b3o 14boo8bobo9b3o23b3o15b3o12boo10bobo3boo3boo22boo14b5o4b5o13bo85bobo19b o15b5o7bo22bo3bo14boo5b5o12bo5bo11bo5b3o52boo3boo16bo$48boo22bo7b3o21b obobobo12bo3bo18bo15bobo9bo11bo16b3o7bo29bo12bo23bo5bo4boo14b5o4b5o20b o5bo87boobbo5bo11boo3boo19boo9b3o15boo4bobobobo12bo3bo18bo15boo19boobo boo12b5o3boo$48b3o29bobbo20boo3boo13b3o3bo16bo15bo38bo3bo5bo47bo3b3o 13boo3boo20bobbo6bobbo20boo3boo87bobobbooboo12boo3boo18bo11bobbo20boo 3boo13b3o3bo16bo14bobo37booboo4boo$49boo30b3o10boo34boo5boo23boo9boo6b oo18bo5bo8boo34boo4bo5b3o28boo9bo3bo6bo3bo9boo96boo4bo5bobo28boo11bo9b 3o10boo34boo5boo25bo8boo27booboo3bo5boo$47bo19booboboo7boobo9boo33bobo 5boo23b3o8boo6bobo18bo3bo9boo34boo5bo5bo29boo9bo14bo9boo96boo11bo29boo 8bobbo9boobo9boo33bobo5boo24boo8boo7boo19b3o10boo$82bobo19boo57boo16bo 21b3o21b3o55boo19boboo8boobo19boo99bo19boo18booboo9bobo19boo54bo21bobo $67bo5bo9bo20boo55bo41bobbo20b3o55bobo19bo12bo19bobo75bo43boboo18boo 11bo20boo54bobbo19bo$103bo100b3o19bo3bo10bo45bo52bo77bo46bo51bo56bo22b oo42b3o$48bo19booboo30b3o98boobo17bo5bo8b3o43boo52boo75bobo97b3o76b3o 41booboo$47b3o20bo9boo3boo20bo40b3o54bobo18bo3bo9b3o40bo20boo3boo6boo 3boo20bo71booboo19bo19bob3o16boo3boo6boo3boo20bo40b3o31boo21b3o18boob oo$46b5o29bobobobo16b5o19bo19bo3bo10bo43bo20b3o32b3o18bobbo17bo5bo6bo 5bo17bobbo70bo5bo17b3o18bo20boo3boo6bobobobo16b5o19bo19bo3bo7booboboo 19bo19b3o18b5o$45boo3boo29b5o19boo20bo18bo5bo8b3o74boo3boo17b3o18bo60b o73bo19bo3bo17bo21b5o8b5o19boo20bo18bo5bo51bo3bo16boo3boo$46b5o31b3o 41bobo17booboboo7b5o18b3o52boo3boo16bo3bo39bo3bo8bo3bo92boo3boo15bob3o bo39bobo10b3o41bobo17booboboo6bo5bo37bo5bo$46bo3bo32bo41booboo29boo3b oo16bo3bo16boo3boo96b3o10b3o116b5o54bo41booboo74bo3bo$47bobo20boo30boo 3boo15bo5bo29b5o38bobobobo50boo3boo15booboboo50booboboo137b3o30boo3boo 15bo5bo29booboo19bo20b3o$48bo21boo31b5o19bo21bo10bo3bo16bo5bo16b5o32bo 177bo97b5o19bo21bo12bo20b3o$103booboo16boo3boo17bobo10bobo17boo3boo17b 3o32bobo39bo5bo50bo5bo73bo39boo3boo51booboo16boo3boo17bobo31b5o39boo 11bo$103booboo40bobo11bo43bo35boo176bo40b3o53booboo40bobo30boo3boo50b 3o$47boo55b3o42bo92boo39booboo52booboo115bo3bo53b3o42bo32b5o51boboo$ 47boo79bo55bo56b3o41bo56bo118bobo78bo53bo3bo52b3o$82boo44bo20boo10boo 20bobo42boo10bobo64boo10boo96boo43bo21boo10boo44bo20boo10boo20bobo42b oo9boo$82boo45bo19boo10boo20bobo42boo10boo65boo10boo96boo65boo10boo45b o19boo10boo21bo43boo$183bo$183bo$105boo19boo55bobbo18boo56boo19boo56b oo96boo19boo56boo19boo56boo19boo$105boo19boo56boo19boo56boo19boo56boo 96boo19boo56boo19boo56boo19boo111$681b3o$681bobbo$681bo$681bo$682bobo 56$653bo$652b3o$652boboo$653b3o$653boo17$2510bo$2510bo$2509b3o3$2509b 3o$2510bo$2510bo$2510bo$2510bo$2509b3o3$2509b3o$2510bo$2510bo$$2495bo bboboobobbo$2494boobbo4bobboo$2495bobboboobobbo3$2491b3o$$2490bo3bo$ 2490bo3bo$$2491b3o37bo$2529b3o$2528bo$2491b3o34boo$$2490bo3bo$2490bo3b o$$2491b3o$2526bo$2525b3o$2477bobboboobobbo35b5o$2477b4oboob4o34bobobo bo$2477bobboboobobbo34boo3boo$$2474bo$2474bo51bo$2473b3o49bobo$2525bob o$2526bo$2473b3o50boo$2474bo51boo$2474bo51boo$2474bo$2474bo$2473b3o3$ 2473b3o$2474bo$2474bo$$2459bobboboobobbo$2458boobbo4bobboo$2459bobbob oobobbo3$2455b3o$$2454bo3bo$2454bo3bo$$2455b3o3$2455b3o$$2454bo3bo$ 2454bo3bo$$2455b3o3$2441bobboboobobbo$2441b4oboob4o$2441bobboboobobbo $$2438bo$2438bo$2437b3o3$2437b3o$2438bo$2438bo$2438bo$2438bo$2437b3o3$ 2437b3o$2438bo124bo$681b3o1754bo122b3o$681bobbo1875bo$681bo1741bobbob oobobbo125boo$681bo1740boobbo4bobboo$682bobo1738bobboboobobbo$2558bo$ 2557b3o$2419b3o134bo3bo$2555bob3obo$2418bo3bo133b5o$2418bo3bo$$2419b3o 3$2419b3o$$2418bo3bo$2418bo3bo$$2419b3o136boo$2558boo$$2405bobboboobo bbo$2405b4oboob4o$2405bobboboobobbo$$2402bo$2402bo$2401b3o3$2401b3o$ 2402bo$2402bo$2402bo$2402bo$2401b3o3$2401b3o$2402bo$2402bo$$2387bobbob oobobbo$2386boobbo4bobboo$2387bobboboobobbo3$2383b3o$$2382bo3bo$2382bo 3bo$$2383b3o3$2383b3o$$2382bo3bo$653bo1728bo3bo$652b3o$652boboo1727b3o $653b3o$653boo$2369bobboboobobbo$2369b4oboob4o$2369bobboboobobbo3$ 2595bo$2593b3o$2592bo$2592boo8$2587boo3boo$2588b5o$2588booboo$2588boob oo$2589b3o6$2590boo$2590boo49$2627bo$2625b3o$2624bo$2624boo7$2621b3o$ 2620bo3bo$2619bo5bo$2619booboboo3$2622bo$2621bobo$2621bobo$2622bo$$ 2622boo$2622boo17$681b3o$681bobbo$681bo$681bo$682bobo28$2659bo$2657b3o $2656bo$2656boo3$2653b3o$2653b3o$2652bo3bo$2651bo5bo$2652bo3bo$2653b3o 10$2654boo$2654boo6$653bo$652b3o$652boboo$653b3o$653boo39$2691bo$2689b 3o$2688bo$2688boo7$2683boo3boo$2686bo$2683bo5bo$2684booboo$2685bobo$ 2686bo$2686bo5$2686boo$2686boo49$2723bo$2721b3o$2720bo$2720boo3$681b3o $681bobbo$681bo$681bo2036bo$682bobo2032b3o$2716b5o$2715bobobobo$2715b oo3boo3$2718bo$2717bobo$2717bobo$2718bo$2718boo$2718boo$2718boo13$638b oo$637bobo$636bo$632booboboo3bo$632boboobo4bo$636bobooboboo$633boo3bo 5bo$633bobbo8boo$634boo9b3o$631b3obbobo6b3o$631bobbobboo6b3o$632boo11b 3o$645boo$645bo$643bobobo$642boboboo$642bobo$643boo5$639boo$639boo3$ 616boo$616boo$639bo$639bo$638bobo$637booboo11bo$636bo5bo9b3o$639bo12bo boo$636boo3boo10b3o$616b3o34boo$615bo3bo2135bo$614bo5bo17b4o2111b3o$ 614booboboo16boobbo2110bo$637boobo2111boo$984boo11boo11boo11boo$617bo 20boo343bobbo9bobbo9bobbo9bobbo$616bobo19bo344bobobbooboboobbobo9bobo bbooboboobbobo1724bo$616bobo9boo351boobbob3o3b3obobboo5boobbob3o3b3obo bboo1721b3o$616boo10boo352bobobobbobobobbobobo7bobobobbobobobbobobo 1721bo3bo$615bo22booboboo336bobboobb3ob3obboobbo5bobboobb3ob3obboobbo 1719bob3obo$614b3o15bo5bo5bo336boo17boo5boo17boo1720b5o$613bo3bo13bo7b o3bo343bobbobobbo17bobbobobbo$612bob3obo12b3o6b3o99bo229bobboo9bo3b3o 3bo15bo3b3o3bo9boobbo$613b5o5b3o115bobo227bobobbobbo5bobb7obbo13bobb7o bbo5bobbobbobo$622bob3o113bo3bo226boboobobobo4boo9boo13boo9boo4bobobob oobo$625boo114bo3bo8bo215boobobbobobo47bobobobboboo$742bo3bo5b3o215bo bboboobo3bo43bo3boboobobbo$743bo3bo3bo220boobo7bo41bo7boboo$622b3o3b3o 113bobo4boo217bo5bo3bobo7bo35bobo3bo5bo$745bo131bobbo88bo4bobo6bo5b3o 33bo6bobo4bo$626bo14boo106bo127b6o86boob3obob3oboo4bobobo24b3o5boob3ob ob3oboo$626bo14boo105bobo123bo8boboo88boobo4bo3b3ob3o23bobo5bo4boboo 1716boo$626bo39boo81boobboo86boo28bobb8oboboboboo70boo6b5o4bo9bobobo 24b3o10bo4b5o1710boo$665bobo85boo86boo28b3o7bobo3boob3o67bobo5bo4bob3o 11b3o3boo15boo17b3obo4bo$614boo14boo32bo209b3oboo3bobbo6bo65b3o6boboob obo14bo4bobo13bobo19boboboobo$614boo15bo28booboboo3bo200boobo5b4obo3b 4o66boo6boobobbo5bob4o12bo13bo12b4obo5bobboboo$628b3o29boboobo4bo147b oo51bobo5bo5bo5bo46boo19boo7bobobobo3bobbo5bo9boo11boo4bo10bobbo3bobob obo$628bo35bobooboboo145boo52boo4bobboobo4bo3bo44boo20bobo5bobobbobo7b obbobo4bo20boo5bo3bo7bobobbobo$661boo3bo5bo191bo3boo3bobboo4bob4obb4o 67bo5booboobboobb5obbo3bo4boo19boo3b3o3b5obboobbooboo$633boo26bobbo8b oo165b3o20bobobobo3b3o6bo4boo81bo10bo4bobo4boo9boo14b3o4bo10bo$629boo 4b4o23boo9b3o163booboo19bobobo9bo5b3o3b3o47bo30bobobo4bo7bo16boo23bo4b obobo$629boobboob3o20b3obbobo6b3o163booboo18boobobo8boobo5boo5bo45b3o 17boo3boo4boob4o4boo45boo4b4oboo$633bo25bobbobboo6b3o163b5o21bobo5b3ob oboo8b3o45bo3bo16boo3boo6bo3bobob3o28bo16b3obobo3bo$660boo11b3o162boo 3boo15bobb3obboo3b3o9booboo5boobo40bo31bobo7bo17b5o4boo17bo7bobo$673b oo144bo39bob3obbobo4boobboo5bo10boboo37bo5bo17b3o7booboo23bo3boboo3boo 23booboo$673bo144b3o38bo4boo4bo8bobo6bo10boo35bo5bo17b3o21b5o10boobobo 15b5o$671bobobo141b5o19boo17b3obo3bo11bo3boobo8boo3bo35bo3bo19bo14boo bbooboo3booboobboo5bo9boobbooboo3booboobboo$643boo25boboboo140bobobobo 16b5o18bobo3bo22boo3boboobo36b3o35bobbo13bobbo5bo9bobbo13bobbo$643boo 25bobo143boo3boo20bo20boo3bobbo4bo13bobo3bobbo76b4obbobbobbobb4o9bo7b 4obbobbobbobb4o$671boo166b3o20bobo3bo6booboo13bobboo103bo3bo$783b3o53b o20b3obo3bo8bo6bo6bob5o79b5obobbobbob5o4bo5boboo3b5obobbobbob5o$620boo 161b3o33bo20boo17bo4boo4bo12b3o5b3o3bo78bo4bob7obo4bo4bo3bobboobbo4bob 7obo4bo1141boo$620boo35bo125b3o32bobo19boo17bob3obbobo13booboo3boo6bo 42bo17bo17b3oboo7boob3o6b3o8b3oboo7boob3o1142boo$658bo121b3o34boobo9b oo28bobb3obboo13b3o4b3o4boo51boo5boo20bobbobooboobobbo21bobbobooboobo bbo$656b3o121b3o34b3o10boo33bobo10bo5bo5boo6bo51boo6boo22bobo3bobo7bo 19bobo3bobo$780b3o33bobbo20boo3boo15boobobo8boo13b3o3bo43bo39bobbo3bo bbo4boo19bobbo3bobbo1146b3o$816b3o21bobobobo16bobobo9boo12bob5o41bobo 20b3o17boo5boo6boo19boo5boo1147b3o$642b3o132bo37bo3bo21b5o17bobobobo 11boo10bobboo42boo19bo3bo$641bo3bo130bobo35bo5bo21b3o19bo3boo12bo8bobo 3bobbo59bo5bo$640bo5bo129boo37bo3bo5bo17bo35b3o9boo3boboobo58bo5bo$ 640bo5bo83boo48boo34b3o7bo45bo6bo16boo3bo48bobo10bo1208boo3boo$643bo 82boobboo48bobo41b3o37boo4boo27boo33boo3boo9bobo8bo3bo1207b5o$618boo3b oo16bo3bo79bobo47boo5bo81boo5boo22boboo51bobo9b3o1209b3o19boo$642b3o 77bo3bo48boo5boo26boo83boobo31boo3bo3bo5bo4bo12bo1211bo19bobo$619bo3bo 19bo78boo86boo118boo4b3o6bo5bo1242bo6boo$620b3o98boobo3boo145boo59b3o 6bo5bo1211bo30bobbobbobboboo$620b3o97bobb3obbo103bo10boo21bo8boo86boo 21bo1176boo29bo6boobboo$644b3o72bobobo5b3o55boo42bobo9boo19boo41boo38b 3o13boo19boo1172boo4boo29bobo$632boo10b3o71bobobo8bo55boo43boo31boo40b oo76boo1167boobboo4b3o29boo$632boo9bo3bo68b3obbo148boo23boobo30b3o 1222boobboo4boo$637bobo77boboo95boo14boo35boo24boboo30b3o4boo14boo 1209boo$637boo3boo3boo69boo18boo76boo15bo37bo27boo27bo3bo3boo15bo1209b o$619bo5bo12bo80bo69boo39b3o46bo16boo3bo48b3o$618b3o5bo109bo3bo89bo48b 3o9boo3boboobo25boo3boo16bo$618b3o3b3o109bo4bo67b3o31bobo18bo3boo12bo 8bobo3bobbo7bo1279b3o$738bobobo65bo3bo19bobboo7boo17bobobobo6boo3boo 10bobboo9b3o42bobboo1230bo3bo$616boo3boo116bobobo63bo5bo17bo3boobboo3b o18bobobo7boo5b3o6bob5o9b3o41bo3boobboo1225bo5bo$616boo3boo70bo46bo4bo 39boo3boo16bo3bo18bo7boo21boobobo9bo6bo6b3o3bo53bo7boo1225booboboo$ 691bobo47bo3bo40b5o18b3o20b4o18bo10bobo16bo5boo6bo6boo3boo19b3o18b4o 18bo$684bo5bobo11boo80booboo18b3o40boo6bobb3obboo20b3o4boo6boo3boo16b oo42boo19boo11boo11boo11boo$619bo12boo49b3o3bobbo11boo36boobbo39booboo 62boo4bob3obbobo11b3o3b3oboo6bo29boo43boo17bobbo9bobbo9bobbo9bobbo 1154bo$618bobo24boo35bo3bo3bobo52bobo39b3o69bo4boo4bo5b3o12b3o3bo29boo 63bobobbooboboobbobo9bobobbooboboobbobo1153bobo$620boo12boo9boo37bo6bo bo52boo112b3obo3bo6bo3bo4bo6bob5o9boo19bobo59boobbob3o3b3obobboo5boobb ob3o3b3obobboo1151bobo$620boo59bo5bo5bo48boo118bobo3bo6bo3bo4bo8bobboo 9bobo19boo60bobobobbobobobbobobo7bobobobbobobobbobobo1153bo$619b3o59bo 5bo53bobo55boo10b3o50boo3bobbobbo3bo4bo6bobo3bobbo5bobboo8boo69bobboo bb3ob3obboobbo5bobboobb3ob3obboobbo$618bobo13boo46bo3bo54bo5boo50boo5b o3booboo47bobo3bo7boo13boo3boboobo6boo9boo69boo17boo5boo17boo1151boo$ 618boo15bo47b3o54boo5boo55boo4booboo45b3obo3bo11bo3boobo8boo3bo6boo19b oo3boo60bobbobobbo17bobbobobbo50boobo101boobo97boobo94boo5boobo90boo5b oboo94boo5boobo92boobo5boo99boobo115boobo101boobo97boobo55boo44boobo 92boo5boobo92boo5boboo90boo5boobo96boobo5boo$632b3o170boo3b5o44bo4boo 4bo8bobo6bo10boo8bo13boo4boo3boo45bobboo9bo3b3o3bo15bo3b3o3bo9boobbo 35boboo101boboo97boboo95bo5boboo91bo5boobo95bo5boboo92boboo6bo99boboo 115boboo101boboo97boboo101boboo93bo5boboo93bo5boobo91bo5boboo96boboo6b o67bobbo19boo11boo$632bo159bo16boo3boo43bob3obbobo4boobboo5bo10boboo 24boo55bobobbobbo5bobb7obbo13bobb7obbo5bobbobbobo38boo97boo99boo4boo 92bo10boo88bo4boo98bo4boo4boo94boo3bo98boo4boo111boo4boo103boo93boo 103boo4boo90bo10boo90bo4boo94bo4boo4boo98boo3bo66b6o18bobbo9bobbo$786b o3bobo67bobb3obboo3b3o9booboo5boobo4bo5bo21b3o46boboobobobo4boo9boo13b oo9boo4boboboboobo38bo98bo100bo5bo93boo9bo89boo4bo98boo3bo5bo95bo4boo 97bo5bo112bo5bo104bo94bo104bo5bo91boo9bo91boo4bo94boo3bo5bo99bo4boo61b oobo8bo15bobo3booboo3bobo$637boo146b3o3boo49bo22bobo5b3oboboo8b3o11bo 5bo21b3o45boobobbobobo47bobobobboboo38bo98bo100bo5bo104bo93bo105bo5bo 95bo103bo5bo112bo5bo104bo94bo104bo5bo102bo95bo101bo5bo99bo62boobobobob 8obbo10boobbobo7bobobboo$633boobobboboo141b5o51boo20boobobo8boobo5boo 5bo11bo3bo6bo16bo46bobboboobo3bo7bo35bo3boboobobbo37boo97boo99boo4boo 92boo9boo88boo3boo98boo3boo4boo94boo3boo97boo4boo111boo4boo103boo93boo 103boo4boo90boo9boo90boo3boo94boo3boo4boo98boo3boo55b3oboo3bobo7b3o11b obobo4bo4bobobo$633bo4bobboo140bobobobo8b3o40boo20bobobo9bo5b3o3b3o13b 3o5bobo65boobo7bo6bo26bobo5bo7boboo35boobo101boobo97boobo95bo5boobo91b o5boboo95bo5boobo92boobo6bo97bo5bo112bo5bo100boobo97boobo101boobo93bo 5boobo93bo5boboo91bo5boobo96boobo6bo54bo4b3obbo3bo3boo13bobboobb7obboo bbo$637bo145boo3boo20boo51bobobobo3b3o6bo4boo25boo63bo5bo3bobo6bobo26b o7bobo3bo5bo33boboo101boboo97boboo94bo6boboo90bo6boobo94bo6boboo92bob oo5bo99bo5bo112bo5bo99boboo97boboo101boboo92bo6boboo92bo6boobo90bo6bob oo96boboo5bo56b3o3boob4obo3boboo10boo5bobobobo5boo$634bobo157bo69bo3b oo3bobboo4bob4obb4o84bo4bobo6bo6bo27bo6bo6bobo4bo36boo97boo4boo99boo 92boo3boo94boo9boo92boo3boo4boo88boo9boo97boo4boo111boo4boo103boo93boo 4boo103boo90boo3boo96boo9boo88boo3boo4boo92boo9boo56bobo3bo5bo4bobbo 19bobo$664bo18boo109bo77boo4bobboobo4bo3bo84boob3obob3oboo6bo23boo9boo b3obob3oboo36bo98bo5bo100bo98bo107bo97bo5bo89bo109bo5bo112bo5bo104bo 94bo5bo104bo96bo109bo93bo5bo93bo66bo8boboobboobboo17b3o5b3o9boobbo$ 655bo8boo17boo101bo7bo76bobo5bo5bo5bo92boobo4bo30boo4boo3bo4boboo43bo 98bo5bo100bo92boo4bo94boo9bo93boo4bo5bo89bo9boo98bo5bo112bo5bo104bo94b o5bo104bo90boo4bo96boo9bo89boo4bo5bo93bo9boo54b5ob4obo4b3o5boo3bo7bobo bo3bobobo5bobbobbobo$654bobobboo4boo8boo108bobo24boo57boobo5b4obo3b4o 39boo44b5o4bo34b3o6bo7bo4b5o36boo97boo4boo99boo93bo3boo95bo9boo93bo3b oo4boo88boo10bo97boo4boo111boo4boo103boo93boo4boo103boo91bo3boo97bo9b oo89bo3boo4boo92boo10bo59boo4bo4bob3o3bobobobo6boobb5obboo4boboboboobo $654bobobboo4b3o7boo108bobo8b3o13boo60b3oboo3bobbo6bo31bobo4boo43bo4bo b3o11bo5boo15bobo3bo12b3obo4bo31boobo101boobo97boobo94bo6boobo90bo6bob oo94bo6boobo92boobo5bo100boobo115boobo101boobo97boobo101boobo92bo6boob o92bo6boboo90bo6boobo96boobo5bo57b5ob3o4booboo6bobobo22bobbobobboboo$ 655bo3boo4boo119bo84b3o7bobo3boob3o33boo49boboobobo14boo3bobo13boboo3b 3o12boboboobo31boboo101boboo97boboo94boo5boboo90boo5boobo94boo5boboo 92boboo5boo99boboo115boboo101boboo97boboo101boboo92boo5boboo92boo5boob o90boo5boboo96boboo5boo55bo5boo4booboboo5booboboo23bobboobobbo$664boo 119boo84bobb8oboboboboo35bo49boobobbo5bob4o4boo6bo13bo9bobb4obo5bobbob oo1657b5o6boobo3bo5bobobbo19b3o3bobob3o$664bo120boo14boo71bo8boboo18b oo14boo54bobobobo3bobbo15boo11boo6boo7bobbo3bobobobo1651boboo5boobbo5b obo4bobboobboboboo17boo5boboo$652boo3boo126boo15bo27bo46b6o22boo15bo 27bo26bobobbobo7bo38bobbo7bobobbobo1651boobo5b3obo6bobbobo4b3o3boobo 16bobbo3bobobbobo$652boo3boo140b3o26boo47bobbo38b3o26boo26booboobboobb 5o31bo3bo7b5obboobbooboo137bo205bo205bo429bo205bo205bo205bo50boo13boo 3b3o8boboboo4bo8b3o4b3obbooboboobboo$799bo29boo88bo29boo28bo10bo13bo8b oo6boo4bo8bo10bo140b3o203b3o203b3o427b3o203b3o203b3o203b3o47bo3boo15bo 10bo4bob3oboo6b3o5boo3boboo$654b3o322bobobo4bo16boo6boo7boo14bo4bobobo 35bo107bo97bo107bo97bo107bo97bo103bo119bo107bo97bo107bo97bo107bo97bo 107bo46boboobo3boo15boo4boo3bobo3bo8bo11bo4b5o$654b3o148b4o116b4o49boo b4o4boo4b3o6boo23b3o4boo4b4oboo34b3o104boo97b3o104boo97b3o104boo97b3o 101b3o117b3o104boo97b3o104boo97b3o104boo97b3o104boo47boo5bobo14bo3bobb oobboobo3bobboo17b3obo4bo$655bo144boo7bo110boo7bo50bo3bobob3o5bo39b3ob obo3bo39bo90bobbo111bo205bo90bobbo111bo103bo119bo205bo205bo205bo154bo 4bo16bo6boo3bobob3obobo11boo6boboboobo$800boobboo3bo110boobboo3bo50bob o7bo45bo7bobo27boo9boo89bo114boo193boo9boo89bo114boo91boo9boo118boo88b oo103boo9boo90b4o110boo88boo114boo90b4o60bobbo3bo14bo3bobbo4boboo4bo4b o8b4o6bobboboo$804boobbo115boobbo50booboo33bo25booboo25b4o97boo204bob ooboo98b4o97boo207b4o114boo106bo99b4o96boobo4bo95boo106bo199boobo4bo 59boobobo7bo9boo4boboboo4boobo3bo8bobboo5bobobobo$993b5o12bo4boo12b5o 35bobooboobo93bo6boobo94bobobbo97booboobboo93bobooboobo93bo6boobo94bob obbo97bobooboobo113bo102boobbobo94bobooboobo94bo3bo4bo95bo102boobbobo 94boob6o94bo3bo4bo59bo4bo8boo3bo10b3o3boobobo4b3o12bobboboobobo$985boo bbooboo3booboobboo5boo3boo3boobbooboo3booboobboo26bobboo101bo3bobbo94b 3oboboo95bo100bobboo101bo3bobbo94b3oboboo94bobboo117boobb3o96bobb3obob o91bobboo99bo4boo97boobb3o96bobb3obobo92boob6o94bo4boo61b3o4bobbo3bo6b o8boobboboboo12b3o3b4o3boobbooboo$985bobbo13bobbo4boo9bobbo13bobbo25b 3obboobboo96b3obo3bo92bo6bo103boo91b3obboobboo96b3obo3bo92bo6bo94b3obb oobboo112bo3bob3o95b6obbo90b3obboobboo94bobbo4boo94bo3bob3o95b6obbo92b oo101bobbo4boo59bo4bo12b3o10bobobbo20boobbobb3obbo$654boo330b4obbobbo bbobb4o17b4obbobbobbobb4o26b3obbob4o93bo11bo92bo5boo95boo5boo91b3obbob 4o93bo11bo92bo5boo93b3obbob4o112boobo4bo96booboo93b3obbob4o94bobbo3bo bbo93boobo4bo96booboo95boo5boo94bobbo3bobbo58boobobo24booboboo15bo5bo 5boobobo$654boo282bo129bobbo3bobbo93bo3bob3o198boo99bobbo3bobbo93bo3bo b3o197bobbo3bobbo113bobo97bobb6o93bobbo3bobbo94boo4bobbo95bobo97bobb6o 94boo5boo95boo4bobbo58bobbo3bo23bobobo5bo16bobboboobboboo$936boo48b5ob obbobbob5o6bo5boo3b5obobbobbob5o28b4obobb3o93bobbo3bo94boo5bo104bo93b 4obobb3o93bobbo3bo94boo5bo96b4obobb3o108bo4boboo95bobob3obbo93b4obobb 3o96boo4bo91bo4boboo95bobob3obbo93boo5boo98boo4bo58bo4bo10boo11bobobob o4bo16bobbobboo3bo$937boo46bo4bob7obo4bo3boo6boobbo4bob7obo4bo27boobb oobb3o93boboo6bo92bo6bo95boobbooboo93boobboobb3o93boboo6bo92bo6bo95boo bboobb3o108b3obo3bo97bobobboo94boobboobb3o93bo4bo3bo91b3obo3bo97bobobb oo101boo95bo4bo3bo56boo5bobo8bo8bo3boo3bo5b3o15bo7bobo$986b3oboo7boob 3o5boo10b3oboo7boob3o33boobbo100boo94boobob3o97booboobo99boobbo100boo 94boobob3o101boobbo111b3obboo98bo104boobbo94bo4boboo94b3obboo98bo99b6o boo95bo4boboo56boboobo3boo9b3o6bo25b3o10booboo$826boo118boo40bobboboob oobobbo21bobbobooboobobbo30bobooboobo100bo98bobbobo10b3o185bobooboobo 100bo98bobbobo96bobooboobo117bo102boo95bobooboobo96b4o103bo102boo95b6o boo96b4o60bo3boo16bo4b3o17boo4b7o4boo$826bobo117bobo42bobo3bobo27bobo 3bobo34b4o100bobbo114bobbo186b4o100bobbo202b4o120boo200b4o206boo369boo 44bobbobbooboboobbobbo$828bo119bo41bobbo3bobbo25bobbo3bobbo34boo222bo 187boo308boo324boo580boobo31bo9boob4o3b4oboo$798boo28boo118boo41boo5b oo27boo5boo259bo1405boboo30bo7b3obbo11bobb3o$799bo492bobo1440b3o4bo3b ooboo7booboo3bo$799bobo1941bobo3boo7boo3bobo$800boo17boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo10boo10boo10boo10boo10boo13boob3o3bo5bo3b3oboo$ 818b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o8b4o8b4o8b4o8b4o8b4o13bo5boo 7boo5bo$817booboo19booboo19booboo19booboo19booboo19booboo19booboo19boo boo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19boob oo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19boob oo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo7booboo7booboo7booboo7booboo7booboo13bob4o11b4obo$818boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo10boo10boo10boo10boo10boo16boobbo11bobb oo$2673boo60bo$2673bobo59b3o$1929b3o741bo58bo5bo10bo8boo$1065bo104bo 100bo104bo100bo104bo100bo103bo119bo20bobbo80bo100bo104bo100bo104bo100b o104bo51bo48boo4bobo8bobo7bobo$1065b3o102b3o98b3o102b3o98b3o102b3o98b 3o101b3o117b3o21bo80b3o98b3o102b3o98b3o102b3o98b3o102b3o49b3o29booboo 12bobo3b5o6b3ob3oboobbobboo$1063boo3bo99boo3bo95boo3bo99boo3bo95boo3bo 99boo3bo95boo3bo98boo3bo114boo3bo20bo78boo3bo85b3o7boo3bo99boo3bo95boo 3bo99boo3bo95boo3bo99boo3bo51bo10bo8boo8bobo6bo14b3o7booboo3boboobobo$ 804boo251boo3bo3boobo97bo3boobo88boo3boboboobo97bo3boobo88boo3bo3boobo 89boo6boboboobo88boo3bo3boobo88bobo5boboboobo104boo6boboboobo16bobo73b oo3bo3boobo84bobo6bo3boobo89bobo5boboboobo88boo3bo3boobo97bo3boobo88b oo3boboboobo97bo3boobo44boo3boo9boboobo4bobo6bobbobooboobo22boboboboob o4bo$800boobboo251boo4b3obobo84bo3bo8boo3bobo88boo4bobobobo86bo11b3obo bo88boo3boo3bobo88bob4o4bobobobo88boo4b3obobo97bobobobo103bob4o4bobobo bo92boo4b3obobo83boob5obboo3bobo98bobobobo88boo4b3obobo87b3o7boo3bobo 88boo4bobobobo88bo8boo3bobo26booboo13bobo13bo3boboboobbobboobb3obbobo 3bo18bo3bo4bob3obobobo$799bobo261b3oboboo83booboo8b3obboboo97boboo87b 3obo5b3oboboo92b3obboboo86boo5boo6boboo93b3oboboo85bobobbo9boboo101boo 5boo6boboo87bobo7b3oboboo82boob3o4b3obboboo86bobobbo9boboo93b3oboboo 84boo10b3obboboo97boboo84bobo9b3obboboo26bobobo3boo7bo6b3o15boboobobo 20booboboo3boo4boo5bo3bo3bo$800bo266bo87boboo3boo4bobobo97bobbo91bob3o 8bo96bobobo92boobbo4bobbo100bo87boobo9bobbo107boobbo4bobbo89bobbo11bo 88b3o5bobobo88boobo9bobbo100bo87boo3bo7bobobo97bobbo86boobo10bobobo28b obbob5obo22bobobobbobobobbo6boo4boobo9bobo6bo3boo10booboo$1064boobo87b o6bobo3bobobo98bobo88b3obobbo5boobo96bobobo91b3o8bobo97boobo88bo3bo8bo bo106b3o8bobo89bobbo8boobo88boo6bobobo89bo3bo8bobo97boobo89boobo7bobob o98bobo87boo4bo6bobobo28b3obooboobo12bo5bo3boo4bo3bobbobbo4bob4o4boo3b o6bobbo7boo5bo3bo3bo$795b3o4boo260booboo88bo4bo6booboo86bo9booboo86bo bbo3bo6booboo85boo9booboo100booboo85boo9booboo88b4o7booboo115booboo89b oo9booboo96booboo89b4o7booboo96booboo100booboo96booboo89b5o6booboo30bo 4bobo12bo5bo3bo6boobboobobo4boo9bo3bo5bo3bo7bo4bob3obobobo$795b3o4bo 352bobbo4bo95boo102boo101bo203bobo103bo430bo204b3o202b3obbo40boobo4b3o 6bo3bo5bo3bobbo8boobboo11bobbo3bo3bo4bo8boboboboobo4bo$795b3o5b3o247b 3o99bo102boobo201bobo104bo101bo222bo516b3o201bo3boo40bobboo4b3o5b3o12b o6boobboobobo4boo9bo22booboo3boboobobo$792b3o10bo246boobbo99bobo99bo 106bo96bo107bo324bo721boboo41b5o6boo3booboo3b3o5boo4bo3bobbobbo4bob4o 4boo9bo11b3ob3oboobbobboo$792b3o258boboo102bo97boo3boo99bobo96bobbo4bo 99bobo97boo223bobo616bo104boo51b3o4b3o13bobobobbobobobbo6boo4boobo8bob o3b3obo3bobo7bobo$792b3o260boo7booboo89boo9booboo89boo5booboo89boo9boo boo84bo4bo6booboo89bobo8booboo82bobbo3bo6booboo99booboo104bobo8booboo 100booboo85bo10booboo100booboo85boo9booboo100booboo85b4o7booboo100boob oo28b5o6boo5bo23boboobobo21bobbo4bobobo3bo8boo$1051bo12boobo100bobobo 82bo3bobboo7bobo101boobo83bo6bobo3bobobo91boo9bobo84b3obobbo5boobo101b obo106boo9bobo101boobo86boobo6bobobo102bobo85bobbo8boobo100bobobo85bo 3bo8bobo100bobobo29bobboo4b3o8bo5bo6bo3boboboobbobboobb3obbobo3bobb3ob ooboo$1049boobb3o11bo100bobobo81bo5bo9bobbo104bo83boboo3boo4bobobo101b obbo87bob3o8bo100bobbo116bobbo104bo87boo7bobobo101bobbo85bobbo11bo100b obobo84boobo9bobbo100bobobo30boobo4b3o9boobb5o3boboobo4bobo6bobboboob oobo3boobbo7bobobboo$1051boboo8b3oboboo96b3obboboo79b5o13boboo97b3obob oo79booboo8b3obboboo101boboo83b3obo5b3oboboo100boboo116boboo97b3oboboo 92b3obboboo101boboo83bobo7b3oboboo96b3obboboo82bobobbo9boboo96b3obbob oo28bo4bobo4bobboobboobbooboo4bo8boo8bobo6bo4bobobobbo4bo6bo$1054bo8b 3obobo7bo84boo3boo3bobo7bo86bobobobo7bo84boo4b3obobo7bo72bo3bo8boo3bob o7bo84boo4bobobobo7bo74bo11b3obobo7bo83boo4bobobobo7bo99boo4bobobobo7b o84boo4b3obobo7bo80boo3boo3bobo7bo84boo4bobobobo7bo80boo4b3obobo7bo84b oo3boo3bobo7bo86bobobobo7bo84boo3boo3bobo7bo18b3obooboobo3bob4oboo7bob o20booboo14bobo3b3o3b3o$1062bo3boobo5b3o84boo3bo3boobo5b3o85boboboobo 5b3o84boo3bo3boobo5b3o85bo3boobo5b3o84boo3boboboobo5b3o85bo3boobo5b3o 83boo3boboboobo5b3o99boo3boboboobo5b3o70boo12boo3bo3boobo5b3o80boo3bo 3boobo5b3o84boo3boboboobo5b3o80boo3bo3boobo5b3o84boo3bo3boobo5b3o77bob o5boboboobo5b3o84boo3bo3boobo5b3o18bobbob5obo7boboo5bo4bo34bo8bo$1042b oo19boo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo68boo19b oo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo71boo19boo3bo5bo87boo19boo3bo 5bo72bobbo17boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo 72boo19boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo22bobobo3boo4bo3bo7bo 3bobbo42bob4ob5o$1042boo21b3o6boo71boo21b3o6boo67boo21b3o6boo71boo21b 3o6boo67boo21b3o6boo71boo21b3o6boo67boo21b3o6boo70boo21b3o6boo86boo21b 3o6boo71bobobb3o15b3o6boo67boo21b3o6boo71boo21b3o6boo67boo21b3o6boo71b oo21b3o6boo67boo21b3o6boo71boo21b3o6boo20booboo11bobobo4b3o4boo34boobb oobboobo3boo3bo$1065bo104bo100bo104bo82bo17bo104bo89b4o7bo93bo9bo119bo 82bobbo3bo14bo100bo94bo9bo100bo104bo100bo104bo54bo5bo35bobboobobo5boo 4bo$1457boo212bo4bo98bobo215bo3bo122bo85bobo222bo99b3o142boo7bob4ob5o 30boobo3bob4obobb5o$1260b3o194booboo208bo5bo99boo216b3o22bo73boo24bobo 85boo101bo119bobo98b3o88bo53b6obboobo3boo3bo33boo3bo3bobobbo4bo$1046b oo212bobbo193booboo22bo184b3ob3o341booboo70bobbo22bo3bo187bo118bo3bo 72boo22bo3bo88bo50bo3b3obo5b3o3bo32b3o3bo3bobo6b3o$1045bobbo3b3o17bo 14b3o74bo89b3oboo3bo119bo75bobbo20b3o75b3o105b3o226b3o193boo23b3o188bo 119b3o72bobbo20bo5bo85b3o50boo3bobob4obob6o31bobb8oboboboboo$1045boob oobb3o16b3o12bobbo60bo11bobo9booboboo71b5oboobobbo10boo3boo86bo13b3o 74b3o7bo13b3o74bo3bo21boo3boo70bo4b3o16boo3boo73bo129bo3bo102bo11bo5bo 94boo3boo74bo107bo109bo11boo3boo70bo5boo17bo3bo75bo66boobboo3bo4bo4bo 33bo8boboo$1046bobo6bo14b5o14bo59bobo11boo9bo5bo70booboobboo4bo10bo5bo 85bobo11b5o72boo8bobo94bo12bo7bo5bo69bobo4bobboo13boo3boo72bobo127bo 106bobo91bo99bobo105bobboo105bobo92boobo17b3o75bobo25bo36b3o3bo3bobobb obob3o37b6o$1047b3o4boo13bobobobo13bo59bobo23bo3bo72bobo5bobbo102boob oo9bobobobo73boboo5boo10boo3boo71bo5bo10bobo83bobo3booboo15b5o73bobo 22boo3boo98bo5bo8boo3boo85bobo10booboboo73b3o11bo86bobo22boo3boo75bo3b o106bobo91boobbo95bobo24b3o35bobb8obobo3boo39bobbo$1048b3o3boo13boo3b oo10bobo61bo25b3o74bo7boo13bo3bo81bo3bobbo10boo3boo75boo4bo12boo3boo 72bo4boobo8boo8bo3bo71bo4b5o16bobo75bo125boboo4bo102bo91bobbo8bobo87bo 105bobboo15b5o87bo90bobobobo96bo3bo20b5o37bo8boboo$1049boo102boboo120b 3o82bo4bo94boo104bo19b3o181bo19bo3bo96bo18bo3bo181boo9boo92bo19bo3bo 77boo16bob3obo178bob3o11bo89b5o15boo3boo39b6o$1151boobooboo203bo3bo 201bo120b3o79bobbo18b3o97bo19b3o81bobbo201bobbo18b3o97bo3bo82b3o108bob o87bob5o16b5o40bobbo$1066bo5bo78boobbob4o222bo387bo3bo17b3o117b3o81bob oo201bo3bo17b3o98b3o79b5obo109boo85b3o4boobo14bo3bo$1064bobo4bo5boo73b 4obobboo20boo99boo97bo5boo99boo103boo99boo74bo3bo23boo118boo75boobo24b oo99boo75bo3bo23boo94bo4boo74bob5o22boo99boo73boboo4b3o13bobo3boo$ 1065boo4bobobbobbo74boobooboo18bobbo99boo73bo3bo19bobobbobbo89bobboobb obbo77bo25boo98bobbo74bobbo23boo92bo25boo75bobbo23bobbo96bobbo76bobbo 23boo98bobbo73b3o24bobbo99boo75b5obo16bobbobbo59bobbo$1052boo18bo3bo 79boobo197bo4bo20bo3bo75boo13bobo87bo125bo79bo118bo129bo75boo104bo98b oo24bo179b3obo99b5o82b6o$1047boo3b3o21bo85bo10boo77boo7bo21bo71bobbo3b o24bo70bo4boo14boo87boboo4bo17bo71b5o4bo18bo84bo19bo85bo4boobo25bo72bo 30bo75bobbo107bo19bo71boobbo23bo73bo104bobobobo21bo80bo3bo74boobo8bo$ 1047boo4b3o20bobo3bo78bobo9boo5boobo67bobbo5bobo19bobo69booboo28bobo3b o62boo5boobo20boobo80bo5bo15bobo70booboo3bobo17bobo3bo77bobo17bobo83bo 5bo27bobo70bobo29bobo3bo70b3o20boobo82bobo17bobo70bo3bo23bobo3bo66bobo 28boobo71bobboo22bobo82bobo16boobo49boobobobob8obbo27boo$1047bo6bobo 20bobo3bo77bobo18bobobboo61bo4boobbooboo18bobbobboo65bobo30bobo3bo61bo bo8boo20bobobboo75bo21bobbobboo64boobbo4bobo18bobo3bo76bobo17bobbobboo 84bo27bobbobboo65bobo30bobo3bo70bo23bobobboo77bobo17bobbobboo64boobbo 25bobo3bo65bobo30bobobboo66boboo23bobbobboo77bobo18bobobboo42b3o6bobo 3bo3b3o27boo$1048b3obbooboo20bo4bo78bo20bo4bo61bobboboob5o23boboo66bo 32bo4bo62bo7b3o22bo4bo76bo3bo20boboo67b3o4bo20bo4bo77bo22boboo79bo3bo 32boboo66bo32bo4bo95bo4bo78bo22boboo67bo27bo4bo66bo32bo4bo67boo5bo22bo boo78bo20bo4bo41bo4bobbobo3bo3boo$1048b3o3bobbo21b4o101bo66bo3boob3o 23boo104b4o70bobbo23bo81b3o19boo70b3o27b4o99boo84b3o31boo104b4o73boo 22bo103boo67bo32b4o96bo4bo75bobbo20boo104bo46b5obbob4obo3boboo$1055boo 127bobbo63bobbo210booboo21bobbo168b3ob3o433bobbo20bobbo169bo130bobo4bo bbo73boo127bobbo44bo4boo5boboboobbo4boobo42boo$1252b3o210booboo192bo5b o100b3o228b3o101boo94b3o97bo131boo218b3o35bo3boo3boboobboobboo5boboobo 19bo21boo$1468boo192bo4bo101boo228bo3bo196boo450bobbo34b5ob4obo14bo4bo 18bobo$1283boo182bo21boo170b6o252boo78bo3bobbo118boo525bo48bo8bobboobo booboo16bo3bo$1042boo15boo6boo78boo15boo9bo72boo15boo8boo6boo68boo15b oo6boo74boo15boo6boo8boo68boo15boo8boo72boo15boo8boo75boo15boo6bobo92b oo15boo6bobo7boo68boo9b3obbobo7bo74boo15boo8bo7boo68boo15boo6bobo73boo 15boo6bo79boo15boo8bo73boo15boo10bo75boo15boo5bo20bo39b3o3b3o3bobo6bob obobobo18b3o$1042boo15boo6bobo77boo15boo8boo72boo15boo7bobo76boo15boo 6bobo73boo15boo6bobbo76boo15boo7bobo72boo15boo8boo75bo16boo4bo3bo92boo 15boo4bo3bo77boo13bobbo7b4o71boo15boo8bobo75bo16boo4bo3bo73boo15boo4bo bo79boo15boo8bobo71boo15boo9bobo74boo15boo4bobo20bobo35bo6bo4bobbobobo 4bobobobo16boo3boo$1070bo102boo4boo92b3o4boo99bo101bo100b3o4boo91boo7b o93bo119bo97boo9b4o100boo96bo99bobo110boo97boobo94boo3bo58boobbobo7bo bboo3bobobooboo$1067bobbo101b3o4boo91b3o4bobbo95bobbo101bo99b3o4bobbo 89b3o7bo92bo4bo114bo4bo104bobbo100boo95bo4bo94bobbo110boo97booboo93boo 3bo46booboo18booboob3obbo3bobo41b3o$1070bo102boo98b3o5bo99bo101bo100b 3o5bo91boo101bo119bo108b4o100boo96bo99bobo110boo97boobo94boo3bo47bobo 6bo3bobobo4bobbo13bo$1060boo5bobo95boo7boobboo86boo6bobo94boo5bobo91b oo5bobbo94boo6bobo90boo7boo93boo3bo3bo110boo3bo3bo95boo6b4o89boo7bobo 93boo3bo3bo91boo3bobo97boo7bobo89boo8bobo92boo3bobo47bobbobbobbobo3bob 3o3bobo8boboboo42bobo$1059bobo5boo6bobbo85bobo8bo89bobo7boo93bobo5boo 6bobbo81bobo5boo95bobo7boo89bobo7boo4bobbo84bobo5bobo109bobo5bobo94bob o6bo6bobbo81bobo7bo94bobo5bobo90bobo5bo7bobbo85bobo7bo90bobo9bo92bobo 4bo48b3oboobob3o11bo9boo24bo21b5o$1059bo18bo85bo18boo80bo15b4o85bo18bo 81bo18boo84bo15b4o81bo18bo84bo15b4o100bo15b4o85bo18bo81bo18boo84bo15b 4o81bo18bo85bo18boo80bo15b4o85bo18boo38boboboboo15bo6bo25bo20boo3boo$ 1058boo14bo4bo83boo14boobo81boo14bo4bo83boo14bo4bo79boo14boobo85boo14b o4bo79boo14bo4bo82boo14bo4bo98boo14bo4bo83boo14bo4bo79boo14boobo85boo 14bo4bo79boo14bo4bo83boo14boobo81boo14bo4bo83boo14boobo39boboo3bobo13b obo5bobbo22bob3o16boo3boo$1074boobbobo17boo79boobbobbo21bo71bo3bobo21b o76boobbobo17boo75boobbobbo17boo78bo3bobo21bo72boobbobo20boo75bo3bobo 19bobo91bo3bobo19bobo76boobbobo18boo74boobbobbo18bo78bo3bobo19bobo72b oobbobo18bobo77boobbobbo18bo74bo3bobo20bo77boobbobbo17bo16bo3boo4bo7bo 4bo3bo4bo$1079boboo7bo5bo3bo83bobo20b4o70bo3bobo19boo81boboo7bo5bo3bo 79bobo8bo8bobo78bo3bobo19boo77boboo17bobo76bo3bobo17bobbo92bo3bobo17bo bbo81boboo16b3o78bobo18b4o76bo3bobo17bobbo77boboo14bo3bo82bobo18b4o72b o3bobo19bobo80bobo15bobo16boo7boo6b3o4bobo5boo29bo$1089bobo3bo5bo8boo 73bo20boobobo3boo70bo18boo4boobboo82bobo3bo5bo8boo69bo8bobobboo6bo7boo 74bo18boo4boobboo88b3o4boob3o73bo16boo10boo89bo16boo10boo82bobo9boobo 5boo69bo20b4o5boo74bo16boo10boo86bo12boo73bo20b4o5boo70bo22boo4boo73bo 9bo5bobo11boo13boo5bobobo4bo7boboboo21boboo18boo$1089bobobboobo3bo8boo 93b3obobbobboo70bo17b3o4boobboo82bobobboobo3bo8boo78bobobobbobbobbo7b oo74bo17b3o4boobboo87b3o4bobb4o73bo8bo5boo3bo8boo89bo8bo5boo3bo8boo82b o6bo4bobbo5boo90bobbo5boo74bo8bo5boo3bo8boo78b3o4bo4bo8boo94bobbo5boo 70bo22boo4boo82b3o3bobbo11boo4boo7boo4b3ob3o17bo20boo18booboo$1079bobb o7bo4bo5bo82boo20boobobo72bobbo18boo4boo76bobbo7bo4bo5bo78boo9bo3boo6b o80bobbo18boo4boo72bobbo7bo8b3o4boo74bobbo7bobo6boo5boo91bobbo7bobo6b oo5boo77bobbo12bo5boobo75boo14bo5b4o78bobbo7bobo6boo5boo73bobbo6b3o5bo 86boo14bo5b4o74bobbo22boo78boo7bo3bo3bobo17bo3boo4bo5bobobo12bo3bobo 30boo8bobbo$1079boo15bo3bo83boo21b4o74boo9bo10boo81boo15bo3bo79boo18bo bo82boo9bo10boo77boo9bo9bobo80boo7bo3bo6bobbo4bo91boo7bo3bo6bobbo4bo 76boo9bo4bo3b3o78boo14bo4b4o80boo7bo3bo6bobbo4bo72boo7bo3bo4bo3bo82boo 14bo4b4o76boo20bobo80boo9bo6bobo17boboo3bobo6b3o13bobobooboo28boo11bo$ 1098boo95bo12bo86b3o10bo100boo100boo93b3o10bo87bobo9boo90b3o8bobo106b 3o8bobo94boo5boo100bo93b3o8bobo85bo5bo5bobo103bo101bo90bo5bo5bo18bobob oboo8bo5bobo7bobobobo14boo3boo18bo$1087boo3boo100b3o98b3o100boo3boo94b oo3boo100b3o97booboo98boo3boo113boo3boo304boo3boo95bo3bo305bo5bo21b3ob oobob3o14boo5bobobobobo14boo3boo19boo$1087bo5bo99b5o200bo5bo94boo3boo 199bo5bo631b3o204bo102bo3bo22bobbobbobbobo9boo3bo6boobobooboo14b5o7bo$ 1192bobobobo94boo3boo200b5o99boo3boo97bo325boo3boo508b3o102b3o24bobo6b o10bo14bo4bo16bobo9bo$1088bo3bo99boo3boo94boo3boo99bo3bo97bobo100boo3b oo94boo3boo424b5o306b5o96b5o127booboo17b3o11boboobo26b3o11boo3boo$ 1089b3o308b3o632bo3bo95bob3obo304bob3obo94boo3boo150bo12boobo17b3o22b 5o$1501b3o532b3o97bo3bo306bo3bo96b5o158bobo50b3o$1195bo100bo310bo99bo 328b3o98b3o308b3o97bo3bo159boo51bo$1194bobo98bobo308bobo98bo430bo310bo 99bobo160bo$1194bobo97boo309boo99bo843bo199b3o3b3o$1195bo98boo309boo$ 1195boo97b3o308b3o1130boo14bo$1090boo103boo98bobo103boo99boo102bobo99b oo102boo118boo103boo99boo103boo99boo103boo99boo103boo60bobo18boo14bo$ 1090boo103boo99boo103boo99boo103boo99boo102boo118boo103boo99boo103boo 99boo103boo99boo103boo61boo34bo$2718bo$2749boo14boo$2749bo15boo$2750b 3o$849boo1843bo28bobo26bo$845boobboo1843b4o26boo$844bobo1831bo16b4o5b oo18bo21bo$841bo3bo1831bobo5boo8bobbo5boo36boobboob3o$841boo1827boo3b oo3bo14b4o21boo20boo4b4o$840boobo3boo1821boo3boo3bo4boboboo3b4o22bo25b oo$839bobb3obbo1827boo3bo5boo3bobbo19boo5b3o5bobo$838bobobo5b3o1826bob o10bo23boo7bo6boo$837bobobo8bo1827bo8bobbo39bo$835b3obbo1899boo$836bob oo1873b3o24bobo$837boo1874boo18boo7bo$838bo300boo11boo19bobbo1520bo18b oo15boo7boo$1138bobbo9bobbo18b6o1518bo10boo5b3o$1138bobo3booboo3bobo 15bo8boboo1525bobo3bobo$1136boobbobo7bobobboo10bobb8oboboboboo1504boo 6booboo6bo3boo$1137bobobo4bo4bobobo11b3o7bobo3boob3o1502boo5bo4bo6boo$ 1136bobboobb7obboobbo13boo3bo3bobb3o4bo1508boobbo$1136boo5bobobobo5boo 10boobo3bob4oboo3b3o1511bo$1145bobo19bobbo4bo5bo3bobo$1127bobboo9b3o5b 3o17boobboobboobo8bo$1126bobobbobbo5bobobo3bobobo7bo3boo5b3o4bob4ob5o 1506boo$1126boboobobobo4boobb5obboo6bobobobo3b3obo4bo4boo1511boo$1125b oobobbobobbo22bobobo6booboo4b3ob5o$1125bobboboobbo23booboboo5booboboo 4boo5bo1496bo61bobo$1126b3obobo3b3o6bo12bobbobo5bo3boboo6b5o1494b4o3bo boo55boo$1128boobo5boo5b3o9boobobobboobbo4bobo5bobboo5boobo1486b4o4bob oboobboo49bo$1124bobobbobo3bobbo16boboo3b3o4bobobbo6bob3o5boboo1479boo 5bobbo3booboboobbobo$1124boobbooboboobb3o8boo5bo4boobobo8b3o3boo13boo 1477boo5b4o3boo8b3o$1130boobo3boo3bo4bo5boob3obo4bo10bo15boo3bo1484b4o 3boo8b3o6boo$1124b5o4bo8bo11bo3bobo3boo6bo7boo5boo3boboobo1487bo12b3o 7boo43bobo$1123bo4bob3o12bo5bobbo3boboobboo5bobbo12bobo5boo1500bobo54b oo$1123boboobobo6boo4b3o3boobob3obobo3boo4b3ob3obb3o7bo4bo1502boo55bo$ 1122boobobbo6b4o13bo4boobo4bo5bobobo11bo3bobbo$869boo5boo245bobobobo5b oobbo12boboo4boobobo6b6o5bo5boboboo$870bo5boo245boboboobobbo10boo7bobo boo3b3o8bo3bo5bobo3bo4bo$870bobo249booboobboo3b4o12bo5boobobobboo11bo 5bo4bo4b3o1563bobo$871boo252bobb3obbobboo13bo6bobbobo25bo4bo1565boo$ 875boo248boboboo5bo5bo6b3o6booboboo7bo7boo7boboboo1565bo$874bobo247boo bobboobobbo5bo16bobobo7bo5boobo6bo3bobbo$875bo250bo3boobbobbo4bo16bobo bobo5b3o3bo11bo4bo$871bo254bobo7bo23bo3boo12bo8bobo5boo$1125booboo10b 3o13bo18b3o9boo3boboobo1567bobo$869b3obo258boo4b7o4boo6bo17bo16boo3bo 1568boo$868boboo260bobbobbooboboobbobbo4b3o8bo28boo1569bo$868boobo261b oob4o3b4oboo15bo25boboo$866bob3o259b3obbo11bobb3o12b3o23boobo$1129bo3b ooboo7booboo3bo$868bo261bobo3boo7boo3bobo9bo1608bobo$1129boob3o3bo5bo 3b3oboo9bo9boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo61boo$1130bo5boo7boo5bo8b3o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o60bo$1130bob4o11b4obo19booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo$1131boobbo11bobboo14bo7boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo$1160bo5b oo$1158b3o4bobo1549bo$1136boo8bo10bo1559boo$1135bobo7bobo9boo1551bo5bo bo$1131boobbobboob3ob3o29booboo1526b3o$1131boboboobo3booboo13bo10bo6bo bo1505boo8bo10bo$1133bo4boboobobobo12boo8bobooboobobbo1503bobo7bobo9b oo$1132bobobob3obo4bo7bo3bobo8bo3bobobb3o1499boobbobboob3ob3o13bo15boo boo$1132bo3bo3bo5boo6boo1525boboboobo3booboo14boo8bo6bobo$1131booboo 10boo7bo8bo5boboo4boo1503bo4boboobobobo12bobo7bobooboobobbo$1132bo3bo 3bo5boo15bo5boo4b4obo1501bobobob3obo4bo6b3o13bo3bobobb3o$1132bobobob3o bo4bo14b3o4bo9boo1501bo3bo3bo5boo6bobo$1133bo4boboobobobo15bo5bobbo 1508booboo10boo6b3o13boboo4boo$1131boboboobo3booboo17bo4bo9boo1501bo3b o3bo5boo14boo5boo4b4obo$1131boobbobboob3ob3o11bo9boo4b4obo1501bobobob 3obo4bo13b3o5bo9boo$1135bobo7bobo3bob3o3bobo8boboo4boo1503bo4boboobobo bo14boo5bobbo$1136boo8bo3bobobo4bobbo1518boboboobo3booboo22bo9boo$ 1159booboob3obbo3bobobb3o1499boobbobboob3ob3o11bo9boo4b4obo$1148boobbo bo7bobboo3bobooboobobbo1503bobo7bobo3bob3o3bobo8boboo4boo$1147bo6bo4bo bbobobo4bo6bobo1505boo8bo3bobobo4bobbo$1148b3o3b3o3bobo14booboo1527boo boob3obbo3bobobb3o$1157bo8bo1531boobbobo7bobboo3bobooboobobbo$1146b5ob 4obo1539bo6bo4bobbobobo4bo6bobo$1146bo3boo3boboobboobboo1531b3o3b3o3bo bo14booboo$1148bo4boo5boboboobbo1538bo8bo$1147b5obbob4obo3boboo1527b5o b4obo$1146bo4bobbobo3bo3boo1530bo3boo3boboobboobboo$1147b3o6bobo3bo3b 3o1529bo4boo5boboboobbo37boo$1149boobobobob8obbo1528b5obbob4obo3boboo 36bo3bo$1153boobo8bo1530bo4bobbobo3bo3boo23boo13bo5bo3boo40boo$1157b6o 1534b3o6bobo3bo3b3o20boo13bo3boboobboo40bobo$1159bobbo1536boobobobob8o bbo11boo3bo6boo10bo5bo47bo$2703boobo8bo14bobo3bo5b3o10bo3bo48boo$2707b 6o18b5o6boo12boo$2709bobbo19b3o4boo9bobo$2739boo10boo$2751bo5$2758bo$ 2759boo$2747boo9b3o5boo$2747boo10b3o4bo3boo$2760bobobobo3boo$2761boob oo$$2770b3o$2748boo21boo$2747bobo18boo$2737bo11bo18b3o$2737bobo29bobo$ 2740boo9boo17boo$2726boo12boo9boo4b3o$2726boo12boo6boo6b5o$2737bobo7b 3o5bo3bobo$2737bo10boo6bo3boo$2751boo$2751boo9$2777b3o$2776bobbo$2779b o$2779bo$2776bobo$$2783b3o$2782bobbo$2785bo$2749boo34bo$2749b3o30bobo$ 2735bo15boobo5boo$2733bobo4b3o8bobbo5boo27b3o$2726boo4bobo16boobo33bo bbo$2726boo3bobbo7bobboobb3o39bo$2732bobo7bo3bobboo19boo19bo$2733bobo 6bobbo23bobo16bobo$2735bo8boo22b3o$2768boo25b3o$2771boo21bobbo29boo$ 2770b3o24bo28bobo$2753bo43bo18boo7b3o12bo$2751bobo10boo28bobo19boo6b3o 8boo3b4o$2752boo10bobo3boo53b3o8boo3b4o5boo$2747boo17bo3boo54bobobboob oboo3bobbo5boo$2747boo17boo38boo19boobboobobo4b4o$2806bobbo23boobo3b4o $2840bo$2755bo50bobbo$2755boo48bobbo$2754bobo48bobo18bo$2806bo17boo$ 2812boo11boo$2741boo63boo3bobo$2740b3o3boobo56boo3bo10bo6boo$2737boboo 5bo3bobbo56boo10bo6boo$2730boo5bobbo4bo4bobboo61bo5bo$2730boo5boboo4b 4o5boo60bo$2740b3o3bo7b3o7boo50bo$2741boo11boo8boo54bobbo$2753boo63boo bobbo$2753bo67bo$$2835boo$2835bobo$2753bo71bo4boo4b3o$2753boo69boboboo bbo4b3o6boo$2741boo11boo8boo57bo3bob3o4b3o7boo$2740b3o3bo7b3o7boo46boo 9bo3boboo4bobo$2730boo5boboo4b4o5boo56boo9bo3boo6boo$2730boo5bobbo4bo 4bobboo69bobo$2737boboo5bo3bobbo71bo$2740b3o3boobo$2741boo3$2754bobo$ 2755boo$2755bo3$2747boo17boo$2747boo17bo3boo$2752boo10bobo3bobo$2751bo bo10boo5b3o$2753bo18boo$2769boo$2769b3o$$2735bo8boo$2733bobo6bobbo24b oo$2732bobo7bo3bobboo19boo$2726boo3bobbo7bobboobb3o$2726boo4bobo16boob o$2733bobo4b3o8bobbo5boo$2735bo15boobo5boo$2749b3o$2749boo5$2777bo$ 2778bo$2776b3o7$2794bo$2793boo$1048boo1743bobo$1048boobboo$1052bobo$ 1053bo1726b3o$2782bo$1050boo4boo1723bo$1051bo4boobo$1048b3o9bo$1048bo 8bo$1058boboo$1060boo$$2793bo34bo$2792b3o32boo$2750bobo39boboo20boo8b oo11boo$2749bobbo40b3o20boo7b3o7bo3b3o$2739bo8boo10boo31boo31boo5b4o4b oobo5boo$2738bobo5boo3bo8boo65boobbo4bo4bobbo5boo$2726boo10boobo6boo5b oo42bo6boo20bobbo3bo5boobo$2726boo10booboo6bobbo4bo40b3o5boo24boboo3b 3o$2738boobo8bobo17boo26boboo37boo$2738bobo29boo27b3o5bo$2739bo9bo49b oo5bobo$2750bo54bobbo16bobo$2748b3o18b3o32bobbo17boo$2769boo41boo12bo$ 2772boo30bobbo3bobo$2764boo5b3o32boo3bo6b3o8boo$2764bobo3bobo37boo17b oo$2747boo17bo3boo44bo5bo$2747boo9bo7boo48bo5bo$2757b3o56bo6bo$2756boo boo62boo$2757b3o58b3o3bo$2758bo63bo$2823bo$2835bo$2751boo82boo$2739bob o10boo70bo5boo4boo$2734bo4bobbo8bo72bobo3boo4b3o7boo$2735boo5boo11boo 68bobobboo4boo8boo$2730boo8bo3boo8bobo55boo11bobbo6boo$2730boo10boo9bo 6boo50boo11bobo7bo$2739bobbo10bobbobbobboboo58bobo$2739bobo11bo6boobb oo58bo$2754bobo$2755boo4$2756bo$2756bobo$2739bo17bobo4boo$2739boo16bo bbo3boo$2730boobboo4boo15bobo$2730boobboo4b3o13bobo$2734boo4boo7bobo4b o$2739boo9boo$2739bo10bo$$2758bo$2758bo$2758bo$$2760b3o$2755boo$2747b oo6b4o7boo$2747boo9bo7bo3boo$2755bo8bobo3boo$2755bo8boo$$2770b3o$2771b oo$2747boo19boo$2729bo5boo9bobo19b3o$2727bo3bo3b3o10bo20bobo$2731bo5b oobo11bo17boo$2726bo5bo4bobbo10boo$2726boo9boobo9boo4boo$2735b3o11b3o 4boobboo$2735boo13boo4boobboo$2751boo$2752bo5$2777b3o$2776bobbo$2779bo $2779bo$2776bobo$$2783b3o$2782bobbo$2785bo$2785bo$2782bobo$$2789b3o$ 2788bobbo$2791bo$2791bo$2788bobo$$2795b3o$2794bobbo$2797bo$2797bo$ 2794bobo$2826bo$2826b4o$2816boo9b4o7bo$2816boo9bobbo6bobo$2821bo5b4o4b oo3bo9boo$2821bo4b4o5boo3bo9boo$2806boo18bo8boo3bo$2806bobbo27bobo$ 2838bo$2806bobbo17bobo$2805bobbo18boo$2805bobo20bo$2806bo$2812boo$ 2749boo55boo3bobo$2749bobo54boo3bo17boo$2736bobo13bo7boo48boo6b3o8boo$ 2735bobbobboo6bobbo7boo55bo3bo$2726boo6boo5bobo8bo64bo3bo$2726boo4boo 3bo3bo3bo3bobo65bo3bo$2734boo5b3oboobboo19boo46b3o$2735bobbo3boo25bobo $2736bobo29b3o$2768boo54b3o$2771boo51bo12bo$2752bo17b3o52bo8b4o4bo$ 2750bobo68boo10b4o5bo$2751boo11boo55bobo9bobbo9boo$2764bobo3boo44boo4b 3o8b4o9boo$2747boo17bo3boo40b4obbo4b3o8b4o$2747boo5b3o9boo44b3oboo4b3o 12bo$2821bobo$2760b3o58boo$$2754bo3bo$2754b3obo63boo$2753boboobo62bobo $2811boo7b3o12bo$2741boo68boo6b3o8boo3b4o$2740bobo77b3o8boo3b4o5boo$ 2739bo6boo4bo68bobobbooboboo3bobbo5boo$2730boo7bobbobbobbobbobo68boobb oobobo4b4o$2730boo7bo6b3oboboo74boobo3b4o$2740bobo6booboo10boo69bo$ 2741boo7boboo10boo$2751bobo$2752bo68bo$2819boo$2820boo3$2809boo17boo$ 2805boo3bo17boo$2805boo3bobo$2805boo4boo$2805bo19boo$2804bobo18boo$ 2804boboo$2813bo$2813bobo14bobbo8bo$2805boo6boo15bo10bobo$2805boo19bo bbo3boo5bo3boo$2823b4o3boobobo4bo3boo3boo$2822b4o14bo3boo3boo$2815boo 5bobbo8boo5bobo$2815boo5b4o16bo$2823b4o$2826bo8$2822bo$2787boo33boo$ 2788boo23boobboo4boo13boo$2787bo25boobboo4b3o11b3o$2817boo4boo9boboo9b oo$2809boo11boo10bobbo4bo5bo$2803boo4bobo10bo11boboo5bo$2803boo4bo16bo 10b3o3bo3bo$2826bobo9boo5bo$2826boo$2802boboo$2802bobo18boo$2803bo19b oo$2803boo4boo$2803boo3bobo$2803boo3bo17boo$2807boo17boo$2816boo$2753b oo60boo$2752bo3bo60bo$2736boo13bo5bo3boo$2736boo13bo3boboobboo$2727boo 3bo6boo10bo5bo$2727bobo3bo5b3o10bo3bo$2728b5o6boo12boo16boo51bo10bo$ 2729b3o4boo9bobo21boo50boo9boo$2736boo10boo68bo4bobo7boo4boo$2748bo67b obo13b3o4boobboo$2770boo43bobo15boo4boobboo$2770boobo35boo3bobbo16boo$ 2773bo35boo4bobo17bo$2765boo6bo42bobo$2755b3o7bobobbobbo44bo$2748boo9b oo6bo3boo$2748boo5b4o8boo$2762bo$2762bo57boo$2762bo56bobo$2809boo7b3o 12bo$2758b3o48boo6b3o8boo3b4o$2818b3o8boo3b4o5boo$2819bobobbooboboo3bo bbo5boo$2739boo79boobboobobo4b4o$2737bo3bo5bobb3o73boobo3b4o$2736bo5bo 9bo3bo76bo$2731boobboobo3bo8bo4bobo$2731boo3bo5bo16boo60boo$2737bo3bo 17boo4boo54boo$2739boo18boo4boo$2756bobo$2756bo61bo$2816bobboo$2807boo 6bo4bo5boo$2803boo3bo6booboo6boo$2803boo3bobo$2809boo10bo$2821bo$2802b 3o$2802boo$2805boo$2804b3o21bobbo8bo$2803bobo22bo10bobo$2803boo19bobbo 3boo5bo3boo$2821b4o3boobobo4bo3boo3boo$2820b4o14bo3boo3boo$2813boo5bo bbo8boo5bobo$2813boo5b4o16bo$2821b4o$2824bo4$2822bo$2821bobo$2809boo 10boobo7boo$2809boo10booboo6bobo$2821boobob3o6bo7boo$2821bobobbobbobbo bbo7boo$2822bo4boo6bo$2832bobo$2832boo$$2777b3o39bobo$2776bobbo39boo$ 2779bo40bo$2779bo$2776bobo$$2783b3o21boo17boo$2782bobbo17boo3bo17boo$ 2785bo17boo3bobo$2785bo23boo9bo$2764bobo15bobo35bobboo$2764bobbo34b3o 8bo9boo$2755boo10boo20b3o10boo8bo$2755boo8bo3boo5bo11bobbo13boo5b3o$ 2760boo5boo6bobo13bo12b3o29bobo$2759bo4bobbo6bo3bo12bo11bobo25boo3bobb o$2764bobo8b3o10bobo12boo19boobboob3o5boo$2773boo3boo43bobo3bo3bo3bo3b oo4boo$2795b3o24bo8bobo5boo6boo$2794bobbo15boo7bobbo6boobbobbo$2797bo 15boo7bo13bobo$2797bo25bobo$2794bobo27boo4$2818boo$2818b3o$2775boo32b oo9boobo8bo$2775boo32bo5bo4bobbo6bobo$2814bo5boobo5bobo11boo$2810bo3bo 3b3o7bobbo11boo$2812bo5boo9bobo$2830bobo$2822bo9bo$2820boo$2821boo4$ 2771bo$2769bobo$2761boo4boo38boo4bobo10boo$2761boo4boo34boo3bo4boo11b oo$2767boo34boo3bobo3bo$2769bobo37boo$2771bo$2802b3o$2782bo19boo$2781b 3o21boo$2780b5o19b3o29bo$2779boo3boo17bobo30boo$2780b5o18boo20bo5boo4b oo$2780bo3bo40bobo3boo4b3o7boo$2781bobo42bobobboo4boo8boo$2782bo30boo 11bobbo6boo$2813boo11bobo7bo$2825bobo$2781boo42bo$2781boo3$2817boo$ 2815bo3bo$2809boo3bo5bo13boo$2809boobboobo3bo13boo$2814bo5bo10boo6bo3b oo$2815bo3bo10b3o5bo3bobo$2817boo12boo6b5o$2822bobo9boo4b3o$2780bo41b oo10boo$2779bobo6bo34bo$2767boo9bo3boo3bobo$2767boo9bo3boo3bobo$2778bo 3boo4bo$2779bobo$2780bo35bo$2785booboboo22boo$2785bo5bo15boo5b3o9boo$ 2786bo3bo12boo3bo4b3o10boo$2787b3o13boo3bobobobo$2809booboo$$2802b3o$ 2802boo21boo$2805boo18bobo$2804b3o18bo11bo$2803bobo29bobo$2787boo14boo 17boo9boo$2787boo26b3o4boo9boo12boo$2814b5o6boo6boo12boo$2813bobo3bo5b 3o7bobo$2813boo3bo6boo10bo$2822boo$2822boo6$2782bo$2782boo$2773boobboo 4boo$2773boobboo4b3o$2777boo4boo$2782boo10bo$2782bo10b3o$2793b3o$$ 2791boo3boo$2791boo3boo3$2794bo$2793bobo$2795boo$2795boo$2794b3o$2793b obo$2793boo!golly-3.3-src/Patterns/Life/Signal-Circuitry/h-to-h-collection-26Aug2017.zip0000755000175000017500000016721713543255652023262 00000000000000PK“…O]ÃÇ”r h-to-h-collection-26Aug2017.lua½VmoÛ6þÎ_qPÎb©±Ó¥ d [Ñ6lÀ:ìCÑ”t’ØP¤@ž"x¿~GÊ©ã¤M1 ›Ùu/Ï=÷ðèÕ ºÙU·ª¬ÖX‘²fµ>ýil×/NÏS=J±ZÁŸ›QƒVæÚCcXÃ÷µ$¬,\¡óU‡šß›zTä…ж’ZØBË>»ÅRˆŽzmda-m‘jå a?$Ë4MC<Ѱ£²©Ð,nc@2%K¡h€:4øÓ\NN.ć"–…ÈI‘ÆâJšzÇpõÊû ;Ö™g³ÈKËFeËP¬Û&ÏÞòçõ›¤" ñ¾Sþ`ð½Ôú! À†½T†øbžf O@ä:‡Í6鈆Ë,cIî´j0­lŸ1ácï³…ÙAUéÐ ?6ÛõsÚ®7gçχíæìåfólˆ?I!¹t‡2¤$Àq8˜Ãå™,Ò¼tïÙæACê.x´`p‚ZùÊÞ SèÁXßÙÉ@‡÷aæo!Þ²>$ø±ï¥Û>nŽ2mxƒf sž$)Oªbvf°¼Òwp|çA˵?¿K"t~1½—÷7vw0ÎR hGïU¤ 1瓎si®€×ï³>MSzLUR|õU !Wz¬ñòÇ÷ßê礮UözVERüÊËñÊ-¶­,~Þd¬7U”ge’ÿËœhèôåÅ‹¦m¶’ŒÅÎHBóÿ/.΃1°ôl ý¨I Z1 ÿÃ¯Ö G*®Âôy%o×ïB²Y¾ŽxG Q Áð Ò¶ZÕ|Š·PýiôÔóná‘jõµ¢a&åP¶ÈU±Ø‹>058[UØkƒÃJyÔ; ÕóÀñª5’÷ÑÞoo0ÜSÊ{ogªÎY£þói¤aä©Õ8ž–gƒ2ü¼²Ì3õ”¼C‚ å¨t,Žï~~*¥"°å'nèÉÜÆ`hpˆauR•>u¡¯Î¾^hØh\,j ]ÃóË»-Ögå|Ð^Žé0–OsëØÐ#|!è­Êk-²b:dJTµÇƇSL›ÎBñ´#œç0‚ü‘¯IQwg=’'< áw>{?~Œ§òr6WÚzäÿì/ÚãÓœÿ$üPK°KoÔ-òóénËh-to-h-collection-26Aug2017.rle”½[Ïä8v%úž@þ‡ÄøÃ`hËâU’ÆAÄ<~˜§9ó~PîÎv¦n¨Ê²Ûÿþp­µ7I)âË*£²â“(Š"÷}o’›÷?>ýóçŸùÓ_?÷éO?þðç_¿ýÒþ~÷Ýç?}ùöÇÚå÷?}ûÝç?ú—ÿøô¯ßÿéÿûáo_¾ÿæ‡OßüðçOoþíó§ÿùóçÏ?|þÇþî|úë—/?ýã?üCkåß¿ùï¾ýË祽ýùñç_¿ÿåþíÛÏÿþåÇŸ¾ýÓòÓ_úþòÇø_¿ü1¦¼ýןþ˜rIéï~â4ÄÆþÏ_¿ýåÜ‘¾|óí¿|úæ»ï>ýò=¿|ó/ß}þôÏÿåÇ¿ÿgïü/Ÿþï?þ{ëá/Ÿ~ü [Šë§Û¯ÿúë/_ÚUØþðéßÿúùçÏŸþ Ûø/Ÿ¾ÿüMkôË_?úòsÐwŸ¾|ûýçOíÛ?üøåÓ¿þüù›/Ÿf3_þÚÆÖõ<^ppý_m]ûöÏŸ?}ó)¬ëßÚÿŸþåÇ_øó·?ük»øÛ2 ëó§¾ùþ3^øÓw¿ò?û³ùÍwŸ~úùó_¾ýÛ§¿ÿ{ÖþoÿôǾÿæç?ÿáÓÿþã—_þáÓÏßþë_¿üáÓÿÒÝwŸÿÒnî¼’¾ùÓÿýç¿ýñ/ß}ûÓOŸÿüßÙÈ_üw¡Ýþá×ïÿåóÏ : €ŸjýüùÏíé—ÛÇüó¯úÌZ?þúå§_¿tÚ#ø§on ü雟?ÿÐêýòù—üôý·?|ûý¯ßjÃøñß>ÿü‚aëù§?}ûóŸˆøö§ÿ÷3 Fðýø“÷Ë_¿ýùÏçÖþö‡OÿÑz÷—_>a<եѓÿýùÑÆçâ~üé3P>è µùé—¿‚¾ýáÓÿjäøÏßþòåÇÖ»F7_>ŠŸþÛ¿|÷ëçÿ®¾ýŸ?¡±Óo¼?|úSCú¿ ?7}ûà “OúüÝwí›?ð9P!BùѾ–Oh·5Ö€òåñïõ½ÁؾÿæË§_ùÜj¡dùî×oÆèþçwž~ÆÛ¿|ùùWTc}2`‚1\Ž>Ö™Ø[kûôÇO)ä@ýã§RúçŸmlóÇ&?„ËRqI²ðß~ºËãup“ð/>rû¿Uë%?¨lÔ=ø"ã'?J¸ÆVøBÀ×ZAnüø!µß´—ö[Ywþ×*µFÞy¢–Ú³ÈVü»­±¼<6\–þY+×"{}³ñ´Bµ‚·+ËËÔ‡k‘Þ&À0 D»ÿø¡´"ÁI0¬³½›_|÷ýÎô!ÚÚÿoqχa ÷0Fñz¤©ÿo)·ÞÆø¬v}õû3Ãê¶YQ]N‰Í?ÐŒ:b÷/†¸O/&u©¬×²6&€/ç•{gøùi"Þ‚­TÁÏÊvmí‘ÃÔØsƒÛ(nôÛ°K¯Þ(Qí9Sžp”ÐHXEÿíÛ¶·Ÿ¼Wä–úÔxdÕ4‘¢F”Ó(f!ÊÂ¥Œ«À“ ± ˜$ÒÍþõC} Ë-.·­òOÞ÷©Rï_oÿãÐ/½¨>§wÊ×k9À (ØpÃMJâ§Q1£ —nöÒmC¡Jc¦ý\Ùßqþ—–MLýáˆêK+Ö’èeñú\Üú²:èv@¶î[çIÂ.eƾÑž®soŒbÕò6Q:÷¢tE+—rt­P´±k! ÓÞ uÛZ9Ûe1:*ÑÔà2¦ÁØ Uöôô­àª…@¶H÷úĨ÷Zlr0…åowˆÜ[û÷ñæ‹=.'™Ÿ¯uA/CTD Š„½>}89dî'î©6vXî·{ÿÎzCxò¯Žâ^YØþæ—v](?ª”Á¹0‘J®¥­_qk]R×Ò=5²·6$Þ7 Éo†vŠSg«ÂxåóF4Ç:ˆ1 aTËËâ4Stòñž½5ª5ÊZ·–|oŠª¶~7)ÃÿòýVq½G!# Kâ'å(ÔeÓ<õFd*Q{ƒ«Ô5?!›i¡<×~k”½y_÷{ãç|ËÖz[ÔC´ÒàVwÝëî(eÐUÇ:¸½.oØ~õä­õal9HA%ûÚW@ÿõNŠ\B!øbëMûiøŽa¼õ;tè¤æ]8d^<:õéj3nø~ëH“á?2;“À M˜Ü ç¢_Æ7¾þ zUyGóBÍfÒÙÚh½Ûýq÷xÌÆŽ¬Å\î¶Ô~r£ç[–YzÖ+¸™!€Ð*÷'Ð<6‡CûÒ>‹Uøôá$ 0JÈšãN۠гh@ HŽî×=? m khJW£)÷PȺؤʤÊr²Ó ³ß; …ÍfdHÑó½éG> lDëý.AØLw9;àÔN8ˆMܯ¢fæ.ÀÍyGýk$ÑÐl‡ÖNë Qø³ÀEé€zQJŠZÉ+ ׇ_W4r×O¸Ú"5SqÅd0êבl×dæýA:2ˆúLЉ÷qÀ€öv=—Dã¶Yá¹^ îðnV{lÝžéú\@ >2¬«(®˜ÄÝO·qQ|#¤K¯Ð¬Ùè¢Q}+$WIh€áB<“ï¥:ØÙÊñŒŽ|¢Ù&ùRû­Ðµ ¸ÚÝhÙ2)Y†Ú½¸¬{Ø>M `Ý¥(Dì É@vÃ]ûÛFŒ_‰Ì3æÈç´LöõùªÒºiæó½öHåø)ÛsÙI¤â¼XH±†Q h–®diÙ”ýt ³':ï²Qš+ì]Ø…ŒÿðˆñCÃ3š«üü¤=h,Ù@ÉFø=¤¼X³Y?ã¦I]š “{ú°qlÃ%8hpņ^7[›ÐhÔŽ­ÀsûÎWý„8D î£kûêm‘IäF©@ifx8ã .1ÒÑfA‹QPšÖ“aÓê³¥ å®’w‰($ÅP΂¿Öó=Ì€ ëKæ;G”tXšoº¿:íbVRÝŽ)³Ó‘3•I­Q˜OÍ¥¨ Ю [àåŸÅoº"ÑLH¸mMVm“A9_w„tŽ-Îîd‘¿Õ‹…]ü4!³žMËéåkak%9S ][âsYÈël›At ÷uDd€­G÷-’dþ|ïÈJDVžÈÀ¦€;ÝÔÚš&ÓÌ>—Áû uU.ÆUåýØi 7s ´Æ/Í‹hBì"ÐN8¥{r¶|·«)üT MÏy® 纇ªNÿ u åêÙâ™_#¶çâ4iùìH»‹•šÂÙdFWãÙ¿j*VÈñAaê\ZŽ©€6gÈlÑ‘X!tð»-Q̵¹vUïM÷MÍ Û»ô&V8,¨j¡ÁÝ#ã…&í†ß‚ðqû›· Ëe»çÛ“¹þTû¡à[uÁÇÛðªÔÇ!¯Oé\Ð÷òR—q*rdÆîK—ÁCBz­ùbMNÀžO³kÇé¥0?ÖÔ.n©Nˆ; ³º>‡e·˜“¼S$ÀÔŒ9YPj¸ÿèŠä®³$L ¼@i{>û[úÚm.æ×N.Ÿìª®ô²VÔ܃ÛC"~ÆÃ eÒën•ìF›9Ù"¶½HÚ- £,v6ÇiY©eAi³4ÔŒ"×û0ÓÜóQ†YY³l³ôTÒrÃÛDlàfDÒDK«Ò®`‹E_Å›_R¾ê€7Þzb%î“lå½»6"¸Ã QŽØŒƒëYwÇ’¢y'Mƒ\ riâ¼r<…$‡°‹«yhi#[êý¦&V»å IÒÕr:Ý5ù×ÔKÅj†Ãzß >_³šàÝ?2Žíàxw(ȯ|½ó=­ßxÁ´ÏäÓlåk·…~Lk|Ëq^A;²ËþIî¸e¡Ž2MШdüT$¯€n\ó¾6S€¼¡k×à ïwDT ˜[׬@·„*Õi:úeSû ŠÊÁ{á%4áОƒövL±Ð©AwûåÚ/MÖ ä5¥ÈKÙ¨Îõ‹2dŠw{WÝŸæùMœ@8Ã߇ג©éñU~E˜ýnüqÜÈ`¡Ó=ºßi¹ÞMŽâªžG ‚†¢¯ v›n7ó³{<.à+t¶:~‹­·¿5úí#Ï95„æ|¦–¨›œÈÙH´Ëitòã ÜÄxZû?”4ù6 “Ømø.°&œï›À¹ä­7 žeƒÍ(D5 E¼†Xns@¡U¹Æ‰L´ó!¬‡B–-¼IÛtÓºßaåÀIì÷m·_ønè>ÞÆ þîC±DDÀ(#Õ[O–sY4³¶­ô. ‹È“ùg %^}6ærW,#ì×TרÛ~cÜ$ B§2PV¹Ã~ζpoö;Ç–(œ÷HNjJj½Ã˜óK„ÎìÒÁr-`àl³ÁŒû$êëÆ˜1–ë8ÎÐ15КÝ™9A…E ^Íõ…‡@3âѬÕɪoÈ«r‹_*‚Œp¹/£€·ƒ}M4Êœ6(Ž(Ó#kJ;Ø®ý2¾ŸÅ<±J;r;Æo&aÈèq纅§.*<Äq‡Å&ÿh0'جt ðÀ1¯GBŸÛÖ `èšïÙÈq3G¶¿ˆÔ©)q!Ù=BgPìÖZ†ÚEow ½ªPaVü« Tz†_gài0ÑM¡äÀ”!×YFŽ-0²›Eö‡Öü«MkÐbq%oh®¦R{Óñ‚Ä\1BÈ÷µhªàtËNFéט…ÀB…ÙpUà͸Œà·ÍH³VLŠcvÄo7ZP\¡£Ê=訂¸ åv‡gh„Ôgïw eº£Ø“V KkDÍáH™L°º¿¼”`HÞŒq; Ö`›ÖU|… 3:ÛˆBOþ€ñ:$sˆ E3)Ñ<$¶À[#=…4Ca=߃³Û‚þlˆÆheáÜÞ­ç{E ùÆ×ä©mw¸·¾SMcÂA_øÉ«`ûHØ%†$aÞ`ËkÀë· ØÉå ª© ׎GÖ.˨'‹íz/uÛ-š|Û …ý ‚¦ î'·0šÄkN‘)…¢•0Ë3åÁf(¢Ò²QÑRaœ¶ˆ5CeÀÂL+ÃIã†3)!­Ýœ…“ƒ+p¥•9£aý¦PzUTÉ÷ìw;Ex‘Þ¡ï©g‚ÚíÑBw¬Ñ”kŸ6’Cæ”gÅW©L¤Ç¹\8™ `ðj˰ùêz¾äÚ€0¥Pn;øNñî8[òøÄ×f¶<øûÆ¿êÈ– o&¶h]e '¶NS¸ :YïͶ¦óJÁ¹CÈPGÄ»¦WWÈ‹KIŸ¶Áœ¥ÛÄd¥Fí:ÐÆá—ZýâjÏnö`– ä=‚XV‹d–;µ8 ñÁ¯r:“®_ä«ÉAŠ{Z5 X†e`‚Ä)â©JíX®ëdˆ–ã½(ìÖA„qÀb×4ÙBè08áj¿4Ý-ºªýboÓݹ:쬑u'*4Ï QQLâTÎ.EŠKÎí¦ƒóö!Â"fŽ®ªòúTHžF¯¬³1²…X [ø5¥OÃOv³ínAåʨ/żÕ8. g ÄC¨¢hcª™“,‘6FÅ5˜é®ËvqF3ùÀÍß²½wC=s½¢:„m”<ß±íN©'$md˜x[´K,[iþ/Ö•áÏf¦:¥ › ½Ç{7É¡ºß®…‘çÆ¹åLþhr§H0Êg 'm½ˆàõ©(_Ó×IpvøâlÐêÁÌ:@1M}ãšá^Ànà´ §Ñ‘:¬DÄ ×»ºœ8Š…>ͧ‰ c”F5å pèÜÈs½ ôËÆ7NŒÌ7¢ï–;ûóî-°šwMÙÙ×mövSD8œ0›`¡í°Cô×bF²…8¡Å{Ý5,º2[aÜÅ›ìQp“‰R,B|),vbC ˜@B‚›oåEÁÎ I„EšÔÍ(Ònк‹]cš-‘üά[Ó"ÝórF•47Ôý­¤Fš¸¿qÃtƒc0ÊÎBp!&£8'Áx~Û2œˆúXœ²PLjnßMäÍfÌaìtµPx—Ó-8Éh n B1\¢ÛÜ2è«»,÷á–Åîó:ã“HgȬ>GQO>hž¾ˆB¨…äËK­÷*Œ:•4ÝTÚ ƒš¡º Ýd›a;[Lj ÖÀ¾ðSw ±§§BH *$X+ =Ð& ¨pYÖ2ióDÏ6swž¾k9¦ Qä\V4ª¡WŠ®ÂüMLد;ˆw*·"Õù§‹4¬±†.4®!·ÁéÔX±˜&¸[w A2•§:ßDDiɤËÕƒOëÓƒ|QhŽ!LBŽN,2 »ºÍè†' šHžN-™ÔR1W³ý]!¬–›zKºR{Œ{Øæ@J±lR×€ºÝi¥z}Ý6­³fHmˆFÐq ¯J³Ú¥ e]¥Ü{)ps„ì„ÛØºE&ÒB»‹ë{)fXñé³8¶ä›0ª{ñä5Y(/K:ßs½Y£EašUF E~Se­yv Ú@C”µ›d¼kyÃÍ“-2þ*K"©ç×ùpú³ V`ìYÚ÷ c;ÁQO’QÜó¸ÄH#ß;£ÊÞ€aë{ó‹²"Üa&RB$KÛiÑ%¿ó¸žEp¯Ÿ `о¹ãÑ¢È#«1B_úM•iÍå_ CPYÊyEÍëç»´Õ­¿9•åÍÊ"ØG•™F¿"‚LÖ‘RÜO%\­Û×I,Ò¨=Q’õF¤|O3 AÚ¢pQïžœ~¶1{÷E§¦Á† EæÒˆA©DDá7àwÐZÊóÀñÄ ÜAŽ6ÖëcóÓÓ‹rCfX©JÇ€Tu¸w|âpy# ,Ø/|‚&IÆTgX.;g˜³Í”›íXÓN«^¸jÓ‡©ê|‡‰5¬:‡• rnc¿iq[û” DeY»b´È ‡/²e Ñ™«q*U–VÿÔÕV±7ŒëпßãÀ­faŠ:éÓ¬œÂ¸Ó‡,7¢[ëÈ®á ³Ñqïöv¸oÝÁǸâ~*ç R=×M6Ȧ6&pãGfë\B‚¦uÕ‘X'$ÆßžÕà+g„ÆŠ`ýš˜áŒÕB™½dŒË®4%MrLô&¨gZ01ËïX}f.TsŠÖã ¿>/~Œy–¢uUÜeÅ7¢a>&Ä 8mc<¦›ZÒ"•¨L L¶ŽEÍJ)à†q{“š#‘O‰iÏH×/‡rj7åB ˜¬çŒ£0n˜V˜Ð…Q£©þ(ᦸ\Ç‚aö\À5‚>`XåúdJ+…ä»0:滎φÞBž­”Êâ¯Â%ÎMSÌ™gøÇ¸Õ'EAõŠt?±ÝoŽP(8]#ú)0`Ã(4 2ÅÕ.8A™L8áÍ ¸|hwÝÁ鳈…¼x“Ì­3qÓ¼žŒ}ø\†ÅHclhîñÙïf. N·eV-Ôd…}A?/…çÀf$nyïþ.—ÛwÓý7#%’£}’¼]h&Ê-NÉ"6‘,>^ªäi† åKÈ!Æo{#‚‰atÆbóJ§TvF¶`§ QuÉGœ*KîÛ‡`{.æ*AN§u&ʱÖ0˜÷B­ÇÒó‚ ]órì覂’O ¦ÌÅÛ"¾½;¡Vüçk;@iqeMF[€I…GpKƒ;Ðp+×.ÈÀTœTûAß‚ŽÇ|ñ‘3'0ìÊ0® (ÎI1Ò/ é®0ö¶X?§„ù< ’/+XIqsƒÖ]’„p-Ä"ê túR¿Éˆ¦QLfÚ9eí#&Ÿ3")w5å»xjÊÜ|Êj¶}õFYàN’4œý©^ ƒÊä»È5Pä© Ú¦ßÈø¸mpà˜Äyô:ŠìtÒ¯…š«…’½õ…]àIS­‚ʧÛÊÉa+¨šÔ UõÚo<ñ»ƒQT´oÓÔ ÎŸ"T5UN•ÝåˆÈâø¤Bá£ó/ ªBšÉeêÀëô¦¹Ü|.\e… œ‚þö5uÙûMS§xx›D>ÕȇèÉN\4Áµ€˜N¥Ü¬4ß8Iå¶‘faöX‚lgíÜžš0‡}®_,0?¶À÷Ke¾?ßq‚¨¢ùFái`´bR‚á¡Û©•©RQv*dÏ,oWÚE½ãœ·fH÷ª1NÁ¢ÛM žåÍjŤ/ÕQ´ H¿J` é_§Æ(ˆ¬;»©ôÑ Šî ;ÆÑ£J¶Éç."Ôu¤^ífÛqöw¡CÚŸp÷¬`lÌ'ÈA¡œª~E‹ÊG£¥}h¤¶]ÉKÓÜ;t>:Uqi^ºiÚUa1 9× ³Q@Ci´{ˆK{¦ )‰ŒàìUR|ÿõREã°b­[´ÁéÀu°Ðü}¯kóر©ù¦ÉÕPÓ³&Æ”Ê2#f<ÈJ“p³EŸtháã/‰Éì]E0ʪ=æØnâÌTwVEr_wRÛ½¹@‹¡RËÅiþ0nÞ"Å ¯Éôž¡¸¹^O]Êtê“0ƼpíBï` .¤)ØLÄM›7Sµnª4ÓÓ„DA Çõ.;•¶ß¦èýφJ»…“ž•Žñ ¬>$õ–¦¥ÇÞ(ò`îˆÕHšžµ4­w`å´e¸<[_¿£©ÜTÓØZ»+p;=ùÍòJDª=íÎ!ç6S **å ½Ô‚9‘üƒÎ™“_Gf©Ö°ôkö^Ø\ROaÆÒrN°DŠ‘…{yÞG³^§ÑÅ/ÐÏ„ê‘G›v/¶fr’Š‘ìwM0÷~qit…AS£0jÖ8„Ò£çÑDÃRœ•åR.HQBjqk<º²Ôhp&F7zGnt+H8ÚØ ¡J_±PZ;$¬v’ÖBßNOf °Øæ\WsŽXEí¨Pî•@ñÐåòìws±Í(Ãzv"*ÈÀâvÜsD‰2S·Ý½Ê‚Ú€Eᤑt³É1SIËÕ ºÈê)÷5ø5#M“)”aXøŠ1PH¤ïd‹Tq,ñE bì)8£Ðýr¿žï«Ü´;–šf-IŒ"—¦´w ÌŠãdÙŒæ™ó È8k7Ðâ cM4¥*G6€íâ <¦>S>ØBÁ“ –M{!&:ýÝÏL5$PBj2w]О™t#s)ò¹({`4÷:t ëSÑð‹²Å}Àƒ Å …Ř{’U± éú°ÙònÑÈÂDBÜïGc{*«¾l„Îɯ=%•ÀFŒh- Ù¼ù’kŠpÒ¶x°ˆ K¹F­\Ç U—¶JdsYîŠõ´FöS•ð2\t©ôÔNcGí•LœˆmÞ‡-3ܹ ˜¶…tˆè×ÅÂCP¿ a•©œä2%Ð$¤D©"!öL;†ñ§¨ðÜÅȡݹ /×S¾£Xz¶MQk‚%Ï¢!9—Ê1âžÛC±É}Ôör×úÊ$Ë^ÊÓøZ>j× °‰´È-Ì%šn5Ã&íšL.§aœ¹:û¦™òmz@#Ê^/Çù¶‡A¬ Ò/ÂÐ 1>EdâxJÒ¼[$‡ÛG®5^¼i·j"]k´–‚¡2LéÌÅôe¢„šå R¯Ö­ß %i¨bt\’¸0k11¸À6ÈôŸÀÜô$&*¢ànJ–í°pñ.“Ëær8…Å ¬bŽ)W$Ø•Ìì`:’Þ³±!‡¿ }lYÆr.ÓIIªX •¤!‹ÿpA¢ÙÊeZ§ÈF¥t •lÙ«`9J„ ®ri7ˆ%Ùç.;¼0q Z?'¦fî<ì2Æ*EѬ[F³–FøFÆ ¸¡½ ª ^¹Â ©Dö½E05ƒàµk´1Ä0Ôm³U²z73˜“¤œìu»©ë¬¶} ?M0dž1&ÁÚywpªÔ¯¹Ю7J'Kq ä‹¥õ=…h'Ÿªb\¹›#JˆF*Óâ\€ŸÌwxËÈ>²x}/3¦„à“ÑñÞ ºÚ¼&xGå8¡Ûkx®H¤Îzã<åQޱP–k/1“x ÉôÛ²Oʰdk-HâíÇI[î§É,~Q4‹Ë+›|éÍÖ.¸§}ýÕn02¤j•y‚“Ôri¹D2ØA¡c›ÁŸYÝsLM'ÉÕ,Œã^žìîkŠwÅ:Ára†ºXH]¶¢â¸ÛV~Ö½N×Êâ0Ö9(P£µ?ì\ E¦ú¹j%ÊNˆ7Î.á® JúLv•ÙÚOí`Š•d†×ëÁ[°9|Û•ò Ù-Ä%Š„I¾q:œXƒ0Ú¸ÃRù‚K†²&­‹÷ærQ þÛ×ÙvH‡-ÓŽó¼ æÝ0"øÉ€9¹û(§kèhWÜ· RCHsóÒÓúú 5fôö4ÝÐÒŽ+Sê‚N£·-,³øOÓÜ9Ãr8žãNjت_1Á%¦oˆíDåYÊÌšI¨O·ÜÉÉý#Çae}ºY¯²N¤lÜ­ÑrŒeísypGçbÿÁÊÙ»õ õL‰BÀg>h†´æé™–qIÈ%Yò5NS|ŠƒÐQšsÕ¤ìÞç+¨%Êeç|ˆ.²—ÔÍMhF–|˜/Þ™éF3×[± MLJ4Gß&ææ¾SI€=oŸá:Ü ¥DùõPF8KÓ·ö<ž-°€7úïÄ¿ÛÆ^R+W0[쟱Sdâ4 Ê®e¤D5¯©­ÖòIö\peõɽ}ÕÄ€½±i—‹)«&ì‰/fÑîK±e›©¤Êvùét1$hRžUÝn»’¥ܾIN£[ÅN–Í^íù=‘•Ó\†…Çh·'娳kƒ€ÀZ$-šo²óvŒ½–òa¤ÓIX¥ Xl'·nGd¸Ô&ÑÓŒÖvHt®F'q9_dî"=h#/lJ ¥Æ¼ÂKÊ“žó³ºÚ1pÛµ£ž°Z˜æšð«êt'A4òª¬,~ A½ø1” HX(m+—}) 5Xâ[èôiYëÞÊ Â9Ž\|ŸdfŠÝå‘e=œAC6éE2ã^Kœ+ Úô¹›U(Ž‹ ít˜?9’ x%õ: ¾;§9¢sæ•è¦ëˆó½(’?X*c!tÓÚÙV{"J®H—qÐuIKê&vdB>ÐFÇ%ëù#›ÁÊ av“12¿Uª»˜#±KÑÓ÷bú^°ü\ãë°Œ )l%‰üþÌ@˜¶1=—ª¬ƒÙIDT’¸³Œ¤7Ê\ p³RZ”ŒT¼öl}OÇ9šÑÇ©¡tWZØ…©kèSº añíFïd›ûå‚-J®,|‘‚š† uסD-œê€ä§?¼¾‚OVÎí>ž5&R°¦~‡¹ Ñ*NÅ<1n±²êô–WœM&Àá4°„‰}ª8è¶ž1¸ôûK4N žÍ;÷ÌÁ«R gTD)È3dŒÃa\ ÙÕ”Òc¤8pvzçyJu¢}³ó„•CboQBpÜð›9M/´FÕœ«²ÍKænžVMžÐÜ™#NûÉ›„¶îöAp4¨ohµÀZâýülÿÄÕAž'g’ ë쌈3‚¶QeË9C©¦¡f¿fü  âEéúºâ¥Z6F·O£âfÔÕÅoõ;N¯:=¿ÔþaÜ„»â½Ò¿@wLë¢Ì¦{§ÍÛ™•ªÍÂß¶Õ.â±½tÓ=ïÓ‡A6eúú4|eäÚŽ‰öOLÑÿma™SoÛE°˜ôí-­û€€*¸¹O˜zÛ¡Fà_m«¸uyï d@?ËøÑÈh¼g5Ì0x§‹.¤•@ê{fcÅ2 ,(¬Ð·¤Žo_Øð¢ « ‹1Ö,I~Ö¹Ê8¢,°á¶'A/“ÇÓ Sô Ì=Ï ÃÆBŸRô¶¼¦Ž&䦧*˜&ÂDgß@ ®Ô2@>õ¹,‚¾À34”n†»-‘£Îêa™°8$>ë],}h½Àü>hfò;‹atêÔ@ ŽîœÏ%+½Á#éx§Ù8ƒ\<¹Ožu WçU©¢720žŸ‰D>˜ºi?¢àú‚¢ˆù¦ãRºç1ŒËzäa†Rf :>š­}œYÄ*ˆÎç8â+5Ñ“F©Æ éêÄg@O­¦oTo’,èülü\aDÕ¯<Çî„‰Š¢[œ‡•f|¦„¬°ÁÀ!øj+.»ßaÜ.ebÐÛl¦Ne†Ðã EE§”ÎnRqyM~B"vÉÐqÞI«\,œr{YµW¹EÀžôW ãónI•‹%ÕQ;j€bè” £7Ã-“Sf;þ'Š-öo4RLtu2ëg'’JÞ l"›<¤IÅ¡ª¿%qÁ‹ê˜ŒfÖð„øÌޏ'X¦÷«µÞÌ@Ÿ r#1ó`“£²ÃB°æŠûßÕÇÎÍÔ NrÆÏ…ßÈN€¥:¿úÁ$¹yä…‰õMÒ<è¼]ŒúÊņb ùEI6Ü$Z&×vúl¶øÔî°›c¶gýð~-3²¾^ï"w’¼ÓIê˜qôü0Àµ4¯G³“ ly£#$Y¤Tœu‰Åj¤ôÒ‚ûdhê±¼¯’_râ “IÒèlàÔ”3(¯yЖagW‰è¤÷£Çpä‡]”<.«à#äãS9OT¥²ÒoL±Ð”¸VÊ>,ÿ'§¨t^Xe舥¨±¿¨ñ»žƒ+‰Ü¼~²ñÍq{+ze­Ä1&†)‚ü¢ÚS%8D“ÄfòR oq!HfçÄ.Ø—=è/„ü•˜>~ð¸RHÏ£ŠëlcÓ±œŸ â!hÔquˆ"!2lí@øÆþ2"ˆË%^SD¯öïd–M5’?X’Sͱèl™âøSw Á¿§¨æ½*<ÑñÄ;u™&¿FÙ–ò:% Ðæ™[…î®<= @w¥g³bóv†mö«äÿjq"0nLî ⌼Ç)¼¬aåQFÓ†ß3G/2ß²s ÞY‹ÇaÌß›a“iRïë$ ìýaPõêg7shꨯÖyQƒG¤Š,ùW“¹SÁ[Ø6Î=Çp ¬w’óø<õ`Š%oz–zÉâb0wö*ƒõ,®¦Yº=Žt Ó>ß(~_K™?7, jËdœVN='^‚_ÎÿЕè5±å‰õãôh~ÖwäÕð]–ç.^)O\Ÿ:dždè˜YþͪïT$÷ÒWo¨9jèŠÌJÞ°ÐLÀ¿Dùƒœ´¸F3kòDÀ¹äS?j}õ[×ïxGè$틽ñ¢‹³»”*ý³ÆÊ œÉ¤s";D|§Bpq’;;¢õøºø8 QãPÿvÿRO¸ÔP÷§¾¤í?%kNðºT5t÷Êû×*Ÿª.BÓ"Õ‚Ú¬Ä üÂtýêÃvþfyU­IE×p-EÑ6ŠŠ>„qÌð9†%.žb]Åžnê’Åìr¶”›“üáò&“t%8³$¨V •Âx;æMlÚ¿Ü¥µ÷]l/ŠS>ak{’Büæ0€Ìº¯^™ 0 ˜p³HIzWz íê¼T¯Æ/àTN²ö£Nt6iëq–ýTçEX»âSõ¢Ygqé‘Êýòw«7õ£¹ÔÉÿk….Ëh¨ã`Æ*Jí„(3Ûû°B-\f>ÕÜýÍ}ˆ·‚`aYäpçg:¬Ý}JF2¨/ã1’rs¸ö):)I­wšqtF+Æå¹¨Û!»|¨QH-~¥Ÿ§¯À EÒÞÛ‰Z(-§èEÅ:ø°3dÕ’z“&¦eŽFTT;ûWêè´ë$¢ü­–NrØ×mŠGŒù üÆ8¬¥Ä5b†L,§bªQâ Ã誥ˆÎ¶NŽ„Û9ÞÇ‘jL«‚`(N]´Q\›gã®4¿C 6Ñ–;Eªgúg¸¡OÔ‰ËÉ`§>ð3æ£Ú ýα¼R^¦8¢¾NkCËÏ1«¯TÉËV“‰x H8)’-£Cu·lõJG‚o'ƒNÝÏ\\uaøn‡U Á‘]NÀ¦}DgƒØ#ŒPlD”—nÁh0&oœÒý{xjsÝ†Õ ²Å4Òc¸w6!­1ÇYôtºï‘eÑ©ˆ%?¯SHN<½Iüò¢ AÛÂÊ"Þº §uó^§ L¥\K%hºD›¦Ög©ø[ Éæ,&Ún‚ÿîςñxͱ8wÓþ¦rî\ŠÄ¿aÆŸŠ.æ Ÿµß©.n>œDlfcÕÇ`€)*èåîØD­âòµLí’×qÿÖDÕáàœy%Y°0‹@.Â,›§F®Ÿ¸D-äÅßMF…/±p73í#îô¢ƒH€a¦7Ú¾½(làÍW gëõI1ãïפ©wª›žEÅÕî¤á—fæœÝƒì…©·e†•é¬=5µEíñ K÷mÖwŸŠ~‡MìÓÛ$|9ß#ÎQ•÷јÿU/Éê’¿®Šx+òû›É1_D§bx·ì¦ZVõ£/céæ®qˆ¿à«Q¶Åc ,#´I³îäºMN'÷a+ƒ¸òz9Ù *KèÃZ(ÌݸIçÆéñóÃײÇ;s!Á°§+'êÕ‘øµx\Ä휼çœð§x£ ?w0=ËgªÊHeœˆÚ˜ÓDÏ‘Lsy˜ _á¾²™E&œ„]@¸(uDÄe¨â„Þ¥×Q^7¡äÅWš}õ²ŠA(Mß}+>Ge Š;»Rœí’É™ºôžÙ4Ö“P¦Ÿ«;/j]ß+÷¡¯Åð soh² ‹2  [aæ‚Ý4QxYÃ}Q˜ë³|¢ü ÅØ^=LcÊÝûð¶¡Ÿç¹#&Aª3ª÷ð£`ݼ¤™·[Cxò%Ë­Äy7/ …Õ²ÅeRE$qǹ0ëö&ŽsÈ¢ø;+ÏkËò¨ÍoT!áÚIoæBpuðÔËQQWÕ{ì$‹9P5dÅ6ÙÞ™ÿº]rA´Yau!uuÃÛ õkA5xp‘aõaŒ…¦Ó² ªusîÒa½‡Ý_O/Ú7B¼<’šë¡…<Áâ,µòKX•Éœ>/Ñ$ ÊbQ¿‹Ëa•}Ò$J%¼®”]ØÚ¼ÚAìGŽ0³ cC¢=âýqSƒq¹m¢ÎÆØ–d».1™h»ØkPBG…±Éˆ&ÍñN-`c¡*åå2)b§mjc[zµ õÕ,†WŒi¦¢™²œlgc¨S‚ -ŠžyA·WëÆ+z4‹ŸkUȽ¹rÁ´{¯m *£/zí,WáíÔÉ4d¡2 ¨ø¸Ós]žw¾»Q5kðn „Ej©_«÷eªŠ>¬vž—Õ´—Í ª¾øê)ìT³_³Åhï­9l91.…¿A3¨Ãt)Åx¡º;îkÙºøzÄ+«a¡ñ,èÊ I½‹ [‡ÿyAâ_±×ß_¶û• Y„ÕÓ·òñOáÀþŒu)Þ1­q|¨´¯VS@¡7ìžZW'¸¨¥ý¿o‡µ•ì»j)iœªÍ,‡^ðÏØ}{³OB5ûG½®÷¦ZQ˜½1>¬•®É›/NÅÙ{C(¥öÖî×ï[\‘_§C’v EçüSüû^n1Œí¿LÆÆŽšG¤Ë8owÀpT‡bºbú–µêR\#Èûé;g©÷tÅzÂ\è¥Ìæì‘Iù©ò6@½õ¼Ÿp­•bmHÛeH1¦ë Ù¥g’ãÝ!øÅ#öíõ[¹¾;‚+ƒ¸¼×õ Èçÿ±̉ô}°þøúÏöϘ²¯2:vçeN#Õ!çĈüfå™7zŸ™/A0y0Y Û\ñºÎöÕVBìšÔ•f.œ_Óº˜:‹w6<‘÷Gn¦i·Ô+åàp—P÷‹„‘ë4ž /§gÛË·ÂQÏ$¡ÎuyC3:K‹»NÔóV—ÌT¾ùÑÄÈz›Òó/$Õ6*£ï_}¾™1þºÇñ‚†Ê,3~£Í¿5%´Ù`&ŠR|ÆßÀF!d&‘QÓ¸{*çcy’õIò‚ŒÉÌ,4×pŸtf£ës)Ú,Þ«8)Ö®R²ìï«-jxl­°â†¹·fï‚ɉ »HJ™Ï\2ÚG=ä×Òdî,æ§5ž»R\Ÿ}´ÍÁÌIÚûOÐa5½“)²hâ|¡Š^÷S Lu÷Õ^æÖ— ÅîÑ›9Îô²’ßò)ƒSl?àƒ¹d]9Ë“=Áñå]áÞWîN£šŒè.`K™)K‘ÂüÂ`fN¤Íl%Án°`úêBÜÂá½–q‰Ó¹l3Lí]\¶ï`éj°Í¦ 'b¦»E“×Ç Þ‚Þ+VžõkqY\f Ëçí÷•Þ˜“™°x,Ô,&i`/ûOÉ)=ðìY£Þ·æãA­ ê³X–ÎOÏë÷fIg‹ËN5ɃPY®Å°¡‡Î¼Öþ­ffÆïf•ǰÄ Ð J8lË 3²Ûig%¡/FÇb“Xu¢ñæE-¡³Jèž$´Ô>-®=á¼v†mo#ÚPŸÛØh—©È‹sXÉú§Ê¶;,‘Ï[¬—MD¼ó 18qædà MÅs'æŸãQgûkSi…¢6Lcz–<í2¶/¯ÏìpùÀú¦·¸îª\˹öò, Á}ª·-ý%Vìâ-&‡Ý_ËýùÔçKù´TäåƒLÏÍ[; *_,,]. ÙÀ^•Ò'Oõ\Éu´´ÂS‚¹dé¨rž^p† ñxÁ->’F8øë ™Íûð_ˇW•üÂæp3{|®/DÄAõ.k9«®f`CmoòözaÇÁË'ˆS¾~–÷‹Ìq”™µ‹‰Q§37O/®ÌUY¥‘n{b“+Eûä £Bÿ!ýâÑP)Ùˆ òEÒ¼¾z‰á.+ÁðŽè̜ښ֑ws™xTëM./(Þ™ëæ ¡Â"[Z±ÖЧr{¤q /ml&GV¶ ¥ ¸Ó•=Þ¨º Þe„&æ Ìóxk7(I žC ’˜ø#LGP&tbÞ5€ófùkŽkᙹ»R»"õDâÃ%‰Ž&Ò`W_p:Û=Â<T-gê`åˆäôq¤ðLE•Ãòã@¬uó\+OD¯÷£*Yˆ¥õwd T\ûéûÉ®tJÈn§þ×3³zO‘&zÝ•x·¤Õþû»ú›˜Íª2#äÁ\Ýö6³¦½@ÑÔë=ì×nôÞùP<6HèäŽÃû ~OÉg‘VQ×§Ô³Ìû‚PûT†ãÝA™¤y|ßÖ1†´­Üp ¶tN\\ãSââzÉmœìÀZOí ‡øQ¹9fËëqãÑËŒÛW"[-¼œö›èx7b…U)¦w$ hÝ.&TAÃ|!ú¸ú9][ú–¹(Z:p¥öÒÕÎs ¢Î)Ió+åj6O®ìN† ùZ £1Ì|hÃÈmÑZÁVß]gDæXÒïq$mGª%J;¢ÝèTSÝ›MŠL‘v6“®©)A‘7ÿ¥:M+&èºcO >÷ À®œéýÄbæfTÐZøXzmûÆ£^\ϼõ̶Ér‰ ‰²@Þ ô°dxPE8$+Û¡ðÇpž2`Í·8­¨çA½ñh*&‚Ì<à0™¹Q7¨0±6}#î ª<~ÇÉ®–1º¬5«ò!¶q½À´;ha¬fù|<)Ô’”³Œßg¢’„+e¥ÑIbFZNV‹@‰È“Š_ž#0禄hCJS"*dнeŸRÒzžHÉü‰þñ¢ƒ¿—¨Ã©±8I€¬‘—í·uæa;1Ei—‹cÝT0J¥LýøáYgá¤:{•IKxLMd¶\œ…5»ZŒ´#»?©Vg¨%ê䊷•[‚?çkýÊ£ë",ÊàºbóÙÕ8¹RçþÔ)å(”ÏØÙ% ÜüpuL›^>–³’ N~ü~×aÝŽv‰±c¾í˜¬#W;ÙwS÷2ÎÇ©¬{qL8>––žÍ½üP^xžÁ&nu{¡±db ;rXâo}á}é†6 f Õ.SÜ̬t,AñPí÷ªãTc·Ù¹ºŒÊ~¥5,ƒ)ï*‡R•ŠÄ+ùaáá—<|•§…#ñlµsp^}:Ó`K “&ê/Ñ€` ÌAÀ®•ˆ¦Ö›s¼Ç(Ï —ðµR³ÎTNîHÑ2[Ñ VQ´¾ñ,9;±Æü°¬§ÉsÈê SnÇžZT€kxó¨:t¸Wÿøa~¡ê@ {õÃ/ÆM™n¢¥@=î~"¤8Ù$*©×8|™ o:f~²ÃþªÏRâÉ^ ÌL Ób:¸Ë÷I %0LCón>´Ö'•î§ókE•y%yàƒÒÊ’±{†Ð|2#ó¶/ßu²UYÌ®§Ïò²ÏŽ´x ›ŽoØyÑÏÑ=ªàGÑQÒsÍ?0Êmä—ü@LTO¥éeiOöôÿâ&TߪúÑë7@ãÝ8w Kì´uŒ±ÑÖtÈvnSVÏhŠ@Sóv¢h·ç˜@8û‹šf©.:-¦@ÏB#yõR—*éJ)Ka»O%ÅJa+‹~fƪ“«…ÁÄLÓÊoßìfÈŸS÷g~žYä½IG¦µvNŽ%ð™e‹âŒ8#--‡´Ó>éáᤒ ;³FêµììÃM†{ µ"Ît³(Ië&à± 1*|ÇÖéé¬N20$qË’~]xàÜ…Š,S¢J4¥ð%Š˜ó}:ßë°ø{­ f ³†0¡h‡ KôB”P6:׎báá–=ŠAÎÙºèK†Š˜ñè€ Ú ìuÈ*øq­Ávk“”:=`ïÑmä¾¹dºSÊô0ÀË<©nráÑŠò÷#ϸÍÂóÌ&:"x®Mœ7Æá-û|Ÿò|•Í’ç>lÀé-4u••z¿¯rDò{‹Ä]ÏyÃ.¡’ÎåaŽsÞekizì>+Ð5ƒ´}¥õ†P ¦6ó ï<‚nÓ!püaÜË ´?^„³}œT`nœh¶ƒŽ$™ëÑáÂI:“O‡¼õ"žÁe×Q>4ãõ:Vm 2é‚<è(:Bi÷c4udÍôÑ %Ia/q‘ªŽ·Ýj­àxT GgÌ8]jRÙ²n‹’¥Z.H$ ¿IFñTÙLA £k.ö$ÙñÁ¬T¥—®¡(@&Ãa°‘OöƒìAÙQ‰§Öâü&BÒp·-^”r¿Œ A xB8¶‚Å„“äGž]yð/€˜ïpúÂþ±|è<ZdH¸Îm¢¼ &¢AK8Ä@þ+à—”(¢,Û¹"vd+Ë´ùS¼=Yx„ïÑŸÏOÐx¨¤*­æ“¼ãž0 }ã5üŒVRÈáÈ"à)Q’õç÷+¹¶8P(e"Pô-©:‹Ðdn~ ‡¾ÁøTf<$P÷ì'O•Á7©vWø2”i¥rXQØ0憎É3©xÀDøæªD±zqëÇà‡ØÂ~7€ã¬Œ‡eð0#ü/‹NàĆÀcôs`+:œ G|rªVäo'fb޻߸vUyï<˜_ß@!Mv’V!›"ÏÍå¹’<ìðÒ“²Úñ8¦Áú/ì:íÉ ·'4%ƒätš3DM²˜ Xwi5 Š4»Éß짆(Za×Ag¯ò–žŠâŸ¹‡-$ÌX[QféÐ\íˆæp©’Û)^’¨µ£"V˜î=DJóŒ@§YX3N {à0ŒB·žø8ñpê â!Š*wa›6y”Y ôÍðF¬KðÞxæJÐá%¬H~ËHu`bç)GƘæ.ƒ)IŽÃb§&mŠZ\8ýRËYX6#tŒ;Å‘ü•;šœL¨XUy)ª¬£°@–‚@¸cö{.õîsAæèàdÑÃLÜ9-Ýæ8ôð¹›ù¤g£Çè))÷(‡ } ©rÃ7OÊQ#’ªã@tžBY§bpæ"š½õñVÕû…]ŸKy8"@YZউ]M5áä\ Ø$Mæ¶Í^|2O„‡È$êÓáXIççÕkaó.4ëË™¬ó8_ Ñãȃ¢ÿ2vFG2º¤ §wLTXp0ÓóÈ0àsòøãƒ'ó„C!šéíÀ<ౘ:VÁd¯ÌŠ™S8®eµ3å®r²¤ÃEú1ƒ29`g^ÁóX\ÄÏn:×9 ^L.œ!r?”6]ÔYÔ™†7Î$²™#UÙº8…—VDé´ôöç'I8y*‡ðEg…“êC2MŠƒkg¬*ìÊshôÀÝlWBI4CºÙæK¼O˜á¢!’?#“è‚~Ы;†SFR8àGñyø›Å‚3LNIcÃ]ÂÄLêÜÌZØ]†ÌC‰Ÿ ÑM”lÛãüt¿ëü 1¶Å41hÚï!JíîŠùЂpô¥ÓsЇ~W¬gKÏ¥4ðŸjÂ̡öiGg¯dgÜ¢sÒ° 3³û‡ríH 2€dÛŽAÌwFV&²"Ï” «Iã§+ɪÕãÐh ËBu®Ñw! ^Ð!Rªý¦e ×¹œ³g‹E"e¸ÇîI7Îèpî¡»¸3äé/a—ç©KÄdšýœ$†8 ý|Ä(óBÂàs=ºÖ<"íd¤é.ô»ÖLÆÉö]\XúÉÂî3õö_fJ3㦰†Wv·äEùeWØÚÌá]H;«¬òfë@Çœ s6¸‡¤M´Gw2*¤C3RšgáA•MŒÉ0í$Íu¤C¡öØ@šI~¬ÊŠ.ïûsÆC½[Ä.^çµSzärh[®„‹5T²SïôÛFùGàHpGæJ Ó½t4iÄC`gè#l±™"±ãë‹4-¥¤¡¶Ÿfü±qª®éS_æ,è*ÐôÈŒ8U›ý€ä‰ ”ш[GÄ ¦0:ó £‹hzõà«Å˜²ÀÄ“;\z84›=ï¯:¶ÇÖCC¥SݧÚÍô@åýìW¶Dž oî‹B$›æT‰|'ÃÚ6-6 0¬´>fµ•iŒÝê‹—ä;'il^ÁW°é g`ÑnkŸöoA¢!ÆäÁ j¡ÿû35·*/Âå’«âsüç2øÅ/ª22ùT Çå°(ŒÀ]bø˜†]ÎON¢YœæðN¢Ñ"DôªxoÃÅÎR¢Ê9+¬ÛSÓ`&øŒS›ñ®ÐÎF{ذ‚U¶3Ý N.”ƒãÒâÌßpöFÅ•%Èiã{0w]6Uç¼§»æÁ§'¾Ü]K3´ê|¹ÛZÑIE7_Ó-FºpÅìC²Ÿ²3\7/gª@Éï¿O1ô걯ëCУ¶ ‡÷dA ΙÒ襲©§N«)|œö‰•­‡1Íä>ݦÓm´|Ž$¾_82¬çorVŒ=†~dsÀÐÜ¡xû¨…Þ à;BÅjq-fq,g„LP„òŽùö§“„ï*t纓&°ŒW­ëXBF‹ezÄšYf²r¾ §[®¶&[ŒÕ´^m,3ƒbæ$÷pβé°MND C­Í·vq€ÿ Ü˜ g•ž ´óòþ oéßQC8dõJêæãÎJê5]!Ò®8ïP´Û`z4fk¬ÕsHêlû*4g0$¸Új}ÿ–+\ÎÏ™MÀ`ɤL¦ÿhÛ%HêöµƒVøÍW¡b Š¢ ÜBaK ÔüT²žK°ñ‚Q'ˆB,ËΞY˜ë_ß÷E‘ߧĈj*vúÊæÀ¢ão Ó+°8p¸sžB“wœº_dQ˜t¯¥d,´ÕÄ#gä«$@¿ë"{ .¤Ê£ÝQôöIÍÚp3wvÈxe‹AÐh,×Ì~µNÄ<5¶è e›Hçôq¬\«üñ?È}Ñâ·(²Aš`%±b»†ªSÁ: hÈhj”=*¨1BñÌyØy¯‘îÚ>ç“nªIÄ×áÆVZÆ/…¹‰JåZ7C‰è"ð“€O*è¿›FQ¹ƒA«ˆ‹Ö[Me˜ÜâäÝq®ãó7\l²mþcó°„W4J°‚þZö^ 1ix@L&&WX9WD…l´ÎÍ8ñÆý ~Æu¢nsSáÜþà%% Oß F[¢}•²/kæ r¼‡SKèË$Ãñ`Gl½ÂVºyˆ»é¸¹·hXäVÄÂ.r‘@!ÚÛ€õQV²ÓFåþ†þX! ø}±K³é0EL²ÚÝׯCààíˆSH`@pï§rÀå½fÚ âZÏ·ñt›ˆ²ÓZ| Ä7Œ3ÌâØƒLÞ\¿–«â7.;›<Ât{CÚ³$–£ÿh¹`¬…‚ð)¡Ÿø7ºNA¶™×xg;ÿ`µ?Â÷X4%C“öý=Óñ¶É°³aEÖ⵺û•±í6l«À¢S…»¡‚æ÷³Ï.¾ò³Äò¶u¹¹ëѰU0é¸%¹ûÛʨÑÝ6ël)e“Z,ŠœgëˆÌ¥Ó7 ½¤s|§ø]Mÿ—Ù¾hãè蜹qQ& £m–ä(ŠMqë1]Œ·¼®>±É_ù¿QË­ 8­ÿZ8ûœ9ê™À2ÒÚÜdÕ„ÕBÏ`ˆúâÚ¸IVFñ©ƒœõ93˜ßÒ±+Z΀`×ótD°Pã91©•S¤I’Ì7Ïc_€¼‚BO#€JS}Òm’ÓŽŸÐäC _Öú€ë|oÝô7¼so²Œz²jsÈ\©Æ:6x5tÂN6JA-s"…W´r-m/1ÒDè2²ÈcÉF hý‚@w¼q” ú0}ÃÓev³N4§ÝAö¤Æâ[Ø,ÙÍ A‚sY¦Á¤©ºŒjU+½Ï¸ˆ¼¶`{̈’S bû&©„ŽR>ý±‰NN÷&+Š„Í È„Ô¶ÉsnoÔ! v{Ð(*¼)xsœ.iBïOζ} µžó k»Õˆvr rTº†6ŽJz#HðÍ_»\{gé ¢(C†s`iÜãÒSâaŸô”WˆP041+w& :¿fÙçÉ@!±He°m‹µÉü¾‘Ü„@27e Ÿñè»ff¶×ØxêFôØ™­0î- ³Œ[ã,ÆþîÌ—p¾ ­ƒ69›ØK6N.ÍU 8Q.ëb™“}OeÚóÈ §Ò ’‡$ÜÞ:Cä³ô}³ÑôÆ&Èl”Ò)FCEÀ>çtÞ½<åç‹EvÃŽ‡DÍMÞ?òi¼%G;ùmÓogRö±É;…±-;ÛãlâÆ€A‘ƒ!Y˜b®lžC:gëcÂD’-Z„Ñ…vÂ5ïô¡”o:SU9áÛûÙÜoÙœõuÁ…·˜¦1bæcªq+ ˜{µÞ»>ÑÅ;‡Ë£ô±jÛ4Ç¡ƒT;’U§nço¶Ò)1eõ6°k™Îiæ¡M& 4‰"UÌ¡ÓvFGÚ‡,íyž>¿ŽÞXý·K5Øct D!öݬ!vâÛ|”¿ú¸÷†Ñ»7üìé@êá`«>¦C¬2u¸AÞb•­ƒ;Dv)¥:t0×Nz½½m©é'8v.^{{Õš=®%èýÝ61A«ÄáVSZìLwo¾;Œ^vêØ³­'3Ù\+ã*øåÞóWg`€ LÕè«‚ãŽPÀÏX˜Ö³$q8Hì[4]k0f"$kÑD|Lõ¶ÞÑ ¨8SMí&°zðm]^¤žV`;ßçDuøñÃóAœ±„³h„ÄÕë6i&ƒ8³a‚B6#WÞÿr¯NGãêÉá2Âu²ŽS$fu¨Ó=Ìß… -h¸äÇÊθŒµ*pÑFH-<ÛX¯˜hcBLk£ˆ;s¬Ý ÈŽ‚OäùÆòK¢ò}:q÷a¹ÜÈê¹þp¼Ùµh‡k¯#¿„µrš‘;ÒòÙ&wSºñqBŒqL¢©ŠDöêì3µKæã»Æ #[/c‚ýT#’R×OèQuŠ]/hö¯ÑJä§“‚ÙzUg.߬˹i*Û¬,^Ê8¦ø¬‘{*¹°Ͻ9fp“ çª&ÎâBRpïe­+/J{Ù c 0K=¦ðŒ³BxãÙÏør¡K´½#Á. äŽßQo:Ù,uÂéѳk¥ç¶TK$Ýß8.j$²÷Íøè©k£Þ¥Ö¥5Hˆ^o®¶¾×ØTIÞ3‘´ÎÍ>ÅeMÇ›¬– «3û¼ÊýClÓµÖÇ¿¯Þ«Zvþ¢µ" ˆ³¿Î+»ÞŒ£V>U6ÕôŒ„8Ó­Wè2n§§~z`ž-K²ã{eÝ¡<½ð®Î“ó,C:uîãýxêÁS®XåxYemìïW0½¡"/ýœÜŽ 4‹CO4å,`e“žž± aÌëø~Ïùø•*ª’(6w9ír—1>Œ¼ 8q9˜À³Ó D-é8¶ ÅE숶¨¯<ËYxê:/.#¬Ñ üa ¨…â#—C>ÉÍ|tàt>È;Q˜2•ýX_QfðŽWçQ½ ^¯p¼¬° Oª²¿SeTØíA¥Ú M–ŒÂdáÑÓÅög7Œ]jœp]g®Ñ…^¬N™ÀM`r‚ Ìf¨õ4Xx>-“63üãÓ6é'âúñˆðüäš|b§×õ0§Þ ïB'rÅÇBKá«öÐ̱3ƽ_ÚšNž¦A”ý.„гä‘&r,ÞÇΖ>¡éùùñüö6žî×§ˆLσë¦ÁãÙ,Úí,Ù“ÚnÜ/e;dÌ«ç¿ñ49d"?o˜ÓKF1zÇ À!¦³ÝÜDöŠù,›^Ð@xS¸È°2°ä·'›ä+õ¸WÆ‚Dú²™v‘=Ë`ÉÞÉgûW{GANîkèe·ùó2Ù€:9t‰ò3ñ½Ö{õä„÷kN žÌ­sµæŠF{¦„?}b ô(”µ˜~GͯÖëO·² çò£ Oq–sÉè Ãç =ÑgÏŽšÙõü—Ÿ,ªx& y;3»ƒ èØœý —OrF+Õ¹çDw±áÍ¡Ø×”—™=i&“Å>í# 6ªs%–.?‘¯?H×îÆG/_‹3k¿àý)‚}wS“é~¢hòÀÎÆÚo>ášSì¨K~5ÿs2é}'( Æ]]—Ñ×4O4uî%zOòÃT1 ºúPÓEʨCµ  Íþ áZQÍÚPÍ`±NõQt“(¹6@æÔDòƒá%˜ÒwJ±wÑ}5*1¥ˆC¹4Å…ù¼ÓŽ["–`¤Ý2IÙÐùüãëÓ‡û@ނ¿­á¼Nòg³*µkÿ4DGí-—ú:û¹]!šQäA i¸¼À}^ |BA)û„¤DéãÔ×Þµ}…@}¦ÞÕ)ö “·«IUY<²7¢ó/Œé§)½yž/a‹d„æ}Låq´lÒg÷ËjcJ§±äî@Ѿ—:9hoñ˜Š÷sXmlWK Óo{©‡.{«µ×½[Úá07T,,gäî\„¡œd?ÞGÆc(²AáÁË7 Ò1…õ5z©ß^=¯ëÇ—Åa§™°ºq¸|)33ˆJJ'•;·‘X!Ê;8 ‡ÉûöN4"dûï¢A£¾EM)´w‹ûÚaÿ]µU÷EË—¸ÊT;¾½WWºé÷ÖÑ”AaìÚ­m ¶ÂOQK'´‡O†…¿­£íb—WWÝüDŒa¿†ÖÒ2M€pÛ9®U&‹¾+¹Û0uv ¦€sµÙAó›ÕÂöõJ\ü=Ÿ ùJS_2Ì™ý2üx úØsŸ®C“Z¹6ëÊ4ÕÈgî°»‘¡#2“€f1“r‡¸cN –ypLþd§§Òq”ˆ×5/õ¶S=½ªùî·/õ²Y¿Y³îÖQÒ¶‡&ÄÑÙ^>ƒ7ÿ€Èèx3/ËpSg²¹g&8 µkÛ®ür¸°”/j¥]êî÷æåÑþžÈƒ4³w¥.˜ÏfÏSÿ²}'—néÉ;1>‰Ö¹Äå '!,•3™%'`³¼÷m 'goV+P¸¬çm[ |óº¬oŽK·‰âª­““ꃎîÖ(¹¶E‰†˜Cýó-,޼]ù(™ô-Ó{¢³·zxÜ•,\&p¹ ­Ûl³Ïñg$62S+^Œ­ƒ¡Ö=Uî8*1AìÁ‡}EP¼ô[sµ×N´¨1Mñ¼mÑp·½¥ŠÛ[X±iü1ìû‚6XÚAÉvÞöÝ—¨áb¸ÁfÎË\Kï˜è#Ø «¼Åhm…¼NŸŸ[6-Ùàñ)¼?¬Z ¾ÚW­¿j%Z3$+0½u»·¤ÎYCe÷Ç+r.‡t •Ž·>4PJ|@ч>ÕW‡h´&ÊetÀF‡èóÉÃq]Gï½×ù8-cµÇ’fò‹×ÌRMÇplÍ z[R}Tl°ò¯Q†¬kwòAõ­Öþ¨¶0 ¸9­/IG·¼2…N«~´ê]ŽLucrüõ%y$ÊZ0¶_òÚZ¨Þ--”ÄËã«‹Mì C˜PF’—:Ñà‘Ô¡â‘ð÷æJ7…ÐÑõÄ 6Þ·)s±›·5ÓÑ5š1ÂsâÍ<2eÆÆ„6"25•½LØÍž$óÔB!Bg=Y;’á…â4—G»L±µî3mñXlö•¤íæè0ï¢rgNµÐ¤o0æ+"Û?7e?ö‰Žêövä¶G…mD½Ö¯›•ƒ7d‚ÆÛ7rJˉOmÛÚt`á‘Í>ð<ê6¬ÀåN3ž ±wêp¦õ!ùç^ ©ÄÑòbÿ¥Å'EAšñŠJSܤ ÖÇr‡aæq¦ØúÅÎhl¥},!C»£Þlk—›ýëꉎyîßRïzôF¥xËÛ²M1N¸.ÚÙ¬=²wnp^Ñ=¥ÒS·ÙÍ6¦Úþ¤lx‹=˜‰m~¯ RO½1øÁ4s±”ìÿÎçö‚Û‘•¸(c¼¶elÜÎÞF´óh{‹€:÷5z`Lí°ƒkÜ]Fô߀nèMþ ð SÝ쌱ƒét|Oð|Ø'Œ'`”Öã󰃎¹µn›Ë=ïL³M}]Ì/iv]D±446›>Ù1aÃq¸Y© °¹‰DÁœXhŒ]   ˆ Íݹ¯¦VäªíUaq˜ÐÃ)We¹ÕŠ@ÌÀ?¹c·Xʰo³Pû`>´‚´NJœh£: ¬eúz7×·k¡ ñ®°ŠC5étóû«ƒKqÊ ÒiÜÒÝ$4˜‰y?Ú;8‹ŠÕ˜NzQR íÑÎÇ<¾¼uæJMó„.ƒ›óÎ…½£·’Ζcþ'˵> <ÐÆ ÅÛ›dwÒþ<œXÄ:Ìw–™Y#(©®Fœ·“N‚Í€>bˆä6…uZ‹µÊ‰dãD€ˆžÛ„ÂÂoi¿ÛYv­™Yp+'1“j1É¡RŒ$ÿ•§Øî]q¶œaOúŠYØÊÉWÃõàHï·—pÏr³ç»”¦u•yCÇ/Då£l’‚´¡äã¬>~è:ˆ‰ÒZ÷ s SÄà :&}aB1ê2Þ¨¤tÂÞþæiûN˜“ÐIñ4 få›4 ×EÊ…Ö‰ÈDÓYÇ7b·4¶/&P`$ÍMÀvëy)tÖ -Ž$=Úne¥»”H¿R˜mý°ö éǘ4S~ ¼sμ:a¬i½‡²Z ©K´,»ñ6³T¨("?•ŽØ„à*Œ° Z0’@Gˆ¶1ÜR«Ñm£.vбnyg¶TfºÔE7϶BÞœ¤=üùíO§s!M@±„J7öŒ k莓É¡²3W$’l ¯X•ö° À2ÛfŒFÅ“e[“¦ ’\畺Šî)e1Ò ô(î34­ºeUª=æ~YI~Q;ô)Žó|`VµVw¦J´´\‘É…™Èã!fµ¡ck q5f0!I?éóÃæ¡k ó¦ zu±Q;£mk¿,Ç`™•¸† K¸C˜œ*€úfyií:…ELJgÒ'Òr€ŽyÞê|µ‰·[H"àÔ»§¶d·墥¢2t+ <•aá¡2ÄUTBÙÄäEûÝ ˜ë ‚æ ¤`ü)î¬Û¸ ƒ¹°+¹›Èåÿgìj–%Gyå¾#Î[ÔÚaþñ²õþÏt™`×9óݘžn—1IRbUDhfZœ°TÞDuòË$”¸wØò[Áñ Á9>ê#÷VLwÒ>èYM÷¹PySô‹üãý&ÐH8NªMÌ¢±HžÔ{Ùæ×e,†â¢Z‡Ðv7bù}3º©ßö #u\±‡ MZÕ¹w“7‡øãŒ¿ê®äœK3‚IÎ7• |©©z·(˜L”[(ìÔýh~SRF$“ØŠÈ€ ]ºÒm=Ð »$×2®2Q—]å^-9ÿšµNX/M üù2qñÎïõ0©y¤ K–d’ÃÚSw ÂùL,’sÚ Á3 n6)D¦ ÉÚÃ{ÙNåµ iŠneßúUˆÙV¢¯ + eߤ¶2Œ*&W'¾ ͘@Ó<ߎ‚µå f«}ïWèê’âJF3±ò`ªªCLÑ`F5zw<åÝëÜÑ]`I»Ä³x H¶‡`ÇméO׸ jcÉ‘ƒµE.þž0 ³j¼™D´I?pcÄàHÙ$’[ `E‡¶K¬ic¦V&YHâ+ ë‡äLIn4)!hß…-»ìºH¨û¸ËN‰–øÈ~xï*•7á1ó¥7‰j–ÐâÑMøV£#'NCqArëT¾¿L;‘ccDñ%iãiD¦úE!†ô5·5#0ôÖ¬/IW¼æø3t7וØ=0¬:«éÇ-O¡iµeÂgghMTƒÈî´žÇäÊŒéƒv—õEñ­lfô™À¥R8àóÌÔ…ÄÌŽœ12õÖõ @<3…Šÿz3ÃP’ÖTvëcU¾µˆ¼sEKª‚VDtŒ«ím5Š< èU¤e¡µEß“„ŒØ("õ}hn}`ã#Œ¼)˜h¯‘2Þ·å”MæÙ2õ€…ßÊ7b?“úWO‚ì±Ã×z½Î)„KöÜ8ÌÚcŠnþØÔíxÝ4ÍÔIaÁ¸žëÿE Zõ0(tß‹ú¹g)!Ètæ…áÎ7Ü‹U®‰Å#è¬jYïjxÙ‰â$:¤¥6LœòÔNüd‚ÒhúO«§ ècêH‹û ˜ƒ`’¬1µ““jÝLcE3³…è*¼~`š˜é1pZ`ÔœoÖA³æö_,UDôˆ°ƒ$›-BYB]œë©}±ø>Œv“ØÅ›kžÊtKóSâ\f²ÄlY3†ÊFX³²îì1™Õëq'M\ÑH£kÐå¶Åà%å´ÔªbµvúÈùëööĄګВM´"¬ïÉ­3™8/Û]ǰǹX¬áûš=2ñ[ו؂òñ·*`Üc“7·ûo¾‡S!ô¸X"ïÔ•ú/T™ÑÃÐéI],ÈÃH[gš„5 5ê!ã‚­š]lìâÈ«à@]»¥æeÀUÀå­›ïäºþJ˜ÙR2kì8Ÿ5x¸hAkJ˜³xq%tÉ$„h£6Ù$¬t+×7çÆÑºõä Œ:ȯ…ÇÎA,)köýÈi€5Nž·ç›–9¬ª‹'C‰I WP…´:Þ¡”ì“ T×Á§ß%~TÒÑÂÙóܨ÷–®Á¾øº…¾ïo4¶™šN‡ÊÛú€»Vu¹¥­å.-Ó™Þ®Pá_KÉLø±­ÊÓžy"U5Í¡–#Ÿ÷8¯Yâ tå¢@äöoÀT^0èahâO7xVAË‚Í2°Ê$ ˆ)nØþ4ýËü}j-Í"¶ÇÙ²8žãMéH‘U¸·)› sÂU«» ;€át®©Ý#n¾.`¯Â‡Ûêa ®Wß è–ñ]¸®~„ÂÁ8ÌH’M†‡ÍêÏêà¸ó–fe!BºE®K>)Xõ± <¸#fI½Š «ýX};’ÓA­>˜Íß<"¡”oÊåñæ¿HÄGhÀY¡¿EÙ[¬ÃT¶E]Ž’€:–k1nÚN"ÈräRÀÏÜϰ. i%hh°> ®pÕn¿*jsždäpÆ>è;(ZÇFPÌ3 6ú^HŽ¥SˆÚ5Oº(H|ûÜiÂl}2o˲JS~Ïmœ–1å¡éi{GÝ`“ ÖM«“ ëß­¶:g7ƒÇ¨œÀŸ<ª‘±Ú"‚ºžg¬¢õ2Èy ióÂÕ%…©üp /ãæ‘%üÞ¬_ÊÉDÔŽ v¶<F"wæhŠÇM 4õ¯ Yd×@VIû.Hü†3ÙI»6tuÔêAI °W8^2šVyÔ:,Z;‰ÇÚ –Ià¶{Ç~ç¡•7t2.97ðŸ†ï®6° E”=Ä6Øó,ü:uP|_ß¾¦ZEÔy˜4®5Á!3¤r¿”›À´¥iÉ¥7Á·ƒ/cµ B€ýë‹—$ëv§âŒÉÑ wu_Í{¬³~³5›Ð3Ù¨ðÔÙR3\£s5Ú™ÿ¸í‹Ž‹Ñ6¢¡§>ÁɉHÚm%öÍl£VÙZJß=éã M_0…wËbúóû Õ¾Q@>îöî„•mX›ã‘ò£´¾]ô%ƸË7vq²eIæ _Üã®ê!v“!D] Y_]øaì±+‚iJžÔ-›Œ…Ãá485j§šù*‰Lk.J÷.ƒ‚ ]š;/X7`´%Ä4ßIùj¼•uuÁÉULp L ˆèø6õp¶WaPíÝî(üá‚[Æ©Œ=+úŽ*« z}¤3ý 8£#Wh"BÊØ¢bXnD|> ùÃÝMÈû«fœDâDLÎî#ÿ¦˜}ŸààJ2øolcè´!£ž«Óiwï.sïü¤À=¼%8ûãN#³Œ-ÑCçvB·ÌâàHsü‚EHú9=œJ‚Z+„Ÿò™ðè0ùrhZø…}š¹-6|ÚAÔùÝjæ'ëB,çÍÌj¯7º3†¹çDy˧Í@!ä÷¢‰ 4¨?V†·-ÏÁw:8±»d°B5ÆA¦½ºt­,ŽÕߢÉ$ºû\Rßñ-²F’³¶û¶%}üÄ!Tm²ÇÆ×TWäš&òú9ú˜›ëë5@`â¼d:] 'ƒ³¥ÐŽoT«föhø‹”‡çHܸ@g&xB±–”Y<1uzq°¬Mã#­‡F1ÝØÓ¬äh Š-î £!z«È/Âí#Æw‰÷Ía'ÀV,ƒ¦.EAÿo«Ÿùøg`Á¥ÐyÉh^ž±¸ú3ÿð¶Å6ÊO_‘ñ4Øý‰Åhµ›Oá€j¬îbh¼È[ê{z„ø'ݲWVý e]Ø¡,?1cé¹5Ý Å1–¯[œçWÛòŸ͠0:f$]Ô)¶iI,.€ó/|'­4Q»Bt'oŒ~~_,Á.ªª…°¯0Ó„¡"…Œî›ÏÄôkɯrh‘š†9¶ÌúžuPìZL¥XÅl·« A„‰fŽb,¿køîPKBpQ+ …]d`LùpxvëW}awŠÝZ=Áxvc›g‰ 8c[ <*$‹©ï*&§õz­)Åj·ë›`ÞÒŠexEz¶&+¢+IìØ9±©£„©,̾´ß”‚¥œzïáûâ v¡±ÄãQˆK»ñ^yÈÉŠÛrÙ0³áSÍ>w…¢jBDŒfElSÿÉÌ©~Yð¯÷rÙ]?Ç1"9»¨HË`ÖeÌrYU†•â…ùšÅ_ÝÔÅeÀ ´F„šMéþ2YÁcHº9¬„±ªH| !S<}Æ §G|ÖGýÕiÀÆØ jDn6]|äÉMMÑ—"é¶»Ù´b4]S¢¿š†Œ¯²óÙñ=~ÅŠ“ίG Ù/J7hò’ƒáÙ¼* ©dùâ-41FgªßVMy7kdR ý,ë$±ªr •¬9M£Å9%¸lOVe &üÁ'ŠsãÃì*bU°Ém ËG6þ'þ~ÛTˆ¢Ô] qùLvZH›ðyH£•ÙÕQÂÖ_{«n ï¬&„èu9?Ì4iǪ2‚¨Z5jÞÀ] MÛo„\ÎÙr‚F’п‹þZ0²àÏ?ÇSãr\Ø0.dëÇÒ¾(=x¸-~¸ÛëäÙe,%m,ó »G[¹¸ ›îYʈ<Hbµ¥“Ù¯£é‡»=³Î£q9ýÓ¶ ±–`[f™8šPŒ¦äŠ;¡}¤u«i>Þg@¹Z[6©²ÙÁ)¶Ý),BSEøüáW£ÛTÖdûOÞ °„>ñ$ëÓP¼fQ=ÆÆ@l ¶/> a‡}-6H3ÌÍ´’¼x× T#‰@=Y‚®1™á +6l¼pp ns6ý¦¼éÅú¬ÑÈï+GE‚jY1&i‚ÚI/Xñü´²•À¤ý(3ÙÆÙ#ñûÅœEû7òkJ^™Ýi˜ç ¯ÚH¤a“â,æAÚ£ÿÏšlú÷¬1[ Ê,ð^¦ì Û¡•óaz”Œ}!•ßteëÌCš¶E&«Ûð݆>:ƒyÍ!Ó K8ðhºë2NpcõÒ¡4*A®Þ–ùê ä`Eº<þÇsÈ×v[µæ•yg‡µöŸúb!8ªÍ®÷ñŸµrw¡ Áí›sk«ªTf}Å uŒe˜ÐÛ“’W>Ìþ˜õºðÕ{P¦®*À÷<ÓЇ2 â_5H°'S öÊ ÉŒï1JÂoìüãØÕ/%!`g“ º"~3ŽöëE“¦Í×b„_'úÇÛæªÝÞ6 8 iòmÐùÈþì“"kW®¬müV¾Éøs3±bù§ç öÖ‰Ûç¦âÜpÃàÛ¨j·+dg'Ã’.AQƒ]I¹Ÿã§¯1røŽu‡Öˆ“ý­­ØÊX$¼@š(à<³eÑFŠ·* TTc£÷tl nsθž_ +>’"–£Ç@,‘yTUµr϶8Qâœïщ$®Æz1Æã]ãvÿYw#„q¸ëœ<»Àµ-$¹æl߆Y‘^‘ŠÇhFúð–ˆÄoÉ^¯ÍvËÚ.Z ^Rv»U"â{ÕÝzÿ"œ'솚'¡‡ ˆ®—“ŒÑÕÝ×6Îe)7׌ªHÁŸ£3Ñ´g¿u2úÀ¿ÎÁ‘´P(›¢Ã½ëcét,a§2 YuÒw^XžšMÎÖp:+7Êy_ÌàÌÎÚu3€íu .úzµ ÕõÇhñEÕãí}æO]ª)^½h¬Ÿ¾TþÈôàYlZÇ×|£N"ψ£f¿[*rp±Â´GšqÈ|myç«›üëçß ˆÉâ-­Ø2Oïá«#” t¼sѹdzB#"ì&üX g;&J(ŒX{ÔÔ7ÁKFv;Çp• „Áð¸Ñ1rbOr!\­Ö]ìÓ;½÷Ü› @ØÿŸC•œ“ñŸ×aõk”8 Cô²»[~Tk¾±d1 S_üŠÈÖWPbqòîu¥%ŒÛGÍm˜cÓú`'ñÐ7¦™ã@I¼Êl¾•·5Ù¶=…åcƒœª“'òHpÞÍ4±î~Ž0ËŸüB,åþ…¤¯°šÌè3æ3g”"Ưõ= q°©0Ry¶¶¨ò\€ ÉÉx£vÝäÙëUG‚KÏÁA æeý2h Fí·É[Éɸ_¹®nQÎÌ·é’”å¿Ï/(κRSþÇó’Àyà•Sß„#Þw3')œáeÏ-:]Ъ"¸‡‡vãDά“Žlô?£' šMW|ÊýúïW†”$€‰t¦^qvßp¨þÿ(ƆGß®( ÙÒÅM‡ØtÔc~çÖïÕßõw¼,~ûˆD„NÑPYð¸àaÃq’gö°ÑÓÃ[†•3¼z‘Q„÷Dxåz¼!1,('üW/‹Ÿ–FÝi #ú(Où‰Õ»Fé¦í:ƒÕ+̵ÀJ‡wo§ÿÁ¡˜<º{øAgo(tÝ.‘è8A€V¥Kºb@‡—¢€ˆAc´*Ìf†µ¸þ` ýÕÊÜ?5SPq©žž¢Ðü"ie”ÞÅÁÝú~z #Nêš!¢BQ%ƒ^à ®ÀŸÈ¦ÖÙÔ$¯Ï@mÀ89xwº•fE`ˆûe:ùb­ð±HT¸Ê:ß,ÊXžß‡"z.õbñ„ןD'›‹éâl)«ÄPp!Cc…áÜø«»8‚0¾=Á™.b‚”\ÇÀá ’“pŸŸ±x/ËbŠ¢à³˜O¦W$»*ÿ"?xø+,ÂkÔU®už"‘›ûìG¸µ)á7áHJ­ W¨.¿ïvfó=–’Õfæ~op+F<“ƪ¸Ÿ½Ã² KÞÉ@!è¨rP\è0Ý#~¿B3îçâåʸ™Bè豋'ß‚’ÆçvŠ>¹›>b+9C3^’°èHrB¥‘CS0kAV༛ ï Cóƒ8¯“aød æè}-71¾ž6óùÛÍAÎc&òܸåׇ&äÃ>F‹Ãü©è¥,Ù†³—ù;sP€”D)@p"¤Ux˜—<ˆaé‚p™¿'7±P›å¤ Õ¼!Šô«;<ÄS.—_µðsd¥WŒ%ýô¡Hº&'ó«£Óé9? .‡—„æ…ð r‘°‚_Q¼G7Ÿ:s0ÃäÆŠäÀ}}75ù1÷Íf­-.qMŠs 3ˆÍΘA$§‡MÖ™s•ù½bÓLG»dº¢Åõ½þ–àþmEéwÿ®Ò_ˆ©@˜Ëià0Ö^‰+rÆ£)y€nÒ~ÓOßþÖr×ccVs`¨ûPˆþdoúûΤcúG°fâ<˜;úÜ^c¢Xͬ0E™´RåÒÎx|Šu¾Ë /½@SÎÎiaKºvFÇI7sb€>ûüfÛ20ŸZ檟þY$„@™G½hÙù¹¦@u)a¹ÇòõÂ(G·"ÿ;' Ìq…îÕ ßî_¡ ˜Iø\ŽÁt&í0Ëa`1›^ÎCÇhþMh}·‡±ì‰Õ¦À‚ŒXª¦¸Ìx :ÎSe10õ •ëAIÉptNF¸'…Ôäjz ”uFgKã³¶çôÂaܯ– #[(_b‡-°•¾¨òLí&E^þ"i¦4`Ì$£7pPoabp– Þ®¢’-bzñFÁœ±¤Šáú.¿éJ|5ûÌœ)´ë“·áD<õ›@C‰ê—Ÿ7䛬ϷS¼ÓÎ¥AF[ìjƒš Ž¥Ô3Æ ¡Ðô-ÆX¼áA q½*IñIWõÔ¼I¦Ib ã»››mÚ•ü0¬TC8 ’²¾Í9:›Ï¾)ªʃÞÕÇI'j}ÄoÂB†rÍŒ›©Î§±Æk†0@i‹TÅŒ Ìv}.ûqQP ó¿OM8ˆûÎ M¢>q ˜ÈPÇÆà¾ŠYP `”X•ý|ä~QÚ)šl!Tš J#j•Il®rjWYñgæoãz!c]*æ$_!7-hº8®Ðˆ&3W5Š–TB‡Èÿ²Hr‘M¿‰÷©r8eOgk4‚Ëð°èÃ¥®"ú*PðŠ–:E¡§œž]aª S9ì¢1‰A|£ž¡UÊÍúü´xCÍ%¶WœaS…+I„`a\Úw£ZCmålÁ%§d .E”Á(›‚Ï6µe:vƒE1ÜZts_âÄŒØÊÂß”wv,Ó‚àÄ”¬R\0ÕN·d5B aÉwg79}GEëb £8BrÂí«æ_Oü7{¯š¢<*þâ£É‚²9ô9(•ͼÀcVŒÒµç÷¸g_dXbdL¢‰GÔvÿ^S˜˜±i€ Ë€`DwÓ[¹ê7¿G ÎUÀQø4FZ*©caSˆ}ãúÍÂ> ‰d—2v†_côvÎúÆEÍW¨ [|3PIᲇ ´Ú6¯*)‚ämÓ•ÁuMTª‘ MÁÊ(ùl_”ý‹žH!Ñ|׿ *¤F#6„´*¢­2ÓT*Á¾êªX²p†7ƒÙkc`!Þ¢DÒ&ãÚ%¹txA÷B¯ØîÐõçÍÐ0¯ƒ\éSžûT L]sÉbAµl´V‚ø~Ó÷«ðÞŠIEðÉe¯š/ш: VÂÒ~ y‹&8L­"Caqn¨&—̤7q¤I§úÀêXÞÉÁ‚¤¡–ÊI óI»4”Žø2ùRqPÐ2“À)vUªÍ(n75l¥ØóË~ŽÖÌë;lA_Â#pr¢û $ELâ«™ÛA—1äCÜŸÏiuâÙeéa¬2íOÚUßU¨#¶ »{::\Îø›˜èUÍqdœ~(øæU’ï!ŽSz¥ÐYŽï®ãÓWÙª{i­'i3Ó6Õ“j¾Êß0dQí®+#þŒ“€¥d¶ÿYg\·š?Š[˜‰y­©<üÛ’jSËëf!Þ\jó}R7-ïªp´–2ºÊ‚Ûí»5ºóo”ñ©h[ù+=†G¢Hb÷4o“ù•Žó-ëñâ¼¥jçYÀpöcõb„‰wËmÆSŒ†ežU¯[ro†ætH)vèB‡¿áÅÁEÛÑjo0ÕÝçÉ(ŠÒÁšyþÇ{[fvÁÁx¨xupèÛÓSË£¨vÂg¯íä³øNŠ“–s­¸ÝÓAªGù«ã¶BÂäI:ï[ñ“ëŠ §¹«ÆPUBþô#Éì’®e¡j4)—ÉìÍÎeŠ¯Ê›wÀ>_ü{ 7ÅÃhâžÉj2DïRÙîYÇÇu4IXÃ;òz›Šô—Ät¼önúyå¤ê ´õ"i&kWo~†L5&¢G{d0fõ/}`¸çÍ8„õW0Áâ,=]Ò詊×Í2½Ú'A-N¤Ažå&ÃuW^Ûîþ{Ç ƒñòðr©ÆÀ: ÏVk$1_aæt¼Ýèr¦ã_”½««$7þØüÚî0óD\÷”ÍœØôØ>9YÆcjÄQa$©øtgËܹ»É2ÅpÑÅÁÒcÆÍ3é.Ý ÑÆ¹.c7sR¡âµ*GÎC~t¹_ôl½æHÉcÑ8m²¹` Ãß$ú½ó¨Õ#æauÏ e)çCûëwÖø5/ozîÑ®µýYpºtpdšae{¾fiQ%‹,ûôõc¸ —5ŒM~Ôvó¥JÛ XÓ”æŒ%©wÖMº6¯ÜàÞD®»}œ^aD6$ç=÷5ÞSAs˜´†z`¬Z3º—¶kÈ壯çÁ•ÏGÙºdŸG¦`N q!Õ+î}¡GÙVÿe96éá>áJðF¨ñÔÉ45¢8êÐ"Cyãî,˜žÜ⣤&¹xÅQq_ E(–BcþƒUYòK’þgGà>)íV°ƒ9cœS‹w ¡uÐkiF †ÌFøón=ÏRÝ|l™çUàð®&n¾¹þ´:A_ ÇÀ‡Bš=F€œY–fÒ±1â º{Éd·Û/]þaÊ+lÐÏw–2…k_3Ôx'<…Uñd9 ·‰›2ãõ×[Àp»Ë\gX»û¸›àÓä*!ésuýœÉ[¡*rž¾Ý’?}¸Ý—e¸ù€à•{°¼ÔñùîL4¼‰2Å‘F¤¹H_slãã&­¿>hÃÛÆ¸Ú×ø´·F>¡eçÞƒà¯K­_he¨¦h®dR/Ö_4ã»ñ(89¸Y%.õô·–ZÐwcJ_i_Dâþ”öàÔ(ÎöS†K[m´èíĶ·6û“cmòý>„–Ûs&š ô€D>þ±ÐÀ^܃#ÀÏOóÚPËØ ñ`þ.£­‹Æ~6ö·G2êï»]Ùh’ƒ©¿£mLr»Ø-h'ø%Ñ”ÍÂ#,70}Jö×µŒ›‹QŒùëS±ç×£ëâ¯Õ\*©Åw7â€ì}‡µg)ZêÑÜe¥cœMWíûítìÌ›†MŠÎq¸gŒ/Ùy,ÐS%²Ül¾‰0üI­ À •ãP°®Á´=s¿‡ÆyŽk<¶âÙö'™'Hâa·}{”Ç_RŒ^LG£!u®»Á=c8ÓhÌ Ñý~ôƒÍªK³„Â$H¾ä“(ÂÉvyó2#&a§óIœº‰âBF9ïR”ÖÛ´eì['I  O#~6©CR;ŠmIçºÌøÐCÚíýjô VÈmkͺLüHë4ÎÁ9ª`'=úz.wCŠù¯îŸÑ–SƇ‚Æ#ú¸6jtz‡‚‚ä@e'D82ºÍÏi—ý‹ï®EþÒÜÆÅB¨FÌF•Â{%¨sçæŽšôÃE~ˆúæ†Ã²±rY,Æé{Ñ*ÁŽè¹v¨Ã6¸ˆ®<•örÑ‘—0Ý8­rN± z2Ȥ¹zKË'àšt VËWÞL>F$àt~)[ !ø+2Í@,Ö-8H'xFªòa~0Ò48˜ö0I»vöÛ=¥:#áMß8Ê a®ä¹¥yfióéŽ'fÏ &SœUfA†%1KÛPtÀÆC%"’eòhÀ0;µzq n¨äÍÂ9®·'ðˆ‘§$M/¦ái=ïÐ9!tÆç kÙyœ¦–ÈÛ¨uyé"lñ¡;ËžÑtÔw'3u ªµA‡“ãž…ê´wµã8yR¦äclDÐ1ìÕn mÙ0…Ûñ½Í"Cœä­†¹€°k•^q<åöÓ×®ñ·Ãh›áñý²~“ÓOÍu`HOyìX[à'yöÝyÁÛ’mÆ¡k7)§LûF×úšóø¹˜»Oäòª6“_{9ÜsD!¶ÒÇ+ëŒ8±Aˆ7X]9f[æé\×ütkÍ%ò§orŠët²K6O#„PxÉ}t!çx6ZˆÒA7'y|¿³šùFNŽ%õU^šÆiâ´IR"Ç£?^äqtàé¹y)t0JŽ)þànY†™ÞoúQ9L<“çèÁ ¢ÐÉôªo£³ÚÛ‡ùÍócx ÀkiɆÅ8¬ã ²s%§Ù‰*°‡…ž—²ƒ¨\;:˜1ÇÕ,€÷- ƒÎ³[÷C(ôX šéš˜Í@°É¨‹y\ã³ö"ŠÛ×f‚¬Â£o5•G»Ù'>ž¡ó³ÞX"QçSgï´òoÆ‚Nk'—”l—ôTúôóIÆ€ÎFW,º/Æ7ýÉw«®,Íj~8ô#°Ù)s¡C}ù¦Ã.ω !RŽBí|ð°%Ú¡ùñkY|\Ì]•Þ¿× á6¬¼äÉõ¡ï¼áóyO˜å.zNZ´Ôã›\bolÐÉwWËqÎÜÐbB³Þm¾ôOáédÉY¶7¤!#AÑ !Êù¢á^{mi‚.Ë–eòà%Z]ÔDó‰àü%Ps7¥OÇá·Ô'fäP ¦™ÓÌŃÓiH¬–¾}r4íDdíÊËȹ›‚Gkx’w›)A4ÍQ•ÜG÷O8éÍéfb›9ÖÕ•îrH:“zp ÞÒ…ô»áDWs®á\Ÿ•¼‰nD¨ Üá¹’ÍíïjÐG*˜N(‡"£îµ&C¤æøÍ‡Ö´·1qiì͸xTÔͨJϲæóT¡WW—^]¦›§+kåŸr›ì‡ˆÍæÇù†žr× x¼Sê½iOÄbæÓ¥ásУ“aaW9ø¯µt˜|É\»<óUž>ÊÖAê–« ×Û™q£tØSW™<¾úXŸ‚+ßpÆœD Ûb6ºúÒ nt(ºN{N6"_Îæ?ÆÄƒž˜-&²ºÓP¤m$³z8}u¨¢CìBR‡]Ru ž@Çib'gŠÙ¥ÛI­nÉ£Ú9 O·š?’ï°SHl ã/_6{ ÔW—€È쇣¢d连£js×ùµ+€t¬˜y :Z¾n5¯žoÎB‡¦T¤iôvT‡8ÈÃq³Dtfò½>ÃŽ Áb´®æÏ% Pøc\NÍHôÇ ý‰6°4}iJ“E_AÆÚu£ò”· {ù4(|Œž²Ð:‹Œ::#CûÈTК£áõæ–ZÂ,û°#|Y]!û1DÄxëÍ(Œ7Öm[â4ní§"`¡*¿Òì¼àN–—ˆBNœÒ ÄD®ÌÖw g  \l&$û˜²1®Ý=T#W¥U¾Öš½5Moé¨ VM@f—¸}'ŠbxËw7âìF]­o&6šR3EkÈ}/‰¥ Ѓõ:‡»!Nt[Œ³)›Ê<0o&“JÚ%­oR«¦N¨RúŸ§[}‘ù4FJeqB¿vŒ&_`z9cŠbL@›|)ñiPo«hÞ¿ ùã34}éÀ­€åG¢qMÔM«r´œÐuÖGDr:ö·gG¸ÜchO>öôÀU8š.7eDdÎÁ6½ @`Ù_¸Ý}ÿD¯Î47»TŽœEQÍ¡~ d­Ò)&y$¶8)¬ÕÐ/k„›a¯ÎLpë‰!ÓÏžô…-–k°Lf¼ó÷aY†NçœÙŽÑëdJã¹H`§‚R1›ó2€©µ>Œ˜4s|›“ž“RÜpaÔa.¼U«µþù ä{Ý;z ‹TšˆY:Æeó•†PóÞ„#—-¹)æ«/Z°/þúJáK êp½põ)36S[•¼ÇðØÝtxIœë’ÖÂÄÔV¾6›xF•šú×`ÉïŽf5èm`Öþ£íÆNtGï ˆïR­‹´%º%s¹‰ƒ¾V(è$¸›O¡<3p…ÑGBUð„‚`;è„dÖC×üómzëUsUk´ŠóÎmQS )a›Îm.uv-£k–o*)TpYÊQ-ÃuF]áÚ²1î¸ì¶j€¥˜H. ø‡ëw`î£#æýOŽ,Ò4§aÙ‹x'„Q26›Ùgb}Là\°Œ¥ÍR§$Ó’ÙÈÁŸ^÷X£5û¶ÎrØ+Í⓱u{kð¾î T’°V‹ í¦ÓÉ]5´k{2¾»OÖZ\msQ¸í(\‹ á;-è߬DgË„Çej šC ð¼5×wX¹O¯ÏSén/cDÍ•ÁÊŽðëÅòL-«—€wÈò#°[†{«ÝÚa{3*ìöQÆ…¬?í3ÇaÍLŸ¦=8U{sIT£Ùg¾hñb§ÂÙa¿*(ûQ ”Ýß.Ò(1˜zÈ ÑW¹ñH\·)Ê©ö¾ŠÜZÏuñ®%Éœ>Œ¢l ^Õ‘GŒÉ†³óÐ~ÞbÞ"MWô”¶¤=1[=¦‹FÚÖUäp¯)Cª$kË7ЈRrŠ ÍšµÙ8,¢÷­m“Ï®F5î ¤y cfθÀF•:²¤èñ[Ýo(L‰Ì¸AIé'Q`£Ü=wªµQô?ãx…_€ ²@mñècBc¹ âÍ­ÒÙK=•Áð òÀ“x]4éê«åèãVU` ¹!Y××ß呾'/ל Ï*î;¦§°ærnÝ¥/“pÇ­"ExnÜÑnÕëül}]ª©ÜâÄÜŒ¾sÅéðžkn¼§æãÝÎÅC[~czóhÍsIï“¿îx½ E4Ë}° “B«&ûåРؔo;òk•€Üxà¸æü"Fyv¨~5·j“^{JœQ¤ij]&®G$*è¢û¶djöƒ^_àphŽ·w@Ü(seW®7j¶9ûßj£®‚T2hý-üÝñwΣUÇò&æÎÔÆ­ì¥Õ´Ù”¹Ù$ôáV}`SÊa(ŠË– ¢Ãî´)ÞÞcˆ÷ÛQI n¿›É«`‰'êÎ [õ6¹Öñwu_®fEDࢂ%µV×Ólòî¦Y™¤V>ŒÉÿ•d¤üùç Áºº Òh#Uœ}ÿ¡ cEJc@wË’Ê÷Å®c î¶z1ê'P-qUˆ®0‘›ðbU8Þœ¶9€È˜àÙX·ÑùåZÙ‹°6Íヤה|(jX@„Y«I—ý2ŠfiîcÛ†Œ½t`>¼Ú&Æßöv:ÅìI•ð_‹J/gl|Ì’Â=–/ªÑdqrbõ—Q†ç¡( ö· a]h……à©”Iѳ)ØD2 ö¹þä.‰mùè¼A@¬æó­mwó%_oÛ–¶3v .jiØ+”[â¸øŸ?.9:=D8¯ù˜*—*8æ³&“ý†¸¿™#N±w ‚qBŸ‰Ò½í?jUz², JõökUófݹ™êr˜OÚXë„¢:$Œ~\LÃS³ço(_nÿl·,Ró–ð#ìÔjŸ|‚ ЇV€ËS˜ Y|¢Ëݲ8ªóK?LmWޝ^•:b ìë9²Md­f?‡QX="òÄm@–üOƒF™ è8ü³1¢Nh÷b5ŽR^55ü¶ÑŒiÞÕ e(>à66Ñ\xէщ¼YhoÝý«Þ)v! Þ‰è½tDÒÎàøk["/yöàÅ‚{ªKëå½ô“AqòE~ìMLî ìmÊɆ+¨­œÇ2ê¬ûç£Z‰|-(Çã†0*è JÞ^Å=òÄS,Àm×ÇÍy$!GN„º–ÎQ]S÷ù.7n°À£SYºWnLMÍÕ!nVqVKoAÈ"]áQ_tеm”*ä–ãÛä©=n‹IŽU$“¸˜JO†R¢¨´t¨7n¯ýùJõø+H¼à¤ñ2¥zßÒ`ææâ_"wp¶`-e&ˆ‹”¯5+‚,›Ø¥Í%oÞÁ¹NRD”uè£!ûow³®â ÂDÃuºñFr6ÎNª›¸Ô{»TM剡êïu‚³‡^&« í¬ÛXj#¢ Ñ8¡ ®—<&Óîk¥#=ªDÞ fãën.$Àì‚€SCLÖ”;Ò4–¼Œ3£§þ‹Ûí;£?Švý~ˆ•òðdR7÷I«QIKšƒ6LSj–=èÏ!šG¢Œp†6Út㈫p¨ÿ]ÃT­÷b¥âõ~O‘èüàF ÆØøþP4’7)Ëìï åœiªIFi&¹ôŒ}Ï–œÛƒ‘0ŒD[<±Þe'#Nm(³–³Ê5o–(7æ«(y÷[3)ÚoX j,²yÿïÏQÐüƒ&e|\dƃ•)ìž1†âùeÆäz“šêå]›†¹,…­ÎÑ¥%šjFÅ÷×Gkׂ\bÌ¢}òÇRV1^8€œÊ2tç—0‡µ¼OÊÌóqKÿ«Ei˜3Ñ;`u úq'-²5탙~,×MV–çz ¥kz° ÎÈ£òј™ªkßæ 6_vÄPn#˜ÇG£uiðP5&žBûæC˜Ÿ…fã5æVJ¢ãÊ‘ÿˆËÒ„†»Xx¬hñb€òhPó V8‘²|(mƒÂ…7òfn¬¤ñý¥Ô2C%YX¶°LVÊêi^X/îc”pÿ"½<ñÌFß1V8;=XÒp“,pZÿ‹™>8¨¤Åk9kÞBß(îr^q.Y(3ôG™§ò/C€/gpÁOÓ"A{’ô_ÙÖîPêû.O1D·èCâíÿñéëfIàÔ¼™ýÓY 4Z§¬6™+JóÎò?ÿ¾™t[¡Ñ⃣ûCKŒN¡Šªôi'î®$'Ž”nÕ³Ùã£ü.SôÚW‰4Æ[ÌE%ìüzL†y“•ïCÉ<„­øbe¶•úeQ=Z Þ¿üù÷WÑš4®µêßeY§(ó‡íÒ5SEºvK·íÏ•M´cò~ÆÛÓVa…4†«zuyÐäÅäÛ–¯Úom‘ÒvÇ’‹nŸSß%í6AþÑkÇPj›9&7®eU<®cë² ñOQ|°¢|L‡ÉuÔŠ*ìâ=’¦üúè(1Ÿ3ç p&qò¡éjbïš ÝXV]ŒÙ™ýchÉM"ެ"úúáýq¡;‡FRú˜—¶X‚±¬1 w0Ÿ)?´(¿[j±“ñöÍ t¼Ì+w¬oìûÂÒ õX–vX]>¿„…æË„ òC®ŸÏ9&ŧç²t¾Op©%$4ùÍå›Ïˆu3Té·TY‚Ýñ¹Xǰæ{âhHÑçºM B<â1g]Æ(YW|´^ÀfÕåo]gsƒ¶yâŸÏëʸ‚Q\­·èµ$™û¢kHϾš$‘ÅÔÈmÁ@äjç6õŒ½£/æÐ½Øî ¯Tâ7„7µ›[µÖ«ÆgoÁd¸¸4æ¿Ê…[ŠÆl#k×ú#c„ÒÔ.œÜ>¦rI”Çè­fAÞ&P [zžÈÏ×DçíÑqÒÕï´HªW³h•ú_*;òaTìã¤{•†N¤#Ýù/ìúUŸüX6O ,½{! ² ^N‹º6ÂÜþš£\oˆi ç<çU‡Õ¥¾ýü[·›j¶®vz… 4¼ÀŒ¥Ï«"·tHâËÌ:˜ÉWö‰Y,˜ëܺ ©·›×e6`â‡U'}ߨ¶0»"åð¸C½É*‹µÄ.6ÕZ­T´?L9¿eE%K¹|?Á¨É¬)/¼r…pÛr¦CçØ¤°q¨q6c”ä“\þzâšûWm•[‡·þGplµŸÃdÁ› õ Éøâ¨s¹ïb¤ W›…“ñoñ:™2HžJÞº4oíc²Éÿö”ßÜ 0Sÿ°Ó¥hÔÒžÇw}Ó_$ËøÄlÒä¶ ÜÉì³Õì³ÝålàDÈË“Y—UÇœô»Ì™+ŠW®búO´×Ãnó^šì]GÁ°Å¡!@.éɳíß;óû|¹ÝLðEánÒ5îåErÑžÖûSLë¶0-Ùæ•ú£%Ï”ï ]£ŽznÒ­dÿ ñ 5aø¾‡¯åÎã×@íóӃɭ…atµ4ßI¹ñÕÉѰD¨š÷;û³‡ÑÚ¬#>˜X–°<ÀJe>òöޱ¥ˆÔ•…¬wj쯟³Éޱ蕠%ÍÛf·¾ô†øì«’%)ÃÚ¦ÄW9ßdÂ?žj².¸.¡@Ä¥áë¸sã £¯Õh¢Ýuˆa¾+2MœAiw?;áV_[‚¿ÃXeåü÷3bN6“&£!@8h¨ž aùûª}œˆ.s?ÐmÄ"( =h(nÑßlöP6y›v§5û—glÄ~µpi•0Z…´0âú¿à·ŒÅB`tû¦DãUåFÇs±EÈJÓ“Îb…ä£ó/ϰȀyÖÓö­y¢Tσ`ÂÚy%&Û+ûƒk´ÈHÄ—b;KtŒÀ¿CèoLÅÅÑs—çY€kaÂkh ~uù<ä"Ù©òŠA¬MÐX<0ùehu™Œ±´Mås“ÇÞ œÉ“n8ŽåXRŸ]P·Ód~×*Mƒ/§‹$@5Ck•Êu†þ˜"2} K]Ù2šh“˘x%ËS3¡ÿVÞŠ#oŸµþõäFü[X8Tñø»@|/äØ ¤Ï‡T.²YTÄkòc8Vm<_Q])ƒ!ò˜«t60yÄ@Å9âèRXZæõZ,ÓîMϾ…&êÁ1®”c~_°_ÁûõQ:’;ñÌ„`ùüø’Z>„5ÂE4E#ább$Û¥Ïüžœe GCðž†PÛ:*m¿öêÇ’Ñ*G…ˆq-}Âi!ƒˆÚ ƒÃŒKÂÐyÉ—pó¿(IÔo^¯ŸSØ™zŒèØN6¥…‘˜¡§ÒªžÌx<»†_ä'zpºÈ+ÁíÛuuŒ!ÎíÁ®)Á…ˆ(jÆäôKߟVþyºÊÜñÏ`ßEQë´ÑÒ¤³‰Ðà&}†F+ »(h‘q*oÀºÁ4v°n0—NmÁ™Vƒ ªrúnMØJÍ©ápdISYÂ:†iáÆ‘³‰„üBô³‹0˜¡¾HÈt*ôúçdœÐ[Ppliú­¥sØŒiW‹•? ºÎà‡ì”d`.¬.nÜ×¾·õjehR²Í¼Öc3pìÅldÕÀçÁ<È]u§œfîÅXK>€lrzS? ”Xä£`ð±ˆÌ‹‚¨óÚémîú¡|5P–‹¾¨ˆ9ÓYj7ý!0›ùáWÖê0“Vc{±ÍFD·HŠÁ>1Ö Ý¶2"÷ §¤: ƒŸ7 gµ•EoøÛ*#±‚Hê]DÅòD£XK…´1íšvÅ3òê»l¿›´ÚðÿÜ@­g"21Z£0Ðö ùnžx;á{Ý9D³¥>ÁY-›Ü÷Y%]o•Ê1¼Ü€ü$ú Õ‚w™÷þh¿Ó¿8Ÿw‚†T‰$“¦xqÇhúÓB&¨íE>PÌ™àG!È™‹'“?+÷{¯Û¦`A!/€8æü}Óõ泋 χ|O@܃ºÚ.–"ÁcoôBwˆ0å"Áô ö‹‚-f¼Ö[ Èz&1 ¨ nµœ}p/Ÿ?ŒÞˆ5>Á߉3ܵM4Óf1ýJœµ‹è 6PpØ(jº&Sæ6*y€«1lVŠQI­¦ð¤«ñ u'§0È’?ÁIìþ›¡Žóg²Ñ6ZWì?XFxO!+t2ÍáÑÁïÙpª€m Æ€ðHœö%TÌÀÝ|Ê ïK7ì¬[ìTë„^€Ó¹Cù”IQ,7hš+|ÚÚ^=ÅûEÞc±5÷!MÔ©éÑ1 Ú›ý8ßä¼LJoÿX€KLºe_ÃÌmÑ<`ýÌX¿m@e-C,ž£}xô €r¶bJë~û™3;”„1Æ£y¢ùŸËê}ûTVÁ2FÒPAÔ>–š1Ö%3o¦+w+ùï ã)Řzï ÜïPÙ0<Ä Uä?­¤àWÙ€MÒ`}èžMµŒõ§ýu 7>¢^p,“ØÜÚ$Éy,Y¹±Á~P¢-{} /¾af"’ F…`%J¤^“d#ÅðŒ ‡¥-?r6ÍHcuñð¤µ×0M ¯e§±@ôL¨”\FJ†(D†ÓÖMFÞÜwËô_$+ª†—ì§iõò|¦Û’Lg« öµ­j7Zo³1ò›ãšKÒkÔ ðx:W–Ý›kušƒJyºY=,Üøšàˆ-ØŸF„’Ë\<I~},—ËG¨A ]:4'Ø ì_¦M¸‡P~Y}«®•Â|7¢‘sL /íŠS²^ϾìvR¼u«pa÷ ?¶8D¸8€kµ¾] ŽW¬s_ËpX*´‘€@»).P´øA•¤a¼jd/wIž ^™ª< ªÇ‹ª>»:æèƒ´ù@”ºÎ›Ô‹»1fyc%¡¸Çˆ¨!ѩÌ ÂO x¤gÍV…éM,¼.{~þ)1É!@‘®xÍ,@äñ7§è¬ôßQQ“QP]ØáJŒ÷».3A¢.͈‘.Œ”ÎÁ&Jëxb:T$ñÙ@O¯çLÈœ5ŸG†63Äï-„7hòz™Ÿˆ4A¶T¤¢g jì2$ ëÛa'ŠÕž %œÚ áMa%¡œ 8¯Ü7ËÎnƒmSlê¥Ë×(u!‚œÔþ ȶnsßÔi¢‘rcW¢ÑÂÀâìTpáªzm¢–îC/賓ˆÄêYÆtÛˆÊNu«r7hþ¢•p™BÉV`7Œ`¶ÅÂM¼UMüoÄ‹cùÁ@wŽ´®2CÚ¡Â-Ti`,²3 7›"ã–.ýþ)‚`þ4qòœ`=…Š?‘u‡æR–ïf!u=ç+ª.ìâ–BHÆwlB±Në RÂâWµ´J“ý$ˆ‚‰¢d[ïøp½ñ[Ç"&ãR)¢‰³Ô´ ×e³UN’Ü)%žB5` £Ã {*íÔ„ÌíšB¡,¬)œ™Æ?wiJô)qXŠJV4ÔÚ’™™œ#j#ÆxÐLvEèünʬÍu§,+:LäMH0w\ù »:*Ò”Û@ÈþÄÇä8IŸi#û"i§Í‚Îa&ÍÏÕ•†_e"ÁyßMš@+©‰ânƒIÕP¹7¯Ï]m£í¤À¬ ‰Œ¤€4»”ÝFM $÷À)¶–ã4°vÑD¦G—Ìq˜‚¦j®Ãw’e.Ù`Yo›Ñ| Q!ÄNF’†øÂÖ£.ÐP^ `t »®œýا@£J€KÑúÈí y\/ò±,öʳwÔtÜàž•Åë·DB˜ØñÏ4ŠX³)Q5­Ä&ø9a 'ª) –oÐtѺ Ì4d' ³¤õû>ÄûÔî-hÆI'AálD@xs«€†u·%iõ‹;ê…w[ê$g,wí\i3u ç|ΙM*/Èa°t”úbß „Œ*‡Áº×ÀûàVmÄÜM%Y‹¾Õ~š$n_õ«ÖÝ~Q°5åÆ˜óÈL˜Hh¢øG°ƒ8œ®²a94”³ý:à™ uX*`P&°êÎ2h0Bø7"BpÉ„s;`›`¶¦Ì*˜ÕìLŠPד¬C;Í]Qã¶atl2f¹ X±úU[ì‡`ë^Ž•t¡ Àÿ„è"ëaÐr›ã?43VÒ€a»v-tÜ…5ò;¹éB͹ËL bT!€"ì(òW'†®3 \DÁž 7…Ò–|]ØAmR¤©^íÓüÀZŸøØ :ÈŸØì6‡ö4ˆë¤Ý˜dŒ­h!¬ƒ’Õëp»Ê+`D3›b%†¯_ªÖèPŰ÷Í ›l *HÄÁ}<¼6›æ1˜£ñÙ7Q±À4™vƒû‡‰–ëA³Ð–˜KìÁe1æÈ%î æ“‹ªÃAMg˜Æ ’§¸ñrj›4ÑŒ?>O† S¹k38 ½©~UÊ„« ×m’ã•xË’– •k(ëàmè&cƒç³Öàÿ¯uò»Û³,¡ˆÍK%™ŠBRƶ,' \¦Àî'fŠpÿ0Uh7g¢XË,'¬³µ ` „WÍS… Û·ä²vFL?©em5™@¥¬K¨›®Ê‚˜‘§é´kîj”Í@Ìa0ËèõñÓf0Çy#zt!ð·@`¥4a¥ ¥kØUf”· awrq¡( |ê°å8‰‚µ®$è±Ñ ˜\뿾½mŸi+¶ÆÐTÂMpÌ'/ÕCwEâ¶iÚœm{ØÊò <²™mæï4 c#̺À¥–z9¥µj4œä ªä7¹3÷6½R…â®Â‘;,à†`Ò·ò4€¦§)5+¥Õb)ó‹H3¨«mÑ0‹Aªè‚òˆy‡»ra×ÂÆ?¶ö#þKëjž-.ß°]]zÛ½€õœ¡òëä(’ ûp¥áØ/µYÖš=WOšë° ¶m×tÜ1 wKñtG-Ù^îaЫ*gèƒsºå†&ê‰Rç'$ÜO¨<$r_0¯(î+‡M@ÑÖ˜[*\Ù–,0«Óõm­fîPåXLË•¶~ð™Ûä©Û-y@âê3-؇ê>Ÿ*Own0m³ônÞó¬é”Ëk(•Æ 3hâ¶Ú±’€Â€ o¸„´†YÝ&‹5ÇÎZv\‹taàgÚìÛ=p#·ÈÊÝ–ƒ3xJ$ȺÎÿÖÂ|3cràqæ¤]ÛÌU¸N|ºñï&˜`Dz,Ä9ôDS6¼•ÏyRÀ &6·åÄyÊ·iëVz…Ò¹SèŽ</²ÇÈTÁ,!¼Ì· ÒÑCm¼mOÛpí(d:&Ú½Ú‘Ðʸpꃩ­MZg”Ý›`xW¹ÖÔFÌ&YvzÔoûVÒ¸{í`‹Ìp¹ñ‰Mˆ’`Pì9œ˜Ï-ÉúKñ •~\p2aš}?c[»›ÐÝ‚]XR7ïÞYš-øÂ¾é>ª9}»19&fàuîåìsÇ q‡†øgV©Îy˜Óæ/ÚÔÕm:Î:õÀF՛撳s7ÝGûwnÞø‰0ù‹íe8Ë< F)œsFEDÿãîÝ9a-¹`"‹5ŠÖyCµÔ“½¤e¿ÓiºðFaÚkœã¯‰])ql¯ÖíÜÇ~BŒ´å±Ñûò9:ºðGÕ‹wÉ j‡°ž -ˆÔøÖ¥1ò‘0š±žv½ô‡{&5Íku»Œ[Yr¯ [È#Þvœ¡«M˜ h´-˜“´Øµè-4A–ûUJ<9÷ЦyC²ÌãæÕ§*”†O—ìmíÒÖGu0(?$¾ØSÏŒmkE¶jnËgi­âóí—¶,ø›ŽðYÚ¨ÊìH/A8ê¢Íh á²Qæ¬ßÌè‘ûŸDð|›ö£ßÍÄeDì‹1 FWö—ª=i߃~IȪó¶¼IËÀåOå°Œß=3×[ZÉ€0ϬLîᬣiÿVg¦­ˆÇ݈{9FŒž„uǦђBñêÒÆ?±?±I ÅdJù\ TíNét9{ʶ¨<5kK¹LŸ¨uù¡-n³6oDûjä˳«Ání"f›w GŽú;$'í Ó3¿ wæ8ßæ‚³$OúV»5#§· 7¥°С‹Ïþi< ç,”çVåmùÆ-Õ+3õºâ¨B"«vB•è°i§‰Š9íI‚†Z—kž6¬V­F8è›Héx6—ÇÂ]çdøófæcÝ³í ™‹rX‘Joh¡£¢J Y`Gi_^J<+þژ±ËAØO½¦‡œ–RùþÖ¿”Š|É9™­y<)…)ŽU^ÿ,)ÄM Î÷õÞ%úøe¿êÃV~¡)¯Ò‚ ‚7%ûçê7€Ù¨Eçk‡D=y¨´B‘æhJïӞį`ÿ/P#åf† õ 3©í<;é* × c+ÞøH¹£¡B!÷Õ W»õ9LÄ]/YEePpfIú¼so¿çÕÆ~ X]… TiÝäR…ëDâåcŠX‘¬(«‘¦±CœVï”`ªUŒxô‘~4bÝ|7}rd]û;’oúù%Pé7 Uµ%ͱu3lV7»ÓÉÃn4ñaÛh©»qSßÌò—Ðeù¦Ä‹Ü 꺂¤a!gÍJ'G‡X…ÌÄpAÆlÈ®Øf'Ú,Ó”l¨‹*\³ÀÉæï¥Ý5é*!±LÞV(WT›Üºg¼¦}/$¶¤Þ{Àl0˜è¬d0¿ÝJ§U¯{TXYǸèS¤ú^Qa!KÜÑéü<#Ô¬Îúà¯ô&ÇÞ̓LÖàêÊÒšxv ö÷gâÀr7À®ë¡o™æ}¶f ;&bXfþü+ãºòüYy6súf¶¿ìÞÀf <5ïRõÜé‚ͱ Éòó¢’GÁ…]*6 y°@í1gÞÌ“Lî”\•'º´hω–ƒ.ŠÉhß7¥ÁE+à=OÇou=aäd=N3{5²_ô¸6¦Ø^"Žl&ÇCÖ ­Î—°íé8µU^R<–±76ÎcW5ÜMç.6͑٠қµžÈ­„¬íVKF2][°É*ynéݱóÀ‘¹LYf¢åV“h\Uå'“‹ÙÞMØ—`xyÊñ„»ÅiQ'o·»•óÇCC¶slÎpØ*˳Ân»³ÝMË«OY#Ê#v…éŸè¶¬i"?pw9Ÿ +ö‚Íîiñ½„‚ñ&²n¤Œ yU;i1Y,;'”p3CâA‘S"@&h¿·L0ÎûrU!Ð/=á$€ E×®éÍày!K<~`p–©Îdš…¦H$UÌ:Äi"¼fîòápý„‚ ×/篰=&ÿW€57|°UnÚ‰+‡À¹_uà;Y¡GXì#6ÞM®4™kΗWŦ!ƒ¶ßš\@9+s ý@@Ü¡iÎ…OâÑÏW„%7Ã=Áq¾`!<Šø¥šTå¯âˆPÌ`Î(ÜB9Ú&JlÚ†¸²Î¨x(ºû#WQa¿I€xõCÏØ³‡ÐtÎÌÕýGîKŽgä±uÝ¿E£‘Ëâö¨¶îúXµZ*O8ÚÁÂjÕþÂö×µi6´y ¡0VÄÀXE ‡¥ÁÜ@§P÷gÆ0äñ¢WY÷ég‹€(˜JïËOµ a£N,óK>ÂÞ´ùOwï q!M‡§øÓÊîo£óP˜ÙØ®N´˜GB1.Y%Ò2@¥|Q; œÝ„’ªrrHþ{¥‘º¾3Fß^Ìj¯¾ÆBpÏõOãɯ Åw—\æõlÙÔ¢Hº"ëÊmZ+‡c©&ùë‡Q§PèeÿG‘tl«¶ز#8§ÐÀÒ¬²ºŽƒ‚3YÇH4aeÊ2'èN+>ªƒE^!¯´£ì¨¶9ÒwZ¾1™×GóÎÔß\ÁZ®—éÈÀŽß¥1zãB]ê‹KËIwöçxE:#¬pyÖ.¼WÖº¬m}‘î8gÐgMyj!kø^`Ø{³H6óÔUzZ>¿6»èóǬ&æÓåä—6ºÇýw«ÞUH‚ã]ï ‘Ñôųîƒ[-Ýg9¨š•Ïå‹´ %>’¥8>½Ø~—C Õª 7ÿÂdŒËGñ"âÇ@±>1•`K;ms®ÎÛ˜„1±Dk|veY¶û$ýýœêÖ]²5{(C1ÁÌÛnæ(,†¯)½o2%‹Qzw¹Ñ†‘¦‹‡\a@òÆîí“ç´¶Œq¼ÉЗ¦¾ã ß ³Ïà¹â|«êsVÇð¯•ÿq8¤ÉÓú†Û£ 7øf©%è+Np> ¦$)Z¬áÇVG.êÜ–îÿæõ':³Ìï{¯òÚNýyLÊ?ÿþ.ISÁtyÑZç” sïhÚÒÙÚô°%˜ ŠeÔÎ1ÁŽqpÊ”¯9ÊSHo|VaLÖ%5£›t û˜ƒÓIñ7¶¼ì¡ëY3×Q{ŸôÑf;Îqƒ9–Eúƒ·´³–Êù›ûÕ)‘c4J3¶7m¬I¿{4Ÿ†›¡×ÙDéÞrcJ#qÞ¦š ¿m㮫«iJÛÕ¥d“¬/¿ß7Ã83DMZ€Siw>–yß¼ñãý¿M²ùÒD” Äû©NÂЫK ,É“š<n#F V÷V à™älyœ•¸l¥aˆ™®­‡µ-G#µì¡¶ÍŽh.:â­ê¹ø¸¬iòšä¨|6tÕ@$­X~¥nuá£Ú ö´Pÿ²PQcÆ‹²o_€5a÷~ˆj÷äÖw^d8Iˆèr˜ý;$Ññ¥E¨9f&óysÔĬ¾çmì\­KĵáúÖ±ù¼GX£h£Ž.¡t.ºyn: î9úH£Dø¨ªâ¢„¦bƼ<\¨ÝÍ–Æûá»È°Î¼PN·a.KU× åðJž~#§ô%bºìDuU,Éo—•G|+mìiŽÝH Jñ·l¨»/þTªg›¨Ñ«Àh¹9·²ÁEhkF ÷g胸ZÉeÏìËŸ¨aqpNB§ =ŽQø*s+‘]¦ûB’ƶ^ ø¾¿ÌJ®áÇãÉœb´Ÿ2š“p U þ¥âw1óTã´vïN~ßiMIÖ5ØSÞ¥UN!O2H¾ï¹ttgyÙç»èlôóoòõoÏstò¤…àSC¼R?DÞëùnz™7‡–¡$ë”mw>,-¾˜MÓ˜M¸ìË&±7£»¸R¼Z·êÿ삎qÓ’Õù÷YÀÅïúkîïì.êÉÌev][˜8£ŸZnpöJt,–gâ|þÜ¢Ó0k•Å„•]»T·ʦ¼Gb˜Ñ_`^/lmýA3F‡£Í UL’½%iúö̱±œŽõ“Û~q½å„YYdP§,?ÕÿÛþÎäö þ†û…ó¼Ã«õA°âf`ÀœŒK IæL™w¢! Ë–.¦;ÁWüüz»þ?üùú?1W]AŒÁ.9GÜ®ÉÞnT‡נ5íä¬íG»ºb`ð”úP MÚõ¸ðK]]rÞ&°b:½DS—dÀ¾e¾¥ŠTVÒœJcÇXÐ{õ>ûŒ]Ó6KÄî¿ wÜnåÍ¢¿^ØäôîiWZÕÒ‰=Ll²cÆlŠîÊ'Ûºíy¾íhÈô,tó›…±ôò,£Qê ÅÆÂ®v¿—³ÃCýÅcñkhAÜÍ8šÃñ¿½â]°ð‚|n«3îÏ¿…‰0£Oâ¸ãTQ„ÆðX¿9`_o'îÒðã# T—ÿ5K®¾ð(z ÷Ž˜F§a2dÆ "4ÆcP8\ÍŠÛˆ”´$‚‘RÓ‘¢ -Á¸‹Ó3g–² ÜO¯‚ÈÉËàX‹[6*"È‹-IÅa¹=ªµâŸýà³^è²ñâ fbõtú:¾©Ý9£—àæ„îÑœ¢ |BÑ(´%éÍ}0î±¼åØe´ŒŠÿ¶ø°bŸvQévvŒý¨Œ>y–ß5úä[W¯ûxß=ù"{ 23lȼæêüd§@ÕÐ/~ª5YÄüuË2|áú|ñ¸^<Èȇ½w‰5œÑØæCpÕsmcpçRÁ¥uÞÅH/F!ØÞ>9º›Zïh6t<\Ã^΋Ïý¬’ŃšÓè| Ç|=ìy F¨ÛôbÌå#µÑ›/Ë·÷½¾_¥ðŠ ÀËh^P$½ûò…¢¬ÈÒR^ÊíÞ3è¼°+Ä .öŒ•»V  æ½èÆš×[àoÚÔ¢õÃëÀ0ô•OÄf3wf)åQràªÂ¥‹ñh„Ëɳ48JF#;±PÒ$RË&׃%-¾¥Êž¤iX‹Î9B¥®×ÂNj4s”ÿøtU¬\D Ö"Ÿ7wqÊÁ –'L2Ð%´„éýÚraQ cAàêNÖ„,½ø”Þ¤¬^¤y_9qZy‡(X+ Lb®Í‘dHtø=Pã—.³¡s¼¯ûyô£ Õ'Ön W³ABš?`CÑ–ÆýÚÅ·ðWlô¹®.¸Ð{E‚cmDÒ9¡|AhºÍ^ˆ óü”JRÅ×%mÏ ïó‹ • ]M‘xS¤„ 9¦W×Õz¬æõ Ò9¦™‘² æªCíãó4L™«$tÒh*C¨}ëM™ƒ}º,67¤g6ÿÑäH{kzÂlr­¡¾È‰tÝ~x…Û9QóÝÁM0•~ŽÀ—Gì/[̻圗Å$«$ÉŒO¾ÌõNѦ¥[¬·Õq¼R|¹J]ÆÇã[,a«.ÿÔøûÑ=®ò“¯¶ûþÈÒÁ¸¬—^“”ü䧃‚•¤Ëa™Ü Qà(ßã8—Õ;>¸žžÄqÁ7ʲÕoMž[6?¿g¾móÞ¨Dì™Å{i]¶ÝN©p6ëÒ‹Å^ô¯÷¹Ê¾o}qNúw«¯ª¶xKÒ±|¶h¤+ǶlŠÝŽæ6‡1ˆž¦‘ÏöÞÔÖESûƒØÙVˆW‘±N^ýòþ‹Â©Üµ1èé'›*èä‹búIA^åYpÖÈÂÚžepøÒÐ[3yú8âœÝ¾QfÉ^øâ/*Ér–W¯<ÙØÅ9¤n}l#ûvÖ˜YÖ6KHÓká¤c ‹Ý±ýKÅÌBZ@Ö…¼ãÏø†¨¥»ËN•–ÕcdLƼÜ-&`]Šò/BKß[‹€ï–e+?J ¼A³ è lâ[e“åƒbbm$ZËý¾m°¥Ö|ÄŽöϼ_½"ãõþ|P¶IeýR¸‡?j‘xÜð¯2h¢NqD|ôçý¬ý±t^eÒõžS-Ýͱ÷âX·nÏòÒ±hÃôìš½ lMËéV—þly 6`£tFÓ—ó†!Ú¶ZŽë Y³ù^‰_Ô¥¿¨ÅL¶Bú@œ­c“­Ä{³=Q#-ÏnOJš$JËæûæ'fNQ'ÌMRÉäñVK¶-_½b£}¯"Õ…Í©f#9îBÛ»~ “æ´”_î—4häÚÔùÐ=9·éÓ›‹÷ÝI„*ÂZ…f!ø‚å¡h–ÒÂhɶ¬ÓèÎíöèoN­ÔM··žËüQ¦¹º×Ö{Ó¨»nwQ×þÉÔÃ+ù“Ó×£d±²ªø-3¦b²ƒ™i{Jv3kʨ=/c5.BZõ¸uœœ¬b>šþ,µß ”ŸuMÚŒévTvo€Õö Ùà—1ºúóϺ†äºÜÆÏÜs¿±=d1k‚^ö؉][À:qÑ%°ÊãÆÕÛ ‰äg8¨$@I û§uî-& Ëá^lm!\ÝSSöN ©òµçoËBþh¬§D @þ6ì =$u~ƒÃn‘‚Z°Ã*Xï³* ‰þ~P„»ÀU+÷T…gßÝÛ7s™/öQLöÿ§J ³útZ—à žL'%Ú'6KÙãDp†A8Îpã7Ói ,ÊĪYÊ¢Ge{Ùªyáö|¡b‰ß‘IˆÆ†ˆP ¸Ÿ§èÿxÚŽË«³bÿƒŸÊ Q±Õ/`<%‘˸±Ï™\ÞØ~õŒðS7Í‘§]dy*á,^^ž¹•Ÿ­C׈B\7x0BÀœÊ“r^]vp×fàÂ:¸Ð&¼ ƒAz¾4¡‘,Õ.°µ¨ üX;â67«°¡D<0Š=ÌâºnV¥öi¥Îþ¯¥Alí$2$^ïzY8J™—ìGµñE`èÂ)¾Ï‡Æð)¡ìÏÕnÑýyþóí²ÿñ6°Èøûó6f|­ô;üA >¸2HÄü8‚~ØÊöçSÜs[~Te+ƒ§ ~S™ûôZ²^L<µ <égžŠ=ÛqÖâç0NcnÆâƒ¸ËcZW_Ôýõý²ÿýL&yú«@㆑1*wBÖíW/@÷6y¨Œ£o³—™²¤õˆ9¦6bÁ<6‹®?uYéàÑæu%O<¨wË¢=` Úy]ô=gêB’Щ`š¡ Í`Þ+ÓnrcÚIKÊ\}ïöÖúèñÖÏ¿çÔþ¨rz¢ÏâéÝ)iÝÜ®Ò~LJ‹ €=4íÁ©5uÞN?ÁòùÔbdÝ»*ô<"ôÒÕ^þ+dd¨ëîhN݉k›fÉtº«ì€D™ë6¨þÊ›°“0‰?ÓÙˆ_t×óE[æ€c˜Nb¦‰1ͨ†k‰IR>ü ÝH†bi•áès­bØo²ªÌIKw«žKÅ"V4W™rrðo!ÞZ¥ð!¿Œ°¯¤)ÛH ]¸´5­w‘‚éС¦ˆ"/åävzV‘¹r„Á¿ÚÅE·, ¹³/?±N²¨ïu[œ@ÅDü#v¬Œ l.p¨¬XÂ*e4êœ{]ÎG7Õïþó f5dÃý‡ÍX81··ÏÙýç>§aк9K¯CŒ›d&¬¿´úWÊ£.¬Å!;ÄêÛìØæA³Ü¸…C9}mãRÆåëêiÚçlX(rÍê­L s‚¸÷¾j9¨þ™VÔdD#& ˜`ÂW”§>x<ÃJ ¹ÅðÓ»Ì$…àº~Ý{s™5…ó± eR_Û @J$Ò »S˜â’ª@ßqÙ…ð^ kâs6ûj#£Ð0ìõáŽ|£G3o+r>8ÇÙ^æs´‰Ôi7ÖÇO³N`à0WeFŠ—mwÎ¥ÿËòîî4ú çIúô·ôJþ ;0R7«/2&_»»1ã^ßebùÂkÃ÷P¦jÛF®ú¶Àmúÿ0¯¯Ž³G˜z÷Ù‰ØLì¾›ÚÁI¤Eg!L¥œ:›§Ce’øÉæ‹{E×Xhb»f¼lv¼ä~¿îrm…0¬Bh>œÜÕD™ëòE¦¥æœCŒ¹á× ÒÄÝó’ÐPC'h©~_`~[îÄÒ}ý$¦YÚmíÈG».[Êa°…Ò,¿Óì¾Ìä›o¦Œì^UB[»X¤#Á‚XV†—´FKœKâ¥è?”›¥®Ò»x¢eVuÓŽ jixÇr½#=¦E/21Làýú¿¯„ƒgÆ­0ˆwý`ÂîÑ%¦*ÃVÐ1Z f†1KÙš0ìüµžæ >I’ÒáL¤s’ž9U82nŒ{Äóg 7ïZa˜·Q·ÖÊ»Ùó ­ï~ Çì¥ü1ƒ›«Íÿy÷—öúøù¤m„Ÿp`c·v±AØ|ª±î´™¹*lË:Ã4“uçÔ Ã ŒLZ0‘ýÆì²²M€èL³h«JEû©â(Šùay¤5ÍJT«Rƒss›ËCÑÑ&ní±É Ÿ©]-ƒe`¦æÿù›ûN—˹V¨”6²ô¿HÇîvšäÜ<ü(¯ ×!IûZïi–æn+É“R›n‡L#Î1»ß%>…œ)Ю÷•ð4‰´M~ëÄýŽa ·7ÄR/×y¡T(ËÔ0')O€+–zctIlž¨­j^ÂyûŸÿ`RíØWä®ÆË³žŽöžœN(.Þœªo2‰Ò\8±ê•¿¥j†¡ím€¨yïV ÓíE‚M{ž£ ¡ì¢â÷ßš£$Ï›eŠê)Þí‹x‘³?DÒÒØ–àVo¹qru1F–nÿãòÒW¿ÝgD‡Ô¼¹™Ç¤0Ù²"Ò޹؄¢ ¾ãZ“)0§žXog!‰ƒ¾ÅÄL©¹sÓÃ5#¥û¹õÞ"@àþVfªzÚˆW›ÆGeKd' ³ZªöÃ*s6¿qò PžD5%˜¬ÃœIÒß¿üBþ~jëñ)å××6îÜKcæ7e#¬ÁÞE”µ†è¼ä‡ÎY û¤#eÜO~œ’¬TH ºØlJyÏj¬ÖÝf_™:4¼·¸ë¾ýü[Z"“#a8§GSÓ‹Ä&²…÷a„¼Æ(/ǺÍcÿ¿?x®Ÿ„ÃAçÉ Ýh˜P+8IiC«ÈÖµ}ÙŽÁhÀÈÿE‚éžræ[‘ˆp¨7uUÏ„£ O$(<Ó9e_*õy ¦%öYÈë\ªGf §­‘ã¯­É 8 ô ª;,”*D×<šéØ ЦúíïB1ÅD°äkІb2Ä 5bro̱͹Ðv‹¹{p*A´KÏœ(¯Ä2Þ*·¬L<¡Fw'›åÏ ¿E—jÌ»oån¡QmZyù09ð­Ü-靖Õ4õ‹!xÌÿE-ù¹'J.˜mœ¦$œÊ"h\^ŒnM¡pÚ„¨¼RœB”DfŽÃèeÑ$AL[´ÖFËY¾Ú/õ!­‚vû™£4xžñœŒJãNá´ê ÿ,|hzFb‹Ckncä¸4¶ÏR•ˆ ŠÈò8Û>÷˜SbÚ-7æÙÉ`P­ÎmŠvQ Su¨?­¡™â©07ìay¸í†Vˆ)Ëm ŸUƒ-}.oéâѪ*± å™3ÆÈW^TWõ¤¯SLë¦äÚháTËELY”ɆŒ¸Ü(rÊòäk¸{„%H’?#œ©¡å£tPÔ=F9$hVeã§8òœ×‘©YvÚÀ£Y £~Ò œ¡hôžÑ¨&‹ok’B#öƒY@i`Úü]šUS›‹%æIêvt!“F| 2T™‹"gSœ!›°QAæý‰fPhN0¡)‡ë½ñÆ FRZb6®¤SV݉Â=è,a¸JI¡¿5ïg»ƒä$¢TOì¨ñ°‚$Lä´È\åñ½L”v‡:ƒSn5Árgãâü2-µö1ÔnÙ7Áæ>w§51»‘¦ÀDÊ·Ú6jƒ(KßmÞë"AǬ9Id}ÉļÕl"†ôɾAèkà*¹¿ŒDÌXe½³ì$ÌàSš€°÷ó±Y¢üªlçûHÉŽ_‚òby‘d”–MܲTšÈ´I[0åE‘ŽÍx,¸¯Â,0ûD‰¸)£yD•Êì4ŠÞ–Dïñ4aƒm… ¾Zþéf)“ê™=• 9­ßßQ̆Æù#L.áTÞž")ÛupÆ,ÍŒZo¶b%hßdËÀM‘àj±ŠiGEí=1ƒ’rå=ª‘…õie)õéRxò|c+Ðg€ºÅ?CþvÐÔƒKRO‹À·lz+à¸i£TÚÙЕz·¸PÔf4½ÚBC˜)H7dº‹Õ3>q{ÆÃxtqbRZmŠ(ófÒ‰ÕêUnÀ¼›•û¿Æ®$Gr]îÈC| Ö†5ÛË*äýÏôÍ’¢ì¬~ 4ª²¬¤8I"7¦ªiÈ¢iJ¸QÌq%$ÑRÄGr ¹Š•àòí×¢ajâ*=Ó´ð.îÎt47ÔÄr­8‹F$êé7=%fG©ýƒôÔ°»Õ)YæJV¦Æ`_Ú+Žy±¦Ó$åŽM3hkVó‚Tc ŠÒ|s©"ƒNV1C“v®ÈÖ„dk}60àð¯Ìç’IL2YCŽtë8/|Ûo‹,ð3ãÜ9uû- }Ÿ¦J7sP)è÷ŸÀÐg›?ö·Ô K¤N]Ñ@œuz”:Õjàüxø¶Ëdicò©ÊJGâþGÌ›·*h=V¨•`æ 6¸ÞlÛXÈ[ýFh貎ÅÁXÌ!u5˜“fêm-Ž OZE¬ˆ5ÐFéZ¹Sˆ*„¡cp,¬@OFåX墨4r8®âçÕ®XÞîS!©üC¥½£âÈÍT¦–á…Ò«Ö•Æ$”f[¸ë&   ÿÄÒîÙüê°šÂÌ‹æn’SÐJ‚ ­rë ¸à“"ÂL[á¶£t‰!÷éýn8&4^’’ü|gõ¾%Íï~óTpÈH5™•ü É¢ É¥…°'Å)j@®q9'‚S'Yˆ[híoQ;ÛкùøõæÌ¯>H§îê¢Ï6!DI§± u¤iH™-»' $P`4rÊ»fvbqõC½í´¦Àý„xmÞ¡ï%s÷€^®3NØ–lS§ӄ¬´CÍS(X4F¯vÒ(.]ðiÚF=цbÍn1g›Õë@úe?ÇïAÂîæ4a©éxD'mebÇv´}áüЕ|bi¼O¨B#Ö \Ïe¦l†Ô¼aBp*ª¡´ÕïZ@…^”æp4m í0Ù¤Þ*!POúΩèhHºó £ÊKÿáU²ÔéÇÐ|À´T=±¨’/ÕTö@ß'§ä51›:–µœ“N`ѧïaøX%òÅ;+<‰½Û€,©a˜ìn.Ë)¶q3Z ˆLjlæQ+$í>gE[‚ÓÑ’¨ËN¯¤[ƒ¾+H/ФÑMl÷€®œ2²YjvuþÍ”Âe~d—çRXÈðc´£Z­MQ7RÎ $æ¹:µ!¼±¨b>)„$··ÒÞÿ`]Ï/²g@§8ÒÏøCò(ñUf2ü¼38Ä3Âûj‰‡­ïj–%’Yø0#îJÖ ðW3–T}fW×Oõñª ©vhÕUÆÉikÈïîÃ|M»xØui3ç7ôñºÅâ'MÆ úþù‡ûòtí´_ì×Ç<è³0•N£¹êQB~ìKq̆Ä=Ø÷àóƒ>'žúùý€óQ§Ãô¿÷Gk[@§Q›ímðÀ® ኚⵎÙûmŽ—lú4õiä/—©ýÆn]HwO²ˆbßíçvÌg¸uòïr\³™i`A°x¦2K!šb§†MWd_Õ 8ša?ÄÖƒYßž_C¸ã ¢zâô5…z #ƒ¹$Q6!·fc²Ul2þZÛãÖ×ÌpZì „¿`ûJÉ@æӿ韋ýñmSS ÿ§LçRšÊn wî·¶sóÀWÈÿz„ ™[oî!¢J]]KM¼‹KCO {Žô%Y:š&ê*<›ØìoyNz«P<¡o´î}ýçD_šmz}Hï I‚-enE*?Ý•Ýh´™¥bÛx²¬©'-Øjõ|ILœ´C jiçæÂ7wãXÎÄì¼kˆS› `wý)i¨r3?ú|Òœê¤Ùg¬ÎIÆlžè¸µØÑMÉ\•âó'<¡èVS¸á$›O:8‘Ÿ*ù&0ÿsán°þæÏ„·ÉòŸ7œ¦güMÝùÝ(&â¤ë)0Ï€eà¤êáÙÓ¯Ý3©c\0‹´xKOÈiÒæ:›–ñÊfös„š˜Q<¦_/$Ükí\žô*&ú¹FâÆÐ#9ºÊS¡¿$ñ5ÃÆPLÁRüvN̆‡$M<µ%Fù÷é©Ôç“¶G2ˆ’ù¦éÏ g?²¶*ÍÜû…l§è²üBà#†ýÉ(´’`>ÔH‚ìÖ|fßÍ­”ƒG˜›] y—nÍtÒå™ÙVå©”«-¸ƒZ‹¼< ’XWÇìWÕ!!Û.a<Á—Qn†CDÅ[Äø^!ƒü!’åV˜ü-0AЧƒ¾ ˆ)<%MÅ.Ê왹°¹È·¼¤O?¯*U¿¶!@il_˜8*ŸuÓCÝH»œË"r¶*)H–´ë'ÎYva™ê¥Ë“K_„¥ *)^ŽÐr×-Œ8pÄÞë:b®T® y8ÍWXÒ q[-?¯õnׇŠÿã–1ŽžËÏ™{·9à]&ov@H¥n°ZôLJ-Ïh´Ù) ‚Á5ØB¡&•änÌ1>ÈÕ*“ƒbYò²¬@@ÝD $CXÂp-jŠë$ŽýV–ŠÈÄ.Ѱ¥tO†ÊÛ¢#ËÄA Eîøâ[xß¾qˆKîºÐpÍN‚ \Ï…mÂAšE «ýc4ßÁ2* bšì@éV˜È· ö@»èþ’Š8‡„Ø`;‘Öá÷º&/G”x7"Ñ·-OB‰wQSê9-H\áH¼yƪØ×%%tÉB€¸ÇûFLÌ=¤z§sG<ð³ÌKÐ2Ü9SJbÚWÞ‘Eĉ_LFú•àý@<Ìol‹ ^SpVG.§§lU|q mÉ%L¨@Bvæ9…¤âFwpv;¨ñMõø‹ž‡9/ÄŽÕ‡™*a'at©j2Ûù»Zà[_yžQCkÄ$@5Â…J¿š¾ˆê3a­Üìåó›%ò^N•2§nòƒ<óøýÔ].Ü—Gã)qÁ«@Î ÎjÿE5æB#c»ç> ºÚGÍ£I¥ßÌÑ4oÚ©u*f$ç=ÞD;–#èÌœñœœ#”<ÙŒÝÍSõu ïòÀD^º/Í6 À“üÂd04ÌdJÈÉ»GÝ[Oy‹»È=tfPª+¡úJ%ÐÖ´u&m'7IÄ3Nž|UÑ^ò6%WBlÓ®†(…N_ƶð$ùž—%W2ö–BNø–h²®09‹‹ÈœÀ©|†•”áË¾Š®L륒²ôWSÀ¤™§ô ‰rõõm]f ÞìT:–WfRêHÓØîœE¦{z™T )Ø%ÖÛòö™Õƒ‰%ó©‚ëþ­ŽŸ/5/m“¢p±‰/#rÝLMøÚbæEQga ?äW©sñqhŒ  \*Ý4£1Ð.¦ö•îÒĢ˹ž 4#}îq%ÏĦF(@ÙCÐͧ$ý?d]¬+ÒIP˜HcW?åšÞ4;#ª„+$aÉÅ/Ç™¹•¬K&›% Þ™r áÔœÞRäZÞdMi÷›—¶hØZ`$ذJ˜¡¹>Bk½žK±¸? R_òÁŸ+}& ÂW®ú=Þ yœ|jS¢ìT6Ñ›¶ãŽà§Ã)ËæÄ²Ò’ýr@NiåvKÞ‚¢êzžÄ4RÞÈEY‰^McŽ‚s²9ðB7ŸÌ±—I#¯FÍ~f÷W¢Fã~10PvMâ2?¼X ¨¾ÃëÏï±JËjIo-m¯D÷‰ˆZI¬¸–htÃ`Šðq1q°iHõálÞ4Ëè ¨ßdXÖD°fÑ|fà“d¨ë=k2èvzè|‰•ýÃ;ßZLÉ€J/ãs|yf”ÝÍM@øžÊÊF1ígSâ¶ÔÙ Hèî¾ÍãŸ8–‰!½lï<ÒD¹¯à” džHG¬[3ø6Ï”¸ïnUN22Þé¶‘ê°ÇfÊÀëÏäÌ, KMR`~–ås_,ÊÇ \¹Àû÷ŠÂ® V©ëš‰ƒ]q¬¯É´1ýsOÚW6€-Ú,Œ EÛ%ÜåÛŒ¤'m×Ç;_3‡õ¶tHmú¶‡2Q™WÀÍ™üíÔMYN@€û« J¥^n“_š®–Ùsç7Û†Û6Ø}/A\J4 ΪpÊ笚;c¢¯ê,¸ç×(!®ú¾l³ü[ɳC_U«ØX 5çú5ït5Ks» piÚs¤ºü§369}[¼ê:ê^ žÿ{ýù?PK“…O]ÃÇ”r  h-to-h-collection-26Aug2017.luaPK°KoÔ-òóénË ¯h-to-h-collection-26Aug2017.rlePKšßígolly-3.3-src/Patterns/Life/Signal-Circuitry/heisenburp-30.rle0000644000175000017500000000403412026730263021154 00000000000000#C p30 Heisenburp, a pattern which can detect the passage of a glider #C without affecting the glider's path or timing. #C This pattern "photocopies" three gliders. The original three pass #C through unaffected. #C The name is a reference to the Heisenberg Uncertainty Principle, #C a principle in quantum physics which states that it is physically #C impossible to detect a particle without affecting it in some way. #C Clearly this is not the case in the Life universe! #C By David Bell. From Alan Hensel's "lifebc" pattern collection. x = 139, y = 157, rule = B3/S23 48boo$47bobo$46b3o$46boo$46boo$47bobo$48bo3$45boo3boo$45boo3boo$$47b3o $47b3o$48bo6boo23boo$56bo22bobo$56bobo5bobo11bo6boo$57boo5bobbo10bobbo bbobbo6boo$67boo9bo6boo6b3o$65bo3boo8bobo8boboo15bo$50bo16boo11boo8bo bbo8b3o4bobo$51boo11bobbo8bo13boboo16bobo$50boo12bobo10boo14b3obboobbo 7bobbo3boo$76boo16boobbo3bo7bobo4boo$45b3o51bobbo6bobo$44bo3bo50boo8bo $43bo5bo$43bo5bo$46bo10bobo14boo$43bo4bo9boo14boo7bobo5bo46bo$47bo10bo 25boo5bobo42b3o$46bo37bo6boo42bo$42bo92boo$42bobo$43bo$133bo$77boo5bo 46booboo$78bo4bo$50boo23b3o5b3o44bo5bo$49bobo23bo29boo$40boo3boo4bo10b oo41bo24booboboo$42b3o17bobo29bobo6bobo$41bo3bo18bo28bobbo6boo$42bobo 9boo8boo26boo41bo$43bo10boo28boo4boo3bo36bobbo$84boo6boo41bo$44b3o18bo 27bobbo34boo$44b3o18b3o26bobo34bo$68bo54boo6bobo$67boo19boo23boo8boo7b oo$80bo7boo24bo$42boo3boo32boo31bobo$43b5o32boo33boo15boo3boo$44b3o63b oo20bo5bo$45bo24bo38boo14bo$69b3o39bo8bo4bobo5bo3bo$69b3o47b3o3boo7b3o $107bo10boobbo$67boo3boo31b3o10booboo$67boo3boo30bo16b3o$82bo3bo17boo 13boboo$83boobobo29bobbo$45boo23bo11boobboo33bo$45boo22bobo46bobo$71b oo46bo$71boo$70b3o26boo3boo$69bobo27boo3boo23boo3boo$69boo54boo3b5o$ 101b3o20boo4booboo$101b3o22bo3booboo$102bo28b3o5$129b3o$129b3o$128bo3b o$127bo5bo$128bo3bo$99b3o27b3o$98bo3bo$97bo5bo$97bo5bo$100bo$97bo4bo$ 68b3o30bo$70bo29bo$69bo26bo$96bobo$97bo31boo$129boo3$104boo$103bobo3b oo$94boo3boo4bo3boo5boo$96b3o17bobo$95bo3bo18bo$96bobo9boo8boo$97bo10b oo$$98b3o$98b3o4$96boo3boo$46boo49b5o$45bobo50b3o$47bo51bo8$99boo$99b oo34$boo$obo$bbo! golly-3.3-src/Patterns/Life/Signal-Circuitry/constructor-memory-tape.rle0000644000175000017500000013236612026730263023424 00000000000000#C Prototype programmable constructor reads a construction #C program from binary bits stored on a diagonal "tape", #C and uses this information to construct an output pattern. #C #C With the right program, and enough empty space available #C around the output pattern, the constructor is capable of #C building (almost) any pattern that can be produced by #C glider collisions -- up to and including a copy of the #C constructor itself, since its five component still lifes #C are all easily glider-constructible. #C #C The program is represented as a string of boats (1s) #C and blocks (0s). Each Emitter cycle, the Emitter in #C the SW fires a salvo to read a program instruction bit #C and move the read head; an Emitter cycle is 850 ticks. #C #C The Collector/Decoder in the centre converts sequences #C of PULL (0) and TRIGGER (1) instructions into TRIGGERi #C instructions, as follows: TRIGGER1=INC, TRIGGER2=DEC, #C TRIGGER3=BLACKDEC, TRIGGER4=WHITEDEC, TRIGGER5=SHUTDOWN #C #C A TRIGGERi instruction takes i Collector cycles to execute; #C a Collector cycle is 754 ticks -- slightly shorter than the #C Emitter cycle because of the Doppler effect of the tape #C being read from the far end. A near-end-first tape read #C would require a Collector cycle longer than the Emitter #C cycle, again proportional to the bit spacing on the tape. #C #C The TRIGGERi instructions cause the Shoulder in the NE #C to emit salvos to manipulate a construction arm in the #C far NE. The arm consists of an Elbow (lower right block) #C and a Hand (upper left block). The Hand is where the #C actual construction is done. #C #C A single glider in the SE starts the constructor. The #C constructor shuts down cleanly when finished; in this #C example, shutdown occurs after 122,221 generations. #C #C Paul Chapman, 24 May 2004 x = 4235, y = 2765, rule = B3/S23 252bo$251bobo$252boo11$264boo$264boo11$276boo$276boo10$288bo$287bobo$ 288boo10$300bo$299bobo$300boo11$312boo$312boo11$324boo$324boo10$336bo$ 335bobo$336boo11$348boo$348boo11$360boo$360boo10$372bo$371bobo$372boo 10$384bo$383bobo$384boo10$396bo$395bobo$396boo11$408boo$408boo11$420b oo$420boo11$432boo$432boo10$444bo$443bobo$444boo11$456boo$456boo10$ 468bo$467bobo$468boo11$480boo$480boo6$oo$oo4$492boo$492boo11$504boo$ 504boo10$516bo$515bobo$516boo10$528bo$527bobo$528boo10$540bo$539bobo$ 540boo10$552bo$551bobo$552boo11$564boo$564boo11$576boo$576boo10$588bo$ 587bobo$588boo11$600boo$600boo10$612bo$611bobo$612boo11$624boo$624boo 10$636bo$635bobo$636boo11$648boo$648boo11$660boo$660boo10$672bo$671bob o$672boo11$684boo$684boo10$696bo$695bobo$696boo11$708boo$708boo10$720b o$719bobo$720boo11$732boo$732boo10$744bo$743bobo$744boo11$756boo$756b oo11$768boo$768boo10$780bo$779bobo$780boo10$792bo$791bobo$792boo11$ 804boo$804boo11$816boo$816boo10$828bo$827bobo$828boo10$840bo$839bobo$ 840boo10$852bo$851bobo$852boo10$864bo$863bobo$864boo10$876bo$875bobo$ 876boo11$888boo$888boo11$900boo$900boo11$912boo$912boo10$924bo$923bobo $924boo10$936bo$935bobo$936boo10$948bo$947bobo$948boo11$960boo$960boo 11$972boo$972boo11$984boo$984boo10$996bo$995bobo$996boo10$1008bo$1007b obo$1008boo11$1020boo$1020boo11$1032boo$1032boo10$1044bo$1043bobo$ 1044boo10$1056bo$1055bobo$1056boo2597bo$3653b3o$3652bo$3652boo6$3659b oo$3659boo$1068boo$1068boo10$3569boo$1080boo2487boo72boo$1080boo2467bo 93boo$3537bo11b3o$3535b3o14bo$3519bo14bo16boo$3519b3o12boo$3522bo$ 3521boo3$3522boo$1092bo2429boo17boo106boo$1091bobo2447boo106bobo$1092b oo2557bo$3579boo70boo$3579boo3$3538boo$3538bo19boo$3539b3o15bobo$3541b o15bo83boo$3535boo19boo83boo$1104bo2430bo$1103bobo2430b3o96bo$1104boo 2432bo94b3o$3632bo18boo$3632boo17boo$3661boo$3661bo$3659bobo$3544boo 113boo$3544bo$3525boo15bobo$3525boo15boo$1116bo2396boo$1115bobo2394bob o$1116boo2394bo$3511boo$$3655boo$3655bobo$3657bo$3657boo3$3524boo$ 1128bo2394bobo$1127bobo2393bo$1128boo2392boo116boo$3640boo$3649boo$ 3649bobo$3651bo$3651boo4$3534boo$1140bo2393boo$1139bobo$1140boo$$3634b oo$3634boo4boo$3523boo115boo$3524bo19boo$3524bobo17bo$3525boo15bobo$ 3537bo4boo95boo$3536bobo96boobboo$1152bo2383bobo95bobo$1151bobo2371boo 10bo96bo12boo$1152boo2370bobo106boo11bobo$3524bo121bo$3523boo120boo$ 3538boo121boo$3538bo122bo$3539b3o120b3o$3541bo122bo$3647boo$3646bobo$ 3646bo538boo$3645boo60bo477boo$1164boo2539b3o$1164boo2538bo$3704boo$ 3675bo34bo$3675b3o32b3o$3678bo34bo$3655boo20boo33boo$3655boo7boo56boo$ 3664bo57bo$3662bobo55bobo$3662boo4boo44boo4boo$3646boo20bo44bobbo$ 1176boo2469bo18bobo45boo$1176boo2469bobo16boo34boo$3648boo52boo8$3677b oo32boo3boo$3677boo11boo20bo3bo$1188boo2500bo18b3o5b3o$1188boo2464boo 35b3o15bo9bo$3650boobboo37bo$3649bobo$3649bo23boo$3648boo23bo$3674b3o$ 3676bo4$1200bo$1199bobo$1200boo9$4233boo$4233boo$1212boo$1212boo10$ 1224bo$1223bobo$1224boo4$3151boo$3151boo$3131bo$3119bo11b3o$3117b3o14b o$3101bo14bo16boo$3101b3o12boo$1236boo1866bo$1236boo1865boo3$3104boo$ 3104boo17boo$3123boo$$3161boo$3161boo$$1248bo$1247bobo1870boo$1248boo 1870bo19boo$3121b3o15bobo$3123bo15bo$3117boo19boo$3117bo$3118b3o$3120b o5$1260boo$1260boo1864boo$3126bo$3107boo15bobo$3107boo15boo$3095boo$ 3094bobo$3094bo$3093boo3$1272bo2542boo$1271bobo2541boo$1272boo3$3106b oo$3105bobo696boo$3105bo699bo$3104boo699bobo$3806boo3$3819boo$1284boo 2533bobo$1284boo2535bo$3821boo$$3116boo$3116boo3$3817boo$3817bobo$ 3819bo$1296bo1808boo712boo$1295bobo1808bo19boo$1296boo1808bobo17bo$ 3107boo15bobo$3119bo4boo$3118bobo680boo$3118bobo679bobo$3107boo10bo 680bo$3106bobo690boo$3106bo$3105boo$3120boo$3120bo$1308boo1811b3o$ 1308boo1813bo$3809boo$3809boo$$3816bo$3816b3o$3819bo$3818boo$3798boo$ 3799bo$3799bobo$1320boo2478boo$1320boo2420bo$3740b3o$3739bo74boo$3739b oo73bobo$3724boo90bo$3725bo90boo$3725bobo$3726boo10bo$3737bobo$3737bob o$3738bo4boo$1332boo2392boo15bobo$1332boo2391bobo17bo65boo$3725bo19boo 64bo$3724boo86b3o$3814bo$3749boo$3749bo$3747bobo$3747boo46boo$3735boo 57bobo$3735boo57bo$1344bo2448boo$1343bobo$1344boo5$3803boo$3723boo78b oo171bo$3724bo251b3o$3724bobo83bo168bo23boo$3725boo83b3o165boo23bo$ 1356bo2456bo187bobo$1355bobo2454boo145bo37boobboo$1356boo2038bo395boo 139bo9bo15b3o35boo$3394b3o396bo139b3o5b3o18bo$3393bo399bobo140bo3bo20b oo11boo$3393boo399boo139boo3boo32boo3$3808boo$3808bobo$3810bo$3400boo 324boo15boo65boo$1368bo2031boo324boo15bobo$1367bobo2348boo25bo203boo 52boo$1368boo2349bo25boo202boo34boo16bobo$3719bobo215boo45bobo18bo$ 3720boo214bobbo44bo20boo$3931boo4boo44boo4boo$3805boo123bobo55bobo$ 3805bo124bo57bo$3739bo66b3o120boo56boo7boo$3737b3o68bo130boo33boo20boo $3736bo202bo34bo$3736boo20bo181b3o32b3o$1380bo2361bo15b3o181bo34bo$ 1379bobo2002boo354b3o18bo185boo$1380boo2002boo353bo20boo11boo173bo$ 3739boo32boo170b3o$3945bo60boo$4006bo$4004bobo$4004boo$$3742boo37boo 21boo$3723boo17boo36bobo21boo$3723boo55bo17boo$1392bo2386boo17boo186b oo$1391bobo2593bo$1392boo2328boo263bobo$3723bo76boo186boo$3720b3o12boo 56boo5boo$3720bo14bo16boo39boo$3736b3o14bo$3738bo11b3o20boo$3750bo22bo $3774b3o$3382boo392bo$3382boo$1404bo$1403bobo1970bo$1404boo1968b3o$ 3373bo615boo15boo$3373boo614boo15bobo$3393boo613bo$3393bo614boo$3391bo bo$3391boo3$3377boo$1416bo1959bobo$1415bobo1958bo604boo$1416boo1957boo 605bo$3969boo11bobo$3970bo12boo$3970bobo$3971boobboo$3975boo$$3380boo$ 3381bo$3378b3o595boo$1428bo1949bo591boo4boo$1427bobo2540boo$1428boo4$ 2813boo556boo$2813boo557bo598boo$2793bo578bobo15boo578bobo$2781bo11b3o 577boo15boo578bo$2779b3o14bo1172boo$2763bo14bo16boo$1440bo1322b3o12boo $1439bobo1324bo$1440boo1323boo3$2766boo$2766boo17boo$2785boo$$2823boo 566boo$2823boo566bobo$3393bo$1452bo1940boo$1451bobo1328boo$1452boo 1328bo19boo$2783b3o15bobo$2785bo15bo$2779boo19boo573boo$2779bo594bobo$ 2780b3o591bo$2782bo590boo60bo$3433b3o$3432bo$3432boo$1464bo1938bo34bo$ 1463bobo1937b3o32b3o$1464boo1322boo616bo34bo$2788bo594boo20boo33boo$ 2769boo15bobo594boo7boo56boo$2769boo15boo604bo57bo$2757boo631bobo55bob o$2756bobo631boo4boo44boo4boo$2756bo617boo20bo44bobbo$2755boo618bo18bo bo45boo$3375bobo16boo34boo$3376boo52boo$1476bo$1475bobo$1476boo$$2203b o$2202bobo563boo$2202boo563bobo$2767bo637boo32boo3boo$2766boo637boo11b oo20bo3bo$3418bo18b3o5b3o$3382boo35b3o15bo9bo$3378boobboo37bo$1488bo 1888bobo$1487bobo1887bo23boo$1488boo1886boo23bo$3402b3o$3404bo$2778boo $2778boo6$2767boo$1500boo1266bo19boo$1500boo1266bobo17bo$2769boo15bobo $2781bo4boo$2780bobo$2780bobo$2769boo10bo$2768bobo$2768bo$2767boo$ 2782boo$2782bo$1512boo1269b3o$1512boo1271bo793bo$3579b3o$3582bo23boo$ 3581boo23bo$3604bobo$3562bo37boobboo$3536bo9bo15b3o35boo$3536b3o5b3o 18bo$3539bo3bo20boo11boo$3538boo3boo32boo$$1524boo$1524boo5$3552boo52b oo$3552boo34boo16bobo$3540boo45bobo18bo$3539bobbo44bo20boo$3534boo4boo 44boo4boo$1536bo1996bobo55bobo$1535bobo1995bo57bo$1536boo1994boo56boo 7boo$3542boo33boo20boo$3542bo34bo$3543b3o32b3o$3545bo34bo$3550boo$ 3551bo$3548b3o$3548bo60boo$3609bo$2177bo1429bobo$1548boo615bo11b3o 1427boo$1548boo613b3o14bo23boo1385bo$2147bo14bo16boo23bo1386b3o$2147b 3o12boo38bobo1389bo$2150bo47boobboo1389boo$2149boo47boo1409boo$3609bo$ 3531boo74bobo11boo$2150boo1379boo74boo12bo$2150boo17boo1448bobo97bo$ 2169boo1444boobboo96b3o$3615boo99bo$1560boo2154boo$1560boo1958boo127b oo53bo$3521bo127boo53b3o$3521bobo90boo91bo$2166boo36boo1316boo90boo4b oo84boo$2166bo19boo16bobo1413boo25boo$2167b3o15bobo18bo1440boo110boo$ 2169bo15bo20boo1327boo97boo84boo11bo25bo$2163boo19boo4boo1343bobo97bo 57boo25boo11b3o21bobo$2163bo25bobo1345bo97bobo56bo41bo20boo$2164b3o22b o1347boo97boo56bobo38boo39boo$2166bo21boo7boo1433boo61boo79boo5boo$ 1572boo623boo1433boo149boo$1572boo2052boo$3626bo$2147boo1475bobo135boo 17boo$2146bobo23bo1360boo89boo137bo17boo$2146bo23b3o1360bobo189boo36bo bo21boo$2145boo22bo63bo1301bo161boo26boo37boo21boo$2153boo14boo36boo 22b3o1301boo108boo50boo$2153boo52bo22bo1414boo29boo$2205bobo22boo1444b oo$2205boo11bo$2218b3o$1584boo635bo1295boo146bo56boo32boo$1584boo634b oo1294bobo145bobo55bo20boo11boo$3516bo147boo54bobo21bo$3515boo156boo 45boo19b3o44bo$2234boo11bo1358boo15boo48bo67bo44b3o$2207boo25boo11b3o 1355bobo15boo46bobo111bo$2208bo41bo23boo1329bo65boo87boo23boo$2208bobo 38boo23bo1329boo32boo121bo$2152boo55boo61bobo1363boo118b3o$2151bobo 114boobboo1484bo$2151bo116boo1255boo87bo$1596bo553boo1373boo87b3o$ 1595bobo2019bo$1596boo587boo1345bo83boo$2185boo52boo1291b3o$2211boo26b oo1294bo$2211boo1321boo218bo$3514boo238b3o35boo$2143boo45boo1323bo241b o34boo$2144bo45boo1323bobo229boo7boo$2144bobo15boo22boo1328boo230bo$ 2145boo15boo22boo48boo36boo1182bo289bobo$2236bo19boo16bobo1179b3o290b oo36boo$2237bo17bobo18bo1178bo74boo116bo138boo$1608boo582boo42boo17bo 20boo1177boo73bobo76boo35b3o142boo$1608boo582boo60boo4boo1178boo90bo 76boo34bo145boo$2259bobo1179bo90boo111boo42boo$2259bo1181bobo245bo$ 2258boo7boo1173boo10bo232bobo95boo$2267boo1184bobo158boo67boobboo56bo 23boo14boo$3453bobo158boo67boo59bobo22bo$3454bo4boo149boo133bo14boo8b 3o$3442boo15bobo148boo148bo11bo$2163boo1276bobo17bo65boo232b3o$2163bob o1275bo19boo64bo126boo107bo$2165bo1274boo86b3o85boo36boo$1620boo543boo 110boo1251bo85boo13boo114boo$1620boo655bo1187boo163bobo113bobo$2275bob o1187bo164bo115bo16boo$2275boo1186bobo163boo10boo102boo17bo$3086boo 375boo46boo129bo118b3o$3086boo363boo57bobo126b3o9boo36boo70bo$3107bo 343boo57bo128bo11bo19boo16bobo$2172boo931b3o11bo389boo138bobo18bobo18b o62boo$2172bo84boo50boo793bo14b3o527boo19bo20boo61boo$2153boo15bobo85b o49bobbo792boo16bo14bo531boo4boo$2153boo15boo86bobo48boo810boo12b3o 536bobo$2259boo873bo539bo$1632boo1500boo537boo7boo$1632boo2048boo$ 3519boo$3133boo304boo78boo223boo$3114boo17boo305bo304bo$3114boo324bobo 83bo218bobo$3441boo83b3o217boo$3076boo451bo$3076boo450boo162boo$3508b oo182bo$2152boo1355bo180bobo$2151bobo106boo855boo390bobo178boo52boo$ 1644boo505bo108boo14boo819boo19bo391boo233bo$1644boo504boo100boo22bo 820bobo15b3o614boo11bobo$2253bo23b3o65boo752bo15bo617bo12boo$2253bobo 23bo66bo752boo19boo402boo207bobo$2254boo90bobo772bo402bobo145boo60boo bboo$2347boo16bo752b3o405bo146bo64boo$2168boo193b3o752bo323boo15boo65b oo145bobo$2168bobo191bo1079boo15bobo212boo$2170bo191boo1070boo25bo$ 2109bo60boo100boo1161bo25boo276boo$2109b3o160bo1162bobo295boo4boo$ 1656bo455bo157bobo1163boo295boo$1655bobo453boo157boo40boo797boo$1656b oo448bo34bo161boo7boo798bo408boo$2031bo72b3o32b3o162bo807bobo15boo389b o$2030bobo70bo34bo165bobo806boo15boo323bo66b3o$2031boo70boo33boo20boo 137boo4boo1146b3o68bo$2093boo56boo7boo117boo19bo20boo1129bo281boo$ 2094bo57bo121boo3bobo18bobo18bo22boo1106boo20bo258bobo$2094bobo55bobo 119bo6bo19boo16bobo22boo1112bo15b3o198boo15boo39bo$2095boo4boo44boo4b oo117bobo6boo36boo1135b3o18bo197boo15bobo37boo$2100bobbo44bo20boo101b oo1181bo20boo11boo176boo25bo$2101boo45bobo18bo1285boo32boo177bo25boo$ 2113boo34boo16bobo1498bobo$1668boo443boo52boo28boo60boo1408boo$1668boo 528bo59bobo71boo$2198bobo57bo25boo46boo$2199boo56boo25boo68boo775boo$ 2354bo776bobo324boo37boo21boo166bo$2355b3o775bo305boo17boo36bobo21boo 164b3o$2357bo775boo304boo55bo17boo169bo$2262boo49boo1180boo17boo169boo $2099boo3boo32boo123bo49boobboo$2100bo3bo20boo11boo58boo60b3o14boo38bo bo1118boo$2097b3o5b3o18bo71boo4boo54bo16bo16boo23bo1119bo76boo$2097bo 9bo15b3o35boo41boo65bo6b3o14bo23boo1115b3o12boo56boo5boo$1680boo388bo 12bo39bo37boobboo103bobo7bo11b3o44boo6boo1087bo14bo16boo39boo$1680boo 388b3o8b3o81bobo103bo20bo47bo6bo1104b3o14bo$2073bo6bo86bo169b3o8b3o 1103bo11b3o20boo199boo$2072boo6boo85boo34boo132bo12bo770boo343bo22bo 200bo$2199boobboo916boo367b3o195bobo$2198bobo908boo381bo195boo$2198bo 12boo895bobo$2197boo11bobo895bo$2210bo896boo565boo$2090bo118boo1462bob o$2088b3o1041boo539bo$2087bo1023boo19bo539boo$1692boo393boo1023bo17bob o559boo$1692boo371boo1045bobo15boo561bo$2065boo144boo900boo4bo570b3o$ 2210bobo905bobo569bo$2210bo907bobo$2209boo908bo10boo551boo$3130bobo 550boo$3132bo$2077boo1053boo$2077boo1038boo$3118bo$3115b3o$1704boo513b oo894bo$1704boo513boo1452boo$2109bo1564bo$2108bobo115bo1447bobo$2108b oo116b3o1446boo$2229bo$2228boo$2095boo111boo$2095bo113bo$2030boo64b3o 110bobo1461boo$2031bo48boo16bo111boo1462bo$2031bobo45bobo1579boo11bobo $1716boo314boobboo37bo3bo1582bo12boo$1716boo318boo35b3obboo11bo9bo122b oo1436bobo$2072bo18b3o5b3o122bobo1436boobboo$2059boo11boo20bo3bo127bo 1440boo$2059boo32boo3boo126boo3$3668boo$3662boo4boo$3662boo$$2170bo20b o29boo$1728boo300boo52boo83bobo7bo11b3o27bo$1728boo299bobo16boo34boo 84bo6b3o14bo27b3o$2029bo18bobo45boo61bo16bo16boo29bo235boo$2028boo20bo 44bobbo60b3o14boo282bobo1200boo$2044boo4boo44boo4boo58bo281boo15bo 1200bobo$2044bobo55bobo56boo281boo91bo1124bo$2046bo57bo432b3o1121boo$ 2037boo7boo56boo331boo101bo$2037boo20boo33boo341boo82bo17boo$2060bo34b o60boo25boo324bo11b3o$2057b3o32b3o62bo25boo322b3o14bo$2057bo34bo64bobo 331bo14bo16boo$1740boo344boo70boo331b3o12boo$1740boo344bo407bo$2087b3o 107boo21boo271boo$2027boo60bo81boo23bobo21boo204bo11boo$2028bo142bobo 6boo14bo17boo209bobo10boo$2028bobo38bo103bo6bo14boo17boo209bobo14boo 50boo$2029boo37bobo102boo3bobo245bo15boo50boo17boo$2068boo108boo333boo $2216boo$2158boo49boo5boo333boo$2048bo109bobo48boo340boo$2046b3o110bo 276boo$1752boo291bo123boo264bobbo$1752boo291boo122bobo264boo72boo$ 2171bo338bo19boo$2171boo338b3o15bobo$2513bo15bo$2507boo19boo$2507bo$ 2508b3o$2153boo355bo$2152bobo$2152bo$2025boo124boo$1764boo259boo232bo$ 1764boo493b3o$2262bo14bo238boo$2261boo12b3o238bo$2180boo39bo52bo222boo 15bobo$2181bo25bo13b3o50boo221boo15boo$2161boo18bobo21b3o16bo260boo$ 2161boo7boo10boo20bo18boo259bobo$2170bo33boo67boo209bo$2040boo126bobo 83boo17boo208boo$2040boo126boo4boo78boo121bo9bo$2152boo20bo202b3o5b3o 27bo$1776boo375bo18bobo192boo11bo3bo30b3o$1776boo375bobo16boo192bobo 10boo3boo32bo14bo$2154boo210bo50boo12b3o$2214boo149boo63bo885bo$2214b oo41boo171boo884b3o$2237boo19bo237boo821bo23boo$2237bobo15b3o237bobo 820boo23bo$2239bo15bo173boo64bo845bobo$2227boo10boo19boo148boo17boo63b oo803bo37boobboo$2227bo33bo100boo46boo861bo9bo15b3o35boo$2183boo32boo 9b3o27b3o71boo28boo909b3o5b3o18bo$2183boo11boo20bo11bo27bo74bo942bo3bo 20boo11boo224boo$1788boo406bo21bobo109b3o942boo3boo32boo224boo5boo$ 1788boo370boo35b3o19boo109bo1216boo$2156boobboo37bo$2155bobo255boo$ 2155bo23boo212boo19bo1101boo8boo17boo$2154boo23bo71boo120bo6boo11bobo 15b3o92boo1008boo9bo17boo$2180b3o69bo118b3o6boo13bo15bo94boo1019bobo 21boo$2182bo69bobo15boo98bo24boo19boo1110boo21boo$2253boo15boo98boo45b o871boo52boo165boo$2414b3o872boo34boo16bobo164boo$2414bo862boo45bobo 18bo168boo$3276bobbo44bo20boo167boo$1800boo693boo107bo666boo4boo44boo 4boo$1800boo694bo19boo86b3o663bobo55bobo$2432boo62bobo17bo90bo662bo57b o$2408bo23bobo62boo15bobo71bo17boo661boo56boo7boo171boo$2408b3o23bo74b o4boo60bo11b3o688boo33boo20boo171boo$2411bo22boo72bobo63b3o14bo687bo 34bo$2410boo14boo80bobo47bo14bo16boo688b3o32b3o$2426boo69boo10bo48b3o 12boo707bo34bo$2013bo257boo223bobo62bo725boo265boo$2012bobo256bobo222b o63boo726bo265bo$2013boo258bo221boo788b3o264bobo$2273boo235boo773bo60b oo204boo$1812boo696bo50boo783bo$1812boo697b3o47boo17boo762bobo$2513bo 66boo762boo$3328bo187boo$2618boo708b3o186bo$2618boo711bo182b3o$2280boo 1048boo182bo$2280bo146boo917boo181boo$2261boo15bobo146bobo147boo767bo 182bobo$2261boo15boo149bo147bo19boo745bobo11boo171bo$2429boo147b3o15bo bo745boo12bo172boo$2580bo15bo759bobo192boo$1824boo748boo19boo755boobb oo177boo14boo$1824boo748bo777boo182bo22boo$2575b3o955b3o23bo$2577bo 808boo145bo23bobo$3386boo169boo$3351boo168boo$3351boo4boo162boo$2417b oo938boo25boo$2417boo965boo129bo$2260boo321boo786boo140b3o23boo$2259bo bo321bo788bo139bo17boo8bo$2259bo166boo136boo15bobo788bobo72boo48boo13b oo16bo9bobo$1836boo420boo166boo136boo15boo790boo46bo25bo23bo25bo30bobo 10boo$1836boo714boo815boo50b3o21bobo23b3o21bobo30boo$2551bobo815boo53b o20boo27bo20boo$2551bo811boo58boo48boo38bo$2550boo811bo149b3o$2276boo 147boo17bo9bo906bobo90bo49bo11bo$2276bobo146bo18b3o5b3o27bo878boo91b3o 47b3o8boo14bo$2278bo142boo3b3o5boo11bo3bo30b3o972bo49bo22bobo$2217bo 60boo141bobo4bo4bobo10boo3boo32bo14bo955boo11boo35boo23bo$2217b3o203bo 9bo50boo12b3o881boo85boo$2220bo171boo29boo7boo63bo884boo29boo$2219boo 170bobo103boo914boo$1848boo364bo34bo141bo4boo165boo977boo$1848boo362b 3o32b3o140boo5bo164bobo977boo14boo$2211bo34bo147b3o99boo64bo839bo131b oo22bo$2211boo33boo20boo124bo82boo17boo63boo838bobo122boo7bo23b3o$ 2060bo140boo56boo7boo159boo46boo922boo123bobo6bobo23bo$2059bobo140bo 57bo138boo28boo979boo32boo48boo32bo7boo$2059bobo140bobo55bobo137bo887b oo53boo15boo48bo20boo11boo35boo11boo23boo7boo$2060bo142boo4boo44boo4b oo134b3o888boo52bobo15boo46bobo21bo49bo36bo$2208bobbo44bo20boo118bo 944bo65boo19b3o47b3o38b3o$2209boo45bobo18bo1063boo32boo52bo49bo42bo$ 2221boo34boo16bobo202boo893boo157boo$2054boo165boo52boo183boo19bo966b oo48boo35bo$2054boo384bo6boo11bobo15b3o92boo702boo72bo97bo20boo27bo22b oo11bobo$2438b3o6boo13bo15bo94boo703bo72b3o92b3o21bobo23b3o24bo12boo$ 2437bo24boo19boo793bobo73bo91bo25bo23bo26bobo$2437boo45bo794boo72boo 117boo50boobboo$2481b3o1044boo$2481bo$3292boo$2207boo3boo32boo314boo 728bobo$2208bo3bo20boo11boo315bo19boo90boo617bo234boo$2199boo4b3o5b3o 18bo264boo62bobo17bo91boo617boo227boo4boo$2199bobo3bo9bo15b3o35boo204b o23bobo62boo15bobo71bo867boo$2200bo30bo37boobboo200b3o23bo74bo4boo60bo 11b3o$2273bobo202bo22boo72bobo63b3o14bo$2250boo23bo201boo14boo80bobo 47bo14bo16boo726bo$2251bo23boo216boo69boo10bo48b3o12boo704boo35b3o$ 2248b3o312bobo62bo661boo54boo34bo$2248bo314bo63boo661bobo89boo42boo96b oo$2562boo728bo133bo96bobo$2577boo713boo130bobo96bo$2577bo50boo721boo 67boobboo96boo$2578b3o47boo17boo702boo67boo$2580bo66boo698boo$3347boo$ 2685boo587boo$2685boo586bobo115boo$3273bo79boo36boo$2494boo776boo79boo 13boo$2494bobo147boo721bobo$2496bo147bo19boo701bo$2496boo147b3o15bobo 700boo10boo$2647bo15bo715bo$2641boo19boo712b3o9boo36boo$2641bo734bo11b o19boo16bobo$2642b3o637boo102bobo18bobo18bo$2644bo637boo102boo19bo20b oo$3406boo4boo$3289bo121bobo$3289b3o119bo$2484boo806bo117boo7boo$2484b oo805boo126boo$2650boo619boo$2650bo621bo$2493boo136boo15bobo621bobo$ 2493boo136boo15boo623boo$2619boo594bo$2618bobo592b3o$2618bo593bo74boo 140boo$2617boo593boo73bobo139bo$2492boo17bo9bo675boo90bo137bobo$2492bo 18b3o5b3o27bo648bo90boo136boo$2488boo3b3o5boo11bo3bo30b3o646bobo$2488b obo4bo4bobo10boo3boo32bo14bo631boo10bo$2490bo9bo50boo12b3o642bobo$ 2459boo29boo7boo63bo645bobo$2458bobo103boo645bo4boo191boo$2458bo4boo 165boo567boo15bobo191bo$2457boo5bo164bobo566bobo17bo65boo124bobo$2461b 3o99boo64bo568bo19boo64bo126boo$2461bo82boo17boo63boo567boo86b3o$2496b oo46boo741bo$2466boo28boo724boo$2467bo754bo$2464b3o753bobo$2464bo755b oo46boo$3208boo57bobo$2547boo659boo57bo$2527boo19bo717boo$2507bo6boo 11bobo15b3o92boo$2505b3o6boo13bo15bo94boo$2504bo24boo19boo860boo15boo$ 2504boo45bo860boo15bobo$2548b3o853boo25bo$2548bo856bo25boo$3276boo127b obo$2629boo107bo457boo78boo128boo$2630bo19boo86b3o456bo$2566boo62bobo 17bo90bo455bobo83bo$2542bo23bobo62boo15bobo71bo17boo456boo83b3o$2542b 3o23bo74bo4boo60bo11b3o561bo138bo$2545bo22boo72bobo63b3o14bo559boo136b 3o$2544boo14boo80bobo47bo14bo16boo539boo155bo$2560boo69boo10bo48b3o12b oo557bo155boo$2630bobo62bo570bobo$2630bo63boo571boo$2629boo$2644boo$ 2644bo50boo584boo$2645b3o47boo17boo565bobo$2647bo66boo567bo143boo$ 3199boo15boo65boo142bo$2752boo445boo15bobo206bobo$2752boo99boo336boo 25bo206boo$2839boo12boo337bo25boo$2561boo277bo351bobo$2561bobo147boo 127bobo350boo216boo$2563bo147bo19boo93boo13boo567bobo$2563boo147b3o15b obo93boo450boo130bo$2714bo15bo547bo130boo$2708boo19boo481bo66b3o147boo $2708bo111boo388b3o68bo148bo$2709b3o108boo37boo348bo217b3o$2711bo112b oo33boo348boo20bo195bo$2824boo389bo15b3o$3213b3o18bo185boo$3212bo20boo 11boo172boo$2551boo659boo32boo$2551boo266boo$2717boo100boo38bo$2717bo 140bobo$2560boo136boo15bobo141bo$2560boo136boo15boo$2686boo527boo37boo 21boo131boo$2685bobo508boo17boo36bobo21boo132bo$2685bo163boo345boo55bo 17boo138bobo$2684boo162bobo401boo17boo139boo$2559boo17bo9bo259bo$2559b o18b3o5b3o27bo230boo346boo$2555boo3b3o5boo11bo3bo30b3o577bo76boo$2555b obo4bo4bobo10boo3boo32bo14bo191boo365b3o12boo56boo5boo$2557bo9bo50boo 12b3o192bo365bo14bo16boo39boo142boo$2526boo29boo7boo63bo192b3o382b3o 14bo184bo$2525bobo103boo191bo386bo11b3o20boo150boo11bobo$2525bo4boo 165boo140boo382bo22bo152bo12boo$2524boo5bo164bobo140bobo405b3o149bobo$ 2528b3o99boo64bo144bo407bo150boobboo$2528bo82boo17boo63boo144boo561boo $2563boo46boo$2533boo28boo$2534bo$2531b3o871boo$2531bo867boo4boo$3399b oo$2614boo215boo$2594boo19bo215boo$2574bo6boo11bobo15b3o92boo$2572b3o 6boo13bo15bo94boo116bo$2571bo24boo19boo204b3o$2571boo45bo203bo577boo$ 2615b3o204boo575bobo$2615bo226boo555bo$2842bo555boo$2696boo142bobo$ 2697bo19boo121boo$2633boo62bobo17bo$2609bo23bobo62boo15bobo$2609b3o23b o74bo4boo109boo$2612bo22boo72bobo113bobo$2611boo14boo80bobo113bo$2627b oo69boo10bo113boo$2697bobo$2697bo$2696boo$2199bo511boo$2199b3o509bo$ 2202bo509b3o$2201boo511bo114boo$2830bo$2219bo607b3o$2217b3o607bo$2026b o189bo88boo$2024b3o189boo87boo321boo$2023bo302bo301bobo$2023boo299b3o 11bo291bo658boo$2008boo184boo19boo106bo14b3o289boo631bo25bo$2009bo184b oo19boo106boo16bo14bo894bo11b3o21bobo$2009bobo328boo12b3o476boo414b3o 14bo20boo$2010boo10bo330bo479boo4boo392bo14bo16boo39boo$2021bobo329boo 484boo392b3o12boo56boo5boo$2021bobo1212bo76boo$2022bo4boo1206boo$2010b oo15bobo322boo$2009bobo17bo303boo17boo484boo452boo17boo$2009bo19boo 302boo283boo214boobboo396boo55bo17boo$2008boo608boo213bobo400boo17boo 36bobo21boo$2295boo536bo12boo407boo37boo21boo$2202boo91boo535boo11bobo $2203bo423boo216bo$2200b3o424boo215boo$2200bo135boo522boo$2019boo295b oo19bo522bo$2019boo295bobo15b3o524b3o388boo32boo$2318bo15bo528bo388bo 20boo11boo$2318boo19boo285boo17bo9bo190boo405b3o18bo$2340bo285bo18b3o 5b3o27bo161bobo407bo15b3o$2337b3o282boo3b3o5boo11bo3bo30b3o159bo403boo 20bo$2206boo129bo284bobo4bo4bobo10boo3boo32bo14bo142boo60bo342bo$1742b oo462boo4boo410bo9bo50boo12b3o202b3o343b3o37boo$1743bo25bo442boo36boo 341boo29boo7boo63bo204bo348bo38bo28boo$1743bobo21b3o480bobo339bobo103b oo203boo383b3o29bo$1744boo20bo240boo243bo339bo4boo275bo34bo378bo29bobo $1766boo240bo243boo337boo5bo275b3o32b3o406boo$2008bobo200boo117boo263b 3o99boo178bo34bo320boo$1786bo222boo196boobboo118bo263bo82boo17boo155b oo20boo33boo319bobo23bo$1676boo106b3o19boo398bobo122bobo15boo279boo46b oo174boo7boo56boo309bo23b3o$1669boo5boo105bo21bobo398bo125boo15boo249b oo28boo231bo57bo309boo22bo$1669boo99boo11boo20bo11bo387boo154boo238bo 259bobo55bobo317boo14boo$1707boo61boo32boo9b3o543bobo234b3o260boo4boo 44boo4boo318boo$1706bobo105bo548bo234bo246boo20bo44bobbo$1671boo17boo 14bo107boo10boo387boo146boo481bo18bobo45boo$1671boo17bo14boo119bo387bo bo464boo163bobo16boo34boo$1665boo21bobo133bobo169boo216bo21boo423boo 19bo164boo52boo$1665boo21boo134boo13boo156bo215boo21bobo402bo6boo11bob o15b3o$1801boo36boo156bobo238bo400b3o6boo13bo15bo637boo$1801boo195boo 238boo398bo24boo19boo615boo14boo$1730boo13boo263boo15boo215boo392boo 45bo616bo22boo$1702boo26boo13boo11boo85boo163boo15bobo214bo437b3o614b 3o23bo$1702boo54bo86boo182bo195boo15bobo105boo330bo616bo23bobo$1759b3o 79boo186boo194boo15boo106bobo970boo$1761bo79boo509bo523boo32boo3boo 321boo$2352boo522boo11boo20bo3bo321bobo$2700boo187bo18b3o5b3o318bo$ 1769boo39boo864bo23bobo150boo35b3o15bo9bo317boo$1732boo34bobo40bo34boo 828b3o23bo146boobboo37bo412boo$1662bo29boo38bobo33bo39b3o35boo175bo 655bo22boo144bobo455bo$1662b3o27bo41bo32boo39bo212b3o654boo14boo152bo 23boo432bobo$1665bo27b3o11boo25boo284bo673boo151boo23bo434boo$1664boo 29bo11boo311boo19boo830b3o378boo$2026bo15bo832bo378bobo$2024b3o15bobo 295boo914bo$1721boo300bo19boo179boo114boo914boo$1721bo301boo198bobo$ 1722b3o498bo$1724bo497boo$1659boo50boo351boo$1660bo51bo126boo223boo 1161boo$1660bobo46b3o127bo511boo848bo25bo$1661boo46bo130b3o183boo302b oo19bo849b3o21bobo18boo$1842bo164boo17boo212boo89bo17bobo343boo507bo 20boo10boo7boo60boo$1753boo252boo231bobo88bobo15boo344bobo505boo33bo 69boo14boo$1675boo69boo5boo62boo423bo89boo4bo358bo540bobo59boo22bo$ 1675bobo68boo69boo32boo328bo60boo93bobo357boo485bo48boo4boo60bo23b3o$ 1677bo106boo65bo154boo173b3o153bobo823boo19b3o47bo20boo44bobo23bo$ 1677boo104bobo46boo15bobo155bo176bo153bo10boo812bobo21bo46bobo18bo46b oo$1657boo89boo17boo14bo48boo15boo153b3o12boo162boo164bobo801bo11bo20b oo11boo34boo16bobo$1657bo90boo17bo14boo220bo14bo16boo140bo34bo137bo 801b3o9boo32boo52boo$1658b3o81boo21bobo23boo227b3o14bo138b3o32b3o137b oo803bo$1660bo81boo21boo23bobo229bo11b3o138bo34bo125boo805boo10boo$ 1791bo242bo140boo33boo20boo103bo806bo155boo$1666boo386boo109boo56boo7b oo100b3o807bobo154bo$1666boo386boo110bo57bo109bo350boo94bo348boo13boo 141boo11bobo$1779boo385bobo55bobo458boo93bobo347boo36boo119bo12boo$ 1779boo29boo355boo4boo44boo4boo553boo386boo119bobo$1810boo360bobbo44bo 20boo981boo64boobboo$2173boo45bobo18bo452boo428boo85boo11boo68boo$ 2185boo34boo16bobo452boo428boo86bo$1831boo352boo52boo887boo79b3o35boo$ 1676boo152bobo1295boo79bo37boobboo$1676bo153bo1420bobo41boo$1674bobo 92boo58boo1397boo23bo35boo4boo$1674boo93bo53boo868boo464boo39boo27bo 23boo34boo$1770b3o50boo868bo429boo34bo40bobo23b3o$1772bo46boo868boo3b 3o426boo35b3o39bo23bo$1819bobo867bobo4bo465bo39boo$1821bo349boo3boo32b oo479bo$1676boo143boo349bo3bo20boo11boo448boo16boo11boo$1676bo131boo 359b3o5b3o18bo460bobo16boo610boo$1674bobo11boo118boo25boo332bo9bo15b3o 35boo424bo4boo623bobo$1674boo12bo146boo4boo352bo37boobboo378bo40boo5bo 623bo$1686bobo46boo104boo394bobo375b3o44b3o391bo231boo$1682boobboo48bo 69boo71boo333boo23bo374bo47bo25boo366b3o$1682boo52bobo67boo71bo335bo 23boo373boo53boo17bobo368bo23boo$1737boo141b3o329b3o384boo67bobo19bo 367boo23bo$1761boo77boo40bo329bo387bo67bo21boo389bobo46boo$1761boo73b oobboo758bobo64boo370bo37boobboo48bo$1681boo152bobo763boo10bo399bo9bo 15b3o35boo49b3o$1681boo4boo146bo12boo762bobo371boo25b3o5b3o18bo85bo$ 1687boo145boo11bobo762bobo371boo28bo3bo20boo11boo160boo$1847bo765bo4b oo395boo3boo32boo96boo62boo5boo$1846boo753boo15bobo497boo32boo69boo$ 1759boo101boo736bobo17bo65boo431bo65boo$1759bo102bo737bo19boo64bo432bo bo15boo46bobo$1760b3o100b3o733boo86b3o285boo143boo15boo48bo33boo$1686b oo74bo102bo823bo286bo210boo32boo$1686bobo159boo774boo350bobo199boo47b oo$1688bo158bobo774bo352boo199bobo46boo$1688boo157bo774bobo404boo52boo 94bo$1846boo774boo46boo357boo34boo16bobo$2610boo57bobo318boo25boo45bob o18bo$2610boo57bo320bobo23bobbo44bo20boo103boo$2668boo322bo18boo4boo 44boo4boo88boo29boo$2992boo16bobo55bobo88boo$3010bo57bo$1763boo1244boo 56boo7boo$1763bo92boo1161boo33boo20boo60boo$1761bobo92boo7boo1152bo34b o83bobo$1761boo102bo1154b3o32b3o82bo$1752boo109bobo812boo308boo32bo34b o82boo58boo$1752boo109boo4boo727boo78boo308bobo36boo117boo53bo$1847boo 20bo19boo708bo390bo37bo117boo50b3o6boo$1848bo18bobo18bobo708bobo83bo 304boo33b3o122boo46bo9bo$1848bobo16boo19bo11bo699boo83b3o337bo60boo61b obo56bobo$1849boo36boo9b3o787bo397bo62bo59boo$1897bo789boo395bobo61boo 68boo$1769boo126boo10boo756boo415boo75boo55boo$1769bo139bo758bo303boo 160boo25boo$1767bobo137bobo758bobo300bobo154boo4boo$1767boo138boo13boo 745boo300bo118boo36boo$1884boo36boo1046boo117bobo71boo$1884boo1180boo 21bo73boo$2683boo382bo20boo111boo$1928boo753bobo381bobo59boo71bo$1928b oo755bo382boo59boobboo67bobo$1855boo67boo675boo15boo65boo446bobo67boo$ 1851boobboo67boo675boo15bobo500boo12bo$1850bobo740boo25bo359boo139bobo 11boo$1771boo77bo254boo487bo25boo358boo141bo$1771bobo75boo42boo210boo 487bobo526boo$1773bo120bo34boo664boo390bo119boo$1773boo116b3o35boo 1056b3o118bo$1744boo17boo126bo788boo308bo114b3o$1744bo18boo915bo308boo 114bo$1745b3o368boo496bo66b3o285boo150boo76boo$1747bo368bo495b3o68bo 286bo150bobo74bobo$2114bobo494bo358bobo96boo15boo35bo74bo$1753boo359b oo495boo20bo337boo96boo15bobo34boo72boo$1753boo242bo619bo15b3o277bo 174bo118boo17boo$1995b3o617b3o18bo274b3o174boo117boo18bo$1969boo23bo 106boo511bo20boo11boo260bo74boo237b3o$1970bo23boo104bobo511boo32boo 260boo73bobo236bo$1922boo46bobo127bo794boo90bo$1922bo48boobboo37bo84b oo795bo90boo228boo$1923b3o49boo35b3o15bo9bo855bobo214boo102boo$1763boo 160bo85bo18b3o5b3o856boo10bo172bo21boo7boo$1763bo72boo160boo11boo20bo 3bo870bobo169b3o22bo$1761bobo65boo5boo62boo96boo32boo3boo578boo37boo 21boo227bobo168bo25bobo$1761boo66boo69boo32boo662boo17boo36bobo21boo 228bo4boo163boo19boo4boo$1867boo65bo168boo493boo55bo17boo222boo15bobo 168bo15bo20boo$1866bobo46boo15bobo167bobo549boo17boo221bobo17bo65boo 99b3o15bobo18bo$1831boo17boo14bo48boo15boo168bo793bo19boo64bo99bo19boo 16bobo84boo$1831boo17bo14boo234boo494boo296boo86b3o96boo36boo86bo$ 1763boo60boo21bobo23boo722bo76boo308bo222bobo$1763bo61boo21boo23bobo 719b3o12boo56boo5boo243boo287boo$1761bobo11boo97bo94boo52boo570bo14bo 16boo39boo250bo$1761boo12bo192bobo16boo34boo586b3o14bo289bobo$1773bobo 192bo18bobo45boo82boo492bo11b3o20boo268boo46boo$1769boobboo87boo103boo 20bo44bobbo81bobo503bo22bo257boo57bobo117boo$1769boo91boo29boo88boo4b oo44boo4boo78bo527b3o254boo57bo100boo17boo120boo$1893boo88bobo55bobo 77boo528bo312boo100boo140bo$1985bo57bo1151boo11bobo$1976boo7boo56boo 1151bo12boo$1768boo144boo60boo20boo33boo1030boo47boo80bobo$1768boo4boo 137bobo83bo34bo1031bo47boobboo77boobboo$1774boo137bo82b3o32b3o1029b3o 12boo38bobo80boo$1822bo29boo58boo82bo34bo368boo661bo14bo16boo23bo$ 1822b3o27bo53boo117boo84boo287boo572boo103b3o14bo23boo$1825bo27b3o50b oo117bo85boo267bo513boo78boo105bo11b3o$1824boo29bo46boo122b3o339bo11b 3o512bo197bo108boo$1902bobo61boo60bo76bo260b3o14bo511bobo83bo214boo4b oo$1773boo129bo62bo135b3o244bo14bo16boo512boo83b3o212boo$1773bobo128b oo61bobo132bo247b3o12boo617bo$1775bo115boo75boo132boo249bo629boo$1775b oo114boo25boo202boo228boo609boo$1918boo4boo196bo841bo$1819boo103boo36b oo156bobo353bo487bobo$1820bo68boo71bobo155boo231boo119b3o488boo230boo$ 1820bobo66boo73bo21boo191bo173boo17boo99bo722bobo$1821boo141boo20bo 192b3o190boo99boo17bo703bo$1923boo59bobo119boo74bo307b3o11bo474boo214b oo$1919boobboo59boo119bobo73boo227boo77bo14b3o472bobo$1835boo81bobo 184bo90boo212boo77boo16bo14bo458bo$1835bobo80bo12boo171boo90bo309boo 12b3o374boo15boo65boo$1837bo79boo11bobo261bobo322bo377boo15bobo$1837b oo91bo252bo10boo173boo148boo368boo25bo$1817boo110boo251bobo184bo19boo 499bo25boo$1817bo127boo235bobo185b3o15bobo499bobo$1818b3o124bo231boo4b o188bo15bo129boo371boo$1820bo125b3o227bobo15boo170boo19boo110boo17boo$ 1948bo160boo65bo17bobo169bo132boo475boo$1826boo103boo177bo64boo19bo 170b3o606bo$1826boo102bobo174b3o86boo171bo91boo178bo268bo66b3o$1930bo 35boo15boo122bo353boo177bobo265b3o68bo$1929boo34bobo15boo186boo468boo 264bo$1965bo206bo734boo20bo$1964boo206bobo327boo409bo15b3o$2125boo46b oo307boo19bo407b3o18bo$2125bobo57boo188boo105bobo15b3o407bo20boo11boo$ 2127bo57boo188bo108bo15bo409boo32boo$2127boo227boo15bobo108boo19boo$ 1939boo415boo15boo131bo$1939boo7boo21bo531b3o$1948bo22b3o529bo$1946bob o25bo$1946boo4boo19boo938boo37boo21boo$1930boo20bo15bo925boo17boo36bob o21boo$1931bo18bobo15b3o146boo775boo55bo17boo$1839boo90bobo16boo19bo 145boo78boo751boo17boo$1839bo92boo36boo225bo298boo$1837bobo271bo83bobo 299bo395boo$1837boo270b3o83boo300bobo15boo377bo76boo$1828boo278bo389b oo15boo374b3o12boo56boo5boo$1828boo278boo245boo170boo362bo14bo16boo39b oo$2128boo224bobo170bobo377b3o14bo$1967boo159bo225bo174bo379bo11b3o20b oo$1967boo17boo138bobo224boo174boo390bo22bo$1986boo138boo817b3o$2947bo $1845boo$1845bo92boo47boo123boo$1843bobo88boobboo47bo123bobo$1843boo 88bobo38boo12b3o120bo$1933bo23boo16bo14bo119boo65boo15boo$1932boo23bo 14b3o201bobo15boo320boo$1958b3o11bo203bo25boo161boo149bobo$1960bo214b oo25bo162boo151bo$2200bobo174boo139boo$2200boo175bobo$2379bo$2115boo 262boo$1847boo267bo$1847bobo263b3o66bo171boo$1849bo263bo68b3o170bo19b oo$1849boo334bo169bobo17bo$1820boo17boo322bo20boo170boo15bobo$1820bo 18boo320b3o15bo188bo4boo131boo$1821b3o336bo18b3o185bobo136boo$1823bo 323boo11boo20bo184bobo$2147boo32boo173boo10bo$1829boo91boo431bobo$ 1829boo92bo25bo405bo$1923bobo21b3o11bo392boo$1924boo20bo14b3o405boo 146boo$1905boo39boo16bo14bo389bo126boo19bo$1898boo5boo56boo12b3o136boo 21boo37boo190b3o124bo17bobo$1898boo76bo139boo21bobo36boo17boo173bo124b obo15boo$1976boo144boo17bo55boo299boo4bo$1839boo281boo17boo360bobo$ 1839bo60boo17boo582bobo$1837bobo60boo17bo55boo221boo304bo10boo$1837boo 55boo21bobo36boo17boo143boo76bo316bobo$1894boo21boo37boo162boo5boo56b oo12b3o315bo$2127boo39boo16bo14bo315boo$2168bo14b3o316boo$2147boo20b3o 11bo319bo$1839boo307bo22bo328b3o$1839bo305b3o352bo$1837bobo11boo72boo 32boo184bo$1837boo12bo73boo11boo20bo$1849bobo86bo18b3o$1845boobboo88b 3o15bo$1845boo94bo20boo$1963bo$1921boo37b3o$1891boo28bo38bo$1844boo46b o29b3o$1844boo4boo40bobo29bo$1850boo41boo$1978boo$1954bo23bobo$1954b3o 23bo$1957bo22boo$1956boo14boo$1849boo121boo$1849bobo$1851bo$1851boo3$ 1894boo$1894boo14boo$1886boo22bo$1887bo23b3o$1887bobo23bo$1888boo$ 1973boo$1973bobo$1975bo$1975boo$1906boo$1906bo$1904bobo$1904boo$1957b oo$1956bobo$1956bo$1955boo5$1984boo$1985bo25bo$1965boo18bobo21b3o$ 1903boo60boo7boo10boo20bo$1887boo14boo69bo33boo$1888bo22boo59bobo$ 1885b3o23bo60boo4boo48bo$1885bo23bobo44boo20bo47b3o19boo$1909boo46bo 18bobo46bo21bobo$1957bobo16boo34boo11boo20bo11bo$1958boo52boo32boo9b3o $2056bo$2056boo10boo$1911boo155bo$1911bo154bobo$1909bobo11boo141boo13b oo$1909boo12bo119boo36boo$1921bobo119boo$1917boobboo64boo$1917boo68boo 11boo85boo452bo$2000bo86boo452b3o$1964boo35b3o79boo459bo$1960boobboo 37bo79boo458boo$1916boo41bobo$1916boo4boo35bo23boo$1922boo34boo23bo27b oo39boo$1984b3o23bobo40bo34boo$1986bo23bo39b3o35boo$2009boo39bo485boo$ 2536boo$$1921boo$1921bobo$1923bo$1923boo231bo$2154b3o$2128boo23bo$ 2129bo23boo$2081boo46bobo$2081bo48boobboo37bo$2082b3o49boo35b3o15bo9bo $2084bo85bo18b3o5b3o$1995boo160boo11boo20bo3bo355boo$1988boo5boo62boo 96boo32boo3boo354boo$1988boo69boo32boo$2026boo65bo$2025bobo46boo15bobo $1990boo33bo48boo15boo$1990boo32boo$1984boo47boo587bo$1984boo46bobo 585b3o$2033bo94boo52boo435bo$2127bobo16boo34boo435boo17bo$2127bo18bobo 45boo350boo88b3o11bo$2021boo103boo20bo44bobbo348bobo87bo14b3o$2021boo 29boo88boo4boo44boo4boo343bo89boo16bo14bo$2052boo88bobo55bobo341boo 106boo12b3o$2144bo57bo462bo$2135boo7boo56boo461boo$2073boo60boo20boo 33boo$2072bobo83bo34bo$2072bo82b3o32b3o471boo$2011boo58boo82bo34bo454b oo17boo$2011bo53boo117boo368boo89boo$2004boo6b3o50boo117bo369boo$2004b o9bo46boo122b3o419boo$2002bobo56bobo61boo60bo373bo45boo$2002boo59bo62b o98boo334b3o$1993boo68boo61bobo96boo317boo18bo$1993boo55boo75boo415boo 17boo83boo$2050boo25boo455boo92boo19bo$2077boo4boo450bo92bobo15b3o$ 2083boo36boo412bobo92bo15bo$2048boo71bobo112boo298boo92boo19boo$2048b oo73bo21boo89bo415bo$2010boo111boo20bo88bobo412b3o$2010bo71boo59bobo 88boo413bo$2008bobo67boobboo59boo$2008boo67bobo$2077bo12boo129boo$ 2076boo11bobo128bobo$2089bo130bo$2088boo129boo319boo100boo$2104boo433b obo101bo$2104bo434bo103bobo15boo$2105b3o430boo104boo15boo$2107bo565boo $2012boo76boo581bobo$2012bobo74bobo131boo450bo$2014bo74bo35boo15boo78b obo450boo$2014boo72boo34bobo15boo78bo$1985boo17boo118bo96boo332boo$ 1985bo18boo117boo430boo$1986b3o557boo$1988bo556bobo$2545bo$1994boo243b oo303boo$1994boo102boo139bobo420boo$2098boo7boo21bo110bo420bobo$2107bo 22b3o108boo421bo$2105bobo25bo530boo$2105boo4boo19boo$2089boo20bo15bo$ 2090bo18bobo15b3o$2004boo84bobo16boo19bo$2004bo86boo36boo430boo$2002bo bo226boo322boo4boo$2002boo227boo322boo$$2225bo426boo$2223b3o426boo$ 2126boo94bo333boo$2004boo120boo17boo75boo332boobboo$2004bo140boo95boo 316bobo$2002bobo11boo224bo305boo12bo$2002boo12bo223bobo305bobo11boo$ 2014bobo80boo47boo92boo308bo112boo$2010boobboo77boobboo47bo152bo250boo 90boo19bo$2010boo80bobo38boo12b3o149b3o232boo107bo17bobo$2092bo23boo 16bo14bo76boo74bo232bo107bobo15boo$2091boo23bo14b3o91bobo73boo229b3o 109boo4bo$2117b3o11bo93bo90boo214bo116bobo$2009boo108bo104boo90bo231b oo99bobo$2009boo4boo297bobo231bobo99bo10boo$2015boo286bo10boo234bo110b obo$2302bobo184bo60boo111bo$2302bobo184b3o171boo$2297boo4bo188bo155boo $2296bobo15boo175boo156bo$2229boo65bo17bobo169bo34bo124b3o$2014boo214b o64boo19bo167b3o32b3o124bo$2014bobo210b3o86boo165bo34bo$2016bo210bo 255boo33boo20boo$2016boo273boo180boo56boo7boo$2292bo181bo57bo$2292bobo 179bobo55bobo$2245boo46boo180boo4boo44boo4boo$2245bobo57boo173bobbo44b o20boo$2247bo57boo174boo45bobo18bo$2247boo244boo34boo16bobo$2493boo52b oo6$2237boo$2237boo78boo$2317bo161boo3boo32boo$2231bo83bobo162bo3bo20b oo11boo$2229b3o83boo160b3o5b3o18bo$2228bo248bo9bo15b3o35boo$2228boo 273bo37boobboo$2248boo295bobo$2248bo273boo23bo$2246bobo274bo23boo$ 2246boo272b3o$2520bo$$2232boo$2231bobo$2231bo$2230boo65boo15boo$2296bo bo15boo$2296bo25boo$2295boo25bo$2320bobo44bo$2320boo43b3o$2339boo23bo$ 2235boo103bo23boo$2236bo103bobo$2233b3o66bo38boobboo37bo$2233bo68b3o 40boo35b3o15bo9bo$2305bo75bo18b3o5b3o$2142boo139bo20boo62boo11boo20bo 3bo$2135boo5boo137b3o15bo68boo32boo3boo$2135boo143bo18b3o$2267boo11boo 20bo$2267boo32boo$2137boo17boo8boo$2137boo17bo9boo265boo$2131boo21bobo 276boo$2131boo21boo$2172boo165boo52boo$2172boo62boo21boo37boo38bobo16b oo34boo$2168boo66boo21bobo36boo17boo19bo18bobo45boo$2168boo72boo17bo 55boo18boo20bo44bobbo36boo$2242boo17boo90boo4boo44boo4boo31bo$2353bobo 55bobo28bobo$2318boo35bo57bo28boo$2173boo65boo76bo27boo7boo56boo$2173b oo65boo5boo56boo12b3o24boo20boo33boo$2247boo39boo16bo14bo47bo34bo24boo $2288bo14b3o60b3o32b3o24bobo$2267boo20b3o11bo62bo34bo26bo$2128boo138bo 22bo103boo30boo$2129bo135b3o127bo$2129bobo133bo130b3o$2130boo204boo60b o$2337bo$2337bobo$2338boo91boo$2166boo187bo74bobo$2166bo186b3o74bo$ 2167b3o182bo76boo$2169bo182boo$2153boo181boo$2152bobo182bo$2152bo171b oo11bobo$2151boo172bo12boo107boo$2131boo192bobo119bobo$2131boo14boo 177boobboo117bo$2123boo22bo182boo117boo$2124bo23b3o$2124bobo23bo145boo $2125boo169boo$2161boo168boo$2161boo162boo4boo$2298boo25boo$2168bo129b oo139boo$2143boo23b3o140boo126boo$2143bo8boo17bo139bo$2141bobo9bo16boo 13boo48boo72bobo121bo$2141boo10bobo30bo25bo23bo25bo46boo120b3o$2154boo 30bobo21b3o23bobo21b3o50boo115bo$2187boo20bo27boo20bo53boo115boo$2170b o38boo48boo58boo129boo$2168b3o149bo129bo$2167bo11bo49bo90bobo125bobo$ 2152bo14boo8b3o47b3o91boo125boo$2151bobo22bo49bo280bo$2152bo23boo35boo 11boo279b3o$2213boo85boo132boo74bo$2269boo29boo131bobo73boo$2269boo 162bo90boo$2140boo290boo90bo$2124boo14boo380bobo$2125bo22boo131bo229bo 10boo$2122b3o23bo7boo122bobo227bobo$2122bo23bobo6bobo123boo227bobo$ 2146boo7bo32boo48boo32boo231boo4bo$2154boo7boo23boo11boo35boo11boo20bo 48boo15boo163bobo15boo$2164bo36bo49bo21bobo46boo15bobo95boo65bo17bobo$ 2161b3o38b3o47b3o19boo65bo96bo64boo19bo$2161bo42bo49bo52boo32boo92b3o 86boo$2148boo157boo126bo$2148bo35boo48boo263boo$2146bobo11boo22bo27boo 20bo97bo167bo$2146boo12bo24b3o23bobo21b3o92b3o167bobo$2158bobo26bo23bo 25bo91bo123boo46boo$2154boobboo50boo117boo122bobo57boo$2154boo299bo57b oo$2455boo3$2153boo$2153boo4boo$2159boo$$2445boo$2298bo146boo78boo$ 2298b3o35boo187bo$2301bo34boo101bo83bobo$2158boo96boo42boo135b3o83boo$ 2158bobo96bo178bo$2160bo96bobo176boo$2160boo96boobboo67boo123boo$2262b oo67boo123bo$2335boo117bobo$2335boo117boo$$2291boo$2291boo36boo109boo$ 2314boo13boo108bobo$2314bobo122bo$2316bo121boo65boo15boo$2304boo10boo 186bobo15boo$2304bo199bo25boo$2256boo36boo9b3o195boo25bo$2255bobo16boo 19bo11bo220bobo$2255bo18bobo15b3o233boo$2254boo20bo15bo$2270boo4boo 165boo$2270bobo171bo$2272bo168b3o66bo$2263boo7boo167bo68b3o533bo$2263b oo248bo531bobo$2491bo20boo531boo$2489b3o15bo$2488bo18b3o$2475boo11boo 20bo$2475boo32boo$$2253boo$2254bo$2254bobo$2255boo$2444boo21boo37boo$ 2444boo21bobo36boo17boo$2450boo17bo55boo$2450boo17boo$2273boo$2273bo 252boo$2271bobo174boo76bo$2271boo175boo5boo56boo12b3o$2455boo39boo16bo 14bo$2496bo14b3o$2475boo20b3o11bo$2476bo22bo$2473b3o$2473bo6$2253boo 15boo$2252bobo15boo$2252bo25boo$2251boo25bo$2276bobo$2276boo4$2258bo$ 2258b3o$2261bo$2260boo4$2876bo$2874b3o$2873bo$2255boo616boo17bo$2256bo 633b3o11bo$2256bobo630bo14b3o$2257boo630boo16bo14bo$2906boo12b3o$2919b o$2271boo646boo$2271bobo$2273bo505boo$2273boo504boo137boo$2253boo504bo 139boo17boo$2253bo493bo11b3o137boo$2254b3o488b3o14bo$2256bo472bo14bo 16boo98boo$2729b3o12boo115boo$2262boo468bo$2262boo467boo$2902boo$2882b oo19bo$2732boo148bobo15b3o$2732boo17boo131bo15bo$2751boo131boo19boo$ 2906bo$2272boo515boo112b3o$2272bo516boo112bo$2270bobo$2270boo$2748boo$ 2748bo19boo$2749b3o15bobo$2751bo15bo128boo$2272boo471boo19boo129bo$ 2272bo78boo392bo151bobo15boo$2270bobo11boo66bo25bo367b3o149boo15boo$ 2270boo12bo67bobo21b3o11bo357bo$2282bobo68boo20bo14b3o$2278boobboo50b oo39boo16bo14bo$2278boo47boo5boo56boo12b3o$2327boo76bo535boo$2405boo 534boo$2754boo$2277boo50boo17boo404bo$2277boo4boo44boo17bo55boo329boo 15bobo$2283boo38boo21bobo36boo17boo329boo15boo200boo$2323boo21boo37boo 567bo$2916boo34bobo$2916bobo33boo$2918bo$2918boo$2282boo$2282bobo69boo 32boo544boo$2284bo69boo11boo20bo528bo15boo$2284boo81bo18b3o529b3o$ 2368b3o15bo534bo30boo$2370bo20boo527boo30bobo$2392bo341boo218bo$2350b oo37b3o341bobo218boo$2320boo28bo38bo343bo172boo$2321bo29b3o378boo172b oo$2321bobo29bo$2322boo619boo$2407boo534bobo$2383bo23bobo535bo$2383b3o 23bo535boo$2386bo22boo506boo$2385boo14boo493boo19bo$2401boo494bo17bobo $2744boo151bobo15boo$2744boo152boo4bo18boo$2756boo145bobo16bobo$2756bo bo144bobo16bo$2758bo145bo10boo4boo$2323boo433boo155bobo$2323boo14boo 576bo$2315boo22bo393boo182boo$2316bo23b3o391bo19boo146boo$2316bobo23bo 391bobo17bo148bo$2317boo416boo15bobo145b3o$2402boo343bo4boo146bo85bo$ 2402bobo341bobo235b3o$2404bo341bobo234bo$2404boo329boo10bo179boo54boo$ 2335boo397bobo190bobo38boo$2335bo398bo193bo40bo$2333bobo397boo234bobo$ 2333boo413boo220boo10bo$2386boo360bo232bobo$2385bobo361b3o229bobo$ 2385bo365bo230bo4boo$2384boo584boo15bobo$2969bobo17bo$2969bo19boo$ 2968boo$$2413boo578boo$2414bo25bo552bo$2394boo18bobo21b3o550bobo$2332b oo60boo7boo10boo20bo553boo$2316boo14boo69bo33boo540boo$2317bo22boo59bo bo575boo$2314b3o23bo60boo4boo48bo$2314bo23bobo44boo20bo47b3o19boo$ 2338boo46bo18bobo46bo21bobo$2386bobo16boo34boo11boo20bo11bo$2387boo52b oo32boo9b3o$2485bo$2485boo10boo$2340boo155bo$2340bo154bobo469boo$2338b obo11boo141boo13boo456bo$2338boo12bo119boo36boo456bobo$2350bobo119boo 495boo$2346boobboo64boo$2346boo68boo11boo85boo$2429bo86boo$2393boo35b 3o79boo$2389boobboo37bo79boo$2345boo41bobo$2345boo4boo35bo23boo467boo$ 2351boo34boo23bo27boo39boo397bobo$2413b3o23bobo40bo34boo362bo$2415bo 23bo39b3o35boo$2438boo39bo$2970boo15boo$2970boo15bobo$2350boo637bo$ 2350bobo636boo$2352bo$2352boo231bo$2583b3o$2557boo23bo$2558bo23boo$ 2510boo46bobo422bo$2510bo48boobboo37bo378b3o$2511b3o49boo35b3o15bo9bo 351bo$2513bo85bo18b3o5b3o351boo19boo$2424boo160boo11boo20bo3bo360bo15b o$2417boo5boo62boo96boo32boo3boo357b3o15bobo$2417boo69boo32boo459bo19b oo$2455boo65bo460boo$2454bobo46boo15bobo$2419boo33bo48boo15boo$2419boo 32boo569boo$2413boo47boo560boo$2413boo46bobo$2462bo94boo52boo373boo$ 2556bobo16boo34boo354boo17boo$2556bo18bobo45boo342boo$2450boo103boo20b o44bobbo$2450boo29boo88boo4boo44boo4boo$2481boo88bobo55bobo334boo$ 2573bo57bo335bo$2564boo7boo56boo331b3o12boo$2502boo60boo20boo33boo341b o14bo16boo$2501bobo83bo34bo357b3o14bo$2501bo82b3o32b3o360bo11b3o$2440b oo58boo82bo34bo374bo$2440bo53boo117boo399boo$2433boo6b3o50boo117bo400b oo$2433bo9bo46boo122b3o$2431bobo56bobo61boo60bo$2431boo59bo62bo$2422b oo68boo61bobo$2422boo55boo75boo$2479boo25boo$2506boo4boo$2512boo36boo$ 2477boo71bobo$2477boo73bo21boo$2439boo111boo20bo$2439bo71boo59bobo$ 2437bobo67boobboo59boo$2437boo67bobo$2506bo12boo$2505boo11bobo$2518bo$ 2517boo$2533boo$2533bo$2534b3o$2536bo$2441boo76boo$2441bobo74bobo$ 2443bo74bo35boo15boo$2443boo72boo34bobo15boo$2414boo17boo118bo$2414bo 18boo117boo$2415b3o$2417bo$$2423boo$2423boo102boo$2527boo7boo21bo$ 2536bo22b3o$2534bobo25bo$2534boo4boo19boo$2518boo20bo15bo$2519bo18bobo 15b3o$2433boo84bobo16boo19bo$2433bo86boo36boo$2431bobo$2431boo4$2555b oo$2433boo120boo17boo$2433bo140boo$2431bobo11boo$2431boo12bo$2443bobo 80boo47boo$2439boobboo77boobboo47bo28boo$2439boo80bobo38boo12b3o25boo$ 2521bo23boo16bo14bo$2520boo23bo14b3o$2546b3o11bo$2438boo108bo$2438boo 4boo169boo$2444boo169bo$2613bobo$2613boo3$2600boo$2443boo154bobo$2443b obo153bo$2445bo152boo$2445boo5$2602boo$2601bobo$2601bo$2600boo3$3001b 3o$3001bo$2618boo382bo$2618bobo$2620bo$2620boo7$2610boo$2610boo$$2604b o$2602b3o$2601bo$2601boo$2621boo$2621bo$2619bobo$2619boo$2678bo$2678b 3o$2605boo74bo$2604bobo73boo$2604bo90boo$2603boo90bo$2693bobo$2682bo 10boo$2681bobo$2681bobo$2676boo4bo$2675bobo15boo$2608boo65bo17bobo$ 2609bo64boo19bo$2606b3o86boo$2606bo$2670boo$2671bo$2671bobo$2624boo46b oo$2624bobo57boo$2626bo57boo$2626boo7$2616boo$2616boo78boo$2696bo$ 2610bo83bobo$2608b3o83boo$2607bo$2607boo$2627boo$2627bo$2625bobo$2625b oo3$2611boo$2610bobo$2610bo$2609boo65boo15boo$2675bobo15boo$2675bo25b oo$2674boo25bo$2699bobo$2699boo$$2614boo$2615bo$2612b3o66bo$2612bo68b 3o$2684bo$2662bo20boo$2660b3o15bo$2659bo18b3o$2646boo11boo20bo$2646boo 32boo6$2615boo21boo37boo$2615boo21bobo36boo17boo$2621boo17bo55boo$ 2621boo17boo$$2697boo$2619boo76bo$2619boo5boo56boo12b3o$2626boo39boo 16bo14bo$2667bo14b3o$2646boo20b3o11bo$2647bo22bo$2644b3o$2644bo!golly-3.3-src/Patterns/Life/Signal-Circuitry/heisenblinker-30.rle0000644000175000017500000000117312026730263021633 00000000000000#C p30 Heisenblinker device: Mike Playle, 26 September 2006 x = 68, y = 74, rule = B3/S23 47bo$45b3o$44bo$44boo5bo$51b3o$54bo$53boo4$39boo3boo$40b5o$40booboo11b o$40booboo10b3o$41b3o10b5o$53boo3boo$o$3o$3bo$bboo51b3o$55b3o$46bo$40b o3bobo11bo$39b3o3boo10bobo$38b5o13bo3bo$37bobobobo13b3o$37boo3boo11boo 3boo$50boo$3b5o3bobo36boo$bbob3obobbo3bo$3bo3bo5boobo$4b3o7bobo$5bo9bo 21boo$6boo4b3o23bo4bo$6bobo3boo21b3o4bo$6bobo3bo22bo6b3o10boo$7bo48bo$ 53b3o$53bo$4booboboo$4bo5bo$5bo3bo25boo$6b3o26bobo$27bo7bo$26boo$26bob o$21boo$21bobo$16boo4b3o$12b4obbo4b3o$7boo3b3oboo4b3o$7boo12bobo7boo$ 21boo8bobo$33bo$33boo17$65boo$65bobo$65bo!golly-3.3-src/Patterns/Life/Signal-Circuitry/constructor-memory-loop.rle0000644000175000017500000013254612026730263023444 00000000000000#CXRLE Pos=-30130,-1144 #C Programmable constructor attached to a glider loop containing #C a repeatable recipe for constructing an oblique line of eaters. #C Based on prototype programmable constructor by Paul Chapman -- #C see constructor-memory-tape.rle in the same folder for details. #C The memory-tape version's circuits are separated from each other #C to make the individual components easier to recognize. #C #C In this memory-loop version, as a first step, a long string #C of gliders representing the construction recipe (lower left) #C is loaded into a repeating memory loop of the correct size. #C Gliders in the loop will be duplicated once every 118378 ticks. #C The first glider reaches the duplicator at generation 117892. #C #C The first output glider from the duplicator is the initial '1' bit #C in the following 157-bit recipe: #C 1 001 001 1 1 0001 01 0001 001 01 01 01 001 1 001 1 1 1 1 0001 #C 1 1 0001 1 001 1 001 1 1 1 1 1 0001 01 01 01 01 0001 1 1 1 1 1 #C 1 1 1 1 1 1 1 0001 1 0001 01 001 1 1 001 1 1 1 1 1 1 1 1 1 #C 0001 01 01 01 0001 01 01 01 01 01 001 1 1 1 1 1 1 1 1 1 001 #C [1=INC, 01=DEC, 001=fire BLACK glider, 0001=fire WHITE glider] #C #C However, instead of doing a full INC operation, the initial glider #C is used to unblock the 'ladder' circuit and initialize it with a #C new block ready to be pulled up the ladder. Press 'm' in Golly 1.1 #C to center the view on the temporary eater and block that keep the #C circuit switched off until the memory loop has been fully loaded. #C #C The p754 Collector gun starts right away, but has no effect until #C PULL (0) micro-instructions reach the ladder and produce gliders #C that need to be suppressed. Only TRIGGER (1) micro-instructions #C are allowed to send signals through to the salvo shotguns at the #C 'shoulder'; these manipulate the block at the 'elbow' and produce #C WHITE or BLACK gliders aimed at the construction site (hand). #C #C The first construction interaction at the hand begins at 129200 #C ticks, after which a new eater is constructed at (+8,-12) from #C the previous one, every 118442 ticks -- another Doppler effect. #C #C Dave Greene, 26 May 2004 #C Updated 16 October 2006: smaller memory loop and constructor, #C but a less compact initial pattern (full recipe bitstring shown). x = 31473, y = 31101, rule = B3/S23 28864b2o108b2o108b2o$28842b2o20b2o86b2o20b2o86b2o20b2o$28752b2o89bo 109bo109bo$28730b2o20b2o78bo10bobo96bo10bobo96bo10bobo$28731bo98b3o11b 2o94b3o11b2o94b3o11b2o$28720bo10bobo80bo14bo94bo14bo94bo14bo$28718b3o 11b2o80b3o12b2o93b3o12b2o93b3o12b2o$28702bo14bo99bo109bo109bo$28702b3o 12b2o97b2o108b2o108b2o$28705bo$28704b2o478b2o108b2o108b2o108b2o108b2o 108b2o$28817b2o108b2o108b2o123b2o20b2o86b2o20b2o86b2o20b2o86b2o20b2o 86b2o20b2o86b2o20b2o$28817b2o17b2o89b2o17b2o89b2o17b2o105bo109bo109bo 109bo109bo109bo$28705b2o129b2o108b2o108b2o94bo10bobo96bo10bobo96bo10bo bo96bo10bobo96bo10bobo96bo10bobo$28705b2o17b2o424b3o11b2o94b3o11b2o94b 3o11b2o94b3o11b2o94b3o11b2o94b3o11b2o$28724b2o148b2o108b2o108b2o38bo 14bo94bo14bo94bo14bo94bo14bo94bo14bo94bo14bo$28874b2o108b2o108b2o38b3o 12b2o93b3o12b2o93b3o12b2o93b3o12b2o93b3o12b2o93b3o12b2o$28762b2o373bo 109bo109bo109bo109bo109bo$28762b2o372b2o108b2o108b2o108b2o108b2o108b2o $28833b2o108b2o108b2o$28833bo19b2o88bo19b2o88bo19b2o$28721b2o111b3o15b obo89b3o15bobo89b3o15bobo62b2o108b2o108b2o108b2o108b2o108b2o$28721bo 19b2o93bo15bo93bo15bo93bo15bo64b2o17b2o89b2o17b2o89b2o17b2o89b2o17b2o 89b2o17b2o89b2o17b2o$28722b3o15bobo87b2o19b2o87b2o19b2o87b2o19b2o83b2o 108b2o108b2o108b2o108b2o108b2o$28724bo15bo89bo109bo109bo$28718b2o19b2o 90b3o107b3o107b3o140b2o108b2o108b2o108b2o108b2o108b2o$28718bo114bo109b o109bo140b2o108b2o108b2o108b2o108b2o108b2o$28719b3o$28721bo$29153b2o 108b2o108b2o108b2o108b2o108b2o$29153bo19b2o88bo19b2o88bo19b2o88bo19b2o 88bo19b2o88bo19b2o$29154b3o15bobo89b3o15bobo89b3o15bobo89b3o15bobo89b 3o15bobo89b3o15bobo$28839b2o108b2o108b2o95bo15bo93bo15bo93bo15bo93bo 15bo93bo15bo93bo15bo$28839bo109bo109bo90b2o19b2o87b2o19b2o87b2o19b2o 87b2o19b2o87b2o19b2o87b2o19b2o$28727b2o91b2o15bobo90b2o15bobo90b2o15bo bo90bo109bo109bo109bo109bo109bo$28727bo92b2o15b2o91b2o15b2o91b2o15b2o 92b3o107b3o107b3o107b3o107b3o107b3o$28708b2o15bobo425bo109bo109bo109bo 109bo109bo$28708b2o15b2o3$29814b2o$29792b2o20b2o$29159b2o108b2o108b2o 108b2o108b2o108b2o82bo$29159bo109bo109bo109bo109bo109bo72bo10bobo$ 29140b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo 70b3o11b2o$29140b2o15b2o91b2o15b2o91b2o15b2o91b2o15b2o91b2o15b2o91b2o 15b2o55bo14bo$29764b3o12b2o$28819b2o108b2o108b2o726bo$28818bobo107bobo 107bobo725b2o$28707b2o109bo109bo109bo$28706bobo108b2o108b2o108b2o$ 28706bo1060b2o$28705b2o1060b2o17b2o$29786b2o2$29824b2o$29824b2o$29139b 2o108b2o108b2o108b2o108b2o108b2o$29138bobo107bobo107bobo107bobo107bobo 107bobo$28829b2o108b2o108b2o87bo109bo109bo109bo109bo109bo94b2o$28829b 2o108b2o108b2o86b2o108b2o108b2o108b2o108b2o108b2o94bo19b2o$28717b2o 1065b3o15bobo$28717b2o1067bo15bo$29780b2o19b2o$29780bo$29781b3o$28818b 2o108b2o108b2o743bo$28819bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b2o$28706b 2o111bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo$28707bo19b2o91b2o15bo bo9bo80b2o15bobo9bo80b2o15bobo9bo79b2o108b2o108b2o108b2o108b2o108b2o$ 28707bobo17bo104bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o78b2o108b2o108b2o 108b2o108b2o108b2o$28708b2o15bobo103bobo107bobo107bobo$28720bo4b2o104b obo107bobo107bobo735b2o$28719bobo98b2o10bo97b2o10bo97b2o10bo736bo$ 28719bobo97bobo107bobo107bobo728b2o15bobo$28708b2o10bo98bo109bo109bo 730b2o15b2o$28707bobo108b2o108b2o108b2o98b2o108b2o108b2o108b2o108b2o 108b2o$28707bo125b2o108b2o108b2o84bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b 2o80bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b2o$28706b2o125bo109bo109bo85bob o17bo7bobo79bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo 79bobo17bo7bobo$28721b2o111b3o107b3o107b3o83b2o15bobo9bo80b2o15bobo9bo 80b2o15bobo9bo80b2o15bobo9bo80b2o15bobo9bo80b2o15bobo9bo$28721bo114bo 109bo109bo95bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o91bo4b2o 10b2o91bo4b2o10b2o$28722b3o426bobo107bobo107bobo107bobo107bobo107bobo$ 28724bo426bobo107bobo107bobo107bobo107bobo107bobo$29140b2o10bo97b2o10b o97b2o10bo97b2o10bo97b2o10bo97b2o10bo$29139bobo107bobo107bobo107bobo 107bobo107bobo$29139bo109bo109bo109bo109bo109bo$29138b2o108b2o108b2o 108b2o108b2o108b2o$29153b2o108b2o108b2o108b2o108b2o108b2o64b2o$29153bo 109bo109bo109bo109bo109bo64bobo$29154b3o107b3o107b3o107b3o107b3o107b3o 61bo$29156bo109bo109bo109bo109bo109bo60b2o9$29779b2o$29779b2o$28634b2o $28635bo$28632b3o$28632bo2$29768b2o$29769bo19b2o6b2o$29769bobo17bo7bob o$29770b2o15bobo9bo$29782bo4b2o10b2o$29781bobo$29781bobo$29770b2o10bo$ 29769bobo$29769bo$29768b2o$29783b2o$29783bo$29784b3o$29786bo57b2o$ 29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$29794bo14bo$29794b3o 12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$29816b2o2$29854b2o$ 29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$29816bo15bo$29810b2o19b 2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620bobo$28621b2o2b2o37bo$ 28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b2o20bo3bo$28648b2o32b 2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b2o5$28619b2o52b2o$ 28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo44bo2bo$28633b2o4b 2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o1104b2o$ 28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o1113b2o$ 28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$28681bo1127b 2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b2o$29798b2o$ 29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$29812bo4b2o10b2o $29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o1183bo$28614b2o 1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$28629b2o24$29844b 2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$29794bo14bo$ 29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$29816b2o2$ 29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$29816bo15bo$ 29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620bobo$28621b2o 2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b2o20bo3bo$ 28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b2o5$28619b 2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo44bo2bo$ 28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o 1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o 1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo1223bo$29800b 2o15b2o1222b3o$31040bo$31040b2o3$28619b2o52b2o$28618bobo16b2o34b2o$ 28618bo18bobo45b2o$28617b2o20bo44bo2bo2359b2o$28633b2o4b2o44b2o4b2o 2354b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o1104b2o$28626b2o 20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o1113b2o$28646bo34bo 2$28615bo$28615b3o$28618bo$28617b2o$31031b2o$28681b2o2348b2o$28681bo 1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b2o$ 29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo1207b2o$29800b2o15bobo9bo 1207bobo$29812bo4b2o10b2o1208bo$29811bobo1225b2o$29811bobo$29800b2o10b o$29799bobo$28614b2o1183bo$28614b2o1182b2o$29813b2o$29813bo1215b2o$ 29814b3o1212b2o$29816bo$31023bo$31021b3o$31020bo18b2o$31020b2o17b2o$ 28629b2o2418b2o$28629b2o2418bo$31047bobo$31047b2o9$31043b2o$31043bobo$ 31045bo$31045b2o5$30746b2o$30746b2o280b2o$30726bo301b2o$30714bo11b3o 308b2o$30712b3o14bo280b2o25bobo$29844b2o850bo14bo16b2o280b2o27bo$ 29822b2o20b2o850b3o12b2o277bo48b2o$29823bo875bo278bo11b3o$29812bo10bob o872b2o276b3o14bo$29810b3o11b2o1134bo14bo16b2o$29794bo14bo1150b3o12b2o $29794b3o12b2o888b2o262bo$29797bo901b2o17b2o242b2o$29796b2o920b2o2$ 30756b2o205b2o57b2o$29797b2o957b2o205b2o17b2o38b2o4b2o$29797b2o17b2o 1164b2o44b2o$29816b2o$30715b2o303b2o$29854b2o859bo19b2o283b2o$29854b2o 860b3o15bobo290b2o$30718bo15bo288b2o2b2o$30712b2o19b2o244b2o41bobo$ 29813b2o897bo266bo19b2o21bo12b2o$29813bo19b2o878b3o264b3o15bobo20b2o 11bobo$29814b3o15bobo880bo266bo15bo35bo$29816bo15bo1143b2o19b2o34b2o$ 29810b2o19b2o1143bo72b2o$29810bo1166b3o69bo$28619b2o1190b3o1165bo70b3o $28620bo1192bo1238bo$28620bobo2098b2o312b2o$28621b2o2b2o37bo2056bo312b obo$28625b2o35b3o15bo9bo2011b2o15bobo312bo$28661bo18b3o5b3o2011b2o15b 2o312b2o60bo$28648b2o11b2o20bo3bo2002b2o293b2o106b3o$28648b2o32b2o3b2o 1130b2o868bobo293bo106bo$29819bo869bo276b2o15bobo106b2o$29800b2o15bobo 868b2o276b2o15b2o78bo34bo$29800b2o15b2o1135b2o107b3o32b3o$30953bobo 110bo34bo$30953bo89b2o20b2o33b2o$30952b2o89b2o7b2o56b2o$31052bo57bo$ 28619b2o52b2o2375bobo55bobo$28618bobo16b2o34b2o2375b2o4b2o44b2o4b2o$ 28618bo18bobo45b2o2014b2o331b2o20bo44bo2bo$28617b2o20bo44bo2bo2012bobo 332bo18bobo45b2o$28633b2o4b2o44b2o4b2o2007bo334bobo16b2o34b2o$28633bob o55bobo2005b2o335b2o52b2o$28635bo57bo2271b2o$28626b2o7b2o56b2o1104b2o 1163bobo$28626b2o20b2o33b2o1113bobo1163bo$28649bo34bo1113bo1164b2o$ 28646b3o32b3o1113b2o$28646bo34bo2$28615bo2449b2o32b2o3b2o$28615b3o 2093b2o352b2o11b2o20bo3bo$28618bo2092b2o365bo18b3o5b3o$28617b2o2423b2o 35b3o15bo9bo$31038b2o2b2o37bo$28681b2o2292b2o60bobo$28681bo1127b2o 1164b2o60bo23b2o$28682b3o1124b2o1225b2o23bo$28684bo2015b2o360b3o$ 28637bo2063bo19b2o341bo$28635b3o2063bobo17bo$28634bo2067b2o15bobo$ 28634b2o2078bo4b2o243b2o$29798b2o913bobo249bo19b2o$29799bo19b2o6b2o 884bobo249bobo17bo$29799bobo17bo7bobo872b2o10bo251b2o15bobo$29800b2o 15bobo9bo871bobo274bo4b2o$29812bo4b2o10b2o870bo275bobo$29811bobo886b2o 275bobo$29811bobo901b2o249b2o10bo$29800b2o10bo902bo249bobo$29799bobo 914b3o246bo$28614b2o1183bo918bo245b2o$28614b2o1182b2o1179b2o$29813b2o 1164bo$29813bo1166b3o$29814b3o1165bo$29816bo$31146b2o$31146b2o3$28629b 2o$28629b2o$31135b2o$31136bo$31136bobo$31137b2o3$31150b2o$31150bobo$ 31152bo$31152b2o2$30509b2o$30509b2o456bo$30489bo475b3o$30477bo11b3o 472bo$30475b3o14bo471b2o182b2o$30459bo14bo16b2o655bobo$30459b3o12b2o 674bo$30462bo687b2o$30461b2o2$30971b2o$30462b2o507b2o$29844b2o616b2o 17b2o649b2o$29822b2o20b2o635b2o648bobo$29823bo1307bo$29812bo10bobo693b 2o609b2o$29810b3o11b2o693b2o$29794bo14bo$29794b3o12b2o$29797bo680b2o$ 29796b2o680bo19b2o$30479b3o15bobo$30481bo15bo642b2o$29797b2o676b2o19b 2o642b2o$29797b2o17b2o657bo479b2o$29816b2o658b3o476b2o190bo$30478bo 668b3o$29854b2o1294bo$29854b2o1293b2o$31129b2o$31130bo$29813b2o1315bob o$29813bo19b2o649b2o645b2o$29814b3o15bobo649bo588bo$29816bo15bo632b2o 15bobo586b3o$29810b2o19b2o632b2o15b2o586bo74b2o$29810bo642b2o615b2o73b obo$28619b2o1190b3o638bobo600b2o90bo$28620bo1192bo638bo603bo90b2o$ 28620bobo1828b2o603bobo$28621b2o2b2o37bo2392b2o10bo$28625b2o35b3o15bo 9bo2377bobo$28661bo18b3o5b3o2377bobo$28648b2o11b2o20bo3bo2381bo4b2o$ 28648b2o32b2o3b2o1130b2o1236b2o15bobo$29819bo1133b2o101bobo17bo65b2o$ 29800b2o15bobo1133b2o101bo19b2o64bo$29800b2o15b2o645b2o589b2o86b3o$ 30463bobo481bo197bo$30463bo481b3o132b2o$30462b2o480bo135bo$30944b2o 132bobo$28619b2o52b2o2289b2o112b2o46b2o$28618bobo16b2o34b2o2289bo101b 2o57bobo$28618bo18bobo45b2o2275bobo101b2o57bo$28617b2o20bo44bo2bo2274b 2o160b2o$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo2254b2o$ 28626b2o7b2o56b2o1104b2o673b2o471bobo471b2o$28626b2o20b2o33b2o1113bobo 673b2o471bo473b2o$28649bo34bo1113bo1147b2o$28646b3o32b3o1113b2o1335b2o $28646bo34bo2372b2o78b2o$31055bo$28615bo2439bobo83bo$28615b3o1845b2o 591b2o83b3o$28618bo1845bo19b2o658bo$28617b2o1845bobo17bo466b2o190b2o$ 30465b2o15bobo467bo170b2o$28681b2o1794bo4b2o465b3o172bo$28681bo1127b2o 665bobo470bo174bobo$28682b3o1124b2o665bobo646b2o$28684bo1780b2o10bo$ 28637bo1826bobo$28635b3o1826bo674b2o$28634bo1828b2o674bobo$28634b2o 1842b2o462b2o197bo$29798b2o678bo464bo113b2o15b2o65b2o$29799bo19b2o6b2o 650b3o461bobo15b2o94b2o15bobo$29799bobo17bo7bobo651bo462b2o15b2o86b2o 25bo$29800b2o15bobo9bo1220bo25b2o$29812bo4b2o10b2o1219bobo$29811bobo 1237b2o$29811bobo$29800b2o10bo1323b2o$29799bobo1334bo$28614b2o1183bo 1270bo66b3o$28614b2o1182b2o1268b3o68bo$29813b2o225bobo1024bo$29813bo 226b2o1025b2o20bo$29814b3o205bo18bo1031bo15b3o$29816bo193bo11b3o937b2o 107b3o18bo$30008b3o14bo13bo9b2o911bobo105bo20b2o11b2o$29992bo14bo16b2o 12bo10bo914bo105b2o32b2o$29992b3o12b2o29b3o6bobo914b2o$29995bo47b2o2b 2o$28629b2o1363b2o47b2o$28629b2o$30037b2o$29995b2o40b2o907b2o125b2o37b 2o21b2o$29995b2o17b2o929bobo106b2o17b2o36bobo21b2o$30014b2o929bo108b2o 55bo17b2o$30944b2o60bo103b2o17b2o$31004b3o$31003bo49b2o416b2o$31003b2o 49bo76b2o338b2o$30974bo34bo41b3o12b2o56b2o5b2o$30011b2o36b2o923b3o32b 3o39bo14bo16b2o39b2o226bo$30011bo19b2o16bobo925bo34bo54b3o14bo267b3o$ 30012b3o15bobo18bo902b2o20b2o33b2o56bo11b3o20b2o249bo23b2o$30014bo15bo 20b2o901b2o7b2o56b2o58bo22bo249b2o23bo$30008b2o19b2o4b2o926bo57bo83b3o 269bobo$30008bo25bobo924bobo55bobo85bo227bo37b2o2b2o$30009b3o22bo926b 2o4b2o44b2o4b2o288bo9bo15b3o35b2o$30011bo21b2o7b2o901b2o20bo44bo2bo 293b3o5b3o18bo$30042b2o902bo18bobo45b2o94bo202bo3bo20b2o11b2o$30946bob o16b2o34b2o106b3o199b2o3b2o32b2o$30947b2o52b2o109bo23b2o$29992b2o1117b 2o23bo$29991bobo23bo1116bobo$29991bo23b3o1074bo37b2o2b2o$29844b2o144b 2o22bo63bo987bo9bo15b3o35b2o$29822b2o20b2o152b2o14b2o36b2o22b3o987b3o 5b3o18bo$29823bo174b2o52bo22bo993bo3bo20b2o11b2o$29812bo10bobo224bobo 22b2o991b2o3b2o32b2o216b2o52b2o$29810b3o11b2o224b2o11bo912b2o32b2o3b2o 308b2o34b2o16bobo$29794bo14bo253b3o910b2o11b2o20bo3bo297b2o45bobo18bo$ 29794b3o12b2o255bo922bo18b3o5b3o293bo2bo44bo20b2o$29797bo267b2o886b2o 35b3o15bo9bo288b2o4b2o44b2o4b2o$29796b2o1151b2o2b2o37bo313bobo55bobo$ 30948bobo355bo57bo$30079b2o11bo855bo23b2o331b2o56b2o7b2o$29797b2o253b 2o25b2o11b3o852b2o23bo109b2o52b2o177b2o33b2o20b2o$29797b2o17b2o235bo 41bo23b2o852b3o106b2o34b2o16bobo176bo34bo$29816b2o235bobo38b2o23bo855b o94b2o45bobo18bo177b3o32b3o$29997b2o55b2o61bobo949bo2bo44bo20b2o178bo 34bo$29854b2o140bobo114b2o2b2o945b2o4b2o44b2o4b2o199b2o$29854b2o140bo 116b2o948bobo55bobo200bo$29995b2o1066bo57bo199b3o$31062b2o56b2o7b2o 190bo60b2o$29813b2o215b2o1040b2o33b2o20b2o251bo$29813bo19b2o195b2o52b 2o959b2o25bo34bo272bobo$29814b3o15bobo221b2o26b2o959b2o26b3o32b3o269b 2o$29816bo15bo223b2o1017bo34bo$29810b2o19b2o1247b2o$29810bo177b2o45b2o 1044bo$28619b2o1190b3o175bo45b2o1041b3o$28620bo1192bo175bobo15b2o22b2o 1001b2o42bo60b2o221b2o$28620bobo1367b2o15b2o22b2o48b2o36b2o914bo103bo 223bo$28621b2o2b2o37bo1416bo19b2o16bobo913bobo99bobo223bobo$28625b2o 35b3o15bo9bo1391bo17bobo18bo914b2o99b2o225b2o$28661bo18b3o5b3o1346b2o 42b2o17bo20b2o998bo$28648b2o11b2o20bo3bo1349b2o60b2o4b2o1014b3o$28648b 2o32b2o3b2o1130b2o283bobo942b2o73bo$29819bo284bo944bobo71b2o$29800b2o 15bobo283b2o7b2o937bo87b2o$29800b2o15b2o293b2o937b2o86bo$31137bobo11b 2o$31137b2o12bo$31149bobo97bo$30008b2o1135b2o2b2o96b3o$28619b2o52b2o 1333bobo1134b2o99bo$28618bobo16b2o34b2o1335bo1036b2o197b2o117b2o15b2o$ 28618bo18bobo45b2o1323b2o110b2o923bobo129b2o53bo130b2o15bobo$28617b2o 20bo44bo2bo1434bo926bo129b2o53b3o147bo$28633b2o4b2o44b2o4b2o1427bobo 926b2o93b2o91bo146b2o$28633bobo55bobo1426b2o1022b2o4b2o84b2o$28635bo 57bo2456b2o25b2o$28626b2o7b2o56b2o1104b2o1376b2o110b2o$28626b2o20b2o 33b2o1113bobo1363b2o84b2o11bo25bo$28649bo34bo1113bo218b2o1012b2o132bo 57b2o25b2o11b3o21bobo$28646b3o32b3o1113b2o218bo84b2o50b2o874bobo132bob o56bo41bo20b2o$28646bo34bo1316b2o15bobo85bo49bo2bo873bo135b2o56bobo38b 2o39b2o49b2o$29998b2o15b2o86bobo48b2o873b2o131b2o61b2o79b2o5b2o43bo$ 28615bo1488b2o1056b2o149b2o30b2o11bobo$28615b3o2538b2o188bo12b2o$ 28618bo2537bo189bobo$28617b2o2535bobo135b2o17b2o34b2o2b2o$31154b2o137b o17b2o38b2o$28681b2o2572b2o36bobo21b2o$28681bo1127b2o961b2o265b2o186b 2o26b2o37b2o21b2o$28682b3o1124b2o961b2o265b2o134b2o50b2o$28684bo2108bo 381b2o29b2o144b2o$28637bo2153b3o11bo240bo159b2o138b2o4b2o$28635b3o 2152bo14b3o238b3o297b2o$28634bo1362b2o791b2o16bo14bo225bo$28634b2o 1360bobo106b2o700b2o12b3o224b2o145bo56b2o32b2o$29798b2o196bo108b2o14b 2o697bo207b2o164bobo55bo20b2o11b2o$29799bo19b2o6b2o166b2o100b2o22bo 698b2o207bo164b2o54bobo21bo$29799bobo17bo7bobo268bo23b3o65b2o837bobo 171b2o45b2o19b3o44bo$29800b2o15bobo9bo268bobo23bo66bo838b2o104b2o15b2o 48bo67bo44b3o28b2o$29812bo4b2o10b2o268b2o90bobo625b2o151bo162bobo15b2o 46bobo111bo30bobo$29811bobo378b2o16bo589b2o17b2o149b3o162bo65b2o87b2o 23b2o29bo$29811bobo199b2o193b3o589b2o167bo74b2o88b2o32b2o121bo53b2o$ 29800b2o10bo200bobo191bo761b2o73bobo121b2o118b3o$29799bobo213bo191b2o 553b2o190b2o90bo241bo$28614b2o1183bo154bo60b2o100b2o643b2o191bo90b2o 96bo$28614b2o1182b2o154b3o160bo837bobo186b3o$29813b2o142bo157bobo838b 2o10bo178bo$29813bo142b2o157b2o40b2o644b2o162bobo176b2o$29814b3o134bo 34bo161b2o7b2o624b2o19bo162bobo$29816bo132b3o32b3o162bo633bobo15b3o 164bo4b2o$29948bo34bo165bobo633bo15bo154b2o15bobo308bo$29948b2o33b2o 20b2o137b2o4b2o633b2o19b2o147bobo17bo65b2o241b3o35b2o$29938b2o56b2o7b 2o117b2o19bo20b2o639bo147bo19b2o64bo245bo34b2o$29939bo57bo121b2o3bobo 18bobo18bo22b2o613b3o147b2o86b3o232b2o7b2o$28629b2o1308bobo55bobo119bo 6bo19b2o16bobo22b2o613bo239bo233bo$28629b2o1309b2o4b2o44b2o4b2o117bobo 6b2o36b2o813b2o297bobo$29945bo2bo44bo20b2o101b2o860bo299b2o36b2o$ 29946b2o45bobo18bo962bobo198bo138b2o$29958b2o34b2o16bobo962b2o46b2o 112b2o35b3o142b2o$29958b2o52b2o28b2o60b2o859b2o57bobo112b2o34bo145b2o$ 30043bo59bobo71b2o618b2o166b2o57bo150b2o42b2o$30043bobo57bo25b2o46b2o 140bo478bo224b2o194bo$30044b2o56b2o25b2o68b2o118b3o476bobo15b2o399bobo 95b2o$30199bo122bo476b2o15b2o326b2o67b2o2b2o56bo23b2o14b2o$30200b3o 100bo17b2o821b2o67b2o59bobo22bo$30202bo88bo11b3o834b2o133bo14b2o8b3o$ 30107b2o49b2o129b3o14bo833b2o148bo11bo$29944b2o3b2o32b2o123bo49b2o2b2o 109bo14bo16b2o984b3o$29945bo3bo20b2o11b2o58b2o60b3o14b2o38bobo108b3o 12b2o743b2o149b2o107bo$29942b3o5b3o18bo71b2o4b2o54bo16bo16b2o23bo111bo 676b2o78b2o111b2o36b2o$29942bo9bo15b3o35b2o41b2o65bo6b3o14bo23b2o109b 2o677bo191b2o13b2o114b2o$29915bo12bo39bo37b2o2b2o103bobo7bo11b3o44b2o 6b2o760bobo83bo119bobo113bobo$29915b3o8b3o81bobo103bo20bo47bo6bo762b2o 83b3o117bo115bo16b2o$29918bo6bo86bo169b3o8b3o80b2o765bo115b2o10b2o102b 2o17bo$29917b2o6b2o85b2o34b2o132bo12bo80b2o17b2o745b2o128bo118b3o$ 30044b2o2b2o245b2o520b2o203b2o145b3o9b2o36b2o70bo$30043bobo771bobo203b o145bo11bo19b2o16bobo$30043bo12b2o275b2o484bo203bobo153bobo18bobo18bo 62b2o$30042b2o11bobo275b2o484b2o203b2o153b2o19bo20b2o61b2o$29844b2o 209bo1143b2o4b2o$29822b2o20b2o89bo118b2o1148bobo$29823bo109b3o356b2o 744b2o164bo$29812bo10bobo106bo359bo19b2o724bobo162b2o7b2o$29810b3o11b 2o106b2o359b3o15bobo726bo171b2o$29794bo14bo100b2o383bo15bo644b2o15b2o 65b2o$29794b3o12b2o99b2o144b2o231b2o19b2o644b2o15bobo298b2o$29797bo 257bobo231bo658b2o25bo299bo$29796b2o257bo234b3o514b2o140bo25b2o298bobo $30054b2o236bo514b2o140bobo324b2o$30795b2o153b2o$29797b2o995bobo425b2o $29797b2o17b2o104b2o870bo240b2o185bo$29816b2o104b2o869b2o240bo184bobo$ 30969bo66b3o181b2o52b2o$29854b2o442b2o518b2o147b3o68bo236bo$29854b2o 208b2o232bo498b2o19bo147bo295b2o11bobo$30064b2o213b2o15bobo499bo17bobo 147b2o20bo274bo12b2o$30279b2o15b2o500bobo15b2o154bo15b3o272bobo$29813b 2o256bo195b2o530b2o4bo164b3o18bo210b2o60b2o2b2o$29813bo19b2o236b3o192b obo535bobo162bo20b2o11b2o198bo64b2o$29814b3o15bobo239bo191bo537bobo 162b2o32b2o198bobo$29816bo15bo240b2o190b2o538bo10b2o386b2o$29810b2o19b 2o107b2o15bo95b2o104bo9bo646bobo$29810bo129bo16bobo94bo104b3o5b3o27bo 620bo450b2o$28619b2o1190b3o61b2o64b3o13b2o95bobo92b2o11bo3bo30b3o618b 2o443b2o4b2o$28620bo1192bo62bo48b2o16bo111b2o91bobo10b2o3b2o32bo14bo 587b2o458b2o$28620bobo1253bobo45bobo202bo2bo15bo50b2o12b3o588bo167b2o 37b2o21b2o$28621b2o2b2o37bo1212b2o2b2o37bo3bo201bo8bo11b2o63bo588b3o 149b2o17b2o36bobo21b2o$28625b2o35b3o15bo9bo1190b2o35b3o2b2o11bo9bo122b 2o53bo12bo74b2o587bo151b2o55bo17b2o$28661bo18b3o5b3o1226bo18b3o5b3o 122bobo206b2o729b2o17b2o$28648b2o11b2o20bo3bo1216b2o11b2o20bo3bo127bo 50bo16bo137bobo$28648b2o32b2o3b2o1130b2o83b2o32b2o3b2o126b2o53b2o4b2o 77b2o64bo674b2o310b2o$29819bo301bo4b2o4bo7bo51b2o17b2o63b2o675bo76b2o 231bobo$29800b2o15bobo313b3o8b2o46b2o756b3o12b2o56b2o5b2o173b2o15b2o 39bo$29800b2o15b2o295b2o5bo13bo4bo3b2o804bo14bo16b2o39b2o180b2o15bobo 37b2o$30115bo850b3o14bo213b2o25bo$30112b3o7bo16bo828bo11b3o20b2o193bo 25b2o$30112bo867bo22bo194bobo$30015bo20bo29b2o56bo12bo866b3o192b2o$ 28619b2o52b2o1200b2o52b2o83bobo7bo11b3o27bo59bo8bo59b2o809bo$28618bobo 16b2o34b2o1199bobo16b2o34b2o84bo6b3o14bo27b3o59bo2bo42b2o19bo$28618bo 18bobo45b2o1187bo18bobo45b2o61bo16bo16b2o29bo85bo6b2o11bobo15b3o92b2o$ 28617b2o20bo44bo2bo1185b2o20bo44bo2bo60b3o14b2o130b3o6b2o13bo15bo94b2o 928bo$28633b2o4b2o44b2o4b2o1196b2o4b2o44b2o4b2o58bo144bo24b2o19b2o 1016b3o$28633bobo55bobo1195bobo55bobo56b2o144b2o45bo1015bo$28635bo57bo 1197bo57bo246b3o1016b2o$28626b2o7b2o56b2o1104b2o81b2o7b2o56b2o245bo$ 28626b2o20b2o33b2o1113bobo81b2o20b2o33b2o$28649bo34bo1113bo106bo34bo 60b2o25b2o247b2o107bo560bo$28646b3o32b3o1113b2o103b3o32b3o62bo25b2o 248bo19b2o86b3o558b3o$28646bo34bo1220bo34bo64bobo209b2o62bobo17bo90bo 560bo23b2o$29931b2o70b2o185bo23bobo62b2o15bobo71bo17b2o559b2o23bo$ 28615bo1315bo258b3o23bo74bo4b2o60bo11b3o599bobo245b2o$28615b3o1314b3o 107b2o21b2o126bo22b2o72bobo63b3o14bo556bo37b2o2b2o246bo$28618bo1253b2o 60bo81b2o23bobo21b2o125b2o14b2o80bobo47bo14bo16b2o530bo9bo15b3o35b2o 248bobo$28617b2o1254bo142bobo6b2o14bo17b2o147b2o69b2o10bo48b3o12b2o 547b3o5b3o18bo284b2o$29873bobo142bo6bo14b2o17b2o217bobo62bo563bo3bo20b 2o11b2o224b2o$28681b2o1191b2o142b2o3bobo252bo63b2o562b2o3b2o32b2o224b 2o5b2o$28681bo1127b2o212b2o252b2o899b2o24b2o$28682b3o1124b2o250b2o229b 2o909bobo$28684bo1369b2o5b2o229bo50b2o858bo$28637bo1255bo160b2o237b3o 47b2o17b2o783b2o8b2o17b2o24b2o$28635b3o1253b3o401bo66b2o783b2o9bo17b2o 44b2o$28634bo1255bo123b2o1142bobo21b2o39bo$28634b2o1254b2o122bobo383b 2o757b2o21b2o36b3o$29798b2o216bo383b2o518b2o52b2o165b2o77bo$29799bo19b 2o6b2o187b2o902b2o34b2o16bobo164b2o$29799bobo17bo7bobo379b2o697b2o45bo bo18bo168b2o66b2o$29800b2o15bobo9bo379bobo147b2o546bo2bo44bo20b2o167b 2o66b2o$29812bo4b2o10b2o380bo147bo19b2o521b2o4b2o44b2o4b2o$29811bobo 397b2o147b3o15bobo520bobo55bobo$29811bobo184b2o362bo15bo522bo57bo$ 29800b2o10bo184bobo356b2o19b2o521b2o56b2o7b2o171b2o$29799bobo195bo358b o553b2o33b2o20b2o171b2o$28614b2o1183bo70b2o124b2o359b3o550bo34bo$ 28614b2o1182b2o70b2o232bo254bo551b3o32b3o254b2o$29813b2o289b3o806bo34b o255bo$29813bo293bo14bo795b2o265b2o17bobo$29814b3o289b2o12b3o796bo265b o19b2o$29816bo208b2o39bo52bo79b2o715b3o264bobo$30026bo25bo13b3o50b2o 78b2o715bo60b2o204b2o$30006b2o18bobo21b3o16bo295b2o610bo$30006b2o7b2o 10b2o20bo18b2o295bo609bobo246bo$30015bo33b2o67b2o88b2o136b2o15bobo609b 2o245b3o$28629b2o1254b2o126bobo83b2o17b2o88b2o136b2o15b2o594bo187b2o 72bo$28629b2o1254b2o126b2o4b2o78b2o233b2o623b3o186bo72b2o$29997b2o20bo 313bobo626bo182b3o$29998bo18bobo313bo627b2o182bo$29998bobo16b2o313b2o 643b2o181b2o$29999b2o206b2o17bo9bo740bo182bobo$30059b2o146bo18b3o5b3o 27bo710bobo11b2o171bo$30059b2o41b2o99b2o3b3o5b2o11bo3bo30b3o708b2o12bo 172b2o$30082b2o19bo99bobo4bo4bobo10b2o3b2o32bo14bo704bobo192b2o$30082b obo15b3o102bo9bo50b2o12b3o700b2o2b2o177b2o14b2o$30084bo15bo73b2o29b2o 7b2o63bo703b2o182bo22b2o$30072b2o10b2o19b2o66bobo103b2o883b3o23bo10b2o $30072bo33bo66bo4b2o165b2o670b2o145bo23bobo10b2o$30028b2o32b2o9b3o27b 3o66b2o5bo164bobo670b2o169b2o$30028b2o11b2o20bo11bo27bo72b3o99b2o64bo 637b2o168b2o$30041bo21bobo110bo82b2o17b2o63b2o637b2o4b2o162b2o$30005b 2o35b3o19b2o145b2o46b2o727b2o25b2o$30001b2o2b2o37bo136b2o28b2o802b2o 129bo$30000bobo179bo819b2o140b3o23b2o$30000bo23b2o153b3o821bo139bo17b 2o8bo$29999b2o23bo71b2o81bo823bobo72b2o48b2o13b2o16bo9bobo$30025b3o69b o906b2o46bo25bo23bo25bo30bobo10b2o42b2o$30027bo69bobo15b2o145b2o736b2o 50b3o21bobo23b3o21bobo30b2o55b2o$30098b2o15b2o125b2o19bo736b2o53bo20b 2o27bo20b2o$30222bo6b2o11bobo15b3o92b2o637b2o58b2o48b2o38bo$29844b2o 374b3o6b2o13bo15bo94b2o637bo149b3o$29822b2o20b2o373bo24b2o19b2o725bobo 90bo49bo11bo$29823bo395b2o45bo725b2o91b3o47b3o8b2o14bo$29812bo10bobo 437b3o822bo49bo22bobo$29810b3o11b2o437bo823b2o11b2o35b2o23bo$28639b2o 1153bo14bo1203b2o85b2o$28640bo1153b3o12b2o533b2o667b2o29b2o$28640bobo 1154bo547bo19b2o90b2o585b2o$28641b2o2b2o37bo1111b2o483b2o62bobo17bo91b 2o714b2o$28645b2o35b3o15bo9bo1546bo23bobo62b2o15bobo71bo735b2o14b2o$ 28681bo18b3o5b3o1405b2o139b3o23bo74bo4b2o60bo11b3o593bo131b2o22bo$ 28668b2o11b2o20bo3bo1089b2o317bobo141bo22b2o72bobo63b3o14bo591bobo122b 2o7bo23b3o$28668b2o32b2o3b2o1088b2o17b2o300bo140b2o14b2o80bobo47bo14bo 16b2o476b2o113b2o123bobo6bobo23bo$29816b2o300b2o155b2o69b2o10bo48b3o 12b2o493b2o122b2o32b2o48b2o32bo7b2o$30345bobo62bo563b2o15b2o48bo20b2o 11b2o35b2o11b2o23b2o7b2o$29854b2o489bo63b2o562bobo15b2o46bobo21bo49bo 36bo$29854b2o488b2o627bo65b2o19b3o47b3o38b3o$30359b2o611b2o32b2o52bo 49bo42bo$30359bo50b2o494b2o98b2o157b2o$29813b2o545b3o47b2o17b2o476bo 171b2o48b2o35bo$28639b2o52b2o1118bo19b2o290b2o235bo66b2o476bobo72bo97b o20b2o27bo22b2o11bobo$28638bobo16b2o34b2o1119b3o15bobo290bo782b2o72b3o 92b3o21bobo23b3o24bo12b2o$28638bo18bobo45b2o1109bo15bo273b2o15bobo341b 2o516bo91bo25bo23bo26bobo$28637b2o20bo44bo2bo1102b2o19b2o273b2o15b2o 342b2o515b2o117b2o50b2o2b2o$28653b2o4b2o44b2o4b2o1097bo1110b2o236b2o$ 28653bobo55bobo1097b3o462b2o643bobo$28655bo57bo1099bo462bobo147b2o495b o$28646b2o7b2o56b2o1563bo147bo19b2o475b2o$28646b2o20b2o33b2o1573b2o 147b3o15bobo712b2o$28669bo34bo1724bo15bo708b2o4b2o$28666b3o32b3o1719b 2o19b2o708b2o$28666bo34bo1721bo$29819b2o603b3o$28635bo1183bo606bo492b 2o95bo$28635b3o1162b2o15bobo1099bobo55b2o35b3o$28638bo1161b2o15b2o286b 2o814bo55b2o34bo$28637b2o1465bobo814b2o90b2o42b2o96b2o$30104bo161b2o 789bo96bobo$28701b2o1400b2o161b2o787bobo96bo$28701bo1730b2o548b2o67b2o 2b2o96b2o$28702b3o1727bo549b2o67b2o$28704bo1570b2o136b2o15bobo470b2o 73b2o$28657bo1617b2o136b2o15b2o470bobo73b2o$28655b3o1463b2o278b2o499bo $28654bo1466bobo276bobo498b2o119b2o$28654b2o1467bo276bo583b2o36b2o$ 30062bo60b2o274b2o190b2o391b2o13b2o$29799b2o261b3o209b2o17bo9bo273b2o 12b2o405bobo$29798bobo264bo208bo18b3o5b3o27bo246bo419bo$29798bo265b2o 204b2o3b3o5b2o11bo3bo30b3o244bobo416b2o10b2o$29797b2o260bo34bo175bobo 4bo4bobo10b2o3b2o32bo14bo214b2o13b2o429bo$30057b3o32b3o177bo9bo50b2o 12b3o214b2o345b2o94b3o9b2o36b2o$30056bo34bo149b2o29b2o7b2o63bo564b2o 94bo11bo19b2o16bobo$30056b2o33b2o20b2o125bobo103b2o669bobo18bobo18bo$ 30046b2o56b2o7b2o125bo4b2o165b2o144b2o358bo98b2o19bo20b2o$28634b2o 1411bo57bo133b2o5bo164bobo144b2o37b2o319b3o116b2o4b2o$28634b2o1361bo 49bobo55bobo135b3o99b2o64bo150b2o33b2o322bo120bobo$29997b3o48b2o4b2o 44b2o4b2o135bo82b2o17b2o63b2o150b2o356b2o120bo$30000bo23b2o27bo2bo44bo 20b2o154b2o46b2o572b2o139b2o7b2o$29809b2o188b2o23bo29b2o45bobo18bo125b 2o28b2o621bo148b2o$29809b2o211bobo41b2o34b2o16bobo126bo651bobo$29980bo 37b2o2b2o42b2o52b2o124b3o308b2o343b2o$29954bo9bo15b3o35b2o226bo310b2o 38bo246bo$29954b3o5b3o18bo612bobo243b3o$29957bo3bo20b2o11b2o332b2o266b o243bo74b2o$28649b2o38b2o1265b2o3b2o32b2o312b2o19bo510b2o73bobo$28649b 2o39bo1107b2o489bo6b2o11bobo15b3o92b2o402b2o90bo141b2o$28690bobo1106bo 19b2o6b2o458b3o6b2o13bo15bo94b2o403bo90b2o140bo$28691b2o2b2o37bo1064bo bo17bo7bobo456bo24b2o19b2o253b2o238bobo228bobo$28695b2o35b3o15bo9bo 1039b2o15bobo9bo222b2o3b2o32b2o193b2o45bo252bobo239b2o10bo217b2o$ 28731bo18b3o5b3o1051bo4b2o10b2o222bo3bo20b2o11b2o237b3o253bo252bobo$ 28718b2o11b2o20bo3bo1053bobo236b3o5b3o18bo250bo254b2o252bobo$28718b2o 32b2o3b2o1052bobo236bo9bo15b3o35b2o724bo4b2o$29800b2o10bo157b2o52b2o 50bo37b2o2b2o291b2o107bo43b2o262b2o15bobo$29799bobo168b2o34b2o16bobo 91bobo291bo19b2o86b3o42bo261bobo17bo65b2o125b2o$29799bo158b2o45bobo18b o68b2o23bo227b2o62bobo17bo90bo38b3o262bo19b2o64bo127bo$29798b2o157bo2b o44bo20b2o68bo23b2o202bo23bobo62b2o15bobo71bo17b2o38bo263b2o86b3o124bo bo$29813b2o137b2o4b2o44b2o4b2o81b3o228b3o23bo74bo4b2o60bo11b3o70b2o 337bo125b2o$29813bo137bobo55bobo81bo233bo22b2o72bobo63b3o14bo69bobo 271b2o$29814b3o134bo57bo316b2o14b2o80bobo47bo14bo16b2o71bo271bo$28689b 2o52b2o1071bo133b2o56b2o7b2o323b2o69b2o10bo48b3o12b2o88b2o268bobo$ 28688bobo16b2o34b2o1215b2o33b2o20b2o393bobo62bo371b2o46b2o$28688bo18bo bo45b2o1203bo34bo416bo63b2o359b2o57bobo$28687b2o20bo44bo2bo1203b3o32b 3o412b2o424b2o57bo$28703b2o4b2o44b2o4b2o1200bo34bo427b2o467b2o$28703bo bo55bobo15b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o765bo50b 2o$28705bo57bo16bo109bo109bo109bo109bo109bo109bo109bo109bo766b3o47b2o 17b2o$28696b2o7b2o56b2o15bobo107bobo107bobo107bobo107bobo107bobo107bob o107bobo107bobo766bo66b2o71b2o$28696b2o20b2o33b2o26b2o2b2o37bo66b2o2b 2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37b o66b2o2b2o37bo66b2o2b2o37bo864b2o$28719bo34bo30b2o35b3o15bo9bo44b2o35b 3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o 15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo803b2o507b2o 15b2o$28716b3o32b3o67bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b 3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o 803b2o27bo479b2o15bobo$28716bo34bo56b2o11b2o20bo3bo70b2o11b2o20bo3bo 70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo 70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo833b3o341b2o128b2o 25bo$28808b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o 32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o614b 2o215bo264b2o78b2o129bo25b2o$28685bo1657bobo147b2o65b2o264bo209bobo$ 28685b3o1657bo147bo19b2o65b2o244bobo83bo124b2o$28688bo1318bo337b2o147b 3o15bobo65bo246b2o83b3o$28687b2o1318b3o486bo15bo65bobo334bo90b2o$ 30010bo479b2o19b2o65b2o334b2o64bo25bo$28751b2o1256b2o479bo403b2o72bo 11b3o21bobo49bo$28751bo1739b3o401bo70b3o14bo20b2o48b3o$28752b3o24b2o 52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o 52b2o54b2o52b2o778bo70b2o329bobo52bo14bo16b2o39b2o28bo$28754bo23bobo 16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o 34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o 848bobo330b2o52b3o12b2o56b2o5b2o21b2o$28707bo70bo18bobo45b2o41bo18bobo 45b2o41bo18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o41bo 18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o836bo389bo76b2o$28705b3o69b2o 20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo 44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2b o834b2o388b2o$28704bo88b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b 2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o 44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o600b2o575b2o$28704b2o87bo bo55bobo49bobo55bobo49bobo55bobo49bobo55bobo49bobo55bobo49bobo55bobo 49bobo55bobo49bobo55bobo49bobo55bobo599b2o575bobo96b2o17b2o$28795bo57b o51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo765b 2o411bo40b2o55bo17b2o$28786b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b 2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b 2o7b2o56b2o764bo328b2o15b2o65b2o39b2o17b2o36bobo21b2o$28786b2o20b2o33b 2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b 2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o304b2o311b2o136b2o 15bobo328b2o15bobo124b2o37b2o21b2o22b2o$28809bo34bo74bo34bo74bo34bo74b o34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo304b2o311b2o136b2o15b2o 321b2o25bo210bo$28806b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o 72b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o744b2o97b2o252bo25b2o207bobo$ 28806bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74b o34bo745bobo98bo252bobo232b2o$30467bo97b3o254b2o$28775bo109bo109bo109b o109bo109bo109bo109bo109bo810b2o97bo$28775b3o107b3o107b3o107b3o107b3o 107b3o107b3o107b3o107b3o683b2o17bo9bo536b2o60b2o32b2o37b2o$28684b2o92b o109bo109bo109bo109bo109bo109bo109bo109bo682bo18b3o5b3o27bo508bo61bo 20b2o11b2o36bobo$28684b2o91b2o108b2o108b2o108b2o108b2o108b2o108b2o108b 2o108b2o678b2o3b3o5b2o11bo3bo30b3o440bo66b3o59b3o18bo49bo$30337bobo4bo 4bobo10b2o3b2o32bo14bo422b3o68bo61bo15b3o49b2o$28841b2o108b2o108b2o 108b2o108b2o108b2o108b2o108b2o108b2o291b2o323bo9bo50b2o12b3o421bo127b 2o20bo71b2o$28841bo109bo109bo109bo109bo109bo109bo109bo109bo292b2o292b 2o29b2o7b2o63bo424b2o20bo105bo94bo$28842b3o107b3o107b3o107b3o107b3o 107b3o107b3o107b3o107b3o582bobo103b2o156b2o271bo15b3o104b3o37b2o49b3o$ 28844bo109bo109bo109bo109bo109bo109bo109bo109bo582bo4b2o165b2o90b2o4b 2o263b3o18bo105bo38bo28b2o19bo$28797bo109bo109bo109bo109bo109bo109bo 109bo109bo628b2o5bo164bobo96b2o262bo20b2o11b2o128b3o29bo$28795b3o107b 3o107b3o107b3o107b3o107b3o107b3o107b3o107b3o632b3o99b2o64bo362b2o32b2o 128bo29bobo13b2o$28794bo109bo109bo109bo109bo109bo109bo109bo109bo635bo 82b2o17b2o63b2o556b2o14b2o$28699b2o93b2o108b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o669b2o46b2o555b2o$28699b2o1614b2o28b2o229b2o371bobo 23bo$30316bo255b2o2b2o371bo23b3o$30313b3o255bobo374b2o22bo$30313bo257b o12b2o258b2o37b2o21b2o48b2o14b2o$30570b2o11bobo239b2o17b2o36bobo21b2o 48b2o$30396b2o185bo241b2o55bo17b2o139b2o$30376b2o19bo184b2o297b2o17b2o 140bo$30356bo6b2o11bobo15b3o92b2o107b2o442bobo$30354b3o6b2o13bo15bo94b 2o107bo225b2o217b2o$28774b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o 108b2o697bo24b2o19b2o198b3o223bo76b2o$28774b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o108b2o697b2o45bo200bo220b3o12b2o56b2o5b2o130b2o$ 30397b3o184b2o236bo14bo16b2o39b2o121b2o14b2o$30397bo185bobo252b3o14bo 163bo22b2o18bo$30583bo256bo11b3o20b2o139b3o23bo17b3o$30478b2o102b2o60b o207bo22bo140bo23bobo16bo$30479bo19b2o141b3o231b3o161b2o17b2o$30415b2o 62bobo17bo141bo236bo76b2o$30391bo23bobo62b2o15bobo141b2o311bobo$30391b 3o23bo74bo4b2o113bo34bo306bo$28789b2o108b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o723bo22b2o72bobo118b3o32b3o303b2o$28789b2o108b2o108b 2o108b2o108b2o108b2o108b2o108b2o108b2o722b2o14b2o80bobo121bo34bo371b2o $30409b2o69b2o10bo99b2o20b2o33b2o372bo$30479bobo110b2o7b2o56b2o362bobo $30479bo121bo57bo364b2o$30478b2o119bobo55bobo311b2o$30493b2o104b2o4b2o 44b2o4b2o312bobo65b2o$30493bo89b2o20bo44bo2bo319bo65b2o$30494b3o87bo 18bobo45b2o320b2o$30496bo87bobo16b2o34b2o$30585b2o52b2o3$30944b2o$ 30410b2o506bo25bo$30410bobo505b3o21bobo18b2o$30412bo508bo20b2o10b2o7b 2o60b2o27b2o$30412b2o506b2o33bo69b2o14b2o11b2o$30614b2o32b2o3b2o12b2o 286bobo59b2o22bo$30614b2o11b2o20bo3bo13b2o232bo48b2o4b2o60bo23b3o$ 30627bo18b3o5b3o223b2o19b3o47bo20b2o44bobo23bo$30591b2o35b3o15bo9bo 223bobo21bo46bobo18bo46b2o$30587b2o2b2o37bo239bo11bo20b2o11b2o34b2o16b obo$30586bobo281b3o9b2o32b2o52b2o$30586bo23b2o44b2o215bo$30585b2o23bo 46bo202b2o10b2o$30400b2o209b3o43bobo201bo155b2o$30400b2o211bo44b2o201b obo154bo$30847b2o13b2o141b2o11bobo$30847b2o36b2o119bo12b2o$30409b2o 260b2o212b2o119bobo$30409b2o260bobo267b2o64b2o2b2o$29623b2o868b2o178bo 167b2o85b2o11b2o68b2o$29623b2o868bo179b2o166b2o86bo$30494b3o348b2o79b 3o35b2o$30496bo348b2o79bo37b2o2b2o$30408b2o17bo9bo530bobo41b2o$30408bo 18b3o5b3o27bo479b2o23bo35b2o4b2o$30404b2o3b3o5b2o11bo3bo30b3o408b2o39b 2o27bo23b2o34b2o$30404bobo4bo4bobo10b2o3b2o32bo14bo185b2o169b2o34bo40b obo23b3o$30406bo9bo50b2o12b3o185bobo168b2o35b3o39bo23bo$30375b2o29b2o 7b2o63bo190bo207bo39b2o$29608b2o764bobo103b2o189b2o$29608b2o764bo4b2o$ 30373b2o5bo626b2o$30377b3o99b2o525bobo$30377bo82b2o17b2o525bo$30412b2o 46b2o191b2o118bo231b2o$30382b2o28b2o238bobo118b3o$30383bo268bo123bo23b 2o$30380b3o268b2o122b2o23bo$30380bo417bobo46b2o$30756bo37b2o2b2o48bo$ 29628b2o833b2o265bo9bo15b3o35b2o49b3o$29628bo814b2o19bo265b3o5b3o18bo 85bo$29629b3o791bo6b2o11bobo15b3o269bo3bo20b2o11b2o160b2o$29631bo789b 3o6b2o13bo15bo270b2o3b2o32b2o96b2o62b2o5b2o$30420bo24b2o19b2o193b2o 172b2o32b2o69b2o$30420b2o45bo193b2o173bo65b2o$30464b3o369bobo15b2o46bo bo$30464bo203bo168b2o15b2o48bo33b2o$30668b3o233b2o32b2o$29611b2o1058bo 223b2o47b2o$29612bo1057b2o223bobo46b2o$29609b3o870b2o166b2o94b2o52b2o 94bo$29609bo848bo23bobo166bo94b2o34b2o16bobo$30458b3o23bo166bobo80b2o 45bobo18bo$29640bo34bo785bo22b2o166b2o79bo2bo44bo20b2o103b2o$29640b3o 32b3o782b2o14b2o116bo133b2o4b2o44b2o4b2o88b2o29b2o$29643bo34bo797b2o 114b3o132bobo55bobo88b2o$29620b2o20b2o33b2o912bo74b2o59bo57bo$29620b2o 7b2o56b2o902b2o73bobo57b2o56b2o7b2o$29629bo57bo888b2o90bo67b2o33b2o20b 2o60b2o$29627bobo55bobo889bo90b2o66bo34bo83bobo$29627b2o4b2o44b2o4b2o 890bobo157b3o32b3o82bo$29611b2o20bo44bo2bo896b2o10bo148bo34bo82b2o58b 2o$29612bo18bobo45b2o908bobo152b2o117b2o53bo$29612bobo16b2o34b2o920bob o153bo117b2o50b3o6b2o$29613b2o52b2o921bo4b2o145b3o122b2o46bo9bo$30578b 2o15bobo144bo60b2o61bobo56bobo$30577bobo17bo65b2o138bo62bo59b2o$30477b 2o98bo19b2o64bo137bobo61b2o68b2o$30477bobo96b2o86b3o134b2o75b2o55b2o$ 30479bo186bo184b2o25b2o$30479b2o120b2o242b2o4b2o$30601bo205b2o36b2o$ 29642b2o32b2o3b2o916bobo204bobo71b2o$29642b2o11b2o20bo3bo917b2o46b2o 134b2o21bo73b2o$29655bo18b3o5b3o902b2o57bobo135bo20b2o111b2o$29619b2o 35b3o15bo9bo902b2o57bo137bobo59b2o71bo$29615b2o2b2o37bo986b2o138b2o59b 2o2b2o67bobo$29614bobo1233bobo67b2o$29614bo1223b2o12bo$29613b2o852b2o 369bobo11b2o$30467b2o371bo$30840b2o$30824b2o$30476b2o177b2o168bo$ 30476b2o97b2o78b2o165b3o$30576bo245bo$30576bobo83bo175b2o76b2o$29647b 2o928b2o83b3o173bobo74bobo$29647bo1017bo120b2o15b2o35bo74bo$29648b3o 824b2o187b2o120b2o15bobo34b2o72b2o$29650bo824bo168b2o159bo118b2o17b2o$ 30471b2o3b3o166bo159b2o117b2o18bo$30471bobo4bo166bobo293b3o$30473bo 172b2o293bo$30442b2o29b2o$30441bobo490b2o$30441bo4b2o212b2o168b2o102b 2o$30399bo40b2o5bo212bobo136bo21b2o7b2o$30397b3o44b3o215bo134b3o22bo$ 30396bo47bo25b2o106b2o15b2o65b2o132bo25bobo$30396b2o53b2o17bobo105b2o 15bobo198b2o19b2o4b2o$30381b2o67bobo19bo97b2o25bo204bo15bo20b2o$30382b o67bo21b2o97bo25b2o201b3o15bobo18bo$30382bobo64b2o120bobo225bo19b2o16b obo84b2o$30383b2o10bo176b2o225b2o36b2o86bo$30394bobo528bobo$30394bobo 260b2o267b2o$30395bo4b2o255bo$30383b2o15bobo188bo66b3o$30382bobo17bo 65b2o119b3o68bo$30382bo19b2o64bo119bo213b2o$30381b2o86b3o116b2o20bo 172b2o17b2o120b2o$30471bo122bo15b3o170b2o140bo$30406b2o184b3o18bo298b 2o11bobo$30406bo184bo20b2o11b2o286bo12b2o$30404bobo184b2o32b2o155b2o 47b2o80bobo$30404b2o46b2o329bo47b2o2b2o77b2o2b2o$30392b2o57bobo326b3o 12b2o38bobo80b2o$30392b2o57bo328bo14bo16b2o23bo$30450b2o344b3o14bo23b 2o$29759bo1038bo11b3o$29759b3o832b2o37b2o21b2o152bo108b2o$29762bo812b 2o17b2o36bobo21b2o255b2o4b2o$29761b2o812b2o55bo17b2o261b2o$29776b2o 853b2o17b2o$29776bo$29774bobo683b2o112b2o$29763bo10b2o604b2o78b2o113bo 76b2o$29762bobo616bo190b3o12b2o56b2o5b2o$29762bobo616bobo83bo104bo14bo 16b2o39b2o267b2o$29757b2o4bo618b2o83b3o118b3o14bo307bobo$29756bobo15b 2o694bo119bo11b3o20b2o286bo$29756bo17bobo692b2o131bo22bo286b2o$29755b 2o19bo672b2o175b3o$29776b2o672bo177bo$30450bobo$30451b2o3$30465b2o$ 29765b2o698bobo$29765b2o700bo$30383b2o15b2o65b2o$30383b2o15bobo$30375b 2o25bo$30376bo25b2o$30376bobo$30377b2o2$30462b2o$29777b2o683bo$29777bo 618bo66b3o$29775bobo616b3o68bo$29775b2o616bo$30393b2o20bo$30399bo15b3o $30397b3o18bo$30396bo20b2o11b2o$30396b2o32b2o6$30399b2o37b2o21b2o$ 29757b2o15b2o604b2o17b2o36bobo21b2o$29756bobo15b2o604b2o55bo17b2o$ 29756bo25b2o652b2o17b2o$29755b2o25bo$29780bobo596b2o$29780b2o598bo76b 2o$30377b3o12b2o56b2o5b2o$30377bo14bo16b2o39b2o$30393b3o14bo$29762bo 632bo11b3o20b2o$29762b3o642bo22bo$29765bo665b3o$29743b2o19b2o667bo$ 29743bo15bo$29741bobo15b3o$29741b2o19bo$29761b2o3$29720b2o$29720b2o2$ 29758b2o$29758b2o17b2o$29777b2o3$29778b2o$29778bo$29765b2o12b3o$29748b 2o16bo14bo$29748bo14b3o$29749b3o11bo$29751bo$29730b2o$29730b2o113$ 29407b2o$29406bobo$29408bo564$28841b3o$28843bo$28842bo563$28276b2o$ 28275bobo$28277bo187$28087b3o$28089bo$28088bo186$27899b2o$27898bobo$ 27900bo752$27145b2o$27144bobo$27146bo375$26768b2o$26767bobo$26769bo 752$26014b2o$26013bobo$26015bo564$25448b3o$25450bo$25449bo375$25071b3o $25073bo$25072bo375$24694b3o$24696bo$24695bo375$24317b3o$24319bo$ 24318bo563$23752b2o$23751bobo$23753bo187$23563b3o$23565bo$23564bo563$ 22998b2o$22997bobo$22999bo187$22809b3o$22811bo$22810bo186$22621b2o$ 22620bobo$22622bo187$22432b3o$22434bo$22433bo186$22244b2o$22243bobo$ 22245bo752$21490b2o$21489bobo$21491bo187$21301b3o$21303bo$21302bo186$ 21113b2o$21112bobo$21114bo752$20359b2o$20358bobo$20360bo187$20170b3o$ 20172bo$20171bo563$19605b2o$19604bobo$19606bo187$19416b3o$19418bo$ 19417bo563$18851b2o$18850bobo$18852bo187$18662b3o$18664bo$18663bo186$ 18474b2o$18473bobo$18475bo187$18285b3o$18287bo$18286bo186$18097b2o$ 18096bobo$18098bo187$17908b3o$17910bo$17909bo752$17154b3o$17156bo$ 17155bo375$16777b3o$16779bo$16778bo375$16400b3o$16402bo$16401bo375$ 16023b3o$16025bo$16024bo375$15646b3o$15648bo$15647bo752$14892b3o$ 14894bo$14893bo186$14704b2o$14703bobo$14705bo187$14515b3o$14517bo$ 14516bo186$14327b2o$14326bobo$14328bo187$14138b3o$14140bo$14139bo186$ 13950b2o$13949bobo$13951bo187$13761b3o$13763bo$13762bo186$13573b2o$ 13572bobo$13574bo187$13384b3o$13386bo$13385bo186$13196b2o$13195bobo$ 13197bo187$13007b3o$13009bo$13008bo186$12819b2o$12818bobo$12820bo187$ 12630b3o$12632bo$12631bo752$11876b3o$11878bo$11877bo186$11688b2o$ 11687bobo$11689bo752$10934b2o$10933bobo$10935bo375$10557b2o$10556bobo$ 10558bo564$9991b3o$9993bo$9992bo186$9803b2o$9802bobo$9804bo187$9614b3o $9616bo$9615bo563$9049b2o$9048bobo$9050bo187$8860b3o$8862bo$8861bo186$ 8672b2o$8671bobo$8673bo187$8483b3o$8485bo$8484bo186$8295b2o$8294bobo$ 8296bo187$8106b3o$8108bo$8107bo186$7918b2o$7917bobo$7919bo187$7729b3o$ 7731bo$7730bo186$7541b2o$7540bobo$7542bo187$7352b3o$7354bo$7353bo752$ 6598b3o$6600bo$6599bo375$6221b3o$6223bo$6222bo375$5844b3o$5846bo$5845b o375$5467b3o$5469bo$5468bo752$4713b3o$4715bo$4714bo375$4336b3o$4338bo$ 4337bo375$3959b3o$3961bo$3960bo375$3582b3o$3584bo$3583bo375$3205b3o$ 3207bo$3206bo375$2828b3o$2830bo$2829bo563$2263b2o$2262bobo$2264bo187$ 2074b3o$2076bo$2075bo186$1886b2o$1885bobo$1887bo187$1697b3o$1699bo$ 1698bo186$1509b2o$1508bobo$1510bo187$1320b3o$1322bo$1321bo186$1132b2o$ 1131bobo$1133bo187$943b3o$945bo$944bo186$755b2o$754bobo$756bo187$566b 3o$568bo$567bo563$b2o$obo$2bo! golly-3.3-src/Patterns/Life/Signal-Circuitry/p46racetrack.rle0000644000175000017500000002432012026730263021061 00000000000000#C P46 based glider racetrack -- in reality a P6072 oscillator. #C #C *THE* glider starts about in the center, heading NE. Two 90-degree #C rotations get it going SW, where it enters a "dual kickback" delay. #C This uses two kickbacks with a p92 stream and a p46 stream to #C delay the glider a bit. I had to use a p92 for the second stream, #C since the escaping glider couldn't get out past a p46 stream. #C I guess this is my own invention, since I don't remember seeing #C this idea used anywhere else. The delay can be made as large as you #C want by shifting one of the guns and its corresponding eater. Just #C be careful to keep it in sync. #C #C After another 90 degree turn, it slips through a p46 stream and is #C reflected by a reaction due to Bill Gosper and Dean Hickerson. #C It's the reflection that leaves a pond behind, except a p8 blocker #C deletes the pond. Note that since 8 divides 6072 exactly, this p8 #C has no effect on the total period of the oscillator. #C #C Now it hits the stream, killing a glider, and when the hole gets #C down to a second stream, it allows a single glider to escape. This #C one then falls down a ladder of three 90 degree turns, and enters #C a glider-to-MWSS converter, found by I don't know whom. This seems #C to be based on two guns, one p23 and one p46 gun. #C #C The MWSS makes a long eastward trek, and hits a MWSS-to-glider #C reverse conversion, found by either David Buckingham or Dean #C Hickerson. I plagarised it from the p15 gun from Dean Hickerson, #C but in the comments he attributes part of it to David Buckingham. #C So I don't know who originally came up with this. This has to use #C a P92 gun to seed it, since the reaction takes so long that a p46 #C gun would send another glider in before the reaction was complete, #C causing all sorts of havoc. #C #C After another 90-degree turn, it enters a reaction that converts #C the single glider to a pair. I don't know who found this one. One #C glider hits a p46 stream, creating a hole, while the other passes #C through and does a 90-degree turn. The "hole" hits another stream, #C letting one escape, and now we're back to a pair of gliders, one #C going NW, the other NE. #C #C The next reaction is my own discovery; it's a P23 switchable LWSS #C gun, inspired by David Bell's P30 switchable gun. The NW glider #C turns it on, the NE one turns it off. You can delay these as needed #C to let as many LWSS escape as you want: in this instance it's only #C turned on long enough to allow a single LWSS to escape. #C #C The LWSS gets turned south by another p46 shuttle, and eventually #C gets converted back to a NW glider by yet another p46. The glider #C enters a reaction that reflects by converting to a block, and then #C converting the block. Dean Hickerson found this one. Lastly, it #C gets turned 90 degrees, and is back where it started from. #C #C David Goodenough, February 1995 x = 571, y = 383, rule = B3/S23 490boo12boobbo4boo$490boo12boboo6boobbo$505bo6bo6bo3bo$505b3o4bo11bo 12boo$520boobbo12boo$505b3o4bo9boo$505bo6bo3bo3b3o$490boo12boboo5boo$ 490boo12boobbo4bobbo3b3o$513bo8boo$520boobbo12boo$514boo8bo12boo$478bo 40bo3bo$474boobbo39bo$466boo5bo5bo13boo$466boo4boobbobo14boo$473boo3bo $474b3o24bo$487boo3boo7bobo$474b3o9bobbobobbo6boo$473boo3bo6bo9bo$355b oo5boo102boo4boobbobo5boo9boo$355boo5boo102boo5bo5bo5bo9bo$474boobbo7b obbobobbo$478bo8boo3boo$$496b3o$496bo$490bo6bo$489bo$489b3o$$156bo$ 157bo3bo194bo5bo157bo$148boobboo8bo192bobo3bobo121bo34boo$148boobbo5b oobbo191bo3bobo3bo118boo33bob3o11boo$152bobo5boo21bo3b3o164bo3bobo3bo 119boo15boo19boo10boo$153boo3b3o21bobobb5o3boo157bo9bo135bo7boo11boo$ 182bo3boo3boobboo290boo10bobboo4bobo10bo$153boo3b3o22bobbo3boo163boo5b oo123boo10bobbo5bo$152bobo5boo22b3o3bo106bobbo177bo20bobo19bo$148boobb o5boobbo124b3o7bo180bobo19boo19boo$148boobboo8bo21b3o3bo82boo11bo4bo9b o176boo42boo10boo$157bo3bo21bobbo3boo81boo10bo5bo8boo55bo3bo138boo16bo b3o11boo$156bo25bo3boo3boobboo89bo8bo66boo135bobo18boo$165bo16bobobb5o 3boo90boo8boo54boo3bobo3bo122boo10bobbo17bo$165bobo15bo3b3o168bobo3bo 107bobo12boo10bobboo$165boo120boo8boo62b3o108boo26bo$286bo8bo57bobbo 116bo27boo$273boo10bo5bo8boo53boo$273boo11bo4bo9bo$287b3o7bo169bo9bo$ 297bobbo165bo11boo$466b3o$$464boo11bobo$154bo310bo4b3o$153bo308b3o7bo 10bo$153b3o306bo8bo10boo$51boo429bobo$51boo$77bobobboo381bo$62boo12bo 3bob3o4boo374boo$50boo10boo13bo6boo3boo373bobo21boo$50boobo24b5obo403b obo$53bo27b3o404bo$53bo8bobo3bobo$50bobbo10bo3bo12b3o375boo$51boo7bo 11bo5b5obo57bo315bobo$59bo3bo5bo3bo3bo6boo3boo51bobo315bo33boo$60bo11b o3bo3bob3o4boo51boo280b4o65boo$64bo3bo8bobobboo339boobbo14boo51bo$62bo bo3bobo351boobbo15boo$412boo9bobbo26boo$395boo14booboo8boo28boo$395boo 15bobbo37bo45b3o$412bobbo8boo73bo$413boo8bobbo73bo32bo$240boo180boobbo 15boo89bobboo$131bo109bo171boo8boobbo14boo3b3o67boo13bo5bo$130bo110bob o168bobbo8b4o21bo56bo10boo14bobobboo7boo$130b3o109boo151boo15bobbo32bo 56boo26bo3boo6b5o$395boo14booboo89bobo27b3o6bo4bo14boo$412boo130bobb3o 14boo$442bo92b3o6boobbo$442boo89bo3boo7boo$430bo10bobo67boo4boo14bobo bboo$428bobo80bobo3boo13bo5bo7boo$202boo48bo176boo80bo21bobboo6boobbo$ 202bo48boo280bo10bobb3o14boo$200bobo48bobo182boo106bo4bo14boo$119bo80b oo233bobo107b5o$119bobo69boo244bo79boo28boo$119boo71boo322boo$167bo3bo 16b5o246boo7boo68bo11bo$155boo9bo5bo15b4o247boo6bobboo11boo64bo$155boo 9bo38b3o14boo214bobbo4b6o11boo64b3o$166boo3bo16b4o13bo3bo12boo215boobo 5b4o$168b3o17b5o12bo4bo228boobo79b3o$192boo12bo3bo311bo$168b3o10bobo7b oo70boo92boo80boobo80bo$166boo3bo10boo22bo3bo51boo86b3o4boo80boobo5b4o 59bo$108bo46boo9bo15bo22bo4bo53bo85b3o71b3o9boob3o4b6o11boo45boo8boo$ 107bo47boo9bo5bo32bo3bo12boo125bo3bo72bo9bobobo6bobboo11boo31boo11b3ob o5bobbo$107b3o57bo3bo33b3o14boo125booboo71bo11b4o7boo46boo10boo8boob3o $349bo3bo50bo3bo29boo69boo8boobo$193bo156bobo39boo9bo5bo100bo10bo$192b 3o155bobo39boo15bo$191bobo157bo52bo3boo100bo$188boo10boo203b3o15boo14b oo68boo23boo$190boboo6bobo89boo128boo15boo55boo10boo13boo9bobo$192b3o 7bo72bo16bobo7boo101b3o15b5o68boo11b3obo9boo9bo$192b3o7boo70boo18bo7b oo100bo3boo14b4o82boo$265boo7bobo15b3o57booboo35boo15bo101bo$96bo115b oo41boo7bobo84bo5bo34boo9bo5bo14b4o122b3o14boo$96bobo113boo41boo6boobo 137bo3bo14b5o122bo3bo12boo$96boo166boo84bo7bo63boo15boo96bo12bo4bo$ 265bo26b3o55bobbobobbo64boo14boo79boo15boo12bo3bo$294bo7boo46b3o3b3o 161boo16boo$265bo26bobo7boo229boobboo12bo3bo$264boo26boo256bo4bo$36bo 218boo6boobo283bo3bo12boo$35boo218boo7bobo283b3o14boo$34b3obo9boo154bo bo58boo266boobboo$bbobbo27boo13boo155boo313boo16boo$5bo7b3o18boo49bo 119bo314boo15boo$bo9bo4bo18bo48bo452bo$boo8bo5bo66b3o263boo5boo$7bo8bo 18bo314boo5boo$4boo8boo18boo$33boo13boo$4boo8boo18b3obo9boo$7bo8bo18b oo$boo8bo5bo18bo$bo9bo4bo$5bo7b3o17bo$bbobbo28bo$32b3o38bo$73bobo439b oo$73boo146boo188boo5boo95bobo$221bobo187boo5boo84b3o8bo$223bo282bo$ 223boo280bo3$412bo5bo$411b3o3b3o$45bo364bobbooboobbo$43bobo16bo347bo3b obo3bo$44boo15bo350bobobobo$61b3o164bo297b3o$229bo3bo175booboo3booboo 71boo31bo$220boobboo8bo176bo7bo72bobo32bo$220boobbo5boobbo259bo$224bob o5boo$225boo3b3o$$225boo3b3o185bo$224bobo5boo183b3o$220boobbo5boobbo 12boo167bo3bo$220boobboo8bo12boo166bo5bo$229bo3bo181bo5bo116boo$228bo 187bo3bo117bobo$481b3o54bo18boo7b4o$416bo3bo62bo72bobbo6bo3bo$415bo5bo 60bo41boo29boobbo10bo$411boobbo5bo101b4o7boo20bobbo4boboobo$411boo3bo 3bo101bobobo6bobboo19bo6b3o$417b3o102boob3o4b6o$286bo131bo106boobo5b4o 19bo6b3o$286boo237boobo27bobbo4boboobo$285bobo267boobbo10bo$525boobo 27bobbo6bo3bo$525boobo5b4o19boo7b4o$470boo50boob3o4b6o$469bobo50bobobo 6bobboo$471bo51b4o7boo$166bo357boo$149boo15boo8boo$149boo16boo7boo89b oo$162boobboo99boo4b3o$273b3o$272bo3bo$272booboo$162boobboo104bo3bo$ 149boo16boo7boo95bobo$149boo15boo8boo95bobo182b3o$166bo107bo185bo$459b o4$269booboo$268bo5bo$$267bo7bo$267bobbobobbo$267b3o3b3o171boo$446bobo $448bo32boo5boo$481boo5boo4$129bo$124bo3bo$109boo12bo8boobboo129boo5b oo$109boo12bobboo5bobboo129boo5boo$124boo5bobo$125b3o3boo302b3o$405bo bbo28bo$125b3o3boo275bo7b3o17bo$124boo5bobo270bo9bo4bo$123bobboo5bobb oo266boo8bo5bo18bo41bo7bo$123bo8boobboo272bo8bo18boo40bobo5bobo$124bo 3bo278boo8boo18b3obo9boo30bo3bo$129bo306boo13boo27bobbo3bobbo$407boo8b oo18boo42bobo3bobo$410bo8bo18bo44booboo$404boo8bo5bo59booboobooboo$ 404bo9bo4bo18bo41boobbobobboo$408bo7b3o18boo42b3o3b3o$405bobbo27boo13b oo29bo5bo$437b3obo9boo$438boo$439bo50bo5bo$489b3o3b3o$488boobbobobboo$ 488booboobooboo$491booboo$489bobo3bobo$488bobbo3bobbo$491bo3bo$488bobo 5bobo$489bo7bo9$62bo$57bo3bo359boo5boo$42boo12bo8boobboo350boo5boo$42b oo12bobboo5bobboo$57boo5bobo422boo5boo$58b3o3boo423boo5boo$$58b3o3boo 356bo5bo$57boo5bobo354b3o3b3o$42boo12bobboo5bo353bobbooboobbo$42boo12b o8boo353bo3bobo3bo$57bo3bo360bobobobo$62bo$419booboo3booboo$421bo7bo5$ 428bo$427b3o$426bo3bo$425bo5bo$425bo5bo$426bo3bo$$426bo3bo$425bo5bo$ 361boo58boobbo5bo$361boo58boo3bo3bo$427b3o$428bo8$129bo$124bo3bo$109b oo12bo8boobboo$109boo12bobboo5bobboo223boo5boo$124boo5bobo227bobooboob o$27b3o3bo91b3o3boo229bobobobo$25b5obbobo12boo313bobobobo$24boo3boo3bo 12boo76b3o3boo228bo7bo$19boobobboo3bobbo90boo5bobo$oo12b3obboobbobbo3b 3o90bobboo5bobboo$oo13boo6bo99bo8boobboo$16b3o3boobbo3b3o91bo3bo234boo boo$17bo3bo3boo3bobbo95bo231bobbobobbo$24boo3boo3bo12boo312b3o3b3o$17b o3bo3b5obbobo12boo313bo5bo$16b3o3boo3b3o3bo$oo13boo6bo337boo5boo$oo12b 3obboobbo337boo5boo$19boobo$60b4o$44boo14bobboo6boo$44boo15bobboo5boo$ 36bo24bobbo$37bo24boo$35b3o8bo3bo$45bobobobo10boo$43boobbobobboo7bobbo $43boo7boo7bobboo5boo$43boobbobobboo6bobboo6boo$45bobobobo8b4o$46bo3bo $$40boo$39bobo468boo$41bo6bo461bo$46bobo459bobo$47boo459boo4$18boo32bo bo$16boobbo32boo446boo$16b6o31bo446bobo$16b4o15b3o464bo$28b3obbo4bo11b oo$30bobbo5bo10boo7bo$29bo8bo21bo$16b4o16boo20b3o$3boo11b6o$3boo11boo bbo15boo$18boo18bo$33bo5bo10boo$26boo5bo4bo11boo$35b3o3$55b3o$57bo11b oo$56bo12bo$70b3o$72bo$$39boobo$20boo12b3obboobbo$20boo13boo6bo434boo$ 36b3o3boo3b3o3bo423bobo$37bo3bo3b5obbobo12boo410bo$44boo3boo3bo12boo$ 37bo3bo3boo3bobbo$36b3o3boobbo3b3o$20boo13boo6bo$20boo12b3obboobbobbo 3b3o$39boobobboo3bobbo$44boo3boo3bo12boo417boo$45b5obbobo12boo417boo$ 47b3o3bo$476boo$464booboo7bo$463bo3bobo4bobo$463b3obo6boo$466boo$467b oo$483bo$444bo37bobbo$443boo36b5o10boo$429boo11b3obo33boob3o10boo$429b oo10boo19boo17boboo$442boo11boo7bo17boo$443bo10bobo4boobbo$456bo5bobbo 16boo$443bo19bobo15boboo$442boo19boo15boob3o10boo$429boo10boo38b5o10b oo$429boo11b3obo16boo17bobbo$443boo18bobo17bo$444bo17bobbo$461boobbo$ 464bo9boo$462boo10bobo$476bo$476boo! golly-3.3-src/Patterns/Life/Oscillators/0000755000175000017500000000000013543257426015263 500000000000000golly-3.3-src/Patterns/Life/Oscillators/phase-shift.rle0000644000175000017500000005416713307733370020132 00000000000000#C It is a fundamental challenge of oscillator construction to build #C high periods from lower periods. One way to do this is to #C periodically shift the phase of an oscillator. In the most famous #C case, a period-7 oscillator can be delayed by one generation using #C a single spark. This allows the construction of oscillators of #C periods 7n+1, so for example, a period-8 oscillator can be built #C using a suitable p4 spark. #C This pattern shows the possible periods (up to 50) achievable with #C different phase-shifting reactions. The oscillator being shifted #C is included at the top of each column. Periods marked with a tub #C cannot be built with lower-period components. #C A small number of miscellaneous phase-shift reactions are included #C at the bottom of the pattern. #C Updated 1 May 2018. x = 839, y = 497, rule = B3/S23 12bob2o33b2obo69b2obo33b2obo59bob2o31b2o63bob2o31b2o73b2obo31b2o63b2ob o33b2obo49b2obo31b2o46b2o5b2obo33b2obo42b2o5b2obo31b2o$12b2obo33bob2o 69bob2o33bob2o59b2obo32bo63b2obo32bo73bob2o32bo63bob2o33bob2o49bob2o 32bo47bo5bob2o33bob2o43bo5bob2o32bo$10b2o41b2o65b2o35b2o4b2o61b2o29bo 68b2o29bo72b2o4b2o29bo62b2o4b2o35b2o45b2o4b2o29bo47bo4b2o4b2o35b2o40bo 4b2o4b2o29bo$11bo26bo14bo66bo27bo8bo5bo63bo29b2o68bo20bo8b2o71bo5bo21b o8b2o61bo5bo21bo14bo46bo5bo21bo8b2o46b2o3bo5bo36bo41b2o3bo5bo21bo8b2o$ 10bo10bo2b2o11bobo14bo66bo9bo2b2o11bobo8bo5bo61bo4bo2b2o90bo4bo2b2o11b obo81bo5bo3bo2b2o11bobo71bo5bo3bo2b2o11bobo14bo46bo5bo3bo2b2o11bobo61b o5bo3bo2b2o28bo46bo5bo3bo2b2o11bobo$10b2o9b4o2bo9bobo13b2o65b2o9b4o2bo 9bobo7b2o4b2o61b2o3b4o2bo19b2o67b2o3b4o2bo9bobo7b2o71b2o4b2o3b4o2bo9bo bo7b2o61b2o4b2o3b4o2bo9bobo13b2o45b2o4b2o3b4o2bo9bobo7b2o46b2o3b2o4b2o 3b4o2bo25b2o40b2o3b2o4b2o3b4o2bo9bobo7b2o$12bob2o10b2o7b3ob3o7b2obo69b 2obo10b2o7b3ob3o7b2obo61b2o10b2o7bob2ob2o6bo65b2o10b2o7b3ob3o6bo73b2ob o10b2o7b3ob3o6bo63b2obo10b2o7b3ob3o7b2obo49b2obo10b2o7b3ob3o6bo47bo3bo 5bo9b2o7bob2ob2o7b2obo43bo3bo5bo9b2o7b3ob3o6bo$12b2obo5b2o5b2o4bo7bo6b ob2o69bob2o5b2o5b2o4bo7bo6bob2o62bo5b2o5b2o5b2ob2obo5bo67bo5b2o5b2o4bo 7bo4bo74bob2o5b2o5b2o4bo7bo4bo64bob2o5b2o5b2o4bo7bo6bob2o49bob2o5b2o5b 2o4bo7bo4bo47bo5bo5bo3b2o5b2o5b2ob2obo7bob2o42bo5bo5bo3b2o5b2o4bo7bo4b o$16b2o4bo5bo6b3ob3o5b2o71b2o4b2o4bo5bo6b3ob3o5b2o4b2o59bo7bo5bo18b2o 65bo7bo5bo6b3ob3o5b2o71b2o4b2o4bo5bo6b3ob3o5b2o61b2o4b2o4bo5bo6b3ob3o 5b2o57b2o4bo5bo6b3ob3o5b2o46b2o3b2o4b2o4bo5bo18b2o46b2o3b2o4b2o4bo5bo 6b3ob3o5b2o$17bo3bo7bo7bobo7bo72bo5bo4bo7bo7bobo7bo5bo60b2o5bo7bo84b2o 5bo7bo7bobo80bo5bo4bo7bo7bobo70bo5bo4bo7bo7bobo7bo58bo4bo7bo7bobo60bo 5bo4bo7bo17bo52bo5bo4bo7bo7bobo$16bo4b2o5b2o7bobo8bo72bo5bo3b2o5b2o7bo bo8bo5bo57b2o7b2o5b2o17b2o63b2o7b2o5b2o7bobo7b2o72bo5bo3b2o5b2o7bobo7b 2o62bo5bo3b2o5b2o7bobo8bo58bo3b2o5b2o7bobo7b2o46b2o4bo5bo3b2o5b2o18bo 46b2o4bo5bo3b2o5b2o7bobo7b2o$16b2o4bo5bo9bo8b2o71b2o4b2o4bo5bo9bo8b2o 4b2o58bo8bo5bo19bo64bo8bo5bo9bo9bo71b2o4b2o4bo5bo9bo9bo61b2o4b2o4bo5bo 9bo8b2o57b2o4bo5bo9bo9bo47bo3b2o4b2o4bo5bo18b2o47bo3b2o4b2o4bo5bo9bo9b o$12bob2o5bo7bo19b2obo69b2obo5bo7bo19b2obo59bo8bo7bo17bo64bo8bo7bo17bo 74b2obo5bo7bo17bo64b2obo5bo7bo19b2obo49b2obo5bo7bo17bo47bo6b2obo5bo7bo 19b2obo42bo6b2obo5bo7bo17bo$12b2obo5b2o5b2o19bob2o69bob2o5b2o5b2o19bob 2o59b2o7b2o5b2o17b2o63b2o7b2o5b2o17b2o73bob2o5b2o5b2o17b2o63bob2o5b2o 5b2o19bob2o49bob2o5b2o5b2o17b2o46b2o5bob2o5b2o5b2o19bob2o42b2o5bob2o5b 2o5b2o17b2o7$648bo$647bobo$646bobobo$643bo2bo3bo84b2o88b2o$43b2o300bo 296bobob2ob2ob2o81bo89bo$38b2obo2bo300b3o295bo2bo3bob2o82bo89bo$38b2ob 2obob2o200b2o98bo108b2o97b2o88bo3bo82b3obo85b3obo$42bobob2o94b2o104b2o 97b2o108b2o97b2o86bobobob6o76bo4bo84bo4bo$36b6ob2o98bo500b2obobo3bo2bo 74bobobobobo81bob5obo$36bo3bo3bob2o94bo103b6o98b2o103b6o93b6o87bo2bo4b obo73bobo4bobo80bo6bobo$38b2o5b2o94bob3o99bo4bobo201bo3bo2bo91bo3bo2bo 86b3o3bo2bo71b2obobo2b2o2bo77b2obo2bob2o2bo$37b2obo3bo3bo92bo4bo99b4o 2bo95bobo102bobo4bobo89bobo4bobo88b6o72b2obobo3bobo78b2obo3bobobo$40b 2ob6o89b2ob2o2b2o101bo3bob2o90b3obo103bo3bo2bo91bo3bo2bo88bo82b2obo2bo 83b2obo2bo$37b2obobo95bobo3bobob2o100bobo2bo89bo4bo2bo101b6o93b6o89b2o 2bo80bob2o86bob2o$37b2obob2ob2o94b4obob2o99b2ob2o92b3obob2o298bobo79bo 89bo$40bo2bob2o98bo202bobo106b2o97b2o95bo79b2o88b2o$40b2o101bo205b2o 106b2o97b2o$143b2o6$735b2o$731b2obo2bo$730bobob2obo$39b2o600b2o2b2o82b o2bo4bob2o2bo$38bob3o508b2o88bo3bobo81bobobobobo2b4o$36b3o4bo507bobo 84b2obobobobo2b2o76b2obobo4bo$35bo3b4o2b2o304b2o200bo84bo2bobo3bobobo 79bobo2b2ob3o$12bob2o6bo12b4obo2b2o2bob2o65b2o3b2o3b2o17bo76b2obo96b2o bo24bo2bo78b2obo21b2o66b2o5b2obo13b4ob2o59b2o5b2obo13b2o3bo2bobo62b2ob o15bobo3bo4bo57b2o4b2o4bo12b2o$12b2obo5bobo14bo3bo2bobobobo65bo3b2o3b 2o15b5o6b2o66bob2o96bob2o19bo4bobobo77bob2o21b2o67bo5bob2o13bo4bo61bo 5bob2o15b3ob2obobo61bob2o16b2obob2o2b2o58bo5bo3bobo7b2obo2bo$16b2o4bo 12b3o2bo2bobobobobo64bo25bo5bob2o2bobo63b2o98b2o4b2o17b3o3bo2bo75b2o4b 2o87bo4b2o4b2o13b2obo2bo57bo4b2o4b2o13bo2bobo3bo59b2o4b2o16b2obobo60bo 5bo5bo7bobob2obo$17bo16bo3b5obobob2ob2o63b2o3b2o3b2o13bob3o2bobobobo2b o2b2o58bo28b2o2bo66bo5bo21bo6bo74bo5bo18b6o4b2o58b2o3bo5bo16bob3o57b2o 3bo5bo17bob2ob2ob2o56bo5bo13b3o3bo3b3o57b2o4b2o11bo2bo4bob2o2bo$16bo 17bob2o4bobobo3bo2bo67bobobobo13bo4bobo4bobobo2bo60bo28b4o67bo5bo19b2o 3bobo76bo5bo16bo3bo2bo2bobo64bo5bo11b3o2bo66bo5bo15b2obo3bob2o57bo5bo 12bo2b2o3b2o3bo75bobob5o2b4o$16b2o17bo2b4ob2ob2ob2ob2o62b2o5bobo12b2ob 2o2b2o2b4o2bob2obo59b2o26bo71b2o4b2o102b2o4b2o15bobo4bo3bo60b2o3b2o4b 2o11bo4b6o55b2o3b2o4b2o16bobo3bo6b2o51b2o4b2o15bob3o3bo2bo55b2o4b2o10b 2obo6bo$14b2o17bobobo2bo3bobo3bobo64bo4b2obo12bobo3bobo2b2ob2obobo2b2o 60b2obo20b6o70b2obo24b2o80b2obo18bo3bo2b3ob4o57bo3bo5bo13b4o3bo2bo3b2o 50bo3bo5bo17bobobob6o2bo53b2obo19bo3b5o57bo5bo13bo2bob2ob3o$15bo16bobo bob2o5b2obobobo63bo9b2o13b4ob2o2bo2bob2o2bo2bo59bob2o19bo4bobo69bob2o 106bob2o19b6o4bo2bo56bo5bo5bo10bobo3bo4bo3bobo49bo5bo5bo17bobobo3bo2b 2o54bob2o17bo2b2o62bo5bo14bo3bo3bo2bo$14bo17bobo3bobo3bo2bobobo64b2o9b o17bo2bobo2bobo4b2o58b2o4b2o18b4o2bo67b2o4b2o20bobo85b2o22bo2bo61b2o3b 2o4b2o10b2o3bo3bo2b4o51b2o3b2o4b2o19bo2bo4bo54b2o4b2o14bob2o4b2o58b2o 4b2o14b2obo3bobobo$14b2o15b2ob2ob2ob2ob4o2bo76bo16bobob2obobo2b5o60bo 5bo21bo3bob2o64bo5bo19b3obo85bo20b4o2bo66bo5bo17b6o4bo55bo5bo20b3o3bo 2b4o50bo5bo16bo2b4o2bo81bob4obobo$12b2o17bo2bo3bobobo4b2obo65b2o8b2o 15b2o2bo2bo2b2o4bo61bo5bo22bobo2bo65bo5bo17bo4bo2bo83bo18bo2bo2b2obob 2o56b2o4bo5bo21bo2b3o50b2o4bo5bo22b6o4bo50bo5bo16bobo2b4o57b2o4b2o16bo 6bob2o$13bo18b2ob2obobob5o3bo66bo9bo19bo2bo3bob3o61b2o4b2o21b2ob2o66b 2o4b2o18b3obob2o82b2o19bo5bob2obo57bo3b2o4b2o18b3obo55bo3b2o4b2o21bo5b o2b3o49b2o4b2o15b2o2b2o62bo5bo15b2ob4obo$12bo20bobobobobo2bo2b3o66bo9b o21b2o4bobo65b2obo96b2obo22bobo81b2obo22b5o62bo6b2obo20bo2bob2o52bo6b 2obo24b5obo55b2obo19b3obo2b3o55bo5bo19bo2bobo$12b2o19bobobobo2bo3bo69b 2o8b2o27bo66bob2o96bob2o23b2o81bob2o24bo64b2o5bob2o23bo4bo50b2o5bob2o 26bo2bob2o53bob2o16bobo4bobo2bo55b2o4b2o18bo2bob2o$34b2obo2b2o2bob4o 508b2ob4o90bo4bo71b2obo5bobo83b2o$38b2o2b4o3bo510bo93b2ob4o74bob2ob2ob 2o$41bo4b3o511bobo93bo78bo2b2o4bo$42b3obo514b2o93bobo77b2o2b4o$44b2o 611b2o79bo2bo$738b2o6$457bo$40bo415bobo$40b3o414bo2b2o91bo181b2o$43bo 417bo90bobo180bo$38b5o2bo197bob2o3b2o102b2o99b6o90bobobo180bo$6b2o4b2o bo21bo2bo2b3o66b2obo6b2obo92b2o2b2obo6bo10b2obo4bo63b2o5bob2o28bo72b2o 3bob2o6bo11bo3bo2b3o61b2o5b2obo15bobob3o57b2o5b2obo6bo72b2o5b2obo17b3o bob2o56b2obo5b2o17b2o$7bo4bob2o20bobo3bo5bo63bob2o6bob2o93bo2bob2o5bob o7b2o3bob3o65bo5b2obo30bo71bo3b2obo5bobo10b2o4bo3bob2o58bo5bob2o12b2ob o6bo57bo5bob2o5bobo72bo5bob2o16bo4bobo57bob2o6bo13b2obo2bo$6bo9b2o19bo 2bo2bo3bobo66b2o2b2o4b2o90bo7b2o4bo7bo2b2obobo66bo4b2o30b4obo69bo8b2o 4bo15bo2bo2bobobo56bo4b2o4b2o10bobobobobobo56bo4b2o4b2o4bo72bo4b2o4b2o 13bobobobo3bo59b2o3bo13bobob2obo$6b2o8bo21b5obobobobo65bo3bo5bo91b2o6b o14bobo2bo68b2o4bo23bo5bo4bo70b2o8bo16b7obobo3bo2bo53b2o3bo5bo13bo2b2o b2o57b2o3bo5bo78b2o3bo5bo14bobo4b4o59bo4b2o11bo2bo4bob2o2bo$17bo16b2o 6bobobo3bo66bo3bo5bo99bo12b2o2b2o74bo24b3o3bo2b2o80bo16bo6bobobo3bobob o58bo5bo11bobobo67bo5bo83bo5bo10b2obobo2b2o4b2o58bo16bobob5o2b4o$6b2o 8b2o17bo2b4ob2ob2ob2ob2o62b2o2b2o4b2o90b2o6b2o14bobobo2b2o2bo61b2o3b2o 26bo6bo71b2o7b2o15bo2b4ob2ob2ob2o2bo53b2o3b2o4b2o12bo2b7o55b2o3b2o4b2o 77b2o3b2o4b2o10b2obobo3bob2o3bo56b2o3b2o10b2obo6bo$7bo4b2obo17bobobo2b o3bobo3bobo59b2obo4bo5bo92bo2b2obo16bo2bo4b4o62bo5bob2o21b2o3bo3b2o70b o5b2o14b2obobo2bo3bobo3bo57bo5b2obo15b2o4bo2bo55bo5b2obo80bo5b2obo16b 2obob3ob2o2bo51b2obo6bo13bo2bob2ob2ob2o$6bo5bob2o16bobobob2o5b2obobobo 59bob2o5bo5bo90bo3bob2o17b2o3bo66bo6b2obo28b2ob3o67bo7bo14bobobob2o5b 2obobobo54bo6bob2o17b2o4b2o54bo6bob2o79bo6bob2o18b2obo5b2o52bob2o5bo 14bo3bobobob2obo$6b2o2b2o20bobo3bobo3bo2bobobo58b2o8b2o4b2o90b2o6b2o 17b7o63b2o9b2o22b2o3bo4bo66b2o5bo17bo3bobo3bo2bobob2o54b2o3b2o4b2o15bo 3bo3b2o52b2o9b2o77b2o3b2o4b2o12b3o3bo2b4o52b2o9b2o14b2obob2o6bo$10bo 20b2ob2ob2ob2ob4o2bo60bo9bo5bo99bo18bo4bobo74bo27bob3o74b2o13bo2b2ob2o b2ob4o2bo62bo5bo17b7o2bo62bo83bo5bo13bo2b3o7b2o50bo28bobo2b2ob3o$6b2o 3bo22bo3bobobo6b2o60bo9bo5bo90b2o7bo18b4o2bo62b2o9bo21bobo5b2o69b2o3b 2o14bobobo3bobobo6bo57b2o4bo5bo21bo2bobo50b2o10bo77b2o4bo5bo15bo2b4ob 2o2bo50bo9b2o16bobo3bobo$7bo2b2o22bobobobob5o63b2o8b2o4b2o91bo6b2o20bo 3bob2o60bo9b2o18b3obo77bo4bo15bo2bo3bobob7o59bo3b2o4b2o18b3o4bo52bo9b 2o78bo3b2o4b2o17bo4bobobo50b2o10bo15b2obobo$6bo5b2obo19bobo3bo2bo2bo 64b2obo6b2obo92bo3b2obo24bobo2bo59bo6bob2o19bo4bo2bo73bo4bo19bobobo2bo 2bo62bo6b2obo19bobobobobobo49bo6b2obo79bo6b2obo18b2ob2o3bob2o51b2obo5b o20bobo$6b2o4bob2o20bo5bo3bobo63bob2o6bob2o92b2o2bob2o23b2ob2o61b2o5b 2obo20b3obob2o73b2o3b2o19b2obo3bo4b2o58b2o5bob2o19bo3b2obob2o49b2o5bob 2o79b2o5bob2o21bo2bobo54bob2o5b2o20b2o2bo$39b3o2bo2bo300bobo106b3o2bo 3bo89b3obobo174bob2obo87b3o$39bo2b5o302b2o109b6o92bobobo175bo2bo86b2o$ 41bo417bo99bobo177b2o86bo2bo$42b3o414b2o2bo96bo267b2o$44bo417bobo$463b o5$644b2o$39bo603bo2bo$38bobo603b2o$39bo2b2o323bo273b3o$43bo201b2o10bo 107bo2bo272bo2b2o$37b6o202bobo5bob3o90b2o7bo6bo5bo273bobo$7b2o3bob2o6b o13bo3bo2b3o66b2obo6b2obo6bo79b2obo6b2obo21bo2bo2b2o9bo47b2obo6b2obo 23bo6bobo4bo6bo51b2obo6bob2o6bo79b2obo6b2obo76b2obo6b2obo12b2o5bobo54b 2obo6b2obo6bo74b2obo5b2o4bo$8bo3b2obo5bobo12b2o4bo3bob2o62bob2o6bob2o 5bobo78bob2o6bob2o17b4o3b3o3b2o4b3o47bob2o6bob2o23bobo11bo2bo55bob2o6b 2obo5bobo78bob2o6bob2o76bob2o6bob2o12bo2bobo3bo54bob2o6bob2o5bobo73bob 2o6bo3bobo$7bo8b2o4bo17bo2bo2bobobo65b2o2b2o10bo83b2o2b2o4b2o14bo4b3o 3b3obo3bo5bob2o45b2o8b2o22b2o3bo2bo3bobo61b2o2b2o10bo83b2o2b2o84b2o2b 2o4b2o11b3ob2o2bobo56b2o2b2o4b2o4bo78b2o3bo5bo$7b2o8bo18b7obobo3bo2bo 62bo3bo95bo3bo5bo12bo2bobobo4b2o2bo6bo4b2obo45bo9bo28b2o3bobo2b2ob2o 56bo4bo94bo3bo85bo3bo5bo18b2obobo55bo3bo5bo84bo4b2o$16bo18bo6bobobo3bo bobo62bo3bo95bo3bo5bo11b3o2bobob3o2b3o4bobo2b2o50bo9bo25b2ob2o2bobo3b 2o59bo2bo96bo3bo85bo3bo5bo13b2obobo3bo56bo3bo5bo84bo$7b2o7b2o17bo2b4ob 2ob2ob2o2bo62b2o2b2o94b2o2b2o4b2o14b2o2bobo2bobob2o5bobo3b2o46b2o8b2o 17bo12bobo3bo2bo3b2o53b2o2b2o94b2o2b2o84b2o2b2o4b2o13bob2ob2ob2ob2o52b 2o2b2o4b2o83b2o3b2o$8bo5b2o16b2obobo2bo3bobo3bo61b2obo6b2obo86b2obo4bo 5bo14bo2bobo4bo2b2o2b2obobob3ob3o40b2obo6b2obo19b3o8bo2bo11bobo48b2obo 6bob2o86b2obo6b2obo76b2obo6b2obo20bo3bob2o48b2obo6b2obo81b2obo6bo$7bo 7bo16bobobob2o5b2obobobo59bob2o6bob2o86bob2o5bo5bo14b3obo3b2o2bo4b2o2b o8bo39bob2o6bob2o22bo3bo6bo4bobo6bo48bob2o6b2obo86bob2o6bob2o76bob2o6b ob2o20bo3bo51bob2o6bob2o81bob2o5bo$7b2o5bo19bo3bobo3bo2bobob2o57b2o8b 2o4b2o82b2o8b2o4b2o17bo2bo5bo2bob2ob2o2b7o37b2o8b2o25b2o3bo5bo6bo7b2o 45b2o14b2o82b2o8b2o4b2o72b2o8b2o4b2o16bobobob6o44b2o8b2o4b2o83b2o3b2o$ 14b2o15bo2b2ob2ob2ob4o2bo60bo9bo5bo83bo9bo5bo15b2o2b6o3b2o3bo2b2ob2o 42bo9bo33bo2bo62bo16bo82bo9bo5bo73bo9bo5bo17b2obobo3bo2bo43bo9bo5bo84b o$7b2o3b2o16bobobo3bobobo6bo61bo9bo5bo83bo9bo5bo14bo7bobo4bobo2b2o4b3o 40bo9bo28b2o3bo65bo14bo84bo9bo5bo73bo9bo5bo19bo2bo4bo45bo9bo5bo84bo3b 2o$8bo4bo17bo2bo3bobob7o61b2o8b2o4b2o82b2o8b2o4b2o15b7o2bo2b3o3b2o4bob obo38b2o8b2o98b2o14b2o82b2o8b2o4b2o72b2o8b2o4b2o19b3o3bo2b3o41b2o8b2o 4b2o83b2o4bo$7bo4bo21bobobo2bo2bo67b2obo6b2obo86b2obo6b2obo19bo2bo3bob o2bobo5b3obo2bo39b2obo6b2obo22bobo71b2obo6bob2o86b2obo6b2obo76b2obo6b 2obo24b6o3bo3bo38b2obo6b2obo81b2obo5bo$7b2o3b2o21b2obo3bo4b2o63bob2o6b ob2o86bob2o6bob2o24bobob3o2b6o3bob2o40bob2o6bob2o20b3obo71bob2o6b2obo 86bob2o6bob2o76bob2o6bob2o23bo5bo2bobobobo37bob2o6bob2o81bob2o5b2o$39b 3o2bo3bo200b2obo4b2o7b2o2bo74bo4bo2bo295b2o2b2obo2b2obobo$42b6o204bo3b o2bo2b4o4bobo73b3obob2o299bo2b2o3bobo$41bo210b2o3b2o3bo2bo5b2o75bobo 303bo6bo$41b2o2bo303b2o302b2ob2o2b2o$44bobo609bo$45bo610bobo$657b2o9$ 156b2o91bo108bo6bo$2b2obo6b2obo6bo89b2obo6b2obo16b2o11bobo2b2o3b2o47b 2obo4bob2o22bobo105b3o4b3o58b2obo4b2obo87b2obo4b2o3b2o76b2obo4bob2o6bo 69b2obo6b2obo6bo73b2o3b2o3b2o4bo$2bob2o6bob2o5bobo88bob2o6bob2o17bo5b 2o4bobobo2bobo2bo46bob2o4b2obo21bobobo103bo6bo61bob2o4bob2o87bob2o4b2o 3b2o76bob2o4b2obo5bobo68bob2o6bob2o5bobo72b2o3b2o4bo3bobo$6b2o8b2o4bo 93b2o8b2o14bo5bobo3b2obobo2bob2o2bo49b2o6b2o19bo3bo104bo6bo64b2o6b2o 89b2o89b2o6b2o4bo73b2o2b2o4b2o4bo83bo5bo$6bo9bo99bo9bo14bob3o2bo2b2o3b ob2ob2o3b2o50bo8bo13b2o2b2ob3o101bo3bo2bo3bo64bo7bo90bo3b2o3b2o80bo8bo 78bo3bo5bo79b2o3b2o3b2o$7bo9bo99bo9bo13bo4bob2obob2o2bob2o2b2o54bo6bo 14bo2bobobo180bo7bo90bo2bobobobo81bo6bo80bo3bo5bo78bobobobo$6b2o8b2o 98b2o8b2o10b2ob2o2b2obo2bobob3o3bobob3o50b2o6b2o10b2obob2obo105bobo4bo bo66b2o6b2o89b2o4bobo82b2o6b2o78b2o2b2o4b2o80bobo5b2o$2b2obo6b2obo96b 2obo6b2obo12bobo3bobo2bobobo2bo3b3o2bo2bo45b2obo6b2o12bo2bo2bobob3o2b 2o98bo6bo63b2obo4b2obo87b2obo5b2obo78b2obo6b2o76b2obo6b2obo81b2obo6bo$ 2bob2o6bob2o96bob2o6bob2o15b4ob2o5b2ob3o5bobobo45bob2o7bo14bobo3b2obob o2bo169bob2o4bob2o87bob2o9b2o76bob2o7bo76bob2o6bob2o85b2o3bo$2o8b2o 104b2o2b2o23bo3bo4bobo2b4o3bob2o42b2o10bo16bo3bo4b4o174b2o6b2o89b2o8bo 80b2o4bo81b2o2b2o4b2o84bo3b2o$o9bo105bo3bo20b3o2b2o4bobob3o3b4obo44bo 11b2o18bo3bo95bo24bo58bo7bo90bo8bo81bo5b2o80bo3bo5bo84bo$bo9bo105bo3bo 17bo2bo4bobo4bobo3bo6bo45bo8b2o20b8o60b2obo6b2obo6bo10bobo3bobo10bobo 3bobo58bo7bo90bo7b2o81bo2b2o83bo3bo5bo83b2o3b2o$2o8b2o104b2o2b2o17b2o 3bo2bob4obo2b4ob2o3b2o43b2o9bo26bobo59bob2o6bob2o5bobo10bo4bo2bo8bo2bo 4bo58b2o6b2o89b2o8bo80b2o3bo82b2o2b2o4b2o84bo4bo$2b2obo6b2obo96b2obo6b 2obo17b2o3bo4bob2o4bobo50b2obo4bo23b4o2bo63b2o2b2o4b2o4bo16bobo10bobo 59b2obo4b2obo87b2obo9bo77b2obo4bo79b2obo6b2obo85bo4bo$2bob2o6bob2o96bo b2o6bob2o24bo2bo2bo2bo54bob2o4b2o21bo2bo3bob2o60bo3bo5bo97bob2o4bob2o 87bob2o9b2o76bob2o4b2o78bob2o6bob2o85b2o3b2o$149b2o3b2o3b2o84b2o3bobo 2bo61bo3bo5bo$249b2ob2o62b2o2b2o4b2o$312b2obo6b2obo23bobo10bobo$312bob 2o6bob2o18bo4bo2bo8bo2bo4bo$310b2o14b2o15bobo3bobo10bobo3bobo$310bo15b o17bo24bo$311bo15bo$310b2o14b2o$312b2obo6b2obo19bo7bo6bo$312bob2o6bob 2o19b3o4bobo4bobo$348bo$347b2o3bo3bo2bo3bo$356bo6bo$350b2o3bo6bo$356b 3o4b3o$348bobo7bo6bo$112b2obo6b2obo6bo80b2obo4b2o3b2o118b3obo75b2o3b2o 3b2o4bo78b2o3b2o4b2obo75b2o3b2o4b2obo75b2o3b2o4b2obo$112bob2o6bob2o5bo bo79bob2o4b2o3b2o117bo4bo2bo72b2o3b2o4bo3bobo77b2o3b2o4bob2o75b2o3b2o 4bob2o75b2o3b2o4bob2o$116b2o2b2o4b2o4bo84b2o127b3obob2o82bo5bo93b2o82b 2o88b2o4b2o$37bo78bo3bo5bo90bo3b2o3b2o120bobo75b2o3b2o3b2o83b2o3b2o8bo 74b2o3b2o2bo80b2o3b2o2bo5bo$35b5obo5b2o4b2o62bo3bo5bo90bo2bobobobo121b 2o75bobobobo88bobobobo9bo73bobobobo3bo79bobobobo3bo5bo$29bob2obo5b2o4b o2bo3bo62b2o2b2o4b2o89b2o4bobo202bobo5b2o85bobo10b2o75bobo4b2o81bobo4b 2o4b2o$29b2obobo2b2o3b2o2b2obo4bo57b2obo6b2obo87b2obo5b2obo201b2obo6bo 84b2obo6b2obo76b2obo6b2obo76b2obo6b2obo$34bo4b3o2bobo2b2o2b2o57bob2o6b ob2o87bob2o9b2o203b2o3bo89b2o4bob2o80b2o4bob2o80b2o4bob2o$33b2obo6bo2b obo2bo64b2o2b2o4b2o89b2o8bo204bo3b2o89bo2b2o85bo2b2o4b2o79bo2b2o4b2o$ 32bobo2b6o3b2ob6o61bo3bo5bo90bo8bo204bo94bo3bo85bo3bo5bo79bo3bo5bo$4b 2obo4bob2o14b3ob3o3bo2b3o3bo5bo61bo3bo5bo90bo7b2o203b2o3b2o88b2o3bo84b 2o3bo5bo78b2o3bo5bo$4bob2o4b2obo13bo3bo3bo4bo3b2obobo3bo60b2o2b2o4b2o 89b2o8bo204bo4bo89bo2b2o85bo2b2o4b2o79bo2b2o4b2o$8b2o6b2o11bobo2bobo3b o2bo2bobobo2bob2o55b2obo6b2obo87b2obo9bo204bo4bo89bo5b2obo80bo5b2obo 80bo5b2obo$8bo8bo12b5ob7obobo3bo2bobo56bob2o6bob2o87bob2o9b2o203b2o3b 2o88b2o4bob2o80b2o4bob2o80b2o4bob2o$9bo6bo18bo6bobobo3bobo2bo$8b2o6b2o 14bo2bo2b4ob2ob2ob2obobo$4b2obo6b2o15bobobobo2bo3bobo3bobob2o$4bob2o7b o15bo2bobob2o5b2obobo2bo$2b2o10bo14b2obobo3bobo3bo2bobobobo319b2o$2bo 11b2o14bobob2ob2ob2ob4o2bo2bo294b2o23bo2bo$3bo8b2o15bo2bobo3bobobo6bo 262b2obo6b2obo22bo24bobo$2b2o9bo15bobo2bo3bobob7ob5o257bob2o6bob2o22bo bo18b2o3bo$4b2obo4bo15b2obo2bobobo2bo2bo3bobo2bobo260b2o2b2o27b2o3b2o 5b2o7bob2o$4bob2o4b2o15bo3bobob2o3bo4bo3bo3bo260bo3bo24bo8b2o2bo3b2o8b o$29bo5bo3b3o2bo3b3ob3o262bo3bo23b3o12b3o9bo$30b6ob2o3b6o2bobo263b2o2b 2o26bo3bo4bo2bo$33bo2bobo2bo6bob2o260b2obo6b2obo21b2o3bo3b3o$30b2o2b2o 2bobo2b3o4bo261bob2o6bob2o48b3o3bo$30bo4bob2o2b2o3b2o2bobob2o260b2o2b 2o4b2o22b2o20bo2bo4bo$31bo3bo2bo4b2o5bob2obo260bo3bo5bo33bo9b3o$30b2o 4b2o5bob5o62b2o3b2o2b2o3b2o88b2o3b2o3b2o4bo84bo3bo5bo20bobo9bo8b2o3bo 2b2o42b2o3b2o4b2obo6bo79bob2o6b2obo$47bo64b2o3b2o2b2o3b2o88b2o3b2o4bo 3bobo82b2o2b2o4b2o18b3obo8b2obo7b2o5b2o3b2o37b2o3b2o4bob2o5bobo78b2obo 6bob2o6bo$226bo5bo79b2obo6b2obo19bo4bo2bo4bo3b2o18bobo45b2o4b2o4bo77b 2o8b2o4b2o3bobo$112b2o3b2o2b2o3b2o88b2o3b2o3b2o84bob2o6bob2o20b3obob2o 3bobo24bo36b2o3b2o2bo5bo84bo8bo5bo5bo$112bobobobo2bobobobo88bobobobo 125bobo6bo2bo23b2o35bobobobo3bo5bo82bo10bo5bo$114bobo6bobo92bobo5b2o 121b2o7b2o63bobo4b2o4b2o82b2o8b2o4b2o$113b2obo5b2obo91b2obo6bo194b2obo 6b2obo86bob2o4bo5bo$117b2o7b2o93b2o3bo199b2o4bob2o86b2obo5bo5bo$118bo 8bo94bo3b2o199bo8b2o88b2o2b2o4b2o$117bo8bo94bo204bo9bo90bo2bo5bo$117b 2o7b2o93b2o3b2o198b2o9bo88bo4bo5bo$118bo8bo94bo4bo199bo8b2o88b2o2b2o4b 2o$117bo8bo94bo4bo199bo5b2obo86bob2o6b2obo$117b2o7b2o93b2o3b2o198b2o4b ob2o86b2obo6bob2o7$2b2obo6b2obo6bo$2bob2o6bob2o5bobo$6b2o8b2o4bo$6bo9b o$7bo9bo$6b2o8b2o$2b2obo6b2obo$2bob2o6bob2o$6b2o2b2o$6bo3bo228b2o15b2o $7bo3bo100bob2o6b2obo6bo78b2o3b2o4b2obo13bobo13bobo55b2o3b2o2b2obo6bo$ 6b2o2b2o100b2obo6bob2o5bobo77b2o3b2o4bob2o15bo13bo57b2o3b2o2bob2o5bobo $2b2obo6b2obo94b2o8b2o4b2o4bo87b2o4b2o13b3o9b3o70b2o4bo$2bob2o6bob2o 95bo8bo5bo84b2o3b2o2bo5bo18bo5bo61b2o3b2o6bo$110bo10bo5bo83bobobobo3bo 5bo13b5o5b5o57bobobobo7bo$110b2o8b2o4b2o85bobo4b2o4b2o13bo4bo3bo4bo59b obo8b2o$112bob2o4bo5bo85b2obo6b2obo17b4o3b5o59b2obo4b2obo$112b2obo5bo 5bo88b2o4bob2o16b2o4bo5bobo61b2o2bob2o$116b2o2b2o4b2o89bo2b2o4b2o18b6o 3b2o62bo6b2o$117bo2bo5bo89bo3bo5bo18bo4bobo65bo7bo$116bo4bo5bo88b2o3bo 5bo18b4o2bo65b2o7bo$116b2o2b2o4b2o89bo2b2o4b2o20bo3bob2o63bo6b2o$112bo b2o6b2obo90bo5b2obo24bobo2bo62bo3b2obo$112b2obo6bob2o90b2o4bob2o23b2ob 2o64b2o2bob2o7$4b2obo4bob2o6bo$4bob2o4b2obo5bobo$8b2o6b2o4bo$8bo8bo$9b o6bo$8b2o6b2o330bo2bo$4b2obo6b2o330b3o2b3o$4bob2o7bo329bo3b2o3bo$8b2o 4bo329bo2bobo2bobo$8bo5b2o328bob2ob5o$9bo2b2o329b2o2bobo$8b2o3bo328bo 2bo2b6o$4b2obo4bo329bobo7bobo$4bob2o4b2o327b2ob2o4bo3bo$341bo3bo2b2ob 3o$342b3o4bobo$344bob2o$345b6o$346b3o2$312bob2o6b2obo27bo$312b2obo6bob 2o25bo3bo$310b2o8b2o4b2o22bo$311bo8bo5bo11b2ob2o6bo5bo$310bo10bo5bo10b o10bo3b2o$310b2o8b2o4b2o11b2o2bo5bo3bo11b2o$312bob2o4bo5bo13b3o7bo14bo $312b2obo5bo5bo12b3o8b3o13bo$316b2o2b2o4b2o11b2o2bo7bo4b2o5b4obo$317bo 2bo5bo11bo11b2o4b2o4bo4bo$b2o3b2o4b2obo300bo4bo5bo10b2ob2o7b2o4bo5bo2b 2o$b2o3b2o4bob2o300b2o2b2o4b2o26b3o9bo$16b2o294bob2o6b2obo31bo5bo3b2ob 2o$b2o3b2o8bo295b2obo6bob2o28bo3bo6b2ob2obo$bobobobo9bo327bo7b2o3bo7bo $3bobo10b2o327b3o4bo5bo7bo$2b2obo6b2obo332bo8bo7b2obo2bo$6b2o4bob2o 331b2o3bo3bo8bo2b4o2bo$7bo2b2o342bo12bo4b3o$6bo3bo339b2o14b2ob2o$6b2o 3bo347b3o7bob2o$7bo2b2o336bobo6b4o5b3o4bo$6bo5b2obo330b3obo6bo4b2ob2ob ob2o2bo$6b2o4bob2o329bo4bo2bo4bobob2obobobo2bobo$346b3obob2o3b2ob2obob obo2bobob2o$348bobo6b2o5b2obo4bo$349b2o6bo10b3obo$358bob2o9bo$356bobob o2bo6bo$356b2o4b2o6b2o11$3b2o3b2o2bob2o6bo$3b2o3b2o2b2obo5bobo$16b2o4b o$3b2o3b2o7bo$3bobobobo6bo$5bobo8b2o$4b2obo6b2o$8b2o5bo$9bo4bo$8bo5b2o $8b2o2b2o$9bo3bo$8bo3bo$8b2o2b2o91$287b2o$287bo$289bo$285b5o$284bo$ 280b2obob5o$13b2o48b2o49bo36b2o127b2obo6bobo$12bo2bo46bo2bo47bobo35bob o78b2o49bobob3ob2o$11bo4bo44bo4bo46bobo37bo5b2o70bo2bo48bo3bobo37b2o$ 10bo6bo42bo6bo42b2obob2o36b2o2bo73b3obo48b2obobo37bo$10bo6bo42bo6bo42b ob2o3bo33b2o4b3o2bo66b2o4bo50bobo40bo$11bo4bo44bo4bo47bob2o32bo2b6obob o62b2obobob3o51bo38b5o$12bo2bo46bo2bo48bo2bo33b2o6b2o65bobobobo52b2o 37bo$13b2o48b2o50b3o35b4o2b3o61b3o2bob2o88b2obob5o$118b4o31bo3bobo62bo 3b2ob2o89b2obobobo2bobo$115b2obobobo31bo2bobo61bo2bo3bo94bobo2b2ob2o$ 115b2obo3b3o30bobobobo58bob7o62bo31bobo3bo$119b2o4bo30b2obob3o56bo6bo 62bobo31b2obobo$121b4o33bobo3bo56b3ob2o62bobobo32bobo$121bo36bobo2b2o 58bobo63bo3bo32bo$122bo36bo65bo60b2ob2ob2ob2o28b2o$121b2o102b2o59b2obo 3bob2o$289bo3bo$289bobobo$290bobo$291bo3$59b2o$59b2o4$63b2o$57b2o4bo$ 52b2o2b2obo6bo165b2o$52b2obo3bo5b2o47bo6b2o38b2o68bo2bo$56b3o54bobo5bo 33bob2obobo68b3obo$57bo19b2o34bobo3bobo33b2obobo68b2o4bo$70b2o5b2o31b 2obob2o2b2o4bo34b2o63b2obobob3o6b2o$63b2o5b2o38bob2o3bo5b3o33b2o65bobo bobo8b2o82bo$9bo8bo43bo2bo11bo36bob2o4bo38bo3bo2b2o53b3o2bob2o4b3o86b 3o$9b3o4b3o34b2o6b2ob2o10bobo35bo2bo4b2o39b2obo2bo52bo3b2ob2o54b2o2bo 38bo$12bo2bo37b2o7bobo10b2ob2o35b3o48bobo52bo2bo3bo14bo40bob4o37bo3bo$ 11b2o2b2o46bo12bo2bo38b4o38b3o4bo52bob7o2b3o3b3o2bobo39bo7b2o29b2obo3b obo$5b2o14b2o54b2o5b2o29b2obobobo32b2o4b6o53bo6bo2bo3bobo3bo2bo38b2ob 5o2bo2bo26bobob2o3b2o$6bo6b2o6bo41b2o19b2o29b2obo3b3o30bobo3b3o57b3ob 2o3bo3bobo3bo42bo6bobob2o25bo2bo4bo3b2o$6bobo3bo2bo3bobo27b2o11bo2bo5b o47b2o4bo31bo7b2o2bo53bobo4bo3bobo3bo42bobob3obobo27bobob8o2bo$7b2o2bo 4bo2b2o29bo4b2o4bo4bo3b3o48b4o32b2o5bob4o55bo5b3o3b3o42b2o3bobo3bo26b 2obobobo6b2o$10bo6bo29bo6bob2o2bo6bobo3bo5b2o40bo38bo60bo3b2o22bo31bo 2b2obob2ob2ob2o26bobo2b3o$10bo6bo29b2o5bo3bobo6bo2b2obo6bo41bo32b5o2b 2ob3o52bobo25bobo30b2o3b2obo3bob2o26bobo3bobo$7b2o2bo4bo2b2o34b3o3bo4b o4b2o4bo43b2o31bo4bo3bo3bo4b2o4b2o36b2o3bo27bo3b2o28b2o4bo3bo30b2obo3b o$6bobo3bo2bo3bobo34bo5bo2bo11b2o76b3obob2ob3o5bo4bobo36b2o35b2o28bo5b obobo32bob3o$6bo6b2o6bo20b2o19b2o92bo6bo4b2obo3bo45b3o7b2o3b2o7b3o35bo 5bobo33bobo$5b2o14b2o19b2o5b2o117bobob2obob2o42bo3bo6b2o3b2o6bo3bo33b 2o6bo35bo$11b2o2b2o31bo2bo12bo93bo4bo4bobo2bobo3bo38bo2bo3bo4b2o7b2o4b o3bo2bo$12bo2bo32b2ob2o10bobo7b2o76b2o7b2o5b2o3bo2bo2bo39bo2bo3bo4b2o 7b2o4bo3bo2bo$9b3o4b3o30bobo10bo3bo6b2o76bobo11bo3b2o3b2o2bo39bo3b3o 21b3o3bo$9bo8bo31bo12bobo87bo5b2o7bobo3b3o6b2o$153b2o2bo6bo3bo5b3o2bob o2bo33bo3b3o21b3o3bo$49b2o12b3o85b2o4b3o2bobo6bo4bo3b4o34bo2bo3bo4b2o 7b2o4bo3bo2bo$49b2o12b3o84bo2b6obobo5b3o9bo37bo2bo3bo4b2o7b2o4bo3bo2bo $151b2o6b2o4bo4bobo9b2o37bo3bo6b2o3b2o6bo3bo$153b4o2b3o5b2obob3o8bo38b 3o7b2o3b2o7b3o$153bo3bobo8bobo4bo6bo33b2o35b2o$154bo2bobo8bobo3b2o6b2o 32b2o3bo27bo3b2o$155bobobobo7bo50bobo25bobo$156b2obob3o57bo27bo$158bob o3bo66b3o3b3o$158bobo2b2o65bo3bobo3bo$63b3o93bo70bo3bobo3bo$63b3o161bo 2bo3bobo3bo2bo$226bobo2b3o3b3o2bobo$63bobo161bo15bo$62bo3bo$63bobo166b 3ob3o$63bobo162b2o11b2o$228b2o11b2o2$66b2o2bo$62b2o2b2o3bo$62b2o7bo$ 67b4o! golly-3.3-src/Patterns/Life/Oscillators/billiard-table.rle0000644000175000017500000002722012026730263020547 00000000000000#C A "billiard table" oscillator is defined as any oscillator in #C which the rotor is enclosed within the stator. This definition #C is not exact, because the meaning of "enclosed" is not entirely #C clear. #C Billiard table configurations are generally considered interesting #C for their own sake, but useless for creating larger constructions, #C because they don't expose any sparks to interact with other #C oscillators or spaceships. #C For some time it was thought to be probably impossible to construct #C billiard tables using glider collisions, again because the centers #C are not accessible from outside. However, Dave Buckingham later #C succeeded in producing glider recipes for some billiard tables. #C From Alan Hensel's "lifebc" pattern collection. x = 347, y = 222, rule = B3/S23 57boo$boo3boo14boo15boo16boo$boo3boo14boo15boo$57b4o19bo$boo3boo14b4o 13b4o13bo4bo17bobo103bo$bobobobo13bobobboboo8bobobboboo8bobobooboboo 12bobobo61bo16boboo19bobo17boo$3bobo15bobboboboo8bobboboboo8bobo4boboo 9bobbo3bobbo31boobo22bobo15boobo20bo18boo69boo$bboobo12booboo3bo8boobo bbobo8boobo4bobo11bobobo3bobobo30boboo23bo99boo5boobo15boobbobbo$6boo 10boobo4bo8boobo4bo8booboboobobo12bobbo3bobbo29boo4boo38b3o19b5o14b6o 37bo5boboo15bobboboobo15bobo20bo$7bo14b4o13b4o13bo4bo16bobobo32bo5bo 20b5o10boobobobo17bo5bo12bo6bo35bo10boo14b3o4bo15booboboo15boboboo$6bo 50b4o18bobo34bo5bo16bobo5bobo7boobo3bo16bobobobbo11bobo3boobo34boo9bo 18boboboo17bobobo13bobbobo$6boo16boo15boo37bo34boo4boo16boobo3boboo10b o3boboo13bobobboboo11bo6bo47bo16bo4bo15boobobobobbo11b3obobo$7bo16boo 15boo16boo56boobo21bo3bo13bo3boboo12boobobbobo13b6o36boo9boo16b4o3bobb o6boobobobo3bobobo16b3o$6bo52boo56boboo21bo3bo14b3o17bobbobobo56bo5boo bo23bob4o6boobo3bobobobbo11b3o6bobo$6boo107boo4boo20b3o35bo5bo16boo38b o6boboo18b4o16bobboobobo14bo7boboo$115bo5bo38boboo18b5o17boo38boo3boo 22bobbobb3o11bo3boboo17boo3boo$116bo5bo20boobo13boobo85bo24bobobobbo 12boobo21bobbobo$115boo4boo20boboo37bo59boo4bo24boobobo17boobo17bob3o$ 117boobo62bobo59bo3boo28bo12b5oboboo18bo$117boboo63bo59bo6boobo37bobbo bo23bo$244boo5boboo65boo8$191bo17boo$187bob3o13boobobbo$166booboo16boo 15boboboobo64boo$144boo16boo3boboo19boobbo9bobo4boboo61bobo$bboboo41bo 93boobbo17bobbo20b3ob4o7boobboo3bobo64bo$bboobo22boo16bobo16bobo17bo 53bobbobo16bo4bob3o12boobo16bobo5bobo62bobooboo24boo3boo$oo25bobbo15b oo15b3ob3o14bobo52boo3boo15b5obo3bo12bob7o10bobo3boobboo61boo4bo24bo3b obo$bo24bobbo14boo14bobo7bobo12bo57bo3boo16bobobobo11bo5bobbo9boobo4bo bo66boo20bobboobo3bo$o24boboob3o10bo3b3o10boobo5boboo69bob4obo11b3obb ooboboo10b3obboobo13boboobobo63b3oboo19b4obobooboo$oo20bobbobbo4bobo6b obb3obbobo10bobbobbo13b5o54bo6bo11bo4bo3bo18boboo12bobboboo57booboobo 6bobboo19bobobobbo$bboboo15boboboobbooboboo7boo3booboo10bob3obo12bo5bo 51boobboobbo14boobobobo10b4ob3o17boo61bo3bobobb4obobbo16boo3bobobo$bb oobo16bobbo6bo12boobbo14bo3bo12bob5obo51bobo5b3o12boboboo11bobboo84b3o bbobo5boo17bobo3boboo$6boo17bob4obo12bo3bo15bobo13bobo3bobo51bobb5obbo 12bobo20boo83bobobbo3bobbobo14bobbobobo$7bo18bo4bo14b3o15booboo11boobo 3boboo49boo7bo15boo17b3obo85boobo3bobobb3o13booboobob4o$6bo20b3o18bobo 29bobbooboobbo55b3o35bo87bobboboboobbobo3bo13bo3boboobbo$6boo21boo18b oo31bo5bo57bo125boobbo6bobooboo11bobo3bo$bboboo77b5o189boob3o18boo3boo $bboobo79bo192boo$276bo4boo$276booboobo$280bo$280bobo$281boo6$27boo$ 26bobbo$26b3o$52bo$24b7o19b5o21boo$23bo7bo17bo5bo21bo5boo58boo60boo$ 22boboo3boobo16bobb3obo19bo3bobbo34boobo21boo46boo13bo$19bobbobo5bobo 14b3obobbob3o16bob4o3bo33boboo37booboo18booboboobobbo11bo$18bobobo9bob oo10bo3bo4bo3bo12bobbobo3b3obo30boo4boo19b4o11bobobo19boboobo3boo11bob 3o$18bobobo9bobobo10b3obobbob3o12boboboo3bobbobobbo27bo5bo19bo4bo10bo 3bo26boo13bobobbo$19boobo9bobobo12bob3obbo15bobbobobbo3boobobo27bo5bo 16bobbo3bo8bobobooboo18b4o3bo10boobobboobo$22bobo5bobobbo14bo5bo18bob 3o3bobobbo27boo4boo16booboboboboo5boobo3bobo13boobo7boboo8bobobobobo$ 22boboo3boobo18b5o20bo3b4obo32boobo23boobbo9bobo3bo14bobo3booboobbo8bo boboboboo34boo3boobo17boo44bo$23bo7bo21bo23bobbo3bo33boboo16b4oboo4bo 9boboboboboo10bobbo4bo3bo11bo4bobbo35bo3boboo16bobo43bobo19boobo$24b7o 45boo5bo38boo14bobboo3b3o11bo5bobo10boobb8o13boo3bo36bo8boo14boboboob oo15booboo16bobobo18boboo$83boo37bo21boo15b5o40b3o37boo7bo16bobobobobo 13bobobobo13b3obob3o13boobo$26b3o94bo17b3obbo16bo21b4o13b3o51bo17bo3bo bo13bo5bo10bobo3bobo3bobo8b3obob3o$25bobbo93boo17bo3boo38bobbo13bobboo 39boo7boo17bo3boboboo7boobo5boboo7booboo5booboo7bo4bobobbo$26boo90boob o83bobo39bo3boobo14boobobo3boboboo7bobobboboboobo10bobo3bobo10boboo3bo bobo$118boboo84bo39bo4boboo14boboobobobobo13boobobo14bo7bo11bobo3bobob o$246boo7boo16bobb3obo14bobobo15b7o14boboboboboo$255bo14boobboo3bo14bo bboo33b4oboobobo$246boo8bo13bo5b3o15boo18bobooboobo9bobbo3boobo$145boo 37boo61bo7boo15bo3bo37booboboboo13boo3bo$145bo11booboo22bobo59bo4boobo 16boo65b3o$147bo10boboboboo16boo3bo58boo3boboo83bo$140boob4obo8bobbobo bo3boo11bobboobo$138bobbobo4bo9boobo4bobbo12boboboboo$138boobo3b3o17b 3o13boobbobbo$139bobobo4b3o7b3o21bo5bo$139bo5b3o3bo4bobbo4boboo14bob5o boo$140bob3o3boboo4boo3bobobobbo10boobo6bobo$138bobobobbobbobo9boobobo bo11bobo3b4o$138boo3boo3bobbo12booboo12bobobbo$145b3obboo28booboo$63b oo80bo$61bobbo$4boboo53boo20boo$4boobo21bo33b4o16bo$bboo25b3oboobboo 22boo4bo16bo$bobo28boobobbo21bobboobbo13b3obo204boo$bo24bobboo4bobo18b ooboboo4boboo7bobobbobo113bo45boo3boo3boo33bo$oo24b4ob4obob3o15boobo4b ooboboo7booboboboboo109bobo45bo3boo3boo34b3o4boo19boo$bboobo25bo4bo4bo 17bobboobbo14bo3bobbo109bob3o42bo47bo4bo17bobobo16bobbo$bboboo22boo3bo bboobboo17bo4boo15bo4bo71bobbo14booboo16boo4bo41boo3boo3boo17boo13b3ob oboobo15b3obo18b6o$oo4boo20bo3bo6boboboo15b4o18b4o72b4o15bobobo10boobb o3boobo46bobobobo16bobboboo8bobobobobobboo12bo3bobo23bo$o5bo22b4ob6obo bo20boo76boo4boo6boo17bo3bobo10bo3b4obobooboo37boo5bobo18boboobobo7bo 3bobobbobo12bobbobobo3boo10b9obbo$bo5bo25bo6bobbo18bobbo18boo57bobbobb o5bo3b3o11b4obboboo10bo5bo4bobobo37bo4boobo17boobbobobo6booboboobboobo 12boboo4boobbo10bo8b3o$oo4boo23bobobboobbobo19boo20boo55bo4boo8boo4bo 9bo4bobobo9boboboobbobboo4bo36bo9boo14bobbobo3boboo5bobo7boo10boo9boo 12bo3b4o$bboobo25boo3boo3bo99boo14bobobo11b4obobbo7b3obo3bobo3bob3o37b oo9bo14boobobo3bobbo5bo3b4obobbo11b3o4boo11b3o8bo$bboboo140boo7bobo4b 3o11bob3o7bo4boobbobboobobo49bo18bobobobboo7b3o5boboo9boo9boo9bobb9o$ 141boobobbo7boobobobobbo7boobobobb3o4bobobo4bo5bo41boo8boo17boboboobo 12boobbobo9bobboobboboobo13bo$140bobobobo11bobo3bobo6bobb5obbo5booboob ob4o3bo41bo9bo18boobobbo8b5o3bobo9boo3bobobobbo14b6o$140bo3boo12bobobo bobo8bo5bo11boboo3bobboo40bo9bo23boo9bo5boboo15bobo3bo17bobbo$141b3o 15bo5bo10b5o12bo4boo45boo8boo36b3obo18bob3o$143bo16b5o13bo15b3obo94bo 3bo16bobobo$162bo33bobo98boo15boo$197bo5$211boo$204boo5boo$204bobo$ 207bo3b4obboo$184bo20boobobobobbobbo$146bo3boo11boo18bobo18bobobobobb 3obo$145bobobbo12bo19bobo18bobobobobo3bo$145bobbobo14bo16booboo14boob oobo5b3o$142boob4oboo6boob4obo14bobbobbo13boobo$142bobo12bobobo4bo14b oobboobbo15b3o5b3o$139boobo3bobb3o5bobo3bobo3bo9boo5boboo26boboo$bbob oo36boo96bobobo6bo4boobobo4b4o8bobb5obbo16b3o5bobooboo78boo$bboobo17bo 18boo18boo75bo6b5o6bo5b3o11bobobo6bo15bo3bobobobobo62boo17bobbo$6boo 14bobo37bo17bo59boob3o11bob4o4boobo6bobo3bobboo15bob3obbobobobo29boo5b oboo21bob3o16b5o$7bo13bobobo16b4o17bo15bobo59bobobb3o9bo4b5oboo5boobob o20bobbobboboboboo31bo5boobo19b3o4bo20bo$6bo14bobobo15bo4bo13b3oboboo 11bobo59bobbo3bo10b3obobo9bo7b7o12boobb4o3bo32bo4boo22bo4boobbo12b8obb o$6boo10boobo3boboo9bobbo3bobo11bobbobobobbo6booboboobbo56boo17bobbo 11b3ob3o6bo24bobo29boo4bo22bobooboboobo10bo8b3o$4boo12bobo4boboo8bobob obobobobbo9b3oboboboo6boobobobbobo75boo14bobobb4o21boo5boo34bo21boobob obobbobo8bobb8o$5bo15b4o13bobbobobobobobo5b3o4bobo12bob4obo96bobbo21b oo36boo3boo19bobo3bo3bobboo7boobo7bo$4bo36bobo3bobbo6bobbobobobo12bo6b oo159bo5boboo15bobob3o3bobo12bo4b4o$4boo17boo17bo4bo12bo4bo14b6o160bo 6boobo14boobobo3bobobo12boobbo$bboo19boo18b4o14b4o20bo160boo9boo15bo3b 3oboboo14bobbo$3bo78b3o173bo15boboo3bo15boob4o$bbo42boo16boo17bo163boo 9bo17bo3boo16bobo$bboo41boo16boo182bo9boo17b3o22bo$246bo6boboo21bo21b oo$246boo5boobo7$94boo$45boo7boo39bo19boo5boobo$24bobbo17boo7boo19boo 12boo3bo3bo17bo5boboo12boo13bo$24b4o46bobbo10bobbobob4o16bo4boo4boo9bo bbo12b3o38bo$45b4o3b4o19bobo10boboobo21boo3bo5bo9bobbo11boo3bo16bo19bo bo$22b8o14bo4bobo4bo15b3oboboo7boo4boboboo22bo5bo7boboob3o7bo3boobo14b obo19bo12boo8boo$21bo8bo12bobobbooboobbobo13bo4bobobo5bobb3obo4bo16boo 3boo4boo7bo4bobbobo5b3obobo13boboboboo28bobo6bobo$20bob3o3boobo8bobbob o9bobobbo10bobb3o3bo6boo4boboo19bo3bo5bo9b3oboboboo12boo11bo3bobobo8b oobb5obboo8bo6bo$20bobo6bobo7bobobobobbooboobbobobobo6boobo5b3o9b5obo 19bo5bo5bo5b3o4bobo8b4o5bo7boobo3bo3bo8bobbo5bobbo7boobobboboo$17boobo bo8boboo5bobbobo9bobobbo8bobboobobo11bo4bobbo17boo3boo4boo5bobb5obo8bo 6boobo7bobo3boboboo8bobobbobbobo6bobbob4o4bo$18bobo10bobo9bobobbooboo bbobo11bo4boo14b3oboboo22bo5bo9bo4bo10boobbobbobo7boboboobobobbo6boobo 5boboo5boobbo5boboo$18bobo10bobo10bo4bobo4bo13b3o3bo15bobo20boo4bo5bo 9b4o13bobobobboo7bobo3bobobo6bo3boo3boo3bo10b3o$17boobo8boboboo10b4o3b 4o16booboo16boo21bo3boo4boo26bobobobo11bobobbobo7b4o3bo3b4o4b5o4b5o$ 20bobo6bobo83bo6boobo13boo14boobobo11bobbobo13boo3boo8bo5boo5bo$20bob oo3b3obo13boo7boo59boo5boboo13boo18bo13boobbo11bobbobobobbo8b4obb4o$ 21bo8bo14boo7boo121boo10boobbobobboo7boobbobbobboo$22b8o164bo$$24b4o$ 24bobbo219boo3boboo17bo27bo$248bo3boobo16bobo17bo7bobo$247bo8boo14bobo 3boo11bobo6bobo$247boo8bo11booboboo3bo11bobo5boobboo$256bo13bobo6boboo 5booboboo3bobbobo$82booboo160boo7boo10bobbobob3obobbo6bobo6boboobbo$ 81boboboboboo157bo5boo12boobobo4bobo6bobbobob3obo3bobo$57boo21bo6bobo 157bo7bo15bobobboobboo5boobobo4bobboobo$56bobbo19bob5obobbo53bo17boo 48booboo30boo5bo16bobo3bobo10bobobboo4bo$22boo29bo3bobbo18bo8bobo49bob 5o15bobo4bo19bo3boo16boboboo37boo16boobobobo10bobo3bobobbo$23bobbobbo 4boo14bobb4oboobo15boob3o3b3oboo48boo5bo17bobbobo17bobobbobo13b3obo33b oo3boo20bobobo12boobobob3o$21bo4b6obbo13b3o5bobobbo16bobo8bo53b3obbo 14boobobbobo16bobo4bo12bo4boboo31bo4bo20bobo16bobo$20bob4o6bobo12bo3b 4obbobbo17bobbob5obo50b3o3boo14boboboobobbo12booboboo3boboo8bobboobobb o30bo4bo22boo16bobb3o$20bobobbobbob3obobo10bobo4bobobobb3o15bobo6bo50b o4bobo10boobbo7b3o14bobo4bobobo10boobo3bo3boo26boo3boo38boo4bo$17boobo bobobobbobboboboo10b3oboo3b4obbo14boobobobobo50bobobobobo10bobbo4b3o 16bobbobobobobobo11bo5bobobbo$17bobb4o3boboboobo19b3o3bo21booboo51bobo 4bo12boboo6boo14boobobo4bobboo10boboboboboo$19bo4b4obobobbo13b6o3b3o 75boobobobboo14bo3bobboobbo16bobobboo3bo12booboo$20b4o4boobobo14bo6boo 78boobobo3bobo13boobobo3boo16bobo3bobobo$22bobboo5bo17bob3obbo81boobo bbobo13bobobo22booboboboo$24boob5o17boobo3boo83boboobbo11bo4bo25bobo$ 29bo111bo5boo9bob3obobo23bo$140boo17bobbobboo22boo$160bobo$161bo9$83b ooboo$84bobo$33bobboo45bo3bo$31b3obbo20booboobboo13boobob3oboboo71boo 116boo$25boboobo6bo20bobobbobo13boobo5boboo25boo4boo37bobboboo79boobo 5boobo20bo$25boobobobb5o15boo3bo3boo18bo5bo29bo5bo10booboo22bobbobo80b oboo5boboo22bo$28bobobo20bobboob3obbo14b3o7b3o25bo5bo12bobobo18boob3o bbo84boo7boo16b5o$28bobobb5o16boobo4b3obbo8bobo13bobo22boo4boo11bo4bo 18bo6boboo81bo8bo17bo$25boobobobo5bo16bobo7b3o8boobo5bo5boboo38boobo5b o17bob3obbobo83bo8bo14boo3boo$26bobbobobobobbo14bobbo7bo14bo4bobo4bo 25boo4boo8boobo6bo14boobo3b3obo82boo7boo10boobo5boboboo$26bo5boboboboo 13boobo7boboo8boobo5bo5boboo23bo5bo11bobo5bo12bobo3bobobbo79boobo5boob o13bobo7bobo$27b5obbobo19bo7bobbo8bobo13bobo22bo5bo12boboo3boo12bobobb oob3o80boboo5boboo12bobboo5boobbo$32bobobo16b3o7bobo13b3o7b3o25boo4boo 12bo16boobobo4bo81boo7boo17boobbobo4boo$27b5obboboboo13bobb3o4boboo15b o5bo49b7o10bobobobobobb4o76bo8bo20bo3b5o$27bo6boboobo16bobb3oboobbo11b oobo5boboo25boo4boo19bo10bobbo4boboobbo77bo8bo19bo7bo$28bobb3o23boo3bo 3boo11boobob3oboboo26bo5bo15boo14boboboobo82boo7boo20b7o$27boobbo23bob obbobo20bo3bo29bo5bo16boo15boobobbo84boobo5boobo$55boobbooboo20bobo30b oo4boo36boo85boboo5boboo18b3o$83booboo190bobbo$278boo! golly-3.3-src/Patterns/Life/Oscillators/p103079214841.rle0000644000175000017500000001237512026730263017314 00000000000000#C p103079214841 (prime: 4^13*1536-263) oscillator/gun -- #C p1536 base loop, 13 quadruplers, and a 263-step glider advancer. #C Based on previous p97307852711 and p97307852687 oscillators; #C original design by Gabriel Nivasch, 7 August 2003. #C The first three quadruplers are set (an L112 quadrupler, a Fx70 #C quadrupler plus a required F166 dependent conduit to suppress the #C following Herschel's first glider, and another L112 after that), #C so the circuit counts down from 64. Use an 8^2 or 10^2 step size. #C When all circuits are empty, a signal gets through to activate #C the 263-step glider advancer -- after which the circuit counts down #C again, this time from 4^13. #C Dave Greene, 31 Mar 2006; checked and corrected by Tomas Rokicki. x = 297, y = 227, rule = B3/S23 193b2o72b2o$193bo73bo$194bo73bo$182bo10b2o61bo10b2o$182b3o71b3o$185bo 73bo$172bo11b2o60bo11b2o$170b3o71b3o$169bo40bo32bo40bo$169b2o19b2o16b 3o32b2o37b3o$155b2o33b2o15bo21b2o50bo$156bo50b2o21bo50b2o$156bobo71bob o$157b2o72b2o2$176b2o72b2o$176b2o72b2o6$173b2o36b2o34b2o36b2o$77b2o94b o19b2o16bobo33bo19b2o16bobo$77b2o5b2o88b3o15bobo18bo34b3o15bobo18bo$ 84b2o90bo15bo20b2o35bo15bo20b2o$48b2o97bob2o19b2o19b2o4b2o22bob2o19b2o 19b2o4b2o$49bo97b2obo19bo25bobo22b2obo19bo25bobo$36bo11bo14b2o17b2o87b 3o22bo48b3o22bo$36b3o9b2o14bo17b2o89bo21b2o7b2o41bo21b2o7b2o$39bo24bob o21b2o114b2o72b2o$26b2o10b2o25b2o21b2o$27bo$27bobo$13b2o13b2o$13b2o36b 2o$51b2o$195bo18b2o53bo18b2o$7b2o140b2o43bobo17bo8b2o43bobo17bo$7b2o 139bobo44bo16bobo7bobo44bo16bobo$11b2o135bo63b2o8bo63b2o$11b2o134b2o 44b5o23b2o44b5o$192bo4bo68bo4bo$61b2o99b2o27bo2bo41b2o27bo2bo$42b2o18b o28b2o69b2o24bo2bob2o41b2o24bo2bob2o$6b2o34bo16b3o29bo95bobobo5bo63bob obo5bo$6b2o35b3o13bo29bobo77bob2o15bo2bo4bobo44bob2o15bo2bo4bobo$45bo 43b2o78b2obo18b2o2bo2bo44b2obo18b2o2bo2bo$26bo3b2o120b2o42b2o28b2o42b 2o$25bobo3bo120b2o72b2o$25b2o3bo111b2o72b2o$29bo113bo73bo$25b5obo111bo bo71bobo$25bo4b2o112b2o72b2o$26b3o$9bo18bob2o$7b3o19bobo$6bo$6b2o186b 2o16b2o54b2o16b2o$9b2o77b2o104b2o16b2o54b2o16b2o$4b5obo61b2o14b2o$4bo 21b2o45bo22b2o$6bob2o16bobo41b3o23bo51b2o72b2o$5b2ob2o18bo41bo23bobo 50bobo39b2o30bobo39b2o$28b2o64b2o51bo42bo30bo42bo$20b2o124b2o42bobo27b 2o42bobo$20b2o169b2o72b2o$200b2o72b2o$4b2o70bo123b2o72b2o$4b2o70b3o$ 79bo$78b2o83b2o72b2o$163b2o72b2o$154b2o72b2o$153bobo27b2o42bobo27b2o$ 153bo30bo42bo30bo$152b2o30bobo39b2o30bobo$96b2o87b2o72b2o$21b2o73bo$ 21bobo70bobo$23bo70b2o61b2o16b2o54b2o16b2o$23b2o132b2o16b2o54b2o16b2o 2$77b2o$77b2o15b2o$94bobo$5b2o89bo84b2o72b2o$4bobo23bo65b2o82bobo71bob o$4bo23b3o149bo73bo$3b2o22bo151b2o72b2o$11b2o14b2o160b2o72b2o$11b2o64b 2o80b2o28b2o42b2o28b2o$77bo76b2o2bo2bo7bo36b2obo18b2o2bo2bo44b2obo$75b obo73bo2bo4bobo6bobo35bob2o15bo2bo4bobo44bob2o$75b2o73bobobo5bo6b2ob2o 52bobobo5bo$151bo2bob2o9bo2bo28b2o24bo2bob2o41b2o$154bo2bo8bo3bo28b2o 27bo2bo41b2o$155bo4bo9bo58bo4bo$92b2obo60b5o23b2o44b5o$92bob2o79b2o8bo 63b2o$158bo16bobo7bobo44bo16bobo$85b2o70bobo17bo8b2o43bobo17bo$85b2o 71bo18b2o53bo18b2o$10b2o13b2o236b2o18bo$9bobo13b2o237bo17bobo$9bo254bo bo16bo$8b2o255b2o$27bo253b5o$26bobo252bo4bo$27bo47b2o91bo72b2o41bo2bo$ 28b3o45bo81b2o7b2o41bo21b2o7b2o41b2obo2bo$30bo45bobo80bo48b3o22bo47bo 5bobobo$77b2o80bobo22b2obo19bo25bobo44bobo4bo2bo$154b2o4b2o22bob2o19b 2o19b2o4b2o44bo2bo2b2o$136b2o17bo20b2o35bo15bo20b2o29b2o$20b2o115bo17b obo18bo34b3o15bobo18bo$20b2o74bo27bo11bo19b2o16bobo33bo19b2o16bobo$94b 3o27b3o9b2o36b2o34b2o36b2o$93bo33bo$11b2o80b2o19b2o10b2o$11b2o84b2o16b o$46b2o50bo16bobo$46b2o48bo19b2o$96b2o41b2o72b2o$139b2o72b2o50b2o16b2o $12b2o152b2o97b2o16b2o$13bo152b2o26b2o$10b3o3b2o175bobo$10bo4bobo152b 2o21bo50b2o43b2o$15bo83b2o69bo21b2o50bo44bo$14b2o64b2o17b2o70b3o32b2o 37b3o39bobo$13bo66b2o91bo32bo40bo39b2o$13b3o25b2o87b2o75b3o$16bo24bo 88bo16b2o60bo11b2o14b2o38b2o$15b2o25b3o34b2o50b3o14bo73bo15bo38b2o$44b o35bo52bo11b3o71b3o15bo$77b3o12b2o51bo10b2o61bo10b2o5b2o10bo$16b2o19b 2o38bo14bo64bo73bo15b3o$16b2o19b2o54b3o60bo73bo15bo$89b2o4bo60b2o72b2o 14b2o13b2o$89bobo170bo$91b3o127bo39bo31bo$90bo3bob2o123b3o37b2o28b3o$ 90b2o2b2obo126bo65bo$223b2o65b2o4$254b2o$29b2o223b2o$29bo$30b3o260b2o$ 32bo260bobo$295bo$295b2o$162b2o55b2o36b2o$8b2o3b2o103b2o42b2o54bobo16b 2o19bo$9bo2bobo103bo99bo18bobo15b3o25b2o3b2o$8bo3bo106bo97b2o20bo15bo 6bo11b2o7b2o3b2o$8b5o105b2o48b2o63b2o4b2o19b3o11bo$168b2o63bobo23bo15b 3o$6b5o153b2o69bo23b2o16bo$5bo4bo153b2o60b2o7b2o$4bo2bo218b2o$bo2bob2o 135b2o$obobo5bo63b2o39b2o26b2o$bo2bo4bobo9b2o51b2o39b2o52b2o$4b2o2bo2b o9b2o146b2o$9b2o19b2o37b2o$28bo2bo37b2o$28b2o186b2o$33b2o182bo$33bo 111b2o70bobo$31bobo71b2o38bobo70b2o$30bobo72bo41bo$26b2o3bo20bo53b3o 11b2o25b2o$26b2o23bobo54bo11b2o$50bo2bo$8b2o41b2o183b2o$8b2o56bo67b2o 100bo$62b2o2bobo65bo99bobo$62b2o2b2o67b3o96b2o$137bo11b2o$124b2o22bobo 23bo$125bo22bo23b3o$122b3o22b2o22bo$122bo32b2o14b2o$155b2o$75b2o$9b2o 64b2o$8bobo60b2o$8bo62bobo$7b2o64bo$73b2o158b2o$60b2o155b2o14b2o$60b2o 156bo22b2o$215b3o23bo$12b2o3b2obo194bo23bobo$13bo3b2ob3o35b2o109b2o2b 2ob2o61b2o$10b3o10bo34b2o94b2o13bobo2bobo$10bo6b2ob3o130bobo16b2o3bo7b o$18bobo132bo19bob2o6b3o$18bobo131b2o16bo2bobo6bo38bo$19bo149bobobobo 6b2o37b3o$170b2ob2o49bo$202bo20b2o$200b3o16b2o$199bo19bo$186b2o11b2o 20bo$186b2o32b2o6$155b2o60b2o$155b2o60b2o17b2o$161b2o73b2o$161b2o$180b 2o$176b2o2bo2b2o52b2o$159b2o16bo3bob2o52bo$159b2o5b2o9bobobo42b2o12b3o $166b2o10b2obob2o22b2o16bo14bo$181bo2bo4b2o16bo14b3o$181b2o6b2o17b3o 11bo$210bo!golly-3.3-src/Patterns/Life/Oscillators/honey-farm-hasslers.rle0000644000175000017500000002646213451370074021601 00000000000000#C Honey farm hasslers. #C There is an unusual proliferation of oscillators engineered this #C way, because there are so many ways to perturb a honey farm in #C such a way that it reappears in the same location. x = 408, y = 285, rule = B3/S23 374b2o$373bo2bo$376bo$376bo$370bo3bobo$329b2o38bo3bobo$329bobo37bo4bo$ 27bo133b2o6bo161bo23b2o2bo10b4o$6b2obo17b3o97b2obo5b2o23bo6bobo116b2ob o6b2obo26b4ob2o21bo2bobo19b2o$6bob2o20bo96bob2o6bo15b2o3b2obo7bo117bob 2o6bob2o26bo2bobobo21bobobo19bo$4b2o4b2o17b2o9b2o89b2o3bo16bo4bobo13b 3o114b2o2b2o4b2o29bobo20b2obob2o8b3o5bobo$4bo5bo29bo90bo4b2o16b3obo14b o3bo113bo3bo5bo12b2o16bo2b2o17bo3b2o3bo5bo3bo4b2o$5bo5bo19b3o4bobo91bo 23bob2o12bo5bo113bo3bo5bo10b4o14b2o4bo15bob2o2b2o7bo5bo$4b2o4b2o18bo3b o3b2o91b2o3b2o23b3o8bo5bo112b2o2b2o4b2o9bobo2bo15b5o15bobo2bobo3bo3bo 5bo$6b2obo19bo5bo91b2obo6bo22bo3bo7bo5bo108b2obo4bo5bo10b2o2bobo8b3o3b o4b2o14b3o2b2o7bo5bo$6bob2o19bo5bo91bob2o5bo22bo5bo7bo3bo109bob2o5bo5b o14bobo6bo3bo5b2o2bo17b2o3bo5bo3bo$4b2o4b2o17bo5bo89b2o9b2o21bo5bo8b3o 114b2o2b2o4b2o16b2o4bo5bo5bob2o11b5obob2o8b3o$4bo5bo14b2o3bo3bo90bo33b o5bo12b2obo109bo3bo5bo16b3o4bo5bo5bo14bo2bo2bobo18b2o$5bo5bo12bobo4b3o 92bo9b2o22bo3bo14bob3o108bo3bo5bo14bobo5bo5bo4b2o19bo2bo17bo2bo$4b2o4b 2o12bo100b2o10bo23b3o13bobo4bo106b2o2b2o4b2o14b2o7bo3bo27b2o18bobo2bo 2bo$6b2obo13b2o9b2o91b2obo5bo31bo7bob2o3b2o102b2obo6b2obo26b3o36b3o8b 2obob5o$6bob2o24bo92bob2o5b2o29bobo6bo110bob2o6bob2o64bo3bo5bo3b2o$35b 3o130bo6b2o187bo5bo7b2o2b3o$37bo292b2o32bo5bo3bo3bobo2bobo$330bo33bo5b o7b2o2b2obo$331b3o25b2o4bo3bo5bo3b2o3bo$333bo24bobo5b3o8b2obob2o$358bo 19bobobo$357b2o19bobo2bo$365b4o10bo2b2o$364bo4bo$363bobo3bo$362bobo3bo $362bo$33b2o327bo$32bobo327bo2bo$32bo330b2o$30b2ob4o$29bobobo2bo$29bob obo$2o4b2o19b2o2bo$bo5bo18bo4b2o$o5bo19b5o10b2o$2o4b2o16b2o4bo10bo$23b o2b3o4b3o3bobo305b2o$2o4b2o15b2obo5bo3bo2b2o112bo193b2o$bo5bo18bo4bo5b o7bo81b2obo6b2obo12b3o183b3o$o5bo16b3o5bo5bo5b3o81bob2o6bob2o15bo17bo 163bo3bo$2o4b2o15bo7bo5bo4bo88b2o8b2o12b2o15b3o138b2o8bo13bo5bo$28b2o 2bo3bo5bob2o85bo9bo29bo141b2o6b3o13bo5bo$2o4b2o19bobo3b3o4b3o2bo86bo9b o18bo9b2o147bo16bo5bo$bo5bo19bo10bo4b2o86b2o8b2o17bobo157b2o5b2o9bo3bo 2b2o$o5bo19b2o10b5o84b2obo6b2obo18b2ob2o164b2o9b3o3bobo$2o4b2o28b2o4bo 84bob2o6bob2o19bobo3bo160bo19bo$37bo2b2o83b2o8b2o24bo3bobo149b3o27b2o$ 35bobobo85bo9bo28b2ob2o147bo3bo$32bo2bobobo86bo9bo28bobo147bo5bo$32b4o b2o86b2o8b2o18b2o9bo149bo3bo$36bo90b2obo6b2obo15bo130b2obo5b2o19b3o24b o$34bobo90bob2o6bob2o12b3o15b2o114bob2o6bo47b2o$34b2o117bo17bo119b2o3b o47b2o$172b3o116bo4b2o$174bo117bo$291b2o3b2o$287b2obo6bo$287bob2o5bo$ 291b2o3b2o$291bo$292bo3b2o23b2o$291b2o4bo22b2o$287b2obo5bo25bo24b3o$ 287bob2o5b2o48bo3bo$345bo5bo$30b2o10b2o302bo3bo$29bo2bo8bo2bo273b2o27b 3o$29b3o2b6o2b3o274bo19bo$32b2o6b2o277bobo3b3o9b2o$31bo10bo277b2o2bo3b o9b2o5b2o$2o4b2obo13b2o6b2obo4bob2o280bo5bo16bo$bo4bob2o13bobo10b2o 285bo5bo13b3o6b2o$o9b2o13b3o25b2o268bo5bo13bo8b2o$2o8bo13bo3bo9bo13bob o269bo3bo$11bo12b5o3bo4bobo10b3o272b3o$2o8b2o15b2o3b3obo3bo8bo3bo111b 2o16b2o35bo2bo94b2o$bo4b2obo14b5o3bo3bo3bo4b5o2b2o110bobo16bobo33bo98b 2o$o5bob2o14bo3bo7bo3bo3b3ob2o114bo20bo31b2o$2o2b2o19b3o9bobo5b5o2b2o 108b2ob4o12b4ob2o26bo6b2obo$4bo18bobo12bo10bo3bo107bobobo2bo12bo2bobob o28bo3bo2bo$2o3bo17b2o5b2o18b3o108bobob2o2b2o8b2o2b2obobo28b3obo3bo$bo 2b2o24bo10bo10bobo103b2obob2o2b2o2bo6bo2b2o2b2obob2o22bo11bo$o5b2obo 17b2obobo3b2ob3o11b2o104bobobob2o2b2obo4bob2o2b2obobobo24bo3bob3o$2o4b ob2o17bob2obo3bo2b2o118bo2bo4b2o3bo4bo3b2o4bo2bo25bo2bo3bo$32bo5b2ob2o 115b2o3b3obob3o6b3obob3o3b2o24bob2o6bo$32bob4o3bo123bo3bo10bo3bo37b2o$ 33bo3bobobo86b2obo4b2o3b2o13b6o26b6o27bo13b4o$34bo3bobo87bob2o4b2o3b2o 12bo2bo3bo4bo14bo4bo3bo2bo13b2o7bo2bo9b2o7bo$33b2o4bo92b2o21b2o3b2o5bo 14bo5b2o3b2o9b2obo2bob2o16b2o2b2o3bo$132bo3b2o3b2o17bo28bo14b2o2bo4bo 20b2o2bo$133bo2bobobobo15bobo28bobo17bo10bo$132b2o4bobo12bo4bobo28bobo 4bo13bobo6bobo4bo$128b2obo5b2obo12b3o5bo5bo14bo5bo5b3o21bo3bo2bobo59b 2obo6b2obo32b2o$128bob2o9b2o13bo4bo4bobo12bobo4bo4bo24bo3bobo3bo58bob 2o6bob2o23bo7bobo$126b2o14bo12bo5bo3b2ob2o10b2ob2o3bo5bo23bo3bobo3bo 62b2o2b2o25b3o8bo$126bo14bo13b2o4bo4bobo12bobo4bo4b2o24bobo2bo3bo62bo 3bo25bo$127bo13b2o18bo5bo14bo5bo31bo4bobo6bobo55bo3bo24b2o$126b2o14bo 15bobo28bobo34bo10bo53b2o2b2o32b3o$128b2obo9bo16bobo28bobo16bo2b2o20bo 4bo2b2o44b2obo6b2obo27bo3bo$128bob2o9b2o17bo28bo17bo3b2o2b2o16b2obo2bo b2o44bob2o6bob2o17b3o6bo5bob2o$155b2o3b2o5bo14bo5b2o3b2o12bo7b2o9bo2bo 7b2o52b2o8b2o10b2o2bo3bo6bo3bo2b2o$155bo2bo3bo4bo14bo4bo3bo2bo13b4o13b o65bo9bo11b2obo5bo6b3o$156b6o26b6o29b2o67bo9bo14bo3bo$165bo3bo10bo3bo 35bo6b2obo60b2o8b2o15b3o$35bo6bo115b2o3b3obob3o6b3obob3o3b2o31bo3bo2bo 56b2obo6b2obo26b2o$29bo5b3o4bobo114bo2bo4b2o3bo4bo3b2o4bo2bo32b3obo3bo 55bob2o6bob2o27bo$28bobo7bo2bobo115bobobob2o2b2obo4bob2o2b2obobobo29bo 11bo83bo8b3o$28bobo6b2o4bo5b2o107b2obob2o2b2o2bo6bo2b2o2b2obob2o29bo3b ob3o85bobo7bo$2o3b2o3b2o14b3ob2o17bo111bobob2o2b2o8b2o2b2obobo33bo2bo 3bo85b2o$bo3b2o3b2o13bo13b3o5bobo111bobobo2bo12bo2bobobo33bob2o6bo$o 25b3ob2o6bo3bo4b2o113b2ob4o12b4ob2o40b2o$2o3b2o3b2o16bob2o5bo5bo120bo 20bo41bo$5bobobobo25bo5bo120bobo16bobo37bo2bo$2o5bobo27bo5bo121b2o16b 2o$bo4b2obo28bo3bo$o9b2o20b3o4b3o$2o9bo19bo3bo$10bo19bo5bo$2o8b2o18bo 5bo$bo9bo18bo5bo5b2obo$o9bo14b2o4bo3bo6b2ob3o$2o8b2o12bobo5b3o13bo328b 2o$24bo17b2ob3o327bo2bo13b2o$23b2o5bo4b2o6bobo287bo57bo2bo$30bobo2bo7b obo286bobo59bo$29bobo4b3o5bo286bobo2bo38b2obo15bo$31bo6bo290b3o2b2obo 39bobo2b2o4bo3bobo4b2o$322bo5bo3b2o3bo2b2o36bo4bo3bo3bobo5bobo$322b3o 4b3o2b3o3b2o37bo7bo4bo9bo$325bo5bobo37b2o6bo2bo5b4o8b2obob2o$287b2obo 6b2obo23b2o6bobo35bobo23b4o3b2obo$287bob2o6bob2o32bo7bo28bobob2o18bo2b o3b2o$291b2o2b2o18b2ob2o21b3o27bobobo17bo2bo2b3ob3o$291bo3bo20bob2o19b 2o3bo28bo6b3o10b2o5b2o3bo$292bo3bo19bo3bo6b2o9bo3b2obo14b2o11b2o4bo3bo 9b3o5b4o$214b2o75b2o2b2o16b2obobobo5b2obo8bo4bobo13bo2bo2b2o6b3o2bo5bo 8b3o4bo4b3o$214bo72b2obo6b2obo13bobo4bo3bo3bo9bobobob2o12b3o2bobo6b3o 2bo5bo8b3o4b2o2bo2bo$160b2o4b2o9b2o27b2o3b2obo72bob2o6bob2o13bob2o3bo 4b3o10bo3bo18b2o9b3o2bo5bo8b2o10b2o$160bobo2bobo9b2o27bo4bobo77b2o2b2o 4b2o12bo3b2o6bo12b2obo17bo2bo8b2o4bo3bo9bo$162bo2bo41b3obo79bo3bo5bo 14b3o21b2ob2o16b2o3bo5bo7b3o8bobobo$161bo4bo42bob2o79bo3bo5bo15bo7bo 37bob2obob2o18b2obobo$161b6o124b2o2b2o4b2o22bobo6b2o24bob2obo4bo23bobo $45bo9bo71b2obo6bob2o21b4o20b2o14b2o17bo2b2o61b2obo6b2obo25bobo5bo25b 2obob2o3bo4b4o15b2o$45b3o5b3o71bob2o6b2obo45bo15bo2b2o5b3o6b2o2bo61bob 2o6bob2o17b2o3b3o2b3o4b3o26bo9bo4bo8b2o$32b2o14bo3bo14b2o62b2o2b2o19b 2o19b3o4bobo16b2obo4bo3bo4b5o93b2o2bo3b2o3bo5bo27bobo5bobo3bo7b4o$26b 2o5bo13b2o3b2o13bo5b2o56bo4bo20bo18bo3bo3b2o21bo2bo5bo105bob2o2b3o35b 2o4bobo3bo7bobo2bo$27bo3bo37bo3bo58bo2bo21bobo4b3o8bo5bo25bo3bo3bo107b o2bobo43bo13b2o2bobo$27bob4o6b2o8b3o8b2o6b4obo57b2o2b2o21b2o3bo3bo7bo 5bo21b2obo5b3o5b5o100bobo44bo18bobo$2o5bob2o14b2obo6bo3b3o6bo3bo6b3o3b o6bob2o51b2obo6bob2o21bo5bo6bo5bo20bo2b2o14b2o2bo100bo45bo2bo17b2o$bo 5b2obo15bobob2obo2b2o4bo4bo5bo4bo4b2o2bob2obobo52bob2o6b2obo21bo5bo7bo 3bo3b2o16b2o17bo2b2o147b2o17b3o$o4b2o19bobob2o2b2ob7o3bo5bo3b7ob2o2b2o bobo50b2o14b2o19bo5bo8b3o4bobo204bobo$2o4bo16b2obo16bo3bo5bo3bo16bob2o 47bo16bo15b2o3bo3bo18bo204b2o$5bo17bo2bobob2o2b2ob7o4bo3bo4b7ob2o2b2ob obo2bo48bo14bo15bobo4b3o19b2o$2o3b2o17bobobob2obo2b2o4bo6b3o6bo4b2o2bo b2obobobo48b2o14b2o14bo50b2o3b2o$bo5bob2o14b2obo6bo3b3o17b3o3bo6bob2o 51b2obo6bob2o15b2o20b4o26bobobobo$o6b2obo16bob4o6b2o19b2o6b4obo53bob2o 6b2obo36b6o22b2obobobo$2o9b2o14bo3bo16b3o18bo3bo103bo4bo22bobobo3bo2b 2o$12bo13b2o5bo13b6o14bo5b2o103bo2bo27bob2o3bobo$2o9bo20b2o12bob2o17b 2o96b2o9bobo2bobo24bobo7bo$bo9b2o31b3o4bobo111b2o9b2o4b2o24bobo7b2o$o 6bob2o32bo3bo2b2ob3o153bo$2o5b2obo32b2ob2o4bo3bo$44bobo7bobo$44bo2bo2b 6o$45b2o2bobo$46bob2ob5o282b2o$46bo2bobo2bobo279bob2o$47bo3b2o3bo263b 2o13bo$48b3o2b3o264b2obo14bo$50bo2bo270bo9b2obo$321bo12b2o$286b2o3b2o 4b2obo21bob2o20b2o$286b2o3b2o4bob2o23b2o17bo$295b2o4b2o39bobo2b2o$286b 2o3b2o2bo5bo38bobob3o2bo$286bobobobo3bo5bo37bo2b6o$288bobo4b2o4b2o13b 4o9b3o11b2ob2o$287b2obo4bo5bo13bo4bob2o4bo3bo9b6o2bo$291b2o3bo5bo12bo 4bo3bo2bo5bo7bo2b3obobo$292bo2b2o4b2o15b2o4bo2bo5bo8b2o2bobo$291bo3bo 5bo13b2o4bo2bo2bo5bo13bo$67b2o222b2o3bo5bo11bo2bo3bo2bo3bo3bo10b2o$66b o2bo115b2o105bo2b2o4b2o11bo2bo4b2o5b3o$27bo7bo29bobobo114bobo104bo5b2o bo13bo4b2o$26bobo4b3o28b3obo110b2o2bo107b2o4bob2o13bo3bo4bo$27bo4bo31b 3o16b2o94bo2bob2o129b2obo4bo$32b2o48bobo96b2obobo132b4o5b3o$80b3o102bo 145bo7b2o$2o5b2obo18b3o37bo6b2obo3bo243bo3bo3b4o4b2o$bo5bob2o12b2o3bo 3bo35bobo3bo5bob2o242bobo2bo3b3ob2o2b2o$o4b2o16b2o2bo5bo33b2ob2o2bo5bo 101b3o139bo2bobo10bo$2o3bo22bo3bo35bobo3bo5bob2o97bo3bo138bo3bo$6bo22b 3o37bo6b2obo3bo96bo5bo137bo$2o3b2o73b3o97bo5bo138b3o$bo5b2obo42b2o27bo bo95bo5bo$o6bob2o23b3o16bobo27b2o96bo3bo2b2o$2o3b2o4b2o20bo3bo17b3o69b 2obo6b2obo28bo12b3o3bobo$5bo5bo20bo5bo2b2o11bo3bob2o6bo58bob2o6bob2o 26b3o20bo$2o4bo5bo20bo3bo3b2o11b2obo5bo3bobo61b2o2b2o29bo23b2o$bo3b2o 4b2o21b3o20bo5bo2b2ob2o60bo3bo30b2o$o6b2obo43b2obo5bo3bobo62bo3bo35b3o $2o5bob2o21b2o20bo3bob2o6bo62b2o2b2o16b2o2bo5b3o8bo12bo$33bo4bo16b3o 69b2obo6b2obo12bo2bobo3bo3bo6bo11bobo$30b3o4bobo13bobo71bob2o6bob2o13b ob2o3bo5bo18b2o$30bo7bo14b2o16b3o51b2o8b2o4b2o12bo5bo5bo$69bob3o51bo9b o5bo14b2o3bo5bo170b2o$68bobobo53bo9bo5bo14bo4bo3bo171bobo$68bo2bo53b2o 8b2o4b2o12bo7b3o174bo2b2o$69b2o56b2obo6b2obo14b2o45b2o120b2o13b2obobo$ 127bob2o6bob2o52b3o7bo121bo16bo$192bo3bo4bo123bobo11b4o$191bo5bo3b2o 123b2o11bo3b2o$191bo5bo5bo136b3o2bo$171b2o18bo5bo3b2obo81b2o3b2o4b2obo 41bob2o$171bobo11bo6bo3bo3bobo2bo80b2o3b2o4bob2o19bo21bo$171bo12bo8b3o 5bo2b2o89b2o23b3o18b2o$184b3o99b2o3b2o2bo27bo8b3o$191b2o93bobobobo3bo 19b2o4b2o7bo3bo$167b2o23bo95bobo4b2o20bo12bo5bo$168bo20b3o95b2obo6b2ob o16bobo4b3o3bo5bo$168bobo3b3o12bo101b2o4bob2o17b2o3bo3bo2bo5bo$169b2o 2bo3bo114bo8b2o19bo5bo2bo3bo3b2o$2o3bob2o14bo11bo136bo5bo112bo9bo20bo 5bo3b3o4bobo$bo3b2obo14b3o7b3o136bo5bo112b2o9bo19bo5bo12bo$o8b2o15bo5b o139bo5bo113bo8b2o20bo3bo7b2o4b2o$2o8bo14b2o5b2o139bo3bo113bo5b2obo23b 3o8bo$9bo164b3o114b2o4bob2o15b2o18b3o$2o7b2o18b3o284bo21bo$bo5b2o19bo 3bo280b2obo$o7bo18bo5bo139bo139bo2b3o$2o5bo20bo3bo139bobob2o136b2o3bo 11b2o$7b2o20b3o141b2obo2bo136b4o11bobo$2o3b2o168bo2b2o136bo16bo$bo4bo 20b2o5b2o136bobo139bobob2o13b2o$o4bo22bo5bo137b2o140b2o2bo$2o3b2o18b3o 7b3o280bobo$25bo11bo281b2o16$328bo7b2o$49bo107b2o31b2o136b3o5b2o7bo$ 26bo20b3o108bo31bo131bo8bo11b3o$26b3o17bo111bob2o25b2obo97b2obo4b2o3b 2o19b3o5b2o10bo$2o5b2obo18bo16b2o79b2obo6b2obo18bobo8bo7bo8bobo98bob2o 4b2o3b2o22bo16b2o$bo5bob2o17b2o21b2o74bob2o6bob2o20bob2o4bobo5bobo4b2o bo98b2o4b2o30b2o6b3o$o4b2o4b2o38bo79b2o2b2o4b2o17bobobo5bo7bo5bobobo 97bo5bo3b2o3b2o28bo3bo$2o3bo5bo18b3o16bobo79bo3bo5bo14b2o2bo27bo2b2o 94bo5bo2bobobobo27bo5bo$6bo5bo16bo3bo9b3o3b2o81bo3bo5bo13bobob2o2b3o 15b3o2b2obobo93b2o4b2o4bobo29bo5bo7b2ob2o$2o3b2o4b2o15bo5bo7bo3bo84b2o 2b2o4b2o10b2obobo4bo3bo13bo3bo4bobob2o92b2obo5b2obo13b2o14bo5bo7b2obo 2bo$bo5b2obo18bo3bo7bo5bo79b2obo6b2obo12bobob2o3bo5bo11bo5bo3b2obobo 92bob2o9b2o10bo2bo2b2o10bo3bo11bob2o$o6bob2o14b2o3b3o9bo3bo80bob2o6bob 2o14bo6bo5bo11bo5bo6bo98b2o8bo11b2o2bobo11b3o12bo$2o3b2o4b2o11bobo16b 3o79b2o14b2o10bobob2o3bo5bo11bo5bo3b2obobo96bo8bo14b2o28b2o$5bo5bo12bo 100bo15bo11b2obobo4bo3bo13bo3bo4bobob2o97bo7b2o13bo26bobo2b2o$2o4bo5bo 10b2o21b2o78bo15bo13bobob2o2b3o15b3o2b2obobo99b2o8bo10b2obo26b2o2bo2bo $bo3b2o4b2o15b2o16bo78b2o14b2o13b2o2bo27bo2b2o95b2obo9bo11bo2bob2o28b 2o$o6b2obo18bo17b3o77b2obo6b2obo19bobobo5bo7bo5bobobo99bob2o9b2o12b2ob 2o$2o5bob2o15b3o20bo77bob2o6bob2o20bob2o4bobo5bobo4b2obo$26bo132bobo8b o7bo8bobo$158bob2o25b2obo147b2o$158bo31bo129b2o16bo$157b2o31b2o129bo 10b2o5b3o$318b3o11bo8bo$318bo7b2o5b3o$326b2o7bo!golly-3.3-src/Patterns/Life/Oscillators/p59-glider-loop.lua0000644000175000017500000000300112706123635020522 00000000000000-- Smaller variant of David Bell's p59 glider loop from 2006 May 28. -- Author: Dave Greene, 30 May 2006. -- Conversion to Lua by Andrew Trevorrow, Apr 2016. local g = golly() -- require "gplus.strict" local gp = require "gplus" local pattern = gp.pattern local gpo = require "gplus.objects" local gpt = require "gplus.text" g.new("p59 track") g.setrule("B3/S23") local fast_eater = pattern("2o$bo2b2o$bobobo$2bo2$4bo$3bobo$4bo$b3o$bo!", -9, -2) -- create an array specifying half of a length-6608 Herschel track local path = {} path[1] = gpo.hc112 for i = 1, 14 do path[#path + 1] = gpo.hc77 end for i = 1, #path do path[#path + 1] = path[i] end for i = 1, 12 do path[#path + 1] = gpo.hc77 end local T = {0, 0, gp.identity} local p59_track = pattern(gpo.herschel) g.show("Building p59 Herschel track -- hang on a minute...") for i = 1, #path do path[#path + 1] = path[i] end for _, h in ipairs(path) do p59_track = p59_track + h.t(T) + fast_eater.t(T) T = gp.compose(h.transform, T) end -- add 111 more Herschels to template Herschel track, 59 generations apart for i = 1, 111 do p59_track = p59_track[59] + gpo.herschel end p59_track = p59_track + pattern("o!", -10, 589) -- get rid of eater -- add 9 gliders in same spot, 59 generations apart local glider = pattern("2o$b2o$o!", -16, 595) for i = 1, 9 do p59_track = (p59_track + glider)[59] end g.show("") local all = p59_track for i = 1, 3 do all = all.t(-720, 450, gp.rccw) + p59_track end all = all + gpt.maketext('59').t(-142, 596) all.display("") golly-3.3-src/Patterns/Life/Oscillators/DRH-oscillators.rle0000644000175000017500000067724112026730263020667 00000000000000#N Stamp collection #C A collection of 650 oscillators of 83 different periods from 1 #C to 40894. #C #C The oscillators included here were found/built by many people over #C many years. I finished putting the collection together in August 1995, #C and have worked on this header file off and on since then. It's still #C incomplete and probably inaccurate, but I've decided to make it public #C anyway; if you find any errors or can fill in any of the blanks, please #C let me know. #C #C Since this collection was built, many new oscillators have been found. #C Most notably, in 1996 David Buckingham showed how to create tracks #C built from still-lifes through which Herschels can move. (See #C http://www.radicaleye.com/lifepage/patterns/bhept/bhept.html #C for Buckingham's description of this, and #C http://www.radicaleye.com/lifepage/patterns/p1/p1.html #C for Paul Callahan's discussion of using such conduits to build a stable #C glider reflector.) Using Herschel tracks, Buckingham obtained glider #C guns of all periods >= 62 and oscillators of all periods >= 61. Further #C work on Herschel tracks has been done by Buckingham, Paul Callahan, #C Dieter Leithner, and me; such tracks now give oscillators of all periods #C >=54, and guns of periods 54, 55, and 56. #C #C In addition, oscillators of several new smaller periods have been found, #C namely 17 (by me), 22 (by Noam Elkies, me, and Jason Summers), 27 (by #C Elkies), 33 (by Elkies and Jason Summers), 37 (by Nicolay Beluchenko), #C 39 (by Elkies), 49 (by Elkies), and 51 (by Beluchenko). (See #C http://www.radicaleye.com/DRH/nbt.html #C for many oscillators of small periods, including the only known p17s #C and the smallest known p22s.) There are 8 periods for which oscillators #C are still unknown as of early 2009: 19, 23, 31, 34, 38, 41, 43, and 53. #C (For period 34, we could use a noninteracting combination of p2 and p17 #C oscillators, but that's considered trivial.) #C #C Some new guns of smaller periods have also been found, namely 22 (by #C David Eppstein, based on Jason Summers's p22 oscillator), 24 and 48 (by #C Elkies) and 50 (by me, based on a p44 gun by Buckingham and a p50 #C oscillator by Elkies). These are shown (among others) at #C http://home.mieweb.com/jason/life/guns/ . #C Also see http://www.radicaleye.com/lifepage/patterns/p24gun/p24gun.html #C for discussion of the p24 gun, and #C http://www.radicaleye.com/DRH/gun44.50.html #C for the p50 gun and Buckingham's p44 gun. #C #C Building this collection would have been impossible without the help #C of many people. In addition to those who found the oscillators, I'd #C like to thank Alan Hensel, Bill Gosper, Robert Wainwright, #C Rich Schroeppel, and Jonathan Cooley for helpful suggestions, and #C Andrew Trevorrow for writing LifeLab, an excellent Macintosh program #C for building and running Life patterns. LifeLab's cross-platform #C successor, Golly, is available as freeware at http://golly.sf.net . #C #O Dean Hickerson, dean.hickerson@yahoo.com #C 2/2/2000; last updated 9/16/2000. URLs corrected #C and list of missing periods updated on 5/8/2009. #C #C ---------------------------------------------------------------------- #C #C Most lines of this header describe particular oscillators. Each entry #C begins with an identifying label, of the form "period.row.column"; #C row and column numbers start at zero. This is followed by the name of #C the oscillator (if any) in quotation marks, the discoverer and date of #C discovery (if known) in brackets, and perhaps a comment about the #C oscillator. For example: #C #C 2.0.0 "blinker" [JHC 3/70] Example of "+c*c" symmetry. This #C often occurs in a group of 4, known as a "traffic light", #C which arises, for example, from a T-tetromino. #C #C This indicates that the leftmost oscillator in the top row of the period 2 #C section is called a "blinker", and was found by John Conway in March 1970. #C The notation "+c*c" indicates the symmetry type of the oscillator, which #C is described later. #C #C Many oscillators were found by the following people or groups, so their #C names are abbreviated in this header: #C #C AF = Achim Flammenkamp #C AWH = Alan Hensel #C DIB = David Bell #C DJB = David Buckingham #C DRH = Dean Hickerson #C HH = Hartmut Holzwart #C JHC = John Conway #C MDN = Mark Niemiec #C NDE = Noam Elkies #C PC = Paul Callahan #C RCS = Rich Schroeppel #C RTW = Robert Wainwright #C RWG = Bill Gosper #C SN = Simon Norton #C JHC group = A group of people working with John Conway in the #C early 1970s, including Conway, S. R. Bourne, #C M. J. T. Guy, and Simon Norton. #C MIT group = A group of people at MIT during the early 1970s, #C including Robert April, Michael Beeler, Bill Gosper, #C Richard Howell, Rici Liknaitzky, Bill Mann, #C Rich Schroeppel, and Michael Speciner. #C #C Also, many of the common oscillators were found independently by many #C people; this is indicated by an asterisk in the name field. #C #C Here are definitions of some terminology and notation used below; for #C a more extensive glossary, see Stephen Silver's Life Lexicon, at #C http://www.argentum.freeserve.co.uk/lex_home.htm #C #C The 'rotor' constists of all cells in an oscillator which change state. #C The 'stator' constists of all cells which are alive in all generations. #C (These terms were introduced by Allan Wechsler in 1994.) #C #C An oscillator whose stator is large is often called a 'billiard table'; #C such oscillators are somewhat easier to find than others, so many are #C included in this collection. #C #C The 'period' of an oscillator (or spaceship) is the smallest positive #C integer P for which generation P of the object is congruent to and in #C the same orientation as generation 0. The 'mod' of an oscillator (or #C spaceship) is the smallest positive integer M for which generation M #C of the object is congruent to generation 0, but not necessarily in the #C same orientation. The quotient q=P/M is always either 1, 2, or 4. To #C specify both P and M, we often write "period P.M" or "period P/q". #C #C There are 43 types of symmetry that an oscillator can have, taking into #C account both the symmetry of a single generation and the change of #C orientation (if any) M generations later. There are 16 types of #C symmetry that a pattern can have in a single generation. Each of these #C is given a one or two character name, as follows: #C #C n no symmetry #C #C -c mirror symmetry across a horizontal axis through cell centers #C -e mirror symmetry across a horizontal axis through cell edges #C #C / mirror symmetry across one diagonal #C #C .c 180 degree rotational symmetry about a cell center #C .e 180 degree rotational symmetry about a cell edge #C .k 180 degree rotational symmetry about a cell corner #C #C +c mirror symmetry across horizontal and vertical axes meeting #C at a cell center #C +e mirror symmetry across horizontal and vertical axes meeting #C at a cell edge #C +k mirror symmetry across horizontal and vertical axes meeting #C at a cell corner #C #C xc mirror symmetry across 2 diagonals meeting at a cell center #C xk mirror symmetry across 2 diagonals meeting at a cell corner #C #C rc 90 degree rotational symmetry about a cell center #C rk 90 degree rotational symmetry about a cell corner #C #C *c 8-fold symmetry about a cell center #C *k 8-fold symmetry about a cell corner #C #C For a period P/1 object, specifying the symmetry of generation 0 tells #C us all there is to know about the oscillator's symmetry. For a period #C P/2 or P/4 object, we also need to know how gen M is related to gen 0. #C For the P/2 case, gen M can be either a mirror image of gen 0, a 180 #C degree rotation of it, or a 90 degree rotation of it if the pattern #C has 180 degree rotational symmetry. For the P/4 case gen M must be a #C 90 degree rotation of gen 0. In any case, if we merge all gens which #C are multiples of M, the resulting pattern will have more symmetry than #C the original oscillator. We describe the complete symmetry class of #C the oscillator by appending the one or two character description of #C the union's symmetry to that of gen 0's symmetry. For example, if #C gen 0 has 180 degree rotational symmetry about a cell center, and #C gen M is obtained by reflecting gen 0 across a diagonal, then the #C union of gens 0 and M is symmetric across both diagonals, so its #C symmetry class is denoted ".cxc". #C #C The 43 possible symmetry types are: #C #C period/mod = 1: nn -c-c -e-e // .c.c .e.e .k.k +c+c #C +e+e +k+k xcxc xkxk rcrc rkrk *c*c *k*k #C #C period/mod = 2: n-c n-e n/ n.c n.e n.k #C -c+c -c+e -e+e -e+k #C /xc /xk #C .c+c .cxc .crc .e+e .k+k .kxk .krk #C +c*c +k*k xc*c xk*k rc*c rk*k #C #C period/mod = 4: nrc nrk #C #C The collection includes examples of all of these with mod=1, and many #C with larger periods. #C #C ---------------------------------------------------------------------- #C Period 1 oscillators are usually called "still-lifes". Programs #C written by MDN and others have counted the still-lifes with N cells #C for small N; the results up to N=20 are shown here: #C #C N 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #C # 2 1 5 4 9 10 25 46 121 240 619 1353 3286 7773 19044 45759 112243 #C #C Those with up to 10 bits are included in the stamp collection. So are #C some larger ones that either occur naturally in random soups, or are #C useful, or exemplify symmetry types. I'm omitting the discoverers and #C dates for most of the small and naturally occurring ones, since they've #C been independently discovered many times. #C #C There are 2 4-bit still lifes: #C 1.0.0 "block" [JHC group 1970] Example of "*k" symmetry. Used #C as an eater in many oscillators, such as 4.1.0, 5.2.4, 6.0.0, #C 8.0.0, 10.1.0, 11.0.1, 12.1.1-2, 18.0.0, 28.0.0, 29.0.1, #C 30.0.0, 32.0.1, 44.0.0, 46.0.0, 56.0.0, 124.0.0, 135.0.0, #C 150.0.0, 188.0.0, 246.0.0, 360.0.0, and 460.0.0. Also used as #C a 'rephaser' in 135.0.0, 150.0.0, and 240.0.0. #C 1.0.1 "tub" [JHC group 1970] Example of "*c" symmetry. Used as an #C eater in 12.2.1, 24.0.0, most p29s, 30.2.0-3, and 47.0.0. #C #C There's 1 5-bit still life: #C 1.0.2 "boat" [JHC group 1970] Example of "/" symmetry. #C #C There are 5 6-bit still lifes: #C 1.0.3 "ship" [JHC group 1970] Example of "xc" symmetry. Used as an #C eater of traffic lights in 24.1.0 and 24.2.0. #C 1.0.4 "barge" [JHC group 1970] Example of "xk" symmetry. #C 1.0.5 "snake" [JHC group 1970] Example of ".k" symmetry. Used in #C 60.4.1 and 15240.0.0 to convert a glider into a boat, which a #C subsequent glider deletes. #C 1.0.6 "beehive" [JHC group 1970] Example of "+e" symmetry. This #C often occurs in a group of 4, known as a "honey farm", which #C arises, for example, from a beehive with an extra cell in one #C of its corners. #C 1.0.7 "aircraft carrier". Example of ".e" symmetry. #C #C There are 4 7-bit still lifes: #C 1.0.8 "long boat" [JHC group 1970] #C 1.0.9 "long snake". Example of ".c" symmetry. #C 1.0.10 "loaf" [JHC group 1970] #C 1.0.11 "eater" or "eater1" (formerly "fishhook") [* 1971] Smallest #C asymmetric still-life. This is a very useful still-life, #C because of its ability to eat gliders (e.g. 30.0.1), beehives #C (30.0.2), and lightweight and middleweight spaceships (46.2.0 #C and 46.3.0), and to modify many other things. The term #C "eater" also applies to other still-lifes (and occasionally #C oscillators) that share this ability; the most useful of these #C are the block (1.0.0), eater2 (1.7.3), and eater3 (1.7.4), but #C many others are sometimes useful, including the tub (1.0.1), #C ship (1.0.3), and snake (1.0.5). #C #C There are 9 8-bit still lifes: #C 1.1.0 "long ship" [JHC group 1970] #C 1.1.1 "long barge" [JHC group 1970] #C 1.1.2 "long long snake" #C 1.1.3 "sinking ship" #C 1.1.4 "pond" [JHC group 1970] #C 1.1.5 "shillelagh" [Charles L. Corderman & Hugh Thompson 1971] #C 1.1.6 "tub with tail" [Charles L. Corderman & Hugh Thompson 1971] #C 1.1.7 "hook with tail" #C 1.1.8 "mango" #C #C There are 10 9-bit still lifes. Only 7 have names: #C 1.2.0 "long long boat" #C 1.2.1 "long^3 snake" #C 1.2.2 "long sinking ship" #C 1.2.3 "hat" [* 1971] Example of "-c" symmetry. #C 1.2.4 "integral sign" #C 1.2.5 "up-boat with tail" #C 1.2.6 "down-boat with tail" #C 1.2.7 "long shillelagh" #C 1.2.8-9 unnamed #C #C There are 25 10-bit still lifes. Only 9 have names: #C 1.3.0 "long long ship" #C 1.3.1 "long long barge" #C 1.3.2 "long^4 snake" #C 1.3.3 "long long sinking ship" #C 1.3.4 "snake siamese snake" #C 1.3.5 "snake siamese aircraft carrier" #C 1.3.6 "aircraft carrier siamese aircraft carrier" #C 1.3.7 "long integral" #C 1.3.8-13 unnamed #C 1.4.0 "beehive with tail" #C 1.4.1 "up-barge with tail" #C 1.4.2 "down-barge with tail" #C 1.4.3-6 unnamed #C 1.4.7 "loop" #C 1.4.8 "block and table" #C 1.4.9 "loaf siamese barge" #C 1.4.10 "bi-boat" or "boat-tie" or "bow tie" #C #C Still lifes 1.5.0-10 and 1.6.0-4 are some larger ones that sometimes #C occur in random soups. #C 1.5.0 "bi-ship" or "half fleet" (A "fleet" consists of 2 of these, #C and arises, for example, from a ship with an extra bit added #C at one end.) #C 1.5.1 "bi-loaf" or "half bakery" #C 1.5.2 "paper clip" #C 1.5.3 "big S" [MIT group 1971] #C 1.5.4 "bi-pond" #C 1.5.5 "boat-ship tie" #C 1.5.6 "pair of tables" #C 1.5.7 "moose antlers" #C 1.5.8 "cis-mirrored R-bee" #C 1.5.9 "block on big table" #C 1.5.10 "twin peaks" #C 1.6.0 "dead spark coil" #C 1.6.1 "beehive on big table" #C 1.6.2 "scorpion" Occurs in gens 4760-5165 of "rabbits", this 9-bit #C methuselah found by Andrew Trevorrow: #C o...ooo #C ooo..o. #C .o..... #C 1.6.3 "fourteener" #C 1.6.4 "bookends" #C #C Still lifes 1.6.5-8 and 1.7.0-2 provide examples of other symmetries. #C 1.6.5 Example of "-e" symmetry #C 1.6.6 "beehive with 2 tails" Example of "-e" symmetry #C 1.6.7 Example of "+c" symmetry #C 1.6.8 "spiral" [RTW 1971] Example of "rc" symmetry #C 1.7.0-1 Examples of "+k" symmetry #C 1.7.2 Example of "rk" symmetry. Heinrich Koenig pointed out that there #C are smaller examples; the smallest are: #C ..oo.o.. ...o.o.. #C ..o.oo.. .oooo.o. #C oo....oo o.....o. #C .o.oo..o .o.oo.oo #C o..oo.o. oo.oo.o. #C oo....oo .o.....o #C ..oo.o.. .o.oooo. #C ..o.oo.. ..o.o... #C #C Still lifes 1.7.3-6 are eaters that are used in various oscillators. #C 1.7.3 "eater2" [DJB ????] See 6.3.2, 6.5.2, and 13.0.0. #C 1.7.4 "eater3" [DJB 6/22/77] See 8.2.1, 18.0.0, 42.0.0, 50.0.1, #C 55.0.0, 246.0.0. #C 1.7.5 "eater4" [DJB ????] See 9.0.4, 11.0.2, 29.0.1-2, 29.3.0-1. #C 1.7.6 unnamed eater [DJB ????] I don't know any oscillators that #C use this. Here it's shown deleting a loaf: #C .........o.... #C ...o....o.o... #C ..o.o...o.ooo. #C .o..o..oo....o #C ..oo..o...ooo. #C ......ooooo... #C ....oo........ #C ...o.o..ooo... #C .ooo.o.o..o... #C o....o.o...... #C .oo.oo.oo..... #C ..o.o......... #C ..o.o......... #C ...o.......... #C #C 1.7.7 [DJB 3/78?] Unnamed eater, used in 6.3.3 and 32.0.0. #C #C The 10 digits: [DRH 5/8/92; "4" changed 3/94] #C #C ---------------------------------------------------------------------- #C #C There are 20 known p2 oscillators with <= 14 cells (in gen 0). #C There's 1 with 3 cells: #C 2.0.0 "blinker" [JHC 3/70] Example of "+c*c" symmetry. This #C often occurs in a group of 4, known as a "traffic light", #C which arises, for example, from a T-tetromino. #C #C There are 3 with 6 cells: #C 2.0.1 "toad" [SN 5/70] Note use as an eater ("killer toads") in, #C for example, 4.9.1, 6.2.5, 46.4.0, and 60.5.0. See discussion #C of toad hasslers at 60.0.0. #C 2.0.2 "beacon" [JHC 3/70] #C 2.0.3 "clock" [SN 5/70] Example of ".kxk" symmetry. #C #C For any N>=8, there's at least one p2 with N cells. Generically these #C are called barber poles (see 2.7.0). For 8<=N<=11 these are the only #C known p2s; the first 3 have names: #C 2.0.4 "bipole". Example of ".cxc" symmetry. #C 2.0.5 "tripole". Example of "/xk" symmetry. #C 2.0.6 "quadpole". Example of ".cxc" symmetry. #C #C There are 4 with 12 cells (including the 6-pole, which isn't shown): #C 2.0.7 #C 2.0.8 "the fox" or "gnome" [DJB 7/77] Smallest asymmetric p2. #C 2.0.9 "flip flops" [MIT group 12/71] Example of "rk*k" symmetry. #C #C There are 2 with 13 cells, the 7-pole and: #C 2.0.10 "by flops" [RTW ????] Example of "-c+e" symmetry. #C #C There are 6 with 14 cells, the 8-pole and: #C 2.1.0 #C 2.1.1 #C 2.1.2 "why not" [DJB 7/77] #C 2.1.3 "eater plug" [RTW 2/73] #C 2.1.4 "test tube baby" #C #C Oscillators 2.0.2 (beacon), 2.1.3 (eater plug), and 2.1.4 (test tube #C baby) are examples of on-off oscillators, in which generation 0 is a #C subset of generation 1. Other examples are shown in 2.1.5 to 2.1.9. #C 2.1.5 "spark coil" [* 1971] #C 2.1.6 "4 boats" #C 2.1.7 "light bulb" [* 1971] #C 2.1.8 variant of light bulb #C 2.1.9 "scrubber" [* 1971] #C #C Oscillators 2.1.8 to 2.5.4 provide examples of the remaining p2/2 #C symmetry types. #C 2.2.0 "quad" [Robert A. Kraus 4/71] Example of "rk*k" symmetry. #C 2.2.1 "cloverleaf" [RTW before 6/72] Example of "xc*c" symmetry. #C 2.2.2 "singular flip flop" [RTW 7/72] Example of "n-e" symmetry. #C 2.2.3 "almosymmetric" [* 1971] Example of "n-e" symmetry. #C #C 2.2.4 Example of "-c+e" symmetry. #C 2.2.5 [DRH 5/20/93] Example of "n-c" symmetry. #C 2.2.6 [DRH 4/23/93] Example of ".c+c" symmetry. #C 2.3.0 [DRH 5/20/93] Example of "n/" symmetry. #C 2.3.1 "Laputa" [RCS 9/23/92] Example of "n.e" symmetry. #C 2.3.2 "blinkers bit pole" [RTW 6/77] Example of "n.e" symmetry. #C 2.3.3 [DRH 5/20/93] Example of "n.k" symmetry. #C 2.3.4 [DRH 5/20/93] Example of "n.k" symmetry. #C 2.3.5 [DRH 4/23/93] Example of ".k+k" symmetry. #C 2.3.6 Example of ".kxk" symmetry. #C 2.4.0 "piston" [* 1971] Example of "-c+c" symmetry. #C 2.4.1 Example of "-c+c" symmetry. #C 2.4.2 [DRH 5/20/93] Example of "n.c" symmetry. #C 2.4.3 "complementary blinker" [AF 7/12/94]. Example of ".c+c" #C symmetry. #C 2.4.4 Example of ".cxc" symmetry. #C 2.4.5 [DRH 4/23/93] Example of "/xc" symmetry. #C 2.4.6 [DRH 4/23/93] Example of ".crc" symmetry. #C 2.5.0 [DRH 4/23/93] Example of "rc*c" symmetry. #C 2.5.1 [AF 7/26/94] Example of "rk*k" symmetry. A muttering moat; #C see 2.12.2. #C 2.5.2 [DRH 4/23/93] Example of "xk*k" symmetry. #C 2.5.3 [DRH 1973] Example of "-e+e" symmetry. Infinitely extensible. #C 2.5.4 [DRH 4/23/93] Example of "-e+e" symmetry. #C 2.5.5 [DRH 4/23/93] Example of "-e+e" symmetry. #C 2.5.6 [DRH 4/23/93] Example of "-e+k" symmetry. #C 2.6.0 Example of ".e+e" symmetry. #C 2.6.1 Example of "+k*k" symmetry. #C 2.6.2 Example of "+k*k" symmetry. #C 2.6.3 Example of ".krk" symmetry. #C 2.6.4 Example of "xk*k" symmetry. #C #C Oscillators 2.7.0 to 2.9.1 are examples of stabilized wicks, which may #C be made arbitrarily long. #C 2.7.0 "barber pole" [MIT group 1970] #C 2.7.1 [RTW <1990] #C 2.7.2 [DRH 1994] #C 2.7.3 [RTW <1990] #C 2.7.4 [bottom end: RTW <1990; top end: DRH 1995] #C 2.7.5 [RTW <1990] #C 2.8.0 [DRH 1994] #C 2.8.1 [AWH 8/25/94] This was discovered as a stabilizer for 4.4.1. #C 2.9.0 [DRH 1994] #C 2.9.1 [DRH 1994] #C #C Oscillators 2.10.0 to 2.12.1 are stabilized agars, which may be #C made arbitrarily large. #C 2.10.0 "venetian blinds" [DRH 9/12/92] This uses diagonal edges for #C the agar. A vertical edge is also known, along with a corner #C joining it to the diagonal edge. It's easy to prove that #C horizontal edges don't exist. #C 2.10.1 [DRH 12/4/94, improved by MDN 12/6/94] #C 2.11.0 "houndstooth agar" [DRH 3/30/94] #C 2.11.1 [agar found by Robert A. Kraus 1971, stabilized by DRH 12/13/94] #C 2.11.2 #C 2.12.0 [agar found by Robert A. Kraus 1971, stabilized by ????] #C 2.12.1 "quilt" or "squaredance" [agar found by Don Woods, 1971, stabilized #C by DRH 3/25/93] #C 2.12.2 "ring of fire" [DRH 9/24/92] A "muttering moat"; i.e. an #C oscillator whose rotor consists of a closed loop of cells, #C each of which touches exactly 2 others. Also see 2.5.1. #C ---------------------------------------------------------------------- #C One other p3 is included as part of 12.4.0. #C #C 3.0.0 "caterer" [DRH 8/4/89] Both this and jam (3.0.1) supply a #C spark which is used, e.g., in 3.4.0-3.4.3, 6.5.2, 12.0.2, #C 12.0.3, 12.1.1, and 21.0.0. Also see the multiple caterer #C used in 12.4.0. #C 3.0.1 "jam" [AF 1988] #C 3.0.2 "2 eaters" [RWG 9/71] #C 3.0.3 "eaters plus" [RTW 7/91] #C 3.0.4 "biting off more than they can chew" [Peter Raynham 7/72] #C 3.0.5 "trice Tongs" [RTW 2/82] #C 3.0.6 "pulse" [DJB#46 7/73] #C 3.0.7 "pulsar 18-22-20" [DJB#47 7/73] Two copies of 3.0.6. #C 3.0.8 [RTW 4/82] #C 3.1.0 [DRH 8/89] volatility = 17/18, which was the maximum known #C for a p3 until 3.8.1 was discovered. #C #C Oscillators 3.1.1 to 3.1.3 all have rotors made of 3 cells in a #C triangle, but with different cycles. #C 3.1.1 "cuphook" or "MIT oscillator" [RCS 10/70] #C 3.1.2 "stillater" [RTW 9/85] #C 3.1.3 "1-2-3" [DJB#4 8/72] #C #C 3.1.4 [AF 8/22/94] Rotor consists of 2 copies of that in 3.1.2. #C 3.1.5 "germ" [DJB#9 9/72] #C 3.1.6 [DJB#7 <=1976] Same rotor as in "2 eaters". #C 3.2.0 "period three" [RTW 6/72] Can be reduced by 4 cells, by #C replacing the snakes by joined L tetrominos. #C 3.2.1 "mini pressure cooker" [RTW before 6/72] #C 3.2.2 "pressure cooker" [MIT group 9/71] #C 3.2.3 "hustler" [RTW 6/71] #C 3.2.4 "loading dock" [DJB#3 9/72] #C 3.2.5 "snake dance" [RTW 5/72] #C 3.2.6 "tubber" [RTW before 6/72] Rotor is confined to 2 parallel #C diagonals. Also see 4.2.4. #C 3.3.0 "diamond ring" [DJB#2 1972] #C 3.3.1 "new five" [DRH 1/90] #C 3.3.2 [DJB#92 7/26/76] #C 3.3.3 [DJB#103 6/3/77] Rotor has symmetry type "-c", but stator #C can't be made symmetric. (The left edge can be made 1 column #C narrower and 1 bit smaller by using a block below the snake.) #C 3.3.4 [DRH 10/89] #C 3.3.5 [DJB#79 6/6/76] (DJB found the smallest form of this, with #C just 1 2x3 rectangle. I don't know who found the wick.) #C #C Oscillators 3.4.0-3 are examples of "catered" oscillators. The #C necessary sparks can be supplied by either a caterer (3.0.0) or a #C jam (3.0.1). #C 3.4.0 [DRH 8/89] #C 3.4.1 [DRH 8/89] #C 3.4.2 [RTW 8/89] #C 3.4.3 "skewed traffic light" [RTW 8/89] #C #C 3.4.4 "double ewe" [RTW before 9/71] #C 3.5.0 "double caterer" [DRH 10/89] #C 3.5.1 "triple caterer" [DRH 10/89] Used in 6.6.0. #C 3.5.2 [DRH 1/90] Smallest known p3 in which a corner of the #C bounding box is active. #C 3.5.3 [AF 7/30/94 (symmetric form)] #C 3.5.4 "surprise" [DJB#10 11/72] #C 3.6.0 [DRH 9/10/89] #C 3.6.1 "bent keys" [DRH 8/89] #C 3.6.2 "short keys" [DRH 8/89] This is the shortest version of the #C left wick in 3.6.4. #C 3.6.3 [AF 7/13/94] #C 3.6.4 [left side by DRH 8/89, right side by Charles Trawick 6/71] #C 2 related wicks. The one on the right is "candelabra". The wick #C can also turn a corner, as shown in 3.7.2. #C 3.7.0 "candlefrobra" [RTW 11/84] Variant of "candelabra" (3.6.4). #C 3.7.1 "cross" [RTW 10/89] Same as 3.11.0. One of the few known #C oscillators in which one phase is a polyomino. Also see #C 3.7.2. #C 3.7.2 [HH 2/26/93] A larger version of 3.7.1, which may be made #C any size. #C 3.7.3 "star" [HH 2/16/93] Another polyomino. #C 3.7.4 [HH 3/5/93] Blocks may be added in any of the 4 corners of #C 3.6.3. #C 3.8.0 [DRH 1994] #C 3.8.1 [DRH 11/27/94] Volatility -> 1 as length increases. No #C finite p3 is known with volatility = 1. (Volatility = number #C of rotor cells divided by total number of cells in rotor and #C stator.) #C 3.9.0 [DRH 9/18/89] #C 3.9.1 "p3 rumbling river" [DRH 11/26/94] The rotor is connected #C and contained in a strip of height 2. #C #C In the next 3 rows, each oscillator in the left column consists of #C 4 quarters, which can be rearranged to form larger closed loops #C (middle column) or chains that aren't closed (right column). See #C 5.8.0-5.8.1 for another example. #C 3.10.0 "pulsar" or "pulsar CP 48-56-72" [JHC 3/70] The first #C known, and most commonly occurring, p3 oscillator. #C 3.10.1 "quasar" [RTW 8/71] #C 3.10.2 [???? before 11/27/94] #C 3.11.0 "cross" [RTW 1989] Same as 3.7.1. #C 3.11.1 [DRH 11/27/94] #C 3.11.2 [DRH 11/27/94] #C 3.12.0 [HH 3/5/93] #C 3.12.1 [DIB 3/7/93] #C 3.12.2 [RWG 9/22/94] #C ---------------------------------------------------------------------- #C Some other p4s are included as parts of oscillators with larger #C periods, namely 124.1.0-1 and 188.0.0-1. #C #C 4.0.0 "mold" [AF 1988] Period 4/2, symmetry type "n/". Supplies #C a 1-bit spark that's used, e.g., in 8.3.4, 16.1.1, several #C p28s, 32.1.1, 36.0.1, 36.0.2, 40.0.1, 52.0.1, 88.0.0, #C 100.0.1, and 200.0.0. #C 4.0.1 "mazing" [DJB#45 12/73] Period 4/2, symmetry type "/xk". #C 4.0.2 "monogram" or "JHC" [DRH 8/11/89] Period 4/2, symmetry type #C "+c*c". Supplies a spark that's used in 12.2.0-12.3.1. #C 4.0.3 [DRH 8/89] Period 4/2, symmetry type "/xk". Supplies a spark #C that's used in 4.13.1 and 4.17.1. #C 4.0.4 [DRH before 4/92] #C 4.0.5 [DRH 9/89] Supplies a spark that's used in 12.1.0. #C 4.0.6 "Achim's p4" [DJB#88 1976, AF 1988] DJB found a larger #C form of this, using the same pieces that occur in siesta #C (5.2.3) and sombreros (6.1.1). AF found the smaller version. #C The rotor consists of 2 copies of that in 4.2.6. #C 4.0.7 [DJB#23 <1973?] #C 4.1.0 "eater/block frob" [DJB#51 <=1976] #C 4.1.1 "confused eaters" [DJB#49 before 1973] Period 4/2, symmetry #C type "n/". #C 4.1.2 "pinwheel" [SN 4/70] Period 4/4, symmetry type "nrk". #C 4.1.3 "clock II" Period 4/4, symmetry type "nrk". #C 4.1.4 [DJB#28 before 1973?] Rotor is p4/2, symmetry type "rk*k". #C 4.1.5 "T-nosed p4" [RTW 1989] #C 4.1.6 [DRH 1994] A narrower but longer T-nosed p4 #C #C Oscillators 4.2.0 to 4.2.3 are examples of "babbling brooks", in which #C the rotor consists of a chain of cells, each one adjacent to only 1 or #C 2 others. At the time the collection was built, these were the only #C known babbling brooks with period > 2. I found another on 8/3/97: #C #C .......o........ #C .....ooo....oo.. #C ....o...oo..o... #C .o..o.oo..o.o... #C o.o.o....oo..oo. #C .oo..oo....o.o.o #C ...o.o..oo.o..o. #C ...o..oo...o.... #C ..oo....ooo..... #C ........o....... #C #C (For p2 examples, see 2.0.2, 2.1.3-5, and 2.1.7-8.) #C 4.2.0 [DJB#13 before 1973] Period 4/2, symmetry type "n/". #C 4.2.1 [DJB#15 <1973] #C 4.2.2 [DJB#104 6/3/77] #C 4.2.3 [DRH 11/10/94] #C #C 4.2.4 "wavefront" [DJB#24 <=1976] Rotor is confined to 2 parallel #C diagonals. Also see 3.2.6. #C 4.2.5 "Gray counter" [???? 1971] Also see 4.15.1. #C 4.2.6 [DRH 8/89] Also see 4.0.6. #C 4.3.0 [DRH 8/89] Period 4/2, symmetry type "n-e". #C 4.3.1 [DRH 8/89] Period 4/2, symmetry type "n-e". #C 4.3.2 [DRH 8/89] Period 4/2, symmetry type "n-c". #C 4.3.3 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.4 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.5 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.6 [DJB#21 <1973] #C 4.4.0 "penny lane" [DJB#123 1972] #C 4.4.1 [AF 8/22/94 (symmetric form), AWH 8/25/94 (using 2.8.1 for #C right half), DRH 11/23/94 (this p2 on right)] Only 3 cells #C are p4; the rest are p1 or p2. #C 4.4.2 [DJB#98 4/28/77] Period 4/2, symmetry type "n-e". #C 4.4.3 [RTW 1989] #C 4.4.4 [DJB#20 <1977] #C 4.5.0 "windmill" [DRH 11/89] #C 4.5.1 [AF 8/23/94 (symmetric form)] #C 4.5.2 [AF 7/17/94 (symmetric form), RWG,AWH 11/20/94] #C 4.5.3 [AF 8/31/94 (symmetric form)] #C 4.5.4 "boss" [DJB#30 1972] #C 4.5.5 [DJB#69 <=1976] #C #C In 4.6.0 to 4.6.5, only 2 cells are p4; the rest are p1 or p2. #C 4.6.0 [DRH 12/10/94] #C 4.6.1 [RTW 11/90] #C 4.6.2 [DRH 12/10/94] #C 4.6.3 [DRH 12/10/94] #C 4.6.4 [DRH 12/10/94] #C 4.6.5 [DRH 12/10/94] #C #C Oscillators 4.7.0 to 4.10.1 are all related. They are based on this #C infinite oscillator, in which a single row of cells is surrounded by #C 2 lines of blocks (or other things): #C #C oo..oo..oo.oo.oo.oo.o..oo #C oo..oo..oo.oo.oo.o.oo..oo #C ......................... #C ......................... #C ......................... #C ......................... #C ... ooooooooooooooooooooooooo ... #C ......................... #C ......................... #C oo.oo.o..oo.oo.oo..oo..oo #C o.oo.oo..oo.oo.oo..oo..oo #C #C This can be made finite in several ways. First, any of 3 small pieces #C can be attached to the ends. The first is shown in row 4.7. (Also #C see 8.0.5.) The others are shown in 4.8.1 to 4.8.3. (A much larger #C end piece is shown in 4.12.2.) Next, the line can be bent to form a #C corner, as in 4.8.4. If it's bent 4 times, it can form an octagon, #C as in 4.9.0 to 4.10.0. #C #C 4.7.0 "lightweight emulator" [RTW 6/80] #C 4.7.1 "middleweight emulator" [RTW 6/80] Supplies a 1-bit spark #C that's used, e.g., in 20.0.0-20.0.2, 24.1.2, 60.5.1, and #C 124.1.0. #C 4.7.2 "heavyweight emulator" [RTW 6/80] Supplies a domino spark #C that's used, e.g., in 8.3.3, 12.0.2, 12.4.0, 32.0.2, 36.1.2, #C and 44.0.0. #C 4.7.3 "overweight emulator" [RTW ????] #C 4.7.4 #C 4.8.0 [AF 7/13/94] May be compressed horizontally by 1 or 2 cells. #C Also see 4.8.1 and 4.8.3-4. #C 4.8.1 [DRH 7/14/94] Half of 4.8.0, supported by 2 clocks. (This #C use of a clock was discovered, in another universe, by DIB.) #C 4.8.2 [DRH 12/6/94] #C 4.8.3 #C 4.8.4 #C 4.9.0 [RTW ????, AF 8/7/94] An octagon of side 2, showing 2 ways to #C stabilize the edge. #C 4.9.1 [DRH 9/89] An octagon of side 3, showing 4 ways to stabilize #C the edge. #C 4.9.2 "octagon IV" [RTW 1/79] An octagon of side 4. The edges #C can also be stabilized using eaters or toads as in 4.9.1. #C This also works if a block is added in the center. #C 4.9.3 [DRH,RTW 9/89, AF 8/7/94] An octagon of side 5, showing 4 ways #C to stabilize the edge. #C 4.10.0 [AF,DRH 1994] A larger octagon. The corners can also be #C stabilized using eaters or toads as in 4.9.1. #C 4.10.1 [DRH 9/16/92] Stabilized p4 agar, made of several parallel #C lines. #C #C 4.10.2 [DRH ????] Period 4/2, symmetry type "+k*k". #C 4.10.3 [RTW before 10/92] The MW emulators (4.7.1) can be replaced by #C molds (4.0.0). #C #C Pattern 4.7.1 (MW emulator) is often useful because of its 1-bit #C spark. But in some applications the object being sparked would #C collide with the rest of the emulator. In such situations the #C oscillators below may be more useful. (Also see the p4 at the top #C of 124.1.0 and the one in 188.0.0.) #C 4.11.0 [DRH 1994] #C 4.11.1 "fountain" [DRH 11/28/94] Supplies a spark that's used in #C 24.1.0-24.2.1, 124.0.0-1, and 124.1.1. It can also be used #C (not shown) to double the period of a period 4N+2 MWSS stream, #C in a manner similar to that used in 60.5.1 to double the #C period of a LWSS stream. #C 4.11.2 [DRH 1994] #C #C 4.11.3 [AWH 2/10/95] #C 4.11.4 [DRH 4/6/92] #C #C Pattern 4.7.2 (HW emulator) has a useful 2-bit spark. But sometimes #C these are better: #C 4.12.0 [DRH >=11/30/94] Supplies a spark that's used in 12.0.3, #C 60.3.1, and 124.1.1. It can also be used (not shown) to #C double the period of a period 4N+2 HWSS stream, in a manner #C similar to that used in 60.5.1 to double the period of a #C LWSS stream. #C 4.12.1 [DIB,DRH 12/12/94] A longer but narrower version of 4.12.0. #C 4.12.2 [DRH 1994] #C #C 4.12.3 [RTW 9/91, DRH 1/14/95] First stabilization (not shown here) #C was found by RTW 9/91. #C #C 4.13.0 "sixty nine" [RTW 10/78] Period 4/4, symmetry type "nrk". #C #C 4.13.1 [RTW 9/89] Period 4/2, symmetry type ".crc". #C 4.13.2 [DRH 1/10/95] Period 4/4, symmetry type "nrc". #C 4.13.3 [DRH 1/10/95] Period 4/4, symmetry type "nrc". #C 4.14.0 [DRH 10/89] 2 related wicks. The one on the left is #C "turning toads"; it's related to the toad hasslers such as #C 60.1.0 - 60.1.4. #C 4.14.1 [DRH 8/89, AF 1994] #C 4.15.0 #C 4.15.1 [???? 1971] #C 4.16.0 [RTW 9/91] #C 4.16.1 [DRH ????, DIB 12/11/94] #C 4.17.0 [RWG 9/17/94 (wick), 11/20/94 (ends)] The repeating part of #C this wick may be attached to itself in 6 different ways. #C 4.17.1 [RTW 9/89] #C ---------------------------------------------------------------------- #C 5.0.0 "fumarole" [DRH 9/3/89] Supplies a domino spark that's used #C in traffic jam oscillators such as 50.0.0, 100.0.1, 110.0.0, #C 200.0.0. (The domino spark in a HW volcano (5.7.1) is more #C usable.) #C 5.0.1 "octagon II" [Sol Goodman & Arthur C. Taber 1971] #C 5.0.2 [AF 7/13/94] Also see 5.0.3. #C 5.0.3 [AWH 11/19/94] Skewed version of 5.0.2. #C 5.0.4 "pseudo barberpole" [AF 8/22/94] #C 5.0.5 [RTW 1/82, DJB#145 8/15/84] #C 5.0.6 [AF 7/27/94] #C 5.1.0 "technician finished product" [DJB#33 1/73] Also see 5.3.3. #C 5.1.1 "mathematician" [DJB#34 1972] #C 5.1.2 "aVerage" [DJB#35 1973] #C 5.1.3 [DJB#160 1/6/87] #C 5.1.4 [DJB#163 2/19/87] #C 5.1.5 [RTW 1/82 (DJB#146)] #C 5.1.6 "pentant" [DJB#85 7/11/76] #C 5.2.0 "toaster" [DRH 4/1/92] Supplies sparks that are used #C in 15.1.1. #C 5.2.1 "middleweight volcano" or "MW volcano" [DRH 4/6/92] Supplies #C sparks that are used in 10.0.3, 10.1.1, 15.1.1, 20.0.0, #C 20.0.2, all known p25s, 50.0.1, 80.0.0, 230.0.0, and 230.0.1. #C 5.2.2 "101" [AF 8/19/94] #C 5.2.3 "siesta" [DJB#57 1973] Also see 4.0.6, 6.1.1-6.1.4, and #C 8.3.0. #C 5.2.4 [DJB#158 2/25/85] #C 5.2.5 [DJB#101 5/22/77] #C 5.3.0 "chemist" [DJB#38 1973] #C 5.3.1 [DJB#84 7/76?] #C 5.3.2 [DJB#44 ????] #C 5.3.3 "pedestle" [DJB#39 1973] Rotor consists of 2 copies of #C the rotor in 5.1.0. #C 5.3.4 [DRH 1994] 2 fumaroles hassle a long barge. Based on 8.3.1. #C A different mechanism is used in 15.1.0. #C 5.4.0 [DJB#151 9/29/84] #C 5.4.1 [DJB#114 6/21/77] Also see 7.1.2 and 11.0.0. #C #C The next 2 are almost "period 5/2" oscillators: In each one, the top #C and bottom halves go through the same cycle, 2 gens out of phase. #C 5.4.2 [DJB#87 7/15/76] #C 5.4.3 [DJB#142 5/21/84] #C #C 5.4.4 [DRH 10/4/89] #C 5.5.0 "pentoad" [RWG 6/77] Also see 5.5.1 and 6.4.0. #C 5.5.1 "multiple pentoads" [RWG & Scott Kim ????] #C 5.5.2 [DJB#93 7/26/76] #C 5.5.3 [DJB#152 9/29/84] Also see 6.4.2. #C 5.5.4 [AF 8/7/94 (symmetric form), AWH 11/19/94] #C 5.6.0 "electric fence" [HH 10/20/92, DRH 11/23/92, 2/21/93] A #C stream of 'ants' moves leftward from the 'source' at the #C right to the 'sink' at the left. HH found a source that #C moves right at c/4, but no moving sink has been found. DRH #C found the stationary sink and later found the stationary #C source. Also see 5.7.0. #C 5.6.1 [DRH ????] There are 6 adjacent columns with only 1 active #C cell each. #C 5.7.0 "another electric fence" [DRH 1/26/95] Also see 5.6.0. #C 5.7.1 "heavyweight volcano" or "HW volcano" [DRH 2/5/95] Supplies #C sparks that are used in 10.0.3, 10.1.1, 30.4.0, 30.5.0, and #C 35.0.0. #C 5.8.0 "harbor" (so-named because gen 3 consists of 4 ships and #C 8 boats) [DJB#122 9/17/78] #C 5.8.1 [DRH 12/2/94] The pieces of harbor (5.8.0) can be #C rearranged in the same way as 3.10.0-3.12.2. #C ---------------------------------------------------------------------- #C Also see the p6 used in 18.0.1. #C #C 6.0.0 "unix" [DJB#48 2/10/76] Produces a 1-bit spark that's used #C in many oscillators. #C 6.0.1 "A for all" [DRH 3/6/93] #C 6.0.2 [AF 7/25/94] #C 6.0.3 "$rats" [DJB#36 1972] #C 6.0.4 "extremely impressive" [DJB#78 8/76] #C 6.0.5 [DJB#100 5/21/77] #C 6.0.6 [DJB#65 <=1976] #C 6.1.0 [AF 8/7/94 (symmetric form)] Note similarity to unix (6.0.0). #C #C The next 4 oscillators are closely related. Also see 4.0.6, 5.2.3, #C and 8.3.0. #C 6.1.1 "sombreros" [DJB#56 1972] #C 6.1.2 [DJB#133 11/16/80] Also see 6.1.1 #C 6.1.3 [DJB#58 <=1976] #C 6.1.4 [DJB#59 <=1976] #C #C 6.2.0 [DRH 8/89] Period 6/2, symmetry type ".e+e". #C 6.2.1 [DRH 8/89] Period 6/2, symmetry type ".e+e". #C 6.2.2 [AF 7/13/94] #C 6.2.3 [DJB#72 <=1976] #C 6.2.4 [DJB#102 6/3/77] #C 6.2.5 [RTW 1989] Also see 6.2.6. #C 6.2.6 [DJB#141 4/25/84] Also see 6.2.5. #C 6.3.0 [DRH 8/89] Period 6/2, symmetry type "n/". #C 6.3.1 [AF 7/26/94] #C 6.3.2 [DJB#132 10/30/80] #C 6.3.3 [DJB#117 9/1/77] #C 6.3.4 [DJB#121 3/4/78] Also see 32.0.0. #C 6.3.5 [DJB#110 6/19/77] #C 6.4.0 [DJB#99 5/12/77] Also see 5.5.0. #C 6.4.1 "trivial p6" [DRH 12/10/94] There are no period 6 cells; #C the left 7 columns are p2; the rest are p3. #C 6.4.2 [DJB#157 10/14/84] Also see 5.5.3. #C 6.4.3 [DRH 9/22/94] #C 6.5.0 "symmetric T-nosed p6" [AF 8/31/94] #C 6.5.1 "T-nosed p6" [AF 9/12/94] Supplies a spark that's used in #C 12.4.1. #C 6.5.2 [DRH 9/89] Period 6/2, symmetry type "-e+e". #C 6.5.3 [RTW 11/16/94] 4 unixes support a simple diagonal wick. #C 6.6.0 [right end:RTW 10/78, middle and left end:DRH 10/89] #C 6.7.0 [NDE 11/21/94] The wick (left end) was found by AF (8/19/94); #C NDE stabilized it; the variations are by DRH (11/22&27/94). #C 6.8.0 [wick by DJB 1973, ends by DRH 1995?] #C ---------------------------------------------------------------------- #C 7.0.0 "burloaferimeter" [DJB#40 1972] Also see 7.0.1. #C 7.0.1 "airforce" [DJB#41 1972] Rotor consists of 2 copies of #C the rotor in burloaferimeter (7.0.0). #C 7.0.2 [DJB#77 <=1976] #C 7.0.3 [DJB#106 6/6/77] Right half can also be turned upside-down #C and shifted up 2 units. #C 7.0.4 [DJB#109 6/19/77] Supplies a domino spark that's used in #C 21.0.0, 105.0.0, and 329.0.0. Also see 26.1.0, where an #C equivalent p7 gets phase-shifted by 2 gens. #C 7.1.0 [DRH 9/22/94] #C 7.1.1 [DRH 10/1/94] #C 7.1.2 [DJB#113 6/21/77] Also see 5.4.1 and 11.0.0. #C 7.1.3 [DJB#135 9/7/81] #C ---------------------------------------------------------------------- #C 8.0.0 "blocker" [RTW ????] Supplies a spark used in 16.0.1, 16.1.1-2, #C 24.1.3, 40.0.1, 72.0.0, and 360.0.0. #C 8.0.1 "Kok's galaxy" [Jan Kok 1971] Supplies a spark used in 56.0.0, #C 120.3.0, 128.0.0, and 856.0.0. #C 8.0.2 "figure 8" or "big beacon" [SN 1970] Supplies sparks used #C in 8.3.1-2, 8.5.0-2, 16.0.2, 24.1.1, 24.2.1, 32.1.1, 40.0.1, #C 40.1.0, 96.0.0, 120.3.0, 128.0.0, and 808.0.0. #C 8.0.3 "smiley" [AF 7/17/94] #C 8.0.4 [AF 7/20/94] Period 8/2, symmetry type ".cxc". #C 8.0.5 [DRH 11/16/94] A p8 variant of the p4 emulators; see #C 4.7.0-4.7.3. #C 8.1.0 "cauldron" or "crucible" [Don Woods, RTW 1971] #C 8.1.1 "Hertz oscillator" [JHC group 1970] #C 8.1.2 "R2D2" [Peter Raynham early 1970s (with a different stator), #C redeiscovered and named by NDE 8/14/94] #C 8.1.3 "pyrotechnecium" [DJB#42 1972] (This was mis-named #C "pyrotechneczum" for many years.) #C 8.1.4 [AF 8/26/94] Supplies a 2-bit spark, which might be usable #C when the one in figure 8 (8.0.2) fails. #C 8.1.5 [DJB#80 6/30/76] #C 8.2.0 [RTW 1989] #C 8.2.1 [DJB#115 6/22/77] #C 8.2.2 "roteightor" [RTW 1972] Also see 8.2.3. #C 8.2.3 "multiple roteightors" [DRH 1/90] A finite agar of any size #C can be constructed in this way. #C 8.2.4 [DJB#105 6/6/77] #C 8.3.0 [DJB#55 <=1976] #C 8.3.1 [RTW 9/84] 2 figure 8s hassle a long barge. Also see 5.3.4. #C A different mechanism is used in 15.1.0. #C 8.3.2 [AF 8/31/94] 4 figure 8s hassle a tub. #C 8.3.3 "p8, type 0 toad flipper" See discussion at 60.0.0. #C 8.3.4 [RTW 9/89] Period 8/2, symmetry type "/xk". #C #C The next 3 are closely related: #C 8.4.0 [DJB#90 7/16/76] #C 8.4.1 [DJB#138 1/23/83] #C 8.4.2 [DJB#94 7/29/76] #C #C 8.4.3 "bottle" [AF 8/7/94] Also see "ship in a bottle", 16.0.1. #C 8.5.0 "tumbling T-tetson" [RTW ????] #C 8.5.1 [DJB ????] "nonstandard type 1 p8 toad sucker" See #C discussion at 60.0.0. #C 8.5.2 [DJB ????] "nonstandard type 2 p8 toad flipper" See #C discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 9.0.0 "worker bee" [DJB#52 1972] #C 9.0.1 multiple worker bees #C 9.0.2 [DJB#43 1972??] #C 9.0.3 [DJB#83 7/10/76] #C 9.0.4 [DJB#155 10/9/84] #C 9.1.0 "snacker" [MDN 1972] #C 9.1.1 multiple snackers #C 9.1.2 [RWG 7/15/94] Based on 15.0.1. #C 9.1.3 [RWG 7/15/94] Based on 15.0.2. #C ---------------------------------------------------------------------- #C 10.0.0 [DJB#76 <=1976] #C 10.0.1 [DJB#161 1/21/86] #C 10.0.2 [DJB#153 9/30/84] #C 10.0.3 [DRH 2/16/95] 2 p5s hassle a blinker. Also see 10.1.1. #C 10.1.0 [DJB#139 5/1/83] #C 10.1.1 [DRH 2/16/95] 4 p5s hassle a blinker. Also see 10.0.3. #C ---------------------------------------------------------------------- #C 11.0.0 [DJB#112 6/20/77] Also see 5.4.1 and 7.1.2. #C 11.0.1 [AF 8/4/94] #C 11.0.2 [DJB#156 10/9/84] #C ---------------------------------------------------------------------- #C 12.0.0 "dinner table" [RTW 1972] Period 12/4, symmetry type "nrc". #C 12.0.1 [DJB#159 1986?] #C 12.0.2 [NDE 1/3/95] Supplies a spark that's used in 24.0.1, #C 48.0.0, 96.0.0, 132.0.0, 144.1.0, and 156.0.0. It should #C also be used in 36.1.2, but an earlier version of the p12 #C was inadvertently used there. Also see 12.4.0. #C 12.0.3 [DRH 1/4/95] A larger version of 12.0.2, with a more #C accessible spark. #C 12.1.0 [AF,AWH,RWG 8/8/94] First found on a 32x32 torus, without #C the outer p4s. #C 12.1.1 "baker's dozen" [RTW 8/89] Earlier versions used sparks #C from p4 and p6 oscillators. #C 12.1.2 [DJB#131 10/26/80] 4 baker's dozens, using only stable #C objects and each other for support. #C #C Oscillators 12.2.0 to 12.3.1 are variations on a p12 wick. #C 12.2.0 #C 12.2.1 [DJB <1980, RTW 1989] Originally supported by MW emulators; #C RTW found that monogram works too. #C 12.3.0 #C 12.3.1 "carnival shuttle" [RTW 9/84] Originally used MW emulators #C at the ends. ???? {see RTW's 11/10/89 ltr} #C 12.4.0 [MDN, DRH >~2/20/95] A wick based on 12.0.2, using a p3 #C multiple caterer. #C 12.4.1 [NDE 6/9/95] #C ---------------------------------------------------------------------- #C 13.0.0 [DJB#96 7/31/76] #C ---------------------------------------------------------------------- #C 14.0.0 "tumbler" [George Collins, Jr. 1970] Period 14/2, symmetry #C type "-c+c". #C ---------------------------------------------------------------------- #C 15.0.0 "pentadecathlon" or "PD" [JHC 1970] Supplies sparks used in #C ???? {mention phase changers} #C 15.0.1 [RTW 10/78] 2 PDs hassle 2 blocks symmetrically. Also see #C 9.1.2. #C 15.0.2 "Jolson" [RTW 11/84] 2 PDs hassle 2 blocks asymmetrically. #C 15.0.3 [DJB 3/73] 4 PDs hassle 4 blocks. #C 15.1.0 [DJB 7/73] 2 PDs hassle a long barge. Note that this is #C not the same mechanism as in 5.3.4 and 8.3.1. #C 15.1.1 "p15 biblock hassler" [DRH 2/21/95] See description #C at 16.1.1. #C 15.1.2 "loaflipflop" [RTW 1990] 4 PDs hassle a loaf. #C ---------------------------------------------------------------------- #C 16.0.0 [AF 7/27/94] Period 16/2, symmetry type "rc*c". #C 16.0.1 "2 pre L hassler" [RTW 7/83] 4 blockers hassle a pair of #C pre-loafs. Period 16/2, symmetry type ".k+k". #C 16.0.2 "sailboat" [RTW 6/84] The 2 p8 oscillators (figure 8 and #C Kok's galaxy) supply sparks which attack the boat in the #C same way, but it's not possible to use 2 copies of either. #C 16.1.0 "ship in a bottle" [RWG 8/7/94] Period 16/2, symmetry #C type "/xk". #C 16.1.1 "p16 biblock hassler" [NDE 2/20/95] 2 1-bit sparks (from #C a blocker (8.0.0) and a mold (4.0.0)) hassle a pair of #C blocks. Sparks can also come from oscillators of period 5 #C (see 15.1.1), 6 (see 18.1.0), 12, 29, 47, or 72 (not shown). #C The biblock creates a 1-bit spark of its own in gen 13, so #C it's possible to build a loop of 4 of them (see 52.0.1). #C Also see 16.1.2 for a symmetric version. #C 16.1.2 "symmetric p16 biblock hassler" [NDE 2/21/95] See #C description at 16.1.1. #C 16.2.0 [AF 8/7/94 (on a 32x32 torus), RWG 8/17/94] #C 16.2.1 [RWG 8/9/94 (ship inside), RWG 8/17/94 (toad hassler)] #C A nonstandard toadflipper; see discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 18.0.0 [DJB before 5/91] Period 18/2, symmetry type "n.e". #C 18.0.1 [DRH 1/1/95] 2-glider shuttle. See comments for 42.0.0. #C 18.1.0 "p18 biblock hassler" [NDE 2/20/95] See description #C at 16.1.1. #C ---------------------------------------------------------------------- #C 20.0.0 [NDE 3/22/95] A period 9+11 traffic light hassler. #C 20.0.1 [NDE 4/2/95] A period 10+10 traffic light hassler. #C 20.0.2 [NDE 6/29/95] Sparks from some p4 and p5 oscillators #C hassle a loaf. #C ---------------------------------------------------------------------- #C 21.0.0 [RTW 2/21/95] A period 10+11 traffic light hassler. #C ---------------------------------------------------------------------- #C 24.0.0 "p24, type 2 toadflipper" [RWG 1994] See discussion at 60.0.0. #C 24.0.1 [NDE 11/20/94] #C 24.1.0 [RWG 11/29/94] #C 24.1.1 [RWG 11/29/94] MDN found (not shown; 11/30/94) that an #C eater can be added at the top left in gen 14 to produce a #C rather inaccessible 1-bit spark. #C 24.1.2 [RWG 11/29/94] #C 24.1.3 [NDE 11/29/94] #C 24.2.0 [RTW 12/10/94] Produces a 2-bit spark that's used in #C 2 p48 toad hasslers (48.0.1-2). Also see 24.2.1. #C 24.2.1 [RWG 12/12/94] A variant of 24.2.0. #C ---------------------------------------------------------------------- #C All known p25 oscillators are based on pushing 2 or more traffic light #C predecessors 3 units in 14 gens and pushing them back in 11 gens. #C No way is known to do this with just one pre-t.l. #C 25.0.0 [NDE 9/23/94 (with toasters instead of eaters), DRH 10/19/94] #C 25.0.1 [NDE 11/5/94] #C 25.1.0 [NDE 11/5/94] #C 25.1.1 [NDE 11/18/94] #C 25.2.0 [NDE 11/18/94] #C ---------------------------------------------------------------------- #C 26.0.0 [DJB#140 1/18/83] #C 26.0.1 #C 26.1.0 [use of p7s in top by RWG 8/24/94; see RWG 10/30/94] #C ---------------------------------------------------------------------- #C All known p28 and p29 oscillators are "pulsar hasslers". Consider a #C pair of hollow 3x3 squares, with 3 empty columns between them: #C ooo...ooo #C o.o...o.o #C ooo...ooo #C After 15 generations, this becomes 4 hollow squares: #C ooo...ooo #C o.o...o.o #C ooo...ooo #C ......... #C ......... #C ......... #C ooo...ooo #C o.o...o.o #C ooo...ooo #C (This goes on to become a p3 "pulsar" in gen 20.) By repeatedly #C suppressing 2 of the hollow squares, we obtain oscillators of #C periods 30 and 60; see 30.2.0-3 and 60.5.0. #C #C It's also possible to suppress 2 of the squares in such a way that #C the other 2 form in gen 14 instead of 15; this leads to oscillators #C with periods 28 and 29. Originally this required 8 pairs of squares #C supporting each other; DJB found the first p28 ("newshuttle", not #C included in this collection) in 1973. Later, several methods were #C found which use either 1, 2, or 4 mutually supporting pairs. #C #C 28.0.0 #C 28.0.1 #C 28.0.2 #C 28.0.3 [RWG 7/31/94] #C 28.1.0 #C 28.1.1 #C 28.1.2 "smaller newshuttle" [DJB#64 8/2/80] #C 28.2.0 #C 28.2.1 #C 28.2.2 #C ---------------------------------------------------------------------- #C 29.0.0 #C 29.0.1 #C 29.0.2 #C 29.1.0 #C 29.1.1 #C 29.1.2 #C 29.2.0 [RWG 7/31/94] #C 29.2.1 "prime" [DJB#127 8/2/80] #C 29.2.2 #C 29.3.0 "p29 PD hassler" [RWG ????, DRH 12/13/94] 2 copies of #C 29.0.1 change the phase of a PD. Supplies a 2-bit spark #C that's used in 58.0.0. Also see 36.1.0 and 54.1.0. #C 29.3.1 #C 29.3.2 #C ---------------------------------------------------------------------- #C 30.0.0 "queen bee" or "p30 shuttle" [RWG 1970] The central #C part (the shuttle) reappears, reflected across a vertical #C line, in 15 gens, but a beehive is also produced, which #C would destroy the shuttle. The beehive can be destroyed #C by a block, as shown here, or by an eater in one of two #C different positions, as in 30.0.2. #C 30.0.1 "p30 glider gun" [RWG 11/70] #C 30.0.2 2 p30 shuttles push a beehive back and forth. This also #C demonstrates the 2 positions of an eater that stabilize #C the shuttle. #C 30.1.0 [NDE 10/30/94] 2 p30 shuttles repeatedly change the phase #C of a blinker. #C 30.1.1 [DIB 9/1/92] 2 p30 shuttles repeatedly reverse a loaf. #C 30.1.2 [RTW ????] 2 p30 shuttles repeatedly convert blocks to #C gliders. Also see 92.3.0. #C 30.2.0 "Eureka" [DJB#130 8/16/80] The simplest pulsar hassler. #C Can also be skewed, by moving one half up 2 units. #C 30.2.1 #C 30.2.2 #C 30.2.3 "pulshuttle V" [RTW 5/85] #C 30.3.0 "hectic" [RTW 9/84] Period 30/2, symmetry type ".crc". #C 30.3.1 "p30 LWSS gun" #C 30.4.0 [DRH 2/14/95] 4 p5s hassle a beehive. Also see 35.0.0. #C 30.4.1 [????] 6 gliders in a 180 gen loop. This use of a queen bee #C as a reflector is called a "buckaroo". #C 30.5.0 "zweiback" [MDN 2/13/95] #C ---------------------------------------------------------------------- #C 32.0.0 "gourmet" [DJB#120 3/4/78] Period 32/4, symmetry type #C "nrk". Also see 6.3.4. #C 32.0.1 "popover" [RTW 8/84] Period 32/4, symmetry type "nrk". #C 32.0.2 "pi portraitor" [RTW 1984 or 1985] Period 32/4, symmetry #C type "nrk" #C 32.1.0 [RTW 5/85] Period 32/2, symmetry type "n.c". Two gourmets #C overlap, sharing a loaf. It's possible to build an #C arbitrarily large agar this way. #C 32.1.1 [NDE 1/26/95] Period 32/2, symmetry type "-c+e". #C ---------------------------------------------------------------------- #C 35.0.0 [DRH 2/14/95] 4 p5s hassle a beehive. Also see 30.4.0. #C ---------------------------------------------------------------------- #C 36.0.0 [NDE 1/29/95] #C 36.0.1 "p36 traffic jam" [RWG 10/14/94] #C 36.0.2 [NDE 11/23/94] 2 copies of 36.0.1 change the phase of a PD. #C Also see 29.3.0 and 54.1.0. #C 36.1.0 "p36, type 0 toadflipper" [????] See discussion at 60.0.0. #C 36.1.1 "p36, type 1 toadsucker" [????] See discussion at 60.0.0. #C 36.1.2 [NDE 11/20/94] Could be made smaller using jams instead of #C T-nosed p4s. #C ---------------------------------------------------------------------- #C 40.0.0 [DJB before 5/91] #C 40.0.1 "p40 traffic jam" [NDE 10/14/94] #C 40.1.0 [DRH 11/4/94] A period 20+20 traffic light hassler. Period #C 40/2, symmetry type "-c+e". This use of a bookend as an #C eater also occurs in 25.0.1-25.2.0. #C ---------------------------------------------------------------------- #C 42.0.0 [RTW 9/84, MDN ??/94] A 2-glider shuttle, using a reaction #C in which an eater3 and sparks from 2 unixes reflect a pair of #C gliders. RTW found a period 66+24n version of this; MDN #C noticed that period 42 could be achieved by rearranging the #C unixes. The unixes can also be replaced by period 5 or 47 #C oscillators, giving periods 50+40n (see 50.0.1) and 282+376n #C (see 282.0.0), or by a larger p6 oscillator, giving period #C 18 (see 18.0.1). Also, by a lucky coincidence, the spacing #C between the gliders allows 2 pairs of gliders to cross using #C rephasers, giving periods 246+24n (see 246.0.0), 230+40n #C (see 230.0.0), and 846+376n (not shown). #C ---------------------------------------------------------------------- #C 44.0.0 [DJB 4/2/92] (OBSOLETE: About 4/29/96, NDE found a simpler #C version: Advance the MW emulators 3 gens and delete the 2 #C blocks closest to them.) #C 44.0.1 "p44 glider gun" [DJB 4/2/92] Large sparks from 2 p44 #C oscillators combine to produce gliders. (OBSOLETE: In 10/96, #C DJB found a p44 gun using only 1 p44 oscillator.) #C ---------------------------------------------------------------------- #C 45.0.0 A p15 PD (15.0.0) and a p9 snacker (9.1.0) interact almost #C trivially. #C ---------------------------------------------------------------------- #C Period 46: The p46 shuttle, known as "twin bees", was discovered in #C 1971 by Bill Gosper. Each end of the shuttle can be stabilized by #C either 1 or 2 blocks, as shown in 46.0.0. If only 1 block is used, #C a large spark is produced which can reflect gliders and spaceships #C in several ways. Two shuttles can be combined in at least 5 ways to #C produce glider guns (46.1.0, 46.1.1, 46.2.0, 46.3.0, and the right #C half of 92.4.0). Also see periods 92, 138, 184, 230, 276, 460, 552, #C 690, and 40894. #C #C 46.0.0 "twin bees" or "p46 shuttle" [RWG 1971] #C 46.0.1 [????, DRH 10/26/94] 2 shuttles push a beehive back and forth #C using 2 different reactions. Also see 92.0.0. #C 46.1.0 [RWG ???? {before 3/92}] A p46 glider gun #C 46.1.1 [RWG ???? {before 12/30/90}] Double-barreled p46 glider gun #C 46.2.0 [PC 6/24/94] A p46 glider gun. This one is useful for #C creating gliders parallel to an existing glider stream, #C as in 46.4.0. #C 46.2.1 [RWG <=1992] p46 LWSS gun, based on a 135 degree glider -> #C LWSS reflection. #C 46.3.0 "newgun" [RWG 1971] The first known p46 gun. #C 46.3.1 [RWG <=1992] p46 MWSS gun, based on a 135 degree glider -> #C MWSS reflection from a pair of p46 shuttles. (This glider + #C pre-block -> MWSS reaction is very useful; see 60.6.0 and #C 120.2.0.) #C 46.4.0 [DJB ????, DRH 12/31/90?] p46 HWSS gun. DJB found the only #C known 3-glider synthesis of a HWSS. #C 46.5.0 [DJB? ????] Pseudo p23 gun. The outputs of 2 p46 guns are #C interleaved to produce a p23 glider stream. (Also see #C 60.6.0.) #C 46.5.1 [PC,DRH 1994] p46 glider gun based on a 90 degree #C reflection that changes 1 glider to 2. Also see 230.1.0. #C 46.6.0 "p46 LWSS loop" [Peter Rott 11/93, PC 1994] Based on a #C 90 degree LWSS reflection. #C ---------------------------------------------------------------------- #C 47.0.0 [DJB#137 12/5/82] #C 47.0.1 [???? before 9/92 (horizontal stacking), RWG before 9/92 (skewed #C vertical stacking)] It's possible to build an arbitrarily #C large agar this way. #C ---------------------------------------------------------------------- #C 48.0.0 [RTW 1995] Sparks from 2 p12s move a pair of beehives. #C 48.0.1 "p48, type 2 toadflipper" [RWG 12/11/94] See discussion at #C 60.0.0. #C 48.0.2 "p48, type 2 toadsucker" [RWG 12/11/94] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 50.0.0 "p50 traffic jam" [NDE 10/16/94] Period 50/2, symmetry #C type "n-e". #C 50.0.1 [DRH 3/19/92 (using early version of toaster)] 2-glider #C shuttle with period 50+40n. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 52.0.0 [DJB#119 10/1/77] Period 52/4, symmetry type "nrc". #C 52.0.1 [NDE 2/21/95] Period 52/4, symmetry type "nrk". See #C description at 16.1.1. One can also have two pulses #C traveling around the loop separated by 16, 20, or 24 gens, #C or three pulses separated by 16+16+20. #C #C ---------------------------------------------------------------------- #C 54.0.0 [DJB#62 <=1976] This is based on the twin bees shuttle #C (46.0.0). Also see centinal (100.0.0). #C 54.0.1 #C 54.1.0 [DJB before 5/91] 2 p54 shuttles change the phase of a PD. #C Also see 29.3.0 and 36.1.0. #C ---------------------------------------------------------------------- #C 55.0.0 [DJB#162 1/26/86] #C ---------------------------------------------------------------------- #C 56.0.0 [DJB before 5/91] #C 56.0.1 "nonstandard p56 toadsucker" [RWG 10/25/94] See discussion #C at 60.0.0. #C 56.0.2 "nonstandard p56 toadflipper" [RWG 1994] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 58.0.0 "p58, type 3 toadsucker" [RWG,MDN 10/25/94 (using larger #C p29s), DRH 12/13/94] See discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 60.0.0 "p60 glider shuttle" [???? <=1971] #C 60.0.1 [AF 7/18/94] 2 p30 shuttles push a blinker up and down. #C #C A "toad hassler" is an oscillator in which a toad is changed by a #C pair of domino sparks above and below it. It either moves 1 unit #C sideways ("toadsucker") or changes its orientation ("toadflipper"). #C Amazingly, there are 5 different positions for the sparks which #C work; I call them "type -1" through "type 4", depending on the #C horizontal distance between the top and bottom sparks. The odd types #C are toadsuckers; the even ones are toadflippers. Given a period N #C oscillator which produces accessible domino sparks once per period, #C the resulting toad hasslers have period 4N if N is odd, 2N if N is #C even. However, there are also some toad hasslers in which the period #C is smaller, either because the sparks occur more than once per period #C (see 58.0.0) or because the interaction with the spark is more #C complicated (see 8.5.1-2, 16.2.1, and 56.0.1-2). Oscillators 60.1.0 #C to 60.1.4 show the 5 standard toad hassler geometries; see 8.3.3, #C 36.1.0-1, 108.0.0-1 for more examples. Toad hassling was apparently #C first discovered by RTW in 6/84, using sparks from PDs and snackers to #C give p60 and p36 oscillators. #C 60.1.0 "p60, type -1 toadsucker" #C 60.1.1 "p60, type 0 toadflipper" #C 60.1.2 "p60, type 1 toadsucker" #C 60.1.3 "p60, type 2 toadflipper" #C 60.1.4 "p60, type 3 toadsucker" #C #C 60.2.0 "p60 glider gun" or "twogun" #C [V. Everett Boyer & Doug Petrie <=1973] #C 60.2.1 "p60 end-to-end glider gun" #C 60.3.0 #C 60.3.1 "overwrought p60" [NDE 2/18/95] 2 modified Eurekas (30.2.0) #C and a p4 2-bit sparker (4.12.0) push a traffic light back #C and forth. #C 60.4.0 "metamorphosis II" [RTW 12/13/94] Illustrates a glider to #C LWSS reflection from a pair of p30 shuttles [found by #C Paul Rendell before 1/20/86, rediscovered by PC 12/9/94], and #C a symmetric collision between 2 LWSSs which makes 2 gliders. #C 60.4.1 This demonstrates a reaction [???? 1971?] in which gliders #C hitting a snake alternately create and destroy a boat. This #C can be used as a memory device (called a "boat-bit"); see #C 15240.0.0. #C 60.5.0 "twirling T-tetsons II" [RTW 1989] Period 60/4, symmetry #C type "nrk". #C 60.5.1 "p60 LWSS gun" [DRH 1/28/91?] A MW emulator deletes half of #C the outputs of a p30 LWSS gun. (There are also oscillators #C which can do the same for MWSS or HWSS streams; see 4.11.1 #C and 4.12.0.) #C 60.6.0 "p60 MWSS gun" This glider + pre-block -> MWSS reaction is #C very useful; see 46.3.1 and 60.6.0. #C 60.7.0 "pseudo p20 glider gun" [DRH 12/19/91] 3 p60 glider streams #C are merged to form a p20 stream. This uses a head-on #C collision between a glider and a pair of gliders to insert #C gliders into an existing glider stream. Using this reaction, #C a pseudo period N gun can be built for any N>=19. More #C complicated methods are known for getting periods 14 to 18. #C (Also see 46.5.0.) #C ---------------------------------------------------------------------- #C 72.0.0 [RTW 7/90] #C ---------------------------------------------------------------------- #C 75.0.0 "glider shuttle III" [RTW 9/84] #C ---------------------------------------------------------------------- #C 80.0.0 [DRH 10/28/94] A p16 (16.2.0) and a MW volcano (5.2.1) #C interact almost trivially. #C ---------------------------------------------------------------------- #C 88.0.0 [DRH 1994] A variant of 44.0.0. #C ---------------------------------------------------------------------- #C 90.0.0 "p90 glider shuttle" #C 90.0.1 [DIB 11/30/93] A glider shuttles between 2 pairs of p30 #C shuttles. At each end it turns into a boat and then back #C into a glider. The spark that turns the glider into a boat #C is symmetric, so this reaction can also be used to shift a #C glider's path by 2 units without reversing its direction. #C Also see 184.0.0 and 276.0.0. #C 90.1.0 "p90 glider gun" [DRH ????] #C ---------------------------------------------------------------------- #C 92.0.0 [RWG 5/28/92] 2 p46 shuttles push a beehive back and forth. #C Also see 46.0.1. #C 92.1.0 [NDE 11/23/94] 2 p46 shuttles push a blinker back and forth. #C 92.2.0 [DRH, NDE 1/15/95] 2 p46 shuttles repeatedly reverse a loaf. #C 92.3.0 [RTW 3/91] 2 p46 shuttles repeatedly convert blocks to #C gliders. Also see 30.1.2. #C 92.4.0 "p92 glider gun" [DRH 1/7/91] Made from 2 overlapping p46 #C guns. #C ---------------------------------------------------------------------- #C 96.0.0 "p96 Hans Leo hassler" [NDE 1/28/95] A p12 sparker #C (12.0.2) changes a traffic light into a B-heptomino; an #C eater and a figure 8 change it back. Also see 132.0.0, #C 144.1.0, and 156.0.0. #C ---------------------------------------------------------------------- #C 100.0.0 [RWG before 9/87] "centinal" Related to 46.0.0 and 54.0.0. RWG #C created a huge (13584x12112) p1100 glider gun from this. #C 100.0.1 "p100 traffic jam" [NDE 10/15/94] #C ---------------------------------------------------------------------- #C 105.0.0 A p15 PD (15.0.0) and a p7 (7.0.4) interact almost trivially. #C ---------------------------------------------------------------------- #C 108.0.0 "p108, type 0 toadflipper" See discussion at 60.0.0. #C 108.0.1 "p108, type 1 toadsucker" [DJB before 5/92] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 110.0.0 "p110 traffic jam" [RWG 10/17/94] #C ---------------------------------------------------------------------- #C 120.0.0 "p120 glider gun" [DRH 1/13/91] A blocker can convert a #C period 8n+4 glider gun to period 16n+8. #C 120.0.1 [MDN ????] #C 120.1.0 "p120 LWSS gun" [DRH 1/28/91] A blocker can convert a #C period 8n+4 LWSS gun to period 16n+8. #C 120.2.0 "p120 MWSS gun" [????] This glider + pre-block -> MWSS #C reaction is very useful; see 46.3.1 and 60.6.0. #C 120.3.0 "p120 HWSS gun" [DJB ????] #C ---------------------------------------------------------------------- #C This mechanism was known for years before a way was found to make it #C work. A "lumps of muck" predecessor is hassled on the left starting #C around gen 15, causing its left half to disappear. The right half #C is hassled at the top starting around gen 55, causing another LoM #C predecessor to form in gen 62. The process is repeated, rotated 180 #C degrees. #C 124.0.0 [clock+eater+block by DRH ????, 4.11.1 by RWG 11/30/94] #C Smallest known version. #C 124.0.1 [DRH ????] An arbitrarily large agar can be built. #C 124.1.0 [eater3 by DJB? ????, MW emulator by MDN? ????, #C eater+p4 by DRH ????, 4.11.0 by ???? ????] #C 124.1.1 [4.12.0 by RWG 11/30/94, eater+p4 by DRH ????] #C ---------------------------------------------------------------------- #C 128.0.0 [DJB before 11/91] 2 B-heptominoes move around a track of length #C 256 gens formed from p8 oscillators. Also see 808.0.0. #C ---------------------------------------------------------------------- #C 132.0.0 "p132 Hans Leo hassler" [NDE 1995] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; a unix changes #C it back. Also see 96.0.0, 144.1.0, and 156.0.0. #C 132.0.1 [DJB before 8/94] A variant of 44.0.0. #C ---------------------------------------------------------------------- #C 135.0.0 [RWG 1989] A 2-glider shuttle, combining a rephaser and the #C reflections from 75.0.0. Also see 150.0.0. #C ---------------------------------------------------------------------- #C 138.0.0 [RWG ????] Glider loop based on a 'flawed' 180 degree #C glider reflection. The first reflection leaves behind a #C pond, which the next deletes, so gliders must occur in #C pairs. (But see 552.0.0.) The length of the loop may be #C anything of the form 138+184n. #C ---------------------------------------------------------------------- #C 144.0.0 [AF 7/21/94, DIB 8/8/94] Found by AF on a cylinder of #C height 22 (without the outer blocks) and originally #C stabilized using figure 8s. The use of blocks (which #C temporarily become loaves) was found by DIB. #C 144.0.1 "p144 glider gun" [RWG 7/22/94] Uses a spark from 72.0.0 #C to turn a block produced by 144.0.0 into a glider. #C 144.1.0 "p144 Hans Leo hassler" [NDE 1/4/95] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; an eater changes #C it back. Also see 96.0.0, 132.0.0, and 156.0.0. #C ---------------------------------------------------------------------- #C Also see p150 glider gun in 2700.0.0. #C #C 150.0.0 [DRH 1989] A 2-glider shuttle, combining a rephaser and the #C reflections from 90.0.0. Also see 135.0.0. #C 150.0.1 [RTW <=1989] A p150 2-glider shuttle, extensible to period #C 150+120N. Also see 165.0.0. #C ---------------------------------------------------------------------- #C 156.0.0 "p156 Hans Leo hassler" [NDE 1/4/95] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; an eater changes #C it back. Also see 96.0.0, 132.0.0, and 144.1.0. #C ---------------------------------------------------------------------- #C 165.0.0 [RTW <=1989] A p165 2-glider shuttle, extensible to period #C 165+120N. Also see 150.0.1. #C ---------------------------------------------------------------------- #C 184.0.0 [DRH 1/24/92] Glider shuttle based on 180 degree reflection: a #C p46 spark turns the glider into a block; the next spark turns #C it back into a glider. The period can be anything of the #C form 184+92n. Also see 276.0.0 and 90.0.1. #C ---------------------------------------------------------------------- #C 188.0.0 "pseudo p94 gun" [DJB,RCS,PC 7/11/94] A pre-honey farm #C interacts with an eater and a block, emitting a glider, #C creating a traffic light, and forming another pre-honey farm #C 47 gens later; this reaction is called "AK47". The new #C pre-h.f. interacts with another eater and block to recreate #C the original configuration. Unfortunately, the 2 traffic #C lights must be suppressed in order to make the process repeat #C every 94 gens. This reaction was found independently by DJB #C and RCS and was known for years before PC found a period 4 #C oscillator which could suppress the traffic lights. (A true #C p94 gun was built by DRH in 6/90, using 36 AK47s.) #C 188.0.1 "p188 glider gun" [DRH 7/19/94] #C ---------------------------------------------------------------------- #C 200.0.0 "p200 traffic jam" [RWG 10/16/94] (ERROR: This isn't an #C oscillator; it becomes one in gen 60.) #C ---------------------------------------------------------------------- #C 230.0.0 [DRH 3/19/92 (using early version of toaster)] 4-glider #C shuttle with period 230+40n. See comments for 42.0.0. #C 230.0.1 "obnoxious p230" [RWG 5/28/92] Sparks from a p46 shuttle #C interact 3 times with sparks from a p5 MW volcano; one #C interaction makes a temporary blinker; another makes a #C temporary glider. #C 230.1.0 [PC 6/28/94] p230 glider gun based on 2 LWSS reflections from #C p46 oscillators. In one, the LWSS is turned 90 degrees; in #C the other it becomes 2 parallel gliders. Also see 46.5.1. #C ---------------------------------------------------------------------- #C 240.0.0 2-glider shuttle. Uses the same 180 degree reflection as #C 60.0.0, combined with 2 rephasers. #C ---------------------------------------------------------------------- #C 246.0.0 [DRH 11/89 (p270+24n), 4/92 (p246)] 2-glider shuttle with #C period 246+24n. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 276.0.0 [DRH 1/24/92] Glider shuttle based on the same reflection #C as in 184.0.0. Also see 90.0.1 #C 276.1.0 "4-barrelled p276 glider gun" [DJB before 11/92] #C ---------------------------------------------------------------------- #C 282.0.0 [RWG 9/13/92] 2-glider shuttle. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 300.0.0 [MDN 10/27/94] Sparks from a pentadecathlon (15.0.0) and a #C centinal (100.0.0) interact to form a temporary block. #C ---------------------------------------------------------------------- #C 329.0.0 A p47 (47.0.0) and a p7 (7.0.4) interact almost trivially. #C ---------------------------------------------------------------------- #C 360.0.0 "p360 2-barelled glider gun" [DJB before 10/92] #C ---------------------------------------------------------------------- #C 400.0.0 "p400 glider loop" [RWG 1987] A glider bounces between 4 #C centinals. By expanding the loop and using more than one #C glider, oscillators of period 100N can be built for any N. #C ---------------------------------------------------------------------- #C 460.0.0 [DJB 1992, DRH 1995] p460 glider gun based on a reaction #C found by DJB which converts 2 gliders to 3 gliders. One #C glider escapes; the others are reflected by p46 shuttles #C to repeat the reaction. Given a period P oscillator which #C can reflect a glider 90 degrees, we can build a gun whose #C period is any multiple of P that's >= 452. (DJB originally #C used this to build a p500 gun, using centinals (100.0.0) to #C reflect the gliders.) #C ---------------------------------------------------------------------- #C 552.0.0 [RWG ????, DRH 1/23/92] Glider loop based on the same #C reflection as in 138.0.0. Here the ponds are deleted by a #C p8 blocker. The period of the loop can be anything of the #C form 138+184n, but the period of the oscillator is 4 times #C that. #C ---------------------------------------------------------------------- #C 690.0.0 [DRH 1/3/91] Sparks from a p46 shuttle interact 6 times with #C sparks from a p15 pentadecathlon; one interaction makes a #C temporary blinker. #C ---------------------------------------------------------------------- #C 808.0.0 "p808 glider gun" [DJB before 11/91] A B-heptomino moves around #C a track made of various eaters and p8 oscillators; it makes #C 4 moves each of durations 64, 65, and 73. Also see 128.0.0. #C (In 1996, DJB found several B-heptomino moves using only #C stable objects to form a track, thereby producing guns of #C all periods >= 62.) #C ---------------------------------------------------------------------- #C 856.0.0 "p856 glider gun" [DJB before 11/91] #C ---------------------------------------------------------------------- #C 2700.0.0 "crystallization and decay oscillator" [DRH 3/27/90] #C Extensible to period 2700+1950N. A p150 gun shoots gliders #C toward a pair of PDs. The first is reflected 180 degrees #C and hits the second, forming a honey farm. Subsequent #C gliders grow a crystal back toward the gun; every 11 #C gliders add another pair of beehives to the crystal. #C Eventually, an eater stops the growth and the crystal #C begins to decay: two successive gliders delete one pair of #C beehives. (This is based on an earlier pattern found and #C lost by RWG, using a p46 gun.) #C ---------------------------------------------------------------------- #C 15240.0.0 "p120-based PRNG" [DRH 3/21/92] Pseudo random number #C generator, based on an earlier pattern by RWG (a larger #C version of 40894.0.0). Produces a sequence of bits b[n], #C represented by gliders, satisfying the recurrence #C b[n] = b[n-1] XOR b[n-7]. The sequence has period 127, #C so the period of the pattern is 120*127. Increasing the #C separation between the NW and SE parts by 15N units #C diagonally changes the 7 above to K=7+N (N >= -4). The #C period of the sequence depends rather erratically on K: #C #C K | 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #C P | 3 7 15 21 63 127 63 73 889 1533 3255 7905 11811 32767 #C #C K | 16 17 18 19 20 21 22 23 #C P | 255 273 253921 413385 761763 5461 4194303 2088705 #C #C K | 24 25 26 27 28 29 #C P | 2097151 10961685 298935 125829105 17895697 402653181 #C #C K | 30 31 32 33 #C P | 10845877 2097151 1023 1057 #C #C Also see 40894.0.0. (In 1996, DRH built a p30-based PRNG.) #C This uses a "boat-bit", a reaction in which gliders hitting #C a snake alternately create and destroy a boat. #C ---------------------------------------------------------------------- #C 40894.0.0 "p46-based PRNG" [RWG ????, DRH 1/10/95] Pseudo random #C LWSS generator. Produces a sequence of bits b[n], #C represented by LWSSs, satisfying the recurrence #C b[n] = b[n-1] EQV b[n-10]. The sequence has period 889, #C so the period of the pattern is 46*889. Moving the bottom #C right gun and the reflector at the right edge 46N units #C farther right changes the 10 above to K=10+4N (N>=0). #C The period of the sequence depends on K as indicated in #C the description of 15240.0.0. x = 3145, y = 396, rule = B3/S23 6b2o5b2o4bo14b2o14b2o5bo5b2o4b2o4b2o15b2o5b2o7b2o4b2o18b2obo128b2o4b2o 111b2o18bob2o42bo11b2o56b2o130bo137bo131bo72b2o3b2o46b2o3b2o128bo195b 2o10b2o27b2o4b2o4b2obo31bo68bo124bo4bo50b2obo6b2obo130bob2o6b2obo25bo 213b2o4b2o113b2o9b2o17b2o9b2o123b3o106b2o12b2o152bo7bo123b2o5b2o174b2o $7bo5b2o3bobo13bobo13bobo3bobo4bo4bo2bo3bo2bo13bobo4bobobo3bo2bo3bobo 17bob2o64bo64bo5bo93b2o3b2o10bo2bo17b2obo41bobo11bo11b2o22b2o18bo2bo 19bob2o32b2o22b2o47bobo136bo130bobo70bo2bobo2bo44bo2bobo2bo44b2obo6b2o bo69bobo192bobo10bobo27bo5bo4bob2o18bo10b5o41bo22b5o10bo109b3o4b3o15bo 4bo27bob2o6bob2o130b2obo6bob2o24bob2o211bobo2bobo114bo9bo19bo9bo225b2o 2b2o2bo14bo2b2o2b2o143bobo5bobo122b2o5b2o174b2o$6bo12bo15bo15b2o4bobo 4bo4b2o6b2o14bobo6b2o4bobo5bo21b2o7bo11bo25b2o13b3o34b3o10b3o13bo5bo 22bo23bobo9bobo32bo2bobo2bo10b2obo14b2o45bobo11bob2o8bo2bo19bobo15bo3b obo19b2obo32b2o22bo20bo9bo17bobo125b2o7bo3bo128bobo66b2o3b2o3b2o3b2o 36b2o3b2o3b2o3b2o40bob2o6bob2o52bo17bobo189b3o14b3o24bo5bo3b2o11b2o8b 2o9b2obo2bo23b2o15b2o13b2o5bo2bob2o9b2o8b2o97bo10bo12b3o4b3o23b2o8b2o 4b2o132b2o8b2o22bob2o213b4o115bo11bo17bo11bo122bo3bo97bo2bo2bobo14bobo 2bo2bo144bo7bo$6b2o50bo4b2o29bo14bo6b2o20bo8bo11bo14b2o9bo13bo13b2o8b 3o40b2o4b2o10bobo7bobo8b2o3b2o7bobob2o6bo2bo15bobo2bob3o6bob2ob2obo13b o2bo12bo14b2o14b2o12b2ob2o9b2obo10bobo16bo2bob2o12b7ob2o22b2o10bo44bo 18bobo7bobo13b2obob2o67b2o55b4obo4b3o8b2o118b2ob2o65bo15bo36bo15bo44b 2o2b2o4b2o50b2o16bo2bo3b2o179b2obo3bo12bo3bob2o20b2o4b2o2bo12b2o7b2o9b o7bo22b2o16b2o11bo2bo3bo7bo9b2o7b2o97b2o8b2o11bo10bo22bo9bo5bo8bo4bo 75b2o13b2o28bo8bo24b2o212bo2b2o2bo113b2o9b2o17b2o9b2o122bo3bo98b2ob3ob 2o12b2ob3ob2o336b2o5b2o$139bo6b2obo8b2obo12bo7b2obo14bo9b2o2bo21bo4bo 7bo18bob2o15bo18bobobo6b2o4bo10bo14bo2bobobobo6b2o7b2o7b4obobobo10bo 13bo4bo11bo2bo12bobo11bobo28bobobo3bo10bo8bo24bo9bobo18b4o18b3obob2o 14bobo7bobo13bob2o4bo65bobo54bobo2b3o2b3o4bob4o118bo2bo2bo60b2obo15bob 2o30b2obo15bob2o41bo3bo5bo46b2o4b2o15bobo4b2o27bo18bo130bo5bob2o12b2ob o5bo20bob2o5bo21b2o2b2o5b2obo2bo36b2o2b2o13b2o5bo2bob2o5b2o2b2o130b2o 8b2o23bo9bo5bo5b2ob4ob2o71bo2bo6bo6bo2bo25bo10bo237bo2b2o2bo116b2obob 2o23b2obob2o72bo156bobobobo14bobobobo337b2o5b2o115bo$6b2o130b2o9b2o6bo 3b2o9bobo6bo2bo12bo2bo8bo12bo4bo7bobo3bo5bo7bo12b2obo11bo2bo6b2o3bo7b 2ob2o10b3o9b3o2b3o8bo17bobobobo8bo5bobobo10b2o12bo4bo10bo4bo9b3ob3o7b 3ob2o11bobo14bo2bo3b3o8bob2o5bo23bo9bobobo16bo4bo16bo2bobobo2bo9b2obob 2o5b2obob2o14b3obo67bo69b3o2bobo119bob6o57bobob2o13b2obobo28bobob2o13b 2obo2bo40bo3bo5bo18bo22b2o2b2o4b3o13bobo33bobo16bobo129bo5bo18bo5bo20b 2obo4b2o33b5o64b5o117bo14bo43b2o8b2o4b2o7bo4bo64b2o6bo10bo10bo6b2o16b 2o8b2o12b2o12b2o211bo2bo113b3ob3o3b3ob3o13b3ob3o3b3ob3o67bo11bo41b3o 93bo4bo9bo10bo9bo4bo140bo5bo306bobo$7bo126b2obo8bo9bobo13b2o7bo15bo11b obobo7bobo3bo5b3o2bo2bo5b4o4bo16b2o8bobobo6bo5bo6bobobo6b2obo2bo6b3o2b 3o18bo8b2o7b2o5bobobo5bo13bob2o8bo4bo9bo6bo10bobo11bobo32bo5bo9bobo5bo bo21b2o8bobobo13bo2bo3bobo16b3obobob2o9bob2o2bo5bo2b2obo14bo21b2o4b2ob o8bo29bob2ob2o28bo25b2o131bo2bobobo5bo56bobo5b3o3b3o5bobo28bobo5b3o3b 3o5bob2o39b2o2b2o4b2o17bobo21b2o2b2o4b2o7bobo4bo34bo3b2o2b2o9bo3b2o 127bo5bob2o12b2obo5bo24b2o4b2obo31bo68bo119bo14bo7bo14bo22b2obo4bo5bo 22bo55b2o6bo10bo10bo6b2o14b2o6b2obo14b2o12b2o219b2o106bo2b2o2bobobo2b 2o2bo11bo2b2o2bobobo2b2o2bo65b3o10bo136bobo2bob3obob3obo8bob3obob3obo 2bobo138b3o3b3o304bo3bo$6bo5b2o6bo6b2o7b2o7b2o4b2o5bo6bobo6b2o58bob2o 8b2o8bo2bo9b2o12bo11b2o2bo8b2o3bo7bo2bo2bo11bo11bo3bo17bo8bo2bo10bobo 6b2o3b2o8bo2bo12bo10bobobobo2bo9bob2ob2obo6bobobob4o14b2obo9bo2bo10bo 6bo10bobo11bob3o12bobo16b5o12bo5b2obo18b2o7b2obo3bob2o9bobobobobobo2bo 10b3o4bobo16b2o7b2o19b3o2b2o15bo4bob2o8b3o7b2o18b2o4bo17b2o9bo25bo12b 2o118b4obo2b2o2b2o54b2o2bo5bobo3bobo5bo2b2o24b2o2bo5bobo3bobo5bo38b2ob o4bo5bo17bo3b2o28b2o9b2o39bo3b2obo2bo8bo3b2o123bo5b2obo3bo12bo3bob2o5b o21bo4bob2o220bo6b2o6bo7bo14bo22bob2o5bo5bo22b2o8bo4bo47bo21bo23bo6bob 2o249b3o105b2o4b3ob3o4b2o11b2o4b3ob3o4b2o77b3o136bo3bo3b2ob2o3bo8bo3b 2ob2o3bo3bo133b3o2b2ob2ob2ob2o2b3o298b5o16b2o$6b2o4bobo4bobo5bobo6bobo 5bo2bo3bobo3bobo5b2obo4bo2bo61b2o5b2o10b2o9bobo9bo2bo15bo10b3o7b2o3bo 11b2o8b2o2bobo18bo10b2o10b2o21b5o13bo2bo6b3obo2bobo10bo2bobo2bo7bo2bo 23b2o5bobo2bobo9bo4bo9b3ob3o7b3obo50bo8bo19bo7bobo4bob2o10bo2bobobobob obo9bo2bobobobo16bo2bo3bo2bo22bo17bo9b2o9bo6bo22b2o19b4obo3bo3bo7b2o 19b2o7bo123b2obobo56bo4b2o4b3o3b3o4b2o4bo22bo4b2o4b3o3b3o4b2o38bob2o5b o5bo5b2o9bo3b2o3b2o23bo10bo40bo3b2o2b2o9bo3b2o121b2obo8b3o14b3o8bob2o 18bo3b2o4b2o15b2o2b2o48b2o2b2o32b2o2b2o112b2o14bo6b2o6bo20b2o4b2o2b2o 4b2o21b2o7b2ob4ob2o46bo2bo13bo2bo23bo5b2o253b2obo65b2o9b2o195b3o98b3ob 3ob3o10b3ob3ob3o144b3o3b3o303b2o3b2o15bobo$13bobo4bobo7bobo6bo4bo2bo5b o4bobo7bo5bo2bo60bo6b3o20bo10bob2o10bo3b2o11bo11b3o12bo9bobobo20b2o44b o18bobo27b2o3b2o11bob2o21bo5b2o4b2o10bo2bo12bobo11bobo16bob2o15bo13b2o b7o19bo11b4o17bobo3bo2bo13bo4bo18b3o3b3o20b2obobobo13b2o8bo9b2o4bobo 19b3ob2o18bobo2b3o2b3o4bob4o17bo4bo123bob2obo2b2obob2o53b5o21b5o22b5o 27bo35b2o2b2o4b2o5b2o9bo3b2o3b2o66b2o8bobo16bobo4b2o89b2o25bo14bobo10b obo14bo17b2o2bo5bo6b2o7b2o16b2o22b2o16b2o7b2o9b2o16b2o7b2o125b2o27bo5b o3bo5bo33bo4bo50b2o13b2o25b2o4bo18bobo235bobo65bo9bo32bo2bobo2bo21bo2b obo2bo70b3o146b5o4bo5bo14bo5bo4b5o128b2o8bo5bo8b2o295b5o11b2o6bo11bobo $6b2o6b2o5bobo7b2o7bo4b2o5bo7bo7b2o5b2o62bo27b2o10bo12bob2o26bo14bo10b 2ob2o133bo2bo19bo25b2o12b2ob2o9b2ob3o32bobo13bobo3bo21b2o32bo4bo17b4o 48b2obobob3o22bo14b2o13b2ob2obo6bo2b2o23b3o2b3o2bobo146b2obob5ob2obo 57bo21bo30bo25b3o35bo3bo5bo18bobo72bobo9bo18bo5bobo34b2o36b2o13bo2bo 23bobo2bo11b2o10b2o11bo2bobo21bo5bo5b2o8b2o15b2o22b2o15b2o8b2o9b2o15b 2o8b2o89bo65bo5bo3bo5bo128b2o7bo16bo18b2o210b3o4bo2bo64bo11bo30bo3b3o 3bo19bo3b3o3bo70bo10b3o39bo3bo89bo4bo36bo4bo126bobo23bobo295b3o8b2obo 2bo2bo2bo10bo2bo4bo$7bo14bo16b2o11b2o6b2o76b2o38b2o12bo194b2o20b2o39bo bo11bobo18bobo14bo14bo2bo22b2o14b2o19b4o40bob2o3b2obo23b2o4bo10b2o8b2o 11b2o16bo3bobo2b4obo2bo17b2o33bobo2bobo188b4o27b4o18b4o27bo39bo3bo5bo 18bo73bo38bo35bo35bo2bo12bobobo22bo2bo40bo2bo20b2o4b2o16bo56bo37bo56bo 4bo37bobo3b3o12b3o27bo14b2o4b2o2b2o4b2o129bo6b2o11b2o2bo4bo10b2obo2bob 2o214b2o65b2o9b2o29bo2b7o2bo17bo2b7o2bo69bo11bo40bo3bo88bo2bo8bo3bo16b o3bo8bo2bo125bo27bo296bo9b2o2b2o6bo9b2o5b2o$6bo127b2obo53b2o79b2o131bo b2o41bobo11bob2o18b2o30b2o24bo14b2o43b2o18b2obo3bob2o25b4o12bo4b2obo 13b2o17b3o2bobo5b2o19bo12b2o18b4ob2ob4o77b2o45b5o2b3o29b2obo6b2obo9bo 2bo27bo2bo18bo2bo27b2o37b2o2b2o4b2o91b2o38b2o12b2obo6b2obo8bobo32bobob o13bo2bo23b2o42b2o17b2o4b2obo168b3o4b3o36bo4bobo12bobo5b3o12b3o3bobo 15b2obo6b2obo130bo9b2obo7b2obo2bob2o10b2o2bo4bo190b2o12bo5bo73b2obob2o 32b2o9b2o17b2o9b2o69bo11bo130bo2bob2o10bo20bo10b2obo2bo121b2o27b2o314b obo8b2o3bo8b2o$6b2o126bob2o134b2o131b2obo42bo11b2obo76bo38b2o20b2o54bo 14bo5bob2o13b2o19bobo2bo3bo2bobo31bo15bobo4bo2bo4bobo45b2o27bo45bo10bo 28bob2o6bob2o128b2obo6b2obo70b2o75bob2o6bob2o9b2o32bo2bo18bo29b3o26b3o 24b2o4bob2o167bo10bo40b3o12b3o5bobo12bobo4bo16bob2o6bob2o130b2o8bob2o 11b2o19bo193bo2bo11bo5bo68b3ob3o3b3ob3o139bo11bo41b3o85bobobo5bo36bo5b obobo264bo5bo52bo5bo135b2o11b2o10b2o$466bo76b2o37b2o77bo13b2o2b2o13b2o 25b2obo3bobo2b3o20b2o23b2ob2obo4bob2ob2o46bo25bobo45b2o3bobo2b2o32b2o 2b2o27b2o3b2o46b2o3b2o45bob2o6bob2o70bobo78b2o2b2o18b3o25bo19bobo30bob o26bobo201b2o8b2o63b3o12b3o212bobo188bo2bobo11bo5bo67bo2b2o2bobobo2b2o 2bo21bo51bo63b3o10bo130bo2bo4bobo34bobo4bo2bo128b2o13b2o119b3o3b3o50b 3o3b3o139bo8bo2bo$13b2o6b2o8b2o9bo8b2o3b2o7bo6b2o5bo386b2o192b2o17bo 13bobo4b2o17bo2bobob2o2bobo3bo14b2obo4bob2o21bobo6bobo49bobo23b2o42bo 7bo2bo36bo3bo13bo4b3o8bo3bo8b3o4bo16bo4b3o8bo3bo8b3o121bo78bo3bo19bobo 26bobo49b3o26b3o628b2o48b2o21bo86b2o4b3ob3o4b2o19bobo51bobo73b3o132b2o 2bo2bo34bo2bo2b2o131b2o13b2o118bo3bobo3bo49bob2ob2obo114bo22b2o10bobo$ 13bobo5bobo7bobo7bobo6bobo3bobo5bobo5bobo3bobo7bo586b2o3bo12bo6bo18b2o 2bo6bob2ob2o14bo10bo18b2obobo6bobob2o47b2o13bobo2bobo45bobo15b2o2b2ob 2o23bo3bo11bobo3bobo5bo9bo5bobo3bobo14bobo3bobo5bo9bo5bobo3b2o116b2o 78bo3bo18b3o309bo14bo386b2o4b2obo6b2obo8bo48bo18bob2o15b3o108bobo49bob o214b2o36b2o271bo9bo51b2ob2o118b2o20b2o$14bobo7bo9bo6bobo6bo6bobo4b2ob o6bo4bobo3bobobo282bo15bo287bo2b2o11b2o7b3o20b2ob3o22b2o6b2o19b2obo10b ob2o51bobo2bobo2bo2bo2bo2bo45bo6b2o8bobo2bobobo21b2o2b2o11bobo3b3o5b2o 7b2o5b3o3bobo14bobo3b3o5b2o7b2o5b3o3b2o195b2o2b2o61b3o6b3o257bo14bo38b 3o12b3o331bo4bob2o6bob2o8bobo21b2o21bobo19bo5bo88bo2bobo2bo25bo53bo62b 3o141b2o52b2o117bo3b2o27b2o112b3o3b3o52b2ob2o117b3o$15bobo7bobo7bo4b2o b2o3bobo8bo7bo5bo7bo3b2o2bo282bo15bo286bo5b2obo18bo21b2o22b3o2b6o2b3o 19bobob4obobo53bo2bo2bo2bo2bobo2bobo53b2ob2o7bobo4bo17b2obo6b2obo8bo 35bo16bo227b2obo6b2obo39b3o6b3o6bobo192b2o72bo6b2o6bo33bo4bobo12bobo5b 3o12b3o307bo3b2o4b2o2b2o4b2o7b2o8bo12b2o12b2o7b2o26bo8bo78bo3b3o3bo 142bo10b3o124b2o2bo2bo50bo2bo2b2o111bobo3bo27bo174b2ob2o117b2o$16bo9b 2o8bo11b2o9b2o6b2o3bo7bo8b2o261b2o17b3o13b3o47bo15bo48bo4bo9b2o156b2o 4bob2o38bo4b2o19bo2bo8bo2bo19bobo6bobo54bobo2bobo13b2o40b5o5bob2obo4b 2ob3o2b2o16bob2o6bob2o289bob2o6bob2o48bobo6b3o5bo3bo36b2o6b2o137bo44b 2o4b2o2bob2o21b2o39bobo3b3o12b3o5bobo12bobo4bo42b2o22b2o22b2o22b2o23b 2o161b2o2bo5bo3bo5bo17b2o26bobo21b2ob2o8bo8bo77bo2b7o2bo141bo11bo125bo bo2bobo24b2o24bobo2bobo20b2o90bo4bobo23bobo297bo$35b2o35b2o6b2o215bo 19b2o15b2o16b2o67bo14bobo13bobo13b2o12b2o5bo11bobo2bobo9bo204b2ob2obo 20b2o10b2o19b2obob4obob2o22b2o4b2obo17b2o23bobo38bo4bo8bo2bo2b2o5bobo 15b2o8b2o4b2o6bo35bo16bo38b2o191b2o2b2o4b2o36bo3bo5b3o14bo3bo35bo2bo4b o2bo81b2o53bobo43bo5bo2b2obo63bo27b3o12b3o3bobo39bo4bo18bo4bo18bo4bo 18bo4bo19bo4bo164bo5bo3bo5bo15b2o29bo21bo21bo77b2o9b2o18b2o61b2o70bo 127b2obob2o23b2o23b2obob2o18b2o2bo97b2o8bo5bo8b2o297bobo$283b2o12b3o 17b2o15b2o84bobo13bobo14bo14bo13bo2bo2bobo7bo2b2o4bobo8bobo206bo55bo2b 3o2b3o2bo23bo4bob2o16bobo25bo37bo2b2o8bobo6bobobobobobo13bo9bo5bo6bobo 3b3o5b2o7b2o5b3o3bobo14bobo3b3o5b2o7b2o5b3o7b2o5b2o184bo3bo5bo10b3o24b o3bo62bo2bo4bo2bo80bobo15b2o37b2o42bo5bo7b2o6bo26bo77bo39bo6bo16bo6bo 16bo6bo16bo6bo17bo6bo158b2o2b2o4b2o2b2o4b2o16b2o2b2o22b3o22b2o2bo3b3o 3b3o25b2ob2o83b2o61b2o126bo2b2o4b2o2bo57bo3b2o3bo44bo3b2o3bo16bo2bobo 89b5o12b3o3b3o163b2o142b2o$284bo15bo51b4o64b2o13b2ob2o25b2obo14b3o3bob o6b3o3bo3bo10b2o4b2o200bobo55bo2b4o2bo24bo3b2o4b2o14bo27b2o33bo2bobo 15b2o2bo2b2ob7o12bo9bo5bo5bobo3bobo5bo9bo5bobo3bobo14bobo3bobo5bo9bo5b obo14bo186bo3bo5bo9bobo51bo3bo26b3o6bo2bo4bo2bo6b3o71bo17b2o81b2o4b2o 7bo5bobo3b3o12b3o3bobo39b2o74bo8bo14bo8bo14bo8bo14bo8bo15bo8bo158bo2bo 5bo3bo5bo71b3o13b3o3b3o7bo12bo69bo203bo3b3o2b3o3bo25b2obo4b2obo6b2obo 8bob2o2b2o50b2o2b2obo11b2obob3ob2o87bo4bo6b3o2b2ob2ob2ob2o2b3o119b2ob 2o33bobo155bobo$284bobo12bo17b4o13b4o13bo4bo13b5o11b5o27b2o13bo7bo9b5o 9bo2b2obo18bo10b4o21bo201b2o54b2obo4bob2o23b2o2bo5bo14b2o61bobobobo3bo 4bo2bobobo2bobobo9bo10b2o8b2o4b2o6bo4b3o8bo3bo8b3o4bo16bo4b3o8bo3bo8b 3o12bobo185b2o2b2o4b2o9b3o24bo3bo21bob3obo25bobo7b2o6b2o7bobo59bo11b3o 100bob2o8bo7bo4bobo12bobo4bo33bo6b2o6bo14b2o51bo8bo14bo8bo14bo8bo14bo 8bo15bo8bo157bo4bo5bo3bo5bo70b3o8bo20bo7bo2b2o70bobo202bo2b2o4b2o2bo 26bob2o4bob2o6bob2o8bobo2bobo3bo42bo3bobo2bobo11bob2obobobo87bo2bo15b 3o3b3o126bobo35b2o155b2o$13b2o7bo7b2o9b2o8b2o3b2o4b2o7b2o3b2o6bo6b2o6b 2o4b2o7b2o169bobo11bo2bo13bobo2bob2o8bobo2bob2o8bobob2obob2o8bob3obo9b ob3obo25bo3b3o9b3o3b3o8bo2bo2bo9b2o4bo10b4o13bo4b2o15b4o93bo2bo161bo2b o4bo2bo28bo5bo28b2o40b2o5bo2bo6bobobo10b2obob4ob3o13b2obo6b2obo23b2o3b 2o46b2o3b2o22b2o182b2obo6b2obo17b2o18bob3obo20bo5bo25b3o24b3o42b2o15b 2o113b2obo8b2o11b3o12b3o38bo14bo7bo6b2o6bo44bo8bo14bo8bo14bo8bo14bo8bo 15bo8bo54bo102b2o2b2o4b2o2b2o4b2o69b2o2bo7bo8bo11bo8b3o70bobo35b3o13b 3o68bo4bo119b2o6b2o2b2o4b2o7b3o2b2o50b2o2b3o23bo82bo2bob2o16bo5bo123b 2ob2ob2ob2o55b3o110b2obob2o14bo$13bobo5bobo6bobo8bobo7bo4bo5bo7bobo3bo bo4bobo5bobo5bobo3bobo6bobo170b2ob2o10bo13bo2bobob2o8bo2bobob2o8bobo4b ob2o8bobobobo9bobobobo24bo2b2o3bobo22bob2ob2obo10bobo12bo3bo13b2o2bo2b o13bo96b4o25b2o7b2o126bo2bo2bo2bo24b2o2b2o4b2o24b2o2b2o37b2o2bo8b2o2bo bo3b2o11bob2o4b2o15bob2o6bob2o94b3o3b3o8b2o176bob2o6bob2o17bobo17bo5bo 19b2obobob2o17b2o40b2o35b2o16b2o73bo7b2o33b2o4b2o69bo14bo7bo14bo45bo6b o16bo6bo16bo6bo16bo6bo17bo6bo55bo106bo5bo3bo5bo17b2o2b2o22b3o21bo12bo 8bo20b3o72bo35bo2b2o9b2o2bo39b2o4bob2o6b2obo7b2ob4ob2o25bo4bo86bo7bo3b o5bo12b2o3bo18bobo2bobo18bo3b2o17b4obob3obo80bobobo5bo143bo2bo3bobo11b 2o43b3o$14bobo5bobo8bo10bo7bo4bo6bo5bo6bobo4bobo6bo7bo5bo8bo113b2o15b 2o41b2o8bobo10b2ob2o3bo8b2obo2bobo8b2obo4bobo10b2obobob2o7b2o5b2o24b2o 4bob2o6b9o7bobo3bobo10bo3bo2bo8bo2bob2o12bobobobo9bo3b3o122b2o7b2o127b 2o4b2o26bo4b2obo25b2o43bobo14bo15bobo4b2o41bo2bo27bo2bo18bo2bo28bobo3b obo8bo210bo16b2obobob2o17bo2b2ob2o2bo15bo2bo38bo2bo47b2o2b2o73b2o6bo2b o12b2o19bo5bo92bo14bo46bo4bo18bo4bo18bo4bo18bo4bo19bo4bo55b3o101b2o3bo 5bo3bo5bo15b2o29bo21b2ob2o17bo7b3o3b3o3bo2b2o41bo47b2o16b2o2bo9bo2b2o 16b2o22bo4b2obo6bob2o9bo4bo25b2ob4ob2o85bo7bo3bo5bo5b5obob2o21b2o2b2o 21b2obob5o10bo3b2ob2o3bo81bo2bo4bobo142bo7bo13bo156bo5bo6bo$15bobo5bob o8bo10bo5b2o3b2o5b2o6bo7bo6bo5bo7bo6bobo6bob2o50b2o11bo13b2o12bo7bo11b o15bobo34b2o14b2o2b2o7b2obo4bo8b2obo4bo8b2obob2obobo9bo2b2ob2o2bo6bo2b obo2bo26bobobo9bo7bo6b2obo3bob2o10b2ob4o9bobobo13bobob2o10b4o2bo35b2o 21b2o31b8o194bo5bob2o26bo43bob2o2b2o25b2o2b2obo42b4o27b4o18b4o28b3o3b 3o10bo208b2o14bo2b2ob2o2bo16b2o7b2o15bobo2bo11b2o8b2o11bo2bobo63b3o60b obo5bo2b2o11b2o18bo5bo73bo14bo68b2o22b2o22b2o22b2o23b2o162bo2b2o4b2o2b 2o4b2o16b2o26bobo68bo40b3o46bo18b3o9b3o18bo22bo3b2o8b2o4b2o40bo4bo86b 2o6b2o2b2o4b2o5bo2bo2bobo22bo4bo22bobo2bo2bo11b3ob3ob3o85b2o2bo2bo11bo 7bo122bo2bo18bobo40b2ob2o123b2o$16b2o6bobo8bobo8bo4bo4bo6bo5bobo6bo6bo 5bo5bobo8bobo6bobo46b2obobo10bobob2o7bo2bo12b3o3b3o9bo19bo35bo18bobo 10b4o13b4o13bo4bo10b2o7b2o7b2obob2o27bo3bo12b4o8bo2bobobo2bo12bo14b2ob obo12bobo15bo37bo2bo21bo2bo2bo4b2o18bo8bo22b4o3b4o160b2o2b2o4b2o19b2o 46b2o4bobo9bo4b2o14bobo48bo21bo30bo40b5o224b2o7b2o43bo14bobo8bobo14bo 64bo17b2o51bo2bo32b2o4b2o13b3o12b3o41bo14bo7bo14bo305bo5b2obo6b2obo9b 2o8bo12b2o12b2o7b2o47bo8b2ob2o43bo30b2o10b3o53b3o19b2o3bo8bo5bo30bo98b 2obo4b2obo4bo5bo11b2obo2bo44bo2bob2o18bo5bo92b2o11bobo5bobo122b2o20b2o 40bo3bo110b2ob2o7b2o$25bo10b2o9bo4bo5bo6bo3b2o7b2o4bo5bo6b2o10bo39bo 16b2obo12bob2obo7b2obob2o12bobo11bob4o8b2ob4ob2o30b3o21bo45b4o30bobobo 29b3o13bo2b2o9bo5bo14bobo16b2o14bo14bo39bobo19bo4b6o2bo18bob3o3b2obo 20bo4bobo4bo163bo5bo20b2o43b2o4b2obo12bo2bo2bo2b2o8bo2b2o43b5o21b5o22b 5o40bo283b2obo8b3o12b3o8bob2o65bobo15b2o34b2o17bo37b2o10bo4bobo12bobo 4bo36bo6b2o6bo7bo14bo44bo25bo21bo25bo24bo57b3o101b2o4bob2o6bob2o8bobo 21b2o21bobo46bo55b2o30b2o10bo57bo23bo10bo5bo30bo97bob2o4bob2o5bo5bo11b obobobo42bobobobo104bo4bo22bo7bo188b3o113bo$46b2o3b2o4b2o5b2o18b2o4b2o 57b3o3bob3o9bo10b2o14bobo2bo9b4ob4o8bo4bo8b2obo4bobo29bo23b2o11b2o15b 2o46bo2bobo2bo29bobo26b5o16b2o32b2o13b2o35b3obob2o16bob4o6bobo18bobo6b obo19bobo2b2ob2o2bobo158b2o3bo5bo34b2o26b3ob4obobo4b2o4b3o2bobo4bo2bo 5b2o46bo4b2o4b3o3b3o4b2o4bo22bo10b3o3b3o28b4o279bo5b2obo3bo10bo3bob2o 5bo51b2o2b2o11b2o36b2o12bo2bo55bo9bobo3b3o12b3o3bobo42b2o14bo6b2o6bo 43bo2bo22bo2bo18bo2bo22bo2bo21bo2bo17bob2o6bob2o25bo130bo48bo46bo3bobo 171b2o2b2o8b2o4b2o28b3o63b2o30b2o12b2o2b2o4b2o9bo3bobobo12bo7b2o7bo12b obobo3bo18bo3bo77b3o4b3o211b2o5bo$148bobo3bobo12bo2bo8bobob2o9bo4bob2o 6bo2bobo2bo7b2obo14bobo2bobo66b2o15b2o16b2o28b2obobob2o30b2o28bo103bo 4bobobo15bobo2bo2bob3obob2o12b2obobo8bob2o13bo2bobo9bobo2bo156bo2b2o4b 2o5b2o27bo26bo7bobobo2bob3o9bo5bobobo53b2o2bo5bobo3bobo5bo2b2o25bo8bob o3bobo28bo2bo283bo5bob2o10b2obo5bo42b2o16b2o48b2o11b2o2bo16bo33b2o2bo 11bo26bo66b2o50bo2bo22bo2bo18bo2bo22bo2bo21bo2bo17b2obo6b2obo25bo129b 2o48b2o52bo171bo4bob2o4bo5bo20b2o12b2o57bobobo29bo13bo3bo5bo10b5obob2o 12b2o5b2o5b2o12b2obob5o20bo78bo10bo210b2o$145b3obo3b3o14b2obo7bobo2bo 10b3obob2o8b2ob2o10bobob4o9bobo4bob2o98b2o31bobo167bo2b3o3bo12b2obobob obo2bo2bobob2o13bobo10bobo13bobobobo2b2ob2o2bobobobo154bo5b2obo8bo25bo bo27b6o2b2obobo6bo10b2obo2bo56bobo5b3o3b3o5bobo26b2o8b3o3b3o78bo236bo 5bo16bo5bo42b2o15b2o63bo2bo14bo2bo32b2o2b2o68bo89bo25bo21bo25bo24bo22b 2o2b2o29bo229bo2bo57b3o111bo5b2obo5bo5bo19b2o12b2o55bobobo32bo13bo3bo 5bo15b2o3bo9b2o14b2o9bo3b2o105b2o8b2o53bo4bo305bo$155bo17bo8bo2bo14bo 13bobo9bobobo4bo10b2ob4ob2o131bobo164b2obo5b3o13bo2b4o3bobob2obo16bobo 10bobo14bo2bobo9bobo2bo38b2obo21bob2o88b2o4bob2o8bobo23b2o30bobob4o7b 2o3bo8bo2bo59bobob2o13b2obobo32b2o22b2o3b2o59bobo33bobo199bo5bob2o10b 2obo5bo59bo65bo16bo2b2o11b2o47b2o42bobo3b3o12b3o27bo162bo3bo29bo213bo 14bobobo55b2o2bo111b2o8b2o2b2o4b2o28b3o60b2o33b2o12b2o2b2o4b2o11b3o2b 2o42b2o2b3o20bobo3bobo135b3o4b3o301b3o$23bo16b2o43b2o6b2o6bo71b2o8b2o 14bo12bobobobo7b2o3b3o14bo139bo166bo2b2obobo17bo4b4obobo2bo15b2obo8bob ob2o16bobo2b2ob2o2bobo45bo3bo11bo3bo111b2o13bobo2bobo36bobo6b2o2b4o7bo 4bo61b2obo15bob2o32bobo12b3o8bo3bo8b3o4bo32b2o9bo3b2o3b2o26bo3bo199b2o bo3bo10bo3bob2o144bo2bo12b2o40bo6b2o6bo36bo4bobo12bobo5b3o12b3o3bobo 37b2o23b2o23b2o23b2o24b2o20bo3bo29b3o212bo14bo2bo45b2o9bo2b2o16b2o104b o2bo5bo31bo97b2obo4b2obo6b2obo12bobo2bobo3bo34bo3bobo2bobo21bo3bo8bobo 2b2o57bo14bo48bo10bo136b2o132b2o15bobo9bo$14b2o6bobo8bo7bo7b2o20bo6b2o 5b2o5bo2bo4bobo96b2o11b2o3b2o14b2o13bobo304bo4b2o20b4o4b2obobo19bobo6b obo20bo4bobo4bo42bo7b2o9b2o7bo111bobo2bobo2bo2bo2bo2bo34b2o2b3obo10bo 5b5o65bo15bo35bo14bobo5bo9bo5bobo3bobo31b2o9bo3b2o3b2o30bo203b3o12b3o 81bo49bo17b2o55bo14bo41b3o12b3o5bobo12bobo4bo36bo4bo19bo4bo19bo4bo19bo 4bo20bo4bo18b2o2b2o242bobo14b2o19b2o4b2obo4b2o4b2o5b2o9b3o18bo16bo57bo 19b2o8bo4bo5bo29bo98bob2o4bob2o6bob2o12bob2o2b2o42b2o2b2obo17bo11bo3bo 3bob3o4b2o50bo14bo48b2o8b2o136b2o132b2o16b2o9b2o$13bo2bo6bobo6bobo6bob o5bo2bo9bo7bobo4bo2bo11bobobo4b2o146b2o305b3o3bo21bo2b2o5bo20bob2o3b3o bo21b4o3b4o44b2ob2o2bo11bo2b2ob2o111bo2bo2bo2bo2bobo2bobo36bo4bobo6bo 79b2o3b2o3b2o3b2o34b2o5b2o7b3o5b2o7b2o5b3o3bobo42bo3b2o21b2o8bo4bo204b obo8bobo84b2o46bo2bo72bo14bo64b3o12b3o40bo6bo17bo6bo17bo6bo17bo6bo18bo 6bo15b2o6bob2o231b2o44bo4bob2o5bo5bo38b3o13b3o53b3o20bo8b2o2b2o4b2o40b o4bo117bo3b2o3bo36bo3b2o3bo17bo3bo5bo3bo3bo6b2o3b2o50bo6b2o6bo153b2o 193bo$14b2obo6bobo4bobobo6bobo5b2obo7bobo5bo2bo5bobo4b4o4bobo7b2o315bo 2bo73b2o59b2ob2o23b2ob5o22bo8bo81bo2b2ob2o3b2ob2o2bo116bobo2bobo13b2o 32bobobo2bobo5bob2o7bo71bo2bobo2bo45b2o38bo44bobo23b2o12bo206b2o8b2o 84b2o33b2o11b2o2bo5bobo201bo8bo15bo8bo15bo8bo15bo8bo16bo8bo15bo6b2obo 24b3o203bo2bo42bo9b2o2bo5bo41bo16bo18b3o9b3o18bo22bo5bob2o6b2obo9bo4bo 25b2ob4ob2o116b2obob2o40b2obob2o19bo11bo5b5obo63b2o53bo14bo91b2o$17bo 8bo5bo2bo8bo8bo4bobo2bo4bo3b2o3b2ob2o3bo2bo5bo8bobo332bo14b2o6b2o19b2o 13b2o92bo25b8o23b2o7b2o47b2o7bobo7b2o111b2o23bobo32b2ob2o2b2o7bo7bobo 71b2o3b2o132bo34bo3bo3b2o35bo2bob2obo2bo11bo2bob2obo2bo262b2o12bo2bo6b 2o66b2o8b2o123bo8bo15bo8bo15bo8bo15bo8bo16bo8bo14bo11b2o23bo204bobobo 41b2o8bo3b2o4b2o10bo45b2o16b2o2bo9bo2b2o16b2o21b2o4b2obo6bob2o7b2ob4ob 2o25bo4bo116bobo2bobo42bobo2bobo21bo3bo12b3o119bo14bo$17b2o7b2o7b2o7b 2o7b2o3b2o3b2o3b2o34bo314bo4bo11bo3bo11bobo6bobo10b2o5bobo35b2o127b2o 7b2o48bo3bo9bo3bo111bobo25bo57bo165bo51bo28bobo4bo2bo34b4ob2ob4o11b4ob 2ob4o277b2o7bo67bo10bo43b3o12b3o62bo8bo15bo8bo15bo8bo15bo8bo16bo8bo14b 2o11bo8b4o11bo205bob3o51bo4bob2o12bobo61bo2b2o9b2o2bo68bo4bo149b2o2bo 2bo42bo2bo2b2o19bobo3bobo32b2obo6b2obo6b2obo8bo5bo14bo5bo40bo6b2o6bo 17b2o4b2o4b2obo6b2obo141bo$287b2o69b2o12bo44b3ob2ob3o25bo10bo10bobo4bo 36bo2bo97b4o89bob2ob2obo116bo27b2o41b2o2bo2bo2b2o133b2o3b3o5b2o7b2o5b 3o3bobo50bo35bobo6bobo26bo2bob2obo2bo3b2ob2o3bo2bob2obo2bo232b2o121b3o 4b3o39bo4bobo12bobo5b3o12b3o40bo6bo17bo6bo17bo6bo17bo6bo18bo6bo13b2o 12bo8b6o218b3o40b2o8b2o4b2obo11bobo62b3o13b3o146bo2b2o4b2o2bo68b2o44b 2o43b3o19bob2o6bob2o6bob2o7bobo3b3o12b3o3bobo46b2o25bo5bo4bob2o6bob2o 130b2o8b2o15b2o$286bobo49b2o18bo12bobo42bo3bo2bo3bo7bo5bo7b2obo10bob2o 9bo3b2obo13b3o2b2o13bo2bo98bo2bo213b2o70bo2b4obo2bo133b2o3bobo5bo9bo5b obo3bobo50bo36bo7bo3bo39b2ob2o247bobo122bo4bo40bobo3b3o12b3o5bobo12bob o4bo36bo4bo19bo4bo19bo4bo19bo4bo20bo4bo15bo12b2o6b8o261bo4b2obo10b2o 11bo226bo3b3o2b3o3bo75b2o13b2o13b2o48b5obo22b2o2b2o4b2o8b2o6bo3b2ob2o 10b2ob2o3bo73bo5bo3b2o8b2o4b2o128b2o7b2o16b2o$283bo2bo33b2o15bobo19bo 12bo14bo29b4o2b4o6b3ob3ob3o5b2obobo2b2o2bobob2o7bob2o5b3o7b2obo6bo12bo b2ob3o385b3o3b4o139b3o8bo3bo8b3o4bo40bo59bo5b2o286bo56b2o111bo27b3o12b 3o3bobo37b2o23b2o23b2o23b2o24b2o16bo9bob2o7b2o6b2o222bo2bo33bo5bob2o 11bo21b3o215bo2b2o4b2o2bo71b2o2bo2bo12b2o12bo2bo2b2o27b2o13bo6b2o21bo 3bo5bo9bo12b3o12b3o39bo5bo14bo5bo11b2o4b2o2bo9bo5bo139b2o2b2o96b2o$13b 2o11b2o6b2o8b2o5b2o7b2o38b2o180bobobo17bo14bo2bo14bo20b2o25b5o42bo3b2o b2o3bo7bobobo2bobobo8b3o5bobo3bo4bo2bobo4bobob2o6bo2bo4bo2bobo165bobo 53bo164bo154b2o3b2o54bobo54bo4bo4b2o286b2o55bobo160bo157b2o8b2obo8b8o 221bo2b2o2bo31b2o2b2o14bo17b2ob7ob2o22b2o61b2o70bo134bo2bo4bobo26bobo 4bo2bo24b2o12bo3bob3o23bo3bo5bo9bo12bo14bo39bobo3b3o12b3o3bobo12bob2o 5bo9bo5bo240bo$13bobo9bo2bo4bo2bo6bo2bo3bo2bo6bobo6b2ob2o3b2o5b2o4bo3b o5b2o8bo3bo168bo2bo15b5o2b2o7bobo2bo2b2o6b2obo17b2o3b2o8b5o7bobo5bobo 24b2obo2bob2o5bob3obob4o8bobobo2bobobo7bo3bobo5b3o5b2obobo4bobo2bo5bob obo3b2obob2o165bo2bo17b3ob3o27b2o159bob2o2b4obob2o204b2o3bo57bo352bo 123b2o216b6o222bo2b2o2bo35bo15b2o16bo3bobobo3bo22b2o61b2o58bo11bo133bo bobo5bo28bo5bobobo38bobo2b2o23b2o2b2o4b2o8b2o68bo3b2ob2o10b2ob2o3bo13b 2obo4b2o8b2o4b2o241b3o$14b2o9bobo5bob2o6bob2o3bo2bo7b2o7bobo4bo7bo3bob obobo13bobobobo170bob2o2b2o5bobo5bo2bo6bo2bo3bo2bo6b2obo2bo2b2o9bo2b3o 2bo6bo5bo6b2obobobob2o24bo8bo6bo15b2obobo2b2o2bobob2o5b3o5b2obo10bo6bo b2o8bo2bo4bobo171bo52bo159b2obob2o2bob2obo133b2o27bo2bo33b2o3b2o3bo9b 2o42bo3bo352b2o115bo6b2o6bo14b2o194b4o225b4o33b2o3bo33b4o3b4o146bo10b 3o133bo2bob2o10bo12bo10b2obo2bo65b2obo6b2obo6b2obo14bo14bo45b3o12b3o 22b2o4b2obo4bo5bo23b2o219bo$16b2o5b2obo5b2obo4b2obo7b2ob2o7b2o5bobo5b 3ob3o4bobobobo4b4o5bobobobo171bo2bo2bo5b2obo2b3obo7b2o2b6o10bobobo2bo 9bo5b2o6bobo3bobo8bo3bo28b3o2b3o9bobobob2obo4b2obo10bob2o7bob2o3bo12b 2o2b3o15bob4obo168bo21bo3bo25b2obo18b3o17bob2ob2obo116bo4bo140bo27b4o 33b2o3b2o3bo9b2o42bobo471bo14bo7bo6b2o6bo414bobo2bobo32bo2b2o35bo5bo 147b3o148bo2bo8bo3bo3b2o3bo3bo8bo2bo68bob2o6bob2o6bob2o13b3o12b3o45bo 14bo24bo4bob2o5bo5bo5b2o15bobo113b2o2b2o$16bobo3bo2bo6bo2bo4bo2bo9bo2b o6bobo3b2ob2o6bobo7b2ob2o4bo4bo3b2obobob2o171b5o9bobo2bob2o26bo2b4o11b o3bo9bo5bo9bobobo30bo2bo10b2ob3obob2o7bo10bo12bo4bobo33bo4bo170bobobo 16bo3bo24bo4bo18b2o17b2obobob2o113b2o2b3obob4o132b3o25bo46bobo528bo14b o7bo14bo210bo2bo4bo2bo192b2o4b2o31bo5b2obo10b2o19bo5bo30bo53bo214bo4bo 13b2o13bo4bo67b2o8b2o4b2o2b2o12bo3b2ob2o10b2ob2o3bo79bo3b2o4b2o2b2o4b 2o5b2o17bo112b2o16b2o24b2obo4bob2o6b2obo6b2obo$17b2o3bobo8b2o6b2o10bo 2bo7bo16bo17b2o2b2o7bo189bo2b2o16b2o11b2o12b2obobo3bo10b5o11bobo27b4ob 2ob4o7bobo2bo11bobo6bobo10bobo5b2o34b3o174b4o14b3ob3o27bo18b2o140bo5bo bobo2bo132bo27b5o43bo552bo14bo126b2o77bo2b3o2b6o2b3o229b2o4bob2o10b2o 13b2o3b2o5b2o3b2o24bobo49bobo74b3o138b5o4bo5bo6bo5bo4b5o68bo9bo5bo3bo 12bobo3b3o12b3o3bobo39bo14bo23b2o2bo5bo3bo5bo23b3o113b2o15b2o24bob2o4b 2obo6bob2o6bob2o$23bo30b2o234bo10b2o20b2o15b2o8bob2obob2o28bo28bo2bo4b o2bo7bo2b2o13b2o6b2o11b2o23b2o19b2o221b2o22bo18b3o3b3o114b6obo144b2o4b 3o3b3o4b2o4bo418b2o5b2o148b2o8b2o90bo58bo2bo78bo3bo2bo4bo2bo266bo2b5ob ob5o2bo23bobo51bobo61b3o10bo146b3ob3ob8ob3ob3o76bo9bo5bo3bo12bo5bo14bo 5bo39b3o12b3o27bo5bo3bo5bo139bo45b2o6b2o2b2o4b2o2b2o4b2o$289bobo48b2o 12bobo15bo61b2o63b2o246b2o14b2o21bo2bobo2bo116bo2bo2bo143bo5bobo3bobo 5bo2b2o419b2o5b2o148bo10bo11b2o8b2o66bobo56bo15bobo62b3o282b3o4b3o4b3o 26bo51bo64bo11bo77b3o61bo3bo3b2ob2o8b2ob2o3bo3bo70b2o8b2o4b2o2b2o74bo 3b2ob2o10b2ob2o3bo21b2o4b2o2b2o4b2o185bo8bo2bo5bo3bo5bo$247bobo40bo63b obo14bobo46bo2bo269b4o17bo3bo25bo19bob2o20b2ob2o120b2ob2o140b2obo5b3o 3b3o5bobo579b3o4b3o12bo10bo56b2o7bob2o44bo11bo10b3o2bo3bo505bo11bo140b obo2bob3obob4o2b4obob3obo2bobo71b2obo6b2obo6b2obo21b2o46bobo3b3o12b3o 3bobo16b2o4b2obo6b2obo188bo6bo4bo5bo3bo5bo$149bob2o14bo16bo16b2o44b2ob o104bo16bo321bobobo14bobobobo23bo4bo17bo147bobo141bo2bob2o13b2obobo 581bo4bo15b3o4b3o56bobo6b2ob2o10b2o30bobo11bo19bo347b2o9b2o33b2o9b2o 17b2o9b2o69bo11bo76bo3bo60bo4bo9bo2bo9bo4bo72bob2o6bob2o6bob2o14bo6b2o 6bo40bo5bo14bo5bo17b2o4bob2o6bob2o24b3o160b2o6b2o2b2o4b2o2b2o4b2o$149b 2obo13bobo14bobo15b2o27b2obo16b3o446bo13bobobobo24bob2o18bo11b2o3b2o 11b2o3b2o111bobo143b2obo15bob2o284b2o7b2o310bo4bo57bo6b3obob2o10b2o20b 2o6b2o15bo2bo2b2o7bo4bo4b2o185bo154bo11bo33bo2b7o2bo17bo2b7o2bo69bo10b 3o75bo3bo67bobobobo6bobobobo117bo14bo112b2o17bo7b2o147b2obo6b2o4bo5bo 3bo5bo$24b2o9bo27b2o25b2o4bo69bobo14bobo31bo12bob2o13b2o4bo442bo6bo3bo 3b2o2bobo2b2o3bo3bo5bo3bo3bo34b2o2bo2bob2o3b2obo2bo2b2o112bo147bo15bo 287bo2b2ob2o2bo16b2o7b2o337b2o7bo2bo2bo2bo2bobo31bo3bo4b2o17b2o2bo2bob o7bo5b2o154b2o4b2obo6bob2o10bobo154bo9bo35bo3b3o3bo19bo3b3o3bo69b3o 158b2ob3ob2o4b2ob3ob2o116bo14bo53b2o57b2o15bobo7b2o147bob2o7bo5bo5bo3b o5bo$13b2o3b2o3bo2bo6b3o10b2o4b2o3b2o3bo2bo6b2o9bo7bo2b3o52b3o2b2o9b2o b2o12b2ob2o12b4o13bobo8b2obo12b2obo2b2o2bo442bo2bo3bob3o2bo4bobo4bo2b 3obo5bob3o3b2o37bobo2b2o3b2o2bobo264b2o3b2o3b2o3b2o288b2obobob2o17bo2b 2ob2o2bo39b2o14b3o8b2o269b2o7bo6b2o4bo31bo5bo3b2o22b3o5bo3bo162bo4bob 2o6b2obo10bobo6bo2bo4bo2bo135b2o9b2o35bo2bobo2bo21bo2bobo2bo161b3o68bo bo2bo2bo2bo2bo2bobo179bo6b2o6bo67b2o155b2o10bo5b2o4b2o2b2o4b2o$13bobob obo4b2o6bo3b2o4b2o2bobo3bobobobo3b4o5bo2bo6b5o5bobo54bo3bo2bo6bobo5bob o6bobo5bobo6bobo4bo11bobobo8bobob4o8bobo4bob2o168bo95b2o4b2o170bobo3bo 3bo3b4o3b4o3bo3bo5bo3bo3bo14b2o3b2o18bo13bo269bo2bobo2bo210b2o16b2o14b 2o16b2o29bobobobo19b2obobob2o40b2o12bo3bo8b2o279bobo31b2o8bo3bob2o4bob o27bobo163bo3b2o4b2o2b2o11b2obob2o3b3o2b6o2b3o302b3o147bo2b2o2b2o2b2o 2b2o2bo119b2o8b2o48bo14bo224bo11b2o4bo5bo3bo5bo$15bobo14bobobobo3bo5bo 5bobo13bob2obo4bo5bo5bobo51b3o3bobo7b2obobobob2o6b2obobobob2o6b2obo3bo 11bobobo7bo7bo7bo3bo3bo3bo129b2o36b3o18b2o23b2obo21b2o23bobo2bobo231b 2o2bo2bob2o299b2o3b2o212bo7b2o7bo16bo7b2o7bo30bo5bo20bobobobo54bo4bo 290b2o31b2o8bo5bo7bo193b2o2bo5bo4bo11bob2o4bo3bo2bo4bo2bo178b2o4b3ob3o 4b2o11b2o4b3ob3o4b2o65b3o10bo147b2o18b2o118bo10bo43bo4bo14bo225bo8b2o 7bo5bo3bo5bo$13bobobobo4b4o5b2obobo4b5o5b2ob2o4b4o4bo4bo5b5o7bobo49bo 6bob2o9bo3bo12bo3bo12bo3bob2o6b2o4b2o6b4obobo9b2obo4bobo33b2o9b2ob2ob 2o32bo27b2o17bo39bo18bo5b2o17b2obo21b3o3b2o18bo2bo18b2obo24bo2bo122bob o3bo3bo3b4o3b4o3bo3bo5bo3bo3bo18bobo2b2o14bo13bo489bobo3bo4bo3bobo16bo bo3bo4bo3bobo31bo3bo21bo5bo54bo3bo335bo3bo207bo5bo2bo16b3obo193bo2b2o 2bobobo2b2o2bo11bo2b2o2bobobo2b2o2bo66bo11bo77b3o208b3o4b3o42bobo244b 2o9bo6b2o4b2o2b2o4b2o$13b2o3b2o3bo4bo8bo7bo16bo2bo3b2o4b2o6bo6b3o2bo 50b3ob2o13bobobo12bo3bo12bo4bobo7bobobo13bob2o9bo2b2o2bob2o30b3obo8bo 3bobo11b2o16b2obobo12bo13bobobo13bo35b3o2bo2b2o13bo3bo2bo16bo4bo19bo4b o2bo18bo4bo17bob2o28bo78b3o39bo2bo3bob3o2bo4bobo4bo2b3obo5bob3o3b2o18b o18bobo2b2o3b2o2bobo489b2o2bo6bo2b2o18b2o2bo6bo2b2o33b3o23bo3bo363bobo 30b2o23bo180b2o2b2o4b2o2b2o15bo198b3ob3o3b3ob3o13b3ob3o3b3ob3o67bo302b o4bo45b2o6b2o8b2o77b2o14b3o8b2o122b2obo4bo9b2obo6b2obo$23b2o2b2o61bo4b 2o51bobo15bobo14b3o14b4o10bobobo10b2obo12bo4b2o33bo2bo2bo8b2obobo12bo 15bobobo2bo10bobo14b3o12bob3o31bobobobobobo12bob4o3bo14bob4ob2o16bob4o bobo18bo4bo15b2o4b2o7b2o18b2o18b2o30b2o66bo6bo3bo3b2o2bobo2b2o3bo3bo5b o3bo3bo34b2o2bo2bob2o3b2obo2bo2b2o35b2o451bo8bo24bo8bo63b3o56bo3bo304b 2o41bo12bo182bo2bo5bo5bob2o12b3o2b2o196b2obob2o23b2obob2o161bo3bo268bo 10bo77b2o12bo3bo8b2o21bobo98bob2o4b2o8bob2o6bob2o$148bobo16bo47bobo11b ob2o13b3o34bo4bob2o14b2o8bobob2o11bo2bob3o9b3obo13bo15bo4bo30bo3bobobo 11bo2bo5b3obo13bo4bobobo12bo2bo6bo2b2o16bo4bo15bo5bo6bo2bo12bob2o6bo 29b2obob2o10bo71bo13bobobobo24bob2o12bo17b2o3b2o11b2o3b2o33bo2bo451bo 8bo24bo8bo37bo84bo4bo303bo43b2o10b3o67b2o13b2o95bo4bo5bo4b2obo15bo196b 2o9b2o17b2o9b2o158bo3bo269b3o4b3o91bo4bo32b2o$149bo33b2obo13b2o14bo31b ob2o30bo2bobobo10b2o2bobo8b3obobo2bo8b3o13bo4b3o10bo4bo8b2obobo2bo27b 2obobobobob2o9bobobo2b2o5bo2bo9b2obo3b2obo11bobobo2bobo2bobobo8b2o7b2o 18bo5bo21bo2bo3bo17bo3bo13bo14bo3bo15b2obo7bob2o31bobobo14bobobobo23bo 4bo11bo530bo8bo24bo8bo27b2o7b3o25bo44b2o12bo3bo346b2o80bo17bo94b2o2b2o 4b2o8b2o10b2obobobo192bo11bo17bo11bo403bo7bo6bo15bo4bo93bo3bo33bo$183b ob2o13b2o47bobo30bo6bo14bobo8b2o4bobobo8bo2bob2o8bobobo3bo8b3obo2bo7b 2obobob2ob2o25bobobo3bo13bo2bo5b2o2bobobo9bo4bobo2b2o10b2o2bo6bo2bo9bo 2b3o22b2o4b2o5bo2bo11bo3bob3o16bo4bo10bo5bo11bo3b2o14bo13bo30b4o17bo3b o25bo14b2obo25b2ob2o495b2o2bo6bo2b2o18b2o2bo6bo2b2o23bobo34b3o7b2o34b 2o14b3o298bo132bo11bo101bo5bo10bo10b2obobob3o191bo9bo19bo9bo160b3o240b obo5bobo6bo4b2o$88b2o15bo177bob2obob2o9bobo2b2o7bo2bo2bo2bo9b2obo2bo 12bob2o9bo5b2o11bo4bobo23bobobobobobo16bob3o5bo2bo10bob4ob3o2bo11bobob 4obo13b2o8bo18b2obo8bo2bo9bo11bo12bobobo13b5o14bobo16b2o9b2o85b2o13b2o 22bo2bobo2bo41b2obo12bo176bo2bobo2bo108bo7bo65bo14bo51bobo3bo4bo3bobo 16bobo3bo4bo3bobo22bobob2o41bobo73bobo274b2o129b2o2b2o5b2o2b2o95b2o3bo 5bo8bo15b2o4bo189b2o9b2o17b2o9b2o403bo7bo5b3o3bo2bo2b2o102bo3bo$65b2o 22bo14bobo179bobo2bo9b2o2bo12bob2o15bobo10bo4bo9bo2bo17b4o26b2o2bo2b3o 18bo3b4obo14bo4bo4b2o11bo2bo4bo19bo3bobo17bob2o9bobo12b3obo3bo12bobobo 32b2o3bo11b3o2b9o2b3o78b2o14bo26b3o3b3o43bobo2b2o6bob4o172b4ob4o107bob o5bobo63bobo3b3o6bobo50bo7b2o7bo16bo7b2o7bo23bobobo4bo33b2obobo74b2o 142b2o9b2o2b2o9b2o15b2o9b2o2b2o9b2o49bobo8bobo242bo2b2o4b2o8b2o16b4o 656bobo4bo2bo99bo4bo$41b2o6b2o13bo2bo2b2o17bob2o11bob3o179bobo8bo3bobo 10bobo19bo12b3obo10bo53bo24bo2bo3bo17b2o2bo15b2o3b3o21bo2bobo16b2o4b2o 8bo13bo3bo2bo11bo4bo34bo3bo11bo2bo11bo2bo30b4o14b3ob3o27bo11b2o78bo4bo 5bobob3o170b2o9b2o106bo7bo14bo7bo42bo4bobo7bo50b2o16b2o14b2o16b2o24bo 35bo4bobobo75bo18b2obo3bob2o115bo9bo4bo9bo17bo9bo4bo9bo50bo3bo143bo5bo 100bo5b2obo6bob2o18bo161b2ob2o494bo5bobobo85b2o12bo3bo$16bo2bo6b2o8b2o 3bobo3bo2bo3b2obo6bobo4bo2bo13b2o2bo10b2o4bo179bo9b2ob2ob2o10b2o34b2o 31b2o33b3o20b2o5bo17b2ob2o23b2o15b2o5bobo17bo5bo20bo6b2obo11bo3bo15b3o b3o18bo11b2o13b2o29bobobo16bo3bo24bo4bo9b2o26b2obobob2o45bo8bobo144b2o 3b2o20b2obobob7obobob2o124bobo5bobo46b3o68bo31bo33bo2bo6b2o6b3o24bo96b o2bo3bo2bo114bo11bo2bo11bo15bo11bo2bo11bo39b2o12bo10b2o238b2o4bob2o6b 2obo19bo159bobobo475bo5bo16b2obo2bo86b2o14b3o$16b4o6bo2bo4bo2bo5bo3b3o 4b2ob3o5bo5bobobo9bo4b2o10bo3b3o7bo269b2o35bo27b2o60bo2b3o3bo19bo5bo7b 2o13b2o60b2o57bo21bo3bo25b2obo10b3o25bob2ob2obo45bo2bo6bo144bo2bobo2bo 19b2obo2b2o2bo2b2o2bob2o125bo7bo117bo2bo28bo2bo34bo6b3o5bobo6b3o6b2o6b o2bo95b3o3b3o115b2o9b2o2b2o9b2o15b2o9b2o2b2o9b2o39b2o8bo4bo7bo2bo50bob o74b3o9b3o134b2o158bo4bo474b3o3b3o15bo2bo142b2o$14b2o4b2o6b2o4b2o6b2ob 2o13bo7b2obo2bo10b5o12b5o8bobobob2o390b2o26b2o4b2o7b2o15bo18b2o60b3o 38bo52bo101b2o139b2o3b2o3b2o3b2o10b2o6b2o11b2o6b2o15b2o3b2o137bo2bo4bo 2bo16bo2bo4bo2bo47bo2bo28bo2bo30bo3bo3bo2b2o6b3o6bobo5b3o6bo83b2o141b 2ob2o10b2ob2o23b2ob2o10b2ob2o57bo7bo55b2o65bo31bo285bob2o2b2o466b3o2b 2ob2ob2ob2o2b3o6bo4bo143b2o$13bobob2obobo6bob2obo9bo2bo6b2ob3o8bo2bo 11b2o4bo10b2o12bob2ob2obo420b2obo27bo2bo114bo2bo17b3ob3o27b2o95b2o4b2o 139bo15bo10bo4b3o15b3o4bo14bo2bobo2bo51bo7bo14b3o3b3o51b3o2b6o2b3o12b 3o2b6o2b3o47bo31bo31bo3bo23b3o6b2o2bo3bo3bo79bobo134b3obo7bob4obo7bob 3o11b3obo7bob4obo7bob3o47bo3bo7bo55bo65bo2bo8bobo5bobo8bo2bo282bobob2o 4bo471b3o3b3o12b5o347b2o6b2o$13bobob2obobo6bob2obo9bo2bo7bobo7bo4bo13b o2b2o10bobo2b3o7bo200bo227bob2o145bobo53bo95b2o4b2o136b2obo15bob2o9bob o2bo15bo2bobo12b2o3b2o3b2o3b2o46bobo5bobo13bobo3bobo53bo2bo4bo2bo5b3o 8bo2bo4bo2bo38b2o16b2o15b2o16b2o24bo5bo34bo3bo81bo133bo2b2o4bo4b2o2b2o 4bo4b2o2bo9bo2b2o4bo4b2o2b2o4bo4b2o2bo46bobo9bo100b2obo6b2obo7bo2bo3bo 4bobo5bobo4bo3bo2bo281bobobo2b2ob2o462b2o8bo5bo8b2o143b2obo10b3o187bo 6bo2bo4bo2bo$14b2o4b2o6b2o4b2o9b2ob2o5bobo7b5o14bobo10b3obobo2bo6b2o 199b2o72b2o597bobob2o13b2obo2bo6b2ob2o19b2ob2o11bo15bo47bo7bo14b3o3b3o 70bobo59bo7b2o7bo17bo7b2o7bo22bo2bo34bo5bo85b2o104b2o10b2o14b2o4b7o8b 7o4b2o9b2o4b7o8b7o4b2o59bo2bo5b2o6b2o81bob2o6bob2o9bo4bo6bo5bo6bo4bo4b o2b2o274bobobo2b2o464bobo23bobo4bo137bob2o10bo190b2o4bo2bo4bo2bo$16b4o 6bo2bo4bo2bo4b3o3bo7bo22bo2bobobo9bo4bobo181b2o5b2o15bo4b2o2bo65b2obob o454b2o141bobo5b3o3b3o5bob2o8bo2bo4b3o3b3o4bo2bo10b2obo15bob2o146b3o 59bobo3bo4bo3bobo17bobo3bo4bo3bobo24bo41bo2bo135bo2bo48bo2bo8bo2bo19bo bobobo8bobobobo21bobobobo8bobobobo67b2o5bobo5bobo40b2o36b2o4b2o2b2o4b 2o12bob2o13b2obo8bobo2bo275bobob2o3b2o316bo144bo27bo3bobo151bo188b2o5b o2bo4bo2bo$16bo2bo6b2o8b2o3bo2bo3bobo16bo11b4ob2o11b2ob2ob2o180bo7bo 15b2o2bo2b3o13b2o2b2o28b2o17bobo37b2o26b2o257bob2ob2obo123b2o139b2o2bo 5bobo3bobo5bo11bob2o4bobo3bobo4b2obo8bo2bob2o13b2obobo208b2o2bo6bo2b2o 19b2o2bo6bo2b2o23bobobo4b3o33bo66b3o5b3o38b4o22bo47b3o2b6o2b3o21bobo 12bobo25bobo12bobo78bo7bo40bobo35bo5bo3bo5bo9bo27bo4bobobo278bobo2b2ob o43b2o270b2o143b2o27b2o3bo349b2o6b2o$41b2o6b2o15bobo14bo14bobo181b2obo 7bob2o9bo2b2o2bo17bobo2bobo18b3obobo21bobo3b2o33bo24bo2bo252bo3bo9bo3b o258bo4b2o4b3o3b3o4b2o10b2obo5b3o3b3o5bob2o7b2obo5b3o3b3o5bobo89b3o3b 3o113bo8bo25bo8bo25bobob2o5bo25b3o4bobobo63b2ob2o3b2ob2o36bo3bo18bo3bo 50b2o6b2o20b3o5b3o4b3o5b3o17b3o5b3o4b3o5b3o74b2o6b2o41bo36bo5bo3bo5bo 8bobo3b3o11b3o3bobo3b2obob2o277bo2bo2bo44bo2bo3b2o263b3obo9b2o$67bo13b obo14bobo181b2obob5obob2o9b3o2bob4o14bo6bo14b2obo6bobo2bob2o12b2o3bo2b o32bo25b3o24b2o18bo22b2ob2o180b2o7bobo7b2o257b5o31bo2bo19bo2bo10bo5bob o3bobo5bo2b2o41b3o3b3o37bobo3bobo113bo8bo25bo8bo25bobo35bo5b2obobo62b 2obobobobob2o19b2o19bo19b4o49bo10bo18bobobo3bobobo2bobobo3bobobo15bobo bo3bobobo2bobobo3bobobo124b2o34b2o4b2o2b2o4b2o38bo3b2o3bo105bo15bo2bo 15bo58bo15bo58b2o3bob2o44b2obo3bo2b2ob2o230bo25b2o13b2o137b2o13b2o$81b 2o16bo186bo2bo2bo18bo5bo10b2ob2o5bob2o9bo2bobo3bo4b4obo2bo10bo2b5o33b 2o50bobo17bobo22bobobo180bo2b2ob2o3b2ob2o2bo262bo24b2o3bobo2b2o17b2o2b obo8b2o4b3o3b3o4b2o4bo40bobo3bobo37b3o3b3o30bo2bo4bo2bo5b3o8bo2bo4bo2b o43bo8bo25bo8bo26b2o7b3o34bobo63bo3bobo3bo20b2o15bo2bo32b2o39b2obo4bob 2o18b2o2b5o2b2o2b2o2b5o2b2o15b2o2b5o2b2o2b2o2b5o2b2o162b2obo4bo5bo42b 2o2b2obo104b3o11b3o2b3o11b3o39bo15bo2b3o11b3o57bo2b3o2bob2obo41bob2o3b 2obobo75bo155b2o25b2o151b2o13b2o$246b2o39b5o14b3o2bob4o11bo2bo2bobobo 2bo9b2obobo13bob2o11b2o40bo21b7o15b2o4bo13b2o4bobo22bo2b2o176b2ob2o2bo 11bo2b2ob2o252b4o27bobobobo27bobo28b5o40b3o3b3o74b3o2b6o2b3o3bobo6b3o 2b6o2b3o38b2o2bo6bo2b2o19b2o2bo6bo2b2o31bo3bo23b3o7b2o64bo2bo3bo2bo73b obo43b2o256bob2o5bo5bo37bo3bobo2bobo107bo9bo8bo9bo42b3o11b3o5bo9bo61b 2o7bob2o40bo4bo3bobobobo2bo70bo5bo136b2o9bob3o25bo$247bo7bo50bo2b2o2bo 15bobobo2bobobo13bo15bo15bob4o31b4obo19bo7bo15bo2b2obo13bo2b2obob2o17b ob2o90bo36bo51bo7b2o9b2o7bo251bo2bo29bobo31bo2b2o24bo129bo2bo4bo2bo5b 3o8bo2bo4bo2bo39bobo3bo4bo3bobo17bobo3bo4bo3bobo29bo5bo21bo3bo73b3o3b 3o76bo52bo246b2o4b2o2b2o4b2o41b2o2b3o107b2o9b2o6b2o9b2o44bo9bo7b2o9b2o 61bob2obobo43bob3o4bo2b2ob5ob2o67bo5b3o134b2o13b2o169b2o27b2o$247bobo 3b3o33bo19b2o2bo2b3o11b2obo2bob2o14b2o13b2o15bobo2bo30bo5bo18bob2o3b2o bo14bobobobo13bobobobobo2bo14bo4b4o85bobo35b3o53bo3bo11bo3bo287b2ob2o 29b2obobo27b4o106bo95bo7b2o7bo17bo7b2o7bo29bobobobo20bo5bo157b2o37bo 12b2o21b3o10b3o27b3o10b3o166bo5bo3bo5bo39bo3b2o186b2o9b2o80bobo3bo44bo bo2bobo3bobobo3b4o59b2o6b2o7bo147b2o25bo145bo27bo$242b2o4b2o2bo35bobo 18bo4b2o2bo15b2o51bo33bob2o4b2o12b2o2bobo5bobo11b2obo2bo2bob2o7b2obo2b obo2bob2o14bo4bo2bo32bo16bob2o33bo18b2o19bo48b2obo21bob2o265b2o3b2o27b 2o3b2o14bo29bo2bo84bo11b3o6bobo93b2o16b2o15b2o16b2o27b2obobob2o19bobob obo138b3o8b2o45b2o34bobo2b2o2b2o2bobo27bobo2b2o2b2o2bobo167bo5bo3bo5bo 8bobo3b3o11b3o3bobo3b2obob5o272b2obo43bob2obo3b2ob2o3bo4bo3b2o58bobo9b o4b2o147bo25b2o145bobo23bobo348bo$201b2o11bo2bo25bo7bobo35bo24b2o105bo bo7bo11bobobo9bob2o8b2obo4b2ob2o7b2obo7bobo14b2o39bobo15b2obo56b2o14b 2o9b2o316bo4b3o8bo3bo8b3o7b3o8bo3bo8b3o4b2o115bobo10bobo7bo175bo2b2ob 2o2bo17b2obobob2o121b2o12bo3bo8b2o51b3o2b3o2bobo17b3o10b3o27b3o10b3o 132b2o6b2o24b2o4b2o2b2o4b2o8bo27bo4bobo2bo2bo274bob4o39b2obo2bobobo6bo 2bobo63bobob2o2bo4bo177b2o13b2o132b2o8bo5bo8b2o161b3o185bo$2b2obo68b2o 6b3o23bo11bo79bobo11bo2bo25bobo5bobo61bo100bob2obo8bobob2o9bobo9bobo 12bo5bo13bo7bobo14b2o4bo35bo34b2ob2o12b5o15b2obo2bo25bo316bobo3bobo5bo 9bo5bobo7bobo5bo9bo5bobo17b2o3b2o98bo11b3o41b3o139b2o7b2o16bo2b2ob2o2b o111bo7b2o12bo4bo51bobo2b3o2b3o4bob4o24b2o41b2o139bo2bo2bo2bo26b2obo6b 2obo14bob2o13b2obo8bo2bo279bo3b2o3b2o38bobob2obobobo5bob4o60bobobo7bo 152bo25b3obo9b2o141b3o3b3o147b2o8b3o8b2obob2o182bobo$2bob2o45b2o9b2o 11bo18b3o9bobo11bobo28bo48bo10b4o2b4o17b2o4b2o6bo163b2obobo8bob2obo8b 2obo9bobobo7b2obobobobob2o7b2obobobobobob2o15b4o53b3o14bobobo12bo5bo 15bob3o24bobo316bobo3b3o5b2o7b2o5b3o7b3o5b2o7b2o5b3o7b3o8bo3bo8b3o4bo 139bobo166b2o7b2o100b2o8b2o9bo11bo3bo52b4obo3bo3bo7b2o21bo6bo35bo6bo 59bobo110bob2o6bob2o9bo4bo6bo5bo6bo4bo4b2o82b2o4b2obo6b2obo179bo7bo40b obo3bobob5obo3b2o3b2o57bo5b3o154b2o25b2o148b3o2b2ob2ob2ob2o2b3o141b2o 8bo3bo5bo5b2o183bo$6b2o24b2o6bo11bo8bobo8bobo6b2o2bo6bo17bo7bo31bobo 44b2ob2o37bo7b3o170bo7bobo16bobo5bobo2b2o7b2obobobobob2o7b2obobobobobo 13b3o2b2o36b5o10b2obobobo13bobobo11bobobo2bo16bo20b3o4b2o318bo72bobo5b o9bo5bobo3bobo36bo7bo14b3o3b3o53bo2bo4bo2bo5b3o8bo2bo4bo2bo227b2o5b2o 21b2o7b2o56b2o4b2o4b2obo7b2o9bo137bo4bo2bo130bo2bo3bo4bobo5bobo4bo3bo 2bo87bo4bob2o6bob2o11b3o3b3o10b3o3b3o66b3o3b3o49bo16bo4bobo42bob2obobo 5bobo7bo57bo2bo25bo120b2o13b2o25bo154b3o3b3o157bo4bo5b2obob2o183bo$6bo 6b3o6b3o8bo7b2o6bobo40bo3bo7b2o13b5o25bobobo14b2o16bo11bobo14b2o22bobo 5b3o171b2o4b2obo16bob2o3b2obo14bobo3bo13bobo3bobo16bo36bobo5bobo7b2obo 3bo10b2obo3bob2o8bobo2bob2o10bo4b4o16bo3bo396b3o5b2o7b2o5b3o3bobo35bob o5bobo13bobo3bobo51b3o2b6o2b3o12b3o2b6o2b3o225b2o5b2o31b2o2b2o17bo3bo 30bo5bo4bob2o18bo47b2o41b2o46b2o5b2o8bo63bob2o2b2obo47bo2bo8bobo5bobo 8bo2bo86bo3b2o4b2o2b2o4b2o9bo2bobo2bo10bo2bobo2bo47b3o3b3o10bo2bobo2bo 48bobo20b2o10b2o31b2obobobo2b2obo2bo4bobo28b2o4bob2o6b2obo9bo28bo120b 2o9bob3o182bo5bo159bo3bo7b3o185bo$7bo13b3o6bo8b2o7bo10bobo8bobo9bo2b2o 5bobo15b2o6bo30bo3bo13bo2bo11b2obobo10bobob2o30b2o4b2o9b2o170bo5bo18bo 7bo15bo2b2obo13bo2b2obob2o12bo2bo36b2obo3bob2o10bo3bob2o7b2obo3bob2o7b 2obo2bobo9bob2o3bo2bo15bo5bo322bo103bo37bo7bo14b3o3b3o26b3o24bo2bo4bo 2bo16bo2bo4bo2bo290bo4bo28bo5bo3b2o4b2o41bo8bo4bo7bo2bo17bo8bo4bo7bo2b o40b2o8bo3b2o5bobo57b2o2bobo6bobo2b2o43bo31bo87b2o2bo5bo3bo5bo9bo9bo3b 2o3bo9bo46bo2bobo2bo9bo9bo48bo33bobo36bo3bob2o7b2o6bo23bo4b2obo6bob2o 9bo3bo2b2o20bo133b2o549bo$6b2o22b2o9bo6b2o8bo10bo24bo2b2o6bo14bobo24b 2o2bo2b2o11bobo2bo10bobo2bo8b2obo13b4o17bo7b3o5bobo38b3o18bo109bob4o 20b7o15b2o4bo13b2o4bobo15bobo39bo3bo13bo3bob2o10bo3bo11bo2bobobo9bo3b 3ob2o17bo3bo122bo199bobo3b3o5b2o7b2o5b3o7b3o5b2o7b2o5b3o129bo4bobo7bo 347bo3bo8b2o18b2o4b2o2bo5bo16b2o35b2o8bo2bo29b2o8bo2bo41b2o10b2o6bob2o 50bo6bo4bo8bo4bo6bo45b3o9b3o101bo5bo3bo5bo24bo58bo9bo98b2obobo59bobo 20bo3b2o8b2o13bo3bo2b3o18b2o133bo51bo5b2o291bo3bo36b2o156bobo$2b2obo 52b2o9b2o12b3o10bo10bobo10bo25bo4bo4bo9b2obob2o9bo2bob2o11bobo9b3o2b3o 15bobo5b3o7bo35b2ob2o18bobob2o32bo17bo16bobo36bo52bobo17bobo12b2o43bo 3bo14b3o14bobobo11bo5bo12b2obobo14b2o4b3o90bo10bo9b2o9bobo198bobo3bobo 5bo9bo5bobo7bobo5bo9bo5bobo38bo89bobo3b3o6bobo32b3o313b3o8b2o20bob2o5b o5bo14bo2bo21b3obo17bo7bo12b3obo17bo8bo45bo2bo6b2ob2o10b2o37bobo9bo10b o9bobo155b2o2b2o4b2o2b2o4b2o7bo11bobo4bo11bo62bo11bo45b5o28bobobo59bob o21b2o3bo8bo14bo5b5o15bo187b3o4b2o124bo7bo157bo4bo36bobo156bo$2bob2o 101bo37bobob2ob2obobo8bo15b2o13b2o13bo6bo10b2o4b2o9b2o4b2o34b2ob2o17bo 2bobo12b2o17b3o16bobo13b3ob3o35b2o24b3o24b2o18bo12bobo44b3o33b2ob2o11b 5o14bobobo13bobo96bobo8bobo8b2o10bo200bo4b3o8bo3bo8b3o7b3o8bo3bo8b3o7b 3o5b2o7b2o5b3o3bobo89bo14bo28bo4bobo7bo279b2o2b2o53b2obo4b2o4b2o15b2o 21bob2o11bo7bobo17bob2o11bo7bobo52bobo8bob2o10b2o38bo7bo2bo10bo2bo7bo 49bo5bo101bo2bo5bo5b2obo9bo4bobo4bo2b2o2bo4bobo4bo43bo11bo2b2o2bo4bobo 4bo44bo4bo30bo63bo25bo10bo13bo2bo3b3o6b3o6bo4bo182b2ob2o128bobo5bobo 146b2o8bo3bo12b2o25bo156bo$2o144bo4bo4bo10b3ob4o10bob2o8bo2bobo9b3o2b 3o11bo7b3o5bobo40bo20bob2obo2bo9bo17bob2o16bobo12bo7bo35bo23bo2bo57b2o 62bob2o48bobob2o14bo99bo10bo165b2o4bo4b2o59b2o3b2o27b2o3b2o17bobo5bo9b o5bobo3bobo59bo7bo64bobo3b3o6bobo268b2o7b2o62b2o4b2obo40b2obo10bo2bo6b o4b3obo9b2obo10bo2bo6bo5b3obo55bobo240bo4bo5bo4bob2o14bobo16bobo48bo4b obo4bo4bo6bobo48bo2bo32b2o85b2o2b2o8b2o14bo5b2o7bobo6bo9b2o310bo7bo 147b2o8b3o14b2o25b2o$o146b2o2bo2b2o15bo2bo7b2obo2bo9bobo13b4o13bobo5b 3o7bo58b2obo3bob3o10bo16b2o17b2ob2o10bobob5obo33bo24b2o106b2obo13b2obo 33bo14b2o17b2o9b2o33bobobo69bo29b3ob3o120bo2bobo3bobo2bo76b2ob2o29b2o 4b3o8bo3bo8b3o4bo59bobo5bobo64bo14bo269b2o8b2o62bo4bob2o17b2o19bob3o4b o6bo2bo10bob2o9bob3o5bo5bo2bo11bob2o48bo9bo52bo5bo18bo5bo45b2o2b2o5b2o 2b2o95b2o2b2o4b2o2b2o4b2o8bo3bobo3bo8bo3bobo3bo49bobo6bo5bo3bobo3bo41b o2bob2o31b3o86bo4bob2o6b2obo8bobobo12b3o8b3o5bobo174bobobobo$bo147bo3b o12bob2o12b2obobo9b2obob2o28b2o9b2o4b2o31b2o22bo2bob4obo10b4o13b2obo2b 3o12bo5bo9bobo3bo3bo33b2o131bob2o49bobo43bo34bobobo11b3ob3o10b3ob3o33b obo2bobo4bobo2b2o5bo3b2o4bo123b3o9b3o44bo2bo29bobo31bo14b2o3b2o75bo7bo 361bo61bo3b2o4b2o14bo2bo26bobo7bo11b2obo18bobo6bo12b2obo38b2o7bo62b3o 3b3o16b3o3b3o46bo11bo101bo5bo3bo5bo9b2o2bobo2b2o8b2o2bobo2b2o45bo3bobo 3bo3b2o3b2o2bobo2b2o40bobobo5bo28b3o27b2ob2o35b2o16bo5b2obo6bob2o7bobo b2o28b2obobo$2o115bo31bobobo12b2ob2o15bo11bobo14b2o18b3o5bobo36b2ob2o 3bo15b2obo5bob3o7bo16bo2bo2bobo11bobobobobo7b2ob2o4bob2o219bo45b3o31bo 3bo4bo3b2o4bo16bo4b2o3bo5b2o2bobo4bobo2b2o3bo2bobo2bo2bo2bobo2bo4b2ob 3ob2o3b2o81b2o4bo4b2o29b2o5b2o47b4o27bobobobo27bobob2o525b2o2bo5bo16b 2o21bo7bo17bob3o12bo8bo17bob3o38b3o7b3o59bobobobobobo14bobobobobobo42b o17bo94b2o3bo5bo3bo5bo8b5ob5o8b5ob5o45b2o2bobo2b2o8b5ob5o41bo2bo4bobo 27b3o27b2obo36b2o16b2o8b2o2b2o4b2o5bobo5b3o23bobobo176b2ob2o$2b2obo47b o16b2ob2o7bo9bob2o8bo10b3o32bobo43bobob2o33b3o7bo37bo2bo2b2ob4ob2o10bo 5bobo2bo8b4o13b2obob2ob3o7bobo3bobo10bo5bo270bo32bobo5b2ob3ob2o3b2o10b 2o3b2ob3ob2o4bo2bobo2bo2bo2bobo2bo3b2o2bobo4bobo2b2o5bo3b2o4bo40b2o9b 2o30bo2bobo3bobo2bo22b2o3bo2b5o2bo52bo24b2o3b2o27b2o2bo29bo2bo498bo5bo 42bo2bo8b2o30bo2bo8b2o50bob2o15b2o51b3ob2ob2ob3o4b3o5b3ob2ob2ob3o42b2o 13b2o96bo2b2o4b2o2b2o4b2o9bo2bobo2bo10bo2bobo2bo46b5ob5o9bo2bobo2bo45b 2o2bo2bo28b2o23b2o6bo64bo2bo5bo7b2o9bo23bo130b2o40b2o4b2ob2o$2bob2o22b 3o7bo12b3o16bo3bo6bobo8b2obo6b3o9bo36bo44b2o2bo10b4o2b4o11bo6b2o4b2o 36b2ob4ob2o2bo2bo10b2o4bo3bo13bob2o10bo2bo3b2o7b2obo3bob2o6b2obo4b2ob 2o299bo3bo4bo3b2o4bo16bo4b2o3bo5b2o2bobo4bobo2bobo33b3ob3o36bo2bo7bo2b o29b3o9b3o21bobo3b2o7b2o3bo2b2o40b5o62bobo27b4o497b2o4b2o16bo24bo2bo7b o4bo8bo18bo2bo7bo4bo8bo38bobo13b3o2bo52bobobobobobo5bobo6bobobobobobo 155bo5b2obo6b2obo12b2o3b2o12b2o3b2o48bo2bobo2bo11b2o3b2o51b2o8b3o19bo 20b2o2b7obo52b2o8bo4bo5bo12bo4bo16bo5bo2bo128b2o39bobo6bo$13b2ob3o5b2o 12bobo9bo7b2o4b2o5b3o6bo2bo17bo12bo2b3o80bobo11bo2bo13bobo5bobo49bo3b 2ob2o15b4o13b2obo2bo8bo5bobo7bo2bobobo2bo7bo3bo3bobo61b2o18bo218bobobo 11b3ob3o10b3ob3o29bo77b3o9b3o32b2o5b2o24bobob2o13bobo2bo40bo4b2o4b3o3b 3o4b2o13b2o4b3o3b3o4b2o8b2o24bo499b2o4b2obo7b2o9bo25b2o42b2o61bo2bo15b 2o54b3o3b3o6b3o7b3o3b3o156b2o4bob2o6bob2o87b2o3b2o78b2o2bo17bobobo17bo b2o7bobo10b3o40bo8b2o2b2o4b2o16bo17b2o4bo174bo231b2o$13bo10bobob2o6bo 14bo6bobo2bobo13bo4b2o6b3o6b6o6b2obo3bo80b2o11bo2bo13bobo7bo56b2o12bo 15bob2o3bob2o9b7o10bo5bo9bob5obobo61bo17b3o23b2o193bobobo72bo10bo34b2o bo6b2obo8b2o3b9o34bo2b5o2bo24bobobo13bobobo42b2o2bo5bobo3bobo5bo13bo5b obo3bobo5bo34b5o495b2o4bob2o7b4obo3bo3bo7b2o122b2o12bo60bo5bo18bo5bo 349bo2b2o17b2obobo15bo4b3o3b2ob2o7b2o2bo39bo5bob2o6b2obo15b2o19bo5bo3b o402b2o$14bo3bo16bob5o6bo2bo8bo2bo16b2o4bo4bo3bo11bo8bo3bo111bo2b2o4b 2o69b5o12bo5bo14bo15b2ob2o11bo7bo60bobo16bo25bobo248bo10b2o8bobo8bobo 33bob2o6bob2o7bobo2bo2b5o2bo4b2o18b2o7b2o7b2o26bo14b2obob2o43bobo5b3o 3b3o5bob2o7b2obo5b3o3b3o5bob2o10b2o4b3o3b3o4b2o4bo417b2o5b2o86bobo2b3o 2b3o4bob4o23bo6bo36bo6bo61bo441b3o22bobo15bob2o4b2ob2o3bo6bo2b2o16b2o 21b2o4b2obo6bob2o15bo26bo3bo402b2o26bo$19bo6bobo7bo10bob2o9bo2bo7b3o8b o2bo5bo3bo7bo3bo8bo3bob2o105b3o3bobo53bo24bo17b2o16bo14bobo13b3ob3o61b 2o16bob5o18b3o25bo223bobo9b2o9bo10bo38b2o2b2o4b2o5bobobobo2b3o2b2o3bo 2bo17bobo26b2o14bo2bo10bo3b2o3bo42bobob2o13b2obo2bo8bobob2o13b2obobo 11bo5bobo3bobo5bo2b2o418b2o5b2o96b3o2b3o2bobo26b2o42b2o57bobo8b2o461b 2o17b2o3bo6bobo7b3o18bo57bo26bo406bo10b2o15b2o8b2o$14b3ob2o5bo12bobo6b o13b2o7bo3bo7bobo7bobo8b2obo10b3o2bo106bo7bo50b2ob2o21bo36b2o14bobo15b obo39b2o18b2o20bobo4bo16bo3bo23bobo223bo71bo3bo5bo7bobobo13bobo2bo2bo 14b3o23bobo14bo7bo8b2o2b2obo42b2obo15bob2o10bobobo15bobobo8b2obo5b3o3b 3o5bobo519b2o36b3o10b3o28b3o10b3o51b2o5b3o2bo272b2o9b2o6b2o9b2o62b2o9b 2o102b2obob2o3b3o29b3o54bo26bo2bo402bobo9b2o16b2o7b2o$25b2o11bo7b2o22b 2ob2o8bo6bobobobo10b3o12bo114b2o49b2ob2o21b2o52bo58bo20bo17b2obo2b2o2b o15bob4o24bo297bo3bo5bo8bo14b2obob5o13bo3bo20b3o16bo3bo2bobo3bo3bobo2b obo45bo15bo14bo2bo15bo2bo9bo2bob2o13b2obobo519bo12b2o23bobo2b2o2b2o2bo bo28bobo2b2o2b2o2bobo51bo10b2o273bo9bo8bo9bo44b2o9b2o7bo9bo61bo41b2obo b2o3b3o31bo74b3o5bo404bob2o21b2o2b2o$90b2o3b2o12bo9b3o165b3o135bobo20b o16bobobobo2bobob2o12bo326b2o2b2o4b2o7b2o13bo2b2o19b3o2bo2bo12b2obo3bo 15bo6bo2bo6b2o2b3o46b2o3b2o3b2o3b2o17b2o3b2o3b2o3b2o14b2obo15bob2o534b o23b3o10b3o28b3o10b3o117bo7bo16bo7bo183b3o11b3o2b3o11b3o42bo9bo5b3o11b 3o57bo40b2o3bo6bobo104bo7bobobo128b3o3b3o$119bo305b2o21b2o15b2o2bo4bob obo11b2o4b2o5b2o15b5o55bo234b2obo4bo5bo7b3o7b3o2b3o3b2obo20bob2o10bo5b ob2o15bo2bo4b2o4bo3b2o54bo2bobo2bo25bo2bobo2bo21bo15bo528b2o207bobo5bo bo4b6o4bobo5bobo182bo15bo2bo15bo39b3o11b3o2bo15bo58bo38bob2o4b2ob2o3bo 103bo4bo2b2obobo127bo2bobo2bo281bo$421b2o20b2o24bo3bob2obo10bo5bo2bob 2o2bo15bo4bo53bobo50bo21b2o159bob2o5bo5bo6b3o7bobo2b3o2b2obobo14b3o2bo 2bo4b3o3bo5bo19bo14b2obob5o49b2o3b2o27b2o3b2o22b2o3b2o3b2o3b2o523b2obo 4bob2o203bo7bo4bobo2bobo4bo7bo56b2o10b2o188bo15bo116bo4b3o3b2ob2o99b2o 4bo9bobo126bo3bobo3bo38b2obo3bob2o216b2o11b5o$422bo21bo18b6o8bo10bobo 7bobob2o17b2obobo27b2o7b2o15bo39b2o8b3o22bo157b2o8b2o4b2o6b3o7b3o2b3o 3b2o2bo14bo3bo8bobo3bo5bob2o14bobobo5bo7bobo2bo2bo116bo2bobo2bo527bo 10bo20b2o2b5o2b2o2b2o2b5o2b2o16b2o2b5o2b2o2b2o2b5o2b2o122b3o6b3o66bo2b o8bo2bo286b5o30bob2o7bobo100bo7b2o6b2o127b4o3b4o38bo2bo3bo2bo216b2o10b o2bob2o5b2o2b2o$422bo21bo17bo8b6o11bobo2bo3bo2bobo18bo2bobo27bo2b2ob2o 2bo35bo20bo7bo24bo158bo9bo5bo8b2o13bo2b2o3bo16b3o9b3o5b2obo3bo13bobob 2o3bo3bo5bo2bo122b2o3b2o529b2o6b2o21bobobo3bobobo2bobobo3bobobo16bobob o3bobobo2bobobo3bobobo40b2obob2o74bo4bo2bo4bo65b3o2b6o2b3o285bo5bo30b 2o2b7obo13b3o85b3o5bo136bo7bo40b3o3b3o228bo7bo9b2o7b2o$62bo56bo302b2o 20b2o15bob2obo3bo16b2obobo7bobo13b2o3b2o2bo29b2obobob2o14b5o17b3o8b2o 8bobo5b2o23b4o156bo9bo5bo8bo14b2obob2o15bobo23b3o14bobo17b2o656b3o2b6o 2b3o19b3o5b3o4b3o5b3o18b3o5b3o4b3o5b3o121bobo4b2o4bobo67b2o6b2o328b2o 6bo9b2ob7ob2o82bo5bo156b2o265bo2bob2o9b2o8b2o$13b2o2b2o10b2ob2o12bo15b obo16bo15b2o3b2o14bobo169bo36b2o89b2o19b2o20bobobo4bo2b2o11bo2b2obo2bo 5bo11bo2bob3o35bobobobo14bo4bo20bo7bo10b2o13bo14b2o4bo106bobobo43b2o8b 2o4b2o6bobobo13bobobo16b2o14bo11bobo13b2o5bo5bo210b2o323b2o5b2o119bo2b o8bo2bo23bobo12bobo26bobo12bobo45bo5bo73bobo2bo4bo2bobo66bo10bo286b2o 5b2o36b2obo10bo3bobobo3bo88bo156b2o221bob2o6bob2o6b2obo21b5o10bo$13bo 2bobo9bob2o2bo11bobo11bo17b2obob2o14bobo2bo10b2o2bo2b2o164b3o36b2o15bo 2b2o32bo35bobo20bo19b2obobo2bobobobo11b2o5b2o4b2o11bobobobobo35bob3obo 13bo2bo22bo6bobo14b3o6b3o13bobob3o34b3ob3o19b3ob3o40bobobo26b3ob3o12b 2obo6b2obo7bobobobo2b3o2b2o3bobo2bo26b2obo3bob2o7b2o18b3ob3ob3o208b2o 323b2o5b2o120b2o10b2o22bobobobo8bobobobo22bobobobo8bobobobo122b2obob3o 2b3obob2o65b2obo4bob2o285bo4bo4bo35b2ob2o10b4o3b4o469b2obo6b2obo6bob2o 23bo$14bo13b2o4bo9bo4bo15b2o10bo3bo3bo10bo5b2o11bo4b2obo163bo20b2o33bo bo2bo11b2ob2o16b3o4bo28bo22bo22bo2b2o2bob2o24bo14bo2bo40b5o11bo2bob2o 22bo3bo2b2o15bo2bo4bo13bo2bo2b2o4bo34bo4b2o3bo5bo3b2o4bo43bo3bo4bo3b2o 2b2o5bo3b2o4bo15bob2o6bob2o7bobo2bo2b5o2bo4bo2b2o26bo9bo26bo3b2ob2o3bo 691b2o4b7o8b7o4b2o10b2o4b7o8b7o4b2o38b2ob2o71bo2bob2o3b2o3b2obo2bo68b 2o289b2o9b2o51bo5bo469b2o8b2o14b2o$17bo11bo3bo10b6o9b2o16bobobobobo10b ob4o15b2ob2o165bo2b3o4b2o10bo15b6o11bo2bobo13bobobo18bo2bobo26b2o22b2o 21bo4bobo22b4obo17bob2o52bobobo4b2o24bo18bo7b2o11bobobo7bobo30b2o3b2ob 3ob2o5b2ob3ob2o3b2o41bobo5b2ob3obo2bo4b2ob3ob2o3b2o34b2o3b9o37b2o5b2o 28b4obob3obo277b2o412bo2b2o4bo4b2o2b2o4bo4b2o2bo10bo2b2o4bo4b2o2b2o4bo 4b2o2bo40bo73b2o3bob2ob2ob2obo3b2o359b2o9b2o51bo5bo470bo9bo14bo$13bobo 2bo9bo4b2o30bo12bo2bo2bo12b2o3b2o11bob2o4bo160b2obobobobobo2bo10bob2o 11bo6bo9bo4b2obobo7bo4bobo14b2obo2bo2bo45b2o26b5obo22bo3bo19bo2bo52bo 2bo3bo2bo2b2o16bo2bo19bo20bo2bo7bobo33bo4b2o3bo5bo3b2o4bo43bo3bo4bo3b 2o2b2o5bo3b2o4bo39b3o9b3o31b3o2b5o2b3o35bo278bobo412b3obo7bob4obo7bob 3o12b3obo7bob4obo7bob3o120bobo6bobo213b2o4b2o52b2o4b2o80b2ob3o7b3ob2o 42b2o3b2o5b2o3b2o463bo9bo16bo$13b2o2b2o9bo2b2obo11b2o13bo18bobo14b2o2b o2bo10b2o2bo2b2o161bobo2bo2bob3o8b3o2bobo11bo3bobo8bo3b2o2bob2o7b2o2b 3obo13bobob2obobo44bobo31bo24b3o21b2o56b2o2bobo4bo2bo14b3o23bo19bobo4b 2obob2o27b3ob3o19b3ob3o40bobobo26b3ob3o36bo2bo7bo2bo31bo2bo7bo2bo24bob 2obobobo210b3o70bo11bobo403b2ob2o10b2ob2o24b2ob2o10b2ob2o125b2obo2b2o 2bob2o77b2o133bobo2bobo52bobo2bobo80bo2bo2bo5bo2bo2bo42bo2b5obob5o2bo 463b2o8b2o14b2o$29b2ob2o12b2o12bo2bobo32bo3b2o14bobo164bo4b4o13b2o4bo 9bobobob2o10b2obobobo12bobo2bobo16b2obo2b2o42bo30b3o23bobo63b3o20bo5bo bobo31b2o7bo19b2o4bo2b2obo100bobobo70b2o9b2o33b2o9b2o25b2obob3ob2o209b 3o55b2o10bo2bo10bo2bo4bo263bo7bo122b2o9b2o2b2o9b2o16b2o9b2o2b2o9b2o45b 2o12b2o60bo2b3o2b3o2bo48b2o27b2o135b4o56b4o83bobo3bo3bo3bobo44b3o4b3o 4b3o272b2o5b2o185bob2o6bob2o6b2obo$60b2o2b2o53bo166b3obo3b4o11b4o9bobo b2o15bobo2bo12bobo4bo13b2o5bobo42b2o30bo25b2o65bo24b2obo2bo10b2o21bo4b o2bo21b2o3b2o267bo2bobo209bo3bo53b3o13bo9b2o5b2o263b4o3b4o121bo11bo2bo 11bo16bo11bo2bo11bo45bo13bo63bo2b4o2bo49b3o162bo2b2o2bo52bo2b2o2bo80b 2obo11bob2o332b2o5b2o185b2obo6b2obo6bob2o$214b2o67b3o2bo3bobo2bo23bo2b obob2obo8bob2o5b2o9b2ob4ob2o12bo4b3obo167bo24b2obo12bobo5b2o11b3o6b3o 21bo5bo268b2o2bo208bo5bo40bo8bob2o12bobo8b2o3bo8b2o258bo3bobo3bo122bo 9bo4bo9bo18bo9bo4bo9bo47b3o11b3o59b2obo4bob2o47bob2o156b2o4bo2b2o2bo 46b2o4bo2b2o2bo79bo2bo4bo3bo4bo2bo44b2o9b2o472b2o8b2o2b2o$213bo2bo25b 2o38bo3b2obo2b2o15b2o10bobo6b2o8b2o2b3o4bo15bo9b2ob2ob5o2bo164bo7bo17b o4bo13bo7bo12bo13b2o18b5o273b2o208bo3bo41bobo6bo2bo5bo6b2o11b2o10b2o 229bo5bo23bo2bobo2bo122b2o9b2o2b2o9b2o16b2o9b2o2b2o9b2o48bo13bo59bo2bo 4bo2bo46bobo157bo2bo5bo2bo47bo2bo5bo2bo82bobobob2o3b2obobobo45bo11bo 473bo9bo2bo$214bobo26bo38b2o2bobo3bo18bo10b2obo2bo14bo3bo2bo14bobo9bob 2obo5b2o164bobob2o2bobo16b5o13b2o8b3o16b2o5bobo506b3o43bobo5bob2o5bo 11bo8bo2bo166b2o69b3o3b3o15b2o5b3o3b3o317bo2bo2bo2bo47bo2bo155bo4bo54b o4bo91bo2b2obo3bob2o2bo47bo9bo389b2o82bo9bo4bo40bobo$13b2o14b2ob2o65bo 19b3o88b2o3bo26bo41bobobob2ob3o12bo16b4ob2o12bo2bobo15b2o15bo2b3o166b 2o2b2o3b2o46bo17bo7bo19bo519b2o11bo2bo7b3o13b2o10bobo165bo2bo67b2obo3b ob2o15bo54bo277b2o4b2o27b2obo6b2obo8b2o155bo6bo52bo6bo94bobo3bobo50b2o 9b2o386bo4bo80b2o8b2o2b2o41b2o$13bo3b2o10b2obo3b2o12b2o13b2o9b2o8bo12b o3b3o10b2o32b2o12bobo14bo5bo23bob2o27b2o40b2o3bo2bobo2bo11b2o14bo2bob 2o11b2o3bo33bobo2bo38bo156bo42b3o8b2o17bobo476bo41b2o11bobo9b2o14b2o 64b2o20b2o89bobo2bo91bobo50bo3bo310bob2o6bob2o34bo130bo6bo52bo6bo92b2o bo5bob2o334bo111bo6bo75bob2o6bob2o6b2obo37bo$14bobobo15bo2bo7b3obobo7b 3o2bobo8bobo6bobobo8bo2bo15bo3bob2o23bobobo11bo3bo12bobo3b2o25bo31b2o 43bobo3b2o28b2o55b2o40bobo36b2o116bobo41bo30bo388b2o86bobo52bobo91bo2b o19b2o63bobo24bo96b2o28b5o22bo307b2o4b2o2b2o4b2o31b3o12b2o116bo4bo4bo 49bo4bo4bo89bob7obo287b2o5b2o11b2o5b2o17bobo110bo8bo74b2obo6b2obo6bob 2o$27b6ob3o40bob2obobobo15bo2b2o10b2ob2o25bo14bo3bo12bo2bo30bo28b3obo 44b2o125bo4b3obo5bo31bo3bo2bo6bo8b2o15b2ob2o2b2o5b2o62bo461bobo85bo3b 2o50bo9bo83bo90bo24b2obo68bo3bo48bo4bo17bo4bo307bo5bo3bo5bo31bo3bo11b 2o117bo2bo5bo50bo2bo5bo17b2o68bobo9bobo135bo149b2o5b2o11bob2ob2obo18b 2o110bo8bo127bo$14b2o2bo7bo2bobo14bobo2bo8bob2o2bo7b2obobo3b2obob2o7b 2o2bo14b2ob2o26bobo13b2o13bo5b3o2bo46bob2obo175bobo2bo4b2o3bobo30bob3o 2b3o3bobo6bobo15bob2o2bobo5bobo3b2o432b2obo6b2obo72bo76b2o9bo3b2o3bo 57b2o81bo86bo4bo2b2o15bo5bo69bo3bo53bo18b5o206b2o9b2o89bo5bo3bo5bo30b 2ob2o131b2o6bo51b2o6bo16bo2bo65b3obo2b2ob2o2bob3o132bobo169bobobobo 131bo8bo110b2o15b2o$16bo2bo6b2o3bob2o10bo4bo8bo5bo11bo2bo5bo16bo2bo7b 2obo3bo57b2o5bobobo10b2o8b3o6bo15b2obobo175bobo2bob2o7bo32bo3b2o3bobo 2bo6bo11b2ob2obo4b2o9b3o2bo432bob2o6bob2o70b2ob4o72b2o9bo3b2o2b2o56b2o 82bob2o20b2o61b2obo2bob2o6bo8bo128bo3bo28b2o200b2o9b2o88b2o4b2o2b2o4b 2o250bo4bo63bo5bo2bobo2bo5bo130bo3bo168bobobobo80b2obo6b2obo6b2obo28bo 6bo111b2o16b2o$18b2o10b2ob2o10b2o3bo8b2o4bo10bobo7b2o10b3o3bo15b2o26bo 16bo21bo2bo10b4obo8bo3b2o20bo3bo170b2ob2obobob2obo4b3o30b2o3bob2obob2o b2o2b2o12bobobob4o2bo4b4o3b2o253b3o181b2o2b2o4b2o41b2o24bobobo2bo84bob o4bobo116b2o4b2o4b2obo9b2o18bob2o65b2o10bo8bo120b2o8bo30bobo302b2obo6b 2obo172b3o3b3o51b3o3b3o10bo6bo63bob2obobo3bobob2obo131bo3bo167bo7bo79b ob2o6bob2o6bob2o29bo4bo125b2o2b2o19b2o$104bo11b3o29bo16bo15bo6b2o11bob o2b3obo4bo24bo3b2o4b2o165bo4bobobo2b2obob2o5b2o3b2o3b2o3b2o3b2o6bob2o 4bo4bo2bo13bo6bo3bobo4bo4bo179bo3b2o72bo182bo3bo5bo13b2o20b2o5b2o8bobo 13bobo7b2o32bobo46bo74bobo48bo5bo4bob2o29bo80bo128b2o42bo302bob2o6bob 2o251bo6bo64b2obobo5bobob2o132bo3bo259b2o2b2o4b2o2b2o4b2o29b2o152b2o$ 146bob2o13bob2o14bo28bo4bob3o2bobo15b2o4b2o3bo165bobobo5bobob2ob2obob 2o3b2o3b2o3b2o3b2o3b2o5bobob2obobo2bob3o11bob3ob2o2b2o3bo3b5ob2o175bob o2bo6b2o249bo3bo5bo5b2o5b2o8bobo10bo14bo14b2o2bo7b2o5b2o24bo124b2o48bo 5bo3b2o4b2o27bo85b3o3b3o4b3o94bo5bo9bo41b2o198b3o7b3o88b2o4b2o2b2o4b2o 174bo59bo15bo4bo69bo7bo136bo3bo259bo3bo5bo3bo5bo6b2o48b2o126b2o$145b2o 15b2o15bob2o22b2o3bo8bob4o21bo3bo101b3o20b2o2b2o2b2o33bo2b2obobob2ob2o 6b2o3b2o3b2o3b2o3b2o3b2ob4o2bobob2ob2o6bo11bo4bobo3b8o2b3o2bo175b2o3bo 5bo6b2o56b2ob2o180b2o2b2o4b2o6bo14bo13bobo13bo2bo9bo4b2o13bo10bobo13bo 2bo57bo63bo48b2o4b2o2bo5bo7b2o13b2o4bo2bo48b3o22b3o3b3o12bo96b3o3b3o 250b3o7b3o88bo5bo3bo5bo31b2ob2o139bo59bo16bo2bo215bo3bo260bo3bo5bo3bo 5bo6bo24bo23bo127bo$149bo16bo11b2o3bo21bo6b3o8b2o25bobob2o119b2o2b2o2b 2o34b2o3bobo2bo5b2o4b2o3b2o3b2o3b2o3b2o3bo3b2o8b2o5b2o12b3obo2b3o8b2o 4b2o177b3obo5bo5bo6b2o46b2o7b2o173b2obo6b2obo8bobo13bo2bo10b2o13bobobo 8b5o13bobo13bo12bobobo48bobo4bobo113bob2o5bo5bo6b2o12bo2bo4b2o48bo38bo 7bo3bo91bo2b2ob2o2bo176b2o173bo5bo3bo5bo30bo3bo11b2o126bo59bo17b2o216b o3bo169b2ob2o29b2o54b2o2b2o4b2o2b2o4b2o6bobo21bobo20bobo102b2o2b2o18bo bo$121bo26b2o15b2o15bobo65bob2obo53bo20b2o19bo3bo65b2obob2obob2o2bo34b o32bobo4bo2bob4o2bo180b2o2bobo2b3obo5bo5bo6b2o39bo9bo173bob2o6bob2o9b 2o13bobobo13b3o3b3o3bo2bo6b2o4bo13b2o10bo2bo8b3o3bo2bo49b2o2b2o3bo9b2o 45bobo26bo2bo23b2obo4b2o4b2o20bo2bo54bo3bo19bo5bo8bo7bo2bobo68bo21b3o 5b3o177bo2b2o2b2o164b2o4b2o2b2o4b2o31b3o12b2o198b3o222bobo168bo2bobo2b o27bobo49b2obo4bo5bo3bo5bo8b2o12bo3b2o3bobo2b2o3bo12b2o90b2o16b2o7b2o 8bob2o$88b2o8b2o13b3o3bo2b2o25b2o15b2o13bo2bo27bo32bob3o34b2obo2bob2o 10b2obo3bob2o10b2obo4bob2o10b2obo5bob2o9b2obo14bob2o30bob2obo2bob2o4bo 29b2obobo31bo8b2obo3b2o101b2o10b2o17b2o37b2o6bo2b3obobo2bobo2b3obo5bo 5bo41b9o172b2o8b2o4b2o11b3o3b3o3bo2bo13bobo3bobo4b2o6bo2b2o5b3o3b3o13b obobo8bobo4b2o50bo3b2o3bo9b2o46b2o12b4o14bo26b2o2bo5bo20b2ob2o54bo2bob o9bo8bo5bo8bo9bobo2bo43b2o22b2o207bobo2bo2bo166b2obo6b2obo34bo157bo65b 2ob2o211bo169b3o3b3o29bo49bob2o5bo5bo3bo5bo20bo14b2o2bobo103b2o15b2o8b 2o$54bo13b2ob2o9bo3bo2bo8bobo3b2o13bo28b3o14b3o14b2o28bo32b2o37bo8bo 10bo9bo10bo10bo10bo11bo9bo20bo36b2o7b2o30bo2b2o84b2ob2o35bo13bo10bo2bo 8bo2bo15bo2bo35bobo5bobo3bobo2b3obobo2bobo2b3obo5bo5b2o214bo9bo5bo12bo bo3bobo4b2o14b3o3b3o12b2obo6bobo3bobo13bo2bo3b3o3b3o60b2o3bo57bo12bo3b o10bo3bo27bo3bo5bo20b2o58bobo2bo7bo8bo5bo19bo3bo33b2o7bobo21b2o207b2ob 3ob2o62b2o3b2o3b2o3b2o88bob2o6bob2o8b2o182bo47bo5bo5bo9bo382bo5bo30b2o 52b2o2b2o4b2o2b2o4b2o20bo2b2obo9b2o3bo120bo$13b2o7b2o6b2o3b2ob2o3b2o8b obob2o8bobob2o8bobo2b2o14bo2bo8b2obo3bo89b2obo33b2o35b2o4b2o12b2o5b2o 12b2o6b2o12b2o7b2o11b2o16b2o76bobo88b2ob2o34bobo11bobo9b3o2b6o2b3o14bo bobo35bobob2o3bo3b2ob2o3bobo2b3obobo2bobo2b3obo3bobo33b9o173bo9bo5bo 11b3o3b3o14b2o17b2o9bo6b3o3b3o5b2o7b2o4bobo68bobo62b2o11bo11b4o26bo3b 2o4b2o81bo3bo7bo38bo33b2o7bo233bobobobo64b5o5b5o110bo2bo144b2ob2o32bo 10b3o33bobo4bo5bo4bo2b2o474bo3bo5bo3bo5bo22b2o10bo3bo2bo142b2o$13bobo 2bo2bobo6bobobob2o2bobobo7bo2bobobo6bo2bo10bo2b3o2b4o8bo109bo3b2o33bo 32b3o2b4o2b3o6b3o2b5o2b3o6b3o2b6o2b3o6b3o2b7o2b3o5b3o2b16o2b3o73b2o 113bo13bo3bo9bo3bo11b2o6b2o17bo2bo37bobobo4b2obo6b2ob2o3bobo2b3obobo2b obo2bo35bo9bo61b2o9bo98b2o8b2o4b2o34bo19bo9b2o20bo13b3o10b2o57bo62bobo 7bo2bo22b2o18b2o2bo5bo13bo10bo61bo12b3o3b3o22b3o43b3o224bo4bo9bo63b3o 7b3o111bobo145bo22bo33b3o23bo3bo3bo5bo5b3o169b2o4b2obo6bob2o194b2o5b2o 84bo3bo5bo3bo5bo22b3o8bo3b3o143b2o$15b4o2bo10bob2o4bobo8bo4bo2bo6b2o3b 2o6bo4b2o2bo2bo9b2obo10bobobobo87bobo36bo33bo2bo6bo2bo6bo2bo7bo2bo6bo 2bo8bo2bo6bo2bo9bo2bo5bo2bo18bo2bo162b9o16bobo13bo3bo7bo3bo11bo10bo15b o43bo7bo5b2obo6b2ob2o3bobo2b3obobob2o33b2o7b2o62bo9bo100b2obo6b2obo26b 2o5b2obo19bob2o28bob2o22bo2bo109bo11bo33bobo22bo5bo11bobo8bobo57b3o4b 3o3b3o303bobo2bob3obob3obo63bo9bo113bob2o144b2o2bo13bo4bo8b3o3b3o4bo4b 3o3bo14b3o9bobo16b3o80bo89bo4bob2o6b2obo194b2o5b2o83b2o2b2o4b2o2b2o4b 2o$13bobo2bo2bobo6bobobob2o2bobobo6bobob2obo10bo2bo6b4o4b2obo10b2o106b o2bo35b2o33b2o8b2o8b2o9b2o8b2o10b2o8b2o5bo5b2o7b2o20b2o162bo4bo4bo14bo 3bo13bo3bo5bo3bo12b2obo4bob2o16bobo39bo2bo5bo6bo5b2obo6b2ob2o3bobobobo bo35b2ob2o64bo10bo100bob2o6bob2o25bo2bo4bo2bob2o13b2obo2bo27b2o2bo4b2o 14bo2bobo45b3o61bobo45bo21b2o4b2o12bo4b2o4bo78bo147bo151bo3bo3b2ob2o3b o50bo35bo101b3o145b3o12bo28bo9b2o3bo23bo7b3o6bo2b2o78bobo87bo3b2o8b2o 286b2obo6b2obo6b2obo24b3o8bo3b3o$13b2o7b2o6b2o3b2ob2o3b2o7b2obobo8b2ob obo11b2o2bobo9b2o2bobo9bo3bob2o87b2o140b3o20b2o2b2o2b2o115bo54b3o3b3o 16bo3bo13bo3bo3bo3bo18b2o18bo44bo15bo6bo5b2obo6b2obo2bo3bo103b4o6b2o 123b2o12bo2bobo6b2obo15bob2o11b2o13bo4b2o4bo2bo17bo45bo3bo49b2o12b2o9b 2o32b2o16b2o4b2obo17bo4bo72bo8bo10b2o91b2o41b2o156b3ob3ob3o50bobo33bob o101b2o27b2o116b3o4bobo3b2o6bob2o10bo8bo3b2o9bo8bo5bo30bo76bo3bo86b2o 2bo10bo286bob2o6bob2o6bob2o23b2o10bo3bo2bo$56bo9b2ob2o10bo2bo3bo10b2o 5bo10bo257b2o2b2o2b2o37b2o18b2o8b2o45bobo55bobobo19bo3bo13bobo5bobo37b 2obo5b2o36bo3bo5bo12bo6bo5b2obo3bo3b3o36bo64b2o4bo3bo125bobo16bo10bo 15bo13bobo13b5o6bobo2bo11bob2o45bo5bo48b2o12b2o9b2o50b2o4bob2o17bo4bo 72bo8bo6b2obo2bob2o56b3o28bobo40bobo148b5o4bo5bo4b2o45bob2o33b2obo129b 2o115b2o2bo3b2obo6b2o3bobo10bo12bo3b3o4bo8bo5bo26b2ob2o77bo3bo90bo8bo 14b2o6b2o309bo2b2obo9b2o3bo$81b2o22b2o6b2o2bo3b3o299bo18bo2bo6b2o43b3o bo80bo3bo13bo7bo19bo17bo8bo2bo3b2o30bo3bo3b2o20bo6bo5b4o38b3o8b2o3b2o 24b2obo4b2o10b2obobob3o3bo4bo121bo14bob2o11b2o3b2o3b2o3b2o13bo13b2o4bo 7bo16bo48bo3bo63b2o6b2o6bo3b2o68bo4bo66bo5bo15b2o2bo4bo47b2o7bo17b2o 13bo190bo4bo14bo2bo2b2o34b2o3b2ob2o33b2ob2o3b2o44bo173b2o2b2o4b2obo7bo 17bo18bo10b3o19bo5bo109bo3bo84b2o2b2o8b2o11bo4bo2bo4bo307bo14b2o2bobo$ 115bo304b3o20b3o10bo39bo4b2obo70bo7bobo18bo22bo2bo14bobo2bo3bo2bo3bo2b o29bo7b2ob2ob2o21bo6bo2bo23b2o3b2o18bobobobo24bob2o5bo10b2obobobo5bo 125b2o5b2o8bo17bo2bobo2bo16b2o5b2o7bo2b2o9b2obo62b3o61bobo7b3o5bo3bobo 69bo2bo66bob2o24bo51b2o7bobo15b2o13b2o107b2ob2o20bo17b2ob2o33bo2bo8bo 3bo4bobo2bobo34b2o4bob2o33b2obo4b2o42bobo174bo3bo4bob2o7b2ob2o6bo4bo 40b3o105bob2ob2o15bo3bo84bo4b2obo6bob2o7bo4bo2bo4bo294b2o12bo3b2o3bobo 2b2o3bo12b2o95b2o$420bo4bo2bo2bo2bo2bo2bo9b7o39bob2o3b2o6b2o61bobo7bo 18bobo21bo2bo14bo2bo4bo5bo2bobo29bo2bo4b2o4b3o3b4o4bobo15b2o23bobobobo 19bo3bo29b2o2bo14bo11b3o128b2o27b2o3b2o24b2o7bobo13bo63b3o61bo10b2o6b 5o68bobo2bobo68bo24bobo58b2o88b2o14b2o12bob2o6b2obo7bo24bo8bo12bo30bo 2bob2o10bo5b2obob2o43bobo33bobo40bo7bobo74b2o98bo3bo3b2o4b2o17bo59b3o 89b2ob2o2b2o15bobo84bo5bob2o6b2obo7bo4bo2bo4bo293bobo21bobo20bobo92b5o $418bobob26o2bo44b2obob2o9bobo59bo3bo26bo24bo16b2o4bo10bo31bo8bo3b2o4b 2obo7bo6bo33bo3bo54bo3b2o10b3o2b2o203bo2bobobo155b2o4b3o69b2o4b2o64bo 2bobo173b2o15b2o12b2obo6bob2o8b2o2bo19bo8bo7bo2b2o30bobobo5bo11bo3b2o 3bo43bo35bo40b2o6bo2bo11b2o56b2obo4bob2o93b2o2b2o2bo5bo13b2o17bo137bo 24bo85b2o2b2o4b2o8b2o7b2o6b2o295bo24bo23bo84b2o5bo4bo14b2o209bo$417bob obo26bobob2o2b3o41bob5o6bo2bob2o37bobobo12bo3bo21bo7bo43bobo4bob2o30bo bobo17b3o3bo3bo4b2o54bobobo5bobobo25bo13bo26bo183b4ob2o156b2o150bo2bo 174b5o23b2o8b2o4b2o7b3o29bo8b3o32bo2bo4bobo13b2o2b2obo57bobo58b2o4b2o 2bobo11b2o56bo10bo102bo5bo11bo2bo16bo144b2o106bo5bo10bo37bo2b2o4b2o2bo 260b2o48b2o83b2o5bo2b3o14b2o207bobo$19bo32b2o2b2o227b2o4b2o57bo17bo48b obobobo2b3o2b3o2b3o2b3o3b2obo3bobo2bob2o30bob2ob2obo5bo4b2obob2obo34b 3o3b3o11bo3bo6bo12bobo5bobo19b2o22bo6bo31bobob2o4bo22bo4b2ob2o26bobobo 5bobobo4b3ob3obob2o3b2obob3o22b2o2b2o9b3obo21bobo186bo311b2o144b2o14b 3o13b4o24bo8bo5bo8b3o7bo8b3o3b3o13b3o35b2o2bo2bo9bo3bobo2bobo56bo51b2o 7b3o4b2o3bobo69b2o6b2o94b2o2b2o2b2o4b2o10bo4bo15bo137b2o5b2o102b2o3bo 5bo8bo37bo3b3o2b3o3bo363b2obo6b2obo6b2obo14b2o2bo214b2o6b2o$18bobo15b 2o14bobo2bo13bo13bo198b2o2b2o2b2o55bobo14bobo3b2ob2o2b2o35b2obo5b2o3b 2o3b2o3b2o3b2obo4b2o2bobobo34b2o5b4o8bo4bo33bo4bo4bo11bo3bo4bobo10bo3b o3bo3bo13b2obo4bob2o19bobo34bobo7bo6bo12bobo5b2o27b3obob2o3b2obob3o4bo 3bobobo5bobobo20b2obo5bo5bob2o4bo3bo10bo6bobo184bobo81b2o374b2o12bo3bo 40bo10bo5bo6b2o2bo7b2o15b3o3b3o3bo2b2o39b2o14b2o2b3o57bo51b2o8b2o4b2o 5bo66b3o2b6o2b3o92bo3bo2bo5bo10bo6bo152b2o110bo2b2o4b2o8b2o37bo2b2o4b 2o2bo364bob2o6bob2o6bob2o16b2o214bo3bo4b2o12b2o$15b2o2bo2b2o11bo2bo17b o13bobo10b5o9bo4bo9b2o6b2o161bo10bo9b2o4b2o29b2ob2o3bobo15bobo2b2ob2o 2b2o3b2o31bobobobo2b3o2b3o2b3o2b3o2b2ob3obo2bo2bo2bo28bo3bobo2bo3bobo 4b2obob4ob2o32b9o13bobo4bobo10bo3bo5bo3bo12bo10bo22bo34b2o5bob2o5bo6bo 15bo28bobobo5bobobo5b2o38bob2o4bo6b2obob2o3b2ob2o6b2ob2o3b2obob2o181b 2o82b2o361b2o5b2o17bo4bo13b4o23b2o8b2o4b2o5bo11bo12bo21bo30b2o15bo3bo 3b2o61bo2bo59b2o77bo2bo8bo2bo91bo3bo4bo5bo9bo6bo10b3o3b3o71b2o68bo102b o5b2obo6bob2o415b2o8b2o4b2o2b2o4b2o27bo3bo197bo5bo3b2o12b2o$15bob2o4bo 10bobobo14bo17bo10bo5bo8bob2o2b2o7bobob2obobo160bo12bo7b2o2b2o2b2o10b 3o11b2o2b2ob2o2b2ob2ob3o10bo16bo32bobobo27bo3bo2b3o2b2o28bo3bobo2b2obo b2ob2o4bobo4bobo54bo4bobo10bo3bo7bo3bo12b2o6b2o19bo2bo41b2o6bob2o5bo6b o67bo3bo23b2o8b2o8bobo6bo10bo3bo4b2obo628b2o5b2o17bo3bo13b5o25bob2o4bo 5bo6b2ob2o20bo8bo8b2ob2o29bo2bo15b2o3b2obob5o55b3o61bo78b2o10b2o92b2o 2b2o2b2o4b2o10bo4bo73bo16bo2bo59b2o2b2ob2o102b2o4bob2o6b2obo415bo9bo5b o3bo5bo15b2o9b2obobob2o195bo3bob2o4bobo$17b3ob2o17bo7b2o5bobo2b2o19bo 2b3o2bo6bob3o14b2o3bo162bobo6bobo7bo10bo22b2o80bobob25obob3o43b2o3b3ob 2obob3obo2b3o3bo33b2ob2o22bo10bo3bo9bo3bo8b3o2b6o2b3o15bobobo40bo4b2ob 2o6bob2o5bo6bo35bo3bo19bobobobo22bo19bobo21bob3o675b2o15b2o12b2obo5bo 5bo30bo8bo37bo2bo2bobo14b2o5bobo2bo2bo131bo180bo5bo12bo2bo16bo56bobo 14bo4bo59b2ob2obo539bo9bo5bo3bo5bo12b2o2bo7bob2o3b2obo194bo5bo7bo$14bo 6b2obo7b2o7bo6bo2bobo5bobo7b5o8b2o3b2o9bo3b2o7bo2b2o3b2obo163b6o9bo12b o5b2o5b2o6bo22b2o9b17o34bo4bo2bo2bo2bo2bo2bo2bo2bobobo4bob2o34bob2ob2o b2o13bobo2bobob2o30b2ob2o34bobo11bobo9bo2bo8bo2bo15bo2bo43b2o2bobo3b2o b2o6bob2o5bo34bobobobo18b2o3b2o23bo8b2o9bo26bo658bo3bo13b2o14b2o16b2o 2b2o4b2o12b2o25bo4b2o31b5obob2o20bo2bo60b3o74bo171b2o2b2o3bo5bo12b2o 17bo55bo3bo12bo6bo603b2o8b2o4b2o2b2o4b2o5b2o5bo2b3o5bo2bo5bo2bo194bo3b o$13bobobo3bobobo5bo8bobo6bo7bo10bo3bobo10b2o13b2o8bobobo2bobobobo178b obo6bobo6b2o5b2o5bo23b2o6bobo17bo33b3o24bobo2b4obo44bo6bobobobo2b2obob obo71bo13bo11b2o10b2o17b2o40bobo3bobob3o2bobo3b2ob2o6bob2o33b2o3b2o8b 3o36b2o9bo29b2o2b3o659bo4bo47bo2bo5bo12bo2bo28bo2bo36b2o3bo19b2o61bo2b o71b3o172bo3bo2b2o4b2o31bo56bobo13bo6bo605b2obo6b2obo4bo5bo6b2o5bo4bo 6bob2o3b2obo196b2o$14bob2o6bo6bobo8bo9bo7bo7bo3bobo10b2o13b2o8bobobo2b obobobo181b6o10bo5bo7bobo20bo6bo21bo35bo25bob2o5bo36b2obobob2o6b2obobo bo3bobobo170bo5bobobo2bobob3o2bobo3b2ob2o3bo48bo39b2obo4bo19b3o11bo 649b2o12bo3bo46bo4bo5bo10bo4bo26bo4bo31b3o2b2o14b2o69bo248bo3bo5b2obo 91bo15bo4bo92bob2ob2o507bob2o6bob2o5bo5bo13b5o7b2obobob2o$16b2ob3o10bo 7b2o6bobo5bobo2bo7b5o8b2o3b2o9bo3b2o7bo2b2o3b2obo104bo58b6o29b7o10b21o 7bo21bo2bo30b2o25bo5b3o38bob2obo2bo7bob2o2b4ob2o172b4obobob3o2bobo2bob ob3o2bobo3bobo87bob2o4b2o22bo5bobobob2o159b2o3b2o480b2o14b3o46b2o2b2o 4b2o9bo6bo24bo6bo29bobo2bobo3bo4bobo2bo2bo2b2o64bo248b2o2b2o4bob2o108b o2bo92b2ob2o2b2o134b2o368b2o4b2o8b2o2b2o4b2o15b2o10bo3bo$15bo4b2obo9bo 14b2o2bobo5b2o19bo2b3o2bo6bob3o14b2o3bo29b2o3bo23b2o25bo16b2obobo54bob o6bobo8bo8bo8bo5bo30bo8b2o19bob2o56b2o5bo40bo4bobo8bo3b2o180bob2o3bo5b ob3o2bobo2bobob3o2bo46b2ob2o64bo4bo3b3obobob2o158bo2bobo2bo540bob2o6b 2obo11bo6bo24bo6bo29bob2o2b2o9b2o2bobo4bo2bo62bobo303bo59bo4b2o57b2o 34bo140bobobo367bo5bo9bo3bo5bo$15b2o2bo2b2o11bobobo16bo14bo10bo5bo8bob 2o2b2o7bobob2obobo27bo2bo2b3o20bo2bo2b2o20b3o15bobo2bo19bo4b2o26bo12bo 7bobo4bobo23bo31b2o2b2ob2ob2o2b2o4bo106b2o4b2o8b2o3bo2bo178bo7bo5bo5bo b3o2bobo2b2o44b2o7b2o65bo3bo4b2o158b2o3b2o3b2o3b2o536b2obo6bob2o12bo4b o26bo4bo31bo3b2o3bo6bo4bo5bobobo46bo35bo58bo216bo8bo59bo55bo6b3o10bob 2o27b2o130bobobo370bo5bo9bo3bo5bo32b2o$18bobo14bo2bo14bo16bobo10b5o9bo 4bo9b2o6b2o27b2obo5bo19b2obo3bo14b2o2b2o3bo14bob2obo19b3o2bo28bo10bo7b obo6bobo9b3o10bobo2b2ob2o2b2ob2ob3o15b2ob2ob2o2b2o4bo129b2o177bob3o3b 2o6bo5bo5bob3o46bo9bo62b2o6b4o127b2o31bo15bo431b2o5b2o123bo2bo28bo2bo 33b2obob2o5bo10b2obo2bo46bobo33bobo56bobobob2o210bo8bo10b3o10bo35bo8b 2ob2o41bobo6b2o10bo3bobo17b2o5b2o131b2o371b2o4b2o8b2o2b2o4b2o30bo4bo$ 19bo16b2o14bo2bobo13bo13bo65bob4obo21bob3o4bo11bobobob2o12b2obo4b3o15b 2o3bobo29b2o2b2o2b2o10bo6bo23bobo3b2ob2o3bobo36bo310bo2bo9b2o6bo5bo3b 2o45b9o63bo10bo120b2o5b2o8bobo17b2obo15bob2o428b2o5b2o124b2o30b2o32bob o2bobo4bo3bo8bo2bo42b2o4bob2o33b2obo4b2o50b2ob2obo210bo32bo48bo40bo3bo 6bo7b2o7bo17b2o513b2obo6b2obo6b2obo31bo6bo194b2o$52b2o2b2o89b3obobo3bo b2o15b3obobo4b3o14b2obo13b2obobobo3bo13bo2b2obob2o29b2o4b2o44bo11bobo 30b2o4bo2b2o303bobo2b2o16b2o6bo2bobo116bo9bo122bo14bo18bo2bob2o13b2obo 2bo625b2o2bo2bo14bo4bo43b2o3b2ob2o33b2ob2o3b2o183b2o57b2ob2o25b3o3b3o 4bo5bo8bo14b5o3b2o7b3o3b3o3bo2b2o40bo3bo8b2o6bo5bobo25bo506bob2o6bob2o 6bob2o30bo8bo184b3o5bobo$146bo2bo2bo3bo2bobo13bo2bo2bo4bo15bobo2bo16bo bo3bo2bo13bo6bo95bo31b2o4bo2b2o72b2o3b2o223b2o29b2o3bo45b9o63bo9b2o 121bobo13bo2bo14b2obo5b3o3b3o5bob2o32b2o596b2o4bo5bo4b5o50bob2o33b2obo 189b2o57bo12bo7b3o3b3o13bo5bo21b2o4bob2o2bo19b3o40bo3bo10bo5bob2obo21b 2o2b2ob2o560bo8bo183bo3bo6bo$145bobo2bo3bob2o4bo11bobo2bo3bo2b2o14bo2b 3ob2o13bo2b2ob3o13b2obob2o2bo132bo32b2o3b2o37bobobobo179b2o6b2o34b2o 79bo9bo196b2o13bobobo16bo5bobo3bobo5bo34bobo600b3ob3ob3o58bobo33bobo 119bo130b2o2bo7bo20bo8bo5bo4b3o3b3o16b2ob3o9bo8b3o12b2o4b2obo6b2obo7bo 3bo45b2ob2obo561bo8bo182bo5bo$146bo10b2ob3o12bo24b2ob2o3bobo12b2o22bob o3b2o133bo32bobobobo39bobo180bo2bo4bo2bo34bobo77b2o7b2o200b3o3b3o3bo2b o16b2o4b3o3b3o4b2o23b2o7b3o7b2o592bo3b2ob2o3bo3bo54bo35bo120bo131b3o8b o11bo8bo34b2o4b2o3bobobo9bo7bo2b2o12bo4bob2o6bob2o8bobo615bo6bo183bo5b o$82b2o63b2ob2ob2o3bo17b2ob2ob2ob2o16bo2bobo16b8o14bo2b3o132bo2bo34bob o41bobo180bobo6bobo117b2ob2o203bobo3bobo4b2o54b2o5b2o6bo3bo6b2o5b2o 585bob3obob3obo2bobo66bo9bo132bobo130b3o20bo8bo10b3o10bo12bobobo3b2o4b 2o7bo12bo10bo9b2o2b2o4b2o7bo617bo4bo$81bobo25bo10bo27bo3bo5bob3o14bo3b o3bo16bobo3bo16bo6bo13b2o4bo134bo35bobo41bobo88b2o3b2o22b2o3b2o22b2o9b 2o19b2o2b3o2b3o2b2o32bo2bo287b3o3b3o61bo13b2ob2o13bo143b2o62b2o3b2o 373bo9bo4bo66b3o7b3o132bo130b2o2bo3b3o3b3o7bo32bo12b3ob2o26b2ob2o10b2o 8bo3bo5bo189bo2b2o4b2o2bo425b2o192bo$57b2o6b2o16bob3o7bo12bobo8bobo26b o3bo6b2o2bo13bo3bo3bo14b2o4b2o20b2o155bobobo33bobo34b2o4bo3bo4b2o80bob o3bobo20bobo3bobo20bobo9bobo17bo6bo2bo6bo31bobo82bo236b2o19b2o16bobo 27bobo143bo9b2o52bobobobo375bobobobo72b5o5b5o131bo129bo57bo13bo2b2obo 4b2o44bo3bo5bo187bo3b3o2b3o3bo617b2o$57bobo4bobo13b2obo2b3o4bobo11bo2b o8b2obo39b2o64b2o154bobob2o26b2o4bo3bo4b2o27bo4bo5bo4bo80bo7bo20bo7bo 20bo13bo17bob2o10b2obo32bo82b3o235bo2b2o13b2o2bo17b2o27b2o132b2o8bobo 9b2o39b2o13bobo13b2o361b2ob3ob2o70b2o3b2o3b2o3b2o130bo129b2ob2o8bo59b 2o3b5o35b2o8b2o2b2o4b2o188bo2b2o4b2o2bo110bo2b2o4b2o2bo36bo2b2o4b2o2bo 444b2o$18bobo13b2ob2o2b2ob2o37bo13bo8bo4b2ob2ob2o2bobo260bobo29bo4bo5b o4bo28b4o7b4o78b2ob2o5b2ob2o14b2ob2o5b2ob2o14b2ob2o11b2ob2o15bobo10bob o336b2o17b2obo13bob2o22b3o3b3o5b3o3b3o136bo2bo6b2o51b2obo10b2ob2o10bob 2o360bo2bo2bobo218bo142bo105bo4b2obo6b2obo20b2o202b2o6b2o79bo3b3o2b3o 3bo34bo3b3o2b3o3bo441bo2b2o$16b3ob3o11b2obo4bob2o8b2o3bob2obo3b2o12bo 9b6o9b2o4b2o3bo2b2o262b2o30b4o7b4o122b2obo3bo3bob2o14b2obo7bob2o14b2ob o13bob2o17b2o8b2o321b2o13bo2bo18bo17bo23bobo3bobo5bobo3bobo128b5o7bo 62bo23bo364b2o2b2o2bo217bobo69b3o63b2o4bo104bo5bob2o6bob2o20b2o33b2o 165bo4bo2bo4bo78bo2b2o4b2o2bo36bo2b2o4b2o2bo443bobo$15bo3bo3bo14bo2bo 12bobobo6bobobo14bo5bo18bo2b2o3bob2o331b2o5b4o11b4o5b2o72bobo3bobo20bo b2o2bobo20bob2o2bobo2b2obo352bobo13b3o19bobo13bobo23b3o3b3o5b3o3b3o 127bo5bo6bo59bo29bo369b2o217bo69bo3bo61bo2bo75b3o30b2o2b2o8b2o4b2o53b 2o165bo4bo2bo4bo585b2o$15b2o2bob3o10b3o6b3o13b2o2b2o20bo4bo3b2o13bobo 2b3obobo296b4o7b4o13b2o5bobo3bo4bo9bo4bo3bobo5b2o65bobo3bobo20bobo3bob o20bobo3bobo3bobo352bo38b2o13b2o174bo3b2o7bo60bob2o21b2obo156bo3bo283b 3o7b3o132bo68bo5bo59bo4bo111bo9bo5bo221bo4bo2bo4bo431bo$13b2o2b3o4b2o 8bo4b2o4bo10bo10bo17bo3bo6bo13b2o3bobo298bo4bo5bo4bo13bo6bo3bo4b2o9b2o 4bo3bo6bo65b2obo3bob2o18b2obo3bob2o18b2obo3bobo3bob2o19b2o8b2o319b2obo 13b3o212bo7bo2bo63b2o6b3o3b3o6b2o158bo3bo16b3o3bo260b3o7b3o201b2obob2o 58bo6bo14bo56bo5bo28b2o3bo9bo5bo222b2o6b2o111b2o320b2o$14bo2b2o3bobo 12bo4bo15bo6bo14b2o5bo5bo15b2obo3b2o2bo295b2o4bo3bo4b2o13bob2o6bo23bo 6b2obo66bo2b3o2bo20bo2b3o23bo2b3o3b3o2bo18bobo10bobo316bo2b2o13bo2bo 155b2o4b2o56b2o73bobo3bobo180b2o3b5o2bobo12b2o524bo6bo14bo56bo5bo29bo 2b2o8b2o4b2o280b2obo4b2o4b2o4b2obo39b2o295bo23b2obo31b2o116b2o3b2o$14b obo3b2o2bo12bo4bo15bo6bo16bo5bo5b2o13bo2b2o3bob2o201b3o53bo7bo36bobo 21bo3bo4bo23bo4bo3bo67bo7bobo18bo26bobo13bobo15bob2o10b2obo315b2o18b2o 16b2o19b2o17b2o27b2o68bobo2bobo27b2o32bo16b3o50b3o3b3o180b2o2b2o3b2o3b o12b2o348b2obo6b2obo163bo4bo14bobo55bo5bo28bo5b2obo6b2obo67bo214bob2o 5bo5bo4bob2o180bo7bo147b3o20bo2b3o30bo117b2o3b2o$13b2o4b3o2b2o8bo4b2o 4bo10bo10bo11bo6bo3bo21bobo3b2o166bo8bo27bo54b2o5b2o36bobo23bobob2obo 23bob2obobo70b3o5b2o19b3o23b2o3b2obobob2o3b2o15bo6bo2bo6bo353bo6b3o3b 3o6bo16bobo27bobo69bo2bo6b2o4b2o8b2o3bo2bo32bobo13bo3bo221b2obo3bob2o 11b2o3bo2bo260b2o9b2o90bob2o6bob2o100bo63bo2bo23b2o58b2o23b2o4bob2o6bo b2o66bobo217b2o2bo5bo3b2o4b2o177bobo5bobo149bo18bobobo30bobo$15b3obo2b 2o10b3o6b3o13b2o2b2o15b2o3bo4bo18bobob3o2bobo165b3o4b3o18b2o35b2o25b2o 5b2o36bobo23bobo2bobobo19bobobo2bobo72bo28bo28bob2ob2obo21b2o2b3o2b3o 2b2o351b2obo6bobo3bobo6bob2o13bo13b2ob2o13bo68bo4bo6bo4bobo8bo3b2o34b 2o7b2o232b3o3b3o13bo3b3o261b2o9b2o88b2o4b2o2b2o4b2o7bo2bo4bo2bo78bobo 63b2o23bo2bo49b3o4bo2bo55bob2ob2o45bo3bo216bo3b2o4b2o2bo5bo179bo7bo 149b2o17bobobo31b2o120b3o$15bo3bo3bo14bo2bo12bobobo6bobobo15bo5bo17b2o bo3b2o2bo168bo2bo22bo6b3o26b2o26bo5bo35bobobobo19bobob2obo2b2o19b2o2bo b2obobo160bobo6bobo325b3o3b3o19bo2b2o5b3o3b3o5b2o2bo12b2o5b2o6bo3bo6b 2o5b2o57bo9bo4bo6bob2obo2bo7bob2o2b4ob2o35b2o5bo5bo222bo5bo383bo5bo3bo 5bo6b3o2b6o2b3o2bo54b2o17bobo87bo4bo54bo4bo53b2ob2o2b2o21bob2obo5bo10b o3bo218bo4bob2o5bo5bo331b2o20b3o2bo154b3o$16b3ob3o11b2obo4bob2o8b2o3bo b2obo3b2o8b6o9bo13b2o2bo3b2o4b2o165b2o2b2o21bobo3bo3bo4b3o88b2o3b2o19b 2o5bo27bo5b2o160bo2bo4bo2bo325bobo3bobo4b2o14b2o4bo13bo4b2o20b2o7b3o7b 2o63bobo8bo4bo5b2obobob2o6b2obobobo3bobobo36bo4b2o3b2o39b3o21b3o177bo 3b3o363bo5bo3bo5bo7bo2bo4bo2bo5bo53bobo17bo4b2o81bo6bo52bo6bo52bo25bob o5bo6b2o8bo3bo218b2o4b2obo4b2o4b2o332bo21bob2o156bo$18bobo13b2ob2o2b2o b2o32bo13bo13bobo2b2ob2ob2o4bo158b2o16b2o14b2o2bo5bo2b3o18b4o26b5o69b 2o25b2o168b2o6b2o16b2o2b2obo11bo15bo274b3o3b3o3bo2bo15b5o13b5o33bobo 70bob3o8b2o14bo6bobobobo2b2obobobo90bo19bo179b2o3bo2bo361b2o4b2o2b2o4b 2o22b3o48b2o6bo21bobo80bo6bo52bo6bo59b2o17bo7b2o7bo6bo3bo151bo63b2obo 10b2o2bo5bo333bobo20b2o$57bobo4bobo13bobo4b3o2bob2o11bob2o8bo2bo160bo 6b2o8bo18bo7bo21bo4bo24bo5bo4b3o285bo2bob2o10bobo13bobo269b2o13bobobo 15bo4b2o9b2o4bo34b2o67bob2o4bo14bob2ob2ob2o13bobo2bobob2o10bo74bo3bo 19bo3bo174b2o3b2o3bo12b2o285b2o61b2obo4bo5bo70b2obo2bo2bo2bo10bo5b2o6b o7b2o71bo4bo54bo4bo53b2o5b2o17bobo3bo10b2o6bobo151bobo62bob2o11bo3bo5b o171bobo17bobo139b2o21bo4bo2b2o$57b2o6b2o13bo7b3obo15bobo8bobo128b2o 31bobo3bo2bo5bobo18bo7bo20bo6bo22bo7bo2b3o285bo7b2o8bobo13bobo212b2o 10b2o42bobo13bo2bo17b2o2bo11bo2b2o96b2o6b2o3b2obo17b2o3b3ob2obob3obo2b 3o3bo13b3o5bo24bo40bobo2bo19bo2bobo145b2o27b5o2bobo12b2o286bo61bob2o5b o5bo69b2o2b2o6bo11bo3bo2bo2bo2bo7b2o63bo2bo5bo2bo47bo2bo5bo2bo54b2o27b 2obo10b3o6bo151bo3bo59b2o14bo3b2o4b2o36bo2bo134bo15bo169bo3b2o2b2o$92b obo14bo10bo28b2o55b4o41bo2bo29b2o2bo4bo3bobo19bo7bo19bo8bo17bo2bo9bo 289b2o6bo7b3ob2o11b2ob3o209bo2bo8bo2bo41bo14bo23bobo11bobo97bobo9b2obo b2o11bo3bobo2b2obob2ob2o4bobo4bobo16bo3bo24bo39bo2bobo23bobo2bo126b2o 15bobo28b3o3bo194b2o105bobo5b2o56b2o2b2o4b2o78bobo10b3o4b2o6bo70bo2b2o 2bo4b2o46bo2b2o2bo4b2o63bo34b2o159bo3bo59bo15b2o2bo5bo35bobo2bobo131bo 4bo7bo4bo168bo7b2o$92b2o52b4obob2o11b4o13b2ob4ob2o11b3o2b3o39bobobo31b o6bob2o18b2o2bo5bo2b3o12b2obo8bob2o12bo2bobo4bo4bo298bo5bo23bo208b3o2b 6o2b3o40b2o5b2o8bobo20bobobo2bobo2bobobo91b2obo2bo6b5obo16bo3bobo2bo3b obo4b2obob4ob2o16b2o3b3o22bo39bo3bo10b2ob2o10bo3bo126b2o17bo228bo2bo 105b2o5bobo55bo3bo5bo79b2o23bobo71bo2b2o2bo52bo2b2o2bo61b2o2b2ob2o195b o3bo60bo19bo5bo35b2o2b2o128bo7bo2bo3bo2bo7bo165b4o$145bob2o2bob2o8b4o 2b4o9bob3o2b3obo10b3o2b3o11b2ob4ob4ob4ob4ob4obo2bo32bo6bo20bobo3bo3bo 4b3o11b2obo8bob2o12bo4bo3bobo3bo289b2o6b2o6b3ob2o11b2ob3o212b2o6b2o50b 2o32b2ob4ob4ob2o91bob2obob2o4bo5bob2ob2obo4b2o8b2o5b4o8bo4bo88bo15bobo 15bo143b3o227bobobo98bo16bo11bobo41bo3bo5bo36bo2bo4bo2bo55b2o74b4o56b 4o64b2ob2obo196bo3bo59b2o18b2o4b2o128b2obo6b2obo6b2obo16bob2o6b3o3b3o 6b2obo159b2o156b2o$146bo4bo10bob2o4b2obo9b3o4b3o9bobo6bobo8bob3o2bobo 2bobo2bobo2bobo2bobo32b2o2bo4bo5b2o14bo6b3o22bo8bo15bo2bobo4bo4bo17b2o bo112b2o155bo2b2obo10bob2o11b2obo213bo10bo85bo9bo93bo4bo8b4o5b2o6bo2bo 4bob2ob2obo5bo4b2obob2obo22bo22b3o3b2o36b3o10bobobobo10b3o174bo44b2o 21b3o128b3obo97bobo13bo2bo10bo2bo4bo35b2o2b2o4b2o34b3o2b6o2b3o127bobo 2bobo52bobo2bobo265bo3bo61b2obo10b2o4b2obo130bob2o6bob2o6bob2o16bo9b3o 3b3o9bo158bo2bo155b2o$61bo88b2o11bo8bo29b2o8b2o9b3o3b3o2b3o3bo4bo4bo 32bobo3bo2bo6bo14b2o32bo6bo18bo2bo9bo17bob2o112bo155bo3bob2o17bo3bo 150bo10bo58b2obo4bob2o85bobo5bobo91b2ob4obob2o4bobo3bo2bobo3bo2b2o12bo b5o6bo2bob2o23bo24bo3bo50b2o3b2o180bo4bo3bo40bo4bo18b3o129b3o89b2o6b2o 19bo9b2o5b2o32b2obo6b2obo38bo2bo4bo2bo129b2o4b2o52b2o4b2o265bo3bo61bob 2o10b2o4bob2o39b2o93b2o8b2o2b2o4b2o13b2o27b2o133b2o23b2o$59bobo221bo6b 2o8b3o18bo3bo23bo4bo23bo7bo2b2o12b2o12b2o16b2o14b3o16b2o16b2o14bo17bo 154b2o6b2o16bobo150bobo8bobo62b2o91b2o5b2o91bobo4bobo4b2ob2obob2o2bobo 3bo11b2obob2o9bobo28bo24bo5b3o232bobo9bo17b6o22bo68bo72bobo96bo3bo4b2o 16bobo8b2o3bo8b2o27bob2o6bob2o342bob2ob2o164bobo125b2o93bo9bo3bo5bo 178b2o$58bo4bo39b3o14b2o160b2o18bo17bo5bo23b4o25bo5bo3bobo11bo13b2o15b o2bo17bo14bo16bobo13bobo13b3obo33bo58b2o43b2o22bo16b2ob2o150bo10bo72bo 183bo3b3o2bob3obob2ob3o3b2o17bob2o3b2o6b2o62bo211b3o19b2o3bo5bo16bo5bo 16bo5bo66b3o75bo60bo5bo27bo5bo3b2o16b2o11b2o10b2o382b2ob2o2b2o164bo 222bo9bo3bo5bo20b2o13b2o104bo$58b5o19b2o36bobo165b2o2b2o26b7o53b5o6bo 12bo29b4o14bobobo14bo15bo11b2obobobob2o8bo2bobo32b2o38b2o79b2o7bo13bo 2bobo2bo127bobobo44bobobo37bo12b2o180b2obobo2bobo13b2ob2ob2obo14bo4b2o bo265b2o17bo7b2o4bo11b6o22bo17b6o33bob2o6b2obo7b2o9bo74bo2bo61b2o3b2o 17b2o8bo3bob2o4bobo7b2o9bo8bo2bo137b3o251bo394b2o8b2o2b2o4b2o20b2o13b 2o104b3o34bo$63bo18b2o18bo2b2o9b3obo168bo2bo58b2o38b2o10b2o12bo14bobo 2bobo8bo3bo2bo12b3obo12b2obo10b2obobobobo7bo2bobobob2o28bob2o14b3o39bo 3bo21b2o17bo3bo13bo6b2o12bobobobobobo126bobobo44bobobo37b2o194bobobob 2o2bobobobo6bo14b2o8b3obo37b2o3b2o4bo219b2o15bobo7b2o4b2o32bo4bo41b3o 13b2obo6bob2o8bo9b2o72bobobo3b2o2bobob2o48b2o3b2o17b2o8bo5bo7bo7bobo6b 2o10bobo136bo3bo257b2o260bo2b2o4b2o2bo36bo2b2o4b2o2bo58b2obo6b2obo6b2o bo146bo32bobo$60b2o53b3o2bob2o162b3o4b3o26b3o26b2o28bo3b2o18b2obo7bobo 12bo8bo7bob2o5bo7bobo2bobo11bobobo2bo10bo3bo2bo6b2obo3bo2bo27b3o2bo13b 3o18bo3bo15bo4bo39bo4bo12bo3b2obo14b2o2bobo2b2o126bo3bo4bo3b2o2b2o5b2o 2b2o5b2o2b2o3bo4bo3bo43b3o2b3o2bobo177bobobo3bobobob2o6b2obobob2o5bo4b o8bobo37bo5bo5b2o234b2o13bobo34b2o44b3o10b2o14b2o6bobo81bo2bo4b2o2bobo b2o49bo3bo29bo3bo18bo7b2o92bo54bo5bo249b2o5b2o259bo3b3o2b3o3bo34bo3b3o 2b3o3bo57bob2o6bob2o6bob2o15b2o27b2o99b2o31bo2bo$38b2o2bo17bobo17b4o 16b2obo2bo13bo165bo8bo26bo2bo54b2o3bo19bob2o7bo2bo2b2o7bo8bo7bo5b2obo 7b2obobobob2o8bo3bobobo9bo4b2o8bobo4b2o30bobobo12b3o18bo4bo13bobobo21b o3bo14bobobo14b2o2bob2o18bobo109b2obo4b2o4b2o6bobo5b2ob3obo2bo3bo2b2o 2bo3bo2bob3ob2o5bobo34bobo2b3o2b3o4bob4o178b2ob4o2b2obo7bo2bob2obo6bo 4bo9bo49b2o7b2o338bo14bo8b2o82b2o10bo88b2o20b2o100bo54b2obob2o249b2o 267bo2b2o4b2o2bo36bo2b2o4b2o2bo62b2o2b2o14b2o9bo4bo9b3o3b3o9bo132bo2bo $38bobobo37bo3bo19bo16bo202b2o60b3o14b2o4b2o9bob2o8bobo2bobo10bo2bo3bo 10bo3bo2bo7b2o3bo2bo11b4o10bob5o33bobobo8b3o23bobobo5b2o4bobobo22bo4bo 12bobobo42bo110bob2o5bo5bo5bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o3bo4bo3bo 33b4obo3bo3bo7b2o125b2o58b2o3bo8bobo4bo6bo4bo49bo3bo13bobo337bo16bo98b 2o103bo22b2o9b2o76bobo292bo24bo386bo3bo15bo9bobo3bob2o6b3o3b3o6b2obo$ 23b2o17bo17bo22bobob2o10b2o3bo14bo268bo14bo5bo8b2o14b4o11bobobo14bo4bo 9bo4bo17bo11bo4bo34bo2b3o6b3o24bobobo6bobo4bo25bobobo5b2o2bo4bo158b2o 2bo5bo6bobobo44bobobo33b2o9bo129b2o5b2o8bobo45bo2bo3b2o8b2o4b2o6bo2bo 51b3o16bo287b2o5b2o41b2o14b2o12bo85b2o71bo32b2o19bo2bo7bo2bo76bo292bob o15b2o2b2ob2o387bo3bo15bo8bobo4bo7bo2bo3bo2bo7bo126bobo4bo2bo52b2o222b 2o$22bobo15bo18bo21bobobob2o315bo5bo23bo2bo12bo18b4o11b4o13b5o13b4o36b 2obo7b3o25bo4bobo4bo3bo27bobobo6bobo3bo159bo3b2o4b2o5bobobo44bobobo44b o130bo14bo48b2o27bobo2bobo72b2o282b2o5b2o43bob2o6b2obo14bobo91b2o61bo 2bo30b2o20b3o9b3o76bo57bo233bo3bo15b2ob2obo387b2o2b2o14b2o5b2obob2o7bo 4bo7bo4bo129bo9b2o51bo2bo221b2o$40bo18bo21bo3bo12b2o18b2o283b2o4b2o24b 2o15b3o46bo58b2o3bo33bo3bo2b2o35bo4bobo169bo4bob2o28bo76bo58b2o37b2o 31bobo13bo2bo73b2o4b2o70bo2bo7bo217b2o107b2obo6bob2o13bo94b2o61bo2bo 55b9o79bo56bobo233bo3bo404b2obo6b2obo6b2obo7bob2o4bo6bo15bo125b2o2bo4b o58bo$20bobo15bo18bo21b2o3b2o319b2obo62b2o13b2o15bo17b2o37bo4b2o45b2o 30bo3bo2b2o4b2o160b2o4b2obo26b3o9b3o64bo58b2o5b2o21bo8b2o5b2o25b2o13bo bobo149bo7b2o3bo199b2o15bobo110b2o2b2o18bo100b2o35bo7b3o3b3o3bo43bobo 10bo2b5o2bo78bo56bobo138b2o94bo3bo403bob2o6bob2o6bob2o11b3obo3bobo17bo bo122b2obo2bob2o2b2o54bo$38bo17bo40b2o18bo201b2o2b2o2b2o76bob2o62b2o 13b2o14b2o17b2o42bo34b2o213b2obo10b2o23bo7b3o7b2o60bo65bo20b2obo14bo 22b2o6b3o3b3o3bo2bo149bo6bo5bo199b2o17bo36bo74bo2bo20b2o3b2o78b2ob2o3b 2o4bo2bo33bo2bo5bobo3bobo47b2o11b2o2b3o2b2o77bobo56bo139b2o95bo3bo437b o156b2o7bo54bob2o$18bobo15bo19bo21b2o209b2o6b2o20b2o2b2o2b2o22bo6bo 286b2o168bob2o11bo23b2o7b3o7bo110bo13bobo19bo16bobo21bo2bo5bobo3bobo4b 2o4bo145bo7b5o217b3o35b2o73bo4bo24bobo77b2ob2o3b2o2bo2bobo33bo2bo5b3o 3b3o3bo44bo100bo295bobo439b3o2b2o158bobo54b2o$36bo17bo22bo18b2o18b2o 88b4ob4ob4o70bo6bo14b2o20b2o13b3o6b3o60b2o390b2o14bo28b3o9b3o109b2obo 12b2o19bobo2bo12b2o20bo2bobo5b3o3b3o8b3o138b2o6bo2bo263bobo72b2o2b2o 15b2o9bo93bo36bo17bo2bo143bo57b2o237bo443bo162b2o$16bobo15bo17b2o21bob o128bo2bobo2bobo2bo13bo11b2o3bo3b2o55bo2bobo14bobo2bo11bo12bo54bo2bo2b o390bo15b2o39bo110bo37bo2bo40bo22bo129b2o9bobo8b2o334bob2o6b2obo12bo9b 2o88bob2o55bo2bo37bobo26bo2bo131b2o678b2obobobo6bo7bo440b2o$34bo35b2o 3bo19b2o18bo76b4o8b3o2b3o2b3o2b3o10b3o10b2o2b3o2b2o33b10o12b3o20b3o11b o2b3o2b3o2bo17b2o9b2o24b6o392bo23bobobo44bobobo35bo52bobo2bo20bo13b2o 23bo13bob2o23b2o128b2o9bo251b2o93b2obo6bob2o9b3o86b2o13bo39bo19bo39b2o 12b4o14bo507b2o301b2obobob3o3bobo5bobo197b2o75b2o4bob2o6b2obo4b2o4b2o 4b2obo125b2o$14bobo15bo18bo18bo2b2o91b2o3b2o3b2o14bo2bo8bo16bo8b3ob3o 10b3ob3o34bo10bo14b2o16b2o13b2obo2bo2bo2bob2o15bo2bo7bo2bo49b2o8b2o16b o5b2o17b2o6b2o13bo6b2o286b2o23bobobo44bobobo30b4o3bo4bo6bo38bo2bo20b3o 36b3o14bo165b2o237b3o11b2o116bo88b3o50bo2bo58bo12bo3bo10bo3bo507b2o 305b2o4bo3bo7bo198b2o76bo4b2obo6bob2o5bo5bo4bob2o$13bo18bo16b2o16b2obo 23b2o18b2o29b2ob2o15bo2bobo2bobo2bob2o8b3o2b3o6bo16bo8bo5bo10bo5bo33bo 12bo10b2o3b16o3b2o9bo3bo8bo3bo14b3o2b5o2b3o25b2ob3o18bobo6bobo15bobo4b o2b2o14bobo5bo13bobo5bo289b2obo10b2o7bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o 3bo4bo3bo33bo3bo4bo4bo3b4o34b2o10b3o7bo22b3o3b3o7bo405b2o17bo27b3o188b 2obo49bo2bo62b2o11bo11b4o234b2o580b4o189b2o97bo3b2o14b2o2bo5bo3b2o4b2o 124bo$13b2o15bo36b2obob2o18bo52b2obo16b4ob4ob4obo9bo6bo6b3o12b3o7b2o5b 2o8b2o5b2o28bo2bo14bo2bo6bob2o18b2obo7b3o3bob6obo3b3o15b2o5b2o28b2obo 2bo19bo6bo17bobo5bobo17bo2b2obo13bobo2b2obo149b2o2b2o4b2o128bob2o10b2o 8bobo5b2ob3obo2bo3bo2b2o2bo3bo2bob3ob2o5bobo38bo3bobo3bo3bo49bobo7b2o 21bobo3bobo7b2o19b3o17b3o362b2o15bobo27bo192bobo49bo63bobo7bo2bo28b2o 220bo581bo192b2o97b2o3bo14bo3b2o4b2o2bo5bo104b2o3b2o13bobo$30bobobo13b o22bo3bo17bobo17bo34bo31bo9bo6bo8bo12bo8b2o7b2o6b2o7b2o27b2obo3b2ob2ob 2o3bob2o8bo20bo8bo7b8o7bo13bo9bo33bo2b2o13bob2o4b2obo14b2ob2o3b2obo15b ob2o3bo11b2obob2o3bo151bo3bo5bo151bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o3bo 4bo3bo34bo7bo4bo47b3o3b3o30b3o3b3o28bobo17bobo3b2o374b2o29bo190bo2bo 103bo11bo39bobo207bo9bobo582bo213bo80bo16bo4bob2o5bo5bo123bobo$30bo2b 2o14bo22b4o14b2obob3o13bobo3bo30bob4ob4ob4o16bob2o6b3o2b3o6b3o12b3o7b 2o5b2o8b2o5b2o31bo3b2ob2ob2o3bo9bo2bo18bo2bo6bo2b3o12b3o2bo13b2obo3bob 2o27bo4b2obobo11b3o10b3o13bo9bob2o10b3o18b2obo157bo3bo5bo152bobobo44bo bobo35b2o5bo7bo44bobo32b2o39b3o17b3o3b2o433bo3bo159b2o104bobo51bo67b2o 137bobo8b2o37bo162b2o10b2o368b2o211b3o76b2o2b2o14b2o4b2obo4b2o4b2o104b o3bo15bo$47b3o43bo4bo14bobo2bo28b2obo2bobo2bobo2bo15b2ob2o8bo2bo8bo16b o8bo5bo10bo5bo32bo14bo9b3o2b16o2b3o5b2obo3bo10bo3bob2o17bo31bobo6bo12b o3bobo4bobo3bo10bo2b3o4b3o2bo9bo3bobo2bo15b2obo2bo151b2o2b2o4b2o151bob obo44bobobo41bo6b2o45b3o7b3o21bobo12b3o485bo3bo221bo3bo28b2o12b2o9b2o 38b2o68bo126b2o7bob2o46b3o160bo2bo8bo2bo559b2o18bo8b2o2bo67bo4bob2o6b 2obo10b2o2bo5bo106b3o$72b2o17bobob3o12b2obobo2bo32b2o3b2o3b2o29b4o8bo 16bo8b3ob3o10b3ob3o32bo14bo12b2o16b2o11bo3b3o6b3o3bo52bo2bo2b2ob2o12b 3o10b3o11b2obo9bo12b3o18b2obo163bob2o8b2ob2o161bo10bo112b2o12bobo6b2o 13bo14bobo6b2o702b2o3b2o27b2o12b2o9b2o95b2o12bo124bobo6b2ob2o45b5o97b 2o60b3o2b6o2b3o559b2obo16b2o3b2o2b2o3bo8bo56bo5b2obo6bob2o11bo3bo5bo 105b3o$46b6o20b2o18b2obo17bo2bo87b3o2b3o2b3o2b3o10b3o10b2o2b3o2b2o26b 2o2bo3b2o4b2o3bo2b2o5b2o22b2o8b2o2b3o6b3o2b2o18b2o36bob2obo15bob2o4b2o bo16bob2o3b2ob2o13bob2o3bo11b2obob2o3bo150b2o4b2obo8b2ob2o160bobo8bobo 55b2o8b2o43bobo12b3o6b2o12b2o5b2o7b3o6b2o426bo5bo35b2o232b2o3b2o41b2o 6b2o6bo3b2o86b2o4bo7bo8b2o113bo6b3obob2o44b2o3b2o96b2o63b2o6b2o565bo 21b2o7bo6b3o56b2o8b2o2b2o14bo3b2o4b2o121b2obob2o$51bo60b2o92bo2bobo2bo bo2bo13bo11b2o3bo3b2o26b2o2bo3b2o4b2o3bo2b2o5bob2obo14bob2obo12b12o21b o36b2o5bo17bo6bo18bobo5bobo16bo2b2obo13bobo2b2obo150bo8b2o7bobo162bo 10bo56bo10bo43bo44b2o29b2o3b3o17b3o386b3o3b3o33b2o5b2obo3bob2o217bo5bo 38bobo7b3o5bo3bobo83b2o5b2o8bo8b2o104b2o7bo2bo2bo2bo2bobo9b2o34b5o161b o10bo564bo26b4o6bo70bo2bo15b2o2bo5bo122bo5bo$47bobo156b4ob4ob4o66bo14b o11bo20bo14b12o21bo43b2o14bobo6bobo15b2o2bo4bobo14bobo5bo13bobo5bo149b o10bo5bobobobo229b10o43b2o6b2o67b2o3bobo17bobo385bo2b2ob2o2bo34bo5b3o 3b3o263bo10b2o6b5o76b2o5b3o5bo2b2o4bo115b2o7bo6b2o4bo10bo2bo32bo3bo80b o80b2obo4bob2o522b3o15b2o19bo2bo36b2o4b2o52b2o8bo4bo19bo5bo122bo3bo$ 49bo232b2o2bo3b2o4b2o3bo2b2o5bo2bobo14bobo2bo8b2o2b3o6b3o2b2o17b3o57b 2o8b2o18b2o5bo15b2o6b2o13bo6b2o148b2o8bo6bobobobo226b3o2b6o2b3o48bobo 71b3o17b3o385b3o5b3o41bo5bo278b2o4b3o77b2o6b2o6b5ob2o126bobo59bo81bo 16b3o44bo21b2o507b2o15bo4bo14bo2bo2b2o15b2o43bo54bo8b2o2b2o18b2o4b2o 123b3o$282b2o2bo3b2o4b2o3bo2b2o5b3o20b3o8bo3b3o6b3o3bo17bo302b2o5b2o3b 2o226bo2bo2b4o2bo2bo49b2o3b3o33b2o3b3o769b2o95b2o4bo133b2o20bo2bo19bo 2b2o4b2o4bo82bo11b2o2bob2o44b3o526bo2bo14b2o3bo15bobo4bo2bo55bobo53bo 5bob2o6b2obo10b2o4b2obo$286bo14bo12b2o16b2o8b2obo3bo10bo3bob2o307b2o 249b2o10b2o55bobo33b2o3bobo49bo418b2o37bo358b2o97b2o4b2obo6b2obo42bo2b o19bo3b3o2b3o3bo2b3o70b2o6b2o10b2o2b2o49bo542b2o21bo5bobobo54b2o54b2o 4b2obo6bob2o10b2o4bob2o106bo5bo$286bo14bo9b2o3b16o3b2o6bo2b3o12b3o2bo 7b2o9b2o266b2o21bo318b3o38b3o22b2o23b2obo417bobo26b2o8b2o457bo4bob2o6b ob2o33bobo6bobo21bo2b2o4b2o2bo3bo71bobo9bo12b2o48b2o23b2o500bo2bo14bo 2bo21b2obo2bo256b3o5bo$16bo38b2o18b2o209bo3b2ob2ob2o3bo9bob2o18b2obo6b o7b8o7bo6bo2bo7bo2bo264bobo20bo9b2o375bo22bo421bo27bo2bo5bob3o11b2o 357bo84bo9b2o2b2o4b2o32b2o7bo40bo70bobob2o2bo4bo86b2o25b2o4b2obo4b2o4b 2o454bo2bo14b2o8b2o12bo2bo259b3o3b3o$15b2o37bo16b2o2bo4bo5bo7bo5bo182b 2obo3b2ob2ob2o3bob2o8bo20bo9b3o3bob6obo3b3o7b3o2b5o2b3o264bo22b2o8b2o 314bobo38bobo14b3o8b3o3b3o5bobo2bo444b3ob2o8b2o10b2o358bo83b2o8bo3bo5b o33bo121bobobo7bo114bo4bob2o5bo5bo455bobo20b2obo2bob2o5bo4bo21b2o$15b 2o40bo13bobobo2b2o2bobo2b2o3b2o2bobo2b2o15b2o163bo2bo14bo2bo6bo2bo18bo 2bo9bo3bo8bo3bo12b2o5b2o35bo11bo79b2o11b2o123b2ob4o336b2o9bo29b2o9bo 13bo4b2o4bobo3bobo5bo2bo60bo386bob2o8b2o128b2o25b2o212b3o94bo3bo5bo41b 2o113bo5b3o115bo3b2o4b2o2bo5bo6b2obo3bob2o440bo21bo4bo2b2o5b5o17b2o2bo 2bo234b2o3b2o$15bo5bo3bobobobo3bobobobo3bobobobo3b2o16bobob3o2bobo2b3o b3o2bobo2b3o4bo5bo4bo2b2o163bo12bo10b3o2b16o2b3o10b2obo2bo2bo2bob2o12b o9bo33bobo9bobo78bo2bo7bo2bo122bobobo2bo337bo5bo2bo31bo5bo2bo18bo2bo3b 3o3b3o6b2o60bobo155b2o229bo10bo47b2o25b2o54bo25bo80b2o217b2o8b2o2b2o4b 2o27bo13b2o111bo2bo26bo95b2o2bo5bo3b2o4b2o5bo2bo3bo2bo466bo29bo2bo4bob o234b2o3b2o14bo$19bobobobo5bobobo5bobobo5bo20b2obo2b2o2bobo2b2o3b2o2bo bo2b2o3b2o2bobo2b2o2bobobo164bo10bo14b2o16b2o14bo2b3o2b3o2bo13b2obo3bo b2o33bobo11b2o12b2o4b2o44bo5bo7b5o3b5o84b2o37bobobo337b3o5bobobo28b3o 5bobobo18bobobo13b2o64bob3o40b2o111b2o267bob2o4b2o4b2o6bo25bo55bobo21b obo80b3o217bo4b2obo4bo5bo28b2o128bo26bo100bo5bo4bob2o8b3o3b3o152bo11bo 14bo11bo241bo6b2o22bobo13bo15bobobo5bo255bo$13b5o5bo4bo4bo4bo4bo4bo4b 6o16bo4bo5bo7bo5bo4b3o2bobo2b3obobo167b10o14bo20bo13bo12bo18bo38bo13bo 12bo2bo2bo2bo43b2o3b2o12bobo22b2obo64bo21b2o12b2o2b2o338bo7bo2bo29bo7b o2bo20bo2bo13bobo60bob2o4bo16b2o4b2o8b2o3bo2bo99bo11b2o240bo26b2obo5bo 5bo6bobo21bobo34b2o20b2o12b2o7b2o67bo15b2obo213bo5bob2o5bo5bo15bobo8bo bo99b2o2b2obo6b2obo7bo3bo26bo95b2o2b2o4b2o4b2obo168bobo9bob4o6b4obo9bo bo207b2obo6b2obo6b2obo8b3o5b2o37bobo15bo2bob2o258b3o$13bo4bo4b6o4b6o4b 6o9bo16b2o29b2o2bobo2b2o2bob2o190b2obo14bob2o14b3o6b3o57b2obo10bobo11b o3b2o3bo14b2o16b2o9b2o3b2o9b4ob4o19bob2o7b2o12b2o6b2o20b2o10bo18b2o2bo 12bo4bo348b2o39b2o25bo14bo52b2o6b2o3b2obo17bo4bobo8bo3b2o100bobo11bo 240b2o23b2o8bo5bo8b2o7b2o12b2o36bo33bo76bobo4b3o8bo2bo12bo200b2o2b2o8b 2o4b2o15bo3bo109bo2bob2o6bob2o7bo3bo5bo19b2o63bo32bo4b2obo10b2o167bo9b obob3o6b3obobo9bo208bob2o6bob2o6bob2o7b3obo44bo19bo2bo$14bobo37bobo51b o5bo4bo170bo6bo53bo6bo62bo13bo8b2o3bo2bo3b2o9bo2bobo15b2o10bo3bo9bo2bo 3bo2bo16b2o4b2o6bo12bo8bo20bo10bob3o15bobobo12b5o248b2o9b2o153bobo8b2o 5b2o50bobo9b2obob2o16bob2obo2bo7bob2o2b4ob2o94bo11bobo225b2o13b2o10b2o 11bo8b2o4b2o18bo49bobo30b2o4bo70bobo16b2obo11bobo106bo96bo9bo5bo6b2o 12bo10b2o96bo7b2o8b2o9bo4b2o17bo42b2o21b3o12b2o16bo5bob2o11bo176bobo 16bobo215b2o4b2o2b2o4b2o2b2o4b2o6bo3bo64bo4bo$16bo8b2o8b2o8b2o9bo61b2o 169b2o6b2o20b2o2b2o2b2o102bo11bo4bo4bo4bo7bobobobo41b2o7b2o16bo5bo7bob o8bobo8bobo16bobo10bobo2bo15bo2bob2o7b2o3bo4bo243bo2bo2b3o2bo2bo20b2o 2bo138b2o51b2obo2bo6b5obo20b2obobob2o6b2obobobo3bobobo100b3obobo226b2o 9bob3o11b2o10bo11bob2o15bo4b2o49b2o7b2o22bo3b2o64b2o3bo2bo7bo2b2o2b3o 14b2obo7b2o96b2o91b2o3bo9bo5bo5b2o8bo4bo7bo2bo96b2o6bo9bo7bo2bo5bo7b3o 6bo4bo37bobo20bo3bo11b2o16b2o2b2o4b2o8bo166b5o7bo18bo7b5o204bo5bo3bo5b o3bo5bo8bo3bo64b5o$25b2o8b2o8b2o272b2o2b2o2b2o89b3o9b3o3bo6bo3bo6bo3bo 8bo2bob3o11b6o9b3o14b3o21bo5bo7b2o8b2o10b2o16b2o8b2obo2b2obo17bob2o6bo 2b3o3b2ob2o190bo50b3o2b5o2b3o16b2o2b2o3bo189bob2obob2o4bo5bob2ob2obo 20bo6bobobobo2b2obobobo91b5o4b4obo4bo2bo232b2o24b2o10b2obo15b2o3bo61bo 22bo68b2o4bobo7bo3bo2b2o15b2ob2o6bobo94bobo92bo2b2o8b2o4b2o19bo7bo109b o9bo8bo14bobo6bo9b2o31bo22b2ob2o33bo5bo9b2o164bo4bo7b2o16b2o7bo4bo204b o5bo3bo5bo3bo5bo8bob3o308b2o$151bo267b2o8b3ob3o8bobo8bobo17bo9bo5bo8bo 3bo12bo3bo19b2o4b2o58bobobobobo17bo9b2obo5b2ob2o3b2o184bobo52b9o19b2o 7bo189bo4bo8b4o5b2o14bob2ob2ob2o13bobo2bobob2o89bo4bo8bo5bo207b3o25bo 27bob2o10b2o17bo57bo4b2o97bobo6bo2bo20b2obob3o6bo187bo5b2obo6b2obo17bo 3bo7bo100b2o6b2o8b2o6bobobo12b3o8b3o5bobo29b2o56b2o3bo5bo173bo2bo10b2o 16b2o10bo2bo202b2o4b2o2b2o4b2o2b2o4b2o9b3o66bo242bo17b5o$151bo293bo4b 2o4bo8b4o3b4o9bob2o54b2obo12b6o16b6o2b6o12bobobobob2o7b2o5bobo12bo14bo 174b2o8bo30b2o21bo9bo23b4o188b2ob4obob2o4bobo3bo2bobo3bo12b2o3b3ob2obo b3obo2b3o3bo91bo2bo16bo4bo203bo55b2obo11bo75b2o3bo22bo77bo8b2o20bobo2b o2bo2bo2bo7b2o95b2o81b2o4bob2o6bob2o17bobo9bo73bo2b2o4b2o2bo14bo2b2obo 6b2obo7bobob2o28b2obobo88bo2b2o4b2o170bo2bob2o10b2o16b2o10b2obo2bo201b 2obo4bo5bo5b2obo12bo66bobo242b3o13bob3obo$151b2o263b3o2b3o7bo2bo10bo4b 2o4bo8bo17b2obobo54bob2o61bo4bo2bo7bobo4b2o13b2o3b2ob2o5bob2o172bo9bo 2bo26b2obo19b2o7b2o214bobo4bobo4b2ob2obob2o2bobo3bo2b2o3bo3bobo2b2obob 2ob2o4bobo4bobo62b2o4b2o4b2obo10bo2bob2o15bobo2b2o157b2o5b2o38bo58b2o 8bo18bo61bo22bo3b2o105bo4b2o6bo7b2o95bobo130bo2bo5b2o61bo3b3o2b3o3bo 12bo3bob2o6bob2o7bobo5b3o23bobobo88bo5b2obo10b2o13b2o144bobobo5bo34bo 5bobobo200bob2o5bo5bo4bob2o80bo245bo14bo3bo$13b2o138bobo80bo3bo5bo6b2o 189bobo8bobo8b3obo2bo10bobo13bo3bo12bo3bo25b2o7b2o8b2o10b2o16b2o11b2o 3bo10bo3b2o20b2ob2o3b3o2bo128bo4bo38bobo8bo2bo29bo243bo3b3o2bob3obob2o b3o3b2o6bo2bo2bo3bobo2bo3bobo4b2obob4ob2o64bo5bo4bob2o9bobobo5bo10b2ob o162b2o5b2o55bo3bo38bo8b2o13b2o3bo82b2o4bo115bobo107bo132b2o5bobo59bo 4b2o4b2o2bo13b2o6b2o2b2o12b2o9bo16b2o5bo32b2o56b2o4bob2o10b2o13b2o145b o2bo4bobo32bobo4bo2bo199b2o4b2o2b2o4b2o2b2o4b2o340b3o$13bo136bo2bobo 75bo4bo3bo4bo2bo2bo3bo36bo24bo24bo76b2o9b3ob3o6bo3bo6bo3bo9bobobobo9bo b2o2b2o9b3o14b3o26bo7bobo8bobo8bobo16bobo12b3o16bo22bo4bo3b2o127b2ob4o b2o37b2o9b2o27bo243b2obobo2bobo13b2ob2ob2obo4bobo7b2o5b4o8bo4bo65bo5bo 9b2o8bo2bo4bobo238bo5bo9b2o25bo24bo4b2o59bo22bo80b2o38b2o98b2o8b2o140b o58bo37bo3bo19bo4bo15b3o3bo2bo32bo22b2ob2o214b2o2bo2bo32bo2bo2b2o202bo 5bo3bo5bo3bo5bo49bo292bo$14bobobo15bo5bobo105b2obo4bo29b2o6bo5bo3bo19b o3bo7bo3bo13bo35bo3bo124b3o7bo3b3o7bo4bo4bo4bo9bobo2bo7b2obob2o2bobo 21b2o7b2o23bo6bo12bo8bo20bo8b3o13b7o27b5o61bo4bo23bo4bo26bo8bo4bo80bob 2o240bobobob2o2bobobobo6bo14bo5bob2ob2obo5bo4b2obob2obo65b2o4b2o8bo12b 2o2bo2bo238bo15b2o25b2o28bo56b2o3bo22b2o7b2o69bo15bo102b2o9b2o8b2o150b 2o56bo3bo26b2o7bo3bo22bo15b5o5bo32bobo20bo3bo11b2o206b2o34b2o208bo5bo 3bo5bo3bo5bo47bobo66bo$18bobobobobobobobobobobo2bo2bobobobobobobo32b2o 31b2o27b2ob2o2b3o24bo3bo2bo2bo4bo3bo4bo9bo4bo3bob2ob2obo3bob2ob2ob4obo 57b2obo5bob2o15b2o3b2o88bo9b2o3bo2bo3b2o11b2o10b2obo7bo7bo3bo9bo2bo3bo 2bo22b2o5b2o12b2o6b2o20b2o7bo2b2o11bo32bo4bo13b2o4bob2o36b2ob4ob2o19b 2ob4ob2o24bo96b2o240bobobo3bobobob2o6b2obobob2o20bob5o6bo2bob2o68bob2o 11bo16b2o7bo2bo2bo225b2o3bo33bob2o10b2o7b2o7b2o12b2o43bo4b2o30bobo57bo 8bobo13bobo10bobo89bobo9b2o217b5o27bo6b2o2b2o19b2o18b3o2bo3bo33b2o21b 3o12b2o451b2o4b2o2b2o4b2o2b2o4b2o48bo$14b2o4bo2bo2bo2bo2bobobo2bobobo 2bo2bo2bo2bo2bo30bo2b3o3b3ob3o3b3ob3o3b3o2bo24b2o2b3o3bo27bo13bo3bo7bo 3bo7bo3bo7bo3bo8b2o60bo5bo5bo15b7o72bo11bo15bo3b2o3bo28bo7b2o5b2o3b2o 9b4ob4o19b2obo63bobo13b2o27b2o2b2o15bo4b2obo38bo4bo23bo4bo25bobo338b2o b4o2b2obo7bo2bob2obo16b2obob2o9bobo74b2obo10b2o23bobo4b2o194b2o14b2o 15b3o34b2obo10b2o6bobo21bobo47bo33bo57b2o7b2o15b2o10b2o81b3ob2o4b3o7bo 6bo211b2o3b2o25bo3b2obo6b2obo15bo20b2o2bo3bo57bo239b2o227b2obo6b2obo6b 2obo116bob3o$19bobobobobobobo2bo2bobobobobobobobobobobo2bo8bo20bob4ob 4ob4ob4ob4ob4obo24bo3b3o2b2o29bob4ob2ob2obo3bob2ob2obo3bob2ob2obo3bo4b o9bo44b9o15b2ob2ob2ob2o95bob2o9bobo12bo2bo2bo2bo28bobo12b2o3b2o12bobo 22bob2o64bo14b2o26bobobo16bo3b2o103bo58b3o27b3o28b3o28b3o193b2o3bo8bob o4bo17bob2o3b2o6b2o79b2o4b2obo26b2o200b2o15b2o73bo25bo36b2o7b2o12b2o 20b2o44b2o11b2o29bo6bo81b4o2bo4b3o12bobo211b5o26b2o2bob2o6bob2o15bo28b o297b2o177b2o48bob2o6bob2o6bob2o48b5o65b2obo202bo17b2o$14bo2bo15bobo5b o15bobo2bo4bobo19b2o31b2o21b3o2b2ob2o35b2o8bo3bo7bo3bo7bo3bo59b2o5b2o 42bo5bo74bo11bo14b2o4b2o30b2o12bo5bo7b5o3b5o125bo2bobobo16b2o3bo103bo 58bobo27bobo28bobo28bobo191bo2bo3b2o8b2o4b2o16bo4b2obo88bo4bob2o241b5o 15b3o55b2o25b2o34bobo21bobo64b3o3bo7b3o9b3o15b3o91b2o4b3o12bo3b2o3b2o 159b2o44b3o60bo25bo2bo120bo21b2o129b2o46b2o153b2o120bo4bo64bob2o201bo 18b2o$16bobo40bobo2bo3bo2bo20bo2bobo2bobo2bobo2bobo2bobo2bo28bo4bob2o 39bo9bo4bo3bo4bo65b2o7b2o16b2o3b2o14b2obobo3bobob2o68bobo10b2o79bo2bo 7bo2bo124b4ob2o21bo104bo5b2o2b2o47b3o27b3o28b3o28b3o191b2o40b3obo90bo 3b2o16b2o227b4o14b2o3bo117bo25bo61bob2o4b4o5b2o29bobo95bobo13bo3b2o3b 2o19b2o138bobo44bo81b3o5bo122b2o9b2o7bobo15b2o112b2o46b2o278bo2bo19bo 44b3obo199b3o$16bo44bobo2bo22b2obo2bobo2bobo2bobo2bobo2bobo2bob2o26bob o2bo56bo3bo70bo9bo10b2o15b2o8bo4b2ob2o4bo13bo54bobo11bobo77b2o11b2o 128bo19b2o2b2o13bo4bo84bo5b2o2b2o5bo371bobo90b2o2bo17b2o7bo4b2o231bo 15b2o104b2o25b2o53b2o5bo2bo4bo4bo2b2o10bo3bo19b2o92b2o14bo3b2o24bobo 139bo124bo7bobobo119b2o10b2o7bo17b2o112b2o46b2o154bo123b2obo2bo15bobo 37b2o$63bobo4b2o17b2obo2bobo2bobo2bobo2bobo2bobo2bob2o26bobo155bo2bo3b obobo3bo2bo5b2obob2ob2ob2ob2obob2o10b2o19bo2bo31bo13bo219bobo20bo4bob 2o7b2ob4ob2o21b2o2b2o26b2o2b2o22bobo15bo372bo96bo16b2o8bo2bo2bo2b2o 208b4o14bo5bo9b2o186b2o5bob2o5bo3bo2bo11bo3bo15b2obo111bobo28bo139b2o 123bo4bo2b2obobo139b3o93b2obo4b2o4b2o4b2obo13bo20bo4bo20bo133bo2b2o16b obo119bo5bobobo15bo36bo2bo6bo179b2o$65bobo25bo5bo3bo5bo3bo5bo33b2o128b 2o2b3o5b3o2b2o7b3ob9ob3o6bo2bo2bo7bo2bo2bo29bobo2bobo263b2o20bo5b2obo 9bo4bo23b2o2b2o26b2o2b2o23bo15bobo36b2o2b5o2b2o17b2o2b5o2b2o18b2o2b5o 2b2o18b2o2b5o2b2o128b2o196b2o17bo6b3o2bobo4bo2bo205b5o14bo3bo208b3o3b 2obo34b3o114bo29b2o250b2o12bo9bobo60b2o173bob2o5bo5bo4bob2o12bobo20bo 2bo20bobo131bo3b2o2b2o7b2o2bo2bo118bobo4bo2bo28b2o213bobo$67bobobo82bo 128bo2bob2o5b2obo2bo10bo4bo4bo10bo2b2o9b2o2bo8b2o2b2o14b3o6b3o283b2o8b 2o97bo5b2o2b2o5bo37bobobo3bobobo17bobobo3bobobo18bobobo3bobobo18bobobo 3bobobo85b2o40bobo192b2o4b2obo12bobo11bo5bobobo191b2o15b2o227b2o23b3o 15b3o396b2o2b2o10b2o6b2o36b2o23b2o177b2o2bo5bo3b2o11b3obobo19b3o2b3o 19bobob3o126bo7b2o7b2obo122bo2bo2b2o17b5o5b2obo2bob2o19bo2bo187b3o$72b o81bo129bobobo7bobobo10b2o9b2o10b2o4bo3bo4b2o8bobo17bo3bob2obo3bo293bo 103b2o2b2o5bo38b3o5b3o19b3o5b3o20b3o5b3o20b3o5b3o85bobo40bo194b2o4bob 2o7b3obobo15b2obo2bo192b2o14b2o668b2obo2b2o11bo45bo202bo3b2o4b2o2bo12b 4obo48bob4o127b4o16b2o121b2o21bo4bo5bo4bo2b2o20bo2bo187b2o$71b2o210b2o b2o9b2ob2o9bo11bo11bob4o3b4obo9bo5b2o13b2obob2obob2o283b2o8bo115bo42bo bo27bobo28bobo28bobo51b2o3b2o31bo40b2ob4o207b4obo4bo2bo8bo2bo881b3o16b o42b3o103b3o98bo4bob2o5bo15bo50bo296bo2bo12bo26bobo184b2o$282bo2bo3b3o b3o3bo2bo9bo9bo12bobo9bobo8b2o12b2o8bo6bo286bo8b2o114bo40bobobobo23bob obobo24bobobobo24bobobobo48bo2bobo2bo28b2ob4o35bobobo2bo211bo5bo8bo4bo 455bobo9b3o431bo42bo21b2o82bo99b2o4b2obo4b2o222b2o136bo2bob2o9bobo28bo 185b3o$283bobob2o7b2obobo9b2o9b2o9b2o2bo2bobobo2bo2b2o13bo6bo9bob4obo 79bo11bo10b2o6bo14bo6b2o151bo5bob2o38bo4bo21b2o3bo2bo3b2o36bobo33b2o4b 7o4b2o11b2o4b7o4b2o12b2o4b7o4b2o12b2o4b7o4b2o12b2obo6b2obo12b2o3b2o3b 2o3b2o23bobobo2bo35bobo221bo4bo4b5o457b2o503b2obo4bob2o77bobo93b2obo 10b2o4b2obo29bo6b2o6bo173b2o79b2o54bobobo5bo236b3o$83b2o2b2o8b2o8b2o 175bo2bobo5bobo2bo33bobo3bobobo3bobo19bobo7b2obob2obob2o57b2o3b2o12bob o9bobo10bo4b3o13bobo5bo152b2o4b2obo36b2ob4ob2o19b5o4b5o37bo34bo2b2o4bo 4b2o2bo11bo2b2o4bo4b2o2bo12bo2b2o4bo4b2o2bo12bo2b2o4bo4b2o2bo12bob2o6b ob2o12bo15bo23bobo7b2o29b2o2bo220bobo2b2o466bo9bo3bo346b2o64b2o76bo10b o78b2o93bob2o11bo4bob2o27bobo6b2o6bobo251bobo55bo2bo4bobo35b2o198bo$ 31bob2ob2o6bo6b2ob2obo25bo2bo2bob2o3bo2bob2o3bo2bob2o4b2o171bobobo38bo 2b3o3bo3b3o2bo14b2ob3o7bo3bo4bo3bo55bobo3bobo11bobo9bobo9bo4bo16bobo3b obo200bo4bo21b2o3bo2bo3b2o23bo4bo8bo35b3obo7bob3o13b3obo7bob3o14b3obo 7bob3o14b3obo7bob3o17b2o2b2o4b2o7b2obo15bob2o18b2o2bo7b2o5b2o21bo4b2o 6b2o209b2obo11bo290b2o25b2o4b2o25b2o117bo3bo346b2o64b2o77b2o6b2o172b2o 14bo3b2o4b2o6bo2bo16b2o14b2o16bo2bo232bo43b2o15b2o2bo2bo35b2o186b2o11b o$31b2obobo3b2obobob2o3bobob2o26bob2obobo2bo2bobobo2bo2bobobo2bobo2bo 166b4o2bo2b4o35b2o2bo2b3o2bo2b2o17b2o10b3obo2bob3o28b2ob2o7b3o14bo5bo 10b3ob2o7b2ob3o7b2o3b2o12b2obob2o2b2o4bo258b2ob4ob2o48b2ob2o25b2ob2o 26b2ob2o26b2ob2o23bo3bo5bo6bo2bob2o13b2obo2bo15bo4b2o13bo22b5o8b2o5b2o 216bobo290bo25bo6bo25bo129bobo479b3o2b6o2b3o169bo15b2o2bo5bo10bo50bo 234b2o4b2o37b2o20b2o224b2o$34bo3bo2bobobobo2bo3bo28b2o2bobo3b2ob2obo3b 2ob2obo3b2ob2obo167bob7obo38b2ob2o3b2ob2o17bo2bo12bob4obo31bob2o40bo 19bo25bob2o9b3o260bo4bo46b2o9b2o17b2o9b2o18b2o9b2o18b2o9b2o20bo3bo5bo 5b2obo5b3o3b3o5bob2o15b5o13bobo20b2o4bo15bo218bo291bobo21bobo6bobo21bo bo119b3o7b2o17bo29bo432bo2bo8bo2bo170bo19bo5bo5bo4bo48bo4bo237bo9b2o2b o$34bo2b3o3bobo3b3o2bo27bo2bo4bo4bo4bo4bo4bo4bo3b2o164bobo9bobo36bo2bo 5bo2bo18b2o49b2o12b2o2b2obo26b3ob2o7b2ob3o7b2o10b2o9b2o6bo93b2o16b2o6b 2o16b2o176bo11bo17bo11bo18bo11bo18bo11bo19b2o2b2o4b2o8bo5bobo3bobo5bo 16b2o4bo13b2o20bo2b2o5b3o8bobo203bo2bo304b2o12b2o7b2o8b2o7b2o12b2o131b o15bo3bo25bo3bo25b2obo6b2obo392b2o10b2o170b2o18b2o4b2o5b2o2bobo46bobo 2b2o234b3o6b2o2b2o3bo279bo$33b2obo5bobobo5bob2o26b2o2b3obob2o2b3obob2o 2b3obob2o2b3o2bo161b3obo2b2ob2o2bob3o31b2obob2o5b2obob2o69bob2o7bo4bob o10b2ob2o13bob2o7b2obo9bobo2bo6bo10bo2bo4b2o93bo7b2o7bo8bo7b2o7bo178bo 9bo19bo9bo20bo9bo20bo9bo16b2obo6b2obo10b2o4b3o3b3o4b2o15bo2b2o5b3o3b3o 24b2obo6bobo8b2o206b2o317bo30bo129bo35bo29bo24bob2o6bob2o192b2o384b2ob o10b2o4b2obo12bob2o42b2obo239bo8b2o7bo3b2o16b2o250b2obobobo$36bo2b2obo 3bob2o2bo31b2o2bob2ob3o2bob2ob3o2bob2ob3o2bobo2bo158bo5bo2bobo2bo5bo 30bobob2ob2ob2ob2obobo65bo3bo2bo14bo7b2o2bobo2b2o35bo2b2o4bobo11b3o99b obo3bo4bo3bobo8bobo3bo4bo3bobo177b2o9b2o17b2o9b2o18b2o9b2o18b2o9b2o15b ob2o6bob2o46b2obo6bobo3bobo27bo6b3o3b3o528b2o4bo20bo4b2o129b2o28bo4bo 24bo4bo22b2o4b2o8b2o22b2o31b2o133bobo383bob2o10b2o4bob2o315b4o5bo16b2o bo248bob2ob2o10b2o$33b2o2b3o2b2ob2o2b3o2b2o26b2ob2o2bobobob2o2bobobob 2o2bobobob2o3bob2o159bob2obobo3bobob2obo33bo4bo3bo4bo70b2obo6bo14b3obo bobobob3o12b2o3b2o11b3o5b2o2b2o15b2o98b2o2bo6bo2b2o10b2o2bo6bo2b2o296b 2o14b2o47bo6b3o3b3o27b2o11bobo368b2o5b2o46b2o5b2o97bo3b2o20b2o3bo129b 2o3b2o25b5o25b5o22bo5bo9bo6b2o15bobo7b2o11b2o7bobo15b2o119bo11bobo713b 3o20bo259b2o4bobo$29b2obob2o3b2ob5ob2o3b2obob2o22bo37bo163b2obobo5bobo b2o34b2obobo3bobob2o68bo11bobo4bo6bo4b2o3b2o4bo10bobo3bobo10bo7bo17b2o bo3bo98bo8bo16bo8bo299bo15bo48b2o54b3o368b2o5b2o46b2o5b2o98bo11bo4bo 11bo136b2o67b2o13bo5bo9bo5b2o17bo7b2o11b2o7bo17b2o104b2o10bo2bo10bo2bo 4bo399bo2bo42bo2bo164b2o93bo22bo260b2o3bo$29b2ob2o4bo11bo4b2ob2o23b2ob obobobobobobobobobobobobobobobobobo167bo7bo43b2ob2o71bobo11bob2o2b2o7b 4o7b4o9b3o7b3o34b2obobob3o96bo8bo16bo8bo300bo15bo646b2ob4ob2o145bo69bo bo11b2o4b2o8b2o22b3o29b3o120b3o13bo9b2o5b2o400b2o46b2o164bobo112bo2bo 259bo$32bo2b2obobo7bobob2o2bo27bob34o42b2o16b2o39b2o6b2o6b2o3bob2o88bo b2obo5bob2obo65b2o30bo7bo11bo3b7o3bo16bo20b2o4bo27b2o16b2o6b2o40bo8bo 16bo8bo124bo174b2o14b2o506b2o5b2o41b2o78bo11bo4bo11bo207bo13b2obo6b2ob o167bo8bob2o12bobo8b2o3bo8b2o110b2o307b2o92b2obo6b2obo6b2obo74bo113b2o $29b2o2b3o2b2ob7ob2o2b3o2b2o22bo2bobobobobobobobobobobobobobobobobo39b 2o3b2o3b2o6b2o3b2o3b2o24bo8bo2bo4bo2bo4bo2bo2b2obo88b2obobo5bobob2o84b 3o9bo9bo10b2o2bo5bo2b2o15bobobob2o16b4o29bo16bo8bo27b2o8b2o2bo6bo2b2o 10b2o2bo6bo2b2o120b3o175b2obo6b2obo508b2o5b2o31b2o7bobo15b2o60bo3b2o 20b2o3bo206b2o12bob2o6bob2o167bobo6bo2bo5bo6b2o11b2o10b2o110b2o307b2o 92bob2o6bob2o6bob2o74b2o90b2o$21b2o2b2obob2o3b2ob13ob2o3b2obob2o2b2o 14b2obo33b3o26b2o3b2o2bo10bo2b2o2bo10bo2b2o3b2o11bo2bobo4bo3b2o2bo3b2o 2bo3bobo5bob2o89bo7bo100b2o7b2o17bo21bob2ob2obo16bo32bobo12bobo8bobo 25bo8bobo3bo4bo3bobo8bobo3bo4bo3bobo118b5o174bob2o6bob2o16bo7bo523b2o 6b2obo15b2o59b2o4bo20bo4b2o119bo103b2o2b2o172bobo5bob2o5bo11bo8bo2bo 99bo4bo30bo4bo385b2o2b2o8b2o4b2o163bo2bo$18bo2bo3b2ob2o4bo19bo4b2ob2o 3bo2bo13bobobobobobobobobobobobobobobobobobo3bo23bo3bobo2bobo2b6o2bobo 2bobo2b6o2bobo2bobo3bo9b4obo2b6o2b6o2b6o2b6obobo225bobo20bo25bo32b2o 12b2o10b2o23bobo8bo7b2o7bo8bo7b2o7bo326bobo5bobo73bo457b2o78bo30bo117b 4o3bob2o96bo3bo29b3o14b2o13b3o96b2o11bo2bo7b3o13b2o10bobo97b2ob4ob2o 26b2ob4ob2o267b2o34b2o78bo3bo9bo5bo164bo309b2o$17bobobo6bo2b2obobo15bo bob2o2bo6bobobo12bob33obo2bo21bo2bobob4obobo6bobob4obobo6bobob4obobo2b o13bobo5bobo5bobo5bobo5bobo6b2o220bo20b2o24b2o37bo4bo20bo4bo14b2o8b2o 16b2o6b2o16b2o326bo7bo31bo7bo33bobo375b3o3b3o23b3o3b3o41bo65b2o12b2o7b 2o8b2o7b2o12b2o96b2o5b4o4bobob2o2b2o91bo3bo11b2o17bo13bo2bo12bo17b2o 79b2o11bobo9b2o14b2o111bo4bo30bo4bo264b2o2bo2bo32bo2bo2b2o74bo3bo9bo5b o20bo142bo55b2o220bo19b3o2bo5bo3bo$16bo2bob2o2b2o2b3o2b2ob15ob2o2b3o2b 2o2b2obo2bo9b2obobobobobobobobobobobobobobobobobob3obo21b2o3bo2b2o2bo 2b2o2b2o2bo2b2o2bo2b2o2b2o2bo2b2o2bo3b2o10b2obobobobo3bobobo3bobobo3bo bobo3bobo5bo304b2ob4ob2o16b2ob4ob2o3bo4bo20b2o2b2o23b2o2b2o369bobo5bob o33bo7bo367bo2bo3bo2bo22bo2bobo2bo106bobo21bobo6bobo21bobo95b2o5bo2bo 3b2obob2o2bobo89b2o2b2o11b2o15bobo14b2o13bobo15b2o91bobo292bo3bo3bo 141bo2bo4bobo32bobo4bo2bo70b2o2b2o8b2o4b2o20b3o140bob2o52bobo9bobo207b 2o14bo3bo9bo5bo$16bob2o4bob2o3b2ob21ob2o3b2obo4b2obo9bo2bo36bo30b2o5b 2o2b2o5b2o5b2o2b2o5b2o17bo5bobo3bobobo3bobobo3bobobo3bobobobob2o307bo 4bo20bo4bo3b2ob4ob2o18b2o2b2o23b2o2b2o72b2o3bo106bo18bo166bo7bo41bobo 366bo3bobo3bo24b2ob2o43bo64bo25bo6bo25bo102b4o3b2o8b3o7b2o75b2obo6b2ob o24b2o31b2o108bo9bo22b2o9b2o247b3o2bobo2b3o138bobobo5bo34bo5bobobo65b 2obo6b2obo4bo5bo24bo31b2o108b2o54bo8bo198bobo8bobo12bobo4bo8bo3bo2bo$ 13b2ob2o3b2ob2o4bo27bo4b2ob2o3b2ob2o7bo2bobobobobobobobobobobobobobobo bobobo24b2o3bo2b2o2bo2b2o2b2o2bo2b2o2bo2b2o2b2o2bo2b2o2bo3b2o9b2o6bobo 5bobo5bobo5bobo5bobo116bo188b2o12b2o10b2o14bo4bo13b2o16b2o8b2o16b2o66b obobobo104bobo16bobo216bo366b2obobobobob2o70b2o63b2o25b2o4b2o25b2o102b 4o3b2o8b3o6b2o75bob2o6bob2o178b2o19bo2bo7bo2bo64b2o2b2obo6bob2o163bo5b obo5bo138bo2bob2o10b2o16b2o10b2obo2bo66bob2o6bob2o5bo5bo22b2o31bo165b 2o2b2o2bo4bo194bo3bo19b2o16bo$13bobo3b2obobo2b2obobo23bobob2o2bobob2o 3bobo8b2ob32ob2o23bo2bobob4obobo6bobob4obobo6bobob4obobo2bo15bobob6o2b 6o2b6o2b6o2bob4o34b2o20b2o24b2o27bo2bo184bobo12bobo8bobo23b2o9bo7b2o7b o10bo16bo41b2o26bobobo106bo16bo585b2ob2o3b2ob2o19bo11bo37b2obo15b2o 212bo12b3o275b2o20b3o9b3o65bo2bob2o6b2obo162bob5obob5obo140bo2bo8bo2bo 16bo2bo8bo2bo73b2o2b2o4b2o2b2o4b2o56b3o166b2obo2bob2o184b2o12bo10b2o7b 2o17bo3bo3bo$15bob2obobo2b3o2b2ob23ob2o2b3o2bobob2obo11bobobobobobobob obobobobobobobobobobo26bo3bobo2bobo2b6o2bobo2bobo2b6o2bobo2bobo3bo16b 2obo5bobo3bo2b2o3bo2b2o3bo4bobo2bo32bo4bo16bo4bo20bo4bo25bo2bo184bo16b o8bo25bobo8bobo3bo4bo3bobo10bobo12bobo39bo4bo23b2obob2o41b5o55bo2bo8b 2o8bo2bo35b2o6bo22bo6b2o507b3o5b3o21bo9bo39bobo15b2o224bobo301b9o67bo 7b2o2b2o36bo2bo126bo5bo3bo5bo54bo86bo4bo34bo4bo74bo3bo5bo3bo5bo59bo 105b2o52b2o9b2o188b2o8bo4bo7bo2bo7b2o18b2o3b2obo$15bobo2b4o3b2ob29ob2o 3b4o2bobo10bo35b2o26b2o3b2o2bo10bo2b2o2bo10bo2b2o3b2o21bob2o2bo2bo4bo 2bo4bo2bo8bo116bobo49bo10bo25b2o32b2o61b2o16b2o6b2o27bo9b2o2bo6bo2b2o 12b2o12b2o39bo6bo21bo3b2o3bo40b3o55bo2bo7bo4bo7bo2bo33bobo6b3o18b3o6bo bo540bobobobo42b2o241b2o288bobo10bo2b5o2bo66b2o6bo4bo34bobo2bobo125bo 2bobobo2bobobo42bo7b2o3b3o85b5o34b5o76bo3bo5bo3bo5bo164b2o52b2o213bo7b o7b2o4bobo23bo$14b2o2bo7bo35bo7bo2b2o8bob2obobobobobobobobobobobobobob obobobo36b2o3b2o3b2o6b2o3b2o3b2o30b2obo3b2o6b2o6b2o45bobo2bobo73bobo 48bobo8bobo24bo6b2o25bo117b2o11bo8bo19b8o42bo8bo19bob2o2b2o44bo57b2o 22b2o34bo11bo16bo11bo540bobobobo575b2o11b2o2b3o2b2o75bo2bo36b2o2b2o 127bob2ob3o3b2o43b3o5b2o6bo4b2o7bo80b2obo16bob2o85b2o2b2o4b2o2b2o4b2o 429bo3bo7bo6bo2bo5bo23b2o7b2o$13bo2bobo4b2obobo31bobob2o4bobo2bo8bo2b 32o2bo40b2o16b2o103b4ob2ob4o11b10o16b10o26b2o47bobo8bobo21b2obo6bo2bo 20bo3bo20b2o3b2o3bo98bo8bo19bob4obo42bo8bo19bobo2bobo3bo153bob2ob2o4b 2o3b2o16b2o3b2o4b2ob2obo536b2ob2o577bo88b2o6b2o2b2o13bo2bo4bo2bo26bo2b o4bo2bo106b2obo45bo8bo11b2o4b2o5b3o72bo9bobo2b2o6b2o2bobo9bo73b2obo6b 2obo6b2obo7b2o212bo209bobo9bo7b2o39bobo$14bobo2b5o2b2ob31ob2o2b5o2bobo 10bobobobobobobobobobobobobobobobobob2obo159bobo4bo2bo4bobo8b2o6b2o16b 2o6b2o17bo8b2o45b3ob2o6b2ob3o19bobob2ob2obob2o2bo17b4obo19bobo2b2o2bob o97bo8bo19b8o42bo8bo20b3o2b2o5b2ob2o21bo6bo72bo6bo38b2obo2bo3bobo12b2o 12bobo3bo2bob2o533bo2bo3bo2bo60b2o5b2o595bo2b2obo6bob2o7b3o2b6o2b3o22b 3o2b6o2b3o105b2ob3o42b3o5b2o23bo8bo65bobo9bo4bo6bo4bo9bobo72bob2o6bob 2o6bob2o8bo211bobo31b2o188bo2bo46bo$15bob3o2b3ob37ob3o2b3obo10b2o35bo 160b2ob2obo4bob2ob2o7b2o8b2o14b2o8b2o15bo2bo4bobo45bo4bo13bo12bo7bo2bo bo2bo2bobobo19bobo21bo6bo2bo93b2o2bo6bo2b2o12b2o12b2o39bo6bo25b2o3bo2b 2ob2o20b2o6b2o74b2o46bo4b2o11bo4bo11b2o4bo539b2o5b2o13b2obo3bob2o12bo 24b2o5b2o500bobo56bo2bo31bo3bob2o6b2obo9bo2bo4bo2bo12b2o12bo2bo4bo2bo 107bo4b4o42bo29b2o5b3o66bo11bo14bo11bo105bobo208bo2bo31bo191b2o46b2o$ 17bobo2bo43bo2bobo14bobobobobobobobobobobobobobobobobobo164bobo6bobo 10bo10bo14bo10bo16bobo4bo48b3o2bo6b2ob3o11b2o2bo3bo2b2o2bobobo3bo2bo 15b2o4b2o15b4ob6obobo92bobo3bo4bo3bobo10bobo12bobo39bo4bo20b5obob2o28b 3o6b3o5bo60b3o10b3o41b2obo30bob2o249bo313bo2bo3bo2bo11bo374b2o31bo127b 2o12b4o44bo30b2o6b2o8b2o31b2o131bob2o4bo41b2o35bo81bo2bo8bo2bo118b2o 207bo2bo33b3o$15bobobo2bobo39bobo2bobobo10b2ob32ob2o160b2obobo6bobob2o 61bo2bo2bob2o48bo2bo6b2obo17bo3bo2b2o2bobobo2bob2o12b2obo2bo5bobo11bo 3bo6bobob2o91bo7b2o7bo10bo16bo41b2o22bo2bo2bobo30b2o6b2o5bobo59bobo2b 2o2b2o2bobo38bo2bo3b2o2b3o16b3o2b2o3bo2bo246bo314b3o3b3o12b3o229b2o 124b2o15bobo7b2o10b2o8b2o15b2o110bo12bo3bo40bo3bo38bo10bo182b2o38bo19b 3o6b2o247bo214bo$15b2o3bob2ob39ob2obo3b2o11bobobobobobobobobobobobobob obobobobo162b2obo10bob2o6bobo8bobo9b2o2b3o6b3o2b2o13bobo2bobob2o54bo 20bo3b4ob2obo3b2ob2o16bobo6b2ob2o11b2o3bo2b2o2b2o93b2o16b2o8b2o16b2o 30b3o36bo2bo31bo6bo5bo2bo2bo2b2o4b2o2bo43b3o10b3o38bo2b3o2bo2bobo4bo6b o4bobo2bo2b3o2bo246b3o565b2o124b2o17bo7b2o10b2o7b2o16b2o114b2o11bo41b 4o30b2o7bo8bo183bo19b2o17bobo17bo3bo252b2o2bo173bo2bo$22b45o17bo35b2o 163bobob4obobo11bo2bo2bo2bo9b3o2bob2o6b2obo2b3o11bobo2bob4o51b4o27bo8b ob2o17bo2bo3bo2bo17bo4bo4bo170bo3bo6bo29b2o46b2o2bo3b3o2b3o3bo98b2o4bo 2b3o7b2o7b3o2bo4b2o133b2o3b2o100b2o7b2o708b3o29b2o2b2o126bobo7bo2bo60b 2o15bo6b2o8b2o180bobo18bo2bo16bob2o15bo5bo16b2o234bo3bo174b2o$83bob2ob obobobobobobobobobobobobobobobobo164bobo6bobo8b2o2b3o2b3o2b2o5bo4b2obo 8bob2o4bo21b2o49bo22bobobo2b2obobobob2ob3ob2o10b2ob2o6bobo12b4ob4obob 3o170bo5bo4bobo32b2o2b2o43bo2b2o4b2o2bo97bo2b3o2bo26bo2b3o2bo44bo7bo 77bo2bobo2bo99b2o2b3o2b2o45b2o300bo63bo25bo114b2o308bo11bo71bobo13bo3b 2obo6bob2o28bo10bo142b2o18bobo2bo16b2o3bobo10bo5bo15bo2bo234bo$84bo2b 32o2bo162b2obob4obob2o9b3o6b3o8b3obo3bo6bo3bob3o22b2o44bob2o6bo2bo14bo bo8b2o3bo4bobo11bobo5bo2bob2o11bo2b2o4bobo183bobo29b5ob2ob3o38bo53b2o 2b5o2b2o2b2o2b5o2b2o32bo2bo3b2o10b2o2b2o10b2o3bo2bo43bobo5bobo31bo7bo 32b2o3b2o3b2o3b2o101b3o42b2obo4bob2o294b2o62bobo23bobo113b2o28b2o278bo bo29b2o52bo13b2o2bob2o6b2obo28bo10bo162bobob2o22b2o10bo5bo14bob2obo$ 22b45o18bobobobobobobobobobobobobobobobobob2obo161bo2b3o2b3o2bo13bo2bo 14bobobo10bobobo24b2o42b3ob2o6bo2b3o12bo10b6o4bobo14b2o4b2o21b2obo2bo 171bo7bobobo29bo12bo36bobo52bobobo3bobobo2bobobo3bobobo35b2obo30bob2o 47bo7bo31bobo5bobo31bo15bo46b2o53b3o42bo10bo294bobo62bo25bo144b2o267b 2o12b2o9b2o15b3o52b2o57bobo8bobo93b2o4b2obo6b2obo47b2obob2o2b2o18b2o 11bo3bo12bo3bobobo234b3o138bo2b2o$15b2o3bob2ob39ob2obo3b2o10b2o35bo 164bo2b4o2bo11bobo6bobo12bo3bo6bo3bo26b2o41bo13bo4bo18bob2o4bo2bo3bo 17bobo21b3ob2o2b2o171bo7bo2bo31b6o2b4o93b3o5b3o4b3o5b3o34bo4b2o5b2o14b 2o5b2o4bo86bo7bo29b2obo15bob2o43bo49b2o49b2o6b2o365bo15bo275b3o29b2o2b 2o105b2o12b2o9b2o14bobo2bo2b2o106bo10bo95bo4bob2o6bob2o7b2o41bo4b2o33b 3o13bo3bobob2o373bo3b2o2b2o$15bobobo2bobo39bobo2bobobo12bobobobobobobo bobobobobobobobobobobo164b2obo4bob2o9b2obob4obob2o10bo2bob2o4b2obo2bo 27b4o38b3ob2o6b2ob3o19b2o6bo2bo21bob4o18bo228bo2bo100bobo12bobo33b2obo 2bo3bobo26bobo3bo2bob2o117bo2bob2o13b2obo2bo33bob2ob2obo5b2o30b3o8bo2b o45b3o2b6o2b3o355b5o2b3o11b3o2b5o155b2o94b2o17bo12b3o13b2o16b2o106b2o 6b2o6bo3b2o5b2o2b2o2b2o106bo10bo94bo3b2o4b2o2b2o4b2o5b2o5b3o33b3o3b2o 47bo6bo376bo7b2o$17bobo2bo43bo2bobo12b2ob32ob2o163bo2bo4bo2bo12b2o4b2o 14b2obo8bob2obo26b4o40bobo8bobo24b4ob3o23bo3bo200bo5bo37b2o6b2o37b3o 55bobobobo8bobobobo31bob2ob2o4b2o3bo3bo10bo3bo3b2o4b2ob2obo117b2obo5b 3o3b3o5bob2o33b2obobobo6bo31b3o8bobo46bo2bo8bo2bo354bo4bo5bo9bo5bo4bo 154b2o94b2o15bobo29b2o15b2o103bobo7b3o5bo3bobo9b2o110bo10bo94b2o2bo5bo 3bo5bo12bo3bo12b2o16b2o3bob2o50bo2b3o210b2o165b4o30b2o$15bob3o2b3ob37o b3o2b3obo11bobobobobobobobobobobobobobobobobobo166bo2bo2bo2bo10b2o4b2o 4b2o12bo2b2o4b2o2bo2bo30b2o38bobo8bobo21b3o4bo27bo204bo3bo38bo2bo2bo2b o37b3o49b2o4b7o8b7o4b2o30bo9bo4bo10bo4bo9bo125bo5bobo3bobo5bo13b2obo6b 2obo15bo8bo28b3o2b2o3bo3bo4b3o37b2obobo10bobob2o207bo95bo5bo15bob2o6bo b2o11bo2bo7b2o9b2o7bo2bo266b2o31bo120bo10b2o6b5o122bo10bo99bo5bo3bo5bo 10bo5bo11bo16bo2bob2obo51bo5b2o208b2o199bobo$14bobo2b5o2b2ob31ob2o2b5o 2bobo9bo35b2o61b3o3b3o95b2o4b2o13b4o2b4o14bo3bo4bo3bobo31b2o6b2o31bo 10bo22bo2bo2bo2b2o23b2o205b3o40b3o2b3o39bo50bo2b2o4bo4b2o2b2o4bo4b2o2b o30bobo6bobobo14bobobo6bobo125b2o4b3o3b3o4b2o13bob2o6bob2o23b2o33b2o3b o48bobobo12bobobo208b2o70bo21b3o3b3o14b2obo6b2obo8bo2bob2o27b2obo2bo 118b2obob2o306b2o4b3o122bobo8bobo93b2o2b2o4b2o2b2o4b2o10bo5bo9bobo17b 2o5bo51bob2obo2bo385b3o22bo$13bo2bobo4b2obobo31bobob2o4bobo2bo7bob2obo bobobobobobobobobobobobobobobobo187bo2bo2bo2bo13b2obobo4bobobob2o30b2o 6bo68b2o3b2obo372b3obo7bob4obo7bob3o32b2o5bobobo16bobobo5b2o164b2o8b2o 55b3o3bo50bo16bo209b2o54b3o3b3o9b2o18b2ob2ob2ob2o11b2o8b2o11bobobo5bo 21bo5bobobo430b2o130bo10bo95bo4b2obo6b2obo12bo5bo9b2o20b3o2bo50b2obo3b 2o212b2o12bo2b2o155b3o22b2o$14b2o2bo7bo35bo7bo2b2o9bo2b32o2bo59bo4bobo 4bo113b3o2b2o2b3o11bo2b2obo4bob2o34b2o8bo346b4ob2ob4o95b2ob2o10b2ob2o 43bo4bo18bo4bo51b3o3b3o109bo9bo22b2o32bo17b2o3b2o30bo2bo14bo2bo262bo2b o3bo2bo7b2o18b3o7b3o11bo9bo12bo2bo4bobo19bobo4bo2bo106b3o9bo5bo438bo 10bo94bo5bob2o6bob2o9b2o2bo3bo32bo6bo47b2o3b3o216bob2o7bo3b2o2b2o116b 2o33b3o17b2o$15bobo2b4o3b2ob29ob2o3b4o2bobo11bobobobobobobobobobobobob obobobobob2obo58bo4bobo4bo113bo2b2o2b2o2bo12bo49b4o3b4o344bo2b2o2b2o2b o37bo53b2o9b2o2b2o9b2o39bo3bo20bo3bo51bobo3bobo32b3o3b3o69bo9bo5bo9b3o 2bobo32bo11b3o2bo2bo2b2o33bo7b3o4bo138b2o6b2o117b2obo3bob2o4bo45bo9bo 16b2o2bo2bo5b3o3b3o5bo2bo2b2o108bo3bo559b2o2b2o4b2o2b2o4b2o6bobo3b3o 30b2obobo3bo49b2o4bo212bo2bo2b2o7bo7b2o115bobo30b3o20bo$15bob2obobo2b 3o2b2ob23ob2o2b3o2bobob2obo10b2o35bo59bo4bobo4bo41b3o3b3o64b2ob4ob2o 12b2ob3o6b3o36b2obo2bo4bo391b3o52bo11bo2bo11bo120b3o3b3o4b2o20b3o3bobo 3bobo3b3o62b2o8b2o5b3o7bobo3bo37bo7bobo3bobo33bo3bo7bobo4bo3bo134b2o6b 2o85bobo42bobo24bo7bo12b2o8b2o20b2o6bobo3bobo6b2o112bo5bo8b2ob2o10b2ob ob2o532bo5bo3bo5bo7bo39bobobo3bo48b2o2b2obob2o209bobo13b4o120bo32b3o 21b3o$13bobo3b2obobo2b2obobo23bobob2o2bobob2o3bobo10bobobobobobobobobo bobobobobobobobobo62b3o3b3o140bo4bo2bo4bo37b5ob2obo116b2o273b3o53bo9bo 4bo9bo42b2o22b2o49b2o13bo2bo26b3o3b3o64b2obo6b2obo10bo6bobo4b3o33bobo 6bobo4bo34bo3bo7bobo4bo3bo229b2o44b2o20bo26bob2o6bob2o24b3o3b3o120b2ob ob2o10bo547b2o3bo5bo3bo5bo5b2o39bob2obo16b2o37b2obobo211bo137b2o32b3o 23bo$13b2ob2o3b2ob2o4bo27bo4b2ob2o3b2ob2o8b2ob32ob2o111bo4bobo4bo62b2o 2b2o2b2o14bobo2bo2bo2bobo40bobob2o116b4o327b2o9b2o2b2o9b2o115bobo13b3o 18b2o23b2o55bob2o6bob2o9bobo14bo29b2o2bo2bo16bo34bo14bo200bo7bo25bo66b 2o25b2obo6b2obo183bo5bo9b3o517bo2b2o4b2o2b2o4b2o28b2o17bo2bo17bo9bo10b 2o16bo2bobo$16bob2o4bob2o3b2ob21ob2o3b2obo4b2obo12bobobobobobobobobobo bobobobobobobobo2bo58b3o7b3o39bo4bobo4bo62bo2bo2bo2bo13b2obobo4bobob2o 39bobo118bo2bobo469bo35bobo23bobo58b2o2b2o13b2o45b2o3b2o17bo31bo2bo14b o2bo135b3o4b3o50b2ob2o3b2ob2o89bobo29b2o8b2o196bo3bo515bo5b2obo6b2obo 30b2o18b2o12b2o5b3o7b2o9bo17bo2bo212b2o$16bo2bob2o2b2o2b3o2b2ob15ob2o 2b3o2b2o2b2obo2bo10bo36bo2bo24b3o3b3o18b3o2bo4bo3bo4bo2b3o33bo4bobo4bo 64b2o2b2o18bo8bo35b2o4bo3b3o37bo76bobo2b2o133bo137bobo194b2obo13b3o17b o27bo58bo3bo79bo3b3o33bo16bo139bo4bo92b2o5b2o86bo9bo14b2o21b2o115bo27b 2ob2o8bo5bo108b2o404b2o4bob2o6bob2o64b2o7bo6b2o7b3o5b2o12b2o213b2o$17b obobo6bo2b2obobo15bobob2o2bo6bobobo10bob3obobobobobobobobobobobobobobo bobobob2o56bo4bo3bo4bo40b3o3b3o90b2o6b2o35bo2bob3o5bo36bo75bobo137bobo 137bo194bo2b2o13bo2bo15b2o27b2o58bo3bo13b2o63bo3b2o32bobobo12bobobo 135b2o6b2o53bobobobo30bob2ob2obo85bo9bo10b2o2bo2bo19bo2bo2b2o109bobo 28bo10b2obob2o91b2o15bobo27b2o149bo333bo7b2o$18bo2bo3b2ob2o4bo19bo4b2o b2o3bo2bo11bo2bob33obo24bo4bobo4bo14bo4bobo4bo3bo4bobo4bo49bo129b2obo 2bob3o36b3o73b2o139bob3o330b2o5b3o3b3o4b2o26b3o3b3o68b2o2b2o13bo8bo44b 3o8bo3b2o2b3o27b2obobo10bobob2o119b2o38b2o35bo3bobo3bo29bobobobo86b2o 8b2o6bo2bo4bobo19bobo4bo2bo106bobo137b2o17bo17b2o7bobo15b2o132bobo97b 2o14bo137b2o$21b2o2b2obob2o3b2ob13ob2o3b2obob2o2b2o15bo3bobobobobobobo bobobobobobobobobobobo24bo4bobo4bo14bo4bo17bo4bo31b3o7b3o3b5o128bob2ob obo76b3o16b3o16b3o135bob2o4bo336bobo3bobo26b3o3bobo3bobo3b3o58b2obo6b 2obo10bo6bobobob2o45b2o8b3o32bo2bo8bo2bo46b2o10b2o61bobo38bobo34bo2b2o b2o2bo11bobo15bobobobo82bob2o6bob2o7bobobo5bo21bo5bobobo105b2o10bo144b 3o17b2o7bo17b2o115b2o18b2o95b2o3b2o8b2o15b2o119bobo478b2o$29b2o2b3o2b 2ob7ob2o2b3o2b2o24b3o33bob2o22bo4bobo4bo14bo4bo2b3o7b3o2bo4bo25b3o2bo 4bo3bo4bobo5bo127bo2bobobo38b3o23bo11b2o18b2o17bobo126b2o6b2o3b2obo 336b3o3b3o32b3o3b3o64bob2o6bob2o9b2o5bob2ob2obo44bo2bo7b3o32b3o2b6o2b 3o45bo2bo8bo2bo60bobob2o3b2o22b2o3b2obobo35b3o3b3o13b2o14bo7bo47bobo 31b2obo6b2obo8bo2bob2o27b2obo2bo105bo10b2o4b3o26bo126b2o12b3o130bo3bo 17b2o10bo89b2o7b2o16b2o119bo484bo28bo$32bo2b2obobo7bobob2o2bo31bobobob obobobobobobobobobobobobobo2bo24b3o3b3o18b3o19b3o32bo4bo3bo4bobo2bobob o127b2o3bo39b3o23bo12b2o16b2o19b2o29b2o4b2obo55b2o29bobo9b2obob2o367b 2o23b2o21b2o4b3o3b3o4b2o43bo52bobo46b2o6b2o48b3o2b6o2b3o61bobobo3b2o 22b2o3bobobo37bo5bo14bo72b2o56bo2bo27bo2bo107b3o10b2o2bo3bo24bobo124bo 2bo138b2o3bo5bo16b2o9b2o99b2o2b2o131b2o479b2o2bobo25b3o$29b2ob2o4bo11b o4b2ob2o26b34obo103bo4bobo4bo3bo4bobo4bobo170b2obob2o20b3o11bo18bo15b 2o34bo4bob2o12b2o18bo21bobo23b2obo2bo6b5obo371bobo23bobo20bo5bobo3bobo 5bo42b2o46b3o4bo46bo10bo50b2o6b2o66bo36bo129bo3bo9b2o5b2o40bo4bo3b2o 11b2o3bo4bo107bo3bo42bobo12b2o110bobo139b2o2b2obo3bo8bo4bobo10b2o11b2o 236bo4bobo460bo2b3obobo22bo$29b2obob2o3b2ob5ob2o3b2obob2o25bobobobobob obobobobobobobobobobobobob2o25b3o3b3o18b3o19b3o25bo4bo19b2o2bo172b2ob 2o38b2o10b2o17bo2bo32bo3b2o4b2o9bo2bo17b3o19bo24bob2obob2o4bo5bob2ob2o bo364bo27bo17b2obo5b3o3b3o5bob2o87b3o51b2obo4bob2o49bo10bo63bo2bo34bo 2bo50b2o76bo12b2o5b2o41b5o4bo11bo4b5o107bob3obo11bo5bo13bo10b2o11bobo 96b3o12bo145bo5bo9bo3bo11b3o7bo3b3o233b2o4b4o461b6o2bo22b2o$33b2o2b3o 2b2ob2o2b3o2b2o29bo37bo22bo4bobo4bo14bo4bo2b3o7b3o2bo4bo23bo4bo2b3o7b 3o179bo7bo19b3o11b2obo12bob2o15bo34b2o2bo5bo9bo2bo16b2o3bo15b2obo24bo 4bo8b4o5b2o366b2o27b2o16bo2bob2o13b2obo2bo85b2o2b3o2b2o50b2o54b2obo4bo b2o66bo34bo53b2o12bo11b2ob2o40b2o3b3o69bobobo7bobobo115b5o4bo7b2o3b2o 7b3o4b2o10bo9b3o80b2o17bo7b2o17b3o130bo3bo5bo2b3o16b2o5b4o4b2obo68b2o 163b4obo463b2ob2o$36bo2b2obo3bob2o2bo29b2obo3b2obobobo2b2obobobo2b2obo bobo2b2ob2o22bo4bobo4bo14bo4bo17bo4bo25b3o194bo2b2ob2o2bo33bo16bo17bo 38bo5bo7bob2ob3o12bo3b2obo14b2obo22b2ob4obob2o4bobo3bo2bobo3bob3o406b 2obo15bob2o87b2o7b2o111b2o67bo3bo5bo7b2o4b2o7bo5bo3bo64bo8bo2bobo2bo 37bo2bo69bo3bobob2o7b2obobo3bo120b2o18bo3bo2b2o10b3o8b2o81b2o15bobo7b 2o17bo17b2o115b2o29b2o2bo4bo4bo2bo5b2o60bo2bo12b2o2b2o215b2o393bo2b6o$ 33b2obo5bobobo5bob2o26bo2bobo2b3ob2obo2b3ob2obo2b3ob2obo2b2o24bo4bobo 4bo14bo4bobo4bo3bo4bobo4bo17bo202bo5bobo5bo12b2o2b3o2b2o8bo16bo9b2o7bo 2bo29b2o2b2o4b2o7bo4bo2bobo10b3obobo17bob2o18bobo4bobo4b2ob2obob2o2bob o3bo413bo15bo90b3o188bo3bo3b2ob2o5b3o2b3o5b2ob2o3bo3bo35b2o5b2o18b3o8b 3o3b3o37bo7bo63bobo2bobo13bobo2bobo118b2o37bo3bo7b2o98b2o27bobo15b2o 147bo2bo3bo5b2obo5b2o60bo2bo11b2o16b2o127bo5b2o2b3o62bobo82b2o308bobob 3o2bo$34bo2b3o3bobo3b3o2bo29bo2b3o2b2obob3o2b2obob3o2b2obob3o2b2o56bo 4bo3bo4bo22b5o3b3o63bo32bo97b2obo2bobo2bob2o12bobo2bo2bobo15b4o18bob2o 4bo17b2o13bo2bo5bo9b3obobob2o17b2o12b2obo21bo3b3o2bob3obob2ob3o3b2o 336bo7bo32bo7bo32b2o3b2o3b2o3b2o92bo172b2o10b2o6bo5bo7b2o4b2o7bo5bo39b 2o5b2o30bo5bo20b2o5b2o9bo2bo3bobo63bo4b2o13b2o4bo139bo5bo11bob3obo7bob o126b2o168bob2o3b3o71b2o13b2o15b2o126bob2obobobob2obo63bo65b2o15bobo 309bobo2b2o$34bo3bo2bobobobo2bo3bo30b2o3bo4bo4bo4bo4bo4bo4bo2bo24b3o3b 3o18b3o2bo4bo3bo4bo2b3o16bo5bobo4bo60bobo28bo3b2o91bob2obob3o3b3obob2o bo9bo7bo9bobo2bo6bo2bobo7bo2bo2b2o5bo16bobo11bo4bo5bo5b3o4bobo13b4o5bo 11bobo2bo2bo13b2obobo2bobo13b2ob2ob2obo332bobo5bobo30bobo5bobo35bo2bob o2bo96bo124b2o45bo2bo8bo2bo2bo2bo34bo2bo102b2o5b2o9b2ob2ob2ob2o228b2o 3b2o7bo4b5o9bo258b2o44b2o45b2o2b2obo6b2obo25bo142bobo3bo3bo5bo62b2o64b 2o17bo310bo$31b2obobo3b2obobob2o3bobob2o28bob2ob2o3bob2ob2o3bob2ob2o3b obo2b2o58b3o7b3o21bobobo2bobo4bo90bob2o25b2o9b2o54b3ob3o13b3ob3o25bo3b o2b4o2bo3bo7bobo11bo2bo13b3o10b2o2b2o4b2o5bo2b5obo13bo6b2obo13b2obobo 3b2o9bobobob2o2bobobobo6bo12b3o122bo11bo192bo7bo32bo7bo37b2o3b2o222b2o 45b3o2b6o2b3o4bo36bo76b2o5b2o41bobo244b2o280bo91bo2bob2o6bob2o168bob5o bob5obo145b3o313b2o$31bob2ob2o6bo6b2ob2obo28bo2bobo2bobobo2bo2bobobo2b o2bobob2obo93bobo4bobo4bo58bo3b2o27bobob2o21bo2bob2o5bo18bo4b2o32bob2o bob3o3b3obob2obo9bo7bo9bobo2bo6bo2bobo8bo13bo16b2o14bo5bo9bo4bo15b2o2b o2bobo15bo7bo9bobobo3bobobob2o6b2obobob2o4b5o120bobo9bobo557b2o6b2o5bo bobo32bobobo69bo4b2o5b2o40b2ob2o224b2o18b2o266b2o12bo8b2o9bo69bo7b2o2b 2o4b2o15bo151bo5bobo5bo$87b2o4b2obo2bo3b2obo2bo3b2obo2bo2bo60b3o3b3o 24bo2b2o66bo5bo27b2o2b2o21b4obo2bo4b3o15b3obo2bo35b2obo2bobo2bob2o12bo bo2bo2bobo15bo2bo30bo13bobo11b2o3bo5bo9b4o18bobobo2b2o14bob6o11b2ob4o 2b2obo7bo2bob2obo4bob3obo120bo11bo557bo10bo3bobob2o32b2obobo69b2o70bo 209bo36b2o3b2o244b2o4bo7bo8b2o7bobo2bobo3bobo58b2o6bo3bo5bo15b2o152b3o 2bobo2b3o$97b2o8b2o8b2o2b2o58bo4bobo4bo31b3o60bobo28bo5bo20bobo2bo2bo 2b2o5bo17b2o2bo35bo5bobo5bo12b2o2b3o2b2o8bo6bo2bo6bo8b2o14bo2bo4b2o2bo bo13bo2b2o4b2o31bobobobo17bo24b2o3bo8bobo4bo2b3o5b3o688b2obo4bob2o3bob o38bobo50bo5bo11b2o72b2o208b3o33b2o3b2o241b2o5b2o8bo13b2o3b2obo3bo2b2o 68bo3bo5bo14bobo8bo144bo3bo3bo103b2obo4bob2o6b2obo$181bo4bobo4bo96b2o 6bo21bob3o4bob2o13b2o16bo14b2o5bob2ob2o31bo2b2ob2o2bo33bo16bo8b2o15bo 6bobo2bo13bo5b2obo13b2o19b2obobo18bob2o18bo2bo3b2o8b2o4bobo3bo3bo3bo 115b5o7b5o560b2o9b2o38b2o50b3o3b3o83b2o211bo273b2o5b3o5bo2b2o4bo14b2o 6bo7bo59b2o6b2o2b2o4b2o23bobo256bob2o4b2obo6bob2o24b3o$181bo4bobo4bo 104bo21bob2o5bob3o18b2o2bo4b3o15bob4obo2bobo33bo7bo19b3o11b2obo12bob2o 25bo6b4o14b2o4bob2o13b2o23bo18b2ob2o18b2o20b2obob3obob4o11b2o4b2obo46b 2o12b2o32bo4bo7bo4bo59bo402b2o4b2o2b2o4b2o181b2obo3bob2o299b2o30b3o20b 2o74b2o33b2o102b2o6b2o6b5ob2o23b2obobo63bo2b2obo6b2obo26b2o260b2o6b2o 2b2o11b2o17bo7b2o$284bo5b2o4b3o29bo5bo17b2o3bob3o19bo2b2o2bo2bo35b2ob 2o38b2o10b2o29bo2bo3b2o131bo3b3o16bo4bob2o42b2obo2bob2o4b2obo2bob2o27b o2bo13bo2bo56b3o403bo5bo3bo5bo20bo84b3o6b3o136b3o3b3o202b2o26bo30b3o 20b2o57b2o15bobo7b2o13b2o7bobo15b2o96b2o4bo21bo8bobo64bo3bob2o6bob2o 288bo8bo2bo12b2o15bobo7b2o$26b2o4b2o149b3o3b3o92bo11b2o17bo14b2o2b2o 12b3obo3bo2b2ob2o13b5obobo2bobo35b2obob2o20b3o11bo18bo27bo2bo137bobobo b2obo10bo3b2o18b2o26b2o2bo4bo4bo4bo2b2o24bo2bob2o13b2obo2bo52bo8bo2b2o 392bo5bo3bo5bo6b2o12b3o12b2o38b2o28bo3b2o2b2o3bo90bo43bo9bo201b2o23b3o 32bo80b2o17bo7b2o13b2o7bo17b2o96b2o25bobo11bo62b2o6b2o2b2o4b2o287bo6bo 4bo28b2o$25bo2bo3b2o27b2o34bo7bo7bo168b3o7b2o2b2o2b3o10b2o3bo4b3obo2bo bob2o16bobo8bo12bobo4bob2obob2o36b3o23bo12b2o16b2o28bobo136b2o2bo2bob 2o10b2o2bo19bobo30bo12bo28bobobo5bo7bo5bobobo42b2o7b2o6bobo2bo54b2o3b 2o331b2o4b2o2b2o4b2o5b2o11bo3bo11b2o38b2o14b2o12bo12bo66bo3bo17bobo43b o3bobo3bo17b2o207bo132b3o31b3o140bo2bo8bo72bo3bo5bo287b2o6b2o2b2o382bo $25bo2bo24b2ob2o4bo3bo30bobo5bobo5bobo166b2o6bob2o4b3o15b2obo9bob2o15b o6b2o5bo13bo2b2o4bo2b2o2bo35b3o23bo11b2o18b2o28bo138bobo2bo19bo13bo4bo b2o30bobo6bobo30bo2bo4bobo5bobo4bo2bo13b2obo6bob2o17bo15bobobo55bobobo bo333bob2o6bob2o20b2ob2o67b2o12b2o10b2o66bo3bo18b2o44b3o3b3o18bobo266b o236bo13bo2bo72b2o7bo3bo5bo282b2obo6b2o6b2obo376b3o$22b2ob4ob6o17b2obo bo3bob3o10b2o2b2o12bo7bo7bo170b2o2b3obobo5b3o12b2obobo2bob3o4bo3b2o11b o10bo18b2obobob2o4bobo73b3o16b3o23b2o142bo2b2o15b2o2b2o12b2o5bo39bo37b 2o2bo2bo5bo2bo2b2o16bob2o6b2obo17bobo12b2obob2o39b2o2bo12bobo12bo2b2o 318b2obo6b2obo108bo2bo2bo2bo138bo5bo21bo88b2o13b2o20b2o13b2o61bo25b2o 34bo238bo89bo6b2o2b2o4b2o282bob2o7bo6bob2o375bo$22bobo4bo6bo19bo6bo12b obo2b2o13b5o3b5o3b5o167b3o26b2o2b2o14bo13b2ob2o2bo3bob3o15bobo2bo3b5o 36b3o80b2o141b2o20bo4b2obo7bo2bo43bobo41b2o7b2o25b2o2b2o22b2o10bo3b2o 3bo38bo2bobo10b2ob2o10bobo2bo125bo7bo188b2o8b2o106b3o4b3o95b2o69b2o86b 3o13b3o18b3o13b3o61b2o23b2o34bo89b2ob2o142b3o12bo2bo72bo3b2obo6b2obo 282b2o10bo5b2o4b2o311b2o60b2o$24bo2bo2bo2bo2bo19bob2o5b4o7bo18bo7bo7bo 172b3o6bo20bo5bo28b3obo3b2o18bo2bob3o44bo245bo5bob2o7b3o41bo5bo44b2o 30bo4bo26b3o8b2o2b2obo38bobobo25bobobo125bobo5bobo188bo9bo211bobo155bo b2o13b2obo16bob2o13b2obo47b2o10b2o134b3o13b2ob2o13b3o116b2o23b2o74b2o 2bob2o6bob2o31bo250bo11b2o4bo5bo52bo21b2o237bo$24b3ob2o2b3ob2o15b2obo 7b2o2bo5b2ob6o14bobo5bobo5bobo176bobo20b3obo5b2obo18b3o4bo2b2o18bobo2b ob4obo39bo82bo162b2o2b2o4b2o48bo5bo45bobo30bo2bo18b2o7bobo4bo3bobo2bob o37b2obob2o23b2obob2o125bo7bo188bo9bo214bo154bobo17bobo14bobo17bobo46b 2o50bo78b2o17bo31bo17b2o101bo134bo10b5o249bo8b2o7bo5bo52b2o9b2o7bobo 15b2o220bobo$22b2o2b2o2b3ob2o2bo14bo2b3o4bo3bo5bo3bo4bo12bo3bo3bo3bo3b o3bo200b2obo4b3obo17bo16b2o11b2ob2obo5b2o121bobo165bo5bo16b3o31bobo43b o2bo2bo30b2o2b2o16bo2bo6b3o8b2o2b3o37bo3b2o3bo19bo3b2o3bo49bo28bo7bo 234b2o8b2o18b2ob2o57bo132b2o153bo2bo15bo2bo14bo2bo15bo2bo99b2o15b2o3b 2o54b2o15bobo31bobo15b2o88b2o12bo122b2o8b2o9b2obo2bo247b2o9bo6b2o4b2o 51b2o10b2o7bo17b2o221b2o8b2o$21bo3bo3bo3bo3bobo14b2o7bo9bo3bobobo9bo5b o3bo3bo3bo3bo3bobobo168bo3b2o27bo5bo16bo5b2o2bo2bo2bobo17bo2b2o119b2o 2bo2bo161b2o3bo5bo14bo2bo32bo43bo33b2obo6bob2o7bo2bo2bobo14bo3b2o40bob 2o2b2o8b3o3b3o8b2o2b2obo47bobo26bobo5bobo195b2o7b2o44b2o11bo3bo11b2o 29b2o12b3o267b2ob2obo13b2o4b3o3b3o4b2o16b2o4b3o3b3o4b2o47bo15bobo33b2o 19bo9b2o63b2o33b2o105b2o4bo7bo122b2o7b2o9bo7bo248b2obo4bo9b2obo74b3o 84b2o48b2o11bo15bo84b2o$16b2o2bobo3bo3bo3bo3bobo15bo2bobo3bobobobo3bo 3bo9bobob2o3bo3bo3bo3bo3bo5bo168bo5bo26b2o2b2o19b3o4bo2bob4o19bo2bob3o 116b2obo166bo2b2o4b2o9bo5b2o29bobo6bobo34b2o10b3o21bob2o6b2obo7b5obob 2o15b2obob5o34bobo2bobo3bo4bobo3bobo4bo3bobo2bobo40bo7bo28bo7bo115b2o 78bo2bo5bo2bo43b2o12b3o12b2o29b2o11bo3bo39b2o224b2o2b2ob2o116bobo14bo 53bo5bo6bo2bo200b2o5b2o8bo132b2o2b2o5b2obo2bo249bob2o4b2o8bob2o162bo 48bo12b3o11b3o$16bo3b3ob3ob3ob3ob2o2b3o13bo34bo4bo3bo3bo3bo3bo3bobobob 2o166bobo29b2obobo22bo5b2obo2bo20b2o4bo120b2o163bo5b2obo9b2obo4bo29bo 12bo30bo6b2obo4b3o19b2o14b2o11b2o3bo14bobo2bo2bo35b3o2b2o8b3o3b3o8b2o 2b3o40bobo159bo72bo5bobobo5bobobo5bo19b2o8b2o20bo57b2ob2o10bo28bobo 231bo21bobo34bobo55bobo5b2o6b2o2bo27b3o21b2ob2o203b2o5b3o5bo2b2o4bo7b 2o7bo5bobo49bo70b5o434bobo21b2o21bobo15bo9bo$17b3o2b2ob3ob3ob3ob3o3bo 13b2o2bobobobo3bobobo7bo4b2obobobo3bo3bo3bo3bo3bo4bo171b2o31b2obo20b2o 9b2o313b2o4bob2o10bobo29b2o2bo4bo4bo4bo2b2o28bo3bo2bo4b3o19bo16bo7b3o 2b2o8b3o6bo2bo44b2o3bo19bo3b2o45bo152bob2ob2obo5b2o64b2o4b3obo7bob3o4b 2o18b2o8b2o94bo29bo171bob2o6b2obo21b2o15b2o19b2o7bobo7b2o16b2o7bobo7b 2o47bo5bobo6b2ob2o26bo3bo21bobo12bo191b2o6b2o6b5ob2o8bobo4bobo5b2o48bo 3bo70bo155b2o4b2o274b2o7b2o12b2o12bo8b2o15b2o9b2o83b3o24b2o$14b3o4bo3b o3bo3bo3bo3bobo37b3o7bo5bo3bo3bo3bo3bo3b2obobo199b2o3bo368b2o29b2obo2b ob2o4b2obo2bob2o28b3obo3bo6b3o17bo14bo7bobo2bobo3bo4bobo7b2o39b5obob2o 23b2obob5o185b2o5b2obobobo6bo64bob2o3b3o11b3o3b2obo121b3o29b2o170b2obo 6bob2o21b2o15b2o5b2o11bo2bo3bo2bobo2bo3bo2bo14bo2bo3bo2bobo2bo3bo2bo 52bobob2o3b2o28bo5bo21bo216b2o4bo16bo5b2o6bo53bo225bobo2bobo185b3o94bo bo26b2o94b2o26bo24b2o$13bo2bobo3bo3bo3bo3bo3bo2bobob2o12bobobo3bobobob o2b2o2bo9bobobo3bo3bo3bo3bo3bo5bo203bo406b2o12b2o29bo11bo5b3o16b2o14b 2o6bob2o2b2o8b3o48bo2bo2bobo25bobo2bo2bo122b3o3b3o54bo12bo8bo62b3o2bo 21bo2b3o134b2o186b2o8b2o49b2o11bobobo13bobobo14bobobo13bobobo53bobobo 33bo5bo21bo11b2o203b2o21b2o61bo4bo55b2o2b2o166b4o187bo17b2o77bo29b2o 94bo24b3o332b2o5b2o$13bo2bobob3ob3ob3ob3ob3o2bobob2o31bo2bo14bo3bo3bo 3bo3bo3bo69bo2bo439b2o146bo3bob3o8b3o18b2obo6bob2o9bo3b2o3bo10b2o49bo 2bo8bo7bo8bo2bo127bobo3bobo46bob2ob2obo20b2o64bobobo19bobobo136bo75b2o 5b2o104bo8bo43bo20bob3o2b2o3b2o2b3obo16bob3o2b2o3b2o2b3obo44b2obob2o5b o38bo10bobo22bo292b5o45b2o7b2o16b2o151bo2b2o2bo185bobo15b2o77b3o22b2o 2b2o95bobo357b2o5b2o$14b3o2bo2b2ob3ob3ob3obobo3bo15bo3bobobobo3bobo2b 2obo13bo3bo3bo3bo3bo3bo70bo2bo435b2o2bo148bo2bo3bo29bob2o6b2obo10b2obo b2o12bobo49b2o8bobo5bobo8b2o128b3o3b3o46b2obobobo88bobobo17bobobo109b 2ob2o24b3o7b2o63b2o5b2o62b2o5b2o32bo10bo42b2ob2o2b2o14b3o11b3o20b3o11b 3o46bo5bo3bo2bo35bo3bo9b2o242bo11b2o68b2o39b2o8b2o15b2o3b2o146bo2b2o2b o186b2o221b2o$17bobobo3bo3bo3bo3bobobobo11b2o22bob2o8bo5bo3bo3bo3bo3bo 3bobobo63b2o2b2o47bo2bo245b2o135bo2bobo148bob2o6bo51bobobo15bo60bo7bo 62b3o28b3o3b3o25bo31bo40bo4b3o15b2o66bo2b3o13b3o2bo57b2o38b2o11bo3bo 26bo7b2o134b2o5b2o32b2o8b2o14bo2bo17b2obo4bob2ob2o24bo33bo57bo3bo7bo 36b3o10bo117b2o125bo9bobo68bobo49bo20b2o148bo2bo18b2o4b2o$16bobobobo3b o3bo3bo3bobobo12bobobobobobo3bobobobobobo9bobob2o3bo3bo3bo3bo3bo5bo62b 3o4b3o45bo2bo180bo64b2o131b2obo2bo2b2o153b2o53bo2bobo6b2o7b2o130bobo 28bobo3bobo24bobo6b3o11b3o6bobo56b3o2bobo67b2obo15bob2o58b2o38b2o12b3o 214bob2o6b2obo14bo16bo3bo33bo2bo30bo2bo56b3o4bo3bo37bo32b2o3b2o90bo 124b3o11bo70bo242bobo2bobo$16bo3bobob3ob3ob3ob2o2bo2b3o6b2obo22b2o11bo 4bo3bo3bo3bo3bo3bobobob2o113b2o2b2o178bobo63b2o131bob2obobobo153bo55b 2o2bo8bo133b3o3b3o28b3o3b3o25bo7bobo11bobo7bo57bobo3bo69b2o17b2o114bo 12b2o201b2obo6bob2o15b2o15b3o34bo2bo30bo2bo67bo16bo53b2o3b2o88bobo209b 2o226b3o14b4o260b3o22b2o2b2o26b3o3b3o$13b2obobo2b3ob3ob3ob3ob3obobo2bo 6bob2o2bobo3bobobobo3bo12b2obobobo3bo3bo3bo3bo3bo4bo114b3o4b3o175bobob o63bo136b3o3bo147bo2bo66b3o134bobo17bo12b2o22bo21b3o11b3o56b2o7bobo4b 3o66bo19bo127bobo204b2o2b2o4b2o7bob2o6bo51bo33bo65bo2bo17b2o40bo11b5o 75bo13b2o149b2o287b3obo10bo2b2o2bo258bo29b2o24bo2bo3bo2bo$13b2obobo2bo 3bo3bo3bo3bo3bobo2bo6bo2bo34bo5bo3bo3bo3bo3bo3b2obobo59b3o6b3o226bo3b 3o60bobo124bo6b4obob3obob2o20b2o191bo136b3o7b3o6bobo10bobo12b3o6bobo 77bo9b3o2bo2bo15bo141b2o73bo205bo2bo5bo8bo2bo3bo45b3o11b3o16b3o11b3o 61bo17b2o19b2o33bobo75b2o164bo289bobobo9bo2b2o2bo258bobo26b2o25b2obo3b ob2o$16bobo3bo3bo3bo3bo3bo4b3o8bo2b2o2bobobobo3bobobo7bo6bobobo3bo3bo 3bo3bo3bo5bo60b2o10b2o222b2ob2o60b3obobo70b2o6b2o44bobo4bo3bo3bo3bobo 4b2o8b2o3bo2bo324b2o12bobo7bo11bo14bobo7bo78b3o7bobo3bobo152b2obo4bob 2o68b2o7bo130b2o5b2o56bo4bo5bo6bo3bob3o43bob3o2b2o3b2o2b3obo12bob3o2b 2o3b2o2b3obo57bobobo36b2o24b3o83b2o166b3o280b3o4bo2bo11bo2bo252b2o7b2o 12b2o12bo8b2o183bo2bo$16bo3b3ob3ob3ob3ob2o2b3o8b3o27b3o12bo3bo3bo3bo3b o3bo34bo2bo23bo2bo12bo2bo36b3o6b3o170bobo3bobo12b2o7b2o14b2o7b2o9b4obo 71b2o6b2o44bob3o3b3o5b3o2bo4bobo8bo3b2o325bobo12b3o18b2o5b2o7b3o89bo6b obo4bo83bo5b3o3b3o5bo49bo10bo78bo129b2o5b2o56b2o2b2o4b2o5bo11bo13b2o 24bobobo13bobobo10bobobo13bobobo55bobob2o27b2o19b2o5b2o4bo3bo5b3o75b2o 2b2o143b2o18bo288b2o20bobo244bobo21b2o21bobo181bo264bo5bo$17b3o2b2ob3o b3ob3ob3o3bo7bo7bobobo3bobobobo2b2o2bo14bo3bo3bo3bo3bo3bo35bo2bo23bo2b o12bo2bo35b2o10b2o169bo2b2o3bo12b3o5b3o14b3o5b3o13bo123bob2o4bo4bob3ob o4bob2obo2bo7bob2o2b4ob2o318bo42b2o39b3o11b3o42bobo96b2o4bobo3bobo4b2o 50b2o6b2o77b3o190bob2o6b2obo10b3obo3bo14b2o24bo2bo3bo2bobo2bo3bo2bo10b o2bo3bo2bobo2bo3bo2bo55bobo7bo4bo10bo7bo19bo6b2o3bo5bo52b2o14b3o38b2o 120b2o283b2o12bo5bo24bo247bo48bo179b2o264b3o3b3o$14b3o4bo3bo3bo3bo3bo 3bobo34bo2bo9bo5bo3bo3bo3bo3bo3bobobo28b2o2b2o21b2o18b2o31bo2bo12bo2bo 141b2o24b2o2bo3b2o7bo15bo8bo15bo126b2o6b2o3b2obo5b5o4b2obobob2o6b2obob obo3bobobo316b2o6b2o67bo7bobo11bobo7bo34b2o15b3o4bo73b2obo3b3o3b3o3bob 2o46b3o2b6o2b3o45b2o220b2obo6bob2o10bo3bo2bo42b2o7bobo7b2o12b2o7bobo7b 2o52bo4b2o6b3o3b3o9b2o5bobo6bobo6bobo11b2obob2o52b2o12bo3bo38bobo7b2o 310b2o24b2o56bo2bo11bo5bo25bo2bo242b2o48b2o175bo6b2obo257b2obo3bob2o$ 13bo2bobo3bo3bo3bo3bo3bo2bobob2o12bo3bobobobo3bobo2b2obo7bobob2o3bo3bo 3bo3bo3bo5bo27b3o4b3o17b3o20b3o29bo2bo12bo2bo46bo6bo6bo32bobo30b2ob4ob 2o2b2ob2o26b2o3bo4b2o2bobobob7obobobobo2bobobobob7obobobo2b2o79bo6bo 33bobo9b2obob2o5b3o12bo6bobobobo2b2obobobo32b2o6b2o282bobo65bobo6b3o 11b3o6bobo56bobobob2o66bo2b3o13b3o2bo45bo2bo8bo2bo45b2o241bo6b2obo51bo bo30bobo62bo11bob2o5bo7b2o7b2o5bo2bo6b2o84bo4bo40bo7b2o99bo210b2o24b2o 55bobobo11bo5bo20bo4bobobo471bo3bo2bo$13bo2bobob3ob3ob3ob3ob3o2bobob2o 8b2o22bob2o8bo4bo3bo3bo3bo3bo3bobobob2o105b2o18b2o37b2o6b2o5b2o5b2o5b 2obo3bo4b2obo4bo3bo2bo31bo2bo2bo2bo2bo2bo27bo2bobo3bo2bo9bobo9bo2bo9bo bo9bo2bo72b2o2b2ob2o2b2ob2o2b2o21b2obo2bo6b5obo16bob2ob2ob2o13bobo2bob ob2o30bo2bo4bo2bo75b2o13b2o190b2o3b3o31b2o3b3o21bo31bo34b2o20bob2ob2ob o65bobobo17bobobo45b2o10b2o292b2o153b3o12b3o4b2o22b2o14bo80bo3bo12b2o 2b2o21b3o107bobo217b2o73bo2bo39bo5bo2bo433b2o36b3obo3bo$14b3o2bo2b2ob 3ob3ob3obobo3bo11bobobobobobo3bobobobobobo8b2obobobo3bo3bo3bo3bo3bo4bo 106b3o20bobo39bobob2obobob2obobob2obo6bo3b2o6bo3b2o4bobob2o27b2ob2o2b 2ob4ob2o25bobo8bo2bobo5b3ob3o5bo2b2o2bo5b3ob3o5bobo2bo72b2o4bo6bo4b2o 20bob2obob2o4bo5bob2ob2obo12b2o3b3ob2obob3obo2b3o3bo33bobo6bobo71b2obo 2bob2o5b2obo2bob2o191bobo7bo23b2o3bobo7bo25b3o3b3o46bo8bo12bo72bobobo 19bobobo352bo47b2o4b3o3b3o4b2o12b2o4b3o3b3o4b2o66b2o27b2o3bo10b2o97b2o 124b2o10b2obo8bobo204bo2bo71bo18b3o22bo6b2o423b2o9b2o33bo11bo258bo3bo$ 17bobobo3bo3bo3bo3bobobobo8b2obo22b2o11bo5bo3bo3bo3bo3bo3b2obobo25b3o 4b3o17b3o20b3o52bo30b2obo2bobo4bobo4bobo4bobobobo4b4obobo4bob4ob2obo 13b2ob4ob2o2b2ob2o42b2o5b3o7b2o2b2o5b2o2b2o8b2o2b2o5b2o2b2o7bo2bo107bo 4bo8b4o5b2o10bo3bobo2b2obob2ob2o4bobo4bobo31b2o2b3o2b3o2b2o30b2o37b2o 2bo4bo5bo4bo2b2o191b3o6bobo27b3o6bobo24bobo3bobo47bo6bobobob2o5b2o70b 3o2bo21bo2b3o107b2o242bo2bo42bo2bo15bo2bo10bo2bo15bo2bo96b2o7bobo3b2o 17bo62bo3bo12b2o123b2o10b2ob2o6bo2bo205b2o73bobo3bo391b2obo6bob2o6b2ob o49b4o4b2o41bo3bob3o261bo3bo$16bobobobo3bo3bo3bo3bobobo10bob2o2bobo3bo bobobo3bo14bobobo3bo3bo3bo3bo3bo5bo29b2o2b2o21b2o18b2o53b2o28bo2bob4o 27b2o5bo4b2o4bo7bobo11bo2bo2bo2bo2bo2bo47b2obo12b2o2b3o2b2o14b2o2b3o2b 2o13bo105b2ob4obob2o4bobo3bo2bobo3bob3obo3bobo2bo3bobo4b2obob4ob2o31bo 6bo2bo6bo25b2obo2bob2o38bo13bo206bo38bo25b3o3b3o46b2o5bob2ob2obo78bob 2o3b3o11b3o3b2obo103b2obo4bob2o283bobo17bobo10bobo17bobo97bo2bo4bo23bo 63bo4bo12bo135b2obo6b2o10b2o201bo75bo32b3o3b3o350bob2o6b2obo6bob2o49b 3ob2o2b2o42bo2bo3bo$16bo3bobob3ob3ob3ob2o2bo2b3o7bo2bo39bo3bo3bo3bo3bo 3bo34bo2bo23bo2bo12bo2bo28b3o53b2obo58b2o11b2ob2o2b2ob4ob2o46bobo59bo 4bo103bobo4bobo4b2ob2obob2o2bobo3bo10b2o5b4o8bo4bo33bob2o10b2obo25b2o 2bo4bo39bobo7bobo57b2o3b2o270bo87b2o4b3obo7bob3o4b2o104bo10bo284bob2o 13b2obo12bob2o13b2obo99bobo4b2o14b2o6b3o48b2o12bo3bo38b3o107bobo5b2o3b o8b2o200b3o61b2ob2o8bo389b2o4b2o2b2o8b2o58bo9b3o34bob2o6bo$13b2obobo2b 3ob3ob3ob3ob3obobo2bo7bo2b2o2bobobobo3bobobo19bo3bo3bo3bo3bo3bo35bo2bo 23bo2bo12bo2bo27b2o58bo71b2o61bo61b2o2bobo65b2o4bo6bo4b2o17bo3b3o2bob 3obob2ob3o3b2o12bob2ob2obo5bo4b2obob2obo34bobo10bobo31bo113bobobobo 131b2o37b2o97b2o88bo5bobobo5bobobo5bo106b2o6b2o28b2o256b3o13b3o14b3o 13b3o47b5o72bo12bo44b2o14b3o40bo7b2o99bo8b2o5b2o110b2o24b2o66b5o60bo 49bo352bo5bo4bo8bo70b2o40b2o$13b2obobo2bo3bo3bo3bo3bo3bobo2bo4b3o37bo 5bo3bo3bo3bo3bo3bobobo59b2o10b2o27bo2bo59b2o132b2o66bob2o63b2o2b2ob2o 2b2ob2o2b2o14b2obobo2bobo13b2ob2ob2obo16bob5o6bo2bob2o37b2o3b2o3b2o34b obo4b3o30b2o4b2o3b2o4b2o42b2o12bobo12b2o120bo38bo194bo2bo5bo2bo110b3o 2b6o2b3o25bobo119bo7bo128b2o13b2o16b2o13b2o47bob3obo8bo59b3o12b3o100bo bo7b2o109bo2bo4bo109b2o24b2o41b2o89b2o2bo3b3o3b3o7bo24bo353bo5bo2bo10b o38b2o26b2o42bo$16bobo3bo3bo3bo3bo3bo4b3o5bo7bobobo3bobobobo2b2o11bobo b2o3bo3bo3bo3bo3bo5bo61b3o6b3o28bo2bo334bo6bo21bobobob2o2bobobobo6bo 12b3o5b2obob2o9bobo47bobo46b3obo28b2o4b2o3b2o4b2o41bo2bo10b2ob2o10bo2b o116b3o36b3o196b2o7b2o111bo2bo8bo2bo27bo354bo3bo7bobo12b2o3b2o12bo27bo 13b5o99b2o120bobo87b2o2b2o4b2o2b2o4b2o13b2o58bo2b2o88b3o20bo8bo15bo 315b2o9b2o24b2o4b2o2b2o8b2o38b2o26b3o37bo2bo263bo$16bo3b3ob3ob3ob3ob2o 2b3o35bo12bo4bo3bo3bo3bo3bo3bobobob2o97b2o366bobobo3bobobob2o6b2obobob 2o4b5o5bob2o3b2o6b2o48b2o43b2o3bobobo27b2o15b2o36bo2bo2bobo25bobo2bo2b o111bo38bo321b2o10b2o28b2o116b3o7b3o225b3o5bo3b2o8b2o3b5o14b2o38b2o3b 2o75bo235bo3bo5bo3bo5bo12bo2bo59b4o87b3o8bo11bo8bo137b2o7b2o183b2o9b2o 26b2obo6bob2o6b2obo63bobo302bobo$17b3o2b2ob3ob3ob3ob3o3bo11bo3bo3bobob obo3bobo2bo9b2obobobo3bo3bo3bo3bo3bo4bo98bobo92bo13bo13bo144bo2bo99b2o b4o2b2obo7bo2bob2obo4bob3obo4bo4b2obo52b2o8b2o37b2o4bo2bo28bo4b2o3b2o 4bo37b5obob2o23b2obob5o26b2o3b2o10b2o3b2o583b2ob2ob2ob2o227bo4b3o12b2o 4b2ob2o13b2o30bo88bobo234bo3bo5bo3bo5bo14b2o57bo5b2o20b5o60b2o2bo7bo 20bo138bo8bo222bob2o6b2obo6bob2o51b2o11b2o189bo111b2ob2o$19bobo3bo3bo 3bo3bobo2b2o9bobobo3bo9bo7b2o10bo5bo3bo3bo3bo3bo3b2obobo60b3o4b3o25bo 72bob2o2bob2o2bob2o6bobo11bobo11bobo4b2o137b2o70b2o6b2o28b2o3bo8bobo4b o2b3o5b3o3b3obo53bobo10bobo42b2o28bobo3b2o3b2o3bobo42b2o3bo19bo3b2o32b obobobo10bobobobo140bo7bo435b3o3b3o232bo17bo3b2ob2o47bo87b2o234b2o2b2o 4b2o2b2o4b2o74b3o3bo20b3o60bo12bo7b3o3b3o143bobo6bobo116bo15bo85b2o4b 2o8b2o2b2o4b2o49b2o201b2o8b2o101bo3bo$20bobo3bo3bo3bo3bo13bo4bo3bo5bo 3bo4b3o2bo8bobobo3bo3bo3bo3bo3bo5bo64b2o2b2o27b2o71b2obo2b2obo2b2obo7b o13bo13bo5bo210b2o6b2o26bo2bo3b2o8b2o4bobo3bo3bo3bo4bobo52bob2o10b2obo 34b2o34b2obo13bob2o37b3o2b2o8b3o3b3o8b2o2b3o13b2o2bo12bobo14bobo12bo2b 2o124bobo5bobo435bo5bo226b2o5b2o21b3o148b2o228bob2o6bob2o19b3o55b5o13b o8bo61b2ob2o25b3o3b3o7bo20b2ob2o102b2o7b2o116b3o11b3o85bo5bo10bo2bo5bo 80b2o157b2o11b3obo5bo2bo99b3ob3o$21bo2b2ob3o2b2o2b2o14b6ob2o5bo2b2o7bo b2o14bo3bo3bo3bo3bo3bo69bo2bo92bo28bo5bo7bo5bo7bo5bo3bo17b2o2b2o2b2o2b 2o2b2o2b2o206b2o20b2obob3obob4o6bo53bo6bo2bo6bo34b2o91bobo2bobo3bo4bob o3bobo4bo3bobo2bobo12bo2bobo10b2ob2o12b2ob2o10bobo2bo125bo7bo366b2o8b 3o14b2o275bo16b2o32bo28bo8b3o88bobo221b2o4b2obo6b2obo19bobo58bo12bobo 12b2o81bo20bo24bo232bo9bo89bo5bo8bo4bo5bo79b2o157b2o10b2o8b2ob3o99bo3b o$22b2ob3o2b2ob3o22bo7b4o5b2obo17bobo5bobo5bobo71bo2bo92b3o6b3o3b3o3b 3o3b11o3b11o3b12obo16b2o2b2o2b2o2b2o2b2o2b2o232bo3b3o65b2o2b3o2b3o2b2o 128bob2o2b2o8b3o3b3o8b2o2b2obo13bobobo42bobobo501b2o8bo3bo12b2o272b3o 16bobo33b2o23b3o9b3o90bo222bo8b2o8b2o17b3o66b2o4b2o11bo2bo80bo8bo11bo 10b3o6bo2b2o232b2o9b2o87b2o4b2o8b2o2b2o4b2o6bob2ob2o36b3o199b2o8b2obo 100bo3bo$23bo2bo2bo2bo2bo16b2o2bobo12bo6bo21bo7bo7bo168bo4bo3bobo3bobo 3bobo11bobo11bobo11bobo67b2o100b2o101bobobob2obo62bobo6bobo74b2o15b2o 38bo3b2o3bo19bo3b2o3bo13b2obob2o40b2obob2o510bo4bo285bo20bo32b2o129b2o 148b2o70bo10bo9bo18b2o66b2o18b2o81bo8bo32b3o335b2obo6bob2o6b2obo7b2ob 2o2b2o36b2o8b2o190bo10bo102bobo4b2o$23bo6bo4bobo14b2o2b2o10b3obo3bobob 2o13b5o3b5o3b5o168bo5bo3bobo3bobo3bobo2b2o3b2o2bobo2b2o3b2o2bobo2b2o3b 2o2bobob2o11b26o25bo2bo100b2o100b2o2bo2bob2o62bo2bo4bo2bo74b2o15b2o39b 2obob2o23b2obob2o13bo3b2o3bo36bo3b2o3bo510bo3bo621bo70b2o8bo9bo19b3o 93b2o82bo7b3o3b3o4bo5bo5b3o198b2o4b2o4b2obo6b2obo111bob2o6b2obo6bob2o 7bo41b2o7b4o4b2o301bo5b2o$24b6ob4ob2o30bo3bo4b2ob2o18bo7bo7bo167bo3bob o3bobo3bobo3bobo3bo3bo3bobo3bo3bo3bobo3bo3bo3bobob2o10bo2bo5bo5bo5bo5b o231bobo2bo67b2o6b2o134bobobo25bobobo13bob2o2b2o8b3o3b3o8b3o3b3o8b2o2b 2obo829b3o57bo232b2o11bobo5b2o71b2o8b2o18bobo93b2o12b2obo6b2obo6b2obo 32b3o32bo5bo4bo2b2o82bob2o112bo5bo4bob2o6bob2o149b2o33b3o6b3ob2o2b2o 186bo$31bo2bo37b2o22bobo5bobo5bobo173bo23bo3bo9bo3bo9bo3bo5bo12bob2obo 3bobo3bobo3bobo3bobo128bo101bo2b2o212bobobo25bobobo13bobo2bobo3bo4bobo 3bobo8bobo3bobo4bo3bobo2bobo509bo3bo7b3o279b2o3b2o19b3o26bo20bo9bo232b o13b2o5bo2bo59b2o38b3o50b2o55bob2o6bob2o6bob2o58bo8bo5bo9bo75b2o3bo2b 2o2b3o12b2o92bo5bo3b2o4b2o2b2o4b2o74bo3bo61b2o5b2o34bobo10bo105b2o4b2o 4b2obo6b2obo6b2obo4b2o4b2o36b2o$26b2o3bo2bo63bo7bo7bo170bo2bobo3bobo3b obo3bobo3bo3bo3bobo3bo3bo3bobo3bo3bo3bobob2o10bo2bo5bo5bo5bo5bo24b2obo 100bobo99b2o215b2obob2o23b2obob2o13b3o2b2o8b3o3b3o8b3o3b3o8b2o2b3o509b o4bo5b2obob2o133b2o34b2o106b2o3b2o18bo3bo20bo5b2o17b2o8bobo219bo9bobo 24bo9bobo47bo91b3o15b2o41b2o2b2o4b2o2b2o4b2o28bo5bo21bo20b2ob2o75b2o3b o6b2o13b2o92b2o4b2o2bo5bo3bo5bo75bo3bo61b2o42b2o117bo5bo4bob2o6bob2o6b ob2o5bo5bo23b2o10b2o13b2o30b2o$26b2o4b2o251b2obobo3bobo3bobo3bobo2b2o 3b2o2bobo2b2o3b2o2bobo2b2o3b2o2bobob2o11b26o27bobo2b2o90b2o2bo2bo315bo 3b2o3bo19bo3b2o3bo16b2o3bo36bo3b2o503b2o8bo3bo5bo5b2o132bobo34bobo129b o5bo17b3o4b2o18bobo6b2ob2o217bobo8b2o25bo7bo3bo46bo9b2o8b2o23b2o40b2o 2bo2bobo10b2o2b2o2b2o37bo3bo5bo3bo5bo29bo5bo21bo10b3o92b2o3b3o110bob2o 5bo5bo3bo5bo148bo153bo5bo3b2o4b2o2b2o4b2o2b2o4b2o2bo5bo24b2o11b3obo9b 2o30b2o$288bobo3bobo3bobo3bobo11bobo11bobo11bobo68bo4bo90b2obo318bob2o 2b2o8b3o3b3o8b2o2b2obo9b5obob2o40b2obob5o497b2o8b3o8b2obob2o132bo38bo 107b3o3b3o14bo3bo9b3o5bo35bo5bo89b2o115b2o7bob2o35bo7bo50b2o8b2o8b2o 22bo2bo39b2o2b2o2b2o10b2o2bo2bobo38bo3bo5bo3bo5bo28bo5bo129bo3bo111b2o bo4b2o4b2o2b2o4b2o10bo5bo123b2o2b2ob2o153b2o4b2o2bo5bo3bo5bo3bo5bo3b2o 4b2o6b2o29b2o$288bo2b3o3b3o3b3o3b11o3b11o3b12obo16b2o2b2o2b2o2b2o2b2o 2b2o31bo98b2o316bobo2bobo3bo4bobo3bobo4bo3bobo2bobo9bo2bo2bobo42bobo2b o2bo520b3o132b2ob4o30b4ob2o105b3o5bo15b3o12bo5b2o37bo92bobo113bobo6b2o b2o23b2o6bo2bo7bo4bo8b2o81b2o44b2o20b3o38b2o2b2o4b2o2b2o4b2o14b2o57b3o 102bo5bo99b2o2bo5bo3bo5bo10b3o3b3o53b2obo3bob2o59b2ob2obo156bob2o5bo5b o3bo5bo3bo5bo4bob2o8b2o30bo$58bob2o4bob2o4bob2o209b2o22bo5bo7bo5bo7bo 5bo3bo17b2o2b2o2b2o2b2o2b2o2b2o31bo2bo3b2o6b2o6b2o30b2o6b2o257bo15bo 79b3o2b2o8b3o3b3o8b2o2b3o15bo2bo8bo7bo8bo7bo8bo2bo578b2o79bobobo2bo30b o2bobobo105bo5bo30bo19bo22b2o3b2o91bo112bo6b3obob2o23b2o6b2o10bo12b2o 63b2o24b2o58b2o35b2obo4bo5bo3bo5bo14bo2bo13b3o38bob3o88bo3bo9bo5bo100b o3bo5bo3bo5bo8b2obo3bob2o53b3o3b3o223b2obo4b2o4b2o2b2o4b2o2b2o4b2o4b2o bo$58b2obo4b2obo4b2obo213b2obo2b2obo2b2obo7bo13bo13bo5bo76bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo2bobo2bob2obo2bob2obo2bo228b2o 13b2o83b2o3bo19bo3b2o20b2o8bobo5bobo6bobo5bobo8b2o127b2o3b2o414b4o27b 2o79bobo7b2o22b2o7bobo163b2o118b2o102b2o7bo2bo2bo2bo2bobo9b2o32bo3bo 73b2o24b2o95bob2o5bo5bo3bo5bo12bobobo53bobobo87b2o3b3o114bo3b2o4b2o2b 2o4b2o73bo5bo228b2o2bo5bo5b2obo6b2obo10b2o$291bob2o2bob2o2bob2o6bobo 11bobo11bobo4b2o75bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4b o2bo4bo2bo4bo2bob2o184bo15bo24b2o13b2o77b5obob2o23b2obob5o25bo7bo8bo7b o137bo2bobo2bo412bo3bo106b2o2bo7b2o5b2o8b2o5b2o7bo2b2o144b3o13b2o223b 2o7bo6b2o4bo10b2o12bo10bobo8bobo173b2o19b2o8b2o4b2o2b2o4b2o11b3obo38b 3o13bo2bo83b2o3bo6b2o3b2o11b2o95b2o2bo5bo3bo5bo310bo3bo5bo4bob2o6bob2o 11bo46bo2bo$58b3o5b3o5b3o30bobo204bo13bo13bo82bo4bo2bo4bo2bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo2bobo2bob2obo2bob2obo2bo187b2o13b2o25bo13bo 78bo2bo2bobo25bobo2bo2bo184b2o3b2o3b2o3b2o412bo14bobo88bo4b2o13bo10bo 13b2o4bo133b2o8b3o35b3o210bobo33bobo9b2o185bobo18bo9bo5bo3bo5bo12b3o 57b2o84b2o3bo2b2o2b3o117bo5bo3bo5bo11bo3bo292bo3b2o4b2o2b2o4b2o8b2o8bo 25b4o22bo19b4o$57bo2bo4bo2bo4bo2bo28bo2bo2bo309b2o4b2o6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6bo209b2o13b2o28b2o5b2o86bo2bo10b2ob2o10bo2bo189bo15bo408b o2bo18bo87b5o13bobo10bobo13b5o115b2o16b2o7bo3bo33b2obo211b2o21bo11bo2b o9bo187bo19bo9bo5bo3bo5bo52bo5bo104bob2o11bo5bo103b2o4b2o2b2o4b2o11bo 3bo292b2o2bo5bo3bo5bo9bo9b2o23bo3bo18bo3bo18bo3bo58b2o$57bo7bo7bo29bo 2bobobo2bo71bo3bo230b4o95bo182bo13bo60bo15bo48b2o12bobo12b2o187b2obo 15bob2o389b3o35bo85b2o4bo13b2o12b2o13bo4b2o113b2o47bo15b2o235bobo11bo 2bo196b2o17b2o8b2o4b2o2b2o4b2o17b3o10bo21bo5bo119bo5bo46b2o51b2o4b2obo 6b2obo315bo5bo3bo5bo9bo37bo19b4o22bo59b2o$59bo7bo7bo25bo2bobobobobo2bo 69bo3bo229bo2bobo90b4obo184b2o5b2o30bo11bo20b2o13b2o60bobobobo198bobob 2o13b2obobo388bo2bo31bo2bo84bo2b2o23b2o23b2o2bo100b3o35b2o3b2o17b2o14b 2o224bobo6bo2bo232b2obo6b2obo6b2obo7b2ob2o20bo21bo5bo162b2o6b2ob2o14b 2o34b2o4bob2o6bob2o314b2o4b2o2b2o4b2o8b2o33bo2bo42bo2bo59bo24b2o$55b2o 6b2o6b2o29bobo2bo2bobobo2bo67bo3bo100b2o21b2o103bobo2b2o90b3obobo222bo 11bo20b2o13b2o60b2o3b2o198bobo5b3o3b3o5bobo388bo35b3o84b2obo7bo5bo8bo 4bo8bo5bo7bob2o100b3o17b2o39b2o16bobo223b2o5bo2bo12bo2bo103bo113bob2o 6bob2o6bob2o7bo9bo5bo8bo190b2o6bo2bo15b2o295b2o67b2o4b2obo6b2obo6b2obo 10b2o6b3o3b3o142bobo$22b2o2b2o18b2o11b2o6b2o6b2o23b3obo5b2o2bobo67b2o 3b2o94b2o2bobo21bobo2b2o97bobo100bobo180bo11bo29b2o7b2o22bo13bo264b2o 2bo5bobo3bobo5bo2b2o386bo18bo2bo103bo6b3o3b3o6bo6bo6b3o3b3o6bo102bo3bo 17bo57bo2b2o221bo22b2o105bo5bo139b2o2bo4bo5bo32b3o172bo2bo143b2o9b2o 156bobo66b2o4bob2o6bob2o6bob2o10b2o5bo2bo3bo2bo143bo$22bobo2bo18bo2b2o 3bo2bo4bo2bo4bo2bo4bo24bo10bob3o64bobo3bobo45bo47bo3bo4bobo2bo2bo2bo2b obo4bo3bo96b2o103bo181bo11bo17b3o29b3o13b2o5b2o200bo7bo20bo7bo28bo4b2o 4b3o3b3o4b2o4bo386bobo14bo107b2o4bobobobobobo4bo8bo4bobobobobobo4b2o 121b3o291bo2bo119bo5b3o138b3o5bo5bo4b3o3b3o195b2o145bo9bo159bo113b2obo 3bob2o69bo73b2o$26bo20bobo2bobo2bo4bo2bo4bo2bo4bo20b4o12bo64b5o5b5o42b o48b3ob5ob13ob5ob3o97b3o101b2o182b2o7b2o19b3o10b2o3b2o10b3o222bobo5bob o18bobo5bobo27b5o21b5o403bo3bo108b3ob2ob2ob3o3bo8bo3b3ob2ob2ob3o106b2o 3b2o13bo18b2o27bo233bo13b2o29bo10bo70b2o6b2o7bo137b3o28b3o10bo123b2o 197b3o11b3o103b2o51b2o169bo5bo5b2o8b2o15b2o$19b2o2bo5b2o15b2obo9b2o6b 2o6b2o3b2o34b4o117bo3bo46bo25bo45bo15bo40bobo100b2o170b3o29b3o12b2o5bo 7bo5b2o17bo11bo198bo7bo20bo7bo32bo21bo378b2o27b4o80bob2o6b2obo16bobobo bobobo4bo8bo4bobobobobobo146bobo27b2o73b2o156b2o42b2o9b2o69bobo9bo4b2o 136b2o2bo6b3o10bo20bo106b2o14b2ob2o19b3o29b2o142bo15bo103b2o186b2o19bo b2o11bo5bo5b2o7b2o16b2o$19bobo3bobo2bo19b2o3b2o6b2o6b2o9bob2o12b3o135b 2o3bo44b2o2b24o2b3o31bo3bo4bobo4bo3bo4bobo4bo3bo31b2o100b2o171b3o10b2o 3b2o10b3o15bo17bo19bo11bo262b4o27b4o372b2o111b2obo6bob2o17b3o3b3o6bo6b o6b3o3b3o147bo28b2o74b2obo15bo126bobo8bobo37bo4bobo7b2o4b2o2b2o60bobob 2o2bo4bo140bo24bo5bo5bo8bo106b2o15bo2bo20bo29bo2bo448b2o14b2o3bo2b2o2b 3o28b2o2b2o$23bo5bo23bo4bo2bo4bo2bo4bo2bobo2bobo16bo16b3o114bobo3bo43b obo5bo4bo4bo4bo4bo5bob2o27b5o4bobo4b5o4bobo4b5o265b2o44b2o5bo7bo5b2o 16bo3bo2bo11bo2bo3bo16b2o7b2o263bo2bo10b2o3b2o10bo2bo424b3o56b2o8b2o4b 2o16bo5bo8bo4bo8bo5bo122b3o6b3o123bo13bobo125bo3bo44bobo13b3o4b2o2b2o 61bobobo7bo140b2ob2o20bo5bo5bo29b2ob2o98bo2bo18b3o29bo2bo15b2o63b2o9b 2o357bo13b2o3bo6b2o3b2o11b2o$16b2o2bo5bo5b2o19bo4bo2bo4bo2bo4bo2bo3b2o 2bo11b4o16bo62b5o5b5o37b5o4b2o42bob2o5bo4bo4bo4bo3b2o4bob2o27bo3bo3b2o b2o3bo3bo3b2ob2o3bo3bo264bobo46bo17bo18bo5bo6bo6bo5bo4b3o29b3o708b2obo b2o8b3o8b2o34bo8bo5bo34b2o138bo3bo7bo55b5o55bo4bo11bo122b2o12bo10b2o 31bobo15b2o4b2o67bo5b3o173bo5bo4b3o3b3o7bo12bo99b2o51b2ob2o14b2o63b2o 9b2o376b2o3b3o$16bobo3bobo3bobo2bo21b2o6b2o6b2o11b2o32b4o28bo3bo20bo3b obo11bobo3bo41bobo38b2obo4b2o3bo4bo4bo4bo5b2obo26b2o2b2ob2o3bo3bo3b2ob 2o3bo3bo3b2ob2o2b2o212b2o46bo44bo3bo2bo11bo2bo3bo20bo4b2obo5bo11b3o10b 2o3b2o10b3o203b8o498b2o5bo5bo3bo8b2o33bo10bo5bo15bo7bo20bo7bo119bo5bo 5bo15bo33bo5bob3obo53bobo4bob2o5b3o4bo7b2o108b2o8bo4bo7bo2bo30bo2bo16b 2o70bo2bo26bo180bo7bo2b2o155b2o295b2o174bo3bo9bo5bo52bo$20bo5bo5bo13b 2o11b2o6b2o6b2o19b3o51bo3bo20bo3b2o13b2o3bo42b5o35b2obo5bo4bo4bo4bo4bo 5bobo25bobo3bobo4b5o4bobo4b5o4bobo3bobo211b2o44b2ob4o40bo5bo13bo5bo29b o21b2o5bo7bo5b2o208bob4obo40bo4b3o21b3o4bo67b2o4b2o346b2obob2o5bo4bo 43b2o8b2o4b2o14bobo5bobo10bo7bobo5bobo118b2obob2o56b2o4bo3bo63b2o4bo7b 2o6bobo121bo7bo35bobo17bo73bo26bo155b3o10bo11bo8b3o101b2o350bobo187bo 5bo15b2o2b2o31b2o$13b2o2bo5bo5bo5b2o9bo2b2o3bo2bo4bo2bo4bo2bo4bo20bo 20b3o27bo3bo20bo3bo15bo3bo86b3o2b24o2b2o26bo5bobo4bo3bo4bobo4bo3bo4bob o5bo206bo10bo38bo3bo2bo46bo13bo36bo22bo17bo81bo5b2o3b2o94b2o20b8o20b2o 17bobo3bobo3bo13bo3bobo3bobo66bobo2bobo27b2o319b3o7bo3bo46bob2o6b2obo 17bo7bo10bo2bo6bo7bo181b2o6b3o57bo12b2o3b5o3b2obobo117bo3bo7bo23bobo5b 2o3bobo86bo3bo26bo143bo24bo20b3o100bo2bo351bo173bo3bo21b2o7b2o16b2o17b obo$13bobo3bobo3bobo3bobo2bo10bobo2bobo2bo4bo2bo4bo2bo4bo16b4o20bo29b 2o3b2o18b2o3bo15bo3b2o31b5o53bo25bo27b2o6bo15bo15bo6b2o35bob2o165bobo 8bobo37bobobo99bo14bo4bo3bo2bo11bo2bo3bo75b3o5bobobobo94bo6b3o3b3o20b 3o3b3o6bo17bobo3b3o3bo13bo3b3o3bobo68bo2bo6b2o4b2o8b2o3bo2bo380b2obo6b ob2o20bo7bo7bo2bo9bo7bo187bo28b2obo6b2obo15b2o17b2ob2o3bobobo118bobo9b o23b2o5bobo5bo86bo3bo5bo19b2o143bo24bo7b3o3b3o3bo2b2o82b2o15bo2bo6b2o 158bo122b2o60b2o170b2o3b3o20b2o8b2o15b2o$17bo5bo5bo5bo10b2obo9b2o6b2o 6b2o3b2o37b5o24bobo3bobo16bobo3bo15bo3bobo25bo3bobo16bo35b3ob5ob13ob5o b3o109b2obo9bo11bo11bo11bo65b2o2b2o47bobo3bo2bo3bobo34b2ob3o91bo8bo4bo 9b2obobo5bo13bo5bo74bo10bobo12bo2b2o76b2obo6bobo3bobo20bobo3bobo6bob2o 15bo35bo68b2o2b2o6bo4bobo8bo3b2o331bo3bo50b2o2b2o4b2o17bobo5bobo8bo9bo bo5bobo121bo93bob2o6bob2o15b5o17bo6bo133bo2bo5b2o13bo5bo98bo4b2o17bo 146bo49bo81b2o14b2ob2o6b2o156bobo123bo227b2o3bo6b2o13b2o15bo$14bo5bo5b o5bo17b2o3b2o6b2o6b2o9bob2o8b5o46b5o5b5o10b5o25b5o22bo3b2o7b5o4bobo33b o3bo4bobo2bo2bo2bo2bobo4bo3bo120bobo9bobo9bobo9bobo65bo3bo7b2ob2o34bob o4bo2bo4bobo32bo2bo88bo5bo13bo5bobob2o9bo13bo71b2o7b2o8b2ob2o10bobo2bo 76bo2b2o5b3o3b3o20b3o3b3o5b2o2bo110bo8b3o2b3o5bob2obo2bo7bob2o2b4ob2o 92b2o230bo4bo50bo2bo5bo19bo7bo20bo7bo108b2o11b2o22b3o35bo5b2o23b2o4b2o 2b2o12b2o5b2ob2o22bo2bo134b2o5bobo17b2o95bo2bo5bo7b3o6bo4bo179bo8b2ob 2o98b2o46bo5bo114b2o120b3o228b2o3bo2b2o2b3o12b2o$13bo2bobo3bobo3bobo3b obo16bo4bo2bo4bo2bo4bo2bobo2bobo13bo20b4o104bo3bo11bobo3b2o34b2o2bobo 21bobo2b2o103b2o3b3o3b2o4bobo9bobo9bobo9bobo4b2o58bo3bo9bobobo34bo5bo 2bo5bo33bob2o11b2o40bo13bo20bo3bo2bo11bo2bo3bo4bo96bo32bobobo78b2o4bo 13b2o12b2o13bo4b2o16bo35bo11b2obo6bob2o32bobo9bo2bo6b2obobob2o6b2obobo bo3bobobo89bo4bo215b2o12bo3bo8b2o39bo4bo5bo36b2o126b2o34bo3bo35b2o3bo 24bo5bo3bo12bobo6bo28bo143bo6bobo107bo14bobo6bo9b2o132b3o3b3o32bo159bo 5bo11b2obo221bo236bob2o$13b2o5bo5bo5bo2b2o16bo4bo2bo4bo2bo4bo2bo3b2o2b o9b3o20bo107b2o3bo12b2o3b2o39b2o21b2o109bo4bo4bo4b2ob2o7b2ob2o7b2ob2o 7b2ob2o4bo58b2o2b2o8bo4bo80b2o3bo11bo35bo5bo13bo5bo18bo17bo105bobo29b 2obob2o79b5o13bobo10bobo13b5o17bobo3b3o3bo13bo3b3o3bobo10bob2o6b2obo 32bob3o16bo3bobo10bo3bo2b2obobobo88bo6bo214b2o14b3o8b2o39b2o2b2o4b2o 19bo5bo8bo4bo8bo5bo121bob2o19bo5bo33b2o5b3o22bo5bo3bo11bobob2o28bo3bo 143b2o6b2o105bobobo12b3o8b3o5bobo172bo3bobo166b3o2b2o2bo3b2o443bo$17bo 5bo5bo25b2o6b2o6b2o11b2o33b3o103bobo3bo13bo2b2o172bo4bo3bo4bo4bo4bobo 4bo4bobo4bo4bobo4bo4bo4bo66b2obo5bo78bo2b3o10bobo35bo3bo2bo11bo2bo3bo 16b2o5bo7bo5b2o104b2o27bo3b2o3bo78bo4b2o13bo10bo13b2o4bo17bobo3bobo3bo 13bo3bobo3bobo14b2o2b2o33bob2o4bo16b2obobo8bo3b4o6bob2o59b2o4b2o4bob2o 11bo8bo165bo5bo105bob2o6b2obo20b3o3b3o6bo6bo6b3o3b3o119bo2b2o19bo5bo 42bo21b2o4b2o2b2o12bobobo12b3o8bobo2bo3bo151bo50b2o13b3o37bobob2o28b2o bobo127b2o6bo22b3o18bo128b2o18b2o11b2o3b2o6bo3b2o88b2o48b2o302b2o58b2o $16bo2bobo3bobo3bobo12b2o11b2o6b2o6b2o19b4o45b5o5b5o10b5o25b5o17b5o18b o2bo3bo169b2o3b5o3b5o3b4ob4o3b4ob4o3b4ob4o3b5o3b3o53b2o2b2o5b2obo6bo 32b3o8b3o31b2obo6b3o3b2o40bo17bo15b3o10b2o3b2o10b3o11bo13bo60bo7bo8b3o 8b3o3b3o8b2o2b2obo78b2o2bo7b2o5b2o8b2o5b2o7bo2b2o19bo4b3o21b3o4bo15bo 4bo25b2o6b2o3b2obo15bo4bo3bob2obob2obo2bob3o2bo63bo5bo4b2obo11bo8bo 164b3o3b3o104b2obo6bob2o19bobobobobobo4bo8bo4bobobobobobo118b4o23bo69b 2obo6b2obo10bo14bobo8bo2bo5bo200bo4bo10b3o38bobo5b3o23bobobo127bo2bo5b o39bo2bo129b2o37b3o3b2o94bo48bo303bobo17bo38bo$16b2o5bo5bo2b2o12bo2b2o 3bo2bo4bo2bo4bo2bo4bo21bo16b4o27bobo3bobo16bobo3bo15bo3bobo43bo3b4o 124bo47b2o5b2o5bobobo7bobobo7bobobo7bobobo5b2o3bo53bo3bo8bobo5bo27b2o 18b2o30bo5bo3bo8bo33b2o5bo7bo5b2o12b3o29b3o4bo5bo13bo5bo40b2o2bo8bobo 5bobo7bobo8bobo3bobo4bo3bobo2bobo80bobo7b2o22b2o7bobo74bo2bo25bobo9b2o bob2o15bob2obo2bo4b2o4bobo4bobo62bo5bo3b2o15bo8bo163b2ob2ob2ob2o135b3o b2ob2ob3o3bo8bo3b3ob2ob2ob3o142bo3bo39bo27bob2o6bob2o9bo2bo3bobo6b3o8b obo3bo2bo206bo51b2o9bo23bo129bobobo4bo20bo5bo11bobobo153bo5bo9bo3bo96b obo21b2o21bobo272b2o5b2o41b2o25b2o10bo2b2o$20bo5bo20bobo2bobo2bo4bo2bo 4bo2bo4bo18b3o16bo32b2o3b2o18b2o3bo15bo3b2o13b2o157b5o44b3o2b5o2b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2b3obob2o48bo3bo9bob2o3b2o27b2o18b2o27b 3o5bo5bo5b3o28b3o10b2o3b2o10b3o19b2o7b2o16bo3bo2bo11bo2bo3bo40bo2bobo 8bo7bo8b3o8b3o3b3o8b2o2b3o81bobobo2bo30bo2bobobo73b2o2b2o18b2obo2bo6b 5obo20bob2ob3o10b2ob4ob2o63b2o4b2o3bo16bo6bo163b3o7b3o129b2o4bobobobob obo4bo8bo4bobobobobobo4b2o138b3o41b2o29b2o2b2o4b2o7bo5bo2bo25bo201bo5b o57bo4bo16bo5bo2bo128bo2bo25bo5bo11bo2bo154bo5bo111b2o8bo12b2o12b2o7b 2o273b2o5b2o40b3obo9b2o12b2o10bo2bo18bo$19bo2bobo3bobo15b2obo9b2o6b2o 6b2o3b2o35b3o30bo3bo20bo3bo15bo3bo14b2o35b2o119bo2bo8bo33b2obo4bo5bo4b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo4bo4bobo49b2o2b2o9bo38b3o8b3o31bo8bo 3bo5bo30b3o29b3o17bo11bo19bo17bo45bobobo50bo3b2o86b2ob4o30b4ob2o23bo2b o10b2o3b2o10bo2bo12b2obo6bob2o13bob2obob2o4bo5bob2ob2obo4b2o6bo4b2o2b 2ob2o3bo3bo4bo67bob2o4bo18bo4bo306bo6b3o3b3o6bo6bo6b3o3b3o6bo111b2o3b 2o21bo41b2o30bo3bo5bo8bo3bo2bobo23bobobo140b6ob2o51b6o61bo17b2o4bo135b o24bo5bo12b2o171bo3bo70b2obo3bob2o25b2o26bobo310b2o17b2o13b2o24bobo11b 2o4bo2bo$19b2o5bo2b2o19b2o3b2o6b2o6b2o9bob2o12b4o48bo3bo20bo3b2o13b2o 3bo22b5o24b2o32bo57bo28bo2bob2o5bobo32bobo5bo3bo5bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo5bo2b2obo65b7o81b2o3b3o6bob2o39b2o7b2o29bo11bo17b2o5bo 7bo5b2o42b2obob2o51b2obob5o82bo38bo25b4o27b4o12bob2o6b2obo13bo4bo8b4o 5b2o6bo2bo6b2ob4o5bo4b2obob2obo67b2obo4b2o19b2o168bo7bo128b2obo7bo5bo 8bo4bo8bo5bo7bob2o111bo99bo3bo5bo7bo3bo28b2obobo139b6ob2o66b3o46b2o19b o5bo3bo128bobo20b2o194b3o3b2o68bo2bo3bo2bo24b2o29bo312bo17b2o39b2o12b 2o3b5o10b2o$23bo29bo4bo2bo4bo2bo4bo2bobo2bobo17bo12b4o31bo3bo20bo3bobo 11bobo3bo14b4o3bobo61b3o43b2o8b3o28b3o8bobo33bobo4b2o3b2o4bobo3bobo3bo bo3bobo3bobo3bobo3bobo3bobo4b2o5bob2o46b2o2b2o16bo80bobo10b3o2bo38bo 11bo53b3o10b2o3b2o10b3o36bo3b2o3bo50bobo2bo2bo82bobo34bobo31bo21bo22b 2o8b2o9b2ob4obob2o4bobo3bo2bobo3bo2b2o6bo3bo3b5o6bo2bob2o72b2o4bob2o7b 2o16b2o295bo2b2o23b2o23b2o2bo108bo5bo95b2o2b2o4b2o7bo28bo6bobo146b2o 67b3o45bo26bo3bo135bo2bo11bo2bo4b3o170b2o13b2o6bo3b2o64b3o3b3o26b2o2b 2o22b3o124b4o169b2o10b2o2bo17bo52bo5b3ob2o9b2o$22bo2bobo25bo4bo2bo4bo 2bo4bo2bo3b2o2bo13b3obo10bo65b5o5b5o19bo3bo2b2o65bob2o5b2ob2o5b2ob2o5b 2ob2o5b2obobo4b2obo31bo4b2o6bo30b2obo4b2o7b2o4bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo4b2o7bobo48bo3bo12b2o33bo5bo2bo5bo34bo11bo3b2o39bo11bo30b2o5b 2o13b3o29b3o34bob2o2b2o8b3o3b3o8b3o8bo7bo8bo2bo88b2o34b2o28b5o21b5o18b o10bo8bobo4bobo4b2ob2obob2o2bobo3bo11b2obob2o9bobo79bo4b2obo8bo7b2o7bo 297b2o4bo13b2o12b2o13bo4b2o110b2ob2o21b2o69b2obo6b2obo9bo2bo22b2ob2o5b 2o140b2o5b2o115bo26bo137bo2b2o2bo9bobobo162bo13b2o12b3o2b2o2bo3b2o250b 2obo4bo168b2o11bo2bo57b2o18b2obo$22b2o2b2o27b2o6b2o6b2o11b2o15bobo2b2o 5bob3o99b2o2bo61b4obobo7bobo7bobo7bobo7bobo7bobob4o25b2obobo3bobo33b2o b2o18bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo12b2o2bo46bo3bo13b2o32bobo4bo2bo 4bobo32b2o11b2obo81bo13bo22b2o7b2o46bobo2bobo3bo4bobo3bobo8bobo7bobo5b obo8b2o155bo4b2o4b3o3b3o4b2o4bo19bo8bo9bo3b3o2bob3obob2ob3o3b2o17bob2o 3b2o6b2o79bo9b2o6bobo3bo4bo3bobo299b5o13bobo10bobo13b5o113bobo22b2o47b 2o20bob2o6bob2o10bo6bo17b5o147b2o5b2o115bo26bo2bo134bo2b2o2bo10bob3o 159bobo32b2obo255bo3bo4bo182bobo17bo38bobo19b2o$59b2o6b2o6b2o23bo2bobo bo2bo2bobo100b2o3bo60bo5bobo7bobo7bobo7bobobo5bob2o6bobo5bo27bobo3bo2b o3bobo50b3o3b3o3b3o3b3o3b3o3b3o3b3o16b2o46b2o2b2o47bobo3bo2bo3bobo46bo 2bo43b2o5b2o28b2o13b2o20bo11bo46b3o2b2o8b3o3b3o8b3o8bo7bo167b2o2bo5bob o3bobo5bo2b2o19b2o8b2o5b2obobo2bobo13b2ob2ob2obo14bo4b2obo87b2o9bo7b2o 2bo6bo2b2o300bo4b2o13bo10bo13b2o4bo114bo72bobo41bobobo3b2ob2o17b2o147b 2o5b2o6bo128b3o5bo138b4o14b3o160b2o291bo4b2o185b2o17b2o26b2o10bo2bo$ 56bo7bo7bo29bo2bobobobobo2bo99b2o3bo60b2obo5b3ob3o3b3ob3o3b3ob3o2bobo 2b3o4bo2b3o5bob2o34bobo3bobob2o52bobobo7bobobo7bobobo123bobo8bobo44b3o b2o41bo13bo25b2o13b2o20bo11bo50b2o3bo27b2o182bobo5b3o3b3o5bobo17b2obo 6bob2o8bobobob2o2bobobobo6bo14b2o8b3obo100bo11bo8bo304b2o2bo7b2o5b2o8b 2o5b2o7bo2b2o115bo74bo40bobob2o3b5o3b2o12bo148b2o12bobo125bo7bobobo 134bobo2bobo318b2o2b2o22b3o119bo2bo4b2o200b2o13b2o12b2o10bo2b2o17b2o$ 58bo7bo7bo29bo2bobobo2bo65b5o5b5o20bobo68b2o3bo5bo3bo5bo3bo5bo2bo2bo3b o3b3o3bo3b2o35bo6b2o4bo50b4o3b4ob4o3b4ob4o3b4o121bo10bo44bobobo42b2o 13b2o24bo15bo77b5obob2o29bobo181bobob2o13b2obobo17bob2o6b2obo8bobobo3b obobob2o6b2obobob2o5bo4bo8bobo100b2o10bo8bo306bobo7b2o22b2o7bobo192b2o 39bobo6b2o7bo4b2o155b2ob6o4bo3bo124bo4bo2b2obobo133b2o4b2o18bo2bo295b 2o29bo119bo2bo3bo2bo181b2o17b3obo9b2o25bo19b2obo$55bo2bo4bo2bo4bo2bo 31bo2bo2bo70bobo3bobo24bo75b2ob2o5b2ob2o5b2ob2o5b2ob2o4bobob2o41bobo8b 3o50bo4bo4bobo4bo4bobo4bo4bo126b2o46bo2bo3bo42b2o13b2o63b2o5b2o46bo2bo 2bobo32bo182b2obo15bob2o41b2ob4o2b2obo7bo2bob2obo6bo4bo9bo91b2o4bob2o 12bo8bo306bobobo2bo30bo2bobobo234b2o7bo4b3o5b2obo4bobo146b2ob6o5bo3bo 118b2o4bo9bobo157bo2b2o2bo294b2o26bobo95b2o23b2o4bo2bo181bobo17b2o39b 2o16b3ob2o9b2o$55b3o5b3o5b3o34bobo73b2o3b2o102bobo7bobo7bobo7bobo7bobo 41bobo5b2obo2bo53b2ob2o7b2ob2o7b2ob2o129b2o46b4ob2o43bo15bo60bo13bo48b o2bo10b2ob2o8b2o7b2o184bo15bo51b2o3bo8bobo4bo6bo4bo101b2o4b2obo9b2o2bo 6bo2b2o304b2ob4o30b4ob2o249bo11bo4bo162bo3bo117bo7b2o6b2o158bo2b2o2bo 157b2o7b2o89b2o9b2o15b2o8bo12b2o12b2o7b2o88bo26b2o4bo167b2o11bo2bo18bo 57b5o10b2o$185bo3bo101bobobobo3bobobobo3bobobobo3bobobobo4b2obobo41bo 8bo2bo54bobo9bobo9bobo182bo121b2o13b2o48b2o12bobo10bo193b2o3b2o3b2o3b 2o49bo2bo3b2o8b2o4b2o6bo2bo120bobo3bo4bo3bobo305bo38bo244bobo13bo171bo 3bo117b3o5bo168b4o159bobo6bobo89bo9bo15bobo21b2o21bobo84b3o24bo4bo3bo 167b2o10b2o2bo76bo2bo$54bob2o4bob2o4bob2o111bo3bo101b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o8b2o48b5o55bobo9bobo9bobo180bobo121b2o13b2o60bobobobo5b 3o198bo2bobo2bo53b2o27bobo2bobo118bo7b2o7bo159b2o5b2o137bobo34bobo120b 2o123bo15bob2o168bobo120bo5bo166bobo2bobo159bo8bo86b3o11b3o12bo48bo84b o26bo4bob2o183bo79bo$54b2obo4b2obo4b2obo111bo3bo196bo60bo11bo11bo181b 2o122bo15bo60b2o3b2o5bo201b2o3b2o83b2o4b2o117b2o16b2o158b2o5b2o138b2o 34b2o121b2o141b2o169bo127bo166b2o4b2o159b2o7b2o85bo15bo11b2o48b2o111b 4o185b2o! golly-3.3-src/Patterns/Life/Oscillators/unique-high-period.rle0000644000175000017500000001304112026730263021377 00000000000000#C Unique High-Period Oscillators #C These represent the known high-period mechanisms circa 1999 #C that do not depend on some engineering technique such as hassling #C (see Oscillators-TrafficLightHasslers) or Herschel conduits #C (see HerschelTrack). #C From Alan Hensel's "lifebc" pattern collection. x = 254, y = 174, rule = B3/S23 152boo$151bobbo$150bobobo$149b3obo58boo16boo$149b3o61bo16bo$129bo11bob o69bobo12bobo$bboobo6boobo76boboo6boobo21b3o14bo36boobo6boobo19boo12b oo$bboboo6boboo76boobo6boboo9boo9bo13bobbo37boboo6boboo$6boobboo4boo 72boo14boo8bo9boo11bobobo3boobboboboo22boo4boobboo4boo14boo18boo$6bo3b o5bo74bo14bo9bobo20bobbo4boobboboboo22bo5bo3bo5bo15bobo10boo4bobo$7bo 3bo5bo25bo46bo16bo9boo21boo10bo27bo5bo3bo5bo15bo10bobo5bo$6boobboo4boo 24bobo45boo14boo39boo30boo4boobboo4boo12bo13boo9bo$bboobo4bo5bo24bo3b oo45boboo6boobo16bo24boo32boobo4bo5bo13b6o8bo5b6o$bboboo5bo5bo12boo9bo 3boo3boo40boobo6boboo16bobo30boo24boboo5bo5bo17bo14bo$6boobboo4boo12b oo9bo3boo3boo44boobboo19bo33boo28boobboo4boo14boo18boo$6bo3bo5bo25bobo 52bobbo21bo39boo21bo3bo5bo15bo20bo$7bo3bo5bo25bo52bo4bo21boo3boo17boob oo3boo4bobbo21bo3bo5bo15bo18bo$6boobboo4boo78boobboo26bobo16booboo3boo bbobbobo20boobboo4boo12b3obbo14bobb3o$bboobo6boobo76boboo6boobo13boo9b o32bo17boobo6boobo14bobb3o8bo5b3obbo$bboboo6boboo76boobo6boboo14bo9boo 27boboo18boboo6boboo15bo12boo8bo$117b3o25boo13bo50boo10bobo5boo$117bo 27b3o65bo10boo4bo$145boobo62boo18boo$147bobo58bobbo20bobbo$146bobbo57b obobobboo12boobbobobo$147boo59bobbobobo12bobobobbo$211bobo16bobo$212b oo16boo5$39boo$39bo$31bobooboobo5boo$31boobobobo6bo70boo25boo57boo48b oo$bboobo6boobo21bo8bo46boboo4boo3boo9bo25bo30boo5boobo6boobo8bo48bo$ bboboo6boboo29boo46boobo4boo3boo9bobo21bobo31bo5boboo6boboo8bobo21boo 21bobo$6boo8boo73boo25boo7boo12boo31bo4boo4boobboo4boo7boo8bo12boo12b oo7boo$6bo9bo28boo45bo8boo3boo21bo44boo3bo5bo3bo5bo17boo26bobo$7bo9bo 11bo9b3obbobo44bo9bobobobo16bo4boo49bo5bo3bo5bo15boo29bo$6boo8boo11b3o 7bobo3bo45boo10bobo18boo3bo44boo3boo4boobboo4boo16boobboo22b3o$bboobo 6boobo16bo6bobo4b3o44boboo5boobo22bo46bo3bo5bo3bo5bo$bboboo6boboo15bob o14bo44boobo9boo66bo5bo5bo3bo5bo$6boobboo19boo64boo8bo20bo45boo3boo4b oobboo4boo$6bo3bo87bo7bo17boo3bo49bo5bo3bo5bo17boobboo22b3o$7bo3bo19b oo64bo8boo16bo4boo43boo4bo5bo3bo5bo15boo29bo$6boobboo19bo8bo56boo8bo 21bo45bo3boo4boobboo4boo16boo26bobo$bboobo6boobo16bo6boboboboo46boboo 9bo11boo7boo12boo31bo6boobo6boobo9boo8bo12boo12boo7boo$bboboo6boboo15b oo5bobooboobo46boobo9boo9bobo21bobo30boo5boboo6boboo8bobo21boo21bobo$ 38bo78bo25bo59bo48bo$37boo77boo25boo57boo48boo13$231boo$231boo$$223boo $224bo12bo$31boo20boo169bobo8boo$30bobbo19boo170boo10boo$30bo205bo$30b o214boo$30boboo20boo92booboobo90bobo$32boo18boboo91boobbooboo91bo$52bo 102bo84boo4booboobo$boo3boo4boobo36bo39boboo8boboo22boo15boo26boo5boob o4boo3boo14boo27bobo3bobboboo$boo3boo4boboo15boo13boo4bobbo36boobo8boo bo22boo15boo5boo20bo5boboo4boo3boo13bobo30bo3bo$10boo4boo13boo12bobbo 4boo35boo10boo50boo19bo10boo22bo30bo3boboo$boo3boobbo5bo28bobbo42bo9bo bo43bo27boo9bo3boo3boo8bobooboo4boo23bo3b4o$bobobobo3bo5bo26booboo41bo 10bo45booboobboo31bobbobobobo8boobobbo3bobo23b3obo$3bobo4boo4boo27boo 43boo8boo17bobbo17boobo4bobooboo20boo9boo4bobo16boobbo25boo3bobo$bboob o4bo5bo75boboo6boobo17bo16bo3bo31bo5boobo5boobo16b5obo23b3obo$6boo3bo 5bo19bo10bo43boobo6boboo18boo15b3o31bo6boboo9boo14bo3b3o23bo3b4o$7bobb oo4boo18bobo8bobo46boobboo4boo10boboo6bo46boo3boo14bo13bo6boo22bo3bob oo$6bo3bo5bo20bo4boo4bo48bobbo5bo11bobbo3bo54bo14bo14boo4b3o24bo3bo$6b oo3bo5bo22bo4bo50bo4bo5bo9bo3bob3o49boo4bo13boo13bo6boo21bobo3bobboboo $7bobboo4boo22bo4bo50boobboo4boo8bo11bo13boo32bo3boo14bo14bo3b3o8b3o 11boo4booboobo$6bo5boobo24bo4bo46boboo6boobo13b3obo3bo14boo31bo6boobo 9bo15b5obo8bobo18bo$6boo4boboo25bobbo47boobo6boboo13bo3bobbo48boo5bob oo9boo14boobbo9bobbo16bobo$39bobobbobo69bo6boobo78boobobbo3bobo7bobo 17boo$39boo4boo72boo84bobooboo4boo7b3o$121bo88bo$122bobbo84bobo$211boo $221bo$219boo10boo$221boo8bobo$220bo12bo$233boo$$225boo$225boo6$46boo 6boo$46boo6boo5$206boo24boo$206boo24boo$bboo3boobboo3boo12boo38boo20bo boo6boobo27bo42boo3boo3boobboo3boo17boo$bboo3boobboo3boo11bobo38bobo 19boobo6boboo26boboo41bo3boo3boobboo3boo16bobbo$29boboboo32boobobo23b oo8boo24boboo40bo37boo$bboo3boobboo3boo12bobobo32bobobo25bo8bo26boo41b oo3boo3boobboo3boo$bbobobobobbobobobo14bo36bo26bo10bo73bobobobobbobobo bo21b3o$4bobo6bobo15bobbo12boo4boo12bobbo25boo8boo14boo12boo38boo5bobo 6bobo23bobo$3boobo5boobo15bo14bobo4bobo14bo23boo6boobo16boo12boo39bo4b oobo5boobo23b3o$7boo7boo13bo3bo9boo8boo9bo3bo24bo6boboo70bo9boo7boo22b oo$8bo8bo13bo3bo10bobo4bobo10bo3bo23bo5boo74boo9bo8bo22b3o$7bo8bo14bo 15boo4boo15bo23boo4bo20bobo62bo8bo23bobo$7boo7boo13bobbo32bobbo21boo7b o18bo18boo35boo8boo7boo22b3o$8bo8bo14bo36bo23bo6boo13boobbo4bo10boobo bboboo32bo9bo8bo$7bo8bo13bobobo3boo22boo3bobobo20bo9boobo9boobobboboo 10boobbo4bo31bo9bo8bo28boo$7boo7boo11boboboo3boo22boo3boobobo19boo8bob oo13boo19bo35boo8boo7boo26bobbo$29bobo38bobo68bobo80boo$30boo38boo134b oo24boo$206boo24boo5$46boo6boo$46boo6boo11$138bo$136b3o$135bo$135boo$ 119boo19boo$120bo19bo$120bobo15bobo$oo4boo6boboo35bo38boobo6boobo15boo 15boo$bo5bo6boobo22bo10b5o36boboo6boboo$o5bo5boo15boo8boo9boobobbo33b oo4boobboo4boo24b3o$oo4boo3bobo15boo7boo9bo7bo32bo5bo3bo5bo25bobo$bbob oo5bo27boobboo5boobobbo34bo5bo3bo5bo24bobo$bboobo4boo39b5o34boo4boobb oo4boo$6boo4boobo37bo38boobo6boobo$7bo4boboo76boboo6boboo$6bo3boo4boo 21boobboo45boo4boobboo4boo$6boobbo5bo12boo7boo16boo32bo5bo3bo5bo$11bo 5bo11boo8boo15boo33bo5bo3bo5bo17boo15boo$10boo4boo22bo49boo4boobboo4b oo16bobo10bo4bobo$6boo4boobo76boobo6boobo18bo12bo6bo$6boo4boboo76boboo 6boboo17boo19boo$128boo$129bo$126b3o$126bo! golly-3.3-src/Patterns/Life/Oscillators/glider-stream-crystal.rle0000644000175000017500000001070112026730263022112 00000000000000#C High-period oscillator built by David Dauthier, showing #C a common crystal forming on a glider stream. Several adjustable #C high-period guns have been constructed that make use of two #C identical copies of this repeatable growth-and-decay reaction. #C It is also possible to support a single crystal of adjustable #C length, and extract a glider from either end of the reaction. #C See, e.g., p08832.lif in Jason Summers' "guns2j" collection. x = 252, y = 221, rule = B3/S23 90b2o68b2o$90b2o16b2o32b2o16b2o$108b2o32b2o4$89b3o8b2o48b2o8b3o$89b3o 8b2o48b2o8b3o$88bo3bo66bo3bo$108b3o30b3o$27b2o58b2o3b2o6bo6bo3bo28bo3b o6bo6b2o3b2o58b2o$29bo69bobo48bobo69bo$16b2o12bo67bo3bo3bo5bo26bo5bo3b o3bo67bo12b2o$16b2o4bo7bo8b2o57b5o3b2o3b2o26b2o3b2o3b5o57b2o8bo7bo4b2o $13b2o5b2o8bo8b2o56b2o3b2o44b2o3b2o56b2o8bo8b2o5b2o$5b2o5b3o5bo2b2o4bo 57b3o8b5o46b5o8b3o57bo4b2o2bo5b3o5b2o$5b2o6b2o6b5ob2o62b2o6b3o7bo32bo 7b3o6b2o62b2ob5o6b2o6b2o$16b2o4bo68b2o7bo7bob2o28b2obo7bo7b2o68bo4b2o$ 16b2o74b2o14bo34bo14b2o74b2o$90bobo15bo3bo26bo3bo15bobo$90b2o8bo8bo2bo 26bo2bo8bo8b2o$18b2o79bobo7b5o24b5o7bobo79b2o$16bo3bo78bo9b5o24b5o9bo 78bo3bo$10b2o3bo5bo63b2o3b2o16b2o3b2o22b2o3b2o16b2o3b2o63bo5bo3b2o$10b 2o2b2obo3bo2bobo58b2o3b2o17b5o24b5o17b2o3b2o58bobo2bo3bob2o2b2o$15bo5b o3bo71b2o4bo6b3o26b3o6bo4b2o71bo3bo5bo$16bo3bo8b2o56b3o7b2o12bo28bo12b 2o7b3o56b2o8bo3bo$18b2o9b2o56b3o72b3o56b2o9b2o$88bo74bo3$13bo8b2o204b 2o8bo$11bobo6bo2bo204bo2bo6bobo$4b2o4bobo7bo3bo2b2o194b2o2bo3bo7bobo4b 2o$4b2o3bo2bo7bo2b2o2b3o57b2o74b2o57b3o2b2o2bo7bo2bo3b2o$10bobo16b2obo 12bo41b2o21b2o28b2o21b2o41bo12bob2o16bobo$11bobo4b3o8bo2bo5b2o6bo63b2o 28b2o63bo6b2o5bo2bo8b3o4bobo$13bo15b2obo5b2o4b3o158b3o4b2o5bob2o15bo$ 27b3o192b3o$27b2o194b2o$87bobo72bobo$87b2o74b2o$88bo74bo18$65b2o118b2o $64b3o118b3o$64b2obo116bob2o$65b3o116b3o$66bo118bo13$23b2o202b2o$23b3o 200b3o$9bo15b2obo5b2o4b3o166b3o4b2o5bob2o15bo$7bobo4b3o8bo2bo5b2o6bo 166bo6b2o5bo2bo8b3o4bobo$6bobo16b2obo12bo168bo12bob2o16bobo$2o3bo2bo7b o2b2o2b3o200b3o2b2o2bo7bo2bo3b2o$2o4bobo7bo3bo2b2o202b2o2bo3bo7bobo4b 2o$7bobo6bo2bo212bo2bo6bobo$9bo8b2o212b2o8bo4$14b2o9b2o198b2o9b2o$12bo 3bo8b2o198b2o8bo3bo$11bo5bo3bo208bo3bo5bo$6b2o2b2obo3bo2bobo206bobo2bo 3bob2o2b2o$6b2o3bo5bo216bo5bo3b2o$12bo3bo218bo3bo$14b2o220b2o3$12b2o 224b2o$12b2o4bo214bo4b2o$b2o6b2o6b5ob2o202b2ob5o6b2o6b2o$b2o5b3o5bo2b 2o4bo200bo4b2o2bo5b3o5b2o$9b2o5b2o8bo8b2o178b2o8bo8b2o5b2o$12b2o4bo7bo 8b2o178b2o8bo7bo4b2o$12b2o12bo198bo12b2o$25bo40b2o116b2o40bo$23b2o41b 3o114b3o41b2o$65bob2o114b2obo$65b3o116b3o$66bo118bo2$66bo118bo$65b3o 116b3o$65bob2o114b2obo$23b2o41b3o114b3o41b2o$25bo40b2o116b2o40bo$12b2o 12bo198bo12b2o$12b2o4bo7bo8b2o178b2o8bo7bo4b2o$9b2o5b2o8bo8b2o178b2o8b o8b2o5b2o$b2o5b3o5bo2b2o4bo200bo4b2o2bo5b3o5b2o$b2o6b2o6b5ob2o202b2ob 5o6b2o6b2o$12b2o4bo214bo4b2o$12b2o224b2o3$14b2o220b2o$12bo3bo218bo3bo$ 6b2o3bo5bo216bo5bo3b2o$6b2o2b2obo3bo2bobo206bobo2bo3bob2o2b2o$11bo5bo 3bo208bo3bo5bo$12bo3bo8b2o198b2o8bo3bo$14b2o9b2o198b2o9b2o4$9bo8b2o 212b2o8bo$7bobo6bo2bo212bo2bo6bobo$2o4bobo7bo3bo2b2o202b2o2bo3bo7bobo 4b2o$2o3bo2bo7bo2b2o2b3o200b3o2b2o2bo7bo2bo3b2o$6bobo16b2obo12bo168bo 12bob2o16bobo$7bobo4b3o8bo2bo5b2o6bo166bo6b2o5bo2bo8b3o4bobo$9bo15b2ob o5b2o4b3o166b3o4b2o5bob2o15bo$23b3o200b3o$23b2o202b2o13$66bo118bo$65b 3o116b3o$64b2obo116bob2o$64b3o118b3o$65b2o118b2o18$88bo74bo$87b2o74b2o $87bobo72bobo$27b2o194b2o$27b3o192b3o$13bo15b2obo5b2o4b3o158b3o4b2o5bo b2o15bo$11bobo4b3o8bo2bo5b2o6bo63b2o28b2o63bo6b2o5bo2bo8b3o4bobo$10bob o16b2obo12bo41b2o21b2o28b2o21b2o41bo12bob2o16bobo$4b2o3bo2bo7bo2b2o2b 3o57b2o74b2o57b3o2b2o2bo7bo2bo3b2o$4b2o4bobo7bo3bo2b2o194b2o2bo3bo7bob o4b2o$11bobo6bo2bo204bo2bo6bobo$13bo8b2o204b2o8bo3$88bo74bo$18b2o9b2o 56b3o72b3o56b2o9b2o$16bo3bo8b2o56b3o7b2o12bo28bo12b2o7b3o56b2o8bo3bo$ 15bo5bo3bo71b2o4bo6b3o26b3o6bo4b2o71bo3bo5bo$10b2o2b2obo3bo2bobo58b2o 3b2o17b5o24b5o17b2o3b2o58bobo2bo3bob2o2b2o$10b2o3bo5bo63b2o3b2o16b2o3b 2o22b2o3b2o16b2o3b2o63bo5bo3b2o$16bo3bo78bo9b5o24b5o9bo78bo3bo$18b2o 79bobo7b5o24b5o7bobo79b2o$90b2o8bo8bo2bo26bo2bo8bo8b2o$90bobo15bo3bo 26bo3bo15bobo$16b2o74b2o14bo34bo14b2o74b2o$16b2o4bo68b2o7bo7bob2o28b2o bo7bo7b2o68bo4b2o$5b2o6b2o6b5ob2o62b2o6b3o7bo32bo7b3o6b2o62b2ob5o6b2o 6b2o$5b2o5b3o5bo2b2o4bo57b3o8b5o46b5o8b3o57bo4b2o2bo5b3o5b2o$13b2o5b2o 8bo8b2o56b2o3b2o44b2o3b2o56b2o8bo8b2o5b2o$16b2o4bo7bo8b2o57b5o3b2o3b2o 26b2o3b2o3b5o57b2o8bo7bo4b2o$16b2o12bo67bo3bo3bo5bo26bo5bo3bo3bo67bo 12b2o$29bo69bobo48bobo69bo$27b2o58b2o3b2o6bo6bo3bo28bo3bo6bo6b2o3b2o 58b2o$108b3o30b3o$88bo3bo66bo3bo$89b3o8b2o48b2o8b3o$89b3o8b2o48b2o8b3o 4$108b2o32b2o$90b2o16b2o32b2o16b2o$90b2o68b2o! golly-3.3-src/Patterns/Life/Oscillators/extensible-low-period.rle0000644000175000017500000001773312026730263022131 00000000000000#C Some low-period oscillators have been found to be repeatable. #C While this property occurs in some higher period oscillators, #C it usually does not seem quite as remarkable, since those #C extensible oscillators typically depend on some mechanism of #C "bouncing off" of copies of themselves. #C From Alan Hensel's "lifebc" pattern collection. x = 328, y = 205, rule = B3/S23 324boo$231boo26bo64boo$230b4o24bobo63boo$32boo34bo160bobbobo22bobobo 63bo$bboobo25bobo10bo7bo13bobo127boboo28bobobboo22bo3b3o60bobo$bboboo 36bobo5bobo12bo4bo125boobo27bobo24booboo60b3obobo$6boo21bobo14bobo5bo 10b5o25boo97boo30boo25bobo3bobo12boo7boo14boo7boo9b4obo$6bo33boo6bo22b o9bo13bobo95bobo30b3o24bobboo3bo12b3o5b3o14b3o5b3o13bo$7bo19bobo24boo 9booboobobo6bobo16bobo32bo25bo32bo33bobo24boobbo3boo7bo15bo8bo15bo$6b oo33bo24bobo4bobo4bobo13bobbo3bo28bobo23bobo31boo34boo26boo3bo4boobbob obob7obobobobobbobobobob7obobobobboo$bboobo19bobo25bo12bobo6bobobooboo 18bobbo25bo4bo25bo31boobo26boo30bobbobo3bobbo9bobo9bobbo9bobo9bobbo$bb oboo36boo23bo9bo18boo4bobobbo23b5o21b6o31boboo25bobbo27bobo8bobbobo5b 3ob3o5bobboobbo5b3ob3o5bobobbo$oo21bobo26boo25b5o15boo3bobobbo8bo18bob o15bo36boo4boo24bo29boo5b3o7boobboo5boobboo8boobboo5boobboo7bobbo$o21b o19bo35bo4bo13boo7bobobbo4bobo14bo5bo13bobo3boo31bo5bo26bo32boobo12boo bb3obboo14boobb3obboo13bo$bo20boo30bo25bobo16bo8bobobbo3bobbo12boo6bob o7bo9bo31bo5bo17boo7bobbo27bobo59bo4bo$oo38boo38bo29bobobbo17boo8bo5bo bo6bo33boo4boo19boboo4bo17boo10bo61boobbobo$bboobo41bo6boo56bobo4boo 13bo10bobo11boo33boobo17bobbobboo5bo16bobo8boo66boboo$bboboo35bo5bobo 64bobo30bo46boboo17bobo11bobbo13b3o$43bobo5bobo62bobobo95bo13bo16boo$ 43bo7bo69bo109bo13bobo76bobbo$71boo47boo94boo14bobbo4boobbobo77boo$71b oo143boo15bo6bobobbo$234bo6b4o$71b4o160bobbo3boo$70bo3bo22bo138bobbo$ 23boo4boo35boobobo23bobobo137bobo$23bobobbobo8booboo22boobobobo23bobob o136bo$25bobbo10bo3bo25bo3bo20booboboobbo129boo$25bobbo11b3o26boo3boo 21bo5bo129boo$22boob4oboo9bo54boo6bo177bo5bo17bo$23bobobbobo10bo33boo 29bo26b3o21b3o74bo47bo5bo17bo$23bobobbobo9b3o34bo28bo126bobo58bo5bo16b oo$22boobobboboo45bobo27bo26boboo17boobo69boobbobbo45bobo3bobo4bo4bobo 3bobo10bo$23bob4obo48bo53bo25bo68boobo28b3obbooboo3boo5bobobobobobo7bo 3bobobobo5boobboboo$23bobobbobo9b3o37boo26boo23boo3boo13boo3boo72boo 28bobob5ob6obbooboobooboobbobobbobobobooboobb6obobo$22boobobboboo9bo 68bo149boo8bobo3bobobobobobobobobobobobo3bobobobobobo3bobobo$23bobobbo bo10bo39boo3boo52boo9boo108bobob4obobbobobbobobobobobobobooboobo3bobob obobobbobobboo$23bob4obo9b3o40bo3bo23boo148bobobo3bobobo3booboboo3bobo bboboboboboboboboobboo3bobo$22boobobboboo51boboboboo22bo28booboboboo 111bobo3bobbobo4bobbo6bo3boboboboboo3bo4bo4bobo$23bobobbobo54boboboo 30boo23bo116bo4boobbo3bobo3bobo8boobobo7bobobobo3bo$23bobobbobo9b3o39b o3bo27boo5bobo20bobobo127boo5boo12boo8booboobo$22boob4oboo7bo3bo38b4o 30boboobo24bo166bo$23bobobbobo8booboo75boboboo188boo$23bobobbobo53boo 32bobbo$22boobobboboo52boo34bobo$25b4o$25bobbo$26boo4$221boo100boo$ 219bobbo100boo$$324bo$219boobo100bobo$221bobobboo90boobbobbo$222bo4bo 90boobo$223bo98boo$223bobbo3boo6boo6boo30boo6boo$228bo4bobbo4bobbo4bo bbo4bobbo4bobbo4bobbo4bobbo4bobbobbobobboboobobboboobobbo$80booboo143b o4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobboboo $80boobo4bo139bo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbobbobo bboboobobboboobobbo$33boo48bobboobo134boo4boo6boo6boo6boo6boo6boo6boo 6boo6bo$32bobbo47bob4o134b4o95bo$31boboo24boo23boo136bobbobo90b4obo$ 31bo26bobo40bobbobobbo111bobobboo90b3obobo$30boobobo65bobbobobbo36boo 72bobo100bobo$31bo3bo21boo24b5o12boobbobobboobo34bo7bo63boo103bo$31bo 23b3o20bo3bobo13b3o4bo5bobo33bobo3b3o63b3o101boo$32b3o43bo3boo21bo6boo 28boo4boobbo67bobo100boo$78bo3bo60bo7bobo67boo100boo$32b3o19b3o20boo3b o15b3o11boo29bobo5bobo$bboobo20b3obbo4bo16boo21bobo3bo18boo9bobo23boo 4boo6bo$bboboo25bo4bo13bobbo19b5o20b3o11bobo24bo7b3o$6boo16bo4bobo4bo 13bobbo58boo25bobo5b3o$6bo17bo4bo19boo83boo4boo9boo$7bo16bo4bobb3o12b 3o48b3o11boo21bo7b3o5bobo$6boo18b3o44b5o23bo10bobo20bobo5b3o7bo$bboobo 62bo3bobo23b3o11bobo15boo4boo9boo4boo$bboboo18b3o19b3o19bo3boo38boo17b o7b3o5bobo$6boo10b3obbo4bo16boo21bo3bo58bobo5b3o7bo$6bo16bo4bo13bobbo 21boo3bo25b3o8boo21boo9boo4boo$7bo8bo4bobo4bo13bobbo20bobo3bo27bo7bobo 24b3o5bobo$6boo8bo4bo19boo20b5o32bo7bobo24b3o7bo$bboobo10bo4bobb3o12b 3o57bobo7boo21bo6boo4boo$bboboo12b3o79bo30bobo5bobo$74bo34boo20bobo7bo $18b3o18b3o23b5o4bo33bobo21bobboo4boo$16bo4bobb3o14boo25bobo3bo33bobo 18b3o3bobo$16bo4bo20bobbo23boo3boo33boo18bo7bo$16bo4bobo4bo13bobbo24bo 3bobo36bo23boo$23bo4bo16boo23bo4b5o29b5o$18b3obbo4bo17b3o21bo38bo$24b 3o84bo118bo$77boo31boo118b3o8boo$24b3o20b3o24b4obo153bo7bo$23bo25boo 22boboobbo114boobo34bo6bobo$23bo3bo46bo4boboo111boboo27bo6bo3bobboo$ 22boobobo22bobo25booboo109boo4boo25b3o9bo$23bo27boo139bo5bo29bo5bobbo 7boo$23boboo166bo5bo27boo6b3o7bo$24bobbo164boo4boo20bo22bobo$25boo167b oobo22b3o20boo$194boboo25bo5b3o$192boo4boo22bo6bobbo5b3o$192bo5bo23bo 3bobbo8bobbo$193bo5bo27bobbo4bobbo$192boo4boo24bobbo8bobbo3bo$194boobo 27b3o5bobbo6bo$194boboo36b3o5bo$221boo20b3o$220bobo22bo$220bo7b3o6boo$ 219boo7bobbo5bo$228bo9b3o$225boobbo3bo6bo$224bobo6bo$224bo7bo$69bo6bo 6bo32bobo104boo8b3o$61boo6boo5boo5boo5boobo3bo4boobo4bo3bobbo117bo$65b oboboobobobooboboboobo6bo3boo6bo3boo4boboboo$57boobobbobo4bobo4bobo4bo bobobo4b4obobo4bob4oboobo$21bo33bobbob4o27boo5bo4boo4bo7bobo$19bobo3b ooboobboo21boobo58boo$20bobobbooboobboo3boo19bo$boo3boo12bo16bo20boo 134boobo$boo3boo186boboo$22b17o153boo4boo$boo3boo11bobo17bo152bo5bo19b oo45boo20boo$bobobobo10bo21bo152bo5bo19bo27boo17bo20bo$3bobo13bo21bobb o147boo4boo19bobo25bo18bobo16bobo$bboobo14boo19boboo149boobo22boo23bob o19boo16boo$6boo13boobboobooboobboo4bo152boboo27bo4bo14boo$7bo17booboo boobboo4bo156boo23boob4oboo3bo4bo28b6obb6o$6bo34bo29bo15bo110bo26bo4bo 3boob4oboo$6boo27boo4bobboo15bo3bo4bobo4bo3bo4bobo4bo3bo51boo48bo20boo 14bo4bo25boo16boo$7bo27boo4bobboo15b5o4bobo4b5o4bobo4b5o36boob4oboobb ooboo47boo19bobo23boo19bobo16bobo$6bo34bo19bo3bo3booboo3bo3bo3booboo3b o3bo36bobbobbobbobbobbo44boobo21bo25bobo18bo20bo$6boo33bo15boobbooboo 3bo3bo3booboo3bo3bo3booboobboo31booboobboob4oboo44boboo20boo27bo17boo 20boo$38bobbo14bobo3bobo4b5o4bobo4b5o4bobo3bobo13boob4oboobbooboo114b oo$40bo15bo5bobo4bo3bo4bobo4bo3bo4bobo5bo13bobbobbobbobbobbo$38bobobo 12boo6bo15bo15bo6boo11booboobboob4oboo$37boboboo72boo$37bobo$38boo14$ 38boo$38bo$36bobo$bboboo30boo24boo3boo118boo5boobo74bo$bboobo26boo28bo bobobo89bo29bo5boboo41bo10bo9boo9bobo$oo31bo30bobo52boo36bobo27bo10boo 38bobo8bobo8boo10bo$bo31bo30bobo28boo8bo6bobbo3bo31bo5bob3o4bo20boo9bo 40bo10bo$o32boo29bobo28bobo6bobo3b3obb3obo30bobo3boo4bobbobo31bo58bo 29b3ob3o$oo26boo27boo4bo3bo4boo23bo6bobbobo3boo3bo32bo7boobobbobo19boo 9boo17b3ob3o33bobobbobo4bobobboo5bo3boo4bo$bboboo23bo27bo4bo5bo4bo23b oobboobooboboobo3boo30b3o4boboobobobooboo19bo5boobo22bo4boo3bo5boobbob o4bobobboo3bobbobobbobbobbobobbo4boob3oboo3boo$bboobo23bo28b4o7b4o26bo bbo4bo4boobo6boo3boo3boo3boo3boo5booboboobbobobo4bo19bo6boboo19boo3boo b3oboo4bobbobobbobbobbobobbo3boobbobo4bobobboo5bo3boo4bo$6boo21boo66b 3obobboboboobobo5boo3boo3boo3boo3boo3boobobooboobobo5bobobo19boo3boo 26bo4boo3bo5boobbobo4bobobbobo33b3ob3o$7bo16boo23boo5b4o11b4o5boo14bo 6booboobobobb4oboo3boo3boo3boo3boo3boo6boobooboboboobbo25bo24b3ob3o29b o$6bo18bo16boo5bobo3bo4bo9bo4bo3bobo5boo7boo5boo8boo3bo3boo3boo3boo3b oo3boo4boo5bobbobo3boo21boo4bo67bo10bo$6boo17bo17bo6bo3bo4boo9boo4bo3b o6bo26bo34bobboobobooboboo24bo3boo45bo10boo8bobo8bobo$bboboo19boo16bob oo6bo23bo6boobo24boboboo29bo4boobobboboobo23bo6boobo40bobo9boo9bo10bo$ bboobo15boo21bo3bo4bo23bo4bo3bo25boobbo30boo7boo29boo5boboo41bo$20bobo 23boboboobo23boboobobo31bobo$20bo25bobobbobobo19bobobobbobo32boo$19boo 23boboboobobboo19boobboboobobo$44boo5bo27bo5boo$51boo25boo9$106boo8boo 18boo$106boo6bobbo18bo$103bo10b3o20b3o$103b7o9bobbobbobbobbobbo4bo$ 109bobb26obobo$101b3obboobobo26bobobo$97boobobbobo3boboo3b3obb3obb3obb 3obbobobobo$98bobobobboo4boboo3boo3boo3boo3boo5boboo$97bobbobbobbob3ob oobb3obb3obb3obb3obbobobobo$97boobb3obbo3bo27bobobo$107b3obob25obobo$ 101boobo4bobobobbobbobbobbobbobbobbo4bo$102bob4obbobo24b3o$101bo5boobo 25bo$102b3o5bo25boo$104bo5boo! golly-3.3-src/Patterns/Life/Oscillators/low-period.rle0000644000175000017500000004241012026730263017757 00000000000000#C Low-period oscillators. #C Low-period oscillators and high-period oscillators can most easily #C be distinguished by the search techniques used to find them. #C Small periods from 2 to 6 can be found by cell-by-cell search #C algorithms; algorithms that try various random soups on different #C topologies can often discover oscillators in the range 2-16; #C oscillators of higher period are usually found by engineering #C from known parts, such as perturbing a common piece of fluff in #C just such a way that it reappears somewhere else in a useful way. #C These usually have a period of 30 or more. #C Because of the differences in search techniques, there is something #C of a rift of known oscillators between periods 16-30, with only a #C few filled in by low-period or engineered patterns. #C From Alan Hensel's "lifebc" pattern collection. x = 491, y = 249, rule = B3/S23 225booboo13bo$bboobo20bo112boboo82booboo12bobo47boobo67boo54boo3boo3b oo$bboboo11b3o6boo111boobo99bobo47boboo7boo12boo40boobbo56bo3boo3boo$ 6boo18boo9boobo10bo85boo10boo16boo54b9o6booboobooboo41boo4boo6bo12bo 41bobobo55bo$6bo20bo9boboo8b3o84bobo10boo15bobbo12booboo6b3o13b3o10bo 4bo4bo5bo4bo4bo41bo5bo7bobo8bobo18bo23bobboboo52boo3boo3boo$7bo40bo18b o68bo29b4o13boboo26bo9b3o3b3o7b3o3b3o43bo5bo7boo8boo15boo3bo25boboo57b obobobo6booboo$6boo30b3o7bobb3o11bobo67boo12bo14bobobbobo8boo11boobboo bo9bobobo10bobobo11bobobo44boo4boo34bo5boboo21bo55boo5bobo8booboo$bboo bo31bo3bo5boobo3bo14bo67boobo7bobo12bo8bo10boboo6bo4bobo5bo3bobbo78boo bo12b6o15boobobo6bo12boo5bobo56bo4boobo9bobo$bboboo31bo3bo8bo3bo8boo 72boboo7bobbobboo7bo8bo6bo3bobbo13bo5boboo5bo8bo5bo61boboo33booboboob 4o13bobo4boo56bo9boo5bobobobo$oo36bobo9bo3boboo11boo64boo4boo9boboo8bo bobbobo10boobo5bo14bo5boobo8bobbobbo65boo7boo8boo15bobo20bo3boo58boo9b o5bobobobo$o14boo19bobobobo8b3obbo7bo70bo5bo8boo14b4o10bo10bobo4bo9bo bbo3bo9bo3bo66bo7bobo8bobo14bobob3o21bo68bo6boo3boo$bo13bo8bo11boo3boo 13bo9bobo67bo5bo23bobbo8bobo10boboobboo8bobobo10b3o5b3o8bobobo51bo6bo 12bo15bobo3bo13b7o59boo8boo$oo16bo5bobo26b3o10bo68boo4boo24boo9boo28bo 13bo9bo6b3o3b3o48boo5boo12boo16bobboo13bo66bo9bo$bboobo11boo4bobo27bo 83boobo55b3o11b3o25bo4bo4bo43boobo39boo19boo61bo9bo$bboboo19bo111boboo 97booboobooboo43boboo60boo61boo8boo$242bobo$242bobo$243bo$65bobo$63bo bbobbo$64bobobo$49booboo8b3obob3o$49bo3bo12bo$50b3o8b5ob5o80bo11bo$24b oo7boo4boo25bo84bobo9bobo13bo$25bo7bobobbobo21b3obob3o80bobo11boo12bo 42bo5bo10boo4boo$22bobo10bobbo11b3o11bobobo82bo13bo12b3o41boo3boo9bobb obbobbo126boo$21bo13bobbo10bo3bo9bobbobbo80boobo10bobo28boo14boo9boo3b oo9bo3boo3bo125bobo$21boo13boo11booboo11bobo85bo13bo10b3o11bobbobo13b oo10bo3bo8boo3bobbo3boo123bo$163bo27bobobobo37bo4bo4bo4bo83boo16boo17b oob4o102bo4bo$150b3o9b3o3bo5boobb3obboo7bobbob3o9b6o9b3o8bo3bo6bo3bo 84bo7boo7bo17bobobobbo100boob4oboo$151boo8b3ob3o6bobobbobbobo15bo7bo5b o8bo3bo8bobo8bobo85bobo3bo4bo3bobo17bobobo77bo4bo13bo8bo4bo$175bo7bo6b 4o3b4o7boboo25bo4boo4bo87boobbo6bobboo16boobboo44boo5boboo21boob4oboo 11bo$148b3obb3o7bobbo23bo15boobobo25bo4boo4bo90bo8bo18bo4bo46bo5boobo 23bo4bo12bobo$175bo7bo7b3obobbo8bobo13bo3bo8bobo8bobo89bo8bo18b5o46bo 4boo15bo30bo$151boo9b3ob3o5bobobbobbobo8bobobobo7boboobboo9b3o8bo3bo6b o3bo52boo16boo16bo8bo16boo3bo4bo42boo4bo15bo30bo$151b3o7bo3b3o6boobb3o bboo8bobobbo5booboboobbobo19bo4bo4bo4bo53bo16bo14boobbo6bobboo12bobb3o 3booboo45bo15bobo29bo5boobboo$166bo27boo8boobo7bo7bo3bo8boo3bobbo3boo 54bobo12bobo13bobo3bo4bo3bobo11boobo5booboo3boo35boo3boo15bo30bo5boobb oo5bo$150bo11bo15b3o26bo7boo5boo3boo9bo3boo3bo57boo12boo14bo7boo7bo14b o14bo36bo5boboo11bo11boobboo12bobo15bo$150boboo9bobo41bobo12boo3boo9bo bbobbobbo62bo4bo18boo16boo13boo3booboo5boboo32bo6boobo11bo11boobboo13b o15bobo$152bo11bo13b3o27boo12bo5bo10boo4boo61boob4oboo23boobboo25boob oo3b3obbo32boo9boo9bo30bo5boobboo5bo$150bobo10boo14bo130bo4bo25boobboo 27bo4bo3boo45bo8bobo35boobboo5bo$150bobo11bobo12bo125boo12boo13boo16b oo24b5o35boo9bo10bo47bo$151bo13bo138bobo12bobo13bo7boo7bo24bo4bo36bo9b oo9bo47bo$304bo16bo13bobo3bo4bo3bobo23boobboo36bo6boboo23bo4bo29bobo$ bboobo37bo3bo255boo16boo13boobbo6bobboo23bobobo38boo5boobo21boob4oboo 28bo$bboboo15b3o3b3o13bo3bo291bo8bo23bobbobobo72bo4bo16bo4bo8bo$6boo 35bo3bo27boo16boo10boo232bo8bo23b4oboo93boob4oboo$6bo12bo4bobo4bo10boo 3boo14bo10bobbo12boobbo6boobobo232bo8bo27bo97bo4bo$7bo11bo4bobo4bo9bob o3bobo8b4o3bo8bobobbo9bo11boobo231boobbo6bobboo22bobo$6boo11bo4bobo4bo 6b5o5b5o8bo3bo9bo3bo9bobobo10bo230bobo3bo4bo3bobo21boo$bboobo15b3o3b3o 35bo13bo8boo3bo10bobbo93bo10bo122bo7boo7bo$bboboo56bo13bo13b3o12boobo 91bobo8bobo10boo6bo14bo6boo78boo16boo$6boo13b3o3b3o33boo12boo11bo17bo 72boo3boo12bobo8bobo11bo4b3o13bobo5bo$6bo12bo4bobo4bo6b5o5b5o55boo70bo bo3bobo9b3oboo6boob3o8bo4bo16bobo3bobo$7bo11bo4bobo4bo9bobo3bobo105bo 5boo18bo5bo9bo4bo13bo7boo3boo12booboboobboo4bo$6boo11bo4bobo4bo10boo3b oo105bobo4bobboo32b3obbo6boob3o27boboo9b3o$bboobo37bo3bo106bobo5bobo 35bobbo6boobo10boo10boo9boo6bo196boo17boo3bo$bboboo15b3o3b3o13bo3bo 105booboo3boobo17booboo21bo15bobobbo6bo10bobbo4boo193bo4bo15bobobobo$ 43bo3bo10bo11bo14bo68bo9boboo11boobbobobboo15b4o16bobboo4bobo11b3o198b o6bo16bobobo$58b3o9b3o12b3o64bobb3o4b3obbo9b3obobobobob3o13bo16b3o5boo bboo15boo195bo8bo14booboboo$61bo11bo14bo16boobo43boobo9bo10bo4boo3boo 4bo7boboo6bobbo8bo7bo17boobo3bo192bo8bo13bo3boo3bo$60boo10bobboo10bo 17boboo46boboo3booboo10b4o7b4o6b3oboo6bobb3o32boobobob3o190bo8bo12bob oobboo$72bo4bo9bobbo11boobo49bobo5bobo14bo7bo8bo13bo4bo14bo20boo4bo 190bo6bo13bobobbobo3bo$62boo9boobbo12bo12bobob4o43boobbo4bobo13bo9bo8b 3oboo6boob3o14boboboboo16b4o192bo4bo15b3obboo5booboo$62bo13bo11bobboo 9bo7bo46boo5bo14boo7boo10bobo8bobo15bobooboobo16bo197boo21boo3bobboob oo$63b3o11b3o8bo13b4obobo90bobo8bobo15bo25bo186b3o24b5oboboo$65bo13bo 9boo3bo12boboo90bo10bo15boo24boo185bo3bo6bo16bobbobbobo$25bo66boobo8b oobo332bo5bo4bobo20bobbo$24b3o16bobbo48bo8boboo342bobo22boo$22b3ob3o 14bobbo48boo188boo5boobo19boo122bo7bobobo27boobboo$22bo5bo13boobboo 238bo5boboo18bobo22boobbobboo91bo7bobbo24b5oboob3o$21boo5boo10b3o4b3o 235bo4boo4boo16bo24bo7bo126bo12bo$20boo7boo254boo3bo5bo14boobo25boo3b oo93bo5bo28b6obb4o$21boo5boo33b3o10b3o10b3o199bo5bo13boobo22bo5bo5bo 91bo3bo34bobbo$22bo5bo11b3o4b3o235boo3boo4boo16boboo19b6ob6o92b3o32boo 6boo$22b3ob3o13boobboo14bo4bo7bo4bo7bo74boo121bo3bo5bo14boobo26bo3bo 131bobbobbobbo$24b3o16bobbo14bobo3bo6bobo3bo5bo7bo68bo6boo113bo5bo5bo 13bobobbobbo19boo5boo130b3obb3o$25bo17bobbo14bobbobbo4b3obbobbo5b4o4bo 65boobo6bobbo111boo3boo4boo16boobobo3boo14bo7bo$60boo3bo12bo11bo3bo65b oboboobooboboobbo113bo5bo19bo7bo15bo5bo129b4oboob4o$62b3o11boo8boobbob o61bo7bobbobobbobbobobo107boo4bo5bo18bob6o15boo5boo128bobboobboobbo$ 62bo13bo9bobobo61boobbo3bobboobbobobo3bobbo107bo3boo4boo19bo$76bo10boo boo64bo3bobboobbobobobboboo107bo6boobo22boboo$154bo3b4oboobo3booboo 110boo5boboo21booboo$45bo115bo8boboo$20boo3bo3boo13bobo106bobobobboobo boboboob3oboo$20boobb3obboo12bobobo105bobo8boo3bo4bobo$22b3ob3o14bo3bo 105bo10b6o4bobo$22bo5bo12boobbobboo110boboo4bobbo3bo$21boo5boo10bo4bo 4bo109boo6bobbo$20boo7boo8bobobooboobobo111b4ob3o$21boo5boo10bo4bo4bo 109b3o4bo$22bo5bo12boobbobboo19bo20booboo65bobbobbobboo$22b3ob3o14bo3b o21b3o3bob3o6bo4boboo67boo3boobo$20boobb3obboo12bobobo20bobo3bobo8bob oobbo$20boo3bo3boo13bobo18b3obo3b3o10b4obo326boo7boboo35boo12boo$45bo 29bo13boo328bo7boobo31boobobboboo4boobobboboo$418bo6boo16boo17boobbo4b o4bo4bobboo$418boo4bobo16bobo21bo12bo$381boo41bo13bo4boboo21bobo6bobo$ 380bobo35boo3boo12boo5bo30bo$349boo29bo38bo5boobo7bobbo34bobo$349boo 27boob4o33bo6boboo7b3o32bo5bo$344bo10bo21bo3bobbo33boo3boo4boo39bo5bo$ 343bobo8bobo20bobobo41bo5bo16b3o22bobo$287boo4boo26boo19bobo3bobbo3bob o17boob3o37boo4bo5bo14bobbo23bo$288bo5bo27bo18bobo4bobbo4bobo15bobbo 41bo3boo4boo9bo5boo20bobo6bobo$287bo5bo22boob3o20bo5bobbo5bo16boboo11b oo27bo6boobo9boobo4bo20bo12bo$287boo4boo20bobobo52boo3bo11bo28boo5bob oo10bobo20boobbo4bo4bo4bobboo$315bobo53bobb3o10bobo50boo20boobobboboo 4boobobboboo$287boo4boo17boobobo25b3o8b3o14boobo6b3o3boo77boo12boo$boo 3boo65bo214bo5bo17bobo3bo8boo10boo18boo13bo5bo3bo8bo$boo3boo65bo213bo 5bo20boboobbo5bobo10boo18boo10b3o5bo5bo5b3o$29bo42b3o15b3o194boo4boo 19bobbobobo4bo16b3o8b3o14bo8bo3bo5bo$boo3boo10bobo7bobo8boo3boo10bobo 256bobobbo4boo49boo3b3o6boboo$bobobobo13bo18bobobo9b3ob3o27bo5bo192boo 4boo21boo4bo52bobo10b3obbo$3bobo11bobbo6boo3bo7booboo8bo3bo3bo26b7o 193bo5bo23b4ob4o15bo5bobbo5bo17bo11bo3boo$bboobo10bobobo6bo5bo6bobobo 8bobo3bobo9b5o12bo5bo192bo5bo24bobbo4bo14bobo4bobbo4bobo15boo11boobo$ 6boo8bobbo10bobo6boo3boo8booboboo9bob3obo10boo5boo191boo4boo24bo3b3o 16bobo3bobbo3bobo29bobbo$7bo9boo10boo39bobobobo10boo5boo224b3o20bobo8b obo27b3oboo$6bo47b7o8booboboboo245bo20bo10bo27bobobo$6boo46bobbobbo7bo bbooboobbo11b3o85boo3bo4bo3boo128boo25boo29bobbo3bo$7bo60boo7boo99bobb obbobbobbobbo14boo7boo130boo29b4oboo53boo6boo$6bo130boboo34booboboobo 4bobooboboo11boo7boo165bo54bobbo4bobbo$6boo129boobo22bo11bobbobboboboo bobobbobbo38bo9bo136bobo54bobo6bobo$141boo19bobo12bobo3boobboo3bobo13b 4o3b4o15bobo7bobo135boo53boobb3obb3obboo21boo$142bo19bobo13bo3bo6bo3bo 13bo4bobo4bo14bobo7bobo189bo6bobbo6bo16boobobboboo$110bo30bo19booboboo 13bo8bo15bobobbooboobbobo10booboboo5booboboo186boboo10boobo16boobbo4bo $141boo16bo4bobbo12bo10bo11bobbobo9bobobbo7boboobbo5bobboobo187bobo10b obo22bo$86b3o15boobo5boboo22boo17bobb3obo15boo6boo11bobobobobbooboobbo bobobo10boo7boo193boo3boo3boo25bobo4b3o$104bo5bo5bo23bo22boboo36bobbob o9bobobbo11bobbo3bobbo197bobo37b3obo$43bo20boo19bo3bo15booboobooboo23b o22bobbo11boobboo6boobboo11bobobbooboobbobo15b3o3b3o198boo34boo3bobobo $16boobobboboo12boobo3boboo10boobo4boboo10boobo5boboo45boo18bobobobo 11bobbo10bobbo12bo4bobo4bo219boo8boo28boo4bobbo$16bo8bo12bo9bo10bo10bo 10bo11bo13boo3boo23boo15booboboboboo13bobo3bobbo3bobo14b4o3b4o16boboo 3boobo191bobo10bobo33boo$17boo4boo14boo5boo12boo6boo12boo7boo8boo15boo 18bo15boboobobbo14boobobob4oboboboo40boobo3boboo190boboo10boobo25boo$ 14b3obb4obb3o8b3obb5obb3o6b3obb6obb3o6b3obb7obb3o5bobbo3bobobo3bobbo 17bo22bobo18boo6boo17boo7boo217bo6bobbo6bo25boo$14bobbo6bobbo8bobbo7bo bbo6bobbo8bobbo6bobbo9bobbo6b3ob9ob3o18boo22bo21boobboo19boo7boo218boo bb3obb3obboo$15boo8boo10boo9boo8boo10boo8boo5bo5boo10bo4bo4bo67bobbobo 250bobo6bobo$86b3o15boo9boo67boo253bobbo4bobbo$104bo11bo323boo6boo$ 105bo9bo$104boo9boo$285boo5boobo30bo25bo$286bo5boboo19boo9bo25b3o7boo$ 285bo10boo17b4obo3bo3bo7boo17bo6bo$181bo103boo9bo18bobobb3obb3o4bob4o 16boo4bobo107boo13boo$180bobo25bo88bo27b3obb3obbobo22boo104boobobboboo 5boobobboboo$156boo22bobo25bo7bo68boo9boo21boo36boo107boobbo4bo5bo4bo bboo$156bo20booboboo29bobb3o3boo62bo5boobo23bo12boo23boo112bo13bo$43bo 20boo19boo23bo50bo15boboo4bo20bo3bobb3o3bobbo62bo6boboo37bo23boo113bob o7bobo$19bobbo18bo3bo16bo4bo15bo4bo65b6obo19b3obo18b3obob3o4boobobo62b oo3boo32boo27boo86boo9boo$107boo3boo40bo26bo21bo4bo4b4obobobboo65bo28b oobo4boboo21bobo4boo80bobo7bobo15boo4boo3boo4boo$82bobobbobo17b7o41boo boo3boo17b3obboo14booboob3o8boobo61boo4bo27bo10bo21bo6bo83bo7bo17boo4b oo3boo4boo$17b8o14b9o12b10o10b4oboob4o64bobo4bobo19bo21bobo3boobobo4bo 62bo3boo28boo6boo21boo7b3o80boobbobboo17boo15boo$17boo4boo14boo5boo12b oo6boo7bobo4bobbo4bobo12bo5bo42bobo6bo16boobobobo17bobobo4booboboboo 60bo6boobo21b3obb6obb3o29bo83bo23bo4boo3boo4bo$16boo6boo12boo7boo10boo 8boo6booboobo4bobooboo8boobobo3boboboo39bo7boo15boobobob3o14boobob4o6b obo61boo5boboo21bobbo8bobbo110b3o3b3o17bobo3boo3boo3bobo$16bo8bo12bo9b o10bo10bo9bobo6bobo11bo4booboo4bo68boo4bo17bo4b6obbo94boo10boo110bo9bo 15boobo13boboo$77boobobo6boboboo5booboboobooboobooboboo67b4o20bobbobbo 4boo217booboobooboo$15bobo6bobo7boobb3o5b3obboo5bobo8bobo5boobo10boboo 5bobbobbo7bobbobbo67bo22boo233bobo$14bobbo6bobbo6bobboboo5boobobbo7bo bbobbobbo10bobob4obobo9bobboo9boobbo69bo256bobo20boo15boo$14bo12bo7bob obo7bobobo5boobb3obb3obboo7bobo6bobo10boo4bo3bo4boo69boo185b3o69bo21b oo15boo$14bobo8bobo6booboo9booboo6b3o6b3o8boobob4oboboo10bob4o3b4obo 258bo$14boobboobboobboo5bobbo3b3ob3o3bobbo9bobbo12bobb3obb3obbo10bobo 9bobo$11bo5bob4obo5bo3boboboo7boobobo6bobo6bobo10bobb4obbo10boobbobbob obobbobboo254booboo$11b7obobbob7o4bobbobo5bobobbo6boobob4oboboo8boobo 4boboo10bobo3bobobo3bobo252boo7boo$19bobbo18bobobo15boo4boo11bobbo4bo bbo9bobb3o3bo3b3obbo251bo9bo$13booboo6booboo8b4obbobb4o8boo4boo4boo9bo bbobbobbo11boobbobb3obbobboo253b9o$14bobo8bobo10bob7obo11b4obb4o12boo 4boo14booboo3booboo$14bobo8bobo8bobo9bobo9bobbobbobbo34bobbo5bobbo199b obobo51b9o$15bo10bo7b3obobbooboobbob3o6b3obboobb3o30booboboo5booboboo 196bobobo11b3ob3o32bo9bo$33bo5bobbobobbo5bo5bobboobboobbo30bobobooboob ooboobobo196bo3bo4bo3boo4bo35boo7boo$34boboobobo3boboboobo7boob4oboo 33bo4bo3bo4bo199bobo5boob3oboo3boo35booboo$35boobobo5boboboo51boobobo 3boboboo198bo3bo4bo3boo4bo116bo15bo$39bo7bo12boobboobboo38booboo203bob obo11b3ob3o37bo75boo13boo$60bobbobbobbo32boboobo5boboobo197bobobo54b3o 8boo3boo59boo13boo$62boobboo34boobobo5boboboo242boo3boo18bobobobo60bo 13bo$106bo7bo246bobobobo19bo3bo64boo5boo$362bo3bo$137boobo33bobbo204bo bobo5bobobo57bo11bo$137boboo23boo12bo178bobobo5bobobo4b3ob3oboboo3boob ob3o55bo11bo$135boo4boo9boo10boo13boo16boo26boo22booboo101b3oboboo3boo bob3o4bo3bobobo5bobobo58boo7boo$135bo5bo8bobbo19boboo6bo26booboboo7bo 24booboo103bobobo5bobobo5boo64b3o29b3o$136bo5bo30bobbo3bo15bo3bo12bo 11bo3bo157bo3bo52b3o10boo3boo10b3o$135boo4boo7bobbo9b3o6bo3bob3o14bo4b o9bo5bo8bo3boo16b9o106bo3bo19bobobobo56boo5bo7bo5boo$137boobo10bobbo7b o8bo11bo10bobobo12b5o11bobo16bo4bo4bo104bobobobo18boo3boo58bo17bo$137b oboo11bobo6boobbo8b3obo3bo10bobobo28boo3bo15b3o3b3o105boo3boo8b3o68bo 3bobbo11bobbo3bo$135boo4boo10bo7bobo10bo3bobbo9bo4bo30bo3bo17bobobo 123bo69bo5bo13bo5bo$135bo5bo29bo6boobo9bo3bo14b3ob3o15bo220bo13bo$136b o5bo9boo20boo54boo143booboo$114bo20boo4boo9boo6boo14bo16boo177boo7boo$ bboboo81boo6boo16bobo21boobo19boo15bobbo133b3o17bobooboobo29bo9bo$bboo bo60boo18bobo6bobo15bobo21boboo108bobobo61boo17booboboboo30b9o71bo13bo $oo64bobbo16bo10bo11booboobooboo127b3o3b3o58boo131bo5bo13bo5bo$bo16boo 12boo15bobbo14bobo13boobo10boboo8bo4bo4bo126bo4bo4bo58bo18b3o3b3o30b9o 65bo3bobbo11bobbo3bo$o15bo4bo9bobbo9bobbobobbobobbo25boobobobboobbobob oo9b3o3b3o128b9o55boo21bobbobobbo29bo9bo68bo17bo$oo14bo4bo8bo4bo8b14o 11bobo14bobobobbobobo14bobobo195boboo20booboo31boo7boo66boo5bo7bo5boo$ bboboo10bo4bo7bo6bo49bobobobbobobo151booboo60bo60booboo64b3o10boo3boo 10b3o$bboobo11bobbo8bo6bo7b14o13bobo9boobobobboobboboboo148booboo60bo 11boo3boo11boo3boo92b3o29b3o$6boo7bobobbobo7bo4bo8bobbobobbobobbo25boo bo10boboo12bobobo107bo100boobbobboboo3boobobbobboo26bo77boo7boo$7bo7b oo4boo8bobbo14bobbo20boboo9bo10bo13b3o3b3o105b3o102bobobboo3boobbobo 29b3o75bo11bo$6bo25boo52bobo6bobo12bo4bo4bo107bo77boo3boo18bo13bo108bo 11bo$6boo67bobo9boo6boo13booboobooboo57boo15bo31boo9boo66boobbobboboo$ bboboo70boo36bobo41boo22boo10boo42bo71bobobboo14bo13bo110boo5boo$bboob o108bobo37boobobbo16boobobbo9boboo14b3o22bobo72bo18bobobboo3boobbobo 106bo13bo$115bo38bo3bobo17bob3o9b3obbo13b3o15b3o4boo88boobbobboboo3boo bobbobboo101boo13boo$156boobo19bo14bobobo12b3o14bo3bo75bo17boo3boo11b oo3boo101boo13boo$152b4obo16bo4b4o12bobobo8b3o16bo5bo74bo143bo15bo$ 151bo6bo13boboo3bobbo13bobb3o6b3o17bo3bo74boobo25booboo$154bob3o13bo3b 3oboo15boobo7b3o12boo4b3o78boo22bobbobobbo$154boo18boobobo18boo3bo18bo bo82bo26b3o3b3o$55bo21boo76boboo16bobobo18bo4boo17bo84boo$17bobbo34bo 41boo10boo42boboboo14boboboo24bo17boo9boo72boo26booboboboo$35bo39bo4bo 14bo3bo10bo42boo18boo57bo73b3o25bobooboobo$16bo4bo11bo3bo12bobbobobobb o38bo10bobo120b3o$14b3oboob3o26b11o9bobboboboobobo11bobboboboo8boo4boo 116bo$13bo3bobbo3bo7bo5bo31b4oboobboob3o7b3oboobobbo15bo$14b4obb4o6b3o b3ob3o8boboo5boobo14b4o5bo5bo3bobbobo13b4o$29bo3booboo3bo6boboobo3bob oobo9boobo4boboobo6boboo3bo15bo$14boobobboboo5bob3obob4o7bo4bo3bo4bo9b obbo4bobboboo4boobo21boo$14bo8bo6bo18b3obooboob3o11bo3boobboo4bo8bo20b o$15b3obb3o9boboboboobo8bo3bobo3bo9b3obb3obbobob3o8boo19bo$17bobbo10b oob3oboboo6bo3boo3boo3bo7bobb4o4bobbo31boo$13b4oboob4o7bobobbo10b4oboo boob4o8bobobboobobobo$13bobbo4bobbo7bobboo14bo7bo12bo5booboboo123bo$ 31boo15booboboboboboboo13boobobo92bo23boo8b3o$17bobbo27boobobobobobob oo13b4obo91bobo21bobo11bo$52b3ob3o21bo67boobboo3boo15bo22bo8b3obbo20b 3o$54b3o19boo70boboboobbobo35booboo6bo3boboo$74bobbo71bo7bo14b5o17boob o7bo3bobo$73bobbo26bo49bo17bo4bo20boboobbobobboobo14boobo7boboo$70bobb oobobo3boo18bobo13boo33bo16bobbo23bobo3bo7boboo11bo13bo175boobo5boobo$ 70b3o3bobobobbo19bo13bobbo31b3o12bobboboo22boobo3bo6booboo12boo9boo 176boboo5boboo$73boo5b3o31bo3bobo45bobobo4boo20bobb3o8bo12b3obb9obb3o 44boo3boobo11bo15bo96boo7boo14boo5boo$72bo3b3o22b5o6b7oboo45bobbo3bobb obboo15bo11bobo12bobbo11bobbo45bo3boboo10bobo13bobo95bo8bo15bo7bo$72b 3o4boo20bo4bo4bo8bo49boobbobo4bobbo13b3o8boo14boo13boo45bo8boo8bobo13b obo96bo8bo11boobo7boboo$19bo15boo33boo3boboobbo20boobobo3boboo5bo30b5o 19bo5bobobo14bo86boo7bo7b3oboo11boob3o93boo7boo11bobboo5boobbo$18bobo 14boo19boo13bobobbobobo21bobbobo4bobo5bobo27bob3obo21boobobbo47b3o62bo 5bo23bo88boobo5boobo14boo3bo5boo$18bobo34bobo11bobbob3oboboo15boo3boo bbo7bo5boobo26bobobobo21boobo105boo7boo6b3oboo11boob3o89boboo5boboo16b oo3b4o$17booboo30bobboboo10boobobobobobbo12bobbob3o12bo8bo25booboboboo 17bo4bo107bo3boobo10boboo11boobo89boo7boo20bo7bo$15bo7bo11b3obboo9bobo bo3bo12bo6boo12bobobobobo11boob7o25bobbooboobbo16b5o107bo4boboo17bo3bo 96bo8bo22b7o$15b3o3b3o7boobo6bo10bobbo3b3o10b4oboo15bobbo16bobo3bo27b oo7boo128boo7boo16bobo98bo8bo$29bobbobo4boboboo10bo5bo16bo18boboo13bo bbo59bo118bo16booboo96boo7boo23b3o$15b9o5boobobo4bobobbo11b5o11b6o20bo bbo13boo59bobo108boo8bo13bobbobobbo96boobo5boobo19bobbo$15bo7bo8bo6bob oo29bo26boo76bo110bo7boo12bobobobobobo95boboo5boboo21boo$18b4o10boobb 3o19bo14b3o211bo4boobo14boobbobobboo$18bobboo34bobo15bo211boo3boboo18b obo$58bo256bo$37boo$37boo! golly-3.3-src/Patterns/Life/Oscillators/traffic-light-hasslers.rle0000644000175000017500000011114613451370074022251 00000000000000#C Traffic-light hasslers. #C There is an unusual proliferation of oscillators engineered this #C way, because there are so many ways to perturb a traffic light in #C such a way that it reappears somewhere nearby. #C This collection is split into two parts: #C The top contains standard traffic light hasslers. #C The bottom contains "pre-pulsar" hasslers. #C A pre-pulsar is a pair of pre-traffic lights whose centers are #C 5 cells apart. If left to evolve, they would not form traffic #C lights, but would instead form the period-3 pulsar oscillator. x = 833, y = 629, rule = B3/S23 746b2o4b2o52b2o4b2o$746bobo2bobo52bobo2bobo$748bo2bo56bo2bo$747b2o2b2o 54b2o2b2o$746b3o2b3o52b3o2b3o$748bo2bo5b4o47bo2bo5b4o$756bob2obo54bob 2obo$756b2o2b2o54b2o2b2o$756b2o2b2o54b2o2b2o$751bo4bob2obo49bo4bob2obo $751bo5b4o50bo5b4o$381b2o348b4o16bo59bo$67b2o311bo2bo147bo2bo4bo2bo12b o2bo4bo2bo163bob2obo$68bo7b2o302bobobo144b3o2b6o2b3o8b3o2b6o2b3o161b2o 2b2o11b3o3b3o51b3o3b3o$54bo11bo5b2o2bo2bo4bobo294bob3o145bo2bo4bo2bo 12bo2bo4bo2bo163b2o2b2o$33b2o19bo11b2o4bobobob2o3bob2o270b2o24b3o344bo b2obo15bo59bo$6b2o3b2o3b2o15bobo18bo18bo2bo6bo78b2obo6bob2o49bo5b2o3b 2o9b2o62b2o3b2o4b2obo27b2o2b2o2b2o139b2obo6b2obo173b2o4b2o5b2obo25b4o 16bo59bo$7bo3b2o3b2o17bo27bo12bob2o2b2ob4o73bob2o6b2obo47b3o5bobobobo 5b3o2bo62b2o3b2o4bob2o27b2o2bo2bobo139bob2o6bob2o174bo5bo5bob2o45bo59b o$6bo23bo2bob2o5b2o6b2o11bo4bo7bobobo2bobo3bo76b2o2b2o50bo10bobo10b2o 72b2o4b2o31b3o138b2o8b2o4b2o16b2o2b2o18b2o2b2o125bo5bo4b2o4b2o$6b2o3b 2o3b2o12b4o2bo3b2o2bo4bo2b2ob3o5bo2b2ob2o3bobobob2o3bobobo76bo4bo41b2o 7b2o8b2ob2o5bo68b2o3b2o2bo5bo32b2o19b3o117bo9bo5bo18bo2bo20bo2bo126b2o 4b2o3bo5bo18b2o2bo65bo$11bobobobo16bo6b5o2b5o2bobo8b2o3bo2b3o4bo2bob3o 78bo2bo43bo27bo68bobobobo3bo5bo37b3o12bobo5bo112bo9bo5bo14b2obo2bob2o 5b3o6b2obo2bob2o135bo5bo17bo2b2o4b3o49bo8bo$6b2o5bobo14b4o2bo3b2o2bo4b o2b2ob3o7bo5bo8b2o84b2o2b2o42bobo29b2o65bobo4b2o4b2o13bo23bobo12b3obo 115b2o8b2o4b2o14bo2bo2bo2bo5bobo6bo2bo2bo2bo123b2o4b2o3b2o4b2o18b5o3bo bo12b3o19bo14bo8bo10b2o20bo2b2o$7bo4b2obo13bo3bob2o5b2o6b2o14b2o3bo2b 3o4bo2bob3o73b2obo6bob2o39b2o26b3o2bo63b2obo4bo5bo38b3o18bob3o111b2obo 4bo5bo16b2o4b2o6b3o7b2o4b2o125bo5bo3bo5bo25bob3o12bobo19bo14bo5bo12bob o20b2o2bo$6bo9b2o9bo2b3o2bo27bo2b2ob2o3bobobob2o3bobobo72bob2o6b2obo 26bo7bo8b3o8b3o3b3o8b2o67b2o3bo5bo11bob3o44b2obo110bob2o5bo5bo171bo5bo 5bo5bo41b3o6b3o10bo16b2ob3o3b3o8b2o8b3o6b5o$6b2o9bo9b2obob2obo18bo8bo 4bo7bobobo2bobo3bo70b2o14b2o10b2o2bo8bobo5bobo7bobo8bobo3bobo78bo2b2o 4b2o13b2obo43bob2o108b2o4b2o2b2o4b2o171b2o4b2o3b2o4b2o18b5o51b3o3b3ob 2o13b3o$16bo13bo3bob2o16bo8bo12bob2o2b2ob4o71bo16bo10bo2bobo8bo7bo8b3o 8b3o3b3o8b2o67bo3bo5bo14bob2o44b3obo106bo5bo3bo5bo183bo5bo18bo2b2o26bo 5bo4b3o3b3o13bo5bo12b2o6bo5bo$6b2o8b2o12bo3bobo17bo18bo2bo6bo77bo14bo 12bobobo49b3o2bo67b2o3bo5bo14b3obo18b3o133bo5bo3bo5bo171b2o4b2o4bo5bo 17b2o2bo26bo5bo23bo8bo11b2o7bo5bo4b5o$7bo9bo10b2o2bobobo29b2o4bobobob 2o3bob2o73b2o14b2o10b2obob2o51b2o69bo2b2o4b2o20bob3o12bobo23bo108b2o4b 2o2b2o4b2o172bo5bo3b2o4b2o48bo5bo8bo14bo8bo11b2o7bo5bo5b2o2bo$6bo9bo 12bob4o2b2o27bo5b2o2bo2bo4bobo75b2obo6bob2o11bo3b2o3bo45bo73bo5b2obo 18bo5bobo12b3o134b2obo6b2obo173bo5bo6b2obo65bo14bo20b3o18bo2b2o$6b2o8b 2o11bobo3bobo30bo7b2o84bob2o6b2obo10bob2o2b2o8b3o3b3o8b3o8bo7bo3bo73b 2o4bob2o24b3o19b2o128bob2o6bob2o173b2o4b2o5bob2o52b3o10bo32bo2b2o9b3o$ 28b2ob2ob2obo29b2o117bobo2bobo3bo4bobo3bobo8bobo7bobo5bobo6b2o123b3o 168bo2b2o4b2o2bo249b2o2bo$29bo2bo3bo150b3o2b2o8b3o3b3o8b3o8bo7bo4b3o2b o121bobo2bo2b2o161bo3b3o2b3o3bo247b3o16b4o$29bobob3o155b2o3bo27b2o21b 2o121b2o2b2o2b2o162bo2b2o4b2o2bo249b2o15bob2obo$30bob2o151b5obob2o29bo bo120b3o24b2o429b2o15b2o2b2o$35b3o147bo2bo2bobo32bo120b3obo395b3o54b2o 16b2o2b2o$28b7o2bo152bo2bo10b2ob2o8b2o7b2o120bobobo375b4o72b3o15bob2ob o$28bo2bo2bo156b2o12bobo10bo130bo2bo374bob2obo12bo5bo52b2o17b4o$203bob obobo5b3o132b2o375b2o2b2o12bo5bo54bobo$203b2o3b2o5bo511b2o2b2o12bo5bo 54b2o$727bob2obo$728b4o15b3o$735bo$735bo55b3o$722b2o2bo8bo35bo10b3o21b 3o$722bo2b2o44bo17bo5bo$402b2o7b2o310b5o3b3o3b3o18b3o10bo8bo5bo2bo5bo 8bo5bo14bo2b2o$402bo2b2ob2o2bo330b3o34bo5bo2bo5bo8bo5bo5bo8b2o2bo$403b 2obobob2o323bo20bo5bo4b3o3b3o4bo5bo17bo5bo5bo7b5o$404bo5bo127b2o183b5o 7bo5b2o2b2o9bo5bo28b3o22bo$404bob3obo126bobo12bo169bo2b2o8bo4bob5o9bo 5bo8bo10b3o21b3o$405bo3bo127bo13b3o168b2o2bo13bo4b2o24bo40b3o3b3o3b5o$ 368b2o53b2o107bob2ob2o4b2o5b3obo186b5obo10b3o10bo53b2o2bo$56bo6b2o2b2o 9b2o2b2o6bo276bo2bo28b2o4bo3bo12bo2bo106b2obo2bo3bobo6bo3bo186bo3b2o 68bo8bo2b2o$56b3o5bo2b2o9b2o2bo5b3o276bobobo27b2o4bo3bo12bobobo110bo3b o10bo3bo189bo69bo$32b2o4b2o19bo3bo19bo3bo280bob3o50bob3o108b2obo3bo9bo b3o183bo74bo$32bobo2bobo18bo2bo2b7o5b7o2bo2bo281b3o24b6o3b3o16b3o108b 4o3bo10b3o183b2o3bo56b3o15b4o$5b2o5bob2o18b4o20bo3b2o2bo4bo3bo4bo2b2o 3bo260b2o45bo6bo135bob3o4b2o5bo184bob5o72bob2obo$6bo5b2obo16bo2b2o2bo 19b2o4bo3bobo3bobo3bo4b2o260bobo45b2o3b2o133bobo3b2o2bo3bo190b2o4bo52b o5bo12b2o2b2o$5bo4b2o20bo2b2o2bo23b3o3b2o5b2o3b3o109b2o153b2o24bo25bo 28bo109bob3o6bo190b5obo52bo5bo12b2o2b2o$5b2o4bo22bo2bo25b2ob2o11b2ob2o 80b2obo4bob2o18bo14b2o156b3o4bo47b3o4bo72bob2o6b2obo20b4o3bo2bo3bo190b 2o2b2o53bo5bo12bob2obo$10bo30b2ob2o21bo11bo84bob2o4b2obo18bobo12bobob 2o97b2o3b2o2b2o3b2o24b3o12bobo3b3o23b3o5b3o12bobo3b3o71b2obo6bob2o20b 2obo3bo4b2o270b4o$5b2o3b2o13b2o2bo15bo122b2o6b2o17b2o14bobo98b2o3b2o2b 2o3b2o24bobo12b3obo27b3o5bobo12b3obo79b2o8b2o19bo3bo192b4o4b3o49b4o4b 3o$6bo5bob2o9bo2bobo9bo2b2o24b3o3b3o90bo8bo33bobo138b3o41b2ob3o5b3o97b o8bo15b2obo2bo3bobo188bob2obo54bob2obo$5bo6b2obo10bob2o4b3o4b3o25bobo 3bobo91bo6bo34bobob2o95b2o3b2o2b2o3b2o68bo2b3o104bo10bo14bob2ob2o4b2o 13b2o173b2o2b2o54b2o2b2o$5b2o9b2o9bo6bobo4b3o25b3o3b3o90b2o6b2o12b2o7b 3o7bobobo2bo95bobobobo2bobobobo44b5o20bob3o25b5o74b2o8b2o19bo22bo172b 2o2b2o54b2o2b2o$17bo10b2o4b3o3bo2b2o119b2obo6b2o14bobo6bobo8bo3b2o98bo bo6bobo45bob3obo16b3o2b3o24bob3obo71b2o6b2obo21bobo11b3o3bobo173bob2ob o54bob2obo$5b2o9bo12bo15bo21bo11bo84bob2o7bo16bo6b3o9b3o99b2obo5b2obo 45bobobobo16bo4b3o24bobobobo72bo6bob2o22b2o11bobo4bo9b2o164b4o5bo2bo 47b4o5bo2bo$6bo9b2o9bo13b2ob2o17b2ob2o11b2ob2o78b2o10bo17b3o9b3o6bo 103b2o7b2o42b2obobob2o46b2obobob2o70bo5b2o39b3o14bobo170b3o2b3o52b3o2b 3o$5bo6bob2o11b2o34b3o3b2o5b2o3b3o78bo11b2o14b2o3bo8bobo6bobo102bo8bo 24b3o14bo2b2ob2o2bo20bo16b2o8bob2o2bo70b2o4bo59bo171b2o2b2o54b2o2b2o$ 5b2o5b2obo18bo2bo21b2o4bo3bobo3bobo3bo4b2o75bo8b2o15bo2bobobo7b3o7b2o 101bo8bo22b3o3b3o11b2o7b2o16b2o3b2o6b6o2bobo7bo3bo70b2o7bo51b2o4b2ob2o bo167bo2bo56bo2bo$32bo2b2o2bo18bo3b2o2bo4bo3bo4bo2b2o3bo73b2o9bo15b2ob obo122b2o7b2o15b2ob3o9b3ob2o32bo6bo4bob5obo2bo6b2o3b2o70bo6b2o51bobo3b o2bob2o165bobo2bobo52bobo2bobo$32bo2b2o2bo18bo2bo2b7o5b7o2bo2bo75b2obo 4bo19bobo123bo8bo14bob4o2b2o3b2o2b4obo32b6o8b7ob2o81bo9b2obo40bo9bo3bo 170b2o4b2o52b2o4b2o$34b4o21bo3bo19bo3bo76bob2o4b2o18bobo14b2o106bo8bo 15bobo2bo11bo2bobo42bobo8bo83b2o8bob2o39b3o6bo3bob2o$32bobo2bobo16b3o 5bo2b2o9b2o2bo5b3o100b2obobo12bobo105b2o7b2o13b2o2b3obobo3bobob3o2b2o 33b2o6b2o6b2obo136b2obo5bo3b4o$32b2o4b2o16bo6b2o2b2o9b2o2b2o6bo104b2o 14bo129bo2bo4bo2bobo2bo4bo2bo33bo7bo7bobob2o136b3o4b3obo$211b2o129b2ob 3obobo3bobob3ob2o32bobo2b2o3bo6b2obobo138bo5b2o3bobo$343bobobobo2b2obo bobobobo33b2o3bo5bo3b2o2bo2bo132bo4bo6b3obo$343bo2bobob2o2bo3bobo2bo 39b2ob2o3b3o2bobo145bo3b4o$340b2obo5bo2bo10bob2o34bobo10bob2o132bob3o 9bo3bob2o$340bo2bobob2o2bo4b4obobo2bo33bobo11bo137b2obo10bo3bo$342b2ob 2o2b2o4bo4b2ob2o35bobob2o7b2o137bob2o7bobo3bo2bob2o$344bobobo7b3obobo 35b2o5bo147b3obo5b2o4b2ob2obo$344bobobo9bobobo34bo2b5o165bo$345bobo11b obo35b2o3bo152bo12bobo$346bo13bo207b2o4$742b2o$742b2o$38b2ob2o200b2o$ 38bo3bo200bobo479bo$5b2o5b2obo23b3o203bo2b2o475bo16b3o$6bo5bob2o228b2o bobo475bo11b2o2bob2o$5bo4b2o4b2o19b7o203bo469b2o6b2o10b2o2b2o$5b2o3bo 5bo20bo2bo2bo118b2obo6b2obo69b3o8b2o458bobo9bo12b2o$11bo5bo13b2o15b2o 112bob2o6bob2o64b2o6b2o5bo2bo428b2o3b2obo6b2obo10bobob2o2bo4bo$5b2o3b 2o4b2o9b2obob4o9b4obob2o112b2o2b2o4b2o62b4ob2o3bo4bobobo428bo3bob2o6bo b2o11bobobo7bo$6bo5b2obo11b2obo2b2obo2b3o2bob2o2bob2o112bo3bo5bo69b5o 3b2obobo427bo8b2o8b2o11bo5b3o$5bo6bob2o14bo4bo3bobo3bo4bo116bo3bo5bo 14b3o18b3o31b3o3bo2bobob2o425b2o7bo9bo10bo2bo26bo$5b2o3b2o4b2o12b2o7b 3o7b2o115b2o2b2o4b2o13bo3bo16bo3bo23b3o9b3o3bo2bo300b2o133bo9bo12bo26b o$10bo5bo145b2obo4bo5bo13bo5bo2b3o4b3o2bo5bo14b3o12b3o3bo2bobo2bob2o 297b2o123b2o7b2o8b2o8bo3bo26bo$5b2o4bo5bo16b2o9b2o115bob2o5bo5bo21bobo 4bobo23bobo11b5o3b2o4b2o2bo83bo7bo39bo7bo283bo3b2obo6b2obo10bo3bo5bo 19b2o$6bo3b2o4b2o16bo2bo5bo2bo119b2o2b2o4b2o11bo7bob3o4b3obo7bo13b3o5b 4ob2o3bo4bobo4b2o83bobo5bobo37bobo5bobo154b6o121bo4bob2o6bob2o14bo4b2o 17bo$5bo6b2obo150bo3bo5bo12bo7bo12bo7bo21b2o6b2o5bobobobo86bo7bo9b2o 17b2o9bo7bo154bo6bo120b2o7b2o2b2o15bo2bo5bo7b3o6bo4bo$5b2o5bob2o151bo 3bo5bo67b3o8bo4bo104bo19bo153b2ob2o14b2o2b3o9b2o119bo3bo18bo14bobo6bo 9b2o$34bob2o5b2obo119b2o2b2o4b2o12bo5bo14bo5bo29bo9b4o103bobo19bobo 151bo3bo30bobo109b2o8bo3bo15bobobo12b3o8b3o5bobo$29b2o2bobo9bobo2b2o 110b2obo6b2obo15bo3bo16bo3bo27b2obobo9bo104b2o21b2o153b2o4b2o5b2o6bo 12b2o110bo7b2o2b2o14bobob2o28b2obobo$29bo4bo11bo4bo110bob2o6bob2o16b3o 18b3o29bo2b2o11bo81bo17bo29bo17bo124b2o2b4obobo3bo6b3o4bo2bo120bo4b2ob o6b2obo10bobo5b3o23bobobo$33bo13bo182b2obob2o6bobo14b2o81bo17bo29bo17b o123bobo2bo2bobob4o5bo4bo3bo7b3o113b2o3bob2o6bob2o11b2o9bo16b2o5bo$30b o2bo13bo2bo177b3obobob3o4b2o68b2o3b2o2bob2o17bo5bo5bo5bo29bo5bo5bo5bo 92b2obo6b2obo17bo9b2o4b3obob4o2bobo2bo4bobo149bo4bo15b3o3bo2bo$227bo 11bo73b2o3b2o2b2obo13b2o7b3o3b3o13b3o7b3o13b3o3b3o7b2o88bob2o6bob2o14b 2obo7b8o2bobo3bo3bobo7b3o153bo15b5o5bo$228b4obob3obo86b2o10bobo6b2ob2o b2ob2o12bobo7bobo12b2ob2ob2ob2o6bobo85b2o4b2o8b2o13bobobo4b3o5bo4bo4b 2ob3o2bo23bo3b2o128b2o18b3o2bo3bo$232b3o3bo74b2o3b2o7bo10bo9b3o3b3o13b 3o7b3o13b3o3b3o9bo85bo5bo9bo14bobobobo6bo7bo3b3o2b3o25bobo2bo129bo20b 2o2bo3bo$227bob2obobobo76bobobobo6bo10b2o10bo5bo41bo5bo10b2o85bo5bo9bo 14bobo7bobob2obo3b2obo31bobo4bo128bo28bo$227b2obobobob2o77bobo8b2o172b 2o4b2o8b2o16bobobobobobo3bo5b2ob2o3b3o22bo2bo3b2o2b2o7b2o115bo25bo2bo$ 231bo2bobo77b2obo6b2o18b2o13b2o31b2o13b2o93b2obo6b2obo18bobo3bobo2b2ob ob5o4bo2bo23bo3bobo3b3obo6bo136b3o5bo$232b2o2bo81b2o5bo18b2o13b2o31b2o 13b2o93bob2o6bob2o19bob4obo4b2obo2b2o6bo21b5obo2b4o4b3o6bo132bo7bobobo $236b2o81bo4bo181b2o2b2o24bo6b3o4b2obo3bo3b2o22b3o4bo4b2o4bob4obo131bo 4bo2b2obobo$318bo5b2o11b2o10bo5bo41bo5bo10b2o90bo3bo27bo6bob3o5bob2o 23bo2b3o5bobobob2o2bobo3bobo117b2o12bo9bobo$318b2o2b2o14bo9b3o3b3o13b 3o7b3o13b3o3b3o9bo92bo3bo25b2o7b2o2b2o6bo23bo4b2o3bo2bobobobobobob2o2b o117b2o2b2o10b2o6b2o$319bo3bo14bobo6b2ob2ob2ob2o12bobo7bobo12b2ob2ob2o b2o6bobo91b2o2b2o38bo3bo2bo23bo2bo6b4o4b3ob2o2b2o2bobo113b2obo2b2o11bo $318bo3bo16b2o7b3o3b3o13b3o7b3o13b3o3b3o7b2o88b2obo6b2obo35bo2bobo24b 4ob4o3bo2bo3bo3bo7bobo112b3o16bo$318b2o2b2o19bo5bo5bo5bo29bo5bo5bo5bo 92bob2o6bob2o34b2o3bo25bo2bo3b2o2bo3bo7bo4b2obobo131bo$343bo17bo29bo 17bo162b3o5bo2bo2bo3bobobo2bob2o3b2o5b2ob2o$343bo17bo29bo17bo162bobo5b o4bob4obob3o4bob3o6bo115b2o$364b2o21b2o183b3o5bo5bo4bo5b4o3bo2bo2bobo 115b2o$32b2o9b2o31b2o9b2o275bobo19bobo192bobo3b3o6bo3bobob4o2b2o$31bo 2bo7bo2bo29bo2bo7bo2bo276bo19bo181b2o11bobo5b2o5b2o4b2o$31b3o9b3o29b3o 2b5o2b3o258bo7bo9b2o17b2o9bo7bo163bobo10bo19bo3bo$2b2obo6b2obo13b2o3b 9o35b2o5b2o260bobo5bobo37bobo5bobo163b2o9b2o3b2o14b2ob2o$2bob2o6bob2o 12bobo2bo2b5o2bo4b2o27bo9bo260bo7bo39bo7bo174bo3bo2bo$6b2o2b2o4b2o10bo bobobo2b3o2b2o3bo2bo17b2o7b2obo3bob2o492b6o$6bo3bo5bo12bobobo13bobo2bo 2bo12bobo11bo14b2o$7bo3bo5bo13bo14b2obob5o14b3o23bobo483b2o$6b2o2b2o4b 2o12b2o13bo2b2o19bo3bob2o5b3o9b3o485b2o$2b2obo4bo5bo12b3o7b3o2b3o3b2ob o15b2obo5bo3bobo8bo3bo94b2o3b3o3b2o$2bob2o5bo5bo11b3o7bobo2b3o2b2obobo 17bo5bo3b3o4bo2bo2b3o93bobo9bobo16bobo$2o8b2o4b2o11b3o7b3o2b3o3b2o2bo 14b2obo5bo10b2obo98bo13bo19bo23b2o$o9bo5bo13b2o13bo2b2o3bo15bo3bob2o 12bo2bo2b3o64b2obo6b2obo12b2obo13bob2o12bo4bo2b2o18b2o$bo9bo5bo13bo14b 2obob2o17b3o20bo3bo64bob2o6bob2o12b2obobob7obobob2o12b2obo2bob2o$2o8b 2o4b2o11bobobo13bobobo16bobo23b3o69b2o8b2o13bobo9bobo19b2o20b6o$2b2obo 6b2obo12bobobobo2b3o2b2o3bobo2bo15b2o26bobo67bo9bo14bobo9bobo40bo6bo$ 2bob2o6bob2o12bobo2bo2b5o2bo4bo2b2o26b2o7b2o7b2o68bo9bo14bo3bobobo3bo 41b2o2b3o9b2o$29b2o3b9o36bo2b5o2bo76b2o8b2o84bobo$31b3o9b3o34b2o5b2o 73b2obo6b2obo74bo12b2o79b2o12bo$31bo2bo7bo2bo31b3o9b3o70bob2o6bob2o74b o2bo89bobo11b2o$32b2o9b2o32bo2bobo3bobo2bo74b2o2b2o21b2o2b3o2b2o23b3o 16bo3bo7b3o12b2o68bo12bob2o233b2o$78b2o4bo4b2o75bo3bo22b2o2bobo2b2o18b 2o3bobo3b2o11bo3bo2bo4bobo11bobo63bob2ob2o4b2o4b3o2bo231bobo12bo$167bo 3bo25b3o22b2o3b3o3b2o11bo3bo7b3o9b3o65b2obo2bo3bobo6bobobo230bo$166b2o 2b2o78bo2bo15bo3bo70b2o2bo9bobobo224bob2ob2o4b2o5bob3o$162b2obo6b2obo 74bo14bo3b5o70b5obo8bo2b3o222b2obo2bo3bobo7b2obo114bo$162bob2o6bob2o 16bo5bo5bo17bo5bo5bo28b3o3b2o73bo3b3o9b2obo3b2o191b2o30bo3bo10bob2o 114bo5bo$191bobob7obobo15bobob7obobo10b2o2b3o12bo3b5o69bo6b2o9b2o4bo2b o171bo15bob2o29b2obo3bo9b3obo112bo5b3o$191bob11obo15bob11obo10bo6bo15b o3bo69b2o4b3o5bo3bo179bobo13bo33b4o3bo118b2o6b2o7bo$43b2o143b2obobo9bo bob2o9b2obobo9bobob2o8b6o17b3o70bo6b2o3bobo190bo11bo4bo28bob3o6bo4bo 105bobo9bo4b2o$28b2o11b3obo142b2ob2o11b2ob2o9b2ob2o11b2ob2o19b3o11bobo 69bo3b3o6bo9bob2o163b2o7bo4b3o5b2obo4bobo24bobo3b2o5bo82b2o3b2o3b2o2b 2o3b2o8bobob2o2bo4bo$28bobo9bo4bo31b2o21b2o89bo13bo15bo13bo13b2o7b3o 12b2o69b5obo11b2o2bobo164bobo6b2o7bo4b2o36bob3o4b3o82bo3b2o3b2o2b2o3b 2o9bobobo7bo$30bo3b2obo3bo3b2o2bo26bo2bo19bo2bo88bobo4bo4bobo15bobo4bo 4bobo13b2o7b3o83b2o2bo13bo4bo134b2obo6b2obo17bobob2o3b5o3b2o12bo26b4o 3bo5bob2o79bo31bo5b3o$30b2o7b2obo5bobo25b2obo19bob2o89b2o4bo4b2o17b2o 4bo4b2o20b3o80b2obo2bo3bobo15bo135bob2o6bob2o18bobobo3b2ob2o17b2o25b2o bo3bo6b3o79b2o3b2o3b2o2b2o3b2o9bo2bo26bo$32bobo7b7obo26bob2o17b2obo96b o29bo26b3o53b2o3b2o4b2obo12bob2ob2o4b2o12bo2bo133b2o4b2o2b2o24bo6bo17b 5o26bo3bo9bo85bobobobo2bobobobo12bo26bo$30b2obo3b3obo7bo22bo2bo5bo15bo 5bo2bo148b3o53b2o3b2o4bob2o17bo156bo5bo3bo24bo2bo22b2ob2o5b2o14b2obo2b o3bobo87b2o5bobo6bobo10bo3bo26bo$29bobob4o2bo2b2o3bo24b4obobo19bobob4o 213b2o4b2o15bobo11b3o141bo5bo3bo23bo28bo6bobo13bob2ob2o4b2o13b2o73bo4b 2obo5b2obo10bo3bo5bo19b2o$28bo7bo4b2obo2b2o28b3o19b3o209b2o3b2o2bo5bo 17b2o11bobo140b2o4b2o2b2o23bo3bo28b2obobo18bo22bo71bo9b2o7b2o12bo4b2o 17bo$29b7o5bobo4bo13b2o10b3obobo17bobob3o206bobobobo3bo5bo29b3o142b2ob o6b2obo19bo3bo2bobo23bobobo19bobo11b3o3bobo72b2o9bo8bo9bo2bo5bo7b3o6bo 4bo$31bo2bo5b2ob2ob3o13bobo9bo2bo3bobo11bobo3bo2bo208bobo4b2o4b2o174bo b2o6bob2o19bo5bo2bo25bo22b2o11bobo4bo9b2o72bo8bo12bo14bobo6bo9b2o$36bo 5b3o2b2o2bo11b2o10b2o4bobo2b2o3b2o2bobo4b2o208b2obo6b2obo180b2o2b2o4b 2o17bo2bo3bobo6b3o8bobo3bo2bo34b3o14bobo61b2o8b2o7b2o9bobobo12b3o8b3o 5bobo$35b2o2bo4bo3bo3bo29bo2bobo3bobo2bo219b2o4bob2o180bo3bo5bo19bo14b obo8bo2bo5bo53bo62bo9bo8bo8bobob2o28b2obobo$40b4o2bobo2b3o4b3o22b4o5b 4o221bo2b2o4b2o37b3o139bo3bo5bo16bobobo12b3o8bobo2bo3bo46b2o4b2ob2obo 56bo9bo8bo9bobo5b3o23bobobo$44b2o2b2ob3o4bobo23b2o7b2o221bo3bo5bo38bob o11b2o125b2o2b2o4b2o15bobob2o28bo3bo46bobo3bo2bob2o56b2o8b2o7b2o9b2o9b o23bo$40b4o2bobo2b3o4b3o27b3o225b2o3bo5bo37b3o11bobo120b2obo6b2obo17bo bo6bo28bo39bo9bo3bo97bo4bo16bo5bo2bo$35b2o2bo4bo3bo3bo35bobo226bo2b2o 4b2o53bo120bob2o6bob2o18b2o5b2ob2o22bo2bo38b3o6bo3bob2o100bo17b2o4bo$ 36bo5b3o2b2o2bo36b3o225bo5b2obo32bo2bo12b2o4b2ob2obo154b5o17bo6bo39b2o bo5bo3b4o97b2o19bo5bo3bo$31bo2bo5b2ob2ob3o12b2o20b2o9b2o220b2o4bob2o 32bo15bobo3bo2bob2o154b2o17b2ob2o3bobobo39b3o4b3obo100bo26bo3bo$29b7o 5bobo4bo12bo21b2o9b2o261bo4bo13bo2b2o161bo12b2o3b5o3b2obobo39bo5b2o3bo bo97bo26bo$28bo7bo4b2obo2b2o13b3o291bobo2b2o11bob5o168b2o4bo7b2o6bobo 33bo4bo6b3obo100bo26bo2bo$29bobob4o2bo2b2o3bo16bo289b2obo9bo6b3o3bo 159bobo4bob2o5b3o4bo7b2o46bo3b4o117b3o5bo$30b2obo3b3obo7bo33bo3bobobo 3bo111b2o4b2o152bobo3b2o6bo159bo4bo11bo46bob3o9bo3bob2o115bo7bobobo$ 32bobo7b7obo31bobo9bobo110bobo2bobo148bo3bo5b3o4b2o167bo13bobo41b2obo 10bo3bo116bo4bo2b2obobo$30b2o7b2obo5bobo31bobo9bobo112bo2bo141bo2bo4b 2o9b2o6bo163b2obo15bo42bob2o7bobo3bo2bob2o106b2o4bo9bobo$30bo3b2obo3bo 3b2o2bo29b2obobob7obobob2o108bo4bo142b2o3bob2o9b3o3bo164b2o61b3obo5b2o 4b2ob2obo106bo7b2o6b2o$28bobo9bo4bo33b2obo13bob2o108bo4bo146b3o2bo8bob 5o244bo112b3o5bo$28b2o11b3obo36bo13bo65b2obo6bob2o32bo4bo148bobobo9bo 2b2o229bo12bobo114bo5bo$43b2o37bobo9bobo65bob2o6b2obo34b2o151bobobo6bo bo3bo2bob2o236b2o121bo$83b2o3b3o3b2o70b2o2b2o48bo2b2o139bo2b3o4b2o4b2o b2obo$166bo4bo47bobo2bo140b2obo12bo$167bo2bo48bobobo142b2o11bobo$166b 2o2b2o22b2o22b2obob2o141bo12b2o$162b2obo6bob2o17bo2bo10b3o7bo3bo3bo$ 162bob2o6b2obo12bo2bo2bobo10bobo7bo4bobobo$166b2o8b2o10b5obob2o9b3o7bo 3b2o3bo$166bo10bo16bo3bo18bo4bob2o$167bo8bo13b2obo4bo18bo3bo$166b2o8b 2o11bo3b2o3bo7b3o9b2obob5o$162b2obo6bob2o13bobobo4bo7bobo10bobo2bo2bo$ 39b2o121bob2o6b2obo14bo3bo3bo7b3o10bo2bo$40bo8b3o139b2obob2o22b2o$39bo 10b2o140bobobo$39b4o6b2o140bo2bobo$7b2obo5b2o19b2o4bo6bo140b2o2bo360b 2o4b2o$7bob2o6bo15b2obobob3o3b2o156b2o350bobo2bobo$11b2o3bo16b2obo3bo 6bob2o151bo4bo350bo2bo$11bo4b2o18bobo10bo152bo4bo349b2o2b2o$12bo20b3o 13bo152bo4bo348b3o2b3o$11b2o3b2o14bo26bo143bo2bo351bo2bo$7b2obo6bo14b 2obo22bobo140bobo2bobo103bob2o6b2obo240bo$7bob2o5bo11bob2o5bob3o8b3o5b obo140b2o4b2o103b2obo6bob2o10b2o2bo38bo2b2o181bob2o$5b2o9b2o10b2obob2o 4bobo8bobo4b2obob2o246b2o8b2o4b2o8bo2b2o29bo8b2o2bo185bo$5bo25bobo5b3o 8b3obo5b2obo247bo8bo5bo10b5o28bo7b5o178bo3bo2bobo$6bo9b2o13bobo22bob2o 250bo10bo5bo32b3o7bo124b2o5b2obo6b2obo45bo5bo2bo$5b2o10bo14bo26bo250b 2o8b2o4b2o15bob3o12bobo133bo5bob2o6bob2o45bo6b2o$7b2obo5bo25bo13b3o 253bob2o4bo5bo10b5o3bobo12b3o3b3o3b3o3b5o112bo4b2o4b2o2b2o4b2o26b2o 179bo$7bob2o5b2o24bo10bobo256b2obo5bo5bo8bo2b2o4b3o31b2o2bo111b2o3bo5b o3bo5bo26bo2bo10b3o3b3o159bo5bo$41b2obo6bo3bob2o257b2o2b2o4b2o8b2o2bo 29bo8bo2b2o117bo5bo3bo5bo24bobobo178bo5b3o$44b2o3b3obobob2o258bo2bo5bo 43bo124b2o3b2o4b2o2b2o4b2o23b3obo15bo155b2o6b2o7bo$41bo6bo4b2o261bo4bo 5bo42bo125bo3bo5bo3bo5bo24b3o17bo154bobo9bo4b2o$41b2o6b4o263b2o2b2o4b 2o14b4o28b4o117bo5bo5bo3bo5bo43bo123b2o5bob2o6b2obo10bobob2o2bo4bo$40b 2o10bo259bob2o6b2obo15bob2obo26bob2obo116b2o3b2o4b2o2b2o4b2o168bo5b2ob o6bob2o11bobobo7bo$40b3o8bo260b2obo6bob2o15b2o2b2o26b2o2b2o121bo5bo3bo 5bo18b2o2bo145bo4b2o8b2o17bo5b3o$51b2o288b2o2b2o26b2o2b2o116b2o4bo5bo 3bo5bo17bo2b2o4b3o138b2o4bo8bo17bo2bo25bo$341bob2obo26bob2obo117bo3b2o 4b2o2b2o4b2o18b5o3bobo12b3o16bo2b2o107bo10bo16bo28bo$342b4o28b4o117bo 6b2obo6b2obo26bob3o12bobo16b2o2bo102b2o3b2o8b2o16bo3bo2b2o20bo$495b2o 5bob2o6bob2o43b3o6b3o6b5o104bo5bob2o6b2obo12bo3bo2b3o18b2o$242b2o292b 5o144bo6b2obo6bob2o12bo5b5o15bo$188b2o36b2o13bo2bo290bo2b2o26bo5bo112b 2o9b2o2b2o4b2o10bo2bo3b3o6b3o6bo4bo$189bo35bo2bo12bobobo289b2o2bo26bo 5bo4b5o115bo2bo5bo12bo5b2o7bobo6bo9b2o$162b2obo6b2obo13bobo32bobobo13b o2bo320bo5bo5b2o2bo102b2o9bo4bo5bo9bobobo12b3o8b3o5bobo$162bob2o6bob2o 14b2o32bo2bo18bo331bo2b2o103bo9b2o2b2o4b2o8bobob2o28b2obobo$166b2o2b2o 23b3o25bo19bobo322b3o114bo6bob2o6b2obo10bobo5b3o23bobobo$166bo3bo24bob o26bobo329bo17b2o109b2o5b2obo6bob2o11b2o9bo23bo$167bo3bo23b3o358bo16b 3o147bo4bo16bo5bo2bo$166b2o2b2o66b3o6b3o306bo15bob2o151bo17b2o4bo$162b 2obo6b2obo44b3o6b3o6bobo330bobo150b2o19bo5bo3bo$162bob2o6bob2o53bobo6b 3o5bo3bo301b3o3b3o10bo2bo149bo26bo3bo$166b2o2b2o4b2o41bo3bo5b3o14bo3bo 321b2o150bo26bo$166bo3bo5bo15b3o24bo3bo324b2o6bo167bo26bo2bo$41b2o5b2o 117bo3bo5bo14bobo51bo3bo296bo2bo5bo187b3o5bo$36b2o3bo7bo3b2o111b2o2b2o 4b2o14b3o24bo3bo21bob3obo295bobobo4bo185bo7bobobo$35bobo4bo5bo4bobo 106b2obo6b2obo22b2o18bob3obo20bo5bo296bo2bo190bo4bo2b2obobo$37bob3obo 3bob3obo108bob2o6bob2o22bobo17bo5bo19b2obobob2o299bo184b2o4bo9bobo$3b 2obo5b2obo18b2obobo3bo3bo3bobob2o143bo16b2obobob2o17bo2b2ob2o2bo295bob o185bo7b2o6b2o$3bob2o5bob2o21bo5bobobo5bo146b2o14bo2b2ob2o2bo16b2o7b2o 302bo2bo178b3o5bo$7b2o7b2o18bobo2b2obobob2o2bobo161b2o7b2o327b3o2b3o 178bo5bo$7bo8bo20bo3bo2bobo2bo3bo308b2o6b2o183b2o2b2o185bo$8bo8bo15b2o 8b2ob2o8b2o297bo5bo10bo5bo177bo2bo$7b2o7b2o11b2o2bo23bo2b2o292bo3b2o2b o8bo2b2o3bo174bobo2bobo$3b2obo5b2obo13bobobo5b3o7b3o5bobobo292bo4bo3bo 6bo3bo4bo174b2o4b2o$3bob2o5bob2o15bob2o4bobo7bobo4b2obo295bobo3bo2bo4b o2bo3bobo$b2o7b2o17bobobo5b3o7b3o5bobobo298b4o6b4o$bo8bo18b2o2bo23bo2b 2o$2bo8bo21b2o8b2ob2o8b2o302b4o6b4o$b2o7b2o25bo3bo2bobo2bo3bo301bobo3b o2bo4bo2bo3bobo$3b2obo5b2obo20bobo2b2obobob2o2bobo299bo4bo3bo6bo3bo4bo $3bob2o5bob2o21bo5bobobo5bo300bo3b2o2bo8bo2b2o3bo$34b2obobo3bo3bo3bobo b2o298bo5bo10bo5bo$37bob3obo3bob3obo288b2o18b2o6b2o18b2o$35bobo4bo5bo 4bobo140b2o8b2o134bobo44bobo$36b2o3bo7bo3b2o140bobo8bobo135b3o40b3o$ 41b2o5b2o145b2o10b2o103bob2o6b2obo17bo3bo38bo3bo$246bo65b2obo6bob2o17b 3o2bo2bo30bo2bo2b3o$199b3o38b2o4bo4b2o57b2o8b2o26bob2o30b2obo$199bobo 37bobo4bo4bobo57bo8bo22b3o2bo2bo9b3o6b3o9bo2bo2b3o$199b3o37bo13bo56bo 10bo21bo3bo13bobo6bobo13bo3bo$236b2ob2o11b2ob2o53b2o8b2o22b3o9b2o3b3o 6b3o3b2o9b3o$236b2obobo9bobob2o55bob2o6b2obo15b3o46b3o$187b2o26b2o22bo b11obo58b2obo6bob2o15bo2bo44bo2bo$186bobo26bobo21bobob7obobo62b2o2b2o 4b2o14b3o44b3o$186b2o10b3o15b2o17b2o3bo5bo5bo3b2o59bo2bo5bo$68b2o128bo bo3b3o27bo2bo17bo2bo57bo4bo5bo16b3o9b2o3b3o6b3o3b2o9b3o$67bobo128b3o3b obo4b3o19bobobo17bobobo56b2o2b2o4b2o15bo3bo13bobo6bobo13bo3bo$67bo136b 3o4bobo19bobob2o6b3o6b2obobo52bob2o6b2obo17b3o2bo2bo9b3o6b3o9bo2bo2b3o $61b2o2b2ob4o139b3o17b2obo3bo6bobo6bo3bob2o50b2obo6bob2o22bob2o30b2obo $61bo2bo3bo2bo118b3o38bo2bob2o7b3o7b2obo2bo81b3o2bo2bo30bo2bo2b3o$29b 2o9b2o21b2obo5b2o116bobo4b3o28b2obobobo2bo15bo2bobobob2o78bo3bo38bo3bo $30bo9bobo21bo4b3o2bo115b3o4bobo3b3o22bo2bobobob2o15b2obobobo2bo79b3o 40b3o$30bobo8b2o21bob2o4b2obo121b3o3bobo23b2o6bo17bo6b2o78bobo44bobo$ 3b2obo4b2o3b2o13b2o32bo3bobo3bo110b2o15b3o10b2o13b5obo17bob5o80b2o18b 2o6b2o18b2o$3bob2o4b2o3b2o18b3o27b3o3b3o111bobo26bobo13bo4bo3bo11bo3bo 4bo93bo5bo10bo5bo$7b2o27bobo29bobobo114b2o26b2o15b4o3bobo3b3o3bobo3b4o 93bo3b2o2bo8bo2b2o3bo$7bo3b2o3b2o18b3o22bo7b3o167bob4o3b4obo100bo4bo3b o6bo3bo4bo$8bo2bobobobo42b2o8bo163b4obo13bob4o96bobo3bo2bo4bo2bo3bobo$ 7b2o4bobo43bob2o24bo114b3o29bo2bob2o2b2o3b2o2b2obo2bo101b4o6b4o$3b2obo 5b2obo42b3o2bo138bobo34bo13bo$3bob2o9b2o42bobobo5b3o6b3obobob3o112b3o 34bobo9bobo106b4o6b4o$b2o14bo43bobobo4bobo6bobo5b2obo149b2o3b3o3b2o 102bobo3bo2bo4bo2bo3bobo$bo14bo15b2o9b2o17bo2b3o2b3o6b3o5bob2o104b2o 10b2o145bo4bo3bo6bo3bo4bo$2bo13b2o14bo2b7o2bo18b2obo21b3obo102bobo8bob o145bo3b2o2bo8bo2b2o3bo$b2o14bo15bo3b3o3bo20b2o130b2o8b2o147bo5bo10bo 5bo$3b2obo9bo17bo2bobo2bo21bo5bo19bo271b2o6b2o$3bob2o9b2o51b3o10b3o$ 29b2o4b3ob3o4b2o20bobobo7bob3o$29bo2b2o2bobobo2b2o2bo18b3o3b3o4bobobo$ 30b3ob3o3b3ob3o18bo3bobo3bo3bo2bo$35b2obob2o22bob2o4b2obo4b2o$32b2o9b 2o19bo4b3o2bo$32bo11bo18b2obo5b2o$33bo9bo17bo2bo3bo2bo$32b2o9b2o16b2o 2b2ob4o$67bo$67bobo$68b2o69$103bo$102bobo$101bobobo$101bobobo$100b2obo b2o$98bo2bobobo2bo$98b2o3bo3b2o$101bobobo$96b5o2bo2b5o$95bo5bobobo5bo$ 94bobo3b2obob2o3bobo$94bob3o3bobo3b3obo$93b2o4b2obobob2o4b2o$94bobo4bo bobo4bobo$94bobo2bobobobobo2bobo$95bo5bobobo5bo$96b2obobobobobob2o$98b 2obobobob2o$100b2obob2o$95b2ob2obobobob2ob2o$94bo3bo4bo4bo3bo564bo17bo $94bobo2bo2bobo2bo2bobo404bo25bo131b3o17b3o$92b2o2b2o4bobo4b2o2b2o401b obo23bobo129bo23bo$93bobo4b2o3b2o4bobo265b2o3b2o131bo25bo130bo2b3o13b 3o2bo$43b2o3b2o31b2o10bob3ob2o5b2ob3obo10b2o253bobobobo136bo15bo106b2o 7b2o11b2o4b2obo2bo13bo2bob2o4b2o11b2o7b2o$43b2o3b2o31bo12bo17bo12bo 107b2o131b2o13bobo13b2o116b5o2b3o11b3o2b5o100bo5bo2b3o6b2o2bo7b2o17b2o 7bo2b2o6b3o2bo5bo$70b2o11bo12bobob7obobo12bo11b2o89b2o5b2o8bobo120b2ob o10b2ob2o10bob2o115bo4bo5bo9bo5bo4bo98bo4b4o4bo6bobo5b2o23b2o5bobo6bo 4b4o4bo$5b2o5b2obo54bobo9b2o2bo2bo5b2o4bo3bo4b2o5bo2bo2b2o9bobo55b2obo 6b2obo21bo14bo88b2o3b2o4b2obo24bo23bo87bob2o6bob2o17bo2bo7b2o9b2o7bo2b o64b2obo6b2obo16bo2b2o2bo4b2o2bo6bob2o3bobob4o13b4obobo3b2obo6bo2b2o4b o2b2o2bo$6bo5bob2o56bo3b2obo4b6o4bo3b11o3bo4b6o4bob2o3bo57bob2o6bob2o 21bobo13bo2bo84b2o3b2o4bob2o21bo29bo84b2obo6b2obo14bo2bob2o27b2obo2bo 61bob2o6bob2o14b3o5bob4o2bobob2ob2o3bo3bo3bo2bo13bo2bo3bo3bo3b2ob2obob o2b4obo5b3o$5bo4b2o4b2o20b2o2b3o3b3o2b2o17b2o7b3o11b3o3b5o3b3o11b3o7b 2o61b2o2b2o4b2o20b2o13bobobo92b2o4b2o20bob2o21b2obo83b2o8b2o17bobobo5b o21bo5bobobo58b2o4b2o2b2o4b2o11bo4b3obobo2bobo2bo2bobo3b2ob2ob2o2bo17b o2b2ob2ob2o3bobo2bo2bobo2bobob3o4bo$5b2o3bo5bo21b2o2bobo3bobo2b2o19bob o7b8o5bob2ob3ob2obo5b8o7bobo63bo3bo5bo25b3o3b3o3bo2bo83b2o3b2o2bo5bo 23b2o6b3o3b3o6b2o86bo9bo18bo2bo4bobo19bobo4bo2bo59bo5bo3bo5bo13b5o4b2o b2ob2obo6bobobobo2b3o19b3o2bobobobo6bob2ob2ob2o4b5o$11bo5bo24b3o3b3o 21b2obo3b3obo7bo6b3o5b3o6bo7bob3o3bob2o62bo3bo5bo24bobo3bobo4b2o84bobo bobo3bo5bo30bobo3bobo93bo9bo22b2o2bo2bo5b3o3b3o5bo2bo2b2o63bo5bo3bo5bo 14bo2bo6bobo5bo3b2o3bo3bo25bo3bo3b2o3bo5bobo6bo2bo$5b2o3b2o4b2o53bobob 4o2bo2b2o3bo9bo7bo9bo3b2o2bo2b4obobo60b2o2b2o4b2o24b3o3b3o92bobo4b2o4b 2o30b3o3b3o93b2o8b2o26b2o6bobo3bobo6b2o67b2o4b2o2b2o4b2o17bob2obo3b3o 2b2o4bo2b2o2b2o8b3o3b3o8b2o2b2o2bo4b2o2b3o3bob2obo$6bo3bo5bo53bo7bo4b 2obo2b2o25b2o2bob2o4bo7bo55b2obo6b2obo126b2obo4bo5bo135bob2o6bob2o30b 3o3b3o77b2obo6b2obo17bob3obob2obob2o4b4o6b5o5bobo3bobo5b5o6b4o4b2obob 2obob3obo$5bo5bo5bo53b7o5bobo4bo25bo4bobo5b7o56bob2o6bob2o130b2o3bo5bo 134b2obo6b2obo116bob2o6bob2o16bobo3b2obo5bobo2b2o5b2o4bo6b3o3b3o6bo4b 2o5b2o2bobo5bob2o3bobo$5b2o3b2o4b2o55bo2bo5b2ob2ob3o25b3ob2ob2o5bo2bo 56b2o8b2o4b2o20bo15bo92bo2b2o4b2o138b2o8b2o45b2o65b2o4b2o2b2o4b2o14bo 2b2o3bob5o2bo2b4o2bob5o23b5obo2b4o2bo2b5obo3b2o2bo$10bo5bo25b3o3b3o27b o5b3o2b2o2bo5b3o3b3o5bo2b2o2b3o5bo61bo9bo5bo20bobo13bobo90bo3bo5bo22b 3o21b3o91bo9bo20b2o21bo2bo65bo5bo3bo5bo14b2o3bo2bobo4bob2o4b3ob2o3bob 2o19b2obo3b2ob3o4b2obo4bobo2bo3b2o$5b2o4bo5bo20b2o2bobo3bobo2b2o22b2o 2bo4bo3bo3b2o3bobo3bobo3b2o3bo3bo4bo2b2o61bo9bo5bo20bo15bo91b2o3bo5bo 24bo19bo93bo9bo16b2o2bo2bo20b3o67bo5bo3bo5bo14bobo4bobob3ob2o2bo2bo5b 4obo21bob4o5bo2bo2b2ob3obobo4bobo$6bo3b2o4b2o20b2o2b3o3b3o2b2o27b4o2bo bo2b2o4b3o3b3o4b2o2bobo2b4o65b2o8b2o4b2o26bo3bo98bo2b2o4b2o20bo3bo19bo 3bo89b2o8b2o12bo2bo4bobo25b2o62b2o4b2o2b2o4b2o13bo2b2o2b2obobob2o3bob 3o4b2obo2bo21bo2bob2o4b3obo3b2obobob2o2b2o2bo$5bo6b2obo70b2o2b2ob3o15b 3ob2o2b2o71b2obo6b2obo28bo3bo97bo5b2obo21bobo2bo19bo2bobo84bob2o6bob2o 13bobobo5bo21b2obo2bo64b2obo6b2obo15b2o5bo2bobo3bo6bo3b2o5b2o19b2o5b2o 3bo6bo3bobo2bo5b2o$5b2o5bob2o66b4o2bobo2b3o15b3o2bobo2b4o67bob2o6bob2o 23b2o3bo3bo3b2o92b2o4bob2o19bo2bobo23bobo2bo82b2obo6b2obo14bo2bob2o25b ob2o66bob2o6bob2o23b2o3b3o7bobo2b6o2bo17bo2b6o2bobo7b3o3b2o$77b2o2bo4b o3bo3bo17bo3bo3bo4bo2b2o99b2o11b2o121bo3bo10b2ob2o10bo3bo113bo2bo25bo 122b2obo5bobo2bo13bo2bobo5bob2o$43b2o3b2o28bo5b3o2b2o2bo5bo7bo5bo2b2o 2b3o5bo236bo15bobo15bo114bo4bo3b2o11b2o3b2o111b2obo9bob3obo2b4o13b4o2b ob3obo9bob2o$43b2o3b2o23bo2bo5b2ob2ob3o7b3o5b3o7b3ob2ob2o5bo2bo232b3o 10bobobobo10b3o116b5o4bo11bo117bob2o9bo3bobobo21bobobo3bo9b2obo$71b7o 5bobo4bo6bob2ob3ob2obo6bo4bobo5b7o243b2o3b2o136bobobo10b3o126b2o6bob2o 17b2obo6b2o$70bo7bo4b2obo2b2o4b3o3b5o3b3o4b2o2bob2o4bo7bo380bo3bobob2o 12bo136bo2bo13bo2bo$71bobob4o2bo2b2o3bo4bo3b11o3bo4bo3b2o2bo2b4obobo 380bobo2bobo150bo2b3o13b3o2bo$72b2obo3b3obo7bo3b2o4bo3bo4b2o3bo7bob3o 3bob2o382bo4b2o150b3o19b3o$74bobo7b8o4bobob7obobo4b8o7bobo544bo17bo$ 72b2o7b3o10bo17bo10b3o7b2o541b2o17b2o$72bo3b2obo4b6o3bob3ob2o5b2ob3obo 3b6o4bob2o3bo$70bobo9b2o2bo2bo3bobo4b2o3b2o4bobo3bo2bo2b2o9bobo$70b2o 11bo8b2o2b2o4bobo4b2o2b2o8bo11b2o$81bo12bobo2bo2bobo2bo2bobo12bo$81b2o 11bo3bo4bo4bo3bo11b2o106bo7bo$95b2ob2obobobob2ob2o119bobo5bobo$100b2ob ob2o125bo7bo$98b2obobobob2o83b2obo6b2obo$96b2obobobobobob2o81bob2o6bob 2o171b2o7b2o$95bo5bobobo5bo84b2o2b2o4b2o168bo2bo5bo2bo$94bobo2bobobobo bo2bobo83bo3bo5bo25b3o3b3o134bob2obo3bob2obo$94bobo4bobobo4bobo84bo3bo 5bo24bobo3bobo129bo5bo2bobobobo2bo5bo$93b2o4b2obobob2o4b2o82b2o2b2o4b 2o24b3o3b3o5b2o121bobo5bo3bobo3bo5bobo$94bob3o3bobo3b3obo79b2obo6b2obo 41bo121bo2bob3o3b2ob2o3b3obo2bo$94bobo3b2obob2o3bobo79bob2o6bob2o41bob 2o116b2obobobo15bobobob2o122b2obo13bob2o$95bo5bobobo5bo78b2o14b2o38b2o 2bo115bobobobo19bobobobo121bob2o13b2obo111b2o15b2o$96b5o2bo2b5o79bo15b o21b2o13bo4b2o116bo2bo25bo2bo252bo19bo$101bobobo85bo15bo19bobo13b5o 117b2obo9b3o3b3o9bob2o121b3o13b3o114bo13bo$98b2o3bo3b2o81b2o14b2o19bo 13b2o4bo118bob3o2bo4bobo3bobo4bo2b3obo121bo2bo13bo2bo109bo3bo13bo3bo$ 98bo2bobobo2bo83b2obo6b2obo20b2o5b2o7bo2b2o85b2o3b2o4b2obo17bo2bo4bo5b 3o3b3o5bo4bo2bo81bob2o6b2obo24b2o17b2o106b4o3bo13bo3b4o$100b2obob2o85b ob2o6bob2o27b2o7bobo87b2o3b2o4bob2o17b2obob2o23b2obob2o81b2obo6bob2o 156bo17bo$101bobobo131bo2bobobo102b2o18bobo25bobo82b2o8b2o4b2o22b4o13b 4o71b2obo6b2obo$101bobobo131b4ob2o88b2o3b2o8bo19bobo25bobo83bo8bo5bo 23bo2bo13bo2bo71bob2o6bob2o$102bobo136bo90bobobobo9bo19bo27bo83bo10bo 5bo23bo4b3o3b3o4bo70b2o4b2o2b2o4b2o18b2o27b2o$103bo135bobo92bobo10b2o 131b2o8b2o4b2o20b3o5bobo3bobo5b3o67bo5bo3bo5bo19bo2b2o6b3o3b3o6b2o2bo$ 239b2o92b2obo6b2obo27b2o13b2o91bob2o6b2obo22bo7b3o3b3o7bo68bo5bo3bo5bo 19b2ob2o5bobo3bobo5b2ob2o$337b2o4bob2o27b2o13b2o91b2obo6bob2o114b2o4b 2o2b2o4b2o22b2o5b3o3b3o5b2o$338bo2b2o143b2o2b2o4b2o114b2obo4bo5bo23b2o 19b2o$337bo3bo26bo27bo90bo2bo5bo115bob2o5bo5bo19b2ob2o19b2ob2o$337b2o 3bo24bobo25bobo88bo4bo5bo20bo23bo73b2o2b2o4b2o18bo2b2o21b2o2bo$338bo2b 2o24bobo25bobo88b2o2b2o4b2o20b3o19b3o73bo3bo5bo19b2o27b2o$337bo5b2obo 17b2obob2o23b2obob2o81bob2o6b2obo25bo17bo77bo3bo5bo$337b2o4bob2o17bo2b o4bo5b3o3b3o5bo4bo2bo81b2obo6bob2o24bo2bo13bo2bo75b2o2b2o4b2o$366bob3o 2bo4bobo3bobo4bo2b3obo121b4o13b4o71b2obo6b2obo26bo17bo$365b2obo9b3o3b 3o9bob2o212bob2o6bob2o21b4o3bo13bo3b4o$366bo2bo25bo2bo121b2o17b2o109bo 3bo13bo3bo$41b2o9b2o312bobobobo19bobobobo121bo2bo13bo2bo113bo13bo$42bo 9bo314b2obobobo15bobobob2o123b3o13b3o111bo19bo$40bo13bo314bo2bob3o3b2o b2o3b3obo2bo256b2o15b2o$40b2o5bo5b2o179bo7bo126bobo5bo3bobo3bo5bobo 124bob2o13b2obo$43b2obobob2o140b2obo6b2obo27bobo5bobo126bo5bo2bobobobo 2bo5bo125b2obo13bob2o$38b5obobobobob5o135bob2o6bob2o28bo7bo132bob2obo 3bob2obo$37bo6bobobobo6bo138b2o2b2o4b2o168bo2bo5bo2bo$38b3obob3ob3obob 3o139bo3bo5bo170b2o7b2o$2b2obo6b2obo24bob2o7b2obo142bo3bo5bo$2bob2o6bo b2o25bo11bo142b2o2b2o4b2o26b3o3b3o$6b2o2b2o4b2o174b2obo4bo5bo27bobo3bo bo$6bo3bo5bo175bob2o5bo5bo26b3o3b3o$7bo3bo5bo178b2o2b2o4b2o$6b2o2b2o4b 2o178bo3bo5bo$2b2obo4bo5bo25b3o3b3o146bo3bo5bo$2bob2o5bo5bo24bobo3bobo 145b2o2b2o4b2o$2o8b2o4b2o24b3o3b3o141b2obo6b2obo458bo4bo$o9bo5bo175bob 2o6bob2o456b2ob4ob2o$bo9bo5bo216bo7bo421bo4bo$2o8b2o4b2o215bobo5bobo 277b2o15b2o$2b2obo6b2obo218bo7bo277bo19bo$2bob2o6bob2o25bo11bo469bo13b o$40bob2o7b2obo427b2obo6b2obo23bo3bo13bo3bo$38b3obob3ob3obob3o425bob2o 6bob2o20b4o3bo13bo3b4o$37bo6bobobobo6bo335b3o3b3o78b2o8b2o4b2o23bo17bo $38b5obobobobob5o336bobo3bobo78bo9bo5bo29b3o3b3o70b2o5b2obo6b2obo23bo$ 43b2obobob2o318b2o6bo14b3o3b3o14bo6b2o56bo9bo5bo28bobo3bobo71bo5bob2o 6bob2o23bo$40b2o5bo5b2o315bo6bobo35bobo6bo55b2o8b2o4b2o28b3o3b3o70bo 10b2o2b2o4b2o20bobo$40bo13bo307b2o3b2obo7bo7b3o17b3o7bo7bob2o3b2o49b2o bo4bo5bo108b2o9bo3bo5bo22bo7b3o3b3o$42bo9bo309bo4bobo9b2obob4obo15bob 4obob2o9bobo4bo49bob2o5bo5bo119bo3bo5bo21bo7bobo3bobo$41b2o9b2o309b3ob o11b4obo4bo15bo4bob4o11bob3o48b2o4b2o2b2o4b2o107b2o9b2o2b2o4b2o21bo7b 3o3b3o13bo$365bob2o10b4o2bo2bo17bo2bo2b4o10b2obo50bo5bo3bo5bo109bo5b2o bo4bo5bo22bo29bo$384bo25bo70bo5bo3bo5bo107bo6bob2o5bo5bo20bobo27bobo$ 375bo4bobo29bobo4bo60b2o4b2o2b2o4b2o107b2o3b2o8b2o4b2o21bo29bo$373bobo 4bo33bo4bobo60b2obo6b2obo25bo17bo70bo9bo5bo22bo29bo$233b2o7b2o127bo51b o58bob2o6bob2o20b4o3bo13bo3b4o60b2o4bo9bo5bo51bo$232bo2bo5bo2bo122bo2b o2b4o10b2obo13bob2o10b4o2bo2bo91bo3bo13bo3bo64bo3b2o8b2o4b2o51bo$225bo 5bobobo5bobobo5bo114bo4bob4o11bob3o9b3obo11b4obo4bo94bo13bo67bo6b2obo 6b2obo52bobo$224b2o4b3obo7bob3o4b2o113bob4obob2o9bobo4bo7bo4bobo9b2obo b4obo91bo19bo64b2o5bob2o6bob2o53bo$223bob2o3b3o11b3o3b2obo113b3o7bo7bo b2o3b2o7b2o3b2obo7bo7b3o93b2o15b2o139bo$192b2obo6b2obo16b3o2bo21bo2b3o 121bobo6bo23bo6bobo$192bob2o6bob2o18bobobo19bobobo124bo6b2o23b2o6bo$ 196b2o8b2o17bobobo17bobobo$196bo9bo19bo2b3o13b3o2bo$197bo9bo19b2obo3b 3o3b3o3bob2o$38bo3b2o5b2o3bo141b2o8b2o20b2o4bobo3bobo4b2o$37bobo2bo7bo 2bobo136b2obo6b2obo22bo5b3o3b3o5bo410bo4bo$37bobo4bo3bo4bobo136bob2o6b ob2o451b2ob4ob2o$38bob5o3b5obo141b2o2b2o457bo4bo$2b2obo6b2obo24bo11bo 143bo3bo27bo19bo281bo5bo$2bob2o6bob2o23bo3b2o3b2o3bo143bo3bo26b2o17b2o 281b2o3b2o$6b2o8b2o20bo4b2o3b2o4bo141b2o2b2o25b2obo15bob2o280b2o3b2o$ 6bo9bo21b2o3b2o3b2o3b2o137b2obo6b2obo20bo2b3o13b3o2bo280bo3bo$7bo9bo 174bob2o6bob2o19bobobo17bobobo$6b2o8b2o24b3o3b3o173bobobo19bobobo$2b2o bo6b2obo26bobo3bobo171b3o2bo21bo2b3o266bo$2bob2o6bob2o26b3o3b3o172bob 2o3b3o11b3o3b2obo266bo2bo$2o8b2o212b2o4b3obo7bob3o4b2o267bo2bo$o9bo 214bo5bobobo5bobobo5bo270bo3b3o3b3o7bo$bo9bo220bo2bo5bo2bo134b2o3b2o 140bobo3bobo5bo2bo$2o8b2o221b2o7b2o135b2o3b2o136bo3b3o3b3o5bo2bo$2b2ob o6b2obo22b2o13b2o465bo2bo17bo$2bob2o6bob2o22bo4b2o3b2o4bo465bo2bo$39bo 3b2o3b2o3bo467bo19bo$40bo11bo487bo2bo$38bob5o3b5obo485bo2bo$37bobo4bo 3bo4bobo276b2o3b2o2b2o3b2o194bo$37bobo2bo7bo2bobo276b2o3b2o2b2o3b2o$ 38bo3b2o5b2o3bo$332b2o3b2o2b2o3b2o180bo3bo$332bobobobo2bobobobo30b3o3b 3o140b2o3b2o$334bobo6bobo32bobo3bobo140b2o3b2o$333b2obo5b2obo32b3o3b3o 140bo5bo$337b2o7b2o$338bo8bo$337bo8bo$249b2ob2o2bo4b2ob2o71b2o7b2o$ 250bobo2bobobo2bobo73bo8bo28b3o7b3o$250bo3b2obob2o3bo72bo8bo23b2o2b7o 3b7o2b2o$248b2obo4bobo4bob2o70b2o7b2o22bo3b2obob2o3b2obob2o3bo$249bobo b2obobob2obobo106b2ob2ob2ob3ob2ob2ob2o$249bo2b2obo3bob2o2bo102b4obo17b ob4o$43b2o3b2o196b2obo2bo9bo2bob2o99bo2bob4o3bo3bo3b4obo2bo$42bo2bobo 2bo195bo2b4obo5bob4o2bo103bo2bo13bo2bo$38b2o3b2o3b2o3b2o192b2o4bo7bo4b 2o105bo8bo8bo$2b2obo6bob2o22bo15bo137b2obo6b2obo32bo10b3obo7bob3o10bo 97bobo4bobo4bobo125b2o37b2o$2bob2o6b2obo19b2obo15bob2o134bob2o6bob2o 29bobobo5b4o17b4o5bobobo97b2o3bo3b2o128b2o37b2o$6b2o2b2o21bo2bob2o13b 2obo2bo136b2o2b2o31b3ob2o5bo25bo5b2ob3o92bo2b2o7b2o2bo125b2o37b2o$6bo 4bo21b2obo5b3o3b3o5bob2o136bo3bo31bo3bo6bob2o6bo7bo6b2obo6bo3bo90bobob o9bobobo124bo39bo$7bo2bo25bo5bobo3bobo5bo140bo3bo26bo2bob2o2b4o2bobobo 2bob2o7b2obo2bobobo2b4o2b2obo2bo85bobob3o7b3obobo121b2ob2o35b2ob2o$6b 2o2b2o24b2o4b3o3b3o4b2o139b2o2b2o20b2obo2b4obob2o4bobo2bo21bo2bobo4b2o bob4o2bob2o79bo2b2o2bo5bo2b2o2bo121b2ob2o11b2o9b2o11b2ob2o$2b2obo6bob 2o176b2obo6b2obo16bob4o6bo3b3o2bo4bobo13bobo4bo2b3o3bo6b4obo77b2ob2o5b 2ob2o5b2ob2o119b2obobo10b2o9b2o10bobob2o$2bob2o6b2obo176bob2o6bob2o22b o2b2ob5o3b2o4b3o13b3o4b2o3b5ob2o2bo84bobo6b2ob2o6bobo123bob2o31b2obo$ 2o14b2o178b2o2b2o4b2o15b2o2bo2bobobo5bob2o4b2o15b2o4b2obo5bobobo2bo2b 2o79bobo17bobo88b2obo4b2o3b2o19b2o2bo31bo2b2o$o16bo178bo3bo5bo16bo2bob 3o3bo2b2o3b2o4b3o13b3o4b2o3b2o2bo3b3obo2bo80bo19bo89bob2o4b2o3b2o20b3o 33b3o$bo14bo21b2o13b2o142bo3bo5bo17b2ob3o2bo4bobobob2obobo3b3o3b3o3bob ob2obobobo4bo2b3ob2o190b2o$2o14b2o20bo4b2o3b2o4bo141b2o2b2o4b2o16b3o7b o3bobo2bobob2o4bobo3bobo4b2obobo2bobo3bo7b3o189bo9b2o3b2o26b3o21b3o$2b 2obo6bob2o23bo3b2o3b2o3bo138b2obo6b2obo18bo8b2ob2ob3o11b3o3b3o11b3ob2o b2o8bo190bo8bobobobo25bo2b2o19b2o2bo$2bob2o6b2obo24bo11bo139bob2o6bob 2o14b2o3b2o7bo45bo7b2o3b2o185b2o10bobo27b2obo21bob2o$38bob5o3b5obo165b o2bobo6bobob2o39b2obobo6bobo2bo187b2obo5b2obo16b2o10bobob2o15b2obobo 10b2o$37bobo4bo3bo4bobo166b2o2bo5b2o2bo41bo2b2o5bo2b2o189bob2o9b2o14b 2o11b2ob2o3b3o3b3o3b2ob2o11b2o$37bobo2bo7bo2bobo169b2o9bobo6b3o19b3o6b obo9b2o190b2o4b2o8bo27b2ob2o3bobo3bobo3b2ob2o$38bo3b2o5b2o3bo182b2o7bo 21bo7b2o202bo5bo8bo30bo5b3o3b3o5bo$481bo5bo7b2o28b2o19b2o$245b3o19b3o 210b2o4b2o8bo28b2o19b2o$244bo3bo17bo3bo211b2obo9bo29b2o19b2o$243bo5bo 5b2ob2o5bo5bo210bob2o9b2o$243bobobobo6bobo6bobobobo251b4o19b4o$242b2ob obob2o3bobobobo3b2obobob2o250bo3bo17bo3bo$241bo2b2ob2o2bo2b2o3b2o2bo2b 2ob2o2bo104bo7bo139bo2bo13bo2bo$241b2o7b2o11b2o7b2o103bobo5bobo138b4o 13b4o$378bo7bo$526b2o17b2o$526bo2bo13bo2bo$527b3o13b3o$378b3o3b3o$332b 2o3b2o2bob2o27b3o3bobo3bobo3b3o133bob2o13b2obo$44bo3bo283b2o3b2o2b2obo 33b3o3b3o139b2obo13bob2o$38b2o4bo3bo4b2o290b2o22b2o23b2o$38bo5bo3bo5bo 202bo74b2o3b2o7bo21bobo23bobo$35b2obo15bob2o198bobo73bobobobo6bo22bo 27bo$33bo2bob2o13b2obo2bo195bobobo74bobo8b2o20b2o27b2o$33b2obo5b3o3b3o 5bob2o195bo3bo73b2obo6b2o$36bo5bobo3bobo5bo193b2obobo3bobob2o72b2o5bo 29b2o13b2o$36b2o4b3o3b3o4b2o193bob2obo3bob2obo73bo4bo30b2o13b2o$63bo 191bobobo77bo5b2o$32bo28b3o187b2ob3ob3ob2o73b2o2b2o24b2o27b2o$2b2obo6b 2obo15bobo26bo190bo4bobo4bo74bo3bo25bo27bo$2bob2o6bob2o11b2o3bo27b2o 190b2o7b2o74bo3bo26bobo23bobo$6b2o2b2o15b2o308b2o2b2o26b2o23b2o$6bo3bo 32b2o3b2o200b3o9b3o113b3o3b3o$7bo3bo21b3o8bo3bo8b3o189bo2bo2b2ob2o2bo 2bo106b3o3bobo3bobo3b3o$6b2o2b2o21bobo5bo9bo5bobo3b2o184b2o2b2obobob2o 2b2o112b3o3b3o$2b2obo6b2obo12b3o2b3o5b2o7b2o5b3o3b2o189b2o3b2o$2bob2o 6bob2o228b2o8bo5bo8b2o$2o8b2o4b2o225bo2bo21bo2bo$o9bo5bo50b2o173bobobo 21bobobo105bo7bo$bo9bo5bo10b3o2b3o5b2o7b2o5b3o7b2o5b2o166bobob2o19b2ob obo104bobo5bobo$2o8b2o4b2o15bobo5bo9bo5bobo14bo165b2obobo23bobob2o103b o7bo$2b2obo6b2obo17b3o8bo3bo8b3o12bobo165bo2bob2o2b2o13b2o2b2obo2bo$2b ob2o6bob2o27b2o3b2o22b2o163b2obobobo8b3o3b3o8bobobob2o$27b2o32b3o3b3o 8b2o157bo2b3obob2o5bobo3bobo5b2obob3o2bo$27b2o3bo28bobo3bobo8bo159b2o 3bo2bo6b3o3b3o6bo2bo3b2o$31bobo27b3o3b3o10bo159b5obo21bob5o$32bo43b5o 159bo4bo23bo4bo$76bo164b4o25b4o$42b3o3b3o28b4o$42bobo3bobo28bo2bo158b 4o25b4o$42b3o3b3o189bo4bo23bo4bo$38b2o22b2o3b2o171b5obo21bob5o$37bobo 12b3o8bo3bo8b3o4bo154b2o3bo2bo6b3o3b3o6bo2bo3b2o$37bo14bobo5bo9bo5bobo 3bobo152bo2b3obob2o5bobo3bobo5b2obob3o2bo$36b2o5b2o7b3o5b2o7b2o5b3o3bo bo152b2obobobo8b3o3b3o8bobobob2o$43b2o38bo156bo2bob2o2b2o13b2o2b2obo2b o$240b2obobo23bobob2o$83bo158bobob2o19b2obobo$47b2o3b3o5b2o7b2o5b3o3bo bo157bobobo21bobobo$47b2o3bobo5bo9bo5bobo3bobo158bo2bo21bo2bo$52b3o8bo 3bo8b3o4bo160b2o8bo5bo8b2o$62b2o3b2o185b2o3b2o$249b2o2b2obobob2o2b2o$ 50b2o27bo2bo166bo2bo2b2ob2o2bo2bo$51bo27b4o167b3o9b3o$48b3o25bo$48bo 27b5o171b2o7b2o$55b2o4b3o3b3o4b2o4bo170bo4bobo4bo$55bo5bobo3bobo5bo2b 2o171b2ob3ob3ob2o$52b2obo5b3o3b3o5bobo177bobobo$52bo2bob2o13b2obobo 172bob2obo3bob2obo$54b2obo15bob2o173b2obobo3bobob2o$57bo15bo181bo3bo$ 57b2o3b2o3b2o3b2o181bobobo$61bo2bobo2bo186bobo$62b2o3b2o188bo!golly-3.3-src/Patterns/Life/Oscillators/p138.rle0000644000175000017500000000532112026730263016371 00000000000000#C p138 oscillator discovered as an infinite agar (not shown), but #C actually needing no external support: Gabriel Nivasch, 13 Oct 2002 #C Left: incremental glider construction by Mark Niemiec, 13 Oct 2002 #C Center right: 'instant' construction by Jason Summers, 18 Oct 2002 x = 215, y = 103, rule = B3/S23 152bo33bo$151bobo31bobo$150bo3bo29bo3bo$150bo3bo29bo3bo$149bobboo29bo bboo$150b4o30b4o$151bo33bo$$153boo32boo$152bobbo30bobbo$153boo32boo$ 147bo14bo18bo14bo$140boo4bobo12boboo9boo4bobo12boboo$139bobboobbobo11b oo3bo7bobboobbobo11boo3bo$10bo115bo11bo3boo3bo9bo3boo3bo5bo3boo3bo9bo 3boo3bo$11bo113bobo11bo3boo11bobobboobbo7bo3boo11bobobboobbo$9b3o112bo 3bo11boobo12bobo4boo9boobo12bobo4boo$124bo3bo13bo14bo18bo14bo$123bobb oo22boo32boo$124b4o21bobbo30bobbo$125bo24boo32boo$$127boo24bo33bo$76bo 49bobbo21b4o30b4o$76bobo48boo22boobbo22bo6boobbo$76boo43bo14bo13bo3bo 23bobo3bo3bo$114boo4bobo12boboo11bo3bo23boo4bo3bo11bo$113bobboobbobo 11boo3bo11bobo31bobo11bobo$112bo3boo3bo9bo3boo3bo11bo33bo11bo3bo$55bo 57bo3boo11bobobboobbo58bo3bo$20bo32boo59boobo12bobo4boo41bobo14bobboo$ 21bo32boo60bo14bo17bo30boo16b4o$19b3o102boo16bo7bo30bo17bo$11bobo109bo bbo16boo3b3o$12boo19bo90boo11bo4boo57boo$12bo18bobo104bo61bobbo$32boo 93bo8b3o42bo19boo$56bo68b4o52bobo11bo14bo$56bobo66boobbo51boo5boo4bobo 12boboo$56boo66bo3bo58bobboobbobo11boo3bo$21bobo100bo3bo57bo3boo3bo9bo 3boo3bo$22boo101bobo59bo3boo11bobobboobbo$22bo103bo61boobo12bobo4boo$ 190bo14bo$198boo$197bobbo$198boo$$126bo74bo$125bobo71b4o$124bo3bo70boo bbo$124bo3bo69bo3bo$123bobboo70bo3bo$124b4o71bobo$125bo74bo$$127boo$ 126bobbo$127boo$121bo14bo$114boo4bobo12boboo61bo$113bobboobbobo11boo3b o59bobo$112bo3boo3bo9bo3boo3bo57bo3bo$16b3o39bo54bo3boo11bobobboobbo 58bo3bo$18bo38boo55boobo12bobo4boo5boo51bobboo$17bo8boo29bobo56bo14bo 11bobo52b4o$27boo95boo19bo42b3o8bo$26bo96bobbo61bo$50boo72boo57boo4bo 11boo$50bobo123b3o3boo16bobbo$50bo76bo17bo30bo7bo16boo$125b4o16boo30bo 17bo14bo$125boobbo14bobo41boo4bobo12boboo$124bo3bo58bobboobbobo11boo3b o$124bo3bo11bo33bo11bo3boo3bo9bo3boo3bo$13boo110bobo11bobo31bobo11bo3b oo11bobobboobbo$12bobo111bo11bo3bo4boo23bo3bo11boobo12bobo4boo$14bo 123bo3bo3bobo23bo3bo13bo14bo$53boo82bobboo6bo22bobboo22boo$53bobo82b4o 30b4o21bobbo$53bo9boo74bo33bo24boo$boo60bobo$obo60bo77boo32boo24bo$bbo 16boo119bobbo30bobbo21b4o$14boobbobo120boo32boo22boobbo$15boo3bo48boo 64bo14bo18bo14bo13bo3bo$14bo53boo58boo4bobo12boboo9boo4bobo12boboo11bo 3bo$70bo56bobboobbobo11boo3bo7bobboobbobo11boo3bo11bobo$126bo3boo3bo9b o3boo3bo5bo3boo3bo9bo3boo3bo11bo$127bo3boo11bobobboobbo7bo3boo11bobobb oobbo$67b3o58boobo12bobo4boo9boobo12bobo4boo$67bo62bo14bo18bo14bo$68bo 69boo32boo$137bobbo30bobbo$138boo32boo$$141bo33bo$139b4o30b4o$139boobb o29boobbo$138bo3bo29bo3bo$138bo3bo29bo3bo$139bobo31bobo$140bo33bo! golly-3.3-src/Patterns/Life/Oscillators/queen-bee-turn.rle0000644000175000017500000001071412026730263020534 00000000000000#C Demonstration of a queen bee shuttle turning reaction #C (p88 oscillator). David I. Bell, 21 March 1996; updated July 2002 #C From Jason Summers' "jslife" pattern collection. x = 155, y = 155, rule = B3/S23 69boo6boo$69boo6boo7$53boo38boo21boo6boo$52bobo38bobo20boo6boo$52bobob oo4bo22bo4boobobo20boo6boo$53bobobobboo24boobbobobo21b3o4b3o$17boo10b oo24bo4boo24boo4bo23bobbobbobbo$16bobbo8bobbo21bobbo4bobo20bobo4bobbo 21boboobboobo$16b3o10b3o24bo4b3o6boobooboo6b3o4bo25boobooboo$19b10o23b o3bo9bo3boo4boo3bo9bo3bo24boo$18bobb6obbo22bo3bo9bo3boobooboo3bo9bo3bo 4boo18boo18boo$18boobb4obboo26bo34bo7bobo38bobo$53bobbo34bobbo4boboboo 32boobobo$55bo36bo7bobobo32bobobo$53bobobo32bobobo7bo36bo$52boboboo32b oobobo5boo8bobb3o8b3obbo8boo$52bobo10boo26bobo4b3o6boo3b3o8b3o3boo6b3o $53boo9b3o26boo5b3o6b3o5bo6bo5b3o6b3o$64boobo32b3o6boo3b3o8b3o3boo6b3o $37boo24boboo33b3o8bobb3o8b3obbo8b3o$37bo26b3o34boo36boo$35bobo26bo14b oo21bo36bo$23bo11boo42bo20bobobo32bobobo$8boo12b3o41boo12b3o16boboboo 32boobobo$8boo11bo3bo13boo7bo3boo6boo4boo3bo10bo16bobo18boo18bobo$21b ooboo13bo6b3o3bobbo3bobo5bobooboobboo22boo18boo18boo$45bo13bo8bo4bobb oo39booboobo$45boo5bobbobboo11b3o42boboo$51bobbo61bobbo$51bobo62b3o7b oo$21booboo26bo73bo$8boo11bo3bo48boo13b3o35b3o$8boo12b3o14boo11boo20bo bo11bo18boo20bo$23bo7b3o4bobbo10boo22bo11bo3bo13bobo14boo$32bo6b3o34b oo10bobbobo8bo3bo11bo4boo$32boo6bo49bobobbo4b3obboo10bobo$34bo28bo27bo 3bo3bo17bobbo$32bobo28bobo6boo21bo3boo17bo$32bobo28boo3boobboobboo14b 3o$68boobbobbobo19bo23boo$38boo34b3o19bobo15bobo4bobo$38bo35boo21boobb oo11boo7bo$39b3o59boo12bo7boo$41bo$18boobb4obboo$18bobb6obbo89boobbo$ 19b10o11boo5boo66boobboo3bo7boo10boo$16b3o10b3o9bo5boo66boo7bo6bobbo8b obbo$16bobbo8bobbo9bobo76b4o7b3obb6obb3o$17boo10boo11boo18bobo69boo6b oo$46boo15boo68bo10bo$45bobo15bo41boo26boobo4boboo$42boobbo58bobo13bo 16boo$9boo10boo82bo15b3o$8bobbo8bobbo17bo3bo78bo$8b3obb6obb3o16bo4bo 77boo$11boo6boo18bobobo$10bo10bo16bobobo40bobo53bo$10boobo4boboo14bo4b o15bobo23boo53b3o$15boo19bo3bo17boo24bo53b3o$58bo58boo$38boo77bobo19bo $92bobo14boo5boobo11bob3obb3obb3obo$92boo15boo6bobo10bobb3obb3obb3obbo 4boo$15bo77bo24bo10boobboo9boobboo3boo$14b3o102boobo7boo3bo7bo3boo$14b 3o12boo77boboo7bo3bo7bo15bo$29bo42bo7bo27bobo10boo13bo5bo$15bo11bobo 42boo5b3o27bo6boo18bo5bo$7bob3obb3obb3obo3boo42bobo4b5o26boo6bo13bo15b o$oo4bobb3obb3obb3obbo52bobobobo25boo3b3o5boo6boo3bo7bo3boo$oo3boobboo 9boobboo5boo7bo3boo31boo3boo25boo3bo7boo5boobboo9boobboo3boo$6boo3bo7b o3boo6boo5b3o3boo84bobb3obb3obb3obbo4boo$7bo15bo13bo88boo3bob3obb3obb 3obo$12bo5bo18boo86bobo11bo$12bo5bo13boo9boboo78bo$7bo15bo7bo3bo7bobo 78boo12b3o$6boo3bo7bo3boo7boboo8bo93b3o$oo3boobboo9boobboo10bo7boo93bo $oo4bobb3obb3obb3obbo10bobo6boo$7bob3obb3obb3obo11boboo5boo34bo$15bo 19bobo41boo$36boo41bobo33bo$14b3o97bobo21boo$14b3o96bo3bo15boobo4boboo $15bo96bo3bo16bo10bo$111bo3bo18boo6boo$30boo78bo3bo16b3obb6obb3o$30bo 80bobo17bobbo8bobbo$31b3o16bo61bo19boo10boo$15boo16bo16boo56bo$10boobo 4boboo27bobo55bobo$10bo10bo85boo$11boo6boo80boo8boo11boo10boo$8b3obb6o bb3o10boobbo20bo40bobo8bobo9bobbo8bobbo$8bobbo8bobbo6boobboo3bo19boo 41bo3boo5bo9b3o10b3o$9boo10boo7boo7bo18bobo45boo5boo11b10o$35b4o86bobb 6obbo$125boobb4obboo$113bo$30boo7bo12boo59b3o$31bo7boo11boobboo58bo$ 31bobo4bobo15bobo22boo19bo12boo$32boo23bo19boobboobboo14boo$77boobbobb obo14bobo16bobo$36bo17boo4boo21b3o34bobo$34bobbo17bo4boobo19boo35bo$ 35bobo10boobb3o9bo49bo6boo$30boo4bo11bo3bo8bo15boo34b3o6bo$30boo14bobo 13boboo12bo22boo10bobbo4b3o7bo$25bo20boo16boo12bobo20bobbo9boo14b3o12b oo$25b3o51boo48bo3bo11boo$28bo72bobbo24booboo$27boo7b3o61bobbo$35bobbo 61bobo$35boobo42b3o11boo4bo6boo$31bobooboo39boobbo4bo8bo13bo$13boo18b oo18boo22boobbooboobo5bobo5boo3b3o6bo13booboo$12bobo18boo18bobo16bo10b o3boo4boo6boo3bo7boo13bo3bo11boo$12boboboo32boobobo16b3o12boo41b3o12b oo$13bobobo32bobobo20bo42boo11bo$15bo36bo21boo14bo26bobo$14boo36boo34b 3o26bo$13b3o8bobb3o8b3obbo8b3o33boobo24boo$13b3o6boo3b3o8b3o3boo6b3o 32boboo$13b3o6b3o5bo6bo5b3o6b3o5boo26b3o9boo$13b3o6boo3b3o8b3o3boo6b3o 4bobo26boo10bobo$14boo8bobb3o8b3obbo8boo5boboboo32boobobo$15bo36bo7bob obo32bobobo$13bobobo32bobobo7bo36bo$12boboboo32boobobo4bobbo34bobbo$ 12bobo38bobo7bo34bo26boobb4obboo$13boo18boo18boo4bo3bo9bo3boobooboo3bo 9bo3bo22bobb6obbo$33boo24bo3bo9bo3boo4boo3bo9bo3bo23b10o$30boobooboo 25bo4b3o6boobooboo6b3o4bo24b3o10b3o$29boboobboobo21bobbo4bobo20bobo4bo bbo21bobbo8bobbo$29bobbobbobbo23bo4boo24boo4bo24boo10boo$29b3o4b3o21bo bobobboo24boobbobobo$29boo6boo20boboboo4bo22bo4boobobo$29boo6boo20bobo 38bobo$29boo6boo21boo38boo7$76boo6boo$76boo6boo! golly-3.3-src/Patterns/Life/Syntheses/0000755000175000017500000000000013543257426014752 500000000000000golly-3.3-src/Patterns/Life/Syntheses/blockish-and-blockic-seeds.rle0000644000175000017500000002262412026730263022435 00000000000000#C Upper left: Blockic 10-glider seed for a p256 oscillator -- #C gliders that must be exactly synchronized are marked off in pairs. #C Lower left: Blockish 1-glider eater2 seed (pure Blockic except #C for pinwheel quadruplicators for gliders): 29 Jan 2004, #C eater2 variant synthesis due to Mark Niemiec. #C Middle: early version of Blockic turner table, used in the #C eater2 recipe. Delay for each turner is shown in Snakial font. #C First column is turners that do not change the glider square color #C Second column is similar, but for color-changing turners. #C Right side is an 'unclustered Blockic 1-glider starseed' -- #C blocks are separated from each other by at least two empty cells. #C Dave Greene, 24 Aug 2004; star synthesis found by Jason Summers. x = 691, y = 391, rule = B3/S23 302boo83boo$302boo83boo20$114boo$114boo3$109boo$96boo11boo$96boo46boo$ 144boo3$139boo245boo$92boo45boo245boo$92boo$$109boo$109boo5boo$116boo 26boo96boboo76boboo$144boo96boobo76boobo$246boo78boo$85boo7boo18boo 131bo10boo67bo15boo$85boo7boo18boo23boo105bo11boo66bo16boobboo$120boo 17boo95boobo6boo68boobo6boo19boobboo4bo$120boo114boboo4boo17boo11bo39b oboo4boo25boo4bo$79boo164bo10booboobboo60bo$79boo17boo144bo11booboo63b o19boo$83boo13boo4boo138boo78boo18boo$83boo19boo136boo78boo$131boo110b o79bo$131boo109bo79bo$143bobo96boo78boo$78boo20boo39bo5bo$78boo5boo13b oo24boo$85boo39boo12bo3boobbo120b3o83b3o$143boo124bo85bo$140bo4bobbo 121bo85bo$81boo7boo471boo$81boo7boo49bo5bo415boo$143bobo3$77boo34boo 270boo62boo$77boo25boo7boo270boo62boo113boo$104boo388boo68boo$494boo$ 70boo46boo324boo23boo$70boo46boo5boo317boo23boo$101boo22boo195boobo$ 101boo5boo80bo131boboo20boo155boo$108boo216boo18boo119boo34boo53boo$ 66boo120bo3bo133bo13boo125boo89boo108boo4boo$66boo52boo205bo12boo88boo 236boo4boo$120boo64bo7bo131boo8boo19bo72boo$124boo190boobobboobo10boo bboo15bo108boo34boo$124boo58bo4boo5bo119boboobboboo14boobboo120boo34b oo$83boo104bobo134boo16boo152boo$83boo101bobbo4bo131bo171boo$89boo27b oo207bo102boo$89boo27boo68bo3bo133boo102boo17boo$322boobo123boo214boo$ 190bo131boboo113boo224boo$87boo350boo$87boo5boo404boo$94boo92boo165b3o 142boo$187boo166bo194boo128boo$189bo166bo193boo128boo$554boo$300boo 252boobboo$300boo256boo95boo$468boo185boo10boo15boo$448boo3boo13boo 197boo15boo$448boo3boo42boo$173bobobobobo203boo110boo$385boo268boo$ 167bo5bo7bo473boo$176boo357boo$165bo3bo3bobbobobbo284boo67boo$176bo 145boobo140boo63boo$163bo7bobo7bo140boboo201boobboo$326boo199boo$161bo 4b3o4bobobobobo144bo$166bo160bo162boo$163bo3bo3bo154boo21boo3boobo132b oo$314boobo4boobo23boo3boobo125boo$165bo3bo144boboo4boboo157boo14boo$ 320boo147boo28boo$167bo152bo148boo178boo21boo$321bo327boo21boobboo$ 320boo334boo18boo$322boobo314boo14boo22boo$322boboo314boo38boo$131bo$ 130boo$130bobo222b3o$350boo3bo$350boo4bo$$300boo$300boo$$118bobobobobo $$118bo7bo467boo$121b3o259boo209boo46boo$118bobbo4bo256boo257boo$122bo $118bo7bo371boo$242boobo76boobo172boo$118bobobobobo115boboo22boo6bo45b oboo$240boo4boo20boo50boo4boo$240bo5bo73bo5bo317boo$241bo5bo73bo5bo20b oo294boo$240boo4boo11boo59boo4boo20boo3boobbo$240bo5bo12boo59bo5bo26b oobbo$241bo5bo73bo5bo262boo3boo85boo$240boo4boo72boo4boo262boo3boo85b oo$240bo5bo73bo5bo$241bo5bo73bo5bo279boo45boo$240boo4boo21b3o48boo4boo 169boo3boo103boo10boo33boo14boo$242boobo23bo52boobo171boo3boo115boo20b oo27boo$242boboo24bo51boboo17boo296boo20boo$164bobo95boo79boo318boo$ 162bo5bo4boo87boo321boo5boo13boo63boo$173bobo179b3o227boo5boo13boo63b oo3boo$161bo3boobbo3bo181bo321boo$164boo190bo$161bo4bobbo6bo359boo4boo $174bo361boo4boo$162bo5bo9bo$164bobo9bo$494boo$178boo302boo10boo90boo$ 178bobo301boo33boo44boo10boo9boo$178bo120boo216boo44boo10boo$299boo 291boo$381boo111boo37boo57boo$381boo111boo37boo$246boo74boboo$247bo28b o45boobo16boo173boo53boo$246bo17boo60boo14boo173boo44boo7boo$246boo16b oo61bo235boo$326bo199boo$246boo78boo12booboo12bo168boo$247bo7boo67boo 14booboo3boo7bo$246bo8boo68bo22boo$246boo15boo59bo$263boo59boo281boo$ 246boo74boo283boo38boo$247bo21b3o51bo323boo$246bo8boo12bo52bo$246boo7b oo13bo51boo278boo$602boo44boo$648boo$355b3o$355bo$356bo293boo$650boo5$ 422boo116boo$416boo4boo116boo$416boo166boo$381boo201boo$297boo82boo 194boo$297boo237boo39boo14boo$242boobo71boobboo3boo101boo16boo87boo55b oo$242boboo72bobboo3boo101boo16boo$246boo69bo284boo$246bo70boobboo3boo 18boo254boo57boo$155boo90bo73bobobobo18boo98boo147boo64boo$155boo89boo 69boo4bobo31bo88boo147boo14boo$242boobo72bo3boobo31bo253boo$242boboo 21boo7bo40bo8boo331boo$240boo25boo48boo8bo116boo213boo$153boo85bo85bo 117boo$153boo86bo16boo57boo7boo$240boo16boo58bo8bo330boo16boo$153boo 87boobo71bo8bo12boo317boo16boo$153boo87boboo71boo7boo11boo$344boo$344b oo$258boo95b3o331boo$258boo9b3o83bo327boo4boo$269bo86bo326boo$42boo 226bo$42boo566boo$148boo444boo14boo$148boo444boo$49boo404boo144boo$49b oo10boo392boo144boo$61boo4boo32boo43booboo$67boo10boo20boo43booboo$79b oo376boo$49boo246boo40boo116boo$49boo45boo52boo145boo40boo37boo215boo$ 67boo27boo52boo84boo4boobo72boobo4boo22boo26boo215boo$41boo3boo19boo 75boo91bo4boboo72boboo5bo22boo106boo$24boo15boo3boo96boo90bo9boo74boo bbo31bo99boo$12boo10boo210boo8bo75bo3boo30bo214boo29boo$12boo233bo18b oo55bo15boo232boo29boo$236boo8boo14boobboo54boobboo11boo255boo$237bo4b oobo16boo12bo41boobo5bo268boo$24boo210bo5boboo12boo58boboo4bo$24boo 210boobboo16boo56boo8boo249boo$240bo75bo260boo25boo$52boo103boo16boob oo56boo3bo75bo8boo276boo$52boo10boo87boobboo16booboo57bobboo74boo9bo 261boo$64boo87boo28boo51bo5boobo72boobo4bo262boo$183boo51boo4boboo72bo boo4boo28b3o252boo$356bo254boo$43boo3boobboo303bo226boo$10boo3boo26boo 3boobboo91boo122b3o312boo$10boo3boo128boo122bo353boo$104boo164bo340boo 10boo$104boo505boo$$180boo392boo$116boo62boo392boo$31boo3boo66boo10boo 51boo174boo$31boo3boo66boo63boo174boo$428boo149boo$77boo349boo3boo63b oo79boo$44boo31boo101boo251boo63boo$11boo31boo134boo150boo108boo$11boo 49boo268boo4boo102boo20boo$62boo22boo147boo5boobo66boobo6boobo12boo38b oo55boo27boo20boo115boo3boo$86boo148bo5boboo15boo49boboo6boboo52boo55b oo14boo33boo10boo103boo3boo$235bo10boo13boo53boobboo4boo30bo92boo45boo $67boo166boo9bo69bo3bo5bo31bo$67boo178bo69bo3bo5bo95boo85boo3boo$32boo 201boo9boo68boobboo4boo95boo85boo3boo$32boo202bo5boobo11boo17bo35boobo 4bo5bo$14boo3boo214bo6boboo11boo53boboo5bo5bo199boo$14boo3boo214boo9b oo68boobboo4boo133boo64boo$83boo161bo69bo3bo5bo134boo$83boo150boo10bo 69bo3bo5bo$236bo9boo68boobboo4boo$45boo188bo6boobo66boobo6boobo205boo 74boo$45boo8booboo175boo5boboo66boboo6boboo30b3o172boo74boo$55booboo 35boo259bo$95boo260bo105boo$269b3o191boo46boo$54boo213bo241boo$54boo 126boo86bo$15boo69boo94boo$15boo69boo18boo$106boo441boo$549boo$187boo$ 87boo98boo$87boo455boo$119boo423boo$119boo65booboo$44boo140booboo$44b oo64boo313boo38boo$110boo200boobo6boobo99boo22boo14boo$126boo57boo125b oboo6boboo103boo18boo$125bobbo56boo129boo8boo30bo70boobboo21boo230b3o$ 31boo43boo48boo188bo9bo31bo15boo57boo21boo178boo50bo$31boo4boo37boo 239bo9bo46boo230boo28boo51bo$37boo277boo8boo15booboo258boo14boo$312boo bo6boobo17booboo274boo$312boboo6boboo12boo275boo$116bo199boobboo16boo 275boo$115bobo198bo3bo$82boo31bobo199bo3bo256boo$82boo32bo4boo11bo181b oobboo252boobboo$121boo10bobo176boobo6boobo248boo63boo$133bobo176boboo 6boboo30b3o211boo67boo$134bo221bo213boo$357bo92boo$81boo205boo160boo$ 81boo205boo318boo$46boo560boo42boo3boo$46boo75boo48boo3boo241boo15boo 197boo13boo3boo$122bobbo47boo3boo241boo15boo10boo185boo$123boo6boo317b oo95boo$130bobbo413boobboo$131boo418boo$425boo128boo$52boo6boo363boo 128boo$52boo6boo543boo$66boo16boo47boo470boo$66boo16boo10boo35boo7bo 523boo$70boo24boo16boo25bobo204boo90boo224boo$66boobboo41bobbo24bobo 167boo3boo4boobo22boo90boo214boo$5boo44boo9boobboo46boo26bo34boo132boo 3boo4boboo330boo17boo$5boo3boo39boo9boo20boo38boo51boo141boo36bo316boo $10boo72boo38boo185boo3boobbo37bo248boo$311bobobobo3bo21boo29boo231boo $313bobo4boo21boo29boo227boo34boo$104bo61boo144boobo6boobo277boo34boo$ 103bobo60boo148boo4boboo349boo$82boo19bobo49boo160bobboo4boo13booboo 85boo4boo236boo$82boobboo16bo17bo11boo19boo75boo3boo3boboo70bo3bo5bo 14booboo85boo4boo108boo89boo$oo84boo33bobo9bobbo95boo3boo3boobo70boo3b o5bo219boo53boo34boo$oo88boo29bobo10boo110boo69bobboo4boo274boo$90boo 21boo7bo109boo3boo8bo12boo54bo5boobo19boo$113boo42boo73bobobobo7bo13b oo54boo4boboo19boo9b3o277boo23boo$157boo75bobo9boo108bo279boo23boo$ 233boobo7boo111bo253boo$237boo6bo30bo264boo68boo$111boo125bo5bo296boo 113boo$110bobbo123bo6boo410boo$111boo124boo3boo$124boo3boo12boo93bo4bo 11boo$124boo3boo12boo92bo4bo8boobboo$237boo3boo7boo289boo$542boo3$269b 3o$269bo$270bo75boo$38boo306boo$38boo271boo3boo4boobo$311boo3boo4boboo $128boo9boo3boo174boo4boo30bo$50boo76boo9boo3boo165boo3boobbo5bo31bo$ 38boo10boo259bobobobo3bo5bo45boo$38boo273bobo4boo4boo45boo$60boo250boo bo6boobo15boo$60boo254boo4boboo15boo$54boo261bo8boo$18boo34boo260bo9bo $18boobboo26boo66boo3boo191boo9bo12boo$22boobboo22boobboo62boo3boo192b o8boo12boo$26boo26boobboo256bo5boobo$58boo256boo4boboo30b3o$19boo106b oo227bo$19boo106boo228bo3$64boo73boo$64boo61boo10boo$70boo55boo$70boo$ 119boo$119boo$66booboo214boo$66booboo214boo3$68boo$68boo279boo$232boob o6boobo66boobo6boobo10booboo8boo$232boboo6boboo16boo10boo36boboo6boboo 10booboo$193b3o34boo4boobboo20boo10boo34boo8boo4boo30bo$193bo36bo5bo3b o69bo9bo5bo31bo$194bo36bo5bo3bo69bo9bo5bo12boo$230boo4boobboo68boo8boo 4boo12boo$232boobo6boobo66boobo4bo5bo$232boboo6boboo25boo39boboo5bo5bo $236boobboo4boo14boo7boo43boobboo4boo$236bo3bo5bo15boo52bo3bo5bo$237bo 3bo5bo69bo3bo5bo$56boo178boobboo4boo37bo30boobboo4boo$56boo174boobo6b oobo66boobo6boobo$232boboo6boboo66boboo6boboo30b3o$356bo$55boo300bo$ 55boo$$59boo$54boo3boo$54boo$278b3o$278bo$279bo!golly-3.3-src/Patterns/Life/Syntheses/syntheses-of-c2-spaceships.rle.gz0000644000175000017500000000404713307733370023106 00000000000000‹ tXËŽ\5Ýû+.ÂKD®Ëï‘X‰HHƒ€mzhfF s£ð÷Ô9ÇÝ! }m—ír¹§Êýù›íöŸ§?Î/ç—íøm{9~?ow¯l{ùðöîüòðøáeûíxÞþzx¼{Øîß?þz~ÞžÏw|ýÛçóöîéøë)|þfûqûjÛ¶–o¶ï~¾½½RÒžn¶ï?¡”~³}û e´›íÖYß½}¾­ÙÍöæ8oâJÍu¿Ù~iíJ(Ó ·w.Þ»íütÿøt¾NÕê}sw¼?î_þ¸’{7ÛëÇûíë )Y÷•?üùòðöýñt¿¥ëÄ,Î=ï?”oí§ýËþvâã‹ítjýb{þóýÙû¯ó«[ËaŽ~:âõdhš7©ÇÃi œŽ¼{7g|Ò)Ѽ;ˆV¼·Ï“¯ Ì|(΂㉥“»:–>Ümøªì¿¹—ëTˆVOGÇšº¦£50É$ãÈ|$_3†o°ä¤‚U£œ?.øyÅHÍ ñf)élòL˜¥„÷;¯ß|U‰G…:N‡¯•òÅÚüèŽ1Y4H¹L—H¸¨ª³K˜Œaî]:Åîš³Øqù®è‚‚ÍC^Ü}¸˜ç7t N@~Ýâ/fî•jŠyRžî}—MJ°–ÓL`Ç!väGïvêsôq"µJ$žú”T8£Oè ƒS‚#ø·ò›]½ÙÛÆ‘sí`Íi7CoPì0B‰£Aó£í<³%‰Òv®wÖ½ ¹t™:ÑM-†D/Jfüî:Nî_¨Û\Ó~¬AÁp€ Ü·ÃLEÂM*Âi.\¡p%­oöCS2¹žLŠÆO ƒŽ—2n›$e†ä=5 :9&úOÒ‘t²cP¢LOh¾Ü`¬8ÍjLݵ’¨bzM¢Îû.÷¢lpgÒè ˆÇ¦õ 75š»Qn5 ˆØŽÑQ5×aëèÔ7#zRŠƒZãwµô¬1غNZ a¼èÄ2é‹®“c—Œl¢z×$4ÝmP_îÌqT±%*`Sº°Ë‹Oéðyß]·*ívW“Ñ/L¸æ-í¤>mÆa é»Z¨ H‡ùºHneá+¶OíÆW¬få.]›x)ܧ*&hZÊûí¸·cÄ~Å®@P×Ù¿Náuè³btuÖ”"8&ä”b‹NÅ1JCgè¶IßNˆ$33_Øœ.,ج©ÕB½mR_ÔK›s}™A”6¨°UÙ³‡ß‘fòÎ rpÈô- áÿ·ðÓuæ#.a~ y„îÈ=¯ÕÞMÌn }Oz±]“ÞOƒ^˜ðœ\v*åXìýHÂkj12UŠe0Z¦=r‘K…\ú¹H[YQæH#fb]näS§„ÚZ"¶w&¨ÀÇ]^hL„Žýâ6h‚µÚ–ñµ#Ó ˆkŽŒU¤¬I¯©3ᆱH¿ié·ìº&ýƒÈs„¬…‰jýH÷tùÕšcS¤²…#!çÔXèüÅ¥@¡”‡Pë–+…[Ph¡5Šj¡5^€üŽ™2_À¥Ì £ ¤~M]3ó6».ö5k°‰5 æKå™J£…±åÄBŽ…çv`Š54s0M{i³TX´µªˆa …'V±bËÒp£§—eg½V‰¸þï|zE¥@aÕô‘ÝGîà£Ò£4 r´XML™4«‘V˜‰ŠòjYUU Væ,(fr­Ƨ¡’àúªË$¢`1™kò+ä-I Z<zsO¡g©*EQ ŠÒÃ*dìÄ´”.>œ†ýƒ¥^Ù)û.Ù÷%»Íexxz2óGd§mYX]™­Ø©¨pê1¦%ÆÆÇ@¡¨–× }­/¢{µMq2U8Ôí«40ÀïJ/M™ÒC^KÅf8²¸ÃJèYoªùv5„_& ç¬æKqp¦·gÓÉÈp¸¥bA8ÁиÆ}P$‡†…!ÈŽ¤#;j’oÕµXÀf¥SÌ€,b4ä q†øÃ¹ÓvÏUY¥®ÔÁÌ¿+q( eÂeMÜe_4(–<ÁUå99”¦t$[¹GåGÐÀ”5UŠ­r*¢À±ëI€F•BVáÀ:Q #?tÏîIÅÁ¾j7ŠŠ^ûÚÞ/Ë€e-J™¦gÑq«F*¬ŸP0¬°ëm-hÁ µ]¨ª\é’µÀðåt-@ê|D©¼rkÕI¦ÜåÔìF–rjcí8y‚J0o¤BDŒ×Ê+]>a4MeÓ;4,Ð.Æ­˜]/ d)×ÖTBLƒOȪ8«ŒŠˆ\OºI7åYÍËK™‡oÛ%QU¹æ=&4–——"Så§ïÜiÎØí8´¶0à9úª9üÑ!G» vV½­e•ÐCÕ2 O–ÈYEYSI}\€,ÏÆ¤’ª|&Á^ÉÃ…ºÔ£„Õ÷õHK&ñvVh±l]̬'J¦º„¸Э_¾Î†o=tNz“¹[«»¼~PyÊ|®Jp¥A¼ qÂ1G49Ÿ 0ùšâÿø¹+#B¹ê®7%pÚ¿B¹18mfJ†æòÔJi”×sªQžuÞŒ$9w=)gÖsÛyUSþð+Â{ø´õ7Â1õ bþ± äÄ$†«¨öç<«õ¬ç\˜ Xq%=È'Ã%)ã\/¶ËRkL|þÿÿ3…;ýgolly-3.3-src/Patterns/Life/Syntheses/slow-salvo-MWSS-oscillator.rle.gz0000644000175000017500000004257313307733370023071 00000000000000‹ |ËŽe;ržçë)ÒP²–¼x'Ø6`À€ x\yº$T}v£ê´ZýöfüßÏy.Òd÷Z\A2$ãFò¯þþåÿ|úá_>ÿþåû×ÇŸÿæû§¯ÿúxùáñã÷Ÿ¾ý釟¾<~|yüãË?ûòøýKé÷ýòøþׯ_?ýôø¦l_¾ÿôåǺþêï_^"ç?>þôíåû矾ǟúúå÷Ÿ¿ýÍO¿ùßÿïþáåÓ¿‰D<àU`ø×Ïß~úüí;þññíÝ˧—¾>¾ïJ}}<þø·ñîÿþógãûþòåÇ—Ÿöß?ýøå÷_¾}V-?}Uý_¨ÿ§oŸ_þøõÓÁþñó§o_ÿò_Àÿé;ˆ_~z¼|þôÃ?¿<6¢oñøïß¿¼}ýü·//ÿó§—/ï"ë—¿ïZÅ··/?}ûôíË׿¼|ýôíŸ>¿üþó×Oùþòé§Ý¿ìï¾üøUÜXvõ¾üñóï¢í|ÿyÿ¼©ù²‰¸ÿüøö/ñåçûôÃO}äýþéŸ_þüé/ûßÿýãüòu7ëÏ_~úç—ÿöûOxù?ûò?úa7㯿¿üõ÷¯øô/Ÿÿúw/ëåýéÇÏ/ùNãú·—¿{Iyûw/‰dÉ«üîåÛŸvãþîå¿—ÿú¹\ùñšõ5¿=^ßvúíñöHé5Åÿ”âÉþÝÏúknoå¿û§¿=òýZS<ٿ׫îòk‹Ïš>kú¬¼ö™öïþigÏ<£ëÐ ¡A™»ÌÏÄï|{Œ×Tn=Û ~wöt¿&•žê­šn°Ë¬¯W*M™ªoðˆ¿Myy›òî¢jÙh£%ijsÅÓ·G{Mƒê´¡÷‘ê;W¾ŒL÷kN=h“Z  ö_9ªúš‹Š °çôš«(YUÅå*úÍäÍ È»5Wü'/ÍiÅ,ê’©fæäÕõl©.kåòš<›B³v ÖkI"g€øÝuÌùµõEQ•K”ßÊkéréÅNnö4¥%£ÊTâ7(T†ú=@üF[ˢĥW ÷Í> .Нj4o ÄoãÙäÙÔ³%6­%^‚ûiYA®ÚôgwÖ¦V­M•êV‘¼Ö.|M„ @æÇ5_+ÌYUß:ÈØÕùâwƒÕI¾ Ê:wÖå]u©‡×k»£[Ú­¾ °Ÿ SKŒ’`6¡iÑš×VÔöVŠšÔÄ ­¨W[%£Тõµ5õ~€ø­ê‰ÆpkoW‹—vU蟦þiÑ?%fadÆ÷½òý¯æ×«7• ~»ê½SC=@°ôNˆ¢âwhôC¼Wä>£Ù}Þ1 t†˜>Û¿3(Ø©vWµ{T;íڌԙ/¢˜‘TÌ€‰†˜hÀDz”ý&ÊU__÷ã:”µ1i‚1‰m”•Âk4ÝéHšÊÔWä-þdÿµ®ÑM·Ó3Ò*±÷CD4XF„U=è†Ð¢zˆJcS$bJˆ'SüÖ‘ûç Œ½ñPwvÚ¥¹UX£‹)¤«>4å½Î[ý~M1íŒ6€^eÀC¦z&ÍF4š`s︧›P4@Ô˜NªÆÌþ‰†Í*& ̘töo<½5£ÏÒ)R`šeÓþ¬GgϦΠ%kv¦‡€ûq_jdø'1³R°tÒê6ÔÍ™Vw<¦JÖ*‹qÿ:§ê:iÁLм@‡¨Üþª¦ÄkÎIN:q¿…k‹z8¯ò:—:`erv·p'á•€ßæÙý•ê ~›§õ ó|c›ªH¬ S3èb Z©™E6³×'»&\Ð,@üFӮŽ´F¯X*³æ÷¥æ¬hNÝí[¨‘ÔŠ±S“Ôì”ÅâWchBí)jÏ ö2 Ðÿôý^°¦Û%¿ñ¶ü3"²ÌE:få¨ÙÝ‚_—˜{ÁÜKÌ}m&ØÕojcpïbÅ¡VÖ³¨ÉRM–j²Û›ÜꨒHÞè4)jÑZš°59‰Mãÿ#Ú›á±søÆÎ”y--8‹gO@’P¶T'ñ$àC#7ÝZ‹5iOTU•QB ·SÎ[É[£=[¾¹YϺ€&ãÝG#ÆoFgÞ™¸x/#Xd V ñŒumˆ(P«ãNYÄËÈx!/d8=®®Ä‹»‚)¦È+ ñ4O;{V]‡Á•¾ž•¿ãæoª.òîº4ˆ4+g§—ysËœ™&$·(ñ7S‘šÄl®ŠÜÝ´MH<‚’v·ðºx¬9 ¥E»4T/úïÜ.5à#»nQtV-ò½Ä–NØü}é¯ñ"¾|¼ùã'’1ž5×§lÊku tÚÒH‹uaމ†Ë1 ÔÈ5dC0ÂRnðz‹êB¤€¦·$ej3ãì‚zÐ2šnAJIÔÀ¸$Zƒˆ½üKÝòÐÿçä¶5bnÉ>µ Á;ûÕ€¨¹Ã¤Y«ÎÑYQra¨TL>…J¿Î¿Ûä¿Ë;ù2ùLÅÒÍÜ9‘'e^lx1¯¨™§õOš”è?gEĸʬú‚Aà{ÔÙªM–„™á©n\¥“viżX4KoPKyúó)^Ês‚URÎz#lþF= \H´zp=¢/A+“ÿmbw:&H¾fh€z³Èž0Í‹S|>ÝãYË8éà}rŪ}Ø‚yçJèbf„˜R':k‡g “L¡àâY¨ v—èõ+Ùo×ùFŸ½;ÍB“-Re%ê+$†Qj²”pí¤pV)óã$CürÎåù«fÕ¥fPˆ„=y<$+諞¬Zý60žÒ¬+KGŒVvwEdmzÜF¬œ1þƒwª'*ÔÂT˜nk£ãÆSQ¥Fô¬Qo8§Šï‹•÷û,Ù;Íà´·ÿK¿b>? ;YAGµk§ƒ+`4Ø3ZeF«1£]˜@Reþ¨±ì•eõqpÅ’Waƒ:lbjzR/¡¶ƒ!ÀP™-©n¡+b³l͸yw7†b“ȽÁpÞè¼g`2f#ÉU4ÒXm9iˆ­Mž‹J+ËŸNø/b’ þmƒ¹®Áçm¨×w‚Õ¨-,LÅ®;Õy´«„[a COº“Ý¢N¹tW¥ÛnÔ1u MWê°v7ki¿YSLª£ÚìêöÝBM/¦vÉM[¼éÍß3ít™øëj4ª!A#ú(3½èCņ„s’ÃÝÓ¥¿¤vÒjKðç¦TgôéÊÎbvæÆ¾üb7vÈÔ³×ô…X‰óF£!2dCT½4XF¡£F±Uo IIYhÙz“=mÈp¡/³¡KÁV7l¬ÈÈA–áÑ>íÒi2ìæƒ®²æóeh²Åì7ŠgÝH<0ü –X‡Ú Xg¬کÙgã˜p÷˜ï-z(à3­=˜'4›¢“ú„nWáCxŠ3Qf@#žpå4WN¸2G sf“»gÌ6Y'dÍ[öž‚¤¼§i=B‰xnMbv×–…cÊFµ„0Yšæ`HMIÏËtÁý› fÝ~ŒæåÒúk²Ú•PÖ qŒ·yeeæÏ• œd(.l;)´.e’t²Ñ„ijgM<Ïçý~x¥ƒnÀ$ЊʪFRýªïBæ]eGF]ÒxÞ¯‹ñî^^ËòÀ»ºL¤¼ê7 ©Ó„KõäE2 «….¶¦«…þ¯æ/õëZ¹2ªËÖTAIk&þbŠxò«‚œ1oˆÍUP` $?M<•<o5Z‡fJýÃV¾“™ddªþ¶úÛ`]ŒÞ‘~T*3ïU]M:"ž—;N5Ô*‰¦2\Ìgqõòw›b˜ÅÿÉðÚ]‡˜fd&¿%H“|PÕ–Þß]Ï7{¨ä»cx(PAÜ]Áªp3à2u;ô7TÇØ,(ÐÉ>]½Isd÷¼w+þ¥D¼XØÀ·(ü‚èÑT³ÕlEuE†Sw¿ŠÞ˜2»aIÓ}NšîicbÊ÷ó!Òà^Ù2”=ö°ìÎÀ›‚ BîUUÞÖÀœškK&Æ›œ´n*gŸ´6AýÜQBÖ^TcÞЙP¢22×h’±E H n ŠÑzéÑLÜI–6°)!#ÞkñbbÁs¿^dP ÔQbÂÖÍ„¬È5Dï$t5²È™Ãû]Ëñô”ãÂPùŽhÈ—ÑrhÙPëFæ$(TI{Q2n”\Ñ8n6 ™’ùvSvû € \=ÅT¦˜zkºÛpù±WY'63⨉ç1§ß|Ò†¬4SÑã•ÙbünޤøFÖ{AühR@s8b²¡(WÅ/A^\ÏB=%ÛæÆôW1¢¸Òm“ÌŸäøÆŸN{ðœ÷ΰAK–mwhë”°¸)Èßtziºv“"–Lùù¹† ‹üC…‚ŠW2Õ¿¸ï­j褪o˜d2ºÆMkhnò»‰¸MÖ;Lxúó`¤ñnQ“<ýzƒ;å3fÏ­ðk‡ ºGntbs'6:qÛ¶Œj‘a1õwÖ-AÄjš-× ˆQ­ç,+ª l×±n FkzaÉì&ygêE²Uî•útéžYjÁîáÞÈÕ2KO$örïêüÞŸ+MG`~騙)pc8’™©ÊÔ§ @ÏN#B@CªŒ*H-ÈV ²Õ‚+¾¦É€&óöxôgõ6ÐæŽ ¹/×p5ÔºMF¼ PÈ8¼0<» f—‘)¸å6˜e$ëÔyÀ_ì5`­˜ÿqŠä'H•Q8Ð6O­¤mm÷ ;æwJmø+Uü•§hÂ@3h“j@D»Øaéé ˆ|ˆ”¾ÓŠ Åˆ`ÅX™]gaøNOâR°ødi8ÔÉ•p6ù ód¸¢}l`z,ÓcšÓçÍ0œ^ýq“düzÈúó`9?0ýý<èÄ-Ó³…Š'§¹ÕN¿Ýµ³¹’z3*ÈÎÊ( zæGs”ÂÙÉßwªÙ¸;jb‘‘v&Óé”t¸á 2Ráºëއİ’Ó N(Y[Æ0’\Ž£ÏÕ†KÌGå#XÂØ3”q ©&X :5Z}[Ú, ½`0Þ l^ÃñaaØy‚êÍø'ÆV¬øûpà Ë<´hÜJ®rR]x[º”±,=KÏ—Ÿƒ4ì+»ò™ÊçêÇÃa~9Çâyq¡¬ç«dÚU\h,ÒÃ35"ËnÆá²Z°P ¤¤õ -ëÁF‡DØ$¥¼–‡ÜFÔBíb ?æšîš(%Á–x y¥ Ù<“U,B+„! ;³Œ¬J?ôf·¬Ü•øùÖDâGWâ¼VvÊ’°àÈ›‰Ѫ¹!D*è:WI4@Úi‘ÒS7œÆ!“â :tcsëYU®¯Ð6 ÚF‘¶Ñ¨x9 ÐAÄ'xªzõˆ¢ÙDAl ¯ˆÓ* ‡ Ö]J°Å AoõS¢zÁr¼1ÄJ*rJ¼†ÅNÃb§a¬r)¡’ÈØ úCIZzŸ±úZ5)‰ÈA¡ i©»EÁÚ<繫k ¸BŦ«’°MJÓÒÞNQµé6Ìz^”zÚš /×Y»à«+ò}&Äá‡?ªÇ‚`¬õiE(ŠQÁ°P’ᆂã±6UcjDÉk)5œ âÒ#Í’]JRdžIÄ:iVÙUœbŸÌb%(04ˆJnJtñrÒê 5Kñ5Ë© @× "4î*Ž+':®d,‚hÀ%ÃYöÁá,ðŒBÕr†®É˜Ó%þ•¬ñn,1ÂÍÉYó—Ý1®C!WÌbN"WìGCFÇÇyŸO>Z­¾fÞØ{¾éP´^n¢ÂJuJ¸ýÆÆ= s” @‚RõøÍ›™ZÉ÷ Ã½Jðøä}X!FÅä*H3j‚½ªì²o"rPž@úG ¤˜ÒUœ“ÿˆJ%Ò­Ô;Áq•VJ—ܽQ´¾mÀ,Vuj”y»ì›Ê%?<—cõTâz‘ï«g’ø<œÇ&)·#±ŒDúzomÛ¤®Õ¨+õ¬ŠØõ­Tvª–J¸†@Ãü]Ã"U gª{¦Žû´‹. 2>ðl~©—=Q—¶šœ)¤‘,¤ËyômÒ+7§0Z£UšànGÚ"(eŽ(¨vÅšÝU¬Úíœß°S2¹…Þ½MžÒÁ}(õ<ïñ8£dMk…ZÜšÞ„(aâ’ãÝòóeÒ.¯¯uAÚU©²–àƒE¢ÈAFG6wpÃ*RZPø’m¨4­Énº•øÒ$þH°Rúá)CÊo²G‚]o¿½M‡†²%`>‹dGw‰ï ƒÎmªw©ù‘Ф©ÆQNô0£¡)4æ2Ású ¹ Y.hÈÈrEñ¤Í퉠eÍšŠ6¥éC˜ãÞE:izÉN?NÏÅĿŠø ^ñBØž a—в“Oǃœ6{t¹çK¨Ób<éÕâàÎ`踣ý£®ày±"?¶W%âyŒ¹´»®Kˆ/á,ˆOsO=I‰aÞ³jA‹ÙIÉÀeà¥D-ÿmà7åø™Š\[6dY¦!ÃáèTbxxËE šŸ2ªŠ\0& 8æaÀaAr |)êr7{,ò/Sv,K2Å _Aß,Òöâ±§Ü¡ pWD~…Òuççë|°¨~ûEPiz5Ÿxi7dŽåÐñSWDë±Ü"F¾ÞFC1 Ò¢ù,·<>”¿ÞKU¡®•ƒÂÔ#x B²iÁiÒâiIVgGП„lh2VÅÁn8ÁN¸¦ @vuºŸwžKãÙë'c~júؤ™7uAxŸ„E ºòÄ j3ý8¦‹¨Í<Ïo?ƒ)vUµqˆþ$F.Eßb<Ë’TtE¿£·ôÔËŸåX8–zÖÝ{BC•\$CöXèà‚²¸‡šbM Šf °`‘dÒ-¸‹TÏ(\’T]š[¤áú;Ï1ožÛvˆ]ÖfûßÊz®ÍË’ìÒ¶Fe«ëW=Fô¦jÓLŽfi`uo{`êÂ!D´ g´ V©-ïPêåA –ÙŽ?±È5Xq o™é~#HSI+‹$Áóuw 6Ö\d¶þ±Ð?V ´­ôméŒ>·dÿ $eT{+^Æ*/ãˆ×\šÖcÕÏ‘\Æ£½wp‚8kKNlÖ¸Õ¯LÅú#b@×[q%;y«mž;G¯Š ê›Í*×\€vЉÕ@ ýŸ´Ä;™î§ÆéŒn^ïZ"åê}v”\nF¥G¼ˆz­Sµmľx$õGòÆ›ªÒnêÐÜ—Ö¨øp;†«up96Ä‚w¡»ílþªÁú.ŸïÕ±Þ‹—K‘Ðú Yü\ÑÀã$èS\d•²Æ[¶ëÜb²‹¢IÓÙ'Ù'Ûsîujm’°ûq‹l¬¯ÕîÍ £cT¤ Rš¡ª|˜ñ›Yvúq±¢ ‰òÁ"‰( A ó3ˆ –û­,ñ]ÂÑ#N:€½`@ô¹JÜl%n(v¸ªãN+q§5±¶ýæã(ÚÛ‘ˆ†­x8‹¹"ÁiâÞ¨Žu­ÄºVźê¹û-Ño ŽÐûš=²3#;'¶ˆÔŒ;DP ø9ò³ 6ýŬ™v2Ö9A¶NåÎ÷2à5Çéù%knÈ䑇wy ÕT¡–É›Á M^ "˃@ká¥ÄC1µ° L)µµ`¨âû8¯Š“³Êɹ+SL~¶¯m@£ìú¬¸>«Ô¾EÊâFRQ%Z‘¢äªH^•^Q#€¸ÿ15 KaF­n aŽUnƵnW+ñ‚.™CJhvÂo0u b”ÙɆQ¦Ö~BË+!µ6ÛH/ÒzD0B=à*óª^ÀqþæóXì™öÚ×Yݾåç‹çËÆ§×jå¯ZùÛ+cmu•XGÞ-–}ø‘œG¨Vú)Tׯês)ÿ³¹6yM¦ëªPÈØ—Øä©ØÞmÍ–½ÚØ‹P›Io]kk5ôËÇÙW•`s!㿳9‘¡ÉhtyEl¸¤˜ÄÚ*ì;Ä9UñnVy7ã-ÜG%™¯¯¹¨TÀ‡"Åk÷ŠÖ¡P—}$ð{ÛçY{q¹2‘oÀ|׋º›W T— [åÝ J±›­Æ66qœ÷³Ÿ(Â1ÓêÙ˜V;›%d¬Óö]%ñ¿1 OjÒw3£ÆÕéa3YÐ'û­êÔ‚~‘ˆç±˜ïšZ®®ìLŠ®–ø©'Ú®‡ŒWåWÔM”“ymv¨;ÙPc§(Ý-oc"ê¤Ê™\UÍdWµBVQȪ² ¦r0ºï~E¯Â_kÈÃa#¨ÆU‚ñF° ¼2Ã%d°ÁpÓTqQZ'ب?b‡ªÂ wOOMqg“kÌs`’q2CÍóz~¨òt ήKн™of•ú·N¥hùY?¹óÉ­ábýSP@ŽŽÝüدå^‰Vã?ªñjÔl1+Ê;È ‹‘«žðƒÍUÌ.“=ÆçRõ†¬Ê†¬ªYÁRåpV>Æ$µÌd‹Õy¡»íðƒÅˆ‰‘@³PÈ-*,¶Åh[lK­ÚÜ ÐL—æb5±ªÃ0ÐvYžš'ÓÂÉô~ž_ª;)£ÿ¥fgÐv·ŽEBŠ’xËUqG²ó¼ZoŒñ·Êby86âGYwöoÁü5ܹdBÒ`ƒ|˜¢jž0>ÚÁø0eoG’W»6¯º§Î“£€ i,•ÝÒh2½á á¹oA'—,C.]V=T]HÖÇ0ËÊçkúºÉúÚnVCÕnöý ÊUïÙç1ðÇ+n6‰åÙ¥¨$胋ôþNzG^TY†1 €ÖÀ1@Õ©ŽÔûKmÇÈÒn¢û©[—ˆúæ]vMŽ\MY g¨êT /Aù5š]¢ hÃ#Ú¼¡³¡Š§û!R,T¡Ú7m»Œ¯žz“Ò–™št± 1ˆ”'¨%É ×†“‹ÃzZbƒlC©j °š¤æººe^x•ó €"a›¶ã¨à?‹nK¦ ›ùš6KÖ¶«’Ý—Äyn 0„f?cÃÏØägÜnlÜ@º‘$?gPJ7ª»šl¡.!XDKyÓV:¶ÓmáQJ@+fͬÁãƒ< ŠöÈùËKîǬ6ì²à8S´Î™ŠÄœ èªRliy“$h¡úmgèì‹SBGLH‡'{¤ÉˈS¾•äÈ™1Út˵áðs㙊çÐ#Y®6ȀC¢*­hþBM©Þÿ÷lQ<g–s0@+å|ž…€!‹(ÓV\U÷j«Êþ F+²Ùn ˜ŸÈ?ä¿Îm?B pFã9%¥“~xÃjS,襮©â1Ó|6ÈÝ*LÂÝVÿ c7Þ†5»>7ºcÝB}œç䊌ìQjÄ©6‡©¶J¬º Å 77ÔM¾)Q:NÇVÙ«N¼j<«ˆŽ.(à‚| NO7(ŠŸ¿ðóÍG> åœrŽHÙ9ˆ_½¬MÂ÷ç¿|ܰj5Ÿ«Òˆk?½ñ§­ªÔpí*`LùdVŒukžæš§9ÇÙîK% póÂv“[çM÷›³Ù#ÐŒã±kMf|8©w‡]|ÿrŽKkL„Íά†;¯564GÇ6¢c›¢cS‹ÄíçI‰3b4;^R½ŽÛr3a®­cĤլû5t¿&ÝoEÓ´^YºÍá;ÃÍóhž'ÔŽ_[uï]>ôÖQ¦[G™„ ØðÖâè˜lÈ쯘֮$q1ý;t¶:Ë›è$Ó8I¦uìÝrÍ;å„w3ÿpN) hƒÉn  JBl¯qÜLÓ¾¸²ë2Ìf6Shkõ{rçó•Hÿ›/®(z"#M†]´ç¬ÁœÅ^½Í_Ó/¼Å­bíx8Ý‹@ˆ²»/p>µ‰µNF—òŠ`ÖÁÞO¸nTé0¬ü˜‰=å›ÞäGãhh OOŠã¹KjQ×çN)NÞу‡cJ‚¸À‚ƒIrþ ›’ù|ÕæÄUY"­mç‘d¿P´ÓRÓ&µ°OÏw `¥ÊÉ錻hb·дbd¥µåyäÒ_PdÑzˆ™‰aÚT–²€Sá2¢õŒb‹ñ¦Ü”J”K礒®“JR êÔFj_=Ikƺ7dކËÓ•™§2r€bGÁÕBŸ¹²Z‡ºÏ  <Š-¡hÓ<ŸmôJ?¹ž™cPúòމ-HµS8= £<„N_#­ HXí¥ñ£àƒ>ž®ÐENÊFÞ꼨˛•P‹ŽúÓuÒGšqÊãŸ]p]»àb8[)éü]:É®c•âGýµ‘OE×{AàSOkð\üÓð.„8?ùDz,‚û±ÆRE䔡‡^qéCÎ ¬ØQ;jÇôy– {e”T÷X¥Çb(þö›MEâ²ÛõvûÀCY(»Â%¯ùá?n· T÷ÙÝgoìÖY7éè&W—r’2g)™@J *"úa¹¤ðPË", ŸLF-kgÁqѵ߰:Npÿ‹©~6"6»#6¯îÍ8®rPbwPb|âÕ¡±:H‰‰ª3É^Jèõ`06&°¦ ÌMcÛ.ùbÁÛêGï8ƒOz’•fÃæçªjg3d'Â( ;øÖÜG!á]’\{c£H9i/ŒÈÿŽ®Ò;ÁCõ¤'îtŽ™î5H(£Î!”¾Û1×qÌu9æíaÔ Y v²ØVÐ{>3H§oz~1;~hêõ±­Å÷鎬ù3Z$’w|46™Œ.%ñ1¹ú´ ÁøB~{:ŽCIzÇwß;ôŽˆIÍ–¨¨Žç°ÎÖµE,2ðý ßɇ§ÀM–y†vŸ>t:܇¤?š B»AbìÁüƒA8<ƒð!r°#ŒÐµ»ºI†H k*ç+°çò‹NæÆqÎ:5Ud»ò‚Öe¼bxt,W Q©³è÷ZÞˤU•ƒ$ÕÄ•(¡I£þ‚’O2†dÆnÍîݚݻ5ãl™Þ—‡Õ¢ßt`Žûô±¬H;ŠZÍÁ"–Ðrº|…±9ÌTÐdv¼£ªê°ÓLÛÃ{mª¹Ž KšQ œ€ÓŽ·O¯Ñ3y¾îíÚ·YÝÍò—{#H÷Îy™¤p w¶ ¶“ ,«sOÓ§p b=‹“h©ƒÃa]K©}çÑr ,ÚŸ›§Z¸½ÞÙ½;3:Œ}™=¢P5ŽŠ4i5¯£æu©y@ß©“¼L¶Ž…CÏ£å× _ù˜_±,}úÞÉ)¼R¢"÷ðQº,žŠ+½jªë:,°s€UwhÇÝå‚,ÍCo«Šhe ‘–‹:{1ûèá–]›a}vw]©§ÉV`‚ ÆrxkŸØmOc†i‹(’ÍÂ"(°D\¸0_./O;5a–Å>.Á÷7Â4ª'¨%-gž$ =Ñœ=¢85 ι‰1nMXˆ“ÅÄœßÒ}~K÷ñ-‘ÁGßœ|߬ágÙ¸1 B‰Á.ÄqW¿aº‰iaÜô™ @2²åç‹çÑÅûƒá ½AÐÞPЧ¥ÄùP‚ 9 Ž'yæü‘_ãØfŸ»‹Ö58÷s$Ÿ‹3i$NÁ:$Ç'°±àA2ð0T}†€·‡™`À{hl4›gFPÙ 58P„ ïç‰Ä¼ÄÅ [1 wVZ1¶¨&ü¥v‘ ,Ó-:@Üe¡I¤×Ù”)8þ» îÉ¡žÜ@>Í1¼4qÜäÐ¥ }wô`þT DZÚ(-0ÏÖ> °à%Ée×2hGuÇTqˆ‹ÆïšXý8B+Rl 3,gæ@ˆ$ZPÊ·M ËÅŠ; ÐðÂÖ 1²ñ ÍÉ¥X~•Sýcîp·…"ŠÉ1NŸÑ[}“ÑGÀ ¹á`oŽiaT¡«ÖD¬™Ù¯òSN®'GkExÖ@ƾ…A|ï5tMTÜ™1‡QãÛ“ΞÓoæ{!˜5®æ2tÑCÌëË÷L,Vy…æÝBïu„ôBz÷P 7Ó¥ò7 ù›¢ìe9—Û6ÈV–Æ"ìM%çÚ5»ÊcÌ®ŒçŠ5HFÃ\çÑÄ• >ÿšœ‚?} þVw]¤)6ŒµÜNÿo^ò¥ç„Oø²ûg&†nv}0§MŸœ„:î<ùÍY?|²¥÷‰{Yâ gHú¼7ý¨ˆÁ‚v%O^ñ6}´HŽëMbS„U;“¶»¾)ÄVª/A‘¹¡Zþºd†éÛ(œ*ç–Ñzëö\r‘$W‘M·Ž$…?Ì[#¡A¢G‹çÝM .9ÑY1³ÉD«ØdÑYˆQä¢d.q cä›`‘h†ú¥?]©%¹ejoZ"¼l¦CÔt8&{Ùin×vµë¼`!™Ž†<ÄPãF'}&¬%‚zŸ™”£2YÓ󼇛/Ó÷Ãè0™ÄZ{˜gw¢U«Éq$3Ž#¹4™˧wr*§ôÍ÷§mÊ>}X@årn‰ê®à³çßóm7Í»×ÆÝ„EË0ÿLÄña0§¾ìDQ§:Z&h""gDɱ@l+»ôïN9ñ¼NoNœDn0½oŠðÐN^-!šJâ\ì¡zz‚¯-.gžÈâó3nda£sÃQ{ÀvU‡;㘉'ûü’/`ÑÔ‘b*gÊ7GIb*¿ §,Mí¢%aêxúŒü ‚™dR—àJtŠÐëæar?ÿׯiêJvX«hª Á,åpÊñí6ˆ¢Z-*§ôo_ù£àðÎdWZÔÔ––Æ)‚Éä_©°Fiœ®3ÉFz%M·Éˆ†j… “5'œk“dšIç¦UY §Öäkz·!“/)ªóÌ :T'˜Žº‰e`ùvfq¨zÎ4^èèº.(Ùmr¾Ïä|ŸRNú!E#'óâúå›ß.PM£bÁˆkð<-`ºqÖ M¤p¼‚ ö›¾qrãììaœX&f¯.·Ú1± LÛ¦mQS¯ XèhÀkŠ—GtÕ 7µ±aLÙ0Ò®~ëk,‚ˆZ²°Š ‰Ÿ¾Áo8ʇ™NH ˜ $Ñé»šÖØ'ûÄI.ËNÝ(l¢îO©û+ÐX ádš©“iRõ©œsž++&NÁi§  Ìéã\Ÿ9+Tþï/Î º…vúªˆkΧÇeú*EîRƵ§{Qé¦â©˜ßk!GæNíkTÄäªF‘nú¾ÆøØï`¬Y¬º4×¶>™,v‚íLäsšHÓ±9N %Ϊ¥cuŠ¿b±iõÏ¡ñ£Ma$×\¬•ËÓÐ*Gi˜V€ùRŒÆ—º£P™nE˜sz&¡Ò“€ÑÉæG|“sa=¸'Kƒ72N62_a|"WÅü ^]¤èŽms³âŽÈLˆÕä윩ŒTeá&ÝÍU¶@¬w×ü‘ÊêÄ0²MèÚ¥3&­Z‹ mº›rxÂkœ£ ”Ô–âaß„1—/¥Ô5‡|0ÄÒÊ‹u†,Ö>/gr^Îä¼ȃ£WÐ_Žóe>äS˜&&‡â/Ë—câðŸë8üK\)“ÃòÅkÝ·ïÓ\çhP%™»Ö’Ò°ˆÿ]¾˜qÝç<©Å½&ƒ–ŽT°c„¦Ä ”™Jr·êñ4–B9ºÞ1.±¬d×HZº$£Ä¥–‹Çš©——Y÷¹S’«)–5ñåÀàE`ðâH™uãàV4ʺq‘/ôÀ×uùb»äº‡_Œç‹ß@ŸU >èþÀ׌-n\7^Á‡¨ÊÜÒÑ/ÂáZ çuŒÌs}ýe;hÆþ÷Åñ5(³qRB>% Þ  Ù 8t»¿ÔiˆsC”ž…"¿ž×åÛË×—/ݪQjª\6¹2vš«qäÆ4,xpE‘1„íëxuÉËMjø»Áw®Àž°|½#9‹qšDÈÕ’¹"€fòyšÖóšåWâëݤ寙:©Npk¹W¦l(‰aif|`J M/G//¢—Wâ0³å;3²¿×ç:EDo› 8 g%®C_Þõ¹Øõ¹l)Ú ú1\åºÙ5#HDbè¹ü\xWFÈ´Ìšžñœí¯+38¤ÒÇ5»®Ý$;KTt4 4K"ûÊ&î•hOöŸåÞC³°"]JÄ-¶ ^*Ìy‚ìœ\¥úr_ ’KÛ2wS {‹/%â¹î£ȵÂÜh²´­3{z*LOrЏH×S%nç ¸_¥;'?ÚWqºPçÅFîyÐLÐÈ@—"Cq~*¹\°*Ûudýå‰Î|Z•­C‹fRÏgÊú-€«úNåŠqwÃN=Ø# T)ùè˳oï÷úøåXÕën’ôe‚:W-˜‹Þœ~àŒ 5·¨Ñ¢†Ô¼ªw.ŽöY•S7œT·"s“.’„þ†0âŠÞ ewè^‘Ô›Jû›“ñ±Ù@µ4¢© ñzÿªò…®üd$TæöÊK«Lµ”)K(–×,êvLFΊ•Ϧ;súKå€ôA Dì¯î;Ô{>›–¢,®€p~Ç_6WааŠ0â®u¹DÔBY-`æ¸|}›AŽWÔ“Ã<)³’B%’‘¯"¢%¤ãˆÆ.,#Ñêda›™×3F~q[ç:·u.ßÖ¹ñxgñbgñÒÎb} ¶÷ƒA³œu‰4ƒ­Wûöóüv0Ek¬T ”¡ ¼ZÅ)à ¤µA´¨ ÀY}„ïý(ø;© eë¤/÷š¯ÔèOD Í½ókzµšž«tSH(\sé÷Ä’‘)áÊ}ðöøì–6Àî&Dqt”È'õúJ£Åy½k²ß}ÍîÒ ¾VÙœY£„0Îfï1²âô@=ÆÇµàÿ¥ s¡í_ò¥óû¦sþ[E—”ÁçºQ¼:LœÁ*);ÿ[S|5Ýq“Ž›Ð›ó€×Ô©¡ öäèP,kžƒihþôCÇ»¿¿ÍÒ®jÌïKÖ¥—h@Œ\ˆ‰ ½ £€ÂX;ô‡¥˜–Nˇš§º0Î¬ÅÆËÅ!Æ×âãWAOC>7iqnÒò™VËç& È«(ä‚Y>,xù°àÜ_·&)õ% yÞ¾eSï’ß%Æ©‡ógÃt¾Cë»#ík¦•u×뵓ÜW}Û÷LBƒs'§‘΃½E’ÛCï8âçÊ'¥é;’Õ/‹?|Þ"|ßha$€2Ùîº$ßc®Pl‰î\czûÔÕôÍ,$.Šˆ”o«UÝYvJ—rM®jù® ?nȬLBsþNrf“SZÀâX\.RnwÆåHXéWopuîx¸Ï1Õµ8Ûîâói4Ãïêx¾ëFОižþõòù.©–È$€‰ -„»3ý•}ƒ¶®ÅÅ>ùíq–Çs_®ZŒ$¿=uuìÑM½ŠÙÛ±Ó$̉>ו„Ñ,X#Ï|jì^À ‰~Þ¸†sðMÉÏÚȆ3ßðR»â¬3Ù %\Å}㹘LÙò¼Óúv\ Ŧm£;­[Vª”ƒéz¢VíJu=¥œèã^ç»e”ÖvÊ]V¦º<ÏO´+~Ær9W Šòì㲞7 ·{98µÞõ~Lš¤.™Ãó7‚²º¸–½SH”ñÈ60¥µ¼ßÏ?ùvú±šòÕ;ÕM âžfX®V÷f$.ŠþˆT;免ç.>?ãzõ»rÏÍNphZ$Ns0RV¿ä³áW¯hž”Û}˜¥ÝÏÏгzü¶s›äNšíÌ>ÙGÝÜÊW– ¥›)Å)¶j”ºëå+…hg¸4$åÐŸŠ´}¼ùý²&Írùãü×µÑîÊ&7òZ`áÊ5ãP;ds9_ôw— ²ž9¨aäŽDqüü•߈; ßÝ7 ß ¯'/eý¬x/³;N›S=³u“‡ØófêÆ?ï`‰?.ö7‘€ÿŒ®C Ä8ïDw/ã"èNí§¥Ý-•†Òßß\¿x¥Uxx©'ØÚ‰‡¹‚Ã+Œt’Kë©…9V¾ä!ÌéÔ”p‘£<_(|§žšt9fi­˜0?ÿ‹-Wæ,m-ýVÚw;pxRÍ£z´'ÝÏÌÝ=s÷eféãô„îðVðàyNÊÛ1’m‘޾æ(à€Ù"Ø Ú@½±ÎåÞµÀ6²çðaÞÖ%ª=êÁ¹EÏlÒ·³ pZhø/0)¬$¨|°{“ã[+×8LõN£ÑäÙ̦êD±]~Y?Ë劜ù™C¾·HSµy{ gÖNzÌ3)ΜÏ7½—”^­wÊ’Ó¥®†•I¼’,¯qEéEÅ-;p±yíY?ÏæóŒži~Ì Q‘û¼òz¢ó¡êy6ŸíŒàï,©sX¢GCå™™z6W~¶§0-PN ”ã™>½5á´wí\É:C–Ó…NæËóçqDÃË-d´N/ó¬«ó8ÿ"ÙpüzUæÖÉ ¹ñÜ_CÇ;ÕLÅü$§èéÿlø%uæTŸnM¸ž‚ê: ñ9ÿ*^‡-ät±,Cn;Ö¡õæƒS÷Gž9tµŒÆÂÊn”ŽŽŠª(†_ w¤zÊSLÿ‘thV:Ñaûs¦v:Ègd©ˆqJ÷4ÁäHXN\GN\瀟+%GÓ“&FÍ:ºÌ¡:ç•%Ý ]—iªo¹‰“ÄÃt—CK·”F‚‹Ò#1ü•BËçK]„¥?E"³:Ì1’ÕhØÕL"¸·Gz¸ucMâq\$ûïòû•»¡×¯$€ÈëÉŠl0ºqÍvú(á“ÈQ ¤˜¤Sbˆg|™˜¤D†e¬ë`]íÌnÉ'œʲ褉«>`D%‚ J=N+†Û'}Üm óN9•óV€Ài™+q‚VÀé0ˆ@Ú\§å€9¾ÍÏ >üþ‘[Õ«Î[Û©º[™LýTÜ>kK)èìÐuÂCØüÍœç)"3öu>¬ËtºÝO²"0éÏã0´Ì ç:×ø{ŸÊtwLO¼ÊH{)[ÚKÞv Ï† dÊ¢  úaŠ.‡2£ž HÚsØPédÊv»µô†¶±Á;à©Fz†oÅŸuž. Ä&cNhy(1Ýxê éûTDÊ4‘e£Qзc؆jVaMJD„†¥ü~›5×a`ÝLsz9ª|˜7Ù4<‰?d$ÙüQòôÔg9¬M¬Ã‡>!Ú!jà]ët‘áÃ<‰Ç³)ÀzÈêÓ¦ö™|ÝìÁ¤íÚgË¡_ó¥Ûbi*e‹è‰Í+ùÜð„ßÇâ¡Ñß ©‘ù ¡¬ÅHº)£ø!c(ûôCÆ‚¬²Ë{ì·]Zá~ ÝéIzG¦·'‹äS!.1º™Ç²û+›c%•÷£Eêÿƒ¥Ùx_†2üßžܨS™óçðŒüA—ŒE£Âká`ã½ÐÔç8wlÅa©-ÿ*l>C30¬3¼#tº/ »Ì”ÜÀ‡1ÌBýSx ß.’ ti=}ó»î50c¢[~Ô<ûëüp_.óÄâÕ.[<•x–Âiâ4ïl>(ÏP"=-¿ÅŸqr ìé;yäEFust!²ÏV!ÖšäajÍ8$œãÙ cMå4¦<óÀ|6,?[H }9ðEê¡'ÉrL=¼V½ÜÊš’\ªgaª^˜d§ºÒR®v>kþÌB^"t ŸOµ¥®°;„ÿš%¯óѨ:Î;:½.Gz÷= `Å—ê!E5)t±Q ¾ö–°Âà¿xsùUÖ“öÌ›Ÿù3Å¥½YX(Ÿ( ÁéP}Ù ©¯C"ñpýlÇK2(’ÐS‹ŽãMbaÐEŒ}> ¯‘ÍÇH’ÒKÝOÍ‹Ž¦SÏ7ÅÔœ~”!‰#âOâPØ”–lJK²-á’ùÛE¶ì0@ah¸}O ë³W£zžmG’i^¸’Là°ðÙäµÊ÷iw>ö©C…‰Û8x†ñ„Žu©šG$’mÎ3(ö¹Ce›<ƒ,ý ýõ趦~ˆÕÍôkÙÿÃ7· DJéÕm±¢—óQñG!åÅ€õy!aÉœg&“ëß’ ¢ÒÔWõ ©oOtB3—xÏ‹Ôã¼ôœj+RÂë®:Ÿ±Ø=e«©§!6$™F‚ÀÇþ”†'Ša f·Øç—¼åàª~ÉgÏ\ç³îÁ¬æ÷!MðÈ2rÀë0—z:`(<ƽ08t%þMá/Ïr2M\.õía5= "¨ýAó‚¥ ÐÇÉŒ9_ñÛd¨¿zc3#¯;Öi—Öó¶I3q$»d§9rø|9Rzë‘vL,É&gµDú³ÜÁ”pjäµdhqÇÔáڱʧw”‹ Ñ‚«aøûÐeçÔÁ¬9žýuº*w½¹F¾âš”ç‘cáK¶ð½~z§Ÿ*Ëëu6òŸçΨ³?ôDAx°PA×áµð¤¨ý4ÑÛ>”V÷f¹Ü?Pôð‰¦;¶=ÓPµ1$Z®óÄ­¿xû‰º¥zVÜã1«aàQ>Ü¥\¿|êXËQ€t³GBc Ìq{µeD²%¡„Ï¢#!8¬:NyE.§Gæqœ&µØ•%[Ë×<ùô“!tæ 3ù@!t7†ÉïÊ'åz¬c [Vü–gàežÔÕ•ÃüœQ†xóx;ìHÎ~pÚ< í)Á'œ8h“ÈâP¡é½‰ê#NdçßÇïz7¥Îçä™Ù…3àÜ,f>Ë2\ÔÇ2s ;¤–“Ûi’8¬UeQ#·m¢™sð.£~V¾Í¶YfÎÝȘËéœh_gcI~‡Ão¸„ë×eç*ÏìOU鋃 \—×)å>G©fúl“kÆäjîͶ»š÷Ä]äv©÷Ñ¥©m”9ÿ^ÎÖ"”v̵Y;m̲IÁAîW‡IB›þŒ_e]¸»œ'ùùJËTÎîŽÌæNfèîrºÅ¥Ì!ÙøÌ!‘Qf²-]Ù–.dE>£${”èþh@9}äPž\NùØzªˆ,SyÖùtRÿ[$,åí'ѹçm~;6Å\X'wM¦aðÛzÿóй$jƒ¯SmŠ9: ³™o #Ôö€Hî)îžRÑDrìm³³¶É¨¨nJx‰Ílœ9&ÀÌö™hüí&¡MdmY1é6Izí|&—g+þzxÅU—Ií¢ï|^Õ§Ì£?î'™ÓsiüŸ–ÃDòÓyžxеÞMœûPë6µ+H®¶äj{·¨U¹º«ëaÙê#‹"™ÝÚ³Œ„ÃTnewc¶]%W›ãs}AÖ:ú¢–Ãüõlö;LR-€(!c{¤‡«7NõÆ 9,2e—<Ê ˆ?õC,@®ž½«u%ìÁÉÜ|M¦|Ñ-™Ózx–¡#ª}Â`”©2+&سºiíӞ W®YÍÓãƒßÞÇèø¸3§ò4ó5߯¬—Ó/çy‰§« ‡ÍL™{ÄND†Ü=¡´3¡´uü\¹Ÿ)¶Ë¸©D¢IÝÃÚù$LÜžêù¬rE„ðdO/Š–9ûfÎ×Ùó^%U„ù¿·¨sDlÂr–c ²¢E´ŽX'ÌÃÞŬƒäË×ã>L7î'Ó)N jŠ=(õ9ȇOȆù  4{#?óSÑ✞_F{vóÀû ’^Ÿ/­ ekly°õîß{£oØ8‰Óhd­n‚ðÙ“2íÍ!î?óé‘É¿œžþÜR¥ÀqJõžèr»ÑëíüÅ ,ŽɃã\ßÿ‰:ÉÓ›¦HyÄH÷öˆqŠê°ÞóâŸMdY—r¥H¨çŸsägV㘇@žnSN¡§"}ŽàÙI IyÚ5§„jÑÌGÞûe<8‹Õôb5,1˜2-¦L®‰D>Á%—¥lë#›ï•V à™ýN8äá ðª3Š+Qžµo–…NHJvH ­1‚#+ÎçÔ?ðiU7OóÍìýùM¬—?¼?.˜óÎçeË@tµ¼,%/uÊ¥®(DcÃÑCyžÃsƒåY–_/" œ)Úžµ­~(»Szþyöa}Ò¯¯ðÂTOøZžò¶Ÿý7ïý6µ®à¡e£‰@O¿Ó6¸ÌÖ˜€AoY®\’+/§祛n…[‰óÎ ö: öò‚Ý‚2«Ÿ¾èù‰?.¡:zÆYéô¡RÿéúÿÿÿføÇÙ‰¾golly-3.3-src/Patterns/Life/Syntheses/109-still-lifes.rle0000644000175000017500000001754012026730263020131 00000000000000#C A collection of 109 still life syntheses by David Buckingham. #C (Collection assembled by Dean Hickerson, 11 February 1993) x = 246, y = 279, rule = B3/S23 20bobo30bobo12bobo61bo26b2o2b2o$20b2o32b2o13b2o3bo19bo8bo29bo24bobob2o $21bo19bo12bo14bo2b2o20bobo7bo26b3o26bo3bo$14bo26bobo29b2o19b2o6b3o$ 15bo22b2ob2o8bo$13b3o21bobo9bobo43bo16bo$39bo10b2o4b2o8bo6bo19b3o16bob o33b3o12bo$10b3o5b2o23b2o12b2o7b2o4bobo17bo19b2o36bo11b2o$12bo5bobo22b obo10bo3b2o3bobo4b2obo16b2o22b2o31bo12bobo$11bo8bo24bo14bobo12bo12b2o 26bobo$20b2o23b2o13bo14b2o10bobo5b2o19bo21bo$89bo5bobo5b3o22bo7b2o$95b o9bo20b2o9b2o$26bo77bo22b2o$24bobo18bobo83bo17bo$25b2o3bobo13b2o76b3o 4b3o15bobo$30b2o14bo48bo16bobo11bo7bo14b2o$31bo20bo41bo17b2o11bo7b2o 11bo$50bobo10bobo28b3o16bo33b2o$6bobo21b3o18b2o3bo7b2o3bo76b2o$7b2o21b o23b2o8bo2b2o19bo18bobo7bo3bo$7bo23bo23b2o11b2o19bo18b2o8bobo16bo$44bo 14b2o26b3o9bo8bo7b3ob3o13b2o$6b3o35b2o14b2o35b2o37bobo$8bo34bobo13bo8b o24bobo2b2o14b2o$7bo10bobo46bobo24b2o17bobo15bo$18b2o28b3o16b2obo23bo 8bo11bo16b2o6bo$19bo28bo21bo31b2o27b2o5b2o$49bo20b2o30bobo34b2o2$134b 2o3bo$121bo11bobo2b2o$3o89bo27bo14bo2bobo$2bo43bo46b2o8bo16b3o75bo$bo 43b2o36bo8b2o7bobo93bo$45bobo34bo19b2o27bobo63b3o$62bo19b3o47b2o$12b2o 10b2o37bo46bobo19bo12bo$11bobo11b2o34b3o47b2o30b2o17b2o$13bo10bo64b2o 5b3o12bo32b2o16bobo$89bobo4bo10b3o52bo$90bo6bo11bo26bo$obo105bo28bo$b 2o92b2o19bo18b3o$bo92bobo18b2o$44bo42b2o7bo18bobo15b2o6bobo$42bobo3bo 4bobo32b2o20b3o19bobo6b2o27bo3bo$43b2ob2o5b2o19bo12bo22bo23bo7bo28b2ob obo$15b2o2b2o26b2o5bo18bobo35bo58b2o2b2o$14bobob2o47b2o3bobobo$16bo3bo 7bo39b2o3bo2bo12bo41bo$29b2o18b3o15bo8b2o9bobo42b2o6bobo$28b2o21bo36b 2o3b2o36b2o8b2o$50bo18b3o20bobo46bo28bobo$30bo38bo24bo9bo44bo21b2o$30b 2o18bo3b2o14bo25b3o6bo27bo14bo22bo$29bobo18b2o2bobo39bo6b3o28b2o5bobo 4b3o14bobo$20b2o12b2o13bobo2bo17b3o22bo9bo25b2o6b2o22b2o$20bobo11bobo 22b2o11bo34bobo32bo23bo$20bo15bo23b2o11bo33b2o3b2o$36b2o21bo52bobo28b 2o$112bo30bobo$143bo2$95bo$94bo46b2o$94b3o18bo24bobo$113bobo26bo48bo3b o$4bo46bobo34bo25b2o73bobob2o$4bobo45b2o3bo31bo27bobo23b2o45b2o2b2o$4b 2o46bo2b2o9bobo18b3o27b2o24bobo$21bo34b2o4bo3b2o6bo23bobo9bo7bo24bo$bo 13b3o2bo14bo27b2o2bo6bobo21b2o11b2o66bobo$b2o14bo2b3o11bobo25b2o10b2o 23bo4b2o4b2o2b2o64b2o$obo13bo16bobo6bo13bo47bobo6bobo2b2o30bobo27bo$ 33b2o6b2o12bobo6bo32b2o5bo10bo2bobo6b2o22b2o$23b2o16bobo11b2obo5b2o30b 2o23bobo2b2o23bo$b2o2b2o16bobo32bo4bobo7bo24bo23b2o4bo$obob2o19bo10b2o 20b2o12b2o76b3o26bo$2bo3bo18b2o8bobo6bo27bobo77bo19bo7b2o$37bo5b2o106b o21b2o4b2o$43bobo56b2o19b2o43b2o2b2o$101b2o21b2o41b2o21bobo$40b3o60bo 19bo3b2o40bo20b2o$42bo83b2o63bo$41bo86bo69bo$91bobo37b3o63b2o$10bo65bo 15b2o39bo51b2o10bobo$bo6b2o42bo21bobo15bo39bo52bobo$2b2o5b2o39bobo22b 2o48b3o57bo$b2o34bo13b2o56b3o15bo$35b2o37bo36bo2bo11bo21bobo37b3o3bo$ 2bo3b2o28b2o15bo19b2o35bo3bobo31b2o38bo4b2o$2b2o2bobo40bo3bobo17bobo 38b2o4bo28bo39bo3bobo$bobo2bo20bobo20bo2b2o64bo$13bo14b2o3b2o13b3o45bo 22b3o$11b2o11b2o2bo3bo2bo35bo24b2o17b3o$12b2o9bobo6bobobo18bobo13b2o 22bobo3bo13bo70b2o$4b2o19bo7bo2bo10b2o6b2o13bobo26b2o10b2o3bo68b2o$3bo bo4bo25b2o9bobo6bo25bo6b2o9b2o8bobo46bo27bo$5bo3b2o36bo33bo6bobo21bo 44b2o$9bobo45b2o22b3o6bo45bobo19b2o6bo$56bo2bo12b2o63b2o25b2o18bo$57b 2o14b2o62bo27b2o18b2o$72bo35bo75b2o$109bo$54bo52b3o$22bo31bobo30bobo$ 20bobo31b2o23bo8b2o$21b2o56b2o7bo8bo83bo$51bo26bobo15b2o16bo17bo49bo 24bo$49b2o41b2o2bobo14bo17bo48b3o22b2o$50b2o41b2o18b3o15b3o72b2o$92bo 18bo75bobo$103bo5bobo18bo7bobo31bobo12b2o$102b2o6b2o17b2o8b2o32b2o13bo $102bobo18bo5bobo7bo33bo$110b2o11b2o29bo4bo41b3o$109bobo10bobo30b2obo 37b2o5bo7bo$111bo42b2o2b3o34b2o5bo6bobo$65bobo82bo46bo12b2o$66b2o81b2o 35b2o15b2o$66bo20bobo59bobo33b2o16bobo6bo$72bo15b2o97bo15bo7bo$72bobo 13bo69b2o8bo42b3o$72b2o84bobo6b2o20bo$64bo93bo8bobo18b2o7bo$63bo11bo 112bobo5b2o$63b3o9bobo12bobo103bobo$61bo13b2o14b2o114b2o$59bobo29bo 116b2o$55b2o3b2o123bobo19bo$54bobo35b3o90b2o26bo$56bo37bo4b2o47b3o35bo 27bo$26bo3bo62bo4b2o48bo63b3o3bo$27b2obobo67bo48bo19bo30bo15b2o$26b2o 2b2o138b2o29bo15b2o$71b2o96b2o28b3o$72b2o20bo37bo10bobo11bobo$71bo15bo bo5bo15bo18b2o11b2o12b2o$88b2o3b3o16b2o8bo8b2o11bo6b2o5bo61b2o$88bo14b o7b2o7b2o29bobo66bobo8bo$103bobo15b2o17bo11bo3bo63bo8b2o$103b2o36bo13b o74b2o$139b3o13b3o56bo$135b3o37bo31bobo3bo$41bobo15bobo75bo38b2o30b2o 3b3o7b3o$42b2o3bo12b2o3bo41bo20b2o6bo9bobo4bo21b2o2bo28bo14bo$42bo2b2o 9bo3bo2b2o40b2o21bobo15b2o6bo24bobo28b2o12bo$46b2o6bobo7b2o40b2o16b2o 2bo18bo4b3o24b2o8bo20bobo$55b2o68b2o61b2o20bo$124bo28bo34bobo$46bo17bo 76bobo9b2o$37b3o5bobo15bobo76b2o8bobo$2bo36bo5b2obo5b2o7b2obo75bo29b2o $2b2o34bo9bo4bobo10bo95b2o7b2o$bobo44b2o5bo10b2o95b2o8bo8b2o39bobo$98b obo41b2o18bo18b2o41b2o$98b2o41bobo39bo40bo$3bo95bo43bo$bobo17bo202b2o$ 2b2o18bo43bo31b2o123bobo5bo$20b3o4bo39bo2bo26bobo32bo17bobo33bo3bo34bo 3b2o$25bobo37b3o2bo28bo33bo17b2o31bobob2o40b2o$6b2o18b2o15bo26bo60b3o 17bo33b2o2b2o5bo$5bobobo34b2o56b2o90bobo$7bobobo13bo17b2o2b3o15bo5b2o 29bobo90b2o$9b2o13b2o39b2o3b2o30bo$24bobo13b3o21bobo5bo99bo$42bo6b2o 121b2o$41bo7bobo67bo51bobo$49bo67b2o84b2o$118b2o25b2o57b2o$145bobo18b 2o35bo23bo$145bo19b2o58b2o$167bo58b2o$139bobo$7bobo72bobo55b2o20b2o7b 2o$7b2o47bo25b2o8b3o3bo19bo3bobo15bo21bobo5bobo19b3o$8bo45bobo26bo10bo 2b2o20b2ob2o38bo9bo19bo$55b2o36bo3bobo18b2o3bo16b2o51bo$139b2o19b2o$ 57bo30b2o13bo3bobo11b2o18bo17bobo$5b2o5bo16bobo25bobo7b2o18bobo14bo2b 2o13b2o37bo$4b2o4b2o17b2o18b2o6b2o7bobo20bo12b3o3bo12bo$b2o3bo4b2o17bo 19b2o16bo2b2o$obo28bo17bo20b2o6b3o44bo13bo23bo4bo$2bo27b2o40bo5bo47b2o 11bobo19b2o6bo$30bobo19bo26bo45b2o12b2o21b2o3b3o49bobo$9b2o41b2o120bo 8bobo34b2o$10b2o39bobo95bo9bo12b2o4bo4b2o35bo$9bo140bo9bo12b2o3bobo3bo $129b2o7bo9b3o7b3o17b2o40b2o$128bobo6b2o3b2o75bobo$130bo6bobo2bobo10b 3o15b2o5b2o39bo$70bo38bo32bo14bo10b3o2bobo4bobo10bo$68bobo37bo47bo13bo 2bo6bo12b2o$40b3o26b2o37b3o58bo22bobo44bo$40bo111b2o86bo$21b3o17bo29bo 12bobo12bo5bobo45b2o83b3o$23bo47bobo11b2o10bobo6b2o44bo$22bo40b2o6b2o 12bo7b2o3b2o6bo102bo17b2o13bo$44bo19b2o26bobo115bo12b2ob2o15bo$43b2o 18bo16bo3b2o8bo3bo10b3o38bobo17bo3bo29bo3b3o13b2o2bo12b3o$43bobo34b2o 2bobo11b2o9bo17bobo20b2o16b2o5bo26bobo13bobo2bo$79bobo2bo12bobo10bo16b 2o22bo6b2o9b2o2b3o8bo18b2o6bobo4b2o$70b2o56bo6b2o20bobo22bobo26b2o6bo$ o15b2o31bo20bobo61bo2bo20bo24b2o14b2o11bo$b2o14b2obobo19bobo2b2o21bo 64bobo49bo12b2o3bo$2o2bobo9bo3b2o13bobo5b2o3b2o16b2o68bo48b2o8bo3bo5b 2o8b3o19b3o$4b2o15bo13b2o6bo21b2o119b2o6b2o8bobo8bo23bo$5bo30bo25b2o3b o80b2o44bobo19bo21bo$20b3o23b2o13bobo61b2o22b2o2b2o15b2o$bo7b2o9bo25bo bo14bo62b2o2b2o16bo3bobo16b2o$2o7bobo9bo25bo77bo3bobo22bo15bo$obo6bo 40b2o79bo12b2o10b3o8bo$51b2o2bo46bo8bo21b3o8bobo9bo9b2o5b3o29bobo11bo$ 50bo3bo45bobo9bo20bo10bo12bo8bobo6bo30b2o5bobo4bo5bo5bo$31b3o20b3o40b 2o2b2o7b3o21bo39bo31bo6b2o3b3o3bobo4bo$31bo66b2o114bo10b2o4b3o$32bo37b o26bo14bo90b3o15bo$39bobo26bobo31bo9b2o85b3obo17b2o$40b2o8bo18b2o30bob o7bobo87bo2bo5b3o7bobo$4bobo33bo9bobo49bobo95bo9bo$5b2o43b2o19bo31bobo 9bo95bo$5bo26bo38bobo30bo9bobo113b3o11b2o$25bobo2b2o31b2o6b2o42bobo 112bo12b2o$26b2o3b2o31b2o50bobo112bo13bo$26bo36bo53b2o$79bobo$29b2o35b o6bo6b2o119bo8b2o32bo$29bobo9bo6bobo15b2o4bo7bo118b2o9bo32bo$30bo8bobo 7b2o14bobo4b3o125b2o9b3o29b3o$34bo5b2o7bo163bo$34bobo150bo13bo5bo$31bo 2b2o9bo141bobo10b2o3b2o11b2o$30b2o13b2o107bo32b2o11bobo3b2o9b2o$b2o9bo 17bobo11bobo2b2o23b2o43bo35bo57b3o3bo$obo10bo34b2o23b2o43bo34b3o42bo 16bo$2bo8b3o36bo24bo42b3o65bobo7bobo15bo$7b3o176b2o9b2o4b2o$9bo16b2o 159bo14b2o$8bo17bobo19bobo153bo$26bo21b2o146bo$49bo146b2o$195bobo$83bo bo$78b2o3b2o$79b2o3bo$78bo61bo$96bobo39bobo$9bo73b3o10b2o41b2o$9b2o72b o13bo$8bobo73bo$58bo37b3o26bo$49bo6b2o38bo29b2o$47bobo7b2o38bo27b2o$ 48b2o10b2o$54bo5bobo21b2o16bo$53bo6bo23bobo15bobo35bo$10bo33b2o7b3o28b o17b2o34bobo3bo$8bobo32bobo48bobo38b2o2b2o2b2o$9b2o34bo49b2o37bobo6bob o$95bo40bo$11b3o68bobo3bo17bo56bobo$13bo69b2ob2o17bo57b2o20b2o$3o9bo 70bo3b2o16b3o56bo20bobo2b2o$2bo182bo3b2o$bo97bo63b2o26bo$86b2o12b2o61b obo15b2o$37bo47b2o12b2o62bo17bobo15bobo$20b3o13b2o49bo33b2o58bo17b2o$ 22bo13bobo81b2o78bo$21bo58bo17b2o3bo18bo22bo$80b2o17b2ob2o40b2o53b2o$ 79bobo16bo3bobo39bobo52bobo$37bo150bo10bo$36b2o150b2o$36bobo148bobo! golly-3.3-src/Patterns/Life/Syntheses/make-harbor.rle0000644000175000017500000000140512026730263017554 00000000000000#C Synthesis of p5 oscillator from 34 gliders. #C Jason Summers, 30 Nov 2004; pattern from Summers' "jslife" archive. x = 209, y = 209, rule = B3/S23 35bo$36bo$34b3o16$46bo$44bobo$45boo3$53bo$54boo$53boo9$206bo$206bobo$ 206boo8$189bo$188bo$188b3o5$74bo$72bobo$73boo108bobo$183boo$184bo17$ 156bo$155bo$155b3o4$56bo$54bobo54bo$55boo52boo$110boo3$89bo$87bobo4bob o$88boo5boo$95bo4$71bo$69bobo32bo$70boo33boo$104boo$116bo$114boo$115b oo$$106bo$104bobo$105boo$114bo$114bobo$114boo$97bo13bo$98bo11bo$96b3o 11b3o$$92bo$85boo5boo$84bobo4bobo$86bo3$93b3o17b3o$95bo17bo$67bo26bo 19bo$67boo6boo$66bobo5bobo$76bo3$74boo$75boo$74bo9$51b3o$53bo$52bo17$ 24bo$24boo$23bobo108boo$134bobo$134bo5$18b3o$20bo$19bo8$boo$obo$bbo9$ 154boo$153boo$155bo3$162boo$162bobo$162bo16$172b3o$172bo$173bo! golly-3.3-src/Patterns/Life/Syntheses/two-glider-collisions.rle0000644000175000017500000001400612026730263021616 00000000000000#C the 71 distinct 2-glider collisions, grouped by what they produce #C Thirteen preblocks (3-cell patterns that become blocks in one tick) #C have been added to keep active patterns from getting out of hand: #C see GLIDER, B, PI, TL+GLIDER, and 2-GLIDER MESS. #C PI=pi-heptomino; B=B-heptomino; TL=traffic light; HF=honeyfarm; #C LOM='lumps of muck': Jason Summers, 29 January 2005 x = 379, y = 369, rule = B3/S23 154bo36bo18bo$58bo18bo19bo16bo19bo18bo19bo16bo18bo36bo$57bo18bo19bo16b o19bo19b3o16bo17b3o16b3o15bo17bo$57b3o16b3o17b3o14b3o17b3o36b3o51bo18b 3o$226b3o4$190bo$58b3o17b3o89bo18boo55bo$58bo19bo20bo17bo20bo13boo15b oo18bobo14boo20bo16boo$59bo19bo18boo16boo19boo13bobo14bobo34bobo18boo 16bobo$98bobo15bobo18bobo12bo53bo20bobo$bo4bo3bobo3bobobobbo3bo3bo3bo 4bo4bobo$$bobobbobbo3bo4bo4bo3bo3bo3bobobbobbo$$bobbobobbo3bo4bo4bobob o3bo3bobbobobbobbobo$$bo4bobbo3bo4bo4bo3bo3bo3bo4bobbo4bo266bo$269bo 22bo21bo62bo$bo4bo3bobo5bo4bo3bo3bo3bo4bo4bobo182bo15bo21bo22bo22b3o 18bo22bo17bo$229bo15bo22b3o20b3o40bo22bo18b3o$86bo16bo17bo16bo16bo15bo 17bo16bo22b3o13b3o86b3o20b3o$66bo18bo16bo17bo16bo16bo15bo17bo16bo$65bo 19b3o14b3o15b3o14b3o14b3o13b3o15b3o14b3o$65b3o4$224b3o15b3o59boo$76b3o 16b3o16b3o15b3o15b3o14b3o16b3o15b3o19bo17bo11boo23boo20bobo20boo40boo$ 54b3o21bo18bo18bo17bo17bo16bo18bo17bo18bo17bo13boo23boo21bo21boo12boo 26boo$56bo20bo18bo18bo17bo17bo16bo18bo17bo50bo24bo44bo15boo24bo$55bo 285bo23$106bo157bo$74bo30bo157bo38bo$bbobo4bo6bo3bo4bobbo3bobbobobobbo bo28bo15bo15b3o119bobobobbo28b3o14bo20bo$46bo26b3o12bo190bo21b3o$bbo3b obbo6bo3bobobbobbobbo3bo6bo45b3o138bo4bo44b3o$46bo$bbobo4bo6bo3bobbobo bbobo4bobobobbobo184bo4bo$$bbo3bobbo6bo3bo4bobbobbo3bo6bobbo183bo4bo$ 305b3o$bbobo4bobobobbo3bo4bobbo3bobbobobobbo3bo61boo119bo4bobobo44bo 21bo$108bobo146boo23boo22bo$66boo21boo17bo149boo22bobo$65bobo21bobo 165bo$67bo21bo17$84bo15bo39bo153bo24bo19bo$bobo4bo7bobo4bobo3bo3bo28bo 20bo15bo39bo88bo3bobbobobo20bo16bo15bo24bo19bo$61bo21b3o13b3o15bo21b3o 17bo99bo16bo16b3o22b3o17b3o$bo3bobbo6bo3bobbo3bobbobbo28b3o52bo41bo69b o3bobbo23b3o14b3o$116b3o39b3o$bobo4bo6bo3bobbo6bobo196bobobobbobobo$$b o3bobbo6bo3bobbo3bobbobbo195bo3bobbo$$bobo4bobobo3bobo4bobo3bo3bo85b3o 106bo3bobbo$54b3o62bo17boo16bo103bo35boo35boo$56bo21boo15boo23bo16bobo 14boo102boo16boo17bobo11boo22boo$55bo23boo15boo39bo16bobo101bobo15bobo 16bo14boo20bo$78bo16bo180bo32bo6$73boo19boo$74bo20bo152boo$249bo7$64bo 233bo$63bo20bo194bo17bo$63b3o17bo166bo27bo18b3o$bbobo3bo6bo3bobo4bobob obbobo47b3o143bobo17bo28b3o$37bo211b3o$o7bo6bo3bo3bobbo6bo195bo3bo$37b o275boo$obbobobbo6bo3bo3bobbobobobbobo193bobo82bo$256boo$o4bobbo6bo3bo 3bobbo6bobbo192bo3bo23bo$80bo$bbobo3bobobobbo3bobo4bobobobbo3bo20boo 19boo148bobo18bo42boo$57bobo19bobo167boo13boo26bobo$59bo189bobo13boo 27bo$264bo14$252boo24boo$253bo25bo$258bo15bo$257bo15bo26bo$61bo195b3o 13b3o23bo$obo5bobo5bo4bobobo34bo167bobo4bo63b3o$60b3o169bo45bo24b3o$o 3bobbo3bo3bobo5bo204bo6bo41boo24bo$232bo44bobo24bo$obo4bo3bobbo3bo4bo 204bobo4bo19boo37boo$254bobo38bo$o3bobbo3bobbobobo4bo204bo6bo20bo$$obo 5bobo3bo3bo4bo204bo6bo$$53boo$54boo$53bo18$3bo3bo3bo3bo3bobbobobo30bo 169bo6bobo3bo5bo18bo$56bo207bo$3bo3bo3bo3bo3bobbo33b3o168bo5bo3bobbobo bobo17b3o$$3bobobo3bo3bo3bobbobobo200bo5bo3bobbobbobbo$$3bo3bo3bo4bobo 3bo204bo5bo3bobbo5bo$$3bo3bo3bo5bo4bobobo32b3o165bobobobbobo3bo5bo$59b o203bo$60bo201boo$262bobo17$67bo$66bo$4bo6bobo5bo4bobobo37b3o157bobobo bbobobo4bo4bobo4bobo4bobo5bobo3bobo$251bo13bo13bo17bo$4bo5bo3bo3bobo3b o203bo4bo7bobo3bo6bo3bobbo6bo3bobbo20bo$251bo13bo13bo16b3o$4bo5bo3bobb o3bobbobobo199bo4bobobobbo3bobbobo4bo3bobbobo4bo3bobbobo$$4bo5bo3bobbo bobobbo203bo4bo6bobobobbobbo3bo3bobbobbo3bo3bobbo$$4bobobobbobo3bo3bo bbo203bo4bobobobbo3bobbo3bobbobo4bo3bo3bobo3bo$58boo239bo$57bobo238boo $59bo238bobo16$59bo$58bo$58b3o264bo$3bobobo4bo4bobobobbobobobbobo193bo 3bo4bobbobobobbobobobbobo5bobo3bo3bo4bo4bo4bo4bobo3bobobo22bo$35bo221b o66b3o$3bo7bobo5bo4bo6bo195bo3bobobbo4bo4bo6bo6bo3bobbo3bo3bobo3bobobb obbo7bo$35bo221bo$3bobobobbo3bo4bo4bobobobbobo193bo3bobbobo4bo4bobobo bbobo4bo6bobobobbo3bobbobbobobbobbobobbobobo$57bo$3bo6bobobo4bo4bo6bo bbo21boo169bo3bo4bo4bo4bo6bobbo3bo3bobbo3bobbobobobbo4bobbo4bobbo26b3o $56bobo265bo$3bobobobbo3bo4bo4bobobobbo3bo191bo3bo4bo4bo4bobobobbo3bo 3bobo3bo3bobbo3bobbo4bo4bobo3bobobo23bo11$305boo$306bo9$55bo16bo237bo$ bbobo5bobo3bo4bobbobo27bo16bo155bobobobbo14bobo3bo6bo3bobo4bobobobbobo 26bo$6bo47b3o14b3o210bo24b3o$bbo6bo3bobbobobbobbo3bo200bo4bo7bo4bo7bo 6bo3bo3bobbo6bo$6bo277bo$bbobo4bo3bobbobbobobbo3bo200bo4bo5bobobobbobb obobbo6bo3bo3bobbobobobbobo$$bbo6bo3bobbo4bobbo3bo200bo4bo7bo4bo4bobbo 6bo3bo3bobbo6bobbo26b3o$310bo$bbo7bobo3bo4bobbobo46bo155bo4bobobo10bob o3bobobobbo3bobo4bobobobbo3bo26bo$50boo20boo$51boo19bobo$50bo19$bbobo 5bo7bobo4bo7bobo4bobo3bo3bo$$bbo3bo3bo7bo3bobbo6bo3bobbo3bobbobbo28bo 239bo$77bo239bo$bbobo5bobbobobbobo4bo6bo3bobbo6bobo28b3o237b3o$229bobo 4bobo3bobobo3bobo3bo5bo3bo3bo4bo3bobo$bbo3bo3bo7bo3bobbo6bo3bobbo3bobb obbo$228bo3bobbo3bo4bo4bo3bobbobobobo3bo3bobobbobbo3bo$bbobo5bo7bobo4b obobo3bobo4bobo3bo3bo$228bo3bobbo8bo4bo3bobbobbobbo3bo3bobbobobbo3bo$ 77b3o$77bo150bo3bobbo3bo4bo4bo3bobbo5bo3bo3bo4bobbo3bo$78bo$229bobo4bo bo5bo5bobo3bo5bo3bo3bo4bo3bobo26boo$307bobo$309bo7$276boo37boo$277bo 38bo6$112bo13bo$bbo6bobo5bo4bobobo9bobo4bo6bo3bo4bobbo3bobbobobobbobo 32bo13bo$80bo30b3o11b3o$bbo5bo3bo3bobo3bo8bo4bo3bobbo6bo3bobobbobbobbo 3bo6bo$80bo$bbo5bo3bobbo3bobbobobobbobobobbobo4bo6bo3bobbobobbobo4bobo bobbobo$$bbo5bo3bobbobobobbo8bo4bo3bobbo6bo3bo4bobbobbo3bo6bobbo$$bbob obobbobo3bo3bobbo13bobo4bobobobbo3bo4bobbo3bobbobobobbo3bo$107boo21boo 195bo$107bobo20bobo193bo$107bo22bo98bobobo9bobo3bo6bo3bobo4bobobobbobo 7bo5bobbobobo3bobo3bobo16b3o$278bo$233bo7bo7bo6bo3bo3bobbo6bo9bobobobo bbo6bo5bo$278bo$229bobobobbobobbobbobobbo6bo3bo3bobbobobobbobo7bobbobb obbobobo3bobo3bobo$$229bo11bo4bobbo6bo3bo3bobbo6bobbo6bo5bobbo10bo5bo$ 324bo$229bobobo9bobo3bobobobbo3bobo4bobobobbo3bo5bo5bobbobobo3bobo3bob o13boo$323bobo7$69bo$68bo$46bo21b3o34bo$3bo5bo3bo3bobo4bobo18bo58bo$ 45b3o56b3o$3bobobobo3bobbo6bo3bo$$3bobbobbo3bo3bobo3bo$$3bo5bo3bo6bobb o3bo19b3o$47bo24boo17b3o177boo32boo$3bo5bo3bo3bobo4bobo21bo23bobo18bo 178bo33bo$72bo19bo! golly-3.3-src/Patterns/Life/Syntheses/make-p33.rle0000644000175000017500000000237112026730263016707 00000000000000#C Synthesis of p33 oscillator from 68 gliders. #C By Jason Summers and Mark Niemiec, February 2001. #C Pattern from Jason Summers' "jslife" archive. x = 149, y = 149, rule = B3/S23 32bo$33boo79bo$32boo78boo$113boo$$41bo$42bo$40b3o$$30bobo60bobo$31boo 11bobo46boo19bobo$31bo13boo47bo13bo5boo$45bo60boo7bo$107boo4$29bo$30b oo85bo$29boo84boo$116boo3$30bo$31bo84bo$29b3o83bo$115b3o3$123bo5bobo$ 34bo88bobo3boo8bo$18bobo5bo8boo86boo5bo6boo$10bo8boo3bobo7boo102boo6bo bo$11boo6bo5boo119boo$bobo6boo104bobo28bo$bboo112boo$bbo114bo4$11bobo 127bo$12boo127bobo$12bo128boo$$64bo73bo$65boo24bo44boo$64boo25bobo43b oo$91boo3$77bo$78boo$77boo$9bo$10boo$9boo35bo36bo$47bo34bo$45b3o34b3o 7$57bo44bobo$55bobo44boo$56boo45bo3$51bo$51boo$50bobo6$96bobo$96boo$ 97bo3$45bo45boo$45boo44bobo$44bobo44bo7$64b3o34b3o$66bo34bo$65bo36bo 35boo$137boo$139bo$70boo$69boo$71bo3$56boo$10boo43bobo25boo$11boo44bo 24boo$10bo73bo$$6boo128bo$5bobo127boo$7bo127bobo4$31bo114bo$31boo112b oo$bo28bobo104boo6bobo$boo119boo5bo6boo$obo6boo102boo7bobo3boo8bo$10b oo6bo5boo86boo8bo5bobo$9bo8boo3bobo88bo$17bobo5bo3$31b3o$33bo83b3o$32b o84bo$118bo3$31boo$32boo84boo$31bo85boo$119bo4$40boo$33bo7boo60bo$33b oo5bo13bo47boo13bo$32bobo19boo46bobo11boo$53bobo60bobo$$106b3o$106bo$ 107bo$$34boo$35boo78boo$34bo79boo$116bo! golly-3.3-src/Patterns/Life/Syntheses/slow-salvo-eater-recipes.rle0000644000175000017500000000326512026730263022226 00000000000000#C Four results from Paul Chapman's 'Glue' search program: #C asynchronous slow-salvo glider constructions of four orientations #C of a fishhook eater. [A mirror image provides recipes for the other #C four orientations.] Salvos contain 13, 13, 15 and 18 gliders. #C Paul Chapman, 30 December 2003 x = 1361, y = 1434, rule = B3/S23 150bo$151bo$149b3o11$189bo$190bo$188b3o53$234bo$235bo$233b3o19$1359bo$ 1358bo$1358b3o20$1320bo$277bo1041bo$278bo1040b3o$276b3o37$1279bo$1278b o$1278b3o$319bo$317bobo$318boo43$373bo$371bobo$372boo9$1238bo$1237bo$ 1237b3o21$1197bo$1196bo$1196b3o7$418bo$416bobo$417boo41$458bo$456bobo$ 457boo696bo$1154bo$1154b3o37$499bo$497bobo$498boo$1112bo$1111bo$1111b 3o38$534bo$532bobo$533boo4$1073bo$1072bo$1072b3o26$1034bo$1034bobo$ 1034boo8$572bo$570bobo$571boo34$979bo$979bobo$979boo9$632bo$630bobo$ 631boo35$928bo$928bobo$928boo9$676bo$674bobo$675boo30$892bo$892bobo$ 892boo9$712bo$710bobo$711boo35$846bo$846bobo$846boo9$758bo$756bobo$ 757boo24$814boo$814boo10$789boo$789boo9$809boo$809boo$786boo$786boo31$ 749b3o$751bo$750bo90boo$841bobo$841bo42$701b3o$703bo$702bo$$882boo$ 882bobo$882bo30$658b3o$660bo$659bo12$925boo$925bobo$925bo35$610b3o$ 612bo$611bo7$980boo$980bobo$980bo27$564b3o455b3o$566bo455bo$565bo457bo 37$1050boo$1050bobo$1050bo14$516b3o$518bo$517bo27$1089b3o$1089bo$1090b o11$483boo$482bobo$484bo25$1129b3o$1129bo$1130bo16$434boo$433bobo$435b o13$1169b3o$1169bo$1170bo27$390boo$389bobo$391bo25$1213b3o$1213bo$ 1214bo15$336boo$335bobo$337bo6$1254b3o$1254bo$1255bo30$1299b3o$1299bo$ 1300bo$$310boo$309bobo$311bo43$272boo$271bobo$273bo$1338b3o$1338bo$ 1339bo40$228boo$227bobo$229bo43$163boo$162bobo$164bo42$118boo$117bobo$ 119bo41$74boo$73bobo$75bo40$47boo$46bobo$48bo40$boo$obo$bbo! golly-3.3-src/Patterns/Life/Syntheses/make-p11.rle0000644000175000017500000000346412026730263016707 00000000000000#C "Achim's p11" oscillator synthesized from 96 gliders #C Mark Niemiec, 2/2000; pattern from Jason Summers' "jslife" archive x = 266, y = 266, rule = B3/S23 245bobo$8bo236boo$9boo235bo$8boo$233bo$231boo$232boo15bo$14bo232boo$ 15boo231boo12bobo$14boo246boo$230bo32bo$229bo6bo$13bo13bo201b3o4bobo$ 14boo12boo206boo13bobo$13boo12boo222boo3bobo$252bo3boo$6bobo248bo$7boo $o6bo$boo$oo41bo$41bobo$42boo$48bo$49bo$47b3o$$12bo238bobo$13bo237boo$ 11b3o238bo3$4bobo$5boo$5bo6bo215bo$10bobo193bo19boo$11boo191boo21boo$ 34bobo168boo$35boo$35bo$45bo$43bobo198bo$44boo197bo$224bo18b3o$59bo 163bo$60boo161b3o$59boo$240bo$240bobo$240boo10$35bobo181bobo$36boo181b oo$36bo183bo$183bobo$183boo$50bo9bo123bo$48bobo10boo$49boo9boo16$72bo$ 73boo4bo$72boo6bo$78b3o13$182bo$182bobo$182boo10$93bo$91bobo$92boo3$ 179bo$179bobo$179boo$154bo$125bobo25bo6bo$126boo25b3obboo$119bo6bo32b oo$120bo$118b3obbo$124boo$123boo6$137boo$137bobo$137bo$$129boo$128bobo $130bo4$150b3o$126boo22bo$127boo22bo$126bo4$123bo$123boo$122bobo$152b oo$152bobo$152bo4$112b3o$114bo33bo$113bo33boo6boo$147bobo5bobo$155bo4$ 109b3o$111bo$110bo35boo$146bobo35bo$146bo36boo$183bobo$$70bo59bo$70boo 58boo$69bobo22b3o32bobo$77bo18bo$77boo16bo$76bobo$168boo$168bobo$168bo 3$76boo$75bobo$77bo16boo$95boo$94bo78boo$172boo$174bo8$56bo$56boo$55bo bo5$45bo183bo$45boo181boo$44bobo181bobo$$64boo$65boo$64bo$$178boo$178b obo$178bo$$24boo$23bobo$25bo$205boo$40b3o161boo$42bo163bo$20b3o18bo$ 22bo197boo$21bo198bobo$220bo$230bo$229boo$59boo168bobo$37boo21boo191b oo$38boo19bo193bobo$37bo215bo6bo$259boo$259bobo3$13bo238b3o$13boo237bo $12bobo238bo$$216b3o$216bo$217bo$222boo$222bobo$222bo41boo$263boo$258b o6bo$257boo$8bo248bobo$8boo3bo$7bobo3boo222boo12boo$12bobo13boo206boo 12boo$27bobo4b3o201bo13bo$29bo6bo$bbo32bo$bboo246boo$bobo12boo231boo$ 17boo232bo$16bo15boo$33boo$32bo$256boo$19bo235boo$19boo236bo$18bobo! golly-3.3-src/Patterns/Life/Syntheses/make-osc-p5-plus.rle0000644000175000017500000002175112026730263020374 00000000000000#C 5-1. "fumarole", Stephen Silver, 2/00 #C 5-2. Jason Summers, 11/04 #C 5-3. JS, 4/05 #C 6-1. Mark D. Niemiec/Jason Summers, 2/04 #C 6-2. JS, 8/04 #C 6-3, JS, 9/04 #C 7-1. unnamed p7, MDN/JS, 9/00 #C 8-1. "Coe's p8", MDN, 4/00 #C 8-2. "galaxy", JS, 9/03 #C 8-3. JS with MDN, 8/04 #C 15-1. MDN, 12/02 #C 16-1. "Achim's p16", JS, 10/04 #C 18-1. MDN, 3/02 #C 22-1. JS,2/01 #C 24-1. JS, 1/04 #C 138-1. JS, 10/02 #C Pattern from Jason Summers' "jslife" archive. x = 343, y = 232, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbo3$o20bo53bo74bo74bo49bo6bo$4bobobo7bo8bobobo7bobobo14bo42bo54bob obo7bo43bo18bobobo7bobobo27boo$56bobo33bo4bobo110bobo37bobo21boo$o3bo 11bo4bo3bo15bo14boo17bo17bo4boo50bo3bo11bo43boo13bo3bo15bo5boo29bo$45b o45b3o45bo111bo$4bobobobbobobbo8bobobobbobobbobobo4boo37bo53bobo12bobo bobbobobbo62bobobobbobobbobobo14bo$o20bo23boo4bo23bo10bo52boo9bo74bo 32bobo21bo$8bo7bo12bo7bo13bobo30b3o67bo3bo7bo62bo3bo7bo17boobbobo$51b oo210boo6bo$o3bobobo7bo4bo3bobobo7bobobo4bo28bo74bo3bobobo7bo58bo3bobo bo7bobobo18bo5bo11bo$44bobo47bo34bo47bobo12bo14bobo60b3o$45boo48boo32b obo10bo25bo9boo13bo13boo$o20bo53bo18boo33boo11bobo5bo15bobo9bo12b3o14b o16bo31bo24bo$142boo23boo89boo9boo$134bobo83bo36boo9boo$o14bobo3bo49bo 3bo15bo42boo14bo63bo5bobobbo44bo11bo$15boo53bo21bo42bo76boo6boo$16bo 53b3o17b3o51bo68boo40b3o$o20bo53bo67bo6bo74bo31bo5bo18bo$48bobo92b3o 110bo6boo$4bo10bo16boo15boo15bo51bo143bobobboo$o4boo6boo6bo9bobo15bo 15bo9bo41bo32bo27bo13bo32bo41bobo12bo$4boo8boo17bo31b3o49b3o59bo13bo 73bo$79bobobo7bobobo81b3o11b3o82bo$o20bo53bo74bo35bo38bo49boo5bo$50b3o 26bo15bo91boo63boo21bobo$52bo15bo117boo65boo$o20bo22b3o4bo10b3obboo6bo 3bobobobbobobbobobo6bo47bo51bobo20bo26bo29bo$46bo15bo4bobo30bobo7bo7bo 49bo33boo$6bobobbobo31bo17bo19bo11bo5boo8bo4boo51bo33bo$o6boobboo8bo 53bo33b3o5boo31bo16b3o24bo11bo18bobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbo$7bo4bo22b3o41bobobo7bobobo97bo12bobo$37bo155b3o10boo4bobo $o20bo14bo38bo74bo61boo11bo116bo$213bo$120bo108bobobo7bobobo56bo$o20bo 19boo32bo43boo29bo74bo74boo40bo$3b3o8b3o23bobo76bobobboo54bo48bo15bo 55boo$5bo8bo27bo81bobo53boo$o3bo10bo5bo53bo48bo25bo28bobo43bo3bobobobb obobbobobo17bo78bo$51b3o210boo$53bo131boo42bo3bo11bo17boo$o20bo30bo22b o74bo33bobo38bo116bo$186bo42bobobo7bobobo$107b3o192bobo$obbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo33bo40b o74bo76boo38bo$108bo194bo$81b3o87bo45boo$75bo7bo66bo20boo44bobo5bo116b o$82bo51b3o33bobo34boo8bo$91bo42bo72bobo$75bo15boo42bo14bo56bo17bo116b o$90bobo206bo13bo$83boo189bo23bo14bobo$75bo6bobo11boo33boo17bo74bo46bo bo23b3o12boo27bo$84bo10bobo32boo141boo$97bo34bo$75bo74bo60boo12bo116bo $206bo3boo56bo24bobo$140b3o18boo42boo5bo56boo22boo$75bo10boo52bo9bo11b oo41bobo17bo42boo24bo47bo$85bobo53bo19bo141bo$87bo45b3o104bobo59bo19bo $75bo51boo4bo16bo74bo15boo59b3o15boo20bo$127bobo4bo19boo72bo12bo79boo 6bobo$127bo25bobo73boo98boo$75bo74bo4bo69bobboo100bo11bo$299bo11bo$ 260bobo34boo12bobo$75bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbo35boo35boo11boo29bo$261bo$266bo$obbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbo131bo30bo10bo39bo34bo$257bo7b3o37boo$30bo224b3o 48boo$o30boo60bo131bo116bo$30boo45bo$27bo49bobo$o24bobo49boo14bo131bo 116bo$26boo288boo$315boo$o9bobo80bo131bo91bo24bo$11boo72bo$11bo73bobo$ o84boo6bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo11bo24bo 91bo$251boo$250boo$o3bobobo7bo76bo47bo29bo41bo11bo116bo$97bobobo7bo35b obobo7bobobo13bobobo7bobobo16bobo$8bo7bo22bo168boo$o39boo51bo3bo3bo7bo 31bo3bo3bo11bo9bo3bo3bo11bo17bo3bo11bo116bo$8bobbobobbo22boo219boo48b 3o$97bobobobbobobbo35bobobobbobobbobobo13bobobobbobobbobobo69boo37b3o 7bo$o7bo7bo76bo47bo29bo41bo11bo34bo39bo10bo30bo$31bobo13bo49bo3bo7bo 35bo3bo7bo17bo3bo11bo109bo$8bo7bo15boo11boo259bo$o31bo13boo45bo3bobobo 7bo31bo3bobobo7bobobo9bo3bobobo7bobobo16bo4bo11bo29boo11boo35boo35bo$ 207bo46bobo12boo34bobo$207b3o46bo11bo$o92bo3bobo41bo29bo41bo11bo11bo 100boobbo$45bo52boo137boo98boo$46bo51bo81bo55bobo6boo79bo12bo$o43b3o 46bo24bobo20bo29bo9bo31bo11bo20boo15b3o59boo15bo$118boo59b3o63bo19bo 59bobo$119bo76bo67bo$o92bo47bo29bo22boo17bo11bo47bo24boo42bo$100bo29bo 64boo76boo22boo$39bobo56bobo27boo29bo112bobo24bo$o39boo14bo36bo5boo28b oo10bo15boo12bo41bo11bo116bo$35boo3bo15bobo94bo4boo$34bobo15bo3boo93bo bo22bo116boo$o35bo14boo40bo35bo11bo10boo17bobbobo36bo11bo27boo12b3o23b obo46bo$51bobo75bobo26bo16boo75bobo14bo23bo$118bobo8boo27bobo93bo13bo$ o92bo24boo21bo16boo5bo5bo16boo23bo11bo116bo$119bo30bo13bo22bobo5b3o$ 103bo40bobo4bo12b3o22bo5bo$o45b3o44bo7bobo37bo3boobb3o19bo24bo16bo11bo 116bo$46bo55boo41bo62boo$47bo144boo14bobo53bo$o92bo47bo25bo3bo19boo15b o4bo11bo38boo76bo$161b3obboo25bo69bobo$146b3o12bo4bobo$o44boo13bo32bo 17b3o27bo6bo13bo8bo41bo11bo116bo$46boo11boo52bo33bo5boo33boo113boo$45b o13bobo37boo11bo39bobo34boo111boo$o92bo4bobo40bo12bo16bo16bo24bo11bo 78bo37bo$100bo58boo42b3o$52boo63b3o39bobo41bo61boo$o50boo40bo23bo23bo 11boo4bo11bo32bo8bo11bo40boo74bo$53bo64bo35boo109bo$103b3o47bo$o92bo 11bo35bo29bo3b3o35bo11bo116bo$104bo72bo$176bo$o5boo85bo10bo36bo29bo41b o11bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo$5bobo73bo22boo16b oo$7bo72boo21bobo16bobo$o79bobo10bo28bo9boo7bo29bo41bo$132bobo$65boo 65bo42bo$o13boo49bobo25bo47bo29bo3boo36bo$13bobo49bo31b3o7bo66bobo$15b o45boo36bo7boo$o59boo31bo4bo7bobo32bo29bo41bo$62bo$$obbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$obbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o38bo56bo78bo19bo38bo 56bo38bo$4bo3bobobo7bo22bo3bobobo7bo40bo3bobobo7bo56boo24bobobobbobobo 7bo19bobobobbo3bo7bo37bo3bobobobbobobo7bo$174boo$o3bo3bo11bo18bo3bo3bo 11bo36bo3bo3bo3bo7bo78bo7bo6bo7bo15bo7bobbo3bo7bo33bo3bo7bobbo3bo7bo 11bo$76bo$4bo3bobobobbobobbo22bo3bobobobbobobbo15bo24bo3bobobobbobobbo 39bo42bobobobbobobobbobobbo19bobobobbobobobbobobbo37bo3bobobobbobobobb obobbo$o38bo35b3o18bo60bo37bo38bo44bo11bo38bo$4bo7bo7bo22bo3bo3bo7bo 40bo3bo3bo7bo38b3o41bo6bo11bo19bo10bo7bo20bo16bo7bobbo3bo7bo$278b3o$o 3bo3bobobo7bo18bo3bo3bobobo7bo36bo3bo3bobobo7bo75bobbo3bobobobbobobo7b o15bo3bobobo6bo7bo33bo3bo3bobobobbobobo7bo11bo$191bo$191b3o$o38bo56bo 98bo38bo56bo38bo$6bobo272bobo$7boo272boo32bo$o6bo31bo56bo36bo61bo38bo 47bo8bo23bobo12bo$30bobo101bo153bo26boo$30boo100b3o139bo11boo$o30bo3bo 3bo56bo98bo38bo24bo14bobo10boobbo38bo$34bo37bo53bobo9bo118bobo14boo$ 34b3o6bo17bo8bobo54boo8bo68bo5bobo43boo57bobo$o38bobobo18bo8boo23bo30b o9b3o55bo8bobo6boo19bo56bo16bo8boo11bo$5bo36boo16b3o142boo6bo15bo71bo 7bo8bo$3bobo69bo65bo86bo73boo3b3o$o3boo33bo35bobo18bo6bobo35bobo51bo 32b3o3bo56bo4bo4boo27bo$56b3o16boo27boo35boo154bo$58bo45bo145bo44b3o 20bo$o15bo22bo17bo38bo54bo11bo31bo38bo16bo39bo26bobo9bo$7bo7bo6bo122b oo4bobo7boo86b3o66boo$5bobo7b3o4bobo120bobo3boo9boo$o5boo14boo15bo56bo 48bo49bo14b3o13bo7bo56bo38bo$212bo11boo$211bo13boo76boo$o38bo37bo18bo 98bo24bo13bo35bo20bo10bobo25bo$76bo65boo76bobo47bobo6bo24bo20b3o$58boo 16b3o62boo77boo48boo6bo46bo$o38bo17bobo36bo46bo16bo34bo38bo43b3o10bo 28boo4bo3bo$25boo32bo98boo48boo103b3o3boo$9bobo13bobo44b3o16boo66boo7b o38bobo94bo8bo7bo$o9boo13bo13bo22boo8bo18bobobbo71bobo24bo13bo24bo39b 3o14bo12boo8bo15bo$10bo51bobo8bo17bo76boo33boo13bo55bo28bobo$62bo141b oo11bo57bo8boo$o31boo5bo56bo98bo7bo13b3o14bo48boo6bo38bo$16boo14bobo 213b3o34bo$17boo7b3o3bo96boo13boo104bo55boo$o15bo9bo12bo56bo33boo13boo bboo37bo6bo38bo14bo41bo13bobo22bo$27bo101bo14bo5boo35boo78bo39bo$149bo 37bobo48boo26boo$o9boo23boobbo56bo98bo3b3o32bobbobo26bobo22bo38bo$4boo 5boo22bobo163bo37bo14bo$3bobo4bo24bo164bo15bo6boo19boo8boo$o4bo33bo56b o68boo28bo19boo6bobo8bo10boo6bobo35bo38bo$14boo144boo3bobo47bobo5bo20b o$15boo126boo15bobobbo$o13bo24bo17b3o36bo47boo14bo34bo38bo56bo38bo$11b o47bo83bo$11boo45bo$o9bobo26bo56bo62boo34bo38bo56bo38bo$35boo122bobo$ 34boo105b3o15bo$o35bobbo56bobb3o41bo51bo38bo56bo38bo$101bo40bo$100bo$o bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbo98bobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbo$135b3o$135bo$96bo39bo58bo3$96bo20boo76bo$ 118boo$117bo$96bo98bo3$96bobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-3.3-src/Patterns/Life/Syntheses/oscillator-syntheses.rle0000644000175000017500000000434612026730263021571 00000000000000#C Glider syntheses for ten oscillators. #C Pentadecathlon, tumbler, mold, figure 8, unix, mazing, #C A for All, washing machine, octagon II, cloverleaf. #C From Alan Hensel's "lifebc" pattern collection x = 187, y = 79, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o17bo38bo20bo20bo26b o23bo35bo$67bo36bo$63bo3bobo35bo29bo44bo$o17bo38bo6bobboo9bo5bo14bo3b 3o20bo9boo12bo29bobo3bo$62b3o20bo26bo22boo43boo$10bo72b3o26bobo$o7bobo 7bo38bo7bobo10bo20bo12boo12bo23bo35bo$9boo20bobo7bobo21boo15bo$27boo3b oo7boo3boo18bo15boo$o9b3o5bo9boobbo9bobboo10bo20bobbobo15bo18bo7bo23bo 35bo$10bo16bo19bo21bo47bo$11bo57bobo45b3o$o5bobo9bo4boo25boo5bo11boo7b o14boo4bo26bo8b3o8bo3bo35bo$7boo15boo7boo5boo7boo42bobo12bobo26bo7boo$ 7bo15bo8bobo5bobo8bo41bo15boo25bo8bobo$o17bo15bo5bo16bo20bo20bo9bo16bo 23bo35bo$137b3o$68bo19b3o13bo3boo27bo$o17bo38bo9boo9bo9bo10bo4boobbobo 9boo4bo3b3o5bo11bo35bo$67bobo19bo13bobobbo11bobo9bo21bo13bo$120bo10bo 23boo10bo$o17bo38bo20bo20bo26bo23bo3boo11b3o16bo3$obbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo5bo29bo $157bo$155b3o$o47bo47bo53bo35bo$114bo46bo$112bobo45bo$o18bo28bo47bo16b oo35bo9b3o23bo$17bobo43bo$18boo18bo25bo52b3o$o36bo10bo13b3o31bo20bo32b o35bo$37b3o78bo$$o47bo47bo53bo35bo$78bo$78bobo22bo$o47bo29boo16bo7bo 45bo35bo$55bo46b3o$39bobo11bobo$o34bo4boo6bo5boo40bo53bo9b3o23bo$35boo 3bo65boo52bo$34bobo69bobo52bo$o18b3o18b3o5bo47bo9bo43bo35bo$14b3obbo8b obo11bo18bo93b3o$16bo3bo8boo10bo20boo93bo$o14bo13bo18bo12boo33bo53bo5b o29bo$$28boo50boo$o27bobo17bo30boo15bo53bo3boo11b3o16bo$28bo52bo73boo 10bo$154bo13bo$o47bo47bo53bo35bo$7bo14b3o119b3o$7boo13bo64boo55bo$o5bo bo14bo24bo38bobo6bo48bo4bo35bo$87bo$37b3o23boo$o36bo10bo13bobo31bo53bo 35bo$18boo18bo25bo$17bobo$o18bo28bo47bo53bo35bo$$78b3o$o47bo29bo17bo 53bo35bo$79bo$180boo$o47bo47bo53bo29bobo3bo$129boo49bo$129bobo$o47bo 47bo32bo20bo35bo3$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-3.3-src/Patterns/Life/Syntheses/make-osc-p3.rle0000644000175000017500000001223112026730263017402 00000000000000#C Some glider syntheses of p3 oscillators: #C 3-1. "cis skewed poles", Stephen Silver and Mark D. Niemiec, 1/00 #C 3-2. "cross", Jason Summers, 8/04 #C 3-3. "short keys", JS, 8/04 #C 3-4. JS, 9/04 #C 3-5. "bent keys", JS, 9/04 #C 3-6. "asymmetric keys", MDN, 1/00 #C 3-7. "star", JS, 8/04 #C 3-8. JS, 8/04 #C 3-9. "diamond ring" with nonstandard stator. JS, 8/04 #C Pattern from Jason Summers' "jslife" archive. x = 271, y = 186, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbo3$o41bo19bo24bo47bo89bo$4bobobo7bo43bobo28bobobo7bob obo31bobobo7bobobo$61boo10bo$o7bo7bo25bo29bo14bo7bo7bo19bo11bo7bo7bo 73bo$72b3o46boo$4bobobobbobobbo29bo44bobobobbobobbobobo14boo15bobobobb obobbobobo$o41bo4boo38bo47bo89bo$8bo7bo29boo3bo18bo24bo11bo35bo7bo3bo$ 52boo16bobo134bo$o3bobobo7bo25bo8boo17boo9bobo3bo3bobobo7bobobo27bo3bo bobo7bobobo49boo18bo$30bo50boo32bo90boo$29bo52bo26bobobbo$o28b3o10bo 21bobo20bo21boo3b3o18bo89bo$16bo48boo43bo11bo85bobo7bo$14bobo48bo55bo 33bo52boo8bobo$o14boo25bo27bobo14bo18bo14b3o11bo20boo51bo3bobobboo5bo$ 70boo35boo46boo56boo$71bo34boo91bobo12bo$o27bo13bo3bobobo7bobobo24bo 47bo63boo24bo$28bobo169bo$8bo19boo5bo14bo11bo55boo$o8boo22boo7bo44bo 29boo16bo89bo$8boo24boo10bobobobbobobbobobo11boo43bo41bo$75boo82bobo$o 41bo7bo11bo11bo12bo23bo23bo6bobo15boo63bo$11bo20bo78boo30boo$11boo3boo 4bo8boo13bobobo7bobobo47bobo30bo$o9bobo4boobboo8bobo8bo44bo8boo19bo12b oo3bo89bo$16bo4bobo46bo24bobo18boo12bobo$70boo25bo18bobo11bo$o41bo26bo bo15bo47bo29bo59bo$166boo$165boo$obbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbo89bo$$169bobo$o41bo44bo47bo34boo53bo$4bo bobo7bobobo25bobobo7bo3bo107bo$$o7bo11bo21bo7bo7bo3bo24bo47bo89bo$173b o$4bobobobbobobbobobo25bobobobbobobbobobo111boo$o41bo44bo47bo37boo50bo $8bo7bo33bo11bo$178bo$o3bobobo7bobobo21bo3bobobo11bo24bo47bo40boo47bo$ 177boo$$o41bo44bo47bo31b3o55bo$169bo$18bobo41bobo103bo$o17boo22bo20boo 22bo47bo89bo$19bo43bo106boo$27bo22bo20bo97bobo$o25bo15bo8boo15bobbobo 13bo47bo35bo53bo$15bobo8b3o21boo14bobobboo$16boo3bo45boo$o15bo5bo19bo 13bo30bo47bo89bo$10bo9b3o34boo$8bobo45boo$o8boo20bo10bo22bo21bo47bo89b o$29boo35bo$30boo32b3o$o34boo5bo44bo47bo89bo$12boo20boo$11bobo14bo7bo$ o4bo7bo14bobo11bo44bo47bo63boo24bo$6boo20boo168boo$5boo135boo56bo$o9b oo30bo44bo47bo5bobo81bo$11boo63boo65bo$10bo20boo19boo22bobo$o30bobo8bo 10boo21bo10bo47bo89bo$19b3o9bo20bo87bo$19bo5bo114boo$o19bo3boo16bo32bo 11bo47bo3bobo83bo$13b3o8bobo25bo21boo$15bo36boo20bobo$o13bo27bo8bobo 33bo47bo78boo9bo$22bo38bo147bo3boo$22boo31boo4boo145boo5bo$o20bobo18bo 13boobbobo16bo7bo47bo72bobo14bo$55bo22boo62boo4boo$78bobo60bobo3bobo$o 41bo44bo47bo7bo5bo75bo3$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbo47bobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo5$o bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o89bo 89bo89bo$19bobobo7bobobo58bobobo7bobobo73bobobo7bobobo$157bo$o22bo11bo 54bo7bo7bo3bo45bo23bo7bo7bo3bo69bo$156b3o$19bobobobbobo6bo58bobobobbob obbobobo73bobobobbobobbobobo$o12bo76bo89bo89bo$14boo7bo11bo62bo7bo3bo 5bo71bo11bo48bo$13boo102bo130bo$o18bobobo11bo54bo3bobobo7bobobo4b3o62b o3bobobo7bobobo42bo4b3o19bo$243bobo$80bobo119bobo38boo$o79boo8bo89bo 22boo65bo$81bo121bo$$o24bo64bo89bo89bo$26bo$24b3o$o89bo89bo89bo$99bo 94bo65bo$97bobo68bo26boo43bo19bobo$o89bo7boo43bobo22bobo9bo13boo44bobo 17boo8bo$71bo71boo23boo70boo$71bobo70bo$o70boo17bo89bo54bo23bo10bo$ 233boo23bo$35bo91bobo20bo83boo22b3o$o32bobo6bo47bo37boo18boo30bo67bo 21bo$34boo4bobo85bo20boo96bo$41boo204b3o$o89bo89bo29bo59bo$61bo146bobo $60bo55bo34bo57boo$o59b3o27bo26boo30boo29bo89bo$47bo68boo32boo62bobo 13b3o$48bo166boo13bo$o45b3o41bo49bo39bo34bo15bo38bo$138boo$60bo71bo6b oo76bo$o58bo30bo42bo46bo36bobo50bo$37boo20b3o69b3o83boo10boo$36bobo 189boo$o37bo51bo89bo49bo39bo$133bo$52bo80bobo86bo$o51bobo35bo42boo45bo 42boo45bo$29b3o20boo168boo10boo$31bo201bobo$o29bo59bo64boo23bo54bo34bo $154boo$42b3o111bo64bo15bo$o41bo47bo89bo41bo13boo32bo$43bo176b3o13bobo $28b3o119bo$o29bo59bo31boo20bo4boo29bo61boo26bo$29bo93boo18boo4bobo90b obo$122bo20bobo96bo$o47boo40bo89bo22b3o64bo$48bobo4boo148bo$48bo6bobo 70bo75bo$o54bo34bo12boo23boo50bo11b3o22boo51bo$102bobo22bobo43boo19bo 23boo$18boo84bo68bobo17bo23bo$o16bobo70bo82bo6bo89bo$19bo191boo$191boo 17bobo44boo$o89bo89bo9bobo19bo43boo12bo$192bo65bo$$o63b3o23bo89bo89bo$ 64bo$65bo$o89bo89bo89bo$9bo145b3o91bo$9boo144bo92boo$o7bobo79bo65bo23b o27boo38bobo19bo$207bobo$202b3o4bo$o75boo12bo23b3o63bo23bo65bo$75boo 39bo86bo$77bo37bo$o89bo89bo89bo3$o89bo89bo89bo3$obbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-3.3-src/Patterns/Life/Syntheses/29-still-lifes.rle0000644000175000017500000001523612026730263020052 00000000000000#C Most of these 29 glider syntheses were found by running #C random patterns with various types of symmetry on tori. #C Occasionally an unusual still life shows up in such experiments, #C and sometimes it's possible to deduce a glider synthesis. #C Dean Hickerson, 30 May 1993 x = 229, y = 229, rule = B3/S23 o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo3$o22bo9bo3bo46bo32bo18bo13bo21bo16bo38bo$22bo15b o61bobo31bobo34bo20bobo$17bo4b3o11b3o62b2o32b2o34b3o19b2o23bo$o14bobo 15bo23bo26bo16bo15bo32bo14bo23bo3bo24bobo7bo$16b2o37bobo13bobo71bo17bo bo52b2o$56b2o13b2o38bobo31bobo16b2o$o32bo38bo3bobo5bo26b2o4bo27b2o3bo 38bo38bo$12bo9bo53b2o34bo$10bobo9bobo52bo123bo$o10b2o9b2o9bo50bo32bo 32bo19bo18bo9bobo26bo$7b2o17b2o141bo30b2o$6bobo17bobo140b3o43bo$o7bo 17bo6bo6bo43bo12bobo12bobo2bo32bo34bo3bo25bobo10bo$40b2o46bo9b2o12b2o 65b3o2b2o29b2o$39bobo3bo43b2o7bo14bo67bo2bobo$o2bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo11b2o13b2o22bo3b2o17bo9bo32bo9bo19bo8bo32b2o4bo$44bobo13bobo 43bo47bobo2bo62bobo$60bo45b3o31b2o13b2o2b3o60bo$o29bo48b3o2bo32bo21bo 2bo7bo4bo33bo38bo$79bo59bobo27b3o$80bo59bo30bo$o29bo53bo32bo15bo16bo 19bo18bo38bo$19bo111bobo$18bo113b2o$o17b3o9bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo7b2o23bo32bo38bo9b3o26bo$93b2o80b2o24bo$ 4bo87bo82bobo16b3o3bo$o4bo24bo21bo31bo32bo13b3o16bo24bo13bo6bo31bo$3b 3o45bo69bo11bo33b3o25bo$51b3o67b2o9bo36bo$o29bo53bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bobo27bo17bo20bo17b3o18bo$75bo131bo$74bo133bo$o29bo43b 3o7bo32bo32bo38bo38bo$97bobo$97b2o9bo$o29bo53bo13bo9bobo6bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$104bo3b2o$103bo$o4bo24bo47bo2bo2bo18b3o 26bo26bo61bo6bo$6bo5bo77bo130bobo$4b3o5bo22bo55bo129b2o$o11bo17bo2bobo 42bo10b3o40bo2bo23bo68bo$34b2o100b2o$135b2o18bo$o29bo47bo34bo18bo20b2o 4bo68bo$112b2o40b2o$49bo62bobo$o29bo18bobo26bo53bo12bo13bo68bo$49b2o 92bobo65bo$144b2o19bo44bo$o29bo47bo53bo18b2o6bo3bobo44b3o15bo$83bo31bo 29bo4b2o12b2o$49b3o31b2o29b2o29b2o5bo$o7b2o20bo18bo28bo3bobo22b3o4bobo 15bo11bobo8b2o2bo68bo$9b2o39bo56bo46b2o$8bo99bo47bo$o29bo11b2o34bo14b 3o36bo26bo68bo$43b2o50bo52b2o$42bo51bo54b2o$o29bo47bo53bo15bo10bo68bo$ 24b2o$24bobo$o23bo5bo47bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo26bo68bo$56b2o$56bobo$o29bo25bo21bo46bo6bo26bo68bo$124bo$124b 3o$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo53bo2bo2bo2bo2bo2bo2bo2bo2bo2bo68bo3$o21bobo17bo3bo31bo53b o10bo15bo68bo$22b2o13bo7bobo95bobo$23bo11b2o8bobo14bo80b2o$o35b2o4bo3b o15bobo13bo53bo26bo68bo$62b2o73bo$138b2o$o41bo7bo27bo53bo4b2o20bo68bo$ 50bobo161bo$31bo18b2o110bo49b2o$o28b2o11bo11b2o22bo53bo26bo3b2o48b2o 13bo$30b2o21b2o107b2o$46bo8bo$o37bo3bo2bobo30bo53bo26bo43b3o22bo$37bo 7bobo155bo$37b3o6bo157bo$o41bo35bo17b3o3b2o28bo26bo68bo$74b2o22bo2b2o$ 73b2o22bo5bo49b2o53b2o$o41bo32bo2bo53bo20bobo3bo48bobo17bo$153bo54bo$ 139b2o2b2o$o41bo35bo53bo7b2obobo13bo68bo$139bo3bo2$o41bo35bo48b2o3bo 14b2o10bo68bo$3b3o68b2o51bobo16b2o$5bo67b2o52bo20bo$o3bo37bo32bo2bo12b 2o39bo26bo68bo$8bo81bobo$8b2o82bo$o6bobo28bo3bo35bo53bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo68bo$37b2o$37bobo$o32b2o7bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo53bo26bo68bo$32b2o117bobo$34bo116b2o$o41bo9bo22bo56bo8bo10bo6bo 68bo$53b2o84b3o$52b2o84bo3b2o$o41bo32bo56bo5bobobobo2b3o9bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo38bo$139b2obobo2bo$10b2o49bo81bo4bo$o8bobo30bo19bo 12bo56bo26bo22bobo4bo38bo$11bo48b3o119b2o$183bo$o33b2o6bo20b2o10bo26bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo8bo20bo38bo$ 34bobo25bo2bo13bo87bo$34bo28bobo13b2o86b3o$o41bo21bo10bo2bobo21bo38bo 47bo38bo2$153bo56b2o$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo38bo12bo34bo19b 2o17bo$152b3o56bo2$o44bo89bobo3bo47bo13b3o22bo$11bo123b2o35bo30bo$12bo 123bo34b2o31bo$o9b3o32bo95bo10b2o17bobo15bo31b2o5bo$145b2o4bobo27b2o 38bobo$144bobo6bo26b2o39bo$o33bo10bo95bo4bo35bo6bo38bo$6bo28bo$4bobo 26b3o$o4b2o38bo14bobo69bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$61b2o$34b2o25bo49b o$o23bo8b2o4b2o4bo64bo21bo41bo3b3o8bo9bo13bo14bo$25bo9bo3bobo68b3o67bo 3bo12bobo13bobo$23b3o13bo139bo2b2o14b2o13b2o$o29bo14bo86bo2bo38bo8b2o 4bo38bo$29b2o105b2o$29bobo103b2o18b3o37b3o17b3o$o44bo86bo22bo18bo14bo 7bo8bo8bo12bo$156bo39bo9bo9bo$17bo49bo5bo21bo5bo47bo28b3o25bo$o14bobo 27bo22bo2b2o23bo2b2o31bo16b2o23bo5bo8bo38bo$16b2o48b3o3b2o20b3o3b2o46b obo28bo4bo$138b2o43b2o$o44bo86bo6b2o33bo8bobo3bo38bo$138bo$19b2o64b2o 3b3o20b2o3b3o$o17b2o4bo2bo2bo2bo2bo2bo2bo2bo40b2o2bo23b2o2bo13bo41bo2b o2bo2bo2bo2bo38bo$20bo64bo5bo21bo5bo2$o10bo3bo8bo15bo4bo86bo53bo41bo$ 9bobo2b2o23bo$10b2o2bobo22b3o$o23bo20bo86bo53bo41bo2$74b3o$o14b3o6bo 20bo30bo55bo53bo41bo$15bo17b2o40bo49bo46b2o$16bo17bo2bo86b2o45b2o$o23b o9bobobo6bo78bobo5bo40bo12bo3b2o29b2o5bo$32bobobobo150bobo29bobo$32b2o 3bo153bo29bo$o2bo2bo2bo2bo2bo2bo2bo2bo5b2o13bo86bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo41bo$27bo3bo$27b4o$o8bobo12bo20bo86b o14bo26bo11bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$10b2o17b2o19bo 104b2o7b2o$10bo17bo2bo18b2o103b2o7b2o$o23bo4b2o14bo3bobo80bo14bo26bo 53bo$180bo43bo$151bo17bo11b2o39b2o$o23bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo14bo4bo15bo5bo5b2o41b2o3bo$150b3o15b3o2$o53bo9bobo35bo44bo7bo 9bo8bo53bo$65b2o88bo9bo$65bo89bo9bo13bobo41bobo$o53bo47bo44bo26bo5b2o 41b2o3bo$69bo110bo43bo$19bobo48b2o$o19b2o32bo14b2o31bo10bobo31bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo53bo$20bo93b2o$114bo26bo$o53bo47bo36b2o33bo53bo$ 38bo52bo48b2o$39bo52bo64bo$o36b3o14bo35b3o9bo53bo8bo8bo53bo$6bo52bo49b o29bo16b3o4b2o$4bobo50bobo47bobo29bobo22b2o$o4b2o31b2o14bo3b2o31b2o9bo 5b2o29b2o33bo53bo$28bo8b2o4b2o36bo8b2o4b2o72bo$29bo9bo3bobo36bo9bo3bob o70bo$o26b3o13bo10bo25b3o13bo5bo66b3o2bo53bo$34bo52bo40bo19bo$33b2o51b 2o41bo17bo45bo17bo$o32bobo18bo31bobo13bo24b3o17b3o24bo19bo15bo17bo$ 192b3o15b3o2$o20bo32bo19bo27bo71bo53bo$19bobo50bobo120b2o11b2o$20b2o 51b2o119bobo11bobo$o53bo47bo71bo21bo11bo19bo2$49bo$o22b2o23b2o4bo21b2o 24bo71bo9b2o33b2o7bo$22b2o24bobo24b2o106bobo33bobo$24bo52bo45b3o25b3o 5b2o24bo33bo$o53bo47bo22bo25bo7bobo12bo53bo$15bo3bo48bo3bo51bo27bo6bo$ 13bobo2b2o46bobo2b2o$o13b2o2bobo33bo12b2o2bobo28bo2b3o66bo53bo$107bo$ 106bo$o53bo47bo33b2o29b2o5bo6b2o39b2o4bo$19b3o50b3o36b2o22bobo29bobo 10bobo39bobo$19bo52bo39b2o23bo29bo14bo39bo$o19bo33bo18bo28bo8bo62bo53b o3$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo! golly-3.3-src/Patterns/Life/Syntheses/life-integer-constructions.rle0000644000175000017500000007011512026730263022655 00000000000000#C Collection of small objects generated from integers written #C in a five-cell-high 'font' suggested by Eric Angelini. #C For a more complex construction, see Scripts/life-integer-gun30.py. #C See http://www.radicaleye.com/DRH/digits.html for details. #C #C This pattern contains numeric predecessors of various still-lifes, #C oscillators, the "familiar fours" (and some less familiar ones), #C and the 4 common spaceships. The numbers with at most 6 digits #C are probably minimal; the larger ones probably aren't. #C #C Names of the less common objects are taken from #C Andrzej Okrasinski's Game of Life Statistics. #C #C blinker (p2) 29 #C block 70 #C tub 3906 #C boat 24 #C beehive 163 #C ship 516 #C barge 243 #C toad (p2) 8696 #C beacon (p2) 3671 #C aircraft carrier 186176 #C snake 341957652114 #C loaf 60 #C long boat 587 #C eater 1084557 #C long snake 6065270247413614 #C #C pond 36 #C mango 857 #C long barge 127515 #C long ship 154235114 #C tub with tail 2557376 #C canoe 52104106503114 #C shillelagh 157796 #C hook with tail 112108350204 #C bipole (p2) 7020200455 #C long shillelagh 8330423935 #C very long boat 4476 #C hat 249681 #C up boat with tail 18019138 #C down boat with tail 19333076503 #C tub with long tail 1599435990114 #C #C integral sign 1135274716 #C tub with nine 187597582 #C very long ship 31808650070114 #C boat tie 7200647110228 #C block and table 41275676414 #C beehive with tail 10846421 #C up barge with tail 55540559353 #C down barge with tail 1552921912246414 #C claw with tail 91254643267 #C cis shillelagh 111410294065111068 #C loop 3317286570681 #C unnamed 11-bit still-life 761314714 #C elevener 1858705011164 #C unnamed 11-bit still-life 21590971031 #C eater siamese snake 147432532023 #C #C trans loaf with tail 149059473114 #C trans long boat with tail 6733116821185776 #C ship boat tie 1125100561957 #C cis boat and table 18710583610 #C pair of tables 33108318 #C ship tie 141225452 #C trans legs and block 11317113569 #C eater siamese eater 410754245114 #C cis block and long hook 1006382171456 #C unnamed 12-bit still-life 127745053 #C beehive with bend tail 7961412233308125408 #C cis snorkel loop 16635966646711066148 #C unnamed 13-bit still-life 38923541681 #C beehive at loaf 277305174681 #C half bakery 76109 #C #C cis loaf at loaf 189422808541 #C paper clip 324637 #C big S 14172002 #C hat siamese hat 1130132 #C racetrack II siamese hat 22798258254132 #C fourteener 23144355435681 #C cis mirrored R-bee 380718 #C trans rotated R-bee 4104645072 #C cis rotated R-bee 7621392111674 #C bookends 18030383 #C cis hook and R-bee 113021797020694 #C pond and table 604123154231147 #C block and dock 141247457341871 #C beehive and cap 410173645421961 #C dock siamese carrier 14644309288681 #C #C unnamed 14-bit still-life 13673415404000183 #C cis boat and dock 6581004399314 #C bi-pond 141207310 #C moose antlers 7686328 #C cis mirrored long hook 113183 #C beehive and dock 340412204591456712 #C cis mirrored R-loaf 410813883110 #C scorpion 1803712066986301 #C twin peaks 66695034197110359 #C unnamed 18-bit still-life 1893303515 #C cis mirrored R-mango 4110080033111 #C cis rotated R-mango 669019610699 #C dead spark coil 4108303132 #C trans rotated C 6587961971 #C unnamed 18-bit still-life 13554271714 #C #C pond and dock 182530867166 #C cis long hook and dock 122915233114 #C unnamed 19-bit still-life 7161006176 #C cis mirrored dock 25410808131018 #C unnamed 21-bit still-life 46725681 #C long worm and blocks 13801006728751 #C cis mirrored worm 6308383830114 #C cis mirrored long dock 630800000080010 ( Nicolay Beluchenko ) #C unnamed 26-bit still-life 180303033818720 #C unnamed 28-bit still-life 180010010081 #C unnamed 38-bit still-life 70310003114 #C #C traffic light 1 #C blockade 67 #C honey farm 78 #C fleet 7108 #C bakery 1672 #C land of lakes 1635661 #C 4 eaters 11300 #C #C pulsar (p3) 0 #C pentadecathlon (p15) 1445481003304129144171771 #C queen bee shuttle (p30) 1983263225470666662666647618 #C twin bees shuttle (p46) 397301133310 #C twin bees shuttle (p46) 331101301133310 #C (last three found jointly with Nicolay Beluchenko) #C #C glider 90 #C LWSS 3207 #C MWSS 94174 #C HWSS 185598100297311043114 #C #C Dean Hickerson, 26 March 2007 x = 736, y = 428, rule = B3/S23 b3o12b3ob3o60b2o13b3ob3o46b2o15bobob3ob3ob3ob3obobob3obob3o33b2o13bobo bob3ob3ob3ob3obobob3ob3obobobobo37bo16bob3ob3obobob3ob3ob3ob3ob3ob3obo bobo25bo16bob3ob3ob3ob3obobobob3obobob3obobob3ob3ob3obob3ob3o15b2o13bo b3ob3ob3ob3ob3ob3ob3ob3obob3ob3o43b3o14bo$18bobobo59bo2bo14bobo48bo16b obo3bobo5bo3bobobo3bobobo34bo2bo12bobobobobobobobo3bobobobo3bo3bobobob obo36bobo15bobobobobobobo3bo3bobobobobobobobo3bobobo24bobo15bo3bobo5bo 3bobobobobo3bobobobobobobobobobobobobobobo3bo14bo2bo12bobobo3bobo5bobo bobobobo5bobobo3bo62bo$16b3ob3o59bo2bo12b3ob3o47b3o13bobob3ob3ob3o3bob 3o3bobob3o32bobo13bob3ob3obobob3ob3ob3o3bob3obobob3o35bo2bo15bob3ob3ob 3ob3ob3ob3obobob3ob3ob3obo24bobo15bob3ob3o3bob3ob3obob3ob3obobob3obobo bobobobobob3ob3o14bo2bo12bob3ob3ob3ob3obobob3ob3o3bobob3ob3o41bo5bo12b o$16bo5bo60b2o15bobobo50bo12bobo3bo3bobo5bo3bo3bobobobo33bo14bo3bo3bob obo3bo3bo3bo3bo3bobobo3bo36b2ob2o13bobobo3bo3bobo3bo3bobobobobobo3bo3b obo25bob2o13bo3bobobo3bo3bo3bobo3bo3bobobo3bobobobobobobobobobo3bo15b 2o13bobobobo5bo3bobobobobobobo3bobobobobobo41bo5bo12bo$16b3ob3o75b3ob 3o49b2o12bobob3ob3ob3o3bo3bo3bobob3o30b3o15bo3bob3ob3ob3ob3o3bo3bob3ob obo3bo38bo2bo12bob3ob3o3bob3ob3ob3ob3ob3ob3o3bobo27bobo12bob3ob3o3bob 3o3bobob3o3bob3o3bob3ob3ob3obob3ob3o30bob3ob3ob3ob3ob3ob3ob3o3bobob3ob 3o41bo5bo12bo$231bo96bobo82bo2bo86b4o$329bo84b2o86bo4bo98b3o$502b2o2b 2o8$665b3ob3o$665bobobobo$665b3obobo$667bobobo$665b3ob3o2$601b2o$601b 2o2b2o$605b2o7$2b2o12b3ob3o59b2o14b3ob3ob3o42bo16bob3ob3ob3ob3ob3ob3ob 3ob3o34b2o12b3ob3ob3ob3obobob3ob3ob3obobob3ob3ob3ob3ob3o24b2o14b3ob3ob obob3ob3ob3o47bo14b3ob3ob3obob3ob3obobob3ob3ob3ob3obobobo26b2o2b2o12bo b3ob3ob3obob3ob3ob3ob3obobobobo64b3ob3o$2b2o14bobobo58bo2bo13bobobo5bo 41bobo15bobobo3bobo3bobo3bobo3bobo3bo33bobo12bo5bo3bo3bobobobo3bobo3bo bobobobobo5bo3bobo25bo2bo15bo3bobobobo5bo3bo46bobo13bo3bo3bobobobobobo bobobo3bobobobobo3bobobobo26bo4bo12bo3bo3bobobobobo5bo3bo3bobobobobo 64bo5bo$18bobobo59bo2bo12b3ob3o3bo42bobo14bob3o3bob3ob3o3bob3ob3ob3o 32bobo13b3o3bob3ob3obobob3ob3ob3obobob3ob3o3bo3bob3o23b2obo13b3ob3ob3o b3ob3o3bo47b2o13b3ob3ob3obobobobobob3ob3ob3ob3ob3obob3o27b4o13bob3ob3o b3obob3ob3ob3ob3obobob3o64b3o3bo$18bobobo60b2o13bobo3bo3bo44bo14bobobo 3bo3bo3bo3bo3bobobobo33bobo14bobo3bo3bo3bobobobobobobobo3bobobobo3bo3b o3bobobo24bob2o14bobo5bobobo3bo3bo62bobo3bobobobobobobobo3bo3bo3bo3bo 3bobo3bo44bobo3bo5bobo3bobo5bo3bobobo3bo64bobo3bo$18bob3o75b3ob3o3bo 44bobo12bob3o3bob3ob3o3bob3ob3ob3o31bo16b3o3bob3ob3obobob3ob3ob3obobob 3ob3o3bo3bob3o24bo2bo12b3ob3o3bob3ob3o3bo45b4o13b3ob3ob3obob3ob3o3bob 3ob3ob3ob3obo3bo27b4o13bob3ob3ob3obob3ob3ob3ob3obobo3bo64b3o3bo$154b2o 75b2o96b2o80bo4bo85bo3bo$411b2o2b2o85b2o5$605b2o$605b2o2b2o$609b2o2$ 665b3ob3ob3ob3o$667bo3bobobo3bo$665b3ob3obobo3bo$667bobo3bobo3bo$665b 3ob3ob3o3bo7$604bo$603bobo$603bobo$604bo$2bo13b3ob3ob3ob3o53bo13bob3ob 3ob3obob3o34b2o15b3obob3ob3ob3ob3ob3ob3ob3ob3ob3obobobobo14b2o16bobob 3ob3obob3ob3ob3ob3obob3ob3ob3o37b2o13bobobobob3ob3ob3ob3ob3o37b2o5b2o 12b3ob3ob3ob3ob3ob3ob3o47b2o15b3obob3obob3ob3ob3obob3ob3o70b3ob3o$bobo 14bobobobobobo54bobo12bo3bo3bobo3bobo36bobo16bobobobobobobobobo3bo3bob obobo3bobobobobobobo14bobo15bobo3bobo3bobobobobobo3bo3bobobobo5bo36bo 2bo12bobobobo3bo3bobobobobo3bo37bo7bo14bobo3bobobo5bo3bobobo47b2o17bob obo3bobobobobobo3bo3bobo48b2o7b2o15bobobo$2bo13b3ob3obobob3o51bobo13bo b3o3bob3obob3o35bobo13b3obob3obobob3ob3ob3obobobobo3bobobobobob3o15b2o 15bobob3ob3obobobobobob3ob3obob3ob3o3bo36bob2o12bob3obo3bob3obobobobob 3o38b3ob3o15bob3ob3ob3ob3ob3ob3o51bo14bobob3obobobobobob3obo3bob3o45bo 2bo5bo2bo14bob3o$18bo3bobobobobo50bobo14bobo5bo3bobo3bo36bobo14bobobob obobobobobobo3bobobobobo3bobobobobo3bo17b2o13bobobo5bobobobobobo3bobob obo3bo3bo3bo33b2obo15bo3bobo3bobo3bobobobobo42bobo17bobobobobobobo3bob o3bobo47b5o14bobobobobobobobobobobobo3bobobo46b2o7b2o15bobobo$16b3ob3o b3ob3o51bo15bob3o3bob3obob3o37b2o12b3obob3ob3ob3ob3ob3ob3ob3o3bob3obob o3bo17bobo12bobob3ob3obob3ob3ob3ob3obob3ob3o3bo33bo2bo15bo3bobo3bob3ob 3ob3ob3o41bo18bob3ob3ob3ob3ob3ob3o46bo19bobob3obob3ob3ob3obo3bob3o72bo b3o$235bo90b2o174bobob2o96bo$503b2ob2o95bobo$603bobo$604bo7$665b3obobo bob3obobo$665bobobobobo3bobobo$665b3ob3obo3bob3o$667bo3bobo3bo3bo$665b 3o3bobo3bo3bo11$2bo13b3obobo59b2o14bob3obobob3ob3ob3obobobobo24bo16b3o b3ob3ob3ob3obobob3obobob3ob3ob3ob3o20b2o12bob3ob3obob3ob3ob3ob3ob3obob 3o42bo15bobob3ob3obob3ob3o46b2o16bobobobob3ob3ob3ob3obob3o44b2o2b2o12b 3ob3obobobob3ob3ob3ob3obob3obob3obob3o38b2o16b3obob3ob3o$bobo14bobobo 59bobo13bobo3bobo3bo3bobo3bobobobo23bobo17bo3bobobobobobo3bobo3bobobob obo3bo3bobobo17bo2bo13bobobo3bobobobobo3bobo3bobo3bobobo40b5o13bobo3bo bobobo3bo3bo45bo2bo15bobobobo3bobobo3bo3bobobobo44bo4bo14bobo3bobobobo bobobobobobobobo3bobobobobobobo38bobo17bobobobobobo$b2o13b3ob3o60bobo 12bob3ob3ob3ob3ob3obobob3o24b2o17bob3obobobobob3ob3o3bobobobobob3ob3ob 3o16bobobo13bob3o3bobobobob3ob3ob3ob3obobobo39bo5bo12bobob3obobobob3ob 3o45bo2bo15bob3obob3obobo3bob3obobobo45b4o13b3ob3ob3obobobob3obobob3ob ob3obobobobob3o39b2o17bobobobob3o$16bo5bo61b2o12bo3bo3bobo5bo3bobobo3b o26b2o15bobo3bobobobobobo3bo3bobobobobobo3bo3bobo17b2ob2o12bobobo3bobo bobo3bobobo3bobobobobobo40b5o13bobo3bobobobo3bobo48b2ob2o13bo3bobobo3b obo3bo3bobobobo62bo5bo3bobobobobobobobobobobo3bobobobobobobo41b2o15bob obobobobo$16b3o3bo75bob3o3bob3ob3ob3obobo3bo26bobo14bob3ob3ob3ob3o3bo 3bobobob3ob3ob3ob3o34bob3o3bobob3ob3ob3ob3ob3obob3o42bo15bobob3ob3obob 3ob3o48bo2bo12bo3bobob3ob3o3bob3obob3o45b4o13b3ob3o3bobob3ob3ob3ob3obo b3obob3obob3o34b2o5bobo14bobob3ob3o$154bo258bo2bo85bo4bo93bobo5b2o$ 414b2o86b2o2b2o94b2o$604b2o$604bobo$605b2o6$665bob3ob3ob3ob3ob3obob3ob 3ob3ob3ob3ob3obobob3obobob3obobobobo$665bobobobo3bo3bobobobobobobobobo 3bobobo3bo3bobobobobobobo3bobobobobo$665bob3ob3ob3ob3ob3obobobobobob3o b3o3bob3obobobobob3ob3obobob3o$665bobobo3bo3bo3bobobobobobobobobo5bo3b o3bobobobobo3bo3bobobo3bo$665bob3ob3ob3ob3ob3obob3ob3ob3ob3o3bob3obobo b3o3bob3obobo3bo11$b2o13bob3ob3o57bo15b3ob3ob3ob3ob3ob3ob3o27bo2bo12bo bobob3ob3ob3ob3ob3ob3obobobobobo26bo2bo12b3ob3obob3ob3ob3obob3o52bo15b 3ob3ob3ob3ob3ob3ob3ob3ob3ob3obobobob3ob3o15b2o15bobob3obob3ob3o59b2o 13bobob3ob3ob3ob3ob3ob3obo56b2o16bob3ob3ob3o$o2bo12bobo5bo56bobo16bobo 3bo5bo3bo3bobo29b4o12bobobo3bo3bobo3bo5bobo3bobobobobo26b4o14bo3bobobo bobobo3bobobobo50b5o15bo3bo3bobobobobo3bobo3bobo3bobo3bobobo3bo3bo15bo 3bo12bobo3bobobobo3bo59bobo12bobobo5bo3bobo3bo3bobobo55bo2bo15bobo5bo 3bo$b2o13bob3ob3o57bobo13b3ob3ob3o3bob3o3bob3o43b3obob3o3bob3ob3o3bob 3ob3obob3o42b3ob3obobobob3ob3obob3o49bo5bo12b3ob3o3bob3ob3ob3ob3ob3ob 3ob3ob3obob3ob3o16b4o12bobob3obob3ob3o61bo12b3ob3o3bob3ob3ob3ob3obo55b obo16bob3o3bob3o$16bobobo3bo59bo13bo5bo3bo3bo3bo3bobobo29b2o14bobobo5b o3bobobo3bobobo3bobo3bo26b4o14bo3bobobobobobo3bobobobo50bob3o13bo3bo5b o3bobobobo5bobobobo5bo3bobo3bobo34bobo3bobobobo3bo57b4o15bobobo3bobo5b obobobobobo53b2obo3bo13bobobo3bobo$16bob3ob3o59b2o12b3ob3ob3o3bob3o3bo b3o29b2o14bobob3o3bob3ob3o3bob3o3bobo3bo26bo2bo12b3ob3obob3ob3ob3obob 3o51b2o15b3ob3o3bob3ob3ob3ob3ob3ob3ob3o3bobob3ob3o16b4o12bobob3obob3ob 3o57bo18bob3o3bob3ob3ob3ob3obo52bo2bo3bobo12bob3o3bob3o$412bo3bo83b2ob ob2o94bobo3bo2bo$412b2o86bo2bob2o95bo3bob2o$501b2o102bobo$604bo2bo$ 605b2o21$2b2o12b3obob3o59b2o12b3ob3obob3obobobob3ob3ob3ob3ob3obobobobo 9b2o12bob3ob3obobob3obobob3obo40b2o12bobobobob3ob3ob3obobob3ob3o48b2o 14b3ob3obobobobobob3ob3ob3obobob3ob3ob3ob3obo16b2o2b2o12b3obobob3obobo bob3ob3ob3obobob3ob3obobobob3ob3ob3obob3o8b2ob2o13bob3ob3ob3obob3ob3ob 3ob3ob3ob3ob3ob3obo36b2o16bob3ob3ob3ob3ob3obo$bobo12bo3bobo62bo12bo5bo bobobobobobobobobo3bo3bobo3bobobobobo9bo13bobobobobobobobo3bobo3bobo 39bobo12bobobobo3bo3bobo3bobobo5bo48bobo15bo3bobobobobobo3bobo3bo3bobo 3bobo3bo3bobobo16bo4bo14bobobobobobobobo3bo3bobobobobobo3bobobobobobo 3bo5bobo3bo8b2ob2o13bo3bobobobobobobobobobobo5bo3bobobo3bobo3bo35bo2bo 15bobo5bobo3bo3bo3bo$b2o13b3obob3o59bo13b3ob3obobobob3obobobob3ob3obob ob3obobob3o6b2obo13bobobob3ob3ob3ob3ob3obo39b2o13bob3obob3ob3ob3ob3ob 3ob3o50bo13b3ob3obob3ob3ob3ob3ob3ob3ob3ob3ob3ob3obo17b4o13b3ob3obobob 3obob3ob3obobob3ob3ob3obob3ob3ob3o3bobob3o26bob3ob3obobobobobobobob3o 3bob3ob3o3bob3obo35bo2bo15bob3ob3ob3ob3ob3obo$18bobobobo56bobo16bobo3b obobo3bobobobobobo3bobobo3bobobo3bo5bo2bo14bobobobobo3bobobo3bobo3bo 37b2o15bo3bobobo3bo5bo3bo3bobo52b2o12bo5bobo3bo3bo3bo3bo3bo3bo3bo3bobo bobobobo36bo3bobobo3bobobo3bo3bobo3bo3bo3bobo3bo3bobobo3bobobo10b5o13b o3bobobobobobobobobobobobo3bobo3bobo3bo3bobo36b2ob2o13bobobo3bo3bobobo bobobo$16b3obob3o56b2o15b3ob3obob3o3bobob3ob3ob3ob3ob3obobo3bo6b2o15bo b3ob3o3bob3o3bob3obo36bobo15bo3bobob3ob3ob3o3bob3ob3o47b2obo13b3ob3obo 3bo3bob3ob3ob3o3bob3ob3ob3ob3obo19b2o13b3o3bob3o3bobob3ob3ob3o3bob3ob 3obo3bob3ob3o3bobob3o7bo5bo12bob3ob3ob3obob3ob3ob3o3bob3ob3o3bob3obo 38bo2bo12bob3ob3ob3ob3ob3obo$231b2o94bo2bo82bo2bo84bobo2b2o99bo2bo$ 328b2o84b2o86b2o104b2o$598b2o$597bo2bo$597bo2bo$598b2ob2o$600bo2bo$ 600bo2bo$601b2o17$2bo13b3obobob3o56b2o13bob3ob3ob3ob3ob3o31b2o16b3ob3o b3obobob3ob3ob3ob3ob3ob3ob3o21b2ob2o12bobob3obob3obobob3ob3ob3ob3o47b 2o13b3ob3ob3ob3obob3o49bo14bobobob3ob3obob3ob3ob3ob3obobob3o35b2o15b3o b3ob3ob3ob3ob3ob3ob3ob3ob3obobobobo32bo7bo15bobob3ob3ob3o$bobo14bobobo 3bo57bo13bobo5bo3bobobobo34bo16bo3bo3bo3bobobobobo3bo3bobo3bobo5bo22bo b2o12bobo3bobo3bobobo3bobo3bo3bobo46bo2bo14bobobobobo3bobobobo48bobo 13bobobobobobobobo3bobobobobo3bobobobobo34bobo15bo5bobobobobo3bobobo3b obobo3bobobobobobobo30b3o7b3o13bobo3bobobobobo$obo13b3ob3ob3o56bo14bob 3o3bo3bob3ob3o32bobo14b3ob3ob3ob3obobob3ob3ob3ob3ob3ob3o22bo15bobob3ob o3bobobob3ob3ob3ob3o47b3o12b3ob3obobo3bobob3o48bo2bo12b3obobobob3obob 3ob3ob3ob3obobobobo34bo4bo12b3ob3obobob3ob3ob3ob3ob3ob3obobobobob3o29b o13bo12bobob3obobobobo$bo14bo5bo3bo56bobo12bo3bo3bo3bo3bobobo33bobo15b o3bo3bo3bobobo3bo3bo3bo3bo3bo3bo23b3o12bobo3bobo3bobobo3bo3bobobo3bo 64bobobobobo3bobobobo49b3o14bobobobobobobo3bobobobobo3bobobobobo35b5o 12bobo3bobobobobo3bobobo3bobobo3bobobobobo3bo29b2o11b2o12bobo3bobobobo bo$16b3o3bob3o57b2o12bob3o3bo3bob3ob3o34bobo12b3ob3ob3o3bob3ob3ob3ob3o b3ob3ob3o25bo12bobob3obo3bobobob3ob3ob3ob3o47b3o12b3ob3ob3o3bobob3o66b obob3ob3obob3ob3ob3ob3obobob3o52b3ob3ob3ob3ob3ob3ob3ob3ob3ob3obobo3bo 56bobob3ob3ob3o$154bo173bo2bo82b3o86b5o$329b2o82bo2bo85bo4bo$413bobo 86bobo$414bo88b2o3$596b2o11b2o$596bo13bo$597b3o7b3o$599bo7bo16$2bo13b 3ob3ob3ob3o53b2o12bobob3obob3ob3ob3ob3ob3ob3ob3obobo13bo15bob3ob3ob3ob 3ob3obob3obob3ob3obobob3obobobobobo13bo12bobobob3ob3ob3obobob3obobob3o bobobobo36bo17bobobob3obobob3obobob3ob3ob3ob3o33b2o13bob3ob3ob3ob3obob 3ob3ob3ob3ob3ob3ob3ob3ob3obo15b2o3b2o12b3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob 3ob3ob3obob3o$o2bo12bobobo3bobobo55bo13bobo3bobobobobobo3bobo3bobo3bob obobobo12bobo14bobo3bo5bobobo3bobobobobo3bo3bobobobo3bobobobobo11b3o 12bobobobobo3bobo3bobo3bobobobo3bobobobo35bobo16bobobobobobobobo3bobob o3bobo3bo3bo32bo2bo12bobobobobo3bo3bobo3bobobobo3bo3bobobobobo5bobobob o15bobobobo12bo5bobobobobobobobobobobobobobobobobobobobobobobobobobo$o 2bo12b3ob3ob3ob3o50b2obo13bobob3obobobob3ob3ob3obobob3obobob3o11bobobo 13bob3ob3ob3ob3ob3obob3obob3ob3ob3ob3ob3obob3o10bo15b3obobobo3bob3ob3o b3ob3ob3obobob3o35bobo16b3obobobob3ob3ob3ob3obobo3bob3o32b3o13bob3obob ob3o3bobob3obobob3ob3ob3ob3ob3ob3obobobo17bobo14b3ob3obobob3obobobobob obobobobobobobob3obobobobobobobo$bo14bobobobo3bobobo50bobo14bobobo3bob obobobo3bo3bobobobo3bobo3bo12bo2bo13bo3bo3bobo5bobo3bo3bobobo3bo5bobob o3bobo3bo10b2o16bobobobo3bo3bo3bobo5bo3bobobo3bo36b2ob2o15bobobobo3bob obo3bo3bobobo3bobo32b2o16bobobobobo3bo3bobobo3bobobobobobo3bobobobobo 3bobobobo16b2ob2o13bobo3bobobobobobobobobobobobobobobobobobobobobobobo bobobo$16b3ob3ob3ob3o67bobob3obob3ob3ob3ob3ob3ob3ob3o3bo15b2o12bob3ob 3ob3ob3ob3obob3obob3ob3o3bob3o3bobo3bo11bo16bobob3o3bob3o3bob3o3bob3ob obo3bo39bobo14bobob3o3bob3o3bob3ob3o3bob3o31bob2o13bob3ob3ob3o3bobob3o b3ob3ob3ob3ob3ob3ob3ob3obo17bobo14b3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o b3obob3o$234bobo92bobo80bo2bo85bobobobo$235b2o93bo82b2o86b2o3b2o19$ 600bo5bo$600bo5bo$600b2o3b2o2$596b3o2b2ob2o2b3o$2o14b3ob3ob3obo52b2o 15b3ob3ob3ob3ob3ob3ob3obobob3ob3o17b2o12b3obob3ob3obobob3obobob3ob3ob 3ob3o23b2o15bob3ob3ob3ob3ob3ob3obob3obobobob3ob3o35b2o13b3ob3ob3obob3o b3ob3obobobob3ob3obobo26bo15b3ob3ob3ob3ob3ob3ob3obobobob3ob3obobob3ob 3ob3ob3o10b2o4b2o12bob3ob3ob3ob3ob3ob3ob3ob3ob3obob3ob3ob3ob3o23bobobo bobobo14b3o$o17bobo5bobo52bo18bobobo3bobobo3bobobobobobobobo3bo18bobo 12bobobo3bobo3bobobo3bobo3bo3bobo5bo23bo3bo12bobobobobobo5bobobo3bobo 3bobobobobo3bo36bo2bo14bobo5bobo3bobobo3bobobobobo5bobobo26b3o13bo3bo 3bo3bobobo3bobo3bobobobobobo3bobobobobo3bobo3bobo10bo3bo2bo12bobobobob o3bobobo3bobobo3bo3bobobobobobo3bo3bobobo25b2o3b2o16bobo$3bo12b3ob3o3b obo53bobo15bobobob3obobob3obobobobob3ob3ob3o16bo14b3obob3ob3ob3ob3ob3o b3ob3ob3o3bo24b4o12bobobobobob3ob3ob3ob3obo3bobob3ob3ob3o34b3o15bob3ob 3obob3ob3ob3obobobob3o3bob3o29bo12b3ob3ob3ob3ob3obobob3ob3obob3o3bobob obobob3ob3ob3o11b6o13bob3obobob3obobob3obobob3ob3ob3obob3o3bob3obobo 48bobo$2b2o14bobobo3bobo56bo14bobobobo3bobobo3bobobobo3bo3bo3bo17bo15b obobo5bo3bobobo3bo3bobo3bobo3bo40bobobobobobobo3bobobobo3bo3bobo3bo3bo bobo52bobobobo3bo3bo3bobo3bobobobobo3bo3bo26b3o13bobobobobobo3bo3bobob o3bo3bobo3bo3bobobobobo3bo3bo3bo30bobobobobo3bobobo3bobobo3bo3bobobobo bobo3bobo3bobo25b2o3b2o16bobo$16b3ob3o3bobo55b2o14bob3ob3ob3ob3ob3ob3o 3bob3ob3o14b3o14b3obob3ob3o3bob3o3bob3ob3ob3o3bo24b2o14bob3ob3ob3ob3ob 3ob3obo3bobo3bob3ob3o34b3o15bob3ob3obob3ob3ob3obobobob3o3bo3bo25bo16b 3ob3ob3ob3ob3ob3ob3o3bobob3o3bobobob3ob3ob3ob3o11b6o13bob3ob3ob3ob3ob 3ob3ob3ob3ob3obob3o3bob3ob3o23bobobobobobo14b3o$151bo81b2o92bo2bo82b3o 84bo3bo2bo88b3o2b2ob2o2b3o$328b2o86bo83b2o4b2o$413b3o184b2o3b2o$413bo 186bo5bo$600bo5bo16$609bo$608bobo3$608b3o$2b2o12bob3ob3obob3ob3o49b2o 12b3ob3ob3ob3obobob3ob3ob3ob3ob3o16b2o13bobobobobobob3ob3ob3obobob3ob 3ob3obobobob3ob3ob3o5b2o17bob3ob3ob3obobob3ob3ob3ob3o46b2o14bob3ob3ob 3ob3ob3ob3ob3o37bo18bob3ob3ob3ob3ob3ob3ob3obob3o37b2o3b2o12bob3ob3ob3o bob3ob3obob3ob3ob3obo49b3o12bobobobobob3obobob3obob3ob3ob3ob3ob3obobob ob3ob3obobobobobobob3obob3ob3obo$o2bo12bobobobo3bo3bobo50bobo12bobo3bo 3bobobobobo3bo3bobobo3bobo18bobo12bobobobobobobobo3bobobobobobobobo3bo 3bobobobobobo3bobo5bobo16bo3bo3bo3bobobobo3bobobo5bo46bo2bo12bobobobob o3bobobo3bobobo3bo36bobo17bobobobobo3bo3bobobo3bobo3bobo39bobobobo12bo bobobobobobobobobobobobobobobobobobobo50bo13bobobobobobo3bobobobobobob obobo3bo3bobobobobobo3bobobobobobobobobo3bobo3bo3bobo$2o14bob3ob3obo3b ob3o48bo14b3ob3ob3obobob3ob3ob3ob3ob3ob3o18bo12bobobob3obobobob3ob3ob 3obobob3ob3obobobobobob3ob3o7bo16bob3o3bo3bob3ob3obobob3ob3o47b3o12bob 3obobob3obobob3ob3ob3o36bo2bob2o13bob3ob3ob3ob3obobob3ob3obob3o39bobo 14bob3obobobobobobobobobobobobobobob3obo64bob3ob3ob3ob3ob3obobobobobob 3ob3obobob3obob3ob3obob3ob3obo3bobo3bo3bobo$16bobobobobobo3bobobo49bo 13bobo3bo3bobobo3bobo5bo3bo3bo3bo17bo13bobobo3bobobobobo5bo3bobobobobo 3bobobobobobobobobobo7b3o14bobo5bo3bo3bo3bobobo3bo3bo62bobobobobo3bobo bo3bobobo3bo37bobobobo12bobobo3bo3bo3bobobo3bo3bobo3bo39bobo14bobobobo bobobobobobobobobobobobobobobobo64bo3bo3bo3bo3bobobobobobobobo3bo3bobo bo3bobobo5bobo3bo3bobo3bobo3bo3bobo$16bob3ob3obo3bob3o50bo12b3ob3ob3ob 3o3bob3ob3ob3ob3ob3o14bobo14bobobo3bobob3ob3ob3o3bob3ob3ob3obobobob3ob 3ob3o10bo13bob3o3bo3bo3bob3ob3ob3ob3o47b3o12bob3ob3ob3ob3ob3ob3ob3o38b 2o3bo12bob3ob3ob3ob3ob3ob3ob3obob3o38b2ob2o13bob3ob3ob3obob3ob3obob3ob 3ob3obo50bo13bo3bo3bob3o3bob3obob3ob3ob3ob3ob3o3bobob3ob3obo3bo3bobo3b obo3bo3bobo$84b2o65b2o81bobo91bo2bo81b3o87bobo102b3o$235bo92b2o83bo89b obo102b3o$501bobobobo$501b2o3b2o$608bobo$609bo20$2b2o12b3obobobob3ob3o b3ob3ob3ob3obobobobo27bo13bobobobob3ob3o38b2ob2o12b3ob3obob3ob3ob3ob3o b3ob3ob3ob3ob3obo18b2o14b3ob3ob3obobobobob3ob3ob3ob3ob3ob3ob3obob3ob3o bobob3ob3o8bo3b2o12bobob3ob3ob3obob3ob3ob3ob3ob3ob3ob3ob3obobo17b2o13b obobobob3ob3ob3ob3ob3ob3ob3obobobo30bobobobo13b3ob3ob3obob3ob3ob3ob3ob obobobo41bobo22bob3ob3ob3ob3ob3ob3ob3ob3ob3obobob3ob3ob3ob3ob3ob3ob3ob 3ob3ob3ob3ob3obobob3ob3obob3o$2bo15bobobobobobobo5bobo3bo5bobobobobo 26bobo12bobobobo3bobo41bobo15bo3bobo3bo3bobobobo3bo5bobobobo3bobobo17b o2bo15bobobobo3bobobobo3bo3bo3bo3bo3bobobobobobo3bobo3bobobobobobo7bob obobo12bobo3bobobo3bobo3bobobo3bobobo3bobobobo3bobobobo16bo2bo12bobobo bobobobobobobobobobobo3bo3bobobobo29bob2ob2obo14bobobo3bobobobobobobob o3bobobobobo39bo3bo22bobobobobo3bo3bobo5bo3bo3bobo3bobo3bobobobo3bo3bo 3bo3bo5bobo3bo3bo3bo3bobo3bobo3bobobo$3bo12b3ob3obob3ob3o3bob3ob3ob3ob obob3o25bobo13b3ob3o3bob3o39bo2bo12b3ob3obo3bob3ob3ob3ob3o3bobobob3ob 3obo18b2obo14bob3ob3obob3obob3ob3ob3ob3ob3obobob3obob3ob3ob3obobob3o7b obobo14bobob3obobob3obo3bob3o3bobobob3obobob3ob3ob3o15bo2bo13b3obobobo bobobob3obobobobob3ob3obobobo29bo7bo14bobobob3obobobobobobobob3obobob 3o32b2o5bo26bob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o3bobobob3ob3ob3ob3ob3ob3ob 3ob3ob3ob3ob3o3bob3obob3o$2b2o14bo3bobo3bo3bo3bobobo3bobo3bobo3bo24bob o16bo3bo3bobobo40b2o15bo3bobo3bobo3bobobobo3bo3bobobobobobobobo21bo14b o3bobobobo3bobobo3bo5bo3bo3bobobobobobobo5bo3bobobobobo8b2ob2o13bobo3b obobobo3bo3bo3bo3bobobobo3bobobobo3bo3bo15b3o16bobobobobobobobobobobob obo3bo3bobobobo30b7o15bobobo3bobobobobobobobo3bobobo3bo32b2o4bo4bo8b2o 12bo3bobobo3bobo3bobo3bobo3bo5bo3bo3bobobobobobobobobobobobobobo3bobob obobobobobo3bo3bobobobobobo$16b3o3bobob3ob3o3bob3ob3ob3obobo3bo24b2o 17bo3bo3bob3o55b3ob3obo3bob3ob3ob3ob3o3bob3ob3ob3obo18b3o15bob3ob3obo 3bobob3ob3ob3ob3ob3ob3ob3obob3ob3o3bob3ob3o26bobob3ob3ob3obo3bob3o3bob 3ob3ob3ob3ob3o3bo34bobobob3ob3ob3ob3ob3ob3ob3obobobo52bob3ob3obob3ob3o b3ob3obobo3bo39bo12b2o12bob3ob3ob3ob3ob3ob3ob3ob3ob3o3bo3bob3ob3ob3ob 3ob3ob3ob3ob3ob3ob3ob3o3bo3bob3obob3o$233bo178b3o85b7o89bo3bo$412bo2bo 83bo7bo90bobo$413bo2bo82bob2ob2obo$414b2o84bobobobo20$582b2o2b2o4bo2b 2o12b2o$582b2ob2o6b2obo12b2o$2bo13b3ob3o59bo15b3obobob3ob3ob3obo35bo 13b3ob3obob3obobobob3obobobo38b2o12bob3ob3ob3ob3ob3ob3ob3ob3obobob3ob 3obobob3ob3ob3obobobob3o9b2o13b3ob3obobobob3ob3obob3obobob3ob3obobobob ob3o14bo19b3ob3ob3ob3obob3ob3obob3ob3ob3ob3o114bobo6bo27b3ob3ob3ob3ob 3obobob3ob3ob3obob3o$bobo12bo3bobo59b3o15bobobobobobo3bobobo34bobo14bo bo3bo3bobobobo3bobobobo36bo2bo12bobo3bo5bobo3bobobo3bo3bo3bobobo5bobob obobobo3bo3bobobobobo5b2obo2bo12bo3bobobobobo3bo3bobobo3bobo3bo3bobobo bobo3bo13bobo18bo3bo3bobobobobobobobo3bobobobo3bobobobo115b2o4b3o29bob obo3bo3bobobobobo3bo3bo3bobobobo$o2bo12b3obobo62bo12b3ob3ob3ob3ob3obo 33bo2bo14bob3obob3obob3o3bobob3o35bob2o13bob3ob3ob3ob3ob3ob3ob3ob3ob3o b3o3bobobobobob3ob3obob3ob3o6bobo2bo12b3obobob3obob3ob3obob3ob3ob3ob3o bobob3o3bo13bo2bob2o14b3ob3ob3obobobob3ob3obobobob3ob3ob3o151b3ob3o3bo b3obobobobob3ob3ob3obobobo$b2o13bobobobo59b3o13bo5bo3bobobobobobo33bob o15bobobobo3bobo3bo3bobo3bo35bo16bobobobobo3bo3bo3bobobobobobobo3bobob o3bobobobobobobobobobo3bobobo6bo2b2o13bobobobo3bobobo5bobo3bo3bobo5bob obo3bo3bo14bobobobo13bobobobo3bobobobo3bobobobobobobobo3bo3bo115b2o4b 3o29bo3bo3bo3bobobobobo3bo3bo3bobobobo$16b3ob3o59bo15b3o3bob3ob3ob3obo 32b2ob2o14bob3obob3obo3bo3bobo3bo36b3o13bob3ob3ob3ob3ob3ob3ob3ob3o3bob 3o3bobobob3ob3ob3obo3bob3o5b2o17b3ob3o3bobob3ob3obob3o3bob3ob3obobo3bo 3bo15b2obo2bo12b3ob3ob3ob3obob3ob3obob3ob3ob3ob3o114bobo6bo27b3ob3o3bo b3ob3obobob3ob3ob3obob3o$235bo178bobo168b2o6b2obo12b2o$415bo170b2o4bo 2b2o12b2o22$582b2o2b2o4bo2b2o12b2o$582b2ob2o6b2obo12b2o$2b2o12b3ob3ob 3o54b2o15bob3ob3obob3obob3ob3o31b2o12bob3ob3ob3ob3ob3ob3ob3obobobob3ob obo23b2o13b3ob3ob3ob3ob3ob3obobobob3ob3obo42b2o12bobobobob3obobob3obob ob3ob3ob3obobobob3ob3obo17b2ob2o12bobobob3ob3ob3ob3ob3obob3ob3o122bobo 6bo27b3ob3obobob3obob3ob3obobob3ob3ob3obob3o$bobo12bo3bobo3bo55bo15bob obobobobobobobo3bobobo32bo12bobobobo3bobo3bobobobo3bobobobobobo3bobo 23bobo14bobobobobo3bo3bobo3bobobobo3bobobo38b2obobo12bobobobo3bobobo3b obobobo5bo3bobobobobobo3bobo17bo3bo12bobobobobobobo3bobobo3bobo3bo3bo 123b2o4b3o29bo3bobobobobobo3bobobobobo3bo3bo3bobobobo$obo13b3ob3o3bo 55bobo13bob3obobobob3obob3ob3o29b3o13bob3ob3ob3o3bobobob3obobobobobob 3ob3o25bo12b3ob3ob3ob3ob3ob3ob3obob3ob3obo38b2obo14bob3obob3ob3o3bob3o b3o3bob3ob3obob3o3bobo18b3o13b3obobobob3ob3obobob3obob3ob3o159b3ob3obo bobobobob3obobobobob3ob3ob3obobobo$bo16bobobo3bo56bobo12bobobobobobo3b obo3bobobo29bo15bobobo3bobobo3bobobo3bobobobobobobobo3bo21b4o15bobobo 3bobo5bo3bo3bobobobobobobo41bo14bo3bobobo5bo3bo3bo3bo3bo3bo3bobobobo3b obo36bobobobobobo3bobobo3bobo3bobo125b2o4b3o29bo3bobobobobobo3bobobobo bo3bo3bo3bobobobo$16b3ob3o3bo57b2o12bob3ob3obob3obob3ob3o27bobo15bob3o b3ob3o3bob3ob3ob3obobobob3o3bo21bo16b3ob3ob3ob3ob3ob3o3bobob3ob3obo41b obo12bo3bobob3o3bo3bo3bob3o3bob3o3bobob3o3bobo18b3o15bobob3ob3ob3ob3ob 3obob3ob3o122bobo6bo27b3ob3obobob3obob3ob3obobob3ob3ob3obob3o$150b2o 81bo96b2o80bo3bo165b2ob2o6b2obo12b2o$232b2o178b2ob2o165b2o2b2o4bo2b2o 12b2o24$o15bob3ob3obobob3ob3ob3o44bo12bob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o 11b2o2b2o12b3obob3ob3ob3ob3ob3obob3ob3obo30bo13b3ob3ob3ob3ob3ob3obob3o bobob3ob3obo37b2o13bobobob3obob3ob3ob3obobob3obobob3obob3ob3obo15b2o 17b3ob3ob3ob3ob3ob3obob3ob3obo$3o13bobobobobobobobo3bo5bo42b3o12bobobo 3bo3bo3bobobo3bobo3bo3bobo3bo11bobo2bo14bobobo3bobobobobobo3bobobobo3b obo29bobo14bo3bo3bo3bobobobo3bo3bobobobo3bobobo36bo2bo12bobobobobobo3b o3bobo3bobobo3bobo3bobobobobo3bo15bobo16bo3bo3bobo3bobobobo3bobobo3bob o$3bo12bobobob3ob3ob3ob3o3bo41bo15bob3ob3ob3ob3obobo3bob3ob3obobob3o 13bobo13b3obob3ob3obobob3o3bobobobob3obo28bo2bo12b3o3bo3bob3obobob3obo 3bob3ob3ob3obo36b4o12b3obobobobo3bob3ob3ob3ob3ob3ob3obob3ob3obo17bo2b 2o12b3ob3ob3o3bob3ob3obob3o3bobo$2b2o12bobobobobo3bo3bo3bo3bo40bobo14b o3bo3bo3bo3bobobo3bobobo3bobobo3bo13b2o14bo3bo3bo3bobobo3bo3bobobobo3b obo27bob2o13bo5bo3bo3bobobo3bobo3bo3bobobobobobo54bobobobobo3bo3bobobo 3bo3bo3bobo3bo3bobobobo15bobobobo12bobo3bobobo3bo3bobobobo3bo3bobo$16b ob3ob3o3bob3ob3o3bo41b2o14bob3ob3ob3ob3ob3o3bob3ob3ob3ob3o29b3obob3ob 3ob3ob3o3bobob3ob3obo26bobo15b3o3bo3bob3ob3ob3obo3bo3bob3ob3obo36b2o 16bobob3obo3bob3ob3o3bob3o3bob3obob3ob3obo15b2o2bo14b3ob3ob3o3bob3ob3o bob3o3bobo$231bobo93bo2bo83bobo$232bo95b2o85b2o24$b2o13b3ob3ob3ob3ob3o b3ob3ob3obobob3obobobob3ob3obobobo6bo16bob3ob3ob3obobob3ob3ob3ob3ob3ob obobobo11b2o12bobobob3obobob3ob3ob3ob3ob3ob3ob3ob3o22bo13b3ob3obob3ob 3o60b2o2b2o12bobobob3obobobobob3ob3ob3ob3ob3ob3ob3ob3obo20bo13bob3ob3o b3obobob3ob3obob3obobobo$bo14bo3bobobo3bo5bo3bobobo3bobobo3bobobobo3bo bo3bobobo5bobo15bobo3bobobobobobo3bobo3bobobobobobobobobobo10bobo12bob obo3bobobo3bo3bobo5bo3bobobo3bo3bo21bobo14bobo3bobobobobo60bobo2bo12bo bobobo3bobobobo3bobobobobo3bobobobobobo3bobobo19bobo12bo3bobo3bo3bobo 3bo3bobo3bobobobo$2bo13b3obobob3ob3ob3o3bobobob3ob3o3bob3obob3ob3obob 3o6bo2b2o12bob3ob3ob3ob3ob3ob3ob3ob3obobobobob3o10bo14bob3o3bob3ob3ob 3ob3ob3ob3obobob3ob3o20bo2bo14bob3obobobob3o62b2o14bob3ob3ob3ob3ob3obo bob3ob3ob3ob3ob3ob3obo18bo2bo12bob3ob3ob3ob3ob3o3bobo3bobob3o$3bo12bob obobobobo3bobo5bobobobo5bo3bo3bobo3bobobobo3bo7b2obo12bo3bo3bo3bo3bo3b o3bo3bo3bobobobobo3bo9b2o14bo3bo3bo3bo3bobo5bo3bobo3bobobo5bo19bob2o 15bobobobobobo3bo62bo15bo3bobobo3bo3bo3bobobo3bobo3bobobobobobobobobo 14b2o2bobo13bo3bo3bo3bo3bobo5bobo3bobo3bo$2b2o12b3ob3ob3ob3ob3o3bob3ob 3o3bo3bo3bobob3ob3obo3bo23bob3ob3ob3o3bob3ob3ob3ob3ob3obobo3bo9bo15bo 3bo3bo3bob3ob3ob3ob3ob3ob3ob3ob3o18bobo17bob3obob3ob3o60bobo15bo3bob3o 3bo3bob3ob3ob3ob3ob3ob3ob3ob3obo14bobob2o14bob3ob3ob3o3bob3o3bobo3bobo 3bo$153bo76bo2bo92b2o83bo$152b2o77b2o176bobo$409b2o!golly-3.3-src/Patterns/Life/Syntheses/make-p18.rle0000644000175000017500000000171612026730263016714 00000000000000#C Glider synthesis of p18 oscillator. #C Mark Niemiec, 10/2002; pattern from Jason Summers' "jslife" archive x = 229, y = 229, rule = B3/S23 207bo$207bobo$207boo$9bo$10boo$9boo4$3bobo$4boo$4bo8$227bo$226bo$226b 3o28$36bo$37boo$36boo$$39bo$40boo$39boo3$53bo$54boo$53boo5$142bo$45bo 95bo$43bobo95b3o$44boo4$52bo$53boo$52boo16$104bobo$105boo$105bo$96bobo $97boo$92bo4bo$93bo$91b3o17$102b3o$104bo$103bo6$137boo$136boo$113boo 23bo$112bobo$114bo3$96boo$95bobo$97bo5$140boo$91b3o45boo$93bo47bo$92bo $$137boo$137bobo$68b3o66bo$70bo$69bo$$146bo$145boo$145bobo$150boo$150b obo$150bo$87boo$86bobo68b3o$88bo68bo$81b3o74bo$83bo$82bo$$147bo$146boo $45bo100bobo$45boo$44bobo7$165boo$46b3o115boo$48bo117bo$47bo$$162boo$ 162bobo$27b3o132bo$29bo$28bo$$176boo$45b3o127boo$47bo129bo$46bo$$173b oo$173bobo$173bo11$196bo$182bo12boo$181boo12bobo$181bobo4$3o36boo$bbo 37boo143b3o$bo37bo145bo$186bo11bo$197boo$197bobo5$224bo$223boo$29boo 192bobo$28bobo$30bo$$218boo$217boo$219bo$20boo$19bobo$21bo! golly-3.3-src/Patterns/Life/Syntheses/make-osc-p4.rle0000644000175000017500000001752412026730263017415 00000000000000#C Some glider syntheses of p4 oscillators: #C 4-1. unnamed p4, Noam Elkies and Mark Niemiec, 4/00 #C 4-2. Jason Summers, 8/04 #C 4-3. JS, 8/04 #C 4-4. JS, 9/04 #C 4-5. JS with MDN, 8/04 #C 4-6. JS/MDN, 8/04 (same as 4-2, with a different stator) #C 4-7. JS with MDN, 8/04 #C 4-8. JS, 8/04 #C 4-9. JS, 10/04 #C 4-10. JS, 8/04 #C Pattern from Jason Summers' "jslife" archive. x = 331, y = 345, rule = B3/S23 213bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbo3$213bo67bo15bo$229bo3bo7bobobo33boo$280boo$213bo7b obo5bo3bo7bo55bo$222boo$222bo6bobobobbobobbobobo46bo$213bo76boo5bo$ 233bo11bo45boo$$213bo19bo7bobobo51bo3$213bo83bo$$216bobo$213bo3boo78bo $217bo$254bobo$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbo41boo40bo$255bo$268bobo$o53bo50bo77bo29bo26bo27b oo27bo$4bo3bo7bo41bo3bo7bobobo47bo3bo7bobobo48bo3bo7bo3bo37boo13bobo 10bo$240boo14boo$o3bo3bo7bo37bo3bo3bo11bo30bo16bo3bo11bo44bo3bo3bo7bo 3bo9bo43bo14bobo22bo$111bo67bo56bo17bo17boo$4bobobobbobobbo41bobobobbo bobbobobo37bo9bobobobbobobbobobo39bo8bobobobbobobbobobo33boo13boo11bob o5bo$o53bo50bo4b3o65b3obbo29bo22boo15boo10boo30bo$8bo7bo45bo7bo55bo11b o52bo11bo38bo23bo$45bo197boo$o7bo7bo27bo9bo7bo7bobobo30bo20bo7bobobo 44bo7bo11bo9bo28boo53bo$44b3o$14bo26bo79bo47bo$o14bo23boo13bo27bo22bo 13bobo47bobo11bo29bo83bo$5bo7b3o24boo41bo36boo47boo$3bobo40bo29bo4b3o$ o3boo39bo8bo22bo27bo77bo29bo55bo27bo$45b3o27b3o13bo146bo29boo$90bo148b oo27bobo7bo$o40bo12bo15bo19b3o12bo77bo29bo19boo3boo36boo19bo$40bo30bo 162boo36boo3boo$23bo16b3o26b3o69bo44bo46bo7bobo27boo$o23boo9bo18bo26bo 23bo31bo4boo39bo3boo10bo13bo28boo29bo23bo$23boo10bobo8bo16bo15bobo53bo bo3boo43boo11bobo40bo$35boo8bo15bobo16boo54boo61boo$o44b3o6bo7boo7bo 22bo10bo23bo53bo23bo5bo83bo$72bo15bo5bobo33boo27bobo43boo$28bo41b3o15b obo3boo33boo28boo31bo3bobo7boo$o26bo5bo20bo33boo15bo54bo22bo9bo3boo14b o83bo$27b3o3bobo155b3o3bo70boo$33boo100bo131boo$o41bo11bo43bo6bo27bobo 47bo29bo31bo23bo27bo$42bobo13boo38bobo33boo109boo10boo15boo$42boo13bob o38boo106b3o29bo5bobo11boo13boo$o10boo41bo4bo6b3o36bo54bo22bo22bo6bo 24boo17bo17bo21bo$10bobo55bo23bo36boo28boo46bo29bobo14bo$12bo54bo23bo 38boo27bobo92boo14boo$o19boo32bo36b3o6bo4bo23bo9boo14bo27bo29bo28bo10b obo13boo26bo$19bobo3b3o32boo38bobo35bobo13bo87boo27bo$21bo5bo31bobo38b oo38bo13b3o50b3o31bobo$o25bo27bo6bo43bo77bo23bo5bo42bo40bo$190boo16bo 46boo$7b3o179bobo63bobo$o8bo8boo34bo15boo33bo43b3o31bo7bo21bo80bobbo$ 8bo8bobo10boo32boo3bobo15b3o59bo143boo$19bo9boo32bobo5bo15bo62bo142bob o$o11b3o16bo22bo10bo22bo7boo7bo77bo29bo83bo$14bo63boo16bobo$13bo64bobo 15bo23boo47boo$o53bo23bo26bo13bobo47bobo11bo29bo83bo$7b3o78b3o30bo47bo $9bo39boo37bo67bo$o7bo40bobobbo12b3o19bo15bo49boo26bo29bo5boo76bo$13b oo24b3o7bo19bo85bobo62boo$14boo23bo28bo13b3o134bo69bo$o12bo26bo13bo27b o22bo4b3o65b3obbo29bo74boo7bo$8b3o65b3o4bo28bo46b3o16bo109bobo$10bo65b o34bo47bo19bo50boo$o8bo44bo22bo27bo54bo22bo29bo17boo64bo$230bo$$obbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbo4$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbo3$o110bo90bo31bo95bo$4bo3bo7bobobo107bo3bo7bobobo57bobo33bo3bo7bobo bo$202boo$o3bo3bo7bo94bo16bo3bo11bo89bo3bo3bo7bo3bo75bo$$4bobobobbobo bbobobo107bobobobbobo6bo76bo16bobobobbobobbobobo$o110bo109bobo10bo95bo $8bo7bo3bo48bo62bo11bo76boo19bo7bo3bo$69bobo48bo204bo$o7bo7bobobo48boo 40bo9bo10bo11bo59bo29bo7bo7bobobo70bobobbo$119b3o82bobo4bo113boo$43bo 160boo3boo98bo$o43boo65bo98boo22bo74bobo18bo$43boo264boo$$o110bo122bo 95bo3$o110bo122bo95bo$$124bobo$o110bo13boo107bo95bo$125bo$$o110bo122bo 95bo$124bo$68bo56bo$o67bobo40bo3bo7b3o108bo95bo$68boo46bo$114b3o$o110b o122bo95bo3$o72boo36bo122bo95bo$73bobo133bo43bobo22bobo$73bo133boo45b oo22boo$o110bo96boo24bo19bo24bo50bo$$277bo$o110bo122bo41bo53bo$30bo 245b3o$29bo$o28b3o79bo82bo5bo33bo95bo$194bobobbo$4bo189boo3b3o$o4bo17b o87bo122bo95bo$3b3o18bo157bobo$22b3o77bobo77boo$o101boo7bo46bobo22bo 50bo95bo$103bo55boo92bobo24bo12bo$159bo12bobo79boo23bo13bobo$o110bo60b oo60bo10bobo6bo24b3obbobo6boo35bo$68bobo102bo72boo36boo$68boo176bo29b 3o6bo$o49b3obboo12bo41bo122bo41bo53bo$52boboo129boo64bo25bo$51bo4bo 117b3o7boo65boo$o110bo62bo11bo47bo15bobo77bo$175bo$$o110bo60boo60bo95b o$173boo81bo$172bo84bo18b3o$o54bo4bo50bo122bo20b3o18bo53bo$56boobo217b o$42bo12boobb3o$o41boo67bo47boo73bo95bo$41bobo116boo$159bo121bobo$o 110bo122bo46boo47bo$8bo146b3o98bo25bo$8boo147bo99bo$o6bobo77b3o21bo44b o17boo58bo13bo6b3o29bo42bo$87bo18b3o65bobo71boo36boo$88bo17bo67bo64boo 6bobobb3o24bo6bobo$o106bo3bo122bo3bobo13bo23boo50bo$240bo12bo24bobo$ 80b3o$o81bo28bo81b3o38bo95bo$81bo66boo34bo8bo$149boo32boo9bo$o110bo36b o34bobo48bo95bo3$o37bo72bo122bo95bo$36bobo216b3o$37boo218bo$o110bo85b oo35bo21bo73bo$197bobo29b3o$197bo31bo24bo24bo$o110bo108b3o7bo3bo19boo 22boo50bo$42boo168boo6bo32bobo22bobo$41bobo167boo8bo$o42bo67bo101bo20b o95bo$$220bo$o110bo95b3o9boo13bo95bo$207bo11bobo$208bo78b3o$o110bo122b o52bo42bo$288bo$$o110bo122bo95bo3$o110bo22boo98bo95bo$67boo66boo3boo$ 66boo66bo4bobo82b3o$o67bo42bo29bo82bo9bo95bo$225bo$41boo80boo$o39bobo 68bo10bobo109bo95bo$42bo81bo192bo$297boo17boo$o110bo122bo61boo18bobo 11bo$142boo154bo$141bobo$o110bo31bo90bo95bo3$obbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbo4$obbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o74bo152bo$5bo 3bo7bobobo84bo3bo8bo3bobobo58bobo$186boo$o4bo3bo7bo3bo53bo30bo3bo8bo3b o3bo59bo40bo$$5bobobobbobobbobobo36bo47bobobobbobo3bo3bo3bo27bo$o57bob o14bo77bobo72bo$9bo11bo36boo40bobo7bo8bo3bo3bo26boo$101boo$o8bo7bobobo 29bo23bo15bo9bo8bo8bo3bobobo100bo$49boo9bo31bo84bo$50boo6boo30b3o83bo 45bobo$o5bo52boo14bo100b3o43boo4bo$7boo92bo121bo$6boo55bobo36boo$o62b oo10bo25boo125bo$64bo$28bobo66bo$o28boo44bo22boo128bo$29bo67boo$$o63bo 10bo152bo$12bo51bobo144bo$13bo50boo143boo$o10b3o45bobo13bo134boo16bo$ 29bo29boo$30bo29bo143bobo$o27b3o44bo128boo22bo$205bo$$o74bo126bo25bo$ 200boo$201boo$o74bo115bo36bo$190boo$190bobo$o74bo152bo3$o74bo152bo3$o 74bo152bo3$o74bo152bo$155bo$155bobo$o74bo79boo15bo55bo$35boo134bo$35bo bo133b3o$o34bo39bo152bo$41bo$40boo109bobo$o39bobo7boo23bo75boo75bo$50b obo99bo$50bo91b3o$o20boo52bo68bo14bo68bo$20bobo120bo13boo$22bo135boo$o 74bo152bo3$o74bo152bo$144boo$145boo13bo$o74bo68bo14bo68bo$159b3o$151bo $o74bo75boo75bo$150bobo$$o74bo152bo$130b3o$132bo$o74bo55bo15boo79bo$ 146bobo$3boo64boo77bo$o3boo62boo5bo152bo$3bo66bo$$o74bo152bo3$obbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo 152bo3$75bo152bo$111bobo$112boo$75bo36bo115bo$101boo$102boo$75bo25bo 126bo$$98bo$75bo22boo128bo$97bobo$$75bo16boo134bo$93boo$92bo$75bo152bo $$205boo$75bo128boo22bo$206bo$$75bo125boo25bo$200boo$80bo121bo$75bo4b oo43b3o100bo$79bobo45bo83b3o$126bo84bo$75bo126bo9bo15bo$201boo$148boo 51bobo$75bo72bobo77bo$148bo$$75bo40bo111bo$116boo$115bobo$75bo152bo3$ 75bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbo! golly-3.3-src/Patterns/Life/Puffers/0000755000175000017500000000000013543257426014377 500000000000000golly-3.3-src/Patterns/Life/Puffers/p100-H-track-puffer.rle0000644000175000017500000002413512026730263020252 00000000000000#C p100 puffer laying down Herschel tracks -- pairs of Fx77 conduits. #C A single Herschel follows the track, producing gliders. #C Paul Callahan, 14 November 1996; glider recipe by Dean Hickerson. #C [See also p100-H-channel-breeder.rle, in the Breeders folder; this #C puffer could easily be made into a breeder by adding a Herschel #C factory of any desired period to the end of the Herschel track.] x = 1330, y = 247, rule = B3/S23 735b5o$734bo4bo$739bo$734bo3bo$736bo9$69b5o$68bo4bo$73bo$68bo3bo$70bo 2$788b3o$787b5o$787b3ob2o$719bo70b2o$720bo$716bo4bo$719b3o$716b2o4bo 44bo63b2o$718bo3bo43b3o58b4ob2o6b2o$65bo652bo47bo2bo57b6o5b2ob2o$66bo 652b3o46b2o58b4o6b4o$64b3o702b5o15b2o36bo11b2o$771bobo15b2o8b3o25bo$ 122b3o645bo37bo$66bo54b5o642bobo36bobo7bo9b2o7b3o$65bobo53b3ob2o638bob obob2o5b2o27bobo10b2o2b2ob2o5bo3b2o$64b2ob2o55b2o639bo3bob2o5b5o11b2o 12bo7b2o2b3o2bob5o2bobo2b2o$64b2ob2o696b2obo11b2obo10b2o20b2o8bo2b3obo 5bo$63bo3bo711bo2b4o29b2o4bo8bo3bo2b2o$63bo2b3o710bo2b2ob2o30bo3bo12bo $64b2o3bo95b2o650bob3o14bo$65b4o92b4ob2o6b2o603bo2b2o34bob2o$67b2o49bo 26b3obo11b6o5b2ob2o601bo3b2o34b3o19b2o$112b2o4bo25b6o12b4o6b4o603bo2b 2o35bo18b2ob2o$59bobobo19b2o26bo2bo3bo14b2o8bob2ob2o11bo11b2o605b2o3b 2o51b4o$58bo3bobo18b2o25b2ob2o9bo8b2o9bo16bo622bo2bo51b2o$57bo3b2o2bo 45bobo9bo661b2o$58bobo2bobo46bo10bobo19bobobob2obo6b2o7b3o$66bo57bo18b 4o2bo4b2o2b2ob2o5bo3b2o691b2o$63bo2bo11b3ob3o3b2o35b3o10b2o3b3obo7bo3b ob5o2bobo2b2o556bo88b2o40b3ob2o$63bobo11b4obo2bo2b2o36bobo9b2o13b3o4bo 2b3obo5bo555bobo63b5o18b2ob2o39b5o66b2o$64bo11bobo39bobo5bobo26bo8bo3b o2b2o557b2o62bo4bo18b4o35b2o4b3o35b2o26b4ob2o6b2o$85bo30b3o31bo3bo13bo 630bo19b2o33b3ob2o40bo2bo25b6o5b2ob2o$78b3o36b2o2b2o3b3o22bo2bo15bo 434b5o184bo3bo55b5o35b2o5b2o27b4o6b4o$79b2o2b2o32b2o7b2ob2o473bo4bo20b 2o164bo58b3o13b2o17bo3b2o33bo11b2o$122bo3b2o46b2o433bo19bo2bo39b6o193b 2o8b3o6bo7bo16b2o3bo8bo$118bob2o4b2o44b2ob2o420b5o2bo3bo21bobo38bo5bo 5b4o201bo9bo17bo4b2o$70bo49b2o6bo43b4o420bo4bo4bo24bo45bo4bo3bo174b2o 25b3o30bobo5b2o7b3o$68bobo54bo2bo44b2o426bo8bo55bo4bo4bo9bo174b2o24bo 2bo9bo11b3ob2obo2b3ob2ob2o5bo3b2o$69b2o55bobo254b5o208bo3bo8bobo19bo 17b2o14b3o5b2o7bo2bo140b2o48b2o9b2o9b2o12bo2bo4bo6bob5o2bobo2b2o$382bo 4bo210bo10bobo5b2o10b2obo16b2o13b2o2b2o156b2o48b2o22bo11b5o5b2o4bo2b3o bo5bo$387bo62b6o172bob2o6b2o19b2o3b5o2bo8b2o215bo19b2o3b2o8bo3bo2b2o 282b3o$154b2o219b5o2bo3bo36b2o24bo5bo5b4o151b2o12bo7b2o20b3o3bo5bo6b5o 213bo22bo2bo12bo285b5o$129b5o18b2ob2o217bo4bo4bo37bo2bo16bo12bo4bo3bo 164bo32b2obo5bo7bo4bo153bobo57b2obo18b3o15bo283b3ob2o62b4o$128bo4bo18b 4o223bo36b2o5b2o16bo7bo4bo9bo139b2o22b2o3bo9b2o9b2o6bobo14b3o2bo130b2o 21b2o61b2o312b3o7b2o62b6o6b2o$133bo19b2o219bo3bo14b2o9bo7bo3b2o23bo9b 2o7bo2bo140b2o22b2o3bo3b3o3b2o9b2o7b2o2b2obo9bo2b2o127b3ob2o21bo102b2o 123b5o142b5o35b2o33b4ob2o4b4o$128bo3bo243bo16b2o9bo6bobo6bo19b3o186bo 7b3o29bobo9b2o129b5o123b2ob2o121bo4bo18b2o122b3ob2o22b2o9bo2bo36b2o5b 2ob2o$130bo273bo5bobo6bobo15b7o7bo178bo6bo5bo169b3o124b4o127bo17bo2bo 41b6o77b2o5bo14b2o13b2o46b2o$383b2o35b2o14bo2bo3b3o4b2o8b2o170bo5b2o2b obo296b2o116b5o2bo3bo21b2o39bo5bo5b4o75b2o12b2o2b3o9bo19b2o$383b2o24bo bo2bo20bo3bo9bo9bo2bo92b5o70b2o2b2o2b2o2bo415bo4bo4bo23b2o31b2o12bo4bo 3bo75b2o8b3o2bo3b2o8b2o19b2o9bo$348b2o48b2o9b2o2bo8b3o10b2ob2ob2o3bo3b 5o4bo2bo91bo4bo69b2obob2o47b4o376bo27b3o30b2o7bo4bo9bo64b2o25bo2b2o7bo bo30bo2bo$348b2o48b2o14bo6b4o10b2o4b2o8b4o3b2ob2o96bo69b4obo8bo2bo35bo 3bo371bo3bo28b3o15b2o12bobob3o5b2o7bo2bo94bo11bo8bobo19bo6b2o$420b2o2b 2o11bo3b2ob2o8bo4b2o93bo3bo68bobo2b2o9b2obo39bo198b2o35b2o136bo27b6o 15b2o9b8o2bo131bo2bo26bo7b2o$361bo59bob2o18bo112bo70bobo15bo36bo2bo 195b4ob2o32b2ob2o164bo2bo5b2o19bobo3b4obo12bo35b2o48b2o8b2o14b2o4bo4bo 4b2ob3o2b2o4bo6bo2bo5b2o$361bobo58b3o281bo174b6o33b4o166b2o5bobo21bobo b2ob3o7bo3bo2bo33b2o48b2o8b2o12b4o3bo5b2o2b3ob3o2b2o4bobo5b3o4b2o$333b 5o23b2o60bo135bo144bobo175b4o35b2o173b3o22b3ob2o10b2o7bo106bo3bo3bo2bo bobo3bo2bo10bo8b2o3bo$332bo4bo123b4o94bobo143b2o357b2o31b2o4b2o9b2o5b 6o2bo8b2o6bo105b2ob2o6b2o3bo4bobo$337bo122bo3bo94b2o63b6o33b4o397b2o 24bo5b2o3b2ob2o8b2o12bobo8b2o4b2o26b3o76b2o2bo6bo3b2o3b3o$332bo3bo127b o158bo5bo32bo3bo429bo4b2ob2o22bobo13bo27b5o90bo5bo27b2o$334bo125bo2bo 165bo36bo8bo424b2o2b2o23bo11b2o29b3ob2o122b4o$623bo4bo33bo2bo7bo3bo 418b2ob4obo70b2o12bo63bobo44b2ob2o$625b2o51bo338b5o71bo3b3o2bobo82b2o 64b2o47b2o$45bo627bo4bo337bo4bo68bo7bo5bo40b4o39b2o$43bobo356b6o33b4o 229b5o342bo72bo8b3o38bo3bo$44b2o355bo5bo32bo3bo571bo3bo72b2o8bo44bo$ 407bo36bo573bo84b3o38bo2bo94b4o35b2o$401bo4bo33bo2bo660b2o135b6o33b4o$ 403b2o836b4ob2o32b2ob2o$763bobo252bo226b2o35b2o$763b2o253bobo65b6o33b 4o$764bo253b2o65bo5bo32bo3bo$1091bo36bo$1085bo4bo33bo2bo$1087b2o5$286b o$286bobo392bo$286b2o196bo194bobo$484bobo193b2o$484b2o3$1114bo$1112b2o $20bo1092b2o$18bobo$19b2o22bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo$41b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o$40bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo$40b2o48b2o 48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o$688bobo252bo$ 688b2o253bobo$689bo253b2o$o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49b o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo$3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o$3bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo49bo$2b2o11b2o35b2o11b2o35b2o11b2o35b2o11b2o 35b2o11b2o35b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o 48b2o48b2o48b2o48b2o48b2o$15b2o48b2o48b2o48b2o48b2o$684b2o$684bobo$ 684bo2$409bo$bo407bobo$bobo405b2o$b3o$3bo23b2o48b2o48b2o48b2o48b2o48b 2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o$28bo49b o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo236b 2o$25b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o237bobo$25bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo49bo49bo49bo239bo$414bo$413b2o$413bobo$15b2o 48b2o48b2o48b2o48b2o48b2o48b2o48b2o$15bo49bo49bo49bo49bo49bo49bo49bo$ 16b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o$18bo49bo49bo49bo49bo25b2o22bo 49bo49bo$243bobo$245bo3$941b2o$940b2o$759b2o181bo$405b2o352bobo$61b2o 341bobo352bo$61bobo342bo$61bo5$1190b2o76b2o$1190bobo73bo4bo33bo2bo$ 1190bo81bo36bo$489bo776bo5bo32bo3bo$488b2o777b6o33b4o$488bobo573b2o35b 2o$178b2o880b4ob2o32b2ob2o$176bo4bo33bo2bo841b6o33b4o$182bo36bo841b4o 35b2o97bo77b2o46bo2bo$176bo5bo32bo3bo49b2o926bo3bo69bo5b4o48bo$177b6o 33b4o48bobo678b5o248bo67bobo3bob4o43bo3bo$270bo677bo4bo243bo4bo68bob2o b2o3b2o43b4o$900b2o51bo167b2o75b5o68bobob3o$898bo4bo33bo2bo7bo3bo41b2o 123b2ob2o143bob2o2b4o$109bo125bo2bo665bo36bo8bo40b3ob2o19b2o61bo39b4o 145b2ob2o34b2o6b2o$107bo3bo127bo658bo5bo32bo3bo49b5o19b2o60b2obo17b3o 19b2o146b2ob2o3b4o26bo3bo4b2o$112bo122bo3bo594b2o63b6o33b4o50b3o22bo 59b2obo16bo2bo138b2o29bo5b3o10b2o14b2o3bo14b3o$107bo4bo123b4o190b2o 402bobo242bo12b3o2bo3bo8bo3bo124b2o34b3o11b2o16bo6bo12bo$108b5o23b2o 60bo230bobo175b4o35b2o186bo241bo13bo4b2o2bo2bo7b2o5b3o154bo28b2o7b2obo 4b2o3bobo$136bobo58b3o231bo174b6o33b4o355b2o48b2o20b3o11bo5bob2ob3ob2o 9bob3o153b2o27bo4bo4bobo9b2o$136bo59bob2o18bo387b4ob2o32b2ob2o181bo70b obo15bo36bo2bo43b2o48b2o9b2o11bo10bo5bo6bobo6bo8b2o173bo8bo7bob2o$195b 2o2b2o11bo3b2ob2o8bo4b2o374b2o35b2o180bo3bo68bobo2b2o9b2obo39bo77b2o 23bo12b2o11b2o10bobo2bo3b8obo120bo42b2o9bo$123b2o48b2o14bo6b4o10b2o4b 2o8b4o3b2ob2o596bo69b4obo8bo2bo35bo3bo77b2o24b2ob2o20b2o3bobo4b2ob2ob 2o6b4o119bo3bo21bo2bo15b2o9bo20b2o7bo2bo$123b2o48b2o9b2o2bo8b3o10b2ob 2ob2o3bo3b5o4bo2bo591bo4bo69b2obob2o47b4o103b2obo31bo5bobo8bo126bo19bo 49bo4bo9bo$158b2o24bobo2bo20bo3bo9bo9bo2bo592b5o70b2o2b2o2b2o2bo131b2o 8b3o5bo25b2o3b3o6bobo129bo4bo4bo13bo5bo50bo4bo3bo$158b2o35b2o14bo2bo3b 3o4b2o8b2o429b2o239bo5b2o2bobo129b2o21b2o166b5o2bo3bo11bo3b3o44bo5bo5b 4o$179bo5bobo6bobo15b7o7bo128bo182b3o124b4o236bo6bo5bo117b2o34b2o5b2o 40b2o129bo9b2ob4o46b6o$151bo16b2o9bo6bobo6bo19b3o135bo3bo179b5o123b2ob 2o234bo7b3o29bobo9b2o75b3ob2o39bo2bo30b2o5b2ob2o123bo4bo10bo2b2o$149bo 3bo14b2o9bo7bo3b2o23bo9b2o7bo2bo119bo19b2o157b3ob2o21bo102b2o210b2o22b 2o3bo3b3o3b2o9b2o7b2o2b2obo9bo2b2o73b5o41b2o27b4ob2o4b4o125b5o11bob2o$ 154bo36b2o5b2o16bo7bo4bo9bo113bo4bo18b4o159b2o21b2o61b2o251b2o22b2o3bo 9b2o9b2o6bobo14b3o2bo74b3o7b2o62b6o6b2o143bo$149bo4bo4bo37bo2bo16bo12b o4bo3bo114b5o18b2ob2o181bobo57b2obo18b3o15bo240bo32b2obo5bo7bo4bo81b3o b2o62b4o$150b5o2bo3bo36b2o24bo5bo5b4o139b2o241bo22bo2bo12bo229b2o12bo 7b2o20b3o3bo5bo6b5o82b5o$162bo62b6o391bo19b2o3b2o8bo3bo2b2o237bob2o6b 2o19b2o3b5o2bo8b2o85b3o$157bo4bo388b2o48b2o22bo11b5o5b2o4bo2b3obo5bo 206bo10bobo5b2o10b2obo16b2o13b2o2b2o$158b5o131b2o55bobo197b2o48b2o9b2o 9b2o12bo2bo4bo6bob5o2bobo2b2o203bo3bo8bobo19bo17b2o14b3o5b2o7bo2bo$ 293bobo54bo2bo44b2o186b2o24bo2bo9bo11b3ob2obo2b3ob2ob2o5bo3b2o209bo8bo 55bo4bo4bo9bo$295bo49b2o6bo43b4o185b2o25b3o30bobo5b2o7b3o205bo4bo4bo 24bo45bo4bo3bo$343bob2o4b2o44b2ob2o211bo9bo17bo4b2o224b5o2bo3bo21bobo 38bo5bo5b4o$347bo3b2o46b2o195b2o8b3o6bo7bo16b2o3bo8bo229bo19bo2bo39b6o $304b2o2b2o32b2o7b2ob2o165bo58b3o13b2o17bo3b2o33bo11b2o211bo4bo20b2o$ 303b3o36b2o2b2o3b3o22bo2bo15bo123bo3bo55b5o35b2o5b2o27b4o6b4o211b5o$ 310bo30b3o31bo3bo13bo130bo19b2o33b3ob2o40bo2bo25b6o5b2ob2o$289bo11bobo 39bobo5bobo26bo8bo3bo2b2o57b2o62bo4bo18b4o35b2o4b3o35b2o26b4ob2o6b2o$ 288bobo11b4obo2bo2b2o36bobo9b2o13b3o4bo2b3obo5bo55bobo63b5o18b2ob2o39b 5o66b2o$288bo2bo11b3ob3o3b2o35b3o10b2o3b3obo7bo3bob5o2bobo2b2o56bo88b 2o40b3ob2o$291bo57bo18b4o2bo4b2o2b2ob2o5bo3b2o191b2o$283bobo2bobo46bo 10bobo19bobobob2obo6b2o7b3o$282bo3b2o2bo45bobo9bo161b2o$283bo3bobo18b 2o25b2ob2o9bo8b2o9bo16bo122bo2bo51b2o$284bobobo19b2o26bo2bo3bo14b2o8bo b2ob2o11bo11b2o105b2o3b2o51b4o$337b2o4bo25b6o12b4o6b4o103bo2b2o35bo18b 2ob2o$292b2o49bo26b3obo11b6o5b2ob2o101bo3b2o34b3o19b2o$290b4o92b4ob2o 6b2o103bo2b2o34bob2o$289b2o3bo95b2o150bob3o14bo$288bo2b3o210bo2b2ob2o 30bo3bo12bo$288bo3bo211bo2b4o29b2o4bo8bo3bo2b2o$289b2ob2o196b2obo11b2o bo10b2o20b2o8bo2b3obo5bo$289b2ob2o55b2o139bo3bob2o5b5o11b2o12bo7b2o2b 3o2bob5o2bobo2b2o$290bobo53b3ob2o138bobobob2o5b2o27bobo10b2o2b2ob2o5bo 3b2o$291bo54b5o142bobo36bobo7bo9b2o7b3o$347b3o145bo37bo$496bobo15b2o8b 3o25bo$289b3o202b5o15b2o36bo11b2o$291bo152b3o46b2o58b4o6b4o$290bo152bo 47bo2bo57b6o5b2ob2o$443bo3bo43b3o58b4ob2o6b2o$441b2o4bo44bo63b2o$444b 3o$441bo4bo$445bo$444bo70b2o$512b3ob2o$512b5o$513b3o2$295bo$293bo3bo$ 298bo$293bo4bo$294b5o9$461bo$459bo3bo$464bo$459bo4bo$460b5o!golly-3.3-src/Patterns/Life/Puffers/line-puffer-superstable.rle0000644000175000017500000000605012026730263021555 00000000000000#C Superstable line puffer of width 76. #C A line puffer is the best linear generator of chaos in Life. #C It works by pulling a solid line forward at speed c/2. It is #C amazing that this line isn't destroyed by its own debris. #C Furthermore, this kind of puffer can be widened indefinitely, #C making it exponentially more chaotic, without affecting its #C stability. Some methods of stabilizing the edges are known #C to be slightly unstable, giving the puffer a half-life #C independent of its width, but the edge shown here is believed #C to be completely stable. #C Increasing a line puffer's width linearly tends to increase its #C period exponentially. You will not see this width-76 puffer #C repeat for tens of millions of generations. #C One interesting thing you can do with a line puffer is put some #C asymmetrical debris in its plume. Sometimes the asymmetry is #C temporary, but more often in wide puffers such as this one, #C it turns out to be permanent. #C Tim Coe, May 1996. From Alan Hensel's "lifebc" pattern collection. x = 32, y = 156, rule = B3/S23 18bo$18b4o$5bobo12boo$5bobbo14bo$8boo10b4o$10bo13bo$8b4o8bobb3o$7bo4bo 9b3o$9bobbo10bo$9bobbo5bob3o$11bo6boobbo$5bob4o8b3o$5bo3bo9bo$8bo12bo$ 6bobo10bobo$22bo$7b3o9bobo$8boo11bo$7b3o9bo$19b3o$6bobo9boobbo$8bo9bob 3o$5bo3bo13bo$5bob4o11b3o$11bo8bobb3o$9bobbo11bo$9bobbo7b4o$7bo4bo10bo $8b4o8boo$10bo7b4obbobo$8boo8bo5bobbo$5bobbo7bobo8boo$5bobo8bo12bo$14b obboo8b4o$bboobo9b3o8bo4bo$5bo7bobo12bobbo$bboboo7bo14bobbo$bbo9boo16b o$o7bob3o11bob4o$bo5boboo13bo3bo$bo5boo18bo$bobobboo17bobo$boboboo$bo 24b3o$boboboo20boo$bobobboo5bobo4bobo4boo$bo5booboobobbobbobbob5o$bo5b oo7boo3bo4bo$bobobboo5bo6bo7bo$boboboo6bob5o6bobo$bo8boo17bo$boboboo6b ob5o6bobo$bobobboo5bo6bo7bo$bo5boo7boo3bo4bo$bo5booboobobbobbobbob5o$b obobboo5bobo4bobo4boo$boboboo20boo$bo24b3o$boboboo$bobobboo17bobo$bo5b oo18bo$bobobboboo14bo3bo$bobob3obbo13bob4o$bo8bo19bo$bobob3obbo17bobbo $bobobboboo18bobbo$bo5boo17bo4bo$bobobboo19b4o$boboboo22bo$bo25boo$bob oboo17bobbo$bobobboo16bobo$bo5boo$bobobboboo$bobob3obbo$bo8bo13bobo$bo bob3obbo13bobbo$bobobboboo17boo$bo5boo20bo$bobobboo19b4o$boboboo19bo4b o$bo26bobbo$boboboo21bobbo$bobobboo22bo$bo5boo15bob4o$bobobboboo14bo3b o$bobob3obbo16bo$bo8bo14bobo$bobob3obbo$bobobboboo16b3o$bo5boo18boo$bo bobboo5bobo4bobo4boo$boboboo3boobobbobbobbob5o$bo14boo3bo4bo$boboboo6b o6bo7bo$bobobboo5bob5o6bobo$bo5booboo17bo$bo5boo4bob5o6bobo$bobobboo5b o6bo7bo$boboboo9boo3bo4bo$bo8boobobbobbobbob5o$boboboo6bobo4bobo4boo$b obobboo19boo$bo5boo17b3o$bobobboboo$bobob3obbo14bobo$bo8bo16bo$bobob3o bbo13bo3bo$bobobboboo14bob4o$bo5boo21bo$bobobboo20bobbo$boboboo21bobbo $bo24bo4bo$boboboo20b4o$bobobboo21bo$bo5boo18boo$bo5boboo13bobbo$o7bob 3o11bobo$bbo9boo$bboboo7bo$5bo7bobo$bboobo9b3o$14bobboo$5bobo8bo$5bobb o7bobo$8boo8bo$10bo7b4o$8b4o8boo$7bo4bo10bo$9bobbo7b4o$9bobbo11bo$11bo 8bobb3o$5bob4o11b3o$5bo3bo13bo$8bo9bob3o$6bobo9boobbo$19b3o$7b3o9bo$8b oo11bo$7b3o9bobo$22bo$6bobo10bobo$8bo12bo$5bo3bo9bo$5bob4o8b3o$11bo6b oobbo$9bobbo5bob3o$9bobbo10bo$7bo4bo9b3o$8b4o8bobb3o$10bo13bo$8boo10b 4o$5bobbo14bo$5bobo12boo$18b4o$18bo! golly-3.3-src/Patterns/Life/Puffers/line-puffer-unstable.rle0000644000175000017500000000562712026730263021052 00000000000000#C The asymmetric debris destroys the engine of this #C line puffer after appoximately 9.5 million generations. #C See also line-puffer-superstable.rle. #C Tim Coe, 9 October 1995 x = 17, y = 99, rule = B3/S23 obo$o2bo5bo$3b2o4b4o$5bo5b2o$3b4o7bo$2bo4bo3b4o$4bo2bo7bo$4bo2bo3bo2b 3o$6bo6b3o$ob4o8bo$o3bo4bob3o$3bo5b2o2bo$bobo6b3o$10bo$2b3o7bo$3b2o5bo bo$2b3o8bo$10bobo$bobo8bo$bo2bo5bo$4bo5b3o$2bo2bo5b3o$4b2o5b2o$5bobo2b 2o$5bobob2o$5bo$5bobob2o$2bo2bobo2b2o$4b2o5b2o$2bo2bobo2bob2o$5bobob3o 2bo$2bo2bo8bo$2bo2bobob3o2bo$4b2obo2bob2o$5bo5b2o$5bobo2b2o$5bobob2o$ 5bo$5bobob2o$5bobo2b2o$5bo5b2o$5bobo2bob2o$5bobob3o2bo$5bo8bo$5bobob3o 2bo$5bobo2bob2o$5bo5b2o$5bobo2b2o$5bobob2o$2bo2bo$2bo2bobob2o$2bo2bobo 2b2o$2bo2bo5b2o$2bo2bobo2bob2o$2bo2bobob3o2bo$2bo2bo8bo$2bo2bobob3o2bo $2bo2bobo2bob2o$2bo2bo5b2o$2bo2bobo2b2o$2bo2bobob2o$2bo2bo$2bo2bobob2o $2bo2bobo2b2o$2bo2bo5b2o$2bo2bobo2bob2o$2bo2bobob3o2bo$2bo2bo8bo$2bo2b obob3o2bo$2bo2bobo2bob2o$2bo2bo5b2o$2bo2bobo2b2o$2bo2bobob2o$2bo2bo$5b obob2o$5bobo2b2o$4b2o5b2o$2bo2bo5b3o$4bo5b3o$bo2bo5bo$bobo8bo$10bobo$ 2b3o8bo$3b2o5bobo$2b3o7bo$10bo$bobo6b3o$3bo5b2o2bo$o3bo4bob3o$ob4o8bo$ 6bo6b3o$4bo2bo3bo2b3o$4bo2bo7bo$2bo4bo3b4o$3b4o7bo$5bo5b2o$3b2o4b4o$o 2bo5bo$obo! #C The eventual failure occurs when a particular defect appears #C behind the line puffer. The following snapshot is taken #C approximately 3440 generations before the puffer engine implodes: x = 48, y = 99, rule = B3/S23 32bo$32b4o4bobo$34b2o4bo2bo$37bo5b2o$34b4o7bo$38bo4b4o$34bo2b3o2bo4bo$ 36b3o5bo2bo$37bo6bo2bo$32bob3o9bo$32b2o2bo3bob4o$33b3o4bo3bo$33bo9bo$ 35bo5bobo$33bobo$36bo5b3o$33bobo7b2o$35bo6b3o$33bo$33b3o5bobo$34b3o4bo 2bo$34bobo7bo$35b2o7bo$36bo2b2o2bo$35b2o2b4o$35b2o$35b2o2b4o$36bo2b2o 2bo$34b3o7bo$36bo2b2o3bo$35b2o2b5obo$35b2o7b3o$34bobo2b5obo$35b2o2b2o 3bo$6b2o28bo7bo$6b2o4b2o21b2o2b2o2bo$12b2o7b4o2bobo5b2o2b4o$21b5o3b2o 2b4o$19b2ob2ob2obo2bob4o2b4o$7b2o10b2o9b2ob4o2b2o2bo$7bobo9b2ob2o6b2ob 4o7bo$8bo10bo2bo7b2ob4o2b2o3bo$19bo10b2ob4o2b5obo$18b2obo4b2o2b2ob4o7b 3o$9b3o7b2o6bo2b2ob4o2b5obo$3b2o3bo3bo13bo3b2ob4o2b2o3bo$3bobobo13b2o 3bo3b2ob4o7bo$4b5o2b2o8b3o2b3ob2ob4o2b2o2bo$4bobobobo12bo2b3ob2ob4o2b 4o$3b2ob2ob3o5b2o7b3ob2ob4o$2b3obob2o6b3obo3bob3ob2ob4o2b4o$bobobo14bo 5b3ob2ob4o2b2o2bo$2b5o5b2o4b2o3b2ob3ob2ob4o7bo$o4bo5bo3bo10b3ob2ob4o2b 2o3bo$obo3bo4bo3bo10b3ob2ob4o2b5obo$b2o8bobobo5b2o3b3ob2ob4o7b3o$20bob 2o6b2ob4o2b5obo$19b2obo3bo3b2ob4o2b2o3bo$25b2o3b2ob4o7bo$19bo5b2o3b2ob 4o2b2o2bo$15bo5bo4bo3b2ob4o2b4o$14bo2b6o7b2ob4o$15bo6bo4b2ob2ob4o2b4o$ 2b2o11b4ob3o5b3o2b4o2b2o2bo$2b2o12bo12bo2b5o7bo$17bo2b3o2bo6b5o2b2o3bo $17bo2bobo2b3o4b5o2b5obo$26b3o3b5o7b3o$27bobo2b5o2b5obo$28b2o2b5o2b2o 3bo$29bo2b5o7bo$26b2o4b5o2b2o2bo$26b3obob5o2b4o$6b2o19b3o5b2o$5bo2bo 26b2o2b4o$6b2o28bo2b2o2bo$35b2o7bo$34bobo7bo$34b3o4bo2bo$33b3o5bobo$ 33bo$35bo6b3o$33bobo7b2o$36bo5b3o$33bobo$35bo5bobo$33bo9bo$33b3o4bo3bo $32b2o2bo3bob4o$32bob3o9bo$37bo6bo2bo$36b3o5bo2bo$34bo2b3o2bo4bo$38bo 4b4o$34b4o7bo$37bo5b2o$34b2o4bo2bo$32b4o4bobo$32bo! golly-3.3-src/Patterns/Life/Puffers/puffer-2c5.rle0000644000175000017500000000177012026730263016674 00000000000000#C 2c/5 dirty puffer #C Period 10150 (glide-reflective) #C Jason Summers, 26 Feb 1999 x = 112, y = 75, rule = B3/S23 15bo13bo52bo13bo$14bobo11bobo50bobo11bobo$13booboo9booboo48booboo9boob oo$13boo3bo7bo3boo48boo3bo7bo3boo$14bob4o5b4obo50bob4o5b4obo$14boo3bo 5bo3boo50boo3bo5bo3boo$18b3o3b3o58b3o3b3o$15boobbo5bobboo52boobbo5bobb oo$15b4obb3obb4o52b4obb3obb4o$15bobo3b3o3bobo52bobo3b3o3bobo$13b3obbo 7bobb3o48b3obbo7bobb3o$18bobbobobbo58bobbobobbo$20bo3bo62bo3bo$13boo 15boo48boo15boo$18boobbobboo58boobbobboo$21b3o64b3o6$87bo$86b3o$86bob oo$87b3o$87boo4$4bo5bo90bo5bo$3b3o3b3o88b3o3b3o$bbobbo3bobbo86bobbo3bo bbo$b3o7b3o84b3o7b3o$bbobo5bobo86bobo5bobo$4boo3boo90boo3boo$o4bo3bo4b o82bo4bo3bo4bo$5bo3bo92bo3bo$oo3bo3bo3boo82boo3bo3bo3boo$bbobbo3bobbo 86bobbo3bobbo$4bo5bo90bo5bo25$43bo5bo12bo5bo$42bobo3bobo10bobo3bobo$ 41booboobooboo8booboobooboo$41bobbo3bobbo8bobbo3bobbo$39booboo5booboo 4booboo5booboo$40boo9boo6boo9boo$41boo7boo8boo7boo$42bo7bo10bo7bo$39b oo11boo4boo11boo$40b3o7b3o6b3o7b3o$43bobobobo12bobobobo! golly-3.3-src/Patterns/Life/Puffers/zigzag-wickstretcher.rle0000644000175000017500000006625512026730263021201 00000000000000#C zigzag c/2 orthogonal wickstretcher: Jason Summers, 14 Feb 2006 x = 331, y = 1070, rule = B3/S23 44bo13bo$43b3o11b3o$42boobo5bo4boobo$42b3o5b3o3b3o$43boo5boboo3boo$73b o13bo$72b3o11b3o$72boboo4bo5boboo$53bo19b3o3b3o5b3o$51boo4b3o13boo3boo bo5boo$57bobbo$54bobbo$49bo7bo$48bo3boo4bobo17bo$48bo29b3o5b3o$49bo29b o5bobbo$59b3o3b3o11bobbo5bo$42bo9bo5bobbo3bobbo11b3o5bo$41b3o6b3o8bo3b o19bobo$41boboo5bo10bo3bo$42b3o5bobo5bobo5bobo45b3o11b3o$42boo7boo61bo bbo10bobbo$62b3o6bo16bo5bo19bo6b3o4bo$62b3o5b3o14b3o3b3o18bo5bobbo4bo$ 62bobo4boobo13boobo3boboo18bobobbo3bo4bobo$63bo5b3o14b3o5b3o22boobobo$ 63bo6boo15boo5boo23booboo$49bo70b3o$49boo23bobo14bo23bo$48bobo10bo3bo 8boo14b3o21b3o$61booboo10b3o35boboo$62bobo25bobo22b3o$54bo36bo23boo$ 54boo7bo$53bobo7bo$63bo16boo42boo$81boo5b3ob3o29boo$59bo16bo3bo9bobo 14b3o3b3o14b3o$59boo14b3o29bobbobobbo5b3o5bobbo$58bobo14boboo28bo7bo4b o3bo7bo$76b3o6boo3b3o14bo7bo4bo4bo6bo$56bo19b3o7boo20bobobobo10bo3bobo $55b3o6bo11b3o6bo34bo4bo$55boboo5boo10boo33bo12bo$56b3o4bobo44b3o8bobo $56b3o51b3o$56boo146bo13bo$203b3o11b3o$122boo78boobo5bo4boobo$109bo3bo 8bobo77b3o5b3o3b3o$109bo3bo8bo80boo4bobboo3boo$108bobobobo94b3o$110b3o 12b3o$94bo15b3o4boo6bobbo$87bo9bo13bo5b3o5bo$87bo5bo14bo5b4obo5bo3bo 73b3o$98bo8bobo3bobo9bo3bo44b3o11b3o12bobbo$79bo13bo12booboo4bo9bo48bo bbo10bobbo11bo$79boo12bo3bo8boob5obo10bobo45bo6b3o4bo14bo$78bobo13b3o 12bob3oboo15bo13bo27bo5bobbo4bo15bobo$109boo3b3o14b3o11b3o27bobobbo3bo 4bobo21boo$108boo5boo14boboo4bo5boboo32b4o28boo$108boo5boo15b3o3b3o5b 3o34bo11b3o3b3o$109boo4boo15boo3boobbo4boo47bobbobobbo16bo$115bo21bo3b o33bo19bo7bo7bo7b3o$114bo22bobo3bo30b3o18bo7bo5booboo5boboo$174boboo4b 3o11bobobobo6booboo6b3o$138booboo32b3o4boo25booboo6boo$140bo4b3o27boo 5boo15bo10boo$144bobbo31booboo14b3o$147bo32bobo15b3o$147bo33bo$94bo49b obo$94boo71b3o3b3o14b3o$93bobo71bobbobobbo13bobbo4bo3bo10boo$136boo29b o7bo16bo4bo3bo9boo$130bo5boo9bo5bo13bo7bo16bo3bobobobo10bo$103boo24b3o 5b3o6b3o3b3o13bobobobo14bobo6b3o$104bo23boobo6b3o4boobo3boboo42b3o$ 104bo23b3o6b3obo3b3o5b3o15bo27bo7boo$105boo22boo5boo8boo5boo15b3o33boo $103boboo28b3o32b3o12boo21bo$104boo30boo12bo34bobo$137bo11b3o33bo$148b o3bo49boo$169bo3bo27boo$169bo3bo6boo21bo$109bo38booboo15bobobobo5bobo 23bo$109boo27boo10bo19b3o7bo4b3o17b3o$108bobo28boo29b3o12bobbo16boboo$ 138bo32bo13bo20b3o$135bo12bo3bo21boo9bo3bo16b3o$118boo14b3o10bobobobo 19bobbo8bo3bo16boo$117bobo14boboo5boo3b5o21boo9bo$119bo15b3o6boobboob oo33bobo3boo$135b3o5bo5bobo39boo$135b3o11b3o41bo$135boo$$146b3o$148bo$ 145bo3bobbo$124bo20bo3bo3boo$124boo23bobboo12bo$123bobo21bo18bobo3bo$ 149bo16boo5boo$149bo$133boo$132bobo$134bo42boo$176boo$178bo6$139bo$ 139boo$138bobo$223bo13bo$222b3o11b3o$148boo71boobo5bo4boobo$147bobo71b 3o5b3o3b3o$149bo12boo58boo4bobboo3boo$161boo65bo3bo$163bo65boobo$231b oo$$222b3o$222bobbo5bo$222bo7bobo$222bo6bo$223bobo6bo$227boo$227booboo $166b3o60bo82b3o11b3o$166bobbo46bo5bo16bo72bobbo10bobbo$166bo48b3o3b3o 14b3o71bo6b3o4bo$166bo3bo43boobo3boboo13boboo70bo5bobbo4bo$166bo47b3o 5b3o14b3o71bobobbo3bo4bobo$156boo9bobo45boo5boo15boo78b4o$156bo15b3o 11b3o132bo$157bo13bobbo10bobbo30bo$158bo15bo4b3o6bo29b3o92bo$159bo14bo 4bobbo5bo123b3o$158boo11bobo4bo3bobbobo30bobo12boo46b3o11b3o14boboo4b 3o$178boboboo35bo12boo46bobbo10bobbo15b3o4boo$128b3o11b3o34booboo50bo 48bo4b3o6bo15boo5boo$128bobbo10bobbo34b3o100bo4bobbo5bo19booboo$128bo 6b3o4bo30bo106bobo4bo6bobo21bobo$128bo5bobbo4bo29b3o41b3ob3o5boo62bo 12bo5bo7bo$129bobobbo3bo4bobo25boobo6bo36bobo6boo5bo51bo4bo12b3o3b3o$ 135b4o32b3o6boo47bo3b3o50bo17bobooboobo15b3o$137bo34boo7bo50boobo46bo 5bo16b3ob3o15bobbo$178bo39b3o11b3o46b3o3b3o15boo3boo18bo$143bo32b4obo 40boo8b3o45boobo3b3o40bo$142b3o32bobbo40bobbo7b3o45b3o4boo19bo18bobo$ 142boboo32b3o41boo9boo46boo5b5o14bobo$143b3o19b3o3b3o14b3o99b3o13bo3bo $143boo19bobbo3bobbo13bobbo50bo13bo50bobo$167bo3bo16bo52b3o11b3o29bo 19b3o13boo$133boo32bo3bo16bo52boboo4bo5boboo28bo35bobo$133boo29bobo5bo bo14bobo50b3o3b3o5b3o15b3o3b3o6bo7b3o23bo$242boo3boobbo4boo15bobbo3bo bbo5boo6bobbo$126b3o14b3o3b3o16b3o76bo3bo24bo3bo7boo7bo8booboo$125bobb o6b3o4bobbo3bobbo15b3o76boboo25bo3bo7bo8bo8booboo7boo$128bo5bo3bo6bo3b o18bobo76boo24bobo5bobo14bobo5booboo7bobo$128bo4bo5bo5bo3bo19bo12b3o 30bo92bo9bo$125bobo6bo7bobo5bobo16bo12bo30boo6bo33b3o19b3o$135b4o44bo 30boo5bo26bo5bobbo19b3o27b3o$146b3o7boo89bobo7bo18bobobo32boo$146b3o7b o10bo3bo78bo6bo55bobo$146bobo8bo9booboo5b3o67bo6bobo33b3o20bo$147bo10b o9bobo6bo5b3o65boo37bo$147bo11bo18bo3bobbo62booboo22boo3boo9bo$134b3o 21boo9bo15bo64bo25booboo$136bo32bo11bo3bo54bo16bo5bo12booboo33b3o$135b o9bo3bo19b5o7bo3bo53b3o14b3o3b3o13bo6b3o4b3o18bobbo$145booboo21bobbo 10bo33bo13bo4boobo13boobo3boboo19bo5bobbo21bo$131b3o12bobo23boo8bobo 33b3o11b3o3b3o14b3o5b3o20bo7bo17bo3bo$131bobbo4b3o75boobo5bo4boobo4boo 15boo5boo25bo3bo8boo11bo$131bo9bo5bo69b3o5b3o3b3o56bo3bo8bobo7bobo$ 131bo3bo4bo6bo70boo4bobboo3boo26bo33bo8bo$131bo3bo11bo76b3o32b3o16boob oo8bobo$131bo126bo3bo15bobboo$132bobo9boo99boo11bo3bo15bo$143bo4bo97b oo31bobo$142bo6bo68b3o24bo12bo3bo17bo$142boobo3bo68bobbo36bo3bo$146bo bbo14bo53bo39booboo$146bobo14bo54bo31boo7bobo$146boo15b3o53bobo23bo5b oo7bo$228boo14b3o3bo$228boo14boboo$210b3o3b3o26b3o$210bobbobobbo16bo9b 3o40boo$210bo7bo7bo7b3o8b3o40bobo$210bo7bo5booboo5boboo7boo3boo36bo$ 211bobobobo6booboo6b3o12b3o$224booboo6boo16boo7b3o$156boo56bo10boo26b 3o4bob3o$156bo56b3o37bobboboo4bo$157bo54booboo42bo3bo$158bo53booboo40b o$159bo5b3o11b3o31bobo$158boo4bobbo10bobbo32bo39bobbo$167bo4b3o6bo45b oo25bo3bo3bo$167bo4bobbo5bo44boo27b3obboo$164bobo4bo3bobbobo31booboo 11bo25booboo$170bobobboo34bo5bo37bobbo$174bo37bo3bo39boo15boo$170boboo 39b3o6boo49bobo$171b3o6bo19bo12bobo5boo50bo$171b3o5b3o16boo14bo8bo$ 172boo4boobo17boo13bo$171bobo4b3o$171bobbo4boo36boo$171bo44boo45boo$ 175bo42bo43boo$172bobboo5bo5bo32bo42bo$172bobboo4b3o3b3o30b3o$163b3o7b 3o5bobooboobo22boo6boboo$163bobbo6b3o6b3ob3o22boo8b3o$163bo18boo3boo 24bo7b3o$129b3o11b3o17bo57boo$129bobbo10bobbo17bobo18bo72boo$129bo6b3o 4bo40bobo71bobo$129bo5bobbo4bo12boo25bo3bo70bo$130bobobbo3bo4bobo9boo 26bobo$136b4o44b3o$138bo17boo12boo$156bo12bobo$144bo12bo13bo76boo$143b 3o12bo24booboo59boo$143boboo12bo23booboo61bo$144b3o11boo15boo6booboo$ 144boo28bobo8bo11boo$176bo19boo$134boo48b3o11bo$134boo$180boo61boo$ 127b3o14b3o3b3o26bobo61bobo$126bobbo6b3o4bobbo3bobbo27bo61bo$129bo5bo 3bo6bo3bo$129bo4bo5bo5bo3bo$126bobo6bo7bobo5bobo23b3o$136b4o37bobbobb oo$147b3o27bo5boo48boo$147b3o27bo3bo50boo$147bobo27bo56bo$148bo29bobo$ 148bo$135b3o$137bo$136bo9bo3bo$146booboo77boo$132b3o12bobo78bobo$132bo bbo4b3o13boo27bo42bo$132bo9bo5bo7boo25boo$132bo3bo4bo6bo35boo$132bo3bo 11bo7boo$132bo23bo$133bobo9boo10bo60boo$144bo4bo8bo58boo$143bo6bo8bo 59bo$143boobo3bo7boo$147bobbo32bo$147bobo33bobo$147boo34boo$$213boo$ 213bobo$213bo5$203boo$202boo$204bo6$198boo$198bobo$156boo40bo$156boo$$ 156boo$156bo$157bo30boo$158bo28boo48b3o11b3o$159bo29bo46bobbo10bobbo$ 158boo79bo4b3o6bo$239bo4bobbo5bo$236bobo5boboobbobo3$183boo$128b3o11b 3o38bobo52bo8bo$127bobbo10bobbo25bo12bo53b3o5bobo$130bo4b3o6bo23boo38b 3o11b3o11boobo$130bo4bobbo5bo24boo36bobbo10bobbo11b3o4bobbo$127bobo4bo 3bobbobo66bo4b3o6bo12boo4b3o$134b4o72bo4bobbo5bo19bo$135bo37boo32bobo 4bo3bobbobo$165bo6boo39bobobboo10bo5bo$143bo22bo7bo42bo11b3o3b3o$142b 3o19b3o13b3o11b3o16boboo11boobo3boboo14b3o$134b3o4boobo23bo10bobbo10bo bbo12bo4b3o11b3o5b3o14bobbo$135boo4b3o24bobo11bo4b3o6bo11b3o3b3o12boo 5boo15bo$135boo5boo24boo12bo4bobbo5bo10boobo42bo$135booboo39bobo4bo3bo bbobo11b3o23bo20bobo$136bobo29boo16b4o18boo22b3o$137bo7bo5bo16bobo16bo 43bo3bo15bo$144b3o3b3o3boo10bo82bo$126b3o15bobooboobo3boo23bo19bo5bo 40b3o$126bobbo15b3ob3o28b3o17b3o3b3o9boo11booboo12bo$126bo18boo3boo4b oo21boobo16boobo3boboo14b3o6bo$126bo29bo22b3o17b3o5b3o5bo3bo4bobbo$ 127bobo18bo8bo22boo18boo5boo15bo$147bobo8bo60bo4bo6bo3bo7b3o$146bo3bo 8bo30boo12bo15bo4bobobbobobobo6bo$147bobo8boo30boo11b3o11bobbo10b5o8bo $132boo14bo53bo3bo10bobbo10booboo$131bobo14bo24b3o3b3o14b3o19boo12bobo $133bo13bobo22bobbo3bobbo4b3o6bobbo32b3o3b3o$147bobo25bo3bo6bo3bo5bo5b ooboo31bo$148bo26bo3bo5bo5bo4bo7bo34bo$137boo33bobo5bobo7bo6bobo$136bo bo47b4o25b3o$138bo6boo3boo24b3o23bo3bo8bo17b3o$176b3o22bobobobo8bo16bo 5b3o$166boo8bobo23b5o27bo4bobbo$142boo23bo9bo24booboo32bo$141bobo4bo 17bo10bo25bobo4b3o26bo3bo$143bo4bo16bo22b3o12b3o4bo28bo$164bo23bo22bo 28bobo$164boo9bo3bo9bo$147boo26booboo$140b3o3bobo27bobo12b3o11b3o$140b obbo4bo34b3o4bobbo11bo$140bo36bo5bo9bo12bo3b3o$140bo3bo32bo6bo4bo3bo 16bobbo$140bo36bo11bo3bo16bo$141bobo12boo35bo16bo3bo$64b3o11b3o75boo 21boo9bobo17bo7b3o$63bobbo10bobbo95bo4bo29bobo4bo$66bo4b3o6bo75boo17bo 6bo36bo$66bo4bobbo5bo75bo18bo3boboo$63bobo4bo3bobbobo77bo17bobbo16b3o$ 69bobobboo82bo17bobo16bo$73bo85bo17boo17bo$69boboo85boo$70b3o6bo82boo$ 70b3o5b3o80bobo$71boo4boobo82bo$70bobo4b3o$70bobbo4boo$70bo23bo13bo$ 74bo18b3o11b3o$71bobboo5bo5bo5boboo4bo5boboo92b3o$71bobboo4b3o3b3o5b3o 3b3o5b3o92bo$62b3o7b3o5bobooboobo5boo3boobbo4boo56boo36bo$62bobbo6b3o 6b3ob3o11booboo63bo$62bo18boo3boo11bobb3o61bo13b3o$62bo37boboo61bo14bo $63bobo18bo17bo61bo16bo$83bobo12bo3bo4b3o54boo$82bo3bo15bo3bobbo12b3o 11b3o$83bobo16bo6bo12bobbo10bobbo$83b3o13boboo6bo12bo6b3o4bo$69boo27b oo6bobo13bo5bobbo4bo$68bobo52bobobboobo5bobo$70bo32boo$82booboo15bo6b 3o3b3o38boo$82booboo5bo7bo8bobbobobbo38boo30b3o$74boo6booboo4b3o6bo8bo 7bo10bo8bo50bo$73bobo8bo5boobo7bobo5bo7bo10bobo5b3o17boo31bo$75bo14b3o 9bo7bobobobo19boboo16bo$83b3o5boo36bobbo4b3o17bo$113bo16b3o4boo19bo$ 79boo31b3o16bo27bo$78bobo30booboo42boo$80bo31b3o51boo$112b3o51boo$98b oo12b3o5b3o14b3o3b3o$76b3o20boo11bobo4bobbo13bobbo3bobbo$76bobbobboo 14bo13bobo7bo16bo3bo$76bo5boo29bo8bo16bo3bo$76bo3bo38bobo14bobo5bobo 19boo$76bo26boo61boo5b3o$77bobo24boo18bo15b3o30bo5b3o11b3o$103bo20bo 15b3o23boo6bo3bobbo10bobbo$125b3o11bobobo23bo13bo4b3o6bo$127bo38bo14bo 4bobbo5bo$108boo55bo12bobo4bo3bobbobo$94boo13boo53bo20b4o$93bobo12bo 29boo3boo19boo20bo$95bo34b3o6booboo$132bo6booboo36bo$125b3o3bo9bo37b3o $125bobbo49boobo$125bo11boo39b3o$125bo3bo6bobbo39boo$125bo3bo7boo17boo $118boo5bo30boo31boo$119boo5bobo43bo5bo10boo$118bo37boo13b3o3b3o$139bo 16bo13boobo3boboo14b3o$140boo15bo12b3o5b3o5b3o6bobbo$158bo12boo5boo5bo 3bo5bo$109boo48bo24bo5bo4bo$108bobo47boo15bo13bo6bobo$110bo34bo28b3o8b 4o$137bobo6bo$106bo31boo4b3o27bobo$105b3o30boo35bo68bo13bo$104boobo 135b3o11b3o$104b3o136boboo4bo5boboo$104b3o59boo19b3o54b3o3b3o5b3o$105b oo26boo31boo4b3ob3o8bo56boo3boobbo4boo$134boo38bobo11bo60bo3bo$133bo 32boo81boboo$167bo81boo$166bo7b3o5b3o$165bo16bo60b3o$124boo38bo18bo58b obbo$123bobo38boo79bo$125bo119bo$177b3o62bobo$177bo36b3o11b3o$178bo35b obbo10bobbo21boo$181b3o30bo6b3o4bo6b3o3b3o9boo$181bobbo29bo5bobbo4bo5b obbo3bobbo15bo$156boo23bo33bobobbo3bo4bobo5bo3bo9bo7b3o$148boo6boo23bo 3bo33boobobo12bo3bo8b3o5boobo$149boo30bo37booboo10bobo5bobo4b5o4b3o$ 148bo7boo24bobo35b3o30boo4boo$156bo58bo22b3o8b5o$157bo9b3o16bo13bo13b 3o21b3o9b3o$158bo8bo17b3o11b3o12boboo19bobobo8boo$139boo18bo8bo15boobo 5bo4boobo13b3o$138bobo17boo24b3o5b3o3b3o14boo$140bo44boo4bobboo3boo$ 191booboo40boo3boo9bo$190b3obbo11bo5bo10boo11booboo9boo$191boobo11b3o 3b3o9boo11booboo9bobo$192bo13bobooboobo15b3o6bo$185b3o4bo3bo10b3ob3o7b 3o5bobbo$166boo17bobbo3bo14boo3boo6bo3bo7bo14bo$166boo17bo6bo27bo4bo6b o13boo$185bo6boobo14bo14bo3bobo14bobo$166boo18bobo6boo12bobo8bo4bo$ 167bo40bo3bo11bo$166bo23boo17bobo9bobo18bo$165bo26bo16b3o29boo$157boo 5bo14bo5bo8bo7bo38bobo$157boo5boo12b3o3b3o7bo6b3o42bo$158bo18boobo3bob oo3bobo7boboo17boo21b3o$177b3o5b3o4bo9b3o3booboo9bobo19boobo$178boo5b oo15boo4booboo9bo21b3o$208booboo31b3o$129bo13bo12boo24bo27bo34boo$128b 3o11b3o12bo23b3o33boo$128boboo4bo5boboo10bo23bo3bo24b3o5bobo$129b3o3b 3o5b3o10boo59bo$129boo3boobo5boo50boo$156boo22booboo9boo$156bo25bo13bo 15boo$157bo54bobo12bo$134bo23bo53bo13boo$134b3o5b3o14bo20bo3bo5boo5bo 28bobo$135bo5bobbo13boo19bobobobo3boo5b3o$135bobbo5bo35b5o6bo3boobo$ 136b3o5bo35bo3bo10b3o$141bobo36bo3bo10b3o$180bo3bo10b3o$181booboboo8b oo$144b3o3b3o30bobboo14boo$127bo16bobbobobbo13boo34bobo$126b3o15bo7bo 13boo34bo$125boobo15bo7bo$125b3o17bobobobo14boo$126boo39bo$148bo17bo 45bo$130bobo14b3o15bo45boo$130boo14booboo13bo46bobo$132b3o12b3o14boo 50b3o$147b3o65bobbo$147b3o68bo$147bobo27bo36bo3bo$147bobo25boo41bo$ 136boo10bo7boo18boo37bobo$137boo18bo29boo$136bo19bo30bobo$156boo29bo$$ 141boo13boo$142boo12bo$141bo15bo39bo$158bo37boo$147bo11bo36bobo$146boo 10boo$141bo5boo$140b3o3bo$139boobo$139b3o$139b3o$140boo30boo$166boo4bo bo$166boo4bo$129bo13bo$128b3o11b3o11boo8boo$127boobo5bo4boobo12boo8bo$ 127b3o5b3o3b3o12bo9bo15bo$128boo4bobboo3boo21bo15boo$134bo3bo25bo16bob o$135boobo25boo$137boo$$142b3o$142bobbo$142bo13boo$142bo14bo$143bobo 10bo$156boo$133boo$133boo21boo$127bo16bo5bo5bo$126b3o7bo6b3o3b3o5bo$ 126boboo5b3o5bobooboobo6bo$127b3o4b5o5b3ob3o8bo$127boo4boo9boo3boo7boo $134b5o$63b3o11b3o55b3o9bo31b3o11b3o48b3o11b3o$63bobbo10bobbo55boo8bob o29bobbo10bobbo48bobbo10bobbo$63bo6b3o4bo67bo3bo31bo4b3o6bo48bo6b3o4bo $63bo5bobbo4bo69bo18boo13bo4bobbo5bo48bo5bobbo4bo$64bobo6bo4bobo85bo 11bobo5boboobbobo50bobo6bo4bobo$68bo66bo31bo81bo$69bo4bo60boo29boo82bo 4bo$74bo59bobo7b3ob3o104bo$64bo7bo93boo12bo8bo63bo5bo$63b3o5boo59bo12b o3bo17bo11b3o5bobo62b3o3b3o$63boboobb3o59b3o6bo5b3o17bo11boobo70b3o3bo boo$64b3o3bo59boobo6boo23bo12b3o4bobbo64boo4b3o$64boo64b3o6bo3boo5bo 13bo14boo4b3o61b5o5boo$130b3o7bobbobo3bobo12boo20bo62b3o$130b3o12bo3bo bbo$131boo10b4obobbo20bo5bo75bo$143bo3bobobo19b3o3b3o74bo$56b3o3b3o14b 3o61bo5bo20boobo3boboo14b3o44b3o7bo6b3o3b3o$56bobbobobbo13bobbo61bo6bo 5boo12b3o5b3o14bobbo42bobbo6boo5bobbo3bobbo$56bo7bo16bo60bo6bo7bo13boo 5boo15bo48bo7boo7bo3bo$56bo7bo16bo61bo5bo6bo38bo48bo8bo7bo3bo$57bobobo bo14bobo62bo4bo7boo17bo20bobo42bobo14bobo5bobo$74bobo67boo28b3o$60bo 12bobbo79boo15bo3bo15bo68b3o$59b3o14bo79bo16bo3bo15bo68b3o$58booboo10b oo82bo32b3o69bobo$59b3o96bo14bo3bo12bo72bo$59b3o97bo13bo3bo71b3o11bo$ 59b3o96boo13booboo73bo$59bobo8boo102bobo73bo$59bobo8bobo102bo9b3o73bo 3bo$60bo9bo114bo75booboo$74b3o109bo60b3o4b3o5bobo$63bo10bobbo75bobo10b oo79bobbo5bo$63boobo7bo79boo10bo80bo7bo7bo$67bo6bo3bo75bo12bo12b3o64bo 3bo11bo$64boo8bo3bo87boo12bo66bo3bo11bo$74bo106bo65bo$75bobo88boo80bob o$61bo105bo8boo$61b3o102bo10bo76boo10bo$62boo101bo9bo5b3o71b4o7boo$ 164bo11bo4bobbo72boo8bo$164boo15bo76boobo4bobo$56bo5boo117bo3bo74bo5b oo$56bobo5bo116bo78bo5boo$56boo3bobo118bobo$62bo19bo13bo130bo13bo$81b 3o11b3o58boo68b3o11b3o$81boboo4bo5boboo58bo21b3o11b3o30boboo4bo5boboo$ 82b3o3b3o5b3o57bo8b3o10bobbo10bobbo31b3o3b3o5b3o17bo$82boo3boobbo4boo 58boo7bo15bo4b3o6bo31boo3boobbo4boo17bobo$87bo3bo74bo14bo4bobbo5bo36bo 3bo22bobbo$87boboo65boo20bobo5boboobbobo37boboo24bo$87boo67bo75boo$ 157bo$95b3o60bo67b3o$61bo13bo12bo5bobbo61bo20bo8bo35bobbo19bo13bo$60b 3o11b3o10bobo7bo60boo19b3o5bobo38bo18b3o11b3o$59boobo5bo4boobo13bo6bo 80boobo46bo17boobo5bo4boobo$59b3o5b3o3b3o11bo6bobo81b3o4bobbo36bobo18b 3o5b3o3b3o$60boo5boboo3boo15boo86boo4b3o59boo5boboo3boo$88booboo93bo 49boo$90bo75boo68boo$80bo16bo5bo62bo53bo5bo16bo$70bo8b3o14b3o3b3o62bo 51b3o3b3o6bo7b3o12bo$60b3o5b3o7boobo13boobo3boboo60boo4b3o3b3o14b3o21b obooboobo5b3o5boobo10boo4b3o10bo$60bobbo5bo8b3o14b3o5b3o65bobbo3bobbo 13bobbo21b3ob3o5b5o4b3o17bobbo10bo$60bo5bobbo9boo15boo5boo61boo6bo3bo 16bo24boo3boo9boo4boo14bobbo11b3o$60bo5b3o98bo6bo3bo16bo36b5o16bo7bo$ 61bobo36bo65bo4bobo5bobo14bobo24bo9b3o16bo3boo4bobo$99b3o27bo13bo21bo 56bobo8boo17bo$98bo3bo25b3o11b3o19bo10b3o15bo27bo3bo27bo$52b3o3b3o24b oo11bo3bo25boboo4bo5boboo13boo3boo9b3o15bo28bobo38b3o3b3o$52bobbobobbo 16bo8boo41b3o3b3o5b3o12bobbo13b3o12b3o29b3o21bo9bo5bobbo3bobbo$52bo7bo 15b3o6bo12bo3bo26boo3boobbo4boo13bobbo28bo44bo9b3o6b3o8bo3bo$52bo7bo 15boboo18bo3bo31booboo20boo73boo9boboo5bo10bo3bo$53bobobobo17b3o18boob oo31bobb3o35b3o56bobo9b3o5bobo5bobo5bobo$77boo11boo7bobo33boboo17boo 17b3o43booboo20boo7boo$56bo28bo5boo7bo36bo19bo27b3o33booboo12bo27b3o$ 55b3o14bobo9b3o3bo42bo3bo4b3o11bo28bo35booboo4bo6b3o26b3o$55b3o15boo9b oboo49bo3bobbo11boo16bo3bo7bo3b3o30bo5boo6boboo25b3o$70b3o12b3o49bo6bo 28bo5bo9bobbo36bobo6b3o$85b3o46boboo6bo11boo34bo29b3o13b3o$85b3o45boo 6bobo12bo17bo3bo9bo3bo45b3o12bo12b3o$54bo3bo26boo3boo65bo17b3obboboboo bbo3bo45boo13boo11b3o$54bo3bo31b3o45boo18bo20bo6bo5bo33bo25bobo$53bobo bobo7boo24boo7b3o32bo6b3o3b3o6bo13boo3bo6bo3bobo34boo$55b3o8boo25b3o4b ob3o22bo7bo8bobbobobbo5boo12bobbobbo3b3o36boo3bobo36bo3bo$3bo13bo23bo 13b3o10bo24bobboboo4bo21b3o6bo8bo7bo19bobbo3bob3o36b3o4boo29bo5bo5bo 35bo13bo$bb3o11b3o22bobo12bo42bo3bo21boobo7bobo5bo7bo20boo4bobo39b5o 32boo4bo5bo34b3o11b3o$boobo5bo4boobo22boo54bo27b3o9bo7bobobobo25boo43b oboo31bobo44boobo5bo4boobo$b3o5b3o3b3o44boo62boo48boobob3o39boo79b3o5b 3o3b3o$bboo4bobboo3boo43boo31bobbo50bo17boo8boboobboo82bobo36boo4bobb oo3boo$8bo3bo50bo30bo3bo3bo44b3o16bo7b3obobobo80bo3bo43bo3bo$9boobo82b 3obboo44booboo16bo14bo80boo47boobo$11boo81booboo47booboo15boo13bo80bob o49boo$57bo37bobbo48bobo28b3o$16b3o37bobo4bo32boo35boo13bo17boo92bo44b 3o$16bobbo42b3o69boo31bo91b3o43bobbo5bo$16bo45boboo67bo32bo92boboo42bo 7bobo$16bo46b3o80booboo14bo94b3o42bo6bo$17bobo32boo9b3o79bo5bo12bo95b 3obobo39bobo6bo$51boo10boo73boo6bo3bo8boo3boo94boo3bo44boo$7boo44bo85b oo6b3o8bobbo148booboo$7boo9b3o3b3o111bo8bobo8bobbo135b3o3b3o6bo$bo15bo bbo3bobbo120bo10boo136bobbobobbo16bo$3o7bo9bo3bo60b3o11b3o46bo73b3o11b 3o58bo7bo15b3o$oboo5b3o8bo3bo59bobbo10bobbo41boo11boo63bobbo10bobbo58b o7bo15boboo$b3o4b5o4bobo5bobo59bo4b3o6bo42boo11bo9bo56bo4b3o6bo39bo19b obobobo17b3o$boo4boo78bo4bobbo5bo7bo33bo12bo9bo57bo4bobbo5bo39boo42boo $8b5o8b3o60bobo4bo3bobbobo9boo44boo8b3o52bobo4bo3bobbobo39bobo9bo11bo$ 9b3o9b3o67b4o14boo30bo86b4o58bo9b3o$10boo9bobo68bo47b3o13boo71bo58b3o 8booboo$22bo116boobo3boo8bo143b3o$22bo77bo38b3o3b3o9bo65bo76b3o13boo$ 99b3o37b3o16bo63b3o75b3o12boo$9bo27boo52b3o4boobo38boo17bo61boobo75bob o14bo$9boo9bo3bo11boo54boo4b3o57boo61b3o76bobo$8bobo9booboo13bo53boo5b oo121boo77bo$21bobo68booboo38bo13bo24bo13bo122boo$93bobo38b3o11b3o22b 3o11b3o42boo76boo$14bo7bo71bo7bo5bo25boboo4bo5boboo21boboo4bo5boboo24b o5bo10boo78bo$14boo6bo78b3o3b3o25b3o3b3o5b3o6boo6boo6b3o3b3o5b3o23b3o 3b3o$13bobo6bo60b3o15bobooboobo25boo3boobbo4boo8boo5bo7boo3boobbo4boo 23boobo3boboo14b3o52bo$83bobbo15b3ob3o31bo3bo13bo8bo11bo3bo29b3o5b3o5b 3o6bobbo51boo11boo$83bo18boo3boo31bobo3bo19boo11bobo3bo28boo5boo5bo3bo 5bo53bobo10boo$19bo63bo143bo5bo4bo68bo$19boo63bobo18bo35booboo20boo12b ooboo33bo13bo6bobo$18bobo83bobo27b3o6bo23bo14bo4b3o27b3o8b4o$15bo87bo 3bo25bobbo29bo19bobbo111boo5bo$14b3o87bobo29bo5boo21bo23bo27bobo80boo 5b3o$14boboo5bo65boo14bo30bo5b3o19bo24bo28bo83bo4boboo$15b3o3boo3boo 60bobo14bo27bobo6boo15boo3boo20bobo16bobo100b3o$15b3o7bobo62bo13bobo 33b3o15bobbo43boo101b3o$15boo10bo76bobo31bobboo15bobbo44bo23b3o75boo$ 105bo20b3o3b3o3bo4bo15boo17boo9b3o3b3o17b3ob3o8bo$29bo64boo29bobbo3bo bbo4b3o8bo20bo5boo9bobbobobbo19bobo11bo$29boo62bobo32bo3bo8bo8b3o3boo 13b3o5b3o7bo7bo$28bobo64bo6boo3boo19bo3bo16boobo4bo12boobo6b3o6bo7bo$ 125bobo5bobo13b3o4bo13b3o6b3obo6bobobobo20b3o5b3o$150boo4boo13boo5boo 45bo62b3o$99boo28b3o45b3o13bo32bo61bo$98bobo4bo23b3o24boo20boo12b3o94b o$100bo4bo23b3o24bo22bo12b3o$157bo62b3o63boo$145bo12bo61bo64boo$104boo 23b3o12boo13bo61bo65bo$41boo54b3o3bobo23b3o12bobo11boo3boo26bo3bo28b3o $40bobo54bobbo4bo56bobbo14boo9bo3bo28bobbo$42bo54bo64bobbo15boo7bobobo bo27bo$97bo3bo26bo3bo7bo22boo15bo11b3o29bo3bo$44bo52bo29bo5bo5boo51b3o 29bo$44boo52bobo26bo5bo5bobo24boo25bo31bobo$43bobo120bo18boo$124bo42bo 18boo22b3o$125boobbobo3bo30boo17bo24bo62b3o$124boo4bo3boo75bo61bo$134b obo29boo106bo$167bo22boo$166bo24boo78boo$137bo27bo20bo3bo79boo$119boo 15b3o25bo20b3o84bo$56boo60bobo14boobo20boo3boo18boobo$55bobo62bo14b3o 20bobbo22b3o$57bo77b3o20bobbo22b3o$125bo10boo21boo24boo$59bo64boo$59b oo63bobo29boo$58bobo96bo$156bo$156boo100b3o$258bo$156boo101bo$156bo$ 157bo98boo$158bo96boo$159bo97bo$71boo85boo3boo25bobo$70bobo89bobbo24b oo$72bo89bobbo25bo$163boo33bo$74bo121boo$74boo90boo29boo$73bobo90bo$ 167bo$166boo75b3o$243bo$166boo76bo$167bo$166bo74boo$165bo74boo$164bo 77bo$86boo71boo3boo$85bobo70bobbo$87bo70bobbo$159boo$89bo$89boo65boo$ 88bobo66bo$139bo16bo$140boo14boo70b3o$139boo87bo$156boo71bo$132bobo21b o$133boo22bo68boo$133bo24bo66boo$159bo67bo$101boo55boo3boo$100bobo59bo bbo$102bo59bobbo$163boo$104bo$104boo60boo$103bobo60bo$167bo$166boo45b 3o$213bo$166boo46bo$167bo$166bo44boo$165bo44boo$164bo47bo$116boo41boo 3boo9bobo$115bobo40bobbo13boo$117bo40bobbo14bo$159boo22bo$119bo61boo$ 119boo35boo24boo$118bobo36bo$156bo$156boo40b3o$198bo$156boo41bo$156bo$ 157bo38boo$158bo36boo$159bo37bo$131boo25boo3boo$130bobo29bobbo$132bo 29bobbo$163boo$134bo$134boo30boo$133bobo30bo$154bo12bo$155boo9boo15b3o $154boo27bo$166boo16bo$147bobo17bo$148boo16bo14boo$148bo16bo14boo$94bo 13bo55bo17bo$93b3o11b3o36boo11boo3boo$92boobo5bo4boobo35bobo10bobbo47b o13bo$92b3o5b3o3b3o38bo10bobbo46b3o11b3o$93boo5boboo3boo50boo47boboo4b o5boboo$149bo59b3o3b3o5b3o$149boo5boo51boo3boobbo4boo$148bobo6bo22bo 13bo21b3o$103bo52bo22b3o11b3o$101boo4b3o13bo13bo18boo21boboo4bo5boboo$ 107bobbo11b3o11b3o41b3o3b3o5b3o$104bobbo13boobo5bo4boobo17boo22boo3boo bbo4boo12b3o6bo$99bo7bo13b3o5b3o3b3o18bo30b3o17bobbo6bo$98bo3boo4bobo 11boo4bobboo3boo19bo52bo6bo$98bo29bo3bo25bo51bo3bobo$99bo26bo3bobo26bo 47bobo4bobo$109b3o3b3o40boo19b3o6bo25b3o$92bo9bo5bobbo3bobbo8booboo30b oo14bobbo6bo$91b3o6b3o8bo3bo13bo6b3o23bo18bo6bo11b3o3b3o$91boboo5bo10b o3bo20bobbo23bo17bo3bobo11bobbo3bobbo15bo$92b3o5bobo5bobo5bobo10boo5bo 27bo13bobo4bobo14bo3bo17b3o$92boo7boo25b3o5bo28bo19b3o14bo3bo16boobo$ 112b3o14boo6bobo26bo32bobo5bobo13b3o$112b3o15b3o34bo56boo$112b3o15boo bbo31boo5bo5bo16bo6b3o$129bo4bo37b3o3b3o14b3o5b3o$121bo8b3o5bo5bo21boo 4bobooboobo13boobo5bobo$99bo12b3o5b3o8bo5b3o3b3o21bo5b3ob3o14b3o7bo15b obo$99boo11b3o5boboo13bobooboobo20bo6boo3boo15boo7bo14b3o$98bobo20b3o 14b3ob3o20bo53bo$121boo15boo3boo19bo11bo$111bo3bo48boo9bobo24bo3bo$ 104bo5bo5bo24bo18boo12bo3bo12bobo8booboo8bo$104boo4bo5bo23bobo18bo13bo bo12b3o10bobo8boo$103bobo33bo3bo16bo15bo13bo23bobo$127bo13bo17bo16bo 27bo$112bobo12boo29bo16bobo26bo$109bo3bo12bobo28bo17bobo8bo17bo5bo$ 109boo45bo19bo8boo22boo$108bobo27b3ob3o11boo27bobo3bo17bobo$132bo57b3o $106bo19bo5boo5bo3bo12boo32boboo$105b3o17b3o3bobo6b3o13bo34b3o$105bob oo15boobo29bo17b3o13b3o17bo$106b3o15b3o31bo16b5o5bobo3b3o16b3o$106b3ob obo11b3o32bo14b6o4bobo4boo16boobo$106boo3bo12b3o31boo13boo3boo3b3o23b 3o$125boo35boo8bobbobboobobbo15bo8b3o$133boo27bo9bobbobboobobbo14boo9b oo$131boboo8boo18bo9boo4bobo17bobo$132boboo5boobbo18bo11boobobo$133bo bbooboo4boo18bo10bobb3obo$124bo10bobo5boo21bo$124boo14boo25bo7boobo3bo $123bobo40boo7bo6bo$179b3o$166boo11boo$141bo25bo11bo$140bo25bo$135boo bb3o23bo$135b3oboo23bo$136b3o25boo$160boo23bo$161bo22boo$160bo23bobo$ 159bo$158bo$139bo17bo$139boo15bo$138bobo15boo8bobo$166boo$156boo9bo47b o13bo$156bo57b3o11b3o$100bo13bo42bo56boboo4bo5boboo$99b3o11b3o34bobo5b o56b3o3b3o5b3o$98boobo5bo4boobo35boo6bo55boo3boobbo4boo$98b3o5b3o3b3o 36bo6boo60booboo$99boo5boboo3boo47boo6bo49bobb3o$129bo13bo18bo6boo50bo boo$128b3o11b3o18bo5bobo51bo$127boobo5bo4boobo19bo21bo13bo13b3obbo3bo$ 109bo17b3o5b3o3b3o21bo19b3o11b3o11bobbo3bobo$107boo4b3o12boo5boboo3boo 10bo11bo18boboo4bo5boboo13bo4bo$113bobbo37boo11bo18b3o3b3o5b3o13bo$ 110bobbo39bobo10boo18boo3boobbo4boo11bobo$105bo7bo77bo3bo$104bo3boo4bo bo21bo27boo23boboo$104bo31boo4b3o22bo23boo13b3o3b3o$105bo36bobbo20bo 38bobbo3bobbo15bo$115b3o3b3o15bobbo22bo19b3o20bo3bo11boo4b3o$98bo9bo5b obbo3bobbo9bo7bo21bo19bobbo20bo3bo16boobo$97b3o6b3o8bo3bo11bo3boo4bobo 18boo21bo17bobo5bobo13b3o$97boboo5bo10bo3bo11bo26boo25bo42boo$98b3o5bo bo5bobo5bobo9bo26bo22bobo22b3o13boo$98boo7boo51bo48b3o13b3o$118b3o6bo 9bo6bo5bo8bo35boo12bobo11bobbo$118b3o5b3o6b3o5b3o3b3o6bo36boo13bo13boo $117bobobo4boboo5bo7bobooboobo5bo21bo5bo16bo7bo$127b3o5bobo6b3ob3o5bo 21b3o3b3o6bo7b3o$127boo7boo6boo3boo5boo20bobooboobo5b3o5boobo$105bo73b 3ob3o5b5o4b3o5bo3bo9bo$105boo9boo3boo24bo8boo21boo3boo9boo4boo5booboo 8boo$104bobo10booboo24bobo7bo34b5o13bobo9bobo$117booboo23bo3bo7bo24bo 9b3o$119bo26bobo9bo22bobo8boo16bo$110bo23bo11b3o10bo20bo3bo25bo6bo$ 110boo22boo24bo20bobo26bo5boo$109bobo21bobo25bo20bo33bobo$162bo19bo11b o$145booboo13bo17bobo9boo$115bo16bo6bo5booboo14bo16bobo9bobo16bo$115b oo14b3o5boo4booboo15bo16bo28boo$114bobo13boobo4bobo6bo18bo30bo13bobo3b o$130b3o34bo21bo6b3o17b3o$112bo17b3o13b3o17boo11boo3boobboo6boboo15boo bo$111b3o16b3o55bobo6b3o15b3o$111boboo16boo33boo29b3o15b3o$112b3o52bo 29b3o16boo$112b3o51bo15bo14boo$112boo24boobo8boo13bo16bo$125bo12boobbo 7boo12bo$125boo25bo11boo$124bobo14b4o5bobo7boo17bo10bo$144boo3bobbo8bo 16bobo10bo$150boo8bo16bobbo4boo4bo$159bo18bo6boo10bo$158bo26b3o8boo$ 157bo19bobo16bobo$156bo20b3o$145bo10boo20bo$144bobo$143boo11boo$156bo$ 157bo$158bo$140bo18bo25boo$140boo18bo$139bobo19bo$162bo$163bo$164bo17b o$165bo15boo$166bo14bobo$167bo$166boo$$157bobo6boo$158boo7bo$158bo7bo$ 129bo13bo21bo14bo13bo$128b3o11b3o10bo8bo14b3o11b3o$128boboo4bo5boboo9b oo7boo3bobo7boboo4bo5boboo$129b3o3b3o5b3o8bobo3boo7boo9b3o3b3o5b3o$ 129boo3boobbo4boo16bo8bo9boo3boobbo4boo$134bo3bo21bo24bo3bo$134boboo 21bo7bo17boboo$134boo22bo7boo17boo$157bo8bobo$142b3o11bo22b3o$135bo5bo bbo11boo20bobbo$134bobo7bo36bo$137bo6bo11boo23bo$134bo6bobo12bo21bobo$ 138boo17bo$135booboo18bo30boo$137bo21bo29boo$127bo16bo5bo9bo12bo5bo16b o$126b3o14b3o3b3o9bo10b3o3b3o6bo7b3o$125boobo13boobo3boboo9bo9bobooboo bo5b3o5boobo$125b3o14b3o5b3o10bo9b3ob3o5b5o4b3o$126boo15boo5boo12bo8b oo3boo9boo4boo$165bo19b5o$147bo18bo9bo9b3o$146b3o18bo7bobo8boo$166boo 6bo3bo$132boo12bobo26bobo$133boo12bo18boo8bo$132bo34bo8bo11bo$166bo8bo bo9boo$165bo9bobo9bobo$137boo5b3ob3o13bo11bo$132bo5boo6bobo14bo27bo$ 131b3o3bo24bo20bo6b3o$131boboo26bo11boo3boobboo6boboo$132b3o11b3o11bo 21bobo6b3o$132b3o8boo14bo31b3o$132b3o7bobbo12bo32b3o$132boo9boo12bo18b o14boo$156bo19bo$156boo$$156boo15bo10bo$156bo15bobo10bo$157bo13bobbo4b oo4bo$158bo13bo6boo$159bo19b3o$93b3o11b3o50bo10bobo40b3o11b3o$93bobbo 10bobbo40bo9bo9b3o40bobbo10bobbo$93bo6b3o4bo37bo6boo8bo9bo41bo6b3o4bo$ 93bo5bobbo4bo37bo5boo10bo50bo5bobbo4bo$94bobobbo3bo4bobo12bo13bo26bo 21bo13bo14bobobbo3bo4bobo$98boobbobo17b3o11b3o26bo19b3o11b3o17boobbobo $100bo21boboo4bo5boboo26bo18boboo4bo5boboo18bo$101boobo18b3o3b3o5b3o 27bo18b3o3b3o5b3o19boobo$101b3o4bo14boo3boobo5boo27boo11boo5boo3boobo 5boo13bo6b3o$101b3o3b3o104b3o5b3o$107boboo55boo46boboo4boo$108b3o56bo 47b3o4bobo$108boo18bo37bo24bo23boo4bobbo$128b3o5b3o11bo14bo7bo11b3o4b oo30bo$129bo5bobbo10b3o12bo7b3o9bobbo32bo$110bo5bo12bobbo5bo10boboo10b o8boboo11bobbo16bo5bo5boobbo$98boo9b3o3b3o12b3o5bo11b3o9bo10b3o11bo7bo 10b3o3b3o4boobbo$91b3o14boobo3boboo16bobo12b3o8bo11b3o8bobo4boo3bo9bob ooboobo5b3o7b3o$90bobbo4bo3bo5b3o5b3o31b3o7bo12b3o20bo10b3ob3o6b3o6bo bbo$93bo15boo5boo32boo7bo13boo20bo11boo3boo18bo$93bo4bo59bo73bo$90bobo 4bo15bo7bo16bo5bo12bo8bo12bo5bo6bo9bo7bo18bobo$97bobbo11b3o5b3o14b3o3b 3o10bo8bobo10b3o3b3o5b3o6b3o5bobo$97bobbo10bo3bo3boobo13boobo3boboo9b oo7bobbo9bobooboobo7bo5boobo4bo3bo$98boo11bo3bo3b3o14b3o5b3o19boo11b3o b3o6bobo5b3o6bobo$120boo15boo5boo10boo21boo3boo6boo7boo6b3o$111bo3bo 40bo67boo$111bo3bo8bobo14bo15bo24bo41bobo$111booboo8boo14b3o15bo22bobo 40bo$100b3o9bobo11b3o10bo3bo15bo20bo3bo23booboo$102bo10bo46bo21bo25boo boo$101bo59bo33bo12booboo6boo$139booboo18bo31boo14bo8bobo$141bo21bo30b obo22bo$105b3o22boo32bo14b3ob3o23b3o$107bo23boo32bo$106bo19bo3bo8bo3bo 13bo8bo13bo3bo5bo6bo16boo$125b3o10bobobobo11bobo8bo13b3o5boo5b3o15bobo $112bo12boboo10b5o11bobbo7boo21bobo4boboo14bo$110bobbo12b3o11b3o13boo 39b3o$112bo13b3o3booboo4bo24boo29b3o$105b3o3bo14b3o3boob3o29bo29b3o16b 3o$104bobbo18boo4boobboboo3boo21bo30boo12boobbobbo$107bo26boobboobbobb o19bo16b5o24boo5bo$103bo3bo7b3o17bobo4bobbo18bo16boob3o27bo3bo$107bo9b o25boo18bo18b5o31bo$104bobo9bo18bobboo22bo20boo30bobo$135bo4boo19bo22b o$135bo3bobbo17bo$135b3obo19bo$136boob3oboo13bo$137b3o17bo8bo32boo$ 138bo17bo8bobo31bobo$156boo7bobbo30bo$166boo$156boo$156bo$157bo$158bo$ 130b3o26bo$132bo27bo$131bo29bo$162bo$163bo$149bo14bo$150boo13bo$149boo 6bo8bo17boo$156bobo8bo16bobo$155bobbo7boo16bo$156boo$166boo$167bo$166b o$165bo$145b3o16bo$147bo15bo$146bo15bo$161bo$160bo$159bo$158bo$157bo$ 156bo$156boo! CB 1,1,1,1 golly-3.3-src/Patterns/Life/Puffers/c4-diagonal-puffer.rle0000644000175000017500000001652112026730263020365 00000000000000#C Highly non-optimized dirty c/4 diagonal puffer (p4284). #C Used as the basis for c4-sideways-rake.rle (in Rakes folder). #C Notice the interesting effect of "tunneling gliders": #C Each puff cloud releases a pair of forward gliders, which crash #C into the next puff cloud and are re-emitted from the other side #C of the cloud with the same position and timing. It looks as if #C there's a hyperspace bypass tunnel under the junk. This is due to #C the puffer traveling at the same speed as the forward gliders that #C it generates -- it would occur with any puffer that produces #C forward gliders, *unless* the puff cloud producing them is thin #C enough to let previous gliders through to interfere with the #C glider-producing reaction at the front of the cloud. This could #C create higher-period orbits at the back end of the puffer. #C Puffer constructed by Jason Summers, 30 September 2005. x = 897, y = 897, rule = B3/S23 18boo$17boo$19bo$21boo$20bo$$19bobbo$11boo5boo$10boo5bo$12bo4bobo$8bo 5boobbo$7boo5boo$7bobo8bo26b3o$17bobo25bobb3o$10boo6bobo25bobo$10boo7b obo29bo$20boo27bo$bo6boo3bo37bobo$oo5bobbobobo9boo18boobo6bo$obo3boobo 3bobo7bobbo16boo3bobbobbo$4bo9bobo7bobo10b3o4bobbobbo3bo$3bo11boo8bo 11bo6bobbobbo3bo$3bobbo33bo3bo6bobo$19bo17bobbo8boo$18bobo17bobbo6b3o$ 18bobbo9bo7bo5bo3bo23boo$19boo9bobo8boboboobo23boo3bo$29bo13boo29boboo $29boo16bo28b3o$27boo47bo$26bobo15bobbo30b3o$25bo45boobo4boo$26bo44bob oo3bobo$65boo4boboo3b3o$64boo6bo5b3o$65bobo4boo4bobo$65b3o4boobboo$20b oobo41boo6bobo$20bo3bo42bobo3boo3bo$20bo4bo47b4o$22boo45bobo$24bobo44b 4o$71b4o$19bo6boo44boo$18b5o4bobbo$12boo4bo6boo$12bobo11bo$12bo5boboo 6bobo$13boo4bo4bobo$13bobbo6b3o$13bo6booboo$15bobobobbo$$17bo4bo$18b4o 8$495boo$483b3o9bobo$34bo448bobb3o6bo9bo$33b5o446bobo16boobo$33bobboo 451bo4boobbo3boobbo$35boobo448bo6boobboboobbo$489boboobo3b5o$38bobo 457boo$490bobb6o$31b3o6b3o448b7o$26bo4bobb3o4b3o449b3o$25boo5boob5ob3o $25bobo3b3o4booboo$37bobo$27b3o6bobbo$26b3o7bo$28bobob4obbo$30booboo 478boobo7b3o$30b6o477bo3bo6bo$513bo4bo7bo7boo$515boo7bobo4boobo$517bob o4b3obobboo$523bo3boobboo$519boob4oboo$520b7o72$510bo$509boo$509bobo$$ 511b3o$510b3o$512bobo$514b3o$514b3o$517bo$514bobbo$513bo3bo$509booboo 3bo$508boo7bo$510boboobbo$516bo$513bobo$514bo$513bo$512bobo$512bobo$ 511bo$511boo$511boo8$525boobo$525bo3bo$525bo4bo$527boo$529bobo$$524bo 6boo$523b5o4bobbo$517boo4bo6boo$517bobo11bo$517bo5boboo6bobo$518boo4bo 4bobo$518bobbo6b3o$518bo6booboo$520bobobobbo$$522bo4bo$523b4o156$551b 3o$551bo$552bo$554boo$555bo$$552bo$549b4obo$549bo4bo$550bo4boo$552bobb 3o$556boo$553booboo$553boob5o$551boo3boo$550boo4bo113boobo$551boob3o 113bo3bo$546boobb4obbo113bo4bo$545bobboboobooboo85b3o26boo$544boobo95b o30bobo$540boobo3bo3bo4boo78b3o6bo$540bo6bo88bo6bobo23bo6boo$540boboo 3boo88bo4boob4o19b5o4bobbo$547b3o89b4ob5oboo10boo4bo6boo$545boboo91boo 7boobo9bobo11bo$544boobobo112bo5boboo6bobo$545bobbo114boo4bo4bobo$537b oo6bobobo99bo5bo7bobbo6b3o$536boo8bo102bobobob3o5bo6booboo$538bo5bobo 102boobo5bo6bobobobbo$540bobobbo105b8o$539booboobo107b4o10bo4bo$530boo 13bo122b4o$530bobo3bobboo3bo$530bo3bobboo5bo$533boo3bo$533bo$536boo 146bo10boo$538bo144b5o6boo$683bobboo8bo7boo$534b3o16b3o129boobo5boo6b 3obo$526b3o5b3o16bo140boo3boboo$526bo6bobo18bo133bobo6boo$527bo4boo 159b3obo4bo$529b4obo155b3o3bo4bo$530boo159bo7bo$691bo6bo$$694bo17$666b oo$666bobo$666bo$669bo$669boo$669boo$668boo$664booboo$664bo4bo$664bob 4o$668boo$668boo$668boo$670bo$669boo$669bo$670bo15$695boobo$695bo3bo$ 695bo4bo$697boo$699bobo$$694bo6boo$693b5o4bobbo$687boo4bo6boo$687bobo 11bo$687bo5boboo6bobo$688boo4bo4bobo$688bobbo6b3o$688bo6booboo$690bobo bobbo$$692bo4bo$693b4o5$771bo$770boo$770bobo$63boo$63bobo707boo$63bo 709boobb3o$64boo711boobo$64bobbo707bo4bo$64bo709b3o4bo$66bobo705bo5bo 35b3o$70bo690boo12bobobboo34bobb3o$68bobbo688boo28boo25bobo$68bobbo 690bo9b3o15bobo29bo$70b3o691boo6booboo6boo5bo29bo$66b3ob3o691boobboobb ob3o6bobo3boobbo28bobo$62b3oboobb3o694boobobboo8bo11bo19boobo6bo$62bo 7boo696bo4boo11bo3boo3b3o16boo3bobbobbo$63bo6boo693boo3bo15boo4boo4bo 9b3o4bobbobbo3bo$66b5o694boo25b7o9bo6bobbobbo3bo$68boo695bo27b4o14bo3b o6bobo$67boo697booboo37bobbo8boo$67boo699bobo25b3oboo7bobbo6b3o$66bobo 726boobobooboo5bo5bo3bo$65boo728boobbobboobo6boboboobo$65bobo729bo16b oo$64bo753bo$65boo$815bobbo$171bo$159boo9boo$158boo3bo6bobo669bo$160bo boo15b3o648boo9boo$162b3o5bobo4booboo647boo3bo6bobo$79b3o80bo6boobobob o654boboo15b3o$79bo84b3obo6boboo654b3o5bobo4booboo$82bo82boo7bo658bo6b oobobobo$79bobbo82boo5boo661b3obo6boboo$80bobbo83b5o25b3o636boo7bo$81b o115bobb3o633boo5boo$83bobo112bobo637b5o$85boo116bo$86bo114bo$85boo 116bobo$84b3o109boobo6bo$79boobooboo108boo3bobbobbo$79bo3boboo102b3o4b obbobbo3bo$79bob3obbo102bo6bobbobbo3bo196boo$84boo106bo3bo6bobo197bobo $83b3o103bobbo8boo200bo$190bobbo6b3o203bo$191bo5bo3bo192b3o9boo$82b3o 108boboboobo193bo11boo$82b3o110boo198bo9boo$199bo197boo5boo$81boo313b oo4boobbo$81bo114bobbo202b3o$390bo4bo3bobboo$389boo5bobbo$389bobo4boo bbo$393bobo$382b3o7boobo$382bo$384bo7boo$382bobo8bo$381bo5bo3bo3boo$ 380boo4b4obb3o$379bo10boo$379bob7obo$380bo3b3obo$369boo14bobobo$369bob o5boboo$362boo5bo6b5obo$362bobo3boobbo3boboo$362bo11boo3boo21boo$365bo 3boo3boobbobo21bobo$365boo4boo5bo23bo$371b10obo$372b5o3bobo$375bo$375b o$375bo11$843bo$842b5o$842bobboo$844boobo$$847bobo$$840b3o6b3o$835bo4b obb3o4b3o$834boo5boob5ob3o$834bobo3b3o4booboo$846bobo$836b3o6bobbo$ 835b3o7bo$837bobob4obbo$839booboo$839b6o21$887bo$886b5o$886bobboo$888b oobo$$891bobo$$884b3o6b3o$879bo4bobb3o4b3o$878boo5boob5ob3o$878bobo3b 3o4booboo$890bobo$880b3o6bobbo$879b3o7bo$881bobob4obbo$883booboo$883b 6o12$382boo$382bobo$382bo$385bo$385boo$385boo$384boo$380booboo$380bo4b o$380bob4o$384boo$384boo$384boo$386bobb3o$385boo4bo$385bo4bobo$386bo4b oo$390boboo$392boo$389booboo$390boboo$390bobo$391boo4$385b3o$385bobb3o $386bobo45b3o$391bo42bo$389bo37b3o6bo$391bobo33bo6bobo$384boobo6bo33bo 4boob4o$383boo3bobbobbo35b4ob5oboo$377b3o4bobbobbo3bo36boo7boobo$377bo 6bobbobbo3bo$380bo3bo6bobo$377bobbo8boo$378bobbo6b3o$379bo5bo3bo$381bo boboobo$383boo$387bo$$384bobbo3$400boo$399boo$400bobo$400b3o$400boo64b 3o$402bobo61bobb3o$467bobo$404bobo65bo$406b3o61bo$406bo65bobo$405bo59b oobo6bo$400boboobo4bo53boo3bobbobbo$399booboobo52b3o4bobbobbo3bo$399bo bo4bo51bo6bobbobbo3bo$404boo55bo3bo6bobo$404bo3bo49bobbo8boo$403bo3bo 51bobbo6b3o$460bo5bo3bo$403bobbo55boboboobo$402boobo58boo$402bo65bo$ 401boo$401bo63bobbo$402bo54$491bo$490boo$490bobo$$493boo$493boobb3o$ 497boobo$495bo4bo$494b3o4bo$494bo5bo$481boo12bobobboo$480boo$482bo9b3o $484boo6booboo$484boobboobbob3o$487boobobboo$488bo4boo$485boo3bo$485b oo$485bo$486booboo$488bobo$$493b3o$493bo$494bo$496boo$497bo$$494bo$ 491b4obo$491bo4bo$492bo4boo$494bobb3o$498boo$495booboobboo$496boboob3o $496bobobbobbo$497boobboo$503bo$501boo$501boo$503bo$502boo$502bo$503bo 3$497boobo$497bo3bo$497bo4bo$499boo$501bobo$$496bo6boo$495b5o4bobbo$ 489boo4bo6boo$489bobo11bo$489bo5boboo6bobo$490boo4bo4bobo$490bobbo6b3o $490bo6booboo$492bobobobbo$$494bo4bo$495b4o4$512bo$511boo$511bobo$$ 513b3o$512b3o65boo$514bobo62boo3bo$516b3o62boboo$516b3o64b3o$519bo63bo $516bobbo65b3o$515bo3bo58boobo4boo$511booboo3bo58boboo3bobo$510boo7bo 52boo4boboo3b3o$512boboobbo52boo6bo5b3o$518bo53bobo4boo4bobo$515bobo 54b3o4boobboo$516bo55boo6bobo$515bo58bobo3boo3bo$514bobo63b4o$514bobo 59bobo$513bo64b4o$513boo63b4o$513boo64boo26$617boo$616boo3bo$618boboo$ 620b3o$620bo$622b3o$615boobo4boo$615boboo3bobo$609boo4boboo3b3o$608boo 6bo5b3o$609bobo4boo4bobo$609b3o4boobboo$609boo6bobo$611bobo3boo3bo$ 617b4o$613bobo$615b4o$615b4o$616boo! golly-3.3-src/Patterns/Life/Puffers/puffer-train.rle0000644000175000017500000000074012026730263017414 00000000000000#C Puffer train #C This was created simply by perturbing the sides of a B-heptomino #C with two LWSS's. A B-heptomino is a naturally occurring object, #C a precursor to the Herschel pattern, which lurches forward at the #C speed c/2 before its own debris usually destroys it. #C -- Not in this case! The LWSS escorts keep the B-heptomino alive. #C From Alan Hensel's "lifebc" pattern collection. x = 5, y = 18, rule = B3/S23 3bo$4bo$o3bo$b4o4$o$boo$bbo$bbo$bo3$3bo$4bo$o3bo$b4o! golly-3.3-src/Patterns/Life/Puffers/pi-fuse-puffer.rle0000644000175000017500000000247112026730263017652 00000000000000#C Pi fuse burning puffer #C A line puffer with puff suppressors correctly aligned to produce #C just two rows of blocks with exactly the right period to be eaten #C by a pi-heptomino repeatedly. But the pi-heptomino can never catch #C up. This is an example of a spaceship that grows while traveling. #C By Dean Hickerson and Al Hensel, May 1994. #C From Alan Hensel's "lifebc" pattern collection. x = 21, y = 87, rule = B3/S23 4bobo$4bobbo5bo$7boo4b4o$9bo5boo$7b4o7bo$6bo4bo3b4o$8bobbo7bo$8bobbo3b obb3o$10bo6b3o$4bob4o8bo$4bo3bo4bob3o$7bo5boobbo$5bobo6b3o$14bo$6b3o7b o$7boo5bobo$6b3o8bo$14bobo$5bobo8bo$5bobbo5bo$8bo5b3o$6bobbo5b3o$8boo 5boo$9bobobboo$9boboboo$9bo$6bobboboboo$8boobobboo$6bobbo5boo$9bobobbo boo$6bobbobob3obbo$oo4bobbo8bo$oo4bobbobob3obbo$6bobbobobboboo$9bo5boo $6bobbobobboo$8booboboo$6bobbo$9boboboo$6bobbobobboo$6bobbo5boo$9bobo bboboo$3o3bobbobob3obbo$bbo5boo8bo$3o3bobbobob3obbo$9bobobboboo$6bobbo 5boo$6bobbobobboo$9boboboo$6bobbo$8booboboo$6bobbobobboo$9bo5boo$6bobb obobboboo$oo4bobbobob3obbo$oo4bobbo8bo$6bobbobob3obbo$9bobobboboo$6bo bbo5boo$8boobobboo$6bobboboboo$9bo$9boboboo$9bobobboo$8boo5boo$6bobbo 5b3o$8bo5b3o$5bobbo5bo$5bobo8bo$14bobo$6b3o8bo$7boo5bobo$6b3o7bo$14bo$ 5bobo6b3o$7bo5boobbo$4bo3bo4bob3o$4bob4o8bo$10bo6b3o$8bobbo3bobb3o$8bo bbo7bo$6bo4bo3b4o$7b4o7bo$9bo5boo$7boo4b4o$4bobbo5bo$4bobo! golly-3.3-src/Patterns/Life/Methuselahs/0000755000175000017500000000000013543257426015247 500000000000000golly-3.3-src/Patterns/Life/Methuselahs/ark2.rle0000644000175000017500000000024112026730263016515 00000000000000# ark2 -- 19 cells, stabilizes at 8120878 gens, found by Nick Gotts. x = 53, y = 44, rule = B3/S23 50b3o28$12bo$12bo$13boo$15bo$15bo$15bo$15bo6$oo$bbo$bbo$3b4o! golly-3.3-src/Patterns/Life/Methuselahs/temp-pulsars-big-s.rle0000644000175000017500000000075612026730263021324 00000000000000#C Runs for 21035 gens. Initial pop = 32. Final pop = 2570. #C Final census includes a 'big S' (a 14-cell still-life), which forms #C in gen 20040 from a collision between a pi-heptomino and a boat. #C The pattern also produces 2 temporary pulsars, one in gens 10105 to 10153, #C the other in gens 10338 to 10735. Found by Paul Callahan, 1997. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 8, y = 8, rule = B3/S23 obo3b2o$3ob2o$obobobo$3bo3bo$o2bob2o$obo4bo$3o2b3o$2o3bobo! golly-3.3-src/Patterns/Life/Methuselahs/acorn.lif0000644000175000017500000000020012026730263016743 00000000000000#Life 1.05 #D Acorn #D The most vigorously growing 7-cell methuselah pattern. #D Found by Charles Corderman. #P .* ...* **..*** golly-3.3-src/Patterns/Life/Methuselahs/lidka-predecessor.rle0000644000175000017500000000050112026730263021255 00000000000000#C 2-gen predecessor of Lidka. Runs for 29055 gens. #C Initial pop = 13. Final pop = 1625/1623. Gliders = 28. #C Found by David Bell, 15 July 2005 #C Lidka found by Andrzej Okrasinski, 13 July 2005 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 9, y = 15, rule = B3/S23 bo$obo$bo8$8bo$6bobo$5boobo$$4b3o! golly-3.3-src/Patterns/Life/Methuselahs/blom.rle0000644000175000017500000000034412026730263016613 00000000000000#C Blom. Runs for 23314 gens. Initial pop = 13. Final pop = 2740. #C Found by Dean Hickerson, 7 July 2002 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 12, y = 5, rule = B3/S23 o10bo$b4o6bo$2b2o7bo$10bo$8bobo! golly-3.3-src/Patterns/Life/Methuselahs/justyna.rle0000644000175000017500000000044412026730263017360 00000000000000#C Justyna. #C Runs for 26458 gens. Initial pop = 20. Final pop = 3548/3546. #C Gliders = 43. Found by Andrew Okrasinski, 30 May 2004 #C See also http://www.math.ucdavis.edu/~dean/RLE/methuselahs.html x = 22, y = 17, rule = B3/S23 17bo$16bo2bo$17b3o$17bo2bo2$2o16bo$bo16bo$18bo8$19b3o$11b3o! golly-3.3-src/Patterns/Life/Methuselahs/rabbits-relation-17465.rle0000644000175000017500000000050012026730263021601 00000000000000#C Rabbits relative. #C Runs for 17465 gens. Initial pop = 11. Final pop = 1749. #C May be the longest-lived 11-cell pattern within a 11x11 square. #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 6, y = 4, rule = B3/S23 ob3o$o4bo$obobo$bo2bo!golly-3.3-src/Patterns/Life/Methuselahs/ark1.rle0000644000175000017500000000022412026730263016515 00000000000000# ark1 -- 16 cells, stabilizes at 736692 gens, found by Nick Gotts. x = 32, y = 29, rule = B3/S23 27bo$28bo$29bo$28bo$27bo$29b3o20$oo$bbo$bbo$3b4o! golly-3.3-src/Patterns/Life/Methuselahs/iwona.rle0000644000175000017500000000043112026730263016774 00000000000000#C Iwona. #C Runs for 28786 gens. Initial pop = 19. Final pop = 3091. #C Gliders = 47. Found by Andrew Okrasinski, 20 August 2004 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 20, y = 21, rule = B3/S23 14b3o6$2bo$3b2o$3bo14bo$18bo$18bo$19bo$18b2o$7b2o$8bo5$2o$bo! golly-3.3-src/Patterns/Life/Methuselahs/natural-LWSS.rle0000644000175000017500000000052512026730263020117 00000000000000#C Runs for 23334 gens. Initial pop = 12. Final pops = 2898/2895 #C May be the longest-lived 12-cell pattern within a 12x12 square. #C Emits a LWSS in gen 13811. #C See also http://www.radicaleye.com/DRH/methuselahs.html #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. x = 8, y = 5, rule = B3/S23 4b3o$3bo$o5bo$b2o2bobo$bobo! golly-3.3-src/Patterns/Life/Methuselahs/rabbits-relation-17423.rle0000644000175000017500000000050112026730263021574 00000000000000#C Rabbits relative. #C Runs for 17423 gens. Initial pop = 10. Final pop = 1749. #C May be the longest-lived 10-cell pattern within a 10x10 square. #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 6, y = 6, rule = B3/S23 bo$2obo$4b2o$o2bo$o$o! golly-3.3-src/Patterns/Life/Methuselahs/rabbits.lif0000644000175000017500000000060012026730263017273 00000000000000#Life 1.05 #D Rabbits #D Another small but vigorously growing population -- #D 9 cells in a 7x3 rectangle; runs for 17331 generations. #D (If you look closely you can see a male and female rabbit!) #D Gens 4760-5165 include a rather rare 16-bit still-life #D called a "scorpion". Andrew Trevorrow discovered Rabbits #D in 1986 using a Methuselah search program. #P *...*** ***..* .* golly-3.3-src/Patterns/Life/Spaceships/0000755000175000017500000000000013543257426015067 500000000000000golly-3.3-src/Patterns/Life/Spaceships/Cordership-LWSS-freeze-tag.rle0000644000175000017500000004307512026730263022431 00000000000000#C eight p384 c/12 forward rakes playing Freeze Tag with an LWSS #C to produce a p384 spaceship: David Bell, 5 June 2005 #C (adapted from a previous version from 29 February 2004) x = 642, y = 598, rule = B3/S23 7bo$6boo$6bobo$bb3o$bbobbo$bbo$bbo$3bobo20$33boo$33bobo$33bo4$26bo$25b oo$25bobo8$39bo$38boo$38bobo$15boo$14boo$16bo10$314b3o$314b3o$$314bob oo$314bo3bo$316b3o$71bo259boo$70boo259boo$70bobo$$315bo$314bobo$315bo$ 314boo$314boo23boo$315bo23boo$313boboo$58boo254boboobo9boo$57boo255bo 4bo$59bo257bobo3$308bo19boo$307bobo17bobo$307bobo16b4obo$51b3o253bobbo 15bob6o$51bo174bo7bo73bobo14boob7o$52bo172b3o5bobo75bo14b3o3bobo$224b oob4obbobbo73boo$225b3obbo79bo$68boo156bobboobbo$67boo161boobobo$69bo 164bo10boo$97boo146boo61bo$97bobo207bobo$97bo211bo$309bo$309bo$$90bo 219bo$89boo162boo51boob3o$89bobo138bo22boo53b3oboo$229b4o6boo59bo9bobo $228bo4bo4b3oboo65boo$227boo10boob3o51bo7bo4b3o$228boboboo4b3oboo52bo 8bobb3o$229b3o6boo55bo4boo3bobb3o8boo$230bo65bobo6bobboobbo6boo$296bob oo10bobo$103bo114b3o6bo82b3o$102boo113bo4bo3bobo72bo$102bobo112bo4boo 3bo$79boo136bo6bo$78boo138b3obobbobo$80bo141b5o100boo$227bo99boo$$321b o$319boobo$317booboboo33boo$289bo29bo37b3o$288b3o24bobo39boobo$287bobo bo69bo13bo$286b3ob3o22boo36bo3boo3bo12bo$224bo75boo6bo54bo11bo$224bo 63bob3o6bo7bo52bobo$224boo62b5o6bo3bo3bo52bo$227bo60boobboo5bo3bo51bo 4bobo13bo$211bo13booboo35b3o22boboo5bo74booboo4boo$208b4o13boobbo34bo 3bo23boo6b3o56b4o20boo$135bo88bo4bo34bo3bo19bobobbo65boo12bobo$134boo 87boobobo35bo3bo12b3o3bobobbo80bo3bo$134bobo82boo3boboo5boo46b3o4bo84b oobbo9boo$211bobo7bobo9boo30booboo9boo4bo88b3o9bo$212bo53bobbo9b3obobo 89bo5bobbo$210boo55bobo10boo3bo95bobb5o$210bobbo54boo10b5o96boob4o$ 209booboo51bo3bo12bo104boo$264bobobobo116b3o$265bo102b3o16b3o$363boo3b obo6bo$122boo111boo126boobbo3bo3booboo$121boo112bobo42boobbo65bobo14bo bbobo6bo$123bo110boobo111bo25bo3bo$235boboo41bo3bo65bobbo15b3o4b3o$ 235b6o39bo71bobo15bo$236b3oboo39bobo71bo$237bobbo113b3o$178boobo55b3o 41b3o70bo12bobbo$115b3o59b3obo6bobo12b3o64boo80boo13bobbo$115bo60bo4bo bo4bo38bo42boo31bo50bo12boo$116bo60boo6bobo3bo15boo18bobo22boo49bobo 46bobbo$178bo3bobbobboo19bo17boo26boo4bo41boo47bobo$181boboo3bo14b4obo 43boob4o3bo89bo$132boo46bobo20b5o41b5o4b4o$131boo47bobo69b3o6bo86bo$ 133bo119bo93b3o$161boo40bobo46b3o23boo66booboo$161bobo39bobo53bo12boo 4boo65boobobo$161bo42bo54bo12boo70b3obb3o$203bobo139bo6bo10boo$204boo 140b5obo10boo$204bo142b4oboo$154bo43boo152bo$153boo30bo9bob4o150bo$ 153bobo24bo3b5o5boobo3boo$179bobo7boo4bobbooboo77boo$179bo7boboo5b6o 78boo$180bo8boo6bo72bo78bo21boo$181bo3b4o79boobo75boobo20boo$186b3o65b oboobo9boboo140b3o$253bo4b3o10bo78bo62bobo$254bo5bo86bobbo61bo3bo$167b o20bo66bo3bo88bo63bo3bo$166boo19bobo66bobo153bo17boo$166bobo18bobo58bo 104boo57bo4boo11boo$124bo18boo43bo54bobbobobbo3bo98boo56bo6bo$123bobo 16boo99bo4boob5o90bo6boo58bo5bo$144bo98bo3bo4bobo83bo6boo6bo59boo$123b obbo207b4oboo74bo3bo$125boo118b3o85boob3oboo74bobo10boo$126bo69bo25boo 22bo87bob3obo89bo$140boo53bobo13bo13boo4bo55bo47bo3b4o4boo80b3o6boo$ 140boo53bobo13bobo8boob4o3bo54bobo48boob3o69b3o22boo$196bo14boo6b5o4b 4o55boo50b5o68bo3bo13bo$222b3o6bo83bo24bo72bobbo14bo$123boo98bo87boobo bo7bo90boo13boo$125bo96b3o86bobbooboobbooboo$124boo103bo13bo67bo5bobo 5bo10bo$123b3o15bo62bo24bo14bo67boobbo8bo9bobo88bobo$123boo16boo5boo 53bobo36bobbo70bobb3obbo100b4o$122b3obo14boo5boo53bobo39bo70b3o18boo 85bobboo$123bo3bo10boo64bo9bo27boo90b3o70bo15b3o$125bobbo10bo73bobo27b o162bobo16b3o$125b3o12bo58bo13bobo27b4o4boo152booboo9bo$126boo70boo14b o29bo112bo47booboo6bo3bo9bo$198bobo43bobobbo105boo47b3o9bo13boo$209boo 33bo4bo82bo23boo46b3o3bo8bo9bobo$134boobboo68bobbo28bobbo3bo83b3o70b3o 4bo5bo$117bo15b3obbo70boo27boobobo3boo81b3obo70boo5bo$117bo16boobbo85b oboobo9boobobboo82bo4bo70b3o$117bo16booboo84bo4b3o9bob3o74bobbo10bo72b oo$118boo16bo4bo82bo5bo10bo80b3o3boo6bobo68boo$118b3o20boo82bo3bo11b3o b3obbo63boo3boob4o10boo$118boo20bobo83bobo14bob5o64boo9boo10bo$186boo 57booboo157bo$94bo90boo219b3o$93bobo91bo112bo20bo83bo3bo$230boo67bobo 107boo$93bobbo20bo43boo67boo14bo51booboo105boo$95boo21bo42bobo77bo3bob o50booboo$96bo20bo44bo78bo3bobo49b3o22boo$110boo185b3o3bo12boo4boo83bo bo59bo$110boo67b3o58booboo52b3o4bo11boo80bob3o4bobo58bobo$179bo91bo26b oo5bo90boobo4bo5bo7boo$116bo63bo59boo29bobo24b3o97boo4bobbobbo7boo48bo bbo$93boo20b3o121bo3boo26boo26boo103bobbobbo59boo$95bo18boobbo50boo68b o3bo56boo101bo4bo62bo$94boo17boo46b3o5bobo24boo42bobo72boo82bobbo82boo $93b3o15b3o47bo8bo24boo44bo158boo83boo$93boo16boo49bo34bo102bo14b3o6b oo$92b3obo14boo112boo22boo48b3o13bobo6boo$93bo3bo11bobo113bobo21bobo 46bo3bo123boo40boo$68b3o24bobbo11boo113bo24bo51boo13bo108boo42bo$66b7o 6bo15b3o14bo188boo13boo151boo$65b9o4bo17boo12bobbo148boo204b3o15bo$64b o7b3obboo34bo148bobo203boo16boo5boo$65b3o6bo3bobbo28b3o45b3o57bo43bo 48boobo26bo125b3obo14boo5boo$66boo11b3o78bo56boo92bo3bo23boo73bobobboo 47bo3bo10boo$69bo10bo27bo50bo57bobo89bo4bo25boo72bobboobbo48bobbo10bo$ 70bo18boo15bobo184bo15bo4bo74bo15bo11boobbo48b3o12bo$71bo17boo17bo182b ooboo15boo73b4o13bobbo8boobbobo49boo$98boo5bobo204bo$98boo5bo188boo20b oo80bob6o$105bobo187bo19bobo79bobb3obbo73boobboo$106boo181bo3bo23bo71b obo9bob3o56bo15b3obbo$293bo3bo92bo8boobboo57bo16boobbo$231bo38bo91boo bbo21boo10boo60bo16booboo$89b3o5boo131boo37bobo93bobo20bobbo8boo61boo 16bo4bo$86boobobo5boo131bobo35booboo18bo72bo16bo5booboo71b3o20boo$86bo bbobo14boo99boo59booboo19b3o86bo81boo20bobo$75boboo5b3o19boo98boo59b3o 96boo13bo$69boo4bobo3booboo122bo58b3o3bo12boo$69boo6boob3obbo40b3o138b 3o4bo11boo4bo74boo12boo$128bo139boo5bo14bobbo72bo13bobbo$62bo9bobbo51b o140b3o18bo3bo70booboo11bobo79bo$71bo3bo123bo69boo96boo10boo80bobo$58b o7bo8bo107booboo6boboobboo68boo20boo71bo13bo81bobbo$58bo8bobbo3boo107b oo8bob5o85boobb4o89boo$57bo4boo3bo3boobo108boobobo5bo4boo181boo$45b3o 10bobo6bo118bobo11bobo67bo14b3o94boo76bobbo$44bo13boboo125boo80b3o13bo bo91boobo77boob3o$44bo3bo151b3o6boo57bo3bo107b3o79boobbo$42boo3boo14bo 145boo61boo13bo93bo81bobbo$41bobbobobbo221boo13boo175bobo$41bobbobobb oo235boo$43booboobbo159bo193bo50bo$44bo4bo159b3o73boo82boo33bobo44boob obo7bo$47booboo157boobo72b3o81boo33boo45bobbooboobbooboo7boo$46b4o44b 3o186b3o39bo125bo5bobo5bo7boo$47boo47bo120boo64bo39boo27bo99boobbo8bo$ 95bo120bobbo104boo25bobo5bo96bobb3obbo$217boo55boo6b3o72booboo94b3o$ 44booboo154boboo4boo61boo6bo68b3obbo3boo$22boobbo17booboo153bo3bo75b3o 72booboo$25bobo15booboo155bo153b4o16boo$24bo16bo3bo159b3o163boo4boo 102boo$41bo165b4o160boo108boo$26boo12bo4bo143b3o16bobo14boo$33bo5boobb obo143b3o16bobo13bobbo22boo$o26boo3bobo4b3o148bo34boo22boo31boo$o25bo 5bo3bo8bo145boo58bo30boo187bo3boo$ob3o19booboo4bo7boboo147bo106boo168b oobooboo37b3o$bb3o22boo6bo3boboo148bo41bo64boo168bo7bo37bobbo$3bo13b3o 5bo10bo3boo190bobo65bo78boo61b3o24bo6boo39bo$3boo34bo22b3o167bobo58boo 84boo61bobo15bo10boobboo37boo15boo$4bo59bo102bo65bo59bobo68b3o75b3o9b oo3bobo9boobboo36bobo15boo$4boo13bo43bo103bo21boo52b3o48bo59b4o4b4oboo 86bo3boboo51bobb3o$18boo147bo21boo37boo13bo110boboboo4boobbo92boo52boo bbo$booboo11b3o26boo122boo18bo36bobbo13bo110boo9b3o75boo12b3o54bo3bo$ bb3o12bo28boo7boo113boo12boo42boo127bo3bobo78booboo7boob4o55bobo10bobo $bbo12bo38boobboo105bo3b3o11b3o4boo228bo21boobboo7bo62bo12bo$15bo3boo 33boob3o106b3o15boo4bo69boo156booboo18boo3boo7bobo57bobbo16bo$19boo32b oobo110bo15boo6b3o65boo40boo42bo74bo21boobboo8bo58bo13b3o7boo$16bo37bo b4o106boo15b3o5bobbo66bo39bobo41bo5b3o81boo6bobo84boo7boo$17bobbo34bo 4bo87bobo15b3o16bo6boo14b3o78boo11bo41bobo3boobbo79bobbo76boobbo11boo$ 17b3o37booboo86bobobo7bo7bo14bo8bo17bo78bobo53bo3bo5bo65boo11booboo76b 3o13boo$147bobboobo4b3o5bo16boo24bo79bo55bo3bo70bobbo11bo96bo$148boo3b oboboobo7bo15bo165bobboo33bo30boo3bo10b3o$148boo3boob5o5b3o182boo35bob o28bo4bo105bo$152boboo3boo161bo65boo29bo3bo104bobo$6boo143bobo128bo26b o11bobo5bo90bobbo103bo$6boo118boobo151boo24boo18booboo89bo104boo$125b 3obo6bobo142bobo24boo11b3obbo3boo193b3o$124bo4bobo4bo190booboo105bo70b o17bobbo$125boo6bobo3bo41bobo62boo79b4o102bo3bo69b3o10bo6boo$126bo3bo bbobboo11bo31bobbo51bo3boo4b3o92boo91bobbo69bobbo6bobbo$129boboo3bo11b 3o30bobbo51boboobbo6bo91boo91booboo68b3o6bo3bo9boo$128bobo17bobbo15boo 12bo3bo50bobb5obb4o185bobo69b3o7bobo11boo$14boo112bobo16bo4bo14boo13bo bo55b3o3b3o187bo69boboobo7bo10bo$14boo132bo34bo55b3o102bo162bobb3o$ 239boo17boo35bo48b3o77boo32bo48b4oboo$148bobbo87bo18boo34boo43bo3bo3b oo75boo32bobo47bob3o$149bobo142bobo41bo5bo3bo109boo50b3o$339bo8bo58bo 7bo95boo$145bo198boboo58b3o5bobo$144b3o28boo157b3o8bo59boob4obbobbo$ 143booboo27boo147b4o4b4oboo67b3obbo95boo$133bo8boobo5bo172boboboo4boo bbo68bobboobbo92boobo$128bo3b5o4boo6boo115boo57boo9b3o6boo64boobobo15b oo73b4o$127bobo7boobboo7boo113bobbo58bo3bobo10bobbo67bo10boo4boo75bo 65bobo$127bo7boboo127boo76bobbo78boo138bob3o4bobo$128bo8boo113bo6bo84b obo217boobo4bo5bo$129bo3b4o114b3o4b3o80b4o221boo4bobbobbo$134b3o114b3o 3boobbo79bobboo156boo3b4o61bobbobbo$250booboobbo3bo80b3o152b3obobbo6bo 7boo50bo4bo$251b3o3boboo68boo12bo157bobbobb5o7boo46bobbo16boo$251b3o3b oo15boo53boo170bobbo63boo17boo$135boo136bobbo63bobo91boo67bo$135boo 102bo34boo66bo4boo62bo22boo64bobo$239bo99bo7bobo22bo37b4o6boo79bo$239b o98boo7bo24bobo34bo4bo4b3oboo$236bob3obo39bo55bo3bo29boo34boo10boob3o$ 236bob5o38bobo55b3o67boboboo4b3oboo102boo$240bobo38bobo126b3o6boo106b oo66boo$237boo43bo128bo183boo$237boo47boo294bobobboo$238bo38boo6bobboo 109b3o6bo159bo4bobo6bobboobbo$213b3o22boo36bobbo9bo108bo4bo3bobo107bob o47bobobboobboo7boobbo$217bo21bo3boo32boo6booboo108bo4boo3bo107bo3bo 46bob4obbobo5boobbobo$217boo13bo6bo47boo109bo6bo81bo28bo4bo46bo6bobo$ 217bobbo11bo4boboo40bobo5bo109b3obobbobo78bo28bo4bo50bob3o$218bobo11bo 5bo41bobbo4bobo112b5o79bob3o12b4o9bo3bo$218bo61bo3bo3bo25boo92bo33bo 46b3o10bobo12bobbo41bo8bo$207bo9boo14bo47bobooboo25boo62bo7bo56bobo45b o9bo3b3o51b5o7boo$199b3o3b4o7bobo13bobo46b3obo29bo47boo11b3o5bobo55boo 46boo7b3o56bo3bobo4b3o$199bobo3booboo8boo11bo54bo76bobo9boob4obbobbo 103bo6bo4b3o52b3o3b3o3b3o$199b3obbo10boo14bobbo19bo101boo5bo12b3obbo 109boo6bob4o59boobb3o$204boo3bo7bo12boobo20boo100bobo18bobboobbo78b3o 35bo62bo$205b4o20b3o21bobo38bo62bo23boobobo80bo20booboo8bobo57b3o$206b 3o21booboo59bo90bo10boo69boo13bo6b3o10bo58boo$177bo52bobboo59bo101boo 69bobbo11bo6bo$177bo5b3o45b3o64bo12bo156bobo11bo$176bobo3boobbo45bo61b 3obbo10boo156bo$177bo3bo5bo105bo4bo11bo86b3o67boo14bo$177bo3bo111bo3bo 99b3o66bobo13bobo$182bobboo107b3o27boo77b3o62boo11bo$183boo11boo18boo 93b3o9boo76bo3bo59boo14bobbo$196boo18boo91boob3o10bo73booboboo61bo12b oobo$293bobo13boobbo39boo26bo17bo79b3o70bo13b3o$293bobo13booboo4boo33b obo24b4o6boo8boo78booboo67bo13b3o$199bo93bobo14bobo4bobbo32bo25bo4bo4b 3oboo85bobboo67bo14boo$198b5o90bobo15bo6boo58boo10boob3o4bo80b3o65bob 3obo10b3o$198bobb3o90boo83boboboo4b3oboo3b4o80bo66bob5o10bo$193boo8boo 175b3o6boo7boobbo150bobo$200bobbo20boo120bo34bo15bo4bo147boo$190bo9b3o 21boo119boo49booboboo103bo43boo23boo$180boo9boo7boo143bobo47b4o106bo 45bo23boo$179bob3o8boo114b3o15boo67b4o71boo33b3o43boo$179bo3bo10bo112b o3boo12bobbo69boo70boo80bo3boo$180boobo5b5o6boo124boo56boo13boo151bo$ 181bo10bo6bobbo104bo76boo12bo54bo90boo4boboo$198booboo105bo3bo88boo50b o7bo89bo$197bobo109b3o82b3o4bobo49bo5b3o81bo3bo$196boo97boo104bo50boo 3bobo88bo$196bo3bo95bobbo4bo54bo32bo4bo28bo31bobbo79bo7bo$197bobbo92bo bb3obobbobo28boo22boo32bo33bobo28bobboo16boo60bo4bo30bobbo$184boo11b3o 93bobbo4b4o28bobbo21bobo35boo28boo44boo4boo61bobobo4bo25b4o$184boo107b obbo37boo57booboo74boo48bo18bo8bo25bobbo$196bo99bo6bo91bo125boo19bo4b oobo$196bo75bo22boobo221boboo19boboob3o$193boo76bobo29bo38bo177bobboo 19b3oboo$193boo106boo38bobo174b4ob3o95bo$193bobbo74bobbo3bob3o58bobo 173bobbobobboo80boo7boobbobo$194b3o76bo4bo63bo175bobobob3o80b3o6b4o3bo $195bo78boboobobo43b3o152boo37boob3obo80boobobo7bo$275boo3bo46bo9boo 141boo37b4obbobo39bo42boo10boboo$276bo49bo9bobbo121boo3boo54bo3bo39bo 55bobo$337boo78boo36bo3b4o3bobo53bo3bo39b3o54bo8boo$417bobo35boboobbo bbo3bo53bobbo12boo92boo$417bo37boboo4bo3boo69boo$255bo155boo46bo3bo$ 253booboo18boo133bobo50bo$255bo156bo130booboo$270bo5bo246boo13boo3b3ob o$268b3o3b3o168b3o6bo83bob3o4bo84boo$256boo10boo4b3o169boo3boobo83bobo 3bobo83b3oboo4boo$255bobbo11b4o171boo5bobo84bobbobobo83boboboo4boo$ 231bobo20boo3bo12bo177b3obo35bo49boo86boobo$230bobbo20bo4bo13bo179boo 34bo38boo91boo3bo$231bobo20bo3bo13b3o69bobo142b3o35bobbo81boo5bo3bobo$ 247boo6bobbo13bobo18b3o47bobbo76bo96b3o4bobboo8bo71boo6boobob3o$247bob o6bo15boo21bo48bobo76bo7bo94bobboo9boo78bo3b4o$233bo13b3o44bo65boo61bo 5b3o94b4o9bobbo75bo$232boboo11bobbo109bobo59boo3bobo110bobo74bobo$232b oboo12bo97bo13b3o65bobbo108boo74bo$231bo3bo12bo27boo67boboo11bobbo63bo bboo168bobo6bobo4bo$232b4o40boo6boo59boboo12bo16boo62boo88bo66bo9bobo 4bobo$232b3o15bo36boo55bo3bo12bo7boo6boo63boo89boo65bobbo6bo6bo$247bo 36bo3boo55b4o19bobbo7bo122bobo21boobbobbo68b3o$247bobbo34boboobo54b3o 15bo5boo130bo24boobbobbo$246b3o40b3o68bo80bo10boo48bobbo28bo$246b3o42b o68bobbo77bo3bobo56bobo26b4o$246bobbo40boo67b3o77booboboobbo58bo11b3o 9bobbobo$247bobo109b3o78b6obbo57b3o21boo4boo$247b3o109bobbo78bo5boo57b o28bo$360bobo14boo65bobo57boo$360b3o13bobbo51boo3boo6bo61bo13b3o$236b oo139boo46bo3b4o3bobo65bobbo12b3o5boo21bo$236boo187boboobbobbo3bo65bob o13boo6boo20bo$425boboo4bo3boo7boo56bo14bo30b3o59boo$429bo3bo12boo69b oobbo75bo14boo$346bo87bo11boo70bo3bo9bo62booboo$346bo70boo99bobbo10bo 65boo$346bo8bo29boo30bobo22boobbo72b3o7bo65b3o$353bobo28bobbo29bo25b3o 79boo6bo63bo3bo$244boo101b3obbo3bo28boo57bo81b4o66bo3bo$244boo102bob5o 75boo98bo3bo62b3obo$327bo26bo75boo7bobo72bo16bo67boo19boo$326bobo20boo 42bo16bo31bo70bobo16bobo63bobo19boo$325booboo62bobo14boo31bo31bo33boo bbooboo4b3o9bo65bo$326bobbo62bobo14bobo30bo5b3o22bo34boobb5o4b4o73boo$ 328b3o62bo45booboo4bo24b3o40bo3boobboo71b3o$328bobo109bobo6bo44b3o17bo 6boobo72boboo$329boo57boo51bo56bo15b3o4b3o72b5o$329boo56bobbo107boo14b 3o5bo$373b3o12boo108bobbo$375bo123bobo$305bo68bo124bo87bo$304boo20b3o 71b3o20bo48bobo23boo11boobo72bo5b3o$303b5o18boo71bobbo19boo25boo20bo 25bobo12boo72bobo3boobbo$302bo24bobbo67bo4bo18bobo24bobo20bobbo23boo 86bo3bo5bo$301boo5bo12boo5bobo67bobb3o46bo23bobo19boo89bo3bo$300b3oboo 8bobo3b3o75bo5bo72bo11b3o6bo93bobboo$301boboboobboo3bob6oboo74b7o70b3o 114boo$302bobbobboo5bobo4bobbo79bo70bo87bo$281b3o20boo11bobbobo82bo68b oo87bobo5bo$280bo25boobo8b3obo80boo12boo45b3o9bo13b3o76booboo$279bo4b oo23bo13bobobbo3bo84boo45bo9bobbo12b3o70b3obbo3boo$278bo3bo15b3o27bobb o133bo8bobo13boo77booboo$278bobbo4bo4boo36bo144bo14bo45bo33b4o$278bo3b o3bo4b3obo106bo84boobbo42bo48boo24bobo$279boobob3o54b3o57bobo84bo3bo 41b3o46boo24boo$282bo60bo56boobo84bobbo118bo$283b4o40boo13bo57boo87b3o $285boo11boboo25boo72b3o21boo159bo$298bobbo35boo63bo21bobbo158b3o$298b 3o36bob3o61bobbo18boo154bo3bo3boo$337boobbo58bo6bo172bo5bo3bo$338b3o 59bo6bo173bo8bo$339bo60bo4b3o13bo56boo106boboo$420bo57boo96b3o8bo$335b oo80bo3bo144b4o4b4oboo$335boo73b3o3bobo14boo131boboboo4boobbo$417bo14b obbo131boo9b3o6boo$409bobbo20boo134bo3bobo10bobbo$287boo121bo175bobbo$ 287boo297bobo$486boo95b4o$486boo95bobboo$584b3o$396b3o42boo106bo21boo 12bo$395bo3bo10bo29bobbo104bobo20boo$396boo15boo26boo104bo3bo30bobo$ 295boo101booboo35boo108bobo33bo$295boo103boo35bobo109bo14b3o14bo$378b oobo57bo9bo113bo3bo12boo$377b3obo6bobo57bobo58b3o37b4o10b3obbo11bo3bo$ 376bo4bobo4bo59bobo58bo38bo4bo9bo3bo13b3o$377boo6bobo3bo57bo60bo39bo 13b3o$378bo3bobbobboo157bo3bobbo9boo7boo$361b3o17boboo3bo55boo59boo40b ob3obo19boo$361b3o16bobo60bobbo58bobo11bo28b3obo$362bo17bobo61boo60bo 11bo74bobo$363boo153b3o72boo$364bo201bo27bo$363bo199b5o$448bo32boo79bo $339bo107boo7bo24bobo94bo$337booboo104bobob3obbobo23bo31boo48bo3bo9bob oo$361boo43boo37b3o3boo3bo56bobo48b3o12b3o$340boo19boo42bobo38boboboob obo58bo55boo4b3o3bo$341bo20bo44bo39booboo101boo14bobbo4b5o$335bo3bo15b oo18boo71bob5obo96boo3bo9bo5bo5bo$339bo3bo11boo18boo75b4o11boo73bo14b oo8bobboo$361boo104boo72b3o13bo4bo3booboob3o$540booboo16boo3bobbo$337b o23boo178b3o17bobobboboo$338b3o18boboo179bo18boo4boo$359b4o179bobo14bo bo$356bobboo181b4o13b3o$338b3o13bobo26boo134bo25bo14bo$338b3o13bobo26b oo71bo18boo41bobo$338booboo12bo98b3o17bobbo9bo29bo3bo19booboo$342bo12b oo94b5obo17boo9boo30bobo19bo5bo$340b3o14bo92bobo5bo27bobo30bo14b3o4bo 3bo$355boo92bobboo8bo70bo3bo4bo$354bobo93b4o9bo55b4o10b3obbo$354bobo 94boo15bo49bo4bo9bo3bo$356bo102b4o5boo50bo13b3o$352bobo104b3o4bobboo 12boo32bo3bobbo9boo$352bo108bo6bo13bobbo31bob3obo$351bobo129boo33b3obo $343boo6boo$343boo5bo$351boo95bo42bo44bo40bobo$352bo93booboo39b3o40b5o 39boo$448bo40bobobo38bo45bo$489bo3bo$487boo5boo37bo3bo$449boo35bo4bo4b o37b3o$351boo70b3o22bobbo33b3obbobobb3o$351boo69bo24boo3bo33bo4bo4bo 26boo$421bo4boo19bo4bo34boo5boo3bo23boo$420bo3bo15b3o4bo3bo37bo3bo4bob o$420bobbo4bo4boo13bobbo37bobobo4bobo$408bo11bo3bo3bo4b3obo11bo40b3o6b o$408bo12boobob3o62bo$408bo8bo6bo69boo$415bobo7b4o64bobbo4b3o$409b3obb o3bo8boo11boboo50boo5b3o27boo$410bob5o23bobbo58bo28boo$416bo23b3o18boo 40boo$385bo25boo47bobo41bo$384bobo75bo40bo14boo$518boo22boo$384bobbo3b ob3o146bobo$386bo4bo151bo$387boboobobo106boo$388boo3bo107boo$389bo15b oo18boo75bo$405boo18boo75bo15bo$501bobo15boo5boo$414bo85bo16bobo5bobbo 21boo$405boo7boo85bobboo11bo8boo22bobo$404b3o8bo86bo3bo11boo31bo$403bo bbob3o3bo89boo14bo$404b3obboo93bo13b3o40bobo$405b3oboo22boo82boboo40b oo$396bo36boo84boo41bo$396b3o117bo17boo$388bo6bo3bo116bo16bobbo8boo11b oo$388bo3b3o4bo7bo106boo18boo9bobo10bobo$388bo3b3oboboo5b5o104bobo28bo 13bo$392boo3bo7boob3o103bobo$405boobbo105bo$406b3o$400bo6bo96bo$400boo 98boobobo36boo$401bo98bobbooboobb3o28bobbo$393boo6bo98bo5bobo4bo28boo$ 393boo4bobo99boobbo8bo$402bo102bobb3obbo$403bo76b3o6bo15b3o42bo$397boo 5bo74bo4bo3bobo45boo11bobo$400bo4bo73bo4boo3bo47boo10bobo$402bobo74bo 6bo49bo13bo$480b3obobbobo$484b5o56boo$489bo54bobbo$463bo81boo$463bo$ 463bo$467bo$463b3obbo$462bo4bo$462bo3bo$463b3o11bobbo$439b3o35bobbo$ 482bo$443boo17bobo12b4obo21boo$445bo10b3o3bobo12boobobo22boo$439b4obo 11bo5bobo39bo$439b5o18bobo$463boo$456bobbo$439bobo14boboo$439bobo14bo bbo$440bo15bobo25boo9bo$439bobo14b3o25boo8b3o$440boo51bobobo$440bo52bo bobo$494b3o$495bo$$500bo$455bo44bo$453booboo$453b3oboo$454b5o$444boo9b 3o$444boo10bo7$452boo$452boo!golly-3.3-src/Patterns/Life/Spaceships/short-thin.rle0000644000175000017500000001440413543255652017614 00000000000000#C From thin.rle (left side of pattern): #C This table shows the minimum possible width of those types of #C spaceships for which this has been determined. The width is #C measured over all time, so that, for example, the width of a #C LWSS is counted as 5 even though each individual phase has #C width 4. #C A period p spaceship which displaces itself (m,n) during its #C period, where m >= n, is said to be of type (m,n)c/p. #C the "width" of a non-orthogonal spaceship is considered to be #C along the same direction as that of the least displacement. #C For example, the width of a (2,1)c/6 spaceship is parallel #C to the direction of travel that is 1 cell per period. #C For each type I also give the minimum known length for a spaceship #C of minimal width. The length here is defined as the length of the #C union of n successive generations (where n is the period), the #C starting generation being chosen to minimise this figure. #C Lengths marked with an asterisk (*) indicate that they are the #C minimum possible for the given width. #C For types where the minimum width is not known, the maximum width #C that has been fully searched is given, preceded by ">". #C #C | minimum | #C type | width | minimum length for this width #C ----------+---------+------------------------------------ #C (1,0)c/2 | 21 | 12* (Hartmut Holzwart, 3 Jul 1992) #C (1,0)c/3 | 12 | 13* ("turtle", Dean Hickerson, Aug 1989) #C (1,0)c/4 | 10 | 44* (Stephen Silver, 2 Mar 1999) #C (1,1)c/4 | 3 | 4* ("glider", Richard Guy, 1970) #C (2,0)c/4 | 5 | 6* ("LWSS", John Conway, 1970) #C (1,0)c/5 | 11 | 89* (Paul Tooke, 12 Mar 2001) #C (1,1)c/5 | 13 | 26 (Tim Coe, Dec 2015) #C (2,0)c/5 | 10 | 31* (Stephen Silver, 2 Mar 1999) #C (1,0)c/6 | >11 | #C (1,1)c/6 | >10 | #C (2,0)c/6 | 12 | 48 (Matthias Merzenich, 4 Feb 2017) #C (2,1)c/6 | >15 | #C (3,0)c/6 | >18 | #C (1,0)c/7 | 10 | 10 ("loafer", Josh Ball, 17 Feb 2013) #C (1,1)c/7 | > 9 | #C (2,0)c/7 | >10 | #C (2,1)c/7 | >11 | #C (3,0)c/7 | >14 | #C #C From short.rle (right side of pattern): #C This table shows the minimum possible length of those types #C of orthogonal spaceship for which this has been determined. #C For each type I also give the minimum known width for a #C spaceship of minimal length. #C Widths marked with an asterisk (*) indicate that they are the #C minimum possible. #C For types where the minimum length is not known, the maximum length #C that has been fully searched is given, preceded by ">". #C #C | minimum | #C type | length | minimum width for this length #C ----------+---------+------------------------------------ #C (1,0)c/2 | 8 | 31* (Dean Hickerson, 28 Jul 1989) #C (1,0)c/3 | 5 | 16* (Dean Hickerson, Aug 1989) #C (1,0)c/4 | 8 | 26* (Tim Coe, 6 Aug 1995) #C (1,1)c/4 | 3 | 4* ("glider", Richard Guy, 1970) #C (2,0)c/4 | 6 | 5* ("LWSS", John Conway, 1970) #C (1,0)c/5 | 8 | 31* ("spider", David Bell, 14 Apr 1997) #C (1,1)c/5 | 13 | 26 (Tim Coe, Dec 2015) #C (2,0)c/5 | 11 | 16 (Matthias Merzenich, 8 Aug 2015) #C (1,0)c/6 | > 9 | #C (1,1)c/6 | >10 | #C (2,0)c/6 | > 7 | #C (2,1)c/6 | >10 | #C (3,0)c/6 | > 9 | #C (1,0)c/7 | > 8 | #C (1,1)c/7 | > 9 | #C (2,0)c/7 | > 8 | #C (2,1)c/7 | > 7 | #C (3,0)c/7 | > 7 | #C #C Patterns and comments from Stephen Silver's 12 Jan 2004 'ships.zip' #C Updated on 8 Apr 2019. x = 376, y = 114, rule = B3/S23 351bo17bo$26b3o34bo25b2ob2o24bo33b2o26b2o27bo28bo29bo3bo77b3o15b3o$b2o 22bo36bobo23bo3bobo22b3o29b2ob2o22b2obo2bob2o22bobo26b3o27b3ob3o74b2ob 3o13b3ob2o$2o22bo5bo30bo2bo23bobobobo22b3o26b4o2bobo21b2o6b2o21b2ob2o 24b2obo26b2obobob2o74bo2bob2o4bo4b2obo2bo$2bo21bo5bo31b2o25b2ob2o51bo 4bo4bo20bobo4bobo21b2o2bo24b3o26b2o7b2o70b2obo4bobob2ob2obobo4bob2o$ 25b2obo90b3o24b2o7bo22b2o2b2o26b3o24b2o27bo7bo71b2obobo2bobo7bobo2bobo b2o$24b3o2bob2o25bo5bo57bobo30bo21b2ob2ob2o22b2o4b2o50b2o7b2o70bo8b3ob obob3o8bo$25bo5bo25bobo3bo26b3o29bo2bo25b3o25bo2bo28b4o48b2obobo3bobob 2o67b2o7b2o9b2o7b2o$32bo23bo2bo3b2o24b3o2bo27bo3bo23bo26bo6bo24b2o5bo 47bobob2ob2obobo$25b2o29bo2b2o3bo23bo32bo3bo24bobo24bo6bo25bob3o46b2ob o2bobobobo2bob2o$24b3o68b2o21bo5b2o23b2o60bo49b2obob2obobob2obob2o$24b o3b2o59bo4b2o21b2ob2o2bo23b3o26b8o26bobo47bo2bo4bobo4bo2bo$24b3o64b5o 24bobob2o24bobo23b2o6b2o27bobo44b2o2bob2obobob2obo2b2o$24b2o7b2o57bobo 25bo31b2o60bobo$25bo5bo3bo58b2o54bo3bo56bo$25b2obob2o2bo57bo2bo30bo23b o59bobo$25bo4bo62b3o25b5o22b3o62bo146bo$26bo4bo2bo54b4o31bo22bo2bo62bo 145b3o$31bobo55b2o2bobo25b2obo21bo63bobo145b2obo$30bob2o56b3o2bo24bo4b o83b2o147b3o$30bobo59bo26b2obo23bob2obo57b2ob2o145b2o$31b2o54b2o2bo27b 2o2bobo20bo3b3o$32bo55b3obob3o25bobo24bo3bo60bo$32bo54bo3bob2obo22b2ob obo22bo64bobo$31bo56b2ob5o22bo3bo25bobo62bo$32b2o54b2obob2o23bo2b2o24b 2ob3o60b2o$90b3o30bo22bobobob2o59b2o$90bo31b2o21b2obobo3bo57bo$89bob3o 24b2o4bo23bo60b2o2b2o$88b2o3bo24b2ob2o22b2obobo58b2o145bo$87bo5bo25bob o28bo59bo144b3o$88bo3bo25b2ob2o23bo4bo202bo3bo$89bo30b3o23bo2bo2b2o 200b2ob2o5bo$87b2ob2o58b3o211b2o$86bo3b3o26bobo231b4obo5bob2o$86bo32b 3o232bo2bo2b3o2bo$89bobo29b2o24b2o211b3o$91b2o29bo23bo2b2o213bo$91bo 30bo26b2o213bob2o$91b2o27bo29bo$87b2o2b2o27bobo$87b2obo28bo26b2o2bo$ 88b4o2bo27bo24b3o$91bo2bo26b2o25bo$92b2obo52bobo$148bobo$91bo56bo$91b 2o56bo210bo$91bobo259b2ob3ob3o$90b2ob2o258b2o4bo2b2ob2o$90b2obo258bo2b ob2o3bo2b2o$90bo2bo270bo2bo$88bo2bo$89b2o$89b3o$90b3o$91bobo$94bo$91bo $91bo$89b3o3bo$88bo2bo3b2o$87bo3bo256bo$92bo2b2o251bo7b3o11b3o$91bo 255bobo4b2o5b3o$88bo2bo262b5ob5o4bo2bo$89bobo2bo257bobo2bo2bo3bo5bo$ 90b4o254b6o3bo2b2o4b6o$91b3o255b2o6bobo2b2o3bo$89b2obo266bo6bo$87b3ob 3o$87bobobobo$88bo3bo$88bo3bo$86b2o5b2o$86b3o3b3o$87bo5bo$356bo7bo$88b 5o257b2obobob2o3b2obobob2o$89bob2o254b3obob3o9b3obob3o$89b4o254bo3bobo 5bobo5bobo3bo$89bo2bo258b2o6bobo6b2o$89bo2bob3o251b2o9bobo9b2o$88b2obo 2b3o251b2ob2o15b2ob2o$87b3o2bob2o256bo15bo$87bo3b2o$88bo4bo$87b2o2b2o$ 87b2o4$360bo$360b2o$359bobo8$360b4o3bob2o$357b5ob2ob3o2bo$356bobo2bob 2o2b2o3bo$372bo$358bo3bo5bo3bo$362bo4bo$353b2o2b2o10b2o$349bo2bo2b2ob 2o6b2o$348bob5o10bobo$348bo5b2o4bo$356bobobo$359bo!golly-3.3-src/Patterns/Life/Spaceships/Corder-lineship.rle0000644000175000017500000004602712026730263020541 00000000000000#C Optimized version of Jason Summers' p96 c/12 diagonal lineship. #C A p768 version was also constructed. David Bell, 24 June 2005 x = 675, y = 653, rule = B3/S23 617bo$618boboobobo$612b3o3b4o3bo$618bobbooboo$617bo$615b3o$615b3o17boo $635boo7$643boo$643boo$631b4o$635bo$617bobooboo7bo4bo$616b5obboo7boobo $616bobb3obo10bo$622bo3$606bo3boobboobo$606bo3boo4boboo$606bo3boobboob oo$610boo$608bobbo$608bobo$609bo9$612booboo$613bobo$600bo12boo$599b3o 10boobo$598booboo12boo4bo$599b3o10booboo4bo$600bo$600bobo20boo$600b4o 19boo$603bo$$599booboo$598bo5bo$599bo3bo$592b3o5bo$591bo3bo$590bo4bo 29boo$589bo3bo30bobbo$589bobbob3o27bobbo$589bo7bo26bobbo$591bo3bobo27b oo$570bo20bo3boboo$569b3o21b3oboo31bo$568booboo58bo$567boobobo58bo$ 566b3obb3o$567bo6bo41bo$568b5obo40bo$569b4oboo39b3o$574bo$573bo12boo$ 586boo3$571bo$569boobo15booboboo$587boobo3bo$572bo15bobobobo$569bobbo 16bo$570bo$$575boo$568b3o5boo$575boo$575bo11b4o$586boboo$586bobo$$581b o$579bobboo$574boo3bobb4o$574boo3boboobo$582boobo$582bo$580bo4bo$580b 3o$580boob3o$528bo54b3o$527boboo51bobo15bo$531bo50boo15bo$525bo3bobbo 66b3o$441bo81bo9bo11b3o$441bo7bo73bo4boobboo$441bo5b3o82boo46bo$440boo 3bobo77bo5bo31b3o8bo5bo$446bobbo76bo4b3o28bo3bo6bo7bo$445bobboo77bo4b oo12b3o5boo7boo9b4obboo$460boo67b4o12booboo4boo9booboo9b3o$460boo82bob oboo17boo11bobo$544bo3bo32bo$545bobbo32bo$518bo26b3o$518bo$518bo8bo14b o$525bobo13bobo18boo12bo$468boo49b3obbo3bo12bobbo17boo12boo$468boo50bo b5o15boo31bobo$449boo3boo70bo$443bo3b4o3bobo64boo15boo$443boboobbobbo 3bo81boo$443boboo4bo3boo$447bo3bo$452bo78bo$501b3o26bobo$522b3o5bobo$ 433b3o6bo62boo15b3o6bo$434boo3boobo64bo12bo4boo$414bo18boo5bobo58b4obo 13bobo3bo$412booboo21b3obo58b5o13boo3b3o$412booboo24boo76boo3bo$412boo 108bo21bo39bo$414boobo68bo14bobo14bo3bo21boo37bo$415bobbo63boobobo7bo 5bobo14bobo22bobo37b3o$415bobbo63bobbooboobbooboo5bo$416boo64bo5bobo5b o4bobo$483boobbo8bo5boo$487bobb3obbo6bo$487b3o$414bo45bobo109bo$413bob o44bobobo7bo97boo$413bobo43bobboobo4b3o98boo$414bo45boo3boboboobo44bo$ 460boo3boob5o10b3o29booboo$464boboo3boo10bobo29b3oboo$463bobo16booboo 15boo12b5o$482boo18boo13b3o$422bo21bobo71bo$421bobo21boo$421bobo21bo 39bo$399booboo18bo62bo$399boo30bo$399boobobo28bo45b3o$402bobo25bo3bo 43bo3bo27boo$403boo27b4o41bo4bo27boo$433bo33boobo5bo3boo3bo$391bobo36b oboo29bo3b6o11bo$377bobo7bobbobbo36boboo28bo5bo4bobboo6b3o$376booboo5b oboboobo36bobo29bo11bo$377boboo6bo42boo31bo9bo$381bo11b3o72bo$380bo13b oo72bobbo$380bo12boo75bo$568bo$567bo$470boo95b3o$470boo3$401b3o$399boo bbo$398bo3bo153bo$393bo5bobbo151boo$392bobo4bobo153boo$382boo17bo$382b oo18bo$402bobo$402boo$$476bobo$477boo$477bo$390boo$390boo12$552bo$551b o$551b3o6$540bo$538boo$489boo48boo$479bo3boo4b3o$479boboobbo6bo$479bo bb5obb4o$483b3o3b3o$482b3o$482boo17boo5bobo$482bo18boo6boo$509bo6$509b oo$359b5o7bo137boo$357boo5boo4bobo115bo8boobbo$357bo7bo4bo116bobbo5b3o bboo$357boo7bo3bobbo107b3obbo3bo6boobb3o$359boo6bo3b3o107b3obbo4bo5boo bboo$362bo122bo3boo$362bo4bo13boo106boo$363boobo14boo103boo48bo$482bob o50bo$473bob3o4bobo50b3o$471boobo4bo5bo$473boo4bobbobbo$479bobbobbo$ 478bo4bo$378bo3bo6boo67bo15bobbo$376bobbob3o5boo66bobo15boo47bo$379bob obo72booboo61boo$367bobo7bo79bobbo62boo$361boo4b3obobooboo81b3o$361boo 6bobboo3bobo3bo75bobo$377bobo80boo$365boo93boo60bo$353b3o8b4o136b3o14b o$351b7o5boobbo138bo14b3o$350b9o3bob3o69bo68bo$349bo7b3o3boobo68boo20b 3o$298bo51b3o6bo74b5o18boo$351boo80bo24bobbo$302bo51bo77boo5bo12boo5bo bo$355bo75b3oboo8bobo3b3o$294b3obo57bo75boboboobboo3bob6oboo$294b3obo 134bobbobboo5bobo4bobbo$295bo8boo106b3o20boo11bobbobo$296bo3b3oboo105b o25boobo8b3obo$297bo6bo105bo4boo23bo13bobobbo3bo$298bobobobo104bo3bo 15b3o27bobbo$299bo15boo92bobbo4bo4boo36bo$315boo92bo3bo3bo4b3obo$361b oo47boobob3o54b3o$346bo14boo50bo60bo45bo$346bo67b4o40boo13bo45bo$345bo bo68boo11boboo25boo59b3o$346boobbo78bobbo35boo$345bo5bo77b3o36bob3o$ 323boo20bo5bo116boobbo$323boo20bo4bo118b3o$305b3o41bo19boo99bo$303bo3b oo37b3o20boo137bo$297b3o3bobobboo156boo38boo$302bo5bo157boo39boo$303bo bboo36booboo$303bo45bo$288bo55boo72boo$287bobo56b3o69boo86bo$505bo$ 287bobbo3bob3o206b3o$289bo4bo41bo$290boboobobo38bo7bo$268b3o20boo3bo 39bo5b3o$269bo22bo42boo3bobo$269bobbo68bobbo81boo$269bobbo67bobboo81b oo$270bobo39bo$312bo$314bo5bo$313bo6bobo$312bo3bobbo$269bo43bobboboboo $268bobo47boboo37bo$269bo62boo25bobo$269bo62boo25boo$504bo$342bo160bo$ 299bo32bo10bo88b3o68b3o$300bo29bobo3boo4bo89bobo$277bo20b3o28bo5b3o94b obo14boo$276bobo51bob3o3bo93bo4boo9bobbo$276bobo52bo5bo93b3o3boo10b3o 16bo$255boo7boo11bo55boobbo99bo12boo15b3o$255b3o6b3obboo50boo3bo8bo97b 4o13bo15booboo21bo$255boobobo26bo31b3o4boo106boo12boboo15b3o20boo$258b oo26boo26b3obo8boo105bo13b4o16bo15boo5boo$237bo48bobo29bobobb5o9bo110b obobo15bobo13b3o$286boo31bo3b3o10boo97bo13booboo3boo9b4o12b3o$233bo7bo 44boo145bobo12bo3bo4boo12bo12bo$233bo8bobb3o85bobbo95b4o13b3o33bo4bo$ 232bo4boo3bobb3o37bo47bobbo95b3o15bo16booboo17bo$233bobo6bobboobbo34b 3o46b3o98bo31bo5bo16b3o$233boboo10bobo33boboo180bo3bo$247b3o70boo100bo 26boo17bo15bo$238bo44boo35boo8boo86boobobo7bo13bobo36bobo52bo$329b3o 86bobbooboobbooboo12bobo17boo17boo52b3o$329b3o86bo5bobo5bo32boo70boobb o$330bobo86boobbo8bo11b4o88boobboo$330bobo71b3o16bobb3obbo13bo91boo$ 330b3o70bobbo16b3o15boo95b5o$253b3o146bo4bo33boo99boo$252boobboo144bo bb3o132bobbo$252boobboo144bo5bo132boo12boo$253boboo146b7o24bo120boo$ 253boo88bo65bo23bobo$245boo6boo88bobo63bo23bobo$237boo8b3o8bobo82boo 62boo25bo17b3o$237boo5b3oboo8boo194bo33bo50b3o$259bo193bo33bo51bobo$ 331bo50boo21bo81b3o49bo$332bo49b3o19b3o132bobbo20boo$330b3o49boobo17bo 3boo131bobo20boo$386bo17booboo132b3o$378bo3boo3bo16booboo134boo$245boo 141bo5bo6boo134b3o4boo$245boo138bobo5bo4b3o75bo66boo$359bo25bo6b3o3boo bboo70boo148bo$308bo49boboo18bo4bobo5boo3boboboo71boo54b3o89b3o$308bo 53bo31boobbo131bobbo88bobobo$308bo47bo3bobbo20b4o7booboo129bo4bo86b3ob 3o12bo$311boo41bo9bo11b3o5boo10b3o130bobb3o104bobo$311boo12boo27bo4boo bboo109bo54bo5bo87bob3o13boo$306bo3b3o11boo37boo55b3o50bo56b7o86b5o9bo 3bo$307b3o15bo30bo5bo59bo50b3o60bo86boobboo11bobboo$308bo15b3o30bo4b3o 56bo114bo36bo51boboo14bo$307boo15b3o31bo4boo12b3o25boo9bo51bo65boo36bo bo52boo9bobboo$307b3o16bo33b4o12booboo24boo8bobbo49bobo100bo3bo13b3o 31bobobbo11bo7boo$309bo14bobbo47boboboo33bo4bo48boo101bo3bo8bo37bobobb o20boo$307bo16b3o48bo3bo34bo5bo150bobob3o4boob3o35bo$309bo15bo50bobbo 33booboo93bo60boobobbo5boboo$307b3o66b3o37boobo90boo64bobo8bo$342bo72b oobbo89b5o62boo11bobbo5boo$340bobo72b4o89bo80b3o6boo38boo$341boo70b3ob o89boo5bo6boo$413boo91b3oboo8bobbo114boo$507boboboobboo4boo133bo$322bo bo183bobbobboo83bo39bobo9bo3bobo$322bobbo39boo143boo86boo40bo10b5oboo$ 322bobbo39boo145boobo82boboboo24boo10booboo7bo4bo$322bo3bo145bo42bo83b 3obooboo8b3o9b3oboo8boo9boobo$323bobo145bo126bo3boobboo23bobbo8boo10bo $324bo38bo107b3o55boo67bo3bo11bo5bo11b3ob5obobo3bo$364bo163bobbo66bobb o12b7o13bo3bobb3o4bo$309b3o6bo43b3o164boo47boo13boo4bo16bo17bobboobbo bbo$308bo4bo3bobo258boo13boo21bo3bo14boo3b3obo$308bo4boo3bo11bo42boo 208boo30bo18boo6b3o$308bo6bo13boboo40boo207boboo30bo16boo$309b3obobbob o14bo126bo105bo15bo8b3o23bo4bo10boobo$313b5o9bo3bobbo123boo78bo26b3o 15bobbo5boo23bo4bo12bo$318bo6bo9bo11b3o109boo79bo23booboo17bo29boobobo $287bo7bo29bo4boobboo201bo25boo3bo15boo29bobo$286b3o5bobo37boo228bobob obo12bo32bo$285boob4obbobbo29bo5bo173b3o28bo26boobobbo$286b3obbo36bo4b 3o122bo47bo3bo28boo27boobo$287bobboobbo34bo4boo12b3o5boo99bo48bo3bo32b o25boo$291boobobo34b4o12booboo4boo99b3o46bo3bo31bobo$295bo10boo38bobob oo189bo3bo13b3o48bo$306boo38bo3bo101bo54booboo29bo3bo8bo54bobo5bo$347b obbo9boo90bobo53bobbo29bobob3o4boob3o57booboo8boo$347b3o10boo90boo31bo 23bobo30boobobbo5boboo51b3obbo3boo8boo$307b3o45boo3bo123b3o23boo34bobo 8bo57booboo$307b3o44b4oboo122booboo19bo3bo34boo11bobbo52b4o$313b3o39bo bobbo123b3o14bo4bobobobo46b3o$311bo3bo58bo110bo14b3o4bo$309booboboo43b oboo9bobo110bobo11bo3bo$166bobo122bo17bo32bo18bo11boo110b4o9boobb3o$ 152bobo7bobbobbo121b4o6boo8boo24boo3b3o144bo10bo3bo25bobo104boo$151boo boo5boboboobo120bo4bo4b3oboo31boo3bobbo4b3o147bobbo27boo104boo$152bob oo6bo125boo10boob3o4bo12boo16b3obobbooboo131booboo11bobo27bo$156bo11b 3o118boboboo4b3oboo3b4o11b3o15boobbobboobbo130bo5bo$155bo13boo119b3o6b oo7boobbo10boobo15boo6boo132bo3bo$155bo12boo7boo112bo15bo4bo14bo12bo3b o111bo28bo$177boo127booboboo6bo3boo3bo126bo166b3o$305b4o20bo11bo53bo 59b3o42boboo44boo70b4oboo$305b4o17bobo11bobbo52bo102b5o44boo59bo5bobo 4boobbo$308boo16bo13b4o50b3o102b4o94bo11boo4boo7b3o$294boo13boo10bo4bo bo12bo254bobo9boobo7bobo$178boo114boo12bo191b3o92bo3bo10b3o$177bobbo 144b4o171b3o92bo3bo10boo$177bobbo4boo117b3o18boo117bo56bo93bobob3o5b4o $175bob4o4boo255boo45boo105boobobbo5boo$174bobbo124bo4bo135boo44boo65b oo42bobo5bo$174bobo125bo17b3o233boo42boo$157boo9bo3boo132boo11bobbo 250b3o$157boo8bo135booboo10bo4bo249b3o14boo$169boobbo131bo12bobb3o118b o129bo3bo7bobo4boo$162bo6b4o145bo5bo11boo103bo131boob3o5bobbobb3o$160b 3o156b7o10boo103b3o129boo4bo4bobob6o$159bo3bo161bo171boo77bobbo9bobboo $144booboo10bobbo162bo110bo60boo78boo11b3o$144boo13bobbo160boo111bobo 152bo$144boobobo10boo274boo107bobbo$134bo12bobo394bo$132booboo11boo 394bo3bo$132booboo185bo21boo198b4o$132boo187bobo20boo60bo192bobo$134b oobo182boobo80bobo211bo$135bobbo181boo83boo163bo28bobo15bo$135bobbo 182b3o245boo46b3o$136boo111b3o70bo182bobbo60bobo$248bo74bobbo177bo51bo bo$247bo4boo73bo176bo3bo38bob3o4bobo20boo$143boo101bo3bo15b3o58bo176b 4o37boobo4bo5bo19boo$142bobbo100bobbo4bo4boo58bo5b3o112bo106boo4bobbo bbo$134b3o6boo101bo3bo3bo4b3obo47bo6bobo118bo113bobbobbo39boo$247boobo b3o52boobobo4bo109bo11b3o110bo4bo$134bobo113bo56bobbooboo113bo119bobbo 16boo$135bo115b4o20boo30bo5bobo4bo105b3o36bobbo80boo17boo$136bo116boo 11boboo5boo31boobbo8bo142bo$136boo128bobbo42bobb3obbo143bo3bo118boo$ 133boboobo12boo113b3o43b3o149b4o119boo$133b4oboo10bobbo121bo152bo$134b 5o12boo122bo4bo145boo$136boo136bobobbobo138b3o4boo157bo$274bobobo3bo 32boo105bo153boo7boo$273bo4b3obboo29bobbo103bo9boo142bobbo6bobo$278bob o3bo8b3o19boo114bo144boo$126b3o6bo141boo14bobo136bo128b3o4b3o$127boo3b oobo139bo4boobo9bobo121boo14bo133bobbo$126boo5bobo119boo13bo22bo4boo 111bo4bobo15bo132bo3bo$131b3obo119boo3b3o6bo22b3o3boo111boo5bo16bo124b o3boboobobo$134boo107bo16bobo5bobbo26bo30bo80bobo23bo129booboo$242boo 16bobbo4bobbo22b4o12boo17bobo105bo123bobo3b3o14boo$104bo136b5o14b3o6b oo24boo13boo17boo107bo123bo20bobbo$104bo7bo127bo21bo32bo143bo144boo$ 104bo5b3o126boo5bo14bo44boo132bo107b3o$103boo3bobo127b3oboo16bobo33bo 8bobbo132bo$109bobbo126boboboobboo11boo32bobo9bobo133bo109bo39bo$108bo bboo127bobbobboo13bo31b4o10bo135bo104bo3boo37bobo8bo$123boo117boo49b3o 92b3o36b3o14bo105bobo38bobo7bo$123boo119boobo47bo94bo35bobbo15bo101b3o 42bo8b3o$247bo141bo39bo16bo102bo46b3o$403boo24bo17bo76bo62boo7b4o$122b o10boo267bobo21bobo19bo75bo23boo36bobbo5b3obbo$122bo3bobo256boo17bo44b o74bob3o20boo36boo7bobbo$120booboboobbo249bo4bobo63bo75b3o20bo46boo$ 121b6obbo110bo138boo5bo64bo75bo13b3o5boo41bo4bobo$122bo5boo109bobo136b obo71bo74boo19boo40b5o3bo$125bobo110booboo55boo153bo74bo61b3oboobboo$ 112boo3boo6bo113bobbo12boo41boo154bo55bo6boo9boo13bo46boo4boo$106bo3b 4o3bobo121b3o11boo198bo53bobo3bo3bo22boo47bobobobo$106boboobbobbo3bo 121bobo212bo51bo3bobo3boo5booboo11b3o48bo$106boboo4bo3boo7boo113boo 213bo51bobobboboboo6b3o12bo22boo$110bo3bo12boo113boo214bo51bo3bobboo7b o12bo23bobo$115bo11boo330bo54bo4bo19bo3boo20bo$138bobo21bo193b3o101bo 54bobbo24boo$123boobbo10bobobo7bo12boo141boo50bo102bo32bo22bo22bo$124b 3o10bobboobo4b3o11boo76bo22boo41boo49bo104bo23b3o3b4o45bobbo$125bo12b oo3boboboobo90bo21boo106boo90bo22bobo3booboo44b3o$111boo25boo3boob5o 90boo127bobo91bo21b3obbo$111boo7bobo19boboo3boo89b3o110boo17bo92bo25b oo3bo$123bo17bobo16boo185bo4bobo111bo25b4o$123bo36boo135bo49boo5bo112b o25b3o10boo18boo$123bo117b3o52b3o14bo32bobo119bo37boo18boo$120booboo 114bo4bo50booboo13bobo153bo$121bobo115boo3bo51b3o14boo155bo$122bo118b 4o52bo173bo36boobo$237bobo57bobo172bo35bo4bo$228bob3o4bobo57b4o172bo 34bo5bo$168boo56boobo4bo5bo59bo173bo36bobbo$158bobbo6boo58boo4bobbobbo 234bo34bobboo19boo$145boobo6boobobboo71bobbobbo55booboo23b3o149bo24bo 7bobbo21boo$141bo3b6o4boobo4bo69bo4bo56bo5bo24bo150bo12boo9b3o6bobo$ 140bo5bo4bo3boo72bobbo63bo3bo24bo152bo10bobobo7b3o$140bo11bo4bo4boo50b oo14boo65bo41boo138bo9bo3boo5bo3bo$141bo9bo5booboo42bo3boo4b3o121bobo 139bo9boo8b4o6boo$146bo57boboobbo6bo103boo17bo140bo8b3o7boboo4boobbo$ 143bobbobbo54bobb5obb4o97bo4bobo159bo26boboo$134bo8boo3bo59b3o3b3o98b oo5bo160bo22booboo$130boobobo5boobo62b3o18bo85bobo58bo43b3o49bo12bo21b 3o$130bobbooboobbo66boo18bobo144b3o41bobbo41b3o3b4o12bo20bo$130bo5bobo 4bo63bo18booboo142booboo43bo41bobo3booboo12bo19boobbo$131boobbo8bo84bo 144b3o14bo29bo41b3obbo18bo6boo11b3o$135bobb3obbo84boo19bo125bo14b3o25b obo47boo3bo14bo5boo11boo$135b3o90boo19bobo123bobo11bo3bo75b4o16bo$249b oo124b4o9boobb3o75b3o10boo5bo14bo$226bo3bo147bo10bo3bo89boo6bo11b3o$ 194bo32bo3bo157bobbo99bo9bobbo$195boo31bo145booboo11bobo6boo92bo9bobbo $194boo27b3o5bo141bo5bo19boo93bo9bobo$213bo8bobbo3bo77boo65bo3bo116bo 8b3o$212bobbo5bo7b3o74bobo66bo120bo$206b3obbo3bo5bobbo64boo17bo188bo$ 140boo64b3obbo4bo4bobo59bo4bobo99boboo97boo5bo$140bobo67bo3boo67boo5bo 98b5o84bo12boo6bo$124b3o87boo66bobo104b4o74boo9b3o19bo$140bobo68boo12b ob3o174boo60bobobo7b3o20bo$128boo10bo85b4o160b3o14bo58bo3boo5bo3bo20bo $130bo96boo161b3o9bo4bo59boo8b4o22bo$124b4obo261bo4boo4bo5bo58b3o7bob oo23bo$124b5o85boo163boo14b3o4bo3boo97bo$148boo64boo163boobboo9b4o6bob oo98bo$148boo217b3o13boo7boobb3obo56bo6boo41bo$124bobo239bo3bo12boobb oo3boobobboo56bobo3bo3bo41bo$124bobo239bo3bo16boboboo6bo55bo3bobo3boo 42bo$125bo240bo3bo15bobbobbobbo60bobobboboboo43bo$124bobo99bo48boo67bo 42bo5b3o61bo3bobboo45bo$125boo99bo47bobo66boo22booboo13bo75bo4bo45bo$ 125bo131boo17bo65b5o21bobbo13bobo74bobbo47bo$251bo4bobo82bo19bo7bobo 13b3o76bo49bo$114bo110boo24boo5bo81boo5bo13bo8boo143bo$114bo33bo4bo96b obo86b3oboo8bobo5bo5bo3bo144bo$114bo8bo23bo6bo69b3o113boboboobboo3bobo 10bobobobo144bo$121bobo24bo4bo187bobbobboo5bo12bo150bo$115b3obbo3bo 218boo174bo$116bob5o110bo111boobo171bo$122bo110bobo112bo12b3o157bo$ 117boo114boo124boobbo97bo60bo$360b3o96bobbo60bo$226bo112b3o11bo7bo49b 3o48boo60bo$227boo109bobbo10bobo55bobbo32bo13boboobbo58bo$118boo106boo 109bo4bo9bobo58bo32bo14b3o3bo58bo$119boo19bo102boo92bobb3o10bo59bo32bo b3o11bobobbo59bo$138boo102bobo92bo5bo66bobo35b3o11bobboo61bo83bo$96bo 42boo103bo93b7o104bo9booboobo63bo82bo5b3o$95boboo120bo124bo104boo7b4o 9boo57bo80bobo3boobbo$99bo27bo91boo96bo26bo105bo7bobo10boo58bo80bo3bo 5bo$93bo3bobbo9boo14bobbo88bobo95b3o23boo17bo88boo80bo79bo3bo$91bo9bo 6b3o14bo3bo185boobbo40bobo170bo83bobboo$91bo4boobboo4b5o3boo10boo3bo 182boobboo40bobo84booboo82bo83boo11boo$100boo4boo6boo13bobo183boo44bo 86b3o84bo95boo$93bo5bo7bo18boo3bo184b5o127bo87bo$94bo4b3o23bo3bo190boo 215bo$95bo4boo7b3o14bobbo188bobbo216bo$97b4o10bo15bo191boo12boo138boo 64bo$111bo10boo209boo138boo65bo$118bo3boo349bobo65bo$118b3o351boob3o 64bo96boo$117boboo90boo123boo138boo65bo81bo13boo$120boo88bobo104b3o15b o139bobbo65bo70boo9boo$121boo89bo104bobo15b3ob3o25bo29bo78bobo66bo68bo b3o8boo$121b3o63bo129bo17b3obbo25bobo29boo25bobo48boo68bo67bo3bo10bo$ 117boobb3o63boo128bobbo18bo25bo3bo13b3o11boo17bob3o4bobo13b3o22bo80bo 67boobo5b5o$117b3ob3o62bobo129bobo44bo3bo8bo35boobo4bo5bo36bo82bo67bo 10bo$118booboo196b3o43bobob3o4boob3o34boo4bobbobbo16bo19b3o81bo$102boo 14b5o198boo43boobobbo5boboo40bobbobbo12bo3boo103bo$102boo16bo194b3o4b oo46bobo8bo39bo4bo16bobo105bo60bo$321boo14boo31boo11bobbo5boo23bobbo 19b3o109bo51b3o3b4o$336bo46b3o6boo24boo22bo110bo50bobo3booboo$333boobb oo215bo49b3obbo$333boo106boo112bo53boo3bo$442boo112bo53b4o$393bo48bo 114bo53b3o$110boo219bo60boo48boo114bo23bo$110boo12bo54boo140boo3b7o59b oboboo43boo116bo22bo5b3o49bo$122boo54bobo140boo3bo4boo60b3obooboo158bo 20bobo3boobbo47boo$70bo52boo55bo146boboo61bo3boobboo3boo154bo20bo3bo5b o45b5o$69b3o83bo175bo60bo3bo7boo26bobobboo123bo19bo3bo50bo19bo$68boob oo82boo171bobbo60bobbo10bo11bo4bobo6bobboobbo123bo23bobboo44boo5bo13bo $67boobobo81bobo171bobbo40boo13boo4bo23bobobboobboo7boobbo124bo23boo 11boo32b3oboo8bobo5bo$66b3obb3o254b3o41boo13boo28bob4obbobo5boobbobo 125bo35boo33boboboobboo3bobo$67bo6bo254boo46boo39bo6bobo138bo70bobbobb oo5bo$68b5obo254boo45boboo42bob3o140bo71boo$69b4oboo23b3o227boo29bo15b o8b3o180bo35bo36boobo20boo$74bo23bo3bo256b3o15bobbo5boo181bo33b5o36bo 12b3o5boo$73bo12boo11boo257booboo17bo189bo32bobb3o46boobbo$86boo13boob oo251boo3bo15boo46bo144bo26boo8boo46b3o$103boo253bobobobo12bo47bobo 144bo32bobbo48bo$359boobobbo59bobo126bo18bo21bo9b3o56b3o3bo$71bo290boo bo60bo126bobo18bo10boo9boo7boo57boboob3o$69boobo74boo188bo25boo210bo8b ob3o8boo64boo3bobb3o$146bobo187bobo214bobbo3bob3o11bo7bo3bo10bo68boboo boo$72bo75bo186bo3bo13b3o38b3o24boo132bo4bo16bo7boobo5b5o6boo63bobboo$ 69bobbo21boo27bo211bo3bo8bo45b3o14boo7boo134boboobobo14bo7bo10bo6bobbo 59booboo$70bo23boo27boo210bobob3o4boob3o41bo3bo7bobo4boo8bo11bo15bo 106boo3bo16bo23booboo$122bobo211boobobbo5boboo42boob3o5bobbobb3o19bobo 13bo108bo15boo4bo21bobo40boo4bo$75boo263bobo8bo42boo4bo4bobob6o18bobo 13b3o122boo5bo19boo42boo3bobo6boo$68b3o5boo262boo11bobbo40bobbo9bobboo 19bo147bo18bo3bo26boo15booboo4b3o$75boo276b3o42boo11b3o6boo161bo18bobb o25bo17boobbo4bobbo$62b3o10bo336bo7boo162bo4boo11b3o26bobbo15boboo5boo $61bo3bo519bo3boo38boob4o14bobo$60bo4bo520bo14bo26bo22boo$59bo3bo378bo 144bo13bo26bo3b3obbo12bobo$59bobbob3o355bo18bobo138boo4bo9boo28bobbobb ob3o11bobo$59bo7bo352boobbo16bobo121bo16boo5bo8boo10bo19boo4b3o11boo$ 61bo3bobo352bo4bo16bo9bo112b3o22bo7bobbo7boo21boobobo$61bo3boboo46boo 304boobbobboo21bobo103bo6bo3bo22bo7b3o6b5o20boobo$63b3oboo45bobo305bob oobboo21bobo103bo3b3o4bo23bo7bo6bo19bo8bo$116bo303b4o13boo13bo104bo3b 3oboboo24bobo10boo5bo13bo$342boo76b3o13boo123boo3bo27boo9b3oboo8bobo5b o$342boo56boo13boo21bo8boo157boboboobboo3bobo$400boo13boo29bobbo97bo 59bobbobboo5bo$405bo41boo98bo61boo$404boboo4bo134bo8bo54boobo$43bo20bo bo321bo15bobbo4bobbo138bobo57bo12b3o$42b3o22bo319bobo15boboo5boo132b3o bbo3bo67boobbo$41booboo17bobbo319bo3bo15boo141bob5o70b3o$42b3o17bobo 285boo34bo3bo13bobo148bo71bo$43bo17bobbo285boo34bobob3o12bo144boo$43bo bo16boo323boobobbo$43b4o344bobo$46bo12boo330boo$24bo3boobboobo23boo22b oo289bo$24bo3boo4boboo4booboo35bobo288bobo5bo148b3o$24bo3boobbooboo4bo 5bo36bo294booboo44boo121b3o$28boo12bo3bo326b3obbo3boo43bobo104boo15b3o 61boo$26bobbo13bo335booboo45bo106bo12bo4boo59boo$26bobo350b4o147b4obo 13bobo3bo$5bo21bo30boboo468b5o13boo3b3o$6boboobobo43b5o486boo3bo$3o3b 4o3bo43b4o294b3o193bo21bo$6bobbooboo501bo14bobo14bo3bo21boo$5bo52b3o 292bo5bo151boobobo7bo5bobo14bobo22bobo$3b3o52b3o292b7o151bobbooboobboo boo5bo91boo$3b3o37boo14bo295bo155bo5bobo5bo4bobo90boo$24b3o16boo310bo 3bo17boo133boobbo8bo5boo$23bobbo327bo21bo139bobb3obbo6bo$23bo309bo21bo 14bo3bo141b3o$23bobbo305b3o21bo4bo8bob3obbo111bobo$23bobbo304bobobo20b o4bo8boobo115bobobo7bo$25b3o302b3ob3o12bo5boobobo11bo4bo18boo90bobboob o4b3o$24bobo321bobo3bobo15bo4bo17bobo91boo3boboboobo44bo$24bo26boo279b ob3o13boo3bo16bo24bo91boo3boob5o10b3o29booboo$26bo24boo279b5o9bo3bo21b o3bo116boboo3boo10bobo29b3oboo$20b3o4boo303boobboo11bobboo19b3o116bobo 16booboo15boo12b5o$19boboo6bo304boboo14bo158boo18boo13b3o$5bobooboo7bo boo5boo306boo9bobboo195bo$4b5obboo7b3obo3bo303bobobbo11bo27boo$4bobb3o bo8boo5bo303bobobbo40boo8bobo124bo$10bo12bobboo304bo56bo124bo$23boobo 3boo354boboo$25bo361bo5boo113b3o$392b3o112bo3bo27boo$347boo43b3o111bo 4bo27boo$11boo377boboo102boobo5bo3boo3bo$11boo334boo41bobo99bo3b6o11bo $391bo99bo5bo4bobboo6b3o$22bo325bobo140bo11bo$22bo326bo142bo9bo$23bo 313boo10bo147bo$337boo158bobbo$22boo475bo$20bobbobo$20bo4bo$20bo478boo $21b3o475boo$$345boo$345boo! CB 1,1,1,1 golly-3.3-src/Patterns/Life/Spaceships/orthogonal.rle0000644000175000017500000000465712026730263017671 00000000000000#C Small Orthogonal Spaceships, speeds c/2, 2c/5, c/3, 2c/7, c/4, #C c/5, and c/6. #C c/2: LWSS, MWSS, HWSS (lightweight spaceship, middleweight #C spaceship, heavyweight spaceship), Shick engine, and unnamed p2 #C spaceship which is used in line puffers. #C 2c/5: smallest example, by Paul Tooke. #C c/3: smallest c/3, turtle by Dean Hickerson, and dart by David Bell. #C 2c/7: weekender, found Jan. 12, 2000 by David Eppstein. #C c/4: smallest orthogonal c/4, by Tim Coe. #C c/5: Spiders by David Bell, pushing pre-pulsars in various forms. #C c/6: "Dragon", by Paul Tooke, April 2000. #C From Alan Hensel's "lifebc" pattern collection. x = 194, y = 76, rule = B3/S23 126boo$122boobobboboo24bo12bo$85bo36boo6boo11bo12bo12bo8bo11bo$84b3o 35bobo4bobo10bobo10bobo10bobo7bo11bo$30b3o3b3o9b3o15b3o14booboo36boobb oo11bo3bo10bo12bo7bobo9bobo$19b3o8bobbobobbo8bo3bo13bo3bo53boobooboo 11b3o11bo12bo$10b3o5bobbo8bo7bo7boo4bo11bo4boo11bobobobobbo33bobbo28bo 3b4o3bo7bo3bo7bo3bo$b3o5bobbo8bo8bo7bo6bobobooboo3b3o3booboobobo9boo3b o3b3o17bo12bo6bo9boo3boo14b4o11bob6ob6obo$obbo8bo4bo3bo9bobobobo6boobo 4boboob3oboobo4boboo8boo3bo6bo9boob3ob3o10bo6bo7bo3bobo3bo8b4o4b4o6bo 7bobo7bo$3bo4bo3bo4bo3bo21bo4bo3bo4bobo4bo3bo4bo17bobo9boo4bobbooboo 20boo3bobo3boo25bo7bobo7bo$3bo8bo8bo12bo20bo5bo27bobo10bobboboo3bobboo 6b8o5bo5bobo5bo8bo6bo8bo17bo$obo6bobo6bobo12b3o7boo7boo9boo7boo16bobbo 20bobbo4boo6boo5bobooboboboobo10boobboo10bobooboo3booboobo$33b3o57bo 12$99bo35bo5bo$98b3o33b3o3b3o$51bo5bo35bo$50b3o3b3o33b3o$$9bo3b3o90boo 5boo5boo5boo19boo5boo5boo5boo6b3o3bo$6boob5oboo87bo3bo3bobbo3bobbo3bo 3bo15bo3bo3bobbo3bobbo3bo3bo3boob5oboo$4boboobo5bobo4boo5boo5boo5boo 19boo5boo5boo5boo17bo3bobob3o5b3obobo3bo15bo3bobob3o5b3obobo3bobbobo5b oboobo$3bo3bobo3b5obbo3bo3bobbo3bobbo3bo3bo15bo3bo3bobbo3bobbo3bo3bo 15bo5boobb3ob3obboo5bo15bo5boobb3ob3obboo5bobb5o3bobo3bo$7b3o5boo3bo3b obob3o5b3obobo3bo3b3o9bo3bobob3o5b3obobo3bo15boob3o15b3oboo15boob3o15b 3oboo3boo5b3o$4bobbob3o8bo5boobb3ob3obboo5bo4bo10bo5boobb3ob3obboo5bo 15bo25bo15bo25bo8b3obobbo$6bo13boob3o15b3oboo15boob3o15b3oboo16bo3bo 15bo3bo17bo3bo15bo3bo14bo$20bo25bo15bo25bo17bobbo15bobbo19bobbo15bobbo $21bo3bo15bo3bo17bo3bo15bo3bo$22bobbo15bobbo19bobbo15bobbo9$93bo6bo$ 92bobo4bobo$92bobo4bobo$93bo6bo$$92b3o4b3o$92b4obb4o$95bobbo$92b3oboob 3o$92boo6boo$91boo8boo$$90bo12bo$88bobbo10bobbo$88bobbo10bobbo$$91b3o 6b3o$91bo10bo$93bo6bo$91b3o6b3o$$94boboobo$95bobbo$91boboobooboobo$91b 3o6b3o$$91bobo6bobo$91bobo6bobo$89b3ob3obb3ob3o! golly-3.3-src/Patterns/Life/Spaceships/adjustable-Corder-lineship.rle0000644000175000017500000003163112026730263022650 00000000000000#C Adjustable-period growing/shrinking Corder-based c/12 lineship #C Nicolay Beluchenko, 17 July 2005; optimization by David Bell. #C This example is period 6144, with a minimum population of 4620. #C Moving the back Cordership forwards or backwards by multiples of #C 88 cells adjusts the period by multiples of 1152 generations. x = 894, y = 809, rule = B3/S23 367bo$$371bo$$363b3obo$363b3obo$364bo8boo$365bo3b3oboo$366bo6bo$367bob obobo$368bo15boo$384boo7$392boo$392boo$374b3o$372bo3boo$366b3o3bobobb oo$371bo5bo$372bobboo$372bo$357bo$356bobo$$356bobbo3bob3o$358bo4bo$ 359boboobobo$360boo3bo$361bo5$338boobbo$341bobo$340bo$350boo$342boo5bo bbo$350boo$343boo$342bo$340booboo$343boo$341bo$358boo$357bobbo$358boo 8$336b3o$$340boo$342bo$336b4obo$336b5o$314bo$314bo$314bo21bobo13bo$ 317boo17bobo13b3o$317boo12boo4bo14boo$312bo3b3o11boo4bobo10boobbobo$ 313b3o15bo5boo10b3o$314bo15b3o4bo$313boo15b3o19boo$313b3o16bo18boboo$ 315bo14bobbo17bo3boo$313bo16b3o22boo$315bo15bo20bo$313b3o37bobbo$353b 3o5$328bobo$328bobbo$328bobbo$328bo3bo$318boo9bobo$318boo10bo6$284b3o$ 283bobbo39boo$282bo4bo38boo$282bobb3o$282bo5bo$283b7o$289bo26boobo$ 289bo25b3obo6bobo$287boo12boo11bo4bobo4bo$301boo12boo6bobo3bo$316bo3bo bbobboo$319boboo3bo$286bo31bobo19bo$285bobo30bobo18bo$284boobo51b3o$ 284boo$285b3o21boo$286bo16bo5boo$287bobbo11bobo$273b3o8bo6bo9boo$284bo 6bo$271bo5bo6bo3bo31b3o$271b7o10bobo31bo$273bo14bo32bo$273bo3bo11bo$ 272bo$249bobo21bo27bo$248bo25bo4bo$249bobbo21bo4bo21bo$251bobo19boobob o$254bo11b3o3bobo$253b3o17bo$253bo$235bo15boo$235bo5b3o9bo13b3o$234bob o3boobbo6bobbo12b3o$235bo3bo5bo5bobo13boo$235bo3bo11bo14bo21b3o$240bo bboo19boobbo21bo31bo$241boo22bo3bo19bo32bobo$212bo52bobbo53boo$211bobo 5bo46b3o$217booboo$211b3obbo3boo$217booboo102bo$217b4o102bo$231boo18b oo70b3o$231boo18boo3$234bo$234b3o$229bo3bo3boo$228bo5bo3bo$229bo8bo20b oo$234boboo21boo$224b3o8bo$214b4o4b4oboo$214boboboo4boobbo$215boo9b3o 6boo$217bo3bobo10bobbo26bo$234bobbo26bo$234bobo27bo8bo$231b4o36bobo$ 231bobboo29b3obbo3bo$232b3o31bob5o$219boo12bo38bo$219boo46boo15boo$ 230bobo51boo$232bo$229bo76bo$228boo76bobo$228bo3bo73boo$229b3o$196boo$ 186bo3boo4b3o93boo$186boboobbo6bo75bo16boo14bo$186bobb5obb4o74b4o29bo$ 190b3o3b3o73b5obo28b3o$189b3o74b3obbo6boo$189boo17boo60bo3bob3o$189bo 18boo61bobobboo3$256b3o$265bo$258boo5b3o$258b4o4bo$216boo40boob3oboo$ 216boo45bobo$195bo8boobbo$194bobbo5b3obboo$188b3obbo3bo6boobb3o$188b3o bbo4bo5boobboo$192bo3boo$196boo42bobo$193boo45b3o$189bobo48boo$180bob 3o4bobo58boo$178boobo4bo5bo56bobbo$180boo4bobbobbo50bo6boo$186bobbobbo 48bobo$185bo4bo50b3o46bo$181bobbo59bo45bobo$182boo56b5o45boo$$258boo$ 257bobbo$143bo114boo32bo$126b3o8bo5bo147bo$125bo3bo6bo7bo146b3o$126boo 9b4obboo$128booboo9b3o43bo$130boo11bobo42bo$144bo7boo18b3o13bo$144bo7b oo34bo$170bo5bo10boo47b3o$170b7o12bo46bobo$172bo14bo48bobo$172bo3bo59b o4boo$153boo16bo24boo37b3o3boo$152bobboo15bo23boo43bo$151boo3bo3boo11b o4bo35bo22b4o$151boobobo3boo11bo4bo35bo23boo$149b3obboo16boobobo35bobo 22bo$148b3o20bobo40boobbo11boo$132boo13boo23bo40bo5bo9bobbo6bo$132boo 9boobboo64bo5bo10boo5bobo$213bo4bo12bo4b4o$137boo4boobbo69bo13bo3b4o$ 135boobo6b3o66b3o13boobo4bo$120bo12bo5bo89boo$119b3o11bob4o94bo$118bo 14bo3boo59bobo11booboo12bob3o27bo$119booboo11boo61bobo16bo12bobbo28boo 10bo$120b3oboo40b3o28bobbo11boo16b3o28boo11bobo$122b4o40bobo29boo4boo 8b3o57boo$165bo3bo28boo3b3o$165bo3bo$165bo$165bo4boo17bo38boo46bo$165b o6bo14boo42bo43bo$166bo5bo15boo38bobbo43b3o$166boo61boo37bo$168bo3bo 56boo37boo$116b3o31b3o6bo9bobo46boo8bobbo35bobo$116b3o13boo17boo3boobo 58boo8bo49boo$117bo14boo16boo5bobo69b3o46bobo$118boo35b3obo121bo$119bo 38boo122bo$118bo47boo115bo$166boo116bo$283boo$226boo$116boo22boo84boo 58boo$116boo22boo144bobo$117bo54bo116bo$117bo53bobo74bo41bo$116bobo53b o75boo41bo$115bo120bo10bobo42bo$116bobboo39bo3boo70boo34b3o16boo$117bo 3bo32boboo3boboobo68bobo34b3o$119boo31boobo3bobo4boo105bo20boo$119bo 35bobobb3obboo107boo18bobo$110b3o43bo4boo112bo21bo$109bo3bo141boo17bo 14boo7bo$108bo4bo142boo31boo8bo$107bo3bo143bo44bo$107bobbob3o184boo$ 107bo7bo156boo$109bo3bobo42boo112boo28boo$109bo3boboo41boo113bo28bobo$ 111b3oboo56bo99bo15bo15bo$171boo43bo55bobo15boo5boo7bo$172boo42boo53bo 16bobo6boo8bo$204bo10bobo54bobboo11bo19bo$204boo67bo3bo10bo18boo$203bo bo69boo12boo$96bo32bo145bo34boo$92b5o7boo21boo181bobo$92bo3bobo4b3o22b oo153bo3bo25bo$92b3o3b3o3b3o41b3o72boo58bo4bo25bo$98boobb3o42bo3bo10bo 61boo40bo15boo4bo26bo$98bo49boo15boo56bo41bobo15bobbo29bo$95b3o12boo 38booboo128bobbo28boo$95boo13boo40boo111bobbo15bobo$267boo20b3o26boo$ 268bo22bo26bobo$290bo30bo$184bo137bo$116bo67boo137bo$115bobo54bo10bobo 138bo$116bo55boo91boo56boo$115bo55bobo93bo$110bob4o149boo59boo$95bo3b 3obo6boo4bo209bobo93boo$94bobo3bobobo5bo3boboo211bo78bo9bo3b3o$94bob7o boo5b3obo75boo71boo64bo77b4o5bobobbo$95b3oboo3bo87boo70boo65bo76bo3bo 5bo3bobbo$101b3o87bo140bo93bo$102bo228boo77b3o10bobo$249bobo6bobo163b oo7boo$248bo9bobo73boo97boo$249bobbo6bo74bobo$102boo147b3o83bo$102boo 48bo119boo64bo$152boo118boo65bo$151bobo186bo93boo$339boo93boo$65bo175b o191bobbo4boo$64b3o46bo126bobo99boo89boboo4boo$63booboo43boo229bobo85b 3o$62boobobo23boobbo16boo126bobbo101bo85boo$61b3obb3o25bobo62boo81boo 36boo64bo66boo9boobbo$62bo6bo23bo66boo81bo36boo65bo65boo8bo4boo$63b5ob o89bo188bo75boboboo$64b4oboo24boo250boo77boo$69bo347b3o$68bo12boo13boo 252boo64boo$81boo12bo144boo108bobo48bobo11boobo$93booboo144bo25boobbo 80bo46booboo11boo$96boo22bo119boo29bobo80bo46boboo12bo$66bo27bo25boo 148bo84bo49bo$64boobo51bobo234bo47bo$243boo27boo81boo47bo$67bo155boo 167boo$64bobbo21boo131bo50boo83boo18bo9bo3b3o$65bo23boo131bobbo46bo85b obo17b4o5bobobbo$220boob4o11bo17bo13booboo86bo16bo3bo5bo3bobbo$70boo 55boo90bo18bobo15bo16boo87bo33bo$63b3o5boo55boo89bo3b3obbo9bobo17bo5bo 6bo91bo16b3o10bobo$70boo55bo80bo10bobbobbob3o3bobo21bo6bobo97bo29boo$ 57b3o10bo137bo12boo4b3o4bo21bo3bobbo99boo$56bo3bo149bo5bo6boobobo28bo bboboboo$55bo4bo148bo6bobo5boobo14bo19boboo100boo$54bo3bo149bo3bobbo 11bo12b4o122bobo$54bobbob3o147bobboboboo21bo3bo125bo$54bo7bo151boboo 21bobbo127bo28boo$56bo3bobo177b3o128bo30boo$56bo3boboo120b3o185bo26b3o boo$35bo22b3oboo129bo55boo120boo30bo$33booboo148boo5b3o53boo142boo4bo 3bo$186b4o4bo179boo19bo3boboo$36boo148boob3oboo64b4o111bobo6boo6bobbo$ 37bo153bobo64bo3bo114bo5boo5bo12bobo$31bo3bo59boo108boo18boo35bo115bo 24boo$35bo3bo56boo107boo18boo31bobbo117bo24bo$95bo284bo$214boo163boo$ 33bo20b3o148bo10bo$34b3o16b5o3boo140b3o3bo4boo166boo$52bo7b3obo138boo 4boo104b4o63bobo6boo$57bo6b3o136boobbo3bo102bo3bo66bo5boo$34b3o20boboo 3boo139bob4o22boo83bo67bo$60b5o130boo10b3o23boo79bobbo69bo$34bo26b3o 134bo189bo$62bo125bo4boo4boo186boo$43bo144bo3boo6bo$42bobo143bobb3obb oobbo115bobo71boo$27bo14bobo151boobo9b3o95bob3o4bobo52b4o15bobo$23b4ob oo5boo6bo165bo95boobo4bo5bo50bo3bo18bo$22boob3oboo175boboo97boo4bobbo bbo54bo19bo$23bob3obo6bo163boo4b3o104bobbobbo50bobbo21bo$24bo3b4o4boo 14boo153bo104bo4bo78bo$27boob3o18b3o254bobbo16boo67bo$28b5o18bo3bo137b oo8bo105boo17boo68bo$4bo24bo20bo5bo136boo5bobbo195bo$oobobo7bo36bo5bo 145boo196bo$obbooboobbooboo35boboobo147bo177boo18bo$o5bobo5bo10bo26bo 152bo174bobo19bo$boobbo8bo9bobo23bo152b3o176bo20bo$5bobb3obbo35bob4o 149bo199bo$5b3o18boo21b5o282boo55bo9boo$23b3o25bo284boo54bobo$323bobo bboo62bobo$309bo4bobo6bobboobbo62bo$308bobobboobboo7boobbo$308bob4obbo bo5boobbobo$21bo287bo6bobo$20b3o290bob3o$19b3obo$18bo4bo279bo8bo$8bobb o10bo276b5o7boo$11b3o3boo6bobo271bo3bobo4b3o$3boo3boob4o10boo272b3o3b 3o3b3o35boo$3boo9boo10bo252bo25boobb3o36bobo$279bo5b3o17bo44bo$278bobo 3boobbo13b3o$10bo268bo3bo5bo12boo$279bo3bo$284bobboo$285boo$11boo$11b oo$$282bo29boo$281bobo26bo3bo$281bobo25bo5bo$282bo28bobboobboo$314boo bboboo$321bo$313boo4b3o$314boo$270bo19bo48b3o$267b4o18bobo133bo$289bob o45bo5bo80bobo$290bo46b7o12bo67bobo$339bo17boo66bo$270bobo66bo3bo13boo $271bo66bo17boobo75bo$243boobbo21boo68bo18b3o73bobo$246bobo20bobbo67bo 4bo11boboo73bobbo$245bo16bo5booboo67bo4bo11boo48b3o25boo$262bo76boobob o12bo6boo40bo$247boo13bo75bobo23boo39bo4boo$339bo64bo3bo15b3o$248boo 12boo140bobbo4bo4boo$247bo13bobbo139bo3bo3bo4b3obo$245booboo11bobo141b oobob3o$248boo10boo146bo$246bo13bo148b4o20boo6bo$263boo146boo11boboo5b oo5bobo$263boo28b3o58b3o15bo51bobbo12bobo$263boo28bobo60bo10boboboboo 49b3o14bo$260boobo29b3o59bobbo8bob3oboo58bo$261b3o45boo22bo10bobo9boob oo6bo5boo58bo4bo12bo$262bo45bobboo20bo10bob4o7bo11b4o59bobobbobo10bobo $295boo11booboo20bo11b3obboob3obobbo9boo60bobobo3bo9bobbo$293booboo14b o17bob3obo11bobobb4o3bo70bo4b3obboo8boo$293boobboo10boo19bob5o13bobo7b o75bobo3bo$250boo40boo3boo11bo7boo14bobo13bob4o4bo74boo$250boo41boobb oo19boo11boo19boobbo3boo13bo57bo4boobo$294bobo34boo16bobbo5bobo13b3o 36boo13bo$332bo26bo13boobo36boo3b3o6bo$332boo15bo23b3o25bo16bobo5bobbo $333bo3boo11boo22boo24boo16bobbo4bobbo$310b3o20bo65b5o14b3o6boo$307b3o bo19boboo63bo21bo$258boo48booboo10bo8bo64boo5bo14bo$258boo48booboo9bob o71b3oboo16bobo33bo$310bo11bobboo70boboboobboo11boo17b3o8bo5bo$321b3o bbo71bobbobboo13bo16bo3bo6bo7bo11bo$298boo14b4o6b3o50b3o20boo35boo9b4o bboo10bobo$298boo14boob3o56bo25boobo33booboo9b3o10bobbo$287bo14b3o7bo bbobboo55bo4boo23bo35boo11bobo10boo$286bobo13bo4bo4b3o3bo55bo3bo15b3o 58bo7boo$285bo3bo16bobobbobbobbo56bobbo4bo4boo66bo7boo$286bobo13bobbo 5bobo60bo3bo3bo4b3obo$287bo19boo3boo61boobob3o$303bobbo24b3o44bo$287b 4o13b3o72b4o$286bo4bo89boo11boboo66boo$263b3o22bo51bo53bobbo65bobboo$ 263bobo19bo3bobbo46bo54b3o65boo3bo3boo$263b3o19bob3obo48bo121boobobo3b oo$279boo5b3obo169b3obboo$278bobboo176b3o$265boo11booboo160boo13boo$ 263booboo14bo160boo9boobboo$263boobboo10boo$262boo3boo11bo167boo4boobb o$263boobboo177boobo6b3o$264bobo116boo46bo12bo5bo$383boo45b3o11bob4o$ 429bo14bo3boo$347b3o80booboo11boo$280b3o148b3oboo$277b3obo151b4o$278b ooboo$278booboo141bo$280bo110boo14b3o8bo5bo$391boo13bo3bo6bo7bo$268boo 137boo9b4obboo$268boo139booboo9b3o$411boo11bobo$425bo$425bo4$276boo$ 276boo155boo$430boobbo$435bo$429bo4bo$429bo$434bo$413boo16bo$413boo19b o$$432b3o5$421boo$421boo$$319bo$315b4oboo5b3o$314boob3oboo4b3o75b3o$ 315bob3obo7boo74bobbo$316bo3b4o4boo78bo$319boob3o80boo15boo$320b5o13b oo64bobo15boo$321bo16boo65bobb3o$406boobbo$406bo3bo$407bobo10bobo$409b o12bo$406bobbo16bo$359bo46bo13b3o7boo$346boo10b3o60boo7boo$334b3ob3o5b oo9boobo44boobbo11boo$326bo6b4obobbo15b3o46b3o13boo$323boo4bobbobo23b oo63bo$318boo5boo3bo10bo$318boo7boboo3b3o84bo$335boobboo78bobo$322bo 95bo$321boboo92boo$309b5o6bo3bo91b3o$307boo5boo3bobboo75bo17bobbo$307b o7bo3bobo76b3o10bo6boo$307boo7bo5bo75bobbo6bobbo$289bo7bo11boo6bo80b3o 6bo3bo9boo$288b3o5bobo13bo85b3o7bobo11boo$287boob4obbobbo12bo4bo79bob oobo7bo10bo$288b3obbo19boobo81bobb3o$289bobboobbo101b4oboo$293boobobo 100bob3o$297bo103b3o$402boo3$292bo105boo$291bobo104boobo$291bobo104b4o $292bo107bo4$393boo3b4o$279bo20bo87b3obobbo6bo7boo$277booboo17bobo90bo bbobb5o7boo$279bo19bobo90bobbo$300bo93bo$391bobo$280boo47bo62bo$279bo bbo44bobo$255bobo20boo3bo44boo$254bobbo20bo4bo67bo66boo$255bobo20bo3bo 67b3o65boo$271boo6bobbo66boobo$271bobo6bo68b3o$257bo13b3o76boo$256bob oo11bobbo133bobo$256boboo12bo134bo3bo$255bo3bo12bo38b3o6bo57bo28bo4bo$ 256b4o52boo3boobo57bo28bo4bo$256b3o15bo36boo5bobo57bob3o12b4o9bo3bo$ 271bo44b3obo59b3o10bobo12bobbo$271bobbo44boo60bo9bo3b3o$270b3o58boo48b oo7b3o$270b3o58boo49bo6bo4b3o$270bobbo92b3o13boo6bob4o$271bobo92b3o23b o$271b3o93bo11booboo8bobo$368boo10b3o10bo$369bo10bo$260boo106bo$260boo 77boo$339boo42bo$321bo3boo56bo$315boboo3boboobo38boo15bo$313boobo3bobo 4boo37boo$316bobobb3obboo39bo17bo$317bo4boo43bo16bobo$268boo96bobo16bo $268boo95bo$305bo46boo12bobboo$304bobo5bo39bobo12bo3bo$310booboo37bo 16boo$304b3obbo3boo54bo$310booboo82bo$310b4o82bo$396b3o$$281b3o6bo49bo $282boo3boobo49bo7bo$281boo5bobo49bo5b3o22boo$286b3obo48boo3bobo24boo$ 289boo54bobbo$301boo41bobboo$301boo56boo$359boo$368boo$368bobo$300boob 3o62bo10boo$298bo7boo71boo$298bo5booboo$299boo4b3o83bo$304bobo60boo21b obo$291bo3boo7bo62boo21bobo$285boboo3boboobo50boo3boo36bo$283boobo3bob o4boo43bo3b4o3bobo$286bobobb3obboo7boo35boboobbobbo3bo30boo$287bo4boo 10bobbo34boboo4bo3boo29bobbo$305boo39bo3bo35boo$305boo44bo$301boobo$ 301bobbo$302b3o27b3o6bo42boo$289boo42boo3boobo42bobo$289boo41boo5bobo 42bo$300boo35b3obo$300b3o37boo$301bo$298booboo$298booboo$300bo$$315b3o $315bobo$315bobo17b4o$315bo4boo13bo4bo$314b3o3boo12bo5bo$320bo18bo$ 299bo16b4o15bobbo20bo$317boo16bo23boo$295bo7bo13bo16booboo19bobo$295bo 8bobb3o26bo$294bo4boo3bobb3o8bo$295bobo6bobboobbo4bobo$295boboo10bobo 3b4o$309b3o3b3o$275b3o22bo16bo$273b7o6bo$272b9o4bo$271bo7b3obboo$272b 3o6bo3bobbo41b3o$273boo11b3o42bobo$276bo10bo42bobbo$277bo38boo12bobbo$ 278bo37boo12bobo$330bobbo$331boo$332bo$293boo$$291boobbo$291bo3boo27b oo$324boo$291boboo$282boboo6bo5bo$276boo4bobo3bo8bo$276boo6booboo8b3o 7$284boo$284boo82$867b3o$866bobbo$865bo4bo$865bobb3o$865bo5bo$866b7o$ 872bo$872bo$870boo12boo$884boo3$869bo$868bobo$867boobo$867boo$868b3o 21boo$869bo22boo$870bobbo$867bo6bo$867bo6bo$867bo4b3o$861bo$860b3o$ 859booboo$858boobobo$857b3obb3o$858bo6bo$859b5obo$860b4oboo$837b3o25bo $836bobbo24bo$835bo4bo$835bobb3o$835bo5bo$836b7o$842bo$842bo$840boo12b oo$854boo3$839bo17bo$838bobo15bobbobo$837boobo14bobb5o$837boo17bobo3bo $838b3o16bo$839bo$840bobbo$837bo6bo$837bo6bo$837bo4b3o13bo$857bo$854b 3obo$854boo3$848b3oboo$842boo3b4o$842boo3bo5bo$851bobo$849boobo$851b3o $848boobbo$849bobbo$852bo$849bobbo$850boo! CB 1,1,1,1golly-3.3-src/Patterns/Life/Spaceships/spaceship-types.rle0000644000175000017500000001713113307733370020632 00000000000000#C A period p spaceship which displaces itself (m,n) during its #C period, where m >= n, is said to be of type (m,n)c/p. It can be #C shown that p >= 2m+2n. The number of possible types of spaceship #C of period p is therefore [k(k+4)/4], where k = [p/2]. #C (Here, [x] denotes the floor of x, i.e., the greatest integer #C not exceeding x.) Note, however, that no-one has ever proved #C that all these "possible" types really are possible, so the #C above formula may only be an upper bound. #C The following table shows the mininum number of cells for #C spaceships of all types with period < 10. Those marked [*] are #C known to be best possible. #C #C (1,0)c/2 64 cells Dean Hickerson 28 Jul 1989 #C (1,0)c/3 25 cells [*] Dean Hickerson Aug 1989 #C (1,0)c/4 37 cells Josh Ball 15 Apr 2012 #C (1,1)c/4 5 cells [*] Richard Guy 1970 #C (2,0)c/4 9 cells [*] John Conway 1970 #C (1,0)c/5 58 cells David Bell 14 Apr 1997 #C (1,1)c/5 58 cells Matthias Merzenich 5 Sep 2010 #C (2,0)c/5 30 cells Paul Tooke 7 Dec 2000 #C (1,0)c/6 56 cells Hartmut Holzwart 19 May 2009 #C (1,1)c/6 77 cells Josh Ball 25 Mar 2011 #C (2,0)c/6 72 cells Jason Summers 22 Oct 2000 #C (2,1)c/6 282 cells Adam P. Goucher 6 Mar 2018 #C (3,0)c/6 86 cells Matthias Merzenich 4 Feb 2012 #C (1,0)c/7 20 cells Josh Ball 17 Feb 2013 #C (1,1)c/7 83 cells Matthias Merzenich 19 Aug 2011 #C (2,0)c/7 36 cells David Eppstein 12 Jan 2000 #C (2,1)c/7 (no known example) #C (3,0)c/7 702 cells Tim Coe 11 Jun 2016 #C (1,0)c/8 (no known example) #C (1,1)c/8 (no known example) #C (2,0)c/8 74 cells Josh Ball Mar 2010 #C (2,1)c/8 (no known example) #C (2,2)c/8 117 cells Jason Summers 2 Dec 2000 #C (3,0)c/8 (no known example) #C (3,1)c/8 (no known example) #C (4,0)c/8 31 cells Jason Summers 29 Oct 2000 #C (1,0)c/9 (no known example) #C (1,1)c/9 (no known example) #C (2,0)c/9 (no known example) #C (2,1)c/9 (no known example) #C (2,2)c/9 (no known example) #C (3,0)c/9 55 cells Paul Tooke 7 Jun 2001 #C (3,1)c/9 (no known example) #C (4,0)c/9 (no known example) #C #C types.rle from Stephen Silver's 12 Jan 2004 'ships' collection. #C Updated on 5 Apr 2018. x = 400, y = 368, rule = B3/S23 346b5o$346bo4bo$346bo$347bo4bo$349bo$350b2o2bo$348bo2bo3bo$346bo7bo$ 345bo5bo2bo$345bo3b2o$345b4o2b2o25$135bobo$134bo2bo$133b2o$132bo85b2o 9b2obo$131b4o82b2o3b3o3bo3bo$130bo4bo72bo9bobo6bo5b4o4b4obo64bobo$130b o2bo75bob2o6bo3b2o3bo10b6ob2o62bo78bo$130bo2bo58bo10b3o7bo5bo3b3o4bo7b o5bo39bo2bo22bo77bobo$131bo59bobo10bob2obo3bo8bobo6bo15bo9bo24b2o13b2o 10bo3bo2bo70b2o$132b4o50b2o3bo3b2o5b2o8bo7bo3bo8b2ob2o7bobo7bo2bo2bo 19b3o5bo7b2ob2o2b6o78bo$139bo47bo3b6o5b2obo4b2o8b2obo12b2o3b4obo7bo3bo 2bo15b3o2bobo2bo2bo3b3o4b3obob3o3bo73bobo$132bobo2b2obo42b4o4bobo2bo7b o2b2o4b2ob2o2bo13b2o4b2ob4o2b2o2b2o2b2o9bobo6b2ob4o2bo4bo2b2o7b2obo4bo b2o72bo$131b2o4bo45bo2bo2b3ob3o4b2o2bo6bobo2b2o2b2o11bo2bo5bob2o4bo2bo 4b4obo2b2obo4b2o9b2ob5o2b3o5bo7bob2o71bo11bo$132b2o49b3o2bo5bobobo2bo 3b2o5bo3bob4o12b2o10b2o2b6obo5bo3bo5bo3bo5bo9bo8bo11b3o69bobo7b2obo$ 133b7o48bobo4bo2bo8bo8b2o17bo8b2o2bo2b2o3bo10b2ob2o6bo6b3ob2ob2o5b3o6b o4bob3obo66bo4b2o3b2o$134bobo50bo11bo16b2o25bo3bo4bobob2o3bo9b3o2bo10b 3obo15bobobobobo3bo67b4o4bo$136bo2bo46bobo54bo4bo2b2o21bo15bo15b2obo6b o74b2obo$134bobo50bo11bo16b2o25bo3bo4bobob2o3bo9b3o2bo10b3obo15bobobob obo3bo67b4o4bo$133b7o48bobo4bo2bo8bo8b2o17bo8b2o2bo2b2o3bo10b2ob2o6bo 6b3ob2ob2o5b3o6bo4bob3obo66bo4b2o3b2o$132b2o49b3o2bo5bobobo2bo3b2o5bo 3bob4o12b2o10b2o2b6obo5bo3bo5bo3bo5bo9bo8bo11b3o69bobo7b2obo$131b2o4bo 45bo2bo2b3ob3o4b2o2bo6bobo2b2o2b2o11bo2bo5bob2o4bo2bo4b4obo2b2obo4b2o 9b2ob5o2b3o5bo7bob2o71bo11bo$132bobo2b2obo42b4o4bobo2bo7bo2b2o4b2ob2o 2bo13b2o4b2ob4o2b2o2b2o2b2o9bobo6b2ob4o2bo4bo2b2o7b2obo4bob2o72bo$139b o47bo3b6o5b2obo4b2o8b2obo12b2o3b4obo7bo3bo2bo15b3o2bobo2bo2bo3b3o4b3ob ob3o3bo73bobo$132b4o50b2o3bo3b2o5b2o8bo7bo3bo8b2ob2o7bobo7bo2bo2bo19b 3o5bo7b2ob2o2b6o78bo$131bo59bobo10bob2obo3bo8bobo6bo15bo9bo24b2o13b2o 10bo3bo2bo70b2o$130bo2bo58bo10b3o7bo5bo3b3o4bo7bo5bo39bo2bo22bo77bobo$ 130bo2bo75bob2o6bo3b2o3bo10b6ob2o62bo78bo$130bo4bo72bo9bobo6bo5b4o4b4o bo64bobo$131b4o82b2o3b3o3bo3bo$132bo85b2o9b2obo$133b2o$134bo2bo$135bob o22$131bo$130bobo$129b2o$130bo$129bobo113bo$129bo113b2ob2o107bo$92bo 35bo116bo2bobo101b2obo$89b2ob2o34bobo2b2o115bo99bobo$88bobobo35bo3bo7b 2o108bobo95bo12b2o$87b2o3bo36b3o4b2o2bo109bo2bo90b2o2bob3o6bo3bo$88bob o2bo37b2obobobo2bo106b2o3bo89b2ob2obo3bob2o2b4o$89b2obo39b2o3b4o107b2o 94bo5b4o3bo2bo$58bo2bo186b2o93b2o12bo$57bo35b2o37b2o3b4o107b2o3bo90bo 5b4o3bo3b3o$57bo3bo30bob3o34b2obobobo2bo108bo2bo89b2ob2obo3bob2o3bo$ 57b4o30bo3b3o31b3o4b2o2bo109bobo91b2o2bob3o6bo3bo$92bobo33bo3bo7b2o 108bo97bo11bobo$93bo34bobo2b2o110bo2bobo99bobo$128bo114b2ob2o104b2obo$ 129bo115bo109bo$129bobo$130bo$129b2o$130bobo$131bo15$5bobo$4bo2bo$3b2o 86b2o$2bo88bo2b2o35bo$b4o86bo2b2o35bo$o4bo84bo40bo$o2bo58bo27b4obo$o2b o56bo2b2o28bob2o34b3o$bo28bo27b3o29b3o37bo$2b4obo21bobo25bobo31bo38bo$ 3bo3bo21bobo25bob2o29b2o38bo4b2o3bo$4bo24bo26bo4bo27bo42bo4bobobo$4bob o48b2o33bo45b2o107b2o2bob2o$28b2o60bo42b2o2b2o105bo2bo2b2o$3b3o23bobo 22bo4b2o31b3o37bob2obo107bobo$3b2o23bobo27bo72bo5bo108bo$3b3o22b3o24b 3o34b3o36bo5bo114bo$57bo32bo41bob2obo112b3o$4bobo22bobo26bo31bo42b2o2b 2o110bo$4bo24b2o26b2o30bo46b2o112bo$3bo3bo22bo27bo31b2o40bo4bobobo109b 2o$2b4obo22bobo25b2o31bo38bo4b2o3bo$bo28bobo22bo2b2o30b3o37bo$o2bo27bo 21b2o3bo34bob2o33bo$o2bo51bo34b4obo35b3o$o4bo84bo$b4o86bo2b2o35bo$2bo 88bo2b2o35bo$3b2o86b2o38bo$4bo2bo$5bobo26$120b2o$119bo$120bo$84b4o33bo 2bo$82b2o4b2o31bo2bo126bo5bo$82b2o5bo33bo126bo5b2o$84b2obobo160bo3bo$ 89bo34b2o125bo4bo$85bo3bo34b4o2b2o119bo8b2o$85bo4bo37b2o117b2o3bo5bobo $87b3o3bo33b2o117bo2bo4b2o$87b2o4bo39bo111bo5bo3bo3bo$93b2o34bo3bob3o 100b2o4bobo4b2o$95bo34bobo105b2o6bo6bo2bo$59bo35b3o33bo3bo106bo3bo6b2o 2b2o2bo$57b2o75bo101bo4bo2b2o13b2o$58b2o73b2o101bobob2o13bo$98bo33bo9b o93b2o2bobo13bo$97bob5o29b2o7bo113bo$96b2o5bo30b2o4bobo108b3obo$96b2o 3bo2bo30b2ob2o110bo3bo$104bo31bobo3b2o106bo2bo$98b2obo2bo32bo3bo$101bo 2bo35bo5bo101bo2bo$102b2o37bo4bo102b2o$102b2o38bo2bo102b2o$144b2o106b 2o$144bobo102bo2b2o$146bo101bo$146b2o100b3o$146b2o2b2o$149bo2$150b2o2b o$152bobo$153bo18$344bo$344b2o2$345b3o$345b3o$362bo$361bo$346b3o14bo$ 347b2o8b3o3bo$342bob3o2bo5bo6bo$342bo3bob2o9b2o$342b2ob2ob2o7bo$347b3o 5bo3bo$348b2o6bo2bo$349bo6b3o$348b2o$346bobo$344bo$343bo2bo$342bo2bo$ 345bo7b7o$342bo9b2ob4ob2o$342b3o11bo3b2o2b2o$350bobo4b3obo2b2o$348b2o 7bobo4b2obo$346bo4bo7bo7b2o$346bo3bo6bo$346b2obo7b3o25$146bo$144b2o2$ 145bo$145b2o$144b2ob2o$143b2o3b3o$142b3o4bo$142b3o4bo$146b2o$144bobo2b 2o$142b2obo2bo$141bo2b3obobo$144b2o2bobo$141b3o5bo$142b2o$145b3o$144bo 2b2o$148bo$144bobo$137b3o4bo$140b4ob2o$136bo4b4o$140bo$138bo$138bob5o$ 138b3ob3o$139bo4bo$139b5o$140bo$141b2obo$141bo$142b2o3bo$140b4o2bo2bo$ 139b2o3bo3b2o$138bo6bob3o$139bo3b2o$139bo3bo3bo$140bobo3bobo$139b3o6bo $145b2o$141b5o$140b2o$140bo2b2o$139bo$133bob4o4b2o$133b4obo4b2o$131bo 4b2ob3o$130bo3bo2bo$131bob3obo$133b3o2bo$136b2o$132b3o$132bo5b5o$131bo 3bo6bo$131bo9bo2$131bo6b3o$134b2obobo$131bobobo3bo$130b3o6bo$130bo2bob obo$130bobo2b2o$130b2o3bo2bo$131b2ob3obo$130b2o6bo$133bob2o$122b2o7bo 4bo$126b3o2b2o2bo$121bo3bo$120bo9b2o$122b4o4b2o3bo$121bo4bo6b3o$122bob 2o4b4o$122b2o6b4o$126b3o$124bo3bo$124bo2bo$124b2o! golly-3.3-src/Patterns/Life/Spaceships/smallest-low-period.rle0000644000175000017500000002302713307733370021415 00000000000000#C Shows spaceships of all periods < 32 for which examples are known. #C Minimum populations are listed below, each spaceship having been #C chosen to minimize this minimum population. (Often there are #C small variations of the given spaceship that have the same #C minimum population.) #C #C Spaceships are arranged in period order, reading right then down. #C Gaps between spaceships do not correlate with gaps in the known #C spaceship periods -- the extra space just prevents fast higher- #C period spaceships from crashing into slow lower-period ones. #C #C Period Min population #C ------ -------------- #C p2 64 #C p3 25 #C p4 5 #C p5 30 #C p6 56 #C p7 20 #C p8 31 #C p9 55 #C p10 28 #C p12 39 #C p14 174 #C p15 112 #C p16 28 #C p18 138 #C p20 32 #C p21 176 #C p22 213 #C p24 39 #C p25 165 #C p26 187 #C p27 185 #C p28 185 #C p30 128 #C #C p2: Dean Hickerson, 28 Jul 1989. One of the first p2 spaceships. #C p3: Dean Hickerson, Aug 1989. The first known p3 spaceship. #C A p3 spaceship found later by David Bell has the same minimum #C population, but a larger maximum one (see c3-orthogonal.rle). #C 25 has been proven to be the minimum population for p3 ships. #C p4: "glider" by Richard Guy, 1970. The first known spaceship. #C p5: Paul Tooke, 7 Dec 2000. #C p6: Hartmut Holzwart, 19 May 2009. The ship was found by looking #C for symmetric support for the two wings, which were found by #C Paul Tooke in Mar 2006. #C p7: Josh Ball's "loafer", 17 Feb 2013. In terms of minimum #C population, this is tied as the fifth-smallest known spaceship. #C p8: Jason Summers, 29 Oct 2000. This was originally found as a #C p4 ship with a loosely-connected back end. Removing this back #C end results in the p8 ship shown here. #C p9: David Bell found the first p9 spaceship in May 1992, by #C deleting the back part of one of his p3 spaceships. #C The smaller one shown here was found by Paul Tooke, 7 Jun 2001. #C p10: "copperhead" by 'zdr', 5 Mar 2016. #C p12: There is a tie here between two very different c/2 spaceships. #C Not shown is the Schick engine (Paul Schick, 1972) which, #C however, can be seen in the p24 example below. The one #C actually shown is by Mark Niemiec, March 1997. It's a #C Coe ship (see p16 below) perturbed by a MWSS. #C p14: Paul Tooke found the first p14 spaceship, 19 Dec 2001. #C The one shown here is a much smaller one (with the same #C p14 part) that he found on 28 Jan 2002, except that I've #C changed the p2 spaceship at the front to save a few more cells. #C p15: This ship is based on a p15 puffer discovered by Paul Tooke in #C Oct 2002. A smaller p3 support was found by Matthias Merzenich #C on 8 Sep 2015. #C p16: "Coe ship" by Tim Coe, 26 Oct 1995. Coe found this by #C dismembering a p4 spaceship he had just found. #C p18: This p18 spaceship by Jason Summers, 2 Dec 2000, is the result #C of welding his p6 spaceship to a p9 spaceship by David Bell. #C This spaceship is trivial in the sense that it has no p18 part, #C merely disjoint p6 and p9 parts. There are known nontrivial #C p18 ships, but they are all larger than this trivial example. #C p20: Jason Summers, 8 Apr 2006. A glider suppresses the output of #C a c/2 puffer. #C p21: Paul Tooke found the first p21 spaceship on 14 Jan 2002. #C The one shown here is a smaller one found by Matthias Merzenich #C on 26 Sep 2015. #C p22: Paul Tooke, 27 Oct 2003. #C p24: A simple derivative of the Schick engine. #C p25: The first p25 spaceship was found by Paul Tooke on 8 Feb 2002. #C The one shown here is a much smaller one he found later the #C same month. #C p26: David Bell's 30 Apr 2001 version of Paul Tooke's p78 puffer. #C p27: This is based on the first known p27 spaceship, which was #C found by Paul Tooke in Oct 2002. The p3 support was reduced #C by David Bell in Sep 2003. #C p28: Stephen Silver, 28 Jan 2002, based on Paul Tooke's p14 ship. #C p30: This is a pre-pulsar pulled by two spiders, found by David Bell #C on 30 May 1998. The variant obtained by moving one side #C forward two spaces has the same minimum population. (This #C variant was noticed by Alan Hensel.) #C small_p.rle from Stephen Silver's 12 Jan 2004 'ships' collection. #C Updated on 1 May 2018. x = 294, y = 272, rule = B3/S23 22b3o15b3o46bob2o95b3o10b3o47b3o$21bo3bo13bo3bo41b3ob2obob2o44bo42b3ob o7b2o7bob3o19bo22bo2bo4b3o$20b2o4bo11bo4b2o39bo6b2o2b4o40b3o45bo3bo2bo 2bo2bo3bo22bobo21bo6bo2bo$19bobob2ob2o3b3o3b2ob2obobo39b2o3bo3bo4bo16b 3o19bo3bo44bo5bo4bo5bo21bo2bo21bo3bo5bo$18b2obo4bob2ob3ob2obo4bob2o50b 2o17bo21b2ob2o50b2o2b2o28b2o23bo4bo3bo$17bo4bo3bo4bobo4bo3bo4bo69bo28b o43bo3bo2bo3bo50bo3bo4bo$29bo5bo101b4obo2bobo42bobo6bobo21bo5bo21bobob 2o3bo$17b2o7b2o9b2o7b2o90bo2bo2bo3bo42b10o21bobo3bo22bo6bo$144b2obo45b o4bo22bo2bo3b2o$145b2o44bo8bo20bo2b2o3bo23b2obo$145b2o43bo10bo53bo$ 146bo44bo8bo12$72b3o3b3o$68bob2o3bobo3b2obo16b2o$67b3o3bobobobo3b3o14b o2bo$66bo3bo4bobo4bo3bo13bo2bo$67bo7bobo7bo13bo4bo$74bobobo20bo4bo$74b obobo21b4o$99b2o2b2o$76bo22bo4bo$75bobo21bo4bo$73b2o3b2o$73bobobobo$ 73b2o3b2o20b4o$101b2o152bo$254b3o3b3o$254bob2o2bo2bo$248b3o4b3o2bo$ 247bo2bo4b3o2bo$250bo4b2o4bobo$246bo3bo4bo$250bo$247bobo5b3o$30b3o15b 3o$29bo3bo13bo3bo$28b2o4bo11bo4b2o$27bobob2ob2o3b3o3b2ob2obobo$26b2obo 4bob2ob3ob2obo4bob2o$25bo4bo3bo4bobo4bo3bo4bo$37bo5bo$25b2o7b2o9b2o7b 2o$5b3o16bo$4bo3bo15bobo$3b2o4bo17b2o$2bobob2ob2o3b3o3bo2bobobo$b2obo 4bob2ob3ob2ob3o3bob2o$o4bo3bo4bobo5bobobo2b2o$12bo5bo2bo7b2o$2o7b2o8bo 5b2obo2b2o117b2o17b2o$25b2obo2bo118b2ob2o4b3o4b2ob2o$20b3o3bobobobo 116bo3b2o4b3o4b2o3bo$22b3o3bo124bobo3bobo3bobo$21bob2o3b2o121bob2o2b2o bob2o2b2obo$23bobobobo119b3o2bobo7bobo2b3o80bo4b3o$25bobo120b2obo2bobo 7bobo2bob2o78b3o2bo2bo$23bobo2bo118bo3bobo13bobo3bo77bob2o4bo$24b3o 126bobob7obobo84b4o3bo$153bo13bo84b2o5bo$256bo2bo$153b2o11b2o89b2o$ 173bo84bo$171b3ob3o79bo$25b2o143b2o6bo78bo$24b2o139bo3bo2bo3b2o$160b2o 2b4o$159bo7bo$159bo4bobo2bo$168bo$25b2o$24b2o$24b2o14$160b2o$156b2obo 2bob2o103bo$156b2o6b2o99b2ob3o$156bobo4bobo97b2obo3b2o$158b2o2b2o99bo 4bo2b2o$157b2ob2ob2o97b2obo5bo$159bo2bo97b2obo7b2o$157bo6bo96bo7bobob 2o$54bo7bo94bo6bo93b2obob2o3b2obobo$50b2obobo5bobob2o47b3o11b3o127b2ob o5bo3bobob2o$50b2o4bo3bo4b2o46bo2bo10bo2bo26b8o93bo2bobo7bo3b2o$50b2o 4bo3bo4b2o49bo4b3o6bo25b2o6b2o91b2obo6b2o3bob3o$52b2o9b2o51bo4bo2bo5bo 128b2obo13b2o$41b2ob3ob2o3bob3ob3obo3b2ob3o7b3o30bobo5bob2o2bobo30b2o 95b2o4bo$41b2o4bo4bo11bo4bo3bo5bo3b2obo171b2o2bo$40bo2bob2o24bobo5bobo 3b3o70b2o2b2o95bo$55b3ob3o11b2o3b2o4bo3bo67b2o6b2o92bo3b2o$55b7o10bob 2ob2obo6bo35bo29b3obobo2bobob3o76bo15bo2bo$53b2o7b2o7bo3bobo3bo40bo26b 3o4b2ob4ob2o4b3o71b3ob3o7b4o$71bo2bo3bo2bo39bo2bo23bo3bob2o4b2o4b2obo 3bo69b2o3bob2o5bo3bob2o$53bo2bobobo2bo58bobo24bo2b3ob3o4b3ob3o2bo69b2o 2bobobob2o21bo$73b2o3b2o73bo14bo74bo4bo3bo4b2ob2obo7b2ob3o$73bobobobo 70b3o5b2o2b2o5b3o70b2o4bobobob2o13b2obo3b2o$74b2ob2o70b2o8bo2bo8b2o67b 2obobo8bob10o3bo4bo2b2o$75bobo78b2o6b2o75bobob2o7bobo7bob2obobo5bo$72b 2obobob2o74bo3b4o3bo71b2obobo3bo8bo10bobo7b2o$72bobo3bobo74bo10bo71b2o 3bo21bobo7bobob2o$154b2ob2o4b2ob2o70b3obo3b2o11b3o5bo6b2obobo$157bob4o bo72b2o34bo3bobob2o$152b2o2b10o2b2o107bo3b2o$153bo2bo8bo2bo104b2o3bob 3o$152bo5b2o2b2o5bo112b2o$153bo14bo$159bo2bo$160b2o20$116bo19bo$115b3o 17b3o$114bo3bo15bo3bo$114b2ob2o15b2ob2o$110bo31bo$109bobo2bob4o13b4obo 2bobo$10b3o3b3o89bo3bo2bo2bo15bo2bo2bo3bo$10bo2bobo2bo90bob2o27b2obo$ 10bo7bo91b2o8bo11bo8b2o$10bo7bo91b2o9b2o7b2o9b2o$11bobobobo92bo12bo5bo 12bo108bo17bo$120bo2b2o3b2o2bo117b3o15b3o$14bo106b2o2bobo2b2o117b2o4b 3o5b3o4b2o$13b3o231b2obo2b3o2bo3bo2b3o2bob2o$13b3o105b2o2bobo2b2o116bo bo2bobo3bobo3bobo2bobo$20b3o97bo3bo3bo3bo112b2obobobobo4bobo4bobobobob 2o$19bo2bo97bo11bo112b2o3bobo4bo5bo4bobo3b2o$22bo97bobo7bobo112b3obo3b o4bobobo4bo3bob3o$22bo98bo9bo112b2o9b2obobobob2o9b2o$19bobo100bo7bo 125bo7bo$121bobo5bobo121b2obo7bob2o$121bo2bo3bo2bo122bo11bo$11bobo107b obo5bobo119b2obo11bob2o$11bobo106b2ob2o3b2ob2o118b2o15b2o$12bo107bobob o3bobobo118bobobob3ob3obobobo$125bobo122b2o3bo3bobo3bo3b2o$124b2ob2o 121bo2bo3bobobobo3bo2bo$125bobo125b2o4bobo4b2o$126bo122b2o4bo3bobo3bo 4b2o$253bob2obo3bob2obo$254bobobobobobobo$256bobo3bobo$256bobo3bobo$ 258b2ob2o$254bo11bo$119bo133bo13bo$118b3o133bobo7bobo$117b2ob2o2$113bo 2bobobobo$112b3o3bo3b2o$111bo6bo3b2o$111bobo$113bobo$111bo2bo$111bo14$ 57b3o17b3o$52b2ob2obo19bob2ob2o$52b2o4bob2o13b2obo4b2o$51bo2bo3bobobo 11bobobo3bo2bo$58bobobob2o5b2obobobo$56bo3bobob2o5b2obobo3bo187b3o15b 3o$57bobobob3o5b3obobobo187bo3bo13bo3bo$266b2o4bo11bo4b2o$61b3o9b3o 189bobob2ob2o3b3o3b2ob2obobo$61b3obobobobob3o188b2obo4bob2ob3ob2obo4bo b2o$62b5obob5o188bo4bo3bo4bobo4bo3bo4bo$67bobo205bo5bo$67b3o193b2o7b2o 9b2o7b2o$64bobo3bobo170b3o16bo$242bo3bo15bobo$62b2ob3ob3ob2o166b2o4bo 17b2o$62bo11bo165bobob2ob2o3b3o3bo2bobobo$61bo2bo7bo2bo163b2obo4bob2ob 3ob2ob3o3bob2o$61bo4bo3bo4bo162bo4bo3bo4bobo5bobobo2b2o$66bo3bo179bo5b o2bo7b2o$60b6o5b6o161b2o7b2o8bo5b2obo2b2o$59b2o7bo7b2o185b2obo2bo$67bo bo188b3o3bobobobo$67b3o190b3o3bo$82bo176bob2o3b2o$80b3ob3o174bobobobo$ 79b2o6bo175bobo$74bo3bo2bo3b2o176bobo$73b4o185b2o7b3o$72bo3bo187bo6bo 2bo$73bobo2bo192bo$67b3o7bo187b2o4bo3bo$65b2o195bo2b2o4bo3bo$65bo4bo 191bob3o4bo$65bo4bo201bobo$66bo3bo$68bo14$141bo5bo$140b3o3b3o4$112b2o 5b2o5b2o5b2o19b2o5b2o5b2o5b2o$110bo3bo3bo2bo3bo2bo3bo3bo15bo3bo3bo2bo 3bo2bo3bo3bo$110bo3bobob3o5b3obobo3bo15bo3bobob3o5b3obobo3bo$110bo5b2o 2b3ob3o2b2o5bo15bo5b2o2b3ob3o2b2o5bo$110b2ob3o15b3ob2o15b2ob3o15b3ob2o $110bo25bo15bo25bo$111bo3bo15bo3bo17bo3bo15bo3bo$112bo2bo15bo2bo19bo2b o15bo2bo! golly-3.3-src/Patterns/Life/Spaceships/c4-diagonal.rle0000644000175000017500000030312113307733370017570 00000000000000#C Most known c/4 diagonal spaceships up to 70 bits. #C Some ships that are made from simple interactions #C between smaller ships are not shown. #C #C This collection was compiled by Nicolay Beluchenko. #C #C Discovery credits: #C AP - Aidan F. Pierce #C DB - David Bell #C DH - Dean Hickerson #C GN - Gabriel Nivasch #C JS - Jason Summers #C HH - Hartmut Holzwart #C MM - Matthias Merzenich #C NB - Nicolay Beluchenko #C RG - Richard Guy #C RW - Robert Wainwright #C SS - Steven Silver #C TC - Tim Coe #C #C 5 RG 1970 "glider" #C 25 JS Sep 2000 "quarter" or "crab" #C 27 JS Sep 2000 "wings" #C 29 HH Apr 2004 "B29" #C 32 JS May 1999 "Jason's Orion" or "Orion II" #C 33 NB Aug 2005 #C 34 HH Mar 2004 (tag) #C NB Jul 2005 #C NB Jul 2005 #C 35 HH Sep 2004 #C 36 JS Jan 1999 "Canada goose" #C HH Mar 2004 (tag by RW) #C NB Jul 2005 #C 37 HH Jan 2004 #C NB Sep 2005 #C 38 HH Jan 2004 #C HH Mar 2004 #C 39 HH Apr 1993 "Orion" #C HH Oct 2005 #C 40 HH Jan 2004 #C HH Jan 2004 #C HH Mar 2004 #C NB Aug 2005 #C NB Sep 2005 #C 41 HH Sep 2004 #C NB Sep 2005 #C NB Sep 2005 #C 42 NB Jul 2005 #C NB Aug 2005 #C NB Sep 2005 #C 43 GN Jan 1999 #C NB May 2012 #C 44 HH Mar 2004 #C 45 HH Mar 2004 "eagle" #C NB Sep 2005 #C NB Sep 2005 #C 46 NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C HH Oct 2005 #C 47 NB Aug 2005 #C NB Sep 2005 #C NB Oct 2006 #C 48 JS Oct 2000 #C NB Jul 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Dec 2012 #C 49 TC Feb 1996 "swan" #C HH Sep 2004 #C JS Sep 2000 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C 50 HH Apr 1993 #C HH Oct 2004 #C GN Jan 1999 #C NB Jul 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Apr 2012 #C 51 DB Jun 1993 using components by HH Apr 1993 #C JS Jun 1999 "leech" #C HH Jan 2004 #C NB Jul 2005 #C HH Mar 2004 (tag) #C NB Oct 2006 #C 52 HH Mar 2004 #C HH Sep 2004 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 "crane" #C HH Oct 2005 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Dec 2012 #C NB Dec 2012 #C 53 HH Apr 1993 #C HH Dec 2004 #C NB Jul 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB May 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Dec 2012 #C 54 HH Dec 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Apr 2012 #C NB Jul 2012 #C 55 HH Jan 2004 #C NB Jul 2005 #C JS Oct 2000 #C JS Oct 2000 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Apr 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C 56 HH Jan 2004 #C TC Feb 1996 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Nov 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB May 2012 #C MM Mar 2017 #C 57 JS May 1999 #C JS Jun 1999 #C NB Jul 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C 58 HH Apr 1993 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB Apr 2012 #C NB May 2012 #C NB Jun 2012 #C NB Jul 2012 #C MM Mar 2017 #C 59 HH and DB earlier than 2000 #C HH Sep 2004 #C HH Oct 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Apr 2012 #C NB Jul 2012 #C MM Mar 2017 #C MM Mar 2017 #C 60 DB Jun 1993 using components by HH May 1993 #C HH May 1993 #C JS Jun 1999 #C JS Oct 2000 #C HH Dec 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Jul 2012 #C NB Dec 2012 #C AP Mar 2017 #C 61 JS Oct 2000 #C HH Feb 2004 #C HH Mar 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C MM Mar 2017 #C MM Mar 2017 #C 62 NB Jul 2005 #C JS Oct 2000 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Jul 2012 #C NB Dec 2012 #C AP Feb 2017 #C 63 JS Mar 1999 #C NB Jul 2005 #C NB Jul 2005 (tag by HH Apr 1993) #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Nov 2005 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C MM Mar 2017 #C 64 JS Sep 2000 #C NB Jul 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Nov 2006 #C NB Apr 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C 65 HH Sep 2004 #C HH Dec 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C NB May 2012 #C NB Jun 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C 66 DH Dec 1989 "big glider" #C HH Apr 1993 #C HH Mar 2004 #C HH Mar 2004 #C HH Dec 2004 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C JS Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C 67 HH Mar 2004 #C HH Sep 2004 #C HH Dec 2004 #C HH Dec 2004 #C JS Jun 1999 #C JS Oct 2000 #C NB Jul 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Nov 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C 68 HH Sep 2004 #C JS Oct 2000 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2006 #C NB Nov 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C NB May 2012 #C NB May 2012 #C NB May 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C AP Mar 2017 #C 69 DH Mar 1993 "Enterprise" #C HH Apr 1993 #C SS Jan 1999 "welded Canada geese" #C HH Mar 2004 #C NB Jul 2005 #C NB Jul 2005 #C NB Jul 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Nov 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C AP Feb 2017 #C 70 HH and DB earlier than 2000 #C HH Mar 2004 #C NB Jul 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Aug 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Sep 2005 #C NB Oct 2005 #C NB Oct 2005 #C NB Jan 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Oct 2006 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB Apr 2012 #C NB May 2012 #C NB Jul 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C NB Dec 2012 #C MM Mar 2017 #C MM Mar 2017 #C MM Mar 2017 x = 1386, y = 765, rule = B3/S23 393b2o24b2o8b3o25b2o15b2o19b2o19b2o19b2o30b3o24b2o16b2o$392b2o24b2o9bo 9b2o15b2o15b2o19b2o19b2o19b2o31bo26bobo14b2o$393bo2bo23bo9bo6b3obo8b2o 5bo17bo20bo20bo20bo31bo25bo18bo$393b2obo35b2o2b2o11b2o5b2o19b2o19b2o 19b2o19b2o30b2o25bo17b2o$393b2o3bo19bo14bo17bo4bobo2b2o13bo20bo20bo20b o31b2o25bobo15bo$417bob3obo13bo5bo9b2o3b2ob4o133bobo$361bobobo3bobobo 22bobob2o14bo3bo12b2o3bo3b2o9b2o10bo9bo2bo17bo2bo17bo2bo17bo2bo23b3o2b o27bo16bo2bo$151b3o18b2o16b2o11bo25b3o162bobo3bo14b2ob2o12bobob2o4bobo 20bo6b2obo17b2obo17b2obo17b2obo25bo5bo27bo8b2o5b2o$151bo20bobo15bobo9b 2o25bo131bo7bo3bo11bo8b3o2bo10b3o2bo2b2o12bobo2bob2obo16bo11b2o4bo14b 2o4bo14b2o4bo14b2o4bo22bo3bo2bo3bo19bo3bo7b2o5bo$152bo19bo17bo11bobo 25bo153b5o6b2o13bo5b2o3b2o8bo4b2o5bo15bo2bo10bobo2bo15bobo2bo15bobo2bo 15bobo2bo21bo3b2o2bo3b2o16b3obo10bo4bobo$120bo3bo3bobobo21b2o19bo17bo 10bo27b2o127bobobo3bo3bo10bo2b2o2b2o18bo3bobo13b2o26b2o17bo20bo20bo20b o22b2o8bo17b2o16b2o2bo$153b2o19bobo15bobo10bo27bo158b2o20bo16b2o26b3ob o11bo2bo17bo2bo17bo2bo17bo2bo26bo6bo15b2o17b2o$120bo3bo3bo3bo41bobo7b 3o5bobo7bob2o21b2o136bo3bo3bo12b2o2b4o21bo2bo17bobo21bobobob2o8bobo3bo 14bobo3bo14bobo3bo14bobo3bo11b3o32bo$152bo21bo9bo2b2o3bo10bo23bo2b2o 185bo17b4o22b2o3bo9bobo3b2o13bobo3b2o13bobo3b2o13bobo3b2o10bo9bo18b2o$ 120bobobo3bo3bo17bo4bo18bo11bo5bo34bo3bo129bobobo3bobobo14bobo15b3o26b o27bo3bo9b2o2bo2bo13b2o2bo2bo13b2o2bo2bo13b2o2bo2bo10bo2b6o19bo2b2o22b 3o$9bobobo135b3obobo14bo3bo10b2o5bo11b2o23bo2bo159bo13bo9bo43b2o15bo4b obo13bo4bobo13bo4bobo13bo4bobo12bo25bo3bo22bo2b2o$124bo3bo3bo15b2ob2o 16b3obo11b2o5bo11b2o23bo2bo157b2o15bo2b6o44bo21bo20bo20bo4b2o14bo5bo9b 2o25bo2bo20b2ob2o$9bo137b2o19b2o10bo9bo13bo27bo157bo18bo119bobo18b2o 14b3o19bo2bo15b2o$24b3o97bo3bobobo13b2o19b3o9b2o6bo17b2o8b2o4b3o186b2o 69b2o4b2o13b2o5bo13b2o4bo14b2o4bobo13bo24bo14b2o4bobo$9bobobo10bo122bo 18b2o11bobo3b2o25b2obo5bo9bo249b2o4bobo12b2o4b2o13b2o19b2o21bo12b3o25b o2bob2o$25bo112b3o26bo15bo4bo16b3o4b2o8bo2b6o251bo4bo15bo4bobo13bo20bo 34bo9bo19b2o$13bo124bo8bo10b3o21bo4bo17bo2bo3b2o10bo257bo20bo20bo20bo 35bo2b6o20b2o$139bo2b5o11bo8bo14bo2bo20bobobo14b2o256b2o19b2o19b2o19b 2o35bo27bo$9bobobo127bo17bo2b5o63b3o351b2o$142b2o17bo48b3o17bo$162b2o 47b2o18bo4$406bo$381b3o21b2o37b3o19b2o15bo$381bo23bobo36bo21bobo13b2o 31b3o$382bo24bo37bo20bo9bo5bobo30bo$384b2o22bo38b2o20bo5b2o39bo$29b2o 354bo6b2o11bob2o31b3o5bo19bobo4bobo3b2obobo31b2o$bobobo3bobobo14b2o 116bo20b3o16b2o199b2o3bo2bo10bo33bo27bobo8bo7b2o28b2o$30bo114b2o20bo 18bobo198b5o51bobo22bo9bo4bo5b2o$5bo3bo22b2o111bobo20bo17bo174bobobo4b o17b2o5b3o9b2o30bo3bob2o12b2o7bo9bo2bo2b6o26bo$31bo88bo3bo4bo17bo22b2o 17bo198bo3bo4bob2o6b2o27b5o2bo15bobo3b4o45bo4bo$bobobo3bobobo134bo20b 2o17bobo170bo8bo17bo9bo8bo28bo5bo16bo3bo49b3obobo$30bo2bo86bo3bo4bo15b obob2o37bobo195b2o2bo5b2o10b2o27bob2o3bo10b2o5b2o4bo43b2ob2o$bo11bo8b 2o5b2o115bob4o11b3o2bo11b3o5bo172bobobo4bo15bo10bo41bo3bobo9bobo8bo44b 2o$21b2o5bo91bobobo4bo32bo5bo11bo7bo208bo10b3o21b3o4bo3bo11bo3bo3bo21b 2ob2o2bo19bo$bobobo3bobobo9bo4bobo107b2o8bo12bo3bo2bo12bo6bo176bo4bo 16bobo18bo2bo20bo6bobo16b2o24b2o2bo2bobo12b2o$25b2o2bo94bo4bo8bobo3b3o 14bo3b2o2bobo11b2o3bo200bo2bo16bo23bo4b3o18bo2bo23bo4bo14bo2b2o$25b2o 111bo3bo5bo13b2o20bo2bo173bobobo4bo18b2ob3o16b2o22b4o11b2o54bo3bo$124b o4bo11b2o23bo8b2o214bo21bo22b2o12bobo3b3o31b2o3bo12bo2bo$145bo9b3o17bo bo3b3o206bo23b2o34bo3bo4bo30b2o3bo12bo2bo$142bo12bo9bo9bo3bo4bo205bo 28bo33b2o36bo19bo$142bo13bo2b6o13b2o235bob4o32bo5bo31bo8b3o$138b3o17bo 19bo238bo2bo2bo68b2o6bo9bo$138bo20b2o22bobo236bobo76bo2b6o$141bo42bobo 316bo$138bo2bo42bo238b2ob2o76b2o$139bo283b2o3bo$140bo284b2o$29b2o397b 2o$bobobo3bobobo15bobo$29bo$5bo7bo18bo$31bobo$bobobo7bo17bobo$31bo$bo 11bo8b2o7bo$22bobo3b4o$bobobo7bo8bo3bo368b2o23b2o11bo21b2o17b2o28b2o6b 2o11bo17bo16b3o13b3o23b3o21b3o$25b2o4bo362b2o24bobo9b2o20b2o18bobo26b 2obo5bobo9b2o16b2o16bo15bo25bo23bo$25bo3bo366bo23bo11bobo21bo17bo24b3o 2bo3b3o13bobo15bobo16bo15bo25bo23bo$398b2o23bo34b2o17bo4bo16bo4bo3b5o 13bo36b2o14b2o24b2o$391bo5bo24bobo10b2o20bo19b2o2bobo17bobo5bob2o14bo 17b2o15b2o14b2o24b2o20b3o$148bo20b3o17b3o198b2o30bobo10b2o44bobo19bo 20bobob2o15b2o50b3o25b5o$147b2o20bo19bo200bobo2bo3bo22bo33bo2bo21b2o 15b2o25bob4o30bo15bo19bo5bo19b2o4bo$147bobo20bo19bo203b2o26bo8bob2o18b 2obo24bo15b2obob3o31bo6b2o8b3o5bo2bo4b3o5bo2bo17bo4bo15bo3b2obobo$172b 2o18b2o199b2o2bo20bo3bo7b4o18b2o4bo21bo2bo6b2o7bobo2bobo20bo7b2o5bo2bo 7bo7bo7bo7bo16b2o4bo2bo3bo10b2o3bo3b2o$120bo3bo3bobobo17b2o21bo17b2o 168bobobo3bobobo16bo26b3obo8bo3b2o18bobo2bo28b3obo33bo2bo5bobo3b2obo9b o2b5obo6bo2b5obo14bobo2b3o2bo3b2o8bobo2bobo$150b2o32b3o202b2o3b2o20b2o 17bo2bo20bo21bobo3b2o12bo20b3o4bo9bo16bo15bo21bo12bo15bobo$25b2o93bo3b o7bo37b2o12bo5bo170bo11bo15bobo23b2o39bo2bo23b2o14b2o21bo2bo12bo18b2o 14b2o22bo10bo13b3o$24b2o115bo6b2o20b2o13bo4bo199b2o15b3o4b2o18b2o3bo 17bobo3bo20bo3bo12bo21bobobo10bo2bo2bo34b3o15bo3bo$26bo93bobobo3bobobo 7b2o5bo2bo10b2o6bo3b2o12bo2bo3bo166bobobo3bobobo33bo7bo18b2o4bobo14bob o3b2o61bo17bo16b3o15bo2b2o13bo$bobobo3bobobo14b2o110bobo3b2ob2o10bobo 3b2obo10b3o2b3o2bo3b2o192b3o16bo2b3o2bo18bo4bo2bo14b2o2bo2bo20bo11b2ob o21bo19bo2b2o13bo2b2o12b2ob2o16bo22bo$27bo96bo3bo15bo7b2o7bo5b2obo2bo 2bo4bo12bo170bo3bo15b2o3bo19bo2bo21bo22bo4bobo18b2o12bo2bo16b2o3b4o16b ob2obo11b2ob2o8b2o14b3o23bo5b2obo$5bo3bo3bo129bo7bo12bo4b2o2b2o7bo12bo 189bo3bo23bo22b2o2b3o20bo20bo13bobo16b2o4bo13b2o4b2o10b2o15b2o4bobo8bo 9bo14b2o4b2o2bo$26bo2bo94bo3bobobo10bo2bobo6bo8b2o5bo12bo3bo172bobobo 3bobobo11bo4bo11b3o37bo42bo33bo2bo4bo9bobo2b3o9b2o4bobo11bo2bob2o9bo2b 6o15bobo$bobobo3bobobo9b2obo122b4o2bo12bo2bo11b2obo200bobo12bo9bo27bob o19b2o4b2o16bo35b2o3bo9bo3bo14bo2bob2o13b2o14bo25bo3bo$22b2o4bo122bo3b o27bo204bo14bo2b6o28bobo19b2o4bobo50bo18b2o3bo12b2o16b2o15b2o22bo$bo 11bo10bobo2bo139b2o11b2o203bo17bo34bobo4bo15bo4bo17b2ob2o31bo3bo13bo4b o12b2o17bo39bo2bo$29bo122b2ob2o12bobo10bo203bobo17b2o33b2o3b2o15bo3b2o 19b2obo29bo37bo$bobobo3bobobo12bo2bo153bo202bobo52bo4bobo15b2o22b2obo 30bo2bo15b2o$27bobo355bo137bo$27bobo355b2o102bobo$28b2o355b2o104bo$28b o462bo8$389b3o22bo20bo25bo29b2o22b3o23b2o10b3o18bo21b3o31b3o$389bo23b 2o19b2o24b2o29bobo21bo25bobo9bo19b5o18bo2b3o28bo$141b2o19bo229bo14bo5b obo12bo5bobo17bo5bobo28bo24bo24bo12bo18bo2b2o19bobo31bo$141bobo17b2o 227bo2bo12b2o19b2o24b2o39bo23b2o24bo8b3o19b2obo23bo30b2o$25b2o114bo8b 3o8bobo197bobobo3bobobo17bobo12bobo3b2obobo9bobo3b2obobo14bobo3b2obobo 28bobo21b2o24bobo7b3ob2o41bo6b2o23b2o$bobobo3bobobo10b2o94bo3bo3bobobo 11bo3b2ob2o10bo224b2obobobo14bo7b2o11bo7b2o16bo7b2o26bobo47bobo32bobo 2b3o16bob2ob2o16b3o$26bo117b2obo16bo196bo11bo9b3o2b2ob2o16bo4bo5b2o8bo 4bo5b2o13bo4bo5b2o24bo22bo26bo38bo23b2o17bo5bo$5bo7bo14bo4b3o84bo3bo7b o14b3o11bob2o218bo2b2o3b4obo12bo2bo2b6o9bo2bo2b6o14bo2bo2b6o25bo20bo4b o23bo12bo23b2o3bo17bo2bo19bo4bo$28b3o4b2o125bo198bobobo3bobobo10bo3bo 3b3o94bo3bo19b3obobo19bo3bo11b2o5bo18bo22b3o15b2o4bo2bo$bobobo3bobobo 15b3obobo84bobobo3bobobo11bo3bobo235bo6b2o3bo89b3obo19b2ob2o21b3obo12b o4bo2bo16b2obo20bo17bobo2b3o2bobo$36bo106b2obob3o12b2o200bo7bo14b3o3b 2o40b2o2b2o18b2o25b2o22b2o24b2o17bob3o3bo15b2o21bo18bo$5bo3bo19bobo92b o7bo10bo3bo15b2o224bobo3bob2o15b2o2bo17bob4o17b2obo16b2o5b2o22b2o24b3o 25b2o14bo3bo17bo22bo$28b2obo110b2o5bo13bobo2b2o191bobobo3bobobo16b2o 21b2obo2bo16bo4bobo17bo17bobo4bobo22bo23b2o20bo2b2o2bobo13bo2bobo18bo 20bo3bo$bobobo3bobobo15bo94bo3bobobo9bo6bo18b2ob2o220bo21bobobo24b2o6b 2o25bo3bo3bo17b2o29bo43bo23bo20bo$27b2obo112bo21b3o3bobo219b2o11b2o35b 2o7bobo3b3o21b2o21bo2b2o20b2o26bo3b5o15bo2bob2o38bo$30bo116b3o256bobo 3b3o37bo3bo4bo21bo2bo18bo3bo20bo2b2o22b2obobobo23bo14b3o11b3o$28b2o 116b2o2bo16bo2bo235bo3bo4bo28bo10b2o17b2o31bo2bo19bo3bo22bo5bo26bo11bo 4bo9bo9bo$148bo18b3o239b2o31b3o10bo18bobo3b3o24bo2bo21bo2bo20b2o5b2o 17b3o6bo10bo4bo10bo2b6o$167b2o240bo5bo25b2o2bo14bobo11bo3bo4bo26bo21bo 2bo20bo6b2o17bo2b2o4bo10bo5bob2o8bo$168b2o273bo17bobo13b2o20b3o33bo21b o25bo2bo17b2o3b2obo8b2o$165b2ob2o291bo15bo21bo9bo14b3o58bo2bo21bobo13b 3o$165bo316bobo15bo2b6o15bo9bo51b2o38bo$166bo316bobo16bo22bo2b6o76b2o 15bo$483bo19b2o22bo82b2o$528b2o80bo4$31bo$30b2o$30bobo$bobobo3bobobo 381b2o25b2o21b2o17bo19bo19b2o21bo15bo20b2o21b2o21b2o21b2o18b3o24bo14b 2o29bo$33b2o359b2o26bobo19b2o17b2o18b2o18b2o21b2o14b2o19b2o21b2o21b2o 21b2o19bo25b5o10b2o29b2o$5bo7bo19b2o361bo25bo23bo10bo5bobo17bobo11b2o 5bo15bo5bobo13bobo20bo22bo22bo22bo19bo12b2o10bo2b2o12bo28bobo$28b2o 395bo22b2o6b2o38b2o5b2o14b2o46b2o21b2o21b2o21b2o15b3o11bobo11b2obo13b 2o$bobobo3bobobo14bo2b2o107b3o251bo5b3o21bobo20bo8bobo3b2obobo18b2o10b o4bobo2b2o9bobo3b2obobo14b2o19bo22bo22bo22bo17b3ob2o8bo29bo30b2o$23bo 4bo3bo107bo252bob3o2bo23bobo33bo7b2o16b2o12b2o3b2ob4o11bo7b2o12b2o123b o13bobo29b2o9b3o$5bo7bo8b2o5b2obo110bo248bo3bo4bo22bo17b3obo2bo9bo4bo 5b2o28b2o10bo9bo4bo5b2o30bo2bo19bo2bo19bo2bo19bo2bo31bobo24bo2bo16bobo 8bo$22bobo3bo3b2o106bo2bo217bobobo3bo3bo17b2ob2o19b2o7bo17bo2bo13bo2bo 2b6o6bo6b2o26bo9bo2bo2b6o7bob2o17b2obo19b2obo19b2obo19b2obo21bo12bobo 13bobo5b2obo19bo$bobobo3bobobo12bo93bo3bo3bo3bo8bo2bo241b3o2bo2b2o19bo bo3b4o20bo2bo27b2o5bo2bo19bo33b4o17b2o4bo16b2o4bo16b2o4bo16b2o4bo18b2o 12bo7b2o6b2o5b2o4bo18b2o7b3obo$25bo4bo2bo108bo3bo214bo7bo3bo12bo5b2o3b 2o16bo3bo23bo32bobo3b2obo20bo2bo30bo3b2o17bobo2bo5bo11bobo2bo5bo11bobo 2bo5bo11bobo2bo5bo11bo13bo7bobo3bobo8bobo2bo6bo10bo2bo5b2ob2o$25bo2bo 91bo3bo3bo3bo11bo2bo239bo3bobo24b2o4bo18b4o16b2o15bo25b2o20b2o2b2o11bo 2bo19bo4b2o16bo4b2o16bo4b2o16bo4b2o12b3o7b4o7bo3bo17bo5b2o10bo8bo3bobo $145bo2bo212bobobo3bobobo16bo26bo4bo17b2o4bobo13b2obo13bo26b3obo17bob 4o31bo2bo4bobo12bo2bo4bobo12bo2bo4bobo12bo2bo4bobo19bo15b2o2b2o10bo2bo 5bobo11bobo10bo$120bobobo3bobobo14b2o242bo2bo22bobo19b2obo18b2obo14bo 2b2o23bobobob2o13bo4bobo8b2o3bo16bobo20bobo20bobo20bobo18b2obo3b2o4bo 10bo3bo12bobo23bo7bo$147b2o216bo7bo19bo15b3o5bo22bo19b2o22bo23b2o3bo 22bo7b2o4bobo13bobo4b2o14bobo4b2o14bobo4b2o14bobo4b2o12b2o2bobo20bo13b obo8b2o11bo2b3obo$124bo7bo9bob2obo2b3o229b3o24bo7bo16b3obo22bo21bo26bo 3bo20b3o7bo4bo2bo13b2o4bo16b2o4bo16b2o4bo16b2o4bo15bo6bo13bo3bo14b2o7b 4o10bo2bo2b2o$141b2ob2o3b2o210bobobo7bo8bo9bo11b2o6b2o3bo16bo2bo3bo10b 3o28bobo21b2o36bo21bo9b2o11bo9b2o11bo9b2o11bo9b2o12bo15b2obo18bo5bobo 15b3o$124bo7bo8bobo3b2o234bo2b6o12bobo3bo6bo11b2o6bo14bo8bo45bo7b2o18b o10b2o2b3o21b2ob4o16b2ob4o16b2ob4o16b2ob4o11bo2bo10b2o4bo20b3o2bo12b3o $149bo235bo18bo5b2o4bo11b2o5bo17bo2b5o24bobo27b2o35bo20bo7bo14bo7bo14b o7bo14bo7bo11b2o13bobo2bo19bo3b2o12b2o$386b2o19bo4b3o15bo4b4o16bo79b2o 13bobo4b2o15bo6bo15bo6bo15bo6bo15bo6bo31bo19bobo$146b2obo257b2o23b2o4b obo15b2o28bobo46bo14bobo3b2o121bo2bo20b2o$146bo2bo282b2o52b2o44b3o15bo bo4bo122bobo20bo$146bobo337bo45bo18b2o3b2o19b3o18b3o23b2o19b2o33bobo$ 533bo17bo25bo20bo24b2o19b2o35b2o$488bo89bo20bo25bo20bo34bo$488b3o$488b 3obo$25b2o17b2o15b2o$24b2o17b2o15b2o428b3o$bobobo3bo3bo12bo18bo16bo 427bobo$28b2o17b2o15b2o425b3o$5bo3bo3bo13bo18bo16bo429bo2$bobobo3bobob o12bo2bo15bo2bo13bo2bo$23b2obo15b2obo13b2obo$5bo7bo8b2o4bo12b2o4bo10b 2o4bo$24bobo2bo13bobo2bo11bobo2bo$bobobo7bo15bo18bo16bo$26bo2bo15bo2bo 13bo2bo81b2o6b3o13bo22b2o208b2o14b2o27b2o18b2o25bo10bo34b2o22b2o16b2o 17b3o7b2obo16bo36b3o16bo$27bobo16bobo2b3o9bobo3b2o75b2o5b2ob2o12b2o22b obo206b2o15bobo26bobo17bobo23b2o9b2o34bobo21bobo14b2o18bo9bo3bo14b6o 32bo17b2o$27bobo4bo11bobo2bo11bobo2b2o78bo3bo17bobo21bo210bo14bo28bo 19bo25bobo8bobo33bo23bo18bo18bo8bo4bo13bo7b2o29bo16bobo$28b2o3b2o12b2o 3bo11b2o4bo49bo3bo3bobobo17bob3o19bo22bo209b2o14bo28bo19bo72bo23bo17b 2o17b2o7b2o16bo6bobo30b2o$28bo4bobo11bo16bo78b2o4b3o22bo21bobo207bo16b 2o26bobo17bobo24b2o9b2o33bobo21bobo15bo20bo9bobo4bo10bobo2bob6o24b2o 17b2o$120bo3bo3bo13b2o4bo13b2o10bo21bobo228bo23bobo17bobo23b3o9b2o33bo bo21bobo27b2o23b2o11bo6bo4bo42b2o$144bo2b2o2bo10bobo5b2o18b2o4bo208bo 2bo13bobobobo22bo19bo25bo46bo23bo16bo2bo8b2o3bo16b2ob2obo18bo4bo21bo$ 120bobobo3bobobo13b2obobo10bo6b2o2b3o13bo2bo3bo207b2o7b2o6b3o14b3o10bo 6b3o10bo33bob2o26b2o7bo23bo8b2o5b2o12bobob5o13b3o22bo17b3o5bo2bo7bo6b 2o$149bo15bo4bo2b3o12bo3bo3bo164bobobo3bobobo29bo9bobo5b2o4b2ob2o6bo9b 4o6bo9b4o21b2obobo5b4o27bobo3b4o19bo3bo7b2o5bo14b2obo3b2o39bo2b2o12bo 7bo9b2o5bo2bo$124bo7bo12bo19b2o2bobo2bo13bo7bo205bo2bo7bo6bo6b2o3bo6bo 6bo12bo6bo25bo5bo5bo3b2o25bo3bo23b3obo10bo4bobo12b3o48bo14bo2b5obo7bob o3b2obo$144bo24bo3bo14bob2o3bo165bo7bo32bo13bobobo8b2o10b2o2b2o4bo9b2o 2b2o4bo13b3o3bo3b2o12bo2b4o15b2o5b2o4bo17b2o16b2o2bo34bo3b2o23b2obo14b o18bo$124bo3bobobo10b2o2bo20bo4b2o16bobo208bo13bo15b2o8bo19bo22bo5bo 22b3o2b2o10bobo8bo18b2o17b2o37b2o2b2o23bo16b2obo15bo$143bo2bo22bo12b2o 177bobobo3bobobo21bo4b2o14bobo27bo5bo13bo19bo3bobo15b2o5bobobo11bo3bo 3bo22bo37bo18b2o2bo23bo3bo4b2o26bo2b2o$142b2o26bo2b3o6bobo3b3o203b5o 19bo23b2o3bo3b2o9b2o3bo21b2o17b2o3bo2b2o16b2o20b2o41b2o15bo3bo25b2obo 6bobo3b2o2b2o21bo$142bo39bo3bo4bo173bo7bo20bo6bo16b2o21bobob2o4bobo7bo bob2o21b3o18bo5bo2bo16bo2bo17bo2b2o22b3o13bo15b2o3b3o22b3o8bo3bo6bo20b o$143bo29b3o9b2o232bob2o18bobo2bob2obo9bobo2bob2o14b3o2bo19bo6bo9b2o 28bo3bo22bo2b2o11bobo13bobo5bo21b2o12b2o3bo23bobo$30b3o140bo11bo175bob obo3bobobo20bob2o25bo16bo4b2o5bo7bo4b2o17bo2bo22b2o14bobo3b3o23bo2bo 20b2ob2o7b3o4bo17bo43b2o$30bo143bo15bobo202bo24b2o18b2o18b2o21b2o31b2o 8bo3bo4bo22bo2bo15b2o15bo2b2o2bo17bo2bo22bo2bo11bo29bobo$bobobo3bobobo 17bo159bobo226b2o18b2o18b2o16bo37bobo10b2o30bo14b2o4bobo10bobo21bo24bo 2bo12bo$33b2o156bo202b2o26bo42bobo9b2o6bo34bo8bo20b3o25bo2bob2o15bo20b o22bo2bo8b3o32bobo$5bo3bo24bo356b2ob2o27b2o39b4o9bobo3b2o34bobo12bobo 13bo9bo19b2o40bo24bo8bo34b2o$28b2o360bo3bo69bo16bo4bo32bobo13bobo13bo 2b6o20b2o4bo9bo2bo20b2o23b2o12bo31bo$bobobo3bobobo14bo2b2o349b2o5b2o2b o86bo4bo49bo17bo27bo5b2o6b2obo20b4o33bo2bo$28bo3bo348b2o5bo91bo2bo70b 2o30bo8bo23bo37bo31bo2bo$5bo7bo16bo2bo349bo4bobo168b3o25bo6b2o62bo22b 2o5b2o2bo$30bo2bo351b2o2bo169bo34bo85b2o5bo$bobobo3bobobo19bo351b2o 173bo34bo86bo4bobo$22b3o659b2o2bo$22bo9bo651b2o$23bo2b6o$25bo$26b2o 127b2o16b3o20b3o11b2obo$155bobo15bo22bo13bo3bo$155bo18bo22bo12bo4bo$ 158bo17b2o21b2o11b2o183b2o10b2o35b2o14b3o30b3o14bo15b2o22b2o37b3o11bo 15b2o33b3o7b2ob2o29b2o$120bo3bo3bobobo24bobo17bo20b2o14bobo179b2o10b2o 36bobo13bo32bo15b2o14b2o22b2o38bo12b2o14b2o34bo9bob3o28b2obo$157bobo 31b2o205bo10bobo34bo16bo32bo14bobo15bo23bo38bo11bobo15bo34bo8bo2b2o3b 2o24bo$120bo3bo3bo28bo16b2o15bobo3bo17bob2o181b2o7b3o37bo15b2o31b2o31b 2o22b2o37b2o28b2o33b2o12b2obob2o20bo2bo$148b2o7bo16b2o15bo5bo16b3o182b o9b2o37bobo15bo30b2o15b2o14bo23bo38b2o12b2o14bo34b2o10bo5bob2o20bo3bo$ 120bobobo3bobobo15bobo3b4o7b2o6bo3b2o15bo2bo3bo11bo2bo194bobo34bobo39b 2o22b2o91b2o61bo5bo3bo13b2o4bo2bo$148bo3bo12bobo3b2obo19b2o2bo3b2o9bo 184bo2bo46bo14b2o25bobo3bo32bo2bo20bo2bo35bo29bo2bo3bo27bo20bo14b2o$ 124bo3bo3bo18b2o4bo7bo5b2obo2bo2bo20bo7b2o2b2o182b2o14bobo23b2o7bo14b 2o25bo5bo8bo6b2o12b2obo20b2obo36bo4bo7bob2o12b2obo5b2o25bo4bo19bobo12b o7bo$150bo4bo12bo4b2o2b2o6b3o14bo6bo151bobobo3bobobo22bo18b3o4bo16bobo 3b4o5b2o6bo3b2o25bo2bo7b2o5bo2bo10b2o4bo17b2o4bo33b3obobo6b4o12b2o4bo 3bobo23b3obobo21bo14b2o2b2o$43b2o17b2o60bo3bobobo17bobo15b2o5bo9bo9bo 13bo3bo181bo2bo16bo5b2o16bo3bo10bobo3b2obo29b2o2bobo4bobo3b2obo13bobo 2bo5bo12bobo2bo5bo25b2ob2o9bo3b2o12bobo2bo27b2ob2o24bobo12bo2bo$22b3o 17b2o17b2o87bo21bo2bo10bo2b6o16bob2o146bo7bo25bo18bo6bobo18b2o4bo5bo5b 2obo2bo2bo38bo23bo4b2o17bo4b2o24b2o18bo2bo14bo4bobo19b2o46bo$22bo9b2o 10bo18bo77b2o7bo37bo23b2obo179bo13bob2obo4bobo19bo4bo10bo4b2o2b2o16b3o 20bo21bo2bo4bobo13bo2bo4bobo15b2o5b2o34bo2bo6bo20bo30bobo10bo5b2o$bobo bo3bobobo9bo6b3obo11b2o17b2o74bobo3b4o22b2o14b2o23bo146bobobo3bobobo 14bo4b2o13b2ob2obo7bo18bobo13b2o5bo19bo9bo12bo2bo19bobo21bobo22bobo4bo bo16b3o3bo11bobo6bobo12b2o49bo3b2o$25b2o2b2o14bo18bo76bo3bo27bobo18b3o 14b2ob2o171b5o16bobo4bo25bo19bo2bo20bo2b6o18bo17bobo4b2o15bobo4b2o16bo 3bo3bo14b2o3bo15bobo21bo2b2o33bobo10b2o4bo$5bo3bo16bo117b2o4bo26b2o15b o15b3ob2o149bo3bo3bo13bo6bo18b2o26bo45bo23bobo17b2o4bo17b2o4bo20b2o18b o2bobob2o13b2o8bobo10bo3bo33b2o$30bo13bo2bo15bo2bo77bo3bo28b2o16bo217b o3bo19bo3bo20b2o22b2obo21bo2bo16bo9b2o12bo9b2o16bo2bo15bobo19bo24bo2bo 32bo8bob2o$bobobo3bobobo12b2o3bo9b2obo15b2obo145b2o150bobobo3bobobo13b ob2o21bo3bo19b3obo21bobo47bobo6b2o15b2ob4o17b2ob4o5b2o33bo25bobo11bo2b o40b4o$25bobob2o9b2o4bo12b2o4bo143bo169b2ob2o4bo46b2o29bo18bo29bo2bob 2o15bo7bo15bo7bo4bobo3b3o26bo25b2o15bo30bo2bo6bo3b2o$5bo3bo3bo11bobo2b ob2o8bobo2bo13bobo2bo312bob3o28bo2bo18b2o30b2o9b3o5bo2bo26b3o3b2o15bo 6bo16bo6bo4bo3bo4bo23bo27bo5b3o31b2o5b2o2bo11bo2bo$24bo4b2o16bo18bo 312bo2b2o3b2o22b2obo20bo33b2o6bo7bo27bobo5bo55b2o28bobo31bo9bo22b2o5bo $bobobo3bobobo10b2o18bo2bo4b2o9bo2bo319b2o23bo14b3o40b3o6bo2b5obo25b2o 2b2o2bo22bo20b2o10bo29bobo22b2o2bo5bo2b6o25bo4bobo13b2o3bo$24b2o19bobo 3b2o11bobo2b3o311bo3b2o21b2o14bo8bo36bo7bo32bobo25b4o23bo13bobo17b2o4b 3o21bo11bo33b2o2bo14b2o3bo$45bobo4bo11bobo2bo313bo3b3o20bo16bo2b5o34bo 2bo8b2o31b2o25bo25b2o14bobo16bo2b2o25bo12b2o31b2o18bo$46b2o3b2o12b2o4b o315bo23bo17bo39bo44bo27bo24bobo13bo18bo4bo25bo16b3o45bo$46bo18bo3b2o 317b2o40b2o37bobo132bo2bo25b2o15bo48b2o$605bo27b2o16bo$606bo$150b3o13b o26bo$150bo14b2o25b2o$151bo13bobo24bobo$153b2o$154bo13b2o25b2o$120bo3b o3bobobo35b2o25b2o$151b2o$120bo3bo7bo18b2o11bob2o18bo6b2o197b3o22b2o 23b2o23b2o19b3o17b2o24b2o17bo19bo13b2o23bo18b3o16b3o11b3o35b3o22b3o12b o$35b2o16b3o86b2o6bo3b2o7b4o18b2o5bo2bo196bo23b2obo22bobo22bobo18bo18b 2o25bobo15b2o18b2o12b2o23b2o18bo18bo13bo2b3o32bo24bo13b2o$35bobo15bo 66bobobo7bo9bobo3b2obo11bo3b2o16bobo3b2obo191b3o6bo21bo24bo24bo21bo11b 2o5bo25bo11bo5bobo17bobo13bo22bobo18bo18bo13bobo35bo24bo12bobo$35bo18b o87bo5b2obo2bo2bo10bo2bo17bo196bo6bo2bo20bo2bo24bo24bo20b2o7b2o5b2o28b o7b2o27bo15bo4b3o36b2o17b2o15bo34b2o27bo8bo$bobobo3bobobo24bo17b2o66bo 7bo12bo4b2o2b2o32bo198bo6bob2o19bo3bo22bobo22bobo18b2o10bo4bobo2b2o22b obo6bobo3b2obobo18bo14b3o4b2o15b2o17b2o17b2o14bo6b2o27b2o21b3o3b2o9bo$ 37bobo15b2o88b2o5bo14b2o3bo15bo2b2o196b2o3bob2o19bo2bo23bobo22bobo32b 2o3b2ob4o20bobo10bo7b2o13bobob2o13b3obobo16b2o54bob2ob2o20b3o26b5o2bob o5bob2o$5bo7bo23bobo8b2o74bo7bo16bo2bo14b2o4bobo17bo167bobobo3bobobo 16bo3bobo47bo24bo19bo14b2o10bo19bo11bo4bo5b2o12bob4o19bo33bo18bo22b2o 21bo5bo20b2o4bo11bo$37bo10bobo3bo113bo4bo2bo15bo201bob2o46bo15b2o7bo 11b3o5bo2bo23bo19bo11bo2bo2b6o31bobo11bo6b2o10b3o5bo2bo7b3o5bo2bo16bo 2bo23bo4bo16bo3b2obobo$bobobo7bo23bo10bo5bo95b2o16bo23bobo166bo11bo10b 3o3b2o6bo13b2obo2b3o12bo7b4o15bobo3b4o11bo7bo20bo21bo3bo38bo14b2obo10b 2o5bo2bo9bo7bo10bo7bo20b3o19b2o4bo2bo3bo11b2o3bo3b2o13b2o$33bo3bo13bo 2bo95bobo16b2o2b3o208bo2b2o2bob3obo14bob2o2bo2b3o8b2o5bo20bo3bo17bo2b 5obo16bo3b2o17b3obo38bo2bo13bo12bobo3b2obo11bo2b5obo9bo2b5obo18bo21bob o2b3o2bo3b2o9bobo2bobo16b2o4b2o$5bo7bo18b3obo14b2o2bobo96bo20bo18bobo 164bobobo7bo11bo2bo2b2obo17bob2o6b2o8bobo3b2o4bo18b2o4bo14bo22b3o20b2o 38b3o4bo11b2obo15bo18bo18bo24bo22bo12bo16bobo16bo4b2o$31b2o120bobo17bo bo211b2ob2ob2obo16bo23bo24bo4bo15b2obo19b2o2bo18b2o22b2o2bo12bo2bo5b2o 11bo14bo20b2o17b2o21bo26bo10bo14b3o18b2o4bo$bobobo7bo16b2o10b3o108bobo 17bobo19bobo167bo7bo19bo2bo16b2o14bo5bo4bo21bobo11b3o26b2o23bo21b2obo 2bo12bobobo2b2o10b2o15bo2bo2bo39b3o16bo24bo3bo50b2o$31bo10bo9bo120bobo 19b2o195b2o2bo7b2o2bo4b2o13b2o4b2o3bo22bo13bo5bo21b2o48bobobo15bo5bo 32bo18b3o18bo2b2o14bo24bo46b3o4bo$22b3o18bo2b6o122b2o19bo165bobobo7bo 29b2o4bo2b2o14bobo2b2o27bo14bo4bo22bo21b2o16b2o24bo21b3o16bo2b2o15bo2b 2o15b2ob2o42bo23bo20bo2bo$22bo8bo13bo128bo230b2obo2b3o18bo2b2o21bo3bo 16bo2bo13b3o28b2o16bobo3b3o12b2o3b4o18bo2b2o14bob2obo13b2ob2o11b2o22b 3o15b3o24bo5b2obo19bobob2o2bo$23bo2b5o15b2o144b2o2bo210b2o2bo19b2o24b 3obo11b3o2b3o2bobo10bo8bo12b2o6bo3b2o13bo3bo4bo10b2o4bo20b2ob2o9b2o4b 2o12b2o18b2o4bobo15bo4bo13bo9bo15b2o4b2o2bo$25bo166bo221bo17bob2o20b2o 15bo23bo2b5o13bobo3b2obo20b2o17bo2bo4bo11b2o17bobo2b3o11b2o4bobo14bo2b ob2o15bo4bo14bo2b6o16bobo31bob2o2b2o$26b2o164bo218bo2bo15b2o23b2o17bo 24bo18bo5b2obo2bo2bo14bo21b2o3bo10b2o4bobo11bo3bo16bo2bob2o16b2o18bo5b ob2o12bo26bo3bo25bo2bob2o$193bo218bo16bobo16b2o6b2o18bo3bo19b2o19bo4b 2o2b2o21bobo13bo18bo2bob2o14b2o3bo14b2o19b2o4bo15b2o3b2obo12b2o23bo33b o3bo$193b2o218bo15bobo16bobo3bo2bo17b2obo42b2o5bo25bobo13bo3bo15b2o17b o4bo14b2o4bo15bo5b2o19bobo17b3o17bo2bo28b2o$193b2o233bo19bo3bo3bo18bo 49bo2bo25bo14bo20b2o24b2o12bo5b2o18bo41bo53bo$428b2o21b2o21b2o94bo2bo 17bo18b2o3b2o18bo21bo20b2o19bo50b3o$428b2o21bo3b2o17bo51b2o43bo45bo18b o41b2o69b2o2bo$475bo50bobo149bo72bo$681b2o$681bobo$152b2o15bo20b3o14bo 18b2ob2o35b3o$152bobo13b2o20bo15b2o18bob3o35bo$33b3o14b3o99bo9bo5bobo 20bo14bobo17bo2b2o3b2o31bo$33bo16bo69bo3bo3bobobo22bo5b2o30b3o37b2obob 2o29b2o$34bo16bo102bobo4bobo3b2obobo10bo25b2o19bo5bob2o28b2o$bobobo3bo bobo22b2o15b2o65bo3bo3bo3bo21bobo8bo7b2o7b2o6b2o17b2o19bo5bo3bo20b3o$ 35b2o15b2o100bo9bo4bo5b2o5bobo5bobobo43bo22bo5bo122b2o29b3o16bo24bo32b o26b3o22b2o18b2o12bo36bo8b3o34b2o$5bo3bo3bo31b3o72bobobo3bobobo8b3o10b o9bo2bo2b6o10bo3bo3b2o9bob2o8bo22bobo19bo4bo121b2o30bo17b2o23b2o31b5o 23bo24bobo16b2o12b2o35b2o8bo2b3o30b2obo$34bo10bo5bo89bo9b4o30bo5bo12b 4o8b2o24bo15b2o4bo2bo122bobo29bo10bo5bobo16bo5bobo30bo2b2o24bo23bo20bo 11bobo34bobo8bobo33bo$bobobo3bobobo18bo4bo8bo4bo72bo3bo3bo9bo6bo35bo3b 2o2bo10bo3b2o6bobo23bobo13bobo2b3o2bobo119b2obo30b2o6b2o23b2o40b2obo 25b2o23bo19b2o61bo30bo2bo$31b3obobo10bo2bo92b2o2b2o4bo33bob4o15bo2bo 45bo132bob2o28b2o7bobo3b2obobo13bobo3b2obobo58b2o23bobo17bo13b2o35b2o 9bo6b2o24bo3bo$5bo3bo3bo16b2ob2o7b3o2b3o2bobo69bo3bobobo12bo26bo16b3o 3bo23b2o23bobo14bo123b2o4bo2bo41bo7b2o15bo7b2o31bobo47bobo31b2o35b2o 11bob2ob2o18b2o4bo2bo$29b2o11bo106bo21b2o2bo17b2o13b2o3bo5b2o40bo3bo 118b2o3b2o4b3o24bo12bo4bo5b2o12bo4bo5b2o53bo25bo14b3obo2bo43b2o20b2o 18b2o$bobobo3bobobo16bo12bo101b2o3bo24bob2o15bo13b2o4b2o29bobo13bo99bo bobo3bobobo12bob3o7bo21bo4bo9bo2bo2b6o13bo2bo2b6o31bobo18bo4bo22bo14bo 2bo11bob2o32bo2b2o14bo2bo21bo7bo$21b3o21bo3bo94bobob2o22b2obobo16b2o 13bo7b2o26b2o16bo128bo26b3obobo69b2o6b2o18b3obobo18bo3bo9b2o6bo2bo7b4o 33bo3bo15b3o23b2o2b2o$21bo8bo13b2obo96bobo2bob2o23bo16bo15bo3b2o3bo26b o7b3o105bo7bo3bo13bo3bo5bobo18b2ob2o72bobo3bobo18b2ob2o20b3obo9b2o5bo 12bo3b2o32b2obo15bo25bo2bo$22bo2b5o14bo98bo4b2o23bobo18b2o14b2o5bo35bo 9bo124bo2bo2b2obo19b2o28bo47bo3bo21b2o23b2o15bo4b4o14bo2bo28bo3b2o13bo 29bo$24bo18b2o98b2o28bobo21b2o19bo23b2o2bo7bo2b6o98bobobo3bobobo18bob 2ob2o19bo26bo2bo49b2o2b2o16b2o23b3o17b2o4bobo41b2o19bo27bo5b2o$25b2o 16bo99b2o27bo24bo44bo13bo133bo2b2o2bo2bo41b2obo2bo18b2ob2o2bo23bo3bo 18bo22b2o19b2o18b2o3bo18bo5bo7bo14bo26bo3b2o$44bo128b2o67bo14b2o106bo 3bo3bo16bo9bo14b2o24b2o2bo20b2o2bo2bobo25bo13b2o28bo39b2o4bobo14b2o5bo 22bo26b2o4bo$243bo148b3o20b2o26bo3bo20bo4bo19b3obo3bo13bo2b2o19b2o45bo 4bo2bo13bobo6b3o40b2o$243b2o116bobobo3bobobo22b3obo5b2o6bo3b2o26bo33bo 12bo2bo18bo3bo19bo2b2o24b3o15bo11bo38b3o20bo2b2o$243b2o155bo5bobo3b2ob o31bo3bo20b2o3bob2o7b2o6bo2bo17bo2bo18bo3bo24bo2b2o14b2o2b3o3b2o12b2o 3bo19bo4bo13bo4bo3bo$406bo5b2obo2bo2bo26b5o19b2o3bobobo5b2o5bo22bo2bo 20bo2bo22b2ob2o21bo3bobo12b2ob4o17bo4bo12b2o5b2obo$409bo4b2o2b2o29bob 3o19bo5bo9bo4b4o22bo20bo2bo17b2o27bobo18b2o4bo17bo5bob2o8bobo3bo3b2o$ 409b2o5bo33bo22bo6bo10b2o4bobo9b3o32bo16b2o4bobo21bobo3bo2bo12bob2o21b 2o3b2obo11bo$413bo2bo32b2o23b2o15b2o16bo9bo13b3o27bo2bob2o21bobo5b2o 43bobo10bo4bo2bo$450bo59bo2b6o14bo9bo21b2o25b2o8bo8bobo43bo2bo$414b2o 34bo61bo21bo2b6o22b2o25bo9bo8bo32b2o$414bobo96b2o21bo29bo44b3o30b2o$ 518b3o16b2o73bobo29bo$141b2o28bo14b3o21b2o18bo28b2o16bo240bo23b3o102b 3o$140b2o28b2o14bo22b2o18b2o28bobo14b2o241bo22bo105b2o$27b2o24b2o86bob o26bobo14bo23bo11bo5bobo27bo16bobo264bo$27bobo22b2o87b3o45b2o22b2o7b2o 38bo17bo$27bo26bo65bo3bo3bobobo8b2o30b2o15bo21bo9bobo3b2obobo27bobo16b o$bobobo3bobobo10b2obo24b2o89bobo27b2o6b3o42bo7b2o25bobo4b2o10bo$24bo 4bo22b2o66bo3bo3bo3bo48bo10b2o13b3obo2bo10bo4bo5b2o23bo6bobo5b2o$5bo3b o3bo10bob2o6b3o108bobo20b2ob2o9bo5b2ob2o2bo11bo2bo14bo2bo2b6o24bo6bo6b 2o2b3o$29b3o4b2o15b2o65bobobo3bobobo14b3o16b2ob3obo10b3ob2o12b2o6bo2bo 43bo3bo9bo4bo2b3o99b2o24b2o22b2o29b2o26b2o22b2o19b2o14bo16bo16bo15b2o 21b2o29b2o16b2o$bobobo3bobobo16b3obobo14bo95bo18bo2b2o2bo11b3o3b2o3bo 4b2o5bo47b3obo10b2o2bobo2bo100bobo22b2o22b2o30bobo25bobo21bobo17b2o14b 5o12b5o12b5o11b2o22bobo4bo22b2obo14b2obo$37bo9bo2b5o69bo7bo13bo21bo18b o3b3obo7bo4b4o17b2o24b2o18bo3bo101bo26bo23bo2b3o24bo27bo23bo21bo13bo2b 2o12bo2b2o12bo2b2o13bo21bo5bo24bo17bo$5bo7bo16bobo9b2o2bobo4bobo85bob 2obo4bo11b4obo18bo3b2o2b2o8b2o4bobo14b2obo15b2o5b2o18bo4b2o103bo25b2o 23bo2b3o24bo27bo23bo34b2obo13b2obo13b2obo14b2o21bob2o2b2o20bo2bo14bo2b o$29b2obo9bobobo4bo72bo3bobobo7b2ob2obo16bo4b2o18b5o12b2o23bo16bobo4bo bo18bo108bobo22bo20bo8b2o23bobo25bobo21bobo15bo5b3o60bo22bob2o4bo20bo 3bo13bo3bo$bobobo3bobobo16bo11bo3bo93bobo4bo14b2o57b2o24bo3bo3bo20bo2b 3o78bobobo3bobobo11bo2bo3b3o35bob3o30bobo25bobo21bobo14bob3o2bo14bobo 14bobo14bobo34bo22b2o4bo2bo8b2o4bo2bo$28b2obo16b2ob2o92b2o10bo11bo24bo 13b2o11bobo3b3o20b2o134b2o2bo2b2o13bo2bo16bo3bo3bo27bo27bo23bo15bo3bo 4bo60bo2bo20bo2bob2o15b2o16b2o$31bo13bo99bo3bo6b2o6bo27b2o15b2o10bo3bo 4bo20bo2bo24b3o78bo7bo3bo17bo5b2o6b3obo18b2ob2o23b2o7bo18b2o7bo14b2o7b o14b2ob2o20bobo14bobo14bobo6b2obo23bo2bobo18bo7bo9bo7bo$29b2o14b2ob2o 94bo3bo7bobo3b2o45b2o13b2o16b2o35bo110b2o4b3o5bo2bo2bo11b3o2bo2b2o23bo bo3b4o18bobo3b4o14bobo3b4o9b3o2bo2b2o12b2o6b2o7b2o6b2o7b2o6b2o6b2o4bo 27bo19b2o2b2o12b2o2b2o$160bo4bo45bo3bo8bo5bo11bobo3b3o29bo3bo75bobobo 3bobobo14b3o9bo3b2o17bo5b2o3b2o20bo3bo23bo3bo19bo3bo14bo5b2o3b2o9bobo 3bobo8bobo3bobo8bobo3bobo9bobo2bo6bo13b3o23bo2bo14bo2bo$144bo2bo11bo4b o46b3obo26bo3bo4bo30b2obo100bo2bo6bo2bo23bo3bobo28b2o4bo21b2o4bo17b2o 4bo10bo3bobo14bo3bo12bo3bo12bo3bo18bo5b2o13bob2o25bo17bo$143b2obo12bo 2bo53bo28b2o117bo7bo13bo8bo7b3o20bo30bo4bo22bo4bo18bo4bo15bo20b2o2b2o 11b2o2b2o11b2o2b2o11bo2bo5bobo16bo21bo5b2o10bo5b2o$143bo67b2o32bo5bo 134b2o7bo7b2obo20bo2bo26bobo25bobo13b3o5bobo19bo2bo16bo3bo12bo3bo12bo 3bo13bobo23bo2bo20bo3b2o12bo3b2o$142b2o69bo146bobobo3bobobo14bo6bo2bo 9bo21bo27bo27bo15bo2b2o3bo23bo20bo16bo16bo14bobo8b2o16bobo18b2o4bo11b 2o4bo$142bo249b2o4bo5b3obo4bo4b3o36bo27bo17bo5bo12b3o25bo3bo12bo3bo12b o3bo15b2o7b4o18bo$143bo244b2obo6b2o6b2o4b2o4bo9bo24bo3bo23bo3bo16b2o5b o12bo9bo14b2obo13b2obo13b2obo19bo5bobo18b2o16bob2o14bob2o$388b2o4bo13b o3bobo4bo2b6o24b3obo23b3obo17b2o5bo13bo2b6o14b2o4bo10b2o4bo10b2o4bo21b 3o2bo17bo2bobo11b4o14b4o$389bo5b2o24bo29b2o26b2o16bo9bo17bo22bobo2bo 11bobo2bo11bobo2bo20bo3b2o21b4ob2o6bo3b2o12bo3b2o$390b2o4bo12b3o10b2o 26b2o26b3o15b2o6bo21b2o25bo16bo16bo20bobo26b2o3bo10bo2bo14bo2bo$409bo 39b2o26b2o17bobo3b2o27b3o16bo2bo13bo2bo13bo2bo21b2o4bobo19bo4bo$409bo 32b2o6b2o26bo21bo4bo25bo19bobo14bobo2b3o9bobo3b2o16bo6bobo22bo10b2o4b 2o10b2o5bo$410bobo29bobo3bo2bo17b3o27bo4bo27bo18bobo4bo9bobo2bo11bobo 2b2o24bo21b3o11b2o4bobo9b2o4b2o$411b2o29bo3bo3bo18bo8bo20bo2bo49b2o3b 2o10b2o3bo11b2o4bo46b2o12bo4bo12bo4bobo$411bo33b2o23bo2b5o74bo4bobo9bo 16bo66bo17bo$410bobo32bo3b2o21bo181b2o16b2o$410b2o61b2o$409bo$410bo2bo $409bo$410bo2bo$411bo11$22b3o33bo23b2o26b2o16bo29b3o20b3o22b2o23b3o14b 3o25b2o20bo20b3o30b2o23b3o24b2o17bo18b3o21b2o16b2o24b3o13bo$22bo34b2o 22b2obo25bobo14b2o29bo22bo24bobo22bo16bo26b2o20b2o20bo2b3o26b2o24bo26b obo15b2o18bo23bobo14b2o25bo14b2o$23bo33bobo22bo27bo10bo5bobo29bo22bo 23bo25bo16bo19b2o5bo14bo5bobo20bobo30bo24bo25bo17bobo2bo15bo22bo18bo 25bo13bobo$22b3o57bo3bo26bo6b2o39b2o21b2o23bo24b2o15b3o14b2o5b2o13b2o 33bo29b2o23b2o25bo15bo2bobo16b2o22bo17b2o24b2o$22b3ob2o31bob2o19bo3bo 25bobo5bobo3b2obobo30bo20b2o23bobo22b2o6bo28bo4bobo2b2o8bobo3b2obobo 21bo30bo24b2o25bobo12bobo2bobo17bo21bobo15bo25b2o14b2o$58b2o22bo3b2o 24bobo9bo7b2o19b2o53bobo29b2o6b2o22b2o3b2ob4o10bo7b2o21bobo44b2o32bobo 11bo2bo16b2o26bobo8b3o23b3o20b2o$58b2o5bo20b3o23bo10bo4bo5b2o16b2o3bo 24bo25bo18b3o2bo7bobo5bobobo19b2o10bo8bo4bo5b2o12b2obo6bo20b3obo2bo15b obo3bo19b3o5bo13bo19bo2b2o15b3o5bo10bo5bo2bo16bo5bo$24b2o34bobob2o17bo b2o12b3o10bo10bo2bo2b6o18bobob5o18bo4bo22bo17bo5bo11bo3bo3b2o30bo8bo2b o2b6o12b2o3bo2bo2bo20bo2bo19bo5bo19bo7bo13bob2o16bo3bo15bo7bo11bo2b2o 21bo4bo14b2o$24b2o6b2o28bobobo12b2o4b2o12bo9b4o40b2obo3b2o17b3obobo18b o3bo16bo3bo2bo10bo5bo28bo32b3o4bo2bo2bo3bo23bo2bo19bo2bo3bo16bo6bo17bo 17bo2bo9b2o6b2o3bo13bo3bo21bo2bo13bo2bo$27b2o3bo2bo24bo17b2o20bo6bo45b 3o22b2ob2o20b3obo17bo3b2o2bobo7bo3b2o2bo28b2o29bo6bo2bo2bo3bo21bo24b2o 2bo3b2o16b2o3bo18bo16bo2bo9bobo3bo6bo14bobo16b3o2b3o2bobo9b2obo$obobo 3bobobo14b5o28bo19bo2b2o17b2o2b2o4bo64b2o23b2o22b2o18bob4o30bo31bo3bo 6bobo22b4o28bo19bo2bo15bo2bo20bo9bo5b2o4bo10b3o4bo16bo17b3o$28b2o5b3o 9b2o10bo11b2o2bo6bo2bo17bo42b3o27b2o23b3o26bo16b3o3bo23bo3b3o15bo2bo2b o5bo2bo8b2o22b2o4bobo10b3o14bo9b2o26b2obo9b3o21bo4b3o12bo4b2o18bo16bo$ o7bo3bo15bo3bo4bob2o5b2o3b2o6b3obo6b2o4bo4bo2bo22bo25b2o11bo2b3ob2o22b o22b2o17b3o29b2o23b3o19b6obo6bo2bo6b3o21b2obo16bo9bo16bobo3b3o19b3o10b o9bo13b2o19bo5bo19bo3bo11bo$28bo9bo9bob3o4b2o3b3o7b2obo3bobobobo17b2o 3bo23b2o14bo5bo46bo17bo9bo22bo22b2o5b2o13b2obo2bo9bo5bo3bo15b2o6bo19bo 2b6o17bo3bo4bo17b3o2b2o8bo2b6o37b2o3bo17b2obo12b2o3bo$obobo3bo3bo13b2o 2bo5b2o15bob2obo15bobobo6b2o15bobob2o17b3o4bo14b2o5bo19b2o44bo2b6o23b 2o20b2o20b2o17bobob2obo15b2o5bo23bo26b2o39bo42b3o12b2o23b2o2bo4bo$26bo 10bo12bo7bo16b2o5bo18bo2bo2bob2o14bo5b2o14b2o2b2o21b2o22b2o22bo28bo23b o21bo19b2o21bo2b2o23b2obo23bo22b2o3bo14b2o25b3o8b2ob2o3b2o9bobo3b2o2b 2o21b2o$o3bo3bo3bo24bo12bo2b2o4bo15b2o2b2o5bo15bo3b2o18bo5bo9bo22b2o6b o3b2o19b2o21b2obo27b2o2bo9b3o19b3o30bo20bo3bo48bobo3bobo14b2o3bo41bo2b 2o6bo4bo13bo3bo6bo15bo5bobo$27bobo28b2o16bo8bo7b2o7bo25b2o11b2o6bo15bo bo3b2obo14b2o6bo3b2o52bobo8bo8bo12bo8bo44b4o21bo27bo6bobo14bo24b3o17b 2ob2o7bob3o17b2o3bo18bo$obobo3bobobo16bo2bo20b2o4bo33bobo3b4o26bo3bo7b obo3b2o16bo5b2obo2bo2bo8bobo3b2obo21bo34bo11bo2b5o14bo2b5o21bo2bo37b3o 5bo2bo15b2o7bo6bo16bobo22bo2b2o10b2o19b3o19b2o18bobob4o$29b2ob3o17b2o 39bo3bo32b3o12bo4bo17bo4b2o2b2o10bo5b2obo2bo2bo7b3o5bo2bo33b3o9bo21bo 41bo6b2o17bo7bo18bobo3b4o47b2ob2o10b2o4bobo32bo26bo$31bo22bo41b2o4bo 26bo14bo4bo18b2o5bo16bo4b2o2b2o9bo7bo38bob2o7b2o20b2o38b2o5bo2bo17bo2b 5obo16bo3bo30bobo14b2o20bo2bob2o15bo16bo27b3o$30bo65bo3bo24b2ob3o13bo 2bo24bo2bo16b2o5bo13bo2b5obo37bo71bobo3b2obo20bo26b2o4bo41b2o4bobo16b 2o31b3o22b2o3bobo$30bo93b2o70bo2bo15bo42b2o76bo26b2o24bo3bo28bobo14bo 2bob2o16b2o17b2o12bo24bobob2obo$126bob2o43b2o41b2o41bo75bo86b2o17b2o 20bo17bo16bo21bo4bobo$173bobo21b2o60bo75bo2bo83bo18b2o35b3o14bo2bo24b 2o$197bobo242bo35bo17bo27bo$419b2o2bo55bo17bo26bo$419bo$419bo$420bo$ 420b2o$420b2o4$26b2o29b2o14b3o25b3o21b2o24b3o12b2o15bo18bo11b3o23b3o 24bo23bo27b2o26bo14b2o16b2o8b3o$25b2o29b2o15bo27bo23bobo23bo13b2o15b5o 14b5o8bo2b3o20bo9b2o14b2o22b2o27bobo24b2o13b2obo14b2obo7bo$26bobo29bo 16bo26bo22bo26bo14bo14bo2b2o14bo2b2o9bobo23bo6b3obo7bo5bobo21bobo26bo 26bobo13bo17bo10bo$26b3o31b2o11bobo28b2o22bo25b2o13b2o13b2obo15b2obo 13bo22b2o2b2o10b2o31bo29bo39bo2bo14bo2bo6b3o$26b2o31bo13b2o30bo21bobo 23b2o13bo49bo25bo14bobo3b2obobo22bo27bobo25b2o11bo3bo13bo3bo5b3ob2o$ 28bobo41bo26b2o26bobo16b3o38bobo16bobo11bobo25bo14bo7b2o17bobob2o18b2o 5bobo24b3o5b2o4bo2bo8b2o4bo2bo$58bo2bo10bobo24bo2b2o23bo18bo5bo10b3obo 2bo52bo20b2o3bo12bo4bo5b2o16bob4o17bobo4bo26bo6b2o16b2o$30bobo24b2o11b 2o2b2o23bo3bo23bo19bo4bo10bo2bo21bobo16bobo10bo2bo19bobob2o13bo2bo2b6o 40bo6bo35bo7bo9bo7bo9bo$obobo4bo22b3o21bo9bobo3bobo2bo23bo2bo18bo3bo 21bo2bo13bo2bo10b2o6b2o9b2o6b2o11bo2bo19bobo2bob2o41bo23bo3bo22b2obobo 9b2o2b2o12b2o2b2o9b2o$32bo22bo2bo6b3obo2b2o4bo22bo2bo17b3obo16b3o2b3o 2bobo8bo15bobo3bobo10bobo3bobo12bo2bo18bo4b2o43bo2bo20bo4bo21bo5bo9bo 2bo14bo2bo11bo$o8bo21bo23bo9bo2b2o7bo26bo16b2o20bo20b4o12bo3bo14bo3bo 20b2o16b2o27b2obo13b3o4bo20bo3bo15b3o3bo3b2o14bo17bo12b3o$26bob2obo4bo 18bo37b3o24b2o22bo15b3o4bobo13b2o2b2o13b2o2b2o13bo2b2o16b2o27bo2bo13bo 2bo24bobo17bo5bo16bo5b2o10bo5b2o$obobo4bo15b2ob2obo14b3o4b2o15bo2bob2o 16bo9bo17bo24bo3bo9bo2bo19bo3bo14bo3bo18bobo43bobo15bobobo14b2o5bobo 19bo3bobo16bo3b2o12bo3b2o9b2obo$25bobo4bo13bo2b3o23bo2b2o14bo2b6o42b2o bo13bo23bo18bo16b2o25b3o40bo15bobo3b3o14b2o7b2o18b2o4bo11b2o4bo8b2o$o 3bo4bo20b2o16bo5bo20bob2obo8b3o4bo21b2o18b2o21b2o3b2o14bo3bo14bo3bo16b o4bobo19bo2b2o35bo18bo3bo3bo14bobo5b3o53bobo$30bo3bo12b2o20b2o4b2o12bo 7b2o19b2o18bobo3bo16b2o3bobo10b2obo15b2obo21bo5bo18b2ob2o19b3o14b4o18b 2o5bo12bo3b3o2bo15bob2o14bob2o$obobo4bo19bo3bo13b2o2b2o16bobo2b3o13bo 2b3o13b2o6bo3b2o15bo5bo16b3o2bo11b2o4bo12b2o4bo26bo12b2o27bo2b2o12bo 22bob4o16b2o2bo16b4o14b4o20b3o$47b2o20bo3bo18bo2bo13bobo3b2obo22bo2bo 21bo13bobo2bo13bobo2bo18b2o6bo10b2o4bobo20b2ob2o13bo3bo9b2o11b2o16b2o 19bo3b2o12bo3b2o26bo$29bo2bo11b2o2bo23b2o3bo17bo13bo5b2obo2bo2bo16b2o 2bobo15bob2ob3o14bo18bo18bobo5bobo10bo2bob2o15b2o20bo4bo9bobo3b3o17bo 30bo2bo14bo2bo17bobob2obo$28b2obo11b2o27bo4bo6b3o25bo4b2o2b2o42b2o5bo 9bo2bo4b2o9bo2bo41b2o17b2o4bobo14bobo12bo3bo4bo15b2o6bo64bo2bobo$43bob o38bo9bo17b2o5bo12b3o29b3o6bo9bobo3b2o11bobo2b3o23b2o11b2o19bo2bob2o 16bo15b2o20bobo3b2o23b2o3bo12b2o4b2o18b2o$27bo12b3o2bo27b2o10bo2b6o22b o2bo12bo9bo27bobo10bobo4bo11bobo2bo25bo13bo21b2o15b2o18bo5bo19bo4bo21b 2o3bo12b2o4bobo$19b3o5bo12bo46bo45bo2b6o24bob2o14b2o3b2o12b2o4bo22b2o 35b2o15b2o43bo4bo23bo5b2o10bo4bo17b2o$19bo7bo60b2o27b2o16bo48bo18bo3b 2o24b2o35bo12bo4bo42bo2bo25bo4b2o11bo3b2o17b2o5b2o$20bo2b5obo9b3o75bob o16b2o144b2o4b3o70b2o4bo11b2o22bo3b2o$22bo18bo79b2o107b2o50bobo118b2o 3bo$23b2o14bobo79b2o106b2o55bo4bo110bo4b2o$39bobo188b2o53bo4bo112bo$ 39bobo188b3o52bo2bo113bo$40b2o188bo172bo2bo$40bo190b2o171bo4$192b3o20b 3o21b2o14bo14b2o32bo19b3o23b3o24b3o18b3o9b2o16b2o38b3o7b2obo$31b2o27b 2o10b3o38b3o20b3o30bo22bo22bo23bobo12b2o13b2o32b2o19bo2b3o20bo26bo20bo 10b2o16b2o3bo35bo9bo3bo$31bobo26bobo9bo9b2o29bo22bo31b2o23bo22bo22bo 14bobo14bo25bo5bobo19bobo23bo26bo20bo11bo17bob2o36bo8bo4bo$31bo28bo12b o6b3obo29bo22bo30bobo24b2o21b2o22bo30b2o21b2o32bo22b2o25b2o19b2o10bo4b 3o10b3o37b2o7b2o$34bo28bo11b2o2b2o35b2o21b2o55bo20b2o22bobo13b2o13bo 23bobo3b2obobo20bo23b2o25b2o19b2o11b3o4b2o9bo6b2o32bo9bobo$33bobo26bob o11bo38b2o21b2o31b2o18b3o47bobo13b2o41bo7b2o20bobo39b3o18b2o19b3obobo 12b3obo2bo$obobo3bobobo20bobo26bobo15bo27b3o20b3o36b3o18bo24bo24bo29bo 2bo24bo4bo5b2o10b2o5bo2bo13b3o2bo20bo5bo14bobo3bo21bo12b2o23b2obo2bobo 16b2o$33bo28bo13b2o3bo26bo5bo16bo5bo32bo23b2o18bo4bo21bo6bo6b2o11b2obo 27bo2bo2b6o10b2o5b2obo13bo5bo21bo4bo14bo5bo14bobo12bo4b2ob2o19b2o3bobo b5o13bo2bo$o11bo20b2o14b3o10bo12bobob2o5b2o21bo4bo17bo4bo53bo2b2o17b3o bobo17bo3bo5b2o5bo2bo9b2o4bo49bo3b3o14bo3bo2bo23bo2bo17bo2bo13b2obo11b 2o6bo22bo2bo3bo3b2o$33b2o14bo9b4o12bobo2bob2ob2o3bo20bo2bo19bo2bo28b2o bobo22bo17b2ob2o19b3obo6bobo3b2obo12bobo2bo2b3o52bo11bo3b2o2bobo19b3o 2bobo14b2o2bobo11bo13bobo28bo2bo21b2o2bo$obobo3bobobo23bo13bo6bo16bo4b 2o6bob2o14b3o2b3o2bobo10b3o2b3o2bobo24bo5bo17bob2o18b2o22b2o14bo22bo2b o46b2o6bo12b2o65b2obo16bob2o23bo7b2o15bo$38b2o12b2o2b2o4bo11b2o9bo19bo 22bo35bo3b2o18b3o3bo17bo21b2o14bo20bo2bo3bo26bo2bo2bo10b2obo5bo4b2o11b o37b3o25bo15bo4bo29bo$o3bo3bo11b2o8b3o3b3obo12bo20b2o7b3o20bo22bo33bo 2bo20b3obo3bo39bo14bo2b2o3b3o11bobo3bo25b6obo10bo2bo10bobo33b2o2bo10bo 9bo15b2o16bo4b2o21bo7b2o11bo4b3o$20bobo3bo3bo2b2o2bo2bo16bo5bo18bo3bo 21bo3bo18bo3bo27bo22b4obo2bo14b2o44bobo14bobo2b2o24b2obo2bo11b2obo11bo 8b3o23b2obo13bo2b6o45b2o15b3o17b2o$obobo3bobobo7bo3bo2bo5bo5bo13b2o3bo 3b2o16bo26b2obo19b2obo31bo21bo21b2o21b2o20bo5bo12b2o2b3o22b2o17bo2bo 14bo3b2ob2o22b2obo16bo25b3o17bobo3bobo14bo3b2o14bobo2b2o$23b2o3bo2b3o 18bobob2o4bobo14b2o4bo37b3o37bobo15b2obobob2o10b2o6bo3b2o18b2o20bo5bo 12bo27b2o21bo14b2obo26b2o20b2o23bo2b2o15bo5bo16bo3b2o18b5o$23bo4b2ob3o 18bobo2bob2obo17b2o24bo16bo5bo33b2o11b2o3bo4bo13bobo3b2obo13b2o6bo3b2o 18bo3b2o2bo15bobobob2o15bo17bo21b3o25bo44b2ob2o17bobo3bobo6b3o27bo5bo$ 29bo2b2o17bo4b2o5bo16b3o21bo4bo14bo4bo32bo13bobo2bo18bo5b2obo2bo2bo7bo bo3b2obo23bo6b2o15b2o3b3o5b3o21b2obo43b2o31b3o10b2o31b2obo5bo6bobo22bo 3bo$31b2o18b2o27bo22b3obobo16bo2bo31bo14bo6b3obobo13bo4b2o2b2o9bo5b2ob o2bo2bo24b2o16bo6bo4bo8bo13b2o4bo16bo3bobo18bo2b2o28bo2b2o7b2o4bobo21b o6bo6bo4b2obo21bo$30bobo18b2o28b2o19b2ob2o13b3o2b3o2bobo31bo14bo3b2o3b o14b2o5bo15bo4b2o2b2o25b2o21b2obo5bo2b5o16bobo2bo14b2obob3o18bo3bo27b 2ob2o10bo2bob2o21b2o4bo9b4obo22b2obo$31bo24bobo42b2o17bo39b2o17b2o26bo 2bo15b2o5bo19b2o6b2o23b2o8bo26bo14bo3bo23bo2bo21b2o20b2o41b2o26bo$30bo 24b4o43bo18bo35bob2o69bo2bo19bobo3b2o2bo22b2o9b2o21bo2bo13b2o5bo21bo2b o20b2o4bobo14b2o4bo21bo41b2o$31bo23bo37b3o27bo3bo25b3obo50b2o43bo5b3o 24b2o33bobo13bo6bo24bo22bo2bob2o15bo5b2o20b2o40b2o$93bo8bo19b2obo26bo 2b2o2bo48bobo20b2o23bo30bo33bobo14bo19b3o33b2o23bo65bo$94bo2b5o20bo28b o60b2o17bobo22b2o64b2o34bo9bo25b2o24bo57b3o4b3o$96bo24b2o28bo60b2o21bo 86bo36bo2b6o27bo82bo5bo$97b2o22bo22b2o7bo80bobo124bo117bo4bo$122bo20b 2o6bobo80bobo125b2o117b2o$145bo2b2o332bo$147b2o2b2o329bo$147b2o6$19b3o 33bo17b2o45b2o31bo30b2o24bo22b3o6b2obo24b2o30b2o20b2o14bo35b2o16bo23b 2o12b2o28b2o$19bo2b3o29b2o16b2o46bobo29b2o29b2o24b2o22bo8bo3bo22b2o30b 2o13b2o6bobo12b2o35bobo14b2o22b2o12b2o28b2obo$20bobo25bo5bobo17bo45bo 31bobo30bo23bobo22bo7bo4bo23bo23b2o5bo13bobo5bo14bobo34bo10bo5bobo23bo 13bo28bo$25bo21b2o27b2o45bo63bo23bo24b2o6b2o27b2o19b2o5b2o13bo8b2o52bo 6b2o33b2o12b2o25bo2bo$23bo23bobo3b2obobo16bo46bobo30b2o29bobo23bo22b2o 9bobo4bo18bo23bo4bobo2b2o11bo5bo2b2o12b2o34bobo5bobo3b2obobo22bo13bo 27bo3bo$25bobo23bo7b2o54b2o5bobo29b3o28b2o22bobob2o37b2o44b2o3b2ob4o9b 5o6bo11b2o34bobo9bo7b2o56b2o4bo2bo$28bo21bo4bo5b2o11bo2bo3bo33bobo4bo 31bo30b2o23bob4o18bo13b2ob2obo16bo2bo23b2o10bo20bo38b3o5bo10bo4bo5b2o 13b3obo2bo10bo2bo18b2o$25bo2bo21bo2bo2b6o9b2obo5b2o33bo6bo62b3o44bo4bo 11b3o16b2obo38bo11bobo4b2o7bob2o28bo7bo10bo2bo2b6o14bo2bo11b2obo23bo7b o$obobo3bobobo12bo2bo41b2o4bo3bobo35bo3bo27b2obobo25b3ob2o15b2o8bo18b 3obobo29b2o4bo30bo14b2obo4b4o6b4o32b2o3bo31b2o6bo2bo7b2o4bo23b2o2b2o$ 25bo2bo43bobo2bo34b2o3bo4bo26bo5bo24bo2bo18bobo3b3o19b2ob2o34bobo2bo 31b2o7b2o3bo5b2o9bo3b2o6bo21bo6bo30b2o5bo14bobo2bo5bo16bo2bo$o11bo16b 2o25b2o2b2o15bo4bobo27bobo2bo3bo26bo3b2o25bo22bo3bo5bo16b2o17bo2bo22bo 33bo6bo3bo6bobo13bo2bo2b2o21b2o4bo33bo4b4o16bo4b2o19bo$26bo2b2o25bob4o 12bo2bo6bo27bo4b3o27bo2bo28bo25b2o23bo17b2o3bo6b2o9bo2bo28bo3b3o5bo4bo 3bobo21bobo17bo4b3o22bobo12b2o4bobo11bo2bo4bobo15bo5b2o$obobo3bobobo 17bobo23bo4bobo11bobo6bobo28bo31bo33bo27bo38b3o2bo6bobo9bobo3bo23b3o 12bobo3b3obo12b3o3bobo18b3o27b4o12b2o19bobo23bo3b2o$27b2o35bo10bobo36b obo32bo29bobo24bo20b2o21bo2bobo4bo11bobo3b2o21b2o5b2o8bo4bobo11b2o3bo 6bo16b2o29bo36bobo4b2o17b2o4bo$o3bo7bo14bo4bobo28b3o10b2o8bobo25bobo 30bobo29b2o25bo20b2o27b2o3bobo9b2o2bo2bo19b3o17bo16bo2bobob2o19b2o68b 2o4bo$28bo5bo41bo37bo32b2o29bo23b3o13b2o6bo3b2o24b2o3b2obo8bo4bobo18b 2o18b3o15bobo26bo32bo16b3o16bo9b2o9bob2o$obobo3bobobo22bo27bo23bobo24b o31bo30bo24bo15bobo3b2obo29b2o5bo13bo21bo18bo24bo15b2o37bo16bo2b2o21b 2ob4o6b4o$28b2o6bo27bo22b2o21bo3bo30bo34bo16b3o5bo12bo5b2obo2bo2bo23bo 5bo27b3o27b2o21bo15bo2b2o33bo2b2o12b2ob2o21bo7bo5bo3b2o$28bobo5bobo24b obo21bo21b3obo62b2o19bo4bo2bo15bo4b2o2b2o45b2o3bo8bo8bo41bo17bo3bo33bo b2obo6b2o30bo6bo10bo2bo$63bo44b2o34b2o2bo24bob2o23bo2bo17b2o5bo28b2o3b o14b2o4bobo6bo2b5o42bobo17bo2bo26b2o4b2o9b2o4bobo49bo$38b2o23bo25bo17b 2o32bob2obo22b3obo18b2o3bo2bo3bo20bo2bo28b2o3bo15bo4bo2bo7bo47bobo17bo 2bo26bobo2b3o11bo2bob2o27b2o12b2o3bob2o$38bo24bobo23b3o16bo28b3obo26bo 2b2o2bo15b2o5bo59bo19bo16b2o40b2o4b3o19bo26bo3bo16b2o28bo15b2o3bobobo$ 37b2o23b3o24b3obo5b3o34bo2b2o2bo23bo25bo4bobo25b2o30bo20b2o2b3o51bo2b 2o12b3o38b2o3bo12b2o4bo22b3o15bo5bo$38b2o22bobo34bo8bo26bo31bo27b2o2bo 26bobo30b2o24bo51bo4bo11bo9bo30bo4bo13bo5b2o20bo2b2o13bo6bo$62b2o27b3o 6bo2b5o27bo24b2o7bo25b2o2b2o29bo52bobo53bo2bo12bo2b6o55bo25bobo13b2o$ 40bo21b2o27bobo8bo25b2o7bo21b2o6bobo59bobo51bobo54bo16bo38b2o22bo$39bo 2b2o19bo28b3o8b2o22b2o6bobo23bo2b2o63bobo51bobo55bo16b2o86b3o$40bob2o 50bo34bo2b2o29b2o2b2o115b2o$44bo86b2o2b2o26b2o119bo$42bobo86b2o$42bo$ 43bobo$45bo7$28b2o31b2o27b3o26b2o27b3o31bo32bo22b3o22b2o10b2o25b2o20b 2o15b2o15b3o21b3o23b2o29b2o24b2o8b2o23b3o14b2o29b2o18b2o30b3o13b2o$28b obo29b2o28bo27b2o28bo32b2o31b2o22bo24bobo8b2o25b2o21bobo14bobo14bo2b3o 18bo2b3o19b2o30bobo23bobo6b2o24bo16bobo27b2o19bobo29bo14b2o$28bo33bo 28bo28bo28bo31bobo30bobo22bo23bo12bo26bo20bo16bo17bobo21bobo23bo2b3o 24bo25bo10bo24bo15bo31bo18bo8b3o21bo15bo$31bo32b2o27b2o27b2o27b2o88b2o 23bo11b2o25b2o20bo4bo11bo19bo23bo23bo2b3o24bo25bo9b2o3bo19b2o9b2obo33b 2o18bo3b2ob2o23b2o14b2o$30bobo24bo5bo28b2o27bo28b2o32b2o31b2o21b2o23bo bo9bo26bo22b2o2bobo9bobo16bo23bo20bo8b2o23bobo23bobo8b2o2bobo19bo9bo4b o20b2o8bo20b2obo27b2o14bo$30bo3b2o20b2o27b3o55b3o37b3o30b3o46bobo63bob o9bobo18bobo21bobo15bob3o30bobo23bobo11b2obo29bob2o6b3o12b2o33b3o18b3o $obobo3bo3bo17bo3b3o19bobo2bo3bo19bo5bo28bo2bo19bo5bo33bo32bo22bo25bo 10bo2bo23bo2bo24b2o10bo13b2obo6bo13b2obo6bo13bo3bo3bo27bo19b2o4bo13b2o 18b2o16b3o4b2o13bo6bo3bo42bo5bo15bo2bo3bo$21b3o6bo29b2o24bo4bo27b2o23b o4bo87bo4bo22bo7b2obo23b2obo27bo11bo12b2o3bo2bo2bo12b2o3bo2bo2bo12b2ob 2o23b2o7bo18bo2bo3bo13b2o18b2o2bo14b3obobo20b2o22bo3bobo18bo4bo12b2obo 5b2o$o7bo3bo8bo12bobo22b2o2bo24bo2bo26bo27bo2bo29b2obobo27b2obobo18b3o bobo18bo3bo6b2o4bo20b2o4bo24bo2bo6b4o6b3o4bo2bo2bo3bo6b3o4bo2bo2bo3bo 7b3o2bo2b2o23bobo3b4o17bo3bo3bo24b2o6bo2bo3b2o18bo15bo2b2o2bo19b2obob 3o20bo2bo3bo7b2o4bo3bobo$22bo2b4o2b2ob2o20bo25b3o2b3o2bobo22bo2bo24b3o 2bobo25bo5bo26bo5bo17b2ob2o20b3obo9bobo2bo21bobo2bo31bo11bo6bo2bo2bo3b o6bo6bo2bo2bo3bo7bo5b2o3b2o20bo3bo22bo7bo13bo10bobo3b2ob3o3bo12bobo15b 6o26bo3bo17b3o2b3o2bo3b2o7bobo2bo$obobo3bobobo11bo5bo5bo3bo14b2o3b2o 20bo34bo59bo3b2o27bo3b2o18b2o23b2o18bo26bo24bobo3b2o4bo9bo3bo6bobo10bo 3bo6bobo9bo3bobo28b2o4bo17bob2o3bo10b2ob2o10bo5b2o4b2o2bo10b2obo15b2o 3bo3b2o20b2o5bo15bo12bo14bo4bobo$25bo4bo5b3obo14bobo25bo33bo58bo2bo29b o2bo20b2o23b3o15bo2bo23bo2bo26b2o15bo2bo8b2o10bo2bo8b2o15bo30bo4bo22bo bo11b2o3bo13bo24bo16bo3b2o26bo6bo16bo12bo10bo2bo6bo$o3bo7bo28bo14b2o 27bo3bo20bo4b2o26b2o2bo27bo2bo30bo24bo22b2o18bobo3bo20bobo3bo23bo3bo 12bo2bo6b3o11bo2bo6b3o16bo2bo26bobo16b2o23bob2o13b2o3bob2o14b2obo10b2o 2b2obo31bo23bo3bo18bobo6bobo$26b2ob2o5b2o46b2obo21b5o28b2obo29bo35bo 46bo18bobo3b2o19bobo3b2o6bo33bo5bo3bo13bo5bo3bo19bo21b2o4bo18bobo3b3o 21bo16bo2bo17bo10bobob2o2bo18b2o8bobo22b2obo20bobo$obobo7bo13b2o2bo7bo 16b3o51bo6bo24b2obo32bo31bobo19b2o45b2o2bo2bo19b2o2bo2bo4b2o17bo17bobo b2obo16bobob2obo9b3o29bo2bo3bo18bo3bo4bo56b2o11bo3b2ob2o18bobo3b3o17b 2o32b2o8bobo$27bobob2obo16b2o3bo26bo56b2o33bobo31b2o20b2o22b2o21bo4bob o19bo4bobo4bobo14b2o20b2o22b2o13bo9bo20bo3bo3bo21b2o24b3o17bo34b2o20bo 3bo5bo15bobo3b2o2b2o22bo$32bobo16bo3bo25bo4bo22bob2o19b3o4b2o34b2o31bo 13b2o6bo3b2o19b2o26bo6bo19bo23bo25bo23bo11bo2b6o21bo7bo20bo20b2o2b2o 18bo21b3o37b2o5bo15bo3bo6bo33bobo$32bo2bo15bo4bo23b3obobo16bo6bo21bo7b o33bo32bo14bobo3b2obo14b2o6bo3b2o29bobo28b2o13bo62bo27bob2o3bo21bobo3b obo12bobob2obo15b3o20bo2b2o7b2o30b2o20b2o3bo36b2o$53bobo23b2ob2o18b5o 26bo2b3o2bo31bo36bo11bo5b2obo2bo2bo8bobo3b2obo26b2o3bobo5b2o12b2o3bo5b 2o14bo20bo26bo14b2o28bobo23bo6bobo11bo3bo18bo2bo18b2ob2o7b2o28bo28b2o 36bo$31b2o21bo23b2o22bo2b2o2b2o24bo2bo37bo29b2o17bo4b2o2b2o10bo5b2obo 2bo2bo20b2o3bo2b2obobo13b2o4b2o42bobo18b2o22b3o13b2o24b2o7bo6bo38bo14b 2o16b2o27bo25bo$33bo19bo23b2o25bobo3b2o26bo33b2o29bob2o18b2o5bo16bo4b 2o2b2o23bo26bo7b2o16b2ob2o19bobo17bobo21bo15bobo3b3o17bobo3b4o24bo10b 3o21b2o4bobo10b3o22b3o27bo38bo2bo$52bobo23bo26bo3bo17b3o39bob2o26b3obo 25bo2bo16b2o5bo26bo7bo2bo15bo3b2o3bo18b2obo18bo19bo24bo14bo3bo4bo16bo 3bo31bo8bo9bo15bo2bob2o10bo24bo25b3o32b2o5b2o2bo$51bo2bo14b3o31b2o22bo 9bo27b3obo28bo2b2o2bo47bo2bo27b2o4bo3bo16b2o5bo19b2obo81b2o24b2o4bo23b 2o11bo2b6o18b2o14b2o25bo22bo33b2o5bo$52bo16bo8bo18b2o5bo23bo2b6o27bo2b 2o2bo25bo32b2o58bo28bo103bo25bo3bo24bo15bo24b2o38bo2bo25bo32bo4bobo$ 43b2o7bo17bo2b5o19bobo4bo25bo32bo32bo2bo30bobo21b2o35b2o46bobo86bobo 46bo2bobo12b2o23bo39bo24bo2bo34b2o2bo$43bobo3b4o19bo24bo6b2o25b2o30bo 32bo37b2o18bobo84bo87bobo46bob2o79bo24bo36b2o$43bo3bo25b2o25bo3b2o50b 2o7bo23b2o7bo35b2o22b2o81bo87bo47bo109bo$46b2o4bo47b2o53b2o6bobo22b2o 6bobo59b2o216b3o$46bo3bo106bo2b2o28bo2b2o$159b2o2b2o27b2o2b2o278b2o2bo $159b2o31b2o284bo8$42b2o23bo26b2o30bo32bo30b2o31b2o9b2o18b2o39b3o23b2o 24b3o20bo23b2o24b3o23b3o20bo29b3o6b3o42b2o20b2o20bo19b2o20bo28b2o19b2o 19b3o21b2o14b2o17b3o34bo24b2o23b3o10b3o$42bobo21b2o26bobo28b2o31b2o29b 2o31b2o9b2o10bo8bobo38bo25bobo23bo21b2o23bobo23bo25bo21b5o26bo8bo2b3o 39bobo18b2o20b2o18b2o20b2o27b2o20bobo18bo23bobo12b2o18bo35b2o24bobo22b o12bo$42bo23bobo25bo30bobo30bobo30bo32bo9bobo7b2o8bo41bo24bo26bo20bobo 22bo26bo25bo20bo2b2o27bo8bobo41bo22bo19bobo19bo13bo5bobo28bo19bo21bo 22bo16bo20bo32bobo23bo25bo12bo$45bo51bo95bo32bo7b3o7bobo10bo40b2o24bo 25b2o45bo25b2o24b2o19b2obo28b2o10bo41bo21b2o40b2o9b2o38b2o19bo20b2o22b o15b2o14bo2bo61bo24b2o8b3o$44bobo22b2o25bobo29b2o31b2o29bobo30bobo6b2o 10bo10bobo37b2o24bobo23b2o21b2o22bobo23b2o24b2o51b2o9bo42bobo19bo21b2o 18bo11bobo3b2obobo27bo20bobo20bo21bobo13bo17bo2bo34b2o23bobo22b2o9b3ob 2o$44bobo22b2o25bobo28b3o30b3o28b2o31b2o10bobo8bo9bo2bo3b3o56bobo16b3o 27b2o22bobo16b3o23b3o29bobo18b3o17bobo31b2o5bobo41b2o34bo7b2o17b2o27bo bo14b2o26bobo32bo36b2o16b2o5bobo15b3o$44bo16b2o33bo30bo32bo30b2o31b2o 18bob2o11b2o2bo2b2o28bo26bo18bo5bo18b2o27bo18bo5bo19bo5bo46bo5bo16bo 30bobo4bo20bo2bo38bo2bo12bo4bo5b2o15bo2b2o2bo2bo10b3o5bo16bo2b2o15b3o 5bo18bo17bobo27b2o21bobo4bo17bo5bo$obobo3bobobo31bo15b2o5b2o18b2o7bo 94b3o30b3o11bobo4bo17bo5b2o23bo4bo23bo19bo4bo18bo2b2o15b2o7bo19bo4bo 20bo4bo26bobo18bo4bo13bo2bo30bo6bo12b2o5b2o13bo6b2o11b2o5b2o15bo2bo2b 6o16bob3o2bo13bo7bo16bo3bo15bo7bo17bobo18b2o26bo2b2o18bo6bo18bo4bo14bo $40bo3bo17bo3bo2bo17bobo3b4o26b2obobo27b2obobo25b3ob2o27b3ob2o14b3o20b 2o4b3o21b3obobo19bo3bo21bo2bo18bo3bo15bobo3b4o21bo2bo22bo2bo3bo14b2o6b 2o21bo2bo13bo2bo33bo3bo11b2o5bo14b2o5bo2bo9b2o5bo46bo4bo2bo6b2o6b2o3bo 18bo2bo9b2o6b2o3bo8b2o3b3ob3o19bo26bo3bo21bo3bo20bo2bo3bo9b2o$o7bo30b 3obo21b2obo18bo3bo30bo5bo26bo5bo24bo2bo29bo2bo17bo5b2o12b3o9bo19b2ob2o 21b3obo16b3o2b3o2bobo16b2obo15bo3bo20b3o2b3o2bobo13b3o2b3o2bo3b2o12bob o3bobo16b3o2b3o2bobo10bo2bo32bo4bo13bo4bobo12bobo3b2obo12bo4bobo2bo41b o6bo7bobo3bo6bo2b2o14bo2bo9bobo3bo6bo8bobo2bo2bob2o18b2o27b2obo20bo4bo 19b3o2bo3b2o7bo$38b2o20bo29b2o4bo24bo3b2o27bo3b2o25bo32bo20bo6bobo10bo 2bo6bo2bo18b2o24b2o20bo27bo3b2o17b2o4bo15bo25bo12bo14bo3bo20bo26b2o30b o3bo16b2o2bo17bo19b2o2bo3bo56bo5b2o4bo3bobo16bo9bo5b2o4bo9bo5bo3bo18b 3o26bo3b2o19bo3bo28bo10b3o$obobo3bobobo24b2o20bob3o25bo4bo25bo2bo29bo 2bo27bo2bo30bo15bob2obo4bobo12bo8bo21b2o24b3o21bo24bo23bo4bo18bo25bo 12bo16b2o2b2o17bo22bo2b2o30b3o18b2o19bo20b2o5bo2b2o32b3o7bo13bo4b3o5bo 7b3o21bo4b3o14bo5b2obo2bo8b2ob2ob2o17b3o3b2o26bobo21bo2bo6bo$38bo19bo 3bo26bobo27bo2bo30bo30bo35bo12b2ob2obo19b2o7bo22bo23b2o25bo3bo17b3o5bo 16bobo23bo3bo21bo3bo23bo3bo20bo3bo20bobo26bo43bo2bo2bo21bob2obo18b2o 11bo23b2o19bo9bo13b2o20bo2b2o4b3obo7bo3bob2o17bo5bo7bo11b2o5bobo15b3o 4bo2bo16b2obo$o3bo7bo11bo32b2ob2o27bo29bo35bo30bo31bobo12bobo4bo19bo6b o2bo45bo24b2obo12bo6bo3bo12b3o5bo24b2obo22b2obo17b2o9bo20b2obo19b2o29b 3o48bo21b2o21b2o13bo2b6o36bo2b6o36bo3bo3bo2bobo7bob3o2bo19bo3bo19bobo 3b3o16bo6b2ob2o15b2o$23b2o10b2o15b3o2bo2b2o18b2o7bo31bo31bobo28bobo31b 2o18b2o25b2o4bo16b2o66b2o7bo15bo7bo17b2o24b2o26bo2b2o2bo3bo14b3o3bo22b o4bobo22b2o2bo23b3o20bo2b2o17b3o38bo44bo68b2o15b4obo5b3o15bo3bo3bo17bo 2b3o2b2o18bobo$obobo3bobobo10bobo11b5o10bo5b2o3b2o15bobo3b4o29bobo31b 2o29b2o31bo20bo3bo18b2obo6b2o15b2o23b2o20b3o2bo15bobo2b3o18bo6bo17bobo 3bo19bobo3bo21bob3o2bo17bo5b2o23bo5bo21b2o27bo2b2o18bob2obo15bo23bo6bo 11b2o25b3o15b2o25b3o26b2o9b3o15bo31b2o5bo17bo3bob2o$33bobob2ob2o11bo3b obo20bo3bo34b2o31bo30bo32bo20bo3bo19b2o4bo3b2o6b2o6bo3b2o20b2o19bo5bo 19b4o20b2o3bo2b2o13bo5bo19bo5bo22bo4bo2bo14bo3bo2bo31bo19b2o27b2ob2o 19b2o17b2o3bo21bob2ob2o38bo2b2o40bo2b2o24b2o28bo2bobo3bo22bob4o21bo24b 3o$26b2o3bobo22bo26b2o4bo28bo32bo30bo36bo42bo5b3obo6bobo3b2obo15b2o6bo 3b2o15bo3bo2bo18bo25bo2bo3bobo15bo2bo3bo18bo2bo22bo6bo15bo3b2o2bo23b2o 6bo19bo50b3o16bo5bo22bo3bobo15b3o18b2ob2o20b3o17b2ob2o40b3o17b2ob4o11b 2o11b2o10b3o41bo$27b2ob3obo22bo2bo21bo4bo29bo67bo29b2o20bo2bo22b2o4b3o 7bo5b2obo2bo2bo9bobo3b2obo19bo3b2o2bobo19bo12b2o14bo17b2o2bo3b2o16b2o 2bobo43b2o29bobo5bobo11b2o32bobo19bo18bo3b2o27b2o17bo2b2o11b2o28bo2b2o 10b2o24bo6b2o10b3o4b2o16b2o4bo11bobo3b3o16bo9bo27bobob2obo$27b2o4bo25b o22bobo65b2o2bo26b2o29bob2o20b2obo42bo4b2o2b2o11bo5b2obo2bo2bo14b2o22b o4bo12bobo3b3o32bo38b3o7bo23bo30b2o16bo2b2o27b3obo17b2o3bo15bo29b4o2bo 14b2ob2o11b2o4bobo21b2ob2o10b2o4bobo17b2o5bo2bo9b3o7b2o14bob2o13bo3bo 4bo16bo2b6o30bo2bobo$28bob2o16b3o31bo33b2o2bo26bob2obo25bob2o26b3obo 23bo45b2o5bo17bo4b2o2b2o20bo16b2obo17bo3bo4bo15b3o14bo8b3o26bo22b3o39b 2o4b2o10bo3bo26b2o20bo5bo8b2o7bo26b2obobo11b2o21bo2bob2o16b2o20bo2bob 2o17bobo3b2obo20b3o33b2o23bo38b2o$48bo9bo14b2o7bo30bob2obo24b3obo26b3o bo28bo2b2o2bo20b2o49bo2bo17b2o5bo12b3o24b2o4bo18b2o20bo9bo15bo9bo19bo 2b6o13bo9bo37bo13bo2bo24b4obo16bo3b2o9b2o6bobo26bo4b2o9b2o4bobo17b2o 18b2o4bobo16b2o24bo14b2o12bo10bobo19bo25b2o$26bobo20bo2b6o15bobo3b4o 26b3obo28bo2b2o2bo23bo2b2o2bo25bo28bo75bo2bo12bo9bo18bobo2bo17bo22bo2b 6o17bo2b6o22bo20bo2b6o37b2o13bo2bo23b2o21bo16bo2b2o31bo16bo2bob2o17b2o 20bo2bob2o16b2o4bo18bo15bo10bo2bo10bo26bobo54b2o$26bo24bo21bo3bo30bo2b 2o2bo25bo30bo32bo2bo27bo50b2o39bo2b6o24bo22bobo17bo25bo29b2o20bo44b2o 15bo24bo14b2o7bo16b2o2b2o32b2o13b2o21bo22b2o20bo5b2o16bo2bo23bo13b3o 25bobo53b2o$26b3o23b2o22b2o4bo24bo32bo2bo28bo32bo81bobo22b2o16bo27bo2b o23bobo17b2o24b2o50b2o48b3o24b3o20b2o6bobo16b2o36bobo12b2o44b2o4bo20bo 45bobo12bobo24bo56bo$27bobo46bo3bo26bo32bo24b2o7bo23b2o7bo83bo20bobo 16b2o26bobo23bo138b2o7bo9bo16bo8bo15bo2b2o74bo45bo5b2o19bo143bobo$100b 2o7bo23b2o7bo21b2o6bobo22b2o6bobo82bobo23bo42bobo161b2o9bo2b6o18bo2b5o 18b2o2b2o56b3o63bo$99b2o6bobo22b2o6bobo23bo2b2o28bo2b2o86bobo22bobo42b 2o162b2o10bo26bo23b2o127bo166bobo$101bo2b2o28bo2b2o29b2o2b2o27b2o2b2o 108bobo42bo163b3o10b2o25b2o$103b2o2b2o27b2o2b2o26b2o31b2o321bo359bobo$ 103b2o31b2o387b2o357b2o$884bo2$881b2o2bo$881bo$881bo$882bo$882b2o$882b 2o8$28b2obo21b2o27bob3o20b2o6b2o23b2o16bo35b2o24b2o29b2o32bo7b2obo41b 3o27b3o19b2o19b2o27b2o23b2o24b2o24b2o24b2o15bo33b3o21b3o23b3o25b2o21b 3o20b3o19b3o26b3o24b3o10b3o41b3o31b2o16bo23bo24bo23b3o24b3o18b3o10b3o 25bo23b2o21b3o25b3o33b3o7b3o$28bo3bo19b2o25b2obo4b2o18bobo3b3obo21b2o 16b2o35bobo23bobo27b2o32b2o7bo3bo40bo29bo20b2o19b2o27b2o23b2o24b2o24b 2o24b2o15b2o33bo23bo25bo27bobo20bo22bo21bo28bo2b3o21bo12bo2b3o38bo33bo bo14b2o22b2o23b2o23bo5b3o18bo20bo12bo9b2o15b2o22b2o22bo27bo35bo9bo2b3o $28bo4bo19bobo23bo2b6o19bo4b2o27bo15bobo34bo25bo31bo31bobo6bo4bo40bo 29bo13b2o5bo13b2o5bo29bo24bo25bo25bo25bo14bobo33bo23bo25bo26bo23bo22bo 21bo28bobo24bo12bobo41bo32bo16bobo21bobo22bobo23bo2b2ob2o19bo20bo12bo 6b3obo8bo5bobo23bo22bo27bo35bo9bobo$30b2o21b2obo22bo28b2o33b2o52bo25bo 30b2o39b2o44b2o28b2o9b2o5b2o12b2o5b2o31b2o23b2o24b2o24b2o24b2o49b2o22b 2o24b2o26bo22b2o21b2o20b2o30bo23b2o14bo40b2o32bo15bo23bo24bo18b3o4bo 26b2o19b2o11b2o2b2o11b2o33b2o21b2o26b2o34b2o11bo$obobo3bobobo11b3o5bob o19bob2o19b2o24b2o2bobo3bo22bo5bo17b2o34bobo23bobo28bo33b2o8bobo4bo35b 2o28b2o12bo4bobo2b2o9bo4bobo2b2o25bo24bo25bo25bo25bo16b2o34bo23bo23b2o 26bobo20b2o21b2o22bo3b2o23bo24b2o13bo41b2o32bobo15bo23bo24bo17bo7b2o 23b2o19b2o13bo15bobo3b2obobo22bo24bo27bo33b2o10bo$24bo10bo12b2o4bo2bo 18b2o6b3o15b2o31b2o23b2o27b2o5bobo16b2o5bobo61b3o14b2o58b2o21b2o3b2ob 4o9b2o3b2ob4o143b2o28b2o22b2o21b3o32bobo13b3o20b3o31b2o26bobo37bobo30b 3o38bobo12bobob2o18bobob2o19bobob2o16bo2b3o40b2o24bo15bo7b2o39b2o26b2o 31b3o18bobo3b2o$o7bo18bo5bo13b2o3b2o5b2o15bob2obobo19bobo4bo24bobo2bo 3bo10b2o32bobo4bo18bobo4bo29bo2bo30bo12b2ob2obo33bo23bobo3bo16b2o10bo 8b2o10bo21bo2bo21bo2bo22bo2bo22bo2bo22bo2bo8b2obo32bo2b2o19bo2b2o18bo 5bo28bo15bo5bo16bo5bo30b2o15b2o5bo2bo14b3o2bo20bo29bo5bo26b3o5bo15bob 4o18bob4o19bob4o17bo2bo20b3o2bo14bobo3bo15b2o3bo13bo4bo5b2o17bo2bo16bo 2b2o23bo2b2o28bo5bo17bo2bobo$24bo2bo6bob2o11bob3o7b2o10b2obo4bo4bo16b 2ob4o29b2o14bo2b2o3bo25bo6bo18bo6bo28b2o47b3o34bo4bo20bo5bo28bo20bo20b 2o23b2o24b2o24b2o24b2o11bo3b2o30bo3bo19bo3bo19bo4bo28bo16bo4bo17bo4bo 24b6o16b2o5b2obo14bo5bo17bo2bo30bo4bo26bo7bo90bo19bo5bo14bo5bo14bobob 2o14bo2bo2b6o10b2o5b2o19bo3bo23bo3bo29bo4bo14bo2bo2bo$obobo3bobobo12bo 2bo6b4o16bo3bob2o10bob4obo22b3o32b2o2bo7bo4bo3bo3b3o26bo3bo21bo3bo27bo 31b2obobo48b3obobo23bo2bo21bo20bo26bo24bo25bo25bo25bo13bo5b2o30bo2bo 20bo2bo20bo2bo24bo3bo18bo2bo19bo2bo3bo20bo2b2obo17bo3b3o15bo3bo2bo3bo 13bo2bo32bo2bo3bo25b2o3bo17bo23bo24bo12b3o27bo3bo2bo17bo2bo3bo10bobo2b ob2o32b2o5bo23bo2bo24bo2bo30bo2bo14bo2bo$26bo3bo8bo10bo3bo3bo2b2ob3o5b o2bo2bobo3bo50bo13b2o5b2obo4b2o20b2o3bo4bo15b2o3bo4bo26bo2bo28bo5bo47b 2ob2o26b2o2bobo15b2o4b2o42bo2bo21bo2bo22bo2bo22bo2bo22bo2bo13b2obobo 30bo2bo20bo2bo14b3o2b3o2bobo20b3obo13b3o2b3o2bobo10b3o2b3o2bo3b2o5b2o 13bo4bo25bo12bo3b2o2bo3b2o11bo2bo31b3o2bo3b2o21bo6bo16bo2bo20bo2bo21bo 2bo10bo9bo19bo3b2o2bobo14b2o2bo3b2o7bo4b2o37bo4bobo21bo2bo24bo2bo24b3o 2b3o2bobo11bo2bo$o3bo3bo3bo15bo2bo7b2o10bo2bo6bo10bobo7bo13b3o35b2o3b 2o8bobo3bo3b2o5b2obo16bobo2bo3bo16bobo2bo3bo27bo30bo3b2o13bo2bo31b2o 51b2o2b3o13b3o4b2o22bo24bo25bo25bo25bo55bo23bo14bo31b2o17bo22bo12bo7bo bo10bo6bo17b2o6bo13b2o8bo17b2o37bo23b2o4bo13b3o4bo16b3o4bo17b3o4bo11bo 2b6o21b2o29bo9b2o28b2obo12b2o2bo25bo27bo24bo27b2o$29bo2bo4b2o3bo10b2o 11bo5bo5b2obo14bo2b3ob2o29bobo16bo13bobo16bo4b3o18bo4b3o29bo29bo2bo16b 2o3bo6b2o22bo21b3o28bo18bo2b4o2bo21bo24bo25bo25bo25bo12b2obo28b3o21b3o 24bo29b2o19bo22bo12bo6bo11bo23b2obo5bo5b2o11bo6bo13bo2b2o38bo19bo4b3o 15bo2bo20bo2bo21bo2bo17bo31bo10b3o14bo8b2o28bo2bo12b2o17b3o25b3o34bo 23bo2b2o$obobo3bobobo18b2o4b2obobo11bo7b2obo10b2obo18bo5bo30b2o15bo4bo 2bo6bo2bo18bo25bo26bo4b2o29bo2bo17b3o2bo6bobo7bo35bo9bo14b2o26b3o16b3o 4b2o16b3o4b2o17b3o4b2o17b3o4b2o17b3o4b2o13bo3bo6b2o19bo9bo13bo9bo18bo 3bo16b2o6b2o20bo3bo18bo3bo16bo7b2o3bo19bo2bo11bobo35bobo25b2o2bo25b3o 22bobobo19bobobo20bobobo16b2o18b3o19bo9bo45bobo32bo9bo17bo9bo28bo3bo 21bobo$31b2o2b2o2b2obo11b2o6bo8b2o4b2o18b2o5bo47bo2bo32bobo23bobo24b5o 32bo22bo2bobo4bo8b2o10b2o24bo2b6o15bo2b2o17bobo22bo2b3o19bo2b3o20bo2b 3o20bo2b3o20bo2b3o16bo4bo4b2o21bo2b6o15bo2b6o18b2obo18bobo3bo2bo19b2ob o19b2obo18b2o2b2obo2b3o19b2obo12bo8b3o23b2o28b2obo26b2o27bo23bo24bo37b o9bo12bo2b6o23b3o56bo2b6o19bo2b6o28b2obo20b2o$32bo2b2o17b2o2bo2bo9b2o 24b2o2b2o31b3o20bo8b2o20bobo15b3o5bobo24bo6bo31bo26b2o3bobo5bobo11b5o 21bo21bo3bo16b2ob2o2bo20bo5bo18bo5bo19bo5bo19bo5bo19bo5bo15b2o8bo15b3o 4bo16b3o4bo17b2o27bo3bo3bo13b3o20b3o30bo5bo21bo2bo15bo3b2ob2o23bo4bobo 21b2obo26b3o24bo23bo24bo26b3o12bo2b6o15bo29bo2b2o37b3o16bo27bo34bo23bo 4bobo$33b2o2bo19b2o13bo4bo14bo37b2o3bo21bo10bo19bo17bo2b2o3bo63bobo26b 2o3b2obo14bobob2ob2o20b2obo21bo2bo15bob5o20b2o23b2o24b2o24b2o24b2o23bo bo3b2o16bo7b2o14bo7b2o15bobo3bo18b2o5b2o17bo5bo16bo5bo26bobo3bo24bo15b 2obo29bo5bo20b2o28b2o21b2o3b4o15b2o3b4o16b2o3b4o23bo2b2o12bo22b2o26b2o b2o20b3o15bo2b2o15b2o26b2o6bo24b2o24bo5bo$34bob2o20bo2b2o9bo18b2o6bo 30bo3bo21bo31bo19bo5bo26bob2o33b2o28b2o5bo7b2o3bobo21b2o30bo2bo17bo24b 2o2b2o19b2o2b2o20b2o2b2o20b2o2b2o20b2o2b2o22bo2b2o17bo2b3o18bo2b3o6b3o 9bo5bo18bobo8b2o14bo4bo17bo4bo24bob2o3bo17b3obo22b3o34bo20bo29bo20b2o 4bo17b2o4bo18b2o4bo25b2ob2o14b2o43b2o28bo2b2o12b2ob2o23b2o26b2o24bo32b o$56b2o15b2o16bobo3b2o31bo4bo22bo25bo3bo18b2o5bo27bo34bo30bo5bo9b2ob3o bo20bobo3bo28bo16bo3b2o20b2o23b2o24b2o24b2o24b2o24bo9b3o13bo2bo20bo2bo 6bo14bo2bo18bo3bo3bo20bo2bo3bo15bo2bo23b2ob2o21bo2bo53b2o6bo13b2o28b2o 27bo2bo4bo15bo2bo4bo16bo2bo4bo16b2o50b3o13b2o4bobo21b2ob2o8b2o30b2obo 25bo5b2o20bo23b2o6bo$35b3o19bo37bo4bo31bobo24bob2o20b3obo19b2o5bo61bo 47b2o4bo21bo5bo17b3o25b4o19b2o2bo20b2o2bo21b2o2bo21b2o2bo21b2o2bo25bob 3obo2bo18bo23bo7bo13b2o2bobo18b2o18b3o2b3o2bo3b2o7b3o2b3o2bobo20bo2bo 17b2o6bo2bo17bo3bobo26bobo5bobo11bo2b2o25bo2b2o27b2o3bo18b2o3bo19b2o3b o15b2o4bobo22b3o19bo2b2o13bo2bob2o16b2o15b2o4bobo29bo5bo18bob2ob4o6b2o 8bobo23bobo5bobo$57bo36bo4bo33bo25b2ob2o18b2o18bo9bo27b2obo35bo28b2o5b o9bob2o26bo2bo17bo9bo19b2o18b2o23b2o24b2o24b2o24b2o30b3o2bo4bo5b3o21b 3o56bo2bo15bo12bo9bo34bobo15b2o5bo21b2obob3o30bo17bo3bo25bo3bo26bo23bo 7bo16bo23bo2bob2o22bo2b2o16b2ob2o16b2o18b2o4bobo11bo2bob2o27bo2bo3b2o 27bo5bobo3b3o$94bo2bo61bob3o17b3o17b2o6bo23b2o5b2obo31b2o31b2o4b2o39b 2o2bobo15bo2b6o40bobo22bobo23bobo23bobo23bobo33bobob2o6bo9bo13bo9bo13b 3o23b2o27bo12bo9bo33bo2b2o15bo4b4o18bo3bo32bobo4b2o12bo2bo26bo2bo26bo 3bob2o16bo3bo2b2o16bo3bo20b2o24b2ob2o12b2o24b2o4bo15bo2bob2o13b2o30bo 6bobo18bo2b2o3bo5bo3bo5bo35b2o$132b2o26b2o18b2o19bobo3b2o23b2o6bo31bob 2o33bo4bobo6bobo53bo43b3o2bo19b3o2bo20b3o2bo20b3o2bo20b3o2bo32b2o12bo 2b6o15bo2b6o14bo9bo15bobo3b3o22bo3bo18bo3bo49b2o4bobo15b2o5bo30bobo4bo 13bo2bo26bo2bo25bo7bo15bo10b2o12bo25b2o19b2o19b2o4bobo19bo5b2o15b2o16b 2o4bo27bob4o21bo15b2o5bo35bo$129b2ob2o47bo23bo4bo23bo2bo30b3obo36bo13b o22b3o31b2o41bo24bo25bo25bo25bo37bo15bo23bo21bo2b6o16bo3bo4bo20b2obo 19b2obo51b2o22bo6bo36b2o16bo29bo26bo2bo20bo2bo6b3o12bo2bob2o19bo18b2o 4bobo15bo2bob2o24bo17b2o4bo12bo4bo24b2obobo3bo22b3o15b2o36b2o$128bo3bo 39b3o29bo4bo26b3o28bo2b2o2bo35b2o11b3o20bo9bo207bo16b2o22b2o21bo25b2o 25bo22bo79bo43b2o4b3o27b3o36bo6b2ob3o11bo11bo12bo4bo40bo2bob2o17b2o28b o17bo5b2o15b2o23b2o3bo26bo14bo41b2o$120b2o5b2o2bo40bo8bo22bo2bo28b2o 28bo57bobo20bo2b6o66b3o22b3o23b3o23b3o23b3o58b3o40b2o23bo25b2o21b2o 129bo9bo19bo9bo35b2o24bo2bo60b2o20b2o51bo18bo24bo30bo14bo$119b2o5bo46b o2b5o47b2o5b2o28bo2bo80bo74bo24bo25bo2b3o20bo3b2o20bo58bo47b3o22bobo 18bo22bo121b2o8bo2b6o21bo2b6o37bo3bo20bo21b2ob3o36b2o21bo52bo42bo28b3o 10b3o40b2o$121bo4bobo46bo51b2o6b2o28bo84b2o70bobo22bobo23bobo2bo20bobo 2b2o19bobo59bo46bo25bobo18bo22bo119b2o11bo29bo44b2o22bobo19b2o41bo93b 2ob3o19b2o25b2o2bo9bo41b2o$123b2o2bo48b2o51bo2b2ob2o21b2o7bo154bobo2b 3o17bobo3b2o18bobo3bo19bobo4bo18bobo107bo24bo164b2o11b2o28b2o89bo3bo 131b2o52bo14bo39b2o$123b2o106b2o24b2o6bobo154bobo2bo19bobo2b2o19bobo 23bobo23bobo4bo292b3o132b2o134bo3bo60bo2bo39b3o$231b2o26bo2b2o159b2o3b o19b2o4bo19b2o24b2o24b2o3b2o292bo271b2o63bo41bo$261b2o2b2o156bo24bo25b o25bo25bo4bobo292b2o335bo41b2o$261b2o6$37b3o16b2o32bo29bo18bo26b2o19b 3o30b2o33bo33b2o30b2o24b2o9b3o51b3o15bo27b2o28b2o20b2o21b3o18b3o17b3o 17bo29b3o26b2o21bo23b3o17b3o22b3o7b3o30b3o27b3o27b3o7b3o$37bo2b3o13bob o30b2o28b2o17b2o26bobo18bo32bobo31b2o32b2o31bobo23bobo8bo2b3o48bo16b2o 26b2o28b2o20b2o22bo2b3o15bo2b3o14bo2b3o13b2o29bo28bobo19b2o23bo19bo14b 2o8bo9bo32bo29bo29bo9bo2b3o$38bobo15bo32bobo27bobo16bobo25bo21bo31bo 33bobo33bo30bo25bo11bobo51bo9bo5bobo27bo29bo21bo22bobo18bobo17bobo15bo bo2bo26bo27bo15bo5bobo23bo19bo12b2o10bo9bo32bo29bo29bo9bobo$43bo15bo 33bo46bo28bo20b2o31bo68bo31bo25bo13bo50b2o5b2o37b2o28b2o20b2o24bo20bo 19bo13bo2bobo27b2o27bo11b2o33b2o18b2o11bo11b2o5b3o33b2o28b2o28b2o11bo$ 41bo17b2o32bo28b2o17bo26bobo18b2o31bobo32b2o32bobo29bobo24b2o10bo51b2o 6bobo3b2obobo26bo29bo21bo24bo20bo19bo13bobo2bobo26b2o27bobo10bobo3b2ob obo22b2o18b2o14b2o7b2o6b3ob2o29b2o28b2o28b2o10bo$obobo3bobobo30bobo20b 2o25bo28b2o14bobob2o24bobo51bobo31b3o31b2o31bobo24b2o12bobo40b2o17bo7b 2o103bobo18bobo17bobo8bo2bo24b3o33bobo14bo7b2o55bo45b2o58b3o18bobo$46b o14b2o3bo2bo19b2o48bob4o23bo19bo33bo33bo33b2o31bo20b3o2b2o16bo39bobo3b o11bo4bo5b2o21bo2bo26bo2bo18bo2bo16b2o5bo2bo10b2o5bo2bo9b2o5bo2bo8bo 27bo5bo21b3o5bo15bo4bo5b2o17bo19bo24bo36bobo3bo29bo23bo5bo17bo$o11bo 30bo2bo14b5o22b2o2b3o18b2o5b2o33b3o10bo20bo23b2o7bo67b3o30bo20bo2b4o 13bo2bo39bo5bo11bo2bo2b6o14b2o5b2o2bob2o15b2o5b2o13b2o5b2o18b2o5b2obo 10b2o5b2obo9b2o5b2obo9bob2o25bo4bo21bo7bo15bo2bo2b6o10b3o5bo2bo8b3o5bo 2bo11bo2bo3bo2bo11bo24bo5bo21b3o5bo2bo21bo4bo14bo2bo$43bo2bo15b2o5b3o 16bo2bo20b2o5bo2bo13bo4bo13bo9b4o21b2o21bobo3b4o29b2obobo28b3ob2o27bo 3bo22bo17bo2bo42bo2bo36b2o5bo5bo2bo13b2o5bo14b2o5bo22bo3b3o14bo3b3o13b o3b3o15bo26bo2bo24b2o3bo37bo7bo11bo7bo11b2obo5b2o2bo10b2o27bo2bo21bo7b o20b2o4bo2bo13bo3bo$obobo7bo30bo2bo15bo3bo4bob2o13bo25bo3b2obo13b2o3bo 2bo12bo6bo27b2o20bo3bo33bo5bo27bo2bo29b3obo24b2o15bo2bo42b2o2bobo35bo 4bobo7bo14bo4bobo14bo4bobo29bo20bo19bo13bo24b3o2bobo19bo6bo38bo2b5obo 10bo2b5obo8b2o4bo3bobo2bobo7bo28b2o2bobo19bo2b5obo18bobo2b3o2bobo9b2o 3bo$62bo9bo43bo18bobo5bo14b2o2b2o4bo18b2o5bobo19b2o4bo27bo3b2o28bo32b 2o29bo2bo16b2o84b2o2bo10bo14b2o2bo17b2o2bo22b2o6bo12b2o6bo11b2o6bo9bo 2bo52b2o4bo20b2o19bo19bo17bobo2bo3bo14b3o7b2o44bo25bo21bo4bo$o3bo7bo 31bobo13b2o2bo5b2o10b3o2b2ob3o22bo12bo10b2o18bo16b3o8bo2b2obobobo17bo 4bo28bo2bo30bo2bo29b2o21b2o9bo14bo2b2o31b3o50b2o8bo3b2o14b2o20b2o23b2o bo5bo11b2obo5bo10b2obo5bo10b2obo49bo4b3o21b2obo19b2o18b2o20bo26b3obo6b 3o33b2obo26bo17b2obobo$46bo13bo10bo10bo4b2ob2o22b2o11b6o5bo3bo20bo5bo 6bo10bo2b5o20bobo30bo2bo31bo33bo21bobo3b3o21bobo29bo9bo20b2ob2o2bo25bo 22bo21bo20bo2bo17bo2bo16bo2bo16b3o24b2o2bo20b3o26b2obo46b3o10bo2bo18b 2obo3b2o10bo9bo18b3o34bo3bo14bobobo2b3o$obobo7bo58bo11bo4bo25b2o11bo6b o2bo2bo18b2o3bo3b2o7bo2b5o3b5o22bo32bo36bo22b3o28bo3bo4bo17b2o34bo2b6o 20b2o2bo2bobo24b2o2b2o16bobo19bobo18b2obo17b2obo16b2obo16b3o2b2o20b2ob o21b2o27b2o27b3o19bo2b2o9bobo3bo14b2o2bobo13bo2b6o19bo5bo30bo18bo3bo4b 2o$23b3o20bo9bo4bob2o21bobo25b2ob2o9bo8bobo18bobob2o4bobo8bo3b2o3bo13b 3o10bo34bo32bobo22bo8bo24b2o22bo4bobo30bo28bo4bo27b2o20b2o20bobo17bo2b o17bo2bo16bo2bo42b2obo21b2o29bo27bo2b2o16b2ob2o10bobo3b2o15bo6bo12bo 26bo4bo32bo17b2o7bo$23bo21b2o8b2o3b2o23b2ob2o21b2o21b2o2bob2o2bo12bo2b o2bob2obo11b2o10bo9bo9b4o32bobo32b2o24bo2b5o24bo6bo18bo5bo29b2obo59b6o 61bo20bo19bo14b2o3bo21b2o25b2o22b2o31b2ob2o33b2o2bo2bo16bo18b2o20b2o4b o2bo22b3o29b2ob4o$26bo17bob2o7bobo2bo24bo2b2o20b2obo16b6o5bobo14bo3b2o 5bo15bobo5b2o8bo6bo37b2o32bo28bo29bobo30bo62b2o3bo23bo4bo19bo21bo15bo 20bo19bo18b2o3bo22bo19b3o2b2o23bo2b2o50bobo13bo4bobo17bo2bo36bobo2b3o 2bobo19bo9bo24b2o$23bo2bo16b2ob2o11b3ob2o22bo15b2o6bo20b2o15b2o7bo28b 2o3bo12b2o2b2o4bo31bo33bo28b2obo19b3o5bo25b2o6bo26bo34b2o4bobo21bo2bo 16bob2obo19bobo11b2obo17b2obo16b2obo19bo20b2o24bo2b4o23bo3bo28bobo17b 3obo18bo20b2o21b3o13bo32bo2b6o$24bo2bo15bo38b3o17b2o5bo23bo15bobo3b4o 27b2o5bo12bo39bo37bo48bo7bo25bobo5bobo22bo4bo32bo4bo2bo21bo3bo8b2o3b3o 4bo9b2o3b3ob3o10b2o4bo14b2o4bo13b2o4bo17bobo18bo2b2o23bo29bo2bo25b3obo 16b2o66bo2b2o14bo31bo31bo$25bo16bo14bobo22bo3bo17bo2b2o31bobo6bo3bo32b o2bo20bo69b2o27bo18b2o6b2o3bo29b2o26b3obobo32bo32b3o6b2o4bo2bo13bobo2b o2bob2o12bobo2bo15bobo2bo14bobo2bo37bo3bo24b2o27bo2bo24b2o19b4obo18b2o 3bo38b2ob2o15bo3bo26b2obo28bobo$27bobo2b2o6bo3bo12b2o25bobo19bo3bo28b 4o9b2o4bo28b2o17b2o3bo33b2o2bo27bob2o26bo4bo15bobo3bo6bo29b2o4b2o19b2o b2o36b2o2b3o27bo8bo20bo5bo3bo18bo20bo19bo18bobo18bo2bo24bo2bo27bo23b4o bo15b2o23b2o3bo18b3o12b2o23bo61bo2bo$29b2obo2bo3b2o3bo12bo20bo4b3o20b 4o29bo12bo3bo48bobob2o31bob2obo25b3obo28b3obobo15bo5b2o4bo36bo19b2o46b o25bobo13b2ob2obob2o9bo5b2obo2bo10bo2bo17bo2bo16bo2bo39bo2bo15b2o9bo 17b3o31b2o21bo24bo22bo2b2o9b2o4bobo19bo27bo32bo$35bobob2obo34b2o3bo 122bobo2bob2o24b3obo29bo2b2o2bo25b2ob2o21bo4b3o37b2o20bo44bobo25bobo9b 3ob3obobobobo8bo2b2o4b3obo10bobo18bobo2b3o12bobo3b2o14bobo20bo15bobo3b 3o20bo9bo24bo12b3o31bo21b2ob2o12bo2bob2o9b3o27b3o5bo2bo29bo3bob3o$35bo bo18bobo18bobo2bobo12bo6b2o98bo4b2o26bo2b2o2bo26bo32b2o25b2o44b2o10b3o 51bobo25bobo13b2o4bobo10bo3bo3bo2bobo10bobo4bo13bobo2bo14bobo2b2o15b2o 10b3o24bo3bo4bo20bo2b6o16b3o19bo8bo25b2o14b2o22b2o12bo9bo19bo7bo36bobo $30bobo22b4o22bo2bo11b2o5bo2bo97b2o30bo33bo2bo31bo83bo8bo44bobo26b2o 57b2o3b2o14b2o3bo14b2o4bo14bo11bo9bo19b2o27bo22bo8bo13bo2b5o41b2o4bobo 16b2o4bo8bo2b6o21bo2b5obo31b2o5bo$55bo25b2o13bobo3b2obo98b2o29bo2bo31b o25b3o80bo10bo2b5o46b2o26bo58bo4bobo13bo19bo33bo2b6o20bo5bo23b2o21bo2b 5o16bo48bo2bob2o17bo5b2o8bo29bo40bo2b2o$81b2o17bo134bo27b2o7bo23bo8bo 72bo2b2o9bo51bo150bo12bo81bo22b2o48b2o25bo11b2o28b2o$99bo128b2o7bo24b 2o6bobo24bo2b5o74bob2o10b2o200b3o11b2o80b2o70b2o26bo$99bo2bo124b2o6bob o26bo2b2o30bo83bo211b3obo14b3o147bo$229bo2b2o32b2o2b2o28b2o79bobo230bo $231b2o2b2o29b2o113bo215b3o15bo$231b2o149bobo212bobo$384bo213b3o$600bo 6$41b2o13b2o31bo33b3o6b3o39b3o9b2obo27b3o34b3o24b2o14bo15b2o24bo24bo 24bo24bo42b2o23b2o16bo21bo24b2o30b2o27b2o26b2o28b2o15b3o24b3o7b3o26bo 24b2o18b2o17b3o21b3o24bo20bo15b3o8b2o2bo25bo31b2o25b2o25bo11b2o2bo25bo $40b2o13b2o31b2o33bo8bo2b3o36bo11bo3bo26bo36bo26bobo12b2o14b2o24b2o23b 2o23b2o23b2o41b2o23b2o16b2o20b2o24bobo28b2o28bobo25bobo27bobo14bo26bo 9bo9b2o16b2o23b2o18b2o18bo23bo25b2o19b2o15bo9b2o4bo23b5o28bobo24bobo 23b2o10b2o4bo23b2o$42bo13bobo23bo5bobo33bo8bobo39bo10bo4bo28bo34bo25bo 14bobo15bo23bobo22bobo22bobo22bobo42bo24bo15bobo19bobo23bo32bo27bo27bo 29bo17bo26bo9bo6b3obo9bo5bobo24bo19bo18bo23bo24bobo18bobo15bo10b2obo2b 3o19bo2b2o28bo26bo25bobo2bo8b2obo2b3o19bobo$44b2o10b3o22b2o43b2o10bo 38b2o9b2o27bo2bo36b2o25bo31b2o142b2o23b2o63bo31b2o27bo27bo29bo16b2o25b 2o8b2o2b2o12b2o34b2o18b2o17b2o22b2o62b2o9b2o2b2obob2o17b2obo30bo26bo 23bo2bobo9b2o2b2obob2o$43bo12b2o23bobo3b2obobo32b2o9bo41bo11bobo4bo20b o2bo34b2o25bobo13b2o14bo25b2o23b2o23b2o23b2o41bo24bo17b2o20b2o23bobo 29bo28bobo25bobo27bobo16bo17b2o5b2o10bo16bobo3b2obobo17bo5bo13bo5bo18b 2o22b2o25b2o19b2o16bo16bobobo49bobo24bobo20bobo2bobo16bobobo17b2o$35b 2o21bobo24bo7b2o43bobo55b2o14b2obo3bo7b3o53bobo13b2o40b2o23b2o23b2o23b 2o84b2o20b2o23bobo58bobo18b2o5bobo27bobo34bo2bo19bo5bo10bo7b2o14b2o18b 2o75b2o19b2o35bo21bobo2b3o22bobo24bobo19bo2bo23bo19b2o$35bo2b2o2bo2bo 38bo4bo5b2o27bo16bo33b2o15b2ob2obo13bo3bo4bobo3bo2b3o22bo27bo30bo2bo 140bo2bo21bo2bo62bo26b3obo2bo26bo20bobo4bo21b3o5bo15b2o19bo2bo2bo12b2o 3bo3b2o9bo4bo5b2o12bobo2bo3bo10bobo2bo3bo15bo23bo21b2obo36bobo22bobo 22bo17b3o5bo18b3o5bo21bo27b2o12b2o$35bob3o2bo17bobo21bo2bo2b6o26bo4bo 10bo2bo33b2o2bo13b3o16bo4bo5b2o6b2o20bo4bo24bo6bo6b2o12b2obo22bob2o21b ob2o21bob2o21bob2o41b2o23b2o9bo6b2o13bo6b2o25bo26bo2bo30bo20bo6bo21bo 7bo15b2o2bo18b2o2bo11bobob2o4bobo8bo2bo2b6o17b2o18b2o11b3o5bo2bo12b3o 5bo2bo18bo3b2o12bo6b2o12b3ob2o22bo20b2o3bo14bo7bo18bo7bo21bob2o38bo2b 2o$obobo3bobobo23bo4bo2bo17b3o4bo51b3obobo10bo2bo24b2o6bo2bo3b2o31b2o 8bo27b3obobo20bo3bo5b2o5bo2bo10b2o4bo19b4o21b4o21b4o21b4o41bo24bo10b2o 5bo2bo11b2o5bo2bo20bo3bo29bo2bo23bo3bo23bo3bo24b2o3bo6b2o6bo2bo3b2o14b obo2bo2bo8bobo2bob2obo38b2o2bo15b2o2bo9bo7bo15bo7bo21bo5b2o9b2o5bo2bo 13b2o25bo20bo19bo6bo19bo6bo25bo24bobo10bo3bo$36bo6bo18bo5b2o50b2ob2o 13bo2bo24bobo3b2ob3o3bo34bobo4bo3bo23b2ob2o22b3obo6bobo3b2obo13bobo2bo 18bo3b2o19bo3b2o19bo3b2o19bo3b2o38bo2bo21bo2bo8bobo3b2obo12bobo3b2obo 20b3obo28bo27b3obo23bo4bo22bo6bo6bobo3b2ob3o3bo15b3o3bo9bo4b2o5bo34bo 19bo17bo2b5obo14bo2b5obo21b2obobo9bobo3b2obo11b2o27bo2bo9b2o6b2obo19b 2o3bo21b2o3bo26bo25b2o10b2obo$o7bo3bo48bo6bobo17b2o29b2o21b2o22bo5b2o 4b2o2bo9bo2bo27bo3bo22b2o25b2o14bo23bo23bo2bo21bo2bo21bo2bo21bo2bo35bo 24bo15bo21bo24b2o32b4o23b2o27bo3bo23b2o4bo7bo5b2o4b2o2bo8b2o5b2o13b2o 44b2o3b2o13b2o3b2o14bo23bo47bo18bo23b2obo3bo8bobo5b2o22bo2bo23bo2bo23b o2bo21b3o2b2o9bo3b2o$30b3o7bo15bob2obo4bobo18b2obo29bo18bo2b2o25bo22b 2o3bo6b2o12b2ob2o4b2o20b2o25b3o13bo21bo2bo137bo24bo14bo21bo24b2o30b2o 4bobo20b2o28b3o22bo4b3o12bo20b2o5b2o14b2o29bobo12bobo17bobo19b2o22b2o 22b2obo18bo17bobo22b2o15bo7bo14b2o25b2o34b2obo21b3o9b3o$obobo3bobobo 17bo24b2ob2obo7bo19bo21b3o29bobo23b2o3bob2o14b3o2bo6bobo12b2o6b3o20bo 24b2o15bo2b2o3b3o12bobo3bo18b2o3bo19b2o3bo19b2o3bo19b2o3bo25b3o4b2o16b 3o4b2o15bo2b2o17bo2b2o19b2o3bo5bobo18b2obo27bo26bo25b3o18b2o3bob2o5b2o 7bo4bo45b4o13b2o18b2o49b3o15bo3bo17bo2b2o13bobo24bobobo11b2o5bo14bobo 3b3o18bobo3b3o27b3o34bo5bo2bo$31bo2b6o15bobo4bo17b2o29bo8bo19b2o32bo2b o16bo2bobo4bo24bo6bo39bo20bobo15bobo3b2o17b2o4bobo16b2o4bobo16b2o4bobo 16b2o4bobo22bo2b3o19bo2b3o23bo21bo11b2o6b2o2b3ob2obo12b2o6bo20b3o32b3o 23b2o25bo2bo5b2o9b2o2b2o20b3o20bo61b3o23bo2b2o13bo4bo21bo12bo2b2o24b3o 11bo2bo3bo14bo3bo4bo17bo3bo4bo25b3o2b2o18b2o12bo$o3bo3bo3bo20bo26b2o 18bobo3b3o23bo2b5o20bo4bobo52b2o3bobo27b2o10b2o13bo33bo5bo13b2o2bo2bo 17bo4bo2bo16bo4bo2bo16bo4bo2bo16bo4bo2bo23bo5bo18bo5bo19bobo19bobo10bo bo3bo2bo5b3o3bo9b2o5bo22bo8bo24b2o2bo21b2o46b2o24bo2b2o34b3o17b3o23bo 2b2o20b2ob2o16b2o22bo17b2o22bo4bo9bo24b2o25b2o55bo12b2o3bo$32b2obo24bo 3bo15bo3bo4bo24bo26bo5bo28bo23b2o3b2obo8b2o2b4o10bobo11b5o7b2o10b2o21b o5bo13bo4bobo17bo24bo24bo24bo30b2o23b2o26bobo19b2o10bo3bo3bo10b2o12bo 2b2o24bo2b5o24b2o26bo28bo42b2ob2o21bo9b2o3bo14b2o3bo23b2ob2o16b2o26bob o19bobo13bo22b3obo15bobob2o3b3o11bo5bo20bo5bo23b2o3bo34b2o2bo4bo$obobo 3bobobo10b2o34bo3bo19b2o28b2obo31bo25bo26b2o5bo8bo5b2o20bobob2ob2o7bob o11b5o17bo3b2o2bo15bo20b2o2b3o18b2o2b3o18b2o2b3o18b2o2b3o23b2o2b2o19b 2o2b2o59b2o8b3o19bo3bo17b3o4bo21b2o5b2o21b2o31bo39b2o29bo9bo3bo15bo3bo 19b2o23b2o4bobo59bo21bo5bobobo18bo21bo26b2o20b2o3bo11b2o5bo3bo19b2o$ 23bobo3b2o2b2o47bo6bo51b2o6bo23b3o25bo5bo9bo6b2o12b2o3bobo25bobob2ob2o 18bo6b2o41bo24bo24bo24bo23b2o23b2o29bo21bo11bo3b2o4bobo19b4o18bo7b2o 19bobo4bobo20bo2b2o27b3o21b3o13b2o4bobo22bo2b2o6bo4bo14bo4bo2b3o12b2o 4bobo19bo2bob2o21bob2o19bobo6b3o5b2o19bo3bo16bo3bo5bo17bobo24bo2bo20bo 14b2o6bobobo13bo5bobo$23bo3bo6bo24bo2bo19bobo27bo28bobo5bobo20b2o2bo 41bo20b2ob3obo17b2o3bobo33b2o13b2o3bo20bobo22bobo22bobo22bobo20b2o2bo 20b2o2bo28bobo16bob2obo20bo16b2o26bo2b3o22bo3bo3bo21bo3bo27bo2bo20bo2b 2o13bo2bob2o22bob2obo7bobo17bobo5b2o13bo2bob2o21b2o23b3o30bo4b2o2bo27b obo11b4o3bo2bo16bo2bo24bo4b3o15bobo14bo2b2obobo15bo$26b2o3bo26b2obo20b o27bo4bo29bo25b2o28b2o3bo11b2o19b2o4bo19b2ob3obo31b2o14b2o4bobo17bobo 3bo18bobo3bo18bobo3bo18bobo3bo15b2o23b2o23b2o3b3ob3o10b2o3b3o4bo17b2ob o15bo2b2o25bo2bo25b2o27bo2bo28bo20b2ob2o16b2o19b2o4b2o12bo3bo15bo9b2o 12b2o24b2o4bo17bo2bo22bobo6bo2bo2bo29b2o19bo3bo16bobo6b2o17b2o3bob2o 32b2o4bo15bobob4o$30b2o41b2o7bo26b3obobo28bobo4b2o17b2o29b2o3bo11b2o 20bob2o21b2o4bo28b2ob2o16bo4bo2bo16bobo3b2o17bobo3b2o17bobo3b2o17bobo 3b2o14bobo22bobo22bobo2bo2bob2o9b2o4bo2bo22bobo10bo4bo3bo28bo26bo2bo 24bo2bo18b3o23b2o24b2o19bobo2b3o11bo4b3o12bo10b3o11b2o4bo20bo4bo17bo 25b2o10b3o30bo17b2o2b2o21bo2bob2o20b3ob2o16bobo14b2o24bo$27bo29bo15bob o3b4o25b2ob2o31bobo4bo19bo30bo5b2o56bob2o30bo4bo15bo25b2o2bo2bo17b2o2b o2bo17b2o2bo2bo17b2o2bo2bo10b3o2bo19b3o2bo22bo5bo3bo12bo29b2o10b2o5b2o bo17b3o26b2o38bo18bo9bo14b2o4bobo19bo19bo3bo13bobo4b2o11bobo12bo11bo4b o25b2o12b2o2b2o24bo11b3o50bo24b3o3b2o20bo64b3o$27bo21b3o5bo15bo3bo29b 2o41b2o10b3o37bo4b2o29bobo59bob4o16b2o2b3o18bo4bobo17bo4bobo17bo4bobo 17bo4bobo10bo24bo30bo5b2obo2bo12b2ob2obob2o27bobo3bo3b2o16bo9bo18bobo 3b3o20b3o28bo2b6o17bo2bob2o42b2o3bo9bobo6b2obo7bobo9bo2bo16b2o25bo12bo 42bo28b2o2bo16b3o22bobo5bo21bobo19bobo11bobo19b2o3bobo$23b3o23bo7bo18b 2o4bo25bo42b2o9bo8bo31b2o4bo28bo25bobo37b2o22bo23bo24bo24bo4b2o18bo5bo 62bo2b2o4b3obo7b3ob3obobobobo30bo24bo2b6o19bo3bo4bo19bo9bo22bo25b2o45b o4bo8bo10bobo6bo12bo20bo38bo3bo22b2o2bo7b2ob2obo26bo22bo22b2o2b2o2bo 20bo2bo19b2o11b2o21bobob2obo$23bo26bo2b5obo16bo3bo18b3o61bo2b5o67b3o 23bo39b2o20bobo78bobo22b2o5b3o22b3o29bo3bo3bo2bobo11b2o4bobo31bo4bo2bo 19bo28b2o25bo2b6o24b2o23b2o52b2o5b2o9bo2bo5b2o11bobo45b2ob3o8bob2o21bo 10b2o2bo3bo25bo45bobo49bo12bobo20bo4bobo$26bo25bo46bo8bo44bo11bo73bobo 22b3o37b2o20bobo22b2o4b2o17b2o5bo17b2o4bo18b2o4bobo6bo24bo94bo2bo25b2o 26bo28bo56bo46b2o3b2o6b2o18b2o33b2ob3o20b2o13b2obo15b2o3bo12bo2b2o28bo 45b2o26bo61b2o$23bo2bo26b2o45bo2b5o44bo2b2o9b2o97bobo38bo19bobo4bo17b 2o4bobo16b2o4b2o17b2o23b2o11bobo4b2o16bobo128b3o25bobo22b2o108bo15b2o 43b2o25bo3bo11bo16bobo3bo14bobo27b2o44bo26b5o17bo2bo13bo24bo$24bo77bo 50bob2o148b2o20b2o3b2o18bo4bo19bo4bobo17bo24bo11bobo3b2o17bobo2b3o123b o28bobo26b3o120bo43bo3bo22b2o10b2ob2o15bo5b2o43b2o71bobo11b2o5b2o2bo 12b2o24bo$25bo77b2o52bo147bo21bo4bobo17bo24bo24bo24bo11bobo4bo17bobo2b o126bo27bo28bo167b2o35b3ob2o10bo5bobo2b2o11b2o116b2o5bo$155bobo148bo 46b2o23b2o23b2o23b2o10b2o3b2o18b2o4bo182bo218b2o5bo17bo119bo4bobo$155b o284bo24bo3b2o386b2o14bobo3bobo17bo120b2o2bo$156bobo698bo19bo3bo138b2o $158bo717bo$876bo3b2o5$31bo20b2obo24b3o21b3o24b3o18b3o35b2o25b2o23b3o 30b2o15bo24b3o33b3o10bo36b2o23bo26b2o20b2o19b3o24b3o24b3o29b2o22b2o25b 3o26b3o26b3o25b3o15b3o18b3o10b2o17b2ob2o31b3o20b3o25b2o28b2o29b2o29b2o 16bo32bo21b2o27b3o14b3o22bo23bo24bo25b3o7b2obo22b2o22bo15b2ob2o30b2o 24b2o16b3o23b2obo$29b2obo19bo3bo23bo9b2o12bo2b3o21bo20bo37bobo24bobo 22bo32bobo13b2o5b2o17bo35bo11b2o35b2o23b2o25b2o20b2o20bo2b3o21bo2b3o 21bo2b3o25b2o22b2o26bo28bo28bo27bo17bo2b3o15bo2b3o7bobo16bob3o31bo22bo 27bobo27bobo28bobo28bobo14b2o31b2o20b2o28bo16bo23b2o22b2o23b2o25bo9bo 3bo6b2o13bobo20b2o15bob3o30bobo3b2o18bobo3b2o10bo2b3o20bo3bo$27b2o3bo 19bo4bo23bo6b3obo12bobo24bo20bo36bo26bo25bo31bo15bobo3b2o3bo15bo35bo 10bobo28b2o5bo17bo5bobo26bo21bo20bobo24bobo24bobo29bo23bo26bo28bo28bo 27bo17bobo18bobo9bo18bo2b2o3b2o27bo22bo26bo29bo30bo30bo10bo5bobo30bobo 21bo28bo16bo22bobo21bobo22bobo26bo7bo4bo4b2o14bo22bobo14bo2b2o3b2o25bo 3b3obo17bo3b3obo10bobo22bo4bo$26bo3b2o22b2o27b2o2b2o21bo23b2o19b2o36bo 26bo24b2o31bo20bob2o17b2o34b2o37b2o5b2o16b2o36b2o20b2o22bo26bo26bo28b 2o22b2o25b2o27b2o27b2o26b2o19bo20bo9bo4bo17b2obob2o25b2o21b2o26bo29bo 30bo30bo6b2o93b2o15b2o21bo23bo24bo24bobo9b2o8bo10b2obo46b2obob2o17b2o 5b2o17b2o5b2o19bo21b2o$25bo4b2obo14b2o6bobo25bo23bo24b2o19b2o36bobo24b obo22b2o31bobo14b2obo23bo33b2o11b2o27bo4bobo2b2o11bobo3b2obobo25bo21bo 22bo26bo26bo29bo23bo26b2o27b2o27b2o26b2o18bo20bo11b2o2bobo13bo5bob2o 24b2o21b2o26bobo27bobo28bobo28bobo5bobo3b2obobo31b2o17bo33bo16bo22bo 23bo24bo23b2o12bobo3b2o11bo4bo23b2o16bo5bob2o17bobo23bobo23bo25bobo$ 24bo2b2ob3obo13bobo8bo28bo21bobo79bobo24bobo15b3o37bobo13b3o52b3o17b2o 29b2o3b2ob4o13bo7b2o70bobo24bobo3b2o19bobo3b2o93b3o26b3o25b3o26bobo18b obo11bobo13bo5bo3bo74bobo27bobo28bobo28bobo9bo7b2o29b2o16bob3obo65bobo b2o18bobob2o19bobob2o21bobo14bo2b2o11bob2o6b3o16b2o16bo5bo3bo16bo3bo3b o17bo3bo3bo19bobo$obobo3bobobo11bo23bo8bo26b2o3bo23bo18bo20bo38bo26bo 17bo5bo33bo15bo24b2o28bo5bo44b2o10bo11bo4bo5b2o20bo2bo18bo2bo15b2obo6b o16b2obo6bo2bobo11b2obo6bo2bobo14b3obo2bo16b3obo2bo18b3o2bo22bo5bo22bo 5bo21bo5bo14b2o5bo2bo10b2o5bo2bo11b2o22bo19b3o2bo17b3o2bo22b2o4bo21b3o 5bo30bo30bo10bo4bo5b2o18b3o23bo3bo26bo18b2o22bob4o18bob4o19bob4o35bo9b 3o10b3o4b2o41bo21b2o24b2o26bo22b2o$26bobo3b2o15b2o7bo2b2o20bobob2o21bo 2bo19bo11b3o5bo2bo3bo31bo17b2o7bo18bo4bo33bo40b2o29bo4bo9bob2o43bo11bo 2bo2b6o13b2o5b2o13b2o5b2o17b2o3bo2bo2bo15b2o3bo2bo2bo2bo12b2o3bo2bo2bo 2bo16bo2bo20bo2bo21bo5bo23bo4bo23bo4bo22bo4bo13b2o5b2obo10b2o5b2obo12b o24bobo15bo5bo16bo5bo21bo2bo3bo21bo7bo30bo21b2o7bo10bo2bo2b6o19bo3b2ob 2o16b2ob2o25bob5o14b2o2bo92b2o16bob3obo2bo13b3obobo7bo6b2o28bobo18bo2b o22bo2bo20bo2bo23bo2bo$o7bo3bo10b2o3bobo18bo2bo3b4ob2ob2o16bo2bo2bob2o 18bo2bo20b2o9bo7bo4b3obo18bo7b4o17bobo3b4o7bo12bo2bo29bo3bo5b3o5b3o15b 2o6bo3b2o28bo2bo8b4o38bo41b2o5bo14b2o5bo13b3o4bo2bo2bo3bo9b3o4bo2bo2bo 3bo9b3o4bo2bo2bo3bo22bo2bo20bo2bo17bo3bo2bo3bo21bo2bo3bo21bo2bo24bo2bo 3bo11bo3b3o14bo3b3o14bo27bo13bo3bo2bo15bo3bo2bo20bo3bo3bo24b2o3bo26bo 3bo21bobo3b4o44bob3obo10b3o2bo2b2o20b2o2b2o4b2o5b2o6bo2bo3b2o18bo23bo 24bo18bo2b2ob2o14b3o2bo4bo18bo5b2o5bo2bo29bo9b2o24b2o31bo2bo$23bo3bo3b 2o16bo6bo3b2o2b2o17bo3b2o21bo2bo21b2o9bo2b5obo2bo4bo16b2o5bo22bo3bo11b 2o11b3o2bobo25b3obo6bo2b4o19bobo3b2obo31b3o2bobo5bo3b2o36bo43bo4bobo 14bo4bobo11bo6bo2bo2bo3bo2b2o5bo6bo2bo2bo3bo9bo6bo2bo2bo3bo20bo23bo22b o3b2o2bo3b2o13b3o2b3o2bo3b2o13b3o2b3o2bobo15b3o2b3o2bo3b2o18bo20bo36bo 3bo12bo3b2o2bobo12bo3b2o2bobo17bo7bo22bo6bo25b3obo22bo3bo46bo3b3o2bo 10bo5b2o3b2o16b2o4b2o10bobo3b2ob3o3bo18bo2bo20bo2bo21bo2bo11b2ob2o3bo 2bo19bobob2o12bobo10bobo3b2obo30bobo7bobo3b3o17bobo3b3o24bo2bo22b2o2bo $obobo3bobobo11bo2b2o2bo2bo16bobo16b3o10bo47b2o5bobo7bo9bob4o16bobo3b 2o4bo20b2o4bo6bobo42b2o11b7obo16bo5b2obo2bo2bo43bo2bo34b3o20b2o2b2o16b 2o2bo17b2o2bo15bo3bo6bobo3bobo7bo3bo6bobo13bo3bo6bobo21b4o20b4o20b2o8b o15bo12bo15bo27bo12bo12b2o6bo12b2o6bo6b2ob2o24bo4bo13b2o21b2o25bob2o3b o23b2o4bo25b2o29b2o4bo23b3o16bobo17bo3bobo23bo3bo11bo5b2o4b2o2bo13b3o 4bo16b3o4bo17b3o4bo10b2o3bo25b2o16b2obo14bo45bo3bo4bo16bo3bo4bo27b2o 20bo$27b2o3bo8bo10b3o4b5o6bo9b4o27bobo6b3o8bo2b2obobobo7b2o11bo22bo18b 2o6bo4bo52b2o14b2ob2o21bo4b2o2b2o79bo2bo4bo18bob4o16b2o20b2o15bo2bo8b 2o6bo6bo2bo8b2o13bo2bo8b2o21b2o4bobo15b2o4bobo22bo6bo15bo12bo15bo27bo 12bo9b2obo5bo11b2obo5bo7bo3bo23b2o3bo5b2o11bo9b2o11bo25bobo22bo4b3o26b 2o29bo4bo25bo2b2o8bo6bo21bo28b2o15bo14b2o10bo2bo20bo2bo21bo2bo16bobobo 2b3o19bo18bo15bo38bobo8b2o24b2o29bo2b2o$o3bo7bo20bobo3bobobo15bo4bo6bo 6bo34bo6bo10bo2b5o15b2o8bo12bo5bo4bo15bobo5bobo14b2o6b2o2bo27b2o16bo 24b2o5bo28b2o2bo14b2o3bo28b3o6bo18bo4bobo18bo21bo13bo2bo6b3o14bo2bo6b 3o14bo2bo6b3o20b2obo20b2obo17b3o33bo3bo24bo3bo23bo3bo16bo2bo17bo2bo13b ob2o3bo14b3o3bo2bo7bobo20bobo28b2o30b3o33bo29bobo27b2ob2o8b5o26bo2bo 23bo2bo14b2o3bob2o5bo13bobobo19bobobo20bobobo43bo16b2obo14bo2bo2bo43bo 5bo19bo5bo28bobo14bo4b3o$35b2ob3o2bo10b2o5bo2bo8b2o2b2o4bo37bo2b5o3b5o 17bobo5b2obo10b2o4b2o3bo16bo7bo16b2o5b2obo22b2o6b2o18bo25bo2bo27b2obo 16b2o4bobo24b2o9bo25bo16bobo19bobo13bo5bo3bo16bo5bo3bo16bo5bo3bo14b2o 6bo15b2o6bo19bo9bo24b2obo25b2obo24b2obo17b2obo17b2obo19bo15bo5b2o10bo 8b3o11bo8b3o19bobo3b2o23b2o29b2o34bo42bo2b2o2b2o48b2o2bo19bo2bo6b2o14b o23bo24bo17b3o2bo24b3o14bo20bo33bobo15b2o24bo23b2o17b2o$obobo3bobobo 22b2o4b2o11b2obobo14bo32b2o4bo9bo3b2o3bo20bo7b2o13bobo2b2o29bo22b2obo 23bobo3bo2bo16b2o56b2obo18bo4bo2bo22b2o7b2o26b3o16bobo19bobo14bobob2ob o19bobob2obo19bobob2obo14b2o5bo16b2o5bo22bo2b6o18b2o83bo2bo17bo2bo21bo 12bo3bo2bo14bo3b2ob2o14bo3b2ob2o19bo3b3obo21b2o30bo2b2o31bo29bobo12bob o3b2o14bo5bo25b2o46bo23bo24bo20b2o28bo2b2o10b2o20bo2b2o30b2o15bo2bo22b obo22bo4bobo11bobo2b2o$36bob2o14b2obob2o17bo27b2o4b2o10b2o10bo16b2o5b 2o3bo14bo2b2o22bo4bo12bob2o5b2o26bo3bo3bo46b2o26b2o21bo31bo55bobo19b2o 16b2o25b2o25b2o20bo2b2o19bo2b2o25bo24bobo3bo23b3o2bo22b3o2bo24bo20bo 18bo15bo3b2o2bo13b2obo19b2obo20b2o5b2o24b2o31bo3bo27bo3bo27b3obo13bo3b o15b2o5b3o22b3o25bo15b2o3b4o15b2o3b4o16b2o3b4o23b2o21b2ob2o33bob2obo 29bo17bo4b3o17bo2bo22bo5bo15b5o$55bo4bo13b2o3bo28bo2bob2o14bobo3b2ob2o 13b3obobo19b2o22b2obobo3bo11b4o5b2o30b2o50bobo26bo22b2o2b3o5bo9b3o14b 2obo24bo63bo26bo26bo19bo3bo19bo3bo22b2obo22bo5bo22bo5bo21bo5bo20bo20bo 18bo3bob2o13b2o22b3o20b3o18bobo31b2o32bo2bo25b3obo27b2o10b3obo2bo19bob o3bo2bo21b2o25bo16b2o4bo17b2o4bo18b2o4bo26b4o14b2o22b3o10b2o4b2o52b2o 3bob2o16bobo6b2o21bo13bo5bo$34bobo18bo17bobob2o31b2ob2o16b2o2b2o17bo2b o3b2o17bob2o18b2obo5bo12bo3b2o4bo29bo4b2o16b2ob2o2bo32bo47bo4b2o9bo8bo 7bo2bo28b2o17bo21bo92b4o20b4o30b3o19bo2bo3bo17bo3bo2bo3bo16bo3bo2bo17b 2obo17b2obo17b2o3bo20bo49b2o12bo3bo3bo19b3o2b2o33bo2bo24b2o30b4obo7bo 2bo3bo24b2o25bo24b3o17bo2bo4bo15bo2bo4bo16bo2bo4bo21bo4bo12b2o4bobo16b o2b2o8bobo2b3o30b2o2bo19b3ob2o20bo2bob2o15b2o6bo14bo3bo$34bo21bobo14bo bo2bob2o48b2o24bo21b2o21bo3b2o2bo19bo2bo2bo28bobo19b2o2bo2bobo24b2o3bo bobo13b2o28bobo4bobo9bo2b5o8bobo25b2obo2bo15bobo16bob2obo14bo29bo23bo 72bo7bo21b2o2bo3b2o15bo3b2o2bo3b2o14bo3b2o2bobo13b2o4bo14b2o4bo15bobo 2b2o8b3o25bo3bobo16bo3bobo2b2o16b2o23bo2b4o36bo23b2o30b2o13bob2o2bo17b o4b5o18b2o29bo2bo19b2o3bo18b2o3bo19b2o3bo16bo4bo4bo14bo2bob2o15b2ob2o 9bo3bo33bo24bo24b3o3b2o14bobo5bobo11bo$34b3o35bo4b2o25b3o2bo20bo2bo24b obo16bobo17bo2bo2b2o3bo55bo23bo4bo27b2ob3o2bo13b2o28bobo18bo41bo5bo6b 2o3b3ob3o10b2o3b3o4bo15bobo21b2o28bobo14bob2o20bob2o18b3o5bo2bo5bo27bo 18b2o8bo17b2o23bobo2bo15bobo2bo19b2o8bo9bo16b2obob3o15b2obob3o3bo17bo 2bo22bo29b3o33bo31bo18bo17b2o3b3o21bo2b2o28bo19bo8bo14bo7bo16bo21b2o3b 2o21b2o13b2o20b2o3bo24b2o3bo24bobo20bobo5bo37b2obo$35bobo34b2o30bo2b3o bo19b2o26bo16bo2bo16b2o3bob2o23b2o3bo30bo56b2o4b2o5b2o6bo3b2o25bobo4b 2o13b2o36b3o6bo6bobo2bo2bob2o9b2o4bo2bo20bobo20bobo28bobo12b4o20b4o19b o7bo20b3o14bo21bo6bo20bo25bo20bo18b2o10bo2b6o17bo3bo18bo3bo5b2o8b2o34b 2o27bo9bo19b2o27b3o43bobo3bo22bo3bo18b3o28bo3bob2o16bo3bo2bo17bo3bo16b obo3bo21b2o12b2o4bobo14bo4bo24bobo3bo22bo2bo20b2o2b2o2bo25b2o11bo$72b 2o31b6o66bo18bobo2b2o25b2o3bo26bo3bo27b2o3bo24bob2o8bobo3b2obo30b2o4bo 52bo5b2obo6bo5bo3bo12bo27bo22bo30bo14bo3b2o18bo3b2o18bo2b5obo18bo9bo 17b3o25b3o31bo2bo4b2o11bo2bo18b3o11bo22b2o5bo15b2o5bo13bobo3b3o28bo2bo 25bo2b6o20bo2b2o24bo8bo14bo52bo2bo17bo9bo19bo9bo13bo6bo17bo7bo17b5o20b o14bo2bob2o21bo22bo5b2o45bobo31bo11b2o$168b2o7bo23bo3bo23bo29b3obo28b 2o3bo36bo5b2obo2bo2bo24bo9b2o48bo4b2ob2o8bo5b2obo2bo12b2ob2obob2o87bo 2bo20bo2bo17bo26bo2b6o18bo9bo17bo9bo24bobo3b2o13bobo2b3o9b3o3bo12b2o 20bo6bo15bo6bo13bo3bo4bo18b2o9bo28bo26bo3bo25bo2b5o14b2obo22b2o26bo2bo 18bo2b6o21bo2bo6b3o11bo2bo4bo16bo2bob2o18b4o38b2o18b2o4bo17bo5bobo2b2o 21bo24b2o30b2o12b2o4b2o$96bo6b2o63bobo3b4o27bo23bo28b2o33bo26bobo14bo 4b2o2b2o33b2ob4o53bobo8bo2b2o4b3obo7b3ob3obobobobo132b2o26bo25bo2b6o 19bo2b6o25bobo4bo13bobo2bo11bo3bob2o34bo22bo22b2o23bobo3b3o30b2obo26bo 2bo26bo19bo24b3o29bo20bo28bo9bobo11bo7bob2o13bo6bo16b2o40b2o4bo18bo17b 2o5bo26b5o21bo32b2o12bo4bobo$95b2o5bo2bo62bo3bo28bo28b2o25b2o34bo26bo 16b2o5bo35bo7bo63bo3bo3bo2bobo11b2o4bobo87b2o5bo16b2o4b2o44b2o25bo27bo 32b2o3b2o14b2o4bo10bo3b2o39b3o39bo24bo3bo4bo59bo2bo27b2o16b2o45b3o30b 2o35bob2o19b2ob2o20b3o14bo41bo5b2o18bo15bobo3bobo25bobo63b3o4b3o2bo$ 95bobo3b2obo66b2o4bo80bo35b2o24b3o18bo2bo36bo6bo184b2o4b2o16b2o4bobo 71b2o26b2o30bo20bo3b2o16bo38b2o2bo43bobo20b2o33bo33bo45bo24b2o20bo9bo 59b3o20bob3o21bobo60bo21bob2o15bo3bo81b2o8bo5bo4b2o$99bo71bo3bo73b3o 69bobo250bo4bobo16bo4bo217bo46bobo19bo5bo20b3o5bo2bo19b3o55bo23bo22bo 2b6o61b2o21b2o22bob2o61bo20b2ob2o13bo78b3o5b2o9bo4bo$98bo150bo8bo83b2o 40b2o188bo23bo180bo88bo48bo7bo22bo9bo96bo114b3o83bob3o13bo3b2o73bo6bob o11b2o$98bo2bo148bo2b5o84bobo230b2o22b2o177b2o138bo2b5obo21bo2b6o98b2o 113b2o84b2o95bo4b2o14bo$252bo525bo141bo30bo404b4obo13bo$253b2o520b3o 143b2o29b2o403b2o$775bo$776bo6$138b3o25b2o9bo46b2o29b3o21b2o29b3o9bo 25b2o30bo22bo20bo23bo23b2o29bo24b3o23b3o22b3o25bo25b3o27b3o27b3o26b3o 25b3o22b2o26b2o26b2o31b3o20b2o32b3o27b2o18b3o$21b2o38b2o14bo31b3o26bo 26b2o9b2o13b3o30bobo28bo22b2o30bo10b2o24b2o30b2o21b2o19b2o22b2o22b2o 29b2o24bo25bo24bo26b2o25bo29bo29bo28bo27bo23b2o27bobo25bobo30bo21b2o 33bo29bobo17bo5b3o13bo7b2o11b3o28b3o21b2o19b2o14b2o26b2ob2o45bo25b2o 28b2o28b3o10b3o23bo43bo$21bobo36b2o14b2o31bo29bo27bo8bobo12bo32bo31bo 23bo30bo9bobo25bo29bobo20bobo18bobo21bobo23bo28bobo24bo25bo24bo25bobo 25bo29bo29bo28bo27bo24bo26bo27bo33bo14b2o5bo34bo28bo20bo2b2ob2o12b2o5b 3obo10bo30bo22b2o20bobo12b2o27bob3o44b2o25bobo27bobo27bo12bo2b3o19b2o 42b2o$21bobo38bo13bobo31bo30b2o26b2o21bo34bo30b2o22b2o29b2o36b2o122b2o 54b2o24b2o23b2o52b2o28b2o28b2o27b2o26b2o51bo27bo32b2o10b2o5b2o36b2o28b o12b3o4bo17bobo3b2o15bo30bo23bo19bo16bo26bo2b2o3b2o39bobo24bo29bo30bo 12bobo21bobo41bobo$22b3o39b2o12bo33b2o26b2o26bo9b3o13b2o30bobo28b2o22b o30b2o10b2o24bo31b2o21b2o19b2o22b2o22bo30b2o23b2o24b2o23b2o26b2o24b2o 28b2o28b2o29bo25b2o20bo30bobo25bobo30b2o13bo4bobo2b2o30b2o28bobo11bo7b 2o20bo19b2o29b2o22b2o19bo15b2o30b2obob2o58bo36bo29b2o14bo20bo$22bobo 38bo15bo31b2o20b3o41b3o13b2o31bobo95b2o56b2o21b2o19b2o22b2o53b2o16b3o 23b3o22b3o32b2o17b3o27b2o28b2o55b3o25bob3obo18b2o5bobo18b2o5bobo47b2o 3b2ob4o58bobo12bo2b3o15bo5bo4bo17bo28b2o22bo20bobo13bo29bo5bob2o38b2o 17b2o6b4o25bobo27b2o13bo23bo43b2o$22b3o30b2o19bobob2o51bo5bo27bo2bo8bo bo44bo29bo19b3obo2bo22b3o2bo37bo2bo120bo2bo23b2o21bo5bo19bo5bo18bo5bo 20b2o25bo5bo23bobo3bo23bobo3bo26bobo21bo5bo20bo3bo21bobo4bo20bobo4bo 31bo17b2o10bo26bo22b3o5bo11bo4bo2bo14b2o4b2o3bo63b2o27bobo43bo5bo3bo 36b3o17bobo2b4ob3o17b2o5bobo20b3o21bobo3b2o11bob2o42b3o$22b2o31bo2b2o 2bo2bo11bob4o27bo23bo4bo26b2o13b3o8bo33bo27bo4bo16bo2bo25bo5bo8bob2o 22b2obo23bo6b2o14bo6b2o12bo6b2o15bo6b2o5bo9b2o5b2o26bo2b2o19bo4bo20bo 4bo19bo4bo19b2o5b2o20bo4bo23bo5bo23bo5bo25b3ob2o20bo4bo19b2ob2o22bo6bo 20bo6bo29bo4bo26bo18b3o5bo2bo19bo7bo10b2o7bo14bobo2b2o25bo20b3o2bo16bo 2b2o2bo2bo10b3o5bo14bo2bo35bo38bo23b3o2bo20bobo4bo22bo5bo20bo2bobo11bo 44bo$obobo3bobobo10bo31bob3o2bo39b3o5bo2bo22bo2bo25bo15b3o5bo2bo29bo3b o26b3obobo19bo2bo21bo3bo2bo7b4o22b2o4bo20b2o5bo2bo12b2o5bo2bo10b2o5bo 2bo3b3o7b2o5bo2bo3b2o8b2o5bo28bo3bo21bo2bo22bo2bo3bo17bo2bo3bo17bo3bo 2bo21bo2bo26bo2bo26bo2bo3bo23b2o24bo2bo14b3o2bo2b2o25bo3bo23bo3bo28b3o bobo20bo24bo7bo25b2o3bo10bobo2bo22bo2b2o19bob2obo18bo5bo16bob3o2bo13bo 7bo11b2obo40bobo58bobo23bo6bo23bo4bo17bo2bo2bo$23bobo30bo4bo2bo9b2o3bo 22bo7bo19b3o2b3o2bobo21bo2bo16bo3b2o2bo28b3obo26b2ob2o20bo26bo3b2o2bob o4bo3b2o22bobo2bo19bobo3b2obo13bobo3b2obo11bobo3b2obo4bo9bobo3b2obo4bo bo9bo4bobo27b2obo15b3o2b3o2bobo13b3o2b3o2bo3b2o9b3o2b3o2bo3b2o18b2obo 16b3o2b3o2bobo23b2o2bobo23b2o2bo3b2o18b2o21b3o2b3o2bobo11bo5b2o3b2o21b o4bo22bo4bo2b2o23b2ob2o21bo3b2o22bo2b5obo21bo6bo14b2o2bo18b2o17b2o3b3o 4bo16bo3bo2bo3bo13bo4bo2bo6b2o6b2o3bo10b2o4bo40bo30b2obobo20b2o29bo3bo 25bo2bo3bo13bo2bo17b2o38b2obobo$4bo3bo3bo10bo2bo3b3o23bo6bo10bobobo2bo 21bo2b5obo17bo33bo16bo2bo3bobo2bobo24b2o29b2o24b4o24b2o17bo2bo24bo23bo 22bo20bo10bo12bo13bo9b2o2bo27bo3b2o14bo25bo12bo11bo12bo15bo24bo72bo22b o20bo24bo3bobo26bo3bo23bo3bo3bobo21b2o24b3o28bo28b2o4bo14b2o2bo20bob2o 13b2o4bo2bo20bo3b2o2bo3b2o11bo6bo7bobo3bo6bo2b2o8bobo2bo6bo32bobo27bo 5bo19b2o29bo4bo2b2o15b3o2b3o2bo3b2o11bo2bo17b2o37bo5bo$25b2o2bo2b2o40b o6bo23bo25bo32bo15bo3bo4bo29b3o28b2o22b2o4bobo26bo39bo2bo22bo22bo20bo 13b3o7bo14bo9b2o28bo22bo25bo12bo11bo12bo13bob3o22bo25b3o27b3o14bo19bob o21bo26bo29b3o25b3o5bo24bo23b2o2bo26b2obo23bo4b3o13bo25b2o19bo28b2o8bo 28bo5b2o4bo3bobo12bo5b2o61bo3b2o21bob2o27bo3bo3bobo14bo12bo17b2o15bo 37bo3b2o$4bo3bo3bo16bo5b2o13b3o7bo16b2o25b2obo25bo3bo19bo4b2o12b2ob2o 3bo33b2o31bo21b2obo21b3o22b2o3bo21bobo3bo18bo2b2o18bo2b2o16bo2b2o19bo 2b2o10bo13bo24b3o5bo17bo3bo21bo3bo20bo3bo19bo3bo25bo3bo19bo9bo19bo9bo 26bo2bo22bo3bo21bo2bo23bo27bo28b2o27b2o56b3o18b2o3b2o19bobo24b2ob2obob 2o18bo6bo6b3o7bo13bo4b3o5bo11bo2bo5bobo32bobo24bo2bo55bobo5bo17bo12bo 13bo2b2o16b2o34bo2bo$29b2o4b3o12bo27bobo16b3o32b2obo20b5o14b2o7bo34bo 22b3o29bo23bo9bo14b2o4bobo18bobo3b2o22bo22bo20bo5b2o16bo5b2o15bobo16bo 6bo3bo20b2obo22b2obo21b2obo20b2ob2o25b2obo22bo2b6o21bo2b6o27b2obobo19b 2obo12b3o34b3o25b3o27bo2b2o23b2o30bo25b2o20bobo23bobo20b3ob3obobobobo 6b3o22bo23b2o24bobo41bo19b2o3bo2bo26bobo19b2o5bobo26bo3bo24bobo50bo$4b o3bo3bo13b3o9bo12bo2b6o20bobo14bo5bo52bo6bo13bob2o2bo26b3o29bo8bo16b3o bo26bo2b6o16bo4bo2bo18b2o2bo2bo20bobo20bobo18bobo4bobobo12bobo3b2o2b3o 12bobo14b2o7bo16b2o24b2o23b3o23b3o2bo2b2o53bo29bo32bob4o14b3o3bo15bo9b o25b2o2bo23b2o2bo26bo3bo24bo28bo4bo21b2o22b2o22bo27b2o4bobo8bo9bo15bo 2b6o40bobo8b2o26b2o4bo17b2obo2bo29b2o20bobo3b3o26b2obo23b2o18b3o35bo$ 25bo2bo6bo2bo14bo20b2o4bo17bo4bo27bo51bo26bo8bo23bo2b5o17bo2bo3bo25bo 22bo26bo4bobo21bobo20bobo18bobo3bo3b2o12bobo3bo2b3o29bobo2b3o18bobo3bo 19bobo3bo18bo5bo19bo5b2o3b2o16b3o2bo27b2obo26b2obo30b3obo14bo5b2o16bo 6b3ob2o21b2o26b2o32bo2bo17b2o32b3obobo22bo46b2o44bo2b6o18bo47b2o7b4o 24b2o3b3o13b3o2bo3b2obo27bobo19bo3bo3bo26bo26bo4bobo12bo2bo32bobo$4bo 3bobobo12bo8bo17b2obo17b2o8bo16bo2bo19b3o5bo2bo21bob2o20bobo28bo2b5o 26bo17b2o6bo28b2obo21b2o2b3o24bo24bobo20b2o19bo5bo17b2o2bobo2bo16bo17b 4o18bo5bo19bo5bo19bo4bo20bo3bobo20bo5bo20b2o28b2o39bobo15bo3bo2bo19b2o 2b2o25b2o26b2o33bo2bo17bo2b2o28b2ob2o47b3o22b2o2b3o41bo25b2o25b3o17bo 5bobo30bo3b2obo11bo4bo3bobo25b2o26b2o5bo23b2o27bo5bo13bo33bo$25b2o7bo 10b3o27bo4b2o12b3o2b3o2bobo16bo7bo18bo6bo23bo31bo30b2obo14b2o5bo23b2o 36bo94bo2b2o2bo19bo3bo16bobo15bo25bo2bo3bo18bo2bo21bo2bo3bo19bo22bo3bo 2bo20bobo3bo23bobo3bo31b2o19bo3b2o2bo19bo30bo27bo36bo17bo3bo27b2o26b2o 19b2o3bo27bo2b2o25b3o12b2o50bo2b2o19b3o2bo37b2o11bobo6bo18b2o4bo29bob 4o24bo35bo14b2o29b2o$26bo6bo2bo8bo5bo26bobo13bo29bo2b5obo15b5o26bo31b 2obo48bo4b4o20bobo3bo29bobo23b2o3bo23bo22bo20bob4o18bo4b2o6b2o3b3ob3o 19bo21b2o2bo3b2o16b2o2bobo12b3o2b3o2bo3b2o18bo2bo18bo3b2o2bobo17bo5bo 23bo5bo28bobo4b2o16b2o29bo20b2o26b2o30b3o28bo2bo27bo26b2o19bo3bo27b2ob 2o26bo2b2o40b3o18b2ob2o20bo3b2o30bo4bob2o13bo3b2o19b2o5bo2bo17b2o11b2o 26bo26b2o6bo15bo28bo4bo$31b2o4bo8bo4bo24b2o2bo14bo30bo22bo2b2o2b2o21bo bo61bo22b2o4bobo18bo5bo29bobo3bo19b2o4bobo19bobo17bob2obo20b3o3bo17bo 11bobo2bo2bob2o14bo4bo28bo37bo12bo22bo20b2o28bo2bo3bo22bo2bo26b3ob2o 25bo22b2o3bo19bo2b2o23bo2b2o27bo9bo20bo2bo21b2o22b2o6bo3b2o16bo4bo21b 2o33b2ob2o17b3o21bo2b2o11b2o28bobo33b2o15b2o30bo4bobo18bobo3b3o20b2o8b obo26bobo5bobo14b2o3b2o20b2obob2o$27b2obo6b2o9bo2bo45bo3bo23b2obo22bob o3b2o20bobo29bo29bo4bo19b2o28bo2bo29bobo3b2o19bo4bo2bo9b2o3b3ob3o11b2o 3b3o4bo23b2o19bo2b3o5bo5bo3bo12b2obo17b3o14bo8b3o26bo12bo10b3o33bo25b 2o2bo3b2o20b2o2bobo23bo3b2o14b3o30bobob2o20bo3bo23bo3bo28bo2b6o24bo21b o2b2o19bobo3b2obo22bobo21b2o4bobo22b2o25bo2b2o18b2ob2o11b2o4bobo23b2o 4b3o29bo3b2o7b2obob3o27b2o22bo3bo4bo19bobo3b3o34b2o20bob3obo21bo2bo$ 27b2o4bo8b3o2b3o2bobo24bo16b2obo52bo3bo21bo30bo4bo25b3obobo49b2o2bobo 27b2o2bo2bo18bo17bobo2bo2bob2o10b2o4bo2bo28bo33bo5b2obo2bo6b2o4bo15bo 9bo15bo9bo20bo3bo17bo9bo14b3o41bo46bo5bo6b2o11bo9bo22bobo2bob2o19bo2bo 24bo2bo29bo19b3o30bo3bo19bo5b2obo2bo2bo17bo24bo2bob2o21b2o4bobo18b2ob 2o14b2o21bo2bob2o23bo7b2o28bobo12bobo2bobo19b2o4bo3bo22b2o24bo3bo5bo 32b2o4b2o14bo25b2o3b2o$28bo5b2o6bo35b3o43bo20b3obo2bo25b2o28b3obobo24b 2ob2o25b2o59bo4bobo19b2o2b3o10bo5bo3bo13bo35b2o21b3o8bo2b2o4b3obo7bobo 2bo15bo2b6o17bo2b6o20b2obo20bo2b6o15bo9bo17b3o14bo12b3o29b2o6bo5bo13bo 2b6o22bo4b2o22bo2bo24bo2bo28b2obo17bo9bo24bo2bo21bo4b2o2b2o18bo27b2o 26bo2bob2o13b2o21b2o4bobo17b2o37b2o25bo3b2o35b2o3b2o2bo24bo28b2o5bo38b o18b3o20b2o$29b2o4bo7bo34bo16bo20b3o5bo2bo17bo2bo3bo25b2o27b2ob2o26b2o 30b2o15b3o45bo27bo13bo5b2obo2bo13b2ob2obob2o20bo23bo10bo3bo3bo2bobo12b o17bo25bo26bo25bo22bo2b6o18bo9bo19bo9bo21bobo3b2o22bo28b2o30bo27bo50bo 2b6o25bo2bo21b2o5bo20bobo26b2o28b2o15b2o4bobo17bo2bob2o17b2o4bo32b3o 28bo12bo25bo3bo32bobo25b2o39b2o17b2o21bo2bo$45bo3bo20bo16b3o5bo2bo17bo 7bo21bob2o2bo53b2o31bo30b2o15bo9bo63bobo4b2o7bo2b2o4b3obo8b3ob3obobobo bo20b2o22bo32bo2bo18b2o24b2o23b2o26b2o22bo25bo2b6o21bo2b6o26bo26b2o26b 2o19b3o25b3o36bo24bo34bo25bo2bo20bobo27bo28b2o17bo2bob2o19b2o21bo5b2o 33bo24bo4bo8b2o28bo35bobo21bo44b2o15b2o23b2o$44b2obo21b2o5b3o8bo7bo21b o2b5obo24bo55bo22b3o39bo3bo11bo2b6o37b2o4b2o19bobo3b2o8bo3bo3bo2bobo 12b2o4bobo70b2o8bobo23b3o23b3o17bo32b3o17b2o25bo29bo31bo4bo27b3o41bo9b o17bo9bo20b3o5bo2bo22b2o21b3o57bo60bo19b2o22b2o4bo21bo32bo2bo25b2o3bo 9bo27bo35bo23bo63bo19b3o$44bo24bobo2b2obo10bo2b5obo21bo78b3o29bo8bo32b 3obo13bo43b2o4bobo18bobo4bo113bo9bobo4bo18bo25bo20bo31bo24b3o20b2o28b 2o29bo2bo29bo44bo2b6o19bo2b6o21bo7bo48bo9bo27b2o20b2o79b2o23bo5b2o20bo 31bo31b2o39b2o53b3o43b2o19bo20bo$43b2o28b6o11bo29b2o25bo50bo8bo23bo2b 5o38bo13b2o42bo4bo21b2o3b2o124b2o3b2o19bo25bo52bo23bo117bo45bo27bo28bo 2b5obo47bo2b6o28bobo19b2o80bo28bo54bobo38b2obo83bo44b2o21bo19bob2o$43b o28bo3bo14b2o53b2obo49bo2b5o26bo38b2o61bo3b2o21bo130bo4bobo122bo163b2o 26b2o28bo56bo168bo94bo2bo86bo42b2o20bobo$44bo28bo72bo54bo32b2o38bo61b 2o454b3o51b2o55b2o261bobo84bo2bo42b3o34b2o4bo2bo$145b2o55b2o588bo461bo 44bo23b2o10b2o3b2o2bo$145bo647bo461bo44b2o21bo13bo3bo$146bo1175b2o15bo $1323b2o14bo$1340b2o$1325bo$1324bo2b2o$1325bob2o$1329bo$1327bobo$1327b o$1328bobo$1330bo! golly-3.3-src/Patterns/Life/Spaceships/c3-orthogonal.rle0000644000175000017500000006211213307733370020167 00000000000000#C All known c/3 ships up to 50 bits. #C Spaceships found by Dean Hickerson, Stephen Silver, Jason Summers, #C David Bell, David Eppstein, and Matthias Merzenich. x = 799, y = 462, rule = B3/S23 225bo14bo11bo16bo13bo$210bo13bobo11b2o11bobo13b2o13bobo$199bo9bobo12bo bo11b2o11bobo13b2o13bobo$198bobo7bo2bo12bo15bo10bo17bo12bo$183bo13b2o 10bo28bo28bo$24bo12bo142bob2o14bo11b2o11b2o12b3o10b2o14b3o12b2o$23bobo 10bobo140bo2bo14bobo24bobo10bo13bobo12bo15bobo$23bobo9b2o141bo3bo14bo 14bo11b2o10b2o13b2o12b2o15b2o$obobo3bobobo10bo12bobo111bo3bo3bobobo15b o4bo14bo10bo15bo11bo14bo13bo16bo$22b2o12b2o139b3o3bo11bo2bo9bobob2o12b o2bo8bo2bo11bo2bo10bo2bo13bo2bo$4bo3bo13bobo14bo110bo3bo3bo3bo17b2obo 11b3obo7b2o6bo26bo28bo16bo$35bo2bo135b4o5b2o10bo12bo2bo2bo8bo2bob2o9b 2o13b2o12b2o15b2o$obobo3bobobo8b3o10bo115bobobo3bo3bo10bo10bo11b4o8b2o 13bo2bo13bobo12bo12bobo15bo$21bobo9b2o136b2o21bo14bo3bo9bo2bo13b2o12bo bo10b2o17b3o$o11bo9bobo8bobo118bo3bo3bo8b3o19bo4b2o10bo2bo10b3o16bo10b o13bo18bobo$21b2o9b2o158b2o2b2o14bo26bo2bo10bo15bo2bo18bo$obobo3bobobo 141bo3bobobo9bobo17bobo3bo13b2o10bo2bo10bo14bobo17bo14bo3bo$22bo10bo 138b2o17b2o31bobo10b2o14bobo14b2o17b2o$22bobo8bobo137bo40b3o7bo13bo15b 4o13bo18bo$22bobo8bobo137bobo16bo21b3o8bo12b3o15bobo12b3o16b3o$23bo10b o138bobo16bobo30bobo11bo16bobo13bo18bo$174bo17bobo18b2o11bo14bo13bo18b o18bo$193bo19b2o10b2o12b2o14b2o15b2o17b2o$215bo10bobo10b2o14bobo14b2o 17b2o$227bo13bo14bo17bo18bo12$338bo12bo14bo15bo10bo$25bo311bobo9b2o13b 2o14b2o9b2o17bo$24bobo309b2o11b2o13b2o14b2o9b2o15b2o$23b2o312bobo11bo 14bo15bo10bo14b2o$obobo3bobobo11bobo152bo157b2o10bo14bo15bo10bo18bo$ 24b2o152bo121b2o17bo4bo15bo7b3o12b3o13b3o8b3o15bo$4bo3bo18bo149b2o139b obobo2bo10bo2bo8bo14bo15bo10bo17bobo$23bo2bo152bo11b3o3bo20b3o3bo20b3o 3bo20b3o3bo19b2o2bo15bobobo3bo8bo11b2o13b2o14b2o9b2o17bobo$obobo3bobob o9bo127bo3bo4bo19b2o9bo5bo2bo6bo10bo5bo2bo17bo5bo2bo17bo5bo2bo16bo20bo 3bo2b2o7b2o12bo14bo13bo3bo8bo18bo$21b2o152bo3b2o7b2o4bobo3bobobobobo6b 2o4bobo3bo5bo8b2o4bobo3bobobob2o7b2o4bobo3bo14b2o4b3o12b2o6bo9bo13bo2b o11bo2bo12bo10bo2bo12b2o$o7bo3bo9bo127bo3bo4bo13b2obob2o8b3o3bo3bo5bob 2o7b3o3bo3bo5bobobo6b3o3bo3bo5bobobo6b3o3bo3bo5bob2o8bo4b3o12bobo5bo9b 3o38bobo16bo12bo$22b3o148bo20bobobo2bo19bobobo2b2obob2o13bobobo2bo4bo 14bobobo2b2obobobo7b3o27bo8bo13b2o9bo2bob2o7b3o14b2o14b3o$obobo3bobobo 10bo126bobobo4bo12b3o3bo10bobo3bo3bo16bobo3bo3bo16bobo3bo3bo16bobo3bo 3bo6bo10bo6b3o8b3o6b2o11bo12bo9bo2bo10bo17bo15bo$25bo145bo6bobo8b2o25b 2o25b2o25b2o28bo4b3o8bobo6b2o9b2o12bobo8bo2bo9b2o17b3o15bo$23b2o129bo 4bo11bo2b2o3bo10bo26bo26bo26bo26b2o17bobo7bo8b2o12bo11b3o10bo18bobo12b 2o$23b2o146bo2bo3b2o10bobo24bobo24bobo24bobo24b2o6bobo7b2o31bo26bo2bo 18bo10b2o3bo$25bo128bo4bo14bo4bobo8bobo24bobo24bobo24bobo26bo5b2o26b2o 13bobo10bo2bo14bo14bo3bo11bo2bo$176bo3bo10bo26bo26bo26bo34bo9bo16bobo 12bobo10bobo12b2o17b2o14bobo$174b2o131bobo7bobo14b2o14b4o8bo15bo18bo 17bo2bo$174b2o131bobo7bobo14bo17bobo8bo14b3o16b3o19bo$176bo131bo9bo16b o16bobo8bobo13bo18bo17b2o$335bobo13bo12bo16bo18bo15bobo$336bo14b2o10b 2o14b2o17b2o15b2o$335b2o14bobo10bobo12b2o17b2o16bobo$336bobo13bo12bo 15bo18bo16bo$337bo6$29bo$27b2o$27b2o$29bo$27bo$obobo3bobobo13b3o$26bo$ 4bo3bo3bo12b2o165bo$28bo162bobo11bo$obobo3bobobo11bo2bo162b2o12bobo$ 23bo153bo13bobo9b2o$o11bo9b2o152bobo12b2o11bobo$22bobo151b2o16bo9b2o$o bobo3bobobo8b2o153bo13bo2bo13bo$177bo11bo13bo2bo$22bo127bo3bo3bobobo 12b2ob2o8b2o12bo$22bobo150bo2b3o7bobo10b2o$22bobo125bo3bo7bo11b2o11b2o 13bo$23bo149bo5bo22b3o$150bobobo3bobobo10b4o2bo8bo14bo$171bo6bo9bo16bo $154bo3bo12b5o12bob2o11b2o$171bo5bo11b3o11b2o3bo$154bo3bobobo9bo3bo28b o2bo$172bo14b2o17bobo$174bo12b3o19bo2bo$172b2o39bo$172b2o14bobo19b2o$ 174bo13b2o20bobo$189bo19b2o$189bobo18bobo$189bobo19bo$28bo161bo$26b2o$ 26b2o$28bo$26bo$obobo3bobobo12b3o$25bo$4bo3bo3bo11b2o$27bo$obobo3bo3bo 10bo2bo$22bo$4bo3bo3bo8b2o$22bo219bo$obobo3bobobo9b3o216bobo$23bo217bo bo$25bo188bo26bo$23b2o188bobo$23b2o173bo14bobo24b2o$25bo150bo20bobo13b o11bo4bo10bobo$175bobo19bobo12b2o10bobobo2bo9b2o$175bobo19bo14bobo9bob obo3bo9bo$150bo3bo3bobobo12bo48bo3bo2b2o10bo2bo$179bo16b2o13b3o9b2o6bo $150bo3bo7bo11b2o4bo11bo3b2obo8bo2b2o10bobo5bo8bo2bob2o$172b7o11b2obob 2o9b2o25bo6bo2bo$150bobobo3bobobo8bo18bo15b2o5b3o6b3o6b2o7bo2bo$171bob o3b3o9b3o3bo14bo3bo7b3o6b2o8b3o$154bo7bo8bo5bo10bo6bobo9b4o3bo18bo8bo$ 172bo5b4o6bo2b2o3bo11b2o2bo12b3o$154bo3bobobo9bobo4bo8bo2bo3b2o28b3o 15bo$173bo5b2o10bo4bobo11b2o29b2o$172b2o6bo12bo3bo12b3o11b2o15b3o$173b obo5bo9b2o31b2o$174bo16b2o16b2o15bo15bobo$29bo163bo15b2o31b2o$28bobo 180bo31bo$27b2o214bobo$obobo3bo3bo17bo212bobo$26bo3bo213bo$4bo3bo3bo 10bo2bo$22bobo2b4o$obobo3bobobo8bo2bo$22bobo2b4o$4bo7bo10bo2bo$26bo3bo $obobo7bo17bo$27b2o$28bobo$29bo$362bo$316bo11bo17bo14bobo28bo$303bo11b obo8b2o17bobo12b2o13bo15bobo$250bo17bo23bo9bobo9b2o10b2o17bobo13bo11b 2o15b2o$240bo7b2o16b2o23bobo8bobo10bo12bo16bo14bobo10b2o16bo$237bob2o 7b2o16b2o23bobo8bo11bobo9bo17b2o14bo14bo14bobo$236bo2bo10bo17bo22bo22b o11bobo15bobo12bo13bo16bo$235bo3bo8bo17bo34b2o10bo12bo32b2o11b3o14bo$ 202bo15bobo14bo4bo7bobo15bobo21b2o10bobo8bobo11bobo13b3o13bobo10bo16bo bo$198b2ob2o15b2obo12b3o3bo7bo17bo24bobo7bobo9bobo11bobo13b3o13b2o10b 2o16bobo$150bo3bo3bo3bo9b3o7bo14bo3bo11bo3bo14bo4b2obo8bobo15bobo20bob o9bo2bo8b4o10b4o40bo14b4o$172b2o2bob2ob2o14bo3bo9b2obob2o14b3o5b2o7bob o15bobo20bo10bob2o11bobo11bobo13b2o13b2o10bo2bo9bobo$150bo3bo3bo3bo11b 3o4bo14bo3bo10bo19bo9bo49bo10bo2b2o9bobo11bobo13b2o13b2o23bobo$172bo2b obo3bo12b3obobo9b3o3b2o11b2o18b3o15b3o18bo2bo9b2o13bo13bo17bo14bo6bo2b ob2o9bo$28bo121bobobo3bobobo8bo4bo4bo9bo2b2o3b2o8bo6b2o11bobo17b2obo 14b2obo17b3obo8bo15bo13bo14bo14bo8bo2bo13bo$27bobo141bo4bo4bo8bobo3b2o 11bo2b2o37b2obo14b2obo15bo12b2o14bobo11bobo11b3o12b3o7bo2bo13bobo$26b 2o126bo7bo9bo2bobo3bo7bo2bo3bo4bo7bo2bo5b3o7b3o58b4o8b4o13bo13bo12bo 14bo10b3o14bo$27bobo144b3o4bo8bobo3b2o2bo11bo5b3o7bobo26bobo27bo17bo 11b2o12b2o11b2o13b2o11bo14b2o$27b2o125bo7bo9b2o2bob2ob2o8bo2b2obobo14b o14bobo19bo3bo2bo10bo3bo2b2o8bo4b2o54bo14bo$30bo141b3o7bo11b2o16b2o3b 2o9b2o20b2obobo2b2o8b2obobo2bo8b2o2b2o10bo14bo2bo10bo2bo9bo2bo11bo2bo 11bo12bo2bo$obobo3bobobo13bo2bo166b2o14b2o3b2o31bobo15bobo4bobo7bobo3b o8b2o13bo13bo12bo14bo13b2o12bo$25bo171bo16bo4bo9bo19b2o16b2o15b2o15bo 12b2o12b2o11b2o13b2o13b3o10b2o$4bo3bo15b2o203bobo69b3o10bobo11bobo10bo bo12bobo25bobo$25bobo201bobo18bo17bo16bo16bo10b2o12b2o11b2o13b2o15bobo 8b2o$obobo3bobobo12b2o203bo19bobo15bobo14bobo16bo67b2o$28bo221bobo15bo bo14bobo14b2o10bo13bo12bo14bo16bo10bo$4bo7bo11bo2bo223bo17bo16bo15b2o 10bobo11bobo10bobo12bobo14bobo8bobo$23bo280bo9bobo11bobo10bobo12bobo 14bobo8bobo$obobo3bobobo9b2o291bo13bo12bo14bo16bo10bo$22bobo$21b2o2$ 22bo$22bobo$22bobo$23bo7$335bo41bo10bo$298bo18bo16bobo11bo12bo13b2o9b 2o15bo18bo$281bo15bobo16bobo14b2o11b2o12bobo12b2o9b2o13b2o18bobo22bo$ 280bobo14bobo16bobo15bo11b2o11b2o16bo10bo12b2o18bobo21bobo$279bo2bo14b o18bo16bobo12bo11bobo12bo10bo16bo17bo23bobo$280bo52bo12bo13b2o12b3o8b 3o13bo43bo$192b3o23bo25bo17bo4bo13b2o13b2o17b2o15bo12b3o15bo10bo10bo 15bobo16b2o22b2o$192b3o21b2o24b2o17bobobo2bo28bobo16bobo13b2o11bo13bo 2bo10b2o9b2o15bobo17bobo20bobo$45bo15bo114bobo15b2o20b2o24b2o17bobobo 3bo13bo13b2o17b2o14bobo9b2o12bo17bo8bo16bo18b2o$44bobo13bobo113bo16bo 3b2o62bo3bo14bo17bo18bo14b2o11bo11b2o13bo2bo10bo2bo10b2o20bo20b3o$43b 2o15bobo87bo3bo3bobobo9b4o41b3o23b3o4bobo7b2o6bo10bobob2o14bo2bo15bo2b o24bo2bo7bobo11bo29bo21bo2bo16b2o$44bobo13bo111b4o2bo15b2obo12b3o3bo3b obo2b2o9b3o3bo3bobo2bo8bobo4b2o9b2o6bo16bo18bo11b2o20b2o12b2o15b2o12b 3o23bo17bo$25b2o17b2o13b2o89bo3bo3bo16bo19bo13bo5bo2bo3bo2bo9bo5bo2bo 3bo2b2o15bo10bo2bo2bo14b2o17b2o13b2o11b2o22bo16bo13bo21b2o20b3o$47bo 11bobo109b3o5b2ob2o8b3obo10b2o4bobo2bo5bobo6b2o4bobo2bo14b3o6b3o8b2o 19bobo16bobo14bo11bo8bo13b3o13bobo14bo20bo$obobo3bobobo10b2o2bo15bo2bo 103bobobo3bobobo8b2ob2o4bo10bo4bo10b3o3bo19b3o3bo19bobo7bo10bo3bo14b2o 17b2o14bo12bobo7bo14bo14bo14b2o21b3o18bobo$22bo19bo15b3o112b2o2bo6bo6b obo19bobo23bobo18bobo8bo9bo2bo15bo16bo3bo11b3o11bo8bo17bo11bo15b2o3bo 18bo18bo$4bo3bo12b2o4b3o11b2o15b3o93bo7bo11b2o8bo6bo2bobo2bo8bobo3bo 19bobo3bo18b2o8b2o12bo17bo2bo15bo12bo12bo9b2o14b2o12bobo15bo2bo20bo17b o3bo$22bo4b3o12bobo12bo123b3o8bob3o2bo8b2o24b2o33b2o12b2o20bo10bobo13b 2o12bobo8bo2bo11b2o12bobo16bobo18b2o19bob2o$obobo3bobobo9b3o17b2o11b2o 97bo3bobobo12bobo2bo11bob3o2b2o8bo25bo24bo10bo30b2o11b3o17bo10bobo9bob o26b4o17bo2bo14b2o3bo18bo$23bo6b3o12bo9bobo117bo3bo13bobo3bo9bobo23bob o22bobo22b3o14bobo10bo15bo2bo9b4o9b3o10b2o17bobo20bo15bo2bo19b3o$4bo3b o3bo12bo4b3o8bo2bo130bobobo29bobo23bobo22bobo22b3o13b2o11b2o14bo12bobo 10bobo11bobo16bobo17b2o18bobo19b3o$23b2o15bo13b3o119bo3bo15b2o12bo25bo 24bo40bo13bo12b2o12bobo10bobo11b2o17bo20bo21bo2bo$obobo3bobobo10b2o4b 2o8b2o13bobo141b2o86bobo14bo2bo8bobo12bo12bo12bo13bo19bo19b3o23bo17b3o $25bo3b2o9bo14bobo228b2o19bo7bobo12b3o11bo12bo13bo18bobo18bo21b2o19b3o $31bo8b3o11b2o231bo16b2o9bo15bo12bobo10bobo11bobo17bo21bo19bobo$41bo 245bobo14bobo10bo15bo11bo12bo13bo17b2o19b2o19b2o19b2o$43bo11bo231bobo 13b2o10b2o14b2o11b2o11b2o12b2o18bobo17b2o20bobo17b2o$41b2o12bobo230bo 15bobo8b2o14b2o12bobo10bobo11bobo17bo20bo20bo20bo$41b2o12bobo247bo11bo 15bo12bo12bo13bo$43bo12bo11$347bo$296bo18bo12bo16b2o11bo21bo$294b2o17b 2o12bobo15b2o9b2o21bobo$285bo8b2o17b2o11b2o19bo8b2o20b2o$250bo32b2o11b o18bo11bobo15bo12bo20bobo$26bo220bob2o15bo16b2o9bo18bo13b2o15b3o9bo22b 2o$25bobo14bo132b3o68bo2bo16bo18bo7b3o16b3o15bo13bo10b3o24bo$24b2o14b 2o133b3o67bo3bo11b3obo17bo9bo18bo13bo2bo13b2o10bo22bo2bo$26bo13b2o135b 2o15b2o23b2o24bo4bo8bo2b2obobo15bobo6b2o17b2o12bo20bo7b2o21bo$24b2o16b o132bobob2o9b2obo2bo18b2obo2bo22b3o3bo7b2o3b2o18bobo7bo18bo11b2o16bo2b o9bo20b2o$24b3o13bo109bo3bo3bobobo14bo11bo3b2o19bo3b2o22bo4b2obo7bo5bo 19bo9bo2bo15bo2bo8bo15bo14bo2bo17bo$39b3o132b2o12bo8b3o13bo8b3o5bo11b 3o5b2o7bo4bobo16bo14bo18bo7b3o12b2o18bo16b3o$obobo3bobobo11bo2bo11bo 110bo3bo3bo14bo15bo3b5o3bo3b2o7bo3b5o3bob2o11bo9bo7bo5bo13b2o2bo11b2o 17b2o10bobo11bobo14b2o19bo$24bobo11b2o133b4ob2o11bobo4bo2bob2o11bobo4b o2bo3b2o7b2o23b2o12bo2bo13bobo16bobo13bo8b2o17bo21bo$4bo7bo11bo12bo3bo 108bobobo3bobobo8bo5bo3bo7b3o3bo9bo8b3o3bo18bobo16b2o5bobo10b3obo11b2o 17b2o12bo3bo26b3o17b2o$25bo14bo130b5obo3bo7b3o3bo2bo15b3o3bo2bo35bobo 4bo11bo16bo16bo3bo11b2o10bo18bo18b2o3bo$obobo7bo12bobo8bobo115bo3bo3bo 8bo9bo14bo24bo16b3o18b2o18b4o13bo2bo15bo13bobo8bo20bo18bo2bo$26bo8b3o 134bo3bo2bo17bo24bo15b3o19bo16bo22bo10bobo15b2o9bob2o15b2o20bobo$4bo7b o12b2o8bo118bo3bobobo9bo5b2o15bo2bo21bo2bo37bo2bo11bo4b2o14b2o11b3o19b o8b3o15b2o3bo19bo2bo$34b2o138bo20bo24bo20b3o21bo9b2o2b2o16bobo10bo17bo 2bo29bo2bo23bo$obobo7bo11bo2bo7bo136b2o21bobo22bobo18b3o18b2o11bobo3bo 14b2o11b2o16bo11b2o21bobo20b2o$23bo12bo2bo132b2o22bo24bo40bobo9b2o21bo 13bo14b2o11b3o23bo2bo17bo$22b2o16bo133bo65b2o19b2o35bo2bo8bobo13bobo 40bo16b3o$22bobo12b2o201b2o20bobo10bo26bo7bobo12b2o13bobo23b2o19bo$21b 2o14bobo202bo20bo11bobo21b2o9bo29b2o24bobo20bo$36b2o237bobo21bobo10bo 13bo14bo23b2o20b2o$22bo14bobo236bo21b2o10b2o14bobo12bobo22bobo18b2o$ 22bobo13bo260bobo8b2o14bobo12bobo23bo21bo$22bobo275bo11bo14bo14bo$23bo 12$409bo$408bobo$407b2o14bo16bo17bo$319bo89bo11b2o15b2o17bobo$25bo9bo 235bo20bo25bobo86b2o12b2o15b2o17bobo$24bobo7bobo139b2o58bo33bobo18bobo 23b2o14bo73b3o13bo16bo16bo$23b2o9bobo137b2o3bo54b2o33bo2bo17bo2bo24bo 13bobo13b2o71bo16bo17b2o$25bo8bo139b2obobo17b3o16bo17b2o34bo20bo25bobo 12bobo72bo2bo9b3o14b3o16bobo$23b2o154bo17b2o16bo43bo11b2o19b2o23bo14bo 13b2o2bo16bo4bo13bo4bo15bobo10bo16bo$23b3o7b2o140b3o21bo14b2o19b3o20bo bo55bo28bo20bobobo2bo11bobobo2bo14bo11b2o15b2o17b3o$34bobo137bo21b3o 17bobo16b3o19b2o14bo6bobo11bo21bobo12b2o11b2o4b3o13bobobo3bo10bobobo3b o14bo11bo14bo3bo15b3o$23bo2bo7b2o114bo3bo3bobobo10b3o19bo18b3o2bo38bob o9bo7bo2bo9bo7bo2b2o12bo2bo11b2obo10bo4b3o13bo3bo2b2o10bo3bo18bobo10bo 2bo13bo15bo$obobo3bobobo10bobo9bo136bo2bobo17b2o17b2o2bo12bob2o23b2o9b obob2obobo2b2o7bobob2obobo2bo14b2o13bobo10b3o17b2o6bo10b2o6bo16bo15bo 8bobo15b2o$23bo12bo2bo110bo3bo7bo30bo3bo11bo20bo3bo12b3o11bo6b2o19b2o 10bobo14b2o12bo13bo6b3o9bobo5bobo8bobo4b2o15b2o12b2o9b3o16bobo$4bo3bo 3bo11bo15bo131b3obobo14b3o11bo2b3ob2o13b2o15bo10bo2bo8bo2bo2bo14bo2bo 2bo20bo14bobo13bo4b3o36bo29bobo8bo$24bobo10b2o111bobobo7bo8bo3b3o15bob 3o9bobo5bo13bo4b2o8b2o4bo5bo12b2o19b2o20bo3bo2bo10bo2bo12b2o16b3o6b3o 7b3o6b3o12bo2bo10b2o9b2o17b3o$obobo3bobobo12bo12bobo131bo4bo28bo9b2obo 8b5obo9b3o3bobo2b2o13bo3bo16bo3bo14b2o5bo11bo4bo11b2o4b2o10bobo6b2o8b 3o7bo12bo13bo3bo8bo17b3o$24b2o12b2o114bo7bo9bo15b2ob2o2bo11b3o6bobo12b obobo14bo6bo13bo2bo17bo2bo14b2o16b2o6b2o10bo3b3o10bobo7bo19bo9b2o16bo 10bo2bo12bo$4bo3bo3bo28bo132b2o11bo4bobo2bo12bobo14bo17bobo3b5o17bo20b o19bo2b2o9bobo2b2o29b2o7b2o11b3o4b2o11bobo10bobo16bo9b2o$23bo2bo10bo2b o113bo7bo8b2o13bo3bo2b2o3bo9b3o2bo13bo2b2o13b2o6b2o18b2o19b2o15b4o12b 2o5bo20b3o16bobo9b3o4b2o11b2o10b3o14b2o11bobo$obobo3bobobo9bo13bo135bo 14bo5b2o2bo10b2o16bob4o14bo7bo57b2o2bo17b3o18b3o7bo9bo19bo13bo8bo16bob o$21b2o12b2o135b3o14bo4b2o15bo14b2o18bobo26b3o18b3o29bo6bo29bobo17b2o 18bo2bo8b2o15b2o11b3o$22bo12bobo135bo13b2o19b2o2bo33bobo26b3o18b3o15b 2o12bobo6bo16b2o9bobo17b2o17bo13bo16bo11bobo$22b3o9b2o139bo11b2o20bo2b o14bo19bo66b3o11bobo4b2o17b2o10bo20bo15b2o14bo2bo13bo2bo8bobo$23bo149b 2o14bo20bo16bobo44b2o19b2o32bo5b2o19bo46bobo17bo16bo6b2o$25bo9bo137b2o 52bobo44b2o19b2o16b2o22bo64b2o16b2o15b2o$23b2o10bobo137bo52bo47bo20bo 15b2o105bobo14bobo8bo$23b2o10bobo277bo87bo15b2o15b2o10bobo$25bo10bo 366bobo14bobo14bobo8bobo$403bobo15bo16bo10bo$404bo12$325bo25bo17bo$ 324bobo10bo12bobo15bobo$323b2o10b2o13bobo15bobo14bo16bo$23bo16bo12bo9b o261bo9b2o13bo17bo15bobo14bobo$22bobo13b2o12bobo7bobo149bo20bo14bo72b 2o12bo45b2o16bobo$22bobo13b2o11b2o9bobo135bo11b2o19b2o14bobo71b3o9bo 13b2o16b2o15bobo14bo$22bo17bo12bo8bo135b2o12b2o19b2o14bobo9bo4bo15bo4b o16bo4bo25bobo12bobo15bobo13b2o$38bo12b2o127bo17b2o14bo20bo13bo10bobob o2bo13bobobo2bo14bobobo2bo12bo2bo8bo14b2o16b2o17bo12b2o$21b2o14b3o11b 3o7b2o116bobo30bo20bo14b2o10bobobo3bo12bobobo3bo13bobobo3bo11bobo10bob o12bo17bo13bo2bo14bobo$22bobo12bo24bobo114b2o18b3o7bo2bo20bobo12bobo9b o3bo2b2o12bo3bo2b2o13bo3bo2b2o11bo12bobo13bo2bo14bo2bo8bo18b2o$22b2o 12b2o13bo2bo7b2o115bo19b3o7bo2b2o19bobo23b2o6bo12b2o6bo13b2o6bo13bo31b o17bo6b2o19bo$obobo3bobobo10bo13bo13bobo9bo86bo3bo3bobobo17bobo26bo24b o12b3o9bobo5bo12bobo5bo13bobo5bo13bobo9b3o14b2o16b2o9bo20bo2bo$24bo2bo 10bo2bo9bo12bo2bo112bobo9bo4b2o11b3o2bo17bo10bo2b2o20bo20bo21bo12bo10b 2obo14bobo14bobo8b3o$4bo3bo3bo15bo13bo9bo15bo81bo3bo3bo3bo16b3o9bo4bob o12bo18bo2bo8b2o14b3o6b2o10b3o6b2o11b3o6b2o12b2o12b2obo12b2o14b2o11bob o14bo2bob2o$25b2o12b2o11bobo10b2o111b2o10b2o2bobo14bob3o12b2obo10b2o5b 3o6b3o6b2o10b3o6b2o11b3o6b2o45bo15bo13bo12bo2bo$obobo3bobobo13bobo11bo bo10bo11bobo82bobobo3bobobo15bo11bo2bo15b2o3b2o12b3obo13bo3bo18bo20bo 21bo10bo2bo26bo2bo12bo2bo11bo3bo11bo2bo$26b2o12b2o10b2o10b2o107bo3bobo 9b2o2bo4bo10b2obobo12bo15b4o3bo10b3o12b3o19b3o21bo14b2obo11bo15bo16b2o 14b3o$4bo7bo16bo13bo21bo88bo3bo3bo9bobo3bo10bo5bo3bo14bo12b6o11b2o2bo 12b3o12b3o19bobo20b2o14bobo11b2o14b2o17bo15bo$25bo2bo10bo2bo8bo2bo11bo 2bo102bo4b3o2bo6b2obo3b2obo8b2obo13bo96bobo11bo15bobo13bobo15b3o$obobo 3bobobo11bo13bo12bo18bo83bo3bobobo9bobobo5bo7bo17b2o14bo4b2o15b2o14bob o12bobo17b3o22b2o10b2o16b2o14b2o17bobo13bo$23b2o12b2o11bo16b2o106b5obo 8b2o2bo15bobo10b2o2b2o17b3o13b2o13b2o18b2o26bo8bobo18bo15bo19bo9b2o$ 24bo12bobo10b3o15bo102b2o20bobo14bo12bobo3bo33bo14bo20bo21bo2bo26bo2bo 12bo2bo17bo3bo8b3o$24b3o9b2o30b3o101b2ob2o3bo10bo3bo15b4o7b2o23bobo13b obo12bobo16b2o21bo12b3o14bo15bo22b2o13bobo$25bo25bobo15bo103bob2o14bo 20bo34b2o14bobo12bobo17bobo18b2o12bobo13b2o14b2o23bo11b3o2bo$27bo9bo 13b2o18bo105bo13bobo18b2o9bo24bo15bo14bo19bo20bo13bobo12bobo13bobo22b 3o9b2o$25b2o10bobo12bo16b2o121bo20bo9bobo22bobo69b3o10b2o13b2o14b2o25b o13bo$25b2o10bobo12bobo14b2o143bo8bobo22bobo70bo71bo8b2o2bo$27bo10bo 13bobo16bo152bo24bo73bo10bo14bo15bo25b2o10bo2bo$53bo267b2o11bobo12bobo 13bobo23b2o11bo$321b2o11bobo12bobo13bobo25bo$323bo11bo14bo15bo46$609bo 18bo16bo17bo13bo15bo32bo28bo13bo13bo$608bobo16bobo14bobo15bobo11bobo 13bobo11bo17b2o27b2o13bobo11bobo$608bobo16bobo14bobo15bobo11bobo13bobo 9b2o18b2o12bo14b2o13bobo11bobo$608bo18bo16bo17bo13bo15bo11b2o20bo9b2o 17bo12bo13bo$50bo655bo17bo11b2o15bo$49bobo13bo19bo488b2o31b2o17b2o15b 2o16b2o12b2o14b2o11bo18b3o12bo13b3o12b2o12b2o$48b2o3bo10bobo17bobo451b o18bo50bobo16bobo14bobo15bobo11bobo13bobo9bobo16bo12bo15bo15bobo11bobo $49bo4bo9bo19bobo18bobo429bobo16bobo13b2o2bo31b2o17b2o15b2o16b2o12b2o 14b2o10bo17b2o11b3o13b2o15b2o12b2o$48b5obo9bo2bo16bo20b2obo13b2o23b2o 21b2o278bo20bo20bo9bobo8bo23b2o17b2o13bo19bo4bo12bo18bo16bo17bo13bo15b o11bobo17bo9bo14bo3bo14bo13bo$34bo12b3o16bo33bo3bo13b2obo2bo18b2obo2bo 46bo32bo28bo28bo28bo132bo2b3o5bobo7bo2b3o15bo2b3o3bo2bo8bo2b3o3bo2b2o 11bo18bo13b2o4b3o11bobobo2bo12bo2bo15bo2bo13bo2bo14bo2bo10bo2bo12bo2bo 7bobo13bo2bo9b2o17bo16bo2bo10bo2bo$30b2ob2o11bo3bo15bob3o12b2o2bobo8b 2obob2o12bo3b2o19bo3b2o20b2o2bo22b2o23b2o6bobo18b2o6bobo18b2o6bobo18b 2o6bobo5bobo9b3o26b3o26b3o26b3o23b2o4bobobo2bo7b2o4bobobo2b2o6b2o4bobo bo2b2o6b2o4bobobo2bo13bo18bo13bo4b3o11bobobo3bo15bo18bo16bo17bo13bo37b o14bo13bobo22bo13bo$o3bo3bobobo16bo3bo11bo3bo16b3o12bo2bob4o8bo17bo8b 3o13bo8b3o5bo8bo25b5ob3o25bo28bo8bobo17bo6bo2b2o17bo6bo2bo9bo28bo28bo 28bo30bobo3bo2b2o10bobo3bo2bo11bobo18bobo5bobo10b2ob2o14b2ob2o11b3o16b o3bo2b2o12b2o17b2o15b2o16b2o12b2o14b2o8b3o11b2o15bo2bo8b3o20b2o12b2o$ 29bo3bo11bobobo30bo4b2o10b3o3b2o12bo3b5o3bo3b2o7bo3b5o3bob2o8b2o4b3o 17bo8bobo4bo9b2o2bo3bo2b2obobo2b2o8b2o2bo3bo2b2obobo2bo9b2o2bo3bo2b2ob obo2bo9b2o2bo3bo2b2obobo2b2o6b2o4bo4bobo15b2o4bo4bobo15b2o4bo4bobo15b 2o4bo4bobo15b2ob2o16b2ob2o7bobo6b2ob2o16b2ob2o20bo2b3o13bo2b3o11bo6b2o 8b2o6bo13bobo16bobo14bobo15bobo12bobo13bo8b2obo10bobo26bo22bobo12bo$o 3bo3bo3bo15bo3bo2bobo7bo3bo14b4o11bo3bob2o9bo6b2o14bobo4bo2bob2o11bobo 4bo2bo3b2o7bo4b2o18bobo2b2o4bobo3bo7bo6b5o5bo2bo8bo6b5o5bo2b2o7bo6b5o 7bobo7bo6b5o16b3o3bobob2obo15b3o3bobob2obo15b3o3bobob2obo15b3o3bobob2o bo15b3o18b3o18b3o18b3o21b2o17b2o18bo4b2o8bobo5bobo10b2o17b2o15b2o16b2o 14b2o13bobo9b2obo7b2o13bo2bob2o7b2o21b2o14b3o$26b3obobo3bobo7bo2b2o13b o4b2o8bo2b2obo10bo2b2o16b3o3bo9bo8b3o3bo18b3o4bo10bo6bo5bo2b3o2bo9b2o 4b2o6bo5bobo6b2o4b2o6bo14b2o4b2o6bo14b2o4b2o6bo20bo28bo13bo14bo28bo22b 4obo15b4obo15b4obo15b4obo17bo5bo12bo5bo12b2o7bo29bo18bo16bo19bo15bo11b o37bo2bo11bo20bo3bo13bo$obobo3bobobo10bo2b2o3b2o3bo9bo5b2o8bo2b2o2b2o 7b3o15bo2bo5b3o9b3o3bo2bo15b3o3bo2bo16bo6b4o5b2o7bo5bo6bob2o7bo4b2o3b 2o17bo4b2o3b2o17bo4b2o3b2o17bo4b2o3b2o17bobo3b6obobobob2o8bobo3b6obobo bobobo7bobo3b6obo15bobo3b6obo5bo8b2obobo15b2obobo15b2obobo15b2obobo17b 4o2bo12b4o2bo12b2o5bo8b3o6b3o12bo2bo15bo2bo13bo2bo11bo2bo12bo2bo11bo 24bo13bo2bo12bo2bo19bo16bo$22bobo3b2o17b2obo11b3o12bo3bo17bo5b3o16bo2b o21bo2bo17bo10b2obo8bobo21b3o4bo2b2o17b3o4bo2b2o17b3o4bo2b2o17b3o4bo2b 2o17b2o6bo8bobobo7b2o6bo8bob2o8b2o6bo8bob2o8b2o6bo8bobobo90bo6bo11bo6b o15bo3b3o7b3o6b2o17bo18bo16bo9bo15bo15bobo10b2o10bo14b3o31bobo16b2o$4b o7bo8bo2bo3bo4bo16bo10bo2bobo10bo2bo20bo23bobo22bobo15b2o8b3o3bo9bo9b 2o12bo28bo28bo28bo28bo8bo2bo5bo10bo8bo2bo16bo8bo2bobobobobo8bo8bo2bobo bob2o7b2o2bo16b2o2bo16b2o2bo16b2o2bo16b5o14b5o22bo20bo13b2o17b2o15b2o 10b2o14b2o14bo2bo9b2o10bo16bo14b2o15b3o17b2o3bo$22bobo3b2o2bo17b2o9b3o 13bo2bo18b2o5bobo16bo24bo17b2o9bo4bo8b2o8bo16bo28bo28bo28bo26bobo6bo 19bobo6bo19bobo6bo8bo10bobo6bo18bo20bo20bo20bo19bo18bo9bobo13b2o12b3o 3b2o14bobo17bobo13bobo10bobo13bobo11b4o11bo10b2o31bo15bo21bo2bo$4bo3bo bobo10bo2b2obobo29bo2bo15bobo16b2o5b2o19bo24bo17bo8bo3bo10bobo5bo2bo 12b2o27b2o27b2o27b2o27bobo7b2o17bobo7b2o17bobo7b2o17bobo7b2o16bo3bobo 14bo3bobo14bo3bobo14bo3bobo14bo3b2obo2b2o7bo3b2obo2bo16bo11b3o4bobo11b 2o19b2o13b2o12b2o14b2o11bobo10bo2b2o10bo2bo13bo13bobo13b2o22bobo$26b2o 24b3o8b2o36bo5bo17b2o23b2o28bo2bo11bo7bobo12b2o27b2o27b2o27b2o28bo28bo 28bo28bo30b2obo17b2obo17b2obo17b2obo13bo6bo2bo8bo6bo2b2o14bobo18bo13bo 22bo14bo13bo15bo9bo12bo2bo12bobo11b2o14bo18bo23bo2bo$28b2o22b3o8bo16b 3o24bobo15b2o23b2o29bob2o19bo15bo28bo28bo28bo142b2o19b2o19b2o19b2o20bo 6bobo9bo23bobo9b2o22bo2bo14bo2bo11bo2bo10bo2bo12bo2bo9bo13bo14b3o12b3o 12bo15bo2bo28bo$29bo34b3o13b2o25bobo17bo24bo31bo265b2o19b2o19b2o19b2o 18b2o17b2o24bo11b2o26bo12bo14bo13bo15bo13bobo12b3o10bobo16bobo9bobo12b o29b2o$51b2o14bo14bo25bo343bo20bo20bo20bo17b2o17b2o26bo11bo22b2o13b2o 13b2o12b2o14b2o13bo2bo12bo11bobo14b3o2bo8bo2bo10b2o30bo$51b2o12b2o13b 2o453bo18bo23b2o36bo14bo14bo13bo15bo29b2o2bo7bo16b2o26bobo29b3o$53bo 11b3o13bobo494b2o36b3o12b3o12b3o11b3o13b3o11b3o16bobo7bo18bo10b3o10b2o 32bo$82bo497bo36bo14bo14bo13bo15bo12b2o15bo3bo7bobo13b2o2bo9b2o47bo$ 619bo14bo14bo13bo15bo12bo14bo12bo15bo2bo11bo11bo32b2o$617b2o13b2o13b2o 12b2o14b2o11b2o15bobo9b2o16bo11b2o12bobo30b2o$617b2o13b2o13b2o12b2o14b 2o12bobo14bo11bobo27bobo10bobo32bo$619bo14bo14bo13bo15bo12bo28bo29bo 12bo12$423bo11bo20bo12bo17bo15bo16bo11bo17bo26bo16bo12bo14bo21bo10bo9b o14bo$421b2o10b2o19b2o11b2o16b2o14b2o15b2o10b2o16b2o25b2o15b2o11b2o13b 2o20b2o10bobo7bobo12bobo27bo19bo20bo$290bo21bo108b2o10b2o19b2o11b2o16b 2o14b2o15b2o10b2o16b2o25b2o15b2o11b2o13b2o20b2o9b2o9bobo12bobo26bobo 16b2o19b2o$289bobo19bobo109bo11bo20bo12bo17bo15bo16bo11bo17bo26bo16bo 12bo14bo21bo10bo8bo14bo28bobo16b2o19b2o$76bobo199bo9b2o20b2o27bo11b2o 68bo11bo20bo12bo17bo15bo16bo11bo17bo26bo16bo12bo14bo21bo10b2o53bo$76bo 200bobo9bo21bo27bo81bobo9bobo17b3o10b3o15b3o13b3o14b3o9b3o15b3o24b3o 14b3o10b3o12b3o19b3o9b3o7b2o13b2o27b2o19b3o18b3o$41bo31b3o201b2o9bobo 19bobo21b3obo10b2o2bo57bo9bobo9bo19bo12bo17bo15bo16bo11bo17bo26bo16bo 12bo14bo21bo22bobo12bobo25bobo18b3o18b3o$30bo9bobo30b2obo200bo10bo21bo 21bo2b2obobo7bo60b2o11bo11bobo15b2o11b2o16b2o14b2o15b2o10b2o16b2o25b2o 15b2o11b2o13b2o20b2o11bo2bo7b2o13b2o$28b2o9b2o31bo2b2o146bo21bo32bobo 6bo21bo21b2o3b2o9b2o4b3o16bo36b2o9b2o12bobo16bo12bo17bo15bo16bo11bo17b o24bo3bo12bo3bo10bo16bo17bo3bo9bobo9bo14bo25b3o16b3o18b3o$28b2o11bo31b ob2o2bo142bobo19bobo31bobo6bobo19bobo19bo5bo10bo4b3o15bobo5b2o40bo32bo 2bo9bo2bo14bo2bo12bo2bo13bo2bo8bo2bo14bo2bo23bo16bo12bo2bo8bo2bo21bo 10bo12bo2bo11bo2bo21b3o16b3o18b3o$30bo8b2o28b2obo2b2o13b2o31b2o31b2o 31b2o31bobo19bobo6bobo20b4o7bo21bo22bo4bobo8b3o19b2o26bo11b3o8b3o10b3o 21bo12bo17bo15bo28bo17bo18bobo14bobo25bo21bobo13bo15bo14bo38bo20bo$obo bo3bobobo15bo10b3o26bo8bo144bo6bo2b2o10bo6bo2bo20bobo10b4o18b4o18bo5bo 10bo6b2o13bobo3b2o2bo15bobo10b3o9bo11b2obo17b2o11b2o16b2o14b2o15b2o10b 2o16b2o19b3o14b3o16b2o7b2o20b3o14bobo10b2o13b2o19b3o15bob2o17bob2o$28b obo40bo5bobo8b2o2bo6bo3bo17b2o2bo6bo3bo6bo10b2o2bo6bo3bo17b2o2bo6bo3bo 23b2obo2bo15b2obo2b2o19bobo12b2o20b2o23b2o12bo4b2o13b2o3bo19b2o26bo11b 2obo15bobo10bobo15bobo13bobo15bo11bo17bo19bo16bo19bo8bo20bo17bo11bobo 12bobo18b3o14bo3bo16bo3bo$o7bo3bo15bobo9bo2bo23bobo17bo10bobobo2b2obob 2o8bo10bobobo2b2obobobo7bo10bobobo2bo14bo10bobobo2bo4bo11b2o8bobo9b2o 30bo16bo21bo16b2o5bobo8b2o7bo15bobo4b3o13bobo3bo3b3o12b2o30b2o11b2o16b 2o14b2o16bobo10b3o15b3o16b2o15b2o18bobo7b3o17b2o16b2o10b2o13b2o19bo16b o20bo$29bo9b3o3bo5bobo12b3o17b2o4b3o3bo3bo5bobobo6b2o4b3o3bo3bo5bob2o 7b2o4b3o3bo3bo5bob2o7b2o4b3o3bo3bo5bobobo7b7o15b7o42bo21bo19bobo4bo9b 2o5bo13bo2bo3bo3b3o13b2o3bo4b3o12b2o29bo3bo10bo17bo15bo16bo13bobo15bo 18bo16bo18bo10bobo19bo27bo14bo16bob2o17bobo18bobo$obobo3bo3bo10b3o2bo 10b2o2bobobo3b2obo11bo20bo4b2o4bobo3bo5bo9bo4b2o4bobo3bo15bo4b2o4bobo 3bobobobobo7bo4b2o4bobo3bobobob2o7bo21bo25bo4b4o14bo3b2obo14bo3b2obo 13b2o17bo3b3o11bo30bobo32b2obo17bo12bo2bo14bo2bo12bo2bo11bo18bo15bo17b o2bo13bo2bo13bo15bo13bo2bo14bo2bo11bo2bo11bo2bo11bo3bo$23b2o3bo13bobo 4bo15b2o20b3o4bo5bo2bo16b3o4bo5bo2bo16b3o4bo5bo2bo6bo9b3o4bo5bo2bo15bo bo3b3o13bobo3b3o15b2obo4bo17bo5bo15bo5bo14bo21bo12b2o14b3o9bo2bo3b2o2b o12b2o13bobo14bobo18bo17bo15bo10bobo13bo3bo12b2o22bo16bo12bobo10bo3bo 11bo17bo44bo22b3o18b3o$4bo3bo3bo13bo13bo3bo2b3o18bo19bo6b3o3bo19bo6b3o 3bo19bo6b3o3bo19bo6b3o3bo17bo5bo15bo5bo17bo4b2obo18bobo19bobo18bo2bo 16b2o12bobo13b3o8bo24bobo11bo16b3o16b2o16b2o14b2o11bo2bo14b2o14b2o3bo 15b2o15b2o13bo2bo11b2o12b2o16b2o12bo2bob2o12b2o12bobo19bo20bo$24b2o2bo 2b2o7bo3bo2b2o2bo12bo2bo22bo32bo32bo32bo29bo5b4o12bo5b4o12b3o3b2o29bob o35bo16bo11b2o25b2o9b2o12b2obo9b2o17bo18bobo16bobo12bobo9b4o16bobo14bo 2bo16bobo13bobo11b4o13bobo11bobo16bo11bo2bo16bo34bobo18bobo$obobo3bobo bo9bo2bo2bobo9bobo7bobo10bo24b2o31b2o31b2o31b2o30bobo4bo14bobo4bo13bo 31bo3bo2bo14bo3bo2b2o10b2o19bo2bo23b2o9bobo22bo12bobo15b2o17b2o18b2o 12b2o10bobo18b2o16bobo16b2o13b2o12bobo15b2o12b2o15b3o11bo2bo15bobo11b 3o17b4o17b4o$22b3o2b3obo9bo6bo13b2o24b2o31b2o31b2o31b2o31bo5b2o14bo5b 2o12bo2b2o26b2obobo2b2o12b2obobo2bo12bo23bo7bo14b2o8b2o24b2o32bo16bo 21bo13bo8bo23bo17bo2bo15bo14bo10bo20bo13bo13b2o2b2o9b3o15bo12bo19bobo 18bobo$21bo2bob3o19bo13bobo25bo32bo32bo32bo29b2o6bo13b2o6bo12bo2bo27bo bo19bobo4bobo11b3o18b2o9bobo14bo33b2ob2o7b3o15bo2bo18bo2bo13bo2bo10bo 2bo8bo20bo2bo22bo10bo2bo11bo2bo10bo17bo2bo10bo2bo17bobo26bo11b2o20bobo 18bobo$21b3o3b2o19bobo10b2o157bobo5bo13bobo5bo14bo26b2o20b2o21bo19bobo 8bobo23bo36b3o14bo26bo11bo13bo12bobo17bo23b2o11bo14bo14bobo14bo13bo18b o14bo2bo13bobo9b3o19bo19bo$21bo2bo24bo171bo21bo23bo71bo16b2o11bo24bobo 24b2o24b2o23b2o12b2o12b2o12bo2bo15b2o24bo10b2o13b2o14bo2bo12b2o12b2o 18bobo12bobo14bobo32bo18bobo$22b2o38bo202b2o26bo21bo21b2o18bobo34bobo 24bobo10b3o10bobo23bo13bo13bo31bobo23b3o8bobo12bobo29bobo11bobo17bo14b o17b4o8bobo19bobo16bo$62bobo200b2o26bobo19bobo19b2o19bo36bo24b2o12b3o 9b2o25b3o11b3o11b3o10b3o15b2o26bo8b2o13b2o15b3o12b2o12b2o20bo14bo18bob o7b2o21bo19bo$62bobo202bo25bobo19bobo21bo134bo13bo13bo11b2o46bo38b2o 49bobo12bobo16bobo8bo20b2o17b2o$63bo230bo21bo104bo11b2o12bo28bo13bo13b o11bo16bo26b2o8bo14bo17bo13bo13bo21bo14bo16bo11bobo19bobo15b2o$421bobo 9b2o12bobo24b2o12b2o12b2o10b2o17bobo24b2o8bobo12bobo13b2o14bobo11bobo 18b2o13b2o16b2o10bobo20bo18bo$421bobo11bo11bobo24b2o12b2o12b2o11bobo 15bobo26bo7bobo12bobo14bobo12bobo11bobo19bobo12bobo14bobo10bo$422bo25b o27bo13bo13bo11bo17bo36bo14bo16bo14bo13bo21bo14bo16bo! golly-3.3-src/Patterns/Life/Spaceships/c4-orthogonal.rle0000644000175000017500000017300513307733370020174 00000000000000#C All known c/4 orthogonal ships up to 70 bits. #C #C Discovery credits: #C AP = Aidan F. Pierce #C BU = "Bullet51" #C DH = Dean Hickerson #C HH = Hartmut Holzwart #C JB = Josh Ball #C JS = Jason Summers #C MM = Matthias Merzenich #C NB = Nicolay Beluchenko #C RM = "rmmh" #C SS = Stephen Silver #C TC = Tim Coe #C #C 37 JB 15 Apr 2012 #C 40 MM 27 Sep 2017 #C MM 27 Sep 2017 #C 41 JB 19 Apr 2013 #C 42 AP 19 Jan 2017 #C MM 27 Sep 2017 #C MM 27 Sep 2017 #C 43 MM 18 Apr 2012 #C 44 AP 26 Dec 2016 #C 45 MM 20 Apr 2012 #C MM 20 Apr 2012 #C MM 18 Jan 2017 #C MM 18 Jan 2017 #C 46 TC 3 May 1996 #C MM 20 Apr 2012 #C 47 SS 9 Oct 2000 #C SS 9 Oct 2000 #C MM 18 Jan 2017 #C MM 18 Jan 2017 #C 48 TC Dec 2015 #C TC Dec 2015 #C MM 18 Jan 2017 #C 50 MM 20 Apr 2012 #C MM 20 Apr 2012 #C 51 TC 3 May 1996 #C SS 11 Nov 2000 #C SS 11 Nov 2000 #C 52 AP 26 Dec 2016 #C 53 TC 6 Aug 1995 #C SS 10 Nov 2000 #C AP 10 Jan 2017 #C AP 10 Jan 2017 #C MM 28 Jan 2017 #C MM 28 Jan 2017 #C 54 TC Between Dec 2015 and 21 Apr 2016 #C AP 19 Jan 2017 #C 55 HH 2 Jan 2004 #C MM 20 Apr 2012 #C TC Dec 2015 #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C 56 MM 18 Apr 2012 #C TC Dec 2015 #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C 57 NB 25 Feb 2004 #C TC Between Dec 2015 and 21 Apr 2016 #C TC Between Dec 2015 and 21 Apr 2016 #C MM 20 Apr 2012 #C MM 20 Apr 2012 #C JB 15 Apr 2012 (tag by HH 18 Aug 1992) #C JB 15 Apr 2012 (tag by HH 18 Aug 1992) #C JB 15 Apr 2012 (tag by HH 18 Aug 1992) #C JB 15 Apr 2012 (tag by HH 18 Aug 1992) #C JB 15 Apr 2012 (tag by JS 1 Oct 2000) #C AP 19 Jan 2017 (tag by HH no later than 2 Mar 2006) #C MM 27 Sep 2017 (tag by HH no later than 2 Mar 2006) #C MM 27 Sep 2017 (tag by HH no later than 2 Mar 2006) #C 58 MM 16 Jan 2017 #C MM 29 Dec 2016 #C AP 17 Jan 2017 #C MM 20 Apr 2012 #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C JB 19 Apr 2013 (tag by HH 18 Aug 1992) #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C 59 MM 20 Apr 2012 #C 60 TC Between Dec 2015 and 19 Mar 2016 #C AP 1 Jan 2017 #C 61 JS 22 Sep 2000 #C MM 1 Oct 2017 #C MM 1 Oct 2017 #C MM 20 Apr 2012 #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C 62 MM 2 Aug 2015 #C MM 20 Jan 2017 #C MM 1 Feb 2017 #C MM 1 Oct 2017 #C MM 1 Oct 2017 #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 1 Oct 2017 (tag) #C MM 1 Oct 2017 (tag) #C MM 18 Jan 2017 (tag by HH no later than 2 Mar 2006) #C MM 18 Jan 2017 (tag by HH no later than 2 Mar 2006) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by HH 18 Aug 1992) #C MM 27 Sep 2017 (tag by HH 18 Aug 1992) #C 63 MM 18 Apr 2012 #C MM 20 Apr 2012 #C MM 20 Apr 2012 (tag by HH 18 Aug 1992) #C MM 20 Apr 2012 (tag by HH 18 Aug 1992) #C TC Between Dec 2015 and 21 Apr 2016 #C AP 26 Dec 2016 (tag by DH Dec 1989) #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C 64 TC Between Dec 2015 and 19 Mar 2016 #C TC Between Dec 2015 and 19 Mar 2016 #C TC Between Dec 2015 and 19 Mar 2016 #C AP 19 Jan 2017 #C MM 18 Apr 2012 #C MM 16 Jan 2017 #C MM 4 Aug 2015 (tag) #C MM 4 Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C AP 26 Dec 2016 (tag by HH 18 Aug 1992) #C AP 26 Dec 2016 (tag by HH 18 Aug 1992) #C AP 26 Dec 2016 (tag by JS 1 Oct 2000) #C MM 18 Jan 2017 (tag by BU 19 Mar 2016) #C MM 18 Jan 2017 (tag by BU 19 Mar 2016) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by MM Aug 2015) #C MM 27 Sep 2017 (tag by HH 18 Aug 1992) #C MM 27 Sep 2017 (tag by HH 18 Aug 1992) #C 65 TC Between Dec 2015 and 19 Mar 2016 #C MM 29 Dec 2016 #C BU 19 Mar 2016 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C TC Dec 2015 (tag by HH 18 Aug 1992) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 18 Jan 2017 (tag by JS 1 Oct 2000) #C MM 18 Jan 2017 (tag by JS 1 Oct 2000) #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C MM 27 Sep 2017 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C MM 27 Sep 2017 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C 66 HH 11 Aug 1992 #C TC Between Dec 2015 and 19 Mar 2016 #C TC Between Dec 2015 and 19 Mar 2016 #C MM 20 Jan 2017 #C TC Between Dec 2015 and 19 Mar 2016 #C MM 10 Oct 2017 #C MM 10 Oct 2017 #C JB 15 Apr 2013 (tag by DH Dec 1989) #C JB 15 Apr 2013 (tag by DH Dec 1989) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by BU 19 Mar 2016) #C MM 18 Jan 2017 (tag by BU 19 Mar 2016) #C 67 HH 17 May 1994 #C HH 2 Mar 2006 (as part of a grayship) #C TC Between Dec 2015 and 19 Mar 2016 #C SS 7 Oct 2000 #C SS 7 Oct 2000 #C AP 5 Jan 2017 #C AP 17 Jan 2017 #C AP 17 Jan 2017 #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM 20 Apr 2012 (tag by HH 18 Aug 1992) #C MM 20 Apr 2012 (tag by HH 18 Aug 1992) #C HH 2 Jan 2004 #C SS 9 Oct 2000 (tag by JS 1 Oct 2000) #C SS 9 Oct 2000 (tag by JS 1 Oct 2000) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by JS 1 Oct 2000) #C MM 18 Jan 2017 (tag by JS 1 Oct 2000) #C MM 18 Jan 2017 (tag by BU 19 Mar 2016) #C MM 19 Jan 2017 #C MM 19 Jan 2017 #C MM 18 Jan 2017 (tag by DH Dec 1989) #C 68 RM 9 Mar 2016 #C HH center: 5 Feb 1993; wings: no later than 2 Mar 2006 #C AP 28 Dec 2016 #C AP 29 Dec 2016 #C MM 23 Jan 2017 #C MM 1 Oct 2017 (tag) #C MM 1 Oct 2017 (tag) #C MM 2 Aug 2015 #C MM 2 Aug 2015 #C HH (tag found as part of a grayship no later than 2 Mar 2006) #C HH (tag found as part of a grayship no later than 2 Mar 2006) #C HH (tag found as part of a grayship no later than 2 Mar 2006) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C TC Dec 2015 (tag by JS 1 Oct 2000) #C TC Between Dec 2015 and 19 Mar 2016 #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by JS 1 Oct 2000) #C MM 28 Jan 2017 (tag by HH no later than 2 Mar 2006) #C MM 28 Jan 2017 (tag by HH no later than 2 Mar 2006) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 27 Sep 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C 69 JS 22 Sep 2000 #C JS 22 Sep 2000 #C JS 22 Sep 2000 #C TC Between Dec 2015 and 19 Mar 2016 #C TC Between Dec 2015 and 21 Apr 2016 #C SS 7 Oct 2000 #C SS 7 Oct 2000 #C MM 28 Jan 2017 (tag) #C TC 3 May 1996 (tag by HH 18 Aug 1992) #C TC 3 May 1996 (tag by HH 18 Aug 1992) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM Aug 2015 (tag) #C MM 20 Apr 2012 (tag by DH Dec 1989) #C TC Dec 2015 (tag by JS 1 Oct 2000) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C TC Between Dec 2015 and 21 Apr 2016 (tag) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by TC Between Dec 2015 and 21 Apr 2016) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 18 Jan 2017 (tag by MM Aug 2015) #C MM 28 Jan 2017 (tag) #C MM 27 Sep 2017 (tag by MM 28 Jan 2017) #C MM 27 Sep 2017 (tag by MM 28 Jan 2017) #C 70 MM 18 Apr 2012 #C TC Dec 2015 #C MM 28 Jan 2017 #C MM 28 Jan 2017 (tag) #C SS 11 Nov 2000 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C SS 11 Nov 2000 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C JB 15 Apr 2012 (tags by HH 18 Aug 1992 and 2 Mar 2006) #C JB 15 Apr 2012 (tags by HH 18 Aug 1992 and 2 Mar 2006) #C BU 19 Mar 2016 (tag) #C AP 26 Dec 2016 (tag by TC Between Dec 2015 and 21 Apr 2016) #C AP 26 Dec 2016 (tag by HH 18 Aug 1992) #C AP 26 Dec 2016 (tag by HH 18 Aug 1992) #C MM 18 Jan 2017 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C MM 18 Jan 2017 (tag by SS 9 Oct 2000 based on a ship by HH 5 Feb 1993) #C MM 18 Jan 2017 (tag by DH Dec 1989) #C AP 19 Jan 2017 (tag) #C AP 19 Jan 2017 (tag) #C MM 18 Jan 2017 (tag by DH Dec 1989) #C MM 18 Jan 2017 (tag by DH Dec 1989) x = 1696, y = 652, rule = B3/S23 252bo$252b2o2b2o$252bo2bo$255bo90bo$30bo277b2obobo24b2obob2obo$28bo2b 2o222b3o48bo4bob2obo19bo4bobo$26b3o227bo48bo10bo18bo$25bobo225bobo48bo 4b2o23bo4b2o13b2o47bo$25bob2o223bo14bo36bob3o25bob3o14b3o47b2o2b2o$obo bo3bobobo11bo4bo200bobobo3bobobo9bo3bo8b2o17bobo15b2o28b2o20bo15b2o31b o2bo$23b2o226b2obobo10bo10b2o2b2o2bo15b3o27b3o20b2ob2o10b3obo10b2o19bo $4bo7bo217bo11bo11bo3bo10b5o3b3o6bo14bo2bo26bo2bo25bo5bob3o13b3o$22bo 4b2o224b2ob2o12bo4bo4bobo18b4o26b4o20b2o7bobo6bobo9bo20b3o$obobo7bo13b o203bobobo3bobobo10b2obo13bo4bob3o2bo18b2o28b2o23bo6bobo10bo9b2ob2o16b o$23b3o230b2o12bo4bo6b2o73bo2bo14b3o13bo5bo6bobo$4bo7bo12bo208bo7bo9bo 3b2o11b2obo3b3o3b3o8b2o5bo22b2o5bo27bobobob2o20b2o7bobob3o$26bo229bo 14bo4b3o14bob3o3bo21bob3o3bo25b2o3bo12bo11bo6bobo4b3obo$obobo7bo12b2o 203bobobo3bobobo10b3o17b2o2b2o15bob2o3bo22bob2o3bo27bo12bo2bo12bo2bo9b 2o$26bo228bo18b2o18bobobo25bobobo43b2o2b2o11bobobob2o$26b2o228bo41bo 29bo43bo15b2o3bo$23bo2b2o227b2o37bo2bobo24bo2bobo60bo$21b2o3bo229bo36b 2o28b2o$23bo232b2o36bo29bo$253bo2b2o$251b2o3bo$253bo14$23bo22bo$21b2o 21b2o244bo$23bo22bo212b4obo24b2o$25b5o18b5o205b4o4bo6bo13bo2bo$o3bo3bo bobo13bo3b2o17bo3b2o175bobobo3bo3bo12b2o7bo2b2ob2o2b2o6bo2b2o4b2o$26bo 10bo11bo203bo2bo3bo3b3o4bo10b2obo9b2o$o3bo3bo3bo13bo5bob2obo11bo5bobo 172bo7bo3bo8b2o3bo3bo3bo2bo2bo11bo2bo2bo4bobo2bo$25b2obobobobo13b2obob obob2obo192bo13bo17bo2bo4bo5bo$obobo3bo3bo14bo22bo9bo169bobobo3bobobo 12b2o3bo5bo19b2o5bobobo2bo4b2o$257b3o6b3o29b3o3bo$4bo3bo3bo16b2o21b2o 180bo7bo24b2o31b2ob2o$28b2o21b2o214bo34b2obo2bo$4bo3bobobo14bo2bo19bo 2bo176bobobo7bo23bobo33b2obo$26b4o19b4o213bobo37b2o$24bo22bo219bo33bo$ 22b2o21b2o252b2o$24bo22bo253bo12$253bo$251b2o$253bo$255bobo$254bo2bo 83bo$254bo2bo81b2o$254bobo25bobo56bo$256bo25bo3bo48bo3b2o$35bo218b2o 26bo4b2o12b2o30bo2b2obobo$26b3o4bobo218b2o28bo3bo2b2o7b3o5bobo4b2o14b 3o6b2o$o3bo4bo11bo2b2o4b2obobo194bobobo3bobobo15bob2o23b2o3bo10bo6bo7b o2bo10bobo7b2o$21b2o7bo226b2o43bo5bo2b3o5bo10bob2o9bo$o3bo4bo11bo3bo6b 3o195bo7bo42b4o18b2o5bo5bo2bo9bo4bo8bo$26b2o4bo2bo221b2obo18b2obo2bo 16b3o10b2o11b2o11bo$obobo4bo21b2o2bo194bobobo3bobobo14b2obo18b4o2bo13b o2b2o4b2o29b2o$28b3o4bo223bo8bo2b2o10bo15b2o4b2o20bo4b2o7bo$4bo4bo25bo 198bo7bo13bo2b2o7b2o2bo26bo3b2obo2bo21bo$34b2o221b3o8bo3b3o2b3o23b3o 22b3o$4bo4bo22bo2b2o193bobobo3bobobo29b2obo2b2o23b2ob2obobo18bo$30b2o 224bo16bo33bo3bo19bo$32bo223b2o16b2o31bo22b2o$255bo2b2o15bo3bo51bo$ 257bobo16bo2bo51b2o$253b2o3bo18bobo48bo2b2o$254b3o69b2o3bo$255b2o71bo$ 258bo$256bobo$257bo8$252bobo$252bo3bo19bo$252bo2b2o17bo2b2o$254bobo15b 3o12bo22bo$49bo23bo182bo14bobo11b2o21b2o$29bo17b2o22b2o182b2obo12bob2o 12bo22bo$28b2o19bo23bo182bobo11bo4bo13b5o18b5o$26bo2bo21b6o18b6o173bo 14b2o19bo3b2o17bo3b2o$o3bo3bobobo8bo2b2o4b2o20bo4b2o17bo4b2o147bobobo 3bobobo10b2o35b2o9bo11b2o$21b2obo9b2o16bo11bo11bo191bo4b2o14bo6bob2obo 10bo6bobo$o3bo7bo8bo2bo2bo4bobo2bo14bo6bob2obo11bo6bobo144bo7bo13b2o2b 2o14bo15bo2b2obobobo12bo2b2obobob2obo$24bo2bo4bo18b2obob2obobo13b2obob 2obob2obo163b3ob2o11b3o17bo22bo11bo$obobo3bobobo12b2o5bobobobo14bo23bo 10bo141bobobo3bobobo12bob2o12bo$39bo214b2o16bo$4bo3bo29b3o14b2o22b2o 153bo3bo3bo11bo16b2ob2o14b3o2b3o15b3o2b3o$54b2o22b2o174bob2o12b2o2bo 15bo2bob3o15bo2bob3o$4bo3bobobo25bo14bo2bo20bo2bo149bobobo3bobobo11bo 3bo11b2o3bo15b3o20b3o$35bo2bo13b4o20b4o174bo14bobo3b2o14bo3bo18bo3bo$ 35b2o2b2o9bo23bo180bo13b2o4b2o19bobo20bobo$35bo12b2o22b2o185bobo8b3obo 13b4o5bo13b4o5bo$50bo23bo181b2o3bo9b2ob3o10b3o2bo17b3o2bo$255bobo3bo7b o18b2o21b2o$255b2obo10bo$251bobo15bobo$251bo$251bobo9$251bobo$251bo$ 251bobo110bo197bobo21bobo$30bo224b2obo98bobob2obo25bobobo18bo24bo24bo 24bo24bo48bo23bo$28bo2b2o222bobo2bo94bo3bobo26bo3bob2obo13bo2b2o20bo2b 2o20bo2b2o20bo2b2o20bo2b2o46bo2bo20bo2bo$26b3o227b2o3bo69bo22bo32bo9bo 11b3o22b3o22b3o22b3o22b3o52bo3bo19bo3bo$25bobo232bo24b2o8bobobo14b2o8b obob2obo21bo3b2o27bo3b2o16bobo22bobo22bobo22bobo22bobo55bobo21bobo$25b ob2o228b2o24b2o12bob2obo9b2o12bobo24bob2o29bob2o18bob2o21bob2o21bob2o 21bob2o21bob2o22bo9bobo17b2o22b2o$o3bo3bobobo11bo4bo200bobobo3bobobo 15bo21bobob2o6bo9bo6bobob2o6bo32bo32bo19bo4bo19bo4bo19bo4bo19bo4bo19bo 4bo20b2o9bo19b3o21b3o$23b2o235bo19bo14b2o12bo14b2o26bo32bo20b2o23b2o 23b2o23b2o23b2o23bo2bo9bo2bo18bo23bo$o3bo7bo217bo11bo17bo19bo4bo4b2ob 2o14bo4bo4b2ob2o27bobo30bobo139bo2b2o4b2o9bo3bo8bo23bo$22bo4b2o230bo 22b2obo3b3o19b2obo3b3o27bo2bobo27bo2bobo18bo4b2o18bo4b2o18bo4b2o18bo4b 2o18bo4b2o14b2obo9b2o7bobo6b2o22b2o$obobo3bobobo13bo203bobobo7bo16bobo 25b3o7bo18b3o7bo20bobo30bobo26bo24bo24bo24bo24bo16bo2bo2bo4bobo2bo3b2o 11bo23bo$23b3o233bo2b3o27b2o3bo23b2o3bo19bo2bo29bo2bo23b3o22b3o22b3o 22b3o22b3o20bo2bo4bo8b3o12b6o18b6o$4bo7bo12bo208bo7bo21bo4b2o22bo2bo 25bo2bo21bo32bo27bo24bo24bo24bo24bo21b2o5bobobobo4bo13bo4b2o17bo4b2o$ 26bo4bo231bob5obo19b3o2b2o22b3o2b2o11bo2b2o5b2o21bo2b2o5b2o26bo12bo11b o24bo24bo24bo34bo17bo11bo11bo$4bo3bobobo12b2ob2obo198bobobo7bo21b2o5bo 18bo2bo2b2o21bo2bo2b2o11b2o2bo5bo22b2o2bo5bo26b2o7bo2b3o10b2o7bo2b2o 11b2o23b2o23b2o33b3o16bo6bob2obo11bo6bobo$24bo3bo238bobob2o18bobo2bo 23bobo2bo12bo3b3o2b2o22bo3b3o2b2o27bo7bo2b2o12bo7bo2b3o11bo24bo24bo51b 2obob2obobo13b2obob2obob2obo$24b4o245bo17bobo3bo22bobo3bo15b2obo3bo25b 2obo3bo26b2ob2o3bo16b2ob2o3bo4bo11b2o23b2o23b2o32bo19bo23bo10bo$21bo3b 2o244b2o24bo28bo16bo4bo27bo4bo24bo2b2obob3o14bo2b2obob3o14bo2b2o3bo16b o2b2o3bo16bo2b2o29bo2bo$21b2o249bo71b2o31b2o25b2o3bo3b4o12b2o3bo3b4o 12b2o3bo3b4o12b2o3bo3b4o12b2o3bo3bobo24b2o2b2o19b2o22b2o$21bo250b2o71b o3bo28bo3bo23bo7bo16bo7bo16bo5bob3o14bo5bob3o14bo8bo3bo20bo23b2o22b2o$ 269bo2b2o72bo2bo29bo2bo79b2o3bo4bo14b2o3bo19b2ob3obo43bo2bo20bo2bo$ 267b2o3bo74bobo30bobo84bo2b3o19bo2b2o15bo6bo42b4o20b4o$269bo197bo2b2o 20bo2b3o12bo6b3o40bo23bo$497bo12b2o6bo39b2o22b2o$510bo49bo23bo6$251bob o$251bo125bo$251bobo122b2o$255b2obo87bo$255bobo2bo83bo2b2o23b2obo$34b 2o220b2o3bo80b3o26b3obobo222bo22bo$33bo226bo10bobo96b2o2b2obo220b2o21b 2o$33b2o222b2o12bo48b3ob3o16b2o26bo4bo223bo22bo$33b2o223bo12bobo42b2ob 3o3b2o11b4o2bo23bobo27bo35bo35bo35bo35bo34bo13bo10b6o17b6o$28b4obo226b o14b2obo34bo2b2ob2o3bo10bob3o3b3o18bo3bo20b3o4bobo26b3o4bobo26b3o4bobo 26b3o4bobo26b3o4bobo5b2obobo14b3o4bobo5b2obob2obo11bo4b2o16bo4b2o$o3bo 3bo3bo12bob3o200bobobo3bobobo17bo14bobo2bo32bo2bo7b3o7b2o7b4o15bo2b2o 17bo2b2o4b2obobo21bo2b2o4b2obobo21bo2b2o4b2obobo21bo2b2o4b2obobo14bo6b o2b2o4b2obobo3bo4bob2obo6bo2b2o4b2obobo3bo4bobo14b2o10bo10b2o$24b2o7b 2o224bo3b2o11b2o3bo31bo3bo28bo13b3o21b2o7bo26b2o7bo26b2o7bo11b2obobo9b 2o7bo11b2obob2obo6b2o7bo7bo10bo6b2o7bo7bo21bo7bob2obo9bo7bobo$o3bo3bo 3bo217bo7bo3bo16bobo18bo33b2o2bo15bob2obo19bobo22bo3bo6b3o22bo3bo6b3o 22bo3bo6b3o5bo4bob2obo6bo3bo6b3o5bo4bobo9bo3bo6b3o3bo3b2o12bo3bo6b3o3b o3b2o15bo2b2ob2obobo11bo2b2ob2obob2obo$24bob2obo229bo3bo13b2o35b2o2bo 15b2o3bo19bob2o26b2o4bo2bo26b2o4bo2bo26b2o4bo2bo3bo10bo11b2o4bo2bo3bo 22b2o4bo2bo3b3o19b2o4bo2bo3b3o18bo22bo12bo$obobo3bobobo11b2o3bo200bobo bo3bobobo20b2o13bo35bo24bo18bo4bo30b2o2bo31b2o2bo31b2o2bo3bo3b2o22b2o 2bo3bo3b2o22b2o2bo30b2o2bo$29bo233b2o15bo29b2ob2o19b2o21b2o32b3o4bo4b 3o21b3o4bo4b3o21b3o4bo4b3o21b3o4bo4b3o21b3o4bo27b3o4bo$4bo7bo11b2o208b o3bo3bo16bo3bo16bo28bo24bo63bo3bo3b2o26bo3bo3b2o26bo35bo35bo34bo25b3o 2b3o15b3o2b3o$24bo3bo230bobo17bo8b2o24bo19b3o19bo4b2o34b2o3bo10bo19b2o 3bo30b2o34b2o34b2o33b2o25bo2bob3o15bo2bob3o$4bo7bo12b2o203bobobo3bobob o16bo3b2o14bobo6b4ob3o12bobobob2obo17b2o3bo19bo34bo2b2o3bo4bob2obo17bo 2b2o3bo4bobo20bo2b2o31bo2b2o31bo2b2o30bo2b2o25b3o20b3o$26bo233bo18bo2b 3o6bobo13b3o7bo23bo15b3o33b2o10b2obobo18b2o10b2obob2obo15b2o34b2o34b2o 33b2o30bo3bo18bo3bo$26b2o232bo23bo3bo4bo8bob2o32b2o19bo35bo35bo17bo17b o35bo35bo34bo34bobo20bobo$23bo2b2o230bo24bob3obobob3o6bo3b2o29bob2o19b o240b4o5bo13b4o5bo$21b2o3bo230b2o25b2o2b4o10bob2o31b2o20b2o239b3o2bo 17b3o2bo$23bo236bo27bo2bo41bobo24bo240b2o21b2o$256b2o3bo71bo26b2o$255b obo2bo72bobo21bo2b2o$255b2obo96b2o3bo$251bobo103bo$251bo$251bobo7$271b o$270bobo$270bobo$83bo22bo163bo$81b2o21b2o$74bo8bo22bo163bobo$37bobobo 25bobob2obo10b5o18b5o$35bo3bob2obo20bo3bobo14bo3b2o17bo3b2o153b3o$o3bo 3bobobo21bo9bo19bo21bo10bo11bo120bobobo3bobobo24bo$33bo3b2o24bo3b2o17b o5bob2obo11bo5bobo148b2obo$o3bo3bo24bob2o26bob2o18b2obobobobo13b2obobo bob2obo109bo7bo3bo27bo$22b2ob2o7bo17b2ob2o7bo22bo22bo9bo149bo$obobo3bo bobo8b3o8bo18b3o8bo167bobobo3bobobo22bobo$22b2obo2bo2bobo18b2obo2bo2bo bo198bob2o$4bo7bo18bobo27bobo20b3o20b3o124bo7bo17b2ob2o$26b2obo26b2obo 27bobo20bobo147b2ob2o$4bo3bobobo15b2o28b2o23bo2bobo17bo2bobo118bobobo 3bobobo20bo$28b3o27b3o21bo3bo18bo3bo141bob2o6bobo$30bo2b2o25bo2b2o18bo 22bo144bo3b2o$32bo29bo21b2o21b2o142bob2o6bobo$85b3o20b3o145b3ob2obo$ 85b3o20b3o146bob2o2$258bobo$260b2obo$263bo10$300bo$298bo2b2o$27b3o23bo 242b3o$25b2o3bo21bobo236b4o2bo$23bo27b2o238bo5bo$21b2o3bo3bo22bo213b2o 22b2o4bo$23bo2bo3bo22bo213b4o20bo3b2o$o3bo3bobobo12b2o203bobobo3bobobo 17bo5bo3bo22bo2bo$26bo3bo21b2o206b2ob2o2bo23b3o$o3bo3bo17bo3bo19b2o 178bo7bo3bo13bobo2bo2bo3bobo20b2obo$26b3o19b2o2bo200bo2bo7b3o3bo18b2o$ obobo3bobobo35b3o179bobobo3bo3bo8b2o3b2o14bo$26b3o8bo2b2o9b2o200bo2b2o 10bo2bo4b3o9bo2b3obo$4bo3bo3bo13bo3bo6b2o2bo188bo3bo3bo3bo12bo2bo7b2o 3bo2bob3o9bo2bobo$26bo3bo6bo3b3o2b3o207b2o6bo8b2o13bobo3bo$4bo3bobobo 12b2o14b2obo2b2o181bobobo3bobobo21bo11bo13bo$23bo2bo3bo11bo221bobo10bo bo8b2o$21b2o3bo3bo12b2o233bo9bo2bobo$23bo20bo3bo240b3o$25b2o3bo14bo2bo 242bo$27b3o16bobo242b2o$288bo2b2o$286b2o3bo$288bo11$404b2o21b2o$254bob o105bobo29bo8b3o3bo16b3o3bo$85bo23bo142b2o3b2o103bo3bo25b2o10b2obo19b 2obo$83b2o22b2o143bobo107bo4b2o25bo12bo4bo17bo4bo14bo28bo17bo$85bo23bo 144bo29b2ob2o33b2ob2o37bo3bo2b2o15bo3b2o19bo22bo11b2o27b2o18b2o$87b6o 18b6o134bo31bobo35bobo41b2o3bo15bo2b2obobo12b5obo4bo11b5obo13bo17bo10b o17bo$22b2o29b2o33bo4b2o17bo4b2o132b2o3bo26b2o3b2ob3o27b2o3b2ob3o52b3o 6b2o17b3obobo16b3obobo10b5o11b2o11b5o13bo$o3bo3bobobo8b3o20bo7b3o33bo 11bo11bo117bobobo4bo19b2o24b2o3bo3b2o27b2o3bo3b2o27b4o18bobo7b2o11b3o 7bobo10b3o7bobo11bo3b2o10bo12bo3b2o11bo$22bo20bo9bo15b2o17bo6bob2obo 11bo6bobo132b2o3bo41bo57b2obo2bo17bob2o9bo10bo22bo10bo11bo10bob2obo12b o14b3o$o3bo7bo10b2ob2o15b2o9b2ob2o10b3ob2obo10b2obob2obobo13b2obob2obo b2obo105bo8bo15bobo4b2o17b3o7bo4bob2obo17b3o7bo4bobo22b4o2bo16bo4bo8bo 56bo5bob2obob2obo12bo5bobo5bo2bo$28bo5bo6bo17bo5bob3o6bo12bo23bo10bo 130b7obo17b3o9b2obobo20b3o9b2obob2obo23bo17b2o11bo13b3o20b3o18b2obobob obo5bo2bo10b2obobobob2obob2obo$obobo7bo10b2o7bobob3o6bo8b2o7bobo6bo 157bobobo4bo14bo15bo2b2o33bo2b2o26bo52b2o13bo2b2o18bo2b2o19bo13b3o12bo 9bob2obo$24bo6bobo4b3ob2obo9bo6bobo9b2o179b7obo6b2o2bo33b2o2bo44b3o20b o4b2o7bo15bo22bo36bo27bo$4bo7bo12bo2bo9b2o16bo2bo14bo11b3o21b3o117bo3b o4bo15bobo4b2o6bo3b3o2b3o26bo3b3o2b3o37b3o24bo23b2obo19b2obo21b2o12bo 14b2o10b2o$26bobobob2o23bobobob2o10bo13bobo21bobo138b2o3bo14b2obo2b2o 30b2obo2b2o26bo2b2o30b3o24b2obo19b2obo20b2o11bo15b2o11bo$4bo7bo12b2o3b o25b2o3bo23bo2bobo18bo2bobo115bobobo4bo19b2o14bo37bo32b2o2bo32bo70bo2b o10b2o13bo2bo$27bo30bo25bo3bo19bo3bo138b2o3bo19b2o36b2o30bo3b3o2b3o26b o4bo18b2o21b2o20b4o11bo13b4o$85bo23bo141bo25bo3bo33bo3bo30b2obo2b2o25b 2ob2obo19bob2o19bob2o15bo28bo$86b2o22b2o142bo23bo2bo34bo2bo31bo30bo3bo 18b2o21b2o19b2o27b2o$87b3o21b3o138bobo24bobo35bobo32b2o28b4o19b2o21b2o 21bo28bo$87b3o21b3o138b2o3b2o94bo3bo21bo3b2o22bo22bo$254bobo97bo2bo21b 2o25bobo20bobo$355bobo21bo26bob2obo17bob2obo$407bo3bo18bo3bo9$717bo53b obo21bobo$26bo236bo451b2o54bo23bo$26b2o233b2o227b2o31b2o192bo22bo30bo 2bo20bo2bo$26bo236bo225bo32bo5bo178bo11b5o14b2o33bo3bo19bo3bo$28bo30bo bo203bobo13bo132bo3b2o27bo3b2o35b2ob3o27b2ob3o2b2o175bobo11bo3b2o14bo 34bobo21bobo343b2o$28bo30bo3bo200bo2bo6bo3b4o7bo108bo13bo2b2obobo24bo 2b2obobo31b7obo2b2o20b7obo105b2o34b2o35bo14bo10bo10b5o26b2o22b2o17bo 37bo37bo37bo37bo37bo37bo22bo14bo22bo39b2o8bo$27b2o18bo11bo2b2o5bo194bo 2bo6b2obob2o7b2o4b2o47b2ob2o10bobo20b2ob2o10bobo11b3o6bo3bo19b3o6bo3bo 5bo22bo3bo5bo22bo3bo108bobo4bo28bobo32b2o16bo5bob2obo11bo3b2o24b3o21b 3o14b2o36b2o36b2o36b2o36b2o36b2o36b2o21b2o6bo6b2o21b2o40bo7b2o$45b2o 14bobo4b2o194bobo7bo3bo7bo3bob4o46bobo9b3obobo19bobo9b3obobo10bobo7b7o bo14bobo7b7obo2b2o15bo3bobo26bo3bobo35bo35bo36bo2bob2obobo25bo2bob2obo bo25bo2bob3o11b2obobobobo14bo10bo20bo23bo16bo37bo37bo22bo14bo22bo14bo 37bo37bo18bo4bob2obo8bo18bo4bobo11bo19bobo2bo9bo$29bo17bo15bo202bo13b 3o2bo6bo12b2o6b2o27b2o3b2ob4obo4bo19b2o3b2ob4obo15bob2o9b2ob3o2b2o10bo b2o9b2ob3o17bo2b2ob2o25bo2b2ob2o32bo3bo31bo3bo39b2o3bobo28b2o3bobo25bo 4b3o13bo21bo5bob2obo13bo23bo25b5o33b5o33b5o14b2o6bo10b5o14b2o17b5o33b 5o33b5o11b3o3bobo13b5o11b3o3bob2obo6b2o19bo4bo12b5o$o3bo3bobobo15bobo 9bo8bobo10b2obobo162bobobo3bobobo43bobo3bo11b2o3b2obo31b2o3bo5bo26b2o 3bo5bo14bo4bo9bo5bo11bo4bo9bo19b3o30b3o30b3o4bobo2bo23b3o4bobo2bo36b2o bo32b2obo7bo24b2o41b2obobobobo14b2o22b2o27bo3b2o32bo3b2o32bo3b2o10bo4b ob2obo11bo3b2o10bo4bobo14bo3b2o32bo3b2o32bo3b2o8bo4bo18bo3b2o8bo4bo6bo 8bo18bo2b3obo11bo3b2o$27b4o9b2o6bo2bo10bo2bobobo193bobo13bo3b2o19b3o2b 2obobobo4bo32bo37bo14b2o15b2o14b2o15b2o16bobo30bobo26bo2b2o4b2obobo3b 2obo14bo2b2o4b2obobo3b2obo7bo20bo2bo32bo2bo36b2o22b2o19bo23bo23bo26bo 37bo37bo14b3o3bobo14bo14b3o3bob2obo11bo10bob3o22bo10bob3o22bo10bob2obo 21bo10bob2obo20b5o11bobo3b2o12bo$o3bo3bo3bo10b2o2bo12bo7bo2bo10b3ob2ob o160bo11bo16b3ob2obo12bo2b3o24bo6b2ob2obo17b3o7bo27b3o7bo86bob2o29bob 2o25b2o7bo12b2o3bobo6b2o7bo12b2o3bobo11b3o4bobo3bo22b3o4bobo3bo31bo2bo 23b2o46b6o18b6o19bo5bobo29bo5bobo29bo5bobo5bo4bo18bo5bobo5bo4bo6bo11bo 5bob2obob2obo21bo5bob2obob2obo21bo5bob2obob3o22bo5bob2obob3o22bo3b2o9b o19bo5bobo$23b2obobo13bo5bobo12bo4bo191bob2obo14b3obo20bob2obo3bo3bobo bo17b3o35b3o25bo4b2o26bo4b2o28bo4bo27bo4bo24bo3bo6b3o5bo2bob2obobo6bo 3bo6b3o5bo2bob2obobo6bo2b2o4b2obobo3bo17bo2b2o4b2obobo3bo22b3o4bobo2bo 22bo2bo21b2o23bo4b2o17bo4b2o16b2obobobob2obob3o21b2obobobob2obob3o21b 2obobobob2obob2obo20b2obobobob2obob2obo20b2obobobobo5bo4bo17b2obobobob o5bo4bo6bo10b2obobobobo28b2obobobobo29bo10bobobo18b2obobobob2obo$obobo 3bobobo10b2o2bo14bo7bo179bobobo3bobobo14bo2bobo45bo3bo2b2obobo8bo2b2o 33bo2b2o38bo32bo29b2o31b2o34b2o4bo2bo7bobo4bo11b2o4bo2bo7bobo11b2o7bo 26b2o7bo26bo2b2o4b2obobo24b4o21b2o24bo11bo11bo24bo9bob2obo22bo9bob2obo 22bo9bob3o23bo9bob3o23bo13b3o3bobo15bo13b3o3bob2obo12bo37bo36bo5bob2ob o24bo9bobobo$22b2o17b2o212bo2bo2b2o40b2o2bob2o5bo12b2o2bo33b2o2bo35b3o 30b3o104b2o2bo8b2o21b2o2bo8b2o11bo3bo6b3o22bo3bo6b3o22b2o7bo27bo25bo2b o23bo6bob2obo11bo6bobo28bo4bo32bo4bo6bo103bo4bob2obo27bo4bobo89b2obobo bobo41bo$4bo3bo3bo8bo17bo2bo2bobo12b3o167bo3bo3bo15bo2bo2bo16b3o24bo9b obo4b2o6bo3b3o2b3o26bo3b3o2b3o30bo32bo29bo4b2o26bo4b2o32b3o4bo28b3o4bo 26b2o4bo2bo26b2o4bo2bo21bo3bo6b3o21b2o7b2o16b4o23b2obob2obobo13b2obob 2obob2obo14b2o10b3o3bobo17b2o10b3o3bob2obo14b2o36b2o36b2o13b2o6bo14b2o 13b2o21b2o36b2o34bo36b2o10bobo3b2o$21bo5bo9b2o6bob2o14bobo188bo3bob3o 17bobo21bo7bo2b2o5bo10b2obo2b2o30b2obo2b2o31bo32bo32bo32bo41bo35bo31b 2o2bo31b2o2bo26b2o4bo2bo22bo5bo16bo30bo23bo10bo13b2o12bo4bob2obo13b2o 12bo4bobo16b2o36b2o36b2o16bo19b2o16bo19b2o36b2o71b2o12bo2b3obo$4bo3bob obo9bob3o12bo5b4o10bo2bobo165bobobo3bobobo12b3obo2bo13bo2bobo20bo9bo3b o17bo37bo36b2o31b2o29b3o30b3o41b2o34b2o28b3o4bo28b3o4bo31b2o2bo29b2o 12b2o7b2o70bo2bo13b2o6bo12bo2bo13b2o19bo2bo34bo2bo34bo2bo34bo2bo34bo2b o34bo2bo36b2o31bo2bo11bo4bo$27bo13b4o13bo3bo192bobo17bo3bo22b2o8bobo 20b2o36b2o35bo32bo31bo32bo39bo2b2o31bo2b2o34bo35bo28b3o4bo45bo5bo71b4o 16bo17b4o16bo17b4o34b4o34b4o34b4o34b4o34b4o36b2o31b4o13bobo2bo$24b4o 18bo3bo8bo194b2o20bo25bo33bo3bo33bo3bo31b2o31b2o31bo32bo36b2o34b2o38b 2o34b2o35bo31bo20b2o19b3o21b3o21bo37bo37bo37bo37bo37bo37bo37bo40bo2bo 28bo23bo$24bo2bo18b5o9b2o215b2o58bo2bo34bo2bo28bo2b2o28bo2b2o30b2o31b 2o38bo35bo35bo2b2o31bo2b2o33b2o32b2o25b2o15bobo21bobo16b2o36b2o36b2o 36b2o36b2o36b2o36b2o36b2o40b4o27b2o24b2o$27bo19b2o12b3o187b2o3bo21b3o 57bobo35bobo26b2o3bo27b2o3bo32bo32bo108b2o34b2o36bo2b2o28b2ob2o20bo5bo 2bo8bo2bobo18bo2bobo19bo37bo37bo37bo37bo37bo37bo37bo37bo34bo23b2o$26bo 34b3o187bo26b3o126bo32bo35b2o31b2o109bo35bo33b2o34b2ob2o17bo2b3o5bo7bo 3bo19bo3bo323b2o$26bobo225bo218bo2b2o28bo2b2o181bo33bobo19bo7bo2bo8bo 23bo328bo$26bobo223bobo216b2o3bo27b2o3bo214bo23bobo4b2o12b2o22b2o$27bo 224b2o3b2o214bo32bo217b2o44b3o21b3o$254bobo467bo45b3o21b3o7$298bo$259b o37bobo$257bo2b2o35bobo$255b3o39bo138b2o21b2o$254bobo133bo44b3o3b2o15b 3o3b2o$254bob2o39bobo23bo36bo26b4o27b2o5b2obo7b2obo19b2obo$253bo4bo63b obo34bobo25b3o27bo6bo2b2o10bo5bo16bo5bo14bo29bo18bo$252b2o41b3o24bobo 34bobo22b2o2bo28b2o5bo21bo22bo11b2o28b2o19b2o$294bo27bo36bo23bo3b2o28b 2o6bo13b6obo4bo10b6obo13bo18bo10bo18bo$251bo4b2o35b2obo89b3o23b4obo3b 2ob2o19b3obobo16b3obobo10b6o11b2o11b6o13bo$o3bo3bobobo217bobobo3bobobo 12bo41bo24bobo34bobo20bo2bo23bob3o6b2o3bo12b3o8bobo9b3o8bobo11bo4b2o 10bo12bo4b2o11bo$252b3o42bo85b2o23b2o7b2o3b2o15bo22bo11bo11bo11bob2obo 12bo15b3o$o3bo3bo3bo217bo11bo11bo37bo27b3o3b3o28b3o3b3o17bobobo36b2o 60bo6bob2obob2obo12bo6bobo5bo2bo$256bo34b2obo24bo5bo3b2o25bo5bo3b2o15b o3bo7b2o11bob2obo26b3o20b3o19b2obob2obobo5bo2bo10b2obob2obob2obob2obo$ obobo3bobobo217bobobo3bobobo13bo61b2obo3bo29b2obo3bo10bo9bo10bo13b2o3b o25bo2b2o18bo2b2o20bo14b3o12bo10bob2obo$255bo52bob2o10bo3bo4bobo11bob 2o10bo3bo4bob2obo10bo8b2o18bo28bo22bo38bo28bo$4bo7bo217bo3bo7bo12bobo 32bobo13b2o3bo10bo5b2obob2obo6b2o3bo10bo5b2obobo17bobo2b2o3bo9b2o30b2o bo19b2obo22b2o13bo14b2o11b2o$255bo2b3o26bob2o17bobo6bobo16bo8bobo6bobo 28b2o3bo7bo9bo3bo27b2obo19b2obo21b2o12bo15b2o12bo$4bo3bobobo217bobobo 3bobobo17bo4b2o18b2ob2o22b3ob2o31b3ob2o29bobo3bo3b2o13b2o76bo2bo11b2o 13bo2bo$259bob5obo17b2ob2o22b2ob2o32b2ob2o30b2obo6bo15bo29b2o21b2o21b 4o12bo13b4o$260b2o5bo20bo25bobo34bobo26bobo15bo11b2o29bob2o19bob2o16bo 29bo$263bobob2o7bob2o6bobo26b3o34b3o25bo15b2o9bo2b2o25b2o21b2o20b2o28b 2o$269bo6bo3b2o33b4o33b4o24bobo11bo10b2o3bo26b2o21b2o22bo29bo$267b2o7b ob2o6bobo29bo36bo38bo12bo31bo22bo$268bo12b3ob2obo105bobo41bobo20bobo$ 268b2o12bob2o152bob2obo17bob2obo$265bo2b2o169bo3bo18bo3bo$263b2o3bo14b obo$265bo19b2obo$288bo3$416bo$414bo2b2o$412b3o478bo24bo$411bobo397bo 79b2o23b2o$411bob2o395b2o81bo24bo$59bo350bo4bo415b2o23b2o23b2o12b5o20b 5o$32b2o24bobo294bo29bo23b2o395b2obo20bo24bo24bo15bo3b2o19bo3b2o$31bo 26bobo293bobo26bo2b2o417b3obobo18b2o23b2o23b2o14bo10bo13bo357b2o$31b2o 25bo292bobo6bo20b3o24bo4b2o58bo330b2o2b2obo18b2o23b2o23b2o14bo5bob2obo 13bo5bobo11bo38bo38bo38bo38bo38bo38bo23bo14bo23bo40b2o8bo$31b2o315bo2b o4bob2o20bobo29bo51b3o4bobo331bo4bo14b4obo19b4obo19b4obo14b2obobobobo 15b2obobobob2obo6b2o37b2o37b2o37b2o37b2o37b2o37b2o22b2o6bo6b2o22b2o41b o7b2o$26b4obo26bobo202bobo18bob2o7bo29bobo18b2o3b2o27bob2o25b3o37bo9bo 2b2o4b2obobo33bo36bo36bo36bo36bo36bo36bo36bo35bobo17bob3o20bob3o20bob 3o20bo24bo9bo8bo38bo38bo23bo14bo23bo14bo38bo38bo19bo4bob2obo8bo19bo4bo bo11bo20bobo2bo9bo$23bob3o238bo15b2o3bo4b2o3bo26bo2bo20bo2b2o3b2o2bo 18bo4bo26bo35b2o10b2o7bo29b3o4bobo27b3o4bobo27b3o4bobo27b3o4bobo27b3o 4bobo27b3o4bobo27b3o4bobo9bo17b3o4bobo9bo21bo3bo18b2o7b2o14b2o7b2o14b 2o7b2o61b6o33b6o33b6o14b2o6bo10b6o14b2o17b6o33b6o33b6o11b3o3bobo13b6o 11b3o3bob2obo6b2o20bo4bo12b6o$obobo3bobobo9b2o7b2o23b3o171bobobo3bo3bo 18b2obob5o13bobo3b3o2bobo6bo20bo12b2o10bo2bo3bo2b4o14b2o33bo25bo9bo9bo 3bo6b3o20bo2b2o4b2obobo22bo2b2o4b2obobo22bo2b2o4b2obobo22bo2b2o4b2obob o22bo2b2o4b2obobo9bo12bo2b2o4b2obobo9bo12bo2b2o4b2obobo9b2o4bo6bo2b2o 4b2obobo9b2o18bo2b2o143bo4b2o32bo4b2o32bo4b2o10bo4bob2obo11bo4b2o10bo 4bobo14bo4b2o32bo4b2o32bo4b2o8bo4bo18bo4b2o8bo4bo6bo8bo19bo2b3obo11bo 4b2o$55bo204b2o4b3o19b3o2bo3bo6b2o20b2o10b2o11b2o3b2o5bo49bo16b3o4bobo 11bo12b2o4bo2bo19b2o7bo27b2o7bo27b2o7bo27b2o7bo27b2o7bo14b2o4bo6b2o7bo 14b2o11b2o7bo10b2obobo2b3o6b2o7bo10b2obobo2b2o12b3o24bob2obo19bob2obo 19bob2obo17b3o22b3o22bo38bo38bo15b3o3bobo14bo15b3o3bob2obo11bo11bob3o 22bo11bob3o22bo11bob2obo21bo11bob2obo20b6o11bobo3b2o12bo$o7bo3bo9bob2o bo26b2obo172bo7bo3bo10bo34b3o13bo8bob2o9bobo9bo17bo6bo13bo4b2o28bo3b2o 7bo2b2o4b2obobo10bo18b2o2bo19bo3bo6b3o23bo3bo6b3o23bo3bo6b3o23bo3bo6b 3o23bo3bo6b3o6b2obobo2b3o6bo3bo6b3o6b2obobo2b2o7bo3bo6b3o6b3o2bo2b2o7b o3bo6b3o6b3o2bo2b3o10bobo25b2o3bo19b2o3bo19b2o3bo20bobo22bobo19bo6bobo 29bo6bobo29bo6bobo5bo4bo18bo6bobo5bo4bo6bo11bo6bob2obob2obo21bo6bob2ob ob2obo21bo6bob2obob3o22bo6bob2obob3o22bo4b2o9bo19bo6bobo$22b2o3bo30bo 192b2o3b3o2bo9bo34bo6bo3b2o5bobo8bo2bo17b4o2bobo3bo12bo30bobo10b2o7bo 8b3o4bobo13b3o4bo4bo3bo15b2o4bo2bo27b2o4bo2bo27b2o4bo2bo4bo22b2o4bo2bo 4bo22b2o4bo2bo5b3o2bo2b2o12b2o4bo2bo5b3o2bo2b3o11b2o4bo2bo3b2o2bo19b2o 4bo2bo3b2o2bo7bo10bob2o29bo24bo24bo16bo2bobo19bo2bobo19b2obob2obob2obo b3o21b2obob2obob2obob3o21b2obob2obob2obob2obo20b2obob2obob2obob2obo20b 2obob2obobo5bo4bo17b2obob2obobo5bo4bo6bo10b2obob2obobo28b2obob2obobo 29bo11bobobo18b2obob2obob2obo$obobo3bo3bo14bo30bo171bobobo3bobobo10bo 2bo4bo7b2o2bo17bo9bo4bo6bob2o6bo2b4o2bo4bo25bob2obo9b3o31bo3bo8bo3bo6b 3o11b2o21bo3bobobobo19b2o2bo4bo27b2o2bo4bo27b2o2bo3bobo26b2o2bo3bobo 26b2o2bo3b2o2bo24b2o2bo3b2o2bo7bo16b2o2bo32b2o2bo25bo4bo23b2o23b2o23b 2o19bo3bo20bo3bo23bo10bob2obo22bo10bob2obo22bo10bob3o23bo10bob3o23bo 14b3o3bobo15bo14b3o3bob2obo12bo38bo37bo6bob2obo24bo10bobobo$22b2o29bo 201b3o10b3o3bo11b2o6b3o3b4ob2o11b3obo5b2o2b2ob3obo23bobobo12bo35b2o12b 2o4bo2bo2bo2bobo3bo20b2o2bo2bobo3bo14b3o4bo3bobo23b3o4bo3bobo23b3o4bo 29b3o4bo29b3o4bo29b3o4bo29b3o4bo3bobo23b3o4bo3bobo18b2o28bo3bo20bo3bo 20bo3bo17bo24bo40bo4bo33bo4bo6bo106bo4bob2obo28bo4bobo91b2obob2obobo 42bo$4bo3bo3bo9bo29b2obo174bo3bo7bo16bo11bo15bobobo2bo4bo6bo12bob2o5b 3o6b2o43bo33b2o17b2o2bo3bobobobo20bo2b2o9b2o21bo36bo36bo3b2o2bo28bo3b 2o2bo7bo20bo3bobo30bo3bobo30bo4bo31bo4bo50b2o23b2o23b2o20b2o23b2o26b2o 11b3o3bobo17b2o11b3o3bob2obo14b2o37b2o37b2o14b2o6bo14b2o14b2o21b2o37b 2o35bo37b2o11bobo3b2o$22b3o17bob2o212b2obo3bobo3bo3bo11bo4bo3bo2bo5bo 62bo13bo29bo3bo15b3o4bo4bo3bo19b2o7b3o4bobo19b2o3b2o2bo27b2o3b2o2bo7bo 19b2o5b3o2bo2b2o20b2o5b3o2bo2b3o19b2o4bo30b2o4bo30b2o35b2o23bo4b2o26bo 24bo24bo21b3o22b3o23b2o13bo4bob2obo13b2o13bo4bobo16b2o37b2o37b2o17bo 19b2o17bo19b2o37b2o73b2o13bo2b3obo$obobo3bobobo10b2o3bo11b2o3bo184bobo bo7bo16b4o3b2o3bo3bo11bo3bo6b2obo2bo15bobo7bo35b3o12bo8b2o20bobo24bo 30bo13bo19bo2b2o4b3o2bo2b2o18bo2b2o4b3o2bo2b3o17bo2b2o4b2obobo2b3o17bo 2b2o4b2obobo2b2o18bo2b2o32bo2b2o32bo2b2o32bo2b2o26bo28b2o23b2o23b2o20b 3o22b3o22bo2bo14b2o6bo12bo2bo14b2o19bo2bo35bo2bo35bo2bo35bo2bo35bo2bo 35bo2bo37b2o32bo2bo12bo4bo$29bo12bobo6bobo206b4ob2o6bobo12bo9bo23b2obo b3o36b2o13bobo6b4ob3o14bo3b2o20b2o45bo16b2o9b2obobo2b3o15b2o9b2obobo2b 2o16b2o13b2o4bo15b2o13b2o20b2o35b2o35b2o35b2o28b3o26bo2b2o3bo16bo2b2o 3bo16bo2b2o69b4o17bo17b4o17bo17b4o35b4o35b4o35b4o35b4o35b4o37b2o32b4o 14bobo2bo$26b2o18b3ob2o215b2o20bo35bo42bobo10bo2b3o6bobo17bo22bo2b2o 42bo20bo12b2o4bo17bo12b2o22bo12bo23bo12bo23bo36bo36bo36bo29bo24b2o3bo 3b4o12b2o3bo3b4o12b2o3bo3bobo62bo38bo38bo38bo38bo38bo38bo38bo41bo2bo 29bo24bo$25bob2o17b2ob2o315bo3bo15bo3bo4bo17bo20b2o45b2o34bo36bo239bo 4bo20bo5bob3o14bo5bob3o14bo8bo3bo8b3o22b3o20b2o37b2o37b2o37b2o37b2o37b 2o37b2o37b2o41b4o28b2o25b2o$25b2o21bobo313bo2bo17bob3obobob3o13bo24bo 46bo309b2ob2obo26b2o3bo4bo14b2o3bo19b2ob3obo11bobo22bobo19bo38bo38bo 38bo38bo38bo38bo38bo38bo35bo24b2o$21bobo25b3o312bo21b2o2b4o16b2o380bo 3bo34bo2b3o19bo2b2o15bo6bo7bo2bobo19bo2bobo330b2o$21bo27b4o311bobo23bo 2bo19bo378b4o35bo2b2o20bo2b3o12bo6b3o6bo3bo20bo3bo334bo$21bobo28bo356b 2o3bo374bo3b2o66bo12b2o6bo8bo24bo$408bobo2bo375b2o83bo17b2o23b2o$408b 2obo377bo103b3o22b3o$404bobo486b3o22b3o$404bo$404bobo4$280b2o$279b3o 18b3o239b2o22b2o$24bo3bo227bo23bo17b2o3bo139bo52bo22bo21b3o3bo17b3o3bo $23bob2obo225b2o25b2ob2o10bo146b2o49b2o21b2o23b2obo20b2obo$23bobo230bo 29bo7b2o3bo3bo139bo52bo22bo25bo4bo18bo4bo19bo6b2o16bo6b2o$24bo233b4o 19b2o13bo2bo3bo15bo31bo31bo31bo29bo28bo23b5o18b5o25bo23bo18b2ob2o2b3ob o13b2ob2o2b3obo$22b2o235bo2bo18b2o15b2o17bo2b2o27bo2b2o27bo2b2o27bo2b 2o27bo26bo2b2o22bo3b2o17bo3b2o17b5obo4bo12b5obo18bo4bo3bobo13bo4bo3bob o$22b2o236b2o22bo14bo3bo11b3o29b3o29b3o29b3o30b2o24b3o26bo10bo11bo27b 3obobo17b3obobo16b2o2b3obo16b2o2b3obo$26bob2o231b2o14bo3b2o16bo3bo10bo bo29bobo29bobo29bobo56bobo27bo5bob2obo11bo5bobo13b3o7bobo11b3o7bobo8bo 11b2o11bo11b2o$25b2o9bobo25bobo189bobo18b2o2bo17b3o12bob2o28bob2o28bob 2o28bob2o32bo22bob2o13b2o10b2obobobobo13b2obobobob2obo11bo23bo10bo6b2o 23b2o$obobo4bo26bo27bo165bobobo3bobobo13bobo18bo5bo29bo4bo26bo4bo26bo 4bo26bo4bo30bobo20bo4bo12b2o12bo22bo9bo55bo24bo$25b2obo7bobo2bo2bo19bo bo2bo2bo182bo2bo20b2o18b3o10b2o30b2o30b2o30b2o34b4o19b2o17bo59b3o21b3o 18b6o19b6o$o8bo15b2obo10bo27bo162bo7bo17b2o16bo4bo3bo15bo3bo89bo31bo 14b2o2bo36bobo2bo58bo2b2o19bo2b2o18bo4b2o18bo4b2o$27bo12bob2obo22bob2o bo187bo12b2o2b2o19bo3bo7bo4b2o25bo4b2o25bo4b2o9b2o6bo7bo4b2o9b2o15b2ob obo20bo4b2o7bo4bo11b3o20b3o25bo23bo19bo11bo12bo$obobo4bo14bo2b2o12b3ob o23b3obo156bobobo3bobobo13b3o2b2o11bo4bob2o15b2o15bo31bo31bo9bo4bob2ob o11bo9bo4bobo11b2o2bo25bo9bo2b3obo12bobo20bobo20b2obo20b2obo18bo6bob2o bo12bo6bobo$25b3o12bo4bo2bob2o16bo4bo2bob2o176bob5o13b2o18bo2bo3bo8b3o 29b3o29b3o9b3o3bobo11b3o9b3o3bob2obo7b2o26b3o9bobo3b2o9bo2bobo17bo2bob o21b2obo20b2obo17b2obob2obobo14b2obob2obob2obo$4bo4bo27bo3b2o3bob4o13b o3b2o3bob4o150bo3bo7bo13bobo17b2o16b2o3bo3bo10bo31bo31bo8bo4bo17bo8bo 4bo6bo6bo30bo9bo15bo3bo18bo3bo70bo24bo10bo$24bo12b2o2bo2bob2o4bo12b2o 2bo2bob2o4bo4bo170bo2bo15b2ob2o16bo18bo4bob3o22bo4bob3o22bo4bob2obo21b o4bob2obo16bo5bo25bo4bobobo16bo22bo26b2o22b2o$obobo4bo14b2o11bo8b2o4bo 2b2o8bo8b2o4bo2b3o144bobobo3bobobo13bo21b3o17b2o3bo10b2ob2obob2obo20b 2ob2obob2obo20b2ob2obob3o21b2ob2obob3o18bob3o6b2obobo13b2ob2obo21b2o 21b2o25bob2o20bob2o20b2o23b2o$23bo2b2o14b2o3b2o3bo2b3o12b2o3b2o3bo2b2o 173b2o17bo2bo19b3o10bo3bo5bo4bo16bo3bo5bo4bo6bo9bo3bo27bo3bo30bo3bo4bo b2obo9bo3bo25b3o20b3o19b2o22b2o25b2o23b2o$25bobo29bo255b4o7b3o3bobo12b 4o7b3o3bob2obo9b4o28b4o28b4o2bo10bo9b4o26b3o2b2o16b3o2b2o15b2o22b2o24b o2bo21bo2bo$21b2o3bo230b2o16b2o18b3o12bo3b2o9bo4bob2obo6bo3b2o9bo4bobo 9bo3b2o26bo3b2o29bo2bo2bo3b2o12bo3b2o32b3ob2obo15b3ob2obo11bo23bo22b4o 21b4o$22b3o231bobo16bo2bo19bobo9b2o15b2o6bo6b2o15b2o13b2o30b2o36bo3b3o 14b2o35b2o6bo14b2o6bo9bobo21bobo20bo24bo$23b2o230b2o3bo3bo11b3o15bo2bo bo10bo18bo12bo18bo12bo31bo36bo21bo40bo22bo13bo2bo20bo2bo17b2o23b2o$26b o224bo3b2obo3bo2b2o26bo3bo145bobo55bo6b2o14bo6b2o10bo2bo20bo2bo19bo24b o$24bobo224b2o2bo4b3o13bo17bo148bobo53b2o7bo13b2o7bo12bobo21bobo$25bo 225bo2b2o17bo2bo18b2o147bo56bo7bo14bo7bo9bo23bo$273b2o2b2o17b3o241b2o 22b2o$273bo22b3o243bo23bo6$814bo25bo$812b2o24b2o$814bo25bo$745bo70b6o 20b6o$573bobo131bobobo26bobob2obo71bo4b2o19bo4b2o$36bo311bo223bo2bo70b o58bo3bob2obo21bo3bobo12bo28bo17bo14bo11bo13bo$34bo2b2o307b2o223bo3bo 8bo61b2o34bo21bo9bo20bo17b2o27b2o18b2o13bo6bob2obo13bo6bobo$32b3o312bo bo4b2obo51bobo36bobo119b2o10b2o62bo35b2o19bo3b2o25bo3b2o15bo17bo10bo 17bo13b2obob2obobo15b2obob2obob2obo$287bo31bo27b3o3bob3o22b2o27bo38bo 44bo32bo20bo19bobob2o11bo63bo34bo19bob2o27bob2o19b5o11b2o11b5o13bo13bo 25bo10bo$33b2o226b2obo22b2ob2o27b2ob2o24bo4b2o25b4o25bobo36bobo21bo11b 3o4bobo23b3o4bobo18b2o19bo19b5o57bo29bob2obo8b2ob2o7bo18b2ob2o7bo22bo 3b2o10bo12bo3b2o11bo$obobo3bobobo15b4o2bo195bobobo3bobobo14b3obob3o17b obo2bo26bobo2bo22bobo2bo4b2o18bo5bo3bo29b2obo4bo30b2obo4bo9bobo6bo2b2o 4b2obobo8b2obo6bo2b2o4b2obobo20bo18bo2b2obo14bo3b2o53b3o22bobob2obob2o bo7b3o8bo19b3o8bo24bo10bob2obo12bo14b3o$25bob3o3b3o217bobo10bo3b2o8bo 2bo6bo3bo17bo2bo6bo3bo16bo3b2o4bo19b2ob2o2bo32bobo2b3o2bo28bobo2b3o2bo 6bo2bo6b2o7bo12bob3o6b2o7bo27b5o11bobo4b2obo11bo47bobobo5bo2bo20bo3bob o5bo2bo7b2obo2bo2bobo19b2obo2bo2bobo23bo5bob2obob2obo12bo5bobo5bo2bo 10b3o23b3o$o11bo11b2o7b4o193bo7bo12b2o4b2o5bo3b4o6b2o3b2o9b2o14b2o3b2o 9b2o15bo2bobo20bobo2bo2bo3bobo30b2o8b2o27b2o8b2o3bo10bo3bo6b3o8b2o9bo 3bo6b3o24bo3b2o9bo9bo11bo5bobo37bo3bob2obob2obo20bo13b3o16bobo28bobo 22b2obobobobo5bo2bo10b2obobobob2obob2obo14bobo23bobo$36bo216bob2o2bo4b 3obo11bo2b2o4b2obo19bo2b2o4b2obo10bo9bobobo6bo9bo2bo7b3o3bo7bobo24bo2b o5bo29bo2bo5bo3b2o12b2o4bo2bo6bobo14b2o4bo2bo6b2o15bo10bobobo20b2obobo bob2obo33bo9bob2obo19bo3b2o11bo11b2obo27b2obo28bo13b3o12bo9bob2obo10bo 2bobo20bo2bobo$obobo3bobobo11bob2obo200bobobo3bobobo16bo4bo17bo2bo2bo 3bo5bo2b2o11bo2bo2bo3bo5bo2b3o18bobo7b2o3b2o14bo4bo2bo16bo3bo6bobo3bo 3b2o16bo3bo6bobo3bo22b2o2bo3b3ob3o18b2o2bo4b3obo14bo5bob2obo26bo9bobob o28bo3b2o10bo19bob2o13bo13b2o29b2o44bo27bo9bo3bo21bo3bo$24b2o3bo223bob 2o2bo4b3obo14b2o7bo5bo2b3o11b2o7bo5bo2b2o10bo8bo2bo8bo2b2o10bo2bo4bo3b o16b2obo2bo3b2o2b2o3bo19b2obo2bo3b2o2b2o21b3o4bo3bo4bo16b3o4bo3bo4bo 13b2obobobobo43bo9bo18bob2o11b2o8b2ob2o7bo13bo15b3o28b3o43bo26b2o10bo 25bo$4bo3bo20bo200bo3bo3bo3bo8b2o4b2o5bo3b4o16bo4b2o3bo4bo16bo4b2o3bo 14b2o7bo2bo10bo2bo7b2o3bo2bobo16bobo2bo2bobo2b3o8bo2bo11bobo2bo2bobo2b 3o32bo4b3obo23bo3b3ob3o14bo38b2o10bobo4b2obo7b2ob2o7bo13bo8b3o8bo15b2o 16bo2b2o26bo2b2o20b3o14bo11b3o14bo12b2o24b2o$24b2o227bobo10bo3b2o15b2o 4bob3o21b2o4bob3o14bo2b2o6bobo11b2o6bo8b2o2b2o11bo2bo13b2o9bobo8bo2bo 13b2o31b2o6b2o23b2o6bobo53b2o12bo2b2obo9b3o8bo25b2obo2bo2bobo14bo19bo 3bo26bo3bo21bobo11b2o13bobo25b3o23b3o$obobo3bobobo11bo3bo201bobobo3bob obo14b3obob3o16bob2o3bo4b4o16bob2o3bo4b4o16bobo4bo23bo11bo11b2o3b2o25b o6b2o3b2o43bo2b2o28bo2b2o6b2o17b2o33bo2bo11bo16b2obo2bo2bobo33bobo38bo bo28bobo15bo2bobo12bo10bo2bobo26b3o23b3o$25b2o234b2obo17bo3b2o2b2o3bo 18bo3b2o2b2o3bo14b2o3bo3b2o24bobo10b2o11bo2b2o34bo2b2o41b2o31b2o11bob 3o13b2o33b4o13bobob2o19bobo28b2obo45bo4bo25bo4bo8bo3bo24bo3bo$26bo255b ob2o28bob2o25b3o7bo37b2obo10bo2bo35bo2bo42bo32bo11b2obo12bo2bo30bo21b 2o15b2obo34b2o44b2o2b2obo23b2o2b2obo8bo28bo$26b2o316b2o48bo11b2o37b2o 103b4o29b2o23bo3bo13b2o34b3o44b3obobo24b3obobo9b2o27b2o26b3o23b3o$23bo 2b2o319bo200bo36bo23bo2bo13b3o35bo2b2o41b2obo27b2obo12b3o26b3o27bobo 23bobo$21b2o3bo318bobo198b2o62bobo15bo2b2o33bo90b3o26b3o23bo2bobo20bo 2bobo$23bo322bo201bo81bo83b2o29b2o64bo3bo21bo3bo$715bo30bo65bo25bo$ 813b2o24b2o$814b3o23b3o$814b3o23b3o33$56bo$55bobo$54b2o$56bo1559bobo$ 56bo230bo804bo523bo3bo14b2o22b2o$284b4o705bobo95bobo473bo23bo24bo2b2o 5bo7b3o3b2o16b3o3b2o$54b2obo226b3o451bo31bo94bo32bo35bo38bo19bo96b2o 91b2o380b2o22b2o27bobo4b2o8b2obo20b2obo$39b2o12b3o129b2o96bo454b2o4bo 25b2o92bobo30bobo33bobo36bobo18bo2bo95bo90b2o33b2o347bo23bo28bo17bo5bo 17bo5bo13b2o$39b2o12bo3bo125b5ob3ob2o85b2ob2o312bo44bo26bo31bo32b2obob o2b3o21b2obobo2b2o23bo32bo30b2o31b2o35bobo36bobo20bo3bo92bo90bo34b2o8b o34bo37bo37bo37bo37bo37bo37bo22bo14bo22bo16b6o18b6o20b2obobo20bo23bo 11b3o2bo$39bo13bob2o125bo5bo90b3obo133bo44bo132b2o6bo36b2o23bo2bobo26b o2bobo31b3o2bo2b2o22b3o2bo2b3o21bobo30bobo31bo32bo34bo38bo24bobo16bo 30bo130bobo2bo34bo7b2o33b2o36b2o36b2o36b2o36b2o36b2o36b2o21b2o6bo6b2o 21b2o18bo4b2o17bo4b2o18bo2bobobo11b6obo4bo11b6obo12b4o5bo$36bo2bo142bo 5bo4bo22b2o29b2o29b2o2b3o130b2o6bo36b2o36bob3o40bob3o45bo4bob2obo34bo 4bobo16b4o28b4o34b2o2bo27b2o2bo7bo20b2o31b2o33bo32bo96b2o19b2o6bo22b2o 6bo35b2o84bo4bo10bo19bobo2bo9bo34bo37bo37bo22bo14bo22bo14bo37bo37bo18b o4bob2obo8bo18bo4bobo14bo11bo11bo24b3ob2obo17b3obobo17b3obobo15bobo$ 33bo4bo14bo2bo9bo111b2o4bobo4bobo21b5o26b5o28bo4bo2b2o22bobobo40bobobo 52bo4bob2obo34bo4bobo25bobob2obob2obo32bobob2obob2obo43b3o3bobo36b3o3b ob2obo13b3o3b2o2bo21b3o3b2o2bo7bo16bo31bo37bo32bo100bobo36bobo20b3o18b o6b3o21bo6b3o32b2o32bobobo49bo2b3obo6b2o19bo4bo12b5o30b5o33b5o33b5o14b 2o6bo10b5o14b2o17b5o33b5o33b5o11b3o3bobo13b5o11b3o3bob2obo11bo6bob2obo 11bo6bobo16bo4bo11b3o8bobo10b3o8bobo10bo3bo$29b2o2b2ob3obo11b2o10b2o 22bo89b4obo3b4o18bo5bob3o20bo5bob3o25bobo7bo22bo3bob2obob3o31bo3bob2ob ob3o44b3o3bobo36b3o3bob2obo20bo3bobo5bo4bo27bo3bobo5bo4bo6bo32bo4bo39b o4bo6bo10b2o2bo6b3o2bo2b2o11b2o2bo6b3o2bo2b3o13b4o2bobo23b4o2bobo32bo 32bo31b2o31b2o119bo6bo23bo6bo30b2o2bo29bo3bob2obo45bobo3b2o9bo18bo2b3o bo11bo3b2o29bo3b2o32bo3b2o32bo3b2o10bo4bob2obo11bo3b2o10bo4bobo14bo3b 2o32bo3b2o32bo3b2o8bo4bo18bo3b2o8bo4bo6bo10b2obob2obobo13b2obob2obob2o bo31bo23bo11bo10b3o$obobo3bobobo15bo2bo6b2o8bo3b2o12bo19b2obo23b2o35b 2o36bo4b2o12b2obo2bo6bo4bo12b2obo2bo6bo20bo3bo31bo9bob2obo29bo9bob2obo 32bobobo5bo4bo29bobobo5bo4bo6bo19bo13b3o3bobo22bo13b3o3bob2obo29bob2ob o39bob2obo19bo3b2o6b2obobo2b3o9bo3b2o6b2obobo2b2o14b3o4bo24b3o4bo96b2o 31b2o34b3o3b3o30b3o3b3o16b2o21b2ob3obo23b2ob3obo30b3o30bo9bobobo41bo 18b5o11bobo3b2o12bo34bo37bo37bo14b3o3bobo14bo14b3o3bob2obo11bo10bob3o 22bo10bob3o22bo10bob2obo21bo10bob2obo22bo23bo10bo77bo2bob3o$21b4obo21b o19bo5b3o7b2o3bo14bo3b3o2b3o25bo3b3o2b3o26bo25bo5bo4bo3bo2b3o10bo5bo4b o3bo2b2o14bo2b2o32bo3b2o8bo4bo25bo3b2o8bo4bo6bo20bo3bob2obob2obo30bo3b ob2obob2obo28bo3b2o10bo4bob2obo18bo3b2o10bo4bobo25bobob2obob3o33bobob 2obob3o23b3o10b2o4bo12b3o10b2o15b2o2bo27b2o2bo38b2o31b2o27b2o2bo28b2o 2bo32bo5bo3b2o27bo5bo3b2o14b2o3bo20bo3bo26bo3bo19bo2b2o9b2o27bo3b2o9bo 37bobobo19bo3b2o9bo19bo5bobo26bo5bobo29bo5bobo29bo5bobo5bo4bo18bo5bobo 5bo4bo6bo11bo5bob2obob2obo21bo5bob2obob2obo21bo5bob2obob3o22bo5bob2obo b3o69b3o19b3o21b3o18b3o2b3o$o11bo8bo2b4obo17b2o2bo15bo5bo10b2obo14b2ob o4bo2b2obobo4bo15b2obo4bo2b2obobo4bo17bobo22bobo2bobob2obo4bo2b2o9bobo 2bobob2obo4bo2b3o11b3o36bob2o11b3o3bobo21bob2o11b3o3bob2obo19bo9bob3o 30bo9bob3o29bob2o14b2o6bo18bob2o14b2o27bo3bobo38bo3bobo26bo2bo13bo14bo 2bo13bo15bo3b2o26bo3b2o36b2o31b2o29b3o30b3o33b2obo3bo31b2obo3bo10bo16b 2o10b2o2bobo24b2o2bobo23b2o2bo38bob2o11bobo3b2o23bobob2obo23bo10bobobo 18b2obobobob2obo22b2obobobob2obob3o21b2obobobob2obob3o21b2obobobob2obo b2obo20b2obobobob2obob2obo20b2obobobobo5bo4bo17b2obobobobo5bo4bo6bo10b 2obobobobo28b2obobobobo79bobo15bo2b2o19bo2b2o$48bob2o15bobo3bo3b2o2b2o 4b2o10bobob2o3b2o5b3o6bo11bobob2o3b2o5b3o6bo39b2o6b2obo19b2o6b2obo12bo 10bobo26b2ob2o7bo14bo4bob2obo7b2ob2o7bo14bo4bobo21bo3b2o39bo3b2o28b2ob 2o7bo18bo13b2ob2o7bo18bo25bo44bo34b2o30b2o33b3o29b3o34b2o2bo28b2o2bo 17bo2b2o9b2o17bo2b2o9b2o35bo3bo4bobo27bo3bo4bob2obo11b2o3bo10b3o28b3o 20bo7bo3b3o2b3o20b2ob2o7bo14bo2b3obo20bo3bobo26bo5bob2obo24bo9bobobo 20bo9bob2obo22bo9bob2obo22bo9bob3o23bo9bob3o23bo13b3o3bobo15bo13b3o3bo b2obo12bo37bo34b3o21b3o21bo2bobo19bo23bo$obobo7bo8b3o24bob2o15bobobo3b o4b2ob2o3b3obo6bo7bo3b3obo3b4obo11bo7bo3b3obo3b4obo4bo9b2o23b2o4bobo2b o19b2o4bobo2bo23bob2o24b3o8bo18b2o6bo6b3o8bo18b2o25bob2o41bob2o29b3o8b o33b3o8bo45bo3b2o39bo3b2o30bobobo27bobobo26bo2bo28bo2bo37b3o30b3o19b2o 2bo28b2o2bo46bo5b2obob2obo24bo5b2obobo15bobo4b2o7bo15b2o13bo20bo12b2ob o2b2o19b3o8bo16bo4bo21bo32b2obobobobo41bo33bo4bo32bo4bo6bo103bo4bob2ob o27bo4bobo91bobo21bobo17bo3bo19b2obo20b2obo16bo$48bob2o19b5obo2bob3o4b obo7bo4b2ob2o4bo4b2o3b3obobo6bo4b2ob2o4bo4b2o3b3obobo9b2o26bob2o2bo2b 2o20bob2o2bo2b2o20bo4bo24b2obo2bo2bobo19bo13b2obo2bo2bobo19bo13b2ob2o 7bo32b2ob2o7bo32b2obo2bo2bobo33b2obo2bo2bobo44bob2o41bob2o32bo3bo27bo 3bo27b2o30b2o27bo2b2o9b2o17bo2b2o9b2o17bo3b3o2b3o21bo3b3o2b3o34bo18bo 19bo31b7obo8b2ob2o10b3ob2obo8b2ob2o15b2o12bo26b2obo2bo2bobo16bobo2bo 19bo3b2o30bo48bobo3b2o27b3o3bobo29b3o3bob2obo105b2o6bo29b2o91bo2bobo 18bo2bobo19bo22b2obo20b2obo16bo2bo$o3bo7bo8bo2b4obo17b2o2bo15bo10bo22b 2obobo11bo8bobo8b2obobo11bo8bobo9b2o4bo18b4obo5bo19b4obo5bo21b2o38bobo 42bobo32b3o8bo33b3o8bo43bobo42bobo33b2ob2o7bo32b2ob2o7bo34bo31bo31bobo bo27bobobo24b2o2bo28b2o2bo32b2obo2b2o25b2obo2b2o33b2obo35b2obo28bo22bo 5bob3o6bo13bo5bo6bo16b2o33bobo21bo19bob2o64b3o15bo2b3obo9b3o15bo4bob2o bo9b3o15bo4bobo12b3o35b3o35b3o19bo15b3o19bo15b3o35b3o33bo3bo19bo3bo22b 2o64bo3bo$21b4obo21bo17bo4b2o32b2o22bo12b2o33b2o4b2o20b2o29b2o62b2obo 41b2obo37b2obo2bo2bobo33b2obo2bo2bobo37b2obo41b2obo36b3o8bo33b3o8bo37b o31bo30bo3bo27bo3bo24bo3b3o2b3o8b2o11bo3b3o2b3o8b2o16bo32bo29bob2o35bo b2o39b7obo8b2o7bobo6bo12b2o7bobob3o6bo13bo3bo24b2obo25b2o7b2ob2o7bo69b obo12bo4bo14bobo14b2o6bo12bobo14b2o19bobo35bobo35bobo35bobo35bobo35bob o31bo23bo26b3o18b2o22b2o16b5obo4b2obo$obobo7bo15bo2bo6b2o8bo3b2o13bo2b o2bo32b4o33b4o33b2o19bob2o27bob2o28bo4b2o31b2o43b2o46bobo42bobo39b2o 43b2o37b2obo2bo2bobo33b2obo2bo2bobo40bobo29bobo24bo31bo32b2obo2b2o7bob o4bo10b2obo2b2o7bobo17b2o31b2o25b2o3bo33b2o3bo39bobo4b2o9bo6bobo9b2o 10bo6bobo4b3ob2obo14bo2bo2bo23b2o25b2o6b3o8bo33b3o31bo2bobo14bobo2bo9b o2bobo17bo14bo2bobo17bo14bo2bobo32bo2bobo32bo2bobo32bo2bobo32bo2bobo 32bo2bobo33b2o22b2o24b3o19bob2o20bob2o13b2o8bo2b2o$29b2o2b2ob3obo11b2o 13b3obobo34bo36bo34bo20bo4bo25bo4bo30bo33b3o42b3o40b2obo41b2obo43b3o 42b3o45bobo42bobo37b2o3bo26b2o3bo25bo31bo32bo10bo2bob2obobo11bo10bo2bo b2obobo13bo3bo3bo24bo3bo3bo19bobo6bobo27bobo6bobo30b2o3bo14bo2bo14bo 12bo2bo9b2o21bobo2bo23b3o33b2obo2bo2bobo35bobo27bo3bo21bo8bo3bo33bo3bo 33bo3bo33bo3bo33bo3bo33bo3bo33bo3bo33bo3bo36b3o21b3o40b2o22b2o19bo9bo$ 33bo4bo14bo2bo16bo99bo3bo24bo2bo27bo2bo28b3o36bo2b2o40bo2b2o38b2o43b2o 45bo2b2o40bo2b2o36b2obo41b2obo40bobo3bo25bobo3bo29bobo29bobo27b2o11b2o 3bobo12b2o11b2o3bobo14bo2bo3bo25bo2bo3bo23b3ob2o33b3ob2o37b2o14bobobob 2o10bo12bobobob2o33b2o23bo2b2o38bobo31bo2bobo29bo24b2o8bo37bo37bo37bo 37bo37bo37bo37bo39b3o2b2o17b3o2b2o36b2o22b2o20bo9bo$36bo2bo133b2obo2bo 22bo30bo33bo38bo44bo40b3o42b3o46bo44bo40b2o43b2o40b2obo28b2obo29b2o3bo 26b2o3bo28bo3bo3b2obo21bo3bo3b2obo7bo15bobo2bo27bobo2bo24b2ob2o34b2ob 2o30b2o3bo17b2o3bo25b2o3bo36b2o25bo35b2obo34bo3bo32b2o22b2o9b2o36b2o 36b2o36b2o36b2o36b2o36b2o36b2o42b3ob2obo16b3ob2obo9b3o20bo23bo20b2o3b 2ob2o$39bo13bob2o116bo3bobo88bo125bo2b2o40bo2b2o128b3o42b3o35bobo29bob o33bobo3bo25bobo3bo29bo2bo2bo26bo2bo2bo33b2obo29b2obo7bo14bobo36bobo 30bo24bo30bo40bo4b3o56b2o35bo36b3o32b3o35b3o35b3o35b3o35b3o35b3o35b3o 35b3o39b2o6bo15b2o6bo12bobo15bobo21bobo21b2ob2o3bo$39b2o12bo3bo120b2o 87b2o127bo44bo132bo2b2o40bo2b2o31bo31bo35b2obo28b2obo33bobo3bo26bobo3b o36b2o3bobo25b2o3bobo15b3o36b3o32bo93bo2bob3o56b3o35b2o34b3o32b3o35b3o 35b3o35b3o35b3o35b3o35b3o35b3o43bo23bo12bo2bobo16bo2bo20bo2bo25b2o$39b 2o12b3o122b3o87bo307bo44bo33bobo29bobo29bobo29bobo44bo32bo33bo2bob2obo bo22bo2bob2obobo15b4o35b4o29bobo95b2o62bo2b2o32b3o374bo6b2o15bo6b2o8bo 3bo18bo2bo20bo2bo27b2o$54b2obo122bo87b2o449bo31bo116bobo4bo25bobo23bo 38bo29b2o3b2o94bo62bo34b3o372b2o7bo14b2o7bo10bo22bobo21bobo$265bo2b2o 449bobo29bobo115b2o31b2o94bobo97bobo471bo7bo15bo7bo10b2o18bo23bo$56bo 206b2o3bo830bo516b3o14b2o22b2o$56bo208bo1350b3o16bo23bo$54b2o$55bobo$ 56bo6$431bo7bo$71bo23bo93bo239b2o7bo$69b2o22b2o3bo88b2o242bo6b2o$48bo 22bo23bo2b2o89bo246bo142bobo$21bobo22b2o25bobo22b2o39bobo21bobo25bobo 238b2o6bo138bo3bo$21bo26bo23bo2bo22bo20bo11b2o5b3obo12b2o5b3obo23bo2bo 18bobo4b2o212b3ob2obo70bo67bo2b2o5bo111bobo$21bo28bobo19bo2bo21b2o19bo bo9b3o4b2o15b3o4b2o27bo2bo18bo7bo2bo11b2o26b2o164bo3b2o73b2obo8bo29bo 18bo11bobo4b2o110bo2bo$23b2o24bo2bo19bobo24bo18bobo10b2obo3bo16b2obo3b o27bobo19bo2b3o5bo10b3o25b3o26bobo42bo64bo27b2o76b2o9b2o28b2o19b2o12bo 115bo3bo8bo$22b3o24bo2bo21bo13bobo4bob2o11b2o6bo15bo2bo20bo2bo30bo21bo 5bo2bo11bo27bo27bo42b2o37bo18b3o4bobo27bo76bo13bo18bo10bo18bo12b2obobo 35bobo29bo42b2o10b2o$21b2o7bobo16bobo15bobo2b2o14bo3bo4bo12b3o21bo3bo 19bo3bo56b2o15b2ob2o23b2ob2o22bo2bo41bo34b2o14bo2b2o4b2obobo29bo27bobo 41b2o2b2o13b6o11b2o11b6o13bo10bo2bobobo33bo31b2o2b2o13bo20bobob2o11bo$ 21bo3b2o2bo2bo12bo5bo15bo4b2o14bo4b3obo12b2o6bobo14b3o21b3o27bobo17bob 2obo26bo27bo23bo3bo40b5o21bo8bo13b2o7bo34bo26bo2bo11bobo25bo2bobo16bo 4b2o10bo12bo4b2o11bo10b3ob2obo11b2o20bo2bo28bo2bo13b2o20bo19b6o$obobo 3bobobo11bobobo3bo6bo3bo2bo20bo4bo17bo2bo2bo15bo5bobo8bo7b2o14bo7b2o 22b3ob2obo15b3o4bo20b2o26b2o29bobo30bo10bo3bo11b3o4bobo10b5o7bo3bo6b3o 29b2o27bo12bo2bo25bo4bo3bo12bo11bob2obo12bo15b3o11bo4bo11b3o22bo3bo7b 2o19bo15bo19bo2b2obo14bo4b2o$24bo3bo10b2o2bo4bobo18bobo19b2o20bo2bo2bo 7b2o22b2o33bob2obo22bo22bo2bo24bo2bo24b2o24b3o4bobo4b2o3bo4bo6bo2b2o4b 2obobo11bo3bo11b2o4bo2bo58b2o9bo3bo24b2o5bo2bo12bo6bob2obob2obo12bo6bo bo5bo2bo29bo15b2o8bobo6b3o37b6o11bobo4b2obo11bo$o7bo3bo11bobo2b2o8bo3b o2b4obo12bobo4bo35bo3b3o2bobo10bo23bo29bo2bobo19b2o29bo27bo25b3o18bo2b 2o4b2obobo2b2o6bobo8b2o7bo10b2o3bo4bo16b2o2bo30bo14bob2o9bobo7b2o28b2o 6bobo11b2obob2obobo5bo2bo10b2obob2obob2obob2obo31b2ob2o10b3obo3b2o10bo 20b3o16bo4b2o9bo9bo11bo6bobo$26b2o19b2obo13bo3b4o18bo16b2o5bo16b6o18b 6o20bo2bo2b2o16b5obo18bobo4bo20bobo4bo22bo6bo18b2o7bo13b2o11bo3bo6b3o 4b2o6bobo15b3o4bo4bo3bo20bobo13bo3b2o5bobo8bob2o23bo2bo24bo14b3o12bo 10bob2obo9b3o24bo5bob3o7b3o10b2ob2o16bo17bo11bobobo20b2obob2obob2obo$o bobo3bobobo10b2ob2o16b2o18bo6bo17bo17bo2bo2bo2bobo13bo4b2o17bo4b2o17bo 2bo2bo16b2ob2obo20bo27bo27b2o17bobo6bo3bo6b3o3bobob2o18b2o4bo2bo9b2o 25bo3bobob2o19b4o13bob2o6bo2b4o2bo20b3o4bobo2bo41bo28bo12bobo16b2o7bob o6bobo4bo15bo5bo6bobo4bo13bo6bob2obo26bo10bobobo$23b2ob2o16b2o20bo2b2o 18bo3bo16bobo3bo2bo12bo11bo11bo23bo3bob3o14bo3bobobo18bobo2bo2bo19bobo 2bo2bo21bo10b2o2b2o2bo11b2o4bo2bo3bo3bo23b2o2bo3bobob2o26b2o9b2o13b2o 2bo21b3obo5b2o2b2ob2obo9bo2b2o4b2obobo44bo27b2o8bo2bobo18bo6bobo10bo 14b2o7bobob3o7b3o12b2obob2obobo44bo9bo$o3bo3bo3bo13b2o19b2obo36bo3bo2b o23bobo11bo6bob2obo11bo6bobo15b3obo2bo14b2obob2obo21bo27bo28b5o3b3o6bo 16b2o2bo28b3o4bo4bo3bo24bo2b2o2b2o6bobo10b2obobo21bob2o5b3o7b2obo6b2o 7bo29b3o15bo11b3o15bo8bo3bo21bo2bo14b3o14bo6bobo4b3obo3b2o15bo39b2o11b obo4b2obo$24bobo2b2o8bo3bo2b4obo14b2o18bo5b2o14bo9bobo10b2obob2obobo 13b2obob2obob2obo12bobo22b2o26bob2obo22bob2obo23bo4bo4bobo17b3o4bo35bo 31b2o9b2o3bo4bo8b2o2bo44bo6bo3bo6b3o28bobo12b2o13bobo22bo25bobobob2o 27bo2bo9b2o8bobo51b2o13bo2b2obo$obobo3bobobo11bo3bo10b2o2bo4bobo15b3o 2b2o14bo3bo16bo2bo21bo23bo10bo11b2o21b3o29b3obo23b3obo23bo4bob3o2bo24b o34b2o33bo14bo3bo7b2o27bobo7bo22b2o4bo2bo23bo2bobo13bo10bo2bobo24b2o 22b2o3bo12bo18bobobob2o12bo3bo14b2o34bo2bo12bo$24bobobo3bo6bo3bo2bo21b obo16bo3bo16bo3bo5bo85bo29bo4bo2bob2o16bo4bo2bob2o17bo4bo6b2o22b2o32bo 2b2o46b5o7bo31b2obob3o28b2o2bo22bo3bo25bo3bo27b3o22bo12bo2bo17b2o3bo 13bo2bo16b2o34b4o14bobob2o$21bo3b2o2bo2bo12bo5bo14b3o17bo3bo15b5obo5bo bo14b2o22b2o16b2o3bo17b2o29bo3b2o3bob4o13bo3b2o3bob4o16b2obo3b3o3b3o 19bo2b2o29b2o49bo13bo5bo28bo29b3o4bo23bo29bo30b3o2b2o31b2o2b2o17bo16bo 18bo2bo31bo22b2o$21b2o7bobo16bobo14b3o13bo2b2o19b2o10bobo13b2o22b2o17b 2o21b2o29b2o2bo2bob2o4bo12b2o2bo2bob2o4bo4bo12bo4b3o23b2o36bo46b2o15bo b3o66bo24b2o28b2o33b3ob2obo25bo39bobo15b4o30b2o24bo3bo$22b3o24bo2bo12b obo14b2o2bo3bo15bo12bo13bo2bo20bo2bo41bo28bo8b2o4bo2b2o8bo8b2o4bo2b3o 14b2o2b2o25bo84bo19bo64b2o25b3o27b3o30b2o6bo81bo37bo24bo2bo$23b2o24bo 2bo12b2o2b2o11bo3b2obo17bo24b4o20b4o17b3o21bobo32b2o3b2o3bo2b3o12b2o3b 2o3bo2b2o16b2o130b4o62bo2b2o24b3o27b3o34bo83b2o64bobo$21bo28bobo11bo2b o19bo20b2o20bo23bo22b2o22bob2obo44bo175bo2bo60b2o91bo6b2o82bo$21bo26bo 14b4o18bobo21b2o17b2o22b2o25bobo20bo3bo223bo62bo88b2o7bo$21bobo22b2o 13bo21bo2b2o42bo23bo22bo3bo247bo154bo7bo$48bo10b2o22bo3bo87bo2bo250bob o$61bo21bobo89bo253bobo$175bobo252bo6$99bo$98bobo$97b2o$99bo$99bo$228b obo15bo3bo22bo3bo$97b2obo121bo3b2ob2o14bob2obo21bob2obo12bo840bo$23bo 3bo18bo3bo18bo3bo22b3o123b2obob2o16bobo13bobo8bobo13bobo839b2o$22bob2o bo17bob2obo17bob2obo22bo3bo121bo3b2o18bo10b3obobo9bo10b3obobo28bo33bo 228b2o5b2obo16bobo6bo127b2o370bo2bo34b2obo$22bobo20bobo20bobo25bob2o 128bo5bo9b2o7b4obo4bo7b2o7b4obo28bo2b3o28bo2b3o98bo2b2o29bo2b2o90bo6bo 2b2o16bo7bobo126b2o370bo2bo4b2obo21b2o2bo3bo13bo$23bo22bo22bo158bo3bo 2b2o7b2o7bo4bo12b2o7bo4bo28bo2b2o29bo2b2o99bo2b3o28bo2b3o89b2o5bo20bo 7bo78bo49bo9bo35bo38bo38bo38bo38bo38bo38bo23bo14bo23bo26b2obo4b4obobo 8bo9b3obo3bo12b2o$21b2o14bo6b2o21b2o14bo12bo2bo20bo105bobob3o15bob2o5b o17bob2o5bo25bo3bo29bo3bo40bo33bo24bo3bo4bo24bo3bo4bo89b2o6bo21bo3b2o 77bo2b2o21bo20bobo2bo7b2o34b2o37b2o37b2o37b2o37b2o37b2o37b2o22b2o6bo6b 2o22b2o32bo3bo2b2obo6b2o11b2o2bo17bo$21b2o7bobob2obo6b2o7bobobo9b2o7bo bob2obo11b2o22b2o3bo5b2o92bo3bobo16b2o5b2o18b2o5b2o26bob3o29bob3o36bo 2b3o28bo2b3o23bob3o29bob3o34bo2b2o29bo2b2o17b4obo3b2ob2o25b2obobo50bo 20b3o23b2o20bo4bo10bo35bo38bo38bo23bo14bo23bo14bo38bo38bo19bo4bob2obo 8bo19bo4bobo22bo2bobo9bo9bo16bo6bo10b5o$obobo3bobobo12b3o4bobo13b3o4bo b2obo10b3o4bobo10bo3b2o21b2o3bob2o5bo20b2o6bo29b2o6bo22bo2bo2bob3o76bo b3o29bob3o36bo2b2o29bo2b2o24bob3o29bob3o34bo2b3o28bo2b3o13bob3o6b2o3bo 21b2o3bo2bo21bo5b2o13b3o4bobo19bobo15bobo8bo19bo2b3obo10b6o30b6o33b6o 33b6o14b2o6bo10b6o14b2o17b6o33b6o33b6o11b3o3bobo13b6o11b3o3bob2obo15bo 3bobo3bobo18b5o10bo3b2obo11bo3b2o$24b2o21b2o11bo9b2o19bo19b4o2b3o3bo4b obo13bo3b3o2b3o26bo3b3o2b3o26b3o3bo20b2obo23b2obo19bob2o8b3o19bob2o8b 3o34bo3bo29bo3bo16bob2o8b3o19bob2o8b3o32bo3bo4bo24bo3bo4bo12b2o7b2o3b 2o21bo3b2o17b3o4bobo4b3o8bo2b2o4b2obobo19bob2o13bo2bo10b6o11bobo3b2o 12bo4b2o29bo4b2o32bo4b2o32bo4b2o10bo4bob2obo11bo4b2o10bo4bobo14bo4b2o 32bo4b2o32bo4b2o8bo4bo18bo4b2o8bo4bo6bo13bo2b2o29bo3b2o8bobobo14bo$o7b o3bo17b2o21b2o21b2o12b2o2bo14bo5b2o4bo4bobo13b2obo4bo2b2obobo5bo15b2ob o4bo2b2obobo5bo16bobo25b2obo23b2obo19bo3b2o5b2o21bo3b2o5b2o35bob3o29bo b3o17bo3b2o5b2o21bo3b2o5b2o33bob3o29bob3o34b2o17b2o18bo2b2o4b2obobo5bo 9b2o7bo10b2o11bo4bo11bo3bo11bo4b2o9bo19bo35bo38bo38bo15b3o3bobo14bo15b 3o3bob2obo11bo11bob3o22bo11bob3o22bo11bob2obo21bo11bob2obo21b3o33bo10b o2bo18bo5bobo8bo$24b6o17b6o17b6o15bob2o12b2o6bobo3bo6bo10bobob2o3b2o5b 3o7bo11bobob2o3b2o5b3o7bo15bob2o26bo26bo20bob2o6bobo21bob2o6bobo35bob 3o29bob3o17bob2o6bobo21bob2o6bobo33bob3o29bob3o18bob2obo31bo17b2o7bo 11bo8bo3bo6b3o6b2o10b2o15b2o15bo11bobobo19bo6bobo26bo6bobo29bo6bobo29b o6bobo5bo4bo18bo6bobo5bo4bo6bo11bo6bob2obob2obo21bo6bob2obob2obo21bo6b ob2obob3o22bo6bob2obob3o21bobo34bo5bob2obobo2b2o14b2obobobob2obobo2b2o $obobo3bobobo11bo22bo22bo20bob2o14bo2bo2bo6bo16bo7bo3b3obo3b5obo11bo7b o3b3obo3b5obo4bo9bo4bo22bo2b2o22bo2b2o24b3obo29b3obo26bob2o8b3o19bob2o 8b3o24b3obo29b3obo24bob2o8b3o19bob2o8b3o20b2o3bo24bo8bobo13bo3bo6b3o8b 2o11b2o4bo2bo4bob2o23bobob2o14bo6bob2obo22b2obob2obob2obo22b2obob2obob 2obob3o21b2obob2obob2obob3o21b2obob2obob2obob2obo20b2obob2obob2obob2ob o20b2obob2obobo5bo4bo17b2obob2obobo5bo4bo6bo10b2obob2obobo28b2obob2obo bo28bob2o32b2obobobobo8bo16bo9bo2bo$24b6o17b6o17b6o15bob2o16b2o4b2obob o16bo4b2ob2o4bo4b2o4b3obobo6bo4b2ob2o4bo4b2o4b3obobo8b2o28b3o24b3o26bo b2o30bob2o26bo3b2o5b2o21bo3b2o5b2o27bob2o30bob2o24bo3b2o5b2o21bo3b2o5b 2o27bo24b2o6bo2bo18b2o4bo2bo5bob2o16b2o2bo3b2ob2o8bo4b2o7bo19b2obob2ob obo27bo10bobobo20bo10bob2obo22bo10bob2obo22bo10bob3o23bo10bob3o23bo14b 3o3bobo15bo14b3o3bob2obo12bo38bo35bo4bo33bo45bobobo$o3bo7bo17b2o21b2o 21b2o12b2o2bo17bo5bo3bobo16b2obobo11bo9bobo8b2obobo11bo9bobo158bob2o6b obo8bo12bob2o6bobo8bo80bob2o6bobo8bo12bob2o6bobo8bo13b2o28bo7bo2bo23b 2o2bo3b2o2bo14b3o4bo6b2o12bo9bo2b2obo15bo50bo34bo4bo33bo4bo6bo106bo4bo b2obo28bo4bobo89b2o73b2o9bo3b2obo$24b2o21b2o11bo9b2o11bo7bo4bo15bo4b2o 2bo23b2o23bo12b2o31bo4b2o23bo26bo30bobo31bobo31b3obo9b2o18b3obo9b2o6bo 13bobo31bobo29b3obo9b2o18b3obo9b2o6bo7bo31bo5bobo21b3o4bo6b2o21bo3b2o 2bo9b3o9bobo4b2obo63bobo3b2o28b3o3bobo30b3o3bob2obo108b2o6bo30b2o135b 2o30b2o10bo6bo$obobo3bobobo12b3o4bobo13b3o4bob2obo10b3o4bob2obo7bo3b3o 12bo8b3obobo20b4o34b4o32bo25b2o25b2o31b2obob3o26b2obob3o25bob2o7bo4bob o15bob2o7bo4bob2obo15b2obob3o26b2obob3o23bob2o7bo4bobo15bob2o7bo4bob2o bo7b3o29bo7bo28bo3b2ob2o20b2o5bob2o10bo9bo9bo45b3o16bo2b3obo9b3o16bo4b ob2obo9b3o16bo4bobo12b3o36b3o36b3o20bo15b3o20bo15b3o36b3o34bo4b2o35b2o 30bo2bo3b2o2bo$21b2o7bobob2obo6b2o7bobobo9b2o7bobobo15b2o12b2o8b2ob2o 23bo37bo30b3o25bo2b2o22bo2b2o32bob2obo28bob2obo34b3o3bob2obo22b3o3bobo 21bob2obo28bob2obo32b3o3bob2obo22b3o3bobo11b2o3bo24b2o35b2o4bob2o18bo 2b2o6b2o11bo4bobobo19b3o36bobo13bo4bo14bobo15b2o6bo12bobo15b2o19bobo 36bobo36bobo36bobo36bobo36bobo35bo36bo2bo28b4o3b3obo3bo$21b2o14bo6b2o 21b2o41bo9b3obo94bo27bobo24bobo35bo4bo6bo21bo4bo22bobo5bo4bo6bo13bobo 5bo4bo28bo4bo6bo21bo4bo20bobo5bo4bo6bo13bobo5bo4bo21bo21bo2bo2bobo28bo 2b2o4b2o17b2o10bo12b2ob2obo26bobo29bo2bobo15bobo2bo9bo2bobo18bo14bo2bo bo18bo14bo2bobo33bo2bobo33bo2bobo33bo2bobo33bo2bobo33bo2bobo33b3o36b4o 27bo9b2o2bo3bo$23bo22bo22bo27b3o120bo22b2o3bo21b2o3bo37b3o3bob2obo22b 3o3bobo20b2obob2obo25b2obob2obo32b3o3bob2obo22b3o3bobo18b2obob2obo25b 2obob2obo21b2o21b2o6bob2o25b2o9b2o19bo8bo12bo3bo25bo2bobo29bo3bo22bo8b o3bo34bo3bo34bo3bo34bo3bo34bo3bo34bo3bo34bo3bo34bo3bo37bo34bo30b2o15b 2obo$22bobo20bobo20bobo26bobo119b2o23b3o24b3o40bo4bobo26bo4bob2obo20bo b3o29bob3o34bo4bobo26bo4bob2obo18bob3o29bob3o21bob2o22bo5b4o27bo37b3o 11b4o25bo3bo32bo25b2o8bo38bo38bo38bo38bo38bo38bo38bo41bo31b2o33bo$22bo b2obo17bob2obo17bob2obo21b2o123bo24b2o25b2o42b2o32b2o6bo95b2o32b2o6bo 78b2o26b4o70b2o8bo3b2o27bo36b2o23b2o9b2o37b2o37b2o37b2o37b2o37b2o37b2o 37b2o38b2o33bo$23bo3bo18bo3bo18bo3bo22bobo121b2o26bo26bo42bo33bo103bo 33bo80bobo34bo3bo74b2o32b2o35b3o33b3o36b3o36b3o36b3o36b3o36b3o36b3o36b 3o37bo$96bob2o117bo2b2o24bobo24bobo295bo36b5o74bo34b3o33b3o33b3o36b3o 36b3o36b3o36b3o36b3o36b3o36b3o37b2o$98b2o115b2o3bo26bo26bo296bobo35b2o 111b3o379bo2b2o$217bo884b2o3bo$99bo1004bo$97b2o$97b2o$99bo4$29bo$27bo 2b2o207bobo$25b3o209b2o3b2o$24bobo13bo196bobo$24bob2o10b2o3bo148bo24bo 21bo$23bo4bo11bo2b2o145bo2b2o20bo2b2o16bo$22b2o19b2o143b3o22b3o20b2o3b o29bo21bobo22bobo16bo6b2o16bo6b2o$43bo143bobo22bobo27bo26b2o21bo2bo21b o2bo16b2ob2o2b3obo13b2ob2o2b3obo83bo34bo22bo$21bo4b2o14b2o66b2obo73bob 2o21bob2o23b2ob2o27bo19bo3bo20bo3bo16bo4bo3bobo13bo4bo3bobo7bobo72b2o 32b2o21b2o$25bo17bo62bobo3b2o72bo4bo19bo4bo23bob2o21bo3b2o19b2o23b2o 23b2o2b3obo16b2o2b3obo7bo3bo51bo16bo2bo34bo22bo$22b3o15b3o61b2o4bo20bo bo4b2o20bobo4b2o16b2o23b2o27b2obo20bo2b2obobo17bob2o21bob2o14bo11b2o 11bo11b2o10bo2b2o5bo6b2obo35b2o2b2o6bo2b2o4b2o34b5o18b5o$24bo15b2o64bo b3o20bo7bo2bo17bo7bo2bo70bo18b3o6b2o14bo24bo18b2o23b2o26bobo4b2o5bo3bo 35bo2bo8b2obo9b2o31bo3b2o17bo3b2o$26bo12bobo18bo50b2o3bobo12bo2b3o5bo 17bo2b3o5bo12bo4b2o18bo4b2o22bo2bo28b2o11bo2b2ob2obo15bo2b2ob2obo14bo 24bo27bo10bo3bo15bo23bo8bo2bo2bo4bobo2bo29bo10bo11bo$obobo3bobobo13bo 12bob4o13b2o3bo4b3o39bo4bo2bo14bo5bo2bo19bo5bo2bo16bo24bo24bo2b2o19b2o 9bo8bobo7b2obo11bobo7b2obo13b6o19b6o19b2obobo4b3o18b2o35bo2bo4bo11bo 22bo5bob2obo11bo5bobo$25bo3b2o8bobo17bobobob2o3b2o42bo3bo7b2o10b2o15b 2o10b2o16b3o22b3o26b2o16b4o2bo9bo7bo13bo10bo13bo14bo4b2o18bo4b2o17bo2b obobob4o2bo13bo2bo23b3o10b2o5bobobobo4b2o21b2obobobobo13b2obobobob2obo $4bo3bo3bo12bobo16b2o12bo2bo6bo3b2o34bobobobo10b3o3b2o21b3o3b2o25bo24b o41bob3o3b3o6bo13bobo22bobo22bo11bo12bo23b3ob2obobo14bo2b2o4b2o22bo25b o4bo23bo22bo9bo$25bo3bo11b3o13bo6bobo8b2o22b3o4bobobo15b2obo4bo20b2obo 4bo24bo12bo11bo39b2o7b4o3b2o11b2ob3o19b2ob3o22bo6bob2obo12bo6bobo15bo 4bo3b3obo9b2obo9b2o11bobobobo25b3o4b2o$4bo3bo3bo16b2o9b2obo12b2o7bo7bo 9b2o9bo2b2o4b2obobo5b2o13bo4bo23bo4bo23b2o7bo2b3o10b2o7bo2b2o11b3o25bo 5bo11bob2o21bob2o22b2obob2obobo14b2obob2obob2obo23b2o10bo2bo2bo4bobo2b o9bo42b2o$29b2o9b2o2bo16bo4bo3b2o2bo3bo2bo2bo2bo6b2o7bo84bo7bo2b2o12bo 7bo2b3o13bobo10bob2obo24b3o22b3o25bo24bo10bo38bo2bo4bo14bobo2bo26bo8bo bo2bo12b3o20b3o$4bo3bo3bo12bo3bo10b2o2bo11b2ob2o6bo3b2o2bo2b3o6bo6bo3b o6b3o21b6o23b6o24b2ob2o3bo16b2ob2o3bo4bo9bo2bobo11b2o3bo24bo2bo21bo2bo 70b3o27b2o5bobobobo10b2o25bo2bo8bo20bobo20bobo$25bobo13b2o12bo9bo9bo8b o2bo11b2o4bo2bo24b2o2bobo22b2o2bobo16bo2b2obob3o14bo2b2obob3o14bo3bo 18bo24b2obo21b2obo73bobo38bo5b2o29b2o2b2o6bobobobo10bo2bobo5b2obo8bo2b obo5b2obo$4bo3bobobo12bo3b2o23b3o6b2o11b2o3bob2o19b2o2bo18bo2b2o5b2ob 2o14bo2b2o5b2ob2o12b2o3bo3b4o12b2o3bo3b4o15bo16b2o29bo24bo23b3o22b3o 20bo2bobo38b3o3bo31bo18bo8bo3bo6bob3o7bo3bo6bob3o$26bo16bo11b2o8bo14bo 20b3o4bo16b2o3bob2ob2o17b2o3bob2ob2o10bo8bo7bo16bo7bo18b2o14bo3bo24bob o22bobo26bobo22bobo16bo3bo45b2o49b3o8bo9b2o11bo9b2o$26bo16b3obo60bo18b o3b2o3bo5bobo11bo3b2o3bo5bob2obo61b3o13b2o24bo2b2o20bo2b2o22bo2bobo19b o2bobo18bo43bo5bo61b2o6bobo12b2o6bobo$24bo17bo2bo61b2o23bo6b2obob2obo 13bo6b2obobo21bo24bo17b3o14bo24bo3bo3b3o14bo3bo3b3o15bo3bo20bo3bo21b2o 38bo2bo55bo12b3ob3ob3o12b3ob3ob3o$22b3o16b2o4bo57bo2b2o26b2o9bo17b2o 26bobo22bobo34b2o23bobo4bo3b2o12bobo4bo3b2o14bo24bo25b3o36b2o2b2o50bo 2bo12b3obo4bo13b3obo4bo$25bo14bo6bo55b2o88bo2bo21bo2bo30bo2b2o30bo10bo 13bo20b2o23b2o23b3o36bo55b2o2b2o15b3obo18b3obo$21bo4b2o12b2o4bo58bo87b o2bo21bo2bo13b3o12b2o3bo32bo4bob2obo14bo4bobo13b3o22b3o116bo22b2o21b2o $46bo147bobo22bobo16bobo11bo37b2obobo19b2obob2obo10b3o22b3o$22b2o18b3o 147bo24bo16bo2bobo83bo$23bo4bo12bo4b2o142b2o23b2o16bo3bo$24bob2o12b3o 149bo24bo16bo$24bobo14b2o192b2o$25b3o208b3o$27bo2b2o204b3o$29bo! golly-3.3-src/Patterns/Life/Spaceships/corderships.rle0000644000175000017500000001012112026730263020021 00000000000000#C Five small Corderships. #C Corderships are c/12 diagonal spaceships built from switch engines. #C The trick in constructing a Cordership is to arrange the switch #C engines in such a way that they clean up each others' debris. #C Front: A single-row, 7-engine Cordership. #C Middle: Two 6-engine constructions and a symmetric 8-engine. #C Back: The classic 7-engine Cordership, shown with classic #C rear-end glider collisions. #C All five of these Corderships were constructed by Dean Hickerson, #C who named them after the discoverer of the switch engine, #C Charles Corderman. #C From Alan Hensel's "lifebc" pattern collection. x = 244, y = 255, rule = B3/S23 95bo$78b3o8bo5bo$77bo3bo6bo7bo$78boo9b4obboo$80booboo9b3o$82boo11bobo$ 96bo7boo$96bo7boo3$88bo$87bobo$87bobo$74b3o11bo$75bo36boo$75bobbo33boo $75bobbo$76bobo$96bo$95bobo$95bobo$96bo$$75boo129bo$53bobo18boo116bobo 6bobb4o$52bo19b3o116bo9bob4o$53bobbo135bobbo6b3o3boo$55bobo14boo120b3o 9bobboo$58bo148boboo$57b3o148bo8boo$57bo159boo$39bo15boo$39bo5b3o9bo 13b3o$38bobo3boobbo6bobbo12b3o$39bo3bo5bo5bobo13boo117bo$39bo3bo11bo 14bo21b3o94b3o$44bobboo19boobbo21bo93boobbo$45boo22bo3bo19bo93boobboo 32boo$69bobbo115boo35boo$70b3o116b5o$193boo5bo$191bobbo5bo$192boo6bo3b o$203bobo$55boo147bo$55boo$42boo$42boo138bo$41boobo123bobo6bobb4o$28bo bo13bo122bo9bob4o33booboo$27bo16boob3o118bobbo6b3o3boo30boo$28bobbo12b oboobo120b3o9bobboo29boobobo$30bobo9boo3boo14boo118boboo32bobo$33bo8b oo19boo119bo4boo29boo$32b3o4bob3o9boo134boo$32bo6bo13boo$30boo$32bo$ 30bobbo175bo$30bobo176bo7bo$30bo178bo5b3o$208boo3bobo11bo$54bobo157bo bbo8bo$54bobbo131b3o21bobboo10bo$183bo3bobboo$22b3o30bobo115boo9bobob oo$23bo31b3o115boo5b5o9boo27boo4bo$23bobbo29bobo122boobb3o6boo26bobo$ 23bobbo30boobo161bobboobbo$24bobo31b3o160bo7bo$221bobb3o3bo$48bo172bob o3bobo$48bobo157b3o11bobbobbo$48boo131boo9booboo6boboobboo13b3o$181boo 9boo8bob7o$23boo167boobobo5bo32boo$195bobo38boo$196boo$b3o8boo$o3bo6bo bbo$boo9boo$3booboo181boo$5boo182boo$$131bo87boo$126bobbobobbo3bo80boo $20boo104bo4boob5o$19bobbo103bo3bo4bobo$20boo$128b3o$129bo18boo$148boo 3$26boo$7boo15bo3boboo$7boo15bo3boboo$24bo3boo106bo$25b3o107bobo18boo$ 25b3o88bo18bobbo17boo$116bo19boo$116bo$120bo11boo$15boo15bo83b3obbo10b oo$15boo15bobo80bo4bo$32boo81bo3bo$116b3o$125boo$122booboo$115bobo$ 115bobo30bobo6bobo$23boo90bobo29bo9bobo$23boo90bobo30bobbo6bo$116boo 32b3o$105boo3b4o$100b3obobbo6bo$104bobbobb5o$104bobbo$106bo$103bobo33b o$104bo33bobo$109bo$109bo28bobbo$140boo$108boo31bo$86b3o19boo$$90bo75b o$86bo3boo74boo$88bobo47boo27bo$85b3o52bo25bo$87bo15boo33boo$103boo$ 86boo$87boo10boo$87bo10bobbo$87boo10bobo$86boo12bo20bobo6bobo$120bo9bo bo22boobo$121bobbo6bo24boo$123b3o6$112bo$91boo18bobo$91boo$111bobbo$ 113boo$114bo3$139bo$99boo38boo$99boo10boo27bo$113bo25bo$111boo6$49b3o$ 48bo3bo75boobo$47bo3boo76boo$48bo$49b4o$51boboo138bobo$51bobbo137bo$ 52boo12boo125bobbo$66boo127bobo$198bo11b3o$197b3o$50bo146bo$49bobo143b oo$49bobo145bo13b3o$50bo129bo14bobbo12b3o5boo$74boo103bobo13bobo13boo 6boo$74boo119bo14bo$179bobbo3bob3o17boobbo$181bo4bo22bo3bo26bo$58bo 123boboobobo19bobbo27bobo$57bobo123boo3bo21b3o27boo$57bobo124bo$35b3o 20bo168boo$34bo3bo43boo143boo$35boo45boo$24b3o10booboo26bobbo119bo$23b o3bo11boo27bobbo119bo5b3o$22bo3boo39bo122bobo3boobbo$23bo46bo120bo3bo 5bo$24b4o37boo124bo3bo$26boboo35booboo126bobboo25bo8boo$26bobbo36boo5b obo91bobo27boo26bobo7boo$27boo43bo93bo58bobo$73bobbo90bobbo54bobbo$75b obo91bobo54bobo$34boo42bo93bo56bo$26bo6bobbo40b3o91b3o54boo$26bo7boo 41bo93bo56bo$25bobo47boo92boo$26bo50bo93bo$26boo36bo10bobbo90bobbo31bo $26b3o34bobo9bobo91bobo31boboo$75bo93bo36boo$24bo4boo11boo19bobbo134bo 6bo$24bo5bo10bobbo20boo133bo3b4o$24bo5bo11boo22bo134bo4bo$29bo3$207b3o $63boo141bo3bo$65bo13bo17b3o107boo$29boo32boo14bo17b3obbo70boo34booboo $29boo48bo16boo3boo70boo36boo$101bo$94bo$48bobo13boo27b4o103bo$47bo16b oo26bo4bo101bobo$48bobbo41b4obo100bobo$50bobo34bo10bo100bobbo$37boo14b o10bo22bo9boo82boo17bobo$37boo13b3o8boo22bo93boo20bo$52bo12bo29bobbo 103boo37b3o$50boo43bobbo103bo38bo$52bo13b3o26b3o144bo$50bobbo12b3o4b3o $50bobo13boo$50bo14bo29bo$45boo16boobbo27bo93boo29boo$45boo17bo3bo26bo 93boo28boo$64bobbo153bo$65b3o$$81b3o15$218bo$217boo$217bobo! golly-3.3-src/Patterns/Life/Spaceships/diagonal.rle0000644000175000017500000000554312026730263017266 00000000000000#C Sample c/4, c/5 and c/6 diagonal spaceships #C Tiny one in front: the glider. #C Top right: Hartmut Holzwart's 'Orion', simplified by Jason Summers, #C followed by 'Canada goose' by Jason Summers. #C Middle: sample c/4 grammar by Hartmut Holzwart. #C Bottom left: 'Swan' by Tim Coe. #C Bottom, left to right: #C an asymmetrical c/5 spaceship by Nicolay Beluchenko, 11 Jul 2006; #C a symmetrical c/5 spaceship found by Jason Summers, 9 Jan 2005; #C and the original large c/5 found by Jason Summers. #C Far right: 'Seal', found by Nicolay Beluchenko, 18 Sep 2005. #C From Alan Hensel's "lifebc" pattern collection. x = 114, y = 92, rule = B3/S23 67b2o17b3o$66b2o18bo9b2o$68bo18bo6b3obo$70bo4b3o11b2o2b2o$70b3o4b2o11b o$71b3obobo16bo$78bo11b2o3bo$71bobo15bobob2o$70b2obo15bobo2bob2o$71bo 16bo4b2o$69b2obo15b2o$21b2o49bo15b2o$21bobo46b2o$21bo4$49b2o$48b2o$50b o$46bo6bo28b2o$45b2o4b2o7bo20b3ob3o$45bobo7bo3b4o20bo3b2o$49bo4b2o2bo 2b2o17b2ob2o2bo2bobo$49bo7b2o4b2obo13bo6bob4o$41b2o5bo7bob2o4bobo19b2o bo2bo$40b2o9bo3b3o6bo2bo12bo4b2o3bob2o$42bo7b2o2bo2bo22b2o8bobo2bo$38b o6bo7b2o8b2o15bo2b5ob3o4bo$37b2o4b2o7bob2o9bo15bo9bo4bo$37bobo7bo3b3o 27b2obo2bo3bo3bo$41bo4b2o2bo2bo28bo9b2o$41bo7b2o38b2o2b2o4bo$33b2o5bo 7bob2o30bo3b2obo4b3o2bo$32b2o9bo3b3o33b2obob5o5bob2o$34bo7b2o2bo2bo37b 2ob2ob2ob2o2b3o$30bo6bo7b2o50bobo4bo$29b2o4b2o7bob2o40b2o4bobo3b6o$29b obo7bo3b3o47bo7b2o$33bo4b2o2bo2bo47bo3bo$33bo7b2o32b2o16bo4bo3b3o6bo$ 25b2o5bo7bob2o23b2o4b2obobo15b5o3b2ob2o2b2ob2o$24b2o9bo3b3o24b3o4b4o 20b2obo2bob2o2bo$26bo7b2o2bo2bo23b2o6b2o5bo15b2o5bo4bo2b3o$22bo6bo7b2o 25b2o2b2o3bo2bo2bo15b3obobobobo$21b2o4b2o7bob2o23b2o5bo7bo2b2o19bo2bo$ 21bobo7bo3b3o25b2obo3b4o24bobo$25bo4b2o2bo2bo28bo3b2o2b2obo21bo$25bo7b 2o32b3o4bobo$24bo7bob2o32b2o3b2o2bo23b3o$27bo3b3o34bo5bo26b3o$26b2o2bo 2bo29b4obo2bo2bo3bo$29b2o32b3o3b5o2b7obo15b2o$28bob2o30bobo4bo10bo2b2o 15b2o$27b3o32b3obo3bo3bo5b3o18bo$26bo2bo22b2o15bobo2bo7b2o$25b2o24bo2b o8bo3bo5b2o8b2o2bobo$26b2o23bobo12bo7bo8b3obob3o$26b2o23bo13bo8b3o6bo 4bo$28bo3bo19b2obo11bo6bobo5bobo$28b3obo22b2obo8bo6bob2o3bo4bo$33bo19b o2bo2bobo13bob4o3bo5bo2bo$28b2o25b2ob2o2bo11b2o2b2obobo3bob3o$30bo22bo 3b3o2bo16bo6bo2b3o3b3o$43b3o7bo4bo23bo2bo6b2o$2obo7b3o28bo3bo8bo3bo18b 2o4bo2bo10b2o$o3bo6bo30bobobobob2o4bo23bo13bo3bo$o4bo7bo7b2o20bo11bo2b 5o15b2o4b2o8bo$2b2o7bobo4b2obo24b2obo2bobo7bo16bo3b3o8bobobobo$4bobo4b 3obo2b2o27b3o3bo6bo2b2o14bo4b2o8bo5b2o$10bo3b2o2b2o18bo11bo35bo8bo2b3o $6b2ob4ob2o21b2o8bob3o2bo5b3o20bo2bo8bo8bo$7b7o22bo11b3obobo33b4o8b2o 3bo$35bobob2o13bobobo26bo6b2o6b2o3bo$34b2ob5o6bo5bo3bo26bo4bo12bo$33bo 8bo6b2o3b2o2bo26bo15bo$33bo6bob2o12bo30b2obobo7bo2bo$33bo5b2obo13bo30b o4bo9b3o$34b3o5bo47b3ob2o2bo3bo3bob2o$34bo2bo4b4obo43bo2b2obo5bo3bo2bo $37bo5bo2bo52b2o2bo3bo$38bo4b2obo49bob2ob2obo2b2o3bo$44bob2o45bo5bo3bo 7bobo$45b2o47b2o12b2o3bo$43bo2bo53bo7b2o$43b3obo3bo49b3o3b2o2bo$49b2ob o47bo2bob3o$44bo4bo2bo47bo4b2o$44b2o3bo51bo$104bo2bo$46bo56bo$47b2o55b 2o! golly-3.3-src/Patterns/Life/Spaceships/Cordership-boat-burner.rle0000644000175000017500000002132212026730263022021 00000000000000#C diagonal period 576 c/12 spaceship in which a glider consumes #C boats laid down by Cordership puffers: David Bell, 29 Feb 2004 x = 619, y = 638, rule = B3/S23 115bo$115bo$117bo5bo$116bo6bobo$115bo3bobbo$116bobboboboo$121boboo$ 135boo$135boo6$123bo$122bobo18boo$122bobbo17boo$123boo$$90bo11bobo14b oo21bo$89boo10bobbo14boo20boo$88boboo10bobo35boboo$88bobboo47bobboo$ 86b4ob3o17boo25b4ob3o5boo$85bobbobobboo9bo5bobbo23bobbobobboo4boo$86bo bobob3o8boboo4boo15bo9bobobob3o$87boob3obo8boboo20bo11boob3obo$87b4obb obo6bo3bo32b4obbobo$90bo3bo8b4o35bo3bo$90bo3bo8b3o36bo3bo$90bobbo48bo bbo$117boo3boo$106bo13bo$106bo9boob3oboo$106bo9b3obob3o$91boo50boo$ 108bo35boo$107bobo32b5o$108bo33b6o$143boobbo$96boo47b3o$95bobbo45bo$ 88b3o4bobboo44bobo$94bobboo43boobbo$94b4o31bo13b3o$128bobo$127bo3bo7bo $127bo3bo5booboo11boo$127bobob3o6bo12boo$128boobobbo4b3o$94boo36bobo$ 94boo36boo4$161boo$156boo3boo$155boboo$102boo50boobobo$102boo50bobbob oo$123bo34boo$122bobo26bo3b4o$93bobo25booboo24bo$84bob3o4bobo25boo27b 3o$82boobo4bo5bo30boo$84boo4bobbobbo24b3obbo$90bobbobbo13boo13boboo$ 89bo4bo15boo11bobbo$85bobbo16boo19bo$86boo17boo17boo$$124bo$122booboo$ 119bobo3bo$118bob3o$118bobo3bo$113boo$113boo$100bobobboo$86bo4bobo6bo bboobbo$85bobobboobboo7boobbo$85bob4obbobo5boobbobo$86bo6bobo$90bob3o 193b3o$297bo$80bo8bo200boo5b3o$76b5o7boo200b4o4bo$76bo3bobo4b3o200boob 3oboo$76b3o3b3o3b3o204bobo$82boobb3o220boo$82bo226boo$79b3o$63bobo13b oo$54bob3o4bobo69bo$52boobo4bo5bo67bo$54boo4bobbobbo67b3o$60bobbobbo 230bo$59bo4bo12bo218bobo18boo$55bobbo16booboo216bobbo17boo$56boo17boob oo217boo$76bo$79bo196bobo14boo$77boo184b3o10b3o14boo20b3o$78bo183bo13b oo36bo$262bo3bo47bo3bo$76bo183boo3boo18boo25boo3boo6boo$73bo185bobbobo bbo11bo4bobbo13bo9bobbobobbo5boo$72b3o184bobbobobboo8bobo5boo15bo8bobb obobboo$71boobo3bobo180booboobbo8b3o20bobo10booboobbo$56bo4bobo6boo6b oo182bo4bo12bo33bo4bo$55bobobboobboo3boo8bo185booboo6b5o36booboo$55bob 4obbobo5bo192b4o48b4o$56bo6bobo199boo50boo$60bob3o12bo213boo3boo$78bo 212bobbobbo$279b3o8boob3oboo$75bobbo186bo25bo5bo19bo$266bo51bo$63boo 164bo35bo16bo33bobbo$63boo160boobobo7bo42bobo35bo$225bobbooboobbooboo 42bo33boobbo$225bo5bobo5bo77bobboo$226boobbo8bo30boo43bo3boo$74boo154b obb3obbo24bo5bobbo$74bobo153b3o15boo13bo5bobbo42bobb3o$75bo43bo128boo 13bo4booboo44boboo$118bo150boo46boo$118b3o181b3o$302b3o7bobo$73bo227bo 3bo5bobbo12boo$74bo227boob3o4bobo7bo4boo$74bo7boo218boo4bo5boo6bo$82bo bo171boo10boo35bobbo$83bo161bo3boo5boo10boo36boo$93b3o137bobbo6booboob oo$63b3o27bo142b3o3bo7bo$94bo133boo3boob4o3bo6boo$67bo160boo9boo4boobb oo84boo$63bo3boo12bo163boobboo79bo4boo$65bobo13boo7boo237boboo$62b3o 16bobo6bobo138b3obo40boo51bo3bo$64bo26bo130bo9boo42boo51boobbo$80boo 136b4oboo4boobo96booboo$63boo16boo134boob3oboo3b3o64b3o27bo3boo$64boo 14bobbo134bob3obo42boo27bobo25boo$64bo15b3o5boo129bo3b4o4boo24bo3boo4b 3o26bobo26boo$64boo22boo132boob3o29boboobbo6bo25bo4boo$63boo33boo123b 5o29bobb5obb4o24b3o3boo$98bobo98bo24bo36b3o3b3o14boo15bo$99bo95boobobo 7bo51b3o21boo11b4o$195bobbooboobbooboo50boo17boo17boo$195bo5bobo5bo10b o39bo18boo17bo$196boobbo8bo9bobo$79boo119bobb3obbo90bo$78bobbo14boo 102b3o18boo74bobo$78bobboo9bobboboo119b3o75b4o$79bo3bo8bo5boo192b3ob3o $57bo13boo5bobbo10bobob3o4bo188boo4bo$57bo11boboobob4oboboo11boo4bo 184boo$57bo11b4o3b4obo3bo10boo4b3o182boo$60boo8bobboobbobb4obo130bo49b o8boobbo$60boo13bo4bobo132b3o47bobbo5b3obboo$55bo3b3o16b3o133b3obo40b 3obbo3bo6boobb3o$56b3o18bobo133bo4bo40b3obbo4bo5boobboo$57bo25bobo117b obbo10bo45bo3boo$33b3o20boo26bo121b3o3boo6bobo44boo$56b3o139boo3boob4o 10boo42boo$37bo20bo139boo9boo10bo38bobo$33bo3boo12bo4bo194bob3o4bobo$ 35bobo13boo5bo33b3o154boobo4bo5bo$32b3o16bobobb3o33bobo110bo45boo4bobb obbo$34bo57bobo14boo146bobbobbo$50boo40bo4boo9bobbo144bo4bo$33boo16boo 38b3o3boo10b3o140bobbo$34boo14bobbo43bo12boo94boo29boo14boo$34bo15b3o 40b4o13bo95boo19bo3boo4b3o70bo$34boo58boo12boboo115boboobbo6bo67boo$ 33boo59bo13b4o115bobb5obb4o68boo$108bobobo118b3o3b3o$95bo13booboo3boo 111b3o18bo$93bobo12bo3bo4boo111boo18bobo$92b4o13b3o118bo18booboo$92b3o 15bo141bo$49boo43bo156boo$48b3o200boo$48bobbo56boo$49b3o55bobbo105boo 31bo3bo$38boo9b3o54bo109bobo31bo3bo$38boo65bobbo108bo33bo$105bo23bo 116b3o5bo$105b3o21bo106bo8bobbo3bo$86bo10bobo135bobbo5bo7b3o$85bobo8bo bbo129b3obbo3bo5bobbo$84booboo7bobb4o126b3obbo4bo4bobo$84boo10bob5o4b 3o123bo3boo$46boo42boo5b3obo7bo127boo$46boo36b3obbo18bo125boo12bob3o$ 88boboo157b4o$86bobbo40boo118boo$62b3o24bo40bobo$62bobo22boo42bo105boo $23bo38bobo14boo156boo$22boboo36bo4boo9bobbo5bo$26bo34b3o3boo10b3o3boo boo58boo$20bo3bobbo39bo12boobbo3bo59bobo$18bo9bo11b3o20b4o13bo3bo64bo 98boo$18bo4boobboo35boo12boboo3bobo50boo108bobo$27boo35bo13b4o56bobo 108bo44bo$20bo5bo51bobobo56bo152boo$21bo4b3o36bo13booboo49boo158boo$ 22bo4boo12b3o5boo12bobo12bo3bo49boo114boo$24b4o12booboo4boo11b4o13b3o 52bo$39boboboo17b3o15bo166b3o$39bo3bo20bo191boo$40bobbo102boo108bobo$ 40b3o103bobo108bo$147bo120boo$19bo57b3o187boo$19bo5b3o29boo19bobo188bo $18bobo3boobbo28boo18bobbo$19bo3bo5bo47bobbo$19bo3bo8bo34boo8bobo$24bo bboo3bo34boo8bobbo$25boo5bo3bo41boo$35bobo41bo$36bo112boo$23bo41boo81b oo$22bobo40boo83bo$22bobo$23bo51boo195boo$75boo195bobo$3bo269bo$4o27b 3o250boo$34bo248boo$33bo39bo51boo137boo19bo$18boo52bo53boo136bobo$3bob o12boo11bobo40bo50bo139bo$4bo55bobo$bboo10boo17bo26bobobo6bobo$bbobbo 7bobbo17bo24bobboobo4b3o$booboo8bobo14b3o26boo3boboboobo$15bo44boo3boo b5o$46bo17boboo3boo$45b3o15bobo$44boobbo$43boobboo$44boo$45b5o$49boo$ 47bobbo$48boo43boo$6boo86boo100boo$6boo85bo102bobo$23bo173bo$22boboo 19b3o$26bo18bobbo$20bo3bobbo17booboo$18bo9bo17bobo$18bo4boobboo6boobo 3boo$14boo11boo5bo4bo3bo$14boo4bo5bo7bo5booboo$21bo4b3o5bo4bo3bo$22bo 4boo6bo3bobbo$24b4o8booboo$38bo$$61boo$22boo38boo$22boo37bo323bobo$46b oo336bo$46boo8b3o326bobbo$56b4o327bobo$55bobboboo328bo11b3o$55bobooboo 327b3o$55bo4bo328bo$57bobbo326boo$57b3o329bo13b3o$54boo331bobbo12b3o5b oo$54boo331bobo13boo6boo$387bo14bo$400boobbo$401bo3bo9bo$312boo87bobbo 10bo$312bobo87b3o7bo$313bo94boo6bo$409b4o$202bobo208bo3bo$201bo195bo 16bo$202bobbo190bobo16bobo$204bobo184boobbooboo4b3o9bo$207bo11b3o169b oobb5o4b4o$206b3o190bo3boobboo$206bo170b3o17bo6boobo$204boo175bo15b3o 4b3o$206bo13b3o158boo14b3o5bo$204bobbo12b3o5boo151bobbo$204bobo13boo6b oo152bobo$204bo14bo162bo$217boobbo133bobo23boo11boobo$218bo3bo9bo11boo 108bo25bobo12boo$218bobbo10bo11bobo108bobbo23boo$219b3o7bo15bo111bobo 19boo$225boo6bo126bo11b3o6bo$226b4o129b3o$230bo3bo124bo$214bo16bo125b oo$213bobo16bobo124bo13b3o$208boobbooboo4b3o9bo123bobbo12b3o$208boobb 5o4b4o132bobo13boo$216bo3boobboo131bo14bo$194b3o17bo6boobo145boobbo$ 198bo15b3o4b3o147bo3bo$198boo14b3o5bo148bobbo$198bobbo170b3o$199bobo$ 199bo$172bobo23boo11boobo54boo$171bo25bobo12boo54bobo$172bobbo23boo68b o$174bobo19boo163boo$177bo11b3o6bo162boo$176b3o$176bo77boo$174boo68bo 3boo4b3o$176bo13b3o51boboobbo6bo$174bobbo12b3o51bobb5obb4o$174bobo13b oo56b3o3b3o$174bo14bo57b3o119boo$187boobbo55boo17boo101boo$188bo3bo54b o18boo$188bobbo168boo$189b3o168bobo$361bo3$381boo$274boo105boo$178boo 94boo$178boo73bo8boobbo$252bobbo5b3obboo111bo$246b3obbo3bo6boobb3o109b 3o$246b3obbo4bo5boobboo109b4o$250bo3boo124bobo$254boo124boo$251boo126b obo$186boo59bobo125booboo$186boo50bob3o4bobo126b3o$236boobo4bo5bo41boo 83bo5bo$238boo4bobbobbo41bobo88bo$181b3o60bobbobbo42bo$180bo62bo4bo$ 180bo3bo54bobbo$178boo3boo39boo14boo140bo$177bobbobobbo28bo3boo4b3o$ 177bobbobobboo27boboobbo6bo51bo$179booboobbo27bobb5obb4o50boo7boo$180b o4bo32b3o3b3o51bobo6bobo$183booboo29b3o18bo49bo$182b4o31boo18bobo$183b oo13boo17bo18booboo$198boo39bo$238boo$238boo$183bo111boo$184bo51bo3bo 54bobo19boo$183bo53bo3bo54bo19bobo$238bo78bo$206boo25b3o5bo$206boo15bo 8bobbo3bo$222bobbo5bo7b3o$181bo16boo16b3obbo3bo5bobbo60bo$181bo34b3obb o4bo4bobo60boo7boo$170bobo8bo3bo34bo3boo68bobo6bobo$170b3o11bobo37boo 78bo$170boo13bo35boo12bob3o$214boo20b4o$214boo21boo$173bo$171bobo50boo 182boo$171b3o50boo68bo113bobo$174bo119boo113bo$170b5o118bobo$154b3o$ 163bo58boo$156boo5b3o14boo40boo12bo$156b4o4bo14bobbo53bo$156boob3oboo 15boo$161bobo$235boo$$214b3o17b3o$214bobo$175boo37bobo$175boo37bo4boo$ 213b3o3boo$171boo46bo42bo77boo$170bobbo41b4o43boo76bobo$165boo4bobo42b oo43bobo77bo$168bo3bo43bo$158bo4boo4boo252bo$158bo3boo6bo46bo204bobo$ 158bobb3obboobbo10b3o9b3o16bobbobo204boo$166boobo10bo12b3o14b3ob4o$ 180bo3bo7bo3bo7bobo4bob4o$178boo3boo8boob3o5bobbobb3o3bo$177bobbobobbo 7boo4bo4bobob6o$177bobbobobboo9bobbo9bobboo$179booboobbo10boo11b3o$ 163boo15bo4bo25bo$163boo18booboo$182b4o$183boo45bo$230boo133boo$229bob o132bobo$365bo$$171boo$171boo$195boo$195boo7$203boo251boo$203boo251bob o$457bo15$388boo$388bobo$389bo$$471bo$470bobo$470boo11$413boo$412bobo$ 413bo12$504boo$504bobo$505bo15$436boo$436bobo$437bo$$519bo$518bobo$ 518boo11$461boo$460bobo$461bo12$552boo$552bobo$553bo15$484boo$484bobo$ 485bo$$567bo$566bobo$566boo11$509boo$508bobo$509bo12$600boo$600bobo$ 601bo15$532boo$532bobo$533bo$$615bo$614bobo$614boo$$616b3o$616bo$617bo 7$557boo$556bobo$557bo29$580boo$580bobo$581bo! golly-3.3-src/Patterns/Life/Spaceships/2c5-orthogonal.rle0000644000175000017500000021764013451370074020261 00000000000000#C All known 2c/5 spaceships up to 90 bits #C Spaceships found by Dean Hickerson, Hartmut Holzwart, David Bell, #C Robert Wainwright, Paul Tooke, Stephen Silver, Tim Coe, Josh Ball, #C Matthias Merzenich, Aidan F. Pierce, Arie Paap, and "Bullet51". x = 1347, y = 760, rule = B3/S23 562bo3bo$562bo3bo$561bobo$560b3o2b2o$231bo20bo290bobo$229b2o3bo15b2o3b o284bo4bo17b2o$229b2o2bo16b2o2bo284b3o4bo16b2o$229b4obo15b4obo282bobo 22b2o$537b2o2b2o4bo$515bo22b2o2b5o12b2obo$226b2obo17b2obo230b3o31bo3b 2obob2o32bobo2bo$225bob2obo15bob2obo229bo2b2o28bo4bobo2bo32b2o3bo17bo 34bo34bo34bo$210bobo12bo3bo16bo3bo230b2ob2o29b2ob3o3bo33bobobo16b4o31b 4o31b4o31b4o$27bo180b3o3bo10bob2o17bob2o233b2o30b2obo5bo13b2o2b5o12b2o b2o14bo2b2o30bo2b2o8b2o8b2o10bo2b2o30bo2b2o$obobo3bobobo13bobo141bobob o3bobobo19b2o3bo5bo12b2obo17b2obo209bobobo3bobobo11bo5bo29bobobo12b2o 2b2o4bo14bo15bo5bo28bo5bo5b2o8bo2bo9bo5bo28bo5bo6b2o8b2o$25bo3b3o169bo 4b2o21bobo18bobo231b2obo3bo25b2o6bobo10bobo37bo4bo5b2o22bo4bo5bob2o2b 2o3b2o11bo4bo29bo4bo6b2o8bo2bo$4bo3bo3bo13bob3o139bo7bo17bo2bo2bo3bo4b o17bobo18bobo211bo3bo15bo2b2o31bobo16b3o4bo18bo13bo6b2o3bo22bo6b2obo5b o5b2o11bo9b2o23bo9bob2o2b2o3b2o$27b2o163b2ob2o3bo3b2obo2bo278bo31b4o3b 2o10bo4bo19bobo12bo2bo2bobo8bo17bo2bo2bobobo4b4o16bo2bo2b2o3bo23bo2bo 2b2obo5bo5b2o$obobo3bo3bo157bobobo3bobobo8b2obo5bo2b2o21bo3bo15bo3bo 213bo3bobobo12b3obo31bo6b3o12bobo18bo2bo12b3o3bobobo4b4o16b3o3bobo8bo 17b3o3bobo8bo17b3o3bobobo4b4o$23b2obo165bo2b5obo2b2obobo16bo3bo15bo3bo 235bo4bo29b4o3b2o35bobo10bob3o3b2obo5bo5b2o10bob3o3b2o3bo21bob3o3bobob o4b4o14bob3o3bobo8bo$4bo3bo3bo9bobo2bo142bo3bo7bo10bo6bo6bo2bo14bobo 17bobo216bo3bo3bo14b4o7b3o19bobo42bo10b4obo7bob2o2b2o3b2o9b4obo7b2o20b 4obo4b2obo5bo5b2o8b4obo4b2o3bo$21b2o3bo167b3ob3o6bo2bo13b3o2b2o13b3o2b 2o240bo2bo2bob2o16b2o6bobo13b7o27bo2bo2bo8b2o8bo2bo6bo2bo2bo28bo2bo2bo 7bob2o2b2o3b2o8bo2bo2bo7b2o$obobo3bobobo9bobobo143bobobo3bobobo13bobo 3bo5bob2o252bo3bobobo17bo6bobo20bobobo16bo6bo13bo11bo16b2o8b2o6bo34bo 15b2o8bo2bo5bo$23b2ob2o174bo5bo18b2o18b2o242b2ob5ob2ob2o10b2obo5bo16b 2o3bo12b2ob2o11bo2bo31bo2bo31bo2bo12b2o8b2o7bo2bo$26bo184bo15b2o18b2o 239b2o5bo5b2obo10b2ob3o3bo18bob2o11bobobo13b3o32b3o32b3o32b3o$227b2o 18b2o239bo4bo8bobob2o6bo4bobo2bo21b2o9b2o3bo15b2obo31b2obo31b2obo31b2o bo$488b3ob2o9b2obo8bo3b2obob2o20bobo9bobo2bo16bo34bo34bo34bo$223b2obo 16b2obo259b2o7bo29bo13b2obo$222bobo2bo14bobo2bo296bo4bo$221b2o3bo14b2o 3bo297bo5bo12b2o$222bobobo15bobobo297bo2b2o14b2o$223b2ob2o15b2ob2o297b 4o14b2o$226bo19bo299bo$560b3o2b2o$561bobo$562bo3bo$562bo3bo3$26bo3bo$ 26bo3bo$25bobo$obobo3bo3bo11b3o2b2o2$4bo3bo3bo14b2o$27b2o$obobo3bobobo 14b2o2$4bo7bo10b2obo$22bobo2bo$obobo7bo8b2o3bo523bo21bo$22bobobo522bob o19bobo$23b2ob2o216b2o14bobo21bo3bo259bo3b3o15bo3b3o$26bo216b6o11bobo 21bo3bo260bob3o17bob3o25b2o2bo20b2o2bo$242bo3bo10b2obo22bobo264b2o20b 2o27b3o22b3o$242bo4b2o7bob2o22b3o2b2o308b3obo20b3obo$242bo2bo10bo3bo 285b2obo18b2obo24bobobob3obo14bobobob3obo11b2o2b2o$218bo2bo34bob2obo 23b2o231b2ob2o4b2o3b3o10bobo2bo16bobo2bo23bo3b6o15bo3b6o11b2o$218bo3bo 21b2o11b2obo24b2o230bobo5b2o3bob2obo8b2o3bo16b2o3bo24bo24bo21bob2o$ 197bobo17bo3b2o21bo40b2o217b2o10bo8b2o4bob3obo7bobobo17bobobo25bobo22b obo14bo6bo$194bo4bo8bo9b2o41bo237bo2b4o9bo9b5o5b2o9b2ob2o17b2ob2o19bo 24bo21bo$193b3o4bo5bo3bo7b2ob2o17b2obo17b2o18b2obo210b2o2bo2bobobo9bo 4bo6b3o18bo21bo20bo3bo20bo3bo16bo$170bobobo3bobobo9bobo15bo10b2obo14bo b2obo35bobo2bo174bobobo3bobobo21b2obo4bo2bo11b2o3b3o66bobo22bobo20b2ob ob2o$191b2o2b2o4bo2bo19b2o2bo10bo3bo15bo2bo16b2o3bo204b2o4bob3o2bob2o 20bo25bo21bo15b3o2b2o18b3o2b2o17b2o5b2o$170bo7bo13b2o2b5o3bob3o16bobo 4bo6bob2o16bo4b2o14bobobo179bo7bo28b2ob2o10bobobo4bo26bobo2b2o15bobo 64b4o$203bo2bo15b5ob5o7b2obo15bo3bo17b2ob2o202b3o5b2o4b2o11bo4bo3bo26b o2bo2b3o13bo2bo2b3o11b2o23b2o24bobo$170bobobo3bobobo20bobo16bo2bo17bob o14b6o18bo179bo7bo13b2o8bo18bob4o31bobo19bobo2b2o12b2o23b2o26bo$27bobo 173bo18b5ob5o10bobo15b2o221b3o28b2o35bo21bo17bo24bo26bobo$24bo4bo140bo 3bo3bo3bo9b2o2b5o3bo2b2obo14bobo4bo50bo180bo7bo10bo7bo3b3o91bo24bo26b 4o7bo$23b3o4bo160b2o2b2o4bo2bo3b2o14b2o2bo50bo202bo2b4o3bo2b2o24bo27bo 21bo16bo2b4o18bo2b4o19b2o5b2o2bobo$o3bo3bo3bo9bobo145bobobo3bobobo9bob o10bo15b2obo16b2o15b2o17b2o3bo181bo7bo8b2obo7b2ob2o24b2o23b2ob2o17b2ob 2o15bo2b4o18bo2b4o19b2obob2o4bo$21b2o2b2o4bo161b3o4bo17b2ob2o18bo2b4o 10bo2b4o12b2o2bo200b2ob2obobob2o20b2o5b2o22bobobo17bobobo16b2o23b2o23b o11b3o$o3bo3bo3bo9b2o2b5o163bo4bo18b2o21bo2b4o10bo2b4o12b4obo203bobob 2o21b2o2bo4bo21b2o3bo16b2o3bo67bo12b3o$197bobo17bo3b2o19bo16bo229bo24b obo3b2o23bobo2bo16bobo2bo66bo6bo4b2o2bo$obobo3bobobo205bo3bo22bo16bo 252bo2bo27b2obo18b2obo71bob2o5bob2o$218bo2bo24b2o15b2o9b2obo238b2o71b 2o2b5o18b2o2b5o17b2o9b4o$4bo7bo9b2o2b5o215b2o15b2o8bob2obo271b2o20b2o 14b2o2b2o4bo16b2o2b2o4bo17b2o2b2o$21b2o2b2o4bo241bo3bo272b2o20b2o15bob o24bobo$4bo7bo9bobo218b3o2b2o10b3o2b2o6bob2o273b2o20b2o16b3o4bo19b3o4b o$23b3o4bo213bobo14bobo10b2obo313bo4bo21bo4bo$24bo4bo215bo3bo12bo3bo 10bobo267b3o2b2o15b3o2b2o18bobo24bobo$27bobo215bo3bo12bo3bo10bobo268bo bo19bobo$549bo3bo17bo3bo$549bo3bo17bo3bo11$27bobo16bobo$24bo4bo13bo4bo $23b3o4bo11b3o4bo607b2o$22bobo16bobo613bo2bo$21b2o2b2o4bo8b2o2b2o4bo 605bo3b2o12b2ob2o14b2ob2o16b2ob2o17bo24bo$22b2o2b5o10b2o2b5o587b2ob2o 13b3o2b2o11bo18bo20bo20b2o3bo19b2o3bo$obobo4bo626bo19b2o14b2ob2o14b2ob 2o16b2ob2o17b2o2bo20b2o2bo$635b2ob2o17bo15bo3bo14bo3bo16bo3bo16b4obo 19b4obo$o8bo610bo15bo3bo16b2obo15bo18bo20bo$21b2o15b2o579b5o15bo21bo 10bo18bo20bo$obobo4bo11bo2b4o10bo2b4o160b2o2bo408bo5bo10bo20bo13bo18bo 20bo20b2obo21b2obo$21bo2b4o10bo2b4o160b3o278b2o2b3ob3o122b2o12bo20bo 14b2ob3o13b2ob3o15b2ob3o15bob2obo19bob2obo$4bo4bo12bo16bo161b3obo126bo 152b2o21b2o2bo6bo60bobo40bo8b2ob3o15b2ob3o9b2o17b2o9bo9b2o9bo10bo3bo 20bo3bo$25bo16bo157bobobob3obo88bo31bobo152bob2o2b3o2bo9b3o2b2o2bobobo 56bo4bo37b2o9b2o9bo9b2o15b2obo15b2obo5b2o10b2obo5b2o10bob2o21bob2o$obo bo4bo16b2o15b2o155bo3b6o65b2o8bo12bobo29bo3b3o145bo6bo3b3o2bo7bo7b4o2b o3bo17b2o32b3o4bo24b2ob2o4b2o13b2obo5b2o10b2obo13bo18bo6b2obo10bo6b2ob o10b2obo21b2obo$26b2o15b2o155bo24bo7bob2obo34b2o3bo5b2o11bo3b3o27bob3o 146bo14bobo7b2ob5o3b2o3b2o13b2ob3o31bobo29bobo5b2o4bo11bo6b2obo10bo17b 3o16b3o18b3o19bobo22bobo$170bobobo3bobobo18bobo20bobo6bobo3bo22bo7bobo bo4bo3b2obo11bob3o29b2o126bobobo3bobobo8bo6bo8b3o8b2o10b3o14b2obo25bo 7b2o2b2o4bo7b2o12bo8b2o4bo13b3o18b3o14b2o17b2o4bo14b2o4bo14bobo22bobo$ 23b3o2b2o10b3o2b2o149bo14bo11bo3b3o2bobobo7bo16bobo6bobobo3bo2bo17b2o 181b2obobo9bo12b2o11bo14bobob2o2b2o9b2o4bo3bo7b2o2b5o7bo2bo10bo9b6o15b 2o4bo14b2o84bo$24bobo14bobo126bo11bo13bo3bo23bob3o3bobo5bob2o4bo11bo3b 3o2bobo5bob2o4bo42b2obo132bo3bo3bo9b2o5bobo23bo4b2o17b2ob2o12bo3bo2bo 3bo19bob2o15bo4bo6b2o56bo18bo20bo20b2o3bo2bo16b2o4bobo$25bo3bo12bo3bo 148bobo11b2obo12b2o6bobobo3bo2bo16bob3o3bobobo7bo13b2obo28bobo2bo151b 8o20bo7bo3bo17bo2b2o3b2o4bo4bobo3bo17b2o3bobo14b2o3b3o24bo20bo14b2o17b 2o19b2o20b3o2bo19b3o2bo$25bo3bo12bo3bo123bobobo7bo11b3o2b2o9b2o21bobob o4bo3b2obo12b2o6bobo3bo17bobo2bo8b2o8bo7b2o3bo132bo3bobobo40b3o4bo3bo 17bobo5bobob3o4b2o4bo19bo2bo25bo21b2o19b2o15bo18bo20bo20b2o4bobo16b2o 3bo2bo$211bo9b2obo11b2o3bo5b2o21bob2obo17b2o3bo7b2o3bo5b2o8bobobo4bob 2obo142b8o29bobo18bo3bo8bob2o7bo8b2o2b5o5b2ob2o12bobobo4bo23bo20bo107b o$170bo3bo7bo14b2o21bobo2bo12b2o8bo9b2obo32bobobo4bobobo4bo3b2obo8b2ob 2o3bobo3bo121bo3bo3bo9b2o5bobo51bob2ob2obo2bo4bo2b4o8b2o2b2o4bo5b2o13b o4bo3bo58b2o4bo12b2o17b2o19bo3bo20bo3bo$197b2o20b2o3bo32bobo2bo32b2ob 2o3bobobo3bo2bo16bo3bobobo7bo134b2obobo33bobo20bo7b2o8bo2bo9bobo27bob 4o25b2o4bo12b2o15b3o16b3o16b6o16bo3bo20bo3bo$170bobobo7bo14b2o21bobobo 31b2o3bo36bo3bobo5bob2o4bo16bobo5bob2o4bo112bo3bobobo8bo6bo31bo42b3o 10b3o4bo8b2o11b2o28b3o16b6o10bo6b2obo8bo19bo3bo17bobo22bobo$221b2ob2o 31bobobo40bobobo7bo21bobobo3bo2bo134bo37bo3b6o34bob2o9bo4bo9b2o39bo6b 2obo9bo3bo11b2obo5b2o8b2obo17bo4b2o14b3o2b2o18b3o2b2o$193b2obo27bo33b 2ob2o40bobo3bo26bobobo4bo3b2obo129bo6bo30bobobob3obo34bo14bobo8bo3b2o 14bo20b2obo5b2o10bo4b2o8b2o9bo7b2o20bo2bo$192bobo2bo63bo41bob2obo30b2o 3bo5b2o134bob2o31b3obo66b5o14b2o18b2o9bo10bo2bo12b2ob3o13b2ob3o39b2o 23b2o$191b2o3bo144b2o8bo133b2o38b3o64b2obo8b2o5b2o19b2ob3o32bo18bo21b 2o20b2o23b2o$192bobobo289b2o2b2o33b2o2bo73b2o2bo4bo20bo21b2o15bo18bo 19bo21b2o23b2o$193b2ob2o406bobo3b2o23bo19bo21bo18bo$196bo408bo2bo30bo 33b2obo15b2obo11b2obo18b2obo21b2obo$606b2o28bo3bo10b2obo18bo18bo13bob 2obo16bobo2bo19bobo2bo$26bo3bo604b2ob2o10bob2obo16b2o17b2o13bo3bo16b2o 3bo19b2o3bo$26bo3bo605bo13bo3bo16b3o2b2o12b3o2b2o9bob2o18bobobo20bobob o$25bobo609b2ob2o8bob2o18bo3b2o13bo3b2o10b2obo18b2ob2o20b2ob2o$obobo3b o3bo11b3o2b2o620b2obo18bo2bo15bo2bo14bobo19bo24bo$654bobo16b2o17b2o16b obo$o7bo3bo14b2o625bobo$27b2o5bo$obobo3bobobo14b2o3bobo$32bo$4bo7bo10b 2obo5b3o$22bobo2bo6b3o$obobo7bo8b2o3bo6b2o2bo$22bobobo7bob2o$23b2ob2o 7b4o$26bo6$752b2ob2o$195bo56bo498bo$194bobo15b2o17b2o16b2ob2o496b2ob2o $193bo3b3o11b6o13b6o12bobobo433b2ob2o60bo3bo$194bob3o11bo3bo14bo3bo13b 2o3bo23bo3bo404bo68bo$195b2o13bo4b2o12bo4b2o12bobo2bo22b2o2b2o402b2ob 2o61bo$210bo2bo15bo2bo16b2obo21b2ob2o2bo366bo36bo3bo58bo77bo2b2o$196b 2o75b2obob2obo311b2ob2o49bobo38bo58b2ob3o30bo41bob2o$195b3o14b2o17b2o 20b2o17bo3bo5bo309bo53bo3b3o31bo61b2o34b5o25bo3bob2o5bo2bo$196bo15b2o 17b2o18bo2bo18b3o236b2o77b2ob2o14bo36bob3o30bo36bo27b2obo30bo5bo23bo4b o3bo3bo2bo$194bo13b2o2bo14b2o2bo18b5ob2o16bo217bo19bo13bo7bob2obo52bo 3bo12bobo36b2o31b2ob3o31b2o28bo33b2o27bo2b2obobo6bo$33bo3bob2obobo125b obobo3bobobo10b2o13b6o13b6o16bo19b2o11bo177bobobo3bobobo14b3o2bo15b3o 14bobo6bobo3bo40b2o12bo12bo3b3o65b2o36bobo4b2o23b3o33bo24b2o10b2o$32bo 4bo4bobo23bo123bo14bo18bo23b2o17bo2bo7bobo207bo4bo28bo3b3o2bobobo7bobo 31b2o3bo24bob3o17b2ob2o8b2obo33b2obo31bo7bob3obobobo16b2o30b2o30bob3o 3b3o$32bo2b2obobobo23b2o3bo98bo7bo3bo10b2o2b2o9bo5bo12bo5bo17b3o14bo3b 2o6bo183bo3bo3bo14bobo3bo4bo8bo3bo13bob3o3bobo5bob2o3bo19bo7bobobo4bo 6bo2bo14b2o18bo12bobo2bo33bo31b2o8b3o3bobobo36b2ob2o4b2o24bo8bo9bo$32b 2o9bo22b2o2bo124bo12bo5bo12bo5bo19bo13b3o2b2o6b3o203b3o3bo6b2o4b2o4bo 14b2o6bobobo3bo2bob3o17bobo6bobobo3bo2bob3o37b2ob2o8b2o3bo36b3o25b2o4b o4bo3bo26bo3b3o9bobo5b2o4bo20bobo7bo$obobo3bobobo23bob3o2bo17b2o3b4obo 98bobobo3bobobo10bobo51bo20b2o194bo3bobobo11b2o6bo3bo4b2obo4b2o23bobob o4bo6bo2bo12bo3b3o2bobo5bob2o3bo15b2obo20bo3bo8bobobo4bob2obo27b2o25b 2ob5obo7b6o18b2o4b3o7bo8b2o4bo4bo14bo3b3o$27bo8bo21b2obo130bo5bo13bo 16bo17bo3bo17bo212b2o9b2obobo2b4o4bobo10b2obo11b2o3bo24bob3o3bobobo7bo bo15bobo2bo8b2o12bo10b2ob2o3bobo3bo52bo3bo5bo3b3o6bo19bo5b2o6bo9b6o3bo bo15bob3o8b4obo$o7bo17bobo7bo20bobob2o107bo3bo3bo3bo9bo5bo11b3o14b3o 16bobo20b2obo191bo7bo9b2ob2o6b2obobo2b2o4bo13bobo2bo12b2o12bo14b2o6bob o3bo21b2o3bo7b2o3bo24bo3bobobo7bobo31bo14bobo2bobobob3o4b3obo34bo4bo6b 2o4bo18b2o10b2o2bo$25bo3b3o21bob2o2bo4bobo126b2o14b2o15b2o17b3o2b2o21b o207bo3bobo15b4o13b2o3bo24bo3bo21bob2obo23bobobo4bobobo4bo6bo2bo17bobo 5bob2o3bo17b5o7b2o14bobo2b3obo4bo4bobo17b2o4bo12b2o3b3o9b3o28b2o3bo$ob obo3bobobo13bob3o20b2o4bo2b2ob4o103bobobo3bobobo15bo9bo16bo42bo195bo3b obobo9bobo3bo7b2o6bo16bobobo23b2ob2o10b2obo38b2ob2o3bobobo3bo2bob3o22b obobo3bo2bob3o16bo4bo3b2o3bo28bobo9bo10b3o26bo9b3o10b2obo14bo$27b2o22b o4bo3b2o3bo128b2o3bo9b5ob2o9b5ob2o14b2o16bo215bobo2bo2bo31b2ob2o23bo 12bobo2bo40bo3bobo5bob2o3bo23bobobo4bo6bo2bo12b2o4bo2b2ob4o37bobo8bo6b 2obo10bobobo4bo9b2o2bo8bobo2bo$4bo3bo3bo38b5o7b2o129bo3bo11bo2bo13bo2b o17b2o15b2ob3o254bo25b2ob2o6b2o3bo45bobobo7bobo27b2o3bo25bob2o2bo4bobo 37bo9b2obo5b2o10bo4bo3bo11bob2o7b2o3bo$23b2obo37bo129bo3bo13b2o15b2o 17b2o14b2o223b2o72bobobo46bobo3bo36b2o12bo18bobob2o41b3o6b2o9bo10bob4o 16b4o7bobobo$obobo3bobobo9bobo2bo165b3obo67b2obo295b2ob2o45bob2obo48bo 3bo18b2obo52b2ob3o15b2o32b2ob2o$21b2o3bo27b3o135bo4bo10b2obo13b2obo15b 2obo18bo300bo99b2ob2o22b2o3b4obo43bo56bo$22bobobo27bo136bobobob2o8bobo 2bo11bobo2bo13bobo2bo19b3o397bo30b2o2bo46bo$23b2ob2o26bo136bo3bobo8b2o 3bo11b2o3bo13b2o3bo21b2o398b2ob2o25b2o3bo49bo$26bo28b2o134b2ob3o10bobo bo12bobobo14bobobo453bo49bo3bo$198bo9b2ob2o12b2ob2o14b2ob2o501b2ob2o$ 198b2o11bo16bo18bo503bo$198b2o552b2ob2o13$26b2o2b2o$25b2o$26bob2o$22bo 6bo$22bo464bo$21bo464bobo22bo74b2ob2o19b2ob2o$obobo3bobobo9b2obob2o 188bo16bo250bo3b3o17b2o3bo70bo23bo$22b2o5b2o184b2obo13b2obo250bob3o18b 2o2bo23b2o22b2o21b2ob2o19b2ob2o$o11bo11b4o185b3o14b3o254b2o20b4obo21b 3o21b3o22bo3bo19bo3bo$27bobo182bo2bo13bo2bo23b2o2bo20b2o2bo18bo3bo225b o23bo29bo23bo61b2o$obobo7bo16bo181bo16bo27b3o22b3o20b2o2b2o173b2obo46b 2obo20b2obo23bo23bo26b2o2bo32b4o$27bobo162bo19bo2bo2bo10bo2bo2bo16b3ob o20b3obo20b2ob2o2bo172bobo2bo18b2obo22b2o22b2o24bo23bo28b3o33b2o$4bo7b o11b4o164bo3b2obob2o10b4obo11b4obo15bobobob3obo14bobobob3obo14b2obob2o bo171b2o3bo18bob2obo22b2ob3o18b2ob3o18b2ob3o18b2ob3o20b3obo34b3o$22b2o 5b2o160bo4bobo2bo13bob3o12bob3o14bo3b6o15bo3b6o14bo3bo5bo171bobobo18bo 3bo24bo23bo21b2o22b2o24bobobob3obo29bo$obobo7bo9b2obob2o163b2ob3o3bo 15b3o14b3o14bo24bo24b3o179b2ob2o17bob2o20bo6bo16bo6bo20b2obo20b2obo21b o3b6o30bo2bo$21bo170b2obo5bo15bo2bo13bo2bo14bobo22bobo22bo183bo19b2obo 19bo3bo6bo12bo3bo6bo17bo23bo23bo28bo3bob2o2b2o$22bo147bobobo3bobobo14b obobo14bo16bo28bo24bo22bo149bobobo3bobobo36bobo16bobo6bo3bo10bobo6bo3b o11bo6b3o14bo6b3o20bobo24bo4bo3bo2b2o$22bo6bo164b2o6bobo10bo4bo11bo4bo 17bo20bo23bo7bobo178bo4b2o13bobo15b3o2b2o2b2ob2o10b3o2b2o2b2ob2o12bo3b o3b2o14bo3bo3b2o15bo31bo2b2obobo$26bob2o140bo7bo3bo14bobo15bo5bo10bo5b o14b3o4b2obo10b3o8b2obo10b3o6bo151bo3bo3bo3bo16bobo2b2o21b2o18bo23bo 14bobo21bobo23bo3bo27b2o$25b2o171b4o13bo2b2o12bo2b2o15b2o7b2o10b2o11b 2o10bob2o6b3o177bo2bo20b2o3b2o11b2o6b2ob2o11b2o6b2ob2o8b3o2b2o17b3o2b 2o19bobo34bob3o$26b2o2b2o138bobobo3bobobo15bo17b4o13b4o14bo10bo9bo14bo 9b2o2b3o156bobobo3bo3bo16bobo2b2o16b3o15b2o22b2o68b3o2b2o22bo8bo$198b 4o15bo16bo17b5ob2o13b5ob2o17b2o2b2o185bo4b2o16b2o3b2o10bo23bo24b2o22b 2o48bobo7bo$170bo3bo7bo14bobo53bo2bo17bo2bo23bo2bo155bo3bo3bo3bo44b2o 7bo23bo27b2o22b2o23b2o22bo3b3o$194b2o6bobo50b2o19b2o23bo2bo181bo20bo3b o13bo2b4o17bo2b4o21bo23bo25b2o5bo17bob3o8b4obo$170bobobo3bobobo14bobob o11b2o19b2o63bo160bobobo3bobobo10b2ob2o19bo3bo13bo2b4o17bo2b4o18bo23bo 28b2o3bobo18b2o10b2o2bo$192b2obo5bo11bo2b4o14bo2b4o10b2obo17b2obo21bo 184bobobo19bobo16b2o22b2o22bo2b4o17bo2b4o28bo32b2o3bo$192b2ob3o3bo11bo 2b4o14bo2b4o9bobo2bo15bobo2bo19b2ob3o179b2o3bo18b3o2b2o61bo2b4o17bo2b 4o19b2obo5b3o14b2obo14bo$191bo4bobo2bo12bo20bo13b2o3bo15b2o3bo19b2o 185bobo2bo85b2o22b2o23bobo2bo6b3o11bobo2bo$192bo3b2obob2o14bo20bo11bob obo16bobobo20b2obo183b2obo21b2o111b2o3bo6b2o2bo9b2o3bo$192bo25b2o19b2o 10b2ob2o16b2ob2o20bo210b2o16b2o2b5o17b2o2b5o61bobobo7bob2o10bobobo$ 218b2o19b2o13bo20bo23b3o185b2o19b2o15b2o2b2o4bo15b2o2b2o4bo61b2ob2o7b 4o10b2ob2o$54bo3bo10bo3bo226b2o185b2o37bobo23bobo19b2o2b5o17b2o2b5o17b o25bo$54bo3bo10bo3bo141b3o2b2o14b3o2b2o244b2o15b2obo19b3o4bo18b3o4bo 12b2o2b2o4bo15b2o2b2o4bo$53bobo12bobo145bobo18bobo263bobo2bo19bo4bo20b o4bo14bobo23bobo$52b3o2b2o8b3o2b2o16bobo124bo3bo16bo3bo241b3o2b2o11b2o 3bo23bobo23bobo15b3o4bo18b3o4bo$87bo4bo124bo3bo16bo3bo242bobo15bobobo 68bo4bo20bo4bo$55b2o13b2o14b3o4bo392bo3bo13b2ob2o70bobo23bobo$55b2o13b 2o13bobo398bo3bo16bo$54bo14bo14b2o2b2o4bo$24b2ob2o4b2o3b3o10bo14bo18b 2o2b5o$obobo3bobobo10bobo5b2o3bob2obo8bo2b4o8bo2b4o$22bo8b2o4bob3obo6b o2b4o8bo2b4o$o7bo3bo8bo9b5o5b2o7b2o13b2o25b3o$22bo4bo6b3o45b2o8bo$obob o3bobobo10b2o3b3o51bo2b4o3bo$32bo49bo2b4o4b2o$4bo3bo3bo9bobobo4bo18b2o 15b2o14bo$21bo4bo3bo19bo2b4o10bo2b4o12bo$obobo3bobobo8bob4o23bo2b4o10b o2b4o13b2o$21b2o28bo16bo18b2o$54bo16bo536bo3bo$55b2o15b2o10b3o2b2o517b o3bo17bo$55b2o15b2o11bobo519bobo17b2ob2o$86bo3bo515b3o2b2o13bobobo27bo 25bo$52b3o2b2o10b3o2b2o10bo3bo127bo16bo26b2o361b2o3bo25b2o3bo20b2o3bo$ 53bobo14bobo142b2ob2o12b2ob2o25bo2bo343b2o15bobo2bo24b2o2bo21b2o2bo8bo $54bo3bo12bo3bo138bobobo12bobobo25bo3b2o297bo28bo15b2o16b2obo25b4obo 20b4obo3b2o2bo$54bo3bo12bo3bo137b2o3bo11b2o3bo24b3o2b2o295b2o3bo23b2o 3bo12b2o79bo3bo$214bobo2bo11bobo2bo24b2o272b2obo23b2o2bo24b2o2bo35b2o 57bobo$215b2obo13b2obo26bo225b2o2b2o37b2o3bo2b2o16b2o3b4obo18b2o3b4obo 8b2obo22b2o25bo25bo4b2obo$193b2o67b2obo221b2o41b2ob3o18b2obo25b2obo17b obo2bo21b2o25b2o24b2o4b2o$192b3o24b2o15b2o28bo221bob2o25b2o10bo23bobob 2o23bobob2o15b2o3bo48bo25bo5bo$191bo3b3o19bo2bo13bo2bo23bo222bo6bo25bo bo14b4o11bob2o2bo4bobo15bob2o2bo4bobo12bobobo19b3o2b2o26bob3o21bob3o$ 192b2o2bobo5bo11b5ob2o9b5ob2o18bo224bo32bobobobo3bobo2bobob2o9b2o4bo2b 2ob4o13b2o4bo2b2ob4o13b2ob2o19bobo23b2o6bo17b2o$170bobobo3bobobo10bo2b ob2o4b3o8bo16bo25b2ob3o196bobobo4bo13bo6bo27b2obobo3bo4bo14bo4bo3b2o3b o14bo4bo3b2o3bo17bo21bo3bo20bo8b2o15bo$196b2ob2o2bo2bo9b2o15b2o22b2o 225b2obobo6bo2bo13bo5b2o2bo2bobobo16b5o7b2o15b5o7b2o40bo3bo20b2o3bo2b 2obo14b2o3bo$174bo3bo3bo14bo3bo2bo12b3o14b3o21b2obo198bo3bo4bo14b2o5bo 3bo3bo13bo3bo5b2o35bo28bo21bo29bo15bo2bo3bobo16bo2bo$198b3o3bo14bo16bo 22bo226b6o3bo3b2o11bobo8b2o86bobo2b2o17b2o3bo2bo14b2o4bo3bo15b2o$174bo 3bo3bo16bo54bo6b3o196bobobo4bo27b3o11b3o2b2o92bo2bo2b3o16b3o2bo24b2o2b o$199bo19bo18bo15bo3bo3b2o220b12o5bo45b7o20b7o30bobo21b2o4bobo11b2o12b o11b2o$174bo3bo3bo15b3o3bo12b3o16b3o14bobo204bo3bo4bo12b2o5bo11bo12b2o 31bo6bo19bo6bo29bo42b6o20b6o$114b2o81bo3bo2bo11b2o17b2o15b3o2b2o223b2o bobo3b2o2bo18b2o31b2o3bo21b2o3bo50bo3bo18bo3bo21bo3bo$94bo18b3o58bo3bo bobo13b2ob2o2bo2bo8bo18bo225bobobo4bo11bo6bo2b2o3b2obo14b2o33bob2o23bo b2o28bo21bo3bo18bo4b2o19bo4b2o$91b2ob2o15bo81bo2bob2o4b3o9b5ob2o11b5ob 2o12b2o225bo15bo53b2o25b2o24b2ob2o19bobo21bo2bo22bo2bo$53bobo19bobo12b obobo15b2obo78b2o2bobo5bo12bo2bo15bo2bo15b2o225bo6bo20b2obo38bobo24bob o22bobobo19b3o2b2o$50bo4bo16bo4bo11b2o3bo14b2o80bo3b3o21b2o17b2o15b2o 229bob2o19bobo2bo36bo26bo24b2o3bo46b2o24b2o$36bo12b3o4bo14b3o4bo11bobo 2bo14b2ob3o76b3o290b2o21b2o3bo36bo4bo21bo4bo21bobo2bo21b2o22bo25bo$35b 5o8bobo19bobo18b2obo16bo81b2o20b2obo15b2obo13b2obo231b2o2b2o17bobobo 36bo5bo20bo5bo21b2obo22b2o$34bo5bo6b2o2b2o4bo11b2o2b2o4bo33bo100bobo2b o13bobo2bo11bobo2bo254b2ob2o35bo2b2o22bo2b2o49b2o18b2obo22b2obo$35b2o 11b2o2b5o13b2o2b5o16b2o20bo95b2o3bo13b2o3bo11b2o3bo258bo37b4o23b4o27b 2o39bob2obo20bob2obo$obobo3bobobo26bo54bob3o15bo3bo95bobobo14bobobo12b obobo297bo26bo29b2o16b2obo19bo3bo21bo3bo$36b2o55bo3b3o13b2ob2o97b2ob2o 14b2ob2o12b2ob2o353b2o15bobo2bo18bob2o22bob2o$o7bo3bo11b2ob2o4b2o23b2o 20b2o12bobo17bo103bo18bo16bo370b2o3bo20b2obo22b2obo$23bobo5b2o4bo9b2o 8b2o8b2o10b2o14bo19b2ob2o486b3o2b2o13bobobo23bobo23bobo$obobo3bobobo9b o8b2o4bo9bo2b4o3bo2bo6bo2b4o5bo2bo524bobo17b2ob2o22bobo23bobo$21bo9b6o 10bo2b4o4b2o7bo2b4o6b2o526bo3bo17bo$4bo7bo9bo4bo6b2o12bo19bo25b2o16b2o 494bo3bo$23b2o3b3o20bo19bo22bo2b4o11bo2b4o$obobo3bobobo19bo19b2o18b2o 20bo2b4o11bo2b4o$22bobobo4bo20b2o18b2o21bo17bo$21bo4bo3bo67bo17bo$21bo b4o22b3o2b2o13b3o2b2o23b2o16b2o$21b2o27bobo17bobo26b2o16b2o$51bo3bo15b o3bo$51bo3bo15bo3bo20b3o2b2o11b3o2b2o$97bobo15bobo$98bo3bo13bo3bo$98bo 3bo13bo3bo$563bobo17bobo$560bo4bo14bo4bo14bobo16bobo19bobo16bobo$283b 2ob2o14b2ob2o236bobo13b3o4bo12b3o4bo10bo4bo13bo4bo16bo4bo13bo4bo$264b 2ob2o13bo18bo20b2o19b2o195bo4bo12bobo17bobo15b3o4bo11b3o4bo14b3o4bo11b 3o4bo$263bo17b2ob2o14b2ob2o16b6o15b6o191b3o4bo10b2o2b2o4bo9b2o2b2o4bo 7bobo16bobo19bobo16bobo$262b2ob2o15bo3bo14bo3bo14bo3bo16bo3bo192bobo 17b2o2b5o11b2o2b5o7b2o2b2o4bo8b2o2b2o4bo11b2o2b2o4bo8b2o2b2o4bo$263bo 3bo17bo18bo15bo4b2o14bo4b2o189b2o2b2o4bo47b2o2b5o10b2o2b5o13b2o2b5o10b 2o2b5o$266bo14bo18bo19bo2bo17bo2bo193b2o2b5o$262bo16bo18bo$260bo17b2ob 3o13b2ob3o19b2o19b2o14bo3bo118bo44bo29b2o16b2o$243b2o2bobo9b2ob3o12b2o 17b2o24bo20bo15bo3bo28bo3bo85bo3b2obob2o32b2o3bo26bo2b4o11bo2b4o12b2o 17b2o18b2o17b2o$242b2o3b2o9b2o18b2obo15b2obo57bobo31bo3bo84bo4bobo2bo 33b2o2bo8b2o2b5o10bo2b4o11bo2b4o12bo2b4o12bo2b4o13bo2b4o12bo2b4o$220bo 22b2o4bo9b2obo16bo18bo19b2obo17b2obo14b3o2b2o27bobo88b2ob3o3bo28b2o3b 4obo6b2o2b2o4bo10bo17bo17bo2b4o12bo2b4o13bo2b4o12bo2b4o$210bobo3b2o28b 2o12bo20b3o16b3o14bob2obo15bob2obo46b3o2b2o85b2obo5bo25b2obo17bobo20bo 17bo15bo18bo19bo18bo$170bobobo4bo28b3o3bob2o21bo2b2o3bo14b3o17b2o17b2o 14bo3bo16bo3bo17b2o98bobobo3bobobo14bobobo24bobob2o17b3o4bo15b2o16b2o 16bo18bo19bo18bo$202b2o3bo5bo6bo12bo4bob3o5bo14b2o52bob2o17bob2o18b2o 31b2o89b2o6bobo17bob2o2bo4bobo14bo4bo16b2o16b2o17b2o17b2o18b2o17b2o$ 174bo4bo21bo4b2o24bobo5b2o6bo36bo18bo13b2obo17b2obo17b2o31b2o65bo3bo7b o14bobo11bo8b2o4bo2b2ob4o17bobo53b2o17b2o18b2o17b2o$44bo151bo2bo2bo3bo 4bo19bo3b4o5b2obob3o14bo17b2o17b2o16bobo18bobo48b2o93b4o3b2o3bo2bo6bo 4bo3b2o3bo23bo10b3o2b2o11b3o2b2o$42b2o3bo126bo4bo12b2ob2o3bo3b2obo2bo 21bob3obo6bo2b2o15b2o18bo18bo16bobo18bobo11b2obo100bobobo3bobobo15bo6b 3o2bo9b5o7b2o24bobo9bobo15bobo15b3o2b2o12b3o2b2o13b3o2b2o12b3o2b2o$42b 2o2bo144b2obo5bo2b2o28b2o11bob2o16bo88bobo2bo28b2obo95b4o3b2o4bobo19bo 6bo16bo2bo10bo3bo13bo3bo13bobo16bobo17bobo16bobo$42b4obo21b2o2bo100bo 4bo12bo2b5obo2b2obobo36bobo33b2o15b2o17bo3bo15bo3bo11b2o3bo28bobo2bo8b 2o8bo47bo3bo3bo18bobo28bo9bobo17bobo10bo3bo13bo3bo14bo3bo14bo3bo15bo3b o14bo3bo$26b2o2b2o37b3o121bo6bo6bo2bo18b2obo30b2o4bo11b3o14b6o14bo3bo 15bo3bo12bobobo4bob2obo17b2o3bo7b2o3bo5b2o71b2o6bobo17bo7bo7bo19bo49bo 3bo14bo3bo15bo3bo14bo3bo$25b2o38b3obo104bo4bo14b3ob3o6bo2bo17bobo2bo 28b3o14bo17bo3bo15bobo17bobo16b2ob2o3bobo3bo17bobobo4bobobo4bo3b2obo 46bobobo3bobobo14bobobo19b3o14b3o34b2o16b2o$26bob2o9b2obo21bobobob3obo 121bobo3bo5bob2o15b2o3bo27bo6b2obo7b2obo15bo4b2o12b3o2b2o13b3o2b2o16bo 3bobobo7bo13b2ob2o3bobobo3bo2bo73b2obo5bo18bo3bo5bo24bo17b3obo13b3obo 15bobo17bobo16bobo17bobo$22bo6bo8bob2obo20bo3b6o128bo5bo19bobobo26b2ob o5b2o7b2o18bo2bo62bobo5bob2o4bo12bo3bobo5bob2o4bo69b2ob3o3bo19b2obob2o bo22b2ob2o15b2o16b2o19bobo17bobo16bobo17bobo$22bo15bo3bo21bo146bo17b2o b2o24b2o9bo8b2ob3o35b2o18b2o23bobobo3bo2bo20bobobo7bo72bo4bobo2bo20b2o b2o2bo21bobobo15bo17bo18b2obo16b2obo15b2obo16b2obo$obobo3bobobo8bo6bo 9bob2o23bobo164bo26b2ob3o14bo19b2o18b2o18b2o23bobobo4bo3b2obo16bobo3bo 78bo3b2obob2o21b2o2b2o20b2o3bo16b2o16b2o15bob2o16bob2o15bob2o16bob2o$ 22b2obobo11b2obo17bo199bo20bo17bo19b2o18b2o26b2o3bo5b2o17bob2obo79bo 31bo3bo22bobo2bo16bo17bo15bo3bo15bo3bo14bo3bo15bo3bo$o7bo3bo9b2o5bobo 10bobo15bo3bo197bo23bo82b2o8bo162b2obo19bo17bo13bob2obo14bob2obo13bob 2obo14bob2obo$24b8o10bobo14bobo204bo15b2obo9b2obo16b2obo16b2obo225b3o 15b3o13b2obo16b2obo15b2obo16b2obo$obobo3bo3bo45b3o2b2o198bo3bo14bo11bo b2obo14bobo2bo14bobo2bo206b2o17b2o16b2o$24b8o230b2ob2o14b2o11bo3bo14b 2o3bo14b2o3bo206bob3o$o3bo3bo3bo9b2o5bobo8b2o19b2o200bo16b3o2b2o7bob2o 16bobobo15bobobo205bo3b3o13b2o16b2o17b4obo14b4obo13b4obo14b4obo$22b2ob obo12bo2b4o14b2o201b2ob2o12bo3b2o8b2obo16b2ob2o15b2ob2o205bobo15bob3o 13bob3o15b2o2bo15b2o2bo14b2o2bo15b2o2bo$obobo3bobobo8bo6bo11bo2b4o14b 2o219bo2bo12bobo17bo19bo207bo15bo3b3o11bo3b3o14b2o3bo14b2o3bo13b2o3bo 14b2o3bo$22bo18bo240b2o14bobo262bobo15bobo19bo19bo18bo19bo$22bo6bo14bo 12b2obo503bo17bo$26bob2o15b2o9bobo2bo$25b2o18b2o8b2o3bo$26b2o2b2o24bob obo$42b3o2b2o8b2ob2o$43bobo14bo$44bo3bo$44bo3bo5$640bo3bo$602bo21bo15b o3bo14bo$601b4o18b4o12bobo14b2ob2o$274b2ob2o321bo2b2o17bo2b2o11b3o2b2o 10bobobo$273bo326bo5bo15bo5bo25b2o3bo70bobo22b2o22bo3bo$272b2ob2o323bo 4bo16bo4bo13b2o12bobo2bo69bobo21b6o19bo3bo$273bo3bo323bo21bo17b2o13b2o bo31b2ob2o31b2obo8bo2b2o9bo3bo20bobo127bo$276bo325bobo19bobo14b2o47bo 35bob2o8bob2o11bo4b2o17b3o2b2o24bo3bo94b5o$223b3o46bo234bo2bo91b2o20b 2o34b2o27b2ob2o9bo2bo19bo3bo7bo2bo11bo2bo51bo3bo93b2o4bo$192bo2bo26bo 47bo236bo3bo87bob2o18bob2o12b2obo19b2o28bo3bo8bo3bo18bob2obo5bo2bo39b 2o25bobo97bo4bo$192bo3bo28bo43b2ob3o231bo2bo2bo84b2o3bo16b2o3bo11bobo 2bo18b2o31bo8bo3b2o19b2obo8bo15b2o5bo17b2o5bo18b3o2b2o33bo3bo57b2o$ 191bo3b2o23b2o46b2o235b3o34b2o41bo11bo6bo14bo6bo8b2o3bo48bo13b2o31b2o 17bo4b3o17b2o3bobo58bo3bo57bo$192b2o24b2o49b2obo264bo2b4o39b2obo10b7o 15b7o10bobobo16b3o2b2o23bo15b2ob2o23bo4b3o21b2o23bo23b2o34bobo59bo$34b o157b2ob2o11bo8b2ob5o21bo23bo222bo3bob2obobo4bo23b2o2bo2bobobo3b2o31bo 2bobo50b2ob2o16bobo25b2ob3o14b2obo21b2o5bo12b2obo8bo12b2obo5b3o21b2o 33b3o2b2o54bobo$32b2o3bo132bobobo3bobobo12b2obo8b2o7bo7bo4bo15b2o25b3o 185bobobo3bobobo19bo4bo4bobo2b2obobo19b2obo4bo2bo3bo29b2obo59bo18bo3bo 21b2o22b2o2bo36bob2obo5bo2bo10bobo2bo6b3o19b2o80bo3bob2obobob2o5b2o$ 32b2o2bo161b2o2bo4bobo7b3o2b2obo3b2o14bobo4b2o19b2o217bo2b2obobobo4b2o bobo14b2o4bob3o2bob2o3b3o23b2ob3obo18bobo19bobo35bo3bo22b2obo20bobo4bo 11bo2bo17bo3bo7bo2bo8b2o3bo6b2o2bo56b2o41bo4bo4bobo7b2o$32b4obo136bo7b o16bobo3bo12b2o2bo4bo3bo11bo7bob3obobobo198bo3bo7bo19b2o9bo2bo4bo27b2o b2o23bo4bo2bo5bo2bobo9bo4bo16bo4bo19bo25b2o16bo19b5ob5o11bo4b2o14bob2o 8bob2o9bobobo7bob2o14b2obo38b2o19b2ob2o17bo2b2obobobo9bo2bo$196b5ob3o 22b2o2bo9b2o8b3o3bobobo14bo3b3o213bob3o2bo3b4o15b3o5b2o4b2o24b2o3b2obo 8b2obo8b3o4bo14b3o4bo18bobo18b2o3b2o11bo6b3o15bo2bo18bo3bo17b2obo8bo2b 2o8b2ob2o7b4o12bobo2bo37b2o18bo22b2o9bo9b2o$174bo3bobobo13bo2bo31bo7b 2o4bo4bo3bo20b2o4b3o176bobobo3bobobo14bo8bo11b2o14b2o8bo22bobo2b2o2bo 3bo2b2o10bo8bobo19bobo23bo2bo18b3o15bo3bo3b2o15b5ob5o12b6o18bobo22bo 23b2o3bo57b2ob2o23bob3o2bo$29b2obo163b5ob3o26bo7b2ob5obo7b6o14bo5b2o 202bobo7bo25b3o32bobo2b2o5b3o21b2o2b2o4bo11b2o2b2o4bo17bobo18b2o3b2o 10bobo26bobo4bo13b2o21bobo47bobobo4bob2obo24b2obo20bo3bo13bo8bo$28bob 2obo140bo3bo20bobo3bo21b2o2bo6bo3bo5bo3b3o6bo198bo3bo7bo12bo3b3o29bo7b o3b3o20bo3bo7b2o2bo21b2o2b5o13b2o2b5o18bo25b2o9b3o2b2o22b2o2bo91b2ob2o 3bobo3bo22bobo2bo8b2o12bo13bobo7bo$28bo3bo165b2o2bo4bobo8b2o2bo4bo3bo 7bobo2bobobob3o4b3obo11b2o211bob3o29bo2b4o3bo2b2o22b2ob5obo2bo2bo86bo 3bo42b2obo78b2o18bo3bobobo7bobo14b2o3bo7b2o3bo23bo3b3o$obobo4bo18bob2o 142bo3bobobo12b2obo8b2o8b3o2b2obo3b2o8bobo2b3obo4bo4bobo11b3o185bobobo 3bobobo14b2o30b2obo7b2ob2o22b2o14bo66bo4b3o11bo3bo19b2o18b2ob2o20b2o 22b2o34bo2b4o17bobo5bob2o3bo14bobobo4bobobo4bo6bo2bo13bob3o$29b2obo 159b2ob2o11bo7bo7bo4bo24bobo13bo249b2ob2obobob2o27b4o2bo2bo2b2o64b2ob 2o3bo12bobo22b2o5bo12b2o9bo13bo2b4o17bo2b4o29bo2b4o18bobobo3bo2bob3o 14b2ob2o3bobobo3bo2bob3o18b2o$o8bo22bobo157b2o23b2ob5o44b2obo210b2obo 37bobob2o32bo2bo2bo4b2o18b2o18b2o21bobobo4bo11b3o2b2o19b2o3bobo11bo3b 2o4b3o13bo2b4o17bo2b4o30bo23bobobo4bo6bo2bo13bo3bobo5bob2o3bo$32bobo 156bo3b2o21b2o48b2o212bobo2bo39bo38bo7b3o16bo2b4o13bo2b4o15b2o3bo5b2o 40bo14bo3bo4b2o15bo23bo38bo23b2o3bo28bobobo7bobo16b2obo$obobo4bo182bo 3bo23b2o47b2ob3o206b2o3bo88b2o16bo2b4o13bo2b4o16bobo2bo18b2o17b2obo5b 3o12bo2bo8bo16bo23bo36b2o23b2o12bo18bobo3bo22bobo2bo$27b2ob2o160bo2bo 29bo44bo211bobobo107bo19bo22b2obo19b2o16bobo2bo6b3o20bo2bo16b2o22b2o 34b2o34bo3bo17bob2obo22b2o3bo$o3bo4bo16bo195bo49bo210b2ob2o109bo19bo 42b2o15b2o3bo6b2o2bo20bo2bo15b2o22b2o69b2ob2o47bobobo$25b2ob2o193b3o 50bo209bo111b2o18b2o21b2o35bobobo7bob2o20bob2o72b3o2b2o32bo51b2ob2o$ob obo4bo16bo3bo242bo3bo320b2o18b2o21b2o13b2obo19b2ob2o7b4o20bo2b2o10b3o 2b2o17b3o2b2o30bobo36b2ob2o49bo$29bo242b2ob2o364b2o12bobo2bo21bo48bobo 21bobo34bo3bo$25bo247bo321b3o2b2o13b3o2b2o32b2o3bo72bo3bo19bo3bo31bo3b o$23bo250b2ob2o317bobo17bobo19b3o2b2o10bobobo72bo3bo19bo3bo$22b2ob3o 569bo3bo15bo3bo17bobo14b2ob2o$21b2o574bo3bo15bo3bo18bo3bo14bo$22b2obo 614bo3bo$23bo$25b3o$26b2o9$674bo3bo19b2o23b2o$674bo3bo18b6o19b6o106b2o 2bo20b2o2bo20b2o2bo$631bo21bo19bobo20bo3bo20bo3bo108b3o22b3o22b3o$630b obo19bobo17b3o2b2o17bo4b2o18bo4b2o102b3obo20b3obo20b3obo$629bo3b3o15bo 3b3o38bo2bo21bo2bo28b2o2bo22b2o2bo22b2o2bo17bobobob3obo14bobobob3obo 14bobobob3obo39b2ob2o20b2ob2o14bo3bo19bo$485bo3bo140bob3o17bob3o18b2o 76b3o24b3o24b3o19bo3b6o15bo3b6o15bo3b6o11bo3bo23bo24bo19bo3bo18bobo$ 485bo3bo51bobo87b2o20b2o20b2o21b2o23b2o24b3obo22b3obo22b3obo21bo24bo 24bo20bo3bo22b2ob2o20b2ob2o15bobo20bo3b3o$98b2o384bobo54bobo27b2o2bo6b o15b2o2bo6bo65b2o21bo24bo24bobobob3obo16bobobob3obo16bobobob3obo17bobo 22bobo22bobo16bobo26bo3bo20bo3bo13b3o2b2o18bob3o$97b3o383b3o2b2o48b2ob o28b3o2b2o2bobobo13b3o2b2o2bobobo16b2obo18b2obo95bo3b6o17bo3b6o17bo3b 6o13bo24bo24bo22b3o2b2o26bo24bo40b2o55b3o$95bo415bo25bob2o28bo7b4o2bo 3bo8bo7b4o2bo3bo11bobo2bo16bobo2bo17b2obo19b2obo21b2obo25bo26bo26bo22b o3bo20bo3bo20bo3bo47bo24bo21b2o70bo7bo2b2o$58b2o2bo18b2o2bo8b2obo388b 2o23bo3b2obob2o15bo3bo28b2ob5o3b2o3b2o9b2ob5o3b2o3b2o10b2o3bo16b2o3bo 5b2o10bobo2bo17bob2obo19bob2obo25bobo24bobo24bobo18bobo22bobo22bobo24b 2o22bo24bo23b2o5bo16b2o45b2o7b2ob2o$58b3o20b3o9b2o113bo277b2o22bo4bobo 2bo16bob2obo28b2o10b3o12b2o10b3o13bobobo17bobobo4bo11b2o3bo18bo3bo20bo 3bo21bo14bo11bo14bo11bo24b3o2b2o18b3o2b2o18b3o2b2o21b2o21b2ob3o19b2ob 3o19b2o3bobo15b3o44b2obo8b2o$33bo3bob2o13b3obo18b3obo12b2ob3o106b2o3bo 273bo25b2ob3o3bo17b2obo31b2o11bo13b2o11bo13b2ob2o17b2ob2o3bo12bobobo 18bob2o21bob2o22bo3bo22bo3bo22bo3bo97bo22b2o23b2o29bo18bo58bo5bo$32bo 4bo3bo11bobobob3obo12bobobob3obo8bo110b2o2bo271bo28b2obo5bo57bo4b2o20b o4b2o18bo21bo4b3o11b2ob2o18b2obo21b2obo20bobo11b2obo9bobo11b2obo9bobo 26b2o23b2o23b2o19bo26b2obo21b2obo17b2obo5b3o14bo43b2o4bo10b2obo3bo$32b o2b2obobo12bo3b6o13bo3b6o11bo72bobobo3bobobo18b2o3b4obo248bobobo3bo3bo 8bo2b4o14bo13bobobo54bo7bo3bo14bo7bo3bo59bo22bobo22bobo17b3o2b2o9b2o9b 3o2b2o9b2o9b3o2b2o23b2o23b2o23b2o18bo2b4o22bo24bo18bobo2bo6b3o11b2o38b o2b4o15bo2b2o$32b2o19bo22bo24bo96b2obo279bo2b4o12b2obo9b2o6bobo17b4obo 29b3o4bo3bo15b3o4bo3bo18bo21bo41bobo22bobo34bo26bo38bo24bo24bo20bo2b4o 4b3ob2o14b3o22b3o13b2o3bo6b2o2bo9bo36b2o2bo2bobobo19bo$obobo3bobobo23b ob3o13bobo20bobo18bo3bo71bo7bo14bobob2o257bo3bo3bo3bo8b2o10b2o2bo3bobo 12bobo10b2o10b2o2bo38bobo24bobo19bobo2b2o15bobo19bo4b2o22bo38b2o25b2o 25b2o21bo24bo24bo23b2o8bo2bo18b2o23b2o14bobobo7bob2o10b2o2b2o29b2obo4b o2bo16b3obo$27bo8bo60b2ob2o91bob2o2bo4bobo6bo278bobo3bo18b4o3b2o3b2o 10b2o3bo85bo2bo2b3o13bo2bo2b3o14bobo2b2o16b2o3bo2bo16b2o4bobo11b2o25b 2o25b2o20bo2b4o18bo2b4o18bo2b4o28b3o61b2ob2o7b4o11bo27b2o4bob3o2bob2o 17bo4bo$o11bo13bobo7bo20bo18bo21bo75bo3bobobo8b2o4bo2b2ob4o4b3o246bobo bo3bobobo18b2obo3bo18bo6b3o16bo37bo5bo22bo5bo16bobo19bobo2b2o14bo2bo 20b3o2bo19b3o2bo13bo26bo26bo22bo2b4o18bo2b4o18bo2b4o28b2o17b2o22b2o22b o21bobo39b2ob2o18b4o7b3o$25bo3b3o23b3o16b3o22b2ob2o87bo4bo3b2o3bo5b2o 278bob2o2bo3bobo13b4o3b2o3b2o15bo34bo5bo22bo5bo16bo21bo21bobo2b2o16b2o 4bobo16b2o3bo2bo7bo26bo26bo25b2o23b2o23b2o36b2o13b6o18b6o40bo5bo23b3o 5b2o4b2o24bo2bo2bob2o$obobo3bobobo13bob3o8b4obo9b2o17b2o99bo7bo8b5o7b 2o9bo245bo3bo7bo10b2o15b2obo12bobo10b2o11bo3bo7bobo23bo28bo67bo4b2o47b o8bo2b4o20bo2b4o20bo2b4o4b2o91b2o8bo2bo11bo3bo19bo3bo29b2o11bo5bo21b2o 8bo30bo6bobo$27b2o10b2o2bo9bo18bo131bo7bo2bo267bo2b4o12bo10b2o6bobo18b o4bo5b2obo24b6o23b6o14bo4b3o14bo42bo3bo20bo3bo15bo2b4o20bo2b4o20bo2b4o 3bo93bo2b4o2bobobobo9bo4b2o17bo4b2o26b3o12b2o23b3o41b2ob5ob2ob2o$o3bo 3bo30b2o3bo9b5ob2o11b5ob2o15b7o71bo3bobobo30bo2bo243bobobo7bo10bo2b4o 26bobobo20bo9b2o4bo23b2o2bo24b2o2bo12b2ob2o3bo13b2ob2o20bo20bo3bo20bo 3bo15b2o25b2o25b2o8bo93bo2b4o2bo4bo10bo2bo20bo2bo27bo21bo18bo7bo3b3o 27b2o5bo5b2obo$23b2obo14bo13bo2bo15bo2bo18bo6bo90b3o16bob2o267bo26b2ob o5bo21b4o2bobob3o2b2o26b2o27b2o10bobobo4bo12bobobo18b2ob2o18bobo22bobo 82b3o12b2o25b2o25b2o24bo8bo2bo65b2obo15b2o3bo6b2o8bo2b4o3bo2b2o28bo4bo 8bobob2o$obobo3bobobo9bobo2bo29b2o17b2o18b2o3bo92bo19bo2b2o268bo23b2ob 3o3bo21b2o2bo3bo5bo28b2o27b2o9b2o3bo5b2o9b2o3bo17bobobo18b3o2b2o18b3o 2b2o94bo2b4o20bo2b4o20bo2b4o22bo5bo2bo13b2o5bo16b2o5bo19b2o18bo3bo6bo 2bo6b2obo7b2ob2o28b3ob2o9b2obo$21b2o3bo71bob2o92bo293b2o20bo4bobo2bo 26bo2bo7bo67bobo2bo16bobo2bo15b2o3bo144bo2b4o20bo2b4o20bo2b4o23b2o20bo 4b3o16bo4b3o20b2ob3o13bo3bo4b2o11b2ob2obobob2o49b2o$22bobobo26b2obo15b 2obo25b2o92b2o291b2o21bo3b2obob2o26b3o7b2o23bo2bo25bo2bo11b2obo18b2obo 17bobo2bo20b2o23b2o18b2o2b5o20b2o2b5o18b2o2b5o14bo26bo26bo28b2o25b2o 22b2o22bo16b3obo5bo3bo12bobob2o41b2o$23b2ob2o24bobo2bo13bobo2bo24bobo 407bo38b3o4bo4bo20bo4b2o22bo4b2o52b2obo21b2o23b2o17b2o2b2o4bo18b2o2b2o 4bo16b2o2b2o4bo16bo26bo26bo43b2obo8bo11b2obo8bo22bo13bo4bo4bo3bo16bo 42b2o$26bo24b2o3bo13b2o3bo24bo384b3o2b2o60bo3b2o4bo20bo3bo24bo3bo14b2o 20b2o41b2o23b2o18bobo26bobo24bobo24b2o25b2o25b2o20b3o2b2o13bob2obo5bo 2bo9bob2obo5bo2bo25bo8bobobob2o3bobo61bo2bo$52bobobo14bobobo23bo4bo 381bobo68b5o22b6o23b6o12b2o20b2o20b2o65b3o4bo21b3o4bo19b3o4bo18b2o25b 2o25b2o21bobo16bo3bo7bo2bo8bo3bo7bo2bo21bo3bo7bo3bobo3b2obo62b2o$53b2o b2o14b2ob2o22bo5bo381bo3bo66bo26b2o27b2o15b2o20b2o20b2o15b2obo21b2obo 22bo4bo23bo4bo21bo4bo97bo3bo13bob2o8bob2o8bob2o8bob2o20b2ob2o8b2ob3o$ 56bo18bo23bo2b2o383bo3bo183b2o14bobo2bo19bobo2bo24bobo26bobo24bobo16b 3o2b2o20b3o2b2o20b3o2b2o20bo3bo14b2obo8bo2b2o7b2obo8bo2b2o19bo18bo4bo$ 100b4o524b3o2b2o15b3o2b2o33b2o3bo19b2o3bo101bobo24bobo24bobo45bobo21bo bo31b2ob2o13b2o$101bo527bobo19bobo18b3o2b2o12bobobo20bobobo102bo3bo22b o3bo22bo3bo42bobo21bobo49b2o$630bo3bo17bo3bo16bobo16b2ob2o20b2ob2o101b o3bo22bo3bo22bo3bo$630bo3bo17bo3bo17bo3bo16bo24bo$674bo3bo11$528bo$ 527b4o178b2o$526bo2b2o178bo2bo$526bo5bo156b2ob2o14bo3b2o154bo20bo$228b 2ob2o293bo4bo156bo18b3o2b2o151b2ob2o16b2ob2o$227bo20bo278bo159b2ob2o 16b2o154bobobo16bobobo28bo80bo22bo$226b2ob2o16bobo278bo2bo156bo3bo16bo 62b2o2bo20b2o2bo20b2o2bo20b2o2bo11b2o3bo15b2o3bo26b2o3bo76bobo20bobo$ 227bo3bo14bo3b3o274bo3bo159bo17b2obo35bo23b3o22b3o22b3o22b3o14bobo2bo 15bobo2bo25b2o2bo52bo23bo3b3o16bo3b3o$25bobo202bo16bob3o278bo156bo25bo 33b5o16b3obo20b3obo20b3obo20b3obo17b2obo17b2obo21b2o3b4obo48b2ob2o23bo b3o4bo2b2o9bob3o$25bobo50b2ob2o143bo21b2o275b2o158bo22bo33bo3b2o4bo14b obobob3obo14bobobob3obo14bobobob3obo14bobobob3obo55b2obo57bobobo25b2o 5bob2o12b2o29bo3bo$22b2obo51bo146bo300bo2b2o154b2ob3o16bo33b3o4bo4bo 14bo3b6o15bo3b6o15bo3b6o15bo3b6o17b2o19b2o15bobob2o43bo2bo8b2o3bo32bo 2bo43b2o2b2o$21bob2o27b2o22b2ob2o142b2ob3o20b2o274b2o75bo38b2o9b2o2bo 6bo19b2o9bo10b2ob3o27b3o7b2o17bo24bo24bo24bo24bo2bo17bo2bo11bob2o2bo4b obo33b2o3bo2bobo8bobo2bo25b2o3bo2bo14b2o26b2ob2o2bo$21bo3bo25b3o23bo3b o140b2o24b3o277bo73b2o36bo10b3o2b2o2bobobo19b2obo5b2o9b2o9bo21bo2bo7bo 19bobo22bobo22bobo22bobo20b5ob2o13b5ob2o6b2o4bo2b2ob4o32b2o3b2o3b2o9b 2obo25b3o5bo14b3o25b2obob2obo$21bob2obo22bo30bo128bo13b2obo22bo276b2o 70b3o36b2o4bo6bo7b4o2bo3bo16bo6b2obo9b2obo5b2o16b2o2bo3bo5bo16bo24bo 24bo24bo26bo20bo14bo4bo3b2o3bo34b2ob2obob4o38bo3b2o17bo5bo19bo3bo5bo$ 22b2obo22b2obo24bo29bo100b3o14bo22bo241bo35bo2bo15b2o8bob2o4b2o32bo2bo 37b2o12b2ob5o3b2o3b2o18b3o16bo6b2obo15b4o2bobob3o2b2o14bo3bo7b2o11bo3b o20bo3bo7b2o11bo3bo23b2o19b2o12b5o7b2o40bobo16b2o22bo5b3o14bo5b3o20b3o $47b2o25bo29b2o3bo60bobobo3bo3bo22b3o18b3o17b2o212bobobo3bobobo15b2o 18bo17b5o9b2ob3o8bo2bo3bo30b2obo33bobo3b2o15b2o10b3o21b2o4bo13b3o20bo 9b2o4bo14bobo9b2o11bobo22bobo9b2o11bobo27b3o18b3o23bo30bo7b2o2bo15bob 3o19b2o7bo13b2o5b2o22bo$48b2ob3o19b2ob3o25b2o2bo85b2ob2o5b2obo6bo12b2o 16bo242bobo4b2o11b2o17bo2bo8b2obo10bo2bo3b2ob2o23b2ob3obo31b3o3bob2o 17b2o11bo41b2o4bo16bo4bo5b2obo14b3o2b2o6bo2bo8b3o2b2o18b3o2b2o6bo2bo8b 3o2b2o26bo20bo53b5o23bo3b3o3b3ob2o8bo22bo10bo15b2o11bo$obobo3bobobo12b 4obo18bo22b2o25b2o3b4obo64bo3bo3bo10bobo7bo3bo2bo2bo21bobo8b2o2b2o208b o3bo3bo17bo7bob3obobob2o2b2o18b3o9bobob2o2b2o4b2o3bo2b3o17bo4bo2bo5bo 2bo21b2o3bo5bo4b2o20bo4b2o9bo15bo40bo3bo7bobo28b2o48b2o36bo20bo19b3o 32bo3b2o4bo23bobo5bo2bo12b2o2b2o17b2o2b2o2bo2bo14bo2bo7bobo$25b2o2bo 14bo6bo21b2obo19b2obo92bo11b3o3b3o2bo14bo3b2obo10bo235b2o8b3o3bobob2o 2bo19b2o11b2ob2o12bo2bo19b2o3b2obo8b3o19bo4b2o10b2o4bo12bo7bo3bo5b2o 14b2o20bo15bo35b2o23b2o23b2o23b2o22bo3bo16bo3bo15bo32b3o4bo4bo24bo6b3o 15bo22bo6bo2bo12bo3b2o6bo$o11bo12b2o3bo13bo3bo6bo18bo20bobob2o73bo3bob obo8bo13bo4bo4bo13b2o15bobo211bobobo3bobobo9b2o4bo4bo3bo12bo33bo2b2o3b ob2o2bo3b2o8bobo2b2o2bo3bo2b2o12b2o11bo2bo2bo3bo4bo9bo16b3o4bo3bo4b2ob o14bo19b2o15bo3bo31b2o23b2o23b2o23b2o21bobo18bobo18bo30b3o7b2o34b2o14b obo20bobo6bob2o11b3o2b2o6b3o$27bo15bobo6bo3bo12bo6b3o12bob2o2bo4bobo 87bo4bo3b2o27bo3b2obo7bo5bo230b2ob5obo7b5o3b3o18bo15bobo5bo4b2obob2o8b obo2b2o5b3o15bo8b2ob2o3bo3b2obo2bo11b2o22bobo44bo14bobo33bo24bo24bo24b o22b3o2b2o14b3o2b2o16b2o27bo2bo7bo38b2o10bo5bo16bo5bo4bo2b2o10b2o$obob o3bobobo29b3o2b2o2b2ob2o13bo3bo3b2o10b2o4bo2b2ob4o69bo7bo10b2o3b9o3bo 3bo20bobo7bo5bo208bo3bo7bo8bo3bo5bo3b3o6b2o4bo16bo16bo3bo7bobobo10bo3b o7b2o2bo22b2obo5bo2b2o51bo12b2o4bo31b3o2b2o27bo24bo24bo24bo93b2o2bo3bo 5bo29b2o8bo2bo9bo5bo16bo5bo20bo$52bo15bobo18bo4bo3b2o3bo98b4o2bobo3b2o 11b2o17b2o234bobo2bobobob3o4b3obo21bo3bo14bob2obo5bobo2b3o8b2ob5obo2bo 2bo23bo2b5obo2b2obobo36bobo19b3o17b2o50bo2b4o18bo2b4o4b2o12bo2b4o18bo 2b4o6b2o15b2o19b2o42b4o2bobob3o2b2o27bo2b4o2bobobobo8b2o21b2o24b2obo$o 3bo7bo10b7o15b2o6b2ob2o9b3o2b2o15b5o7b2o71bo7bo9bobobo4bo9b2o13b3o22bo 208bobobo3bobobo9bobo2b3obo4bo4bobo21b2o3bo15bo4b4obo5b2o8b2o14bo23bo 6bo6bo2bo34bo20bo6b2obo10b6o17b2o28bo2b4o18bo2b4o3bo2bo11bo2b4o18bo2b 4o5bo2bo14b2o19b2o15b2o24bo9b2o4bo28bo2b4o2bo4bo14bo22bo24bob3o$23bo6b o14b2o55bo6bo81bo4bo27bo22b2o3bobo242bobo26b2o25bo3b3o14b4o2bo2bo2b2o 25b3ob3o6bo2bo34bo3b6o10b2obo5b2o10bo3bo19b2o28b2o23b2o8b2o13b2o23b2o 10b2o15bo20bo17bo2b4o20bo4bo5b2obo30bo8bo2bo11b2o3bo17b2o3bo18bo6bo$ob obo3bobobo10b2o3bo16b2o23b2o35bobo81bob4o2bo23b2obo20bo3bo5bo269bo2bo 46bo2bo2bo4b2o25bobo3bo5bob2o33bobobob3obo8b2o9bo10bo4b2o17b2o64b2o50b 2o11bo20bo20bo2b4o20bo11bobo33bo5bo2bo11bo3bo18bo3bo17bo9b2o$25bob2o 41b2o20b3o12bo83b2o29b2o23bo3bo2bo275bo50bo7b3o29bo5bo37b3obo14b2ob3o 15bo2bo150bo2b4o14bo2b4o16bo29bo44b2o18bo3bo18bo3bo16b2ob3o4b2obo$28b 2o11b2obo25b2o20bo14b3o113b2ob3o17b3obo4b3o270bo61b2o38bo38b3o13bo39b 2obo130bo2b4o14bo2b4o19bo24bobo44b2o17b3obo18b3obo16b2o10bobo$28bobo9b obo2bo46bo131bo20bo4bo272bo145b2o2bo13bo19b2o15bobo2bo30b2o2b5o16b2o2b 5o18b2o2b5o16b2o2b5o13b2o19b2o25b2o22bo64bo4bo17bo4bo17b2obo7bo3bo$27b o11b2o3bo21b2obo23b2o131bo17bobobob2o270bobo167bo14bo15b2o3bo30b2o2b2o 4bo14b2o2b2o4bo16b2o2b2o4bo14b2o2b2o4bo60b2o22b3o41b3o2b2o13bobobob2o 15bobobob2o17bo10b2o2bo$26bo4bo8bobobo20bobo2bo159bo13bo3bobo270bo3b3o 160b2obo32bobobo31bobo22bobo24bobo22bobo136bobo16bo3bobo16bo3bobo20b3o 10bo$26bo5bo8b2ob2o18b2o3bo157bo3bo12b2ob3o272bob3o161bo14b2obo18b2ob 2o31b3o4bo17b3o4bo19b3o4bo17b3o4bo58b3o2b2o66bo3bo13b2ob3o17b2ob3o22b 2o$26bo2b2o13bo20bobobo156b2ob2o20bo271b2o162b2o13bob2obo20bo33bo4bo 19bo4bo21bo4bo19bo4bo15b2o2b5o14b2o2b5o13bobo69bo3bo20bo22bo$27b4o35b 2ob2o156bo23b2o433b3o2b2o9bo3bo58bobo22bobo24bobo22bobo14b2o2b2o4bo12b 2o2b2o4bo13bo3bo91b2o21b2o$28bo40bo158b2ob2o18b2o266b2obo164bo3b2o9bob 2o154bobo20bobo20bo3bo91b2o21b2o$518bobo2bo164bo2bo11b2obo154b3o4bo15b 3o4bo$517b2o3bo165b2o16bobo153bo4bo17bo4bo$518bobobo183bobo156bobo20bo bo$519b2ob2o$522bo11$249bo452bobo43b2o$246b2ob2o417bobo14bobo11bo4bo 19b2ob2o18b6o$63b2ob2o14bo162bobobo415bo4bo11bo4bo10b3o4bo17bo22bo3bo$ 62bo17b2o3bo158b2o3bo414b3o4bo9b3o4bo8bobo22b2ob2o19bo4b2o38bobo21bobo $61b2ob2o14b2o2bo160bobo2bo234bobo30b2o143bobo14bobo13b2o2b2o4bo16bo3b o18bo2bo19bo21bobo21bobo$62bo3bo13b4obo160b2obo42bo192bobo30bo2bo28b2o b2o22b2o2bo6bo13b2o2bo6bo48b2o2b2o4bo6b2o2b2o4bo7b2o2b5o20bo40b2o3bo 15b2obo8bo2b2o7b2obo8bo2b2o411bo3bo$65bo225b5o186b2obo31bo3b2o26bo26b 3o2b2o2bobobo11b3o2b2o2bobobo48b2o2b5o8b2o2b5o33bo25b2o17b2o2bo15bob2o 8bob2o8bob2o8bob2o413bo3bo$61bo135b2o2b3ob3o42b2o38b2o4bo184bob2o31b3o 2b2o25b2ob2o22bo7b4o2bo3bo6bo7b4o2bo3bo101bo27bo18b4obo14bo3bo7bo2bo8b o3bo7bo2bo412bobo103bo$59bo22bo113b2o23bo3bo24b2o39bo4bo184bo3bo31b2o 30bo3bo22b2ob5o3b2o3b2o7b2ob5o3b2o3b2o100b2ob3o62bob2obo5bo2bo9bob2obo 5bo2bo176bo235b3o2b2o100b2o$58b2ob3o18b2o113bob2o2b3o2bo12b2o2b2o23b2o 40b2o187bob2obo31bo33bo24b2o10b3o10b2o10b3o14b2o2bo6bo54b2o2b5o12b2o9b o14b2obo40b2obo8bo11b2obo8bo122b2ob2o49bobo100bo231bo4b3o$57b2o22bo 111bo6bo3b3o2bo9b2ob2o2bo65bo189b2obo32b2obo26bo30b2o11bo11b2o11bo12b 3o2b2o2bobobo16b2o17b2o15b2o2b2o4bo12b2obo5b2o13bob2obo15b2obo29b2o22b 2o28bo94bo53bo3b3o33bo61b2o3bo12bo63bo56b2o56bo33b2o4bo2bo$58b2obo23bo 107bo14bobo7b2obob2obo20b3o2b2o37bo230bo23bo37bo4b2o18bo4b2o13bo7b4o2b o3bo12bo2b4o12bo2b4o11bobo20bo6b2obo12bo3bo15bob2obo23bo4b3o16bo4b3o 26bo94b2ob2o14bo36bob3o33b4o37bo21b2o2bo12b4o37bo21b2o3bo39b2o12b2o56b 2o31bobobobo$59bo19b2o111bo15b3o6bo3bo5bo20bobo38bobo194bo30bo27b2ob3o 30bo7bo3bo12bo7bo3bo11b2ob5o3b2o3b2o12bo2b4o12bo2b4o12b3o4bo16b3o18bob 2o16bo3bo24b2o5bo16b2o5bo25b2o15b2o12bo7bob2obo15bo36bo3bo12bobo36b2o 34bo2b2o36b4o19b4obo10bo2b2o36b4o19b2o2bo39bo2bo10bo54b3o34bobobobo$ob obo3bo3bo10b2obo34b3o15bo90bobobo3bobobo10b2obob2o8bo9b3o28bo3bo21bo3b ob2obobob2o170bobobo3bobobo13b2o27bo28b2o36b3o4bo3bo13b3o4bo3bo12b2o 10b3o15bo18bo18bo4bo18b2o4bo14b2obo15bob2o79bo3b2o14bo12bobo6bobo3bo 13bo26b2o12bo12bo3b3o69bo5bo33bo2b2o8b2o25bo5bo33bo2b2o19b4obo11b2o25b 2o9bo21bo33bo2bo22bo3bob2obobo2b2o4bo2bo$22b3obo35b2o15b2o3bo108b2o5b 2o17bo7bo21bo3bo20bo4bo4bobo227b2ob3o25b2obo41bobo22bobo15b2o11bo17bo 18bo18bobo42bobo14b2obo6b3ob2o10bo2bo20bo2bo23b3o2bo4bo10b3o13bo3b3o2b obobo7bobo5b2o24b2o3bo24bob3o17b2ob2o8b2obo36bo4bo5b2o27bo5bo5b2o26bo 4bo34bo5bo6b2o22b2ob3o26b2o7bo2b4o16b2o27b2ob2o25bo4bo4bobo5bo4b3o$o7b o3bo8bo6bo10b2o7b2o31bo2bo89bo3bo16b4o26bo48bo2b2obobobo175bo3bo3bo15b o2bo25b2o31bo91bo4b2o6b2o12b2o17b2o21bo18bo5b2o13bobo17bobo3bo2bo13bo 4b2o17bo4b2o23bo4bo29bob3o3bobo5bob2o3bo5b2o12bo7bobobo4bo6bo2bo14b2o 18bo12bobo2bo36bo6b2o3bo26bo4bo5bob2o2b2o4b2o16bo9b2o27bo4bo6b2o22b2ob o25bo12bo2b4o12b3o26b2o2b2ob2o25bo2b2obobobo16b2o$22b2obo2b2o5bo2b3o7b 3o14bo16b2o114bobo29bo23b2o18b2o9bo198bo4b2o23b2obo30b3o15b3o20bo28bo 16bo7bo3bo2bo2bo11b2o17b2o21bobo15b2o4b3o21b2o10bobo3b3o14bo3bo19bo3bo 22bobo3bo4bo8bo3bo14b2o6bobobo3bo2bob3o5bo11bobo6bobobo3bo2bob3o5bo31b 2ob2o8b2o3bo38bo2bo2bobo8bo21bo6b2obo5bo4b3o17bo2bo2b2o3bo27bo9bob2o2b 2o4b2o12bobob2o2b2o9b2o4bo3bo11b2o10b2o2bo3bo22bo3bo2bo6bo2bo21b2o9bo 15bo$obobo3bobobo10b3obo2b2o2bo29b2o108bo3bobobo17bo16b5o7b2o23b3o21bo b3o2bo174bobobo3bobobo11bo3bo26bo33b2o15bo20b3o26b3o17b3o4bo3bo2b2o54b o2bo16bo3b3o17b2o3b2o16b2o16b6o18b6o19b3o3bo6b2o4b2o4bo22bobobo4bo6bo 2bo12bo3b3o2bobo5bob2o3bo5b2o8b2obo20bo3bo8bobobo4bob2obo15bo12b3o3bob obo4b4o3bo17bo2bo2bobobo4b4o3bo17b3o3bobo8bo22bo2bo2b2obo5bo4b3o13b2ob 2o12bo3bo2bo3bo22bobo3bo23b2o4b3o9b3o24bob3o2bo$25bobobo5bo2bobo2bo3bo 17bo13b2o117bobo16bo4bo3b2o3bo22b2o13bo8bo206b6o26b3o46bobo17b2o27b2o 27bobo4b2o9b3o2b2o12b3o2b2o19bobo40b3o23b2o14b2o22b2o20b2o6bo3bo4b2obo 4b2o11b2obo11b2o3bo24bob3o3bobobo7bobo5b2o8bobo2bo8b2o12bo10b2ob2o3bob o3bo13bo11bob3o3b2obo5bo4b3o17b3o3bobo8bo20bob3o3bobobo4b4o3bo17b3o3bo bobo4b4o3bo16bo2b2o3b2o4bo4bobo3bo21b2obo3bo15b2o2bo2bo4bo2bo14b2o12bo 8bo$o3bo7bo13b2obob2o3b2o2bo3b3obo29b6o90bo7bo12b4o18b2o4bo2b2ob4o35bo bo7bo181bo3bo3bo3bo13b2o30b2o41bo6bo16bo28bo48bobo16bobo22bo13b2o27b2o 3b2o8b2o8bo2bo57b2o9b2obobo2b4o4bobo9bobo2bo12b2o12bo14b2o6bobo3bo13bo 7b2o3bo7b2o3bo24bo3bobobo7bobo5b2o9b4obo7bob2o2b2o4b2o15bob3o3b2o3bo 24b4obo4b2obo5bo4b3o15bob3o3bobo8bo21bobo5bobob3o4b2o4bo21bob2o2bo3bo 11b3o2b2o6b2o16bo12bobo7bo$26b2obo3bo8b2ob2obo13b2o13bo3bo111b2o5b2o 17bob2o2bo4bobo16bo3bo13bo3b3o274b5o7b2o24b5ob2o21b5ob2o21bobo17bo3bo 14bo3bo32b6o29b2o8bo2b4o2bobobobo55b2ob2o6b2obobo2b2o4bo12b2o3bo24bo3b o21bob2obo15bo7bobobo4bobobo4bo6bo2bo17bobo5bob2o3bo5b2o7bo2bo2bo8b2o 24b4obo7b2o24bo2bo2bo7bob2o2b2o4b2o13b4obo4b2o3bo27bo3bo8bob2o7bo14b2o 15b3o9bo12bo30bo3b3o$obobo7bo19bo28b3o13bo4b2o90bo3bobobo10b2obob2o23b obob2o20bo3bo14bob3o187bobobo3bobobo26bo30bo17bo4bo3b2o3bo24bo2bo25bo 2bo23bo20bo3bo14bo3bo16bo14bo3bo21bo3bo15bo2b4o2bo4bo8b7o21b7o12bo3bob o15b4o14bobobo23b2ob2o10b2obo38b2ob2o3bobobo3bo2bob3o5bo16bobobo3bo2bo b3o5bo6bo16b2o22bo2bo2bo32bo15b2o23bo2bo2bo7b2o29bob2ob2obo2bo4bo2b4o 15bo2b4o14b2o7b2ob6obob4obo26bob3o$28bo4bo25bo17bo2bo111bo31b2obo20bob o18b2o215b5o7b2o17b5o7b2o17b2o4bo2b2ob4o25b2o27b2o23bo3b6o48b2ob2o13bo 4b2o19bo3bo16bo8bo2bo9bo6bo20bo6bo12bobo3bo7b2o6bo17b2ob2o23bo12bobo2b o40bo3bobo5bob2o3bo5b2o16bobobo4bo6bo2bo9bo2bo23b4obo6bo40bo2bo12b2o 21bo46bo7b2o8bo2bo15bo2b4o14bo9b2o7bo2b2o4bo25b2o$58b2obo131bo33b2o3b 4obo9b3o2b2o232bo4bo3b2o3bo16bo4bo3b2o3bo18bob2o2bo4bobo79bobobob3obo 46bobobo14bo2bo21bobo22bo5bo2bo9b2o3bo22b2o3bo14bobo2bo2bo34bo25b2ob2o 6b2o3bo45bobobo7bobo5b2o20b2o3bo21b3o23b2o2bo8bo2bo37b3o23b4obo7bo2bo 61b3o16bo31b3o2b4o3bo$57b2o20b2o112bo6bo31b2o2bo28b2obo217b2o4bo2b2ob 4o15b2o4bo2b2ob4o21bobob2o25b2obo25b2obo26b3obo13b2o2b2o13b2o2b2o12b2o 3bo38b3o2b2o20b2o18bob2o24bob2o95bobobo46bobo3bo13bo22b2o12bo12b2obo 20b2o3bo8b3o39b2obo20b2o2bo9b3o62bob2o17bo30bo2b3o5bo24b2obo$58b2ob3o 15bo117bob2o31b2o3bo12b2o12bobo2bo218bob2o2bo4bobo17bob2o2bo4bobo22b2o bo25bobo2bo23bobo2bo29b3o10b2ob2o2bo11b2ob2o2bo12bobo2bo15b2o47b2o21b 2o26b2o20b2o73b2ob2o45bob2obo15bo32bo3bo13bo23bo13b2obo38bo21b2o3bo10b 2obo60bo20b2o40b2obo19bobo2bo$59bo136b2o36bo15b2o11b2o3bo223bobob2o25b obob2o29b2o3b4obo14b2o3bo23b2o3bo30b2o2bo9b4o2bo12b4o2bo13b2obo16bo24b 2o45bobo25bobo97bo99b2ob2o54bo63bo15bo82b2o42bo19b2o3bo$61bo13b2obo 118b2o2b2o47b2o12bobobo224b2obo27b2obo35b2o2bo16bobobo24bobobo47bo18bo 61b2o19b3o2b2o18bo27bo201bo285bobobo$65bo8bob2obo185b2ob2o226b2o3b4obo 20b2o3b4obo25b2o3bo16b2ob2o24b2ob2o48bo18bo18b2o10b2obo25b2o20bobo20bo 4bo22bo4bo198b2ob2o212b3o2b2o62b2ob2o$62bo3bo7bo3bo167b2obo18bo232b2o 2bo26b2o2bo28bo22bo28bo48bobo16bobo17b2o9bob2obo47bo3bo17bo5bo21bo5bo 415bobo68bo$61b2ob2o8bob2o167bobo2bo250b2o3bo25b2o3bo129b2o17b2o17b2o 9bo3bo21b2obo23bo3bo17bo2b2o23bo2b2o418bo3bo$62bo12b2obo165b2o3bo253bo 30bo130b5o14b5o27bob2o21bobo2bo45b4o24b4o418bo3bo$63b2ob2o10bobo164bob obo414b3o16b3o16b3o2b2o8b2obo19b2o3bo47bo27bo$78bobo165b2ob2o413bo2bob 2o12bo2bob2o13bobo14bobo18bobobo$249bo415b3o16b3o17bo3bo11bobo19b2ob2o $704bo3bo36bo46$464b2ob2o19b2ob2o19b2ob2o$257bo3bo15bo3bo12bo3bo15bo3b o144bo23bo23bo23b2o21b2o$207bobo22bobo22b2o2b2o14b2o2b2o11b2o2b2o14b2o 2b2o45b2o22b2o22b2o47b2ob2o19b2ob2o19b2ob2o20bo2bo19bo2bo$204bo4bo19bo 4bo20b2ob2o2bo12b2ob2o2bo9b2ob2o2bo12b2ob2o2bo44b3o21b3o21b3o23b2ob2o 20bo3bo19bo3bo19bo3bo18bo3b2o17bo3b2o$64b2ob2o19bo114b3o4bo17b3o4bo18b 2obob2obo11b2obob2obo8b2obob2obo11b2obob2obo42bo23bo23bo26bo28bo23bo 23bo18b3o2b2o16b3o2b2o52bo3bo24bo3bo29bo$63bo23bobo112bobo22bobo23bo3b o5bo9bo3bo5bo6bo3bo5bo9bo3bo5bo18b2o20b2obo20b2obo20b2obo23b2ob2o21bo 23bo23bo23b2o21b2o56bo3bo24bo3bo28bobo164b2o$62b2ob2o19bo3b3o20bo32bo 30bo23b2o2b2o4bo14b2o2b2o4bo17b3o17b3o14b3o17b3o24b3o19b2o22b2o22b2o 27bo3bo18bo23bo23bo26bo22bo27bo27bobo26bobo30bo3b3o9b2ob2o4b2o3b3o12b 2ob2o4b2o3b3o15bo3bo37bo3bo44bo2bo$63bo3bo19bob3o18b2ob2o28b2ob2o26b2o b2o23b2o2b5o16b2o2b5o19bo7bo11bo7bo8bo7bo11bo7bo15bo24b2ob3o18b2ob3o 18b2ob3o25bo18b2ob3o18b2ob3o18b2ob3o22b2obo19b2obo23b5o23b3o2b2o22b3o 2b2o28bob3o9bobo5b2o3bob2obo10bobo5b2o3bob2obo14bo3bo37bo3bo43bo3b2o$ 66bo21b2o19bobobo28bobobo26bobobo83bo19bo16bo19bo16b2obo23bo23bo23bo 25bo21b2o22b2o22b2o31bo22bo17bo3b2o4bo87b2o10bo8b2o4bob3obo7bo8b2o4bob 3obo11bobo39bobo45b3o2b2o$63bo44b2o3bo27b2o3bo25b2o3bo156b2o21bo6bo16b o6bo16bo6bo21bo24b2obo20b2obo20b2obo23bo22bo20b3o4bo4bo25b2o27b2o42bo 9b5o5b2o7bo9b5o5b2o11b3o2b2o35b3o2b2o11b2o2b2o26b2o$89b2o18bobo2bo27bo bo2bo25bobo2bo72b7o13b7o12b7o13b7o18b2ob3o16bo3bo6bo12bo3bo6bo12bo3bo 6bo16b2ob3o21bo23bo23bo23bo22bo20b3o7b2o28b2o27b2o27b2obo12bo4bo6b3o 14bo4bo6b3o76b2o32bo$64b2o22b3o6bo12b2obo29b2obo27b2obo24b2o2b5o16b2o 2b5o15bo6bo12bo6bo11bo6bo12bo6bo18bo19bobo6bo3bo10bobo6bo3bo10bobo6bo 3bo14b2o21bo6b3o14bo6b3o14bo6b3o18b2ob3o17b2ob3o15bo2bo7bo28bo28bo28bo bo2bo12b2o3b3o21b2o3b3o26b2o40b2o13bob2o5bo23b2obo$64bo2bo21bo6b5o100b 2o2b2o4bo14b2o2b2o4bo14b2o3bo14b2o3bo13b2o3bo14b2o3bo15bo6bo16b3o2b2o 2b2ob2o10b3o2b2o2b2ob2o10b3o2b2o2b2ob2o16b2obo18bo3bo3b2o14bo3bo3b2o 14bo3bo3b2o17b2o21b2o15b2o2bo3bo5bo27bo28bo30b2o3bo22bo28bo24b2o40b2o 9bo6bo4b4o25bob3o$23b4o13bo23b3o20bo7b2o4bo12b2o31b2o29b2o22bobo22bobo 23bob2o16bob2o15bob2o16bob2o15bo3bo6bo22bo23bo23bo20bo19bobo21bobo21bo bo26b2obo19b2obo12b4o2bobob3o2b2o24bo2b4o22bo2b4o26bobobo12bobobo4bo 19bobobo4bo24bo41bo11bo10bo2b2o20bo6bo$obobo3bobobo10bo2b2o11bob2o19b 5o19b2o8bo4bo10bo2bo29bo2bo27bo2bo23b3o4bo17b3o4bo20b2o18b2o17b2o18b2o 13bobo6bo3bo14b2o6b2ob2o11b2o6b2ob2o11b2o6b2ob2o10bo6b3o14b3o2b2o17b3o 2b2o17b3o2b2o24bo22bo13bo9b2o4bo25bo2b4o22bo2b4o27b2ob2o10bo4bo3bo19bo 4bo3bo22bo41bo13bo10bo2bo20bo9b2o$23b2o4bo7b2o4b2o16b2o2bo19bo11b2o12b 5ob2o25b5ob2o23b5ob2o21bo4bo19bo4bo21bobo17bobo16bobo17bobo11b3o2b2o2b 2ob2o15b2o22b2o22b2o21bo3bo3b2o88bo6b3o13bo6b3o10bo4bo5b2obo26b2o27b2o 35bo11bob4o23bob4o25bo2b4o35bo2b4o9b2obob2o4bo2bo18b2ob3o4b2obo$o3bo7b o12bo3bo8bob2obo2b2o14bo2bo20b2o2b2o5bo12bo32bo30bo32bobo22bobo20bo19b o18bo19bo24bo17bo23bo23bo22bobo25b2o22b2o22b2o21bo3bo3b2o13bo3bo3b2o 10bo11bobo104b2o27b2o29bo2b4o35bo2b4o9b2o5b2o3b4o16b2o10bobo$30b2o3bo 2b2o26bo21bo7bo14b2o31b2o29b2o35bo24bo16bo4bo14bo4bo13bo4bo14bo4bo13b 2o6b2ob2o9bo23bo23bo24b3o2b2o22b2o22b2o22b2o20bobo20bobo22bo101bo72b2o 40b2o16b4o7bo2b2o15b2obo7bo3bo$obobo7bo12bo4bo4bobo9bo14bo2bo20bobo5bo bo15b3o30b3o28b3o33bobo2b2o18bobo14bo5bo13bo5bo12bo5bo13bo5bo12b2o19bo 2b4o17bo2b4o17bo2b4o47bo23bo23bo21b3o2b2o16b3o2b2o17bobo39bo28b2ob2o 24bo139bobo4bo2b2o17bo10b2o2bo$25bobo6bo2bo6bo2bo13b2obo6b2o12bo5bob2o 19bo32bo30bo32bo2bo2b3o16bo2bo2b3o9bo2b2o15bo2b2o14bo2b2o15bo2b2o13bo 21bo2b4o17bo2b4o17bo2b4o22b2o20bo23bo23bo71bo6b2o32b5o24bo27b2o3bo138b o4bo2b3o11bo6b3o10bo$o3bo7bo9b2obo3bo4b3o7bo2bo3b2o8bo2bo5b2obo11bo5bo 120bobo22bobo2b2o11b4o16b4o15b4o16b4o10bo24b2o22b2o22b2o27b2o19bo2b4o 17bo2b4o17bo2b4o22b2o21b2o19b3o4bo2b4o22bo3b2o4bo18bo3b2ob2o24b2o2bo 43b2o92bobo4b2o2b2o11bo3bo3b2o$22b2o5bo2bo2b2o6bo6b2o10bobo8b2o11b2o 26bo3bo7bobo16bo3bo7bobo14bo3bo7bobo23bo24bo18bo19bo18bo19bo11bo2b4o4b 2o89bo21bo2b4o17bo2b4o17bo2b4o22b2o21b2o26bo2b4o20b3o4bo4bo18bo4bo3bo 18b2o3b4obo13b2o27bo2b4o25b2ob2o4b2o3b3o12b2ob2o4b2o3b3o13b4o22bobo$ob obo7bo8bo6bo2bo4bo7b2obobobo10b2obo3bo2bo3b2o13bo22bo4bo5b2obo16bo4bo 5b2obo14bo4bo5b2obo138bo2b4o3bo88bo24b2o22b2o22b2o26bo22bo29bo23b3o7b 2o17b2obo8bo16b2obo23bo2b4o22bo2b4o24bobo5b2o3bob2obo10bobo5b2o3bob2ob o10b2o5b2o18b3o2b2o$22bo9b5o7b2obobobo11bob2o2bo6bo10b2o3bo20bo9b2o4bo 14bo9b2o4bo12bo9b2o4bo19bo24bo92b2o8bo87bo2b4o4b2o86bo22bo35bo19bo2bo 7bo19bob2o23bobob2o22bo2b4o23bo28bo8b2o4bob3obo7bo8b2o4bob3obo8b2obob 2o$22bo9b2obo10bo17b2o2b4o15bo3bo22b4o2bobob3o2b2o14b4o2bobob3o2b2o12b 4o2bobob3o2b2o15b2ob2o20b2ob2o20b2o14b2o21b2o14b2o24b3o11b2o24b2o24b2o 20bo2b4o3bo87bo2b4o16bo2b4o31b2o12b2o2bo3bo5bo17b2obo5bo2bo14bob2o2bo 4bobo19bo31bo24bo9b5o5b2o7bo9b5o5b2o8bo30b2o$71bo15bo3bo22b2o2bo3bo5bo 16b2o2bo3bo5bo14b2o2bo3bo5bo16bobobo20bobobo21bo2b4o9bo2b4o16bo2b4o9bo 2b4o33bo2b4o19bo2b4o19bo2b4o15b2o8bo87bo2b4o16bo2b4o31b2o12b4o2bobob3o 2b2o12b4o4b2ob4o3bo9b2o4bo2b2ob4o22bo29b2o23bo4bo6b3o14bo4bo6b3o15bo 29b2o$63b2o21b3obo28bo2bo7bo19bo2bo7bo17bo2bo7bo13b2o3bo19b2o3bo21bo2b 4o9bo2b4o16bo2b4o9bo2b4o33bo2b4o19bo2b4o19bo2b4o25b3o11b2o24b2o24b2o 20b2o21b2o49bo9b2o4bo12b2ob3o4b2o17bo4bo3b2o3bo24b2o27b2o24b2o3b3o21b 2o3b3o21bo6bo22b2o$61b2o2bo19bo4bo29b3o7b2o19b3o7b2o17b3o7b2o13bobo2bo 19bobo2bo21bo15bo22bo15bo17b2o2b5o13bo25bo25bo44bo2b4o19bo2b4o19bo2b4o 73b3o2b2o10bo4bo5b2obo14b2o9bo5bo10b5o7b2o25b2o62bo28bo23bob2o$60b2ob 2o19bobobob2o30b3o4bo4bo18b3o4bo4bo16b3o4bo4bo11b2obo21b2obo25bo15bo 22bo15bo13b2o2b2o4bo15bo25bo25bo41bo2b4o19bo2b4o19bo2b4o74bobo13bo11bo bo25bob2o26bo51b3o2b2o21bobobo4bo19bobobo4bo23b2o21b2obo$59bo5bo18bo3b obo33bo3b2o4bo20bo3b2o4bo18bo3b2o4bo66b2o14b2o21b2o14b2o12bobo23b2o24b 2o24b2o18b2o2b5o13bo25bo25bo80bo3bo14bo88b3o2b2o23bobo23bo4bo3bo19bo4b o3bo25b2o2b2o15bobo2bo$60b3o2bo18b2ob3o39b5o26b5o24b5o16b2o23b2o24b2o 14b2o21b2o14b2o13b3o4bo17b2o24b2o24b2o17b2o2b2o4bo15bo25bo25bo18b2o2b 5o16b2o2b5o25bo3bo12bobo27b2o26b3o31bobo27bo3bo20bob4o23bob4o49b2o3bo$ 61b2o28bo38bo30bo28bo18bob3o20bob3o93bo4bo90bobo23b2o24b2o24b2o15b2o2b 2o4bo14b2o2b2o4bo41bo28b2o27bo34bo3bo24bo3bo20b2o27b2o54bobobo$65b3o 23b2o115bo3b3o18bo3b3o18b3o2b2o9b3o2b2o16b3o2b2o9b3o2b2o15bobo15b3o2b 2o19b3o2b2o19b3o2b2o17b3o4bo17b2o24b2o24b2o16bobo22bobo48b3o26bo2bo25b o34bo3bo135b2ob2o$67bo23b2o116bobo22bobo22bobo13bobo20bobo13bobo37bobo 23bobo23bobo21bo4bo89b3o4bo17b3o4bo72b2o27b2o175bo$210bo24bo24bo3bo11b o3bo18bo3bo11bo3bo35bo3bo21bo3bo21bo3bo21bobo15b3o2b2o19b3o2b2o19b3o2b 2o16bo4bo19bo4bo$260bo3bo11bo3bo18bo3bo11bo3bo35bo3bo21bo3bo21bo3bo40b obo23bobo23bobo22bobo22bobo$453bo3bo21bo3bo21bo3bo$453bo3bo21bo3bo21bo 3bo12$152bobo16bobo19bobo16bobo$129bo3bo15bo4bo13bo4bo16bo4bo13bo4bo 179b2ob2o22b2ob2o$26b2o2b2o97bo3bo14b3o4bo11b3o4bo14b3o4bo11b3o4bo177b o26bo148bo159b2ob2o21b2ob2o$25b2o101bobo16bobo16bobo19bobo16bobo79b2o 25b2o74b2ob2o22b2ob2o26bo3bob2obobo106b5o22bo132bo25bo25b2o27b2o$26bob 2o97b3o2b2o12b2o2b2o4bo8b2o2b2o4bo11b2o2b2o4bo8b2o2b2o4bo71b3o24b3o23b 2ob2o19b2ob2o23bo3bo22bo3bo24bo4bo4bobo23bo27bo53bo5bo20b5o110bo17b2ob 2o21b2ob2o21b6o23b6o$22bo6bo117b2o2b5o10b2o2b5o13b2o2b5o10b2o2b5o70bo 26bo26bo23bo31bo26bo25bo2b2obobobo23b2o3bo23b4o52b2o23bo5bo106b2ob2o 17bo3bo21bo3bo19bo3bo24bo3bo$22bo107b2o104b2o22b2o23b2obo23b2obo23b2ob 2o19b2ob2o24bo26bo29b2o9bo22b2o2bo23bo2b2o56bo21b2o16bo3bo88bobobo21bo 25bo20bo4b2o22bo4b2o$21bo63bo28bo15b2o103b3o21b3o22b2o25b2o27bo3bo19bo 3bo21bo26bo35bob3o2bo17b2o3b4obo22bo5bo23bo27b2o27bo13bo3bo87b2o3bo17b o25bo24bo2bo25bo2bo54b2o$22b2obob2o21b2o2b2o27b2o3bo23b2o3bo12b2o101bo 23bo27b2ob3o21b2ob3o25bo23bo21b2ob3o21b2ob3o22bo8bo21b2obo32bo4bo23b5o 12b2ob2o4b2o27b2o14bobo91bobo2bo14bo25bo112bo152bo2b2o$22b2o5b2o21b4o 27b2o2bo24b2o2bo29b2o17b2o18b2o17b2o26b2obo20b2obo26bo26bo25bo23bo24b 2o25b2o26bobo7bo20bobob2o32bo22bo3b2o4bo10bobo5b2o4bo12b2ob2o4b2o16b3o 2b2o89b2obo14b2ob3o20b2ob3o24b2o5bo21b2o5bo40bo4bo4bo22bobo123bob2o$ 24b4o19b2o6b2o21b2o3b4obo18b2o3b4obo8b2obo16bo2b4o12bo2b4o13bo2b4o12bo 2b4o20b2o22b2o24bo6bo19bo6bo21bo23bo27b2obo23b2obo22bo3b3o21bob2o2bo4b obo29bobo17b3o4bo4bo9bo8b2o4bo11bobo5b2o4bo38b2ob2o4b2o3b3o18b2ob2o4b 2o3b3o36b2o24b2o29bo4b3o21bo4b3o37b2o5b2o26bo4bo32b2o2bobo9bo22b2o2bob o4bo38bo2bo$27bobo17b2obob5o18b2obo25b2obo17bobo2bo15bo2b4o12bo2b4o13b o2b4o12bo2b4o21b2ob3o18b2ob3o19bo3bo6bo15bo3bo6bo16b2ob3o18b2ob3o24bo 26bo25bob3o20b2o4bo2b2ob4o29b2o16b3o7b2o11bo9b6o11bo8b2o4bo16b2o19bobo 5b2o3bob2obo16bobo5b2o3bob2obo22b2o12b2obo22b2obo31b2o27b2o37bobobob3o 27bo4bob2o28b2o3b2o6b2o2bo21b2o3b2o3b3o37bo2bo$29bo16bo3b2o22bobob2o 23bobob2o15b2o3bo17bo18bo19bo18bo27bo23bo22bobo6bo3bo13bobo6bo3bo14b2o 22b2o24bo6b3o17bo6b3o22b2o22bo4bo3b2o3bo27bob2o16bo2bo7bo13bo4bo6b2o 11bo9b6o17b2o18bo8b2o4bob3obo13bo8b2o4bob3obo18bo2bo13bo25bo24b2obo8bo 16b2obo8bo35bobobob3o27b2o3bo32b2o4bo4bo3bo23b2o4bo2b2o40bo$27bobo17b 3o20bob2o2bo4bobo15bob2o2bo4bobo12bobobo20bo18bo19bo18bo19bo6bo16bo6bo 19b3o2b2o2b2ob2o13b3o2b2o2b2ob2o16b2obo20b2obo21bo3bo3b2o17bo3bo3b2o 46b5o7b2o26b2o3bo11b2o2bo3bo5bo16b2o3b3o17bo4bo6b2o17bo19bo9b5o5b2o13b o9b5o5b2o18b5ob2o12b3o23b3o19bob2obo5bo2bo14bob2obo5bo2bo21bo3bob2obob o2b2o5b2o67b2o6bobo28b2o7bo26b2o2bobo2b2o$24b4o19b3o18b2o4bo2b2ob4o13b 2o4bo2b2ob4o13b2ob2o20b2o17b2o18b2o17b2o17bo3bo6bo12bo3bo6bo25bo26bo 20bo23bo22bobo24bobo26b2obo37bo26bo6bo9b4o2bobob3o2b2o23bo16b2o3b3o19b o23bo4bo6b3o20bo4bo6b3o23bo21b2o24b2o19bo3bo7bo2bo13bo3bo7bo2bo19bo4bo 4bobo5bo4bo4bo21b5o29bo2b2o3bo5b2obo21bo2b2o3bo5bo2bo24b2o3b2o3b3o$obo bo3bobobo9b2o5b2o12b2o23bo4bo3b2o3bo14bo4bo3b2o3bo17bo21b2o17b2o18b2o 17b2o16bobo6bo3bo10bobo6bo3bo17b2o6b2ob2o14b2o6b2ob2o10bo6b3o14bo6b3o 17b3o2b2o20b3o2b2o22bobo2bo63b7o9bo9b2o4bo14bobobo4bo26bo16bo2b4o6bo 12b2o3b3o13b2o12b2o3b3o10b2o18b2o66bob2o8bob2o13bob2o8bob2o19bo2b2obob obo14bo15bo3b3ob2ob3o23bo4bob3o5bo5b2o16bo4bob3o5bo5bo2bo24b2o4bo4bo$ 22b2obob2o13b6o20b5o7b2o15b5o7b2o115b3o2b2o2b2ob2o10b3o2b2o2b2ob2o18b 2o25b2o21bo3bo3b2o14bo3bo3b2o72b2o3bo27b3o51bo4bo5b2obo14bo4bo3bo17bob obo4bo17bo2b4o5b5o18bo10b3o21bo7b3o19b3o20bo25bo18b2obo8bo2b2o12b2obo 8bo2b2o17b2o9bo14b2o11b2o5b2o3bob2o2bo19bobo5b2o6bo4bo17bobo5b2o6bo5bo b2o27b2o$o3bo3bo3bo8bo19bo3bo6b2o2b5o20bo6bo21bo6bo14bo15b3o2b2o12b3o 2b2o13b3o2b2o12b3o2b2o23bo23bo20bo26bo22bobo21bobo28b2o25b2o24bobobo 27bo53bo11bobo14bob4o20bo4bo3bo18b2o9bo5bo7bobobo4bo9bo15bobobo4bo6bo 25bo19b2o24b2o21bobo26bobo32bob3o2bo27b2o2b3o5b2obo2bo18bo3b4o5b2obob 3ob3o14bo3b4o5b2obob3o3bo2b2o18bo2b2o3bo$22bo18bo4b2o3b2o2b2o4bo24bobo 26bobo14bobo2b2o10bobo16bobo17bobo16bobo19b2o6b2ob2o11b2o6b2ob2o12bo 26bo24b3o2b2o17b3o2b2o25b2o25b2o25b2ob2o26bo40bo16bo12b2o10b2o24bob4o 34b2o10bo4bo3bo9b2obo12bo4bo3bo6b2obo17bo26bo25bo21bobo26bobo23bo8bo 34b4o2bo11bo19bob3obo6bo2b2o21bob3obo6bo2b2o22bo4bob3o5bo$obobo3bobobo 9bo6bo11bo2bo7bobo31bo28bo15bo2bo2b3o10bo3bo14bo3bo15bo3bo14bo3bo16b2o 22b2o22bo2b4o20bo2b4o74bo26bo30bo28b2o36b2o3bo11bobo11b3o36b2o42bo7bob 4o12b2o15bob4o9b2o20bo3bo124bobo7bo48b3o4bo17b2o11bob2o22b2o11bob2o21b obo5b2o6bo$26bob2o23b3o4bo7b7o11b3o6b7o13b3o14bobo15bo3bo14bo3bo15bo3b o14bo3bo15bo23bo24bo2b4o20bo2b4o22b2o22b2o23bo26bo100b2o2bo12bo11bo81b 2o9b2o17b2ob3o10b2o14b2ob3o14bobo22b2o22b2o22bo3bo23bo3bo23bo3b3o54b2o 35bobo36bobo21bo3b4o5b2obob3o$o3bo3bo3bo12b2o16b2o9bo4bo8bo6bo19bo6bo 29bo92bo23bo27b2o25b2o27b2o22b2o22bo2b4o20bo2b4o27bo62b2o3b4obo11b3o8b 2obo67b2ob2o4b2o32bo31bo17b3o2b2o18b3o10bo10b6o19bo3bo23bo3bo24bob3o 37b2obo18b2obo12b2obo35b2obo38bob3obo6bo2b2o$26b2o2b2o11bo13bobo8b2o3b o21b2o3bo52bobo17bobo16bobo17bobo9bo2b4o4b2o11bo2b4o6b2o69bo23bo24bo2b 4o20bo2b4o23bo30b7o26b2obo31b2o69bobo5b2o4bo31bo31bo38bo10b2o2bo9bo3bo 20bobo25bobo28b2o38bob2obo18bobo11bobo2bo33bobo2bo38b2o11bob2o$obobo3b obobo57bob2o23bob2o28bo4b3o16bobo17bobo16bobo17bobo9bo2b4o3bo2bo10bo2b 4o5bo2bo65bo23bo27b2o25b2o26b2o3bo27bo6bo24bobob2o31b2ob3o10b2o24b2o 25bo8b2o4bo35bo31bo14b2o17b2obo7bo3bo10bo4b2o17b3o2b2o21b3o2b2o65bo3bo 19bo3bo8b2o3bo33b2o3bo52bobo$30b2o7b2obo30b2o25b2o24b2ob2o3bo15b2obo 16b2obo15b2obo16b2obo11b2o8b2o12b2o10b2o16bo28b2ob2o16bo2b4o4b2o11bo2b 4o6b2o69b2o2bo28b2o3bo22bob2o2bo4bobo28bo14bo2b4o19bo2b4o19bo9b6o33bo 3bo27bo3bo13b2o5bo10b2o10bobo12bo2bo76b2obo40bob2o21bo3bo8bobobo34bobo bo35b2obo$38bob2obo29bobo24bobo22bobobo4bo14bob2o16bob2o15bob2o16bob2o 23b2o24b2o14bobo26bo21bo2b4o3bo2bo10bo2b4o5bo2bo68b4obo29bob2o20b2o4bo 2b2ob4o30bo12bo2b4o19bo2b4o20bo4bo6b2o33b2ob2o27b2ob2o14b2o3bobo11b2ob 3o4b2obo39b2o26b2o22bobo2bo40b2obo20b2o12b2ob2o34b2ob2o33bobo2bo$23b2o 13bo3bo29bo26bo24b2o3bo5b2o12bo3bo15bo3bo14bo3bo15bo3bo63bo3b3o22b2ob 2o18b2o8b2o12b2o10b2o16bo28b2ob2o58b2o19bo4bo3b2o3bo35bo9bo25bo26b2o3b 3o39bo31bo22bo14bo9b2o15b2o5bo17b2o26b2o21b2o3bo44bobo20bo2bo11bo38bo 33b2o3bo$23bo2b4o8bob2o29bo4bo21bo4bo21bobo2bo18bob2obo14bob2obo13bob 2obo14bob2obo63bob3o24bo3bo28b2o24b2o14bobo26bo63bobo18b5o7b2o33bo3bo 11bo25bo32bo38b2ob2o27b2ob2o8b2obo5b3o14bo6bo17bo4b3o17b2o26b2o22bobob o44bobo21b2o86bobobo$23bo2b4o9b2obo28bo5bo20bo5bo21b2obo20b2obo16b2obo 15b2obo16b2obo12b2o2b5o17b2o2b5o18b2o29bo70bo3b3o22b2ob2o19b2obo36bo 34bo32b2ob2o13b2o24b2o20bobobo4bo83bobo2bo6b3o17bob3o20b2o71b2ob2o156b 2ob2o$24bo17bobo26bo2b2o22bo2b2o121b2o2b2o4bo15b2o2b2o4bo44bo75bob3o 24bo3bo17bob2obo34bo4bo64bo16b2o24b2o19bo4bo3bo83b2o3bo6b2o2bo12b2obo 16b2obo8bo12b2obo24b2obo28bo160bo$27bo14bobo27b4o23b4o27b2o22bo19bo18b o19bo11bobo23bobo20b2obo25bo25b2o2b5o17b2o2b5o18b2o29bo18bo3bo35bo5bo 19b3o42b2ob2o58bob4o88bobobo7bob2o12bo18bob2obo5bo2bo10bobo2bo22bobo2b o$28b2o43bo26bo29b2o22b2o18b2o17b2o18b2o11b3o4bo18b3o4bo13bobo2bo23b2o b3o20b2o2b2o4bo15b2o2b2o4bo44bo22bob2o36bo2b2o21bo57b3o2b2o19b3o2b2o 17b2o93b2ob2o7b4o10b2o18bo3bo7bo2bo8b2o3bo22b2o3bo$28b2o100b2o95bo4bo 20bo4bo13b2o3bo23b2o26bobo23bobo20b2obo25bo25b2obo36b4o21bo58bobo23bob o118bo21b3o2b2o14bob2o8bob2o9bobobo23bobobo$152bo2bo16bo2bo15bo2bo16bo 2bo15bobo23bobo14bobobo24b2obo24b3o4bo18b3o4bo13bobo2bo23b2ob3o24bobo 35bo24b2o57bo3bo21bo3bo138bo3b2o15b2obo8bo2b2o8b2ob2o23b2ob2o$25b3o2b 2o95b3o2b2o18bo4b2o13bo4b2o12bo4b2o13bo4b2o56b2ob2o24bo27bo4bo20bo4bo 13b2o3bo23b2o29bobo119bo3bo21bo3bo139bo2bo19bobo22bo27bo$26bobo99bobo 21bo3bo15bo3bo14bo3bo15bo3bo61bo27b3o26bobo23bobo14bobobo24b2obo318b2o 21bobo$27bo3bo97bo3bo19b6o14b6o13b6o14b6o88b2o70b2ob2o24bo$27bo3bo97bo 3bo20b2o18b2o17b2o18b2o166bo27b3o$410b2o12$323bo3bo13bo3bo17bo3bo$323b o3bo13bo3bo17bo3bo11bo3bo16bo3bo17bo3bo14bo3bo17bo3bo14bo3bo$244bo3bo 15bo3bo19bobo17bobo11bobo15bobo19bobo14bo3bo16bo3bo17bo3bo14bo3bo17bo 3bo14bo3bo$244bo3bo15bo3bo16bo4bo14bo4bo10b3o2b2o11b3o2b2o15b3o2b2o10b obo18bobo19bobo16bobo19bobo16bobo19bobo88b2ob2o$243bobo17bobo18b3o4bo 12b3o4bo65b3o2b2o14b3o2b2o15b3o2b2o12b3o2b2o15b3o2b2o12b3o2b2o13bo4bo 16bobo16bobo49bo$224bobo15b3o2b2o13b3o2b2o14bobo17bobo18b2o16b2o20b2o 133b3o4bo12bo4bo13bo4bo23b2o23b2ob2o$221bo4bo55b2o2b2o4bo9b2o2b2o4bo 11b2o16b2o20b2o14b2o19b2o20b2o17b2o20b2o17b2o13bobo17b3o4bo11b3o4bo21b 3o24bo3bo$220b3o4bo17b2o18b2o16b2o2b5o11b2o2b5o11bo17bo21bo16b2o19b2o 20b2o17b2o20b2o17b2o12b2o2b2o4bo9bobo16bobo25bo31bo55b2o$219bobo23b2o 18b2o53bo17bo21bo18bo20bo21bo18bo21bo18bo15b2o2b5o9b2o2b2o4bo8b2o2b2o 4bo17b2obo25bo58b6o14bo12b2o15bo12b2o14bo12b2o97bo$218b2o2b2o4bo15bo 19bo54bo2b4o11bo2b4o15bo2b4o10bo20bo21bo18bo21bo18bo37b2o2b5o10b2o2b5o 17b2o26bo31bo27bo3bo15bobo5bo5b4o12bobo5bo5b4o11bobo5bo5b4o17b2ob2o4b 2o3b3o46b3o5b2o3b2obo15bo3bo56b2o$219b2o2b5o13bo19bo57bo2b4o11bo2b4o 15bo2b4o9bo2b4o14bo2b4o15bo2b4o12bo2b4o15bo2b4o12bo2b4o78b2ob3o20b2ob 3o25b2o3bo24bo4b2o12bo2bo4b5o3b3o11bo2bo4b5o3b3o10bo2bo4b5o3b3o16bobo 5b2o3bob2obo44bob2o4bo9b2o13bo3bo55b3o$134b2o68b2o2bo31bo2b4o13bo2b4o 15b2o16b2o17b2o16b2o20b2o14bo2b4o14bo2b4o15bo2b4o12bo2b4o15bo2b4o12bo 2b4o20b3o56bo23b2o30b2o2bo25bo2bo13b3o6b2o3b2o3bo10b3o6b2o3b2o3bo9b3o 6b2o3b2o3bo16bo8b2o4bob3obo41bo7bo3b4obo15bobo21bo2bo31bo$27bo103b2o 71b3o33bo2b4o13bo2b4o15bo2b4o11bo2b4o68b2o19b2o20b2o17b2o20b2o17b2o15b 2o8bo18b3o16b3o13bo6bo22b2obo22b2o3b4obo41bo10bo4bo13bo10bo4bo12bo10bo 4bo18bo9b5o5b2o41b2o8bo9b2o11b3o2b2o18bo3bo29b2obo$26bobo42bo2bo55b3o 67b3obo35b2o18b2o20bo2b4o11bo2b4o188bo2b4o3bo8b2o8bo8b2o8bo15bo3bo6bo 19bo21b2obo36b2o13bobo4bo2b2o18bobo4bo2b2o17bobo4bo2b2o24bo4bo6b3o32bo 15b2o4b5o3bo41bo3b2o28b2o$25bo3b3o36bo2bo3bo48b2o73bobobob3obo9b2o2b5o 55bo17bo193bo2b4o4b2o6bo2b4o3bo8bo2b4o3bo14bobo6bo3bo13bo6b3o16bobob2o 35b2o14b2o8bo19b2o8bo18b2o8bo25b2o3b3o23b3o5b2o3b2obo15bo4b2o5bo21b2o 20b2o32b2ob3o$26bob3o36bobobo4bo47bobobobob2ob2o11b4o47bo3b6o9b2o2b2o 4bo57bo17bo14b2o18b2o16b2o137bo17bo2b4o4b2o6bo2b4o4b2o11b3o2b2o2b2ob2o 14bo3bo3b2o12bob2o2bo4bobo27b2o2bo17b2o2b2obo22b2o2b2obo21b2o2b2obo35b o20bob2o4bo9b2o14b2o3b3o25b2o20b2ob2o11bo18bo$27b2o38b2o2b2o38bo3bob2o bobo2b2o6bo14bo2b2o46bo19bobo65b2o16b2o12bo2b4o13bo2b4o11bo2b4o13b2o 19b2o18b2o17b2o18b2o17b2o21bo15bo18bo32bo16bobo18b2o4bo2b2ob4o27b6o16b 2o5bo22b2o5bo21b2o5bo25bobobo4bo20bo7bo3b4obo18bo5bo24bo25b2obo8b2o20b o$obobo3bobobo48b2ob2o2bobobo4bo6bo25bo4bo4bobo3bo21b2o4bo7b2o3bo32bob o17b3o4bo13b2o2b5o13b2o2b5o15b2o16b2o12bo2b4o13bo2b4o11bo2b4o13bo2b4o 14bo2b4o13bo2b4o12bo2b4o13bo2b4o12bo2b4o17b2o16bo18bo22b2o6b2ob2o10b3o 2b2o15bo4bo3b2o3bo27bo18b3o4bo22b3o4bo21b3o4bo28bo4bo3bo20b2o8bo9b2o 11bo4b2o25bo31b2o2bo4bobo23bo$23b2obo33bo8b2obo4bo6bo25bo2b2obobobo29b o3bo7bobo30bo25bo4bo13b2o2b2o4bo11b2o2b2o4bo47bo19bo17bo18bo2b4o14bo2b 4o13bo2b4o12bo2b4o13bo2b4o12bo2b4o17b2o17b2o17b2o20b2o43b5o7b2o29bo5bo 11bo6bo22bo6bo21bo6bo28bob4o25b2o4b5o3bo16b2ob4o25bo2b4o27bobo3bo24bo 3bo$o3bo3bo3bo9bobo2bo31b2ob2o4bo3b2o3bo6bob3o2bo18b2o9bo15bo17b2o5bob 2o29bo3bo24bobo14bobo19bobo18b3o2b2o11b3o2b2o14bo19bo17bo16bo20bo19bo 18bo19bo18bo41b2o17b2o19bo26b2o30bo29bo5bo11b2o4bo23b2o4bo22b2o4bo29b 2o30bo4b2o5bo18b5o26bo2b4o24b5ob3o24b2ob2o$21b2o3bo17bo15bo3bo4bo2b2o 2bo3b2o9bo22bob3o2bo12bo3bo11bo4bo7b3o12b3o13bobo32bo12b3o4bo14b3o4bo 13bobo15bobo18b2o18b2o16b2o17bo20bo19bo18bo19bo18bo16b3o2b2o52bo29b2o 80b3o27b3o26b3o64b2o3b3o6b2o45b2o29bo2bo30bo$obobo3bobobo9bobobo16b2o 18bo5bo3b2obo3bo2b2obobobo14bo8bo18b2ob2o12bobo24bo15b3o2b2o3b2o24bobo 11bo4bo16bo4bo15bo3bo13bo3bo15b2o18b2o16b2o18b2o19b2o18b2o17b2o18b2o 17b2o15bobo15b3o2b2o12b3o2b2o13bo2b4o23bo22b3o6bo5bo25bo115bo29bo5bo6b o2b4o71b5ob3o26b2ob2o$23b2ob2o15bo15bo20bo4bo4bobo11bobo7bo19bo12b2obo 3bo11b2o4b3o6b2o20bo2b4o18bo2bo14bobo19bobo15bo3bo13bo3bo73b2o19b2o18b 2o17b2o18b2o17b2o16bo3bo13bobo16bobo16bo2b4o20bo25bo8bo5bo23b2o3bo138b o4b2o10bo2b4o74bobo3bo$o3bo7bo13bo9b2o6bo12bo23bo3bob2obobo10bo3b3o25b 2ob2o7b2o5bo2bo2b5o2bo3bo3b2o5bo13b2o5bo2b4o19bobo19bo21bo47b3o2b2o13b 3o2b2o11b3o2b2o133bo3bo14bo3bo14bo3bo13b2o24bo2b4o20bo7bo30b2o2bo16b2o 29b2o28b2o28bo30b2ob4o12bo61bo16b2o2bo4bobo11bo12b2o$33b2ob3o4bobo10b 2ob3o42bob3o37bo6bo2bo3bo8bo4bobo19b2o6bo24bo21bobo19bobo15b2o16b2o11b obo17bobo15bobo16b3o2b2o14b3o2b2o13b3o2b2o12b3o2b2o13b3o2b2o12b3o2b2o 33bo3bo14bo3bo39bo2b4o21b2o6b6o19b2o3b4obo14b3o28b3o27b3o27bobo30b5o 16bo11b2o30b3o5b2o3b2obo12b2obo8b2o11bobo5bo5b4o$obobo3bobobo16bobo3b 2o2bo3bo2bo8b2o48b2o40bo9b2ob2o4b4o7bo18b2o9bo42bo2bo18bo2bo15b3o15b3o 11bo3bo15bo3bo13bo3bo14bobo18bobo17bobo16bobo17bobo16bobo21b2o76b2o34b 2o2bo17b2obo22bo30bo29bo30bo3b3o49b2o9bo2b4o24bob2o4bo9b2o7b2ob2o11bo 10bo2bo4b5o3b3o$29bo4bobo2bo3bo12b2obo87bo9b3o3b2o4bobo6bobo27b2o16bo 4b3o17bobo19bobo15b2o16b2o12bo3bo15bo3bo13bo3bo15bo3bo16bo3bo15bo3bo 14bo3bo15bo3bo14bo3bo16b3obo15bobo17bobo13bobo61b2o15bobob2o20b2obo27b 2obo26b2obo29bob3o50b2o9bo2b4o23bo7bo3b4obo10b2o9bo13b3o6b2o3b2o3bo$ 26b2obo3bob2o7bo2bo9bo43b2obo74b2ob2o8b2obo12b2o13b2ob2o3bo19bo21bo 107bo3bo16bo3bo15bo3bo14bo3bo15bo3bo14bo3bo15b2o19bobo17bobo13bobo61b 2o11bob2o2bo4bobo15b2o29b2o28b2o33b2o64bo27b2o8bo9b2o6bo3b2o4b3o13bo 10bo4bo$26b2o3b2o4b2ob3obo3bo10b3o38bobo2bo85bobo2bo25bobobo4bo56bobo 15bobo18b2o18b2o16b2o132bo18b2obo16b2obo12b2obo25bobo46b2o4bo2b2ob4o 16b2ob3o25b2ob3o24b2ob3o79b3o2b2o11bo25b2o4b5o3bo13bo3bo4b2o14bobo4bo 2b2o$25bo13b4o4bo12b2o37b2o3bo85b2o3bo9b3o2b2o9b2o3bo5b2o14bo21bo17bob o15bobo16b3obo15b3obo13b3obo16bobo19bobo16bobo17bobo16bobo16bobo14b2o 15bob2o16bob2o12bob2o26bobo33bo2bo9bo4bo3b2o3bo18bo30bo29bo28b2obo52bo bo15b2o24bo4b2o5bo14bo2bo8bo13b2o8bo$26bo3bo8b2obob2o54bobobo86bobobo 10bobo13bobo2bo17b2ob2o17b2ob2o13b2obo14b2obo17b2o18b2o16b2o20bobo19bo bo16bobo17bobo16bobo16bobo15bo15bo3bo15bo3bo11bo3bo22b2obo35bo4b2o6b5o 7b2o21bo30bo29bo25bobo2bo52bo3bo12b2o25b2o3b3o28bo2bo14b2o2b2obo$26bo 74b2ob2o86b2ob2o10bo3bo11b2obo17bobobo17bobobo13bob2o14bob2o17bo19bo 17bo19b2obo18b2obo15b2obo16b2obo15b2obo15b2obo19bo13bob2obo14bob2obo 10bob2obo20bob2o36bo3bo21bo25bo30bo29bo20b2o3bo53bo3bo40bo5bo29bo2bo 13b2o5bo$104bo90bo11bo3bo31b2o3bo16b2o3bo13bo3bo13bo3bo17b2o18b2o16b2o 16bob2o18bob2o15bob2o16bob2o15bob2o15bob2o19b3o13b2obo16b2obo12b2obo 21bo3bo36b6o42bo3bo26bo3bo25bo3bo20bobobo67b3o2b2o20bo4b2o33bob2o9b3o 4bo$227b2o15bobo2bo16bobo2bo12bob2obo12bob2obo17bo19bo17bo16bo3bo17bo 3bo14bo3bo15bo3bo14bo3bo14bo3bo19b2o74bob2obo36b2o12b3o29b2ob2o26b2ob 2o25b2ob2o22b2ob2o67bobo22b2ob4o35bo2b2o7bo6bo$226bob3o14b2obo18b2obo 14b2obo14b2obo20bo19bo17bo14bob2obo16bob2obo13bob2obo14bob2obo13bob2ob o13bob2obo95b2obo51bo32bo30bo29bo28bo69bo3bo20b5o48b2o4bo$225bo3b3o94b 3o17b3o15b3o14b2obo18b2obo15b2obo16b2obo15b2obo15b2obo18b2o17b4obo14b 4obo10b4obo72bo33b2ob2o26b2ob2o25b2ob2o93bo3bo75b3o$226bobo20b2o20b2o 54b2o18b2o16b2o134bob3o15b2o2bo15b2o2bo11b2o2bo74b2o$227bo20bob3o17bob 3o13b4obo12b4obo188bo3b3o14b2o3bo14b2o3bo10b2o3bo20b4obo$247bo3b3o15bo 3b3o12b2o2bo13b2o2bo15b2o18b2o16b2o18b4obo16b4obo13b4obo14b4obo13b4obo 13b4obo12bobo19bo19bo15bo23b2o2bo$248bobo19bobo15b2o3bo12b2o3bo13bob3o 15bob3o13bob3o16b2o2bo17b2o2bo14b2o2bo15b2o2bo14b2o2bo14b2o2bo14bo80b 2o3bo$249bo21bo18bo17bo15bo3b3o13bo3b3o11bo3b3o15b2o3bo16b2o3bo13b2o3b o14b2o3bo13b2o3bo13b2o3bo96bo$325bobo17bobo15bobo20bo21bo18bo19bo18bo 18bo$326bo19bo17bo14$243bo22b2o20b2ob2o14bo$240b2ob2o20b3o19bo16b2ob2o 173b2o20b2o$239bobobo19bo22b2ob2o12bobobo125bo23bo23b3o19b3o$182bo3bo 15bobo19bobo11b2o3bo18b2obo21bo3bo10b2o3bo122b2ob2o19b2ob2o20bo21bo$ 182bo3bo12bo4bo16bo4bo12bobo2bo16b2o27bo12bobo2bo18bo3bo19bobo17bobo 19bobo19bobo11bobobo19bobobo20b2obo18b2obo$159bobo19bobo14b3o4bo14b3o 4bo12b2obo18b2ob3o18bo17b2obo19bo3bo16bo4bo14bo4bo16bo4bo16bo4bo10b2o 3bo18b2o3bo19b2o20b2o$156bo4bo18b3o2b2o10bobo19bobo41bo20bo41bobo18b3o 4bo12b3o4bo14b3o4bo14b3o4bo10bobo2bo18bobo2bo19b2ob3o16b2ob3o39bo$155b 3o4bo33b2o2b2o4bo11b2o2b2o4bo15b2o19bo17b2ob3o19b2o15b3o2b2o14bobo17bo bo19bobo19bobo17b2obo20b2obo21bo21bo42b5o181b2o$154bobo26b2o12b2o2b5o 13b2o2b5o15bob3o21bo12b2o23bob3o33b2o2b2o4bo9b2o2b2o4bo11b2o2b2o4bo11b 2o2b2o4bo61bo21bo39bo5bo90bo32bo56bo2bo90bo3bo$153b2o2b2o4bo19b2o57bo 3b3o17bo3bo12b2obo19bo3b3o15b2o16b2o2b5o11b2o2b5o13b2o2b5o13b2o2b5o15b 2o22b2o25bo21bo36b2o20b2ob2o4b2o3b3o29bo25b2o3bo27b2o3bo30bo21bo3b2o 89bo3bo$154b2o2b5o20b2o58bobo19b2ob2o14bo22bobo18b2o103bob3o19bob3o20b o3bo17bo3bo39bo16bobo5b2o3bob2obo27b4o23b2o2bo28b2o2bo29b2o3bo17b3o2b 2o11bo3bo72bobo167b3o$207b2o20b2o13bo21bo19b3o19bo18bo104bo3b3o17bo3b 3o18b2ob2o17b2ob2o37b2o17bo8b2o4bob3obo24bo2b2o23b4obo27b4obo28b2o2bo 19b2o15bo3bo71b3o2b2o58bo104bo$179b2obo13b2o8b2o8b2o10b2o37b2ob2o15b2o 35bo31b2o18b2o20b2o20b2o11bobo21bobo22bo21bo28b2ob2o4b2o19bo9b5o5b2o 25bo5bo88b4obo19bo14bobo133bo4bobo89bo16bo14bo$178bobo2bo12bo2b4o3bo2b o6bo2b4o5bo2bo74bo5bo10bo2b4o4b2o9b2o8b2o8b2o8b2o8b2o10b2o8b2o10b2o13b o23bo24b2ob2o17b2ob2o22bobo5b2o4bo17bo4bo6b3o31bo4bo114b2obo10b3o2b2o 33bo3bo36b2o51b2o5b2obo38b2o43b2o2b2obo10b2o16b2o3bo$73b3o39b3o36b2o2b 5o14b2o3bo5b2o6bo2b4o4b2o7bo2b4o6b2o12b2o40bo5bo14bo5bo10bo2b4o3bo11bo 2b4o3bo2bo6bo2b4o3bo2bo6bo2b4o5bo2bo6bo2b4o5bo2bo108bo8b2o4bo18b2o3b3o 38bo23b2obo29b2obo62bo49bo3bo36b2o50bobobob3o2b2o36bo44bo4bo11b2o18b2o 2bo$72bob2o38bob2o35b2o2b2o4bo14bobobo4bo9bo19bo25bo2b4o14b2o19bo5bo 13bo17b2o8bo11bo2b4o4b2o7bo2b4o4b2o7bo2b4o6b2o7bo2b4o6b2o108bo9b6o28bo 37bobo19bob2obo27bob2obo29b2obo23bo17b2o34bobo38bo52bobobob3o2b2o33b2o 4bo38b2o4bo12b2ob5o13b4obo$29b2o40bo41bo40bobo22b2ob2o3bo12bo19bo22bo 2b4o14bo2b4o13bo21b6o21b3o10bo19bo19bo21bo24b2o22b2o21b2o20b2o27bo4bo 6b2o19bobobo4bo38b2o20bo3bo28bo3bo29bob2obo20bo19b2o33b3o2b2o32bo21b2o 19bo3bob2obobo2b2o5b2obo34b2o43b2o16bo7bo4bo$obobo3bobobo15b4o27bo10b 2o40b2o41b3o4bo19bo4b3o11b2o18b2o21bo19bo2b4o14b6o15b2o2bo38bo19bo19bo 21bo21bo2b4o17bo2b4o16bo2b4o15bo2b4o23b2o3b3o23bo4bo3bo36bob2o21bob2o 29bob2o30bo3bo20b2ob3o15b2o71bo2b4o15bo20bo4bo4bobo5bo4bobo26bobo3b2o 37bobo3b2o19b3o2b2obo3b2o$27b2o2bo22b2o2bo2bo9b2o4b2o17b4o13b2o4b2o35b o4bo39b2o18b2o24bo17bo19b2o2bo20b2o38b2o18b2o18b2o20b2o19bo2b4o17bo2b 4o16bo2b4o15bo2b4o32bo21bob4o38b2o3bo22b2obo29b2obo29bob2o20b2o58b2o 33bo2b4o12b2o4bo17bo2b2obobobo13bo25b3o3bob2o35b3o3bob2o20b2o2bo4bo3bo $o3bo3bo3bo13bo3bo9bo13bob2o14bo4b3o3bo8bo2bo4bo13bo4b3o3bo8b2o23bobo 23bo62b2o18bo20b2o19b2o14b2o2b5o15b2o18b2o18b2o20b2o20bo23bo22bo21bo 27bobobo4bo22b2o42bo6bo23bobo30bobo28b2obo20b2obo13b2obo38b2o19b2ob2o 9b2o10b2o2bo2b2o22b2o9bo32b2o3bo5bo4b2o27b2o3bo5bo4b2o27b2o2bo5b3o$33b 2o5bo13bob2o15b2o3bo6bo5b4o5bo14b2o3bo6bo5bo30bo4b2o14bobo10b3o2b2o13b 3o2b2o23b2o19b2o18b2o34b2o2b2o4bo101bo23bo22bo21bo23bo4bo3bo67b7o24bob o30bobo31bobo19bo14bobo2bo37b2o18bo25bobo3b2o28bob3o2bo31bo4b2o10b2o4b o21bo4b2o10b2o4bo26bo3b2o$obobo3bo3bo11b2o3bo2b2ob3ob2obo12bo5bo12bo6b 2o4bobo4bo4b2o15bo6b2o4bobo4bo27bobo2b2o13bo2bo11bobo17bobo47b2o37bo2b o14bobo18b3o2b2o13b3o2b2o13b3o2b2o15b3o2b2o22b2o22b2o21b2o20b2o21bob4o 169bobo14bo6b3o9b2o3bo57b2ob2o21b2obo3b2o19bo8bo33bo2bo2bo3bo4bo9bo4bo 14bo2bo2bo3bo4bo9bo29bo5bo$23bo9bobobo3bo4bob2ob3obo2b3o9bo4b2o6b3ob4o b2obobo4b3o7bo4b2o6b3ob3o4bo8bo17bo2bo18bobo12bo3bo15bo3bo20b3o2b2o35b o2bo17bo4b2o12b3o4bo13bobo17bobo17bobo19bobo25b2o22b2o21b2o20b2o21b2o 34bo61bo12b2o13bo12b2o17bo12b2o19bo3bo3b2o10bobobo4bob2obo15bo8b2obo 20bo3bo20bob2o2bo2b2o16bobo7bo29b2ob2o3bo3b2obo2bo11b2o2b2obo7b2ob2o3b o3b2obo2bo11b2o23b2o2bo$4bo3bo3bo9bo2b2obo5b2obo4bo2b2obo3bo16b2ob4o9b o7b3obo4b2o7b2ob4o9bo7b3obo4b2o18bobo2b2o14bo14bo3bo15bo3bo21bobo17b3o 2b2o14bo4b2o14bo3bo15bo4bo15bo3bo15bo3bo15bo3bo17bo3bo146bo64bobo5bo5b 4o10bobo5bo5b4o14bobo5bo5b4o16bobo19b2ob2o3bobo3bo13bo8bobo2bo8b2o12bo 13b2o15b2o4bo10bo3b3o33b2obo5bo2b2o23bo7b2obo5bo2b2o33b2o2bo4bo3bo$21b 2obo4bo5b2o7b2o2bo2bo18b5o11b4o4bo8bo8b5o11b5ob2obobo4b3o17bo4b2o76bo 3bo15bobo17bo3bo17b6o16bobo15bo3bo15bo3bo15bo3bo17bo3bo19b3o2b2o17b3o 2b2o16b3o2b2o15b3o2b2o23bo25b2o3bo29b2ob2o4b2o3b3o14bo2bo4b5o3b3o9bo2b o4b5o3b3o13bo2bo4b5o3b3o15b3o2b2o19bo3bobobo7bobo5b2o7b2o3bo7b2o3bo24b o2b4o13bo14bob3o35bo2b5obo2b2obobo27bo2b5obo2b2obobo27b3o2b2obo3b2o$ob obo3bobobo9b2ob2ob2o14bo5b2o34b2obo4bo33b2obo4bo4b2o39bo4b3o14b2o18b2o 21bo3bo16bo3bo15b6o16b2o124bobo21bobo20bobo19bobo52b2o2bo29bobo5b2o3bo b2obo11b3o6b2o3b2o3bo8b3o6b2o3b2o3bo12b3o6b2o3b2o3bo46bobo5bob2o3bo5b 2o7bobobo4bobobo4bo6bo2bo13bo2b4o14b2o13b2o38bo6bo6bo2bo27bo6bo6bo2bo 25bo7bo4bo$26b5o60bo41b4o5bo18bo17b2ob2o3bo14b3obo15b3obo41bo3bo16b2o 61bobo18bobo16bobo20bobo19bo3bo19bo3bo18bo3bo17bo3bo17bo31b4obo27bo8b 2o4bob3obo9bo10bo4bo11bo10bo4bo15bo10bo4bo22b2o26bobobo3bo2bob3o5bo8b 2ob2o3bobobo3bo2bob3o5bo12bo75b3ob3o6bo2bo28b3ob3o6bo2bo26b2ob5o$92b2o 40bo2bo4bo15b2ob2o15bobobo4bo13b2o18b2o28b2o60b2o14b7o16bobo18bobo16bo bo20bobo19bo3bo19bo3bo18bo3bo17bo3bo16bobo62bo9b5o5b2o10bobo4bo2b2o16b obo4bo2b2o20bobo4bo2b2o27b2o5bo20bobobo4bo6bo2bo13bo3bobo5bob2o3bo5b2o 15bo27b2obo43bobo3bo5bob2o29bobo3bo5bob2o26b2o$138b4o15bobobo15b2o3bo 5b2o10bo19bo28b3obo18b2o18b2o18bo2bo13bo6bo12b2obo17b2obo15b2obo19b2ob o110bo3b3o60bo4bo6b3o17b2o8bo17b2o8bo21b2o8bo27b2o3bobo23b2o3bo28bobob o7bobo5b2o17b2o24bobo2bo48bo5bo38bo5bo31b2o$156b2o3bo16bobo2bo17b2o18b 2o25b2o20b3obo16bo2bo15b2o3bo13b2o3bo13bob2o17bob2o15bob2o19bob2o25bob o22bobo19bobo20bobo14bob3o25b2obo33b2o3b3o25b2o2b2obo20b2o2b2obo24b2o 2b2obo33bo27b2o12bo18bobo3bo13bo17b2o23b2o3bo58bo44bo33bo$157bobo2bo 16b2obo19bo19bo24bo21b2o18b2o3bo15bo20bob2o13bo3bo16bo3bo14bo3bo18bo3b o24bobo22bobo19bobo20bobo15b2o26bob2obo41bo23b2o5bo20b2o5bo24b2o5bo24b 2obo5b3o36bo3bo17bob2obo15bo42bobobo134bo$158b2obo42bo19bo23b2o18bo20b o20b2o22b2o12bob2obo15bob2obo13bob2obo17bob2obo20b2obo21b2obo18b2obo 19b2obo45bo3bo32bobobo4bo20b3o4bo20b3o4bo24b3o4bo27bobo2bo6b3o33b2ob2o 53b3o2b2o23b2ob2o134b3o$183b2o18b3o17b3o23bo19b2o18b2o25bo17bobo12b2ob o17b2obo15b2obo19b2obo20bob2o21bob2o18bob2o19bob2o14b2obo28bob2o32bo4b o3bo21bo6bo20bo6bo24bo6bo26b2o3bo6b2o2bo33bo57bobo29bo$162b2o19b2o19b 2o18b2o25bo18bo24bo16bo20bo102bo3bo20bo3bo17bo3bo18bo3bo12bobo2bo28b2o bo31bob4o25b2o4bo21b2o4bo25b2o4bo28bobobo7bob2o34b2ob2o53bo3bo$161bob 3o17b2o65b3o19bo18bo21b2o17bo4bo98bob2obo19bob2obo16bob2obo17bob2obo 10b2o3bo32bobo29b2o31b3o25b3o29b3o31b2ob2o7b4o91bo3bo$160bo3b3o36b2o 18b2o26b2o18b3o18b2o19bo18bo5bo13b4obo15b4obo13b4obo17b4obo16b2obo21b 2obo18b2obo19b2obo12bobobo32bobo159bo$161bobo16b3o2b2o15bob3o15bob3o 45b2o18bo39bo2b2o15b2o2bo16b2o2bo14b2o2bo18b2o2bo104b2ob2o$162bo18bobo 17bo3b3o13bo3b3o22b2o81b4o15b2o3bo15b2o3bo13b2o3bo17b2o3bo106bo$182bo 3bo15bobo17bobo24bob3o17b2o38b4obo17bo19bo20bo18bo22bo22b4obo19b4obo 16b4obo17b4obo$182bo3bo16bo19bo24bo3b3o15bob3o15b4obo15b2o2bo124b2o2bo 20b2o2bo17b2o2bo18b2o2bo$249bobo17bo3b3o14b2o2bo16b2o3bo123b2o3bo19b2o 3bo16b2o3bo17b2o3bo$250bo19bobo17b2o3bo17bo128bo24bo21bo22bo$271bo20bo !golly-3.3-src/Patterns/Life/Miscellaneous/0000755000175000017500000000000013543257426015570 500000000000000golly-3.3-src/Patterns/Life/Miscellaneous/die658.rle0000644000175000017500000000063412026730263017211 00000000000000#C Creator: Lifestat application #C Author : Andrew Okrasinski #C Dies out completely after 658 gens x = 20, y = 20, rule = B3/S23 6bo3bo4bo3bo$bo3bobob3o2bo$obo8bobo$2bo3bo2bo6bo$b2o2bo7bo4b2o $b2o5b2o2bo2b2ob2o$b2o6bo2bo3b2o$2bo2bob2o5bobo$3b2o2b2obo6bo $bo4b2o2bobo5bo$2bo3bobo$bobo3b2ob3o3bo$3bo3bo2b2o2bo$2bo4bo3b o2bo$3bo2bo2bobobob2o2bo$o2bo15bo$b2o4b2obo2bo3b3o$4bo4bo2b4o 2bo$bo4bobo2bo5b2o$o2bo6bo2bo! golly-3.3-src/Patterns/Life/Miscellaneous/Cambrian-Explosion.rle0000644000175000017500000023031112026730263021674 00000000000000#CXRLE Pos=-815,-550 #C Cambrian Explosion #C Based on 'a-plus.lif' from Alan Hensel's 'lifebc' collection. #C Most additional patterns are from 2004-2006, and were selected #C (somewhat at random) from Koenig's Life News weblog. For details #C on individual patterns, see http://pentadecathlon.com/lifeNews . #C Press 'm' in Golly to center the view on the column of spaceships #C of different speeds. A new speed (c/6) has been added. #C To the NE are diagonal spaceships with some new speeds (c/5, c/6). x = 1028, y = 672, rule = B3/S23 781b3o9b3o$491b3o15b3o269bo2bo7bo2bo$490bo3bo13bo3bo268bo13bo$489b2o4b o11bo4b2o267bo13bo$488bobob2ob2o3b3o3b2ob2obobo267bobo2b3o2bobo$487b2o bo4bob2ob3ob2obo4bob2o270bo3bo$486bo4bo3bo4bobo4bo3bo4bo269bo3bo$498bo 5bo23bo250b3o4b5o$486b2o7b2o9b2o7b2o10b3o249bo2bo3bo3bo$517bo9bob2o 247bo3bo$515bo2bo9b3o247b3o3bo$516bo2bob3o4b2o248b2obo2bo$519bobo2bo 257bobo$517bobobo3bo249b3o4bo$516b2obobobo2bo248b2o$515bobobobobob2o 249b7o$257bo256b2obobobobo4bo248b3ob3o$256b3o253b2obobobobob6o253b2o$ 255b2ob2o251bobobobobobobo6bo$254b2obobo250b2obobobobobobo2b5o244b3o$ 253b3o2b3o247b2obobobobobobobobo6bo241bo2bo$254bo6bo245bobobobobobobob obobob6o241bo3bo5bo$255b5obo244b2obobobobobobobobobo8bo243b2o3b3o$256b 4ob2o242bobobobobobobobobobobo2b7o243b2o3bob2o$261bo242b2obobobobobobo bobobobobo8bo241bo5b3o$260bo12b2o227b2obobobobobobobobobobobobo2b7o 243bo3b2o$273b2o226bobobobobobobobobobobobobobobo8bo238b2ob2o$500b2obo bobobobobobobobobobobobo2b9o240bobo$499bobobobobobobobobobobobobobobob o10bo239bo$258bo239b2obobobobobobobobobobobobobobobo2b9o237b3obo$256b 2obo237bobobobobobobobobobobobobobobobobobo10bo$496b2obobobobobobobobo bobobobobobobobob12o225bo8b6o8bo$103bobo153bo235bobobobobobobobobobobo bobobobobobobobo12bo222b3o6bo6bo6b3o$94bob3o4bobo150bo2bo21b2o211b2obo bobobobobobobobobobobobobobobobobo2b11o221b2obo5b10o5bob2o$92b2obo4bo 5bo150bo23b2o210bobobobobobobobobobobobobobobobobobobobobo12bo219b3o5b o10bo5b3o$94b2o4bo2bo2bo385b2obobobobobobobobobobobobobobobobobobobobo b12o220b2o4b14o4b2o$100bo2bo2bo155b2o227bobobobobobobobobobobobobobobo bobobobobobobo14bo223bo14bo$99bo4bo150b3o5b2o225b2obobobobobobobobobob obobobobobobobobobobobo2b13o222b2ob12ob2o$95bo2bo16b2o145b2o225bobobob obobobobobobobobobobobobobobobobobobobobo14bo$96b2o17b2o132b3o10bo225b 2obobobobobobobobobobobobobobobobobobobobobobobo2b13o219bo6b6o6bo$248b o3bo234bobobobobobobobobobobobobobobobobobobobobobobobobobo14bo220bo 12bo$247bo4bo233b2obobobobobobobobobobobobobobobobobobobobobobobobo2b 15o217b2o6b4o6b2o$99bo146bo3bo234bobobobobobobobobobobobobobobobobobob obobobobobobobobo16bo93b3o3b3o120bo4bo$98bobo145bo2bob3o230b2obobobobo bobobobobobobobobobobobobobobobobobobobobobo2b15o46b3o3b3o37bo2bo3bo2b o117b2ob4ob2o$98bobo145bo7bo228bobobobobobobobobobobobobobobobobobobob obobobobobobobobobo16bo43bo2bo3bo2bo39bo3bo120b2o6b2o$99bo148bo3bobo 227b2obobobobobobobobobobobobobobobobobobobobobobobobobobobo2b17o46bo 3bo42bo3bo118bo4b4o4bo$123b2o123bo3bob2o225bobobobobobobobobobobobobob obobobobobobobobobobobobobobo22bo44bo3bo42bo3bo108b3o7b5o4b5o7b3o$123b 2o125b3ob2o224b2obobobobobobobobobobobobobobobobobobobobobobobobo2bob 25o44bo3bo154bo2bo5bo6b4o6bo5bo2bo$85b3o391bobobobobobobobobobobobobob obobobobobobobobobobobo32bo87b3o3b3o108bo5b7o4b7o5bo$478b2obobobobobob obobobobobobobobobobobobobobobo2bob35o40b3o3b3o39bo5bo109bo3bo8b4o8bo 3bo$89b2o16bo369bobobobobobobobobobobobobobobobobobobobobobo42bo39bo5b o40b7o106bobo4b9o4b9o4bobo$91bo14bobo367b2obobobobobobobobobobobobobob obobobobo2bob45o39b7o29bo9bo7bo9bo100b2o9b4o9b2o$85b4obo15bobo141b2o 223bobobobobobobobobobobobobobobobobobobo52bo36bo7bo9bo17b3o8b9o8b3o 99b3ob7o4b7ob3o$85b5o17bo127b3o12b2o222b2obobobobobobobobobobobobobobo bo2bob55o35b10o8b3o16bob2o6bo9bo6b2obo99bo3bo6b4o6bo3bo$234bo3bo12bo 221bobobobobobobobobobobobobobobobo62bo7bo24bo10bo6b2obo17b3o5b13o5b3o 107b4o4b4o$233bo4bo175b3o5b3o5b3o39b2obobobobobobobobobobobobo2bob65o 6b3o22b14o5b3o18b2o5bo13bo5b2o99b2o5bo4b4o4bo5b2o$85bobo144bo3bo14bo 149bo6b3o2bo2bo5bo2bo4bo2bo5bo7bo23bobobobobobobobobobobobobo72bo3b2ob o21bo13bo6b2o23b19o112b4o4b4o$85bobo144bo2bob3o160b3o4bo2bo2bo3bo3bo3b o4bo7b3o5b3o5bo5bo9b2obobobobobobobobobo2bob75o3b3o21b13o2bo2bo26b2o 19b2o108b2o4b4o4b2o$86bo145bo7bo158b2obo7bo4b2obo4bob2o3bo3bo2b2obo4b 2o2bo3b3o3b3o7bobobobobobobobobobo82bob3o20bo13bobobob2o29b13o112bo2b 4o4b4o2bo$79bobo3bobo146bo3bobo8bo5bobo141b3o4bo3bob2ob2ob4ob4ob3o6bo 7b2o2bo2b2o2bobo2b2o5b2obobobobobobo2bob85o2b2o19b14obobobob2o24b5o13b 5o106b3o5b4o5b3o$65bobo7bo2bo2bo4b2o125bo20bo3bob2o7bo7bo142b2o3b2o3b 2o3b2o11b3o3bob3o2b2o2b2o2bobo2bobobobo2bo3bobobobobobobo89bo23bo15bob o2bob2o28b13o101bo8bo4b4o4b4o4bo8bo$52b3o9b2ob2o5bobob2obo4bo125b3o21b 3ob2o7bo4bo2bo146bobo4bo3bo3bo7b3ob2ob2obobobo4bobo2b4obobo2b3o2b2obob obo2bob90o24b15o2bobo6bo140b3o6b6o4b4o4b6o6b3o$51bo2bo10bob2o6bo135b2o b2o37bo2bo150b5o8bo2bo6bo5bo3bo15bo8bobobobo96b2o21bo15bobo3b2o3b2o27b 11o101bob2o4bo6b4o4b4o6bo4b2obo$50bo4bo13bo11b3o126b2obobo196b3o5b2obo 7bo3bo3bo4b21obobob100o20b17o11b3o27bo7bo103b3o3b8o4b4o4b8o3b3o$50bo2b 3o12bo13b2o125b3o2b3o34b3o159bo16bo5bo6bo123bo2bo18bo17b4o2bo4b3o30b3o 106b2o3bo8b4o4b4o8bo3b2o$50bo5bo11bo12b2o127bo6bo202bo10bo8b2o3b121o 22b19o3b2o6b3o29bo3bo110b9o4b4o4b9o$51b7o153b5obo214bo11bo121bo3b2o15b o19bo3b2o5b2o31b3o109bo10b4o4b4o10bo$57bo154b4ob2o224b123o20b21o4b2ob 2o24bo8b2o3b2o8bo97bo2b9o4b4o4b9o2bo$57bo159bo224bo121b2o19bo21b4o3b2o 23b3o6bo2b3o2bo6b3o97bo2b2o6b4o4b4o6b2o2bo$55b2o159bo12b2o210b122obo 19b23o6bobo22b2obo5b3o5b3o5bob2o95b2o6b4o4b4o4b4o6b2o$100bo128b2o209bo 123bo18bo23b4o27b3o5bo4b3o4bo5b3o102bo4b4o4b4o4bo$100b2o337b123o3bo16b 25o32b2o4b6o3b6o4b2o102bob4o4b4o4b4obo$99bobo336bo123bobo16bo25b2o2bo 32bo6b3o6bo107b2o4b4o4b4o4b2o$54bo159bo222b125o3b2o13b27o4bo4b3o24b2ob 5o3b5ob2o104bo3b4o4b4o4b4o3bo$53bobo156b2obo15b2obob2o198bo124bo17bo 27b2o2bo4bo2bo31b3o112b4o4b4o4b4o4b4o$52b2obo174b2obo3bo197b124o2bo16b 29o2b4o3bo25bo6b2o3b2o6bo92b3o6bo5b4o4b4o4b4o5bo6b3o$52b2o12b2o147bo 15bobobobo196bo142bo29b2o7bo28b2obo2b3o2bob2o95bo2bo5b6o4b4o4b4o4b6o5b o2bo$53b3o10b2o144bo2bo16bo200b122obo4b2o13b31o2bob3o3bobo22b2o4b3o3b 3o4b2o92bo6bo7b4o4b4o4b4o7bo6bo$54bob2o155bo218bo119bobobo3bo14bo31bo 43b3o101bo6b8o4b4o4b4o4b8o6bo$53b2o2bo373b116obo12bo12b33o2bo3bo33bo2b o3bo2bo98bobo2bo8b4o4b4o4b4o8bo2bobo$53bobob2o159b2o210bo113bobobo24bo 33b3o3bo37b3o106b10o4b4o4b4o4b10o$54b2ob2o152b3o5b2o208b110obo31b35o3b o37b3o3b3o103bo9b4o4b4o4b4o9bo$54b3ob2o158b2o208bo107bobobo30bo35b5o3b o25bo9b3o9bo94b4o2b6o4b4o4b4o4b6o2b4o$57bo160bo11b4o30bo162b104obo37b 37o4bo2b3o23b3o7bo3bo7b3o94b3o8b4o4b4o4b4o8b3o$74b2o153bob2o32bo160bo 101bobobo36bo37b2o2bob2o2bo21b2obo5bob5obo5bob2o92b2o6b4o4b4o4b4o4b4o 6b2o$40bobo31b2o153bobo31b3o159b98obo43b39o2bobo4b2o21b3o5b3o5b3o5b3o 99bo4b4o4b4o4b4o4bo$39b2ob2o5b2ob2o2b2o6b2o358bo95bobobo42bo39b2ob2ob 2o25b2o4bo3b5o3bo4b2o99bob4o4b4o4b4o4b4obo$40bob2o5b2o4b4o5b2o158bo 198b92obo49b41o2b2ob4o28b6o5b6o102b2o5b4o4b4o4b4o5b2o$44bo6b2ob2o2bo 163bo2b2o195bo89bobobo48bo41bo3bob2o2b2o24bo6b5o6bo100bo3b4o4b4o4b4o4b 4o3bo$43bo10b2ob2o158b2o3bo2b4o192b86obo55b43ob2o33b2ob4o5b4ob2o90bo8b 5o4b4o4b4o4b4o4b5o8bo$43bo12b2o159b2o3bob2obo192bo83bobobo54bo43bo33b 2o7b5o7b2o87b3o6bo5b4o4b4o4b4o4b4o5bo6b3o$225b2obo60bo129b80obo61b45o 2bo31bob3o3bo5bo3b3obo86b2obo5b7o4b4o4b4o4b4o4b7o5bob2o$225bo61bobo 128bo77bobobo60bo45b3o31bo4bobob5obobo4bo86b3o5bo7b4o4b4o4b4o4b4o7bo5b 3o$223bo4bo59b2o127b74obo67b47o3bo30bo2bo3bo7bo3bo2bo87b2o4b9o4b4o4b4o 4b4o4b9o4b2o$72b2o149b3o190bo71bobobo66bo47b5o3bo26bo5b9o5bo93bo9b4o4b 4o4b4o4b4o9bo$72b2o149b2ob3o186b68obo73b49o4bo2b3o25b2o17b2o92b2ob8o4b 4o4b4o4b4o4b8ob2o$66b2o158b3o185bo65bobobo72bo49b2o2bob2o2bo32b5o111b 4o4b4o4b4o4b4o$65bo2bo156bobo185b62obo79b51o2bobo4b2o24b2o5bo5bo5b2o 91bo6b5o4b4o4b4o4b4o4b5o6bo$65bo2bo156b2o185bo59bobobo78bo51b2ob2ob2o 35b5o102bo8b4o4b4o4b4o4b4o8bo$64b5o342b56obo85b53o2b2ob4o23bo8b2o5b2o 8bo88b2o6b4o4b4o4b4o4b4o4b4o6b2o$33b3o25b2ob2o344bo53bobobo84bo53bo3bo b2o2b2o19b3o6bo2b5o2bo6b3o94bo4b4o4b4o4b4o4b4o4bo$63bo345b50obo91b55ob 2o27b2obo5b3o7b3o5bob2o91b2ob4o4b4o4b4o4b4o4b4ob2o$37b2o369bo47bobobo 90bo55bo29b3o5bo4b5o4bo5b3o91b2o5b4o4b4o4b4o4b4o5b2o$39bo367b44obo41b 3o53b57o2bo28b2o4b6o5b6o4b2o90bo4b4o4b4o4b4o4b4o4b4o4bo$33b4obo367bo 41bobobo37bo3bo2bo40bo10bo57b3o33bo6b5o6bo85b3o7b5o4b4o4b4o4b4o4b4o4b 5o7b3o$33b5o367b38obo44b3ob2o3bo38b3o8b59o3bo31b2ob5o5b5ob2o83bo2bo5bo 6b4o4b4o4b4o4b4o4b4o6bo5bo2bo$404bo35bobobo43b2o3bob2ob2o37bob2o6bo59b 5o3bo34b5o94bo5b7o4b4o4b4o4b4o4b4o4b7o5bo$156bobo244b32obo50b2o2bo2bob obobo37b3o5b61o4bo2b3o24bo6b2o5b2o6bo85bo3bo8b4o4b4o4b4o4b4o4b4o8bo3bo $33bobo119bo2bo243bo29bobobo51bo3bobobo3b2o36b2o5bo61b2o2bob2o2bo26b2o bo2b5o2bob2o85bobo4b9o4b4o4b4o4b4o4b4o4b9o4bobo$26bobo4bobo120bobo242b 26obo58b2o5bobobo3bo40b64o2bobo4b2o23b2o4b3o5b3o4b2o87b2o9b4o4b4o4b4o 4b4o4b4o9b2o$17bob3o4bobo5bo137b2o226bo23bobobo56b2obobo8bo41b2o64b2ob 2ob2o35b5o96b3ob7o4b4o4b4o4b4o4b4o4b7ob3o$15b2obo4bo5bo3bobo136bobo 215b3o6b20obo65bobob2o9b2o43b61o2b2ob4o30bo2bo5bo2bo70b3o3b3o13bo3bo6b 4o4b4o4b4o4b4o4b4o6bo3bo$17b2o4bo2bo2bo4b2o122bo13b3o215bo2bo4bo17bobo bo62b2obobobobo48b5o61bo3bob2o2b2o31b5o73bo2bo3bo2bo19b4o5b3o4b4o4b4o 4b3o5b4o$23bo2bo2bo4bo122bob2o11bo2bo214bo6b14obo71bobobobob2o52b61ob 2o37b3o5b3o73bo3bo14b2o5bo4b3o5b4o4b4o4b4o5b3o4bo5b2o$22bo4bo129bob2o 12bo216bo3bobo11bobobo68b2obobobobobob2o111bo32bo9b5o9bo66bo3bo22b3o6b 3o4b4o4b4o4b3o6b3o$18bo2bo134bo3bo12bo7b2o113bo93bo5b7obo77bobobobobob obo52b60o2bo29b3o7bo5bo7b3o65bo3bo20bo4bo5bo2b4o4b4o4b4o2bo5bo4bo$19b 2o136b4o20b2o114bo92bo4b2o3bobobo74b2obobobobobobobob2o50bo58b3o28b2ob o5bob7obo5bob2o91bo2bo5bo2bo3b4o4b4o3bo2bo5bo2bo$157b3o15bo119b3o93bo 3bo54bo19bo7bobobobobobobobobobo54b56o3bo27b3o5b3o7b3o5b3o62b3o3b3o22b o7b4o6b4o6b4o7bo$31b2o139bo222bo53b3o17b3o5b2obobobobobobobobobob2o38b 3o9bo56b5o3bo23b2o4bo3b7o3bo4b2o64bo5bo19b2o4b2obob3o6bo6bo6b3obob2o4b 2o$30bo2bo138bo2bo217b3o44bo7b5o5bo9bo2b2o2b2obobobobobobobobobobobo 39bo2bo9b56o4bo2b3o26b6o7b6o68b7o28b2o4b2o5bo2bo5b2o4b2o$31b2o138b3o 220b2o43b3ob3ob2o3b2o3b3ob3o12bobobobobobobobobobobobob2o36bo7b5o56b2o 2bob2o2bo24bo6b7o6bo66bo7bo31bob2ob5o2b5ob2obo$171b3o264b2o3b3o2bo4bo 2b2o3bob2o2b2o4b2obobobobobobobobobobobobobo37bo6b2obo2b56o2bobo4b2o 24b2ob4o7b4ob2o55bo10b9o10bo21bo8b2o8bo$171bo2bo262b2o5bo3bob2obob2o2b obobob5o6bobobobobobobobobobobobobob2o35bobob2obobo58b2ob2ob2o25b2o7b 7o7b2o52b3o8bo9bo8b3o14b2o4bo2bo3b2o2b2o3bo2bo4b2o$37b2o133bobo146bo 116bo3b2o4b2o6bo4bo4bob2o3bo4bobobobobobobobobobobobobo40b2o4b58o2b2ob 4o24bob3o3bo7bo3b3obo51b2obo7b13o7bob2o17bobo2bo5b2o5bo2bobo$39bo128bo 3b3o11b2o131bobo115b2o8bob2obobo6b2o4bo5b7obo2bobobobobobobobobobob2o 36bo2bo61bo3bob2o2b2o21bo4bobob7obobo4bo51b3o7bo13bo7b3o17bobo2bo4bo2b o4bo2bobo$167bobo15b2obo131b2o113b2obobo6b2o2bo9bo10bo13bobobobobobobo bobobo46b56ob2o30bo2bo3bo9bo3bo2bo52b2o7b15o7b2o24bo4b2o4bo$19bo4bobo 10bo2b4o139bo4bo247bobob2o4bo2b3o19b17obo2bobobobobobobob2o30b3o9bo56b o33bo5b11o5bo59b2o17b2o33b2o2b2o$18bobo2b2o2b2o8bo5bo117b2o15b2o8bo 244b2obobo3bo8b2o17bo23bobobobobobobobo29bo2bo9b56o2bo31b2o19b2o57b2o 2b17o2b2o$18bob4o2bobo9bo4bo117b2o15bobo2b2o2bo237bo7b2o3bo7b2o21b27ob o2bobobobob2o28bo7b5o56b3o39b7o66bo21bo32bo4bo$19bo6bobo10bo2bo124bo 10bob2o243b3o5b3obo3b2o25bo33bobobobobo27bo6b2obo2b56o3bo30b2o5bo7bo5b 2o62b15o36b6o$23bob3o11b3o108bo14b2obobo4b6o247bo3b2o33b37obo2bob2o27b obob2obobo58b5o3bo33b7o66bo21bo32b6o$48bo99b2ob2o13bo4bo2bo4bo247b2o 37bo45bo30b2o4b58o4bo2b3o21bo8b2o7b2o8bo55bo4b13o4bo$46b2o102bo15bo3bo 3bo2bo287b46ob2o28bo2bo61b2o2bob2o2bo19b3o6bo2b7o2bo6b3o55b2o17b2o$47b 2o118bo2bo4b2o287bo46b4o36b56o2bobo4b2o18b2obo5b3o9b3o5bob2o57bo2b9o2b o36bo4bo$122bo44b3o293b44obo3bo2bo22b3o9bo56b2ob2ob2o21b3o5bo4b7o4bo5b 3o58bo11bo$26b2o92b2ob2o26b2o309bo41bobobo4b3o22bo2bo9b56o2b2ob4o21b2o 4b6o7b6o4b2o63b5o$26b2o94bo27bo2bo298bo8b38obo11bob2o22bo7b5o56bo3bob 2o2b2o23bo6b7o6bo67bo5bo$137b2o10b2o3bo275bo20b3o6bo35bobobo10b3o24bo 6b2obo2b56ob2o31b2ob5o7b5ob2o65bob5obo$136bo2bo9bo4bo181b2o91b3o7b2o9b 2obo5b32obo17bo3bo24bobob2obobo58bo41b7o54b3o15b2o7b2o15b3o$123b2o11b 2ob2o8bo3bo274bo2b2o5bo2bo8b3o5bo29bobobo20bo2b3o24b2o4b58o2bo30bo6b2o 7b2o6bo23b3o13b3o3bo2bo13bo3b5o3bo13bo2bo3b3o13b3o$122bo2bo11bo12bo2bo 181bo3bo88b2ob2o4bobobo8b3o3b27obo27b2o2b3o23bo2bo61b3o33b2obo2b7o2bob 2o25bo2bo5b3o4bo2bo2bo4bo11b5o5b5o11bo4bo2bo2bo4b3o5bo2bo$121b2o3bo10b 3o11bo188bo86b3o2bo2b3o2bo10b2o2bo24bobobo31bo34b56o3bo29b2o4b3o7b3o4b 2o25bo5bo2bo2bo3b5o3b5o6bo5b5o5bo6b5o3b5o3bo2bo2bo5bo$112bo8bo4bo19b2o 185bo7bo86b2obo24bob17obo61b3o9bo56b5o3bo33b7o30bo3bo5bo2bo2bo9bobobob 2o4b7o5b7o4b2obobobo9bo2bo2bo5bo3bo$34b2o75b3o7bo3bo20b2o184bo4bo91bo 7b2o17b2o14bobobo37b3o21bo2bo9b56o4bo2b3o28bo2bo7bo2bo30bo2bo2b2ob3o3b 2o3bo3bo3bob2obo7b5o7bob2obo3bo3bo3b2o3b3ob2o2bo2bo$34b2o74bobobo7bo2b o207bobobo4bo86bo3bo4bo20b8obo44b2o2bo20bo7b5o56b2o2bob2o2bo31b7o31bob o2b3ob2obobo3bo4b5obo3bob9o5b9obo3bob5o4bo3bobob2ob3o2bobo167bo$109b3o b3o7bo4bo204bo8bo87bobo20b3o2bo5bobobo44b3o22bo6b2obo2b56o2bobo4b2o28b 3o7b3o33b2o2b3o8bo4b5o14b5o14b5o4bo8b3o2b2o171b3o$127bobo204bo4b2obo 88bo20bo2bo2bobo52bo3bo21bobob2obobo58b2ob2ob2o24bo9b7o9bo28bo3bob2o 13b2o5b9o5b9o5b2o13b2obo3bo59b3o106b3o4b2o$111bob3o13b2o8bo188bo6bob2o b3o112bo4bo53bobo26b2o4b58o2b2ob4o22b3o7bo7bo7b3o27bo23bo12b5o12bo23bo 58bo2b5o101bo2b3o2bob2o$111b5o9bo3bo5bo3bo189bo6b3ob2o92bo20bo86bo2bo 61bo3bob2o2b2o18b2obo5bob9obo5bob2o52b2ob8o5b8ob2o83bo3bobob2o99bo3bob o2bobo$111b2o2b2o11bo2b2o3bo2bo187b3o23b2o78bobo16bobo59b2o35b56ob2o 27b3o5b3o9b3o5b3o63b5o94bo6bo101bo4bobobobob2o$113bob2o14bo4b2ob2o212b 2o70b2o5bo3bo78bobo20b3o9bo56bo30b2o4bo3b9o3bo4b2o57b7o5b7o89bo6bobo 99bo4bobo3b2o$115b2o9bo2b2o6bobo284bo2bo8bo76bo2b3o19bo2bo9b56o2bo32b 6o9b6o68b5o93bobo6b2ob2o95bobo4bo3bob3o$111bobo2bo11bo9bo285bobobo5bob 2o80b2o18bo7b5o56b3o31bo6b9o6bo62b5o5b5o87b2obob3o2b2obobo93b2obob2o9b 2o$110bobo2bo309bo2b3o2bo2b3o74b2o2b3o18bo6b2obo2b56o3bo30b2ob4o9b4ob 2o61bo5b5o5bo85bobobo3bo5bob2o91bobobobo$111bo308b2o11b2ob2o24b2o54bo 20bobob2obobo58b5o3bo23b2o7b9o7b2o58bob5o5b5obo83b2obo8b2obo3bo89b2obo bobob2o$353bo40b2o23bo2bo4b2o4b2o2bo23bo2bo54b2o22b2o4b58o4bo2b3o22bob 3o3bo9bo3b3obo39b3o15b2o6b5o6b2o15b3o63bo3bo5b2o3b2o92bobobobobobobo$ 351bobo41bo24bobo4bo6b3o25bobo56b2o19bo2bo61b2o2bob2o2bo21bo4bobob9obo bo4bo17b3o13b3o3bo2bo13bo3b5o5b5o3bo13bo2bo3b3o13b3o56bobob2o87b2obobo bobobob2o$352b2o7b2o32bobo9bo8b2o3bo13bo22b4obo51bo4bo30b56o2bobo4b2o 21bo2bo3bo11bo3bo2bo16bo2bo5b3o4bo2bo2bo4bo11b5o5b5o5b5o11bo4bo2bo2bo 4b3o5bo2bo40b2ob2o11b2o88b2obobobobobobobobo$126b2o17b2o214b2o33b2o7b 4o8bob2o27b3o7b2ob2o51b3o3bo17b3o9bo56b2ob2ob2o25bo5b13o5bo20bo5bo2bo 2bo3b5o3b5o6bo5b5o5b5o5bo6b5o3b5o3bo2bo2bo5bo57b4o2bo86bobobobobobobob ob2o$144bo2bo195b2o59bob5o8bo27b2o3bo8bo51b2obo4b2o15bo2bo9b56o2b2ob4o 24b2o21b2o16bo3bo5bo2bo2bo9bobobob2o4b7o5b5o5b7o4b2obobobo9bo2bo2bo5bo 3bo57bobo83b2obobobobobobobobobobo$126b2o17bobo188bo5bo2b2o56b2o6bo7bo 26b2o2bobo60b3o5bo16bo7b5o56bo3bob2o2b2o29b9o28bo2bo2b2ob3o3b2o3bo3bo 3bob2obo7b5o5b5o7bob2obo3bo3bo3b2o3b3ob2o2bo2bo57b2o2bo77b3o5b2obobobo bobobobobobob2o$146bo143bo45bo4b3o2bo57b3obo3bo34bo5bo6bo52b3o3b3o16bo 6b2obo2b56ob2o30b2o5bo9bo5b2o17bobo2b3ob2obobo3bo4b5obo3bob9o5b5o5b9ob o3bob5o4bo3bobob2ob3o2bobo54b2o79bo3bo5bobobobobobobobobobobobo$127bob o158b2o10bobo33bo4bo4bo58b3o3bo4bo31b2o2bo5bo55b2o3bo19bobob2obobo58bo 40b9o30b2o2b3o8bo4b5o14b5o5b5o14b5o4bo8b3o2b2o59bobo2bo68b3o3bo5bob2o 3bobobobobobobobobobob2o$128bo160b2o9b2o39b5o64bo4bo3b3o30bo5bo2b2o80b 2o4b58o2bo27bo8b2o9b2o8bo21bo3bob2o13b2o5b9o5b5o5b9o5b2o13b2obo3bo60b 2obob2o67bo3bo2bo5bobo2bobobobobobobobobobobobobo$116b2o10bo109bobo60b o40b2o70bo3bob3o27bo6bo5bo78bo2bo61b3o26b3o6bo2b9o2bo6b3o20bo23bo12b5o 5b5o12bo23bo62b2ob2o60b3o3bo5bobob3obobob3o2bobobobobobobobobobob2o39b 3o5b3o8bo10bo$116b2o121b2o128b2o36bo7bo6b2o34bobo2b2o86b56o3bo24b2obo 5b3o11b3o5bob2o45b2ob8o5b5o5b8ob2o86b2ob2ob2o58bo3bo2bo5bobobobobobo4b obobobobobobobobobobobobo23bo7bo5bo2bo5bo2bo6b3o8b3o$153b2o84bo129b2o 36bo8b5obo14bo11bo8bo3b2o74b3o9bo56b5o3bo19b3o5bo4b9o4bo5b3o56b5o5b5o 156b3o3bo5bobob3obobobo2bob8obo2bobobobobobobobobob2o9bo5bo5b3o5b3o7bo 5bo2bo6bob2o7bob2o$152bo2bo250b2obo8b4o16bo9b2ob2o7b3o8b2o65bo2bo9b56o 4bo2b3o19b2o4b6o9b6o4b2o50b7o5b5o5b7o91b3ob3o50bo3bo2bo5bobobobobobo 20bobobobobobobobobobo7b3o3b3o3bo2b2o4bob2o2bo3bo4bobob2o6b3o8b3o$153b obo249bo3b2o8bo16b3o8bob4o18bobo64bo7b5o56b2o2bob2o2bo23bo6b9o6bo62b5o 5b5o148b3o3bo5bobob3obobobo2bob24obo2bobobobobobob2o5b2o2bobo2b2o2bo2b 2o7bo6b4ob2o2bo3bo3b3o8b2o$154bo186b2o61bobo39bobo24bo64bo6b2obo2b56o 2bobo4b2o22b2ob5o9b5ob2o43b3o10b5o5b5o5b5o10b3o82b4o43bo3bo2bo5bobobob obobo36bobobobobobobo3bo2bobobobo2bobo2b2o2b2o2b3obo3b3ob2obobob2o4b2o bo3b2o$341b2o61bo2bo38bo2bo23b2o64bobob2obobo58b2ob2ob2o33b9o50bo2bo9b o5b5o5b5o5bo9bo2bo82bo38b3o3bo5bobob3obobobo2bob40obo2bobobob2o2b3o2bo bob4o2bobo4bobobob2ob2ob2o2bobobo4b3o3b4o2bo$405b2o40b2o94b2o4b58o2b2o b4o23bo6b2o9b2o6bo44bo5b3o2b5o5b5o5b5o2b3o5bo85bo37bo3bo2bo5bobobobobo bo52bobobobo8bo15bo3bo5bo2bo3bobo3bobo6bo2bo$124b2o416bo2bo61bo3bob2o 2b2o23b2obo2b9o2bob2o47bo4b2obo7b5o5b5o7bob2o4bo116b3o3bo5bobob3obobob o2bob56obobob21o4bo3bo3bo4bo2bobobo3bo4bo2bo$124b2o251b2o142bo10bo18b 56ob2o29b2o4b3o9b3o4b2o41bobo3b2obobob6o5b5o5b6obobob2o3bobo81b2o29bo 3bo2bo5bobobobobobo88bo6bo5bo2bo7bo6b4o$155bobo3b2o214b2o141b3o8b3o16b o56bo40b9o56bo12b5o5b5o12bo89bo5b3o5b3o5b3o3bo5bobob3obobobo2bob89o3b 2o8bo4bo$141bobo7bo2bo2bobo3bo282bo72b2obo7b2obo17b56o2bo4b3o27bo2bo9b o2bo51bobo4b7o5b5o5b7o4bobo86bo2bo3bo3bo3bo3bo3bo3bo2bo5bobobobobobo 95bo11bo6bo$140b2ob2o5bobob2ob5obo262bo8b2o10bo71b3o8b3o16b2o56b3o4bo 2bo30b9o69b5o5b5o101bo2bobo5bobo5bobo5bobob3obobobo2bob99o$141bob2o6bo 6bo2b2o186b2o74b3o6bo2bo7b3o71b3o2bo4bob2o15bo2b56o3bo3bo30b3o9b3o48b 3o10b5o5b5o5b5o10b3o86bobo5bobo5bobo5bobobobobobo51bo53bo$145bo11b3o 189b2o73b2o2bo4bobobo82bo2b2ob3o3bo18bo24bobobo26b2o5bo3bo19bo9b9o9bo 40bo2bo9bo5b5o5b5o5bo9bo2bo83bobobob3obobob3obobob3obobobo2bob48obo7bo b50o$144bo13b2o200bo63bo3bo3b3obo84bo2bo26bo2b17obo11bob21o4bo2bo3bo 18b3o7bo9bo7b3o42bo5b3o2b5o5b5o5b5o2b3o5bo85b2obobobobobobobobobobobob obobo51bobobo7bobobo47bo$144bo12b2o202bo62bobo3bo3bo92b2o2bo19bobo14bo bobo11bobobo19b2obo2bo21b2obo5bob11obo5bob2o41bo4b2obo7b5o5b5o7bob2o4b o13bo10bo8b3o5b3o39b2obobobobobobobobobobobobo2bob48obo23bob44o$132b2o 225b3o23b2o46b2o91bo2bo17bo3bo2b9obo27bob15o6bobo18b3o5b3o11b3o5b3o38b obo3b2obobob6o5b5o5b6obobob2o3bobo9b3o8b3o6bo2bo5bo2bo5bo7bo23bobobobo bobobobobobobobobo51bobobo23bobobo41bo$118bo9bo3b3o250b2o38b2ob2o3b2o 10b2o80bo23bobo6bobobo27bobobo40b2o4bo3b11o3bo4b2o45bo12b5o5b5o12bo14b 2obo7b2obo6bo2bo5bo7b3o5b3o5bo5bo9b2obobobobobobobobobo2bob48obo39bob 38o$118b4o5bobo2bo294bo16bo2bo77b2obo19bo2bob2obo43bob5o34b6o11b6o48bo bo4b7o5b5o5b7o4bobo13b3o8b3o6b2obobo4bo3bo2b2obo4b2o2bo3b3o3b3o7bobobo bobobobobobobo51bobobo39bobobo35bo$118bo3bo5bo3bo2bo307bobobo7bo68bo2b 3o24bobo43bobobo2bo32bo6b11o6bo61b5o5b5o28b2o8b3o3bo3bo2b2ob4o6bo7b2o 2bo2b2o2bobo2b2o5b2obobobobobobo2bob48obo55bob32o$136bo220b2o84bobob2o 7bo66b4o3bo78b2o29b2ob4o11b4ob2o43b3o10b5o5b5o5b5o10b3o14b2o3bob2o4b2o bobob2ob3o3bob3o2b2o2b2o2bobo2bobobobo2bo3bobobobobobobo51bobobo55bobo bo29bo$120b3o10bobo221b2o82b2obo3bo5b3ob2o62bo4b5o75b2ob2o26b2o7b11o7b 2o40bo2bo9bo5b5o5b5o5bo9bo2bo12bo2b4o3b3o4bobobo2b2ob2ob2obobobo4bobo 2b4obobo2b3o2b2obobobo2bob48obo71bob26o$134b2o249bo44bo10bo2bob3o9bobo 60b6o5bo74bo3bo26bob3o3bo11bo3b3obo43bo5b3o2b5o5b5o5b5o2b3o5bo16bo2bo 6bobo3bobo3bo2bo5bo3bo15bo8bobobobo51bobobo71bobobo23bo$383bobo37b2o3b 2ob2o5b2obobobo2bo9bo61bo6b7o76bo27bo4bobob11obobo4bo43bo4b2obo7b5o5b 5o7bob2o4bo18bo2bo4bo3bobobo2bo4bo3bo3bo4b21obobob48obo87bob20o6b3o$ 384b2o7b2o28b2o13bo2bo5b2o70b8o7bo72bo2bo3b3o21bo2bo3bo13bo3bo2bo40bob o3b2obobob6o5b5o5b6obobob2o3bobo17b4o6bo7bo2bo5bo6bo71bobobo87bobobo 17bo4bo2bo$393b2o28bo3bo3bobo5b2o4bobo70bo8b9o71bo3bo2bo2bo21bo5b15o5b o47bo12b5o5b5o12bo40bo4bo8b2o3b65obo103bob14o6bo$421bob3o3bo3bo7b5obo 69b10o9bo76bo25b2o23b2o46bobo4b7o5b5o5b7o4bobo38bo6bo11bo62bobobo103bo bobo11bobo3bo$420bobobo4bo2b2o7bo4bo69bo10b11o70b2ob2o5bo28b11o68b5o5b 5o70b59obo119bob7o5bo$139b2o224b2o53bo2bo6b3o9b4o69b12o11bo69b3ob6o21b 2o5bo11bo5b2o42b3o10b5o5b5o5b5o10b3o51bo56bobobo119bobobo3b2o4bo$142b 2o221b2o54b2o8bo11bo70bo12b13o69bo37b11o49bo2bo9bo5b5o5b5o5bo9bo2bo49b 53obo136bo3bo$139b3ob2o296bo25b2o44b14o13bo69b4o22bo8b2o11b2o8bo41bo5b 3o2b5o5b5o5b5o2b3o5bo51bo50bobobo136bo$143bo297b2o24bobo42bo14b15o72bo 20b3o6bo2b11o2bo6b3o40bo4b2obo7b5o5b5o7bob2o4bo50b47obo144b3o$133b2o4b o3bo257b2o64bo43b16o15bo67b2o5bo16b2obo5b3o13b3o5bob2o36bobo3b2obobob 6o5b5o5b6obobob2o3bobo46bo44bobobo144b2o$135bo3bob2o110bo147b2o107bo 16b17o69bo2b3o15b3o5bo4b11o4bo5b3o42bo12b5o5b5o12bo51b41obo$123b2o6bo 2bo119bo254b18o17bo73b2o15b2o4b6o11b6o4b2o42bobo4b7o5b5o5b7o4bobo40bo 8bo38bobobo139b3o$123b2o5bo12bobo106b3o253bo18b19o69b2o2b2o19bo6b11o6b o61b5o5b5o53b3o6b35obo149bo$143b2o145bo82b2o58b2o72b20o19bo72bo19b2ob 5o11b5ob2o55b5o5b5o5b5o48bob2o4bo32bobobo114b2o32bo$144bo143b2o83b2o 58bo72bo20b21o71b2o26b11o62bo5b5o5b5o5bo48b3o4b28obo113b2o7b3o28b2o$ 289b2o143b3o59b3o6b22o21bo6b3o58b2obob2o15bo6b2o11b2o6bo52bob5o5b5o5b 5obo47b3o2bo26bobobo114b2o4bob4o2b2obo21bo$436bo39b2o17bo2bo5bo22b23o 4bo2bo57b2o2bobo19b2obo2b11o2bob2o54b2o6b5o5b5o6b2o46b3ob23obo121bo12b ob2ob2o$229bo179b2o65bobo19bo4b24o23bo6bo57bo2bo2bob2o13b2o4b3o11b3o4b 2o50bo3b5o5b5o5b5o3bo47b2o20bobobo79b2o6b4o27b2o6b3o4b2o3bobo15bo6b2o$ 230b2o177b2o65bo17bo3bo3bo24b25o5bo56b2o5bob2o22b11o58b5o5b5o5b5o5b5o 47bo2b13obo86bobo4bo5bob2o25bo4bo3b2ob2o5bo6bobo2b2o2b2ob2o3b2o5b3o$ 131b2o96b2o267bo2b26o25bo4bo64bobo18bo2bo11bo2bo53bo5b5o5b5o5b5o5bo45b o13bobobo88bo4bo6b3ob3o25bobo2b2ob5obo3bobob4o2b2obo2b2o3bobo6bo$131b 2o362bobo29b24ob3obo64b2ob2o21b11o53b3ob6o5b5o5b5o5b6ob3o40bo5b4obo53b o39bo6b3o11bo15bo3bo2bobo2bo2bobo2bo3bo2b3o3b3o2bo4bo7b2o4bo$381b2o 121b23o24b2o91b3o11b3o27bo5bo9bo5b2obo7b5o5b5o5b5o7bob2o5bo9bo5bo17bo 4bobobobo53b2o5b6obo24b2o5bo4bobobo4bo5bo3bob2o3b3o6bo11b2o2bo4bo5b3o 11bob4o$32bobo346b2o120bo23b23obo85bo9b11o9bo19b3o3b3o7b3o3b2obo2b6o5b 5o5b5o5b6o2bob2o3b3o7b3o3b3o16bo3bo59bobo4b3ob2ob3ob2o20b2o4bobo3b3o2b o3b2o4bob2o3bo2bo2bo3b2o2b2o18bo5b2o15b2o$31bo360bo108b2ob23o24bo84b3o 7bo11bo7b3o11b3o3bo2b2ob2o2bo4bo3b2o2bobob2o6b5o5b5o5b5o6b2obobo2b2o3b o4bo2b2ob2o2bo3b3o9bo30bobo40b2o7b2o14bo5b2o3b2o3bo5b2o2b5o4bo3bo3bobo $32bo2bo357bo133b22o3bo82b2obo5bob13obo5bob2o10bo2bob3o2bobo2b3o3b4o3b 2o6b5o5b5o5b5o5b5o6b2o3b4o3b3o2bobo2b3obo2bo10bobo18b3o9bo27b2o5b2o3bo b3o4bo11b2o3b2o4b2o2b2o3bo5b2o2bo3b2o5b2o$34bobo354b3o23b2o66b2o13bo4b 22o22bobo83b3o5b3o13b3o5b3o10bo7bo5bo5bo6bo3b4o5b6o5b5o5b6o5b4o3bo6bo 5bo5bo7bo33bo5b2o2bob3ob2o20b2o4bo8b2o5bo3b3ob4o5b2o3b2o2bo17bobo6bo$ 37bo11b3o365b2o66bobo12bo26b22o3b2o82b2o4bo3b13o3bo4b2o11bo19bo2b7o16b 5o5b5o16b7o2bo19bo32bo5b2obo2bobo3bo27bo2b3o4bo4b3o5b3o4b2obo$36b3o 446bo15bo4b21o21bo91b6o13b6o16bo2bo4bo3bo9b2o5b4o6b6o5b5o5b6o6b4o5b2o 9bo3bo4bo2bo30b2o5b4o2bob2ob2obo14b3o5b2o3bo9b2obo4bob2o5b2o$36bo467bo 2bo19b19o2bo15bo12bo61bo6b13o6bo21b2o5b2o3b2o6bo3bo3bob2o7b5o5b5o7b2ob o3bo3bo6b2o3b2o5b2o36bo5bo4bo6b3o5b2ob2ob6ob2o3bo3bo15b2obo6bo87b3o$ 34b2o353b2o118b18o36b3o10b3o60b2ob4o13b4ob2o41bo5bo7b5o5b5o5b5o7bo5bo 61bobobo6bob3ob2o2b2o3bo2b3o3bo6bo26bo89bo$36bo13b3o336b2o116b2o18b17o 2bo16bob2o8b2obo58b2o7b13o7b2o17bo5bo34b5o5b5o34bo5bo37b4o3bob2o5b2ob 2ob3o11bo123bo$34bo2bo12b3o5b2o357bo89b20o17b4o16b3o8b3o59bob3o3bo13bo 3b3obo7b3o6b3o3b3o6bo23b3o5b5o5b3o23bo6b3o3b3o6b3o25b2obobo9bo6bobo3bo 3bo126b2o$22b2o10bobo13b2o6b2o355bobo88bo2bo17b17ob3o16b3o8b3o59bo4bob ob13obobo4bo6bo2bo5b2o2bobo2b2o4b3o6b3o5bo6bo3b5o5b5o3bo6bo5b3o6b3o4b 2o2bobo2b2o5bo2bo28bo25bobo126bo$21bo12bo14bo115bobo248b2o7b2o84b16o 17bobobo15b3o8b3o59bo2bo3bo15bo3bo2bo9bo7bobob3o5b2o2bo5bo2bo3b3o4bo2b 2o5b5o5b2o2bo4b3o3bo2bo5bo2b2o5b3obobo7bo$21bo2bo22b2o2bo25b2o3b4o82bo 128b3o125b2o67b2o9b2o3bo16b18o2bo18b4o2b4o62bo5b17o5bo10bo3b2obob3obob 2o3bo2bo5bo3bo2bo2b2o4bo3b5o5b5o3bo4b2o2bo2bo3bo5bo2bo3b2obob3obob2o3b o181bo6b2o$19b2ob4o22bo3bo9bo9b3obo2bo6bo77bo3bo128bo196bobo14b16o16b 2o22b3o2b3o63b2o25b2o7bobo7bo6bo2b3o2bo2bo3b3o4b2o7b2obo5b5o5bob2o7b2o 4b3o3bo2bo2b3o2bo6bo7bobo168bobo2b2o2b2ob2o3b2o5b3o$18bo29bo2bo10bo13b o2bo2b5o81bo81b2o46bo195bo16b2o14b13o27b3o2b3o71b13o21bo4b3o2bo3b2o6bo 3b2o2b2ob2obo2b2o4b6o5b6o4b2o2bob2ob2o2b2o3bo6b2o3bo2b3o4bo170bobob4o 2b2obo2b2o3bobo6bo$18bo3b3o2bo21b3o7bo16bo2bo85bo2bo80bobo145b2o113bob 13o13bo97b2o5bo13bo5b2o12b2o6bo3bo4bobo3b2o7bo9b3o7b5o7b3o9bo7b2o3bobo 4bo3bo6b2o158bo3bob2o3b2o3b3o2bo4bo7b2o4bo$18bo2bo2bob3o2b3o21b2o6bo 14bo87b3o82bo145b2o113bo14b11o3b2o25bo4bo72b13o20b2o3bo17bo2bo3b2o3b6o 2bob7o5b7obo2b6o3b2o3bo2bo17bo3b2o154bo3bob2o3bo2bo2bo5b3o11bob4o$20b 2o4b3o27b4o15bobo17b2o414bo2b2ob10o12b4o24bobo2bobo60bo8b2o13b2o8bo13b o15bobo3b2o7bobobo12b5o12bobobo7b2o3bobo15bo154b2o3b2o4bo3bo3bobo5b2o 15b2o$22b2obobo32bo3bo11bo18b2o418b2o10b9o2b3o24b2ob6ob2o57b3o6bo2b13o 2bo6b3o28bobo4b2o11bo3b8o5b8o3bo11b2o4bobo163b3ob4o5b2o5b2o42b2o$23b2o bo10b3o21bo371b2o81b11o9b2obo25b2o8b2o56b2obo5b3o15b3o5bob2o36b2obo7bo 11b5o11bo7bob2o168b3o5b3o4b2obo6bo43b2o$26bo10b2o23bobo368b2o82bo9b12o 24bo4b6o4bo54b3o5bo4b13o4bo5b3o52b7o5b7o174b2ob2ob6obob2o5b2o53bobo$ 37bo15b2o8bo163bo275b2o15b7o8b3o25b5o2b2o2b5o55b2o4b6o13b6o4b2o60b5o 178bo2b2o3bo2b3o2bo6bo56b3o4bo$38bo14b2o172b2o274bobo14b2o5b4obo28bo6b 2o2b2o6bo58bo6b13o6bo60b5o5b5o163bobo2b2o2b2ob3o18bo50b2obo2b3ob5o$ 226bobo24b2o150b2o96bo20b2o3b2obo28b7o6b7o57b2ob5o13b5ob2o58bo5b5o5bo 158bobob4o2b2obo2bo3bo3bo58b2ob2o3bo6b2o2bo$252bobo150b2o25b2o93bo31bo 8b2o2b2o8bo63b13o65bob5o5b5obo146bo3bob2o3b2o3b3o2bo4bo6bobo53b2ob2o3b 2o4bo$103b2o149bo272bo31b9o2b2o2b9o54bo6b2o13b2o6bo55b2o6b5o6b2o141bo 3bob2o3bo2bo2bo5b3o62b2ob2o3b2o5b2o2b2ob2o2b2o$92bobo8b2o326bo3bo121bo 10bo4bo10bo55b2obo2b13o2bob2o57bo3b5o5b5o3bo86b2o48b2o3b2o4bo3bo3bobo 5b2o58b2ob2o3b2o5b2o7bo$91bo3bo340bo4b2o114b11o2b2o2b11o52b2o4b3o13b3o 4b2o53b5o5b5o5b5o76b2o7b3o40b3ob4o5b2o5b2o67b2ob2o3b2o5b2o13b2o5bo3b3o $81b3o7bo4bo332bo7bo3b2o112bo12b6o12bo59b13o61bo5b5o5b5o5bo76b2o4bob4o 2b2obo29b3o5b3o4b2obo6bo62b2ob2o3b2o5b2o19b2obo2bo5bo$45b2o29b2o3b4o6b o4bo331bo4bo121b13o6b13o55bo2bo13bo2bo53b3ob6o5b5o5b6ob3o71bo12bob2ob 2o18b2ob2ob6obob2o5b2o69b2ob2o3b2o5b2o28bob2o3bo$46bo28b2o3bo4bo6bo3bo 166b2o164bobobo4bo73b2o39bo14bo4bo14bo57b13o34bo5bo9bo5b2obo7b5o5b5o7b ob2o5bo9bo5bo45b2o6b3o4b2o3bobo15bo2b2o3bo2b3o2bo6bo67b2ob2o3b2o5b2o 30bobo3b2o$28b2o13b3o34b2ob2o7bo2bo167bobo147b2o14bo8bo73bobo38b15o6b 15o54b3o13b3o30b3o3b3o7b3o3b2obo2b6o5b5o5b6o2bob2o3b3o7b3o3b3o46bo4bo 3b2ob2o5bo6bobo2b2o2b2ob3o18bo62b2ob2o3b2o5b2o41bo10b3o$28b2o13bo36b4o 179bo149b2o15bo4b2obo73bo38bo16b6o16bo45bo9b13o9bo16b3o3bo2b2ob2o2bo4b o3b2o2bobob2o6b5o5b5o6b2obobo2b2o3bo4bo2b2ob2o2bo3b3o43bobo2b2ob5obo3b obob4o2b2obo2bo3bo3bo70b2ob2o3b2o5b2o47b2o2b3o5bo$81bo145b2o195bo6bob 2ob3o112b17o6b17o44b3o7bo13bo7b3o15bo2bob3o2bobo2b3o3b4o3b2o6b5o5b5o5b 5o6b2o3b4o3b3o2bobo2b3obo2bo37bo2bobo2bo2bobo2bo3bo2b3o3b3o2bo4bo6bobo 65b2ob2o3b2o5b2o52b2ob3ob2o2bo$76b2o26b3o121b2o195bo6b3ob2o103bo7bo18b 2o2b2o18bo7bo33b2obo5bob15obo5bob2o14bo7bo5bo5bo6bo3b4o5b6o5b6o5b4o3bo 6bo5bo5bo7bo42bo11b2o2bo4bo5b3o74b2ob2o3b2o5b2o55bo10bo$66bo3b2o4b3o 24bo2bo120bo195b3o114b3o6b19o6b19o6b3o32b3o5b3o15b3o5b3o14bo19bo2b7o 16b5o16b7o2bo19bo39b2o2b2o18bo5b2o70b2ob2o3b2o5b2o60bo4b2obobo$66bob2o 2bo6bo22bo4bo193b2o237bob2o3bo20b6o20bo3b2obo33b2o4bo3b15o3bo4b2o16bo 2bo4bo3bo9b2o5b4o6b6o5b6o6b4o5b2o9bo3bo4bo2bo137b2ob2o3b2o5b2o70bob2o$ 27b3o23b2o11bo2b5o2b4o22bo2b3o193bobo237b3o3b21o6b21o3b3o38b6o15b6o26b 2o5b2o3b2o6bo3bo3bob2o7b5o7b2obo3bo3bo6b2o3b2o5b2o138b2ob2o3b2o5b2o73b obo3b2o$26bo27bo15b3o3b3o23bo5bo192bo239b3obo22b6o22bob3o37bo6b15o6bo 45bo5bo7b5o5b5o7bo5bo153b2ob2o3b2o5b2o85b2o$26bo3bo5b2o13b3o15b3o31b7o 311b2o98b2o18b2o2b23o2b2o2b23o2b2o37b2ob4o15b4ob2o23bo5bo34b5o34bo5bo 25b2o99b2ob2o3b2o5b2o89bo$24b2o3b2o5b2o13bo17b2o38bo311b2o98bobo22bo 21b2o2b2o21bo40b2o7b15o7b2o11b3o6b3o3b3o6bo23b3o5b3o23bo6b3o3b3o6b3o 16b2o93b2ob2o3b2o5b2o96b2o$23bo2bobo2bo37bo39bo236b2o101bo71bo26b20o6b 20o42bob3o3bo15bo3b3obo10bo2bo5b2o2bobo2b2o4b3o6b3o5bo6bo3b5o3bo6bo5b 3o6b3o4b2o2bobo2b2o5bo2bo15bo5b2o82b2ob2o3b2o5b2o101b3o$23bo2bobo2b2o 74b2o12b2o223bobo98bobo96b2o20b2o2b2o20b2o40bo4bobob15obobo4bo13bo7bob ob3o5b2o2bo5bo2bo3b3o4bo2b2o5b2o2bo4b3o3bo2bo5bo2b2o5b3obobo7bo18b2o5b 2o76b2ob2o3b2o5b2o106bob2o$25b2ob2o2bo88b2o223bo101b2o96b22o2b2o2b22o 40bo2bo3bo17bo3bo2bo13bo3b2obob3obob2o3bo2bo5bo3bo2bo2b2o4bo3b5o3bo4b 2o2bo2bo3bo5bo2bo3b2obob3obob2o3bo13b2o2bobo4bo73b2ob2o3b2o5b2o110bob 4o$5bo20bo4bo513bo2bo19bo4bo19bo2bo40bo5b19o5bo11bobo7bo6bo2b3o2bo2bo 3b3o4b2o7b2obo5bob2o7b2o4b3o3bo2bo2b3o2bo6bo7bobo8b4ob2o3b2o70b2ob2o3b 2o5b2o113b3o$4b3o22b2ob2o27b2o487b18o2b2o2b18o45b2o27b2o17bo4b3o2bo3b 2o6bo3b2o2b2ob2obo2b2o4b7o4b2o2bob2ob2o2b2o3bo6b2o3bo2b3o4bo13bo10b2o 65b2ob2o3b2o5b2o118b2o$3b3obo20b4o30bo43bo437b2o3bo18b6o18bo3b2o47b15o 24b2o6bo3bo4bobo3b2o7bo9b3o9b3o9bo7b2o3bobo4bo3bo6b2o12bo72b2ob2o3b2o 5b2o127b2ob3o$2bo3bo22b2o28b3o43bobo95bo346b18o6b18o45b2o5bo15bo5b2o 16b2o3bo17bo2bo3b2o3b6o2bob9obo2b6o3b2o3bo2bo17bo3b2o18bo61b2ob2o3b2o 5b2o132b3o3bo$b2o2bo2bo50bo44b2obo94b3o325b2o18b2o16bo4bo16b2o53b15o 28bo15bobo3b2o7bobobo19bobobo7b2o3bobo15bo19b2o58b2ob2o3b2o5b2o138b3o$ 3o2b4o95b2o95b3obo324bobo18bob15o6b15obo52b2o15b2o42bobo4b2o11bo3b11o 3bo11b2o4bobo90b2ob2o3b2o5b2o145bobobo$2bo3bo2bo95b3o21b2o69bo3bo325bo 20bo16b6o16bo51bo2b15o2bo50b2obo7bo17bo7bob2o43b3o48b2ob2o3b2o5b2o152b 4o$2bo6bo96bo22b2o68b2o2bo2bo343bo3b14o6b14o3bo49b3o17b3o65b9o58bo2b2o 42b2ob2o3b2o5b2o160bo$4bo2bo62bo36bo2bo87b3o2b4o344bobo14b2o2b2o14bobo 49bo4b15o4bo133bo39b2ob2o3b2o5b2o163b2o$6b2ob2o58bobo32bo6bo88bo3bo2bo 341b2o3b14o6b14o3b2o47b5o15b5o66b5o97b2ob2o3b2o5b2o165bo2bo$6bo14b2o 47bo33bo6bo88bo6bo346bo14b4o14bo22bo24b4o6b15o6b4o24bo35bo5bo62bo2b3o 23b2ob2o3b2o5b2o181b2o$21b2o44b3o34bo4b3o90bo2bo348bo2b12ob2ob12o2bo 21b3o7bo8bo5b2obob6o15b6obob2o5bo8bo7b3o33bob5obo61b3o2bo18b2ob2o3b2o 5b2o179b3o3bobo$67bo30bo105b2ob2o389bo9b2o2bo5b3o6b3o3bo2bo8b15o8bo2bo 3b3o6b3o5bo2b2o9bo21b2o3bo3b2o61b2o16b2ob2o3b2o5b2o183bo4bo3bo$97b3o 104bo14b2o318b2o12b2o4b11o2b11o4b2o8b3o8bob2o6bob2o4b2o2bo3bo4b6o15b6o 4bo3bo2b2o4b2obo6b2obo8b3o20bo2bo3bo2bo60b2ob2o9b2ob2o3b2o5b2o193b2o$ 5b2o16b2o71b2ob2o118b2o193bo124bobo13bo2bo24bo2bo9b2obo7bo2b4o5b3o2b2o 7bob4o6b15o6b4obo7b2o2b3o5b4o2bo7bob2o18bob2o5b2obo59b2o7b2ob2o3b2o5b 2o193bo5bo$7bo14b5ob3o64b2obobo297b2ob2o6bob2o2b2o122bo14bo4b8o8b8o4bo 8b3o9bobob2o5b3o2bob8o6b2obo17bob2o6b8obo2b3o5b2obobo9b3o18bobo2b3o2bo bo62bobob2o3b2o5b2o28b3o$5b2o14bo5bo2bo47bo15b3o2b3o296b2o8bob5o143b2o 7b2o4b2o7b2o12b3o6b3o3bob4o2b2o3bo9b5ob2o2b17o2b2ob5o9bo3b2o2b4obo3b3o 6b3o17b2obob5obob2o65b2o5b2o36bo$22b2ob5o47bobo15bo6bo100b2o193b2obobo 5bo4b2o140b2o2bob4o10b4obo2b2o11b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo15bo 11b3obo3b2o2b2o3b2ob2o6bo2bo2b2o95bo4b2o42bo81bo$23b3o52bo17b5obo102bo 195bobo11bobo138b2obo8b6o8bob2o15bob2o7bobo3b2o8bob2o4bobo6b15o6bobo4b 2obo8b2o3bobo7b2obo22bob2o3bo3b2obo63bo42b2o85b2o$75b3o19b4ob2o99b2o 197b2o153b4o2b2o3b6o3b2o2b4o17b2obo5bo3bo17bo3bo29bo3bo17bo3bo5bob2o 23bobo9bobo107bob2o81bobo5bo$11bo63bo26bo312b3o6b2o132bobo3bo3b2o2b2o 3bo3bobo63b11o69bo11bo12bo188b2o$11b2o88bo125b2o195b2o30bo101b2obo3bo 10bo3bob2o62bo11bo92b2o91bo4bo81bobob2o3bobo$3b3o4bob2o213b2o228bo90b 2o11bo3bo10bo3bo66b11o93bobo90b6o79b2o7bo$10bobo10b2o184bo245b3o90bobo 6bo3b2obo12bob2o3bo60b2o11b2o93bo90b2o2bobo7bo68b2o5bo4bo52bo$10b2o10b 2obo60bo122b2o337bo9b4o2bo3bo4bo3bo2b4o60bo2b11o2bo93bo96bo4bo2bo68b6o 2bo2bo52b2o$22b2obo59bobo113b3o4bob2o352bo3bo4bo3bo65b3o13b3o89bobob2o 80b3o3bo2bo5bo3bo3bo130bobo$24bo61bo108b3o10bobo214b2o137bo12bo64bo4b 11o4bo89bob4o81bo6bo6b2o5bo$83b3o108bo13b2o214bo2bo137bobo6bobo65b5o 11b5o102bo75bo2b2o6b2o2b2o2bo128b3o5b2o$16bo66bo110bo3bo225bo2b2o3b2o 178bo24b4o6b11o6b4o24bo51b2o8bo9b2o72b4ob2obo6bo3bo70bobo51b2ob2ob5ob 2o2b2o$14b3o175b2o3b2o225bob2o4b2o47bo129b3o7bo8bo5b2obob6o11b6obob2o 5bo8bo7b3o50bobo3b3o11bobo68bo4bo6bob2o2bo74b4o45b2ob2o3b2o3b3obo2bo$ 9b2o3bo176bo2bobo2bo221bo2bobo52bobo118bo9b2o2bo5b3o6b3o3bo2bo8b11o8bo 2bo3b3o6b3o5bo2b2o9bo39bo3bo5bo11bo68bobo10bo3b2o77bo40b2ob2o3b2o8bo2b 3o$9b2o3b2o84bo2bo87bo2bobo2b2o220b2o57b2o75b2o40b3o8bob2o6bob2o4b2o2b o3bo4b6o11b6o4bo3bo2b2o4b2obo6b2obo8b3o41b2o18bo67bo5bo5b2o3b3o112b2ob 2o3b2o5b2o6bo5bo$15bo3bo84bo88b2ob2o2bo203b2o14bo136bobo38b2obo7bo2b4o 5b3o2b2o7bob4o6b11o6b4obo7b2o2b3o5b4o2bo7bob2o44bo12bobob2o72bo4bo2bo 80bo2b2o26b2ob2o3b2o5b2o8bo3bo9b2o$16b2obo80bo3bo89bo4bo204b2o9b2o2b2o 136bo40b3o9bobob2o5b3o2bob8o6b2obo13bob2o6b8obo2b3o5b2obobo9b3o41bo16b ob4o61bob3o2bo3bo87bobobo21b2ob2o3b2o5b2o14bo3bo2b2o3bobo$15bo85b4o92b 2ob2o213b2o2bo178b3o6b3o3bob4o2b2o3bo9b5ob2o2b13o2b2ob5o9bo3b2o2b4obo 3b3o6b3o41bo29bo52bo5bobobo2bo2b2o82bo3bo16b2ob2o3b2o5b2o25bob2o4bo$ 14b2ob3o176b4o92b3o114bo6bob2o179b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo11b o11b3obo3b2o2b2o3b2ob2o6bo2bo2b2o31bo6b3o10b2o8bo9b2o54bobo10b2o86bo 12b2ob2o3b2o5b2o25bob2ob3o2bo$15b3obo177b2o93bo114b4o6b2o184bob2o7bobo 3b2o8bob2o4bobo6b11o6bobo4b2obo8b2o3bobo7b2obo34b5o3bo12bobo3b3o11bobo 52b2ob2o4b2o4bob2o81b3o7b2ob2o3b2o5b2o19b2o14b3ob2o4b2o$16bo276bo112bo 3bo193b2obo5bo3bo17bo3bo25bo3bo17bo3bo5bob2o29bo4b2o4bo5bo9bo3bo5bo11b o57b2o8bo2bo81bo4b2ob2o3b2o5b2o25b2o16bobo5b2o$16b3o372b3o11b3ob2o238b 7o73b2o3b2o8bo2bo12b2o18bo51bo2bo2bo2bo3bo4bo84b2o3b2o5b2o29bo17b2obo 4bo$17b2o371bo3bo11bo2bo238bo7bo72bobo3bob2o3bo2bo18bo12bobob2o49bobo 4bo2bo92b2o5b2o53b4obo$197bo193b2o14b2o157b2o81b7o77b3o4bobo3bo14bo16b ob4o46bo2bo3bob2obob3o90b2o37b2o4b3o4b2o4bo4bob2o$198bo194b2ob2o168bob o78b2o7b2o75b2o26bo29bo36bo3bo3bo5bo55b2o75bo3b2o2b2o5bo3b2obob2o2bo$ 196bo2bo195b2o169bo79bo2b7o2bo77bo13bo6b3o10b2o8bo9b2o34bo3bo4bo3b2o 51b3o4bo74bo2bob2o5b2o2bo3b3o6bo$199bo445b3o9b3o64b2o6bo3bo12b5o3bo12b obo3b3o11bobo33bo7bob2obo2bo50b2obo2bo73bo4bo7b3ob2o2bo2bobo$196b2o2bo 183bo259bo4b7o4bo63bobo5bo10bo4b2o4bo5bo9bo3bo5bo11bo25b3o4bo2bo12bo 56bo74bo7bo2bob2o3b3o9bo$197bo2b2o166b2ob2o6bob2o2b2o257b5o7b5o63bo6bo 3bo6b2o3b2o8bo2bo12b2o18bo22b5o3bo2bo5bobo58bo4b2o79b2o6b2o8b7o$195bo 3b2o167b2o8bob5o229bo24b4o6b7o6b4o24bo36bo3b4o7bobo3bob2o3bo2bo18bo12b obob2o19bo78b3o2bobo76b3ob2o2b2o3b4obobo5bo$368b2obobo5bo4b2o227b3o7bo 8bo5b2obob6o7b6obob2o5bo8bo7b3o34bo3bo2bobo10b3o4bobo3bo14bo16bob4o18b o2b2ob3o3bo3bo2bo62bo4bo74bo8b4ob2o10bo$195bo2b3o170bobo11bobo33b2o12b o166bo9b2o2bo5b3o6b3o3bo2bo8b7o8bo2bo3b3o6b3o5bo2b2o9bo23bo3bo15b2o26b o43b3obobo2b2obo63b4obobo74bobo7b5o$197bob2o171b2o46bo2bo9b3o139b2o24b 3o8bob2o6bob2o4b2o2bo3bo4b6o7b6o4bo3bo2b2o4b2obo6b2obo8b3o22bobo20bo 13bo6b3o10b2o8bo25bo2bo3bo5b2o34b2o25b2obob2o73bobo7bo2bo$197b2o186b3o 31bobobo8bo142bobo22b2obo7bo2b4o5b3o2b2o7bob4o6b7o6b4obo7b2o2b3o5b4o2b o7bob2o13b3o4bo3bo7b2o6bo3bo12b5o3bo12bobo3b3o27b3o3bo5bo37b2o31b3o69b obo12bo$182b3o234bobob2o7b2o141bo24b3o9bobob2o5b3o2bob8o6b2obo9bob2o6b 8obo2b3o5b2obobo9b3o13bo5b3o10bobo5bo10bo4b2o4bo5bo9bo3bo5bo23b2obo6bo 2bo37bo32bob2o5b3o60bobo$106b2o74b3o7bobo222b2obo3bo175b3o6b3o3bob4o2b 2o3bo9b5ob2o2b9o2b2ob5o9bo3b2o2b4obo3b3o6b3o14bo4bobo2b2o6bo6bo3bo6b2o 3b2o8bo2bo12b2o40bo37bo35bo2bo6bo59bobo$106b3o72bo3bo5bo2bo12b2o208bo 2bob3o5bo57bo112b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo7bo11b3obo3b2o2b2o3b 2ob2o6bo2bo2b2o11b2o4b3ob2o13bo3b4o7bobo3bob2o3bo2bo18bo17b3o6b2o7b3o 36bobo33b2o2bo5bo59bobo$106b2obo72b2ob3o4bobo7bo4b2o205b2obobobo2bo4bo bo57bo115bob2o7bobo3b2o8bob2o4bobo6b7o6bobo4b2obo8b2o3bobo7b2obo15bobo 4b2o15bo3bo2bobo10b3o4bobo3bo14bo23b2ob5o6bo2bo38b2o31bo3bo3b2o60bobo$ 110bo13bo57b2o4bo5b2o6bo211bo2bo5b2o5b2o2b2o51b3o116b2obo5bo3bo17bo3bo 21bo3bo17bo3bo5bob2o16bo7bo15bo3bo15b2o26bo19bob2o3bo2bo6b2obo2b2o35b 2o35b2o2bo60bobo$102bo3b2o3bo12bo60bo2bo205bo20b2o4bobo10b2o215b3o64bo 4bobo13bobo20bo13bo6b3o25b2obob2o7b4ob2o34b3o36bo2bo4b2o53bobo$112bo 11bo61b2o204b4o21b5obo226bo3bo63b2o4bobo4b3o4bo3bo7b2o6bo3bo12b5o3bo 21b3o3b2obo2bo3b2obo2b2ob2o35b2ob3o33bobo3bobo52bobo$109bobo279b2o2bo 21bo4bo15bo145b2o65b3o64b4o3bobo3bo5b3o10bobo5bo10bo4b2o4bo5bo24bo4bob 5obo5bo39bo2bo33b2o5bo51bobo$109bo280bob4o22b4o16b3o29bobo111bobo62b2o 3b2o52b3o5b2o4bo3bobo3bo4bobo2b2o6bo6bo3bo6b2o3b2o8bo2bo16bobo5bobo3bo bobo8bo43bo32b3obo53bobo$104bo4bobo13bo259bo4b5o24bo21bo28b2obo110bo 63bo2b3o2bo51bo6b2obo2bobo3bobo4b3ob2o13bo3b4o7bobo3bob2o3bo2bo27bo8bo 6b2o44bo34b3o26bo25bobo$123b2ob2o4b2o81b2o168bo7b2o22bo22b2o31b3o37bo 124b3o7b2o5b2o7b3o42bo2b3ob3o3bobo3bobo4b2o15bo3bo2bobo10b3o4bobo3bo 16bo2bo12b4o51b2o34bo2bo2b2o21b2o23bobo$108b4o20b2o76bo4b2o157b2o16b3o 22b2o51b2o4bo34bobo123bo2bo10b3o10bo2bo43bo11bobo3bobo4bo15bo3bo15b2o 27b2obo11bo56bo6bo27b2obo4b2o19bobo22bobo$108b2o12bobo84bob2o161b2o17b 3o74bob5o35b2o112bo13bo4b6o3b6o4bo49bo9bobo3bobo3bobo13bobo20bo25bobo 11bo2b2obo52b2o4b2o27b2o4bo4b2o39bobo$122bo3bo82bo3bo153b2o24b2o77bo 153b3o11bo3bo6b3o6bo3bo38b2o10bobo7bobo3bobo3bobo4b3o4bo3bo7b2o6bo3bo 23b2o15b4obo57bobo5bo25bo5bobo13b2o23bobo$122b2o2bo9b2o71b2o2bo152b2o 26b2o75bo3b2o152bo7bobo4b2o3b2o3b2o3b2o4bobo34b2o8b2o3bo8bobo3bobo3bob o3bo5b3o10bobo5bo48bobo50bobo11b2o20b5o7bo13b2o22bobo$123b3o9bo73b2ob 2o154bo93b2o6bo3bobo151b2o12b2o7b3o7b2o41bo5b2o10b2o3bobo3bobo3bobo3bo 4bobo2b2o6bo6bo3bo45bobo42b2o8b2o2bobo4bobo11b2o9b2o3b2o7b3o30bobo$ 124bo5bo2bo42b3o27bo3b2o250b2o6b2o3bo8b2o107b2o47b3ob2o9b2ob3o45b2obo 10bobo3bobo3bobo3bobo4b3ob2o13bo3b4o48bo43b2o9bobob2o17b3ob2obo2bo4bob 2o8bo9b2obo16bobo$130bo2b5o38bobo25b2o108b2o167bo2bo106bobo46bo3bob4ob 4obo3bo42b2o4b2o9bo6bobo3bobo3bobo4b2o15bo3bo2bobo43bobo44bo15bo2b2o 12bob2o3bo4b2ob3o10bo11b4o14bobo$130b2ob4o39bobo26b2o106bobo14b3o150b 2obo106bo109bob2o4bo13bo4bobo3bobo3bobo4bo15bo3bo48bo43b2o14b2o4b2o17b o2b2obobo2bo5bo2b2o11b2o3bo13bobo$136b2o38bo4b2o132bo16bo49b2o102bob2o 140bo10b2o9bo9b2o38b4o4bobo12b2o4bobo3bobo3bobo3bobo13bobo46bobobo45bo 19bobo9b3o4bo2b2o6b2o3b2o2bo9bo2bo17bobo$136b3o36b3o3b2o148bo50b2o96b 2o4bobo131b2o8b4o18bo48b2o4b2o16b4o3bobo3bobo3bobo3bobo4b3o4bo3bo44bo 72b3o2b2ob2ob3o3bobo4bo12bo5bo23bobo$117b3o16b3o42bo195b3o80b2o17bobo 3b2o2bo131bo12bo16bobo46b2o2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bo5b3o 46bo3bo45bo2bo20b3obo2bo3b3o3bo6bo8b2o2bobo3b2obo3b2o14bobo$112b2o3bob o6bo27bo22b4o196bo83b2o18bo6b2o129bo11b2obo5b2o59bo2bo10bo6b2obo2bobo 3bobo3bobo3bobo3bobo3bo4bobo2b2o2b2o39b2o50b2o5b2o13bobo2bo4bo5bob4ob 2o12b2ob2obobo3b2o13bobo$112b2o2bo3bo3b2ob2o25bo23b2o176b3o19bo81b2o 155b4o10b2o6bo2bo8bobo47bo14bo2b3ob3o3bobo3bobo3bobo3bobo3bobo4b3ob2o 6bobo37b2o53bo5b2o13bo6bobo4b2o6bo10bo8bo5bo13bobo$99bobo14bo2bobo6bo 24bobo22bo177bo259bo4bo8bo7bobobo9bo48bo3bo12bo11bobo3bobo3bobo3bobo3b obo4b2o9bo38bo53bobo4bo22bobo13bo17bo6bo12bobo$98bo25bo3bo25b2o2bo11b 2o185bo244b2o11bob5o6b4o5b3obo60bo18bo9bobo3bobo3bobo3bobo3bobo4bo12bo 35bo54bo2b2o31bo5b3o11bo2bo8b2o12bobo$99bo2bo15b3o4b3o25bo5bo9bo2bo6bo 121b3o93b2o5b2o196bobo10bobo4b2o8bo6bo64b2o4b2o10bobo7bobo3bobo3bobo3b obo3bobo3bobo10b3o91b2o35b4obo11bob2o20bobo$101bobo15bo33bo5bo10b2o5bo bo123bo4b2o88bo5b2o196bo11b2o5bo2bo2bo3b2o5b2o69b2o8b2o3bo8bobo3bobo3b obo3bobo3bobo3bobo100bo42b2o15bo19bobo$104bo48bo4bo12bo4b4o122bo6b2o 25b3o59bobo213bo2bobobob2o3bo2b2o5b2o53b3o4b2obo7bo5b2o10b2o3bobo3bobo 3bobo3bobo3bobo3bobo4b3obobo87bobo39bob2o15b2o17bobo$103b3o51bo13bo3b 4o129bo29bo60b2o213b3obo2bo7b2o62bo6bo3bo10b2obo10bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bo2b2obo86bobo36bo3b3o17bo16bobo$76b3o24bo12bo2bo34b3o 13b2obo4bo158bo65b2o209bo3bob2o72bo5bo4bo6b2o4b2o9bo6bobo3bobo3bobo3bo bo3bobo3bobo4b2o88bobo37b2o21bo16bobo$74b7o6bo13b2o13bo2bo49b2o216b3o 12bobo209b2obobo76bo5b2o6bob2o4bo13bo4bobo3bobo3bobo3bobo3bobo3b2o2bo 2bo2bo84bobo41b2o34bobo$73b9o4bo16bo12b2o55bo213bo15bo23bo187bobobo75b 2ob2o9b4o4bobo12b2o4bobo3bobo3bobo3bobo3bobo5b3ob2o85bobo41bobo33bobo$ 72bo7b3o2b2o14bo2bo47b2ob2o12bob3o199bo14bo38b2o19bobo164bo2bo18b2o69b 2o4b2o16b4o3bobo3bobo3bobo3bobo3bobo4b2o3b2o83bobo77bobo$73b3o6bo3bo2b o11bobo53bo12bo2bo198b2o52bobo19b3o69bo90b2o3b2o10b2o5b2o2bo54bo12b2o 2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bobo4bo5bo81bobo45bo$74b2o11b3o11b o50b2o16b3o199bobo67b2o5bo32b2o37bo89bobo14b2o5b2o3bo45b2o2bo3bo2bo10b o2bo10bo6b2obo2bobo3bobo3bobo3bobo3bobo3bobo8bo81bobo45b2o31bo$77bo10b o65b3o244b3o38b2o32bo5b2o35b3o89bo16bo6bo49b2o4bo2bo13bo14bo2b3ob3o3bo bo3bobo3bobo3bobo3bobo3bobo11b2o75bobo45b2o31bobo$78bo18b2o206bo94bobo bo70b3o148bob3o5b4o47b2obo17bo3bo12bo11bobo3bobo3bobo3bobo3bobo3bobo5b 2o3bobo73bobo46b2o31b3ob3o3b2o$79bo17b2o206b2o91b3o3b3o24b2o42bobo147b obobo7bo51bobobobo13bo18bo9bobo3bobo3bobo3bobo3bobo3bobo4bobo2bo74bobo 48bo31b2obo2bo2bobo$304bobo90bo4bo4bo24bo192bo2bo6b2o53b2o19b2o4b2o10b obo7bobo3bobo3bobo3bobo3bobo3bobo11bo70bobo49bo32bo3bo5bo$168b2o127b3o 97bob2o2bob2obo21bo102bo92b2o62b2o24b2o8b2o3bo8bobo3bobo3bobo3bobo3bob o3bobo10b3o67bobo49bo28bo2bob2o5bo$171bo127bo98bo2b4obobo19b4o99b2ob2o 97bo2bo54bo8b3o4b2obo7bo5b2o10b2o3bobo3bobo3bobo3bobo3bobo3bobo78bobo 49bobo26bob3o4b2o2bo$168bo2bo126bo100b2o4b2ob2o17bo4bo100bo11bo88b2o 64bo6bo3bo10b2obo10bobo3bobo3bobo3bobo3bobo3bobo3bobo4b3obobo65bobo52b o26bobo2bo3bo3bo$169b2o230bo2bobobo2bo14bobobobo110bobo2b2o70b2o15b2o 62bo5bo4bo6b2o4b2o9bo6bobo3bobo3bobo3bobo3bobo3bobo3bo2b2obo64bobo52bo $169b2o183b2o45b4ob2o2b2o2b2o10bobo4b2o109b2obo2bo69bobo11b2ob2o64bo5b 2o6bob2o4bo13bo4bobo3bobo3bobo3bobo3bobo3bobo4b2o66bobo53b2o$97b3o58b 2o8bo2bo181b2o50bo8b2o2b2o5b2o4b2o2bo98b2o11b2ob2o62b2o4bo13b2ob2o17b 2o44b2ob2o9b4o4bobo12b2o4bobo3bobo3bobo3bobo3bobo3b2o2bo2bo2bo62bobo 53bobo$94b2obobo58b2o8bo176b2o8bo47bobo12bobo3bo2bobo2bob2o97bo2bo11bo 39b2o23bo2bo18bob2o16bo2bo56b2o4b2o16b4o3bobo3bobo3bobo3bobo3bobo5b3ob 2o63bobo$94bo2bobo69b3o172b2o57b2o14bo3b3o3bo2bo99b2o3bo10b3o38bo13bo 10bobo18bob2o17bobo42bo12b2o2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bobo4b 2o3b2o61bobo57bo$83bob2o5b3o95bo155bo16bo60bo2bobob2o31b2o66bo4bo51bob o9bo2bo5b4obo21b2o4b2ob2o4b2o3bo35b2o2bo3bo2bo10bo2bo10bo6b2obo2bobo3b obo3bobo3bobo3bobo3bobo4bo5bo59bobo57b2o21b2o$77b2o4bobo3b2ob2o94b2o 172b2o52b2o7b2obobo13bo18b2o67bo3bo53b2o9bo3bo4b2ob2o17bo2bo2bo4b2ob2o 5bob2o35b2o4bo2bo13bo14bo2b3ob3o3bobo3bobo3bobo3bobo3bobo3bobo8bo59bob o57b2o16b3o4bo$77b2o6b2ob3o2bo8bo86b2o79b2o90bobo52bo8bobobo13bobo17b 2o67bo2bo58b2o3b2o3bo7bo17bo7bo3bo3b2o6bo38b2obo17bo3bo12bo11bobo3bobo 3bobo3bobo3bobo3bobo11b2o53bobo58b2o17b2obo2bo$100bobo166bobo142b3o9bo 2bo14b2o36b2o50bo61bob2obob2o21b3o2bo8b2ob2ob2o7bo40bobobobo13bo18bo9b obo3bobo3bobo3bobo3bobo3bobo5b2o3bobo51bobo60bo22bo$70bo9bo2bo16bo170b o142bo12b2o19bo33bobo111bob2o2b3o20bo3b3o4bo5b5o50b2o19b2o4b2o10bobo7b 2o4bobo3bobo3bobo3bobo3bobo4bobo2bo52bobo61bo18bo4b2o$79bo3bo82b2o279b o36bo65bo45bo20bo13b2o2bo2bobo4bo51b2o24b2o8b2o3bo14bobo3bobo3bobo3bob o3bobo11bo48bobo52b2o7bo19b3o2bobo$66bo7bo8bo82b2o279b3o34b2o3b2o55bo 3bo46b2o19bob2o8bo3bo18bo2b2o2b2o36bo8b3o4b2obo7bo5b2o15b2o4bobo3bobo 3bobo3bobo3bobo10b3o45bobo49b3ob3o5bobo21bo4bo$66bo8bo2bo3b2o378b2o24b o2bo55bo2bo59b3o2bo2bob4obo3bo22b5obob2o45bo6bo3bo10b2obo11b2ob4o4bobo 3bobo3bobo3bobo3bobo56bobo49b2o3bo9bo18b4obobo$65bo4b2o3bo3b2obo282b2o 95b2o23bo2bobo50b2o2b2ob2o58b2obobobo10bo14bo7b2ob2o52bo5bo4bo6b2o4b2o 4b3o3bo3bo7bobo3bobo3bobo3bobo3bobo4b3obobo43bobo46bobo2bo2b2ob2o5bo 20b2obob2o$66bobo6bo289bobo119bob2o2bo49b2o3bobo50bo7bo3b2o4b6o18bo6b 2o3bo2b4o48bo5b2o6bob2o4bo5bo5bobo10bobo3bobo3bobo3bobo3bobo3bo2b2obo 42bobo47b4obo6bo5b2o26b3o$66bob2o295bo119b3o3b2o56bo50b2ob2o4bo3bo5b7o 3bo12b2obo5b2ob3o3bo4b2o42b2ob2o9b4o4bobo5bo5b4o9bobo3bobo3bobo3bobo3b obo4b2o44bobo48bo2bob2o10bobo25bob2o5b3o$484bo3b3o108bob4o5bo2bo12bo 14bo3b2o4b2ob2o9bobo54b2o4b2o11b2ob2o2b2o3b2o4bobo3bobo3bobo3bobo3b2o 2bo2bo2bo40bobo48b2obo3b2o4bo33bo2bo6bo$46b3o22bo226b2o184b4o2bo107bob o10bo15bobo5bo4bobo24bo40bo12b2o2bo16bo6bobobo6b2o4bobo3bobo3bobo5b3ob 2o41bobo47bo2bobo8b2o6bo25b2o2bo5bo$44b7o6bo239bobo188b2o108bo2bo25bo 6b2o4bo2bo23b2o31b2o2bo3bo2bo10bo2bo16bob2obo2bo3bo12bobo3bobo3bobo4b 2o3b2o39bobo47bo4b3ob5o2bo5b2o24bo3bo3b2o$43b9o4bo242bo184b4o2b3o106b 2o27bo12b2o56b2o4bo2bo13bo39b2o4bobo3bobo3bobo4bo5bo37bobo48bo4bo9bo5b 2o29b2o2bo$42bo7b3o2b2o427bo3b2o2bo131b5o3b3o2bo63b2obo17bo3bo31b2ob4o 4bobo3bobo3bobo8bo38b2o50bo3bo3bo2bob2o5b2o30bo2bo4b2o$43b3o6bo3bo2bo 198b3o218b2obobob2o2b2o132b2ob2o5bobobo64bobobobo13bo28b3o3bo3bo7bobo 3bobo3bobo11b2o87b2o9bo7bo31bobo3bobo$44b2o11b3o200bo167bo50bob2obobo 2bo138b2o5bo2bo65b2o19b2o25bo5bobo10bobo3bobo3bobo5b2o3bobo28bo51bo4b 2o2b2o14bo32b2o5bo$47bo10bo65b3o132bo167bobo53bo4b2o134b2ob2o7b2o66b2o 47bo5b4o9bobo3bobo3bobo4bobo2bo28bo2b4o47bo2b3o4bob2o3bo6bo33b3obo$48b o75bo302bobo53bob3o136b4o77bo8b3o4b2obo30b2ob2o2b2o3b2o4bobo3bobo3bobo 11bo29bo2bo44b2obo5b5obob2o6bobo34b3o$49bo75bo228b2o72bo55bo2bo138bo 87bo6bo3bo30bo6bobobo6b2o4bobo3bobo10b3o22b2obo2b2o44b3o2b2ob2ob2ob2o 12bo34bo2bo2b2o$353b2o130b2o228bo5bo4bo29bob2obo2bo3bo12bobo3bobo29b2o 2b2o26b3o20bo4bobo21bo34b2obo4b2o$355bo277bo83bo5b2o51b2o4bobo3bobo4b 3obobo16bobo28b2o3bo18b6o3bobo4b2o12b2o34b2o4bo4b2o$379bo252b4o80b2ob 2o51b2ob4o4bobo3bobo3bo2b2obo13bobo3bo28bo3b2o20b2o7bo16bobo38bo5bobo$ 64b2o312b2o159bo84bo6b2ob2o130b3o3bo3bo7bobo3bobo4b2o16bo9bo24bo5bo24b o3bo53b5o7bo$378bobo157bobo83b2o4b2o83bo50bo5bobo10bobo3b2o2bo2bo2bo 11b2o8bob2o21b2o4b2obo9bo6b3o3bo4bo18bo25b2o9b2o3b2o7b3o$62b2o2bo37b2o 2bo429b2o91b2ob2o71b2o2bo3bo2bo48bo5b4o9bobo5b3ob2o11bob3o10bo20bo6bo 2b2o6b2ob2o2b2ob2o3b5o18b2o25b3ob2obo2bo4bob2o8bo$62bo3b2o39bobo428bo 9bo16bo16bo39bo2b3o3b5o70b2o4bo2bo53b2ob2o2b2o3b2o4bobo4b2o3b2o14bo10b 2o23bo2b2o13bo2b2obo2bob2o12b2o6b2o24bob2o3bo4b2ob3o10bo$106bo16bo415b obo5bo9bo6bo9bo6bo39bobobo4b2o2bo73b2obo58bo6bobobo6b2o5bo5bo7b3ob2o 12bo23b2ob2o9b3o2bo4bo5b2o10bob2o5b2o29bo2b2obobo2bo5bo2b2o$62bob2o57b o415bobo4b2o7b2o6b2o7b2o6b2o39bo2bo5bo79bobobobo53bob2obo2bo3bo17bo25b o27bo18bobobobob3o12bo4bobo22b3o4bo2b2o6b2o3b2o2bo$53bob2o6bo5bo38b2o 13bo413b4o5bo8b2o6bo8b2o6bo5b2o2bo31b2o7bobo77b2o77b2o57b5o19bo2bo18b 3o3bo13b2ob2ob2ob2ob3o3bobo4bo12bo$47b2o4bobo3bo8bo467bobo6b4o13b4o13b 4o3b2o2bo42bo77b2o73b2ob4o6b2o42b2o2b3o2bo25bobo16bo3bo2b2o2b2ob5o3b2o 2bo3b3o3bo6bo8b2o2bobo$47b2o6b2ob2o8b3o38b2o12b2o49bo361bobo5bo5b3o2bo bo3bo5b3o2bobo3bo10b2o39b2ob2o77bo67b3o3bo3bo8bobo38b2obo2b2obo29bo21b o3bobo2bo2b2o3bo3bo4bo5bob4ob2o12b3o$108bo13bo2bo46b2o362b4o4b6o4bo2bo 3b6o4bo2bo3b11o4b2o35b2obo146bo5bobo51bo2bobo3bo43b2o3b2obo4bo2bo15bob o4b2o6bo10bo4b2o$106b2ob2o11bobo6b2o7b3o30b2o364b2obo9bo3bo12bo3bo17bo 3bo185bo5b4o47bo5b5o26b3o14bo2b3obobo3bo19bobo13bo13bo2b2o$109b2o10b2o 7bo2bo6bo393b2o3b2ob10o3b14o3b20o191b2ob2o2b2o3b2o40bo5bo2bo2bo25b3o 54bo5b3o16bo3bo$107bo13bo9b2o8bo391b3obo3bo12bo16bo22bo189bo6bobobo41b o48b3o2bo8b2obo32b4obo11b3o5b2o$124b2o409bob58o3bo35b2o148bob2obo2bo3b o43b3o34b2o5b2o3bobo2bo8bo35b2o22bob2o$124b2o406bo2b2o57b2obobo34bo 207bo34b2o6b4o4b2o4bo3bo33bob2o18b2o5bo$55b2o67b2o390bo14bobo3b57obobo 37b3o205bo33bo21bo3b5o25bo3b3o18bo5bobo$55b2o64b2obo389b2o13b2o2bo66bo 36bo203b2o46b3o10bo2bob2o24b2o25bo2bo$122b3o389b2o13bo2b67o297b2obo2bo 3bo29b2o22b3obo$123bo15b2o373bobo12b3o68bo2b2o2bo279b2o3b2o4bob2o33bob o23bo3bo$138bo2bo387bo2b68o3b2o2bo275b2obo3bo2bo2b2o62b2o4bo$111b2o26b 2o369bob2obobo12bo75b2o274bo8bo4b3o38bo28bo$509bob2ob3o13b76o4b2o266bo 7b2o5bobob2o37b2o26b2o$110bo3bo393b2ob2o95bo3bo49bo16bo198bobobo4bo4b 2o41b2o$115bo393bob2ob3o13b79o52bobo14bobo196bo3bo2bo3bob2obo4b2o35b2o $108bo7bo393bob2obobo7bobo2bo80bo49bobo14bobo200bob3o5b2o5b2o36bo$107b o4bo412bo2bo2b81o3bo46bo16bo196bo2b5ob2o11bo37bo$108bobobo4bo29b2o7b3o 355bobo6b2o86b2obobo45b2o15b2o194bo2bob2o4b2o2bo7bo36bo$108bo8bo28bo2b o6bo357b2o2bob2ob2o6b80obobo46b3o14b3o194bo2b2o6bo3b2o4b2o36bobo$109bo 4b2obo29b2o8bo356b2o3bo7bo2bo86bo252b3o3bo5b2o52bo$110bob2ob3o398bo3b 4o4bob86o44bob2o13bob2o191bo4b3o2b3o3b3o44bo$111b3ob2o403bo3bob4o87bo 2b2o2bo34b2obo13b2obo191bo5bo5b2o2b2o46b2o$89bo65bo363b2o2bo5bob86o3b 2o2bo36bobo14bobo188bo6b2o4b2o2b2o46bobo$88b3o63bobo360bo2bo9b2o91b2o 36bobo14bobo184b2o2b5o2bo6bo3b3o$154bobo358b2o15b91o4b2o31bo16bo187b2o 2bo2b5o3bo4bob2o47bo$88b3o64bo359b2o3bo104bo3bo31bo16bo191bo5bobo2bo3b o49b2o$89b2ob2o421b2o15b94o33b2o15b2o185bo3bo2bo7bo2bo3bo48b2o$91bo58b 2o365bo2bo9b2o96bo25b4ob2o10b4ob2o184b2o11bo2bo5bo49b2o$149bo2bo366b2o 2bo5bob98o3bo21bo2b3o11bo2b3o190b2o7b2o57bo$135bo14b2o368bo3bob4o98b2o bobo4bo20bo16bo187bo11b2o57bo$135b2o379bo3b4o4bob98obobo5bobo5bobo6b3o b3o10b3ob3o186b2o11bo3b3o50bo$134bobo377b2o3bo7bo2bo103bo2b2o6bo13b2o 15b2o185b2o12bo5bo49bobo$89b2o423b2o2bob2ob2o6b102o4bo3bob2o9bo2b3o11b o2b3o186b2o10b2o2bo2bo52bo$66b3o20b2o423bobo6b2o109bo3b3o2b2o9b4o2bo 10b4o2bo180bo3bo12b2ob2o54bo$65bo3bo21bo433bo2bo2b103o3bo4b2obo13bo2bo 13bo2bo178bob3o12bo2b2o54b2o$64bo4bo8b2o9bobo292bo125bob2obobo7bobo2bo 108b5obobo11bobo14bobo178bo17bo2bo54bobo$64bo2bobo7b4ob2o5bo293b2o124b ob2ob3o13b108o3bo20bo16bo181b2o13bobo$64b2obobo6bo3b3ob2o5b2o290bobo 122b2ob2o126b3o13b2obo3bo9b2obo3bo180bo10b2o3bobo56bo$66b2obo2bo4b2obo 2b3o4b3o416bob2ob3o13b108o3bo12bo2b2o12bo2b2o195b2obo59b2o$68b2o2bo8bo 3bo3b2o2bo416bob2obobo7bobo2bo108b5obobo6b2o7bo7b2o7bo188bo3bobo57b2o$ 44bo24b3o9b4obo2b2ob2o431bo2bo2b103o3bo4b2obo9bobob4o9bobob4o186b3o4bo bo57b2o$43b3o15bo21b3o4b3o421bobo6b2o109bo3b3o2b2o220bobo66bo$42b2ob2o 14bo23bo428b2o2bob2ob2o6b102o4bo3bob2o10bo16bo27b2obo161b2obo65bo$41b 2o3bo7b4o3bo452b2o3bo7bo2bo103bo2b2o6bo10bo16bo25bob3o162b3o64bo$42bob obobo5bo3bo44bo412bo3b4o4bob98obobo5bobo5bobo6b3o14b3o25bob2o163b2o64b obo58bo$43b2obo2bo4b2o3bo43bo416bo3bob4o98b2obobo4bo16b2o15b2o24bobo 233bo58b2o$46b2obo7b3o44bo414b2o2bo5bob98o3bo65bobo12b2obo216bo58bobo 5bo$47b2o10b2obo26b2o11b2o413bo2bo9b2o96bo25bo2bob3o9bo2bob3o19b2o12bo b3o55b3o27b3o128b2o65b2o$60b3o26b2o9b4o411b2o15b94o28b4obo11b4obo24b3o 8bob2o55bo3bo25bo3bo126bobo55bobob2o3bobo$61bo37bo2bo412b2o3bo104bo3bo 24bo5b2o9bo5b2o22b3o7bobo56b2o4bo11bo11bo4b2o181b2o7bo$99bo2bo256bo16b o16bo16bo16bo16bo16bo16bo36b2o15b91o4b2o26b7o10b7o24bo7bobo55bobob2ob 2o3b4ob2ob2ob4o3b2ob2obobo126bo51b2o5bo4bo$100b3o255bo9bo6bo9bo6bo9bo 6bo9bo6bo9bo6bo9bo6bo9bo6bo39bo2bo9b2o91b2o30bobo14bobo26b2o8b2o55b2ob o4bob2ob4o7b4ob2obo4bob2o124b2o52b6o2bo2bo$351bo5b2o7b2o6b2o7b2o6b2o7b 2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o41b2o2bo5bob86o3b2o2bo31bo16bo 27bo2bo9b3o50bo4bo3bo4bo2b2obobob2o2bo4bo3bo4bo122b2o$350bobo4bo8b2o6b o8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo5b2o36bo3bob4o87bo2b2o2bo 30bob2o13bob2o25bo12b3o62bo4bo7bo4bo134b2o$343bo6bo5b4o13b4o13b4o13b4o 13b4o13b4o13b4o13b4o3b3obo29bo3b4o4bob86o40b3o14b3o25bo2bo11bo50b2o7b 2o6bo7bo6b2o7b2o123bo$97b2o243bobo4bo2bo2bo5b3o2bobo3bo5b3o2bobo3bo5b 3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5bo4b3o26b2o 3bo7bo2bo86bo83b4o9b2o217bo53bobo$97b2o243bo6b3o3b6o4bo2bo3b6o4bo2bo3b 6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b14o3bo22b2o2bob2ob2o 6b80obobo41b2o15b2o26b2o11bo2bo65b2o7b2o138bo54b4o$330bo10bo2bo3bo14bo 3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo17bo4bo3b2o2bo13bobo6b2o 86b2obobo39b2o3bo11b2o3bo21b2o12bo70bo5bo139bobo56bo$329bobo9b3o3b16o 3b14o3b14o3b14o3b14o3b14o3b14o3b23obo3b2o2bo24bo2bo2b81o3bo46bo16bo19b 3o12bo2bo65bo2bo3bo2bo139bo$49b2o271bo5b2o5bo4bo5bo18bo16bo16bo16bo16b o16bo16bo31b2o9bob2obobo7bobo2bo80bo47b2ob2o12b2ob2o18bobo12b4o66bo2bo bo2bo139bo48b3o3bobo4b3o$49b2o270bobo6bo4bo3b160o10bob2ob3o13b79o51bob 2o13bob2o19b2o12b2o71bobo142b2o47b2ob2o2b2o6bo$305b3o7bo5bobo4b2o4bo3b o161bo7b2ob2o95bo3bo36bobo8bobo14bobo19b2o12b2o70bobobobo139bobo52b2o 7bo$305b2o2bob2ob2o5bo6b3o2b2obob164o7bob2ob3o13b76o4b2o32b2o2bo2bo8bo bo14bobo22bo9b3o69b2obobob2o191b2o2bo3b2o$307b3o4bo10bo5bo148bo22bo6bo b2obobo12bo75b2o35b3obo3bo47bo12bobo68bo3bobo3bo139bo55bo2bo$305bo2bob o3bo3bob2o2bo3bo8b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b2o3b3ob3o2b2o 3b2o3b3o2b2o26bo2b68o3b2o2bo36b2o2bo13b2o15b2o21bo10b2o217b2o55bo2bo4b 2o$304bo4bo4bo2bo3bob2o3bobob2ob2o4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bobob2obobo4bobob2obob2o4bo 13bobo12b3o68bo2b2o2bo43bo2bobo5bo4b3obobo5bo4b3obobo7b3o11b2o69b2ob2o b2ob2o137b2o57bobo3bobo$304bo4bo4bo2bo3bob2o3bobob2ob2o4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bobob 2obobo4bobob2obob2o4bo13b2o13bo2b67o51b5o3bo4bo3b5o3bo4bo3b5o3bo5b2o 15bo215b2o58b2o5bo$57b2o246bo2bobo3bo3bob2o2bo3bo8b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b2o3b3ob3o2b2o3b2o3b3o2b2o11b2o13b2o2bo66bo51bo6bo 2bo13bo2bo13bo18bo71bo3bo3bo139bo58b3obo$57b2o248b3o4bo10bo5bo148bo22b o12bo14bobo3b57obobo51bo2b6obo3b12obo3b12obo3bo17bo68bo3bo3bo139bo60b 3o26bo$305b2o2bob2ob2o5bo6b3o2b2obob164o30bo2b2o57b2obobo44bobobobo47b 2obo9b3o217bo61bo2bo2b2o21b2o$305b3o7bo5bobo4b2o4bo3bo161bo34bob58o3bo 41b2o2bob4ob47obobo9b2o73b3obo139bobo59b2obo4b2o19bobo$321bobo6bo4bo3b 160o34b3obo3bo12bo16bo22bo44b2ob2obo53bob3o2bo78b2o2b3o140bo60b2o4bo4b 2o$322bo5b2o5bo4bo5bo18bo16bo16bo16bo16bo16bo16bo31b2o33b2o3b2ob10o3b 14o3b20o48bo5b53o3b3obo3bo73bo2bo3b2o138bo65bo5bobo13b2o$329bobo9b3o3b 16o3b14o3b14o3b14o3b14o3b14o3b14o3b23obo3b2o2bo38b2obo9bo3bo12bo3bo17b o3bo43b2o59bo10b2obo13bo2b2o51bob2obo2bo138b2o60b5o7bo13b2o$330bo10bo 2bo3bo14bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo17bo4bo3b2o2bo 35b4o4b6o4bo2bo3b6o4bo2bo3b11o4b2o45bo5b65obobo13bo2b3o49b2obo3bobo 137bobo51b2o9b2o3b2o7b3o$342bo6b3o3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4b o2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b14o3bo44bobo5bo5b3o2bobo3bo5b3o2bo bo3bo10b2o48b2ob2obo66bob3o2bo8bo4bo52bobobob2o190b3ob2obo2bo4bob2o8bo 9b2obo$342bobo4bo2bo2bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3b o5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5bo4b3o48bobo6b4o13b4o13b4o3b2o2b o49b2o2bob66o3b3obo3b5o55b2obo137bo7bo49bob2o3bo4b2ob3o10bo11b4o$343bo 6bo5b4o13b4o13b4o13b4o13b4o13b4o13b4o13b4o3b3obo50b4o5bo8b2o6bo8b2o6bo 5b2o2bo53bobo66bo10bob2o58bo2bo3bo130b2o5b2o54bo2b2obobo2bo5bo2b2o11b 2o3bo$350bobo4bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo5b2o 55bobo4b2o7b2o6b2o7b2o6b2o65b77o61b2ob2obobo129bobo4b2o48b3o4bo2b2o6b 2o3b2o2bo9bo2bo$351bo5b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o 6b2o7b2o6b2o61bobo5bo9bo6bo9bo6bo203b2obo3bo17bo71bo47b2o37b2ob2ob2ob 2ob3o3bobo4bo12bo5bo$358bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo 60bo9bo16bo16bo64b77o61b2o22b3o69b3o36bo2bobo3bobo24b2ob2ob2ob5o3b2o2b o3b3o3bo6bo8b2o2bobo3b2obo3b2o$359bo16bo16bo16bo16bo16bo16bo16bo59b2o 104bobo66bo10bob2o56b2o4bo16b2ob3o20b3o9b3o9b3o20b3ob2o33bob3obo3bo13b 2ob2ob2ob5o3b2o2bo2b2o3bo3bo4bo5bob4ob2o12b2ob2obobo3b2o$538bobo99b2o 2bob66o3b3obo3b5o56bo5bo17bo2bob2o4bo4bo7bo3bo7bo3bo7bo3bo7bo4bo4b2obo 2bo34bo2bo3bo2bo2b2o2b2ob5o3b2o2bo2b2o3bo3bo15bobo4b2o6bo10bo8bo5bo$ 539bo99b2ob2obo66bob3o2bo8bo4bo55bo15b2obo4bobob2ob2ob3o5b2o3b2o5b2o3b 2o5b2o3b2o5b3ob2ob2obobo4bob2o33bo2bo4bo3bobo2bo2b2o3bo3bo28bobo13bo 17bo6bo$640bo5b65obobo13bo2b3o53b2ob2o13b2obobo2bobo7b4o3b2obobob2o3b 2obobob2o3b2obobob2o3b4o7bobo2bobob2o36bo2bo2bo3bo2bo48bo5b3o11bo2bo8b 2o$639b2o59bo10b2obo13bo2b2o53b4o15bo8b3obobob2o2b2ob2ob2ob2ob2ob2ob2o b2ob2ob2ob2ob2ob2ob2o2b2obobob3o8bo36b2o7bo56b4obo11bob2o$640bo5b53o3b 3obo3bo73b2o4bo13b2o7b2o12bobo3bobo3bobo3bobo3bobo3bobo3bobo12b2o7b2o 32b2ob2o3b2o62b2o15bo$549b3o87b2ob2obo53bob3o2bo77bo2b2o126b3o3b2obo7b o58bob2o15b2o$192bobo354bo2b3o85b2o2bob4ob47obobo9b2o77bo17b3o15b2ob2o b2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2o15b3o27b3o2bo4bo2b2o5bo3bo50bo3b3o 17bo$191bo2bo291b2o2b2o57b5o90bobobobo47b2obo9b3o71bo3b2o16bo3bo69bo3b o25b3ob2o6bo3bob2obo3b2o49b2o21bo$190b2o231bo2b2o57b2o65b2o95bo2b6obo 3b12obo3b12obo3bo17bo72bo17b2o4bo11b45o11bo4b2o24bo3b3o4bobobo2bo3bobo bo27b2o23b2o$189bo4bo227bo63bob2o55b2o105bo6bo2bo13bo2bo13bo18bo72b2o 2bo15bobob2ob2o3b3o2b2obo4bo8bo6bo6bo8bo4bob2o2b3o3b2ob2obobo23bobo7b 2o5b5o33b2o21bobo$188b4o2bo164b2obo59bo4bo54bo6bo55bobo102b5o3bo4bo3b 5o3bo4bo3b5o3bo5b2o15bo71b3o14b2obo4bob2ob3obo49bob3ob2obo4bob2o22b3o 4bo2b3obo2bo2bo33bo$187bo171b5o58bob2o56bo62bob2o3bo98bo2bobo5bo4b3obo bo5bo4b3obobo7b3o11b2o73bo3bo11bo4bo3bo4bobo4bo4bobob4obobob2obobob2ob obob4obobo4bo4bobo4bo3bo4bo29b2o2bobo6b2o28b2o27bo$187b3obo2b2o100bo 61bo3b2o55b2ob3o56bo6bo57bo6bobo88b2o2bo13b2o15b2o21bo10b2o72bo3bo23bo 5b2o47b2o5bo34b2o3b2o14bo30bo25b2o$149bo35bo6bobo100b5o59b2o57b6o58b2o bobo59b7obo87b3obo3bo47bo12bobo73bo3bo10b2o7b2o65b2o7b2o22b2o4bob2o67b 2o$146b4o35b8o2bo98bo5bo58b2o56bo4b2o58b2o5bobo152b2o2bo2bo8bobo14bobo 22bo9b3o74bobo116b4o5bo4bo39bo2bo23b2o$146b2o35bo10bobo34b3o61b2o57b4o 60b2ob3o60b8o57b5obo36b2ob2o52bobo8bobo14bobo19b2o12b2o75b2o53b3o60bob o3bo4b5ob3o37b2o5b2o16bo$144bo38b11o2bo34bo2b3o59bo2bo54bo3bo60b2o6bo 103bo16bo4bobo10bo13bo2bo7bo2b2o64bob2o13bob2o19b2o12b2o118b2o9bobo9b 2o20b3o7bob2o13b2o3b2obo6b2obo2bo39bo5b2o15bo$144b4o33bo14bob2o31b5o 55b2o61b2o2b2o61b7o58b6o39bo15bob2obo12b5o10bo3bob3obo4b2o62b2ob2o12b 2ob2o18bobo12b4o97bo10bo7b2o9bobo9b2o22bo6bo3bo13b2o14b2ob2o38bobo4bo 16bo$143bo37b14obobo35b2o54b2ob2o61bo3bo2bo120b2o3bobo10bo14b2o8b4obo 14bobo14b2o4bo8bo9b2o4bobo64bo16bo19b3o12bo2bo98b2o8bobo41b2o7bo7bo4bo 23b3o2bo3b3o38bo2b2o17bobo$142b3o2bo31bo16bobo28b2o62bob2o62b7o59b5o 38b3o15b2obo13bobo12b4o3b2o2b3o17b2o16bo4bo8b3o5b2o3b6o58b2o3bo11b2o3b o21b2o12bo95b2o3b2o9b2o43bob2o4bobo7b2o15bo2bo5bo3b5o45b2o19bo$143b3o 33b18obo28bobo62bo3bo2bo121b2o4bo11bo20bo3bo18bo4bo11bo3b3o11b3ob2o2bo 2bobobo18b2o3b2o3bo3b2o9b2o2b2o4bo13bo54b2o15b2o26b2o11bo2bo91b2o62b2o 2bob3o4bobo17bobo10bo5bo40bo22bo$144bo32bo18bobob2o25bob2o3bo58b7o59b 5o37bob2o15b2obo13b2o3bo9b4o4bo2b2o2bo16bo10b2o4bob3o9b3o2b2obobo2b3ob 2o2bo15b3obo5bo3bo6b2o2b2o2b2ob3ob15o98b4o9b2o89bo5bo61b2o2b2o3bo24bo 11b3o2bo40bobo21b2o$145b3obo27b19o2bo29bo6bobo120bo4bo11b2ob2o17b2obo 2b2o14bo4bo12b2o2bo10bo3bo2bo5bo3bobo12bo4bo3b6o3b2o10bo2bo3bo15bo5bob o4bo2bob2o2b2o4bo6b3o28bo2bo49b3o14b3o25bo2bo11bo86bobo22bo37b2o9b2ob 4ob2o10b2o6bo10b4o44bobo3bo17bobo$145bo2b2o25bo20bobob2o27b7obo57b5o 38b2ob2o13b2o2bo13bo14b2o5b4o3bo16b4o13b4obo8b2o4bob4ob2ob3obo16b2o2bo 5bo10bo3b2o2bo2b2ob15o4b2ob2obobo5bo2b7o4b2ob2ob31o48bob2o13bob2o25bo 12b3o87b2o2b2o5b3o6b2o2bobo36b2o10b7o11bobob3obo12bo44bobo4b2o$146b3o 26b21o2bobo93bo4bo11b2obo18bo3b3o16bo3bo12b2ob2o10b2ob2o3bo4bobo2bo14b 4o5b4o16bo2bo3bobo13bo6b2o3bo3bo2bobobo4bo7b2o2bo4bo20bo7bo6bo12bobo3b o34bo2bo44bo16bo27bo2bo9b3o90bobo7bo7b2ob2o36bo32bo2bo2bo5b7o44bobo4bo bo18bo$148bo24bo24bob2o29b5obo36b2ob2o14bob2o13bo2b3o9b2o6b2ob2o18b4o 14bo3bo9bo2b2o3b4ob4obobo15b2o3b2o2b2o10bo3bo2bo3b2ob15o3bob3o3bobo4bo 2bob5o4b2o4b43ob14obob39o3bo39bobo14bobo26b2o8b2o29b3o27b3o34bo6bo7bo 32b3o4bo31b2o4bo2b3o53bobo25b2o$146bo26b24obobo20bo8bo4bobo10bo13bo2bo 7bo2b2o14b2ob2o13bo2b2obo8bobo4bo3b2obo3bo23b2o8bo9bo2bo2bobo13bo2bo3b 2o3b2o4b2obobo2bo8bobo2bo4bo23bo4bo6bobo12bobobo106bo2bo35b7o10b7o24bo 7bobo27bo2b5o19b5o2bo42b3o35b2o4b3o31bobobobobo3bob2o3bo44bobo4b2o19b 2o$146bobo22bo26bobo19b5o4bob2obo12b5o10bo3bob3obo4b2o14b2o15b2o13bob 2o4b3o3b3obo16b2o3b2o2b2o3bo11b3o3b2ob15o2bo3b2o3b4o5bo2b6o3bo4bob57ob 110o2bo34bo5b2o9bo5b2o22b3o7bobo26bo3bobob2o17b2obobo3bo41bo38bobob3o 16bo14b2o5b2o10bo45b2o5b2o19b2o$145bo25b28obo18bo5bo3bobo14b2o4bo8bo9b 2o4bobo18bobo2bo7b3o9bo5bobo4bo8bob2o3b2obob2o2b3o2bo2bobobo6b3o2b2o 27bo11bobo12bobo177bob2o29b4obo11b4obo24b3o8bob2o24bo6bo21bo6bo42bo36b o22bobo10bo2b2obo5bo4bo43bo35bo$146bobo20bo28bobob2o16b2o7b2o16bo4bo8b 3o5b2o3b6o17bo4bob2obo3b3o4bobo2b2o2b3ob18o3b2obob2ob2o2bobobobob3o2bo 3b2o3b42ob13ob182o29bo2bob3o9bo2bob3o19b2o12bob3o25bo6bobo13bobo6bo86b obo16bo10b2o2bo12bo43b3o2b2o6bo3b2o6bo11bo$146bo22b29o2bo20bo2bo9b2o3b 2o3bo3b2o9b2o2b2o4bo13bo4b2ob2o2bob3o2b2obo5b2o4bo4bo39bo3bo10bobo3bo 244bo69bobo12b2obo22bobo6b2ob2o11b2ob2o6bobo83bob2o26b3o4bo2b2ob2o2b2o 47bo2b2o2bobobo2bo5b2o9bo$148bo18bo30bobob2o12b2o16b3obo5bo3bo6b2o2b2o 2b2ob3ob15o3b2ob3obo4bobo2bob6o3b2o3bob40ob14ob251o25b2o15b2o24bobo37b 2obob2o3b2obobo9bobob2o3b2obob2o36bo47bo27bo6bo5bobo45bo3bo4bo2b2o3bob 2o3bobo8bobo$146b3o18b31o2bobo12b2ob2o5bobo4bo2bob2o2b2o4bo6b3o28bo12b obobo10bobobo312bo2bo20b3o14b3o25bob2o34bobobob2o6bob2o7b2obo6b2obobob o34b3o45bob2o28bo3bo6bo2b2o41b2obo3bo15bo14bo$145bo2b2o15bo34bob2o12bo b2o4b2ob2obobo5bo2b7o4b2ob2ob44ob11ob2ob316o22bo16bo25bob3o32b2o3bo2bo 3b2obo3bo5bo3bob2o3bo2bo3b2o32b2ob2o44bo32bo2bobo4b2ob2o39b3o7bo2bo12b o12bo$145b3obo15b34obobo14bo3bo7bo6bo12bobo3bo379bo2bo16bo16bo27b2obo 31bo3bobo2b2o4b2o13b2o4b2o2bobo3bo81b2o38bo2bo2bo40b2o9b2o9bo2bo12b2o$ 144bo18bo36bobo15b19ob14obob384o99bo11bobob2o5b2obobo11bo33bobobobo2bo 75b4ob2obo3bo33b2o2bo2bo9bo26bobo$143b3o17b38obo452bobob4o9bobob4o45bo 9b2o14b2o11b2o14b2o9bo19b2o3bo3b3o72bobo4bo3bo36b2o2bo2bo$142b3o2bo13b o38bobob2o12b19ob14obob384o15b2o7bo7b2o7bo43b3o22b4o2bo5bo2b4o22b3o18b 2o3bo6bo77b2o40b2o4b2o8bo2bo26bo$143bo17b39o2bo14bo3bo7bo6bo12bobo3bo 379bo2bo15bo2b2o12bo2b2o46b2ob3o25bobo5bobo25b3ob2o26bobo78b2o45b2o11b 2o24b2o$144b4o11bo40bobob2o10bob2o4b2ob2obobo5bo2b7o4b2ob2ob44ob11ob2o b316o21b2obo3bo9b2obo3bo43bo2bob2o4bo4bo9b2o2bo9bo2b2o9bo4bo4b2obo2bo 25bobo36b3o4b3o33bobo34b2o4bo3bobo8b2obo24b2o$144bo14b41o2bobo10b2ob2o 5bobo4bo2bob2o2b2o4bo6b3o28bo12bobobo10bobobo312bo2bo28bo16bo40b2obo4b obob2ob2ob3o8b2o15b2o8b3ob2ob2obobo4bob2o23bo2bo76b3o34b3o2b2obob2obo 6b3o27b2o$146b2o9bo44bob2o10b2o16b3obo5bo3bo6b2o2b2o2b2ob3ob15o3b2ob3o bo4bobo2bob6o3b2o3bob40ob14ob251o29bobo14bobo41b2obobo2bobo7b4o7bobo2b o7bo2bobo7b4o7bobo2bobob2o26bo34bobo4bobo34bo34bo3b3ob2obo2b8o29bo$ 146b4obo5b44obobo16bo2bo9b2o3b2o3bo3b2o9b2o2b2o4bo13bo4b2ob2o2bob3o2b 2obo5b2o4bo4bo39bo3bo10bobo3bo244bo30bo2bo13bo2bo40bo8b3obobob2o2b2o5b 2obob2o7b2obob2o5b2o2b2obobob3o8bo61bobo4bobo68bo6b2o8b2o3bo29bo$149b 2obo2bo46bobo15b2o7b2o16bo4bo8b3o5b2o3b6o17bo4bob2obo3b3o4bobo2b2o2b3o b18o3b2obob2ob2o2bobobobob3o2bo3b2o3b42ob13ob182o29b4o2bo10b4o2bo41b2o 7b2o11bo8b2ob2o7b2ob2o8bo11b2o7b2o18bo120bo5bo6b3o34bo$151b2o2b48obo 14bo5bo3bobo14b2o4bo8bo9b2o4bobo18bobo2bo7b3o9bo5bobo4bo8bob2o3b2obob 2o2b3o2bo2bobobo6b3o2b2o27bo11bobo12bobo177bob2o29bo2b3o11bo2b3o64b2o 5b2ob2ob2o5b2ob2ob2o5b2o39bobo41bo2b2o2bo69b2o3bob2o6bo3b2o29bobo$152b 2o48bobob2o12b5o4bob2obo12b5o10bo3bob3obo4b2o14b2o15b2o13bob2o4b3o3b3o bo16b2o3b2o2b2o3bo11b3o3b2ob15o2bo3b2o3b4o5bo2b6o3bo4bob57ob110o2bo39b 2o15b2o60b2obob2o27b2obob2o35bo3bo39b2obo2bob2o69bob2o2bo6bo37bo$153b 49o2bo16bo8bo4bobo10bo13bo2bo7bo2b2o14b2ob2o13bo2b2obo8bobo4bo3b2obo3b o23b2o8bo9bo2bo2bobo13bo2bo3b2o3b2o4b2obobo2bo8bobo2bo4bo23bo4bo6bobo 12bobobo106bo2bo34b3ob3o10b3ob3o59b2o2bobo5b3ob3o5b3ob3o5bobo2b2o35b3o 40bo8bo62b2o2b2o7bo6b2o35bo$202bobob2o23b5obo36b2ob2o14bob2o13bo2b3o9b 2o6b2ob2o18b4o14bo3bo9bo2b2o3b4ob4obobo15b2o3b2o2b2o10bo3bo2bo3b2ob15o 3bob3o3bobo4bo2bob5o4b2o4b43ob14obob39o3bo43bo16bo60bo2bo2bob2o23b2obo 2bo2bo80bo4bo63bo2bo8b3o3bobo2bob3o29bo$153b49o2bobo87bo4bo11b2obo18bo 3b3o16bo3bo12b2ob2o10b2ob2o3bo4bobo2bo14b4o5b4o16bo2bo3bobo13bo6b2o3bo 3bo2bobobo4bo7b2o2bo4bo20bo7bo6bo12bobo3bo34bo2bo42bo2b3o11bo2b3o59b2o 5bob2o4b3o9b3o4b2obo5b2o32b2o3b2o39b2o4b2o62bob2o2bo5b2ob8o2b3o28bob2o 4b2o$152b2o50bob2o21b7obo57b5o38b2ob2o13b2o2bo13bo14b2o5b4o3bo16b4o13b 4obo8b2o4bob4ob2ob3obo16b2o2bo5bo10bo3b2o2bo2b2ob15o4b2ob2obobo5bo2b7o 4b2ob2ob31o47b4ob2o10b4ob2o52b3o11bobo5bo11bo5bobo11b3o24bo3bobo3bo 109bo2b2obo3bob2o5b2o34b3o5b2o$151b2o2b48obobo21bo6bobo120bo4bo11b2ob 2o17b2obo2b2o14bo4bo12b2o2bo10bo3bo2bo5bo3bobo12bo4bo3b6o3b2o10bo2bo3b o15bo5bobo4bo2bob2o2b2o4bo6b3o28bo2bo52b2o15b2o51bo3bo9b2ob2o4bo11bo4b 2ob2o9bo3bo22b2o3bobo3b2o35bobo4bobo63bo2bobo5b3o2bo2bo36b3o3bo$149b2o bo2bo48bobo20bob2o3bo58b7o59b5o37bob2o15b2obo13b2o3bo9b4o4bo2b2o2bo16b o10b2o4bob3o9b3o2b2obobo2b3ob2o2bo15b3obo5bo3bo6b2o2b2o2b2ob3ob15o58bo 16bo49b2o4bo47bo4b2o20bo5bobo5bo33bo2bo4bo2bo77bo43b2o$146b4obo5b48obo 20bobo62bo3bo2bo121b2o4bo11bo20bo3bo18bo4bo11bo3b3o11b3ob2o2bo2bobobo 18b2o3b2o3bo3b2o9b2o2b2o4bo13bo58bo16bo49bobob2ob2o3b5ob3o2b2o13b2o2b 3ob5o3b2ob2obobo20bob2obobob2obo33b2o10b2o54b4ob3o2b2obo8bo4b2o36b3o$ 146b2o9bo46bobob2o17b2o62bob2o62b7o59b5o38b3o15b2obo13bobo12b4o3b2o2b 3o17b2o16bo4bo8b3o5b2o3b6o63bobo14bobo45b2obo4bob2ob3o8b2o13b2o8b3ob2o bo4bob2o65b2o3bo2bo3b2o60bobo3b2o13b2o$144bo14b45o2bo27b2o54b2ob2o61bo 3bo2bo120b2o3bobo10bo14b2o8b4obo14bobo14b2o4bo8bo9b2o4bobo63bobo14bobo 44bo4bo3bo4bo3b4o3bo15bo3b4o3bo4bo3bo4bo66bo3b2o3bo56b2o4bo2b2o3b2o2bo 3b3ob2o40bo$144b4o11bo44bobob2o21b5o55b2o61b2o2b2o61b7o58b6o39bo15bob 2obo12b5o10bo3bob3obo4b2o62b2obo13b2obo57bo6bo3b3o7bo7b3o3bo6bo29bo12b o34b2o8b2o56bo3bo3b4obo2bo5bobo41b3ob2o$143bo17b43o2bobo22bo2b3o59bo2b o54bo3bo60b2o6bo103bo16bo4bobo10bo13bo2bo7bo2b2o64bob2o13bob2o44b2o7b 2o8bo12b3o12bo8b2o7b2o17bo12bo32bo2bobob2obobo2bo55bobo7bo2bo2b2obo50b 2o$142b3o2bo13bo44bob2o21b3o61b2o57b4o60b2ob3o60b8o57b5obo36b2ob2o153b 3o3b5o3b3o41bobo10bobo31bo2b2o6b2o2bo55bob2o6b2obob2o2bo44bob2obo$143b 3o17b42obobo85bo5bo58b2o56bo4b2o58b2o5bobo169b3o14b3o51bo7bo7bo3b2ob2o 3b2ob2o3bo7bo7bo24bo12bo33bo12bo58bo7b2o52bo$144bo18bo42bobo86b5o59b2o 57b6o58b2obobo59b7obo106b2o15b2o50b3o5b3o5b2o4bobo2bo2bobo4b2o5b3o5b3o 23bo12bo35b2o6b2o59bo10bo4b2o47bo$145b3obo15b42obo87bo61bo3b2o55b2ob3o 56bo6bo57bo6bobo106bo16bo25b2o15bo7b5o3b5o3b5o2bobobobobobo2b5o3b5o3b 5o7bo15bo3b4o3bo37bo6bo72bob3obo39bobo5bo$145bo2b2o15bo40bobob2o147b5o 58bob2o56bo62bob2o3bo108bobo14bobo25bo14b3ob3ob2o3b2ob2o3b2ob2o3b2obob obobobobob2o3b2ob2o3b2ob2o3b2ob3ob3o18b4o40b2o2b2o2b2o69b3o5bo10bo16b 2o6bo3bobo5b2obo$146b3o18b39o2bo150b2obo59bo4bo54bo6bo55bobo113bobo14b obo24bo3bo10b2o3b3o3b2o2bobo2bo2bobo2b2obobobo5bobobob2o2bobo2bo2bobo 2b2o3b3o3b2o13b4o4b4o40b2o70bobo2bo3b2o8bo3b2o2bobo12b2o2bobob2o2bo7bo b3o$148bo18bo38bobob2o210bo63bob2o55b2o115bo16bo18b2o4bob4o9b2o5bo6bo 3bobobobobobobobobob2o3b2obobobobobobobobobo3bo6bo5b2o64b2o69b3o11b2o 3b2o2bo3bo3bo6bo3bo3b2o3bo2b2o5bo2b2o2bo$146bo22b37o2bobo212bo2b2o57b 2o65b2o145bo4bobo11b2o4b2o3b2o2bobobobobobobobobobobobo2bo2bobobobobob obobobobobobo2b2o3b2o4b2o13bo6bo112bo6bo7b2o3b2o9bo2b2o3bo3bobo6bobo 15bo$146bobo20bo38bob2o274b2o2b2o57b5o145bob2obo3b2o9bo21bobobobo3bobo bobobobobobo3bobobobo21bo15b2o2b2o44bo70b2o3bo8bo4bo4bo3b2o3bo4bo13b3o 13bo$145bo25b36obobo338bo2b3o145bobo2bo3bo8b2o23bobo4b2obobobobobobob 2o4bobo23b2o59b2o3bo72b2obo8bo4b2o3bo5bo2b3o2bo3b3obob2o2bo2bo11b2o6bo $146bobo22bo36bobo338b3o146bobo3bo2bo8b2obobo20b2ob2o4bobobobobobobobo 4b2ob2o20bobob2o57bo2b2ob2o71bobo9bobo2bo2bo3bo7bo2bobo2bo3bobo25b2o$ 146bo26b36obo487b2obo2bob3o8bobob2o7b3o10bobo5bobobo5bobobo5bobo10b3o 7b2obobo10bo11bo37b2ob2o82bob5o3b2obo13b2o7bob4o13b4o2bobo$148bo24bo 34bobob2o487bob3o3bo4b2obobo3bo5bo2bo5b5obob4obobobo2bo2bobobob4obob5o 5bo2bo5bo3bobob2o7bo11bo44bo65bo14b2o2b2o3bobo10bo3bo5bob2o2bo15b5o$ 146b3o26b33o2bo487b2obobob2o2bo4b2o3bo12bo4b2obobo3bobo2bobobo5bobobo 2bobo3bobob2o4bo12bo3b2o6bobo9bobo40bobobo65bo35bo2bo6bo2bo19bo3bo$ 145bo2b2o25bo32bobob2o467bo16b2obobo3bob2o3b3obo3b2o4bo3bo3b2obo6b3o2b obobob3obobobo2b3o6bob2o3bo3bo4b2o3bob3o56bo3bo3bo64b3o35bobo33bo$145b 3obo27b31o2bobo467b4o6bobo8bo4b2o2bo2b2o13bo3bo2b2o4bo3bobobobobobobob obobobobobobo3bo4b2o2bo3bo13b2o4bo3bo7bo3bo34b2ob2o94bo21bo3bo$144bo 32bo32bob2o465bob4o4bo7bob2obobo3bo23bo3bobo4bo4b2obobobobobobobobob2o 4bo4bobo3bo23bob6ob6obo92bo26bobo9b2o26bo$143b3o33b30obobo465b2o7bobo 7b2obobo2b2ob2o19bobo6bo9b2obobobo5bobobob2o9bo6bobo19bo7bobo7bo33b3ob 2obo48bobo26b2o11b2o21bobobo$142b3o2bo31bo30bobo70b5o391b2o3b4o6bo7bob o2bo29bo13bobobo2bo2bobobo13bo27bo7bobo7bo32bo3bobo2bo33bo14b2o27bo32b 3ob2o$143bo37b30obo70bo4b2obo388bob2o5b5obo5b2ob2obo27b2o11bo2bobobo5b obobo2bo11b2o25bo17bo32bobo2bobob3o30bobo79b2o$144b4o33bo28bobob2o67bo 5bobo384bo5b3obob2o2bo7bo2bo3b2o25bo2bo11bobobobob3obobobobo11bo2bo25b ob2ob2o3b2ob2obo34b4o2bo4bo6b2o21bobo78bob2o$144bo38b27o2bo71bo4bo384b o5b2o4bobobo6b2o2bo5bo29bo9bobobobobobobobobobobobo9bo86bob2o8b2o18b3o b2o75bo3bo$146b2o35bo26bobob2o70bob3o382bo11b2o9bo2b2o3b2obo22b3o4bo 10b2obobobobobobobobob2o10bo4b3o72b4o2b2obo8bo19bo81b4o$146b4o35b25o2b obo73b3o382bo6bo15b2obo6bob2o20bo2bob5o8b2obobobo5bobobob2o8b5obo2bo 25bo7bo38bo2b3o3bo5b2o22b3ob2o77bo$149bo35bo26bob2o457b6o4b2o14bobob3o 2bo20bo3bobobo13bobobo2bo2bobobo13bobobo3bo18b2obobob2o3b2obobob2o33bo bob4o8bo23bob2o$187b24obobo71b2o173b2o217bo2b2o14bo6bobobo20bobo14bo2b obobo5bobobo2bo14bobo17b3obob3o9b3obob3o29b2o119bob3o$187bo24bobo69b2o 174b4o10bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo81bo20b2o3bobobobo19bo3bobo11bobobobo b3obobobobo11bobo3bo17bo3bobo5bobo5bobo3bo31bobobo8bo2bo100b2o3bo$189b 24obo69bo2bo171b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 84bo3bo22b2o2bo2bo18b2o3bo10bobobobobobobobobobobobo10bo3b2o21b2o6bobo 6b2o35bobob3o9b2o5b2o33b2o61bo$189bo22bobob2o66bo175b2o11bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo79bo3bo23b4obobo19b2o14b2obobobobobobobobob2o14b2o19b2o9bo bo9b2o33bo5bo10bo5b2o19b3o9bobo57b2o$191b21o2bo70b2o186b4o4b4o4b4o4b4o 4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o79bo4b2o5bo5bo5bo5bobo b2o20b2o14b2obobobo5bobobob2o14b2o19b2ob2o15b2ob2o34b5o9bobo4bo23bo11b o27bo29b2o2b2o$191bo20bobob2o72bo174bo210bo2b3ob2o4b2o4b2o4b2o5bo22bo 19bobobo2bo2bobobo19bo22bo15bo40bo12bo2b2o24bo21bo17b2o30bob3o$193b19o 2bobo70bo177b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo76bo 3b2ob2ob2ob2ob2ob2ob2ob2ob3obo39bo2bobobo5bobobo2bo112b2o45b2o17bobo 30bo$193bo20bob2o70b2o174bo5bo6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6b2o6b2o6b2o78bo28bob2o30b2o7bobobobob3obobobobo7b2o101bo 49bobo$195b18obobo247bo5bo6bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bob o5bobo5bobo5bobo5bobo5bobo5bobo5bobo78b28o28b2o3bobo5bobobobobobobobob obobobo5bobo3b2o25b2o13b2o52bobo99bo3bo$195bo18bobo66b6obo174bo10bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo127bo3b2ob2o2bo3bo8b2obobobo bobobobobob2o8bo3bo2b2ob2o3bo17bobo7bobo55bo104bo$197b18obo66bo6bo171b 2obobo3bo3b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o80b28o18b3o2bob2obo5b4o4b2obobobo5bobobob2o4b4o5bob2obo2b3o14bo3bo b2o3b2obo3bo108b2o43bobobo$197bo16bobob2o63bo6bo170bobobobobo2bo2bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo81bo28bo20b2o5b2o2bobo3bo6bo bobo2bo2bobobo6bo3bobo2b2o5b2o18b5o7b5o109b2o5b2o34b3ob2o$199b15o2bo 67bo161b5o9b2obobobobo5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o5b3o78bo3b26o20bo2b5o3bobo3b2o3bo2bobobo5bobobo2bo3b2o3bob o3b5o2bo150b2o38b2o$199bo14bobob2o67b2o157bo4bo7bobobobobobobo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo76bo3bo45b2obo4bob2o4bo6bobobo bob3obobobobo6bo4b2obo4bob2o189bob2o$201b13o2bobo67bo96b2o61bo11b2obob obobobobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2b obo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo76b o3b26o22bob3ob2o2b3obo5b2obobobobobobobobob2o5bob3o2b2ob3obo19bobo11bo bo153bo3bo$201bo14bob2o64bo2b4o91b3o2bo59bo9bobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobob2o74bo28bo17b5o4bo2bo 5b2o3bobobobobobobobobobobobo3b2o5bo2bo4b5o15bo3bobo3bobo3bo85b2o27b2o 37b4o$203b12obobo64bo4b3o84b4ob2o67b2o3b2obo3bobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobob2o75b28o15bobo3bo3bo3bo 2b3obob4obobobobo5bobobobob4obob3o2bo3bo3bo3bobo12bo3b3o3b3o3bo85b2o 27b2o11b2o26bo$203bo12bobo64bo2b2obo84b4o3bo3bobo63bo4bobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobob2o2b2o115b 2ob2o3bobobobo5bo2bo2bob2o2bobo2bo2bobo2b2obo2bo2bo5bobobobo3b2ob2o18b o3bo126b2o5b2o$205b12obo64b2o4b2o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo6b2o75bob2o2bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobob obobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo 3bo79b28o18bo3b2o2b2o2b5o3bobo6bobo5bobo6bobo3b5o2b2o2b2o3bo18bobo5bob o123b2o32bob3o$205bo10bobob2o63b5ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o2b2o3b3o72bo4bo3bob2o3bo b2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob 2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o78bo28bo17bobo2bo4b2o2bo2b3o2b8o bob3obob8o2b3o2bo2b2o4bo2bobo20bo5bo84b2o71b2o3bo$207b9o2bo68bo2b3o2b 4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4obo6bo73bo4bo3bob2o3b ob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bo b2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o77bo3b26o17b2ob2o2b3o2bo5bo2b2o 9bobobobo9b2o2bo5bo2b3o2b2ob2o20b2ob2o85b2o46b2o27bo$207bo8bobob2o230b ob2o2bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3b obobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo77bo3bo 51b2o9bo2b2o2b4obobobobob4o2b2o2bo9b2o30bobo90b2o42bobo22b2o$209b7o2bo bo66bo2b3o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4obo6bo71b o4bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobob2o2b2o70bo3b26o38bo2bo2bo2bobo5bobo2bo2bo2bo39b2obobob2o87b2o 44bo22b2o2b2o$209bo8bob2o63b5ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2ob o2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o2b2o3b3o68b2o3b2obo3bobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob2o74bo 28bo38b2o8bob2o2bo8b2o39bo3bobo3bo132bob2o20bob3o$211b6obobo62b2o4b2o 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo6b2o70bo9bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobob2o75b28o48bob3o2b obo44b2o5bobo5b2o128b2ob2o21bo$211bo6bobo62bo2b2obo84b4o3bo3bobo58bo 11b2obobobobobobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2b obo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo 2bobo154bo4bobob3o41bobo5bobo5bobo$213b6obo62bo4b3o84b4ob2o64bo4bo7bob obobobobobo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo78b28o49b2o 4bo4bo41b2o2b2obobob2o2b2o78b2o73bo3bo$213bo4bobobobo59bo2b4o91b3o2bo 58b5o9b2obobobobo5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o79bo28bo50bobobob3o42bo3b2obobob2o3bo78b2o77bo$215b3o2bo3b o61bo96b2o76bobobobobo2bo2bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo80bo3b26o47b3obobobobo44b2o5bobo5b2o153bobobo$215bo2bo5b2o61b2o173b 2obobo3bo3b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o78bo3bo68b2obo2bobobobo46bo15bo151b3ob2o$217bo4b2ob3o2bo53bo180bo 10bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo79bo3b26o43bob2o9bo 46bo4bo3bo4bo156b2o$216bo3bobo3b3obo52bo6bo173bo5bo6bobo5bobo5bobo5bob o5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo77bo28bo 46b4o3b2obo50bo3bo160bob2o$216b3o6bobo55bo6bo173bo5bo6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o79b28o47bo2bob2o2bo51b 2ob2o158bo3bo$214b2obo6b2obo55b6obo174b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo154bo3b2obo215b4o$213bobob2o4b2ob2ob2obobo230bo 212b28o45b3o7bobob2o45b2o5b2o158bo$213bo2b3o5bo4bo58b2o183b4o4b4o4b4o 4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o80bo28bob2o41bo2b 4obobob2obo45b2o5b2o$213b2ob2o7b4o3bo2bo51bo172b2o11bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo78bo3b2ob2ob2ob2ob2ob2ob2ob2ob3obo39b2obobo5bobo48bo11bo155bo b3o$215b2o10bo4b2obo54bo168b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo82bo2b3ob2o4b2o4b2o4b2o5bo39b2obob4ob2obo48bobo7bobo153b2o 3bo$285b2o173b4o10bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2b o4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo78bo4b2o5bo5bo5bo5bobob2o 39bo5bo2bob2ob2o43bobo7bobo157bo$233b2o49bo176b2o214bo3bo23b4obobo38b 6o3bo2bobo210b2o$231bo4bo47bo2bo390bo3bo22b2o2bo2bo43bob3o2bo2bo42bobo b2o3b2obobo152b2o2b2o$230bo53b2o393bo20b2o3bobobobo41b3obo3b2o2b2o43b 3ob2ob2ob3o127b2o25bob3o$230bo5bo49b2o392bo2b2o14bo6bobobo41bo3b2ob2o 50bob3ob3obo24b2ob2o99b2o26bo$230b6o437b6o4b2o14bobob3o2bo43b2o4bobo 49b2o9b2o22bobobobo75bo$288b3o382bo6bo15b2obo6bob2o50bob2o47b5ob5o23bo bobobo75b3o47bo3bo$286bob3o382bo11b2o9bo2b2o3b2obo49bo2bo2bo44bob3o2bo bo2b3obo18b2obo2bob2o74bobo51bo$284bo4bo384bo5b2o4bobobo6b2o2bo5bo48b 3obobo45b3o3b2ob2o3b3o17bobo4bo38b2o5b2o32bo15b2o30bobobo$283bo5bobo 384bo5b3obob2o2bo7bo2bo3b2o42b2o3b2o2b2o48bo2b2o3b2o2bo18bo3bobobob2o 36bo5b2o48b2o28b3ob2o$283bo4b2obo388bob2o5b5obo5b2ob2obo40bo2bo2bo2bob o51b2o7b2o19b3obobobo2bo36bobo57b2o28b2o$283b5o391b2o3b4o6bo7bobo2bo 39bobobob2obo2bo84bo2bo2b2o38b2o57b2o27bob2o$678b2o7bobo7b2obobo2b2ob 2o38bo2bo2bob3ob2o50b2obobob2o20b2o51b2o12b2o66bo3bo$679bob4o4bo7bob2o bobo3bo42b2o7bo50bo3bobo3bo18bo2b3o3b3o41bobo12b2o66b4o$680b4o6bobo8bo 4b2o2bo44b2o3bo51b2obobob2o19bobo9bobo39bo19b2o27b2o33bo$681bo16b2obob o3bob2o45bobob2o48bobob2ob2obobo18bobob2ob2obob2o35bo23b2o27b2o$698b2o bobob2o2bo47bobo49bo3bo5bo3bo19bob2ob2obo123bobobo$701bob3o3bo47bobo 50b2o9b2o20bobo3bobo36b3obo63bo19bobo2bo$698b2obo2bob3o46b3ob2o51bo7bo 23bo5bo36bob2o14b2o5b2o40b2o2bobo4b2o2bobo4b2o3bo$698bobo3bo2bo42b2o3b o2bo2bo48bo11bo64b2obo14b2o5b2o5b2o9b2o26b6o2bo2b3o4bo2bobo$700bobo2bo 3bo40bo2b4obob2o46b2o13b2o17b11o32bob3o29b2o9b2o3bo26b5o2bo6bo$699bob 2obo3b2o41b3o3bo2bo47bo2bo9bo2bo17bo2bobobo2bo51bob3o25bobo23bob2ob2o 3b3o2b3o$699bo4bobo47b3o3bo46bo17bo61bo16b2o3bo25bobo26b2o2b2o5bobo$ 698b2o4bob4o41b2obo2b3o48bo4b2o3b2o4bo14b2o6bo6b2o51b2o28bo30b2o7b2o$ 705bo3bo41b2obo55b2ob2o3b2ob2o16bobo3b5o3bobo47bob2o30b2o29b2o6bo$706b o48b3o56b2ob2o18bobob3o7b3obobo45b2obo$705b2o50bo78bobobobo9bobobobo$ 813b3ob3o16bobobobob2o3b2obobobobo$837bo3bob2obobob2obo3bo$845b2ob2o$ 825b2o8bo10bobo10bo8b2o$824b2o3bo4b2o7b4ob4o7b2o4bo3b2o$823b2o2b2o4bo 3b3o3bo7bo3b3o3bo4b2o2b2o$824bo4b5obo4bo3b3ob3o3bo4bob5o4bo$828bo4bobo 23bobo4bo$825b2o3b2ob2obo7b3ob3o7bob2ob2o3b2o$828b2o4bo25bo4b2o$818b5o 3b2o5bo6b2o2b2o3b2o2b2o6bo5b2o3b5o$818bo4b2obo2bo10b2o2b3ob3o2b2o10bo 2bob2o4bo$818bo6bo18bobobobo18bo6bo$819bo5b2obo17bobo17bob2o5bo$821b2o 2bo3b2o11b4obob4o11b2o3bo2b2o$824bo17b2o3bo3b2o17bo$822b3o20b2ob2o20b 3o$821bo8bo5bo5b3obobob3o5bo5bo8bo$821bo4bobo2b2o4b2o7bobo7b2o4b2o2bob o4bo$821bo3b2o2bob2ob2ob2ob5obobob5ob2ob2ob2obo2b2o3bo$822bo21bobobobo 21bo$823b21o3bo3b21o2$825b21o3b21o$824bo21bobo21bo$823bo3b20ob20o3bo$ 820bobo2bo2bo37bo2bo2bobo$819bo2bobo4b37o4bobo2bo$818b2o10bo33bo10b2o$ 817bo13b33o13bo$816b4o12bo29bo12b4o$815bo4bo12b29o12bo4bo$815bo2bo15bo 25bo15bo2bo$815bo2bo16b25o16bo2bo$816bo19bo21bo19bo$817b4obo14b21o14bo b4o$818bo3bo15bo17bo15bo3bo$819bo19b17o19bo$819bobo18bo13bo18bobo$841b 13o$818b3o21bo9bo21b3o$818b2o23b9o23b2o$818b3o26bo26b3o$844b3ob3o$819b obo23bo3bo23bobo$819bo24bobobobo24bo$818bo3bo21bobobobo21bo3bo$817b4ob o20bo7bo20bob4o$816bo26bo7bo26bo$815bo2bo24bo2bobo2bo24bo2bo$815bo2bo 24b3o3b3o24bo2bo$815bo4bo53bo4bo$816b4o55b4o$817bo59bo$818b2o55b2o$ 819bo2bo49bo2bo$820bobo49bobo! golly-3.3-src/Patterns/Life/Miscellaneous/fermat-primes.rle0000644000175000017500000006516412026730263020771 00000000000000#C This is a Fermat prime calculator, rigged to self-destruct and stop #C growing if any Fermat primes over 65537 turn up. Since the #C existence of such primes is an unsolved problem in mathematics, #C it is unknown if this pattern grows to infinite population. #C #C The tubs in a row represent the known Fermat primes, starting #C with 5. The other three represent 17, 257, and 65537. A tub gets #C destroyed whenever a Fermat prime is found. In the unlikely event #C that an additional Fermat prime exists, the pond will eventually be #C destroyed, followed by the puffers and breeders. #C #C A number N is tested at about generation 120N - 550, so the tubs #C will be destroyed at about generations: 50; 1,490; 30,290; and #C 7,863,890. #C #C The next-smallest Fermat number that is not known to be composite #C is 2^2^31+1. Therefore, the pond (and the breeders) will survive at #C least 10^640,000,000 generations. So don't expect to see anything #C interesting happen by watching this pattern. Remove the tubs if you #C want to see the destruction. #C #C The careful observer may notice that actually every number of the #C form 2^N+1 is tested for primality, while Fermat numbers are of the #C form 2^(2^N)+1. However, numbers of the form M^N+1 can never be #C prime unless N is a power of 2, so the only primes of the form #C 2^N+1 are in fact the Fermat primes. #C #C The "Primer" and "Caber Tosser" patterns used here are by Dean #C Hickerson. The beehive puffer is by Hartmut Holzwart. #C #C Jason Summers, 7 Jan 2000 x = 838, y = 736, rule = B3/S23 46b3o12b3o$46bobbo10bobbo$46bo16bo$46bo3bo8bo3bo$46bo6b4o6bo$47bobobo bboobbobobo$51bo6bo$51bo6bo$50boboobboobo$50bo3boo3bo$51bo6bo$51boo4b oo$54boo$49bo3bobbo3bo$53bobbo$50b4obb4o$52boobboo$53b4o$52bo4bo$$52bo boobo$51bo6bo$51bo6bo$53b4o$49boobobooboboo$48bobboobooboobbo$47boobb 8obboo$47bo3bobboobbo3bo$46boo5bobbo5boo$46boo3b3obb3o3boo$47bobboobo bboboobbo$48boobob4oboboo$53bobbo$48bo12bo82b3o15b3o$48bo4bobbo4bo81bo 3bo13bo3bo$50boo6boo82boo4bo11bo4boo$44bo5b3o4b3o81bobobooboo3b3o3boob oobobo$43b3o8boo84boobo4boboob3oboobo4boboo$43boboo4bobobbobo75bo4bo4b o3bo4bobo4bo3bo4bo$44b3obboboo4boobo69boob3o15bo5bo$39b3obb3obbo10bo 67boobo3boobboo7boo9boo7boo$38bobbo4bo77b5o4bobboo$41bo9bo6bo61booboob obobo5bobbo$41bo4b3o4b4o7b3o15b3o33boobo3bo3bo8bo$38bobo4b3o15bo3bo13b o3bo28b5o4bo$45b3o14boo4bo11bo4boo23booboobobobo3bo$48bo5boo5boboboob oo3b3o3booboobobo20boobo3bo3bo$48boo3bobbo3boobo4boboob3oboobo4boboo 15b5o4bo$45bobbo5boo3bo4bo3bo4bobo4bo3bo4bo4bo5booboobobobo3bo$48bo22b o5bo15b3obboobo3bo3bo$44bo3bo5boo3boo7boo9boo7boobb3ob3o4bo$44bo3bo4bo bbo34boo5bobo3bo$48bo5boo33bobbo6bo$45bobo42bo$54boo52bo13bo$53bobbo 50b3o11b3o$54boo51boboo4bo5boboo14bo13bo$108b3o3b3o5b3o13b3o11b3o$54b oo52boo3boobbo4boo13boobo5bo4boobo$53bobbo58b3o19b3o5b3o3b3o$54boo82b oo4bobboo3boo$144b3o$54boo$53bobbo64b3o$54boo64bobbo$123bo14b3o$54boo 67bo14bobbo$53bobbo63bobo15bo$54boo56boo24bo$112boo25bobo$54boo92boo$ 53bobbo49bo41boo$54boo49b3o7bo$104boobo5booboo37bo$54boo48b3o6booboo 28bo7b3o$53bobbo48boo6booboo26booboo5boboo$54boo59boo4bo5bo16booboo6b 3o$120b3o3b3o15booboo6boo$54boo63boobo3boboo4bo5bo4boo$53bobbo62b3o5b 3o3b3o3b3o$54boo64boo5boo3boobo3boboo$132b3o5b3o$54boo57boo9bo8boo5boo $53bobbo57boo7b3o$54boo57bo8bo3bo10bo9boo$122bo3bo9b3o7boo$54boo33b3o 11b3o29bo3bo8bo$53bobbo31bobbo10bobbo12boobbo3bo8bo3bo$54boo35bo4b3o6b o13boobo3bo29b3o11b3o$91bo4bobbo5bo12bo3booboo8bo3bobboo12bobbo10bobbo $54boo32bobo4bo3bobbobo18bobo9bo3boboo13bo6b3o4bo$53bobbo38boboboo23bo 10booboo3bo12bo5bobbo4bo$54boo40booboo35bobo18bobobbo3bo4bobo$97b3o37b o23boobobo$54boo34bo70booboo$53bobbo32b3o70b3o$54boo32boobo6bo72bo$88b 3o6boo26bo44b3o$54boo33boo7bo24booboo35bo6boboo$53bobbo38bo27booboo8bo 26boo6b3o$54boo37b4obo18bo6b3o7booboo24bo7boo$94bobbo18b3o15booboo27bo $54boo39b3o18boboo15b3o6bo18bob4o$53bobbo60b3o23b3o18bobbo$54boo49b3o 9b3o22boobo18b3o$70bo13bo19bobbo9boo23b3o$54boo13b3o11b3o21bo34b3o9b3o $53bobbo11boobo5bo4boobo21bo35boo9bobbo$54boo12b3o5b3o3b3o19bobo47bo$ 69boo5boboo3boo69bo$54boo99bobo18b3o11b3o$53bobbo45bo7b3o3b3o56bobbo 10bobbo$54boo47boo5bobbobobbo59bo4b3o6bo$79bo22boo6bo7bo24b3o3b3o7bo 18bo4bobbo5bo$54boo21boo4b3o24bo7bo24bobbobobbo5boo16bobo4bo3bobbobo$ 53bobbo26bobbo24bobobobo25bo7bo6boo22boboboo$54boo24bobbo59bo7bo31boob oo$75bo7bo30bo29bobobobo33b3o$54boo18bo3boo4bobo26b3o8boo51bo$53bobbo 17bo37booboo7bobo20bo28b3o$54boo19bo36booboo8boo9boo8b3o26boobo6bo$85b 3o3b3o19bobo19bobo7booboo25b3o6boo$54boo12bo9bo5bobbo3bobbo19bo20boo8b ooboo26boo7bo$53bobbo10b3o6b3o8bo3bo54bobo33bo$54boo11boboo5bo10bo3bo 55bo32b4obo$68b3o5bobo5bobo5bobo17booboo7boo43bo5bo5bobbo$54boo12boo7b oo28bo3bo5bo5bobbo41b3o3b3o5b3o$53bobbo31b3o17boobbo3bo7boo10boo7boob oo17boobo3boboo14b3o$54boo32b3o16boo4b3o19bobbo5bo5bo3bo12b3o5b3o14bo bbo$88bobo22bobo20boo7bo3bobboo14boo5boo15bo$54boo33bo24bo31b3o4boo37b o$53bobbo32bo24bo31bobo23bo20bobo$54boo19bo71bo23b3o$75boo20bo49bo22bo 3bo$54boo18bobo10bo3bo4b3o71bo3bo$53bobbo30booboo4boboo64bo$54boo32bob o6b3o63b3o4bo3bo11b3o$80bo16boo63boobo4bo3bo11bo$54boo24boo7bo72b3o5b ooboo12bo$53bobbo22bobo7bo73boo6bobo$54boo33bo82bo$112bo68b3o$54boo29b o27boo66bo$53bobbo28boo25boo35bo32bo$54boo28bobo60boo$148boo$54boo26bo 93b3o$53bobbo24b3o6bo85bo$54boo25boboo5boo32boo51bo$82b3o4bobo22boo8bo bo$54boo26b3o29boo9boo9boo48b3o11b3o$53bobbo25boo51bobo8boo23b3o11bobb o10bobbo$54boo79boo9boo23bo16bo4b3o6bo$172bo15bo4bobbo5bo$54boo129bobo 4bo6bobo$53bobbo57bobo7boo71bo$54boo58bobo6bobbo64bo4bo$113bo10boo10b oo7bobo43bo$54boo57b3o19bobbo6bobo39bo5bo$53bobbo52boo3b3obo17boo10bo 37b3o3b3o$54boo53boo6boo27b3o36boobo3b3o$117boo24bob3o3boo20boo10b3o4b oo$54boo49bo37boo6boo20boo11boo5b5o$53bobbo48boo36boo34bo15b3o$54boo 48bobo71b3o$177boobo4bo6bo$54boo100b3o18b3o4b3o5bo$53bobbo99bo20b3o4bo boo6bo7b3o$54boo101bo19b3o5b3o6boo6bobbo$178boo5boo6boo7bo$54boo137bo 8bo$53bobbo125bo20bobo$54boo125b3o$180bo3bo$54boo$53bobbo$54boo104bo 13bo5booboo$113boo5bo38b3o11b3o6bo12b3o$54boo57boo5boobboo33boboo4bo5b oboo18bo$53bobbo62bobobbobo20boo11b3o3b3o5b3o19bo$54boo69boo9boo9boo 11boo3boobbo4boo4bo3bo$135bobo3b3o23b3o9bobobobo$54boo79boo4bo38b5o5b 3o$53bobbo85bo37booboo5bo$54boo125bobo7bo$173b3o5b3o$54boo116bobbo$53b obbo118bo9b3o$54boo119bo9bo$172bobo11bo$54boo108boo$53bobbo107boo23bo$ 54boo132b3o$158bo24boo3boboo$54boo101b3o7bo15b3o3b3o$53bobbo99boobo5b ooboo19b3o$54boo100b3o6booboo19boo$157boo6booboo$54boo111boo$53bobbo$ 54boo$$54boo80boo32b3o$53bobbo80boo31bo$54boo80bo28boo4bo4bo$125boo39b oo7b3o$54boo68bo3bo36bo9boboo$53bobbo56boo8bo5bo7bo38b3o$54boo57boo8bo 3boboo4bobo38boo$123bo5bo3boo12boo21boo$54boo68bo3bo4boo12boo22boo$53b obbo68boo6boo35bo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$54boo 96boo$53bobbo94bo$54boo$$54boo$53bobbo$54boo88bo$144boo$54boo87bobo$ 53bobbo$54boo$170boo$54boo114bo$53bobbo111bobo$54boo80boo30boo$137boo$ 54boo80bo$53bobbo68boo$54boo68bo3bo$113boo8bo5bo7bo$54boo57boo8bo3bob oo4bobo$53bobbo66bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$125boo 6boo23bobo$54boo79bobo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96b oo$151bo$54boo$53bobbo$54boo$$54boo88bo$53bobbo87boo$54boo87bobo$$54b oo$53bobbo113boo$54boo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo 80bo$125boo$54boo68bo3bo$53bobbo56boo8bo5bo7bo$54boo57boo8bo3boboo4bob o$123bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$53bobbo68boo6boo23b obo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$54boo96boo$53bobbo94b o$54boo$$54boo$53bobbo$54boo88bo$144boo$54boo87bobo$53bobbo$54boo$170b oo$54boo114bo$53bobbo111bobo$54boo80boo30boo$137boo$54boo80bo$53bobbo 68boo$54boo68bo3bo$113boo8bo5bo7bo$54boo57boo8bo3boboo4bobo$53bobbo66b o5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$125boo6boo23bobo$54boo79b obo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96boo$151bo$54boo$53bo bbo$54boo$$54boo88bo$53bobbo87boo$54boo87bobo$$54boo$53bobbo113boo$54b oo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo80bo$125boo$54boo68b o3bo$53bobbo56boo8bo5bo7bo$54boo57boo8bo3boboo4bobo$123bo5bo3boo12boo 10bo$54boo68bo3bo4boo12boo10boo$53bobbo68boo6boo23bobo$54boo79bobo$ 137bo$54boo$53bobbo$54boo$151boo$54boo96boo$53bobbo94bo$54boo$$54boo$ 53bobbo$54boo88bo$144boo$54boo87bobo$53bobbo$54boo$170boo$54boo114bo$ 53bobbo111bobo$54boo80boo30boo$137boo$54boo80bo$53bobbo68boo$54boo68bo 3bo$113boo8bo5bo7bo28bo$54boo57boo8bo3boboo4bobo26bobo$53bobbo66bo5bo 3boo12boo10bo5boo$54boo68bo3bo4boo12boo10boo$125boo6boo23bobo$54boo79b obo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96boo$151bo$54boo$53bo bbo151boo$54boo152bobo$208bo$54boo88bo$53bobbo87boo$54boo87bobo$$54boo $53bobbo113boo$54boo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo 80bo$125boo$54boo68bo3bo124boo$53bobbo56boo8bo5bo7bo115bobo$54boo57boo 8bo3boboo4bobo115bo$123bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$ 53bobbo68boo6boo23bobo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$ 54boo96boo$53bobbo94bo$54boo$298boo$54boo242bobo$53bobbo241bo$54boo88b o$144boo$54boo87bobo$53bobbo$54boo$170boo$54boo114bo$53bobbo111bobo$ 54boo80boo30boo$137boo$54boo80bo$53bobbo68boo662bobbo$54boo68bo3bo214b oo448bo$113boo8bo5bo7bo205bobo443bo3bo$54boo57boo8bo3boboo4bobo205bo 446b4o13b4o$53bobbo66bo5bo3boo12boo10bo646bo3bo$54boo68bo3bo4boo12boo 10boo649bo$125boo6boo23bobo645bobbo$54boo79bobo646bo$53bobbo80bo644bob o19boo$54boo727boo18b5o$796bob3obbo4bo21bo$54boo738boo3bo3b3obbo21b4o$ 53bobbo94boo626bo14bobo7bobboo23boo$54boo96boo623bobo14boboo7boo28bo$ 151bo613b3o10boo15boo35b4o$54boo708b5o27bo39bo$53bobbo331boo374b3oboo 62bobb3o$54boo155bo176bobo376boo5bo25boo5b4o23b3o$209bobo176bo383bobo 17boo4booboo3bo3bo24bo$54boo88bo65boo561boo16b4o3b4o8bo19bob3o$53bobbo 87boo635bo9booboo3boo5bobbo20boobbo$54boo87bobo622boo11bo11boo36b3o$ 768boo7bobboo4bobo42bo$54boo721bo7bobboo43bo$53bobbo113boo605bobboo4bo bo19boo5b4o12bobo$54boo114bo610bo11boo11booboo3bo3bo15bo$168bobo610bo 9booboo10b4o8bo12bobo$54boo80boo30boo621b4o12boo5bobbo15bo$53bobbo80b oo653boo37bo$54boo80bo665boo9bo17b3o$125boo673b5o8b3o14boobbo$54boo68b o3bo304boo365boo4bo5bo3bo13bob3o$53bobbo56boo8bo5bo7bo295bobo323bo40b oo5b5o4bo18bo$54boo57boo8bo3boboo4bobo295bo323bobo42boo4b4oboboo17b3o$ 123bo5bo3boo12boo10bo598boo45b3oboo3bo17bobb3o$54boo68bo3bo4boo12boo 10boo650bobo22bo$53bobbo68boo6boo23bobo671b4o$54boo79bobo653bo43bo$ 137bo651boo24b4o13boo$54boo734boo22bo3bo9bob4o$53bobbo740b4o17bo9bobo$ 54boo740bo3bo13bobbo9boo$151boo623bo23bo27boo$54boo96boo620boo20bobbo 27bobbo$53bobbo94bo623boo11bobbo39bo$54boo736bo38bo$478boo300bo7bo3bo 36b3o$54boo422bobo263bo33b3o3bo4b4o37bo$53bobbo421bo263bobo33boo5boo 42boo$54boo88bo598boo32bo6b3o41bobo$144boo632boo5boo39bobboo$54boo87bo bo632b3o3bo4b4o34bobo$53bobbo723bo7bo3bo$54boo736bo35boo$788bobbo34bo bbo$54boo769bobbo$53bobbo721boo46b3o$54boo80boo593bo44booboo46bo$137b oo590boo45b4o46boo$54boo80bo593boo22boo5b4o12boo46bobo$53bobbo68boo 625booboo3bo3bo58bobboo$54boo68bo3bo394boo41b4o182b4o8bo59bobo$113boo 8bo5bo7bo385bobo39bo3bo159bo23boo5bobbo$54boo57boo8bo3boboo4bobo385bo 45bo157bobo95boo$53bobbo66bo5bo3boo12boo416bobbo159boo18boo9bo63bobbo$ 54boo68bo3bo4boo12boo430boo165b5o8b3o60bobbo$125boo6boo443b4o164boo4bo 5bo3bo60b3o$54boo79bobo428bo11booboo163boo5b5o4bo61bo$53bobbo80bo426b oobo3bobbo5boo166boo4b4oboboo60boo$54boo506b5o4bo3bo175b3oboo3bo61bobo $562bobbo4bo4boo180bobo60bobboo$54boo506b5o4bo3bo245bobo$53bobbo507boo bo3bobbo5boo104bo50bo$54boo510bo11booboo101boo49boo24b4o57boo$578b4o 103boo49boo22bo3bo17boo5b4o27bobbo$54boo523boo162b4o17bo15booboo3bo3bo 26bobbo$53bobbo151boo358boo17boo153bo3bo13bobbo16b4o8bo27b3o$54boo152b obo357bobo15b4o124bo7bo23bo34boo5bobbo29bo$208bo359bo17booboo14boo105b obo5boo20bobbo74boo$54boo532boo14b4o105boo6boo11bobbo41bo39bobo$53bobb o547booboo129bo39boo8boo27bobboo$54boo527boo21boo109boo15bo3bo38bo9bo bbo27bobo$582boo133b3o4boo9b4o39b5o4bobbo$54boo663bo3boo5b3o46b4o3boob oo28boo$53bobbo524boo136b3o6booboo49bo4boo28bobbo$54boo547boo114bo3boo 5b3o83bobbo$597b3o3bobo111b3o4boo9b4o26bobo49b3o$54boo538b3o6boboo34bo 50bo23bobboo13bo3bo27b3o49bo$53bobbo537bo9boo33boo49boo24bo3bo17bo27b 3o20b4o24boo$54boo538b3o7bo35boo49boo24bo16bobbo50bo3bo23bobo$717b3o 51b4o17bo21bobboo$54boo668boo27bo16bo3bo13bobbo23bobo$53bobbo199bo348b oo92bo22booboo24boo21bo$54boo198bobo339b4o4b4o89bobo22b4o26boo16bobbo 42boo$255boo338bo3bo4booboo89boo23boo37bobbo48bobbo$54boo543bo6boo158b o46bobbo$53bobbo538bobbo139bo23bo3bo47b3o$54boo680boo14boo9b4o48bo$ 737boo12boo5b3o53boo$54boo691b3o6booboo52bobo$53bobbo590boo102boo5b3o 50bobboo$54boo199bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo30b obo103boo9b4o8boo35bobo$255b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 27b3o27b3o27b3o8bo18b3o28boboo112bo3bo6bo4bo$54boo202bo29bo29bo29bo29b o29bo29bo29bo29bo29bo29bo29bo5boo22bo28b3o116bo12bo33boo$54bobo200boo 28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo6boo20boo28boob o79b4o28bobbo7bo5bo31bobbo$55bobo590boo79b6o39b6o30bobbo$56boo671b4ob oo16boo57b3o$259b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 122bo48boo15booboo57bo$259b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 27b3o27b3o120bobo65b4o29b4o24boo$258bo3bo25bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo120boo66boo29bo3bo23bobo$ 778bo7bo21bobboo$257boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3b oo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo129bo79b7obbobbo23bobo$ 590boo28boo28boo28boo9boo17boo22b3o3b3o3b3o3b3o3b3o3b3o5bobb3oboo$590b obo27bobo27bobo27bobo9boo16bobo60b7obbobbo24boo$591boo28boo28boo28boo 28boo65bo7bo21bobbo$782bo3bo20bobbo$261b3o27b3o27b3o27b3o27b3o27b3o27b 3o27b3o27b3o27b3o27b3o219b4o21b3o$258boo28boo28boo28boo28boo28boo28boo 28boo28boo28boo28boo202bobbo43bo$258boo28boo28boo28boo28boo28boo28boo 28boo28boo28boo28boo206bo41boo$257boo28boo28boo28boo28boo28boo28boo28b oo28boo28boo28boo178boo10boo11bo3bo7b6o27bobo$258bobo27bobo27bobo27bob o27bobo27bobo27bobo27bobo27bobo27bobo27bobo177boo11bo11b4o6bo5bo25bobb oo$259boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo143b4o29bo 8bo7boobb3o18bo26bobo$693bo9bo3bo37bo8boobb3o12bo4bo$590boo28boo22bo5b oo22bo19boo11bo38bo7boobb3o14boo30boo$259boo3boo23boo3boo23boo3boo23b oo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo 24bobo27bobo20bobo4bobo21bo4bo11b3o5boobbobbo35boo7bo11b4o38bobbo$259b oo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo 23boo3boo23boo3boo23boo3boo25boo28boo20bobo5boo21bo3bobo10boo6b3o41boo 4boo11bo3bobbobbo31bobbo$253bo29bo29bo29bo29bo29bo29bo29bo29bo29bo120b o33bobbo9b3o5boobbobbo12boo5b4o12bo23bo6bo6boo23b3o$251boo8b3o17boo8b 3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo 8b3o27b3o114bobbo10boo13bo9booboo3bo3bo7b3o22bobbo3bo3bo4booboo23bo$ 252boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo 7b3o18boo7b3o18boo7b3o27b3o115boo11boo9bo3bo9b4o8bo6b5o29b4o4b4o23boo$ 262bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo130boo9b4o10boo5bobbo7b3o boo5boo30boo23bobo$694bo44boo7boo52bobboo$671boo6b5o40bo22bo55bobo$ 647bo8bo12booboo4bo4bo35bo3bobbo33bobo12b4o$646b3o7bo8bo3b4o10bo14b3o 17boo7bo30b3oboo11bobboo24boo$244bobo27bobo27bobo27bobo27bobo27bobo27b obo27bobo27bobo27bobo68boo53b3obo3b4o8boobbobo3boo6bo3bo17bo18boo6bo 24boo4b3ob3o11bobboo21bobbo$244boo16boo10boo16boo10boo16boo10boo16boo 10boo16boo10boo16boo10boo16boo10boo16boo10boo16boo10boo16boo28boo20bob o5boo28boo19b4obb4o6bobboo3bo12bo18bo20boo4boo25boo4booboo12bobbo21bo bbo$245bo16boo11bo16boo11bo16boo11bo16boo11bo16boo11bo16boo11bo16boo 11bo16boo11bo16boo11bo16boo28boo22bo5boo28boo16bobbo4b4o8boobbobo3boo 32bobo18bo26bo7b3o3boo9boo23b3o$641boboob3o7bo8bo3b4o31bobbo14boo37bo 4boo35bo$641b3obo10bo12booboo128boo$640bobbo6b3o18boo32b3o93bobo$486b 4o4b4o142boobboo4bo75b4o50boo17bobboo$238bo29bo29bo29bo29bo29bo29bo29b o36bo3bo3bo3bo4bobbo136b4o5bo56bobbo13bo3bo32boo14booboo17bobo$236boo 28boo28boo28boo28boo28boo28boo28boo41bo7bo8bo137bo33boo32bo16bo31b4o 13b4o$237boo28boo28boo28boo28boo28boo28boo28boo36bobbo4bobbo5bo3bo134b o34booboo27bo3bo12bobbo32booboo13boo20boo$503b4o133bobo22b3o8b4o16boo 11b4o50boo34bobbo$572boo65boo3bo20bo11boo15booboo99bobbo$563b4o4b4o50b oo13bo3boo20bo27b4o101b3o$484b3o3boo70bo3bo4booboo48b4o17bo49boo103bo$ 477bo5bo3bobboo9boo63bo6boo39bo9booboo12bo3bo153boo$229bobo27bobo27bob o27bobo27bobo27bobo27bobo27bobo36bo3bo5bo11bobboo57bobbo34boo12bo11boo 14bobo38boo113bobo$229boo28boo28boo28boo28boo28boo28boo28boo35b3o9bo 10b3obbo94bobo8bobboo4bobo55b3o3boo9bo101bobboo$230bo29bo29bo29bo29bo 29bo29bo29bo41bo5bo10bo4bo96bo8bo7bobboo24b4o26b3o14boo101bobo$484bob oo11b5o19bobbo36boo45bobboo4bobo24bo3bo25bo3bo12boboo$472bo27boo25bo 35bo7boo41bo11boo22bo25b4o13bobo102boo$463boo8bo49bo3bo35bobbo5boo31b oo7bo9booboo3boo5bobbo3bobbo27b3o13boo101bobbo$460b3oboo5b3o21boo5bobb o18b4o36b3o4boo31bobo17b4o3b4o8bo151bobbo$223bo29bo29bo29bo29bo29bo29b o56b5o29b4o8bo43bo15boo3bo34bo18boo4booboo3bo3bo152b3o$221boo28boo28b oo28boo28boo28boo28boo58b3o30booboo3bo3bo43bo49boo31boo5b4o41bobbo108b o$222boo28boo28boo28boo28boo28boo28boo63bo21boo5boo5b4o43bobo44b3oboo 86bo6boo98boo$468bo9bo8booboo59bo20boo23b5o8boo73bo3bo4booboo96bobo$ 466b3o7bobo4bo3b4o60bo19b4o23b3o8bobo24boo48b4o4b4o95bobboo$475bobbo5b o3boo64boo15booboo35bo15boo3b3o4bo55boo97bobo$475bo6bobbo51bo15b4o16b oo11b4o33boo6b5o4boo$475bobbo5bo3boo46bo16booboo27bo3bo12bobbo18b3o4bo boo6bo153boo$214bobo27bobo27bobo27bobo27bobo27bobo27bobo79bobo4bo3b4o 45b3o16boo32bo16bo8boo8bo4boo9bo151bobbo$214boo28boo28boo28boo28boo28b oo28boo82bo8booboo93bobbo13bo3bo7bobo13boo5bobbo151bobbo$215bo29bo29bo 29bo29bo29bo29bo93boo12boo98b4o9bo13boo6bo154b3o$503bo4bo13bo25boo244b o$509bo11bo15bo8booboo28bo59bobbo150boo$509bo11b3o11bobo4bo3b4o30bo18b obo41bo148bobo$185boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28b oo14bo32bobbo5bo3boo29b3o12b3oboo3bo36bo3bo146bobboo$184bobbo26bobbo 20bo5bobbo20bo5bobbo20bo5bobbo20bo5bobbo20bo5bobbo26bobbo26bobbo27boo 28boo15bobbobobo3boo19bo6bobbo12bo32boo4b4oboboo18b4o13b4o147bobo$184b o29bo21boo6bo21boo6bo21boo6bo21boo6bo21boo6bo29bo29bo77bobb3obo3boo19b obbo5bo3boo6bo3bo28boo5b5o4bo17bo3bo$184bo29bo22boo5bo22boo5bo22boo5bo 22boo5bo22boo5bo29bo29bo27bo50bobobbo26bobo4bo3b4o10bo13bo13boo4bo5bo 3bo21bo165boo$184bobo27bobo27bobo27bobo27bobo27bobo27bobo27bobo27bobo 26bo49boo32bo8booboo4bo4bo14bo12b5o8b3o18bobbo164bobbo$184bobo27bobo 27bobo27bobo27bobo27bobo27bobo27bobo27bobo24b3o94boo6b5o12b3o14boo9bo 187bobbo$185bo29bo29bo29bo29bo29bo29bo29bo29bo364b3o$581b4o10boo5bobbo 185bo$580bo3bo9b4o8bo183boo$182boo3boo10bobo10boo3boo10bobo10boo3boo 10bobo10boo3boo10bobo10boo3boo10bobo10boo3boo10bobo10boo3boo23boo3boo 23boo3boo146boo7bo9booboo3bo3bo182bobo$182bo5bo10boo11bo5bo10boo11bo5b o10boo11bo5bo10boo11bo5bo10boo11bo5bo10boo11bo5bo23bo5bo23bo5bo78bo29b o36b4obbobbo12boo5b4o180bobboo$200bo29bo29bo29bo29bo29bo103boo28boo20b obo5boo20bobo5boo27bo3boo209bobo$183bo3bo25bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bobo27bobo20bobo4bobo20bobo4bobo18b3o7b 4obbobbo$184b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o26boo28boo22bo 5boo22bo5boo17booboo8boo7bo204boo$559bo20bo3bo202bobbo$581b4o201bobbo$ 193bo29bo29bo29bo29bo473b3o$191boo28boo28boo28boo28boo475bo$88boo102b oo28boo28boo28boo28boo473boo$89bo696bobo$89bobo5boo89bo29bo29bo29bo29b o29bo29bo29bo29bo150b4o201bobboo$90boo5bobbo85bobo27bobo27bobo27bobo 27bobo27bobo27bobo27bobo27bobo128bo20bo3bo202bobo$81boo18bo9bobo73boo 28boo28boo28boo28boo28boo28boo28boo28boo22boo28boo22bo5boo22bo5boo17b ooboo8boo7bo$81boo18bo7bo3bo337bobo27bobo20bobo4bobo20bobo4bobo18b3o7b 4obbobbo204boo$67bo10boo21bo7bo73bo29bo29bo29bo29bo29bo29bo29bo29bo28b oo28boo20bobo5boo20bobo5boo27bo3boo207bobbo$67bobo7b3o17bobbo7bo4bo8b oo58b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o80bo29bo36b4obbobbo12b oo5b4o178bobbo$70boo6boo17boo10bo12boo57b5o25b5o25b5o25b5o25b5o25b5o 25b5o25b5o25b5o147boo7bo9booboo3bo3bo179b3o$56boo12boo9boo5boo19bo3bo 48bo17boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo8bo14boo3boo 8bo14boo3boo8bo14boo3boo151bo3bo9b4o8bo180bo$56boo12boo9boo5bobo9bobo 8bobo46b3o18b5o25b5o25b5o25b5o25b5o25b5o10bo14b5o10bo14b5o10bo14b5o 153b4o10boo5bobbo180boo$67bobo20bo9boo57bo21bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo8b3o14bo3bo8b3o14bo3bo8b3o14bo3bo357bobo$67bo11bo10boo9b o57boo21bobo27bobo27bobo27bobo27bobo27bobo14boo11bobo27bobo27bobo121b oo6b5o12b3o14boo9bo181bobboo$77bobo67bo35bo29bo29bo29bo29bo29bo15boo 12bo29bo29bo24boo51boo32bo8booboo4bo4bo14bo12b5o8b3o180bobo$78boo66bob obooboo294boo50bobobbo26bobo4bo3b4o10bo13bo13boo4bo5bo3bo$147bo3bobobo bo290bo51bobb3obo3boo19bobbo5bo3boo6bo3bo28boo5b5o4bo180boo$151bo4boo 25boo28boo28boo28boo28boo28boo28boo17bo10boo28boo28boo28boo15bobbobobo 3boo19bo6bobbo12bo32boo4b4oboboo178bobbo$152bo30boo28boo28boo28boo28b oo28boo28boo16bobo9boo18bo9boo28boo28boo14bo32bobbo5bo3boo29b3o12b3ob oo3bo179bobbo$106bo46bo227bo29bobo93bo11b3o11bobo4bo3b4o30bo18bobo181b 3o$105boo45boo227boo29boo93bo11bo15bo8booboo28bo204bo$105bobo308bo65bo bbo15bo4bo13bo25boo233boo$414bo3bo67bo14boo98b4o175bobo$95boo21boo264b oo33bo49boo11bo3bo96bobbo13bo3bo173bobboo$96bo21bobo28boo229b4oboo27bo 4bo51bo11b4o47b3o16boo32bo16bo174bobo$96bobo9bo4boo6bo7boo17bobbo4boo 222b6o29b5o46bo7boobb3o53bo16booboo27bo3bo12bobbo$97boo8bobobbobbobbo bbo7boo17bobbo4bobo222b4o80bo8boobb3o54bo15b4o16boo11b4o192boo$107boob ob3o6bo27boo8bo297bo8bo7boobb3o71boo15booboo204bobbo$107booboo6bobo39b o295bo14bo11b4o62bo19b4o204bobbo$107boobo7boo41bo295bo5boo4boo11bo3bo bbobbo56bo20boo206b3o$107bobo35bo16bo301boo20bo6bo6boo46bobo228bo$108b o35bobo16bo293b3o3bo18bobbo3bo3bo4booboo45bo229boo$145bo14b3o293b5o29b 4o4b4o46bo15boo3bo207bobo$159bo296b3oboo37boo21b4o36b3o4boo81b3o120bo bboo$141bo18bo298boo7boo51bo3bo35bobbo5boo79b5o120bobo$140bobo18bo307b oo20bo33bo35bo7boo80b3oboo28boo$141bo20bo305bo20bo4bo3bo22bobbo36boo 91boo20b4o4b4o89boo$163bo317booboo3bo3bo4boo175bo3bo4booboo86bobbo$ 137bo26bo316bobbo8bo5boo178bo6boo86bobbo$136bobo26bo307boo7b3o13boo60b obbo102boobbo4bobbo96b3o$137bo28bo307boo11bobbo73bo6boo91boo5bo104bo$ 167bo305bo14boo70bo3bo4booboo89bo3bo3boo9bo92boo$133bo34bo392b4o4b4o 90boboo14b4o89bobo$132bobo34bo400boo91booboobo6b8obo86bobboo$133bo36bo 329boo164bo8bo9boo86bobo$165boo4bo310boo14booboo168bo3boo4bob3o$165bob obobo3bo305b4o13b4o165bo3bo10b3o89boo$168booboobobo304booboo13boo168bo 9bo92bobbo$175bo307boo156bo33bo95bobbo$640bo32bo3bo7boo85b3o$116bo523b 3o35bo5b4o85bo$117bo555bo4bo5booboo83boo$115b3o9bobbo36bobbo36bobbo36b obbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo37b obbo22b5o7boo83bobo$126bo39bo39bo39bo39bo39bo39bo39bo39bo39bo39bo39bo 39bo23b3o19bo116bobboo$126bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo 3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo19bobo15bo3bo13bobbo100bo bo$126b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o 20b3o16b4o17bo$94boo570bo3bo100boo$93bobo534boo12b3o20b4o98bobbo$93bo 536boo12b3o121bobbo$92boo27bobobo115bobobo117bo150b4o111bo13bobo123b3o $513bo3bo12bobbo96boo138bo$121bo123bo115bo3bo151bo16bo104bo20bo4boo 102boo$22boo489bobbo13bo3bo104boo16b4o3booboo99bobo$22boo97bobo119bo 119bobo165b4o94b5o4bobo15b5o4bobbo97bobboo$508bo119bo4bo21bo9bobbo98bo bo$125bo115bo123bo143bo123bo22boo8boo$507b3o118bo3bo11bo12bo110boo$ 121bobo117bo120bobo159bo4boo99bo13boo120bobbo$521b4o3booboo110bobo13b oo5bobbo95bobbo$35boboo94boo368bo16b5o4bobbo125b4o8bo95b3o$14boo14bobb oboboo94bo89boo28boo28boo28boo28boo28boo28boo28boo28boo28boo9bo14bo9bo bbo125booboo3bo3bo12boo82bo$14boo13bo3bobbo97b3o86bo29bo29bo29bo29bo 29bo29bo29bo29bo29bo8b3o15boo8boo117bo10boo5b4o3b4o4b4o80boo$30bo6bobo 96bo87b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o24bo127boo22bo3b o4booboo78bobo$31bo5bo188bo29bo29bo29bo29bo29bo29bo29bo29bo29bo151bobo 26bo6boo77bobboo$29bo493boo5bobbo139bobbo87bobo$29bo12bo479b4o8bo$44b oo456bobbo16booboo3bo3bo119bo16boo92boo$41booboo460bo17boo5b4o119boo 15boo8boo84bo$6boo35bo458bo3bo146bobo14bo3bo5bobbo83bo$6boo36boo457b4o 8bo155bo3bo4bobboo82bo$515boo25b4o125bo4bobbobboo79bobbo$43boo469bobo 14bo9bo3bo113bo13bobo3b4o81boo$532boo11bo113boo102boo$41bo487b3o5boobb obbo113bobo103bobo$42bobo475bo7b3o6b3o143boo79bob4o$39boobbo477bo7b3o 5boobbobbo137b4o82boo$520bo11boo11bo136booboo84bo$531bo9bo3bo12boo107b oo15boo82b4o$542b4o3b4o4b4o104booboo102bo$b3o521bo22bo3bo4booboo103b4o 99bobb3o$3bo16boo496boo5boo25bo6boo105boo102b3o$bo19boo492b3oboo3bobo 21bobbo219bo$3bo16bo494b5o246bob3o$b3o512b3o247boobbo$boo527bo18boo 216b3o$bbo58boboo465boo17bo7boo208bo$b3o52bobboboboo464bobo17bobbo5boo 209bo$o3b3o48bo3bobbo487b3o4boo208bobo$5boo49bo6bobo470bo15boo3bo212bo $5boo50bo5bo472bo230bobo$bbo21bobo28bo12boo466bobo230bo$bbo22boboo3boo 21bo12boo467bo20boo207bo$bbo18boo3boob5o503boo18b4o206b3o$21boo3bobob oobo523booboo204boobbo$20bobboobo4b3o10bo497boo15boo205bob3o$21bobobo 7bo9bobo494booboo226bo$21bobo18bo3bo493b4o226b3o$42bobbo495boo225bobb 3o39bo$42bobbo14boo710bo38bo3bo$42bobo15boo706b4o44bo$13b3o755bo13bobb 3o20bo4bo$13b3o752boo12boobboboobo20b5o$15bo750b4o8bob4o3b3oboo13boo$ 16bobbooboo742bo10b5obobbobob4o6boobb5obo$10b3o3b4o3bo751bo4bo4b4obo3b o5b4o7bo$16boboobobo3b3o216boo528bo6bo4bobbobboo4bo10bo$15bo13bo15bo6b oo192bobo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bobbo3b5o3bo bbob3oboo7b3o$27bo16b3o5boo193bobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobb obbo6bo5boo9b3obbo3bo$29bo14bobbo200boobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobbobbo6bo5boo9b3obbo3bo$27b3o16bo205bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bobbo3b5o3bobbob3oboo7b3o$27boo15b3o729bo6bo4bobbobboo 4bo10bo$28bo15b3o728bo4bo4b4obo3bo5b4o7bo$27b3o15bo719bo11b5obobbobob 4o6boobb5obo$26bo3b3o11boo717bo6bo7bob4o3b3oboo13boo$31boo12boo723bo 11boobboboobo20b5o$31boo730bo6bobb3o9bobb3o20bo4bo$28bo735b6o3b3o40bo$ 28bo744boo3boo31bo3bo$28bo747booboo32bo$774b6o$772bo3b3o$776bo$772bo3b o$773b4o! golly-3.3-src/Patterns/Life/Miscellaneous/infinity-hotel1.rle0000644000175000017500000001454412026730263021235 00000000000000#C Infinite Glider Hotel #C The name is derived from the old mathematical "infinity hotel" #C scenario, where a hotel with an infinite number of rooms always #C has room for more guests by shuffling the old guests around. #C Here two pairs of double Corderships are pulling slowly apart at #C c/12 such that there is an ever-lengthening glider track between #C them. Every 128 generations another glider is injected into the #C glider track, joining the gliders already circulating there. #C Eventually an arbitrarily large number of gliders will be #C traveling around the track. #C The tricky bit to this construction is that even though all the #C previously injected gliders are repeatedly flying through the #C injection point, that point is guaranteed to be empty when it is #C time for the next glider to be injected! #C David Bell, 29 May 2001, based on his original version, 9 Oct 1992. #C From Alan Hensel's "lifebc" pattern collection. x = 274, y = 206, rule = B3/S23 99bo82b3o$87bo11b3o80bobo$85b3o14bo23boo38boo14bobo$69bo14bo16boo23bo 38bobbo9boo4bo$69b3o12boo38bobo38b3o10boo3b3o$72bo47boob3o39boo12bo$ 71boo17bo4bo24boboo42bo13b4o$88boob3obbo3boo19b3o41boobo12boo$89boobo 7bobo15b5o42b4o13bo$72boo16boboobo6bo15b3o43bobobo$72boo18boo6b3o55boo 3booboo13bo$80bo10bo66boo4bo3bo12bobo$79b3o12bo27bo42b3o13b4o$78boobbo 8bobbo27b3o41bo15b3o$82boo9bo88bo$79b3oboo29bobo6boo$80bobboo30bo3boob oo42boo26bo$79b3o6boo30b3o3boo41bobo13bo7boboboo$82boo4bo19boo11bo4bob o21boo17bobo12booboobbooboobbo$82boo6bo16bobo18bo21boo32bo5bobo5bo$89b oo16bo20boo39b4o11bo8bobboo$85boo19boo4boo57bo13bobb3obbo$75bo9bo24bo bbo60boo15b3o$75bobo8b3o21boo47b3o12boo35b3o$75boo11bo30boo$119boo36bo 51bo$156boo3bo20bo25boo3bo$157bobo21bobo12bo12bobo$69boo89b3o18bobo12b o15b3o$68bobo89bo21bo13bo15bo$68bo$67boo91boo32bo17boo$129boo28boo32bo bo15boo$129bo30bo33bo17bo$127bobo29boo50boo$127boo31boo50boo$75b3o92bo $74bobbo42boboo39bo3bobbobobbo63bo$74boobo41b5o39b5oboo4bo46bo15b3o$ 78boo29bo9b4o41bobo4bo3bo46bo14booboo$78boo6boo21b3o110bo3b4o7bo3boo$ 77bobbo3bobbo24bo7b3o48b3o51bo3bo5bobobobo$78boo4boo4boo19boo7b3o49bo 51bo3boo4bobboboo$68boo20bo16boo12bo102b3o7boboo$54boobboo9bo18bobo16b o105boo6boboo10boo$52bobbobbobbo7bobo16boo19bo97boo4boo6b3o$52boobboo bboo8boo36boo97boo13bo$187b3o55b3o$52boob4oboo70boo110bo3bo$51bobboobb oobbo69bo52bo58bo4bo$51b3obboobb3o5boo15bo3bo40bobo51boo3bo56bo3bo$52b obbobbobbo6boo14b3obobbo18bo8bo5bo4boo53bobo38bo16b3obobbo$52b4obb4o 22bobobo19bo3bo4bobo5b3o60b3o14boo18bobo14bo7bo$50boo4boo4boo5bo20bo 17bo3bo3bo8b4o59bo10boo4boo17bobbo14bobo3bo$53boo4boo7bobo19boo16bobo 6boo10bo69boo24boo14boobo3bo$50boobob4oboboo3bobbo13bo3bobo37boo58boo 51boob3o$51bobo6bobo3bobbo18bobo34bo61boo40boo$55bobbo129bo40boo$51b3o 6b3o3bobbo117boo$49boobb3obb3obboo3boo42boo74boo$52bobbobbobbo33boo16b o7boo114bo$50bobo8bobo31bo14b3o4boobobboboo64boo43bobo13bobo$73bo22b3o 11bo6boobbo4bo64boo21bobo19bobo13bobbobbo7bobo$51bo10bo8boo6boo17bo23b o90booboo19bo14boboobobo5booboo$51boo8boo9boo5bo43bobo87boobo41bo6boob o$52boo6boo18b3o129bo37b3o11bo$52b10o20bo130bo36boo13bo$213bo32boo3boo 12bo$246boo$54bo4bo81bobo$56boo84boo80bo$48bo93bo80b3o$48b3o22b4o28b4o 28b4o28b4o$51bo20bo3bo27bo3bo27bo3bo27bo3bo50b3o$32bo17boo24bo31bo31bo 31bo5b3o39booboo$20bo11b3o37bobbo28bobbo28bobbo28bobbo6bo43bo$18b3o14b o143bo$bbo14bo16boo209boo$bb3o12boo42boo182bobboo$5bo16bo30bo7boo183b oo3boo9boo$4boo20bo25b3o186boo4boo4bo8boo$21bobo3bo4b4o15boobbo185boo 6b3o$21bo5boo3bobboo14bo3bo5b3o185b3o$5boo20boo4bobboo13boboo7boo$5boo 5b3o10bo7bobbo14boo6boo$12bobo9booboo5boo23b3o$10bo3bo10bobo26bobo3bob o165boobbo9bobo$10boboobbo37bobbo3boo164b3obbo8booboo8boo$10bo3bo38bo 3bo168bo4bo9boobo9boo$12boo41bobo169boo11bo$18bo33boo187bo$12bo5bobboo 29bo7bo180bo$12bo4bo3bo19boo10bobboboobo$15b3o5bo16bobo10b3o5bo$22boo 16bo20boo$18boo19boo4boo199boo$18bo24bobbo199boo$7bobo9b3o21boo$7boo 12bo30boo$8bo43boo3$bboo$bobo$bo$oo$62boo146b3o$62bo147bo$9bo50bobo 148bo13bo$8b3o49boo27boo132b3o$7boobbo77boo131bo$7bo214boo17bo$7b3o 229b3o11bo$7booboo30bo195bo14b3o$10boboo5boo21b3o50bo142boo16bo14bo$9b oobbo3bobbo24bo6b3o40bo115boo42boo12b3o$11boo4boo4boo19boo8bo41bo11boo 101boo55bo$boo20bo16boo11b3o25boo9boboo9bo4bo157boo$bbo18bobo16bo40boo 8booboo8bobb3o123bo13boo$bbobo16boo19bo49bobo9bobboo90b3o8boobo19boo 11bobo$3boo36boo158bo9bobo18bobo10boobo18boo$200bo11bo33b6o15boo$211b oo9b3o22bo4bo$18boo65b3o123boo8bobobobo21bobbo$16boob3o63b3o6boo115boo 8bo3boboo21boo$16boobobo51boo8bo4boo4boo125boobbobo$20boboo17bo31boo9b oo3boo132bo5bo$40boo15boo28boobbo131bobboboo$24bo16boo14boo31boo121boo 9boboo23boo7b3o$212bobo16boo19bo7bo$114bo97bo18bobo16bo9b3o$9boo47boo 52booboo94boo20bo16boo$5boobboo47bo52b3o103boo8boo4boo19boo5bo$4bobo 38boo12b3o154bobbo7bobbo24bo5b3o$4bo23boo16bo14bo49b3o51b3o48bobbo9boo 21b3o8b3o$3boo23bo14b3o66bo52b3o15b3o30bo35bo10boo$29b3o11bo121b3o17bo 30boo3bo$31bo57boo77b3o13bo32bobboobo$71bo12boo3boo32bo44b3o47b3obbo$ 71bo13boo36bo44b3o99boo$72bo11b3o37bo145bobo$68boboo6bo41boboo49bo98bo $67booboo5boboboobo14bo19booboo48bobo97boo$68bobo7bobbobbo13bobo19bobo 21boo27boo35boo$82bobo13bobo43boo23boo40bo5b3o$99bo68bobo40bobo3bobboo $147boo19bo5boo36boo4b3o$148boo17boo5boo43bo$106boo40bo$106boo40boo$ 90b3oboo51boo37bo44bo$88bo3boboo14boo24boo47boo42b3o21boo8bo$88bo3bobo 14bobbo17boo4boo10bo36bobo40bo24bobbo6bo$86bo7bo14bobo18boo14b3o79boo 19boo4boo5bobo$86bobbob3o16bo38bobo80boo16bo20boo$86bo3bo56bo3boo80bo 16bobo9boo7bo$87bo4bo58bo79bo19boo16bobo$88bo3bo138boo36boo$89b3o55b3o $114bo13boo77boo16boo$113b3o6boo4boo78bo$100boo10boobo6boo84bobo$99boo bo7b3o96boo7boo$96boobobbo4boo3bo51bo52bobo6boo6boo11boboo$95bobobobo 5bo3bo51b3o50boobo6bobo5boo11bo3bobo$94boo3bo7b4o3bo102boo9bo24bo$95b ooboo14bo46bo3bo4bobo29bo15bo3b4obbo22bobo$96b3o15bo46bo4boob5o27boo 20bobobo19bobo$97bo63bobbobobbo3bo27bobo21boo36boo$166bo96boobboo$123b oo50boo50boo38bobo$124boo50boo40boo7bo16boo23bo$124bo17bo33bo37boo4b4o 4b3o14bo23boo$124boo15bobo32boo36boobboob3o6bo11b3o$123boo17bo32boo33b oo6bo23bo$206boobboo$124bo15bo13bo21bo28bobo$122b3o15bo12bobo18b3o29bo $125bobo12bo12bobo21bobo$123bo3boo25bo20bo3boo21boo4boo$127bo51bo20bob oo4bo$199bo9b3o$123b3o35boo12b3o24bo8bo$143b3o15boo35boobo$143bobb3obb o13bo32boo$139boobbo8bo11b4o$138bo5bobo5bo32boo$138bobbooboobbooboo12b obo17boo$138boobobo7bo13bobo$142bo26boo$$154bo$152b3o15bo$152b4o13b3o$ 153bobo12bo3bo4boo$155bo13booboo3boo$168bobobo$154bo13b4o$154boo12bob oo$153b4o13bo$157bo12boo$151b3o3boo10b3o$152bo4boo9bobbo$152bobo14boo$ 152bobo$152b3o! golly-3.3-src/Patterns/Life/Miscellaneous/tubstretch-c124b.rle0000644000175000017500000001473512026730263021214 00000000000000#C c/124 pseudo tub-stretcher #C Jason Summers, 2-Sep-1999 -- from "jslife" pattern collection x = 346, y = 313, rule = B3/S23 126boo$126bobb3o$127bob3o13$120boo$119bobo$121bo12$98bo$98boo$97bobo$ 104boo$105boo$104bo3$19boo133bo$19boo131bobo$44boo107boo$44boo5$90boo$ 19b3o67bobo$18bo3bo21b3o44bo$17bo5bo19bo3bo$8boo7booboboo$8boo32bo5bo$ 42boo3boo$20bo$8bo10bobo$7b3o9bobo23bo$6bo3bo8boo23boboo$8bo9bo25bo$5b o5bo5b3o24bo3bo$5bo5bo4bo3bo24bobbo$6bo3bo4bob3obo23b5o18bo$7b3o6b5o4b o19b5o18boo$26boo16boo3boo16bobo$25boo18b5o24boo$38bobo5b3o26boo$38boo 7bo26bo$10bo28bo$$180bo$10bo21bobo144bo$8bobo22boo144b3o$9boo22bo$18b oo6boo$18boo6bobo$27b3o16boo$3boo3boo18boo16boo$17bo7boo33boo$4bo3bo9b o6b3o31bobo$5b3o8b3o42bo$5b3o$26boo$3bo11bo10boo4bobboo$bbobo11bo14bo 3boobboo130bo$bbobo10bo15bo7boo129bobo$3bo28b4o11bobo121bo$48boo$19bo 28bo$oo3boo12b3o162bo$o5bo15bo160boo$21boo160bobo24boo$bo3bobboo28bo 17boo151boo$bb3o4boo27boo16boo153bo$8bo28bobo3$48bo$48boo163boo$47bobo 162boo$5bo15boo3boo186bo$3booboo15b3o$22bo3bo$bbo5bo14bobo21boo$24bo 20bo3bo161boo$bbooboboo35bo5bo160boo$43boobo3bo8boo$21boo21bo5bo8boo$ 22bo7boo8boo3bo3bo151boo$19b3o7bobo7bobo5boo151bobo$19bo11bo7bo162bo$ 13boo23boo$bboo8b3o$3bo7bobobbobboo$3o8boobboobboo25bo$o5boo7boo24b3ob oobboo152b3o$6boo33b4o4boo154bo$29bo15boo7boo148bo$27b3o24boo$26bo5bo$ 26boo4b3o$35bo206boo$34boo152bo52boo$5b3o7boo37b3o131boo53bo$4bo3bo5bo bo26b3o8b3o130bobo$16bo26bo9bo3bo$3bo5bo34bo$3boo3boo42boo3boo$16boo 227boo$16bobo17b3o6b3o196boo$8boo6bo4boo3boo7bo3bo7bo198bo$8bobo12b3o 8bo5bo5bo4boo$10bo11bo3bo7booboboo10bobo$9boo12bobo25bo$6bo17bo$6bobbo 30bo$6bo14b3o15boo10bo$21b3o$38boboo129boo$5booboboo25bobboo128bobo$ 37b4o131bo$5bo5bo7boo3boo26b3o$20b5o26bo3bo$6booboo10b3o12boo3boo7bo5b o$8bo13bo16bo10bo5bo$36bo5bo10bo119b3o$37booboo9bo3bo119bo$38bobo11b3o 119bo$39bo13bo$7boo30bo$7boo$53boo219boo$21boo30boo103bo114boo$21boo 135boo115bo$39boo116bobo$39boo$$293boo$277boo14boo$276boo$278bo8$141b oo$140bobo$142bo131b3o$276bo$275bo3$109boo32b3o$109boo34bo131boo$87boo 55bo131bobo$87boo34boo153bo$74bo4bo10boo31boo$72bobo4bo10b3o5boo$64boo 4boo7bo10boo6boo$64boo4boo11boobboo39bo$70boo8boobbobboo39boo$72bobo5b 4o43bobo131boo$74bo7bo17boo47bobo110boo$99bobbo4boo3boo35bo3bo107bo$ 88boo12bo50bo7bo$88boo12bo5bo3bo26boo8bo4bo4b4o146boo$85bo13boobo6b3o 27boo12bo4boboboo144boo$85boo12boo8b3o37bo3bo3bobbob3o8boo135bo$84bobo 62bobo6boboboo9boo$159b4o$72boo26boo59bo$71bobo26boo5boo41bo$61boo7bo 6boo4bo24bo22boo4b3o10bobo$61boo7bobbobbobbobbobo20b3o7boo14bobo3bo12b oo$70bo6b3oboboo20bo8boo16b3o3bo$71bobo6booboo31bo16boo$72boo7boboo45b oo$82bobo9boo34b3o111b3o$83bo10bobo46boo101bo$96bo46boo100bo$96boo33b oo204boo$131boo204boo$113b3o$98boo15bo131boo$98bo15bo22boo107bobo78b3o $88boo6bobo19boo13boobobboboo105bo80bo$87b3o6boo19b3o13bo4bobboo185bo$ 75bo8boboo26boboo19bo14b3o$75bobo6bobbo26bobbo16bobo15bo$76bobo5boboo 10bo15boboo35bo9bo$63boo11bobbo7b3o8boo8boo7b3o5boo35bobo165boo$63boo 11bobo9boo7bobo7bobo8boo5bobo22bobo8boboo66boo96bobo$75bobo24boo3bo19b o22bobbo6booboo10boo55boo97bo$75bo9bo14bobbobboo19boo12boo10boo6boboo 10boo54bo$86boo53boo8bo3boo5bobo$85boo13bobbo34bo7boo5boo8bo$101bobbo 24boo6boo6bo4bobbo$102bobo23bobo6bobo10bobo$90boo11bo26bo183boo$90boo 223boo$102boo210bo$77boo23boo42bo7bo$75bobbo66b4o5bobo$74bo7b3o3bo51b oobbobboo8boo4boo$66boo6bo6bo3b5o20boo9b3o16boobboo11boo4boo$66boo6bo 7bo3booboo9boo8bobbo9bo13boo10bo7boo$75bobbo3bo3boob3o8boo12bo7bo5bo7b 3o10bo4bobo$77boo5b4oboo23bo12b4o6boo10bo4bo59b3o$86b4o24bo11boobobo8b oo74bo61boo$88bo14boo5bobbo11b3obobbo7boo73bo62boo$102bobo5boo14boobob o127boo$102bo24b4o127bo3bo29boo$101boo25bo113boo13bo5bo28boo$217boo23b oo13bo3boboobboo$216bobo14boo3bo6boo10bo5bo3boo17b3o8b3o$218bo14bobo3b o5b3o10bo3bo16bo6bo12bo$234b5o6boo12boo17b3o6bo10bo$235b3o4boo9bobo22b 3o$242boo10boo13boo48boo$254bo14boo5boo3boo34bobbo$276boo3boo17boo14bo 15bobo$201boo67bo28bobo6boo6bo10b3obbo3bo$202boo65bobo29bo6boo6bo19bo$ 201bo66bobbo45bobbobboo7bo4bo4boo$267bobbo8boo38boobbobbobo7bo5boo$ 324b3o5bo3bo$238bo9boo17bobbo61bobo$237bobo7b4o18boo5boo$230boo4boboo 5b3obbobbobo21bo6boo14boo$230boo3booboo9boobbobbo17b3o8boo13boo15bo$ 236boboo6bo9boo16bo9bo15boo14bo$237bobo5bo8bo3boo41bo14b3o$164boo72bo 6bo10boo10bobo29bobo$164boo87bobbo6boo4boo28boobo$144boo107bobo7bobo3b o42boo$142bobbo32boo85bo46boo$129bobo9bo7b5o24boo85boo33boo$129bo3bo7b o6bo5bo16b3o10b3o113boo$119boo12bo7bo7boo3bo10bo5bo14bo$119boo8bo4bo7b obbo7bo9booboo4bo12bo81boo$133bo10boo121bo35bobboo11boo$129bo3bo28bo5b o86bo9bobo17bo11bo4bo3boobboo7bobo$129bobo8bobo12boo48bo49boo8boo18boo 9boo4bo7boo7bo$141boo12bobbo3booboboo18boo13b4o37boo11boo22boo4boo8bob o4b4o$141bo44bobo12b4o16bo20b3o3bo7b3o21boo4b3o$155bobbo29bo5boo5bobbo 8boo5bobo16boboo4b4o5boo22boo4boo45bobo$154bobbo36boo5b4o14bo3boo7boo 5bobbo4bo4bobboo20boo6boo7boo32boo3bobbo$154bobo45b4o3boobobo4bo3boo3b oobboo5boboo5bo3bobbo20bobo6bo8bobo24boobboob3o5boo$155bo49bobbo3boo5b o3boo3boo12b3o3boobo19boo3bo19bo23bobo3bo3bo3bo3boo4boo$209bo10bobo20b oo25bobboboo19boo6boo4boo7bo8bobo5boo6boo$125bo10bo18boo52bobbo8bo48bo 29b3obo5boo7bobbo6boobbobbo$125boo9boo17boo5boo7boo97bo31boobo13bo13bo bo$116boobboo4boo7bobo4bo20bo8boo12boo69bo12boboo27bo18bobo$116boobboo 4b3o13bobo15b3o8bo14boo84boo47boo$120boo4boo15bobo14bo41bo56bo$125boo 16bobbo54bo57bo$125bo17bobo39boboo12b3o67boo39bo$142bobo4boo4bobo27bob o55bo27boo20boo16boo10boo$142bo6bobo4boo28bo11boo41b4o6boobboo35bobo 16bobo9boo$151bo4bo29boo10boo40boboboo5b4obobbobo32bo11boo12boo6bo3boo $151boo33boo47boobbobbob3o5boobo3bo3bo19bo20bo3bo10b3o5bo3bobo$186boo 47boo3boboboo4bo12bo5boo11b4o17bo5bo10boo6b5o$241b4o14bo4bo4boo10boobo bo6bobo6bobbo3bo13boo4b3o$153boo49boo37bo19bo16b3obobbo3bo3bo13bo13boo $153bo28bo10b4o7bobo52bo3bo17boobobo4bo8bo7bo$141boo8bobo17boo8boo5boo 7bo6bo54bobo10boo8b4o4bo4bo3bo4boboo$141boo8boo18boo8bobo4boobboo3bo 73bobo9bo7bo8boo$128bo4bo10boo21bo6boo16boobbo74bo19bo3bo$126bobo4bo 10b3o20bo6b3o93boo21bobo$124boo7bo10boo28boo36boo8bo$118boo4boo11boobb oo20boo6boo7boo30bobbo6bobo$118boo4boo8boobbobboo19bobo6boo7bobo24boo bbo3bo7bobo$126bobo5b4o19boo3bo19bo4bo3bo14b3obboobbo7bobbo3boo$128bo 7bo20boobboo19boobbo4bo4boo5boboo16bobo4boo$186bo4bo4boo5bobbo8b3o4bob o$187b3o13boboo15bo$156boo48b3o$156boobo47boo$159bo$159bo37bo$156bobbo 20boo14boo$130boo9boo14boo20bobo14bobo8bobo$130bobo9boo37bo23bo3bo$ 125boo4b3o7bo6bo44boo10bo12boo$121b4obbo4b3o12bobo17boo24bobbo7bo4bo8b oo$121b3oboo4b3o12bo3boo3boo9bobo28bo7bo$130bobo13bo3boo3boo8b3o4boo4b o18bo7bo3bo$130boo14bo3boo12b3o4bobboobobo17bo9bobo$147bobo15b3o4b3obo 3bo12bobbo$148bo9boo6bobo4boobo3bo12boo$157bobo7boo6boo3bo$157bo19bobo $156boo20bo! golly-3.3-src/Patterns/Life/Miscellaneous/diagfuse1.rle0000644000175000017500000000365412026730263020062 00000000000000#C Jason Summers, 25 Aug 1999 (minor optimizations made later). #C From "jslife" pattern collection. x = 127, y = 133, rule = B3/S23 56boo$52b4oboo$25b3o24b6o$53b4o$25bo37b4o$62bo3bo$57boo7bo$46bo9b4obbo bbo$28b3o13boo9bo3boo$45boo9b4obbobbo$28b6o8bobbo4boo5boo7bo$33b3o6bob o4bobbo9bo3bo$35bo8bo5b3o10b4o$33bobo7bobo4boo$33boo8bobo$bb3o29boo9b oo7b6o$3boo4bo25bo17bo5bo$bb3o3bobo48bo$8bobo42bo4bo$9bo45boo3$16bo10b obbo$15bobo13bo$14bobbo9bo3bo$15boo11b4o$24bo$23bobo$22bobbo$23boo5$ 28bo60boo$27bobo55b4oboo$26bobbo55b6o$bbobo22boo57b4o$bbo33bo59b4o$bbo 19bobo10bobo57bo3bo$8bobo14bo8bobbo61bo$8bobo14bo9boo29boo15bo7boobbo bbo$8bobo11bobbo39booboo12boo7b3o$10bo12b3o38bo3boo13bobo5boobbobbo$ 10bo52boo4bo15bo13bo$10booboo47b3obbobo7b3o5b3o7bo3bo$11bobboo27bo19bo bboobo7bo4bo13b4o$11b3oboo26bobo18boo11bo5bo$43boo33boo3bo$38b3o40boo 4b6o$40bo7bo37bo5bo$39bo7bobo42bo$46bobbo36bo4bo$47boo39boo$10boo$13b oo$8bobboo47bobbo$8b3obb3o48bo$7bobo5bo44bo3bo$61b4o$$11bo$10boboo46bo $10boboo45bobo54boo$boo8boo45bobbo50b4oboo$b3o12bobo40boo51b6o$b3o11bo 32bobo62b4o$b3o4bo6bo3bo31bo71b4o$oboo3bobo5bo3bo17bo13bo70bo3bo$3o3b ooboo4bo20b3o9bobbo61boo3bo7bo$bo4booboo4bobbo16b3obo9b3o60bo3b4obbobb o$7b3o5b3o16bo4bo56bo15bobb3oboo$8bo24boo3bo56b3o15b7obbobbo$33bo3boo 55b4o11bo8bo7bo$5bobobobo22boo37bo19boo13bobo11bo3bo$4bo7bo21b5o34bobo 18boobboo7bo15b4o$4bo7bo60boo20b5o8boboo$4bobbobobbo83b3o10boo$4b3o3b 3o101b6o$70b3o40bo5bo$72bo46bo$71bo41bo4bo$115boo$37b3o$37bobbo$37bobb o46bobbo$91bo$41bo45bo3bo$34bo3bobbo46b4o$33b3o3boo$$27boo6b3o$27b3o7b o4bobo$27b3o7bo3bo39bobo$27b3o11bo3bo38bo$26boboo11bo3bo38bo$26b3o12bo 39bobbo$27bo5b3o5bobbo37b3o$33b3o5b3o$34bo35bo$69b3o$31bobobobo30boob oo$30bo7bo28b3obboo$30bo7bo29boobboo$30bobbobobbo32b3o$30b3o3b3o32boo 8$71bo$70bobo$69bo3bo$70boboo$72bo$60boo4boo$60b3obbobbo6bobo$60b3obbo bbo5bo$60b3o4boo5bo3bo$59boboo3b3o5bo3bo$59b3o4b3o5bo$60bo4booboo4bobb o$66b3o5b3o$67bo$$64bobobobo$63bo7bo$63bo7bo$63bobbobobbo$63b3o3b3o! golly-3.3-src/Patterns/Life/Miscellaneous/lightspeed.rle0000644000175000017500000000726012026730263020337 00000000000000#C This is a mechanism that could be used for lightspeed #C communication (note the lone glider in the pattern on the #C left). The only catch is that we need a way to create long #C waves of closely spaced gliders. This can be done by using #C many edge-shooting glider guns, but it requires a lot of #C space. The completed device would be shaped like a very #C elongated diamond, with lightspeed communication occurring #C across the short diagonal. #C Jason Summers, 29 Oct 1999; from "jslife" pattern collection. x = 781, y = 364, rule = B3/S23 204boo423boo$203b3o422b3o$203boobo421boobo$204b3o422b3o$205bo424bo78$ 154bo424bo$155boo423boo$154boo423boo3$151bo424bo$152boo423boo$151boo 423boo3$148bo424bo$149boo423boo$148boo423boo3$145bo424bo$146boo423boo$ 145boo423boo3$142bo424bo$143boo423boo$142boo423boo3$139bo424bo$140boo 423boo$139boo423boo3$136bo424bo$137boo423boo$136boo423boo3$133bo424bo$ 134boo423boo$133boo423boo3$130bo424bo$131boo423boo$130boo423boo3$127bo 424bo$128boo423boo$127boo423boo3$124bo424bo$125boo423boo$124boo423boo 3$121bo424bo$122boo423boo$121boo423boo3$118bo424bo$119boo423boo$118boo 423boo3$115bo424bo$116boo423boo$115boo423boo$353boo423boo$352b4o421b4o $112bo238booboo181bo238booboo$113boo237boo184boo237boo$112boo423boo3$ 109bo424bo$110boo423boo$109boo423boo3$106bo424bo$107boo423boo$106boo 423boo3$103bo424bo$104boo423boo$103boo423boo3$100bo424bo$101boo423boo$ 100boo423boo3$97bo424bo$98boo423boo$97boo423boo3$94bo424bo$95boo423boo $94boo423boo3$91bo424bo$92boo423boo$91boo423boo3$88bo424bo$89boo423boo $88boo423boo3$85bo424bo$86boo423boo$85boo423boo3$82bo424bo$83boo423boo $82boo423boo3$79bo424bo$80boo423boo$79boo196b3o224boo196b3o$277bo424bo $278bo424bo$76bo195b3o226bo195b3o$77boo193bo229boo193bo$76boo195bo227b oo195bo$267b3o422b3o$267bo424bo$73bo194bo229bo194bo$74boo186b3o234boo 186b3o$73boo187bo235boo187bo$263bo424bo$257b3o422b3o$70bo186bo237bo 186bo$71boo185bo237boo185bo$70boo180b3o240boo180b3o$252bo424bo$253bo 424bo$67bo179b3o242bo179b3o$68boo177bo245boo177bo$67boo179bo243boo179b o$242b3o422b3o$242bo424bo$64bo178bo245bo178bo$65boo170b3o250boo170b3o$ 64boo171bo251boo171bo$238bo424bo$232b3o422b3o$61bo170bo253bo170bo$62b oo169bo253boo169bo$61boo164b3o256boo164b3o$227bo424bo$228bo424bo$58bo 163b3o258bo163b3o$59boo161bo261boo161bo$58boo163bo259boo163bo$217b3o 422b3o$217bo424bo$55bo162bo261bo162bo$56boo154b3o266boo154b3o$55boo 155bo267boo155bo$213bo424bo$207b3o422b3o$52bo154bo269bo154bo$53boo153b o269boo153bo$52boo148b3o272boo148b3o$202bo424bo$203bo424bo$49bo147b3o 274bo147b3o$50boo145bo277boo145bo$49boo147bo275boo147bo$192b3o422b3o$ 192bo424bo$46bo146bo277bo146bo$47boo138b3o282boo138b3o$46boo139bo283b oo139bo$188bo424bo$182b3o422b3o$43bo138bo285bo138bo$44boo137bo285boo 137bo$43boo132b3o288boo132b3o$177bo424bo$178bo424bo$40bo131b3o290bo 131b3o$41boo129bo293boo129bo$40boo131bo291boo131bo$167b3o422b3o$167bo 424bo$37bo130bo293bo130bo$38boo122b3o298boo122b3o$37boo123bo299boo123b o$163bo424bo$157b3o422b3o$34bo122bo301bo122bo$35boo121bo301boo121bo$ 34boo116b3o304boo116b3o$152bo424bo$153bo424bo$31bo115b3o306bo115b3o$ 32boo113bo309boo113bo$31boo115bo307boo115bo$142b3o422b3o$142bo424bo$ 28bo114bo309bo114bo$29boo106b3o314boo106b3o$28boo107bo315boo107bo$138b o424bo$132b3o422b3o$132bo424bo$133bo424bo$127b3o422b3o$127bo424bo$128b o424bo$122b3o422b3o$122bo424bo$123bo424bo$117b3o422b3o$117bo424bo$118b o424bo$112b3o422b3o$112bo424bo$113bo424bo$107b3o422b3o$107bo424bo$108b o424bo$102b3o422b3o$102bo424bo$103bo424bo$97b3o422b3o$97bo424bo$98bo 424bo$92b3o422b3o$92bo424bo$93bo424bo$87b3o422b3o$87bo424bo$88bo424bo$ 82b3o422b3o$82bo424bo$83bo424bo$77b3o422b3o$77bo424bo$78bo424bo$72b3o 422b3o$30b3o39bo424bo$32bo40bo424bo$31bo20$8b3o422b3o$10bo424bo$9bo 424bo3$6b3o422b3o$3o5bo416b3o5bo$bbo4bo419bo4bo$bo424bo! golly-3.3-src/Patterns/Life/Miscellaneous/Calcyman-primer.zip0000644000175000017500000000273212060231465021247 00000000000000PK3%;Calcyman-primer.rleUX “PU¡Jõ-ÝJÃ@…ïy‡c+¨†$‚¨Ð ‰`{!ôÂX×I³¸?avRš·w“x5Ü3ßül[ÔÕ.Š– ½ÄqK„B³Ód-6ŽàG÷MŒ3yb%Ë<Û¶8 ÆH³9g¬âÙíµf\À;)ƒÑ¿Ä1ø»ˆÍi†ñƒ!öÅB ÞNxª I‹èTLR‰¯ž•.©ÄäÂ…ržàF+Ë€Ð-ݤtã…ÎÄèªit×{þ…×ÅÚ*«'—vºûQ§aÔ=ñCúŸjBSU/yvÅu)…ÇbýÎëîyvhn7PK#ƒ£˜é>PK]bA Primer.ruleUX “PŒ“Põ}“ao›0†¿ß¯8u¶In$!©R»6Ú&µk•´ÚÇÉ!Gp6²M»¨ÚŸ!!Z ‹„áxÞ÷ÎçC\Οngø EAà }ïÜXn u•ÚŒ[4UY*m r ÎÊs,k;ʪX’Æ5IÒÜ*=€ï+CµÑˆBä\×N™ˆ².¥ð†¸Äo"Ù6J~4x¶Û÷ Kn-iÉ@É|‹¡‡Öqƒ)7ð1#W‘^ÒT¨Bë-Un›â*âI†BZZ“fH¿*-¦Jïΰוhjd2Q¶8ˆñF½ÊcaøÞJº ¤9%nÞ­gÔMîucœwYøs#r—°‚çØ¸5Mbüñó¸³ÈË*MéPnãâÀàÅ}~~ñæ1ŸlÈFlÌB6a›þi´å -9¡­NhtBKOhëZö­ÅÅ[ÀF;ãóÅ›ïLá^Ú´yï³<&gK–°#–²5 `|ĆÎ×’ç=ó¯ËF°7nÜmú¤†ÓNE£Êغ¶Œ…ýÉÞ;9uØÚ¥¹ÿÆ?ªèAÐÃ&= †=-ŽzXØÃàòúþö~¾p-`0£‡ncwob6O?ˆê£&Ú8ðæ-D´ &͹á5oÓ6jòþPK㽄,KPK ™]bA __MACOSX/UX “P“PõPK]bA__MACOSX/._Primer.ruleUX “PŒ“Põc`cg`b`ðMLVðVˆP€'q%ƒø«˜!Ä5"„/p bH¾ÎÕ1ˆùÑ”0"ÄÅ“ósõ rRõBR+J\ó’óS2óÒ’¡!nºÖ†Æ&F†æ–&PK2_øe«PK3%;#ƒ£˜é> @íCalcyman-primer.rleUX“PU¡JPK]bA㽄,K @¤:Primer.ruleUX“PŒ“PPK ™]bA @ýA¯__MACOSX/UX“P“PPK]bA2_øe« @¤æ__MACOSX/._Primer.ruleUX“PŒ“PPK%Ÿgolly-3.3-src/Patterns/Life/Miscellaneous/four-primers.rle.gz0000644000175000017500000004064112026730263021260 00000000000000‹Œ)¢Jfour-primers.rle¬}[d9rÞûûÚ~Ø…gƇw z°$_!¬¯û5«;{º¼5•£ºìxüë}ø}_ÏÉêõ®tgeæ!ƒÁ`Üdþæïÿ×ÿÇÿxúçëóß~[SûæÛ\—_ÿê7úO××§ÓŸ.OÏ÷×ÇçÓõãé|úÏç.ãÝ?Þ¼œ~|ºß>=¾þpwy:=ß_þtùnôCßo¿=…ç—Ó¿¼ž?<_N¿}ýñÇ­ÕÓý÷Ÿ^~÷×hrú§íÓýãù}Ow?Ÿþár~<ý—û÷ܽ>~s §ß_ÿtü°®ÝþùéúáõýåyCçùåérþa ô0ÿt¯§çÏÛãO÷?>Ÿž.?>]ž//÷ß_ÂÖÏß~ºÖLîÇ ÿñþáã«óÝ6òéåÓåôWϯõ»ËåÓýŸ.%ç—SˆËïO/¶t{º||¸¼¹>Î>\>œîàý6þàåzzy}ÂW„ÁaÙU3yýñ§óÓ‡ÓùñÃ6£Ç ¥—í«ÓO÷/Ÿéúúòãë˘ïòñü< ÇÇßµIб×Óç—÷Ÿµ>nÍåãýÓ¶4?žïŸ¾ûî;BùÃår:?<_O~xÿóçÇoÛÓwÿ÷þÇoN?}ºÿiúÃëÃùåò¼4;¿lÇ$ÏB%,ß>¿l-NO¯—oN¯ÏÕ±Jç',ÀûëãÇûï_ŸÎ/GY\~>½ütÝHôððü8gÌå ç<\>:ãüþò“¦ø›0Øæ¿Ÿ7xxýaÃøyãšrú§m×Äe)ìó?ùŽ §lx^ž‰ÊöíÓϧë˧­ë÷÷Ç^Î?7º޾~>}|ºþpút~ø¨Õ`ÃçÓã€1–óþ±Ów§¿ûyãˆÿýú<¨0£øtåî²qîŒblPÿtÙæl÷ôþü¸µ¨~ø´(®¯w—gÁ»\6ÞyÑ#±øéü´½<¿lÏ>^ŸÀtç‡û—Ÿ¿sÂ`òšöûOçÇï7ÆÛ@^‡ø Î~¾ßHüøþgÇp(À‘üÆÐœ¼¸ÑõÙYq[úç1Þã&A§„!°ß_^(uRÇ4ô€µÉnƒÞ¿¿>}ØØìág—¯ô´—¯‡ëO_–¯øµòõ_jhmÈn3Øæø´­è&&ß¿>>û¹>ˆ'æãëãû¡ÎƒþåõþOç‡m¡oVûßýËëáÛ ÌÔ¹ÎJÏ×)@åw†‚N{<~ØVüÃß°ÿý&>×ׇ&m’Ç÷—o†ø†LÞ Ŭ·Ÿ¶Åx¸| ”±Cßßo³¿­ðfh®/2èå¼ Ðýæ çM3?Þ¿P¦4´ËÆ­Ï}J»Ö›LþvýÝßœŠ}·)Žûñe(ßœbù&ÓæãOO— !~Ã7§´5ÌÄååý/ŠÆ ÒÆ"Ÿ“ˆ[apË/ŸŽ æ¦ÿ-‡¥¯×àŽŸh³±Öûa’(€/çû½¯RуÛ6Pw¯/ÓXòŽqÛõ ÉÍÏwÛ <œŸ¾‡‘<¾>_¤Q®˜EÝn¾ikØQxGG…*“ûñáõY|1òú|?Xü"µ«°´é»Àæš ÄÃFÏg™–¡î.RyN^Ÿ¬û—áùœ!HSË?]€ÒGxuç§ûmmžÍxÅoÿùæÌÌâÿpþä‡×÷Ÿæ‡ëáa3m±@š3Ù•—y0 >% ƒ>~ø7d³ÿsúÛSÈkþæôóx·Äå8Û‡¿Kÿþ1ýúW9,wéÂöò./ëÝ5Þ]Â?ïR[íY¨w×¼ý­øúÐ,”»ëï‹=®[ÛÌgøö.ŽÇö´ qûd|Šh÷ë_ïò6æµo‰]aÏ^ðeÈhŒÏè´a—0‘^ÓÀç.Žo#ÞšÖñ₾ =âxÛ1d(ãæ¾µóâŒÕß§ŸÛœM(l¨Ýø­^×­Ù¯•Ö¨FBϽmÁ›èzøÄˆ8ÈSÑo6:&|Èwã[5«\È+ˆ³à¡¾À¤y+ÁÂhFæñh›ÛŽ+RE34öË\,[ŠœQôO£¿è‚ç`ì¼0h¾à› ±ú kQA%v"F6Õª–\ˈµä3€Y ›F¯êŸ6@úZ ^Û>7 ˜ó3b­8›ÖÑ‚<®[§±à|WÒv`Ê$°á† ?§Æ0z7?Sr@uLð»Q²Ñ±T•ôcˆ "mßi)Êöh®×è9úuÀ¹‹›hbR(.À¢CáÊŒ>X£¬U€ßþl¤¹fŸ„ ^êX÷ƒXgã™eë\Çy´\‰L§¢)ï¸g´ªÀÒ°à¹qœø-,“Å_hÅQ÷\ ¢jm¸æƒØ4Ür_ôŽÎ€Ûó†ÆºN0£U1cÆBq¹3W$®Q*caÊÀ;-Ö¯«]‚¢Dl‰Á£1E€4HR­EŒÓbiëÎGX„."‚…ÑÐ5JÑ»¶Ìuwp ša4@'!†(ìty,V¨p¬=æÈ¥.%83PŽÃö¬áØ+ " ØR›%îM^3¸¯b5ê cÕ’ íÂ5*/säÍWM)ô FÓÔÑ<l”øÈ±ÁѦêHœÌF$bW`› _j”T§­Ä…ôj"[÷©)WQ,œ7¡É®ÒÁÚB˜[’‘1¥µŽ¡A‘Þ%^“BÞÅ“1cæ4‚è§Yå­¨• È&EzEsPzZÚ<ä ð©PÝhܼL+\ Ñ“3‰2U‚Ö•&e›¥7qƒ¹‡&%ÜÑÓEè5Ê9iN˜ž$è_ô=H°fê>ç<šC·8õžIR ™k{Ř‘/ͤÁÙ§a˜z'‡"šíД©Ûʾ%ÎÂÙ#7hÞ$ó&Ã8Ž` V°ž”÷¾˜J£öH´íxQƒ‹¢NjåàšaÀ"M J8ë0!Ðñ‹;.ÕÉt)8„WPÌhbMZv÷æàIÉK0x)QsY…q¥' ‡i:Zp|°¤U€pÚ¹]eðŠÀÀø¡'eåàf±mDãVÔbˆ»Y>ŠÃÐ7zjòQÁ6l¹3{Û²©PtàÜ×’°êlìÑ€)gç+—tð½ï´½ï—d Íæ’ÙUvåè n}#¡¬”|tÉ”sÚî ›Ž5”rì\TÉUp|}ˆ­iv…G“’ÁŸØŽæzt8åè ËÁ5x*öIr8k–·“á¶JR6"e GÈð/@ILsÓGãÛr‡TŒ –©àô0Å1r6«›hºÝíD zB¡C#iÀò€©G©ôeE Ü×”±‰„ºÁ!W¸Qã?€ {‡F%®f‚5Íu…xvÁ–s+• Í’ bHµ¤M;ñ¬$]q_uLÕX¾wP¤4c¼uï 8uàjF–níÖFÇ~ˆP“ìoªt«+ù,322­Ý‚\ŒWé,îÝlŒä ÉJ‘Z›;ˆ‘f_µþcü±˜ Ô/ãq¥á\$–mħS Gw a\É–ÅU@äPP9ÑOA–›°k]¤âÅØÝ…w’‹Ð’)i8WÔÇuª@Ì\– É"*]@‹"ìNÌì$­]Ý6Ýuk4{$Á¦î¶Õ™à(O]Nu5IÙ{êdÈÕÏm›g{›žÈ°ù²JÃY¬þ®u@KR9qÑ ˜Ä‚«…¦ ,¦µó°ârʏqÌk¯j ôÙXv|tÏþÁ&Øp2x\›& ú„hŽ $mç…Å®xJrîÆ@ª\4OD2X#!RqïùÖãhʨ¤eŒE!ÏýÍYTš©x¤€^‘è$fMz>D<ƒÁ1« 7uB4s »üjú¤R49È|„t àõ2¶2ÚGtàƒ|E°“3I4å­!^ˆ€¹Ê$q}Ó÷…ÌÕ©¤d–Ý“ò|Y¬CÄu7c²È?°i²¦Ð‹Q f¨…‘ÀȶxpÙéw— ¬ÄÙ*xaŒ#œS#œéJEÄ&ì•~aèÀ¥C™0ñÊ‚ðéÒäUÄmžŒQгÈÃ-´Âü\‹äeÅÜø'k+ÊZ`žZ3ç9âEʇê«‘ª€ %•5¶"¹*úwPvƒ©X¬É¯gZ2ÇAÖ¢ÁèBt(9 ¤è lVdtlÆ#vš‰9ö5oŒ" ͱa°:ˆ“BÖ|/ëêÖIZ>Iè“Ö,d[¡ºBŠÚlK —£ö¡>h^¡± ¥Ñz]§»°­y«†Å‡·\•ÍR2ñ¶Úƒøu¥dmøö‰upM,rнi¨ °­²a[CJ›PˆÄy0o^VNNW V’™Õ¶˜N\Qz”ÔÛ‹¸eÀ*0BLöIå”+¹`ƒ þÆÀ ”t%8­<&Œ.‰0ÌÕz›ÕÖ1ÑýËtâh™‡F+阊 ¢­TòÌà; í™Lc¤i qäc–Š9Ð5U€\gKÜÀžg©šÉÅYöÝ¡Ké„ê³`*¬´¹ùÚMÁ•»6-ã­ããiqó"èÏDAQâ·[’q1–Jõ6á¼`¤¬‰ŠŒ#´×Æ:Bˆ8¢ÁÎÕy#}]öËQñúJç †`¦'“†I*Ë]ÑZšS„áës†p`U¡ß8+Ò0ÃFHgGHü" çGff¬>è ÷‹Ëó­¥Ê˘¶a¥¸!¿-1 8ʼ/~ÁÆÅ–÷­½Ê©Rï“;| ©ºÌäcy 7f)—`Ê–ÀÝ+I¯¼‰Y?:óëÁää%ÏÕ­š\6×Ûc¹E¡¿1e•‘~a~ØdðŒÜYé°P Ÿ3Y¥ÎMW[ÁúGD›€—–õÖVÕ.aЫâ/LÛÖ`8t|k ž¢cÝ•Â^-Ϭ'É€•2B¤4-T§ÃÞ#T h›W f‚rMèiçyZ!ƒ2% \oÏŸ <õz0“‹dDè— Ó´ÓY–ªý̺1¯˜SDoÎ=™ÈAMRMÄÞåS¿¢½ZÈoÎd±„£ÌhQK=FÙÆ5yñÒhÊÆ§{&¤”˜Ê½·b`  °Û´±'@;#N oWbfXG4b‹RÖ ò»‚LHÌmã7Eϵ0Ä aïÁƒíÝö÷a§%TYÒVA¤\Ýe/&ý}AFTÕži'L)›t3€ äÎÈPÃX"©0"¾BbVµžÇüÇ€@¾1¿ðn¬å1-Yâ§çHv6Ûü¢FeyK €Ë™&‚"®KAŒÞdV;å9Úý RÈu 0uVÌiëûRerê Ó[3ñÆ¥ÉàI nGbõ«”Í» Êl}­[ù ìºPî´/\—üè´ðãºG½ƒƒHoqËš½ú+¶ù1PtLÈÏsk®Ü#kCUNýЄ’r¤+p…oEojÛé3þÈ+žCÓÐò(¤oÒ"þ"îƒ=G•§Ñ™ž/˜‚‘Õ'pWHSX{†‡ê©ÀKŽg³$4úÓ#!÷Ù—P­µsØdŒ?Yê/'~V®9yâÀ-û1ÃpkÌZÈ& / e÷*F¶05Ó·fŠ™Àn-[íCQ@iŠ´^ ôå2o.ÌB+‰¼°ím_´KT±×#•%Õà‹²ªG´Í‚¸¢âû‚WYoÖÌU« Š ”X¥óú@”n6–BEèêt‚Mí¿UË-‹;¸TX«FŽÃìªFe®°X ^†¨ò܆†ARÅZÕâcTÛxSβ,6‚«€H’ûÝ2¤Ðã¥f7!‹xUjj^e‘ÁRC? ÔI¤‹2Â[ß§4h+~ÜÖt“8¨ ¿@UB`@„0ä`êJáËñoËÏH;•¥çâ1€ síÉÂ~›pFÕä!ö×fH´T\!Bâ ™,1°Í²‰”Í´ÿSǼ‰h¦O%4>jónçÇ}Õä#ĉJhIõ'Ô 8Ôó#+—ÝGÀL@Ëü„å S ªVËßa^Ò£IɆ$jÑ¿ ú€ ?¯cLJ8½“ñÅ9{ÑÖàKþ”Õew ˜« ÇräÜ<ñ}éDµ£7¨)¾ÒoD–Y,ß2.Š#úŽBaWx=RÀÊbE¡F;!–QÚ¤êS­TúÌö@ů¾-C¡ÓP.Sø 4tò T)ž3J=d ÂÄ£Y3ù†fº¿Ü&gSNNï`¾Uë;$g4Óª“9Rȳ+Òæ¤a¦Ê¤•ãB  û(¨bWÕ^r+Ä•ÈÆ¨68ç‡kek!,j"°¹ûÏ ª34@Ò“¢#zƒÒq›„O„E7¤å˜ãÛ¼ÁÖ0ªxÏZkQÉW«–Av½u¨gªÐîC†€%¬ûâìR¦'y¬êèÖÍ%ñÚÐtû¦ E_,ú×Y+š‡ú mXS:?ìôYÁ)25*&'&,bæëZ>£„K.\)Û¥sŒˆ…AhÞ¼À ЦI«ú›t‚JpR2³ Éö" K™^b©©¾-áaÍ0Œ½Çðh#13­VŒkᢴù©˜×$¿bG‡«Xôx–¬@8‹yMf¬NwÔ0G½)y!q&Yomîú†ˆ{Óm±š?Z-IRtò³Š³P;Ò<´¶Ë$Œê‘«óJ0 `¶g¤«8ØÒ)ÌUË™Ví4i"7‰t¤ç¯:)‹›€Š¤G®JKŠ~5@´‡ÇêÎd´P&TD ¤Q.ûýGØ·FyÐÅ0ážj# ¨jÕÈ.Э‡©©zy=XO erb[L€:î+…)Ü9¨ñºbТr(…Å®ý’޹[,ƒ}u¥Å˜.À,JUsgŠ'Ëú­rÖ(MpˆA;̸Èï 7K/ ¦÷©g-è X§iF˜–;¾¢yûØ‚LK“2ˆÃñ DrŠ;>èLHñ-2RÓÏH~ìÃ2¸ª­Q{FŽ(¾CÙõÜ4i*­â·C?ƒ+s³K¬fŠB1ëŽR—’o“R!{Ê_š47-šl¡¥”˜I26ÇaXú;‡ÝNË»Rþ´#ÒµƒM´¼:ºÙÛõž¤ˆÆèXú°ôl ¶ý´h¿^SóÚ_åb$Ñììl9ýüP%©Õè 1fO[€ée@uX{1Ø€£4xŸG3 Ô¨("œ}gP÷µ}Zã­´,ʇo9`5ºe1ßÚ,¡ÕtÙ×BûŠ…€Àç .VšúËv4¬QÄj‡2áÉ ˆPÐh Jèfô?kòl·qºîÒ!1@MÁ#²XØkŽ_t^¡½fýT“Ĉ==È‘¾•’ÅL'O_醽‹:NE ^+%Œ@_åIn`0‡,ƒR¡q áÆ³Õ°äQ¨¿o½çñ<íâgºu=øå‚߯ú*Qˆ:ÃÇԪߕ0 sHOÅ•ƒ‡±c¨u£]rã€ôX§-&½Ñ6?}·Mɧ7ŸX#/‡rÙm€JÁ5}l‡¡,ëdIrªà©E¿”}+¬£ß07ÉŠé6zå`Eĵ=ˆP<©æ=Ü„0Ï^æzØlë1WhSvabˆDáÒ6 7ié _Ì!gb3ôíÒ¶—IÔõ&¥ñ®×íµiy­<ß'e“w{™]Æ@õ™ÃAŸª½JdœµÞ†v Ø15›QA,]…V¦ +GUì’˜B™Mø:ŒyžãÁŒREgAWf® 'Á>ð ®ô[÷»ëüÚAùv^4 äÉ“ë4˜VÜu‹ôœVþ‘…¦ ýÖ {Þ˜4Ç4MŒ…ß‹Ÿ’¼Qâ— 0¥¼ Ït ûåIPBý’Ãpë.VL&RJ`œ D* Xþ™.N,‰«ž%ãÁìIãfˆø•^˜”1RL‰g;@»ÑlM§íÈ MÕ[÷òÚÀ^<Ñ}qH× 2iFc&ZrÙ;ÅêW󼵪&nð¦+ÒéŠ+$œæ–ï¢bG€KôÊZ*!ÕŤËBSæÁì3ŠXowwFwhˇ“”J®ðv¼Yt[ÜFçö¯ÄCٷٲ"ó0vßà±Mññ(Äe+G‡Çã2wJ ïÊ/Èp1-õ¶²ˆ>"‘˜TØËâ5Ð#«öÚû¤ØW–nÎôб—ÝéûW3Ö¤-ðad,+hDÉŒ¾W2Ãu’ϨòT vô["óª•bŠ¥’IéQ«D^m«l›Ùšl„†:‘§Dâšçc ¯še´„x0 4Az\…ª@¥Ž¶Å}W 4»É ¢©6üt¼¤¡Œ)ÊøvÆÞ³ïžÅ}0gÝÀ ·Y(îZ?6•;Nnk^ÔK}ñzq¿ÅѲôJn• ©Tíï5ƒÞ={²šŸ¤ªQÁÎ3ÙRóm'!°šWƪÜÖ]r–ÌÓ“ãkð·MVdÚ'ˆmHŸ}F—Ã.šÏ ÛÈãË*00KËm—b»D@-bX=¤ÚShjÖDó!¯Â§¨Ü Q[8í¡!'i-@‡,ªÈݱ¡"dØlÔQ¦/ñÞ7-ú¾|ƒº7+w‰ýúÕ2¡„”΂£-3@}4¬†^ßñÚ¼¥ßV¤Ž&6™GÀ½:-`›~ÞÛWpÚq]ã²Ï`Æ2'A·^þt¸C/¤`È‘m1ø.ùShh.#êÑdߟ“ÌýÆ´¬•yìà^ͬ†½QY«“Öäm:+ˆµ·$h…YÙQEo~(8eέi]ëѲÄXwíãÙ!Fk¡SÛ×hfí¸O»#0énþ$â˜æ7£J®³À4u€,œFºÕO#»@BUSÍ&ÀŒ?œ:Q!ïõVÓö mëhAЛHÓ3å$eírôr<×q]¾¿Ü/@¶œ!Ýñyfä1À¥ céM]Iûª!›ÎÇΘÅ$¼4©–§hG$!Gí%ý1:LÝ¡J¿%šo?&™-qRƒÅŽóN°Ì‘-ªIC¥ðFM÷ ÿøMPl™jðmMÕýÖ‚˜ãßàKÅ{YÁ:CS+îëùA#‰!6VšE>@Kë´ Üð8fÍ6IíûЇJCušcWm%ïKñ×dì1«ïš®º.Bb®\ÊBßéÏ€šÇæ^p—½-omÓª?˜ ³³b˜¾_Íl íR‹ ˆÔöYô‚ìÛ W •ιóTŽŽÐUò,`Ö™=‡@9,°'TȸåCåŽG4Í"ÙJR4•ýÎÈ©îC*ÝÜÌÔð蟰›Õu-ÆÝQ S*då#2ú]¾'k‡Ú>„ ˆÍ6P2ÆNsÙƒªëHrçÔ]5!×Ñ“~G–+C«í²"Œ† NïFy³ ‡´îû»Ú[Õ^Xb7 Gún²òˆU[¾mmÌHfž–éʹñœýÛ’ÏÚªqLêö4áã—^Â2æð«mNîKS9ÞÉy­‰›OóL,Hî»R}U×}‰T-”%» µULB1þxD¤7_û§¡)öUӃцêÌm±˜Ô• Ö5¡‹‹ñæ/B|-+Þ¹†·©ùª×¼B"›sÃ0«3ÁX®œ#i5ǰ#³%?›*‘v/~™ Ä:o™#4Ô?4¤*s=Àá}WÕ°m€ÍªHc+0âfó$ñZ\7i'ñ`TÁœr»µ:«¨œÿë^x{ EŒa Ï{! ÆÖnƒy½¹™  ›*Õ–¦ÿŽ‚¡­¹†ú¸ŒlÒaÑÿb6®7(pùXüÞü$ÚÌoÙ a!P[ÿDœ‹¿‘XD<ÇÂÐgTA2÷¾{®š¤™${g59–ÈÏ€lÎ~_½ªUá ê ë¸u´a>lUU[®7û­ê²DZi¦l€å ø/Àùô[9⼯ç—>¢°J߀8‡&ÙÇ Ì—Ÿ[¸ú/¿é€ãG=·ÕÞ–ø»›¯;«|jò½’îùÅ_öòð—÷öÚd¾_Òu)âwYÐ⨞G«;ÞH‘þ[¬–¼ÿ_`ºîˆ»ÕÌMSìeöòTê>O˜v¨aIväf¼Ép%±š{O:Xð2¶¡£“xE¿2X /..Ò9lJvsT3£DÚ•âOßa]¸ËY}û¾Bó‹}ûT7){á7ÊlXÊUa™:ðjÝÚÔ¦Í;QLß6Ë—«¨..Å^BÉ:\P|W`£ !X ­ÕêÂÓ&iB¨è€Ã7øœƒI ýJׄ GW+%“Ê:ä]¾jݯ çйH%‡¢5̓?!…Àaèhêü†œ¬ž îö%!~ÖÙZaSTŽX  ¯:)ù¾¬BÖøf_vq*æ9—Ö|{Ô¹!S5Ã{ªÔ+ÒŽ-Ÿ¨­ø˜r_Y´ñz× “È ‡Ž›ÛYY&û™ÐEsœ‚ÜŠ¡:*Û‘9E¨Ú‡„ϸ ´ì/ºPQ¢²‡ùª»ôà»Ôƒàz°\ØÎ.ž´ÃJÅ‚g“΃Lîqº“äªüçÝ @+ýþ®²Т9×A‡ÊK Z…ÉBåà^侨6ñ—u•µ^7|ÀwÇäSßKT’2Wq„_€–VeÉzÆ€ÿ-RaEäý6GÖv3ìšÖ xŲ¬;9ÔÞA›ÉP“ ÖÉø‚ø}¿ìÖSÛ/i9ü «méì~{‚qÒá6Ý’–y1ðdààVòjõ²@ÈDÛvˆ™äelmr`ªÖFìT*ÖŠï!}Ž•upJ= ”‘cψÍ,`üe£ð®Œ!¯'B=“æÚ|,Œ Zß•¬½“Æ ¢ f{[âGA¯rÑä›Àðú6±êj¿IS$Оåɇݬ䄠Э.ó)Ùk>£Nã)pB&£F ˜÷¹Å^úÑ;¾–‘W½ .3#íâ"Ò8êXÝÕ“‹üû¼×ì`Gœÿ4kbòíï£âî –â<è,òrÇÊõzÍÄ,g%ïJvßMÖÞBÃ7ŒJ“¬,ûŒìsŸ;âtù„ð/o·+vÆ2ÊÍ6«Öç¼=Omÿ䈵F;®wÄhŠâ¶r+1U&Ìõþã±æªBa»-·»Ç奥eoeªtùîfú¦ü>ø->ºDk Z1¯KqÒÌŽÍûÕ•KPê-¯à·’ë«8kçhAd€y•ýCi´Á¿®ªHäÞ,Š(ç4²ö •oŒZ¥ô‘;³‰pŠÔ‚ß°0UÇ:‘§ª’YðÞ˜§eBZeãÀÄd¾jV·Ií¯KÙ¾Hv¶ ¡z­ P\›Õ÷ø®[ŒÇ#R|*¯t+X»Ÿ¹ݤ†J¼Ùˆ{ ¯«3Nˆ…åµÜÔÈTV‡®Ä­P§»-Ø7ŒY >+æ@Ùøfƒ#N‡®®º(„KŠ«ç-[“)›:ÚñD{pϸÓÊøÙMY`Ëæz»‘s$+Eà Ùak¢4O0#td»’²¿9®‡sl!Í=wªvÔ›hšëaw*t;Ó±—ûd·D³~“'ÍfqQDã¤3ª¨¨çÒË*ú©"8Üí´Rv± Q‹y†,Àäªr²©ì&—ýÜO[8ŒjåˆNÿ;-ûµ/]zA¶X_ŽwdŦùóÐç®3_+2Öò’àg·"Ú74ÒÂRuyP)iŸNvNÚŒZ®ZÍBg @âÝ lË4­…é¶jöd.dîŸ r>ò‘W¶©æ7¥ÆÀŽÞ,©Z' rj¹Xm„ÆZwBç¡ ]‹Ö˜R— -vÍàŠX—µˆ@âm¼”×Û¸gY¹oáºJ® ïØ]à‰/ó>:ß•«©æÑÑYI¼ed*oÍßšÏÊÖfE8 !*~~o½½§¾³fô€ØŽs30V8A冒p* ªƒË9:äDDì¢*hÚ¢^ŒžÔɼÐõX‚l„Ô4#ÒaÂNVPžðëæ½`щB‹ëj•FÅEô“@5ÿ½ŸÕâxáRÙ^Ñ7á8~u¸Jq´Õ€Ne cõôª#-N'”9 ØBÉÁˆÑoÏi„%ÌÔ3`å#ʬaÍám&Ûs÷ò %ø’sÂV×PÛ:¶nµCï)A¨»äˆªZÄa žõÉ÷W›§¿<ƒ1 81Wç2íJ²êZoOX´åMu!(ç=­c›†8.¶°~îF 7¥€±dì¨$À¢|~ù~ ,y÷#~À÷¶q®yVâE.pùŠ+-JÄÍ`LI#&/‡ò©N­®š©ø¥Ê6’‡c<îG½žkž0­1Øy‡åæ”G‹ªÉB^›¦¸¡QÿÞòè‹Hý®—Èy­«ÿü9`¶YLŠf ¼n°äþxǺ*SYÛ(G™ŸW4šå­°¤Ãéæ Ç®T–ÓgZ±tN±-ížWÝ¢™S©È‚sô— ­¾f]r l\nŸ•Û~5›d;ÎY-ØŸÇËyë–€‡Š«Uç¦ K2v”°Â3.^ ÒW jå ’^ú‰žn Õe€Ûé•ÒšÿvG7S¯JåP娶ª²™I?îhDZ:8ÃnŽ£®Ui;%ZJÒš¬§Z¬d÷­òvAŸê»`ØÒ‘Ævâ— Im¶.þë³–k¿dånm†ÌßÏøKìq^™ºHÚøP<^?ç9¼õŠ”À<¯mX©_ôfʺ5^EhÛš*|„Zÿ’7U–<€2†U Uu€H»3§»4J²¼bÂ3Õ½(<ìæN"­)3nª27Nè¹(&·ºÇ› [žž×ÓŠ‡°‹VjÝöqï¤gÑiþ⟌pYæP… $hb6!/òê‹HAÙ@9ìÀ&ñDèñtTŒoc&ÎÒð+Ï8Kù\@bN†Ö£R÷˜‡ÍýW*9ÆâørhþP° €«^€“”É÷ã%<¢ì=/GV’ÄE‘]Ò¬ ÖÏôZýió1"¥4¤ÃM]¥€à…9‚~<ÅŒk.YÉdA‘ôÐÞH¯‹Lnƒ”xÚúÈPy×uªø£úŸTá<ž•PW:“åKx—=qSnOXQ‹E‹º\\ÉYâc]BÐ>ª0íUÐ켺ü’ìˆfYGLÊ%ÓÏíï¹`嘛“ÏÅIé@/t¯L'˜ÏD# W¯Bµ³òÅOý—å3yÉlw›çªênÚ‚8P§²KEå²àË*Xþðo…J¨„¢«ª…AwYé°Tì ¢OO-·¹eîñšW…°°FõKÕ„§ŠŽ¡–i`UѨ;Oã¾%¯ºFÓt)æ¡a³py%$5¦Ú#­Ü áoàÚÆ»'‡³ö˜ÛŽZ«™yÐÍ9vÕÙ c U.H:-Íg—4éeÑ k¯Å"u›¦6— ÒuKºW ïÄ^)¿Ä…L Žx;ƒEÒíè:‰P¥¯y¬ÏTƒX½§ï”ÿ3$¥FN§M©ú}(e¸†m-ÙÓ]Ûꣻ–×/¦»6…Ô–ÿáÅ9®Ò˲//ŽŸ3@Ê3rU™¯­ï¿Üf äÒì‰úvö1òà´L!–’«w?Me"«—°Ã¨¶æZ)fm; ›Ä@Rþ£VK-yaõŒ`èÄZäl Iódf(7ZKà¶ùC%Æ;pÈG•yЧÖjçøófT4 ~Ðá_‰9‹‘Õ§ó:ªy¤-ý¿¾Î5WzÃÿGšEŒ”w²ÿõÔû>6Ié¨ÕêO§ `|ÇØÿßów­6" ¡uve÷²~NLºâí»&ÈËê( ìî>¹'ßéu!":Ùà¿óg)}\›‰ˆ½º{r €c€¢tæÀhÆdõKþ rc6³xøÐ|ͼ†§-m;´Êe9ïó}Y;ÍàGÕr”~Û6ñÛ¢Ž'8J®©etãà0žmÍ#}ƒñ@Çlñ~MÓ#\zÜaþõ Ë¾£[zð|Fçò¤QR½RÒâPwÓg 5áŠêÈü8{cò8í×Ûô}´>‡Ö4Ÿ"šz¥¾~Z‰ z"ˆRÿ=†"a¹qêm–.øo)‘'UÂK½ˆD¡¿Î§¥©‚QFó 3idK‚²ˆX ïK&îæ²äá®"öÉù1{„dŒ3­ÃSÿ½`ÏIƒ"!ß©¨%•joç|·þ"uÞólhÜU5ÉŒc©ËÜ ¤9%d!²¢y/O×›Z ,™û‹ë”™¢2Æ Wì½ýîš")vn"ýŠÓz§¼³¸„¦Ð.Ås 'ò’—JšB=2=¨2)nÚÉWl’<lÉßÿÎܤ̊qtñ÷ÿ th_Ô¸}ü3)G ÖŒ{- i…ð¬ÌõÄŠ8PË,¥&a\k>³ü,nëDç+`jÑ…o®Ü\Qy´«íþní Hâ¡&jàMK‹þŒq”ÏD?¤L£;ôgÌ»ÖAlu&µ‚‡m¶ç~oA -¦ UeD“dP!ª ŸSÚÁ¥qöZáÐ_sÉ€ó³¦qÏËMêw»õšõø©ÀºÞëÃúŸ=×ÔÈÃú.êsOý¢ií„åÃéØ ’rIYÍA~Ð"švÄLHÆPŽËFd‰\¤P!1™èôW•-!c:ÑÆLÇ„͉©:à²Å,Úý›ÇLѯâ©ñ­«í¬.uéÊt¾G ³£™Ü @¿åil°åB'™ø¢Ã_­Q:Øq”;¶X™¢-¤áñÔ–]·ˆƒ ðitÝ5ÑÂÜ€ O d Æš8éŠ`ÐÉ"ž3ý¶0»¶—Öòƒ&ó« CȼpÆß)€ÆDa[s lèyDTá„3ª¥ j‰³çêÕ*¤T’ª2:ŠNyœ Â[R­ƒôÛDÍÇü¨o/I7„È™=±…NA/Ÿ˜Ù#Gà¹A7V²GÆâ=Ž1¹¶Á´5/Ý»)Õ•62Ü}¨£›ŠZ—÷qS™D­ïœÃöù¸”lr!! ÖŽÚ2%6A,¦=çÞOXS©dߘüz‘l´zWñúx2ŽdS—”aôëbj…˜´V·E\–°…'Ød…»M&vˆBnµÅd,¾5Á—M# 1ÄDLˆ$‡èi”ú‚o8ä3uNR–µ„ÄÈ^`‘ÒÈ¥kÃæÞ«i ë\BËú~s¦î­R¿Lf· ÔD©Ð5¥ÓÔð£ï¢fѾhþzm4YÑzvMp,ýK¹mô/ö‰^Ødàí¾Á.xHÖa`f$‚Õ‘jqþXþLm­ ÷Ã= ´ª¹D‘é}ÛOK×sx£¡–±uÈq ¸z=ÕjÌœ;öÚ:¢ã`i%ˆùeó*·cË<AÕÂ$!˜£ÝÈ< šÓ-Ü×øšü«§*õv÷¥¯ªñœŽŒÌ2t¡œßàô6Á–\h}º½¹¼Œ‰h<ÃDëíù=ÞIÁÐÒœpl¸4{¸s1Ÿ©/¢¹¢þã}ÉŽ—à¾vŒ/K"T‡·šgÿûïþÚÕœã™Ígolly-3.3-src/Patterns/Life/Miscellaneous/sawtooth6b.rle0000644000175000017500000000174212026730263020306 00000000000000#C May be the smallest known sawtooth pattern by population. #C The minimum population is 278 (at generation 0, 768, ...) #C David Bell, 5/04; from Jason Summers' "jslife" pattern collection. x = 140, y = 90, rule = B3/S23 122boo$122boo5boo$129boo3$98boo8boo17boo$98boo9bo17boo$109bobo21boo$ 110boo21boo$92boo22b3o$92boo20bo4bo$96boo18boboo$96boo15b3o$112bo3$91b oo$91boo41bo$132b3o$131bo$131boo11$138boo$13boo123boo$13boo3$133boo$ 133boo$26bo110boo$25boo110boo$5boo5bo12bobo68boo21boo$5boo6bobbo79boo 21bobo$17bo3boboo77boo17bo9boo$15boo4bo3bo76boo17boo8boo$25bo$21b3oboo $24boo74boo$21boo77boo5boo$107boo5$16boo$bb3o10bobo$18bo$o3bo5bo3bobbo $4o5bobobbo$o9bo3b3o$14boo$26bo53bo$26bo$27bo50b3obo$23boboo12bo37bob oo$22booboo11boo37boobo$23bobo11boobo34bob3o$38boo$39b3o35bo$48boo23bo $46boboboo20bobo$35boo8bo4boo20boo$35boo9boobbo25boo$53boo21bobo$52b3o 16boo5bo$55boboo4boo6boo5boo$55bobbo4boo$56boo$56boo5$55boo$46boo7boo$ 32b3o10bobo$48bo$30bo3bo5bo3bobbo$30b4o5bobobbo$30bo9bo3b3o$44boo! golly-3.3-src/Patterns/Life/Miscellaneous/infinity-hotel0.rle0000644000175000017500000000741012026730263021226 00000000000000#C original Infinite Glider Hotel #C David Bell, 9 October 1992 #C "InfinityHotel_old" from Alan Hensel's "lifebc" pattern collection. x = 566, y = 572, rule = B3/S23 13boo$13boo6$13b3o$$13bobo$12b5o$11boo3boo$11boo3boo4$bbo6bo$boo6boo$ 3o6b3o$boo6boo$bbo6bo165$301bo$$297bo7bo$291b3obbo8bo$291b3obbo3boo4bo $289bobboobbo6bobo$289bobo10boobo$289b3o$280boo18bo$280boo$316bo$314b ooboo$$314boo$314bo$316bo3bo$272boo38bo3bo$272boo$306bo$305bobo10bo$ 305bobo7bobo$304bobbo6bo$304bobo8boo$303bo11bobo$264boo37boo10bobo$ 264boo38bo9boboo$313booboo9bo$316b3o$323bo7bo$306bo15bo8bo$272b3o30bob o14bo3boo4bo$305bo16bo6bobo$270bo34bo22boobo$269boo3bo30bo$270bobo53bo 22boo$273b3o28bo$273bo29b3oboo38bo3bo$301boob3o39bo$273boo28bo41bo7bo$ 272boo75bo4bo$273bo70bo4bobobo$272boo32bo37bo8bo$273boo30boboo35boboo 4bo$283bo20booboboo33b3oboobo$276bo3bobbobobbo19bo36boob3o$276b5oboo4b o21boboo4boo12boo$277bobo4bo3bo25boboo8boo4boo$311b4obob3o5boo$284b3o 28bo$285bo$$370bo$368boobo$324boo41bo$318boo4boo40bobbo3bo$318boo45bo 9bo$240boo56b3o64boobboo4bo$239boo124boo$241bo21boo31bo70bo5bo$262bobo 30boo3bo64b3o4bo$252boo7bo13bobo18bobo66boo4bo3boo$252boo7bobbo6boobbo bbo20b3o14boo48b4o$261bo8bobo5boo19bo10boo4boo39bobo13bo3bo$262bobo3bo 3bo3bo3boo4boo22boo45b3o12bo$263boobboob3o5boo6boo11boo57boo11bo7bo$ 270boo3bobbo19boo75bo4bo$275bobo21bo70bo4bobobo$298boo56bo13bo8bo$299b oo55bobo11boboo4bo$261bo94b3o11b3oboobo$261bobo38boo51bo15boob3o$238bo 22boo39boo21bobo27b5o$236bobo85booboo12bo$227bo7bobo86boobo12bobo$226b oo6bobbo11boo72bo17bo$225boo4boobbobo11boo73bo18bo$215boo7b3o4boo3bobo 15bo69bo18boo$215boo8boo4boo5bo14bo87bobbo$226boo25b3o85b3o$227bo107bo 6bo$239bo94b3o$234b4obbo9b4o26b4o84boo$236bob3o8bo3bo25bo3bo50b3o29boo bbo5bo$237bo15bo29bo5b3o39booboo30bobb3o4bo$234bo14bobbo26bobbo6bo43bo 32bo4bo4bo$237bo52bo76b5o$234bo134boo$$227bo$227boo$226bobo$370boo$ 214boo27bo126boo$213bobo26boo$203boo7bo6boo4bo16bobo$203boo7bobbobbobb obbobo26bo$212bo6b3oboboo25bobo$213bobo6booboo14bo8boo3bo9boo84bobo$ 214boo7boboo14b4o5boo3bo9boo83booboo$224bobo15b4o4boo3bo94boobo8boo$ 225bo16bobbo6bobo94bo12boo$242b4o7bo72boo22bo$241b4o80bobo22bo$241bo 82b3o$324boo$324boo$325bobo$326bo27boo$354boo$$323boo3boo$323boo3boo$$ 319b3o3b3o$319bo5b3o$203boo115bo5bo$203boo113bo$318boo$317bobo3$208bo 114b3o$208bo114b3o$195boo12bo112bo3bo$195boo8boboo101boo$204booboo102b oo8boo3boo$205bobo102bo5$187boo114bo$187boo114boo$302bobo$$290boo31boo $289bobo31boo$188boo89boo7bo6boo4bo$187b5o87boo7bobbobbobbobbobo$182bo 4bo4bo32bo62bo6b3oboboo$182bo4b3obbo30booboo61bobo6booboo10boo$182bo5b obboo29b3o65boo7boboo10boo$189boo109bobo$222b3o76bo$216bo6bo$215b3o$ 214bobbo$214boo18bo$215bo18bo$217bo17bo$216bobo12boboo$217bo12booboo$ 199b5o27bobo21boo$182b3oboo15bo51boo$181boboob3o11b3o$180bo4boobo11bob o55boo$179bo8bo13bo56boo$179bobobo4bo70bo$178bo4bo75boo$179bo7bo11boo 57boo$186bo12b3o45boo$181bo3bo13bobo39boo4boo10bo$189b4o48boo14b3o$ 182boo3bo4boo66bobo$186bo4b3o64bo3boo83bo$185bo5bo70bo85bo$192boo152b 3o$183bo4boobboo64b3o$183bo9bo45boo$185bo3bobbo40boo4boo$191bo41boo$ 187boboo$188bo$$273bo$243bo28b3o$231boo5b3obob4o$225boo4boo8boobo25bo 3bo4bobo$225boo12boo4boobo21bo4boob5o$208b3oboo36bo19bobbobobbo3bo$ 207boboob3o33booboboo20bo$206bo4boobo35boobo30boo$205bo8bo37bo32boo$ 205bobobo4bo70bo$204bo4bo75boo$205bo7bo41bo28boo$212bo39b3oboo$207bo3b o38boob3o29bo$254bo28b3o$208boo22bo53bobo$253bo30bo3boo$227boboo22bo 34bo$227bobo6bo16bo$226bo4boo3bo14bobo30b3o$227bo8bo15bo$227bo7bo$240b 3o$231bo9booboo$241boobo9bo38boo$241bobo10boo37boo$241bobo11bo$242boo 8bobo$244bo6bobbo$241bobo7bobo$240bo10bobo$252bo$285boo$242bo3bo38boo$ 238bo3bo$244bo$243boo$$240booboo$242bo$277boo$258bo18boo$267b3o$253bob oo10bobo$253bobo6bobboobbo$252bo4boo3bobb3o$253bo8bobb3o$253bo7bo$$ 257bo144$558bo4bo$556boob4oboo$552bo5bo4bo$551bo$551bo3$549boo3boo$ 550b5o$551b3o$552bo8$552boo$552boo! golly-3.3-src/Patterns/Life/Miscellaneous/elbow-ladders.rle0000644000175000017500000001402712026730263020732 00000000000000#C Left: Single glider Elbow Ladder, based on Dieter Leithner's #C side-shooting pseudoperiod 124 glider gun (improved by Dean H.) #C Scot Ellison, April 1997 [posted 9 May 1997] #C Right: Elbow Ladder based on a p92(104) slide gun from #C Jason Summers. Scot Ellison, 23 Oct 2002 x = 463, y = 206, rule = B3/S23 141boo160boo$141bo162bo$159boo143bobo$128boo29bo145boo7bo$128bo184boo$ 173boo137boo$173bo139boo$300boo37b3o$300bobo38bo$139boo3boo101boo53bo 38bo$142bo104bo52b3o10boo25bo$139bo5bo10boo3boo82bobo64boo$95boo43boob oo12b5o70boo11boo66boo9bo15bo$95bo31b3o11bobo14b3o70bobboo78bo7boo17bo $126bo3bo11bo16bo70b6o64b3o20boo16bo8bo$82boo41bo5bo10bo27booboboo38b oo15b4o47bo18bo36b3o8boo62boo$82bo42bo5bo68bo13bobbo36b3o26boo15bobo 112bo$128bo41bo5bo23boo11boobbo35bo4bo41boo63boo48bobo11bo$126bo3bo83b obbo34bo5bo106bo50boo10boo$127b3o41booboo39bo9bo6b4o17bo109bobo61b3obo $128bo44bo52boobb6o18boo97boo8boo61boo$82bo55bobo19bo54bo9boo4bobboo 69boo45bobbo51boo18boo17b3o$82bo13bo41boo21boo51bobbo14boo20boo48bobo 44boobbo53bo18bo15bo4bo$81bobo11b3o27b3o11bo3b3o14boo51boobbo35bo50bo 47bobbo50boobbo33bo5bo$80booboo9b5o26b3o14bo3bo67bobbo34bo5bo8bo35boo 6bobo15b4o20bo16boo35bobbo17bo20bo$79bo5bo7boo3boo24bo3bo12bo5bo67boo 36bo4bo8boo42boo16boobo36bobboo34bobo16boo18boo$82bo11b5o33bobo6boobob oo106b3o55bo19bo20bo14b6o34boo16boo7bobo$79boo3boo8bo3bo24boo3boo3boo 39b3o153boo20bobbo14b4o53b3obo3boo10boo$95bobo35bo20boo3boo12bo3bo173b oobbo52boo18boo6bo12bo$96bo59b3o122b4o45boo20bobbo52bobo18bo14bo5bo10b o$155bo3bo12bo5bo59bo6boo18bo15bobboo46bo20boo39bo12bobbo33bo4bo11boo$ 156bobo13boo3boo59boo5bobo17boo15bobboo31bo10boobo37b4o20boo10boobbo 35b3o$98bo58bo72bo16bo34bobbo32boo9b4o35b6o11bo23bo$96booboo45boo82boo 15boo34boo84bobboo11boo20boo$146bo223boo51boo$95bo5bo45b3o4boo127boo 74bo64bo$149bo5bo126bobbo73boo55boo4bo3boo$95booboboo24boo24b3o127bobb oo5bo100boo20bobo4bobooboo$77booboboo42bo9b4o12bo110bo17bobboo6boo69b oo18bo7booboo14bo4bo7boobo$77bo5bo47boo7bo33boo88bo16b4o78bobo17boo6bo bbo15boobboo$78bo3bo48bo3boo3bo24boo7bo6bo80b3o83bo16bo25bobbo$79b3o 53bo3bo15bo6bobobboboo8b3o166boo15boo25boo$153boo6boobbo4bo7bo69bo$ 154boo10bo11boo69boo141boo$142boo23bo80boo110bo30bobbo$100boo40bo19bo 198boo28bobbo15bo$100bo28boo9bobo17b3o13bo183boo29booboo14boo$97bo3b3o 27bo8boo17bo14booboo109bobo102boo$59boo34bobo5bo17boo9bo26boo127boo$ 59bo20boo14boo23bo10bo40bo5bo42boobo3boboo56bo52bo5bo63bobo$80bo8boo 41bo89bobbo3bobbo108b3o3b3o62boo$46boo37boobboobboo36bo41booboboo43b3o 3b3o108boobo3boboo23boo37bo$46bo38bobobbobbo35boo5bo78bo23bo135boo$86b 3o47bobo76b3o19b3o134bo$60bo26boo47boo40bo39bo17bo$60bo114bobbo38boo 17boo$59bobo116bo$58booboo83bo27boo$57bo5bo82bobo5boo3boo13bo$43bo5bo 10bo85boo8b3o15bobo$43bo5bo7boo3boo30bo60bo3bo15boo62boo92bo23bo$44bo 3bo45boo60bobo61bo5bo13boo44bo46b3o19b3o$45b3o34boo11boo27boo31bo61b3o 3b3o11bo47bo48bo17bo$81b3o3bo7b3o7boo17bo50boo3boo36boobo3boboo56b3o 47boo17boo42bo$78boboo4b4o5boo8bo53boo14bo5bo217bo$71boo5bobbo4bo4bobb oo63bo111bo125b3o$71bo6boboo5bo3bobbo65b3o13bo3bo91boo$81b3o3boobo71bo 14b3o78boo3bo7boo110bo$82boo23boo134bo14b3oboboo118boo$106bobbo133boo 13b3o4bo117boo21bo$109bo151bo3bo10bo130boo$59booboboo43bo15bo10boo90bo 33b3o3boo7boo127boo$59bo5bo40boobo13boo11bobo15bo73boo38boo6boo110bo$ 60bo3bo42bo16boo10bo17boo71bobo32b3o3bo120boo$61b3o197bo3bo85boo20bo 14boo$24boo129bo102b3o4bo86boo15boobbo$24bo16boo3boo33bo25boo45bobo 101b3oboboo71bo7bo5bo9bo6bo5bo$55bo24bobo24bo19bo25bobbo101boo3bo73bo bbobobbo15boo4boobbobo$11boo29bo3bo9bo11boo9bo3boo8bo9bo21bobo24bobbo 12bo108bo59b3o3b3o22boo3bo$11bo31b3o8b3o11bo10bo3boo5b4o10boo20boo39b oo3boo3boo98boo90b3o$43b3o33bo3boo4b4o10boo50bo11bobo$64boo14bobo6bobb o47bo13boo17bo3bo191b3o$64bo16bo7b4o45b3o33b3o191boo3bo$65b3o22b4o7boo 34bo36b3o190boobbobo$22boo3boo38bo25bo7bobo6bo26boo170bo58bo5bo$25bo 18boo57bo5bo200bo58boobbo32bo$22bo5bo15bo9bo48boo4b3o50boo9bo134b3o62b o21bo10bobbo$23booboo21b3oboobboo57bo41boobboobboo4b3o220boo9bobboo$ 10b3o11bobo22b4o4bo58bobo39bobobbobbo4bo3bo46bo7bo63bo$9bo3bo11bo27boo 61boo41b3o11bo48bobbobobbo64boo$8bo5bo10bo134boo8bo5bo45b3o3b3o63boo 45bo5bo$8bo5bo155bo5bo163b3o3b3o$11bo58bo100bo3bo164bobooboobo$9bo3bo 57bo100b3o124bo42booboo$10b3o56b3o61b5o131boo7boo20boo40booboo41b3o3b 3o$11bo120bob3obo130boboo3boobo19boo41booboo41bobbobobbo$21bobo35bobo 71bo3bo131bo3bobo3bo107bo3bobo3bo$21boo36bo3bo70b3o132boobbobobboo107b 4o3b4o$8b3o11bo3b3o14bo19bo71bo134b3o3b3o109bo7bo$8b3o14bo3bo11b4o14bo 4bo4boo50boo106bo41bo5bo165boo$7bo3bo12bo5bo9boboboo17bo5bo51bo60boo 45boo211boo$24booboboo4boobbobbob3o12bo3bo31bo70boo7boo5bo261bo$6boo3b oo3boo17bo4boboboo13bobo31boo40boo23bo5bobo6bo$16bo24b4o49boo11bo10bob o14bo24b3o3bo9b3o$43bo28bo33bo10bobbo42bo14bo$71boo33b3o7boo44boo113bo $114boo3bo8boo147boo$72bo43boo10bo203bo7bo$23bo5boo40bobo43bobbo212bo 6boo$24boo3bo31bobo6bobbo44bobo61b3o146b3o$23boo5b3o29boo5bobbo38bo69b o3bo$32bo29bo47b3o67bo5bo130bo$9boo21bobo8boo27bo36b5o66booboboo131boo $9bo8boo13boo7b3o26boo89booboboo148boo69bo$14boobobboboo15boboo12bo24b o307boo$14bo4bobbo16bobbo12boo22bo82bo5bo$18bo20boboo13boo21b3o240bo$ 17bo24b3o11b3o27bo17bo58booboo155boo$43boo11boo28bobo13b3o60bo156boo$ 55boo8boo19boo13bo7b5o$55bo9bobo33boo7b3o$67bo43bo55bo$67boo97bobo$ 165bo3bo8boo3boo$76bobo14bobo69b5o11bo$77boo14boo4bo64boo3boo7bo5bo$ 77bo16bo3b3o64b5o9booboo$28bo69b3o65b3o11bobo227b3o$28b4o135bo13bo230b o$12bo16b4o63boo3boo78bo229bo$11bobo5boo8bobbo5boo56bo4bo253bo$9boo3bo 14b4o5bo26bo290bo$4boo3boo3bo4boboboo3b4o31boo289b3o$4bo4boo3bo5boo3bo bbo35boo11bo$11bobo10bo51bo103boo158bo$12bo8bobbo15boo34b3o6boo93bo 160boo$40bobo42bo254boo$41b3o123boo$42boo9bo45boo66bo$25b3o3bo7boo13b oo43bo245bo$27bo4bo6b3o11boo291boo$oo24bo3b3o312boo$bo$bobo8boo26boo$ bboo8bo5bo21bo9bo$9boo6b5oboo24bo$8b3o5bobboo4bo23b3o$9boo5boo8bo29bo$ 12boo4bo7bo29bobo$12bo13bo29boo$25bo8boo26bo$23boo9bobo23boo$36bo24boo 14bo$36boo37b3o300bo$74bo304bo$74boo301b3o$32bo354b3o$32bobo328bo25bo$ 32boo330boo22bo$363boo3$69boo3boo292bo$47bo21bobobobo293boo$46bo23b5o 293boo$46b3o22b3o$53bo18bo$53bobo$53boo$$58boo$58bo$$72boo$72bo$386bo$ 386bobbo$386bobboo$22boo$22bo$32bo$30boo$31boo11$17bo$16bo$16b3o$23bo$ 23bobo$23boo6$12boo$12bo! golly-3.3-src/Patterns/Life/Miscellaneous/infinity-hotel2.rle0000644000175000017500000001124212026730263021226 00000000000000#C An improved "infinite glider hotel". #C Every 128 generations, another glider is injected into #C the expanding loop, but there's always room for it. #C Mostly by David Bell, 5/2001; from Jason Summers' "jslife" archive. x = 256, y = 157, rule = B3/S23 99bo66b3o$87bo11b3o64bobo$85b3o14bo23boo37bo3bo$69bo14bo16boo23bo38bo 3bo$69b3o12boo38bobo23boo17bo$72bo7boo38boobboo24boo11boo4bo$71boo7bo 39boo40bo6bo$87bo20bobbo50bo5bo$81boo5bo19bo3bo54boo$72boo14boo17bo4bo 49bo3bo$72boo7boo4boobboo14bo4bo38boo10bobo$87bo3boo14bo3bo39bo$82bo 25bobo31boo6b3o$142boo22b3o$151bo13bo3bo$150bo14bobbo$150boo13boo$88b oo36boo$88bo19boo16bobo41bo$90bo16bobo18bo40bobobboo7boo$89boo16bo13bo 6boo4boo32bo3b4o6b3o$85boo19boo4boo6boo12boo35bo7boboboo$85bo24bobbo5b obbo30boobo9boobo10boo$86b3o21boo7bobo32bo3bo8bobo$75b3o10bo31boo32bo 3bo9bo27bo$74bobbo65bo12bobo37bo$78bo64bo51bobo$74boo66bobo47bobboo$ 69boo3boo3bo59bobboo22bo24bo5bo$68bobo8bo58bo5bo20bobo23bo5bo$68bo8bo 60bo5bo20bobo11b3o10bo4bo$67boo6b3o61bo4bo21bo26bo$75boo52boo9bo53b3o$ 75bo53bo11b3o34bo$78bo48bobo47bobo$74b6o47boo49bo15booboo$73b5o63boob oo47bo$73bo3bo62bo56boo$74b3obo65boo48b3o$74bob3o30bo31b3obbobo$78bo7b oo21b3o34bobo4b3obo$73b3o8bobbo24bo6boo24bo5bo4boboo$84boo4boo19boo5bo bo24bobbobbo4boo$68boo20bo16boo11bo24bobbobbo$54boobboo9bo18bobo16bo8b o30bo4bo$52bobbobbobbo7bobo16boo19bo5bo37bobbo$52boobboobboo8boo36boo 5bobboo34boo$116b3o72boo12bo$52boob4oboo14boo3boo24bo9bo14boo57boo11b 3o$51bobboobboobbo12bobobbobo23boboo22bo38bo31b3obo$51b3obboobb3o5boo 5bo4bo24boo3bo19bobo38bo32bo3bo8bo$52bobbobbobbo6boo5bobbobbo19boo3bo 23boo38bobo32bo3bo5b3o$52b4obb4o14b3o23boobbo3bo56bobboo34bob3o3bo$50b oo4boo4boo5bo29boobo3bo59bo5bo34b3o4boo$53boo4boo7bobo28bo6bo59bo5bo 35bo$50boobob4oboboo3bobbo21bo6bobo65bo4bo10boo27bo$51bobo6bobo3bobbo 23bo6boo4bobo59bo14boo26bobo$55bobbo32b3o13bo61b3o40boobboo$51b3o6b3o 3bobbo146boo$49boobb3obb3obboo3boo42boo17bobo$52bobbobbobbo33boo16bo7b oo9boo35booboo$50bobo8bobo31bo14b3o4boobobboboo5bo35bo$96b3o11bo6boobb o4bo45boo$51bo10bo16boo17bo23bo46b3o3boo40bo$51boo8boo16bo43bobo49boo 39boo$52boo6boo18b3o133bobo$52b10o20bo$$67bo$54bo4bo5boo$56boo8boo133b o$48bo151bo$48b3o34b4o28b4o28b4o47b3o$51bo32bo3bo27bo3bo27bo3bobb3o$ 32bo17boo4boo30bo31bo31bobbo$20bo11b3o20bobo26bobbo28bobbo28bobbo4bo$ 18b3o14bo21bo$bbo14bo16boo$bb3o12boo42boo$5bo8bo46boo170bo$4boo9bo216b oo19bo$14bo6boo209bobo17bobo$20b3o18b3obo15b3o187bo3bo$5boo13boboo16bo 3boboo14boo186bo3bo$5boo12boob4o14boo4bo12boo188bo3bo$20bobo17bob4o13b 3o186bo3bo$21bo38bobo122bo63bobo$61boo121bo65bo$184b3o59bo$245bobo$ 229bo15boo$21boo36boo75boo91b3o17boo$21bo19boo16bobo74boo3b3o88bo16bob o$23bo16bobo18bo77boo48boo22bo17bobboo8boo5bo$22boo16bo13bo6boo81bo40b oobboobboo6bo11b3o15boobobo7boo5boo$18boo19boo4boo5b5o82booboo32boo7b oobbobbobo4b3o14bo19bo$9bo8bo24bobbo4b3oboo119boo13b3o4bo16boo17boo$8b 3o8b3o21boo7bobboo134boo6bo33bobo6boo$8bobbo9bo31b3o85b3o55bo33boo7boo $10boo42bo73boo14bo49b3o36boo$10bo117boo10bo4bo47bo5bo$7boo131bo5bo41b oo6bo3bo23bo17b3o$bboo3b4o129bo5bo40bobbobboo5bo21b3o18boo$bobo4bobbo 129boobbo40boobbo4boboboo4boo15bobo15boo$bo7bo130bobo44boobbo5boo6boo 15bo17b3o$oo139bo38boo6b4o49bobo$7bo54boo77bo37bobo60boo$6bo5bo49bo57b oo57bo$60bobo57boo56boo$5bo5boo47boo95boo$156bobbo42boo36boo$8bo151bo 4bo36bo19boo16bobo$5bobbobboo148bobbobbo36bo16bobo18bo$10bo31bo112boo 4bobbobbo35boo16bo20boo$11boo6boo21b3o8bo99boobo4bo5bo31boo19boo4boo7b o$6bobo8bobbo24bo7boo100bob3o4bobo32bo24bobbo5b3o$7bo9boo4boo19boo6bob o109bobobb3o28b3o21boo8bo$boo20bo16boo74b3o48boo33bo$bbo18bobo16bo73b oo56bo$bbobo16boo19bo5b4o67bo47booboo18bo$3boo36boo4bobb3o61booboo15bo 54b3o$48bo3bo80bobo47boo3boobbo$8b3ob4o32bobbo82bo34b3o10bobo3bo3bo$7b obb3obbo22bo10b3o64b3o53bo9bo5boboo$6bo4bo22boobo3boo76bo26bo21bo4bo7b oo5boo$7bobobb3o19b3o4boo72bo4bo10b3o11bobo20bo5bo68boo$9boboo23boobb oo73bo5bo23bobo20bo5bo68bo$9b3o19boo6b3o15boo56bo5bo24bo22boobbo67bobo $10bo19boo3bo3bo17boo57boobbo47bobo18boobo48boo$31booboo3bobo73bobo51b o18b3oboo$25bo6b4o4bo75bo37bobo12bo17bo$9boo15boo12bo17boo56bo27bo9bo 3bo32b3o$5boobboo14boo31bo84bobo8bo3bo33bo30bo11bo$4bobo38boo12b3o69b oo10boboo9boboo28bo11boo21b3o7bo$4bo23boo16bo14bo66boobobo7bo35boo7bo 11bobbo24bo6bo$3boo23bo14b3o82b3o6b4o3bo32boo9boo8boo4boo19boo4boo$29b 3o11bo84boo7boobbobo38boo20bo16boo8bobo$31bo110bo40bo18bobo16bo8b3o$ 183bobo11boo3boo19bo6bo$146boo13boo21boo13boo21boo7boo$144bobbo14bo31b o5bo30boo$143bo3bo13bo38bo$144b3o22boo20b3obo$160b3o6boo20bobbobo24boo $161bo29booboboboo21bobo$147bobo10boo55bobbobbo$146bo3bo42b3o20bo3b3o 15boo$144boo58bo10boobbobbo15boo$144bo5bo54boo9booboo$143bo6bo53boo11b 4o$143bo4boo11boo27boo47boo$143bo17boo23boobboo47bo$143bo3bo37bobo38b oo12b3o$143bo3bo37bo23boo16bo14bo$144bobo37boo23bo14b3o$144b3o63b3o11b o$212bo! golly-3.3-src/Patterns/Life/Miscellaneous/loggrow-corder.rle0000644000175000017500000000421212026730263021135 00000000000000#C A Cordership-based object whose population grows logarithmically. #C David Bell, 10 July 2004; from Jason Summers' "jslife" collection. x = 158, y = 168, rule = B3/S23 94bo$86b3o3b4o$86bobo3booboo$86b3obbo$91boo3bo$92b4o$93b3o10boo$106boo 7$114boo$101bo12boo$90boo9b3o$89bobobo7b3o$89bo3boo5bo3bo$90boo8b4o$ 90b3o7boboo3$80bo6boo$79bobo3bo3bo$78bo3bobo3boo$79bobobboboboo$80bo3b obboo$84bo4bo$85bobbo$64bo22bo$56b3o3b4o$56bobo3booboo$56b3obbo$61boo 3bo$62b4o$63b3o10boo$76boo3$78boobo$78bo4bo$78bo5bo$81bobbo$80bobboo$ 71bo7bobbo$60boo9b3o6bobo$59bobobo7b3o$59bo3boo5bo3bo$60boo8b4o6boo$ 60b3o7boboo4boobbo$79boboo$76booboo$76b3o$76bo67boo$76boobbo63boo$32b 5o7bo19boo11b3o$30boo5boo4bobo18boo11boo$30bo7bo4bo$30boo7bo3bobbo28bo $32boo6bo3b3o26b3o$35bo36bobbo$35bo4bo13boo17bobbo53boo9boobbo6boo$36b oobo14boo18bobo54boo8bobob3o4boo$74b3o53bo14bobo$136b3o$134boboo$134bo bboo$134boobo$135boo$51bo3bo6boo71bo$49bobbob3o5boo$52bobobo$40bobo7bo 81bo$34boo4b3obobooboo79bobbo14boboo$34boo6bobboo3bobo3bo90bo4bo$50bob o76bo22bo$38boo91boo8b3o3bo6boo$26b3o8b4o100bobbo3bo7boo$24b7o5boobbo 103bo4bo7bo$23b9o3bob3o102bobo4boo5boo$22bo7b3o3boobo88bo14bo7b5o$23b 3o6bo54b3o39bo$24boo43bo17bo42bo$27bo42bo17bo43boo$28bo39b3o54bo6b3o$ bb5o7bo14bo88boboo3b3o7bo$oo5boo4bobo102b3obo3b9o$o7bo4bo103bobboo5b7o $oo7bo3bobbo100b4o8b3o$bboo6bo3b3o8boo91boo$5bo22bo76bobo$5bo4bo90bo3b obo3boobbo6boo$6boobo14bobbo79booboobob3o4boo$25bo81bo7bobo$101bobobo$ 94boo5b3obobbo$22bo71boo6bo3bo$21boo$20boboo$19boobbo$20boobo$19b3o$ 10bobo14bo53b3o$4boo4b3obobo8boo54bobo18boo14boboo$4boo6bobboo9boo53bo bbo17boo13bo4bo$82bobbo36bo$82b3o26b3o3bo6boo$82bo28bobbo3bo7boo$114bo 4bo7bo$79boo11boo18bobo4boo5boo$78b3o11boo19bo7b5o$12boo63bobboo$12boo 67bo$79b3o$77booboo$75boobo$75bobboo4boobo7b3o$76boo6b4o8boo$83bo3bo5b oo3bo$84b3o7bobobo$75bobo6b3o9boo$75bobbo7bo$73boobbo$73bobbo$73bo5bo$ 74bo4bo$76boboo3$80boo$80boo10b3o$92b4o$91bo3boo$96bobb3o$91booboo3bob o$92b4o3b3o$70bo22bo$69bobbo$68bo4bo$69boobbo3bo$68boobobobbobo$68boo 3bobo3bo$68bo3bo3bobo$69boo6bo3$54boobo7b3o$54b4o8boo$53bo3bo5boo3bo$ 54b3o7bobobo$54b3o9boo$42boo12bo$42boo7$50boo$50boo10b3o$62b4o$61bo3b oo$66bobb3o$61booboo3bobo$62b4o3b3o$63bo! golly-3.3-src/Patterns/Life/Miscellaneous/wicks-DRH-2002.rle0000644000175000017500000013344612026730263020331 00000000000000#C Wicks found on random tori. The first p8 and the p20 have been #C found before; probably some of the others have too. Periods are: #C 3, 4, 6, 7, 8, 9, 10, 12, 16, 20, 21, 24, 26, 29, 32, 38, 40, 56, #C 176, 190, 224, 360, 376, 525, 1056 #C Dean Hickerson, 31 August 2002 x = 1172, y = 450, rule = B3/S23 9b2obo$9bob2o$13b2o125b2o650bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$13bo125bobo649b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o$14bo28bo4bo8bo4bo8bo4bo8bo4bo8bo 4bo8bo4bo8bo4bo6b2o66b2o5b2obo228b2obo6b2obo331b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o$13b2o27b3ob3o7b3ob3o7b3ob3o7b3ob3o7b3ob3o7b3ob3o 7b3ob3o4bobo68bo5bob2o228bob2o6bob2o293bob2o6b2obo$9b2obo28bob4obob4ob ob4obob4obob4obob4obob4obob4obob4obob4obob4obob4obob4obob4ob3o65bo4b2o 4b2o230b2o2b2o4b2o291b2obo6bob2o$9bob2o28b2o6b3ob3o7b3ob3o7b3ob3o7b3ob 3o7b3ob3o7b3ob3o7b3obobo67b2o3bo5bo15b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b 5o9b5o9b5o9b5o9b5o43bo3bo5bo290b2o8b2o25b3o3b3o7b3o3b3o7b3o3b3o7b3o3b 3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o 3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b 3o3b3o7b3o3b3o$13b2o27bo7bo4bo8bo4bo8bo4bo8bo4bo8bo4bo8bo4bo8bo4b2o72b o5bo8b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3b o3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo44bo3b o5bo14b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o33bo8bo$ 13bo25b3o97bobo65b2o3b2o4b2o7bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo 2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo 3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo43b2o2b2o4b2o15bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo33bo10bo$14bo24bo100b2o66bo3bo5bo8bo3bo3b3o3bo3bo3b3o3bo3b o3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3b o3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o40b2obo4bo5bo290b2o8b2o26bo5bo9bo5b o9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo 5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo$13b2o192bo5b o5bo7b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o46bob2o5bo5bo 291bob2o6b2obo21bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bo bo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bo bo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo 3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo 3bobo3bo3bobo3bobo3bo3bobo3bobo$9b2obo194b2o3b2o4b2o224b2o8b2o4b2o291b 2obo6bob2o22bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5b o4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo 5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo 4bo5bo$9bob2o199bo5bo225bo9bo5bo16bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo39b2o2b2o4b2o 23bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$ 207b2o4bo5bo225bo9bo5bo14b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b 3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o39bo2bo5bo24bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo 5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo 4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo 4bo4bo5bo4bo4bo$208bo3b2o4b2o224b2o8b2o4b2o295bo4bo5bo23bo3bobo3bobo3b o3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bob o3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bob o3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo 3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo $207bo6b2obo228b2obo6b2obo297b2o2b2o4b2o28bo5bo9bo5bo9bo5bo9bo5bo9bo5b o9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo 5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo$207b2o5bob2o228bob2o6bob2o293bob 2o6b2obo$753b2obo6bob2o$796b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o 3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b 3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3$ 799b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o$799b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o$800bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo13$6b2o4b2o213bo6b2obo6b2obo6b2obo 6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2o bo6b2obo6b2obo6b2o$7bo5bo213b4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bo b4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bo$6bo 5bo217bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob 4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o$6b2o4b2o215b2obo6b2obo6b 2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo 6b2obo6b2obo6b2obo6b2obo$8bob2o36b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o$8b2obo28b2o6bobobobo3bobobobo3bobobobo3bobobobo3bob obobo3bobobobo3bobobobo6b2o$12b2o25bob3o6bobo7bobo7bobo7bobo7bobo7bobo 7bobo6b3obo$13bo24bo2bobo4bobobobo3bobobobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo4bobo2bo326b2obo4b2o19b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o$12bo25b3o 6bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2b o6b3o326bob2o5bo19b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o$12b2o28b3o2bobo3bobobobo3bobobob o3bobobobo3bobobobo3bobobobo3bobobobo3bobo2b3o334b2o2bo$37bob2o4bobo7b obo7bobo7bobo7bobo7bobo7bobo7bobo4b2obo329bo3b2o288b2o2bob2o6b2obo$37b 2obobobo2bobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bo bo2bobobob2o330bo19b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b 2o6b2o4b2o6b2o4b2o6b2o26bo2b2obo6bob2o$12b2o27b2ob2o2b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o2b2ob2o333b2o2b2o15b2o6b2o4b2o6b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o25bo7b2o2b 2o$12b2o437b2obo5bo14b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b 3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o 2b3o6b3o2b3o6b3o2b3o6b3o24b2o7bo2bo$451bob2o4bo13b3o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o 3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b3o30bo4bo30bo15b o15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo$449b2o8b2o12b3o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o 3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b3o22b2o6b2o2b2o28b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo$449bo 27b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o 2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b 3o2b3o27bo4b2o6b2obo24bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o$450bo8b2o16b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b 2o26bo6bo6bob2o25bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo 3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo$449b2o9bo16b2o4b2o6b2o4b2o6b2o4b2o6b2o 4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o26b2o4bo5b2o4b2o32bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo$451b2obo4bo295b2o4bo5bo$451bob2o4b2o288b2o2b2o7bo5bo$473b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o23bo3bo6b2o4b2o$473b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o22bo 3bo9b2obo$749b2o2b2o8bob2o2$37b2ob2o83b2ob2o$37b2obo4bo3bo7bo3bo7bo3bo 7bo3bo7bo3bo7bo3bo7bo3bo4bob2o$40bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo$40bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo101b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$39b2obo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob2o100b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$ 43b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2$42bob2o3b2o bobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obo 102bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8b o2bo8bo2bo8bo2bo8bo2bo$42b2obo3bob2ob2obo3bob2ob2obo3bob2ob2obo3bob2ob 2obo3bob2ob2obo3bob2ob2obo3bob2o102b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o$228b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o$234b2o10b2o10b2o10b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$233b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o$233bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo3$234b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$234b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b 2o4$799b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o$799b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b 2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o2$747b2o4b2obo6b2obo$748bo4bob2o 6bob2o$39bo54bo652bo3b2o4b2o2b2o4b2o$37bobobo4b2o8b2o8b2o8b2o8b2o4bobo bo350b2obo4b2o4b2o284b2o2bo5bo3bo5bo$39bobobo4bo9bo9bo9bo9bobobobo352b ob2o5bo5bo289bo5bo3bo5bo$36b2obob2o2bo4bob2obo4bob2obo4bob2obo4bob2obo 5b2obob2o353b2o2bo5bo285b2o2b2o4b2o2b2o4b2o$39bo5bob2obo4bob2obo4bob2o bo4bob2obo4bob2o5bo356bo3b2o4b2o14b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o 4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o28bo4b2obo4b o5bo17b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b 2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o 14b2o4b2o14b2o4b2o$38b2o13bo9bo9bo9bo10b2o356bo4bob2o16b3o14b3o4b3o14b 3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o 14b3o4b3o27bo5bob2o5bo5bo15bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o 14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo 2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo 2b2o$51b2o8b2o8b2o8b2o368b2o4b2obo19bo12bo10bo12bo10bo12bo10bo12bo10bo 12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo26b2o8b2o2b2o4b2o16b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo$447b2obo10b2o15b2o2b3o4b3o2b2o6b2o2b3o4b3o2b 2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o 2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o 32bo3bo5bo27bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo 2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo 2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o$447bob2o 11bo14b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o 4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b 2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o23b2o9bo3bo5bo27b2o4b2o14b2o4b2o14b 2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o 14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o$445b2o 14bo19bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo 12bo10bo12bo10bo12bo26bo8b2o2b2o4b2o$445bo15b2o19b3o4b3o14b3o4b3o14b3o 4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b 3o22bo5b2obo6b2obo$446bo35b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o 14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o22b2o4bob2o6bob2o$ 445b2o$447b2obo10b2o$447bob2o10b2o2$226b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o390b2o20b2o20b2o20b2o20b2o20b 2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o$228b2ob2o5b 2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b 2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o385b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o$228b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o$226b2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob 2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2o$231b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o5$ 44bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo$38bo3b3ob3o3b3ob3o3b3ob 3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3bo$37bobobo7bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobobo$37bobobo2b3o2bobo2b3o2bobo2b3o2bobo 2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobobo$35b2ob2ob3o3b 3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob2ob2o$34bo 2b2o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b 2o2bo$33bob2ob4o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o 2bobo2b3o2bobo2b3o2bobo2b4ob2obo$33bo10bobo7bobo7bobo7bobo7bobo7bobo7b obo7bobo7bobo10bo$34b2o2b2ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob 3o3b3ob3o3b3ob3o3b3ob2o2b2o$36bo2bobo7bobo7bobo7bobo7bobo7bobo7bobo7bo bo7bobo7bobo2bo$36b2o95b2o6$449b2obo6b2obo$226bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo36bob2o6bob2o$225bobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobo bo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobo 39b2o2b2o283b2obo6b2obo4b2o4b2o$225bob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obo39bo3bo25b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o19bob2o6bob2o5bo5bo$228bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo43bo3bo23bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo23b 2o8b2o2bo5bo$225b4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4o b4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4o39b2o2b2o 23bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bo bo11bobo11bobo11bobo11bobo11bobo11bobo23bo9bo3b2o4b2o24b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o$225bo7bobo7bobo7bobo7bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bo35b2ob o6b2obo15b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o26bo 9bo4bob2o26b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$92bo132b 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o35bob2o6bob2o15b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o28b2o8b2o4b2obo24bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15b o15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$91bobo2b2o128bob obobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3b obobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo3bobobobo34b2o8b2o4b2o20b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o31b2obo6b2obo 10b2o14b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$91bobo2bo 130bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5b o3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo35bo9bo5bo21b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o28bob2o6bob2o11bo13bo3bo2bo3b2o3b o3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo 2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b 2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o$88b2obob2obo351bo9bo5bo24bobo11bobo11bobo11bobo11bo bo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo24b2o8b2o14bo13bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo$88bo2bo4b2o349b 2o8b2o4b2o24bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo11bobo11bobo11bobo11bobo11bobo11bobo24bo9bo15b2o13b3o6b3o4b3o6b 3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o$45bo43bobo3bo2bo350b2obo6b2obo 27b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o25bo9bo30bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$44bob2o42b2ob2ob2obo 349bob2o6bob2o277b2o8b2o32b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o$34b2o3b2o4bobo3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3bob2o2bo2bo2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2obo3b2o594b2obo6b2obo10b2o16b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$33bo2bo2b3obo2bo4b5o3b5o 3b5o3b5o3b5o4bob3o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2ob3o2bo 594bob2o6bob2o10b2o$34b2o4bobo2b3obo7bo7bo7bo7bo7bo55b2o$36b3o3bobob2o b96o$34b2o2b2o2bob2o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bobob2o$33bo2bo 2b2obobo3b4o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3bobo$34b2o8b 5ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b 2ob2o3b2ob2o2b2o2bo$44bo2bo97b2o$45b2o16$226b2o10b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$226b4ob2o5b4ob2o 5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o 5b4ob2o5b4ob2o5b4ob2o5b4ob2o$225bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo 4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo 3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo$225bob2o4bo3bob2o4bo3bob2o4bo3bob 2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3b ob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo330b2obo6b2obo6b2obo$226b2o b4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2o b4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o331bob2o6bob2o6bob2o$45b2o8b2o8b 2o8b2o8b2o8b2o8b2o12b2o12b2o12b2o12b2o68b2o10b2o10b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o70bo8bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo30b2o2b 2o8b2o4b2o$45b2o8b2o8b2o8b2o8b2o8b2o8b2o12b2o12b2o12b2o12b2o318b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o30bo3bo9bo5bo$34b2o136b2o306bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 34bo3bo9bo5bo14b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o 18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o$34bobo6b4o6b4o6b4o6b4o6b 4o6b4o6b6o8b6o8b6o8b6o8b6o6bobo306b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o 7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b 2o32b2o2b2o8b2o4b2o14bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17b obo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo$ 36bo5bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo6bo6bo6bo6bo6bo6bo6bo6bo6bo 5bo572b2obo6b2obo4bo5bo17bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo 7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo 7b3o9bo7b3o9bo7b3o9bo$36bobobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bobo2bobo2bobo2bobo2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o 2bo2b2o2bo2b2o2bob2ob2o571bob2o6bob2o5bo5bo14b3o9bo7b3o9bo7b3o9bo7b3o 9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o 9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o$34bo2b2o4bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bo5b2o 574b2o2b2o4b2o2b2o4b2o24bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo 17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo$35b obo2bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bo 2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo3bobo 575bo3bo5bo3bo5bo25b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b 2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o$33bobobobo2bo4bo4bo4bo4bo4b o4bo4bo4bo4bo4bo4bo4bo6bo6bo6bo6bo6bo6bo6bo6bo6bo4bobobo574bo3bo5bo3bo 5bo$33b2obob4o6b4o6b4o6b4o6b4o6b4o6b4o8b6o8b6o8b6o8b6o8b4obob2o303bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo35b2o2b2o4b2o2b2o4b2o$36bo134bo305bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo30b2obo6b2obo6b2obo$36bob2o10b2o8b 2o8b2o8b2o8b2o8b2o10b2o12b2o12b2o12b2o12b2obo306bo8bo8bo8bo8bo8bo8bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo31bob2o6bob 2o6bob2o$37bobo10b2o8b2o8b2o8b2o8b2o8b2o10b2o12b2o12b2o12b2o12bobo277b 2obo6b2obo$448bob2o6bob2o$452b2o2b2o4b2o$452bo3bo5bo14b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o6b3o6b3o$453bo3bo5bo13bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo$452b2o2b2o4b2o13b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o$448b2obo6b2obo$448bob2o6bob2o$446b2o14b2o$446bo15bo14b 3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o$447bo15bo13bobo6bobo6bobo6bobo6bo bo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bo bo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo$35b2o3b2o7b2ob2o99bo292b2o 14b2o13b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o$34bo2bobobo6bobobobo97bob o293b2obo6b2obo$34bob2obo4bo4bo4bo97bobo293bob2o6bob2o$33b2obo2bo2bo4b ob2o2b2obo7b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o5b2ob2o$33bo3b3o2bo3bo3b 2o6bo5b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o4bo2bo2bobo319bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo$34b 3o3b2o4bo3b5o3bo7b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obo bo4b2obobo4b2ob4o2bob2o318bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo$35bo2b2o2b2obo13bob2o3b2ob2obo3b2ob2obo3b2ob2obo 3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2o4bo2bo52b2o5b2obo259b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo8bo$35bo2b2o2b2obo13bo2bob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2o bo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2ob2o3b2obo53bo5bob2o$34b3o3b2o4bo3b 5o3bo3bobobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b 2obobo3b3obo53bo10b2o$33bo3b3o2bo3bo3b2o6bo10b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o7bo5bobo51b2o9bo$33b2obo2bo2bo4bob2o2b2obo12b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b3o3bobo62bo$34bob2obo4bo4bo4bo95bo2bobobo50b2o9b2o$34bo 2bobobo6bobobobo93bo3b2ob2o52bo5b2obo10bobo2bo3bo2bobo3bobo2bo3bo2bobo 3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo 2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo 2bobo56b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o 7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o30b2obo4bob2o6b2obo$35b2o 3b2o7b2ob2o94b2o58bo6bob2o10bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo 5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo 3bo5bo3bo3bo3bo5bo3bo56bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo31bob2o4b2obo6bob2o$208b2o3b2o14bobo 2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo 2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo 3bobo2bo3bo2bobo3bobo2bo3bo2bobo57b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o32b2o6b2o2b2o$213bo269bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo32bo8bo2bo22bo23bo23bo23bo23bo23bo 23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo$208b2o4bo536bo6bo4bo20bobo21b obo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo 21bobo21bobo21bobo$209bo3b2o535b2o6b2o2b2o18bo3bo19bo3bo19bo3bo19bo3bo 19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo 19bo3bo19bo3bo$208bo6b2obo527b2obo6b2o6b2obo14bo2bo20bo2bo20bo2bo20bo 2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo 2bo20bo2bo20bo2bo$208b2o5bob2o527bob2o7bo6bob2o15b2o22b2o22b2o22b2o22b 2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o$750b2o4bo5b 2o4b2o25b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b 2o22b2o22b2o22b2o$750bo5b2o4bo5bo25bo2bo20bo2bo20bo2bo20bo2bo20bo2bo 20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo 20bo2bo$51bob2ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b 2obo2b2obo631bo2b2o7bo5bo24bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19b o3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo$ 47bo3b2obobob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o 2bob2o3bo626b2o3bo6b2o4b2o26bobo21bobo21bobo21bobo21bobo21bobo21bobo 21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo$46bobo73bobo 621b2obo4bo9b2obo29bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo 23bo23bo23bo$46bobo2b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2bo bo621bob2o4b2o8bob2o$44b2o2bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bobo2b2o$43bo2b3ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5o b3o2bo$39b5o2b2o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b2o2b 5o$38b3ob2o83b2ob3o$39b5o2b2o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b2o2b5o$43bo2b3ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob3o2bo$ 44b2o2bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 2b2o$46bobo2b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2bobo106bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$ 46bobo73bobo102bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo$47bo3b2obobob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bo b2o2bob2o2bob2o2bob2o2bob2o3bo103bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$51bob2ob2obo2b2obo2b2obo2b2obo2b 2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo107bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$227bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo$227bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo$227bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo$231bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo$231bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo30b2obo6b2obo$227bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo26bob2o6bob2o$227bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo30b2o8b2o$450bo9bo$451bo9bo$450b2o8b2o23bo11bo11bo11bo11bo11bo11bo 11bo11bo11bo11bo11bo11bo11bo11bo11bo$446b2obo6b2obo21bob2obo6bob2obo6b ob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo 6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo$446bob2o6bob2o19bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o$450b2o2b2o23bobo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o bo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o$39b 2ob2o133b2ob2o268bo3bo26bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo$3b2obo32bo3bo133bo3bo269bo3bo 24bo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6b ob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo$3bob2o29bo3b2ob ob2o127b2obob2o3bo265b2o2b2o23bo11bo11bo11bo11bo11bo11bo11bo11bo11bo 11bo11bo11bo11bo11bo11bo$b2o30bo2b4o2bobobo127bobobo2b4o2bo258b2obo6b 2obo283bob2o6b2obo6bob2o16b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o$bo31b3o4bobobo131bobobo4b3o 258bob2o6bob2o283b2obo6bob2o6b2obo15bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo$2bo33bo2b2obobo2bo127b3o2b5o556b2o14b2o2b2o18b3o 7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 7b3o7b3o7b3o$b2o32bobob2o4b6obob2obob2obob2obob2obob2obob2obob2obob2ob ob2obob2obob2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3obob2ob o2b3ob2o4bo4bo556bo14bo4bo19bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo$3b2obo28b2o3b2o12bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo3b2o6bo3b2o6bo 3b2o6bo3b2o6bo3b2o6bo3b2o10bob4o555bo16bo2bo$3bob2o45bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4b2o5bo4b2o5bo4b2o5bo4b2o5bo4b2o5bo4b2o572b2o14b2o2b2o$ b2o4b2o26b2o3b2o12bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo3b2o6bo3b2o6bo3b2o6b o3b2o6bo3b2o6bo3b2o10bob4o557bob2o6b2obo6bob2o$bo5bo27bobob2o4b6obob2o bob2obob2obob2obob2obob2obob2obob2obob2obob2obob2obo2b3obob2obo2b3obob 2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3ob2o4bo4bo46b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o329b2obo6b ob2o6b2obo$2bo5bo27bo2b2obobo2bo127b3o2b5o40bo2bo3b2o3bo2bo3b2o3bo2bo 3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo 3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o333b2o 2b2o14b2o$b2o4b2o24b3o4bobobo131bobobo4b3o37bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo 339bo2bo16bo18bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo$3b2obo26b o2b4o2bobobo127bobobo2b4o2bo37bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo332bo4bo14bo18b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o$3bob2o29bo3b2obob2o127b2obo b2o3bo46bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo332b2o2b2o14b2o18bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo$39bo3bo133bo3bo44b2o3bo2bo3b2o3bo 2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo 2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo 2bo328bob2o6b2obo6bob2o21b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o$39b2ob2o133b2ob2o44b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o 335b2obo6bob2o6b2obo5$488b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o$487bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2b o12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo$488b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$36b2o136b2o268b2obo6b2obo$36b 2o136b2o268bob2o6bob2o$36b2o136b2o272b2o2b2o4b2o$36bo138bo272bo3bo5bo 24b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$35bobo136bobo272bo3bo5bo23bob o6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bob o6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo$36bobob 3o126b3obobo272b2o2b2o4b2o23b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$37b ob4o126b4obo52b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o25b2obo6b2obo$38bo134bo50bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o25bob2o6bob2o$224bo6bo2bo6bo2bo6bo 2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo 6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo33b2o2b2o4b2o24b3o4b3o6b3o4b3o6b3o4b3o6b 3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o$43bo4bo7bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo7bo4bo2bo 4bo2bo4bo55bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo 2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo33bo3bo5bo25b obo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6b obo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo$44b4o 3b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o3b4o4b4o4b4o281bo3bo5b o24b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o 4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o$43bo4bo2bo12bo2bo12bo2bo12bo 2bo12bo2bo12bo2bo12bo2bo4bo2bo4bo2bo4bo279b2o2b2o4b2o$444b2obo6b2obo$ 38b4o128b4o270bob2o6bob2o$37bo4bo126bo4bo321b2o14b2o14b2o14b2o14b2o14b 2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$36bobo3bo126bo3bobo319bo2bo12bo 2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo 2bo12bo2bo$35bobo3bo128bo3bobo319b2o14b2o14b2o14b2o14b2o14b2o14b2o14b 2o14b2o14b2o14b2o14b2o14b2o$35bo140bo$35bo140bo$35bo2bo134bo2bo$36b2o 136b2o563b2o4b2obo6bob2o6b2obo$740bo4bob2o6b2obo6bob2o$739bo3b2o4b2o2b 2o8b2o$739b2o2bo5bo4bo8bo30bo21bo21bo21bo21bo21bo21bo21bo21bo21bo21bo 21bo21bo21bo21bo21bo21bo21bo$744bo5bo2bo10bo28b3o11bobo5b3o11bobo5b3o 11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o 11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o 11bobo5b3o$739b2o2b2o4b2o2b2o8b2o28bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo 2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo 11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b 2o5bo2bo11b2o5bo2bo$740bo2bo5bo5bob2o6b2obo27b2o10bo9b2o10bo9b2o10bo9b 2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo 9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o$739bo4bo5bo4b2obo6bob2o 26b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o$739b2o2b2o4b2o8b2o2b2o4b2o$446b2o4b2o4b2obo281bo 5bo10bo2bo5bo$227bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobo bo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobo bo5bobobo35bo5bo4bob2o277b2o3bo5bo8bo4bo5bo$226bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo33bo5bo3b2o4b2o276bo2b2o4b2o8b2o2b2o4b2o$38bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo58bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo34b2o4b2o2bo5bo276bo5b2obo6bob2o6b2obo$36b5o5b5o5b5o5b5o5b 5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o57b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o37bob2o5bo5bo16b2o6bo7b 2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b 2o6bo7b2o6bo7b2o6bo42b2o4bob2o6b2obo6bob2o$35bo5bo3bo5bo3bo5bo3bo5bo3b o5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo51b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 32b2obo4b2o4b2o15bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo 5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo 6bo$34bob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob 2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob 2ob2obo49bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5b o3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo35b2o2bo5bo 16bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo 9bo5bo9bo5bo9bo$34bobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobo48bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 35bo3bo5bo15bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6b o2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo$ 34bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bo49bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bo bobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bo bobo35bo3b2o4b2o16bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo 6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o$34bo2bobo2bobo2bobo2bob o2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bob o2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bo279b2o2bo5bo$33bobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo283b o5bo$34b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2o bobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2o bobob2o283b2o4b2o$36bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo281b2o4b2obo$33b3o5b5o5b5o5b5o5b5o5b 5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b3o278b2o4bob2o$33bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo12$225b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o$41bo15bo15bo15bo15bo15bo15bo15bo15bo55b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o$38bo3b2o10bo3b2o10bo3b 2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o$37bo4b2o9bo4b2o9bo 4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o$34bo3b3ob2o3bo2bo3b3ob 2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo 2bo3b3ob2o3bo2bo3b3ob2o52b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b 3o9b3o9b3o9b3o9b3o$34b2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo 3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo53b3o 3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b 3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o$34b2o9bo4b2o9bo 4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o63bo2b2ob2o4bo2b2ob2o4bo 2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo 2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o$ 34b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o 60b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4b o2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4b o2b2ob2o4bo2b2ob2o4bo$33bo15bo15bo15bo15bo15bo15bo15bo15bo62b2o4b3o3b 2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o 3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o$230b3o9b3o9b3o9b3o9b 3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o3$225b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o$225b2o4b2o4b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o11$35b2o12b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o$33b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o 4bo7b2o4bo7b2o4bo$33b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b 2o4bo7b2o4bo7b2o4bo$35bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o 3bo7b3o3bo7b3o3bo7b3o$36b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o 3bo7b3o3bo7b3o3bo7b3o3bo$40b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b 2o4bo7b2o4bo7b2o4bo7b2o4bo$40b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo 7b2o4bo7b2o4bo7b2o4bo7b2o4bo56b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o$42b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o59b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o3$225b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o 4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o 4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o$226b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o 6b8o6b8o6b8o6b8o6b8o$228b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o$ 233b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o$232b2ob4ob 2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob 2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o3$229b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$229b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o7$3bob2o$3b2obo$7b2o$8bo$7bo$7b2o26b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$5b2o27b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o$6bo26b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b 6o6b6o$5bo33b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o153bob2o$5b2o 33b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o154b2obo$3b2o36b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$4bo313b3o$3bo313bo3bo$3b 2o312bo3bo$227bo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob 2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b 2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bo$ 227bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bo7bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bo$227bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bo7bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo$228b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o9b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o2$228b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o bo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo8b2obo2b2obo2b2obo2b 2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo$228bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o 2bob2o2bob2o2bob2o2bob2o2bob2o8bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob 2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o6$3b2obo$3bob 2o$b2o4b2o$bo5bo$2bo5bo21b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o$b2o4b2o22bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo$3b2obo23b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o$3bob2o$b2o4b2o$bo5bo$2bo5bo$b2o4b2o$3b2obo$3bob2o2$ 206b2o6b2obo$207bo6bob2o$206bo5b2o$206b2o4bo21bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo $32b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o49bo16bo3bob o3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3b obo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo 3bobo3bo$33bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo42b2o4b2o15b3o2bob o2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2b obo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o 2bobo2b3o2bobo2b3o2bobo2b3o$31bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob 2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3b ob2ob2o3bob2ob2o39bo6b2obo12bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo$31b2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o 3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob 2o3bob2o36bo7bob2o17bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo$38bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo37b2o4b2o4b2o9bobo2b 3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo 2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bo bo2b3o2bobo2b3o2bobo2b3o2bobo$37b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o43bo5bo10bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bob o3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3b obo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo$206b2o5bo5bo9bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bob o7bobo7bobo7bobo$207bo4b2o4b2o$206bo7b2obo$206b2o6bob2o10$2b2obo$2bob 2o$2o4b2o$o5bo23b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$bo5bo22b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$2o4b2o$2b2obo$2bo b2o$6b2o20b6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6o b6o$6bo$7bo$6b2o$2b2obo24b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$2bob2o24b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o! golly-3.3-src/Patterns/Life/Miscellaneous/blockstacker.rle0000644000175000017500000005222312026730263020655 00000000000000#C Blockstacker #C Builds an infinite line of blocks, growing at the rate of 3c/126. #C Jason Summers, 28-Aug-1999 -- from "jslife" pattern collection x = 531, y = 915, rule = B3/S23 5boo$5boo$$5bo$4bobo$4bobo83boo$5bo84boo$17bo$17bo73bo$bbooboboo7b3o 71bobo$bbo5bo81bobo$3bo3bo83bo$4b3o9b3o60bo$17bo61bo$17bo60b3o7boobob oo$17bo70bo5bo$17bo71bo3bo$16b3o59b3o9b3o$79bo$7bo71bo$8bo7b3o60bo$6b 3o8bo61bo$17bo60b3o$$89bo$15boo61b3o7bo$b5o9boobo60bo8b3o$ob3obo10bo 61bo$bo3bo7b3o$bb3o9boo$3bo76boo37boo$78boboo9b5o22boo$79bo10bob3obo$ 81b3o7bo3bo$3boo76boo9b3o$3boo88bo24b3o$11bo104bobboo$8b4o5bo102bo$7b 4o4boobboo$7bobbo81boo22booboo3bo$7b4o81boo24b3ob4o$bboo4b4o73bo33bobb oobo$bobo7bo67bo5b4o33b3o$bo74boobboo4b4o32b3o$oo16boo3boo61bobbo33boo $18bo5bo61b4o$85b4o4boo$19bo3bo61bo7bobo$20b3o72bo$72boo3boo16boo$72bo 5bo$$73bo3bo$74b3o$120b3o$21boo96bobbo$21boo99bo$40bo81bo$40b3o76bobo$ 43bo$42boo30boo$74boo4$44b3o$$44bobo104bo$43b5o104bo$42boo3boo101b3o$ 42boo3boo6$42boo$43bo$40b3o10boo$40bo4bo7bobbo$44bo3boo7bo16bo$44bo5bo 6bo17boo$45b5o7bo16boo$53bobbo$53boo$72bo$62bo10boo$61bobo8boo$60bo3bo $60bo3bo$60bo3bo52b3o$60bo3bo51bobbo$60bo3bo54bo$60bo3bo50bo3bo$61bobo 51bo3bo$62bo56bo$116bobo3$124bo$123b3o$123boboo$124b3o56bo$124b3o54bob o$124boo56boo10$120b3o$120bobbo$120bo$120bo$121bobo$76boo$76boo$$139b oo$139boo5$140bo$88bo49booboo$87b3o$73boo3boo6booboo46bo5bo$75b3o7b3ob 3o$74bo3bo6b3ob3o45booboboo$75bobo7b3ob3o68boo$76bo8b3ob3o68bo$86boob oo62bo4bobo53bo$87b3o62bobo3boo55bo$88bo62bo3boo56b3o$151bo3boo$73b3o 75bo3boo$79bobo70bobo$73bobo4boo71bo$72b5o3bo76boo$71boo3boo79boo$71b oo3boo$146bobo9bo$145booboo7bobo$74bo12bo56boobb3o6bobo$72boo14boo53b oo3boo8bo365boo$87boo28b3o24boo378boo$71bo45bobbo$92boo23bo37booboboo$ 72bobbo16bobo22bo3bo33bo5bo363bo$74boo17bo23bo3bo34bo3bo278boo83b3o$ 80boo35bo35bo3b3o279boo82bo3bo$80bobo20bo14bobo23bo7boo371bo$83bo20bo 39bo7bobo358bo8bo5bo$80bobbo18b3o334bo72b3o7bo5bo$83bo40bo19bo293b3o 70bobobo7bo3bo$73boo5bobo40b3o17bobo291bo3bo69bobobo8b3o$72bobo5boo40b oobo313bo72b3o$72bo49b3o18b3o290bo5bo8bo61bo$71boo49b3o31bo279bo5bo7b 3o$123boo31bo280bo3bo7bobobo$91b3o49b3o9bobo280b3o8bobobo59bo9bo$90bo 3bo59booboo291b3o59b3o$89bo5bo47bobo7bo5bo291bo59bobobo$90bo3bo49bo11b o354bobobo7bo$91b3o59boo3boo352b3o8bobo$91b3o50bo296bo9bo61bo9boo$144b o101bo203b3o$157bo86bobo202bobobo$157bo87boo194bo7bobobo$92boo26b3o35b o280bobo8b3o71boo3boo$92boo8boo15bobbo317boo9bo64bo$102boo18bo392bo9bo 3bo$122bo32boo358b3o8b3o$119bobo24boo7boo369b3o$146boo286boo3boo$448bo $435bo3bo9bo$436b3o8b3o$101b3o332b3o69bo17boo$100bo3bo395bobo5bobo15b oo$500boo6boo8boo$99bo5bo40b3o352bo8b4o4b3o$81boo16boo3boo39bo3bo361b 4o5boobo$82bo354boo17bo52bobo3bo4bobbo$82bobo7bo51bo5bo286boo15bobo5bo bo49bo5boobo$83boo4b4o51boo3boo16boo276boo8boo6boo53b3o6boo$88b4o75bo 276b3o4b4o8bo54boo7bobo$88bobbo65bo7bobo273boboo5b4o75bo$88b4o4boobboo 55b4o4boo274bobbo4bo3bobo50booboboo16boo$89b4o5bo59b4o279boboo5bo55bo 5bo$92bo65bobbo249bo24boo6b3o60bo3bo$84boo62boobboo4b4o248bobo22bobo7b oo61b3o$84boo65bo5b4o249bobo22bo$157bo253bo22boo16booboboo$164boo286bo 5bo$164boo287bo3bo$84bo18bo350b3o$83b3o9boo6boo$82bo3bo7bobo5bobo$81bo b3obo8bo49bo18bo342boo$82b5o58boo6boo9b3o110bo230boo$145bobo5bobo7bo3b o110bo211bo$153bo8bob3obo107b3o209b3o$163b5o319bo$98bo356boo30boo$87b 3o8bo312b3o41boo$89bo7b3o310bobbo$88bo62bo261bo$151bo8b3o246bo3bo$97b 3o50b3o7bo22boo224bo3bo$98bo62bo21boo228bo70b3o$98bo311bobo70bo3bo$98b o51b3o$98bo52bo330bo5bo$85b3o9b3o51bo116boo136bo75boo3boo$84bo3bo62bo 116boo135b3o$83bo5bo61bo253boboo$83booboboo7b3o50b3o9b3o29b3o209b3o$ 98bo62bo3bo17bo203bo18b3o$98bo61bo5bo15b3o8bo3bo188bo19boo$86bo63b3o7b ooboboo14b5o7bo3bo188b3o98boo$85bobo63bo28boo3boo300bo$85bobo63bo42b3o 59b3o217boo10b3o$86bo76bo105bo205bobo12bo$162bobo90bo3bo8b3o203bo6boo bboo$86boo74bobo17b3o9b3o58bo3bo7b5o202bobbobbobboboo$86boo75bo18b3o 81boo3boo201bo6boo$193bo3bo58b3o216bobo$162boo17bo11bo3bo278boo$70boo 48b3o39boo16bobo225b3o$70boo48bobbo55bo3bo10b3o59b3o9b3o137bobbo56bo$ 120bo59b3o85b3o137bo59bo$120bo57boo3boo4bo65bo3bo148bo58bobo$121bobo 63bobo65bo3bo11bo137bobo56bo$188boo80bobo195bo$70bo185b3o10bo3bo35bo 158bo$68booboo197b3o34bobo158bo$194boo67bo4boo3boo33boo157bobo$67bo5bo 120boobboo63bobo202bo$263boo175bobo25bo$67booboboo7b3o112bobbo240boo$ 81bobo357bo$81b3o112boo59boo$68bo12b3o97boo70boobboo$68bobbo9b3o97boo 259bobo$68bo12b3o103bobo63bobbo185boo$71boo8bobo103bobbo252bo$72bo8b3o 106boo63boo$70bobo115bo3boo76boo$70boo118boo78boo$180boo5bobbo72bobo$ 179bobo5bobo72bobbo$65boo3boo107bo19bo61boo$65bo5bo106boo18b3o58boo3bo 90bo$78bo118b5o59boo92bobo$66bo3bo5bobo5bobo109bobobobo59bobbo5boo82b oo$67b3o7boo6boo109boo3boo60bobo5bobo$85bo167bo19bo$252b3o18boo$199bo 51b5o$198bobo49bobobobo$198bobo49boo3boo$199bo$68boo129boo252boo$68boo 129boo52bo199boo$77boo38b3o79boo51bobo156b3o$76bo3bo36bobbo97bo33bobo 135boo19bobbo$75bo5bo35bo100b3o32bo136boo19bo$75bo3boboo34bo3bo99bo30b oo157bo3bo$75bo5bo4bo30bo3bo98boo30boo86bo70bo3bo$67boo7bo3bo4bobo29bo 115bo18boo87bo69bo$66bobo8boo5bo3bo29bobo113boo103b3o70bobo$66bo18b3o 135boo8boo155bo$65boo16boo3boo250bo49bo60booboboo$124bo215boo47bobo14b o34b3o$123b3o213bobo46booboo12b3o33bobo7bo5bo$122boobo94boo3boo5bo154b o5bo10boobo33b3o$122b3o17boo76boo3boo6bo156bo13b3o34b3o8booboo$122b3o 17boo87b3o135boo16boo3boo10b3o34b3o10bo$123boo97b3o145bo34boo34b3o$ 143bo78b3o145bobo5bo62bobo$142bobo78bo147boo3bobo62b3o$142bobo230bobo$ 143bo230bobbo$86boo287bobo73bo$86boo132boo154bobo70boo4b3o$95boo43boob oboo74bo156bo71boobbo3bo$95boo43bo5bo71b3o12boo137boo$141bo3bo72bo13bo bo137boo79bo5bo$120b3o19b3o18boo57boo7b3o4boo168b3o42boo3boo$119bobbo 40bo58boo6b3o4boobo166bobbo$122bo31boo5bobo67b3o138bo37bo$122bo30b3o5b oo69bobo136b3o36bo31bobo11bo$94b3o22bobo28boboo79boo135bo3bo9boo21bobo 32boo11bobo$150bobbo218bo70bo11bobo$94bobo53boboo215bo5bo7bo73bo$93b5o 55b3o83b3o127bo5bo60boo19bo$92boo3boo55boo83bobo128bo3bo9bobo49boo16bo bbo$74boo16boo3boo61boo77b3o129b3o10boo69boo$75bo84boo77b3o208boo$75bo bo6bo154b3o134boo71bo3bo$76boo4bobo154b3o135boo6b3o60bo5bo$80boo157bob o66boo66bo8b3o60bo3bobbo$80boo157b3o67boo75bo61bo$80boo213bo12bo77bo 62bo3bo3bo$82bobo209bobo89bo63boo3boobo$84bo209bobo88bobo70bo$77boo67b oo147bo162boo$77boo67boo6bo219bo$153boo3boo3boo208b3o9bobo$153bobo217b 3o10bo48boo3boo$77bo81bo3bo222bo50b3o$76bobo68bo12b3o208boo3boo8bo49bo 3bo$75bo3bo9boo55b3o11b3o208boo3boo7b3o49bobo$75b5o9boo54bobobo235b3o 50bo$74boo3boo7boo55bobobo262bo$75b5o9bobo54b3o10bo214bo37bobo$76b3o 10boo56bo10b3o212bobo36boo$77bo12bo66bo3bo210boo63boo$159bo212boo53boo 8boo$81boo64bo8bo5bo209b3o52boo$80bobo8bo54b3o7bo5bo210bobo$82bo7b3o 52bobobo7bo3bo212boo7boo$145bobobo8b3o222boo$146b3o93boo$90b3o54bo94b oo$$90bobo$90bobo334b3o$78b3o345bo3bo$77bo3bo8b3o200bo131bo5bo$254bo 39boo21boo63b3o27boo11booboboo16boo$76bo5bo75boo94bo38boo22boo62bo3bo 25boo35bo$76boo3boo7b3o65boo81b3o9b3o124bo5bo26bo23boo7bobo$91bo148bo 3bo117boo16booboboo11boo37b3o6boo$239bo5bo45bo71bo35boo32bo5boobo$79bo 159booboboo7b3o36boo25boo42bobo7boo23bo29bobo3bo4bobbo$78bobo173bo36b oo71boo6b3o55b4o5boobo$78bobo173bo41b3o70boboo5bo51b3o4b3o$78bo163bo 11bo41bo72bobbo4bo3bobo53boo$78bo162bobo10bo42bo71boboo5b4o45bo17boo$ 78bobbo159bobo9b3o59boo3boo50b3o4b3o45bo17boo$5boo72boo160boo73b5o52b oo52bo$3bobbo233bo75booboo17boo25boo17bo$239b3o11b3o60booboo17bo26boo 17bo$bbo235bo3bo11bo62b3o6bo9bobo45bo$237bob3obo10bo35bo34bobo8boo107b 3o$3boo85boo146b5o4bo41b3o32boboo106b3o8b3o$5bo84bobbo154boo39boboo30b ooboo106bo9bo3bo$17bo229boo5boo34b3o31boboo36b3o41b3o24bo$16bobo75bo 159boo34b3o32bobo36b3o8b3o30bobbo31boo3boo$bboo3boo281boo34bo36bo3bo9b o30bo$bboo3boo83boo241boo39bo31bo$3b5o8b3o72bo224boo17boo25boo3boo40bo bo$4bobo9b3o60bo237b4o111bo9boo$17bo60bobo219bo17boobo109b3o8bobo$4b3o 81boo3boo204b3o128bobobo7bo$88boo3boo204boboo65boo9bo50bobobo$17bo60b 3o8b5o146boo58b3o64bobo8b3o50b3o$16b3o59b3o9bobo147boo58boo67bo7bobobo 50bo9bo$16b3o60bo167bo129bobobo$90b3o154b4o76boo7bo41b3o$8bo239b4o74b oo7b3o31bo9bo52bo$9bo6bobo60bo168bobbo76bo5b5o92b3o$7b3o7bo60b3o167b4o 81boo3boo90bobobo8b3o$3bo74b3o158boo6b4o71bo56bo50bobobo7bo3bo$bb3o 233bobo6bo73bobo54b3o50b3o7bo5bo$b5o82bo149bo18b3o73boo31b3o8bobobo50b o8bo5bo$oo3boo71bobo6bo149boo17bo3bo71bo32bo3bo7bobobo62bo$79bo7b3o 231b3o11bo28bo5bo7b3o61bo3bo$16bo76bo161bo5bo59b3o8bobbo28bo5bo8bo63b 3o$14bobo75b3o160boo3boo60bo9booboo30bo76bo$bb3o10boo74b5o238boo29bo3b o$bb3o85boo3boo269b3o$258bo63bo44bo75boo$22bo57bo176bobo61b3o7boo3boo 105boo$3boo17bo57bobo174bobo61b3o7boo3boo$3boo17bo57boo10b3o162bo74b5o 30boo$8bo83b3o162bo75bobo31boo90boo$7bobo247bobbo60bobo135boo$6boboo 64bo183boo8boo52bo10b3o$5booboo64bo17boo174boo$6boboo64bo17boo$bboo3bo bo78bo223boo$bobo4bo78bobo222boo146bo$bo85boobo26b3o291b3o34bo11bo$oo 35bobo47booboo25bobbo146b3o63boo76bobbo33bo10bobo$18boo3boo13boo47boob o26bo149b3o63boo76bo46booboo$19b5o14bo48bobo3boo22bo3bo144bo3bo140bo3b o32bo8bo5bo$19booboo64bo4bobo21bo3bo190b3o96bo3bo31bobo10bo$19booboo 71bo21bo147boo3boo40b3o96bo45boo3boo$20b3o34bobo35boo21bobo190bo3bo96b obo32b3o$57boo13boo3boo168boo$58bo14b5o170bo61boo3boo142b4o$73booboo 46bo123bobo4bo150bo40b3o8boobbo$73booboo45b3o123b3ob4o76boo70b3o50boob o$74b3o45boobo125booboboo75bo70boobo39bobo$21boo99b3o126bobbob3o36b3o 28bo4bobo70b3o41bo10boo$21boo99b3o127boboboo37bobbo26b4ob3o71b3o52bo$ 40bo82boo128b4o38bo28booboboo74boo41bo$40b3o212bo39bo3bo23b3obobbo117b o$43bo206boo43bo3bo24boobobo129booboboo$42boo30boo174boo43bo29b4o124bo 5bo5bo$74boo174boo44bobo27bo125bo7bo3bo$250bo8booboo66boo120b3o6b3o$ 249bobo6bo3bobo65boo$44b3o202bobo6bo3bobbo24bo39boo$44b3o203bo7bobo4bo 23b3o26booboo8bo$43bo3bo215b3o22boobo25bobo3bo6bobo$120b3o165b3o25bobb o3bo6bobo75b3o$42boo3boo70bobbo124boo3boo34b3o25bo4bobo7bo75bobbo$122b o124bobobobo35boo25b3o91bo32bo$122bo125b5o157bo32bo17boo$119bobo127b3o 3boo71boo3boo72bobo33bo17boo$250bo3bobo71bobobobo117bo$256bo43bo28b5o 117bobo$299b3o23boo3b3o116boo3bo$264bo33boobo23bobo3bo117boo3bo$42boo 220bo33b3o24bo105bo17boo3bo$43bo219bobo33boo128boo13bo6bobo8boo$40b3o 11bo209bo52bo112boo10booboo5bo9bobo$40bo13b4o206bo52bo146bo$44boo9b4o 192b3o10bo51bobo122bo5bo16boo$44boo9bobbo191booboo9bo52bo$49bo5b4o191b ooboo8bobo51bo123booboboo$49bo4b4o192b5o9bo52bo10b3o$54bo194boo3boo8bo 52bo9booboo55boo$61b3o252bobo8booboo55boo$60bo3bo252bo9b5o$60bo3bo252b o8boo3boo$61b3o323bo$250boo134b3o$385bo3bo$387bo55boo$330boo52bo5bo52b oo$61b3o188boo130bo5bo43boo$60bo3bo187boo131bo3bo44boo$60bo3bo321b3o$ 61b3o264boo36boo$328boo37bo$367bobo5boo$368boo5bobbo$379bo$379bo54b3o$ 379bo53bo3bo$375bobbo$97bobo275boo55bo5bo$98boo269boo61boo3boo16boo$ 98bo270boo84bo$249boo194bo7bobo$249boo132bo6b3o52b4o4boo$95bobo285boo 7bo53b4o$96boo269boo13bobo6bo54bobbo$96bo151b3o184bobobboo4b4o$248b3o 175boo7bo3bo5b4o$425boo6boo10bo$427bo5b3o16boo$260b3o103boo3boo61bo17b oo$246boo3boo114b5o3boo$247b5o7bo3bo103booboo4boo$248b3o8bo3bo103boob oo3bo$76boo171bo118b3o82bo$76boo182b3o120bo57boo9b3o$382b3o56bobo7bo3b o$139boo240b5o55bo8bob3obo$139boo119b3o188b5o$370b3o$259bo3bo106b3o$ 250bo8bo3bo105bo3bo$88bo50b3o109boo115bo5bo64bo$87b3o49b3o108boo8b3o 106bo3bo65bo8b3o$75b3o8bobobo47bo3bo227b3o8b5o52b3o7bo$74bo3bo7bobobo 46bo5bo238b3o64bo$73bo5bo7b3o48bo3bo240bo$73bo5bo8bo50b3o296b3o$76bo 167boo3boo9boo38bo138bo$74bo3bo81boo84b3o10booboboo33b3o137bo$75b3o10b o71bo84bo3bo12bobobo32boboo136bo$76bo10b3o61boo5bobo85bobo10bo6bo33b3o 136bo$86bobobo59bobo5boo87bo6bobo4bo3bo34boo136b3o9b3o$86bobobo58bo 104bobobobo188bo3bo$73b3o11b3o59bobbo218boo75bo5bo$73b3o12bo60bo221boo 65b3o7booboboo$72bo3bo73bobo94boo190bo$80bobo68boo94boo190bo$71boo3boo 3boo74boo95bobo5bo188bo$81bo75bobbo92bobbo3bobbo186bobo$252boo6bo189bo bo$136boo23bo88boo3bo3bo3boo186bo$87boo47bobo5boo106boo$87boobboo43bo 6boo14boo85boo5bobbo193boo$91boo52bo12bo86bobo6bobo193boo72boo$90boo 153bo277bobbo$89boo153boo16boo3boo257bo$89boo64boo3boo100bobobobo257bo $74boo79boo3boo101b5o256bobo$74boo76bo3b5o103b3o172boo83bobo$80boo69b oo4bobo105bo55boo115bobbo83bo$80b3o68bobo167boo115bo$82boobo71b3o278bo 74bo$82bobbo352bobo71b3o7boo3boo$82boobo58bo293bobo81bo5bo$73boo5b3o 60b3o293bo$72bobo5boo60booboo365b3o8bo3bo$72bo68b3ob3o8bo108boo184bo 72b3o$71boo18b3o47b3ob3o7bobo107boo144b3o22boo3boo7b3o59bobo$90bo3bo 46b3ob3o6bo3bo115boo135bobbo21bo5bo69bobo$89bo5bo45b3ob3o7b3o116boo43b ooboboo85bo$89booboboo46booboo6boo3boo251bo3bo21bo3bo8b3o59b3o$143b3o 173bo5bo16boo67bo3bo22b3o$144bo197bo68bo38bobo$92bo180b3o44booboo5bo9b obo69bobo35bobo59b3o7bo$91bobo179b3o46bo6bobo8boo171bo8bobo$91bobo178b o3bo50boo3bo117b3o69boo$92bo31bo146bo5bo49boo3bo73bo$123b3o146bo3bo50b oo3bo72b3o119bo$92boo28boobo147b3o53bobo72boobo34bo7b3o73b3o$92boo8boo 18b3o170b3o32bo73b3o33bobo8bo73b5o$102boo18b3o128boo40bobbo40boo63b3o 34boo72bo8boo3boo$123boo30boo97bo40bo43boo64boo107bo10b5o$146boo7boo 97bobo5boo31bo3bo137bo71bo4b3o8bo3bo$146boo107boo5bobo30bo3bo24bo111b 3o70boo15bobo$265bo29bo27boobo108b5o69b3o15bo$262bobbo30bobo24booboo 106boo3boo8bo61boo$101b3o161bo59b3o107b5o10bo56bo$100booboo157bobo170b o3bo8b3o4bo70boo$100booboo157boo26bo145bobo15boo56bo13boo$100b5o41b3o 107boo31b3o38b3o6b3o95bo15b3o56bo7bo$99boo3boo39booboo104bobbo30boobo 38bo7bo3bo109boo58bo7bobo$81boo37b3o22booboo117b3o18b3o40bo5bo5bo64b3o 46bo55bo9boo$82bo36bobbo22b5o103bo10b6o18b3o46booboboo63bobbo26boo84b oo$82bobo4bo32bo21boo3boo112bobb3o20boo35bo83bo26boo13bo70boo$83boo3bo bo31bo44boo85boo10bo4boo53bo83bo33bo7bo67bobo4boo$87boboo28bobo45bo88b o6b3obboob3o63bo69bobo32bobo7bo67bo6bobo$86booboo69bo4bobo100boobbo53b o10boo101boo9bo77bo$87boboo68bobo3boo103boo28bo24bobo112boo64boo3boo 16boo$88bobo68boobo90boo3boo39b3o34boobo100boo64boo3boo$89bo69booboo 89boo3boo38boobo23b3o8boobbo95boo4bobo62b5o$84boo73boobo91b5o3bo35b3o 36b4o94bobo6bo63bobo$84boo17boo54bobo93bobo4boo35boo134bo$103boo55bo 100bobo61b3o106boo16boo3boo49b3o$164boo89b3o77boo3boo110boo3boo$83b3o 59boo17boo159bobo10bo114b5o$83b3o10boo47boo123bo55bo8bo5bo112bobo$95bo bo171b3o64booboo$97bo66b3o101booboo53bo10bobo114b3o$152boo10b3o91bo8b 3ob3o52bo11bo169boo$81boo3boo64bobo102bobo7b3ob3o64bo169boo$82b5o65bo 103bo3bo6b3ob3o216bo$83b3o171b3o7b3ob3o204bo9b3o$84bo77boo3boo86boo3b oo6booboo203boo9bo$88b3o7bo64b5o101b3o183boo20boo8boo$90bo6bobo64b3o 103bo66boo116boo$89bo75bo171boo$151bo7b3o$97b3o50bobo6bo319bo$97b3o60b o22boo293bo5b3o$98bo84boo293b3obbooboo$150b3o330booboo$85b3o62b3o330b 5o$98bo52bo330boo3boo$85bobo9b3o158boo8boo$84b5o8b3o62b3o93boo8boo$83b oo3boo61bo31bo$83boo3boo60b3o9bobo17b3o9b3o$97bobo50b3o8b5o16b3o9b3o$ 98bo61boo3boo28bo$86bo73boo3boo13boo3boo8bo291boo$84boo64bobo27boo3boo 8bo73bo217bo$151bo42bobo59b3o9b3o205boo10b3o$83bo79bo92b3o9b3o204b3o 12bo$164boo16boo73bo214boboo9boo$84bobbo94bobo9bobo60bo8boo3boo199bobb o4bo5bo$86boo78bo14bobboo9bo61bo8boo3boo199boboo5bo$183boo10bo60bobo 216b3o3bo3bo$162bobbo17boo10bo280boo5bo$70boo90boo20bo9b3o72boo$70boo 122b3o59bobo9bobo196b3o$178bo5bo72bo9boobbo194bo3bo$178bo5bo72bo10boo 195bo5bo$179bo3bo6bo66bo10boo$69b3o108b3o5bobo5bobo57b3o9bo195bo7bo$ 69b3o117boo6boo57b3o205bo7bo$68bo3bo124bo70bo5bo$67bo5bo194bo5bo190bo 5bo$68bo3bo9bo179bo6bo3bo192bo3bo$69b3o9b3o170bobo5bobo5b3o194b3o$80b 5o169boo6boo$255bo$$181boo$68bobo110boo$68bobbo118bo$70boobo116bobo$ 80b5o106bobo$70bo10b3o107bobbo75boo$70boboo8bo108bobo76boo$71bo108boo 8bobo6bo62bo$179bobo8bo8bo60bobo$179bo18bobo58bobo$65boo3boo106boo17b ooboo56bobbo$66b5o125bo5bo56bobo$66booboo8bo119bo53bo6bobo8boo$66boob oo6bobo116boo3boo50bo8bo8bobo$67b3o8boo172bobo18bo$251booboo17boo$198b o51bo5bo$198bo54bo$197bo52boo3boo$87boo329bo$68boo17boo327boo35boo$68b oo129boo53bo162boo34boo$76boo121boo53bo$74bobbo140bo36bo134boo$73bo7b oo135b3o169boo28bo$73bo6bobb4o134bo196boo$73bo7boob4o132boo30boo165boo $67boo5bobbo10bo163boo$66bobo7boo8bo303bo$66bo16bo5bo299bobo50bo$65boo 16bo5bo298bo3bo48b3o$84bo3bo300b3o48b5o8b3o$85b3o299boo3boo58bo3bo$ 407b3o41bo5bo$142boo76booboboo182bo42bo3bo$108bo33bobbo223boo37bo44b3o $109boo109bo5bo143bo82b3o$108boo36bo223boboo3boo$221booboo145bo3bo3bo 60b5o$144boo77bo156bo60b3o$143bo229bobbo3bo61bo$86boo286bo5bo74b3o$86b oo132boo153bo3bo70bo3booboo$95boo43boo3boo74bo155boo69boo4booboo$95boo 43boo3boo71b3o11bobo137boo32bo42boo3b5o$141b5o72bo12bobbo3bo132bobbo 15b3o12b3o33boo10boo3boo$142bobo18boo57boo6boo6bo132bo32boobo33boo$ 163bo58boo4boo3bo61b3o73bo32b3o$142b3o8bo7bobo66boo63bobbo72bobo11bo 18b3o$94b3o32b3o19bobo7boo68bobbo60bo75bobo11boo18boo$94b3o32bo19boo 81bobo60bo3bo72bo11bobo70boo$93bo3bo32bo18boo89bo15bobo36bo3bo$149boo 88b3o15boo36bo$92boo3boo13boo37bobo84b5o14bo38bobo70boo3boo$113boo38bo 215bo5bo79boo$74boo36bo47boo293boo$75bo65b3o16boo92bobo33bo79bo3bobboo 70boo$75bobo4bo172boo32b3o79b3o4boo67bobbo$76b3ob4o61boo108bo32boobo 85bo68bo$78booboboo203b3o117b3o35bo$78bobbob3o152b5o45b3o116bobbo35bo$ 79boboboo154b3o47boo94b3o22bo36bobbo5boo$80b4o156bo144bobo22bo38boo5bo bo$82bo302b3o19bobo48bo$77boo17bo56bo220bo10b3o70boo$77boo17bo55boo7bo 138bo71booboo8b3o49b3o$77boo17bo55bobo5b3o136b3o83b3o48bo3bo$77bo81b5o 134boobo69bo5bo7bobo47bo5bo$76bobo79boo3boo133b3o84b3o47bo5bo$76bobo 10b3o55bo11b5o135boo70booboboo60bo$77bo13bo54b3o10b5o272bo3bo$90bo68bo bbo274b3o$158bo3bo275bo$74boo3boo65b3o9bo$74bobobobo77boboo$75b5o66bob o10bo277boo$76b3o3boo62bobo278boo8boo$77bo3bobo343boo$83bo62b3o7boo3b oo211boo$156bo5bo211boo7boo$91bo291boo$91bo54b3o8bo3bo80boo$90bobo54bo 10b3o81boo$91bo335b3o$91bo$78b3o10bo335bobo$77booboo9bo290b3o41b5o$77b ooboo8bobo332boo3boo$77b5o9bo149b3o10bo62boo63bobo40boo3boo16boo$76boo 3boo8bo66boo93bobo61boo62b5o62bo$158boo81bobo136boo3boo52bo6bobo$240b 5o117boo16boo3boo52bobo4boo$239boo3boo7b3o107bo78boo$239boo3boo7b3o 107bobo6bo69boo$77boo175bo109boo4bobo69boo$368boo69bobo$241boo125boo 69bo$240booboo9bo113boo75boo$79boo160bobbo8b3o114bobo72boo$79boo160bo 11b3o116bo57bo$244bo71b5o17boo25boo63bo4bo$242boo71bob3obo16bo26boo67b 3o9bo$253bobo60bo3bo6bo8bobo42bo50boo3bo7bobo$254bo62b3o7boo7boo38bo4b o53boo7bo3bo$237boo3boo74bo3boo4boo35bo9b3o54boboo8b5o$238b5o5bo73boo 4b3o33bobo7bo3boo53bo9boo3boo$239b3o7boo71boo4boo33bo3bo7boo67b5o$240b o7boo77boo34b5o8boobo65b3o$327bo34boo3boo9bo67bo$335boo26b5o$335boo27b 3o74boo$365bo66bo8bobo$431b3o7bo$325booboo39boo$318bo5boo3boo37bobo8bo $240boo16b3o56bobo4b3ob3o39bo7b3o50b3o$240boo75boo4bobobboo6bo$250bo 71b3o3boo5b3o93bobo$249bobo69bobbo10b3o40b3o50bobo$249boobo69bo120b3o$ 249booboo79boo3boo38bobo50b3o8bo3bo$249boobo19bo60boo3boo38bobo$239boo 8bobo18bobo93b3o72bo5bo$238bobo9bo6b3o11boo92bo3bo8b3o50b3o7boo3boo$ 238bo17booboo72boo97bo$237boo17booboo61bo9bobo29bo5bo$256b5o60bobo7boo 31boo3boo7b3o63bo$255boo3boo58bo3bo7boo45bo63bobo$320bo3bo7boo109bobo$ 320bo3bo10b3o29bo77bo$320bo3bo41bobo76bo$320bo3bo41bobo73bobbo$256boo 62bo3bo41bo76boo$321bobo42bo$322bo8boo3boo28bobbo$367boo90boo$258boo 72bo3bo122boo$258boo8boo63b3o$268boo63b3o$$312boo146bo$268bo43boo145bo bo$267bobo188bo3bo$266bo3bo62boo124b3o$266b5o42bo19boo122boo3boo$265b oo3boo40bobo133bo$266b5o40bo3bo131b3o$267b3o41b5o130booboo$268bo41boo 3boo128b3ob3o$247boo62b5o129b3ob3o10bo$248bo63b3o130b3ob3o10bo$248bobo 5boo55bo131b3ob3o6b3obo$249boo5bobo74boo111booboo$257b3o73bo113b3o7bo$ 258b3o63boo5bobo114bo8boobo$257b3o63bobo5boo126boo$256bobo63b3o$256boo 63b3o$250boo70b3o134boo3boo$250boo71bobo133boo3boo$324boo126bo7b5o$ 271boo57boo119bo9bobo$248bo14b3o6boo56boo119b3o$249bo15bo5bo189b3o$ 249bo14bo44boo137boo$308boo6b3o14bo114b3o$310bo5bo15bo111b3oboo$247boo 3boo63bo14bo112boo$250bo$247bo5bobboo203boo$248booboobbobo70boo3boo 126boo$249bobo5bo73bo121boo$250bo73boobbo5bo118bobo$250bo73bobobbooboo 114boo6bo$263b3o58bo5bobo114bobbobbobbo$262bo3bo64bo111b3obboo6bo$261b o5bo63bo111b3o7bobo6boo$252bo63b3o123bo3bo6boo7bobo$251b3o6bo7bo46bo3b o121bo5bo16bo$250bo3bo5bo7bo45bo5bo87b3o31bo3bo17boo$249bob3obo73bo77b obbo32b3o$250b5o6bo5bo45bo7bo6b3o79bo$262bo3bo46bo7bo5bo3bo78bo$263b3o 60bob3obo54boo18bobo$314bo5bo6b5o54bobbo$300bo14bo3bo66bo$299b3o14b3o 67bo$298boobo84bobo$298b3o85bobo$299boo86bo$443boo$443boo$252boo130boo 3boo43boo$252boo130bo5bo43boo$$328boo36boo17bo3bo$328boo37bo18b3o$367b obo6bo$368boo6b4o$377b4o53b3o$377bobbo52booboo$377b4o52booboo$376b4o 53b5o$376bo55boo3boo$369boo84boo$369boo17boo65bo$249boo133bo3boo58bo4b obo$248bobo133boo61bobo3boo$247b3o133bobo61boobo$247boo198booboo$247b oo198boobo$248bobo186bobo7bobo$249bo187bobo8bo$438bo13boo$260b3o113boo 74boo$246boo3boo7b3o114boo$246boo3boo8bo105b5o4bo60boo$261bo104bob3obo 10bo52bobo13b3o$248b3o10bo105bo3bo11bo50bobbobboo10b3o$248b3o9bobo105b 3o11b3o50boo3bobo$249bo119bo70bo$370boo$260bobo107bobo9b3o65boo3boo$ 261bo108bobo10bo67b5o$261bo109bo11bo68b3o$261bo121bo69bo$251bo8b3o120b o55bo7b3o$252boo6b3o105booboboo7b3o53bobo6bo$251boo115bo5bo73bo$369bo 3bo$246b3o121b3o9b3o53b3o$245bo3bo133bo54b3o$244bo5bo132bo55bo$244bo5b o$247bo10bobo189b3o$245bo3bo9boo178bo$246b3o10bo178b3o9bobo$247bo190b 3o8b5o$371boo75boo3boo$265boo104boo75boo3boo$247boo16bobo170bobo$247b oo18bo171bo$253bo21bo175bo$251bobo9bo9bobo176boo$250bobo11boo8boo$249b obbo201bo$250bobo$246boo3bobo196bobbo$245bobo5bo196boo$245bo$244boo16b oo3boo$265bo$262bo5bo$263booboo$264bobo54boo$265bo55boo$265bo5$265boo$ 265boo$274boo$274boo$321b3o$274bo45bo3bo17boo$273bobo43bo5bo16bo$273bo bo44bo3bo6boo7bobo$274bo46b3o7bobo6boo$321b3obboo6bo$325bobbobbobbo$ 271booboboo48boo6bo$271bo5bo53bobo$272bo3bo54boo$253boo18b3o63boo$254b o84boo$254bobo5boo$255boo5b3o$264boobo$264bobbo$264boobo$262b3o57boo 15b3o$262boo57boo6b3o$256boo65bo5bo9bobo$256boo72bo7b5o$278boo57boo3b oo$270boo5bobo57boo3boo$271boo6bo$270bo$337boo$326bo8boobo$325b3o7bo$ 324booboo$263bo59b3ob3o6b3obo$253boo3boo3boo58b3ob3o10bo$262bobo58b3ob 3o10bo$254bo3bo64b3ob3o$255b3o12bo53booboo$255b3o11b3o53b3o$268bobobo 53bo$268bobobo62boo3boo$258bo10b3o65b3o$257b3o10bo65bo3bo$256bo3bo76bo bo$258bo79bo$255bo5bo8bo$255bo5bo7b3o$256bo3bo7bobobo$257b3o8bobobo64b oo$269b3o65boo$270bo7$258boo$258boo! golly-3.3-src/Patterns/Life/Miscellaneous/infinity-hotel3.rle0000644000175000017500000002141012026730263021225 00000000000000#C "Infinite LWSS hotel" #C A new LWSS is added to the loop every 250 generations. #C The old LWSSs reenter the stream at a point 12/25ths of the #C way between the new LWSSs. Unlike earlier patterns of this #C type, this one will not work (for long) if the old spaceships #C re-enter exactly halfway between the new ones. #C Jason Summers, 20 October 2002; c/3 portions by David Bell. #C From "jslife" pattern collection. x = 515, y = 298, rule = B3/S23 196boo141boo$196bobbobo133bobobbo$198boob3o129b3oboo$204bo127bo$198boo b3o129b3oboo$198boobo133boboo3$163boo207boo$164bo207bo$162bo211bo$162b oo209boo$154bo227bo$154b3o223b3o$157bo221bo$156boo10bo210boo$165bo3bo 6bo176boo$165bo4bo4b4o173b3o15boo$165bo3bo3b5obo73bo29bo67b3obo14boo$ 166b3o3bo6boo71bobo27bobo65b3obo$166bobobbo3bob3o73bo29bo67b4o$162b3ob obo3bobobboo173boo$167boo$258boo17boo$233boo23boo17boo23boo$175boo57bo 31booboo31bo57boo$176bo57bobo29bo3bo21bo7bobo57bo$173b3o59boo27bobo3bo bo20bo6boo59b3o$173bo17boo51b3o11boo4boo5boo4boo10bobobbo49boo17bo$ 171bobo18bo50booboo10boo17boo9b3o3bo49bo18bobo$171boo16b3o52bobboo46bo 49b3o16boo$189bo34boo18bo4bo33boo3b5obo16boo34bo$147boo76bo18bobobboo 15booboo12b4o5boo17bo76boo$147bo77bobo19bob3o15bobo15booboo19bobo77bo$ 149boboo18boo53boo5bo13boobbo10boobo5boboo34boo53boo18boobo$148booboo 18bobo59bobo11bo3bo10booboo3booboo10bobo3bo71bobo18booboo$173bo59boo9b 3o3bo34bobb3obo70bo$148booboo20boo74bo12booboo3booboo12boo3boo68boo20b ooboo$149bobo85boo8bo15bobo5bobo14bo9boo7bo77bobo$149bobo68boo14bobbo 7bo15bobo5bobo15bo7bobbo4bobo7boo68bobo$150booboo65boo15boo25bo7bo25b oo6boo7boo65booboo$152bobo88b3o136bobo$152bo31boo165boo31bo$151boo31bo 167bo31boo$182bobo17bo149bobo$181bobo18bo133b3o14bobo$177boo3bo19boo 150bo3boo$177boo157bobo19boo$203b3o31boo59boo36bobo$203boo32boo59boo 36b3o$184boo13boo135boboo$180boobb3obboo5bo3boo11boo107boo7bo6boo17b3o bo$179boo4bobobbo4bobo15boo107boo6b3ob4o18bo3boboo$180boboobo3bo4bo3bo 131boob4o19boo4bo$181boo3bo8bobo33boo71boo26b3o21bob4o$196bo34bobo69bo bo33b3o$233bo69bo35bo$233boo67boo$158boo217boo$158boo217boo$164boo205b oo$164boo56boo89boo56boo$222bobo87bobo$224bo87bo$162boo60boo85boo60boo $162boo5boo40boo111boo40boo5boo$169boo40boo111boo40boo3$209boo115boo$ 209boo115boo11$204bo$205boo$204boo$$328bo$326boo$327boo12$376bo$377bo$ 377boo$378bo$375booboo$331bo42bo3bo$330bobo43boo$332boo42bo$332bo43boo $324bobo4bobo39bobboo$324boboob5o40bo3bo$327boobo47boo$324booboobooboo 42bobbo$324b3o6boo42bo$326bobb4o44boobo$328bo3bo44bobbo3bo$330boo46b3o bbobo$325bo3boo46b3o4boo$323b8o47bo6bo$328bo47boboobbobo$329bobbo46bo bbobo$17bo311bobobo43b3o3b3o$4bo11bobo314bo51boo$3bobo10bobo308bo3bobb o42b3o6boo$bboo12bo312boob3o43boo5bo$4bo321bo4bobbo39bo10bobb3o$bboo 11boo311b6o40bo4bo3b3obobo$bb3o11bobo10bobo293bobbo43boobobobo3bo4bo$ 16boo10booboboo293b3oboo38bobobobbo8bo$bbobbo11bo9bo300b3obbo38bobob3o 6bo$bbobo13bobbo3b7o3bo289bo4boo40booboobo3booboo$bbo19bobo299boo3boob 3o38bo4boobo4bo$3bo15boo3bob7o293bo6boo38bobboboo3boobo$3bobo13bobo3b oo5b4o291bo3boo43bobobobobo$4bo13boo7bobo3bo293boobo44booboboobb3o$3b oo14bobo7bobobbo289boobo48boobboobb3o22bo$20bo10bo292b3o49b5o28booboo$ bbobbo26bobo290boo83bo3bo$bo408bo3bo$oobbo402bo3bo3bo$bb4o399b3o3bobob o$bboboo397bob3o3bo3bo$bbobo405bo3bo$bb3o397bobo6b3o$bboo399b3o4b3o52b o$3boboo397b3o3bo53bobo$6bo4bobbo246bobbo141boo3boo51bobo$6bo3bo124b4o 121bo145b3obbo54bo$4b3o3bo3bo120bo3bo120bo3bo145bo55boo$bboo6b4o121bo 124b4o201bobo$bboobbo129bobbo$5bo460b3o$3boo461b3o$3b3o460bo$84b3o375b o4boo$84boo375bobboobbo$86bo376bob3o$83b3o376b4obo$21bo58boobbobo376b oobo$20bobo56bobobbo293bo84boobo$19boo58bobobb3o292boo85bo$20bobo56bo 6b3o283b4o3boo82boo$20boo56boo6boo261bo23bo4bo83bobbo$23bo48bo5bobo 267bo27bo3bo78boobb3o$19bobbo48bobo11bobbo262bo4bo15bobb3o3bo80bobbo$ 18bo52bo5b3o4bo242bo20booboo4bo13boboobo3bo82boo$17boo51bobbo3bo5boo3b o237bobo19bobobobobboo17b4o$18bo51b3o5bo6boobbo238boo18bobo5bo19b3o$ 18b3o49bo3bo3bobb6o239bobo17b3obooboob3o13boobbo$19bo51b4o11bobbo237b oo16b3o9boo13b3obboo$21bo52boo3boobb3obo237bo16boo3boobo3boo21bo65bo$ 19boo53boo4boobo3boo77bo159bobbo15bo3boo3boobo13bobobbo65bo$19boo49b5o 6b4ob3o76bobo162bo14bo9b5o11bobo71bo4bo$21bo51bo8bo3b3o76bo164boo10boo 3bob3o3bobb3o12boo67booboo4bo$69bobbo91bobbo162bo14b5obo4bo4bo8bo4bo 66bobobobobboo$69boo8b3obboo78b3o161b3o4bo12bobo5bo4bo10b4o66bobo5bo$ 69boo8b3obbo79bo3bo160bo6boo10boboo6bobbo8bob3o65b3obooboob3o$70bo8boo 5bo78b4o158bo8boo20bo10boo68b3o9boo$65bobboobboo10boo10bo71boo158boo5b o14bo6boo10b4o42bo20boo3boobo3boo$63boo4boo6boobbo13bobo70boo158boo7bo 12bo20bobo42boo21bo3boo3boobo$63boo13bo4b3o8boo68b5o151boo5bo7bobo10bo bbobb3o14bobo42boo11b4o6bo9b5o$70bobo5bo3b3obo9bo70bo13bo8boo127b3o15b o11boo3b3o17bo55bo5boo3bob3o3bobb3o$64b3o3boo10bo3bo7boo67bobbo13bobo 7b3obo124boobobbo8bobo11bobo21bobo39b3o10bo5bo5b5obo4bo4bo$64b3obbobbo 6boo3bo9b3o66boo15boo6bo4b3o127bobo8bobo19boo16bo39b3o12bobboo8bobo5bo 4bo$70bo8bobbo3bo55bo20boo15bo5b7oboo121b3o7boo3b4o14boo4boo14bo53bob oob4o7boboo6bobbo$62boo6bo7boobob3o9bobo42boo22bo16bobobo8boo124b7obbo bobo13boobboobbo17boo42b3o6b3o6bo16bo$62bo16bo6b3o6b3o42boo17bobboobb oo13bobobobb7o124boo8bobobo16bo22boo42bobo9b3oboboo7bo6boo$59bobbo6boo bo7b4oboobo53bo14boo4boo14b4o3boo7b3o121boob7o5bo15boo20bo55bo3bobbo8b o$59bo4bo5bobo8boobbo12b3o39bo16boo19bobo8bobo127b3o4bo6boo15boo66b3o 9bo3boo6bobbobb3o$59bo4bo4bob5o5bo5bo10b3o39bobo21bobo11bobo8bobboboo 124bob3o7bobo13bobbo67boo7bo3bo10boo3b3o$60b3obbo3b3obo3boo5bo55bo17b 3o3boo11bo15b3o127boo8bo13bo70bo9bob3o3bo5bobo$61b5o9bo6b4o11boo42bobo 14b3obbobbo10bobo7bo5boo151b5o68boo8b3o4bo13boo$63boboo3boo3bo21boo42b obo20bo12bo7boo158boo70bobo13bobboo6boo4boo$65boo3boboo3boo20bo42b4o 10boo6bo14bo5boo158boo71bo10boo10boobboobbo$62boo9b3o68boo10bo20boo8bo 158b4o78bo5boo8bo$62b3obooboob3o65b3obo8bobbo6boobo10boo6bo160bo3bo79b obb3o8boo$64bo5bobo66b4o10bo4bo5bobo12bo4b3o161b3o78boobb3o8boo$62boo bbobobobo66bo4bo8bo4bo4bob5o14bo162bobbo91bobbo$63bo4booboo67boo12b3o bbo3b3obo3boo10boo164bo76b3o3bo8bo51bo$64bo4bo71bobo11b5o9bo14bo10boo 150bobo76b3ob4o6b5o49boo$72bo65bobbobo13boboo3boo3bo15bobbo5boo152bo 77boo3boboo4boo53boo$71bo65bo21boo3boboo3boo16bo6bo230bob3obboo3boo52b o$136boobb3o13boo9b3o16boo237bobbo11b4o51bo$138bobboo13b3obooboob3o17b obo239b6obbo3bo3bo49b3o$136b3o19bo5bobo18boo238bobboo6bo5b3o51bo$135b 4o17boobbobobobo19bobo237bo3boo5bo3bobbo51boo$50boo82bo3boboobo13bo4b ooboo20bo242bo4b3o5bo52bo$49bobbo80bo3b3obbo15bo4bo262bobbo11bobo48bo bbo$49b3obboo78bo3bo27bo267bobo5bo48bo$49bobbo83bo4bo23bo156b3o102boo 6boo56boo$50boo82boo3b4o179bo103b3o6bo56bobo$48bo85boo64bo122bo104b3o bbobo58boo$48boboo84bo63bo229bobbobo56bobo$48boboo147bobo226bobobboo 58bo$47bob4o145boboo227b3o$47b3obo145boo3bobo223bo$46bobboobbo143bo3bo 3boo222boo$46boo4bo144boobo6bo220b3o$48bo151bo3bo3bo4bo295b3o$46b3o 148b3o5bobo3boo297boo$46b3o147bo3b3oboo5b3o295bo$195b5o3b3o302bobboo$ 47bobo143bo7bobboo55b4o246boo$47boo55bo89bo3b4ob3o54bo3bo243b3o$48bo 54bobb3o85bo3boo64bo243bo$48bobo51boo3boo151bobbo244bo$48bobo53bo3b3o 83b3o311boobo$49bo52b3o4b3o399boo$101b3o6bobo77b4obboo126boo184b3o$ 100bo3bo84boboo131boo184bobo$99bo3bo3b3obo77bobboobboo311boobo$99bobob o3b3o80boo317b4o$99bo3bo3bo214boo40boo144bobboo$100bo3bo217boo40boo5b oo140bo$100bo3bo83boo119boo60boo107bobo26bobbo$101booboo28b5o49b3o119b o172bo10bo$105bo22b3obboobboo48boboo119bobo167bobbobo7bobo14boo$128b3o bbooboboo44boboo123boo56boo110bo3bobo7boo13bo$130bobobobobo43boo3bo 181boo108b4o5boo3bobo13bobo$128boboo3boobobbo38boo6bo186boo105b7obo3b oo15bo$128bo4boboo4bo38b3oboo3boo184boo113bobo19bo$128booboo3bobooboo 40boo4bo110boo56b3o118bo3b7o3bobbo13bobo$129bo6b3obobo38bobb3o114bo54b o4bo125bo9bo11bobbo$126bo8bobbobobo38boob3o114bobo54boboo118booboboo 10boo$126bo4bo3boboboboo43bobbo112boo51b3o125bobo10bobo11b3o$125bobob 3o3bo4bo40b6o148bo18bo143boo11boo$124b3obbo10bo39bobbo4bo131boo12bobo 173bo$129bo5boo43b3oboo134boo14bo161bo12boo$127boo6b3o42bobbo3bo145boo 161bobo10bobo$128boo51bo114boo36bobbo158bobo11bo$129b3o3b3o43bobobo 110boo35boobobo158bo$130bobobbo46bobbo147bo5bo16boo$130bobobboobo47bo 150boo13bo3boo$129bo6bo47b8o141bo4bo12bobo$129boo4b3o46boo3bo143bo3bo 12bobo$129bobobb3o46boo149boobo12bo31boo$130bo3bobbo44bo3bo119boo27boo 12boo31bo$134boboo44b4obbo118boo71bobo$137bo42boo6b3o79bo25boo8bo6boo 65booboo$134bobbo42booboobooboo78bobo23bobbo14boo68bobo$135boo47boboo 81bobo24boo85bobo$136bo3bo40b5oboobo77booboo14b3o70boo20booboo$137boo bbo39bobo4bobo95bo4bo69bo$137boo43bo85booboo12bo5bo69bobo18booboo$138b o42boo86boboo12bobo19boo53boo18boobo$137boo43bobo82bo16boo3b3o15bobo 77bo$136bo3bo42bo83boo14boo5bo18bo76boo$135booboo144boo23boo34bo$136bo 148bob3o53b3o16boo$136boo137boo11bo53bo18bobo$137bo131boo4boo10bo54boo 17bo$138bo129bobo17bo3boo4boo59b3o$268bo25bo3bobo57bo$267boo23boo6bo 57boo$275boo23boo$275boo$$351bobo$281bo65bo3bobo$280bobo70boo$281bo71b o14boo$347bobobo16boo$347b3obobbo$348bo3bo24boo$377bo$378b3o$380bo$ 371boo$372bo$370bo$370boo3$333boboo$331b3oboo$330bo$331b3oboo$333bobo bbo$337boo! golly-3.3-src/Patterns/Life/Miscellaneous/twinprimes.rle0000644000175000017500000001743212026730263020412 00000000000000#C Twin prime generator #C A LWSS escapes past the p240 gun about generation 720n+420 iff #C both 6n-1 and 6n+1 are prime. #C Dean Hickerson, drhickerson@ucdavis.edu 9 September 1994 #C From Jason Summers' "jslife" pattern collection. x = 440, y = 294, rule = B3/S23 412boo$410booboo13boo$410b4o13b4o$411boo14booboo$93b3o11b3o319boo$93bo bbo10bobbo$93bo6b3o4bo16b3o11b3o$93bo5bobbo4bo15bobbo10bobbo$94bo4boob o5bo17bo4b3o6bo285boo$126bo4bobbo5bo284bobbo$125bo5boboo4bo285bobboo$ 424bobboo$99bo8bo315b4o$99bobo5b3o278bo7bo$107boboo14bo8bo254bo7boo$ 100bobbo4b3o13b3o5bobo249bo4bo6boo30boo$101b3o4boo13boobo258b5o29b4o4b 4o$102bo20b3o4bobbo280bo3bo3bo4booboo$124boo4b3o282bo6bo6boo$131bo279b o3bo5bo$412b4o$91b3o313b3o$90bobbo311booboo26boo$93bo46b3o264b3o17b4o 4b4o$93bo46bobbo268b4o10bo3bo4booboo$92bo47bo270bo3bo14bo6boo$106b3o3b 3o25bo274bo13bo$105bobbo3bobbo25bo272bo18bo$108bo3bo6b3o3b3o253bo49bo$ 96b3o9bo3bo5bobbo3bobbo253boo47bobboo$98bo8bo5bo7bo3bo255boo47bo5bo$ 97bo12bo10bo3bo9b3o293bobobboo$110bo9bo5bo8bo295bo3boo$109bobo11bo12bo 296b3o$101b3o19bo$76bo13bo12bo18bobo$75b3o11b3o10bo27b3o303boo$75boboo 4bo5boboo37bo12bo13bo277b4o$76b3o3b3o5b3o38bo10b3o11b3o245bo13boo15boo boo$76boo3boobbo4boo49boobo5bo4boobo244bo13b4o16boo$81bo3bo24b3o28b3o 5b3o3b3o245b3o11booboo$81boboo57boo4bobboo3boo261boo$81boo38b3o24bo3bo $149boobo213bo$75b3o73boo214boo42boo$74bobbo288boo41booboo$77bo78b3o 250b4o$77bo78bobbo246bo3boo$76bo79bo248boo$156bo249bo3boo$102b3o52bo 251b4o$102bobbo303booboo$102bo26b3o279boo$92bo9bo25bobbo227bo$91b3o8bo 28bo226bo$55b3o11b3o19boboo8bo27bo9bo216b3o36b4o$54bobbo10bobbo20b3o 36bo8b3o253bo3bo$57bo4b3o6bo20boo36bo8boobo239boo16bo$57bo4bobbo5bo67b 3o209bo21b4o4b4o14bo$56bo4bo8bo69boo21bo13bo9boo163boo18bo3bo4booboo$ 97bo5bo58b3o11b3o7b4o161boo23bo6boo$96b3o3b3o57boboo4bo5boboo6booboo 184bo$62boo31boobo3boboo4boo18bo5bo26b3o3b3o5b3o8boo189bo$62bo7bo24b3o 5b3o4bobo16b3o3b3o25boo3boobbo4boo198bo$69b3o24boo5boo6boo9boo4boobo3b oboo29bo3bo28bo175bobboo$68boobo49bobo4b3o5b3o29boboo30bo173bo5bo$68b 3o29bo20boo6boo5boo30boo28bo3bo174bobobboo$69boo28b3o97b4o174bo3boo$ 98bo3bo30bo28b3o26bobb3o117bo64b3o$132b3o26bobbo25boobbobo116bo$72bo5b o52bo3bo28bo26bobb3o116b3o$71b3o3b3o18booboo61bo34b4o179boo$53b3o15bob ooboobo20bo62bo34bo3bo178b4o25boo$53bobbo15b3ob3o52booboo66bo133bo27b oo15booboo15b4o4b4o$53bo18boo3boo33bo20bo67bo135boo24b4o16boo15bo3bo4b ooboo$53bo57boo41b3o3b3o16bo29bo126boo25booboo36bo6boo$54bo20bo35bobo 7bo31bobbo3bobbo14b3o29bo154boo36bo$74bobo10bo33boo33bo3bo17b3o25bo3bo 16bo$73bo3bo9boo31bobo33bo3bo19bo26b4o17bo$58boo14bobo9bobo57bo8bo5bo 16bobo43bo3bo128boo49boo$57bobo14b3o68boo11bo19bo46b4o126booboo48bobo$ 59bo85bobo10bo192bo3b4o49boboo$157bobo16bo172boobo3boo51boo$82b3o90boo 92bo79bo3bo55bo$82bobbo89bobo90bo80boobo3boo$82bo66b3o72b3o41b3o80bo3b 4o$82bo65bobbo74bo128booboo50boo$83bo67bo72bobo130boo50b4o$151bo60bo 11boo166boo15booboo$150bo59bobbo177b4o16boo$210bobbo129b4o44booboo$ 211bo5boo8bo114bo3bo46boo$216b4o8bo117bo$216booboo3bo3bo116bo$73boo 143boo5b4o156boo$72bobo308booboo$67b3o4bo304bo3b4o$67bobbo90bo215boobo 3boo$67bo92boo215bo3bo$67bo92bobo10bo13bo189boobo3boo$67bo104b3o11b3o 52bo29bo29bo29bo47bo3b4o$68bo103boboo4bo5boboo51b3o27b3o27b3o27b3o49b ooboo$173b3o3b3o5b3o54bo29bo29bo29bo50boo11boo$173boo3boobbo4boo54boo 28boo28boo28boo19bo39b4oboo$178booboo172bo38b6o$178bobb3o165bo5bo15b4o 20b4o$179boboo167b6o14bo3bo29boo$181bo192bo28b4o$172b3obbo3bo191bo29b ooboo$171bobbo3bobo224boo$174bo4bo221bo$174bo71boo28boo28boo28boo28boo 31bobo$173bo72bobo27bobo27bobo27bobo27bobo32bo$164b3o80boo28boo28boo 28boo28boo36boo$163bobbo236booboo$166bo3b3o230b4o$166bo3bobbo15bo214b oo$166bo3bo17b3o194boo8b4o$166bo3bo16boobo192booboo6b6o$165bo5bo15b3o 135boo52bo3b4o7b4oboo$188boo134b4o46boobbobo3boo12boo$167b3o154booboo 44bobboo3bo$167bobo76boo28boo28boo18boo46boobbobo3boo$167b3o76bobo27bo bo27bobo10bobo57bo3b4o$247boo28boo22boo4boo9bobboo24boo34booboo$301bo 17bobo16b4o4b4o35boo5boo5b4o$145b3o11b3o5b3o156boo9bo3bo4booboo9bo29b ooboo3bo3bo$145bobbo10bobbo5bo155booboo12bo6boo11bo28b4o8bo$145bo6b3o 4bo164b4o12bo15bo4bo29boo8bo$145bo5bobbo4bo140b3o14bo7boo30b5o$146bo4b oobo5bo129b4o5b5o13boo16bo$289bo3bo5b3oboo11bobo12bo3bo62boo$293bo8boo 26bo3bo9bo52bobbo$285bo6bo38bo12b6o42boo3bobbo$152boo6bo88bo29bo7b3o 32bo9boo9bob3o44bo3booboo$152bo6b3o86boo28boo5bo6bo29boo13boo9bo48boo$ 159boboo130bo27bobo13bo37b3o$160b3o126bo3bo83bo$107boo6boo43boo128b4o 53boo27bo$106b4o4b4o228b4o49b4o$106booboo3booboo227booboo33bo13bo3bo$ 108boo6boo7boo47b3o120b4o30boo15boo35bo16bo$123booboo46bobbo118bo3bo 28booboo47bo3bo15bo$123b4o16b3o28bo125bo14b4o10b4o49b4o$124boo16bobbo 28bo9boo8bo104bo14bo3bo11boo$145bo28bo8b4o8bo51bo70bo$145bo29bo7booboo 3bo3bo52bo68bo$120b4o20bo40boo5b4o48bo3bo$116boobbobboo120b4o$117bo3bo bboo114b3o25boo39boo3boo$121bobbo113booboo24b4o36bo6bobo$122boo67bo31b oo15b3o24booboo34bobbo6bo$146boo44boo30boo19b4o20boo34boo7b3o$81b5o58b ooboo44bo29bo20bo3bo5bo51boo$80bo4bo31bo26b4o13b3o29bo54bo6bo6boo$85bo 32bo6boo18boo7bo6bobbo27bo54bo3bo3bo4booboo$84bo29bo3bo4booboo24bobo6b o56b5o29b4o4b4o$108b4o3b4o4b4o26boo6bo55bo4bo38boo45boo5b4o$107bo3bo 12boo36bo31bo27bo83booboo3bo3bo$111bo83bo25bo33bo50b4o8bo$103boobbobbo 65bo14bo3bo11boo45bo3b3o46boo8bo$103b3o71bo14b4o10b4o43bo3bob3o$103boo bbobbo62bo3bo28booboo43bo6boo$111bo62b4o30boo15boo28b5obo$107bo3bo111b ooboo29b4o$108b4o89bobo19b4o31bo$167b4o31boo20boo12boo$166bo3bo31bo36b oo$170bo67bo23boo$162boobbobbo51b3o20boo14booboo$162b3o31bobo20bo3boo 18b4o13b4o$162boobbobbo27boo20bobobboo17booboo13boo$170bo8boo16bo20bo 5bo20boo$166bo3bo5b3oboo37bobboo$167b4o5b5o38bo$177b3o22boo17bo$201b4o 12bo$201booboo12bo6boo$194bobbo5boo9bo3bo4booboo$185boobbo4bo3bo16b4o 4b4o$170boo12bobbobbobbo4boo24boo$169bobo13boobb3obbo3bo$156boo11boo 14b3obbo3bobbo5boo$155bobo31bo11booboo$157bo43b4o$202boo3$200boo$155bo 43b4o$153bobo31bo11booboo$154boo11boo14b3obbo3bobbo5boo$167bobo13boobb 3obbo3bo$168boo12bobbobbobbo4boo24boo$183boobbo4bo3bo16b4o4b4o$192bobb o5boo9bo3bo4booboo$199booboo12bo6boo$199b4o12bo$103bo71b3o22boo17bo$ 103boo60b4o5b5o38bo$102bobo59bo3bo5b3oboo37bobboo$168bo8boo16bo20bo5bo $160boobbobbo27boo20bobobboo$160b3o31bobo20bo3boo$160boobbobbo51b3o$ 168bo$164bo3bo31bo$165b4o31boo20boo$105boo92bobo19b4o$b6o31boo63booboo 113booboo$o5bo28b3oboo58bo3b4o65b4o30boo15boo$6bo28b5o54boobbobo3boo 65bo3bo28booboo$5bo30b3o54bobboo3bo73bo14b4o10b4o$94boobbobo3boo68bo 14bo3bo11boo$99bo3b4o86bo$103booboo84bo$105boo5boo5b4o28boo$80bo29boob oo3bo3bo27bobo$81bo28b4o8bo20boo7bo37bo$76bo4bo29boo8bo20b4o45bo83bo$ 77b5o60booboo44bo84bo$144boo44boo79bo4bo20boo8bo$119bo69bo82b5o19b4o8b o$120bo175booboo3bo3bo$115bo4bo177boo5b4o$107bo6boo3boo$105b3o10bo64b oo5b4o$104bo76booboo3bo3bo107bobo$104boo75b4o8bo97boo6boo3bo$182boo8bo 98bobo5b3oboboo$119b4o170boo4b3o4bo$104bo13bo3bo169bo9bo3bo$105bo16bo 180b3o$101bo3bo15bo181bo$102b4o$307bo$297boo9bo$294b3oboo4bo3bo$294b5o 6b4o$265boo4boo22b3o$265bo3booboo$269b4o16boo$270boo15booboo$287b4o$ 135boo151boo$60bo73b4o$59bobo65bobo4booboo$49boo7boboo74boo15boo132bo$ 48bobo6booboo10boo54bo22booboo94b3o34boo$47bo6b3oboboo11bo54bo22b4o94b 5o32boboo$38bo8bobbobbobbobbobo66bo23boo95b3oboo31bobo$38boo7bo6boo4bo 191boo32boo$48bobo$49boo17boo58bo22bo$69bo58bo22boo128bo$61bobo64bo21b oboo113boo13bo6boo$62boo86bobo113bobo9bo3bo4booboo3boo8bo$62bo64bobo 20boo116bo10b4o4b4o3b4o8bo$288boo4booboo3bo3bo$296boo5b4o$67b3o75bo 126boo$81boo63bo6boo116bobo$81bobo58bo3bo4booboo117bo$83bo41boo16b4o4b 4o146boo$83boo38booboo24boo146booboo$123b4o36boo112boo22bobbo$77boo45b oo36b4o110bobo22bobbo$77bobo82booboo111bo23boo$79bo84boo$62boo15boo76b obo$63boo91bobboo121boo21bo$62bo94bobo121bobo22bo$164boo117bo3bo14bo3b o$162booboo3boo8bo105bo3bo12b4o$162b4o3b4o8bo104bobboo$163boo4booboo3b o3bo109bo$55bo80b5o30boo5b4o105boo$55boo78bo4bo$43bobo8bobo83bo$43bo3b o91bo$33boo12bo10boo117bo$33bo14bo7bobbo118boo$47bo7bo12bo110bo$43bo3b o7bo11boo110bo$43bobo9bo122bo$56bobbo$58boo$180bo$181bo$177bo3bo$161b 4o13b4o$160bo3bo$164bo$163bo! golly-3.3-src/Patterns/Life/Breeders/0000755000175000017500000000000013543257426014520 500000000000000golly-3.3-src/Patterns/Life/Breeders/c4-diag-switch-engines.rle0000644000175000017500000000454512026730263021277 00000000000000#C c/4 diagonal switch-engine breeder #C two of Hartmut Holzwart's diagonal c/4 tub-and-beehive puffer #C and a c/2 period 392 backward rake interact to produce #C block-laying switch engines: David Bell, 23 July 2005 x = 152, y = 94, rule = B3/S23 77b2o$77bobo$77bo$80bo$80b2o$80b2o$79b2o$75b2ob2o$75bo4bo$75bob4o$79b 2o$79b2o$79b2o$81bob3o$77bo2bo$76b5o6bo$76bo2b2o5bobo$74bobo10bo$73b3o 4bo$73bo2b2o$77b3o$77b2o10bo$79bo8bobo3bo$77bobo8bobo2bobo$70b2o4b2o 11bo4bo$69b2o5b2obo$71bo4b2ob2obo2b2o$76b3obobo2bobo$67b2o3b2o2b2o7bo 10bo$66b2o3b2o15bo6bobo3bo$68bo2b3o14b2o5bobo2bobo$70b4o14b2o6bo4bo$ 69bobo15b2o$68b2o13b2ob2o$68bobo12bo4bo$67bo15bob4o14bo$68b2o17b2o13bo bo3bo$87b2o13bobo2bobo$87b2o14bo4bo$89bo$85bo2bo4bo$84b5o4bo$84bo2b2o 4bo16bo$82bobo12bo11bobo3bo$81b3o4bo7bobo10bobo2bobo$81bo2b2o11bo12bo 4bo$85b3o$55bobo27b2o$54bo2bo29bo$53b2o30bobo11bo17bo$52bo25b2o4b2o12b obo3bo11bobo3bo$51b4o22b2o5b2obo10bobo2bobo10bobo2bobo$50bo4bo6bo16bo 4b2ob2obo8bo4bo12bo4bo$50bo2bo5b2obo21b3obobo$50bo2bo5bo15b2o3b2o2b2o$ 51bo7bo14b2o3b2o$52b4obo6b2o10bo2b3o24bo17bo$53bo3bo4bo4bo10b4o23bobo 3bo11bobo3bo$54bo6bo15bobo25bobo2bobo10bobo2bobo$54b5o2bo5bo8b2o28bo4b o12bo4bo$61b6o9bobo$54b5o16bo$54bo21b2o$53bo3bo2bo24b2o26bo17bo$11bobo 12b2o24b4obo25bo4bo23bobo3bo11bobo3bo$10bo2bo10bo4bo21bo7bob2o19bo29bo bo2bobo10bobo2bobo$9b2o7bo4bo26bo2bo5bo2bo6bo12bo5bo24bo4bo12bo4bo$8bo 6b2obo4bo5bo20bo2bo5bo2bo4bobo12b6o9b2o$7b6o2bo7b6o21bo4bo4b2o6b2o5bo 20b4o$4b2o7bo3b4o30b4o18bobo19b2ob2o$3bo3b3obo4bo35bo21b2o5bo14b2o22bo 17bo$2bo3bo3b2obo2b2obo2bo30b2o24bobo5bo31bobo3bo11bobo3bo$2bo5b2o3bo 5bo6b2o26bo2bo22b2o5bo31bobo2bobo10bobo2bobo$2b3o3b4obo7bobo2b3o26bobo 27bobo32bo4bo12bo4bo$11bo9bo6bo57b2o$2b3o6bobo7bo6bo5bo73b2o$bo5bo5bo 8bo4bo4bobo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b3ob2o27bo2bo3b3o$o3b 2obo3b2o11b2o7b2o3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b4o2bo27b2o6bo 10bo17bo$o3bo6b3o62bob2o35bo10bobo3bo11bobo3bo$o3b2obo3b2o11b2o7b2o3b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o50bobo2bobo10bobo2bobo$bo5bo5bo 8bo4bo4bobo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o34b2o15bo4bo12bo4bo $2b3o6bobo7bo6bo5bo75bo2bo$11bo9bo6bo80b2o$2b3o3b4obo7bobo2b3o78bo$2bo 5b2o3bo5bo6b2o50b2o27bo10b2o14bo$2bo3bo3b2obo2b2obo2bo54b2ob2o25bo4bo 5b2o13bobo3bo$3bo3b3obo4bo61b4o6b2o19b3o21bobo2bobo$4b2o7bo3b4o58b2o6b 2ob3o41bo4bo$7b6o2bo7b6o59b5o$8bo6b2obo4bo5bo59b3o$9b2o7bo4bo95b2o$10b o2bo10bo4bo88b2ob4o$11bobo12b2o91b6o$120b4o! golly-3.3-src/Patterns/Life/Breeders/p100-H-channel-breeder.rle0000644000175000017500000002105112026730263021012 00000000000000#C p100 c/2 Herschel channel breeder: David Bell, 19 December 1996 #C [See also p100-H-track-puffer.rle in the Puffers folder, which #C could easily be made into a breeder by adding a Herschel factory #C of any desired period to the stationary end of the Herschel track.] x = 647, y = 262, rule = B3/S23 183b6o4b4o$182bo5bo3b6o$188bo3b4oboo$182bo4bo8boo$169b5o10boo$157bo10b o4bo$155bo3bo13bo33boo$160bo7bo3bo30b4oboo6boo$133b5o17bo4bo9bo32b6o5b ooboo$132bo4bo18b5o43b4o6b4o$137bo47boo16bo11boo$132bo3bo48boo9bo6bo$ 134bo61bo$167bo7b4o17bo6boo7b3o$145boo21bo6b5o20booboo5bo3boo$133boo5b oo3boo20bo10bobo9boo9bob5obbobobboo$133boo5boo31boo4boo9boo10bobb3obo 5bo$172bobboo29bo3bobboo$130boo40boobobbo31bo$128bo4bo34boo4boobbo33bo $117b3o14bo32b3o6b3o3bobo$116b5o7bo5bo34bo6boo4boo32boo$116b3oboo7b6o 48bo14boo14booboo$119boo36bobo4bo5boo24bo4bo12b4o$158bo4boo4boo31bo12b oo$163b3obbo27bo5bo$167boo28b6o$122bobo42bo295boo$121bo4bo334bo4bo29b oo$121bo4bo340bo26bo4bo$121boo338bo5bo32bo$462b6o26bo5bo$121boobboo24b oo342b6o$121boobboo20b4oboo$121b3obo21b6o303boo$122bo25b4o300b4oboo17b o54b4o$123bo328b6o17bobo52b6o6boo$453b4o18bobbo51b4oboo4b4o$476boo10b 4o28b3o11boo5booboo$170bo321bo30boo18boo$168bo3bo282boo28bo6bo12boo10b o5b3o$173bo281boo8b3o14bob3o4bo13boo9boobo6bo$168bo4bo309boobo3bo35boo $169b5o309b4o30bobo4bobo6boo$486boo28bo7bobo6bo7boo$510boo5bo4boobo7bo bbo5boo$510boo6b4oboobo7b3o4boo$209b6o309bobo9boo3bo$128bo47boo30bo5bo 5b4o301bo$112boo12boobo45bobbo35bo4bo3bo$111b3o12bobboo32b3o3boo5boo 30bo4bo9bo263b5o50boo$111boobo14bo16boo9bo4bo3bobboo25boo12boo7bobbo 263bo4bo49b4o$112b3o31boo9bo4bo4bo20bo7boo293bo49booboo$113bo12b3o28bo 3bo5bo6bo11b3o17b3o8boo267bo3bo52boo$161boob4o6boo9b3obo14bo4bo6b5o 267bo$127bo33bo3boo6bobo8bo16bo5boo7bo4bo$151boo9bobbo17bobbo5b3o6bo3b o10b3obbo$124b3o24boo9b4o11boo5bobo7boboo4bobbobo9bobboo298boo$125bobb o5b3o40boo6boobo5boboo3bo4bobo9boo284boo12bo4bo$125bo10bo39bo11boo4boo 305b3oboo17bo$123boobo7bobo39bobo8boo11bo251bo48b5o12bo5bo$122boob3obb o3boo38bo3bo274boo47b3o14b6o$124bo4bo68bo21b4o228boo$174bobo20bo21bo3b o265boo$175bo21bo25bo261b4oboo3b6o$219bobbo262b6o3bo5bo$486b4o10bo$ 474boo18bo4bo7boo$471b3oboo19boo7bo4bo$177b3o20b4o255b3o9b5o35bo4bobbo $176b5o18bo3bo254b5o9b3o30bo5bo8bo$176b3oboo21bo230boo22b3oboo42b6o4bo 3bo$179boo18bobbo223boo3b3oboo24boo54b4o$422b4oboobb5o52boo$422b6o4b3o 53boo15b3o$423b4o71b3o$469boo7boo24boboo7boo$448boo21bo5bobb3o21bobo7b obboo$436boo5boo3boo16bobboo12bo9boo9boo3bo3b3obbo$436boo5boo22bo9bo5b o9boo11bob3obbo4bo$475boobo3bo30b5o$99bo375boobobo33boo$100boo360bo8b oo5bobbo4bo$99boo362bo7boo6boo4bo30bobbo$469bo10bo4b3o32bo$427bo32bobo 5bo4bo42bo3bo$428boo30bobo10bo26b4o13b4o$427boo32bo4boo4boo25b6o$466b oo3bo27b4oboo$469b3o31boo$108b3o448b5o$107b5o446bo4bo13b3o$107b3oboo 197b3o250bo13bobbo45b6o$95boo13boo106b5o86b5o137boo98b5obbo3bo14boobbo 28bo14bo5bo5b4o$93bo4bo118bo4bo86b3oboo134bo4bo95bo4bo4bo17bobbo26bo4b o17bo4bo3bo$99bo122bo74boo13boo141bo99bo23bobo32bo15bo9bo$93bo5bo105b 4o8bo3bo73bo4bo148bo5bo94bo3bo42boo8bo5bo11boboo7bobbo$94b6o48b6o50b6o 9bo81bo148b6o96bo44boo9boo$123boo22bo5bo5b4o41b4oboo84bo5bo285bo37boo 8bo$62boo62boo25bo4bo3bo45boo52boo32b6o48b6o231bo21bobbobobb3o4b3o8b3o $61b3o56boo5bo19bo4bo9bo95b4oboo6boo76bo5bo5b4o223bo18bo3bobbobb3obboo 4bo5bo3bo$61boobo32boo9bo10boo6bo21boo7bobbo96b6o5booboo81bo4bo3bo224b 3o10boo3bo9bobboboo5b5o4bo$62b3o32boo9bo7bo9bo17bo114b4o6b4o76bo4bo9bo 227bo9boo4bo10boo3boo4b4oboboo$63bo44bo12bo4bo16b3oboo79boo40boo45boo 9bo22boo7bobbo218boo33bobo7b3oboo3bo$115bo4bo4bo16boobbobo9boo68boo8b 3o14boo60boo9bo232bo18bo4bo4bobo25boo13bobo$115bob3o4bo16boobboobo4boo 3bobo87booboo5bo3bo65bo18b3o8boo199bo3bo19bo6boboo$74bo41booboobboo17b o4bo12bo86bo9b3o5bo3bo65b3o7bo4bo6b5o202bo16boobbobo5boo$75boo43bo4bo 17bo14b3o86bo5bo3bobo4bo4boo64b3o6bo3boo7bo4bo196bo4bo16b3ob5oboboo42b 4o$74boo45b5o22boo83boo3boo8bo6bobbo5bo5boo50boo16bo4boo10b3obbo197b5o 18boo4bobo44bo3bo$125boboo19boo83boo15b5o14boo51boo15bobo3boobo9bobboo 220b3obbooboo47bo$128boo120b4o4bobbo77bobo5bobo9boo41bo233bobbo$107boo 15b5o87bo42boo142boo11bobo$104b3oboo16boo31b4o51bo3bo183boo11bo$104b5o 49bo3bo56bo89boo104bo$105b3o54bo51bo4bo51boo33b3oboo49b4o50bobbo159b6o 33b4o$158bobbo53b5o49booboo32b5o49bo3bo50b3o86bo72bo5bo32bo3bo$269b4o 34b3o54bo139bobo76bo36bo$270boo88bobbo140boo71bo4bo33bobbo$579boo$137b 4o78bobo$136b6o77boo86bo$136b4oboo77bo86bobo29b4o$140boo105b6o54boo29b 6o223boo$246bo5bo85b4oboo219b3oboo$252bo89boo220b5o66boo$246bo4bo307b oo4b3o17bo11boo32b4oboo6boo$248boo306b3oboo23boo9bobbo31b6o5booboo$78b o477b5o22b4o3bo6boo33b4o6b4o$78bobo476b3o7boo13boo6bo26boo24boo$38bo 39boo8bo49bo49bo49bo49bo49bo49bo49bo128boo8b3obboboo31boo8bobo$38b3o 47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o116bo26b3o8b3o8bo20bobbo6bo$ 41bo7bo41bo49bo49bo49bo49bo49bo49bo49bo114bo29bo10bo6bobbo22bo5bo3b3o$ 40boo8boo38boo48boo48boo48boo48boo48boo48boo48boo115bo38bo10bo7bo14bo 4bo3bob3o$49boo521boo9bo19bo3bo7b4o3boo4b3o5bo6boo$572boo8boo14b3o3boo b3o5boobo3boo5bo7b5obo$377bo218booboo4bo3boo3bo3bo20b4o$31bo49bo49bo 49bo49bo49bo49bo46boo216bobbo6boo3bobboboo22bo$29b3o47b3o47b3o47b3o47b 3o47b3o47b3o45boo187b3o29bo8b4o5boo$28bo49bo49bo49bo49bo49bo49bo236b5o 26boo10b3o$3bo11boo11boo48boo48boo48boo48boo48boo48boo235b3oboo26boo 45boo$3b3o9boo358boo154bobo34boo26boo44booboo$3bobo368bobo154boo63bo 45b4o$5bo370bo155bo110boo$$144bobo$bo142boo$obo142bo105bo255bo79boo35b oo$bo247bobo254boo75b4oboo32booboo$40boo48boo158boo254bobo74b6o33b4o$ 40boo11boo35boo11boo48boo48boo379b4o35boo$53bo49bo49bo49bo$54b3o47b3o 29bo17b3o47b3o45boo341boo$56bo49bo29boo18bo49bo46boo329boo7bo4bo$135bo bo114bo329bo4bo11bo$588bo4bo5bo$545boboobo22b6o3bo5bo5b6o$15boo48boo 48boo48boo48boo48boo48boo48boo48boo48boo77bo4boboo19bo5bo4b6o$16bo49bo 49bo49bo49bo49bo49bo49bo49bo49bo77bo4boobbo24bo$13b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o47b3o78bo3b3o3bo17bo4bo39b6o$13bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo81b4obbobo20boo25bo14bo5bo5b4o$552bo46bo4bo17b o4bo3bo$542bo62bo15bo9bo$215boo324bobbo43boo8bo5bo11boboo7bobbo$213bo 4bo321b3o45boo9boo$219bo247boo72boo73boo8bo$199boo12bo5bo243b4oboo71b 4o35bo19bobbobobb3o4b3o8b3o$196b3oboo12b6o212boo29b6o73b3o34bobo16bo3b obbobb3obboo4bo5bo3bo$196b5o231bobo29b4o111bobbo10boo3bo9bobboboo5b5o 4bo$197b3o232bo147boo11boo4bo10boo3boo4b4oboboo$608bobo7b3oboo3bo$577b 3o29boo13bobo$200b3o34boo246bobbo40boo45bo3bo$236b4o192b3o54bo39bobo 44bo3bo$182b5o13bo35booboo49b3o138b5o49bo3bo39bo46bo3bo47b4o$181bo4bo 14boobboo31boo50bobbo137b3oboo49b4o87b3o47bo3bo$186bo16bobo84bo143boo 195bo$161bo19bo3bo19boboo25bo42boo11bo336bobbo$161boo19bo23boo8bo15bo 45boo11bobo273b6o22b5o$160bobo53bo11bo3bobboo40bo186bobo5bobo9boo80bo 5bo4b4o13bo4bo8b4o$181boo20bo20bobb3obo5bo209boo15bobo3boobo9bobboo84b o3b6o17bo7b6o$196bo5b3o9bo8bob5obbobobboo208boo16bo4boo10b3obbo78bo4bo 4b4oboo11bo3bo8b4oboo$195bobo3b4o8bo8booboo5bo3boo222b3o6bo3boo7bo4bo 80boo10boo14bo14boo$195bobobboobb3o7bo10boo7b3o223b3o7bo4bo6b5o$196bo bb3o3boo246bo18b3o8boo$177boo8b3o10b4o3bo17bo216boo9bo$177boo22b3o3bo 17bo11boo203boo9bo22boo7bobbo$202b3obbo18b4o6b4o234bo4bo9bo$205bo19b6o 5booboo239bo4bo3bo128boo$225b4oboo6boo234bo5bo5b4o124b4oboo$151boo76b oo190b6o48b6o133b6o$147b4oboo266bo5bo188b4o$147b6o38boo132b6o95bo$148b 4o6boo29bo4bo129bo5bo89bo4bo$156bo4bo33bo134bo91boo13boo$162bo26bo5bo 128bo4bo104b3oboo196bobbo$156bo5bo27b6o130boo106b5o144b3o54bo$157b6o 272b3o144b5o17boo30bo3bo$582b3oboo16bobo30b4o$585boo17bo$344b3o31boo$ 341boo3bo27b4oboo252bobo$302boo32bo4boo4boo25b6o247b3oboo3bo$303boo30b obo10bo26b4o13b4o216boo10boo4b4oboboo$302bo32bobo5bo4bo42bo3bo216boo8b oo5b5o4bo$344bo10bo4b3o32bo226boo4bo5bo3bo$338bo7boo6boo4bo30bobbo229b 3o8b3o$337bo8boo5bobbo4bo227bo27b3o5boo8bo$350boobobo33boo198boo16boo$ 350boobo3bo30b5o196b3o15boo16boboo7bobbo$311boo5boo22bo9bo5bo9boo11bob 3obbo4bo193b4o39bo9bo$311boo5boo3boo16bobboo12bo9boo9boo3bo3b3obbo192b oobo41bo4bo3bo$323boo21bo5bobb3o21bobo7bobboo231bo5bo5b4o$344boo7boo 24boboo7boo180b6o48b6o$298b4o71b3o195bo5bo$297b6o4b3o53boo15b3o194bo$ 297b4oboobb5o52boo206bo4bo$301boo3b3oboo24boo54b4o177boo13boo$309boo 22b3oboo42b6o4bo3bo189b3oboo$333b5o9b3o30bo5bo8bo189b5o$334b3o9b5o35bo 4bobbo191b3o$346b3oboo19boo7bo4bo$349boo18bo4bo7boo$361b4o10bo$360b6o 3bo5bo$360b4oboo3b6o$364boo$327boo$328boo47b3o14b6o$327bo48b5o12bo5bo$ 376b3oboo17bo$379boo12bo4bo$395boo3$363bo$361bo3bo52boo$366bo49booboo$ 361bo4bo49b4o$362b5o50boo$$400bo$399bobo9boo3bo$385boo6b4oboobo7b3o4b oo$385boo5bo4boobo7bobbo5boo$361boo28bo7bobo6bo7boo$358b4o30bobo4bobo 6boo$358boobo3bo35boo$330boo8b3o14bob3o4bo13boo9boobo6bo$330boo28bo6bo 12boo10bo5b3o$367bo30boo18boo$351boo10b4o28b3o11boo5booboo$328b4o18bo bbo51b4oboo4b4o$327b6o17bobo52b6o6boo$327b4oboo17bo54b4o$331boo$$370b 6o$337b6o26bo5bo$336bo5bo32bo$342bo26bo4bo$336bo4bo29boo$338boo!golly-3.3-src/Patterns/Life/Breeders/pi-blink-breeder1.rle0000644000175000017500000002571412026730263020337 00000000000000#C An unusual breeder (quadratic growth) pattern. #C Jason Summers, 5 Sep 2002; from "jslife" collection. x = 741, y = 205, rule = B3/S23 385boo139boo139boo$285bo27bo9bo15bo45boo39bo27bo9bo15bo45boo39bo27bo9b o15bo45boo$151bobbo128b3o27b3o5b3o13b3o84b3o27b3o5b3o13b3o84b3o27b3o5b 3o13b3o$142boo6bo131bo18boo13bo3bo15bo86bo18boo13bo3bo15bo86bo18boo13b o3bo15bo$141booboo4bo3bo127boo17bo13boo3boo14boo49boo34boo17bo13boo3b oo14boo49boo34boo17bo13boo3boo14boo49boo$142b4o4b4o148bo84boo54bo84boo 54bo84boo$143boo156boo53bo43boo40boo53bo43boo40boo53bo43boo$354b3o43bo 94b3o43bo94b3o43bo$267boboo82bo44bobo7boboo82bo44bobo7boboo82bo39boo3b obo$145bo7b3o14boo95boobo59boo8boo11boo43boo8boobo69boo11boo43boo8boob o69boo11boo43boo$144boo9bo13booboo155bobo8boo60boo77boo60boo33b3o41boo 45boo13boo$143boobo6b3o14b4o151bo5bo70boo139boo33b4o89bo12boo$144bobo 3b3o18boo125boo22boobbo112boo131bo7boo84bo5bo$145boo29boo120boo21bo5bo 111boo130bo93bo$167boo6bo6boo85booboo46booboo85booboo77bo3bo16bo37boob oo14boo6boo84boo3bo3bo$181boob4o81bo3bo47b4o3bo81bo3bo76b3obobbo14bo7b o29bo3bo15boo4b3ob3o83boobbobbo$166boo14b6o82b3o49bo4bo83b3o77bobobo 25bo30b3o17bo4boo4bo83bo5bo$142boo22bo16b4o85bobo49b3o86bobo81bo56bobo 19bo4bobo83bobo$141booboo127boo49bo64boo23boo81boo16boo6bo6boo23boo 111boboo$142b4o183boo58boo79boo19bo3bobo16bobbo5bo6boo79boo55bo$143boo 164bo6boo11bobo118bo6boo11bobo22bobo17bobo19boo52bo6boo11bobo55boo7boo $168boo137b3o6boo13bo46boo68b3o6boo13bo44bo18bobbo49b3o6boo13bo46boo 15bobbo$167boo137bo24boo44bobbo55bobo8bo24boo40boboo19boo49bo24boo44bo bbo15boo$169bo136boo45boo23bobo16b3o37boo8boo45boo18boboboo68boo45boo 23bobo$141b4o208boo3bo20bo17bo39bo56boo3bo14bo3boo115boo3bo20bo$140b6o 211bobo38bo99bobo13bo3bo120bobo$139boob4o194boo16bobo120boo16bobo13bob o104boo16bobo$140boo199bo18bo121bo18bo14bo106bo18bo$338b3o19boo117b3o 19boo117b3o19boo$160boo176bo140bo140bo$159boo235boo139boo139boo$161bo 234boo44bo94boo139boo$134b6o12bo287bobo$134bo5b4o7bo289boo$46bobbo84bo 5boboo6bobbo$37boo6bo89bo3bobboo6bobbo5boo$36booboo4bo3bo87bo12b3o6boo 396boo$37b4o4b4o87boo419bobo$38boo95b4o25bo155boo139boo94bo44boo$134b ooboo29b3o149boo139boo139boo$135boo30b5o207bo140bo140bo$40bo7b3o14boo 79b5o15boob3o184boo19b3o117boo19b3o117boo19b3o$39boo9bo13booboo77bo4bo 15boo188bo18bo106bo14bo18bo121bo18bo$38boobo6b3o14b4o77bo12b4o194bobo 16boo104bobo13bobo16boo120bobo16boo$39bobo3b3o18boo79bo3bo6b6o155bo38b obo120bo3bo13bobo138bobo$40boo107bo7boob4o35bo120bo17bo20bo3boo115boo 3bo14bo3boo56bo57bo20bo3boo$62boo13boo79boo38bo119b3o16bobo23boo45boo 68boobobo18boo45boo8boo56bobo23boo45boo$76boob4o115b3o136bobbo44boo24b o49boo19boobo40boo24bo8bobo38boo15bobbo44boo24bo$61boo14b6o255boo46bo 13boo6b3o49bobbo18bo44bo13boo6b3o49bobbo15boo46bo13boo6b3o$37boo22bo 16b4o66bobbo5boo227bobo11boo6bo52boo19bobo17bobo22bobo11boo6bo52boo7b oo55bobo11boo6bo$36booboo106bo8b4o167boo58boo79boo6bo5bobbo16bobo3bo 19boo83bo55boo$37b4o106bo3bo3booboo167boo64bo49boo23boo6bo6boo16boo81b oo24boobo111boo$38boo24boo81b4o5boo233b3o49bobo56bo81bobo25bobo83bobo 4bo19bobo$63boo325bo4bo49b3o30bo25bobobo77b3o19bo5bo83bo4boo4bo17b3o$ 65bo323bo3b4o47bo3bo29bo7bo14bobbob3o76bo3bo17bobbobboo83b3ob3o4boo15b o3bo$152bobo21bobbo213booboo46booboo37bo16bo3bo77booboo18bo3bo3boo84b oo6boo14booboo$36b4o111bo3boo18bo214bo5bo21boo139boo55bo93bo$35b6o108b oobob3o8bo9bo3bo211bobboo22boo139boo48bo5bo84boo7bo$34boob4o108bo4b3o 18b4o135boo70bo5bo62boo139boo12bo89b4o$35boo112bo3bo15boo19boo122boo 60boo8bobo66boo60boo77boo13boo45boo41b3o$56boo92b3o10bo7bo16bo4bo124b oo43boo11boo8boo59boboo8boo43boo11boo69boboo8boo43boo11boo69boboo$55b oo95bo10bobobo3bo15bo129bobo44bo82boobo7bobo44bo82boobo7bobo3boo39bo 82boobo$39bo17bo21bo88b3o16bo5bo123bo43b3o94bo43b3o94bo43b3o$38bo39bo 69bobbo35b6o123boo43bo53boo40boo43bo53boo40boo43bo53boo$29b6obo3bo37b 3o66bo181boo84bo54boo84bo54boo84bo$29bo5bo3b3o105bo3bo177boo65boo3boo 13bo17boo34boo65boo3boo13bo17boo34boo65boo3boo13bo17boo$29bo5bo5bo3bob oboo96b4o24boo220bo3bo13boo18bo102bo3bo13boo18bo102bo3bo13boo18bo$30bo 3bo3boobo3bo5bo4boo117bobo12bo203b3o5b3o27b3o100b3o5b3o27b3o100b3o5b3o 27b3o$32bo5b3o4bo10boo117bo15bo139boo61bo9bo27bo39boo61bo9bo27bo39boo 61bo9bo27bo$31boo14bobbo140bo139boo139boo139boo$30b4o13b3o$29booboo29b 3o$30boo30b5o78b6o$41b5o15boob3o78bo5bo161b4o154b4o154b4o$41bo4bo15boo 81bo21boo144bo3bo153bo3bo153bo3bo$41bo12b4o88bo4bo15bobo143bo157bo157b o$42bo3bo6b6o89boo17bo146bobbo154bobbo154bobbo$44bo7boob4o$53boo97bo 507boo$140boo5boobbo501b6obbo$139boob4o5boboo497bo6boo$140b5o9bobboo 502b3o$52b4o85b3o10bobbobo8boo481boo5bobobbo$51b6o92boobo6bo8boo480bo 4boo4boo$50boob4o94bo5boobo488boo$51boo87b4o14bobboo76bo48bo157bo202b oo$39b5o17b3o76bo3bo13b4o37bo38bo47bo3bo153bo3bo197boob3o$39bo4bo15b5o 75bo19bo11b5o20boo39b3o44bo157bo202bobbobo$29boo8bo19boob3o76bobbo7boo 18bo4bo20boo85bo4bo152bo4bo194boobobobbo$28b4o8bo3bo15boo89boob3o15bo 112b5o153b5o195boobobobboo$27booboo10bo12boo95b5o16bo3bo468boboboo$28b oo25boo96b3o7b6o6bo470boboo3bo$56boo105bo5bo335boo140bobbobbo$42boo7b oo3bo106bo342bo141boobo23boo$32boo7bobbo6boo4bo106bo4bo327b9o69bo27bo 9bo35bobb3o20boo$27b8obo7boo120boo328bob6obb3o64b3o27b3o5b3o30boobobo$ 27bo8bo7bo49bobbo6boo65boo326b4obbobbo63bo18boo13bo3bo33bobooboboboo$ 27bo6bo9boo47bo8bo4bo62b4o5b4o312bobo8boo64boo17bo13boo3boo38b3o24boo$ 28bo23bobo38bo3bo3bo60bo6booboo4b6o311boo95bo84boo$30boo20boo39b4o4bo 5bo52bo3bo5boo5boob4o311bo69boo24boo53bo3b3o37boo$53bo10boo17boo16b6o 52bo18boo311boobbobo66b3oboo74b3obbo4bo35bo$34b4o25b4o15boob3o71bo4bo 326bobbo62boboob3o3boo73bo5bobobbo33bobo$33b6o23booboo16b5o31bo39b5o 324booboboobo60boobobobbobo62boo11boo3boobobo34boo$32boob4o24boo19b3o 31bo369booboboboo68b3o62boo19bo40boo$33boo83b3o49bobo318bobobbo65boob 3o83bobo38boo$169bobbo318bobo3boo63b5o21boo62boo9bobo$60bobo107bobo 319bobboboo62bo11bo14boo73bobo$60boo132bo298boobo23boo37b5o10bo88bobbo $61bo11b3o54b3o20b3o38bo15b3o207bo27bo9bo35bobboo21boo37bo3bo8b3o89bob o$194bo223b3o27b3o5b3o30boobobo3boo60b3o101bobo$35boo380bo18boo13bo3bo 33bobooboboboo62bobo99boo$34booboo243bobbo131boo17bo13boo3boo38boo25b oo39boo114boo$35b4o85bo156bo155bo84boo95boo58boo$36boo84bo3bo154bo3bo 150boo53bo3boo38boo62bo6boo11bobo64boo$121bo57boo100b4o204b3obbobboo 36bo61b3o6boo13bo46boo15bobbo$43bo3bo73bo4bo14b4o25bo7boob4o217boboo 82bo5bobb3o33bobo60bo24boo44bobbo15boo$38b3o5boo73b5o7boo5b6o22bo3bo6b 6o149boo66boobo69boo11boo3boobo36boo61boo45boo23bobo$37b3obo9boo59b4o 16b4o3boob4o21bo12b4o148bo4boboo134boo19bo40boo104boo3bo20bo$36boo8bo 6bo9boo46b6o14booboo4boo25bo4bo15boo150bo155bobo38boo108bobo$37bob8o3b o3bo7booboo43boob4o15boo33b5o15boob3o145boo93boo62boo131boo16bobo$38b 4o7bo3bo9b4o44boo43boo24bo5b5o137b8obb3o90boo73bo122bo18bo$40bo8bo14b oo33b5o17b3o31booboo21b3o5b3o138boo7bobbo61booboo99bo119b3o19boo$99bo 4bo15b5o31b4o21bobbo144boo9boo62bo3bo79bobo17boo118bo$44bobbo41boo8bo 16bobboob3o32boo7boo12bo3bo144bo75b3o79bo3bo16bo5boo170boo$35boo6bo24b oo18b4o8bo3bo9bobo3boo36bo7boo12b4o223bobo76bo4bo15bobbo3boo170boo$34b ooboo4bo3bo19boo18booboo10bo13boo38bo3bo8bo5b3oboobbo141boobb3o76boo 76bo4bo16bo7bo7boo$27boo6b4o4b4o22bo18boo23b5o37bo5bo8boo5b3o145bobbob oo132boo20bo3bo16boobb6o7boo$25bo4bo5boo61bobo11boboboo36bo5bo6b3o6b3o 142booboboobo97bobo13bo6boo11bobo20bobbo15b3o3bobo16boo$24bo74bobo7boo 4bobo37b6o6bobo8boo142boobobo3bo97boo11b3o6boo13bo39b3o21bobbo$24bo5bo 61boo7boo6boo4b3o61boo144bobobo99bo11bo24boo39boo22boo$14b3o7b6o6bo50b 8o7b3o220bobo3bo109boo45boo18boo$13b5o16bo3bo48bo6bo6bobbo96b3o39bo82b obboboo155boo3bo14b3o99boo$12boob3o15bo53bo14boo7bobo87bo40boo83boobo 23boo136bobo15bobo97boo$bbobbo7boo18bo4bo49bo4bo17boo48boo39bo39bobo9b o27bo9bo35bobboo21boo119boo16bobo16bo156bo$bo31b5o52boo20bo47boob4o85b 3o27b3o5b3o30boobobo3bo143bo18bo150boo19b3o$bo3bo15b5o135b6o21bo62bo 18boo13bo3bo33boboobobobo140b3o19boo150bo18bo$b4o16boo3bo67b4o64b4o20b oo63boo17bo13boo3boo38boobo23boo76bo38bo173bobo16boo$22bobbo67b6o88boo 82bo84boo74bobo96boo115bobo$15bo6bobbo5boo59boob4o171boo53bo3b3o37boo 62boo96boo95bo20bo3boo$bb3o3bo5boobb3oboo7boo60boo228b3obbo4bo35bo257b obo23boo45boo$b5obbo9boboboo95bobo42boo70boboo82bo5bobobbo33bobo240boo 15bobbo44boo24bo$oob4obo6bobbobo98boo42b4o69boobo69boo11boo3boobobo34b oo240bobbo15boo46bo13boo6b3o$boo13boo102bo5boo34booboo142boo19bo40boo 237boo64bobo11boo6bo$126bobo34boo31bo7b4o122bobo38boo244boo58boo$126bo 67boo7b6o58boo62boo284boo114boo$9boo84boo98boo5boob4o58boo72bo113boo 96boo77boo99bobo$7bo4bo16bo64booboo76boo26boo33booboo98bo113boo96bobo 75bobo101b3o$6bo22bobo63b4o19bo55bobbo60bo3bo98boo171bo38bo77bobo89b3o 8bo3bo$6bo5bo16boo65boo20bo16boo28boo13b3o9boo45b3o84boo163boo19b3o 116bobbo88bo10b5o$6b6o105bobo14boob4o23boo5bo8bobbo7b4o46bobo79boob3o 8b3o152bo18bo120bobo73boo14bo11bo$119bo15b6o24boo4bo3bo3booboo6booboo 47boo16bobo59b3oboo6boo8boboo10boo115bo16bobo16boo119bobo73boo21b5o$ 98bo3boo15bo16b4o26bo3bo4bo15boo68boo35boo23boob3o5boo6boobobo10boo 115bobo15bobo108boo124b3oboo$97boo4b3o67bo87bo16bo6boo11bobo26boo13boo bobo17boo110b3o14bo3boo104boo60boo62b3o$96boo5bobbo16boo151b3o6boo13bo 44boo17bobbo110boo18boo45boo61boo43boo11boo62bobobboboboo$37bo59boo7bo 15booboo37boo109bo24boo43boo18boo88boo22boo39boo24bo11bo48bobo44bo73b oo3b3oboobo$8b4o25bobo65boo16b4o36b4o4b4o100boo45boo21boobo105bobbo21b 3o39bo13boo6b3o11boo48bo43b3o74boob3o$8bo3bo24boo85boo36booboo4bo3bo 146boo3bo17bo109boo16bobo3b3o15bobbo20bobo11boo6bo13bobo46boo43bo53boo 24boo$8bo154boo6bo154bobo17bobbo112boo7b6obboo16bo3bo20boo95boo84bo$9b obbo35b6o50bobbo64bobbo133boo16bobo16bobo113boo7bo7bo16bo4bo76boo39boo 49boo14boo3boo13bo17boo$48bo5bo40boo6bo162bo43bo18bo142boo3bobbo15bo4b o76bobo90bo15bo3bo13boo18bo$22boo4bo19bo45booboo4bo3bo156bobo40b3o19b oo141boo5bo16bo3bo79b3o85b3o13b3o5b3o27b3o$11boo9boo3bobo19bo4bo40b4o 4b4o66b6o86boo40bo170boo17bobo79bo3bo37boo45bo15bo9bo27bo$10bobbo12bo 3bo20boo43boo75bo5bo185boo112bo99booboo37boo$10bobbo12bo3bo5b4o133bo 191boo112bo73boo$10booboo11bo3bo5bo3bo121boo10bo4bo373boo$12boo13bobbo 5bo124boob3o9boo4b5o262boo$28bo8bobbo121b5o15bo4bo261boo60boo$150b4o9b 3o16bo270boo43boo11boo69boboo$150bo3bo28bo3bo264bobo44bo82boobo$8b4o5b oo131bo21bo12bo266bo43b3o$8bo3bo3booboo130bo18b3o116boo160boo43bo53boo $8bo8b4o132boo14boobb3o7boo18bo85boo173boo84bo$9bobbo5boo137b3o8boo5b oo6boo17boo144bo40boo73boo49boo14boo3boo13bo17boo$150boo3boo3bo6b3obb 5o25bobo120boo19b3o40bobo124bo15bo3bo13boo18bo$149boob3obobbo8bobbobo 152bo18bo43bo123b3o13b3o5b3o27b3o$150b9o10boboo134bobo16bobo16boo119b oo45bo15bo9bo27bo$151b4o18bo132bobbo17bobo136boo$310bo17bo3boo$307bob oo21boo45boo$289boo18boo43boo24bo$155b6o19bo107bobbo17boo44bo13boo6b3o $155bo5bo17bo109boo17boboboo13boo26bobo11boo6bo16bo$155bo23b3o114boo 10boboboo6boo5b3oboo23boo35boo$156bo4bo134boo10boobo8boo6boob3o59bobo 16boo$158boo156b3o8b3oboo79bobo$190bo137boo84b3o$190bo122boo98bo3bo$ 158bobbo28bo123bo98booboo$157bo156bo72boo$157bo3bo38boo185boo$157b4o 37bo4bo79boo$190bo6bo85boo60boo$190bo6bo5bo83boo43boo11boo69boboo$172b oo3b3o17b6o83bobo44bo82boobo$161boo9boobbo3bo105bo43b3o$159boobbo11bo 5bo4bobbo95boo43bo53boo$159bobb3o10bo9bo112boo84bo$159bo4bo10bo5bo3bo 3bo108boo49boo14boo3boo13bo17boo$160b5o11boobo5b4o161bo15bo3bo13boo18b o$162boo183b3o13b3o5b3o27b3o$300boo45bo15bo9bo27bo$158bobbo5boo131boo$ 157bo8b4o$157bo3bo3booboo$157b4o5boo! golly-3.3-src/Patterns/Life/Breeders/one-cell-thick-quadratic-growth-2596x1.rle0000755000175000017500000000126313451370074024077 00000000000000#N one-cell-thick-quadratic-growth-2596x1.rle #O Chris Cain, October 2015 #C quadratic growth in 2596x1 #C http://conwaylife.com/forums/viewtopic.php?p=51585#p51585 #C See also the previous 7242x1 quadratic-growth pattern: #C http://conwaylife.com/forums/viewtopic.php?p=14226#p14226 x = 2596, y = 1, rule = B3/S23 6ob4o2b4o30b4ob9ob3ob3o112b4o3b12o3b3o139b3ob5ob4o5b5o71b3o2b5ob5o11b 4o6b7ob4o134b3o3b8o5b3ob4o19b5o2b3ob5ob7o58b4ob5ob3ob3o2b6o11b4o2b4ob 6ob3o61b3ob3o4b3ob7o181b4o4b3o3b9o19b3ob3o3b7o3b3o57b5ob5o2b3o112b3ob 4o2b3ob3ob9o62b4o4b4ob7o48b7o6b9o13b13ob3o2b4o90b3o6b5ob4ob6o3b6ob5o5b 5o53b11ob3o5b5o47b3ob3ob9ob4o277b3o3b8o5b3ob4o19b5o2b3ob5ob7o319b4o2b 4ob6ob3o61b3ob3o4b3ob7o! golly-3.3-src/Patterns/Life/Breeders/switch-engine-breeder.rle0000644000175000017500000000363612026730263021314 00000000000000#C A puffer train that creates switch engines. #C This is another type of pattern which grows quadratically. #C Half of a quadrant of the space is filled with blocks. #C Every 80 generations a new block-laying switch engine is created. #C By Helmut Postl, 1997. #C "SwitchEnginePuffer" from Alan Hensel's "lifebc" pattern collection x = 85, y = 164, rule = B3/S23 58boo5b4o$56booboo3bo3bo$56b4o8bo$57boo5bobbo$$52boo9bo$50b5o8b3o$50b oo4bo5bo3bo$50boo5b5o4bo$52boo4b4oboboo$55b3oboo3bo$61bobo$24boo$22boo boo14bo$22b4o13boo24b4o$23boo15boo22bo3bo$18bo28b4o17bo$11boo6boo25bo 3bo13bobbo$7b4oboo12bo23bo$7b6o11boo20bobbo9boo$8b4o13boobboo24b4oboo$ 29bobo23b6o$29bo26b4o5b4o$11bo52bo3bo$9boo30boo25bo$10boo29bobo11bobo 9bo$41bo22boo$54boo$54boo6boo3boo$54bo7bob3oboo$54boo7b6o$64b4o3$54b6o $53bo5bo$59bo$6bo46bo4bo$4bobo48boo$5boo4$58boo$49b4o4b4o$48bo3bo4boob oo$52bo6boo$48bobbo3$56boo$56bobo$56boboo$57boo$57bo$$15b4o$14bo3bo39b oo$18bo38b4o$14bobbo22boo15booboo$39b4o16boo$39booboo$41boo$48b6o$47bo 5bo$53bo4boo$47bo4bo4b4o$49boo6booboo$59boo$17boo$16b4o32bo$16booboo 30b6o$18boo30bo3b8o$51boo8bo$52b3o6bo$53boo5bo$57boo$47b4o$46b6o$46b4o boo$50boo5$26boo$24booboo$24b4o$25boo3$70b4o$69b6o$69b4oboo$73boo$27bo $27boo$26bobo$79b6o$75b4o5bo$63bobo9boobo5bo$63boo10boobbo3bo$64bo16bo $81boo$80b4o$80booboo$82boo$71b6o$70bo5bo$63boo11bo$62b4o4bo4bo$62boob oo5boo7boo$64boo14b4o$80booboo$38b4o17boo21boo$37bo3bo16boo$41bo$37bo bbo16boo$79boo$73b3o3bobo$70b3o6boboo$70bo9boo$70b3o7bo3$48b4o29boo$ 47b6o19b4o4b4o$47b4oboo17bo3bo4booboo$51boo22bo6boo$71bobbo$$53bo$8bo 42bo3bob6o$8boo40b3o3bo5bo$7bobo40bo5bo5bo$38bobo9boboo3bo3bo$38boo11b 3o5bo$39bo19boo$58b4o$26bobo29booboo$26boo32boo$27bo21b6o$48bo5bo$b6o 34boo11bo$o5bo33b4o4bo4bo$6bo33booboo5boo7boo$o4bo25boo9boo14b4o$bboo 27bobo24booboo$16b4o11bo28boo$15bo3bo$19bo$15bobbo29boo$47bobbo$42b3o 13boo$41bobbo8bo5boo$41booboo3bo3bo4boo$49bo4bo3bo$51bo$$59boo$50b4o4b 4o$49bo3bo4booboo$53bo6boo$49bobbo! golly-3.3-src/Patterns/Life/Breeders/slide-breeder.rle0000644000175000017500000020222712026730263017645 00000000000000#C Breeder using slide-gun technology (Slide-o-04b-060 and #C Slide-o-04f-060) from Jason Summers' slide-gun collection. #C Makoto Kohno, 22 Dec 2002. x = 2393, y = 4182, rule = B3/S23 69boo$68boo$67bobo$68b3o$69boo$68boo$68b3o$68bobo$67bobbo$67boboo$68bo $$71b3o$70bobbo$73bo$73bo$70bobo15$68bo17bo$67b3o17boo$66boobo16boo$ 66b3o$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo6$103bo$104boo$ 103boo7$68bo$67b3o$66boobo$66b3o$66b3o$66b3o$67boo5$71b3o$70bobbo46bo$ 73bo47boo$73bo46boo$70bobo15$68bo$67b3o$66boobo$66b3o$66b3o$66b3o$67b oo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo $67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo $73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$66b oobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo 12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52b obo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobb o$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$ 67boo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo 3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bo bbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$ 66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo197boo$73bo 196boo$73bo195bobo$70bobo197b3o$271boo$270boo$270b3o$270bobo$269bobbo$ 269boboo$270bo$$273b3o$272bobbo$275bo$120b3o152bo$120bobbo148bobo$120b o$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$ 71b3o$70bobbo$73bo196bo17bo$73bo195b3o17boo$70bobo195boobo16boo$268b3o $268b3o$268b3o$269boo5$273b3o48bo$272bobbo49boo$275bo48boo$120b3o152bo $120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bob o$66b3o236bo$66b3o237boo$67boo236boo5$71b3o$70bobbo$73bo196bo$73bo195b 3o$70bobo195boobo$268b3o$268b3o$268b3o$269boo5$273b3o$272bobbo46bo$ 275bo47boo$120b3o152bo46boo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50b o3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo196b o$73bo195b3o$70bobo195boobo$268b3o$268b3o$268b3o$269boo5$273b3o$272bo bbo$275bo$120b3o152bo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$ 66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo4$322b3o$71b3o248bobbo$70bobb o248bo$73bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boobo50bo$268b3o52b obo$268b3o$268b3o$269boo5$273b3o$272bobbo$275bo$120b3o152bo$120bobbo 148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$ 66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo 195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b3o$269boo5$ 273b3o$272bobbo$275bo$275bo$272bobo$$68bo$67b3o$66boobo$66b3o$66b3o$ 66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo 195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b3o$269boo5$ 273b3o$272bobbo$275bo$120b3o152bo$120bobbo148bobo$120bo$68bo51bo3bo$ 67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo4$322b3o$71b3o 248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boob o50bo$268b3o52bobo$268b3o$268b3o$269boo5$273b3o$272bobbo$275bo$120b3o 152bo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o 52bobo$66b3o$66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo 51bo3bo$73bo195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b 3o$269boo$18boo$18boo$$5boo$5boo266b3o$272bobbo$5bo13bo255bo$4bobo10b ooboo98b3o152bo$4bobo33boo78bobbo148bobo$5bo10bo5bo17boo78bo$68bo51bo 3bo$16booboboo30boo12b3o50bo3bo$bbooboboo44boo11boobo50bo$bbo5bo57b3o 52bobo$3bo3bo13bo44b3o$4b3o11bobbo44b3o$21bo45boo$17boo$17bo36bo$17bob o33b3o$18boo18b5o10b3o266b3o$37bob3obo27b3o248bobbo$7bo30bo3bo8boo3boo 12bobbo248bo$8bo9boo3boo14b3o9boo3boo15bo196bo51bo3bo$6b3o9bo5bo15bo 32bo195b3o50bo3bo$11bo58bobo195boobo50bo$11bobo5bo3bo30boo212b3o52bobo $11boo7b3o30bobo212b3o$38bo13boobbo211b3o$b5o32bo14boo214boo$ob3obo8bo 21bobo5bo7boo$bo3bo7bobo20booboobbobo7bo$bb3o9boo19bo5bobboo$3bo19boo 13bo14bo5bo$23bo11boo3boo11bo5bo213b3o193boo$24b3o20bo6bo3bo213bobbo 192boo$26bo20bobo5b3o217bo191bobo$3boo42boo71b3o152bo192b3o$3boo115bo bbo148bobo194boo$120bo347boo$68bo51bo3bo343b3o$35boo30b3o50bo3bo343bob o$36bo29boobo50bo346bobbo$15boo16b3o30b3o52bobo343boboo$15boo16bo32b3o 399bo$30bo24boo9b3o$28bobo24boo10boo402b3o54bo$29boo439bobbo55boo$473b o54boo$473bo$23bo8bo289b3o145bobo$23b3o6bobo8boo26b3o248bobbo$26bo5boo 9boo25bobbo248bo$25boo46bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boob o50bo$27b3o238b3o52bobo$27b3o238b3o$26bo3bo237b3o$25bo5bo237boo$26bo3b o14bo$27b3o13bobo$44boo$$273b3o$272bobbo192bo17bo$42bo232bo191b3o17boo $43boo75b3o152bo190boobo16boo$42boo76bobbo148bobo191b3o$25boo93bo345b 3o$26bo41bo51bo3bo341b3o$23b3o13bo27b3o50bo3bo342boo$23bo15bobo24boobo 50bo$27boo11bobo23b3o52bobo$27boo11bobbo22b3o$40bobo17bo5b3o$39bobo3bo 12bobo6boo402b3o$39bo5bo13boo409bobbo52bo$44b3o426bo53boo$473bo52boo$ 58bo263b3o145bobo$44b3o9bobo12b3o248bobbo$45bo11boo11bobbo248bo$45bo 27bo196bo51bo3bo$45bo27bo195b3o50bo3bo$45bo24bobo195boobo50bo$44b3o 221b3o52bobo177bo$268b3o233boo$268b3o232boo$44b3o222boo$45bo$45bo3$ 273b3o$75boo195bobbo192bo$74boo199bo191b3o$76bo43b3o152bo190boobo$120b obbo148bobo191b3o$120bo345b3o$120bo3bo341b3o$120bo3bo342boo$56boo62bo$ 56boo63bobo$95boo$95boo$471b3o$63boo405bobbo46bo$62bobo408bo47boo$55b 3o4boboboo35bo369bo46boo$63bobobo22boo11b3o216b3o145bobo$55bobo7bo5b3o 15boo15bo215bobbo$54b5o6boo3bobbo11bo5bo13boo215bo$53boo3boo5b3o5bo11b 3o182bo51bo3bo$53boo3boo5b3o5bo14bo180b3o50bo3bo$65b3obbobo14boo179boo bo50bo$65boo41bo159b3o52bobo$55boo8bo42bo159b3o$54booboo4bobobo11boo 26bobo158b3o$55bobbo3boboboo11boo25booboo158boo$55bo6bobo35boo3bo5bo$ 58bo4boo35boo6bo$56boo40b3o4boo3boo$90bo7boo$89b3o5bobo173b3o$51boo3b oo30b5o11b3o165bobbo192bo$52b5o5bo8b3o5b3o5boo3boo9boobo168bo191b3o$ 53b3o7boo6bobbo3bo3bo5b5o10boo15b3o152bo190boobo$54bo7boo7bo16b5o11boo 14bobbo148bobo191b3o$71bo5bo5bo5bobbo12bobo12bo345b3o$72bobobboo3boo5b o3bo11bobboo10bo3bo341b3o$93bo26bo3bo342boo$90boobo26bo$77boo13bo28bob o$76bobo$76bo$76boo11boo3boo8b5o362b3o$57bo22bo8bo5bo7bob3obo360bobbo$ 56b3o7boo9bobbo23bo3bo364bo$56b3o8boo11bo9bo3bo10b3o365bo$66bo24b3o12b o215b3o145bobo$54boo3boo261bobbo$54boo3boo14booboboo240bo$270bo51bo3bo $75bo5bo23boo162b3o50bo3bo$59boo44boo161boobo50bo$59bobo14booboo187b3o 52bobo$61boo15bo13boo174b3o$60boo30boo174b3o$60boo207boo$56b3o$$77boo 441b3o$77boo441bobbo$273b3o244bo$56boo3boo209bobbo192bo51bo3bo$275bo 191b3o50bo3bo$57bo3bo58b3o152bo190boobo50bo$58b3o59bobbo148bobo191b3o 52bobo$58b3o59bo345b3o$120bo3bo341b3o$120bo3bo342boo$120bo$121bobo$58b oo$58boo$471b3o$470bobbo$473bo$473bo$322b3o145bobo$322bobbo$322bo$270b o51bo3bo$269b3o50bo3bo$93boo173boobo50bo$71boo20boo173b3o52bobo$71boo 195b3o$141bo126b3o$72bo68bobo125boo$71bobo20bo49boo6boo$66boobbobbo19b obo34boo12boo4bo3bo$50boo14boobo22bo3bo33boo12boo3bo5bo8boo354b3o$51bo 18boo21b3o45bobo4boobo3bo8boo354bobbo$51bobo8bo28boo3boo43bo7bo5bo117b 3o244bo$52boo7boobboo83bo3bo117bobbo192bo51bo3bo$60boo90boo121bo191b3o 50bo3bo$59b3o4boo52b3o19bo132bo190boobo50bo$60boo4boo52bobbo16boo130bo bo191b3o52bobo$34boo15boo8boo29bo27bo20boo323b3o$34boo15boo9bo29bo27bo 3bo341b3o$92bob3o23bo3bo342boo$120bo$97bo23bobo22boo$71bobbo19boboo47b oo10bobo$71bo22boo51bo8bobbo4bo$48b3o19bo4bo66boo11boo5boo307b3o$47bo 3bo17bobobboo66bobo8boo3bo8boo301bobbo$46bo5bo14boobo18boo3boo49bo9boo 10boo304bo$43bobbo3boo37boo3boo46bobbo10bobbo313bo$43bo3boo41b5o7bo42b o11bobo310bobo$43bo23bobbo20bobo9bo31boo5bobo$69boo30b3o23bo6bobo5boo$ 91b3o31boo7bo135bo$43bo82boo5boo134b3o$38boo3bo224boobo$35boo3bobbo19b 3o49boo16boo133b3o$34bo5bo10b3o8bo3bo22bo11bobo10bobo17bo133b3o$35bo3b o13bo7bo5bo20b3o9boo13bo18bobo8boo121b3o$36b3o13bo8booboboo19bo3bo7b3o bo26boo3boo8boo122boo$55boo32bo9b3o27boo11boo10bo4bo$55bobo28bo5bo8bo 29bo9b3o10bo4bobo$56b3o5bo21bo5bo49boo10bo7boo4boo350b3o$57boo4bobo21b o3bo53boobboo11boo4boo350bobbo$54boo7bobo22b3o54boobbobboo8boo109b3o 244bo$34boo18b3o7bo52boo31b4o5bobo110bobbo192bo51bo3bo$34boo57boo21bo bbo31bo7bo115bo191b3o50bo3bo$49boo13boo28boo21boo156bo190boobo50bo$49b oo4boo7boo27bo13bo9bo154bobo191b3o52bobo$55boo48bobo18boo338b3o$103boo 21bobo337b3o$103boo23bo338boo$45b3o55boo23boo$47bo51boo4bobo$45bo45bo 6bobo6bo37boo9boo$45boo43b3o5bo45boo9bobo$44boo44b3o4boo40bo6bo7b3o4b oob3o304b3o$43bobbo91bobo12b3o4bobb4o303bobbo$44bo43boo3boo20boo3boo9b oo3boo3bo12b3o4boo310bo$47booboo36boo3boo36boo3boo3bo13bobo315bo$45b3o boo4boo59bo3bo15boo3bo14boo164b3o145bobo$45b3o6bobo60b3o18bobo181bobbo $53b3o35bo25b3o19bo182bo$53boo35bobo177bo51bo3bo$56boo31boo178b3o50bo 3bo$55b3o31boo129boo46boobo50bo$89b3o128boo46b3o52bobo$90bobo25boo148b 3o$55boo34boo25boo87boo59b3o$55boo150boo60boo3$520b3o$207bo13bo20boo 276bobbo$206bobo11b3o17bobbo29b3o244bo$205bo3bo9b5o48bobbo192bo51bo3bo $206b3o9bobobobo14bo15boo18bo191b3o50bo3bo$204boo3boo7boo3boo30boo18bo 190boobo50bo$240boo30bobo191b3o52bobo$242bo223b3o$221bo244b3o$220bobo 244boo$205bo14boboo15boo3boo$205bo15b3o15boo3boo$205bob3o11bobbo15b5o$ 222b3o16bobo$210bo10bo3bo30bo214b3o$207boboo9bo5bo14b3o11b3o212bobbo$ 207boo6bo5bo3bo28b5o214bo$214bo7b3o28boo3boo213bo$214b3o37b5o63b3o145b obo$202boo3boo45bo3bo63bobbo$202boo3boo3boo41bobo64bo$203b5o4boo31bo 10bo13bo51bo3bo$204bobo39bo22b3o50bo3bo$244b3o21boobo50bo$204b3o33bo 17bo9b3o52bobo$239b3o14booboo7b3o$225boo11b5o25b3o$225bo11boo3boo11bo 5bo7boo$226b3o21boo$223bo4bo21boo3booboboo$205boo14bobo296b3o$205boo 15boo15b3o278bobbo$239b3o31b3o244bo$272bobbo192bo51bo3bo$237boo4bo31bo 191b3o50bo3bo$238bo4bobo29bo190boobo50bo$217boo16b3o5boo27bobo191b3o 52bobo$217boo16bo230b3o$257boo207b3o$257boo208boo4$225bo$225b3o10bo6b oo224b3o$228bo7bobo6boo223bobbo$227boo8boo234bo$473bo$322b3o145bobo$ 322bobbo$230bo4bo86bo$230bo5boo32bo51bo3bo$229bobo3boo32b3o50bo3bo$ 228booboo35boobo50bo$227bo5bo34b3o52bobo$230bo37b3o$227boo3boo34b3o 461bo$269boo462boo$732boo$253bo$251bobo266b3o$252boo266bobbo$227boo44b 3o244bo$228bo43bobbo192bo51bo3bo$225b3o10boo11bo23bo191b3o50bo3bo$225b o12boo9bobo23bo190boobo50bo$229boo3bo6boo7boo20bobo191b3o52bobo$229bob o3bo5b3o222b3o$230b5o6boo223b3o$231b3o4boo227boo$238boo$$247bo$246b3o$ 245booboo18bo202b3o$244b3ob3o15bobo201bobbo$244b3ob3o16boo204bo193boo$ 244b3ob3o222bo192boo$244b3ob3o71b3o145bobo192bobo$245booboo16bo55bobbo 340b3o$246b3o15bobo55bo344boo$247bo17boo55bo3bo339boo$271boo49bo3bo 339b3o$270boo50bo343bobo$272bo50bobo339bobbo$665boboo$666bo$730bo$669b 3o59boo$668bobbo58boo$520b3o148bo$520bobbo147bo$273b3o244bo147bobo$ 272bobbo192bo51bo3bo$275bo191b3o50bo3bo$258boo15bo190boobo50bo$258boo 12bobo191b3o52bobo$286boo9boo167b3o$285boo10boo167b3o$287bo179boo$265b oo$264bobo$264boboboo35bo$265bobobo35b3o$267bo40bo162b3o$257b3o7boo18b o19boo161bobbo$256bo3bo6b3o17b3o183bo$255bo5bo5b3o3b3o14bo182bo192bo 17bo$255bo5bo5b3o3bobbo12boo31b3o145bobo192b3o17boo$258bo8boo4bo48bobb o338boobo16boo$256bo3bo6bo5bo48bo341b3o$257b3o5bobobo4bobo4boo39bo3bo 337b3o$258bo5boboboo11boo18boo7bo11bo3bo337b3o$264bobo33boo7b3o10bo 342boo$265boo35bo5b5o10bobo$255b3o49boo3boo$255b3o31boo3boo$254bo3bo 31b5o3boo424bo$262bobo25booboo4boo6boo360b3o53boo$253boo3boo3boo25boob oo3bo7bo361bobbo52boo$263bo27b3o15bo210b3o148bo$273b3o30bobbo210bobbo 147bo$281b3o22booboo209bo147bobo$272bobbo4bo3bo23boo158bo51bo3bo$273bo boobbo5bo181b3o50bo3bo$280bo3bo8b3o170boobo50bo$275boo4b3o9b3o9boo3boo 154b3o52bobo$280bobbo8bo3bo8boo3boo154b3o$280b3o8bo5bo8b5o155b3o232bo$ 279boboo9bo3bo10bobo157boo233boo$279bobo11b3o405boo$280bo26b3o$267bo$ 259bo7boo$258b3o5bobo8boo3boo187b3o$257b5o15bobobobo186bobbo$256boo3b oo15b5o190bo$257b5o17b3o25boo164bo192bo$257b5o18bo26boo13b3o145bobo 192b3o$258bobbo60bobbo338boobo$258bo3bo31boo26bo341b3o$262bo31boo26bo 3bo337b3o$259boobo59bo3bo337b3o$261bo60bo342boo$323bobo$279boo$258boo 3boo14boo$258bo5bo$669b3o$259bo3bo404bobbo46bo$260b3o257b3o148bo47boo$ 520bobbo147bo46boo$520bo147bobo$468bo51bo3bo$467b3o50bo3bo$466boobo50b o$466b3o52bobo$260boo204b3o$260boo204b3o$467boo5$471b3o$470bobbo$473bo $473bo192bo$295boo25b3o145bobo192b3o$273boo20boo25bobbo338boobo$273boo 47bo341b3o$322bo3bo14boo321b3o$274bo47bo3bo14bobbo319b3o$273bobo46bo 10b5o7bo9bobo307boo$268boobbobbo47bobo6bo5bo6bo7bo3bo$252boo14boobo24b o35bo3boo7bo7bo12boo$253bo18boo21b3o35bo7bobbo7bo4bo8boo$253bobo7bo31b 3o43boo10bo$254boo7bobo87bo3bo311b3o$266boo25boo3boo55bobo310bobbo$ 266boo25boo3boo220b3o148bo$252boo12boo74boo176bobbo147bo$236boo9boo5bo 8bobo76boo176bo147bobo$236boo16bo8bo31boo171bo51bo3bo$246bo6bo41bobo 169b3o50bo3bo$246bo3boo42bobboo167boobo50bo$296boo40bo127b3o52bobo$ 247b3o23bobbo19boo38boo12bo10bo104b3o$273bo23bo39boo10boo9boo104b3o$ 239bo32bo4bo66bo4bobo7boo4boo100boo$238bobo30bobobboo13bo5bo44bobo13b 3o4boobboo$238bobo28boobo18bo5bo43bobo15boo4boobboo$239bo52bo3bo6bo36b obbo16boo$244bo48b3o5bobo37bobo17bo$243bobo23bobbo29boo33boo3bobo126b 3o244b3o$246boo23boo63bobo5bo125bobbo244bobbo$243boo91bo136bo244bo$ 245bobo87boo136bo192bo51bo3bo$246bo75b3o145bobo192b3o50bo3bo$251bo58bo 6boobbobbo10boo327boobo50bo$250bobo58bo4bobobo15bo327b3o52bobo$250bobo 56b3o5bo3bobbo11bobo10bo314b3o$251bo11boo3boo21bo29boboo12boo9b4o312b 3o$257boo6b3o21booboo7boo44boob4o5boo304boo$241b3o13bobo4bo3bo33boo13b oo27b3oboo3bo3bobbo$258b3o4bobo20bo5bo6bo45booboo3bo7bo6boo$239boo3bo 14boo5bo81b5o3bo6bo6boo$237bo6bo11boo30booboboo54bo3b3o7bo$236bo19b3o 100bobbo306b3o$236bo5boo78bo36boo307bobbo$237boo12boo13boo26boo224b3o 148bo$251boo4boo7boo25bobo14boo29boo4bo172bobbo147bo$257boo35bo13bobbo 3boo11boo10boo3boo173bo147bobo$293boo12bo7b3o10bobo11bo3boo120bo51bo3b o$293b3o11bo6bo15bo136b3o50bo3bo$294boo11bo22boo134boobo50bo$292bo8boo 5bobbo154b3o52bobo$300bobo7boo37boo9bo105b3o$300bo47b4o7bobo104b3o$ 299boo16boo3boo19bobobbobb3o5boobo4boo98boo$247boo44bo23bo5bo18bobbobb oo9booboo3boo$246bobboo41b3o38boo6boo9bo6boobo$246boobbo40b5o22bo3bo 10boo4boo3bo8bo5bobo$247boo8boo31boo3boo22b3o19boo10bo6bo$249boobo3bob o32b5o46bobbo125b3o244b3o$250bobobb3o33bo3bo47bobo124bobbo244bobbo$ 255boo35bobo178bo244bo$258boo33bo124boo53bo192bo51bo3bo$257b3o158boo 50bobo192b3o50bo3bo$664boobo50bo$293boo25boo83boo257b3o52bobo$257boo 34boo25boo83boo257b3o$257boo405b3o$665boo$$440boo$440boo$405bo$404b3o 46boo214b3o$404b3o10b5o18bo12boo213bobbo$416bob3obo16b3o229bo$402boo3b oo8bo3bo16bo3bo228bo$402boo3boo9b3o19bo227bobo$419bo17bo5bo11boo11bo$ 437bo5bo23b3o$404boo32bo3bo23boobo$404bobo32b3o24b3o$403bobboo13bo44b 3o$405boo14bo29boo3boo8b3o$405boo7bo5bobo29b5o10boo$406bo7bobobbooboo 28booboo$414boobbo5bo17bo9booboo$400bo5bo14bo31b3o$400bo5bo11boo3boo$ 401bo3bo6bo29bo28b3o244b3o$402b3o5bobo27bobo27bobbo244bobbo$411boo28b oo30bo244bo$473bo192bo51bo3bo$470bobo192b3o50bo3bo$450bo213boobo50bo$ 423boo10boo3boo8bobo3bo207b3o52bobo$423bo26boo3b3o206b3o$424b3o9bo3bo 13b5o205b3o$426bo10b3o13bobobobo205boo$403boo32b3o13boo3boo$403boo$$ 456bo$435boo18bobo211b3o$427bo8bo18bobo210bobbo$415boo8bobo5b3o20bo63b 3o148bo$415boo9boo5bo21boo63bobbo147bo$455boo63bo147bobo$455boo11bo51b o3bo$435bo31b3o50bo3bo$435bobo28boobo50bo$435boo29b3o52bobo$423bo42b3o $423b3o17boo21b3o$426bo16boo22boo$425boo4$442bo28b3o244b3o$440bobo27bo bbo244bobbo$441boo30bo244bo$428bo44bo192bo51bo3bo$427b3o40bobo192b3o 50bo3bo$426b5o233boobo50bo$425boo3boo7bo224b3o52bobo$440boo222b3o$439b oo223b3o$429bo235boo$429bo$$425boo$426bo$423b3o9bo233b3o$423bo9b4o20bo 210bobbo$427boo3boboboo17bobo62b3o148bo$427boobbobbob3o17boo62bobbo 147bo$432boboboo82bo147bobo$433b4o31bo51bo3bo$435bo8b3o8bo11b3o50bo3bo $444b3o6bobo10boobo50bo$445bo8boo10b3o52bobo$445bo20b3o$445bo20b3o467b o$444bobo20boo468boo$936boo$$444bobo$445bo$445bo25b3o244b3o$445bo24bo bbo244bobbo$444b3o26bo244bo$444b3o26bo192bo51bo3bo$470bobo192b3o50bo3b o$664boobo50bo$664b3o52bobo$664b3o$664b3o$665boo$$478boo$477boo$479bo$ 669b3o$456boo210bobbo$456boo62b3o148bo$495boo23bobbo147bo$495boo23bo 147bobo$520bo3bo$463boo55bo3bo$462bobo55bo$462boboboo35bo17bobo$463bob obo35b3o$465bo40bo$453booboboo5boo18bo19boo427bo$465b3o17b3o5boo440boo $453bo5bo5b3o20bo3boo440boo$465b3o19boo5bo$454booboo6boo21b3o$456bo8bo 5b3o15bobo226b3o$463bobobobbobbo5boo8bobo226bobbo$462boboboo5bo5boo9bo 227bo$462bobo8bo26boo164bo51bo3bo$463boo5bobo27boo3boo3boo153b3o50bo3b o$482bo4booboboo170boobo50bo$459bo21bo5bo5bo12bo3bo153b3o52bobo$453b3o 4boo19bo6bo3bo14b3o154b3o$452bo3bobboo28b3o3bo11b3o154b3o$495boo168boo $451bo5bo19boo3boo10bobo$451boo3boo22bo25bo$473boobbo5bo21b3o$473bobo bbooboo21bo3bo$466bobo4bo5bobo24bo162b3o$467boo11bo22bo5bo158bobbo$ 467bo3bo8bo11bo10bo5bo10b3o148bo$471boo19bo11bo3bo11bobbo147bo$470bobo 18bobo11b3o12bo147bobo$490booboo25bo3bo$478bo10bo5bo24bo3bo$477b3o12bo 27bo$476bo3bo8boo3boo25bobo$454boo3boo14bob3obo$455b5o3boo11b5o$455boo boo4boo25bo436bo$455booboo3bo27bo373boo62boo$456b3o31bo14boo357boo62b oo$505boo356bobo$864b3o$492boo224b3o144boo$492boo224bobbo142boo$458b3o 257bo145b3o$458b3o205bo51bo3bo141bobo$457bo3bo203b3o50bo3bo140bobbo$ 456bo5bo14boo185boobo50bo144boboo$457bo3bo15boo185b3o52bobo142bo$458b 3o203b3o$664b3o200b3o$665boo199bobbo$869bo$869bo$866bobo$$669b3o$668bo bbo$520b3o148bo$458boo60bobbo147bo$458boo60bo147bobo$520bo3bo$520bo3bo $520bo$521bobo5$864bo17bo39bo$493boo368b3o17boo38boo$471boo20boo367boo bo16boo38boo$471boo245b3o141b3o$538bo179bobbo140b3o$472bo64bobo178bo 143b3o$471bobo61boo3bo14boo109bo51bo3bo140boo$466boobbobbo56boo3boo3bo 13bobo108b3o50bo3bo$450boo14boobo60boo3boo3bo12b3o4boob3o98boobo50bo$ 451bo18boo65bobo12b3o4bobb4o98b3o52bobo$451bobo5boo77bo6bo7b3o4boo102b 3o$452boo5bobbo31bo48boo9bobo107b3o200b3o$463bo29b3o48boo9boo108boo 199bobbo$463bo28b5o372bo$463bo27boo3boo371bo$434boo15boo6bobbo29b5o 369bobo$434boo15boo6boo31bo3bo$493bobo173b3o$494bo173bobbo$520b3o148bo $438b3o4bo25bobbo45bobbo26bo7bo112bo$437bo3bobbobo24bo20bo27bo28b4o5bo bo107bobo228bo$436bo3boo3b3o22bo4bo14booboo25bo3bo19boobbobboo8boo337b oo$437b3obo5boo20bobobboo23bo20bo3bo19boobboo11boo4boo330boo$438bo7bob o11boo5boobo18bo5bo4bo19bo20boo10bo7boo4boo$441bo5bo12boo36b3o20bobo6b o9b3o10bo4bobo$489booboboo32boo11boo10bo4bo$463boobbobbo58boo4boo7boo$ 469boo33boo28bobo7boo$504bobo27bo$504bobo26boo329bo$503bo359b3o$439bo 5bo15boo3boo34b5o8boo16boo327boobo$438bobo7bo12boo3boo34bo3bo7bobo17bo 183b3o141b3o$438boo5bob3o55bo9bo18bobo7bo173bobbo140b3o$439b3o3boo3bo 12b3o69boo7b4o170bo143b3o$440bobobbo3bo5boo6b3o79b4o7bo109bo51bo3bo 140boo$441bo4b3o6bobo6bo24bo8bo46bobbo6bobo107b3o50bo3bo$456b3o29b3o7b oo14bo18boo10b4o4boo3bo9boo94boobo50bo$457boo28b5o5bobo15bo16boo10b4o 5boo3bo9boo94b3o52bobo$454boo30bobobobo20b3o18bo9bo8boo3bo105b3o$434b oo18b3o29boo3boo62bobo106b3o200b3o$434boo120bo108boo199bobbo46bo$464b oo79bobo321bo47boo$445bo9boo7boo25boo17bo34boo322bo46boo$442bobo10boo 34boo16bobo14boo18bo319bobo$441boobo48bo14bo3boo12bobo$442boo4bo42b3o 14bo3boo14bo12boo126b3o$445b5o39bo18bo3boo3b3o8boo11boo125bobbo$444b3o bbo39b5o5boo8bobo5b3o151bo$443bo3boo41boo6bobo9bo5bo3bo33boo115bo$444b oboo50bo16bo5bo25boboo3b3o111bobo$446boo49boo17bo3bo22bobbo3bo5boobo5b oo$488boo3boo22b3o22boobbo4bo4bobbo5boo$489b5o37boo8boo5b4o4boobo$489b ooboo37boo7b3o7bo3b3o$455boo32booboo47boo11boo$449boo3bobo33b3o49boo$ 449boobb3o87bo$453boo$456boo406bo$455b3o405b3o$616boo244boobo$491boo 25boo96bobbo98b3o141b3o$455boo34boo25boo198bobbo140b3o$455boo146boo15b o97bo143b3o$603boo61bo51bo3bo140boo$618boo45b3o50bo3bo$617bo46boobo50b o$664b3o52bobo$638boo24b3o$614boo3boo17boo24b3o200b3o$614boo3boo44boo 199bobbo$615b5o31boo216bo$616bobo32boo216bo$603bo262bobo$602b3o11b3o 19bo13bo$601b5o30booboo10bobo15b3o$600boo3boo44bobo14bobbo$601b5o29bo 5bo10bo18bo$601bo3bo65bo$602bobo30booboboo26bobo$603bo10bo34booboboo$ 613bo35bo5bo$613b3o20bo13bo3bo$601bo17bo16bobbo11b3o$599booboo14b3o15b o$617b5o17boo275b3o$598bo5bo11boo3boo17bo275bobbo$608boo28bobo275bo$ 598booboboo3boo28boo224bo51bo3bo$863b3o50bo3bo$618b3o29bo211boobo50bo$ 618b3o12boo3boo9bo68b3o141b3o52bobo$633bo5bo9b3o66bobbo140b3o$616bo4b oo23bo71bo143b3o$614bobo4bo12bo3bo5bobo19bo51bo3bo140boo$615boo5b3o10b 3o7boo18b3o50bo3bo$624bo39boobo50bo$601boo49b5o7b3o52bobo$601boo39bo8b ob3obo6b3o$642bobo7bo3bo7b3o200b3o$642boo9b3o9boo199bobbo$633boo19bo 214bo$634bo234bo$613boo16b3o232bobo$613boo16bo$653boo14b3o$653boo13bo bbo$671bo$631bo39bo$629bobo36bobo$621bo8boo$621b3o17boo$624bo16boo$ 623boo$628bo$629boo285b3o$628boo286bobbo$916bo$864bo51bo3bo$863b3o50bo 3bo$862boobo50bo$862b3o52bobo$623boo3boo232b3o$646bo215b3o$624bo3bo15b obo19bo196boo$625b3o17boo18b3o$625b3o36boobo$664b3o$664b3o$623boo39b3o 200b3o$624bo19boo19boo199bobbo$621b3o12bo5bobo224bo$621bo11b4o4boboo 224bo$625boo5b4o6bo223bobo$625boo5bobbo$632b4o33b3o$633b4o31bobbo$636b o34bo$642b3o16bo9bo$641bo3bo13bobo6bobo$641bo3bo14boo$642b3o$$659bo$ 657bobo$658boo256b3o$642b3o271bobbo$641bo3bo270bo$641bo3bo218bo51bo3bo $642b3o218b3o50bo3bo$862boobo50bo$718b3o141b3o52bobo$670boo46bobbo140b 3o$669boo47bo143b3o$671bo46bo3bo140boo$718bo3bo$718bo$719bobo418bo$ 1141boo$867b3o270boo$866bobbo$869bo$654boo213bo$654boo210bobo$654boo 37boo$654bo14b3o21boo$653bobo12bobbo$653bobo5boo8bo13boo$654bo5bobo8bo 12boo$660boboboobbobo15bo14bo$661bobobo35b3o$651boo3boo5bo40bo$651bobo bobo5boo18bo19boo$652b5o6b3o17b3o$653b3o7b3o20bo20bo$654bo8b3o19boo20b o208b3o$663boo41bo209bobbo$663bo252bo$661bobobo11boo9bo175bo51bo3bo$ 660boboboo11boo8bobo13boo3boo153b3o50bo3bo$660bobo6b3o14bo3bo12bo5bo 152boobo50bo$661boo6bobbo14b3o28b3o141b3o52bobo$655bobo11bo7b3o5boo3b oo8boobbo3bo9bobbo140b3o$656boo11bo7b3o19boo4b3o10bo143b3o$656bo13bobo 28bo16bo3bo140boo$718bo3bo$718bo$651b3o21boo3boo9boo26bobo$650bo3bo21b 5o11boo444bo$649bo5bo7bo13b3o11bo175b3o269boo$650bo3bo9boo12bo25bo161b obbo268boo$651b3o9boo7b3o27booboo162bo$651b3o18bo196bo$655bo17bo27bo5b o158bobo$654bobo$654bobo10boo32booboboo$655bo12boo20bo$667bo21b3o$688b 5o$652booboboo16b3o9boo3boo$652bo5bo$653bo3bo17bobo$654b3o3bo13b5o$ 660boo11boo3boo9b3o$659bobo11boo3boo9b3o11boo$703boo211b3o$916bobbo$ 676bo13boo224bo$677boo11boo172bo51bo3bo$863b3o50bo3bo$657bo21bo182boob o50bo$657bo60b3o141b3o52bobo$656bobo16bobbo39bobbo140b3o$655booboo15b oo41bo143b3o$654bo5bo57bo3bo140boo$657bo60bo3bo$654boo3boo57bo$719bobo $1132bo$658bo208b3o263boo$658bo207bobbo262boo$659bo209bo$869bo$866bobo $656boo$656boo10$691boo223b3o$669boo20boo223bobbo$669boo245bo$738bobo 123bo51bo3bo$670bo66bobbo122b3o50bo3bo$669bobo21boo41boo10bo6bo106boob o50bo$664boobbobbo46b3o7boo4boo3bo8bo5bobo105b3o52bobo$648boo14boobo 50bobbo6boo6boo9bo6boobo4boo98b3o$649bo18boo48bo18bobbobboo9booboo3boo 98b3o$649bobo4bo61bo3bo15bobobbobb3o5boobo105boo$650boo3bobo31boo3boo 22bo3bo20b4o7bobo$653boo3bo31b5o23bo25boo9bo$653boo3bo31booboo24bobo$ 653boo3bo31booboo$632boo15boo4bobo33b3o173b3o$632boo15boo5bo80bo3boo 123bobbo256bo$735boo3boo127bo257boo$736boo4bo126bo256boo$866bobo$669bo bbo81boo$669bo84bobbo305boo$646b3o19bo4bo22bo47bo3b3o7bo303boo$645bo3b o17bobobboo16bo3bobo46b5o3bo6bo6boo294bobo$644bo5bo14boobo20b3o3boo45b ooboo3bo7bo6boo295b3o$641bobbo3boo38b5o48b3oboo3bo3bobbo305boo$641bo3b oo40bobobobo48boob4o5boo306boo$641bo20bobbobbo18boo3boo39boo8b4o315b3o $661bobo3boo63bobo9bo317bobo$660bo3bo38bo28bo328bobbo$641bo18b5o39bo 26boo328boboo$636boo3bo17boo3boo36b3o211b3o143bo$633boo3bobbo18b5o48b oo5boobboo5boo183bobbo$632bo5bo10b3o9b3o48bobo6boo3bo5bo183bo148b3o$ 633bo3bo13bo10bo50bo8boboo6bobo6boo121bo51bo3bo143bobbo$634b3o13bo82b 3o5bobo119b3o50bo3bo146bo$653boo80b3o6bo11bobo103boobo50bo150bo$653bob o79bobbobbobbo10bobbo103b3o52bobo144bobo$654b3o79boo6bo9boo10boo94b3o$ 655boo37boo19boo24bobo8boo3bo8boo94b3o$652boo41boo17bobbo23boo11boo5b oo100boo$632boo18b3o30b5o4bo19bo4bo26bo8bobbo4bo$632boo50bob3obo24b6o 23boo10bobo$647boo13boo21bo3bo28boboo23boo$647boo4boo7boo22b3o15bobo 11bobo$653boo32bo16bobbo10boo4boo141b3o$688boo17boo15bobo139bobbo$688b obo14bo3boo15bo13boo127bo$643b3o42bobo16boo17boo11boo128bo$645bo43bo7b oo5bobbo8bo24bo124bobo$643bo52bobo5bobo9bo34boo$643boo51bo18bobo31bo3b o$642boo42booboboobboo17booboo21bo7bo5bo8boo297bo17bo$641bobbo41bo5bo 20bo5bo20bobo4boobo3bo8boo296b3o17boo$642bo44bo3bo24bo12boo12boo3bo5bo 305boobo16boo$645booboo38b3o22boo3boo9boo12boo4bo3bo306b3o$643b3oboo4b oo88boo6boo307b3o$643b3o6bobo85bobo317b3o$651b3o61bo24bo320boo57bo$ 651boo62bo405boo$654boo58bo405boo$653b3o260b3o$916bobbo$689boo25boo 198bo148b3o$653boo34boo25boo146bo51bo3bo143bobbo$653boo208b3o50bo3bo 146bo$862boobo50bo150bo$862b3o52bobo144bobo$862b3o$862b3o$863boo$$814b oo$814boo281bo$1098boo$801boo64b3o227boo$801boo12bo50bobbo$814b3o52bo$ 813bo3bo51bo$815bo50bobo$799boo11bo5bo17boo$812bo5bo17boo$813bo3bo244b o$814b3o32boo210b3o$849boo209boobo$798boo3boo255b3o$799b5o256b3o$799b ooboo256b3o$799booboo9bo22bo13bo210boo$800b3o32b3o11bobo$834b5o9bo3bo$ 813bo19bobobobo9b3o64b3o$813bobo17boo3boo7boo3boo62bobbo$813boo101bo 148b3o$864bo51bo3bo143bobbo46bo$836bo26b3o50bo3bo146bo47boo$805bo29bob o24boobo50bo150bo46boo$799bo3bobo8boo3boo13boobo14bo9b3o52bobo144bobo$ 798b3o3boo28b3o15bo9b3o$797b5o13bo3bo13bobbo11b3obo9b3o$796bobobobo13b 3o14b3o27boo$796boo3boo13b3o13bo3bo10bo$831bo5bo9boobo$832bo3bo5bo6boo $799bo33b3o7bo$798bobo18boo20b3o23b3o$798bobo18bo29boo3boo10bobbo$799b o20b3o21boo3boo3boo13bo$799boo21bo21boo4b5o14bo$799boo50bobo12bobo$ 799boo$820bo30b3o$818bobo241bo$819boo10boo228b3o$832bo227boobo$811boo 16b3o228b3o$811boo16bo4bo225b3o$834bobo14boo207b3o$834boo15boo208boo3$ 916b3o$819bo96bobbo$819b3o17boo75bo148b3o$822bo16boo23bo51bo3bo143bobb o$821boo40b3o50bo3bo146bo$835bo26boobo50bo150bo$825bo7bobo26b3o52bobo 144bobo$825bo8boo26b3o$824bo37b3o$863boo$$821boo3boo4bo$821bo5bo5boo$ 832boo$822bo3bo40b3o$823b3o40bobbo$869bo$869bo$866bobo245b3o$1114bobbo $821boo27bo263bo$822bo25bobo211bo51bo3bo$819b3o12boo13boo210b3o50bo3bo $819bo13bobo224boobo50bo$823boo7bo6boo219b3o52bobo$823boo7bobbo3bobo6b o211b3o$832bo6bobo4bobo211b3o$833bobo11boo212boo$834boo$$841bo74b3o$ 841bo74bobbo$840bobo73bo148b3o$841bo22bo51bo3bo143bobbo$841bo21b3o50bo 3bo146bo$841bo20boobo50bo150bo$841bo20b3o52bobo144bobo$840bobo19b3o$ 841bo20b3o$841bo21boo5$867b3o$866bobbo$869bo$869bo$866bobo245b3o$1114b obbo$1114bo$1062bo51bo3bo$877boo182b3o50bo3bo$852boo22boo182boobo50bo$ 852boo24bo181b3o52bobo226bo$891boo167b3o282boo$891boo167b3o281boo$ 1061boo$852bo6boo$851b3o4bobo$850bo3bo3boboboo35bo$849bob3obo3bobobo 35b3o$850b5o6bo40bo162b3o$861boo18bo19boo161bobbo$861b3o17b3o183bo$ 861b3o20bo182bo$861b3o19boo18b3o158bobo$861boo29boo9b3o$849boobbo7bo 29boo9bo3bo$851bobo5bobobo11boo16bo7bo5bo$853boo3boboboo11boo25bo3bo$ 854boobbobo25bo16b3o$852boboo3boo24b3o7boo$852b3o30b3o8boo$867b3o25bo 4bo$866bobbo5b3o5boo3boo9boo$847boo3boo15bo5b3o5boo3boo9bobo$850bo18bo 4bo3bo$847bo5bo12bobo245b3o$848booboo6bobo11boo3boo8boo224bobbo$849bob o8boo26bobo223bo$850bo9bo29boo170bo51bo3bo$850bo38boo170b3o50bo3bo$ 872boo15boo11bo157boobo50bo$872bobo10b3o13b3o156b3o52bobo$872bo27b5o 155b3o279bo$853bo45bobobobo154b3o280boo$852bobo9bo34boo3boo155boo279b oo$851bo3bo8boo6bo$852b3o8bobo19boo3boo$850boo3boo45bo13b3o$886bo3bo 10bobo12bobbo$887b3o11bobo12bo148b3o$873b3o11b3o12bo13bo3bo143bobbo$ 872bo3bo24boo13bo3bo146bo$856boo13bo5bo23boo13bo150bo$857boo12bo5bo23b oo14bobo144bobo$856bo17bo$872bo3bo11boo$873b3o12boo$874bo3$873boo$855b o17boo$854b3o$853b5o$852boo3boo$1114b3o$1114bobbo$1114bo$854b3o205bo 51bo3bo$854b3o204b3o50bo3bo$1060boobo50bo$1060b3o52bobo$854boo204b3o 273bo$854boo204b3o274boo$1061boo273boo3$916b3o$916bobbo$916bo148b3o$ 916bo3bo143bobbo$916bo3bo146bo$916bo150bo$889boo26bobo144bobo$867boo 20boo$867boo$890bo47bo$868bo20bobo45boo$867bobo19bobo44boo11boo$862boo bbobbo20bo35boo7b3o7bo3b3o$846boo14boobo60boo8boo5b4o4boobo5boo$847bo 18boo69boobbo4bo4bobbo5boo$847bobo6bobo28booboboo44bobbo3bo5boobo$848b oo5bobbo28bo5bo48boboo3b3o$854boo32bo3bo56boo$852boo3bo31b3o222b3o$ 846boo6boo80boo176bobbo$830boo9boo5bo6bobbo77boo176bo$830boo16bo7bobo 6boo195bo51bo3bo$840bo6bo17boo74bo119b3o50bo3bo$840bo3boo94boo118boobo 50bo$940bobo117b3o52bobo$841b3o23bobbo21bo58bo108b3o$859b3o5bo25bo56bo bo107b3o$833bo27bo4bo4bo19b3o35bo9bo8boo3bo107boo267bo$832bobo25bo4bob obboo55boo10b4o5boo3bo9boo366boo$832bobo28boobo61boo10b4o4boo3bo9boo 365boo$833bo82b3o21bobbo6bobo$838bo77bobbo20b4o7bo$837bobo23bobbo19b5o 25bo14boo6b4o122b3o$840boo23boo18bob3obo8bo15bo3bo9bobo6bo124bobbo$ 837boo47bo3bo7bobo15bo3bo9bo136bo$839bobo17b3o25b3o9boo15bo12boo136bo$ 840bo17booboo25bo28bobo144bobo$845bo12booboo22bo25boo16boo$844bobo11b 5o21bobo11boo10bobo17bo$844bobo10boo3boo20bobo12boo10bo18bobo6bo$845bo 39bo12bo8bo23boo4bobo$851boo55bo27bobo17bo$835b3o13bobo52b3o26bobbo16b oo$852b3o27boo3boo47bobo15boo4boobboo$833boo3bo14boo3boo22boo3boo48bob o13b3o4boobboo$831bo6bo11boo31b5o3bo47bo4bobo7boo4boo$830bo19b3o31bobo 4boo39boo10boo9boo$830bo5boo52bobo38boo12bo10bo$831boo12boo13boo22b3o 46bo180b3o$845boo4boo7boo40bo211bobbo$851boo49boo18boo190bo$898boo3boo 17bobo137bo51bo3bo$903b3o18bo12boo122b3o50bo3bo$887bo15boo19boo11boo 121boobo50bo$886bobo6boo5boo156b3o52bobo$885bo3bo4bobo5bo47bobo107b3o$ 886b3o5bo53bo3bo107b3o$884boo3boobboo19bo21boo10bo12boo98boo$841boo70b 3o12bo7bobbo7bo4bo8boo$840bobboo67b5o10bo3boo7bo7bo$840boobbo66boo3boo 9bo5bo6bo7bo3bo$841boo8boo75b5o7bo9bobo$843boobo3bobo83bobbo125b3o$ 844bobobb3o84boo126bobbo$849boo62b3o151bo$852boo59b3o151bo$851b3o210bo bo$$887boo25boo$851boo34boo25boo408bo$851boo472boo$1012boo310boo$1012b oo$$999boo$999boo$$999bo13bo$998bobo10booboo98b3o$998bobo33boo78bobbo$ 999bo10bo5bo17boo78bo$1062bo51bo3bo$1010booboboo30boo12b3o50bo3bo$996b ooboboo44boo11boobo50bo$996bo5bo57b3o52bobo$997bo3bo13bo44b3o$998b3o 11bobbo44b3o$1015bo45boo$1011boo$1011bo36bo$1011bobo33b3o$1012boo18b5o 10b3o$1031bob3obo27b3o$1001bo30bo3bo8boo3boo12bobbo$1002bo9boo3boo14b 3o9boo3boo15bo$1000b3o9bo5bo15bo32bo$1005bo58bobo$1005bobo5bo3bo30boo$ 1005boo7b3o30bobo$1032bo13boobbo$995b5o32bo14boo$994bob3obo8bo21bobo5b o7boo$995bo3bo7bobo20booboobbobo7bo$996b3o9boo19bo5bobboo$997bo19boo 13bo14bo5bo$1017bo11boo3boo11bo5bo264bo$1018b3o20bo6bo3bo266boo$1020bo 20bobo5b3o266boo$997boo42boo71b3o$997boo115bobbo$1114bo$1062bo51bo3bo$ 1029boo30b3o50bo3bo$1030bo29boobo50bo$1009boo16b3o30b3o52bobo$1009boo 16bo32b3o$1024bo24boo9b3o$1022bobo24boo10boo$1023boo3$1017bo8bo$1017b 3o6bobo8boo26b3o$1020bo5boo9boo25bobbo$1019boo46bo$1067bo$1064bobo$ 1021b3o$1021b3o$1020bo3bo$1019bo5bo$1020bo3bo14bo$1021b3o13bobo$1038b oo4$1036bo$1037boo75b3o$1036boo76bobbo$1019boo93bo$1020bo41bo51bo3bo$ 1017b3o13bo27b3o50bo3bo$1017bo15bobo24boobo50bo$1021boo11bobo23b3o52bo bo$1021boo11bobbo22b3o$1034bobo17bo5b3o$1033bobo3bo12bobo6boo$1033bo5b o13boo$1038b3o$$1052bo$1038b3o9bobo12b3o$1039bo11boo11bobbo$1039bo27bo $1039bo27bo$1039bo24bobo$1038b3o3$1038b3o$1039bo$1039bo4$1069boo$1068b oo$1070bo43b3o$1114bobbo$1114bo$1114bo3bo$1114bo3bo$1050boo62bo$1050b oo63bobo$1089boo$1089boo$$1057boo$1056bobo$1049b3o4boboboo35bo$1057bob obo22boo11b3o$1049bobo7bo5b3o15boo15bo$1048b5o6boo3bobbo11bo5bo13boo$ 1047boo3boo5b3o5bo11b3o$1047boo3boo5b3o5bo14bo$1059b3obbobo14boo465bo$ 1059boo41bo446boo$1049boo8bo42bo445boo$1048booboo4bobobo11boo26bobo$ 1049bobbo3boboboo11boo25booboo$1049bo6bobo35boo3bo5bo$1052bo4boo35boo 6bo$1050boo40b3o4boo3boo$1084bo7boo$1083b3o5bobo$1045boo3boo30b5o11b3o $1046b5o5bo8b3o5b3o5boo3boo9boobo$1047b3o7boo6bobbo3bo3bo5b5o10boo15b 3o$1048bo7boo7bo16b5o11boo14bobbo$1065bo5bo5bo5bobbo12bobo12bo$1066bob obboo3boo5bo3bo11bobboo10bo3bo$1087bo26bo3bo$1084boobo26bo$1071boo13bo 28bobo$1070bobo$1070bo$1070boo11boo3boo8b5o$1051bo22bo8bo5bo7bob3obo$ 1050b3o7boo9bobbo23bo3bo$1050b3o8boo11bo9bo3bo10b3o$1060bo24b3o12bo$ 1048boo3boo$1048boo3boo14booboboo$$1069bo5bo23boo$1053boo44boo$1053bob o14booboo471bo$1055boo15bo13boo17b3o439boo$1054boo30boo19bo438boo$ 1054boo50bo$1050b3o$$1071boo$1071boo$$1050boo3boo$$1051bo3bo58b3o$ 1052b3o59bobbo$1052b3o59bo$1114bo3bo$1114bo3bo$1114bo$1115bobo$1052boo $1052boo10$1087boo$1065boo20boo451bo$1065boo474boo$1135bo404boo$1066bo 68bobo$1065bobo20bo49boo6boo$1060boobbobbo19bobo34boo12boo4bo3bo$1044b oo14boobo22bo3bo33boo12boo3bo5bo8boo$1045bo18boo21b3o45bobo4boobo3bo8b oo$1045bobo8bo28boo3boo43bo7bo5bo$1046boo7boobboo83bo3bo$1054boo90boo$ 1053b3o4boo52b3o19bo$1054boo4boo52bobbo16boo$1028boo15boo8boo29bo27bo 20boo$1028boo15boo9bo6boo21bo27bo3bo$1063boo21bob3o23bo3bo$1114bo$ 1091bo23bobo22boo$1032b3o4bo25bobbo19boboo47boo10bobo$1031bo3bobbobo 24bo22boo51bo8bobbo4bo$1030bo3boo3b3o22bo4bo66boo11boo5boo$1031b3obo5b oo20bobobboo66bobo8boo3bo8boo$1032bo7bobo18boobo18boo3boo49bo9boo10boo $1035bo5bo41boo3boo46bobbo10bobbo$1084b5o7bo42bo11bobo$1061bobbo20bobo 9bo31boo5bobo$1063boo30b3o23bo6bobo5boo$1085b3o31boo7bo$1120boo5boo$$ 1033bo5bo17b3o49boo16boo$1032bobo7bo13bo3bo22bo11bobo10bobo17bo$1032b oo5bob3o11bo5bo20b3o9boo13bo18bobo8boo393bo$1033b3o3boo3bo10booboboo 19bo3bo7b3obo26boo3boo8boo394boo$1034bobobbo3bo5boo32bo9b3o27boo11boo 10bo4bo380boo$1035bo4b3o6bobo28bo5bo8bo29bo9b3o10bo4bobo$1050b3o5bo21b o5bo49boo10bo7boo4boo$1051boo4bobo21bo3bo53boobboo11boo4boo$1048boo7bo bo22b3o54boobbobboo8boo$1028boo18b3o7bo52boo31b4o5bobo$1028boo57boo21b obbo31bo7bo$1058boo28boo21boo$1039bo9boo7boo27bo13bo9bo$1036bobo10boo 48bobo18boo$1035boobo58boo21bobo$1036boo4bo54boo23bo$1039b5o53boo23boo $1038b3obbo49boo4bobo$1037bo3boo42bo6bobo6bo37boo9boo$1038boboo42b3o5b o45boo9bobo$1040boo42b3o4boo40bo6bo7b3o4boob3o$1132bobo12b3o4bobb4o$ 1082boo3boo20boo3boo9boo3boo3bo12b3o4boo$1082boo3boo36boo3boo3bo13bobo $1049boo59bo3bo15boo3bo14boo$1043boo3bobo60b3o18bobo$1043boobb3o35bo 25b3o19bo$1047boo35bobo$1050boo31boo$1049b3o31boo$1083b3o$1084bobo25b oo$1049boo34boo25boo$1049boo11$1528bo$1529boo$1528boo34$1522bo$1523boo $1522boo79$1752bo$1753boo$1752boo29$1750bo$1751boo$1750boo28$1744bo$ 1745boo$1744boo30$1738bo$1739boo$1738boo40$1732bo$1733boo$1732boo34$ 1726bo$1727boo$1726boo79$1956bo$1957boo$1956boo29$1954bo$1955boo$1954b oo28$1948bo$1949boo$1948boo30$1942bo$1943boo$1942boo40$1936bo$1937boo$ 1936boo34$1930bo$1931boo$1930boo79$2160bo$2161boo$2160boo29$2158bo$ 2159boo$2158boo28$2152bo$2153boo$2152boo30$2146bo$2147boo$2146boo40$ 2140bo$2141boo$2140boo34$2134bo$2135boo$2134boo71$2358boo$2358boo33$ 2359boo$2359boo13$2358boo$2358boo20$2356bo$2357boo$2356boo6$2355b3o$ 2357bo$2356bo3$2359boo$2359boo13$2358boo$2358boo4$2350bo$2351boo$2350b oo14$2349b3o$2351bo6boo$2350bo6bobbo$2357bobbo$2358boo9$2359boo$2359b oo12$2344bo$2345boo11boo$2164b3o177boo12boo$2166bo$2165bo7$2356boo$ 2355bobbo$2355bobbo$2356boo9$2358boo$2357bobbo$2357bobbo$2358boo9$ 2359boo$2338bo6b3o11boo$2339boo6bo$2338boo6bo$2162b3o$2164bo$2163bo8$ 2358boo$2358boo10$2357boo$2356bobo$2356boo9$2358boo$2358bobo$2359boo 10$2359boo$2359boo6$2151b3o$2153bo$2152bo$$2341b3o$2343bo$2342bo11$ 2324b3o$2326bo$2325bo11$2307b3o$2309bo$2308bo4$2286bo$2285bobo$2285bob o$2286bo56b3o$2145b3o194bobbo$2147bo197bo$2146bo194bo3bo$2290b3o48bo3b o$2292bo52bo$2291bo50bobo8$2285bo$2284b3o$2284boboo$2285b3o$2285b3o$ 2285b3o$2285boo9$1960b3o325b3o$1962bo325bobbo51b3o$1961bo326bo53bobbo$ 2288bo3bo52bo$2288bo3bo48bo3bo$2288bo52bo3bo$2289bobo53bo$2342bobo8$ 2285bo$2284b3o$2284boboo$2285b3o$2285b3o$2285b3o$2285boo5$2235boo$ 2235bobbo$$2222boo15bo$2222boo64b3o$2237boo49bobbo51b3o$2236bo51bo53bo bbo$2288bo3bo52bo$2141b3o113boo29bo3bo48bo3bo$2143bo89boo3boo17boo29bo 52bo3bo$2142bo90boo3boo49bobo53bo$1958b3o273b5o31boo70bobo$1960bo274bo bo32boo$1959bo262bo$2221b3o11b3o19bo13bo$2220b5o30booboo10bobo$2219boo 3boo44bobo$2220b5o29bo5bo10bo$2220bo3bo$2221bobo30booboboo24bo$2222bo 10bo34booboboo9b3o$2124b3o105bo35bo5bo9boboo$2126bo105b3o20bo13bo3bo 11b3o$2125bo94bo17bo16bobbo11b3o12b3o$2218booboo14b3o15bo29b3o$2227bo 8b5o17boo25boo$2217bo5bo4bo6boo3boo17bo$2226b3o28bobo$2217booboboo33b oo$$2237b3o29bo$2237b3o12boo3boo9bo$2252bo5bo9b3o$2240boo$2107b3o130bo 12bo3bo30b3o$2109bo131b3o10b3o31bobbo51b3o$2108bo134bo44bo53bobbo$ 2220boo49b5o12bo3bo52bo$2220boo48bob3obo11bo3bo48bo3bo$2271bo3bo12bo 52bo3bo$2086bo155bo29b3o14bobo53bo$2085bobo155bo8boo19bo68bobo$2085bob o153b3o9bo$2086bo56b3o86boo16b3o$2142bobbo86boo16bo$2145bo108bo17boo$ 2141bo3bo107bo18boo$2090b3o48bo3bo107b3o$2092bo52bo$2091bo50bobo140bo$ 2240bo43b3o$2240b3o17boo22boboo$2243bo16boo23b3o$2242boo41b3o$2285b3o$ 2257bo27boo$2258bo$2085bo170b3o$2084b3o$2084boboo$2085b3o$2085b3o$ 1947b3o135b3o154boo3boo5bobo$1949bo135boo168boo$1948bo294bo3bo7bo32b3o $2244b3o41bobbo51b3o$2244b3o41bo53bobbo$2288bo3bo52bo$2288bo3bo48bo3bo $2242boo44bo52bo3bo$2243bo28bo16bobo53bo$2240b3o12bo17bo68bobo$2088b3o 149bo11b4o15b3o$2088bobbo51b3o98boo5b4o$2088bo53bobbo98boo5bobbo$2088b o3bo52bo105b4o15bo$2088bo3bo48bo3bo106b4o15bo$2088bo52bo3bo109bo13b3o$ 2089bobo53bo115b3o$2142bobo115bo3bo20bo$2260bo3bo19b3o$2261b3o20boboo$ 2285b3o$2285b3o$2285b3o$2285boo$2261b3o$2085bo174bo3bo$2084b3o173bo3bo $2084boboo173b3o$2085b3o$2085b3o$2085b3o$2085boo$2288b3o6boo$2288bobbo 6bo44b3o$2288bo9bobo8bo32bobbo$2288bo3bo6boo8bobo33bo$2288bo3bo19boo6b oo19bo3bo$2288bo8bo14boo4bo3bo18bo3bo$2289bobo4boo14boo3bo5bo21bo8boo$ 2296bobo10bobo4boobo3bo8boo8bobo9boo$1941b3o144b3o218bo7bo5bo8boo$ 1943bo144bobbo51b3o172bo3bo31bo$1942bo145bo53bobbo174boo31bobo$2088bo 3bo52bo164bo42bobbobboo$2088bo3bo48bo3bo162boo47boboo14boo$2088bo52bo 3bo163boo44boo18bo$2089bobo53bo220boo5bobo$2142bobo160boo57bobbo5boo$ 2305boo56bo$2363bo$2319bo43bo$2312boobo3b4o41bobbo6boo15boo$2306boobb oobobo4b4o5boo35boo6boo15boo$1924b3o378bobobbooboboo3bobbo5boo$1926bo 368boo7b3o8boo3b4o$1925bo159bo209boo6b3o8boo3b4o$2084b3o217b3o12bo32bo bbo$2084boboo217bobo47bo$2085b3o173boo43boo43bo4bo32bo$2085b3o173boo 88boobbobo30bobo$2085b3o268boboo5boo21bobo$2085boo220bo57boo22bo$2288b 3o14bobo75boobo$2288bobbo12bobo17bo18b3o10bobbobboo17boobooboo$2288bo 9boo3bobbo16boo17bobbo10boo21b4obobboo$2288bo3bo5boo4bobo15boo4boobboo 11bo32boobbob4o$1907b3o378bo3bo12bobo13b3o4boobboo7bo3bo32boobooboo$ 1909bo378bo18bo4bobo7boo4boo11bo3bo34boboo$1756b3o149bo380bobo20boo9b oo20bo13boo3boo11bo$1758bo554bo10bo17bobo14boo3boo10bobo$1757bo330b3o 169b5o111bobo$2088bobbo51b3o113bob3obo95b3o13bo$1886bo201bo53bobbo114b o3bo45boo49b3o6boo$1885bobo200bo3bo52bo115b3o45boo51bo7boo$1885bobo 200bo3bo48bo3bo116bo43bo4bo$1886bo56b3o142bo52bo3bo158boo$1942bobbo 143bobo53bo159boo62boobo$1945bo196bobo180bo44bobo18boo$1941bo3bo314bo 57boobo3b4o42bo19boo$1890b3o48bo3bo314bo51boobboobobo4b4o31boo7boo4boo $1892bo52bo313bobo5bo43bobobbooboboo3bobbo5boo24boo7boo4boo$1891bo50bo bo313booboobbobo42b3o8boo3b4o5boo33boo$2257bo5bobboo41b3o8boo3b4o$ 2260bo49b3o12bo$2035boo220boo3boo39boo6bobo66boo$2035boo48bo216bobo7b oo66bo$2084b3o215bo78bobo$2022boo60boboo186bo26boo81bo$2022boo61b3o 187bo100bo4bobbo$1885bo199b3o185b3o7boo5boobboo5boo74bo4bo$1884b3o198b 3o194bobo5bobo3bo5bo72bobo6bo$1884boboo197boo196bo6bo4bo6bobo6boo63boo 3boobo$1885b3o169boo232bo11boo6b3o56boo9booboo$1885b3o169boo233bo20boo bo8bo17b3o24boo9bo3bo$1885b3o134bo290bobbo6bobo16bobbo$1885boo134b3o 46boo185bo7boo46boobo5bobo11boo7bo$2021b3o10b5o18bo12boo184b3o7boo17b 3o23b3o7bobbo11boo3bo3bo23boboo$2033bob3obo16b3o196b5o5bo18bobbo23boo 9bobo16bo3bo23bobo$2019boo3boo8bo3bo16bo3bo194boo3boo22boo6bo31bobo19b o24bo$2019boo3boo9b3o19bo226boobobb3o22bo9bo16bobo25boo$2036bo17bo5bo 11boo14b3o193boobb3oboo19boo55boo$2054bo5bo27bobbo51b3o113boo16bo8b5ob oo20boo54boo$2021boo32bo3bo28bo53bobbo115bo15bobo7b5ob3o$2021bobo32b3o 29bo3bo52bo112bo19bobo7b3o3bobo12boo$1888b3o129bobboo13bo49bo3bo48bo3b o112bobbo16bobbo14bo11boo$1754b3o131bobbo51b3o76boo14bo29boo3boo13bo 52bo3bo111booboo16bobo5bo9boo12bo$1756bo131bo53bobbo76boo7bo5bobo29b5o 15bobo53bo112boo7boo8bobo5bobo$1755bo132bo3bo52bo77bo7bobobbooboo28boo boo68bobo121bobo8bo6bo3bo33boo$1888bo3bo48bo3bo85boobbo5bo17bo9booboo 192bo18b3o34bobbo$1888bo52bo3bo71bo5bo14bo31b3o183boo3boobboo16boo3boo 22bo3b3o7bo6boo$1889bobo53bo71bo5bo11boo3boo214boo3boo48b5o3bo6bo6boo$ 1942bobo73bo3bo4boo30bo197b5o37boo9booboo3bo7bo$2019b3o5boo28bobo198bo bo38boo8b3oboo3bo3bobbo$2058boo250boob4o5boo$2258b3o50b4o$2085bo226bo$ 2084b3o$2040boo10boo3boo14bo10boboo$2036bo3bo31b3o10b3o$1885bo151bo3b 3o9bo3bo7boo4b5o9b3o$1884b3o148b3o5bo10b3o8boo3bobobobo8b3o171boo25boo 28boo$1884boboo132boo32b3o13boo3boo8boo172boo25boo28boo$1885b3o132boo$ 1885b3o172bo282b3o15bo$1885b3o171bo13bo268bobbo14bobo$1885boo165boo5b 3o10bobo270bo12boo3bo14boo$2053bo18bobo266bo3bo7boo3boo3bo13bobo$2032b oo16b3o20bo267bo3bo7boo3boo3bo12b3o4boob3o$2032boo16bo21boo271bo14bobo 12b3o4bobb4o$2072boo268bobo16bo6bo7b3o4boo$2072boo14b3o226bo48boo9bobo $2088bobbo51b3o170b3o48boo9boo$2088bo53bobbo169b5o$2051bo36bo3bo52bo 168boo3boo44bo$1888b3o149bo11bo35bo3bo48bo3bo169b5o44boo$1888bobbo51b 3o94b3o7b3o7boo26bo52bo3bo169bo3bo44bobo$1888bo53bobbo97bo16boo27bobo 53bo170bobo$1888bo3bo52bo96boo98bobo172bo41bobo$1888bo3bo48bo3bo413boo $1888bo52bo3bo414bo12bo7bo$1889bobo53bo102bobo264bo56b4o5bobo$1942bobo 104boo262booboo49boobbobboo8boo$2049bo272bo44boobboo11boo4boo$2312bo5b o4bo40boo10bo7boo4boo$2045bo275b3o39b3o10bo4bobo$2044b3o38bo226boobob oo45boo10bo4bo$2043b5o36b3o271boo7boo$2042boo3boo35boboo269bobo7boo$ 2066bo18b3o269bo$1885bo181bo17b3o268boo$1884b3o159bo18b3o17b3o242bo$ 1884boboo158bo38boo241bobo7boo4b3o3bo5boo$1885b3o441boo6bobo4bo5bo6bo$ 1885b3o154boo20bo273bo5b3o10bobo7bo$1885b3o155bo21bo292boo7b4o$1885boo 153b3o9bo10b3o302b4o7bo$1743b3o294bo9b4o258bo8bo46bobbo6bobo$1745bo 298boo3boboboo256b3o7boo17b3o25b4o4boo3bo9boo$1744bo299boobbobbob3o 254b5o5bobo16boobo24b4o5boo3bo9boo$2049boboboo254bobobobo22boobbo3bo 20bo8boo3bo$2050b4o34b3o218boo3boo22b4o4boo30bobo$2052bo8b3o24bobbo51b 3o194bobo3boo31bo$2061b3o24bo53bobbo195boo25bobo$2062bo18bo6bo3bo52bo 168boo17bo6boo26boo$1888b3o171bo19bo5bo3bo48bo3bo168boo16bobo5b3o6boo 13bo4bo$1888bobbo51b3o116bo17b3o5bo52bo3bo170bo14bo3boo12bobo11boo$ 1888bo53bobbo115bobo25bobo53bo168b3o14bo3boo14bo11bobo$1888bo3bo52bo 196bobo167bo18bo3boo3b3o8boo$1888bo3bo48bo3bo133bo232b5o5boo8bobo5b3o$ 1726b3o159bo52bo3bo115bobo16bo232boo6bobo9bo5bo3bo33boo$1728bo160bobo 53bo116bo15b3o240bo16bo5bo25boboo3b3o$1727bo214bobo117bo257boo17bo3bo 22bobbo3bo5boobo5boo$2062bo248boo3boo22b3o22boobbo4bo4bobbo5boo$2061b 3o248b5o37boo8boo5b4o4boobo$2061b3o24bo223booboo37boo7b3o7bo3b3o$2087b oo223booboo47boo11boo$2087bobo223b3o49boo$2366bo$2097boo$1885bo212bo$ 1884b3o211bobo9bo$1884boboo211boo8boo$1709b3o173b3o220boo11boo191boo 25boo$1711bo173b3o219b3o7bo3b3o190boo25boo$1710bo174b3o220boo5b4o4boob o27boo$1885boo222boobbo4bo4bobbo5boo20boo$2110bobbo3bo5boobo5boo$2114b oboo3b3o30bo$1688bo432boo30bobo$1687bobo413bo49bobbobboo$1687bobo398b 3o11boo53boboo14boo$1688bo56b3o340bobbo10bobobbobo33b3o9boo18bo$1744bo bbo340bo18boo33bobbo19bo7bobo$1747bo340bo3bo15bo36bo17bobo7boo$1743bo 3bo140b3o197bo3bo48bo3bo15boo$1692b3o48bo3bo140bobbo51b3o142bo52bo3bo 15boo$1694bo52bo140bo53bobbo143bobo30bo22bo15boo$1693bo50bobo141bo3bo 52bo163boobboo6b4o17bobo18bobo8boo15boo$1888bo3bo48bo3bo158bobobbob4o 5boobobo3boo34bo8boo15boo$1888bo52bo3bo156bo3bo3boboo5b3obobbobboo$ 1889bobo53bo149boo5bo12bo4boobobo$1942bobo150boo4bo4bo14b4o$2102bo19bo 29bobbo22boo3bo$2102bo3bo48bo22bobb4o$2061boo41bobo44bo4bo23b6o$1687bo 373boo88boobbobo21bobbo3bo$1686b3o467boboo5boo12b3o4boo$1686boboo417b oo56boo13bobo$1687b3o417bobo70boo$1687b3o195bo216boo6bo11bobo31bobbo$ 1687b3o194b3o211boobobbobbobbo10bobbo31boo11boo$1687boo195boboo210boo bboo6bo9boo10boo35bobo$1885b3o174bo44bobo8boo3bo8boo35bo$1885b3o173b3o 43boo11boo5boo56boo$1885b3o172b5o47bo8bobbo4bo54bobo$1885boo172bobobob o44boo10bobo54boo4b3o$2059boo3boo45boo67bo3bobbo$2159boo3boo15b6o$ 2161b3o6boo10b4obbo$2062bo97bo3bo5boo11bo3boo$1690b3o368bobo24b3o70bob o$1690bobbo51b3o312boobo24bobbo51b3o16bo$1690bo53bobbo312b3o25bo53bobb o23boobo$1690bo3bo52bo311bobbo25bo3bo35bo16bo24bobo18boo$1552b3o135bo 3bo48bo3bo140b3o168b3o26bo3bo22boobboo6b4o10bo3bo25bo19boo$1554bo135bo 52bo3bo140bobbo51b3o112bo3bo25bo21bobobbob4o5boobobo9bo3bo15boo7boo$ 1553bo137bobo53bo87boo51bo53bobbo111bo5bo25bobo16bo3bo3boboo5b3obobbo bboo8bo15boo7boo8b3o$1744bobo88boo51bo3bo52bo112bo3bo5bo39bo12bo4boobo bo3boo5bobo25boo11boo$1888bo3bo48bo3bo113b3o7bo37bo4bo14b4o48bo3boo$ 1822boo64bo52bo3bo121b3o27bo10bo19bo50boboo$1822boo65bobo53bo149boo6b oo3bo3bo$1942bobo127boo22boo4bobo5bobo66b3o$2072bo29bo76b3o$2072boo27b oo$1822bo13bo20boo210bo3bobo$1687bo133bobo11b3o17bobbo210boboo3bo6boo 16boo$1686b3o131bo3bo9b5o230b3obobo6bobo17bo$1686boboo131b3o9bobobobo 14bo15boo211bo18bobo10bo$1687b3o129boo3boo7boo3boo30boo185bo45boo9bobo 53boo$1687b3o165boo28bo171bo9bo46boobo7boo43boo4boo$1687b3o167bo26b3o 169bobo8boo31boo12booboo6bobo48boo$1687boo147bo47boboo167booboo6bobo 30boo13boobob3o6bo7boo$1835bobo47b3o166bo5bo22bo17bo12bobobbobbobbobbo 7boo31boboo$1820bo14boboo15boo3boo24b3o169bo26bo30bo4boo6bo40bobo$ 1820bo15b3o15boo3boo24b3o166boo3boo21b3o40bobo42bo$1820bob3o11bobbo15b 5o25boo238boo43boo$1837b3o16bobo311boo$1825bo10bo3bo30bo187b3o14boo34b obo55boo$1822boboo9bo5bo14b3o11b3o186boboo12bobo16boo16boo$1822boo6bo 5bo3bo28b5o187boo11bo6boo3bo7bobo16bo$1690b3o136bo7b3o28boo3boo185boo 12bobbobbobbobobo8bo12boo$1690bobbo51b3o81b3o37b5o184bobo13bo6boobbobo 8boo11boo32b3o$1690bo53bobbo69boo3boo45bo3bo182boobbo6boo6bobo8bo55bo bbo$1690bo3bo52bo69boo3boo46bobo193bobo7boo38bo7bo20bo$1690bo3bo48bo3b o70b5o7bo29bo10bo16b3o175bo48b4o5bobo14bo3bo$1690bo52bo3bo71bobo9bo29b o26bobbo51b3o119boo16booboboo20boobbobboo8boo4boo6bo3bo$1691bobo53bo 81b3o27b3o26bo53bobbo137bo5bo20boobboo11boo4boo10bo$1744bobo72b3o33bo 17bo14bo3bo52bo138bo3bo10boo6boo10bo7boo13bobo$1854b3o14booboo12bo3bo 48bo3bo111b5o23b3o11boo5b3o10bo4bobo$1840boo11b5o8bo21bo52bo3bo110bob 3obo44boo10bo4bo$1840bo11boo3boo6bo4bo5bo12bobo53bo111bo3bo48boo$1550b 3o288b3o21b3o74bobo113b3o49boo$1552bo290bo26booboboo182bo$1551bo268boo $1820boo32b3o$1687bo166b3o$1686b3o370boo25boo28boo$1686boboo162boo205b oo25boo28boo$1687b3o163bo$1687b3o142boo11bo4b3o32bo276boo$1687b3o142b oo12bo3bo33b3o275bobbo$1687boo155b3o25boo10boboo266b5o7bo9bobo$1872boo 11b3o265bo5bo6bo7bo3bo$1885b3o229bo35bo3boo7bo7bo12boo$1533b3o315bo33b 3o228b3o35bo7bobbo7bo4bo8boo$1535bo314bo34boo229b3o43boo10bo$1534bo 305bo9b3o321bo3bo$1840b3o17boo252boo3boo44bobo8bobo$1843bo16boo252boo 3boo44boo$1842boo322bo$1690b3o$1690bobbo51b3o368boo25b3o$1690bo53bobbo 368bobo23bobbo$1690bo3bo52bo97bo269bobboo25bo$1690bo3bo48bo3bo97bo14bo 27b3o226boo22bo3bo$1690bo52bo3bo96bobo14bo26bobbo51b3o171boo22bo3bo25b o10bo$1691bobo53bo95booboo11b3o26bo53bobbo172bo26bo24boo9boo$1516b3o 225bobo95bo5bo39bo3bo52bo196bobo20bo4bobo7boo4boo$1518bo326bo42bo3bo 48bo3bo166bo5bo44bobo13b3o4boobboo$1517bo324boo3boo39bo52bo3bo166bo5bo 43bobo15boo4boobboo$1889bobo53bo167bo3bo6bo36bobbo16boo$1857bobo82bobo 169b3o5bobo37bobo17bo$1858boo263boo25bobo5boo3bobo$1495bo362bo268bo22b oo5bobo5bo$1494bobo629bobbo21bo5bo$1494bobo190bo154boo281bo3bo26boo$ 1495bo56b3o131b3o154bo280b3o$1551bobbo131boboo150b3o10boo268boobobobo 7boo16boo$1554bo132b3o150bo12boo268booboo9bobo17bo$1550bo3bo132b3o154b oo3bo6boo17bo9bo239bo12bo18bobo10bo$1499b3o48bo3bo132b3o154bobo3bo5b3o 17bo7b3o225bo45boo9b4o$1501bo52bo132boo156b5o6boo16b3o7boboo222booboo 7boo31bo12boob4o5boo$1500bo50bobo292b3o4boo30b3o235boo29boo11b3oboo3bo 3bobbo$1853boo30b3o221bo5bo6bo31bobo11booboo3bo7bo6boo$1873bo11b3o281b 5o3bo6bo6boo$1862bo11bo10boo222booboboo23bo30bo3b3o7bo$1861b3o8b3o262b obo40bobbo$1860booboo273boo40boo$1859b3ob3o249boo$1859b3ob3o248bobo14b oo35bo$1494bo195b3o166b3ob3o249bo13bobbo16boo15boo$1493b3o194bobbo51b 3o111b3ob3o248boo12bo7b6o7bobo14b3o$1493boboo193bo53bobbo112booboo249b 3o11bo6bo6bo8bo12b3o$1494b3o193bo3bo52bo113b3o251boo11bo7boo4bo8boo11b oo$1494b3o193bo3bo48bo3bo114bo25b3o222bo8boo5bobbo7boo$1494b3o193bo52b o3bo140bobbo51b3o175bobo7boo37boo9bo$1494boo195bobo53bo140bo53bobbo 175bo47b4o7bobo$1744bobo141bo3bo52bo174boo16boo3boo19bobobbobb3o5boobo 4boo$1888bo3bo48bo3bo168bo23bo5bo18bobbobboo9booboo3boo$1888bo52bo3bo 167b3o38boo6boo9bo6boobo$1889bobo5boo46bo166b5o22bo3bo10boo4boo3bo8bo 5bobo$1898bo43bobo166boo3boo22b3o19boo10bo6bo$1894bo3bobo7bobo201b5o 46bobbo$1893boo4boo6bobbo201bo3bo47bobo$1893bobo10boo10bo6bo187bobo$ 1497b3o187bo216boo3bo8bo5bobo187bo$1497bobbo51b3o131b3o217boo9bo6boobo 26boo$1497bo53bobbo131boboo217bobbobboo9booboo3boo20boo$1497bo3bo52bo 132b3o218bobobbobb3o5boobo4boo180boo25boo$1497bo3bo48bo3bo132b3o223b4o 7bobo27bo159boo25boo$1497bo52bo3bo132b3o224boo9bo27bobo$1498bobo53bo 132boo264bobbobboo$1551bobo403boboo14boo$1955boo18bo$1964bo8bobo$1960b oobboo7boo$1965boo$1909bo49boo4b3o$1908boo10boo37boo4boo23boo$1908bobo 9boo42boo8boo13bobbo$1494bo195b3o210boo12boo6bo3boo33bo9boo14bobo$ 1493b3o194bobbo51b3o153bo3bo10b3o5bo3bobo55bo4bo$1493boboo193bo53bobbo 147boo3bo5bo10boo6b5o55b3o$1494b3o193bo3bo52bo147boobboobo3bo13boo4b3o 55bo$1494b3o193bo3bo48bo3bo140b3o9bo5bo13boo30bobbo29boo$1494b3o193bo 52bo3bo140bobbo9bo3bo37b3o9bo$1494boo195bobo53bo113boo25bo14boo37bobbo 5bo4bo20bo$1744bobo114boo25bo3bo52bo5boobbobo18bobo$1888bo3bo48bo3bo 10boboo16bobo$1888bo19bo32bo3bo31bo$1889bobo11bo4b4o33bo37bo$1903bo5b 4o7bo21bobo11bobbo22boo$1862bo35boo9bobbo6bobo34boo24bobo$1860booboo 33boo9b4o4boo3bo9boo48bobo$1908b4o5boo3bo9boo49boo$1497b3o187bo171bo5b o42bo8boo3bo60bo$1497bobbo51b3o131b3o230bobo39b3o25bo$1497bo53bobbo 131boboo169booboboo54bo39bo3bo23bobo$1497bo3bo52bo132b3o269bo5bo22bobo $1497bo3bo48bo3bo132b3o218boo49booboboo23bo$1497bo52bo3bo132b3o170bo 47boo60boo$1498bobo53bo132boo171bobbo106boo$1551bobo306bo101bo18boo$ 1863boo96bobo17bo$1864bo50bo45bobo5boobo$1862bobo38bo10boo10boo34bo7bo bo18boo$1862boo37boo11bobo9boo4b3o36bo7b3o9boo$1902boo5boo12boo6b5o25b oo7boo7bobo$1907bo3bo10b3o5bo3bobo24boo7boo3b5oboo$1857boo3boo42bo5bo 10boo6bo3boo33boo5b3oboo$1494bo195b3o164bo5bo41bobbo3bo13boo49b3o$ 1493b3o194bobbo51b3o122bo41bo13boo50boo$1493boboo193bo53bobbo110bo3bo 5bobo32bo3bo3bo$1494b3o193bo3bo52bo111b3o7boo31boboo3boo$1494b3o193bo 3bo48bo3bo140b3o11bo$1494b3o193bo52bo3bo140bobbo9boo40b3o$1494boo195bo bo53bo140bo53bobbo$1744bobo136bo4bo3bo8boo42bo35bo$1877bo4bobo3bo3bo9b o38bo3bo32boboo$1856b3o19bo4bo4bo13bobo8boo26bo3bo33boo$1348b3o505b3o 9boo6b3o10bobo11boo7bobo30bo24boo$1350bo504bo3bo9boo40b3o12bo15bobo25b oo4boo$1349bo504bo5bo7bo41b3o8boo3b4o46boo$1855bo3bo51b3o8boo3b4o5boo$ 1856b3o53bobobbooboboo3bobbo5boo31boboo$1497b3o187bo225boobboobobo4b4o 38bobo$1497bobbo51b3o131b3o230boobo3b4o40bo$1497bo53bobbo131boboo171bo 64bo43boo$1497bo3bo52bo132b3o171boo43boo62boo$1497bo3bo48bo3bo132b3o 170bobo13bo28boo63boo$1497bo52bo3bo82boo48b3o183b4o17boo11bo4bo$1498bo bo53bo82boo48boo183b4o6bo11bobo13boo$1551bobo318bobbo6bo13bo14boo$ 1331b3o290boo246b4o20boo$1333bo290boo241boo4b4o$1332bo533bobo7bo37bo 10bo$1624bo13bo220bo6bo46boo9boo$1623bobo10booboo217b3o4boo41bo4bobo7b oo4boobboo$1623bobo33boo196b5o21boo3boo16bobo13b3o4boobboo$1624bo10bo 5bo17boo195bobobobo21b5o10boo4bobo15boo4boo$1494bo195b3o163boo3boo21b ooboo10boo3bobbo16boo$1493b3o139booboboo30boo16bobbo51b3o136booboo16bo bo17bo$1493boboo124booboboo44boo16bo53bobbo137b3o18bobo$1494b3o124bo5b o62bo3bo52bo111bo48bo$1494b3o125bo3bo13bo49bo3bo48bo3bo110bobo$1494b3o 126b3o11bobbo49bo52bo3bo110bobo82b3o$1314b3o177boo144bo50bobo53bo111bo 82bobbo$1316bo319boo106bobo112boo84bo$1315bo320bo36bo185boo25boo28boo 23bo3bo$1636bobo33b3o184boo25boo28boo23bo3bo$1637boo18b5o10b3o270bo$ 1656bob3obo279bobo19bo$1293bo332bo30bo3bo8boo3boo287bobo$1292bobo332bo 9boo3boo14b3o9boo3boo240bo49boo6boo$1292bobo330b3o9bo5bo15bo256bobo34b oo12boo4bo3bo$1293bo56b3o144b3o187bo227bo3bo33boo12boo3bo5bo8boo$1349b obbo144bobbo51b3o83bo3bo30boo11b3o227b3o45bobo4boobo3bo8boo$1352bo144b o53bobbo84b3o30bobo11boboo224boo3boo43bo7bo5bo$1348bo3bo144bo3bo52bo 102bo13boobbo11b3o283bo3bo$1297b3o48bo3bo144bo3bo48bo3bo65b5o32bo14boo 13b3o285boo$1299bo52bo144bo52bo3bo64bob3obo30bobo5bo7boo13b3o$1298bo 50bobo146bobo53bo65bo3bo30booboobbobo7bo14boo274boo$1551bobo67b3o30bo 5bobboo250bo47boo$1622bo19boo13bo14bo5bo236bo$1642bo11boo3boo11bo5bo 236bob3o$1643b3o21boo4bo3bo$1645bo21boo5b3o243bo48boo$1622boo17bo275bo boo47boo10bobo$1622boo18bo274boo37bobo11bo8bobbo4bo$1292bo347b3o313boo 7boo11boo5boo$1291b3o200bo195b3o264bo7bobo8boo3bo8boo$1291boboo198b3o 158boo34bobbo51b3o164boo3boo49bo9boo10boo$1292b3o198boboo158bo3bo30bo 53bobbo164boo3boo46bobbo10bobbo$1292b3o199b3o137boo16b3o3bo31bo3bo52bo 165b5o7bo42bo11bobo$1292b3o199b3o137boo16bo5b3o29bo3bo48bo3bo166bobo9b o31boo5bobo$1292boo200b3o177boo14bo52bo3bo176b3o16b3o11bobo5boo$1494b oo178boo15bobo53bo166b3o25bobbo11bo$1744bobo198bo10boo$1941bo3bo$1938b obbo3bo10boo$1642bo269bo24bobo5bo11bo$1642b3o17boo247b3o10bo8bo4bo3bob o12bobo8boo$1645bo10bo5boo246bo3bo9boo5bobo24boo8boo$1644boo11bo254bo 10bobo6boo31boo10bo4bo$1295b3o357b3o251bo5bo48b3o10bo4bobo$1295bobbo 51b3o144b3o187bo221bo5bo49boo10bo7boo4boo$1295bo53bobbo144bobbo51b3o 91b3o37b3o221bo3bo53boobboo11boo4boo$1295bo3bo52bo144bo53bobbo91b3o37b oboo221b3o54boobbobboo8boo$1295bo3bo48bo3bo144bo3bo52bo90bo3bo37b3o 283b4o5bobo$1295bo52bo3bo144bo3bo48bo3bo89bo5bobbobo31b3o226boo43bo12b o7bo$1296bobo53bo144bo52bo3bo90bo3bo4boo31b3o227boo41boo$1349bobo146bo bo53bo91b3o5bo32boo227bo13bo29bobo$1551bobo374bobo18boo$1926boo21bobo 13bobo$1926boo23bo13boo$1926boo23boo13bo$1922boo4bobo$1671bo242bo6bobo 6bo37boo9boo$1672bo240b3o5bo45boo9bobo$1292bo351boo24b3o240b3o4boo40bo 6bo7b3o4boob3o$1291b3o200bo150bo44b3o268bobo12b3o4bobb4o$1291boboo198b 3o146b3o13bo31bobbo51b3o163boo3boo20boo3boo9boo3boo3bo12b3o4boo$1292b 3o198boboo145bo15bobo8bo20bo53bobbo163boo3boo36boo3boo3bo13bobo$1292b 3o199b3o149boo11bobo8bo19bo3bo52bo191bo3bo15boo3bo14boo$1292b3o199b3o 149boo11bobbo5b3o19bo3bo48bo3bo192b3o18bobo$1292boo200b3o162bobo28bo 52bo3bo166bo25b3o19bo$1494boo162bobo3bo26bobo53bo165bobo$1658bo5bo79bo bo165boo$1663b3o246boo$1912b3o$1913bobo25boo$1663b3o248boo25boo$1664bo 21bo$1664bo22bo$1295b3o366bo20b3o$1295bobbo51b3o144b3o164bo$1295bo53bo bbo144bobbo51b3o108b3o$1295bo3bo52bo144bo53bobbo132bo$1295bo3bo48bo3bo 144bo3bo52bo131boo$1295bo52bo3bo144bo3bo48bo3bo108b3o17boo3bo$1296bobo 53bo144bo52bo3bo109bo19b3o$1349bobo146bobo53bo109bo$1551bobo$$1699boo$ 1700bo$1700bobo5bo$1701boo4bobo$1705boo3bo14boo$1292bo412boo3bo13bobo$ 1291b3o200bo195b3o12boo3bo12b3o4boo24boo$1291boboo198b3o194bobbo13bobo 12b3o4bobb4o9b3o8boo$1292b3o198boboo193bo11bo5bo6bo7b3o4boob3o8bobbo$ 1292b3o199b3o193bo3bo6boo10boo9bobo20bo8bo$1292b3o199b3o193bo3bo6bobo 10boo9boo16bo3bo7bobo$1292boo200b3o193bo52bo3bo7bobbobboo$1494boo195bo bo53bo11boboo14boo$1744bobo10boo18bo$1766bobo6bobo$1707boo57bobbo5boo$ 1707boo60boo$1767bo3boo$1720bo48boo$1718bobo45bobbo6boo15boo$1295b3o 408boo9bobo11boo26boo5bobo7boo15boo$1295bobbo51b3o144b3o206b3o7bobbo 11boo26bobo$1295bo53bobbo144bobbo51b3o142boo9boobo5bobo39bo$1295bo3bo 52bo144bo53bobbo142bo5bo4bobbo6bobo$1295bo3bo48bo3bo144bo3bo52bo147bo 5boobo8bo33bobbo$1295bo52bo3bo144bo3bo48bo3bo143bo3bo3b3o48bo$1296bobo 53bo144bo52bo3bo108boo35bo5boo45bo4bo32bo$1349bobo146bobo53bo108boo88b oobbobo30bobo$1551bobo204boboo28bobo$1713bo77bo$1664bo47b4o69boobo$ 1663b3o45boob4o5boo33bobbo21boobooboo$1662bo3bo33boo8b3oboo3bo3bobbo 31boo21b4obobboo$1664bo35boo9booboo3bo7bo6boo44boobbob4o$1661bo5bo44b 5o3bo6bo6boo27b3o14boobooboo$1292bo368bo5bo45bo3b3o7bo34booboo15boboo$ 1291b3o200bo167bo3bo23b3o30bobbo35booboo12bo$1291boboo198b3o167b3o24bo bbo29boo20b3o14b5o11bobo$1292b3o198boboo193bo53bobbo13boo3boo10bobo$ 1292b3o199b3o193bo3bo16bo35bo31bo$1292b3o199b3o193bo3bo14boo32bo3bo24b oo$1292boo200b3o193bo19boo31bo3bo24boo$1494boo170bo24bobo53bo$1715boo 27bobo18boo$1714boo55boobo$1666bo49bo9bo45bobo18boo$1664bobo57bobo46bo 19boo$1665boo45boo9bobo37boo7boo4boo$1712b3o7bobbo11boo24boo7boo4boo$ 1714boobo5bobo11boo33boo$1295b3o416bobbo6bobo$1295bobbo51b3o144b3o159b oo3boo48boobo8bo$1295bo53bobbo144bobbo51b3o118bo31boo5b3o67boo$1295bo 3bo52bo144bo53bobbo105bo3bo9bo29bobo5boo68bo$1295bo3bo48bo3bo144bo3bo 52bo106b3o8b3o21bo7bo78bobo$1295bo52bo3bo144bo3bo48bo3bo106b3o30boo7b oo81bo$1296bobo53bo144bo52bo3bo140boo81bo4bobbo$1349bobo146bobo53bo 104bo11bo13boo16boo74bo4bo$1551bobo104bobo11bo11bobo17bo72bobo6bo$ 1444boo212bobo10bo13bo13boo3bobo6bobo62boo3boobo$1444boo213bo38boo5boo 4bo3bo56boo9booboo$1700bo10bo19bo40boo9bo3bo$1431boo277bo4bo14b4o$ 1431boo12bo210boo3boo48bo12bo4boobobo3boo$1444b3o209bo5bo48bo3bo3boboo 5b3obobbobboo31boboo$1292bo150bo3bo265bobobbob4o5boobobo36bobo$1291b3o 151bo48bo162bo3bobboo21boo29boobboo6b4o38bo$1291boboo134boo11bo5bo17b oo25b3o162b3o4boo18boobbo41bo13b3o24boo$1292b3o147bo5bo17boo25boboo 167bo20booboo54bobbo24boo$1292b3o148bo3bo46b3o178bo10b3o58bo24boo$ 1292b3o149b3o32boo13b3o176b4o19boo45bo3bo$1292boo185boo13b3o175boboboo 18bobo44bo3bo$1428boo3boo59boo175bobbob3o19bo48bo$1429b5o237booboboo 20boo44bobo$1429booboo227bo7b3ob4o37boo$1429booboo9bo22bo13bo178booboo 4bobo4bo37boo10bobo$1430b3o32b3o11bobo186bo46bo8bobbo$1464b5o9bo3bo 175bo5bobboo41boo11boo10boo$1443bo19bobobobo9b3o206bo21bobo8boo3bo8boo $1443bobo17boo3boo7boo3boo174booboboo22b3o11boobboo6bo9boo5boo$1295b3o 145boo241b5o10boobobbobbobbo10bobbo4bo$1295bobbo51b3o144b3o185boo3boo 13boo6bo11bobo$1295bo53bobbo113bo30bobbo51b3o131b5o19bobo$1295bo3bo52b o112bobo29bo53bobbo131bo3bo19boo$1295bo3bo48bo3bo76bo14boo3boo13boobo 14bo14bo3bo52bo132bobo$1295bo52bo3bo75b3o33b3o15bo14bo3bo48bo3bo133bo$ 1296bobo53bo74b5o4boo7bo3bo13bobbo11b3obo14bo52bo3bo$1349bobo74bobobob o3boo8b3o14b3o32bobo53bo$1426boo3boo13b3o13bo3bo10bo73bobo107boo25boo 28boo$1461bo5bo9boobo180boo25boo28boo$1442bo19bo3bo5bo6boo$1429bo13bo 19b3o7bo245bo47bo$1428bobo10b3o5boo20b3o244bobo45boo$1428bobo18bo29boo 3boo232bobo44boo11boo$1429bo20b3o26boo3boo233bo35boo7b3o7bo3b3o$1292bo 136boo21bo19bo7b5o270boo8boo5b4o4boobo5boo$1291b3o135boo40bo9bobo10bo 271boobbo4bo4bobbo5boo$1291boboo134boo40b3o19b3o220booboboo22b3o19bobb o3bo5boobo$1292b3o186b3o9boboo219bo5bo21bobbo23boboo3b3o$1292b3o199b3o 220bo3bo25bo30boo$1292b3o166boo31b3o221b3o22bo3bo$1292boo168bo31b3o 246bo3bo$1441boo16b3o32boo251bo16bobo$1441boo16bo284bobo17boo$1481boo 282bo4bo$1457bo23boo286boo$1458bo310bobo$1456b3o262bo58bo$1722bo56bobo $1449bo270b3o45bo8boo3bo$1295b3o151b3o5bo11boo297b4o5boo3bo9boo$1295bo bbo51b3o99bo3bo12boo26b3o269b4o4boo3bo9boo$1295bo53bobbo98boo3b3o38bo bbo51b3o214bobbo6bobo$1295bo3bo52bo144bo53bobbo214b4o7bo$1295bo3bo48bo 3bo102bo41bo3bo52bo160b5o40boo6b4o$1295bo52bo3bo102bo41bo3bo48bo3bo 159bob3obo8bo29bobo6bo$1296bobo53bo101bo42bo52bo3bo160bo3bo7bobo29bo$ 1349bobo146bobo53bo161b3o9boo19bobo6boo$1551bobo163bo31boo$1451boo3boo 256bo25boo8bo7boo$1451bo5bo14bo240bobo23bobo12bo4bo$1473bo239bobo24bo 12boo4bobo6bo$1452bo3bo14b3o240bo38bobo4boo4bobo$1453b3o309bobo17bo$ 1764bobbo16boo$1292bo418boo3boo47bobo15boo4boobboo$1291b3o200bo216boo 3boo48bobo13b3o4boobboo$1291boboo174bobo21b3o216b5o3bo21bo25bo4bobo7b oo4boo$1292b3o156boo17boo21boboo216bobo4boo19b3o29boo9boo$1292b3o157bo 17bo23b3o222bobo19boobo29bo10bo$1292b3o154b3o12boo28b3o216b3o24boobboo $1292boo155bo13bobo28b3o234bo9b4o$1453boo7bo6boo23boo235boo8b3o7boo$ 1453boo7bobbo3bobo255boo3boo17bobo$1462bo6bobo260b3o18bo$1463bobo21bo 228bo15boo19boo14bo$1464boo22bo226bobo6boo5boo35boo$1486b3o225bo3bo4bo bo5bo36bobo8bobo$1471bo243b3o5bo53bo3bo$1471bo241boo3boobboo19bo21boo 10bo12boo$1295b3o172bobo12bo256b3o12bo7bobbo7bo4bo8boo$1295bobbo51b3o 118bo14bo10b3o241b5o10bo3boo7bo7bo$1295bo53bobbo118bo12b3o10bobbo239b oo3boo9bo5bo6bo7bo3bo$1295bo3bo52bo118bo25bo259b5o7bo9bobo$1295bo3bo 48bo3bo118bo25bo3bo263bobbo$1295bo52bo3bo117bobo24bo3bo263boo$1296bobo 53bo118bo25bo244b3o$1349bobo119bo26bobo241b3o3$1716boo25boo$1716boo25b oo$1500bo$1499boo5boo$1499bobo5bo$1292bo214bobo6boo$1291b3o214boo6bobb o$1291boboo225bo9bobo$1292b3o218bo6bo7bo3bo$1292b3o216boo7bo7bo34boo$ 1292b3o221bobbo7bo4bo8boo20boo$1292boo222boo10bo12boo$1528bo3bo30bo$ 1519bobo8bobo29bobo$1519boo41bobbobboo$1520bo45boboo14boo$1564boo18bo$ 1515bo61bo4bobo$1514boo60bobo3boo$1514bobo58bo3boo$1295b3o277bo3boo$ 1295bobbo51b3o144b3o27boo46bo3boo$1295bo53bobbo144bobbo26bobo22b3o21bo bo4boo15boo$1295bo3bo52bo144bo19bo4boo6bo7boo11bobbo22bo5boo15boo$ 1295bo3bo48bo3bo144bo3bo14bobobbobbobbobbo7boo14bo$1295bo52bo3bo144bo 3bobboo10boobob3o6bo19bo3bo$1296bobo53bo144bo6boo10booboo6bobo20bo3bo$ 1349bobo146bobo15boobo7boo25bo6bobbo22boo3bo$1516bobo32bobo10bo22bobb 4o$1470boo45bo42bo4bo23b6o$1470bobbo86boobbobo21bobbo3bo$1565boboo19b 3o4boo$1474bo43boo69bobo$1518boo69boo$1472boo41boo10bo4bo32bobbobbo$ 1292bo178bo35boo5b3o10bo4bobo30boo3bobo5boo$1291b3o213boo6boo10bo7boo 4boo26bo3bo4bobo$1291boboo223boobboo11boo4boo26b5o4bo$1292b3o173boo3b oo43boobbobboo8boo31boo3boo19boo$1292b3o173boo3boo48b4o5bobo34b5o19bob o$1292b3o174b5o50bo7bo37b3o15boo4b3o$1292boo176bobo98bo17bo3bobbo$ 1517boo71b6o$1470b3o44boo60boo10b4obbo$1521bo57boo11bo3boo$1520boo$ 1520bobo$1578boobo$1533boo44bobo18boo$1474bo58bobo44bo19boo$1295b3o 177bo47bo4boo6bo33boo7boo$1295bobbo51b3o120b3o21b3o9bo12bobobbobbobbo bbo7boo24boo7boo8b3o$1295bo53bobbo116bo27bobbo6boo13boobob3o6bo7boo6b 3o24boo11boo$1295bo3bo52bo115b3o26bo10boo12booboo6bobo15bobbo33bo3boo$ 1295bo3bo48bo3bo114b5o25bo3bo20boobo7boo19bo33boboo$1295bo52bo3bo113b oo3boo24bo3bo10boo8bobo25bo3bo$1296bobo53bo144bo13bobo9bo26bo3bo33b3o$ 1349bobo130bo15bobo10bo42bo33b3o$1470bo9bobo27boo39bobo$1470bo9bobo$ 1479bobo10boo16boo$1466bo14boo8bobo17bo$1465bo14bo11bo18bobo5boo$1466b o45boo3bo3bo57boo$1489bo26bo5bo13boo41boo4boo$1292bo197bo24boobo3bo13b oo47boo$1291b3o194b3o25bo5bo10boo6bo3boo$1291boboo178bo43bo3bo10b3o5bo 3bobo31boboo$1292b3o168boo3boo3boo37boo5boo12boo6b5o32bobo$1292b3o177b obo36boo11bobo9boo4b3o34bo$1292b3o169bo3bo44bo10boo10boo41boo$1292boo 171b3o57bo53boo$1465b3o15boo94boo$1483boo18boo$1486boo15bobo$1468bo17b 3o16bo12boo$1242boo223b3o16boo17boo11boo$1242bobbo220bo3bo5boo5boo$ 1468bo6bobo5boo10bo34bo$1229boo15bo218bo5bo3bo18b3o32bobo$1229boo64b3o 167bo5bobboo18b3o21bo8boo3bo9boo$1244boo49bobbo51b3o113bo3bo47b4o5boo 3bo9boo$1243bo51bo53bobbo114b3o22boo3boo9boo9b4o4boo3bo19b3o$1295bo3bo 52bo139boo3boo9boo9bobbo6bobo19bobbo$1264boo29bo3bo48bo3bo160bo5b4o7bo 23bo$1240boo3boo17boo29bo52bo3bo160bo4b4o28bo3bo$1240boo3boo49bobo53bo 142bo22bo31bo3bo$1241b5o31boo70bobo142bobo57bo$1242bobo32boo214boo56bo bo$1229bo263boo$1228b3o11b3o19bo13bo214b3o$1227b5o30booboo10bobo188boo 24bobo28boo$1226boo3boo44bobo188boo25boo28boo$1227b5o29bo5bo10bo$1227b o3bo340bobo$1228bobo30booboboo24bo278bobbo$1229bo10bo34booboboo9b3o 233boo41boo10bo6bo$1239bo35bo5bo9boboo267boo4boo3bo8bo5bobo$1239b3o20b o13bo3bo11b3o267boo6boo9bo6boobo4boo$1227bo17bo16bobbo11b3o12b3o276bo bbobboo9booboo3boo$1225booboo14b3o15bo29b3o277bobobbobb3o5boobo$1234bo 8b5o17boo25boo229boo3boo47b4o7bobo$1224bo5bo4bo6boo3boo17bo257b5o49boo 9bo$1233b3o28bobo257booboo$1224booboboo33boo258booboo43boo$1525b3o44b 3o$1244b3o29bo297b3o$1244b3o12boo3boo9bo298boo$1259bo5bo9b3o298bo$ 1247boo$1247bo12bo3bo30b3o290boo$1248b3o10b3o31bobbo289bobbo$1250bo44b o234bo21b3o23bo3b3o7bo$1227boo49b5o12bo3bo224bo3bobo20bobbo22b5o3bo6bo 6boo$1227boo48bob3obo11bo3bo223b3o3boo23bo7bobo11booboo3bo7bo6boo$ 1278bo3bo12bo226b5o23bo3bo7boo11b3oboo3bo3bobbo$1249bo29b3o14bobo222bo bobobo22bo3bo8bo12boob4o5boo$1250bo8boo19bo240boo3boo26bo12boo8b4o$ 1248b3o9bo290bobo12bobo9bo$1239boo16b3o277bo28bo$1239boo16bo277boboo 26boo$1261bo17boo255b3o$1260bo18boo254bobo9boo16boo$1260b3o273boo8bobo 17bo$1536boo9bo18bobo6boo$1292bo274b3o5bobo$1247bo43b3o275b3o6bo11bobo $1247b3o17boo22boboo250bo23bobbobbobbo10bobbo$1250bo16boo23b3o248bobo 24boo6bo9boo10boo$1249boo41b3o233boo14boo21bo7bobo8boo3bo8boo$1292b3o 234boo35boo7boo11boo5boo$1264bo27boo225b5o4bo37bobo11bo8bobbo4bo$1265b o252bob3obo53boo10bobo$1263b3o253bo3bo55boo$1520b3o15bobo$1521bo16bobb o16boo$1522boo17boo15bobo$1522bobo14bo3boo15bo12boo$1249boo3boo5bobo 258bobo16boo17boo11boo$1262boo259bo7boo5bobbo8bo$1250bo3bo7bo32b3o232b obo5bobo9bo34boo$1251b3o41bobbo51b3o177bo18bobo31bo3bo$1251b3o41bo53bo bbo167booboboobboo17booboo21bo7bo5bo8boo$1295bo3bo52bo167bo5bo20bo5bo 20bobo4boobo3bo8boo$1295bo3bo48bo3bo168bo3bo24bo12boo12boo3bo5bo$1249b oo44bo52bo3bo169b3o22boo3boo9boo12boo4bo3bo$1250bo28bo16bobo53bo224boo 6boo$1247b3o12bo17bo68bobo222bobo$1247bo11b4o15b3o268bo24bo$1251boo5b 4o287bo$1251boo5bobbo286bo$1258b4o15bo$1259b4o15bo$1262bo13b3o244boo 25boo$1268b3o252boo25boo$1267bo3bo20bo$1267bo3bo19b3o$1268b3o20boboo$ 1292b3o$1292b3o$1292b3o$1292boo$1268b3o$1267bo3bo$1267bo3bo$1268b3o5$ 1295b3o6boo$1295bobbo6bo44b3o$1295bo9bobo8bo32bobbo$1295bo3bo6boo8bobo 33bo$1295bo3bo19boo6boo19bo3bo$1295bo8bo14boo4bo3bo18bo3bo$1296bobo4b oo14boo3bo5bo21bo8boo$1303bobo10bobo4boobo3bo8boo8bobo9boo$1316bo7bo5b o8boo$1325bo3bo31bo$1327boo31bobo$1317bo42bobbobboo$1315boo47boboo14b oo$1316boo44boo18bo$1373boo5bobo$1312boo57bobbo5boo$1312boo56bo$1370bo $1326bo43bo26boo$1319boobo3b4o41bobbo6boo13bobbo$1313boobboobobo4b4o5b oo25boo8boo6boo14bobo$1312bobobbooboboo3bobbo5boo25boo28bo4bo$1302boo 7b3o8boo3b4o61b3o$1302boo6b3o8boo3b4o61bo$1311b3o12bo32bobbo29boo$ 1312bobo47bo$1268boo43boo43bo4bo20bo$1268boo88boobbobo18bobo$1363boboo 16bobo$1314bo69bo$1295b3o14bobo75bo$1295bobbo12bobo17bo18b3o10bobbobb oo18boo$1295bo9boo3bobbo16boo17bobbo10boo24bobo$1295bo3bo5boo4bobo15b oo4boobboo11bo36bobo$1295bo3bo12bobo13b3o4boobboo7bo3bo37boo$1295bo18b o4bobo7boo4boo11bo3bo37bo$1296bobo20boo9boo20bo13boo3boo23bo$1320bo10b o17bobo14boo3boo22bobo$1267b5o123bobo$1266bob3obo95b3o25bo$1267bo3bo 45boo49b3o6boo$1268b3o45boo51bo7boo$1269bo43bo4bo69boo$1311boo75bo$ 1312boo62boobo$1332bo44bobo18boo$1267bo57boobo3b4o42bo7b3o9boo$1267bo 51boobboobobo4b4o31boo7boo7bobo$1266bobo5bo43bobobbooboboo3bobbo5boo 24boo7boo3b5oboo$1265booboobbobo42b3o8boo3b4o5boo33boo5b3oboo$1264bo5b obboo41b3o8boo3b4o48b3o$1267bo49b3o12bo52boo$1264boo3boo39boo6bobo$ 1309bobo7boo$1309bo$1281bo26boo$1282bo$1280b3o7boo5boobboo5boo78bo$ 1289bobo5bobo3bo5bo75boboo$1290bo6bo4bo6bobo6boo66boo$1298bo11boo6b3o 56boo$1299bo20boobo8bo17b3o24boo4boo$1320bobbo6bobo16bobbo30boo$1264bo 7boo46boobo5bobo11boo7bo$1263b3o7boo17b3o23b3o7bobbo11boo3bo3bo23boboo $1262b5o5bo18bobbo23boo9bobo16bo3bo23bobo$1261boo3boo22boo6bo31bobo19b o24bo$1291boobobb3o22bo9bo16bobo25boo$1291boobb3oboo19boo55boo$1266boo 16bo8b5oboo20boo54boo$1268bo15bobo7b5ob3o$1265bo19bobo7b3o3bobo12boo$ 1265bobbo16bobbo14bo11boo$1264booboo16bobo5bo9boo12bo$1265boo7boo8bobo 5bobo$1273bobo8bo6bo3bo33boo$1273bo18b3o34bobbo$1263boo3boobboo16boo3b oo22bo3b3o7bo6boo$1263boo3boo48b5o3bo6bo6boo$1264b5o37boo9booboo3bo7bo $1265bobo38boo8b3oboo3bo3bobbo$1317boob4o5boo$1265b3o50b4o$1319bo5$ 1266boo25boo28boo$1266boo25boo28boo$$1350b3o15bo$1349bobbo14bobo$1352b o12boo3bo14boo$1348bo3bo7boo3boo3bo13bobo$1348bo3bo7boo3boo3bo12b3o4b oob3o$1352bo14bobo12b3o4bobb4o$1349bobo16bo6bo7b3o4boo$1324bo48boo9bob o$1323b3o48boo9boo$1322b5o$1321boo3boo44bo$1322b5o44boo$1322bo3bo44bob o$1323bobo$1324bo41bobo$1366boo$1367bo12bo7bo$1322bo56b4o5bobo$1320boo boo49boobbobboo8boo$1329bo44boobboo11boo4boo$1319bo5bo4bo40boo10bo7boo 4boo$1328b3o39b3o10bo4bobo$1319booboboo45boo10bo4bo$1365boo7boo$1364bo bo7boo$1364bo$1363boo$1337bo$1335bobo7boo4b3o3bo5boo$1336boo6bobo4bo5b o6bo$1345bo5b3o10bobo7bo$1365boo7b4o$1375b4o7bo$1319bo8bo46bobbo6bobo$ 1318b3o7boo17b3o25b4o4boo3bo9boo$1317b5o5bobo16boobo24b4o5boo3bo9boo$ 1316bobobobo22boobbo3bo20bo8boo3bo$1316boo3boo22b4o4boo30bobo$1347bobo 3boo31bo$1348boo25bobo$1321boo17bo6boo26boo$1321boo16bobo5b3o6boo13bo 4bo$1323bo14bo3boo12bobo11boo$1321b3o14bo3boo14bo11bobo$1319bo18bo3boo 3b3o8boo$1319b5o5boo8bobo5b3o$1320boo6bobo9bo5bo3bo33boo$1328bo16bo5bo 25boboo3b3o$1327boo17bo3bo22bobbo3bo5boobo5boo$1318boo3boo22b3o22boobb o4bo4bobbo5boo$1319b5o37boo8boo5b4o4boobo$1319booboo37boo7b3o7bo3b3o$ 1319booboo47boo11boo$1320b3o49boo$1373bo5$1321boo25boo$1321boo25boo! golly-3.3-src/Patterns/Life/Breeders/rake-breeder.rle0000644000175000017500000001741112026730263017466 00000000000000#C Rake puffer -- a type-MMM breeder #C Creates a new rake every 60 generations. #C Achim Flammenkamp, 1994 #C From "rake-puff.lif" in Jason Summers' "jslife" pattern collection. x = 398, y = 405, rule = B3/S23 81boo5b4o$79booboo3bo3bo$79b4o8bo$80boo5bobbo$$75boo9bo$73b5o8b3o$73b oo4bo5bo3bo$73boo5b5o4bo$75boo4b4oboboo$78b3oboo3bo$84bobo$$64bo$62boo 24b4o$63boo22bo3bo$70b4o17bo$69bo3bo13bobbo$49bo23bo$47boo20bobbo$48b oo14boo$63b4o$53bo9booboo$53bo11boo$49bobboo4bobo$49bo7bobboo$49bobboo 4bobo$53bo11boo$19bo20boo11bo9booboo$17boo20b4o20b4o$18boo19booboo20b oo$30b3oboo5boo$29boo5bo$28bo7boo$29boo5bo$30b3oboo5boo$39booboo$39b4o $40boo$20bobbo$24bo$20bo3bo$10boo9b4o$9boo5b3o$5b3o6booboo$9boo5b3o$ 10boo9b4o$20bo3bo19bobbo$24bo23bo$20bobbo7boo11bo3bo$33bo11b4o$28bo7b oobb3o$13b3o11bo8boobb3o$13bo14bo7boobb3o$14bo18bo11b4o$31boo11bo3bo$ 48bo80boo5b4o$28b3o13bobbo79booboo3bo3bo$28bo98b4o8bo$29bo23boo73boo5b obbo$51booboo$51b4o16boo$43b3o6boo15booboo53bo7boo$43bo25b4o45b5o7boo 3bobo$44bo25boo46bo18bo$119b3o13b3o$60bo3bo55bo4boo$60boo5b3o55boo$55b oo9bob3o$54bo6bo8boo$3o5b3o3b3o36bo3bo3b8obo38bo26b4o$obbo4bobbobbobbo 36bo3bo7b4o37boo26bo3bo$o7bo5bo43bo8bo40boo8b4o17bo$o7bo5bo102bo3bo13b obbo$bobo5bobo3bobo42bobbo57bo$64bo6boo21bo22bobbo$60bo3bo4booboo18boo 18boo$61b4o4b4o20boo16b4o13b4o$bo68boo29bo9booboo11bo3bo12bobbo$3o98bo 11boo16bo16bo$oboo75bo17bobboo4bobo18bobbo13bo3bo$b3o73boo18bo7bobboo 35b4o$boo75boo17bobboo4bobo$101bo11boo6bo$88boo11bo9booboo6bo18bobo$ 87b4o20b4o5b3o12b3oboo3bo$87booboo20boo18boo4b4oboboo$16b3o59b3oboo5b oo39boo5b5o4bo$15bobbo58boo5bo31bo13boo4bo5bo3bo$18bo57bo7boo31bo12b5o 8b3o$18bo30bo27boo5bo30b3o14boo9bo$15bobo29boo29b3oboo5boo$48boo37boob oo45boo5bobbo$87b4o20bo24b4o8bo$88boo22bo23booboo3bo3bo$110b3o18boo5b oo5b4o$129booboo$45boo28boo28boo10b3o5bo3b4o$45boo28boo28boo7bobb3o3b oobo3boo$114bobo6bo3bo$30b3o5b3o73bobb3o3boobo3boo$30bobbo4bobbo9boo 64b3o5bo3b4o$30bo7bo12bobo42b4o8bobbo17booboo$30bo7bo12bo32bo10bo3bo 12bo18boo$31bobo5bobo41bobo4boo7bo8bo3bo$81boobbo3b4obbobbo10b4o$79boo bo5bo3boo$81boobbo3b4obbobbo$31bo51bobo4boo7bo$30b3o51bo10bo3bo$30bob oo62b4o20b4o$31b3o47boo36bo3bo$31boo48bobo31bo7bo$81bo28b7obbobbo$109b obb3oboo$110b7obbobbo$96boo17bo7bo$46b3o47bobo20bo3bo$45bobbo47bo23b4o $48bo$48bo78boo$45bobo63boo13b4o$111bobo12booboo14boo42boo5b4o$111bo 16boo14b4o39booboo3bo3bo$144booboo38b4o8bo$146boo40boo5bobbo$125bo$ 124b3o59bo$123boboo3bo11bo42boo8boo$123bo6bo10b4o39bo9bobbo$60b3o5b3o 53bo14b5obo39b5o4bobbo$60bobbo4bobbo66bo6boo39b4o3booboo$60bo7bo68bo3b ob3o43bo4boo$60bo7bo69bo3b3o$61bobo5bobo67bo32bobo$173b3o$145boo26b3o 20b4o$136b4o4b4o47bo3bo$61bo73bo3bo4booboo29b4o17bo$60b3o76bo6boo12bo 16bo3bo13bobbo$60boboo71bobbo19boo21bo$61b3o95boo16bobbo$61boo109boo$ 171b4o13b4o$145bo15bo9booboo11bo3bo12bobbo$143boo16bo11boo16bo16bo$ 144boo11bobboo4bobo18bobbo13bo3bo$76b3o78bo7bobboo35b4o$75bobbo78bobb oo4bobo15b3o$78bo82bo11boo$78bo49boobbo15boo11bo9booboo7bobbo14boo$75b obo51bo3bo13b4o20b4o8bobo18bo$131bo15booboo20boo4bo20boo4boo$138b3oboo 5boo28bo18boo6bo$137boo5bo32b3o17boo7bo$136bo7boo52bo3bobbo$137boo5bo 58bo$138b3oboo5boo22bo$147booboo22bo22boo5bobbo$100bo46b4o21b3o21b4o8b o$90b3o5boo48boo46booboo3bo3bo$90bobbo4bobbo89boo5boo5b4o$90bo7bobbo 66bo20booboo$90bo7bo30boo28boo8bo7b3o5bo3b4o$91bobo5bo3bo25boo28boo6b 3o4bobb3o3boobo3boo$104bo69bobo6bo3bo$101boo71bobb3o3boobo3boo$177b3o 5bo3b4o$91bo64b4o8bobbo17booboo$90b3o51bo10bo3bo12bo18boo$90boboo49bob o4boo7bo8bo3bo$91b3o47boobbo3b4obbobbo10b4o$91boo46boobo5bo3boo$141boo bbo3b4obbobbo$143bobo4boo7bo$144bo10bo3bo$156b4o20b4o$106b3o70bo3bo$ 105bobbo66bo7bo$108bo38boo21b7obbobbo$108bo38bobo19bobb3oboo$105bobo 39bo22b7obbobbo$175bo7bo$164bobo12bo3bo$162b4o14b4o$162bobbo$162bo24b oo$186b4o$186booboo14boo40boo5b4o$177boo9boo14b4o37booboo3bo3bo$120b3o 54bobo24booboo36b4o8bo$120bobbo53bo28boo38boo5bobbo$120bo$120bo130boo$ 121bobo70boo39boboo11b5o$193bobbo36bo5bo10bo4bo$188b3o13boo33bo10b3obb o$187bobbo8bo5boo26bo5bo11bobboo$121bo65booboo3bo3bo4boo28bo3bobboo9b oo$120b3o72bo4bo3bo30b3o3boo$120boboo73bo$121b3o$121boo82boo47b4o$196b 4o4b4o16bo28bo3bo$195bo3bo4booboo13boo12b4o17bo$199bo6boo15boo10bo3bo 13bobbo$195bobbo40bo$136b3o96bobbo$135bobbo91boo$138bo70bo19b4o13b4o$ 138bo70bo9bo9booboo11bo3bo12bobbo$135bobo81bo11boo16bo16bo$215bobboo4b obo18bobbo13bo3bo$194bo20bo7bobboo35b4o$192boo21bobboo4bobo$193boo24bo 11boo$206boo11bo9booboo4bo13boo$205b4o20b4o6bo7bo4boo$205booboo20boo5b 3o6b3o13b3o$196b3oboo5boo36bo18bo$150b3o42boo5bo42b5o7boo3bobo$150bobb o40bo7boo29bo20bo7boo$150bo44boo5bo31bo$150bo45b3oboo5boo23b3o$151bobo 51booboo45boo5bobbo$205b4o45b4o8bo$206boo20bo25booboo3bo3bo$229bo19boo 5boo5b4o$151bo75b3o17booboo$150b3o28boo28boo22b3o5bo3b4o$150boboo27boo 28boo19bobb3o3boobo3boo$151b3o78bobo6bo3bo$151boo70bo8bobb3o3boobo3boo $223bo11b3o5bo3b4o$214b4o8bobbo17booboo$202bo10bo3bo12bo18boo$201bobo 4boo7bo8bo3bo$166b3o30boobbo3b4obbobbo10b4o$165bobbo28boobo5bo3boo$ 168bo30boobbo3b4obbobbo$168bo32bobo4boo7bo$165bobo34bo10bo3bo$196boo 16b4o20b4o$196bobo38bo3bo$196bo36bo7bo$228b7obbobbo$227bobb3oboo$228b 7obbobbo$233bo7bo$237bo3bo$238b4o$$226boo17boo$226bobo15b4o$226bo17boo boo14boo$246boo14b4o38bobbo$262booboo41bo6boo$241boo21boo38bo3bo4boob oo$181bo58boo63b4o4b4o$180b3o131boo$180boboo55boo$181b3o77boo$181boo 72b3o3bobo31bobo12b4o$252b3o6boboo28b3oboo11bobboo$252bo9boo29b3ob3o 11bobboo$252b3o7bo31booboo12bobbo$295b3o3boo9boo$196b3o97bo4boo$195bo bbo64boo$198bo55b4o4b4o$198bo54bo3bo4booboo48boo$195bobo59bo6boo17bo 29booboo$253bobbo26bobo11boo14b4o$283boo10booboo14boo$295b4o$296boo$$ 268bobo18b4o14boo$269bo8bo9bo3bo12booboo13boo$279boo11bo12b4o13b4o$ 276b3o5boobbobbo14boo14booboo$253bo21b3o6b3o37boo$253bobo20b3o5boobbo bbo$253boo24boo11bo$278bo9bo3bo4bo14boo$265b4o20b4o5boo11bobbo$264bo3b o28boo7b3o13boo$260bo7bo36bobbo8bo5boo$211bo43b7obbobbo37booboo3bo3bo 4boo$210b3o41bobb3oboo29bo20bo4bo3bo$210boboo41b7obbobbo25boo20bo$211b 3o46bo7bo23boo$211boo51bo3bo54boo$265b4o45b4o4b4o$287bo18bobbo3bo3bo4b ooboo$288boo20bo6bo6boo$287boo17bo3bobbobbo$226b3o12boo28boo23boo9b4o$ 225bobbo12boo28boo22boo5b3o$228bo62b3o6booboo$228bo55bo10boo5b3o$225bo bo54boo12boo9b4o$275boo10boo17bo3bo$273booboo8b4o20bo$261b3o5bo3b4o9b ooboo15bobbo$258bobb3o3boobo3boo12boo$258bobo6bo3bo$258bobb3o3boobo3b oo$261b3o5bo3b4o$273booboo$257bo17boo22boo$256boo26bo12booboo$256bobo 25bo8bo3b4o$288boobbobo3boo$279boo6bobboo3bo$288boobbobo3boo$284bo8bo 3b4o$284bo12booboo$299boo$377boo5bobbo$287bo88b4o8bo$286boo16b4o68boob oo3bo3bo$286bobo14bo3bo70boo5b4o$307bo14b4o$303bobbo14bo3bo48bo$325bo 47boo$300b3o18bobbo47boboo7boo$256b3o41bo71bobo7bobboo$255bobbo40boo 71boo3bo3b3obbo$258bo57boo3boo51bob3obbo4bo$258bo55bo6bobo57b5o$255bob o55bobbo6bo58boo$312boo7b3o$313boo46bobo20bobbo$361boo25bo$362bo3bobbo 14bo3bo$370bo14b4o$315boo5b4o40bo3bo$313booboo3bo3bo20bobo18b4o$313b4o 8bo20boo$314boo5bobbo22bo28bobbo$362boo16bo$360booboo11bo3bo$331bobo 14b3o5bo3b4o13b4o13b4o$331boo12bobb3o3boobo3boo30bo3bo$332bo12bobo6bo 3bo14boo22bo$345bobb3o3boobo3boo9bo20bobbo$348b3o5bo3b4o8bo$316bobo41b ooboo6boo$316bobo19boo22boo24boo3boo$317bo9bo8booboo45bo6bobo$325bobo 4bo3b4o27bo17bobbo6bo$324bobbo5bo3boo26bobo16boo7b3o$324bo6bobbo31boo 17boo$324bobbo5bo3boo$325bobo4bo3b4o$327bo8booboo21bo$286b3o49boo20bob o24boo5b4o$285bobbo72boo16boo4booboo3bo3bo$288bo89b4o3b4o8bo$288bo77bo 11booboo3boo5bobbo$285bobo29boo28boo8bo6boobo3bobbo5boo$317boo28boo6bo bo4b5o4bo3bo$356boo4bobbo4bo4boo$362b5o4bo3bo$344bobbo16boobo3bobbo5b oo$348bo17bo11booboo$331boo11bo3bo9b4o16b4o$333bo11b4o8bo3bo17boo$328b o7boobb3o18bo$327bo8boobb3o14bobbo$328bo7boobb3o$333bo11b4o$331boo11bo 3bo19bobbo$348bo23bo$344bobbo12bo7bo3bo$358b3o3bo4b4o$334b3o21boo5boo$ 334bo22bo6b3o$335bo22boo5boo$358b3o3bo4b4o$360bo7bo3bo$349b3obo18bo$ 349boo17bobbo$$377boo$375booboo$364b3o8b4o16boo$364bo11boo15booboo$ 365bo27b4o$394boo$$382boo$376b3o3boo9bo$376b3o14boo$375bo3bo12boboo$ 375b4o13bobo$376b3o13boo3$384bobbo$388bo6boo$384bo3bo4booboo$385b4o4b 4o$394boo! golly-3.3-src/Patterns/Life/Breeders/pi-blink-breeder2.rle0000644000175000017500000002747512026730263020346 00000000000000#C An unusual breeder (quadratic growth) pattern. #C By Jason Summers and David Bell, 6 Sep 2002; from "jslife" archive. x = 957, y = 237, rule = B3/S23 141b4o5boo$141bo3bo3booboo$141bo8b4o$142bobbo5boo$$146bo$144bobbo3bo 17b4o$143bo7boo16bo3bo$143bo6boo17bo$143boo4boo19bobbo$145bo18bobo$ 147boo14bobbo14b6o$181bo5bo$163b3o15bo$141b4o37bo4bo$141bo3bo38boo$ 141bo27b3o$142bobbo23bo$170bo$$142boo$140bo4bo$139bo$139bo5bo$139b6o 16b3o$161bo$162bo$$135b4o$134b6o8boo$133boob3obo6bobbo$134boo3boo6bobb 4o$36b4o5boo102bobboboo7boo$36bo3bo3booboo88boo6b3o3boo3bo6boo$36bo8b 4o86bo9boo5booboo$37bobbo5boo86bo17b3obbo11bo$134bo3bo18bo9bo3bo$41bo 92b4o9b3o6bo9bo25bobo$39bobbo3bo17b4o78b5o15bo4bo20boo$38bo7boo16bo3bo 76boob3o9boo4b5o22bo$38bo6boo17bo81boo10bo4bo$38boo4boo19bobbo88bo$40b o18bobo95bo5bo$42boo14bobbo14b6o75b6o$76bo5bo$58b3o15bo$36b4o37bo4bo 73bobbo$36bo3bo24b3o11boo66boo6bo$36bo28bo80booboo4bo3bo$37bobbo25bo 80b4o4b4o$148boo$$37boo$35bo4bo109b4o12bobo6boo$34bo37bobo74boobbo11b oob3o3booboo$34bo5bo16b3o12boo74boobbo11b3ob3o4b4o$34b6o17bo15bo75bobb o12booboo6boo$58bo91boo9boo3b3o$161boo4bo19boo$179bo6boob4o$30b4o144bo bo6b6o$29b7o9boo100boo39b4o$28boob3ob3o9booboo94booboo26bo3bo$29boo3b oobo5bo3boboboo94b4o$42bo3boobobobo6boo86boo$32boo9boo3boboobo6boo116b 3o$30bo20b5o$29bo25bo8bo$29bo3bo20bo7bo3bo79b4o$29b4o9b3o6bobbo6bo83b 6o18boo$41b5o6bo8bo4bo77boob4o17boo$40boob3o9boo4b5o79boo23bo$41boo10b o4bo$52bo$52bo5bo$52b6o104bo$139b6o13boobobo$139bo5b4o8bo3bo30bo39bobo $53boo84bo5boboo8bo6bo26bo40boo$51bo4bo83bo3bobboo8bo3booboo6boo17b3o 39bo$50bo91bo15bo5bo7boo$50bo5bo84boo16b3o4bo$40b3o7b6o6bo77b4o17bo6bo $39b5o16bo3bo74booboo21bo7b3o$38boob3o15bo80boo25bo4b5o$28bobbo7boo18b o4bo86b5o15boob3o$27bo19bo11b5o87bo4bo15boo$27bo3bo13b4o102bo12b4o$27b 4o14bobboo102bo3bo6b6o$38bo5boobo106bo7boob4o635bo39bo$36boobo6bo8boo 106boo359b3o275bo40bobo$28b3o10bobbobo8boo189boo40bo235boobo37boo235bo 4bo36b3o$27b5o9bobboo199bobo39boo238bo35booboo239bo35bobbo$26boob4o5bo boo128bobbo6boo62bo41b4obo232b3o35bo242bo37b3o$27boo5boobbo54boo17bobo 54bo8bo4bo60bo3booboo32b6obo231bo5boo30bobo5boo105bo124bobo4boo32bo5b oo$39bo52booboo4boo9boo55bo3bo3bo66bo7bo32bob5o239bo31bo7bo104b3o38bo 85bo3boobbo36bobbo$93b4o3boob4o6bo55b4o4bo5bo67bo34bo99bo11bo25booboo 8bo91b3o38bo104boobbo36bobo87bo5bo34b4o$35boo17bo8bobbo15b5o7boo5b6o 52boo16b6o63boo139bo9b3o35bobbo89bo40bo104boobboo35booboo86boo3bo36bob o$33bo4bo15bobo5bo19bo4bo14b4o52boob3o85b3o144bobbo26bo6b3oboo87b3oboo 37boo101booboo38bo92b3o33boo$32bo21boo6bo3bo15bo76b5o83boo39b4obbo91bo 39boo5b3obbo86boob4o33boobobo100bobobbo36bobo88bo7b3o39bo$32bo5bo23b4o 17bo3bo72b3o84b4o36bob3obbooboo94boobo29boo4boobo89bobboo5boo28boboobb o98bo5boboo31boobo88bobbo5bo30bo9boo$32b6o47bo160bo3bobo4boo3bo24bo5b 6o93bo3bobb3o30boo4boo85bobbo5boo31bo3bo3b3o92boboboobboo30bobo3boboo 84b3o6bo8b3o18b4o6bobo$257bo28bobbo5boboob3o88bo4bo35boo5boo85bobo7bo 38bo94b5obbobo30b4o5boo84bo15bo3bo19boo16bo$246booboo6bo5bo23bobbo5bo 4boo89bo3boo4bo32b3obo103boo19bo13bo4bo87bobo43bobb3o98boo3bo35b3o$ 119bo22bo56bo22bo24b3o8bo3boboo13bo7bobo10bobbo32bo33bo24bobbo4bo23bo 6boo5bobo6bo33bo33bo24boboo18booboo5bo7boo13bo33bo33bo5bo9b3o4bo24bo3b obbobo22bo33bo33bo12bo9bo24boboo28bo33bo$62bo56bo22bo17boo19b3o15bo22b o15b3o17boo4boo13bo19bobb3o13b3o15bo15b3o15bo15b3o10bo3boo4b3o15bo7b3o bo3bo6bo15b3o15bo15b3o15bo15b3o8boo10b3o15bo3bo4boo12bo15b3o15bo15b3o 15bo18bo3bo15b3o10bobo3bo3b3o15bo15b3o15bo15b3o15bo9bobbo9bo15b3o9boo 9b3o15bo15b3o15bo$62bobo54bo22bo16boo38bo22bo24b3o8bo3boboo13bo7bobo 10bobbo32bo33bo24bobbo4bo23bo6boo5bobo6bo33bo33bo24boboo18booboo5bo7b oo13bo33bo33bo5bo9b3o4bo24bo3bobbobo22bo33bo33bo12bo9bo24boboo28bo33bo $34b4o24boo97bo84booboo6bo5bo23bobbo5bo4boo89bo3boo4bo32b3obo103boo19b o13bo4bo87bobo43bobb3o98boo3bo35b3o$34bo3bo218bo28bobbo5boboob3o88bo4b o35boo5boo85bobo7bo38bo94b5obbobo30b4o5boo84bo15bo3bo19boo16bo$34bo25b oo184bo3bobo4boo3bo24bo5b6o93bo3bobb3o30boo4boo85bobbo5boo31bo3bo3b3o 92boboboobboo30bobo3boboo84b3o6bo8b3o18b4o6bobo$35bobbo20bo187b4o36bob 3obbooboo94boobo29boo4boobo89bobboo5boo28boboobbo98bo5boboo31boobo88bo bbo5bo30bo9boo$121boo19boo34b6o63boo39b4obbo91bo39boo5b3obbo86boob4o 33boobobo100bobobbo36bobo88bo7b3o39bo$39boo79boob3o14bo4bo32bo5bo64b3o 144bobbo26bo6b3oboo87b3oboo37boo101booboo38bo92b3o33boo$37b5o71boo6b5o 6bobbo3bo38bo67boo139bo9b3o35bobbo89bo40bo104boobboo35booboo86boo3bo 36bobo$36bo4bobb3obo62bo4bo5b3o6bo7bo5bo21boo10bo4bo66bo34bo99bo11bo 25booboo8bo91b3o38bo104boobbo36bobo87bo5bo34b4o$36bobb3o3bo3boo11b4o 44bo20bo3bo3b6o21boob3o9boo4b5o52bo7bo32bob5o239bo31bo7bo104b3o38bo85b o3boobbo36bobbo$36boobbo7bobo11bo3bo43bo5bo14b4o32b5o15bo4bo51bo3boob oo32b6obo231bo5boo30bobo5boo105bo124bobo4boo32bo5boo$38boo7boobo11bo 37b3o7b6o6bo32b4o9b3o16bo56bo41b4obo232b3o35bo242bo37b3o$48boo13bobbo 32b5o16bo3bo30bo3bo28bo3bo52bobo39boo238bo35booboo239bo35bobbo$48bo49b oob3o15bo35bo34bo55boo40bo235boobo37boo235bo4bo36b3o$88bobbo7boo18bo4b o31bo15bo351b3o275bo40bobo$34b4o5boo42bo31b5o34boo11b3o6boo622bo39bo$ 34bo3bo3booboo40bo3bo70b3o5boobbo5boo$34bo8b4o40b4o14bo49boo3boo3bo5b 3o$35bobbo5boo58b3o47boob3obobbo7boo124b6o132bobbo6boo121boo$24boo67b ooboo5bobboo5boo40b9o134bo5bo130bo8bo4bo52boo64b4o5b4o$15bo7boob4o58b 3o5boo4b3oboo5boo41b4o21bo116bo136bo3bo3bo57booboo4boo48bo6booboo4b6o$ 13bo3bo6b6o31b3o23b5o6bo4booboo72bo106boo10bo4bo130b4o4bo5bo52b4o3boob 4o42bo3bo5boo5boob4o$12bo12b4o32bo24boob4o3boo82b3o103boob3o9boo4b5o 113boo16b6o42b5o7boo5b6o41bo18boo$12bo4bo15boo27bo24boo5bobbo189b5o15b o4bo111boob3o61bo4bo14b4o42bo4bo$12b5o15boob3o56bobo63b6o109b4o9b3o6bo 9bo60bo56b5o61bo65b5o$boo30b5o75bo46bo5bo108bo3bo18bo9bo3bo53bo3bo55b 3o63bo3bo$ooboo29b3o58boo16bobo44bo114bo17b3obbo11bo54bo128bo$b4o19boo 67bo4bo14boo46bo4bo29bo79bo9boo5booboo67bo4bo$bboo16b5oboo8bo55bo70boo 24bo5boo39boo40boo6b3o3boo3bo6boo59b5o$3bo5b3o7bobo4boo9bo54bo5bo89bo 6bobo38bobo51bobboboo7boo224bo56bo22bo56bo22bo56bo22bo21bo34bo22bo21bo 34bo22bo$bo3bo3boobo5bo5boboo8bo55b6o90b3o45bo38boo3boo6bobb4o114b3o 54b3o20b3o38bo15b3o20b3o15bo22bo15b3o20b3o15bo22bo15b3o20b3o15bo22bo 15b3o3bo16b3o15bo22bo15b3o3bo16b3o15bo3b3o16bo15b3o$o5bo5bo5bobo3b3o 136bobbo107boob3obo6bobbo238bo56bo22bo56bo22bo56bo22bo21bo34bo22bo21bo 34bo22bo23boo$o5bo3b3o6bo3boboo135bo112b6o8boo420b3o239bobbo$6obo3bo 10boobo95bo40bo3bo38boo69b4o431bobo240boo$9bo12b3o96bobo38b4o37bo4bo 174boo325bobbo$10bo110boo79bo100bo77bo4bo127b4o70boo$94b4o104bo5bo93bo 77bo66boo64b6o67bo4bo147b4o146boo$94bo3bo68bobo32b6o72b6o16b3o75bo5bo 51bo7boob4o59boob4o66bo152b6o136bo7boob4o$6boo86bo71bo3boob3o104bo5bo 83b3o7b6o6bo43bo3bo6b6o60boo70bo5bo145boob4o134bo3bo6b6o$5boob4o20bo 62bobbo35b6o24boobob4o4boo12bobbo85bo88b5o16bo3bo40bo12b4o49b5o17b3o 49b3o7b6o6bo140boo137bo12b4o$6b6o18boo83b3o16bo5bo23bo4b5o5boo9bo90bo 4bo81boob3o15bo45bo4bo15boo43bo4bo15b5o47b5o16bo3bo126b5o17b3o126bo4bo 15boo$7b4o20boo66bo10bobobo3bo15bo29bo3bo5bo4boo9bo3bo88boo73bobbo7boo 18bo4bo40b5o15boob3o30boo8bo14bo4boob3o46boob3o15bo131bo4bo15b5o125b5o 15boob3o$97b3o10bo7bo16bo4bo24b3o8b5o9b4o163bo19bo11b5o30boo30b5o29b4o 8bo3bo7bo7boo39bobbo7boo18bo4bo116boo8bo19boob3o114boo30b5o$96bo3bo15b oo19boo28bo9boo132bo45bo3bo13b4o44booboo29b3o29booboo10bo10boo45bo31b 5o116b4o8bo3bo15boo116booboo29b3o$96bo4b3o18b4o157boo7b5o13bo46b4o14bo bboo44b4o25bo36boo21bobbo45bo3bo147booboo10bo136b4o25bo$9boo85boobob3o 8bo9bo3bo36bobbo5boo108booboo5bo4bo12b3o55bo5boobo47boo84boobobo45b4o 14bo134boo130boo18boo$8b4o86bo3boo18bo39bo8b4o108b4o5bo73boobo6bo8boo 39bo12b3o6boo54bo3b3o10boo56b3o149b3o112boo20bo12b3o6boo$7booboo28bo 58bobo21bobbo35bo3bo3booboo109boo7bo3bo60b3o10bobbobo8boo37bo3bobboo6b obbo5boo44boo7boboboobo3bo6boo45booboo5bobboo5boo133bo6bobbo6boo78bo 27bo17bo3bobboo6bobbo5boo$8boo28boo9b4o109b4o5boo122bo61b5o9bobboo47bo 5boboo6bobbo46b8obo11bo52b3o5boo4b3oboo5boo129b6o5bo3bo5boo78boo43bo5b oboo6bobbo$39boo7b6o237bo64boob4o5boboo35boo14bo5b4o7bo48bo8bo9b6o48b 5o6bo4booboo131b8o3bo4bo3bo84bobo43bo5b4o7bo$47boob4o40b4o5boo181b3o 68boo5boobbo37boo15b6o12bo47bo6bo10boo52boob4o3boo141bo8boo6bobo131b6o 12bo$20boo26boo44bo3bo3booboo67b4o107b3obo4boo4bo12b3o53bo38bo41bo20b 3o16bo71boo5bobbo141bo6b3o168bo$19bobbo71bo8b4o66b6o105boo9bo3bobo13bo 132boo21bo20boo75bobo143bo5boo167boo$10boo13b3o9boo56bobbo5boo66boob4o 106bob8o3bo3bo11bo50boo17bo64boo21bo115bo128boo21bobo148boo$9boo5bo8bo bbo7b4o133boo111b4o7bo3bo61bo4bo15bobo109b4o70boo16bobo149boo$10boo4bo 3bo3booboo6booboo121b5o17b3o102bo8bo21bo42bo21boo43boo64b6o17bobo12boo 33bo4bo14boo131b4o16bo129boo$11bo3bo4bo15boo123bo4bo15b5o133bo41bo5bo 59boob4o59boob4o17boo13bobo31bo152b6o144boob4o$18bo132boo8bo16bobboob 3o105bobbo23bo42b6o61b6o60boo22bo13bo33bo5bo145boob4o145b6o$150b4o8bo 3bo9bobo3boo99boo6bo138b4o133b6o147boo150b4o69boo$9boo138booboo10bo13b oo102booboo4bo3bo21b3o138bo441bo4b3o36boo$8b4o4b4o130boo23b5o103b4o4b 4o21b5o135boo440boo5bo40bo$7booboo4bo3bo140bobo11boboboo103boo29boob3o 71bo64boo123bo13bo151bobo148boo5bo$8boo6bo144bobo7boo4bobo136boo74bobo 37boo137boo7bo3bo11bobo134b3o12boo124boo$17bobbo133boo7boo6boo4b3o184b 4o24boo37b4o62boo27bobo41b4o5bo16boo124b4o6b5o12bo123b4o$149b8o7b3o 197bo3bo61booboo61booboo25boo41booboo5bo4bo137bo3bo4boob3o135booboo$ 149bo6bo6bobbo197bo25boo39boo39b4o21b4o19bo6bo42boo7b5o138bo9boo139boo 24bo14b4o$149bo14boo7bobo189bobbo20bo14b6o43bo17b6o21boo20bo16boo184bo bbo172bo13b6o$150bo4bo17boo229bo5bo41b3o15boob4o42bobo14boob4o335bo33b oob4o$152boo20bo21boo171boo33bo31bo11bo3boobo8bo6boo48bo15b6o184bo152b o32boo$196bobo168b5o33bo4bo23b4o10bo6bo9boo33bo3boo15bo16b4o31boo95b3o 52b3o148boobbo3bo$156b4o36bo169bo4bobb3obo28boo24bob5o14bo5boo37boo4b 3o64bobo3b3o89bo53bo3bo9bo136bo5bob3obbo13boo$155b6o205bobb3o3bo3boo 11b4o36boo6bo18b4o35boo5bobbo16boo44boobo6b3o12boo73bo52bo4b3o4boo136b oobbobobb5obo11b4o$154boob4o205boobbo7bobo11bo3bo36b3obo3bo16booboo36b oo7bo15booboo43boo9bo11bobo126boobob3o5bobobbo132boo3bo5booboo9booboo$ 155boo211boo7boobo11bo41b3o3bo18boo46boo16b4o44bo7b3o13bo128bo3boo6boo bbo133b3o7bobbo11boo$181bobo194boo13bobbo42bo86boo75bo123bobo$181boo 195bo223boo283boo$182bo249boo72bobbo61boo301boo$364b4o5boo56b4o4b4o54b oo6bo64b4o4b4o140b4o5boo25bo114b4o4b4o$364bo3bo3booboo53booboo4bo3bo 52booboo4bo3bo59booboo4bo3bo139bo3bo3booboo21bo3bo111booboo4bo3bo$157b oo205bo8b4o54boo6bo57b4o4b4o61boo6bo24boo117bo8b4o20bo117boo6bo$156boo boo204bobbo5boo64bobbo54boo79bobbo19boob3o115bobbo5boo21bo4bo121bobbo$ 157b4o442b5o147b5o$158boo29bobo5boo405b3o164boo$189boo5boob4o566bo4bo$ 170boo18bo6b6o413boo150bo111boo$160bo9boo3b3o20b4o405bo7boob4o146bo5bo 32boo69bo4bo$159boo14b3o427bo3bo6b6o136b3o7b6o6bo25boo69bo$158boobo12b o3bo6boo417bo12b4o136b5o16bo3bo25bo68bo5bo$159bobo13b4o5booboo415bo4bo 15boo129boob3o15bo89b3o7b6o6bo$160boo13b3o7b4o415b5o15boob3o116bobbo7b oo18bo4bo83b5o16bo3bo$186boo405boo24bo5b5o115bo31b5o83boob3o15bo$592b ooboo21b3o5b3o116bo3bo20b3o82bobbo7boo18bo4bo$166bobbo423b4o21bobbo 123b4o21bobbo80bo31b5o$157boo6bo428boo7boo12bo3bo134bo16bo80bo3bo15b5o $156booboo4bo3bo425bo7boo12b4o133boobo7bo3b4o81b4o16boo3bo$157b4o4b4o 424bo3bo8bo5b3oboobbo125b3o10bo4bo3bo106bobbo$158boo432bo5bo8boo5b3o 128b5o9bo5bobo3bo96bo6bobbo5boo$592bo5bo6b3o6b3o127boob4o5boboo7bo87b 3o3bo5boobb3oboo7boo$592b6o6bobo8boo128boo5boobbo11bo85b5obbo9boboboo 28boo$616boo139bo10bobbo81boob4obo6bobbobo30boo$769bo84boo13boo35bo$ 753boo$751bo4bo$598boo150bo111boo$597boob4o146bo5bo103bo4bo16bo$598b6o 21bo124b6o20bo82bo22bobo$599b4o20boo151bobo80bo5bo16boo$624boo150boo 81b6o$$630b3o$601boo27bo$600b4o27bo120b4o$599booboo148bo3bo134bo$600b oo39b4o107bo31bo76b4o25bobo$622bo17b6o107bobbo27bobo5b6o63bo3bo23bobbo $621b3o15boob4o138boo6bo5bo62bo28bobo$605bo11bo3boobo15boo124boo4bo19b o69bobbo35b6o$603b4o10bo6bo130boo9boo3bobo19bo4bo102bo5bo$602bob5o14bo 5boo123bobbo12bo3bo20boo69bo6boo26bo$601boo6bo18b4o122bobbo12bo3bo5b4o 80bobbo5boo27bo4bo$602b3obo3bo16booboo122booboo11bo3bo5bo3bo78bo9boo4b o24boo$603b3o3bo18boo126boo13bobbo5bo82bo6boobo4b3o8b4o$608bo163bo8bo bbo78boo4b5o6boo7bo3bo$865bo4b3o3boo11bo$601boo264boo21bobbo$600b4o4b 4o140b4o5boo$599booboo4bo3bo139bo3bo3booboo$600boo6bo143bo8b4o96b4o5b oo$609bobbo140bobbo5boo97bo3bo3booboo$861bo8b4o$862bobbo5boo! golly-3.3-src/Patterns/Life/Breeders/p90-rake-factory.rle0000644000175000017500000001245712026730263020140 00000000000000#C p90 gun for p20 space rake #C The gun fires a p20 rake every 90 generations. (The smallest period #C for a p20 rake gun is 86). The rake gun is a stationary breeder. #C Dieter Leithner, 11 Nov 1994 x = 288, y = 129, rule = B3/S23 164bobo$163bo2bo$133b2o27b2o10bo6bo$133b2o4b3o12b2o4b2o3bo8bo5bobo$ 119bo10b2o6b5o11b2o6b2o9bo6b2obo$119bobo7b3o5bo3bobo19bo2bo2b2o9b2ob2o 3b2o$122b2o6b2o6bo3b2o20bobo2bo2b3o5b2obo4b2o$93b2o13b2o12b2o9b2o34b4o 7bobo$67b2o24b2o13b2o12b2o9b2o35b2o9bo$67b2o50bobo$48b2o69bo11bo127bob o$48b2o79bobo125bo3bo$93bo36b2o31bo93bo19bo$66b3o23b3o66b2o87b2o4bo4bo 14b4o$66b3o22bo3bo34bo31b2o86b2o5bo12bo4b2obobo$65bo3bo20bob3obo33b2o 125bo3bo3bob2o5b3obo2bo2b2o$64bo5bo20b5o33bobo37b3o87bobo2bob4o5b2obob o3b2o$65bo3bo40b2o26bo30bo94b2o2b2o6b4o$26b2o38b3o41b2o27bo30bo106bo$ 26b2o109b3o$110bo$109bobo49b2o115b2o$46b5o41bo2b2o12bobo10b2o36bobo 115bobo$26bo18bob3obo15bobo22bobo15bo12b2o10b2o23bo16b2o100b3o$25bobo 18bo3bo15bo2bo21b2o29bo12bobo21b2o8b2o6bobo100b2o$24bo3bo18b3o14bob2o 22b2o45bo31b2o6bo11bo90b2o$25b3o20bo41b2obo13b2obob2o13b2o8b2o48bobo 88bobo$23b2o3b2o37bo23b3o13bo5bo13b2o28bo16b2o9b2o92bo$64b2obo40bo3bo 42b3o16b2o9b2o12b2o$66bo42b3o3bo23b2o13bo10b2o3bo6b2o6b2o12b2o44b2o$ 46bo45b2o3b2o16b2o22bo14b2o9bobo3bo5b3o7bobo55bo30b2o3b2o$46bo13b2o33b o18bobo9b2o9bobo26b5o6b2o10bo47bo5bobo11b2o17b2o3b2o$24bo20bobo5bo6b2o 4b2o3b2o19bo5bo25bo3bo8b2o28b3o4b2o25b2o33bobo4b2o11bobo$24bo19b2ob2o 2bobo13b5o12bobo6b2ob2o25bo5bo44b2o24bo2bo32b2obo16bo15b3o3b3o$24bob3o 14bo5bo2b2o13b2ob2o12b2o8bobo21b2o2b2obo3bo70bo23b2o10b2ob2o14b2o8b2o 5bo5b3o$46bo20b2ob2o13bo9bo22b2o3bo5bo9bobo10bo47bo23b2o10b2obo25b2o6b o5bo$29bo13b2o3b2o18b3o24bo28bo3bo10b2o10b3o46bobo33bobo$26bob2o82bo 13b2o12bo10b3o46bobo34bo$26b2o70bo13bo88bo40bobo$45bo51bobo11bobo35b2o 3b2o86b2o$45bo32bo5b3o10bobo10b2ob2o34b2o3b2o80bo6bo$21b2o3b2o16bo31b 2o6bo13bo10bo5bo24bo57b2o3b2o31bobo37b3o$21b2o3b2o40b2o7b2o6bo26bo25b 2o58bo5bo31b2o38b3o$22b5o7bo33b2o39b2o3b2o23b2o134bo3bo$23bobo9bo10b2o 47b2o3b2o24bo60bo11bo3bo$33b3o10b2o47bobobobo23bo60bobo11b3o41bo29b2o 3b2o$23b3o70b5o10bo13b3o26b2o13b2o15b2obo54b3o$68bo9b2o12b2o3b3o11bo 28bo13bo14bobo14b2ob2o3b2o51bo$66bobo8bobo12bobo3bo11bo29b3o7bo4b3o2b 2o2b2o6bo13b2obo4b2o50b2o$67b2o8bo14bo50bo5b2o6bo2b2obo2bo2bo2bo13bobo $58bo17b2o8b2o54b2o5bobo12b2o6bo8bo5bo$58b3o25b2o24b2o55bobo7bobo$24b 2o6b2o27bo50b2o55b2o9b2o16bo$24b2o6b2o26b2o136bobo59b2o$8b2o65bo122b2o 59b2o$9bo66bo166b2o16bo14b2o$9bobo5bo8bo2bo44b3o18b3o50b2o7b2o44bo39b 2o31b2o$10b2o4bobo10bo64b2ob2o19bo20b2o6bobo6b2o30bo13b3o81b2o$14b2o3b o5b2o3bo2bo15bo44b2ob2o17b2o21b2o8bo8bo30bo11b5o80bo$5b2o7b2o3bo4bobob 2o3b4o13bo11b3o29b5o18b2o68b3o10b2o3b2o61b2o9bo4bobo$5b2o7b2o3bo14b4o 10b3o10bo3bo27b2o3b2o101b5o15bo45b4o7bobo3b2o$16bobo5b2o8bo2bo5b2o127b o28bo3bo13b2o24b3o14bobo2bo2b3o5b2obo$17bo16b4o5b2o15bo5bo98b2obo3b4o 26bobo9bo5b2o12bo12bo13bo2bo2b2o9b2ob2o$33b4o23b2o3b2o92b2o2b2obobo4b 4o26bo9bo15bo4b4o8bo13b2o9bo6b2obo$33bo42bo39bobo10b2o9b3o15bobo2b2obo b2o3bo2bo36b3o13bo5b4o10b2o7b2o3bo8bo5bobo$5bo14b2o23b2o27bobo20b2o17b 2o11bo2bo9bo14b3o8b2o3b4o19bo27b2o9bo2bo9bobo9b2o10bo6bo$5bo15bo22bobo 10bo17b2o40bo3b5o7bo7bo5bo8b3o8b2o3b4o4b2o12bobo6b2o19b2o9b4o8b3o4b2o 5bo2bo$4bobo14bobo5bobo11bo11bobo45bo16bo5bo6bo12b4o7b3o12bo7bobo12b2o 6b2o29b4o8b3o4bo2bo5bobo$3b2ob2o14b2o5bo2bo10bo2bo9b2o45bobo14bo3b2o7b o11b2obobo7bobo21bo51bo12b3o4b2o$2bo5bo23b2o9bo21b2o23bo4b2o6b2o16bo7b o2bo11b3obo2bo7b2o21b2o64bobo$5bo24bo3b2o8bobo5b2o11bo25bo3b2o32b2o14b 2obobo98b2o$2b2o3b2o23b2o11b2o5bobo11b3o20b3o54b4o$29bo2bo8bo12bo13bo 78bo$29bobo10b2o10b2o165bo2bo$3b4o14bo19b2o182bo41b4o$3bo2b2o11bobo81b o2bo86bo2bo24bo3bo40bo3bo12bo2bo$4bob2o3b2o4b2o18b2o68bo41b4o44bo24b4o 13b4o27bo16bo$11b2o4b2o17bo3bo62bo3bo40bo3bo40bo3bo40bo3bo23bo2bo13bo 3bo$5b2o10b2o16bo5bo62b4o44bo18b2o21b4o44bo41b4o$6bo12bobo4bo8bo3bo2bo 105bo2bo19b2o65bo2bo19bo$21bo3bo9bo12bobo119bobo89bo$25b3o2bo5bo3bo3bo 4b2o21bo59bo4b2o83bo4b2o31b3o$2obob2o30b2o3b2obo3bo20bobo24bo4b2o27bob o3b2o9b2o37bo4b2o20bo6bobo3b2o9b2o37bo4b2o$o5bo5bo32bo25b2o21b4o3b2ob 2o24bo3bo12bo2bo33b4o3b2ob2o16bobo5bo3bo12bo2bo33b4o3b2ob2o$bo3bo7bo 31b2o46b5o4bo2bo24bo3bo12bo2bo32b5o4bo2bo17b2o5bo3bo12bo2bo15bo16b5o4b o2bo$2b3o6b3o78bo9bo2bo24bo3bo11b2ob2o31bo9bo2bo24bo3bo11b2ob2o16bo14b o9bo2bo$93b2o8b2o25bo2bo13b2o34b2o8b2o25bo2bo13b2o16b3o15b2o8b2o$94bo 37bo51bo24bo12bo51bo$79bo127bobo$36b2o42bo15b2o5bo2bo79b2o5bo2bo11b2o 41bo24b2o5bo2bo$23bo11b4o13b2o24b3o14b4o8bo34b2o5b4o32b4o8bo34b2o5b4o 9bo22b4o8bo$20b3ob2o9b2ob2o10b2ob2o40b2ob2o3bo3bo32b2ob2o3bo3bo32b2ob 2o3bo3bo32b2ob2o3bo3bo7b3o22b2ob2o3bo3bo$21b3o13b2o11b4o43b2o5b4o32b4o 8bo34b2o5b4o32b4o8bo34b2o5b4o$3b2o16b2o28b2o88b2o5bo2bo79b2o5bo2bo$2bo 2bo240bo$2bo244bo$2bo82b2o158b3o$2bobo11bo68bo$2bobo11b2o49bo18b3o$3bo 11bobo29bo19b2o19bo10bobo139bo$45bobo18bobo28bo3bo140bo$35b2o6b2o12b2o 31b2o5bo19bo122b3o$2o3b2o27bo3bo4b2o12b2o26bo4b2o4bo4bo14b4o$o5bo26bo 5bo3b2o39b2o11bo12bo4b2obobo3b2o$23b2o8bo3bob2o4bobo36bobo10bo3bo3bob 2o5b3obo2bo2b2o110bo$bo3bo2b2o13b2o8bo5bo7bo51bobo2bob4o5b2obobo116bo$ 2b3o4b2o23bo3bo65b2o2b2o6b4o115b3o$8bo26b2o80bo2$231bo$92b2o138bo$91b 2o137b3o$93bo3bobo$5bo46bo44b2o$3b2ob2o44b2o44bo$51bobo$2bo5bo$100bo$ 2b2obob2o90b2o$99bobo$33bo76bo$31b4o6b2o2b2o62bobo$25b2o3bobob2o5b4obo 2bobo46bo8b2o3bo9b2o$25b2o2bo2bob3o5b2obo3bo3bo44b4o5b2o3bo9b2o$30bobo b2o4bo12bo5b2o27b2o9b4o4b2o3bo$31b4o14bo4bo4b2o27b2o9bo2bo6bobo$33bo 19bo39bo5b4o7bo$5b2o42bo3bo39bo4b4o$5b2o42bobo46bo3b!golly-3.3-src/Patterns/Life/Breeders/spacefiller.rle0000644000175000017500000000327012026730263017425 00000000000000#C A small spacefiller. #C Spacefillers are the fastest-growing known pattern in Conway's #C Game of Life (probably the fastest possible). They fill space #C to a density of 1/2, conjectured to be the maximum density, #C and they do it at a speed of c/2 in each of the 4 directions, #C which has been proven to be the maximum possible speed. #C This pattern starts with 200 cells, not the record lowest number #C of starting cells for a spacefiller (at the time of this writing, #C the record is 187). Quadratic-growth patterns that start with #C as few as 26 ON cells are now known, but their growth rate is #C comparatively slow. #C The population of spacefillers are easy to compute. This one's #C equations are: #C [(t+17)^2+511]/4 for t divisible by 4; #C [(t+17)^2+608]/4 for t mod 4 = 1; #C [(t+17)^2+563]/4 for t mod 4 = 2; #C [(t+17)^2+580]/4 for t mod 4 = 3. #C Most spacefillers at this time have p2 stretchers on the left and #C right instead of the flipper stretchers in this pattern. #C Original idea and middle part by Al Hensel; original construction #C and top/bottom stretchers by Hartmut Holzwart; size optimization #C by David Bell, Al Hensel, and Tim Coe. #C This spacefiller by Hartmut Holzwart, 4 Nov 1998. #C From Alan Hensel's "lifebc" pattern collection. x = 49, y = 26, rule = B3/S23 20b3o3b3o$19bobbo3bobbo$4o18bo3bo18b4o$o3bo17bo3bo17bo3bo$o8bo12bo3bo 12bo8bo$bobbobboobbo25bobboobbobbo$6bo5bo7b3o3b3o7bo5bo$6bo5bo8bo5bo8b o5bo$6bo5bo8b7o8bo5bo$bobbobboobbobboo4bo7bo4boobbobboobbobbo$o8bo3boo 4b11o4boo3bo8bo$o3bo9boo17boo9bo3bo$4o11b19o11b4o$16bobo11bobo$19b11o$ 19bo9bo$20b9o$24bo$20b3o3b3o$22bo3bo$$21b3ob3o$21b3ob3o$20bobooboobo$ 20b3o3b3o$21bo5bo! golly-3.3-src/Patterns/Life/Breeders/LWSS-breeder.rle0000644000175000017500000011630712026730263017340 00000000000000#C This is, to my knowledge, the first LWSS breeder created. It is a #C type MSM breeder, consisting of an orthogonal, speed c/2 head that #C lays down Gosper guns in such a way that the glider streams #C collide to form LWSS streams travelling orthogonally to the #C direction of propagation of the head. #C #C The head itself consists of three individual glider breeders that #C lay down Gosper guns using the same method used by Bill Gosper to #C create the first breeder. However, instead of being period 64, #C the rakes used here are extensible - in fact, they are "borrowed" #C from a switch engine breeder*. At any rate, the period of the #C rakes must be rather large compared to the width of the glider #C breeders; otherwise, the gliders from the forward-pointing guns #C will collide with either the middle row of Gosper guns or their #C gliders. I could not find any glider rakes of sufficiently high #C period for this purpose, so I borrowed the rake used in that #C switch engine breeder and extended the period by adding ten-odd #C bi-blocks to the wick. This gave a sufficiently large period for #C the pattern not to destroy itself. An interesting consequence #C of the extensibility of the glider rakes is that, by making the #C appropriate changes to the spacing of the Gosper gun assemblies, #C the period of the whole setup can be altered. However, it is #C currently in just about its most compact form -- further #C shortening of the period may result in self-destruction of the #C type mentioned above. #C #C * This switch engine breeder consists of an orthogonal, speed c/2 #C glider backrake and a diagonal, speed c/4 puffer laying down a #C trail of beehives and blocks. When a glider from the backrake #C collides with this trail, a switch engine is born, propagating #C orthogonally to the puffer and 45 degrees from the rake. #C #C Lucas Brown, 24 January 2008, 4:21 PM PST x = 1640, y = 619, rule = B3/S23 1194b2o$1192bo4bo$1198bo129bo$1192bo5bo129b4o$1193b6o27bo89b2o5bo6b2o$ 1224bo3bo83b4ob2o4b3o7bo$1229bo82b6o7b2ob6o$1224bo4bo5bo2bo74b4o4b4o9b obo$1225b5o9bo80bo3bo4bob7o$1235bo3bo82b3o4bo7b2o$1236b4o77b2obobo3b2o 4b2o4b2o$1316b3obo8bo2bo4b2o$1310bo4b2o2b2o8bobo$1308b2o6bo2bo17b2o$ 414b2o129bobo727b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o$ 410b4ob2o128bo2bo725bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o$410b 6o114b6o4bo7b2o725b2o50bo2bo6bob3o$411b4o114bo5bo4bob2o6bo728b2o2b2o2b 2o2b2o2b2o2b2o2b2o24bo4b3o2b2o$445b2o88bo7bo2b6o727b2o2b2o2b2o2b2o2b2o 2b2o2b2o4b2o6b2o8bobo4b2o2b2o$442b3ob2o81bo4bo3b4o3bo7b2o753b2o6bo2bo 17b2o$442b5o8b2o74b2o9bo4bob3o3bo754bo4b2o2b2o8bobo$443b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo675b2o26bo55b3obo8bo2bo4b2o$453b4o82bo5bo3b2o5bo674b 2o27b4o53b2obobo3b2o4b2o4b2o$454b2o73bo5bobo7bob4o3b3o676bo4b2o22b2o 58b3o4bo7b2o$528bo8bo9bo670b4o15b2o26bo54bo3bo4bob7o$523bo4b3o4b3o7bob o6b3o96b2o129bobo430bo3bo17bo4b2o16b4o47b4o4b4o9bobo$190b2o129bobo186b 2o2b2o2b2o2bo22bo5bo5bo91b4ob2o128bo2bo433bo8b4o9b2o21bo45b6o7b2ob6o$ 186b4ob2o128bo2bo185b2o2b2o2b2o2b3o21b2o3bob2o3bo90b6o114b6o4bo7b2o 428bo2bo8b6o10bo4b2o4b2o4bo2b3o44b4ob2o4b3o7bo$186b6o114b6o4bo7b2o219b 3o6bo3bo91b4o114bo5bo4bob2o6bo439b4ob2o13b2o6b2o5b3o49b2o5bo6b2o$187b 4o114bo5bo4bob2o6bo183b2o2b2o2b2o2b3o21b2o3bob2o3bo125b2o88bo7bo2b6o 442b2o15bobo3bobo6bo62b4o$221b2o88bo7bo2b6o182b2o2b2o2b2o2bo22bo5bo5bo 123b3ob2o81bo4bo3b4o3bo7b2o103b2o351bobo3bobobob3o63bo$218b3ob2o81bo4b o3b4o3bo7b2o192bo4b3o4b3o7bobo6b3o124b5o8b2o74b2o9bo4bob3o3bo100bo4bo 359b2o2bo$218b5o8b2o74b2o9bo4bob3o3bo113b3o80bo8bo9bo134b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo105bo129bo226bo3b2o$219b3o7b2ob2o78bo2bob2o2bob2o3bo 3bo144bobo49bo5bobo7bob4o3b3o135b4o82bo5bo3b2o5bo99bo5bo129b4o216b4o4b 4o$229b4o76bobo3bo5bo3b2o5bo112b2o4b3o23bo2bo58bo5bo3b2o5bo136b2o73bo 5bobo7bob4o3b3o100b6o27bo89b2o5bo6b2o215b6o$230b2o76bo4bo7bob4o3b3o 103b2o13bo28b2o54bo2bob2o2bob2o3bo3bo210bo8bo9bo140bo3bo83b4ob2o4b3o7b o213b4ob2o2b4o$302bo5bo4bo9bo111b4o13bo4b3o22bo48b2o9bo4bob3o3bo206bo 4b3o4b3o7bobo6b3o136bo82b6o7b2ob6o217b2o2bo3b2o$301bo6b2o2b2o7bobo6b3o 102b2ob2o8b2o7bo22b4o45bo4bo3b4o3bo7b2o194b2o2b2o2b2o2bo22bo5bo5bo130b o4bo5bo2bo74b4o4b4o9bobo220b2o2bo$232b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b3o6b2o9bo5bo5bo103b2o7bo4bo6bo4b3o 6b2o5bo4bo50bo7bo2b6o197b2o2b2o2b2o2b3o21b2o3bob2o3bo130b5o9bo80bo3bo 4bob7o217bobob3o$233bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o24b2o3bob2o3bo117bo10bo6b2o2b2o5bo2bo44bo5bo4bob2o6bo 194b2o37b3o6bo3bo140bo3bo82b3o4bo7b2o216bo6bo$228bo3bo88b3o6bo3bo111bo 5bo11bo5bo4bo5bo2bo45b6o4bo7b2o195b2o2b2o2b2o2b2o2b3o21b2o3bob2o3bo 141b4o72bobo3bobobo3b2o4b2o4b2o214b2o5b3o$227bo8b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o24b2o3bob2o3bo112b6o17bo4bo 7bo61bo2bo196b2o2b2o2b2o2b2o2bo22bo5bo5bo218bobo3bobo8bo2bo4b2o213b3o 4bo2b3o$228bo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b3o6b2o9bo5bo5bo137bobo3bob4o62bobo214bo4b3o4b3o7bobo6b3o 218b2o6b2o8bobo220bo10bo$301bo6b2o2b2o7bobo6b3o141bo2bo3bo202b3o80bo8b o9bo223bo4b2o4b2o17b2o220b4o$302bo5bo4bo9bo145b2o9bo235bobo49bo5bobo7b ob4o3b3o188b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o222bo$224b3o26bobo 52bo4bo7bob4o3b3o134bo4bo3b5o203b2o4b3o23bo2bo58bo5bo3b2o5bo187bobo2b 2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o218b2o$224bo28bo2bo52bobo3bo5bo3b2o 5bo140bo201b2o13bo28b2o54bo2bob2o2bob2o3bo3bo184b2o48bo2bo6bob3o215b4o $212b2o11bo4b3o23b2o54bo2bob2o2bob2o3bo3bo134bo5bo2b5o193b4o13bo4b3o 22bo48b2o9bo4bob3o3bo184bo5bo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o216bo $211b4o15bo27bo48b2o9bo4bob3o3bo136b6o6bo193b2ob2o8b2o7bo22b4o45bo4bo 3b4o3bo7b2o186b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$211b2ob2o8b 2o5bo4b3o17b4o45bo4bo3b4o3bo7b2o146bo3bo194b2o7bo4bo6bo4b3o6b2o5bo4bo 50bo7bo2b6o193bo25bo4b2o4b2o17b2o$213b2o7bo4bo8bo18bo4bo50bo7bo2b6o 149bob4o208bo10bo6b2o2b2o5bo2bo44bo5bo4bob2o6bo142b2o80b2o6b2o8bobo$ 228bo8bo4b3o4b3o5bo2bo44bo5bo4bob2o6bo148bo7bo201bo5bo11bo5bo4bo5bo2bo 45b6o4bo7b2o142b2o30bo51bobo3bobo8bo2bo4b2o$222bo5bo13bo8bo5bo2bo45b6o 4bo7b2o149bo5bo2bo201b6o17bo4bo7bo61bo2bo143b2o5b2o23b4o48bobo3bobobo 3b2o4b2o4b2o$223b6o14bo5bobo7bo61bo2bo147bob2o5bo2bo225bobo3bob4o62bob o150b2o26b2o58b3o4bo7b2o$253bob4o62bobo148bo6bo4bo228bo2bo3bo200b4o14b o4b2o22bo54bo3bo4bob7o$250bo2bo3bo222b4o224b2o9bo200bo3bo18b2o20b4o47b 4o4b4o9bobo$245b2o9bo225bo223bo4bo3b5o204bo8b4o8bo4b2o6b2o9bo45b6o7b2o b6o$243bo4bo3b5o223b2o230bo207bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o 7bo$249bo227bo2bo225bo5bo2b5o212b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o$ 243bo5bo2b5o220bobo227b6o6bo216b2o19b3obo6bo62b4o457b2o$244b6o6bo459bo 3bo237b2obobob3o63bo458bo4bo$253bo3bo458bob4o241b2o2bo528bo129bo$253bo b4o455bo7bo238bo3b2o523bo5bo129b4o$251bo7bo454bo5bo2bo230b4o4b4o525b6o 27bo89b2o5bo6b2o$251bo5bo2bo450bob2o5bo2bo229b6o563bo3bo83b4ob2o4b3o7b o$248bob2o5bo2bo450bo6bo4bo229b4ob2o2b4o561bo82b6o7b2ob6o$248bo6bo4bo 458b4o234b2o2bo3b2o555bo4bo5bo2bo74b4o4b4o9bobo$256b4o461bo241b2o2bo 555b5o9bo80bo3bo4bob7o$258bo460b2o240bobob3o565bo3bo82b3o4bo7b2o$256b 2o458bo2bo241bo6bo565b4o72bobo3bobobo3b2o4b2o4b2o$253bo2bo459bobo241b 2o5b3o640bobo3bobo8bo2bo4b2o$253bobo702b3o4bo2b3o638b2o6b2o8bobo$958bo 10bo65bobo567bo4b2o4b2o17b2o$965b4o66b2o550b2o2b2o2b2o2b2o2b2o20bobo4b 2o2b2o$968bo40b2o25bo541b2o3b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o$965b2o 38b4ob2o613bo2bo6bob3o$963b4o38b6o573bo2b2o2b2o2b2o2b2o3b2o21bo4b3o2b 2o$963bo42b4o573b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$1605bo4b2o4b2o 17b2o$1527b2o80b2o6b2o8bobo$1526b2o30bo51bobo3bobo8bo2bo4b2o$1526b2o5b 2o23b4o48bobo3bobobo3b2o4b2o4b2o$1532b2o26b2o58b3o4bo7b2o$443b2o290b2o 779b4o14bo4b2o22bo54bo3bo4bob7o$443b2o290b2o778bo3bo18b2o20b4o47b4o4b 4o9bobo$1519bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o$1515bo2bo8b6o11b2o6bo2bo 4bo2b3o44b4ob2o4b3o7bo$1527b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o$1531b2o 19b3obo6bo62b4o$1553b2obobob3o63bo$1036bo521b2o2bo$1035b2o519bo3b2o$ 1035bobo511b4o4b4o$444b2o290b2o810b6o$443bo2bo288bo2bo809b4ob2o2b4o$ 443bo2bo288bo2bo813b2o2bo3b2o$444b2o290b2o820b2o2bo$1556bobob3o$1556bo 6bo$1555b2o5b3o$1553b3o4bo2b3o$1553bo10bo$1560b4o$1563bo$1560b2o$446b 2o1110b4o$445bo2bo1109bo$445bo2bo$446b2o9$445b2o290b2o290b2o290b2o$ 445b2o290b2o290b2o290b2o2$1321b2o$1321b2o3$673bo$673b4o629b2o$675b2o 625b4ob2o$678bo623b6o$675b4o614bo9b4o$668bo10bo613b4o$668b3o4bo2b3o 614b2o$670b2o5b3o326bobo289bo$259bo411bo6bo327bo2bo285b4o259bo$259b4o 408bobob3o331b2o277bo10bo258b4o$261b2o410b2o2bo333bo276b3o4bo2b3o259b 2o$264bo402b2o2bo3b2o332b4o277b2o5b3o263bo$261b4o398b4ob2o2b4o325bo6bo 4bo277bo6bo261b4o$254bo10bo397b6o332bob2o5bo2bo277bobob3o255bo10bo$ 254b3o4bo2b3o397b4o4b4o328bo5bo2bo279b2o2bo255b3o4bo2b3o$256b2o5b3o 405bo3b2o327bo7bo274b2o2bo3b2o258b2o5b3o$257bo6bo408b2o2bo328bob4o271b 4ob2o2b4o260bo6bo$257bobob3o404b2obobob3o63bo264bo3bo272b6o267bobob3o$ 259b2o2bo215bobo164b2o19b3obo6bo62b4o252b6o6bo274b4o4b4o262b2o2bo$253b 2o2bo3b2o216bo2bo159b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o251bo5bo2b5o281b o3b2o255b2o2bo3b2o$249b4ob2o2b4o220b2o146bo2bo8b6o11b2o6bo2bo4bo2b3o 44b4ob2o4b3o7bo255bo290b2o2bo250b4ob2o2b4o$249b6o229bo149bo8b4o8bo4b2o 6b2o9bo45b6o7b2ob6o249bo4bo3b5o278b2obobob3o63bo186b6o$250b4o4b4o220b 4o144bo3bo18b2o20b4o47b4o4b4o9bobo248b2o9bo256b2o19b3obo6bo62b4o184b4o 4b4o$257bo3b2o211bo6bo4bo144b4o14bo4b2o22bo54bo3bo4bob7o252bo2bo3bo 251b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o191bo3b2o$259b2o2bo210bob2o5bo2bo 160b2o26b2o58b3o4bo7b2o248bobo3bob4o62bobo173bo2bo8b6o11b2o6bo2bo4bo2b 3o44b4ob2o4b3o7bo191b2o2bo$254b2obobob3o63bo149bo5bo2bo154b2o5b2o23b4o 48bobo3bobobo3b2o4b2o4b2o223b6o17bo4bo7bo61bo2bo176bo8b4o8bo4b2o6b2o9b o45b6o7b2ob6o186b2obobob3o63bo$232b2o19b3obo6bo62b4o146bo7bo155b2o30bo 51bobo3bobo8bo2bo4b2o223bo5bo11bo5bo4bo5bo2bo45b6o4bo7b2o171bo3bo18b2o 20b4o47b4o4b4o9bobo161b2o19b3obo6bo62b4o$228b4ob2o12bo4b2o2b2o5b3o49b 2o5bo6b2o148bob4o157b2o80b2o6b2o8bobo236bo10bo6b2o2b2o5bo2bo44bo5bo4bo b2o6bo171b4o14bo4b2o22bo54bo3bo4bob7o156b4ob2o12bo4b2o2b2o5b3o49b2o5bo 6b2o$216bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo146bo3bo210bo25bo4b 2o4b2o17b2o214b2o7bo4bo6bo4b3o6b2o5bo4bo50bo7bo2b6o186b2o26b2o58b3o4bo 7b2o143bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo$220bo8b4o8bo4b2o6b2o 9bo45b6o7b2ob6o137b6o6bo207b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b 2o211b2ob2o8b2o7bo22b4o45bo4bo3b4o3bo7b2o177b2o5b2o23b4o48bobo3bobobo 3b2o4b2o4b2o146bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o$216bo3bo18b2o20b4o47b 4o4b4o9bobo133bo5bo2b5o206bo5bo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o 210b4o13bo4b3o22bo48b2o9bo4bob3o3bo176b2o30bo51bobo3bobo8bo2bo4b2o143b o3bo18b2o20b4o47b4o4b4o9bobo$217b4o14bo4b2o22bo54bo3bo4bob7o138bo214b 2o48bo2bo6bob3o210b2o13bo28b2o54bo2bob2o2bob2o3bo3bo176b2o80b2o6b2o8bo bo151b4o14bo4b2o22bo54bo3bo4bob7o$233b2o26b2o58b3o4bo7b2o131bo4bo3b5o 210bobo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o220b2o4b3o23bo2bo58bo5bo3b 2o5bo232bo21bo4b2o4b2o17b2o160b2o26b2o58b3o4bo7b2o$227b2o5b2o23b4o48bo bo3bobobo3b2o4b2o4b2o132b2o9bo211b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o 2b2o253bobo49bo5bobo7bob4o3b3o228b2o3bo2b2o2b2o2b2o2b2o2b2o20bobo4b2o 2b2o153b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o$227b2o30bo51bobo3bobo8bo 2bo4b2o138bo2bo3bo236bo4b2o4b2o17b2o222b3o80bo8bo9bo236bo5bo2b2o2b2o2b 2o2b2o3b2o21bo4b3o2b2o152b2o30bo51bobo3bobo8bo2bo4b2o$228b2o80b2o6b2o 8bobo142bobo3bob4o62bobo174b2o6b2o8bobo307bo4b3o4b3o7bobo6b3o228b2o44b o2bo6bob3o152b2o80b2o6b2o8bobo$306bo4b2o4b2o17b2o111b6o17bo4bo7bo61bo 2bo174bobo3bobo8bo2bo4b2o283b2o2b2o2b2o2b2o2bo22bo5bo5bo230bobo2b2o2b 2o2b2o2b2o3b2o21bo4b3o2b2o231bo4b2o4b2o17b2o$240b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o109bo5bo 11bo5bo4bo5bo2bo45b6o4bo7b2o97b4o72bobo3bobobo3b2o4b2o4b2o282b2o2b2o2b 2o2b2o2b3o21b2o3bob2o3bo230b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o210b2o 2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$240b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o114bo10bo6b2o2b2o5bo2b o44bo5bo4bob2o6bo95bo3bo82b3o4bo7b2o283b2o37b3o6bo3bo252bo4b2o4b2o17b 2o212bo2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o$236b2o88bo2bo6bob3o98b2o7bo4bo 6bo4b3o6b2o5bo4bo50bo7bo2b6o84b5o9bo80bo3bo4bob7o288b2o2b2o2b2o2b3o21b 2o3bob2o3bo256b2o6b2o8bobo260bo2bo6bob3o$235bo2bob2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o97b2ob2o8b2o 7bo22b4o45bo4bo3b4o3bo7b2o80bo4bo5bo2bo74b4o4b4o9bobo289b2o2b2o2b2o2bo 22bo5bo5bo258bobo3bobo8bo2bo4b2o206b2o3b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o 2b2o$236b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o20bobo4b2o2b2o98b4o13bo4b3o22bo48b2o9bo4bob3o3bo84bo82b6o7b 2ob6o305bo4b3o4b3o7bobo6b3o183b4o72bobo3bobobo3b2o4b2o4b2o214b2o2b2o2b 2o2b2o2b2o20bobo4b2o2b2o$306bo4b2o4b2o17b2o100b2o13bo28b2o54bo2bob2o2b ob2o3bo3bo78bo3bo83b4ob2o4b3o7bo310bo8bo9bo191bo3bo82b3o4bo7b2o233bo4b 2o4b2o17b2o$310b2o6b2o8bobo116b2o4b3o23bo2bo58bo5bo3b2o5bo47b6o27bo89b 2o5bo6b2o238b2o73bo5bobo7bob4o3b3o172b5o9bo80bo3bo4bob7o238b2o6b2o8bob o$311bobo3bobo8bo2bo4b2o141bobo49bo5bobo7bob4o3b3o46bo5bo129b4o237b4o 82bo5bo3b2o5bo171bo4bo5bo2bo74b4o4b4o9bobo240bobo3bobo8bo2bo4b2o$235b 4o72bobo3bobobo3b2o4b2o4b2o108b3o80bo8bo9bo61bo129bo230b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo176bo82b6o7b2ob6o167b4o72bobo3bobobo3b2o4b2o4b2o$ 234bo3bo82b3o4bo7b2o187bo4b3o4b3o7bobo6b3o46bo4bo360b5o8b2o74b2o9bo4bo b3o3bo172bo3bo83b4ob2o4b3o7bo166bo3bo82b3o4bo7b2o$224b5o9bo80bo3bo4bob 7o175b2o2b2o2b2o2bo22bo5bo5bo47b2o362b3ob2o81bo4bo3b4o3bo7b2o142b6o27b o89b2o5bo6b2o158b5o9bo80bo3bo4bob7o$223bo4bo5bo2bo74b4o4b4o9bobo176b2o 2b2o2b2o2b3o21b2o3bob2o3bo413b2o88bo7bo2b6o144bo5bo129b4o157bo4bo5bo2b o74b4o4b4o9bobo$228bo82b6o7b2ob6o214b3o6bo3bo379b4o114bo5bo4bob2o6bo 151bo129bo165bo82b6o7b2ob6o$223bo3bo83b4ob2o4b3o7bo179b2o2b2o2b2o2b3o 21b2o3bob2o3bo378b6o114b6o4bo7b2o146bo4bo291bo3bo83b4ob2o4b3o7bo$192b 6o27bo89b2o5bo6b2o181b2o2b2o2b2o2bo22bo5bo5bo379b4ob2o128bo2bo149b2o 262b6o27bo89b2o5bo6b2o$191bo5bo129b4o194bo4b3o4b3o7bobo6b3o384b2o129bo bo413bo5bo129b4o$197bo129bo202bo8bo9bo946bo129bo$191bo4bo259b2o73bo5bo bo7bob4o3b3o931bo4bo$193b2o260b4o82bo5bo3b2o5bo933b2o$445b3o7b2ob2o78b o2bob2o2bob2o3bo3bo$444b5o8b2o74b2o9bo4bob3o3bo$444b3ob2o81bo4bo3b4o3b o7b2o$447b2o88bo7bo2b6o$413b4o114bo5bo4bob2o6bo$412b6o114b6o4bo7b2o$ 412b4ob2o128bo2bo$416b2o129bobo56$410b4o$409b6o115b2o12bobo$409b4ob2o 112bo4bo10bo2bo$413b2o119bo4bo7b2o$442b3o83bo5bo4bob2o6bo$441b5o83b6o 7bo2b6o$441b3ob2o6b2o82b4o3bo7b2o$444b2o6b4o85bo4bob3o3bo$452b2ob2o78b o2bob2o2bob2o3bo3bo$454b2o82bo5bo3b2o5bo$533b2obo7bob4o3b3o$189b6o129b o201bo6bo2bo9bo390b4o547b6o129bo$188bo5bo114b4o11b4o198bobo4bo2bo7bobo 6b3o380b6o115b2o12bobo413bo5bo114b4o11b4o$194bo113b6o5bo6b2o180b2o2b2o 2b2o2bo5b2o6b2o8bo5bo5bo379b4ob2o112bo4bo10bo2bo418bo113b6o5bo6b2o$ 188bo4bo114b4ob2o4b3o7bo178b2o2b2o2b2o2b2o23b2o3bob2o3bo382b2o119bo4bo 7b2o411bo4bo114b4ob2o4b3o7bo$190b2o29b5o86b2o7b2ob6o214b3o6bo3bo411b3o 83bo5bo4bob2o6bo146b6o129bo130b2o29b5o86b2o7b2ob6o$220bo4bo91b4o9bobo 175b2o2b2o2b2o2b2o23b2o3bob2o3bo410b5o83b6o7bo2b6o144bo5bo114b4o11b4o 157bo4bo91b4o9bobo$225bo6b4o80bo3bo4bob7o174b2o2b2o2b2o2bo5b2o6b2o8bo 5bo5bo411b3ob2o6b2o82b4o3bo7b2o147bo113b6o5bo6b2o162bo6b4o80bo3bo4bob 7o$220bo3bo6bo3bo82b3o4bo7b2o191bobo4bo2bo7bobo6b3o415b2o6b4o85bo4bob 3o3bo140bo4bo114b4ob2o4b3o7bo155bo3bo6bo3bo82b3o4bo7b2o$222bo12bo78bob obo3b2o4b2o4b2o108b2o80bo6bo2bo9bo56b6o129bo240b2ob2o78bo2bob2o2bob2o 3bo3bo141b2o29b5o86b2o7b2ob6o157bo12bo78bobobo3b2o4b2o4b2o$231bo2bo79b obo8bo2bo4b2o114b2o25bobo54b2obo7bob4o3b3o46bo5bo114b4o11b4o239b2o82bo 5bo3b2o5bo171bo4bo91b4o9bobo163bo2bo79bobo8bo2bo4b2o$306bobo4bob2o8bob o121bobo24bo2bo58bo5bo3b2o5bo52bo113b6o5bo6b2o318b2obo7bob4o3b3o176bo 6b4o80bo3bo4bob7o237bobo4bob2o8bobo$236bo69b2o6b2o17b2o114bo5b2o22b2o 54bo2bob2o2bob2o3bo3bo46bo4bo114b4ob2o4b3o7bo309bo6bo2bo9bo180bo3bo6bo 3bo82b3o4bo7b2o236b2o6b2o17b2o$232b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o100b2o17bobo23bo 59bo4bob3o3bo49b2o29b5o86b2o7b2ob6o309bobo4bo2bo7bobo6b3o173bo12bo78bo bobo3b2o4b2o4b2o213b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$231bo5bo2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o 2b2o97b2ob2o16bo5b2o7b2o7b4o54b4o3bo7b2o80bo4bo91b4o9bobo288b2o2b2o2b 2o2bo5b2o6b2o8bo5bo5bo181bo2bo79bobo8bo2bo4b2o214b2o2b2o2b2o2b2o2b2o 23bo4b3o2b2o$232b2o89bo2bo6bob3o96b4o23bobo4bo4bo4bo4bo45b6o7bo2b6o88b o6b4o80bo3bo4bob7o287b2o2b2o2b2o2b2o23b2o3bob2o3bo255bobo4bob2o8bobo 217b2o41bo2bo6bob3o$235bobo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o98b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob 2o6bo84bo3bo6bo3bo82b3o4bo7b2o282b2obo36b3o6bo3bo255b2o6b2o17b2o209bo 2bob2o2b2o2b2o2b2o2b2o23bo4b3o2b2o$236b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o109bo5bo15bo6b o5bo2bo50bo4bo7b2o87bo12bo78bobobo3b2o4b2o4b2o280bo2b4o2b2o2b2o2b2o23b 2o3bob2o3bo229b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o209b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$224bo81b2o6b2o17b2o116bo15b3o2bobo 7bo45bo4bo10bo2bo97bo2bo79bobo8bo2bo4b2o282b2ob3o2b2o2b2o2bo5b2o6b2o8b o5bo5bo231bo2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o152bo81b2o6b2o17b2o$224bo 81bobo4bob2o8bobo117bo4bo17b2o6bob4o48b2o12bobo173bobo4bob2o8bobo311bo bo4bo2bo7bobo6b3o274bo2bo6bob3o151bo81bobo4bob2o8bobo$225bo4bo25bo57bo bo8bo2bo4b2o112b2o24bo2bo3bo239b2o6b2o17b2o222b2o80bo6bo2bo9bo235b2o3b 2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o153bo4bo25bo57bobo8bo2bo4b2o$229b2o 25b4o54bobobo3b2o4b2o4b2o143bo210b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bo bo4b2o2b2o226b2o25bobo54b2obo7bob4o3b3o235b2o2b2o2b2o2b2o2bobo4bo6bo8b obo4b2o2b2o158b2o25b4o54bobobo3b2o4b2o4b2o$213bo2bo12bobo4bo21b2o58b3o 4bo7b2o140b5o211bo2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o225bobo24bo2bo 58bo5bo3b2o5bo175bo81b2o6b2o17b2o143bo2bo12bobo4bo21b2o58b3o4bo7b2o$ 217bo17b2o24bo54bo3bo4bob7o133b6o264bo2bo6bob3o224bo5b2o22b2o54bo2bob 2o2bob2o3bo3bo175bo81bobo4bob2o8bobo154bo17b2o24bo54bo3bo4bob7o$213bo 3bo17bobo4bo15b4o55b4o9bobo133bo5bo2b5o205b2o3b2o2b2o2b2o2b2o2b2o2b2o 2b2o23bo4b3o2b2o212b2o17bobo23bo59bo4bob3o3bo177bo4bo25bo57bobo8bo2bo 4b2o143bo3bo17bobo4bo15b4o55b4o9bobo$214b4o23b2o6b4o9bo49b2o7b2ob6o 142bo6bo214b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o211b2ob2o16bo5b 2o7b2o7b4o54b4o3bo7b2o182b2o25b4o54bobobo3b2o4b2o4b2o143b4o23b2o6b4o9b o49b2o7b2ob6o$229b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo136bo4bo4bo3bo157b o81b2o6b2o17b2o212b4o23bobo4bo4bo4bo4bo45b6o7bo2b6o169bo2bo12bobo4bo 21b2o58b3o4bo7b2o159b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$225b4ob2o15b2o 4b2o5b3o45b6o5bo6b2o140b2o6bob4o156bo81bobo4bob2o8bobo220b2o9b6o9bo5bo 6bo5bo2bo44bo5bo4bob2o6bo174bo17b2o24bo54bo3bo4bob7o156b4ob2o15b2o4b2o 5b3o45b6o5bo6b2o$225b6o17b2o2bobo6bo47b4o11b4o146bo7bo156bo4bo25bo57bo bo8bo2bo4b2o223bo5bo15bo6bo5bo2bo50bo4bo7b2o171bo3bo17bobo4bo15b4o55b 4o9bobo157b6o17b2o2bobo6bo47b4o11b4o$226b4o22bobobob3o63bo149bo5bo2bo 159b2o25b4o54bobobo3b2o4b2o4b2o228bo15b3o2bobo7bo45bo4bo10bo2bo173b4o 23b2o6b4o9bo49b2o7b2ob6o161b4o22bobobob3o63bo$248bo7b2o2bo210bob2o5bo 2bo143bo2bo12bobo4bo21b2o58b3o4bo7b2o223bo4bo17b2o6bob4o48b2o12bobo 189b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo183bo7b2o2bo$254bo3b2o211bo6bo4b o147bo17b2o24bo54bo3bo4bob7o226b2o24bo2bo3bo251b4ob2o15b2o4b2o5b3o45b 6o5bo6b2o191bo3b2o$255b4o220b4o144bo3bo17bobo4bo15b4o55b4o9bobo259bo 252b6o17b2o2bobo6bo47b4o11b4o192b4o$250b2o229bo146b4o23b2o6b4o9bo49b2o 7b2ob6o258b5o253b4o22bobobob3o63bo190b2o$246b4ob2o2b4o220b2o162b2o10bo bo4b6o4bo2b3o44b4ob2o4b3o7bo250b6o282bo7b2o2bo250b4ob2o2b4o$246b6o2bo 3b2o216bo2bo159b4ob2o15b2o4b2o5b3o45b6o5bo6b2o251bo5bo2b5o281bo3b2o 251b6o2bo3b2o$247b4o5b2o2bo215bobo160b6o17b2o2bobo6bo47b4o11b4o257bo6b o282b4o253b4o5b2o2bo$254bobob3o379b4o22bobobob3o63bo254bo4bo4bo3bo276b 2o267bobob3o$254bo6bo400bo7b2o2bo320b2o6bob4o271b4ob2o2b4o260bo6bo$ 253b2o5b3o405bo3b2o327bo7bo270b6o2bo3b2o258b2o5b3o$251b3o4bo2b3o405b4o 328bo5bo2bo270b4o5b2o2bo255b3o4bo2b3o$251bo10bo401b2o332bob2o5bo2bo 277bobob3o255bo10bo$258b4o398b4ob2o2b4o325bo6bo4bo277bo6bo261b4o$261bo 398b6o2bo3b2o332b4o277b2o5b3o263bo$258b2o401b4o5b2o2bo333bo276b3o4bo2b 3o259b2o$256b4o408bobob3o331b2o277bo10bo258b4o$256bo411bo6bo327bo2bo 285b4o259bo$667b2o5b3o326bobo289bo$665b3o4bo2b3o614b2o$665bo10bo613b4o $672b4o614bo$675bo627b2o$672b2o625b4ob2o$670b4o625b6o$670bo629b4o3$ 1317b2o$1317b2o2$441b2o290b2o290b2o290b2o$441b2o290b2o290b2o290b2o9$ 442b2o$441bo2bo$441bo2bo1110bo$442b2o1111b4o$1557b2o$1560bo$1557b4o$ 1550bo10bo$1550b3o4bo2b3o$1552b2o5b3o$1553bo6bo$1553bobob3o$440b2o290b 2o812b4o5b2o2bo$439bo2bo288bo2bo810b6o2bo3b2o$439bo2bo288bo2bo810b4ob 2o2b4o$440b2o290b2o815b2o$1032bo521b4o$1030b2o521bo3b2o$1031b2o514bo7b 2o2bo$1525b4o22bobobob3o63bo$1524b6o17b2o2bobo6bo47b4o11b4o$1524b4ob2o 15b2o4b2o5b3o45b6o5bo6b2o$1528b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$ 1513b4o23b2o6b4o9bo49b2o7b2ob6o$439b2o290b2o779bo3bo17bobo4bo15b4o55b 4o9bobo$439b2o290b2o783bo17b2o24bo54bo3bo4bob7o$1512bo2bo12bobo4bo21b 2o58b3o4bo7b2o$1528b2o25b4o54bobobo3b2o4b2o4b2o$1524bo4bo25bo57bobo8bo 2bo4b2o$1523bo81bobo4bob2o8bobo$1523bo81b2o6b2o17b2o$960bo618b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$960b4o42b2o570bo2bob2o2b2o2b2o2b2o 2b2o23bo4b3o2b2o$962b2o38b4ob2o570b2o41bo2bo6bob3o$965bo36b6o23b2o550b 2o2b2o2b2o2b2o2b2o23bo4b3o2b2o$962b4o37b4o23b2o551b2o2b2o2b2o2b2o2bobo 4bo6bo8bobo4b2o2b2o$955bo10bo65bo572b2o6b2o17b2o$250bobo702b3o4bo2b3o 637bobo4bob2o8bobo$250bo2bo459bobo241b2o5b3o563bo2bo79bobo8bo2bo4b2o$ 253b2o458bo2bo241bo6bo555bo12bo78bobobo3b2o4b2o4b2o$255bo460b2o240bobo b3o554bo3bo6bo3bo82b3o4bo7b2o$253b4o461bo232b4o5b2o2bo559bo6b4o80bo3bo 4bob7o$245bo6bo4bo458b4o230b6o2bo3b2o555bo4bo91b4o9bobo$245bob2o5bo2bo 450bo6bo4bo229b4ob2o2b4o526b2o29b5o86b2o7b2ob6o$248bo5bo2bo450bob2o5bo 2bo233b2o531bo4bo114b4ob2o4b3o7bo$248bo7bo454bo5bo2bo238b4o530bo113b6o 5bo6b2o$242b2o6bob4o455bo7bo238bo3b2o523bo5bo114b4o11b4o$240bo4bo4bo3b o450b2o6bob4o233bo7b2o2bo523b6o129bo$246bo6bo449bo4bo4bo3bo212b4o22bob obob3o63bo$240bo5bo2b5o220bobo232bo6bo212b6o17b2o2bobo6bo47b4o11b4o$ 241b6o227bo2bo225bo5bo2b5o212b4ob2o15b2o4b2o5b3o45b6o5bo6b2o$249b5o 223b2o225b6o223b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$253bo225bo232b5o 201b4o23b2o6b4o9bo49b2o7b2ob6o$221b2o24bo2bo3bo222b4o235bo200bo3bo17bo bo4bo15b4o55b4o9bobo$219bo4bo25bob4o48b2o12bobo148bo6bo4bo202b2o24bo2b o3bo203bo17b2o24bo54bo3bo4bob7o$225bo19b2obo7bo45bo4bo10bo2bo147bob2o 5bo2bo200bo4bo17b2o6bob4o48b2o12bobo133bo2bo12bobo4bo21b2o58b3o4bo7b2o $219bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o149bo5bo2bo206bo15b3o2bobo7bo45bo 4bo10bo2bo148b2o25b4o54bobobo3b2o4b2o4b2o$209b2o9b6o12bobo4bo2bo5bo2bo 44bo5bo4bob2o6bo148bo7bo201bo5bo15bo6bo5bo2bo50bo4bo7b2o143bo4bo25bo 57bobo8bo2bo4b2o$208b4o20bo5b2o6b2o4bo4bo45b6o7bo2b6o141b2o6bob4o192b 2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo141bo81bobo4bob2o8bobo$208b2ob2o 19bobo18b4o54b4o3bo7b2o136bo4bo4bo3bo192b4o23bobo4bo4bo4bo4bo45b6o7bo 2b6o140bo81b2o6b2o17b2o$210b2o14bo5b2o21bo59bo4bob3o3bo141bo6bo193b2ob 2o16bo5b2o7b2o7b4o54b4o3bo7b2o193b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b 2o2b2o$220bo5bobo24b2o54bo2bob2o2bob2o3bo3bo134bo5bo2b5o195b2o17bobo 23bo59bo4bob3o3bo183b2o3b2o2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o216bo$ 220bo5b2o22bo2bo50b2o6bo5bo3b2o5bo135b6o215bo5b2o22b2o54bo2bob2o2bob2o 3bo3bo234bo2bo6bob3o215b4o$220bobo27bobo50b3o2bobo7bob4o3b3o143b5o208b obo24bo2bo58bo5bo3b2o5bo188bo2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o218b 2o$220b2o81bo6bo9bo156bo208b2o25bobo54b2obo7bob4o3b3o187b2o2b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o222bo$297bo5bo6bo7bobo6b3o115b2o24bo 2bo3bo202b2o80bo6bo2bo9bo226b2o6b2o17b2o220b4o$232b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo112bo 4bo17b2o6bob4o48b2o12bobo218bobo4bo2bo7bobo6b3o217bobo4bob2o8bobo220bo 10bo$232b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o3b2o7b2o11b2o3bob2o3bo117bo15b3o2bobo7bo45bo4bo10bo2bo195b2ob3o2b2o 2b2o2bo5b2o6b2o8bo5bo5bo141bo2bo79bobo8bo2bo4b2o213b3o4bo2b3o$228b2o 88b3o6bo3bo111bo5bo15bo6bo5bo2bo50bo4bo7b2o193bo2b4o2b2o2b2o2b2o23b2o 3bob2o3bo131bo12bo78bobobo3b2o4b2o4b2o214b2o5b3o$228b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o 3bo101b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo193b2obo36b3o6bo3bo129bo3b o6bo3bo82b3o4bo7b2o216bo6bo$228b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo101b4o23bobo4bo4bo4bo 4bo45b6o7bo2b6o196b2o2b2o2b2o2b2o23b2o3bob2o3bo134bo6b4o80bo3bo4bob7o 217bobob3o$297bo5bo6bo7bobo6b3o102b2ob2o16bo5b2o7b2o7b4o54b4o3bo7b2o 193b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo130bo4bo91b4o9bobo211b4o5b2o2bo$303b o6bo9bo113b2o17bobo23bo59bo4bob3o3bo210bobo4bo2bo7bobo6b3o101b2o29b5o 86b2o7b2ob6o213b6o2bo3b2o$303b3o2bobo7bob4o3b3o117bo5b2o22b2o54bo2bob 2o2bob2o3bo3bo209bo6bo2bo9bo108bo4bo114b4ob2o4b3o7bo213b4ob2o2b4o$228b 2o74b2o6bo5bo3b2o5bo117bobo24bo2bo58bo5bo3b2o5bo216b2obo7bob4o3b3o105b o113b6o5bo6b2o219b2o$226b2ob2o78bo2bob2o2bob2o3bo3bo117b2o25bobo54b2ob o7bob4o3b3o137b2o82bo5bo3b2o5bo99bo5bo114b4o11b4o224b4o$218b2o6b4o85bo 4bob3o3bo113b2o80bo6bo2bo9bo144b2ob2o78bo2bob2o2bob2o3bo3bo100b6o129bo 226bo3b2o$215b3ob2o6b2o82b4o3bo7b2o196bobo4bo2bo7bobo6b3o127b2o6b4o85b o4bob3o3bo465b2o2bo$215b5o83b6o7bo2b6o181b2o2b2o2b2o2bo5b2o6b2o8bo5bo 5bo123b3ob2o6b2o82b4o3bo7b2o436b4o22bobobob3o63bo$216b3o83bo5bo4bob2o 6bo182b2o2b2o2b2o2b2o23b2o3bob2o3bo122b5o83b6o7bo2b6o438b6o21bobo6bo 47b4o11b4o$187b2o119bo4bo7b2o219b3o6bo3bo123b3o83bo5bo4bob2o6bo439b4ob 2o12bobo4bob2o5b3o45b6o5bo6b2o$183b4ob2o112bo4bo10bo2bo184b2o2b2o2b2o 2b2o23b2o3bob2o3bo94b2o119bo4bo7b2o444b2o13b2o6b2o4bo2b3o44b4ob2o4b3o 7bo$183b6o115b2o12bobo185b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo91b4ob2o112bo 4bo10bo2bo430b4o20bobo4bo6bo9bo49b2o7b2ob6o$184b4o336bobo4bo2bo7bobo6b 3o92b6o115b2o12bobo430bo3bo20b2o18b4o55b4o9bobo$524bo6bo2bo9bo102b4o 567bo8b2o4bobo4bo21bo54bo3bo4bob7o$531b2obo7bob4o3b3o660bo2bo15b2o24b 2o50bo7b3o4bo7b2o$452b2o82bo5bo3b2o5bo673bobo4bo22b4o54bobobo3b2o4b2o 4b2o$450b2ob2o78bo2bob2o2bob2o3bo3bo673b2o28bo53b2o2bobo8bo2bo4b2o$ 442b2o6b4o85bo4bob3o3bo675bo81b2o4b2o8bobo$439b3ob2o6b2o82b4o3bo7b2o 752bobo4b6o17b2o$439b5o83b6o7bo2b6o726b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o 6b4o8bobo4b2o2b2o$440b3o83bo5bo4bob2o6bo726bobo2b2o2b2o2b2o2b2o2b2o2b 2o4bo20bo4b3o2b2o$411b2o119bo4bo7b2o724b2o51bo2bo6bob3o$407b4ob2o112bo 4bo10bo2bo724bo5bo2b2o2b2o2b2o2b2o2b2o2b2o4bo20bo4b3o2b2o$407b6o115b2o 12bobo726b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o3b2o6b4o8bobo4b2o2b2o$408b4o 863bo28bobo4b6o17b2o$1310b2o4b2o8bobo$1232bo2bo75b2o2bobo8bo2bo4b2o$ 1223bo12bo78bobobo3b2o4b2o4b2o$1221bo3bo6bo3bo74bo7b3o4bo7b2o$1226bo6b 4o80bo3bo4bob7o$1221bo4bo91b4o9bobo$1191b2o29b5o86b2o7b2ob6o$1189bo4bo 114b4ob2o4b3o7bo$1195bo113b6o5bo6b2o$1189bo5bo114b4o11b4o$1190b6o129bo $1161b4o$1160b6o115b2o12bobo$1160b4ob2o112bo4bo10bo2bo$1164b2o119bo4bo 7b2o$1193b3o83bo5bo4bob2o6bo$1192b5o83b6o7bo2b6o$1192b3ob2o6b2o82b4o3b o7b2o$1195b2o6b4o85bo4bob3o3bo$1203b2ob2o78bo2bob2o2bob2o3bo3bo$1205b 2o82bo5bo3b2o5bo$1284b2obo7bob4o3b3o$379b2o896bo6bo2bo9bo$377bo4bo894b obo4bo2bo7bobo6b3o$383bo129bo721b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bo 5b2o6b2o8bo5bo5bo$377bo5bo129b4o718b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o23b2o3bob2o3bo$378b6o27bo89b2o5bo6b2o778b3o6bo3bo$409bo3bo83b4ob2o 4b3o7bo716b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o23b2o3bob2o3bo$414bo 82b6o7b2ob6o716b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo $409bo4bo5bo2bo74b4o4b4o9bobo755bobo4bo2bo7bobo6b3o$410b5o9bo80bo3bo4b ob7o672b2o80bo6bo2bo9bo$420bo3bo82b3o4bo7b2o676b2o25bobo54b2obo7bob4o 3b3o$421b4o72bobo3bobobo3b2o4b2o4b2o675bobo24bo2bo58bo5bo3b2o5bo$158b 4o335bobo3bobo8bo2bo4b2o94b2o580bo5b2o22b2o54bo2bob2o2bob2o3bo3bo$157b 6o115b2o12bobo201b2o6b2o8bobo99bo4bo565b2o17bobo23bo59bo4bob3o3bo$157b 4ob2o112bo4bo10bo2bo196bo4b2o4b2o17b2o98bo129bo432b2ob2o16bo5b2o7b2o7b 4o54b4o3bo7b2o$161b2o119bo4bo7b2o137b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o91bo5bo129b4o429b4o23bobo4bo4b o4bo4bo45b6o7bo2b6o$190b3o83bo5bo4bob2o6bo135bobo2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o91b6o27bo89b2o5bo6b2o 430b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo$189b5o83b6o7bo2b6o131b2o80bo 2bo6bob3o121bo3bo83b4ob2o4b3o7bo438bo5bo15bo6bo5bo2bo50bo4bo7b2o$189b 3ob2o6b2o82b4o3bo7b2o127bo5bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b2o21bo4b3o2b2o127bo82b6o7b2ob6o444bo15b3o2bobo7bo45bo4bo 10bo2bo$192b2o6b4o85bo4bob3o3bo127b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o123bo4bo5bo2bo74b4o4b4o9bobo 435bo4bo17b2o6bob4o48b2o12bobo$200b2ob2o78bo2bob2o2bob2o3bo3bo130bo57b o4b2o4b2o17b2o125b5o9bo80bo3bo4bob7o102b4o330b2o24bo2bo3bo$202b2o74b2o 6bo5bo3b2o5bo110b2o80b2o6b2o8bobo142bo3bo82b3o4bo7b2o100b6o115b2o12bob o229bo$277b3o2bobo7bob4o3b3o109b2o30bo51bobo3bobo8bo2bo4b2o136b4o72bob o3bobobo3b2o4b2o4b2o99b4ob2o112bo4bo10bo2bo224b5o$277bo6bo9bo118b2o5b 2o23b4o48bobo3bobobo3b2o4b2o4b2o211bobo3bobo8bo2bo4b2o104b2o119bo4bo7b 2o215b6o$271bo5bo6bo7bobo6b3o115b2o26b2o58b3o4bo7b2o211b2o6b2o8bobo 140b3o83bo5bo4bob2o6bo213bo5bo2b5o$238bo3b2o2b2o2b2o2b2o2b2o2b2o2b2o3b obo4bo4bo8bo5bo5bo98b4o14bo4b2o22bo54bo3bo4bob7o208bo4b2o4b2o17b2o132b 5o83b6o7bo2b6o218bo6bo$237bo8b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob 2o3bo96bo3bo18b2o20b4o47b4o4b4o9bobo131b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o131b3ob 2o6b2o82b4o3bo7b2o209bo4bo4bo3bo$238bo3bo49b3o6bo3bo100bo8b4o8bo4b2o6b 2o9bo45b6o7b2ob6o134b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o133b2o6b4o85bo4bob3o3bo210b 2o6bob4o$243bo2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo96bo2bo8b 6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo232bo2bo6bob3o140b2ob2o78bo2bob2o2b ob2o3bo3bo215bo7bo$242b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo 109b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o136b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o143b2o 74b2o6bo5bo3b2o5bo215bo5bo2bo$271bo5bo6bo7bobo6b3o45bobo66b2o19b3obo6b o62b4o135bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o219b3o2bobo7bob4o3b3o212bob2o5bo2bo$ 194b2o81bo6bo9bo54b2o89b2obobob3o63bo138bo2bo75bo4b2o4b2o17b2o220bo6bo 9bo221bo6bo4bo$194bobo27bobo50b3o2bobo7bob4o3b3o46bo94b2o2bo202bo2bo 79b2o6b2o8bobo221bo5bo6bo7bobo6b3o220b4o$194bo5b2o22bo2bo50b2o6bo5bo3b 2o5bo139bo3b2o203b2o30bo51bobo3bobo8bo2bo4b2o165b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo221bo$194bo5bobo24b2o54b o2bob2o2bob2o3bo3bo132b4o4b4o204b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o 164b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o 3bo218b2o$184b2o14bo5b2o21bo59bo4bob3o3bo132b6o217b2o26b2o58b3o4bo7b2o 235b3o6bo3bo215bo2bo$182b2ob2o19bobo18b4o54b4o3bo7b2o133b4ob2o2b4o194b 4o14bo4b2o22bo54bo3bo4bob7o166b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o3b2o7b2o11b2o3bob2o3bo215bobo$182b4o20bo5b2o6b2o4bo4bo45b6o7bo 2b6o140b2o2bo3b2o192bo3bo18b2o20b4o47b4o4b4o9bobo167b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$183b2o9b6o12bobo4bo 2bo5bo2bo44bo5bo4bob2o6bo147b2o2bo195bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o 219bo5bo6bo7bobo6b3o$193bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o146bobob3o191b o2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo142b2o81bo6bo9bo$199bo19b2obo 7bo45bo4bo10bo2bo147bo6bo202b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o144bobo 27bobo50b3o2bobo7bob4o3b3o$193bo4bo25bob4o48b2o12bobo147b2o5b3o205b2o 19b3obo6bo62b4o144bo5b2o22bo2bo50b2o6bo5bo3b2o5bo$195b2o24bo2bo3bo211b 3o4bo2b3o226b2obobob3o63bo147bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$227bo 212bo10bo232b2o2bo201b2o14bo5b2o21bo59bo4bob3o3bo$223b5o219b4o231bo3b 2o200b2ob2o19bobo18b4o54b4o3bo7b2o$215b6o229bo224b4o4b4o201b4o20bo5b2o 6b2o4bo4bo45b6o7bo2b6o$214bo5bo2b5o219b2o225b6o209b2o9b6o12bobo4bo2bo 5bo2bo44bo5bo4bob2o6bo$220bo6bo217b4o225b4ob2o2b4o212bo5bo12bo6bo2bo5b o2bo50bo4bo7b2o$214bo4bo4bo3bo216bo232b2o2bo3b2o217bo19b2obo7bo45bo4bo 10bo2bo$216b2o6bob4o454b2o2bo210bo4bo25bob4o48b2o12bobo458b4o$222bo7bo 451bobob3o212b2o24bo2bo3bo523b6o115b2o12bobo$222bo5bo2bo450bo6bo243bo 524b4ob2o112bo4bo10bo2bo$219bob2o5bo2bo449b2o5b3o238b5o528b2o119bo4bo 7b2o$219bo6bo4bo447b3o4bo2b3o229b6o564b3o83bo5bo4bob2o6bo$227b4o448bo 10bo229bo5bo2b5o556b5o83b6o7bo2b6o$229bo456b4o236bo6bo556b3ob2o6b2o82b 4o3bo7b2o$227b2o460bo230bo4bo4bo3bo558b2o6b4o85bo4bob3o3bo$224bo2bo 458b2o234b2o6bob4o565b2ob2o78bo2bob2o2bob2o3bo3bo$224bobo457b4o240bo7b o566b2o74b2o6bo5bo3b2o5bo$684bo243bo5bo2bo640b3o2bobo7bob4o3b3o$925bob 2o5bo2bo640bo6bo9bo$925bo6bo4bo36b2o596bo5bo6bo7bobo6b3o$933b4o35bo4bo 529b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bob o4bo4bo8bo5bo5bo$935bo42bo528b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$933b2o37bo5bo614b3o6bo3bo $930bo2bo39b6o528b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$930bobo574b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$1572bo5bo6bo 7bobo6b3o$1495b2o81bo6bo9bo$1495bobo27bobo50b3o2bobo7bob4o3b3o$1495bo 5b2o22bo2bo50b2o6bo5bo3b2o5bo$1495bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$ 3b2o290b2o290b2o290b2o604b2o14bo5b2o21bo59bo4bob3o3bo$bo2bo290b2o290b 2o290b2o602b2ob2o19bobo18b4o54b4o3bo7b2o$1483b4o20bo5b2o6b2o4bo4bo45b 6o7bo2b6o$o1483b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo$1494bo5bo12bo 6bo2bo5bo2bo50bo4bo7b2o$b2o1497bo19b2obo7bo45bo4bo10bo2bo$3bo1490bo4bo 25bob4o48b2o12bobo$1496b2o24bo2bo3bo$1528bo$2o3b2o1517b5o$2o3b2o289b2o 290b2o926b6o$b5o289bo2bo288bo2bo924bo5bo2b5o$2bobo290bo2bo288bo2bo930b o6bo$296b2o290b2o925bo4bo4bo3bo$2b3o1512b2o6bob4o$1523bo7bo$1523bo5bo 2bo$1520bob2o5bo2bo$1520bo6bo4bo$5bo1522b4o$4bobo1523bo$3bo3bo1520b2o$ 4b3o291b2o1225bo2bo$2b2o3b2o288bo2bo1224bobo$297bo2bo$298b2o9$5b2o290b 2o290b2o290b2o290b2o$5b2o290b2o290b2o290b2o290b2o5$1271b2o$640bobo626b o4bo$640bo2bo631bo$643b2o624bo5bo$645bo624b6o$643b4o613bobo$635bo6bo4b o612bo2bo$223bo411bob2o5bo2bo615b2o$223b4o411bo5bo2bo326bo290bo$225b2o 411bo7bo327b4o285b4o258bobo$228bo403b2o6bob4o330b2o277bo6bo4bo257bo2bo $225b4o401bo4bo4bo3bo334bo275bob2o5bo2bo260b2o$218bo10bo406bo6bo332b4o 278bo5bo2bo262bo$218b3o4bo2b3o399bo5bo2b5o325bo10bo277bo7bo261b4o$220b 2o5b3o401b6o332b3o4bo2b3o270b2o6bob4o254bo6bo4bo$221bo6bo410b5o327b2o 5b3o269bo4bo4bo3bo255bob2o5bo2bo$221bobob3o415bo328bo6bo276bo6bo259bo 5bo2bo$223b2o2bo383b2o24bo2bo3bo327bobob3o271bo5bo2b5o259bo7bo$217b2o 2bo3b2o382bo4bo25bob4o48b2o12bobo263b2o2bo272b6o260b2o6bob4o$213b4ob2o 2b4o221bo167bo19b2obo7bo45bo4bo10bo2bo256b2o2bo3b2o281b5o251bo4bo4bo3b o$213b6o228b4o158bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o251b4ob2o2b4o286bo 257bo6bo$214b4o4b4o223b2o148b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo 250b6o261b2o24bo2bo3bo250bo5bo2b5o$221bo3b2o225bo145b4o20bo5b2o6b2o4bo 4bo45b6o7bo2b6o250b4o4b4o252bo4bo25bob4o48b2o12bobo185b6o$223b2o2bo 221b4o145b2ob2o19bobo18b4o54b4o3bo7b2o254bo3b2o257bo19b2obo7bo45bo4bo 10bo2bo192b5o$213bobo3bobobob3o63bo150bo10bo146b2o14bo5b2o21bo59bo4bob 3o3bo255b2o2bo250bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o195bo$196b2o15bobo3bo bo6bo62b4o147b3o4bo2b3o155bo5bobo24b2o54bo2bob2o2bob2o3bo3bo249b2obobo b3o63bo176b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo162b2o24bo2bo3bo$ 192b4ob2o13b2o6b2o5b3o49b2o5bo6b2o149b2o5b3o156bo5b2o22bo2bo50b2o6bo5b o3b2o5bo227b2o19b3obo6bo62b4o172b4o20bo5b2o6b2o4bo4bo45b6o7bo2b6o159bo 4bo25bob4o48b2o12bobo$180bo2bo8b6o10bo4b2o4b2o4bo2b3o44b4ob2o4b3o7bo 148bo6bo157bobo27bobo50b3o2bobo7bob4o3b3o223b4ob2o12bo4b2o2b2o5b3o49b 2o5bo6b2o172b2ob2o19bobo18b4o54b4o3bo7b2o162bo19b2obo7bo45bo4bo10bo2bo $184bo8b4o9b2o21bo45b6o7b2ob6o148bobob3o158b2o81bo6bo9bo220bo2bo8b6o 11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo172b2o14bo5b2o21bo59bo4bob3o3bo155bo 5bo12bo6bo2bo5bo2bo50bo4bo7b2o$180bo3bo17bo4b2o16b4o47b4o4b4o9bobo147b 2o2bo235bo5bo6bo7bobo6b3o215bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o182bo5bobo 24b2o54bo2bob2o2bob2o3bo3bo144b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6b o$181b4o15b2o26bo54bo3bo4bob7o140b2o2bo3b2o187b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo210bo3bo18b2o20b4o47b4o4b 4o9bobo179bo5b2o22bo2bo50b2o6bo5bo3b2o5bo143b4o20bo5b2o6b2o4bo4bo45b6o 7bo2b6o$196bo4b2o22b2o58b3o4bo7b2o135b4ob2o2b4o188b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo210b4o14bo4b2o22bo 54bo3bo4bob7o178bobo27bobo50b3o2bobo7bob4o3b3o143b2ob2o19bobo18b4o54b 4o3bo7b2o$194b2o27b4o53b2obobo3b2o4b2o4b2o134b6o265b3o6bo3bo226b2o26b 2o58b3o4bo7b2o177b2o81bo6bo9bo154b2o14bo5b2o21bo59bo4bob3o3bo$195b2o 26bo55b3obo8bo2bo4b2o136b4o4b4o188b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo220b2o5b2o23b4o48bobo3bobobo3b2o4b2o 4b2o253bo5bo6bo7bobo6b3o155bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$273bo4b 2o2b2o8bobo150bo3b2o187b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 3bobo4bo4bo8bo5bo5bo221b2o30bo51bobo3bobo8bo2bo4b2o193b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo154bo 5b2o22bo2bo50b2o6bo5bo3b2o5bo$271b2o6bo2bo17b2o50bo94b2o2bo235bo5bo6bo 7bobo6b3o222bo2bo79b2o6b2o8bobo200b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo153bobo27bobo50b3o2bobo 7bob4o3b3o$242b2o2b2o2b2o2b2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o48b2o89b 2obobob3o63bo177bo6bo9bo231bo2bo75bo4b2o4b2o17b2o275b3o6bo3bo153b2o81b o6bo9bo$242b2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o47bobo66b2o19b3obo6b o62b4o174b3o2bobo7bob4o3b3o222bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o192b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo 230bo5bo6bo7bobo6b3o$238b2o50bo2bo6bob3o111b4ob2o12bo4b2o2b2o5b3o49b2o 5bo6b2o99b2o74b2o6bo5bo3b2o5bo223b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o191b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo166b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo 4bo8bo5bo5bo$237bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o100bo2bo8b 6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo95b2ob2o78bo2bob2o2bob2o3bo3bo321bo 2bo6bob3o251bo5bo6bo7bobo6b3o167b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$238b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o105bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o 87b2o6b4o85bo4bob3o3bo224b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o258bo6bo9bo262b3o6bo3bo$ 271b2o6bo2bo17b2o102bo3bo18b2o20b4o47b4o4b4o9bobo81b3ob2o6b2o82b4o3bo 7b2o225b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o20bobo4b2o2b2o259b3o2bobo7bob4o3b3o167b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo $273bo4b2o2b2o8bobo110b4o14bo4b2o22bo54bo3bo4bob7o80b5o83b6o7bo2b6o 306bo4b2o4b2o17b2o185b2o74b2o6bo5bo3b2o5bo167b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$279b3obo8bo 2bo4b2o119b2o26b2o58b3o4bo7b2o80b3o83bo5bo4bob2o6bo311b2o6b2o8bobo190b 2ob2o78bo2bob2o2bob2o3bo3bo232bo5bo6bo7bobo6b3o$199b4o77b2obobo3b2o4b 2o4b2o112b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o50b2o119bo4bo7b2o313bobo 3bobo8bo2bo4b2o175b2o6b4o85bo4bob3o3bo239bo6bo9bo$198bo3bo82b3o4bo7b2o 113b2o30bo51bobo3bobo8bo2bo4b2o47b4ob2o112bo4bo10bo2bo238b4o72bobo3bob obo3b2o4b2o4b2o171b3ob2o6b2o82b4o3bo7b2o240b3o2bobo7bob4o3b3o$188b5o9b o80bo3bo4bob7o115b2o80b2o6b2o8bobo54b6o115b2o12bobo238bo3bo82b3o4bo7b 2o172b5o83b6o7bo2b6o168b2o74b2o6bo5bo3b2o5bo$187bo4bo5bo2bo74b4o4b4o9b obo136bo57bo4b2o4b2o17b2o48b4o361b5o9bo80bo3bo4bob7o174b3o83bo5bo4bob 2o6bo167b2ob2o78bo2bob2o2bob2o3bo3bo$192bo82b6o7b2ob6o135b2o3bo2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o411bo 4bo5bo2bo74b4o4b4o9bobo146b2o119bo4bo7b2o160b2o6b4o85bo4bob3o3bo$187bo 3bo83b4ob2o4b3o7bo134bo5bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o3b2o21bo4b3o2b2o415bo82b6o7b2ob6o145b4ob2o112bo4bo10bo2bo158b 3ob2o6b2o82b4o3bo7b2o$156b6o27bo89b2o5bo6b2o137b2o80bo2bo6bob3o409bo3b o83b4ob2o4b3o7bo145b6o115b2o12bobo159b5o83b6o7bo2b6o$155bo5bo129b4o 140bobo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b 3o2b2o379b6o27bo89b2o5bo6b2o148b4o293b3o83bo5bo4bob2o6bo$161bo129bo 144b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b 2o2b2o379bo5bo129b4o416b2o119bo4bo7b2o$155bo4bo333bo4b2o4b2o17b2o386bo 129bo415b4ob2o112bo4bo10bo2bo$157b2o339b2o6b2o8bobo387bo4bo546b6o115b 2o12bobo$499bobo3bobo8bo2bo4b2o382b2o549b4o$423b4o72bobo3bobobo3b2o4b 2o4b2o$422bo3bo82b3o4bo7b2o$412b5o9bo80bo3bo4bob7o$411bo4bo5bo2bo74b4o 4b4o9bobo$416bo82b6o7b2ob6o$411bo3bo83b4ob2o4b3o7bo$380b6o27bo89b2o5bo 6b2o$379bo5bo129b4o$385bo129bo$379bo4bo$381b2o!golly-3.3-src/Patterns/Life/Breeders/switch-engine-breeder-MR.rle0000644000175000017500000000301112026730263021613 00000000000000#C 5 beehives and 75 blocks produce a quadratically expanding #C population when hit by a single trigger glider. #C This is a nonstandard "Blockish" construction of Mitchell Riley's #C switch-engine breeder from July 2006, which in its minimal form #C contains just 38 ON cells: #C x = 135, y = 41, rule = B3/S23 #C 131b4o$130bo3bo$134bo$133bo3$130boo$130bobo$132bo$130b3o5$131b4o$ #C 130bo3bo$134bo$133bo9$94b4o$93bo3bo$97bo$96bo8$b4o$o3bo$4bo$3bo! x = 221, y = 173, rule = B3/S23 148boo$148boo3$143boo$143boo3$159boo$159boo$177bo$154boo20bo$154boo9b oo9b3o$165boo$$153boo5boo$153boo5boo$$167boo$159boo6boo$159boo3$171boo 4boo$171boo4boo4$174boo$170boobboo5boo$170boo9boo4$178boo$174boobboo5b oo$174boo9boo$$109boo$109boo$113boo67boo$113boobboo59boobboo$117boo59b oo4$174boo$174boo4$178boo$178boo9$149boo$149boo4$153boo$153boo9$124boo $124boo$$193boo24boo$193boo24boo$128boo$128boo$$184boo$87boo95boo33boo $87boo130boo$$210boo$185boo23boo$91boo92boo$91boo$206boo$206boo5$219b oo$161boo56boo$161boo10boo$173boo35boo$210boo$$161boo41boo$141boo18boo 41boo$141boo4$132boo70boo$132boo70boo$$127boo66boo$127boo66boo$133boo$ 133boo57boo$192boo$$127boo$101boo24boo$101boo$118boo54boo29boo$118boo 54boo29boo$96boo72boo$96boo68boobboo24boo$166boo28boo$114boo31boo13boo $114boo31boo13boo3$151boo$139bo11boo$138bobo$138bobo$129boo8bo$117boo 4boo4boo34boo4boo$117boo4boo40boo4boo$$133boo$121bo11boo$107boo11bobo$ 107boo11bobo$121bo$$111boo$99bo11boo$98bobo$98bobo$99bo4$78boo$78boo3$ 82boo$70bo11boo$69bobo$69bobo$70bo3$9boo$9boo3$13boo$bo11boo$obo$obo$b o!golly-3.3-src/Patterns/Life/Breeders/breeder.lif0000644000175000017500000003221312026730263016533 00000000000000#Life 1.05 #D Breeder, the classic original by Bill Gosper, early 1970's. #D #D This is the first pattern to demonstrate that quadratic #D growth was possible in the Game of Life. Much better #D results have been achieved since then (see spacefiller.rle). #N #P 6 166 *** ..* .* #P 0 152 ...** ...** . . . ...* ..*** .*...* *.***.* .***** . . . . . . . . . . . . . ....*** ...*...* ..*.....* ..**.*.** . . .....* ....*.* ....*.* .....* . .....** .....** #P 35 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 40 153 *.* ** .* #P 41 183 ** *.* * #P 67 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 88 137 *.* ** .* #P 89 199 ** *.* * #P 99 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 136 121 *.* ** .* #P 137 215 ** *.* * #P 131 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 184 105 *.* ** .* #P 185 231 ** *.* * #P 163 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 195 152 ** ** . . . . . .....* .....*.* .....** .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** .......** .......*.* .......* . . . . . ..** ..** #P 232 89 *.* ** .* #P 233 247 ** *.* * #P 227 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 248 143 * *.* ** #P 250 194 ** *.* * #P 280 73 *.* ** .* #P 281 263 ** *.* * #P 259 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 296 127 * *.* ** #P 298 210 ** *.* * #P 328 57 *.* ** .* #P 329 279 ** *.* * #P 291 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 344 111 * *.* ** #P 346 226 ** *.* * #P 377 295 ** *.* * #P 376 41 *.* ** .* #P 323 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 392 95 * *.* ** #P 370 234 ** *.* * #P 355 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 440 79 * *.* ** #P 418 250 ** *.* * #P 387 152 ** ** . . . . . . . . .** *..* *..* .** #P 389 186 ** ** #P 400 160 .* * *** #P 399 184 .** ** ..* #P 360 222 ** ** #P 341 58 ** ** #P 352 49 *.* ** .* #P 373 58 ** ** #P 394 242 ** *.* * #P 442 258 ** *.* * #P 343 280 ** ** #P 353 287 ** *.* * #P 375 280 ** ** #P 419 152 ** ** . . . . . . . . .** *..* *..* .** #P 421 186 ** ** #P 422 191 * * ..** #P 448 144 .* * *** #P 447 200 .** ** ..* #P 451 152 ** ** . . . . . . . . .** *..* *..* .** #P 453 186 ** ** . . . ** ** #P 483 152 ** ** . . . . . . . . .** *..* *..* .** #P 485 186 ** ** . . . ** ** #P 496 128 .* * *** #P 515 152 ** ** . . . . . . . . .** *..* *..* .** #P 517 186 ** ** . . . ** ** #P 547 152 ** ** . . . . . . . . .** *..* *..* .** #P 549 186 ** ** . . . ** ** #P 579 152 ** ** #P 581 186 ** ** . . . ** ** #P 589 154 * *.* ** #P 589 176 .** ** ..* #P 611 152 ** ** #P 613 186 ** ** . . . ** ** #P 637 138 * *.* ** #P 637 192 .** ** ..* #P 643 147 ** ** . . . ** ** #P 645 186 ** ** . . . ** ** #P 661 130 * *.* ** #P 685 122 * *.* ** #P 685 208 .** ** ..* #P 709 216 .** ** ..* #P 544 112 .* * *** #P 568 104 .* * *** #P 562 109 ** ** #P 594 109 ** ** #P 626 104 ** ** . . . ** ** #P 513 88 ** ** #P 481 88 ** ** #P 449 88 ** ** #P 405 53 ** ** . . . ** ** #P 355 17 ** ** . . . ** ** #P 424 217 ** ** . . . ** ** #P 448 217 ** ** . . . ** ** #P 464 217 ** ** . . . ** ** #P 340 315 ** ** . . . ** ** #P 396 315 ** ** . . . ** ** #P 412 315 ** ** . . . ** ** #P 479 280 ** ** . . . ** ** #P 463 280 ** ** . . . ** ** #P 407 280 ** ** . . . ** ** #P 395 17 ** ** . . . ** ** #P 411 17 ** ** . . . ** ** #P 400 33 *.* ** .* #P 461 53 ** ** . . . ** ** #P 477 53 ** ** . . . ** ** #P 545 83 ** ** . . . ** ** #P 569 83 ** ** . . . ** ** #P 585 83 ** ** . . . ** ** #P 682 104 ** ** . . . ** ** #P 698 104 ** ** . . . ** ** #P 675 147 ** ** . . . ** ** #P 699 147 ** ** . . . ** ** #P 715 147 ** ** . . . ** ** #P 717 186 ** ** . . . ** ** #P 701 186 ** ** . . . ** ** #P 677 186 ** ** . . . ** ** #P 707 230 ** ** . . . ** ** #P 723 230 ** ** . . . ** ** #P 651 230 ** ** . . . ** ** #P 736 138 .....** .****.** .****** ..**** .* *.* *.* ....** ....*.* ......* ....*** . . . ....*** ......* ....*.* ....** *.* *.* .* ..**** .****** .****.** .....** #P 720 140 ...** ..*.* .*..* ......* * .....*.*.* ..*..*.*..* ...**.....*..* ........*.*.*..* .....**.*...*..* . .....**.*...*..* ........*.*.*..* ...**.....*..* ..*..*.*..* .....*.*.* * ......* .*..* ..*.* ...** #P 726 135 .**** ****** ****.** ....** #P 726 162 ....** ****.** ****** .**** #P 705 145 .** *..* *.* .* . . . .* *.* *..* .** #P 701 138 .*** ***** ***.** ...** #P 701 159 ...** ***.** ***** .*** #P 687 146 .** *..*....* .**.....* . . . .**.....* *..*....* .** #P 668 148 ** ** . ** ** #P 661 141 ....** ...*..* **.* .....** *...** ..*.* . . . . . . . ..*.* *...** .....** **.* ...*..* ....** #P 738 177 .......** ...****.** ...****** ....**** ..* ** .*..* ..***.** ........* ........* ....*..** .....** . .....** ....*..** ........* ........* ..***.** .*..* ** ..* ....**** ...****** ...****.** .......** #P 724 178 .*** .* ....* ...* . ......* .....**** ........* ****..*.** *.*.*.*....** .**..*.* . .**..*.* *.*.*.*....** ****..*.** ........* .....**** ......* . ...* ....* .* .*** #P 730 174 .**** ****** ****.** ....** #P 716 130 .** **** **.** ..** #P 730 201 ....** ****.** ****** .**** #P 720 206 ..** **.** **** .** #P 700 166 .* * . .*.* ...* .* ..* #P 705 177 .*** ***** ***.** ...** #P 705 198 ...** ***.** ***** .*** #P 707 184 .** *..* *.* .* . . . .* *.* *..* .** #P 689 185 .** *..* .** . . . .** *..* .** #P 670 187 ** ** . ** ** #P 664 179 ..** ...** .*.* *** *..* *.*** .*..* ..** . . . . . ..** .*..* *.*** *..* *** .*.* ...** ..** #P 661 200 .** ** ..* #P 741 219 ...** .*....* .......* .*.....* ..****** . . . . ...*** .*...** .*.*..** *.....* .***** . .***** *.....* .*.*..** .*...** ...*** . . . . ..****** .*.....* .......* .*....* ...** #P 729 225 ..*..* .***.** **...*.** .*...* .*.*.*.** ..*****.*.* ...*....** .........* . .........* ...*....** ..*****.*.* .*.*.*.** .*...* **...*.** .***.** ..*..* #P 731 219 .****** *.....* ......* *....* .*.* #P 731 243 .*.* *....* ......* *.....* .****** #P 713 228 .** *..* *.* .* . . . .* *.* *..* .** #P 706 222 .***** *....* .....* *...* ..* #P 706 240 ..* *...* .....* *....* .***** #P 696 228 ..**.* .****.** *....** *.* .* . .* *.* *....** .****.** ..**.* #P 680 230 **.** .*** .** . .** .*** **.** #P 676 231 * ** . ** * #P 666 225 .......* ......*.* .........* ....*.** ..*.** ***..** .**..** . . . .**..** ***..** ..*.** ....*.** .........* ......*.* .......* #P 646 224 .***** *....* .....* *...* ..* #P 646 238 ..* *...* .....* *....* .***** #P 721 249 *..* ....* *...* .**** #P 717 94 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 704 98 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 706 93 ....** ****.** ****** .**** #P 706 118 .**** ****** ****.** ....** #P 688 102 .** *..* *.* .* . . . .* *.* *..* .** #P 681 96 ...** ***.** ***** .*** #P 681 115 .*** ***** ***.** ...** #P 671 99 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 655 103 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 651 105 * *** . *** * #P 642 100 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 696 88 ..** **.** **** .** #P 621 98 ...** ***.** ***** .*** #P 610 74 .....** .****.** .****** ..**** . . ..** .*...* .*....* *.....* .**.*** . . . .**.*** *.....* .*....* .*...* ..** . . ..**** .****** .****.** .....** #P 606 77 .* *..* . . . .* ..* . . . . . ..* .* . . . *..* .* #P 600 71 .**** ****** ****.** ....** #P 600 98 ....** ****.** ****** .**** #P 592 79 .....*** ...***** ..*** .*...* **..*....** *......*** .******** . .******** *......*** **..*....** .*...* ..*** ...***** .....*** #P 590 66 .** **** **.** ..** #P 592 74 *** * .* #P 592 96 .* * *** #P 575 95 ...** ***.** ***** .*** #P 575 74 .*** ***** ***.** ...** #P 575 80 .** .** *..* *.* .* . . . .* *.* *..* .** .** #P 557 82 .** *..* .** . . . .** *..* .**. #P 530 75 ....*.* ...**..* ..***..* .*** .*.*..** **.***.* .*......* ..*....* ....***** ........** ........** . ........** ........** ....***** ..*....* .*......* **.***.* .*.*..** .*** ..***..* ...**..* ....*.* #P 515 76 .*** ***** ***.** ...** #P 496 43 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 483 47 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 485 42 ....** ****.** ****** .**** #P 485 67 .**** ****** ****.** ....** #P 467 51 .** *..* *.* .* . . . .* *.* *..* .** #P 460 45 ...** ***.** ***** .*** #P 460 64 .*** ***** ***.** ...** #P 450 48 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 434 52 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 430 54 * *** . *** * #P 421 49 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 475 37 ..** **.** **** .** #P 464 71 * *.* ** #P 400 47 ...** ***.** ***** .*** #P 425 8 .****** *.....* ......* *....* ..** . ..** .*.** **.*.* *.**.** *...** ..*** . ..*** *...** *.**.** **.*.* .*.** ..** . ..** *....* ......* *.....* .****** #P 417 14 ..*** *...* * * .*..* ..*.* . ..*.* .*..* * * *...* ..*** #P 414 4 ..** *....* ......* *.....* .****** #P 414 32 .****** *.....* ......* *....* ..** #P 401 15 ..* .*.* * .* . . . .* * .*.* ..* #P 400 5 ..* *.* *.* #P 389 7 ..* *...* .....* *....* .***** #P 389 29 .***** *....* .....* *...* ..* #P 389 15 * .* .* * . . . * .* .* * #P 382 13 ...** ...** ...** **.** .*.* .*** . . . .*** .*.* **.** ...** ...** ...** #P 379 17 ** ** . . . ** ** #P 367 16 .** *..* .** . . . .** *..* .** #P 341 7 .*.* .*.* .*.** ...** *..* .** #P 341 28 .** *..* ...** .*.** .*.* .*.* #P 329 9 ..* *...* .....* *....* .***** #P 329 27 .***** *....* .....* *...* ..* #P 404 0 *..* ....* *...* .**** #P 485 206 ......** ....*....* ..........* ....*.....* .....****** .* .*** *.**..* ..***..* .*****..* .***.*.*** ......**.** .....**.** . . . .....**.** ......**.** .***.*.*** .*****..* ..***..* *.**..* .*** .* .....****** ....*.....* ..........* ....*....* ......** #P 478 206 .****** *.....* ......* *....* ..** #P 478 230 ..** *....* ......* *.....* .****** #P 471 213 ......* .....*** ..*** .*...*...* *..*.*....* *........* .******** . .******** *........* *..*.*....* .*...*...* ..*** .....*** ......* #P 471 208 .** ** ..* #P 471 230 ..* ** .** #P 453 209 .***** *....* .....* *...* ..* . ..** .*..* .*.* ..* . . . ..* .*.* .*..* ..** . ..* *...* .....* *....* .***** #P 436 216 .** *..* .** . . . .** *..* .** #P 417 218 ** ** . ** ** #P 410 209 ....** ...*** .**...* .*...* * ***..** *.*.*** .***.** ...** . . . . . ...** .***.** *.*.*** ***..** * .*...* .**...* ...*** ....** #P 393 211 .***** *....* .....* *...* ..* #P 392 222 ** ** #P 468 236 *..* ....* *...* .**** #P 498 270 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 485 274 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 487 269 ....** ****.** ****** .**** #P 487 294 .**** ****** ****.** ....** #P 469 278 .** *..* *.* .* . . . .* *.* *..* .** #P 462 272 ...** ***.** ***** .*** #P 462 291 .*** ***** ***.** ...** #P 452 275 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 436 279 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 432 281 * *** . *** * #P 423 276 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 402 289 .*** ***** ***.** ...** #P 477 299 .** **** **.** ..** #P 466 266 ** *.* * #P 425 305 ...**** ..****** ..****.** ......** . . . ...*** .** .*....** **.**..* .......* ....*** . ....*** .......* **.**..* .*....** .** ...*** . . . ......** ..****.** ..****** ...**** #P 417 311 ....* ....** ..*..* *** .** ..*.* ....* . ....* ..*.* .** *** ..*..* ....** ....* #P 416 304 ....** ****.** ****** .**** #P 416 329 .**** ****** ****.** ....** #P 402 313 ..* .** *** . . . . . *** .** ..* #P 391 307 ...** ***.** ***** .*** #P 391 326 .*** ***** ***.** ...** #P 390 314 ** ** #P 390 321 ** ** #P 383 311 ...** ..*..* .....* ** . .*.* ..* . ..* .*.* . ** .....* ..*..* ...** #P 359 307 ...............* .............**.* ............*...* ........****.*.* .......*.*...** .**....*.* **.*..**.** .**.***..**** ...*...**.*.** .........**.** ...........* . ...........* .........**.** ...*...**.*.** .**.***..**** **.*..**.** .**....*.* .......*.*...** ........****.*.* ............*...* .............**.* ...............* #P 353 312 ..* .*.* *...* .*..* .**.** . . . .**.** .*..* *...* .*.* ..* #P 331 309 ...** ***.** ***** .*** #P 331 324 .*** ***** ***.** ...** #P 402 332 .** * #P 406 334 .** **** **.** ..** #P 401 303 ** *.* * golly-3.3-src/Patterns/Life/Breeders/switch-engine-ping-pong.rle0000644000175000017500000000055413307733370021603 00000000000000#N Switch engine ping-pong #O Michael Simkin, 29 October 2014 #C The smallest known pattern that exhibits quadratic population #C growth, as of June 2018. #C www.conwaylife.com/wiki/Switch_engine_ping-pong x = 210515, y = 183739, rule = B3/S23 1148bo$1148b2o1076$145bo$144bo$144b3o158$3bo$b2o$o$bo182353$210513bo$ 210512bo$210512b3o141$210354bo$210353b3o$210355bo!golly-3.3-src/Patterns/Life/Still-Lifes/0000755000175000017500000000000013543257426015114 500000000000000golly-3.3-src/Patterns/Life/Still-Lifes/eaters.rle0000644000175000017500000000472212026730263017016 00000000000000#C Still lifes that eat gliders. #C Most of the unusual ones were found by Dean Hickerson. #C Pattern from Jason Summers' "jslife" archive. x = 126, y = 135, rule = B3/S23 107bo$7bo23bo25bo20bo29bo$8bo23bo25bo20bo26b3o$6b3o21b3o23b3o18b3o$$ 64boo19boo25bo$11boo22boobbooboo17boobbo16boobbo26bo$11bobo21bobobbob oo17boboo17boboo25b3o$13bo23boobo22bo20bo$13boo22bobboboo19bo20bo$39b ooboo13boobboo19boo29boo$57bobbo20bo32bo$59boo18b3o31bo$78bo34boo$78b oo9$bo$bbo$3o$$4bo$5bo101bo$3b3o102bo$106b3o$7bo$8bo23bo77bo$6b3o24bo 25bo24bo26bo$31b3o26bo24bo23b3o$10bo47b3o22b3o$11bo28boo24boo24boo20b oo$9b3o23boobobbo21boobbo21boobbo19bobbobboo$35booboo23boobo19boobbobo 20bobo4bobbo$14boobo48boboboo14boobobboo20bo5bobobo$14boob3o15booboo 23booboboobo17bobo25boobobbo$20bo15boboo23bobbo22bobo25bobbo$14boob3o 14bo30boo23bo23bo4bo$15bobo16boo78b5o$15bobo$16bo25b3o71bo$42bo72bobo$ 43bo72bo14$3bo24bo21bo23bo20bo$4boo23boo20boo22boo19boo$3boo23boo20boo 22boo19boo$$11bo24bo21bo23bo20bo19bo$11bobo22bobo19bobo21bobo18bobo17b obo$11boo23boo20boo22boo19boo18boo$$115boo$4boo109bobbo$4boo3bo19boo3b o16boo3bo18boo3bo15boo3bo15boobbo$8bobo18bo3bobo15bo3bobo17bo3bobo14bo 3bobo15bobobo$9bobo18bo3bobo15bo3boo18bo3boo15bo3boo15bobboo$11bo19bo 4bo16bo23bo20bo18boo$11boo15b3o5boo13bob5o17bob5o14bob5o$28bo22boo4bo 16bobo3bo14bobo4bo$54b3o17bobbo4bo12bobob3o$51boobo20boo4boo13boobo$ 51bobo11$30boo$7bo17bo4bobo58bo$8bo17bo5bo13bo18bo26bo6boo$6b3obbooboo 8b3o5boboo11bo17b3o22b3obboobobbo15boo$12boboo13boobobo10b3o3boo15bo4b oo21boboboo10bo4bobo$12bo17bobobo17bo14boo3bobbo20bobo14bo5bobbo$10bob o17bobbo18boboo16bobobo20boo12b3o5bobobo$bbo7boo16bobo18booboobo9bo5b oobobbo11boo25boobobbo$3bo24boo20bo15bo3bo4boo12bobboboo21bobo$b3o44bo bo13b3o3boboobo15boobo22boboo$10boo36boo19boobobbo16bobo5boobo8bobbobo $10boo16boo43boo17bob3o3boboo8b4obbob3o$28boo63bo3bo18bobobobbo$94b4o 14boobboo4boo$92bobo17boo$90b3oboboo$26b3o60bo4bobo$26bo63b3obobobo$ 27bo64boo3boo12$5bo17bo19bo19bo22bo22bo$3bobo15bobo17bobo17bobo20bobo 5boo13bobo$4boo16boo18boo18boo21boo4bobo14boo$13boo16boo18boo18boo18bo $8boobobbo11boobobbo13boobobbo13boobobbo16b3obbo21boo$7bobob3o11bobob 3o8bo4bobob3o13bobob3o16bo3b3o16boobobbo$4bobbobo15bobo11bobo3bobo17bo bo19bob3o18bobob3o$4b4ob3o11b3ob5o8bobb3obooboo11b3obooboo15bo4bo12boo 3bobo$8bo3bo9bo3bo4bo9boo4bo3bo10bo4bo3bo16boboobo11bobbobob3o$6bobobb oo9boobbobo15boobo3bobo8boo3boboo15bobobobbo12b4obo3bo$6boo19boo16bob oo3boo14bo16boboo3bo18bobboo$43bo25boo14bo3b3o16bobo$43boo25bo13boo3bo 18boo$70bobo$71boo! golly-3.3-src/Patterns/Life/Still-Lifes/stripey.rle0000644000175000017500000000266112026730263017232 00000000000000#C Stripey still life, created by Gabriel Nivasch. x = 66, y = 65, rule = B3/S23 bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$b64o 2$b64o$o24bo39bo$b23o3b38o$24b3o$b20o2bo3b38o$o20bo2bo2bo37bo$b20ob2o 6b35o$20bo5bo2bo$b19o2b5o2b36o$o19b2o43bo$b17obo2b43o$10bo6bobobo$b8o 3b3o4bob44o$o7bobobo2bo3bo45bo$b7o2b2o2b2o2b2o3b42o$8b2o12bo$b7o2b13o 2b40o$o7b2o15bo39bo$b7o2b15o3b37o$9bo17bo$b7ob2o2b15ob2ob33o$o6bobo2bo 11bo3bobobo32bo$b6o3bobo2b8o3bo3bo2b3o2b2ob24o$7b3o2bobo8b7obobo2bo2bo bo$b6o3b3ob9o6bobo4b2o4b2o2b19o$o6b2o15bobo2bob2o10bo2bo18bo$b5obob16o b4o3bo6b3o4b18o$5bobo22b2o2bob2obo2bobo$b4o2b22o3b3ob2ob3o2b21o$o4b2o 22b3o10b2o21bo$b4o2b22o3b10o2bo2b2ob15o$5bo24b2o10bobo3bobo$b5ob23o3b 8obob2o2bo2b14o$o5b2o23b2o6bobobo2bobo16bo$b4o4b22o2b4o4bobo2bob4ob12o $5b3obo21bo5bo3bob2obo4bobo$b4o2bo2b20o2b5o3b2o2bob3o2bo2b11o$o4bobo 22b2o4bobo3bobo4bobo13bo$b5ob23o2b3obob2ob2o2b2obobob13o$31bo2bobo5bo 3bobo3bo$b30obobob2ob2o4bo2bobo3b3ob7o$o31bobo2bobo4bo3bob4o2bobo6bo$b 32ob3o4bobob3obo4bobo2b6o$40b2obobo3bob2obobo$b22ob11o9bo4b2obobob9o$o 21bobo10bo11b2o4b2o10bo$b21o4b10o2b2o3bo4bo6b10o$22b4o3bo9bo2bobobo4b 3obo$b21o3bobo4b7o3bobob2o2bo2bo2b9o$o21bo2bob2o2bo11b2o4bobobo11bo$b 21o2b2obo3bob2o2b2o6b5obob12o$29bobobobo2bo6bo5bo$b30o2bob2o10b4ob13o$ o32bobo5bob4o3bo14bo$b33o2bo4b2o4bo3b14o$34bobo7b3obo$b34ob2o3b3o4b17o $o37bobo2bob2o18bo$b38ob2o2bob19o2$b64o$bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo! golly-3.3-src/Patterns/Life/Still-Lifes/ss-eaters.rle0000644000175000017500000000160213451370074017436 00000000000000#C Spaceship eaters. #C Eater+tub MWSS eater by Dean Hickerson, 4-May-1997. #C First stable HWSS eater by Dean Hickerson, 24-Apr-1999. #C Pond+block HWSS eater by Brice Due. #C General purpose eater by Matthias Merzenich, 22-Jul-2013. x = 89, y = 82, rule = B3/S23 80bo$79bobo$80bo2$78b5o$15b2o30b2o29bo4bo$15bo31bo32b2obo$13bobo29bobo 33bobob2obo$13b2o30b2o33bo2bobob2o$b4o27b5o29b6o9b3o$o3bo26bo4bo28bo5b o12bo$4bo31bo34bo11bobo$o2bo27bo3bo29bo4bo11bo2bo$33bo33b2o12bo3b2o$ 82b3o$84bo7$12b2o$12b2o$46bo34b3o$45bobo32b3o$b4o8b2o17b5o9bo19b6o$o3b o8b2o16bo4bo28bo5bo$4bo31bo34bo$o2bo27bo3bo29bo4bo9b3o$33bo10b2o21b2o 12b3o$44bo$45b3o$47bo9$82b2o$66b6o9bo2bo$65bo5bo9bo2bo$71bo10b2o$65bo 4bo$67b2o$81b2o$81b2o21$13b6o9b5o8b4o16bo6b2ob2o$12bo5bo8bo4bo7bo3bo 17bo6bob2o$18bo13bo11bo15b3o6bo$12bo4bo9bo3bo8bo2bo22b2obo$14b2o13bo 37bob2o$67bo4bo$68b2ob2o$69bobo$64b2o3bobo$56b3o6bo4bo$58bo3b3o$57bo4b o!golly-3.3-src/Patterns/Life/Still-Lifes/1998-eater-stamp-collection.rle0000644000175000017500000003206113171233731022513 00000000000000#C Collection of 88 glider eaters #C These take between 4 and 25 gens to recover. #C A few of these have been known for many years: 4.0 is 'eater'; #C 5.0 is 'eater2'; 6.0 and 6.1 are variations of 'eater3'. #C 10.0 and 11.3 produce a 1-bit spark, which can be useful. #C Dean Hickerson, ~ December 1998 #C http://www.radicaleye.com/DRH/glider.eaters.html x = 241, y = 350, rule = B3/S23 9b2o4b2o$10bo5bo$9bo5bo$9b2o4b2o6bo11bo$11bob2o9bo11bo2b2o$11b2obo7b3o 9b3obobo$15b2o22bo$16bo8b2o$15bo9bo11b5o$15b2o9b3o9bo2bo$28bo7bo$36b2o $15b2o$15b2o6$11bob2o$11b2obo29b2o$9b2o12bo17bo3bo$10bo13bo17bo2bob2o$ 9bo12b3o15b3ob2obo$9b2o15b2obo15bobo$11bob2o11b2ob3o12bo2b2o$11b2obo 17bo5bo2bo2b2o2bo$15b2o9b2ob3o6b4o4b2o$16bo10bobo12b4o$15bo11bobo10bob o2bo$15b2o11bo11b2o$11bob2o$11b2obo5$118b2o$11b2obo8bo13bo21b2o6bo8b2o 9b2o17bo8bo3bo$11bob2o9bo13bo16b2o2bo8bo2b2obo2bo9b2o10bo4b3o9bo2bob2o $9b2o11b3o11b3o16bobobo6b3obobob2o24bo2bo10b3ob2obo$9bo16b2o30bo12bo2b o23b3obobo14bobo$10bo15b2o11b2obo31bo10bo3bo13bo14bo2b2o$9b2o28b2ob3o 7bo3bo16b2obo9bobobo21bo2bo2b2obo$11b2obo10bob3o15bo7bobobo12bobo2bobo 6b3o2bo22b4o5bo$11bob2o10b2o3bo8b2ob3o6b3o2bo13b2o2bo2bo12b3o8b2o13b4o b2o$9b2o4b2o11b2o10bobo14b3o15b2o15bo8b2o11b2o4bo$9bo5bo8bob2o12bobo 16bo54bo2b2obo$10bo5bo7b2obo13bo74b2obo$9b2o4b2o$11b2obo$11bob2o6$11bo b2o$11b2obo$15b2o5bo24b2o9bo23b2o$16bo5b3o16bo5bo10b3o15bo5bo$15bo9bo 4bo11bob2obo3b2o8bo4bo10bob2obo$15b2o7b2o3bobo8b3o2bob2obobo7b2o3bobo 7b3o2bob2o$13b2o14bobo13bo2bobo14bobo12bo4bo$14bo13b2o2b2o12b2o2b2o12b 2ob2o12b2ob2o$13bo9bo3bo2bobo14bobo9bo3bo4bo13bobo$13b2o9bo2bob2obobo 7b2o3bobo10bo2bob2o10b2o3bobo$11b2o9b3ob2obo3b2o8bo4bo9b3ob2obo12bo4bo $12bo16bo10b3o22bo9b3o$11bo17b2o9bo24b2o8bo$11b2o6$11b2obo8bo26b2o14bo 18bo$11bob2o9bo25bo8bo4b3o11bo4b3o$9b2o4b2o5b3o26bo8bo2bo15bo2bo$9bo5b o10b2o22b2o6b3obobo12b3obobo$10bo5bo8bo2bo2b2o16bo13bo18bo$9b2o4b2o8bo bo4bo2bo9b2o2b3o$11b2obo11bo5bobobo8b2o5bo14b2o5b2o$11bob2o14b2obo2bo 15b2o8b2o5bo5bo5b2o$15b2o12bo2bo28b2o2b3o7b3o2b2o$15bo10bo4bo11bo3bo 17bo11bo$16bo9b5o13bobobo17b2o7b2o$15b2o25b3o2bo19bo7bo$11b2obo13bo19b 3o15bo9bo$11bob2o12bobo20bo15b2o7b2o$28bo6$6b2o4b2obo98bo$7bo4bob2o47b o16bo13bo20bo26b2o19b2o$6bo3b2o4b2o6bo17bo21bob2ob2o10bob2ob2o7bo6b2o 9b3o20bo5bo14bo5bo$6b2o2bo5bo8bob2ob2o11bo2b2ob2obo9b3o2bob2o8b3o2bob 2o5b3o6bobo12b2o18bob2obo3b2o10bob2obo$11bo5bo5b3o2bob2o9b3o3bobob2o5b 2o7bo16bo12b2o5bo11bo2bo2b2ob2o8b3o2bob2obobo8b3o2bob2o$6b2o2b2o4b2o 10bo18bo10bobo4bobo14bobo11bo2bo4bob2o8bobo4bob2o13bo2bobo15bo4bo$7bo 2bo5bo9bobo15b2obo12bo4b2o15b2o12bobo2b2obobo10bo5bo17b2o2b2o15b2ob2o$ 6bo4bo5bo8b2o17bob2o11b2o35bo4bobobo13b2obo18bobo18bobo$6b2o2b2o4b2o 19b2o3b3o55bobob2o12bo2bob2o10bob2o3bobo11bob2o3bobo$10bo5bo20b2o2bo 18b2o3b2o15b2o16b2o12b2o2b3o12b3ob2o4bo10b3ob2o4bo$6b2o3bo5bo8b2o13bob 2o15bo4b2o11b2o2b2o13bo16bo17bo20bo$7bo2b2o4b2o8b2o14bo2bo12bobo16bobo 17b5o13b6o12b3ob2o15b3ob2o$6bo5b2obo28b2o12b2o17bo23bo18bo14bobo18bobo $6b2o4bob2o60b2o19b2o18b3o15bobo18bobo$97b2o18bo18bo20bo6$66bo30b2o$ 12b2o2b2o5bo6b2o15bo11bo4b3o10b2o18bobo$13bo3bo5b3o4bo9bo4b3o12bo2bo 13bobo13bo5bo$12bo3bo9bo4bo9bo2bo13b3obobo8bo5bo14bo4bob2o$12b2o2b2o7b 2o3b2o7b3obobo17bo10bo4bob2o9b3ob2obobo$44bo10bo16b3ob2obobo15bobobo$ 12b2o2b2o12b2o17bo5b3o19bobobo6b2o7bo2bo$13bo3bo8b2o3bo15b3o8bo2b2o14b o2bo7bobo4bobo$12bo3bo9b2o2bo11b2o2bo10bo3b2o12bobo12bo4b2o$12b2o2b2o 13b3o8b2o3bo9b2o16b2o13b2o$33bo12b2o$12b2o2b2o6bo3bo28b2o3b2o26b2o3b2o $13bo3bo7bobobo11b2o3b2o9bo4bo12b2o13bo4b2o$12bo3bo6b3o2bo13bo4bo7bobo 5b3o9b2o11bobo$12b2o2b2o11b3o7b3o5bobo5b2o8bo22b2o$31bo7bo8b2o5$47bo$ 8b2o2b2obo32bob2ob2o$9bo2bob2o30b3o2bob2o10b2o13bo$8bo7b2o16bo16bo13bo bo13bob2ob2obo$8b2o6bo7bo7b3o14bobo9bo5bo11b3o2bobob2o$17bo7bo5bo17b2o 11bo4bob2o13bobo$8b2o6b2o5b3o2b2o2bo27b3ob2obobo15b2o$9bo2b2obo11bo2b 3o32bobobobo5b2o$8bo3bob2o10bobo4b2o14b2o14bobo2b2o5bo2bob2o$8b2o6b2o 8bobob2obo9bob2o2b2o9bo2bobobo11b2obo5b2ob2o$16bo7b3obobo2bo7b3ob2o13b 4ob2o13bobo6bobo$8b2o7bo5bo3bobo2bo7bo39bob3o3bo2bo$9bo6b2o5b2o2bo2b2o 9b3ob2o13b2o19bo3bo2bobo$8bo3b2obo10b2o15bobo14b2o20b3obobob2o118bo$8b 2o2bob2o27bobo38bob2o115bo4b3o$44bo159bo2bo$181bo20b3obobo$174bo4b3o 25bo$175bo2bo20bo$156bo16b3obobo19b3o$109bo39bo4b3o21bo23bo2b2o$109b3o 21bo16bo2bo47bo3b2o$6b2o2b2o4b2o32bo19bo30bo10bo21bob2ob2o7b3obobo16b 2o28b2o$7bo3bo5bo11b2o18bobo11bo4b3o23bo4b3o9bo2b2o16b3o2bob2o12bo16bo 2bo2b2o4b2o$6bo3bo5bo12bobo15bo2bo2bo10bo2bo27bo2bo8b2obob2obo2b2o17bo 20bo11bobo3b2o3bobo17b2o3b2obo$6b2o2b2o4b2o13bo15b2obob2o8b3obobo24b3o bobo8bobo7bo16bobo18b3o10b2ob2o7bo19bo4b2ob3o$12bob2o8bo5b2ob2o15bo3b 2o11bo7bo11bo10bo9bo2bob2o4bo7b2o6b2o14b2o2bo24b2o20bo9bo$6b2o4b2obo9b o5bo2bo12b2obob2o2bo17bobo9bobo20bobob2o3b2o7bobo21b2o3bo12b2ob2o3b2o 24bo2b2ob3o$7bo8b2o5b3o2b3o2bo9b2o2b2obo2bobo18bobo9bobo21bo18bo25b2o 13bobo4b2ob2o22bo2bobo$6bo10bo9bo3b2o10b2o6b2o2b2o8b2o6b2o2b2o5b2o2b2o 6b2o20b2o9b2o4b2o9b2o22bo3bo5bobo22b2o$6b2o8bo10b4o21bobo10b2o2b2obo2b obo7bobo2bob2o2b2o16b2o3bo11bo3b2o9bobob2o3b2o14b4o2b2o3bo$16b2o12bo 21bobo14b2obob2o2bo5bo2b2obob2o20b2o2bo8b4obo15bob2o4bo21bobob2o$6b2o 19b2obobo8bo3bo7bo18bo3b2o7b2o3bo28b3o5bo2bob5o10bo7bo17b2o2bo2b2o2bo$ 7bo20bo2b2o9bobobo22b2obob2o11b2obob2o27bo9bo4bo10bob2obo2b2o16b2o2b2o 4b2o$6bo9b2o8bobo11b3o2bo23bo2bo2bo11bo2bo2bo18bo3bo15b4o12bo2b2o$6b2o 8b2o8b2o18b3o22bobo15bobo21bobobo31bo$48bo23bo17bo20b3o2bo17b2o14b3o$ 117b3o14b2o16bo$119bo4$153b2o$130bo22bobo$6b2o4bob2o48b2o20bo28bo15bob 2ob2o11bo5bo$7bo4b2obo8bo40bo2b2o9bo4b3o21bo4b3o13b3o2bob2o12bo4bob2o$ 6bo3b2o13bo15bo3b2ob2o15bobobo10bo2bo25bo2bo21bo13b3ob2obobo$6b2o3bo 11b3o6b2o8bo3bob2o14b2obo10b3obobo6b2o7b2o5b3obobo18bobo18bobobo$10bo 16b2obo2bo6b3o3bo20bo15bo7bo9bo10bo19b2o19bo2bo$6b2o2b2o14bobob3o11b3o 17b2obobob2o19bo7bo20b2o2bo25bobo$7bo4bob2o10bobo14bo6b2o8b2o2b2obob2o bo18b2o7b2o19bo2bobo16b2o6b2o$6bo5b2obo8b3ob2ob2o10b6o2bo8b2o6bo12b2o 6bo13bo6b2o10bobo2bo4b2o9bobo$6b2o8b2o5bo4bo3bo13bo2b2o19b2o9b2o2b2obo b2obo5bob2obob2o2b2o9b2obo3bo3b2o11bo$17bo6b3obo3bobo8b2o3bo22bo13b2ob obob2o5b2obobob2o17b3obo15b2o4b2o$6b2o8bo10bo5b2o9bobobo9bo3bo7bo17bo 15bo22bob5o13bo3b2o$7bo8b2o8bo15bobob2o11bobobo6b2o13b2obo15bob2o20bo 4bo9b4obo$6bo5bob2o10b2o14b2o13b3o2bo23bobobo11bobobo22b4o10bo2bob5o$ 6b2o4b2obo47b3o20bo2b2o11b2o2bo40bo4bo$65bo19b2o19b2o23b2o16bo$131b2o 15b2o7$192b2o$34bob2o17bo34bo15b2o18bo30bo34bobo$6b2o4b2obo18b2obo10bo 4b3o27bo4b3o14bobo11bo4b3o23bo4b3o30bo5bo$7bo4bob2o14b2o17bo2bo31bo2bo 16bo2bob2o9bo2bo27bo2bo13b2o19bo4bob2o$6bo3b2o19bo2b3o3b2o5b3obobo28b 3obobo15bobobo2bo6b3obobo6b2o9b2o5b3obobo12bobo16b3ob2obobo$6b2o2bo20b obobobobobo10bo10bo9bo13bo15b2obo3bobo10bo7bo11bo10bo9bo5bo21bobobo$ 11bo18b2obo3bobo21b3o9b3o30bo2b2obo19bo9bo22bo4bob2o18bo2bo$6b2o2b2o 21bo2b2ob2o19bo15bo26b2obobo2bo19b2o9b2o19b3ob2obob2o16bobo$7bo4b2obo 14b2obobo2bo11b2o6bo2bo13bo2bo6b2o12b2o2b2obob3o10b2o6bo15bo6b2o14bobo 19b2o$6bo5bob2o10b2o2b2obob2obo11b2o2b2obob2obo11bob2obob2o2b2o12b2o6b o13b2o2b2obob3o9b3obob2o2b2o14bobo12bo$6b2o2b2o4b2o8b2o6bo2bo16b2obobo 2bo11bo2bobob2o26b2o14b2obobo2bo7bo2bobob2o13bo2bobo2b2o6b2obobo$10bo 5bo19bo20bo2b2ob2o7b2ob2o2bo30bo17bo2b2obo5bob2o2bo16b4o2bobo8bobo2bo 4b2o$6b2o3bo5bo19b3o14b2obo3bobo9bobo3bob2o14bo3bo7bo15b2obo3bobo5bobo 3bob2o17bobobo7bo2bo3bo3b2o$7bo2b2o4b2o6bo3bo10bo15bobobobobobo5bobobo bobobo16bobobo6b2o15bobobo2bo7bo2bobobo16bobob2o8b2o2b3obo$6bo5b2obo9b obobo25bo2b3o3b2o5b2o3b3o2bo14b3o2bo24bo2bob2o9b2obo2bo16b2o18bob5o$6b 2o4bob2o7b3o2bo25b2o25b2o19b3o22bobo15bobo38bo4bo$29b3o26b2obo13bob2o 25bo23b2o15b2o41bo$31bo26bob2o13b2obo108b2o7$28bobo28bo30bo18b2o23bo 28bo$27bob2o21bo4b3o23bo4b3o13bobo2b2o16bo4b3o21bo4b3o15bo28bo13b2o$ 27bo3b2o20bo2bo27bo2bo15bob2o21bo2bo25bo2bo11bo4b3o21bo4b3o14bo$8b2o2b ob2o9b2ob2o3bo17b3obobo24b3obobo14bo3b4o15b3obobo6b2o7b2o5b3obobo11bo 2bo25bo2bo12bo2bo$9bo2b2obo10bobob3o23bo7bo11bo10bo13b2ob2o5bo19bo7bo 9bo10bo10b3obobo4b2o11b2o3b3obobo11b5o$8bo7b2o6bo5bo32bobo9bobo24bobob 5o29bo7bo27bo4bobo11bobo7bo$8b2o7bo5bob5o6bo26bobo9bobo22bo5bo32b2o7b 2o31bo15bo22bo$16bo7bo10bobo16b2o6b2o2b2o5b2o2b2o6b2o12bob5o3b2o18b2o 6bo13bo6b2o20b2o15b2o20bobo3b2o$8b2o6b2o8bob2o3bo2bo2bo14b2o2b2obo2bob o7bobo2bob2o2b2o13bo9bo2b2o14b2o2b2obob2obo5bob2obob2o2b2o14b2o6b2o11b 2o6b2o14b2o5bo$9bo4b2o9b2ob2o3b2obob2o18b2obob2o2bo5bo2b2obob2o19bob2o 4bobobo18b2obobob2o5b2obobob2o18b2o2b4o2bo9bo2b4o2b2o19bobob2o$8bo6bo 20bo3b2o19bo3b2o7b2o3bo21b2ob2o3b2obo23bo15bo25bo4bo2bo5bo2bo4bo21b3ob obo$8b2o4bo18b2obob2o2bo7b2ob2o3b2obob2o11b2obob2o3b2ob2o21bo12b2ob2o 3b2obo15bob2o3b2ob2o15b3obob2o5b2obob3o21bo4bobo$14b2o13b2o2b2obo2bobo 9bob2o3bo2bo2bo11bo2bo2bo3b2obo19b2obobob2o8bob2o4bobobo11bobobo4b2obo 18bobo11bobo19b2o2b4o2bo$8b2o2b2o15b2o6b2o2b2o6bo10bobo15bobo10bo13b2o 2b2obob2obo6bo9bo2b2o11b2o2bo9bo11b2o5bob2o5b2obo5b2o14b2o6b2o$9bo3bo 24bobo7bob5o6bo17bo6b5obo12b2o6bo9bob5o3b2o19b2o3b5obo10bobo3b2ob2o5b 2ob2o3bobo20b2o$8bo3bo25bobo8bo5bo29bo5bo23b2o7bo5bo27bo5bo12bo23bo22b o$8b2o2b2o13bo3bo7bo11bobob3o25b3obobo26bo9bobob5o19b5obobo52bo3bo4bob o$28bobobo17b2ob2o3bo23bo3b2ob2o12bo3bo7bo9b2ob2o5bo17bo5b2ob2o11b5o 19b5o12bobobo4b2o$26b3o2bo20bo3b2o25b2o3bo15bobobo6b2o10bo3b4o19b4o3bo 13bo2bo21bo2bo10b3o2bo$32b3o17bob2o29b2obo13b3o2bo19bob2o27b2obo18bo 17bo21b3o$34bo18bobo29bobo20b3o17bobo2b2o19b2o2bobo18b2o17b2o22bo$110b o22b2o19b2o8$29b2o29bo30bo8b2o2b2o27bo28bo$23bo5bo2b2obo17bo4b3o23bo4b 3o9bo2bo2b2obo15bo4b3o21bo4b3o$23b3o4bobob2o18bo2bo27bo2bo11bo4bobob2o 16bo2bo25bo2bo$6b2o4b2obo10bo2b2o21b3obobo24b3obobo10b2o2b2o19b3obobo 6b2o7b2o5b3obobo$7bo4bob2o9bo5bo25bo7bo11bo10bo17bo23bo7bo9bo10bo$6bo 3b2o4b2o6bob5o6bo26bobo9bobo21b6o3b2o28bo7bo$6b2o2bo5bo7bo11bobo25bobo 9bobo20bo10bo2b2o23b2o7b2o$11bo5bo7b3ob2o3bo2bo2bo14b2o6b2o2b2o5b2o2b 2o6b2o12b3ob2o4bobobo13b2o6bo13bo6b2o$6b2o2b2o4b2o9bob2o3b2obob2o14b2o 2b2obo2bobo7bobo2bob2o2b2o14bob2o3b2obo15b2o2b2obob2obo5bob2obob2o2b2o $7bo4b2obo21bo3b2o16b2obob2o2bo5bo2b2obob2o28bo19b2obobob2o5b2obobob2o $6bo5bob2o18b2obob2o2bo18bo3b2o7b2o3bo28b2obobob2o17bo15bo$6b2o2b2o4b 2o12b2o2b2obo2bobo6bo2bob2o3b2obob2o11b2obob2o3b2obo2bo11b2o2b2obob2ob o7bob2o3b2obo15bob2o3b2obo$10bo5bo13b2o6b2o2b2o5b4ob2o3bo2bo2bo11bo2bo 2bo3b2ob4o11b2o6bo9b3ob2o4bobobo11bobobo4b2ob3o$6b2o3bo5bo21bobo19bobo 15bobo33b2o5bo10bo2b2o11b2o2bo10bo$7bo2b2o4b2o21bobo9b5o6bo17bo6b5o24b o6b6o3b2o19b2o3b6o$6bo5b2obo12bo3bo7bo9bo5bo29bo5bo10bo3bo7bo13bo27bo$ 6b2o4bob2o13bobobo16b2o2b2o31b2o2b2o11bobobo6b2o6b2o2b2o29b2o2b2o$27b 3o2bo22bobob2o21b2obobo14b3o2bo15bo4bobob2o19b2obobo4bo$33b3o18bo2b2ob o21bob2o2bo19b3o13bo2bo2b2obo19bob2o2bo2bo$35bo18b2o31b2o21bo12b2o2b2o 29b2o2b2o9$26b2o35bo30bo95bo28bo$26bo2bo26bo4b3o23bo4b3o13b2o32bo30bo 9bo4b3o21bo4b3o6b2o$27b3o4b2o21bo2bo27bo2bo15bo2bo24bo4b3o23bo4b3o10bo 2bo25bo2bo8bo2bo2b2o$30b2o2bo20b3obobo24b3obobo13bob2obob2obo19bo2bo 27bo2bo11b3obobo4b2o11b2o3b3obobo8b2o2bobo$23b2o2b3o2bobo25bo7bo11bo 10bo14bo2bobobob2o17b3obobo24b3obobo15bo4bobo11bobo7bo11b2o$6b2o4b2obo 7bo2bo2bobobo33bobo9bobo25bo2b2o27bo7bo11bo10bo21bo15bo19bo$7bo4bob2o 8bob2o2b2o35bobo9bobo22b3o5bo33bobo9bobo30b2o15b2o15b2obo2bo$6bo3b2o4b 2o5b2obo5bo25b2o6b2o2b2o5b2o2b2o6b2o13bo2b5o6bo27bobo9bobo24b2o6b2o11b 2o6b2o9bo2bobobo3b2o$6b2o2bo5bo10b5o6bo19b2o2b2obo2bobo7bobo2bob2o2b2o 14bo11bobo17b2o6b2o2b2o5b2o2b2o6b2o15b2o2b4o2bo9bo2b4o2b2o11b2ob2o5bo$ 11bo5bo19bobo22b2obob2o2bo5bo2b2obob2o19b3ob2o3bo2bo2bo15b2o2b2obo2bob o7bobo2bob2o2b2o19bo4bobo7bobo4bo23bobob2o$6b2o2b2o4b2o7b4ob2o3bo2bo2b o23bo3b2o7b2o3bo24bob2o3b2obob2o19b2obob2o2bo5bo2b2obob2o24b3obobo7bob ob3o22b3obobo$7bo4b2obo9bo2bob2o3b2obob2o10bo2bob2o3b2obob2o11b2obob2o 3b2obo2bo21bo3b2o20bo3b2o7b2o3bo29bobob2o5b2obobo23bo4bobo$6bo5bob2o 22bo3b2o8b4ob2o3bo2bo2bo11bo2bo2bo3b2ob4o18b2obob2o2bo9bob2o3b2obob2o 11b2obob2o3b2obo11b2ob2o5bo11bo5b2ob2o11b2o2b4o2bo$6b2o8b2o17b2obob2o 2bo19bobo15bobo26b2o2b2obo2bobo8b3ob2o3bo2bo2bo11bo2bo2bo3b2ob3o7bo2bo bobo3b2o11b2o3bobobo2bo9b2o6b2o$16bo14b2o2b2obo2bobo10b5o6bo17bo6b5o 16b2o6b2o2b2o6bo11bobo15bobo11bo6b2obo2bo23bo2bob2o15b2o$6b2o9bo13b2o 6b2o2b2o5b2obo5bo29bo5bob2o21bobo7bo2b5o6bo17bo6b5o2bo8bo29bo19bo$7bo 8b2o22bobo8bob2o2b2o31b2o2b2obo22bobo7b3o5bo29bo5b3o8b2o27b2o10bo3bo4b obo$6bo5b2obo24bobo7bo2bo2bobobo27bobobo2bo2bo10bo3bo7bo11bo2b2o31b2o 2bo9b2o2bobo21bobo2b2o9bobobo4b2o$6b2o4bob2o13bo3bo7bo8b2o2b3o2bobo25b obo2b3o2b2o11bobobo17bo2bobobob2o21b2obobobo2bo7bo2bo2b2o21b2o2bo2bo6b 3o2bo$30bobobo22b2o2bo25bo2b2o16b3o2bo18bob2obob2obo21bob2obob2obo8b2o 31b2o13b3o$28b3o2bo20b3o4b2o23b2o4b3o19b3o16bo2bo33bo2bo59bo$34b3o16bo 2bo35bo2bo20bo17b2o35b2o$36bo16b2o39b2o6$71b2o17b2o$2b2obo6b2obo16b2o 17b2o17bo2bo15bo2bo$2bob2o6bob2o9bo5bobo10bo5bobo10bo5bo2bobo7bo5bo2bo bo$6b2o2b2o4b2o8bo4bo13bo4bo13bo4bob2o2bo7bo4bob2o2bo$6bo3bo5bo7b3o2b 3o11b3o2b3o11b3o2b3o3b2o6b3o2b3o3b2o$7bo3bo5bo10bo3b2o13bo3b2o13bo3b3o 12bo3b3o$6b2o2b2o4b2o10b4o2bo12b4o2bo12b4o2bo12b4o2bo$2b2obo4bo5bo15b 3o16b3o16b2o17b2o$2bob2o5bo5bo10b4o15b4o15b4o2b3o10b4o2b3o$2o8b2o4b2o 10bo3b5o5b2o3bo3b5o10bo3b2o2bo5b2o3bo3b2o2bo$o9bo5bo6b2obobob2o4bo5bo 2bobob2o4bo5b2obobob2o2b2o6bo2bobob2o2b2o$bo9bo5bo5bob2obobo2bo9b3obob o2bo8bob2obobo2bo9b3obobo2bo$2o8b2o4b2o9bo4b2o14bo2b2o12bo4b2o14bo2b2o $2b2obo6b2obo11bob3o13b3o17bob3o13b3o$2bob2o6bob2o12bo2bo13bo20bo2bo 13bo$29b2o36b2o7$26bo$27bob2ob2obo$2b2obo6bob2o9b3o2bobob2o$2bob2o6b2o bo14bobo$6b2o2b2o19b2o$6bo4bo11b2o$7bo2bo12bo2bob2o$6b2o2b2o13b2obo$2b 2obo6bob2o10bobo5b2obo$2bob2o6b2obo9bo2b3o3bob2o$2o14b2o8b2o3bo$o16bo 10b4o$bo14bo11bo$2o14b2o8bobob2o$2b2obo6bob2o10b2o2bo$2bob2o6b2obo14bo bo$31b2o!golly-3.3-src/Patterns/Life/Still-Lifes/eaters-misc.rle0000644000175000017500000000171512026730263017746 00000000000000#C Some examples of eater-like objects consuming #C things that aren't gliders or spaceships. #C Pattern from Jason Summers' "jslife" archive. x = 99, y = 49, rule = B3/S23 36bo5boo$4bo32bo5bo17bo14bo$3bobo31bo5boboo8bo4bobo14b3o$3bobo9boo16bo 3bo4boobbo7bobo3bob3o13bo8boobbobbooboo$4bo10boo17b3obbo4boo7bobbobboo 4bo22boboo3boboo$39b5o10boobbo3b3o12bobo9bo5bo$4boo11boobo16boo4bo14b 5o14boobo11boobo$4boo11boob3o15bobboo13boo22bo10bobbo$23bo14bobo14bobo bb3o17boo8boboo$17boob3o10bobbobobo12b3obobobbo27bo$18bobo12b4oboo12bo 4bobo29boo$18bobo16bo15boobooboo$19bo15bobo16bobo$35boo17bobo$55bo8$ 27bo52b3o$26bobo15bo22bo$3o22bobbo11boboo9bo$3o10b3o10boo13bo25boo13b ooboboo$54b3o11boo9boboboboobo$3boo11boo10boo12boo34boboobo$3bo12bo11b o14bo12bo11bo9bo3boo$4b3o10b3o9b3o10bo12bobo9bobo9boo$6bo12bo11bo10boo 12bo11boo11boobo$81boboo10$67bo$33boobboo12boo14bo$35b3o9boboo16bo10bo 6bo$48bo29bo6bo$38bo12bo11b3obboo8bobboobbo$38b3o9bobo14bobo10bobbo$ 41bo9bo15boo12boo$40boo! golly-3.3-src/Patterns/Life/Still-Lifes/random.rle0000644000175000017500000001667512026730263017025 00000000000000#C Random-looking still life, created by Gabriel Nivasch. x = 98, y = 98, rule = B3/S23 2obob2o3b2ob2o2bob2o3b2o3b2o2bo5bo8b2o2b2obob2ob2o3b2ob2o3b2o5b2ob2obo 3b2ob2obo$ob2obo5bobo2bob2o3bo2bobobo2b3o3b3o5bo2bo2bob2obobo4b2obobo 3bo2b2o2bobob2o2bobobob2o$6bo4bo2bobo4bo2bobobo7bo5bobo2bo2bobo5bobobo 6bo3bo3bob2o2bo3b3obobo$b6o5b2obobob2ob2obo2bo4b2obo2b4ob3ob3obob2ob2o bob6obobo2b3o4b2ob2o4bobob3o$o12bo3b2obobo2bobob2o2bob2obo8bo3b2o2bobo 2bo6bobob2obo2b3o4bob2o2bobo3bo$b2ob2obobobobo2bo3bobo2bobo2bo7bob2ob 4o2bo3bobobobo2b3obo2bo4bo2bo2b4o4bobo2b2o$2bobob2ob2obo3bo3bobob2o2bo 2b6ob2obobo3b3ob2o2bobob3o2bob2obob3o4b2o3bob2obob2obo$2bobo7bobobob2o 3bo2b2o8bo7b3o3bo2b3obo4bobo4b2o3b4o2bo3bobobo4bo$b2obob6ob2o2bo6b2o2b 6o2bob6o4bo2bo5b4obobob2o4bo6bo2bobobobob3ob2obo$o3bobo4bo3bobo8bobo5b obobo5b4ob2ob4o4bobobobob5ob4obob2o2bobobo4bob2o$b4o2b2o3bobo2bobo4b2o 2bobobobobo3bo2bo3bo2bo5b3o3bo2bo7bo3bobo3bobobo3b3o$5bobo3b2obobob2o 5bobob3obobob3obo2bo3bobob4o2b2o2b2obob4o2bob2o2bo3bobo2b3o3b4o$b5o2bo 5bobo7bo2bo5bobo2bo2bob2o2b2obobo3bo8bobo3bobo2bobob2obo2b2o2bobo4bo$o 5bobo2b4ob6o2bobo2b3obob2o3b2o2bobo2bobo2bobob6obobo2b2ob2obobo2bob3o 2bo3b3o$4o2bobobo11bobo2b2obo2bo3b3o2bobo2bo3bob2ob2o5bobob2o5bo2bob2o 5bob4o3bo$4bobobobo2b8obob3o5bob3o2bob2ob3o3bobo6b3obobo3b4obo3bo2b6o 5bob2o$2o2bobobobobo3bo3bobo4b2obob2o3bobo3bo3b4o3b5o2bobo2b3o3bo2b3o 2bo7b5obo$obobo2bobobob2o3bobo2b2obo2b2o4bobob4o2bo5b4o3bobo2bo5b2o2b 2o3b2ob7o6bo$2bo2bobobobobob4o2bobo3bo3b4obobo4b3ob2obo5bobobobo3b2obo b2o2b2o2bobo7bob2ob2o$bobobobobobobobo3bobobob2ob3o5bo3b2o4bobob2o2b3o bobobobo2bobo3bobob2o3b2ob6obo2bo$2bo2bo2bo2bobobo2b2obob2obo4b4ob4o2b 3o3bo4bo4bobobob2obobo3bo2bo6bobo8bo$3b3o5bobobobo3bo4bob2o4bo6bo3b4ob 3ob5obo2bo3bob3obo3bobo3bo4b6o$6b5obo2bobo3bob2obobob3o2bob3obobo6bo2b o6bo3b2obo4bo3b2ob3ob6o$b4o5bobob2obob3obo2bo6b2o3bobobob5o2bobo2b2obo b3o2bo2b2o4bo6bo7bob2o$bo2bob2o4bobo3bo5bobo2b4o2b2o4bo2bo3bob2obobobo bobo2bo2b2ob2o3bob4obob5ob2obo2b2o$2bobobo5bo2b2obo2b2obobobo3bobo2b3o bobo2bobo2bobobobobobobo9bobobo3bobobo2bo7b2o$3b2o2bo5bobob2obo2b2obob o2bo2bobo2bobobob2obobo2bobob2obo2b11obobobo3bo4bob2obo$o4b3o4b2obo4b 2o4bobobo3bo2bobobobo2bo2b2ob2obo4bobo4bo7bobob5o2bobobob6o$5o10bob2o 3b4obobob3ob2obobobobobo4bo3bob2o2bo2bo4b2ob4o2bo5b3obobo6bo$4bob2o4b 4obob3o3bobobo5bo2bobobobob2o3bo3bobo4b7ob2o4bobo2b3o3bobob4o$3obo2bo 3bo5bo4b3o2bobob3obob2obobobobo2bob2ob2o2b4o11b3o2bobo3b3o2bo5bo$o2bob 2o4bob5ob2o3bobo2bobo2b2obo2bobobo2b3obo4b2o4bob2o2b5o3b2o2b3o4b2ob5o$ bobo5b2obo6bob3o2bobo3bo5b2o2bobo6bob2o3b2o2bobo2bo2bo2bobo2b2o3b4o3bo $2obob2o2bo2bo2b3o8bob3ob6o2b3o2b4ob2obob3o2bobo2b3o5bob3o2b3o3bob2o2b o$3bobobobob2obo3b9o4bo5bobo3bobo2bobo8b2ob3o9bo3bobo2b2obo2bob2o2bo$ 3bobobobo4b4o9b3obobobobo2bo2bo2bobo2b8o6b5o6b3o2bobobobobo3b3o$b2obo 2bobob2o5bo2b2o2bo3bobob2obobobo3b2obobobo7bob4o5bob4o3bobo3bobo2bobo$ bo2bob2ob2ob2ob2obo2bo2bob3o2bo4bobob2o3bobobo2b8obo3b2o2b2obo3bobo2bo 3bob2obobob2o$2bobobo9bob2obob2o4b2ob4obobo2bo2bobobo12b2o3bo4bo2b2ob 2ob2ob2o4bobobo$b2obo2b5ob2obo2bobo4b2o2bobo4bobobo2b2obob4ob4ob2obob 2ob5o3bo2bo2bo5b3o2bobo$2bobo7b2o2b3o2b4obo3bobo2b3obob3o3bo4bobo2bobo 2bo2bo10b2o2bo2b5o2b3ob2o$2bobobobobo4bo3b2o3bobo2b2obobo3bobo3b2o2b4o 3bobo2bobobo2b7o7b3o5bo4bo$b2o2bob2ob4obo2bo2b2obobobo2bobob2obo3bobo 7b4ob4o2bob2obo4b8o5b2obo2b2o2bo$o2bobo8b2obobobo2bobobobo2bobo2b5o2b 6obo8bobo2bo3bo9bob2o2bo2bobo2b2obo$b2obobob5o4bobobo2bobobo2b3obobo5b obo4bo3b2ob2o2bob2obo2b10obobobobo2bob2obo2bo$4bobobo4b4o2bob2obobob3o 5bobob2obo2b2o3b3obobobobo2bobobo10b2obobob2obo2bobobo$b2obobo2b3o5b2o 5bobo4bob2obob2obobo4bo6bo3bobobo2bobo2b3ob3o4bobo4bobo2bob2o$o2bo2b3o 3b4obo6bobob4obo2bo5bob4o2bob2obobo2bo2bobo2bobo2bobo2b3obo2b4obo3bo$b o2b2o3b3o3bobobob2obobobo5b3ob3obobo3b4obobob3o3bobobo2b2o3bobo2bob2ob o3bo3b2ob2o$2b2o3b2o4bobobob2obobobo2b5o3bo2bobo2b3o5bobo4b4obobobo5bo b2obo2bobobo6bob2o$5b2o2b6obobo3bobob2obo4b2obobo2b3o3b6obob2obo4bobob 5obo2bob2obobob2o5bo$2b3o2bobo6bo2bob2obo4bob2o3b2obobo3b2o9bobo2b4o2b 2o4bob3o5bobo3bo3b2o$bo3bobobob4ob3o3bobob2obobob2o3b2obob2o2b5ob3o3b 2o3bobo3b2obo4b5obob3obo3bob2o$bobo2bo2bobo2b2o3b2o3bob2ob2o2bob2o4b2o bobo4bobo2b3o2bobo2bob2obobob2obo3bobo3bo2bo2bob2o$2ob2obobo3bo4bo3b4o 8bobob4o3bo2b2o2bobobo3bobobobobo4bo2bo2bobo4b2obo3bobo$6bob5ob2ob4o4b 9obobo2bob2obobobobobo2bobo2bobobobob2obobo2b2ob4obobob3o2bo$2ob2o2bo 6bobo5b3o4bo4bo3bobobo2bo3bobob4obobobo2b2obobo2bob2o6bobobo4b2ob2o$bo bo4b6o2bob4o4bo4b2obob3obo2b3obobobo5bo2bobobo3bo2bobo2bob4obobob5o2bo 2bo$o2bobo7bobobo5bob2o5bo2bo4b3o3bobo3b5o3bobo2bobob3o2bobobo2bobobo 5bo2bobo$2obob7o3bo3b5obo6bo3b4o3b2obobob2o5b3o2b4obo4b2o2bo2bobobobob 2o2bob2ob2o$bob2o7b3ob3obo5bo3bob4o3bobo2bobobobo2b3o4b2o6b4o4b2obobob obobobobobo$o5bob2o2bo3bo5b4obobobo4b2obob3o2bobo3b2o2b3obo2bob3o4b4o 2bobob2obo3bobobo$4ob2obo7bob4obo3bobo3b2obobo5b2obobo6bo2bo2b2obo2b3o bo3bobobo4b4o3bob2o$3bobo2bo2bo3b2obo8bob4obobobob4o3bob4obobobo4bobob o2bobo2b2obo2b4o4b2obobo$2obo2bobobobobo6b2o2b2obo3bobobobobo3bob2o5b 2obob2o3bo2bob2o2bobo2bobobo4bo2bob2obo$obobobobobobob2ob5o4bobob2o3bo 2bo2bob2obo2b3o3bobo3b2obobobo3bobo2bobobob3obobo4b2o$2bobobobobobo2bo bo5bo2bo2bo2b3o3b3o3bo3b2o2b2obobob2obobobobo2b2o2b3obo2bo2bobob4obo2b o$2bobobobobob2obo2b6o3bobobo9b2obo6bo2bobobobobobobobobo2b2o4b2obobo 2bo4bobob2o$b2ob2obo2bobo2b3o2bo7bo2b4o2bobo2bobob4obobo2bobobobobob2o bobo4bobo3bobobo2b2o3bobo$bo5bobo2bobo3bo3b2o2bobobo3b4ob3o2bobo2bobob 3o2bo2bo2bo4bob6obob2obobob2o2b4o2bo$2b6ob2obo2bobo3b2o2bobobob2o5bo5b obobo2b2o3b2obobobo2b3obo7bobo2bobo3b2o4b3o$11bob3ob2o5b2obo2bo2b4obob obobo2bob2o3bo4bobo2b2o2bobob5obo2bobo2bobo3bobo$4ob5obo13bob2obobo4bo b2ob2obobo2bob2ob4obob2o2b2o2bobo3bo2bobobob2ob4ob2ob2o$o2bobo3bo2b4ob 2o6bo2bobob4obo7bob2obo2bo6bo2bobo2b2o2bobo2bobobobo7bo3bobo$5bobo2b2o 3bobo2bo2bob2obo2bo4bo2b2ob4obo2bobo2b3obobobo2bo5bob4obobobob5o3b2o$ 4bobob2o2bo2bo2bob4o2bo2bobob2o5bobo4bobobob2o2bobobob2obob5o5bo2bobob o4b3o2b2o$3bo2bobo2bobob2obo5bo3b2ob2o2b5o2bob2obobobo3bobobob2o3bobo 5b3obobo2bo3b2obo2bo2bo$3b4obob2obo4b5o2b3o6bo4bobobo2bobobo2b3obo2bo 3b3obo2b3o3b2obobob4o2bobob2o$o7bo2bobob3o5b2o4b6ob2obobobobo2bo2b2o3b ob2o2b2o4bobo4bo3b2obo6bo2bo$4ob4o2bobobo2b5o3b3obo5b2obo2b2obobobobo 2bo2bo2b2o2b4o2b5ob2o3bobob3ob2obo$3bobo3b2o2bo2bo6b3o6b3o4bo4bobo2bo 2bob2obobo2bo5b2o6bob3o2bobo2bo3b2o$2obo3bo2bobob2ob4obo2bob5o2bob2ob 5o2bobobobo2bobobobob5o3bob2obo3bob2o2bobob2o2bo$obo2bob2o3bo3bo3bobo 3bo5bo2bobo5bobobobobobo4bob2obo4b4obo2bo3bo3b3o2bobobobo$3b3o3b3ob2ob o2bo3b3o2b3o2b2o2bob3obobobobo2bob3obo5b4o5bo2b2o3b3o3bobobobo2bo$6bob o4bo2bobob3o3b2o3b2o2b2obo2bobobobo2bobo4bobob2obo3bob3ob2o3bobo3b2o2b obob2obo$b4obob4obob2obobo2bobo2b2o4bo3bobo2bobob2obob4o3b2obo4b2obo2b o2b4o3b2obob2obobo2b2o$o4bo5bobobo2bobo2bobobo2b5ob2obob3obo3bo6b3o3bo bo3bobobo2bo4b3obobo2bobobobo$4obob4o2bobob2o2b3ob2o2bo5bobo2bo4b3o2b 4obo3bobo2b4o2bob2obob2o3bobob2obobobo2b2o$3bobobo2bob2o2bo2b2o9b4obob o4b3o3b2o3bob5obobo6bo4bobob2obobo3bo2bo2bobo$2obobo2bo2bo2bobobo2bob 7o3bob2ob4o2bobo3bo2bo7bo2bob5ob4obo3bobobobo3bob2o2bo$o2bo2bob2obo2bo bob2obobo6b2obo4bo3bo3b3o2bob6obo2b2obo4bo5b3obo3bobobobo2bob2o$bob4o 4b4obo4bobob4obobob3obob2ob3o3b3o6bob2obo2bob2obob4o3bob4obob2obo3bo$ 2o5b4o5bob3obo2bo2bo3bo4bobo3bo2b3o3b5obo4bob2obo2bobo4bobo5b2o4b2o2bo $2b4obo2bob2obo2bo3bobo3bobo2b3obo2b2obobo3b2o6b2ob2obo4bobo3b4obobob 2o4b3o2bob2o$2bo2bo2bobobo3b2o4bo2b4ob3o3bob2o2bo2b2o2bob5o4bo2b6ob4o 3bobobobob4o3bobo$6bobobobob2o4b2obobo7bo2bo3bobobo2bobobo2bo5bobo6bo 4bo4bobobobo3bobo2bob2o$5b2obobo2bo2bobo2bobobob2ob3o2b2o3bobob2o2bobo 5bobobobobob2obob3o5bobobo2bo2bobobo2b2o$9b2o4b2ob2o4b2ob2obo10bo7bo5b 2ob2o3b2obob2obo6b2ob2o2b2o3b2ob2o! golly-3.3-src/Patterns/Life/Bounded-Grids/0000755000175000017500000000000013543257426015413 500000000000000golly-3.3-src/Patterns/Life/Bounded-Grids/Klein-bottle.rle0000644000175000017500000000054512026730263020362 00000000000000#CXRLE Pos=-10,-3 #C #C If one pair of opposite edges of a bounded grid are twisted 180 degrees #C (ie. reversed) before being joined then the result is a Klein bottle. #C In this example the twist is on the horizontal edges. #C For more details see Help > Bounded Grids. #C x = 20, y = 6, rule = LifeHistory:K40*,20 16.3A$16.A2.A$16.A$3A13.A$A16.A.A$.A! golly-3.3-src/Patterns/Life/Bounded-Grids/herringbone-agar-p14.rle0000644000175000017500000000267712026730263021655 00000000000000#CXRLE Pos=-24,-24 #C #C A period 14 agar with herringbone symmetry in a toroidal grid. #C Discovered by Gabriel Nivasch's Random Agar program. #C x = 48, y = 48, rule = B3/S23:T48,48 2b3o3b2o2bo13b3o3b2o2bo$2b2o3b4o5bo6bo2b2o3b4o5bo6bo$2bo13b3o3b2o2bo 13b3o3b2o$o5bo6bo2b2o3b4o5bo6bo2b2o3b3o$6b3o3b2o2bo13b3o3b2o2bo$3bo2b 2o3b4o5bo6bo2b2o3b4o5bo$2b2o2bo13b3o3b2o2bo13b3o$b4o5bo6bo2b2o3b4o5bo 6bo2b2o$10b3o3b2o2bo13b3o3b2o2bo$o6bo2b2o3b4o5bo6bo2b2o3b4o$3o3b2o2bo 13b3o3b2o2bo$2o3b4o5bo6bo2b2o3b4o5bo6bo$o13b3o3b2o2bo13b3o3b2o$4bo6bo 2b2o3b4o5bo6bo2b2o3b4o$4b3o3b2o2bo13b3o3b2o2bo$bo2b2o3b4o5bo6bo2b2o3b 4o5bo$2o2bo13b3o3b2o2bo13b3o$3o5bo6bo2b2o3b4o5bo6bo2b2o3bo$8b3o3b2o2bo 13b3o3b2o2bo$5bo2b2o3b4o5bo6bo2b2o3b4o5bo$o3b2o2bo13b3o3b2o2bo13b2o$3b 4o5bo6bo2b2o3b4o5bo6bo2b2o$12b3o3b2o2bo13b3o3b2o2bo$2bo6bo2b2o3b4o5bo 6bo2b2o3b4o$2b3o3b2o2bo13b3o3b2o2bo$2b2o3b4o5bo6bo2b2o3b4o5bo6bo$2bo 13b3o3b2o2bo13b3o3b2o$o5bo6bo2b2o3b4o5bo6bo2b2o3b3o$6b3o3b2o2bo13b3o3b 2o2bo$3bo2b2o3b4o5bo6bo2b2o3b4o5bo$2b2o2bo13b3o3b2o2bo13b3o$b4o5bo6bo 2b2o3b4o5bo6bo2b2o$10b3o3b2o2bo13b3o3b2o2bo$o6bo2b2o3b4o5bo6bo2b2o3b4o $3o3b2o2bo13b3o3b2o2bo$2o3b4o5bo6bo2b2o3b4o5bo6bo$o13b3o3b2o2bo13b3o3b 2o$4bo6bo2b2o3b4o5bo6bo2b2o3b4o$4b3o3b2o2bo13b3o3b2o2bo$bo2b2o3b4o5bo 6bo2b2o3b4o5bo$2o2bo13b3o3b2o2bo13b3o$3o5bo6bo2b2o3b4o5bo6bo2b2o3bo$8b 3o3b2o2bo13b3o3b2o2bo$5bo2b2o3b4o5bo6bo2b2o3b4o5bo$o3b2o2bo13b3o3b2o2b o13b2o$3b4o5bo6bo2b2o3b4o5bo6bo2b2o$12b3o3b2o2bo13b3o3b2o2bo$2bo6bo2b 2o3b4o5bo6bo2b2o3b4o! golly-3.3-src/Patterns/Life/Bounded-Grids/lightspeed-bubble.rle0000644000175000017500000002646312026730263021421 00000000000000#CXRLE Pos=-300,-68 #C #C A "bubble" in a sea of stripes moves at light speed. #C Created by Gabriel Nivasch. #C x = 600, y = 136, rule = B3/S23:T600,136 600o2$600o$379bo$347o2b4ob2ob2ob2ob2ob2ob2ob4o4b220o$348b2o4b2o4b2o4b 2o4b2o4bo$347o3bo5bo5bo5bo5b226o$375bo$347o29b224o$348bo4bo4bo17bo3bo$ 347o3b2o2bobo2bo16b3o3b218o$350bobob5o17bo5bo3bo$352ob5o18b3o3b3o3b 212o$350b2o24bo5bo5bo3bo$57o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b2o25b3o3b3o3b3o3b 206o$58b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b4o24bo5bo5bo5bo3bo$57o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o6bo22b3o3b3o3b3o3b3o3b200o$353bo22bo5bo5bo5bo5bo3bo$55o321b3o3b3o 3b3o3b3o3b3o3b194o$376bo5bo5bo5bo5bo5bo3bo$53o5b2o299bo16b3o3b3o3b3o3b 3o3b3o3b3o3b188o$56b2o3bo20b2o274bobo15bo5bo5bo5bo5bo5bo5bo3bo$55ob2ob 2obob2o3bo3bo3bo3b3o274bobo15b3o3b3o3b3o3b3o3b3o3b3o3b3o3b182o$61bo4bo bobobobobobob2o294bo5bo5bo5bo5bo5bo5bo5bo3bo$59o6bo3bo3bo3bo2b2obo292b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b176o$64bo15bo2bo259b3o30bo5bo5bo5bo5bo 5bo5bo5bo5bo3bo$57o23bo261bo2bo30b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 170o$80bo264bo30bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25bo260bo3bo30b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b164o$80bo264bo30bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo3bo$55o25b2o260bobo31b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b158o$80b3o10bo282bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 55o25b3o6b2ob3o281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 152o$80b3ob3o2b2obo2bo231b3o46bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3b o$55o25b3ob3o4bo234bo2bo46b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b146o$80b3ob3o6b3o233bo46bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$55o25b3ob3o5bob2o229bo3bo46b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b140o$80b3ob3o5b3o234bo46bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3ob3o5b3o231bobo47b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b134o$80b3ob3o289bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3ob3o5b2o282b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b128o$80b3o3bobo 3bo218b3o62bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o 25b3o2b2ob2obo218bo2bo62b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b122o$80b2o3b2o2bo223bo62bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25bo4b3obo17bo201bo3bo62b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b116o $80bo2bo3b2o19b2o203bo62bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo3bo$55o25bo26b2o201bobo63b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b110o$80b2o294bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3o44bo248b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b104o$80b3o45b2o165b3o78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo3bo$55o25b2o45b2o165bo2bo78b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b98o$ 80bo2bo213bo78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo3bo$53o5b2o20bo66bo145bo3bo78b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b92o$56b2o3bo 18bo2bo64b2o147bo78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo3bo$55ob2ob2obob2o3bo3bo3bo2b2obo63b2o145bobo79b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b86o$61bo4bobobobobobobob2o294bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o6bo3bo3bo3bo3b 3o83bo208b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b80o$64bo17b2o84b2o109b3o94bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 57o110b2o109bo2bo94b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b74o$281bo94bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 3bo$55o5b2o125bo89bo3bo94b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b68o$58b2o 3bo32bo91b2o91bo94bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$57ob2ob2obob2o3bo3bo3bo3bo3bo3b4o2b2o 88b2o89bobo95b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b62o$63bo4bobobobob obobobobobobobob2o282bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$61o6bo3bo3bo3bo3bo3bo3bo2bo112bo 168b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b56o$66bo25b2o114b2o53b3o 110bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo3bo$57obo33bo3bo110b2o53bo2bo110b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b50o$58bo33bo172bo110bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo $55o37bo134bo33bo3bo110b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b44o$92b2o134b2o35bo110bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo$55o37b3o132b2o33bobo 111b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b44o$92b3o6b2o2bo 270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo3bo$55o37b3ob3o2b2o2bo141bo128b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b50o$92b3ob3o149b2o126bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo $55o37b3ob3o147bo2bo126b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b56o$ 92b3ob3o147bo2bo126bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o37b3o2b2o20b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o16bo126b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b62o$ 92b3o17bo5bo2bo13bobo13bobo13bobo13bobo13bobo13bobo13bobo10bo4bo126bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo3bo$55o37b3o5b2o9b2o23bo15bo15bo15bo15bo15bo15bo10bo4bo127b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b68o$92b3o5b3o7bo10b2o122b2o129bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 3bo$55o37b3o4b2ob2o2b7o263b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b74o$92b3o4bo 3bobo5b2o4bo106b2o150bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo3bo$57o35b3o9bob2o3bo5bo105bobo150b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b80o$58bobobo29b2o16bo114bo150bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$57o3bo31bo2bo21bo 258b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b86o$62bo29bo111b2o170bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o2bo8bo21b2o109bobo 170b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b92o$60b5o6bo3bo3bo3bo3bo3bo2bo110bo170bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o8bo4bobo bobobobobobobobob2o282b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b98o$62b2ob2obob2o3bo3bo3bo3bo3b 4o2b2o85b2o190bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$61ob2o3bo28bo86bobo190b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b104o$64b2o119bo190bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o317b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 110o$62bo21b2o3bo74b2o210bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo3bo$57o6bo3bo3bo3bo3bo3bo2bo2bo73bobo210b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b116o$59bo4bobo bobobobobobobobo82bo210bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$53ob2ob2obob2o3bo3bo3bo3bo3bo2bo289b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b122o$54b2o3bo23b3o58b2o 230bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$51o5b2o25b2o 58bobo230b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b128o$83b2o60bo230bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3b o$53o30bo292b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b134o$83bo40b2o250bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 53o30bo39bobo250b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b140o$83bo2bo38bo250bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 53o30b2o291b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b146o$ 83b3o4bo14bo270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30b2o3b2ob o12b2o270b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b152o$83bo2bo bo2bo11bobo270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo5bo7b2o4b 2o271b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b158o$83bo3bo8b2obo6b 2o268bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo18b2o268b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b164o$83bo3bo6bo281bo5bo5bo5bo5bo5bo5bo5b o5bo5bo3bo$53o30bo3bo4bobo281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b170o $83bo3bo3bo3bo280bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo3bo3bo280b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b176o$83bo3bo3bo284bo5bo5bo5bo5bo5bo5bo5b o3bo$53o30bo3bo6bo281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b182o$83bo3bo3bobo 282bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo3b2o283b3o3b3o3b3o3b3o3b3o3b3o3b 188o$83bo292bo5bo5bo5bo5bo5bo3bo$53o30bo2bo289b3o3b3o3b3o3b3o3b3o3b 194o$83b2o291bo5bo5bo5bo5bo3bo$53o30b3o290b3o3b3o3b3o3b3o3b200o$83b3o 290bo5bo5bo5bo3bo$51o5b2o25b2o291b3o3b3o3b3o3b206o$54b2o3bo23b3o290bo 5bo5bo3bo$53ob2ob2obob2o3bo3bo3bo3bo3bo2bo289b3o3b3o3b212o$59bo4bobobo bobobobobobobo293bo5bo3bo$57o6bo3bo3bo3bo3bo3bo2bo2bo286b3o3b218o$62bo 21b2o3bo286bo3bo$55o321b224o$375bo$55o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3bo5b226o$56b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o4b2o4bo$ 55o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b4ob4o4b220o$379bo! golly-3.3-src/Patterns/Life/Bounded-Grids/cross-surface.rle0000644000175000017500000000057512026730263020613 00000000000000#CXRLE Pos=-13,-4 #C #C If both pairs of opposite edges of a bounded grid are reversed and then #C joined, the result is a cross-surface (or real projective plane). #C Note that gliders cannot pass through the corner cells. #C For more details see Help > Bounded Grids. #C x = 26, y = 12, rule = LifeHistory:C40,20 15.A$2A12.A9.2A$A.A11.3A6.A.A$A24.A4$9.A.A$8.A$8.A$8.A2.A$8.3A! golly-3.3-src/Patterns/Life/Bounded-Grids/sphere.rle0000644000175000017500000000055212026730263017315 00000000000000#CXRLE Pos=-10,-10 #C #C If the adjacent edges of a bounded grid are joined then the #C result is a sphere. Note how the gliders behave differently #C as they pass through the corner cells at a "pole" or "equator". #C For more details see Help > Bounded Grids. #C x = 20, y = 20, rule = LifeHistory:S30 2A16.2A$A.A14.A.A$A18.A13$12.3A$12.A2.A$12.A$12.A$13.A.A! golly-3.3-src/Patterns/Life/Bounded-Grids/torus.rle0000644000175000017500000000047712026730263017211 00000000000000#CXRLE Pos=-2,-2 #C #C If the opposite edges of a bounded grid are joined then the result #C is a torus. If the edge lengths are relatively prime, as in this #C example, then a glider will eventually visit every cell. #C For more details see Help > Bounded Grids. #C x = 3, y = 3, rule = LifeHistory:T31,20 .A$2.A$3A! golly-3.3-src/Patterns/Life/Bounded-Grids/agar-p3.rle0000644000175000017500000000572012026730263017263 00000000000000#CXRLE Pos=-36,-24 #C #C A period 3 agar in a toroidal grid. #C Discovered by Gabriel Nivasch's Random Agar program. #C x = 72, y = 48, rule = B3/S23:T72,48 obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bo bo$4bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$b2obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bo$o5bobo5bobo5bobo5b obo5bobo5bobo5bobo5bobo5bo$bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob 2obo2bob2obo2bob2obo2bob2obo$obo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bo bo$o2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2b ob2o$2bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bobo$4bobo5bobo5bobo 5bobo5bobo5bobo5bobo5bobo5bobo$b2obo2bob2obo2bob2obo2bob2obo2bob2obo2b ob2obo2bob2obo2bob2obo2bob2obo2bo$o5bobo5bobo5bobo5bobo5bobo5bobo5bobo 5bobo5bo$bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2o bo2bob2obo$obo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$o2bob2obo2bob2o bo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2o$2bobo5bobo5bo bo5bobo5bobo5bobo5bobo5bobo5bobo$obo2bob2obo2bob2obo2bob2obo2bob2obo2b ob2obo2bob2obo2bob2obo2bob2obo2bobo$4bobo5bobo5bobo5bobo5bobo5bobo5bob o5bobo5bobo$b2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob 2obo2bob2obo2bo$o5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bo$bob2obo2b ob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo$obo5bob o5bobo5bobo5bobo5bobo5bobo5bobo5bobo$o2bob2obo2bob2obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2o$2bobo5bobo5bobo5bobo5bobo5bobo 5bobo5bobo5bobo$obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bo b2obo2bob2obo2bobo$4bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$b2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bo$o 5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bo$bob2obo2bob2obo2bob2obo2bo b2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo$obo5bobo5bobo5bobo5bobo 5bobo5bobo5bobo5bobo$o2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2o$2bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$o bo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob o$4bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$b2obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bo$o5bobo5bobo5bobo5b obo5bobo5bobo5bobo5bobo5bo$bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob 2obo2bob2obo2bob2obo2bob2obo$obo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bo bo$o2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2b ob2o$2bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$obo2bob2obo2bob2obo 2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bobo$4bobo5bobo5bobo 5bobo5bobo5bobo5bobo5bobo5bobo$b2obo2bob2obo2bob2obo2bob2obo2bob2obo2b ob2obo2bob2obo2bob2obo2bob2obo2bo$o5bobo5bobo5bobo5bobo5bobo5bobo5bobo 5bobo5bo$bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2o bo2bob2obo$obo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo$o2bob2obo2bob2o bo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2obo2bob2o$2bobo5bobo5bo bo5bobo5bobo5bobo5bobo5bobo5bobo! golly-3.3-src/Patterns/Life/Bounded-Grids/torus-with-shift.rle0000644000175000017500000000037112026730263021266 00000000000000#CXRLE Pos=-2,-2 #C #C A torus can have a shift on the horizontal edges (as in this example) #C or on the vertical edges, but not both. #C For more details see Help > Bounded Grids. #C x = 4, y = 5, rule = LifeHistory:T30+7,20 A.A$3.A$3.A$A2.A$.3A! golly-3.3-src/Patterns/Life/Bounded-Grids/pulsars-in-tube.rle0000644000175000017500000000125612026730263021063 00000000000000#CXRLE Pos=-1,-34 #C #C Life in a Tube investigated intermittently by Tony Smith since 1985. #C #C Circumference 17 tube shown rolled out 4 times for aesthetic reasons. #C #C Pulsars was discovered almost immediately after the general principle #C of Life in a Tube was revealed when applying Full Paint's command-L #C Easter Egg to a screen dump which included a MacDraw ruler. This #C particular discovery helped keep the project motivated. x = 2, y = 68, rule = B3/S23:T0,68 bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$b o$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo $bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo! golly-3.3-src/Help/0000755000175000017500000000000013543257425011175 500000000000000golly-3.3-src/Help/control.html0000644000175000017500000002465413543255652013476 00000000000000 Golly Help: Control Menu

Start/Stop Generating

Starts or stops generating the current pattern. This item can also be used to stop a running script, but it's much easier to hit escape or click the tool bar's stop button.

Next Generation

Advances the pattern to the next generation. Note that you can hit control-space to advance only the current selection, or shift-space to advance everything outside the selection (in both cases the generation count will not change).

Next Step

Advances the pattern to the next step. The current step size is displayed in the status bar as a number of the form "b^e" where b is the base step and e is the exponent. The base step can be changed by the Set Base Step dialog (see below), and the exponent can be changed by the Faster/Slower items (see below).

Reset

Restores the starting pattern and generation count. It also resets the algorithm, rule, scale, location, step size, selection and layer name to the values they had at the starting generation. The starting generation is typically zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

Set Generation...

Opens a dialog to change the generation count. You can enter readable numbers like "1,234,567", or include a leading +/- sign to specify a number relative to the current generation count.

Faster

Increases the step exponent in the status bar by 1. This increases the speed by displaying fewer generations. The step exponent is reset to 0 when you create a new pattern, load a pattern file, or switch to a different algorithm.

Slower

Decreases the step exponent in the status bar by 1. This decreases the speed by displaying more generations. The step exponent is reset to 0 when you create a new pattern, load a pattern file, or switch to a different algorithm. If the exponent is 0 when you select this item then a small delay will occur between each generation. Further slowing will double the delay until a maximum value is reached. Use Preferences > Control to set the minimum and maximum delay times.

Set Base Step...

Opens a dialog to change the current base step, but only temporarily. Golly will restore the default base step (set in Preferences > Control) when you create a new pattern, load a pattern file, or switch to a different algorithm. The base step can be any number from 2 to 2,000,000,000. Golly may reduce the exponent when setting a base, if necessary. Be aware that Golly's hashing algorithms are most efficient when the base step is a power of 2.

Auto Fit

If ticked then Golly will automatically fit a generating pattern inside the view if any part of the pattern moves out of view. This option is only used when doing many generations via Start or Next Step (that's why it's in the Control menu rather than the View menu), or when displaying patterns in a timeline (see Show Timeline).

Note that if you are generating a pattern and decide to change scale or do any sort of scrolling then the Auto Fit option is automatically turned off (the assumption being that you now want manual control over the scale and/or location).

TIP: If you find the Auto Fit option too confusing then leave it off and hit "f" to manually fit the pattern inside the view whenever you like.

Hyperspeed

If ticked, and the current algorithm uses hashing, then Golly will automatically increase the step exponent at regular intervals (every 64 steps). Hyperspeed mode is a convenient way to run a complex pattern as far as possible. (For very chaotic patterns, using QuickLife may actually run it further.) For highly regular patterns, hyperspeed mode quickly "runs away", generating exponentially fast.

Show Hash Info

Tick this option to turn on status messages that inform you when a hashing algorithm is doing garbage collection, resizing its internal hash table, or changing the step size (which can involve walking the entire hash). The garbage collection messages say which garbage collection it is overall, and if it is a subsequent garbage collection for the same step (the count will be in parentheses), and the percentage of memory reclaimed.

Interpreting these numbers is more an art than a science because some patterns exhibit odd behavior, but in general, if a garbage collection is reclaiming less than 70% of the total memory, or more than ten garbage collections occur for a single step, you can be fairly certain that the algorithm is effectively stalled and further progress will be extremely slow. Reducing the step size may help, but it may need to be reduced substantially in order to have an impact. Increasing the maximum memory that the algorithm can use may also help.

Show Population

Displaying the population count can cause a significant slow-down when generating large patterns, especially when using HashLife or any of the other hash-based algorithms. If you untick this option then Golly won't calculate the population count and will simply display "Population=disabled" in the status bar while generating a pattern. The correct count will be displayed when generating stops.

You can also toggle this option by clicking anywhere in the "Population=..." text, but you can only do this while a pattern is being generated. Or you might prefer to assign a keyboard shortcut to toggle the option.

Start/Stop Recording

This item lets you start recording a new timeline (if none exists), or extend an existing timeline (always from its final frame). Golly will proceed to generate and save (in memory) a sequence of patterns separated by the current step size.

If a timeline is being recorded then this item will stop the recording. Note that it's probably easier to click on the start/stop button in the timeline bar (use Show Timeline in the View menu to show/hide this bar). Recording will also stop if you hit the escape key, or if the maximum number of frames is reached (32,000).

A lot of Golly's functionality is disabled while a timeline exists (which includes when it's being recorded). For example, you can't do any editing or generating, nor can you change the current algorithm, rule or step size. You can however do the usual zooming and panning, and you can add/delete/switch layers (each non-cloned layer has its own separate timeline). You can also make selections, but only the last selection is remembered when the timeline is deleted.

Delete Timeline

Deletes the existing timeline. The currently displayed frame becomes the current generation (any later frames are lost), but Golly saves the first frame of the timeline so you can Reset/Undo back to that generation.

Convert Old Rules

Converts any .table/tree/colors/icons files into corresponding .rule files (but existing .rule files will not be changed). Golly looks in the supplied Rules folder first, then in your rules folder. The results are displayed in the help window. If the conversion succeeds you'll be asked if you want to delete the .table/tree/colors/icons files.

Set Algorithm

This submenu lets you switch algorithms. Note that changing the current algorithm can change the current rule. If the new algorithm doesn't support the current rule then Golly will switch to the new algorithm's default rule. If a pattern exists then some cell states might have to be modified if the new universe has fewer states than the old universe.

Golly assigns a different status bar color to each algorithm to give you some feedback about which algorithm is currently in use. You can use Preferences > Color to change these colors.

Most of Golly's algorithms (all except QuickLife and Larger than Life) use a hashing technique to generate patterns. This method performs brilliantly on patterns that have a lot of regularity in time or space. Conversely, it can perform very poorly on chaotic patterns. A hashing algorithm may initially appear to be slow, but as the hash table fills up with knowledge about the pattern, it will run faster and faster, so be patient.

Use Preferences > Control to set the maximum amount of hash memory for each algorithm. The initial setting is 500MB. The higher you set the memory limit, the larger patterns you can run and the farther and faster you can run them. However, setting this limit high also increases the amount of time required to change the step size (both manually and in hyperspeed mode) and increases the length of the garbage collection pauses. Nonetheless, it is generally best to set this quite high — typically 50% of the amount of physical memory in your computer. Setting this number high enough often makes more than a difference of 1000 in performance. How high is high enough depends greatly on the pattern and the step size, however, in unpredictable ways.

Set Rule...

Opens a dialog to change the current rule (which is displayed inside square brackets in the main window's title bar). The dialog also allows you to change the current algorithm — if the current rule is not valid in the new algorithm then the algorithm's default rule will be used.

A help button can be used to expand the dialog and display information about the current algorithm along with examples of the rules it supports. If you click on one of the special rule links then the rule string is automatically pasted into the new rule box. Another way to enter a new rule is to choose one from the list of named rules. You can add your own names to this list.

By default, all algorithms create an unbounded universe, but it's also possible to create a bounded universe by adding a special suffix to the usual rule. See here for details. golly-3.3-src/Help/file.html0000644000175000017500000001442313125321675012721 00000000000000 Golly Help: File Menu

New Pattern

Creates a new, empty universe and switches to a scale suitable for editing cells. Use Preferences > File to set the scale (initially 1:32), the cursor mode, and whether any selection should be removed.

Open Pattern...

Opens the standard file browser so you can select a pattern file. Golly can read all the common pattern formats: RLE, PC Life 1.05/1.06, dblife, some MCell files, and text patterns like "ooo...ooo". It can also read patterns in a "macrocell" format which allows huge, highly repetitive patterns to be stored in a very compact way. Such files usually have a .mc extension. If a .mc file contains timeline data then Golly will load all the frames and automatically show the timeline bar.

All the above formats are text based and can have DOS/Mac/Unix line endings, or they can be compressed in a .gz file.

Golly can also read graphic files in a number of popular formats: BMP, GIF, PNG and TIFF. The file name must end with an appropriate extension: .bmp, .gif, .png, .tif or .tiff. All the pure white pixels (RGB = 255,255,255) are treated as cells of state 0. All other pixels are treated as cells of state 1. This can be handy if you prefer to use a sophisticated drawing program to create your patterns.

Use Preferences > File to set the cursor mode, and whether any selection should be removed.

Open Clipboard

Opens a pattern stored in the clipboard. The References section has links to a number of good sources for clipboard patterns.

If the clipboard text starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder (set in Preferences > Control) and switch to that rule.

Open Recent

This submenu lets you open a recently loaded pattern file. The most recent file is always at the top. The maximum number of pattern files remembered is determined by a setting (initially 20) which you can change in Preferences > File.

Save Pattern...

Opens the standard file saving dialog so you can save the current pattern in RLE format (but only if all live cells are within coordinates of +/- 1 billion), or in macrocell format if the current algorithm supports hashing. Note that if a timeline exists when you save a .mc file then all the frames will be stored in the file.

You also have the option of saving patterns as compressed files (.rle.gz or .mc.gz).

Save Extended RLE

If ticked, Golly will include additional information whenever it saves a pattern in an RLE file via the above Save Pattern item or the save/store script commands. The pattern's position is recorded, along with the current generation count if it's greater than zero. This allows Golly to restore the pattern's position and generation count when the file is loaded at a later date. The extra information is stored in a special "#CXRLE" comment line at the start of the file. Because it's a comment, other RLE-reading programs should have no problem loading such files.

Note that if the current grid is bounded (ie. has a finite width or height) then Golly ignores this item's setting and always records the pattern's position so it can be restored when the file is loaded.

Run Script...

Opens the standard file browser so you can run a selected Lua or Python script. Such scripts can be used to automate or extend Golly's user interface, or to construct complex patterns. A number of sample scripts are provided in the Scripts folder. More details about Golly's scripting capabilities can be found in the Lua Scripting and Python Scripting help topics.

Run Clipboard

Runs the Lua or Python code stored in the clipboard.

Run Recent

This submenu lets you run a recently executed script file. The most recent script is always at the top. The maximum number of scripts remembered is determined by a setting (initially 20) which you can change in Preferences > File.

Show Files

If ticked then a scrollable folder is displayed in a panel to the left of the viewport. The initial location is the folder containing the Golly application and all the supplied patterns, scripts and rules. Clicking on a pattern file will display it in the viewport, clicking on a .lua/.py script will run it, and clicking on a .rule file will switch to that rule. See Hints and Tips for a good way to organize the Golly folder so you can quickly access your own patterns/rules/scripts and make it easy to upgrade to a newer version of Golly.

Set File Folder...

Lets you change the folder displayed by Show Files (see above).

Preferences...

Opens the Preferences dialog so you can change various settings. All your settings are stored in a file called GollyPrefs. This file is initially saved in a user-specific data directory:

On Linux: ~/.golly/
On Mac: ~/Library/Application Support/Golly/
On Windows XP: C:\Documents and Settings\username\Application Data\Golly\
On Windows 7+: C:\Users\username\AppData\Roaming\Golly\

You might prefer to move GollyPrefs into the same folder as the application. This allows multiple copies of Golly to have their own set of preferences.

Notes for Mac users: On the Mac, the Preferences item is in the application menu, not the File menu. On newer Macs the ~/Library folder might be invisible, so to get access to GollyPrefs just use the "Go to Folder..." command in the Finder's Go menu and paste in "~/Library/Application Support/Golly". golly-3.3-src/Help/bounded.html0000644000175000017500000005565012026730263013425 00000000000000 Golly Help: Bounded Grids

Bounded grids with various topologies can be created by adding a special suffix to the usual rule string. For example, B3/S23:T30,20 creates a toroidal Life universe 30 cells wide and 20 cells high. The suffix syntax is best illustrated by these examples:

:P30,20 — plane with width 30 and height 20
:P30,0 — plane with width 30 and infinite height
:T0,20 — tube with infinite width and height 20
:T30,20 — torus with width 30 and height 20
:T30+5,20 — torus with a shift of +5 on the horizontal edges
:T30,20-2 — torus with a shift of -2 on the vertical edges
:K30*,20 — Klein bottle with the horizontal edges twisted
:K30,20* — Klein bottle with the vertical edges twisted
:K30*+1,20 — Klein bottle with a shift on the horizontal edges
:C30,20 — cross-surface (horizontal and vertical edges are twisted)
:S30 — sphere with width 30 and height 30 (must be equal)

Some notes:

  • The first letter indicating the topology can be entered in lowercase but is always uppercase in the canonical string returned by the getrule() script command.
  • If a bounded grid has width w and height h then the cell in the top left corner has coordinates -int(w/2),-int(h/2).
  • The maximum width or height of a bounded grid is 2,000,000,000.
  • Use 0 to specify an infinite width or height (but not possible for a Klein bottle, cross-surface or sphere). Shifting is not allowed if either dimension is infinite.
  • Pattern generation in a bounded grid is slower than in an unbounded grid. This is because all the current algorithms have been designed to work with unbounded grids, so Golly has to do extra work to create the illusion of a bounded grid.

The different topologies are described in the following sections.

Plane

A bounded plane is a simple, flat surface with no curvature. When generating patterns in a plane, Golly ensures that all the cells neighboring the edges are set to state 0 before applying the transition rules, as in this example of a 4 by 3 plane:

 0  0  0  0  0  0 
 0  A  B  C  D  0 
 0  E  F  G  H  0 
 0  I  J  K  L  0 
 0  0  0  0  0  0 
   rule suffix is :P4,3

Torus

If the opposite edges of a bounded plane are joined then the result is a donut-shaped surface called a torus. Before applying the transition rules at each generation, Golly copies the states of edge cells into appropriate neighboring cells outside the grid. The following diagram of a 4 by 3 torus shows how the edges are joined:

 L  I  J  K  L  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 D  A  B  C  D  A 
   rule suffix is :T4,3

A torus can have a shift on the horizontal edges or the vertical edges, but not both. These two examples show how shifted edges are joined:

 K  L  I  J  K  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  B  C  D  A  B 
   :T4+1,3
 H  I  J  K  L  A 
 L  A  B  C  D  E 
 D  E  F  G  H  I 
 H  I  J  K  L  A 
 L  A  B  C  D  E 
   :T4,3+1

Klein bottle

If one pair of opposite edges are twisted 180 degrees (ie. reversed) before being joined then the result is a Klein bottle. Here are examples of a horizontal twist and a vertical twist:

 I  L  K  J  I  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  D  C  B  A  D 
   :K4*,3   
 D  I  J  K  L  A 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 L  A  B  C  D  I 
   :K4,3*

A Klein bottle can only have a shift on the twisted edges and only if that dimension has an even number of cells. Also, all shift amounts are equivalent to a shift of 1. Here are two examples:

 J  I  L  K  J  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 B  A  D  C  B  A 
   :K4*+1,3
 F  J  K  L  D 
 C  A  B  C  A 
 L  D  E  F  J 
 I  G  H  I  G 
 F  J  K  L  D 
 C  A  B  C  A 
   :K3,4*+1

Cross-surface

If both pairs of opposite edges are twisted and joined then the result is a cross-surface (also known as a real projective plane, but Conway prefers the term cross-surface). Here's an example showing how the edges are joined:

 A  L  K  J  I  D 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 I  D  C  B  A  L 
   :C4,3

Note that the corner cells have themselves as one of their neighbors. Shifting is not possible.

Sphere

If adjacent edges are joined rather than opposite edges then the result is a sphere. By convention we join the top edge to the left edge and the right edge to the bottom edge, as shown in this 3 by 3 example:

 A  A  D  G  C 
 A  A  B  C  G 
 B  D  E  F  H 
 C  G  H  I  I 
 G  C  F  I  I 
   :S3

Note that the cells in the top left and bottom right corners (the "poles") have different neighborhoods to the cells in the top right and bottom left corners. Shifting is not possible.

Example patterns using the above topologies can be found in Patterns/Generations and Patterns/Life/Bounded-Grids. golly-3.3-src/Help/lifeviewer.html0000644000175000017500000005610413006227600014134 00000000000000 Golly Help: LifeViewer

Introduction
Keyboard Shortcuts
Mouse Controls
Script Commands
Camera Tracking
Color Themes
3D Layers
Hex Grid
Notes


Introduction

LifeViewer is a scriptable pattern viewer featuring:

  • Rotation and smooth non-integer zoom.
  • Color themes with cell history and longevity.
  • Automatic hex grid display.
  • Pseudo 3D layers and stars.
  • Multiple ways to automatically track patterns with the camera as they evolve.

You may find it convenient to bind LifeViewer to a Keyboard action in Golly. This can be done as follows:

  1. Open Golly's Preferences dialog with File->Preferences...
  2. Click on the Keyboard tab in the dialog
  3. In the Key Combination field enter your preferred key combination
  4. In the Action drop down select Run Script...
  5. Click on the Choose File... button and select "lifeviewer.lua"
  6. Click on OK

A Javascript/HTML5 version of LifeViewer is used on the conwaylife.com forums to display posted patterns and also on LifeWiki.


Keyboard Shortcuts

Key combinationAction
Playback controls
ReturnToggle play / pause.
SpacePause / next generation.
TabPause / next step.
EscClose LifeViewer.
RReset to generation 0. Reset at generation 0 also resets camera.
Shift RToggle hard reset mode.
-Decrease generation speed.
+Increase generation speed.
Shift -Minimum generation speed.
Shift +Maximum generation speed.
DDecrease generations per step.
EIncrease generations per step.
Shift DMinimum generations per step.
Shift EMaximum generations per step.
0Reset step size and generation speed.
Camera controls
FFit pattern to display.
Shift FToggle AUTOFIT.
Shift HToggle HISTORYFIT mode.
[Zoom out.
]Zoom in.
Shift [Halve zoom.
Shift ]Double zoom.
11x zoom.
22x zoom.
44x zoom.
88x zoom.
616x zoom.
332x zoom.
Shift 1Nearest integer zoom.
Shift 2-2x zoom.
Shift 4-4x zoom.
Shift 8-8x zoom.
Shift 6-16x zoom.
LeftPan left.
RightPan right.
UpPan up.
DownPan down.
Shift LeftPan north west.
Shift RightPan south east.
Shift UpPan north east.
Shift DownPan south west.
<Rotate left.
>Rotate right.
Shift <Rotate left 90 degrees.
Shift >Rotate right 90 degrees.
5Reset angle.
View controls
QIncrease number of layers.
ADecrease number of layers.
PIncrease layer depth.
QDecrease layer depth.
CCycle color theme.
TToggle timing display.
Shift TToggle extended timing information.
Shift CToggle theme / Golly's standard colors.
/Toggle hex grid.
SToggle stars.
XToggle grid lines.
Shift XToggle major grid lines.


Mouse Controls

Click and drag with the mouse to pan the view.

The mouse wheel can be used to zoom in or out of the pattern. The zoom will be centered on the mouse pointer.


Script Commands

LifeViewer contains a script language that allows you to control playback of a pattern and how it is viewed through a dynamic camera. You can use the script language to do things like:

  • Define how you want a pattern to be displayed when LifeViewer starts.
  • Specify whether the pattern should automatically start playing when LifeViewer starts.
  • Specify that playback should stop or loop back to the start on reaching a certain generation.
  • Have the camera track a pattern as it moves across the universe (good for spaceships).
  • Define a set of waypoints and have the camera follow them during playback to highlight interesting parts of your pattern.

Script commands must be embedded in pattern comments which means that you can add them to any pattern file and other pattern readers will happily ignore them. They should be enclosed in [[ and ]]. All commands must be surrounded by whitespace. Multiple script sections are allowed.

The pattern below contains script commands that mean when LifeViewer is started the pattern will be displayed at zoom 9.5 with a camera angle of 30 degrees. The pattern will automatically start running and then stop at generation 100.

#C [[ ZOOM 9.5 ANGLE 30 ]]
#C [[ AUTOSTART STOP 100 ]]
x = 3, y = 3, rule = Life
ooo$
bbo$
bo!
To see this in action:
  1. Stop LifeViewer if it is running (click on the Golly window and press Esc).
  2. Copy the pattern above to the clipboard.
  3. Use File->Open Clipboard in Golly.
  4. Run Scripts/Lua/lifeviewer.lua.

There are many script commands available and they are grouped by function in the table below.

CommandArgumentsAction
Script commands
[[ Start script section.
]] End script section.
Playback commands
AUTOSTART Start play automatically.
GPS<1..60>Set steps per second.
LOOP<1..>Loop at specified generation.
HARDRESET Reset always resets camera.
STEP<1..50>Set generations per step.
STOP<1..>Stop at specified generation.
Camera commands
ANGLE<0.0..359.9>Set camera angle.
AUTOFIT Fit pattern to display.
HISTORYFIT Modify AUTOFIT to use pattern history.
TRACKX YCamera moves at (X, Y) cells/generation.
TRACKBOXE S W NCamera tracks bounding box with E, S, W and N edges moving at defined cells/generation.
TRACKLOOPP X YCamera moves at (X, Y) cells/generation and playback loops at generation P.
X<-4096.0..4096.0>Set camera pan in X direction.
Y<-4096.0..4096.0>Set camera pan in Y direction.
ZOOM or Z<-16.0..32.0>Set camera zoom. Negative zooms can also be specified as decimals or fractions: ZOOM -4 = ZOOM 0.25 = ZOOM 1/4.
View commands
DEPTH<0.0..1.0>Set layer depth.
EXTENDEDTIMING Show extended timing information when displayed.
GRID Display grid lines.
GRIDMAJOR<0..16>Set major grid line interval (0 = off).
HEXDISPLAY Force hex grid display.
LAYERS<1..10>Set number of layers.
SQUAREDISPLAY Force square grid display.
STARS Display stars.
SHOWTIMING Show timing information.
THEME<0..9>Set color theme.


Camera Tracking

There are several different ways you can have LifeViewer automatically move the camera to track patterns as they evolve.

MethodHow it worksRecommendations
AUTOFIT
  • Glides the camera towards the middle of the current generation bounding box and sets the zoom to fit the bounding box on the display.
  • Good for arbitrary patterns.
  • Not good for playback at low generations per second.
HISTORYFIT
  • Modifies AUTOFIT so it includes all previously alive cells in the bounding box.
  • Good for oscillators.
TRACK X Y
  • You define X and Y velocities in cells/generation (these can be specified as fractions).
  • Glides the camera towards the middle of the bounding box defined by the initial pattern bounding box offset by (T*X, T*Y) where T is the current generation.
  • Good for tracking fixed size spaceships including low generations per second playback.
TRACKBOX E S W N
  • You define the East, South, West and North velocities in cells/generation).
  • Glides the camera towards the middle of the bounding box defined by the initial pattern bounding box whose edges are offset by T*E, T*S, T*W and T*N where T is the current generation.
  • Good for tracking growing spaceships including low generations per second playback.
TRACKLOOP P X Y
  • You define P (the loop period) and X and Y velocities in cells/generation.
  • Shorthand for LOOP P TRACK X Y but also works well with GRIDMAJOR.
  • Good for tracking fixed size spaceships since the LOOP means the pattern never hits the grid edge.
  • Not good for color themes that show history.

Below is an example a using TRACKLOOP to track a glider.

#C [[ TRACKLOOP 4 1/4 -1/4 ]]
#C [[ THEME 6 GRID ]]
#C [[ GPS 8 AUTOSTART ]]
x = 3, y = 3, rule = Life
ooo$
bbo$
bo!

The TRACKLOOP period is set to 4 since the glider is a period 4 spaceship (i.e. it repeats every 4 generations). The glider takes those 4 generations to move 1 step right and 1 step up. This means it's moving at 1/4 steps per generation in the X direction and -1/4 steps per generation in the Y direction.

THEME 6 is used since it doesn't contain cell history which would be lost every time the pattern loops.

The grid lines are turned on with GRID command.

The playback speed is set to 8 generations per second.

Finally AUTOSTART is used so the pattern begins playback as soon as LifeViewer is started.

To see this in action:

  1. Stop LifeViewer if it is running (click on the Golly window and press Esc).
  2. Copy the pattern above to the clipboard.
  3. Use File->Open Clipboard in Golly.
  4. Run Scripts/Lua/lifeviewer.lua.


Color Themes

Color themes are used to provide a visual representation of cell history and longevity. This works automatically on any two state pattern. Each color theme has five different colors that are used for drawing cells.

NameDescriptionDefault
borncell just born
alivecell alive for at least 63 generations
diedcell just died
deadcell dead for at least 63 generations
unoccupiedcell never occupied

New cells are drawn in the born color.

If cells stay alive they fade from the born color to the alive color over the next 63 generations. If cells stay alive after that they remain in the alive color. This provides a visual representation of cell longevity.

BornAlive
                     

Cells are drawn in the died color when then they die.

If they stay dead they fade from the died color to the dead color over the next 63 generations. If cells stay dead after that they remain in the dead color. This provides a visual representation of cell history.

DiedDead
                     

Cells that have never been occupied are drawn in the unoccupied color. This is used for showing where cells have never lived.

In the example below you can see a glider leaving a history trail behind it. Top left is a still life block which is in the alive color because it has been alive for at least 63 generations. Bottom right is an oscillator (blinker) which has the center cell in the alive color since it doesn't change, the north and south cells in the born color since they've just been born and the east and west cells in the died color since they both just died.

There are 10 built in color themes which are shown in the table below. A two state pattern will default to using THEME 1 unless you specify an alternative with the THEME script command. You can dynamically cycle between the themes with key C. Shift and C toggles between the current theme and Golly's default colors for the pattern.

          
ThemeBornAliveDiedDeadUnoccupied
0   
1   
2   
3   
4   
5   
6   
7   
8   
9   

Themes 0 and 6 are good for TRACKLOOP since they have no history.

Theme 8 uses the same color for live cells and cells that died so is used to show a map of where cells have ever lived.


3D Layers

Cell history and longevity can be represented with colors using themes and also with layers. You define the number of layers from 1 (the default) to 10 and also the depth from 0 to 1. The bigger the depth the more distance between the layers and the more the 3D effect is exaggerated.

The number of layers is defined with the LAYERS script command and changed dynamically with keys Q (increase layers) and A (decrease layers).

The layer depth is defined with the DEPTH script command and changed dynamically with keys P (depth up) and L (depth down).

All cells are drawn in the bottom layer (layer 1). As you go up through the layers cells have to be dead for less generations or alive for more generations to be drawn. You will see towers grow up towards you where cells are alive and static (like the block) and cells tumble away from you as cells die (like the trail of the glider).


Hex Grid

Patterns using a hexagonal neighborhood will be automatically displayed using a hex grid.

You can switch between hex and square grids at any time with the / key.

If your pattern uses a custom rule and is not automatically recognized correctly as hex (or square) then you can specify the grid type you want to use by adding the HEXDISPLAY or SQUAREDISPLAY script command to the pattern comments.


Notes

  • Hex grid does not support camera rotation. Any rotation will be ignored.
  • Grid lines only display at 4x zoom and higher and when the camera angle is 0.
  • Decimal values may also be specified as fractions: TRACK -0.5 0.25 = TRACK -1/2 1/4.
  • Many of the keyboard shortcuts are the same as Golly's but there are exceptions.
  • HISTORYFIT modifies how AUTOFIT works but does not itself switch AUTOFIT on.
  • Layers are only displayed when using a color theme. They do not display when viewing a pattern using Golly's standard colors.
golly-3.3-src/Help/Lexicon/0000755000175000017500000000000013543257425012576 500000000000000golly-3.3-src/Help/Lexicon/lex_p.htm0000644000175000017500000046144413317135606014347 00000000000000 Life Lexicon (P)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:p = period

:p1 Period 1, i.e., stable. In the context of logic circuitry, this tends to mean that a mechanism is constructed from Herschel conduits that contain only still lifes as catalysts. In the context of slow glider construction, a P1 slow salvo is one in which there are no constraints on the parity of gliders in the salvo, because the intermediate targets are all stable constellations. (The usual alternative is a "P2 slow salvo", where the relative timing between adjacent gliders can be increased arbitrarily, but only by multiples of two ticks.)

:p104 gun A glider gun with period 104, found by Noam Elkies on 21 March 1996. It is based on an R-pentomino shuttle reaction.


.OO........OO..........................
.OO.........O.......O..................
.OO.........O.OO...O.O............OO...
.O...........O......O.............OOO..
O.O......OO......O................OO.O.
O.OO.....OO....O....................O.O
................O..................O..O
....................................OO.
.OO....................................
.OO....................................
...............OO......................
................OO..................OO.
................O...................OO.
.OO......OOO........................OO.
O..O.......O........................O..
O.O.........................OO.....O.O.
.O.OO.......................OO.....O.OO
..OOO.............O....................
...OO............O.O...................
..................O.................OO.
....................................OO.

:p11 bumper (p11) A periodic colour-preserving glider reflector with a minimum repeat time of 44 ticks. Unlike the p5 through p8 cases where Noam Elkies' domino-spark based reflectors are available, no small period-22 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


............................O..
............................O.O
............................OO.
...............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
.................O.............
.................O.O...........
.................OO............
...............................
.........OO....OO..............
.........OO...O..O.............
...OO....OO....O.O.............
....O.....OO....O..............
..O.....O.OO...................
..OO..OOO...........OO.........
.....O....O.O.......O..........
..OOO.OO.OO.OOO......OOO.......
.O....O....O...O.......O.......
O.O.O...OO.O..O................
O.O......O.O.O.................
.O..OOOOO..OO..................
..OO....O.O....................
....OOOO..O....................
..OO......OO...................
..O..O.........................
....OO.........................

In practice this reflector is not useful with input streams below period 121, because lower-period bumpers can be used to reflect all smaller multiples of 11 for which the bumper reaction can be made to work.

:p130 shuttle A shuttle found in March 2004 by David Eppstein, which originally needed several period 5 oscillators for support. David Bell found a reaction between two of the shuttles to produce a p130 glider gun. On 18 November 2017 Tanner Jacobi found that the stable sidesnagger can be used to support the shuttle instead, and this is shown here.


.....OO................................OO.....
.....OO................................OO.....
..............................................
..............................................
.........................O....................
OO....OO..................O...........OO....OO
OO...O..O................OO..........O..O...OO
.....O.O...........OOOOOOO............O.O.....
......O...........OOO..O...............O......
..................O..OO.O.....................
...O..................O.O.................O...
..O.O...............OO.OO................O.O..
..OO................OOOO..................OO..
..............................................
..OO................OOOO..................OO..
..O.O...............OO.OO................O.O..
...O..................O.O.................O...
..................O..OO.O.....................
......O...........OOO..O...............O......
.....O.O...........OOOOOOO............O.O.....
OO...O..O................OO..........O..O...OO
OO....OO..................O...........OO....OO
.........................O....................
..............................................
..............................................
.....OO................................OO.....
.....OO................................OO.....

:p144 gun A glider gun with true period 144. The first one was found by Bill Gosper in July 1994. For a full description and pattern see factory.

:p14 gun A glider gun which emits a period 14 glider stream. This is the smallest possible period for any stream, so such a gun is of great interest. There is no known true-period p14 glider gun, and finding a small direct example is well beyond current search algorithms' abilities. However, pseudo-period p14 guns have been created by injecting gliders into a higher period glider stream. The first pseudo p14 gun was built by Dieter Leithner in 1995. Smaller pseudo p14 guns have since been constructed, but they are still much too large to show here. The essential mechanism used by them is demonstrated in GIG.

:p15 bouncer Noam Elkies' colour-changing glider reflector, with Karel's p15 providing the necessary domino spark. Compare to the colour-preserving Snark. The minimum repeat time is 30 ticks.


........................O..
........................O.O
........................OO.
...........................
...........................
...........................
...........................
.................O.........
................O..........
................OOO........
...........................
...OO....OO.........OO.....
..O..O..O..O....OO..OO.....
..OO......OO...O.O.........
..OO......OO....O..........
....OO..OO.................
..................OO.......
..................O........
...................OOO.....
.O..O.OO.O..O........O.....
OO..O....O..OO.............
.O..O.OO.O..O..............

:p15 bumper A periodic colour-preserving glider reflector with Karel's p15 providing the necessary spark. The minimum repeat time is 45 ticks. For an equivalent colour-changing periodic glider reflector see p15 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


............................O.O
............................OO.
.............................O.
...............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
.................O.............
.................O.O...........
.................OO............
...............................
...............OO..............
.OO.OO.OO.....O..O.............
.OO....OO......O.O.............
.OO.OO.OO.......O..............
...............................
....OO..............OO.........
..O....O............O..........
.O......O............OOO.......
O........O.............O.......
O........O.....................
O........O.....................
.O......O......................
..O....O.......................
....OO.........................

:p15 reflector An ambiguous term that may refer to PD-pair reflector, p15 bouncer, or the more recently discovered p15 bumper.

:p184 gun A true period 184 double-barrelled glider gun found by Dave Buckingham in July 1996. The engine in this gun is a Herschel descendant. Unlike previous glider guns, the reaction flips on a diagonal so that both gliders travel in the same direction.


...................O...........
.................OOO...........
................O..............
................OO.............
..............................O
............................OOO
...........................O...
...........................OO..
...............................
...............................
...............................
...............................
....................OO.........
...................O.O.........
...................O...........
...................OO.O........
..OO.................OO........
.O.O...........................
.O.............................
OO.............................
...............................
...............................
...............................
...............................
...............................
...............................
...............................
......OO.......................
.....O.O.......................
.....O.........................
....OO.........................

:p1 megacell (p1 circuitry) A metacell constructed by Adam P. Goucher in 2008, capable of being programmed to emulate any Moore neighborhood rule, including isotropic and anisotropic non-totalistic rules. It fits in a 32768 by 32768 bounding box, with the resulting metacell grid at 45 degrees to the underlying Life grid. Like the OTCA metapixel, it includes a large "pixel" area so that the state of the megacell can easily be seen even at extremely small-scale zoom levels.

:p1 telegraph (p1 circuitry) A variant of Jason Summers' telegraph pattern, constructed in 2010 by Adam P. Goucher using only stable circuitry. A single incoming glider produces the entire ten-part composite lightspeed signal that restores the beehive-chain lightspeed wire to its original position. The signal is detected at the other end of the telegraph and converted back into a single output signal. This simplification came at the cost of a much slower transmission speed, one bit per 91080 ticks. In this mechanism, sending the entire ten-part signal constitutes a '1' bit, and not sending the signal means '0'. See also high-bandwidth telegraph.

:p22 gun A true period 22 glider gun constructed by David Eppstein in August 2000, using two interacting copies of a p22 oscillator found earlier the same day by Jason Summers.


..................OO.........................
...................O.......O.................
...................O.O..............OO.......
....................OO............OO..O......
........................OOO.......OO.OO......
........................OO.OO.......OOO......
........................O..OO............OO..
.........................OO..............O.O.
...................................O.......O.
...........................................OO
.............................................
OO...........................................
.O...........................................
.O.O.............OOO.........................
..OO...O........O...O........................
......O.OO......O....O.......................
.....O....O......OO.O........................
......O...O........O...OO....................
.......OOO.............O.O...................
.........................O...................
.........................OO..................

:p246 gun A true period glider gun with period 246, discovered by Dave Buckingham in June 1996. The 180-degree mod-123 symmetry of its bookend-based engine makes it trivial to modify it into a double-barrelled gun. Its single-barreled form is shown below.


..................................O........
..................................OOO......
................................OO...O.....
...............................O.O.OO.O....
..............................O..O..O.O....
....................................O.OO...
..................................O.O......
................................O.O.O......
.................................OO.OO.....
...........................................
OO.........................................
.O.........................................
.O.O.................OO....................
..OO..................O..................OO
....................O.O..................O.
....................OO.................O.O.
.......................................OO..
...........................................
...........................................
...........................................
...........................................
...........................................
...........................................
.............................OO............
.......................O.....OO............
.................OO.OOO....................
.................O..OOOO...................
.................O.OO......................
...........................................
...........................................
.....O.....................................
....O.OOOO.................................
...O.O.OOO.................................
..O.O......................................
...O.......................................
...OO......................................
...OO......................................
...OO......................................

:p24 gun A glider gun with true period 24. The first one was found by Noam Elkies in June 1997. It uses three p4 oscillators to hassle a pair of traffic lights. One of the oscillators was very large and custom-made. Shown below is a much smaller version built by Jason Summers and Karel Suhajda in December 2002, using the same mechanism but with a smaller oscillator:


.......................O..O................
.....................OOOOOO................
.................OO.O........O.............
.............OO.O.O.O.OOOOOOOO..O..........
...........OOO......O.O...O...OOO..........
..........O....O..O.O...O...OO.............
...........OOOOO..O.OOOO.O...O.OO..........
............O....OO.....O.O.OO..O....OO.O..
..........O...OO...O.OO..OO..OO.....O.OO.O.
..........OOOOO.OOOO.O..............O....O.
.....................O........O..OO.O.OO.OO
............OOO...OOO...O.O......O.O.O.O.O.
...........O......O....O..O.O.O....O.O.O.O.
............OO..O.O.......O..OO...O.O.OO.OO
OO.OO..................OO.OO.OOO..O...O.O..
.O.O......O...O.O.O....O..O.............O..
O..O..O..O.O...O.OOO...O.O........O.O.OO...
OOO.OO.O.OOO...........O.........OO........
...O.O.O.OO......................O.........
..O.OO...O.O..............OO.....O..O......
.O...OO....O.............OOO.....O.........
.OO.......OO..............OO.....OO........
..........OO......OOO.............O.O.OO...
.OO.......OO......O.O...................O..
.O...OO....O......OOO.............O...O.O..
..O.OO...O.O......................O.O.OO.OO
...O.O.O.OO........................O.O.O.O.
OOO.OO.O.OOO.....................O.O.O.O.O.
O..O..O..O.O.........OO..........OO.O.OO.OO
.O.O......O..........O..............O....O.
OO.OO.................OOO...........O.OO.O.
........................O............OO.O..

:p256 gun A true period 256 four-barrelled glider gun found by Dave Buckingham in September 1995. It uses four R64 conduits to make the second smallest known Herschel loop (after the Simkin glider gun). The p256 gun was an early "teaser" from Dave Buckingham before he released his full Herschel technology.


...............................OO................
...............................OO.....OO.........
......................................OO.........
.................................................
.................................................
.......OO........OO.................OO...........
.......OO.........O.................OO...........
..................O.O.....................OO.....
...................OO.....................OO.....
.OO..............................................
.OO..............................................
.....OO..........................................
.....OO...............O..........................
......................O.O........................
......................OOO........................
........................O........................
OO...............................................
OO.........................................OO....
...........................................O.....
.........................................O.O.....
.........................................OO......
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
.................................................
......OO.......................................OO
......O........................................OO
.......O.........................................
......OO.........................................
......................O.O........................
.......................OO.................OO.....
.......................O..................OO.....
..............................................OO.
..............................................OO.
.....OO..........................................
.....OO..........................................
...........OO...........................OO.......
...........OO...........................OO.......
.................................................
.................................................
.........OO......................................
.........OO.....OO...............................
................OO...............................
Either eaters or snakes can be added as shown above, to suppress three of the glider streams so that only one stream escapes. This gun's p256 glider stream is well-suited for repeated reactions with receding Corderships, or for "Hashlife-friendly" signal circuitry.

:p29 pentadecathlon hassler A hassler where two copies of a period 29 oscillator (which is itself a pre-pulsar hassler) change the period of a pentadecathlon.


..........O.......O....................O.......O..........
.........O.O.....O.O..................O.O.....O.O.........
..........O.......O....................O.......O..........
..........................................................
..........................................................
..........................................................
.........................OO....OO.........................
.........................OOO..OOO.........................
...OO....................OO....OO....................OO...
...O.......O.....O......................O.....O.......O...
OO.O......OOO...OOO....................OOO...OOO......O.OO
O..OO.....OOO...OOO....................OOO...OOO.....OO..O
.OO....O.............OO............OO.............O....OO.
...OOOOO.............O.O..........O.O.............OOOOO...
...O....OO.............O..........O.............OO....O...
....OO..O.......OO.....OO........OO.....OO.......O..OO....
......O.O.......OO......................OO.......O.O......
......O.O.O..O..............................O..O.O.O......
.......OO.OOOO..............................OOOO.OO.......
.........O......................................O.........
.........O.O..................................O.O.........
..........OO..................................OO..........

:p30 gun A glider gun with true period 30. The first one, found by Bill Gosper in November 1970 (see Gosper glider gun), was also the first gun found of any period. All known p30 glider guns are made from two or more interacting queen bee shuttles. Paul Callahan found 30 different ways that three queen bee shuttles can react to form a period 30 glider gun. One of the most interesting of these is shown below in which the gliders emerge in an unexpected direction.


OO...................................
.O...................................
.O.O......O.............O............
..OO......OOOO........O.O............
...........OOOO......O.O.............
...........O..O.....O..O.............
...........OOOO......O.O.............
..........OOOO........O.O........OO..
..........O.............O........O.O.
...................................O.
...................................OO
.....................................
................OOO..................
...............OO.OO.................
...............OO.OO.................
...............OOOOO.................
..............OO...OO................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..............OO.....................
...............O.....................
............OOO......................
............O........................

:p30 reflector = buckaroo

:p30 shuttle = queen bee shuttle

:p36 gun A glider gun with true period 36. The first one was found by Jason Summers in 2004. Shown below is a smaller version using improvements by Adam P. Goucher and Scot Ellison:


................................................O.
..............................................OOO.
.............................................O....
.............................................OO...
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
.................................OO...............
................................O..O..............
................................O.O.O.............
.................................O..OOO...........
..................................................
...................................OO.....OO......
...................................O.....O.OO.....
.........................................O..O.....
..........................................OOO.....
......................................OO..OO......
.....................................OOO..........
.....................................O..O.........
.....................................OO.O.....O...
......................................OO.....OO...
..........................OO......................
OO.......................O..O..............OOO..O.
.O........................O.O................O.O.O
.O.O..................OO...O..................O..O
..OO..........O........O.OO....................OO.
.............OO..........O........................
............OO.O.........O........................
.............O.O..................................
..............OO..................................
.......................OO.........................
.......................O.O........................
.............O.........O.OO.......................
.............O..........OO........................
............OO.O........O.........................
...........O...OO.................................
..........O.O.....................................
..........O..O....................................
...........OO...........O...........OO............
.......................O.O...........O............
.......................O.O..OOOOOOOOO.............
....................OO.O..O.OOOOOOO..OOO..........
....................OO.O....OOOOOO..O..O..........
.......................O.............OO...........
.......................O.O....OO..................
........................OO....OO..................

:p3 bumper A variant of Tanner Jacobi's bumper found by Arie Paap in April 2018. Two forms of the period 3 oscillator catalyst are shown below.


..O........................O..................
O.O......................O.O..................
.OO.......................OO..................
......................O.......................
....................OOO.......................
...................O..........................
...................OO.........................
..................OO..........................
.......OO........OO.............OO.........OO.
......O..O....O...O............O..O....O.OOOO.
......O.O...OOO.OOO............O.O...OOO..O.O.
.......O.........O..............O.............
............OOOOOO...................OOO......
..OO........OO.O...........OO.......O.OOO.O.OO
...O.......OO...............O......O....O.OO.O
OOO......................OOO.......OO..OOO....
O........................O............O...OOO.
.......................................OOO..O.
.........................................O....

For bounding box optimization purposes, it's also possible to replace the eater1 in a p3, p6 or p9 bumper with another period 3 oscillator, saving one row along the south edge at the cost of a higher population.


....O.........................
..O.O.........................
...OO.........................
..............................
..............................
..............................
..............................
..............................
.............................O
......O......O.............OOO
.O...O.O...O.O............O...
O.O..O.O....OO.............O..
O.OOO.O.................O..O..
.O..OO........OO........O.....
..OOO........O..O....OOO..O...
.............O.O....OOOO.O....
....OOO.......O...............
...O..O............O..O.O.....
...OOOOO.OO...........O.......
.O.O...OO.O.......OOO.........
.OO......O....................

The repeat time for all these variants is 36 ticks, as shown.

:p44 gun A glider gun with a true period of 44. The first one was found by Dave Buckingham in April 1992. It uses two interacting copies of an oscillator which he also found. In 1996 he found a gun which only used one copy of the oscillator. Paul Callahan improved it in 1997, resulting in the gun shown below:


.................OO......OO.................
.................OO......OO.................
............................................
............................................
............................................
............................................
............................................
............................................
.OO......................................OO.
O.O......................................O.O
O.O.OO................................OO.O.O
.O.O.O................................O.O.O.
...O....................................O...
..O..O.............O....O.............O..O..
..O...............OO....OO...............O..
..O...O..........O........O..........O...O..
..O...O...........OO....OO...........O...O..
..O................O....O................O..
..O..O................................O..O..
...O....................................O...
.O.O.O................................O.O.O.
O.O.OO................................OO.O.O
O.O......................................O.O
.OO......................................OO.
............................................
............................................
............................................
...............OO...........................
................O...........................
.............OOO............................
.............O....................OO........
..................OO..............O.O.......
..................OO................O.......
....................................OO......
............................................
............................................
............................................
....................OO......................
...................O.O......................
...................O........................
..................OO........................

:p44 MWSS gun A gun discovered by Dieter Leithner in April 1997, in a somewhat larger form. This was the smallest known gliderless gun and smallest known MWSS gun until the construction in 2017 of the gun shown under gliderless, based on Tanner's p46.

The p44 MWSS gun is based on a p44 oscillator discovered by Dave Buckingham in early 1992, shown here in an improved form found in January 2005 by Jason Summers using a new p4 sparker by Nicolay Beluchenko. A glider shape appears in this gun for three consecutive generations, but always as part of a larger cluster, so even a purist would regard this gun as gliderless.


.......O..........................................
..OO...O.O....O...................................
..O..OO..O.O.OO.O..OOO..OO........................
....OO.......OO.O.O.OO..OO........................
...OOO.......O.......OOO.........O................
.......................O.......OOO................
.......................O......O........OOO........
..............................OO.......O..O.......
.........OO..............O.............O..........
.........OO.............O..............O...O......
.........................OO............O..........
........................O.O.............O.O.......
..................................................
.......................O.O.....OOO................
........................O.....O..O..............OO
OO............OOO.......O......OO...........OO.O.O
OO...........O...O..........................OO.O..
.............OO.OO..............................O.
.................................OO.........OO.OO.
..............................OO.............O.O..
.............................................O.O..
..............................................O...
.............OO.OO.............O.O................
OO...........O...O.............OO.................
OO............OOO.................................
...........................OO.....................
...........................O.O....................
.............................O....................
.............................OO...................
..................................................
.........OO.......................................
.........OO.......................................
..................................................
.......................O..........................
.......................O..........................
...OOO.......O.......OOO..........................
....OO.......OO.O.O.OO..OO........................
..O..OO..O.O.OO.O..OOO..OO........................
..OO...O.O....O...................................
.......O..........................................

:p45 gun A true-period glider gun discovered by Matthias Merzenich in April 2010. By most measures this is the smallest known odd-period gun of any type, either true-period or pseudo-period:


...............O..O..O..........................
...............OOOOOOO..........................
................................................
...............OOOOOOO..........................
...............O..O..O..........................
................................................
................................................
................................................
................................................
................................................
................O..O............................
............OO..O..O............................
............OO..O..O.......OO...................
...........................OO....OO...O..O...OO.
.................................OOOOO....OOOOO.
.................................OO...O..O...OO.
...........................OOO..................
................................................
OO.OO...........................................
.O.O.......................OOO..................
.O.O......OOO...................................
OO.OO.............................O.O...........
.O.O...............................OO...........
.O.O......OOO......................O............
OO.OO...........................................
................................................
...........OO...................................
...........OO.......O..O..OO....................
....................O..O..OO....................
....................O..O........................
................................................
................................................
...............................................O
.............................................O.O
..............................................OO
..................O..O..O.......................
..................OOOOOOO.......................
................................................
..................OOOOOOO.......................
..................O..O..O.......................

:p46 gun A glider gun which has true-period 46. The first one found was the new gun by Bill Gosper in 1971. Prior to the discovery of Tanner's p46 in October 2017, all known p46 guns were made from two or more twin bees shuttles that interact (e.g., see twin bees shuttle pair). See edge shooter and double-barrelled for two more of these.

On 21 October 2017 Heinrich Koenig found a glider gun using two copies of Tanner's p46 placed at right angles to each other. This is the first p46 gun found which makes no use of the twin bees shuttle.


....OO.............................
.....O.............................
.....O.O...........................
......OO..OO.......................
..........OO.......................
...................................
...................................
...................................
...................................
...................................
...................................
O..................................
OOO.......OO.......................
...O......O.O......................
..O.O.......O......................
..OO......O.O......................
..........OO.......................
..OO...............................
..O................................
...OOO.............................
.....O.............................
........OO.........................
.........O.........................
......OOO..............OOO.........
......O...............O...O........
.....................O.....O.......
.............OO......O.....O.......
.............OO......OOO.OOO.......
...............................OO..
...............................O.O.
............OO...................O.
.............O...................OO
..........OOO................OO....
..........O.............O....O.....
.......................O.O.O.O.....
......................O.OO.OO......
......................O............
.....................OO............

See gliderless for a MWSS gun also made using two copies of Tanner's p46.

:p46 shuttle = twin bees shuttle

:p48 gun A true period compound glider gun based on the p24 gun, using a Rich's p16 oscillator as a filter to remove half of the gliders from the stream.


.................OO...........OO.............
................O..O.........O..O............
................O.O...OO.OO...O.O............
..............OO..O.O.......O.O..OO..........
...............O.O.O....O....O.O.O...........
..............O..OO..OOOOOOO..OO..O..........
..............OO.....O.O.O.O.....OO..........
.......................O.O...................
.....O..OO.........OOO.....OOO...............
....O.O..O..O.....O.O.O...O.O.O..............
....O.OO.O.O.O....OO..OOOOO..OO..............
...OO.O..O.O..O..............................
...O..O.OO..O................................
....OOO.O.O...OOO............................
......OO.O.....OO............................
..O.O..O.O...O..O....O.O.O...................
..OO..OO.O.OO..OOO....OOO.............OO.....
........OO.O...OO......O.............O..O....
..OOOOO....O........................OO.......
.O....O.OOO.................OO.....OOO.....O.
.O.OO.O.O......OO.......O...O.O....O..O...O.O
OO.O..O......OOOO........O....O.....OOO...OO.
.O.O.O.O.....OO..O.....OOO....OO.............
.O.O.OO.O..O........................OOO...OO.
OO.OO..OO...OOOO...................O..O...O.O
...O..OOO..O..OO....O..............OOO.....O.
...O.O.OO.....O....O.O........O.....OO.......
..OO.O..OO.O..O...O...O........O.....O..O....
....O...OO..O..O...O.O.......OOO......OO.....
....O.O.......O.....O........................
...OO.OO..........OOO........................
..........OO....OOOOOOO....OO................
..........O..O..OO.O.OO..O..O................
...........OO.OOOO...OOOO.OO.................
........OOO..O...........O..OOO..............
.......O...OO.OO.......OO.OO...O.............
.......OO.O...OO.......OO...O.OO.............
........O.OOO...O.....O...OOO.O..............
.......O......OO.......OO......O..........O..
........OOOOOO...........OOOOOO............O.
..........O..O...........O..O............OOO.

:p4 bumper (p4) A periodic colour-preserving glider reflector with a minimum repeat time of 36. Unlike the p5 through p8 cases where Noam Elkies' domino spark-based reflectors are available, no small period-4 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


.....................O..
.....................O.O
.....................OO.
........................
........................
........................
........................
........................
........................
............O...........
............O.O.........
............OO..........
........................
....OO....OO............
...O..O..O..O...........
..........O.O...........
...........O............
..O..O..................
..O.OO.........OO.......
...O.OOO.......O........
OOO...O.O.......OOO.....
O.......O.........O.....
........OO..............

:p4 reflector The following glider reflector, discovered by Karel Suhajda in October 2012. Its minimum repeat time is 52 ticks. Unlike the various bouncers discovered many years earlier, it is a colour-preserving reflector, so it was made obsolete the following year by the discovery of the much smaller stable Snark, which uses the same initial bait reaction and so produces an output glider with the same timing. For a smaller periodic colour-preserving glider reflector with a different output timing, see p4 bumper.


................................O.........................
...............................O..........................
...............................OOO.......O.O..............
........................................O.OO..............
......................................OOO.....O...........
.....................................O...OOOOOOOO.........
..................................O.O.O..O.......O........
..............O...................OOOO.OO.OOOOOOO.O.......
..............OOO..................OOO.....O.O..O.O..OO...
.................O...................OOO.O.O...OO.O.O.O...
................OO.............OOO..OO.OOOOO....O.O.O.....
.............................O.O...OOO.OO.O..O.OOOO..O..OO
...........................OO.....O....O..O..O...O....O..O
...................O.......OO.O.O..O......O..O....OOOOOOO.
..................O...........O.O..O..O..O.........O......
..................OOO........O....O..O...........O...OO...
............................O.OOOOOOO........OO.O.OOO.O...
.............................O.........O.O....O.O.O.......
...................OO..........OOOOOOOOO.OOO..O.O.........
...................OO.......O...O.......O...O.O.O.........
...........................O..O...OOOO..O..O.O.O..........
.............................OO...O...O.O.O..O............
.............................O.....OOO.O.O.OO..O..........
........OO...............O...OOO.....O...O...OOO..........
...OO..O..O..................O...OO..O..O.OO..............
...O....O.O..................O...OOOO...O.O.OO............
OO.O.....O................OOO...O......OO...O.O...........
.O.O.OO....................OOO.....O..OO..O.O.O...........
O..O..O........OO...........OOO..OOO.OOO..O.O.OO..........
OO..O....O.....O.O..........O..O...O...O..O.O.............
.....OOOOO.......O...........O.O..O.OO...OOOO.............
................O..........O.O.O.OOO.OOO.O................
.......O.........OOO......O.OO.O..OO......................
......O.O..........O......O.....O......OO.O...............
.......O...................OOOOO......O..OO...............
.............................O........OO..................

:p54 shuttle (p54) A surprising variant of the twin bees shuttle found by Dave Buckingham in 1973. See also centinal.


OO.........................OO
.O.........................O.
.O.O.......O.............O.O.
..OO.....O..O.....O......OO..
............O.....OO.........
........O..........OO........
........O...OO....OO.........
.........OOOOO...............
.............................
.........OOOOO...............
........O...OO....OO.........
........O..........OO........
............O.....OO.........
..OO.....O..O.....O......OO..
.O.O.......O.............O.O.
.O.........................O.
OO.........................OO

:p5 bouncer (p5) A colour-changing glider reflector constructed by Noam Elkies in September 1998 by welding together two special-purpose period-5 sparkers. The minimum repeat time is 25 ticks. For colour-preserving glider reflectors see p5 bumper and the stable Snark reflector.


..........................O..
........................OO...
.........................OO..
.............................
.............................
........OO...................
.....O..O.O........O.........
....O.O.O.O.......O..........
...O.O.O..OO......OOO........
...O...O.O..O................
OO.OO..O.O.O..........OO.....
O.O....OOO..O.....OO..OO.....
..O.OOO...OO.....O.O.........
..O..O.....O......O..........
...O...O.O..O............OO..
....OOO.OO.OO.......OO....O..
......O....O........OO..OOO..
.......OOO.O.....OO.....OOO..
..........O.OO...OO.....OO...
.........O..O..OOO.O........O
.........OO..OOO...........OO
................O............
.............OOOO.O..........
............O..O...O.........
............OO...O.OOO.......
.............O.O..O...O......
.............O.OO.O..OO......
..............O..O...........
...............OO............

:p5 bumper A periodic colour-preserving glider reflector with a middleweight volcano producing the necessary spark. The minimum repeat time is 35 ticks. For an equivalent colour-changing periodic glider reflector see p5 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


............................O
..........................OO.
...........................OO
.............................
.............................
.............................
.............................
.............................
.............................
...OO..O..........O..........
...O..O.O.........O.O........
....O.O.O.........OO.........
...OO.O.OO...................
..O...OO..O.....OO...........
.O..OO...OOO...O..O..........
.O.O.OO..OOO....O.O..........
..O.OO...OOO.....O...........
......OO..O..................
OOOOO.O.OO...........OO......
O..O..O.O............O.......
.....O..O.............OOO....
......OO................O....

:p5 reflector Traditional name for p5 bouncer before 2016, but with the discovery of the p5 bumper this has become an ambiguous reference.

:p60 gun A glider gun with a true period of 60. The first one was found by Bill Gosper in 1970 and is shown below.


............................O..........
............................O.O........
...........OO..................OO......
.........O...O.................OO....OO
...OO...O.....O................OO....OO
...OO..OO.O...O.............O.O........
........O.....O.............O..........
.........O...O.........................
...........OO..........................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
..........O.O..........................
.........O..O...OO.....................
OO......OO.....OOO.OO..OO..............
OO....OO...O...O...O...O.O.............
........OO.....O.O........O............
.........O..O..OO......O..O............
..........O.O.............O............
.......................O.O.......OO....
.......................OO........O.O...
...................................O...
...................................OO..
There are several other ways to create a p60 gun from two p30 guns using period-doubling reactions similar to the one shown here.

:p690 gun A true period 690 glider gun found by Noam Elkies in July 1996. It is composed of a p30 queen bee shuttle pair and a p46 twin bees shuttle whose sparks occasionally react with each other. This is a very compact gun for such a high period and is used in many patterns requiring sparse glider streams.


...........O........................................
...........OOO......................................
..............O.....................................
.............OO.....................................
....................................................
....................................................
....................................................
....................................................
...............OOO..................................
..............O...O.................................
....................................................
.............O.....O................................
.............OO...OO................................
....................................................
..........................................OO.O......
................O......OO............OOO..OO..O.....
OO.............O.O.....OO.............OO......O...OO
.O.............O.O.....................OOO...OOOO..O
.O.O.....O.....O........................O...O...OOO.
..OO...O.O.....O........O.....O.....................
......O.O......O..O.....O.....O.........O...O...OOO.
.....O..O......O..O....................OOO...OOOO..O
......O.O.......OO..OO...........OO...OO......O...OO
.......O.O...........................OOO..OO..O.....
.........O..............O.....O...........OO.O......
........................O.....O.....................

:p6 bouncer (p6) Noam Elkies' colour-changing glider reflector using the p6 pipsquirter, with a minimum repeat time of 24 ticks. For colour-preserving glider reflectors see p6 bumper and the stable Snark reflector.


.......................O.
......................O..
......................OOO
...OO....................
...O.....................
.....O...................
....OOOO.........O.......
...O....O.......O........
...OOOOO.O......OOO......
.OO....O.O...............
O..O.....OO.........OO...
OO.O.O.O..O.....OO..OO...
...O..O.OOO....O.O.......
...OO.O...O.....O........
.....O.O.OO..............
.....O.O.O........OO.....
......O..O........O......
.......OO..........OOO...
.....................O...

:p6 bumper (p6) A periodic colour-preserving glider reflector with a unix providing the necessary spark. The minimum repeat time is 36 ticks. For an equivalent colour-changing periodic glider reflector see p6 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


.......................O..
.......................O.O
.......................OO.
..........................
..........................
..........................
..........................
..........................
..........................
..............O...........
..............O.O.........
..............OO..........
..........................
............OO............
.....OO....O..O...........
.....OO.....O.O...........
.............O............
..........................
.....OOO.........OO.......
OO..O.OO.........O........
OO..OO............OOO.....
....OO..............O.....

:p6 pipsquirter (p6) A pipsquirter oscillator found by Noam Elkies in November 1997, used in various hasslers and the colour-changing p6 bouncer.


.....O.........
.....O.........
...............
...O...O.......
.OOO.O.OOO.....
O...OO....O....
O.OO..OO.O.O...
.O..OO..OO.O...
..OO..OO.O.O.OO
....O..O.O.O.OO
....OOOO.OO....
........O......
......O.O......
......OO.......

:p6 reflector Traditional name for p6 bouncer before 2016, but with the discovery of the p6 bumper this has become an ambiguous reference.

:p6 shuttle (p6) The following oscillator found by Nicolay Beluchenko in February 2004.


O.............
OOO...........
...O..........
..OO..........
..............
......O.......
.....OOOO.....
......O..O....
.......OOO....
..............
..........OO..
..........O...
...........OOO
.............O
This is extensible in more than one way:

O........................
OOO......................
...O.....................
..OO.....................
.........................
......O..................
.....OOOO................
......O..O...............
.......OOO...............
.........................
..........OOO............
..........O..O...........
...........OOOO..........
.............O...........
.........................
.................O.......
................OOO......
.................O.O.....
.................O.O.....
..................OO.....
.....................OO..
.....................O.O.
.......................O.
.......................OO

:p72 quasi-shuttle (p72) The following oscillator, found by Jason Summers in August 2005. Although this looks at first sight like a shuttle, it isn't really.


..............................O......
.............................OO......
............................O.OO.....
.OOOO......................OOO..O....
O....O.......................O.O.O...
O...O.O.......................O.O.O..
.O...O.O......OO...............O..OOO
.......O.....O.O................OO.O.
.......O.....O...................OO..
....O..O.....OOO.................O...
.....OO..............................
.....................................
.....OO..............................
....O..O.....OOO.................O...
.......O.....O...................OO..
.......O.....O.O................OO.O.
.O...O.O......OO...............O..OOO
O...O.O.......................O.O.O..
O....O.......................O.O.O...
.OOOO......................OOO..O....
............................O.OO.....
.............................OO......
..............................O......

:p7 bouncer (p7) Noam Elkies' colour-changing glider reflector using a p7 pipsquirter, with a minimum repeat time of 28 ticks. A high-clearance version is shown in p7 pipsquirter. For colour-preserving glider reflectors see p7 bumper and the stable Snark reflector.


.......................O.
......................O..
......................OOO
.........................
.........................
.........................
.........................
................O........
......OO.......O.........
......O.O......OOO.......
........O................
...O..O.OO.........OO....
...OOOO..O.....OO..OO....
.......OOO....O.O........
...OOOO..O.....O.........
..O...O.OO...............
.O.OOOO.O........OO......
.O.O..O.O........O.......
OO.O.O.O.OO.......OOO....
O..OOO.O..O.........O....
..O...O.O................
...OO.O.OO...............
....O....................
..O.O.OOOO...............
.O.OOOO..O...............
.O.....O.................
..OOOOOO.O...............
....O...O.O..............
.......O..O..............
........OO...............

:p7 bumper (p7) A periodic colour-preserving glider reflector with a minimum repeat time of 35 ticks. For an equivalent colour-changing periodic glider reflector see p7 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


......O..................
....O.O.......OO.....OO..
.....OO......O..O...O..O.
.........................
.......OO.......O...O....
......O..O....O.......O..
......O.O.....OO.....OO..
.......O.........O.O.....
.............O..OO.OO..O.
..OO........O.O..O.O..O.O
...O........O..O.O.O.O..O
OOO.............O...O....
O........................

:p7 pipsquirter A pipsquirter oscillator found by Noam Elkies in August 1999, used in various hasslers and the colour-changing p7 reflector.


................O.....
........O.......O.....
.OO...OOO..O..........
..O..O...OOO..O...O.OO
..O.O.OO....OOO.O.OO.O
OO..O.O.OOOO....O.....
.O.OO........OOO.OOOO.
.O....O.O.OO...O.O..O.
OO.O.O.OO....O.O......
.O.O......OOOO.O......
.O..OOOOOO....O.......
OO....O..O..O.........
............OO........

A larger period-7 pipsquirter is used in cases where space is limited where the reflector should extend southward for as short a distance as possible:


.....OO..................................
......OOO................................
....O....O...............................
..OOOOOO.O.............................O.
.O.....O.OO....OO.....................O..
.O.OO.O....O..O.O.....................OOO
..O...O.OO.O..O..........................
....O.O..O.OO.O..........................
...OO...O.....OO.........................
..O..OO.O.OOOO..O...OO...................
O..O...O.O...O.O...O.O..........O........
OO.O...O..OO.O..OOOO..OO.......O.........
.O.O.OO.O.O.O.O.O...OO..O......OOO.......
O..OOO..O.....O....O..O.O................
O.O...O.OO...OO....O.OO.OO.........OO....
.O.OOOO..O..O.O....O.....O.....OO..OO....
...O...O......OO...O..OOOO....O.O........
...O.OO..O..O.O....O.....O.....O.........
....O.O.OO...OO....O.OO.OO...............
......O.O.....O....O..O.O........OO......
......O.O...O.O.O...OO..O........O.......
.......O...O.O..OOOO..OO..........OOO....
...........O.O.O...O.O..............O....
............OO.OO...OO...................

:p7 reflector Traditional name for p7 bouncer before 2016, but with the discovery of the p7 bumper this has become an ambiguous reference.

:p8 bouncer A glider reflector constructed by Noam Elkies in September 1998, with a minimum repeat time of 24 ticks. It is a constellation containing a figure-8, boat, eater1, and block. For colour-preserving glider reflectors see p8 bumper and the stable Snark reflector.


................O.
...............O..
...............OOO
..................
..................
..................
..........O.......
.........O........
.........OOO......
..................
.............OO...
.........OO..OO...
........O.O.......
.........O........
.....O............
....O.O....OO.....
...O...O...O......
..O...O.....OOO...
.O...O........O...
O...O.............
.O.O..............
..O...............

:p8 bumper A periodic colour-preserving glider reflector with a blocker attached to provide the necessary spark. The minimum repeat time is 40 ticks. For an equivalent colour-changing periodic glider reflector see p8 bouncer. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


....................O..
....................O.O
....................OO.
.......................
.......................
.......................
.......................
.......................
.......................
.......................
..........O............
..........O.O..........
..........OO...........
.......................
........OO.............
.OO....O..O............
.OO.....O.O............
.OO......O.............
..O....................
.O.O.........OO........
OO.O.........O.........
..............OOO......
................O......
.OO....................
.OO....................

:p8 G-to-H A small periodic variant of a stable two-glider-to-Herschel component found by Paul Callahan in November 1998 and used in the Callahan G-to-H, Silver reflector and Silver G-to-H. The minimum repeat time is 192 ticks, though some lower periods such as 96 are possible via overclocking. Here a ghost Herschel marks the output signal location:


....O.........O...................
....OOO.....OOO...................
.......O...O......................
..O...OO...OO.....................
...O..............................
.OOO..............................
..................................
..................................
..................................
...............................O..
...............................O..
....................OO.........OOO
....................OO...........O
........OO........................
.......O..O.......................
..OO....OO........................
.O.O..............................
.O................................
OO................................
..........OO......................
..........O.......................
...........OOO....................
.............O...........OO.......
.....................OO..OO.......
....................O.O...........
.....................O............
.................O................
................O.O....OO.........
...............O...O...O..........
..............O...O.....OOO.......
.............O...O........O.......
............O...O.................
.............O.O..................
..............O...................

:p8 reflector Traditional name for p8 bouncer before 2016, but with the discovery of the p8 bumper this has become an ambiguous reference.

:p90 gun A glider gun with true period 90. The one below by Dean Hickerson uses the output of two p30 guns in a period-multiplying reaction:


......................................O.........................
......................................OOOO......................
................................OO.....OOOO.......O.............
...........................O...O..O....O..O......O.O............
..........................O.O...OO.....OOOO....OO...O...........
.........OO...............OO.O........OOOO.....OO...O.........OO
.........O.O..............OO.OO.......O........OO...O.........OO
....OO......O.............OO.O...................O.O............
OO.O..O..O..O.............O.O.....................O.............
OO..OO......O........O.....O...........O.O......................
.........O.O.......O.O.................OO.......................
.........OO.........OO..................O.......................
................................................................
................................................................
...........................................OO...................
...........................................OO...................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
........................................OO......................
........................................O.......................
.........................................OOO....................
...........................................O....................

:p92 gun A glider gun with a true period of 92. The first one was found by Bill Gosper in 1971 using a period doubling reaction using two p46 guns. Many different p92 guns are known that use multiple twin bees shuttles. A period 92 gun can also be made by adding a semi-cenark to any period 46 glider gun.

On 18 November 2017, Martin Grant found a new gun using one twin bees shuttle and one Tanner's p46 oscillator, making it the smallest known p92 gun.


....OO..............O.........................
.....O.............O.O........................
.....O.O...........O.O........................
......OO..OO.....OOO.OO....................OO.
..........OO....O..........................OO.
.................OOO.OO........O..............
...................O.OO....OO..O..............
.......OO.O.O.............O.....O...........OO
.......OO.O.O............OO..O.O............OO
.......OO...O.............OO...O..............
.......OO....OO......OO....OOO................
O......OO.....OO.....OO.......................
OOO.......OOO.O............OOO................
...O.....OO...O.O.O.......OO...O..............
..O.O......O..O...O......OO..O.O............OO
..OO.......O.O..O.O.......O.....O...........OO
...........................OO..O..............
..OO...........................O..............
..O........................................OO.
....O......................................OO.
...OO.........................................
........OO....................................
.........O.....................O..............
......OOO.......................O.............
......O.......................OOO.............

:p9 bumper A periodic colour-preserving glider reflector with a repeat time of 36. Unlike the p5 through p8 cases where Noam Elkies' domino spark-based reflectors are available, no small period-9 colour-changing reflector is known. A stable Snark reflector can be substituted for any bumper. This changes the timing of the output glider, which can be useful for rephasing periodic glider streams.


........................O..
........................O.O
........................OO.
...........................
...........................
...........................
...........................
...........................
...........................
...............O...........
......OO.......O.O.........
.....O.O.......OO..........
.OO..O.....................
.O.O.OO......OO............
...O...O....O..O...........
O..O.O.OO....O.O...........
OOO..O.O......O............
...OO.O....................
..O..O..O.........OO.......
...OOOOOO.........O........
...................OOO.....
.....OO..............O.....
.....OO....................

:pair of bookends = bookends

:pair of tables = table on table

:paperclip (p1) A relatively 180-degree rotationally symmetric 14-bit still life. The Iwona methuselah contains a paperclip in its ash.


..OO.
.O..O
.O.OO
OO.O.
O..O.
.OO..

:parallel grey ship = with-the-grain grey ship

:Parallel HBK ((6,3)c/245912, p245912) A much smaller successor to the half-baked knightship, constructed by Chris Cain in September 2014. Several slow-salvo recipes are needed to support the multi-glider salvo seeds at the upstream end of the spaceship. "Parallel" means that these recipes are sent in parallel instead of one after the other, in series, as in the original HBK.

:Parallel HBK gun An armless constructor pattern that is programmed to build Parallel HBK oblique spaceships every 125906944 ticks. This gun was created by Chris Cain on 3 January 2015.

:parasite A self-sustaining reaction attached to the output of a rake or puffer, that damages or modifies the standard output. Compare tagalong. In 2009, while experimenting with novelty generator patterns in Golly, Mitchell Riley discovered parasites on glider streams from p20 and p8 backward rakes. In some cases, parasites can even "reproduce", as in the pattern below, though the number of copies is limited since they will eventually use up their host glider stream:


......O.............O.........
.....OOO...........OOO........
...OO.OOO.........OOO.OO......
....O..O.OO.....OO.O..O.......
.OO.O....O.O...O.O....O.OO....
.OO.O.O..O.OO.OO.O..O.O.OO....
.O........O.O.O.O........O....
OO.......OO.O.O.OO.......OO...
............O.O...............
.......OOO.O...O.OOO..........
......OO...........OO.........
......O.....O....OO..O........
.....OO....OOO...OO..O........
...........O.OO...OOO.........
............OOO....O..........
............OOO...............
............OOO...............
............OO................
..............................
...................O.O........
....................OO........
...............OO...O.........
........OO......OO............
.......OO......O..............
.........O....................
..............................
..............................
.................OO...........
..........O......OOO..........
.........OOO.O...OOO..........
........OO.O.....OOO..........
........OO......O.OO..........
........OO......OOO....OO.....
........OO.OO....O.....O......
.........OO...........OO......
..........OOO.O...O.OOO.......
...............O.O............
...OO.......OO.O.O.OO.......OO
....O........O.O.O.O........O.
....OO.O.O..O.OO.OO.O..O.O.OO.
....OO.O....O.O...O.O....O.OO.
.......O..O.OO.....OO.O..O....
......OO.OOO.........OOO.OO...
........OOO...........OOO.....
.........O.............O......

:parent A pattern is said to be a parent of the pattern it gives rise to after one generation. Some patterns have infinitely many parents, but others have none at all (see Garden of Eden). Typically parents are considered trivial if they contain groups of cells that can be removed without changing the result, such as isolated faraway cells.

:parent cells The three cells that cause a new cell to be born.

:parity Even or odd, particularly as applied to the phase of an oscillator or spaceship. For example, in slow salvo constructions, the intermediate targets are frequently period 2, most often because they contain blinkers or traffic lights. A glider striking a P2 constellation will generally produce a different result depending on its parity. Period-4 intermediate targets are rare (or not used), so it doesn't matter for example whether an odd-parity glider in a slow salvo is phase 1 or phase 3. Only the even/odd parity is important.

:partial result An intermediate object found by a search program which might be a substantial part of a complete spaceship or oscillator, but which isn't complete.

Running a partial result works for a few generations until the speed of light corruption from any unfinished edge destroys the whole object. But a partial result can still be used to see whether the object (if ever finished) would provide a desired spark or perturbation. If no partial results are found then it is likely that no such object exists under the constraints of the search.

Very large partial results can indicate that there is a good chance that the object being searched for might actually exist (but this is no guarantee). Rerunning the search using the partial result as a base and relaxing some constraints, widening or adjusting the search area, or splitting the object into multiple arms might result in finding a complete working object.

As an example, here is a large partial result for a period 6 knightship found by Josh Ball in April 2017. The first 22 columns were rediscovered in 2018 as part of the successful search for Sir Robin. See also almost knightship for an earlier small example by Eugene Langvagen.


....OOO...................
...O..OO..................
...O....O.................
..........................
...OOO...OO.OOO...........
.OO.O.O....O.OO...........
...O..O....O..OO..........
O..O........O.............
O....O..OO..O..O..........
.O.OOO..OO...OO...........
...OO.O.OO.O...O..........
.........OO.OOO...........
.........O.....O..........
............OOO..OOO......
...............O.OO.......
..........OO.O...OOO......
..........OO..O..OO.......
............OOOO...O......
.............OO.O..O......
...........OO.O.O.O.......
..............O...........
...........O.......OO.....
............OO.....OO.....
..............OO.O........
................OOO..O.O..
................OO...O....
.................O........
..................OOOOO.O.
...................OO..OOO
...................OO....O
.......................OO.

:PD = pentadecathlon

:PD hassler = p29 pentadecathlon hassler

:PD-pair reflector A pair of pentadecathlons arranged so that their V sparks turn a glider by 90 degrees. The minimum repeat time is 45 ticks.


..............OOO......
.......................
.............O...O.....
.............O...O.....
.......................
..............OOO......
.......................
.......................
..............OOO......
.......................
.............O...O.....
.............O...O.....
....................O..
..............OOO...O.O
....................OO.
.......................
O..O.OO.O..O...........
OOOO.OO.OOOO...........
O..O.OO.O..O...........
This was found by Mark Niemiec on 6 January 1996, which is relatively recent considering how old pentadecathlon technology is.

:pedestle (p5) An oscillator found by Dave Buckingham in 1973.


.....O.....
....O.O....
.O..OO.....
.OOO.......
.....OOO...
...OO...O..
..O....O..O
.O.O.O.O.OO
.O.O...O.O.
OO.O.O.O.O.
O..O....O..
..O...OO...
...OOO.....
.......OOO.
.....OO..O.
....O.O....
.....O.....

:penny lane (p4) Found by Dave Buckingham, 1972.


...OO.....OO...
...O.......O...
OO.O.......O.OO
OO.O.OOOOO.O.OO
....O..O..O....
.....OOOOO.....
...............
.......O.......
......O.O......
.......O.......

:pentadecathlon (p15) Found in 1970 by Conway while tracking the history of short rows of cells, 10 cells giving this object, which is the most natural oscillator of period greater than 3. In fact it is the fifth most common oscillator overall, appearing in random soups slightly more frequently than the clock, but much less frequently than the blinker, toad, beacon or pulsar. The pentadecathlon can be constructed using just three gliders, as shown in glider synthesis.


..O....O..
OO.OOOO.OO
..O....O..

The pentadecathlon is the only known oscillator that has two phases that are different polyominoes. It produces accessible V sparks and domino sparks, which give it a great capacity for doing perturbations, especially for period 30 based technology. See relay for example.

:pentant (p5) Found by Dave Buckingham, July 1976.


OO........
.O........
.O.O......
..OO....OO
.........O
.....OOOO.
.....O....
..O...OOO.
..OOOO..O.
.....O....
....O.....
....OO....

:pentaplet Any 5-cell polyplet.

:pentapole (p2) The barberpole of length 5.


OO......
O.O.....
........
..O.O...
........
....O.O.
.......O
......OO

:pentoad (p5) Found by Bill Gosper, June 1977. This is extensible: if an eater is moved back four spaces then another Z-hexomino can be inserted. (This extensibility was discovered by Scott Kim.)


...........OO
...........O.
.........O.O.
.........OO..
.....OO......
......O......
......O......
......OO.....
..OO.........
.O.O.........
.O...........
OO...........

:pentomino Any 5-cell polyomino. There are 12 such patterns, and Conway assigned them all letters in the range O to Z, loosely based on their shapes. Only in the case of the R-pentomino has Conway's label remained in common use, but all of them can nonetheless be found in this lexicon.

:period The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form. The term can also be used for a puffer, wick, fuse, superstring, stream of spaceships, factory or gun. In the last case there is a distinction between true period and pseudo period. There is also a somewhat different concept of period for wicktrailers.

:period doubler See period multiplier.

:periodic For circuit mechanisms, "periodic" is the opposite of p1 or stable. Periodic circuits necessarily contain oscillators, and therefore they can generally only accept input signals that are synchronized to the combined period of those oscillators (but see universal regulator).

For signal streams, "periodic" means that signals will only be present in the stream at one out of every n ticks, where n is the period of the stream. In a periodic intermittent stream there may be gaps, so that signals do not always appear at every nth tick. However, if a signal does appear, its distance measured in ticks from previous and future signals will always be an exact multiple of n.

:period multiplier A term commonly used for a pulse divider, because dividing the number of signals in a regular stream by N necessarily multiplies the period by N. The term "period multiplier" can be somewhat misleading in this context, because most such circuits can accept input streams that are not strictly periodic.

Reactions have also been found to period double or period triple the output of some rakes to create high-period rakes in a relatively small space (i.e., an exponential increase in period for a linear increase in size).

For Herschel signals and glider guns, a number of small period doubler, tripler, and quadrupler mechanisms are known. For example, the following conduit produces one output glider after accepting four input B-heptominoes, or four Herschels if a conduit such as F117 is prepended that includes the same BFx59H converter.


....................O........................
....................OOO......................
.......................O.....................
............OO........OO.....................
.............O...............................
.............O.O.............................
OO............OO.............................
O.O..........................................
..O..........................................
..OO.........................................
.............................................
.............................................
...........................................OO
...........................................OO
.............................................
.O...OO......................................
.OO..OO......................................
..OO.........................................
.OO..........................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.................................OO..........
.........OO......................OO..........
........O.O..................................
........O....................................
.......OO....................................

See semi-Snark and tremi-Snark for additional examples using glider streams. As of June 2018 no stable period-multiplying elementary conduits are known for a multiplication factor of five or higher, though it is easy to construct composite ones.

:permanent switch A signal-carrying circuit that can be modified so that it cleanly absorbs any future signals instead of allowing them to pass. Optionally there may be a separate mechanism to restore the circuit to its original function.

In the following example, a glider from the northeast (shown) will perform a simple block pull that switches off an F166 conduit, so that any future Herschel inputs will be cleanly absorbed. A glider from the southwest (also shown) can restore the block to its original position.


.OO........................................................
..O........................................................
.O.........................................................
.OO...............................................OO.......
...................................................O.......
..................................................O........
..................................................OO.......
..................................O........................
..................................O.O......................
O...OO............................OO.......................
OO..OO.....................................................
.OO......................OO................................
OO.......................OO..........................OO....
.....................................................OO....
...........................................................
...........................................................
...........................................................
...........................................................
.............OO............................................
............O.O........OO..................................
..............O.......O.O..................................
......................O....................................
.....................OO.........................OO.........
................................................OO.........
...........................................................
...........................................................
..................................OO.....................OO
...................................O......................O
................................OOO....................OOO.
................................O......................O...
............................................OO.............
............................................O..............
.............................................OOO...........
...............................................O...........

:perpendicular grey ship = against-the-grain grey ship

:perturb To change the fate of an object by reacting it with other objects. Typically, the other objects are sparks from spaceships or oscillators, or are eaters or impacting spaceships. Perturbations are typically done to turn a dirty reaction into a clean one, or to change the products of a reaction. In many desirable cases the perturbing objects are not destroyed by the reaction, or else are easily replenished.

:perturbation = perturb.

:PF35W One of the three elementary conduits used in the composite Fx176 Herschel conduit. It converts an input pi-heptomino into an output wing in 35 ticks. In November 2017, Aidan F. Pierce discovered the compact PF35W variant below, which improved the repeat time of the Fx176 to 73 ticks and allowed gliders from following dependent conduits to escape freely:


O.........OO...
OOO....OO..O...
...O..O..OO....
..OO...OO..OOO.
.........O.O..O
.........O...OO
..........O....
.........OO....
...............
...............
...............
...............
...OOO.........
.....O.........
...OOO.........
...............
...............
...............
...............
...............
...............
...............
...............
..OO...........
...O...........
OOO............
O..............
Several variants of the key catalyst are known, including welded additions for the Fx176 that absorb the following Herschel's first natural glider, since a standard fishhook eater doesn't quite fit. The following is a complete Fx176 conduit incorporating the new PF45W:

   ......................O...........................
......................OOO...OO....................
..............OO.........O..O..OO.................
..............OO........OO...OO..O................
...............................O.OOO..............
...............................O....O.OO..........
................................O.O.O.O.O.........
...............................OO.OO...O..........
OO................................................
.O...................................OOOOO........
.O.O.................................O...O........
..OO...................................O..........
.........................OOO..........OOO.........
...........................O.............O........
.........................OOO............OO........
..................................................
..................................................
..................................................
..O...............................................
..O.O...............................OO...........O
..OOO...............................OO.........OOO
....O..........................................O..
...............................................O..
..............OO........OO........................
..............OO..OO.....O........................
..................O.O.OOO.........................
....................O.O...........................
....................OO....OO......................
.........................O.O....OO................
.........................O......OO................
........................OO........................

:phase A representative generation of a periodic object such as an oscillator or spaceship. The number of phases is equal to the period of the object. The phases of an object usually repeat in the same cyclic sequence forever, although some perturbations can cause a phase change.

:phase change A perturbation of a periodic object that causes the object to skip forward or backward by one or more phases. If the perturbation is repeated indefinitely, this can effectively change the period of the object. An example of this, found by Dean Hickerson in November 1998, is shown below. In this example, the period of the oscillator would be 7 if the mold were removed, but the period is increased to 8 because of the repeated phase changes caused by the mold's spark.


..........O....
.........O.OO..
..OO.........O.
..O......O..O.O
.......O...O..O
OOOOOO.O....OO.
O..............
.OO.OO...OO....
..O.O....O.O...
..O.O......O...
...O.......OO..

The following pattern demonstrates a p4 c/2 spaceship found by Jason Summers, in which the phase is changed as it deletes a forward glider. This phase change allows the spaceship to be used to delete a glider wave produced by a rake whose period is 2 (mod 4).


........O...........................
.......OOO.OO.......................
......OO...O.OO.....................
.....OO..O.....O....................
......O.....O...O.OOO...............
.....OO.....O...O.O..O..............
...OO.O.OO....O.O.O...O.............
....O.O..OO...........O.............
.OO.O..O..O.........O...............
.OO.O.....OO.........O.OOO..........
.O.O.............OOO.O.O.OO.........
OO.OO...........OO.O..O.O.O.........
..............OO.O...OOO..OO.....OO.
.............O...O......O........O.O
............O.....O..OO.O.OO.....O..
...........O..O.O......O.O..........
...........O.....OO....OOO..........
.............O..........O...........
..........O.O...........O...........
.........OO.O.OOO...................
........O.O.O...O...................
.......OO.O.........................
......O...O.....OO..................
....................................
......OO.OO.........................

Phase changing reactions have enabled the construction of spaceships having periods that were otherwise unknown, and also allow the construction of period-doubling and period-tripling convoys to easily produce very high period rakes.

See also blinker puffer.

:phase shift = phase change

:phi The following common spark. The name comes from the shape in the generation after the one shown here.


.OOO.
O...O
O...O
.OOO.
One oscillator which produces this spark is Tanner's p46. The pentadecathlon produces a slightly corrupted version of this spark.

:phi calculator (p1 circuitry) See pi calculator.

:phoenix Any pattern all of whose cells die in every generation, but which never dies as a whole. A spaceship cannot be a phoenix, and in fact every finite phoenix eventually evolves into an oscillator. The following 12-cell oscillator (found by the MIT group in December 1971) is the smallest known phoenix, and is sometimes called simply "the phoenix".


....O...
..O.O...
......O.
OO......
......OO
.O......
...O.O..
...O....
This is extensible and is just the first of a family of phoenixes made by joining components together to form a loop. Here is another member of this family.

.....................O.......O......
.....................O.O.....O.O....
.................O.O.....O.O........
.................O.......O......OO..
.....O.......O.O....................
.....O.O.....O...................O..
...O.....O.O........................
.........O........................OO
..OO................................
..................................O.
.O..................................
................................OO..
OO........................O.........
........................O.O.....O...
..O...................O.....O.O.....
....................O.O.......O.....
..OO......O.......O.................
........O.O.....O.O.................
....O.O.....O.O.....................
......O.......O.....................
Every known phoenix oscillator has period 2. In January 2000, Stephen Silver showed that a period 3 oscillator cannot be a phoenix. The situation for higher periods is unknown.

An easy synthesis of the phoenix is possible using four blocks as seeds. A puffer creating a growing row of phoenixes has the unusual property that the percentage of live cells that stay alive for more than one generation approaches zero. See lone dot agar for an example of an infinite phoenix.

:pi = pi-heptomino

:Pianola breeder A series of patterns by Paul Tooke in 2010, based on a simplification and extension of the Gemini spaceship's construction mechanism. Tooke produced a number of slow-salvo-constructed patterns with superlinear growth, including a series of breeder patterns of previously unknown types. For some patterns, the Gemini's two construction arms were moved to a permanent stationary platform, using fourteen glider-loop channels instead of twelve.

Some of these breeder patterns remain difficult to classify unambiguously. For example, one pattern was designed to be an MSS breeder - a modified Gemini spaceship puffing slide guns which build lines of blocks. However, the slide guns produce both moving and stationary objects at a linear rate, because streams of gliders are needed to reach out to the construction zone to do the push reaction and build more blocks. The pattern could therefore be classified as a hybrid MSM/MSS breeder. Other breeder patterns utilizing slide guns and universal constructor technology are likely to cause similar classification ambiguities.

:pi calculator (p1 circuitry) A device constructed by Adam P. Goucher in February 2010, which calculates the decimal digits of pi (the transcendental number, not the Life pattern!) and displays them in the Life universe as 8x10 dot matrix characters formed by arrangements of blocks along a diagonal stripe at the top. A push reaction moves a ten-block diagonal cursor to the next position as part of the "printing" operation for each new digit.

The actual calculation is done in binary, using a streaming spigot algorithm based on linear fractional transformations. The pi calculator is made up of a 188-state computer connected to a printing device via period-8 regulators and a binary-to-decimal conversion mechanism. The complete pattern can be found in Golly's Very Large Patterns online archive, along with the very similar 177-state phi calculator which uses a simpler algorithm to calculate and print the Golden Ratio.

:pi climber The reaction that defines rate of travel of the Caterpillar spaceship. A pi climber consists of a pi-heptomino "climbing" a chain of blinkers, moving 17 cells every 45 ticks, and leaving behind an identical chain of blinkers, shifted downward by 6 cells. A single pi climber does not produce any gliders or other output, but two or more of them travelling on nearby blinker chains can be arranged to emit gliders every 45 ticks. Compare Herschel-pair climber.


..O..
..O..
..O..
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
..O..
.OOO.
.O.O.

:pi-heptomino (stabilizes at time 173) A common pattern. The name is also applied to later generations of this object. In a pi ship, for example, the pi-heptomino itself never arises.


OOO
O.O
O.O

:pincers = great on-off

:pinwheel (p4) Found by Simon Norton, April 1970. Compare clock II.


......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O...OO.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:pi orbital (p168) Found by Noam Elkies, August 1995. In this oscillator, a pi-heptomino is turned ninety degrees every 42 generations. A second pi can be inserted to reduce the period to 84.


..............OO....OO....OO...............................
.............O..O.O....O.O..O..............................
.............OOO..........OOO..............................
................OO......OO.................................
...............O..OOOOOO..O................................
...............OO........OO................................
...........................................................
........O.............................OO..........O........
.......O...OOO......O.........O.......OO.........O.O.......
........O.OOOOO..........OOO...O...........................
............O...O.....O.OOOOO.O..................O.........
............OO....OOO.....O......................OO........
............OO....OOO....OO...................OOOOO........
...................O.....OO...................OO.OO.....OO.
.................................................O......O.O
.....................................................OO.O.O
.....................................................O.O.O.
.......................................................O...
...................................OOO.........O.O...O..O..
.......OO..........................O..O........O..O.....O..
.......OO..............................O.......O.O..O...O..
...................................O..O.............O...O..
...................................OOO..................O..
.....................................................O..O..
................................................O......O...
.............................................OO.OO...O.O.O.
.............................................OOOOO...OO.O.O
.........O......................................OO......O.O
........O.O.....................................O.......OO.
...........................................................
.OO.......O.....................................O.O........
O.O......OO......................................O.........
O.O.OO...OOOOO.............................................
.O.O.O...OO.OO.............................................
...O......O................................................
..O..O.....................................................
..O........................................................
..O...O....................................................
..O...O..O.O......................................OO.......
..O.....O..O......................................OO.......
..O..O...O.O...............................................
...O.......................................................
.O.O.O.....................................................
O.O.OO.....................................................
O.O......O.................................................
.OO.....OO.OO...................OO.....O...................
........OOOOO...................OO....OOO....OO............
........OO......................O.....OOO....OO............
.........O..................O.OOOOO.O.....O...O............
...........................O...OOO..........OOOOO.O........
.......O.O.........OO.......O.........O......OOO...O.......
........O..........OO.............................O........
...........................................................
................................OO........OO...............
................................O..OOOOOO..O...............
.................................OO......OO................
..............................OOO..........OOO.............
..............................O..O.O....O.O..O.............
...............................OO....OO....OO..............

:pi portraitor (p32) Found by Robert Wainwright in 1984 or 1985. Compare with gourmet and popover.


...........OO...........
......OO.O....O.OO......
......O..........O......
.......OO......OO.......
....OOO..OOOOOO..OOO....
....O..O........O..O....
.OO.O.O..........O.O.OO.
.O.O.O............O.O.O.
...O................O...
.O..O..............O..O.
....O.......OOO....O....
O...O.......O.O....O...O
O...O.......O.O....O...O
....O..............O....
.O..O..............O..O.
...O................O...
.O.O.O............O.O.O.
.OO.O.O..........O.O.OO.
....O..O........O..O....
....OOO..OOOOOO..OOO....
.......OO......OO.......
......O..........O......
......OO.O....O.OO......
...........OO...........

:pipsquirt = pipsquirter

:pipsquirter An oscillator that produces a domino spark that is orientated parallel to the direction from which it is produced (in contrast to domino sparkers like the pentadecathlon and HWSS, which produce domino sparks perpendicular to the direction of production). See p6 pipsquirter, p7 pipsquirter.

:pi ship A growing spaceship in which the back part consists of a pi-heptomino travelling at a speed of 3c/10. The first example was constructed by David Bell. All known pi ships are too large to show here, but the following diagram shows how the pi fuse works.


............O............
...........O.O...........
OO........OO.OO........OO
OO.....................OO

:piston (p2) Found in 1971.


OO.......OO
O.O..O..O.O
..OOOO..O..
O.O..O..O.O
OO.......OO

:pi wave A line of pi-heptominoes stabilizing one another. For example, an infinite line of pi-heptominoes arranged as shown below produces a pi wave that moves at a speed of 3c/10 with period 30, and leaves no debris.


OOO...............OOO...............OOO...............OOO
O.O...............O.O...............O.O...............O.O
O.O...............O.O...............O.O...............O.O

:pixel = cell

:plet = polyplet

:polyomino A finite collection of orthogonally connected cells. The mathematical study of polyominoes was initiated by Solomon Golomb in 1953. Conway's early investigations of Life and other cellular automata involved tracking the histories of small polyominoes, this being a reasonable way to ascertain the typical behaviour of different cellular automata when the patterns had to be evolved by hand rather than by computer. Polyominoes have no special significance in Life, but their extensive study during the early years lead to a number of important discoveries and has influenced the terminology of Life. (Note on spelling: As with "dominoes" the plural may also be spelt without an e. In this lexicon I have followed Golomb in using the longer form.)

It is possible for a polyomino to be an oscillator. In fact there are infinitely many examples of such polyominoes, namely the cross and its larger analogues. The only other known examples are the block, the blinker, the toad, the star and (in two different phases) the pentadecathlon.

A polyomino can also be a spaceship, as the LWSS, MWSS and HWSS show.

:polyplet A finite collection of orthogonally or diagonally connected cells. This king-wise connectivity is a more natural concept in Life than the orthogonal connectivity of the polyomino.

:pond (p1)


.OO.
O..O
O..O
.OO.

:pond on pond (p1) This term is often used to mean bi-pond, but may also be used of the following pseudo still life.


.OO...OO.
O..O.O..O
O..O.O..O
.OO...OO.

:popover (p32) Found by Robert Wainwright in August 1984. Compare with gourmet and pi portraitor.


.....................O..........
.....................O..........
.....................OOO........
.............OO.......OO........
.............OO..OOO..OO........
...................OOO..........
...................OOO..........
..............OO................
..OOO........O..O...............
..OOO........O.O................
OOO..OO...O...O....OOO..........
.....OO...O.....................
....OOO...O.....................
....O.................OO...OO...
....O...........OOO..O..O..OO...
........O.......O.O...O.O.......
.......O.O......O.O....O........
...OO..O..O................O....
...OO...OO.................O....
.....................O...OOO....
.....................O...OO.....
..........OOO........O...OO..OOO
.................OO........OOO..
................O..O.......OOO..
................O.O.............
..........OOO....O..............
..........OOO...................
........OO..OOO..OO.............
........OO.......OO.............
........OOO.....................
..........O.....................
..........O.....................

:population The number of ON cells.

:P-pentomino Conway's name for the following pentomino, a common spark.


OO
OO
O.

:PPS (c/5 orthogonally, p30) A pre-pulsar spaceship. Any of three different p30 c/5 orthogonal spaceships in which a pre-pulsar is pushed by a pair of spiders. The back sparks of the spaceship can be used to perturb gliders in many different ways, allowing the easy construction of c/5 puffers. The first PPS was found by David Bell in May 1998 based on a p15 pre-pulsar spaceship found by Noam Elkies in December 1997. See also SPPS and APPS.

The pattern below shows the basic mechanism of a PPS. The two isolated sparks at the left and right sides are the edge sparks from the two supporting spiders.


...O.....O...
..O.O...O.O..
.............
..OOO...OOO..
.............
.............
.............
..OOO...OOO..
.............
O.O.O...O.O.O
...O.....O...

:pre-beehive The following common parent of the beehive.


OOO
OOO

:pre-block The following common parent of the block. Another such pattern is the grin.


O.
OO

:precursor = predecessor

:predecessor Any pattern that evolves into a given pattern after one or more generations.

:pre-pre-block A common predecessor to the pre-block (and thus the block):


O.O
.OO
This is easily created by a two-glider collision. Hitting the pre-pre-block with a glider can create a MWSS. Both of these reactions are shown below:

.O..........
..O.........
OOO.........
............
............
...OOO....OO
.....O...OO.
....O......O

:pre-pulsar A common predecessor of the pulsar, such as that shown below. This duplicates itself in 15 generations. (It fails, however, to be a true replicator because of the way the two copies then interact.)


OOO...OOO
O.O...O.O
OOO...OOO

A pair of tubs can be placed to eat half the pre-pulsar as it replicates; this gives the p30 oscillator Eureka where the pre-pulsar's replication becomes a movement back and forth. See twirling T-tetsons II for a variation on this idea. By other means the replication of the pre-pulsar can be made to occur in just 14 generations as half of it is eaten; this allows the construction of p28 and p29 oscillators. The pre-pulsar was also a vital component of the first known p26 and p47 oscillators.

See also PPS.

:pre-pulsar spaceship = PPS.

:pressure cooker (p3) Found by the MIT group in September 1971. Compare mini pressure cooker.


.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O...O...
....OOO....
...........
...O.OO....
...OO.O....

:primer A pattern originally constructed by Dean Hickerson in November 1991 that emits a stream of LWSSs representing the prime numbers. Some improvements were found by Jason Summers in October 2005.

:PRNG = pseudo-random number generator

:propagator = linear propagator

:protein (p3) Found by Dave Buckingham, November 1972.


....OO.......
....O........
......O......
..OOOO.O.OO..
.O.....O.O..O
.O..OO.O.O.OO
OO.O.....O...
...O..OO.O...
...O....O....
....OOOO.....
.............
....OO.......
....OO.......

:pseudo Opposite of true. A gun emitting a period n stream of spaceships (or rakes) is said to be a pseudo period n gun if its mechanism oscillates with a period greater than n. This period will necessarily be a multiple of n. If the base mechanism's period is instead a fraction of n, then a period multiplier must also be present which is considered to be part of the mechanism, and the gun as a whole is still a true period gun. For example, a filter may be used on a lower-period gun to produce a compound gun such as the true p48 gun.

Pseudo period n glider guns are known to exist for all periods greater than or equal to 14, with smaller periods being impossible. All known p14 guns are pseudo guns requiring several signal injections, so they are quite large. The following smaller example is a pseudo period 123 gun, interleaving the streams from two true period 246 guns:


..................................O...........................
..................................OOO.........................
................................OO...O........................
...............................O.O.OO.O.......................
..............................O..O..O.O.......................
....................................O.OO......................
..................................O.O.........................
......................OOO.......O.O.O.........................
.................................OO.OO........................
.....................O..O.....................................
OO...................OOO......................................
.O............................................................
.O.O...................OO.OO..................................
..OO...............OO..OO.O.O............OO...................
...................OO..OO...O............O....................
...........................OOO.........O.O...........OO.......
.......................OO..OOO.........OO............O.O......
..................O.O..OOO............................OOO.....
..................O.O...OO.............................OO.....
...................O.................................O.O......
................................................OO..O.O.......
................................................O.O..O........
.................................................OOOO.........
.............................OO...................OO..........
.............................OO...............................
..............................................................
..............................................................
.....................................OOOO.....................
....................................OOOOO.O...................
.....................................O..O.O...................
.....O...................................OO...................
....O.OOOO.............................O.O....................
...O.O.OOO..........................OO............O.........OO
..O.O..............................O.OOOO..........O........O.
...O...............................O...OO........OOO......O.O.
...OO.............OO................OO.O..................OO..
...OO.............O.O................OOO......................
...OO..............OOO........................................
....................OO........................................
..................O.O.........................................
.............OO..O.O..........................................
.............O.O..O...........................................
..............OOOO..............................OO............
...............OO...............................OO............
....................OO.OO.....................................
.....................O.O......................................
.....................O........................................
..................OO.O..O.....................................
...................O.O.OOO....................................
...................O.OO...O...................................
....................O...OO....................................
.....................OOO......................................
.......................O......................................

The same distinction between true and pseudo also exists for puffers.

:pseudo-barberpole (p5) Found by Achim Flammenkamp in August 1994. In terms of its minimum population of 15 this is the smallest known p5 oscillator. See also barberpole.


..........OO
...........O
.........O..
.......O.O..
............
.....O.O....
............
...O.O......
............
..OO........
O...........
OO..........

:pseudo-random glider generator A pseudo-random number generator in which the bits are represented by the presence or absence of gliders. The first pseudo-random glider generator was built by Bill Gosper. David Bell built the first moving one in 1997, using c/3 rakes.

:pseudo-random number generator A pseudo-random number generator (PRNG) is an algorithm that produces a sequence of bits that looks random (but cannot really be random, being algorithmically determined).

In Life, the term refers to a PRNG implemented as a Life pattern, with the bits represented by the presence or absence of objects such as gliders or blocks. Such a PRNG usually contains gliders or other spaceships in a loop with a feedback mechanism that causes later spaceships to interfere with the generation of earlier spaceships. The period can be very high, as a loop of n spaceships has 2n possible states.

:pseudo still life A stable pattern whose live cells are either immediately adjacent to each other, or are connected into a single group by adjacent dead cells where birth is suppressed by overpopulation.

The definition of strict still life rules out such stable patterns as the bi-block. In such patterns there are dead cells which have more than 3 neighbours in total, but fewer than 3 in any component still life. These patterns are called pseudo still lifes, and have been enumerated up to 32 bits, as shown in the table below.

  --------------
  Bits    Number
  --------------
   8           1
   9           1
  10           7
  11          16
  12          55
  13         110
  14         279
  15         620
  16        1645
  17        4067
  18       10843
  19       27250
  20       70637
  21      179011
  22      462086
  23     1184882
  24     3068984
  25     7906676
  26    20463274
  27    52816265
  28   136655095
  29   353198379
  30   914075620
  31  2364815358
  32  6123084116
  --------------

Attribution of these counts is given in strict still life; see also https://oeis.org/A056613. The unique 32-bit triple pseudo still life is included in the last count in the table. As the number of bits increases, the pseudo still life count goes up exponentially by approximately O(2.56n). By comparison, the rate for strict still lifes is about O(2.46n) while for quasi still lifes it's around O(3.04n).

If a stable pattern's live cells plus its overpopulated dead cells do not form a single mutually adjacent group, the pattern is usually referred to as a constellation. It is also a still life in the general sense, but is neither "pseudo" nor "strict".

:puffer An object that moves like a spaceship, except that it leaves debris behind. The first known puffers were found by Bill Gosper and travelled at c/2 orthogonally (see diagram below for the very first one, found in 1971).


.OOO......O.....O......OOO.
O..O.....OOO...OOO.....O..O
...O....OO.O...O.OO....O...
...O...................O...
...O..O.............O..O...
...O..OO...........OO..O...
..O...OO...........OO...O..

Not long afterwards c/12 diagonal puffers were found (see switch engine). Discounting wickstretchers, which are not puffers in the conventional sense, no new velocity was obtained after this until David Bell found the first c/3 orthogonal puffer in April 1996. Other new puffer speeds followed over the next several years.

Many spaceships that travel orthogonally at a speed less than c/2 have useful side or back sparks. These can be used to perturb standard spaceships that approach from behind. A common technique for creating puffers for a new speed uses a convoy of the new spaceships to create debris from an approaching standard spaceship such that a new standard spaceship is recreated on the same path as the original one. This forms a closed loop, resulting in a high-period puffer for the new speed.

As of June 2018, puffers have been found matching every known velocity of elementary spaceship, except for c/6 and c/7 diagonal and (2,1)c/6. It is also generally easy to create puffers based on macro-spaceships, simply by removing some part of the trailing cleanup mechanism.

:puffer engine A pattern which can be used as the main component of a puffer. The pattern may itself be a puffer (e.g. the classic puffer train), it may be a spaceship (e.g. the Schick engine), or it may even be unstable (e.g. the switch engine).

:pufferfish (c/2, p12) A puffer discovered by Richard Schank in November 2014, from a symmetric soup search using an early version of apgsearch. It consists of a pair of B-heptominoes stabilised by a backend that leaves only pairs of blocks behind. It is simple enough to be easily synthesized with gliders.


...O.......O...
..OOO.....OOO..
.OO..O...O..OO.
...OOO...OOO...
...............
....O.....O....
..O..O...O..O..
O.....O.O.....O
OO....O.O....OO
......O.O......
...O.O...O.O...
....O.....O....
See soup for a random initial pattern, generated by apgsearch and recorded in Catagolue, that produces a pufferfish.

:pufferfish spaceship (c/2, p36) Generally, any spaceship constructed using pufferfish. May refer specifically to the extensible c/2 spaceship constructed by Ivan Fomichev in December 2014, the first such spaceship to contain no period-2 or period-4 parts. (The first two or three rows might be considered to be period 2 or 4, but they are directly dependent on following rows for support.).

The pattern consists of two adjacent pufferfish puffers, plus four copies of a nontrivial period 36 c/2 fuse for pufferfish exhaust, discovered using a randomized soup search.


.......O.......O..................O.......O........
......OOO.....OOO................OOO.....OOO.......
.....O..OO...OO..O..............OO.O.....O.OO......
.....O...O...O...O...............OO.O...O.OO.......
......OO.OO.OO.OO..............O.OO.......OO.O.....
......OO.O...O.OO.............O.O..O.O.O.O..O.O....
........O.....O...............O.O...OO.OO...O.O....
.........OO.OO.................OOO.O.....O.OOO.....
....OO..O.....O..OO.............OOO.......OOO......
....OO..O.....O..OO.............OO.........OO......
................................O...........O......
........O.O.O.O................OO...........OO.....
........OO...OO................OO...........OO.....
...................................................
...................................OO...OO.........
...................O..........O....OO...OO.........
...O..............OOO........OOO..............O....
..OOO...OO...O.O.OO.O.......OO.O.............OOO...
.OO..O..OO.........O........OOO.............OO.O...
.OOOO.O......O...O.O........OOO.............OO.....
OO.....O.......OO..OO.......OOOO..............OO...
.O................O..O......O..O...........O..OO...
.O.OOO..O....O.O..OO.......OO..............O....O..
.O.O...OO....O.O..OO...O....O.O...........O..O.O...
.OO......O..O.......O..O....OOO..........OO...OO...
O.....O.O....O.O....O.OO................O..........
.OO..O..O....O......O.OO............O....OO........
.OO...OO.......OO...OO.OO..OO......OOOOOO..........
........................O....O....O.O.O.O.......OOO
..............................O...O..O.........O...
..............................O....O..........O....
.............................O.................O.O.

:puffer train The full name for a puffer, coined by Conway before any examples were known. The term was also applied specifically to the classic puffer train found by Bill Gosper and shown below. This is very dirty, and the tail does not stabilize until generation 5533. It consists of a B-heptomino (shown here one generation before the standard form) escorted by two LWSS. (This was the second known puffer. The first is shown under puffer.)


.OOO...........OOO
O..O..........O..O
...O....OOO......O
...O....O..O.....O
..O....O........O.
In April 2006, Jason Summers found a way to make the classic puffer train into a p20 spaceship by adding a glider at the back:

OOO...........OOO.
O..O..........O..O
O......OOO....O...
O.....O..O....O...
.O.O..O...O....O.O
.......OOOO.......
.........O........
..................
..................
..................
.......OOO........
.......O..........
........O.........

:puff suppressor An attachment at the back of a line puffer that suppresses all or some of its puffing action. The example below (by Hartmut Holzwart) has a 3-cell puff suppressor at the back which suppresses the entire puff, making a p2 spaceship. If you delete this puff suppressor then you get a p60 double beehive puffer. Puff suppressors were first recognised by Alan Hensel in April 1994.


............O....................
..........OO.O...................
..........OO...O.................
........O...OO.O.....O...........
........OOOO.OO...OOOO.......O.O.
......O......O....OOO.....O.O..O.
......OOOOOOO...O...O....O..O....
...O.O......OO..O...O.O.OO....O..
..OOOOOOOOO.....O..OO........O...
.OO..............O.OO.OOOO...O..O
OO....OO.O..........O...O..O.O...
.OO....O........OOO......O.O.O..O
.........O......OO......O....OO..
.OO....O........OOO......O.O.O..O
OO....OO.O..........O...O..O.O...
.OO..............O.OO.OOOO...O..O
..OOOOOOOOO.....O..OO........O...
...O.O......OO..O...O.O.OO....O..
......OOOOOOO...O...O....O..O....
......O......O....OOO.....O.O..O.
........OOOO.OO...OOOO.......O.O.
........O...OO.O.....O...........
..........OO...O.................
..........OO.O...................
............O....................

:pull A reaction, most often mediated by gliders, that moves an object closer to the source of the reaction. See block pull, blinker pull, loaf pull; also elbow.

:pulsar (p3) Despite its size, this is the fourth most common oscillator (and by far the most common of period greater than 2) and was found very early on by Conway. See also pre-pulsar, pulsar quadrant, and quasar.


..OOO...OOO..
.............
O....O.O....O
O....O.O....O
O....O.O....O
..OOO...OOO..
.............
..OOO...OOO..
O....O.O....O
O....O.O....O
O....O.O....O
.............
..OOO...OOO..

:pulsar 18-22-20 = two pulsar quadrants

:pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases.)

:Pulsar Pixel Display (p30 circuitry) A large-scale raster line display device constructed by Mark Walsh in August 2010, where pulsars form the individual pixels in an otherwise empty grid. The published sample pattern displays and erases eight 7x5-pixel characters on each of two lines of text.

:pulsar quadrant (p3) This consists of a quarter of the outer part of a pulsar stabilized by a cis fuse with two tails. This is reminiscent of mold and jam. Found by Dave Buckingham in July 1973. See also two pulsar quadrants.


.....O..
...OOO..
..O...OO
O..O..O.
O...O.O.
O....O..
........
..OOO...

:pulse A moving object, such as a spaceship or Herschel, which can be used to transmit information. See pulse divider.

Also another name for a pulsar quadrant.

:pulse divider A mechanism that lets every n-th object that reaches it pass through, and deletes all the rest, where n > 1 and the objects are typically gliders, spaceships or Herschels. A common synonym is period multiplier. For n=2, the simplest known stable pulse dividers are the semi-Snarks.

The following diagram shows a p5 glider pulse divider by Dieter Leithner (February 1998). The first glider moves the centre block and is reflected at 90 degrees. The next glider to come along will not be reflected, but will move the block back to its original position. The relatively small size and low period of this example made it useful for constructing compact glider guns of certain periods, but it became largely obsolete with the discovery of the stable CC semi-Snark, which uses the same basic mechanism. Period 7, 22, 36 and 46 versions of this pulse divider are also known.


.....OO...................
.....OO...................
..........................
..................OO......
.................O..O.....
.................O.O..O..O
O...............OO.O.OOOOO
.OO...........O...OO......
OO...............OO..OOO..
.............O...O.O..O.O.
........OO.......OO..OO.O.
........OO....O...OO...O..
................OO.O.OO...
.................O.O.O....
.................O.O..O...
..................O..OO...
..OO......................
...O......................
OOO.......................
O.........................
..........................
............OO............
............O.............
.............OOO..........
...............O..........

:pulshuttle V (p30) Found by Robert Wainwright, May 1985. Compare Eureka.


.............O..............O.............
............O.O.......O....O.O............
.............O......OO.OO...O.............
......................O...................
..OO......OO..................OO......OO..
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO........OO.OO.....OO......OO..
......................O...................
..........................................
..........................................
..OO......OO..................OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O......OO.OO...O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO..................OO......OO..
..........................................
..........................................
......................O...................
..OO......OO........OO.OO.....OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
..OO......OO..................OO......OO..
......................O...................
.............O......OO.OO...O.............
............O.O.......O....O.O............
.............O..............O.............

:pure glider generator A pattern that evolves into one or more gliders, and nothing else. There was some interest in these early on, but they are no longer considered important. Here's a neat example:


..O............
..O............
OOO............
...............
......OOO......
.......O.......
............OOO
............O..
............O..

:push A reaction that moves an object farther away from the source of the reaction. See sliding block memory, pi calculator, elbow, universal constructor. See also pull, fire.

:pushalong Any tagalong at the front of a spaceship. The following is an example found by David Bell in 1992, attached to the front of a MWSS.


..OOO.O.....
.OOOO.O.....
OO..........
.O.O........
..OOOO.O....
...OOO......
............
............
......OOOOO.
......O....O
......O.....
.......O...O
.........O..

:pyrotechnecium (p8) Found by Dave Buckingham in 1972.


.......O........
.....OOOOO......
....O.....O.....
.O..O.O.OO.O....
O.O.O.O....O..O.
.O..O....O.O.O.O
....O.OO.O.O..O.
.....O.....O....
......OOOOO.....
........O.......

:pyrotechneczum A common mistaken spelling of pyrotechnecium, caused by a copying error in the early 1990s.

:python = long snake


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_s.htm0000644000175000017500000047106613317135606014353 00000000000000 Life Lexicon (S)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:S Usually means big S, but may sometimes mean paperclip.

:sailboat (p16) A boat hassled by a Kok's galaxy, a figure-8 and two eater3s. Found by Robert Wainwright in June 1984.


........O...........O........
.......O.O.........O.O.......
........O...........O........
.............................
......OOOOO.......OOOOO......
.....O....O.......O....O.....
....O..O.............O..O....
.O..O.OO.............OO.O..O.
O.O.O.....O.......O.....O.O.O
.O..O....O.O.....O.O....O..O.
....OO..O..O.....O..O..OO....
.........OO.......OO.........
.............OO..............
.............O.O.............
........O..O..O..............
.......O.....................
.....OO..........OOO.........
..O......OO.O....OOO.........
.....O...O..O....OOO.........
.....OOO.O...O......OOO......
..O...........O.....OOO......
...O...O.OOO........OOO......
....O..O...O.................
....O.OO......O..............
..........OO.................
.........O...................
.....O..O....................

:salvo A collection of spaceships, usually gliders, all travelling in the same direction. Any valid glider construction recipe can be partitioned into no more than four salvos. Compare flotilla. In contrast with a convoy, the spaceships in a salvo are usually consumed by the reactions that they cause. Simple examples include block pusher and block pull.

Salvos may be slow or synchronized. The following partially synchronized three-glider salvo produces an LWSS from a block.


OO........
OO........
..........
..........
OOO.......
O.........
.O........
..........
.......OOO
.......O..
........O.
..........
..........
..........
..........
..........
..........
.......OOO
.......O..
........O.
The above is a synchronized salvo and not a slow salvo, because the second glider must follow the first with the exact separation shown. The third glider can be considered to be a slow glider, because it will still delete the temporary loaf no matter how many ticks it is delayed. The slow glider construction entry includes an example of a true slow salvo.

:sawtooth Any finite pattern whose population grows without bound but does not tend to infinity. (In other words, the population reaches new heights infinitely often, but also infinitely often returns to some fixed value.) Conway's preferred plural is "sawteeth".

The first sawtooth was constructed by Dean Hickerson in April 1991. The current smallest known sawtooth was found by a conwaylife.com forum user with the online handle 'thunk'. It has a bounding box of 74x60, and is the smallest known sawtooth in terms of its minimum repeating population of 177 cells. The following variant has a higher repeating population of 194 and an optimized bounding box of 62x56:


.....................................................OO.O.....
.....................................................O.OO.....
..............................................................
...........OO.................................................
...........OO.................................................
..............................................................
..............................................................
..............OO............................OO.......OO.....OO
....OO........OO.....................................OO.....OO
.....O.....................................O.O................
....O......OO............................O..............OO....
....OO.....OO........................OO.O.OO............OO....
......................................O.OO....................
.......................................O......................
..............................................................
.................................OO...........................
.................................OO...........................
..............................................................
.............................OO.....OO........................
.............................OO.....OO........................
..............................................................
..............................................................
..............................................................
.....................OOO......................................
.....................O..O.....................................
.....................O.OO.....................................
..............................................................
..............................................................
..............................................................
....................OO............O.........O.................
....................O..O..........O.O.....OOO.................
..OOOO...............OOO..........OO.....O....................
OO....OO.................................OO...................
OO.....O......................................................
..OO.O.O..............OO......................................
.......O..............OO......................................
...O...O..........................O....O......................
...O....O.......................OO.....O......................
.....OOO...O.....................OO...O.O.....................
.....OO....O.........................OO.OO....................
...........OO.......................O.....O...................
.............O.........................O......................
.............OOO....................OO...OO...................
..............................................................
..............................................................
................O.....................O.......................
...............O.OOOOO................O.......................
..............OO.....O...............O........................
..............OO...O..O.......................................
......................O.......................................
................OO.O..O................OO.....................
...................O..O................OO.....................
....................OO........................................
....................OO.....O....O.............................
.........................OO.OOOO.OO...........................
...........................O....O.............................
Patterns combining a fast puffer with a slower spaceship have also been constructed (see moving sawtooth). See also tractor beam.

:SBM = sliding block memory

:Schick engine (c/2 orthogonally, p12) This spaceship, found by Paul Schick in 1972, produces a large spark (the 15 live cells at the rear in the phase shown below) which can be perturbed by other c/2 spaceships to form a variety of puffers. See blinker ship for an example perturbation of the spark. The diagram below shows the smallest form of the Schick engine, using two LWSS. It is also possible to use two MWSSes or two HWSSes, or even an LWSS and an HWSS.


OOOO..............
O...O.........O...
O...........OO....
.O..O..OO.....OOO.
......OOO......OOO
.O..O..OO.....OOO.
O...........OO....
O...O.........O...
OOOO..............

:Schick ship = Schick engine

:scorpion (p1)


...O...
.OOO...
O...OO.
O.O.O.O
.OO.O.O
.....O.

:scrubber (p2) Found in 1971.


....O......
..OOO......
.O.........
.O..OOO....
OO.O...O...
...O...O...
...O...O.OO
....OOO..O.
.........O.
......OOO..
......O....

:SE = switch engine

:seal (c/6 diagonally, p6) The first diagonal c/6 spaceship, found by Nicolay Beluchenko in September 2005.


...O..OO..........................
.OOO.O.O.O........................
.O..OOO..OO.......................
O..OOOOOO.O.OOO...................
.O..OOO.O.OOOOO...................
......O.O.O.O.....................
O.O...O.O.OOOOO...................
O..O.O..O.OO...O..................
...O..OO.......OOO................
.O...OOOOO.OOO..OO................
....O.........O...................
..O.O.........O...................
....OO.OOOOO...O..................
......O.OOO..O.....OO.............
......O..O...O.OOO.OO.............
........OO...OOO.O..O...O.........
........OO....OO.OOOO...OOO.......
...................O.O..O.........
.............O.O.....OO..OO.......
.............O..O.....O.OOO.....O.
.............O...O....OO..O...O..O
...............OOO.....OO........O
...............O.O..O..O.....OO..O
.................O..OO.OO.O..O....
................O.......O.O.......
.................O...OOOO.........
..................O...O...........
..................................
.......................O..........
......................O.O.........
.....................OO...........
.....................O.O..........
.....................OO...........
.......................O..........
......................O...........

:search program A computer program or script that automates the search for Life objects having certain desired properties. These are used because the difficulty of finding previously unknown Life objects now commonly exceeds the patience, speed, and accuracy of humans. Various types of search programs are used for finding objects such as spaceships, oscillators, drifters, catalysts, soups, Gardens of Eden, and slow salvos.

Some search programs generate partial results as they are running, so even if they don't complete successfully, something of use might still be salvaged from the run.

Example search programs are dr, lifesrc, gfind, and Bellman.

There are other types of programs which don't perform searches as such, but instead perform large constructions. These are used to correctly complete very complicated objects such as the Caterpillar, Gemini, Caterloopillar, and universal constructor-based spaceships such as the Demonoids and Orthogonoids.

:second glider domain The second glider domain of an edge shooter is the set of spacetime offsets, relative to the glider stream emitted by the edge shooter, where a second independent glider stream may be present without interfering with the edge shooter. This is useful to know, because edge shooters are often used to generate glider streams very close to other glider streams, to make for example a spaceship gun or converter.

:second natural glider The glider produced at T=72 during the evolution of a Herschel. This is the common edge-shooting glider output used in the NW31 converter and several other converter variants.

:seed A constellation of still lifes and/or oscillators, which can be converted into another Life object when it is struck by one or more gliders. Usually the resulting object is a rare still life or spaceship, more complex than the original constellation. Spartan single-glider (1G) seeds are more commonly seen than multi-glider seeds, because a Spartan 1G seed can be readily constructed and triggered using a slow salvo. See also freeze-dried. For example, the following is a 14sL 1G seed for a c/7 loafer spaceship.


...................................O..........
..................................O...........
..................................OOO.........
.............OO...............................
..............O...............................
..............O.O.............................
...............OO.............................
..............................................
...O..........................................
..O.O.........................................
.O.O..........................................
.OO...........................................
..............OO..............................
.............O.O..............................
.............OO...............................
..............................................
..............................................
..............................................
....................OO........................
...................O.O........................
..........O.........O.........................
.........O.O....O.............................
..........OO...O.O............................
..............O.O.............................
..............OO..............................
..............................................
.............................................O
.........................OO................OOO
....................OO...OO...............O...
...................O..O...................OO..
.O.................O..O.......................
O.O.................OO........................
.OO...........................................
..............................................
..............................................
..............................................
.....................OO.......................
.....................O.O....OO................
......................O.....O.O...............
.............................OO...............
.................................OO...........
.................................OO...........
..............................................
..............................................
......................OO......................
.....................O..O.....................
.....................O..O.....................
......................OO......................

:Seeds of Destruction Game An interactive search application written by Paul Chapman in 2013. Its primary purpose was to assist in the design of self-destruct circuits in self-constructing circuitry. It has also regularly been helpful in completing glider syntheses, and was used to find the 31c/240 base reaction for the shield bug and Centipede spaceships.

:self-constructing A type of pattern, generally a macro-spaceship, that contains encoded construction information about itself, and makes a complete copy of itself using those instructions. The Gemini, linear propagator, spiral growth patterns, Demonoids and Orthogonoid are examples of self-constructing patterns. Self-constructing spaceships often have trivially adjustable speeds. In many cases, the direction of travel can also be altered, less easily, by changing the encoded construction recipe. Compare self-supporting, elementary.

:self-supporting A type of pattern, specifically a macro-spaceship, that constructs signals or tracks or other scaffolding to assist its movement, but does not contain complete information about its own structure. Examples include the Caterpillar, Centipede, half-baked knightship, waterbear, and the Caterloopillars. Caterpillar has been used as a general term for self-supporting spaceships, but it is not very appropriate for the HBKs.

In general a self-supporting pattern cannot be trivially adjusted to alter its speed or direction. The variable speeds of the HBKs and the Caterloopillars are exceptions, but their direction of travel is fixed, and a specific Caterloopillar can't be made to change its speed without completely rebuilding it. Compare self-constructing, elementary.

:semi-cenark Either of two semi-Snark variants discovered by Tanner Jacobi in November 2017. The name is due to the initial converter, which produces a century output for every two input gliders. The minimum safe repeat time is 43 ticks for the smaller initial catalyst shown in CC semi-cenark and CP semi-cenark, or 42 ticks with the slightly larger catalyst variant shown below. There is also overclocking possible at period 36, 38, or 39. The reset glider can be followed immediately by a new trigger glider, as shown below, so the minimum repeat time for an intermittent stream of gliders is only 50 ticks.


O.O.................................
.OO.................................
.O..................................
....................................
....................................
....................................
....................................
....................................
....................................
.........O.O........................
..........OO........................
..........O.........................
.............O......................
..............OO....................
.............OO.....................
.............................O......
...........................OOO......
..........................O.........
..........................OO........
....................................
....................................
......................O.............
..............OO.......OO..O........
..............O..O....OO..O.O.......
............OO..OO........OO........
...........O..OO....................
...........OO...OO..................
................O.O.................
.................O..................
..................................OO
................................O..O
.....................OO.........OOO.
......................O......O......
...................OOO.......OOOO...
...................O............O...
...............................O....
...............................OO...

:semi-Snark Any small stable signal conduit that produces one output glider for every two input gliders, with a 90 degree reflection. These can act as period-doublers for any glider stream whose period is at least equal to their repeat time, and so adding one of these to a single glider gun often results in a pattern much smaller than the older technology of crossing the output of two guns.

The available semi-Snarks differ in their complexity, size, repeat time, and the colour of their output gliders. The CC semi-Snark was the first one found, and the term "semi-Snark" is often used specifically for this object. The "CC" prefix stands for colour-changing, by contrast with the more recently discovered colour-preserving CP semi-Snark.

There are also CC and CP variants of a semi-Snark based on a two-glider to century converter discovered by Tanner Jacobi in November 2017. These semi-cenarks are the fastest semi-Snarks known as of July 2018, with a repeat time as low as 50 ticks, or a periodic input rate as low as 36 ticks.

:sesquihat (p1) Halfway between a hat and a twinhat.


....O..
OO.O.O.
.O.O.O.
.O.O.OO
..O....

:SGR Abbreviation for stable glider reflector. This term is no longer in use.

:shield bug (31c/240 orthogonally, p240) The first 31c/240 macro-spaceship, constructed by Dave Greene on September 9, 2014.

:shillelagh (p1)


OO...
O..OO
.OO.O

:ship (p1) The term is also used as a synonym of spaceship.


OO.
O.O
.OO

A ship can be used as a catalyst in some situations. For example, it can suppress two of the blinkers from an evolving traffic light:


...OO.
...O.O
....OO
......
O.....
OO....
O.....
It is also a one-glider seed for the engine of the queen bee shuttle:

OOO..OO.
..O..O.O
.O....OO

:ship in a bottle (p16) Found by Bill Gosper in August 1994. See also bottle.


....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO...OO...OO...
.......O.O........
.......OO.........
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:ship on boat = ship tie boat

:ship on ship = ship-tie

:ship-tie (p1) The name is by analogy with boat-tie.


OO....
O.O...
.OO...
...OO.
...O.O
....OO

:ship tie boat (p1)


OO....
O.O...
.OO...
...OO.
...O.O
....O.

:short keys (p3) Found by Dean Hickerson, August 1989. See also bent keys and odd keys.


.O........O.
O.OOO..OOO.O
.O..O..O..O.
....O..O....

:shotgun A gun that fires a salvo of multiple spaceships, almost always gliders, on parallel lanes. Two to four shotguns are often combined to turn a glider synthesis into a gun or factory for that synthesis.

:shoulder The fixed upper end of a construction arm, generally consisting of one or more glider guns or edge shooters aimed at an elbow object.

:shuttle Any oscillator which consists of an active region moving back and forth between stabilizing objects. The most well-known examples are the queen bee shuttle (which has often been called simply "the shuttle") and the twin bees shuttle. See also p54 shuttle, p130 shuttle and Eureka. Another example is the p72 R-pentomino shuttle that forms part of the pattern given under factory.

:siamese A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects sharing two or more cells. See snake siamese snake and loaf siamese barge for examples.

:side Half a sidewalk. In itself this is unstable and requires an induction coil.


OO...
O.OOO
....O

:sidecar A small tagalong for an HWSS that was found by Hartmut Holzwart in 1992. The resulting spaceship (shown below) has a phase with only 24 cells, making it in this respect the smallest known spaceship other than the standard spaceships and some trivial two-spaceship flotillas derived from them. Note also that an HWSS can support two sidecars at once.


.O......
O.....O.
O.....O.
OOOOO.O.
........
....OO..
..O....O
.O......
.O.....O
.OOOOOO.

:side-shooting gun = slide gun

:sidesnagger A Spartan eater found by Chris Cain in May 2015 with functionality similar to the eater5, as shown below. It has one lane less diagonal clearance on the high-clearance side than other eater5 variants, due to the presence of the boat. A good use of the sidesnagger can be seen in p130 shuttle. See also highway robber.


..O.............
O.O.............
.OO.............
................
................
................
.........O......
........O.......
........OOO.....
................
................
.........O......
........O.O.....
.......O..O...OO
........OO....OO
....O...........
...O.O..........
...OO...........
.........OO.....
.........OO.....

:side-tracking See universal constructor.

:sidewalk (p1)


.OO.OO
..O.O.
.O..O.
.O.O..
OO.OO.

:siesta (p5) Found by Dave Buckingham in 1973. Compare sombreros.


...........OO...
...OO.....O.O...
...O.O....O.....
.....O...OO.O...
...O.OO.....OOO.
.OOO.....O.O...O
O...O.O.....OOO.
.OOO.....OO.O...
...O.OO...O.....
.....O....O.O...
...O.O.....OO...
...OO...........

:signal Movement of information through the Life universe. Signals can be carried by spaceships, fuses, drifters, or conduits. Spaceships can only transfer a signal at the speed of the spaceship, while fuses can transfer a signal at speeds up to the speed of light.

In practice, many signals are encoded as the presence or absence of a glider or other spaceship at a particular point at a particular time. Such signals can be combined by the collision of gliders to form logic operations such as AND, OR, and NOT gates. Signals can be duplicated using glider duplicators or other fanout devices, and can be used up by causing perturbations on other parts of the Life object.

Signals are used in Herschel conduit circuitry, universal constructors, macro-spaceships, and other computational patterns such as the pi calculator and Osqrtlogt patterns.

:signal elbow A conduit with signal output 90 degrees from its input. This term is commonly used only for signal wires, particularly 2c/3 signals. A Snark could reasonably be called a "glider elbow", but glider reflector is the standard term. A signal elbow with a recovery time less than 20 ticks would enable a trivial proof that Conway's Life is omniperiodic.

A near miss is the following elbow-like converter found by Dean Hickerson. It successfully turns a 2c/3 signal by 90 degrees, but unfortunately changes it to a double-length signal in the process. This means that further copies of the converter can not be appended (e.g., to make a closed loop).


........................O..O......
........................OOOOOO....
..............................O.OO
......................OOOOO.O.O.OO
.....................O......O.O...
.....................OOOOO..O.O...
..................O.......O.OO....
..................OOOOOO..O.......
........................O.O.......
................OOOOOO..O.OO......
..........OO...O......O.O.........
.........O..O..OOOOO..O.O.........
........O.OOO.......O.OO..........
....OO.O.O...OOOOO..O.............
.....O.O...O......O.O.............
.....O.O..OOOOOO..O.OO............
...O.O.O.O......O.O...............
..O.OO..O.OOOO..O.O...............
..O...O.O.O...O.OO................
OO.OO.O.O...O.O...................
.O.O..O.OOOO.O.OOO................
O..O.O.......O...O................
.OOO..OOOOOOOO....................
....O.O...........................
...OO.O..OOOOOOO..................
..O..OO.O.......O.................
..OO....O..OOOOOO.................
........O.O.......................
.......OO.O..OOOOOO...............
..........O.O......O..............
..........O.O..OOOOO..............
...........OO.O.......O...........
..............O..OOOOOO...........
..............O.O.................
.............OO.O..OOOOOO.........
................O.O......O.OO.....
................O.O..OOOOO.OO.....
.................OO.O.............
....................O..OOOOOO.....
....................O.O.....O.....
...................OO.O..OOO......
......................O.O.....OO..
......................O..O....OO..
.......................OO.........

Relatively small composite MWSS elbows can now be constructed, using Tanner Jacobi's 2015 discovery of a small H-to-MWSS component. For example, the Orthogonoid includes a constructor/reflector that reflects an MWSS stream by 180 degrees, but it can be trivially reconfigured to make a 90-degree MWSS elbow.

:Silver G-to-H A variant of the Silver reflector made by substituting an Fx119 conduit for the final NW31, allowing a Herschel output as well as the beehive-annihilating reset glider. It is still Spartan, and as long as the Fx119 is followed by a dependent conduit, it retains the faster 497-tick recovery time.

:Silver reflector A stable glider reflector found by Stephen Silver in November 1998, by substituting an NW31 converter for the second Fx77 conduit in the Callahan G-to-H found a few days previous. The repeat time is 497 ticks:


........O.............O.......................................
......O.O...........OOO.......................................
.......OO..........O..........................................
...................OO.........................................
....OO........................................................
.....O........................................................
.....O.O......................................................
......OO..........O...........................................
.................O.O..........................................
.................O.O..........................................
..................O....OO.....................................
......OO...............O.O....................................
.....O.O.................O....................................
.....O...................OO...................................
....OO........................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...............OO.............................................
...............OO.............................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...OO.........................................................
....O.........................................................
....O.O.......................................................
.....OO.......................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
......OO...............OO.....................................
......OO...............O.O....................................
.........................O....................................
.........................OO...................................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................................
...................O..........................................
.................OOO..........................................
................O.............................................
................OO...................OO.......................
....................OO................O.......................
.....................O................O.O.....................
...................O...................OO.....................
...................OO.........................................
..............................................................
..............................................................
............................................................OO
............................................................OO
..............................................................
......................OO......................................
...OO.................OO......................................
...OO.........................................................
..............................................................
..............................................................
..OO..........................................................
...O..........................................................
OOO............OO.............................................
O..............O..............................................
................OOO...........................................
..................O...........................................
..............................................................
..................................................OO..........
..................................................OO..........

:Silver's p5 (p5) The following oscillator found by Stephen Silver in February 2000:


OO.........
O..........
.O..O......
...OO......
...O...O.OO
..O....OO.O
..OO.......

As this has no spark, it appears useless. Nonetheless, in March 2000, David Eppstein found a way to use it to reduce the size of Noam Elkies' p5 reflector.

:Simkin glider gun (p120) A Herschel-based glider gun discovered by Michael Simkin in April 2015. It consists of a Herschel running through two B60 conduits. In terms of its 36-cell minimum population, it is one of the smallest known guns, sharing the record with the Gosper glider gun. In the double-barreled form, as well as the pseudo-period, snake-stabilized form shown below, it is the absolute record holder.


OO.....OO........................
OO.....OO........................
.................................
....OO...........................
....OO...........................
.................................
.................................
.................................
.................................
......................OO.OO......
.....................O.....O.....
.....................O......O..OO
.....................OOO...O...OO
..........................O......
.................................
.................................
.................................
.................................
........................O.OO.....
........................OO.O.....

:single-arm A type of universal constructor using just one construction arm and slow salvo techniques to construct, usually, Spartan or near-Spartan circuitry. Compare two-arm.

:single-channel A type of universal constructor discovered and developed by Simon Ekström and others starting in December 2015. The initial elbow operation toolkit was near-minimal, with just one push, one pull, and one output glider of each colour (see colour of a glider). Later searches produced a much larger and more efficient library.

Single-channel recipes consist of a stream of gliders on a single lane and aimed at a construction elbow, usually separated from each other by at least 90 ticks. In spite of these strict limitations, single-channel recipes can be made to do surprising things. For example, it is possible to build a Snark directly on the construction lane of an active construction arm, starting from a single elbow block. This can allow the arm to reach efficiently around complex obstructions by bending itself through multiple lossless elbows. Known recipes can also remove an elbow when it is no longer needed, by controlled demolition of the Snark.

As of June 2018, almost all single-channel recipes are made up of singletons and synchronized pairs of gliders, but no synchronized triplets or larger groups. This is not an inherent limitation of single-channel construction, but rather a limitation in the search program used to find currently known single-channel toolkits.

A useful byproduct of this limitation is that single-channel recipes can be trivially adjusted to allow them to safely cross perpendicular data streams, including other single-channel recipes (or earlier parts of the same recipe). To avoid collisions with a crossing stream, each singleton glider or glider pair can safely be delayed by any even number of ticks, or technically by any multiple of the period of the current intermediate target. The final result of the construction will not be affected.

:single-channel Demonoid See Demonoid.

:single-lane = single-channel.

:singleton In single-channel recipes, a glider that is not synchronized with a neighboring glider in its stream. Compare glider pair.

:singular flip flop (p2) Found by Robert Wainwright, July 1972.


..O...
..O.O.
O....O
OOOOOO
......
..OO..
..OO..

:sinking ship = canoe

:Sir Robin ((2,1)c/6, p6) The first elementary knightship in Conway's Game of Life, found by Adam P. Goucher on March 6, 2018, based on a partial by Tomas Rokicki.


....OO.........................
....O..O.......................
....O...O......................
......OOO......................
..OO......OOOO.................
..O.OO....OOOO.................
.O....O......OOO...............
..OOOO....OO...O...............
O.........OO...................
.O...O.........................
......OOO..OO..O...............
..OO.......O....O..............
.............O.OO..............
..........OO......O............
...........OO.OOO.O............
..........OO...O..O............
..........O.O..OO..............
..........O..O.O.O.............
..........OOO......O...........
...........O.O.O...O...........
..............OO.O.O...........
...........O......OOO..........
...............................
...........O.........O.........
...........O...O......O........
............O.....OOOOO........
............OOO................
................OO.............
.............OOO..O............
...........O.OOO.O.............
..........O...O..O.............
...........O....OO.OOO.........
.............OOOO.O....OO......
.............O.OOOO....OO......
...................O...........
....................O..OO......
....................OO.........
.....................OOOOO.....
.........................OO....
...................OOO......O..
....................O.O...O.O..
...................O...O...O...
...................O...OO......
..................O......O.OOO.
...................OO...O...OO.
....................OOOO..O..O.
......................OO...O...
.....................O.........
.....................OO.O......
....................O..........
...................OOOOO.......
...................O....O......
..................OOO.OOO......
..................O.OOOOO......
..................O............
....................O..........
................O....OOOO......
....................OOOO.OO....
.................OOO....O......
........................O.O....
............................O..
........................O..OO..
.........................OOO...
......................OO.......
.....................OOO.....O.
........................OO..O.O
.....................O..OOO.O.O
......................OO.O..O..
........................O.O..OO
..........................OO...
......................OOO....O.
......................OOO....O.
.......................OO...OOO
........................OO.OO..
.........................OO....
.........................O.....
...............................
........................OO.....
..........................O....

:six Ls (p3) This is a compact form of loading dock.


...O...
.OOO..O
O...OOO
OOO....
....OOO
OOO...O
O..OOO.
...O...

:sixty-nine (p4) Found by Robert Wainwright, October 1978.


.........O...........
........O.O..........
.....................
......O...OO.........
.....O.....O.........
......O.O............
........OO......O....
................O....
..O.....OO....OOO....
..O...........OO.....
OOO.......OO..OO..OOO
OO......O.OO....OOO..
OO..OOO.O.O.....OOO..
..OOO................
..OOO......O.........
..........O.O........
.....................
........O...OO.......
.......O.....O.......
........O.O..........
..........OO.........

:skewed quad (p2)


.OO....
.O...OO
..O.O.O
.......
O.O.O..
OO...O.
....OO.

:skewed traffic light (p3) Found by Robert Wainwright, August 1989.


.............OO.........
............O..O........
.............O.O........
.........OO...O.........
..........O.OO..........
............O...........
............O...........
........................
OO........OOO......O....
OOOO.O........O...OO....
O.O..OOO.O....O.........
.........O....O.OOO..O.O
....OO...O........O.OOOO
....O......OOO........OO
........................
...........O............
...........O............
..........OO.O..........
.........O...OO.........
........O.O.............
........O..O............
.........OO.............

:sL Abbreviation for still life, used most often in rough measurements of the complexity of a Spartan constellation.

:slide gun A gun which fires sideways from an extending arm. The arm consists of streams of spaceships which are pushing a pattern away from the body of the gun and releasing an output spaceship every time they do so. Each output spaceship therefore travels along a different path.

Dieter Leithner constructed the first slide gun in July 1994 (although he used the term "side shooting gun"). The following pattern shows the key reaction of this slide gun. The three gliders shown will push the block one cell diagonally, thereby extending the length of the arm by one cell, and at the same time they release an output glider sideways. (In 1999, Jason Summers constructed slide guns using other reactions.)


..............OO.
..............OO.
........OOO......
..........O......
.........O.....OO
..............O.O
................O
.................
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...............
.OO..............
O.O..............

:sliding block memory A memory register whose value is stored as the position of a block. The block can be moved by means of glider collisions. See block pusher for an example.

In Conway's original formulation (as part of his proof of the existence of a universal computer in Life) two gliders were used to pull the block inwards by three diagonal spaces, as shown below, and thirty gliders were used to push it out by the same amount.


OO..........
OO..........
............
............
............
.........OOO
OOO......O..
O.........O.
.O..........

Dean Hickerson later greatly improved on this, finding a way to pull a block inwards by one diagonal space using 2 gliders, and push it out the same distance using 3 gliders. In order for the memory to be of any use there also has to be a way to read the value held. It suffices to be able to check whether the value is zero (as Conway did), or to be able to detect the transition from one to zero (as Hickerson did).

Dean Hickerson's sliding block memory is used in Paul Chapman's URM, and the key salvos from it are used in several other complex constructions, such as David Bell's Collatz 5N+1 simulator and Adam P. Goucher's pi calculator and Spartan universal computer-constructor.

:slmake A search program published by Adam P. Goucher in May 2017. It accepts as input a constellation of sufficiently widely separated still lifes, and produces a glider stream that will perform a complete slow glider construction of that constellation, starting from a single block.

One of slmake's primary uses is to make self-constructing patterns much easier to design and build. It is capable of finding recipes not only for Spartan stable circuitry, but also for other useful non-Spartan circuits such as Snarks, syringes, and H-to-MWSS converters, provided that they are separated from other nearby objects by a sufficient amount of empty space.

:slow See slow glider construction.

:slow elbow A movable construction elbow that is controlled by a slow salvo, which most likely comes from a previous elbow in a multi-elbow construction arm. Unlike a standard elbow which is generally fixed on a single construction lane or at least within a narrow range, a slow elbow can move freely in two dimensions as long as there is room for it. Each slow elbow added to a construction arm results in an exponential increase in the cost (in gliders) of the final construction. Compare lossless elbow.

:slow glider construction Construction an object by a "slow salvo" of gliders all coming from the same direction, in such a way that timing of the gliders does not matter as long as they are not too close behind one another. This type of construction requires an initial seed object, such as a block, which is modified by each glider in turn until the desired object is produced.

In May 1997, Nick Gotts produced a slow glider construction of a block-laying switch engine from a block, using a slow salvo of 53 gliders. Constructions like this are important in the study of sparse Life, as they will occur naturally as gliders created in the first few generations collide with blonks and other debris.

Slow glider constructions are also useful in some designs for universal constructors. However, in this case the above definition is usually too restrictive, and it is desirable to allow constructions in which some gliders in the salvo are required to have a particular timing modulo 2 (a "p2 slow salvo"). This gives much greater flexibility, as blinkers can now be freely used in the intermediate construction steps. The Snarkmaker is a very large p2 slow salvo. A much smaller example is the following edgy construction of an eater1 starting from a block.


OO..OOO...............................................
OO..O.................................................
.....O................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
................OOO...................................
................O.....................................
.................O....................................
......................................................
......................................................
......................................................
......................................................
.......................OOO............................
.......................O..............................
........................O.............................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
......................................................
..............................O.......................
........................O....OO.......................
.......................OO....O.O......................
.......................O.O............................
......................................................
......................................................
..........................O...........................
.........................OO...........................
.........................O.O..........................
......................................................
.............................OOO....................OO
.............................O.....................OO.
..............................O......................O

Adam P. Goucher's slmake search program, made available in May 2017, makes it much easier to find a slow glider construction for a wide variety of stable circuitry.

:slow salvo See slow glider construction.

:small fish = LWSS

:small lake (p1) A 20-cell still life, but technically not actually a lake because it is not constructed entirely out of dominoes.


....O....
...O.O...
...O.O...
.OO...OO.
O.......O
.OO...OO.
...O.O...
...O.O...
....O....

:smiley (p8) Found by Achim Flammenkamp in July 1994 and named by Alan Hensel.


OO.O.OO
...O...
O.....O
.OOOOO.
.......
.......
OOO.OOO

:SMM breeder See breeder.

:smoke Debris that is fairly long-lived but eventually dies completely. Basically, a large spark. This term is used especially when talking about the output from a smoking ship. Some Herschel conduits such as Fx119 also create large amounts of smoke.

:smoking ship A spaceship which produces smoke. If the smoke extends past the edge of the rest of the spaceship, then it can be used to perturb other objects as the spaceship passes by. Running gliders into the smoke is often a good way to turn or duplicate them, or convert them into other objects. Sometimes the smoke from a smoking ship may itself be perturbed by accompanying spaceships in order to form a puffer. A simple example of a smoking ship is the Schick engine.

:snacker (p9) Found by Mark Niemiec in 1972. This is a pentadecathlon with stabilizers which force it into a lower period.


OO................OO
.O................O.
.O.O............O.O.
..OO............OO..
.......O....O.......
.....OO.OOOO.OO.....
.......O....O.......
..OO............OO..
.O.O............O.O.
.O................O.
OO................OO
The stabilizers make the domino spark largely inaccessible, but the snacker is extensible, as shown in the next diagram, and so a more accessible p9 domino spark can be obtained. In April 1998 Dean Hickerson found an alternative stabilizer that is less obtrusive than the original one, and this is also shown in this diagram.

OO................................
.O................................
.O.O.........................OO...
..OO.......................O..O...
.......O....O..............OOO....
.....OO.OOOO.OO...O....O......OOO.
.......O....O...OO.OOOO.OO...O...O
..OO..............O....O......OOO.
.O.O.......................OOO....
.O.........................O..O...
OO...........................OO...
An end can also be stabilized by killer candlefrobras.

:snail (c/5 orthogonally, p5) The first known c/5 spaceship, discovered by Tim Coe in January 1996. For some time it was the slowest known orthogonal spaceship.


.O....................................
.O....................................
O.....................................
.OOO.................OOO...OOO........
.OO.O.........O...O.O......OOO........
..O...........OO.O.......O....OOOO....
......O......O...O.O...OO.O.....OO....
...O..O.OOO...OO.........O........OO.O
...OO.O.....O.....O.................O.
.........O.OOOOOOO....................
......................................
.........O.OOOOOOO....................
...OO.O.....O.....O.................O.
...O..O.OOO...OO.........O........OO.O
......O......O...O.O...OO.O.....OO....
..O...........OO.O.......O....OOOO....
.OO.O.........O...O.O......OOO........
.OOO.................OOO...OOO........
O.....................................
.O....................................
.O....................................

:snake (p1)


OO.O
O.OO

:snake bit An alternative name for a boat-bit. Not a very sensible name, because various other things can be used instead of a snake. A snake, or alternatively an aircraft carrier, is the smallest object that can consume a glider stream by effectively acting as an eater for every two incoming gliders. The one-cell reduction from the smallest real eater, the seven-cell eater1, has been important when trying to construct recent sawtooths where the population must be minimized.

:snake bridge snake (p1)


....OO
....O.
.....O
....OO
OO.O..
O.OO..

:snake dance (p3) Found by Robert Wainwright, May 1972.


...OO.O..
...O.OO..
OO.O.....
.O..O.OOO
O..O.O..O
OOO.O..O.
.....O.OO
..OO.O...
..O.OO...

:snake pit This term has been used for two different oscillators: the p2 snake pit (essentially the same as fore and back)


O.OO.OO
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
OO.OO.O
and the p3 snake pit.

.....OO....
....O..O...
....O.OO...
.OO.O......
O.O.O.OOOO.
O.........O
.OOOO.O.O.O
......O.OO.
...OO.O....
...O..O....
....OO.....

:snake siamese snake (p1)


OO.OO.O
O.OO.OO

:Snark A small stable 90-degree glider reflector with a repeat time of 43 ticks, discovered by Mike Playle on 25 April 2013 using a search utility he wrote called Bellman. Compare boojum reflector. Four common Snark variants are shown below: Playle's original at the top, and variants by Heinrich Koenig, Simon Ekström, and Shannon Omick to the left, bottom, and right, respectively. As of June 2018, only Playle's variant has a known slow glider construction recipe for all orientations.


.............................OO....................
............................O.O....................
......................OO....O......................
....................O..O..OO.OOOO..................
....................OO.O.O.O.O..O..................
.......................O.O.O.O.....................
.......................O.O.OO......................
........................O..........................
...................................................
.....................................OO............
............................OO.......O.............
............................OO.....O.O.............
.........O.........................OO..............
.........OOO.......................................
............O........O.............................
...........OO.......O..............................
....................OOO............................
...................................................
...OO..............................................
...O.....................OO........................
OO.O......................O........................
O..OOO....OO...........OOO.........................
.OO...O...OO...........O......................O....
...OOOO.....................OO..............OOOOO..
...O...............OO........O.............O.....O.
....OOO............O.O.......O.O............OOO..O.
.......O.............O........OO...............O.OO
..OOOOO..............OO.....................OOOO..O
.O..O......................O...........OO...O...OO.
.OO......................OOO...........OO....OOO...
........................O......................O...
........................OO.....................O.OO
..............................................OO.OO
...................................................
...................................................
......................................OO...........
......................................O............
.......................................OOO.........
..............OO.........................O.........
.............O.O.....OO............................
.............O.......OO............................
............OO.....................................
...................................................
..........................O........................
................OO....OO.O.O.......................
...............O..O..O.O.O.O.......................
................OO...O.O.O.OO......................
..................OOOO.OO..O.......................
..................O...O....O.......................
...................O..O.OOO........................
....................O.O.O..........................
.....................O.............................

:Snarkmaker A single-channel stream of gliders that, when aimed to collide with an elbow block in a specific location, will perform a slow glider construction of a Snark, directly on the same lane as the incoming gliders. This allows a construction arm to add one or more lossless elbows, so that it can bend around multiple corners without an exponential increase in construction cost.

The Snarkmaker recipe used in the first single-channel Demonoid, Orthogonoid, and spiral growth patterns contains 2,254 gliders. This could be considerably reduced with a customized search program.

:SNG = second natural glider.

:SODGame = Seeds of Destruction Game

:sombrero One half of sombreros or siesta.

:sombreros (p6) Found by Dave Buckingham in 1972. If the two halves are moved three spaces closer to one another then the period drops to 4, and the result is just a less compact form of Achim's p4. Compare also siesta.


...OO........OO...
...O.O......O.O...
.....O......O.....
...O.OO....OO.O...
.OOO..........OOO.
O...O.O....O.O...O
.OOO..........OOO.
...O.OO....OO.O...
.....O......O.....
...O.O......O.O...
...OO........OO...

:soup A random initial pattern, either contained within a small area, or alternatively filling the whole Life universe.

Finite soups probably have behaviors very different than infinite soups, but this is obviously unknown. Infinite soups may remain chaotic indefinitely since any reaction, no matter how rare, is bound to happen somewhere.

Soups can have an average density, with results varying based on that. See sparse Life for a discussion of what can happen at a low density.

Finite soups for sizes such as 16x16 (asymmetric) have been examined by the billions by scripts such as apgsearch to find interesting results. Many new oscillators and synthesis recipes have been discovered, as well as previously known rare patterns such as stabilized switch engines. In addition, soups are used to generate statistical census data, and to decide whether specific objects can be considered natural.

Soups can be fully random, or they can be forced to be symmetric. The results for these two types of soups can differ since symmetric soups tend to create large symmetrical objects at a much higher rate. Shown below is an unusual mirror-symmetric soup that produces a pufferfish and nothing else.


OOOO..OO.OOO.O...O.OOO.OO..OOOO
.O.O.OO.O.............O.OO.O.O.
..OOO..O.O.O.......O.O.O..OOO..
O.OO.OOO.O..O.....O..O.OOO.OO.O
.OOOO.O...OO.OOOOO.OO...O.OOOO.
.....OO...OO.O.O.O.OO...OO.....
..OOO...OO...O...O...OO...OOO..
O..O..O.OO...OO.OO...OO.O..O..O
OO.O..O...O.........O...O..O.OO
O.O.O...OOOO..OOO..OOOO...O.O.O
O.OOO.OO..OO...O...OO..OO.OOO.O
..O.....OO...O...O...OO.....O..
OOOOO.O.OOO..O...O..OOO.O.OOOOO
.O....O....O..OOO..O....O....O.
.OO.O...OOOOOOOOOOOOOOO...O.OO.
OOOO.OOO......O.O......OOO.OOOO

:space dust A part of a spaceship or oscillator which looks like a random mix of ON and OFF cells. It is usually very difficult to find a glider synthesis for an object that consists wholly or partly of space dust. As examples, the 295P5H1V1, fly, and seal spaceships contain large amounts of space dust.

:spacefiller Any pattern that grows at a quadratic rate by filling space with an agar. The first example was found in September 1993 by Hartmut Holzwart, following a suggestion by Alan Hensel. The diagram below shows a smaller spacefiller found by Tim Coe. See also Max. Spacefillers can be considered as breeders (more precisely, MMS breeders), but they are very different from ordinary breeders. The word "spacefiller" was suggested by Harold McIntosh and soon became the accepted term.


..................O........
.................OOO.......
............OOO....OO......
...........O..OOO..O.OO....
..........O...O.O..O.O.....
..........O....O.O.O.O.OO..
............O....O.O...OO..
OOOO.....O.O....O...O.OOO..
O...OO.O.OOO.OO.........OO.
O.....OO.....O.............
.O..OO.O..O..O.OO..........
.......O.O.O.O.O.O.....OOOO
.O..OO.O..O..O..OO.O.OO...O
O.....OO...O.O.O...OO.....O
O...OO.O.OO..O..O..O.OO..O.
OOOO.....O.O.O.O.O.O.......
..........OO.O..O..O.OO..O.
.............O.....OO.....O
.OO.........OO.OOO.O.OO...O
..OOO.O...O....O.O.....OOOO
..OO...O.O....O............
..OO.O.O.O.O....O..........
.....O.O..O.O...O..........
....OO.O..OOO..O...........
......OO....OOO............
.......OOO.................
........O..................

:space nonfiller Any pattern that expands indefinitely to affect every cell in the Life plane, but leaves an expanding region of vacuum at its center. Compare spacefiller; see also antstretcher. The first nonfiller was discovered by Jason Summers on 14 April 1999:


...................OOO...............
..................O..O...............
............OOO......O....OOO........
............O..O.O...O....O..O.......
............O..O.O...O....O..O.......
..........O..........O..O.O.OOO......
..........OO..OO..O.O....O.....O.....
........O................OO..OOO.....
........OOO.O.OO..........O......O...
......O........O.........O.O...OOO...
......OOO.....O..........O........O..
...O.O.........................O.OOO.
..OOOOO.O..........................O.
.OO......O.....................OOOOO.
OO....OO..................O.O........
.O.O...O..O...............O..O...O.O.
........O.O..................OO....OO
.OOOOO.....................O......OO.
.O..........................O.OOOOO..
.OOO.O.........................O.O...
..O........O..........O.....OOO......
...OOO...O.O.........O........O......
...O......O..........OO.O.OOO........
.....OOO..OO................O........
.....O.....O....O.O..OO..OO..........
......OOO.O.O..O..........O..........
.......O..O....O...O.O..O............
.......O..O....O...O.O..O............
........OOO....O......OOO............
...............O..O..................
...............OOO...................

:space rake The following p20 forwards glider rake, which was the first known rake. It consists of an ecologist with a LWSS added to turn the dying debris into gliders.


...........OO.....OOOO
.........OO.OO...O...O
.........OOOO........O
..........OO.....O..O.
......................
........O.............
.......OO........OO...
......O.........O..O..
.......OOOOO....O..O..
........OOOO...OO.OO..
...........O....OO....
......................
......................
......................
..................OOOO
O..O.............O...O
....O................O
O...O............O..O.
.OOOO.................

:spaceship Any finite pattern that reappears (without additions or losses) after a number of generations and displaced by a non-zero amount. By far the most natural spaceships are the glider, LWSS, MWSS and HWSS, followed by the Coe ship which has also evolved multiple times from random asymmetric soup starting conditions. See also the entries on individual spaceship speeds: c/2 spaceship, c/3 spaceship, c/4 spaceship, c/5 spaceship, c/6 spaceship, c/7 spaceship, c/10 spaceship, c/12 spaceship, 2c/5 spaceship, 2c/7 spaceship, 3c/7 spaceship, (2,1)c/6 spaceship, and 17c/45 spaceship.

It is known that there exist spaceships travelling in all rational directions and at arbitrarily slow speeds (see universal constructor). Before 1989, however, the only known examples travelled at c/4 diagonally (gliders) or c/2 orthogonally (everything else).

In 1989 Dean Hickerson started to use automated searches to look for new elementary spaceships, and had considerable success. Other people have continued these searches using tools such as lifesrc and gfind, and as a result we now have a great variety of elementary spaceships travelling at sixteen different velocities. The following table details the discovery of elementary spaceships with new velocities as of July 2018.

  -----------------------------------------------------------------
  Speed    Direction  First Discovery   Discoverer             Date
  -----------------------------------------------------------------
  c/4      diagonal   glider            Richard Guy            1970
  c/2      orthogonal LWSS              John Conway            1970
  c/3      orthogonal 25P3H1V0.1        Dean Hickerson     Aug 1989
  c/4      orthogonal 119P4H1V0         Dean Hickerson     Dec 1989
  c/12     diagonal   Cordership        Dean Hickerson     Apr 1991
  2c/5     orthogonal 44P5H2V0          Dean Hickerson     Jul 1991
  c/5      orthogonal snail             Tim Coe            Jan 1996
  2c/7     orthogonal weekender         David Eppstein     Jan 2000
  c/6      orthogonal dragon            Paul Tooke         Apr 2000
  c/5      diagonal   295P5H1V1         Jason Summers      Nov 2000
  c/6      diagonal   seal              Nicolay Beluchenko Sep 2005
  c/7      diagonal   lobster           Matthias Merzenich Aug 2011
  c/7      orthogonal loafer            Josh Ball          Feb 2013
  c/10     orthogonal copperhead        zdr                Mar 2016
  3c/7     orthogonal spaghetti monster Tim Coe            Jun 2016
  (2,1)c/7 oblique    Sir Robin         Adam P. Goucher    Mar 2018
  -----------------------------------------------------------------

Several infinite families of adjustable-velocity macro-spaceships have also been constructed, of which the first was Gabriel Nivasch's Caterpillar from December 2004. The macro-spaceship with the widest range of possible speeds is Michael Simkin's Caterloopillar from April 2016; in theory it supports any rational orthogonal speed strictly less than c<4. A somewhat similar design supporting any rational speed strictly less than c/2 has been shown to be feasible, but as of July 2018 no explicit examples have been constructed.

A period p spaceship that displaces itself (m,n) during its period, where m>=n, is said to be of type (m,n)/p. It was proved by Conway in 1970 that p>=2m+2n. (This follows immediately from the easily-proved fact that a pattern cannot advance diagonally at a rate greater than one half diagonal step every other generation.)

:Spaceships in Conway's Life A series of articles posted by David Bell to the newsgroup comp.theory.cell-automata during the period August-October 1992 that described many of the new spaceships found by himself, Dean Hickerson and Hartmut Holzwart. Bell produced an addendum covering more recent developments in 1996.

:spaghetti monster The first 3c/7 spaceship, found by Tim Coe in June 2016. The spaceship travels orthogonally, has a minimum of 702 live cells and fits in a 27x137 bounding box.

:spark A pattern that dies. The term is typically used to describe a collection of cells periodically thrown off by an oscillator or spaceship, but other dying patterns, particularly those consisting or only one or two cells (such as produced by certain glider collisions, for example), are also described as sparks. For examples of small sparks see unix and HWSS. Examples of much larger sparks are seen in Schick engine and twin bees shuttle spark.

:spark coil (p2) Found in 1971.


OO....OO
O.O..O.O
..O..O..
O.O..O.O
OO....OO

:sparker An oscillator or spaceship that produces sparks. These can be used to perturb other patterns without being themselves affected.

:sparking eater One of two eaters found in April 1997 and November 1998 by Dean Hickerson using his dr search program, shown below to the left and right respectively. These both absorb gliders as a standard eater does, but also produce separated single-bit sparks at the upper right, which can be used to delete antiparallel gliders with different phases as shown.


..O.........OO........O..........OO.
O.O........OO.......O.O..........O.O
.OO..........O.......OO..........O..
....OO..OO...............OO..OO.....
.O...O..OO............O...O..OO.....
.OOOO.............OO..OOOO..........
..................O.................
.OO................OOOOO............
.OO.....................O...........
.....................OOO............
.....................O..............
The above mechanisms can be used to build intermitting glider guns. The left-hand eater produces a spark nine ticks after a glider impact, with the result that the period of the constituent guns can't be a multiple of 4. The right-hand eater produces the same spark ten ticks after impact, which allows p4N guns to be used.

The separation of the spark also allows this reaction to perform other perturbations "around the corner" of some objects. For example, it was used by Jason Summers in 2004 to cap the ends of a row of ten AK47 reactions to form a much smaller period 94 glider gun than the original one. (This is now made obsolete by the AK94 gun.)

:sparky A certain c/4 tagalong, shown here attached to the back of a spaceship.


..........O....................
..........O...............OO...
......OO.O.OOO..........OO...O.
O.OO.OO.OO..O.O...OO.OOOO......
O...OO..O.OO..OOO..O.OO..OO...O
O.OO....OOO.O.OOO......OO..O...
........OO.O...............O..O
O.OO....OOO.O.OOO......OO..O...
O...OO..O.OO..OOO..O.OO..OO...O
O.OO.OO.OO..O.O...OO.OOOO......
......OO.O.OOO..........OO...O.
..........O...............OO...
..........O....................

:sparse Life This refers to the study of the evolution of a Life universe which starts off as a random soup of extremely low density. Such a universe is dominated at an early stage by blocks and blinkers (often referred to collectively as blonks) in a ratio of about 2:1. Much later it will be dominated by simple infinite growth patterns (presumably mostly switch engines). The long-term fate of a sparse Life universe is less certain. It may possibly become dominated by self-reproducing patterns (see universal constructor), but it is not at all clear that there is any mechanism for these to deal with all the junk produced by switch engines.

:Spartan A pattern composed of subunits that can be easily constructed in any orientation, usually with a slow salvo. Generally this means that the pattern is a constellation of Spartan still lifes: block, tub, boat, hive, ship, loaf, eater1, or pond. Other small objects may sometimes be counted as Spartan, including period-2 oscillators - mainly blinkers, but also beacons or toads, which may occur as intermediate targets in slow salvo recipes. Most self-constructing patterns are Spartan or mostly Spartan, to simplify the process of self-construction.

:speed booster Any mechanism which allows a signal (indicated by the presence or absence of a spaceship) to move faster than the spaceship could travel through empty space. The original speed booster is based on p30 technology, and is shown below:


....................O........................
.....................O.......................
...................OOO.......................
.............................................
...........................O.O...............
.........................O...O...............
.................O.......O...................
................OOOO....O....O........OO.....
...............OO.O.O....O............OO.....
....OO........OOO.O..O...O...O...............
....OO.........OO.O.O......O.O...............
................OOOO.........................
.................O...........................
..........................OOO................
..........................O.O...OO...........
.........................OO.....O..O.........
..................O.O.....O.........O......OO
................O...O..OO...........O......OO
.........OO.....O..........O........O........
.O.......OO....O....O.......OO..O..O.........
..O.............O.......O.O..O..OO...........
OOO.............O...O.....OOO................
..................O.O........................
Here the top glider is boosted by passing through two inline inverters, emerging 5 cells further along than the unboosted glider at the left.

The fastest speed boosters are the telegraph and p1 telegraph, which can transfer a orthogonal signal at the speed of light, although their bit rate is rather slow.

Diagonal speed boosters have also been built using 2c/3 wires or other stable components. See stable pseudo-Heisenburp.

The star gate seems like it can transfer a signal faster than the speed of light. The illusion is explained in Fast Forward Force Field.

:speed of light The greatest speed at which any effect can propagate; in Life, a speed of one cell per generation. Usually denoted c.

:S-pentomino Conway's name for the following pentomino, which rapidly dies.


..OO
OOO.

:spider (c/5 orthogonally, p5) This is the smallest known c/5 spaceship, and was found by David Bell in April 1997. Its side sparks have proved very useful in constructing c/5 puffers, including rakes. See also PPS.


......O...OOO.....OOO...O......
...OO.OOOOO.OO...OO.OOOOO.OO...
.O.OO.O.....O.O.O.O.....O.OO.O.
O...O.O...OOOOO.OOOOO...O.O...O
....OOO.....OO...OO.....OOO....
.O..O.OOO.............OOO.O..O.
...O.......................O...

:spiral (p1) Found by Robert Wainwright in 1971.


OO....O
.O..OOO
.O.O...
..O.O..
...O.O.
OOO..O.
O....OO

:spiral growth A self-constructing pattern built by Dave Greene in August 2014 that uses four universal constructors (UCs) arranged in a diamond to build four more UCs in a slightly larger diamond. This was the first B3/S23 pattern that exhibited spiral growth. Much smaller versions have now been constructed using the single-channel construction toolkit.

:splitter A signal converter that accepts a single input signal and produces two or more output signals, usually of the same type as the input. An older term for this is fanout, or "fanout device".

A sub-category is the one-time splitter, which is not technically a converter because it can only be used once. One-time splitters are usually small constellations that produce two or more clean gliders when struck by a single glider. In other words, they are multi-glider seeds. These are important for constructing self-destruct circuitry in self-constructing spaceships.

The following combination, a syringe attached to an SE7T14 converter combined with an NW31 converter, is one of the smallest known glider splitters as of July 2018. Another small splitter with a 90-degree colour-changing output is shown under reflector.


..........OO...........O......OO....................
..........OO..........O.O....O..O...................
......................O.O...O.OOO...O...............
.....................OO.OO.O.O......OOO.............
.........................O.O...OO......O............
.....................OO.O..OOOO.O.....OO............
.....................OO.O.O...O.....................
.........................O.O...O....................
..........................O.O...O...................
...........................O...OO...................
....................................................
....................................................
....................................................
..................OO................................
..................OO................................
...OO...............................................
..O..O..............................................
.O.OO...............................................
.O................................................OO
OO................................................OO
...............OO...................................
...............O....................................
................OOO.................................
..................O..........OO.....................
............................O.O.....................
............................O.......................
...........................OO.......................
OOO.................................................
..O.................................................
.O..................................................

:SPPS (c/5 orthogonally, p30) The symmetric PPS. The original PPS found by David Bell in May 1998. Compare APPS.

:sqrtgun Any glider-emitting pattern which emits its nth glider at a time asymptotically proportional to n2. The first examples were constructed by Dean Hickerson around 1991. See also quadratic filter, exponential filter, recursive filter.

:squaredance The p2 agar formed by tiling the plane with the following pattern. Found by Don Woods in 1971.


OO......
....OO..
..O....O
..O....O
....OO..
OO......
...O..O.
...O..O.

:squirter = pipsquirter

:S-spiral = big S

:stabilized switch engine A single switch engine which survives indefinitely by interacting with the appropriate exhaust such that it prevents the engine from ever being destroyed.

The only known types of stabilized switch engines were found by Charles Corderman soon after he discovered the switch engine itself. There is a p288 block-laying type (the more common of the two) and the p384 glider-producing type. These two puffers are the most natural infinite growth patterns in Life. As of June 2018 they are the basis for every infinite growth pattern ever seen to occur from a random asymmetric soup, even after trillions of census results by apgsearch and similar projects.

Patterns giving rise to block-laying switch engines can be seen under infinite growth, and one giving rise to a glider-producing switch engine is shown under time bomb.

Here is the block-laying type showing its distinctive zig-zag trail of blocks.


..O.........................................................
.O.O........................................................
............................................................
.O..O.......................................................
...OO.......................................................
....O.......................................................
..................OO........................................
..................OO........................................
............................................................
............................................................
.OO.........................................................
...O........................................................
..OO........................................................
.OOO...............O........................................
.OO................OO.....OO................................
OOO.O..............OO.....OO................................
.O...O..........OO..........................................
...O..O..........O..........................................
...OOO............O.........................................
....OO........OO............................................
..............OO............................................
............................................................
..................................OO........................
..................................OO........................
............................................................
............................................................
......OO....................................................
......OO................OO..................................
........................OO..................................
............................................................
..........................................OO................
....................OO....................OO................
....................OO......................................
............................................................
..............OO............................................
..............OO............................................
.......................................OO...................
.......................................OO...................
............................................................
............................................................
...................................OO.......................
...................................OO.......................
............................................................
............................................................
............................................................
............................................................
..........................................................OO
..........................................................OO
............................................................
............................................................
..............................OO............................
..............................OO................OO..........
................................................OO..........
............................................................
............................................................
............................................OO..............
............................................OO..............
............................................................
......................................OO....................
......................................OO....................

:stable A pattern is said to be stable if it is a parent of itself. Stable objects are oscillators with period 1 (p1), and are generally called still lifes.

:stable pseudo-Heisenburp A multi-stage converter constructed by Dave Greene in January 2007, using a complex recipe found by Noam Elkies to insert a signal into a 2c/3 wire. The wire's high transmission speed allows a signal from a highway robber to catch up to a salvo of gliders. Ultimately the mechanism restores the key glider, which was destroyed by the highway robber in the first stage of the converter, to its exact original position in the salvo.

Much smaller stable pseudo-Heisenburp devices have since been designed that use simple 0-degree glider seed constellations instead of a 2c/3 wire.

These patterns are labeled "pseudo-Heisenburp", because a true Heisenburp device does not even temporarily damage or affect a passing glider, yet can still produce an output signal in response. However, it is impossible to construct a stable device that can accomplish this for gliders. True stable Heisenburp devices are possible with many other types of spaceships, but not with gliders which have no usable side sparks to initiate an output signal.

:staged recovery A type of signal-processing circuit where the initial reaction between catalysts an incoming signal results in an imperfect recovery. A catalyst is damaged, destroyed completely as in a bait reaction, or one or more objects are left behind that must be cleaned up before the circuit can be reused. In any of these three cases, output signals from the circuit must be used to complete the cleanup. In theory the cleanup process might itself be dirty, requiring additional cleanup stages. In rare cases this might theoretically allow the construction of special-purpose circuits with a lower recovery time than would otherwise be possible, but in practice this kind of situation does not commonly arise.

An example is the record-breaking (at the time) 487-tick reflector constructed by Adam P. Goucher on 12 April 2009. 487 ticks was a slight improvement over the repeat time of the Silver reflector. The reflector featured a standard Callahan G-to-H, with cleanup by an internal dirty glider reflector found by Dieter Leithner many years before. This in turn was cleaned up by the usual ungainly Herschel plumbing attached to the G-to-H's output. The dirty glider reflector is not actually fully recovered before a second p487 signal enters the full reflector. However, it has been repaired by the time the internal reflector is actually needed again, so the cycle can be successfully repeated at p487 instead of p497.

:stairstep hexomino (stabilizes at time 63) The following predecessor of the blockade.


..OO
.OO.
OO..

:stamp collection A collection of oscillators (or perhaps other Life objects) in a single diagram, displaying the exhibits much like stamps in a stamp album. The classic examples are by Dean Hickerson (see http://conwaylife.com/ref/DRH/stamps.html).

Many stamp collections contain "fonts" made of single cells (which cleanly die) to annotate the objects or to draw boxes around them. For example, here is a stamp collection which shows all the ways that two gliders can create a loaf or an eater:


.O......O.O.....O....O.O.O...................O.
............................................O..
.O.....O...O...O.O...O......................OOO
...............................................
.O.....O...O..O...O..O.O.O.....................
...............................................
.O.....O...O..O.O.O..O.........................
........................................OO.....
.O.O.O..O.O...O...O..O.................O.O.....
.........................................O.....
...............................................
...............................................
.............................................O.
............................................O..
O.O.O....O....O.O.O..O.O.O..O.O.............OOO
................................O..............
O.......O.O.....O....O......O..................
................................O..............
O.O.O..O...O....O....O.O.O..O.O................
...............................................
O......O.O.O....O....O......O..O...........O...
..........................................OO...
O.O.O..O...O....O....O.O.O..O...O.........O.O..

Alternatively, stamp collections can use LifeHistory for their annotations, but this requires a more sophisticated Life program to handle. Numbers, or more rarely letters, are sometimes constructed from stable components such as blocks or snakes, but their readability is somewhat limited by placement constraints.

:standard spaceship A glider, LWSS, MWSS or HWSS. These have all been known since 1970.

:star (p3) Found by Hartmut Holzwart, February 1993.


.....O.....
....OOO....
..OOO.OOO..
..O.....O..
.OO.....OO.
OO.......OO
.OO.....OO.
..O.....O..
..OOO.OOO..
....OOO....
.....O.....

:star gate A device by Dieter Leithner (October 1996) for transporting a LWSS faster than the speed of light. The key reaction is the Fast Forward Force Field.

:stator The cells of an oscillator that are always on. Compare rotor. (The stator is sometimes taken to include also some of those cells which are always off.) The stator is divided into the bushing and the casing.

By analogy, the cells of an eater that remain on even when the eater is eating are considered to constitute the stator of the eater. This is not always well-defined, because an eater can have more than one eating action.

:statorless A statorless oscillator is one in which no cell is permanently on - that is, the stator is empty, or in other words the oscillator has the maximum possible volatility. See the volatility entry for examples of this type of oscillator at different periods. Statorless oscillators can be constructed for any sufficiently large period, using universal constructor technology.

:statorless p5 (p5) Found by Josh Ball, June 2016. The first and only known statorless period 5 oscillator.


O.............O
.OO.........OO.
O....OO.OO....O
OO.O.......O.OO
.O.O..O.O..O.O.
..O.O.....O.O..
..OOO.....OOO..
..OOO.....OOO..
..O.O.....O.O..
.O.O..O.O..O.O.
OO.O.......O.OO
O....OO.OO....O
.OO.........OO.
O.............O

:step Another term for a generation or tick. This term is particularly used in describing conduits. For example, a 64-step conduit is one through which the active object takes 64 generations to pass.

:stillater (p3) Found by Robert Wainwright, September 1985. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and cuphook.


...O....
..O.O.OO
..O.OO.O
OO......
.O.O.OO.
.O.O..O.
..O..O..
...OO...

:still life Any stable pattern, usually assumed to be finite and nonempty. For the purposes of enumerating still lifes this definition is, however, unsatisfactory because, for example, any pair of blocks would count as a still life, and there would therefore be an infinite number of 8-bit still lifes.

For this reason a stricter definition is often used, counting a stable pattern as a strict still life only if its islands cannot be divided into two or more nonempty sets both of which are stable in their own right. If such a subdivision can be made, the pattern can be referred to as a constellation. If its cells form a single cluster it is also, more specifically, either a pseudo still life or a quasi still life.

In rare cases above a certain size threshold, a pattern may be divisible into three or four stable nonempty subsets but not into two. See the 32-bit triple pseudo (32 bits) and the 34-bit quad pseudo for examples.

All still lifes up to 18 bits have been shown to be glider constructible. It is an open question whether all still lifes can be incrementally constructed using glider collisions. For a subset of small still lifes that have been found to be especially useful in self-constructing circuitry, see also Spartan.

The smallest still life is the block. Arbitrarily large still lifes are easy to construct, for example by extending a canoe or barge. The maximum density of a large still life is 1/2, which can be achieved by an arbitrarily large patch of zebra stripes or chicken wire, among many other options. See density for more precise limits.


...O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
......................
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
......................
.OOOOOOOOOOOOOOOOOOOO.
O....................O
OOOOOOOOOOOOOOOOOOOOOO
......................
OOOOOOOOOOOOOOOOOOOOOO
O....................O
.OOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O...

:still life tagalong A tagalong which takes the form of a still life in at least one phase. An example is shown below.


..OO...............
.OO.OO.............
..OOOO.............
...OO..............
...................
...OOOOO...........
..OOOOOOO..........
.OO.OOOOO..........
..OO...............
...................
........O.O.....OO.
......O....O...O..O
......OO.....O.O..O
.O..O..OOOO.O...OO.
O.......OO.........
O...O..............
OOOO...............

:stop and go A pattern by Dean Hickerson in which a period 46 shuttle converts a glider into a block on one oscillation, and then converts the block back into a glider on the next oscillation. The glider is reflected back onto its own path, but with a delay.


........................................O.
.......................................O..
OO..............OO.........OO..........OOO
OO...............OO........OO.............
.............OOOOO........................
.............OOOO.........................
..........................................
.............OOOO.........................
.............OOOOO........................
OO...............OO.......................
OO..............OO........................

:stop and restart A type of signal circuit where an input signal is converted into a stationary object, which is then re-activated by a secondary input signal. This can be used either as a memory device storing one bit of information, or as a simple delay mechanism. In the following January 2016 example by Martin Grant, a ghost Herschel marks the output signal location, and a "ghost beehive" marks the location of the intermediate still life.


........................................................O.
.......................................................O..
.......................................................OOO
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
............O.............................................
............OOO...........................................
...............O..........................................
..............OO..........................................
........O.................................................
.......O.O.......OO.......................................
.......O.O......O.O.......................................
.....OOO.OO.....OO........................................
....O.....................................................
.....OOO.OO...............................................
.......O.OO...............................................
..........................................................
..........................................................
..........................................................
OO........................................................
.O........................................................
.O.O......................................................
..OO......................................................
..........................................................
....................O.....................................
...................O.O....................................
...................O...................................O..
....................O................................OOO..
....................................OO...............O....
..O.................................OO...............O....
..O.O.....................................................
..OOO.....................................................
....O....................O................................
........................O.O...............................
........................OO................................
...................OO............OO.......................
...................OO............O........................
..................................O.......................
.................................OO.......................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..OO..........OO..........................................
...O..........O...........................................
OOO............OOO........................................
O................O........................................
The eater1 in the lower left corner catches the restart glider if no input signal has come in to create the beehive. This eater could be removed if it is useful to have both a "0" and a "1" output for a memory cell mechanism.

The catch and throw technology in a Caterpillar is a somewhat similar idea. See also stop and go and reanimation.

:stream A line of identical objects (usually spaceships), each of which is moving in a direction parallel to the line, generally on the same lane. In many uses the stream is periodic. For example, the new gun produces a period 46 glider stream. The stream produced by a pseudo-random glider generator can have a very high period. Compare with wave. See also single-channel for a common use of non-periodic glider streams.

:stretcher Any pattern that grows by stretching a wick or agar. See wickstretcher and spacefiller.

:strict still life A still life that is either a single connected polyplet, or is arranged such that a stable smaller pattern cannot be formed by removing one or more of its islands. For example, beehive with tail is a strict still life because it is connected, and table on table is a strict still life because neither of the tables are stable by themselves. See also triple pseudo, quad pseudo.

Still lifes have been enumerated by Conway (4-7 bits), Robert Wainwright (8-10 bits), Dave Buckingham (11-13 bits), Peter Raynham (14 bits), Mark Niemiec (15-24 bits), and Simon Ekström and Nathaniel Johnston (25-32 bits). The resulting figures are shown below; see also https://oeis.org/A019473. The most recent search by Nathaniel Johnston has also confirmed that the triple pseudo pattern found by Gabriel Nivasch is the only such still life with 32 bits or less. It is therefore included in the pseudo still life count and not in the table below.

  --------------
  Bits    Number
  --------------
   4           2
   5           1
   6           5
   7           4
   8           9
   9          10
  10          25
  11          46
  12         121
  13         240
  14         619
  15        1353
  16        3286
  17        7773
  18       19044
  19       45759
  20      112243
  21      273188
  22      672172
  23     1646147
  24     4051711
  25     9971377
  26    24619307
  27    60823008
  28   150613157
  29   373188952
  30   926068847
  31  2299616637
  32  5716948683
  --------------

As the number of bits increases, the strict still life count goes up exponentially by approximately O(2.46n). By comparison, the rate for pseudo still life}s is about O(2.56n) while for quasi still lifes it's around O(3.04n).

:strict volatility A term suggested by Noam Elkies in August 1998 for the proportion of cells involved in a period n oscillator which themselves oscillate with period n. For prime n this is the same as the ordinary volatility. Periods with known strictly-volatile oscillators include 1, 2, 3, 5, 6, 8, 13, 15, 22, 30, 33, and 177. Examples include figure-8, Kok's galaxy, smiley, and pentadecathlon. A composite example is the following p22, found by Nicolay Beluchenko on 4 March 2009:


...........OO...
..........O.O...
..O.....O....O..
OO.OO..OO.O.O...
O.......O...O...
.O.O............
................
..OOO.......O...
...O.......OOO..
................
............O.O.
...O...O.......O
...O.O.OO..OO.OO
..O....O.....O..
...O.O..........
...OO...........

:super beehive = honeycomb

:superfountain (p4) A p4 sparker which produces a 1-cell spark that is separated from the rest of the oscillator by two clear rows of cells. The first superfountain was found by Noam Elkies in February 1998. In January 2006 Nicolay Beluchenko found the much smaller one shown below. See also fountain.


...........O...........
.......................
.......................
.....O..O.....O..O.....
...OO..O.OOOOO.O..OO...
.....O...........O.....
...O.OO.........OO.O...
.O.O...OOO...OOO...O.O.
OOO.O.............O.OOO
..........O.O..........
....OOO...O.O...OOO....
....O..O...O...O..O....
...OOOO..O.O.O..OOOO...
...OO..OOO.O.OOO..OO...
..O...O...O.O...O...O..
...O..O.O.O.O.O.O..O...
....O.O.OO...OO.O.O....
.....O...........O.....

:superlinear growth Growth faster than any rate proportional to T, where T is the number of ticks that a pattern has been run. This term usually applies to a pattern's population growth, rather than diametric growth or bounding-box growth. For example, breeders' and spacefillers' population asymptotically grows faster than any linear-growth pattern. It may also be used to describe the rate of increase in the number of subpatterns present in a pattern, such as when describing a replicator's rate of reproduction. Due to limits enforced by the speed of light, no pattern's population can grow at an asymptotic rate faster than quadratic growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:superstring An infinite orthogonal row of cells stabilized on one side so that it moves at the speed of light, often leaving debris behind. The first examples were found in 1971 by Edward Fitzgerald and Robert Wainwright. Superstrings were studied extensively by Peter Rott during 1992-1994, and he found examples with many different periods. (But no odd periods. In August 1998 Stephen Silver proved that odd-period superstrings are impossible.)

Sometimes a finite section of a superstring can be made to run between two tracks ("waveguides"). This gives a fuse which can be made as wide as desired. The first example was found by Tony Smithurst and uses tubs. (This is shown below. The superstring itself is p4 with a repeating section of width 9 producing one blinker per period and was one of those discovered in 1971. With the track in place, however, the period is 8. This track can also be used with a number of other superstrings.) Shortly after seeing this example, in March 1997 Peter Rott found another superstring track consisting of boats. At present these are the only two waveguides known. Both are destroyed by the superstring as it moves along. It would be interesting to find one that remains intact.

See titanic toroidal traveler for another example of a superstring.


.OO..........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OOO.........................................................
..OO.........................................................
..OO.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
..OO.........................................................
..OO.........................................................
.OOO.........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OO..........................................................

:support Those parts of an object which are only present in order to keep the rest of the object (such an engine or an edge spark) working correctly. These can be components of the object, or else accompanying objects used to perturb the object. In many cases there is a wide variation of support possible for an engine. The arms in many puffers are an example of support.

:surprise (p3) Found by Dave Buckingham, November 1972.


...O....OO
...OOO..O.
.OO...O.O.
O..OO.O.OO
.O......O.
OO.O.OO..O
.O.O...OO.
.O..OOO...
OO....O...

:SW1T43 A Herschel-to-glider converter that produces a tandem glider useful in the tee reaction. It is classified as a "G3" converter because its two gliders are three lanes apart.


.......OO........
.......O.........
.....O.O.........
....O.O..........
OO...O...........
OO...............
...........OO....
...........O.O...
.............O...
.............O.OO
..........OO.O.OO
O........O..O....
O.O.......OO.....
OOO..............
..O.......OOOO...
...........O..O..
.........O...OO..
.........OO......
Besides the southwest-travelling glider on lane 1, the converter also emits the Herschel's standard first natural glider, SW-2. The converter's full standard name is therefore "HSW1T43_SW-2T21". See NW31 for an explanation of H-to-G naming conventions.

:SW-2 The simplest type of H-to-G converter, where the converter's effect is simply to suppress a Herschel cleanly after allowing its first natural glider to escape. The name should be read as "SW minus two", where -2 is a glider lane number. The complete designation is SW-2T21. See NW31T120 for a discussion of the standard naming conventions used for these converters.

An unlimited number of converters have the SW-2T21 classification. The variants most often used consist of just one or two small still life catalysts.


...................................OO.....
...................................O......
.................................O.O......
.............................OO..OO.......
.............................OO...........
.....OO...................................
.....OO...................................
.............................OO...........
.............................OO...........
..........................................
..........................................
..........................................
.........OO...............................
.........OO...............................
..........................................
O........................O................
O.O......................O.O..............
OOO......................OOO..............
..O........................O..............
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
........................................O.
...........O...........................O.O
..........O.O...........................OO
..........O.O.............................
...........O............................OO
O........................O.............O.O
O.O......................O.O............O.
OOO......................OOO..............
..O........................O..............

:SW-2T21 = SW-2

:swan (c/4 diagonally, p4) A diagonal spaceship producing some useful sparks. Found by Tim Coe in February 1996.


.O..........OO..........
OOOOO......OO...........
O..OO........O.......OO.
..OO.O.....OO......OOO.O
...........OO...O.OO....
.....O.O......OO........
..........OOO.O....O....
.......OOO...O....O.....
........O.......O.......
........O......O........
........................
...........O............

:swimmer = switch engine.

:swimmer lane = switch engine channel.

:switch A signal-carrying circuit that can send output signals to two or more different locations, depending on the state of the mechanism. These may be toggle circuits, where the state of the switch changes after each use, or permanent switches that retain the same state through many uses until a change is made with a separate signal.

More generally, any circuit may be referred to as a switch, if it can alter its output based on stored information. For example, the following simple mechanism based on an eater2 was discovered by Emerson J. Perkins in 2007. It either reflects or absorbs an incoming signal, depending on the presence or absence of a nearby block. The block is removed if a reflection occurs.


...O.....................O....................
....O...................O.O...................
..OOO...................O.O...................
......................OOO.OO................O.
..................O..O....................OOO.
................OOO...OOO.OO...OO........O....
...............O........O.OO...OO........OO...
...............OO.............................
OO............................................
.O............................................
.O.OO.........................................
..O..O....................................OO..
...OO.....................................O.O.
..................OO........................O.
..................OO........................OO
..................................OOO.........
..................................O...........
...................................O..........
..............................................
..........................O...OO..............
.........................O.O...O..............
.....................OO.O.O...O...............
.....................OO.O....O................
.........................OOOOO.O..............
.................OO.O.OO.O....OO...........OOO
.................O.OO.O..O.OO..............O..
..........OO............OO.O.OOO............O.
..........OO...................O..............

The switching signal here is a glider produced by a high-clearance syringe variant found by Matthias Merzenich. The syringe is not technically part of the switch mechanism; any standard Herschel source can deliver the signal to the block factory (the two eater1s on the right side of the pattern). Alternate converter mechanisms could also be used to place the block.

An earlier example of the same type of one-time switch mechanism, also mediated by a block, can be found in the NW34T204 H-to-G. See also bistable switch for a very robust and versatile toggle switch with two input lanes and four possible outputs.

:switchable gun A gun that includes a mechanism to turn the output stream off and on with simple signals, often gliders. A small example is Dieter Leithner's switchable LWSS gun from July 8, 1995. The ON signal enters from the northeast, and the OFF signal from the northwest:


.................OO...........................................
.................O..O.........................................
..............................................................
.....................O........................................
..............................................................
.O.................OO.........................................
..O...............O...........................................
OOO...........................................................
..............................................................
...............OO...OO........................................
...............OO...OO........................................
................OOOOO........................O................
.................O.O........................O.................
............................................OOO...............
.................OOO..........................................
....................................O.O.......................
....................................O...O.....................
........................................O.......O.............
..........................OO........O....O....OOOO............
..........................OO............O....O.O.OO...........
.....................O..............O...O...O..O.OOO........OO
......................O.............O.O......O.O.OO.........OO
....................OOO.......................OOOO............
................O...............................O.............
...............OOO...................O........................
..............OOOOO..................O.O.....O................
.............OO...OO.................OO....OOO................
..........................................O...................
.............................O............OO..................
...........................O..O.........OOO...................
...............OOO..........OOO.........OO....................
...............OOO..........O..........O.O....................
.............................O................................
.............................OOO..............................
................OO............................................
................OO............................................
.....................O........................................
...................OOOO......OO..OO...........................
.............OO...O.O.OO.....OOOO.O..O.O......................
.............OO..O..O.OOO.....OO.O...O...O....................
..................O.O.OO....O............O.....OO.............
...................OOOO..............O....O....OO.............
.....................O...................O....................
.....................................O...O....................
.....................................O.O......................

:switch engine The following pattern discovered by Charles Corderman in 1971, which is a glide symmetric unstable puffer which moves diagonally at a speed of c/12 (8 cells every 96 generations).


.O.O..
O.....
.O..O.
...OOO

The exhaust is dirty and unfortunately catches up and destroys the switch engine before it runs 13 full periods. Corderman found several ways to stabilize the switch engine to produce puffers, using either one or two switch engines in tandem. See stabilized switch engine and ark.

No spaceships were able to be made from switch engines until Dean Hickerson found the first one in April 1991 (see Cordership). Switch engine technology is now well-advanced, producing many c/12 diagonal spaceships, puffers, and rakes of many periods.

Small polyominoes exist whose evolution results in a switch engine. See nonomino switch engine predecessor.

Several three-glider collisions produce dirty reactions that produce a stabilized switch engine along with other ash, making infinite growth. Until recently the only known syntheses for clean unstabilized switch engines used four or more gliders. There are several such recipes. In the reaction shown below no glider arrives from the direction that the switch engine will travel to, making it easier to repeat the reaction:


OOO................
..O................
.O.................
...................
.......OO..........
......OO...........
........O..........
...................
...................
...................
...................
...................
...................
...................
..OO...............
.O.O...............
...O...............
...................
................OOO
................O..
.................O.
Running the above for 20 ticks completes a kickback reaction with the top two gliders, resulting in the three-glider switch engine recipe discovered by Luka Okanishi on 12 March 2017.

:switch engine channel Two lines of boats (or other suitable objects, such as tub with tails) arranged so that a switch engine can travel between them, in the following manner:


..............OO................
.............O.O................
..............O.................
................................
................................
................................
................................
................................
.......OOO............OO........
........O..O.........O.O........
............O.........O.........
.........O.O....................
................................
................................
................................
................................
..............................OO
.............................O.O
..............................O.
................................
................................
.O..............................
O.O.............................
OO..............................
................................
................................
................................
................................
................................
.........O......................
........O.O.....................
........OO......................
David Bell used this in June 2005 to construct a "bobsled" oscillator, in which a switch engine factory sends switch engines down a channel, at the other end of which they are deleted.

:switch engine chute = switch engine channel

:switch-engine ping-pong A very large (210515x183739) quadratic growth pattern found by Michael Simkin in October 2014. Currently this is the smallest starting population (23 cells) known to result in a quadratic population growth rate. Previous record-holders include Jaws, mosquito1, mosquito2, mosquito3, mosquito4, mosquito5, teeth, catacryst, metacatacryst, Gotts dots, wedge, 26-cell quadratic growth, 25-cell quadratic growth, and 24-cell quadratic growth.

:symmetric Any object which can be rotated and/or flipped over an axis and still maintain the same shape. Many common small objects such as the block, beehive, pond, loaf, clock, and blinker are symmetric. Some larger symmetric objects are Kok's galaxy, Achim's p16, cross, Eureka, and the pulsar.

Large symmetric objects can easily be created by placing multiple copies of any finite object together in a symmetrical way. Unless the individual objects interact significantly, this is considered trivial and is not considered further here (e.g., two LWSSs travelling together a hundred cells apart).

There are two kinds of symmetry. Odd symmetry occurs when an object's line of reflection passes through the center of a line of cells. Objects with odd symmetry have an odd number of columns or rows, and can have a gutter. Even symmetry occurs when the line of reflection follows the boundary between two lines of cells. Objects with even symmetry have an even number of columns or rows.

Because the Life universe and its rules are symmetric, all symmetric objects must remain symmetric throughout their evolution. Most non-symmetric objects keep their non-symmetry as they evolve, but some can become symmetric, especially if they result in a single object. Here is a slightly more complicated example where two gliders interact to form a blockade:


..O.........
O.O.........
.OO........O
.........OO.
..........OO

Many useful objects are symmetric along an orthogonal axis. This commonly occurs by placing two copies of an object side by side to change the behaviour of the objects due to the inhibition or killing of new cells at their gutter interface. Examples of this are twin bees shuttle, centinal, and the object shown in puffer. Other useful symmetric objects are created by perturbing a symmetric object using nearby oscillators or spaceships in a symmetric manner. Examples of this are Schick engine, blinker ship, and hivenudger.

Many spaceships found by search programs are symmetric because the search space for such objects is much smaller than for non-symmetrical spaceships. Examples include dart, 60P5H2V0, and 119P4H1V0.

:synchronized Indicates that precise relative timing is required for two or more input signals entering a circuit, or two or more sets of gliders participating in a glider synthesis. Compare asynchronous. See also salvo and slow glider construction.

:synchronous = synchronized

:synthesis = glider synthesis

:syringe A small stable converter found by Tanner Jacobi in March 2015, accepting a glider as input and producing an output Herschel As of June 2018 it is the smallest known converter of this type, so it is very often used to handle input gliders in complex signal circuitry, as described in Herschel circuit. A second glider can safely follow the first any time after 78 ticks, but overclocking also allows the syringe to work at a repeat time of 74 or 75 ticks. If followed by a dependent conduit a simple eater2 can be used instead of the large welded catalyst shown here. A ghost Herschel marks the output location.


....O.............................
.....O............................
...OOO............................
..................O...............
................OOO...............
...............O..................
...............OO.................
OO................................
.O................................
.O.OO.............................
..O..O.......................O....
...OO........................O....
..................OO.........OOO..
..................OO...........O..
..................................
..................................
..................................
...........................O...OO.
..........................O.O...O.
.........................O.O...O..
.....................OO.O.O...O...
.....................OO.O..OOOO.O.
.........................O.O...O.O
.....................OO.OO..O..O.O
......................O.O..OO...O.
..........OO..........O.O.........
..........OO...........O..........

A different version of the large catalyst, with better clearance for some situations, can be seen in the switch entry.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_f.htm0000755000175000017500000015545213317135606014337 00000000000000 Life Lexicon (F)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:F116 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in February 1997. After 116 ticks, it produces a Herschel at (32, 1) relative to the input. Its recovery time is 138 ticks; this can be reduced to 120 ticks by adding extra mechanisms to suppress the internal glider. It is Spartan only if the following conduit is a dependent conduit, so that the welded FNG eater can be removed. A ghost Herschel in the pattern below marks the output location:


........O..........................
........OOO........................
...........O.......................
..........OO.......................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
...................................
O..................................
O.O.............................O..
OOO.............................O..
..O.............................OOO
..................................O
...................................
...................................
...................................
...................................
.........................OO........
...................OO.....O........
...................O.O.OOO.........
............OO.......O.O...........
............OO.......OO............

:F117 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HFx58B + BFx59H. After 117 ticks, it produces a Herschel at (40, -6) relative to the input. Its recovery time is 63 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. A ghost Herschel in the pattern below marks the output location:


......................OO.....................
.......................O.....................
..........O...........O......................
..........OOO.........OO.....................
.............O...............................
OO..........OO...............................
.O...........................................
.O.O.........................................
..OO.........................................
.........................OO...............O..
.........................OO...............O..
..........................................OOO
............................................O
.............................................
.............................................
..O..........................................
..O.O........................................
..OOO........................................
....O...........OO...........................
................O............................
.................OOO.........................
...................O.........................

:F166 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in May 1997. It is composed of two elementary conduits, HFx107B + BFx59H. The F166 and Lx200 conduits are the two original dependent conduits (several more have since been discovered). After 166 ticks, it produces a Herschel at (49, 3) relative to the input. Its recovery time is 116 ticks. A ghost Herschel in the pattern below marks the output location:


.................................OO.....................
..................................O.....................
.................................O......................
.................................OO.....................
........................................................
........................................................
.OO.....................................................
OOO.OO..................................................
.OO.OOO.OO..............................................
OOO.OO..OO..........................OO...............O..
OO..................................OO...............O..
.....................................................OOO
.......................................................O
........................................................
........................................................
........................................................
......OO................................................
.....O.O......................................OO........
.....O.........................................O........
....OO.........................OO...........OOO.........
...............................OO...........O...........
........................................................
........................................................
.................OO.....................................
..................O.....................................
...............OOO......................................
...............O........................................
...........................OO...........................
...........................O............................
............................OOO.........................
..............................O.........................
The F166 can be made Spartan by replacing the snake with an eater1 in one of two orientations. The input shown here is a Herschel great-grandparent, since the input reaction is catalysed by the transparent block before the Herschel's standard form can appear.

:F171 An elementary conduit, the seventeenth Herschel conduit, discovered by Brice Due in August 2006 in a search using only eaters as catalysts. This was the first new Herschel conduit discovery since 1998. After 171 ticks, it produces a Herschel at (29, -17) relative to the input. A ghost Herschel in the pattern below marks the output location:


..........O......................
..........OOO....................
.............O...................
............OO...................
.....O...........................
.....OOO.........................
........O........................
.......OO........................
.................................
..............................O..
....OO........................O..
.....O........................OOO
.....O.O........................O
......OO.........................
.................................
.................................
O................................
OOO..............................
...O.............................
..OO.............................
.................................
.................................
.................................
.................................
.................................
.................................
.O...............................
.O.O.............................
.OOO.............................
...O.............................
.................................
..........OO.....................
...........O.....................
........OOO......................
........O........................

The conduit's recovery time is 227 ticks, slower than many of the original sixteen conduits because of the delayed destruction of a temporary blinker, though the circuit itself is clearly Spartan. The recovery time can be improved to 120 ticks by adding sparkers of various periods to suppress the blinker. See clock for a period-2 example.

The central eater in the group of three to the northwest can be removed to release an additional glider output signal on a transparent lane.

:factory Another word for gun, but not used in the case of glider guns. The term is also used for a pattern that repeatedly manufactures objects other than spaceships or rakes. In this case the new objects do not move out of the way, and therefore must be used up in some way before the next one is made. The following shows an example of a p144 gun which consists of a p144 block factory whose output is converted into gliders by a p72 oscillator.


.......................OO........................OO
.......................OO........................OO
.........................................OO........
........................................O..O.......
.........................................OO........
...................................................
....................................OOO............
....................................O.O............
.........OO.........................OOO............
.........OO.........................OO.............
........O..O.......................OOO.............
........O..O.OO....................O.O.............
........O....OO....................OOO.............
..........OO.OO....................................
...............................OO..................
.....................OO.......O..O.................
.....................OO........OO..................
.................................................OO
.................................................OO
...................................................
....OO..................O..........................
OO....OOOO..........OO..OO.OOO.....................
OO..OO.OOO..........OO....OOOO.....................
....O...................OO.........................
This gun is David Bell's improvement of the one Bill Gosper found in July 1994. The p72 oscillator is by Robert Wainwright in 1990, and the block factory is Achim's p144 minus one of its stabilizing blocks. For a block factory using stable components and triggered by an input Herschel, see also keeper.

:familiar fours Common patterns of four identical objects. The five commonest are traffic light (4 blinkers), honey farm (4 beehives), blockade (4 blocks), fleet (4 ships, although really 2 ship-ties) and bakery (4 loaves, although really 2 bi-loaves). Also sometimes included is four skewed blocks.

:fanout A mechanism that emits two or more objects of some type for each one that it receives. Typically the objects are gliders or Herschels; glider duplicators are a special case.

:Fast Forward Force Field The following reaction found by Dieter Leithner in May 1994. In the absence of the incoming LWSS the gliders would simply annihilate one another, but as shown they allow the LWSS to advance 11 spaces in the course of the next 6 generations.


.......O......O..
........O......OO
..OO..OOO.....OO.
OO.OO............
OOOO.........O...
.OO.........OO...
............O.O..

The illusion of super-light-speed travel is caused by an LWSS that is always created, but is then destroyed in some cases, by a signal catching up to it from behind that necessarily never travels faster than the speed of light. It is not possible to make any use of the apparent super-light-speed signal. The front end of an output LWSS can't be distinguished from the alternative dying spark output until several more ticks have passed. Not surprisingly, this extra time is enough to drop the average speed of information transmission safely below c.

Leithner named the Fast Forward Force Field in honour of his favourite science fiction writer, the physicist Robert L. Forward. See also star gate and speed booster.

:fate The result of evolving a pattern until its final behaviour is known. This answers such questions such as whether or not the pattern remains finite, what its growth rate is, what period the final state may settle into, and what its final census is. All small Life objects seem to eventually settle down into a mix of oscillators, simple spaceships, and occasionally small puffers. See methuselah, soup, ash.

Most sufficiently large random patterns are expected to grow forever due to the production of switch engines at their boundary. Engineered Life objects - and therefore also sufficiently large and unlikely random patterns - can have more interesting behaviour, such as breeders, sawtooths, and prime calculators. Some objects have even been constructed or designed having an unknown fate.

:father = parent

:fd Abbreviation for full diagonals.

:featherweight spaceship = glider

:fencepost Any pattern that stabilizes one end of a wick.

:Fermat prime calculator A pattern constructed by Jason Summers in January 2000 that exhibits infinite growth if and only if there are no Fermat primes greater than 65537. The question of whether or not it really does exhibit infinite growth is therefore equivalent to a well-known and long-standing unsolved mathematical problem. It will, however, still be growing at generation 102585827975. The pattern is based on Dean Hickerson's primer and caber tosser patterns and a p8 beehive puffer by Hartmut Holzwart.

:F-heptomino Name given by Conway to the following heptomino.


OO..
.O..
.O..
.OOO

:figure-8 (p8) A domino sparker found by Simon Norton in 1970.


OOO...
OOO...
OOO...
...OOO
...OOO
...OOO

:filter Any oscillator used to delete some but not all of the spaceships in a stream. An example is the blocker, which can be positioned so as to delete every other glider in a stream of period 8n+4, and can also do the same for LWSS streams. Other examples are the MW emulator and T-nosed p4 (either of which can be used to delete every other LWSS in a stream of period 4n+2), the fountain (which does the same for MWSS streams) and a number of others, such as the p6 pipsquirter, the pentadecathlon and the p72 oscillator shown under factory. Another example, a p4 oscillator deleting every other HWSS in a stream of period 4n+2, is shown below. (The p4 oscillator here was found, with a slightly larger stator, by Dean Hickerson in November 1994.)


..........OOOO............
....OO...OOOOOO...........
OOOO.OO..OOOO.OO..........
OOOOOO.......OO...........
.OOOO.....................
..........................
................OO........
..............O....O......
..........................
.............O.O..O.O.....
...........OOOO.OO.OOOO...
........O.O....O..O....O.O
........OO.OO.O....O.OO.OO
...........O.O......O.O...
........OO.O.O......O.O.OO
........OO.O..........O.OO
...........O.O.OOOO.O.O...
...........O.O......O.O...
..........OO.O.OOOO.O.OO..
..........O..OOO..OOO..O..
............O..OOOO..O....
...........OO.O....O.OO...
...........O..O....O..O...
............O..O..O..O....
.............OO....OO.....

:filter stream A stream of spaceships in which there are periodic gaps in the stream. This can thin out another crossing stream by deleting the spaceships in the second stream except where the gaps occur. The filter stream is not affected by the deletions so that the same stream can thin out multiple other streams. The Caterpillar uses filter streams of MWSSs in which there is a gap every 6 spaceships. Here is part of a filter stream that thins a glider stream by 2/3:


................................O.............................
.................................O............................
...............................OOO............................
..............................................................
..............................................................
..............................................................
..............................................................
.......................................O......................
........................................O.....................
......................................OOO.....................
..............................................................
..............................................................
..............................................................
..............................................................
..............................................O...............
...............................................O..............
.............................................OOO..............
..............................................................
..............................................................
..O.............O...........................O.............O...
O...O.........O...O.......................O...O.........O...O.
.....O.............O...........................O.............O
O....O........O....O......................O....O........O....O
.OOOOO.........OOOOO.......................OOOOO.........OOOOO

:finger A protruding cell in an oscillator or dying spark, with the ability to modify a nearby active reaction. Like a thumb, a finger cell appears at the edge of a reaction envelope and is the only live cell in its row or column. The finger spark remains alive for two ticks before dying, whereas a thumb cell dies after one tick. Because the key cell is kept alive for an extra tick, an alternate technical term is "held (orthogonal) bit spark". A "held diagonal bit spark" is not possible in B3/S23 for obvious reasons.

:fire An encoded signal used in combination with push and pull elbow operations in a simple construction arm. When a FIRE signal is sent, the construction-arm elbow produces an output glider, usually at 90 degrees from the construction arm. This terminology is generally used when there is only a single recipe for such a glider output, or only one recipe for each glider colour (e.g., FIRE WHITE, FIRE BLACK).

:fireship (c/10 orthogonally, p10) A variant of the copperhead with a trailing component that emits several large sparks, discovered by Simon Ekström on 20 March 2016. The interaction between the copperhead and the additional component is minimal enough that the extension technically fits the definition of a tagalong. However, the extension slightly modifies two of the phases of the spaceship, starting two ticks after the phase shown below, so it's also valid to classify the fireship as a distinct spaceship.


....OO....
...OOOO...
..........
..OOOOOO..
...OOOO...
..........
..OO..OO..
OO.O..O.OO
...O..O...
..........
..........
....OO....
....OO....
..........
.O.O..O.O.
O..O..O..O
O........O
O........O
OO......OO
..OOOOOO..

:fire-spitting (p3) Found by Nicolay Beluchenko, September 2003.


...O......
.OOO......
O.........
.O.OOO....
.O.....O..
..O..O....
..O.O..O.O
........OO

:first natural glider The glider produced at T=21 during the evolution of a Herschel. This is the most common signal output from a Herschel conduit.

:fish A generic term for LWSS, MWSS and HWSS, or, more generally, for any spaceship. In recent years *WSS is much more commonly used to refer to the small orthogonal c/2 spaceships.

:fishhook = eater1

:fleet (p1) A common formation of two ship-ties.


....OO....
....O.O...
.....OO...
.......OO.
OO.....O.O
O.O.....OO
.OO.......
...OO.....
...O.O....
....OO....

:flip-flop Any p2 oscillator. However, the term is also used in two more specific (and non-equivalent) senses: (a) any p2 oscillator whose two phases are mirror images of one another, and (b) any p2 oscillator in which all rotor cells die from underpopulation. In the latter sense it contrasts with on-off. The term has also been used even more specifically for the 12-cell flip-flop shown under phoenix.

:flip-flops Another name for the flip-flop shown under phoenix.

:flipper Any oscillator or spaceship that forms its mirror image halfway through its period.

:flotilla A spaceship composed of a number of smaller interacting spaceships. Often one or more of these is not a true spaceship and could not survive without the support of the others. The following example shows an OWSS escorted by two HWSS.


....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........
...............
...........OO..
.O............O
O..............
O.............O
OOOOOOOOOOOOOO.
...............
...............
....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........

:fly A certain c/3 tagalong found by David Bell, April 1992. Shown here attached to the back of a small spaceship (also by Bell).


..O...............................
.O.O..............................
.O.O......................O.O...O.
.O.......................OO.O.O..O
...........OOO........O.........O.
OO.........OO..O.OO...O..OOOO.....
.O.O.........OOOO..O.O..OO....OO..
.OO........O..O...OOO.....OOO.....
..O.......O....O..OO..OO..O..O....
...O..O...O....O..OOO.O.O....OO...
.......O.OO....O..OOOO.....O......
....OO...OO....O..OOOO.....O......
....O.O...O....O..OOO.O.O....OO...
...OO.....O....O..OO..OO..O..O....
....O.O....O..O...OOO.....OOO.....
.....O.......OOOO..O.O..OO....OO..
...........OO..O.OO...O..OOOO.....
...........OOO........O.........O.
.........................OO.O.O..O
..........................O.O...O.

:fly-by deletion A reaction performed by a passing convoy of spaceships which deletes a common stationary object without harming the convoy. Fly-by deletion is often used in the construction of puffers and spaceships to clean up unwanted debris.

For c/2 convoys this is not usually difficult since the LWSS, MWSS, and HWSS spaceships have such useful sparks. However, some objects are more difficult to delete. For example, deleting a tub appears to require an unusual p4 spaceship.


.......................O.........
......................O.O........
.......................O.........
.................................
.................................
.................................
................OOO..............
OOO.............O..O.............
O..O....OOO.....O...........OOO..
O.......O..O....O...O.......O..O.
O...O..O...O....O...O.......O....
O......O.O...O..O...........O...O
.O..OO........O.O...........O...O
.OOOOO........O.............O....
....OO......O...OOO..........O.O.
.OO..............................

The deletion of a pond appears to require a convoy which is 89 cells in width containing a very unusual p4 spaceship which has 273 cells. There are small objects which have no known fly-by deletion reactions. However, as in the case of reanimation, hitting them with the output of rakes is an effective brute force method.

:flying machine = Schick engine

:FNG = first natural glider.

:fore and back (p2) Compare snake pit. Found by Achim Flammenkamp, July 1994.


OO.OO..
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
..OO.OO

:forward glider A glider which moves at least partly in the same direction as the puffer(s) or spaceship(s) under consideration.

:fountain (p4) Found by Dean Hickerson in November 1994, and named by Bill Gosper. See also filter and superfountain.


.........O.........
...................
...OO.O.....O.OO...
...O.....O.....O...
....OO.OO.OO.OO....
...................
......OO...OO......
OO...............OO
O..O...O.O.O...O..O
.OOO.OOOOOOOOO.OOO.
....O....O....O....
...OO.........OO...
...O...........O...
.....O.......O.....
....OO.......OO....

:four skewed blocks (p1) The following constellation, sometimes considered to be one of the familiar fours.


...OO.....
...OO.....
..........
..........
..........
........OO
OO......OO
OO........
..........
..........
..........
.....OO...
.....OO...
This is most commonly created by a symmetric 2-glider collision:

.OO.....
O.O.....
..O..O..
.....O.O
.....OO.

:fourteener (p1)


....OO.
OO..O.O
O.....O
.OOOOO.
...O...

:fox (p2) This is the smallest asymmetric p2 oscillator. Found by Dave Buckingham, July 1977.


....O..
....O..
..O..O.
OO.....
....O.O
..O.O.O
......O

:freeze-dried A term used for a glider constructible seed that can activated in some way to produce a complex object. For example, a "freeze-dried salvo" is a constellation of constructible objects which, when triggered by a single glider, produces a unidirectional glider salvo, and nothing else. Freeze-dried salvos can be useful in slow salvo constructions, especially when an active circuit has to destroy or reconstruct itself in a limited amount of time. Gradual modification by a construction arm may be too slow, or the circuit doing the construction may itself be the object that must be modified.

The concept may be applied to other types of objects. For example, one possible way to build a gun for a waterbear would be to program a construction arm to build a freeze-dried waterbear seed, and then trigger it when the construction is complete.

:French kiss (p3) Found by Robert Wainwright, July 1971.


O.........
OOO.......
...O......
..O..OO...
..O....O..
...OO..O..
......O...
.......OOO
.........O
For many years this was one of the best-known small oscillators with no known glider synthesis. In October 2013 Martin Grant completed a 23-glider construction.

:frog II (p3) Found by Dave Buckingham, October 1972.


..OO...OO..
..O.O.O.O..
....O.O....
...O.O.O...
...OO.OO...
.OO.....OO.
O..O.O.O..O
.O.O...O.O.
OO.O...O.OO
....OOO....
...........
...O.OO....
...OO.O....

:frothing puffer A frothing puffer (or a frothing spaceship) is a puffer (or spaceship) whose back end appears to be unstable and breaking apart, but which nonetheless survives. The exhaust festers and clings to the back of the puffer/spaceship before breaking off. The first known frothing puffers were c/2, and most were found by slightly modifying the back ends of p2 spaceships. A number of these have periods which are not a multiple of 4 (as with some line puffers). Paul Tooke has also found c/3 frothing puffers.

The following p78 c/2 frothing puffer was found by Paul Tooke in April 2001.


.......O.................O.......
......OOO...............OOO......
.....OO....OOO.....OOO....OO.....
...OO.O..OOO..O...O..OOO..O.OO...
....O.O..O.O...O.O...O.O..O.O....
.OO.O.O.O.O....O.O....O.O.O.O.OO.
.OO...O.O....O.....O....O.O...OO.
.OOO.O...O....O.O.O....O...O.OOO.
OO.........OO.O.O.O.OO.........OO
............O.......O............
.........OO.O.......O.OO.........
..........O...........O..........
.......OO.O...........O.OO.......
.......OO...............OO.......
.......O.O.O.OOO.OOO.O.O.O.......
......OO...O...O.O...O...OO......
......O..O...O.O.O.O...O..O......
.........OO....O.O....OO.........
.....OO....O...O.O...O....OO.....
.........O.OO.O...O.OO.O.........
..........O.O.O.O.O.O.O..........
............O..O.O..O............
...........O.O.....O.O...........

:frothing spaceship See frothing puffer.

:frozen = freeze-dried.

:full diagonal Diagonal distance measurement, abbreviated "fd", often appropriate when a construction arm elbow or similar diagonally-adjustable mechanism is present.

:fumarole (p5) Found by Dean Hickerson in September 1989. In terms of its 7x8 bounding box this is the smallest p5 oscillator.


...OO...
.O....O.
.O....O.
.O....O.
..O..O..
O.O..O.O
OO....OO

:fuse A wick burning at one end. For examples, see baker, beacon maker, blinker ship, boat maker, cow, harvester, lightspeed wire, pi ship, reverse fuse, superstring and washerwoman. Useful fuses are usually clean, but see also reburnable fuse.

A fuse can burn arbitrarily slowly, as demonstrated by the example Blockic fuse below. A signal, alternating between glider and MWSS form, travels up and down between two rows of blocks in a series of one-time turner reactions. The spacing shown here causes the fuse to burn 24 cells to the right every 240 generations, for a speed of c/10. Moving the bottom half further from the top half by any even number of cells will slow down the burning even further.


.........OO......................OO......................
.........OO......................OO......................
.........................................................
.........................................................
.....OO.......OO.............OO.......OO.............OO..
.OO..OO.......OO.........OO..OO.......OO.........OO..OO..
.OO................OO....OO................OO....OO......
...................OO......................OO............
.........................................................
.........................................................
.........................................................
.........................................................
............OO....OO................OO....OO.............
............OO....OO................OO....OO.............
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
OO....OO................OO....OO................OO....OO.
OO....OO................OO....OO................OO....OO.
.........................................................
.........................................................
.........................................................
.........................................................
.OO....OO......................OO......................OO
O.O....OO....OO................OO....OO................OO
..O..........OO..OO.......OO.........OO..OO.......OO.....
.................OO.......OO.............OO.......OO.....
.........................................................
.........................................................
.....................OO......................OO..........
.....................OO......................OO..........

:Fx119 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in September 1996. After 119 ticks, it produces an inverted Herschel at (20, 14) relative to the input. Its recovery time is 231 ticks; this can be reduced somewhat by suppressing the output Herschel's glider, or by adding extra catalysts to make the reaction settle more quickly. A ghost Herschel in the pattern below marks the output location:


O......................
O.O....................
OOO....................
..O....................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.......................
.........OO...........O
....OO...OO.........OOO
....OO..............O..
....................O..
.......................
...OO..................
....O....OO............
.OOO.....OO............
.O.....................

:Fx119 inserter A Herschel-to-glider converter and edge shooter based on an Fx119 Herschel conduit:


.........O....................
.........O.O..................
.........OOO..................
...........O..................
..............................
..............................
..............................
..............................
..OO......OO..................
...O.......O..................
OOO.....OOO...................
O.......O.....................
..............................
..............................
..............................
..................OO..........
.............OO...OO..........
.............OO...............
..............................
..............................
............OO............OO..
.............O....OO......O...
..........OOO.....OO.......OOO
..........O..................O

This edge shooter has an unusually high 27hd clearance, one of the highest known for a single small component. The only known higher-clearance edge shooters are injectors making use of multiple interacting spaceships. This makes the Fx119 inserter ideal for the construction of wide convoys whose total width can fit within its clearance distance.

The component creates a large cloud of smoke behind its emitted glider which lasts for over 90 generations. In spite of this, many tightly packed convoys can be made by injecting later gliders behind others in the convoy, helped along by the insertion reaction which is able to catch up to the existing gliders. The Fx119 inserter can place a glider on the same lane as a passing glider and as close as 15 ticks behind, which is only one step away from the minimum possible following distance.

:Fx153 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in February 1997. It is made up of two elementary conduits, HF94B + BFx59H. After 153 ticks, it produces an inverted Herschel at (48, -4) relative to the input. Its recovery time is 69 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. A ghost Herschel in the pattern below marks the output location:


.........................OO..........................
OO........................O..........................
.O.............OO......OOO...........................
.O.O...........OO......O.............................
..OO.................................................
.....................................................
.....................................................
.....................................................
....................................................O
..................................................OOO
.................................OO...............O..
..O..............................OO...............O..
..O.O................................................
..OOO................................................
....O................................................
.....................................................
.....................................................
..............................OO.....................
..............................O......................
...........OO...OO.............O.....................
............O...O.............OO.....................
.........OOO.....OOO.................................
.........O.........O.................................

:Fx158 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. After 158 ticks, it produces an inverted Herschel at (27, -5) relative to the input. Its recovery time is 176 ticks. It is the only known small conduit that does not produce its output Herschel via the usual Herschel great-grandparent, so it cannot be followed by a dependent conduit. A ghost Herschel in the pattern below marks the output location:


.........O....OO..............
........O.O..O.O.......OO.....
.......O..OOOO.........O......
.......O.O....O......O.O......
.....OOO.OO..OO......OO.......
....O.........................
.O..OOOO.OO...................
.OOO...O.OO...................
....O.........................
...OO.........................
..............................
..............................
..............................
..............................
..............................
..............................
.............................O
...........................OOO
...........................O..
...........................O..
O.............................
O.O...........................
OOO...........................
..O...........................
..............................
...............OO.............
.........OO....O.O............
..........O......O............
.......OOO.......OO...........
.......O......................

:Fx176 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in October 1997. It is made up of three elementary conduits, HF95P + PF35W + WFx46H. After 176 ticks, it produces an inverted Herschel at (45, 0) relative to the input. The recovery time of the standard form shown here is 92 ticks, but see the PF35W entry for a variant discovered in November 2017 that lowers the repeat time to 73 ticks. A ghost Herschel in the pattern below marks the output location.


..............................OO..................
..............................OO..................
..................................................
.................OO...............................
..................O...............................
..................O.O.............................
...................OO.............................
..................................................
..................................................
..............OO..................................
......O.......OO..................................
......OOO.........................................
.........O........................................
........OO........................................
..................................................
OO................................................
.O................................................
.O.O.....................................OO.......
..OO......................................O.......
..........................................O.O.....
...........................................O.O....
............................................O...OO
................................................OO
..................................................
..................................................
..O...............................................
..O.O...............................OO...........O
..OOO...............................OO.........OOO
....O..........................................O..
...............................................O..
..............OO........OO........................
..............OO..OO.....O........................
..................O.O.OOO.........................
....................O.O...........................
....................OO....OO......................
.........................O.O....OO................
.........................O......OO................
........................OO........................

:Fx77 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in August 1996. After 77 ticks, it produces an inverted Herschel at (25, -8) relative to the input. Its recovery time is 61 ticks; this can be reduced slightly by suppressing the output Herschel's glider, as in the L112 case. A pipsquirter can replace the blinker-suppressing eater to produce an extra glider output. It is one of the simplest known Spartan conduits, and one of the few elementary conduits in the original set of sixteen.

In January 2016, Tanner Jacobi discovered a Spartan method of extracting an extra glider output (top variant below). A ghost Herschel marks the output location for each variant.


.O............................
.OOO..........................
....O.........................
...OO...........OO...........O
................OO.........OOO
...........................O..
...........................O..
..............................
..............................
..............................
..O...........................
..O.O.........................
..OOO.........................
....O.........................
..............................
..............................
..............................
..............................
..............................
............OO......OO........
...........O..O.....OO........
...........O..O...............
............OO................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
O.............................
OOO...........................
...O..........................
..OO...........OO...........O.
...............OO.........OOO.
..........................O...
..........................O...
..............................
..............................
..............................
.O............................
.O.O..........................
.OOO..........................
...O..........................
..............................
..............................
..............................
..............................
..............................
................OO............
................O.O...........
..................O...........
..................OO..........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_bib.htm0000755000175000017500000001027413171233731014632 00000000000000 Life Lexicon (Bibliography)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

BIBLIOGRAPHY

David I. Bell, Spaceships in Conway's Life. Series of articles posted on comp.theory.cell-automata, Aug-Oct 1992. Now available from his website.

David I. Bell, Speed c/3 Technology in Conway's Life, 17 December 1999. Available from his website.

Elwyn R. Berlekamp, John H. Conway and Richard K. Guy, Winning Ways for your Mathematical Plays, II: Games in Particular. Academic Press, 1982.

David J Buckingham, Some Facts of Life. BYTE, December 1978.

Dave Buckingham, My Experience with B-heptominos in Oscillators. 12 October 1996. Available from Paul Callahan's website.

David J. Buckingham and Paul B. Callahan, Tight Bounds on Periodic Cell Configurations in Life. Experimental Mathematics 7:3 (1998) 221-241. Available at http://tinyurl.com/TightBoundsOnCellConfigs.

Noam D. Elkies, The still-Life density problem and its generalizations, pp228-253 of "Voronoi's Impact on Modern Science, Book I", P. Engel, H. Syta (eds), Institute of Mathematics, Kyiv, 1998 = Vol.21 of Proc. Inst. Math. Nat. Acad. Sci. Ukraine, math.CO/9905194.

Martin Gardner, Wheels, Life, and other Mathematical Amusements. W. H. Freeman and Company, 1983.

R. Wm. Gosper, Exploiting Regularities in Large Cellular Spaces. Physica 10D (1984) 75-80.

N. M. Gotts and P. B. Callahan, Emergent structures in sparse fields of Conway's 'Game of Life', in Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, MIT Press, 1998.

Mark D Niemiec, Life Algorithms. BYTE, January 1979.

William Poundstone, The Recursive Universe. William Morrow and Company Inc., 1985.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_t.htm0000644000175000017500000023662613317135606014355 00000000000000 Life Lexicon (T)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:T = T-tetromino

:table The following induction coil.


OOOO
O..O

:table on table (p1)


O..O
OOOO
....
OOOO
O..O

:tag = tagalong

:tagalong An object which is not a spaceship in its own right, but which can be attached to one or more spaceships to form a larger spaceship. For examples see Canada goose, fly, pushalong, sidecar and sparky. See also Schick engine, which consists of a tagalong attached to two LWSS (or similar).

The following c/4 spaceship (Nicolay Beluchenko, February 2004) has two wings, either of which can be considered as a tagalong. But if either wing is removed, then the remaining wing becomes an essential component of the spaceship, and so is no longer a tagalong.


.......................O.......................
.......................O.......................
......................O.O......................
...............................................
.....................O...O.....................
....................OO...OO....................
..................OO.O...O.OO..................
................OO.O.O...O.O.OO................
............O...OOO.O.....O.OOO...O............
............OOOOOO...........OOOOOO............
...........O..O....O.......O....O..O...........
...................O.......O...................
..........OOO.....................OOO..........
.........O.OO.....................OO.O.........
........O..O.......................O..O........
........O.............................O........
.........OO.........................OO.........
.........OO.........................OO.........
OOO......O...........................O......OOO
.O......OOO.........................OOO......O.
......OO..O.........................O..OO......
..OO.O.OOO...........................OOO.O.OO..
.O...O.O...............................O.O...O.
.O...OO.................................OO...O.

:tail spark A spark at the back of a spaceship. For example, the 1-bit spark at the back of a LWSS, MWSS or HWSS in their less dense phases.

:tame To perturb a dirty reaction using other patterns so as to make it clean and hopefully useful. Or to make a reaction work which would otherwise fail due to unwanted products which interfere with the reaction.

:taming See tame.

:tandem glider Two gliders travelling on parallel lanes at a fixed spacetime offset, usually as a single signal in a Herschel transceiver. See also glider pair.

:Tanner's p46 (p46) An oscillator found by Tanner Jacobi on 20 October 2017. This oscillator hassles an evolving pi-heptomino to produce an phi spark. The spark is very accessible and is able to perturb many things.


..............O...........
...OO.......OO.OO.........
...OO.......OO.OO.....O.OO
......................OO.O
..........................
..OO......................
...O......................
OOO.......................
O.............O...........
.............O.O.O.OO.....
............O.OO.OO.O.....
............O.............
...........OO.............
The snakes can be replaced with eaters to form a slightly smaller version, as shown in the p46 MWSS gun in gliderless

The period of this new oscillator is the same as the old twin bees shuttle, and so this is able to expand the known p46 technology. For example, a p46 glider gun can be made from a Tanner's p46 and just one of the twin bees shuttles.

Acting on their own, two copies of Tanner's p46 placed at right angles to each other with their sparks interacting can produce two different p46 glider guns and a gliderless p46 MWSS gun. See p46 gun and gliderless for two of these. These are the first p46 guns found which do not use a twin bees shuttle at all.

:target A necessary component of a slow salvo recipe used by a single-arm universal constructor. A target usually consists of a single object, or sometimes a small constellation of common still lifes and/or oscillators. See intermediate target. If no hand target is available, a construction arm may be unable to construct anything, unless recipes are available to generate targets directly from the elbow.

:teardrop The following induction coil, or the formation of two beehives that it evolves into after 20 generations. (Compare butterfly, where the beehives are five cells further apart.)


OOO.
O..O
O..O
.OO.

:technician (p5) Found by Dave Buckingham, January 1973.


.....O.....
....O.O....
....OO.....
..OO.......
.O...OOO...
O..OO...O.O
.OO....O.OO
...O.O.O...
...O...O...
....OOO....
......O.O..
.......OO..

:technician finished product = technician

:technology The collective set of known reactions exploiting one subset of the Life universe. Examples of these subsets include glider synthesis, period 30 glider streams, c/3 spaceships, sparkers, Herschel conduits, and slow salvos. As new reactions and objects are found, over time any particular technology becomes more versatile and complete. Many Life experts like to concentrate on particular technologies.

:tee A head-on collision between three gliders, producing a perpendicular output glider that can be used to construct closely spaced glider salvos, or to inject a glider into an existing stream. There are several workable recipes. One of the more useful is the following, because the tandem glider can be generated by a small Herschel converter, SW1T43:


...............O.
..............O..
..............OOO
.........O.......
.........O.O.....
.........OO......
.OO..............
O.O..............
..O..............

:teeth A 65-cell quadratic growth pattern found by Nick Gotts in March 2000. This (and a related 65-cell pattern which Gotts found at about the same time) beat the record previously held by mosquito5 for smallest population known to have superlinear growth, but was later superseded by catacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:telegraph A pattern created by Jason Summers in February 2003. It transmits and receives information using a rare type of reburnable fuse, a lightspeed wire made from a chain of beehives, at the rate of 1440 ticks per bit. The rate of travel of signals through the entire transceiver device can be increased to any speed strictly less than the speed of light by increasing the length of the beehive chain appropriately.

"Telegraph" may also refer to any device that sends and receives lightspeed signals; see also p1 telegraph, high-bandwidth telegraph.

:ternary reaction Any reaction between three objects. In particular, a reaction in which two gliders from one stream and one glider from a crossing stream of the same period annihilate each other. This can be used to combine two glider guns of the same period to produce a new glider gun with double the period.

:test tube baby (p2)


OO....OO
O.O..O.O
..O..O..
..O..O..
...OO...

:tetraplet Any 4-cell polyplet.

:tetromino Any 4-cell polyomino. There are five such objects, shown below. The first is the block, the second is the T-tetromino and the remaining three rapidly evolve into beehives.


OO......OOO......OOOO......OOO......OO.
OO.......O...................O.......OO

:The Online Life-Like CA Soup Search A distributed search effort set up by Nathaniel Johnston in 2009, using a Python script running in Golly. Results included a collection of the longest-lived 20x20 soups, as well as a census of over 174 billion ash objects. It has since been superseded by Catagolue.

:The Recursive Universe A popular science book by William Poundstone (1985) dealing with the nature of the universe, illuminated by parallels with the game of Life. This book brought to a wider audience many of the results that first appeared in LifeLine. It also outlines the proof of the existence of a universal constructor in Life first given in Winning Ways.

:thumb A spark-like protrusion which flicks out in a manner resembling a thumb being flicked. Below on the left is a p9 thumb sparker found by Dean Hickerson in October 1998. On the right is a p4 example found by David Eppstein in June 2000.


.......O..............O.....
...OO...O.........OO...O....
...O.....O.OO.....O.....O...
OO.O.O......O......OOO.O.OO.
OO.O.OO.OOOO............OO.O
...O.O...........OOOOOO....O
...O.O.OOO.......O....OOOOO.
....O.O...O.........O.......
......O..OO........O.OOOO...
......OO...........O.O..O...
....................O.......

:thunderbird (stabilizes at time 243)


OOO
...
.O.
.O.
.O.

:tick = generation

:tic tac toe = octagon II

:tie A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined point to point, as in ship tie boat.

:time bomb The following pattern by Doug Petrie, which is really just a glider-producing switch engine in disguise. See infinite growth for some better examples of a similar nature.


.O...........OO
O.O....O......O
.......O....O..
..O..O...O..O..
..OO......O....
...O...........

:titanic toroidal traveler The superstring with the following repeating segment. The front part becomes p16, but the eventual fate of the detached back part is unknown.


OOOOOO
OOO...

:TL = traffic light

:T-nosed p4 (p4) Found by Robert Wainwright in October 1989. See also filter.


.....O.....
.....O.....
....OOO....
...........
...........
...........
...OOOOO...
..O.OOO.O..
..O.O.O.O..
.OO.O.O.OO.
O..OO.OO..O
OO.......OO

:T-nosed p5 (p5) Found by Nicolay Beluchenko in April 2005.


.....OO...............OO.OO.....O........
..O..O.........OO.O.OOO.OO......O........
.O.O.O.....O....O.O.OOO......OO.O........
O..O.O.OOOOOO.....O....O.O...OO.O........
.OO.O.O..O...OOO..O.OOOO..O.O.OO.OO......
..O.O..OO.O..O..O.OO....OOO.O.O....OO....
.O..O...O..O.O.OO....OOO...O.............
.O.O.O...OOO.O...OOOO...O..O.O..OO.O..O..
OO.O.........OO.O....O.O.O.O........O.OOO
.O.O.O...OOO.O...OOOO...O..O.O..OO.O..O..
.O..O...O..O.O.OO....OOO...O.............
..O.O..OO.O..O..O.OO....OOO.O.O....OO....
.OO.O.O..O...OOO..O.OOOO..O.O.OO.OO......
O..O.O.OOOOOO.....O....O.O...OO.O........
.O.O.O.....O....O.O.OOO......OO.O........
..O..O.........OO.O.OOO.OO......O........
.....OO...............OO.OO.....O........

:T-nosed p6 (p6) Found by Achim Flammenkamp in September 1994. There is also a much larger and fully symmetric version found by Flammenkamp in August 1994.


......OO...OO......
......O.O.O.O......
.......O...O.......
...................
..O.O.O.....O.O.O..
OOO.O.OO...OO.O.OOO
..O.O.O.....O.O.O..
...................
.......O...O.......
......O.O.O.O......
......OO...OO......

:toad (p2) Found by Simon Norton, May 1970. This is the second most common oscillator, although blinkers are more than a hundred times as frequent. See also killer toads. A toad can be used as a 90-degree one-time turner.


.OOO
OOO.

The protruding cells at the edges can perturb some reactions by encouraging and then suppressing births on successive ticks. For example, a toad can replace the northwest eater in the Callahan G-to-H converter, allowing it to be packed one diagonal cell closer to other circuits.

:toad-flipper A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to flip it over. When the sparks are applied again it is flipped back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-flipper will still work, but because of symmetry there are really only two different types. Compare toad-sucker.


.O..............O.
.O..............O.
O.O............O.O
.O..............O.
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O.....O.O
.O..............O.
.O..............O.

:toad-sucker A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to shift it. When the sparks are applied again it is shifted back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-sucker will still work, but because of symmetry there are really only three different types. Compare toad-flipper.


.O................
.O..............O.
O.O.............O.
.O.............O.O
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O......O.
.O.............O.O
.O..............O.
................O.

:toaster (p5) Found by Dean Hickerson, April 1992.


....O......OO..
...O.O.OO..O...
...O.O.O.O.O...
..OO.O...O.OO..
O...OO.O.OO...O
...O.......O...
...O.......O...
O...OO.O.OO...O
..OO.O...O.OO..
...O.O.O.O.O...
...O.O.OO..O...
....O......OO..

:toggleable gun Any gun that can be turned off or turned on by the same external signal - the simplest possible switching mechanism. An input signal causes the gun to stop producing gliders. Another input signal from the same source restores the gun to its original function. Compare switchable gun.

Here's a small example by Dean Hickerson from September 1996:


..............OO..............O..
..............O.O.............O.O
..............O...............OO.
.................................
.................................
.................................
.................................
...............O..O....b.........
.OOOO..............O..b..........
O...O..........O...O..bbb........
....O...........OOOO.............
O..O........................aaa..
............................a....
.............................a...
In the figure above, glider B and an LWSS are about to send a glider NW. Glider A will delete the next glider after B, turning off the output stream. But if the device were already off, B wouldn't be present and A would instead delete the leading LWSS, turning the device back on.

:toggle circuit Any signal-processing circuit that switches back and forth between two possible states or outputs. An early example is the boat-bit. More recent discoveries include the semi-Snarks, which alternate between reflecting and absorbing input gliders. The following B-to-G converter sends alternate glider outputs in opposite directions.


...........OO....................................OO....
......OO..O.O...............................OO..O.O....
......O...O....O............................O...O....O.
.......OOO.OOOOO.............................OOO.OOOOO.
.........O.O...................................O.O.....
.........O.O.OOO...............................O.O.OOO.
..........OO.O..O...............................OO.O..O
...............OO....................................OO
.......................................................
.......................................................
.............................................OO........
.............................................OO........
.......................................................
.......................................................
.......................................................
OO....................................OO...............
OO....................................OO...............
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.........OO....................................OO......
.........OO....................................OO......
.......................................................
OO.O.......O..........................OO.O.......O.....
O.OO......OOO.........................O.OO......OOO....
.........OO..O.................................OO..O...

:TOLLCASS Acronym for The Online Life-Like CA Soup Search.

:toolkit A set of Life reactions and mechanisms that can be used to solve any problem in a specific pre-defined class of problems: glider timing adjustment, salvo creation, seed construction, etc. See also universal toolkit, technology.

:torus As applies to Life, usually means a finite Life universe which takes the form of an m x n rectangle with the bottom edge considered to be joined to the top edge and the left edge joined to the right edge, so that the universe is topologically a torus. There are also other less obvious ways of obtaining a toroidal universe.

See also Klein bottle. Every object in a torus universe obviously either dies or becomes a still life or oscillator.

:total aperiodic Any finite pattern which evolves in such a way that no cell in the Life plane is eventually periodic. The first example was found by Bill Gosper in November 1997. A few days later he found the following much smaller example consisting of three copies of a p12 backrake by Dave Buckingham.


.........................................O.................
........................................OOO................
.......................................OO.O.....O..........
.......................................OOO.....OOO.........
........................................OO....O..OO...OOO..
..............................................OOO....O..O..
........................................................O..
........................................................O..
........................................................O..
........................................OOO............O...
........................................O..O...............
........................................O..................
........................................O..................
.........................................O.................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
......................................OOO..................
......................................O..O...........O.....
......................................O.............OOO....
......................................O............OO.O....
......................................O............OOO.....
.......................................O............OO.....
...........................................................
...........................................................
...................................OOO.....................
..................................OOOOO....................
..................................OOO.OO.......OO........O.
.....................................OO.......OOOO........O
..............................................OO.OO...O...O
................................................OO.....OOOO
...........................................................
...........................................................
....................O......................................
.....................O.....................................
.OO.............O....O................................OOO..
OOOO.............OOOOO..................................O..
OO.OO...................................................O..
..OO...................................................O...
....................................O......................
.....................................O.....................
.....................OO..........O...O.....................
......................OO..........OOOO...............OO....
.....................OO...........................OOO.OO...
.....................O............................OOOOO....
...................................................OOO.....
...........................................................
......................OO...................................
.............OOOO....OOOO..................................
............O...O....OO.OO.................................
.OOOOO..........O......OO..................................
O....O.........O...........................................
.....O.....................................................
....O......................................................

:T-pentomino Conway's name for the following pentomino, which is a common parent of the T-tetromino.


OOO
.O.
.O.

:track A path made out of conduits, often ending where it begins so that the active signal object is cycled forever, forming an oscillator or a gun.

This term has also been used to refer to the lane on which a glider or spaceship travels. The concept is very similar, but a reference to a "track" now usually implies a non-trivial supporting conduit.

:tractor beam A stream of spaceships that can draw an object towards the source of the stream. The example below shows a tractor beam pulling a loaf; this was used by Dean Hickerson to construct a sawtooth.


.....................O..O......................
.....OOOO...........O..............OOOO........
.....O...O..........O...O..........O...O.......
.....O........OO....OOOO...........O........OO.
.OO...O..O...OOOO...........OO......O..O...OOOO
O..O........OO.OO..........OO.OO..........OO.OO
O.O..........OO.............OOOO...........OO..
.O...........................OO................

:traffic circle (p100)


.....................OO....OO...................
.....................O.O..O.O...................
.......................O..O.....................
......................OO..OO....................
.....................OOO..OOO...................
.......................O..O.....................
...............................O................
..............................O.OO..............
..................................O.............
..........................O...O..O.O............
..........................O.....O..O............
..........................O......OO.............
.........OO.....................................
........O..O..........OOO...OOO.................
.......O.O.O....................................
......OOO.O...............O.....................
......OOO.................O.....................
..........................O.....................
............OOO.................................
OO..O................OOO........................
O..OO.....O.....O...............................
.OOOOO....O.....O..O.....O.................O..OO
..........O.....O..O.....O.................OO..O
...................O.....O.......OOO......OOOOO.
.OOOOO......OOO.................................
O..OO................OOO.......O.....O..........
OO..O..........................O.....O....OOOOO.
...............................O.....O.....OO..O
...........................................O..OO
.................................OOO............
.......................................OO.......
......................................OOO.......
.....................................O.OO.......
....................................O.O.........
....................OOO.............O..O........
.....................................OO.........
.............OO....O..O.........................
............O..O................................
............O.O.O...............................
.............O..O...............................
.................O..............................
..............O.O...............................
.....................O..O.......................
...................OOO..OOO.....................
....................OO..OO......................
.....................O..O.......................
...................O.O..O.O.....................
...................OO....OO.....................

:traffic jam Any traffic light hassler, such as traffic circle. The term is also applied to the following reaction, used in most traffic light hasslers, in which two traffic lights interact in such a way as to reappear after 25 generations with an extra 6 spaces between them. See traffic lights extruder for a way to make this reaction extensible.


..OOO...........
...........OOO..
O.....O.........
O.....O..O.....O
O.....O..O.....O
.........O.....O
..OOO...........
...........OOO..

:traffic light (p2) A common formation of four blinkers.


..OOO..
.......
O.....O
O.....O
O.....O
.......
..OOO..

:traffic lights extruder A growing pattern constructed by Jason Summers in October 2006, which slowly creates an outward-growing chain of traffic lights. The growth occurs in waves which travel through the chain from one end to the other. It can be thought of as a complex fencepost for a wick that does not need a wickstretcher.

The following illustrates the reaction used, in which a newly created traffic light at the left eventually pushes the rightmost one slightly to the right.


......................O.......................O....
......................O.......................O....
.........OOO..........O..........OOO..........O....
.OO................................................
OOO....O.....O....OOO...OOO....O.....O....OOO...OOO
.OO....O.....O.................O.....O.............
.......O.....O........O........O.....O........O....
......................O.......................O....
.........OOO..........O..........OOO..........O....

:trans-beacon on table (p2)


....OO
.....O
..O...
..OO..
......
OOOO..
O..O..

:trans-boat with tail (p1)


OO...
O.O..
.O.O.
...O.
...OO

:transceiver = Herschel transceiver.

:trans-loaf with tail (p1)


.O....
O.O...
O..O..
.OO.O.
....O.
....OO

:transmitter = Herschel transmitter.

:transparent In signal circuitry, a term used for a catalyst that is completely destroyed by the passing signal, then rebuilt. Often (though not always) the active reaction passes directly through the area occupied by the transparent catalyst, then rebuilds the catalyst behind itself, as in the transparent block reaction. See also transparent lane.

:transparent block reaction A certain reaction between a block and a Herschel predecessor in which the block reappears in its original place some time later, the reaction having effectively passed through it. This reaction was found by Dave Buckingham in 1988. It has been used in some Herschel conduits, and in the gunstars. Because the reaction involves a Herschel predecessor rather than an actual Herschel, the following diagram shows instead a B-heptomino (which by itself would evolve into a block and a Herschel).


O.............
OO..........OO
.OO.........OO
OO............

:transparent debris effect A mechanism where a Herschel or other active reaction completely destroys a catalyst in a particular location in a conduit. After passing through or past that location, the same reaction then recreates the catalyst in exactly its original position. This type of catalysis is surprisingly common in signal circuitry. For an example, see transparent block reaction.

The transparent object is most often a very common still life such as a block or beehive. Rarer objects are not unknown; for example, a transparent loaf was found by Stephen Silver in October 1997, in a very useful elementary conduit making up part of a Herschel receiver. However, not surprisingly, rarer objects are much less likely to reappear in exactly the correct location and orientation, so transparent reactions involving them are much more difficult to find, on average.

:transparent lane A path through a signal-producing circuit that can be used to merge signal streams. The signal is usually a standard spaceship such as a glider. It can either be produced by the circuit, or it can come from elsewhere, passing safely through on the same lane without interacting with the circuit. A good example is the NW31 converter, which has two glider outputs on transparent lanes:


OO.......................
.O.......................
.O.O.....................
..OO.....................
.........................
.........................
.........................
.......................OO
.......................OO
.........................
..O......................
..O.O....................
..OOO....................
....O....................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.............OO..........
.............OO..........

The optional third output shown in NW31 is non-transparent, because the upper eater1 catalyst would get in the way of a passing glider on the same lane.

:tremi-Snark A colour-preserving period-multiplying signal conduit found by Tanner Jacobi on 7 September 2017, producing one output glider for every three input gliders. It uses the same block-to-pre-honeyfarm bait reaction as the Snark, and so has the same 43-tick recovery time. Compare semi-Snark.


.O............................
..O...........................
OOO...........................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
...........O..................
............OO................
...........OO.................
..............................
...........................O..
.........................OOO..
........................O.....
........................OO....
..............................
..............................
..............................
.......................O......
.....................O.O......
......................OO......
..............OO..............
.............O.O........O.....
.............O.........O.O....
............OO.........O.O....
........................O.....
..............................
..............................
..............................
.....................OO.OO....
.................OO..OO.O...OO
.................O......O.O..O
..................OOOOOOO.OO..
.........................O....
....................OOOO.O....
....................O..OO.....

:trice tongs (p3) Found by Robert Wainwright, February 1982. In terms of its 7x7 bounding box this ties with jam as the smallest p3 oscillator.


..O....
..OOO..
OO...O.
.O.O.O.
.O.....
..OO..O
.....OO

:trigger A signal, usually a single glider, that collides with a seed constellation to produce a relatively rare still life or oscillator, or an output spaceship or other signal. The constellation is destroyed or damaged in the process; compare circuit, reflector. Here a pair of trigger gliders strike a dirty seed constellation assembled by Chris Cain in March 2015, to launch a three-engine Cordership:


....................................................OO.
................................................OO..OO.
................................................OO.....
.......................................................
.......................................................
.......................................................
........................................OO.............
........................................OO.............
...................................................OO..
..................................O................O.O.
.................................O.O...........OO...O.O
..................................OO..........O.O....O.
...............................................O.......
.......................................................
..................................O.................OOO
.................................O.O................O..
..................................OO.................O.
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
.......................................................
...........................O...........................
..........................O.O..........................
...........................OO..........................
.......................................................
.......................................................
...........................O...........................
..........................O.O..........................
...........................OO..........................
.......................................................
.......................................................
.......................................................
.......................................................
.......O....O..........................................
......O.O..O.O.........................................
.......OO...OO.........................................
.......................................................
.......................................................
.......................................................
.......................................................
OO.....................................................
O.O....................................................
.O.O...................................................
..O....................................................
.......................................................
.......................................................
.......................................................
.............O.........................................
............OO.........................................
............O.O........................................

"Trigger" is also used when a spaceship reacts with another object to cause a reaction to occur whenever desired (but perhaps only at particular intervals). The object being triggered lies dormant until the reaction is required. All turners and freeze-dried constellations are triggerable.

In some cases the object is not destroyed so that the reaction can be repeated after some repeat time. See for example converter and reflector, and more specifically MWSS out of the blue and queen bee shuttle pair.

:triomino Either of the two 3-cell polyominoes. The term is rarely used in Life, since the two objects in question are simply the blinker and the pre-block.

:triple caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and double caterer.


.....OO.........
....O..O..OO....
....OO.O...O....
......O.OOO....O
..OOO.O.O....OOO
.O..O..O....O...
O.O..O...O..OO..
.O..............
..OO.OO.OO.OO...
...O...O...O....
...O...O...O....

:triple pseudo The following pattern, found by Gabriel Nivasch in July 2001. It is unique among 32-bit still lifes in that it can be broken down into three stable pieces but not into two. The term may also refer to any larger stable pattern with the same property. See also quad pseudo.


......OO
..O.O..O
.O.OO.O.
.O....OO
OO.OO...
...OO.OO
OO....O.
.O.OO.O.
O..O.O..
OO......

:triplet Any 3-cell polyplet. There are 5 such objects, shown below. The first two are the two triominoes, and the other three vanish in two generations.


O..................O.......O.......O..
OO......OOO......OO.......O.O.......O.
.....................................O

:tripole (p2) The barberpole of length 3.


OO....
O.O...
......
..O.O.
.....O
....OO

:tritoad (p3) Found by Dave Buckingham, October 1977.


.........OO.......
.........O........
..........O..OO...
.......OOO.O..O...
......O....OO.O.OO
......O.OO..O.O.OO
...OO.O...OO..O...
...O..OO...O.OO...
OO.O.O..OO.O......
OO.O.OO....O......
...O..O.OOO.......
...OO..O..........
........O.........
.......OO.........

:trivial A trivial period-N oscillator is one in which every cell oscillates at some smaller factor of N. See omniperiodic. For example, the joining of a period 3 and a period 4 oscillator as shown below creates a single object which is a trivial oscillator of period 12.


........O.O.
...........O
.......O..O.
......O.O.O.
......O..O..
....OO.OO...
...O..O.....
....O.O.....
OO...O......
.O.OO.......
...O........
...O........
However, there are trivial oscillators that meet this requirement, but may still be considered to be non-trivial because the different-period rotors are not separated by stator cells. An example is Dean Hickerson's trivial p6. Conversely, there are oscillators formed by trivial combinations of high-period guns or sparkers that are only technically non-trivial, because the lower-period components overlap but do not interact in any way.

"Trivial" is also used to describe a parent of an object which has groups of cells that can be removed without changing the result, such as isolated faraway cells. For example, here is a trivial parent of a block.


O......
.O....O
.O.....
O......

:trivial p6 (p6) An oscillator found by Dean Hickerson in December 1994. Every cell has period less than 6, so this is a trivial oscillator. It is unusual because it has period-2 cells in contact with period-3 cells.


...........OO..............
...........O......OO.......
........OO.O......O..O.....
........O.O.OO.OO.O.OO..O..
.O........O..O.O..O..O.O.O.
.O.O.....OO..O.O.O.OO..O..O
.O.O.O........OO.O.O.OO.OO.
.......O.O.OOO...O....OO...
..O...O....O.OO........O...
....O...OOO..OO.OOO.O.O.OO.
OO..O......O..........O.O..
..O...........OO.OO...O.O..
........O.OOOOO...O....O...
........OO...O..O..O.......
...........OOOO.OOO........
........OOO....O...........
........O..O..O..OO........
..........OO...OO.O........

:trombone slide An arrangement of four 90-degree reflectors that can be placed into the path of a glider so as to delay it by an adjustable number of generations, without changing its lane. More generally, any combination of circuits may be referred to as a trombone slide, if the grouping can be moved as a single unit that functions as a 180-degree glider reflector.

The smallest known trombone slides are made using Snarks. In the trombone slide shown below, sample input and output gliders are shown. The input glider will reach the same output location 128 generations sooner if the trombone slide is removed.

If the top and left Snarks are moved together diagonally to the upper left by N cells, then the glider delay is increased by 8N generations since the glider has to travel N more cells in each direction. This sliding action gives the trombone slide its name. If only the final Snark is moved, then the output glider's path can be altered by a number of full diagonals.


......................OO...OO....................
......................OO..O.OOO..................
..........................O....O.................
......................OOOO.OO..O.................
......................O..O.O.O.OO................
.........................O.O.O.O.................
..........................OO.O.O.................
..............................O..................
.................................................
................OO...............................
.................O.......OO......................
.................O.O.....OO......................
..................OO.............................
.................................................
.................................................
.............................................O...
...........................................OOO...
..........................................O......
..........................................OO.....
............................OO...................
............................O....................
.............................OOO..............OOO
...............................O................O
...............................................O.
.................................................
................................OO...............
....O..........................O.O.....OO........
..OOOOO..............OO........O.......OO........
.O.....O.............O........OO.................
.O..OOO............O.O...........................
OO.O...............OO.......................O....
O..OOOO.................................OO.O.O...
.OO...O...OO...........................O.O.O.O...
...OOO....OO........................O..O.O.O.OO..
...O................................OOOO.OO..O...
OO.O....................................O....O...
OO.OO...............................OO..O.OOO....
....................................OO...OO......
.................................................
...........OO....................................
............O....................O...............
.........OOO...OO..............OOOOO.............
.........O......O.............O.....O............
................O.O............OOO..O............
.................OO...............O.OO...........
...............................OOOO..O...........
..........................OO...O...OO............
..........................OO....OOO..............
..................................O..............
..................................O.OO...........
.................................OO.OO...........
.................................................
.................................................
..............OOO........OO......................
................O........O.......................
...............O..........OOO....................
............................O....................

Trombone slides made of the same type of component cannot alter the glider path by half-diagonals, and can only change the timing by multiples of 8 generations. For other timing changes, different components are necessary. These may be stable like the Silver reflector or the colour-changing example shown in the reflector article, or periodic like the various bumpers.

:true Opposite of pseudo. A gun emitting a period n stream of spaceships (or rakes) is said to be a true period n gun if its mechanism oscillates with period n. The same distinction between true and pseudo also exists for puffers. An easy way to check that a gun is true period n is to stop the output with an eater, and check that the result is a period-n oscillator.

True period n guns are known to exist for all periods greater than 61 (see My Experience with B-heptominos in Oscillators), but only a few smaller periods have been achieved, namely 20, 22, 24, 30, 36, 40, 44, 45, 46, 48, 50, and 54 through 61. See also Quetzal for the 54-61 range.

  ------------------------------------
  Period  Discoverers            Date
  ------------------------------------
  20      Matthias Merzenich  May 2013
          Noam Elkies
  22      David Eppstein      Aug 2000
          Jason Summers
  24      Noam Elkies         Jun 1997
  30      Bill Gosper         Nov 1970
  36      Jason Summers       Jul 2004
  40      Adam P. Goucher     Mar 2013
          Matthias Merzenich
          Jason Summers
  44      Dave Buckingham     Apr 1992
  45      Matthias Merzenich  Apr 2010
  46      Bill Gosper             1971
  48      Noam Elkies         Jun 1997
  50      Dean Hickerson      Oct 1996
          Noam Elkies
          Dave Buckingham
  54      Dieter Leithner     Jan 1998
          Noam Elkies
          Dave Buckingham
  55      Stephen Silver      Oct 1998
  56      Dieter Leithner     Jan 1998
          Dave Buckingham
          Noam Elkies
  57      Matthias Merzenich  Apr 2016
  58      'thunk'             Apr 2016
          Matthias Merzenich
          Chris Cain
  59      Adam P. Goucher     Dec 2009
          Jason Summers
  60      Bill Gosper         Nov 1970
  61      Luka Okanishi       Apr 2016
  ------------------------------------

:T-tetromino The following common predecessor of a traffic light.


OOO
.O.

:tub (p1)


.O.
O.O
.O.

:tubber (p3) Found by Robert Wainwright before June 1972.


....O.O......
....OO.O.....
.......OOO...
....OO....O..
OO.O..OO..O..
.O.O....O.OO.
O...O...O...O
.OO.O....O.O.
..O..OO..O.OO
..O....OO....
...OOO.......
.....O.OO....
......O.O....

:tubeater A pattern that consumes the output of a tubstretcher. The smallest known tubeater was found by Nicolay Beluchenko (September 2005), and is shown below in conjunction with the smallest known tubstretcher.


........O....................
.......OO....................
.......O.O...................
.............................
..........OO.................
..........OO.................
.......................OOO...
.O......OO...O.........O.....
OO.....O..O.O.O.........O....
O.O...OO.O...O.O..........OOO
....O.........O.O............
...O...........O.O.....OO....
...O..O.........O.O....O.O.O.
.................O.O...O...OO
..................O.....O....
...................O..OO..O..
.....................O.OOOO..
......................OOO...O
..........................OO.
...........................O.
...........................OO
..........................O..
...........................OO

:tubstretcher Any wickstretcher in which the wick is two diagonal lines of cells forming, successively, a tub, a barge, a long barge, etc. The first one was found by Hartmut Holzwart in June 1993, although at the time this was considered to be a boatstretcher (as it was shown with an extra cell, making the tub into a boat). The following small example is by Nicolay Beluchenko (August 2005), using a quarter.


.......OOO.....
.......O.......
........O......
..........OO...
...........O...
...............
........OO...O.
OOO.....OO..O.O
O......O.O...O.
.O....OO.......
...OOOO.O......
....OO.........

In October 2005, David Bell constructed an adjustable high-period diagonal c/4 rake that burns tubstretcher wicks to create gliders, which are then turned and duplicated by convoys of diagonal c/4 spaceships to re-ignite the stabilized ends of the same wicks.

:tub with tail (p1) The following 8-cell still life. See eater for a use of this object.


.O...
O.O..
.O.O.
...O.
...OO

:tugalong = tagalong

:tumbler (p14) The smallest known p14 oscillator. Found by George Collins in 1970. The oscillator generates domino sparks, but they are fragile and no use has been found for them to date. In each domino, one cell is "held" (remains alive) for two generations, the other for three. By contrast, useful domino sparks are usually alive for only one tick per oscillator period.


.O.....O.
O.O...O.O
O..O.O..O
..O...O..
..OO.OO..

:tumbling T-tetson (p8) A T-tetromino hassled by two figure-8s. Found by Robert Wainwright.


.OOO.................
O..................OO
O...O............O.OO
O..O.O..........O....
..O.O..O...........O.
...O...O.......OO.O..
.......O.......OO....
....OOO....O.........
.........OO..........
...........O.........

:Turing machine See universal computer.

:turner A one-time glider reflector, or in other words a single-glider seed (the term is seldom or never used in relation to spaceships other than gliders). One-time turners may be 90-degree or 180-degree, or they may be 0-degree with the output in the same direction as the input. A reusable turner would instead be called a reflector. Shown on the top row below are the four 90-degree turner reactions that use common small ash objects: boat, eater1, long boat, and toad.


.O..............O..............O..............O.........
..O..............O..............O..............O........
OOO............OOO............OOO............OOO........
........................................................
........................................................
........................................................
.....OO........OO...............O.......................
....O.O.......O.O..............O.O...............OOO....
.....O........O.................O.O...............OOO...
.............OO..................OO.....................
........................................................
........................................................
........................................................
........................................................
........................................................
.O..............O..............O..............O.........
..O..............O..............O....OO........O........
OOO............OOO............OOO....OO......OOO........
......................................................OO
......................................................OO
........................................................
...O...............OO...................................
..O.O.............O.O............OO..............OO.....
.O.O.............O.O.............OO..............OO.....
.OO..............OO.....................................
........................................................
........................................................
........................................................
........................................................
........................................................
.O......................................................
..O.....................................................
OOO.....................................................
........................................................
........................................................
........................................................
....OO..................................................
..O..O..................................................
..OO....................................................

Of the reactions on the first row, the glider output is the same parity for all but the long boat. The three still lifes are all colour-changing, but the toad happens to be a colour-preserving turner. The third row shows an aircraft carrier serving as a "0-degree turner" that is also colour-changing.

Three of the simplest 180-degree turners are shown in the second row. The Blockic 180-degree turner is colour-preserving. The long boat and long ship are again colour-changing; this is somewhat counterintuitive as the output glider is on exactly the same lane as the input glider, but gliders travelling in opposite directions on the same lane always have opposite colours.

Many small one-time turner constellations have also been catalogued. The 90-degree two-block turner on the right, directly below the toad, is also colour-changing but has the opposite parity.

A one-time turner reaction can be used as part of a glider injection mechanism, or as a switching mechanism for a signal. If a previous reaction has created the sacrificial object, then a later glider is turned onto a new path. Otherwise it passes through the area unaffected. This is one way to create simple switching systems or logic circuits. An example is shown in demultiplexer.

:turning toads (p4 wick) Found by Dean Hickerson, October 1989.


..............OO.....OO.....OO.....OO.....OO..............
.......O.....O......O......O......O......O................
......OO...O....O.O....O.O....O.O....O.O....O.O.O.OO......
..OO.O.OOO.O..OO..O..OO..O..OO..O..OO..O..OO..O..O..O.OO..
O..O.OO.........................................OOOOO.O..O
OO.O..............................................OO..O.OO
...O..................................................O...
...OO................................................OO...

:turtle (c/3 orthogonally, p3) A spaceship found by Dean Hickerson in August 1989 that produces a domino spark at the back. Hickerson used this spark to convert an approaching HWSS into a loaf, as part of the first sawtooth. (Also see tractor beam). The shape of the back end of the turtle is distinctive. Very similar but wider back ends have been found in other c/3 ships to produce period 9 and 15 spaceships.


.OOO.......O
.OO..O.OO.OO
...OOO....O.
.O..O.O...O.
O....O....O.
O....O....O.
.O..O.O...O.
...OOO....O.
.OO..O.OO.OO
.OOO.......O

:twin bees shuttle (p46) Found by Bill Gosper in 1971, this was the basis of all known true p46 guns, and all known p46 oscillators except for glider signal loops using Snarks, until the discovery of Tanner's p46 in 2017. See new gun for an example. There are numerous ways to stabilize the ends, two of which are shown in the diagram. On the left is David Bell's double block reaction (which results in a shorter, but wider, shuttle than usual), and on the right is the stabilization by a single block. This latter method produces the very large twin bees shuttle spark which is useful in a number of ways. See metamorphosis for an example. Adding a symmetrically placed block below this one suppresses the spark. See also p54 shuttle.


.OO........................
.OO........................
...........................
...............O...........
OO.............OO........OO
OO..............OO.......OO
...........OO..OO..........
...........................
...........................
...........................
...........OO..OO..........
OO..............OO.........
OO.............OO..........
...............O...........
...........................
.OO........................
.OO........................

:twin bees shuttle pair Any arrangement of two twin bees shuttles such that they interact. There are many ways that the two shuttles can be placed, either head-to-head, or else at right angles. Glider guns can be constructed in at least five different ways. Here is one by Bill Gosper in which the shuttles interact head-to-head:


.................O...............................
OO...............OO..............................
OO................OO.............................
.................OO...........OO.................
.............................O.O.................
.............................O...................
.............................OOO.................
.................OO..............................
..................OO.............................
.................OO..............................
.................O...........OOO.................
.............................O.................OO
.............................O.O...............OO
..............................OO.................
For other examples, see new gun, edge shooter, double-barrelled and natural Heisenburp.

:twin bees shuttle spark The large and distinctive long-lived spark produced, most commonly, by the twin bees shuttle. It starts off as shown below.


..OO.
..OO.
.O..O
O.OO.
O.OO.
After 3 generations it becomes symmetric along the horizontal axis, after 9 generations it becomes symmetric along the vertical axis also, and finally dies after 18 generations.

Since the spark is isolated and long-lived, there are many possible perturbations that it can perform. One of the most useful is demonstrated in metamorphosis where a glider is converted into a LWSS. Another useful one can turn a LWSS by 90 degrees:


O..O.........
....O........
O...O.....O..
.OOOO....OOO.
........O...O
........OO.OO
........OO.OO
.............
........OO.OO
........OO.OO
........O...O
.........OOO.
..........O..

:twinhat (p1) See also hat and sesquihat.


..O...O..
.O.O.O.O.
.O.O.O.O.
OO.O.O.OO
....O....

:twin peaks = twinhat

:twirling T-tetsons II (p60) Found by Robert Wainwright. This is a pre-pulsar hassled by killer toads.


.......OO...OO..........
......O.......O.........
.........O.O............
.......OO...OO..........
........................
........................
........................
.....................OOO
....................OOO.
.............O..........
OOO.........OOO.........
.OOO....................
....................OOO.
.....................OOO
........................
.OOO....................
OOO.........OOO.........
.............O..........
........................
........................
..........OO...OO.......
............O.O.........
.........O.......O......
..........OO...OO.......

:TWIT = eater5

:two-arm The type of universal constructor exemplified by the original Gemini spaceship, where two independently programmed construction arms sent gliders in pairs on 90-degree paths to collide with each other at the construction site. Construction recipes for two-arm constructors are much more efficient in general, but they require many more circuits and multiple independent data streams, which both tend to increase the complexity of self-constructing circuitry. Compare single-arm.

:two-bit spark = duoplet.

:two eaters (p3) Found by Bill Gosper, September 1971.


OO.......
.O.......
.O.O.....
..OO.....
.....OO..
.....O.O.
.......O.
.......OO

:two pulsar quadrants (p3) Found by Dave Buckingham, July 1973. Compare pulsar quadrant.


....O....
....O....
...OO....
..O......
O..O..OOO
O...O.O..
O....O...
.........
..OOO....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_w.htm0000755000175000017500000006055513317135606014357 00000000000000 Life Lexicon (W)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Wainwright's tagalong A small p4 c/4 diagonal tagalong that has 7 cells in every phase. It is shown here attached to the back of a Canada goose.


OOO.............
O.........OO....
.O......OOO.O...
...OO..OO.......
....O...........
........O.....O.
....OO...O...OO.
...O.O.OO....O.O
...O.O..O.OO.O..
..O....OO.....O.
..OO............
..OO............

:washerwoman (2c/3 p18 fuse) A fuse discovered by Earl Abbe, published in LifeLine Vol 3, September 1971.


O.......................................................
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
OOO..O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
O.......................................................

:washing machine (p2) Found by Robert Wainwright before June 1972.


.OO.OO.
O.OO..O
OO....O
.O...O.
O....OO
O..OO.O
.OO.OO.

:wasp (c/3 orthogonally, p3) The following spaceship which produces a domino spark at the back. It is useful for perturbing other objects. Found by David Bell, March 1998.


..........OO.OO.......
........OO.O.OO.OO....
.....OOO.O..OOO..OOOO.
.OOO....OOO.....O....O
O.O.O.OOO.O........OO.
O.O.O.OOOO............
.O.O....O..O..........
..........O...........
..O...................
..O...................

:waterbear ((23,5)c/79 obliquely, p158) A self-supporting oblique macro-spaceship constructed by Brett Berger on December 28, 2014. It is currently the fastest oblique macro-spaceship in Conway's Game of Life by several orders of magnitude, and is also the smallest known oblique macro-spaceship in terms of bounding box, superseding the Parallel HBK. It is no longer the smallest or fastest oblique spaceship due to the discovery in 2018 of the elementary knightship Sir Robin.

Previous oblique spaceships, the Gemini and the half-baked knightships, are stationary throughout almost all of their life cycles, as they construct the necessary mechanisms to support a sudden short move. The waterbear constructs support for reburnable fuse reactions involving (23,5)c/79 Herschel climbers that are in constant motion.

:wave A wick-like structure attached at both ends to moving spaceship-like patterns, in such a way that the entire pattern is mobile. Especially if the wave gets longer over time, the supporting patterns are wavestretchers.

Also, the gliders or spaceships emitted by a rake may be referred to as a wave, again because the line as a whole appears to move in a different direction from the individual components, due to the rake's movement. Compare with stream.

In general a wave can be interpreted as moving at a variety of different velocities, depending on which specific subcomponents are chosen as the starting and ending points for calculating speed and direction. See antstretcher, wavestretcher for a practical example of identical wave ends being connected to spaceships with different velocities.

:wavefront (p4) Found by Dave Buckingham, 1976 or earlier.


........OO...
........O....
.........O...
........OO...
.....OO...OO.
....O..OOO..O
....O.....OO.
.....O...O...
OO.O.O...O...
O.OO.O.OO....
....O.O......
....O.O......
.....O.......

:waveguide = superstring.

:wavestretcher A spaceship pattern that supports a connection to an extensible periodic wick-like structure, whose speed and/or direction of propagation are different from those of the wavestretcher spaceship.

Connecting the following to a standard diagonal antstretcher creates a new oblique wavestretcher (a type of growing spaceship) and also an alternate space nonfiller mechanism.


.......................................................O.....
.......................................................OO....
.....................................................O..O....
....................................................O........
.................................................OO..O.......
................................................O..O.........
.................................................O...........
.............................................O...OO..........
............................................O.OO.............
...........................................OO..O.............
...........................................OO.OO.............
...........................................O..O..OO..........
..........................................OO......OO.........
...........................................O.OO.O.OO.........
..........................................O.OOO.O............
..........................................O.O.O.O............
.............................................................
........................................O...O................
.......................................OO....................
.....................................OOO..O..................
..................................OO.OO......................
...................................O.........................
....................................O.O......................
...................................O.........................
...................................O..O......................
..................................O..........................
.....................................O.......................
..................................OOOO.......................
................................O.OO.O.......................
.....................................O.......................
................................O............................
.................................O..O........................
...................................O.........................
.........................O....OOO....................OOO.....
OO......................O.OOO....O......................O...O
..OO.OO.................O..O....O....................O...O...
..OO...OO.OO...............O..O................OO.O...O.OOOO.
OO.....OO...OO.OO.........OO.OOO...OO..OO.OOO.O....O.....O..O
.....OO.....OO...OO.OO......O.OO..O.O..OOO.OO.O.O...O......O.
..........OO.....OO...OO.O...O....O.O.O..OO..O..O...OOOO.....
...............OO.....OO..O.O.OO..O..O.......................
....................OO...........O....O..........OO...OO.....
.......................................O..........O..........
....................................O........................
....................................OO.......................
A required supporting c/5 spark is shown at the right edge. It can be supplied by a spider or another c/5 orthogonal spaceship with a similar edge spark. Alternatively, the c/5 component could theoretically be replaced by a supporting spaceship travelling diagonally at c/6, to support the same oblique trail of ants. As of June 2018 no workable c/6 component has been found.

:wedge A 26-cell quadratic growth pattern found by Nick Gotts in March 2006, based on ideas found in metacatacryst and Gotts dots. It held the record for the smallest-population quadratic growth pattern for eight years, until it was surpassed by 25-cell quadratic growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:wedge grow = wedge.

:weekender (2c/7 orthogonally, p7) Found by David Eppstein in January 2000. In April 2000 Stephen Silver found a tagalong for a pair of weekenders. At present, n weekenders pulling n-1 tagalongs constitute the only known spaceships of this speed or period, except for variants of the weekender distaff that suppress its output gliders.


.O............O.
.O............O.
O.O..........O.O
.O............O.
.O............O.
..O...OOOO...O..
......OOOO......
..OOOO....OOOO..
................
....O......O....
.....OO..OO.....

:weekender distaff (2c/7, p16982) The first orthogonal 2c/7 rake, constructed by Ivan Fomichev on May 22nd, 2014. It uses the weak sparks from weekenders to perturb an LWSS into an active reaction in a variable-period loop, which produces a series of slow salvo gliders that finally rebuilds the LWSS.

:weld To join two or more still lifes or oscillators together. This is often done in order to fit the objects into a smaller space than would otherwise be possible. The simplest useful example is probably the integral sign, which can be considered as a pair of welded eater1s.

:Wheels, Life, and other Mathematical Amusements One of Martin Gardner's books (1983) that collects together material from his column in Scientific American. The last three chapters of this book contain all the Life stuff.

:why not (p2) Found by Dave Buckingham, July 1977.


...O...
...O.O.
.O.....
O.OOOOO
.O.....
...O.O.
...O...

:wick A stable or oscillating linearly repeating pattern that can be made to burn at one end. See fuse. Wicks are often fairly dense, with repeating units directly connected or at least adjacent to each other, as in the beehive lightspeed wire for example. However, sparse wicks such as the blocks in the 31c/240 Herschel-pair climber are known, and arbitrarily sparse wicks can be constructed.

:wickstretcher A spaceship-like object which stretches a wick that is fixed at the other end. The wick here is assumed to be in some sense connected, otherwise most puffers would qualify as wickstretchers. The first example of a wickstretcher was found in October 1992 (front end by Hartmut Holzwart and back end by Dean Hickerson) and stretches ants at a speed of c/4. This is shown below with an improved back end found by Hickerson the following month.


.................OO..............................
.............OO....O.............................
............OOO.O................................
O.OO..OO...O...OOOO.O.O....OO.......OO...........
O....OO..O........O.OOO....O....OO.O..O.OO.O.....
O.OO....OO.OO....O...........O...O.O.OO.O.OO.....
......O.......O.............OO.....O..O.O...OO...
.....O.........O.O....OOO...O....O..O.O.OOO...O..
.....O.........O.O....OOO.OO.O..OO.O.O...O..OO.O.
......O.......O.............OO.O...OO....OO....O.
O.OO....OO.OO....O..........O........OO.O.O.OO.OO
O....OO..O........O.OOO........O...O...OO.O..O.O.
O.OO..OO...O...OOOO.O.O.......O.O...OO....O..O.O.
............OOO.O..............O.....O.OOO....O..
.............OO....O.................O.O.........
.................OO...................O..........

Diagonally moving c/4 and c/12 wickstretchers have also been built: see tubstretcher and linestretcher. In July 2000 Jason Summers constructed a c/2 wickstretcher, stretching a p50 traffic jam wick, based on an earlier (October 1994) pattern by Hickerson. A c/5 diagonal wickstretcher was found in January 2011 by Matthias Merzenich, who also discovered a c/5 orthogonal wickstretcher two years later in March 2013.

:wicktrailer Any extensible tagalong or component that can be attached to itself, as well as to the back of a spaceship. The number of generations that it takes for the component to occur again in the same place is often called the period of the wicktrailer. This has little relation to the period of the component. See branching spaceship for an example of a wicktrailer that is part of a p2 spaceship, but repeats itself in the same location at period 20.

:windmill (p4) Found by Dean Hickerson, November 1989.


...........O......
.........OO.O.....
.......OO.........
..........OO......
.......OOO........
..................
OOO...............
...OO..OOO.OO.....
..........OOOOOOO.
.OOOOOOO..........
.....OO.OOO..OO...
...............OOO
..................
........OOO.......
......OO..........
.........OO.......
.....O.OO.........
......O...........

:wing The following induction coil. This is generation 2 of block and glider.


.OO.
O..O
.O.O
..OO

In an unrelated use, "wing" may also refer to an arm of a spaceship.

:WinLifeSearch Jason Summers' GUI version of lifesrc for MS Windows. It is available from http://entropymine.com/jason/life/software/.

:Winning Ways A two-volume book (1982) by Elwyn Berlekamp, John Conway and Richard Guy on mathematical games. The last chapter of the second volume concerns Life, and outlines a proof of the existence of a universal constructor.

:wire A repeating stable structure, usually fairly dense, that a signal can travel along without making any permanent change. Known wires include the diagonal 2c/3 wire, and orthogonal lightspeed wire made from a chain of beehives. Diagonal lightspeed wires are known, but the required signals are fairly complex and have no known glider synthesis.

:with the grain A term used for negative spaceships travelling in zebra stripes agar, parallel to the stripes, and also for with-the-grain grey ships.

Below are three small examples of "negative spaceships" found by Gabriel Nivasch in July 1999, travelling with the grain through a stabilized finite segment of zebra stripes agar:


.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOOO....OOO.
O.........................................OO.....O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.....OOOOOOOOO.
.............................................O........
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........OO..OOO.
O.....................................O.O.....OO.O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...O.....OOO.OOO.
.............................................O........
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.....OOOOOOOOO.
O.........................................OO.....O...O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOOO....OOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOOOO.
O..........................OO...OO...OO...OO..O......O
.OOOOOOOOOOOOOOOOOOOOOOO...O....O....O....O.....OOOOO.
...........................OO...OO...OO...OO...O......
.OOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOO..OOOOOOO.
O........................OO...OO...OO...OO...OO......O
.OOOOOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OO...OOOOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOO...........................OOOO.
O................................................O...O
.OOOOOOOOOOOOOOOOOOOOO...........................OOOO.
................................................O.....
.OOOOOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OO...OOOOOO.
O........................OO...OO...OO...OO...OO......O
.OOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOO..OOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O....................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
......................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
It has been proven that signals travelling non-destructively with the grain through zebra stripes cannot travel at less than the speed of light.

:with-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying parallel to the direction in which the spaceship moves. See also against-the-grain grey ship.

:WLS = WinLifeSearch

:worker bee (p9) Found by Dave Buckingham in 1972. Unlike the similar snacker this produces no sparks, and so is not very important. Like the snacker, the worker bee is extensible. It is, in fact, a finite version of the infinite oscillator which consists of six ON cells and two OFF cells alternating along a line. Note that Dean Hickerson's new snacker ends also work here.


OO............OO
.O............O.
.O.O........O.O.
..OO........OO..
................
.....OOOOOO.....
................
..OO........OO..
.O.O........O.O.
.O............O.
OO............OO

:W-pentomino Conway's name for the following pentomino, a common loaf predecessor.


O..
OO.
.OO

:*WSS Any of the standard orthogonal spaceships - LWSS, MWSS, or HWSS. At one point the term fish was more common for this group of spaceships.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_q.htm0000755000175000017500000005324313317135606014345 00000000000000 Life Lexicon (Q)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Q = Quetzal

:qd Abbreviation for quarter diagonal.

:Q-pentomino Conway's name for the following pentomino, a traffic light predecessor.


OOOO
...O

:quad (p2) Found by Robert Kraus, April 1971. Of all oscillators that fit in a 6x6 box this is the only flipper.


OO..OO
O..O.O
.O....
....O.
O.O..O
OO..OO

:QuadLife A form of colourised Life in which there are four types of ON cell. A newly-born cell takes the type of the majority of its three parent cells, or the remaining type if its parent cells are all of different types. In areas where there are only two types of ON cell QuadLife reduces to Immigration.

:quadpole (p2) The barberpole of length 4.


OO.....
O.O....
.......
..O.O..
.......
....O.O
.....OO

:quad pseudo A still life that can be broken down into four stable pieces but not into two or three. This term may refer to the following 34-bit pattern, found by Gabriel Nivasch in July 2001, or any similar pattern with the same property.


........OO.
...OO.O..O.
...O.OO.O..
........OO.
...O.OO...O
.OOO.OO.OO.
O.......O..
.OOO.OO.O..
...O.O.O...

As a consequence of the Four-Colour Theorem, there can be no analogous objects requiring decomposition into five or more pieces. By convention, patterns like this and the triple pseudo are considered to be pseudo still lifes, not strict still lifes. As of June 2018, it has been shown that no quad pseudo patterns exist with 32 or fewer bits, but a 33-bit pattern with this property may theoretically still be found.

:quadratic filter A toolkit developed by Dean Hickerson and Gabriel Nivasch in 2006, enabling the construction of patterns with asymptotic population growth matching an infinite number of different sublinear functions - namely, O(t(1/2n)) for any chosen n. See also exponential filter, recursive filter.

:quadratic growth The fastest possible asymptotic rate of population growth for any Life pattern - O(t2) in big-O notation, where t is the number of ticks. The first quadratic-growth pattern found was Bill Gosper's 1971 breeder. Many other types of breeders and spacefillers have been constructed since.

In April 2011, Stephen Silver gave an example of a one-cell-thick pattern over a million cells long that exhibited quadratic growth. In October 2015, Chris Cain constructed a one-cell-thick pattern with a reduced bounding box of 2596x1, improving on a series of previous longer results. The smallest known quadratic growth pattern by initial population is the 23-cell switch-engine ping-pong by Michael Simkin.

There are an infinite number of possible growth rates between linear and quadratic growth. See superlinear growth.

:quadratic replicator A pattern that fills all or part of the Life plane by making copies of itself in a nonlinear way. Small quadratic replicators are known in other Life-like rules, but as of July 2018 no example has been found or constructed in Conway's Life.

:quadratic sawtooth Any sawtooth pattern with a quadratic envelope, or specifically a pattern assembled by Martin Grant in May 2015, consisting of two caber tossers with period multipliers for timing which activate and deactivate two toggleable rake guns (see toggleable gun). The gliders emitted by those rakes annihilate on the diagonal while the rakes are eaten by 2c/5 ships. All the rakes and gliders are destroyed before the next cycle. See also Osqrtlogt.

:quadri-Snark A period-multiplying colour-preserving signal conduit found by Tanner Jacobi in October 2017, producing one output glider for every four input gliders. It is made by replacing one of the eaters in a tremi-Snark with a catalyst found using Bellman. The catalyst causes the formation of a tub which then requires an additional glider to delete. However, this adds 5 ticks to the repeat time, so that it becomes 48. If period quadrupling is needed with a colour-changing reaction, a CP semi-Snark and a CC semi-Snark can be used in series, or a period-multiplying Herschel conduit can be connected to a syringe and an appropriately chosen Herschel-to-glider converter.


.O.......................................................
..O......................................................
OOO......................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.............O...........................................
..............O..........................................
............OOO..........................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................O...............................
..........................O..............................
........................OOO..............OO..............
..........................................O..............
........................................O.....OO.........
........................................OO.....O.........
...............................................O.OO......
........................................OO..OO.O..O......
........................................OO...O.OO........
.............................................O...........
............................................OO...........
...................................................OO....
.....................................O.............O.O...
......................................O..............O...
....................................OOO..............O.OO
...........................................OO.....OO.O.O.
...........................................OO.....OO.O.O.
.....................................................O.OO
..................................OO..............OOOO..O
.................................O.O..............O...OO.
.................................O..................OO...
................................OO...................O...
...................................................O.....
...................................................OO....

:quapole = quadpole

:quarter (c/4 diagonally, p4) The following spaceship, found by Jason Summers in September 2000. The name is due to the 25-cell minimum population. This is the smallest known c/4 spaceship other than the glider. This spaceship can also be used to make the smallest known tubstretcher.


........OO...
.......OO....
.........O...
...........OO
..........O..
.............
.........O..O
.OO.....OO...
OO.....O.....
..O....O.O...
....OO..O....
....OO.......

:quarter diagonal A unit of measurement sometimes used for diagonal distances, especially for slow salvo glider lanes. One advantage of measurement in quarter diagonals is that gliders travel diagonally at 1qd/tick, so that the same integer value can serve as either a time or a diagonal distance measurement.

:quasar (p3) Found by Robert Wainwright, August 1971. This is related to the pulsar, and is just the smallest of an extensible series of p3 oscillators built using pulsar quadrants which are shifted with respect to each other.


..........OOO...OOO..........
.............................
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
..........OOO...OOO..........
.............................
........OOO.......OOO........
..OOO..O....O...O....O..OOO..
.......O....O...O....O.......
O....O.O....O...O....O.O....O
O....O.................O....O
O....O..OOO.......OOO..O....O
..OOO...................OOO..
.............................
..OOO...................OOO..
O....O..OOO.......OOO..O....O
O....O.................O....O
O....O.O....O...O....O.O....O
.......O....O...O....O.......
..OOO..O....O...O....O..OOO..
........OOO.......OOO........
.............................
..........OOO...OOO..........
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
.............................
..........OOO...OOO..........
Here is the next oscillator in the series.

..................OOO...OOO..................
.............................................
................O....O.O....O................
................O....O.O....O................
................O....O.O....O................
..................OOO...OOO..................
.............................................
................OOO.......OOO................
..........OOO..O....O...O....O..OOO..........
...............O....O...O....O...............
........O....O.O....O...O....O.O....O........
........O....O.................O....O........
........O....O..OOO.......OOO..O....O........
..........OOO...................OOO..........
.............................................
........OOO.......................OOO........
..OOO..O....O...................O....O..OOO..
.......O....O...................O....O.......
O....O.O....O...................O....O.O....O
O....O.................................O....O
O....O..OOO.......................OOO..O....O
..OOO...................................OOO..
.............................................
..OOO...................................OOO..
O....O..OOO.......................OOO..O....O
O....O.................................O....O
O....O.O....O...................O....O.O....O
.......O....O...................O....O.......
..OOO..O....O...................O....O..OOO..
........OOO.......................OOO........
.............................................
..........OOO...................OOO..........
........O....O..OOO.......OOO..O....O........
........O....O.................O....O........
........O....O.O....O...O....O.O....O........
...............O....O...O....O...............
..........OOO..O....O...O....O..OOO..........
................OOO.......OOO................
.............................................
..................OOO...OOO..................
................O....O.O....O................
................O....O.O....O................
................O....O.O....O................
.............................................
..................OOO...OOO..................

:quasi still life A stable constellation where the individual still lifes share dead cells, so the neighborhoods of those dead cells are changed, but all cells that used to remain dead from under-population still do so. Under Life rules, this occurs when objects are diagonally adjacent (e.g., two blocks sharing a single diagonal neighbor) or when single protruding cells in two objects such as tubs share multiple neighbors. The term is due to Mark Niemiec.

  ----------------
  Bits       Count
  ----------------
   8             6
   9            13
  10            57
  11           141
  12           465
  13          1224
  14          3956
  15         11599
  16         36538
  17        107415
  18        327250
  19        972040
  20       2957488
  21       8879327
  22      26943317
  ----------------

As the number of bits increases, the quasi still life count goes up exponentially by approximately O(3.04n), slightly more than a factor of three. By comparison, the rate for strict still lifes is about O(2.46n) while for pseudo still lifes it's around O(2.56n).

:queen bee See queen bee shuttle.

:queen bee shuttle (p30) Found by Bill Gosper in 1970. There are a number of ways to stabilize the ends. Gosper originally stabilized shuttles against one another in a square of eight shuttles. Two simpler methods are shown here; for a third see buckaroo. The queen bee shuttle is the basis of all known true p30 guns (see Gosper glider gun).


.........O............
.......O.O............
......O.O.............
OO...O..O.............
OO....O.O.............
.......O.O........OO..
.........O........O.O.
....................O.
....................OO

:queen bee shuttle pair Any arrangement of two queen bee shuttles such that the two beehives created between them are consumed in some way. There are many ways that the two shuttles can be placed, either head-to-head, or else at right angles. The most well-known and useful arrangement results in the Gosper glider gun.

Other arrangements don't create any lasting output, but create large sparks which can perturb objects (especially gliders) in various ways. For example, one arrangement of a queen bee shuttle pair was used in the original unit Life cell as a memory cell. Here an input glider is converted into a block, which remains until it is deleted by a glider on a right-angled path.


.......................O.
......................O..
......................OOO
.........................
.............O...........
............O.O..........
............OO.O.........
............OO.OO........
............OO.O.........
..OO........O.O..........
.O.O.........O....OOO....
.O................OOO....
OO...............O...O...
................O.....O..
.................O...O...
..................OOO....
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................OO.......
.................O.......
..............OOO........
..............O..........
See p690 gun and metamorphosis II for two more examples.

:Quetzal Any Herschel track-based gun with a period below 62, which is the lowest period with a stable glider-emitting conduit. This was Dieter Leithner's name for the true p54 glider gun he built in January 1998 - a short form of Quetzalcoatlus, which expresses the fact that the gun was a very large Herschel loop that was not an emu. Shortly afterwards Leithner also built a p56 Quetzal using a mechanism found by Noam Elkies for this purpose. In October 1998 Stephen Silver constructed a p55 Quetzal using Elkies' p5 reflector of the previous month. Quetzals of periods 57-61 have since been constructed.

Some of the more recent Quetzals are not Herschel loops, but are instead short Herschel tracks firing several glider streams all but one of which is reflected back to the beginning of the track to create a new Herschel. Noam Elkies first had the idea of doing this for the p55 case, and Stephen Silver constructed the resulting gun shortly after building the original (much larger) p55 Quetzal. Jason Summers later built a p54 version, which is more complicated because the evenness of the period makes the timing problems considerably more difficult.

:Quetzalcoatlus A giant flying dinosaur after which Dieter Leithner named his p54 gun. Usually abbreviated to Quetzal, or simply Q (as in Q54, Q55, Q56, Q-gun, etc.).

:quilt = squaredance


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_u.htm0000755000175000017500000003657513317135606014362 00000000000000 Life Lexicon (U)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:UC = universal constructor.

:underpopulation Death of a cell caused by it having fewer than two neighbours. See also overpopulation.

:unit cell = unit Life cell.

:unit Life cell A rectangular pattern, of size greater than 1x1, that can simulate Life in the following sense. The pattern by itself represents a dead Life cell, and some other pattern represents a live Life cell. When the plane is tiled by these two patterns (which then represent the state of a whole Life universe) they evolve, after a fixed amount of time, into another tiling of the plane by the same two patterns which correctly represents the Life generation following the one they initially represented.

It is usual to use the prefix "meta-" for simulated Life features, so, for example, for the first known unit Life cell (constructed by David Bell in January 1996), one metatick is 5760 ticks, and one metacell is 500x500 cells. Capital letters were originally used to make this distinction - e.g., Generation, Cell - but this usage is no longer common.

In December 2005, Jason Summers constructed an analogous unit cell for Wolfram's Rule 110, a one-dimensional cellular automaton that is known be universal. See also OTCA metapixel, p1 megacell.

:universal See universal computer, universal constructor, universal toolkit.

:universal computer A computer that can compute anything that is computable. (The concept of computability can be defined in terms of Turing machines, or by Church's lambda calculus, or by a number of other methods, all of which can be shown to lead to equivalent definitions.) The relevance of this to Life is that both Bill Gosper and John Conway proved early on that it is possible to construct a universal computer in the Life universe. (To prove the universality of a cellular automaton with simple rules was in fact Conway's aim in Life right from the start.) Conway's proof is outlined in Winning Ways, and also in The Recursive Universe.

Until recently, no universal Life computer had ever been built in practice In April 2000, Paul Rendell completed a Turing machine construction (see http://rendell-attic.org/gol/tm.htm for details). This, however, has a finite tape, as opposed to the infinite tape of a true Turing machine, and is therefore not a universal computer. But in November 2002, Paul Chapman announced the construction of a universal computer, see http://www.igblan.free-online.co.uk/igblan/ca/. This is a universal register machine based around Dean Hickerson's sliding block memory.

In 2009 Adam P. Goucher constructed a programmable Spartan universal computer/constructor pattern using stable Herschel circuitry. It included memory tapes and registers capable of holding a simple universal instruction set and program data, and also a minimal single-arm universal constructor. Its size meant that it was extremely impractical to program it to be self-constructing, though this was theoretically possible if the escape of large numbers of gliders could be allowed as a side effect.

In February 2010, Paul Rendell completed a universal Turing machine design with an unlimited tape, as described in his thesis at http://eprints.uwe.ac.uk/22323/1/thesis.pdf.

In 2016 Nicolas Loizeau ("Coban") completed a Life pattern emulating a complete 8-bit programmable computer.

See also universal constructor.

:universal constructor A pattern that is capable of constructing almost any pattern that has a glider synthesis. This definition is a bit vague. A precise definition seems impossible because it is not known, for example, whether all still lifes are constructible. In any case, a universal constructor ought to be able to construct itself in order to qualify as such.

An outline of Conway's proof that such a pattern exists can be found in Winning Ways, and also in The Recursive Universe. The key mechanism for the production of gliders with any given path and timing is known as side-tracking, and is based on the kickback reaction. A universal constructor designed in this way can also function as a universal destructor: it can delete almost any pattern that can be deleted by gliders.

In May 2004, Paul Chapman and Dave Greene produced a prototype programmable universal constructor. This is able to construct objects by means of slow glider constructions. It likely that it could be programmed to construct itself, but the necessary program would be very large; moreover an additional mechanism would be needed in order to copy the program.

A universal constructor is theoretically most useful when attached to a universal computer, which can be programmed to control the constructor to produce the desired pattern of gliders. In what follows I will assume that a universal constructor always includes this computer.

The existence of a universal constructor/destructor has a number of theoretical consequences.

For example, the constructor could be programmed to make copies of itself. This is a replicator.

The constructor could even be programmed to make just one copy of itself translated by a certain amount and then delete itself. This would be a (very large, very high period) spaceship. Any translation is possible, so that the spaceship could travel in any direction. If the constructor makes a rotated but unreflected copy of itself, the result would be a looping spaceship or reflectorless rotating oscillator.

The constructor could also travel slower than any given speed, since we could program it to perform some time-wasting task (such as repeatedly constructing and deleting a block) before copying itself. Of course, we could also choose for it to leave some debris behind, thus making a puffer.

It is also possible to show that the existence of a universal constructor implies the existence of a stable reflector. This proof is not so easy, however, and is no longer of much significance now that explicit examples of such reflectors are known.

Progressively smaller universal-constructor mechanisms without an attached universal computer have been used in the linear propagator, spiral growth pattern, and the Demonoids and Orthogonoid. See also single-channel.

Another strange consequence of the existence of universal constructors was pointed out by Adam P. Goucher and Tanner Jacobi in 2015. Any glider-constructible pattern, no matter how large, can be constructed with a fixed number of gliders, by working out a construction recipe for a universal constructor attached to a decoder that measures the distance to a faraway object. The object's position encodes a numeric value that can be processed to retrieve as many bits of information as are needed to build a slow salvo to construct any given target pattern. The simplest design, requiring less than a hundred gliders, is described in reverse caber tosser.

:universal destructor See universal constructor.

:universal register machine = URM

:universal regulator A regulator in which the incoming gliders are aligned to period 1, that is, they have arbitrary timing (subject to some minimum time required for the regulator to recover from the previous glider).

Paul Chapman constructed the first universal regulator in March 2003. It is adjustable, so that the output can be aligned to any desired period. A stable universal regulator was constructed by Dave Greene in September 2015, with a minimum delay between test signals of 1177 ticks. Later stable versions have reduced the delay to 952 ticks.

A universal regulator can allow two complex circuits to interact safely, even if they have different base periods. For example, signals from a stable logic circuit could be processed by a period-30 mechanism, though the precise timing of those signals would change in most cases.

:universal toolkit A set of Life reactions and mechanisms that can be used to construct any object that can be constructed by glider collisions. Different universal toolkits were used to construct the linear propagator, 10hd Demonoid, 0hd Demonoid, and Orthogonoid, for example.

:universe The topology of the cells in the Life grid. In the normal universe (the usual Life arena), the grid is infinite in both directions. In a cylindrical universe, the grid is finite in one direction, and the cells at the two edges are adjacent to each other. In a torus universe, the grid is finite in both directions, and the cells at the top and bottom edges are adjacent, and the cells at the left and right edges are adjacent. There are several other more obscure types of universe.

Objects found in the cylindrical and toroidal universes can also run in the normal universe if an infinite number of copies are arranged to support each other. Sometimes the objects can be supported in other ways to make a useful finite object. This is one reason that soup searches are run in alternative universes, to find such objects.

:unix (p6) Two blocks eating a long barge. This is a useful sparker, found by Dave Buckingham in February 1976. The name derives from the fact that it was for some time the mascot of the Unix lab of the mathematics faculty at the University of Waterloo.


.OO.....
.OO.....
........
.O......
O.O.....
O..O..OO
....O.OO
..OO....

:unknown fate An object whose fate is in some way unanswerable with our current knowledge. The simplest way that the fate of an object can be unknown involves the question of whether or not it exhibits infinite growth. For example, the fate of the Fermat prime calculator is currently unknown, but its behaviour is otherwise predictable.

A different type of unknown fate is that of the Collatz 5N+1 simulator, which may become stable, or an oscillator, or have an indefinitely growing bounding box. Its behavior is otherwise predictable, and unlike the Fermat prime calculator the population is known to be bounded.

Life objects having even worse behaviour (e.g. chaotic growth) are not known as of July 2018.

:up boat with tail = trans-boat with tail

:U-pentomino Conway's name for the following pentomino, which rapidly dies.


O.O
OOO

:URM A universal register machine, particularly Paul Chapman's Life implementation of such a machine. See universal computer for more information.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex.htm0000755000175000017500000002051613317135606014022 00000000000000 Life Lexicon (Introduction)
Life Lexicon

Release 29, 2018 July 2
Multipage HTML version


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

INTRODUCTION
This is a lexicon of terms relating to John Horton Conway's Game of Life. It is also available in a single-page HTML version and an ASCII version.

This lexicon was originally compiled between 1997 and 2006 by Stephen A. Silver, and was updated in 2016-18 by Dave Greene and David Bell. See below for additional credits.

The latest versions of this lexicon (both HTML and ASCII) should be available from the Life Lexicon Home Page.

CREDITS
The largest single source for the early versions of this lexicon was a glossary compiled by Alan Hensel "with indispensable help from John Conway, Dean Hickerson, David Bell, Bill Gosper, Bob Wainwright, Noam Elkies, Nathan Thompson, Harold McIntosh, and Dan Hoey".

Other sources include the works listed in the bibliography at the end of this lexicon, as well as pattern collections by Alan Hensel and David Bell (and especially Dean Hickerson's file stamp.l in the latter collection), and the web sites of Mark Niemiec, Paul Callahan, Achim Flammenkamp, Robert Wainwright and Heinrich Koenig. Recent releases also use a lot of information from Dean Hickerson's header to his 1995 stamp file. Most of the information on recent results is from the discoverers themselves, or from Nathaniel Johnston's excellent resources at http://www.conwaylife.com, including both the LifeWiki and the discussion forums.

The following people all provided useful comments on earlier releases of this lexicon: David Bell, Nicolay Beluchenko, Johan Bontes, Daniel Collazo, Scot Ellison, Nick Gotts, Ivan Fomichev, Dave Greene, Alan Hensel, Dean Hickerson, Dieter Leithner, Mark Niemiec, Gabriel Nivasch, Andrzej Okrasinski, Arie Paap, Peter Rott, Chris Rowett, Tony Smith, Ken Takusagawa, Andrew Trevorrow, Malcolm Tyrrell, and the conwaylife.com forum users with the handles 'thunk' and 'Apple Bottom'.

The format, errors, use of British English and anything else you might want to complain about are by Stephen Silver -- except that for post-Version 25 definitions, everything besides the British English may well be Dave Greene's fault instead.

COPYING
This lexicon is copyright (C) Stephen Silver, 1997-2018. It may be freely copied, modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 3.0 Unported licence (CC BY-SA 3.0), as long as due credit is given. This includes not just credit to those who have contributed in some way to the present version (see above), but also credit to those who have made any modifications.
LEXICOGRAPHIC ORDER
I have adopted the following convention: all characters (including spaces) other than letters and digits are ignored for the purposes of ordering the entries in this lexicon. (Many terms are used by some people as a single word, with or without a hyphen, and by others as two words. My convention means that I do not have to list these in two separate places. Indeed, I list them only once, choosing whichever form seems most common or sensible.) Digits lexicographically precede letters.
FORMAT
The diagrams in this lexicon are in a very standard format. You should be able to simply copy a pattern, paste it into a new file and run it in your favourite Life program. If you use Golly then you can just paste the pattern directly into the program. Diagrams are generally restricted to size 64x64 or less.

Most definitions that have a diagram have also some data in brackets after the keyword. Oscillators are marked as pn (where n is a positive integer), meaning that the period is n (p1 indicates a still life). Wicks are marked in the same way but with the word "wick" added. For spaceships the speed (as a fraction of c, the speed of light), the direction and the period are given. Fuses are marked with speed and period and have the word "fuse" added. Wicks and fuses are infinite in extent and so have necessarily been truncated, with the ends stabilized wherever practical.

SCOPE
This lexicon covers only Conway's Life, and provides no information about other cellular automata. David Bell has written articles on two other interesting cellular automata: HighLife (which is similar to Life, but has a tiny replicator) and Day & Night (which is very different, but exhibits many of the same phenomena). These articles can be found on his website.
ERRORS AND OMISSIONS
If you find any errors (including typos) or serious omissions, then please email b3s23life@gmail.com with the details. As of June 2018 this email address is monitored by Dave Greene.
NAMES
When deciding whether to use full or abbreviated forms of forenames I have tried, wherever possible, to follow the usage of the person concerned.
QUOTE
Every other author may aspire to praise; the lexicographer can only hope to escape reproach.    Samuel Johnson, 1775
DEDICATION
This lexicon is dedicated to the memory of Dieter Leithner, who died on 26 February 1999.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_n.htm0000755000175000017500000004553713317135606014351 00000000000000 Life Lexicon (N)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:natural Occurring often in random patterns. There is no precise measure of naturalness, since the most useful definition of "random" in this context is open to debate. Nonetheless, it is clear that objects such as blocks, blinkers, beehives and gliders are very natural, while eater2s, darts, guns, etc., are not.

:natural Heisenburp (p46) A twin bees shuttle pair arrangement found by Brice Due in 2006. A glider passes through the reaction area of the shuttle pair completely unaffected. However, a Heisenburp effect causes a second glider to be created "out of the blue", following behind the first at a 2hd offset.


..................OO.................
.................O.O...............OO
.................O.................OO
.................OOO.................
.....................................
.....................................
.....................................
.................OOO.................
........OO.......O.................OO
........OO.......O.O...............OO
..................OO.................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.O.....O.............................
OOO...OOO............................
O.OO.OO.O............................
..OO.OO..........OO..................
..OO.OO..........O.O.................
..OO.OO..........O...................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
OO.....OO............................
OO.....OO............................

:ND read = non-destructive read

:negative spaceship A type of signal travelling through a periodic agar such as zebra stripes. The leading edge of the signal removes the agar, and the trailing edge rebuilds the agar some time later. The distance between the two edges is sometimes adjustable, as shown in lightspeed bubble. The central part of the "spaceship" may consist of dying sparks or even simple empty space.

Below is a sample period-5 negative spaceship, found by Hartmut Holzwart in March 2007, in a small stabilized section of zebra stripes agar:


.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.........................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOOOOOOOOOOOOOOOOOO.
O..............................OO...OO..................O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO...OOOO..OOOOOOOOOOOO.
..........................OO...............OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO.....OO...OO..OOOOOOO.
O..............................OO...O.OO........OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO...OO.....OO...OOOOOO.
..........................OO............OO.OO............
.OOOOOOOOOOOOOOOOOOOOOOOO...OOOOO..........OO.....OOOOOO.
O............................O...............OO.OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO.....O.........O.......OO..OOOO.
..........................O.O......O...O..........OO.....
.OOOOOOOOOOOOOOOOOOOOOOOO...O.O.OOOOO......O.......OOOOO.
O..............................OOO...O......O...........O
.OOOOOOOOOOOOOOOOOOOOOOOO...O.O.OOOOO......O.......OOOOO.
..........................O.O......O...O..........OO.....
.OOOOOOOOOOOOOOOOOOOOOOOO.....O.........O.......OO..OOOO.
O............................O...............OO.OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO...OOOOO..........OO.....OOOOOO.
..........................OO............OO.OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOO...OO.....OO...OOOOOO.
O..............................OO...O.OO........OO......O
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO.....OO...OO..OOOOOOO.
..........................OO...............OO............
.OOOOOOOOOOOOOOOOOOOOOOOO..OOO...OO...OOOO..OOOOOOOOOOOO.
O..............................OO...OO..................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOO..OOOOOOOOOOOOOOOOOOO.
.........................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O.
The "spaceship" travels to the left at the speed of light, so it will eventually reach the edge of any finite patch and destroy itself and its supporting agar.

:negentropy (p2) Compare Hertz oscillator.


...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...OO..O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:neighbour Any of the eight cells adjacent to a given cell. A cell is therefore not considered to be a neighbour of itself, although the neighbourhood used in Life does in fact include this cell (see cellular automaton).

:new five (p3) Found by Dean Hickerson, January 1990.


..OO.....
.O..O....
.O.O..O..
OO.O.OO..
O........
.OOO.OOOO
.....O..O
O.OO.....
OO.OO....

:new gun (p46) An old name for the period 46 glider gun show below. This was found by Bill Gosper in 1971, and was the second basic glider gun found (after the Gosper glider gun). It produces a period 46 glider stream.


.........................OO.....OO
.........................OO.....OO
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
...........................OO.OO..
..........................O.....O.
..................................
.........................O.......O
.........................O..O.O..O
.........................OOO...OOO
..................................
..................................
..................................
..................................
.................O................
OO...............OO...............
OO................OO..............
.............OO..OO...............
..................................
..................................
..................................
.............OO..OO...............
OO................OO.......OO.....
OO...............OO........OO.....
.................O................

A number of other ways of constructing a gun from two twin bees shuttles have since been found. See edge shooter for one of these, and see also p46 gun.

:Noah's ark The following diagonal puffer consisting of two switch engines. This was found by Charles Corderman in 1971. The name comes from the variety of objects it leaves behind: blocks, blinkers, beehives, loaves, gliders, ships, boats, long boats, beacons and block on tables.


..........O.O..
.........O.....
..........O..O.
............OOO
...............
...............
...............
...............
...............
.O.............
O.O............
...............
O..O...........
..OO...........
...O...........

See also ark.

:n-omino Any polyomino with exactly n cells.

:non-destructive read A type of test reaction in memory cell circuitry, where the information in the memory cell is unchanged and can be read again to produce the same result. One simple type of non-destructive read reaction is a signal sent to a permanent switch. Memory cells with destructive read reactions are generally simpler and more commonly used.

:nonfiller = space nonfiller

:non-monotonic A spaceship is said to be non-monotonic if its leading edge falls back in some generations. The first example (shown below) was found by Hartmut Holzwart in August 1992. This is p4 and travels at c/4. In April 1994, Holzwart found examples of p3 spaceships with this property, and this is clearly the smallest possible period. Another non-monotonic spaceship is the weekender.


..........OO.O.......
......OOO.O.OOO......
..O.O..........O...OO
OO....OO.....O...OOOO
..O.OO..O....OOO.O...
........O....O.......
..O.OO..O....OOO.O...
OO....OO.....O...OOOO
..O.O..........O...OO
......OOO.O.OOO......
..........OO.O.......

:nonomino switch engine predecessor This is the unique nonomino (a polyomino having 9 cells) whose evolution results in a switch engine, and the smallest polyomino to do so.


OOO...
..O.O.
..OOOO

Charles Corderman may have found this object in 1971 while exhaustively investigating the fate of all the small polyominoes. Records indicate that he found the switch engine while investigating the decominoes (polyominoes having 10 cells). However, there do not appear to be decominoes which result in a clean switch engine. If Corderman was examining polyominoes in order of size, then this smaller predecessor should have been found first in any case.

:non-spark Something that looks like a spark, but isn't. An OWSS produces one of these instead of a belly spark, and is destroyed by it.

:non-standard spaceship Any spaceship other than a glider, LWSS, MWSS or HWSS.

:non-trivial A non-trivial period-N oscillator contains at least one cell that oscillates at the full period. In other words, it is not made up solely of separate oscillators with smaller periods. Usually it includes a spark or other reaction that would not occur if all lower-period subpatterns were separated from each other, but some exceptions are given under trivial. See also omniperiodic.

:novelty generator A pattern that appears to have an unknown fate due to complex feedback loops, for example involving waves of gliders shuttling between perpendicular rakes. Novelty generator patterns fall short of counting as chaotic growth, since the rakes continue to be predictable, and much of their ash generally remains stable.

It has not been proven conclusively that any particular pattern is in fact an infinite novelty generator, since it is always possible that periodicity will spontaneously arise if the simulation is continued far enough. In fact this happens quite regularly. But conversely, it has not been proven that periodicity must spontaneously arise for all such patterns. Bill Gosper, Nick Gotts and others have done extensive experiments along these lines using Golly.

:NW31 One of the most common stable edge shooters. This Herschel-to-glider converter suppresses the junk ordinarily left behind by an evolving Herschel while allowing both the first natural glider and second natural glider to escape on transparent lanes:


OO.......................
.O.......................
.O.O.....................
..OO.....................
.........................
.........................
.........................
.......................OO
.......................OO
.........................
..O......................
..O.O....................
..OOO....................
....O....................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...........OO............
............O............
.........OOO.............
.........O...............
The edge shooter output at the top has no additional clearance, so its use in creating convoys is limited: it can only add gliders on the outermost lanes of an existing glider salvo. Like the beehive version of SW-2, either output can be used to build logical OR gates, where multiple input signal paths are merged onto the same output path.

The complete name for this converter is "NW31T120", where 31 is the output glider lane number. In the above orientation, lane numbers get bigger toward the upper right and smaller toward the lower left (and may easily be negative).

The T120 timing measurement means that a canonical NW glider placed on lane 31 at time T=120, at (+31, +0) relative to the input Herschel, would in theory reach the exact same spacetime locations as the converter's output glider does.

Most converters are not edge shooters and their output lanes are not transparent, so they usually have catalysts that would interfere with this theoretically equivalent glider. This is the case for the optional third glider output created by the lower eater1 catalyst: the upper eater1 overlaps its lane. For the alternate block catalyst suppressing this glider output, see transparent lane.

:NW31T120 = NW31


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_y.htm0000755000175000017500000000471413151213347014347 00000000000000 Life Lexicon (Y)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Y-pentomino Conway's name for the following pentomino, which rapidly dies.


..O.
OOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_d.htm0000755000175000017500000006511113317135606014325 00000000000000 Life Lexicon (D)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:dart (c/3 orthogonally, p3) Found by David Bell, May 1992. A 25-glider recipe for the dart was found in December 2014 by Martin Grant and Chris Cain, making it the first glider-constructible c/3 spaceship.


.......O.......
......O.O......
.....O...O.....
......OOO......
...............
....OO...OO....
..O...O.O...O..
.OO...O.O...OO.
O.....O.O.....O
.O.OO.O.O.OO.O.

:dead spark coil (p1) Compare spark coil.


OO...OO
O.O.O.O
..O.O..
O.O.O.O
OO...OO

:debris = ash.

:de Bruijn diagram = de Bruijn graph

:de Bruijn graph As applied to Life, a de Bruijn graph is a graph showing which pieces can be linked to which other pieces to form a valid part of a Life pattern of a particular kind.

For example, if we are interested in still lifes, then we could consider 2x3 rectangular pieces and the de Bruijn graph would show which pairs of these can be overlapped to form 3x3 squares in which the centre cell remains unchanged in the next generation.

David Eppstein's search program gfind is based on de Bruijn graphs.

:Deep Cell A pattern by Jared James Prince, based on David Bell's unit Life cell, in which each unit cell simulates two Life cells, in such a way that a Life universe filled with Deep Cells simulates two independent Life universes running in parallel.

In fact, a Life universe filled with Deep Cells can simulate infinitely many Life universes, as follows. Let P1, P2, P3, ... be a sequence of Life patterns. Set the Deep Cells to run a simulation of P1 in parallel with a simulation of a universe filled with Deep Cells, with these simulated Deep Cells running a simulation of P2 in parallel with another simulation of a universe filled with Deep Cells, with these doubly simulated Deep Cells simulating P3 in parallel with yet another universe of Deep Cells, and so on.

Deep Cell is available from http://psychoticdeath.com/life.htm.

:Demonoid The first self-constructing diagonal spaceship. A 0hd Demonoid was completed by Chris Cain in December 2015, shortly after a much larger 10hd version was constructed the previous month in collaboration with Dave Greene. The 0hd spaceship fits in a bounding box about 55,000 cells square, and displaces itself by 65 cells diagonally every 438,852 generations.

The first 0hd Demonoid was fired by a gun. No spaceship gun pattern had previously been completed before the first appearance of the actual spaceship.

In June 2017 Dave Greene completed a much simpler single-channel Demonoid using a temporary lossless elbow, which displaces itself 79 cells diagonally every 1,183,842 ticks. This was an improvement in terms of design complexity, but not in terms of speed, population, or bounding box. However, all of these could be further optimized. A smaller Hashlife-friendly single-channel Demonoid design was completed in 2018.

:demultiplexer A simple Herschel circuit consisting of three eater1s, found by Brice Due in August 2006. An input Herschel places a boat in a location accessible to an input glider. If the boat is present, a one-time turner reaction occurs and the glider is turned 90 degrees onto a new lane.


...........................O.....
........OO.................O.O...
.........O.................OO....
.........O.O.....................
..........OO.....................
.......................OO........
.......................O.O.......
........................O........
.................................
.................................
.............................OO..
..........O..................O.O.
..........O.O..................O.
..........OOO............OO....OO
............O............O.O.....
...........................O.....
...........................OO....
.................................
.................................
..OO.............................
.O.O.............................
.O...............................
OO...............................
If the Herschel and boat are removed from the above pattern, the glider passes cleanly through the circuit. It can be used as the "0" output of a one-bit memory cell, where the 90-degree output would be the "1" output. This was the method used to store presence or absence of neighbor metacells in the p1 megacell.

:demuxer = demultiplexer

:density The density of a pattern is the limit of the proportion of live cells in a (2n+1)x(2n+1) square centred on a particular cell as n tends to infinity, when this limit exists. (Note that it does not make any difference what cell is chosen as the centre cell. Also note that if the pattern is finite then the density is zero.) There are other definitions of density, but this one will do here.

In 1994 Noam Elkies proved that the maximum density of a stable pattern is 1/2, which had been the conjectured value. See the paper listed in the bibliography. Marcus Moore provided a simpler proof in 1995, and in fact proves that a still life with an m x n bounding box has at most (mn+m+n)/2 cells.

But what is the maximum average density of an oscillating pattern? The answer is conjectured to be 1/2 again, but this remains unproved. The best upper bound so far obtained is 8/13 (Hartmut Holzwart, September 1992).

The maximum possible density for a phase of an oscillating pattern is also unknown. An example with a density of 3/4 is known (see agar), but densities arbitrarily close to 1 may perhaps be possible.

:dependent conduit A Herschel conduit in which the input Herschel interacts with catalysts in the first few ticks. The standard interaction actually starts at T=-3, before the Herschel is completely formed. Compare independent conduit. The Herschel is prevented from emitting its first natural glider. This is useful in cases where the previous conduit cannot survive a first natural glider emitted from its output Herschel.

This term is somewhat confusing, since it is actually the previous conduit that depends on the dependent conduit to suppress the problematic glider. Dependent conduits such as the F166 and Lx200 do not actually depend on anything. They can be freely connected to any other conduits that fit, as long as the output Herschel evolves from its standard great-grandparent. As of this writing, the Fx158 is the only known case where a conduit's output Herschel has an alternate great-grandparent, which is incompatible with dependent conduits' initial transparent block.

:destructive read The most common type of test reaction in memory cell circuitry. Information is stored in a memory cell by placing objects in known positions, or by changing the state of a stable or periodic toggle circuit. A destructive-read test consists of sending one or more signals to the memory cell. A distinct output signal is produced for each possible state of the memory cell, which is reset to a known "zero" or "rest" state. See for example boat-bit, keeper, and demultiplexer.

To permanently store information in a destructive-read memory cell, the output signal(s) must be used, in part, to send appropriate signals back to the memory cell to restore its state to its previous value. With output looped back to input, this larger composite circuit then effectively becomes a non-destructive read memory cell.

:destructor arm A dedicated construction arm in the Gemini spaceship, used only for removing previously active circuitry once it is no longer needed. More generally, any circuitry in a self-constructing pattern dedicated exclusively to cleanup.

:D-heptomino = Herschel

:diamond = tub

:diamond ring (p3) Found by Dave Buckingham in 1972.


......O......
.....O.O.....
....O.O.O....
....O...O....
..OO..O..OO..
.O....O....O.
O.O.OO.OO.O.O
.O....O....O.
..OO..O..OO..
....O...O....
....O.O.O....
.....O.O.....
......O......

:diehard Any pattern that vanishes, but only after a long time. The following example vanishes in 130 generations, which is probably the limit for patterns of 7 or fewer cells. Note that there is no limit for higher numbers of cells. E.g., for 8 cells we could have a glider heading towards an arbitrarily distant blinker.


......O.
OO......
.O...OOO

:dinner table (p12) Found by Robert Wainwright in 1972.


.O...........
.OOO.......OO
....O......O.
...OO....O.O.
.........OO..
.............
.....OOO.....
.....OOO.....
..OO.........
.O.O....OO...
.O......O....
OO.......OOO.
...........O.

:dirty Opposite of clean. A reaction which produces a large amount of complicated junk which is difficult to control or use is said to be dirty. Many basic puffer engines are dirty and need to be tamed by accompanying spaceships in order to produce clean output. Similarly, a dirty conduit is one that does not recover perfectly after the passage of a signal; one or more extra ash objects are left behind (or more rarely a catalyst is damaged) and additional signals must be used to clean up the circuit before it can be re-used.

:diuresis (p90) Found by David Eppstein in October 1998. His original stabilization used pentadecathlons. The stabilization with complicated still lifes shown here (in two slightly different forms) was found by Dean Hickerson the following day. The name is due to Bill Gosper (see kidney).


.....OO................OO....
......O................O.....
......O.O............O.O.....
.......OO............OO......
.............................
....OO..................OO...
....O.O..........OO....O.O...
.....O..........O.O.....O....
..O.............OO.........O.
..OOOOOO........O.....OOOOOO.
.......O..............O......
....OO..................OO...
....O....................O...
.....O..................O....
..OOO..O..............O..OOO.
..O..OOO........O.....OOO...O
...O............OO.......OOO.
....OO..........O.O.....O....
......O..........OO....O..OO.
....OO..................OO.O.
.O..O....................O...
O.O.O..OO............OO..O...
.O..O.O.O............O.O.OO..
....O.O................O..O..
.....OO................OO....

:dock The following induction coil.


.OOOO.
O....O
OO..OO

:domino The 2-cell polyomino. A number of objects, such as the HWSS and pentadecathlon, produce domino sparks.

:dormant An object that is either stable or oscillates without producing any output, until it is triggered by an appropriate signal, which then produces some desired action. For example, freeze-dried objects are dormant until the arrival of a particular glider.

:do-see-do The following reaction, found by David Bell in 1996, in which two gliders appear to circle around each other as they are reflected 90 degrees by a twin bees shuttle. Four copies of the reaction can be used to create a p92 glider loop which repeats the do-see-do reaction forever.


.....................................................O.O
.....................................................OO.
......................................................O.
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
................................................OO......
................................................O.......
..............................................O.O.......
..............................................OO........
..............................O.O.......................
..............................OO........................
...............................O........................
........................................................
.......................OOO..............................
OO........OOO........OO.O.OO............................
OO........O...O.....O.....OO............................
..........O....O.....OO.O.OO............................
...........O...O.......OOO..............................
........................................................
...........O...O........................................
..........O....O........................................
OO........O...O............OO...........................
OO........OOO..............OO...........................

:double-barrelled Of a gun, emitting two streams of spaceships (or rakes) every period. For examples, see B-52 bomber, Simkin glider gun, and p246 gun. In most cases, the two streams are alternately emitted 1/2 period apart. It is also possible for the two streams to be emitted simultaneously, as in this double-barrelled glider gun by Bill Gosper:


.................O................................
.................OO...............................
..................OO..............................
.................OO...............................
................................O.................
...............................OO...............OO
..............................OO................OO
.................OO............OO.................
OO................OO..............................
OO...............OO...............................
.................O................................
...............................OO.................
..............................OO..................
...............................OO.................
................................O.................

:double block reaction A certain reaction that can be used to stabilize the twin bees shuttle (qv). This was discovered by David Bell in October 1996.

The same reaction sometimes works in other situations, as shown in the following diagram where a pair of blocks eats an R-pentomino and a LWSS. (The LWSS version was known at least as early 1994, when Paul Callahan saw it form spontaneously as a result of firing an LWSS stream at some random junk.)


.OOOO.....OO....
O...O......OO.OO
....O......O..OO
O..O............
................
.............OO.
.............OO.

:double caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and triple caterer.


.....OO...O........
....O..O..OOO......
....OO.O.....O.....
......O.OOOO.O.....
..OOO.O.O...O.OO...
.O..O..O...O..O.O..
O.O..O...O.OO....O.
.O..........OO.OOO.
..OO.OO.OO...O.....
...O...O.....O.OOO.
...O...O......OO..O
.................OO

:double ewe (p3) Found by Robert Wainwright before September 1971.


......OO............
.......O............
......O.............
......OO............
.........OO.........
......OOO.O.........
O.OO.O..............
OO.O.O..............
.....O...O..........
....O...OO....OO....
....OO....OO...O....
..........O...O.....
..............O.O.OO
..............O.OO.O
.........O.OOO......
.........OO.........
............OO......
.............O......
............O.......
............OO......

:double wing = moose antlers. This term is no longer in use.

:dove The following induction coil, found in 2015 to be a possible active reaction for the input or output of a converter.


.OO..
O..O.
.O..O
..OOO

:down boat with tail = cis-boat with tail

:dr Short identifier for Dean Hickerson's 'drifter' search program, used at various times to find wires, eaters, higher-period billiard table configurations, and related signal-carrying and signal-processing mechanisms. See also drifter.

:dragon (c/6 orthogonally, p6) This spaceship, discovered by Paul Tooke in April 2000, was the first known c/6 spaceship. With 102 cells, it was the smallest known orthogonal c/6 spaceship until Hartmut Holzwart discovered 56P6H1V0 in April 2009.


.............O..OO......O..OOO
.....O...OOOO.OOOOOO....O..OOO
.OOOOO....O....O....OOO.......
O......OO.O......OO.OOO..O.OOO
.OOOOO.OOO........OOOO...O.OOO
.....O..O..............O......
........OO..........OO.OO.....
........OO..........OO.OO.....
.....O..O..............O......
.OOOOO.OOO........OOOO...O.OOO
O......OO.O......OO.OOO..O.OOO
.OOOOO....O....O....OOO.......
.....O...OOOO.OOOOOO....O..OOO
.............O..OO......O..OOO

:drain trap = paperclip. This term is no longer in use.

:D read = destructive read

:dried = freeze-dried.

:drifter A perturbation moving within a stable pattern. Dean Hickerson has written a search program to search for drifters, with the hope of finding one which could be moved around a track. Because drifters can be very small, they could be packed more tightly than Herschels, and so allow the creation of oscillators of periods not yet attained, and possibly prove that Life is omniperiodic. Hickerson has found a number of components towards this end, but it has proved difficult to change the direction of movement of a drifter, and so far no complete track has been found. However, Hickerson has had success using the same program to find eaters with novel properties, such as sparking eaters and the ones shown in diuresis.

:dual 1-2-3-4 = Achim's p4

:duoplet A diagonal two-bit spark produced by many oscillators and eater reactions. Among other uses, it can reflect gliders 90 degrees. The following pattern shows an eater5 eating gliders and producing duoplets which are then used to reflect a separate glider stream. If only one glider is present, the eater5 successfully absorbs it, so this mechanism may be considered to be a simple AND gate.


..O....................
O.O....................
.OO....................
.......................
.......................
.......O...............
.....O.O...............
......OO...............
.....................O.
....................O..
....................OOO
.......................
.......................
................O......
...............O.......
...............OOO.....
.......................
....................OO.
................O...OO.
...............O.O.....
..............O.O......
..............O........
.............OO........

:dying spark See spark. A spark by definition dies out completely after some number of ticks.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_l.htm0000755000175000017500000016455713317135606014353 00000000000000 Life Lexicon (L)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:L112 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HLx53B + BFx59H. After 112 ticks, it produces a Herschel turned 90 degrees counterclockwise at (12, -33) relative to the input. Its recovery time is 61 ticks; this can be reduced slightly by removing the output glider, either with a specialized eater (as in the original true p59 gun), or with a sparker as in most of the Quetzal guns. It can be made Spartan by replacing the aircraft carrier with an eater1. A ghost Herschel in the pattern below marks the output location:


...............OO.......
...............O........
.............OOO........
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
........................
.............OO.........
.............OO.........
....OO..................
....O..O................
OO....OO................
.O....................OO
.O.O..................O.
..OO................O.O.
....................OO..
........................
........................
........................
........................
........................
..O.....................
..O.O...................
..OOO...................
....O...................
........................
..............OO........
..............OO..OO....
..................O.O...
....................O...
....................OO..

:L156 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in August 1996. It is made up of three elementary conduits, HLx69R + RF28B + BFx59H. After 156 ticks, it produces a Herschel turned 90 degrees counterclockwise at (17, -41) relative to the input. Its recovery time is 62 ticks. It can be made Spartan by replacing the snake with an eater1 in one of two orientations. Additional gliders can be produced by removing the southeasternmost eater, or by replacing the RF28B elementary conduit by an alternate version. A ghost Herschel in the pattern below marks the output location:


...................OO........
...................O.........
.................OOO.........
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.............................
.................OO..........
.................OO..........
.............................
........OO.O.................
........O.OO.................
..........................OO.
..........................O..
........................O.O..
........................OO...
.............................
.........O...................
.........OOO.................
O...........O................
OOO........OO..............O.
...O......................O.O
..OO.......................O.
.............................
.............................
.............................
.............................
.............................
.............................
.O....................OO.....
.O.O..................O.O....
.OOO....................O....
...O...........OO.......OO...
...............O.............
................OOO..........
..................O..........

:lake (p1) Any still life consisting of a simple closed curve made from diagonally connected dominoes. The smallest example is the pond, and the next smallest is this (to which the term is sometimes restricted):


....OO....
...O..O...
...O..O...
.OO....OO.
O........O
O........O
.OO....OO.
...O..O...
...O..O...
....OO....

:lane A path traveled by a glider, or less commonly a spaceship such as a loafer. The lane is centered on the line of symmetry (if any) of the spaceship in question. If a lane is clear, then the spaceship can travel along it without colliding or interfering with any other objects.

Diagonal lanes are often numbered consecutively, in half-diagonals (hd). Occasionally diagonal lane measurements are given in quarter-diagonals (qd), in part because diagonally symmetric spaceships have a line of symmetry 1qd away from the lines available for gliders. It's also convenient that moving a glider forward by 100qd (for example) has the same effect as evolving the same glider for 100 ticks.

:Laputa (p2) Found by Rich Schroeppel, September 1992.


...OO.OO....
...OO.O...OO
........O..O
.OOOOOO.OOO.
O..O.O......
OO...O.OO...
....OO.OO...

:large prime oscillator Any oscillator with a relatively small bounding box whose period is a very large prime. (If the bounding-box restriction is removed, then eight gliders travelling in a four-Snark loop would provide a trivial example for any chosen prime.) The first such oscillator was built by Gabriel Nivasch in 2003. The current record holder is an oscillator constructed by Adam P. Goucher with a period that is a Mersenne prime with 13,395 digits (244497-1).

The next higher Mersenne-prime oscillator, period 286243-1, could be constructed with quadri-Snarks and semi-Snarks. It would actually be significantly smaller than the current record holder. As of June 2018 the construction of this pattern has not yet been completed.

:large S = big S

:Lidka (stabilizes at time 29053) A methuselah found by Andrzej Okrasinski in July 2005.


..........OOO..
..........O....
..........O...O
...........O..O
............OOO
...............
.O.............
O.O............
.O.............
The following variant, pointed out by David Bell, has two fewer cells and lasts two generations longer.

..........OOO..
...............
...........OO.O
............O.O
..............O
...............
.O.............
O.O............
.O.............

:Life A 2-dimensional 2-state cellular automaton discovered by John Conway in 1970. The states are referred to as ON and OFF (or live and dead). The transition rule is as follows: a cell that is ON will remain ON in the next generation if and only if exactly 2 or 3 of the 8 adjacent cells are also ON, and a cell that is OFF will turn ON if and only if exactly 3 of the 8 adjacent cells are ON. (This is more succinctly stated as: "If 2 of your 8 nearest neighbours are ON, don't change. If 3 are ON, turn ON. Otherwise, turn OFF.")

:Life32 A freeware Life program by Johan Bontes for Microsoft Windows 95/98/ME/NT/2000/XP: https://github.com/JBontes/Life32/.

:LifeHistory A multistate CA rule supported by Golly, equivalent to two-state B3/S23 Life but with several additional states intended for annotation purposes. A "history" state records whether an off cell has ever turned on in the past, and other states allow on and off cells to be permanently or temporarily marked, without affecting the evolution of the pattern.

:LifeLab A shareware Life program by Andrew Trevorrow for the Macintosh (MacOS 8.6 or later): http://www.trevorrow.com/lifelab/.

:LifeLine A newsletter edited by Robert Wainwright from 1971 to 1973. During this period it was the main forum for discussions about Life. The newsletter was nominally quarterly, but the actual dates of its eleven issues were as follows:


Mar, Jun, Sep, Dec 1971
Sep, Oct, Nov, Dec 1972
Mar, Jun, Sep 1973

:Lifenthusiast A Life enthusiast. Term coined by Robert Wainwright.

:lifesrc David Bell's Life search program for finding new spaceships and oscillators. This is a C implementation of an algorithm developed by Dean Hickerson in 6502 assembler.

Although lifesrc itself is a command-line program, Jason Summers has made a GUI version called WinLifeSearch for Microsoft Windows. A Java version, JavaLifeSearch, was written in November 2012 by Karel Suhajda.

The lifesrc algorithm is only useful for very small periods, as the amount of computing power required rises rapidly with increasing period. For most purposes, period 7 is the practical limit with current hardware.

Lifesrc is available from http://tip.net.au/~dbell/ (source code only). Compare gfind.

:LifeViewer A scriptable Javascript Life pattern viewer written by Chris Rowett, used primarily on the conwaylife.com discussion forums.

:light bulb (p2) Found in 1971.


.OO.O..
.O.OO..
.......
..OOO..
.O...O.
.O...O.
..O.O..
O.O.O.O
OO...OO
The same rotor can be embedded in a slightly smaller stator like this:

...O.....
.OOO.....
O........
OOOOOO...
......O..
..O...O..
..OO.O...
......OOO
........O

:lightspeed bubble A type of negative spaceship travelling through the zebra stripes agar. The center of the bubble is simple empty space, and the length and/or width of the bubble can usually be extended to any desired size.

Below is a small stabilized section of agar containing a sample lightspeed bubble, found by Gabriel Nivasch in August 1999. The bubble travels to the left at the speed of light, so it will eventually reach the edge of any finite patch and destroy itself and its supporting agar.


.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................O
.OOOOOOOOOOOOO..OOO..OOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O..............OO...OO...OO........O..........................
.OOOOOOOOOOOOO...OO...OO...O.OO.O....OOOOOOOOOOOOOOOOOOOOOOOO.
.............................OO.....O........................O
.OOOOOOOOOOOOO.................OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...............................O.............................
.OOOOOOOOOOOOO...................OOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.................................O....O......................O
.OOOOOOOOOOOOO...................OO....OOOOOOOOOOOOOOOOOOOOOO.
O................................O.....O....O.................
.OOOOOOOOOOOOO...................OO....OO....OOOOOOOOOOOOOOOO.
.................................O.....O.....O....O..........O
.OOOOOOOOOOOOO...................OO....OO....OO....OOOOOOOOOO.
O................................O.....O.....O.....O....O.....
.OOOOOOOOOOOOO...................OO....OO....OO....OO....OOOO.
.................................O.....O.....O.....O.....O...O
.OOOOOOOOOOOOO...................OO....OO....OO....OO....OOOO.
O................................O.....O.....O.....O....O.....
.OOOOOOOOOOOOO...................OO....OO....OO....OOOOOOOOOO.
.................................O.....O.....O....O..........O
.OOOOOOOOOOOOO...................OO....OO....OOOOOOOOOOOOOOOO.
O................................O.....O....O.................
.OOOOOOOOOOOOO...................OO....OOOOOOOOOOOOOOOOOOOOOO.
.................................O....O......................O
.OOOOOOOOOOOOO...................OOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...............................O.............................
.OOOOOOOOOOOOO.................OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................OO.....O........................O
.OOOOOOOOOOOOO...OO...OO...O.OO.O....OOOOOOOOOOOOOOOOOOOOOOOO.
O..............OO...OO...OO........O..........................
.OOOOOOOOOOOOO..OOO..OOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...

An open problem related to lightspeed bubbles was whether large extensible empty areas could be created whose length was not proportional to the width (as it must be in the above case, due to the tapering back edge). This was solved in February 2017 by Arie Paap; a simple period-2 solution is shown below.


...O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...........................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.............................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O.....................................................O.....O
.OOOOOOOOOOOOOOOOOOOO..OOO..OOO..OOO..OOOOOOOO..OOOO...OOOOO.
......................OO...OO...OO...OO........OO.....O......
.OOOOOOOOOOOOOOOOOOOO...OO...OO...OO...OOOOOOO...O.OO..OOOOO.
O.........................................O........OO.......O
.OOOOOOOOOOOOOOOOOOOO......................OO.O......OOOOOOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOO......................O.............OOO.
O..........................................OO.....OO....O...O
.OOOOOOOOOOOOOOOOOOOO......................OO...OO...O.OOOOO.
...........................................O..O.OO...O.......
.OOOOOOOOOOOOOOOOOOOO......................O......OO...OOOOO.
O..........................................OO..........O....O
.OOOOOOOOOOOOOOOOOOOO......................OO..........OOOOO.
...........................................O......OO.O.......
.OOOOOOOOOOOOOOOOOOOO......................O..O.OO...O.OOOOO.
O..........................................OO...OO......O...O
.OOOOOOOOOOOOOOOOOOOO......................OO.....OO.....OOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOO......................O...........OOOOO.
O..........................................OO.....OO.OO.....O
.OOOOOOOOOOOOOOOOOOOO......................OO...OO...OO..OOO.
...........................................O..O.OO.....OO....
.OOOOOOOOOOOOOOOOOOOO......................O......OO....OOOO.
O..........................................OO...............O
.OOOOOOOOOOOOOOOOOOOO......................OO...........OOOO.
...........................................O......OO...OO....
.OOOOOOOOOOOOOOOOOOOO......................O..O.OO...OO..OOO.
O..........................................OO...OO...OO.....O
.OOOOOOOOOOOOOOOOOOOO......................OO.....OO...OOOOO.
...........................................O............O....
.OOOOOOOOOOOOOOOOOOOOOO.....O.....O.....O..O.O...........OOO.
O.........................OO....OO....OO...O...O.O.......O..O
.OOOOOOOOOOOOOOOOOOOOOOOO.OO.OO.OO.OO.OO.OOOOOOOOO.......OOO.
........................................................O....
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...OOOOOOO.
O..................................................OO.......O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOO.
.............................................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...........................................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O..O...

:lightspeed ribbon = superstring

:lightspeed telegraph = telegraph.

:lightspeed wire Any wick that can burn non-destructively at the speed of light. Lightspeed wires are a type of reburnable fuse. These are potentially useful for various things, but so far the necessary mechanisms are very large and unwieldy. In October 2002, Jason Summers discovered a lightspeed reaction travelling through an orthogonal chain of beehives. Summers completed a period-1440 lightspeed telegraph based on this reaction in 2003.


...O...........................................................
.O...O.........................................................
.O....O....OO.OO...............................................
O......O...OOOOOO...OO...OO...OO...OO...OO...OO...OO...OO...OO.
O......O..O......O.O..O.O..O.O..O.O..O.O..O.O..O.O..O.O..O.O..O
OO.....O...OOOOOO...OO...OO...OO...OO...OO...OO...OO...OO...OO.
......O....OO.OO...............................................
....O..........................................................

A stable lightspeed transceiver mechanism using this same signal reaction, the p1 telegraph, was constructed by Adam P. Goucher in 2010; the bounding boxes of both the transmitter and receiver are over 5000 cells on a side. A more compact periodic high-bandwidth telegraph with a much improved transmission rate was completed by Louis-François Handfield in 2017.

The following diagram shows an older example of a lightspeed wire, with a small defect that travels along it at the speed of light. As of June 2018, no method has been found of creating such a defect in the upstream end of this particular stable wire, or of non-destructively detecting the arrival of the defect and repairing the wire at the downstream end.


....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
..........................................................
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
.O......O...............................................O.
O.OOOOO....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.O
.O.....O................................................O.
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
..........................................................
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....

:lightweight emulator = LW emulator

:lightweight spaceship = LWSS

:lightweight volcano = toaster

:linear growth A growth rate proportional to T, where T is the number of ticks that a pattern has been run. Compare superlinear growth, quadratic growth.

:linear propagator A self-replicating pattern in which each copy of a pattern produces one child that is an exact copy of itself. The child pattern then blocks the parent from any further replication. An example was constructed by Dave Greene on 23 November 2013, with a construction arm using two glider lanes separated by 9hd. By some definitions, due to its limited one-dimensional growth pattern, the linear propagator is not a true replicator. Compare quadratic replicator.

:line crosser A pattern which is able to send a signal across an infinite diagonal line of live cells without destroying the line. David Bell built one in August 2006. It uses many one-shot period 44160 glider guns on both sides of the line having the proper synchronization to create the reactions shown in line-cutting reaction and line-mending reaction.

An input glider can arrive at any multiple of 44160 generations to first cut the line, then send a glider through the gap, and finally mend the line while leaving an output glider on the other side.

A line crosser whose complete mechanism is on one side of the line is theoretically possible, using single-channel construction methods for example.

:line-cutting reaction A reaction that can cut an infinite diagonal line of cells, leaving a gap with both ends sealed. Such a reaction is demonstrated below. In actual use the reaction should be spread out so that the incoming LWSSes don't conflict. See line-mending reaction for a way to mend the gap.


.........................OO.................................
............OO...........O..................................
..........OO.OO...........O.................................
..........OOOO.............O................................
...........OO...............O...............................
................OO...........O..............................
...............O.O............O.............................
.................O.............O............................
................................O...........................
.................................O..........................
..................................O.........................
...................................O........................
.......................O............O.......................
......................OOO............O......................
......................O.OO............O.....................
O..O...................OOO.............O....................
....O..................OO...............O...................
O...O....................................O..................
.OOOO.....................................O.................
...........................................O................
............................................O...............
.............................................O..............
...................................OO.........O.............
....................................OO.........O............
...................................O............O...........
.................................................O..........
..................................................O.........
.....................................OOO...........O........
....................................O..O............O.......
.......................................O.............O......
.......................................O..............O.....
....................................O.O................O....
........................................................O...
.........................................................O.O
.......OOO................................................OO
.........O............OO......OOO..........OOOO.............
........O............O.O........O.........O...O.............
.......................O.......O..............O.............
..........................................O..O..............
............................................................
............................................................
............................................................
....................................................OO......
.....................................................OO.....
....................................................O.......
............................................................
........................................................OOO.
........................................................O..O
........................................................O...
........................................................O...
.........................................................O.O
.......................OO...................................
......................O.O...................................
........................O...................................
............................................................
..........................................O.................
.........................................OOO................
.........................................O.OO...............
..........................................OOO...............
..........................................OO................

:line-mending reaction A reaction which can fully mend a sealed gap in an infinite diagonal line of cells, such as the one produced by a line-cutting reaction. Such a reaction is demonstrated below. See the line cutting reaction for a way of creating the gliders travelling parallel to the line.


...........OO.............................................
...........O..............................................
............O.............................................
...O.O.......O............................................
....OO........O...........................................
....O..........O..........................................
................O...................................O.....
.................O................................OO......
..................O................................OO.....
...................O......................................
....................O.....................................
.....................O.....................O.O............
......................O....................OO.............
.......................O....................O.............
........................O.................................
.........................O................................
..........................O...............O...............
...........................O.............O................
............................O............OOO..............
.............................O............................
............................OO............................
..........................................................
..........................................................
..........................................................
...........................................O.O............
...........................................OO.......O..O..
............................................O......O......
...................................OOO.............O...O..
.....................................O.............OOOO...
....................................O.....................
.......................................OO.................
.......................................O.O................
..........................................O...............
...........................................O..............
...............................OO...........O.............
..............................O.O............O............
................................O.............O.......OO..
.............O..........................OO.....O.....OO...
.............OO.........................O.O.....O......O..
............O.O.....OO..................O........O........
...................O.O............................O.......
.O...................O.............................O......
.OO.....O...........................................O.....
O.O.....OO...........................................O....
.......O.O............................................O...
.......................................................O.O
........................................................OO
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
..........................................................
.................................O........................
................................OOO.......................
...............................OO.O.......................
...............................OOO........................
................................OO........................

This reaction uses spaceships on both sides of the line which need to be synchronized to each other, for example by passing a glider through the gap to trigger the creation of the required spaceships and gliders.

No simple mechanism is known to mend the gap which lies completely on one side of the line. However, it is technically possible to use construction arm technology to push objects through the gap to build and trigger a seed for the required synchronized signals on the other side.

:line puffer A puffer which produces its output by means of an orthogonal line of cells at right angles to the direction of travel. The archetypal line puffer was found by Alan Hensel in March 1994, based on a spaceship found earlier that month by Hartmut Holzwart. The following month Holzwart found a way to make extensible c/2 line puffers, and Hensel found a much smaller stabilization the following day. But in October 1995 Tim Coe discovered that for large widths these were often unstable, although typically lasting millions of generations. In May 1996, however, Coe found a way to fix the instability. The resulting puffers appear to be completely stable and to exhibit an exponential increase in period as a function of width, although neither of these things has been proved.

Line puffers have enabled the construction of various difficult periods for c/2 spaceships and puffers, including occasionally periods which are not multiples of 4 and which would therefore be impossible to attain with the usual type of construction based on standard spaceships. (See frothing puffer for another method of constructing such periods.) In particular, the first c/2 rake with period not divisible by 4 was achieved in January 2000 when David Bell constructed a p42 backrake by means of line puffers.

See also hivenudger and puff suppressor.

:line ship A spaceship in which the front end is a linestretcher, the line being eaten by the back end.

:linestretcher A wickstretcher that stretches a single diagonal line of cells. The first example was constructed by Jason Summers in March 1999; this was c/12 and used switch engine based puffers found earlier by Dean Hickerson. The first c/4 example was found by Hartmut Holzwart in November 2004.

:loading dock (p3) Found by Dave Buckingham, September 1972.


....O....
..OOO....
.O...OO..
O.OO...O.
.O...OO.O
..OO...O.
....OOO..
....O....

:loaf (p1)


.OO.
O..O
.O.O
..O.

:loafer (c/7 orthogonally, p7) A small c/7 spaceship discovered by Josh Ball on 17 February 2013:


.OO..O.OO
O..O..OO.
.O.O.....
..O......
........O
......OOO
.....O...
......O..
.......OO

It has a known 8-glider construction recipe, probably not minimal, discovered on the following day:


.................................O
...............................OO.
................................OO
.........O........................
.O........O.......................
..O.....OOO.......................
OOO...............................
..................................
..................................
.....O............................
......O...........................
....OOO...........................
........................O.O.......
.........................OO.......
.........................O........
..................................
...........................O.O....
...........................OO.....
............................O.....
...............................OOO
...............................O..
................................O.
..................................
..................................
..................................
..................................
..................................
..................................
.....OO...........................
......OO..........................
.....O............................
The loafer was therefore the first new glider-constructible spaceship in almost a decade. (A glider synthesis for a 2c/5 ship, 60P5H2V0, was found in March 2003.)

:loaflipflop (p15) Here four pentadecathlons hassle a loaf. Found by Robert Wainwright in 1990.


................O.................
...............OOO................
..................................
..................................
...............OOO................
..................................
...............O.O................
...............O.O................
..................................
...............OOO................
..................................
..................................
...............OOO................
................O.................
..................................
.O..O.OO.O..O...............OO....
OO..O....O..OO...OO.......O....O..
.O..O.OO.O..O...O..O.....O......O.
................O.O.....O........O
.................O......O........O
........................O........O
.........................O......O.
..........................O....O..
............................OO....
..................OOO.............
.................O...O............
................O.....O...........
..................................
...............O.......O..........
...............O.......O..........
..................................
................O.....O...........
.................O...O............
..................OOO.............

:loaf on loaf = bi-loaf

:loaf pull The following glider/loaf collision, which pulls a loaf (3,1) toward the glider source:


.O.....
O.O....
O..O...
.OO....
.......
.......
....OOO
....O..
.....O.

:loaf siamese barge (p1)


..OO.
.O..O
O.O.O
.O.O.
..O..

:lobster (c/7 diagonally, p7) A spaceship discovered by Matthias Merzenich in August 2011, the first diagonally travelling c/7 spaceship to be found. It consists of two gliders pulling a tagalong that then rephases them.


............OOO...........
............O.............
.............O..OO........
................OO........
............OO............
.............OO...........
............O..O..........
..........................
..............O..O........
..............O...O.......
...............OOO.O......
....................O.....
OO..O.O.............O.....
O.O.OO.............O......
O....O..OO.............OO.
......O...O......OO..OO..O
..OO......O......O..O.....
..OO....O.O....OO.........
.........O.....O...O...O..
..........O..O....OO......
...........OO...O.....O.O.
...............O........OO
...............O....O.....
..............O...O.......
..............O.....OO....
...............O.....O....

:logarithmic growth A pattern whose population or bounding box grows no faster than logarithmically, asymptotic to n.log(t) for some constant n. The first such pattern constructed was the caber tosser whose population is logarithmic, but whose bounding box still grows linearly. The first pattern whose bounding box and population both grow logarithmically was constructed by Jason Summers with Gabriel Nivasch in 2003. For a pattern with a slower growth rate than this, see Osqrtlogt.

:LoM = lumps of muck

:lone dot agar An agar in which every live cell is isolated in every generation. There are many different lone dot agars. All of them are phoenixes. In 1995 Dean Hickerson and Alan W. Hensel found stabilizations for finite patches of ten lone dot agars to create period 2 oscillators. One of these is shown below:


....OO..OO..OO..OO..OO..OO..OO..OO....
....O..O.O..O..O.O..O..O.O..O..O.O....
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
OO..O.O.....O.O.....O.O.....O.O.....OO
O.O.....O.O.....O.O.....O.O.....O.O..O
....O.......O.......O.......O.......O.
.O.......O.......O.......O.......O....
O..O.O.....O.O.....O.O.....O.O.....O.O
OO.....O.O.....O.O.....O.O.....O.O..OO
.....O.......O.......O.......O........
........O.......O.......O.......O.....
....O.O..O..O.O..O..O.O..O..O.O..O....
....OO..OO..OO..OO..OO..OO..OO..OO....

:lonely bee = worker bee

:long A term applied to an object that is of the same basic form as some standard object, but longer. For examples see long barge, long boat, long bookend, long canoe, long shillelagh, long ship and long snake.

:long^3 The next degree of longness after long long. Some people prefer "extra long".

:long^4 The next degree of longness after long^3. Some people prefer "extra extra long".

:long barge (p1)


.O...
O.O..
.O.O.
..O.O
...O.

:long boat (p1)


.O..
O.O.
.O.O
..OO
A long boat can be used as a 90-degree or 180-degree one-time turner.

:long bookend The following induction coil, longer than a bookend.


...OO
O...O
OOOO.

:long canoe (p1)


....OO
.....O
....O.
...O..
O.O...
OO....

:long hat = loop

:long hook = long bookend

:long house = dock

:long integral (p1)


..OO
.O.O
.O..
..O.
O.O.
OO..

:long long The next degree of longness after long. Some people prefer "very long".

:long long barge (p1)


.O....
O.O...
.O.O..
..O.O.
...O.O
....O.

:long long boat (p1)


.O...
O.O..
.O.O.
..O.O
...OO

:long long canoe (p1)


.....OO
......O
.....O.
....O..
...O...
O.O....
OO.....

:long long ship (p1)


OO...
O.O..
.O.O.
..O.O
...OO

:long long snake (p1)


OO....
O.O...
...O.O
....OO

:long shillelagh (p1)


OO..OO
O..O.O
.OO...

:long ship (p1)


OO..
O.O.
.O.O
..OO

:long sinking ship = long canoe

:long snake (p1)


OO...
O.O.O
...OO

:loop (p1)


.OO..
O..O.
.O.O.
OO.OO

:looping spaceship = reflectorless rotating oscillator

:lossless elbow A stationary elbow in a construction arm toolkit that allows a recipe to turn a corner with no exponential increase in construction cost. Compare slow elbow. It is theoretically possible to construct lossless elbows for early construction arms such as the one in the 10hd Demonoid, but these would currently have to be very large.

The lossless elbow that has been used the most in practice is the Snark, which can be constructed directly on a single-channel construction lane using a Snarkmaker recipe. Controlled demolition of a Snark is also possible, to remove a temporary elbow that is no longer needed, and leave a hand target in its place if necessary for further construction.

A Silver reflector was used as a lossless elbow in the first spiral growth pattern, attached to a separate universal constructor component.

:low-density Life = sparse Life

:lumps of muck The common evolutionary sequence that ends in the blockade. The name is sometimes used of the blockade itself, and can in general be used of any stage of the evolution of the stairstep hexomino.

:LW emulator (p4) The smallest (and least useful) emulator, found by Robert Wainwright in June 1980.


..OO.O..O.OO..
..O........O..
...OO....OO...
OOO..OOOO..OOO
O..O......O..O
.OO........OO.

:LWSS (c/2 orthogonally, p4) A lightweight spaceship, the smallest known orthogonally moving spaceship, and the second most common (after the glider). Found by Conway when one formed from a random soup in 1970. See also MWSS and HWSS.


.O..O
O....
O...O
OOOO.

The LWSS possesses a tail spark which can easily perturb other objects which grow into its path. The spaceship can also perturb some objects in additional ways. For examples, see blinker ship, hivenudger, and puffer train.

Dave Buckingham found that the LWSS can be synthesized in several different ways using three gliders, and can be constructed from two gliders and another small object in several more ways. Here is the fastest synthesis:


.O.....
O......
OOO....
.....OO
....OO.
......O
.......
..OO...
...OO..
..O....

:LWSS emulator = LW emulator

:LWSS-glider bounce The following reaction in which a LWSS and a glider collide to form a glider heading back between the two input paths:


.OOOO........
O...O........
....O.....OOO
O..O......O..
...........O.
This is one way to inject a glider into a existing glider stream. The infinite glider hotel uses this reaction.

:LWSS-LWSS bounce The following symmetric reaction in which two LWSSs collide head-on to form two gliders heading apart at 90 degrees from each other. Compare LWSS-LWSS deflection.


O..O.......O..O
....O.....O....
O...O.....O...O
.OOOO.....OOOO.
This provides one way to inject a glider into a existing glider stream. Another use is described in metamorphosis.

:LWSS-LWSS deflection The following symmetric reaction in which two LWSSs collide nearly head-on to form two gliders heading apart at 180 degrees from each other. Compare LWSS-LWSS bounce.


.........O..O
........O....
........O...O
........OOOO.
.............
.OOOO........
O...O........
....O........
O..O.........

:LWSS-to-G See 135-degree MWSS-to-G.

:LWTDS Life Worker Time Deficiency Syndrome. Term coined by Dieter Leithner to describe the problem of having to divide scarce time between Life and real life.

:LW volcano = toaster

:Lx200 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in June 1997. It is made up of two elementary conduits, HL141B + BFx59H. The Lx200 and F166 conduits are the two original dependent conduits (several more have since been discovered.) After 200 ticks, it produces an inverted Herschel turned 90 degrees counterclockwise at (17, -40) relative to the input. Its recovery time is 90 ticks. It can be made Spartan by replacing the snakes with eater1s in one of two orientations. A ghost Herschel in the pattern below marks the output location:


.....................OO.............
......................O.............
......................OOO...........
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
.......................OO...........
.......................OO...........
....................................
..............................O.OO..
..............................OO.O..
....................................
....................................
..............O.OO..................
..............OO.O..................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
................................OO..
................................O.O.
.OO...............................O.
OOO.OO............................OO
.OO.OOO.OO..........................
OOO.OO..OO..........................
OO..................................
....................................
....................................
....................................
................................OO..
................................OO..
....................................
......OO............................
.......O............................
....OOO.........................OO..
....O...........................OO..
..................OO................
.................O.O................
.................O..................
................OO........OO........
..........................O.........
...........................OOO......
.............................O......
The input shown here is a Herschel great-grandparent, since the input reaction is catalysed by the transparent block before the Herschel's standard form can appear.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_o.htm0000755000175000017500000004645313317135606014350 00000000000000 Life Lexicon (O)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:oblique Neither diagonal nor orthogonal. See also knightship.

:obo spark A spark of the form O.O (so called after its rle encoding).

:octagon II (p5) The first known p5 oscillator, discovered in 1971 independently by Sol Goodman and Arthur Taber. The name is due to the latter.


...OO...
..O..O..
.O....O.
O......O
O......O
.O....O.
..O..O..
...OO...

:octagon IV (p4) Found by Robert Wainwright, January 1979.


.......OO.......
.......OO.......
................
......OOOO......
.....O....O.....
....O......O....
...O........O...
OO.O........O.OO
OO.O........O.OO
...O........O...
....O......O....
.....O....O.....
......OOOO......
................
.......OO.......
.......OO.......

:octomino Any 8-cell polyomino. There are 369 such objects. The word is particularly applied to the following octomino (or its two-generation successor), which is fairly common but lacks a proper name:


..OO
..OO
OOO.
.O..

:odd keys (p3) Found by Dean Hickerson, August 1989. See also short keys and bent keys.


..........O.
.O.......O.O
O.OOO..OO.O.
.O..O..O....
....O..O....

:omino = polyomino

:omniperiodic A cellular automaton is said to be omniperiodic if it has oscillators of all periods. It is not known if Life is omniperiodic, although this seems likely. Dave Buckingham's work on Herschel conduits in 1996 (see My Experience with B-heptominos in Oscillators) left only a short list of unresolved cases, all with periods of 58 or below. The list has been progressively reduced since then. Most recently, period 43 and 53 oscillators were made possible in 2013 by Mike Playle's Snark. As of June 2018, no oscillators are known for periods 19, 23, 38, or 41. If we insist that the oscillator must be non-trivial, then 34 should be added to this list.

Note that if we were to allow infinite oscillators, then all periods are certainly possible, as any period of 14 or more can be obtained using a glider (or LWSS) stream, or an infinitely long 2c/3 wire containing signals with the desired separation.

:one per generation See grow-by-one object.

:one-sided spaceship synthesis A glider synthesis of a spaceship in which all gliders come from the same side of the spaceship's path. Such syntheses are used extensively in the 17c/45 Caterpillar. For example, here is a one-sided way to create an LWSS.


...O.....
....OO...
...OO....
.........
.........
.....O...
...O.O...
....OO...
.........
.........
.........
.........
......OOO
........O
.......O.
.........
.........
.........
OOO......
..O......
.O.......

:one-time A term used for turners and splitters, specifying that the reaction in question is not repeatable as it would be in a reflector or fanout device. Instead, the constellation is used up, usually in a clean reaction, but the much more common dirty turners and splitters are also very useful in some situations.

:onion rings For each integer n>1 onion rings of order n is a stable agar of density 1/2 obtained by tiling the plane with a certain 4n x 4n pattern. The tile for order 3 onion rings is shown below. The reader should be able to deduce the form of tiles of other orders.


......OOOOOO
.OOOO.O....O
.O..O.O.OO.O
.O..O.O.OO.O
.OOOO.O....O
......OOOOOO
OOOOOO......
O....O.OOOO.
O.OO.O.O..O.
O.OO.O.O..O.
O....O.OOOO.
OOOOOO......

:Online Life-Like CA Soup Search = The Online Life-Like CA Soup Search.

:on-off Any p2 oscillator in which all rotor cells die from overpopulation. The simplest example is a beacon. Compare flip-flop.

:O-pentomino Conway's name for the following pentomino, a traffic light predecessor, although not one of the more common ones.


OOOOO

:orbit A term proposed by Jason Summers to refer to a natural stabilization of a puffer. For example, the switch engine has two (known) orbits, the block-laying one and the glider-producing one.

:Orion (c/4 diagonally, p4) Found by Hartmut Holzwart, April 1993.


...OO.........
...O.O........
...O..........
OO.O..........
O....O........
O.OO......OOO.
.....OOO....OO
......OOO.O.O.
.............O
......O.O.....
.....OO.O.....
......O.......
....OO.O......
.......O......
.....OO.......
In May 1999, Jason Summers found the following smaller variant:

.OO..........
OO...........
..O..........
....O....OOO.
....OOO....OO
.....OOO.O.O.
............O
.....O.O.....
....OO.O.....
.....O.......
...OO.O......
......O......
....OO.......

:orphan Conway's preferred term for a Garden of Eden. According to some definitions, an orphan consists of just the minimum living and dead cells needed to ensure that no parent is possible, whereas a GoE is an entire infinite Life plane that contains an orphan.

:Orthogonoid (256c/3476016, p3476016) A self-constructing spaceship analogous to the Demonoids, with a slow orthogonal direction of travel. The first example was completed by Dave Greene on 29 June 2017, with a top speed of 16c/217251 (this is just 256c/3476016 in lowest terms).

The construction recipe is a stream of MWSSes, with the recovery time limited to 90 ticks by the Lx200 dependent conduit that follows the initial syringe converter. The design is hashlife-friendly, meaning that the spaceship can be trivially adjusted so that spatial and temporal offsets are exact powers of two; period 4194304 and period 8388608 versions have been constructed, with speeds of c/16384 and c/32768 respectively.

The MWSSes are converted to Herschels, which produce a standard single-channel glider stream that runs the Orthogonoid's single construction arm. After the child circuitry is complete, a previously constructed Snark in the parent is removed from the construction arm lane, converting it to a "destruction arm" that shoots down the previous constructor/reflector in the series.

:oscillator Any pattern that is a predecessor of itself. The term is usually restricted to non-stable finite patterns; period 1 oscillators are stable and are usually just called still lifes. The blinker is the smallest non-stable oscillator, having period 2. There are oscillators of almost all higher periods (see omniperiodic). In general cellular automaton theory the term "oscillator" usually covers spaceships as well, but this usage is not normal in Life.

Oscillators consisting of separate objects which do not react in any phase are usually ignored. For example, a separated blinker and pulsar makes a period 6 oscillator, but is considered trivial.

An oscillator can be divided into a rotor and a stator, and the stator can be further subdivided into bushing and casing. Some oscillators have no casing cells, and a few 100%-volatility oscillators also have no bushing cells.

An oscillator can be constructed from any gun as long as eaters can be added to consume its output. If it is a true gun then the period of the oscillator will be the same as the gun - unless the eating mechanism multiplies the period, as in the case of gliders caught by a boat-bit.

With the discovery of reflectors, relays provide an easy way to create oscillators of all large periods. For example, eight gliders travelling in a loop created by four Snarks can create any period above 42, with a population never exceeding 356 live cells.

For the very lowest periods, whole families of extensible oscillators are known. Examples of this are barberpole, cross, pentoad, p6 shuttle, snacker, and multiple roteightors. Any of the shuttles are oscillators by definition, for example the queen bee shuttle. Many of these are also extensible. Other oscillators such as figure-8 and tumbler have unique mechanisms that are not part of an extended family.

Some oscillators are useful because of the perturbations they can cause to other objects. This is especially true if they provide a spark on their boundary. Some oscillators are explicitly found by search programs in order to produce these sparks, such as pipsquirters.

Some higher period oscillators have been found while running random soups. This is especially true if the soup is run on a cylindrical or torus universe. Sometimes the found objects can be moved to the normal universe and supported there by added catalysts. Achim's p144 is an example.

:Osqrtlogt (p1 circuitry) A pattern constructed by Adam P. Goucher in 2010, which uses an unbounded triangular region as memory for a binary counter. Empty space is read as a zero, and a boat as a one, as shown in the example pattern in memory cell. The pattern's diametric growth rate is O(sqrt(log(t))), which is the slowest possible for any Life pattern, or indeed any 2D Euclidean cellular automaton. The population returns infinitely often to its initial minimum value (during carry operations from 11111...1 to 100000...0, so it can be considered to be an unusual form of sawtooth.

:OTCA metapixel (p46 circuitry) A 2048 x 2048 period 35328 metacell constructed by Brice Due in 2006. It contains a large "pixel" area that contains a large population of LWSSes when the metacell state is ON, but is empty when it is OFF. This allows the state of the metacell to be visible at high zoom levels, unlike previous unit cells where the state was signaled by the presence or absence of a single glider in a specific location.

:out of the blue See natural Heisenburp. Other similar mechanisms, particularly the method of LWSS creation used in the pixel part of the OTCA metapixel, may also be referred to as "out of the blue" reactions.

:overclocking A term used when a circuit can accept a signal at a specific period which it cannot accept at a higher period. A syringe is a simple example.

Some staged recovery circuits also permit overclocking, and can function successfully at a rate faster than their recovery time. A Silver reflector has a recovery time of 497 ticks, but can be overclocked to reflect a period 250 glider stream, or any nearby period above 248, simply by removing a beehive after the first glider enters the reflector. However, a continuous stream of gliders is then required to maintain the circuit, with timing within a tightly bounded range.

:overcrowding = overpopulation

:over-exposure = underpopulation

:overpopulation Death of a cell caused by it having more than three neighbours. See also underpopulation.

:over-unity reaction An important concept in gun and macro-spaceship construction. To be a good candidate for building one of these types of patterns with a new period or speed, a stationary reaction (for a gun) or a moving reaction (for a macro-spaceship) must be able to produce some number of output signals, strictly greater than the number of input signals required to maintain the reaction. The extra signal becomes a gun's output stream, or may be used in a variety of ways to construct the supporting track for a macro-spaceship. By implication, "over-unity" refers to the ratio of output signals to input signals.

If all signal outputs must be used up to sustain a stationary reaction, a high-period oscillator may still be possible. See emu for example.

:overweight spaceship = OWSS

:OWSS A would-be spaceship similar to LWSS, MWSS and HWSS but longer. On its own an OWSS is unstable, but it can be escorted by true spaceships to form a flotilla.

:Ox A 1976 novel by Piers Anthony which involves Life.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_1.htm0000755000175000017500000014271613317135606014251 00000000000000 Life Lexicon (1)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:0hd Demonoid See Demonoid.

:101 (p5) Found by Achim Flammenkamp in August 1994. The name was suggested by Bill Gosper, noting that the phase shown below displays the period in binary.


....OO......OO....
...O.O......O.O...
...O..........O...
OO.O..........O.OO
OO.O.O..OO..O.O.OO
...O.O.O..O.O.O...
...O.O.O..O.O.O...
OO.O.O..OO..O.O.OO
OO.O..........O.OO
...O..........O...
...O.O......O.O...
....OO......OO....

:10hd Demonoid See Demonoid.

:119P4H1V0 (c/4 orthogonally, p4) A spaceship discovered by Dean Hickerson in December 1989, the first spaceship of its kind to be found. Hickerson then found a small tagalong for this spaceship which could be attached to one side or both. These three variants of 119P4H1V0 were the only known c/4 orthogonal spaceships until July 1992 when Hartmut Holzwart discovered a larger spaceship, 163P4H1V0.


.................................O.
................O...............O.O
......O.O......O.....OO........O...
......O....O....O.OOOOOO....OO.....
......O.OOOOOOOO..........O..O.OOO.
.........O.....O.......OOOO....OOO.
....OO.................OOO.O.......
.O..OO.......OO........OO..........
.O..O..............................
O..................................
.O..O..............................
.O..OO.......OO........OO..........
....OO.................OOO.O.......
.........O.....O.......OOOO....OOO.
......O.OOOOOOOO..........O..O.OOO.
......O....O....O.OOOOOO....OO.....
......O.O......O.....OO........O...
................O...............O.O
.................................O.

:1-2-3 (p3) Found by Dave Buckingham, August 1972. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are stillater and cuphook.


..OO......
O..O......
OO.O.OO...
.O.O..O...
.O....O.OO
..OOO.O.OO
.....O....
....O.....
....OO....

:1-2-3-4 (p4) See also Achim's p4.


.....O.....
....O.O....
...O.O.O...
...O...O...
OO.O.O.O.OO
O.O.....O.O
...OOOOO...
...........
.....O.....
....O.O....
.....O.....

:135-degree MWSS-to-G The following converter, discovered by Matthias Merzenich in July 2013. It accepts an MWSS as input, and produces an output glider travelling at a 135-degree angle relative to the input direction.


......OO......
......O.O.OO.O
........O.O.OO
........OO....
..............
..............
.OOOOO.....OO.
O....O.....OO.
.....O........
O...O.........
..O...........

:14-ner = fourteener

:17c/45 spaceship A spaceship travelling at seventeen forty-fifths of the speed of light. This was the first known macro-spaceship speed. See Caterpillar for details.

:180-degree kickback The only other two-glider collision besides the standard kickback that produces a clean output glider with no leftover ash. The 180-degree change in direction is occasionally useful in glider synthesis, but is rarely used in signal circuitry or in self-supporting patterns like the Caterpillar or Centipede, because 90-degree collisions are generally much easier to arrange.


.O.
O..
OOO
...
...
.OO
O.O
..O

:1G seed See seed.

:(2,1)c/6 spaceship A knightship that travels obliquely at the fastest possible speed. To date the only known example of a spaceship with this velocity is Sir Robin.

:(23,5)c/79 Herschel climber The following glider-supported Herschel climber reaction used in the self-supporting waterbear knightship, which can be repeated every 79 ticks, moving the Herschel 23 cells to the right and 5 cells upward, and releasing two gliders to the northwest and southwest. As the diagram shows, it is possible to substitute a loaf or other still lifes for some or all of the support gliders. This fact is used to advantage at the front end of the waterbear.


...............O.O...............O..
...............OO...............O.O.
................O...............O..O
.................................OO.
....................................
....................................
....................................
....................................
....................................
....................................
....................................
....................................
O...................................
O.O.................................
OOO.................................
..O.................................

:24-cell quadratic growth A 39786x143 quadratic growth pattern found by Michael Simkin in October 2014, two days after 25-cell quadratic growth and a week before switch-engine ping-pong.

:25-cell quadratic growth A 25-cell quadratic growth pattern found by Michael Simkin in October 2014, with a bounding box of 21372x172. It was the smallest-population quadratic growth pattern for two days, until the discovery of 24-cell quadratic growth. It superseded wedge, which had held the record for eight years. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:25P3H1V0.1 (c/3 orthogonally, p3) A spaceship discovered by Dean Hickerson in August 1989. It was the first c/3 spaceship to be discovered. In terms of its 25 cells, it is tied with 25P3H1V0.2 as the smallest c/3 spaceship. Unlike 25P3H1V0.2, it has a population of 25 in all of its phases, as well as a smaller bounding box.


.......OO.O.....
....OO.O.OO.OOO.
.OOOO..OO......O
O....O...O...OO.
.OO.............
Martin Grant discovered a glider synthesis for 25P3H1V0.1 on 6 January 2015.

:25P3H1V0.2 (c/3 orthogonally, p3) A spaceship discovered by David Bell in early 1992, with a minimum of 25 cells - the lowest number of cells known for any c/3 spaceship. A note in Spaceships in Conway's Life indicates that it was found with a search that limited the number of live cells in each column, and possibly also the maximum cross-section (4 cells in this case). See also edge-repair spaceship for a very similar c/3 spaceship with a minimum population of 26.


..........O.....
........OOO.OOO.
.......OO......O
..O...O..O...OO.
.OOOO...........
O...O...........
.O.O..O.........
.....O..........
In December 2017 a collaborative effort found a 26-glider synthesis for this spaceship.

:26-cell quadratic growth = wedge.

:295P5H1V1 (c/5 diagonally, p5) The first spaceship of its type to be discovered, found by Jason Summers on 22 November 2000.


.............OO.....................................
.....OO....OO.O.O...................................
....OOO....OOOO.....................................
...OO......OO.....O.................................
..OO..OO...O..O..O..................................
.OO.....O.......O..OO...............................
.OO.O...OOOO........................................
....O...OO..OO.O....................................
.....OOO....O.O.....................................
......OO...OO..O....................................
......O.....O.......................................
.OOOO.O..O..O...O...................................
.OOO...OOOOO..OOOOOOO.O.............................
O.O....O..........O..OO.............................
OOO.O...O...O.....OOO...............................
.......O.O..O.......OO..............................
.O...O.....OO........OO..O.O........................
....O.......O........OOO.O.OOO......................
...O........OOO......O....O.........................
.....O......O.O.....O.O.............................
.....O......O.OO...O....O...........................
.............O.OOOO...O.....O..O....................
............OO..OO.O.O...O.OOO......................
.................O......O..OOO...OOO................
....................O..O......OO....................
................OO....O..O..........OO..............
..................O.............O...O...............
................OO....OO........O...................
.................O...OOO........O.O.O.O.............
.................O....OO........O.....OO............
........................O........O..OOO.............
.....................O..O........O........O.........
..........................OOOO........OO...O........
.......................O......OO......OO...O........
.......................O....O............O..........
.......................O...............O............
.........................OO.O.O.......O..O..........
.........................O....O.........OOO.........
............................OOO.OO..O...O...O.OO....
.............................O..OO.O.....O...O..O...
.....................................OO..O...O......
..................................O.OO.OO.O..OO...O.
...............................O.....O...O.......O.O
................................OO............OO...O
......................................O.......OO....
.......................................OOO...OO..O..
......................................O..O.OOO......
......................................O....OO.......
.......................................O............
..........................................O..O......
.........................................O..........
..........................................OO........

:2c/3 Two thirds of the speed of light - the speed of signals in a 2c/3 wire or of some against the grain negative spaceship signals in the zebra stripes agar, and also the speed of burning of the blinker fuse and the bi-block fuse.

:2c/3 wire A wire discovered by Dean Hickerson in March 1997, using his dr search program. It supports signals that travel through the wire diagonally at two thirds of the speed of light.


......O..O.......................................
....OOOOOO.......................................
...O.............................................
...O..OOOOOO.....................................
OO.O.O.O....O....................................
OO.O.O.OOOOOO....................................
....OO.O.......O.................................
.......O..OOOOOO.................................
.......O.O.......................................
......OO.O..OOOOOO...............................
.........O.O......O..............................
.........O.O..OOOOO..............................
..........OO.O.......O...........................
.............O..OOOOOO...........................
.............O.O.................................
............OO.O..OOOOOO.........................
...............O.O......O........................
...............O.O..OOOOO........................
................OO.O.......O.....................
...................O..OOOOOO.....................
...................O.O...........................
..................OO.O..OOOOOO...................
.....................O.O......O..................
.....................O.O..OOOOO..................
......................OO.O.......O...............
.........................O..OOOOOO...............
.........................O.O.....................
........................OO.O..OOOOOO.............
...........................O.O......O............
...........................O.O..OOOOO............
............................OO.O.......O.........
...............................O..OOOOOO.........
...............................O.O...............
..............................OO.O..OOOOOO.......
.................................O.O......O......
.................................O.O..OOOOO......
..................................OO.O.......O...
.....................................O..OOOOOO...
.....................................O.O.........
....................................OO.O..OOOOOO.
.......................................O.O......O
.......................................O.O..OOO.O
........................................OO.O...O.
...........................................O..O..
...........................................O.O...
..........................................OO.O.O.
..............................................OO.

Each 2c/3 signal is made up of two half-signals that can be separated from each other by an arbitrary number of ticks.

Considerable effort has been spent on finding a way to turn a 2c/3 signal 90 or 180 degrees, since this would by one way to prove Life to be omniperiodic. There is a known 2c/3 converter shown under signal elbow, which converts a standard 2c/3 signal into a double-length signal. This is usable in some situations, but unfortunately it fails when its input is a double-length signal, so it can't be used to complete a loop.

Noam Elkies discovered a glider synthesis of a reaction that can repeatably insert a signal into the upper end of a 2c/3 wire. See stable pseudo-Heisenburp for details. On 11 September 2017, Martin Grant reduced the input reaction to five gliders, or three gliders plus a Herschel. With the Herschel option the recovery time is 152 ticks.

See also 5c/9 wire.

:2c/5 spaceship A spaceship travelling at two fifths of the speed of light. The only such spaceships that are currently known travel orthogonally. Examples include 30P5H2V0, 44P5H2V0, 60P5H2V0, and 70P5H2V0. As of June 2018, only 30P5H2V0 and 60P5H2V0 have known glider synthesis recipes.

:2c/7 spaceship A spaceship travelling at two sevenths of the speed of light. The only such spaceships that are currently known travel orthogonally. The first to be found was the weekender, found by David Eppstein in January 2000. See also weekender distaff.

:2 eaters = two eaters

:2-engine Cordership The smallest known Cordership, with a minimum population of 100 cells, discovered by Aidan F. Pierce on 31 December 2017. Luka Okanishi produced a 9-glider synthesis of the spaceship on the same day.


............O............................
............O.....OOO....................
...........O.O...OO..O...................
............O...O.....O..................
............O...O........................
.................O..OO...................
..................OO...........OO........
...............................OO........
.........................................
.........................................
.........................................
.........................................
.........................................
.........................................
.OOO...................................OO
.OOO.....................O.............OO
..O............OO.........OO.............
...OO.........O.OOO........OO............
....O.........O...O..........O...........
...O...........OO.O.....OOOOO............
................O..........O.............
.........................................
.........................................
.OO......................................
.OO......................................
..O......................................
..O......................................
.O.O.....................................
O........................................
.O..OO...................................
..O...O..................................
....OO...................................
....O....................................
.........................................
.........................................
.........................................
.........................................
.........................................
.........................................
......OO.................................
......OO.................................
...................O.....................
...................OOO...................
....................OO...................
....................O....................
.........................................
..................OO.O...................
..................OOOO...................
....................OO...................

:2-glider collision Two gliders can react with each other in many different ways, either at right angles, or else head-on. A large number of the reactions cleanly destroy both gliders leaving nothing. Many of the remaining reactions cleanly create some common objects, and so are used as the first steps in glider synthesis or as part of constructing interesting objects using rakes. Only a small number of collisions can be considered dirty due to creating multiple objects or a mess.

Here is a list of the possible results along with how many different ways they can occur (ignoring reflections and rotations).

  -------------------------------
  result     right-angle  head-on
  -------------------------------
  nothing             11       17
  beehive              1        0
  B-heptomino          1        2
  bi-block             1        0
  blinker              2        1
  block                3        3
  boat                 0        1
  eater1               1        0
  glider               1        1
  honey farm           3        2
  interchange          1        0
  loaf                 0        1
  lumps of muck        1        0
  octomino             0        1
  pi-heptomino         2        1
  pond                 1        1
  teardrop             1        0
  traffic light        2        1
  four skewed blocks   0        1
  dirty                6        0
  -------------------------------
The messiest of the two-glider collisions in the "dirty" category is 2-glider mess.

:2-glider mess A constellation made up of eight blinkers, four blocks, a beehive and a ship, plus four emitted gliders, created by the following 2-glider collision.


..O.........
O.O.........
.OO.........
...........O
.........OO.
..........OO
Two of the blocks, two of the gliders, and the ship are the standard signature ash of a Herschel.

:30P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Paul Tooke on 7 December 2000. With just 30 cells, it is currently the smallest known 2c/5 spaceship. A glider synthesis for 30P5H2V0 was found by Martin Grant in January 2015, based on a predecessor by Tanner Jacobi.


....O........
...OOO.......
..OO.OO......
.............
.O.O.O.O..O..
OO...O...OOO.
OO...O......O
..........O.O
........O.O..
.........O..O
............O

:31c/240 The rate of travel of the 31c/240 Herschel-pair climber reaction, and Caterpillar-type spaceships based on that reaction. Each Herschel travels 31 cells orthogonally every 240 ticks.

:31c/240 Herschel-pair climber The mechanism defining the rate of travel of the Centipede and shield bug spaceships. Compare pi climber. It consists of a pair of Herschels climbing two parallel chains of blocks. Certain spacings between the block chains allow gliders from each Herschel to delete the extra ash objects produced by the other Herschel. Two more gliders escape, one to each side, leaving only an exact copy of the original block chains, but shifted forward by 9 cells:


OO.........................................................OO
OO.........................................................OO
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
OO.........................................................OO
OO.........................................................OO
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.......................................................OOO...
.......................................................O..O..
.......................................................O..O..
......................................................OOOO...
.......OOO............................................OO.....
........O............................................O.......
......OOO.............................................O......
......................................................O......

:3c/7 spaceship A spaceship travelling at three sevenths of the speed of light. The only such spaceships that are currently known travel orthogonally. The first to be found was the spaghetti monster, found by Tim Coe in June 2016.

:3-engine Cordership See Cordership.

:44P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Dean Hickerson on 23 July 1991, the first 2c/5 spaceship to be found. Small tagalongs were found by Robert Wainwright and David Bell that allowed the creation of arbitrarily large 2c/5 spaceships. These were the only known 2c/5 spaceships until the discovery of 70P5H2V0 in December 1992.


....O.....O....
...OOO...OOO...
..O..O...O..O..
.OOO.......OOO.
..O.O.....O.O..
....OO...OO....
O....O...O....O
.....O...O.....
OO...O...O...OO
..O..O...O..O..
....O.....O....

:45-degree LWSS-to-G = 45-degree MWSS-to-G.

:45-degree MWSS-to-G The following small converter, which accepts an MWSS or LWSS as input and produces an output glider travelling at a 45-degree angle relative to the input direction.


.........O.OO....O.....
.........OO.O...O.O....
................O.O....
.......OOOOO...OO.OOO..
......O..O..O........O.
......OO...OO..OO.OOO..
...............OO.O....
......................O
....................OOO
...................O...
...................OO..
.OOOOO.................
O....O.................
.....O.................
O...O..................
..O.............OO.....
...............O..O....
................OO.....
........OO.............
.......O.O.............
.......O...............
......OO...............
...................OO..
...................O...
....................OOO
......................O

:4-8-12 diamond The following pure glider generator.


....OOOO....
............
..OOOOOOOO..
............
OOOOOOOOOOOO
............
..OOOOOOOO..
............
....OOOO....

:4 boats (p2)


...O....
..O.O...
.O.OO...
O.O..OO.
.OO..O.O
...OO.O.
...O.O..
....O...

:4F = Fast Forward Force Field. This term is no longer in common use.

:4g-to-5g reaction A reaction involving 4 gliders which cleanly produces 5 gliders. The one shown below was found by Dieter Leithner in July 1992:


O.O..........................................
.OO..........................................
.O...........................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.................O...........................
...............O.O..O........................
................OO..O.O....................O.
....................OO....................OO.
..........................................O.O

The first two gliders collide to produce a traffic light and glider. The other two gliders react symmetrically with the evolving traffic light to form four gliders. A glider gun can be built by using reflectors to turn four of the output gliders so that they repeat the reaction.

:56P6H1V0 (c/6 orthogonally, p6) A 56-cell spaceship discovered by Hartmut Holzwart in 2009, the smallest known c/6 orthogonal spaceship as of July 2018.


.....OOO..........OOO.....
OOO.O.......OO.......O.OOO
....O...O..O..O..O...O....
....O.....O....O.....O....
..........OO..OO..........
.......O...O..O...O.......
.......O.O......O.O.......
........OOOOOOOOOO........
..........O....O..........
........O........O........
.......O..........O.......
........O........O........

:58P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Matthias Merzenich on 5 September 2010. In terms of its minimum population of 58 cells it is the smallest known c/5 diagonal spaceship. It provides sparks at its trailing edge which can perturb gliders, and this property was used to create the first c/5 diagonal puffers. These sparks also allow the attachment of tagalongs which was used to create the first c/5 diagonal wickstretcher in January 2011.


....................OO.
....................OO.
...................O..O
................OO.O..O
......................O
..............OO...O..O
..............OO.....O.
...............O.OOOOO.
................O......
.......................
.......................
.............OOO.......
.............O.........
...........OO..........
.....OO....O...........
.....OOO...O...........
...O....O..............
...O...O...............
.......O...............
..OO.O.O...............
OO.....O...............
OO....OO...............
..OOOO.................

:5c/9 wire A wire discovered by Dean Hickerson in April 1997, using his dr search program. It supports signals that travel through the wire diagonally at five ninths of the speed of light. See also 2c/3 wire.


....O.OO............................................
....OO..O...........................................
.......O..O.........................................
..OOOOO.OO.O..O.....................................
.O..O...O..OOOO.....................................
.O.OO.O.O.O......O..................................
OO.O.OOOO.O..OOOOO..................................
...O......O.O.....OO................................
OO.O.OOOO.O..O.OO.O.O...............................
O..O.O..O.OO.O.O.O..O...............................
..OO..O..O...O.O....O.OO............................
....OO....OOOO.OO..OO..O............................
....O...O.O......O...O..............................
.....OOOO.O.OOOOO.OOO...O...........................
.........O.O....O.O..OOOO...........................
.......O...O..O...O.O......O........................
.......OO..O.O.OOOO.O..OOOOO........................
..........OO.O......O.O.....OO......................
.............O.OOOO.O..O.OO.O.O.....................
.............O.O..O.OO.O.O.O..O.....................
............OO..O..O...O.O....O.OO..................
..............OO....OOOO.OO..OO..O..................
..............O...O.O......O...O....................
...............OOOO.O.OOOOO.OOO...O.................
...................O.O....O.O..OOOO.................
.................O...O..O...O.O......O..............
.................OO..O.O.OOOO.O..OOOOO..............
....................OO.O......O.O.....OO............
.......................O.OOOO.O..O.OO.O.O...........
.......................O.O..O.OO.O.O.O..O...........
......................OO..O..O...O.O....O.OO........
........................OO....OOOO.OO..OO..O........
........................O...O.O......O...O..........
.........................OOOO.O.OOOOO.OOO...O.......
.............................O.O....O.O..OOOO.......
...........................O...O..O...O.O......O....
...........................OO..O.O.OOOO.O..OOOOO....
..............................OO.O......O.O.....OO..
.................................O.OOOO.O..O.OO.O..O
.................................O.O..O.OO.O.O.O..OO
................................OO..O..O...O.O......
..................................OO....OOOO.OO.....
..................................O...O.O......O....
...................................OOOO.O.OOOOO.O...
.......................................O.O....O.O...
.....................................O...O..O...OO..
.....................................OO..O.O.OOO..O.
........................................OO.O.....O..
............................................O.OOO...
.............................................OO.....

:60P312 (p312) Found by Dave Greene, 1 November 2004, based on 92P156.


....................OO....................
....................OO....................
..........................................
..........................................
..........................................
...............................OO.........
......................OO......O..O........
......................O........OO.........
......O...............O...................
.....O.O...............O..................
.....O.O..................................
......O...................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
................................O..O......
.................................OOO......
OO......................................OO
OO......................................OO
......OOO.................................
......O..O................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...................................O......
..................................O.O.....
..................O...............O.O.....
...................O...............O......
.........OO........O......................
........O..O......OO......................
.........OO...............................
..........................................
..........................................
..........................................
....................OO....................
....................OO....................

:60P5H2V0 (2c/5 orthogonally, p5) A 60-cell spaceship discovered by Tim Coe in May 1996. It was the first non-c/2 orthogonal spaceship to be successfully constructed via glider synthesis.


.....O.......O.....
...OO.OO...OO.OO...
......OO...OO......
........O.O........
.O....O.O.O.O....O.
OOO.....O.O.....OOO
O.....O.O.O.O.....O
..O..O..O.O..O..O..
..OO...OO.OO...OO..
O.......O.O.......O
O......OO.OO......O

:67P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Nicolay Beluchenko in July 2006. It was the smallest known c/5 diagonal spaceship until the discovery of 58P5H1V1 in September 2010.


.....OOO..............
....O...OO............
...OO...O.............
..O.....O.............
.O.OO....OO...........
OO..O......O..........
...OO..O..............
...OO.OO..............
....O.................
.....OOOOO............
......O..OOO..OO......
.........O.OO..O.OO...
.........O...O.O..O...
..........OOOOO.....O.
.........O..O..O.....O
.....................O
................OOO...
................O.....
...............O......
................OO....

:70P5H2V0 (2c/5 orthogonally, p5) A spaceship discovered by Hartmut Holzwart on 5 December 1992.


..O............O..
.O.O..........O.O.
OO.OO........OO.OO
OO..............OO
..O............O..
..OOOO......OOOO..
..O..OO....OO..O..
...OO..O..O..OO...
....OO.OOOO.OO....
.....O.O..O.O.....
......O....O......
..................
.....O......O.....
...OO.OO..OO.OO...
....O........O....
....OO......OO....

:7x9 eater A high-clearance eater5 variant that can suppress passing gliders in tight spaces, such as on the inside corner of an R64 Herschel conduit. Like the eater5 and sidesnagger, the 7x9 eater is able to eat gliders coming from two directions, though this ability is not commonly used.


.O..........
..O.........
OOO.........
............
......O.....
.....O......
.....OOO....
............
............
......O...OO
.....O.O...O
.....OO...O.
.........O..
.....OOOOO.O
.....O....OO
......OOO...
........O.OO
.........O.O

:83P7H1V1 = lobster

:86P5H1V1 (c/5 diagonally, p5) A spaceship discovered by Jason Summers on January 8, 2005. It was the smallest known c/5 diagonal spaceship until the discovery of 67P5H1V1 in July 2006.


.........OOO...........
........O..............
.......O...............
...........OO..........
........OO.O...........
..............OOO......
...........O..OO..OO...
..O........OO.O...OO...
.O..O......O..OO.......
O...O..................
O...........O..O.......
O..OO.OOO...O...OO.OO..
...O...O..OO..O..O.....
.................OO..O.
.....OOOO...O.....O...O
.....OO.O.O..........O.
.....O.....O......OO...
...........OOO.........
......OO.....OO.O......
......OO...O....O......
...........O...........
.............O.O.......
..............O........

:90-degree kickback See kickback reaction.

:92P156 (p156) Discovered by Jason Summers on October 31, 2004. It is actually an eight-barrel glider gun, with all output gliders suppressed by eater1s. Replacing each pair of eater1s with a beehive doubles the period and produces 60P312.


....................OO....................
....................OO....................
..........................................
..........................................
..........................................
........OO......................OO........
.........O............OO........O.........
.........O.O..........O.......O.O.........
.....O....OO..........O.......OO....O.....
.....OOO...............O..........OOO.....
........O........................O........
.......OO........................OO.......
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
................................O..O......
.................................OOO......
OO......................................OO
OO......................................OO
......OOO.................................
......O..O................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
.......OO........................OO.......
........O........................O........
.....OOO..........O...............OOO.....
.....O....OO.......O..........OO....O.....
.........O.O.......O..........O.O.........
.........O........OO............O.........
........OO......................OO........
..........................................
..........................................
..........................................
....................OO....................
....................OO....................

:9hd Separated by 9 half diagonals. Specifically used to describe the distance between the two construction lanes in the linear propagator.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_c.htm0000755000175000017500000025522313317135606014331 00000000000000 Life Lexicon (C)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:c = speed of light

:c/10 spaceship A spaceship travelling at one tenth of the speed of light. The first such spaceship to be discovered was the orthogonally travelling copperhead, found by 'zdr' on 5 March 2016. Simon Ekström found the related fireship two weeks later. A Caterloopillar can theoretically be configured to move at c/10, but there are technical difficulties with speeds of the form 4n+2, and as of June 2018 this has not been done in practice.

:c/12 spaceship A spaceship travelling at one twelfth of the speed of light. The only diagonal spaceships that are currently known to move at this speed are the Corderships. An orthogonal Caterloopillar has been configured to move at c/12.

:c/2 spaceship A spaceship travelling at half the speed of light. Such spaceships necessarily move orthogonally. The first to be discovered was the LWSS. For other examples see Coe ship, ecologist, flotilla, hammerhead, hivenudger, HWSS, MWSS, puffer train, puff suppressor, pushalong, Schick engine, sidecar, still life tagalong and x66.

:c/3 spaceship A spaceship travelling at one third of the speed of light. All known c/3 spaceships travel orthogonally. The first was 25P3H1V0.1, found in August 1989 by Dean Hickerson. For further examples see brain, dart, edge-repair spaceship, fly, turtle and wasp.

:c/4 spaceship A spaceship travelling at one quarter of the speed of light. The first such spaceship to be discovered was, of course, the glider, and this remained the only known example until December 1989, when Dean Hickerson found the first orthogonal example, 119P4H1V0, and also a new diagonal example (the big glider). For other examples see B29, Canada goose, crane, Enterprise, edge-repair spaceship (third pattern), non-monotonic, Orion, quarter, sparky, swan and tagalong. It is known that c/4 is the fastest possible speed for a (45-degree) diagonal spaceship.

:c/5 spaceship A spaceship travelling at one fifth of the speed of light. The first such spaceship to be discovered was the snail, found by Tim Coe in January 1996. The first diagonally moving example, 295P5H1V1, was found by Jason Summers in November 2000. For other c/5 ships see 58P5H1V1, 67P5H1V1, 86P5H1V1 and spider. A Caterloopillar has also been configured to move at c/5.

:c/6 spaceship A spaceship travelling at one sixth of the speed of light. The first such spaceship to be discovered was the dragon, found by Paul Tooke in April 2000. The first diagonally moving example was the seal, found by Nicolay Beluchenko in September 2005. Another orthogonal c/6 spaceship, found by Paul Tooke in March 2006, is shown below. For the smallest known c/6 spaceship see 56P6H1V0.


..O..............O..................................O.....
O..O..OOO.......O.OOOO...............OO...........OO.O....
O..O............OOO.O.O.........O.....O.......O...O.......
.O.O..O.....................OOO..O.O.OOO.....O.O.O....O...
..OO......O....O................OOOOOO..O..O...O...O..O...
.O.O...OO.....O...OO......OO.OO..O..OO..O.O.OO..O.........
..O.....O.OO..O...OO......OO....O.O.O..O..O.O.O......OO..O
..O....OOO..O.........OOO.......OOO.O.OO.....O.......OOO.O
............OOOOOOOOO...O........OO.OOO...OOOO.........O.O
..........................................................
............OOOOOOOOO...O........OO.OOO...OOOO.........O.O
..O....OOO..O.........OOO.......OOO.O.OO.....O.......OOO.O
..O.....O.OO..O...OO......OO....O.O.O..O..O.O.O......OO..O
.O.O...OO.....O...OO......OO.OO..O..OO..O.O.OO..O.........
..OO......O....O................OOOOOO..O..O...O...O..O...
.O.O..O.....................OOO..O.O.OOO.....O.O.O....O...
O..O............OOO.O.O.........O.....O.......O...O.......
O..O..OOO.......O.OOOO...............OO...........OO.O....
..O..............O..................................O.....
A Caterloopillar can theoretically be configured to move at c/6, but there are technical difficulties with speeds of the form 4n+2, and as of July 2018 this has not been done in practice.

:c/7 spaceship A spaceship travelling at one seventh of the speed of light. The first such spaceship to be discovered was the diagonally travelling lobster, found by Matthias Merzenich in August 2011. The first known orthogonal c/7 spaceship was the loafer, discovered by Josh Ball in February 2013. A Caterloopillar has been configured to move at c/7.

:CA = cellular automaton

:caber tosser Any pattern whose population is asymptotic to c.log(t) for some constant c, and which contains a glider (or other spaceship) bouncing between a slower receding spaceship and a fixed reflector which emits a spaceship (in addition to the reflected one) whenever the bouncing spaceship hits it.

As the receding spaceship gets further away the bouncing spaceship takes longer to complete each cycle, and so the extra spaceships emitted by the reflector are produced at increasingly large intervals. More precisely, if v is the speed of the bouncing spaceship and u the speed of the receding spaceship, then each interval is (v+u)/(v-u) times as long as the previous one. The population at time t is therefore n.log(t)/log((v+u)/(v-u)) + O(1), where n is the population of one of the extra spaceships (assumed constant).

The first caber tosser was built by Dean Hickerson in May 1991.

:Callahan G-to-H A stable glider reflector and glider-to-Herschel converter discovered by Paul Callahan in November 1998. Its recovery time is 575 ticks. The initial stage converts two gliders into a Herschel. A ghost Herschel in the pattern below marks the output location:


....O.........O...................
....OOO.....OOO...................
.O.....O...O......................
..O...OO...OO.....................
OOO...............................
.........O........................
........O.O.......................
........O.O.......................
.........O........................
...............................O..
...............................O..
....................OO.........OOO
..............OO....OO...........O
........OO...OO...................
.......O..O....O..................
..OO....OO........................
.O.O..............................
.O................................
OO................................
..........OO......................
..........O.......................
...........OOO....................
.............O....................

The glider from the southeast can be supplied by an Fx77 + L112 + Fx77 Herschel track, or by reflecting the output Herschel's FNG as in the p8 G-to-H. See also Silver reflector, Silver G-to-H.

:Cambridge pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases. The Life pulsar was indeed discovered at Cambridge, like the first real pulsar a few years earlier.)

:Canada goose (c/4 diagonally, p4) Found by Jason Summers, January 1999. It consists of a glider plus a tagalong.


OOO..........
O.........OO.
.O......OOO.O
...OO..OO....
....O........
........O....
....OO...O...
...O.O.OO....
...O.O..O.OO.
..O....OO....
..OO.........
..OO.........
At the time of its discovery the Canada goose was the smallest known diagonal spaceship other than the glider, but this record has since been beaten, first by the second spaceship shown under Orion, and more recently by quarter.

:candelabra (p3) By Charles Trawick. See also the note under cap.


....OO....OO....
.O..O......O..O.
O.O.O......O.O.O
.O..O.OOOO.O..O.
....O.O..O.O....
.....O....O.....

:candlefrobra (p3) Found by Robert Wainwright in November 1984.


.....O....
.O.OO.O.OO
O.O...O.OO
.O....O...
.....OO...
The following diagram shows that a pair of these can act in some ways like killer toads. See also snacker.

....O...........O....
OO.O.OO.O...O.OO.O.OO
OO.O...O.O.O.O...O.OO
...O....O...O....O...
...OO...........OO...
.....................
.....................
.........OOO.........
.........O..O........
.........O...........
.........O...O.......
.........O...O.......
.........O...........
..........O.O........

:canoe (p1)


...OO
....O
...O.
O.O..
OO...

:cap The following induction coil. It can also easily be stabilized to form a p3 oscillator. See candelabra for a slight variation on this.


.OO.
O..O
OOOO

:carnival shuttle (p12) Found by Robert Wainwright in September 1984 (using MW emulators at the end, instead of the monograms shown here).


.................................O...O
OO...OO..........................OOOOO
.O.O.O...O..O......OO...O..O.......O..
.OO.OO..OO...OO....OO..OO...OO....O.O.
.O.O.O...O..O......OO...O..O.......O..
OO...OO..........................OOOOO
.................................O...O

:carrier = aircraft carrier

:casing That part of the stator of an oscillator which is not adjacent to the rotor. Compare bushing.

:catacryst A 58-cell quadratic growth pattern found by Nick Gotts in April 2000. This was formerly the smallest such pattern known, but has since been superseded by the related metacatacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

The catacryst consists of three arks plus a glider-producing switch engine. It produces a block-laying switch engine every 47616 generations. Each block-laying switch engine has only a finite life, but the length of this life increases linearly with each new switch engine, so that the pattern overall grows quadratically, as an unusual type of MMS breeder.

:Catagolue An online database of objects in Conway's Game of Life and similar cellular automata, set up by Adam P. Goucher in 2015 at http://catagolue.appspot.com. It gathers data from a distributed search of random initial configurations and records the eventual decay products. Within a year of operation it had completed a census of the ash objects from over two trillion asymmetric 16x16 soups. As of June 2018, well over two hundred trillion ash objects have been counted, from over a trillion asymmetric soups.

It is often possible to use Catagolue search results find equivalent glider synthesis recipes for selected parts of long-running active reactions. These random soup searches have made it possible to find efficient construction methods for thousands of increasingly rare still lifes and oscillators, and the occasional puffer or spaceship. In many of these cases a glider synthesis was previously very difficult or unknown.

:catalyst An object that participates in a reaction but emerges from it unharmed. All eaters are catalysts. Some small still lifes can act as catalysts in some situations, such as the block, ship, and tub. The still lifes and oscillators that form a conduit are examples of catalysts.

A relatively rare form of catalysis occurs in a transparent debris effect, where the catalyst in question is completely destroyed and then rebuilt. The term is also sometimes used for a modification of an active reaction in a rake by passing spaceships.

:catch and throw A technology used (e.g., in the Caterpillar) to adjust the timing of a glider by turning it into a stationary object using one interaction, and then later restoring it using a second interaction. The interactions are caused by passing objects which are not otherwise affected. The direction of the glider is not usually changed.

Here is an example where a glider is turned into a boat by the first LWSS, and is then restored by the remaining spaceships:


..................................OO.............OO.......OOOO.
................................O....O..........OO.OOOO...O...O
...............................O.................OOOOOO...O....
...............................O.....O............OOOO.....O..O
.O.............................OOOOOO..........................
..O............................................................
OOO............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...OOOO........................................................
...O...O.......................................................
...O...........................OO..............................
....O..O......................OO.OOO...........................
...............................OOOOO...........................
................................OOO............................

:caterer (p3) Found by Dean Hickerson, August 1989. Compare with jam. In terms of its minimum population of 12 this is the smallest p3 oscillator. See also double caterer and triple caterer.


..O.....
O...OOOO
O...O...
O.......
...O....
.OO.....
More generally, any oscillator which serves up a bit in the same manner may be referred to as a caterer.

:Caterloopillar A family of adjustable-speed spaceships constructed by Michael Simkin in 2016, based on an "engineless caterpillar" idea originally proposed by David Bell. The front and back halves of Caterloopillars each function as universal constructors, with each half constructing the building blocks of the other half, while also reading and moving a construction tape. The overall design is reminiscent of M.C. Escher's lithograph "Drawing Hands". The name "Caterloopillar" is a reference to Douglas Hofstader's Strange Loop concept.

Simkin has written an automated script that can construct a Caterloopillar for any rational speed strictly less than c/4, with some exceptions. Speeds closer to the c/4 limit in general require larger constructions, and for any given computer system it is easy to choose a speed that makes it impractical to construct a Caterloopillar.

As of June 2018 one significant remaining exception is that Caterloopillars with periods c/(6+4N) can't be constructed. This is only a limitation of the current construction script, not of the underlying Caterloopillar toolkit. For technical reasons, the lowest speed that the current script can produce is around c/95. The slowest Caterloopillars that have been explicitly constructed to date are c/87 and c/92. These are among the smallest in terms of population, though their bounding boxes are larger than some of the higher-speed Caterloopillars.

:Caterpillar A spaceship that works by laying tracks at its front end. The first example constructed was a p270 17c/45 spaceship built by Gabriel Nivasch in December 2004, based on work by himself, Jason Summers and David Bell. This Caterpillar has a population of about 12 million in each generation and was put together by a computer program that Nivasch wrote. At the time it was by far the largest and most complex Life object ever constructed, and it is still one of the largest in terms of population.

The 17c/45 Caterpillar is based on the following reaction between a pi-heptomino and a blinker:


...............O
O.............OO
O............OO.
O.............OO
...............O
In this reaction, the pi moves forward 17 cells in the course of 45 generations, while the blinker moves back 6 cells and is rephased. This reaction has been known for many years, but it was only in September 2002 that David Bell suggested that it could be used to build a 17c/45 spaceship, based on a reaction he had found in which pi-heptominoes crawling along two rows of blinkers interact to emit a glider every 45 generations. Similar glider-emitting interactions were later found by Gabriel Nivasch and Jason Summers. The basic idea of the spaceship design is that streams of gliders created in this way can be used to construct fleets of standard spaceships which convey gliders to the front of the blinker tracks, where they can be used to build more blinkers.

A different Caterpillar may be possible based on the following reaction, in which the pattern at top left reappears after 31 generations displaced by (13,1), having produced a new NW-travelling glider. In this case the tracks would be waves of backward-moving gliders.


.OO.....................
...O....................
...O.OO.................
OOO....O................
.......O................
.....OOO................
........................
........................
........................
........................
........................
........................
.....................OOO
.....................O..
......................O.
For other Caterpillar-type constructions see Centipede, waterbear, half-baked knightship, and Caterloopillar.

:CatForce An optimized search program written by Michael Simkin in 2015, using brute-force enumeration of small Spartan objects in a limited area, instead of a depth-first tree search. One major purpose of CatForce is to find glider-constructible completions for signal conduits. An early CatForce discovery was the B60 conduit, which enabled a record-breaking new glider gun.

:Catherine wheel = pinwheel

:cauldron (p8) Found in 1971 independently by Don Woods and Robert Wainwright. Compare with Hertz oscillator.


.....O.....
....O.O....
.....O.....
...........
...OOOOO...
O.O.....O.O
OO.O...O.OO
...O...O...
...O...O...
....OOO....
...........
....OO.O...
....O.OO...

:cavity = eater plug

:CC semi-cenark The colour-changing version of Tanner Jacobi's century-based semi-Snark mechanism, using a C-to-G consisting of a BTS catalyst and a block. See CP semi-cenark for the colour-preserving version, or semi-cenark for repeat time details and an alternate initial catalyst.


.O............OO..........
..O..........O.O..........
OOO.....OO..O.............
........O..O.OO...........
.....O....OO.O.O..........
...O.O........O...........
....OO..............OO....
....................O.....
.......OO.........O.O.....
.......OO.........OO......
..........................
..........................
..........................
....OO....OO..............
...O.O...O.O..............
...O......O...............
..OO......................
..........................
.....................OO...
...................O..O...
...................OOO....
..........................
..............OO...OO.O.OO
..............OO....O.OO.O
....................O.....
...................OO.....

:CC semi-Snark A small 90-degree colour-changing glider reflector requiring two input gliders on the same lane for each output glider. It was discovered by Sergei Petrov on 1 July 2013, using a custom-written search utility. It functions as a very compact period doubler in some signal circuitry, for example the linear propagator. The semi-Snark can period-double a regular glider stream of period 51 or more, or an intermittent stream with two gliders every 67 ticks or more, since the block reset glider can be sent just 16 ticks before its partner.


......O..........OO
.......OO........O.
......OO.......O.O.
...............OO..
..........O........
OO.........OO......
OO........OO.......
...................
...................
.................OO
..........OO.....OO
..........OO.......
...................
.....O.............
....O.O............
....OO......OO.....
............O......
.............OOO...
...............O...

:cell The fundamental unit of space in the Life universe. The term is often used to mean a live cell - the sense is usually clear from the context.

:cellular automaton A certain class of mathematical objects of which Life is an example. A cellular automaton consists of a number of things. First there is a positive integer n which is the dimension of the cellular automaton. Then there is a finite set of states S, with at least two members. A state for the whole cellular automaton is obtained by assigning an element of S to each point of the n-dimensional lattice Zn (where Z is the set of all integers). The points of Zn are usually called cells. The cellular automaton also has the concept of a neighbourhood. The neighbourhood N of the origin is some finite (nonempty) subset of Zn. The neighbourhood of any other cell is obtained in the obvious way by translating that of the origin. Finally there is a transition rule, which is a function from SN to S (that is to say, for each possible state of the neighbourhood the transition rule specifies some cell state). The state of the cellular automaton evolves in discrete time, with the state of each cell at time t+1 being determined by the state of its neighbourhood at time t, in accordance with the transition rule.

There are some variations on the above definition. It is common to require that there be a quiescent state, that is, a state such that if the whole universe is in that state at generation 0 then it will remain so in generation 1. (In Life the OFF state is quiescent, but the ON state is not.) Other variations allow spaces other than Zn, neighbourhoods that vary over space and/or time, probabilistic or other non-deterministic transition rules, etc.

It is common for the neighbourhood of a cell to be the 3x...x3 (hyper)cube centred on that cell. (This includes those cases where the neighbourhood might more naturally be thought of as a proper subset of this cube.) This is known as the Moore neighbourhood.

:census A count of the number of different individual Life objects within one larger object, most often the final ash of a random soup experiment. This includes the number of blocks, blinkers, gliders, and other common objects, as well as any rarer larger still lifes, oscillators or spaceships.

:centinal (p100) Found by Bill Gosper. This combines the mechanisms of the p46 and p54 shuttles (see twin bees shuttle and p54 shuttle).


OO................................................OO
.O................................................O.
.O.O.....................OO.....................O.O.
..OO........O............OO............OO.......OO..
...........OO..........................O.O..........
..........OO.............................O..........
...........OO..OO......................OOO..........
....................................................
....................................................
....................................................
...........OO..OO......................OOO..........
..........OO.............................O..........
...........OO..........................O.O..........
..OO........O............OO............OO.......OO..
.O.O.....................OO.....................O.O.
.O................................................O.
OO................................................OO

:Centipede (31c/240 orthogonally, p240) The smallest known 31c/240 spaceship, constructed by Chris Cain in September 2014 as a refinement of the shield bug.

:century (stabilizes at time 103) This is a common pattern which evolves into three blocks and a blinker. In June 1996 Dave Buckingham built a neat p246 gun using a century as the engine. See also bookend and diuresis.


..OO
OOO.
.O..

:century eater A 20-cell still life that functions as an eater for the active reaction produced by any century relative. The most well-known use is to replace a four-object constellation in Paul Callahan's bistable switch, as shown below. In September 2014 Josh Ball showed that a variant of this still life has a relatively inexpensive slow glider construction recipe.


............O.OO..............
............OO.O..............
..............................
..........OOOOO...............
.........O..O..O..............
.........OO...O.O.............
...............OO.............
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
............................OO
............................OO
..............................
O.............................
.OO...........................
OO............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
....OO........................
...O.O........................
...O..........................
..OO........OO................
............OO................
At T=256 the active reaction produces an eight-cell pattern sharing the same grandchild as a century. The century eater at the top of the pattern catalyzes this pattern produce a clean spark.

:century-to-glider converter Any signal circuit that accepts a century as input and produces a clean output glider. For example, in November 2017 Adam P. Goucher noticed that this previously known C-to-G converter can replace the century eater in Paul Callahan's bistable switch, producing an extra glider output.


......................OO.......
.......................O.......
.......................O.O.....
........................O.O....
.........................O...OO
.............................OO
...............................
...............................
...............................
...............................
OO.............................
OO.............................
...............................
...............................
.....................O.........
....................OOO........
......................OO.......

:channel A lane or signal path used in construction circuitry. Until the invention of single-channel construction arms, signals in a channel would usually be synchronized with one or more coordinated signals on other paths, as in the Gemini, which used twelve channels to run three construction arms simultaneously, or the 10hd Demonoid which needed only two channels. See also Geminoid.

:chaotic growth An object whose fate is unknown, except that it appears to grow forever in an unpredictable manner. In Life, no pattern has yet been found that is chaotic. This is in contrast to many other Life-like rules, where even small objects can appear to grow chaotically.

It is possible that chaotic growth may occur rarely or even regularly for large enough random Life objects, but if so the minimum size of such patterns must be larger than what can currently be experimentally simulated (but see novelty generator).

In any case, it is not decidable whether a pattern that apparently grows randomly forever is in fact displaying chaotic growth. Continuing to evolve such a pattern might at any time result in it suddenly cleaning itself up and becoming predictable.

:chemist (p5)


.......O.......
.......OOO.....
..........O....
.....OOO..O..OO
....O.O.O.O.O.O
....O...O.O.O..
.OO.O.....O.OO.
..O.O.O...O....
O.O.O.O.O.O....
OO..O..OOO.....
....O..........
.....OOO.......
.......O.......

:C-heptomino Name given by Conway to the following heptomino, a less common variant of the B-heptomino.


.OOO
OOO.
.O..

:Cheshire cat A block predecessor by C. R. Tompkins that unaccountably appeared both in Scientific American and in Winning Ways. See also grin.


.O..O.
.OOOO.
O....O
O.OO.O
O....O
.OOOO.

:chicken wire A type of stable agar of density 1/2. The simplest version is formed from the tile:


OO..
..OO
But the "wires" can have length greater than two and need not all be the same. For example:

OO...OOOO.....
..OOO....OOOOO

:chirality A term borrowed from chemistry to describe asymmetrical patterns with two distinct mirror-image orientations. One common use is in relation to Herschel transmitters, where the spacing between the two gliders in the tandem glider output can limit the receiver to a single chirality.

:cigar = mango

:circuit Any combination of conduits or converters that moves or processes an active signal. This includes components with multiple states such as period multipliers or switches, which can be used to build guns, logic gates, universal constructors, and other computation or construction circuitry.

:cis-beacon on anvil (p2)


...OO..
....O..
.O.....
.OO....
.......
.OOOO..
O....O.
.OOO.O.
...O.OO

:cis-beacon on table (p2)


..OO
...O
O...
OO..
....
OOOO
O..O

:cis-boat with tail (p1)


.O...
O.O..
OO.O.
...O.
...OO

:cis fuse with two tails (p1) See also pulsar quadrant.


...O..
.OOO..
O...OO
.O..O.
..O.O.
...O..

:cis-mirrored R-bee (p1)


.OO.OO.
O.O.O.O
O.O.O.O
.O...O.

:cis snake = canoe

:clean Opposite of dirty. A reaction which produces a small number of different products which are desired or which are easily deleted is said to be clean. For example, a puffer which produces just one object per period is clean. Clean reactions are useful because they can be used as building blocks in larger constructions.

When a fuse is said to be clean, or to burn cleanly, this usually means that no debris at all is left behind.

:clearance In signal circuitry, the distance from an edge shooter output lane to the last unobstructed lane adjacent to the edge-shooter circuitry. For example, an Fx119 inserter has an unusually high 27hd clearance.

Also, oscillator and eater variants may be said to have better clearance if they allow gliders or other signals to pass closer to them than the standard variant allows. The following high-clearance eater1 variant by Karel Suhajda allows gliders to pass one lane closer on the southeast side, than is allowed by the standard fishhook shape.


.O......OO
..O..OO..O
OOO...O.O.
......O.OO
...OO.O...
...O..O...
....OO....
This is considered to be a variant of the eater1 because the reaction's rotor is exactly the same, even though three cells in this variant are too overpopulated to allow a birth, instead of underpopulated as in a standard eater1 glider-eating reaction.

:clock (p2) Found by Simon Norton, May 1970. This is the fifth or sixth most common oscillator, being about as frequent as the pentadecathlon, but much less frequent than the blinker, toad, beacon or pulsar. It is surprisingly rare considering its small size.


..O.
O.O.
.O.O
.O..

The protruding cells at the edges can perturb some reactions by inhibiting the birth of a cell in a 3-cell corner. For example, a clock can be used to suppress the surplus blinker produced by an F171 conduit, significantly improving the recovery time of the circuit:


.........O........O................................
.........OOO......OOO..............................
............O........O.............................
...........OO.......OO.............................
...................................................
.................................................O.
................................................O.O
................................................O.O
.................................................O.
......................................O............
............OO........................O............
.............O........................OOO..........
.............O.O........................O..........
..............OO...................................
...................................................
...................................................
........O..............................OO..........
........OOO........................O...OO..........
...........O......................O.O..............
..........OO.....................O.O...............
.................................O.................
................................OO.................
...................................................
...................................................
...................................................
...................................................
.........O.........................................
.........O.O.......................................
.........OOO.......................................
...........O.......................................
...................................................
..................OO...O...........................
...................O....OO.........................
................OOO...OO...........................
..OO............O.......O..........................
...O...............................................
OOO................................................
O..................................................

:clock II (p4) Compare with pinwheel.


......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O..O.O.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:clock inserter = clock insertion.

:clock insertion A uniquely effective method of adding a glider to the front edge of a salvo, by first constructing a clock, then converting it to a glider using a one-bit spark. Here it rebuilds a sabotaged glider in a deep pocket between other gliders:


..................................................O........
..................................................O.O......
..................................................OO.......
...............................................O......O....
..............................................O......O.....
..............................................OOO....OOO...
...........................................................
...........................................O......O........
...........................................O.O....O.O.....O
...........................................OO.....OO....OO.
........................................O.......O........OO
.......................................O...................
.......................................OOO...........O.O...
.....................................................OO....
......................................................O....
O..................................................O.......
.OO..............................................OO........
OO................................................OO.......
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
.............................O.............................
....................O......O.O.............................
..................O.O.......OO.............................
...................OO......................................
.........................O.................................
..........................O....OOO.........................
........................OOO....O...........................
................................O..........................
.....................................OO....................
............................OO.......O.O...................
............................O.O......O.....................
............................O..............................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
.............................................OO............
.............................................O.O...........
.............................................O.............

In 2015 Chris Cain used this reaction to demonstrate conclusively that any unidirectional glider salvo, no matter how large or tightly packed, can be constructed by collisions between gliders that are initially separated by any finite distance. As a corollary, because all glider syntheses are made up of two to four unidirectional salvos, any glider-constructible object has a synthesis that starts with every glider at least N cells away from every other glider (for any chosen N).

:cloud of smoke = smoke

:cloverleaf This name was given by Robert Wainwright to his p2 oscillator washing machine. But Achim Flammenkamp also gave this name to Achim's p4.

:cluster Any pattern in which each live cell is connected to every other live cell by a path that does not pass through two consecutive dead cells. This sense is due to Nick Gotts, but the term has also been used in other senses, often imprecise.

:CNWH Conweh, creator of the Life universe.

:Coe ship (c/2 orthogonally, p16) A puffer engine discovered by Tim Coe in October 1995.


....OOOOOO
..OO.....O
OO.O.....O
....O...O.
......O...
......OO..
.....OOOO.
.....OO.OO
.......OO.

In December 2015, the Coe ship was discovered in an asymmetric random soup on Catagolue. This was the first time any non-p4 ship was discovered in a random asymmetric soup experiment, winning Adam P. Goucher a 50-euro prize offered by Ivan Fomichev.

:Coe's p8 (p8) Found by Tim Coe in August 1997.


OO..........
OO..OO......
.....OO.....
....O..O....
.......O..OO
.....O.O..OO

:Collatz 5N+1 simulator An unknown fate pattern constructed by David Bell in December 2017 that simulates the Collatz 5N+1 algorithm using sliding block memory and p1 technology, while always having a population below 32000.

The algorithm is simple. Starting with a number, if it is even divide it by 2, otherwise multiply it by 5 and add 1. When this process is iterated a sequence of numbers is generated. When starting with the value of 7, it is currently unknown whether or not the sequence ever forms a cycle.

Because of this the fate of the simulator is also currently unknown. It may become stable, or become an oscillator with a high period, or have a bounding box which grows irregularly.

:colour = colour of a glider

:colour-changing See colour of a glider. The reflector shown in p8 bouncer is colour-changing, as are its 5/6/7/8 and higher-period versions.

:colour-changing semi-Snark = CC semi-Snark.

:colourised Life A cellular automaton that is the same as Life except for the use of a number of different ON states ("colours"). All ON states behave the same for the purpose of applying the Life rule, but additional rules are used to specify the colour of the resulting ON cells. Examples are Immigration and QuadLife.

:colour of a glider The colour of a glider is a property of the glider that remains constant while the glider is moving along a straight path, but that can be changed when the glider bounces off a reflector. It is an important consideration when building something using reflectors.

The colour of a glider can be defined as follows. First choose some cell to be the origin. This cell is then considered to be white, and all other cells to be black or white in a checkerboard pattern. (So the cell with coordinates (m,n) is white if m+n is even, and black otherwise.) Then the colour of a glider is the colour of its leading cell when it is in a phase that can be rotated to look like this:


OOO
..O
.O.

A reflector that does not change the colour of gliders obviously cannot be used to move a glider onto a path of different colour than it started on. But a 90-degree reflector that does change the colour of gliders is similarly limited, as the colour of the resulting glider will depend only on the direction of the glider, no matter how many reflectors are used. For maximum flexibility, therefore, both types of reflector are required.

Small periodic colour-changing glider reflectors (bouncers) are known, and also small periodic colour-preserving glider reflectors (bumpers). Among stable patterns, only a small colour-preserving reflector (Snark) is known. The smallest known 90-degree colour-changing reflector is given at the end of the reflector entry.

:colour-preserving See colour of a glider. Snarks and bumpers are colour-preserving reflectors.

:colour-preserving semi-Snark = CP semi-Snark

:complementary blinker = fore and back

:component A partial glider synthesis that can be used in the same way in multiple glider recipes. A component transforms part of an object under construction in a well-defined way, without affecting the rest of the object. For example, this well-known component can be used to add a hook to any object that includes a protruding table end, converting it to a long bookend:


.......O...................O...................O
.....OO..................OO..................OO.
......OO..................OO..................OO
................................................
..O...................O...................O.....
O.O.................O.O.................O.O.....
.OO..O...............OO..O...............OO..O..
.....O.O.................O.O.................O.O
.....OO..................OO..................OO.
................................................
................................................
....................O...........................
...O..O............O.O.O..O............OO..O..O.
...OOOO.............OO.OOOO............O...OOOO.
......................O.................OOO.....
.....OO...............O.O.................O.O...
.....OO................O.O.................OO...
........................O.......................

"Component" is also used to specify any piece of an object - spaceship, oscillator, etc. - that can be combined with other components in specific ways according to a grammar to produce a variety of objects. The components can either be independent objects that only occasionally react with each other, or else they can be fused together to support each other. For example, any branching spaceship is made up of several components, and there is a single repeating component in any wicktrailer.

:composite See composite conduit.

:composite conduit A signal-processing conduit that can be subdivided into two or more elementary conduits.

:compression = repeat time, recovery time.

:computational universality See universal computer.

:conduit Any arrangement of still lifes and/or oscillators that moves an active object to another location, perhaps also transforming it into a different active object at the same time, but without leaving any permanent debris (except perhaps gliders, or other spaceships) and without any of the still lifes or oscillators being permanently damaged. Probably the most important conduit is the following remarkable one (Dave Buckingham, July 1996) in which a B-heptomino is transformed into a Herschel in 59 generations.


.........OO.O
O.OO......OOO
OO.O.......O.
.............
.........OO..
.........OO..
Several hundred elementary conduits are now known, with recent discoveries primarily made via search programs such as CatForce and Bellman.

:conduit 1 = BFx59H.

:confused eaters (p4) Found by Dave Buckingham before 1973.


O..........
OOO........
...O.......
..O........
..O..O.....
.....O.....
...O.O.....
...OO..OO..
.......O.O.
.........O.
.........OO

:constellation A general term for a group of two or more separate objects, usually small still lifes and low-period oscillators. Compare pseudo still life.

:construction arm An adjustable mechanism in a universal constructor that allows new objects to be constructed in any chosen location that the arm can reach. A construction arm generally consists of a shoulder containing fixed guns or edge shooters, a movable construction elbow that slides forward and backward along the construction lane(s), and in the case of single-arm universal constructors, a hand target object at the construction site that can be progressively modified by a slow salvo to produce each desired object.

:construction elbow One of the components of a construction arm in a universal constructor. The elbow usually consists of a single Spartan still life or small constellation. It accepts elbow operation recipes, in the form of salvos coming from the construction arm's shoulder.

These recipes may do one of several things: 1) pull the elbow closer to the shoulder, 2) push the elbow farther from the shoulder, 3) emit a glider on a particular output lane (while also optionally pushing or pulling the elbow); 4) create a "hand" target block or other useful object as a target for output gliders, to one side of the construction lane; 5) duplicate the elbow, or 6) destroy the elbow.

Elbows that receive and emit orthogonally-travelling spaceships instead of gliders are technically possible, but no working examples are currently known. The discussion below assumes that gliders are used to communicate between the shoulder, elbow, and hand locations.

If a mechanism can be programmed to generate recipes for at least the first three options listed above, it is generally capable of functioning as a universal constructor. The main requirement is that push and pull elbow operations should be available that are either minimal (1fd) or the distances should be relatively prime.

Depending on the elbow operation library, there may be only one type of elbow, or there may be two or more elbow objects, with recipes that convert between them. The 9hd library had just one elbow type, a block. The original 10hd library had two elbows, blocks in mirror-symmetric locations; this was expanded to a larger list for the 10hd Demonoid. The 0hd Demonoid also has a multi-elbow recipe library. A slow elbow toolkit may make use of an even larger number of glider output recipes, because the target elbow object in that case is not restricted to a single diagonal line.

If only one colour, parity, or phase of glider can be emitted, then the mechanism will be limited to producing monochromatic salvos or monoparity salvos. These are less efficient at most construction tasks, but are still generally accepted to enable universal toolkits. See also half-baked knightship.

:construction envelope The region affected by an active reaction, such as a glider synthesis of an object. The envelope corresponds to the state-2 blue cells in LifeHistory. See also edgy.

:construction lane Part of a construction arm between the shoulder and the elbow - in particular, one of the fixed lanes that elbow operation signals travel on. All known universal constructors have used arms with two or more construction lanes, except for the ones in the 0hd Demonoid and in recent single-channel construction recipes.

:construction recipe One or more streams of gliders or other signals fed into a universal constructor to create a target object. Compare glider recipe.

:construction universality See universal constructor.

:converter A conduit in which the input object is not of the same type as the output object. This term tends to be preferred when either the input object or the output object is a spaceship.

The following diagram shows a p8 pi-heptomino-to-HWSS converter. This was originally found by Dave Buckingham in a larger form (using a figure-8 instead of the boat). The improvement shown here is by Bill Gosper (August 1996). Dieter Leithner has since found (much larger) oscillators of periods 44, 46 and 60 that can be used instead of the Kok's galaxy.


.O.O..O........
.OOO.O.OO......
O......O.....O.
.O.....OO...O.O
.............OO
OO.....O.......
.O......O......
OO.O.OOO.......
..O..O.O.......
............OOO
............O.O
............O.O

For another periodic converter, see the glider-to-LWSS example in queen bee shuttle pair. However, many converters are stable. Examples of elementary conduit converters include BFx59H, 135-degree MWSS-to-G, and 45-degree MWSS-to-G.

The earliest and simplest stable converters known are shown below. These are an HWSS-to-loaf, MWSS-to-beehive, and LWSS-to-blinker. These can serve as memory cells, or as the first steps in constructing objects using salvos.


.........................O..............................
..OO...................O...O.................O..O.......
O....O......................O....................O......
......O................O....O................O...O......
O.....O.................OOOOO.................OOOO......
.OOOOOO.................................................
.........OO....................OO...................OO..
.........O.O...................O....................O...
...........O....................OOO..................OOO
...........OO.....................O....................O

:convoy A collection of spaceships all moving in the same direction at the same speed. Convoys are usually not destroyed by the reactions that they cause. Compare salvo. For examples, see reanimation, fly-by deletion and glider turner.

:copperhead (c/10 orthogonally, p10) The following small c/10 spaceship, discovered by conwaylife.com forum user 'zdr' on 5 March 2016, using a simple depth-first search program. A glider synthesis was found on the same day.


.OOOO.
......
.O..O.
O.OO.O
O....O
......
O....O
OO..OO
OOOOOO
.O..O.
..OO..
..OO..
Later that same month Simon Ekström added a sparky tagalong for the copperhead to produce the fireship. This allowed for the construction of c/10 puffers and rakes.

:Corder- Prefix used for things involving switch engines, after Charles Corderman.

:Corder engine = switch engine

:Cordergun A gun firing Corderships. The first was built by Jason Summers in July 1999, using a glider synthesis by Stephen Silver.

:Cordership Any spaceship based on switch engines. These necessarily move at a speed of c/12 diagonally with a period of 96 or a multiple thereof. The first Cordership was constructed by Dean Hickerson in April 1991, using 13 switch engines. He soon reduced this to 10, and in August 1993 to 7. In July 1998 he reduced it to 6. In January 2004, Paul Tooke found the 3-engine glide symmetric Cordership shown below.


................................OO.O...........................
...............................OOO.O......O.O..................
..............................O....O.O....O....................
...............................OO......O.O...O.................
................................O...O..O..OO...................
...................................O.OO...O....................
..................................O.O................OO........
..................................O.O................OO........
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
.............................................................OO
....................................................OO.......OO
.......................................O.........O.OOOO........
..................................O...OOOOO.....OO.O...OO......
.................................O.O.......OO....O..OO.OO......
.................................O.......O.OO.....OOOOOO.......
..................................O........OO......O...........
...................................O...OOOO....................
........................................OOO....................
........................O.O.........OO.........................
........................O.O.O......O.O.........................
.......................O..OO.O....OO...........................
........................OO...O.O.OO.O..........................
........................OO...OO.OOOOO..........................
............................O.OO...OO..........................
...........................O.O.................................
..OO.O.........................................................
.OOO.O......O.O................................................
O....O.O....O..................................................
.OO......O.O...O...............................................
..O...O..O..OO...........O.....................................
.....O.OO...O...........OOO....................................
....O.O.................O..O...................................
....O.O................O....O..................................
........................O......................................
...............................................................
........................O..O...................................
.........................O.O...................................
...............................................................
.....................O.........................................
....................OOO........................................
...................OO.OO.......................................
.........O........OO.O.....O...................................
....O...OOOOO....OO......OO....................................
...O.O.......OO..OO.......OO...................................
...O.......O.OO................................................
....O........OO................................................
.....O...OOOO..................................................
..........OOO..................................................
...............................................................
...............................................................
...............................................................
...........OO..................................................
...........OO..................................................

At the end of 2017, Aidan F. Pierce discovered a clean 2-engine Cordership. There is also an adjustable-length 4-engine Cordership found by Michael Simkin, made up of two identical or mirror-image 2-engine components. The leading pair of switch engines builds a block trail, which are then deleted by the trailing pair.

Corderships generate sparks which can perturb other objects in many ways, especially gliders which can reach them from the side or from behind. Some perturbations reflect gliders back the way they came, and can be used for constructions such as the caber tosser and the infinite glider hotel.

:cousins (p3) This contains two copies of the stillater rotor.


.....O.OO....
...OOO.O.O...
O.O......O...
OO.OO.OO.O.OO
...O.O....O.O
...O.O.OOO...
....OO.O.....

:cover The following induction coil. See scrubber for an example of its use.


....O
..OOO
.O...
.O...
OO...

:covered table = cap

:cow (c p8 fuse)


OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO...OO
....OO.O.................................................O.O
....OO...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
....OO.O..................................................O.
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:CP pulsar = pulsar

:CP semi-cenark A colour-preserving variant of Tanner Jacobi's century-based semi-Snark mechanism, the semi-cenark. See CC semi-cenark for the colour-changing version, or semi-cenark for repeat time details and an alternate initial catalyst.


.O............OO........
..O..........O.O........
OOO.....OO..O...........
........O..O.OO.........
.....O....OO.O.O........
...O.O........O.........
....OO..............OO..
....................O...
.......OO.........O.O...
.......OO.........OO....
........................
........................
........................
....OO....OO............
...O.O...O.O............
...O......O.............
..OO...............OO...
....................O...
....................O.OO
.................OO.OO.O
..................O.....
................O.O.....
................OO......

:CP semi-Snark A period-multiplying colour-preserving signal conduit found by Tanner Jacobi in October 2017, producing one output glider for every two input gliders. It is made by replacing one of the eaters in a Snark with a catalyst found using Bellman. The catalyst causes the formation of a tub which requires a second glider to delete. However, this adds 5 ticks to the repeat time, so that it becomes 48. This is still 3 ticks faster than the CC semi-Snark.


.O............................
..O.............OO............
OOO..............O............
...............O.....OO.......
...............OO.....O.......
......................O.OO....
...............OO..OO.O..O....
...............OO...O.OO......
....................O.........
...................OO.........
..............................
.........................OO...
.............O............O...
..............O...........O.OO
............OOO...OO....OOO..O
..................OO...O...OO.
.......................OOOO...
.........OO...............O...
........O.O............OOO....
........O.............O.......
.......OO..............OOOOO..
...........................O..
.........................O....
.........................OO...

:crab = quarter.

:crane (c/4 diagonally, p4) The following spaceship found by Nicolay Beluchenko in September 2005, a minor modification of a tubeater found earlier by Hartmut Holzwart. The wing is of the same form as in the swan and Canada goose.


.OO.................
OO..................
..O.................
....OO...O..........
....OO..O.O.........
.......OO.O.........
.......OO...........
.......OO...........
.................OO.
.........O....OO.O..
.........OOO..OO....
.........OOO..OO....
..........OO........
....................
............O.......
...........OO.......
...........O........
............O.......
....................
.............OO.....
..............O.OO..
..................O.
...............OO...
...............OO...
.................O..
..................OO

:cross (p3) Found by Robert Wainwright in October 1989. The members of this family are all polyominoes.


..OOOO..
..O..O..
OOO..OOO
O......O
O......O
OOO..OOO
..O..O..
..OOOO..
In February 1993, Hartmut Holzwart noticed that this is merely the smallest of an infinite family of p3 oscillators. The next smallest member is shown below.

..OOOO.OOOO..
..O..O.O..O..
OOO..OOO..OOO
O...........O
O...........O
OOO.......OOO
..O.......O..
OOO.......OOO
O...........O
O...........O
OOO..OOO..OOO
..O..O.O..O..
..OOOO.OOOO..

:crowd (p3) Found by Dave Buckingham in January 1973.


...........O..
.........OOO..
.....OO.O.....
.....O...O....
.......OO.O...
...OOOO...O...
O.O.....O.O.OO
OO.O.O.....O.O
...O...OOOO...
...O.OO.......
....O...O.....
.....O.OO.....
..OOO.........
..O...........

:crown The p12 part of the following p12 oscillator, where it is hassled by a caterer, a jam and a HW emulator. This oscillator was found by Noam Elkies in January 1995.


..........O...........
..........O......O....
...O....O...O...OO....
...OO....OOO..........
.........OOO..OOO..O.O
.O..OOO.........O.OOOO
O.O.O...............OO
O..O..................
.OO........OO.........
......OO.O....O.OO....
......O..........O....
.......OO......OO.....
....OOO..OOOOOO..OOO..
....O..O........O..O..
.....OO..........OO...

:crucible = cauldron

:crystal A regular growth that is sometimes formed when a stream of gliders, or other spaceships, is fired into some junk.

The most common example is initiated by the following collision of a glider with a block. With a glider stream of even period at least 82, this gives a crystal which forms a pair of beehives for every 11 gliders which hit it.


.O......
..O...OO
OOO...OO

:C-to-G = century-to-glider converter

:cuphook (p3) Found by Rich Schroeppel, October 1970. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and stillater.


....OO...
OO.O.O...
OO.O.....
...O.....
...O..O..
....OO.O.
.......O.
.......OO
The above is the original form, but it can be made more compact:

....OO.
...O.O.
...O...
OO.O...
OO.O..O
...O.OO
...O...
..OO...

:curl = loop


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_k.htm0000755000175000017500000002344413317135606014337 00000000000000 Life Lexicon (K)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Karel's p15 (p15) An oscillator discovered by Karel Suhajda on December 11, 2002. It consists of a period 15 rotor supported by the domino spark of a pentadecathlon. It provides accessible sparks that can be used to perturb reactions or thin signal streams.


..O....O..
..OOOOOO..
..O....O..
..........
..........
..........
..OOOOOO..
.O......O.
O........O
.O......O.
..OOOOOO..

:keeper A type of factory circuit that always results in the presence of an object in the output location, whether or not the object was previously present. In many cases it is easy to construct examples by connecting multiple circuits to shoot down an object with a glider, then rebuild the object again later. The smallest keeper circuits accomplish the same thing more directly with a lucky preliminary spark from the active reaction, which removes the existing object (if any) just before the construction occurs. Below is a useful block keeper with a Herschel input.


................O..............................
................OOO.....OO.....................
...................O....OO.....................
..................OO...........................
...............................................
...............................................
...............................................
...............................................
...............................................
................................OO.............
...............................O.O.............
................................O..............
...............................................
...............................................
.......OO......................................
........O......................................
........O.O....................................
.........OO....................................
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
.........O...................................OO
.........O.O.................................OO
.........OOO...................................
...........O...................................
...............................................
...............................................
..........................OO...................
..........................OO...................
..OO...........................................
...O...........................................
OOO.........OO.................................
O...........OO.................................

:keys See short keys, bent keys and odd keys.

:kickback = kickback reaction or 180-degree kickback.

:kickback reaction The following collision of two gliders whose product is a single glider travelling in the opposite direction to one of the original gliders. This is important in the proof of the existence of a universal constructor, and in Bill Gosper's total aperiodic, as well as a number of other constructions.


.....O..
......OO
.OO..OO.
O.O.....
..O.....
See also 180-degree kickback.

:kidney A Gosperism for century. See also diuresis.

:killer toads A pair of toads acting together so that they can eat things. Here, for example, are some killer toads eating an HWSS. Similarly they can eat a MWSS (but not a LWSS). For another example see twirling T-tetsons II. See also candlefrobra.


..OO.......OOO
O....O....OOO.
......O.......
O.....O.......
.OOOOOO.......
..........OOO.
...........OOO

:Klein bottle As an alternative to a torus, it's possible to make a finite Life universe in the form of a Klein bottle. The simplest way to do this is to use an m x n rectangle with the top edge joined to the bottom edge (as for a torus) and the left edge twisted and joined to the right.

:knightship Any spaceship of type (2m,m)/n - that is, a spaceship of any speed that moves obliquely in a (2,1) direction. The first Conway's Life knightship was a variant of Andrew Wade's Gemini spaceship, constructed in May 2010. The next was an even slower knightship based on the half-bakery reaction.

A knightship must be asymmetric and its period must be at least 6. This is barely within the range of current search programs, as proven by the discovery on March 6, 2018 of an elementary knightship, Sir Robin, by Adam P. Goucher and Tomas Rokicki.

By analogy with the corresponding fairy chess pieces, spaceships of types (3m,m)/n, (3m,2m)/n and (4m,m)/n would presumably be called camelships, zebraships and giraffeships, respectively. Such spaceships do exist (see universal constructor) but small elementary versions are even more difficult to search for. Any of these ship types could be constructed by trivially modifying a Gemini spaceship, or less trivially by reprogramming one of the more recent small Geminoid construction arms, but as of July 2018 a camelship Gemini is the only example that has been explicitly built.

Alternatively, the term "knightship" is regularly used to refer to any oblique spaceship, such as the original Gemini or the waterbear.

:Kok's galaxy (p8) An oscillator found by Jan Kok in 1971, currently serving as the icon for Golly. See converter for a use of this sparker.


OOOOOO.OO
OOOOOO.OO
.......OO
OO.....OO
OO.....OO
OO.....OO
OO.......
OO.OOOOOO
OO.OOOOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_m.htm0000755000175000017500000010232513317135606014335 00000000000000 Life Lexicon (M)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:macrocell A format used by Golly and its hashlife algorithm, capable of storing repetitive patterns very efficiently, even if they contain a large number of cells. For example, a filled square 2167 cells on a side can be stored in less than three kilobytes in macrocell format, or about 800 bytes in compressed macrocell format. The square's total population is over a googol, 10100; the number of atoms in the observable universe is only about 1080.

This high level of compression is obtained by defining a tree structure composed of increasingly large cell "tiles" with power-of-two dimensions. Tile definitions of any size are re-used whenever they appear multiple times in a large pattern (at the same power-of-two offset). For example, the following is a macrocell encoding of a complex pseudo still life arrangement of ships, with a total population over 2500 cells:


[M2] (golly 3.0)
#R B3/S23
.**.**$*.*.*.*$**...**$$**...**$*.*.*.*$.**.**$
4 0 1 1 1
5 2 0 2 2
6 3 3 0 3
7 4 4 4 4

The first line after the #R rule line defines a quadtree tile at the lowest level - a level-3 tile in this case, meaning a 23 square area. At this level the pattern is encoded in a modified ASCII format with dollar signs as line separators. The next line, #2, defines a level-4 quadtree tile, made from one empty level-3 tile in the northwest corner (0), and three copies of the level-3 tile that was defined on the previous line (1). Lines 3, 4, and 5 similarly define level 5, 6, and 7 quadtree tiles by giving the line numbers of four tiles of the next lower size.

Many patterns are only moderately repetitive, so macrocell format is somewhat less successful at compressing them. Certainly most patterns are not nearly as regular as the artificial example above: there are usually many different tiles defined at each level, not just one. Chaotic patterns, such as ash from random soups, usually need so many different tile definitions that they can be stored more efficiently using rle format.

:macro-spaceship A self-constructing or self-supporting spaceship, such as the Caterpillar, Centipede, half-baked knightship, waterbear, Demonoid, Orthogonoid, and Caterloopillar. Engineered spaceships of these types tend to be much larger and more complex than elementary spaceships.

:mango (p1) A relatively rare 180-degree rotationally symmetric 8-bit still life. The acorn produces a mango as part of its ash.


.OO..
O..O.
.O..O
..OO.

:mathematician (p5) Found by Dave Buckingham, 1972.


....O....
...O.O...
...O.O...
..OO.OO..
O.......O
OOO...OOO
.........
OOOOOOOOO
O.......O
...OOOO..
...O..OO.

:Max A name for the smallest known spacefiller. The name represents the fact that the growth rate is the fastest possible. (This has not quite been proved, however. There remains the possibility, albeit not very likely, that a periodic agar could have an average density greater than 1/2, and a spacefiller stretching such an agar at the same speed as the known spacefillers would have a faster average growth rate.)

:mazing (p4) In terms of its minimum population of 12 this ties with mold as the smallest p4 oscillator. Found by Dave Buckingham in December 1973. For some constructions using mazings, see popover and sixty-nine.


...OO..
.O.O...
O.....O
.O...OO
.......
...O.O.
....O..

:mc = macrocell

:medium fish = MWSS

:megacell = p1 megacell.

:memory cell A type of information storage circuit useful in many patterns that perform complex logical operations. Most commonly a memory cell can store a single bit of information. See for example demultiplexer, honey bit, and boat-bit. Depending on the application, the circuit may be a toggle circuit or a permanent switch, or it may be possible to send one or more signals to set the circuit to a "1" state, as can be done with a keeper mechanism. In that case a different input signal must be used to test the current state, usually with a destructive read reaction.

A more complicated example can be found in the Osqrtlogt pattern, which destructively reads a growing 2-dimensional array of minimal memory cells. Each memory cell may either contain a boat (below left) or empty space (below right), with no permanent circuitry anywhere near:


...............OO........................OO
...............OO........................OO
...........................................
...........O...............................
..........O.O..............................
...........OO..............................
...........................................
...........................................
......OO........................OO.........
.....O..O......................O..O........
......OO........................OO.........
...........................................
...........................................
.OO........................OO..............
O..O......................O..O.............
.OO......OOO...............OO......OOO.....
.........O.........................O.......
..........O.........................O......
The two beehives and the block are placed by slow salvos, after an initial 90-degree 2-glider collision that produces a target honey farm. The beehive constellation acts as a one-time turner for an incoming glider. If the boat is present, it acts as a second one-time turner for that glider, sending back a "1" signal. The "backstop" block in the northeast is destroyed cleanly in either the "0" or the "1" case.

:Merzenich's p11 (p11) Found by Matthias Merzenich in December 2010.


...........OO........
............O........
............O.O......
..........OO.O.O.....
.........O.O.O.O.....
........O.O..O..OO...
.......O.....O....O..
......O.......OOOO...
.....O............OOO
....O.....O.....OO..O
...O.O...O.O...O.O...
O..OO.....O.....O....
OOO............O.....
...OOOO.......O......
..O....O.....O.......
...OO..O..O.O........
.....O.O.O.O.........
.....O.O.OO..........
......O.O............
........O............
........OO...........

:Merzenich's p18 (p18) Found by Matthias Merzenich in June 2011.


...OO............
....O............
..O.O.OO.........
.O.O.O.O...OO....
.O.O........O....
OO.O........O.OO.
...O.OO....OO.O..
...O..........O..
OO.O.O.....OOO.OO
O..O.O.O..O..O.O.
..O..O.OOOO.O..O.
...OO.O....OO.O..
......O..O...O...
......O.O.OOO....
.......OO.O......

:metacatacryst A 52-cell pattern exhibiting quadratic growth. Found by Nick Gotts, December 2000. This was for some time the smallest known pattern (in terms of initial population) with superlinear growth. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

:metacell CA logic circuitry that emulates the behavior of a single cell. The circuitry is hard-wired to emulate a particular CA rule, but changing the rule is usually a matter of making simple adjustments. Known examples include David Bell's original 500x500 unit Life cell, Jared Prince's Deep Cell, Brice Due's OTCA metapixel, and Adam P. Goucher's megacell.

:metamorphosis An oscillator built by Robert Wainwright that uses the following reaction (found by Bill Gosper) to turn gliders into LWSS, and converts these LWSS back into gliders by colliding them head on using an LWSS-LWSS bounce. There are two ways to do the following reaction, because the twin bees shuttle spark is symmetric.


...................O.........
....................O........
..................OOO........
.............................
.............................
.............................
.............................
.............................
............O...O.....O.OO...
OO.........O.....O....O.O.O..
OO.........O.........O....O..
...........OO...O.....O.O.O..
.............OOO......O.OO...
.............................
.............OOO.............
...........OO...O............
OO.........O...............OO
OO.........O.....O.........OO
............O...O............

:metamorphosis II An oscillator built by Robert Wainwright in December 1994 based on the following p30 glider-to-LWSS converter using a queen bee shuttle pair. This converter was first found by Paul Rendell, January 1986 or earlier, but wasn't widely known about until Paul Callahan rediscovered it in December 1994.


......................O.
.....................O..
.....................OOO
........................
........................
.........O.O............
.........O..O...........
OO..........OO..........
OO........O...OO........
.....OO.....OO..........
....O....O..O...........
.........O.O............
........................
........................
........................
........................
................O.......
...............OOO......
..............OOOOO.....
.............O.O.O.O....
.............OO...OO....
........................
........................
................O.......
...............O.O......
...............O.O......
................O.......
...............OO.......
...............OO.......
...............OO.......

:metapixel See metacell, OTCA metapixel.

:methuselah Any small pattern that stabilizes only after a long time. Term coined by Conway. Examples include rabbits, acorn, the R-pentomino, blom, Iwona, Justyna and Lidka. See also ark.

:Mickey Mouse (p1) The following still life, named by Mark Niemiec:


.OO....OO.
O..O..O..O
O..OOOO..O
.OO....OO.
...OOOO...
...O..O...
....OO....

:middleweight emulator = MW emulator

:middleweight spaceship = MWSS

:middleweight volcano = MW volcano

:mini pressure cooker (p3) Found by Robert Wainwright before June 1972. Compare pressure cooker.


.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:M.I.P. value The maximum population divided by the initial population for an unstable pattern. For example, the R-pentomino has an M.I.P. value of 63.8, since its maximum population is 319. The term is no longer in use.

:MIT oscillator = cuphook

:MMM breeder See breeder.

:MMS breeder See breeder.

:mod The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form, possibly subject to some rotation or reflection. The mod may be equal to the period, but it may also be a quarter of the period (for oscillators that rotate 90 degrees every quarter period) or half the period (for other oscillators which rotate 180 degrees every half period, and also for flippers).

:mold (p4) Found by Achim Flammenkamp in 1988, but not widely known until Dean Hickerson rediscovered it (and named it) in August 1989. Compare with jam. In terms of its minimum population of 12 it ties with mazing as the smallest p4 oscillator. But in terms of its 6x6 bounding box it wins outright. In fact, of all oscillators that fit in a 6x7 box it is the only one with period greater than 2.


...OO.
..O..O
O..O.O
....O.
O.OO..
.O....

:monochromatic salvo A slow salvo that uses gliders of only one colour. For example, the slow salvos generated by half-baked knightships are monochromatic, because they are generated by a single type of reaction which can happen at any position along a diagonal line. The smallest possible step size is one full diagonal (1fd), which is two half diagonals (2hd), which means that any single glider-producing reaction can only reach half of the available glider lanes. See colour of a glider.

:monogram (p4) Found by Dean Hickerson, August 1989.


OO...OO
.O.O.O.
.OO.OO.
.O.O.O.
OO...OO

:monoparity salvo A slow salvo that uses gliders of only one parity. Compare monochromatic salvo.

:Moore neighbourhood The set of all cells that are orthogonally or diagonally adjacent to a cell or group of cells. The Moore neighbourhood of a cell can be thought of as the points at a Chebyshev distance of 1 from that cell. Compare von Neumann neighbourhood. The Conway's Life rule is based on the Moore neighborhood, as are all the "Life-like" rules and many other commonly investigated rule families.

Cell neighbourhoods can also be defined with a higher range. The Moore neighbourhood of range n can be defined recursively as the Moore neighbourhood of the Moore neighbourhood of range n-1. For example, the Moore neighbourhood of range 2 includes all cells that are orthogonally or diagonally adjacent to the standard Moore neighbourhood.

:moose antlers (p1)


OO.....OO
O.......O
.OOO.OOO.
...O.O...
....O....

:mosquito See mosquito1, mosquito2. mosquito3, mosquito4 and mosquito5.

:mosquito1 A breeder constructed by Nick Gotts in September 1998. The original version had an initial population of 103, which was then the smallest for any known pattern with superlinear growth (beating the record previously held by Jaws). This was reduced to 97 by Stephen Silver the following month, but was then almost immediately superseded by mosquito2.

Mosquito1 consists of the classic puffer train plus four LWSS and four MWSS (mostly in predecessor form, to keep the population down). Once it gets going it produces a new block-laying switch engine (plus a lot of junk) every 280 generations. It is therefore an MMS breeder, albeit a messy one.

:mosquito2 A breeder constructed by Nick Gotts in October 1998. Its initial population of 85 was for a couple of hours the smallest for any known pattern with superlinear growth, but was then beaten by mosquito3.

Mosquito2 is very like mosquito1, but uses two fewer MWSS and one more LWSS.

:mosquito3 A breeder constructed by Nick Gotts in October 1998. Its initial population of 75 was at the time the smallest for any known pattern with superlinear growth, but was beaten a few days later by mosquito4.

Mosquito3 has one less LWSS than mosquito2. It is somewhat different from the earlier mosquitoes in that the switch engines it makes are glider-producing rather than block-laying.

:mosquito4 A slightly improved version of mosquito3 which Stephen Silver produced in October 1998 making use of another discovery of Nick Gotts (September 1997): an 8-cell pattern that evolves into a LWSS plus some junk. Mosquito4 is a breeder with an initial population of 73, at the time the smallest for any known pattern with superlinear growth, but superseded a few days later by mosquito5.

:mosquito5 A slightly improved version of mosquito4 which Nick Gotts produced in October 1998. The improvement is of a similar nature to the improvement of mosquito4 over mosquito3. Mosquito5 is a breeder with an initial population of 71. This was the smallest population for any known pattern with superlinear growth until it was superseded by teeth. See switch-engine ping-pong for the smallest such pattern as of July 2018, along with a list of the record-holders.

:mould = mold

:moving sawtooth A sawtooth such that no cell is ON for more than a finite number generations. David Bell constructed the first pattern of this type, with a c/2 front end and a c/3 back end. The front end is a blinker puffer. The back end ignites the blinker fuse.

The smallest currently known moving sawtooth was constructed in April 2011 by a conwaylife.com forum user with the handle 'cloudy197'. The c/2 front end is a bi-block puffer. The 2c/5 back end ignites the bi-block fuse.

:MSM breeder See breeder.

:multiple roteightors (p8) An extensible oscillator family consisting of one or more roteightor rotors, discovered by Dean Hickerson in 1990.


....................O...........
........OO........OOO...........
.........O.......O..............
.........O.O.....OO.............
..........OO.............O......
.......................OOO......
....OO........OOO.....O.........
.....O.......O..O......O........
.....O.O........O..O...O......O.
......OO..O....O..O.........OOO.
.........O........O..O.....O....
OO.......O..O.....OOO......OO...
.O.......OOO....................
.O.O............................
..OO....................OOO.....
...............OOO.....O..O.....
......OOO.....O..O........O.....
.....O..O........O..O....O..OO..
........O..O....O..O........O.O.
...O...O..O........O..O.......O.
...O......O..O.....OOO........OO
....O.....OOO...................
.OOO....................OO......
.O......................O.O.....
........OO......OOO.......O.....
.........O.....O..O.......OO....
......OOO.........O.............
......O......O...O..OO..........
.............O......O.O.........
..............O.......O.........
...........OOO........OO........
...........O....................

:multiplicity In a reflectorless rotating oscillator, the maximum number n of independent patterns that can orbit a single point, in a way that reduces the period of the combined oscillator by a factor of n.

:multi-state Life = colourised Life

:multum in parvo (stabilizes at time 3933) A methuselah found by Charles Corderman, but not as long-lasting as his acorn.


...OOO
..O..O
.O....
O.....

:muttering moat Any oscillator whose rotor consists of a closed chain of cells each of which is adjacent to exactly two other rotor cells. Compare babbling brook. Examples include the bipole, the blinker, the clock, the cuphook, the Gray counter, the quad, the scrubber, the skewed quad and the p2 snake pit. The following diagram shows a p2 example (by Dean Hickerson, May 1993) with a larger rotor. See ring of fire for a very large one.


OO.....
O.O.OO.
.....O.
.O..O..
..O....
..O.O.O
.....OO

:MW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator and filter.


.......O.......
..OO.O...O.OO..
..O.........O..
...OO.....OO...
OOO..OOOOO..OOO
O..O.......O..O
.OO.........OO.

:MWSS (c/2 orthogonally, p4) A middleweight spaceship, the third most common spaceship. Found by Conway in 1970 by modifying a LWSS. See also HWSS.


...O..
.O...O
O.....
O....O
OOOOO.

The MWSS possesses both a tail spark and a belly spark which can easily perturb other objects as it passes by. The spaceship can also perturb some objects in additional ways. For examples see blinker puffer and glider turner.

Dave Buckingham found that the MWSS can be synthesized using three gliders, and can be constructed from two gliders and another small object in several more ways. Here is the glider synthesis:


...........O..
...........O.O
...........OO.
..............
..............
.O......OO....
.OO.....O.O...
O.O.....O.....

:MWSS emulator = MW emulator

:MWSS out of the blue The following reaction, found by Peter Rott in November 1997, in which a LWSS passing by a p46 oscillator creates a MWSS travelling in the opposite direction. Together with some reactions found by Dieter Leithner, and an LWSS-turning reaction which Rott had found in November 1993 (but which was not widely known until Paul Callahan rediscovered it in June 1994) this can be used to prove that there exist gliderless guns for LWSS, MWSS and HWSS for every period that is a multiple of 46.


O..O.................................
....O................................
O...O................................
.OOOO................................
.....................................
.....................................
.....................................
.....................................
.....................................
...................OO..............OO
..................OO...............OO
...................OOOOO.............
..OO................OOOO.............
..OO.....O...........................
........OOO.........OOOO.............
.......O.O.O.......OOOOO.............
........O..O......OO...............OO
........OOO........OO..............OO
.........O...........................
.....................................
.....................................
.....................................
.....................................
..O.......O..........................
.....................................
OOO.......OOO........................
.OO.OO.OO.OO.........................
..OOO...OOO..........................
...O.....O...........................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..OO.....OO..........................
..OO.....OO..........................

:MWSS-to-G See 135-degree MWSS-to-G, 45-degree MWSS-to-G.

:MW volcano (p5) Found by Dean Hickerson in April 1992.


......O......
....O...O....
.............
...O.....O...
.OOO.OOO.OOO.
O...OO.OO...O
O.OOO.O.OOOO.
.O...........
...O.O.O.OO.O
..OO.OOO.O.OO
...O.O..O....
...O..OO.....
..OO.........

:My Experience with B-heptominos in Oscillators An article by Dave Buckingham (October 1996) available from http://conwaylife.com/ref/lifepage/patterns/bhept/bhept.html. It describes his discovery of Herschel conduits, including sufficient (indeed ample) stable conduits to enable, for the first time, the construction of period n oscillators and true period n guns for every sufficiently large integer n. See Herschel loop and emu.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/modify.pl0000755000175000017500000000325213151213347014335 00000000000000#!/usr/bin/perl @files = glob "*.htm" ; for $file (@files) { open F, "$file" or die "Can't open $file\n" ; @f = ; close F ; $f = join('', @f) ; for (($f)) { s///g ; s|@|@|g ; s!
Life Lexicon Home Page!
Introduction \| Bibliography
!g ; s!
Life Lexicon Home Page!
Introduction \| Bibliography
!g ; s|
Life Lexicon
||g ; s:^Introduction \|::gm ; s:^Introduction \|::gm ; s:Z \|:Z:g ; s:Z \|:Z:g ; s|^Bibliography||gm ; s|^Bibliography||gm ; s||
|gm ;
      s|^
|
|gm ; # fix problems in lex_[hps].htm s|\n-|\n-|g ; s|-\n|-\n|g ; # fix problem in lex_l.htm s|\nMar|\nMar|g ; s|1973\n|1973\n|g ; } open F, ">$file" or die "Can't write $file\n" ; print F $f ; close F ; } golly-3.3-src/Help/Lexicon/lex_b.htm0000755000175000017500000022330213317135606014321 00000000000000 Life Lexicon (B)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:B = B-heptomino

:B29 (c/4 diagonally, p4) The following spaceship, found by Hartmut Holzwart in April 2004. A glider synthesis of this spaceship was completed by Tanner Jacobi in April 2015.


.......OOO.......
.......O.........
OOO......O.......
O......O.O.......
.O....OO.OOOO....
...OOOO.OOOOO.OO.
....OO.......OO.O

:B-52 bomber The following p104 double-barrelled glider gun. It uses a B-heptomino and emits one glider every 52 generations. It was found by Noam Elkies in March 1996, except that Elkies used blockers instead of molds, the improvement being found by David Bell later the same month.


.OO....................................
.OO.................O..................
...................O.O............O.O..
....................O............O.....
OO.......OO.......................O..O.
OO.O.....OO.......................O.O.O
...O.......................O.......O..O
...O.......................OO.......OO.
O..O.................OO.....O..........
.OO..................O.................
.....................OOO...............
....................................OO.
....................................OO.
.OO....................................
O..O...................................
O.O.O................O.O....OO.....OO..
.O..O.................OO....OO.....OO.O
.....O............O...O...............O
..O.O............O.O..................O
..................O................O..O
....................................OO.

:B60 A Herschel conduit discovered by Michael Simkin in 2015 using his search program, CatForce. It is one of two known Blockic elementary conduits. After 60 ticks, it produces a Herschel rotated 180 degrees at (-6,-10) relative to the input. It can most easily be connected to another B60 conduit, producing a closed loop, the Simkin glider gun.


O...........OO.....OO
OOO.........OO.....OO
..O..................
..O............OO....
...............OO....
.....................
.....................
.....................
.....................
......O..............
......O.O............
......OOO............
........O............

:babbling brook Any oscillator whose rotor consists of a string of cells each of which is adjacent to exactly two other rotor cells, except for the endpoints which are adjacent to only one other rotor cell. Compare muttering moat. Examples include the beacon, the great on-off, the light bulb and the spark coil. The following less trivial example (by Dean Hickerson, August 1997) is the only one known with more than four cells in its rotor. It is p4 and has a 6-cell rotor.


.......O........
.....OOO....OO..
....O...OO..O...
.O..O.OO..O.O...
O.O.O....OO..OO.
.OO..OO....O.O.O
...O.O..OO.O..O.
...O..OO...O....
..OO....OOO.....
........O.......

:backrake Another term for a backwards rake. A p8 example by Jason Summers is shown below. See total aperiodic for a p12 example.


.....OOO...........OOO.....
....O...O.........O...O....
...OO....O.......O....OO...
..O.O.OO.OO.....OO.OO.O.O..
.OO.O....O.OO.OO.O....O.OO.
O....O...O..O.O..O...O....O
............O.O............
OO.......OO.O.O.OO.......OO
............O.O............
......OOO.........OOO......
......O...O.........O......
......O.O....OOO...........
............O..O....OO.....
...............O...........
...........O...O...........
...........O...O...........
...............O...........
............O.O............

:backward glider A glider which moves at least partly in the opposite direction to the puffer(s) or spaceship(s) under consideration.

:bait An object in a converter, usually a small still life, that is temporarily destroyed by an incoming signal, but in such a way that a usable output signal is produced. In general such a converter produces multiple output signals (or a signal splitter is added) and one branch of the output is routed to a factory mechanism that rebuilds the bait object so that the converter can be re-used.

:baker (c p4 fuse) A fuse by Keith McClelland.


..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
.O..............

:baker's dozen (p12) A loaf hassled by two blocks and two caterers. The original form (using p4 and p6 oscillators to do the hassling) was found by Robert Wainwright in August 1989.


OO.........OO..........
OOOO.O.....OO..........
O.O..OOO...............
...........O...........
....OO....O.O..........
....O.....O..O....O....
...........OO....OO....
.......................
...............OOO..O.O
..........OO.....O.OOOO
..........OO.........OO

:bakery (p1) A common formation of two bi-loaves.


....OO....
...O..O...
...O.O....
.OO.O...O.
O..O...O.O
O.O...O..O
.O...O.OO.
....O.O...
...O..O...
....OO....

:banana spark A common three-bit polyplet spark used in glider synthesis and signal circuitry. The buckaroo is an oscillator that produces this spark. It can be used to turn a glider 90 degrees:


..O....
O.O....
.OO....
....OO.
......O

:barberpole Any p2 oscillator in the infinite sequence bipole, tripole, quadpole, pentapole, hexapole, heptapole ... (It wasn't my idea to suddenly change from Latin to Greek.) This sequence of oscillators was found by the MIT group in 1970. The term is also used (usually in the form "barber pole") to describe other extensible sections of oscillators or spaceships, especially those (usually of period 2) in which all generations look alike except for a translation and/or rotation/reflection. Any barberpole can be lengthened by the reaction shown in barbershop. See also pseudo-barberpole.

:barberpole intersection = quad

:barbershop An object created by Jason Summers in 1999 which builds an infinite barberpole. It uses slide guns to repeatedly lengthen a barberpole at a speed of c/124. The key lengthening reaction from Mark Niemiec is shown below:


..........O.O.......
...........OO.......
.O.........O.....O..
..O..............O.O
OOO..............OO.
....................
....................
....................
.................O..
................OO..
................O.O.
........OO..........
.......O.O..........
....................
.....O.O............
.....OO.............

:barber's pole = barberpole

:barge (p1)


.O..
O.O.
.O.O
..O.

:basic shuttle = queen bee shuttle

:beacon (p2) The third most common oscillator. Found by Conway, March 1970.


OO..
O...
...O
..OO

:beacon maker (c p8 fuse)


..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
..O.............
..O.............

:beehive (p1) The second most common still life.


.OO.
O..O
.OO.

:beehive and dock (p1)


...OO.
..O..O
...OO.
......
.OOOO.
O....O
OO..OO

:beehive on big table = beehive and dock

:beehive pusher = hivenudger

:beehive stopper A Spartan logic circuit discovered by Tanner Jacobi on 12 May 2015. It converts an input glider signal into a beehive, in such a way that the beehive can cleanly absorb a single glider from a perpendicular glider stream. The circuit can't be re-used until the beehive "bit" is cleared by the passage of at least one perpendicular input.


.O..........................
..O.........................
OOO.........................
............................
............................
................O...........
...............O............
...............OOO..........
............................
............O...............
............O.O.............
............OO..............
...OO.....O.................
...OO....O.O................
.........O.O................
..........O.................
........................OO..
........................O.O.
..........................O.
...............OO.........OO
........OO.....OO...........
.......O.O..................
.......OO...................
............................
..........OO................
..........O.................
...........OOO..............
.............O..............

This term has sometimes been used for the beehive catalyst variant of SW-2, and also for Paul Callahan's larger glider stopper, which also provides optional 0-degree and 180-degree glider outputs.

:beehive wire See lightspeed wire.

:beehive with tail (p1)


.OO...
O..O..
.OO.O.
....O.
....OO

:Bellman A program for searching catalytic reactions, developed by Mike Playle, which successfully found the Snark.

:belly spark The spark of a MWSS or HWSS other than the tail spark.

:Beluchenko's p37 (p37) Found by Nicolay Beluchenko on April 14, 2009. It was the first period 37 oscillator to be found, and remains the smallest.


...........OO...........OO...........
...........OO...........OO...........
.....................................
.....................................
......O.......................O......
.....O.O.....O.........O.....O.O.....
....O..O.....O.OO...OO.O.....O..O....
.....OO..........O.O..........OO.....
...............O.O.O.O...............
................O...O................
.....................................
OO.................................OO
OO.................................OO
.....OO.......................OO.....
.....................................
......O.O...................O.O......
......O..O.................O..O......
.......OO...................OO.......
.....................................
.......OO...................OO.......
......O..O.................O..O......
......O.O...................O.O......
.....................................
.....OO.......................OO.....
OO.................................OO
OO.................................OO
.....................................
................O...O................
...............O.O.O.O...............
.....OO..........O.O..........OO.....
....O..O.....O.OO...OO.O.....O..O....
.....O.O.....O.........O.....O.O.....
......O.......................O......
.....................................
.....................................
...........OO...........OO...........
...........OO...........OO...........

:Beluchenko's p51 (p51) Found by Nicolay Beluchenko on February 17, 2009. It was the first non-trivial period 51 oscillator to be found.


...............OO...OO...............
.....................................
.....................................
......OO.....................OO......
......OO.....................OO......
.....................................
...OO...........................OO...
...OO.........OO.....OO.........OO...
.........OOO.OO.......OO.OOO.........
........O.O...............O.O........
........OO.................OO........
........O...................O........
.....................................
........O...................O........
.......OO...................OO.......
O......O.....................O......O
O...................................O
.....................................
.....................................
.....................................
O...................................O
O......O.....................O......O
.......OO...................OO.......
........O...................O........
.....................................
........O...................O........
........OO.................OO........
........O.O...............O.O........
.........OOO.OO.......OO.OOO.........
...OO.........OO.....OO.........OO...
...OO...........................OO...
.....................................
......OO.....................OO......
......OO.....................OO......
.....................................
.....................................
...............OO...OO...............

:bent keys (p3) Found by Dean Hickerson, August 1989. See also odd keys and short keys.


.O........O.
O.O......O.O
.O.OO..OO.O.
....O..O....
....O..O....

:BFx59H One of the earliest and most remarkable converters, discovered by Dave Buckingham in July 1996. In 59 generations it transforms a B-heptomino into a clean Herschel with very good clearance, allowing easy connections to other conduits. It forms the final stage of many of the known composite conduits, including the majority of the original sixteen Herschel conduits. Here a ghost Herschel marks the output location:


.OO.....................
..O.....................
.O......................
.OO.....................
........................
........................
........................
........................
........................
O...OO...............O..
OO..OO...............O..
.OO..................OOO
.O.....................O
O.......................

:B-heptomino (stabilizes at time 148) This is a very common methuselah that evolves into three blocks, two gliders and a ship after 148 generations. Compare with Herschel, which appears at generation 20 of the B-heptomino's evolution. B-heptominoes acquired particular importance in 1996 due to Dave Buckingham's work on B tracks. See in particular My Experience with B-heptominos in Oscillators.


O.OO
OOO.
.O..

This pattern often arises with the cell at top left shifted one space to the left, producing a seven-bit polyplet that shares the same eight-bit descendant but is not technically a heptomino at all. This alternate form is shown as the input for elementary converter patterns such as BFx59H and BRx46B. This is standard practice for elementary conduits, since many of these conduits do in fact produce this alternate form as output.

The B-heptomino is considered a failed puffer or failed spaceship, since on its own it travels at c/2 for only a short time before being affected by its own trailing debris. However, it can be stabilized into a c/2 puffer or into a clean c/2 rake or spaceship. See, e.g., ecologist.

:B-heptomino shuttle = twin bees shuttle

:bi-block (p1) The smallest pseudo still life.


OO.OO
OO.OO

:bi-block fuse A clean fuse made by a row of bi-blocks separated by 2 cell gaps. The bi-block row wick is usually created by a bi-block puffer. The burning advances 8 cells every 12 generations making its speed 2c/3.


OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.O..O
............................................OO.
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:bi-block puffer Any puffer whose output is bi-blocks. The term is particularly used for p8 c/2 puffers, in which case a bi-block fuse is created. A bi-block puffer is easily made using two backrakes whose gliders impact symmetrically. Jason Summers welded two backrakes to form a more compact puffer, as shown below.


...........O.O............OO..............................
..........O..O..........O....O............................
.........OO.......O....O..................................
........O......OO.O....O.....O............................
.......OOOOOO..O.......OOOOOO.............................
....OO.......O...OOOO.....................................
...O...OOO.O....O.........................................
..O...O...OO.O..OO.O..O...................................
..O.....OO...O.....O......................................
..OOO...OOOO.O.......O.OO.................................
...........O.........O..O......O..........................
..OOO......O.O.......O..O....O.O..........................
.O.....O.....O........OO......OO.....O..OO..OO..OO..OO..OO
O...OO.O...OO.......................OO..OO..OO..OO..OO..OO
O...O......OOO............................................
O...OO.O...OO.......................OO..OO..OO..OO..OO..OO
.O.....O.....O........OO......OO.....O..OO..OO..OO..OO..OO
..OOO......O.O.......O..O....O.O..........................
...........O.........O..O......O..........................
..OOO...OOOO.O.......O.OO.................................
..O.....OO...O.....O......................................
..O...O...OO.O..OO.O..O...................................
...O...OOO.O....O.........................................
....OO.......O...OOOO.....................................
.......OOOOOO..O.......OOOOOO.............................
........O......OO.O....O.....O............................
.........OO.......O....O..................................
..........O..O..........O....O............................
...........O.O............OO..............................
By periodically burning the bi-block fuse using perturbations by a following backrake and spaceships, c/2 rakes can be created for all periods that are a multiple of eight.

:bi-boat = boat-tie

:biclock The following pure glider generator consisting of two clocks.


..O....
OO.....
..OO...
.O...O.
...OO..
.....OO
....O..

:big beacon = figure-8

:big fish = HWSS

:big glider (c/4 diagonally, p4) This was found by Dean Hickerson in December 1989 and was the first known diagonal spaceship other than the glider.


...OOO............
...O..OOO.........
....O.O...........
OO.......O........
O.O....O..O.......
O........OO.......
.OO...............
.O..O.....O.OO....
.O.........OO.O...
...O.O......OO..O.
....OO.O....OO...O
........O.......O.
.......OOOO...O.O.
.......O.OO...OOOO
........O...OO.O..
.............OO...
.........O.OOO....
..........O..O....

:big S (p1)


....OO.
...O..O
...O.OO
OO.O...
O..O...
.OO....

:big table = dock

:billiard table = billiard table configuration.

:billiard table configuration Any oscillator in which the rotor is enclosed within the stator. Examples include airforce, cauldron, clock II, Hertz oscillator, negentropy, pinwheel, pressure cooker and scrubber.

:bi-loaf This term has been used in at least three different senses. A bi-loaf can be half a bakery:


.O.....
O.O....
O..O...
.OO.O..
...O.O.
...O..O
....OO.
or it can be the following much less common still life:

..O....
.O.O...
O..O...
.OO.OO.
...O..O
...O.O.
....O..
or the following pure glider generator:

..O.
.O.O
O..O
.OO.
O..O
O.O.
.O..

:bipole (p2) The barberpole of length 2.


OO...
O.O..
.....
..O.O
...OO

:bi-pond (p1)


.OO....
O..O...
O..O...
.OO.OO.
...O..O
...O..O
....OO.

:bi-ship = ship-tie

:bistable switch A Spartan memory cell found by Paul Callahan in 1994. It can be in one of two states, containing either a boat or a block. Input gliders on the appropriate paths can change the boat to a block, or vice-versa, while also emitting an output glider. Unlike many memory cells, attempts to change the state to the one it is already in are ignored with the glider passing through with no reaction. This makes it easy to reset the memory cell to a known state. Which of the two states is considered the SET and which considered the RESET is just a matter of convention.

The pattern below shows the "boat" state of the memory cell in its original 1994 form. Two gliders are also shown to indicate the input paths used to change the states. A smaller version is shown under century eater, with the circuit in its "block" state.

As shown, the rightmost glider changes the state from a boat to a block and emits a glider to the upper right, while the leftmost glider passes through unchanged. Alternatively, when the state contains a block, then the leftmost glider changes the state from a block to a boat, and emits a glider to the lower right, while the rightmost glider passes through unchanged.


................................O........................
................................OOO......................
...................................O.....................
..................................OO.....................
.O.......................................................
..O........................OO.................OO.........
OOO.........................O.................O..........
............................O.O.............O.O..........
.............................OO.............OO...........
.........................................................
.........................................................
.........................................................
.........................................................
.....................................O...................
....................................O.O..................
....................................O.O..................
.....................................O...................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
...........................................O...........OO
............................................O..........OO
..........................................OOO............
.........................................................
.........................................................
...........................................O.............
..........................................O.O............
...........................................OO............
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
.........................................................
...............................OO........................
..............................O.O........................
..............................O..........................
.............................OO..........................

:bit A live cell, if used in reference to still life population. For example, a beehive is a 6-bit still life. Other uses generally involve information storage: a memory cell such as a honey bit that can hold one binary bit of information for later retrieval.

:biting off more than they can chew (p3) Found by Peter Raynham, July 1972.


O...........
OOO.........
...O........
..OO........
...OO.......
....OO......
...O..O.....
...O..OO....
....OO.OOO..
........O.O.
..........O.
..........OO

:Black&White = Immigration

:blasting cap The pi-heptomino (after the shape at generation 1). A term used at MIT and still occasionally encountered.

:blinker (p2) The smallest and most common oscillator. Found by Conway, March 1970.


OOO

:blinker fuse A clean fuse made from a row of blinkers separated by one cell gaps. The blinker row wick is usually created by a blinker puffer. The fuse can burn in at least three different ways at a speed of 2c/3 depending on the method used to ignite the end of the row of blinkers. This variant has found the most use. The burning advances 12 cells every 18 generations.


....................................................O.
.............................................OO.O..O.O
............................................O.O.OOOO.O
OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.OOO.O.........
............................................O.O.OOOO.O
.............................................OO.O..O.O
....................................................O.
Fuses can also be made with blinker rows which contain occasional two cell gaps, since the burning reaction is able to bridge those gaps.

:blinker puffer Any puffer whose output is blinkers. However, the term is particularly used for p8 c/2 puffers. The first such blinker puffer was found by Robert Wainwright in 1984, and was unexpectedly simple:


...O.....
.O...O...
O........
O....O...
OOOOO....
.........
.........
.........
.OO......
OO.OOO...
.OOOO....
..OO.....
.........
.....OO..
...O....O
..O......
..O.....O
..OOOOOO.
Since then many more blinker puffers have been found. The following one was found by David Bell in 1992 when he was trying to extend an x66:

.............OOO.
............OOOOO
...........OO.OOO
............OO...
.................
.................
.........O.O.....
..O.....O..O.....
.OOOOO...O.O.....
OO...OO.OO.......
.O.......O.......
..OO..O..O.......
..........O......
..OO..O..O.......
.O.......O.......
OO...OO.OO.......
.OOOOO...O.O.....
..O.....O..O.....
.........O.O.....
.................
.................
............OO...
...........OO.OOO
............OOOOO
.............OOO.
The importance of this larger blinker puffer (and others like it), is that the engine which produces the blinker output is only p4. The blinker row produced by the puffer can easily be ignited, and the resulting blinker fuse burns cleanly with a speed of 2c/3. When the burning catches up to the engine, it causes a phase change in the puffer. This fact allows p8 blinker puffers to be used to construct rakes of all periods which are large multiples of four.

:blinker pull The following glider/blinker collision, which moves a blinker (-1,3) toward the glider source:


OOO.
....
....
....
.OOO
.O..
..O.

:blinkers bit pole (p2) Found by Robert Wainwright, June 1977.


.....OO
OOO.O.O
.......
.O.O..O
O....O.
OO...O.

:blinker ship A growing spaceship in which the wick consists of a line of blinkers. An example by Paul Schick based on his Schick engine is shown below. Here the front part is p12 and moves at c/2, while the back part is p26 and moves at 6c/13. Every 156 generations 13 blinkers are created and 12 are destroyed, so the wick becomes one blinker longer.


..........OOOO.............
..........O...O............
..........O................
.OO........O..O............
OO.OO......................
.OOOO...O..................
..OO...O.OO........O....OOO
......O...O........O....O.O
..OO...O.OO........O....OOO
.OOOO...O..................
OO.OO......................
.OO........O..O............
..........O................
..........O...O............
..........OOOO.............

:block (p1) The most common still life, and also the most common object produced by 2-glider collisions (six different ways).


OO
OO
This can be used as a catalyst in many reactions. For examples, it can destroy the beehive produced by the queen bee shuttle and can destroy an evolving honey farm:

..O.O....
..OO.....
...O.....
.........
.......OO
OOO....OO
..O......
.O.......

:blockade (p1) A common formation of four blocks. The final form of lumps of muck.


OO.....................
OO.....................
.......................
.......................
.OO.................OO.
.OO.................OO.
.......................
.......................
.....................OO
.....................OO

:block and dock (p1)


...OO.
...OO.
......
.OOOO.
O....O
OO..OO

:block and glider (stabilizes at time 106)


OO..
O.O.
..OO

:blocker (p8) Found by Robert Wainwright. See also filter.


......O.O.
.....O....
OO..O....O
OO.O..O.OO
....OO....

:block factory Any factory circuit that produces a block in response to an input signal. For a useful high-clearance example see keeper.

:Blockic Adjective for constellations consisting entirely of blocks. It's possible to arrange blocks in a way that can be triggered by a single glider to produce any glider constructible pattern. A simple example of a Blockic pattern is shown under fuse. See also seed.

:block keeper See keeper.

:block-laying switch engine See stabilized switch engine.

:block on big table = block and dock

:block on table (p1)


..OO
..OO
....
OOOO
O..O

:block pull The following glider/block collision, which moves a block (2,1) toward the glider source. Performing this reaction twice using a salvo of two gliders can move a block diagonally back by three cells, which can be of use for a sliding block memory.


OO.
OO.
...
...
...
...
OOO
O..
.O.

:block pusher A pattern emitting streams of gliders which can repeatedly push a block further away. This can be used as part of a sliding block memory.

The following pattern, in which three gliders push a block one cell diagonally, is an example of how a block pusher works.


...................O.O
...................OO.
....................O.
......................
......................
......................
...O..................
..O...................
..OOO.................
......................
......................
......................
......................
OO...O................
OO...O.O..............
.....OO...............

A universal construction elbow recipe library is also likely to contain one or more block-pushing reactions, since blocks are commonly used as elbows.

:blom (stabilizes at time 23314) The following methuselah, found by Dean Hickerson in July 2002.


O..........O
.OOOO......O
..OO.......O
..........O.
........O.O.

:blonk A block or a blinker. This term is mainly used in the context of sparse Life and was coined by Rich Schroeppel in September 1992.

:blonker (p6) The following oscillator, found by Nicolay Beluchenko in April 2004.


O..OO....O..
OO..O.OO.O..
....O.O.....
.....OO.....
.......O....
.......O...O
.........O.O
..........O.

:BLSE = block-laying switch engine

:BNE14T30 A B-heptomino to glider converter found by Tanner Jacobi on 26 May 2016. This converter has the unusual property of being an edge shooter where no part of the reaction's envelope extends beyond the glider's output lane. It can be easily connected to Herschel circuitry via HFx58B or other known elementary conduits.


...........OO....
...........O.O...
.............O...
.......OO...O.OO.
........O...O...O
........O.OO.OO.O
.........O.O.O.O.
.................
.................
.................
.................
.................
O................
.O...............
.OO..............
OO...............
O................
.................
.................
.................
OO...............
OO...............

:boat (p1) The only 5-cell still life.


OO.
O.O
.O.
A boat can be used as a 90-degree one-time turner.

:boat-bit A binary digit represented by the presence of a boat next to a snake (or other suitable object, such as an aircraft carrier). The bit can be toggled by a glider travelling along a certain path. A correctly timed glider on a crossing path can detect whether the transition was from 1 to 0 (in which case the crossing glider is deleted) or from 0 to 1 (in which case it passes unharmed). Three gliders therefore suffice for a non-destructive read. The mechanisms involved are shown in the diagram below. Here the bit is shown in state 0. It is about to be set to 1 and then switched back to 0 again. The first crossing glider will survive, but the second will be destroyed.


......O..................
.......O.................
.....OOO.................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................O........
..............O.O........
..........OO...OO........
...........OO............
..........O..........O.OO
.....................OO.O
.........................
.........................
.........................
.........................
.........................
.O.......................
.OO......................
O.O......................

In January 1997 David Bell found a method of reading the bit while setting it to 0. A MWSS is fired at the boat-bit. If it is already 0 (absent) then the MWSS passes unharmed, but if it is 1 (present) then the boat and the MWSS are destroyed and, with the help of an eater1, converted into a glider which travels back along exactly the same path that is used by the gliders that toggle the boat-bit.


................................................O........
................................................OOO......
...................................................O.....
..................................................OO.....
.........................................................
.........................................................
.........................................................
.........................................................
..O......................................................
O...O..............................................O.....
.....O..............................OOOOO...........O....
O....O.............................O....O.........OOO....
.OOOOO..................................O................
...................................O...O.................
.....................................O...................
.........................................................
.........................................................
.......................................................OO
........................................................O
.......................................................O.
.......................................................OO
There are many other equivalent methods based on alternate incoming test signals.

:boat maker (c p4 fuse)


................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
....O.............
....O.............
....O.............
....O.............

:boat on boat = boat-tie

:boat-ship-tie = ship tie boat

:boatstretcher See tubstretcher.

:boat-tie (p1) A 10-cell still life consisting of two boats placed tip-to-tip. The name is a pun on "bow tie".


.O....
O.O...
.OO...
...OO.
...O.O
....O.

:bobsled = switch engine channel.

:boojum reflector (p1) Dave Greene's name for the following 180-degree glider reflector which he found in April 2001, winning $100 bounties offered by Alan Hensel and Dieter Leithner. The name is taken from Lewis Carroll's _The Hunting of the Snark_, referring to the fact that a small 90-degree stable reflector was really what was wanted. 180-degree reflectors are relatively undesirable and have limited use in larger circuitry constructions.

The boojum reflector was the smallest and fastest known stable reflector until the discovery of the rectifier in 2009, followed by the Snark in 2013.


....O.O......OO.............................
.....OO......OO.............................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
........................................O...
.......................................O.O..
.......................................O.O..
....................OO................OO.OO.
....................OO......................
......................................OO.OO.
..OO..................................OO.O..
.O.O.......................................O
.O........................................OO
OO..........................................
............................................
..................................OO........
..................................OO....OO..
...........OO...........................O.O.
..........O.O.............................O.
..........O...............................OO
.........OO.......................OO........
..................................OO........
............................................
............................................
.............................O..............
............................O.O.............
.............................O..............

:bookend The following induction coil. It is generation 1 of century.


..OO
O..O
OOO.

:bookends (p1)


OO...OO
O.O.O.O
..O.O..
.OO.OO.

:boss (p4) Found by Dave Buckingham, 1972.


.....O.....
....O.O....
....O.O....
...OO.OO...
..O.....O..
.O.O.O.O.O.
.O.O...O.O.
OO.O...O.OO
O..O.O.O..O
..O.....O..
...OO.OO...
....O.O....
....O.O....
.....O.....

:bottle (p8) Found by Achim Flammenkamp in August 1994. The name is a back-formation from ship in a bottle.


....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO........OO...
..................
..................
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:bouncer A label used for the small periodic colour-changing glider reflectors discovered mainly by Noam Elkies in the late 1990s. See p5 bouncer, p6 bouncer, p7 bouncer, p8 bouncer, or p15 bouncer.

:bounding box The smallest rectangular array of cells that contains the whole of a given pattern. For oscillators and guns this usually is meant to include all phases of the pattern, but in the case of guns, the outgoing stream(s) are excluded. The bounding box is one of the standard ways to measure the size of an object; the other standard metric is the population.

:bow tie = boat-tie

:brain (c/3 orthogonally, p3) Found by David Bell, May 1992.


.OOO.........OOO.
O.O.OO.....OO.O.O
O.O.O.......O.O.O
.O.OO.OO.OO.OO.O.
.....O.O.O.O.....
...O.O.O.O.O.O...
..OO.O.O.O.O.OO..
..OOO..O.O..OOO..
..OO..O...O..OO..
.O....OO.OO....O.
.O.............O.

:branching spaceship An extensible spaceship containing components which can be attached in multiple ways so that the result can contain arbitrarily many arms arranged like a binary tree. Here is an example of a period 2 c/2 branching spaceship, which also includes a wicktrailer:


.....................O.................O......................
....................OOO...............OOO.....................
..................OO.OOO.............OOO.OO...................
...................O..O.OO....O....OO.O..O....................
................OO.O....O.O.OO.OO.O.O....O.OO.................
................OO.O.O..O.O.......O.O..O.O.OO.................
................O........OOO.O.O.OOO........O....OOO..........
...............OO.......OO.........OO.......OO..O...O.........
...............O...............................O....OO........
........OOO....OOOO.........................OOOO..OO.O........
.......O...O..OO..OO..........................O.O....OO.......
......OO....O......O....OOO.........................O.........
......O.OO..OOOO...OO..O...O..........................OOO.....
.....OO....O.O........O....OO...........................OO....
.......O...........OOOO..OO.O............................O....
...OOO...............O.O....OO...........................OO...
..OO.......................O..................................
..O..........................OOO..............................
.OO............................OO.............................
.O..............................O....OOO......................
.OOOO...........................OO..O...O.....................
OO..OO.............................O....OO....................
.....O....OOO...................OOOO..OO.O....................
.....OO..O...O....................O.O....OO...................
........O....OO.........................O.....................
.....OOOO..OO.O...........................OOO.................
.......O.O....OO............................OO................
.............O...............................O................
...............OOO...........................OO...............
.................OO...........................O...............
..................O........................OOOO....OOO........
..................OO......................OO..OO..O...O.......
...................O...............OOO....O......O....OO......
................OOOO..............O...O..OO...OOOO..OO.O......
...............OO..OO............OO....O........O.O....OO.....
...............O.................O.OO..OOOO...........O.......
..............OO................OO....O.O...............OOO...
..............O...................O.......................OO..
..............OOOO............OOO..........................O..
.............OO..OO..........OO............................OO.
..................O..........O..............................O.
..................OO........OO...........................OOOO.
...................O........O...........................OO..OO
................OOOO........OOOO........................O.....
...............OO..OO......OO..OO......................OO.....
...............O................O......................O......
..............OO................OO.....................OOOO...
..............O.......................................OO..OO..
..............OOOO.........................................O..
.............OO..OO........................................OO.
..................O...........................................
..................OO..........................................
Branching spaceships have also been constructed for other speeds, such as c/3.

:breeder Any pattern whose population grows at a quadratic rate, although it is usual to exclude spacefillers. It is easy to see that this is the fastest possible growth rate.

The term is also sometimes used to mean specifically the breeder created by Bill Gosper's group at MIT, which was the first known pattern exhibiting superlinear growth.

There are four common types of breeder, known as MMM, MMS, MSM and SMM (where M=moving and S=stationary). Typically an MMM breeder is a rake puffer, an MMS breeder is a puffer producing puffers which produce stationary objects (still lifes and/or oscillators), an MSM breeder is a gun puffer and an SMM breeder is a rake gun. There are, however, less obvious variants of these types. Other less common breeder categories (SSS, hybrid MSS/MSM, etc.) can be created with some difficulty, based on universal constructor technology; see Pianola breeder.

The original breeder was of type MSM (a p64 puffer puffing p30 glider guns). The known breeder with the smallest initial population is switch-engine ping-pong.

:bridge A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined edge to edge, as in snake bridge snake.

:broken lines A pattern constructed by Dean Hickerson in May 2005 which produces complex broken lines of gliders and blocks.

:broth = soup

:BRx46B A Spartan elementary conduit discovered by Michael Simkin on 25 April 2016, one of the relatively few known conduits that can move a B-heptomino input to a B-heptomino output without an intervening Herschel stage.


...........OO
..OO.......OO
..OO.........
.............
.............
O..........O.
.O........O.O
.OO.......O.O
OO.........O.
O............

:BTC = billiard table configuration

:B track A track for B-heptominoes. A B-heptomino becomes a Herschel plus a block in twenty generations, so this term was nearly synonymous with Herschel track until the discovery of elementary conduits that convert a B directly to another B, or to some other non-Herschel signal output. See for example BRx46B.

:BTS A 19-cell still life made up of a bookend, a table, and a snake. Starting in 2015, with the help of Mike Playle's Bellman search program, Tanner Jacobi discovered a surprising number of ways to use this object as a catalyst for signal circuitry. One example can be seen in the CC semi-cenark entry.


..OO...
O..O...
OOO....
.......
OO.O.OO
.O.OO.O
.O.....
OO.....

:buckaroo (p30) A queen bee shuttle stabilized at one end by an eater in such a way that it can turn a glider, as shown below. The glider turning reaction uses a banana spark and is colour-preserving. The mechanism was found by Dave Buckingham in the 1970s. The name is due to Bill Gosper.


..O.....................
O.O.....................
.OO.....................
...........O............
.........O.O............
........O.O.............
.......O..O...........OO
........O.O...........OO
...OO....O.O............
..O.O......O............
..O.....................
.OO.....................

:bullet heptomino Generation 1 of the T-tetromino.


.O.
OOO
OOO

:bumper One of several periodic colour-preserving glider reflectors discovered by Tanner Jacobi on 6 April 2016. See p3 bumper, p4 bumper, p5 bumper, p6 bumper, p7 bumper, p8 bumper, p9 bumper, p11 bumper, and p15 bumper.

:bun The following induction coil. By itself this is a common predecessor of the honey farm. See also cis-mirrored R-bee.


.OO.
O..O
.OOO

:bunnies (stabilizes at time 17332) This is a parent of rabbits and was found independently by Robert Wainwright and Andrew Trevorrow.


O.....O.
..O...O.
..O..O.O
.O.O....

:burloaf = loaf

:burloaferimeter (p7) Found by Dave Buckingham in 1972. See also airforce.


....OO....
.....O....
....O.....
...O.OOO..
...O.O..O.
OO.O...O.O
OO.O....O.
....OOOO..
..........
....OO....
....OO....

:burn A reaction which travels indefinitely as a wave through the components of a wick or an agar. A burning wick is known as a fuse.

If the object being burned has a spatial periodicity, then the active area of the burning usually remains bounded and so eventually develops a periodicity too. It is unknown whether this will always occur.

The speed of burning can range from arbitrarily slow up to the speed of light. The results of burning can be clean (leaving no debris), or leaving debris usually much different from the original object. In rare cases, a reburnable fuse produces an exact copy of the original object, allowing the creation of objects such as the telegraph.

In many useful cases burning can be initiated by impacting an object with gliders or other spaceships. An object might be able to burn in more than one way, depending on how the burn is initiated.

:bushing That part of the stator of an oscillator which is adjacent to the rotor. Compare casing.

:butterfly The following pattern, or the formation of two beehives that it evolves into after 33 generations. (Compare teardrop, where the beehives are five cells closer together.)


O...
OO..
O.O.
.OOO

:Bx125 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in November 1998. After 125 ticks, it produces an inverted Herschel rotated 180 degrees at (-9, -17) relative to the input. Its recovery time is 166 ticks. A ghost Herschel in the pattern below marks the output location:


...........................O..........
..O.......................O.O.........
..O.......................O.O.........
OOO.........OO...........OO.OOO.......
O...........OO.................O......
.........................OO.OOO.......
.........................OO.O.........
......................................
......................................
......................................
......................................
......................................
......................................
......................................
......................................
....................................OO
....................................OO
......................................
.........O............................
.........O.O..........................
.........OOO..........................
...........O..........................
......................................
.......................OO.............
.......................O..............
........................OOO...........
..........................O...........

:Bx222 A composite conduit, one of the original sixteen Herschel conduits, discovered by Paul Callahan in October 1998. It is made up of three elementary conduits, HF95P + PB68B + BFx59H. After 222 ticks, it produces a mirror-reflected Herschel rotated 180 degrees, at (6, -16) relative to the input. Its recovery time is 271 ticks. A ghost Herschel in the pattern below marks the output location:


.............O............................
....OO.....OOO.......OO...................
.....O....O..........O....................
.....O.O...O..........O...................
......O.O...O........OO...................
.......O...OO.................O......O....
............................OOO.....O.O...
...........................O........O.O...
...........................OO......OO.OOO.
.........................................O
..O...............OO...............OO.OOO.
..O...............OO...............OO.O...
OOO.......................................
O.........................................
..........................................
..........................................
........................................OO
........................................O.
......................................O.O.
......................................OO..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
......O...................................
......O.O.................................
......OOO.................................
........O....................OO...........
.............................O............
..................OO..........O...........
..................OO..OO.....OO...........
......................O.O.................
........................O.................
........................OO................

:by flops (p2) Found by Robert Wainwright.


...O..
.O.O..
.....O
OOOOO.
.....O
.O.O..
...O..

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_j.htm0000755000175000017500000001436013317135606014333 00000000000000 Life Lexicon (J)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:J = Herschel

:jack (p4) Found by Robert Wainwright, April 1984.


...O.....O...
...OO...OO...
O..OO...OO..O
OOO..O.O..OOO
.....O.O.....
OOO..O.O..OOO
O..OO...OO..O
...OO...OO...
...O.....O...

:jagged lines A pattern constructed by Dean Hickerson in May 2005 that uses puffers to produce a line of bi-blocks that weaves back and forth in a complicated way.

:jam (p3) Found by Achim Flammenkamp in 1988, but not widely known about until its independent discovery (and naming) by Dean Hickerson in September 1989. Compare with mold. In fact this is really very like caterer. In terms of its 7x7 bounding box it ties with trice tongs as the smallest p3 oscillator.


...OO.
..O..O
O..O.O
O...O.
O.....
...O..
.OO...

:JavaLifeSearch See lifesrc.

:Jaws A breeder constructed by Nick Gotts in February 1997. In the original version Jaws had an initial population of 150, which at the time was the smallest for any known pattern with superlinear growth. In November 1997 Gotts produced a 130-cell Jaws using some switch engine predecessors found by Paul Callahan. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

Jaws consists of eight pairs of switch engines which produce a new block-laying switch engine (plus masses of junk) every 10752 generations. It is therefore an MMS breeder.

:JC = dead spark coil

:JHC John Horton Conway. Also another name for monogram.

:J-heptomino = Herschel

:JLS = JavaLifeSearch

:Jolson (p15) Two blocks hassled by two pentadecathlons. Found by Robert Wainwright in November 1984 and named by Bill Gosper. A p9 version using snackers instead of pentadecathlons is also possible.


.OO......OO..
O..O....O..O.
O..O....O..O.
O..O....O..O.
.OO......OO..
.............
.............
.......O.....
.....O..O.OO.
......OO..OO.
.............
.............
......OOOO...
.....OOOOOO..
....OOOOOOOO.
...OO......OO
....OOOOOOOO.
.....OOOOOO..
......OOOO...

:junk = ash.

:Justyna (stabilizes at time 26458) The following methuselah found by Andrzej Okrasinski in May 2004.


.................O....
................O..O..
.................OOO..
.................O..O.
......................
OO................O...
.O................O...
..................O...
......................
......................
......................
......................
......................
......................
......................
...................OOO
...........OOO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_r.htm0000755000175000017500000014041213317135606014341 00000000000000 Life Lexicon (R)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:R = R-pentomino

:R190 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in July 1996. It is made up of two elementary conduits, HRx131B + BFx59H. After 190 ticks, it produces a Herschel turned 90 degrees clockwise at (24, 16) relative to the input. Its recovery time is 107 ticks. A ghost Herschel in the pattern below marks the output location:


..........OO.........................
.......OO..O.........................
.....OOO.OO..........................
....O................................
.O..OOOO.OO..........................
.OOO...O.OO..........................
....O................................
...OO..........................OO....
...............................O.....
.............................O.O.....
.............................OO......
.....................................
.....................................
.....................................
.....................................
.................................OO.O
.................................O.OO
.....................................
O.........................OO.........
O.O.......................OO.........
OOO..................................
..O..................................
.....................................
.....................................
.........OO...OO.....................
..........O...O......................
.......OOO.....OOO...................
.......O.........O...................
.................O.O.................
..................OO.................
.....................................
.....................................
.....................................
.....................................
.....................................
.........................OOO.........
.........................O...........
........................OO...........

:R2D2 (p8) This was found, in the form shown below, by Peter Raynham in the early 1970s. The name derives from a form with a larger and less symmetric stator found by Noam Elkies in August 1994. Compare with Gray counter.


.....O.....
....O.O....
...O.O.O...
...O.O.O...
OO.O...O.OO
OO.O...O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:r5 = R-pentomino

:R64 An elementary conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in September 1995. After 64 ticks, it produces a Herschel rotated 90 degrees clockwise at (11, 9) relative to the input. Its recovery time is 153 ticks, though this can be improved to 61 ticks by adding a from-the-side eater inside the turn to avoid interference from the output Herschel's first natural glider, as shown below. A ghost Herschel in the pattern below marks the output location:


..........OO...........
..........OO.....OO....
.................OO....
.......................
.......................
...............OO......
...............OO......
.....................OO
.....................OO
.......................
.......................
.......................
.O.....................
.O.O...................
.OOO...................
...O...................
.......................
.......................
.......................
...OO.OO...............
..O.O.O.O..............
..O.O..O...............
.OO.O........OOO.......
O...OO.......O.........
.O.O..O.O...OO.........
OO.OO..OO..............
R64 is one of the simplest known Spartan conduits, one of the two known Blockic conduits, and one of the few elementary conduits in the original set of sixteen. See also p256 gun.

:rabbits (stabilizes at time 17331) A 9-cell methuselah found by Andrew Trevorrow in 1986.


O...OOO
OOO..O.
.O.....
The following predecessor, found by Trevorrow in October 1995, has the same number of cells and lasts two generations longer.

..O....O
OO......
.OO.OOO.

:racetrack A pattern in which a signal makes its way in a loop through an "obstacle course" of reactions in order to demonstrate various ways that the signal can be reflected, temporarily stored, and converted. The more different reactions that are used the better the racetrack. David Goodenough built racetracks for p30 and p46 technology in 1995. Racetracks are also known for Herschel conduit technology, and simple ones are useful for building oscillators and glider guns.

:rake Any puffer whose debris consists of spaceships. A rake is said to be forwards, backwards or sideways according to the direction of the spaceships relative to the direction of the rake. Originally the term "rake" was applied only to forwards c/2 glider puffers (see space rake). Many people prefer not to use the term in the case where the puffed spaceships travel parallel or anti-parallel to the puffer, as in this case they do not rake out any significant region of the Life plane (and, in contrast to true rakes, these puffers cannot travel in a stream, and so could never be produced by a gun).

Although the first rakes (circa 1971) were c/2, rakes of other velocities have since been built. Dean Hickerson's construction of Corderships in 1991 made it easy for c/12 diagonal rakes to be built, although no one actually did this until 1998, by which time David Bell had constructed c/3 and c/5 rakes (May 1996 and September 1997, respectively). Jason Summers constructed a 2c/5 rake in June 2000 (building on work by Paul Tooke and David Bell) and a c/4 orthogonal rake in October 2000 (based largely on reactions found by David Bell).

The smallest possible period for a rake is probably 7, as this could be achieved by a 3c/7 orthogonal backwards glider puffer. The smallest period attained to date is 8 (Jason Summers' backrake, March 2001).

:$rats (p6) Found by Dave Buckingham, 1972.


.....OO.....
......O.....
....O.......
OO.O.OOOO...
OO.O.....O.O
...O..OOO.OO
...O....O...
....OOO.O...
.......O....
......O.....
......OO....

:rattlesnake (p11) Found by Dean Hickerson in January 2016 and named by Jeremy Tan.


........OO...
........O....
.........O...
........OO...
.............
.............
.............
.....O.......
.....OO......
OO.O.O.OOO...
O.OO.O.O.O...
......O..OOO.
.......OO...O
.........OOO.
.........O...

:R-bee = bun. This name is due to the fact that the pattern is a single-cell modification of a beehive.

:reaction envelope The collection of cells that are alive during some part of a given active reaction. This term is used for Herschel circuits and other stable circuitry, whereas construction envelope is specific to recipes in self-constructing circuitry.

There are some subtleties at the edges of the envelope. Specifically, two reactions that have the exact same set of cells defining their envelopes may have different behavior when placed next to a single-cell protrusion like the tail of an eater1, or one side of a tub. The difference depends on whether two orthogonally adjacent cells at the edge of the envelope are ever simultaneously alive, within the protruding cell's zone of influence.

:reanimation A reaction performed by a convoy of spaceships (or other moving objects) which converts a common stationary object into a glider without harming the convoy. This provides one way for signals that have been frozen in place by some previous reaction to be released for use.

Simple reactions using period 4 c/2 spaceships have been found for reanimating a block, boat, beehive, ship, loaf, bi-block, or toad. The most interesting of these is for a beehive since it seems to require an unusual p4 spaceship:


..........O.......................
.........O.O......................
.........O.O......................
..........O.......................
..................................
...............OOO.............OOO
..............O..O.....OOO....O..O
.................O....O..O.......O
.............O...O....O...O..O...O
.................O..O...O.O......O
..OOO............O.O........OO..O.
.O..O..............O........OOOOO.
....O..........OOO...O......OO....
O...O..........................OO.
O...O.............................
....O.............................
.O.O...............O..............
..................OOO.............
.................OO.O.............
....O............OOO..............
...OOO...........OOO..............
...O.OO..........OOO..............
....OOO...........OO..............
....OOO...........................
....OO............................

Reanimation of a loaf is used many times in the Caterloopillar. It is also used in the Caterpillar as part of its catch and throw mechanism. Finally, reanimation can produce rakes from some puffers. See stop and restart for a similar idea that applies to Herschel conduits and other signal circuitry.

There are small objects which have no known reanimation reactions using c/2 ships other than the brute force method of hitting them with the output of rakes.

:reburnable fuse A very rare type of fuse whose output is identical to its input, possibly with some spatial and/or temporal offset. See lightspeed wire for an example. Reburnable fuses are used primarily in the construction of fixed-speed self-supporting macro-spaceships, where the speed of the fuse's burning reaction becomes the speed of the spaceship. Examples include the Caterpillar, Centipede, and waterbear.

:receiver See Herschel receiver.

:recipe = glider synthesis or construction recipe.

:recovery time The number of ticks that must elapse after a signal is sent through a conduit, before another signal can be safely sent on the same path. In general, a lower recovery time means a more useful conduit. For example, the Snark's very low recovery time allowed for the creation of oscillators with previously unknown periods, 43 and 53.

For the most part this is a synonym for repeat time. However, overclocking a complex circuit can often allow it to be used at a repeat time much lower than its safe recovery time.

:rectifier The smallest known 180-degree reflector, discovered by Adam P. Goucher in 2009. It was the smallest and fastest stable reflector of any kind until the discovery of the Snark in 2013. The rectifier has the same output glider as the boojum reflector but a much shorter repeat time of only 106 ticks.

Another advantage of the rectifier is that the output glider is on a transparent lane, so it can be used in logic circuitry to merge two signal paths.


..O.........................................
O.O.........................................
.OO.........................................
............................................
..............O.............................
.............O.O............................
.............O.O............................
..............O.............................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
.......................OO...................
.......................OO...................
............................................
.....OO.....................................
....O.O.....................................
....O.......................................
...OO.......................................
..................................OO........
.................................O..O..OO...
.................................O.O....O...
..............OO..................O.....O.OO
.............O.O.....................OO.O.O.
.............O.......................O..O..O
............OO....................O....O..OO
..................................OOOOO.....
............................................
....................................OO.O....
....................................O.OO....
............................OOO.............
............................O...............
.............................O..............

:recursive filter A toolkit developed by Alexey Nigin in July 2015, which enables the construction of patterns with population growth that asymptotically matches an infinite number of different superlinear functions. Toolkits enabling other, sublinear infinite series had been completed by Dean Hickerson and Gabriel Nivasch in 2006. See quadratic filter and exponential filter.

Sublinear functions are possible using the recursive-filter toolkit as well. It can be used to construct a glider-emitting pattern with a slowness rate S(t) = O(log***...*(t)), the nth-level iterated logarithm of t, which asymptotically dominates any primitive-recursive function f(t).

:reflector Any stable or oscillating pattern that can reflect some type of spaceship (usually a glider) without suffering permanent damage. A pattern that is damaged or destroyed during the reflection process is generally called a one-time turner instead.

The first known reflector was the pentadecathlon, which functions as a 180-degree glider reflector (see relay). Other examples include the buckaroo, the twin bees shuttle and some oscillators based on the traffic jam reaction. Glider guns can also be made into reflectors, although these are mostly rather large.

In September 1998 Noam Elkies found some fast small-period glider reflectors, with oscillators supplying the required domino sparks at different periods. A figure-8 produced a p8 bouncer, and a p6 pipsquirter produced an equivalent p6 bouncer. A more complicated construction allows a p5 bouncer (which, as had been anticipated, soon led to a true p55 Quetzal gun). And in August 1999 Elkies found a suitable sparker to produce a p7 bouncer, allowing the first p49 oscillator to be constructed.

These were all called simply "p5 reflector", "p6 reflector", etc., until 6 April 2016 when Tanner Jacobi discovered an equally small and simple reaction, the bumper, starting with a loaf as bait instead of a boat. This resulted in a series of periodic colour-preserving reflectors, whereas Elkies' bouncer reflectors are all colour-changing. A useful mnemonic is that "bouncer" contains a C and is colour-changing, whereas "bumper" contains a P and is colour-preserving.

Stable reflectors are special in that if they satisfy certain conditions they can be used to construct oscillators of all sufficiently large periods. It was known for some time that stable reflectors were possible (see universal constructor), but no one was able to construct an explicit example until Paul Callahan did so in October 1996.

Callahan's original reflector has a repeat time of 4840, soon improved to 1686, then 894, and then 850. In November 1996 Dean Hickerson found a variant in which this is reduced to 747. Dave Buckingham reduced it to 672 in May 1997 using a somewhat different method, and in October 1997 Stephen Silver reduced it to 623 by a method closer to the original. In November 1998 Callahan reduced this to 575 with a new initial reaction. A small modification by Silver a few days later brought this down to 497.

In April 2001 Dave Greene found a 180-degree stable reflector with a repeat time of only 202 (see boojum reflector). This reflector won bounties offered by Dieter Leithner and Alan Hensel. Half of the prize money was recycled into a new prize for a small 90-degree reflector, which in turn was won by Mike Playle's colour-preserving Snark reflector. The Snark is currently the smallest known stable reflector, with a recovery time of 43. Playle has offered a $100 prize for a colour-changing stable reflector contained within a 25 by 25 bounding box, with a recovery time of 50 generations or less.

As of June 2018, the following splitter is among the smallest known 90-degree colour-changing reflectors. The top output can be blocked off by an eater if needed. For small 180-degree colour-changing reflectors see rectifier, and also the sample pattern in splitter.


................OO...........O......OO..................
................OO..........O.O....O..O.................
............................O.O...O.OOO..OO.............
...........................OO.OO.O.O......O.............
...............................O.O...OO...O.O...........
...........................OO.O..OOOO.O....OO...........
...........................OO.O.O...O...................
...............................O.O...O..................
................................O.O...O.................
.................................O...OO..............O..
....................................................O.O.
.....................................................O..
........................................................
........................OO..............................
........................OO..............................
.........OO.............................................
........O..O............................................
.......O.OO..........................................OO.
.......O.............................................OO.
......OO................................................
.....................OO.................................
.....................O..................................
......................OOO...............................
........................O.....OO........................
.............................O.O........................
.............................O..........................
............................OO..........................
........................................................
........................................................
....................................O...............OO..
...................................O.O..............O.O.
...................................O.O................O.
....................................O.................OO
OOO.....................................OO..............
..O.....................................O.O.............
.O........................................O.............
..........................................OO............

:reflectorless rotating oscillator A pattern that rotates itself 90 or 180 degrees after some number of generations, with the additional constraint that multiple non-interacting copies of the pattern can be combined into a new oscillator with a period equal to the appropriate fraction of the component oscillators' period. The second constraint disqualifies small time-symmetric oscillators such as the blinker and monogram.

A working RRO might look something like a pi orbital or p256 gun loop containing one or more pis or Herschels in the same loop, but without any external stabilisation mechanism. Such patterns can be proven to exist (see universal constructor), but as of June 2018 none have been explicitly constructed in Life. There is no upper limit on multiplicity for a constructor-based RRO.

:regulator An object which converts input gliders aligned to some period to output gliders aligned to a different period. The most interesting case is a universal regulator, of which several have been constructed by Paul Chapman and others.

:relay Any oscillator in which spaceships (typically gliders) travel in a loop. The simplest example is the p60 one shown below using two pentadecathlons. Pulling the pentadecathlons further apart allows any period of the form 60+120n to be achieved. This is the simplest proof of the existence of oscillators of arbitrarily large period.


...........................O....O..
................OO.......OO.OOOO.OO
.................OO........O....O..
................O..................
..O....O...........................
OO.OOOO.OO.........................
..O....O...........................

:repeater Any oscillator or spaceship.

:repeat time The minimum number of generations that is possible between the arrival of one object and the arrival of the next. This term is used for things such as reflectors or conduits where the signal objects (gliders or Herschels, for example) will interact fatally with each other if they are too close together, or one will interact fatally with a disturbance caused by the other. For example, the repeat time of Dave Buckingham's 59-step B-heptomino to Herschel conduit (shown under conduit) is 58.

:rephaser The following reaction that shifts the phase and path of a pair of gliders. There is another form of this reaction, glider-block cycle, that reflects the gliders 180 degrees.


..O..O..
O.O..O.O
.OO..OO.
........
........
...OO...
...OO...

:replicator A finite pattern which repeatedly creates copies of itself. Such objects are known to exist (see universal constructor), but no concrete example is known. The linear propagator may be considered to be the first example of a replicator built in Life, but this is debatable as each of its copies replicates itself only once, allowing no possibility of superlinear growth.

:reverse caber tosser A storage mechanism for data feeding a universal constructor designed by Adam P. Goucher in 2018. A very large integer can be encoded in the position of a very faraway object. If the distance to that object is measured using circuitry designed to be as simple as possible, a complete decoder and universal constructor can be created by colliding a small number of gliders - no more than 329 according to a June 2018 glider synthesis, and exactly 43 according to a July 1 redesign by Chris Cain using eight far-distant GPSEs and, amazingly, no stationary circuitry except for a single catalyst block. Some intermediate designs with 50+ gliders need no stationary circuitry at all.

With the correct placement of the faraway object, the complete pattern is theoretically capable of building any glider-constructible object. This means that 43 is the maximum number of gliders required to build any constructible object, no matter what size. However, it is not possible to determine in practice what the locations of these 43 gliders should be, even for a relatively simple construction.

:reverse fuse A fuse that produces some initial debris, but then burns cleanly. The following is a simple example.


.............OO
............O.O
...........O...
..........O....
.........O.....
........O......
.......O.......
......O........
.....O.........
....O..........
...O...........
..O............
OO.............

:revolver (p2)


O............O
OOO....O...OOO
...O.O.O..O...
..O......O.O..
..O.O......O..
...O..O.O.O...
OOO...O....OOO
O............O

:RF28B A converter with several known forms, many of which found by Dave Buckingham in 1972 and in the early 1980s. It accepts an R-pentomino as input and produces an output B-heptomino 28 ticks later. Of nine major variants known as of July 2018, four versions are shown below. For each version, the R-pentomino inputs are shown near the left and right edges, along with the B-heptomino output locations near the center.


........O..........................O........
.......O.O.......O................O.O......O
........O......OOO.................O.....OOO
..............O.........................O...
..............OO........................OO..
............................................
............................................
......O..........O........O..........O......
......OO..........O......O..........OO......
.....OO...........OO....OO...........OO.....
.................OO......OO.................
.................O........O.................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
............................................
......O..........O........O..........O......
......OO..........O......O..........OO......
.....OO...........OO....OO...........OO.....
.................OO......OO.................
.................O........O.................
............................................
..O.........................................
.O.O.............................O..........
O..O............................O.O.........
.OO..............................OO.........

The version in the southeast is used in Paul Callahan's Herschel receiver. The one in the northwest is part of L156, but can be replaced by the variant in the northeast which produces a forward glider output.

:RF48H Stephen Silver's alternate completion of Paul Callahan's Herschel receiver. As of June 2018 there are four known variants. The original version consists of a single loaf. A ghost Herschel marks the output location.


......O..................O..
......OO.................O..
.....OO..................OOO
...........................O
............................
.OO.........................
O..O........................
O.O.........................
.O..........................

:Rich's p16 A period 16 oscillator found by Rich Holmes in July 2016, using apgsearch. For its use as a filter see for example p48 gun.


....O...O....
..OO.O.O.OO..
.O...O.O...O.
O...OO.OO...O
O.O.......O.O
.O.........O.
.............
....OO.OO....
...O.O.O.O...
....O...O....

:ring of fire (p2) The following muttering moat found by Dean Hickerson in September 1992.


................O.................
..............O.O.O...............
............O.O.O.O.O.............
..........O.O.O.O.O.O.O...........
........O.O.O..OO.O.O.O.O.........
......O.O.O.O......O..O.O.O.......
....O.O.O..O..........O.O.O.O.....
.....OO.O..............O..O.O.O...
...O...O..................O.OO....
....OOO....................O...O..
..O.........................OOO...
...OO...........................O.
.O...O........................OO..
..OOOO.......................O...O
O.............................OOO.
.OOO.............................O
O...O.......................OOOO..
..OO........................O...O.
.O...........................OO...
...OOO.........................O..
..O...O....................OOO....
....OO.O..................O...O...
...O.O.O..O..............O.OO.....
.....O.O.O.O..........O..O.O.O....
.......O.O.O..O......O.O.O.O......
.........O.O.O.O.OO..O.O.O........
...........O.O.O.O.O.O.O..........
.............O.O.O.O.O............
...............O.O.O..............
.................O................

:rle Run-length encoded. Run-length encoding is a simple (but not very efficient) method of file compression. In Life the term refers to a specific ASCII encoding used for patterns in Conway's Life and other similar cellular automata. This encoding was introduced by Dave Buckingham and is now the usual means of exchanging relatively small patterns by email or in online forum discussions.

As an example of the rle format, here is a representation of the Gosper glider gun. The "run lengths" are the numbers, b's are dead cells, o's are live cells, and dollar signs signal new lines:


x = 36, y = 9, rule = B3/S23
24bo$22bobo$12boo6boo12boo$11bo3bo4boo12boo$oo8bo
5bo3boo$oo8bo3boboo4bobo$10bo5bo7bo$11bo3bo$12boo!

Over the years RLE format has been extended to handle patterns with multiple states, neighborhoods, rules, and universe sizes. A completely different encoding, macrocell format, is used for repetitive patterns that may have very large populations.

:R-mango A small active reaction, so named because it is a single-cell modification of a mango, but now more commonly known as dove.

:RNE-19T84 The following edge shooter converter, accepting an input R-pentomino and producing a glider heading northeast (if the R-pentomino is in standard orientation).


.................O.........
...............OOO.........
..............O............
...O..........OO...........
..O.O......................
..O.O......................
.OO.OO....................O
.O......................OOO
..O.OO.................O...
O.O.OO.................OO..
OO.........................
.............O.............
............OOO.....OO.....
............O......O..O....
....................OO.....
This converter has several common uses. It can be attached to the L156 Herschel conduit to change it into a useful period doubler. Connecting it to the initial stage of the L156 produces a composite Herschel-to-glider converter often used as a splitter, or as a quasi-edge shooter after suppressing the additional glider output:

................................O.........
..............................OOO.........
.............................O............
..................O..........OO...........
.................O.O......................
.................O.O......................
...............OOO.OO....................O
..............O........................OOO
........O......OOO.OO.................O...
........OOO......O.OO.................OO..
...........O..............................
..........OO..............................
...................................OO.....
..................................O..O....
...................................OO.....
..........................................
..........................................
..........................................
.........O................................
.........O.O..............................
.........OOO..............................
...........O...........OO.................
.......................O..................
........................OOO...............
..........................O...............
..........................................
..OO......................................
...O......................................
OOO.......................................
O.........................................
The above H-to-2G mechanism appears in many places in the glider gun collection, for example, mainly for periods below 78 where syringes can't be used to build small true-period guns. The insertion reaction allows a glider to be placed 19 ticks in front of another glider on the same lane, or 30 ticks behind it (28 if the perpendicular glider output is suppressed.)

:rock Dean Hickerson's term for an eater which remains intact throughout the eating process. The snake in Dave Buckingham's 59-step B-to-Herschel conduit (shown under conduit) is an example. Other still lifes that sometimes act as rocks include the tub, the hook with tail, the eater1 (eating with its tail) and the hat (in Heinrich Koenig's stabilization of the twin bees shuttle).

:roteightor (p8) Found by Robert Wainwright in 1972. See also multiple roteightors.


.O............
.OOO........OO
....O.......O.
...OO.....O.O.
..........OO..
..............
.....OOO......
.....O..O.....
.....O........
..OO..O...O...
.O.O......O...
.O.......O....
OO........OOO.
............O.

:rotor The cells of an oscillator that change state. Compare stator. It is easy to see that any rotor cell must be adjacent to another rotor cell.

:R-pentomino This is by far the most active polyomino with less than six cells: all the others stabilize in at most 10 generations, but the R-pentomino does not do so until generation 1103, by which time it has a population of 116, including six gliders.


.OO
OO.
.O.
At generation 774, an R-pentomino produces a queen bee which lasts 17 more generations before being destroyed, enough time for it to flip over. This observation led to the discovery of the Gosper glider gun.

:RRO = reflectorless rotating oscillator

:rule 22 Wolfram's rule 22 is the 2-state 1-D cellular automaton in which a cell is ON in the next generation if and only if exactly one of its three neighbours is ON in the current generation (a cell being counted as a neighbour of itself). This is the behaviour of Life on a cylinder of width 1.

:ruler A pattern constructed by Dean Hickerson in April 2005 that produces a stream of LWSS with gaps in it, such that the number of LWSS between successive gaps follows the "ruler function" (sequence A001511 in The On-Line Encyclopedia of Integer Sequences).

:rumbling river Any oscillator in which the rotor is connected and contained in a strip of width 2. The following p3 example is by Dean Hickerson, November 1994.


..............OO......OO......OO...O.OO..........
....O........O..O....O..O....O..O..OO.O..........
O..O.O....O...OO..O...OO..O...O.O.....O.OO.......
OOOO.O..OOOOOO..OOOOOO..OOOOOO..OOOOOO.O.O.......
.....O.O.....O.O.....O.O.....O.O.....O.O......OO.
..OO.O.O.O.O...O.O.O...O.O.O...O.O.O...O.O.....O.
.O.....O.O...O.O.O...O.O.O...O.O.O...O.O.O.O.OO..
.OO......O.O.....O.O.....O.O.....O.O.....O.O.....
.......O.O.OOOOOO..OOOOOO..OOOOOO..OOOOOO..O.OOOO
.......OO.O.....O.O...O..OO...O..OO...O....O.O..O
..........O.OO..O..O....O..O....O..O........O....
..........OO.O...OO......OO......OO..............

:Rx202 A composite conduit, one of the original sixteen Herschel conduits, discovered by Dave Buckingham in May 1997. It is made up of two elementary conduits, HR143B + BFx59H. After 202 ticks, it produces an inverted Herschel turned 90 degrees clockwise at (7, 32) relative to the input. Its recovery time is 201 ticks. A ghost Herschel in the pattern below marks the output location:


..............OO...............
...........OO..O...............
.........OOO.OO......O.........
........O..........OOO.........
.........OOO.OO...O............
...........O.OO...OO...........
...............................
...............................
...............................
...............................
.......................OO......
.......................O.......
.....................O.O.......
.....................OO........
...............................
...............................
...............................
...............................
...............................
...O...........................
...O.O.........................
...OOO.........................
.....O.........................
......................OO.......
......................OO.......
...............................
...............................
...............................
...............................
...............................
...............................
...............................
O.OO...........................
OO.O...........................
.....................OO........
.........OO.........O..O..OO...
.........OO.........O.O....O...
.....................O.....O.OO
........................OO.O.O.
........................O..O..O
.....................O....O..OO
.....................OOOOO.....
...............................
...................OOOOOOO.....
...................O..O..O.....
.................O.O...........
.................OO............
...............................
...............................
...............................
...............................
...............................
.........OOO...................
...........O...................
...........OO..................

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_a.htm0000755000175000017500000006417413317135606014332 00000000000000 Life Lexicon (A)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Achim's p144 (p144) This was found (minus the blocks shown below) on a cylinder of width 22 by Achim Flammenkamp in July 1994. Dean Hickerson reduced it to a finite form using figure-8s the same day. The neater finite form shown here, replacing the figure-8s with blocks, was found by David Bell in August 1994. See factory for a use of this oscillator.


OO........................OO
OO........................OO
..................OO........
.................O..O.......
..................OO........
..............O.............
.............O.O............
............O...O...........
............O..O............
............................
............O..O............
...........O...O............
............O.O.............
.............O..............
........OO..................
.......O..O.................
........OO..................
OO........................OO
OO........................OO

:Achim's p16 (p16) Found by Achim Flammenkamp, July 1994.


.......OO....
.......O.O...
..O....O.OO..
.OO.....O....
O..O.........
OOO..........
.............
..........OOO
.........O..O
....O.....OO.
..OO.O....O..
...O.O.......
....OO.......

:Achim's p4 (p4) Dave Buckingham found this in a less compact form (using two halves of sombreros) in 1976. The form shown here was found by Achim Flammenkamp in 1988. The rotor is two copies of the rotor of 1-2-3-4, so the oscillator is sometimes called the "dual 1-2-3-4".


..OO...OO..
.O..O.O..O.
.O.OO.OO.O.
OO.......OO
..O.O.O.O..
OO.......OO
.O.OO.OO.O.
.O..O.O..O.
..OO...OO..

:Achim's p5 = pseudo-barberpole

:Achim's p8 (p8) Found by Achim Flammenkamp, July 1994.


.OO......
O........
.O...O...
.O...OO..
...O.O...
..OO...O.
...O...O.
........O
......OO.

:acorn (stabilizes at time 5206) A methuselah found by Charles Corderman. It has a final population of 633 and covers an area of 215 by 168 cells, not counting the 13 gliders it produces. Its ash consists of typical stable objects and blinkers, along with the relatively rare mango and a temporary eater1.


.O.....
...O...
OO..OOO

:A for all (p6) Found by Dean Hickerson in March 1993.


....OO....
...O..O...
...OOOO...
.O.O..O.O.
O........O
O........O
.O.O..O.O.
...OOOO...
...O..O...
....OO....

:against the grain A term used for negative spaceships travelling in zebra stripes agar, perpendicular to the stripes, and also for against-the-grain grey ships.

Below is a sample signal, found by Hartmut Holzwart in April 2006, that travels against the grain at 2c/3. This "negative spaceship" travels upward and will quickly reach the edge of the finite patch of stabilized agar shown here.


...O..O..O..O..O..O..O..O..O..O..O...
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOOOO......OOOOOOOOOOOOOO.
O...............O....O..............O
.OOOOOOOOOOOOOOOO....OOOOOOOOOOOOOOO.
.....................................
.OOOOOOOOOOOOO...OOOO...OOOOOOOOOOOO.
O.................OO................O
.OOOOOOOOOOOO............OOOOOOOOOOO.
.............O..........O............
.OOOOOOOOOOOOOO........OOOOOOOOOOOOO.
O..............O......O.............O
.OOOOOOOOOOOOOOO......OOOOOOOOOOOOOO.
..........OO....O....O....OO.........
.OOOOOOO......OOOO..OOOO......OOOOOO.
O.......O...OO...O..O...OO...O......O
.OOOOOOO.........O..O.........OOOOOO.
.........O.....O......O.....O........
.OOOOOOOOO......O....O......OOOOOOOO.
O.........O....OO.OO.OO....O........O
.OOOOOOOOOOO....O....O....OOOOOOOOOO.
............OO....OO....OO...........
.OOOOOOO..OOO.O..O..O..O.OOO..OOOOOO.
O..............OOO..OOO.............O
.OOOOO......OOO.O....O.OOO......OOOO.
......O....O..............O....O.....
.OOOOOO........O......O........OOOOO.
O......O...OO..O..OO..O..OO...O.....O
.OOOOOOOO.....O.OO..OO.O.....OOOOOOO.
.........O..O.OO......OO.O..O........
.OOOOOOOOO...OO........OO...OOOOOOOO.
O..........O..............O.........O
.OOOOOOOOOOOOOOOO....OOOOOOOOOOOOOOO.
.................OOOO................
.OOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOOOO.
O...................................O
.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
...O..O..O..O..O..O..O..O..O..O..O...

Holzwart proved in 2006 that 2c/3 is the maximum speed at which signals can move non-destructively against the grain through zebra stripes agar.

:against-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying perpendicular to the direction in which the spaceship moves. See also with-the-grain grey ship.

:agar Any pattern covering the whole plane that is periodic in both space and time. The simplest (nonempty) agar is the stable one extended by the known spacefillers. For some more examples see chicken wire, houndstooth agar, onion rings, squaredance and Venetian blinds. Tiling the plane with the pattern O......O produces another interesting example: a p6 agar which has a phase of density 3/4, which is the highest yet obtained for any phase of an oscillating pattern. See lone dot agar for an agar composed of isolated cells.

:aircraft carrier (p1) This is the smallest still life that has more than one island.


OO..
O..O
..OO

:airforce (p7) Found by Dave Buckingham in 1972. The rotor consists of two copies of that used in the burloaferimeter.


.......O......
......O.O.....
.......O......
..............
.....OOOOO....
....O.....O.OO
...O.OO...O.OO
...O.O..O.O...
OO.O...OO.O...
OO.O.....O....
....OOOOO.....
..............
......O.......
.....O.O......
......O.......

:AK47 reaction The following reaction (found by Rich Schroeppel and Dave Buckingham) in which a honey farm predecessor, catalysed by an eater and a block, reappears at another location 47 generations later, having produced a glider and a traffic light. This was in 1990 the basis for the Dean Hickerson's construction of the first true p94 gun, and for a very small (but pseudo) p94 glider gun found by Paul Callahan in July 1994. (The original true p94 gun was enormous, and has now been superseded by comparatively small Herschel loop guns and Mike Playle's tiny AK94 gun.)


.....O....
....O.O...
...O...O..
...O...O..
...O...O..
....O.O...
.....O....
..........
..OO......
...O......
OOO.....OO
O.......OO

:AK94 gun The smallest known gun using the AK47 reaction, found by Mike Playle in May 2013 using his Bellman program.


.......O.......O.......OO.............
.......OOO.....OOO.....OO.............
..........O.......O...................
.........OO......OO................OO.
..............................OO..O..O
..............................O.O..OO.
.................................OO...
.....O............................O...
.....OOO..........................O.OO
........O......................OO.O..O
.......OO......................OO.OO..
......................................
......................................
.................O....................
..OO.OO.........O.O..........OO.......
O..O.OO........O...O.........O........
OO.O...........O...O..........OOO.....
...O...........O...O............O.....
...OO...........O.O...................
.OO..O.O.........O....................
O..O..OO..............................
.OO................OO.................
...................O..................
.............OO.....OOO...............
.............OO.......O...............

:Al Jolson = Jolson

:almost knightship A promising partial result discovered by Eugene Langvagen in March 2004. This was an early near miss in the ongoing search for a small elementary (2,1)c/6 knightship. After six generations, only two cells are incorrect.


....OOO......
...OO..OO....
..O..OOO.OO..
.OOO.........
...OO....OO..
OO.O.........
OO..OOO......
....OO.O.....
OO.OOO.......
.O...O.OO....
.....O.OO....
O...O....O...
O...O..OOO.OO
O............
.O.O..O......
.....O.....OO
......O.OO...
......OO..O..
...........O.

:almosymmetric (p2) Found in 1971.


....O....
OO..O.O..
O.O......
.......OO
.O.......
O......O.
OO.O.O...
.....O...

:ambidextrous A type of Herschel transceiver where the receiver can be used in either of two mirror-image orientations. See also chirality.

:anteater A pattern that consumes ants. Matthias Merzenich discovered a c/5 anteater on 15 April 2011. See wavestretcher for details.

:antlers = moose antlers

:ants (p5 wick) The standard form is shown below. It is also possible for any ant to be displaced by one or two cells relative to either or both of its neighbouring ants. Dean Hickerson found fenceposts for both ends of this wick in October 1992 and February 1993. See electric fence, and also wickstretcher.


OO...OO...OO...OO...OO...OO...OO...OO...OO..
..OO...OO...OO...OO...OO...OO...OO...OO...OO
..OO...OO...OO...OO...OO...OO...OO...OO...OO
OO...OO...OO...OO...OO...OO...OO...OO...OO..

:antstretcher Any wickstretcher or wavestretcher that stretches ants. Nicolay Beluchenko and Hartmut Holzwart constructed the following small extensible antstretcher in January 2006:


......................................................OO.......
.....................................................OO........
...............................................OO.....O........
..............................................OO.....OO........
................................................O....O.O..OO...
..................................................OO...OO.OOOO.
..................................................OO..........O
..............................................................O
........................................................O......
..........................................................OO...
...............................................................
..........................................................OOO..
.........................................................OO..O.
...............................OO..........................O...
..............................OO...............................
...............................O.O...................OOO..O....
..........................O....OOO...................O..OOO....
.........................OOOOO.OOO..O.OO................OO.....
.........................O..OO......O...OO.OO.........OO.OO....
...................................O....OO...OO.OO.......OO....
...........................OO..OO.OO..OO.....OO...OO.O.O.......
...................................O.......OO.....OO...........
.....................OOO...O.....OO.............OO....O........
.....................O.....O..O.OO...................O.........
......................O...OO.O.................................
.........................OO...O.O..............................
.............OOO..........O....................................
.............O.....OOO..OO.....................................
..............O..OO.OOO.OO.....................................
................O..........O...................................
.................O.O.OO....O...................................
...................OO.O........................................
.................OO...O.O......................................
................OO.............................................
..................O............................................
...............OO..............................................
..............OOO..............................................
.............OO.O..............................................
............OOOO.O.............................................
.................OOO...........................................
..................OO...........................................
..........OOO.OO...............................................
.........O...OOO...............................................
............OOO................................................
........O.O.O..................................................
.......OOOO....................................................
.......O.......................................................
........OO.....................................................
.........O..O..................................................
OO.............................................................
O.O...OOO......................................................
O...O....O.....................................................
...OO..........................................................
...O.....O.....................................................

:anvil The following induction coil.


.OOOO..
O....O.
.OOO.O.
...O.OO

:apgluxe See apgsearch

:apgmera See apgsearch.

:apgnano See apgsearch.

:apgsearch One of several versions of a client-side Ash Pattern Generator soup search script by Adam P. Goucher, for use with Conway's Life and a wide variety of other rules. Development of the original Golly-based Python script started in August 2014. After the addition in 2016 of apgnano (native C++) and apgmera (self-modifying, 256-bit SIMD compatibility), development continues in 2017 with apgluxe (Larger Than Life and Generations rules, more soup shapes). Several customized variants of the Python script have also been created by other programmers, to perform types of searches not supported by Goucher's original apgsearch 1.x.

All of these versions of the search utility work with a "haul" that usually consists of many thousands or millions of random soup patterns. Each soup is run to stability, and detailed object census results are reported to Catagolue. For any rare objects discovered in the ash, the source soup can be easily retrieved from the Catagolue server.

:APPS (c/5 orthogonally, p30) An asymmetric PPS. The same as the SPPS, but with the two halves 15 generations out of phase with one another. Found by Alan Hensel in May 1998.

:ark A pair of mutually stabilizing switch engines. The archetype is Noah's ark. The diagram below shows an ark found by Nick Gotts that takes until generation 736692 to stabilize, and can therefore be considered as a methuselah.


...........................O....
............................O...
.............................O..
............................O...
...........................O....
.............................OOO
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
OO..............................
..O.............................
..O.............................
...OOOO.........................

:arm A long extension, sometimes also called a "wing", hanging off from the main body of a spaceship or puffer perpendicular to the direction of travel. For example, here is a sparking c/3 spaceship which contains two arms.


............OOO............
...........O...............
..........OO...............
....O.OO..OO..OOO..........
...OO.OO.OO.....O....OO....
..O..OO...O.OO....OO.OO....
........OOOO......OO...O...
....O.O.OO........OO.......
......O....................
...OO......................
..OO..O....................
....OOO.OO.................
O..O.....OOO...............
.O.OOOO.O...O..............
........OO....O......O.....
.........O....OO....OO.OOO.
........O...O..OO..OO.....O
..........O..O.O..O.....OO.
...........O.OOO....O......
............OOO..OOO.O.....
...........OO...OOO........
..................O..O.....
...................O.......
Many known spaceships have multiple arms, usually fairly narrow. This is an artefact of the search methods used to find such spaceships, rather than an indication of what a "typical" spaceship might look like.

For an alternate meaning see construction arm.

:armless A method of generating slow salvos across a wide range of lanes without using a construction arm with a movable elbow. Instead, streams of gliders on two fixed opposing lanes collide with each other to produce clean 90-degree output gliders. Slowing down one of the streams by 8N ticks will move the output lanes of the gliders toward the source of that stream by N full diagonals. This construction method was used to create the supporting slow salvos in the half-baked knightships, and also in the Parallel HBK gun.

:ash The stable or oscillating objects left behind when a chaotic reaction stabilizes, or "burns out". Experiments show that for random soups with moderate initial densities (say 0.25 to 0.5) the resulting ash has a density of about 0.0287. (This is, of course, based on what happens in finite fields. In infinite fields the situation may conceivably be different in the long run because of the effect of certain initially very rare objects such as replicators.)

:asynchronous Indicates that precise relative timing is not needed for two or more input signals entering a circuit, or two or more sets of gliders participating in a glider synthesis. In some cases the signals or sets of gliders can arrive in any order at all - i.e., they have non-overlapping effects.

However, in some cases such as slow salvo constructions, there is a required order for some of the incoming signals. These signals can still be referred to as "asynchronous" because the number of ticks between them is infinitely adjustable: arbitrarily long delays can be added with no change to the final result. Compare synchronized.

:aVerage (p5) Found by Dave Buckingham, 1973. The average number of live rotor cells is five (V), which is also the period.


...OO........
....OOO......
..O....O.....
.O.OOOO.O....
.O.O....O..O.
OO.OOO..O.O.O
.O.O....O..O.
.O.OOOO.O....
..O....O.....
....OOO......
...OO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_x.htm0000755000175000017500000000662313317135606014354 00000000000000 Life Lexicon (X)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:x66 (c/2 orthogonally, p4) Found by Hartmut Holzwart, July 1992. Half of this can be escorted by an HWSS. The name refers to the fact that every cell (live or dead) has at most 6 live neighbours (in contrast to spaceships based on LWSS, MWSS or HWSS). In fact this spaceship was found by a search with this restriction.


..O......
OO.......
O..OOO..O
O....OOO.
.OOO..OO.
.........
.OOO..OO.
O....OOO.
O..OOO..O
OO.......
..O......

:Xlife A popular freeware Life program that runs under the X Window System. The main Life code was written by Jon Bennett, and the X code by Chuck Silvers.

:X-pentomino Conway's name for the following pentomino, a traffic light predecessor.


.O.
OOO
.O.

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_g.htm0000755000175000017500000013407613317135606014337 00000000000000 Life Lexicon (G)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:G4 receiver An alternate Herschel receiver discovered by Sergei Petrov on 28 December 2011, using his previous glider to 2 blocks converter. In the pattern below the Herschel output is marked by a ghost Herschel. A glider also escapes to the northwest. For an explanation of the "G4" describing the tandem glider input, see Gn.


................................O.O.......................
................................OO........................
.................................O........................
..........................................................
..........................................................
..........................................................
..........................................................
................OO........................................
................OO....................O...................
...........................O.O......OOO...................
...........................OO......O......................
............................O......OO.....................
..........................................................
..........................................................
..........................................................
OO........................................................
OO........................................................
......................................OO...............O..
...........OO.........................OO...............O..
...........OO..........................................OOO
.......................OO................................O
........O..........OO..OO.................................
......OOO..........OO.....................................
.....O....................................................
.....OO........................OO.........................
.................OO............O..........................
.................OO......O......OOO.......................
........................O.O.......O.......................
.........................O................................

:Gabriel's p138 (p138) The following oscillator found by Gabriel Nivasch in October 2002.


.......OOO.....
......O..O.....
.......O...O...
..O.....OOO....
...O.....O.....
OO.OO..........
O..O.........O.
O.O.........O.O
.O.........O..O
..........OO.OO
.....O.....O...
....OOO.....O..
...O...O.......
.....O..O......
.....OOO.......

:galaxy = Kok's galaxy

:Game of Life = Life

:Game of Life News A blog reporting on new Life discoveries, started by Heinrich Koenig in December 2004, currently found at http://pentadecathlon.com/lifenews/.

:Garden of Eden A configuration of ON and OFF cells that can only occur in generation 0. (This term was first used in connection with cellular automata by John W. Tukey, many years before Life.) It was known from the start that there are Gardens of Eden in Life, because of a theorem by Edward Moore that guarantees their existence in a wide class of cellular automata. Explicit examples have since been constructed, the first by Roger Banks, et al. at MIT in 1971. This example was 9 x 33. In 1974 J. Hardouin-Duparc et al. at the University of Bordeaux 1 produced a 6 x 122 example. The following shows a 12 x 12 example found by Nicolay Beluchenko in February 2006, based on a 13 x 12 one found by Achim Flammenkamp in June 2004.


..O.OOO.....
OO.O.OOOOO.O
O.O.OO.O.O..
.OOOO.O.OOO.
O.O.OO.OOO.O
.OOO.OO.O.O.
..O...OOO..O
.O.OO.O.O.O.
OOO.OOOO.O.O
OO.OOOO...O.
.O.O.OO..O..
.OO.O..OO.O.

Below is a 10x10 Garden of Eden found by Marijn Heule, Christiaan Hartman, Kees Kwekkeboom, and Alain Noels in 2013 using SAT-solver techniques. An exhaustive search of 90-degree rotationally symmetric 10x10 patterns was possible because the symmetry reduces the number of unknown cells by a factor of four.


.O.OOO.O..
..O.O.O..O
O.OOO..OO.
.O.OOOOO.O
O..O..OOOO
OOOO..O..O
O.OOOOO.O.
.OO..OOO.O
O..O.O.O..
..O.OOO.O.

Steven Eker has since found several asymmetrical Gardens of Eden that are slightly smaller than this in terms of bounding box area. Patterns have also been found that have only Garden of Eden parents. For related results see grandparent.

:Gemini ((5120,1024)c/33699586 obliquely, p33699586) The first self-constructing spaceship, and also the first oblique spaceship. It was made public by Andrew Wade on 18 May 2010. It was the thirteenth explicitly constructed spaceship velocity in Life, and made possible an infinite family of related velocities. The Gemini spaceship derives its name from the Latin "gemini", meaning twins, describing its two identical halves, each of which contains three Chapman-Greene construction arms. A tape of gliders continually relays between the two halves, instructing each to delete its parent and construct a daughter configuration.

:Gemini puffer See Pianola breeder.

:Geminoid A type of self-constructing circuitry that borrows key ideas from Andrew Wade's Gemini spaceship, but with several simplifications. The main feature common to the Gemini spaceship is the construction recipe encoding method. Information is stored directly, and much more efficiently, in the timings of moving gliders, rather than in a static tape with 1s and 0s encoded by the presence of small stationary objects.

Unlike the original Gemini, Geminoids have ambidextrous construction arms, initially using glider pairs on two lanes separated by 9hd, 10hd, or 0hd. The design was the basis for the linear propagator and the Demonoids. A more recent development is a Geminoid toolkit using a single-channel construction arm, which allows for the possibility of multiple elbows with no loss of efficiency, or the construction of temporary lossless elbows. Compare slow elbow.

Other new developments that could be considered part of the extended "Geminoid" toolkit include freeze-dried construction salvos and seeds, used when objects must be built within a short time window, and self-destruct circuits, which are used as an alternative to a destructor arm to clean up temporary objects in a similarly short window.

:generation The fundamental unit of time. The starting pattern is generation 0.

:germ (p3) Found by Dave Buckingham, September 1972.


....OO....
.....O....
...O......
..O.OOOO..
..O....O..
.OO.O.....
..O.O.OOOO
O.O.O....O
OO...OOO..
.......OO.

:gfind A program by David Eppstein which uses de Bruijn graphs to search for new spaceships. It was with gfind that Eppstein found the weekender, and Paul Tooke later used it to find the dragon. It is available at http://www.ics.uci.edu/~eppstein/ca/gfind.c (C source code only).

Compare lifesrc.

:ghost Herschel A dying spark made by removing one cell from the Herschel heptomino. This particular spark has the advantage that, when placed in a conduit to mark the location of an input or output Herschel, it disappears cleanly without damaging adjacent catalysts, even in dependent conduits with a block only two cells away.


O..
O..
OOO
..O

:GIG A glider injection gate. This is a device for injecting a glider into a glider stream. The injected glider is synthesized from one or more incoming spaceships assisted by the presence of the GIG. (This contrasts with some other glider injection reactions which do not require a GIG, as in inject.) Gliders already in the glider stream pass through the GIG without interfering with it. A GIG usually consists of a small number of oscillators.

For example, in July 1996 Dieter Leithner found the following reaction which allows the construction of a pseudo-period 14 glider stream. It uses two LWSS streams, a pentadecathlon and a volcano.


.O...........................
..O..........OO..............
OOO.........OOO..............
............OO.O.............
.....O.......OOO.............
...O.O........O..............
....OO.......................
.............................
......................OOOO...
.....................OOOOOO..
....................OOOOOOOO.
............O......OO......OO
...OO.....O.O.......OOOOOOOO.
.OO.OO.....OO........OOOOOO..
.OOOO..........O......OOOO...
..OO............O............
..............OOO............
.............................
.............................
.............................
.....OOOOOOO.................
...OOO.OOO.OOO...............
..O....OOO....O..............
...OOOO.O.OOO.O..............
.............O...............
..O.OO.O.O.O.................
..OO.O.O.O.OO................
......O..O.O.................
.......OO..O.................
...........OO................

Glider injection gates are useful for building glider guns with pseudo-periods that are of the form nd, where n is a positive integer, and d is a proper divisor of some convenient base gun period (such as 30 or 46), with d > 13.

:glasses (p2) Compare scrubber and spark coil.


....O........O....
..OOO........OOO..
.O..............O.
.O..OOO....OOO..O.
OO.O...O..O...O.OO
...O...OOOO...O...
...O...O..O...O...
....OOO....OOO....
..................
....OO.O..O.OO....
....O.OO..OO.O....

:glider (c/4 diagonally, p4) The smallest, most common and first discovered spaceship. This was found by Richard Guy in 1970 while Conway's group was attempting to track the evolution of the R-pentomino. The name is due in part to the fact that it is glide symmetric. (It is often stated that Conway discovered the glider, but he himself has said it was Guy. See also the cryptic reference ("some guy") in Winning Ways.)


OOO
O..
.O.
The term "glider" is also occasionally (mis)used to mean "spaceship".

:glider-block cycle An infinite oscillator based on the following reaction (a variant of the rephaser). The oscillator consists of copies of this reaction displaced 2n spaces from one another (for some n>6) with blocks added between the copies in order to cause the reaction to occur again halfway through the period. The period of the resulting infinite oscillator is 8n-20. (Alternatively, in a cylindrical universe of width 2n the oscillator just consists of two gliders and two blocks.)


...OO...
...OO...
........
........
..O..O..
O.O..O.O
.OO..OO.

:glider constructible See glider synthesis.

:glider construction = glider synthesis.

:glider duplicator Any reaction in which one input glider is converted into two output gliders. This can be done by oscillators or spaceships, or by Herschel conduits or other signal circuitry such as the stable example shown under splitter. The most useful glider duplicators are those with low periods.

The following period 30 glider duplicator demonstrates a simple mechanism found by Dieter Leithner. The input glider stream comes in from the upper left, and the output glider streams leave at the upper and lower right. One of the output glider streams is inverted, so an inverting reflector is required to complete the duplicator. To produce non-parallel output, an inline inverter could be substituted for the northmost p30 glider gun.


.......O....OO.......................OO.........
........O....O.......................OO.........
......OOO....O.O.......O..........OO......O...OO
..............OO.......O.O.......OOO.....O...O.O
..........................OO......OO......OOOOO.
..........................OO.........OO....OOO..
..........................OO.........OO.........
.......................O.O......................
.......................O........................
................................................
................................................
........................OO......................
........................OO......................
................................................
................................................
................................................
.........................OOO....................
...........................O....................
..........................O.....................
................................................
................................................
.........O.O....................................
.......O...O.....OOO............................
OO.....O.......O.O..O..OO.......................
OO....O....O.......OO..O..O.....................
.......O...................O....................
.......O...O..OOO..........O....................
.........O.O...............O....................
.......................O..O.....OO..............
.......................OO.......O.O.............
..................................O.............
..................................OO............

Spaceship convoys that can duplicate gliders are very useful since they (along with glider turners) provide a means to clean up many dirty puffers by duplicating and turning output gliders so as to impact into the exhaust to clean it up.

Glider duplicators and turners are known for backward gliders using p2 c/2 spaceships, and for forward gliders using p3 c/3 spaceships. These are the most general duplicators for these speeds.

:glider gun A gun that fires gliders. For examples, see Gosper glider gun, Simkin glider gun, new gun, p45 gun.

True-period glider guns are known for some low periods, and for all periods over 53 using Herschel conduit technology. See true for a list of known true-period guns. The lowest true-period gun possible is the p14 gun since that is the lowest possible period for any glider stream, but no example has yet been found.

Pseudo-period glider guns are known for every period above 13. These are made by using multiple true-period guns of some multiple of the period, and glider injection methods to fill in the gaps.

:glider injection gate = GIG

:glider lane See lane.

:gliderless A gun is said to be gliderless if it does not use gliders. The purist definition would insist that a glider does not appear anywhere, even incidentally. For a long time the only known way to construct LWSS, MWSS and HWSS guns involved gliders, and it was not until April 1996 that Dieter Leithner constructed the first gliderless gun (a p46 LWSS gun).

In October 2017 Matthias Merzenich used two copies of Tanner's p46 to create a p46 MWSS gun. This is the smallest known gliderless gun, and also the smallest known MWSS gun.


......O.................................
......OOO...............................
.........O..............................
........OO..............................
.....O..................................
...OOO..................................
..O.....................................
..OO....................................
........................................
..OO.......O.O..O.O.....................
..O.O......O..O...O.....................
...O.....OO...O.O.O.....................
OOO.......OOO.O.........................
O......OO.....OO........OOO.............
.......OO....OO........O...O............
.......OO...O.........O.....O...........
.......OO.O.O........O...O...O..........
.......OO.O.O........O.......O.....OO...
.....................O.O...O.O.....OO...
.................OO...OO...OO...........
..........OO....O.O.....................
......OO..OO....O...................OO..
.....O.O.......OO...................O...
.....O.............OO................OOO
....OO..............O....O.............O
....................O.O.O.O.............
.....................OO.OO.O............
...........................O............
...........................OO...........

:glider pair Two gliders travelling in the same direction with a specific spacetime offset. In a transceiver the preferred term is tandem glider. For several years, glider pairs on lanes separated by 9 or 10 half diagonals were the standard building blocks in Geminoid construction arm recipes. In more recent 0hd and single-channel construction toolkits, all gliders share the same lane, but glider pairs and singletons are still important concepts.

:glider-producing switch engine See stabilized switch engine.

:glider pusher An arrangement of a queen bee shuttle and a pentadecathlon that can push the path of a passing glider out by one half-diagonal space. This was found by Dieter Leithner in December 1993 and is shown below. It is useful for constructing complex guns where it may be necessary to produce a number of gliders travelling on close parallel paths. See also edge shooter.


.........OO..............
.........OO..............
.........................
..........O..............
.........O.O.............
.........O.O.............
..........O..............
.........................
.........................
.......OO.O.OO...........
.......O.....O...........
........O...O............
.O.......OOO.............
..O......................
OOO......................
.........................
.........................
.................O....O..
...............OO.OOOO.OO
.................O....O..

:glider recipe = glider synthesis.

:glider reflector See reflector.

:gliders by the dozen (stabilizes at time 184) In early references this is usually shown in a larger form whose generation 1 is generation 8 of the form shown here.


OO..O
O...O
O..OO

:glider stopper A Spartan logic circuit discovered by Paul Callahan in 1996. It allows a glider signal to pass through the circuit, leaving behind a beehive that can cleanly absorb a single glider from a perpendicular glider stream. Two optional glider outputs are also shown. The circuit can't be re-used until the beehive "bit" is cleared by the passage of at least one perpendicular input. A similar mechanism discovered more recently is shown in the beehive stopper entry.


.O...........................................
..O..........................................
OOO..........................................
.............................................
.............................................
...................................O.........
..................................O..........
..................................OOO........
.............................................
...............................O.............
...............................O.O...........
...................OO..........OO............
...................OO........................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
...................OO........................
..................O..O.......................
...................OO........................
..........................OO.................
..........................OO.................
...........................................OO
........OO.................................O.
.......O.O...............................O.O.
.......O.................................OO..
......OO.....................................
.............................................
.............................................
.............................................
.................OO..........................
................O.O..........................
................O............................
...............OO............................

:glider synthesis Construction of an object by means of glider collisions. It is generally assumed that the gliders should be arranged so that they could come from infinity. That is, gliders should not have had to pass through one another to achieve the initial arrangement.

Glider syntheses for all still lifes and known oscillators with at most 14 cells were found by Dave Buckingham. As of June 2018, this limit has been increased to 18 cells.

Perhaps the most interesting glider syntheses are those of spaceships, because these can be used to create corresponding guns and rakes. Many of the c/2 spaceships that are based on standard spaceships have been synthesized, mostly by Mark Niemiec. In June 1998 Stephen Silver found syntheses for some of the Corderships (although it was not until July 1999 that Jason Summers used this to build a Cordership gun). In May 2000, Noam Elkies suggested that a 2c/5 spaceship found by Tim Coe in May 1996 might be a candidate for glider synthesis. Initial attempts to construct a synthesis for this spaceship got fairly close, but it was only in March 2003 that Summers and Elkies managed to find a way to perform the crucial last step. Summers then used the new synthesis to build a c/2 forward rake for the 2c/5 spaceship; this was the first example in Life of a rake which fires spaceships that travel in the same direction as the rake but more slowly.

A 3-glider synthesis of a pentadecathlon is shown in the diagram below. This was found in April 1997 by Heinrich Koenig and came as a surprise, as it was widely assumed that anything using just three gliders would already be known.


......O...
......O.O.
......OO..
..........
OOO.......
..O.......
.O.....OO.
........OO
.......O..

:glider to 2 blocks A converter discovered by Sergei Petrov on 8 October 2011, used in his later G4 receiver.


..........O.......OO
OO......O.O.......OO
OO.......OO.........
....................
....................
....................
...........OO.......
...........OO.......
....................
....................
..............OO....
...............O....
...............O.O..
................OO..
....................
....................
....................
........OO..........
........OO..........

:glider to block A converter discovered by Sergei Petrov that places a block at its right edge in response to a single glider input. This has a variety of uses in Herschel circuitry and other signal-processing applications.


...........O....
.....O.....OOO..
.....OOO......O.
........O....OO.
.......OO.......
................
................
................
................
................
OO..............
OO..........OO..
............O.O.
.............O..
................
................
................
............OO..
..OOO.......O...
....O........OOO
...O...........O

:glider train A certain p64 c/2 orthogonal puffer that produces two rows of blocks and two backward glider waves. Ten of these were used to make the first breeder.


..............................O............
...............................O...........
.........................O.....O...........
....O.....................OOOOOO.....OOOOOO
.....O..............................O.....O
O....O....................................O
.OOOOO..............................O....O.
......................................OO...
...........................................
.....................................O.....
....................................O......
...................................OO...OO.
...................................O.O...OO
....................................O...OO.
........................................O..
...........................................
........................................O..
....................................O...OO.
...................................O.O...OO
...................................OO...OO.
....................................O......
.....................................O.....
...........................................
......................................OO...
.OOOOO..............................O....O.
O....O....................................O
.....O..............................O.....O
....O.....................OOOOOO.....OOOOOO
.........................O.....O...........
...............................O...........
..............................O............

:glider turner Any reaction in which a glider is turned onto a new path by a spaceship, oscillator, or still life constellation. In the last two cases, the glider turner is usually called a reflector if the reaction is repeatable, or a one-time turner if the reaction can only happen once.

Glider turners are easily built using standard spaceships. The following diagram shows a convoy which turns a forward glider 90 degrees, with the new glider also moving forwards.


.........OO.........
........OO.OOOO.....
.O.......OOOOOO.....
O.........OOOO......
OOO.................
....................
....................
....................
....................
...O................
.O...O..............
O...................
O....O..............
OOOOO...............
....................
....................
.............OOOOOO.
.............O.....O
.............O......
..............O....O
................OO..
Small rearrangements of the back two spaceships can alternatively send the output glider into any of the other three directions.

See also glider duplicator and reflector.

:glide symmetric Undergoing simultaneous reflection and translation. A glide symmetric spaceship is sometimes called a flipper.

:Gn An abbreviation specific to converters that produce multiple gliders. A "G" followed by any integer value means that the converter produces a tandem glider - two parallel glider outputs with lanes separated by the specified number of half diagonals.

:gnome = fox

:GoE = Garden of Eden

:GoL = Game of Life

:Golly A cross-platform open source Life program by Andrew Trevorrow and Tomas Rokicki. Unlike most Life programs it includes the ability to run patterns using the hashlife algorithm. It is available from http://golly.sourceforge.net.

:Gosper glider gun The first known gun, and indeed the first known finite pattern displaying infinite growth, found by Bill Gosper in November 1970. This period 30 gun remains the smallest known gun in terms of its bounding box, though some variants of the p120 Simkin glider gun have a lower population. Gosper later constructed several other guns, such as new gun and the p144 gun shown under factory. See also p30 gun.


........................O...........
......................O.O...........
............OO......OO............OO
...........O...O....OO............OO
OO........O.....O...OO..............
OO........O...O.OO....O.O...........
..........O.....O.......O...........
...........O...O....................
............OO......................

:Gotts dots A 41-cell 187x39 superlinear growth pattern found by Bill Gosper in March 2006, who named it in honour of Nick Gotts, discoverer of many other low-population superlinear patterns, such as Jaws, the mosquitoes, teeth, catacryst and metacatacryst. See switch-engine ping-pong for the lowest-population superlinear growth pattern as of July 2018, along with a list of the record-holders.

Collisions within the pattern cause it to sprout its Nth switch engine at generation T = ~224n-6. The population of the pattern at time t is asymptotically proportional to t times log(t), so the growth rate is O(t ln(t)), faster than linear growth but slower than quadratic growth.

:gourmet (p32) Found by Dave Buckingham in March 1978. Compare with pi portraitor and popover.


..........OO........
..........O.........
....OO.OO.O....OO...
..O..O.O.O.....O....
..OO....O........O..
................OO..
....................
................OO..
O.........OOO..O.O..
OOO.......O.O...O...
...O......O.O....OOO
..O.O..............O
..OO................
....................
..OO................
..O........O....OO..
....O.....O.O.O..O..
...OO....O.OO.OO....
.........O..........
........OO..........

:gp = glider pair

:GPSE = glider-producing switch engine

:grammar A set of rules for connecting components together to make an object such as a spaceship, oscillator or still life. For example, in August 1989 Dean Hickerson found a grammar for constructing an infinite number of short wide c/3 period 3 spaceships, using 33 different components and a table showing the ways that they can be joined together.

:grandfather = grandparent

:grandfatherless A traditional name for a pattern with one or more parents but no grandparent. This was a hypothetical designation until May 2016. See grandparent for details.

:grandparent A pattern is said to be a grandparent of the pattern it gives rise to after two generations. For over thirty years, a well-known open problem was the question of whether any pattern existed that had a parent but no grandparent. In 1972, LifeLine Volume 6 mentioned John Conway's offer of a $50 prize for a solution to the problem, but it remained open until May 2016 when a user with the conwaylife.com forum handle 'mtve' posted an example.

Other patterns have since been found that have a grandparent but no great-grandparent, or a great-grandparent but no great-great-grandparent. Further examples in this series almost certainly exist, but as of July 2018 none have yet been found.

:Gray counter (p4) Found in 1971. If you look at this in the right way you will see that it cycles through the Gray codes from 0 to 3. Compare with R2D2.


......O......
.....O.O.....
....O.O.O....
.O..O...O..O.
O.O.O...O.O.O
.O..O...O..O.
....O.O.O....
.....O.O.....
......O......

:gray ship = grey ship

:great on-off (p2)


..OO....
.O..O...
.O.O....
OO.O..O.
....OO.O
.......O
....OOO.
....O...

:grey counter = Gray counter (This form is erroneous, as Gray is surname, not a colour.)

:grey ship A spaceship that contains a region with an average density of 1/2, and which is extensible in such a way that the region of average density 1/2 can be made larger than any given square region.

See also with-the-grain grey ship, against-the-grain grey ship and hybrid grey ship.

:grin The following common parent of the block. This name relates to the infamous Cheshire cat. See also pre-block.


O..O
.OO.

:grow-by-one object A pattern whose population increases by one cell every generation. The smallest known grow-by-one object is the following 44-cell pattern (David Bell's one-cell improvement of a pattern found by Nicolay Beluchenko, September 2005).


........OO.......
.......OO........
.........O.......
...........OO....
..........O......
.................
.........O..OO...
.OO.....OO....O..
OO.....O.....O...
..O....O.O...OO..
....O..O....OO.O.
....OO.......OO..
........O....O.OO
.......O.O..O.OO.
........O........

:growing/shrinking line ship A line ship in which the line repeatedly grows and shrinks, resulting in a high-period spaceship.

:growing spaceship An object that moves like a spaceship, except that its front part moves faster than its back part and a wick extends between the two. Put another way, a growing spaceship is a puffer whose output is burning cleanly at a slower rate than the puffer is producing it. Examples include blinker ships, pi ships, and some wavestretchers.

:G-to-H A converter that takes a glider as an input signal and produces a Herschel output, which can then be used by other conduits. G-to-Hs are frequently used in stable logic circuitry. Early examples include Callahan G-to-H, Silver G-to-H, and p8 G-to-H for periodic circuits. A more compact recent example is the syringe.

:gull = elevener

:gun Any stationary pattern that emits spaceships (or rakes) forever. For examples see double-barrelled, edge shooter, factory, gliderless, Gosper glider gun, Simkin glider gun, new gun and true.

:gunstar Any of a series of glider guns of period 144+72n (for all non-negative integers n) constructed by Dave Buckingham in 1990 based on his transparent block reaction and Robert Wainwright's p72 oscillator (shown under factory).

:gutter A single straight line of cells along the axis of symmetry of a mirror-symmetric pattern. Most commonly this is an orthogonal line, and the pattern is then odd-symmetric (as opposed to even-symmetric, where the axis of symmetry follows the boundary between two rows or columns of cells).

The birth rule for Conway's Life trivially implies that if there are no live cells in the gutter of a symmetric pattern, new cells can never be born there. For examples, see 44P5H2V0, 60P5H2V0, Achim's p4, brain, c/6 spaceship, centinal, p54 shuttle, pufferfish, snail, spider, and pulsar (in two orientations).


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_e.htm0000755000175000017500000007534213317135606014335 00000000000000 Life Lexicon (E)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:early universe Conway's somewhat confusing term for sparse Life.

:eater Any still life that has the ability to interact with certain patterns without suffering any permanent damage. (If it doesn't suffer even temporary damage then it may be referred to as a rock.) The eater1 is a very common eater, and the term "eater" is often used specifically for this object. Other eaters include eater2, eater3, eater4, and eater5, and many hundreds of others are known. Below is a complex eater found by Dean Hickerson in 1998 using his dr search program. It takes 25 ticks to recover after feasting on a glider:


.O.............
..O............
OOO............
......OO.OO.O..
.......O.O.OO..
.......O.O.....
........OO.....
OO.............
O..O.OO........
..OO.O.........
...O.O.....OO.O
..O..OOO...O.OO
...OO...O......
.....OOOO......
.....O.........
...O.O.OO......
...OO..O.......
.......O.O.....
........OO.....

Some common still lifes can act as eaters in some situations, such as the block, ship, and tub. In fact the block was the first known eater, being found capable of eating beehives from a queen bee.

:eater1 (p1) Usually simply called an eater, and also called a fishhook.


OO..
O...
.OOO
...O

This eater can be constructed using a simple two-glider collision, as shown in stamp collection. It is often modified in various ways, or welded to other objects, to allow tighter packing of circuits or to allow a signal stream to pass close by. See clearance for an eater1 variant that is 1hd shorter to the southeast than the standard fishhook form. An eater1 can also be used as a 90-degree one-time turner.

Its ability to eat various objects was discovered by Bill Gosper in 1971. The fishhook eater can consume a glider, a LWSS, and a MWSS as shown below. It is not able to consume an HWSS, however. See honey bit or killer toads for that.


...........................OO
...........................O.
..O......................O.O.
O...O.........O..........OO..
.....O.........O.............
O....O.....O...O.....OOO.....
.OOOOO......OOOO.......O.....
......................O......

:eater2 (p1) This eater was found by Dave Buckingham in the 1970s. Mostly it works like the ordinary eater1 but with two slight differences that make it useful despite its size: it takes longer to recover from each bite, and it can eat objects appearing at two different positions.


OO.O...
OO.OOO.
......O
OO.OOO.
.O.O...
.O.O...
..O....
The first property means that, among other things, it can eat a glider in a position that would destroy an eater1. This novel glider-eating action is occasionally of use in itself, and combined with the symmetry means that an eater2 can eat gliders travelling along four adjacent glider lanes, as shown below.

The following eater2 variant (Stephen Silver, May 1998) can be useful for obtaining smaller bounding boxes. A more compact variant with the same purpose can be seen under gliderless.


.O.................
..O................
OOO................
...................
....O..............
.....O.............
...OOO.............
...................
.......O...........
........O..........
......OOO..........
...................
..........O........
...........O.....OO
.........OOO......O
.............OO.O..
.............OO.OO.
...................
.............OO.OO.
..............O.O..
..............O.O..
...............O...

:eater3 (p1) This large symmetric eater, found by Dave Buckingham, has a very different eating action from the eater1 and eater2. The loaf can take bites out things, being flipped over in the process. The rest of the object merely flips it back again.


.........OO.
....OO..O..O
.O..O....O.O
O.O.O.....O.
.O..O.OO....
....O..O....
.....O....O.
......OOOOO.
............
........O...
.......O.O..
........O...

:eater4 (p1) Another eater by Dave Buckingham, which he found in 1971, but did not recognize as an eater until 1975 or 1976. It can't eat gliders, but it can be used for various other purposes. The four NE-most centre cells regrow in a few generations after being destroyed by taking a bite out of something, such as suppressing half of a developing traffic light as it does in the p29 pentadecathlon hassler.


...OO.........
...O..........
OO.O..........
O..OO.........
.OO....O......
...OOOOO......
...O....OO....
....OO..O.....
......O.O.....
......O.O.O..O
.......OO.OOOO
.........O....
.........O.O..
..........OO..

:eater5 (p1) A compound eater that can eat gliders coming from two different directions. Also called the tub-with-tail eater (TWIT), it is often placed along the edges of glider lanes to suppress unwanted gliders in conduits. Below is the standard form, a compact form with a long hook, and an often-useful conjoined form found with Bellman. The sidesnagger is a Spartan constellation that has a similar glider-absorbing function, using a loaf. See also 7x9 eater.


.O.........O.........O...........
..O.........O.........O..........
OOO.......OOO.......OOO..........
.................................
......O.........O.........O......
.....O.........O.........O.......
.....OOO.......OOO.......OOO.....
.................................
..........OO.....................
......O...OO....O...OO....O...OO.
.....O.O.......O.O...O...O.O...O.
....O.O.......O.O...O....OO...O..
....O.........O....O.........O...
...OO........OO.....OOO..OOOOO.O.
......................O..O....O.O
...........................O..O.O
..........................OO...O.

With gliders from either direction, the eater5's eating reaction creates a spark that can be used to reflect other gliders. See the example pattern in duoplet, or advance any of the topmost three gliders in the above pattern by two ticks.

:eater/block frob (p4) Found by Dave Buckingham in 1976 or earlier.


.OO.......
..O.......
..O.O.....
...O.O....
.....OO.OO
........OO
..OO......
...O......
OOO.......
O.........

:eater-bound pond = biting off more than they can chew

:eater-bound Z-hexomino = pentoad

:eater eating eater = two eaters

:eater plug (p2) Found by Robert Wainwright, February 1973.


.......O
.....OOO
....O...
.....O..
..O..O..
.O.OO...
.O......
OO......

:eaters plus = French kiss

:ecologist (c/2 orthogonally, p20) This consists of the classic puffer train with a LWSS added to suppress the debris. See also space rake.


OOOO.....OO........
O...O...OO.OO......
O........OOOO......
.O..O.....OO.......
...................
.....O.........OO..
...OOO........OOOOO
..O...O.....O....OO
..O....OOOOO.....OO
..OO.O.OOOO....OO..
....O...OO.OOO.....
.....O.O...........
...................
...................
OOOO...............
O...O..............
O..................
.O..O..............

:edge-repair spaceship A spaceship which has an edge that possesses no spark and yet is able to perturb things because of its ability to repair certain types of damage to itself. The most useful examples are the following two small p3 c/3 spaceships:


..................................O.....
........O.......................OOO.OOO.
.......OOOO....................OO......O
..O...O...OO.OO...........O...O..O...OO.
.OOOO.....O..OO..........OOOO...........
O...O.......O..O........O...O...........
.O.O..O..................O.O..O.........
.....O.......................O..........
These were found by David Bell in 1992, but the usefulness of the edge-repair property wasn't recognised until July 1997. The following diagram (showing an edge-repair spaceship deleting a Herschel) demonstrates the self-repairing action.

................O.......
O..............OOOO.....
O.O.......O...O...OO.OO.
OOO......OOOO.....O..OO.
..O.....O...O.......O..O
.........O.O..O.........
.............O..........
In October 2000, David Bell found that a T-tetromino component of a c/4 spaceship can also be self-repairing. Stephen Silver noticed that it could be used to delete beehives and, in November 2000, found the smallest known c/4 spaceship with this edge-repair component - in fact, two copies of the component:

.OO..........................
O..O.........................
.OO..........................
.............................
.......O.O...................
.......O.....................
.......O.O..O..O.............
..........O..................
...........O.OO.O............
............OOO.O............
...........O....O..O.OO......
........O...OO...O.OOOO......
........OO..O..O.OO....O....O
........O........OO....O..OOO
.............OO...OO...O..OO.
.OO..........................
O..O.........................
.OO..........................

:edge shooter A gun or signal circuit that fires its gliders (or whatever) right at the edge of the pattern, so that it can be used to fire them closely parallel to others. This is useful for constructing complex guns. Compare glider pusher, which can in fact be used for making edge shooters.

The following diagram shows a p46 edge shooter found by Paul Callahan in June 1994.


OO............OO..O....OO..OO.............
OO............O.OO......OO.OO.............
...............O......O.O.................
...............OOO....OO..................
..........................................
...............OOO....OO..................
...............O......O.O.................
OO............O.OO......OO................
OO............OO..O....OO.................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OOO...OOO..
..............................O...O.O...O.
.............................O...OO.OO...O
.............................O.OO.....OO.O
...............................O.......O..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OO.....OO..
...............................OO.....OO..

Stable edge shooters became possible with the development of Herschel circuitry. For example, NW31, BNE14T30, RNE-19T84, and the high-clearance Fx119 inserter are often used in shotguns for complex salvos. Composite edge-shooter circuits with arbitrarily high clearance can be constructed.

:edge spark A spark at the side of a spaceship that can be used to perturb things as the spaceship passes by.

:edge sparker A spaceship that produces one or more edge sparks.

:edgy In slow salvo terminology, an edgy glider construction recipe is one that places its final product at or very near the edge of its construction envelope. Similarly, an edgy factory will place its output object in an accessible location near the edge of its reaction envelope.

:egg = non-spark. This term is no longer in use.

:E-heptomino Name given by Conway to the following heptomino.


.OOO
OO..
.OO.

:elbow Depending on context, this term may refer to a signal elbow or a construction elbow. See also elbow ladder.

:elbow ladder Scot Ellison's name for the type of pattern he created in which one or more gliders shuttle back and forth (using the kickback reaction) deleting the output gliders from a pair of slide guns.

:elbow operation A recipe, usually a salvo of gliders travelling on one or more construction lanes, that collides with an elbow constellation and performs one of the standard transformations on it: push, pull, or fire for simple construction arms, along with possible construct, duplicate-elbow, or delete-elbow ops for more complicated systems. See construction elbow.

:electric fence (p5) A stabilization of ants. Dean Hickerson, February 1993.


..........O..................................................
.........O.O........................OO.......................
..O....OOO.O.....O...................O...O..O......O.....OO..
.O.O..O....OO...O.O..................O.OOO..OOO...O.O....O...
.O.O..O.OO.......O....................O...OO...O.O..O......O.
OO.OO.O.O.OOOOO.....O..................OO...O..O.O.OO.OO..OO.
.O.O..O...O..O..O.......OO...OO...OO....OO.OO..O.O..O.O.O....
.O..OO....OO......OOO.OO...OO...OO...OOO.....OOOO.OOO.O...OO.
..O..OOO..O..O.OOOO...OO...OO...OO...OOO.OO..O....O.O....O..O
...OO...O.O..O.....OO...OO...OO...OO......O............O...OO
.....OO.O.OO.O.OO..O......................O........OO.O......
.....O.OO.O..O.OO....O.................OO.O.O................
...........OO.......OO..................O..OO................
......................................O.O....................
......................................OO.....................

:elementary Not reducible to a combination of smaller parts. Elementary spaceships in particular are usually those found by search programs, and they can't be subdivided into smaller spaceships, tagalongs, and supporting reactions, as contrasted with engineered macro-spaceships.

:elementary conduit A conduit with no recognizable active signal stage besides its input and output. An early example still very commonly used is Buckingham's BFx59H, which transforms a B-heptomino into an inverted Herschel in 59 ticks. The BFx59H elementary conduit is a component in many of the original universal toolkit of Herschel conduits. An extension of the same naming convention is used for elementary conduits, with the first and last letters of the name specifying the input and output signal objects. As with Herschels, an arbitrary orientation and center point is chosen for each object. "Fx" means the signal moves forward and produces a mirror-image output. See Herschel conduit for further details.

Theoretically an elementary conduit may become a composite conduit, if another conduit can be found that shares the beginning or end of the conduit in question. In practice this happens only rarely, because many of the most likely branch points have already been identified: glider (G), LWSS (L) or MWSS (M), Herschel (H), B-heptomino (B), R-pentomino (R), pi-heptomino (P), queen bee shuttle (Q), century or bookend (C), dove (D), and wing (W). A Herschel descendant might qualify, due to the elementary conduit that can be seen in the p184 gun. However, there are very few simple conduits that produce Herschel descendants without Herschels, so in practice this is not a useful branch point.

:elevener (p1)


OO....
O.O...
..O...
..OOO.
.....O
....OO

:Elkies' p5 (p5) Found by Noam Elkies in 1997.


.O.......
O..OOO...
..O......
...O.O..O
..OO.OOOO
....O....
....O.O..
.....OO..

:emu Dave Buckingham's term for a Herschel loop that does not emit gliders (and so is "flightless"). All known Herschel loops of periods 52, 57, 58, 59 and 61 are emus. See also Quetzal.

:emulator Any one of three p4 oscillators that produce sparks similar to those produced by LWSS, MWSS and HWSS. See LW emulator, MW emulator and HW emulator. Larger emulators are also possible, but they require stabilizing objects to suppress their non-sparks and so are of little use. The emulators were discovered by Robert Wainwright in June 1980.

:engine The active portion of an object (usually a puffer or gun) which is considered to actually produce its output, and which generally permits no variation in how it works. The other parts of the object are just there to support the engine. For examples, see puffer train, Schick engine, blinker puffer, frothing puffer and line puffer.

:engineless A rake or puffer which does not contain a specific engine for its operation. Instead it depends on perturbations of gliders or other objects by passing spaceships. The period of such objects is often adjustable, and in some cases the speed as well. An early example was the creation of c/5 rakes in September 1997, using gliders circulating among a convoy of c/5 spaceships. More recently, the passing spaceships themselves are also constructed, as in the Caterloopillar.

:en retard (p3) Found by Dave Buckingham, August 1972.


.....O.....
....O.O....
OO.O.O.O.OO
.O.O...O.O.
O..O.O.O..O
.OO.....OO.
...OO.OO...
...O.O.O...
....O.O....
..O.O.O.O..
..OO...OO..

:Enterprise (c/4 diagonally, p4) Found by Dean Hickerson, March 1993.


.......OOO...........
.....O.OO............
....OOOO.............
...OO.....O..........
..OOO..O.O.O.........
.OO...O.O..O.........
.O.O.OOOOO...........
OO.O.O...O...........
O........OO..........
.OO..O...O.O.........
....OO..O.OO......O..
...........OO.....OOO
............O..OOO..O
............O..O..OO.
.............O.OO....
............OO.......
............OO.......
...........O.........
............O.O......
...........O..O......
.............O.......

:envelope See construction envelope, reaction envelope.

:Eureka (p30) A pre-pulsar shuttle found by Dave Buckingham in August 1980. A variant is obtained by shifting the top half two spaces to either side.


.O..............O.
O.O....O.......O.O
.O...OO.OO......O.
.......O..........
..................
..................
..................
.......O..........
.O...OO.OO......O.
O.O....O.......O.O
.O..............O.

:evolution The process or result of running one or more generations of an object. For example, a row of 10 cells evolves into a pentadecathlon.

:evolutionary factor For an unstable pattern, the time to stabilization divided by the initial population. For example, the R-pentomino has an evolutionary factor of 220.6, while bunnies has an evolutionary factor of 1925.777... The term is no longer in use.

:exhaust The debris or smoke left behind by a puffer, especially if the debris is dirty and takes many generations to settle. The term is not usually used for the objects created by clean puffers.

:exponential filter A toolkit developed by Gabriel Nivasch in 2006, enabling the construction of patterns with asymptotic population growth matching O((log log ... log(t))) for any number of nested log operations. See also quadratic filter, recursive filter.

:exposure = underpopulation

:extensible A pattern is said to be extensible if arbitrarily large patterns of the same type can be made by repeating parts of the original pattern in a regular way. For examples, see p6 shuttle, pentoad, pufferfish spaceship, snacker, wavestretcher, wicktrailer and branching spaceship.

:extra extra long = long^4

:extra long = long^3

:extremely impressive (p6) Found by Dave Buckingham, August 1976.


....OO......
...O.OOO....
...O....O...
OO.O...OO...
OO.O.....OO.
....OOOOO..O
..........OO
......O.....
.....O.O....
......O.....

:extruder See traffic lights extruder. A single-channel constructor arm has also been programmed to extrude a growing wick consisting of a chain of Snarks, again working from the stationary fencepost end of the wick with no need for a wickstretcher component.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_h.htm0000755000175000017500000016763513317135606014347 00000000000000 Life Lexicon (H)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:half-baked knightship ((6,3)c/2621440, p2621440) A self-supporting macro-spaceship with adjustable period but fixed direction, based on the half-bakery reaction. This was the first spaceship based on this reaction, constructed in December 2014 by Adam P. Goucher. It moves 6 cells horizontally and 3 cells vertically every 2621440+8N ticks, depending on the relative spacing of the two halves. It is one of the slowest known knightships, and the first one that was not a Geminoid. Chris Cain optimized the design a few days later to create the Parallel HBK.

The spaceship produces gliders from near-diagonal lines of half-bakeries, which collide with each other at 180 degrees. These collisions produce monochromatic salvos that gradually build and trigger seeds, which in turn eventually construct small synchronized salvos of gliders. These re-activate the lines of half-bakeries, thus closing the cycle and moving the entire spaceship obliquely by (6,3).

:half bakery = bi-loaf.

:half-bakery reaction The key reaction used in the half-baked knightship and Parallel HBK, where a half-bakery is moved by (6,3) when a glider collides with it, and the glider continues on a new lane. Ivan Fomichev noticed in May 2014 that pairs of these reactions at the correct relative spacing can create 90-degree output gliders:


.............................O.
............................O..
............................OOO
...............................
...............................
...............................
...............................
...............................
...............................
...............................
....................OO.........
...................O..O........
...................O.O.........
.................OO.O..........
........O.......O..O...........
......OO........O.O............
.......OO........O.............
...............................
....OO.........................
...O..O........................
...O.O.........................
.OO.O..........................
O..O...........................
O.O............................
.O.............................

:half diagonal A natural measurement of distance between parallel glider lanes, or between elbow locations in a universal construction arm elbow operation library. If two gliders are in the same phase and exactly lined up vertically or horizontally, N cells away from each other, then the two glider lanes are considered to be N half diagonals (hd) apart. Gliders that are an integer number of full diagonals apart must be the same colour, whereas integer half diagonals allow for both glider colours. See colour of a glider, linear propagator.

:half fleet = ship-tie

:Halfmax A pattern that acts as a spacefiller in half of the Life plane, found by Jason Summers in May 2005. It expands in three directions at c/2, producing a triangular region that grows to fill half the plane.

:hammer To hammer a LWSS, MWSS or HWSS is to smash things into the rear end of it in order to transform it into a different type of spaceship. A hammer is the object used to do the hammering. In the following example by Dieter Leithner an LWSS is hammered by two more LWSS to make it into an MWSS.


O..O................
....O...OO..........
O...O..OOO.....OOOO.
.OOOO..OO.O....O...O
........OOO....O....
.........O......O..O

:hammerhead A certain front end for c/2 spaceships. The central part of the hammerhead pattern is supported between two MWSS. The picture below shows a small example of a spaceship with a hammerhead front end (the front 9 columns).


................O..
.OO...........O...O
OO.OOO.......O.....
.OOOOO.......O....O
..OOOOO.....O.OOOO.
......OOO.O.OO.....
......OOO....O.....
......OOO.OOO......
..........OO.......
..........OO.......
......OOO.OOO......
......OOO....O.....
......OOO.O.OO.....
..OOOOO.....O.OOOO.
.OOOOO.......O....O
OO.OOO.......O.....
.OO...........O...O
................O..

:hand Any object used as a slow salvo target by a construction arm.

:handshake An old MIT name for lumps of muck, from the following form (2 generations on from the stairstep hexomino):


..OO.
.O.OO
OO.O.
.OO..

:harbor (p5) Found by Dave Buckingham in September 1978. The name is by Dean Hickerson.


.....OO...OO.....
.....O.O.O.O.....
......O...O......
.................
.....OO...OO.....
OO..O.O...O.O..OO
O.O.OO.....OO.O.O
.O.............O.
.................
.O.............O.
O.O.OO.....OO.O.O
OO..O.O...O.O..OO
.....OO...OO.....
.................
......O...O......
.....O.O.O.O.....
.....OO...OO.....

:harvester (c p4 fuse) Found by David Poyner, this was the first published example of a fuse. The name refers to the fact that it produces debris in the form of blocks which contain the same number of cells as the fuse has burnt up.


................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
OOOO..............
O.OO..............

:hashlife A Life algorithm by Bill Gosper that is designed to take advantage of the considerable amount of repetitive behaviour in many large patterns of interest. It provides a means of evolving repetitive patterns millions (or even billions or trillions) of generations further than normal Life algorithms can manage in a reasonable amount of time.

The hashlife algorithm is described by Gosper in his paper listed in the bibliography at the end of this lexicon. Roughly speaking, the idea is to store subpatterns in a hash table so that the results of their evolution do not need to be recomputed if they arise again at some other place or time in the evolution of the full pattern. This does, however, mean that complex patterns can require substantial amounts of memory.

Tomas Rokicki and Andrew Trevorrow implemented Hashlife into Golly in 2005. See also macrocell.

:hassle See hassler.

:hassler An oscillator that works by hassling (repeatedly moving or changing) some object. For some examples, see Jolson, baker's dozen, toad-flipper, toad-sucker and traffic circle. Also see p24 gun for a good use of a traffic light hassler.

:hat (p1) Found in 1971. See also twinhat and sesquihat.


..O..
.O.O.
.O.O.
OO.OO

:HBK = half-baked knightship

:hd Abbreviation for half diagonal. This metric is used primarily for relative measurements of glider lanes, often in relation to self-constructing circuitry; compare Gn.

:heat For an oscillator or spaceship, the average number of cells which change state in each generation. For example, the heat of a glider is 4, because 2 cells are born and 2 die every generation.

For a period n oscillator with an r-cell rotor the heat is at least 2r/n and no more than r(1-(n mod 2)/n). For n=2 and n=3 these bounds are equal.

:heavyweight emulator = HW emulator

:heavyweight spaceship = HWSS

:heavyweight volcano = HW volcano

:hebdarole (p7) Found by Noam Elkies, November 1997. Compare fumarole. The smaller version shown below was found soon after by Alan Hensel using a component found by Dave Buckingham in June 1977. The top ten rows can be stabilized by their mirror image (giving an inductor) and this was the original form found by Elkies.


...........OO...........
....OO...O....O...OO....
.O..O..O.O....O.O..O..O.
O.O.O.OO.O....O.OO.O.O.O
.O..O..O.O.OO.O.O..O..O.
....OO....O..O....OO....
...........OO...........
.......O..O..O..O.......
......O.OO....OO.O......
.......O........O.......
........................
...OO..............OO...
...O..OOOO....OOOO..O...
....O.O.O.O..O.O.O.O....
...OO.O...OOOO...O.OO...
.......OO......OO.......
.........OO..OO.........
.........O..O.O.........
..........OO............

:hectic (p30) Found by Robert Wainwright in September 1984.


......................OO...............
......................OO...............
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.........O..........OO...OO............
.......O.O............OOO..............
......O.O............O...O.............
OO...O..O.............O.O..............
OO....O.O..............O...............
.......O.O......O.O....................
.........O......OO.....................
.................O...O.................
.....................OO......O.........
....................O.O......O.O.......
...............O..............O.O....OO
..............O.O.............O..O...OO
.............O...O............O.O......
..............OOO............O.O.......
............OO...OO..........O.........
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
...............OO......................
...............OO......................

:Heisenburp device A pattern which can detect the passage of a glider without affecting the glider's path or timing. The first such device was constructed by David Bell in December 1992. The term, coined by Bill Gosper, refers to the fact that Heisenberg's Uncertainty Principle fails to apply in the Life universe. See also stable pseudo-Heisenburp and natural Heisenburp.

The following is an example of the kind of reaction used at the heart of a Heisenburp device. The glider at bottom right alters the reaction of the other two gliders without itself being affected in any way.


O.....O....
.OO...O.O..
OO....OO...
...........
...........
...........
.........OO
........O.O
..........O

:Heisenburp effect See Heisenburp device.

:helix A convoy of standard spaceships used in a Caterpillar to move some piece of debris at the speed of the Caterpillar. The following diagram illustrates the idea. The leading edge of this example helix, represented by the glider at the upper right in the pattern below, moves at a speed of 65c/213, or slightly faster than c/4.


...............................O.............
.................O............OOO............
................OOO....OOO....O.OO...........
.........OOO....O.OO...O..O....OOO..OOO......
.........O..O....OOO...O.......OO...O........
.........O.......OO....O...O.........O.......
.........O...O.........O...O.................
OOO......O...O.........O.....................
O..O.....O..............O.O..................
O.........O.O................................
O............................................
.O.O.........................................
.............................................
.............................................
..........O..................................
.........OOO.................................
.........O.OO................................
..........OOO................................
..........OO.................................
.............................................
.............................................
...............OOO...........................
...............O..O....O.....OOO.............
...............O......OOO....O..O....O.......
...............O.....OO.O....O......OOO......
....OOO.........O.O..OOO.....O.....OO.O......
....O..O.............OOO......O.O..OOO.......
....O................OOO...........OOO.......
....O.................OO...........OOO.......
.....O.O............................OO.......
...........................................O.
..........................................OOO
.........................................OO.O
.........................................OOO.
..........................................OO.
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.........................................O...
..............................OOO.......OOO..
................OOO.....O....O..O......OO.O..
..........O....O..O....OOO......O......OOO...
.........OOO......O....O.OO.....O......OOO...
.........O.OO.....O.....OOO..O.O........OO...
..........OOO..O.O......OOO..................
.O........OOO...........OOO..................
OOO.......OOO...........OO...................
O.OO......OO.................................
.OOO......................................O..
.OO......................................OOO.
........................................OO.O.
........................................OOO..
.........................................OO..
.........OOO.................................
........O..O.................................
...........O.................................
...........O.................................
........O.O..................................

Adjustable-speed helices can produce a very wide range of spaceship speeds; see Caterloopillar.

:heptaplet Any 7-cell polyplet.

:heptapole (p2) The barberpole of length 7.


OO........
O.O.......
..........
..O.O.....
..........
....O.O...
..........
......O.O.
.........O
........OO

:heptomino Any 7-cell polyomino. There are 108 such objects. Those with names in common use are the B-heptomino, the Herschel and the pi-heptomino.

:Herschel (stabilizes at time 128) The following pattern which occurs at generation 20 of the B-heptomino.


O..
O.O
OOO
..O

The name is commonly ascribed to the Herschel heptomino's similarity to a planetary symbol. William Herschel discovered Uranus in 1781. However, in point of fact a Herschel bears no particular resemblance to either of the symbols used for Uranus, but does closely resemble the symbol for Saturn. So the appropriate name might actually be "Huygens", but "Herschel" is now universally used by tradition.

Herschels are one of the most versatile types of signal in stable circuitry. R-pentominoes and B-heptominoes naturally evolve into Herschels, and converters have also been found that change pi-heptominoes and several other signal types into Herschels, and vice versa. See elementary conduit.

:Herschel circuit A series of Herschel conduits or other components, connected by placing them so that the output Herschels from early conduits become the input Herschels for later conduits. Often the initial component is a converter accepting some other signal type as input - usually a glider, in which case a syringe is most commonly used. The Silver reflector is a well-known early Spartan Herschel circuit from before the syringe was discovered, where the initial converter is a Callahan G-to-H.

Sometimes a direct connection between two conduits is not possible due to unwanted gliders that destroy required catalysts, or wanted gliders that are not able to escape. In this case, small "spacer" conduits such as F116, F117, Fx77, R64, L112, or L156 can be inserted between the other conduits to solve the problem.

Some converter or factory conduits do not produce a Herschel as output, instead generating other useful results such as gliders, boats or MWSSes. See Herschel-to-glider, demultiplexer, and H-to-MWSS respectively for examples of these. For those conduits which do produce an unwanted Herschel, an eater such as SW-2 can be added to delete it.

If the first and last conduits of a chain connect to each other in a loop then there is no need for a syringe to generate the first Herschel, or an eater to consume the last one. The circuit becomes a self-supporting Herschel loop. A loop is also formed by a syringe connected to a Herschel-to-glider converter, with the glider reflected back to the syringe's input with glider reflectors of the appropriate colour, usually Snarks. In either case, if the loop has a surplus glider output, it becomes a gun; if no output is available it is an emu.

:Herschel climber Any reburnable fuse reaction involving Herschels. May refer specifically to the (23,5)c/79 Herschel climber used in the waterbear, or one of several similar reactions with various velocities. See also Herschel-pair climber.

:Herschel component = Herschel conduit

:Herschel conduit A conduit that moves a Herschel from one place to another. See also Herschel loop.

Well over a hundred simple stable Herschel conduits are currently known. As of June 2018 the number is approximately 150, depending on the precise definition of "simple" - e.g., fitting inside a 100x100 bounding box, and producing output in no more than 300 ticks. In general a Herschel conduit can be called "simple" if its active reaction does not return to a Herschel stage except at its output. Compare elementary conduit, composite conduit. A description of common usage in complex circuitry, using syringes and Snarks to make compact connections, can be found in Herschel circuit.

The original universal set consisted of sixteen stable Herschel conduits, discovered between 1995 and 1998 by Dave Buckingham (DJB) and Paul Callahan (PBC). These are shown in the following table. In this table, the number in "name/steps" is the number of ticks needed to produce an output Herschel from the input Herschel. "m" tells how the Herschel is moved (R = turned right, L = turned left, B = turned back, F = unturned, f = flipped), and "dx" and "dy" give the displacement of the centre cell of the Herschel (assumed to start in the orientation shown above).

  ------------------------------------------
  name/steps  m      dx   dy     discovery
  ------------------------------------------
  R64         R      11    9   DJB, Sep 1995
  Fx77        Fflip  25   -8   DJB, Aug 1996
  L112        L      12  -33   DJB, Jul 1996
  F116        F      32    1   PBC, Feb 1997
  F117        F      40   -6   DJB, Jul 1996
  Bx125       Bflip  -9  -17   PBC, Nov 1998
  Fx119       Fflip  20   14   DJB, Sep 1996
  Fx153       Fflip  48   -4   PBC, Feb 1997
  L156        L      17  -41   DJB, Aug 1996
  Fx158       Fflip  27   -5   DJB, Jul 1996
  F166        F      49    3   PBC, May 1997
  Fx176       Fflip  45    0   PBC, Oct 1997
  R190        R      24   16   DJB, Jul 1996
  Lx200       Lflip  17  -40   PBC, Jun 1997
  Rx202       Rflip   7   32   DJB, May 1997
  Bx222       Bflip  -6  -16   PBC, Oct 1998
  ------------------------------------------

See also Herschel transceiver.

:Herschel descendant A common active pattern occurring at generation 22 of a Herschel's evolution:


OO..
O.OO
...O
.O.O
.OO.
There are other evolutionary paths leading to the same pattern, including the modification of a B-heptomino implied by generation 21 of a Herschel.

:Herschel great-grandparent A specific three-tick predecessor of a Herschel, commonly seen in Herschel conduit collections that contain dependent conduits. In some situations it is helpful to display the input reaction in this form instead of the standard Herschel form.


.OO....
OOO.OO.
.OO.OOO
OOO.OO.
OO.....

Dependent conduit inputs are catalysed by a transparent block before the Herschel's standard form can appear, and before the Herschel's first natural glider is produced. This means that these conduits will fail if an actual Herschel is placed in the "correct" input location for a dependent conduit. Refer to F166 or Lx200 to see the correct relative placement of the standard transparent block catalyst.

Almost all known Herschel conduits produce a Herschel great-grandparent near the end of their evolutionary sequence. In the original universal set of Herschel conduits, Fx158 is the only exception.

:Herschel loop A cyclic Herschel track. Although no loop of length less than 120 generations has been constructed it is possible to make oscillators of smaller periods by putting more than one Herschel in a higher-period track. In this way oscillators, and in most cases guns, of all periods from 54 onwards can now be constructed (although the p55 case is a bit strange, shooting itself with gliders in order to stabilize itself). A mechanism for a period-52 loop was found in April 2018, but it includes a stage where the signal is carried by a triplet of gliders so it may not be considered to be a pure Herschel loop. The missing period, 53, is a difficult case simply because 53 is prime and so no small sparkers or reflectors are available.

See Simkin glider gun and p256 gun for the smallest known Herschel loops. See also emu and omniperiodic.

:Herschel-pair climber Any reburnable fuse reaction involving pairs of Herschels. May refer specifically to the 31c/240 Herschel-pair climber used in the Centipede, or one of several similar reactions with various velocities. See also Herschel climber.

:Herschel receiver Any circuit that converts a tandem glider into a Herschel signal. The following diagram shows a pattern found by Paul Callahan in 1996, as part of the first stable glider reflector. Used as a receiver, it converts two parallel input gliders (with path separations of 2, 5, or 6) to an R-pentomino. The signal is then converted to a Herschel by one of several known mechanisms, the first of which was found by Dave Buckingham way back in 1972. The second is elementary conduit RF48H, found by Stephen Silver in October 1997. The receiver version shown below uses Buckingham's R-to-Herschel converter, which is made up of elementary conduit RF28B followed by BFx59H.


...............................................O.O
......................................OO.......OO.
......................................OO........O.
...OO.............................................
...O..............................................
....O.............................................
...OO.............................................
............OO....................................
...........O.O....................................
............O..............................O......
......................................OO...O.O....
.....................................O..O..OO.....
OO....................................OO..........
OO.............................OO.................
...............................OO.................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
............................................OO....
............................................OO....
........................................OO........
........................................O.O.......
..........................................O.......
..........................................OO......
.............................OO...................
.............................OO...................
..................................................
..................................................
...........................OO.....................
...........................OO.....................

:Herschel stopper A method of cleanly suppressing a Herschel signal with an asynchronous boat-bit, discovered by Dean Hickerson. Here a ghost Herschel marks the location of the output signal, in cases where the boat-bit is not present. Other boat-bit locations that allow for clean suppression of a Herschel are also known.


....................................OO
.........................O..........O.
.........................OOO.........O
............................O.......OO
...........................OO.........
......................................
........O.............................
........OOO...........................
...........O..........................
..........OO...........OO...........O.
.......................OO.........OOO.
..................................O...
..................................O...
......................................
..........................O...........
..........................OO..........
.........O...............O.O..........
.........O.O..........................
.........OOO..........................
...........O.......................OO.
....................................O.
.................................OOO..
.................................O....
......................................
..OO..................................
...O..................................
OOO....................OO.............
O......................O..............
........................OOO...........
..........................O...........

This term is also sometimes used to refer to any mechanism that cleanly suppresses a Herschel. These usually allow the Herschel's first natural glider to escape, so they are more commonly classified as converters. See SW-2.

:Herschel-to-glider The largest category of elementary conduit. Gliders are very common and self-supporting, so it's much easier to find these than any other type of output signal. A large collection of these H-to-G converters has been compiled, with many different output lanes and timings. These can be used to synchronize multiple signals to produce gun patterns or complex logic circuitry. See NW31T120 for an example.

:Herschel track A track for Herschels. An equivalent term is Herschel circuit. See also B track.

:Herschel transceiver An adjustable Herschel conduit made up of a Herschel transmitter and a Herschel receiver. The intermediate stage consists of a tandem glider - two gliders on parallel lanes - so that the transmitter and receiver can be separated by any required distance. The conduit may be stable, or may contain low-period oscillators.

:Herschel transmitter Any Herschel-to-two-glider converter that produces a tandem glider that can be used as input to a Herschel receiver. If the gliders are far enough apart, and if one of the gliders is used only for cleanup, then the transmitter is ambidextrous: with a small modification to the receiver, a suitably oriented mirror image of the receiver will also work.

The following diagram shows a stable Herschel transmitter found by Paul Callahan in May 1997:


......OO...........
.....O.O...........
...OOO.............
..O...O......O.....
..OO.OO......OOO...
.............O.O...
...............O...
...................
...................
OO.O...............
O.OO...............
...................
...................
...................
...............OO..
...............O...
................OOO
..................O
Examples of small reversible p6 and p7 transmitters are also known, and more recently several alternate Herschel transceivers have been found with different lane spacing, e.g., 0, 2, 4, 6, and 13.

:Hertz oscillator (p8) Compare negentropy, and also cauldron. Found by Conway's group in 1970.


...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...O...O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:hexadecimal = beehive and dock

:hexaplet Any 6-cell polyplet.

:hexapole (p2) The barberpole of length 6.


OO.......
O.O......
.........
..O.O....
.........
....O.O..
.........
......O.O
.......OO

:hexomino Any 6-cell polyomino. There are 35 such objects. For some examples see century, stairstep hexomino, table, toad and Z-hexomino.

:HF = honey farm

:HFx58B A common Herschel to B-heptomino converter, used as the first stage of F117 and many other Herschel conduits. There are two variants, both shown in the pattern below.


..........O..............................O..........
..........OOO..........................OOO..........
.............O........................O.............
OO..........OO........................OO..........OO
.O................................................O.
.O.O............................................O.O.
..OO............................................OO..
.....................O........O.....................
.....................OO......OO.....................
......................OO....OO......................
......................O......O......................
.....................O........O.....................
....................................................
..O..............................................O..
..O.O..........................................O.O..
..OOO..........................................OOO..
....O...........OO.................OO..........O....
................O..................OO...............
.................OOO...................OO...........
...................O...................O............
........................................OOO.........
..........................................O.........

:H-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the I-heptomino.


OO..
.O..
.OOO
..O.

:high-bandwidth telegraph (p960, p30 circuitry) A variant of the telegraph constructed by Louis-François Handfield in February 2017, using periodic components to achieve a transmission rate of one bit per 192 ticks. The same ten signals are sent as in the original telegraph and the p1 telegraph, but information is encoded more efficiently in the timing of those signals. Specifically, the new transmitter sends five bits every 960 ticks by adjusting the relative timings inside each of the five mirror-image paired subunits of the composite signal in the beehive-chain lightspeed wire fuse.

:high-clearance See clearance.

:highway robber Any mechanism that can retrieve a signal from a spaceship lane while allowing spaceships on nearby lanes to pass by unaffected. In practice the spaceship is generally a glider. The signal is removed from the lane, an output signal is generated elsewhere, and the highway robber returns to its original state. A competent highway robber does not affect gliders even on the lane adjacent to the affected glider stream, except during its recovery period.

A perfect highway robber doesn't affect later gliders even in the lane to which it is attached, even during its recovery period. Below is a near-perfect highway robber "bait" that requires three synchronized signals to rebuild (the Herschel, B-heptomino, and glider.) The glider at the top right passes by unharmed, but another glider following on the same lane 200 ticks later will be cleanly reflected to a new path, and another glider following that one will also pass by unharmed. The only imperfection is a few ticks at the very end of the reconstruction, as the beehive is being rebuilt:


......................O...........O.........
......................OOO.......O.O.........
.........OO...OO.........O.......OO.........
.........OO...OO........OO..................
............................................
............................................
..OO........................................
...O........................................
...O.O......................................
....OO......................................
............................................
............................................
............................................
............................................
............................................
............................................
.......OO...................................
........O...................................
.....OOO....................................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
....................OO......................
....................OO......................
............OO..............................
.............O..............................
O.........OOO...............................
OOO.......O.................................
...O........................................
..OO........................................
............................................
............................................
............................................
............................................
...........O...........OO...............OO..
.........OOO..........O.O...............OO..
.........O.O............O...................
.........O.....................OO.O.......O.
...............................O.OO......OOO
........................................OO.O
............................................
.............................OO.............
.............................OO.............
.......................OO...................
.......................OO...................
............................................
............................................
.........................OO.................
..................OO.....OO.................
..................OO........................

:hive = beehive

:hivenudger (c/2 orthogonally, p4) A spaceship found by Hartmut Holzwart in July 1992. (The name is due to Bill Gosper.) It consists of a pre-beehive escorted by four LWSS. In fact any LWSS can be replaced by a MWSS or an HWSS, so that there are 45 different single-hive hivenudgers.


OOOO.....O..O
O...O...O....
O.......O...O
.O..O...OOOO.
.............
.....OO......
.....OO......
.....OO......
.............
.O..O...OOOO.
O.......O...O
O...O...O....
OOOO.....O..O
Wider versions can be made by stabilizing the front of the extended "pre-beehive", as in the line puffer shown below.

.........O.O..................
........O..O..................
.......OO.....................
......O...O...................
.....OOO.O....................
..OO..........................
.O...OOOOO.......OOOO.....O..O
O...O............O...O...O....
O.....OO.........O.......O...O
OOO...OOOO........O..O...OOOO.
.O.......O....................
.OO...................OO......
.O.O..................OO......
.OO..OO.O........O.O..OO......
..O.OOO.O...O.OOOO.O..OO......
.........OO.O.OO..O...OO...OOO
....OOOOOO.OO...OOOO..OO...OOO
.....O....OOO......O..OO...OOO
......OO.....OO..OO...OO......
.......O..O.....OOOO..OO......
........O.O.OO.....O..OO......
......................OO......
..............................
..................O..O...OOOO.
.................O.......O...O
.................O...O...O....
.................OOOO.....O..O

:honey bit A block and pond constellation used in the OTCA metapixel by Brice Due in 2006, to store and retrieve a bit of data - specifically, the presence or absence of a neighbor metacell. The "0" state of the honey bit memory unit is a simple beehive, which is also the source of the name.

An input glider collides with the beehive to convert it into the honey bit constellation, which can be thought of as a value of "1" stored in the memory unit. A passing LWSS can then test for the presence of the pond. If a collision occurs, the LWSS and the honey bit constellation are mutually annihilated, leaving just the original beehive. Below is the honeybit constellation with the two reactions occurring in the opposite order - test, then reset.


.O...............
..O..............
OOO..............
.................
............OOOO.
............O...O
............O....
.............O..O
.................
..........OO.....
.........O..O....
.........O..O....
..........OO.....
.................
.................
.........OO......
.........OO......
If the pond is not present, the LWSS passes by the beehive without affecting it. Thus a test input has an output for the "0" case, but not for the "1" case. For an alternative memory-unit mechanism with both "0" and "1" outputs, see demultiplexer.

The honey bit is also an interesting eater for the HWSS as shown below. An HWSS colliding with the pond happens to create the exact same reset glider used in the above memory unit.


..OO...........
O....O......OO.
......O....O..O
O.....O....O..O
.OOOOOO.....OO.
...............
...............
...........OO..
...........OO..

:honeycomb (p1)


..OO..
.O..O.
O.OO.O
.O..O.
..OO..

:honey farm (p1) A common formation of four beehives.


......O......
.....O.O.....
.....O.O.....
......O......
.............
.OO.......OO.
O..O.....O..O
.OO.......OO.
.............
......O......
.....O.O.....
.....O.O.....
......O......

:hook Another term for a bookend. It is also used for other hook-shaped things, such as occur in the eater1 and the hook with tail, for example.

:hook with tail (p1) For a long time this was the smallest still life without a well-established name. It is now a vital component of the smallest known HWSS gun, where it acts as a rock.


O.O..
OO.O.
...O.
...OO

:houndstooth agar The p2 agar that results from tiling the plane with the following pattern.


.OOO
.O..
..O.
OOO.

:house The following induction coil. It is generation 3 of the pi-heptomino. See spark coil and dead spark coil.


.OOO.
O...O
OO.OO

:H-to-G A Herschel-to-glider converter.

:H-to-MWSS A Spartan converter found by Tanner Jacobi in October 2015, which converts an input Herschel to a middleweight spaceship. The key discovery was a very small but slightly dirty H-to-MWSS conduit, where a Herschel is catalyzed to produce an MWSS but also leaves behind a beehive. Prefixing two R64 conduits to this produces a composite converter that successfully deletes the beehive in advance, using the input Herschel's first natural glider.


.............................OO................
.............................OO.....OO.........
....................................OO.........
...............................................
...............................................
...............OO.................OO...........
................O.................OO...........
................O.O.....................OO.....
.................OO.....................OO.....
...............................................
...............................................
...............................................
....................O..........................
....................O.O........................
....................OOO........................
......................O........................
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
...OO...........................OOO............
..O.O...........................O..............
...O...........................OO..............
...............................................
...............................................
...............................................
...............................................
...............................................
...............................................
.............................................OO
.O...........................................OO
O.O................OO.O........................
O.O................OO.OOO......................
.O......................O......................
........................O...............OO.....
........................................OO.....
....O.O.....................................OO.
.......O....................................OO.
...O...O.......................................
.......O.......................................
....O..O..............................OO.......
.....OOO..............................OO.......
There are many other ways to remove the beehive using a spare glider or additional conduits, but they are generally less compact than this.

:hustler (p3) Found by Robert Wainwright, June 1971.


.....OO....
.....OO....
...........
...OOOO....
O.O....O...
OO.O...O...
...O...O.OO
...O....O.O
....OOOO...
...........
....OO.....
....OO.....

:hustler II (p4)


....O...........
....OOO.........
.......O........
......O..OO.....
O.OO.O.OO..O....
OO.O.O.....O....
.....O....O.....
....O.....O.O.OO
....O..OO.O.OO.O
.....OO..O......
........O.......
.........OOO....
...........O....

:HW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator.


.......OO.......
..OO.O....O.OO..
..O..........O..
...OO......OO...
OOO..OOOOOO..OOO
O..O........O..O
.OO..........OO.

:HWSS (c/2 orthogonally, p4) A heavyweight spaceship, the fourth most common spaceship. Found by Conway in 1970 by modifying a LWSS. See also MWSS.


...OO..
.O....O
O......
O.....O
OOOOOO.

The HWSS possesses both a tail spark and a domino belly spark which can easily perturb other objects as it passes by. The spaceship can also perturb some objects in additional ways. For examples, see puffer and glider turner.

Dave Buckingham found that the HWSS can be synthesized using three gliders as shown below:


........O.O
........OO.
.........O.
...........
OOO........
..O........
.O...OOO...
.......O...
......O....

:HWSS emulator = HW emulator

:HW volcano (p5) A p5 domino sparker, found by Dean Hickerson in February 1995.


.........O..........................
........O.O.........................
......OOO.O.........................
.....O....OO.O......................
.....O.OO...OO......OO..............
....OO.O.OO.........O.O.............
.........O.OOOOO......O..O.OO.......
..O.OO.OO.O.....O....OO.O.OO.O......
.....OO.....OOOO........O....O......
O...O.O..O...O.O....OO.O.OOOO.OO....
O...O.O..OO.O.OO.OO....O.O....O.O...
.....OO...OOO.OO.O.OOO.O..OOO...O...
..O.OO.OO.OO.............O.O..O.O.OO
...........O......O.O.O.O..OO.O.O.O.
....OO.O.O.OO......OO.O.O.O...O.O.O.
.....O.OO.O..O.......O.OO..OOOO.OO..
.....O....O.O........O...OO.........
....OO....OO........OO...O..O.......
...........................OO.......
At least four progressively smaller forms of this sparker have been found, including a 25-cell-wide version found by David Eppstein in 2003, and a vertically narrower 28-cell-wide version by Karel Suhajda in 2004. Scot Ellison's 17-cell-wide version is shown in the zweiback entry.

:hybrid grey ship A grey ship containing more than one type of region of density 1/2, usually a combination of a with-the-grain grey ship and an against-the-grain grey ship.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_i.htm0000755000175000017500000004433613317135606014340 00000000000000 Life Lexicon (I)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:I-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the H-heptomino.


OO..
.O..
.OO.
..OO

:IMG = intermitting glider gun

:Immigration A form of colourised Life in which there are two types of ON cell, a newly-born cell taking the type of the majority of its three parent cells and surviving cells remaining of the same type as in the previous generation.

:independent conduit A Herschel conduit in which the input Herschel produces its first natural glider. Compare dependent conduit.

:induction coil Any object used to stabilize an edge (or edges) without touching. The tubs used in the Gray counter are examples, as are the blocks and snakes used in the Hertz oscillator and the heptomino at the bottom of the mathematician.

:inductor Any oscillator with a row of dead cells down the middle and whose two halves are mirror images of one another, both halves being required for the oscillator to work. The classic examples are the pulsar and the tumbler. If still lifes are considered as p1 oscillators then there are numerous simple examples that include this kind of central gutter, such as table on table, dead spark coil and cis-mirrored R-bee. Some spaceships, such as the brain, the snail and the spider, use the same principle.

:infinite glider hotel A pattern by David Bell, named after Hilbert's "infinite hotel" scenario in which a hotel with an infinite number of rooms has room for more guests even if it is already full, simply by shuffling the old guests around.

In this pattern, two pairs of Corderships moving at c/12 are pulling apart such that there is an ever-lengthening glider track between them. Every 128 generations another glider is injected into the glider track (see LWSS-glider bounce), joining the gliders already circulating there. The number of gliders in the track therefore increases without limit.

The tricky part of this construction is that even though all the previously injected gliders are repeatedly flying through the injection point, that point is guaranteed to be empty when it is time for the next glider to be injected.

:infinite growth Growth of a finite pattern such that the population tends to infinity, or at least is unbounded. Sometimes the term is used for growth of something other than population (for example, length), but here we will only consider infinite population growth. The first known pattern with infinite growth in this sense was the Gosper glider gun, created in a response to a $50 prize challenge by John Conway. Martin Gardner's October 1970 article described the challenge as "Conway conjectures that no pattern can grow without limit", but Conway later explained that he had always expected that this would be disproved. The original purpose in investigating CA rules including B3/S23 was to show that a very simple two-state rule could support a universal computer and/or universal constructor. If all finite patterns could be proven to be bounded, neither of these would be possible.

An interesting question is: What is the minimum population of a pattern that exhibits infinite growth? In 1971 Charles Corderman found that a switch engine could be stabilized by a pre-block in a number of different ways, giving 11-cell patterns with infinite growth. This record stood for more than quarter of a century until Paul Callahan found, in November 1997, two 10-cell patterns with infinite growth. The following month he found the one shown below, which is much neater, being a single cluster. This produces a stabilized switch engine of the block-laying type.


......O.
....O.OO
....O.O.
....O...
..O.....
O.O.....
Nick Gotts and Paul Callahan showed in October 1997 that there is no infinite growth pattern with fewer than 10 cells, so that question has now been answered.

In October 2014, Michael Simkin discovered a three-glider collision that produces a glider-producing stabilized switch engine and thus produces infinite growth from the smallest possible number of gliders (since all 71 2-glider collisions have a finite limit population).

Also of interest is the following pattern (again found by Callahan), which is the only 5x5 pattern with infinite growth. This too emits a block-laying switch engine.


OOO.O
O....
...OO
.OO.O
O.O.O

Following a conjecture of Nick Gotts, Stephen Silver produced, in May 1998, a pattern of width 1 which exhibits infinite growth. This pattern was very large (12470x1 in the first version, reduced to 5447x1 the following day). In October 1998 Paul Callahan did an exhaustive search, finding the smallest example, the 39x1 pattern shown below. This produces two block-laying switch engines, stability being achieved at generation 1483.


OOOOOOOO.OOOOO...OOO......OOOOOOO.OOOOO
Larger patterns have since been constructed that display quadratic growth.

Although the simplest infinite growth patterns grow at a rate that is (asymptotically) linear, many other types of growth rate are possible, quadratic growth (see also breeder) being the fastest. Dean Hickerson has found many patterns with unusual growth rates, such as sawtooths and a caber tosser. Another pattern with superlinear but non-quadratic growth is Gotts dots.

See also Fermat prime calculator.

:initials = monogram

:inject A reaction in which a hole in a regular spaceship stream is filled partially or fully by adding a new spaceship of the same type without affecting the existing spaceships in the stream. Depending on the period of the stream, different mechanisms can be used. For adding a spaceship to an existing multi-lane convoy, see inserter.

For large period glider streams, simple reactions such as LWSS-LWSS bounce and LWSS-glider bounce suffice. If Herschel technology is used, a large number of edge shooters and transparent conduits are known. Simple examples include the NW31 Herschel-to-glider converter and the Fx119 inserter.

Shown below is an injector found by Dave Buckingham that can fill a hole in a p15 glider stream:


..O.O..................
...OO..................
...O.................O.
....................O..
....................OOO
.......................
.......................
..........O............
...........OO..........
..........OO...........
.......................
.OO....................
O.O..OO................
..O.OO.................
......O................
.......................
.......................
.......................
.....OO................
......OO...............
.....O.................
For very low-period glider streams, a GIG is a much more efficient insertion method, in the sense that fewer synchronized signals are needed. However, it has been shown that colliding gliders can complete an insertion even into a single-glider gap in a period-14 stream.

:inline inverter The following reaction in which a p30 gun can be used to invert the presence or absence of gliders in a p30 stream, with the output glider stream being in the same direction as the input glider stream.


................O...................
.................O..................
...............OOO..................
....................................
.......................O.O..........
.....................O...O..........
.............O.......O..............
............OOOO....O....O........OO
...........OO.O.O....O............OO
OO........OOO.O..O...O...O..........
OO.........OO.O.O......O.O..........
............OOOO....................
.............O......................

:inserter A mechanism that can add another spaceship into a stream or convoy of other spaceships without affecting the existing spaceships. For examples see Fx119 inserter, tee, GIG, clock insertion and inject.

:integral = integral sign

:integral sign (p1)


...OO
..O.O
..O..
O.O..
OO...

:intentionless = elevener

:interchange (p2) A common formation of six blinkers.


..OOO....OOO..
..............
O............O
O............O
O............O
..............
..OOO....OOO..

:intermediate target A temporary product of a partial slow salvo, elbow operation, or glider synthesis. An intermediate target is a useful step toward a desired outcome, but will not appear in the final construction.

:intermittent stream A stream of spaceships which is based on a periodic stream, but which can contain holes where some of the spaceships are not present. There is a base period for the intermittent stream such that if a spaceship arrives at a specific location, then it always does so at a generation which is a multiple of the base period. For example, the output from a period 30 glider gun where every third glider is deleted is an intermittent stream. A pseudo-random glider generator can produce a complicated intermittent stream with no obvious pattern.

Intermittent streams can be used to transmit signals, where holes in the stream can also convey information. For example, the stream can be processed by an inverter having the same period.

:intermitting glider gun Despite the name, an intermitting glider gun (IMG) is more often an oscillator than a gun. There are two basic types. A type 1 IMG consists of two guns firing at one another in such a way that each gun is temporarily disabled on being hit by a glider from the other gun. A type 2 IMG consists of a single gun firing at a 180-degree glider reflector in such a way that returning gliders temporarily disable the gun.

Both types of IMG can be used to make glider guns of periods that are multiples of the base period. This is done by firing another gun across the two-way intermittent stream of gliders in the IMG in such a way that gliders only occasionally escape.

:inverter A device which can be used to invert the presence or absence of spaceships in an intermittent stream of spaceships. The device must be a gun whose period matches the base period of the stream, since if there are no input spaceships then the device must produce spaceships as the result of the inversion. Typically the spaceships are gliders, and the inverter is made from a glider gun. Inverters provide a way to produce a NOT logic operation on a stream.

There are several ways to produce an inverter. The simplest method is to simply hit the output of a gun with the input stream to delete its spaceships, producing an output stream that is always turned 90 degrees from the input stream. An example is the northernmost p30 gun in the glider duplicator example pattern. For one way to produce an inverted output stream which is not turned, see inline inverter.

:inverting reflector See inverter.

:island The individual polyplets of which a stable pattern consists are sometimes called islands. So, for example, a boat has only one island, while an aircraft carrier has two, a honey farm has four and the standard form of the eater3 has five.

:Iwona (stabilizes at time 28786) The following methuselah found by Andrzej Okrasinski in August 2004.


..............OOO...
....................
....................
....................
....................
....................
..O.................
...OO...............
...O..............O.
..................O.
..................O.
...................O
..................OO
.......OO...........
........O...........
....................
....................
....................
....................
OO..................
.O..................
It has a final population of 3091 and covers an area of 413 by 364 cells, not counting the 47 gliders it produces. Its ash consists of typical stable objects and blinkers, along with the relatively rare paperclip.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_v.htm0000755000175000017500000002576113171233731014352 00000000000000 Life Lexicon (V)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:vacuum Empty space. That is, space containing only dead cells.

:Venetian blinds The p2 agar obtained by using the pattern O..O to tile the plane. Period 2 stabilizations of finite patches of this agar are known.


..................O.OO.OO......O......OO.OO.O..................
..................OO.O.O...OO.O.O.OO...O.O.OO..................
.....................O...O..O.O.O.O..O...O.....................
.....................O..OOO...O.O...OOO..O.....................
....................OO.O.....O.O.O.....O.OO....................
.......................O..OO.O...O.OO..O.......................
....................OO..OOO..OO.OO..OOO..OO....................
................OO.O.OO...OO.OOOOO.OO...OO.O.OO................
................OO.OO....O...........O....OO.OO................
...................O..OO.O.O.......O.O.OO..O...................
................OO..OOO..OO.OOOOOOO.OO..OOO..OO................
........OO..OO.O.OO...OO.OOOOOOOOOOOOO.OO...OO.O.OO..OO........
.....O..O...OO.OO....O...................O....OO.OO...O..O.....
....O.O.O......O..OO.O.O...............O.O.OO..O......O.O.O....
...O..O.OO..OO..OOO..OO.OOOOOOOOOOOOOOO.OO..OOO..OO..OO.O..O...
...O.OO....O.OO...OO.OOOOOOOOOOOOOOOOOOOOO.OO...OO.O....OO.O...
OO.OO...OO.OO....O...........................O....OO.OO...OO.OO
O.O...OO.O.O..OO.O.O.......................O.O.OO..O.O.OO...O.O
..O.OO.O.O..OOO..OO.OOOOOOOOOOOOOOOOOOOOOOO.OO..OOO..O.O.OO.O..
..O.O..OOOO...OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO...OOOO..O.O..
.OO..O.......O...................................O.......O..OO.
O..O.O....OO.O.O...............................O.O.OO....O.O..O
.O.O..OOOOO..OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO..OOOOO..O.O.
..O.OOO..OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOO..OOO.O..
....O.O..O...........................................O..O.O....
..O.O.O..O.O.......................................O.O..O.O.O..
..OO...O.OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO.O...OO..
.........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........
...............................................................
...............................................................
.........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.........
..OO...O.OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO.O...OO..
..O.O.O..O.O.......................................O.O..O.O.O..
....O.O..O...........................................O..O.O....
..O.OOO..OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OOO..OOO.O..
.O.O..OOOOO..OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO..OOOOO..O.O.
O..O.O....OO.O.O...............................O.O.OO....O.O..O
.OO..O.......O...................................O.......O..OO.
..O.O..OOOO...OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.OO...OOOO..O.O..
..O.OO.O.O..OOO..OO.OOOOOOOOOOOOOOOOOOOOOOO.OO..OOO..O.O.OO.O..
O.O...OO.O.O..OO.O.O.......................O.O.OO..O.O.OO...O.O
OO.OO...OO.OO....O...........................O....OO.OO...OO.OO
...O.OO....O.OO...OO.OOOOOOOOOOOOOOOOOOOOO.OO...OO.O....OO.O...
...O..O.OO..OO..OOO..OO.OOOOOOOOOOOOOOO.OO..OOO..OO..OO.O..O...
....O.O.O......O..OO.O.O...............O.O.OO..O......O.O.O....
.....O..O...OO.OO....O...................O....OO.OO...O..O.....
........OO..OO.O.OO...OO.OOOOOOOOOOOOO.OO...OO.O.OO..OO........
................OO..OOO..OO.OOOOOOO.OO..OOO..OO................
...................O..OO.O.O.......O.O.OO..O...................
................OO.OO....O...........O....OO.OO................
................OO.O.OO...OO.OOOOO.OO...OO.O.OO................
....................OO..OOO..OO.OO..OOO..OO....................
.......................O..OO.O...O.OO..O.......................
....................OO.O.....O.O.O.....O.OO....................
.....................O..OOO...O.O...OOO..O.....................
.....................O...O..O.O.O.O..O...O.....................
..................OO.O.O...OO.O.O.OO...O.O.OO..................
..................O.OO.OO......O......OO.OO.O..................

:very long = long long

:very long house The following induction coil.


.OOOOO.
O..O..O
OO...OO

:volatility The volatility of an oscillator is the size (in cells) of its rotor divided by the sum of the sizes of its rotor and its stator. In other words, it is the proportion of cells involved in the oscillator which actually oscillate. For many periods there are known oscillators with volatility 1, see for example Achim's p16, figure-8, Kok's galaxy, mazing, pentadecathlon, phoenix, relay, smiley and tumbler. Such an oscillator of period 3 was found in August 2012 by Jason Summers.


.........O.O.....O...O.....O.O.
........O...O....O...O....O...O
.........O.......O...O.......O.
...........OO.OO.O...O.OO.OO...
.................O...O.........
..........O...O.........O...O..
........O.O.................O.O
...............................
........O...................O..
.......OO..................OO..
.......O...................O...
.....O..O................O..O..
O....O..............O....O.....
OOOO.OO.OOO.........OOOO.OO.OOO
OOO.OO.OOOO.........OOO.OO.OOOO
.....O....O..............O....O
..O..O................O..O.....
...O...................O.......
..OO..................OO.......
..O...................O........
...............................
O.O.................O.O........
..O...O.........O...O..........
.........O...O.................
...OO.OO.O...O.OO.OO...........
.O.......O...O.......O.........
O...O....O...O....O...O........
.O.O.....O...O.....O.O.........

The smallest period for which the existence of such statorless oscillators is undecided is 7. There are oscillators with volatility arbitrarily close to 1 for all but finitely many periods, because of the possibility of feeding the gliders from a true period n gun into an eater.

The term "volatility" is due to Robert Wainwright. See also strict volatility.

:volcano Any of a number of p5 oscillators which produce sparks. See lightweight volcano, middleweight volcano and heavyweight volcano.

:von Neumann neighbourhood The set of all cells that are orthogonally adjacent to a cell or group of cells. The von Neumann neighbourhood of a cell can be thought of as the points at a Manhattan distance of 1 from that cell. Compare Moore neighbourhood.

Cell neighbourhoods can also be defined with a higher range. The von Neumann neighbourhood of range n can be defined recursively as the von Neumann neighbourhood of the von Neumann neighbourhood of range n-1. For example, the von Neumann neighbourhood of range 2 is the set of all cells that are orthogonally adjacent to the range-1 von Neumann neighbourhood.

:V-pentomino Conway's name for the following pentomino, a loaf predecessor.


O..
O..
OOO

:V spark A common three-bit polyplet spark, produced most notably by the pentadecathlon.


O.O
.O.
The spark can convert a pre-block or block into a glider as shown here:

.O...
OO..O
...O.
....O
Also see PD-pair reflector.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/Lexicon/lex_z.htm0000755000175000017500000001424013230774246014353 00000000000000 Life Lexicon (Z)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:zebra stripes (p1) A stable agar consisting of alternating bands of live and dead cells. Known spacefillers and many gray ships create patches of this agar. It is also the medium through which with the grain and against the grain negative spaceships travel. Many simple stabilizations of the boundaries of finite regions of this agar are known, as shown below.


..OO.......................
..O........................
....O..O..O..O..O..O..O....
...OOOOOOOOOOOOOOOOOOOO....
..O........................
...OOOOOOOOOOOOOOOOOO......
.....................O.....
.OOOOOOOOOOOOOOOOOOOO......
O..........................
.OOOOOOOOOOOOOOOOOOOOOO....
.......................O.OO
.OOOOOOOOOOOOOOOOOOOO..O.OO
O....................O.O...
.OOOOOOOOOOOOOOOOOOOO..O...
.......................OO..
...OOOOOOOOOOOOOOOOOO......
..O..................O.....
...OOOOOOOOOOOOOOOOOO......
...........................
.....OO..OO.O.OOOO.OO......
.....OO..O.OO.O..O.OO......

:Z-hexomino The following hexomino. The Z-hexomino features in the pentoad, and also in Achim's p144.


OO.
.O.
.O.
.OO

:zone of influence The set of cells on which a chosen cell or pattern can potentially exert an influence in a given number of generations N. If N is not specified it is generally taken to be one, in which case the zone of influence simply coincides with the Moore neighbourhood of the cell or pattern.

The set for N generations consists of all the cells to which at least N paths of length N can be traced from the cell(s) in question. Contrast this with the range-N Moore neighbourhood, which consists of all cells to which at least one path of length n can be traced.

:Z-pentomino Conway's name for the following pentomino, which rapidly dies.


OO.
.O.
.OO

:zweiback (p30) An oscillator in which two HW volcanoes hassle a loaf. This was found by Mark Niemiec in February 1995. A smaller version using Scot Ellison's reduced HW volcano is shown below.


..........O..............................
........OOOOO.................O..........
.......O.....O..............OOOOO........
.......O..OO.O.............O.....O.......
...O.OOO.O.O.OO............O.OO..O.......
...OO....O................OO.O.O.OOO.O...
......OO.OO....................O....OO...
.OOOOO.O.O..O.................OO.OO......
O......O...O.O..............O..O.O.OOOOO.
OO..OOOOO.OO.O.............O.O...O......O
............OO.............O.OO.OOOOO..OO
.....OO....OOO.............OO............
.....OO....OOO.....OO......OOO....OO.....
............OO....O..O.....OOO....OO.....
OO..OOOOO.OO.O.....O.O.....OO............
O......O...O.O......O......O.OO.OOOOO..OO
.OOOOO.O.O..O..............O.O...O......O
......OO.OO.................O..O.O.OOOOO.
...OO....O....................OO.OO......
...O.OOO.O.O.OO................O....OO...
.......O..OO.O............OO.O.O.OOO.O...
.......O.....O.............O.OO..O.......
........OOOOO..............O.....O.......
..........O.................OOOOO........
..............................O..........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-3.3-src/Help/lua.html0000644000175000017500000022101313543255652012563 00000000000000 Golly Help: Lua Scripting

Golly uses a statically embedded Lua interpreter (version 5.3.5) to execute .lua scripts. This lets you extend Golly's capabilities in lots of interesting ways.

Example scripts
Golly's scripting commands
Cell arrays
Rectangle arrays
Using the gplus package
NewCA.lua
Potential problems
Lua copyright notice

 
Example scripts

The Scripts folder supplied with Golly contains a number of example Lua scripts:

1D.lua — for exploring one-dimensional cellular automata
3D.lua — for exploring three-dimensional cellular automata
breakout.lua — shows how to use the overlay to create a game
bricklayer.lua — simple use of gplus to build a multipart pattern
browse-patterns.lua — lets you browse through patterns in a folder
density.lua — calculates the density of the current pattern
draw-lines.lua — lets you draw one or more straight lines
envelope.lua — uses multiple layers to show a pattern's history
flood-fill.lua — fills a clicked region with the current drawing state
giffer.lua — creates an animated GIF file using the selection
goto.lua — goes to a given generation
gun-demo.lua — constructs a few spaceship guns
heisenburp.lua — illustrates the use of cloned layers
hexgrid.lua — creates a true hexagonal grid
invert.lua — inverts all cell states in the current selection
lifeviewer.lua — displays patterns like LifeViewer (see details here)
make-torus.lua — makes a toroidal universe from the selection
Margolus.lua — for exploring rules using the Margolus neighborhood
metafier.lua — converts the current selection into a meta pattern
move-object.lua — lets you move a connected group of live cells
move-selection.lua — lets you move the current selection
oscar.lua — detects oscillating patterns, including spaceships
overlay-demo.lua — demonstrates most of the overlay functions
p1100-MWSS-gun.lua — extended use of gplus to build a complex pattern
pd-glider.lua — creates a set of pentadecathlon+glider collisions
pop-plot.lua — displays a plot of population versus time
shift.lua — shifts current selection by given x y
slide-show.lua — displays all patterns in the Patterns folder
tile.lua — tiles the selection with the pattern inside it
tile-with-clip.lua — tiles the selection with the clipboard pattern
toLife.lua — converts LifeHistory patterns to plain Life
toLifeHistory.lua — converts Life patterns to LifeHistory

To run one of these scripts, tick the Show Files item in the File menu, open the Scripts/Lua folder and then simply click on the script's name. You can also select one of the Run items in the File menu. For a frequently used script you might like to assign a keyboard shortcut to run it (see Preferences > Keyboard).

When Golly starts up it looks for a script called golly-start.lua in the same directory as the Golly application and then in a user-specific data directory (see the getdir command for the likely path on your system). If the script is found then it is automatically executed.

There are a number of ways to abort a running script. Hit the escape key, or click on the stop button in the tool bar, or select the Stop item in the Control menu.

 
Golly's scripting commands

This section describes all the g.* commands that can be used in a script after including this line:

local g = golly()

Commands are grouped by function (filing, editing, control, viewing, layers and miscellaneous) or you can search for individual commands alphabetically:

addlayer
advance
autoupdate
check
clear
clone
continue
copy
cut
dellayer
doevent
duplicate
empty
error
evolve
exit
fit
fitsel
flip
getalgo
getbase
getcell
getcells
getclip
getclipstr
getcolor
getcolors
getcursor
getdir
getevent
getfiles
getgen
getheight
getinfo
getlayer
getmag
getname
getoption
getpath
getpop
getpos
getrect
getrule
getselrect
getstep
getstring
getview
getwidth
getxy
hash
join
load
maxlayers
millisecs
movelayer
new
note
numalgos
numlayers
numstates
open
opendialog
overlay
ovtable
os
parse
paste
putcells
randfill
reset
rotate
run
save
savechanges
savedialog
select
setalgo
setbase
setcell
setclipstr
setcolor
setcolors
setcursor
setdir
setgen
setlayer
setmag
setname
setoption
setpos
setrule
setstep
settitle
setview
show
shrink
sleep
step
store
transform
update
visrect
warn

 
FILING COMMANDS

open(filename, remember=false)
Open the given file and process it according to its type:

  • A HTML file (.htm or .html extension) is displayed in the help window.
  • A text file (.txt or .doc extension, or a name containing "readme") is opened in your text editor.
  • A script file (.lua or .py extension) is executed.
  • A zip file (.zip extension) is processed as described here.
  • Any other type of file is assumed to be a pattern file and is loaded into the current layer.

A non-absolute path is relative to the location of the script. The 2nd parameter is optional (default = false) and specifies if the given pattern or zip file should be remembered in the Open Recent submenu, or in the Run Recent submenu if the file is a script.
Example: g.open("my-patterns/foo.rle")

save(filename, format, remember=false)
Save the current pattern in a given file using the specified format:

"rle" run length encoded (RLE)
"rle.gz" compressed RLE
"mc" macrocell
"mc.gz" compressed macrocell

A non-absolute path is relative to the location of the script. The 3rd parameter is optional (default = false) and specifies if the file should be remembered in the Open Recent submenu. If the savexrle option is true then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.save("foo.rle", "rle", true)

opendialog(title, filetypes, initialdir, initialfname, mustexist=true)
Present a standard Open dialog to the user and return the chosen path in a string. All parameters are optional; the default is an Open dialog showing the current directory, with a title of "Choose a file" and a file type of "All files (*)|*". If the 5th parameter (default = true) is set to false, the user can specify a new filename instead of choosing an existing file. If the given file type is "dir" then the dialog lets the user choose a directory rather than a file. If the user cancels the dialog, the return value will be an empty string.
Example: local fname = g.opendialog("Open MCell File", "MCell files (*.mcl)|*.mcl", "C:\\Temp", "sample.mcl")
Example: local dirname = g.opendialog("Choose a folder", "dir");

savedialog(title, filetypes, initialdir, initialfname, suppressprompt=false)
Present a standard Save dialog to the user and return the chosen path in a string. All parameters are optional; the default is a Save dialog showing the current directory, with a title of "Choose a save location and filename" and a file type of "All files (*)|*". If a file already exists at the chosen location, an Overwrite? query will be displayed unless the 5th parameter (default = false) is set to true. If the user cancels the dialog, the return value will be an empty string.
Example: local fname = g.savedialog("Save text file", "Text files (*.txt;*.csv)|*.txt;*.csv", "C:\\Temp", "Params.txt", 1)

load(filename)
Read the given pattern file and return a cell array.
Example: local blinker = g.load("blinker.rle")

store(cell_array, filename)
Write the given cell array to the specified file in RLE format. If the savexrle option is true then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.store(cells, "foo.rle")

getdir(dirname)
Return the path of the specified directory:

"app" — the directory containing the Golly application.

"data" — the user-specific data directory:
On Linux: ~/.golly/
On Mac OS X: ~/Library/Application Support/Golly/
On Windows XP: C:\Documents and Settings\username\Application Data\Golly\
On Windows 7+: C:\Users\username\AppData\Roaming\Golly\
Example: g.setcolors({1,0,0,0, 2,0,0,0}) # set states 1 and 2 to black
Example: g.setcolors({-1,0,255,0}) # set all live states to green
Example: g.setcolors({255,0,0, 0,0,255}) # live states vary from red to blue
Example: g.setcolors({}) # restore default colors

getcolors(state=-1)
Return the color of a given state in the current layer as an array of the form

{ state, red, green, blue }

or if the given state is -1 (or not supplied) then return all colors as

{ 0, r0, g0, b0, . . . N, rN, gN, bN }

where N equals numstates() - 1. Note that the array returned by getcolors can be passed into setcolors; this makes it easy to save and restore colors.
Example: local allcolors = g.getcolors()
Example: local deadcolor = g.getcolors(0)

 
MISCELLANEOUS COMMANDS

os()
Return the current operating system: "Windows", "Mac" or "Linux".
Example: if g.os() == "Mac" then do_mac_stuff() end

millisecs()
Return the number of milliseconds that have elapsed since Golly started up. The returned value is a floating point number.
Example: local t1 = g.millisecs()

sleep(millisecs)
Sleep for the given number of millisecs. Scripts with an event loop can call this command to avoid hogging the CPU when the script is idle.
Example: g.sleep(5)

settitle(string)
Set the window title to the given string. The original title will be restored when the script terminates.
Example: g.settitle("running a search...")

setoption(name, value)
Set the given option to the given value. The old value is returned to make it easy to restore a setting. Here are all the valid option names and their possible values:

"autofit" 1 or 0
"boldspacing" 2 to 1000 (cells)
"drawingstate" 0 to numstates()-1
"fullscreen" 1 or 0
"hyperspeed" 1 or 0
"maxdelay" 0 to 5000 (millisecs)
"mindelay" 0 to 5000 (millisecs)
"opacity" 1 to 100 (percent)
"restoreview" 1 or 0
"savexrle" 1 or 0
"showallstates" 1 or 0
"showboldlines" 1 or 0
"showbuttons" 0 to 4
"showeditbar" 1 or 0
"showexact" 1 or 0
"showfiles" 1 or 0
"showgrid" 1 or 0
"showhashinfo" 1 or 0
"showicons" 1 or 0
"showlayerbar" 1 or 0
"showoverlay" 1 or 0
"showpopulation" 1 or 0
"showprogress" 1 or 0
"showscrollbars" 1 or 0
"showstatusbar" 1 or 0
"showtimeline" 1 or 0
"showtoolbar" 1 or 0
"smartscale" 1 or 0
"stacklayers" 1 or 0
"swapcolors" 1 or 0
"switchlayers" 1 or 0
"synccursors" 1 or 0
"syncviews" 1 or 0
"tilelayers" 1 or 0

Example: local oldgrid = g.setoption("showgrid", 1)

getoption(name)
Return the current value of the given option. See above for a list of all the valid option names.
Example: if g.getoption("autofit") == 1 then g.fit() end

setcolor(name, r, g, b)
Set the given color to the given RGB values (integers from 0 to 255). The old RGB values are returned as 3 integers to make it easy to restore the color. Here is a list of all the valid color names and how they are used:

"border" color for border around bounded grid
"paste" color for pasting patterns
"select" color for selections (will be 50% transparent)
algoname status bar background for given algorithm

Example: local oldr, oldg, oldb = g.setcolor("HashLife", 255, 255, 255)

getcolor(name)
Return the current RGB values for the given color as 3 integers. See above for a list of all the valid color names.
Example: local selr, selg, selb = g.getcolor("select")

getclipstr()
Return the current contents of the clipboard as an unmodified string.
Example: local illegalRLE = g.getclipstr()

setclipstr(string)
Copy an arbitrary string (not necessarily a cell pattern) directly to the clipboard.
Example: g.setclipstr(correctedRLE)

getstring(prompt, initial="", title="")
Display a dialog box and get a string from the user. If the initial string is supplied it will be shown and selected. If the title string is supplied it will be used in the dialog's title bar. The script will be aborted if the user hits the dialog's Cancel button.
Example: local n = tonumber( g.getstring("Enter a number:", "100") )

getevent(get=true)
When Golly runs a script it initially handles all user events, but if the script calls getevent() then future events are put into a queue for retrieval via later calls. These events are returned in the form of strings (see below for the syntax). If there are no events in the queue then the returned string is empty. Note that the very first getevent() call will always return an empty string, but this isn't likely to be a problem because it normally occurs very soon after the script starts running. A script can call getevent(false) if it wants Golly to resume handling any further events. See flood-fill.lua for a good example.

Key-down events are triggered when a key is pressed or autorepeats. The returned string is of the form "key charname modifiers" where charname can be any displayable ASCII character from '!' to '~' or one of the following names: space, home, end, pageup, pagedown, help, insert, delete, tab, return, left, right, up, down, or f1 to f24. If no modifier key was pressed then modifiers is none, otherwise it is some combination of alt, cmd, ctrl, meta, shift. Note that cmd will only be returned on a Mac and corresponds to the command key. The alt modifier corresponds to the option key on a Mac.

Key-up events occur when a key is released and are strings of the form "kup charname".

Mouse-down events in the current layer are strings of the form "click x y button modifiers" where x and y are integers giving the cell position of the click, button is one of left, middle or right, and modifiers is the same as above.

Mouse-down events in a non-transparent pixel in the overlay are strings of the form "oclick x y button modifiers" where x and y are integers giving the pixel position in the overlay (0,0 is the top left pixel), button is one of left, middle or right, and modifiers is the same as above.

Mouse-up events are strings of the form "mup button" where button is one of left, middle or right.

Mouse wheel events in the current layer are strings of the form "zoomin x y" or "zoomout x y" where x and y are the mouse's pixel position in the viewport.

Mouse wheel events in a non-transparent pixel in the overlay are strings of the form "ozoomin x y" or "ozoomout x y" where x and y are the mouse's pixel position in the overlay.

File events are strings of the form "file filepath" where filepath is an absolute path. File events can be triggered in a number of ways: by clicking on a file in the left panel, by clicking an "open:" link in the Help window, by double-clicking a Golly-associated file, or by dropping a file onto the Golly window. It is up to the script to decide what to do with the file.

The following examples show the strings returned after various user events:

"key m none" user pressed M key
"key space shift" user pressed space bar and shift key
"key , altctrlshift" user pressed comma and 3 modifier keys
"kup left" user released the left arrow key
"click 100 5 left none" user clicked cell at 100,5 with left button
"click -10 9 middle alt" user clicked cell with middle button and pressed alt key
"click 0 1 right altshift" user clicked cell with right button and pressed 2 modifiers
"oclick 10 5 left none" user clicked pixel at 10,5 in overlay with left button
"mup left" user released the mouse's left button
"zoomout 10 20" mouse wheel was used to zoom out from pixel in viewport
"ozoomin 10 20" mouse wheel was used to zoom in to pixel in overlay
"file /path/to/foo.rle" user tried to open the given file

Example: local evt = g.getevent()

doevent(event)
Pass the given event to Golly to handle in the usual manner (but events that can change the current pattern will be ignored). The given event must be a string with the exact same format as returned by the getevent command (see above). If the string is empty then Golly does nothing. Note that the cmd modifier corresponds to the command key on a Mac or the control key on Windows/Linux (this lets you write portable scripts that work on any platform).
Example: g.doevent("key q cmd") -- quit Golly

getxy()
Return the mouse's current grid position as a string. The string is empty if the mouse is outside the viewport or outside a bounded grid or over the translucent buttons, otherwise the string contains x and y cell coordinates separated by a space; eg. "-999 12345". See draw-lines.lua for a good example of how to use this command.
Example: local mousepos = g.getxy()

show(message)
Show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.show("Hit any key to continue...")

error(message)
Beep and show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.error("The pattern is empty.")

warn(message, showCancel=true)
Beep and show the given string in a modal warning dialog. Useful for debugging Lua scripts or displaying error messages. If showCancel is true (the default) then the dialog has a Cancel button as well as the usual OK button. Clicking OK will close the dialog and continue; clicking Cancel will close the dialog and abort the script.
Example: g.warn("xxx = "..xxx)

note(message, showCancel=true)
Show the given string in a modal information dialog. Useful for displaying multi-line results. If showCancel is true (the default) then the dialog has a Cancel button as well as the usual OK button. Clicking OK will close the dialog and continue; clicking Cancel will close the dialog and abort the script.
Example: g.note("Line 1\nLine 2\nLine 3", false)

savechanges(query, message)
Show a standard "save changes" dialog and return "yes", "no" or "cancel" depending on which button the user clicked.
Example: local answer = g.savechanges("Save your changes?",
"If you don't save, the changes will be lost.")

check(bool)
When Golly runs a script this setting is initially true, which means that event checking is enabled. If the given parameter is false then event checking is disabled. Typically used to prevent mouse clicks being seen at the wrong time. This should only be done for short durations because the script cannot be aborted while the setting is false.
Example: g.check(false)

continue(message)
This function can be used to continue execution after pcall has detected some sort of error or the user has aborted the script. It's typically used to ensure some finalization code is executed. If not empty, the given message will be displayed in the status bar after the script has finished. See the end of envelope.lua for an example.

exit(message="")
Exit the script with an optional error message. If a non-empty string is supplied then it will be displayed in the status bar along with a beep, just like the error command. If no message is supplied, or if the string is empty, then there is no beep and the current status bar message will not be changed.
Example: if g.empty() then g.exit("There is no pattern.") end

 
Cell arrays

Some scripting commands manipulate patterns in the form of cell arrays. Golly supports two types of cell arrays: one-state and multi-state. A one-state cell array contains an even number of integers specifying the x,y coordinates for a set of cells, all of which are assumed to be in state 1:

{ x1, y1, . . . xN, yN }

A multi-state cell array contains an odd number of integers specifying the x,y,state values for a set of cells. If the number of cells is even then a padding integer (zero) is added at the end of the array to ensure the total number of integers is odd:

{ x1, y1, state1, . . . xN, yN, stateN }      if N is odd
{ x1, y1, state1, . . . xN, yN, stateN, 0 }  if N is even

All scripting commands that input cell arrays use the length of the array to determine its type. When writing a script to handle multi-state cell arrays you may need to allow for the padding integer, especially if accessing cells within the array. See tile.lua for example.

Note that all scripting commands return {} if the resulting cell array has no cells. They never return {0}, although this is a perfectly valid multi-state cell array and all commands can input such an array. For example, newarray = g.join(array1,{0}) can be used to convert a non-empty one-state array to multi-state.

One-state cell arrays are normally used in a two-state universe, but they can also be used in a universe with more than two states. A multi-state cell array can be used in a two-state universe, but only if the array's cell states are 0 or 1.

The ordering of cells within either type of array doesn't matter. Also note that positive y values increase downwards in Golly's coordinate system.

 
Rectangle arrays

Some commands manipulate rectangles in the form of arrays. An empty rectangle is indicated by an array with no items; ie. {}. A non-empty rectangle is indicated by an array containing four integers:

{ left, top, width, height }

The first two items specify the cell at the top left corner of the rectangle. The last two items specify the rectangle's size (in cells). The width and height must be greater than zero.

 
Using the gplus package

The gplus package supplied with Golly provides a high-level interface to many of Golly's built-in scripting commands. The package consists of a set of .lua files stored in the Scripts/Lua/gplus directory. The best way to learn how to use gplus is to look at some of the scripts supplied with Golly:

  • See bricklayer.lua for how to use the pattern function to contruct a complicated pattern by combining simpler sub-patterns.
  • See invert.lua for how to use the rect function to make it easier to manipulate rectangles.
  • See p1100-MWSS-gun.lua for an extended example of an efficient script representation of a large complex pattern. This uses the pattern function to place different phases and orientations of each component object, and the put function to populate the resulting structure with spaceships.
  • See shift.lua for how to use the split and validint functions to parse user input.

Here's a summary of the functions available after a script calls local gp = require "gplus" (see init.lua for all the implementation details):

gp.int(x) — return integer part of given floating point number
gp.round(x) — return rounded integer for given floating point number
gp.min(a) — return minimum value in given array
gp.max(a) — return maximum value in given array
gp.drawline(x1,y1,x2,y2,z) — draw a line of state z cells from x1,y1 to x2,y2
gp.getedges(r) — return left, top, right, bottom edges of given rectangle array
gp.getminbox(p) — return minimal bounding box of given cell array or pattern
gp.validint(s) — return true if given string is a valid integer
gp.getposint() — return viewport position as 2 integers
gp.setposint(x,y) — use given integers to set viewport position
gp.split(s,sep) — split given string into 1 or more substrings
gp.equal(a1,a2) — return true if given arrays have the same values
gp.compose(S,T) — return the composition of two transformations S and T
gp.rect(r) — return a table for manipulating a rectangle
gp.pattern(p) — return a table for manipulating a pattern
gp.trace(msg) — pass into xpcall so a runtime error will have a stack trace
gp.timerstart(name) — start a named timer
gp.timersave(name) — save the current elapsed time of the named timer
gp.timervalue(name) — get the last saved value of the named timer in milliseconds
gp.timervalueall(precision) — get a string with a list of all saved timer names and values in milliseconds and then reset all timers
gp.timerresetall() — reset all of the timers

Most of the supplied Lua scripts use gplus, but it isn't compulsory. You might prefer to create your own package for use in the scripts you write. If a script calls require "foo" then Golly will look for foo.lua in the same directory as the script, then it looks for foo/init.lua. If a script calls require "foo.bar" then Golly looks for foo/bar.lua. (If none of those files exist in the script's directory then Golly will look in the supplied Scripts/Lua directory, so scripts can always use the gplus package no matter where they are located.)

 
NewCA.lua

NewCA.lua is a gplus module that can be used by other Lua scripts to explore new cellular automata rules. To implement a new CA you need to create a .lua file that looks something like this:

local g = golly()
require "gplus.NewCA"
 
SCRIPT_NAME = "MyCA"    -- must match the name of your .lua file
DEFAULT_RULE = "XXX"    -- must be a valid rule in your CA
RULE_HELP = "HTML code describing the rules allowed by your CA."
 
function ParseRule(newrule)
    -- Parse the given rule string.
    -- If valid then return nil, the canonical rule string,
    -- the width and height of the grid, and the number of states.
    -- If not valid then just return an appropriate error message.
    
    ... parsing code for your rule syntax ...
    
    return nil, canonrule, wd, ht, numstates
    -- Note that wd and ht must be from 4 to 4000,
    -- and numstates must be from 2 to 256.
end
 
function NextPattern(currcells, minx, miny, maxx, maxy)
    -- Create the next pattern using the given parameters:
    -- currcells is a non-empty cell array containing the current pattern.
    -- minx, miny, maxx, maxy are the cell coordinates of the grid edges.
    -- This function must return the new pattern as a cell array.
    
    local newcells = {}
    
    ... code to create the next pattern in newcells ...
    
    -- delete the current pattern and add the new pattern
    g.putcells(currcells, 0, 0, 1, 0, 0, 1, "xor")
    g.putcells(newcells)
    
    return newcells
    -- Note that currcells and newcells are one-state cell arrays if
    -- g.numstates() == 2, otherwise they are both multi-state.
end
 
StartNewCA()

It should be possible to implement almost any CA that uses square cells with up to 256 states. NewCA.lua provides a lot of useful functionality:

  • The interface is essentially the same as Golly. The only really new feature is a combined menu+tool bar that appears under the edit bar. It has some menus (File, Edit, View) on the left side and various buttons (Start, Reset, etc) on the right side, along with a slider for controlling the step size.
  • Full Golly-like editing (cut/copy/paste/select/etc) including unlimited undo/redo. All of Golly's usual cursor modes are supported.
  • Patterns can be saved as .rle files. These files can be opened via the File menu's Open Pattern command. You can also open a pattern stored in the clipboard via the Open Clipboard command (or by typing shift-O).
  • Users can get help in various ways (type H or click the "?" button) and see documentation about the required rule syntax, the menu commands, a list of all the keyboard shortcuts, etc.
  • Your script can run other Lua scripts to do searches, build patterns, etc. In particular, users can specify a script to be run whenever your script starts up. A startup script can do lots of customizations (add/modify keyboard shortcuts, change the color scheme, specify a different DEFAULT_RULE, add aliases for specific rules, etc).

There is of course a price to pay for all this flexibility, and that's speed. Don't expect your CA to run at Golly-like speeds! It won't really be practical to write a CA that supports very large neighborhoods (7x7 is about the limit).

To implement a new CA you'll typically need to write a couple of hundred lines of Lua code to parse the rule strings allowed by your CA and to calculate the next pattern. To help with this task, a couple of example scripts are supplied with Golly:

1D.lua lets you explore some one-dimensional rules. It supports all of Stephen Wolfram's 256 elementary rules (including the odd numbers), as well as totalistic rules with up to 4 states and a maximum range of 4.

The syntax for elementary rules is Wn where n is from 0 to 255. Totalistic rules are strings of the form CcKkRr where c is a code number from 0 to k^((2r+1)k-2r)-1, k is the number of states (2 to 4), and r is the range (1 to 4).

The ParseRule code sets NextPattern to either NextElementary or NextTotalistic, depending on the given rule. This is a useful technique that avoids the code in NextPattern becoming way too big and complicated.

1D.lua always generates from the bottom row of the current pattern. When it reaches the bottom row of the grid, it clears the grid, copies the bottom row to the top of the grid, and continues.

SetColors is redefined to use the same color scheme as in Wolfram's "A New Kind of Science". Note that the SetColors function uses g.setcolor commands to change the grid border and the status bar background to light blue.

1D.lua also redefines the RandomPattern function to create a single row of random cells at the top of the grid.

Margolus.lua lets you explore rules using the Margolus neighborhood. Rule strings are of the form Mn,n,n,... where there must be 16 comma-separated numbers with values from 0 to 15. MCell's syntax (MS,Dn;n;n;...) is also allowed, as are these aliases:

bbm = M0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15 (the default rule)
critters = M15,14,13,3,11,5,6,1,7,9,10,2,12,4,8,0
tron = M15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0

The ParseRule code sets NextPattern to either FastPattern or SlowPattern, depending on the given rule. FastPattern is used if the rule starts with M0, or if it starts with M15 and ends with 0. To avoid ugly strobing effects in the latter case, two alternating rules will be used: one rule for even-numbered generations and another rule for odd-numbered generations (similar to how Golly handles B0 rules).

The above two scripts have a number of features in common:

  • Users can hit alt-R (option-R on a Mac) to create a random pattern with a random rule. This makes it easy to search for rules with interesting behavior.
  • Both scripts use a toroidal grid with a default size of 500 x 500. For consistency with Golly, all rule strings can have an optional suffix like ":T400,300" or ":T400" to specify a desired grid size. (It's perfectly possible to support other topologies but you'd have to write a lot of messy code.)
  • The ParseRule code allows entering an empty string as a quick way to switch to the default rule.
  • Letters in a given rule can be entered in lower case, but the canonical version always uses upper case.
  • Both scripts define a global aliases table so you can assign mnemonic names to specific rule strings.

It's probably a good idea to support these features in any new CA you might write, but it's not compulsory.

 
Potential problems

1. There are some important points to remember about Lua, especially when converting an existing Perl/Python script to Lua:

  • Cell arrays and rectangle arrays start with index 1, not 0. This is necessary to be able to use Lua's length operator (#) and standard library functions like table.unpack.
  • Lua's true and false are not equivalent to 1 and 0. In particular, "if 0" is true.
  • Avoid calls like local x, y, wd, ht = g.getrect(). Only x will get a non-nil value (a rectangle array). You need to do local x, y, wd, ht = table.unpack(g.getrect()).
  • When writing a complicated script it's a good idea to add the line require "gplus.strict" near the top. This will catch any undeclared global variables. When the script is working just remove or comment out that line.

More tips can be found at Lua Gotchas.

2. The escape key check to abort a running script is not done by Lua but by each g.* function. This means that very long Lua computations should call an occasional "no-op" like g.doevent("") to allow the script to be aborted in a timely manner.

3. When writing a script that creates a pattern, make sure the script starts with a new call (or, less useful, an open call that loads a pattern, or a save call) otherwise the script might create lots of temporary files or use lots of memory. From Golly's point of view there are two types of scripts:

  • A script that calls new or open or save is assumed to be creating some sort of pattern, so when Golly sees these calls it clears any undo history and sets an internal flag that says "don't mark this layer as dirty and don't bother recording any further changes".
  • A script that doesn't call new or open or save is assumed to modify the current pattern. Golly must record all the script's changes so that when it finishes you can select "Undo Script Changes" from the Edit menu. Generating changes (due to run or step calls) are stored in temporary files; all other changes are stored in memory.

 
Lua copyright notice

Copyright © 1994–2018 Lua.org, PUC-Rio.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golly-3.3-src/Help/overlay.html0000644000175000017500000017457713441044674013506 00000000000000 Golly Help: Overlay

Introduction
The overlay commands
Alpha blending
Using clips
Affine transformations
Cell view
The oplus package

 
Introduction

The overlay is a rectangular region of pixels that can be displayed above the current layer. Lua scripts have total control of what the overlay looks like and how the user interacts with it. The Scripts/Lua folder supplied with Golly has a number of scripts that illustrate how the overlay can be used:

  • 3D.lua lets people explore three-dimensional cellular automata.
  • breakout.lua shows how to use the overlay functions to create a working game.
  • browse-patterns.lua browses through patterns in a folder manually or automatically.
  • hexgrid.lua creates a true hexagonal grid for rules that use a hexagonal neighborhood.
  • lifeviewer.lua displays patterns like LifeViewer with history and smooth non-integer scaling and rotation.
  • overlay-demo.lua demonstrates how to use most of the overlay functions.
  • pop-plot.lua displays a plot of population versus time that can be saved as a PNG file.

To study how these scripts work, control-click or right-click on one of the above links to open the script in your preferred text editor, then run the script by clicking on the same link.

As well as graphics the overlay supports audio playback. Note that audio support is a compile time option for Golly and is not enabled in the standard builds.

 
The overlay commands

The overlay is manipulated using two scripts commands called overlay and ovtable.

The first, overlay, takes a single string parameter that contains an overlay command followed by zero or more arguments separated by spaces. Some overlay commands can also return a single string as their result.

The second, ovtable, takes a single table parameter rather than a string and only supports a subset of the overlay commands. It is typically faster to use ovtable than overlay. The supported ovtable commands that return a result are get, which returns individual values, and rgba, which returns a table. In all other ways ovtable is identical to the overlay command.

Here is an alphabetical list of all the valid overlay commands:

blend
camera
celloption
cellview
copy
create
cursor
delete
drawcells
ellipse
fill
flood
font
get
line
lines
lineoption
load
optimize
paste
position
replace
resize
rgba
save
scale
set
sound
target
text
textoption
theme
transform
update
updatecells
xy

Here is an alphabetical list of the subset of overlay commands supported by ovtable:

fill
get
line
lines
paste
rgba
set

All of the drawing commands use the current render target. This is initially the overlay but can be changed to a clip with the target command.

The examples given below assume a script has started with these lines:

local g = golly()
local ov = g.overlay
local ovt = g.ovtable

blend i
Set alpha blending off (i = 0), full (i = 1) or fast (i = 2) and return the previous blend state as a string ("0", "1" or "2"). The fast mode should only be used when the target pixels are opaque. The commands affected by alpha blending are: ellipse, fill, flood, line, lines, load, paste, scale and set. Note that setting alpha blending to full or fast also forces ellipses and lines to be antialiased.
Example: local oldblend = ov("blend 1")

camera setting value(s)
Change a camera setting for the current cell view. The valid camera settings and their allowed values are:

angle d– set camera angle to d degrees where d is from 0.0 to 360.0
xy x y– set camera pan position to x,y
zoom z– set camera zoom to z where z is from 0.0625 (-16x) to 32.0

Example: ov("camera angle 90")
Example: ov("camera xy -32 100")
Example: ov("camera zoom 3.5")

The cellview command initializes the camera angle to 0 degrees, the x,y position to the centre of the view, and the zoom value to 1.

celloption option value
Set a display option for the current cell view. The valid options and their allowed values are:

depth d– set layer depth to d where d is from 0.0 to 1.0
grid i– set grid lines display on (i = 1) or off (i = 0)
gridmajor g– set grid lines major interval to g where g is an integer from 0 to 16
hex i– set hex display on (i = 1) or off (i = 0)
layers n– set number of layers to n where n is an integer from 1 to 10
stars i– set stars display on (i = 1) or off (i = 0)

Example: ov("celloption depth 0.2")
Example: ov("celloption layers 6")
Example: ov("celloption hex 1")
Example: ov("celloption grid 1")
Example: ov("celloption gridmajor 8")
Example: ov("celloption stars 1")

The cellview command initializes the depth to 0.05, the number of layers to 1, hex display to 0, grid to 0, gridmajor to 10 and stars to 0.

cellview x y wd ht
Create a cell view enclosed by the given rectangle that can be drawn on the overlay. The width and height must be from 16 to 4096 and a multiple of 16.
Example: ov("cellview -1024 -1024 2048 2048")

copy x y wd ht clipname
Copy the pixels in the given rectangle from the current render target into the named clip for later use in a command like paste or scale. If the given width or height is less than 1 then it is treated as an inset from the render target's current width or height (this makes it easy to copy the entire render target with a command like "copy 0 0 0 0 all"). Any parts of the rectangle outside the render target are filled with transparent pixels. The clip name can contain any characters except a space.
Example: ov("copy 0 0 100 200 tempbox")

create wd ht (clipname)
Create the overlay or if a clip name is specified create a new clip with the given width and height. All pixels are initially transparent (their RGBA values are set to 0,0,0,0). When creating the overlay the following are also set:

The initial RGBA values used by later drawing commands are set to 255,255,255,255 (opaque white). The overlay's initial position is set to topleft, the cursor is set to the standard arrow, the transform values are set to 1,0,0,1 (identity) and alpha blending is off. The initial font for drawing text is the default system font at a size of 10pt (see the font command). The text options are set to left alignment (for multi-line text) and a transparent background. The initial line width (used by the ellipse, line and lines commands) is set to 1. The render target is set to be the overlay.

Example: ov("create 400 300")
Example: ov("create 400 300 myclip")

Note that the when creating the overlay this command automatically ticks the Show Overlay option to ensure the overlay will be displayed when the viewport is updated (by calling g.update() or the update command).

cursor name
Specify which cursor to use when the mouse moves over a non-transparent pixel within the overlay. The valid cursor names are:

arrow – standard arrow
cross – crosshairs
current – Golly's current cursor (no change)
hand – hand
hidden – invisible cursor
pencil – pencil
pick – color picker
wait – a lengthy task is in progress
zoomin – magnifying glass with "+"
zoomout – magnifying glass with "-"

The previous cursor name is returned.
Example: local oldcursor = ov("cursor pencil")

delete (clipname)
Delete the overlay or if a clip name is specified delete the named clip. When deleting the overlay this is equivalent to selecting Delete Overlay from the Layer menu. Note that it is an error to delete a clip that is the current render target. Also note that deleting the overlay will stop any sound that is playing.
Example: ov("delete")
Example: ov("delete myclip")

drawcells
Draw the cells from the current cell view onto the render target. The cells will be drawn using the camera settings and colored using the current theme. Further drawing commands can then be used to draw on top of the cell display. Pixels outside of the current cell view are drawn in the current grid border color.
Example: ov("drawcells")

ellipse x y wd ht
Draw an ellipse inside the given rectangle using the current rgba values onto the render target. Any parts of the ellipse outside the render target are automatically clipped. A width or height less than 1 is relative to the render target's width or height. If the width equals the height (and both are positive) then the result is a circle. If alpha blending is turned on then the edges of the ellipse are antialiased. The lineoption width command determines the thickness of the ellipse.
Example: ov("ellipse 10 10 60 40")

fill x y wd ht (...x y wd ht)
Fill the given rectangles in the render target with the current rgba values. Any parts of the rectangles outside the render target are automatically clipped. If no rectangle is given then the entire render target is filled. A width or height less than 1 is relative to the render target's width or height, so a command like ov("fill 1 1 -2 -2") would fill all of the render target except for a 1 pixel border around the edges.
Example: ov("fill 10 10 30 50")
 or
Example: ovt{"fill", 10, 10, 30, 50}

flood x y
Flood a connected region of pixels in the render target that match the given starting pixel with the current rgba values.
Example: ov("flood 10 20")

font fontsize fontname
Set the font used by later text commands. If the font name is not supplied then only the font size will be changed. The valid font names are:

default – standard system font
default-bold – bold system font
default-italic – italic system font
mono – mono-spaced font
mono-bold – bold mono-spaced font
mono-italic – italic mono-spaced font
roman – roman font
roman-bold – bold roman font
roman-italic – italic roman font

The previous font is returned as a string of the form "fontsize fontname".
Example: local oldfont = ov("font 15 roman-bold")

get x y
Return the RGBA values of the given pixel in the render target. All values will be from 0 to 255.
For the string version the values are returned as a string of the form "red green blue alpha". If the given pixel is outside the render target then "" is returned.
Example: local RGBA = ov("get 10 20")
For the table version the values are returned individually. If the given pixel is outside the render target then -1 is returned for each component.
Example: local R, G, B, A = ovt{"get", 10, 20}

line x1 y1 x2 y2 (...xn yn)
Draw one or more connected lines of pixels between the supplied coordinates x1 y1 to xn yn on the render target using the current rgba values. Any pixels outside the render target edges are automatically clipped. If alpha blending is turned on then the lines are antialiased. The lineoption width command determines the thickness of the lines.
Examples:
-- draw line from (10, 20) to (50, 60)
ov("line 10 20 50 60")
 or
ovt{"line", 10, 20, 50, 60}
-- draw triangle with vertices at (0, 0), (100, 0) and (50, 100)
ov("line 0 0 100 0 50 100 0 0")
 or
ovt{"line", 0, 0, 100, 0, 50, 100, 0, 0}

lines x1 y1 x2 y2 (...xn1 yn1 xn2 yn2)
Draw one or more separate lines of pixels between the supplied pairs of coordinates x1 y1 to x2 y2 on the render target using the current rgba values. Any pixels outside the render target edges are automatically clipped. If alpha blending is turned on then the lines are antialiased. The lineoption width command determines the thickness of the lines.
Examples:
-- draw line from (10, 20) to (50, 60)
ov("lines 10 20 50 60")
 or
ovt{"lines", 10, 20, 50, 60}
-- draw line from (0, 0) to (100, 0) and another line from (50, 25) to (150, 25)
ov("lines 0 0 100 0 50 25 150 25")
 or
ovt{"lines", 0, 0, 100, 0, 50, 25, 150, 25}

lineoption option value
Set an option used by the ellipse, line and lines commands. There is currently one valid option:

width w– set the line width to an integer from 1 to 10000.

The previous line width is returned as a string. The create command initializes the line width to 1.

Example: local oldwidth = ov("lineoption width 3")

load x y file
Load the given BMP/GIF/PNG/TIFF file into the render target at the given location. Any pixels outside the render target edges are automatically clipped. Return the total size of the image (including any clipped portions) as a string of the form "width height". Note that it's sometimes desirable to call this command twice: the 1st call can specify a location completely outside the render target just to get the image's width and height; the 2nd call can then use those values to do things like center the image within the render target.
Example: local wdht = ov("load 99999 99999 foo.png")

optimize clipname
Optimizes the named clip for improved paste performance when using alpha blending. Returns the bounding box of non-zero alpha pixels within the clip as a string of the form "x y width height". A clip that is modified after optimization must be optimized again before use to get the performance benefit. Especially effective for text rendering and used automatically by the op.maketext function.
Example: local x, y, w, h = ov("optimize textclip")

paste x1 y1 (...xn yn) clipname
Paste the named clip (created by an earlier create, copy or text command) into the render target at the given location(s). Any pixels outside the render target edges are automatically clipped.
Examples:
-- paste the tempbox clip at (10, 20)
ov("paste 10 20 tempbox")
 or
ovt{"paste", 10, 20, "tempbox"}
-- paste the tempbox clip at (10, 20), (100, 20) and (100, 50)
ov("paste 10 20 100 20 100 50 tempbox")
 or
ovt{"paste", 10, 20, 100, 20, 100, 50, "tempbox"}

If multiple locations are given then the clip is drawn at the locations in the order specified.

position pos
Specify where the overlay is to be displayed within the current layer. The valid positions are:

topleft – top left corner
topright – top right corner
bottomright – bottom right corner
bottomleft – bottom left corner
middle – middle of layer

Example: ov("position middle")

replace red green blue alpha
Replace pixels with color red green blue alpha in the render target with the current rgba values. Returns the number of pixels replaced as a string.
Example:
-- replace opaque black pixels with semi-transparent blue pixels in clip named 'myclip'
local oldtarget = ov("target myclip")
ov("rgba 0 0 255 128")
local replaced = ov("replace 0 0 0 255 myclip")
ov("target "..oldtarget)

There are two special characters that can be used in the color specification for more advanced matches: ! and *. A color component may be specified as the wildcard * which means match any value for that component.
Example:
-- replace any opaque pixel with opaque blue
ov(op.blue)
local replaced = ov("replace * * * 255")

If the match specification is prefixed with ! then pixels that don't match the specification are replaced.
Example:
-- replace any pixel that isn't white with yellow
ov(op.yellow)
local replaced = ov("replace !255 255 255 255")

Alternatively if the alpha specification is prefixed with ! then pixels that don't have the specified alpha value are replaced.
Example:
-- replace any non-opaque pixel with opaque blue
ov(op.blue)
local replaced = ov("replace * * * !255")

Normally when a match is found the clip pixel is replaced with the current rgba values. This can be overridden by postfixing one or more color components with r, g, b, a or #. Each color component in the clip pixel can either be left unchanged (in the case of #) or replaced with the specified color component from the clip pixel.
Examples:
-- make transparent pixels opaque (r g b 0 -> r g b 255)
ov("rgba 0 0 0 255")
local replaced = ov("replace *# *# *# 0")

-- swap the red and green components (r g b a -> g r b a)
local replaced = ov("replace *g *r *# *#")

-- set the pixels to opaque gray based on the alpha level (r g b a -> a a a 255)
ov("rgba 0 0 0 255")
local replaced = ov("replace *a *a *a *")

If the postfix character is followed by - then the component value is inverted.
Examples:
-- invert the r g b components but leave alpha unchanged (r g b a -> 255-r 255-g 255-b a)
local replaced = ov("replace *#- *#- *#- *#")

-- make transparent pixels opaque and vice versa (r g b a -> r g b 255-a)
local replaced = ov("replace *# *# *# *#-")

Color components can also be adjusted by using -- to decrement, ++ to increment, -value to subtract a constant or +value to add a constant. Component values are clamped to the range 0 to 255.
Examples:
-- increase the brightness of all pixels
local replaced = ov("replace *#+50 *#+50 *#+50 *#")

-- fade all pixels to black
while tonumber(ov("replace *#-- *#-- *#-- *#")) > 0 do
    ov("update")
end

The postfixes can also be used without a target component. In which case the current rgba values are adjusted.
Example:
-- replace green pixels with the current drawing color minus 32 alpha (0 255 0 255 -> 255 0 0 96)
ov("rgba 255 0 0 128")
local replaced = ov("replace 0 255 0 255-32")

resize wd ht (clipname)
Resize the overlay or if a clip name is specified resize the named clip. The previous size is returned as a string of the form "width height". This command is typically used if a window resize is detected and you wish to keep the overlay covering all of the current layer. Note that all pixels in the resized overlay/clip become transparent (their RGBA values are reset to 0,0,0,0).
Example: local oldsize = ov("resize 1000 800")
Example: local oldsize = ov("resize 300 240 myclip")

rgba red green blue alpha
Set the current RGBA values used by later drawing commands and return the old values. All values are from 0 to 255. The commands that use the current RGBA values are: ellipse, fill, flood, line, lines, replace, set and text.
For the string version the values are returned as a string of the form "red green blue alpha".
Example: local oldrgba = ov("rgba 255 0 0 255")
For the table version the values are returned as a table of the form {"rgba", red, green, blue, alpha}.
Example: local oldrgba = ovt{"rgba", 255, 0, 0, 255}

save x y wd ht file
Save the pixels in the given rectangle of the render target in the given PNG file. An error will occur if any part of the rectangle is outside the render target. If the given width or height is less than 1 then it is treated as an inset from the render target's current width or height (this makes it easy to save the entire render target with a command like "save 0 0 0 0 overlay.png").
Example: ov("save 0 0 100 80 "..g.getdir("temp").."foo.png")

set x1 y1 (...xn yn)
Set the specified pixels in the render target to the current rgba values. Pixels outside the render target are silently ignored.
Examples:
-- set pixel at (10, 20)
ov("set 10 20")
 or
ovt{"set", 10, 20}
-- set pixels at (10, 20), (15, 25) and (16, 25)
ov("set 10 20 15 25 16 25")
 or
ovt{"set", 10, 20, 15, 25, 16, 25}

scale quality x y wd ht clipname
Paste the named clip into the current render target, scaling it so it fits into the specified rectangle. Any pixels outside the render target edges are automatically clipped. The given quality must be one of these strings:

best– use a high quality, but slow, scaling algorithm
fast– use a fast, but lower quality, scaling algorithm

Example: ov("scale best 10 10 100 200 image")

sound (command (soundfile))
Controls playback of audio files. If present the soundfile argument must point to a WAV or OGG format file containing the sound to be played. Multiple sounds can be played simultaneously.

If the command is invoked with no arguments then it returns a string indicating whether sound is available.
0Sound support is not available
1Sound support is available but failed to initialize
2Sound support is available and ready to use

There are seven sound commands:

play soundfile (level)
Play the named soundfile at volume level asynchronously and return immediately. The volume is from 0.0 (silent) to 1.0 (maximum) and is set to maximum if not specified.
 
loop soundfile (level)
Play the named soundfile at volume level asynchronously and loop until the stop command is used.
 
stop (soundfile)
Stop all sound playback or just the specified soundfile.
 
pause (soundfile)
Pause all sound playback or just the specified soundfile.
 
resume (soundfile)
Resume all sound playback or just the specified soundfile.
 
volume soundfile level
Set the named soundfile volume level from 0.0 (silent) to 1.0 (maximum). This is typically used to change the volume of a sound that is already playing.
 
state (soundfile)
Returns the playback state of "playing" if any sound (or the specified sound) is playing, "paused" if the specified sound is paused or "stopped" otherwise.

Notes:

  • Deleting the overlay will stop any sounds that are playing.
  • The play command returns the empty string "" if successful and an error message otherwise.
  • The state command will return "unknown" if the specified sound is not found.
  • If sound support is not available or failed to initialize then the sound commands will silently do nothing.

Example: ov("sound play beep.wav 0.5") -- play beep.wav at half volume
Example: ov("sound play beep.wav") -- play beep.wav at full volume
Example: ov("sound stop") -- stop all sounds playing
Example: ov("sound loop background.ogg") -- play background.ogg in a loop at full volume
Example: ov("sound volume background.ogg 0.7") -- set background.ogg volume to 0.7
Example: ov("sound pause background.ogg") -- pause playback of background.ogg
Example: ov("sound resume") -- resume playback of all paused sounds

target (clipname)
Set the render target to the named clip or to the overlay if no clip is specified. All subsequent drawing commands will use the new render target. Returns the previous target as a string (an empty string if it was the overlay). It is an error to attempt to delete a clip while it is the render target. The commands that use the render target are: copy (as the source), drawcells, ellipse, fill, flood, get (as the source), line, lines, load, paste, replace, save (as the source), scale and set.
Example: local oldtarget = ov("target myclip")

text clipname one or more lines of text ...
Create a named clip containing the given text in the current font (as set by the most recent font command). Return the dimensions of the clip as a string of the form "width height descent". The descent is the number of pixels under the baseline (useful if you want to place text with different sized fonts on the same line).

The text's color depends on the most recent rgba command. The text background color can be set with the textoption background command. By default the text has a transparent background, so you'll probably need to set blend to 1 before drawing the text with paste. If you specify an opaque background then there's no need to turn on alpha blending when doing the paste, so drawing such text will be significantly faster. You can also specify the alignment of multi-line text with the textoption align command.

Example: local dimens = ov("text tempclip First line.\nSecond line.")

textoption option value
Set a display option for the text command. The valid options and their allowed values are:

align alignment– set the alignment of multi-line text to left, right or center
background r g b a– set the text background to the given RGBA values (all from 0 to 255)

The create command initializes the text options to left alignment and a transparent background. Both options return their previous setting as a string: the returned alignment value will be "left", "right" or "center"; the returned background will be a string of the form "red green blue alpha".

Example: local oldalign = ov("textoption align right")
Example: local oldbackground = ov("textoption background 255 0 0 255")

theme r1 g1 b1 r2 g2 b2 r3 g3 b3 r4 g4 b4 r5 g5 b5 (alivea, deada, unoccupieda, bordera)
Define the color theme for drawing the current cell view. Themes allow better visualization of patterns because they highlight history and longevity of cells. The arguments define 5 colors:

r1 g1 b1born   cell just born
r2 g2 b2alive   cell alive for at least 63 generations
r3 g3 b3died   cell just died
r4 g4 b4dead   cell dead for at least 63 generations
r5 g5 b5unoccupied   cell never occupied

Example: ov("theme 0 255 255 255 255 255 0 0 255 0 0 47 0 0 0")
New cells are drawn in the born color (cyan 0 255 255).
If they stay alive they fade from the born color to the alive color (white 255 255 255) over the next 63 generations. If the cell stays alive after that it remains in the alive color. This provides a visual representation of cell longevity.
Cells are drawn in the died color (blue 0 0 255) when then they die.
If they stay dead they fade from the died color to the dead color (dark blue 0 0 47) over the next 63 generations. If the cell stays dead after that it remains in the dead color. This provides a visual representation of cell history.
Cells that have never been occupied are drawn in the unoccupied color (black 0 0 0).

Optionally you can specify the alpha values for the different cell types:

alivea   born to alive
deada   died to dead
unoccupieda   unoccupied
bordera   border

The border color RGB components are read from the View Preference grid border color. If you don't want a border drawn around the cell view then set bordera to 0 (transparent).

If you omit alpha values then they all default to 255 (opaque).

If no theme is specified then Golly's default colors for the pattern are used. If you want to switch off the theme then use the command ov("theme -1").

There is a set of predefined themes in the oplus package using which the example above would become: ov(op.theme1) or ov(op.themes[1]).

transform axx axy ayx ayy
Set the affine transformation values used by later paste commands and return the old values as a string of the form "axx axy ayx ayy".
Example: local oldt = ov("transform 0 -1 1 0")

update
Tell Golly to update the overlay without drawing the underlying layer. This will be faster than calling g.update() but should only be used in cases where the overlay covers the entire layer and all pixels in the overlay are opaque.
Example: ov("update")

updatecells
Update the current cell view using the cells in the current universe. This command should typically be used every time the universe changes.
Example: ov("updatecells")

xy
Return the current mouse position within the overlay as a string of the form "x y", or "" if the mouse is outside the overlay. The x and y values are pixel coordinates. The top left pixel in the overlay is "0 0"; x values increase to the right and y values increase downwards.
Example: local mousepos = ov("xy")

 
Alpha blending

Alpha blending is a way of drawing translucent pixels on top of existing pixels to get nicer looking results. When an overlay is created, alpha blending is initially turned off. To turn it on a script needs to call "blend 1", for blending with any target, or "blend 2", for faster blending when you know the target pixels are opaque. Consider this simple script which draws a translucent blue square on top of a translucent red square (both on top of an opaque white background):

local g = golly()
local ov = g.overlay
ov("create 100 80")
ov("fill")
ov("blend 1")
ov("rgba 255 0 0 128")
ov("fill 10 10 50 50")
ov("rgba 0 0 255 128")
ov("fill 30 20 50 50")
blend 1
blend 0

The left image shows the resulting overlay. The right image shows the overlay produced by the same script but with the "blend 1" line removed (the grid lines are from the layer underneath the overlay).

Note that drawing with alpha blending on is significantly slower than drawing with it off, so it's a good idea to only turn it on when necessary. The overlay commands that can do alpha blending are: ellipse, fill, flood, line, lines, load, paste, scale, set.

 
Using clips

Overlay scripts can use multiple "clipboards" called clips. A clip is simply a chunk of memory containing a rectangular area of pixels. Each clip has a unique name consisting of any characters except a space. Clips can be created using three commands: create, copy and text. Clips can be the render target for any of the drawing commands.

The following script illustrates the use of clips. It creates a tiled background pattern on which some translucent text is drawn. The image on the right shows the resulting overlay.

local g = golly()
local ov = g.overlay
ov("create 199 177")
ov("rgba 255 255 0 255")
ov("fill")
-- create the tile
ov("rgba 0 0 0 255")
ov("line 10 0 0 20")
ov("line 10 0 20 20")
ov("line 0 20 20 20")
ov("rgba 200 200 255 255")
ov("flood 10 10")
ov("copy 0 0 21 21 mytile")
-- tile the overlay
for y = 0, 177, 21 do
   for x = 0, 199, 21 do
      ov("paste "..x.." "..y.." mytile")
   end
end
-- create some translucent red text
ov("rgba 255 0 0 180")
ov("font 60 roman-bold")
ov("text mytext Golly")
ov("blend 1")
ov("paste 10 10 mytext")

 
Affine transformations

The transform command allows a limited set of affine transformations, namely rotation by multiples of 90 degrees and reflection about the x, y or diagonal axes. The following script shows how text can be rotated or reflected. Instead of using explicit transform commands it uses mnemonic synonyms defined in the oplus package. The image on the right shows the resulting overlay.

local g = golly()
local ov = g.overlay
local op = require "oplus"
ov("create 200 380")
ov("fill")
ov("blend 1")
ov("font 12 default-bold")
-- do rotations
ov("rgba 0 0 255 255")
ov("text temp ROTATE")
ov("set 100 100")
ov("paste 100 100 temp")
ov(op.rcw)
ov("paste 100 100 temp")
ov(op.racw)
ov("paste 100 100 temp")
ov(op.r180)
ov("paste 100 100 temp")
-- do reflections
ov("rgba 255 0 0 255")
ov(op.identity)
ov("text temp - REFLECT")
ov("set 100 270")
ov("paste 100 270 temp")
ov(op.flip_x)
ov("paste 100 270 temp")
ov(op.flip_y)
ov("paste 100 270 temp")
ov(op.swap_xy)
ov("paste 100 270 temp")
ov(op.swap_xy_flip)
ov("paste 100 270 temp")

 
Cell view

A cell view is a flexible way of displaying cells from the universe onto the overlay. A number of steps are required:

  1. Use the cellview command to specify the rectangle of cells from the universe that you want to display.
  2. Either use the current pattern colors or pick a theme with the theme command.
  3. Use the camera and celloption commands to determine how you want to project the cells onto the overlay.
  4. Whenever cells change in the universe you should use the updatecells command to refresh the cell view.
  5. To draw the cells onto the overlay use the drawcells command. If the cells don't change and you want to change the camera or theme then just use drawcells after the appropriate camera and theme commands.

Here is a simple example:

-- create an overlay the size of the current layer
local g = golly()
local ov = g.overlay
local viewwd, viewht = g.getview(g.getlayer())
ov("create "..viewwd.." "..viewht)
-- open example pattern
g.open(g.getdir("app").."Patterns/Life/Methuselahs/rabbits.lif")
-- create a cell view using a theme
ov("cellview -256 -256 512 512")
ov("theme 0 255 255 255 255 255 0 0 255 0 0 47 0 0 0")
-- set camera 14.5x zoom and 30 degree rotation
ov("camera zoom 14.5")
ov("camera angle 30")
ov("drawcells")
ov("update")
-- run for 1000 generations
for i = 1, 1000 do
    g.run(1)
    ov("updatecells")
    ov("drawcells")
    ov("update")
end
-- delete the overlay
ov("delete")

To see the above script in action, select and copy the lines to the clipboard, then select Run Clipboard from the File menu. For a more complex example see lifeviewer.lua.

 
The oplus package

The oplus package provides a high-level interface to the overlay commands which implement graphics, text, user interface and utility functions. The package consists of a set of .lua files stored in the Scripts/Lua/oplus directory. The following functions are available after a script calls local op = require "oplus" (see init.lua for the implementation details).

Graphics commands

op.draw_line(x1, y1, x2, y2)
Draw a line from x1,y1 to x2,y2.
Example: op.draw_line(0, 0, 10, 10)

op.fill_ellipse(x, y, w, h, borderwd, fillrgba)
Draw an ellipse (or circle) inside the given rectangle. If borderwd is greater than zero then an antialiased ellipse of the given thickness is drawn using the current color. If fillrgba is not an empty string then the ellipse is filled with the given color.
Example: op.fill_ellipse(200, 450, 140, 99, 2, "rgba 255 255 0 200")

op.fill_rect(x, y, wd, ht)
Draw a filled rectangle with its top left corner at x,y and of the given width and height.
Example: op.fill_rect(0, 0, 40, 30)

op.round_rect(x, y, w, h, radius, borderwd, fillrgba)
Draw a rounded rectangle where the given radius determines the curvature of each corner. If borderwd is greater than zero then an antialiased border of the given thickness is drawn using the current color. If fillrgba is not an empty string then the rectangle is filled with the given color.
Example: op.round_rect(200, 300, 60, 30, 15, 0, "rgba 255 0 0 128")

Text commands

op.minbox(clipname, wd, ht)
Find the minimal bounding box of non-transparent pixels in the given clip. This can be used to determine the real dimensions of some text. If all pixels in the clip are transparent then the returned values are all zero.
Example: local minx, miny, minwd, minht = op.minbox("textclip", 80, 10)

op.maketext(text, clipname, color, shadowx, shadowy, shadowcolor)
A simpler and more powerful way of creating text that can then be drawn with pastetext. Only the first argument, text, is required.
Example:
-- draw the string "Hello World" at 0, 0 on the current render target
op.maketext("Hello World")
op.pastetext(0, 0)

Usually the text clip is created using the current rgba values. This can be overridden by specifying the color argument. The text may also be given a shadow at a specific x, y pixel offset defined with the shadowx and shadowy arguments. The shadow will be drawn in opaque black unless a different color is specified with the shadowcol argument.
Example:
-- create a clip named "hello" with the text "Hello World" in blue with a yellow shadow offset by -1, -2 pixels.
local w, h = op.maketext("Hello World", "hello", op.blue, -1, -2, op.yellow)

The function returns the width and height of the created clip (including any shadow).

op.pastetext(x, y, transform, clipname)
Paste text onto the current render target. Only the first two arguments x, y are required. Returns the clip name.
Example:
-- paste a text clip at 0, 0 on the current render target
local textclip = op.pastetext(0, 0)

The transform argument can be used to specify an affine transformation. The clipname may be used to specify a non-default clipname.
Example:
-- paste the clip named "hello" at 0, 0 and rotated clockwise on the current render target
op.pastetext(0, 0, op.rcw, "hello")

User interface commands

op.button(label, onclick)
Create and return a table representing a button. The button width depends on the given label text. If the op.process function detects a click in this button then the given onclick function will be called.
Example: cancel_button = op.button("Cancel", g.exit)

The button will only appear after its show function is called.
Example: cancel_button.show(10, 10)

op.checkbox(label, labelrgba, onclick)
Create and return a table representing a check box. The label text will be drawn using the given color to the right of a tickable button. If the op.process function detects a click in this check box (including the label) then the given onclick function will be called.
Example: line_box = op.checkbox("Show lines", op.black, toggle_lines)

The check box will only appear after its show function is called.
Example: line_box.show(10, 40, true)

op.radiobutton(label, labelrgba, onclick)
Create and return a table representing a radio button. The label text will be drawn using the given color to the right of a radio button. If the op.process function detects a click in this radio button (including the label) then the given onclick function will be called.
Example:
draw_option = op.radiobutton("Draw", op.black, set_draw_mode)
select_option = op.radiobutton("Select", op.black, set_select_mode)
move_option = op.radiobutton("Move", op.black, set_move_mode)

The radio button will only appear after its show function is called.
Example:
draw_option.show(10, 40, mode == "draw")
select_option.show(10, 40, mode == "select")
move_option.show(10, 40, mode == "move")

op.slider(label, labelrgba, barwidth, minval, maxval, onclick)
Create and return a table representing a slider. The label text will be drawn using the given color to the left of the slider's horizontal bar. The bar width must be greater than 0. The minimum and maximum values of the slider can be any integer values, as long as minval is less than maxval. If the op.process function detects a click in this slider, and the slider value has changed, then the given onclick function will be called.
Example: red_slider = op.slider("Red:", op.black, 64, 0, 255, new_red)

The slider will only appear after its show function is called.
Example: red_slider.show(10, 70, 255)

op.menubar()
Create and return a table representing a menu bar. You can then use its addmenu function to add menus to the menu bar, then the additem function to append items to these menus. If the op.process function detects a click in this menu bar then it will track the mouse and call the specified callback function if a menu item is selected.
Example:
mbar = op.menubar()
-- add some menus
mbar.addmenu("File")
mbar.addmenu("Edit")
-- add items to File menu
mbar.additem(1, "New Pattern", NewPattern)
mbar.additem(1, "Open Pattern...", OpenPattern)
mbar.additem(1, "Save Pattern...", SavePattern)
mbar.additem(1, "---", nil) -- separator
mbar.additem(1, "Exit", g.exit)
-- add items to Edit menu
mbar.additem(2, "Undo", Undo)
mbar.additem(2, "Redo", Redo)

The menu bar will appear when its show function is called. Menu items can be enabled or disabled using the enableitem function, and ticked or unticked using the tickitem function.
Example:
mbar.enableitem(2, 1, CanUndo())
mbar.enableitem(2, 2, CanRedo())
mbar.show(0, 0, 600, 30)

op.process(event)
Process the given event (normally the string returned by a getevent command). If it detects a click in a previously created button, check box or slider then it will call the appropriate onclick function and return an empty string to indicate the event was handled, otherwise it returns a copy of the given string so the caller can process the event.
Example: local event = op.process( g.getevent() )

op.popupmenu()
Create and return a table representing a pop-up menu. You can then use its additem function to append an item with a given label and a callback function that will be called if the user selects the item.
Example:
editmenu = op.popupmenu()
editmenu.additem("Cut", CutSelection)
editmenu.additem("Copy", CopySelection)
editmenu.additem("Clear", ClearSelection)
editmenu.additem("---", nil)
editmenu.additem("Paste", PasteClipboard)

The pop-up menu will appear when its show function is called (note that you need to pass in the overlay's width and height).
Example:
editmenu.setbgcolor("rgba 0 128 0 255") -- dark green background
editmenu.show(mousex, mousey, ovwd, ovht)

Utility commands

op.hexrule()
Return true if the current rule uses a hexagonal neighborhood.
Example: if op.hexrule() then do_hex_stuff() end

The oplus package also defines a number of synonyms for some frequently used overlay commands.

Opaque colors:

op.white = "rgba 255 255 255 255"
op.gray = "rgba 128 128 128 255"
op.black = "rgba 0 0 0 255"
op.red = "rgba 255 0 0 255"
op.green = "rgba 0 255 0 255"
op.blue = "rgba 0 0 255 255"
op.cyan = "rgba 0 255 255 255"
op.magenta = "rgba 255 0 255 255"
op.yellow = "rgba 255 255 0 255"

Affine transformations:

op.identity = "transform 1 0 0 1"
op.flip = "transform -1 0 0 -1"
op.flip_x = "transform -1 0 0 1"
op.flip_y = "transform 1 0 0 -1"
op.swap_xy = "transform 0 1 1 0"
op.swap_xy_flip = "transform 0 -1 -1 0"
op.rcw = "transform 0 -1 1 0"
op.rccw = "transform 0 1 -1 0"
op.racw = op.rccw
op.r180 = op.flip

Themes:

op.theme0 = "theme 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0"
op.theme1 = "theme 0 255 255 255 255 255 0 0 255 0 0 47 0 0 0"
op.theme2 = "theme 255 144 0 255 255 0 160 0 0 32 0 0 0 0 0"
op.theme3 = "theme 0 255 255 255 255 255 0 128 0 0 24 0 0 0 0"
op.theme4 = "theme 255 255 0 255 255 255 128 0 128 0 47 0 0 32 128"
op.theme5 = "theme 176 176 176 255 255 255 104 104 104 16 16 16 0 0 0"
op.theme6 = "theme 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255"
op.theme7 = "theme 0 0 255 0 0 0 0 255 255 240 240 240 255 255 255"
op.theme8 = "theme 240 240 240 240 240 240 240 240 240 240 240 240 0 0 0"
op.theme9 = "theme 240 240 240 240 240 240 160 0 0 160 0 0 0 0 0"

You can also access the themes via an array: local mytheme = op.themes[2].

For a good example of how to use the oplus package, see the 3D.lua script. golly-3.3-src/Help/tips.html0000644000175000017500000001162213230774246012762 00000000000000 Golly Help: Hints and Tips

Some useful hints and tips

  • Avoid the temptation to put your own patterns, scripts or rules inside Golly's supplied folders — it will make it difficult to upgrade to a future version. A much better idea is to create separate folders for your own files and put those folders alongside the supplied folders, so your Golly folder looks something like this:

    Golly
        Golly.exe (Golly.app on Mac, golly on Linux)
        Help
        Patterns
        Rules
        Scripts
        My-downloads (contains all your downloaded files; set in Preferences > File)
        My-patterns (contains all your pattern files)
        My-rules (contains all your .rule files; set in Preferences > Control)
        My-scripts (contains all your .lua/.py files)

    If necessary, use File > Set File Folder and select the Golly folder. Now all your folders (and the supplied folders) are visible in the file panel, so with just a few clicks you can load any pattern, run any script, or switch to any .rule file. You can also right-click (or control-click) on any of those files to open them in your preferred text editor.

    When upgrading to a new version of Golly, Mac users can simply drag all the distributed files and folders into their Golly folder and the old versions will be replaced. On Windows and Linux you'll need to delete the old Help, Patterns, Rules and Scripts folders before dragging in the new folders to avoid ending up with merged versions.

  • For better performance you should consider opening Preferences > Control and increasing the maximum memory size used by the various hash-based algorithms. The maximum size depends on the amount of physical memory in your machine and the typical usage of that machine while Golly is running. A good place to start is 50% of your physical memory. If your machine has less RAM or is used for internet browsing or other memory-hungry applications, you might lower this to 25% of physical memory; if your machine is a server and Golly will usually be running by itself, then 80% of physical memory may be appropriate. More memory is better, but your machine should never go into swap or start using automatic memory compression.
  • To view a pattern file you can drop it onto the Golly app or onto the Golly window if the app is already running.
  • When Golly starts up it looks for scripts called golly-start.lua or golly-start.py in the same directory as the Golly application and then in a user-specific data directory (see the Preferences item for the likely path on your system). If either script is found then it is automatically executed.
  • Displaying the population count can cause a significant slow-down when generating large patterns, especially when using HashLife. You can disable the population count by unticking the Show Population option in the Control menu, or you can toggle it by clicking in the "Population=..." text. Another alternative is to hit ";" to hide the status bar. You can toggle the status bar at any time, even in full screen mode.
  • Editing operations are fastest in QuickLife.
  • Pasting large, sparse patterns is much faster if using Or mode, or if the current pattern is empty, or if the paste rectangle is completely outside the current pattern edges.
  • The hand cursor can be used to scroll the view by clicking and dragging. If you drag the cursor outside any view edge then scrolling will occur continuously; ie. you don't have to move the cursor. If the cursor is outside any corner (ie. outside two edges) then the scrolling direction will be diagonal. Actually, continuous scrolling also occurs if the hand cursor is dragged onto any view edge or corner. This allows such scrolling to occur in full screen mode.
  • While dragging the mouse to make (or modify) a selection, the escape key can be used to cancel the operation and restore the original selection.
golly-3.3-src/Help/formats.html0000644000175000017500000011741513111767235013463 00000000000000 Golly Help: File Formats

Here are the important file formats used by Golly:

Extended RLE format (.rle)
Macrocell format (.mc)
Rule format (.rule)
     @RULE
     @TABLE
     @TREE
     @COLORS
     @ICONS
          Specifying icons using XPM
          Grayscale icons or multi-color icons
          Requesting built-in icons
          Tools for creating icons
     How Golly finds .rule files
     Related rules can share colors and/or icons
     How to override a supplied or built-in rule
     The easy way to install a new .rule file
     Deprecated files (.table, .tree, .colors, .icons)
Zip files (.zip)

 
Extended RLE format

Golly prefers to store patterns and pattern fragments in a simple concise textual format we call "Extended RLE" (it's a modified version of the RLE format created by Dave Buckingham). The data is run-length encoded which works well for sparse patterns while still being easy to interpret (either by a machine or by a person). The format permits retention of the most critical data:

  • The cell configuration; ie. which cells have what values.
  • The transition rule to be applied.
  • Any comments or description.
  • The generation count.
  • The absolute position on the screen.

Golly uses this format for internal cuts and pastes, which makes it very convenient to move cell configurations to and from text files. For instance, the r-pentomino is represented as

x = 3, y = 3, rule = B3/S23
b2o$2o$bo!

I just drew this pattern in Golly, selected the whole thing, copied it to the clipboard, and then in my editor I did a paste to get the textual version. Similarly, data in this format can be cut from a browser or email window and pasted directly into Golly.

RLE data is indicated by a file whose first non-comment line starts with "x". A comment line is either a blank line or a line beginning with "#". The line starting with "x" gives the dimensions of the pattern and usually the rule, and has the following format:

x = width, y = height, rule = rule

where width and height are the dimensions of the pattern and rule is the rule to be applied. Whitespace can be inserted at any point in this line except at the beginning or where it would split a token. The dimension data is ignored when Golly loads a pattern, so it need not be accurate, but it is not ignored when Golly pastes a pattern; it is used as the boundary of what to paste, so it may be larger or smaller than the smallest rectangle enclosing all live cells.

Any line that is not blank, or does not start with a "#" or "x " or "x=" is treated as run-length encoded pattern data. The data is ordered a row at a time from top to bottom, and each row is ordered left to right. A "$" represents the end of each row and an optional "!" represents the end of the pattern.

For two-state rules, a "b" represents an off cell, and a "o" represents an on cell. For rules with more than two states, a "." represents a zero state; states 1..24 are represented by "A".."X", states 25..48 by "pA".."pX", states 49..72 by "qA".."qX", and on up to states 241..255 represented by "yA".."yO". The pattern reader is flexible and will permit "b" and "." interchangeably and "o" and "A" interchangeably.

Any data value or row terminator can be immediately preceded with an integer indicating a repetition count. Thus, "3o" and "ooo" both represent a sequence of three on cells, and "5$" means finish the current row and insert four blank rows, and start at the left side of the row after that.

The pattern writer attempts to keep lines about 70 characters long for convenience when sharing patterns or storing them in text files, but the reader will accept much longer lines.

If the File menu's "Save Extended RLE" option is ticked then comment lines with a specific format will be added at the start of the file to convey extra information. These comment lines start with "#CXRLE" and contain keyword/value pairs. The keywords currently supported are "Pos", which denotes the absolute position of the upper left cell (which may be on or off), and "Gen", which denotes the generation count. For instance,

#CXRLE Pos=0,-1377 Gen=3480106827776

indicates that the upper left corner of the enclosing rectange is at an X coordinate of 0 and a Y coordinate of -1377, and that the pattern stored is at generation 3,480,106,827,776.

All comment lines that are not CXRLE lines, and occur at the top or bottom of the file, are treated as information lines and are displayed when the user clicks the "information" button in Golly's tool bar. Any comment lines interspersed with the pattern data will not be displayed.

 
Macrocell format

The size of an Extended RLE file is frequently proportional to the number of cells it contains, yet Golly supports universes that can contain trillions of cells or more, using hashlife-based algorithms. The storage of these huge universes, for which Extended RLE is not feasible, is done by essentially dumping the in-memory compressed representation of the universe in "Macrocell format". Since little translation need be done between external and internal representation, this format is also used to store backups of universes at certain points in Golly's operation when using one of the hashlife-based algorithms.

The macrocell format has two parts: the header, and the tree. The first portion of the file is the header; this contains the format identifier, the rule, the generation count (if non-zero), and any comments associated with this file. The format identifier is a line that starts with "[M2]" and contains the name and version of the program used to write it:

[M2] (golly 2.0)

Following this is any comment lines, which are lines that begin with '#'. If the first two characters of a line are '#R', then the remainder of the line (after intervening whitespace) is the rule for the pattern. If the first two characters are '#G', then the remainder of the line is the current generation count. Any other line starting with a '#' is treated as an ordinary comment line.

Following the header is is a child-first textual representation of a canonicalized quadtree. Each line is either a leaf node, or a non-leaf node. For two-state algorithms, the leaf nodes contain an 8x8 pixel array in a simplified raster format, left-to-right, then top-down, with "." representing an empty cell, "*" representing a live cell, and "$" representing the end of line; empty cells at the end of each row are suppressed. No whitespace is permitted; lines representing leaf nodes for two-state algorithms are recognized because they start with ".", "*", or "$". A sample leaf node containing a glider is:

$$..*$...*$.***$$$$

For algorithms with more than two states, leaf nodes represent a two-by-two square of the universe. They contain five integers separated by single spaces; the first integer is 1, and the next four are the state values for the northwest, northeast, southwest, and southeast values of the square.

Nodes with children are represented by lines with five integers. The first integer is the logarithm base 2 of the size of the square this node representes; for two-state patterns, this must be 4 or larger; for multi-state patterns, this must be 2 or larger. The next four values are the node numbers of the northwest, northeast, southwest, and southeast child nodes. Each of these child nodes must be the appropriate size; that is, a square one fourth the area of the current node.

All nodes, both leaf and non-leaf, are numbered in the order they occur in the file, starting with 1. No node number can point to a node that has yet been defined. The special node number "0" is used to represent all squares that have no live cells.

The total universe represented by a macrocell file is that of the last node in the file (the root node), which also must be the single node with the largest size. By convention, the upper left cell of the southeast child of the root node is at coordinate position (x=0,y=1).

Macrocell files saved from two-state algorithms and from multi-state algorithms are not compatible.

 
Rule format

A .rule file contains all the information about a rule: its name, documentation, table/tree data (used by the RuleLoader algorithm), and any color/icon information. The .rule format is textual and consists of one or more sections. Each section starts with a line of the form @XXX... where X is an uppercase letter. If there is more than one section with the same name then only the first one is used. Any unrecognized sections are silently ignored (this will allow us to add new sections in the future without breaking old versions of Golly).

The currently recognized sections are described below. You might like to refer to WireWorld.rule while reading about each section.

 
@RULE

This is the only mandatory section. The first line of a .rule file must start with @RULE followed by a space and then the rule name. For example:

@RULE WireWorld

The supplied rule name must match exactly the name of the .rule file. This helps Golly to avoid problems that can occur on case-sensitive file systems. When naming a new rule it's best to stick to the following conventions, especially if you'd like to share the .rule file with other Golly users:

  • Please capitalize all rule names and create files like Foo.rule rather than foo.rule. This helps to emphasize that rule names are important, especially on case-sensitive file systems. If the rule "foo" is specified inside a .rle or .mc file then Golly won't be able to find Foo.rule on a case-sensitive system like Linux.
  • To allow for possible future extensions in the way Golly handles rule names, it's best to use only letters and digits. Hyphens and underscores are also okay if you need some sort of separator. Hyphens can allow a set of related rules to share colors and/or icons (see below). Note in particular that spaces and colons must not be used.

After the @RULE line and before the next section (or end of file) you can include any amount of arbitrary text, so this is the place to include a description of the rule or any other documentation. If the .rule file has a @TREE section then this is a good place to put the Python transition function that was used to create the tree data.

 
@TABLE

This section is optional. If present, it contains a transition table that can be loaded by the RuleLoader algorithm. The contents of this section is identical to the contents of a .table file. A detailed specification of the .table format is available here. This is a simple example:

# Signals (2/3) pass alongside a wire (1):
n_states:4
neighborhood:vonNeumann
symmetries:rotate4
var a={2,3}
var b={2,3}
var c={2,3}
a,0,b,1,c,b

Empty lines and anything following the hash symbol "#" are ignored. The following descriptors must appear before other content:

  • n_states: specifies the number of states in the CA (from 0 to n_states-1 inclusive).
  • neighborhood: specifies the cell neighborhood for the CA update step. Must be one of: vonNeumann, Moore, hexagonal, oneDimensional.
  • Other neighborhoods are supported through emulation, using RuleTableToTree.py, see the RoadMap for a full list.
  • symmetries: can be none, permute or one of the symmetries supported for the neighborhood you have chosen. For a full list, see the RoadMap.

After the descriptors comes the variables and transitions. Each variable line should follow the form given in the above example to list the states. Variables should appear before the first transition that uses them. Variables can be used inside later variables.

Transition lines should have states or variables separated by commas. If there are no variables and n_states is less than 11 then the commas can be omitted. Only one transition (or variable) should appear on each line. Inputs are listed in the order C,N,E,S,W,C' for the von Neumann neighborhood, C,N,NE,E,SE,S,SW,W,NW,C' for the Moore neighborhood, C,N,E,SE,S,W,NW,C' for the hexagonal neighborhood, and C,W,E,C' for the oneDimensional neighborhood.

Where the same variable appears more than once in a transition, it stands for the same state each time. For example, the transition in the example above expands to the following: 20212->2, 20213->2, 20312->3, 20313->3, 30212->2, 30213->2, 30312->3, 30313->3, and all 90-degree rotations of those (because of the rotate4 symmetry).

A transition can have a variable as its output (C') if that variable appears more than once in the transition (as in the example above), so that it has a definite value.

Rule tables usually don't specify every possible set of inputs. For those not listed, the central cell remains unchanged.

Transition rules are checked in the order given — the first rule that matches is applied. If you want, you can write rules in the form of general cases and exceptions, as long as the exceptions appear first.

(This form of CA rule table representation was inspired by that in Gianluca Tempesti's PhD thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html.)

If you have a C/C++ implementation of a transition function, there is a way to automatically produce a rule table. See Rules/TableGenerators/make-ruletable.cpp for instructions.

To share your rule tables with others, you can archive them at the public Rule Table Repository.

 
@TREE

This section is optional. If present, it contains a rule tree that can be loaded by the RuleLoader algorithm. (If the .rule file also contains a @TABLE section, RuleLoader will use the first one it finds.) The contents of this section is identical to the contents of a .tree file.

A detailed description of a rule tree is provided below, but most people don't need to know these details because Golly provides a number of tools for creating rule trees. The make-ruletree.py script in Scripts/Python/Rule-Generators can convert a Python transition function (passed via the clipboard) into a rule tree. The script will either create a new .rule file or update the @TREE section in an existing .rule file. Another script, RuleTableToTree.py, does much the same job using a requested .table file as input.

Golly also includes programs that permit you to transform a given transition function in C++, Lua, Python, Perl, or Java into a .tree file (see Rules/TreeGenerators) if the number of states is sufficiently small (approximately 10 states for eight-neighbor rules, and 32 states for four-neighbor rules). The contents of the .tree file can then be copied into the @TREE section of your .rule file.

Essentially, the tree format allows you to add your own rules to Golly without needing to know how to recompile Golly and without dealing with the intricacies of external libraries; it generates relatively compact files, and the data structure is designed for very fast execution.

A rule tree is nothing more than a complete transition table for a rule, expressed in a compressed, canonicalized tree format. For an n state rule, each tree node has n children; each child is either another tree node or a next state value. To look up a function of m variables, each of which is a state value, you start at the root node and select the child node corresponding to the value of the first variable. From that node, you select the child node corresponding to the value of the second variable, and so on. When you finally look up the value of the final variable in the last node, the result value is the actual next state value, rather than another node.

The tree format has fixed the order of variables used for these lookups. For a four-neighbor rule, the order is always north, west, east, south, center; for an eight-neighbor rule, the order is always northwest, northeast, southwest, southeast, north, west, east, south, center.

Without compression, for an n-state rule, there would be a total of 1+n+n^2+n^3+n^4 nodes for a four-neighbor rule, and 1+n+...+n^8 for an eight-neighbor rule; this could quickly get unmanageable. Almost all rules show significant redundancy, with identical rows in the transition table, and identical nodes in the rule tree. To compress this tree, all we do is merge identical nodes, from the bottom up. This can be done explicitly as we construct the tree from a transition function (see Rules/TreeGenerators/RuleTreeGen.java) or symbolically as we evaluate a more expressive format.

The tree format itself is simple, and has similarities to the macrocell format. It is not intended for human authorship or consumption. The tree format has two parts: a header, and the rule tree itself. The header consists of comments (lines starting with a "#") that are ignored, and three required parameter values that must be defined before the first tree node. These values are defined, one per line, starting with the parameter name, then an equals sign, and finally an integer value. The three parameters are num_states, which must be in the range 2..256 inclusive, num_neighbors, which must be 4 or 8, and num_nodes, which must match the number of node lines.

The tree is represented by a sequence of node lines. Each node line consists of exactly num_states+1 integers separated by single spaces. The first integer of each node line is the depth of that node, which must range from 1..num_neighbors+1. The remaining integers for nodes of depth one are state values. The remaining integers for nodes of depth greater than one are node numbers. Nodes are numbered in the order they appear in the file, starting with zero; each node must be defined before its node number is used. The root node, which must be the single node at depth num_neighbors+1, must be the last node defined in the file.

 
@COLORS

This section is optional and can be used to specify the RGB colors for one or more states using lines with 4 numbers, like these:

0  48  48  48   dark gray
1   0 128 255   light blue
2 255 255 255   white
3 255 128   0   orange

Golly silently ignores any states that are invalid for the rule. To specify a color gradient for all live states (all states except 0) you can use a line with 6 numbers, like this:

0 0 255  255 0 0   blue to red

In both cases, any text after the final number on each line is ignored. Blank lines or lines starting with "#" are also ignored.

Note that a .rule file is loaded after switching to the current algorithm's default color scheme, so you have the choice of completely changing all the default colors, or only changing some of them. Use Preferences > Color to change the default colors for each algorithm.

 
@ICONS

This section is optional and can be used to override the default icons displayed for this rule (when Golly is in icon mode).

 
Specifying icons using XPM

Icon bitmaps can be specified using a simple subset of the XPM format. Here's a small example that describes two 7x7 icons suitable for a 3-state rule (icons are never used for state 0):

XPM
/* width height num_colors chars_per_pixel */
"7 14 2 1"
/* colors */
". c #000000"
"A c #FFFFFF"
/* icon for state 1 */
"A......"
".A....."
"..A...."
"...A..."
"....A.."
".....A."
"......A"
/* icon for state 2 */
"......A"
".....A."
"....A.."
"...A..."
"..A...."
".A....."
"A......"

Any blank lines or lines starting with "#" or "/" are ignored. A line with XPM by itself indicates the start of a set of icon bitmaps at a particular size. The @ICONS section can contain any number of XPM subsections, and their order is not important. Three different icon sizes are currently supported: 7x7, 15x15 and 31x31 (for displaying at scales 1:8, 1:16 and 1:32 respectively). Any missing icon sizes will be created automatically by scaling a supplied size. Scaled icons can look rather ugly, so if you want good looking icons it's best to supply all three sizes.

After seeing an XPM line, Golly then looks for lines containing strings delimited by double quotes. The first double quote must be at the start of the line (any text after the second double quote is ignored). The first string contains crucial header information in the form of 4 positive integers:

  • The 1st number is the bitmap's width which also defines the icon size. If it is not 7, 15 or 31 then Golly simply ignores the rest of the XPM data. (This provides upward compatibility if we ever decide to support more sizes.)
  • The 2nd number is the bitmap's height. This must be an integer multiple of the width — the number of icons is the height divided by the width.
  • The 3rd number is the total number of different colors used in the bitmap. After the first string comes the strings that specify each color.
  • The 4th number is the number of characters used to specify each pixel and must be 1 or 2. After the color strings comes the strings with the pixel data for each row of the bitmap. Each such string should contain width × chars_per_pixel characters.

The total number of strings after the XPM line should be 1 + num_colors + height. You'll get an error message if there aren't enough strings. Any extra strings are ignored.

The 1st icon specified is for state 1, the 2nd is for state 2, etc. If the number of icons supplied is fewer than the number of live states then the last icon is automatically duplicated. If there are more icons than required then the extra icons are simply ignored.

 
Grayscale icons or multi-color icons

Golly recognizes two types of icons: grayscale or multi-color. Grayscale icons only use shades of gray (including black and white), as in the above example. Any black areas will be transparent; ie. those pixels will be replaced by the color for state 0. White pixels will be replaced by the color for the cell's current state. Gray pixels are used to do anti-aliasing; ie. the darker the gray the greater the transparency. Using grayscale icons minimizes the amount of XPM data needed to describe a set of icons, especially if the icons use the same shape for each state (as in WireWorld.rule).

If a set of icons contains at least one color that isn't a shade of gray (including black or white) then the icons are said to be multi-colored. Any black pixels are still converted to the state 0 color, but non-black pixels are displayed without doing any substitutions.

If you want to use multi-colored icons then you'll probably want a @COLORS section as well so that the non-icon colors match the icon colors as closely as possible. For example, if the icon for state 1 consists of red and blue triangles then it would be best to set the color of state 1 to purple in the @COLORS section. This minimizes "color shock" when switching between icon and non-icon display mode.

 
Requesting built-in icons

Instead of specifying icon bitmaps using XPM data, you might prefer to use Golly's built-in grayscale icons by supplying one of the following words on a line by itself:

  • circles — circular icons (normally used for Moore neighborhood rules).
  • diamonds — diamond-shaped icons (normally used for von Neumann neighborhood rules).
  • hexagons — hexagonal icons (normally used for hexagonal neighborhood rules).
  • triangles — triangular icons (only suitable for a 4-state rule that is emulating a triangular neighborhood).

 
Tools for creating icons

One way to create XPM icons is to use a painting application that can write .xpm files. Their contents can then be pasted into a .rule file with a small amount of editing.

Another way is to use two Python scripts called icon-importer.py and icon-exporter.py (both can be found in Scripts/Python/Rule-Generators). These scripts allow Golly to be used as an icon editor. Here's how:

Step 1: Switch to the rule whose icons you wish to change or create and then run icon-importer.py. This will create a new layer called "imported icons for rulename" (the name will be used by icon-exporter.py, so don't change it). The script searches for rulename.rule in your rules folder, then in the supplied Rules folder. If found, it extracts any @ICONS data and displays the icon bitmaps in gray boxes. The location of these boxes will be used by icon-exporter.py, so don't move them.

If the @ICONS data is missing icons at a particular size then the script creates them by scaling up or down an existing set of icons. For example, missing 31x31 icons will be created by scaling up the 15x15 icons.

The new layer uses a Generations rule with the maximum number of states (//256) so we can have lots of colors. The initial palette contains a grayscale gradient from white to black, followed by the colors used in the imported icons (if any), followed by three rainbow gradients (bright, pale, dark). You can change these colors by using Layer > Set Layer Colors.

Step 2: Edit the icon bitmaps using Golly's editing capabilities. Golly isn't as powerful as a full-blown painting app, but hopefully it's sufficient for such small images.

Step 3: When you've finshed editing, run icon-exporter.py. This script will extract the icon data and create a suitable @ICONS section in rulename.rule in your rules folder (the script will never create or modify a .rule file in the supplied Rules folder). If rulename.rule already exists in your rules folder then the script replaces any existing @ICONS section (and any @COLORS section if the icons are multi-color) so it won't clobber any other info in the file.

If rulename.rule doesn't exist in your rules folder then it will be created. This file won't have any @TABLE or @TREE section, but that's perfectly valid. It means either the rule is built-in (ie. recognized by a non-RuleLoader algorithm), or else rulename.rule also exists in the supplied Rules folder and so the RuleLoader algorithm will use that file when it can't find any @TABLE or @TREE section in the .rule file in your rules folder.

Finally, icon-exporter.py creates a new layer called "icon test" which uses the original rule and displays a simple pattern containing all live states so you can check what the new icons look like.

 
How Golly finds .rule files

There are two situations where Golly needs to look for a .rule file:

1. If the RuleLoader algorithm is asked to switch to a rule called "Foo" then it first looks for Foo.rule in your rules folder. If not found, or if Foo.rule has no @TABLE or @TREE section, it will then look for Foo.rule in the supplied Rules folder. If Foo.rule doesn't exist then it will use the same search procedure to look for Foo.table, then Foo.tree.

2. After switching to a new rule (not necessarily using RuleLoader), Golly needs to look for color and/or icon information specific to that rule. A similar search procedure to the one above is used again, where this time Golly looks for any @COLORS and/or @ICONS sections in Foo.rule. (Unlike the above search, if Foo.rule is found in your rules folder but doesn't have any color/icon info then Golly will not look for Foo.rule in the Rules folder.)

Note that the 2nd search always occurs after clicking OK in the Control menu's Set Rule dialog, even if the current rule wasn't changed. This is a quick way to test changes to a .rule file.

 
Related rules can share colors and/or icons

If rulename.rule is missing either the @COLORS or @ICONS section, Golly checks to see if rulename contains a hyphen. If it does then it looks for the missing color/icon data in another .rule file called prefix-shared.rule where prefix consists of all the characters before the final hyphen. (As in the above searches, it looks in your rules folder first, then in the supplied Rules folder.) This allows related rules to share a single source of colors and/or icons.

For example, suppose you have a set of related rules in files called Foo-1.rule, Foo-2.rule, etc. If you want all these rules to use the same colors then create a file called Foo-shared.rule:

@RULE Foo-shared
This file contains the colors shared by Foo-* rules.

@TABLE
n_states:3
neighborhood:Moore
symmetries:none
# do nothing

@COLORS
0 0 0 0     black
1 255 0 0   red
2 0 0 255   blue

Note that a shared .rule file should contain a valid @TABLE section with an appropriate value for n_states (the neighborhood setting doesn't really matter, as long as it's legal). This allows the RuleLoader algorithm to load it, which means you can switch to the Foo-shared rule in case you want to add/edit icons using icon-importer.py.

For another good example, see Worm-shared.rule in Golly's Rules folder. It contains the icons shared by all the other Worm-* rules.

 
How to override a supplied or built-in rule

The search procedure described above makes it easy to override a supplied .rule file, either completely or partially. Note that there is never any need to add or modify files in the supplied Rules folder. For example, if you want to override the colors and icons used in the supplied WireWorld.rule then you can create a file with the same name in your rules folder. Its contents might look like this:

@RULE WireWorld

@COLORS
0 0 0 0               black background
0 255 0   255 255 0   live states fade from green to yellow

@ICONS
diamonds

It's also possible to override a built-in rule (ie. a rule recognized by an algorithm other than RuleLoader). A built-in rule name can contain characters not allowed in file names ("/" and "\"), so Golly will substitute those characters with underscores when looking for the corresponding .rule file. For example, if you want to change the colors and/or icons for Life (B3/S23) then you'll need to create a file called B3_S23.rule. This example uses a multi-colored icon to show a blue sphere on a white background:

@RULE B3_S23

Override the default colors and icons for Life (B3/S23).

@COLORS

0 255 255 255   white (matches icon background below)
1 54 54 194     dark blue (average color of icon below)

@ICONS

# 7x7 and 15x15 icons will be created by scaling down this 31x31 icon:

XPM
/* width height num_colors chars_per_pixel */
"31 31 78 2"
/* colors */
".. c #FFFFFF"   white background
"BA c #CECEDE"
"CA c #7B7BAD"
"DA c #4A4A84"
"EA c #18187B"
"FA c #08006B"
"GA c #18186B"
"HA c #29297B"
"IA c #6B6BAD"
"JA c #ADADDE"
"KA c #EFF7FF"
"LA c #ADADC6"
"MA c #39398C"
"NA c #3939BD"
"OA c #7B7BCE"
"PA c #ADB5DE"
"AB c #8C8CD6"
"BB c #4A4A9C"
"CB c #18188C"
"DB c #EFEFEF"
"EB c #EFEFFF"
"FB c #525A9C"
"GB c #08088C"
"HB c #ADADE7"
"IB c #DEDEEF"
"JB c #D6D6F7"
"KB c #DEE7F7"
"LB c #BDBDEF"
"MB c #525ABD"
"NB c #21219C"
"OB c #292984"
"PB c #CECEE7"
"AC c #ADB5CE"
"BC c #2929BD"
"CC c #7B7BDE"
"DC c #BDC6E7"
"EC c #CECEF7"
"FC c #8C8CE7"
"GC c #4242C6"
"HC c #A5A5BD"
"IC c #08087B"
"JC c #3939CE"
"KC c #5A5AC6"
"LC c #BDBDF7"
"MC c #BDBDDE"
"NC c #6B6BD6"
"OC c #9494DE"
"PC c #3931DE"
"AD c #1818AD"
"BD c #2929CE"
"CD c #9C9CC6"
"DD c #10087B"
"ED c #9C9CBD"
"FD c #1818B5"
"GD c #1818C6"
"HD c #847BCE"
"ID c #181094"
"JD c #6B6BCE"
"KD c #7B7BB5"
"LD c #2121AD"
"MD c #BDC6D6"
"ND c #0808AD"
"OD c #4A42B5"
"PD c #00009C"
"AE c #3942BD"
"BE c #3129B5"
"CE c #B5B5CE"
"DE c #0000BD"
"EE c #0000CE"
"FE c #0000DE"
"GE c #42427B"
"HE c #C6CECE"
"IE c #0000EF"
"JE c #9494AD"
"KE c #F7FFEF"
"LE c #10086B"
"ME c #7B849C"
"NE c #0000F7"
/* icon for state 1 */
".............................................................."
".............................................................."
"......................BACADAEAFAGAHAIAJA......................"
"................KALAMAFANAOAJAPAJAABBBCBEAIADB................"
"..............EBFBGBNAHBIBDBJBKAKBEBJBLBMBNBOBPB.............."
"............ACHABCCCDCECIBPBJBPBIBPBJBIBECFCGCCBCAKA.........."
"..........HCICJCKCLBLCLBMCLBLBLBLBMCLBLBMCLCNCJCCBCAKA........"
"........DBOBBCJCCCJAJAJAJAJAJAJAJAJAJAJAJAJAOCJCPCICAC........"
"......KADAADBDBCABABOCABOCOCOCOCABOCABOCABCDFCJCBDBCDDBA......"
"......EDGBFDGDADCCABOAOAOAOAOAOAOAOAHDOAHDCCCCNAADGDIDMA......"
"....KAHAADFDFDADJDMBOAJDJDJDJDJDKDJDJDJDJDJDJDLDFDFDFDICBA...."
"....MDFANDNDNDADODMBMBMBMBMBMBMBKCKCMBMBMBMBODADNDNDNDGBIA...."
"....CAGBNDPDNDPDADGCODODODODODODNAODODGCODAEBCPDNDPDNDPDGA...."
"....OBPDPDNDPDNDNDADBCBEBCBEBCBCBEBCBCBCNAADPDNDNDPDPDNDICPB.."
"....ICNDNDPDNDNDNDPDNDADADADADADADADADADNDNDNDNDNDNDNDPDGBCE.."
"....FANDNDDENDNDNDDENDDENDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDGBLA.."
"....FANDDENDDEDENDDEDENDDENDDEDEDEDEDEDEDEDEDEDEDENDDEDEGBED.."
"....GANDEEDEDEDEDEDEDEDEDEDEDEDENDDENDDEDEDEDEDEDEDEDEDEGBLA.."
"....BBPDEEDEEEDEEEDEEEDEEEDEDEDEEEDEEEDEDEDEDEDEEEDEEEDEFABA.."
"....EDGBDEEEDEEEEEEEDEEEDEEEEEEEEEEEEEEEEEEEEEEEEEDEEENDGADB.."
"....KBICDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGBDA...."
"......FBNDFEFEEEEEEEEEFEEEEEFEEEEEEEEEEEEEEEEEEEEEFEDEICHC...."
"......IBEADEFEFEEEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEDEGBGEDB...."
"........LAGBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFENDGAHE......"
"..........FBNDFEFEIEFEFEIEIEIEFEIEFEFEIEFEFEFEFEEEDDJEKE......"
"..........EBFBIDEEIEIEIEFEFEFEIEFEIEIEIEIEIEIENDLEMEKE........"
"..............CDGBDEIEIENENEIEIEIEIEIEIEIEGDPDGAJEKE.........."
"................BAOBGBADFEIENEIENEIEIEEENDFAGECEKE............"
"....................CDBBDDPDIDNDADPDICEAGEJEDB................"
"........................EBBALAEDEDHCMCDBKE...................."
".............................................................."

 
The easy way to install a new .rule file

Golly provides a quick and easy way to create a new .rule file in the right place. Simply copy the rule contents to the clipboard, then select the Open Clipboard command (in the File menu) or the Paste command (in the Edit menu). If the first line of the clipboard starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder and switch to that rule.

 
Deprecated files (.table, .tree, .colors, .icons)

Golly still supports the old rule-related files with extensions of .table, .tree, .colors and .icons, but their use is discouraged. To help speed up the transition to .rule files, Golly has a couple of handy features:

1. At the bottom of the Control menu is a new command called Convert Old Rules. This will convert all .table/tree/colors/icons files into corresponding .rule files (but existing .rule files will not be changed). The results are displayed in the help window. If the conversion succeeds you'll be asked if you want to delete the .table/tree/colors/icons files.

2. When Golly opens a .zip file containing .table/tree/colors/icons files it will automatically convert them into .rule files, but only if the zip file has no .rule files. Unlike the Convert Old Rules command, this conversion will overwrite existing .rule files (in case the zip file contents have changed).

 
Zip files

Golly can open a standard zip file and process its contents in the following way:

If the zip file is "complex" then Golly builds a temporary HTML file with special unzip links to each included file and shows the result in the help window. A complex zip file is one that contains:

  • Any folders.
  • Any rule files (.rule extension). Such files are automatically extracted and installed into your rules folder. Note that files with a .colors or .icons or .table or .tree extension are automatically converted into corresponding .rule files, but only if those .rule files aren't present in the zip file.
  • Any HTML files (.htm or .html extension).
  • Any text files (.txt or .doc extension, or a name containing "readme").
  • Multiple scripts (.lua or .pl or .py extension).
  • Multiple patterns (no extension, or one that doesn't match any of the above).

A "simple" zip file contains at most one pattern and at most one script. In this case Golly will load the pattern (if present) and then run the script (if present). For security reasons, if the zip file was downloaded via a get link then Golly will ask if you really want to run the included script. Both the pattern and the script must be at the root level of the zip file; ie. not inside a folder. For an example of such a zip file, open Langtons-ant.zip from the Patterns/WireWorld/ folder. This zip file contains a pattern file and a simple Lua script that sets up a nicer initial view and step size.

A number of pattern collections in the form of zip files can be downloaded from the online archives. golly-3.3-src/Help/problems.html0000644000175000017500000000302113543255652013622 00000000000000 Golly Help: Known Problems

This section lists all known bugs and limitations. If you come across any problems not mentioned below then please report them to Andrew Trevorrow (andrew@trevorrow.com) or Tom Rokicki (rokicki@gmail.com).

Problems on all platforms

  • All editing operations are restricted to cells whose coordinates are within +/- 1 billion.

Windows problems

  • None.

Mac problems

  • Dragging the sash (the thin vertical bar separating the file panel and the viewport) can result in ugly flashing.

Linux problems

  • Scroll bars are not updated correctly while resizing the window.
  • Golly has serious problems with Ubuntu's Unity interface. For example, selecting a modal dialog like Control > Set Rule can freeze Golly. There are also problems with overlay scrollbars. Most (all?) of the problems can be solved by disabling both the global menu bar and the overlay scrollbars. This can be done just for the golly binary by using the following alias:
    alias golly="UBUNTU_MENUPROXY=0 LIBOVERLAY_SCROLLBAR=0 ./golly"

    For more details, see this forum post.

golly-3.3-src/Help/about.html0000644000175000017500000000121313543255652013112 00000000000000


This is Golly version 3.3

© 2005-2019 The Golly Gang:
Tom Rokicki, Andrew Trevorrow, Tim Hutton, Dave Greene,
Jason Summers, Maks Verver, Robert Munafo, Chris Rowett.



Golly is an open source, cross-platform application for
exploring the Game of Life and other cellular automata.

http://golly.sourceforge.net/
golly-3.3-src/Help/images/0000755000175000017500000000000013543257425012442 500000000000000golly-3.3-src/Help/images/lifeviewer.png0000755000175000017500000004466513006227600015235 00000000000000‰PNG  IHDR2í³»nÜ IDATxœí}kŒ\UvîªîêW½ËÝívwÛí¶Ý¶Ï†c¬Ì#®”L4 Ê\Á R4Rþ ¡™_‰"ͤ(£‰l)Q2Ñ$WŠd¢Üd.£À a@6fŒ Ø`·Ýí~T?Ýu¬>Ë»ö묽Ï>UÕv²Ž««Nísªê|çÛ{=nô÷÷‡pË–-âŸ{#¨{Ú‡r=·±±±R©„‹ÄCðܵk—Ó Àþýûéñ=÷ÜcÚ­\.E^­V«ø ö+J‚TO­>fàÒ¥KÉyôÑGéñåË—Å—N:E[xMX® ä$Ÿ™cccP©T™³³³´€r¹|õêU<=¢n,NŸ>ÍÜœÄ-rRËÌr¹œËå ££>ûì3i‡©©)0E±çÏüÒ.^¼800ÀÙ38Ô;Ñ&lرc‡ë[àúFŽZV«Õr¹ÌPTK8N)ÿ<ÀTËÁÁÁáááØÑ´œTÏ_œôGˆ| ‚eŸmÛ¶ÅŽã ÓazìˆàúFNrP`ÚaÏž=¦—,×ezœdb0‚ßÛUNJ“sþ#–““T!ž•ÈÉÑÑÑ ã_ÏP9¹uëÖ´j!žeu·'‚ô|©T’C¼déX$ÂÌX©T8»1ËI§5°ÓÎNÈI­†Fà• rBtÉ^¸p!¥COpA%‚8©®ñªÕêÔÔÔž={Þÿ}ñyR’®®®•••™™ºd/_¾LÇZ[[Ã===øÀþ‰“ÓÓÓ¬OÕˆr¹|åÊí°Ò€[·n½pá‚xήÇ*•J333¦WÕ#6 ýýýZCÆèèè'Ÿ|ÒüóiR’µ6TKûä™Ik°b±ØZµ,GPDÐ3[#€¯nٲŲrVh¸HV5ósŸûœÇémŒû½Q;ÿѰ°p& ˆ—¯Å&{VCCCxuŠ>’VÁdµR’ääx€b9‰;ìºæç"xŸj›b<‚ë-Ö‚„œÔ®"b.a¡ ‹–“±J²¡m}±÷Ë ½Ð¢œnª¥’ñL°ØÜLœ ‡€ˆu‡0£ZÂÉä6^5 ‚³ÃM7Ý.® HNµßð¾}ûðÁÈÈHX(ÿùÏK€¨–­ ÔÐ.üÂNw“»þ%Í,—ËNóÛB¡P(8~Dª  3Ã^ m«–šà»¯|å+üQ“i0“t‰T™yûí·kŸGÕ9™(;ÞâƒÜxåÊt¬­­qLAsss¸Ÿ™ÐÄpšð¿óÎ;A®q=©¼ûî»øàܹsÍw´èX_‰`z›ê‹9¹{÷î@§×€´9‰`“ÔšÙ†††Ô•Øàà –“¦˜!'ï½÷^|„“øSª³5í·Ê4qÎ …Q´¾n0Ø9i‰\Û!µS»§[{,øœL‚±ÀZ£5‡àŸ±–$SÌ÷F°ïV(,¯âŠ@utYŒáÌhaûZ@4¡¹rR\L¥=§õ7eÙ£I%NîܹÓó0fìÝ»w8BðÁE¤ñ'ík?û¡µ2HÂb'†'ZNŠ'Sˆ`„¯–®ÎXŽZ‚c"›è«s Tð€hdNÑKœ²ïÓ`dNrµ#%µô~ïÈÈçæ[áÛ#x¼W+ºå—J¥àA&Mã(§´¿ø'.˜ù§ÁÿeùjIŽîä.t×¼¥ädJÌ ¨“5ÛØÉ<€¿œé÷S§ÄM³Â©¿:ꤨ–|Šª…7û¥¥%XXX€ÅÅEZ³ñSUž>|ؤfx˜­E>Ÿ§ÇÈIb&Þ50‹Z‚výiÿe%Xtòûßÿ¾ø'º¸Eµôê$ÍebÑÙ RŽB›à±Çó~¯hLǕ̹sçh+9™öb"ƒøŒ)=_够x".^¼ˆ>˜l6»²²ÒÙÙ‰ÙÈÉXfîØ±O[<ùÇÓVÔ.ù“Ä̾¾>èêêÂ?qŽ­Î´MÞ)Ë/ËrRef¨€ä¤Ó|­ñXûn’ñJü“8i p§ßØÂIÓF´oimhÒoPÀ_„…“®¦‰„vNÒL«–ÚóAØ­£ÄIšc£1Ö>ïM5tYâ¤8ÔT8Ù1‘Àá¤!i ˜´p26HÝ7/zƒ´Ç‰@Ç€b±+zN^ÁØøRž€Öœ˜Ï絥ϾcÇŽþþ~qÚ)½]zLçûYp._/rÒ²"M2{JÞ%/LàZb‰“»wï~ùå—C>9¤I{À¤hŠ©ÆöCˆfL»wïþàƒ,ÇÁ™1Ÿ®`“•¯ãL&£M)Ö¢X,bXÏüü¼i1[2'æóùÎÎN|,U*Ì´îìì\[[Ó~Qô‰æççÅÇœ3§õ­øaMö[âäßüÍßpo28†Ö0øö·¿-þ9<<|8‚é-R܆p-Öv¾D£Åª¥Ú¢„ …©7NL:¦=ZµÄ1ñèöi…ª–|0£ŠÅb¥Ryì±Ç´æñÚÌ›oGÀ?©À™“ˆfœŸâ9q2a¦ßBé!rRšs"')å…çr¹|z’óU|÷»ßåŒUm\½&o¾ú¼÷¯fº<ðçhf™,Û$öÛßþöŸÿùŸƒÀÉŸÿüçöánºé¦wÞy'ÔÉyÀR!Æ5UŠ3¿E¨3X⤓yP›6¥º° …B__Ϋ±.ÿ± ·Dww·“‹ˆ8ù'ò'꫘¼¶wïÞZ­†Ï,///q~“7_\MXÊ&Ùaºr“´Üm¯’<–r ÍÁ“O>iß¼”Ú{žG¹q;H£Lv¦$jé¦JHóLÕ\”ËåT ÒÎN%ÛŒI-ÑKµçGGGÅy¸±Ó5ÛU-c]¸~j™$¿¢MÓ %'ðƒhw ¯À’²œ$±X‚T,/Tb®„J¥²²²Â4Ÿ0UB²Ê”Ëe4©Q¢4im9ÄIN„©å©S§D2Ǿ·\.wtt¬­­Yl`¢ZZ þhÍNÉÁ¹ ¯<ùä“wÜqÇwÜaÚ!ä/Ë]\Ñ¥qhÒ+I¦,6I%LÖÁT®NB.—ÃÕ¦úŒoé)(ˆ} ¿ä<˜“0øI*¡L}­ÊÝ€»ï¾[üÓ>±±p2 0ë‚sÊ黂|Œ’PµÄH i˜J9í Mº"My[jœ8Ù6•iBNT´pRüÚ9´Ä¯È^é‡Ã·”ê­¹flµrKœüÅ/~©ÕïAøÍ3MK “““¡¬/Õj+ÙàŒKÊ¥Èçó¦i­d´ë)sj%'ö³ŸYN/—Ëe³Y|L¦)õ¬b«þhËù …\.W¯×ñÏ‹/r&™âW”|AÁ7õ©Ð.”ˆ“i¬tR“Zzƒn¢IÂJ Za 諳¥Ú ­f2C¦ ’{ï½c†0HUÉ\»i ÏMÚ%ÇTƒ“pB‹ßáèèèàà i©¤–Zm‡J¹³bZjéT3ÎŽ[o½õäÉ“A†â€¾¼ÔÀaÃqryyYÒ€¾Š±±±³gÏZvàÇÓPY=:=âäüü¼jq)‹«««É¬_äÒ@är9ééXtnõzö¤i!&²Ôj5Q-E¦ µ®';SóЬ€]n|(>ˆ™¡Ô2Nu®÷{»•}tž’˜ ‰ôåˆÜÕRÕLŠÄ=(âw’ÏçIWiQ-UˆG·»"ø9œ©‚îniTëmkµÄ5ä»îºëÕW_õ=/7ػӀÚÒÇd|\:jµ‹ØR(fffVVVð’˜cô)ùWñãH*D,¢£'1u„ÄTé;±èªþžm•Š¡ > ¸Ý Cqøœ+ó]wÝEÛ& –“ÀK.GÑC6R-;ŠÅ"Îôp+êªòU¥T*!Ô 62PLVTg†È‘3X«åüùóx¶bØô¨L£¬"r¹\OOVEMÒšNa´ê$ Rõzݔʄ)é$d“ö$å<bmKµF«¨“IÔ2`p©=¹\r÷á¯r|l±Ü ®âÎW®\éèè «9IÌDs".¤IÙ´8wî\>Ÿ¯×ëÚ‰±Ê®ÙÙYœ¬2ï#ä¤ÊLìó×ÓÓ#- LSèä@N2™©ÍA¿páB½^Ç;““ªÀ '¦ƒi@¡UÞ#|>þ™$gÔ#ü*½v`hQ'eèƒÀI{œ`±XT=òø^ä$} §kÚ²X/J:¨ëÒºP(ìÛ·] ÒKÕjU»\OÂI{p…·Zú9¨MÎít9‰¨–R±T°ÝïBžw'ýŒïªœÆAN’ ÷ŸÑr’®Ñ|>/yäÅ÷ÒýE2ºx[JÔz_–¡ì†(ä³d " '%Â0™©:cÄkÀÏıÙàY»´CÑõ£ wâs'×XðM㣣ZÛ­fgg‹Å¢ku–;vÌÌÌ,..öõõ‘G9™ÏçMF…¥¥¥ÞÞÞ+W® ³á¡‡«0!—zzz0ã1<ŸG§K&“™ŸŸïëëCO aii ¯þÞÞÞÅÅEñS£ÕÊädOO}Ût ÐO¬¾9Y(TWÓž={(sÏêòå˹\OFüqAH|E/ƒšÍ·i „\[2æïÑÑÑÛn»Í²›‰“&ë¹8S£40LǬC?ØC=D[Þ>Ä›ˆ½*<^ âu€¬Á[3??_©TpÜJWÆÃ? ŸÉô‚ûÔëu …¡Ñè1ÞÝfggi…‹@¢´ rêJ(•JýýýO/é$Ö: ~ÕRU;˜››—Á"ЀDf$ÕअÔÇÏD”ÙR©T¯×µ³n“ÍF4Ú‰gU,ñž+‘¼··–——1ù16Ò‚ÉÉÉÖßa>>qâ„Óñèk&W„kám!ã‡zè…^°¿qxxØR<šj…¨CÃ,¢ÓÉ[f"Ì’Ðêu‚ÌÌd2ü.L{öìÁcÑEB5fÉ¢† ,¼ù …B®–&HjéÝWC-dªöÄSO=eß„E{ăP-M0é‚8€b‹Òa1#ÙÕR\4&#ú"˜Î ‹Ò#GŽH#›Ö®Ò«öe³:«’¬JômXlWê²s×®]¸d•Þ…ÌP­7(h ñWË€5óBuÜÇÆÁᥖÍfé#„ên@œüÞ÷¾§Ý7wðàÁ7ß|“þ”¼íø''¢šŒL«««vIì8Ú@9ɾ¾¾\.çMœ|þùçi|ŽZ'©B4?íNÒúÖ©—¡ˆÿÕ¯~õ_þå_Ĉ“Ô–ƒ¤FÓ°5óÃ6©gº:T¢–¥Ré©§ž²$êP‘A•–L¹\Nµ6«¡‘(,wÞ××'þX« jv6…•«ÕØê±j©…éw¡£kí¢¢ÿ ÍÈÒ‰UK»þ–[nÁ_ íD-=-±óóó…B!ˆZ"'Æy£)’ê˜Tâ–[n‘Ö‡hýÓ‚ŒŠvàüæ›o®®®vwwKöC4H€Ý®(aee¥«« m˜ÝÝݵZ­««kvvV´6#'%Y^^îîîž››[]]Eª ½9I ,~4ÑìLgÛÙÙÙÑѱººJ²¼¼Œƒ×jµ|>OgaaÁ¢–ÈI´“=? V©ðÈ JæYñ›ˆ“’]”lÂMDK¥ÒäädOOÉ>]Ú_Vk' '1ïïÝwßÝ·oß«¯¾*YûýÒ¸šé‹°jI°Ü¼¿3ŽS`ºè8ßÂOÆ!XTNRKU%µÄ¡úÑÆÇÇÕ³UWŒùF0?(:TM…éªÕjE€vX¦Zº‚©–ˆ”r¯OX&TLN"œ"Zˆ“tÅc‘NNŠ=>–ù|~hhˆvSÛ×ׇFhühãbÏ–NL=™Ø)ÎÁ邜¤¹ºÊIÊVÑÞb+bÌD¡Ÿ¦ Qb7¦hIÃjËçª×'×™TÎÎLqåoRi“é9i‡åÔ|.-øQu¦8J)Lzu4=£æR …¯}íkÌÓˆ…¶Ëõ&ü‘Fò¤•“(4¹â·A©,§¬*'MoW¯f0P(a@^'ãþÒ÷©Z¤ vE;¦zžê!´û ´Áw_‹\6IÕ·nÝzý—xÿ¾М¥ÊI-“b¬©“¢¸YÄŠ³Â1½oóâÕüùÏÞ¬~+Z ¡ySºÓQ=ÔpÒŒ©^åÚ{G,ÔõgµZENz¬ùU˜fÚ–`ô/Dð¼ g2™Z­†&þ¥¥¥¾¾>ä¤ÈL©8êµppÅÊj•éih¬4CcþÆoü~ÔÉO>ù˜AHW\í8z”¿w¶žåìåzW”¥‡ÌÉF`­º¦õ59©Ö x饗Ü&±œ)¥½ÎaË`3c±¥qĶ6a}¢®(©S%!Ê÷›˜˜xï½÷Ä¥·çóùùù·êóµ ‡s¹Ü}÷݇Ÿ{î9º.zÚ§²WéQÇÑ¿íxüqæ Öyì5Bv=.Ã6| GŽyþùç-¦2ü?ÔC°÷b$NJ›Ü&±œ)¥'AR“³A “CEª¡–NâV­ŽV, ‰ö›……ÊÁ•8 r¡·×9 ™x#Ù:”‹¯V«=÷ÜsðÜsÿWà$ɼ*rÒÁÌzˆdã°ë3—Ë9räùû·Ø…€¥Úºß<£»,áÈFm5#}ôQS±C ã”v°»%8¹:ÓŽG§åœê`ô æúPóOrTZþEÀõR__@Ýðï‚Ë?É©¸hú×qô¨Ö¯hp6ŠcšÎ³Þqô¨ã°Ë圾1']KäÐÅ`Q6bŒj‰œ ËL©Ûö^‚&%¦±œœÀ äëÃØñi9'Í`óùü‚Kýž>Ô¿â(˜‘ £¾°`)µê'˜‰RB$˜IRÂ@½^‹ëÿ)A;½"³óú­nÒ vtt”bW,†#-?NÛPºý˜ +;9`˜ÁzR…_-Ô XfžŽ‰óHEô š"Nöïß/üõ¡‘Žèè­×çæfçæ8ùøÌœbrí‰ßw²r¹öÄãÀ¶àœaU¯[Z×'9ÌÄ–Mª MßX! „Þgê¶µeXN"$]عˆäAyNŽI!ãfjGkj 'ÕêÈÉýû÷¼È%dœ`öô²ò@ÕÅé†,׉®‹‘™¿÷{¿G‹Å"çÎ.¢ö&Bx­V#³°©þ[{…ª› F‡ûÁRïÆÆÆ(¤fjjªT*utt0FRáP„m#U|<þ/FϱƒW &Y-~aË-Rb#wúêh’eŽ©7ÉšnŸnQZ‘I–8ùÃþðÉ'Ÿü»¿û;pi L¹h祦gÔk¬=Hø@‡Þ}÷ݧ®!=Špb\®šJFŒ:{ö,ùK¼þ´bÔÞJ‰“¥R‰8‰!×ð¢ÀI`§z(‚¹AR‚·`Ú§¬~©“?üáàÙgŸ}òÉ'à›ßü&Ÿ“¹IiÞ+vš!Xœí«–ÈIbÑK/½D/ù•¬ZJ*'Æ Æú*µ‘¥‡zå•WL‡@#m­ö¯†!“ÃF_Áäz)íHU0™ HÁÄ ¬b±xäÈ‘áááüàNc8oí«–èÐC6â–L¸ÈFWN‚® ˜¨rÔëN|Éj\GÏ:tˆ¶ê!úûûkµ5sœ3…¬£í§y )ÁI0ùFWÁD[À–-[°â»d•Qã%U‡Ï/%¥}ÕR‚=ÍŠœ¡Þº$ýDµ4-AcÃôóùüÁƒI-ãu^4½«\Áìåýp“øÀÍê–`Ö{ð¾ßƒ'˜3…£ÿzÙ:ì*˜”¯üÈ#àб4ÄI5„$Ñ Ñ¾j)Ar®vïÞ-šLMAçÆPW›ÈIÐ-Añ»ÖÆ9`UxœÓRK!Üç¯þŠ÷)-˜;]¦¦VÔÃ~XAªœa{ˆ“NˆÌýqLª!ðì³Ï‚߆l´p¢å"Ÿ“ª—¡MÕ’K$¹|ùòôô´ÖÞ%"V-1¿$›ÍrÔòK_úÒþçR§†·ÞzK4½ær¹Zí/ÄwÇ~œvÁ¼&’½.S> MoO(˜6&L™i ¦Óî„Øb%J¬#NvuuùÛ‘–åÄd¦H•äù¬ÌœÌ/}éKø™ùÖ[o5¾®•Ç„ÌÔÌZùÌl e컸Ìl¤¥UT¸‘™zyt¥%81S¡%¿ OìžRWÜþþ~jï‹ÌlGZB{4Ï´çÅ8pµñí·ßn|Å2_õ¦¥qé,˜Ìý]“7_u̘ùjÓ“©|ŒŽŽÖëuqR&¦gµrmyðàAÓKíÀI0çŋŷß~[ádì’o æN 'ÁÅù±zì—“à¸ÂôZCZ]¿Ý$*«£…wùWdc¬›z½& 1=ˇ–Ajf"'-ÌÔµ¨“ZµDÊÀÀÀgŸ}Ù‡Œ:LÄ’ÕcÇV1ŽÔA™˜˜vìkìá]cÕçžømXt ¾e£1 9ªê¤)æÌ™–IJoˆ@‹¥ØŠ<ÚPÃô`šÁb¼Adþ_ßqð7²óv€ÛùZaL$äê°úÄ0\GŒ`N¹T‰‡JÈÞz*é>Þ‚6ƒÌœ¿µe UQ¨aà;ò˱ZV˜·7þɽ.µ+L"¤ü‚ªWWÝ÷ôY`/ð²Ö?E,fX÷¦ö4ÉB‚bÍ>Nª´9i±÷´'¿£{ò4›™è˜y»fG˜a2s1ÓÀL#!]QÏ623ð—{ñõÖKfÎ=ñÛÈL&\˜¹oß>x2B…<˜Ùv–X'ïˆ+ÐÓ˜`-! ~‚©%$ÁM0¹„tL!]“6ØzÁl…Z¶8ÊG-©`/—èi$£#¾ÇIp_aÞÇIpZa®;泆´£ž .’N`®0ÑöÃk…™É$á$ ¿Î ,Z¦Ô(R[4dpp0,'+• Fÿ Nº«å7„tÅ„tŪ!Ûdžx„o’] x€p&ÙB±Xàuæ¶ë»»»UúÄæôË´T;ÉpÊÃ>|ØÃ6« ‰­ ©6š³3™Z' Ö IDATŒÈLàÖ:øÀ7ÀËßh¾ÈÛ“+˜« ×CÔƒTÇ“ÁgfS3RÈä5c±ãÛÎ;¥z‘xíÙ¯ÀZ"'%fâ –R”‡€½{÷z3SúsuÕó"£E6=ƒæìz½.Fäq¾—ˆA„ ˆ„lµ`¦Á¦¬¡ê8c¬_ûµ_ŸŒ­ W­Vh‰jÔOöò°/¿ü2œ:uŠ,´ôGÄ?u ÈI?ç$.¯i‘Ö£ééi)J6î{ù†Ž“IÓDÈ$‚™²BJ¸¾3ñÒ„ÿøÿ ­;'! K,qò/þâ/ì{šÄ9kÑÕ¥ÛÒ#¢5VùÆ[º.ƒ²ÑÁ$Ë®¿¾qL²ÓJñum³3ºTJ¥R½^wªâY-ƒÙèÍI䜴[t•ÜK­BJpLæ”ÕI0C*do=ÛëøÊL·ÐœV æ4FëˆÍÅÄb…ºTðA&“)2¬AIÂদ¦ÑRÛÔ’qÒjÑk‹EW¨r(ô2’ãöpE'@g¨±DB-;RZçä¿ŸÒ “ŽgYa!% µ Ì–-[fffvìØ133ƒ× G-“¨úÓ9ibf“áÑðkfæÝ Ñ*2”ñV$ä{L=œR‚Q0K®")"¸³Ä$˜&BfëuJ’8  íÌÌ rÒ^ÄÙ©7œ[UõX`;gNSgj=õW8!Š I!å— l d› ¦‰4½JÞ5l²†¹{bŸ4­Õ‰“*3Mb=8ÙÝÝ <4ÕÎq“&Bz ¦…Þ‚i!¤³`&UH ×3‘BJHO0c ‰ÈÖëÈIjx+L‘™ÑRHÌôKø2õ;hjðÝäääòò24¦´ØÏÂáºQH.3ù„tL![-˜5€Ë.'€ÞÜ‚®Ú¨ˆÎÎN±”)¿/† •“•J¥Ù1±“““*Sæ$“N‚É$$_0¯œ²fëÙl=Þ­™I1µ!¨`–JØGˆl½~öìY±²!rò–[n‘ö¤¼_’ÍØTL~àr{䟃[n }ÁEr @î£`"!=N"F0É.ÒÁ”•Ü©k˜Zs9)13“É€âÆ‹å$“™8Î5ZR5®TÁlÀºgÏéÇÒ"!-­%ØÓÏÐjÙS"ä2{L=TBÌcÇš–ü—L05Sk~ã=ÄÙ÷߇Æú®¿üå/i‹À%hF‰ ²GL #M˜žž^§%r2mfJmgM@NJ̤¦=¦wEŒ½^RBƒ`z‹¤Y0‘ú©`[ fHãÓ… ¤ºj"'àêÕ« Ô¿‹5[ò9‰èxà ªW‰Ûô`ªŒŽ ›Âûï¿O[vNNM™ é-˜A ­âžvB: f,!}ÓFÈtá(˜ñ„tÌÅÙY)N]d)æ!!3E$4["E4i‚2<<¬ízK Ú:‚#9öh§Ê‘G~”ìn¶v"ñaé/‚ÃI™b ùÀCîï²SnwXÍ„©å‘€Í^aª„LÞÚ ÓÓÓjº?q2HoLúU˲M>‰ã#–“±xã7¢­7!-‚)2y”¬JÈänÉeok­V^ÚG!%¨‚™0wF+˜=…‚”Õ¥-ÄQ,Ÿ~úiH–El‚”úKÖÐuZªsH¦Ä5o¼qõúUH ËÊŸBz f8B¦.˜±„ôÌÕL¦§1*ñé§Ÿb#1u cÓíœLRìJâ$nÛ® ¥ÙH¶ŸX6z˜Œ%$··ydû‰—Çle‘u6êpŠáÂwª…Ø«ý¶ÛnÃï¿ÿ~&“a6r&NÚ‹xp000€~ŠThé]ñV‡àò˜cË£-™ ɧ%LZ®;¶öÄo¤QÄ0f&h¼§yºbǹí¶ÛNœ8Aè|f¢ÆòÉlGxKì¾}ûh› iuFøñÄÌæOI°ÀWBìTvíØ±Õ̧kOüVðC§Š@1½â,xÿÃFÝZœ8q¢ÀTÁ0¤Ž8 q©˜L´§Zg#ˆ¡3aï)¢y‚)¤„D0µ¼î"NÖjz åv]¾|Ù^Â\1ˆ' Z¶ÅÚrçÎQêfÚ„$$dæÝ“mÄL!-¥%¸õÃôZaÚ„¶¯¯D­fÆr188èXÇAë3H¢²#)MY“fW+8bàd»€1eMj™ÐÁ¥ól:Q²Ù:8yRLœ€³gÏ2KŦÁIhZž9S9s&L+O±„ô(KH¾·3•æ†YC>ñßàY£ 3€U2,0å4Ó—€åË™`¦wµ––7¬B†ŸÄ,¹²U‚9³^Š:-ÁdÍy‘“H<©ü$ÂTm9)29‰Û›o¾Ù~\~âe€µå¤b'<¤±ŒDði»Â$·G(+Q*„ôzW“W˜Š!Ä¥R»Ë “¥¯•Êàôô4qR -¨T*ÚÌæ±±1*,‚8|øðË/¿Lœüì³Ï,Íó˜kQµD/ªX®4D28‚ëHÎÉ¥U*›&˜3úîF-Ìz½{¤²w¦j'!jödÃ:oÒP"˜kQ£Z¢_ÕôªÙ࢖MccÁ4±1‰`¦AÈäh‚`Z½-Ìry€ÒAˆH(tï½÷ÿÜ(–urrÒ»Õ¬ˆuµ”«1 ‰b‘Tˆm¼xœ¼‘2,'“(¤„TÓ ’"Z*˜bŠ–ØTjbb‚¶¤Â1¿ŸÃIµ]¥„Е<@´¨%0"£ÖBòóÄÑ$Ë!¤«ñ¶ ™&ê=Ü&Ö.&Y§bY tAc‚T=jF‚:©ª%U^×gª¹¡BÛ®RBJœ8qbÿþýÌ#©˜˜˜xï½üªÒ1í¸ø¹*˜u×|Ù2Kq»Y³  k||\L]” ¸ig°”Í9ËòÒÔ®R„qmIœüïÿþoÎy4¢MØh_aŠlt*ÿahúJ£ÝZjb…©²‘ßxϲÂldcÇÑ¿åÔþ@èV˜ë¡êãããø`ii S‹Åb6›]]]µ´ýÑu^ÔCZ©zÀh‰E6JœÔN¸`ïÞ½ÑÃv y ‘“)¡ýÓC!%hÓ]!%4 f— ûá‡â–Ò‰gggc9 ì0t©ý±ü–ÄIIâ‘“§NñkX5’`ZØè-˜6^ׂËF?Á´²ÑU0÷w€ýèG¹\.“ÉÔëuKÌ|µL¿%²qyyYŠ?:u*×®œÑ…ŒïOêŽ6Ìä )©˜X!% `þèG?‚¨à²TvÙd¿Á“"›ÆIðˆòiŒrhÿù*|“½'_0¿ÆÞóºÌìÑcÙÇw¨æ/˜”øÂ5’13W.¯¬¬'X.,,€Ò€]-6‰ N’EJà2attT-W­V=º›;GùDœÜkÈ{î =旾첌`êÕB½Úsô{Žþ#{Ìföè±Þ:d]ª~ت'C‹ÙÍÌÌ {zz ¯¯omm­¯¯v3YV‘¢W“Ó­@Û—À±CÇ5xßm8B†jö,2€ÿ ‰»\/÷&B%dˆÖîê•ÊͪY{â÷M>L±º$9Y©T¢¸…¨ÿÉÛ¡ƒ šÓ:ŽíÐa‚-7!CÁU!%È‚)RD» ¦§BJ3‘,T«HHQ! mÅ®ª'ÅÎ\„gžyF3¸a *A[èØƒ“À¦åF'¤·`Zé#˜&BB› f,!½3–>‚ٕ˪U¤rRdæ¾}û“býÓ¤9)1Ó»˜Ì …X“Oû³xòèZ]’#ÙÌF æÊ±c°ôÄÿ`Þö“=úÏLytkãà gßì:MeìúúúH©ÎÛÇ,ùEŠÅ¢ÖKùÌ3Ïüñÿ1ýI)—ÓÓÓ…B¡»»Ûâjß$……–‚#á2! _[ÉŽCHÂʱc­¢eÇÑîxüq§ªV.&Y~™;3Å/¼™Z¦‰ÕÞLT´ T*utt¬­­­­­QA-3£Ú7„™ÚI솘²¦Q…Àc i»†°Ëk7Õæ¯0;Žþs¶¾ ½á[»#·ßè´Ü±ºX !rR»ƒ5ufffmmmfffnn'Ã&µD6j9i‰5ARËög#èØ˜\0U6&L)TÚi%ÖLÁD…”žl?Á´LI® f¬Úwв&o›çKj¹!ÚC!%4\CÚ>°m(˜¢BJh'Á´)¤„Ø êì쬥ŽÒFl)‹qjÄ0_Œ²Æ˜èØP„4qÒ£ŒÄ’?æ:‚tJ‡ôM²Bz „SE'›+œáP²“–DGä¤å“P-§¦¦êõº«›¤õ)¾ŒL® à²=³‡IÈV f˜Öää–-[.^¼ˆ~3UJœôX%Búá-“Lqû2@LÕ@×1³.5™HA0{Òˆ@X̬.fV]±˜Š8É¿”c“Ò¬ªÕ*–ÀS¥‚”m$z³OÌíOËP¬€5¼W3r-CZ$˜ž„´Sm0 æTr‘ ­â29 ===ÈLrR[*VÑ{÷îÝa®"Lµ¡ íOKת<*TB&’MØž8!SCÈä­Ýõ„L$˜&Bº ¦èQ %ãLriiIŒ+ „>31d¯Z­z3ÓTZDûÓ2 ÒRHù©¶Ì0SVésú+¤„k‚@! h‰Å­6¼njjªV«IÄR±|ðÁ8”_°+Daº¦:´ˆÌÆ1Ã2Ás dz]‘Ù:ëv‹à[/Ý}˜,6:5.ù†h~án\{|KYª~0sšo¾ùæ_ýêW¼‰ëO-ÓPÈS±SV¾`º¢µi%«|N¶ ]ÈÉíÛ·ÇîJläTåÁþ±ETlݺÕõ-6 -™+Ì/ûú0M^ëÀe*›’“¹Â\ͬ2+”¯ƒ³sCËøõÔ§Z(T …u-ENnß¾ÝÒéÌŒ-  ¨“Zµ´°9™™…–±.’!ã9Ü‚΄ä °ËñºBRóÇ ‘±ÔÎ̇~9yë­ñË7 'M̼pám½±hiL• 3…”ж‚™”Ú÷ê é-˜ëËH©¶eoYjÛ=üðÃuÐ9yò$û€zkY&ä$l(ZªH[!%\ç‚Ùö $’J§"ØëMþä'?€••')õYñ¦T¯¿¿µ±hI‚KÈ–÷ ‰GûfXBf±n‹|Á” '%fÆFá`9¼|†††L»QÇNË èïïljñ®]»6Šƒ„ð?Ù{23³V]r¸€ãVá;Køž’¹Äa ¨Ky0ûmöè_@öñÇ2ÖS¢±P © 3‹êÁüéOJœã~DìØ±cjjjnnn×®]RËSSZo`ÝJdæéÓ§7-©ø²«¿ÑQB–8ëÃL“„¤Ì$BÒ3!˜©7fR©*‚À2°Ní%‡††,œ€ÞÞÞóçÏK‹X±’ó@vPÀ…(lZJÕГÓR°µ£`6…Zª„D$£eŒwA,؃°´[÷uÖ9uê>ÀDêr¹Œ·€„9_"¤*Ïm¾¶Ôv(HÑjŠeuή í s.3š“ÝfN‚_‰ƒìÑ¿ÎýëìãkKrõ:äýŠ+Ì­*'ŪsøXâ$bè$ˆ6Š•âfÕu&²ñÔ©SøFйÕ¸[–©H¡|m«–ö~!~‚kÕhÍTVÌɃ`šR‚£`êRlI >>þ|.—%5AœmÎe™H¤zóÍ7i‹o¤ð*bpüøq8~üxWWW½^—î8@[-¤Îwüøm¢–¢ø„’,ÑÊxË?:O0†i´÷J.˜2]Ö&Á\–<¨–he-—Ë¢ZšF¦n˜le³åDëO¤-šßа¨%qRè·ÎIhµÜåÂ&’Ä4O0uNü4úa&L½Bº,UdDNÒ¥m9ÈI0·îA Uó ýarˆïÐYb‡6àÎ2ƒE6Šœ„èƒúé§-¤¥‰Iˆa"$ßxÛ ¤æfŸ™d’ 6e¤µ!ð'ŸÏSÉãßüÍßܪ­ ÚtÜ™–šZ • L{’H®­­AT9Éa¦¥Ú¥'È̖вÝRBŠ‚É d‚é!3Á«I‚Þ…ÑÑQdæ‰'h‹@N3‘“¹\NªµA‹LÓñpqÒÎÌ©©)±ÞG}D[ Ô2%IÐäµek<ͺ¹‰Gç®0]䑹Âìt¼Å.2i´øap\a#sÈââ"ÌÎÎR‡Vì?‡ñ-ûöíÈp\.G]@Lá5R¿çõCGÅÔK¥ÒÌÌÌÀÀÀää¤Ã©›!E‘Q79Z¾¶L×:W¡úÏ:™]Í,­f–\(+˜TÚØ¡e˜>s ¦`.,6×A’ iÞ(uÉçó¸­3kµÖ&·ptŲ¨Ú:’œ8É)P`ZŸ2'¡é´ E ‘- ЉC‡âÿ ´+L-!Ãd--Š1LõºÈI\^^Îçó¹\Nš²B¯Cœ„h¥gêà|gOeþßùب>%çp®Øpj™°dsÓDÈ$‚i"¤7K¬ÆM‚¹ÈH[[]]€Z­V«Õ°¯u×BH³´(‹®촩̸pENZ˜é×íÇ Í§¥71,„lÁl7…”@‚KHOÁ´R:tE 3Qè$Njaâ$ÌäCâ$®u+•Ê?üÃ?nÅ—êÜÕb@òƆP˰µ’SL&!“IH'ÒNø^̬§;r’œ¸¤Ä­J'±Ë:‚h Yb …‚XÖKÅd$^>ŸÇ…«ÊIb¦4w5íz`ëÖ­-¡%Ÿñ• #´P0ªámŸXJ+Μuùòcó ÀàQ‹x×]wMMMår¹z½.9$‘“"3I ¤zäÇé' qµÌѼ„[ÓK´ENŽCd@ eÚE\¸p¡mÕ2Õ*¡S$$ÿ¾`ÿ\"!ùçi¿/ !bëÈœ1ï©Á]wÝ…[mÝŒcwH ¤zäÄQËb±ˆÑ³bûJ‰ÉZN@¹\ž››Cƒ19)23,ZEKËç\ 2B3³ R{>ZB&ÌFBøÌ¬×_}õUÀ-‚ó‘G]<àÅ;"2Ó‚ÙÙÙ-[¶ 'EuÕXh45ÑrôÃ?¤-UaÕ` ¤®+Zª®:âM2’F€÷°v6úµv·³‘žâh—Gþ˜äBˆ#^].BgD¦Á€K1ÈIxöÙgň<œ¤ˆjµººº:;;Ke¸._¾<;;‹aå±MÝ™ NRæ…'‰À"úûû/]ºº8„ÖfÐÅ;_mM€Nã˜yt¥%G¯²ç«üaÙéŽÌÌår™L&“ÉÔëub¦ÄIQH*®aÅ31ÐX¤—{QúÈŽ;¤0½ññqÔXÉ›Òßß([dfË×–Á×a› ⧬ü£ÿö”•ž/„^C¾ðFЯ'®™L†¶ è$¯]dñíé§Ÿ¶Dê {‘“@òLUÏ“ØTi45tuRõp¢N^ºtIm.600Ðò|ËvhÜþcöž„Ø£¿àrœa%6²?>S0#µ¬Õjö¤Jˆâ{àÊ•+¤–O?ý4>ùýï_ò@bì+÷„ —Mˆ–«e%˜¢+2ˆåéÇ'í{J°ý…FNAZ ýýP(Лi\jª.4ƒý³?û30p|ã]‰“”ŽÜ*´\-¡-Säè?Öì¥ßÓõè6zk!dbÁÌd ²s Ë±§§gyy=ðHk}‰RÅb«Þæâ¤‘+¬5)áz¥%ø^šöHfš©î :z¬mBËV fð`à „äßkì{Š„ `yÚ¿ÿáýûÞ¿?‹Åb©„lANŠ‘k¤><<Ì2W}f¯\¹‚ÝÀ…™år™™-i!w•ª£eÙ§Ö–ˆ&¯0U6&´iÙÈS»§VŽ©•Ç$Ÿ}ÿÛ¿ÿ¹sçcâêŽØ‚Ìh8UÛ{$D¹\fvÝ-ö=cm?«„Hhµ„& æ†SH Þ‚i™²ú æøµ)+ÿG‘PSJí=ðOË<ösŸûç´ø]z,éÔ m•5>'é6dÁí·ßNÛ‡–Nðó"Ú éwiÚ éA¡´†é4;;ÛÙÙ©‘JœÄÙ¬ÄI-3‘“"39ÁåZˆ}8œÄ­©F‰“vf"'‰™-öœ ¸À_¸kº/™÷ìäÝ€œÆü1gÆóu6§ØÃ¾_ÝØqÌ/àÈžžž®®®••LeìííÅÚv& '{zz¨“ÇòòrOOÊçB¡0==]©T>ù䓾¾¾ÅÅE:"y;iLM ä$ûñfffÊåòG}„  …BÂæ|—/_îïï·O×ÏŸ??<<üÆë&ñöY["ø+LhQèD pLòy“|Ç|@ú»X,b¥c˜ŸŸ·ôHëMòƒã0œ@ OW}’Ðc“ã.bhhhyyÙã Ñn´„p¶ÑçêÒ§¬AÆ”œA¬Yª2ù©Ê„¡­Î*‚ªžŸ?>vgxÁÆBíÓÜlе%´ÂT’G´ªv„cjZ³ÒHøx@ä¤6ÖTK3 …¡ö¹©”+$ Cõæ¤ÔcK…Xs¨™hCµ„‚i‰ ðV ‹QÇoÌØ0aÃ…Î]SVHiºh Xµ„§iÕ’†–ÄK>¤Âê¡°¡Õy‰ ó·Xχë˜)e{VÈrùëåò×Uï¼X[•šOjG@6RfÑçNœ«]!©{+üÞeJ¼äƒ*$N˜hOµÁŒ÷Eà+Æ;¡Ç|!…‚&ÈÆ°É¥ß€b±ØÑÑa÷"T«Õ••TKíÒŽªZ‰^>â$šˆPxý–ˆL“OJˆUK¿¸ö¶¥%0˜INÈ€—fðåà ÊÐ(aÆù.>À¨ýûwí:}ú44B,¬ < m4 ™m2E´Ù!&>§…JSw LY`–ì° JK)* È¥)ÍWƒŒ)MY“ ¦v¾šðT¿…ÿŒŒ'ÕÞÆ»v­¿÷ôéÓår¹££cmm Õ¢rö¼Dâ3¯Ò©Ö¿´Ð¥ ¹\oU®°«h;¯-µáxÚH„ÁÖÚ5dÂ1µËÈ$%3Ó°²~‹8 ‚N¢-D´R–J%¼øp{åÊâ$˜gxå©++l$÷03*µ¡í¦•›Z#Çê!>ûì³R©„øtÃ2á–[nQŸ´g‡µ³ZB£`†ª)~‰v‹Žß˜v£Ž‡`rØèzªß’ž•ÊØˆj™dñ¦ª%µåz÷Ýw“ç+;­Ü¶oߎy'ÉA‘t«««ªZîÙ³çý÷ßÇÇÄÉ_þò—üƒ¶9-`ŒYîti2ƒËÆdZYùcòÝeü1ÿT}ŠÊ½©¦03ÃnŒq-í±oß>N# &ù±U<0?¢Œ0´U¶´ƒïÝ»WO·gÏ| 2Ó‰“Ðf1±ZðUùa¢|çsÌŸð+¦qÆ|à<À4û8­ ð’ö…Z­600pþüù¡¡!Ñ©ˆ>’ÞÞ^ä¤6ô 6ÝÝݧ:11a7Nâ%^©T8ª±XXX@AËårj9vÂÌÌL©TZ\\ÔvX€C‡áù`=¾m۶ѽF;¬é3NMMmÙ²…8 ^éöWK:'ªÙH 1zLßJ¶15 )bll}±€¬ Œ”ÇX©T0üU•MQ-'&&ðÁ{ï½g9¢ä INÍ+iR ú6:„N:599Éo % [Ìò¡¥:½LN¡Ÿ)ÏðÇÔkZC&ùø1„„HËåòÙ³g%£?Í]X411aç$Â׺òäA@äQ[Ç:tè•W^¡žjÏ dIDAT=íU¶´n¤ux(fnZB‚KÓ²Þóf¦JÈ„cÚ:~ŸÝFH‰ÚÔ~ÉÒcg‘Dy‘l?Ô`' f<âæTG謖àuiÆ`<(d!¤ë˜8,Óçáôñc’/}A23´W¿8ŸÔz#SRK>TZ¡ÒÎLŠZ6 -ÁåÒä»wù,2ƾøŽy ¿×:˜ŸýïÅ?,Ò7666;;ËÉ«P犉³ª–œycs`b 6lHÚÙbÖA Zf¶¿%–À±IžpºÚ8(Î8ùÖ˜cÀ @oÌX“ìßü¿†“0$ò#0Ó_û’ ÉdŠö¡žžžŽŽŽXSêÂÂB__ŸÄIèííY½¼¼ŒV2êi V«åóy‰[·nÕÚT¥kµZ.—³sÝÂ…Bá:PK°Š†w¦¢EÜø é=frÁü{Ãó6µäG±ig¼¨–ÝÝÝÌ P ¦*uÍWK©deµ$ Œ?Ôu@Ë„©ÃZ yÒcLof É?ÂF;ãµÏÁ6¤ÊÚù¶5NØ8Åíèè°µ±h —f¨RÎ"‹ÒcLZ&"¤N)ü  ®¯m¾Zªðf)Ç ´Ai¶¶:R(!Åa™cò™ùJü.¾’r¡ Rô6d&xµß 8§ÕbÃÑòº‡–)’0AÑR°¼=Õ´ß 2§5¡»nè£4•ʯ*•_‰%6ì°ì[Æ 9é]í ÙØÙ©I-ˆå$³™‡k  Xh¬8e>Òã$lÒ²½ñ À+hnaº‘“•JE½|9¢ø»™€œËÛˆ5üM 6;·Þj›»‰-€˜M8ÐrÒ£O@lÒ²MÐ ˜{ö\سçÚÍØÏõ/1“Ó(jhhˆ³›R',©†¿ ¨Ò###`a&µQ› ¨°ËïÀÀ€Øþ@Dòö•ɱI˶ÃÐÐ dë9A”VuËI˜)ÂI:._¾LA­X½ŸjøCc//^\h}®FK y’"å±~EÉ^e7_ \½zµùu™µ)cããã~ø¡¸Û&-Û' ¿¿||ÿ™*;ÁÃàôF:OK ¹_/„ů˜jA­°‚™è™¹9‰m9N"'àÒ¥KÈF‰“ @{C´dPŒŽq-ú‡ø‡âKLNÒVËI?‰@‰œ” Î j¥ i€l”Ôr…ª_o¾P,΋E)8›:[!8¡Ï,,,är¹K—.iûÃQùÒÒròÎ;ï|íµ×øãÛϳ\.÷ôôd³Y{Ç;&´MûÄj Õj56ŒþþûïOÕºk×.Wºÿ&-[‚“ŸÍÍÍ‹E‰„Z˜ÊϸkÒÌÏÏ«¹ KKK½½½hPyíµ×î¼óοüË¿tßržHûl6¤]×ââbooïôô´Xq‡P­V;;;{zz,̼ÿþû`||<,3±8eµZM˜2¾¹¶l2ŒfFH­ÏLB$Y ŠPÃb¦}š*î¨Úµñý÷ßÿïÿþïÞG7jÏ'ÁæÚ²iX_C>õÔSêkýýýœ>3Çç‰j±Þ}÷ÝΧÙ´š N8yÇw@4mh§…ÉÅŠl9 :Oœ„¨ÂuBlªepM!‰“ßûÞ÷èIºbêõºE-‰“>ú¨å`ÄIbø/~ñ çS@jJ6!â$¼öÚki‡}Ct«°©–©â¤4kE6Šœ!¬Ä>ƒE6Ú9 ÑÅýî»ï"c9*@œ„@² hLÂm’†vLõÆâ$lªej°­!½qçwþ×ý—e×ú«N¡Õ2˜Us¢%†6Õ28d…d‚ÚZ˜pçwÒÖ׸vl>É?Nòs_\!­!Ó@ÂÀ}olÒ2 < 'íÌD4©%Iß¶‰{š8Ûä˜ÊhI>”:·T9 ¼øþ4°IË Ð’oÅ&3ÚV3"ìœôˆ2q˜Ù~œ9¾Ÿ„šùHð;7f>§ ‘“<ð€ß ®Ø¤eB9éÊL?ŸÎIùY|¨¤$œÔ2ÓãÜì %L '“0ƒøwïŽo¯¶iòñFü|õî»ï¶B7œÕ>Þ8´Ø¾};†%-HÃöxàÅ_ô{/r²«k½2ðØzoÒÒ[·®‡Ë]¸pÁ» KØ+˜ƒ°]%M{¯Ù¸w.­ýkvïÞmç$lÒÒë ‰lLèoæ5'ö`nίK<øàƒ?ýéOcwã÷á3asmÉÄÉûï¿fN=àÞ±)LN)*ƒl ÈI¿p9>‚ØÃâÁ¤­Éí·›j‹“%@j”&hçºNu“Ór²³³““þâØB®ýä“OÄgü2Ë™j™›‰]œX¿úÏœ93>>ÞdN‚$IÏ •Ëe× ©þþ~KsWôôô éBM µ¡PŒŽŽ@©T¢æèIÂfìNC Cç`s«ÅÉ{îÉKOÙ9‰¿}æºbQF•ÏÑ"x…ÅË—/c6sJj ŠNbQ<‹ò8[ L®B¹{uºe -D'ˆòöYæÎqÙ,ÇÎñ©o5¡Á®(w@ °XB.än4ÏÈdsÑäq”ù ev‹ƒr Ê))«f¹eØ?õáþSÏØ…ž,wçÞå›n¼4A2kí¹ÿY)ÉócH¡Aá'ûÏî QËÍgžÉ ù8~XÈ<ócýæ9^è¼PŸîò' ç¬Wÿ…>iî }YÞó,Ì›ç´Ì÷ïφF,Ì-Îm!Ïó`Î3/¹0VÒ*Ÿ…9ð,ÀN[3»ïÀu•`­ÇMHg8£_YœƒÉg0LM,ÿçküÿÔìùš£wôoç¢ßüžKmÀ&Mr¿çXêœ{mò{Ný-ºõ»¸ÐÍÎfÎå0³, ¡çVÈe t€!0–À8wà @(ˆ+$€ «A6Ø rA>Ø öƒPŽ‚cà$8 šÁyp\·@7è€ ƒ—`L‚i‚ð¢Ar ¤ éC¦5ä¹C¾P0Å@\ˆe@ÙÐV(*„J  ¨ú:]†n@=ÐhƒÞBŸ`¦ÀÒ°¬/†­agØ…—Ã\8΂sàp1\ Ÿ€›àËð-¸Á/á  d„ލ"†ˆ5⊠ÑH<"D6 yHR‰Ô#­H'r!¯††a` 1v/L†IÅlÀ`J0Ç0M˜Ì]Ì fóKÅ*bõ±¶X&6ËÅ®Ææb‹°ÕØFìUlv;‰Ãáè8mœÎ …KÄ­Ãàápm¸ÜnÇËáõñöø< ŸŽÏÅÄŸÀ_Â÷â‡ñd‚ Á”àAˆ&ð [E„ã„‹„^Âaš(AÔ$ÚˆâZâ.b±•x‡8Lœ&I’´Iö¤PR"i3©˜TOºJzLzG&“ÕÈ6ä 2¼‰\L>E¾N$¤HQô(®”e” ÊNJ ¥ò€òŽJ¥jQ¨ÑÔtêNj-õ õ)õƒMÌHŒ)ÆÛ(V*Ö$Ö+öZœ(®)î,¾Bõvõq  ?l:‡šDMkÍÍššSZÚZZÛ´šµFµeµ™ÚYÚuÚu¨:Ž:©:•:÷tqºÖºIº‡t»õ`= ½½R½;ú°¾¥>Oÿ~ÖÀÆ€oPi0`H1t6Ì4¬34¢ùm1j6z½Xcqôâ=‹;5¶0N6®2~d"eâm²Å¤Õä­©ž)Û´ÔôžÕÌÃl£Y‹Ùs}ó8óÃæ÷-h~Û,Ú-¾XZY -ë-Ǭ4¬b¬Ê¬¬¥­­ ¬¯Û`m\l6Úœ·ùhki›n{Úö;C»$»ãv£K´—Ä-©Z2d¯fϲ¯°90bŽ8ˆUYŽ•ŽÏœÔ8NÕN#κΉÎ'œ_»»]]¦\m]×»¶¹!nžnyn]îRîaî%îO=Ô<¸uãžžë<Û¼°^>^{¼˜JL6³–9îmå½Þ»Ã‡ââSâóÌWÏWèÛêûyûíõ{ì¯éÏ÷oÌ€½OµS •=6 Îî ¡…¬ 92êº+ôQ˜NXFX{¸xø²ðÚð©·ˆÂQäâÈõ‘·¢ä£xQ-Ñøèðèê艥îK÷/^f±,wYÿríåk–ßX!¿"yÅ…•â+Y+ÏÄ`c"bŽÇ|f°*Y±ÌزØq¶+ûû%lj³3gW7o_?ʵçîåŽ%8&%¼â¹òJxo½Ë§’’j’f’#’R)1)çøRü$~Ç*åUkVõô¹QªmêþÔq¡°: J[žÖ’.™Û:?d f:d–f~X¾úÌÉ5ü5·×ê­Ý±v$Ë#ë§u˜uìuíÙªÙ›³×;¯¯ØmˆÝоQ}cÎÆáMž›Žm&mNÚüëã-…[ÞoØÚ𣔳)gèÏêrÅr…¹Ûì¶•oÇlçmïÚa¶ãàŽ¯yœ¼›ùÆùEùŸ Ø74ù±øÇ™ñ;»vYî:¼·›¿»ãžc…’…Y…C{ýö6ícìËÛ÷~ÿÊý7ŠÌ‹Êdû·Ô8¸ûàç’„’¾R—Ò†2ŲeS‡8‡z;®/W*Ï/ÿt„wä~…gES¥VeÑQÜṆ̃ϫ«:²þ©¶Z¾:¿úK ¿Ft,øXG­UmíqÅã»êຌº±ËNtŸt;ÙRoX_Ñ@oÈ?NeœzñsÌÏý§}N·Ÿ±>SVólY#­1¯ jZÛ4ÞœÐ,j‰jé9ç}®½Õ®µñ£_jΫž/½ sa×EÒÅœ‹3—².M´ Ú^]æ^j_ÙþèJä•{A]W}®^¿æqíJ§sç¥ëö×Ïß°½qî¦õÍæ[–·šn[ÜnüÕâׯ.Ë®¦;VwZºmº[{–ô\ìuì½|×íîµ{Ì{·úüûzúÃúï,ÝçÜ}üàÍÃ̇Ó6=Æ>Î{"ñ¤è©âÓÊßtkYŠ. º Þ~òìÑ{èåïi¿ÎyN}^4¢2R;j:z~Ìc¬ûÅÒÃ//§_åþMòoe¯u^ŸýÃéÛã‘ãÃo„ofÞ¼“{WóÞü}ûDàÄÓÉ”É驼rŽ}´þØù)âÓÈôêÏøÏÅ_t¿´~õùúx&efFÀ²¾Y 8>€·5P£Pï€úS’Øœÿý&hγ#ðW<ç‘¿ 5Y5N„mÀõ(‡ÑÐD™‚Þgm`¨€ÍÌâJ‹73ëE¢ÖäÃÌÌ;%ð­|ÎÌLš™ù‚ú{äm©s¾{V8ôoä~–nh+ÿ‹ú;fÝ䯨)Ìõ pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úUIDATxœìAHOÇÓLÑÊÿ¡¢0 ©hÑÅL0ˆ„Ì‚*„è`IvR‚êâU(K A ™¤§.<ˆ$âÅK&¤Yi¿ÿïç,»¾÷ÖÅ&§y5߃¼÷Û}ûÆ}f~;ovÞÀ[lWü›@,`ˆŒ±€ 0ÄF€XÀ b#@,`ˆŒ±€ 0ÄF€XÀ b#@,`ˆŒ±€ 0ÄF€XÀ b#@,`ˆŒ±€ 0ÄF€XÀ b#@,`ˆŒ±€ 0ÄÒ¤£ƒ&&Â755Qa៭Mò±4)( žïq]µ´›._¦-ΟWçO€.kÅÚ»—ªª‚M‹ –6+çO€.+çO€.,Vf&egKII¡´4ï1—mÛ ÄÒ…Åb{"Šã8t¢—/£Šã@,M>| ¹9Û•Hb –&k“wÄÒbE±4XÑ@,MX¬†êë[·8ÄÒà Ñ8ta±22hûöu‹ã@,McE±4XÑ@,M V4K“ÊJzýÚv%’ˆµÉ¬¬Ðà UWÛ®‡m Ö¦1=MÍÍtà†çOÀoóíõöRy9¥¦zJíØA—.Ù®–m –>ããT_O»wƒ¢;wRW}ùb»fIÄÒäìÙÀ§¢"jk£²2Ê˳]­¤biRP@ééÒby‘Ó§!VÄÒ¤¦F¦ºçæRc£Lú#ˆ ÄÒgjŠîÞ¥œé KK)?b@¬ßey™úûé̹Q‡/ +*¨»›lWË6kÓ˜™¡‡éÐ!oÄÁq Öæ32B/Ú®„m –&§NÑÀ€íJ$1KÌnˆbi±¢Xš@¬h –&,VZ𠾝Wbi‚»t¢qþèÂb56Ò«WëÇXš ÇŠbi±¢Xš@¬h –&““4?o»I ÄÒgeE¾u.+“ÙÉÙÙ2´¶–FGmW+9€Xšüü)3ûGRSéÆ Û•K –&¢Ñ¾}¢QK µ¶ÒíÛtô¨§×Ó§¶ëgˆ¥É±cTRBKKññÞ^YŽ›…sˆ¥÷ƒ™™’`…ÒÐ Ö§O¶NIÄÒavVÔßÚÓ#[ß½û£UJ6Ü‹[þì?~Ôy-·XYYtÿ~øVÕbéùŸÁ‚X……!Sq+î÷õI0n]¼êj &Þ½¾° sÌãf§§ËΡßÙqfÍ9ÿÖüøÙ3oÓ÷ï^~ø0ýøáY Ž\¸ÿ_ÓâbL…{þ\f= Dz VS“üŒ‘_Ô/ÏlD¬ÁAï>…¸{Ø»»%>2\O,¾ˆã8¿)·+Ügñ_ö€#|M§xÿž¶n•H{» ««K‚{öеkôà=zD7oS|SÅ~W˜½Q±VV¼µ\øC]KE…ÜG¨X££ÞÒ|íæÃm GX¦ñq/rë–Dví¢ÏŸåi¨XÜ8UU…4½|ßQ—ù›Äb𛽵7òò‚®$^ …ŠU[+AîìÖŠ¨–æÊ/Â}ëÁƒáöŒÖK½ðñc:y’öï —#øv:Î_&Öô´×䔕ÉÀ7—ü|éËffâ÷ «¨(¦×óá^Œãl†Ï›7ÉÈ ·o½Þ3Q¬8Ws;bµ´H?¢ŠJq6(S^.›ÚÚ¼§¥¥rr"¡b)‰[[ãwæ Iõ}>ÜíúÃèªl\,ÎÒâE±#V]ü*©*))¿&§Gjå Zý .~Üß²[¨Xj-«µ? ®àì›ãÜ£)––¼UŠrrèêU¹…0Q¬¯_%»~^¼Æß¹å ÊýÇþ ø¥®VWÐS~ŒÉä`þì——Cv ‹;P&~IÌWvçlIÁ®ðÓÿþ{hëÞ½ 1c ¹…ãÞSefj´Âqþ>±˜úzÙÊsse½—PBÅâ_ \­ýŽoqQF 8Ι¸‚Û!~zîœ÷4T¬'$ã}Ø?uA ”âþ´½=s bMLÈ’_23=±ææ‚ ¼æOά]ûš¯¼x+«ÃÝèÔTöW©7i~d~^Ú5×¥¤D$iŠ‹%ÂÙ_å)Ôp¿û;ôä ?"Ö‘#²•VûDµ’ïÏÕV#À‚XryW††$aJŒû¥²2æ Üûp°¦&&ÈÉPÄ&'e¶§³Sæ&(¡³²d ½«+°ŠV]ណÛ$¶Ç¹zðá;§à<ŒÅ×ÀÇ~Wh 6iv6Ƨ_‚Åâ–Œ<.*»çÔM=UÅqÜë7Á «Ñüÿÿì=h“A€¥„–T¬K& ÝüA]:¹T"XDT\\Œ“âàb…JׂTíàà ÐŸA¬“‹ƒC‡qÖEh E ñ}½óû¹$grõÚÆ<74—/iš>ܽßÝ{wÿ„"=£D]žÒá V Ð5_Õ_'f‡&A¬¿„JKAˆ•»•3óÍr—gÊ}_°Xë¼ëlw+ÇÛ·*Ö•+öá“'®XÒ3&#[èX×ýûvæÇ &=®cc½½úVŢޙMLXÃ>}ò´‰ÐYÎÓÊ3gr•§NùÞaaAGkëÇÇÿýwå±,ËË*MO{6®Ü¾­öd‘¨K.–Lœ“gÍõ7oÚg“ì¿#G´Á››Óñý£Gµ¦\Öqÿ••t& RÑúB!­Éî–ûù³Î+˜‰©lŽ×ÌLz½ùí&Ö”¥%Ã0Bg§7c.ˆ¥ózcc:Çg‚*3ë·s§ÎÊNÚ¤,F¬düS®‘‡×®Ù‡Ù|ål.üÚšM±w²§¦ìÄT]îÜÑ™ÐdV´.۷볯^å*X}}Mþõ±@,ÍD0Jí߯ Ò®dOö’ž.KV,iÕÌ ôË—öÙ'ôáÕ«î¯0¡Ûà`®Ò#ÖÏŸÚjJ“6?¯×”JšÓQ bmi¶ýNT—î,9§DÚqEÚ!©ÌÆOÕ?bI0$q˜™{ “\‰Ý»µæÁ÷WŒŒX?²xÄzýZŸ2g?™¬×l’~‚G,éF“Œ·ë×›úþ-ˆ¥}߇Í^lÄJмVZ¸ÓŸ>|è¾jt´N+âkxX3c ëeCCu.óˆ%¡[’£[›Ø¸ VkùéF,éÚäþÑÄÎÒ{&?®57n¸¯ºu+ÍzMh$ÖׯªÅ¾}6©ß$'vui¾¿]a w^—/«ÒêH&Ñ’Dâµ£PÙË$Id–ô¡òfLÕy¡¹!8>WÙH,‰ñE£ì2¤;ôÊ{÷Ü+k«#-ŠITwJ6ûÏkyÙö}ÉpƒØiÞçÙ³ô%&I_\qödk$ÖÀ€®”ÌbÇö÷çºÝ*bmqž>Mgo¤“I¢o¹³3ùÊÎâXg¸alÌÆþI”fz=éË’•Öf©wm¢}]±Þ½ÓÊÉÉ\åꪮÿ–úÙÙ\½G,ù¥Ùåæwï¶þ½¬ÄÒA&ñ@Ú§qúþ]Ç9ÊU:býøaG+¤³Kb51ÕÙ¢î>luźpAª=GóâE½øìÙ\¥G,§8ÅÐéb}ùb¯ë"õöÎ÷É;¿ß¹»duºXò¿±m¬=7§Ï~û¶±Ÿé¿ ÓÅ’ÅÓbÉ Z±Ø¹ ë¡ÓŪþޱ$Ô­Ú^[Óùãƒ7ã3µ?ˆ¥‘u2Œ.÷t££:T-7q&Ÿ˜ØìÏמ –"™MlœR.Ó‚X–udüðaZ,•t"E,g@š±|¬¬ØõÓÐ*ˆåãÅ S‚X>+ÄòXÁ –ï\çJ±A¬:£ Ù‚Xa –æ4*…b‚X>ˆ±‚A,ˆ bù@¬`ËÇô´»Ÿ4 bi6°sr¬IJëtÖ¹öL±tåÂ䤮¸êêÒñ…áa]á^÷´ hÄJÙ»W×;¦ Ø®]ºßKöth ÄJ±ÊeýaaA'söìÑ­5œ3  I+%K˜Ÿ×]©º»n±RD¬ÁAÝÝÅì´íÏÉ^b)««º”Þì½aJ©¤-çðƒXºzÝŒ8˜­;††t)XÝô yË*Õ߯ûÕîAa –î´1;Ë‚œ bù˜™qÏI„&A,d7ƒX>+ÄòXÁ –î‹×¨ôô V ˆÅ*( –îáÙ¨˜³¾ ÄòAŒ bù@¬`ËbƒX>––ì\Ð*ˆ¥;î{Ê›7›ýùÚÄb¸! ˆeOžéë³¥PÐTwós±ˆX –ŠuéRúðôi=•Ô@ð b!V ±¢€X®X##éé܈ béY~Ή\\¬Žoè‡ùo@,ˆbA ¢€XÄ‚( D± ˆQ@,ˆbA ¢€XÄ‚( D± ˆQ@,ˆbA ¢€XÄ‚( D± ˆQ@,ˆbA ¢€X^¦§«'Onö‡hKË ÛÍ„‚X^+Äò‚X¡ VµÚÝݰ ˆb±w«ZšjX*Ä ±¼c…ò ÿÿìÍK_Ç’%! ¢+Å·,D,!P܉ˆ BF _AÒ ¾®ÝÔÂ… 7mwšâ ""âª6¢(B‚-¢Eø aÏïy:§™;sǹ×q^º÷~?âΜ™éÜÛ§™sž9/ˈåˆå Äò Ä":;£ïßé×/‡¬ãcÚÛ ½@éÄ"zú”òòèôÔ!k|œZ[C/P:±ˆ*+éÅ ç¬éi*/·4iBƋݬ,šœtΟ—•Á./Ã-S:ñbmnJtjÊ9w}]r¹®IÆ‹up ê<îœûúµ¼ØÁëúd¼X,ÍÝ»të­®:ävvRUUØEJ 2^,æÕ+½Ê*X^–{ØÞ-.ROT¿†‡£._J±ˆNN¨¢Âù tQ‘¬d®ÄúÃé)Qn®ÅªúzÚߺd© ÄŠë[‡‡´²Bh ÞˆE41A³³ÎYggttniÒˆ·vïæ¦ ÎQà%´W Vˆ±bA¬@€XĪ®¦þ~JK%¯>·´@,o@,ŒÒ ˆEÔÛë–£._J±@ @,¢ÚZé‚ |bŵ @,ˆ bÄ‚X±HwÍÏwNG]¾”b!@‹èý{·´¼uùRˆbÅqqaN2?O‘–&UXV~þ”zÕË—zÝf¼±¬@,Ÿ€XV –O@,¢…3}ø bµ·ëÍÑQˆå ˆ…8V @,’°»Kª«‹º|) ıH&høö-êB¤˵wÃÒ={niÒˆ'VW•”èÏ7xbaÀj @,ˆëXmmfŒ´±‘  ½! Ò@€Xıˆ>}ŠºiÄ"YQ|d„ÎÏíûÿŽ¢4iÄú[y¿wÖÖôžêî¦ÂB™+kw7ÒÂ¥*‹hhˆrrÄ­¬, ímñÉhþÀu€XøòE/p¢dâ}}}ð€šš¢.\J±bØÚ¢æf«¡A·ÀõXV>±FGõæ»wzb=|h¦š«¸Xo–•A,o@,¼Ò ˆ•Is7\^ÊjŒ››²vÀ@¬À`)ù†ÇÏSƒ¡!Ù“­cý·o;Ü ÕBv*kaÁùš¶T[+Y½½YÜøPœœÈ2ŸwïšÍÞÊJzúTV¡2˜›“¬;w|ùö+0lb}ù¢£e##z²§­MzƒIõ¾w‹scOQ3ó*±ª«-YjU³ÓS½Òç­[²úõÔMNÒ‹”—gY=b¥6±zzt|ßxwt•=.Yêšùù§(±úû²ÆÆ´Ž¶u¯Y8cú‚X©B¬X[[òôád¼5¢°Äâz•Z9–…î@¬(yû–ž<±'ÇÑcJ‚š‰©¸ëÀ€å€„b}ø sI¨{Ík‰ux¨ëU [!+JÞ¼¡GìéëW‡#ã+ÚÛÛ–”=ÒËžSW—=+6]\˜×t«´T_·þ˜•}nº±„ï=Ž–x@IP\,qü†yò¿úÎŽy€²§ @Ænp2ÆœYííò \%UJ(·ûÔÕ8©ub76´X{{ ±„Ÿk|ò[彯O6»»Í©cq»O‰µ¸˜ À+@‚kfF6 Íþƒ¡µ ëë%‹›¥î@¬ñ]¬²2y“­zI¨:²‡”ìœJKKWfÍÏ›×t«¥Å<…“ŠîïSQ‘<‹;;éõkZ_—«MOKìøØÁ53®Ÿ¿„"VX-‘(I±R£UØÞîÙÛ“HIy¹÷ݹ#q”áa‰©(ŽŽÎtø‹?–,õ~¾£Ã~Š1!̳gWf1»»Ijj’¨’q€_=ãÅBË;?šQÚìl)1—ÞØs|,±Ýéi‰ó®¯KÌ·³Sâ¿EEºîÙ™%LÜÒ"Wèíuø‹òó%ëý{ùÌW3NÕ?“biéÊ,Foæ㉠‰†—•™×¼9ñb!òîê¿ÂÜ\‚ÃTGÊúz‡¬þþ¤ÄŠeaÁnÏUY¿Ë{:Þÿ—âáÃ0Ä»›’¤X‹‹úe{lokE b1Ýݲ§¯Oo†,z7x$I±ø¡®¾çƆlòÍÖè?¤Æ$ë×/³—Wlö””è«سvväIÄO„†yÊû)Öׯö~¤èåIŠup ¿çÊŠlnnš=U(¡XöÞ•±ötué«56:Ü̶·íç:ŠÅ–ÄwUyô MŽÐÅâvúž‡‡ö¬ä…FOpµ \’Bf`@v67K?t5šÞQ,¾÷ÄwlWñOôyOŽÐÅzõJËÍu¥]ÇZ[ÓCe¶¶dÓß:V<¥ãñbqµàôÔrÌêªþÉÆÆ®¨Xçç2¦/¶q¦X„q…ž‰‹Û#yy2âvrRFß>.#qù˜Š -Üì¬eØnuµ)Öø¸%KýÐîbñó(ö”¶6‹X##²™“##’!‹…‘ЉëìLf¨¬4gÊã6 ßONôö*ª!Vm­C–»Xûû§¨¬OŸtüvhÈ<7d±s7øÎñ±´P¸U’N¯ ¹.ì>MÍ?f›Iîßw¸CĦÌ&Ó¿¿wX¬²2=ñŸŠµÖÔX&Ìl –WX¬wïôgõÂûóçH ôo±¼¢zI(tÜUEÈÄòŽê×53#o—c'ˆïé1# ÄòÊË—f=½´TÞ hÃrr,qŒbyewW|*,”ž0FŸ…µ5ßG«0ê¤8ñ+„ŸKl=;;ŠÒüC@¬`Èø5!ˆå•ºº‹Ig6ÿÿÿìݱJ3A†áF„ ‚`a¥Ø[yb!ˆØ+ÞƒÄ;°±°ð6µÅ»ˆ­XXXZŒsþÝ?ÙÄÍ_8¢ž÷a‹`^â:™!,_éE¿.‡utd ò57g+Œ«×ùªVìÄ}üºVÿI²…[cÞ·¿OXÑǯ#¬¢èã×5ÃZ\zƆ°K·»;x"~a–‹ççz…q`„„¥b‚´ˆ°TLE¿®9AZíMrq1˜#m} 5ÂR5§ªEý@X:Â*",a–jk«Þ4ýÛþ¤Ú¿ ÿ\–ê7îÝðKÅ´ògX`„%Éÿ ætÚß=;³w›3[ñ–$bå{©þ“Ð#NOíöËÿÜ埌°TKKéü¼ý­ƒ;#>6ÂRmlØäÏÞÞÒìlÚÙùö_èg!,U¯×þÇîýÝîÀÆ}Ûa©š_BãÂRVa©«ˆ°T9¬n7]]½b#,OéE¿.‡55e_쌻b#,÷XE„¥"¬"ÂRVa©67íáŒAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpAXpñÿÿk/‡„anXÉIEND®B`‚golly-3.3-src/Help/images/about.gif0000644000175000017500000013617113006227600014156 00000000000000GIF89ayað1ÿÿÿ333!ÿ NETSCAPE2.0}!þGifBuilder 1.1!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷¾xÃý†Ä¢ñØ ‘̦óù»5”ЪõŠÚ"K„´› ‹ÇÌ­JhfHÉì¶ÛØM×`úúÏë=ñ©á^¸7HXø!˜@ågÈØèøW9‡øhyé3©ò€&è‰*Ê¢éP¸4ºÊz±ª’kGÛz‹›Hq:ÇË›,ü×2Ù9Œ|kKÌœºœMXê¬Û[]-­}I½íý­–!.A~fŽÎ®žÒÝï¸._?LMo¯¿Ï‘ÏÿïÎÔ8N š€öb<ƒ gó×ÁĆ +%zÕkFŠÿm‚ôŽÏÆŽ$+¨šf!„‘%[æPB–JY.kºR„ÊÂ9®ÚüirÅ12ùÛ 4i3f‘2õ"Ž¥Ò©ã^y:ÉtM$„N­˜XN(3°{p˜}*Ê—Z¯[ŽšfUYª¸®ú²#É–™­FñJ aUÛ±:¹@Íû±¯¦¶uÎ^û Ùq¸•qaIy²e´> ]œRJÏ^òÆÜ x.]p Ð ®%ö §ÖZ(#™ókŸ“éè\xsæà±I[>µ¬ÏðE‹?'^Jú/ã³s:¿Èó6RÕ¢«OÞøWaßË5n·ñð¶‘_þ°pÅ„¥_÷:>– äŸ¹ÿþ MWØì"Uuaav {=e0 J.•`9»°uTrtÂvÞsÖçÝy<)š€¿á—ÛJ'j‡^ˆš¸SÇiNW«ÝÈ ­)'>»Y04¦è¢f­ˆ—ò}XZ“ð5÷ã{Ðip™ƒÙã;‚‘’8~)áà})^&\ob"ItÎacæz‡]Z“RªØ!vê¸ÜYA‚Dçäù–ežµ˜æ¥š`.ZL¢²mè$—iŠh }é½Éç…„]xä¥-bF"‘SFúg”lަߓ£šÉ`™ZÖW ²Í7*¤¸¨inœRGi¤x†Ze‘›ÆÙ©°¥j)N­ÿú˜‘_aáhrT­3»FHеqÅj¥svE·žúq-AŽ’pk¦½rkª\±>:(•2Ê‘]ïZÈݘ,î)ª´íykŸ–Åq™dT˜ž)ðƒVzûÝFrG&—˫‚Ǫ¢¬i(¢ à¼ô¢3løR6¯¾Kl¤ùùúfe°Îº¿Á.©ò¤¶Ì2–ìÅô²¿<>¸”?öñO·9èvç>KƒŸâæ‚óÒ…”šÕ\5#ÙÐ28Ý.Ôûj}Å^X/Õ²~òØE³#önŒù'ô‚€®}ãI÷'¯GtÓS±AÌYjïÍÓs[`?„×=3¢Pž­øâ_†œŠä–ª o×&q¹Ñ)ñ¦ùkùÞy+3*l1é¥—Þ ƒ«/šáC‰¿®”Ô±LKûäåλa½ÿŽ‚í¸ûKÄ<ð÷æ|ç±WÞüT* ­zô “.¼õe3{vÙk¿ý@‚O·DWŸJ~E›ÿ«Sõé׺Ɇ"ý¾ÑybØ~ý{‰œtúïßùýOz3ù„ûx=”¬/×8ô=^œàï2fÁ Ê !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÚø‚Íì¶«N„ÅrôûŽÏoâq%±¤'8Hè ö'ˆhÐÕWøɶ¨¤8y`w¹ÉéäHé¥ÈPÕYjªcIe¸æ5©y ;ô÷):”*«» ”™S „É;,{H’úØšKÜì|ùÁœ&ý\mJ­êq(lÝ+ ¬í=NŒaNž®Þ»ÞNžì/ŽR?g<‚œï¯w/Ø¿ÕÂ!!ˆ°DÀ1 :œc_‰+j0È.ÛD+ÿ¹Züˆ¥€¡<‰¢FJBè‡2&WSV¦œ&3gHnùñirÔ9Dúb„Œ¨Œ\Š:m©R$7žK›"}ŠU(Ò>Ê2äS5¤U¯pu3ËÎ¥ •j¸Ò¤¨Ñ‚ÚžYr…Ö–îO½G[e:Øœ´@oEØÆ(³W†¡aí㽆;.¼ pÄ„[*ö)øðHÄ›o%sÈÇܺíh™å#˜ccÙ\ .û™U(œ&G®Ìy2NÜ„w™H3¨ÑÁ1Ï9zXü_åhŽª6㉠¿úxoÑÊ}].¿Ù;h¶/‘§Fÿžùyß_K[=¬[¼ÆbÛÿãîY€½7`Z8 aÃ\ RƒÑ_á˜\_æýáE¶Ý§ƒÖQÖ™_òÙŸyÈebfãM8âräµèFtpè`%ëU²k:¦ÀÒyîÁŠéâw?Á˜}BŠB~Ffƒd|/^ô¡nö"c•ÔmÍ’;~ Q\Ú=È^^õÙR!ˆ>™Þ‹Ò1H£dzù¨¦slJÙ^wZ™dw¤¥i¥„4Ö¨dn]‚‰è s}2ØŠ“Ñ9‰…æyÛƒs~Ö‰"JzØž&¦HiŸ‚hcBeYâu†–$̨g2él.†Jé›–šišWÊ e§©ú ªˆ¢Æ©)p¶qÖ+­eÿ± `˜¤ú*„—ÏâWAŽÛáŸyF”Ÿ´¥­¬‹yê‚«†–i§Þó›\íò:í‘Ön¹m¼ôÌ›(H®éšÉºÓ”ië«öþXç™®ª§œ¹n¾J¬Šâ ¬£7‚{/ÃLnyonü/¿o„o¾­-'TøRUi°LÂE¯Ä·+'¸$Ál(Ÿ»œëÁÐ÷.=;‡;#´ßZxi8]©&²S¹èÕ˜GóÃ-–ƒ6ñ¿„ܶŸÔu0ʘ±yä²$ÀZ=Ö¨a†r†d')yñ´D³{° ¦T[oÈò¯5fL7JS÷ÛóÇÔÊEtßEM*†?e´Rƒë­à͋뫶ä}µå¸öäî$ž&8–kz¬Cü9è;»7á©Cez]IÎtì­n´X³ßïNVé¼ÿ^­ïÀ'öð®³k<îØE“üï05ýNÑO?t©»o=õY…½MæÚ§ó<äSü÷9©]¾ù#ß›­úˆî[Ùqé»¶ª|5&ýMÕ¯iúÓÞ8®îD)V-~à=:ä€ÛÊü(ò ‚" ø(˜/š`°uùÛ ŸæÁº !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªU…$Ðíõ /irÔ,N«×L´"éEãìºýî±¹å†ìâ‡(8è°7aÈçG¸È¸¶…xyØx‰9$YÈ7C)•*Z÷Hé99šªúaJAwzÖº:K˲éùŠÚWÛëË{¡Û!Iü{LhœW¨ü׌ ñl++}}IA¬íÝØlý=.ÍM~Ž~Ó œÞ.(þF²îNß–_ŸŸ:‚«ÿÿ…Ÿ žùskÁ(Þâ°AD‡Æñ‚!'ÿ;–04‘™«HKÞòjN'¥LºüHÒÙ®™Åb²ë÷ äKŠ–$¶¢£³ÒΡÓôÔìÃͨHšƒmTÑcfüA´ù4ëÆIRAùˆ‹Â•Ã,îBYÚhz.¢\Ë•iN·WY9ÕZË«8m—l¹a”}× ³Ö\°`ÞԢ԰߃5?–x9°e¹%›R†F1ÆDèÞ š¯AY~z:KzWìÔ¸*ÏfFF¦F-gãw^úB¡hjV™Tj)Ófƒ²Yž›¢õ&˜âAig‹yž2Zsdž^ú¾v'ºñý .yßã²ï–?>þÉ®pH€Ÿ½ñ“¹Ìî€PÑßþˆ:¶-‚•ûW÷À ÚŽ[ì  !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·ÜÙÕºvÇärôÛ¨ZÍì¶ÛD'nâ·ýŽ©ç89‚ž(88QWsà÷甈HèøHXg¨Ây‰I5ĸ±‡x5™):Ê"Úxöv Hú «qzˆ*Âi›«+cª×´ l2AlÀ)œ¬LaÌ@ܼ-}D-}=ÖƒŒÝí=¢ý-.´:Žþ ýÅîmÿN8ŸZŸ¯ó|oÑñOŸÀå| <˜%TÀ9x!|ø¢„…… ZŒ(g’ÂUÿv¼²jÖ>Ò ‰r7‰ž‘0™òâ¢4íî±<– f̃ž>©rv“IK :w>”´©ç1¥ …v(h4*GE¦”º¢¹æ)T©\ùl–ÓZ|&šò³9œXÚ.Së–ª¢¬”ú¹$Ë!h×q‘6ËT"»j¥e ´ØÜDp§Î2,´äá¶dYqÜ5Œk†‹9Èʼn?ÑÓCï^ˆ†.ó©¼Y. P˜gRöl`Km`&î›Ò/Ð8[~Ì08-ØÀ{ß¾ ùäî¡Tû´ö»Ô÷뢨!Û&~Z4VTΙkÄý{²Zã©“ÿ<½ùhðµÏ·ßhpÙ¹ù[ÿÕšY²Õx£áw WTÒtÞ— fâ%ZR^õ’u¿ˆ× rû±U^|ö•‡\P¹"|XÉמyÌlxÎ_`÷Ùq·ZŽÙ˜…²x÷Ot~øœc"fÖbÚØÔ{ºy8܈óÉ‚žpÒa!X•¦±çÓÿ馗§}I`}M·”SVyâŠóÕÆL€ÏÉ \iÉ9#‰ENyf”<úØc“ÅÍå–)ªf¢;ÀDŒszVç‘Ëñéœ:JœkW¦‡džoîÙbrf hYeYhšhnšÓ¨‡žéŠR†šäpqbš¢¦wJ*ªŠ•‚jdŸB:Z*iL b‘UÿQG‡iH„j¤îê& ’TÕ¥©1IæT~rø§‚8^Kì§f«›´ˆÚ´¤©èò ÃM—1;®¢)!µžFmèçw‡>« ·½bI§zU;‘¥™¾«&“ïÙ'tú¦*}ßÜpÀ A<ÒÁßùWT·öît]2B‰¡®ù‹2:骭r¦äÌÌQk§°1[̃¯–q±€ÖW2rÖ5®º#dÝ-b¼[½Z‚3(ÐÀ˜©´#o’UÊ)w9uír‘¯Õ»`-u[C-óÊ41üaÚK TX/NsÞÜz_Ëð×`LåÞs]rã\AÖ‚ËTIa*þäâ{­”‘SÀ ¹äQ} «˜þX¨¹QœjÒBr‡~µM˜ J5ê1©¾zì®Ïvà¶Ð&Ž!ãžûK¼ÿ®±š,ñ<ê+cñÊ'®Äò³Cþ¢óšÇ;ÅÒ'zù‚×ã.õéÛóåý÷Ó'_Šø‚‡½ùïü“é«o‘³/¾: :ÇQøõ_}«„5‰¼?ž ..V¡_I&’SY W— È@™¼Íl~‹ààüS; O!¶Ñ ðÇ:Ò€"ä+ôWÂJ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªÕ—\³(÷ ‹•´H™ñ«×ì& °}åyûŽÏwäóú[û§'8HÈqgg UÈØ8x¨•e·èx‰i”¨ˆ(™–* 39± eæ9ÊÚZq*™K—héz‹›:³Rç› l2Yª°*œ¬üʻ쮸NŽ.z.’´žþ^ElÌ_âîþ oßÿ‹“¿wÌ­H0!cóÞS‘T$SûR4ü1#¾/ÿ\æ™ HO£Èl°¶‰ÌEDfЬL ó„—/á8ÜC'¦NSÈhí éÔÁDUQsÈfŸŠ:u0 (@VÍù4«Ír'§bôz¬d%¨YbõPG YA[Ô>kë«”§v|ÈþìQS+9¹GYVý;\‰7~~ÁE3«l]™ídÉ[ZÃ7Ãî²8`âÊÔr†ê6.Ó»>c)º’سXô:UŠðçž!Ò†kÚçL»XËqÜç³åɸ!÷¥º‹pÍÀ'ú¦L¹0cÒ[9åÈQwÒµdoÿ†¾´%òÞF{nŒœ¸Û¤—u‘ß¾sðø¨Š‹6®¼}õûº©Ûÿú”—,´M$Í eQàU<%×”7·uú‰Wàrræ•bô}ãS’YØtw™7ßsW("ƒ¡U´a9ø½7bsÕÔÑ‹6ñÝi\¡èZ:\§\TIw‘긢c22w§=7]’ºè\y䆨…ü±H¥\5rÈb†ÈÚ€¯t˜Ÿ}.FiY›Rfib]’e~çeÉ&–U6ùÝœèµeä¨äiãž1¦HæNŽÉ¨!ÜÙv`‰¶ød‰Vòé‚t$›pZ _œˆJ^ ó‘ º¨æ Š¢ùži‚¦*ª´fº`Pëièi}µ&'ªžé1gª–p¡*¥¥ÿIÉë«(6K!^ùŒVä‹®iÔ¤xî൱Ñ’ÀJ[èˆuZ‘·$Lv&¥Åš{ƒTJ®šm£ön«^(k¤¸¶ª „±ú¥¡}á9y[h›R{d©rFÊéÁEö¹« GhÝÃvfV«¬†ÉÕ½zÍ*•™ˆ{å Zi~+Lð“07­¤æ¡ÖpÅÂÌž>—Ël´AâèåÇ´˜l²€"EWŽ‘ È8¯Ë±ºŒhl5!ÞYÜæÂ²é'5 €‚+ Öa¯±5ºd>­ÚÔG/ 7„Fv/¶¨·=s勘`Çõ‹wÞ{õmw8g-xd«xÖ‡‰?õÉ_N°¦¬ÃAŽÒJ*Ÿô { b>l8讜39¥›ÎJÖŽ×v9ëc¾þìO…½ºí:]ܹ«ºÃ-ÔçÿΨŸîåN|èkù|ó ] òÎë}BêÓÛøÓ×ç-ýövï}V•[~ø¸”T½Ëæ‹I{äâ®â¾÷-?üÖOùûT•o뱫2è §âK-’F@¦ý pßI`ñèÒú90# ÙÂ%8A ^ƒdšjØÁ{5ÐX!LáJø»ÿ p…0(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjYK UQ nÇärTì˜RÑæ¶û]þ²©^¸ýŽ'©â9Ÿ(8ØðÅ`èw–HØèøÈƸfø×õx‰G9Ãø#™ Ú³IA fêõ)ºÊ‚º!'éÙJ[û ªòúg€k뛉x»¢ËKü{ìhÌ›¢«Œü $|á¼}¶›ÍÝR]ªè=n>JŽÞÔœ›fnOæ±oß6¯Ä“ï¯× ' ÿd7¡Þ‰^.<”0œ6j+Æ`¸ÍBA‹ÿwô’3cÇ‘JDJÔ$É•!˜ì·QË™¥Ö!Ú‹ZL4{œ&íe;}:œƒQq'¾3 µÐÍIRû "²hÔ­Å*bZç–1•8 bµ¦õŽ•µO‘±•öiVX¯%Éf<é#-×ZHAF+´mW:kðdéí¡±»)ntñÜ}‘é%F Ylã«‚e¾Âʹ²KÌp?[nÂ’ã±òåÈNëQ>ᙣ°¸˜Tš*NÔ«¨£lª«iÜŽV-@×Öy¥´÷éP…,‰mÔ®£\õX®¼cŠ'+ª”è~ÜŽ—¤µ•"<s㚚隘½éÎnÓkío‰‡®~ûÖok‡å«oC8Åb§erA p³óÒjàÅ[LZÚº7l²©ŒÇôñzž–gÜ–Æ8F,²§;Òùì» –ìžH ŒmZŒMò HgˆÏú'f\ ­|ÖÞâ#¨Â¬xÝ›¯fÛ»ÝAMwÒ ÃÕ$puï­Ó¤Sµ3Ygó=c‡m]Ⱦ/‚Mëé«¡Œ3®Ô–¦Â >yÔO ¹sæžëô¨u×¹Òùç&ÔbJ‘›.Û·Ù²ÞèÒä‹9ìäØU¶Ôn{: 9Ý{ÝEæ¼ç1É®{îÅÓ´“’ª/ß“¦NéÅ;ô|åV½õÂs¡=áÙgß=ªz5(¥4˼úÁµ¬EÃÜ´Ih‰ÜŸÜÞ¢Rk‡šHEs¤ÎMÛbêWpáíí“Dî°aaj‘ò·ž35H•MFüÐÏߘ#—âDù.Ù[6ƒ¬<ú›ç?¯…^|š´:ÉÿÂj5!xpÄÖW%—ÎÝÔí-ÓxKÆy™tlÍt3w¶«¹a½ÔךKb®<³]Ö¨×>œtjMèëc¶žJøêg¸¾oÿý:ãøËŸm>xäÕé«ÿÅžÜjHa§_Káù–jaÄ‚\`4PSÞZ{œY¸9+gà…*¢ufçWOZ ÷xª‰hÔ{Ÿù køE’ qº¨â‹ó¨c„³ôô£ˆªt¡ Zº)GlÅq'[:S-Xa‹÷UãŽ2æ†"‡ÞÙ‹·ÅH¥†É)sOþ}Y¢QÝÁ„’nFI]V;™µÝx£%¦$Žx8 „4ÝU—îmé%;|Ny¡‰Ú9a~wê5Y¡ÿé™'"¾‰)Q\jÊ¢3JЦ ÅÙŸétt]P¬ÇØóò‹®¬rþ™cüw®þŽ{]ž o_Æ Â~M￲-)^ÿ æ¡×/‘Á… ½U×0b†„í.P,¥J¢F}ÿÝýÁøm£H€Ilíëi¤Êrò4¡¬÷°ÚÊ™°XíÈG3§.w-§¼Ô 4¿*&kåøt#"/¥™4ê k§¦U*é´¢Ô­–“ÔT¡Ã±$c¦²‚ÚŒiá¬õ6 UJ0ÑlW[®ËªÊ±6BQ¡FëŠõ(—¨Ó¯JVÙÄÈ­ñÙŒXÏý},ÐðbÇŠ!á|‹™¬O_¤èLšK‹\Ë>qgìå Ž5ت‚-KÖÜ4e_µ‰Aþ8Øånß…u»6ôwïàx‡cÕ 74îÃYUYMM½³öçPùw¾=çÌŒ§+nžî÷ÉÇ›|ö¼úæéC¿ƒÞ2¹RMoÓÿíî߯ÉEß ;eæš0ï)¸_9àTÙ& &(L`juXh¨5 GðVyÀq†^yCµöblUÄÜfî™WK>ý3#Œ²áWk°í¨ŽñyÇLŒ/®¡œ~-zBF |GŸ‰:ÉÛXÒ! ¥‹DþçA‡<~ÉÇ–r$YŠáQÙžˆ/šˆßN€±wYub6Yßdk–鿇BrÙ]vÃ]ù¤‘+*ø’Ž`ª‡vÆùT–X zçynþµâ†}ŽV"‹IÚ™à)Ö=–‰›Ô(%§š^ÔÅ ‰5ú\”#FZX§”ÂYå¥DfºÜ¦f®©'¨Šú©¯îJ Z^êò+ŠqÿL´ ƒBʧ~ÑŽ·Žœ¢ê)LÂò°ç¤ª1ÊÓ€Í,ùj«µšË-ç’舾«â˜Óv†Tª¦&'í“øÅy¦æÙ¯¥¬Ž†$À³‡¹¼.z¸Ö>]ÃÛ!¬W­{âÂŽlÔy¦Þ:k¾ÊíKÚ  ŸÉ`¿Ä‰6§ˆŸü)¦S2œ\¶ñ 43`ß«°'Lɲ1ÇÁ0uh`õ€ÒZÝ&ƒrÆŒôäœ^áÖ.v0ãàtÖËH,õ"T3™ôYüæ5äÐF#ê#X‹†DBE¯NÛ£ôªtï]¡kiîÌwàâ­ÆÊ*Ì-¸2Ðþj+Ä'žSÞò®+!…¸sŒÜ…Q{9æèìxç`R„¶è¦'ê˨Ÿþn³TÖ™⬫Sú!”Ï›ë¶kŽûŽÔûè*ʼF…ò^<äÇ¿îlò35Ý8óÎK™!M¯¾¡‰}ç2qA|÷ð†-þ;sƒ~ù¡d\}¸é«¿þÍ&ûD>üð\¼5磾oÿ+’«K?þõï~Û VýH“cuA€ŒM×À½Å ŒàB&2 z¯v\;<Ó€p„;(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ†^™ñ8 ËÕírû`ǯçü¾Ÿãæ¶ ¨Gøwˆ˜ˆ§‘Ö¨)é±WWó8©¹©“™9X×àôÉYjšcF)jóHv ‹²ôiG(dŠ%ËÛ»‘ú¼ê ìk|¬;KZŒÜÌKê’뚭Ѹ#‡å; S ´+©‹‰óÂL=Œæü™…1 Dáìl•*¶šE›2zó.éÑ Ijtе-1BµLÆ2«X@—\îBê)eÕ÷0Q=Ûì†Ü·Îæb i‹k^Q_wôëM)TªxÓ²ÄÅóÃÃ6yÞ¢KÌ-ßVÙÚî²Ë8r¨Çpµæ|ïí܇75h«W+S×*f Ø ½ƒYKµ…qçwa'—L)™5eU»SSÆL8O1ÒwŠÿ¬òdäw1E×:ôŽ0É#ˤýka±tÞ…ÿ. ½2z×6ïúrïôÏÑ·¯î¾yÅ싘ÉÿÝ –u|½B‚%¡]³‚ ^…ƒâ<qjFÎM:W•Je½‡K%€3^vÀ57"}l`¸Y:_ÙõÒy™H¢}Ó…æ5¢HF ´^l>ª œjkÁÖÚqË#v0º¸_Ç•F“"jšŒ¡˜Ø‰ý©…£€õåG^T¯Áöc™Yê‡Ô˜÷…‰¦Yl²HåzO*ÈU{;j)!žò½('œJž(àm¾'—/•¸æ|D’if£Pz"\œ5y¢JªŽ¡{j:)••Î×gˆÓj$X%5y—–úyè©=QǦ«3ª÷ç¥sVX§|‚Ê*\•|ÚÊjœ1æhª¨ohxãªÆÿ÷MËH 1wåN¶´+…Ö·JE*d«=+ަªd Š“—i—ù-g.*¢…KI³(9Šï€.ÝÂh!‰R«m’ªF’[ð»íW "Ç/–½Þ70´¼fsnŹޯi^ôŽÁh‘ùÆ4)§`Ú&qx¨Íz±››–êÅÌNËÞžšç°»È1³BÌ‘w½e\êÆâ·¥VýÆ:rFžÙŸ~]œòƒdá§.$/‡Ã'S=œ¹GH)=g­ÈÖÓx ð×t}\o…7íãuâÅ´ÛáÑ]¦ÝH¦– žò=V¼þ:wãà„Çv›Å@.Îx-ÏF yå*¾/…ó„YrmùB‰ŸÕ]yhwþÑèÑrNzN¨»·zêM/l•…®ó½°éh¶>;?>…œyî€á.·ïfÂ>‹ðî~ðÆŸ³RÕV/¯:ºE ½£Kó^ýOÄ3Œcöù6ŸTïy‘í‚ç¦<ù±¤Ÿ)ûêŸb>Øú¾Tëþ±K?N&× üù¿~¤Zý+SC·H;x©„l¤[ãâ×@“HEoŒà÷\, vÎÒ ðÜçÁúA0„Ç« Oˆƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇQ@Óòçú·uÝ ‡Ä¢ËÆøŒÌ¦ó9D.~€%ôŠÍjYÖj7¡ÜŠÇä«TÑ=#¨å¶û]<«§_°ŽÏë?õê¬À¶7HXØöð5fèøˆ·(ˆF险)d ÑY™Ô¸9Jº‡9è XÊÚzò‰†!Iëj{K![²¤‹û;X;!l ¨º«ê ¼LÚ©|ÈKÌ<%ˆ˜cM½Íô<œ¢Í-^&ý>³v>¾^œúÍ÷ÊNOX¾VŸ¯=™Í¸6ê„S§à±ƒ ¡xëWL!>y +ò’E1ÆC‰ÿ;ÒÆ‘ƒ”{Kòñ&ñ!:“,oôºv!ä™-k 7NF›<³){é®Xb4{7S¥<¥E:M—.Í*Œ3ŸZ!G‘(|?›^ýª!kB w"žJµ¬X6¬¸åöÖ\jq{«•ÑY;9ÿ…õáì-5„ EúñO{¡z‚º(.LgvQÍU\÷0âÄÿ"k^HYíD’™}ÕÊz™kŸ9¨õ¦NeNéÐÀ‚é­3öu®¶;; „2èáÓduzÖ Š·Ü·‘Ù:³ƒzèãÄ—¿s&?ØÄG®®+U4䉀‹ûM$ܺ'ó¸Å__ý}ePÚ^9øçÄ™ý´ÿÕßvBwÙwÐÁÝå%ˆŒb½qæ }“<‡V…mÖ`€®tá~èýány™ÕØI‚¶¡dîägYu¦¹‡âc÷ÉÈâ..®xÜá‡#yfùx ƒµ IÄY¬…x’%ÿièØ{“õh#fê(W*òS£t˜ý%$Œ Á%ØÞ’I‰& dyæˆ Ò×Þ;7·d9óÉ'Zv:ex¥}.egjÌÝéezŠå–êA$•L²¥ )AŒ©¨§˜-*:YeÊq]koÎCtº› Z)¨‹8gŸ1"(•…Žz)RÆwSžº $¨cŠšé¢˜îš'€O¢Âª¢®ÿbéÝ£•ÇTSR˜VÎF”ëyLòpš€`Vð[“¯ê`f©/zz̵Ñt™”ØË­‡è–‰¨,´EÊ^½¾Û¼fˆ!žåâÚ½Ô)ð¿Ÿî©e†•{Ê;ªëW˜ÂJô«.¾&­©1YK«’o›p±ê¹:0¸¤ Ûî¾pÞçðŒƒÇ%ÄãvI‰¦Bë|¤‚ÿu{bX÷Š,N³7«s‡kU8ô6C‡lHÎêè–VÔ‚ÆXgñ·¶h]¸Ø¬#Ëì2}a|ÅÊ%ÜpÙ(z±Õ´Ýq¯××»Úö“ßDN5£n©ª}°áµu¥™±à:Ny,±À­iYåšc%aÀ›þtãÞšó`æ ç›µÊxzë öëzìÞÊN»Ô׎»íäýaîh²UzÝKû^éðÌFüï2–¼UÌ#öuµÍ;¸•ÓØð×¼PáÛkš÷&hÿý#À Þûºå3ôâño9ùëõLÔó‹œöG¼ßßSýÎíÏ¿}ü/h%  ò‚78ÕÈÏ€)à%ÈÀÃ1KeŒ Kf± ‚ƒÔàݺf(Rq"¬]XÂ. !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íò›Ñœë÷üïl—à&¸Ögxˆ¨¢(t5xð˜(99ŨIdIéùI“9ÑÙ¸ F šªZ‚ê‘yʘ·:KY×ÀY»»Ûá‹ÅF!êÌ{¼Ú)*(\±ŒeŒ,Ûl-Q9Ímø<ªíìüÝ]®¬nήê«| Ô>O_¿¡^¯¯GŽÒ*ÖoŸ@5Ã0äÃ60¡™wBº§0â–€þ8´'1ãÄ/ÿ ÿiüØâ"Ç ð‚4`Žº¢[ºíFdJ¸„(zÅ@h~)Š·b é_†?Θ”e×PŒw\y>R7ÌT.v$Y‘jbHÞˆ$ù&c“Abù$ŽÛ•™Þ|p²)§IðUäå”f¢c&|KjueŸ¨…™%ŽNŠ™(>i®I醭'.¢Øbsw®ch{FšÚ–J¹Ü xÆ]žQ¶'[uüÑ é‹­ñ_ŠQrÙÞ§†úÖ¨–ŠÝ©žÒ*™‡ÿÖçg²öô8+§ºVJ¸ÂX•Óu™íOïi%jZ •ˆ2à¤ãœ©¥5º«îªo¢º,»6Æk![Ñš‹n¥þžŠ ¸“ñ{Û¹|’Kf«pΧ\½¿ª*ªÀÙÌvŒ2̨óbìŸÄ¤’jqÇãð£Õ&xáaøþ[Ï«õ56XÆ—F—g¸†¬ñs4k ±´97›rÄ"ßLòÎsél/ŠÆ)²d½z>ÂØ‹£’ÛÊ,w¬Ë†W0ÐÖ’T´½½ˆLð!MË,ŽmcÙµu½ÅvÙf“mõD!Ϧ¨°=ÄõÕ~<'ÚSœv y­`]Oxxã¬!è ýî8âÅÑ…ÊdˆVžØÞ¬vóMœå¦zAŽúƒŒCù¸©[ÅoI¬¼Nú_4þqî´ûÝ¡»ÿ~4îÀo»×Ä0ã#!ÿ7pƒë.9ó•bKܰÒÃnýäãyýn¡COW÷jR/ºøµ¯¼ù‡§¶ú´ËÞúyî³ä¼ëhy<D¾'¯¡˜uço6q¯]¬R¤#·:倎I [¦(áHå©{ÍÚ†* bC›×4È}Ѐ±ðÙ+Xž žsPY!ðJçBâ5á1¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ›KªôŠÍjAJHWnÇä2ô[ƒÕæ¶ûíD«Ø&ŽÏë1ì;  ·GXhx1øôàwøy¤(áXçgW©¹9“Ù¸6É9Júé5á9áÈXêúšñ•j1+È ›[Êû&j©+L Ì#Æ´<¼ YËKQ»èpÍl5[);Ý }ý .ø×ˆn~NY}RŒÞþȾ ¾êN¿Û TŸ,ϯðÊ6BD ˆ0г :ŒSμòZü·£âÅÿ5ÒâV‡£H…ž“üXEè9kŠõ6Öòh{sìÃ5·æÃ¡t36¬2Þ1ÙUfKë\²0]¸µžÎL4òU6—KíŒZõ8x‘¯½ËÛXcÒªn&7þ˜NdÍF¡V¼[»yÇÒÕ§ìþºýÍÁMÓÿï¿VèÉG;D¡tY‚ò— F4TÞ‚Ù1˜R…÷¸Û6‚ x.¿EGJçÕ·Ø€ÇñÒÓz ÎbqÓñGb9Ü%6£‰®-¶a\zùe[8éßj´5f zÙ˜š‹ûXQ{"96¾'Úˆ¨!”þµHÙ’O†Gå'µùHæG¾µ"¦‡ ‰¥pHòvã¿dÆ¡hY¢Õ&^!:)g•ú‡–oZ†Ù •¥¥¤&cYf£ü†{^¸§rЄi]ZvYbIòÅ祣1‡é~’ÝA¨v†æ©*ŠšF‰§Nzj¥×‰:'fšêæ‹R2yèž~Þ˜Ô¦½ªV㪟ÿ¶ºˆk>ˆ¦cCŒéƒâÅ’ Y ªÔ‚‹¦÷ŸÄ⊢¶ä| „MÐN sBêÀjR϶+¦£ö>[‡Â–fµ²¨gùZMœùíjg|"þ™k¦F¾ylišðŠ®2|$©ï;ÈrF΋-÷"ô]±Ñ¢/DùïÁ¥J|ḴTeļ2JçÄÇÔÄ…æüYÅò¶ã¢.é ø<·˜¥ ï r‚f~x1‰×,-lx3n›š*Â-¥Ö”'„ª”“wûùæ}«¹èN£ë¯éª¿äùê®SEÞS¾®·¿ZK{îøÂ®ûÜ¢â]zïJm%«ðÆïþ%>ÇÆrä-Ï<ñLCVó9Oý5Öm·WÝg?„† ¾>M‹üZù|ˆêNÂÛ¾Ïy쩤:Òôo„y¾ ³†½ý 7åÙãبIH YýC Lw@öè¸ÛN%ȹÁ]ƒLC9øn„á! —‚‰ª°!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍj_¶ibÜŠÇd¨WVTËì¶»ÝM×ïºý>’3Έ%þè çñÃ'ˆ˜ÈF83xp”ĨHY‰2i B×Ç„i z’ö™Ñ¡é'ºÊêèŠÚG’*ÙZ[«ÙSš¹kë{÷I 3Ź×û‹ 7qlUûš-­ôõÀL!w=½M‰û<ªÍ-.ÈŒ>®œÞ쳈ëm,ow~ÙÛŽïŸÕZ¹±Ð£°ª„rÁæ0b¨tÇ„5úÀP¢Æÿ=Z¶1äbT.u‚(2%—ƒ%1¢³¦2¦oždÚEË1=„:æ²Àò¦P„“Hvâ Ê¡Lf3ŒNO“›Z]FÊ‹*5FÅùv5ìÊ£\Fš·+¡Ow¹‚¸åö¶ÙÚ|™êÅšµ¬NkS“š+ö×™*_?¢å«FobŒ’Òž<1¦Æ-Ë’[ ­…:f[ræ‹q;·Dì´áÏŠÏz•waˆ»UòtË©ëO4—KxbðYÚÞÁE«.~¹ô÷x†u<µñá˜1S^Üü´ÝÏHyÝž#·ÅÙ×aj®J}²iô²s*‡\jÞóÍ£‘WnŸùmy°çÇÿ:Q­-·YàL†Íx²q¤TvØ]ÐÏ@ýi·YE^T† fèx©yÝ_æQÇ^…!¶ÕWzÞ 5ÂA§Þr%J6HŽX Ž'îÇÞS±yG[mB Q“Ž}E|/šãtíµ““ƒõU7b2懟)SÖó :6™"t­éV™Cžé’‡guDRŒcnYÜ“m%H –œQ¨&-ú§"•Yöhšq\šµŒYîéJ6(’‡f£9øIŸ‹¥'g”r–h_’…I߉Ò%G§¢^fŠgœ%}y(œ.*J™™ ij¥“LVJ“é÷#õÈZ¥­~Îúâ~‚ÆêªÀ"ºjŽ~ÿle ‹Dù¡/I¥…Ìm¨‹–ƒv¨KÈÆÀã¥ÅæJ ´&XŠÕޤnš­§ÑvåCæ:Ц…¸‰|&NZèÊ®¯ÿ®+­•ü¶z«=ÕÊàÀ‹F[j—«-ª•ÂWþºĆÉ2/½¶ X1€¸‘‡¤‚bú0/Õ!pÃXª ‰Ï!¼$®¦Nû‚1‹©,Å ºÛw×]#1Œz\¹[Bå×¹†¶ìKÉG-uÇxr–UQAña5„ýöFÕ`Ã!v·yªŒÓZït²»H )•0 ƒh°É<¿íè`L‡h&¬Mã}¦t+©/à†£©«në*æØ‡¯C“‘Ž/þ¸Md»B;¹¨•3Õ·‹ûú¶ySVë£jš¡ ¥–y§¯¾êö°:éwÃN{ƒ¶|{íõ­—ì]ë>$?„OüëÅ_ðäÈŸ^1¶y,7‡‚½XvÿŽÆÕ[?’ôÛ‡u¡éS?Tøy(O~%`kcYú!ɾÔLî¿o̼Í/’ïnZË×ïø#CFd-cÿ‹ƒNE¹‚wdñŸ-ç¼£ ï)72 ƒµ+a§¸vpƒ",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰6Aʶî ÇòŒöJçúÎ÷¾xÃý†Ä¢ñ販7¤ó ›*ªôŠÍjAÖ*#(ÜŠÇd¨rqf†ݲû w¦½ßvüŽÏ‡ÖµÃ<¤'8(È÷ñè`HØè¨Å¸ô`ç§ùˆ™Ùry99Aéª9JÊÕÙ™±†˜¸(Zú Û×Z™ãª‹›Ë´(+Šáj°ªK¬û+Ü;ò;\ÜLÊ,í<Ýx¼qjÝ—MÍÝÆû™ì=þȼ-$M¶MÞ.†í›zÌî^—m½®nϯ™–Þ/ @4ôì§/ÞÁ…ä î’„Œ¡ÄÙ8ütJ\‹ÿ;b´¢ ŽK^[¦Qä ’&[Ê#¨ÜH–.]J«¨PÊ4kÚdI)£²>‹úJ-„žF›R…nÎ:¦ÒrеBR¥KÙ…ŒÀ4«Ç9mʆ’ÊiZOWy*Á×[܇añÌEë¡,Ÿ¨Á¶ÂËÔªX„PY5¯k ¥ëð²‰8Iê¬UsÒÈ YÇ:²Í¬æ›g°˜‘%¼q´6lqýi,8‘¡°±›ÜkX˜-Ö‹QÒ)­4eÈ“%_ÞEY3§Î¾…Ï&îå®iÎDS«¤.)R0¹¯ ®«[ó,ZËŒS®ú¼qéÉ_‡þ~jôå·Æ.ߢÌé¤ÓÏÿ·ã—rùq :_¹‡ZNãÅ—Šø,(šeÆÔ_[KX_²uf ô%\dþ…Úc#²rÚT•íwÜgʼnVŸsû¤J‰.F÷Üh¯eV›m>N±™~ÕtËoÖ…8Ù‹&ÆèÐ[ гbvJ2‡ÚEQReb%4Ú‡"‡’öøc™ vÇÕQè@H"yUV‰>Ô±×X„q(&ƒL¶ø¦,qÖ™åPÚNŒyªwÜåž™Ž:hʺêfppv‰!Y¥(Ž0ö·ç•IúÙ% xFß–'Îw¨”«•ÚæIk—£¡´bú‘¦—qzªzŸ~*—úÕ&¡è‰¸–ª¶ÿŠêª–hQ‘fdâÑãigQm>¦"øƒ•”J Ìr«Æð–Wø½+/d*c^¦S~;l£gšË–†ûh¾×†wäFëfØ©½¤¤tþ•K$®tö° n"¬ëÂÃVµÞ¦sŠËÖcÏi1¼Ìvèo¯‹îñ¯¾%íUØa]É;ò¸“.É_ÁÀÍv®e ׫Ã#\é}0yk¼•Þkç«ü§E)Ÿ·CÉ&ôkaÂ*"ÃJÉ37I;­ÇÑ\wÍ7•7µ‡1ËûÆÖh—á5PK§«c´Ò>M7·Još[uÓm¿cz7°{‹Õò†£*(¸Žƒ?Zä—†8Ñ‹g5öÛBÂOŽù r'~Hæ„+GÏÚžÿø5ƒ%8zK%c|Ó5©{þàà¾nê`#N{îYš£{ïCù< ¶ãÞpð°GE¡ÝÆùòΛ^¡Ë =_·èŽS¯ï¾>]¡ÛÀÍ>ïúõMŸ¿G»¯ï¯|ÆÚ»‰ X0ᨃØ*|øŒƒ/‡µàA¼L8ÿÐ6büè­ß¹_srx‰Ò µ2›A h¨dÊ™_œ˜&Í™+e’¤ GçΡ>Ðñ9iÑœK¢LMg) ŸšüšZ…ƒ«R0E}ªZZñªØ^¸˜AhÖåF¯²–¸ÕöV¦Ð@qYÍ%›U2V*/Üòwl²7„å%-»Ê죿È,zA·/:»R}•k²Í¬]WÖÜÙòËÌ©îm>$ZoZŸtrŒjê˜ ¶‚1z])5ê^AGôŒgX±nÔ¡…»&Ýõ˜QSÃÑx&ùy)ÇÄ.öêÉTn?Ý < oÓ]‚_½9g¾˜K&?}Öv²ÅÏ“voÝ9üʪ§ªÿ Va±ýtŠx„†U‚ñ]5„ Nè_?ÒI¸`¹m8ÉY´)x__òÙÜW†gÔI‘¸bƒÿåÇœqôANo5^à‰š˜TcµýHÆH£UÓÍ{#n†Þgç9”‹ˆúYK’:"éà…à1×ßRê7_„&ñ%b¥a‡a–õ"˜1’(e ÁHnוùdˆ¿ ØV½áÇcŸ`åU'ŸZ’Øb”ÎhcÉhHDZÙ¡Ÿv–ˆg“K®)h¤s–'ižw^Z(}\~%g œ.Öé”’Mj¨v¤Ê#xª**’n:ÕgœBšªf}ƒÚê)•kæ¨)¯¢z£zÄÿ±ú©« y=|(­3Q0)Юîð –t¦êªÊj£ž)jÛà™!Xz`š¥Rºè¡ÚÄRb€:o£Lywïn‹R"Ü”nŽDnĶ{fïnª¦Žˆš§0dì…ÛÞ[W» ³cº1­¸^i¦º€å«ï?üÞ›-ÉSxdÇ‘,1¸Â|ª±ërÅÕõZ¥Î¦í–Ưr<´'/ew*“\ò:õv”H²§(y0@C‹ŒÇÃ2“r³€ÈÂqt —;ØÕL¡5Ö¢µ¦­ád»cÓ ¨o"¾s¶Ü Ñ­ N²e€®Þ?®V«‹ßž·àóÀ†˜“€[«xmE2œŽ£îÂD.ØÄå…Í0æžø·_'Tþù¾gCXºç‰nsê@Ý0Æ»Þ4éŸN;æ«çλej÷<»ïºíI|îcùæñÉïðÏóäÃôzKo}éáž}æþ öÝ[Ííïãûád‚-þùÂ,÷=§£™ï>>4²î-§_+m-±jÏêŽé‡^¿Žö¹:H‡ Â{ì: óO¤3 =D|ˆŠ|ÿ\ˆeü8ÂÔ! -f¨2¥!OÎã‚R¥Ì^«ÌL23ç‘’*¸ñ¥ODÁñu¬T/¡“n}ª‡K{ÜQ'šþ‰j6 räj¥j•igªV¦ZcžRšzÙx¾~¹—­ÿò×b¬Æöªª¶Fz ¥žWqª¹D„¶Þ@报¹yù(šJk­v˜k‡2r®cg†ûão欫Cº3R ¤Ä‹én†› ¥j,µØq7g»œÎç®ÃàK­¨;ùj² ^ÇÓÞI'€®êÚÀˆ½)®µ“õ&˜¶œ#.ps)òžÿ5ì-Äõú{%~ ã§ÆìÜ,±Ÿù5ö³Å…й´‚­ýŠPœ1¯¼Á)ÞFQeS+¶´Ã¸Üêµ,Io=$¢fyâÌÈšT3Ùc€ 0]pìtšàFäËUTï}\ÙøÂ‰°SqóQ&èEUîN„ür‰d†¸xä;V”6 ƒÉKn6*[\œ™˜G˜‡›ýùL÷V%–k—^¸6V 9ë„ë–Õ nËŽ{>Ãí»¿ÃyÏ!ýNuåG§N|›¸òÙNò˜_¾’ó «+ýôQ«^ýïÿ š=îâøÞ½ìà‡¿Õò‰;8>ùÓø’è¿e«?˜èž ù¤ÿ‹¶€õÇß”ˆDîÏ&ƒÀ&vKI £ªPJeÔ >8c®Ñ5Ðtô"ô&¨Jä‚Ì`¿4ØAÉuå`!ÜÉ$XÂÅ‘0…ák _èƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·\ö¡¬Z»ä²YvPã³û §}ÁsÄ*;Öãü¾_µ·W³öwˆØXEAhǤ–(9é´˜¶È†i`øÈIù gÙ ØzŠ ¥iW#¸é˜*;ûÓ´z«§tKÛëÛby{§÷[lÌŠËÛ¨|µt—{}j „]È,­-š}¢|½®hÝ-n~®2QŽÎÞ¾Yλî>O)ߨFM¯¿Ÿ‰œÎ/à™Q÷.`²'0!p¸:,v-Ÿ¿AäZ$Î?ÿ]ü¤£³†:D‚üȰ™Á &Oº 1 ßÊð^ÚD±Kb’€6Þü©îà+žBĴʈ„,ö‡ýú¥4\»Ö;×Íá,]ödÏŒ¶¢„A"ã·´±lµCе"˜ƒqõM¸qÄÒ\ Å_ò]8:]9x¦§EV'Ð ÓäºÅùÄrj¾Û™0Žï}¤ƒ^—T{[c6§£Þ‹¥sý±Ù°Ÿ¤íë·ß®;¸»_÷ïÂ<ÅðI2KaðÊõn<;[gN{ó^1¯·ôn*o½ôÔgßòì¹zÎýäoI~ãä¯^~ùÈC}ú/mOö>–µ7*ÿüÎÛn|ðëï ¡TÏn¥øÁ¾þYö È@ÍAækÏ0`c—'àäï‚KéÖbA:/2x¡ð V9JÐ]@Sá 7èÂã,†4ôA!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä" Øø!̦óÙ«%ЪõŠIÈ%BêÍŠÇä"BslËì¶V§ÑS@üÏë“Û\´(¸Whxò·à§ˆèø)·¡YiiIøuvÉÙyt’Y‘êizÚWJ±Ô(9ÕŠ+»ø š`{À kàg7û L‚K ¸Œœl7q|{ˬ,M­£è<]V[Û­ ŽíÁÌ~Þfn1þ…îÙå¢þ^_ÅnŸ¯ï›;L¿hß¾VÊÉ›ñ Â,^TýSÓn¡ÄD›ù{61£™yÿ«ú`¨¨1ä¸]¥jˆ2¤Êƒ€\™ìèq¥Ì ØZ9Lïå̶FÆKÈ!åΡhDõ»yÂ+¢LSAëÇ‹K/WO›ZBIª3›‰€^ýJëhÕˆËNª©ƒP~Á¡]«Ç­/ÃpåubtÁf» ï29%qý«é£°†óÜ’­E~r M K®<Ë™Ñ"¤uëd¨wÓ‘<(sÃvû®CìW\ÏÃFñšLõXЗ9ÇÑ,‰ÔÛпgëýfØ3@ÈóvKê÷h.ÏØÜy®]»¤‹ÁNmùdߌÇO­Ìûø©Û~mâò¦Q"µÝ}½Î õúÍñm·ý<ðµ„Ë{Ø„‹?a¶;ö ù):¯õýå•›BÓ0:¾ù—?imè‡þ«¦¯ÞÂ謿Þì²ã4»è‘ƒ];X®Ÿ†{î±iî;Ús|ñ&U¼— ‚þpòL¡þ¹äzîüD°|õà {û‰ÔkÿK£ôD7ø+!…÷^7šRò®7ûÏsˆý+ÙË/Žž¾¾R.þ9£„ûù5¹‘¾÷iå€Ô¢± o[’ áÒgAÙu+ƒ”A!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Äb ÈøÙŒÌ¦óü%•ЪõŠõÑ"Û5 ‹¶®×°œšÇì¶;–† “€u¢ë÷|QÞkwðÕGXhØ(8xØèøøð§07)y‰yI‰ $™ù ʢȱ è`šªZaæ):Ú¹*;{”QÊYçJ»Ë;¹9ñçªÛ[lÌJ’H|̼º,ù\çÛ\M(MmÍ}ˆŒöýÝMîÖš3^®.–¾îþŽ~ 3 Õ>=“Œïo¤o"}ÿd7OÛÁ…& rç‡É7³wLJÿ;b”H޼„AÊ鈅"]=´™2¦…/ï¤á(3狚іàô¡3è ž €d)4é‰5s¶5²èP“J«Vâ¤ÌiÑ‹’~Fµ ö×¢ºå­šÝ©žyZ¨¿¾ŽèjÑŽ{Ú¹ïÎ{ï³GØûÒØžxðp_…Š5„TbI¯±J™5lê–ÚÔk3 è‹%®’q'Ím¸æô½F—ä×¥ïŠ5 hJªf…i¼†R°S1yèªA¢IãÃ(ÍYv¬´2áÉ–éuÎ<s·¸Ÿ¾æRYÔàÑŸ ¯i´.¦ØTaÉý{Î×k1^{M8gëÞÃ…†¦LiÙ™ó¼œ ¹qÎÁ”Cg~\³µµ8¥oV}½ö`á«‹n»umqב˫¯.ù:ÜÐj½¾~ZvøòKÇÿgsÚsÿy6Ò€÷¦-dÐÕkÌ4ÒƒÏU0DíÙÇV†áW‡bèápç‘w[p:W {ßðgš>¢m·"~)îàŒvÇ]uÞéGŒ ÅÜ*váF¤»åØM Çb{4V6$aî86‚×d/6G¥ö] `~'Jˆ˜zŠDYdšq¶J;0YcñAd`^îeG\˜1²Æbjt¶6_lri¦>B¹Ü2áQ'Œ*n€¦š’úu&£XÆ åœ:Ý‘z:Ù#ŸrV‰è}–îô)EÃHopu—çgxˆø øå5HØÈ˜8I'Ù8ȘwYù zFøjzú´XñÈf7Š+»¥êæ9‹››qÛJÁJª,ÌÂûe ñ;¬\™üÑŒg7ö¼LXŒ¼»Z½­|]ìÍŽ:ÝíÃv-®>ù­Èë¸?—žùRG/Ÿ/„¯ÿ¯‹Ü~ ÆðwœÁ…MVAGB!É%+'C EŠÿWÑ#HOÈŽ$ÿÜ)Bâ±’,UlÄØ¢”-k^ÔéÕŒz)múÔð’Á=_<b ù³$,À‚&}:Ðѽw’œB½ºBÌRŠ\‰Ä 6È ±[kýš6ôè\Hz!5ÔÖ˜Õ™dݪ²¨'-²·_ò¬‹­qûÝt„kΓKt²*ܯñ1Ȇq"~ Shfi˜ ­Œ9¹U3ÆœÂöù+Ù7jZK• ú"ßÊ~ò¾iiçÍs}I­GºêéÅ‘1ÅmûØÓh⨅ï^ü¸èᇅV…DŽrÓ¼åÊöí$3Ç`ÁsOmݸÛéU”_‡ÞܼÑò¡åR÷êΜ«ì›!bÿFžLÔµ¶WŒWSÅ­1ÁrÙ<¸“eFÍðJ¨áÛ‚š5X`œÑo^Ñ—ÞÁ]·‘v®Ÿ&&F'_ƒÏ1¸ßIwž6…4³Õ¤=S±¦•Iµ°˜Ÿs/8z6"hJæヤAÉ^‹%R©¥2c½I&Q¸IÊ‘õ%]!Þ ¸žwXÒ“Šž¸f•QºöaNéÍy߆ôÙ)(vn:Tn Yf£ðÅçzÊç$…ÏI'§Ÿ12×€ªIöfjÈ x›ñçiSHJi(Ž ¦Ê(’2Ù¦z^§ˆšºÈe§xÚž¨ìeúªª§ê8è³ÿÖè*†<•…’¢Ä€ôžZûP{+ˆ ö’s4B é…É$ŠºFèI©:¶)¹Ûq«l¡¼¶¨€ñjèh¾z¨mn?ÊÊÜ¡¥±˜W½I‚škŸ+J¸§ÀQ†–ܺ.Ü,bß^Ì,Ÿ[%¼¤6õ¬ð&•:“®¾ØkˆŠ|¯GKaJêǼL«Ì2ÇpÊq·;Xä…­jLÞ°½>ùaÌøÌV²Éù+òjúj‚¸rÜ4D» ×gFì^V«ƒõØplµo¸YÌvg41a¶Ó5°·K,wÞîèêÚ%*F¬wành*m˜· Žxdhå7gO‰ƒõ Ø÷ãO»é¥¶Œ–o~“JídÈùOi»0uèsWžó8›Îzë®›1úëúTþê²;úÑíA®¼ö¾fê^f2¨Û¼å¼Ÿñ #ϼ—«7ïSµi}ò¶ü;ÞÕ·¤Ü´Ûcå KÊÐõ‹fN¾MÔ³]a…éƒÏ |Û¾2þû³£å^ìö3Ô¼ÂÕ¿¿q ¯pŠO­§9®ù뀸Ûp„§@B®w) &ëî‚ÓwgÁF/",á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡ÄâÊ2~H£ó êšµSŠÍj·œæAùð"ªb®ùŒŠÁ /»]MËçôVyö^Zãõ¾ÿïA•t·Çˆ˜¨’7ö³)©gðÖ8x8¹É9…GáæpÕIZZFX)ˆéh˜j ›óê–:*‹›»ñ*J[Á«+l\²Ì:¬¼,”Ìüœèü5« mí'MQOÿº®N¿µö9 ¿P¼ÂmÁ…§ìÉcñ\Â6gF¼Ø a7„ÿ1zd! •ÁÃ|<Ù¡Ú¯’ñ–Xd‰¥³œ‰ÓB†×ïê—%Oƒ<ƒn:¯Û2ëÉæø¨f¿‰AîåõçßÂk“®ÉUÒ¾>¥ÎØY³ëÈ@,þŠ9ßçb¿ûêe;\µèçÂ{Z¡ˆz³Ðç¼£o\*ÒÙŽøzw~^·pæÔ§{Öm})dæÚѯ/=Ÿnñ¯ø¯«ÿËžžB÷=¶wîE^^æýÓŸ|ñAgU„Ûd䃆¶‘bÀ€"†ŸÁWE]¡`T~Ç_€…݆S}ò5G ŠÐ±à~ìX}58Ù„;>…WW¹ÕF¤Û­uœˆøæâ‘2vG£M…ÐØÝr>>)b”75‰^•In¸ã{&r¶%xH¦$e‘jrábKš§å‰íç— jø‹’¢‘)ç˜øù3Õée Wþ¹ç¡ÿQJ›].¹f¤vÁxM\Nù真Ôi(mz—¢ŽQVÆáppÙè)žNž&*¢~‚é ~šÖ.]Úʨ–Ê© )ö4 ŸÀ’Jg–žù!p¬ÿ* l¢°bǨªçik‚V@ÚXC¤™êƒq;Ζ‘]Ø¥^0k«˜Ã®ƒÛ„è’P\¥­9I-¨=Pú¬½©²rkÖJz’™Ý.ö—Yúùj"¥¨òJì©õZk²6jk*J—ð±KKk’÷hh°ñTÌãˆ/ÌÈ»c´ž(o¿KoÆöuT³qÄuü¨ÄÑZ™ŸÅ%é\²±K-Ê$‹‰ïµ<-üòvBº²mg}–O³$LÒÿVäõ¶áͬ ¿Cš|ôBa3ó±Ê÷t\³kTmìÒ×Uë$’ºwêáÝ~;èÓã&»÷߆Ӊà¼Èšj÷áL•GÞp—êxå…ÇGU²r5nù3ˆuáÇçz§=º`Ûdzêà¸m†®K:´Ø³ßÞsè¸ÓNùî¾›ðµx¿On…­¿ŒÝ:âŠ/][zñõÓC™èå§•ðí¯-’6r¹âMv—3LzÈ ÀøõÎl Œ`‘S7 ЂïHÜ9ÈLÜ„·CàI8 ¢px#\¡ oP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ú„JGPŠÍj·! i­*‚^®ùŒ–¿ëX%NËçôV[…x/ïìxý¸ÀAxà—§'¸ÈØ8x¡8™çXiyyhȶԇéùi楙IxzŠ 3º9!Šèöš:K"+™ÙZ:YÛë;&ãªyû[l <²6J|ÜŒÉ|h í\Ý»úEÂdÍ]mòÝ-žEÍn5ž®np¹þþgø-úPŸ¶ÊÜž/à–~æ¨ðq%0¡‚7”S1GÃ'&F¼gЇÿ;ÒàÈŽR2mKz v¯P‹xLº¬ˆC È—4¹ðÛ¦cfÍtJjÃ2d+žD§»‡I€E›Ú+#s«Œþ„:½ªj´*@c2mi«Ø•PËB%5V µÈb%'Ô«·¸iwøAd—.°/|޵v·l"½7 ½pÎŒ¯äJP"×ñ a‡åTur]ºCýy=j8QfJ(/à üYYäÁ*÷µuø¯:¼Ñ’êíäÚïã{ŠGŸ~í[3dÎLºB-r™iÑ–ƒãZ 2ð§C–vήø#ì\#ÑÎÞãä=Ø75ï=ܳuãÔ1'n½k³úã8WKßÞžotååï#ÿSŽW|òèf<„ÜnÕYÐЋÖêrΣOí zéT·fz䕲àyê&}R×®Ïîí¡O»í³—3¥î’Ÿ^Ýæ¾s#OOÊ>öÅí€c’…AvÄÀèÄTÜ'WÁùh¤;è¶ât„$4@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ¦ŽË ñ8 Ëa쉛l4çü¾ßQGqhsõ‡˜(W–1ˆPó¨8IyÄ"t¸†Uéù‰tÙ±ùÖ zŠÊ#ªñVH–+ë² (*éT;»ËkŠ+tëȸ×[lŒñ5 l‘©yü -ø¡KH}}j ÈÚŒý .ÍNî©í%^®ŽX뜾–¬“ |.ŸŸ6¬ßïŸg' @€ÿ ¢º7Í B-ø \rg*â‰?.4¬p±”DŠÿé€!cÇ‘IV!$‰2)nïRºä²²”®“8D¾¼Yí!›8{î´S›™èù<*¢L² †– ÄïcQ¤Tí8C,çÀqzªz 鎛{°Úxã‰ÉÀhÿ°Í²…X¬C[lØ6îWr+•:Ýf¶¨É¶zr…ŒdËP‚‡;½ÝÖáUÅ WVFe+káFjf–˜Ÿ2†\vnaÂÝöRUe,PÁ¬Ÿ¶‚¸ðh©›Cç~©ÎÙÏÞö½¸÷ÇßÉoÜu›»Ç¸wͶ!ÜX½–ÜÛyòÁŠ{¶8:o“Ç—[wÜØ|ìàÉA«?o<<ýË`×ÿÕ8ßjµ…EÍ]ÄwW-ÍgV=¸U~¼1¡ƒ w{B è^{o”öœrÎØó^t®×ˆãÅ—X\ûM%†*ò—ŸŠ¤lBS®í˜†‘I8Êwص"yz…f(ÖHäŠà]D]ƒ€I5‡å™"+§Á&Ô4Gòf’€5ÖFÆG_/Â`‡J¢7åu¤¡Éæ ¹¡(ž›qnW•2²Xg–1^¹ç„p~©[˜ŠÊ•×2OÒY–£™GW}MÒ£‘Ì=¨Ôy•öÙ"gUŠXžœLšg{ZiU”ºiZ*§Á÷雯by*v›JÚi€µ˜h£žh®ž®)Ú£%ÿb„¨ExˆQÍø£˜=@)e…|v¹A³‚¬É+?¿vå­w¤n7£3ºúàê…—n9YuÙ¹h½«ñ ®ºÞQŠì¦íÊl¬üVki¢š¥‰lqùư| j‚~Ú­ ÿ{ê[⥺Üo¯”k‡öªc~ž5#¤—Wêp°Ï²‰ñˆ¶VÇ߯³Œ®–0/[ì‰xØNùÝl»Ó£¤•+Zv›~Žš{›ý9èÂL^zêg.¹êaâ¡Ä®Ï^ÑÓ´·¹³ÞÎ÷Ôˆó>Òï<Ï#>z Oü?°G›üQ»ÓÌ|ôÍ¿öŠGÓ_/YçØƒ2 öömèè¬~™÷૵Õg(“Ï òç÷AÔèo­'ôïë#þ¹õ[žóýýØ1§1Å|þSH†Ld—;°nìkÊðøÎ}”Ç/WA{%PÔ`‰¹–ŽL",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf樒ΪõŠý@I*BêÍŠÇdåVq>/¤å¶ûÝ OÔ‰.×&‡ë÷ü¯†ŽxðÓWh—'"hÅvø锈ö79õ€©¹ùbÉU²8EÈIZŠãé:ƒgÚꪈz©Õ•˜ùz‹«è7SÊ›\«f ¼á(¼ÌŒILuL¡ÚL]­…m½ÝfL-Í-Îù b77žþ¨íS®þ~Ë?Ï<ý´KŸŸ -¯ï_è #Láþ;Ø \*|~ë7b{ZDA±Ž•Œÿ;^ ¨ÐB@$ßÐú(qaÉ•¦5J‘’¥Ìv¼î bHPàÌ ”šä“£¬1yµùåä"ŸkØ; Õ…-¢MEŒŠU§(/A#Éó©Õ›×Öüº í%¡RÃte”-Y”¢³²’ÄܨŸs‡2`‹iU q)ùMÆJ–Ú¿žŠÖxøoÅÁrSUOz>\ºÇß‘ûæÿ?cKÛ¿+e}ü `Æj/Òn Ô\˜¸ûAp] œ eP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íòçN4çü¾ÿ›•džeG(ø‡˜ˆVÁˆ¥×t(ä¨hyIS iÈ ‰  £I*tÇt7¹d*êújÑÚª2A¦9I‰ »Ë;›áKYÃÆøÉk|\|1‹‹§Œ Í’wX'}ýèðœ¦Ç¾8è9¤{ºL±'ÎîZy®ŠOØ^ßi¯¿ïIÂÏ/ »w "ØoBƒ -¤Õ0¢1ór<”ˆñÌÅŒÿ-¢hãM³Ž$ùœÛˆ*eÉ•›½xg %Ë™Dþª¥.ŒLš,OâYFP¥KžD[\!¶FØË¢LS$FÝ·2;›ZöMU³5vª&¼ Vd :«X• ‹¶ÈسÚrµÍ:4˜¯sµýdw×–™b‚¶ÊÊénZcÔÖ¢Òµ.9¸Rsx:ÌqÖjoEEw—í6k”%+ut´kåyå~ݹޡ WçSv”ÞÔrÖdTÌ“ª³Âž !lúlëà)I…Æl—¸lÔœÈZtïÉÉO‡¨s¤y™Su~Ž9j5ù~ƒ9Þð¶Þõè×í¡«—nüréëù²7ÿ? ÞzøÕ‡|º1_)Î6œXÚÕ2ßMÚTʃ^Ha†öf™…jVY_hõLÓÃ^‡ˆ)÷ xÅ(àgí]&ÜHÜm j)’¦#1³%¨p¸ y®©'ÔcˆÑèÝ€*þÃd…ØUÇc…;ê¨AwRö÷È'òçŒYnˆ%‹¿ÜFdšXéÑ“ŠQfçÆ~µqùÆ”VI§~êDù˜˜ä‘ÍÅù…#ºwžž&Ù’š’z©p3Êyâu&W§t}ÊÈÚ¥±eJ]˜‚zZ&-^"J¥˜ƒ0ºž ŇЛ(Šª3GÚ™£M‚Êg{ŠJß©JÑÙϪÄÿ꫹6*+°æ ©` ÔöÊa7jA !¶ª5æ–±˜#e]‹ë¸fvy§vèš0j2sFçmTy¨°Ne(‚¶b8iÀºÏ2I²«ŸÌ Œ{Õ%졸/Âú"rã‘êÝØœí±8bº©Åý.ìj ÏÆ:F½*wð¯À`¡ÜÈ?*D1œkÊí{ëE›g±'WlrÆòš/Ê'Xs?Ó74»lr ¤‚U½ë2GAXQR( yoÒØÀJu]p%æmb1É5"'‡m Øi‡ õr1Ï[Ó¥øV­&W -éÏ~ã-©ÞÏüŸÑ€.Œ_}G¼ï‡ˆã–Ùo3þøU>Ëè+ÆpWnùmÐ*ÆyèÝÆõ¨áè‰Û#zêé4~ôæ­WžõŸÏŽû[[çÎ{¬»ÃÞ;â°M|ZÓV|ò§ý¥<êºE|óµ«ôÖ_?éNlÛŽ½DÏW/w‹Ý[<餻¸îøû0/ûšS¯~@ß§¿¦,ÑÇ/ÇêŽË[ßöø¯_¾ð®Zÿ³ 8àÀ–&-‹œÿØ[™Ël÷ƒ 4P¥¸ZHYÙ6Xµ­Ü „ÂSM¼Hˆ;¢pv \a ?èÂÊ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"@—̦SXkآϪõŠ)@E´› ‹ÇͭÜø‘×ìvœ„3ä$ÝÏë3Ý齇¶GXh˜¸x¦vèøX†1ˆÐø“¹É©•¢ ˆÙØIZê¡ù‘ˆ6Iagú ë5z:«J›KJ{${–¤,œV—ã7WÇ:¼üÊ«l±¥ŠÈL ú)m0ZÍíè vÝ->®õýIŽž>-¥Þ.Í%éN?_Á[¯Oô¼ïÿ0 À~ì^äˆÏAÏòI1•Ãx³Šýª1c‚ÿ/ÉÓÖê£Æ‘+:2 )¥RA’,‚šådË™ó¸À¹Î×Jš½ÚK*UpÉ^BhZR±8«‘Ö§œ/g-¥Uª­í o±’„tQC¹ZÁÁ‰V×´[–|t,1a›}­&þHx_È8“"ûê÷1±Ž“+*{1'h?Dã õQÚ…ã"† T§Ä”šáJMñYËZïTì±ö`Ç´tWvëØ÷åbœqÿ,únAxo–µógiê”Ù£'kMɹ¢cÓÑ2EÅ:¼wbë‘K¿ts:vèÊéƒlÞ~¾áàòyÓÿv­Œ`$øÝ ÙÚ©&ÓrðÙ‚Ò\êIˆào"gŸpr…B€Öax[{ß±Vg²÷•x#÷`d âÇ\q*š¢Œùù'nÑL¥ZNì¸Ö_t±òˆ,b>þÇžE6ºø’ ÎØ[“÷=yRüi`b•½u©`]>ŽY!{8rIä’s§f–’¥]†9êH¥“-Æ×Ê’pòâšž¹Ÿ”Ça$ä|K9[“¢If£0ˆé§ŸÅ±)âsvšçåi¹I™”xB($¦qž()2øMŠ"ƒµQz¨œQZºÁ¢nÝ9+¨o^™i4rzªÆj¦{Z™›©X Š¢„…ÿRªi³¯^)«’ÛEf‚iS£>ÓCLB“™ÓB*©Cú›ëgä¢V)ˆn¦ «`¥³¶µ9¬®Ü:ÊoƒùV-šçÖZ^¼þº'¼újiè­ÀI†/cå1kš…®ŠJqªÂKQ¯ªT¨} ¸n¿ý G%sÇç§ ¬¤Æ7‚Œä~ «ç±m\ è ö£{­&¬¥·{¸WÀùn4­Éõ„¢óÏ@5m­!¬R½ÇÍ+Ç ²T{•©=Ws£5Öçä•P݉;šÓn ó:f¿M÷†KcXß„tï  (_ç-5ßüòx­·… >S?Sýµˆ s#nW¤êÝîµ¾Cnz …yO…ûhç4•¬êF¢ó}Ïã—ŸžQz•W|!묇-{ítQî‰íˆµµîžç {p¾¯i>«|ÍɯFrð>,Ða«}B¥§ˆQ„IVïŽñÚ_cÏÜ‹#ýÙy?þ!¥U‘IJ§èïËÎûðG«æ˜õ~ÿH0Û¿§LÊoè  >Ç›DÌ€viÜxÇÀ1)NŒàjXA ’$MöÓ ÛäAȉ/„¢‹ OØ‚!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍjcÓÄ2¸ ‹ÇÐ.£J5“×ìöZ}Xºçô: ­„äö¾ÿ¯„¡·—4xˆ(±hˆ ÷³˜8IÉãèu÷È$YéùÉÑé!:Aêeʪºú(bê ¹iËjëWûK»K¥Kë{;Ì&ܘ#›F¼ü'¬á¬Ë,==sÕM­Í›W½ý Z‹½÷~Þç{Ùj>2Žÿd¸ô¿aŸÏßÌÞ±¯Ÿ@\1eˆpUÁ„ a,¤` bÉ7èmÊä,b,ŠÿÝ­{¸1ÈŽ$#$3­] o,KºÔçÈâ™”>þ½¼ ‘Vžk D¤7gÉ“õÀøT´TR¡ÍLùræ£J¦TwtÁ“êTÌ}ЖVExuÑ8[ š=å°Mµä²±µ"³I$n³¢Šó*ï×[N9Õ³Ù­-ZF¤~†µÒ ÎÛ:/Vì¢bÁ!aòI™Q[¶óLò,üW3⨡ f$MÖ(ѬJCÄÝÛ±ÓẉG×Õ[š—å`¿l'nü–wÏ\Ùíz<¹ŸŽä]§¥H™q! %d™î$wà(HžÈ[FÈ–hžåX—ç5ך$œ½)˜Fz¸Ò’õñè[›o®¦M%ªif£V½¢gcw>Ç`u i\¶Èfyš¸(tçÍtc“žz£çs‡bXYŒcùY§èåyÌ¥qÒ©iŽœR‰'…©j—›¨[’  ©0Љ€µÿÊ)áQUÉØ˜öçŠÓ*XdtR<ÃF®'LÚi ˜š d¥ÞJÉ䇯pl”[.;ï­s¶;¡£úV©½Wz«§GáëªÀYþËj„Æ©lz/Jª®Á¡.(~Ê6lë‹_v¹'ÃFã¯}w¼»ïPsú´‚¬i0}×¶,#®‰ºw1‹ÓÇ­ÄÿJS²†bÜñ¦Õýj¶ oE²“%Ãruª / ?'}ÈÅT÷ Û5Zï”/?S§»…Õ`».]áRjW×K¯=œ½:V@l/=¢\le…s›Iîón<öÞLô¢Z(xHoè%ã‰37êÈüøP—¾ RÞ•“tµ8™†òùæ±Þ`M¢ŸŽoà¨ î¹æ«¿~~ªÃ.dÓWºI{îPo¬{ïà6»ïˆxõîÕÂ'„»ƒ­óÎìñ ÖÒò“;Ïùî_¿»ñÔ“<¿ÀoÏôŽ#>Uâß‘fù8I~ùZÁ«ßhßð¯8È„½?¿*¶›a/ÚçžÑ ÿàठ¸pnû‹þˆT,J+„`%¨2 >Ž€Ô`â¨åÁÕu0„°ƒ Oȃ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~x³ý†Ä¢ñé‚Ȧó - AeôŠÍjASΊ¸ÀÛ²ùÜì:Ô &ú ?ÅÔù ¼Ë÷üþ‡ÝF·$èWhxÈ¥7Vµ†èø¨¥ضè噩I$Y‰!ɸ):*ÓÕ9–A‰gy©JúJzJÕhàºá «ûÉõ‰‹*»;,'Ìj¼ä…—Lì\fÜùè÷˜³3¥ =¶iù€ãKÿ§_žv¸áWÔ*Y9üYvÚjçÁ×_ÃYàW41ita/éôD ‚‘aè“@Ûí÷a~$Þg"bTwQq¯!÷ŸsÞùô]tû½èß$ôQ—Ò•ø¸ ƒ Öˆ#†ìHVÙR¼-ùÆW­ø‡d;Î7¤Ž2bãg6F¤yUbIX¹h—EjId˜YŽÛFì1 '_ª¥{bZååe:5褖›‘‰ yV.GД˜y9æ€Ïz¥~`Ö'¢qî9ç`¸åéæ^qnJR¦€ ºX¡­ø[¥<¢y#¨Ê ¢´‘©Ü2@ƈ]¤Caª(›¨&˜(qvÒ*ˆ”¢Ö™©Tî°«ÿ>ªŸ«ÍÑ*kšêÚ¦•+²¥öéQ>ö kˆ?|ûªj‘{Q˜Rx›Žó ‹§4Î~Æm#ðŽ0Y§] èÛ½Géš,„ØòHéºwZÉiÂÄYª¢¡TXµóªŠ¿úƒ*®Ž;Ú„jqw&>9©` ? pµ';Û.‹ŠšÒ› /‰Ü˜‹…Äë1€ R6”jÍ^û3ÇÇ©Éç…A‡FoÉ[½¥†×[n’¶Ò’¦3£bàb!N{ƒ«¿r¡Wjp-c|ÐØÝ”­5¾áæk2ÛBŽuo.®m)—yÿÍÙÒH¶Â÷†€+|³[ºZtä1ÎdXœÑçݘÌf×xy™ÓÅaçpú汆~§,ºR\,÷ã©Óä/å®ÿñ:WU{î-¤¦{ï–Ïþ*Þ¾ÿͺðÃo •¨ÇOBUËYé"GzðóÉF=‰@Z/D¡óŽzøÜO=…¡Ï)ö'¶ˆþè!š=¢äíÛ~v¶ó£ Ì÷/¯¿^Æï?ŒòU Eƒø‰±“}ÍQ×9 ç€±@µÐûhœWòEÁËEúË òa'ÂyPwÂéàs§ %‹à {'¿îO…2¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋uÝ ‡Äb ¸øÙŒÌ¦ó)D*K¨õŠÍ®€4F·« ‹ÇPpò`N|Éì¶ûmK«ò·ýŽU§Ë:Zš(8¨·§¦D˜¨8hшÐçG÷³Xiéô˜”i°‰x* Ói²7Ù·9Úê:3Q:"9‰úz‹ë@{&õ› ìÆª1¬Z<ç¼xÌëQå ËÉ\m'm*ÛщmíM$Íý=NmÕ]žžˆNý®/øK1ߎ_ùþî•ïÏæ,Ͱhôþ¼f—ÀX:„„ì¡Düîé‚hn¢Æÿõ>Tœ‚áãÆ‘%›F2%O|žE©2&EG«,)Sæ/[œ±ÛWgΑ #~âùÒf¿?‡:Ý ÇL=CÎzŠ5ƒ@ª´(éªú¥½¬dÃþ9m'ÚÊ<†éÓNh¸tRÍ¥»RM.È-»,*Á…4Lý›lï!»È°­© Yo±­Œ1®…|ÒÝix+ƒ,Ì4SM“˜ùjK:’Oqg/NVѰÊÕ­?¶z1ßÒ-OóÎl«³æÉz'ýmÛ7ÚàqSù¾ÝôÞTÔ‹•^PÁL‘×ÒÛ{OÏÍ ?ƾÛìR‹—%“ü’9ü/`A¯§6]¼óúí›Óÿ'O›mÒIá ‚!S1ÑÅ—`ƒbé÷Ù wR„=m\Z,PXÖ™W\lð‘ÆÞu"ò¡{&ŽfØù¹Èbj+FøXr¨"[ZP†â69šV#t&Va…åŨߟ-G!“P*Y׌7>©¢VÔ¥WÒbÝAs¤bjéå† éàŽÁx"›Ïq©Ô‰R¶(Ÿ…¼ÁåäxT–Ùe•ý™·d–î×gœ|*•§ž`ŽÉhr…H¢sô¸ékF¥YdSPž7éø¹YŸ‘ýX ¨œ‚~J¨¡[bÙÛ)B*F¤¤8Ê‚§¥…ÆÊ꜑nÖ¢q‰¾™æ¨Šjª©©Í¥KÿU5P…ù¥E‘´ŠÚ÷^†Õ2è [ i›mP?±igQκV ·ã6 j¤<ðú-·¶ÊgWÙÁdm£cxmwˆqQ³ábÚ&ªÑî g¥©l0’ÒÊWkeÓ2 ²+MÖîT$íÑo© >w÷•Ê)ܾ6Öê…½ƒyª-–©$6’ŒáÔxPÞ›ìBÅ—‘äË _B¦º ¡e½s/ÒôÜhïäÏ›QŸÃµ©™­ÝºxeؾŒ×„Û™vqη£;Ï;Ü:羫Ðb~ü†)èæØS'ý9`öѯÕ{o¼[kùÌ«oÿ®Ùuÿ§_ràhÕ_¤”"’tóa×=³puËVÔ¬#5xhxჯa6ØJY5aƒ#·}¦‘”bgÿ±Wߊ‚ `¹Á·–vßÉHÜŽ®ä&^bw9C¢nFF!›]•äEd3¶ÇÎtüm£‹|T¬9zL1ÐÇ;4u"ã¹2UOC60Î.÷GX…>EØ%† ÃÇV'òóØjœèX@‚í‡Øl7äö?¯·qÊ’y5¥~(nÏæ xÔ/™˜Þ”!~õÔh–iÓˆOZ$ÕoQÉöÛÑ߃oL–Àïå^Öb2{ãùç™u‹wéª ~Ö˜«»o©¨¿®w-ŽûDûã–Ï{TÜ4Õjë½ÿ${ê?ý!9„-e»ëÏÉɯXüJ;ܤ¹êg¬ØÜΘ–eA,iDµüUpMµaÞaW›¹ïƒR ÍHػΠ…×£ ¹7Â^.]2¬á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·Ü$ÁìŠÇä¬rVXËì¶û˜¦:Òêë÷Ïë5_ºÊ&·7HX¨rpW¸¶døiXEi'(™©©eù€‰Ø¸):Š÷Y5gGªºÊ‘˜Ñäú÷§Ëj{KÒ7W[׉û»‰å[rÇ;i œlˆ<¹#̬ý6¬ØìU-Ý]Ë «-Îõ‹4žNÎRGÁ[®.ŸŸ:Q?¯_f?£»°P8|2ú<(Æ` fÿ:Œâk` …+Z°'±Oÿ;&T!E$'"sEmDÆ#Kº¼s×)Tà-z‰ÓGJšZæüùΦ±‘>±=”箢v"} *·aÔ(Ú„Šõâ3©±Ö0Š™5¬:ŸúL­ÊÑš¦!ZÃÁ¶ÔÛ{yüŠcê\ÄDWUÆkËn_™2Ý-Të·Ø Jp“6ŽÙnèVƈÕHù2š¹0#²œ|(åcY™¹=^ŒÙgy{:ãT+àÙÅ/2ˆ).cÔ3Oò>Ýl7švÕNV>\ú3ä¹´ø*·¬×¸fäΧ÷fþÛ¬75¬£.–˜;ݶ¾SïÌW²Òå›­GM>œ}ãæ3_¯çÝ>òøsî‹cÿ7_Ýqv)ÒUC!䵟QñAWïv>õ˜ö`[k%Å`{²`›v7]‚‚pðÙçYl£ÝwÜu_XXaŠF tú±hÙŒ&¨Ù]ÝÍÆã6°•e`+ªáç_|±!÷œ‚'Ö袊$:Øß‡'c“uDÉn)Šwå1CÎ_=Ž9å1ü…¹âoŽ·ÜjõiÔ%gi•GË–¤ùGŸw Ú¦$ŽWÒ)'K•e7JN™'#>If£"µ˜¦)_¡ZYäœÊÕ‰%’ä©g™wžc§æš_Œ nY¥x0Õ }œ®E)pnÆ™¦“4Ñéš©ïáYë¥+†Öê“ì]˜£¤lÿâaz~âÅ(w7rHÜ+EDk&­RÚG„–_Qkm„¡¾Â«l%nµ¶ÄôÚ »˜¡‹)K"k£¨ïr›-œùò!¦£?yx&Ÿrê,£²rìz»j¥èaVS¯¶&œ¡¸ªÊÊæ|”fÙ`¥Û;î¶:Jû‚þf¥˜ÀŠ)ļ ·ëðŒ{êûéÇ·Y0”ï:3³T*ûéÃ4vóŸgq™°z,÷{²6·Š¼Ñv†;¡ê>òñÕf¸º¯ŸÁÑên2V3MFÖd›$°™pÁš„ˆÝ4@nDÜJ]KwÜ#{ÉQ¤Tçío99+Œ7àdzErÀzÂmxZ[Èx々--—ÊKŽùENÚB䙯¢uµŠ?úùQ‘{^:P%c”zÞœ«4zÅ­«^¡ M]&곋’ȸû®”î»kòº¯¿o üð™Pˆ{òÊÓ¶mÏM=ò²¶ƒC½ëµgÏý¡„›V÷Žch¼Ûâýñüžo8ó^ƒÏ>R‰~w—ǯ¶úñ=§óø“â-|ÍÂÿ ¸’¤(ð¾A‰É¨7ÆH”G¬UÁöAç‚÷Ë üˆ8*Ï¡áìZ¶?î.„*d_jZC#!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÊ@'¾æ¶û}fSⵎÏë5_›\Y‡°´GXhè8ñwеxøi–˜fqgð3¹ÉùxI¤Ù9JŠä%Úà‡J—êWú ë¤j©Ù{‹Káx±ÚšŠÙ›+<œ \yjL¼¬§¼öáŒÌ<½ilµ{"6HÍmˆ=gíÛM^&¡­¨{ZÞ®u®‹š>ãånòÈïßdMк…åSçÞÁ‚ ]\ ¶°XÉc”E<†Ž¢F‡ÿä常1$‰‡ãè…«R¤JŒõ”°Cw-ÞÊ™÷u™’¦Îpò¢)ìÇk§PŸ¢gs¨R0¢¾%M¸4j6iN!J½*E›mL?býŠRM’É,Q‚‘³D(Ll©­ªÚÖ@ŸŠ‚kûkdZ°¹þÔÙ “«X˜ŒÔÎû ®"WŠß¦Yux‘ã~Mg³Øv-¶^‘)Å ±QÌYmÖ ¦UÒyúöòµGµØÊ´§•&Ñd_a2³• ¹ibΠSK.þ¸téÜ.kç-üYqòãÒ)ûf¼6ÙŬ[£¦ÎyÖ[ͺƒõm¶ºqÝÈCÿm9ñ˳Љ«¯>£rññúÿgôW:§•Ýs„x’D%‡à|Ιa{ ""Ü‚¡a`Ë`Ò€öT1ŠVØ}î ×ánô¡×mùiG!ˆõDWŸ~*²'âe->Å܉ hL‡¯ý(ÄawIˆad4†çâb5nbˆöÍØ’ù˜x¡|ðÉxã‘X*ˆä9nhJ>IfP— ¶Á%Ø16Cï iejC*—"a½-éÞp¦É'“Åõ——”(nã—5Òæ% :väZ™ŽZÈètâÉØr|þÇ›–éIɘEl^ç&ìL¢h”vºé3kbÚ¤uëÉ‘šüáùª“WØÜ¨šÖ©]§”êi(u£zöä©tze°‹ÿšZë/¡Ä:–Bb˜•‡JâÚ¦|´Xdš%%É“®án&Úgcfó©’Pb›eT¦š)«#H/¸b>Š/¤å–w.-Tšío^:'ƒÀÎj«¥yŽ‹Â,åzž@«VJ^’ïòZ±²ß¶I0Þå[¦¨nÚ `£UÌÛí{xÞÙêÆ î9ÚËÆm»É»Ù7ÇÄód¼«™<»znöÔo½ KUqÁÛ%Ó(‘gÀ\´'³FEl·–¬šºò–2uÓ’tMȇsjU™51öŽìÂuÚ.Ew—6hÛUËN§÷£¥>Ìà´yÿØcE xá2q+ïÙ†/x„2¹œ-I^pä–»Sí®å4)â^{­ù-žšI¸~¡Ešéªã|ºPék U­»~8QÔήRê+³:îÝÀí¥[û®ðHôNü=˜'ï»îP1ÿšñ<Þ†<ôn­måè·[¯÷ðw7ÎýN?Mˆ·Úá‹¿Waz|¾ø¼˜mvûÅKTUpÕË?Ñ>ú¯¿Nû“º¼þ-å‚£•Q1·ì€ørßfs?Dß“`Ü‘ ž®Ô`HøçÁÈ-¡ƒ!,á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Ä¢‹ÖøÙŒÌ¦ó).”K¨õŠÍ‚IW¡ÔŠÇdë·›”–×ìöó À¶¹ûŽÏoÑòj"¬(88bçH˜¨èöåá8eا¶XiÙYhHuÙé)S%)§‘—&ú™ªŠµ‰¸ú ÛÑX‚Ú{‹KZê±{Л \ºçû+ŒÛë÷;Kqœ]ùìÀ,­ú°nŸ™±¾|Ï­/ ¼íLöï¹rø:$‘°žDϾ=¼h‚¯ÿô"büøZDMy‰RÅ»kýPhL ³K GƼ鲤1xâü9ãå >§=šâŒš—3/C u ³©Beò‹Š•Õ?Ž¡‚34HQˆ'ëÕ³$­-B”ʦ ÕÖi§Ïf½¶+6¥\'öíYêl;j¹Õq[–A-¥u2¶—¸áÈ=%rªßrçKvL²Y[C!!9Mõ+KÏv™Þ½hú¯±µ`š>švÁ̤-7¶š†ÜîG¡éü6Å»°ÚÜ&›*þ£¿è–E+'}ºÂ²'Í>f7QЛ?M¼E†"‹'ŸÜ7v£€…sn_þ=}ü×sOÿæ3[€ —\ö…t M¤4\sõÅ`edX‚¢)F’^;™¦Ù!áÕ6rbFpø±G\~Â7âLUuŒ*†¨.vÜs øÃk>fAIiÆI5Þ~#f8£€VgâFÖW’gÁ9˜]“ÁýgãUIn§ÝŠJrY"?®ýHf„ºÅ%¦þUt&bŒÑ‡!œLJwäyvuRŽ%NGe˜5¶hgŠxú‡œ 6§§thÎóa™ŽR¨ÕkVÈzv餈&wØ–’þ©çöt‡ŒñºiŒ¿Uêàså%êªÞx5_?Uöwé’W²˜*”Úê×r·’7j~UÒ åœÖÿ©J£±‚š˜W<-ê烮Î3Ę`û¥Žâ^¯×¾nÓ𿃲ñ8:e½¯|0t}õVÇž¼õ)3¿:õÝk”è—³-ø7ÉÚ;ßê››å"Èþö¯}üú¨TýöÃsx_‹Q»¿‡€~Ó_ÃÁ½æ•JxDI+LÖÀ2ñ¦€Œš$ XÁÅ탌TÓAÆõ/„®kŒIˆB!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·Ü×ê;LÃݲù ½>ÔV´û ‡_ÙâjüŽÏȈ9ÿpó§7HXÈ 81†ˆeèøiÀˆc×çÄ™©£FçQ 8·9J ƒ rÚÔXÚꊑ*ÙGâúõŠ› »§ªû ,Q Á›H\œœË[Œ¬ü º6+|ñŸÐn|Y«µ>e™É“¤»ê¼=/éer„9õèô^»éÚ?eõ¥ßO~òzêÒljþã9ÑImûy“—¶ü=íæpåöß/ÐËMÔ¿?sK?ŠË^ÛqÂu†qT^äÕÀ€¡ÈnœßWA V΀ôÐ:ºÅ0s`ààO€!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Äb‹Ö°ÕŒÌ¦ó9\&¥ÐªõŠQ§Œ0 ‹ŸÈî¡ÜE×ì¶ð ئ“q¸ûŽÏ‹ìs³Z(øð‡ V¨ 7¸ÈØxÇ÷h€8Y鈙If8¡hè©*uy–@É9…:ÊÚê°êQº°úãj{k†!{Jú‰ ¼›Z×ÛG79ÌÜ|²¬ í<·‹&ýL­=]Ò½ kJHòŽ.nœÃ'ÉK—4‹½šÉ »š<5l¼¹™•=‹rGKÉÀ˜F›Ê8t ZReúœZ`êÏ>ë.à¼úðX¨1KÊ S—"…~­V ÙV6rÆJÚIç¹`ÃÙýeêÐ)kËøåÓ¶Û¸²BR:+®ÂÆIÆÊ¸R¾€…Z.˜8¤M^ž1/F’ïlçGÝò¾Ý·/âÁŸ¦½û2ri.¨3ËuÍùé—UŽ5åâߣ‰ÝÉ<`qÚˆB'k u^.–‹¤RæuEÖçô^~ðó\äˆï¦¾ý½hìšÓßæª;°{ÊÍÛ›ÿ¦¯]Ó…¤Z}¿(‡ŸõÒ˜OŽ” iŠM8CWBGHƒÂæa¬¡µZ4†%§[aöñòSyùù6PÕ]H‹K†â~2–øßŠÑÈUn=†`lBþCÖ`åtŒÒs^†+.×"oñ™(ßHTZÆ ü½X%r¨hÜŠFˆ–#‰æ†>®9Q-M’(Øi!:&–þI×å’P‰ܘlÞ§'â}VÖXLœvr蜟½çËQiNº—™‰Y(?ßÍ h˜\ژ鞅ö™—N^2(–TZánÙ•ÊÞ£ÀiÉÝ^$Ê`srªä]Sæ*˜æ‘ªk|§úê±¢ÿF©ß¥tvê%|ÀëxLj¨Ö×vÂk­$=!·±‡S€s9úY·é’„éŽ:þ9Ÿx_öšË–Gš—Q‘° ›+¥þ¶ÊZ ¾uë¹ÙùV*¶ë¥òª® ˆ«¤†6Üã¢h®¦ÿÊÑÃ?+p¬3*â™iÈû/<Þ}XÛ½–@l«›ÛN좄 û÷ñ›Î÷லÚ|1s9{<(¿xFG•4á…`rÊýèËòËð u GÈÇ\ß3[ KDi#[£ ¶³_I[ÛlÞŠ$ÚR$Öy>]çÜz£bxÖ ¸öÞiÖrÞ÷É-¸QµÄ|µ9‰ƒõ¦´vLùã²ÂñG/´Oš–¹å ažç¢ «éyO‘;Yzêmj.ú䪿žȲkû܈‹[ûÞçÎû³÷®øï£œð±I%¼ñÊsÎüíˇå8ëÒ?ÏÓîkºã<õÂ$öN¹Œu,ÞˆƒºãÓdý—ÙŸËRÇ~õÜk^&…ñ×ÔQ«f5nÜú÷£$øÝ$}ÿ ”’â¿Ú¾PJ¨2Ê” ‚BºRdHA‹ ðÔ *0ØÁ¢€0„ä ñgµªð!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjaAeͺ ‹ÇЮcJ5“×ìv—±‡pòk!Í ÉVž{9?Lñž]n,kÉE†ª—TÉå­Êø°f*¥ý†›§ˆ*åìÌÐ)cÁòÈå’,Ø×M|l6&h‡bsç~a¬>iK}ÀÉ%;0ÝzÏïO /½wà«Î„[\ Žø#oÁEàµZ'žÕØ‚^ š€ÃCþQµ_V>NǘµîÕ:Ìý¹(|9ˆz¥¥Ó]ïã2­.5Ð/D {O¤×Ž» ·ç®ÂŠ‚Äû¿;!|¤]Ž|çÅGŽí‹Ê/Ÿí g ½™_ï^ý=f„}öÆt?øÞßâ:ðã3¿ƒôç{ã{Ï6‡¼>KÉ”ÿ>r'ÇÑñì5‰øø³¢“W±Ksÿ£‰Šªæ¿Ú%’SŠê$Y‚ÖãŸâHÁlHP}Œ 9ØÁèa0„ª! U¦–žp…(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó •Ë ôŠÍjÔ³[³nÇä²ìmV…æ¶ûýD§×l¸ýŽBÔiyþXsÁ§R¨P'¨¸•Há‡p ÉhyYæh¨I)†ù ŠÔ¹ù@Úyªº’zàjèàÉJ[ÁiÀ†»‘Ziû ühª±‹|¼:ZœË‹ül§+¼³ mí&´[}²}í}ç\ÒMù].¨=Î<nÞ^›î/Ÿ!íQ?ÏÚÍþ ŸÿÃ_«I b[GÍ BüreÓ–£á‰¨†Åÿ#”@äðÑBHŽ$VáöðÃÅ’,Ãàò8feË’³IœFh¦N‘¾¾¼ùJ%ÁD×ÕQ¦ÎË-Go}ŠáTÍ9äÉÄ5«4\ =drò§ŠWé©ÃQöZf@£MôÕ•X¥Ój Ö5L¤žL ª7£š}×Våwo_DIe5¶ºxÐa§U×J]ªXÓÊbýÞz¶¯Ô¼?Û#«­Ñ»wåd‹Œê§ìÀ `N[8´çb— .3 ÙóãX†-of¼çå XÀõ ¿=¶2ÛÍÏý‚q ·ŸHb~SMnwrǾ9§† Ø»té™b^²ü÷ðÌî¡Ó-.ú¸äÄ´µ‡ÿÅj_|F^TÄàDUt[mÃÎ>ûQ¶`&ÈSEhéçÓ~A¨v^ss\Öà|È¥gn÷aÖ™ƒÌÅW"qõÉ Cèu£Œíõg_¬í(Š2p XÛ`( d®‡QŠ'Žw‘‡8]‹¾(åv1*å¨až=ò&j´éhaƒâw]}ˆé¤dêÙFàQQ¦IךCE)æ›]VIÝ™ R˜0f×]_†‰(=†þáuºé¢&K&9$’(º™–G7ÖŠWj‡B·õ ›fU zªRd&gf©jz§‰È Zi›bª¥ŒPþ§*­Lî™'‹¹è«sÅ>¹!H7ÿõf @…Cg„ÎxRTv§ †ŠV"¤Nª£ˆœ·‰kˆ”ʪ.}AšK•­«%J/h{Á{ïªãŽsc¨g*7Þ¬™:ºž¶6ÚTðœøîúç$ýúÉžÁ–ŠŠ&©Ú°1ÉÞ»i‘­ [ï?? ©\qáœÀ:·)ÆgJâËÁQ[1yrŠÉØÃ®¾ü\“¯ö¶0Æ'Ïle¸!gå#ÑI9#ɵצ«ó3:ƒŒ ¡k´» Õj ü4Swi°N64/ÕhÙùÎfÕh‡ÙÄk>A;2Ö¿½ã†šõ"®Öé€7>W‹Ø=u"8kqo‚ÔØv'y¶9>Þà‘¯Ce²¼-×ëå$5dy…žïä6 ¡Ž¹¨¿M 8§¯.rçÃN»€â\{í`Ãózîñ4®¬ï¾÷^´ðZŽ{GÆ£¾ûòÎßþ|ôˆKtó³ÏK½NÈS«(ñÙ3¿¢~´‘¦JþLüp’«é ™™{ÿ>^1—ýõ Î7ûáퟸÑè €­á ûHÀæO ÜÈØÀzIìzô+¹/0ƒd@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡Ä¢ ȰՌ̦ó9\.~ôŠÍjYK¤âgÝŠÇä§÷{8#¨å¶ûýV†Ñj¸ýŽÍ“õ´4(è³·6ˆ˜ˆW8ÃøÕWŦ8Iä9 vYéù×Ö)jzúA:ש±Ù…  â¥ZR*‹››Y•vÂjð§;Œ ¼ö`L¬¼ì@›•Ì=¶ MRÝ+ 8ŠŒQÍ{­-®>n~®émÎÞî]îÏ /:Á‹ÏEýb¯ŸÀôô¥¨70!Ápûvù"Ø, Â‰¢º] 'ÑÅÿ” ˈi]0Ž$Õ]jØ ä”c%[6vlH•h\ÚÄäq%F0+ ¼ ÔÚZ=²4j‚fЄgÔ öÔg—ZÅ¹ËØ(IN6³ÃŠØ‘ËÆöBiêU$©OsŠâíÕqN›®zøuƒÜ”n#1k–V¶p±Y¬Õ'°_²cÁùýçèÖáˆkk~c¼Ö±à¬ýªüö‘¥sÍ":X߬C’ý˜óYžª?³Ôú:]âÜ¡ü[vU_(‹Þm8¯oà R~ݳ®ç“ÂHC]-ø¯lÉŸ'1Š;ùñÂZs.çŽ×ûʘá“_Œ­q)äÂ×wçݹøTÚõÙÿV×µ ÷˜¨ŸEä5ƒz>•#Ivy¶ß,Æe÷Ù^Ú'Ûd½½‡•{牶^{”ÉÅ\H(¦É]†DUZBTžjÁ¶gåq|"ZV`@ŠVq*~˜¢­ð¶R™-9^sõhc–qv…д¸]sô¥“d‡Êiž€«É'fpdJ9›“!šébkÌ5õ]he‚y&NJa©e üù wçÝ#†MÖ‰f¶ç„eöö‰?ú¶¥óÉ8iž´Yé©“3±h(f’©(‘Œ†˜æ£àM‰(”ºUJåŠtz¨$¬‰Êªªµj"/MõßEQØCj¬zÿZòä²Ä¶à…Wª *{ÊÒa^ùÍɤT羃tû&Ã#Ͳò2‹Î©T,€õóâyª7†† ~l½UtáoYþn]×¥àt:í¶—.Õþ€.žXõÀ_5°ëQUw\òÄûFUßÉ?J×$’}T^*~ýõ×?~Œ¾™W§êyDUíÿNïü( êŽKÞèÿNŸXuG©Î[:$“pH&áLÂ!™„C2 ‡d ãáQ#„wSõ<¦¨Ú¼ô càæ¥ßÙþFU߉·tH&áLÂ!™„C2 ‡dɬo êyDUm”øÎ^´ê¯¯ëŸu]—åk÷§zÉŽ7%¶>üºÝ[:$“pH&áLÂ!™„C2 ‡d¥Q õá^t ¼ÐþÛ××õO©ý7cà÷FU߉·tH&áLÂ!™„C2 ‡dÉ$’Ù¢ªçUuü}äÿ)ã«•*U7ÝêÀ»}Àæó#ÿ#ç5³ù¼·tH&áLÂ!™„C2 ‡dÉ$’Ù¢ªçUuÌCæTºXuøƒºn=^¢ïÁ–f¿4ÝÒÒõ ,?À†³%êÊ[:$“pH&áLÂ!™„C2 ‡dv€¸AÕó˜¢ê·/v5ÒØÔ~c\tĦÿõêšl{×»í/ºÄÁÇKŒú†×/i¾ÕŸ;^Â[:$“pH&áLÂ!™„C2 ‡dÖ‡7PõúÁÖ¾…°üäׯ[:$“pH&áLÂ!™„C2 ‡dÖ‡7PõjHë4†Ž½îð¬y û^ŒÜ áy³\ÊßÌýùZ»ÿ~)™_·tH&áLÂ!™„C2 ‡dÉìÑ@Õ󈪺ã¨÷Q§Æ?÷4ùÖ®V]9Ⱦø«¾¾®Öu]–_ÿ”Ú+•º¨T=êÁÝÞqIëߺ£‹ÇTç-’I8$“pH&áLÂ!™„C2ëÃoPõ<¦¨ú‰cà#ÅQâ¯ëŸê¿ß÷˜1ðâÀò¨êöÚ+¿êt:•þ}S 7Følï¸dÔߺã’ãºð–É$’I8$“pH&áLÂ!™õá T=¨ªcÖ‡Ýõ»­ßèþï°ù­1# 2åÁúpàI8$“pH&áLÂ!™„C2ëÃoPõ<¦¨úýÖ‡ܵõ᯳>üè®­ÞŒ„C2 ‡dÉ$’I8$“pHfˆªžGTÕ¯»Ä‘§L°ÄN{å£çîÑ:¨cöKÓÝVæütTwh{ýoéLÂ!™„C2 ‡dÉ$’}”ÆB€ÿ½®ë¶m»ÿôt:ýñÇ×í¥KFµÿõÑ/ß¿_·ÿùí[©}T×U7Ýjå£TWúèt:ýë÷ßþV;.UõÒþ·øçù\ªzÛvþýºîßR宯†âžK¼¥C2 ‡dÉ$’I8$“pHf}xUÏ#¦êÏmÛúF‰‹—ì4®åÁÌŒ£6¯.ÕQâtýj],çsëuÇßô‰£ÇÍUª«|ÉŸX·tH&áLÂ!™„C2 ‡dÉÆÃcF›¨z‘U^ £uŽVÏÚ]ºÆKGu]¸ŒùYÕUÆÀ°¶ÿEVPÿOe¾Ãþ¦Ö‡Í$’I8$“pH&áLÂ!™õá T=¨ª;Ï/œ®<äô掻{ˆ÷nûƒNMÔÞsDùžŽªGâý˜[ú[¿à7¶£koéLÂ!™„C2 ‡dÉ$’I8$³Ä ªžÇUߘåÒrɨé õ.Fµ—&iÌré˜ý2ªêú] ébàƒmåòÄoìý—xK‡dÉ$’I8$“pH&áÌ T=¨ª;w€(\bˆîö¿êA;@´ì’³Ä^ÕËñUظ$áLÂ!™„C2 ‡dɬ¿AÕó˜¢jëÃóÆÀµ>ük÷§cŠÄÀ¯Më|‡r×û¥Uº>´ýþK¼¥C2 ‡dÉ$’I8$“pHf}xUÏ#¦êÏmÛÖuݶíú³Rû²,§Óiûþ}ç’oß~Ùkÿ³Ü^ê¢õ®:Úwo©r·Ëù\ªºù– ]W~Uëƒm­®Võˆ^¿dHu}UïÞRåþÄolG×ÞÒ!™„C2 ‡dÉ$’I8$“pHfˆT=Ȫ?/ÊoÌr)ÄïÍ XGNW2›¥£ëå|.U×>]¡0ËeЃj}JKeÚÏùÜÞu±ºCg( üÚT¿áæ <¸ oéLÂ!™„C2 ‡dÉ$’Ù¢ªçUuÇnì§Æ—þ}Çiò‡î°_©¢çœ€ÂÓ診¹ëJu-í•sŠ·ºWuýkPl/þžÂƒºný[ߨâÈöú%ÞÒ!™„C2 ‡dÉ$’I8$û( :ÇÀl_ÚzØõÑU/ÕêÐõn{¥êžÉÏhï¸dÔߺã’ãºð–É$’I8$“pH&áLÂ!™õá T=¨ª_v”xÈÚàÇŒ·¶‡¯Ôõwta}8ð³$’I8$“pH&áLÂ!™óÃoPõ<¦¨úeׇ?«këÃæVÞí Ž[<™„C2 ‡dÉ$’I8$“pHfˆªžGTÕ/;ä)í•zª.lJ¾Ä^Õ»q¼Ñì—Ž.ìü, ‡dÉ$’I8$“pHfˆT=)ª¶Ä…¡Uïäð×Y­ÎCÆÌ—òŽ]§ «÷›«kj·ðf$’I8$“pH&áLÂ!™õá T=¨ªŸ=J<æ®^t}x©½}õ1óŽKjU·”Ðù F´w\b}8ð$’I8$“pH&áLÂ!™õá7¨zSTm}ø…÷ùïßýUo´RÚúðz»·tH&áLÂ!™„C2 ‡dɬo êyDU?J<ªë­º¸H»¼y˺î7%¶>üºÝ[:$“pH&áLÂ!™„C2 ‡dÉìqƒªç1EÕv€¸ð¢³\îÚ,—wm ‡„C2 ‡dÉ$’I8$³DUÏ#ªj£Äw~PuÇ%o4JlˆëvoéLÂ!™„C2 ‡dÉ$’}”F€ÿ´™ògˆxlIEND®B`‚golly-3.3-src/Help/images/blend1.png0000644000175000017500000001075713006227600014231 00000000000000‰PNG  IHDRdPï Ðï iCCPICC ProfileH‰•—TSIÇç•BB D@JèM^¥÷Žt°’¡„Tì袂k¬èªˆm-€¬»²Øëe],`Aå›$€®û•óÝsæ½_îܹóŸÉÌ;3(;²‚\T€<~¡06Ø™œ’Ê$Ih@¨3[$ð‰‰ÐFÞ·[0Úuki®ÖÿWSåpElÈé;òpm¶@X¡ ú¦ ¤ü²º €H–r¦œu¤œ.g[YL|¬?äÈTK˜ €’4?³ˆ ó( Ûò9<>ä­½ØY,d äqyyù•©ÍÓ¿Ë“ù·œé£9Y¬ÌQ–EfäžHËšùNÇÿ¶¼\ñH†°P³„!±Ò1ÃyÛ“.e¨9ÎOІ¬ù#‹—ò½,qHÂp|/[äç 0@‡Î%Êç$ø³=K(k ãÑ(^ahü0§ óc‡ó£EüܨˆáúÏøFý˜Åÿ»9âÀwø‘Øì0v;ƒ]ÆŽc €‰Â±ì„”GWÂÙJé-V¦-æáÄØÖÙöØ~þGï¬aBÙÿ ¹3 ¥Â?_0SÈËÌ*dúÂ/2—ÊgÛŒcÚÛÚ9 ý¾Ë?o²ï6¸òÍWp·2èÌüæcpì)ôo>£7p{­àD[,,’ûpéƒ(@î - Œ€9“=pÀ‚0 âA ˜ g= äAÕÓÁl°”‚r°¬U` Øvƒ}àhÇÁp\mà&¸×F7x úÀD„„Ð:¢…è#&ˆb¸"^H Ä")H’‰ð12Yˆ”#«‘*dR‹üŠCÎ —‘vä.Ò‰ô oO(†RQuT5EÇ£®¨/ŽÆ£SÐL´-F¡ËÑJ´݋֣gЫèMT‚¾Dû1€)b ̳Æ\1,KÅ20!6+Ã*°l?Öÿëë˜ëÅ>âDœŽ3qk¸>Cðœàsñex¾¯ÇÏá×ñN¼ÿJ tVwB(!™I˜N(%TvŽÎýÓM ‰ ¢ÑîÍb6qqqññ4±ØEì'‘HZ$+’')šÄ"’JIH{I§H¤nÒ²"YŸlO"§’ùäryù$¹ƒüŒ<¨ ¢`¢à®­ÀQ˜©°Ba‡B“Â5…n…AŠ*ÅŒâI‰§dSP*)û)ç)(o Ý'*òç+V*T¼¤Ø©ø‘ªFµ¤úS'SÅÔåÔ]ÔÓÔ»Ô·4Í”æCK¥Ò–Ójigih”èJ6J¡J¥yJÕJõJJ¯””M”}•§*+W(V¾¦Ü«¢ bªâ¯ÂR™«R­rLå¶J¿*]ÕN5Z5Ou™êÕ˪ÏÕHj¦jjµEjÛÕΪuÑ1ºݟΦ/¤ï Ÿ§w«ÕÍÔCÕ³ÕËÕ÷©·ª÷i¨i8j$jÌШÖ8¡!a` SF(#—±‚qˆq‹ñiŒîß1Ü1KÇìÓ1æ½æXMM®f™æÍ›šŸ´˜ZZ9Z«´´jãÚ–Úµ§koÖ>¯Ý;V}¬ÇXöز±‡ÆÞÓAu,ubufél×iÑé×ÕÓ ÖènÐ=«Û«ÇÐóÑËÖ[«wR¯GŸ®ï¥ÏÓ_«JÿSƒéËÌeV2Ï1û t B ÄÛ Z  Í  K >4¢¹e­5j6ê3Ö7Ž4žm\g|ÏDÁÄÕ$Ëd½ÉE“÷¦f¦I¦‹MLŸ›iš…š›Õ™=0§™{›˜×˜ß° Z¸ZäXl²h³D-,³,«-¯Y¡VÎV<«MVíããÜÆñÇÕŒ»mMµöµ.²®³î´aØDØ”Ø4ؼo<>uüªñǵu²ÍµÝa{ßNÍ.̮ĮÉî½¥=Û¾Úþ†Í!ÈažC£ÃkG+G®ãfÇ;Nt§H§ÅNÍN_œ]œ…Îû{\Œ]Ò\6ºÜvUwq]æzÉàæç6Ïí¸ÛGwg÷B÷CîyX{äxìñx>ÁlwÂŽ ]ž†ž,Ïmž/¦Wš×V/‰·7Ë»Æû±‘Çg§Ï3_ ßlß½¾¯ülý„~GýÞû»ûÏñ?€”´ª&V> 2 Ê ª ê v ž|:„²*äv¨n(;´6´/Ì%lNعpjx\xUøãËaDS$¹&òA”I?ª!D‡F¯‰~cSóÛDâʉÕŸÆÚÅÎŽ½G›·'n Þ/~EüýóqBs¢râäÄÚÄ÷II«“$Éã“ç$_MÑNá¥4¦’RSw¦öO œ´nR÷d§É¥“oM1›2cÊå©ÚSs§ž˜¦<5íp!-)mOÚgV4«†ÕŸš¾1½íÏ^Ï~Éñá¬åôp=¹«¹Ï2<3Vg<ÏôÌ\“Ù“åU‘ÕËóçUñ^g‡doÉ~Ÿ³+g(7)÷@9/-ï_ŸÃ?—¯—?#¿]`%(H Ü Öô Ã…;EˆhЍ±PuZÄæâŸÄE^EÕE¦'N?+*þe>‹=«y¶Áì³;çøÎÙ6™›>·yžÑ¼EóºçÏß½€² gÁï%¶%«KÞ-LZØ´HwÑüE]?ÿTWªT*,½½Øcñ–%øÞ’Ö¥K7,ýZÆ)»Rn[^Qþy{Ù•Ÿí~®üyhyÆòÖÎ+6¯$®ä¯¼µÊ{ÕîÕª«‹Ww­‰\S¿–¹¶lí»uÓÖ]®p¬Ø²ž²^¼^RQÙ¸ÁxÃÊ Ÿ«²ªnVûUب³qéÆ÷›8›:6ûlÞ¿EwKù–O[y[ïl ÞV_cZS±¸½hûÓ‰;.þâúKíNíå;¿ìâï’ìŽÝ}®Ö¥¶vΞuh¸®gïä½mûö5î·Þ¿íã@ùApP|ðůi¿Þ:~¨ù°ëáýGLŽlÕZpº÷Læ™®æiÍ÷Ï&Ÿ½qnâ¹Öóáç/]ºpö¢ïÅS—=œþ™ô¹ò‹Å—¦¯á_ å XB–ì(€Á‚fdðf´xv€÷8Š’üþ%3D~g”øO,¿£É ž\vù0€xFÙ ‹ d*|Kßñ>up-Ã&Êp°—ç¢Â[ áÃÐÐ[]HM| nú²н Àéù½OjDxÆß:^JmݯÀö/™ámb’¢I] pHYs  šœiTXtXML:com.adobe.xmp 168 208 1 o¤”oIDATxíQrâ0Då„ì~å:{¤Š3íeX¾6Øi9J9)ØjÀj•V•±I÷¨Ÿe[¡ÆŽÑŠ[ÒdâDª’ì@0Iæ@²tV åØÎ#УU ‡Øst÷O¬cùHæ:Á^)©íãsn8\?ÛQšutÈ ­ÇÄ_ dêAe€‘qŒ£¡jEM¬­§I‘Û='þž‡Ta¢ršÔ1Ò(U˜¨œ&u „4Jf *§I!R…ˆÊiRÇ@H£Ta¢ršÔ1Ò(U˜¨œ&u „4Jf *§I!R…ˆÊiRÇ@H£Ta¢ršÔ1Ò(U˜¨œ&u „4Jf *§I!R…ˆÊiRÇ@H£Ta¢ršÔ1Ò(U˜¨œ&u „4Jf *§I!R…ˆÊiRÇ@H£Ta|U+BfÓí 2EÑÒX¢•S(3kË ÕL”|ÓÁ:yã ÊñÆJÇZšõâµDU±bÆZUô Í䂇¡¡ÒñÊ"MØQ‹÷Q/^K”c_(ÄìíF`üÝ䣄‚êx<‰íÆV½ÀK-ÞËJ”‘Ao -oh?D ®J¯é^°æ€`‡=Y€òä™J”é>'†>ð@èÿ'fà(ź-OnRT5ímo=gMºöõýäWßuS 仺|A¿ 䳡¢pù íE}’Øt²?Ýž„¤ßì‘÷b@f˜ø/ ¬Wþ‹™a⿌ i}˜3‘a©ÿÒægûŸÆ¸Óéø§¾ËJv ˆ$s Y:!’Ìdéx„H2’¥ã’ È?‰š'˜ª£üIEND®B`‚golly-3.3-src/Help/images/theme.png0000755000175000017500000000246113006227600014162 00000000000000‰PNG  IHDR  e©ŒžøIDATxœíݱÇï×Àñ“ºC‡ü¥CJÈJ‡’¡„pB‡:dÊ¿¥C¦ !tå9„H‡RÕ¨FD¢ÕJD¥B†2„¿wí;~ç'Ͻß>ÏëåŒçøÜûãÍw¸÷‘9çþ§ òxOŒ¸¹'Fœÿ»3àî$y@’$y@’$y@’$y@’$y@’$y@’¤Gì{@²“ð=â‚'FœßÇ$y@’$y@’$y@’$y@’$y@’$y@’$y@’$ëPÐØÊÎiÇîýûOÀßâh#.xrÙˆGO§óÏœó‡§ÓÖ™sŽÓéüc 2y@’$y@’$y@’$y@’$y@’$y@’$y@²ï;ÇÍ=9ð¾Ç¶ÎœsŒoÏ?sÎ1N[gÎyït:ÿØ÷€‡LäIäIäIäIäIäIäÉ:´¯ìqþ“¯Î?»»M¬7íþ_6üw6Ö¡à!“$y@’$y@’$y@’$y@’$y@’$y@’$ûÐì{oÄg[gÎ9Æ—çŸ9ç_o9çßœüÛîÝ÷qIäIäIäIäIäIäIäÉ:4ëP7<âo[gÎ9Æ'[gÎ9ÆççŸ9ç_l£þ¶7>ÂÇ$y@’$y@’$y@’$y@’$y@’$y@’$y@’$ëPЬCm>yçü3çロ3çãã­3çãçŸÿ¶‡áã ’< É’< É’< É’< É’< É’< É’< Ù÷€v·÷=ÞÞ:sÎ1þtþ™sŽñ×­3çã½­sÔßö6ŒðqIäIäIäIäIäIäIäÉ:¤{cŒµÖÖ›9çM?¹tÄó;÷»Ö‹›#^]ë¥û¯¬õòæˆßõ·½‹#|\A’$y@’$y@’$y@’$y@’$y@’$y@’$û޼ïñìæˆ7×úÕÎý7ÖzasÄëkýzçþkGým8ë¾+Hò€$Hò€$Hò€$Hò€$Hò€$Hò€$Hò€$HÖ¡ =Èu¨_ìÜÿãZÏlŽxk­«û×k=·9âwG[Ù¹àÉ…#®¯7î_]ôoa ¾/ò€$Hò€$Hò€$Hò€$Hò€$Hò€$Hò€dßÒÅûOn>y­ŸïÜÿóZOoŽøÃZ¿Ü¹ÿû[°“péŸjcycŒ1çÕõξÇÕÕÕ#ŽöÛÚ÷€ï"Hò€$Hò€$Hò€$Hò€$Hò€$Hò€$Hò€d Òýu¨Ç·ÞÌùϵžØ|òáZOíÜw­ŸmŽøË÷iŽºå¿¿9ë¾+Hò€$Hò€$Hò€$Hò€$Hò€$Hò€$Hò€$HÖ¡ Ý_‡zlëÍœŸ®õ“Í'_ë§;÷?ºû4·gêNŽðqIäIäIäIäIäIäIì{@º¿ïñ£­7sþ{­o>ù×ÿ5ÿ-qÌ?Õ­áã ’< É’< É’< É’< É’< É’< É’< É’u(Hÿ¿)s{{„IEND®B`‚golly-3.3-src/Help/images/clips.png0000644000175000017500000001605013006227600014166 00000000000000‰PNG  IHDRDZÿ>M ViCCPICCProfilexœµ—PYÇ_wO¤‘Ì3’£ä8äœL 30 a† "fX*" ² ¢àªY"ŠiPÀ¼ƒ,깕käÀ½ºÛººª»Õ×ý«¯¾þÞë÷úUýÊY–@ KÂO{º0"£¢x€€,ú@“ÅN8ú‚¿Ôd?Zê®ál¯¿®û·’äÄ¥±€QŽå¤±SP>‹ò8[ L®B¹{uºe -D'ˆòöYæÎqÙ,ÇÎñ©o5¡Á®(w@ °XB.än4ÏÈdsÑäq”ù ev‹ƒr Ê))«f¹eØ?õáþSÏØ…ž,wçÞå›n¼4A2kí¹ÿY)ÉócH¡Aá'ûÏî QËÍgžÉ ù8~XÈ<ócýæ9^è¼PŸîò' ç¬Wÿ…>iî }YÞó,Ì›ç´Ì÷ïφF,Ì-Îm!Ïó`Î3/¹0VÒ*Ÿ…9ð,ÀN[3»ïÀu•`­ÇMHg8£_YœƒÉg0LM,ÿçküÿÔìùš£wôoç¢ßüžKmÀ&Mr¿çXêœ{mò{Ný-ºõ»¸ÐÍÎfÎå0³, ¡çVÈe t€!0–À8wà @(ˆ+$€ «A6Ø rA>Ø öƒPŽ‚cà$8 šÁyp\·@7è€ ƒ—`L‚i‚ð¢Ar ¤ éC¦5ä¹C¾P0Å@\ˆe@ÙÐV(*„J  ¨ú:]†n@=ÐhƒÞBŸ`¦ÀÒ°¬/†­agØ…—Ã\8΂sàp1\ Ÿ€›àËð-¸Á/á  d„ލ"†ˆ5⊠ÑH<"D6 yHR‰Ô#­H'r!¯††a` 1v/L†IÅlÀ`J0Ç0M˜Ì]Ì fóKÅ*bõ±¶X&6ËÅ®Ææb‹°ÕØFìUlv;‰Ãáè8mœÎ …KÄ­Ãàápm¸ÜnÇËáõñöø< ŸŽÏÅÄŸÀ_Â÷â‡ñd‚ Á”àAˆ&ð [E„ã„‹„^Âaš(AÔ$ÚˆâZâ.b±•x‡8Lœ&I’´Iö¤PR"i3©˜TOºJzLzG&“ÕÈ6ä 2¼‰\L>E¾N$¤HQô(®”e” ÊNJ ¥ò€òŽJ¥jQ¨ÑÔtêNj-õ õ)õƒMÌHŒ)ÆÛ(V*Ö$Ö+öZœ(®)î,¾Bõvõq  ?l:‡šDMkÍÍššSZÚZZÛ´šµFµeµ™ÚYÚuÚu¨:Ž:©:•:÷tqºÖºIº‡t»õ`= ½½R½;ú°¾¥>Oÿ~ÖÀÆ€oPi0`H1t6Ì4¬34¢ùm1j6z½Xcqôâ=‹;5¶0N6®2~d"eâm²Å¤Õä­©ž)Û´ÔôžÕÌÃl£Y‹Ùs}ó8óÃæ÷-h~Û,Ú-¾XZY -ë-Ǭ4¬b¬Ê¬¬¥­­ ¬¯Û`m\l6Úœ·ùhki›n{Úö;C»$»ãv£K´—Ä-©Z2d¯fϲ¯°90bŽ8ˆUYŽ•ŽÏœÔ8NÕN#κΉÎ'œ_»»]]¦\m]×»¶¹!nžnyn]îRîaî%îO=Ô<¸uãžžë<Û¼°^>^{¼˜JL6³–9îmå½Þ»Ã‡ââSâóÌWÏWèÛêûyûíõ{ì¯éÏ÷oÌ€½OµS •=6 Îî ¡…¬ 92êº+ôQ˜NXFX{¸xø²ðÚð©·ˆÂQäâÈõ‘·¢ä£xQ-Ñøèðèê艥îK÷/^f±,wYÿríåk–ßX!¿"yÅ…•â+Y+ÏÄ`c"bŽÇ|f°*Y±ÌزØq¶+ûû%lj³3gW7o_?ʵçîåŽ%8&%¼â¹òJxo½Ë§’’j’f’#’R)1)çøRü$~Ç*åUkVõô¹QªmêþÔq¡°: J[žÖ’.™Û:?d f:d–f~X¾úÌÉ5ü5·×ê­Ý±v$Ë#ë§u˜uìuíÙªÙ›³×;¯¯ØmˆÝоQ}cÎÆáMž›Žm&mNÚüëã-…[ÞoØÚ𣔳)gèÏêrÅr…¹Ûì¶•oÇlçmïÚa¶ãàŽ¯yœ¼›ùÆùEùŸ Ø74ù±øÇ™ñ;»vYî:¼·›¿»ãžc…’…Y…C{ýö6ícìËÛ÷~ÿÊý7ŠÌ‹Êdû·Ô8¸ûàç’„’¾R—Ò†2ŲeS‡8‡z;®/W*Ï/ÿt„wä~…gES¥VeÑQÜṆ̃ϫ«:²þ©¶Z¾:¿úK ¿Ft,øXG­UmíqÅã»êຌº±ËNtŸt;ÙRoX_Ñ@oÈ?NeœzñsÌÏý§}N·Ÿ±>SVólY#­1¯ jZÛ4ÞœÐ,j‰jé9ç}®½Õ®µñ£_jΫž/½ sa×EÒÅœ‹3—².M´ Ú^]æ^j_ÙþèJä•{A]W}®^¿æqíJ§sç¥ëö×Ïß°½qî¦õÍæ[–·šn[ÜnüÕâׯ.Ë®¦;VwZºmº[{–ô\ìuì½|×íîµ{Ì{·úüûzúÃúï,ÝçÜ}üàÍÃ̇Ó6=Æ>Î{"ñ¤è©âÓÊßtkYŠ. º Þ~òìÑ{èåïi¿ÎyN}^4¢2R;j:z~Ìc¬ûÅÒÃ//§_åþMòoe¯u^ŸýÃéÛã‘ãÃo„ofÞ¼“{WóÞü}ûDàÄÓÉ”É驼rŽ}´þØù)âÓÈôêÏøÏÅ_t¿´~õùúx&efFÀ²¾Y 8>€·5P£Pï€úS’Øœÿý&hγ#ðW<ç‘¿ 5Y5N„mÀõ(‡ÑÐD™‚Þgm`¨€ÍÌâJ‹73ëE¢ÖäÃÌÌ;%ð­|ÎÌLš™ù‚ú{äm©s¾{V8ôoä~–nh+ÿ‹ú;fÝ䯨)Ìõ pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úKIDATxœìktÕÇ·vÙvé—®Õ®Õ.ýdû¥Ë®~h?X‹5ÕÕ¢  MT”jA <4ˆ(>€by‹«¼”7$ DRÈ%o’@LBBHHBQ1LÏÌÜ;÷Þ™sö93÷νsË™µ?ä1¿½÷9çŸ3gæî3EÄÈŸ q‰SpÜuI‰â8€ÄoZÜÓÉIÿ”Žô™gl«ÞrªzsíÙ—sŒ_yJU¿hš³®ç‘±Îd!î]U9s„5ÜW|,zz“Ò¨=Ò’•[öy‚+/èlž¹œˆ‰Û¿ºªLx$ÉGŽ—ºL½Ð³d]<¾mGNˆè¸ Ô ™Õv >– ¿%®ØÛιù±¢û¾ºÚ=ôi¿°ØªÂ“w]ocjB·Ç\ÅãÛv nÃ{Í:ýawˆmp­mõïªÈmìך« lå P|êÓý“o©ªhª wÝúò?é%C&ªsã^C<àùáÑKŽ ^xüÅÝ/s„kvÁƒ²”Q”äIëzÑ>þú%Ÿ—ºl+ù»y5-õ‹ ¢ç²^µg¾~}=näýdec¸“f>nwàl ÌÅ¿¦sUÕ2ýC·T!~üF݇ÿEM~eMÓ“4êÌ‚m%ÅžVUóΑ¾8ÓÛ›îäw®*|T*·MÉÏò·~æÝÏœ)CDRŽñò¼ŽÎ±SÍÉe(Ý*þ€Ú•G»†O0õfWêóU[êD¢WìiãÊ"ú8¹‚¯„íb¥½Ii3¾ ”¢0'?8µüðé…;È$m¥Î?‘E~e·çE†üከêÔŠ"¯©ªjëi}– KžÌOf\«s2 «÷¡‘dAéQUivéyj¥d¸U}ZÏíºæìUAdHêÉOÊõ¼è ž{v}: ŸIê”!.)»xÍ'eÖZB5ùt¼zC5eH†¤Ö-ÿ.( —pµWÕ)úÕï:"#iš³ÎqÏ‹Žk×°LUUì:ëU•ï=G–GÖ.VKæ¯0ñÎQ“©Â2.…T™eY…¸†éû)ð®#Ëýdr×Rz /"U‰ ªux a…®õÊ :í*î¤qßÑki“¨ý{vê'·ÙQ8±qíVU½T•ƒöìËæ¡“íaU‘)g<šühP®ÒÀÜÀ …nª LõËÈvšP;ÎÀ­!¾Ó^ ð'ßÞ¬ù9Óo¡9?Í(ýÖíU~¿Ì@ðd­+¬㙺õ4ÅVUWÊx×Uuk[ç˜)n}Zci{ë¤EXôŒèË U™º¸iÑÞ‡bCRª°¦«Ð ¼bw«ÝüŒè¸ªü½cù|74yÜÃ24ºnÔ}ÁèïQð8Ö­#GfÎt¥ RM%>p¨Š$š»Ÿ«*uÏSüTZ|mµºæü“Ó±èFUäºúŠrêÀ­uaŠ=IéÖúÒBS~¦•fÇS¯ØÊO|¦Ñí6®Yÿ%?Ëb{D×ÌÇ,¼ç‘±?¢áñ­[GL}34{º"ß6¾µI|è£;Q•ïHÿ TU}CRñRcwUþ´Æjwâø±A¤Ž´ñÍ nÈÂ=UUîlFT•PVpÁUÙ’”n¤¶CRšµdå ægŠ.¢*²ncá~Ý_¿8ô)^õY‚#Ï&z“ÒôòV<îu눙.èù!×ñL¶Ý¡‰îPUÄî'Þ‡3UEnïo{ªâíQ±S+ŠBpýí~‚FP»[ñœšq7pÜê–²TE~努œIJ·û€ùKŸ¶™š\Mðü¬ÑÉ¢MDU,<ÔX{/É-‚³dÝ6ñ$ùêM5xÎoovÇÍwôšéŸšäkõédêå>¦8ë Î_ ÿÍáMP«ÀlËö\Ü#æê¹4|/¨/ ·¬§!äÎñN4V/ç)nâÜcÍç´È|b‡õ^Ñ´ÃOPí­À’ñ\T}ãcŸ€Ý*-¸Õm*(BÞÔä/«/T¦8YÄ  iÑ'ø_òÙ+´¶‡þd4(ߺ†s®Ö '#w$:žY ã)…ÙAÙo®Í7ª§3´ê¼Ôà Pòu®&Üð9B+æ?/OhòWµÏþ¬}ú™4”ªÕvà˜¢OÖ6í ±@™CzgVF¦V)p-ª¸øÀ½jñù¸3ð(©J·ë ìVuš»&U«BÉÓjÛAù6‘4j=µ#ø*&zÏNÕDÐk¯mÁäµê¶kºö²¡cZÉBmÓRHôÞ!Ã3Á¼Íl¯3'iŠ,t¥ÊE·5pEá~6ÅCUà¸~¹_ý$ü!¯¿áV:P»• jGƬӋvýÌ~óèÉ_Ò¦ºÇùÑ÷´OxKÁ)§í–?%ü¦˜ÞöËQÂm Ü@H·¶é/ÊãªÈè«*€ûŽô×®=Þs[U`¹o´ÀŠß¢/œÛ@©¥XÛŠsPÝ*í"Ø¡]ÝŠŽá×´ûÅCîF1¾- ªCîFOÀ®‘¸c|’&)ÖFSWUeum+€Ä=Š7&ªå®GO´®‘8Õ®ª¯ÿ-@éþ^&¾* ªFדu-@â±Æÿ ÊõFǸsl´èÄ¡oLøíR“TV,’÷F×HÜ1x‚ú<âÜø¹&<ÉxBq$æªÂ]sH<Öx!ERþàÃÿ›Pç˜)꣯q |‹ä=Ð5wŒ/cªªf}©Ö-;ÔgyxŒT%â ñ8à³é’"V¹£IGÊó:ô÷O_úÔc•¼ºFâŽñ\¦ªç—h¯ñ0^Þ“³äm»¦x|ðBlÇs÷Ч¯;ÇNÕ+(c“¼ºFâŽñAX,ð¯‘.þ-ÃøŸ±S•]צ#^ž¾û±qˆ¤Î§Ï(Ûßãä=Ñ5÷éW_ãfÚmö@J×°Lõ?…ÿ‹ÃØ$ïÐu–¸7p_ÑrßwjåWõ|Qõi=¾ÍÁíäAòˆþa½W4-Çð$.q Ž».±Ya#q‰s$÷ä$ž 8ǵ±ør–™ÄoNÜÓÉI0Žß\pœWÏù[±yŽõ/àøïGoá_Ö8¾óÔåð¢|½?¾æšáßä©ËáEù8zbþqžº^”‡¢ ÀñÔåð¢<€ã¶ _¿Uýèá·Uøú­ŠDwอÂ×oU<úrŽÿ]Ë\/Êg¢›8ÞÞÉ\/Ê'£Œã7çÕsþVlžcý 8~ÁûÑ[ø—5ŽïŽž€œ§.‡å¡èGp×{¸ èpáðÙ@а9_v³) ­F£÷ïOóý Œ4«gßw­ýÝ;šÕ3ÓsÎ-¹ -i`ˆˆ’ÎΊ<©’¸!^ ­Ð:r è!·€r è!·€r è!·€r è!·€r è¹Óö€ZÜW¶|fvïèèÖÂË¥ûgfw ”˜Ù«ïîx3+VbfÖï}æM¬·€r è)»Ÿ|}}]É<‚ôz½æÒÁz èé•ì›?==­j*Å4?(´|VüàÐM—·?eW·?e ÷èQTõœsÞû°Á–JÒÙOýAJþà5•lÇ)Ì*{<¹ &sk“‰{ü8âg?Ð#ù÷Û‹‹‹•-»»»­Ìhë- ‡ÜzÈ- ‡ÜzÈ- GòxrÖ‹/Ììøøx±eoo¯½éõb½ô[@¹ô[@Ï–—Êg>VÞ='Íú}3{ýü<´pÇì*|¸7ß /ŠhŽõÐ#Ù;™LnÝ2NW¶<Šíu„®§ï¾Q± ^Å­·“‰{ü8¢ðŽ™5Й‚•9w¤ µ•!Ò™ÕëQ¹mý·@'líq©¬óÌ! ކûÏÊã"¯Þ¿q‡~¾Z°3~1ÌND™q\ PDn=äÐCn=:.•uvv¶²e8¶2 ë- ‡ÜzÈ- ‡Üz:}\*ëÉ“'ËÛš °ë- ‡ÜzØOnÿ%¢èªÿãóg•Ï%O‡úæ#žsrr9ETÍû£êÂû¢rk±¹}‹¾ùÊíïï/?F¢íã Ñ̬¶}ó@'[@OÙãR½^/»1{=x`É?³›¼7³ßo¬jèÌ‘Ο] ¼v6jf4Ö[@¹ô[@Ÿ»*r6²ÌgjRKnwww—Îÿ47¿´4€òØOô[@¹ô4w\joo/»1{•Z@×ßvîàO7?Ö^Ö[@¹ô”í¿-éè許±è¿M„÷›?‡œç^TUøç“£®¬g“‰M§îÃcjÃõRk­Ì^í²>·ævå ôßVT²¦¯ €¦rkfqg®˜Ní›o\à/IÜÿ[ö“=äÐCn=äГ\?Ð`0°Ì›õì/‘†¯ò¾à½™}óÅ˨±¾ªŠkðÀš:sEÖ[@¹ô[@Orïoׇ+[V.œTê¥ ÷íÉÛžF.Ö[@¹ô[@ÆûÛ¬ì•àsû!ýÊ£Ñ(èù蘗vø¶s>É_Ö[@¹ô´Ü7iÞç}’q³;im'ªÊÌ̹_D×Ö."·¡% QÒÙYU:ÄWQ·DÝ&Q·•¹%ûr°Ÿ è!·€r è!·€r èQý¼ª¶é‚/Þ›ÙÚ3]_Eõ*ª*n¬ùßœâÿ”&Ö[@¹ô[l·™Ù,v;]äÐCn=äÐCnÑ3³«¤û{‘[@¹ôÐ733ï×~êVðfæÜ¯Ë”''ÙÎàºK:;«œç£nºý-êö÷’·mzÅÙOô[@¹ô[@¹ôÐ7¹¸Ž™ok;;àã°ÞzÈ- ‡Üzx»Ýže7yofï5>“òffÆ»Ü9Ö[@¹ô[hYœçíjÛZ|B[@ý·ÛÌûâÇŸ¾5Âݨª²GCûMÉï /ÙúKº1«g…oŽº}uû²’[Ûÿo«)¡ÿè r è!·€r è!·€r è!·€ú0÷ré~ñÏ`Ì¢ÆZœ-_¿H¬·€r èaGEȧk·zofïä”Ô}¶·¸þõÅÞõ|‡™_Â`¬·€r è!·hѼ þÒì’Ö¼ äÐCß¼ ïó>mP÷u¥+8¯¢sï—ÿ&]ÓsÎyïƒjBK¢³Z¯xñö“=äÐCn=äÐCn=äÐCn=äÐC ÊXô vý‚´ c½ô[@ûÉmùxíVïÍìç9%'¯(~抒->ÍsXo=䕘-_ ÞìŠî¼Z‘[@}óíð>ïMìÍ´M_Þ¹ãèZGß|[³Z\j#Ü.8wœÚËÑö+^åì'zÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡Üzè›/ïw¾æ½™½µî+—áE4ÁGŒbK„æ×#Q¬·€r‹¬Ùò•àÍ.éÎK ý·ey¿v7øVMyÅ/K»PêlOÎ}T¦õ¹cfivêÌ*.·¼ÿåüŽsé¼mÑØ¬ØOô[@¹ô[@¹ô[@¹ô[@¹ô[@¹ô[@ÑåE\ÝÌ^52Ðr×W‚߬·€ÖÛÍ>X~ཙ=lg"‘fK÷ÿ¿ö:÷‡EƒDÑ7¿‰÷ <+¢ÞÚh‚ÿ¤L9’Bßüfƒæ2ï6¿ãÜ'²/GêC46+ÞßzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzèBƒÆã¼¯x3;:Zÿµ~¿¦éèb½EòÎÏíü¼íI¤…õ¶¼Ù͇Ûúf·?eU·O^qvff6¶=$t¨ÿÖûŸ„ÕwuéRÿb:÷´Ly[|Þžðf“‰™Ùtº¸ïNN*œ•¢^²†5”ü6èšY²¹]æÜS™—#ÿýí&™ÜÎï»ÑHæ¯zÞßzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzÈ- ‡ÜzèBÅ®¯¯£k{ÏŸW8“-Æz‹„\Ü¿qÿ~Û³Àz‹ä¼xãùétjfœí"‹Ü¶åré¾î«¿K\ÜüTƒáþÊvo¿*ü=zÎ'ª}óÞÿ(¼¨¾fÚeÁg¢pîóðQ’àýivc‰··6™LÿµïÖÛùÃÁàAü÷5sî Lyjt¯[ý^Ð7L™÷?]ÜwîsÍ—#uÞŸ:w@ß<€Ö[@¹ô[@¹ô[@¹ô[@¹ô[@¹ô[@¹ô[@nÇ6ÕËïQ9}T5’è›÷þ‡áEMðwÃK‚ÿ]sŽ_Í\\o¾*‰\oþ  ˜Y²¹]áÜóÔšÚ¹Þ|R%ôÍ]An=äÐCn=äÐCn=äÐCn=äÐCn=äÐCn=äÐCn=ôßnFÿm•è¿­Jcý·›c–è•àW8÷ušÝ˜© ‘[R¦ÿv0(9«mê¿å<5hP¿Ÿ÷•-¸¤}“x è!·€r è!·€r è!·€r è!·€r è!·€r è!·€r è!·€žDúæ^ÔDÿ­s_‡Ôî\¾=¯=IEND®B`‚golly-3.3-src/Help/images/blend0.png0000644000175000017500000001303013006227600014213 00000000000000‰PNG  IHDRdPï Ðï iCCPICC ProfileH‰•—TSIÇç•BB D@JèM^¥÷Žt°’¡„Tì袂k¬èªˆm-€¬»²Øëe],`Aå›$€®û•óÝsæ½_îܹóŸÉÌ;3(;²‚\T€<~¡06Ø™œ’Ê$Ih@¨3[$ð‰‰ÐFÞ·[0Úuki®ÖÿWSåpElÈé;òpm¶@X¡ ú¦ ¤ü²º €H–r¦œu¤œ.g[YL|¬?äÈTK˜ €’4?³ˆ ó( Ûò9<>ä­½ØY,d äqyyù•©ÍÓ¿Ë“ù·œé£9Y¬ÌQ–EfäžHËšùNÇÿ¶¼\ñH†°P³„!±Ò1ÃyÛ“.e¨9ÎOІ¬ù#‹—ò½,qHÂp|/[äç 0@‡Î%Êç$ø³=K(k ãÑ(^ahü0§ óc‡ó£EüܨˆáúÏøFý˜Åÿ»9âÀwø‘Øì0v;ƒ]ÆŽc €‰Â±ì„”GWÂÙJé-V¦-æáÄØÖÙöØ~þGï¬aBÙÿ ¹3 ¥Â?_0SÈËÌ*dúÂ/2—ÊgÛŒcÚÛÚ9 ý¾Ë?o²ï6¸òÍWp·2èÌüæcpì)ôo>£7p{­àD[,,’ûpéƒ(@î - Œ€9“=pÀ‚0 âA ˜ g= äAÕÓÁl°”‚r°¬U` Øvƒ}àhÇÁp\mà&¸×F7x úÀD„„Ð:¢…è#&ˆb¸"^H Ä")H’‰ð12Yˆ”#«‘*dR‹üŠCÎ —‘vä.Ò‰ô oO(†RQuT5EÇ£®¨/ŽÆ£SÐL´-F¡ËÑJ´݋֣gЫèMT‚¾Dû1€)b ̳Æ\1,KÅ20!6+Ã*°l?Öÿëë˜ëÅ>âDœŽ3qk¸>Cðœàsñex¾¯ÇÏá×ñN¼ÿJ tVwB(!™I˜N(%TvŽÎýÓM ‰ ¢ÑîÍb6qqqññ4±ØEì'‘HZ$+’')šÄ"’JIH{I§H¤nÒ²"YŸlO"§’ùäryù$¹ƒüŒ<¨ ¢`¢à®­ÀQ˜©°Ba‡B“Â5…n…AŠ*ÅŒâI‰§dSP*)û)ç)(o Ý'*òç+V*T¼¤Ø©ø‘ªFµ¤úS'SÅÔåÔ]ÔÓÔ»Ô·4Í”æCK¥Ò–Ójigih”èJ6J¡J¥yJÕJõJJ¯””M”}•§*+W(V¾¦Ü«¢ bªâ¯ÂR™«R­rLå¶J¿*]ÕN5Z5Ou™êÕ˪ÏÕHj¦jjµEjÛÕΪuÑ1ºݟΦ/¤ï Ÿ§w«ÕÍÔCÕ³ÕËÕ÷©·ª÷i¨i8j$jÌШÖ8¡!a` SF(#—±‚qˆq‹ñiŒîß1Ü1KÇìÓ1æ½æXMM®f™æÍ›šŸ´˜ZZ9Z«´´jãÚ–Úµ§koÖ>¯Ý;V}¬ÇXöز±‡ÆÞÓAu,ubufél×iÑé×ÕÓ ÖènÐ=«Û«ÇÐóÑËÖ[«wR¯GŸ®ï¥ÏÓ_«JÿSƒéËÌeV2Ï1û t B ÄÛ Z  Í  K >4¢¹e­5j6ê3Ö7Ž4žm\g|ÏDÁÄÕ$Ëd½ÉE“÷¦f¦I¦‹MLŸ›iš…š›Õ™=0§™{›˜×˜ß° Z¸ZäXl²h³D-,³,«-¯Y¡VÎV<«MVíããÜÆñÇÕŒ»mMµöµ.²®³î´aØDØ”Ø4ؼo<>uüªñǵu²ÍµÝa{ßNÍ.̮ĮÉî½¥=Û¾Úþ†Í!ÈažC£ÃkG+G®ãfÇ;Nt§H§ÅNÍN_œ]œ…Îû{\Œ]Ò\6ºÜvUwq]æzÉàæç6Ïí¸ÛGwg÷B÷CîyX{äxìñx>ÁlwÂŽ ]ž†ž,Ïmž/¦Wš×V/‰·7Ë»Æû±‘Çg§Ï3_ ßlß½¾¯ülý„~GýÞû»ûÏñ?€”´ª&V> 2 Ê ª ê v ž|:„²*äv¨n(;´6´/Ì%lNعpjx\xUøãËaDS$¹&òA”I?ª!D‡F¯‰~cSóÛDâʉÕŸÆÚÅÎŽ½G›·'n Þ/~EüýóqBs¢râäÄÚÄ÷II«“$Éã“ç$_MÑNá¥4¦’RSw¦öO œ´nR÷d§É¥“oM1›2cÊå©ÚSs§ž˜¦<5íp!-)mOÚgV4«†ÕŸš¾1½íÏ^Ï~Éñá¬åôp=¹«¹Ï2<3Vg<ÏôÌ\“Ù“åU‘ÕËóçUñ^g‡doÉ~Ÿ³+g(7)÷@9/-ï_ŸÃ?—¯—?#¿]`%(H Ü Öô Ã…;EˆhЍ±PuZÄæâŸÄE^EÕE¦'N?+*þe>‹=«y¶Áì³;çøÎÙ6™›>·yžÑ¼EóºçÏß½€² gÁï%¶%«KÞ-LZØ´HwÑüE]?ÿTWªT*,½½Øcñ–%øÞ’Ö¥K7,ýZÆ)»Rn[^Qþy{Ù•Ÿí~®üyhyÆòÖÎ+6¯$®ä¯¼µÊ{ÕîÕª«‹Ww­‰\S¿–¹¶lí»uÓÖ]®p¬Ø²ž²^¼^RQÙ¸ÁxÃÊ Ÿ«²ªnVûUب³qéÆ÷›8›:6ûlÞ¿EwKù–O[y[ïl ÞV_cZS±¸½hûÓ‰;.þâúKíNíå;¿ìâï’ìŽÝ}®Ö¥¶vΞuh¸®gïä½mûö5î·Þ¿íã@ùApP|ðůi¿Þ:~¨ù°ëáýGLŽlÕZpº÷Læ™®æiÍ÷Ï&Ÿ½qnâ¹Öóáç/]ºpö¢ïÅS—=œþ™ô¹ò‹Å—¦¯á_ å XB–ì(€Á‚fdðf´xv€÷8Š’üþ%3D~g”øO,¿£É ž\vù0€xFÙ ‹ d*|Kßñ>up-Ã&Êp°—ç¢Â[ áÃÐÐ[]HM| nú²н Àéù½OjDxÆß:^JmݯÀö/™ámb’¢I] pHYs  šœiTXtXML:com.adobe.xmp 164 202 1 C­²Û˜IDATxí\Mn7~ÔØŽl«¶ƒ h´€lrˆž¢íšûd›táö]eÝ]Wí&ºË"¨ÑØr,Eš~)ZÚ‘rõù.ÒÎy%$ƒ7!“½]aÏjŠ%ƒa`'“I´[}髪’|ßG†¼ ¹˜ÍuÎ6ƒUsɸ¸¸Ð½®Ð„ö©¯Ð\ ó±@†¼ a‘×Ý[¶%8l5Åë%ŽàF][P°µªÚu#«kú-˜¡âa§@Kùé+¾cå?Tu`;â³ÑÊÿëM]a¬áôPBFu%S»8.QõiªýS«&(ñÕWj±êª##LK곿sÝ$ƒéöªµ6ó÷'ùFærˆã €ÚäBærý#h·ªj´!²'óå¾\_Ï‘ 0P ,Õkï›WJöö8Hz&„¹z 2žÊÏòÀ|,×ò/à$ÀþôÑÒȜʇíúh:ꯠ󧒳ïÏÐþé²0'2›]ÀZ;¡®gì`^]‰<~*/_~—””ž aÒLiøGväyu†c®ï¹Én“èÒ†!µË³š\b:î߀¤~ßHNN*9?Ÿ"FˆMÃÑÑz~m“S“·;´áé=b<Ù(˜-5J :e„UG?–¢Òc…å©R[AÃÌVr|\¡úÂÛÐÜÙ©1ðW2Û®M2ˆÌ½ÂrÂ|ɃãþA­ôÂõgsó&…ŽÁx\£Ê=ú–¿V>Ç?¨Öû£Q$3"PÉnŒéBH ju !Á1]‰A-£N!ì‡èµ Ó͸qË··aFä4r£ª/|õ­–+ïÆ­Ü¦³+ïÆ7éÙû¡òVÏçìÝí娖ìuY1óOÒ¡Ï¿^áÝ |¡õ휔9÷§ÏáŠ}·À¡2Þ„¤Yáð#ó …‡òA™)|§Àx§A­ô½ÁX},¯È“'4Ælš6x’f=ÄÌe‘éè[ÙÕë)‹e8%Ì¥v=fÙ£>K—èß¿'_¦eÖ¼ !dzƳ¤±ë!œäÀ<«i‡´54'3tæÕÔᦚ"}ê³ù4 }é »Þ„P˜.è9gÞÇwèf¾ÊI‹¯>}`påݸ‘ÚüëÊ»ñÍšæI¨ü6{Íça­aS³\gA ’Öx£…xì²hB²Ào´]ÍBHXãBâ±Ë¢YÉk¼ÑBHÎUìz†5«_ÖC,‚sYe=„mhYi” sé®G¸ñ[ Î WÞ;â·¢¡ò· ´ÜêeµØ)!PId*3…TH&²SId*3…TH&²SId*3ÞS'˜31ïä¿ÄÐç_A¹C?Êçÿ´|º‚üR ‚ ¿ŠÅg±°“*ÇN;!­þƒÅý¦ôGØUGO2nWÁô€Ñ“=î+ô5œÿgy˜xð"í„4þÇÍ¿š˜ísËŠ  ÌXBú{ñÑ_ø® ‘žKд²‰;°q'¶®Óôœ-æÇûg?ü"ÿ¾£#Pt]±ØzBá”Ûâq'N¢éA0ë+>m¥HlSÞ©Í¿®¼߬ižP>W}ëMÈ6'}žÛ„óÏÑLkDNÛþ‚ Ê û†9‡u»èÓgûn_Cäz%Äæjžww±=`u-yô(®ÊŠ]ϰÅêb=Ä&"Õy>¿”Åb$ÓéÚ]w™f.ý_„ÖVaÓn°*®±aVŸßwÐ5Ó˜j.ôûúœóû°Êw+оl< ËC·%úÂWù³][`ÅlÕiUܸ½¿é*¿ÉÎ]÷{mCšp‡¤ñ#¥?c’HæpVYUÅýªØ[û¼×Õ|Ï]×]õ¹ùLLFºË÷^¯„°¸›Ì\£íXÊ»w }¬‡]ßZâ¤ÆöJ l¯ÄùÓkkQp¥ÐWòñãºí[§ÍyU`´WBÖ5‹’ÓÓ}½ñs›íûûN@GÐßÇn>±„Ä볛Π̞>]ï#¿N›*î’T(¾L]ïa6ûÔû;Ó¿0ý÷FHzp†Å{êe= ðr¤¢’Õ6 !ÀË¡ZÉj›…àåP-„ä@µƒÍBHðr¨Br ÚÁæHç&êäÿÛIEND®B`‚golly-3.3-src/Help/edit.html0000644000175000017500000001375212134152602012722 00000000000000 Golly Help: Edit Menu

Undo

Lets you undo one or more recent changes, including all editing changes and generating changes, as well as changes to the selection, rule, hashing state and layer name. The number of changes you can undo is limited only by available memory and disk space. Multiple changes made by a script are treated like a single change and will be undone all at once.

Each layer maintains its own undo/redo history (but cloned layers share the same undo/redo history). The current layer's undo/redo history is automatically cleared after creating a new pattern or opening a pattern file.

Redo

Lets you redo one or more recently undone changes. Note that the redo history is automatically cleared after you make a new change; i.e., if you do something like rotate the current selection, undo the rotation, then edit some cells or change the selection, you can no longer redo the rotation.

Disable Undo/Redo

If ticked then the Undo and Redo items are disabled, and any existing undo/redo history for the current layer is cleared. When editing or generating a very large pattern you may want to temporarily disable undo/redo to speed up some operations. But be careful using this feature — if you switch to another layer when this item is ticked then that layer's undo/redo history is also cleared.

Cut

Copies the pattern in the current selection to the clipboard (in RLE format) and then kills all cells in the selection.

Copy

Copies the pattern in the current selection to the clipboard. The clipboard data is in RLE format.

Clear

Kills all cells in the current selection.

Clear Outside

Kills all cells outside the current selection. This is often the quickest way to delete escaping gliders.

Paste

Pastes a pattern stored in the clipboard into the existing pattern. After selecting this item you'll be asked to click where you want the paste to occur. Before clicking you can use keyboard shortcuts to scroll, change scale, etc. The keyboard shortcuts normally used to flip/rotate the selection will instead modify the paste pattern. You can also type "M" to change the paste mode or "L" to change the paste location (see below). To cancel the paste, just click anywhere outside the view area or hit the escape key.

Settings in Preferences > Edit specify how to handle rule information in the clipboard pattern. You can tell Golly not to change the current rule, or only change the rule if the universe is empty, or always change to the given rule. Note that a rule change might cause the current algorithm to change.

The References section has links to a number of good sources for clipboard patterns.

If the clipboard text starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder (set in Preferences > Control) and switch to that rule.

Paste Mode

This submenu lets you choose the logical function used when pasting in a clipboard pattern. The choices are Copy, Or and Xor. Typing "M" will cycle through all these modes, even after selecting the Paste command.

Paste Location

This submenu lets you choose the location of the cursor within the paste rectangle that appears after selecting the Paste command. You can choose any corner or the middle of the rectangle. Typing "L" will cycle through all possible locations, even after selecting the Paste command.

Paste to Selection

Pastes a clipboard pattern into the current selection, but only if it will fit. The paste always occurs at the top left corner of the selection. This command can be used as a quick check to see if the pattern in the clipboard matches the pattern in the selection — if Xor paste mode is used then all the resulting cells will be dead if the patterns match.

Select All

Selects the entire pattern, assuming there are one or more live cells. If there are no live cells then any existing selection is removed.

Remove Selection

Removes the current selection (without changing any cell states).

Shrink Selection

Reduces the size of the current selection to the smallest rectangle containing all of the selection's live cells. You can hit "s" to shrink the selection and fit it in the current view.

Random Fill (n%)

Randomly fills the current selection with the indicated percentage of live cells. Use Preferences > Edit to change the percentage (from 1 to 100).

Flip Top-Bottom

The cells in the current selection are reflected about its central horizontal axis.

Flip Left-Right

The cells in the current selection are reflected about its central vertical axis.

Rotate Clockwise

The current selection is rotated 90 degrees clockwise about its center.

Rotate Anticlockwise

As above, but the rotation is anticlockwise.

Cursor Mode

This submenu lets you choose a cursor mode for various editing operations: drawing cells, picking cell states, selecting cells, moving the view, and zooming into or out from a clicked cell. There are other (quicker) ways to change the cursor mode:

  • Click on the corresponding buttons in the edit bar.
  • Hit the corresponding function keys (F2 to F7).
  • Hit "c" to cycle through all the cursor modes.
  • Press the shift key to temporarily toggle the draw/pick cursors or the zoom in/out cursors.
golly-3.3-src/Help/refs.html0000644000175000017500000000716613107435536012751 00000000000000 Golly Help: References

Good web sites

Good books and magazine articles

  • "Wheels, Life and Other Mathematical Amusements" by Martin Gardner. W. H. Freeman and Company, 1983. The last three chapters are an updated collection of his superb columns from Scientific American (see below). The last chapter has an excellent bibliography.
  • "The Recursive Universe" by William Poundstone. William Morrow & Company, 1985. An entire book devoted to a discussion of cellular automata and other fascinating topics in physics and mathematics.
  • "Winning Ways", Volume 2 by Elwyn Berlekamp, John Conway and Richard Guy. Academic Press, 1982. Chapter 25 has the title "What is Life?".
  • "Cellular Automata Machines" by Tommaso Toffoli and Norman Margolus. MIT Press, 1987. Describes CAM, a machine for doing sophisticated experiments with cellular automata.
  • "A New Kind of Science" by Stephen Wolfram. Wolfram Media, 2002. Bloated and egotistical, but there is plenty of fascinating stuff.
  • Scientific American articles:
    "Mathematical Games" columns by Martin Gardner: Oct, Nov 1970, Jan, Feb, Mar, Apr, Nov 1971, Jan 1972.
    "Computer Recreations" by Brian Hayes, Mar 1984.
  • BYTE articles:
    "Some Facts of Life" by David Buckingham, Dec 1978.
    "Life Algorithms" by Mark Niemiec, Jan 1979.
golly-3.3-src/Help/index.html0000644000175000017500000000271112773066602013112 00000000000000 Golly Help: Contents

 

Table of Contents

Introduction
Hints and Tips
Algorithms
Life Lexicon
Online Archives

Lua Scripting
Overlay
Python Scripting

Keyboard Shortcuts
Mouse Shortcuts
File Menu
Edit Menu
Control Menu
View Menu
Layer Menu
Help Menu
References
File Formats
Bounded Grids
Known Problems
Changes
Credits

golly-3.3-src/Help/algos.html0000644000175000017500000000121213125321675013077 00000000000000 Golly Help: Algorithms

Golly can generate patterns using a number of different algorithms:

QuickLife
HashLife
Generations
Larger than Life
JvN
RuleLoader

The same information is also available in the Control menu's Set Rule dialog. golly-3.3-src/Help/credits.html0000644000175000017500000000537413307733370013445 00000000000000 Golly Help: Credits

Click here for animated credits.

The pioneers

First and foremost, a big thanks to John Conway for creating the Game of Life, and to Martin Gardner for popularizing the topic in his Scientific American column.

The programmers

Tom Rokicki wrote most of the complicated stuff. Golly is essentially the merging of two of Tom's programs (hlife and qlife). The HashLife algorithm is based on an idea by Bill Gosper. The QuickLife algorithm uses some ideas from Alan Hensel. David Eppstein provided the idea on how to emulate B0 rules. The speed of the Larger than Life algorithm is mainly due to some clever ideas from Adam P. Goucher and Dean Hickerson.

Andrew Trevorrow wrote the cross-platform GUI code using wxWidgets. Much thanks to Julian Smart and all the other wxWidgets developers.

Golly's scripting capabilities are thanks to the generosity and efforts of Eugene Langvagen (author of PLife), Guido van Rossum (creator of Python), and Roberto Ierusalimschy and all the other Lua developers.

Tim Hutton wrote the RuleTable algorithm (now merged into the RuleLoader algorithm) and created the excellent Rule Table Repository.

Various code improvements have been contributed by Dave Greene, Jason Summers, Maks Verver, Robert Munafo and Chris Rowett.

The beta testers

Thanks to all the bug hunters for their reports and suggestions, especially Dave Greene, Gabriel Nivasch, Dean Hickerson, Brice Due, David Eppstein, Tony Smith, Alan Hensel, Dennis Langdeau, Bill Gosper, Mark Jeronimus, Eric Goldstein and Arie Paap.

Other contributors

Dave Greene and Alan Hensel helped put together the pattern collection. Thanks to everybody who allowed us to distribute their fantastic patterns, especially Nick Gotts, Gabriel Nivasch, David Eppstein, Jason Summers, Stephen Morley, Dean Hickerson, Brice Due, William R. Buckley, David Moore, Mark Owen, Tim Hutton, Renato Nobili, Adam P. Goucher, David Bell and Kenichi Morita.

Thanks to Stephen Silver for compiling the wonderful Life Lexicon.

Thanks to Nathaniel Johnston for creating the brilliant LifeWiki and for making its patterns available to Golly users via an online archive. golly-3.3-src/Help/python.html0000644000175000017500000016536113543255652013340 00000000000000 Golly Help: Python Scripting

Installing Python
Example scripts
Golly's scripting commands
Cell lists
Rectangle lists
Using the glife package
Potential problems
Python copyright notice

 
Installing Python

Before you can run a .py script, Python 2.x needs to be installed on your system (Python 3.x is NOT supported). Mac OS X users don't need to do anything because Python 2.7 is already installed. Windows and Linux users can download a Python 2.7 installer from www.python.org/download. WARNING: The 32-bit version of Golly requires a 32-bit version of Python, and 64-bit Golly requires a 64-bit Python.

On Windows and Linux, the Python library is loaded at runtime (the first time you try to run a script). Golly initially attempts to load a particular version of the Python library: python27.dll on Windows or libpython2.7.so on Linux. The numbers correspond to Python version 2.7. If that library can't be found then you'll be prompted to enter a different library name matching the version of Python 2.x installed on your system. A successfully loaded library is remembered (in your GollyPrefs file) so you won't get the prompt again unless you remove Python or install a new version. If Python isn't installed then you'll have to hit Cancel and you won't be able to run any .py scripts.

 
Example scripts

The Scripts folder supplied with Golly contains a number of example Python scripts:

density.py — calculates the density of the current pattern
draw-lines.py — lets you draw one or more straight lines
envelope.py — uses multiple layers to remember a pattern's live cells
flood-fill.py — fills a clicked region with the current drawing state
goto.py — goes to a given generation
gun-demo.py — constructs a few spaceship guns
heisenburp.py — illustrates the use of cloned layers
invert.py — inverts all cell states in the current selection
make-torus.py — makes a toroidal universe from the current selection
metafier.py — converts the current selection into a meta pattern
move-object.py — lets you move a connected group of live cells
move-selection.py — lets you move the current selection
oscar.py — detects oscillating patterns, including spaceships
pd-glider.py — creates a set of pentadecathlon+glider collisions
pop-plot.py — displays a plot of population versus time
shift.py — shifts the current selection by given x y amounts
slide-show.py — displays all patterns in the Patterns folder
tile.py — tiles the current selection with the pattern inside it
tile-with-clip.py — tiles the current selection with the clipboard pattern

To run one of these scripts, tick the Show Files item in the File menu, open the Scripts/Python folder and then simply click on the script's name. You can also select one of the Run items in the File menu. For a frequently used script you might like to assign a keyboard shortcut to run it (see Preferences > Keyboard).

When Golly starts up it looks for a script called golly-start.py in the same directory as the Golly application and then in a user-specific data directory (see the getdir command for the likely path on your system). If the script is found then it is automatically executed.

There are a number of ways to abort a running script. Hit the escape key, or click on the stop button in the tool bar, or select the Stop item in the Control menu.

 
Golly's scripting commands

This section describes all the commands that can be used in a script after importing the golly module. The examples below assume you've done the import by including this line:

import golly as g

Commands are grouped by function (filing, editing, control, viewing, layers and miscellaneous) or you can search for individual commands alphabetically:

addlayer
advance
autoupdate
check
clear
clone
copy
cut
dellayer
doevent
duplicate
empty
error
evolve
exit
fit
fitsel
flip
getalgo
getbase
getcell
getcells
getclip
getclipstr
getcolor
getcolors
getcursor
getdir
getevent
getgen
getheight
getinfo
getlayer
getmag
getname
getoption
getpath
getpop
getpos
getrect
getrule
getselrect
getstep
getstring
getview
getwidth
getxy
hash
join
load
maxlayers
movelayer
new
note
numalgos
numlayers
numstates
open
opendialog
os
parse
paste
putcells
randfill
reset
rotate
run
save
savedialog
select
setalgo
setbase
setcell
setclipstr
setcolor
setcolors
setcursor
setdir
setgen
setlayer
setmag
setname
setoption
setpos
setrule
setstep
setview
show
shrink
step
store
transform
update
visrect
warn

 
FILING COMMANDS

open(filename, remember=False)
Open the given file and process it according to its type:

  • A HTML file (.htm or .html extension) is displayed in the help window.
  • A text file (.txt or .doc extension, or a name containing "readme") is opened in your text editor.
  • A script file (.lua or .py extension) is executed.
  • A zip file (.zip extension) is processed as described here.
  • Any other type of file is assumed to be a pattern file and is loaded into the current layer.

A non-absolute path is relative to the location of the script. The 2nd parameter is optional (default = False) and specifies if the given pattern or zip file should be remembered in the Open Recent submenu, or in the Run Recent submenu if the file is a script.
Example: g.open("my-patterns/foo.rle")

save(filename, format, remember=False)
Save the current pattern in a given file using the specified format:

"rle" run length encoded (RLE)
"rle.gz" compressed RLE
"mc" macrocell
"mc.gz" compressed macrocell

A non-absolute path is relative to the location of the script. The 3rd parameter is optional (default = False) and specifies if the file should be remembered in the Open Recent submenu. If the savexrle option is True then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.save("foo.rle", "rle", True)

opendialog(title, filetypes, initialdir, initialfname, mustexist=True)
Present a standard Open dialog to the user and return the chosen path in a string. All parameters are optional; the default is an Open dialog showing the current directory, with a title of "Choose a file" and a file type of "All files (*)|*". If the 5th parameter (default = True) is set to False, the user can specify a new filename instead of choosing an existing file. If the given file type is "dir" then the dialog lets the user choose a directory rather than a file. If the user cancels the dialog, the return value will be an empty string.
Example: fname = g.opendialog("Open MCell File", "MCell files (*.mcl)|*.mcl", "C:\\Temp", "sample.mcl")
Example: dirname = g.opendialog("Choose a folder", "dir");

savedialog(title, filetypes, initialdir, initialfname, suppressprompt=False)
Present a standard Save dialog to the user and return the chosen path in a string. All parameters are optional; the default is a Save dialog showing the current directory, with a title of "Choose a save location and filename" and a file type of "All files (*)|*". If a file already exists at the chosen location, an Overwrite? query will be displayed unless the 5th parameter (default = False) is set to True. If the user cancels the dialog, the return value will be an empty string.
Example: fname = g.savedialog("Save text file", "Text files (*.txt;*.csv)|*.txt;*.csv", "C:\\Temp", "Params.txt", 1)

load(filename)
Read the given pattern file and return a cell list.
Example: blinker = g.load("blinker.rle")

store(cell_list, filename)
Write the given cell list to the specified file in RLE format. If the savexrle option is True then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.store(clist, "foo.rle")

getdir(dirname)
Return the path of the specified directory:

"app" — the directory containing the Golly application.

"data" — the user-specific data directory:
On Linux: ~/.golly/
On Mac OS X: ~/Library/Application Support/Golly/
On Windows XP: C:\Documents and Settings\username\Application Data\Golly\
On Windows 7+: C:\Users\username\AppData\Roaming\Golly\

"temp" — the directory Golly uses to store various temporary files. All these files are deleted when Golly quits.

"rules" — the user-specific rules directory set in Preferences > Control.

"files" — the directory displayed by File > Show Files.

"download" — the directory Golly uses to store downloaded files.

In each case a full path is returned, terminated by the appropriate path separator for the current platform.
Example: g.open(g.getdir("app") + "Patterns/Life/Breeders/breeder.lif")

setdir(dirname, dirpath)
Set the specified directory to the given path (which must be a full path to an existing directory). All the directory names listed above are allowed, except for "app", "data" and "temp".
Example: g.setdir("download", "/path/to/my-downloads/")

getinfo()
Return the comments from the current pattern.
Example: comments = g.getinfo()

getpath()
Return the pathname of the current open pattern. Returns "" if the current pattern is new and has not been saved.
Example: path = g.getpath()

 
EDITING COMMANDS

new(title)
Create a new, empty universe and set the window title. If the given title is empty then the current title won't change.
Example: g.new("test-pattern")

cut()
Cut the current selection to the clipboard.

copy()
Copy the current selection to the clipboard.

clear(where)
Clear inside (where = 0) or outside (where = 1) the current selection.
Example: g.clear(1)

paste(x, y, mode)
Paste the clipboard pattern at x,y using the given mode ("and", "copy", "or", "xor").
Example: g.paste(0, 0, "or")

shrink(remove_if_empty=False)
Shrink the current selection to the smallest rectangle enclosing all of the selection's live cells. If the selection has no live cells then the optional parameter specifies whether the selection remains unchanged or is removed.
Example: if len(g.getselrect()) > 0: g.shrink(True)

randfill(percentage)
Randomly fill the current selection to a density specified by the given percentage (1 to 100).
Example: g.randfill(50)

flip(direction)
Flip the current selection left-right (direction = 0) or top-bottom (direction = 1).

rotate(direction)
Rotate the current selection 90 degrees clockwise (direction = 0) or anticlockwise (direction = 1).

evolve(cell_list, numgens)
Advance the pattern in the given cell list by the specified number of generations and return the resulting cell list.
Example: newpatt = g.evolve(currpatt, 100)

join(cell_list1, cell_list2)
Join the given cell lists and return the resulting cell list. If the given lists are both one-state then the result is one-state. If at least one of the given lists is multi-state then the result is multi-state, but with one exception: if both lists have no cells then the result is [] (an empty one-state list) rather than [0]. See below for a description of one-state and multi-state cell lists.
Example: result = g.join(part1, part2)

transform(cell_list, x0, y0, axx=1, axy=0, ayx=0, ayy=1)
Apply an affine transformation to the given cell list and return the resulting cell list. For each x,y cell in the input list the corresponding xn,yn cell in the output list is calculated as xn = x0 + x*axx + y*axy, yn = y0 + x*ayx + y*ayy.
Example: rot_blinker = g.transform(blinker, 0, 0, 0, -1, 1, 0)

parse(string, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1)
Parse an RLE or Life 1.05 string and return an optionally transformed cell list.
Example: blinker = g.parse("3o!")

putcells(cell_list, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1, mode="or")
Paste the given cell list into the current universe using an optional affine transformation and optional mode ("and", "copy", "not", "or", "xor").
Example: g.putcells(currpatt, 6, -40, 1, 0, 0, 1, "xor")

getcells(rect_list)
Return any live cells in the specified rectangle as a cell list. The given list can be empty (in which case the cell list is empty) or it must represent a valid rectangle of the form [x,y,width,height].
Example: clist = g.getcells( g.getrect() )

getclip()
Parse the pattern data in the clipboard and return a cell list, but where the first two numbers are the pattern's width and height (not necessarily the minimal bounding box because the pattern might have empty borders, or it might even be empty). If the clipboard data is multi-state but all cell states happen to be zero then the returned cell list is [wd,ht] rather than [wd,ht,0].
Example: clist = g.getclip()

hash(rect_list)
Return an integer hash value for the pattern in the given rectangle. Two identical patterns will have the same hash value, regardless of their location in the universe. This command provides a fast way to detect pattern equality, but there is a tiny probability that two different patterns will have the same hash value, so you might need to use additional (slower) tests to check for true pattern equality.
Example: h = g.hash( g.getrect() )

select(rect_list)
Create a selection if the given list represents a valid rectangle of the form [x,y,width,height] or remove the current selection if the given list is [].
Example: g.select( [-10,-10,20,20] )

getrect()
Return the current pattern's bounding box as a list. If there is no pattern then the list is empty ([]), otherwise the list is of the form [x,y,width,height].
Example: if len(g.getrect()) == 0: g.show("No pattern.")

getselrect()
Return the current selection rectangle as a list. If there is no selection then the list is empty ([]), otherwise the list is of the form [x,y,width,height].
Example: if len(g.getselrect()) == 0: g.show("No selection.")

setcell(x, y, state)
Set the given cell to the specified state (0 for a dead cell, 1 for a live cell).

getcell(x, y)
Return the state of the given cell. The following example inverts the state of the cell at 0,0.
Example: g.setcell(0, 0, 1 - g.getcell(0, 0))

setcursor(string)
Set the current cursor according to the given string and return the old cursor string. The given string must match one of the names in the Cursor Mode menu.
Example: oldcurs = g.setcursor("Draw")

getcursor()
Return the current cursor as a string (ie. the ticked name in the Cursor Mode menu).

 
CONTROL COMMANDS

run(numgens)
Run the current pattern for the specified number of generations. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is True.
Example: g.run(100)

step()
Run the current pattern for the current step. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is True.

setstep(exp)
Temporarily set the current step exponent to the given integer. A negative exponent sets the step size to 1 and also sets a delay between each step, but that delay is ignored by the run and step commands. Golly will reset the step exponent to 0 upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setstep(0)

getstep()
Return the current step exponent.
Example: g.setstep( g.getstep() + 1 )

setbase(base)
Temporarily set the current base step to an integer from 2 to 2,000,000,000. The current exponent may be reduced if necessary. Golly will restore the default base step (set in Preferences > Control) upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setbase(2)

getbase()
Return the current base step.

advance(where, numgens)
Advance inside (where = 0) or outside (where = 1) the current selection by the specified number of generations. The generation count does not change.
Example: g.advance(0, 3)

reset()
Restore the starting pattern and generation count. Also reset the algorithm, rule, scale, location and step exponent to the values they had at the starting generation. The starting generation is usually zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

setgen(gen)
Set the generation count using the given string. Commas and other punctuation marks can be used to make a large number more readable. Include a leading +/- sign to specify a number relative to the current generation count.
Example: g.setgen("-1,000")

getgen(sepchar='\0')
Return the current generation count as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getgen(',') would return a string like "1,234,567" but g.getgen() would return "1234567". Use the latter call if you want to do arithmetic on the generation count because then it's easy to use int to convert the string to an integer. Note that Python supports arbitrarily large integers.
Example: gen = int( g.getgen() )

getpop(sepchar='\0')
Return the current population as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getpop(',') would return a string like "1,234,567" but g.getpop() would return "1234567". Use the latter call if you want to do arithmetic on the population count. The following example converts the population to a floating point number.
Example: pop = float( g.getpop() )

empty()
Return True if the universe is empty or False if there is at least one live cell. This is much more efficient than testing getpop() == "0".
Example: if g.empty(): g.show("All cells are dead.")

numstates()
Return the number of cell states in the current universe. This will be a number from 2 to 256, depending on the current algorithm and rule.
Example: maxstate = g.numstates() - 1

numalgos()
Return the number of algorithms (ie. the number of items in the Set Algorithm menu).
Example: maxalgo = g.numalgos() - 1

setalgo(string)
Set the current algorithm according to the given string which must match one of the names in the Set Algorithm menu.
Example: g.setalgo("HashLife")

getalgo(index=current)
Return the algorithm name at the given index in the Set Algorithm menu, or the current algorithm's name if no index is supplied.
Example: lastalgo = g.getalgo( g.numalgos() - 1 )

setrule(string)
Set the current rule according to the given string. If the current algorithm doesn't support the specified rule then Golly will automatically switch to the first algorithm that does support the rule. If no such algorithm can be found then you'll get an error message and the script will be aborted.
Example: g.setrule("b3/s23")

getrule()
Return the current rule as a string in canonical format.
Example: oldrule = g.getrule()

getwidth()
Return the width (in cells) of the current universe (0 if unbounded).
Example: wd = g.getwidth()

getheight()
Return the height (in cells) of the current universe (0 if unbounded).
Example: ht = g.getheight()

 
VIEWING COMMANDS

setpos(x, y)
Change the position of the viewport so the given cell is in the middle. The x,y coordinates are given as strings so the viewport can be moved to any location in the unbounded universe. Commas and other punctuation marks can be used to make large numbers more readable. Apart from a leading minus sign, most non-digits are simply ignored; only alphabetic characters will cause an error message. Note that positive y values increase downwards in Golly's coordinate system.
Example: g.setpos("1,000,000,000,000", "-123456")

getpos(sepchar='\0')
Return the x,y position of the viewport's middle cell in the form of a Python tuple containing two strings. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting strings more readable. For example, g.getpos(',') might return two strings like "1,234" and "-5,678" but g.getpos() would return "1234" and "-5678". Use the latter call if you want to do arithmetic on the x,y values, or just use the getposint() function defined in the glife package.
Example: x, y = g.getpos()

setmag(mag)
Set the magnification, where 0 corresponds to the scale 1:1, 1 = 1:2, -1 = 2:1, etc. The maximum allowed magnification is 5 (= 1:32).
Example: g.setmag(0)

getmag()
Return the current magnification.
Example: g.setmag( g.getmag() - 1 )

fit()
Fit the entire pattern in the viewport.

fitsel()
Fit the current selection in the viewport. The script aborts with an error message if there is no selection.

visrect(rect_list)
Return True if the given rectangle is completely visible in the viewport. The rectangle must be a list of the form [x,y,width,height].
Example: if g.visrect( [0,0,44,55] ): . . .

setview(wd, ht)
Set the pixel width and height of the viewport (the main window will be resized accordingly).
Example: g.setview(32*32, 32*30)

getview(index=-1)
Return the pixel width and height of the viewport if the given index is -1 (the default), or the pixel width and height of the specified layer if the given index is an integer from 0 to numlayers() - 1.
Example: wd, ht = g.getview()

autoupdate(bool)
When Golly runs a script this setting is initially False. If the given parameter is True then Golly will automatically update the viewport and the status bar after each command that changes the universe or viewport in some way. Useful for debugging Python scripts.
Example: g.autoupdate(True)

update()
Immediately update the viewport and the status bar, regardless of the current autoupdate setting. Note that Golly always does an update when a script finishes.

 
LAYER COMMANDS

addlayer()
Add a new, empty layer immediately after the current layer and return the new layer's index, an integer from 0 to numlayers() - 1. The new layer becomes the current layer and inherits most of the previous layer's settings, including its algorithm, rule, scale, location, cursor mode, etc. The step exponent is set to 0, there is no selection, no origin offset, and the layer's initial name is "untitled".
Example: newindex = g.addlayer()

clone()
Like addlayer (see above) but the new layer shares the same universe as the current layer. The current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled).
Example: cloneindex = g.clone()

duplicate()
Like addlayer (see above) but the new layer has a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized.
Example: dupeindex = g.duplicate()

dellayer()
Delete the current layer. The current layer changes to the previous layer (unless layer 0 was deleted).

movelayer(fromindex, toindex)
Move a specified layer to a new position in the layer sequence. The chosen layer becomes the current layer.
Example: g.movelayer(1, 0)

setlayer(index)
Set the current layer to the layer with the given index, an integer from 0 to numlayers() - 1.
Example: g.setlayer(0)

getlayer()
Return the index of the current layer, an integer from 0 to numlayers() - 1.
Example: currindex = g.getlayer()

numlayers()
Return the number of existing layers, an integer from 1 to maxlayers().
Example: if g.numlayers() > 1: g.setoption("tilelayers",1)

maxlayers()
Return the maximum number of layers (10 in this implementation).

setname(string, index=current)
Set the name of the given layer, or the current layer's name if no index is supplied.
Example: g.setname("temporary")

getname(index=current)
Return the given layer's name, or the current layer's name if no index is supplied.
Example: if g.getname() == "temporary": g.dellayer()

setcolors(color_list)
Set the color(s) of one or more states in the current layer and its clones (if any). If the given list contains a multiple of 4 integers then they are interpreted as state, red, green, blue values. A state value of -1 can be used to set all live states to the same color (state 0 is not changed). If the given list contains exactly 6 integers then they are interpreted as a color gradient from r1, g1, b1 to r2, g2, b2 for all the live states (state 0 is not changed). If the given list is empty then all states (including state 0) are reset to their default colors, depending on the current algorithm and rule. Note that the color changes made by this command are only temporary. Golly will restore the default colors if a new pattern is opened or created, or if the algorithm or rule changes, or if Preferences > Color is used to change any of the default colors for the current layer's algorithm.
Example: g.setcolors([1,0,0,0, 2,0,0,0]) # set states 1 and 2 to black
Example: g.setcolors([-1,0,255,0]) # set all live states to green
Example: g.setcolors([255,0,0, 0,0,255]) # live states vary from red to blue
Example: g.setcolors([]) # restore default colors

getcolors(state=-1)
Return the color of a given state in the current layer as a list of the form

[ state, red, green, blue ]

or if the given state is -1 (or not supplied) then return all colors as

[ 0, r0, g0, b0, . . . N, rN, gN, bN ]

where N equals numstates() - 1. Note that the list returned by getcolors can be passed into setcolors; this makes it easy to save and restore colors.
Example: allcolors = g.getcolors()
Example: deadcolor = g.getcolors(0)

 
MISCELLANEOUS COMMANDS

os()
Return the current operating system: "Windows", "Mac" or "Linux".
Example: if g.os() == "Mac": do_mac_stuff()

setoption(name, value)
Set the given option to the given value. The old value is returned to make it easy to restore a setting. Here are all the valid option names and their possible values:

"autofit" 1 or 0 (True or False)
"boldspacing" 2 to 1000 (cells)
"drawingstate" 0 to numstates()-1
"fullscreen" 1 or 0 (True or False)
"hyperspeed" 1 or 0 (True or False)
"maxdelay" 0 to 5000 (millisecs)
"mindelay" 0 to 5000 (millisecs)
"opacity" 1 to 100 (percent)
"restoreview" 1 or 0 (True or False)
"savexrle" 1 or 0 (True or False)
"showallstates" 1 or 0 (True or False)
"showboldlines" 1 or 0 (True or False)
"showbuttons" 0 to 4
"showeditbar" 1 or 0 (True or False)
"showexact" 1 or 0 (True or False)
"showfiles" 1 or 0 (True or False)
"showgrid" 1 or 0 (True or False)
"showhashinfo" 1 or 0 (True or False)
"showicons" 1 or 0 (True or False)
"showlayerbar" 1 or 0 (True or False)
"showoverlay" 1 or 0 (True or False)
"showpopulation" 1 or 0 (True or False)
"showprogress" 1 or 0 (True or False)
"showscrollbars" 1 or 0 (True or False)
"showstatusbar" 1 or 0 (True or False)
"showtimeline" 1 or 0 (True or False)
"showtoolbar" 1 or 0 (True or False)
"smartscale" 1 or 0 (True or False)
"stacklayers" 1 or 0 (True or False)
"swapcolors" 1 or 0 (True or False)
"switchlayers" 1 or 0 (True or False)
"synccursors" 1 or 0 (True or False)
"syncviews" 1 or 0 (True or False)
"tilelayers" 1 or 0 (True or False)

Example: oldgrid = g.setoption("showgrid", True)

getoption(name)
Return the current value of the given option. See above for a list of all the valid option names.
Example: if g.getoption("autofit"): g.fit()

setcolor(name, r, g, b)
Set the given color to the given RGB values (integers from 0 to 255). The old RGB values are returned as a 3-tuple to make it easy to restore the color. Here is a list of all the valid color names and how they are used:

"border" color for border around bounded grid
"paste" color for pasting patterns
"select" color for selections (will be 50% transparent)
algoname status bar background for given algorithm

Example: oldrgb = g.setcolor("HashLife", 255, 255, 255)

getcolor(name)
Return the current RGB values for the given color as a 3-tuple. See above for a list of all the valid color names.
Example: selr, selg, selb = g.getcolor("select")

getclipstr()
Return the current contents of the clipboard as an unmodified string.
Example: illegalRLE = g.getclipstr()

setclipstr(string)
Copy an arbitrary string (not necessarily a cell pattern) directly to the clipboard.
Example: g.setclipstr(correctedRLE)

getstring(prompt, initial="", title="")
Display a dialog box and get a string from the user. If the initial string is supplied it will be shown and selected. If the title string is supplied it will be used in the dialog's title bar. The script will be aborted if the user hits the dialog's Cancel button.
Example: i = int( g.getstring("Enter a number:", "100") )

getevent(get=True)
When Golly runs a script it initially handles all user events, but if the script calls getevent() then future events are put into a queue for retrieval via later calls. These events are returned in the form of strings (see below for the syntax). If there are no events in the queue then the returned string is empty. Note that the very first getevent() call will always return an empty string, but this isn't likely to be a problem because it normally occurs very soon after the script starts running. A script can call getevent(False) if it wants Golly to resume handling any further events. See flood-fill.py for a good example.

Key-down events are triggered when a key is pressed or autorepeats. The returned string is of the form "key charname modifiers" where charname can be any displayable ASCII character from '!' to '~' or one of the following names: space, home, end, pageup, pagedown, help, insert, delete, tab, return, left, right, up, down, or f1 to f24. If no modifier key was pressed then modifiers is none, otherwise it is some combination of alt, cmd, ctrl, meta, shift. Note that cmd will only be returned on a Mac and corresponds to the command key. The alt modifier corresponds to the option key on a Mac.

Key-up events occur when a key is released and are strings of the form "kup charname".

Mouse-down events in the current layer are strings of the form "click x y button modifiers" where x and y are integers giving the cell position of the click, button is one of left, middle or right, and modifiers is the same as above.

Mouse-down events in a non-transparent pixel in the overlay are strings of the form "oclick x y button modifiers" where x and y are integers giving the pixel position in the overlay (0,0 is the top left pixel), button is one of left, middle or right, and modifiers is the same as above.

Mouse-up events are strings of the form "mup button" where button is one of left, middle or right.

Mouse wheel events in the current layer are strings of the form "zoomin x y" or "zoomout x y" where x and y are the mouse's pixel position in the viewport.

Mouse wheel events in a non-transparent pixel in the overlay are strings of the form "ozoomin x y" or "ozoomout x y" where x and y are the mouse's pixel position in the overlay.

File events are strings of the form "file filepath" where filepath is an absolute path. File events can be triggered in a number of ways: by clicking on a file in the left panel, by clicking an "open:" link in the Help window, by double-clicking a Golly-associated file, or by dropping a file onto the Golly window. It is up to the script to decide what to do with the file.

The following examples show the strings returned after various user events:

"key m none" user pressed M key
"key space shift" user pressed space bar and shift key
"key , altctrlshift" user pressed comma and 3 modifier keys
"kup left" user released the left arrow key
"click 100 5 left none" user clicked cell at 100,5 with left button
"click -10 9 middle alt" user clicked cell with middle button and pressed alt key
"click 0 1 right altshift" user clicked cell with right button and pressed 2 modifiers
"oclick 10 5 left none" user clicked pixel at 10,5 in overlay with left button
"mup left" user released the mouse's left button
"zoomout 10 20" mouse wheel was used to zoom out from pixel in viewport
"ozoomin 10 20" mouse wheel was used to zoom in to pixel in overlay
"file /path/to/foo.rle" user tried to open the given file

Example: evt = g.getevent()

doevent(event)
Pass the given event to Golly to handle in the usual manner (but events that can change the current pattern will be ignored). The given event must be a string with the exact same format as returned by the getevent command (see above). If the string is empty then Golly does nothing. Note that the cmd modifier corresponds to the command key on a Mac or the control key on Windows/Linux (this lets you write portable scripts that work on any platform).
Example: g.doevent("key q cmd") # quit Golly

getxy()
Return the mouse's current grid position as a string. The string is empty if the mouse is outside the viewport or outside a bounded grid or over the translucent buttons, otherwise the string contains x and y cell coordinates separated by a space; eg. "-999 12345". See draw-lines.py for a good example of how to use this command.
Example: mousepos = g.getxy()

show(message)
Show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.show("Hit any key to continue...")

error(message)
Beep and show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.error("The pattern is empty.")

warn(message, showCancel=True)
Beep and show the given string in a modal warning dialog. Useful for debugging Python scripts or displaying error messages. If showCancel is True (the default) then the dialog has a Cancel button as well as the usual OK button. Clicking OK will close the dialog and continue; clicking Cancel will close the dialog and abort the script.
Example: g.warn("xxx = " + str(xxx))

note(message, showCancel=True)
Show the given string in a modal information dialog. Useful for displaying multi-line results. If showCancel is True (the default) then the dialog has a Cancel button as well as the usual OK button. Clicking OK will close the dialog and continue; clicking Cancel will close the dialog and abort the script.
Example: g.note("Line 1\nLine 2\nLine 3", False)

check(bool)
When Golly runs a script this setting is initially True, which means that event checking is enabled. If the given parameter is False then event checking is disabled. Typically used to prevent mouse clicks being seen at the wrong time. This should only be done for short durations because the script cannot be aborted while the setting is False.
Example: g.check(False)

exit(message="")
Exit the script with an optional error message. If a non-empty string is supplied then it will be displayed in the status bar along with a beep, just like the error command. If no message is supplied, or if the string is empty, then there is no beep and the current status bar message will not be changed.
Example: if g.empty(): g.exit("There is no pattern.")

 
Cell lists

Some scripting commands manipulate patterns in the form of cell lists. Golly supports two types of cell lists: one-state and multi-state. A one-state cell list contains an even number of integers specifying the x,y coordinates for a set of cells, all of which are assumed to be in state 1:

[ x1, y1, . . . xN, yN ]

A multi-state cell list contains an odd number of integers specifying the x,y,state values for a set of cells. If the number of cells is even then a padding integer (zero) is added at the end of the list to ensure the total number of integers is odd:

[ x1, y1, state1, . . . xN, yN, stateN ]      if N is odd
[ x1, y1, state1, . . . xN, yN, stateN, 0 ]  if N is even

All scripting commands that input cell lists use the length of the list to determine its type. When writing a script to handle multi-state cell lists you may need to allow for the padding integer, especially if accessing cells within the list. See tile.py for example.

Note that all scripting commands return [] if the resulting cell list has no cells. They never return [0], although this is a perfectly valid multi-state cell list and all commands can input such a list. For example, newlist = g.join(list1,[0]) can be used to convert a non-empty one-state list to multi-state.

One-state cell lists are normally used in a two-state universe, but they can also be used in a universe with more than two states. A multi-state cell list can be used in a two-state universe, but only if the list's cell states are 0 or 1.

The ordering of cells within either type of list doesn't matter. Also note that positive y values increase downwards in Golly's coordinate system.

 
Rectangle lists

Some commands manipulate rectangles in the form of lists. An empty rectangle is indicated by a list with no items; ie. []. A non-empty rectangle is indicated by a list containing four integers:

[ left, top, width, height ]

The first two items specify the cell at the top left corner of the rectangle. The last two items specify the rectangle's size (in cells). The width and height must be greater than zero.

 
Using the glife package

The glife folder included in the Scripts/Python folder is a Python package that provides a high-level interface to some of Golly's scripting commands (it's based on Eugene Langvagen's life package included in PLife). When a script imports glife or any of its submodules, Python automatically executes the __init__.py module. This module defines the pattern and rect classes as well as a number of useful synonyms and helper functions. For example, consider this script:

from glife import *
blinker = pattern("3o!")
blinker.put(1, 2)
blinker.put(6, 7, rcw)   # rcw means rotate clockwise

Here is the equivalent script without using glife:

import golly as g
blinker = g.parse("3o!")
g.putcells(blinker, 1, 2)
g.putcells(blinker, 6, 7, 0, -1, 1, 0)

Here are some helper functions defined in glife:

validint(s) — return True if given string is a valid integer
getposint() — return viewport position as a tuple with 2 integers
setposint(x,y) — use given integers to set viewport position
getminbox(patt) — return minimal bounding box of given pattern

Most of the supplied Python scripts import glife, but it isn't compulsory. You might prefer to create your own high-level interface for the scripts you write.

 
Potential problems

1. The Python interpreter's memory allocator doesn't always release memory back to the operating system. If you run a complicated or buggy script that uses lots of (Python) memory then that memory is no longer available for use by Golly, so you might need to quit Golly and restart.

2. The first time you run a script that imports a particular module, the Python interpreter caches the results so it won't need to reload that module the next time it is imported. This is good for efficiency, but it's a problem if you've modified an imported module and you want to test your changes. One solution is to quit Golly and restart. Another solution is to force the module to be reloaded by inserting a line like

import mymodule ; reload(mymodule)

at the start of each script that imports the module. When the module is stable you can remove or comment out the reload command.

3. The escape key check to abort a running script is not done by Python but by each Golly scripting command. This means that very long Python computations should call an occasional "no-op" command like g.doevent("") to allow the script to be aborted in a timely manner.

4. When writing a script that creates a pattern, make sure the script starts with a new call (or, less useful, an open call that loads a pattern, or a save call) otherwise the script might create lots of temporary files or use lots of memory. From Golly's point of view there are two types of scripts:

  • A script that calls new or open or save is assumed to be creating some sort of pattern, so when Golly sees these calls it clears any undo history and sets an internal flag that says "don't mark this layer as dirty and don't bother recording any further changes".
  • A script that doesn't call new or open or save is assumed to modify the current pattern. Golly must record all the script's changes so that when it finishes you can select "Undo Script Changes" from the Edit menu. Generating changes (due to run or step calls) are stored in temporary files; all other changes are stored in memory.

 
Python copyright notice

Golly uses an embedded Python interpreter to execute scripts. The Python license agreement is included in Golly's LICENSE file. Here is the official Python copyright notice:

Copyright (c) 2001-2007 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.

golly-3.3-src/Help/layer.html0000644000175000017500000001526213043333474013117 00000000000000 Golly Help: Layer Menu

Golly supports up to ten layers. Each layer is a separate universe (unless cloned; see the Clone Layer item below) with its own algorithm, rule, viewport, cursor mode, selection, step size, origin offset, color scheme and name. The current layer's name is displayed in the main window's title bar. Most edit/control/view operations only apply to the current layer.

Note that most of Golly's options apply globally to all layers. This is true for all of the options set in the Preferences dialog. It's also true for many of the options set via menu items, like Save Extended RLE, Paste Mode, Paste Location, Show Grid Lines, etc., but not for any of the Control menu options (Auto Fit, Hyperspeed, and Show Hash Info).

The items at the bottom of the Layer menu show the current names of all the existing layers. The names of cloned layers are prefixed by one or more "=" signs; all layers with the same number of "=" signs share the same universe. The current layer is indicated by a tick. To switch to another layer just select the corresponding item. If a script is running then you can only switch to another layer if the script has called g.setoption("switchlayers",1).

A layer containing a modified pattern is indicated by a "*" at the start of the layer's name. To avoid losing your changes, a "save changes" dialog will appear before creating a new pattern, opening a pattern file, deleting the layer, or quitting Golly. If you'd rather not see this dialog then untick the appropriate check boxes in Preferences > Layer.

Common layer functions are also available via buttons in the layer bar located underneath the status bar. Use the Show Layer Bar item in the View menu to show/hide the layer bar, or just hit the "\" key.

Save Overlay...

Opens the standard file saving dialog so you can save the current overlay image in a PNG file. Note that it's possible to save the overlay while a script is executing.

Show Overlay

If ticked then the current overlay will be displayed (if it exists and if it contains any non-transparent pixels). You can show/hide the overlay while a script is executing.

Delete Overlay

Deletes the current overlay. Unlike Save Overlay and Show Overlay, it's not possible to select this menu item while a script is executing.

Add Layer

Adds a new layer (with an empty universe) immediately after the current layer. The new layer becomes the current layer and inherits the preceding layer's algorithm, rule, scale, location, and cursor mode. The step size is set to 1, there is no selection, no origin offset, and the layer's initial name is "untitled". The new layer starts off using the default color scheme for the current algorithm and rule.

Clone Layer

Adds a new layer that shares the same universe, undo/redo history, and color scheme as the current layer. All of the current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled). Cloned layers can also have different names, cursor modes, or control options (Auto Fit, Hyperspeed, and Show Hash Info).

Duplicate Layer

Adds a new layer with a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized. A duplicated layer starts with the same undo/redo history as the original layer but their histories will diverge if changes are made to either layer.

Delete Layer

Deletes the current layer. The current layer changes to the preceding layer (unless the first layer was deleted).

Delete Other Layers

Deletes all layers except the current layer.

Move Layer...

Opens a dialog that lets you move the current layer to a new position in the layer sequence, where 0 is the position of the first layer.

Name Layer...

Opens a dialog that lets you change the name of the current layer. Note that opening or saving a pattern file also changes the layer's name. Creating a new pattern resets the name to "untitled".

Set Layer Colors...

Opens a dialog that lets you change any of the cell colors used by the current layer and its clones (if any). Note that any changes you make here are temporary. If you open a pattern file or create a new pattern, or if you change the current algorithm or rule, then the colors will be reset to their default values as specified in Preferences > Color.

Synchronize Views

If ticked, then when you switch to another layer Golly will automatically switch to the same scale and location as the old layer. Most of the time you'll probably prefer to keep this option turned off so that each layer has a different scale and location.

Synchronize Cursors

If ticked, then when you switch to another layer Golly will automatically switch to the same cursor mode as the old layer. You'll probably find it less confusing if this option is kept turned on, but it can be useful in some situations for different layers to use different cursors. For example, you might want to make selections in one layer but draw cells in another layer.

Stack Layers

If ticked then all layers are displayed on top of one another, temporarily using the same scale and location as the current layer. The pattern in layer 0 is drawn first (100% opaque), then the patterns in other layers are drawn on top as translucent overlays. The opacity percentage of the pattern overlays can be set in Preferences > Layer. For an example of how stacked layers can be useful, load in a pattern and run the envelope.py script.

Tile Layers

If ticked then the viewport window is tiled into sub-windows and each layer is displayed in a separate tile. Clicking in the window of a non-current layer will change the current layer. Tiling is very handy with cloned layers as it allows you to view the same pattern at different scales and/or locations. golly-3.3-src/Help/intro.html0000644000175000017500000000354412026730263013133 00000000000000 Golly Help: Introduction

What is Golly?

Golly is a cross-platform application for exploring John Conway's Game of Life and other cellular automata. It's also free and open source. More details, including links to the source and binary distributions, are available at the Golly web site:

http://golly.sourceforge.net/

What is Life?

The Game of Life is a simple example of a set of rules more broadly known as a "cellular automaton", or CA for short. CAs were first studied in the mid-1950s by Stanislaw Ulam and John von Neumann but became much more widely known in 1970 when Conway's Life was described by Martin Gardner in his Scientific American column.

Life is played on an arbitrary-sized grid of square cells. Each cell has two states: "dead" or "alive". The state of every cell changes from one "generation" to the next according to the states of its 8 nearest neighbors: a dead cell becomes alive (a "birth") if it has exactly 3 live neighbors; a live cell dies out if it has less than 2 or more than 3 live neighbors. The "game" of Life simply involves starting off with a pattern of live cells and seeing what happens.

Even though the rules for Life are completely deterministic, it is impossible to predict whether an arbitrary starting pattern will die out, or start oscillating, or expand forever. Life and other CAs provide a powerful demonstration of how a very simple system can generate extremely complicated results.

If you'd like to learn more about Life and other cellular automata then check out the links and books mentioned in the References, or start exploring the Life Lexicon. golly-3.3-src/Help/Algorithms/0000755000175000017500000000000013543257425013306 500000000000000golly-3.3-src/Help/Algorithms/Generations.html0000644000175000017500000002232013273534663016373 00000000000000 Golly Help: Generations

The Generations algorithm supports rules similar to Life but with an extra history component that allows cells to have up to 256 states. The rule notation is "0..8/1..8/n" where the 1st set of digits specify the live neighbor counts necessary for a cell to survive to the next generation. The 2nd set of digits specify the live neighbor counts necessary for a cell to be born in the next generation. The final number n specifies the maximum number of cell states (from 2 to 256).

Here are some example rules:

2367/3457/5 [Banners] - an exploding rule by Mirek Wojtowicz.
234/34678/24 [Bloomerang] - an expanding rule by John Elliott.
/2/3 [Brian's Brain] - a chaotic rule by Brian Silverman.
124567/378/4 [Caterpillars] - a chaotic rule by Mirek Wojtowicz.
23/2/8 [Cooties] - an exploding rule by Rudy Rucker.
2/13/21 [Fireworks] - an exploding rule by John Elliott.
12/34/3 [Frogs] - a chaotic rule by Scott Robert Ladd.
12345/45678/8 [Lava] - an expanding rule by Mirek Wojtowicz.
012345/458/3 [Lines] - a stable rule by Anders Starmark.
345/2/4 [Star Wars] - an exploding rule by Mirek Wojtowicz.
3456/2/6 [Sticks] - an exploding rule by Rudy Rucker.
345/26/5 [Transers] - an exploding rule by John Elliott.
1456/2356/16 [Xtasy] - an exploding rule by John Elliott.

Other rules in this family, along with more detailed descriptions, can be found at Mirek Wojtowicz's MCell website. See also the Patterns/Generations folder which contains a number of interesting patterns extracted from the MCell pattern collection.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual notation and use neighbor counts ranging from 0 to 4.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

Golly can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual notation and use neighbor counts ranging from 0 to 6. Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons (in icon mode) at scales 1:8 or 1:16 or 1:32.

 
Non-totalistic rules

All of the above rules are classified as "totalistic" because the outcome depends only on the total number of neighbors. Golly also supports non-totalistic rules for Moore neighborhoods — such rules depend on the configuration of the neighbors, not just their counts.

The syntax used to specify a non-totalistic rule is based on a notation developed by Alan Hensel. It's very similar to the above notation but uses various lowercase letters to represent unique neighborhoods. One or more of these letters can appear after an appropriate digit (which must be from 1 to 7, depending on the letters). The usual counts of 0 and 8 can still be used without letters since there is no way to constrain 0 or 8 neighbors. Letter strings can get quite long, so it's possible to specify their inverse using a "-" between the digit and the letters.

The following table shows which letters correspond to which neighborhoods. The central cell in each neighborhood is colored red, corner neighbors are green, edge neighbors are yellow and ignored neighbors are black:

The table makes it clear which digits are allowed before which letters. For example, /1a/8 and /5z/8 are both invalid rules.

Golly uses the following steps to convert a given non-totalistic rule into its canonical version:

  1. An underscore can be used instead of a slash, but the canonical version always uses a slash.
  2. The lowercase letters are listed in alphabetical order. For example, /2nic/8 will become /2cin/8.
  3. A given rule is converted to its shortest equivalent version. For example, /2ceikn/8 will become /2-a/8. If equivalent rules have the same length then the version without the minus sign is preferred. For example, /4-qjrtwz/8 will become /4aceikny/8.
  4. It's possible for a non-totalistic rule to be converted to a totalistic rule. If you supply all the letters for a specific neighbor count then the canonical version removes the letters. For example, /2aceikn3/8 will become /23/8. (Note that /2-3/8 is equivalent to /2aceikn3/8 so will also become /23/8.)
  5. If you supply a minus sign and all the letters for a specific neighbor count then the letters and the neighbor count are removed. For example, /2-aceikn3/8 will become /3/8.

 
MAP rules

The totalistic and non-totalistic rules above are only a small subset of all possible rules for a 2-state Moore neighborhood. The Moore neighborhood has 9 cells which gives 512 (2^9) possible combinations of cells. For each of these combinations you define whether the output cell is dead or alive, giving a string of 512 digits, each being 0 (dead) or 1 (alive).

   0 1 2
   3 4 5  ->  4'
   6 7 8
The first few entries for Conway's Life in Generations form (23/3/2) in this format are as follows:
   Cell 0 1 2 3 4 5 6 7 8  ->  4'
   0    0 0 0 0 0 0 0 0 0  ->  0
   1    0 0 0 0 0 0 0 0 1  ->  0
   2    0 0 0 0 0 0 0 1 0  ->  0
   3    0 0 0 0 0 0 0 1 1  ->  0
   4    0 0 0 0 0 0 1 0 0  ->  0
   5    0 0 0 0 0 0 1 0 1  ->  0
   6    0 0 0 0 0 0 1 1 0  ->  0
   7    0 0 0 0 0 0 1 1 1  ->  1   B3
   8    0 0 0 0 0 1 0 0 0  ->  0
   9    0 0 0 0 0 1 0 0 1  ->  0
   10   0 0 0 0 0 1 0 1 0  ->  0
   11   0 0 0 0 0 1 0 1 1  ->  1   B3
   ...
   19   0 0 0 0 1 0 0 1 1  ->  1   S2
   ...
   511  1 1 1 1 1 1 1 1 1  ->  0
This creates a string of 512 binary digits:
   00000001000100000001...0
This binary string is then base64 encoded for brevity giving a string of 86 characters:
   ARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
By prefixing this string with "MAP" the syntax of the rule becomes:
   rule = MAP<base64_string>/<states>
So, Conway's Life in Generations (23/3/2) form encoded as a MAP rule is:
   rule = MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA/2
Given each MAP rule has 512 bits and there are 255 different Generations states (2 to 256) this leads to 255*2^512 (roughly 3.42x10^156) unique rules. Totalistic rules are a subset of isotropic non-totalistic rules which are a subset of MAP rules.

MAP rules can also be specified for Hexagonal and von Neumann neighborhoods.

Hexagonal neighborhoods have 7 cells (center plus 6 neighbors) which gives 128 (2^7) possible combinations of cells. These encode into 22 base64 characters.

Von Neumann neighborhoods have 5 cells (center plus 4 neighbors) which gives 32 (2^5) possible combinations of cells. These encode into 6 base64 characters.

For any of the neighborhoods the base64 encoding can optionally be postfixed with two base64 padding characters: "==". golly-3.3-src/Help/Algorithms/HashLife.html0000644000175000017500000000120512026730263015564 00000000000000 Golly Help: HashLife

HashLife uses Bill Gosper's hashlife algorithm to achieve remarkable speeds when generating patterns that have a lot of regularity in time and/or space.

HashLife supports the same set of rules as QuickLife, but with one exception: if a rule contains B0 it must also contain S8 (or S6 if the rule ends with H, or S4 if it ends with V).

Note that HashLife performs very poorly on highly chaotic patterns, so in those cases you are better off switching to QuickLife. golly-3.3-src/Help/Algorithms/NC.png0000644000175000017500000000213113273534663014233 00000000000000‰PNG  IHDRGGU°Z!tEXtSoftwareGraphicConverter (Intel)w‡úóIDATxœì\=Oã@µ¨)ø¡# üÈ/€Ž&5:ˆ\!Ñ@Gt¹êh=×)'"Q ZšCsûöÖÇ{IØx7ºyÒ€ˆŸwfŽ÷kì(rʳùùyªV«´¶¶F´½½MÍf“vww©ÕjQÇò7þÆç8ø8çµ?…\œƒÒèv»tuuE'''txxHív›nnnhyy™z½½¾¾ÒÛÛ½¿¿K>~ão|Žãàóp>ÚA{h7hVÄyyy‘ Ñéé)ÝÞÞR¿ß7’ù²<´ƒöÐ.Ú‡ø‹BG|-êFCþ‡¯¯¯éùùùÃIOÂCûðð ÿ¾50 ‚ZÖö»^¯ë¯È¤I˃?ø…Ç¢oM$D {Âþû"l.r˜ô¸<øWq ž=Ÿ¢Ô„ýöMX%uÈ›8©Ø**.ÄW+[˜-t»ÂvFö.N*ÎçÖ´5Iû%l%‡Œ8*ÞïÁ´4I û!l¡€”8*î÷™kM$677ewPƒ6Ä<œ #?Gþ®—<5:w% î1ßCOzòùô=HõJêã-×Y¤¯ÂöGò–ŒkÞˆœ÷‘·M˜ºšöÏýgâÌ©¼õ ¡äêêª÷‘¬CÞ#fÿÇR#VÔòªfáŠø y#èð´8X‹ít:ÞƒôÉCþÐ!áiqާ¾æ:ùC‡„'Åy||”«ù¡é“ ‡çòòRnw„¤/t€Zl”===¤/t€Rl±â.Z>yÐCn=/--É­Ö2‡ÎƒÐ%Z__×ÝWYÎCçA衊¡V«y¡†dкD(ó@5C™ÿ™„wo5Wô€.ê`PîQ¦ó„ª8кD(B=L™Î^¨â@è¡’ªìªˆ„ª8к`-£tç /TqèÂWÎè+‡ï9&ô=‡{+º·âqŽ =ÎárÁ™çV&ôÜŠgå&ô¬œ×sLèõy%p€¡•@üà5äŒ5dÞ}ÀØ}xß*gß àÏ‚OÞ+ÏÙ+OŒ«,Ì* ®Ï±<¯Å•]ÅâpM E ®&µÄuÈâp»E ~öÁ"?5cˆŸ·*?©g?ãiAÌO#æçÊ‹ó ìˆù]ňù-(vÄüþ+øÍKJ†ßÙ5ŒÜꬽíí/ÿÿ-ÚA¦„lùIEND®B`‚golly-3.3-src/Help/Algorithms/hensel.png0000644000175000017500000004247512750014265015216 00000000000000‰PNG  IHDRQþª^ª. ViCCPICCProfilexœµ—PYÇ_wO¤‘Ì3’£ä8äœL 30 a† "fX*" ² ¢àªY"ŠiPÀ¼ƒ,깕käÀ½ºÛººª»Õ×ý«¯¾þÞë÷úUýÊY–@ KÂO{º0"£¢x€€,ú@“ÅN8ú‚¿Ôd?Zê®ál¯¿®û·’äÄ¥±€QŽå¤±SP>‹ò8[ L®B¹{uºe -D'ˆòöYæÎqÙ,ÇÎñ©o5¡Á®(w@ °XB.än4ÏÈdsÑäq”ù ev‹ƒr Ê))«f¹eØ?õáþSÏØ…ž,wçÞå›n¼4A2kí¹ÿY)ÉócH¡Aá'ûÏî QËÍgžÉ ù8~XÈ<ócýæ9^è¼PŸîò' ç¬Wÿ…>iî }YÞó,Ì›ç´Ì÷ïφF,Ì-Îm!Ïó`Î3/¹0VÒ*Ÿ…9ð,ÀN[3»ïÀu•`­ÇMHg8£_YœƒÉg0LM,ÿçküÿÔìùš£wôoç¢ßüžKmÀ&Mr¿çXêœ{mò{Ný-ºõ»¸ÐÍÎfÎå0³, ¡çVÈe t€!0–À8wà @(ˆ+$€ «A6Ø rA>Ø öƒPŽ‚cà$8 šÁyp\·@7è€ ƒ—`L‚i‚ð¢Ar ¤ éC¦5ä¹C¾P0Å@\ˆe@ÙÐV(*„J  ¨ú:]†n@=ÐhƒÞBŸ`¦ÀÒ°¬/†­agØ…—Ã\8΂sàp1\ Ÿ€›àËð-¸Á/á  d„ލ"†ˆ5⊠ÑH<"D6 yHR‰Ô#­H'r!¯††a` 1v/L†IÅlÀ`J0Ç0M˜Ì]Ì fóKÅ*bõ±¶X&6ËÅ®Ææb‹°ÕØFìUlv;‰Ãáè8mœÎ …KÄ­Ãàápm¸ÜnÇËáõñöø< ŸŽÏÅÄŸÀ_Â÷â‡ñd‚ Á”àAˆ&ð [E„ã„‹„^Âaš(AÔ$ÚˆâZâ.b±•x‡8Lœ&I’´Iö¤PR"i3©˜TOºJzLzG&“ÕÈ6ä 2¼‰\L>E¾N$¤HQô(®”e” ÊNJ ¥ò€òŽJ¥jQ¨ÑÔtêNj-õ õ)õƒMÌHŒ)ÆÛ(V*Ö$Ö+öZœ(®)î,¾Bõvõq  ?l:‡šDMkÍÍššSZÚZZÛ´šµFµeµ™ÚYÚuÚu¨:Ž:©:•:÷tqºÖºIº‡t»õ`= ½½R½;ú°¾¥>Oÿ~ÖÀÆ€oPi0`H1t6Ì4¬34¢ùm1j6z½Xcqôâ=‹;5¶0N6®2~d"eâm²Å¤Õä­©ž)Û´ÔôžÕÌÃl£Y‹Ùs}ó8óÃæ÷-h~Û,Ú-¾XZY -ë-Ǭ4¬b¬Ê¬¬¥­­ ¬¯Û`m\l6Úœ·ùhki›n{Úö;C»$»ãv£K´—Ä-©Z2d¯fϲ¯°90bŽ8ˆUYŽ•ŽÏœÔ8NÕN#κΉÎ'œ_»»]]¦\m]×»¶¹!nžnyn]îRîaî%îO=Ô<¸uãžžë<Û¼°^>^{¼˜JL6³–9îmå½Þ»Ã‡ââSâóÌWÏWèÛêûyûíõ{ì¯éÏ÷oÌ€½OµS •=6 Îî ¡…¬ 92êº+ôQ˜NXFX{¸xø²ðÚð©·ˆÂQäâÈõ‘·¢ä£xQ-Ñøèðèê艥îK÷/^f±,wYÿríåk–ßX!¿"yÅ…•â+Y+ÏÄ`c"bŽÇ|f°*Y±ÌزØq¶+ûû%lj³3gW7o_?ʵçîåŽ%8&%¼â¹òJxo½Ë§’’j’f’#’R)1)çøRü$~Ç*åUkVõô¹QªmêþÔq¡°: J[žÖ’.™Û:?d f:d–f~X¾úÌÉ5ü5·×ê­Ý±v$Ë#ë§u˜uìuíÙªÙ›³×;¯¯ØmˆÝоQ}cÎÆáMž›Žm&mNÚüëã-…[ÞoØÚ𣔳)gèÏêrÅr…¹Ûì¶•oÇlçmïÚa¶ãàŽ¯yœ¼›ùÆùEùŸ Ø74ù±øÇ™ñ;»vYî:¼·›¿»ãžc…’…Y…C{ýö6ícìËÛ÷~ÿÊý7ŠÌ‹Êdû·Ô8¸ûàç’„’¾R—Ò†2ŲeS‡8‡z;®/W*Ï/ÿt„wä~…gES¥VeÑQÜṆ̃ϫ«:²þ©¶Z¾:¿úK ¿Ft,øXG­UmíqÅã»êຌº±ËNtŸt;ÙRoX_Ñ@oÈ?NeœzñsÌÏý§}N·Ÿ±>SVólY#­1¯ jZÛ4ÞœÐ,j‰jé9ç}®½Õ®µñ£_jΫž/½ sa×EÒÅœ‹3—².M´ Ú^]æ^j_ÙþèJä•{A]W}®^¿æqíJ§sç¥ëö×Ïß°½qî¦õÍæ[–·šn[ÜnüÕâׯ.Ë®¦;VwZºmº[{–ô\ìuì½|×íîµ{Ì{·úüûzúÃúï,ÝçÜ}üàÍÃ̇Ó6=Æ>Î{"ñ¤è©âÓÊßtkYŠ. º Þ~òìÑ{èåïi¿ÎyN}^4¢2R;j:z~Ìc¬ûÅÒÃ//§_åþMòoe¯u^ŸýÃéÛã‘ãÃo„ofÞ¼“{WóÞü}ûDàÄÓÉ”É驼rŽ}´þØù)âÓÈôêÏøÏÅ_t¿´~õùúx&efFÀ²¾Y 8>€·5P£Pï€úS’Øœÿý&hγ#ðW<ç‘¿ 5Y5N„mÀõ(‡ÑÐD™‚Þgm`¨€ÍÌâJ‹73ëE¢ÖäÃÌÌ;%ð­|ÎÌLš™ù‚ú{äm©s¾{V8ôoä~–nh+ÿ‹ú;fÝ䯨)Ìõ pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡ú:`IDATxœì=o£JÇù@ßO@ÿˆÚ5ÒS¹»¢s‘D4{‘m‰Ý\![¢²-Y¯HlYÖjÙëиqAÃSPPÐPPø9ƒ7 ‰bÃ9šHÑ 3?ÍÀ^1‡ù ­IÆÀß ­vrr²ÕüI}­â "qŽ{Òügu¥ô‹K/0¡~t Ôü»V™æŸ!-x~ ʧ.v‘Ûl ¨vÁ±b× ¡Å³Ì,bG®@ó‰Å¡·Ô’=‹¶á–гeB‘ ÇuFÉâE¦Ú)ü¨¸£ÓÑæBÍ¿c•kÞ•XV¥\]ï[Ç#qeïr0seàûKfÁ’ãùTKì=ÎØ€ÅDgN•‡çÀbŒS6³‰`« ŽjÓ·híB˜ØKíö+jþ=«Vó¡*pÊvÈ#š)é>·Ï†™)åpA‡‹–"˰ì‹Ífª~mŸÚ-ARùšgåÍm m¹"Í,úƒ]Ôü;¶ÙÃsè7g ži0/õåÒq[}Eq?iq¡kÖf%({ìQåZ“´*æö¾mèÛ3²»F;o¢®o>ž}øÛTG­ÅÓƒ‰½ Ø5DÍ¿e¾­‹¸Ã]_ÏîïO³³Ü_ÿn¾äà ’òÒO¯wXJÔ÷šæcG'~v9þÚÏ—&ƒÄتÈrÏ2lKñˆdc[kCŒyÉ&Ÿú,M8¡#*ÿùo›‡üB+qŒÊ¶~š"SnqÆHú2•EAÿÈÄ·š»¦7ª˜yÂ@”ó˜öûÿ쳇‡¸ÃÁ£¼Xœç¨âÏŒ{YU(}HÊ[xŸï(šáò5ïŽÚp¤y¸&nÃA{šWsè ¶~ùT·_2qË8ö —mÄ%«„›Ëˆ+^g›Ç›VÞî·Eĵ+cÀèÙ½uÙÙüƒ[?GæØŽ½Åµ:ª¢È²¬(ªí¿Ì²å>ù¥²CxL÷¸ú‰°b\¾æ“!šéX9s‰_ï³ÁÈPz|?tÝÿõnFþ­;göAóœ½ÅÃÿЛ’Ÿ4ÏA¦Ç©Dìºþ‹,‰%} jq5aŸü¹ýƒOÑö£peȺó˜'ÍÛí´¹L.“tÛ÷WJâA=q{ÊmÜf–´õÎ; óÑÆMhì$ã<Éé¬LJžw U­UzZ‹m›Þ‹,‰YííB€ÖaÛ qˆ«ß¦ZŸWöðbO¹‡{!Î_øcöAÊ’µñ†ûtY{´¨#ƒ8WæeEbÞX…P”Ö&ÓVè8Al)-†l j¶¥%9“LV™[ê<•%)v%$ëü5½½z¼dÙ³·Ïê*ÆÕ÷$²‚Ó¬4îÖÈf?^Ü[guaàûAŽËðd¡.=ºÀÎz6Žßu=Ê“µ˜ø~% «ÉÊO{Ï^{LÇãqöÓ,眊qõ~ã¨ü·VRµƒ+³Ù¡Ì#Å|Ï5$NÔ ¬® ˜£‰¬¨çô=»ÕŽƒÁ ×+áÝÛŠqõ~³¸ü·Sw©” %#®øûö¡ç•¼{ë¹Þ>ªm'Ü`N›ß÷76ãêý ¢ò…²Kí L(ùqÅ5,v"DÍ?Ç¡æ?‡š¯D„¨ùç8Ôü§âPó•ˆ5ÿ‡šÿT\s5Ÿ{¤< ºÝ¾Y1®Þ_ø,ÿ+‘»ÔÊ„’×PÍ¿öEáñxl%|ëºb\½¿ä]þ× w©”IÒ×PÍ¿á9 ,Ÿãêí±£d¯;ÖJ>FÜÿÿÿì=›HÇùD|†ãðhÚÍî"KW¸ZÑ$È^‰D'Ë+Q¹ —µQr$:¹ˆs7n¬ \AA±÷`{ý² ¶˜ÙYæyšµg~‹í?3ÌÛ_RÍ#qÒâPóˆCœ\8Ô<â'58ÄÉ…;hþMsƒó"q"ã”í+ ⤞ojp¾@Ä!NpÜAó/uãaœ/qˆ‡šGâ䡿‡8¹p¨yÄ!N.œ¤š§ž³ý™Õ|{Ä•ÁqžÞß,œ¤š§^›õ̓¬ò+ÏW#Žó2¾Æá$Õüß´k°ö «ü sÄÕˆã¼\¿q8y5Cµ×ÊÃ-dåËßTÛ'qepœ·åi5ßDU4×8rơ曨Šfã'BÎ8Ô|UÑl\ãDÈWAóI‘ÓÔ¡ÄzMa`uù|¥¢ègJç…òЇ¬|ùŠ>6ˆ+ƒãl›Ó8\IÍÇ‹¦uÎxFF¥*tN²SÛ4íÕ¿qM/°È@n2)tƒ¬*~u´kœq•/'ÇÙ×6 ê÷«ƒsŽk•Ñ|Ř_ª•ýÌ=šNÃ#C1Ýåår4Qô3%ÅŽ'…îŸUÚ¹µ„•*g\æmš+'¹ÖJ•#޳ .-Ž©/m-¸³šO“„P“']1Üð¸ØóR›fúÂÖN4Ÿ&ÏýkóÇFîÞܾ® RÄ2ÚÅùîhqâ˜Eš}Ë„¶9DË™ËrSÉ«þÎ’6bš–ÉwÜÅ6iæ´Õ0MÚöšµÓüÜm«šIz«ÓíZÓÌu’pìããÚRsttC©TÝNÐXÊîùßÍííœ^àÓx¸!|‘?î²zï¥qY¤ï›+¦äN¡öާ qsUäùc·çŸYˆ¾FÃ[~7¨ùq¨ùŠ8¢æc[Û^—nêÙã¨kmnëŠjoÜàcrÍ®cÛ–eÙ¶3[ý)š=ß–õnÛö›¦2Xfu;TãÝYL:6}:¿¦¨VÎö"ünPó5âPóqDͯ·šï«Ç\„4Ý­æ5Ewö]niþ úJÛß¾Ÿ[ûçùÄkÃùôn·¥·œ›|þØksOAÍ£æEùî$ÑüãÔÚÔïj{±ŽáQÜtæû¬daï»Ù¦]¸7¨N°Œãh`ªm?Ê«¨îî «ìÆÑ­ÓLÑUs‚E†ûn¼ü±Ûô M7Âw1DèÂ>¼q؇WWЇ—F¶©î.࣓¼UgßH–]}WÊt6BMBËØ¼W5MUT½åÎWéÂ8þ´4+"›ÅÒ8z¶¯%¨Æê.Œ÷°<{q\3ÆêÆãñ—O$ܧOccu…8–cuµàÎÕÅëq"]2‡ª¾óÔîOãõúÙ º$>IˆüŽÖöâ]ÉÕÀ4žºýŸ›utNýVª99¾_<¯Ã¯’Ìdâ'/ƒDÈzísr&Añ§ þ99gpã¿êŸ“ç¬ Wr^èu´–{ÝSwîŠaMË0\nW7lB?<ÉZjË©þ+‚jºèp8ì÷I3û}¢C{ÅÙ©ÍÆqž{ûa:|øNÂ}ï 9´Wœ ûzqåçÛÇQ¸¾® ž®æVËÐ tÓr§EªŽÂ¨Î6ýSPuÌ@] Mè|:$Þ1èj6Žó¨Ü MKRÅ-dÕ¾èåõâÊkþµ„Ȫh65/&5/‘QóbŠ35/‘QóbŠ3N^Í]‡Ãa¯GÚi°×#örUãm6Žó˜ï§ÃŸ3nÖ{Oê媸)åëÅIªù¢í™ïïï=´£°çAV>½ânÐÍÆqÞëúÏà>ÙÎã¾zUûæÓ¯'©æÏØ0:°q}h6޳§Åç/$ÜV&¯'©æ‡8iq¨yÄ!N.jqˆ“ ‡šGâäÂ4ÿ¦¹Áù‡8‘qÊö† qRÏ758_ â'8î ù—ºñ°Îˆ8Ä ŽCÍ#qráPóˆCœ\8Ô<â'5Ïwf5« ð‚ã*ÎH§šÞ_}[WÌs§šÚ¦iÏ® „š/ò<ó¿’íñªÈqÇ-Ö&?.2ÿûZÁ@ŽÞ¯’__»¸PÏ's+Ó¼n 0FŠbdŽÔÉL»Ró ú Xži;¬}•tª…kOŸœñF†bºËç%Άš/ð6-²ÁeäÜÊwÞJµÐu·¬Q,µ n5_ZÎ8vq©mŸ9Ïf•r–“®n¸yy^óiòLãéIf|œ½9Õ,ó«OöÉiäTþ‘ ·¢9M_Íñ2ò0猣µL¯hßl»Øãþÿÿ쿎«HÆy¢zž€ &&u6"#º"CÝ-1«ê+9YfºÛšÛhtå`õ8! aï)ÀÆnÀÓÔ–íó%ã[Tù+<ý£þRç$ó’•$þB !Ú²i]ËFžÔñ¤w ¦«”U}¾MCËYË'Ç2¤Œ†ž³‰dÔ¡ægADY&‚¤jºn@)ø*(¥jªP—Ðs‡vø"Jö¦â>…ˆ²Œ.¸Õ ?ך‚Ž.mfÛšOÐKì+~|ȳ“yÈáÒ¡€¤ëª¤ZuÜù¼O2/!ó\ÙÝ6„÷Â|X´š²“&«rL.ì†ÓåÕÙL¤4»~^¬èòžä%ubÙÎÓž„Vës…%îÖêŠH#¢åm¢(j¦ñrzôÞ¾Njæ3úøpã4ÚDU.o±ëö¼ÕQ?ÐÅâaR çð®×n>f¾ž9£i_-Õà{Ó ª™kÀw;šLó-œ°zLÔ^ì™J™hûž]>2äU\¬m~&ŠçÛb#þ¢o[KIn9ÃE™e±Ü”Ö!t¢áÃy.˜§‹g®ûÔÒŒku]v¯o=ËKÓ×êF­fýþÔ¤]=¨óÐÅ3ÆKƒýv·³VwV9íükÉ¥öñJn¶-²4ÍòÄVäÕ‰ÎúÁÒ}~ÍëÏÚ!N˜yyùÞÒj5Ï&™;øÎ¾m$¯¯“ìFïZy[µ«uæq PÝëûmíÉ¢ÈÕDÕ>®>P|A6Ö›0ŠBÏÑ%Ùòøl•¨Î í?âù¾ý›ÏÏÏ3l†»]ôã.]ã­¾=vÿZ?üçvöÞUGéˆ^v£" UA’b8ÃvñAï Š/pã„ùÎI5hÜ OÛNŸúÒËØ×B>žàÒÕØ1~¥§Çšzèáw1ïØÜ’yd™ß"óŒíyd™g'd™Gæ·ÈZ»Çîwï…®ÛãY׊æOÄE˜+ÈĨ0 ^›ã=vþÀ˜\ŠæÑíø±CæÑíîË™G;´»/;díÐî¾ìæ¹]1¾A´C;ží„ê …ºµó·*Æ7ˆvhǹ]ÃüÿëÁ3·ß Ú¡çvÈ<Ú¡Ý}Ù!óh‡v÷e‡Ì£ÚÝ—2ÏÂnôžíÙv¤sa7mGú%//\Ý|Bæ™Ú~7kž7Ïx±›öæÙè—'¾WÇÖn>!óLíF¿ƒ=Ïæ¼ØM{ÃüçØÃ&¾?ÏÖn>!óLíFŸµ2ÏI2¼ØM;IæçØC‡&ž“ÃÖn>!óLíx‡™çÆn>!óLíx‡™çÆn>!óLíx‡™çÆn>}óy–ŸË‘¦u–"K“ô\ö ê« 'Ì‹…2O¤^ì¦Ezù96(ÐÄ86líæÓ0ŸmlQÔND‹Œ=ƒM Y_‡Dyj¸Ö¦¢˜~;æß¼¿üõÒŽaöæ1èv*ÄÚ4»±w5iWê<(€ÜØà¯4€Ü»Îh|ð‹½¾}½Ý|šÊ|/AÎ5Û+7ºæ0 ×^_RÙ“Ú8æz4o) Š~ÊÀóïïî¿Ýv¬RøûøñëÈ­_nwÁÝÑ0¸­êA§DÝ=ä÷R»ÓQw¿Ün> b¾Èó&"ì‘r[d'Úÿ›vÛ³ãœeW{cŠ{æ?©£H‘g­”.û&µˆ]A›xw±#Ò§'Ì÷­ñö„¿®écïnb¸{Ævc̉vóéóÙÆP$Q’DèœËÚ:9¨läI=:u‰Hª*5!â·¾¥B1E‘ -O™Ï¢µ©)D2Óþ"D”%"Å,#Qæ+CE‡^shßÖ%Z¥ M/.C¨Rî(à Q²7÷©!Ê2:¬-'ÌwÎAW¶ mŸž~›Çþ¶>>¾uü™þý6³_m7öî P“®i…o™gi7öÇœh7ŸÎ0˜”,;¦-5%l7&¯”®5A0*ä3:L—i—=€:$&\]”øÌ$5óÛ"u5Ú̺ŠÄ®*H}®¤ØY›õaÀÔÙþŠÎ¶K{ KEÐ,£- ,è\»ñ¶¡G‰-¹XU9ƒ.æÛEèmÿúAEÿ…§€dígãŠ(JJ¼ÃO·g˜—yd™oë4óe3 iw8*|Ëô »œÓ=UFô¸È=`ÓÃ,/SˆCØ "ìÊî™oYÔOsü$ MY4ýt­Ó™Ë ³,¶²XÁ"(Ûyê £b”¡Œ>Ü86QU7oѬ~ºÕÙ~Ì#áÞÙ»Ã9¼vóéÜx¾ESÚ•úƒî.³%0d×¼d[.ÂW5>u™ç‘Q"¢oIušsÏ|G‘ml©be´X–Í;ç«ÿ_*eØ3Zfaûž]f•Wq]…E]ªš årðßy«óýšgíÆ./A"\š´V7fyi¢Ý…‹g­êA‡®Õ1\¼`áóZ×êò,ËÊ5±[%ªÓÞçÇó£÷o>>vÆŸºö¶íoõek7Ÿ¾f¿}GiÿÞÛ ÏT !ÒÂN.ð¬8Š;ë óãÞÓxzú>Ã¤ÚØ1~¥‡­Ý|úæ¯BÈü­Ù!ó ™gjwã"óÈ!óLí.‰‹01ÈÄmÛ1¡ÁÐn>!óh‡vwj‡Ì£ÚÝ—2vhw_vÈ<Ú¡Ý}Ù5Ìÿr»b|ƒh‡v<Û Õ' u:jçoUŒoíÐŽs»ÿÿÿì¿nK‡óD¼Ã>Á¾õ­ÝÞ.r—ÊJ“¬l$œD´n ,F1²ÒÄÁnhRÜ&Í-R¸qAÁ=kG× ;ãõÎì9œÙù¹@ÄÇ,|,ìüù=9¿«îî pÀ)ÇÁyà€‹ ç..œ¸¸pp^÷ÌŒô‹ Ӝ틖ÌH·Î·÷Äé˜ÞÏÑ;¾‚ó¢8Ûʳñ8Ø ¶´6k1¢¦ÐWžå‹|tfZWw6¢&wœŽe|L½ã+8/Š»²¬0?>ÜܘÖ`ßRSè+Ì߇ïLëçßR“;NÇr}¦ÞñœÅ]Yv’ùøq¸\šöZYö¨©|ÿƒ v’^{™iŸœ¬GMî8Ûò0õޝà¼(ÎÃy8/WpÎÃù œÆÁy8¯ßùõÏÕí+ƒ£(%Γ^>|,—¦,”å5•ïVÒËàzpôÞ”cóþˆšÜq:bs˜zÇWÎßqt¯¶B- ÎÛÝÎÏ­™gÔä W?ÑšÊ÷§ñIt£Çœóê¦Î=@®fŸ<ždïøªÂùõÏQ‡œïž´àD¯Äycr+½mÙ¦Ôä[+¹u2¡¦òýéA^ƒkOnµæÒúÅÖIÝõŒÁî_Uÿž_ßýjðÎÛ†”™òç…q ííÆñÕóÎߟîw“4MM1¯Á•ç—è«`qf(KØë}b–aÂÑ[y¹<0Xq=,¾D”­ÈzÔdºŠqðB [Œã«ªßóßÞ¯y’á÷|#88®„Ñ8ÿx /ÉpžoçÕ0:çqžoçÕ0çïWýâ5Oû8Ï7‚Ã5¼?¬ê¢Z4×ðö’‡½s² þâ½çw0VgÂåÓé|b^¢R“3NÕà™ñ`ú F2VךRâ¼èœ n6›å¦i$ôOjòÁi˜$3[&5¹OŠdNN›JƒóÒso…g§ê˜ ÛŽ™Å|çEqÒkl„W¡èXôÒŽD|çEqp¾Iœw*8/ŠƒóMâà¼SÁyQœoç ΋â¤÷ÀÞ%RǦ”íØá“¯à¼(Nz¯káÝ ul>ÝŽ¼ù ΋âvi!œú #d¢‰|ç.Rœ¸¸pp8àâÂÁyà€‹ ÷äüëö–pN3îÕã- Cýqžok w8à”ãžœßÕw w8à”ãà1ËØptv¢/¥¦_Â/t^²wô”è‰$¼§Ù]ã<&_Uœçïo³‡ÃÒ9]ýsúwB·Þ|ý%óÌ/8_‰ƒó âBuþîÑù´¿ÞlVY—n¾ýçÝqp~‡Âù-ܳÎ'ý”¿…óÞ88¿C áüÎòÝ~Õ/ŽJš=çoCýA¯Äy\Ãkªw¸†çVU×ðö’‡Ã’ôOOþê<ÞÜÿ±–yn —ç‹Ñ¬Ñ¨<\T1Vç:šU÷{x©4µXxÕ1Dƒg—£ò`˜uðÌh°Îï`òÆçEqôÞÊó¼<-d6³ÏɹôšµR 7=/f­”§ŒÇ,S€üg¿äåI/Ó9Ï ú8êŸóÁä«ÿqÿÿÿì1Nã@†s"îä‚6ÚŽjE%‘XEF¢¢rä$be¶ ah¶¡ ¡Ù‚‚†‚"k“•0ëŒÉdòöÌ÷KHhˆøl>lìyóp^gZ¿EÑ` °Ö§¼ÔW'µÔ×ç¶ÔW.8¯Š3=åÊ.nÙ=myܵèŧ\Ò#ƒ“*é±Å¹•ôÈçUq8ó8¯œÇyœ_à¼2çqçõRçW¾ÁŽ¢¨ßؔҧ¼å¦ NjËM[œÛ–›rÁyUœi¿ä$IâX`ói[œòÖÚ28©­µmqn[kËçUq}¤šLØâ”[hÈà¤ZhXáÜZhÈçÁ ‡óàÀ……ÃypàÂÂá<8paáÞœß÷7Ê'\q­åw„òî:ïk”O¸šãÞœÿ¬?<ÒQ>ApàjŽÃypàÂÂá<8paáp¸°p8ï!n“ð2+Ò•« ..¹^‡ó⬠ÝËø”q†ªÁñ8ym&Ù¼B7eÎ{ˆ³.hw,×WÆv8:ŠnnYЮŒÃyqÖ×8nË£Œ3ìtrr:Ÿ7rãeÎ{ˆÃyœ¯Àἇ8œÇù Î{ˆÃyœ¯Àἇ8ëÆ2Žms”q†.=ÇÇÑ|ÞÈÆ2Ê8œ÷·I9—öx–¸É$o Wî7N×íÆ7'å†pÙI4´œ2ç=ÄmØ(Ö¥ ® î_çÖR§×Ÿ—kunÍÅæïáÿoüÚÜF±Ê8œ÷gzƒíG»{ÿÂ+ãV:ÿ|Þí´;ì«7»M{{;;³»g#Ûz™Èâ é)Wv__fË·ß]ËXâ²kov˽êï¯k:Ÿ}r…ó¿Nó«ú¶qr©•ó‹ÅŸY;Ÿµöìqñr{Øþ’®ü-H YÄyœ¯ÀïíÓƒÜúÝ^<ÚÛ=xÑ9,‰2‘ÅAœÇù œùÿù‡óåÔuFM½­M YÄyœ¯ÀU<Ã{>ÛÍgîðêQ瘄ÈDy†·Eœ\jèüâé¶×jíÝë‘X™Èâ`þò,އ¥L¦Æ·YÙÊŸÏ~‰à»ºM_žåïê.ãò«¾å»º­¿”K½œ¿KÏF³û§ßßv®uH.Ldq0“0I’ÓR¦S㪕ìGåÏg¿d-çm×äLsÜÆ‹d2Ü8MÊKz¦él"°H.µrþñ ¿5k·w:³fß×ç d"‹ƒÊ«S­×Þ+ûÏKáÜ–úÊ¥VÎ/îÓQ·Û]=èh™Èâ rŠuÍpxêòÈP·¤G.õrÞ§2‘ÅAœÇù Î{ˆÃyœ¯Àἇ8œÇù Î{ˆSÞ%ÒzÌ~å3<)œÛ–›rÁy©2‘ÅAåÝ ­÷ºŽã$QĹm­-œ—J YTîú°IO eœC ¹à¼T™HpàÖÄá<8paáp¸°p8\X¸7ç÷ýò ‚Wg\kù!$„¼»Îû宿¸7ç?ët”O¸šãp¸°p8\X8œ.,Î{ˆ«X‘~ñCu½½ÎPMÀzûup8ï!ÎTy6N“|ÇX­º:)œ¡j0I’8¦®îcÎ{ˆ3U˜]E7×zõóR8ÃîQõûÔÏŒû ÿÿì1oÚ@ÇùD|>¿@fæ¬l›§ˆ KNZUXêÔ¥Kt`€ŠfÉ’¥K† YÒç¤jl_@ðöÝÿ)RÑ#ÊïèË/˜»ó=8o ®è$™ÏÓ`1“;'‡ Wp Pž‡sr>ÆÁyqpÎkppÞ@œ‡óœ7çá¼ç Äuz¹žö3¹>6\¸‚.=ý~¿×C›qpÞ@\Q¹Ñ„«_]n¹x̃ƒ(ÛîŽ~fœ¯ÎÃy .ßùå÷ó´gþêeýý×öÃaoÃyÌámâ æðÖüf]­œ¯.]« ÃìbXÇãaÎj%é©ìÚ^øƒeñì¸=—ÓµºÌðhÌX«ÛŽç§Çç——û¯ÍWçŸeFvô°¤j’̉¢(»é%I’-»k…’Ém’ÝÃýÜi×ʾ›dÅí¿ˆ€ÙáјwùÃetþ5_?Î×ÚáRfdGK ©&…w§Jãd·úòEI_†ÝóVÛuÛ­V÷a%3¶#‡%…T“Âw¡Hãdoéá‹’:o@XRH5 çá¼ç ÄÁy8¯ÁÁyqpÎkppÞ@œð)‘Ò8Ù#7ùÎs…%…T“§AKãdÖæ 8Ï–RM w}8N°…_Ày®°¤À·#Μ]88pváàIF'{,_Ày®°¤jÎÃy Έƒóp^ƒƒóâà<œ×àŠ_=ÞÍï«Ú°J K ©&…;½HãdÛæðEÙœ_'­´Gå™/3 ¾°¤jr|3Ž~FÙ†p£ KG7iœl{<¾(›óÿÚλ“G™ñ…%…T“i_Úa¶ñ+©v3<~çVaœp\¾(ó/i_Újv¨Û K ©&‹V°‹úÏØ¡]'Üîž/Êåüj6Žã4ÚßdÄ–RMÍrÑ….½ïåHØõè’;ïƒ÷ÅŽÎKâè{è;sœÿ¤Yç=F’ÞŽS†|Q.ç)îºý¿4:s™ñ…%…T“pÎkpçÓÏóœ¯ ÎÃy Έƒóp^ƒƒóâ0‡·á<æð6q8ÏóUÄ¥‹gaèe"Šãñ0g5ëkuy¸x”.ž±¬Õ݆‹™·õõ¶V—ƒc¬Õi_%îY³›Lý&9ß ÿÈ ˆ/,)¤š¤_å(Š‚L$IBÚgw­œ£ÑA›drqô3™¶ &Ñçi°õ q£ öäèœöµZ½å·éŸÚ·åZf@|aI!ÕäÞ»S{½~ÞÕï›a¯¯û‹E ¶úÎzôöÞê®íWË©ï¶ÝŽ?}x’ kXRH5¹÷](ž0ËU„£·nºbÏs^ö–ž™GOá›öá™–RMÂy8¯ÁÁyqpÎkppÞ@œ‡óœ7·÷)‘——¹sxJyuÕÿý»GnÎ/¯òæðp&œ7·÷iÐaHOýðéÁ z½éõÔGk߆ôκþû ÿÿì¿Râ@Çy¢{ž€°¾ÚÖα³rl<2srW„Ö†H†?GaˆÖ÷WX\Caám¤M6övv?¿±`ô³™õc0ûç‹óâI}Ð21V BcD¦Å΃ççÁs ‡óàÀ¹…ÃypàÜÂmœ?·· _ 8pUÆÕÖ¯(Šr¡>Üçm-Ã\ÅqçËúã» _ 8pÇá<8pnáp8·p8œ[8œ·WxFºá ð긢« ˜oóvã ¯<3¼ÐMWtÕ`/§¬«Ãy«q…W˜^Юˆ+º;ÀMËdý<Î[+¼“ŒákqEwjzÝûäà¼Õ8œÇùÎ[ˆÃyœÏÁá¼…8œÇùÎ[ˆ+œôb8XFW4¥ç[Û_cƒóVãÆ£q8 Ó mñDžèÒsa¨+@N)¯n<ïL»¸„(ÎJã‹’¼ºtóD›É«³³éÈíƒIPl/H'±ŠßþQ?;(VØ’– ‚½’[ ŪçÒ&Ûé~þö5Nšº›jžhó>8}U]ç_WÇSéHGn”`ËáÚ‹ÂΟWÄé«J9¿º»8©7¯×g Ñ÷gw¿Í4KG9Ò‘ÛeO¹ÄÝä¾—vÞó~*äØs–Ë« Ý䮞–°é‰SYÿç_íé¼Iœ¾ª”óoo_Þ{ýôú²^«5šÏfš¥£éÈíƒ8ó98‰ó«ù‰èózs%^¿òÙþÈp8ó9¸\çÍ¿fš£³éÈíƒ8ó98‰ó/“úû}çÇ3¼ÿˆÓW•r~uwºþw¾Ö¸VfZ¤­éÈíƒÉX]¤ÇÞ¢X:x¦:VwÀà™ÊX|h±º8Æç-Ä QÃ0Lϱ‰c=srŠN’‰Üásr$S€âÉ Š˜“³‡óâd³S;¹¬ÀdØv;3î^qª¯¿ðÛߘ{»‡óâdÏðĽT|„ÎrÞì¢Ïë*<2”-éé.º^“56»q8o!çq>‡óâpçsp8o!çq>‡óâdãó··þÓS6¥lµ2Ÿá)n¹é?ú­öÀÜÃy q²Ý ïïÃ÷ô²7Ÿqêpœdkíp=öºÞÃy q9©Ãa5B&ôDhi±çÁs ‡óàÀ¹…ÃypàÜÂá<8pná6ΟÛ[†/¸*ãjëWE¹Pîó¶–á ®â¸óeýáÑ]†/¸Šãp8·p8œ[8œÎ-΃SÅåL€޲¦÷˜_&çÁ©âd Ýî'a²Amz߯@œb¡Îë*G:²DœlAûíƒÿ4ÏZ®?o‰S,hÇy]åHG–ˆ“m\óã¡»œemË3óÄ)6®Áy]åHG–ˆÃùãÂá<8UÎçÁ©âpþ¸p8N' –é<øËYVlάÝÉz†çl°Œa\Žó/“`~ì•oÎtd‰¸ñhNÃî¢ûé+žÈãñ&ƒôûÅq3@Î0Nêüó÷F­vùb¦9:Ë‘Ž,—Äàö¯é}úŠ¢hÔÏŠÁí÷Å©ôûÅÙ'£ÒðÕÙ‡ûÿÿì¿n£J‡óDy?_ µë´éVé\ËÍ^ËFÊ?E ¹Š„‚&6EÖ*ÉâmÒ¤H³Í.ܸp‘=Ø‘¢Ë ¾º30žßÑèèËŒg‡ïüêý&ý2x½‹~¸ÿÄI.w/ùéöÇu~qVûLÃaýôUqï5Id‰¸¼:6W¶–g7Í+:6’Ÿnÿpü~~>í¤I¨uþȹ"C“D–ˆƒójáøÎ/~u7cû…œÛ)24Id‰88¯Î'Šƒójá¶;ß nºƒ_j‹¯I"KÄaO-\ÎZÝêõx“‡Zç÷JÎ-š$²D\ºVçº&þÈŸ ykuÃ;:ÄžOÁZÜ–wrV‹ùBqßÓÐ$‘%âHTÏól&F£üwrF{>]ÎKÀáÝ[àDq4 7 ƒ«_\XIÂ{÷6éÓ!ö|ºÆöpp8Q\ÞÞå¥$¼ÿ±IL:„9<8_Th’Èqp^-œNçÕÂÁyàDqp^-œN—·>~nÍf¼o`Îztˆ=ëórpp8Q\EŽã´™½8æ}ë:vé{>]„.Uµ§Û?œN—Ö´ˆ¢G&Â0y5-Æt$dϧ‹ ¦…œ8½pp8àôÂÁyà€Ó çN/Ü—óßö7$? pÀUw°ÙB :Ä¿úù} ÉpÇ}9_Öž¢Cò\Åqp8àôÂÁyà€Ó çN/œN—¾o?Žï3-œ„ã Þ·¯Î'Š#áØi'íLF^ü€ÿ««Î'Š£.½5k±õäϧÖìÿ?_9œNGÎS¯Î:9µ“'|'§r88œ(Ϋ…ƒóÀ‰âà¼Z88œ(Ϋ…ƒóÀ‰âÈy#1Xç/¦Vò„:6•ÃÁyàDqá$ôbÏ~±3måÖ«óý€ºúLQ¯NÎ'ŠKëÒÞºf×Ì42{rǯKKÚÓ?ÓâØLà|á88œ(îÿÖŸïýøiñÖí[÷÷ÛŽã:¿×kuŠ“›àº±Þ:î nº'‡‡GîûRÎ-î*4Id‰¸¼:6W¶ý`šç»&ðy¿óÛp^ŽßÏ/ß®×Y;ùóñá6Ö[Á|ùܬwžåÜßC“D–ˆƒójáòÆö‹³zš¶¦œ¬ówØhž5¢¹œÛÛeh’Èqp^-\îïùyÔÜdîx4k›-WÎÍí64Id‰88¯nËÞûº‡o¼}|¼žÑÖõ›b¿ä7¡I"KÄaO-ܶyû×nýàtJ«÷ ó×§¡I"KÄ¥ku®k2áù~xwG]}¦}®Õ=™™?`­NnëZÝj¹\}n-+9w¶óÐ$‘%âÈyÏól&‚ íi„Ÿi¾ï¢àrjgÚ0òB8_<ëóÀ‰âhlo;¶·,«ßï³ûûÿô­‹}W×HŒGŒí‹ÇÁyàDqysxÔÕÓŸÝovMûÅfo'm8/çÅÁyµpp8QœW çÅÁyµpp8Q\Þú¼eY½^ÝßûÞ³~ræðZ³œ—€ƒóÀ‰â¢(r‡ývµçy®ë²ûÝ[׋=öÛØNìDc|ëºpœN—Ö´ˆ"¶FEòkW¤{'![ƒ„GM 88pzáàûþ¡Ú¼è¼ëò]èû,ç‹÷7ƒÇ§-ûpÌ…UlõU%aH"kÄÁùfáäÎ??í÷O?nŽ™x{ûKÏ1U†$²Fœoîìó|Øk¯ñƒÝþy³Ùé9¬*ÂDÖˆƒóÍÂÉß®Ç,tæ¿÷›Ûn«Çä?Ó„0$‘5âЇ×,œÔùÝ'ë% –Õ៛ü@oH"kÄÆêÂP{‹“8‹dcu³YÇâØ^x‡±:8ŒÕ§Šã¢BÄ96Ir~N›‹sxHNhç+ÇÁyàTqü†Üqñ^}2™–¥lîír4)$õçÒAýy 88œ*î\žçùe){Çféz…/:ß/ûp^Î§ŠƒóÍÂÁyàTqp¾Y88œ*Î7 çSÅŸ§ëµl ÌÕp,ëó×6œ×€ƒóÀ©âcAˆkWGÉsÙZ׋0bD\;È–b­ëÊqp8UÜ¡¦cb JišÊjZd”fT¬Á…GM 88pfáàAà€»d\ëï7aB¼8ÿ@ÿÿSÆë½£©°BIEND®B`‚golly-3.3-src/Help/Algorithms/Larger_than_Life.html0000644000175000017500000002641713543255652017313 00000000000000 Golly Help: Larger than Life

Larger than Life (LtL) is a family of cellular automata rules that generalize John Conway's Game of Life to large neighborhoods and general birth and survival thresholds. The LtL rule notation used by Golly is identical to the one created by Mirek Wojtowicz for MCell:

Rr,Cc,Mm,Ssmin..smax,Bbmin..bmax,Nn

Rr - specifies the neighborhood range (r is from 1 to 500).
Cc - specifies the number of states (c is from 0 to 256).
Mm - specifies if the middle cell is included in the neighborhood count (m is 0 or 1).
Ssmin..smax - specifies the count limits for a state 1 cell to survive.
Bbmin..bmax - specifies the count limits for a dead cell to become a birth.
Nn - specifies the extended neighborhood type (n is M for Moore, N for von Neumann, and C is for circular).

These diagrams show the NM, NN and NC neighborhoods for r = 3 (the NC diagram also shows the circle used to determine which cells are within the circular neighborhood):

       

The S and B limits must be from 0 to the neighborhood size: (2r+1)^2 when n = M, or 2r(r+1)+1 when n = N, or approximately 3.14(r+0.5)^2 when n = C. The set of points in a circular neighborhood is those whose Euclidean distance from the center point is less than r+0.5. A quick way to see the circular neighborhood for a given r and n is to use a rule with only B1 set. For example, switch to R6,C0,M0,S1..1,B1..1,NC, turn on a single cell and hit the space bar.

If the number of states (specified after C) is greater than 2 then states 1 and above don't die immediately but gradually decay. Note that state values above 1 are not included in the neighborhood counts and thus play no part in deciding the survival of a state 1 cell, nor the birth of an empty cell. C0 and C1 are equivalent to C2.

 
Examples

The Patterns/Larger-than-Life folder contains a number of example patterns (mostly from the MCell collection). The following table shows a number of example rules along with their commonly used names:

R1,C0,M0,S2..3,B3..3,NM [Life] - the default rule for this algorithm.
R5,C0,M1,S34..58,B34..45,NM [Bosco's Rule] - (aka Bugs) a chaotic rule by Kellie Evans.
R10,C0,M1,S123..212,B123..170,NM [Bugsmovie] - a chaotic rule by David Griffeath.
R8,C0,M0,S163..223,B74..252,NM [Globe] - an expanding rule by Mirek Wojtowicz.
R1,C0,M1,S1..1,B1..1,NN [Gnarl] - an exploding rule by Kellie Evans.
R4,C0,M1,S41..81,B41..81,NM [Majority] - a stable rule by David Griffeath.
R7,C0,M1,S113..225,B113..225,NM [Majorly] - an expanding rule by David Griffeath.
R10,C255,M1,S2..3,B3..3,NM [ModernArt] - a chaotic rule by Charles A. Rockafellor.
R7,C0,M1,S100..200,B75..170,NM [Waffle] - an expanding rule by Kellie Evans.

 
Alternative rule notation

Golly also allows rules to be entered using the notation defined by Kellie Evans in her thesis [2]. The range, birth limits and survival limits are specified by five integers separated by commas:

r,bmin,bmax,smin,smax

This notation assumes an extended Moore neighborhood in which a live middle cell is included in the neighborhood count (ie. totalistic). For example, Life can be entered as 1,3,3,3,4.

Note that Golly's canonical version of a Larger than Life rule always uses the MCell syntax.

 
Grid topology and size limits

The Larger than Life algorithm supports both bounded and unbounded universes, but with certain restrictions. As in Golly's other algorithms, a bounded universe is specified by appending a suitable suffix to the rule, but the topology can only be a simple torus or a plane. For example, R5,C0,M1,S34..58,B34..45,NM:T500,40 creates a 500 by 40 torus using Bosco's Rule, and 1,3,3,3,4:P300,200 creates a 300 by 200 plane using Life. The maximum grid size is 100 million cells. The minimum width or height is twice the supplied range. Values less than that (including zero) are automatically increased to the minimum value.

If a given rule has no suffix then the universe is unbounded. Well, almost. Golly maintains an internal grid that is automatically resized as a pattern expands or shrinks. The size of this grid is limited to 100 million cells, and the cell coordinates of the grid edges must remain within the editing limits of +/- 1 billion. For the vast majority of patterns these limits won't ever be a problem.

One more restriction worth noting: B0 is not allowed in an unbounded universe.

 
History

Larger than Life was first imagined by David Griffeath in the early 1990s to explore whether Life might be a clue to a critical phase point in the threshold-range scaling limit [1]. The LtL family of rules includes Life as well as a rich set of two-dimensional rules, some of which exhibit dynamics vastly different from Life [2], [3]. Kellie Evans studied LtL in her 1996 thesis and discovered that a family of "Life-like" rules comprises a much larger subset of LtL parameter space than initially imagined [2], [4], [5].

In order to study LtL rules, David Griffeath and Bob Fisch developed WinCA, a cellular automata modeling environment for Windows. WinCA's editing capabilities were modest, but the software was able to implement LtL rules to range 200 and its speed increased together with the hardware on which it ran. In those early days of Windows, Griffeath's Primordial Soup Kitchen shared graphics and other discoveries via weekly "soup recipes" [6]. WinCA still runs on 32-bit Windows and allows for colorful LtL and other cellular automata images [10], [11]. Just before LtL was implemented in Golly, a virtual machine was used to run WinCA on 64-bit Windows and some new discoveries were made [12].

In 1999 Mirek Wojtowicz developed Mirek's Cellebration (MCell) [9], a cellular automata modeling environment for Windows, which was excellent for editing on the fly and working with small configurations for LtL rules up to range 10. Dean Hickerson used MCell to construct the first "bug gun" using the period 166 oscillator known as Bosco, which was discovered by Kellie Evans. This construction led to numerous other constructions and questions [7].

Golly is a game changer in the study of LtL: the first software with seemingly boundless possibilities that implements LtL in ranges up to 500 and the potential to discover LtL dynamics as yet unimagined.

 
References

[1] D. Griffeath. Self-organization of random cellular automata: Four snapshots, in "Probability and Phase Transitions", 1994. (G. Grimmett Ed.), Kluwer Academic, Dordrecht/Norwell, MA.

[2] K. Evans. "Larger than Life: it's so nonlinear", 1996. Ph.D. dissertation, University of Wisconsin- Madison.
http://www.csun.edu/~kme52026/thesis.html

[3] J. Gravner and D. Griffeath. Cellular automaton growth on Z2: theorems, examples, and problems, 1998. Advances in App. Math 21, 241-304.
http://psoup.math.wisc.edu/extras/r1shapes/r1shapes.html

[4] K. Evans. Larger than Life: digital creatures in a family of two-dimensional cellular automata, 2001. Discrete Mathematics and Theoretical Computer Science, Volume AA, 2001, 177-192
http://dmtcs.loria.fr/proceedings/html/dmAA0113.abs.html

[5] K. Evans, Threshold-range scaling of Life's coherent structures, Physica D 183 (2003), 45-67.

[6] D. Griffeath. Primordial Soup Kitchen.
http://psoup.math.wisc.edu/kitchen.html

[7] K. Evans, Is Bosco's rule universal?, in "Lecture Notes in Computer Science," Vol. 3354, ed. Maurice Margenstern. Springer-Verlag GmbH (2005), 188–199. WWW companion page to paper
http://www.csun.edu/~kme52026/bosco/bosco.html

[8] K. Evans. Replicators and Larger than Life examples, 2002. In "New Constructions in Cellular Automata", eds. David Griffeath and Cris Moore. Oxford University Press.

[9] MCell rules lexicon for Larger than Life:
http://www.mirekw.com/ca/rullex_lgtl.html

[10] D. Griffeath. Self-organizing two-dimensional cellular automata: 10 still frames. In "Designing Beauty: the Art of Cellular Automata," eds. Andrew Adamatzky and Genaro Martinez. Springer (2016) 1-12.

[11] K. Evans. Larger than Life. In "Designing Beauty: the Art of Cellular Automata," eds. Andrew Adamatzky and Genaro Martinez. Springer (2016) 27-34.

[12] A. Tantoushian. "Scaling Larger than Life Bugs: to range 25 and beyond", 2017 Master's thesis, California State University, Northridge.
http://scholarworks.csun.edu/handle/10211.3/192639 golly-3.3-src/Help/Algorithms/NN.png0000644000175000017500000000565613273534663014265 00000000000000‰PNG  IHDRGGÚÒÍH ViCCPICCProfilexœµ—PYÇ_wO¤!HrÎ’%Ç!’AT††0CRÄÌ¢+Šˆ˜Ð•¤àªÄ5 ¢ˆ²*˜]EA9w `@å9p¯î¶®®êî_õuÿꫯ¿÷ú½~Uÿ€r–%$Á$óÓ„ž.ŒðˆH~@@À,vªÀ9 Àü¥¦ÑjT· g{ýuÝ¿•$'6• €r '•ŒòY”El0 øÊ}™i”4€´ ÊÛg™;dz3ǧ¾Õº¢Ü Âb ¹ûÐ<#ƒÍE{E(›ð9<>Êìxåh” ’“WÏrÊ:1êÃý§ž1 =Y,îϽË7Üx©‚$ÖÚÿr9þ³’“ÒçÇBƒÂOZ:»74Æ8,7Ÿy$,äcù!AóÌYê?ÏqBÀ…ú4—?q@ðvº0c.‡™½` ˆi ”:ІÀ X;àÜ7ðÁ ¬l’d‚l°ä‚|° ìeà8 ªÁIp4ƒsภn€>0‚!0 ^˜Óá!*Dƒä!HÒ‡Ì kÈr‡|¡@(І¸J‡²¡­P>T•AG èg¨ºuCýÐ}h‡Þ@Ÿ`¦ÀÒ°¬ÃÖ°3ìÃ+`.œgÁ9ðN¸®„OÀMð%ø<Á/áI d„ލ"†ˆ5âŠø#‘H"D6 yH R‰Ô#mHrB&††a` 1v/L†IÁlÀ`Ê0Õ˜&L'æ6f#Â|ÅR±ŠX}¬-–‰ Çr±™Ø\l ö8¶{;€ÅNáp8:Ng…óÂEàpëp¸¸\;®7‚›Äãñòx}¼=Þϧásñûñ'ðñ·ð£ø2A…`Fð Dø„-„B-ááá9aš(AÔ$Úý‰âZb!ñ±x“8Jœ&I’´Iö¤`Ri3©”TOºBzDzK&“ÕÈ6äedy¹”|Š|¶(öyœ}\QÜמ»‡;ï_?Áså•ñ^'x%JxŸèŸX•8“–ÔLHŽNnåKñù«•W¯YÝ/Ðä †RlSö¦ˆ„>Âã©PêŠÔ–4iÔÈô¤ë¤ÿ>œáQžñ!34óÌÉ5ü5=kõÖîXû<Ë#ë§u˜uìuÙªÙ›³‡×;¯?²Ú³¡c£úÆœ£›<7Uo&mNÜüë“-E[Þm ÛÚ–£”³)gäÏêrÅr…¹w·Ùm;´³·½w‡ùŽý;¾æqò®ç›ä—ä.`\ÿÑôÇÒgvÆíì-´,<¸ ·‹¿kp·ãîê"É¢¬¢‘=~{šŠÅyÅïö®ÚÛ]²¸äÐ>Ò¾ô}C¥¾¥-û5öïÚÿ¹,¾l Ü¥¼¡B±bGÅûœ·:¬?¤t(ÿЧüÃ÷ŽxiªÔª,9Š;šqôÙ±Ðc]?YÿTs\áxþñ/Uüª¡êÀêΫššZÅÚÂ:¸.½nüDÔ‰¾“n'[ê ë4ÐòOSé§^üýóàiŸÓg¬ÏÔŸÕ<[ÑHkÌk‚šÖ6‰šã›‡Z"Zú[½[;ÚìÚ1ú¥êœê¹òó2ç /.ä\˜¹˜uq²]Ð>q‰{i¤cUÇÃËá—ït.ëì½âsåÚU«—»œ».^³¿v®Û¶»õºõõæ–7šz,zµøµ±×²·é¦ÕÍ–>›¾¶þ%ýn9ÞºtÛíöÕ;Ì;7–ô† Þ»uwèçÞØý¤û¯d<˜~¸éöQÞc‰Ç%OŸTþ¦û[ÃåÐùa·áž§AOްG^þžúûçÑœgÔg%ÏUž×Œ™÷ï{±üÅèKÁËé‰Ü¿Iþ­â•Ϋ³8ýÑ# ¾¾žySðVþmÕ»Åï:&&ŸL%OM¿Ïû ÿ¡ú£õÇ®OaŸžOg~Æ.ý¢û¥í«Ï×G3É33–õÍ hÀqq¼©€zÔŸ’Äæüï7Asžý¿â9üM–T9² _Ô£DCe zŸµÁN67_ˆ(5ÎÜl®EˆZ“33o•À·ðE833}`fæ êï‘û´§ÌùîYáп‘ÃøYêÖVþÿôwq䊸=Q pHYs  šœtRNSÿýÙæÑJî!tEXtSoftwareGraphicConverter (Intel)w‡ú¿IDATxœìÖAƒ0 @òÿõ }LÕ½!³Š³ÊÍgâ‹—ïç:ËaZkÁÖ¹_o÷ÞUéãXŠæ’ª?J•ŠŠŠŠŠêÙªÜöPI×ÜQe§›$Õ-Tóe5/Ñ}í'Ú—ê|•êʾTç«TWö¥:_¦š/›jÎ=ŠŠŠŠŠêþªÑ{ÂÿTU#'Y¸ÕôªÛCPUd¬5ÕÃUÑíáøüÿÿð2WžÐœ7IEND®B`‚golly-3.3-src/Help/Algorithms/NM.png0000644000175000017500000000572313273534663014257 00000000000000‰PNG  IHDRGGÚÒÍH ViCCPICCProfilexœµ—PYÇ_wO¤!HrÎ’%Ç!’AT††0CRÄÌ¢+Šˆ˜Ð•¤àªÄ5 ¢ˆ²*˜]EA9w `@å9p¯î¶®®êî_õuÿꫯ¿÷ú½~Uÿ€r–%$Á$óÓ„ž.ŒðˆH~@@À,vªÀ9 Àü¥¦ÑjT· g{ýuÝ¿•$'6• €r '•ŒòY”El0 øÊ}™i”4€´ ÊÛg™;dz3ǧ¾Õº¢Ü Âb ¹ûÐ<#ƒÍE{E(›ð9<>Êìxåh” ’“WÏrÊ:1êÃý§ž1 =Y,îϽË7Üx©‚$ÖÚÿr9þ³’“ÒçÇBƒÂOZ:»74Æ8,7Ÿy$,äcù!AóÌYê?ÏqBÀ…ú4—?q@ðvº0c.‡™½` ˆi ”:ІÀ X;àÜ7ðÁ ¬l’d‚l°ä‚|° ìeà8 ªÁIp4ƒsภn€>0‚!0 ^˜Óá!*Dƒä!HÒ‡Ì kÈr‡|¡@(І¸J‡²¡­P>T•AG èg¨ºuCýÐ}h‡Þ@Ÿ`¦ÀÒ°¬ÃÖ°3ìÃ+`.œgÁ9ðN¸®„OÀMð%ø<Á/áI d„ލ"†ˆ5âŠø#‘H"D6 yH R‰Ô#mHrB&††a` 1v/L†IÁlÀ`Ê0Õ˜&L'æ6f#Â|ÅR±ŠX}¬-–‰ Çr±™Ø\l ö8¶{;€ÅNáp8:Ng…óÂEàpëp¸¸\;®7‚›Äãñòx}¼=Þϧásñûñ'ðñ·ð£ø2A…`Fð Dø„-„B-ááá9aš(AÔ$Úý‰âZb!ñ±x“8Jœ&I’´Iö¤`Ri3©”TOºBzDzK&“ÕÈ6äedy¹”|Š|¶(öyœ}\QÜמ»‡;ï_?Áså•ñ^'x%JxŸèŸX•8“–ÔLHŽNnåKñù«•W¯YÝ/Ðä †RlSö¦ˆ„>Âã©PêŠÔ–4iÔÈô¤ë¤ÿ>œáQžñ!34óÌÉ5ü5=kõÖîXû<Ë#ë§u˜uìuÙªÙ›³‡×;¯?²Ú³¡c£úÆœ£›<7Uo&mNÜüë“-E[Þm ÛÚ–£”³)gäÏêrÅr…¹w·Ùm;´³·½w‡ùŽý;¾æqò®ç›ä—ä.`\ÿÑôÇÒgvÆíì-´,<¸ ·‹¿kp·ãîê"É¢¬¢‘=~{šŠÅyÅïö®ÚÛ]²¸äÐ>Ò¾ô}C¥¾¥-û5öïÚÿ¹,¾l Ü¥¼¡B±bGÅûœ·:¬?¤t(ÿЧüÃ÷ŽxiªÔª,9Š;šqôÙ±Ðc]?YÿTs\áxþñ/Uüª¡êÀêΫššZÅÚÂ:¸.½nüDÔ‰¾“n'[ê ë4ÐòOSé§^üýóàiŸÓg¬ÏÔŸÕ<[ÑHkÌk‚šÖ6‰šã›‡Z"Zú[½[;ÚìÚ1ú¥êœê¹òó2ç /.ä\˜¹˜uq²]Ð>q‰{i¤cUÇÃËá—ït.ëì½âsåÚU«—»œ».^³¿v®Û¶»õºõõæ–7šz,zµøµ±×²·é¦ÕÍ–>›¾¶þ%ýn9ÞºtÛíöÕ;Ì;7–ô† Þ»uwèçÞØý¤û¯d<˜~¸éöQÞc‰Ç%OŸTþ¦û[ÃåÐùa·áž§AOްG^þžúûçÑœgÔg%ÏUž×Œ™÷ï{±üÅèKÁËé‰Ü¿Iþ­â•Ϋ³8ýÑ# ¾¾žySðVþmÕ»Åï:&&ŸL%OM¿Ïû ÿ¡ú£õÇ®OaŸžOg~Æ.ý¢û¥í«Ï×G3É33–õÍ hÀqq¼©€zÔŸ’Äæüï7Asžý¿â9üM–T9² _Ô£DCe zŸµÁN67_ˆ(5ÎÜl®EˆZ“33o•À·ðE833}`fæ êï‘û´§ÌùîYáп‘ÃøYêÖVþÿôwq䊸=Q pHYs  šœtRNSÿýÙæÑJî!tEXtSoftwareGraphicConverter (Intel)w‡úäIDATxœì–A Ã@ ³ÿÿXÕ¦wea±­3ºä048 \׸¬µþïsÞ¢w³ÅÊH±+#ÅJP¬Œ4ÁjXFߪ¨V¢Y„be¤X Š•‘b%hæ¨7Éè[5ÃJ4‹P¬Œ+A±2R¬Íõ&)¿Õç9ûw[XõÞS¬Î)Vg½÷«sŠÕYï=Íõ&ýXÔ +Ñ,B±2R¬ÅÊH±4sÔ›dô­Šša%šE(VFŠ• X)V‚fŽz“Œ¾UQ3¬D³ÅÊH±+#ÅJÐÌQo’ÛêÿÿCˆ%JV­gIEND®B`‚golly-3.3-src/Help/Algorithms/QuickLife.html0000644000175000017500000002721113543255652015773 00000000000000 Golly Help: QuickLife

QuickLife is a fast, conventional (non-hashing) algorithm for exploring Life and other 2D outer-totalistic rules. Such rules are defined using "B0...8/S0...8" notation, where the digits after B specify the counts of live neighbors necessary for a cell to be born in the next generation, and the digits after S specify the counts of live neighbors necessary for a cell to survive to the next generation. Here are some example rules:

B3/S23 [Life]
John Conway's rule is by far the best known and most explored CA.

B36/S23 [HighLife]
Very similar to Conway's Life but with an interesting replicator.

B3678/S34678 [Day & Night]
Dead cells in a sea of live cells behave the same as live cells in a sea of dead cells.

B35678/S5678 [Diamoeba]
Creates diamond-shaped blobs with unpredictable behavior.

B2/S [Seeds]
Every living cell dies every generation, but most patterns still explode.

B234/S [Serviettes or Persian Rug]
A single 2x2 block turns into a set of Persian rugs.

B345/S5 [LongLife]
Oscillators with extremely long periods can occur quite naturally.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 4. For example, try B13/S012V or B2/S013V.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

QuickLife can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 6. Here's an example:
x = 7, y = 6, rule = B245/S3H
obo$4bo$2bo$bo2bobo$3bo$5bo!
Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons when in icon mode.

 
Non-totalistic rules

All of the above rules are classified as "totalistic" because the outcome depends only on the total number of neighbors. Golly also supports non-totalistic rules for Moore neighborhoods — such rules depend on the configuration of the neighbors, not just their counts.

The syntax used to specify a non-totalistic rule is based on a notation developed by Alan Hensel. It's very similar to the above "B.../S..." notation but uses various lowercase letters to represent unique neighborhoods. One or more of these letters can appear after an appropriate digit (which must be from 1 to 7, depending on the letters). The usual counts of 0 and 8 can still be used without letters since there is no way to constrain 0 or 8 neighbors.

For example, B3/2a34 means birth on 3 neighbors and survival on 2 adjacent neighbors (a corner and an edge), or 3 or 4 neighbors.

Letter strings can get quite long, so it's possible to specify their inverse using a "-" between the digit and the letters. For example, B2cekin/S12 is equivalent to B2-a/S12 and means birth on 2 non-adjacent neighbors, and survival on 1 or 2 neighbors. (This is David Bell's "Just Friends" rule.)

The following table shows which letters correspond to which neighborhoods. The central cell in each neighborhood is colored red, corner neighbors are green, edge neighbors are yellow and ignored neighbors are black:

The table makes it clear which digits are allowed before which letters. For example, B1a/S and B5z/S are both invalid rules.

Golly uses the following steps to convert a given non-totalistic rule into its canonical version:

  1. An underscore can be used instead of a slash, but the canonical version always uses a slash.
  2. The lowercase letters are listed in alphabetical order. For example, B2nic/S will become B2cin/S.
  3. A given rule is converted to its shortest equivalent version. For example, B2ceikn/S will become B2-a/S. If equivalent rules have the same length then the version without the minus sign is preferred. For example, B4-qjrtwz/S will become B4aceikny/S.
  4. It's possible for a non-totalistic rule to be converted to a totalistic rule. If you supply all the letters for a specific neighbor count then the canonical version removes the letters. For example, B2aceikn3/S will become B23/S. (Note that B2-3/S is equivalent to B2aceikn3/S so will also become B23/S.)
  5. If you supply a minus sign and all the letters for a specific neighbor count then the letters and the neighbor count are removed. For example, B2-aceikn3/S will become B3/S.

 
MAP rules

The totalistic and non-totalistic rules above are only a small subset of all possible rules for a 2-state Moore neighborhood. The Moore neighborhood has 9 cells which gives 512 (2^9) possible combinations of cells. For each of these combinations you define whether the output cell is dead or alive, giving a string of 512 digits, each being 0 (dead) or 1 (alive).

   0 1 2
   3 4 5  ->  4'
   6 7 8
The first few entries for Conway's Life (B3/S23) in this format are as follows:
   Cell 0 1 2 3 4 5 6 7 8  ->  4'
   0    0 0 0 0 0 0 0 0 0  ->  0
   1    0 0 0 0 0 0 0 0 1  ->  0
   2    0 0 0 0 0 0 0 1 0  ->  0
   3    0 0 0 0 0 0 0 1 1  ->  0
   4    0 0 0 0 0 0 1 0 0  ->  0
   5    0 0 0 0 0 0 1 0 1  ->  0
   6    0 0 0 0 0 0 1 1 0  ->  0
   7    0 0 0 0 0 0 1 1 1  ->  1   B3
   8    0 0 0 0 0 1 0 0 0  ->  0
   9    0 0 0 0 0 1 0 0 1  ->  0
   10   0 0 0 0 0 1 0 1 0  ->  0
   11   0 0 0 0 0 1 0 1 1  ->  1   B3
   ...
   19   0 0 0 0 1 0 0 1 1  ->  1   S2
   ...
   511  1 1 1 1 1 1 1 1 1  ->  0
This creates a string of 512 binary digits:
   00000001000100000001...0
This binary string is then base64 encoded for brevity giving a string of 86 characters:
   ARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
By prefixing this string with "MAP" the syntax of the rule becomes:
   rule = MAP<base64_string>
So, Conway's Life (B3/S23) encoded as a MAP rule is:
   rule = MAPARYXfhZofugWaH7oaIDogBZofuhogOiAaIDogIAAgAAWaH7oaIDogGiA6ICAAIAAaIDogIAAgACAAIAAAAAAAA
Given each MAP rule has 512 bits this leads to 2^512 (roughly 1.34x10^154) unique rules. Totalistic rules are a subset of isotropic non-totalistic rules which are a subset of MAP rules.

MAP rules can also be specified for Hexagonal and von Neumann neighborhoods.

Hexagonal neighborhoods have 7 cells (center plus 6 neighbors) which gives 128 (2^7) possible combinations of cells. These encode into 22 base64 characters.

Von Neumann neighborhoods have 5 cells (center plus 4 neighbors) which gives 32 (2^5) possible combinations of cells. These encode into 6 base64 characters.

For any of the neighborhoods the base64 encoding can optionally be postfixed with two base64 padding characters: "==".

 
Emulating B0 rules

Rules containing B0 are tricky to handle in an unbounded universe because every dead cell becomes alive in the next generation. If the rule doesn't contain Smax (where max is the number of neighbors in the neighborhood: 8 for Moore, 6 for Hexagonal or 4 for Von Neumann) then the "background" cells alternate from all-alive to all-dead, creating a nasty strobing effect. To avoid these problems, Golly emulates rules with B0 in the following way:

A totalistic rule containing B0 and Smax is converted into an equivalent rule (without B0) by inverting the neighbor counts, then using S(max-x) for the B counts and B(max-x) for the S counts. For example, B0123478/S01234678 (AntiLife) is changed to B3/S23 (Life) via these steps: B0123478/S01234678 -> B56/S5 -> B3/S23.

A non-totalistic rule is converted in a similar way. The isotropic letters are inverted and then S(max-x)(letters) is used for B counts and B(max-x)(letters) is used for the S counts. The 4 neighbor letters are swapped using the following table:

   4c -> 4e
   4e -> 4c
   4k -> 4k
   4a -> 4a
   4i -> 4t
   4n -> 4r
   4y -> 4j
   4q -> 4w
   4j -> 4y
   4r -> 4n
   4t -> 4i
   4w -> 4q
   4z -> 4z
A totalistic rule containing B0 but not Smax is converted into a pair of rules (both without B0): one is used for the even generations and the other for the odd generations. The rule for even generations uses inverted neighbor counts. The rule for odd generations uses S(max-x) for the B counts and B(max-x) for the S counts. For example, B03/S23 becomes B1245678/S0145678 (even) and B56/S58 (odd).

A non-totalistic rule is converted in a similar way. For even generations invert both B(x)(letter) and S(x)(letter). For odd generations except 4-neighbor letters, use B(x)(letter) if and only if the original rule has S(max-x)(letter) and use S(x)(letter) if and only if the original rule has B(max-x)(letter). For 4-neighbor isotropic letters use the table above. For example, B0124-k/S1c25 becomes B34k5678/S01-c34678 (even) and B367c/S4-k678 (odd).

For a MAP rule B0 is equivalent to the first bit being 1. Smax is equivalent to the 511th bit being 1. For B0 with Smax the rule is converted to NOT(REVERSE(bits)). For B0 without Smax the even rule is NOT(bits) and the odd rule is REVERSE(bits).

In all cases, the replacement rule(s) generate patterns that are equivalent to the requested rule. However, you need to be careful when editing an emulated pattern in a rule that contains B0 but not Smax. If you do a cut or copy then you should only paste into a generation with the same parity.

 
Wolfram's elementary rules

QuickLife supports Stephen Wolfram's elementary 1D rules. These rules are specified as "Wn" where n is an even number from 0 to 254. For example:

W22
A single live cell creates a beautiful fractal pattern.

W30
Highly chaotic and an excellent random number generator.

W110
Matthew Cook proved that this rule is capable of universal computation.

The binary representation of a particular number specifies the cell states resulting from each of the 8 possible combinations of a cell and its left and right neighbors, where 1 is a live cell and 0 is a dead cell. Here are the state transitions for W30:

   111  110  101  100  011  010  001  000
    |    |    |    |    |    |    |    |
    0    0    0    1    1    1    1    0  = 30 (2^4 + 2^3 + 2^2 + 2^1)
Note that odd-numbered rules have the same problem as B0 rules. Golly currently makes no attempt to emulate such rules, and they are not supported. golly-3.3-src/Help/Algorithms/RuleLoader.html0000644000175000017500000003214513151213347016145 00000000000000 Golly Help: RuleLoader

The RuleLoader algorithm allows rules to be specified in external files. Given the rule string "Foo", RuleLoader will search for a file called Foo.rule. It looks for the file in your rules folder first, then in the supplied Rules folder. The format of a .rule file is described here. A number of examples can be found in the Rules folder:

B3/S23 or Life
Conway's Life. This is the default rule for the RuleLoader algorithm and is built in (there is no corresponding .rule file).

Banks-I, Banks-II, Banks-III, Banks-IV
In 1971, Edwin Roger Banks (a student of Ed Fredkin) made simpler versions of Codd's 1968 CA, using only two states in some cases. These four rules are found in his PhD thesis. To see the rules in action, open Banks-I-demo.rle and the other examples in Patterns/Self-Rep/Banks/.

BBM-Margolus-emulated
Ed Fredkin's Billiard Ball Model, using the Margolus neighborhood to implement a simple reversible physics of bouncing balls. In this implementation we are emulating the system using a Moore-neighborhood CA with extra states. Open BBM.rle to see the rule in action.

BriansBrain
An alternative implementation of the Generations rule /2/3.

Byl-Loop
A six state 5-neighborhood CA that supports small self-replicating loops. To see the rule in action, open Byl-Loop.rle.

Caterpillars
An alternative implementation of the Generations rule 124567/378/4.

Chou-Reggia-1 and Chou-Reggia-2
Two 5-neighborhood CA that supports tiny self-replicating loops. To see the rules in action, open Chou-Reggia-Loop-1.rle and Chou-Reggia-Loop-2.rle.

Codd
In 1968, Edgar F. Codd (who would later invent the relational database) made a simpler version of von Neumann's 29-state CA, using just 8 states. To see the rule in action, open repeater-emitter-demo.rle and the other examples in Patterns/Self-Rep/Codd/.

Codd2
A very minor extension of Codd's transition table, to allow for some sheathing cases that were found with large patterns. See sheathing-problems.rle for a demonstration of the problem cases.

CrittersMargolus_emulated
The Critters rule is reversible and has Life-like gliders. See CrittersCircle.rle.

Devore
In 1973, John Devore altered Codd's transition table to allow for simple diodes and triodes, enabling him to make a much smaller replicator than Codd's. See Devore-rep.rle and the other examples in Patterns/Self-Rep/Devore/.

DLA-Margolus-emulated
Diffusion-limited aggregation (DLA) is where moving particles can become stuck, forming a distinctive fractal pattern seen in several different natural physical systems. See DLA.rle.

Ed-rep
A version of Fredkin's parity rule, for 7 states. See Ed-rep.rle for an image of Ed Fredkin that photocopies itself.

Evoloop and Evoloop-finite
An extension of the SDSR Loop, designed to allow evolution through collisions. To see the rule in action, open Evoloop-finite.rle.

HPP
The HPP lattice gas. A simple model of gas particles moving at right angles at a fixed speed turns out to give an accurate model of fluid dynamics on a larger scale. Though the later FHP gas improved on the HPP gas by using a hexagonal lattice for more realistic results, the HPP gas is where things began. Open HPP-demo.rle.

Langtons-Ant
Chris Langton's other famous CA. An ant walks around on a binary landscape, collecting and depositing pheremones. See Langtons-Ant.rle.

Langtons-Loops
The original loop. Chris Langton adapted Codd's 1968 CA to support a simple form of self-replication based on a circulating loop of instructions. To see the rule in action, open Langtons-Loops.rle.

LifeHistory
A 7-state extension of the HistoricalLife rule from MCell, allowing for on and off marked cells (states 3 and 4) as well as the history envelope (state 2). State 3 is useful for labels and other identifying marks, since an active pattern can touch or even cross it without being affected. State 5 is an alternate marked ON state most often used to mark a 'starting' location; once a cell changes to state 2, it can not return to this start state. State 6 cells kill any adjacent live cells; they are intended to be used as boundaries between subpatterns, e.g. in an active stamp collection where flying debris from one subpattern might adversely affect another subpattern. See h-to-h-collection-26Aug2017.zip for an example using all of LifeHistory's extra states.

LifeOnTheEdge
A CA proposed by Franklin T. Adams-Watters in which all the action occurs on the edges of a square grid. Each edge can be on or off and has six neighbors, three at each end. An edge is on in the next generation iff exactly two of the edges in its seven edge neighborhood (including the edge itself) are on. This implementation has 3 live states with suitable icons that allow any pattern of edges to be created. Open life-on-the-edge.rle.

LifeOnTheSlope
The same behavior as LifeOnTheEdge but patterns are rotated by 45 degrees. This implementation has only 2 live states (with icons \ and /), so it's a lot easier to enter patterns and they run faster. Open life-on-the-slope.rle.

Perrier
Perrier extended Langton's Loops to allow for universal computation. See Perrier-Loop.rle.

Sand-Margolus-emulated
MCell's Sand rule is a simple simulation of falling sand particles. See Sand.rle.

SDSR-Loop
An extension of Langton's Loops, designed to cause dead loops to disappear, allowing other loops to replicate further. To see the rule in action, open SDSR-Loop.rle.

StarWars
An alternative implementation of the Generations rule 345/2/4.

Tempesti
A programmable loop that can construct shapes inside itself after replication. To see the rule in action, open Tempesti-Loop.rle. This loop prints the letters 'LSL' inside each copy — the initials of Tempesti's university group.

TMGasMargolus_emulated
A different version of the HPP gas, implemented in the Margolus neighborhood, see TMGas.rle.

TripATronMargolus_emulated
The Trip-A-Tron rule in the Margolus neighborhood. See TripATron.rle.

WireWorld
A 4-state CA created by Brian Silverman. WireWorld models the flow of currents in wires and makes it relatively easy to build logic gates and other digital circuits. Open primes.mc and the other examples in Patterns/WireWorld/.

Worm-1040512, Worm-1042015, Worm-1042020, Worm-1252121, Worm-1525115
Examples of Paterson's Worms, a simulation created by Mike Paterson in which a worm travels around a triangular grid according to certain rules. There's also a rule called Worm-complement which can be used to show the uneaten edges within a solid region. Open worm-1040512.rle and the other examples in Patterns/Patersons-Worms/.

References:

Banks-I, Banks-II, Banks-III, Banks-IV (1971)
E. R. Banks. "Information Processing and Transmission in Cellular Automata" PhD Thesis, MIT, 1971.

Byl-Loop (1989)
J. Byl. "Self-Reproduction in small cellular automata." Physica D, Vol. 34, pages 295-299, 1989.

Chou-Reggia-1 and Chou-Reggia-2 (1993)
J. A. Reggia, S. L. Armentrout, H.-H. Chou, and Y. Peng. "Simple systems that exhibit self-directed replication." Science, Vol. 259, pages 1282-1287, February 1993.

Codd (1968)
E. F. Codd, "Cellular Automata" Academic Press, New York, 1968.

Devore (1973)
Devore, J. and Hightower, R. (1992) "The Devore variation of the Codd self-replicating computer" Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260.

Evoloop (1999)
Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999.

HPP (1973)
J. Hardy, O. de Pazzis, and Y. Pomeau. J. Math. Phys. 14, 470, 1973.

Langtons-Ant (1986)
C. G. Langton. "Studying artificial life with cellular automata" Physica D 2(1-3):120-149, 1986.

Langtons-Loops (1984)
C. G. Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984.

Paterson's Worms (1973)
See these sites for a good description and the latest results:
http://www.maa.org/editorial/mathgames/mathgames_10_24_03.html
http://wso.williams.edu/~Ebchaffin/patersons_worms/
http://tomas.rokicki.com/worms.html

Perrier (1996)
J.-Y. Perrier, M. Sipper, and J. Zahnd. "Toward a viable, self-reproducing universal computer" Physica D 97: 335-352. 1996

SDSR-Loop (1998)
Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press.

Tempesti (1995)
G. Tempesti. "A New Self-Reproducing Cellular Automaton Capable of Construction and Computation". Advances in Artificial Life, Proc. 3rd European Conference on Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563.

WireWorld (1987)
A. K. Dewdney, Computer Recreations. Scientific American 282:136-139, 1990. golly-3.3-src/Help/Algorithms/JvN.html0000644000175000017500000000504613151213347014604 00000000000000 Golly Help: JvN

John von Neumann created the very first cellular automata in the 1940's, together with fellow mathematician Stanislaw Ulam.

The JvN algorithm supports 3 rules:

JvN29
The original 29-state CA as created by von Neumann. To see how his rules work, load the simpler examples first: counter-demo.rle and cell-coders-demo.rle and read their pattern info (hit the 'i' button). For a more complex example, see read-arm-demo.rle which shows one component of von Neumann's original design, the tape reader. For a complete self-replicating machine within von Neumann's CA, open sphinx.mc.gz.

Nobili32
An extension of JvN29 created by Renato Nobili in 1994. This rule adds three new states to allow signal crossing, allowing self-replicating machines to be greatly reduced in size. The example pattern construction-arm-demo.rle shows some of the crossing cells in action under this rule. The pattern NP-replicator.rle.gz shows the 1994 design that was the first implementation of von Neumann's vision of a self-reproducing universal constructor in a CA.

Hutton32
Created by Tim Hutton in 2008, this rule uses the same states as Nobili32 but has a slightly modified rule table. Examples golly-constructor.rle and Hutton-replicator.rle show what it can do.

References:

http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor
http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata
http://www.pd.infn.it/~rnobili/wjvn/index.htm
http://www.pd.infn.it/~rnobili/au_cell/
http://www.sq3.org.uk/Evolution/JvN/

golly-3.3-src/Help/help.html0000644000175000017500000000633712677364330012745 00000000000000 Golly Help: Help Menu

The Help menu items can be used to display information on a variety of topics. Each item corresponds to a HTML file in the Help folder. The information is displayed in a separate help window which behaves like a simplified browser. The size and location of this window is remembered when it closes.

Keyboard shortcuts

Various keyboard shortcuts can be used when the help window is in front:

  • Hit "+" and "-" to change the font size.
  • Hit the left arrow or "[" to go back.
  • Hit the right arrow or "]" to go forwards.
  • Hit the home key to go to the Contents page.
  • Hit the up/down arrow keys or page up/down keys if a scroll bar appears.
  • Hit Ctrl-A on Windows/Linux or Cmd-A on Mac to select all text.
  • Hit Ctrl-C on Windows/Linux or Cmd-C on Mac to copy selected text to the clipboard.
  • Hit escape or return to close the help window.

Special links

The help window supports a number of Golly-specific links:

  • edit:file
    Open the given file in your preferred text editor. A non-absolute path is relative to the location of the Golly application.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the help window. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is opened in your text editor.
    • A zip file is opened and processed as described in the File Formats help.
    • A rule file (.rule) is installed into your rules folder and Golly then switches to the corresponding rule.
    • A script file (.lua or .py) is run, but only if you answer "Yes" to the query dialog that appears.
    • A pattern file is loaded into the current layer.
  • lexpatt:pattern
    Load the given Life Lexicon pattern into a "lexicon" layer which is automatically created if it doesn't already exist.
  • open:file
    Load the given pattern or run the given script or switch to the given rule. A non-absolute path is relative to the location of the Golly application.
  • prefs:pane
    Open the Preferences dialog at the given pane. The pane string must be lowercase and must match a known pane: file, edit, control, etc.
  • rule:rulename
    Switch to the given rule.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file, so you probably won't ever need to use such links in your own HTML files.

Note that for some links (get, open, unzip) you can tell Golly to open the specified file in your text editor by control-clicking or right-clicking on the link. golly-3.3-src/Help/view.html0000644000175000017500000001376513274424050012760 00000000000000 Golly Help: View Menu

Full Screen

Switches to full screen mode. To exit from this mode just hit the menu item's keyboard shortcut, or the escape key (if not generating a pattern), or any unassigned key.

Fit Pattern

Changes the scale and location so the entire pattern fits within the current view.

Fit Selection

Changes the scale and location so the entire selection fits within the current view.

Middle

Moves the origin cell (0,0) to the middle of the view.

Restore Origin

Restores the true origin. The origin cell can be changed by hitting "0" while the cursor is over the view — the cell under the cursor will become the new origin and its location will be displayed as 0,0. This can be handy for measuring distances or for saving a location and returning to it quickly by hitting "m".

Zoom In

Zooms in by doubling the current scale. If the scale is 1:32 then you can't zoom in any further.

Zoom Out

Zooms out by halving the current scale. You can zoom out as far as you like.

Set Scale

This submenu lets you set the scale from 1:1 to 1:32. (A quicker is to use keyboard shortcuts. The initial shortcuts are: "1" for 1:1, "2" for 1:2, "4" for 1:4, "8" for 1:8, "6" for 1:16 and "3" for 1:32.)

Show Tool Bar

Shows or hides the tool bar at the left edge of the main window.

Show Layer Bar

Shows or hides the layer bar above the viewport window (and above the edit bar if it's visible).

Show Edit Bar

Shows or hides the edit bar above the viewport window. The edit bar contains buttons for undo and redo, buttons for changing the cursor mode, a button for showing/hiding all states (see below), boxes showing the current drawing state's color and icon, and a scroll bar for changing the drawing state.

Show All States

If ticked then the edit bar is made larger and the colors and icons for all cell states in the current universe are displayed. A box is drawn around the current drawing state; to change it just click on a different state.

Show Status Bar

Shows or hides the status bar at the top of the main window.

Show Exact Numbers

If ticked then the status bar is made larger and exact numbers are displayed instead of using scientific notation.

Show Grid Lines

Shows or hides the grid lines. Use Preferences > View to turn off the bold grid lines or change their spacing. You can also set the minimum scale at which grid lines should be displayed (1:4, 1:8, 1:16 or 1:32).

Show Cell Icons

If ticked then icons will be displayed at scales 1:8, 1:16 or 1:32. Icons are small bitmaps that can have any shape but their color is automatically synchronized with the cell's state color. Each algorithm can have a different set of icons. You can change these icons by loading suitably formatted files via the "Load Icons" button in Preferences > Color.

It's also possible to have rule-specific icons. Whenever Golly switches to a new rule it looks inside the Rules folder for a matching rule.icons file and, if it exists, loads the bitmaps stored in the file. The format of a .icons file is identical to that used above. See Help > File Formats for a description of the format.

Invert Colors

If ticked then the colors of all cell states in all layers are inverted; i.e., each RGB value is changed to 255-R, 255-G, 255-B.

Smarter Scaling

If not ticked then Golly displays patterns at zoomed out scales by drawing all live cells using the state 1 color, regardless of the cell states. If this option is ticked then patterns will be scaled in a way that shows the correct colors, but only at scales from 2:1 to 16:1.

Note that pattern rendering is significantly slower using this scaling option, so it's probably best to only turn it on when you need to see fine details. Define a keyboard shortcut for this menu item so you can easily turn the option on or off.

Show Timeline

Shows or hides the timeline bar below the viewport window. If the current algorithm supports timelines (only QuickLife doesn't) then the timeline bar has a button to start/stop recording a timeline. This button is equivalent to the Control menu's Start/Stop Recording item.

When recording stops, or after a timeline is loaded from a .mc file, you'll see a scroll bar that lets you view any frame within the timeline. There are also buttons to automatically play the timeline forwards or backwards, a slider to adjust the speed of auto-play, and a button at the right edge to delete the timeline. Note that if the Control menu's Auto Fit option is ticked then Golly will force each timeline pattern to fit the viewport.

A number of keyboard shortcuts can be used while a timeline exists. Hit the escape key to stop recording or to stop auto-play. Hit your preferred keys for Faster/Slower to change the speed of auto-play. Hit your preferred key for Start Generating to play the timeline forwards and, if you wish, use Preferences > Keyboard to assign a keyboard shortcut for Play Timeline Backwards.

Show Scroll Bars

Shows or hides the scroll bars.

Pattern Info

Displays any comments in the current pattern file. golly-3.3-src/Help/changes.html~0000644000175000017500000013013412775273267013623 00000000000000 Golly Help: Changes

Changes in version 2.9b1 (released !!!)

  • This version introduces a new feature called the overlay.
  • There are two new items at the top of the Layer menu: Show Overlay and Delete Overlay.
  • Lua scripts can call a new overlay command to create, modify and delete the overlay.
  • The getevent command can detect a number of new events: a mouse click in the overlay, the release of a mouse button (anywhere), and zooming in/out via the mouse wheel (either in the current layer or in the overlay).
  • The setoption command recognizes two new options: "showbuttons" (with a value from 0 to 4) for controlling the position of the translucent buttons, and "showoverlay" (with a value of 0 or 1) for controlling the appearance of the overlay.
  • The getview command now takes an optional parameter so scripts can get the pixel dimensions of a specified layer.
  • The new os command allows scripts to detect the current operating system.
  • A new version of pop-plot.lua creates an overlay to display a much nicer looking plot.
  • A new hexgrid.lua script creates an overlay to display a true hexagonal grid over a layer that uses a rule with a hexagonal neighborhood.
  • A new lifeviewer.lua script creates an overlay to display patterns like LifeViewer with smooth non-integer zoom and rotation.
  • The flood-fill.lua script uses a faster scanline algorithm.
  • Non-totalistic rules containing B0 are now supported.
  • Pattern rendering is significantly faster when zoomed in.
  • The Generations algorithm now supports Hex, Von Neumann and non-totalistic Moore neighborhoods.

Changes in version 2.8 (released August 2016)

  • Golly no longer supports Perl scripting. In its place we've added support for Lua using a statically linked interpreter, so no need to download an installer or set a path to a shared library. See Lua Scripting for all the details.
  • QuickLife and HashLife now support non-totalistic rules. A number of interesting examples can be found in the new Patterns/Non-Totalistic folder.
  • OpenGL is used for rendering patterns.
  • Timers are used to control pattern generation and timeline recording/playback.
  • The File menu items Show Patterns and Show Scripts have been replaced by a single Show Files item for consistency with the recommended way to organize your Golly folder.
  • The shrink command has an optional flag that can remove the selection if it has no live cells (the default is to leave the selection unchanged).
  • Two new scripting commands, setview and getview, can be used to set/get the pixel dimensions of the viewport.
  • The View menu has a new Smarter Scaling option for displaying correctly colored patterns when zoomed out at scales from 2:1 to 16:1.
  • The Buffered item has been removed from the View menu.
  • Paste patterns are covered with a translucent rectangle instead of being enclosed by thin border lines.
  • Correct colors/icons are now displayed when pasting a pattern with a rule different to the current layer's rule.
  • Better reporting of errors in a .rule file.
  • Fixed a bug that could result in a spurious error message when loading a .rule file without any TABLE or TREE section.
  • Fixed a crash on Linux when typing in the Keyboard preferences.
  • Fixed some bugs that could cause Reset/Undo to restore an incorrect pattern.
  • Fixed a timeline bug that could show incorrect population for a bounded grid.
  • bgolly now supports rules that specify bounded grids.
  • Fixed a bug in bgolly that prevented use of the RuleLoader algorithm.
  • bgolly has a new -s option (or --search) for specifying the folder in which the RuleLoader algorithm will look for .rule files before looking in the supplied Rules folder. For example, assuming SlowLife.rule is in a folder called My-rules, you could type a command like this:

    bgolly -a RuleLoader -s My-rules/ -r SlowLife My-patterns/foo.rle

Changes in version 2.7 (released May 2015)

  • The middle mouse button can now be used for panning, regardless of the current cursor mode.
  • Fixed potential crash when pasting a text pattern into any hash-based algorithm.
  • Fixed crash on Mac OS 10.9 when opening a modal dialog like Save Pattern.
  • Fixed crash on Windows 8 when opening the Set Rule dialog.
  • Fixed bug in QuickLife algorithm that could cause cells at the bottom/left edges of the viewport to disappear every odd generation.
  • Fixed bug in QuickLife algorithm that could cause the selection rectangle to appear offset by one pixel (left or right).
  • The shift.pl/py scripts save the given parameters for the next run.
  • The evolve command aborts the current script with an error message if the given number of generations is negative.
  • Fixed minor problem with the Fit Pattern/Selection menu commands not centering a pattern/selection accurately in some cases. Ditto for the fit and fitsel script commands. The visrect script command is also more accurate.
  • Fixed bug that could cause Undo to fail due to a temporary macrocell file containing comment lines not prefixed with #C.
  • Start-up message now shows if this version of Golly is 32-bit or 64-bit.

Changes in version 2.6 (released December 2013)

  • Fixed menu problems on Ubuntu when using Unity.
  • Fixed a nasty bug that could cause Golly to crash when doing a paste.
  • Fixed a bug that could cause the paste image to disappear after a flip/rotate.
  • Fixed bugs in Mac app caused by non-ASCII characters in some file paths.
  • Fixed a problem that prevented Golly starting up on Mac OS 10.9.
  • Tool bar buttons are no longer disabled when the main window is inactive.
  • The save settings in Preferences > Layer are now obeyed by scripts. For example, let's assume you've ticked the option to be asked to save changes on creating a new pattern. If the current layer has changes and you run a script that calls new() then you'll get the standard dialog asking if you want to save those changes. If you cancel the dialog then the script is aborted.
  • To avoid potential data loss, you now get a warning if you save a non-starting generation and earlier changes exist. The warning can be disabled in Preferences > Layer.
  • Created an online archive for very large patterns.

Changes in version 2.5 (released June 2013)

  • This version introduces a new rule format. A file in the new format has a .rule extension and contains all the information about the rule: its name, description, table/tree data, and any color/icon information. More details here.
  • The RuleTable and RuleTree algorithms have been replaced by a new algorithm called RuleLoader. If asked to load a rule called "Foo", RuleLoader will look for Foo.rule first, then Foo.table, then Foo.tree.
  • The Control menu has a new command called Convert Old Rules that can be used to convert all your old .table/tree/colors/icons files into new .rule files (it won't overwrite any existing .rule files). After the conversion finishes you're given the option of deleting all the old files.
  • If File > Open Clipboard or Edit > Paste sees clipboard text starting with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder and switch to that rule.
  • All Python scripts that created a .tree file (and possibly .colors/icons files) now create a .rule file containing the same tree data (and any color/icon info).
  • Two new scripts allow Golly to be used as an icon editor. First, run icon-importer.py to import any icons for the current rule and display their bitmaps in a new layer for you to edit. When you've finished, run icon-exporter.py to extract the icon images and create or update the @ICONS section in the appropriate .rule file, then display the icons in a separate test layer.
  • A script has been added: goto_expression.py. It works like goto.py, except that it also accepts expressions. An example of an "expression" is "17*(2^(3*143)+2^(2*3*27))".
  • The status bar now displays quantities larger than 10308 in scientific notation. Golly can easily exceed this in both the Generation and Population statistics. For example, open the pattern puffer-train.rle, then run the script goto_expression.py and enter "f10^2000".
  • Added a new pattern: partial-constructor.mc.gz.
  • Patterns can now be displayed at scale 1:32. If you want to use that scale when creating a new pattern then choose the appropriate pop-up menu option in Preferences > File.
  • Support for monochrome icons has been extended to allow grayscale icons, where shades of gray can be used to do anti-aliasing. See the icons in WireWorld.rule for a good example. Most of the default icons are now grayscale bitmaps.
  • The current directory is now inserted at the start of sys.path for Python scripts.
  • The "Load Icons" button in Preferences > Color has been removed (it's no longer possible to change an algorithm's default icons).
  • The RuleTableToTree program is no longer included (you can use the RuleTableToTree.py script instead).
  • Fixed bug in Linux app: the shift key wasn't toggling cursor mode.
  • Fixed bug in Linux app: the space key wouldn't stop a pattern generating.
  • Fixed bug in Mac app: resizing the window could cause the sash position to change unexpectedly.
  • Fixed bug in Mac app: the first keyboard shortcut after a Paste command might be ignored.

Changes in version 2.4 (released June 2012)

  • Fixed bug that prevented 64-bit Windows app using more than 4GB of hash memory.
  • Fixed bug that caused corrupted macrocell files if saved with timeline data.
  • Fixed bug in Langtons-Ant.tree that had ants colliding incorrectly.
  • Fixed Mac app crashing if user's language setting is non-English.
  • Clipboard data on the Mac now uses LF as the end-of-line character rather than CR.
  • A pending paste is aborted if the main window becomes inactive.
  • Error messages from each algorithm are shown if a pattern file can't be loaded.

Changes in version 2.3 (released November 2011)

  • QuickLife and HashLife support rules using the von Neumann neighborhood or the hexagonal neighborhood. More details here.
  • The default icon for most rules is now a circular dot rather than a diamond. A diamond is the default icon for rules using the von Neumann neighborhood and a slanted hexagon is the default icon for rules using the hexagonal neighborhood.
  • A number of new script commands have been added to allow mouse interaction and better keyboard interaction: getevent, doevent and getxy. The getkey and dokey commands still work but are deprecated. In particular, there is no longer any need for scripts to call dokey(getkey()). See the description of getevent for more details.
  • Some scripts have been added to take advantage of the new commands: draw-lines.py, flood-fill.py, move-object.py and move-selection.py.
  • New patterns: ComputerArt.rle, CrittersCircle.rle, CrittersOscillators.rle, HPP.rle, HPP_large.rle, Sand-Test.rle, TMGas.rle, TMGas_largeWithHole.rle, TripATron.rle, TripATron_BlockAligned.rle.
  • Scripts that create table/tree files have been moved into Scripts/Python/Rule-Generators.
  • Langtons-Ant-gen.py now accepts turns 'U' and 'N' (U-turn and no-turn) as well as 'L' and 'R'.
  • The hash() command uses a better hash function in a two-state universe.
  • Pattern rendering is faster at scales 1:16 and 1:8, especially in the Linux app.
  • The mouse wheel now zooms in/out from the current cursor location rather than the middle of the viewport.
  • Patterns can be saved as gzipped files (*.rle.gz or *.mc.gz).
  • If an algorithm can save patterns in macrocell format (currently all except QuickLife) then the Save Pattern dialog now prefers that format over RLE; ie. the file type order is *.mc, *.mc.gz, *.rle, *.rle.gz.
  • While waiting for a paste click, the keyboard shortcuts for flipping or rotating a selection now modify the paste pattern rather than the current selection.
  • Fixed a bug in Win and Linux apps that prevented keyboard shortcuts being used while waiting for paste click.
  • Pasted patterns are no longer truncated if the RLE header info is incorrect.
  • Quitting Win app no longer clears clipboard.
  • Fixed unwanted cursor changes while running a script.
  • Fixed bug if layer was changed while recording a timeline.
  • Fixed bug in EmulateMargolus.py when using square4_* neighborhoods.
  • Removed emulate-Margolus-table.py script (use RuleTableToTree.py instead).
  • Fixed bug that could result in all buttons and menus being disabled after hitting the tool bar's Reset button.
  • Fixed cursor problems if shift key is used in a keyboard shortcut.
  • The Mac app now runs on Lion (10.7). There are two Mac apps: a 64-bit version for 10.6 and later (based on Cocoa), and a 32-bit version for 10.4 and 10.5 (based on Carbon).

Changes in version 2.2 (released November 2010)

  • Golly supports bounded grids with various topologies (plane, torus, Klein bottle, etc.). Such grids are created by adding a special suffix to the usual rule string. The details are in Help > Bounded Grids.
  • Two new script commands, getwidth and getheight, return the size of the current grid.
  • The new scripts, make-torus.py and make-torus.lua, can be used to convert the current selection into a toroidal universe.
  • Any BOARD and WRAP settings in an MCell file are now obeyed (e.g. Bloomerang.mcl).
  • Golly can record and play back a pattern's "timeline", a sequence of steps saved by the new Start Recording item in the Control menu. Use the Delete Timeline item to delete a timeline. Timelines are supported by all the hashlife-based algorithms (ie. all except QuickLife).
  • Show Timeline in the View menu toggles the new timeline bar below the viewport window.
  • If a timeline exists when you save a .mc file then all the steps will be stored in the file. On opening such a file, Golly will load the timeline and automatically show the timeline bar.
  • Multi-color icons are supported and allow both icon and color information to be stored in the one file (more details here).
  • Rule tables now support hexagonal and oneDimensional neighborhoods and the permute symmetry.
  • Added a section on naming conventions for .table and .tree files.
  • Added a new Python script, make-ruletree.py, that allows you to write rules in Python and have them installed in the form of .tree files. See the comments at the top of the script.
  • Added RuleTableToTree.py for converting rule tables to trees. It provides emulation for several neighborhoods not natively supported by Golly: triangularVonNeumann, triangularMoore, Margolus, etc. More details here.
  • New Turmite scripts, e.g. Turmite-gen.py, for generating rule trees and icons for relative- and absolute-movement turmites on square, hexagonal and triangular grids.
  • The goto.py script is much faster (thanks to PM 2Ring).
  • Hitting escape aborts a script that has called a lengthy run() or step() command.
  • Langtons-Ant.table has been replaced with Langtons-Ant.tree. The new rule is faster, handles multiple ants correctly, and matches most other implementations of this CA.
  • Reorganized the Patterns folder: moved Conway's Life patterns into Life subfolder, moved rule subfolders out of Other-Rules to top level under Patterns, added Life-Like folder.
  • Added new Turmite patterns, e.g. WormTrails.rle.
  • Other new patterns: golly-ants.rle, Langtons-Ant.rle, JvN-loop-replicator.rle.gz, Herschel-conduit-stamp-collection.rle, Boustrophedon-replicator.rle.
  • Increased the maximum base step from 10,000 to 2,000,000,000.
  • Help > Keyboard Shortcuts lists unassigned actions at the end.
  • The drawing state can be changed by creating keyboard shortcuts for two new actions called Next Higher State and Next Lower State (see Preferences > Keyboard).
  • You can turn off the beep sound by unticking the option at the bottom of Preferences > Edit.
  • Loading a pattern won't proceed if the "save changes" dialog appears and you select Save but then decide to cancel the "save pattern" dialog.
  • Fixed bug that caused cells to be created in the wrong location when editing very large patterns.
  • Fixed bug drawing incorrect selection rectangle if very large.
  • Fixed cursor problem if the shift key is used in a keyboard shortcut to open a dialog/window.
  • Fixed weird bug on Mac that could cause the viewport to lose keyboard focus after clicking in the layer bar's "delete layer" button.
  • Fixed undo history getting out of sync if you tried to reset to a saved starting pattern that had been deleted.
  • Fixed a bug drawing incorrect icons when layers are stacked.
  • Fixed a bug not updating the paste image when colors are inverted.
  • Fixed a problem with the hash() command in a multi-state universe.
  • Fixed problems using a keyboard shortcut or menu command while a script is running.
  • Dropped support for Mac OS 10.3.9.

Changes in version 2.1 (released September 2009)

  • Golly can download patterns, rules and scripts from various online archives. You can change the location of downloaded files using the new button at the bottom of Preferences > File.
  • Zip files can be opened and processed as described here.
  • If the mouse moves over a link in the help window then the link reference is displayed at the bottom of the window. Ditto for links in the Set Rule dialog.
  • The algorithm info in the Set Rule dialog can now be accessed from the new Algorithms help item.
  • Translucent buttons for speed/scale/scroll functions now appear in a corner of the viewport whenever the mouse moves over that corner. The initial location is the top left corner, but you can use Preferences > View to specify any other corner or disable the buttons.
  • Layer bar buttons now show each layer's name rather than its numeric position.
  • New rules: Codd2, Devore, DLA, Ed-rep, LifeHistory, Perrier, Sand.
  • New patterns in Other-Rules/, Other-Rules/Codd/, Other-Rules/Codd/Devore/, Other-Rules/Margolus/, Loops/.
  • New scripts: FredkinModN-gen.py, make-Devore-tape.py, Margolus/emulate-Margolus-table.py, Margolus/convert-MCell-string.py.
  • All Python scripts now need to explicitly import the golly module. This wasn't strictly necessary in previous versions, but only because it was an undesirable side-effect of the way Golly ran scripts.
  • The open command can now be used to run a given Python script.
  • New scripting commands: opendialog, savedialog, getclipstr, setclipstr, getdir, setdir.
  • The appdir and datadir commands are deprecated; use the new getdir command.
  • The color of dead cells (state 0) is now handled like all other states, so it's possible for each algorithm/rule to have a different background color.
  • The setcolors and getcolors commands can be used to set/get the color of state 0.
  • Golly restores a layer's default colors whenever you create a new pattern or open a pattern file (and not just if the algorithm or rule changes). If you have any scripts that use setcolors then make sure it is called after calling new/open.
  • The base step can now be changed temporarily via the new Set Base Step dialog in the Control menu. Golly will restore the default base step (set in Preferences > Control) when you create a new pattern, open a pattern file, or switch to a different algorithm.
  • The setbase command also changes the base step temporarily, so if you have any scripts that use setbase then make sure it is called after calling new/open/setrule/setalgo.
  • The setoption/getoption commands can use "drawingstate" to set/get the edit bar's current drawing state, and they can use "restoreview" to set/get the state of the "Reset/Undo will restore view" option set in Preferences > View.
  • Paste now supports "And" mode.
  • The RLE reader allows alphabetic characters other than "o" to represent live cells.
  • Menu items can show single-character keyboard shortcuts.
  • When a lexicon pattern is loaded, Golly automatically switches the current rule to B3/S23 (and changes the algorithm to QuickLife, if necessary).
  • Fixed a bug with Random Fill. Golly wasn't initializing the seed, so the internal rand() calls were returning the same sequence of "random" integers each time!
  • Fixed a bug that prevented the getkey command from returning uppercase letters.
  • Fixed oscar.pl/py to handle B0-and-not-S8 rules correctly (they no longer report some spaceships to be stable patterns).
  • Fixed a couple of bugs when duplicating a layer's undo/redo history.
  • Fixed crash in Mac app if a script saved a pattern and the progress dialog appeared.

Changes in version 2.0 (released December 2008)

  • Golly now supports multiple algorithms and multi-state universes (up to 256 states).
  • The Generations algorithm supports an entire family of new rules, including Brian's Brain (/2/3), Star Wars (345/2/4), and Transers (345/26/5).
  • The JvN algorithm implements John von Neumann's classic 29-state CA, plus a couple of 32-state variants created by Renato Nobili and Tim Hutton. See Patterns/JvN for a variety of self-replicators.
  • The RuleTable and RuleTree algorithms allow you to add new rules by creating .table and .tree files and storing them in the Rules folder or your rules folder. A number of example rules are supplied, including Langtons-Loops, Evoloop, LifeOnTheEdge and WireWorld.
  • The tool bar has a new button for switching algorithms, or you can use the Set Algorithm submenu in the Control menu. The Use Hashing option has been removed.
  • The Control > Set Rule dialog also has a menu for changing the current algorithm. A help button can be used to expand the dialog and display information about the current algorithm, along with examples of the rules it supports.
  • Golly can read some MCell files (if an algorithm supports the given rule).
  • The ten layer-specific colors have been replaced by a more flexible approach to cope with multi-state universes. Each algorithm has a default color scheme that can be changed in Preferences > Color.
  • Each algorithm also has a default set of icons, small bitmaps that are only drawn at scales 1:8 and 1:16, and only if the Show Cell Icons option (in the View menu) is ticked. The default icons can be changed by using the Load Icons button in Preferences > Color.
  • Rule-specific colors and icons can be created by adding suitably named .colors and .icons files to the Rules folder or your rules folder. Golly looks for these files whenever it switches to a new rule.
  • The Layer > Set Layer Colors dialog can change one or more colors used by the current layer (and its clones). These changes are temporary and only remain in effect while the layer exists, or until the layer's algorithm or rule changes.
  • The View > Swap Cell Colors option has been changed to Invert Colors.
  • New script commands have been added to support the above changes: setalgo, getalgo, numalgos, numstates, join, setcolors and getcolors.
  • Some script commands have been modified to handle multi-state patterns. Lua users should read the section on cell arrays. Python users should read the section on cell lists.
  • The getrule command now returns a canonical rule string.
  • The setcursor/getcursor commands now accept/return strings.
  • Modified oscar.pl to use arbitrarily big integers.
  • It's now possible to open a pattern or run a script from the Help window by clicking on special links. For example, open golly-ticker.rle or run bricklayer.py.
  • Diagonal scrolling is supported. Open Preferences > Keyboard and assign keys to the new scrolling actions: Scroll NE/NW/SE/SW.
  • A new check box in Preferences > View can tell Reset/Undo not to restore the view.
  • View > Show Edit Bar toggles the new edit bar. The cursor mode buttons have been moved from the tool bar into the edit bar.
  • View > Show All States toggles the display of colors and icons for all states in the current universe. A box is drawn around the current drawing state.
  • Help > File Formats describes the various file formats used by Golly.
  • Rendering speed in the Mac and Linux apps has been improved.
  • Fixed a problem with ampersands not being displayed in the recent pattern/script menus.
  • Fixed a bug in the Linux/GTK app if a recent pattern/script path contained an underscore.
  • The Linux and Win apps require Perl 5.10 or later to run .pl scripts (older Perl versions are not binary compatible).
  • The Linux/X11 app is no longer supported due to limitations in wxX11.

Changes in version 1.4 (released May 2008)

  • Editing and other actions are now allowed while generating a pattern.
  • Golly saves files in the standard user-specific data directory on each platform rather than in the application directory. However, you can still keep the GollyPrefs file in the application directory if you prefer that option.
  • Right-click or control-click on a pattern/script file to open the file in a text editor. Use the new button in Preferences > File to select your preferred text editor.
  • Pasting a clipboard pattern can now change to the specified rule, depending on the option set in Preferences > Edit.
  • The Preferences dialog can be opened from the help window by clicking on special links like the examples above.
  • Added Reset button to tool bar and Duplicate Layer button to layer bar.
  • A duplicated layer now gets a copy of the original layer's undo/redo history.
  • Improved the automatic detection of Perl/Python code used by Run Clipboard.
  • Added help command to open given HTML file in help window.
  • A warning is displayed if a bad rule string is detected while loading a pattern.
  • Added support for reading WinLifeSearch output.
  • An error message is displayed if you try to load a JPEG file.
  • Fixed some problems if you quit Golly while running a script.
  • Fixed problem shrinking selection while generating a pattern.
  • Fixed "Rules differ" warning when undoing/redoing generating changes using hashing.
  • Fixed problems with incorrect file selections in Win app's directory pane.
  • Fixed bug in Mac app's activate event handler.
  • Fixed bug in Linux/GTK app that prevented using shift-space as a keyboard shortcut.
  • Mac app allows option-E/I/N/U/` to be used as keyboard shortcuts.
  • Golly can be built for 64-bit platforms.

Changes in version 1.3 (released November 2007)

  • Added unlimited undo/redo; see the Edit Menu help for details. For consistency with Undo, the Reset item now restores the starting selection and layer name.
  • Keyboard shortcuts are now configurable using Preferences > Keyboard. Note that you can also specify key combinations to open a pattern, run a script, or show any HTML file in the help window.
  • Golly can be scripted using Perl.
  • Added pop-plot.pl/py to the Scripts folder for creating population plots.
  • The metafier.py script now creates the metafied pattern in a separate layer.
  • Added getstring command for getting user input via a dialog box (glife's getstring function still exists but is deprecated).
  • Added hash command to speed up oscar.pl/py.
  • The parse and transform commands have optional parameters.
  • A script is aborted if a progress dialog appears and you hit Cancel.
  • The Open/Run Recent submenus show relative paths for files inside the Golly folder.
  • Added a Clear Missing Files item to the Open/Run Recent submenus.
  • The Control menu's Go and Stop items have been replaced by a single Start/Stop item for consistency with the tool bar's start/stop button.
  • The Control menu has a Set Generation item for changing the generation count, or you can click in the "Generation=..." text in the status bar. Scripts can use the new setgen command.
  • Flip operations are much faster.
  • The About box uses Brice Due's Golly ticker.
  • Reduced chances of out-of-memory error while loading a large .mc file.
  • Fixed crash if a pattern update occurred while saving a .mc file.
  • Fixed bug pasting a macrocell pattern.
  • Fixed bug reading an empty macrocell pattern.
  • Fixed bug not marking a layer as modified after clearing the entire pattern.
  • Fixed bug if apostrophe was in Python script path or file name.
  • Fixed drawing problems on Mac OS 10.3.9.

Changes in version 1.2 (released April 2007)

  • Golly supports multiple layers; see the new Layer Menu help for details.
  • Added layer-related scripting commands. See heisenburp.py and envelope.py in the Scripts folder for how these commands can be used.
  • Added other useful scripting commands: exit, check and note.
  • The putcells command has optional parameters, including a new mode parameter.
  • Clicked lexicon patterns are loaded into a separate "lexicon" layer (and the clipboard is no longer changed).
  • If a pattern has been modified then its layer name is prefixed with an asterisk and a "save changes" dialog will appear before certain actions, such as opening a pattern file or quitting Golly. The dialog can be disabled via check boxes in Preferences > Layer.
  • Scrolling is optional if the pencil/cross/hand cursor is dragged outside the view window; see Preferences > Edit.
  • The hand cursor no longer has a pointing finger.
  • A .py file selected via Open Pattern is run as a script.
  • If golly-start.py exists in the same folder as the application then it is automatically executed when Golly starts up.
  • New tool bar buttons, including a single start/stop button.
  • Reset and Use Hashing can be selected while a pattern is generating.
  • Renamed Flip Up-Down to Flip Top-Bottom.
  • GTK app no longer does unnecessary buffered drawing.
  • X11 app has a vertical tool bar which can be toggled.
  • Mac app has a creator code (GoLy) and .mc/rle files are saved with an appropriate type and creator.
  • Fixed a bug if Win app given a long-running script on command line.
  • Fixed a bug in the advance and evolve commands if using hashing with Wolfram rule.
  • Fixed a delay bug.

Changes in version 1.1 (released November 2006)

  • Added Save Extended RLE option (initially ticked) to the File menu. An extended RLE file stores the pattern position and generation count (if > 0) so they can be restored when the file is loaded.
  • Macrocell files also store the generation count if > 0.
  • Non-extended RLE files are now loaded so that 0,0 is at the top left corner of the pattern rather than in the middle of the pattern.
  • Golly can read BMP/GIF/PNG/TIFF files and paste bitmap data. All non-white pixels become live cells.
  • Golly can read pattern files using David Bell's dblife format.
  • Starting patterns are saved in a temporary file rather than in memory. This is much faster when hashing (saving a macrocell file is very quick).
  • Random Fill is much faster in typical cases.
  • Escape key can be used to stop generating.
  • Numerous additions and updates to the pattern collection.
  • Added fuse-watcher.py, metafier.py and shift.py to the Scripts folder.
  • More mouse interaction is allowed while a script is running. A script can be aborted by clicking the stop button in the tool bar or by selecting Stop in the Control menu.
  • Resizing the help window no longer changes the scroll position.
  • Fixed a bug loading huge macrocell files.
  • Fixed an obscure bug in the non-hashing algorithm.
  • Path to Scripts folder is only added to Python's sys.path once.
  • Fixed rect bug in Scripts/glife/__init__.py (thanks to Dan Hoey).
  • Golly's code can be compiled with a Unicode build of wxWidgets.

Changes in version 1.0 (released June 2006)

  • Added Python script support; see the new Python Scripting help.
  • Golly is available for Linux/GTK.
  • Mac app is a Universal Binary (4 times faster on an Intel Mac).
  • Added ability to change various colors via Preferences > Color. The Black on White option has been replaced by Swap Cell Colors.
  • Increased the base step limit from 100 to 10,000.
  • Added Show Hash Info option to the Control menu.
  • Added Show Exact Numbers option to the View menu.
  • Save Pattern preserves comments when writing to an existing file.
  • Added tool bar buttons for toggling patterns and scripts.
  • Included the latest release of the Life Lexicon.
  • Renamed Flip Horizontally/Vertically to Flip Up-Down/Left-Right.
  • Fixed disabled menu item bug after closing a modal dialog on Mac OS 10.4.
  • Fixed a couple of rule-related bugs in the non-hashing algorithm.
  • Fixed crash due to very long rule strings.
  • Fixed paste positioning bugs at scale 1:2.
  • Fixed error if Win app is closed while script is running.
  • Fixed problem if Win app is closed when window(s) minimized.

Changes in version 0.95 (released January 2006)

  • Stephen Silver's Life Lexicon has been integrated into the help. Note that clicking on a lexicon pattern loads it into the Golly window.
  • Added an Open Recent submenu to the File menu.
  • Added Show Patterns and Change Folder to the File menu.
  • Added a Preferences dialog to the File menu (app menu on Mac).
  • Added more items to the Edit menu: Clear Outside, Shrink Selection, Random Fill, Flip Vertically, Flip Horizontally, Rotate Clockwise and Rotate Anticlockwise.
  • The clipboard pattern is displayed when pasting.
  • Pasting large, sparse patterns is much faster when using Or mode.
  • Added more items to the View menu: Fit Selection, Restore Origin and Set Scale.
  • The thumb scroll range is adjustable (see Preferences > View).
  • The Reset item now restores the rule, scale, location, step size and hashing option to the values they had at generation 0.
  • Removed Max Hash Memory from Control menu (now set in Preferences > Control).
  • The Rule dialog lets you select/add/delete named rules. If a rule has a name then it's shown in the main window's title bar.
  • Hit control-space to advance the selection, or shift-space to advance everything outside the selection. The generation count will not change.
  • The delete key is a shortcut for Clear, or shift-delete for Clear Outside.
  • F5 to F9 can be used to set cursor modes.
  • Hit "s" to shrink the selection and fit it in the current view.
  • Hit "0" to change the origin to the cell under the cursor.
  • Hit "9" to restore the true origin.
  • Hit "6" to set the scale to 1:16.
  • Hit "," to open the Preferences dialog.
  • If the help window is in front, hit "+" and "-" to change the font size.
  • While dragging the mouse to make (or modify) a selection, the escape key can be used to cancel the operation and restore the original selection.
  • The escape key can no longer be used to stop generating.
  • In zoom in/out mode, right-click or control-click zooms in the opposite direction.
  • The mouse wheel can be used for zooming, regardless of cursor mode.
  • Commas are used to make large status bar numbers more readable.
  • Fixed a hashing bug that could cause advancing by the wrong step.
  • Fixed a bug in Mac app when returning from full screen mode.
  • Fixed a bug in Win app that prevented space bar being used to stop generating.
  • Fixed Win app's cross cursor (now visible on a black background).

Changes in version 0.91 (released October 2005)

  • Return key can be used to start/stop generating.
  • Space bar can be used to stop generating.
  • Win app puts CR+LF in clipboard data.
  • Fixed occasional bug when +/- pressed while hashing.

Changes in version 0.9 (released October 2005)

  • Implemented pattern saving (as RLE or macrocell format).
  • Implemented cell editing and selecting.
  • Implemented scrolling via hand cursor.
  • Edit menu has a Cursor Mode submenu (items match new tool bar buttons).
  • Hit "c" to cycle through all cursors.
  • Win app can now read gzipped pattern files.
  • Can now display comments in pattern files.
  • Added Patterns folder to distribution.
  • Toggling the hashing option doesn't change the pattern or generation count.
  • The Reset item is smarter about restoring the starting pattern.
  • Fixed colored frame after dropping pattern file onto Mac app's main window.
  • Fixed horizontal scroll bar problem in Mac app's help window.
  • The help window's cursor now gets updated while generating.
  • Fixed problem with location of help window in X11 app.
  • Added limited clipboard support to X11 app.
  • Golly has a new app icon based on Galaxy, a period-8 oscillator.

Changes in version 0.2 (released July 2005)

  • Added support for B0 rules.
  • Golly comes to the front after dropping a pattern file onto main window.
  • The help window can move behind the main window in Win/X11 apps.
  • Text in the help window can be selected and copied to the clipboard.
  • Fixed keyboard shortcuts in the help window.
  • Fixed RLE rule problem in Mac app.
  • Fixed menu and tool bar update problems in Mac/Win apps.
  • Fixed some cosmetic problems in Win app.

Initial version 0.1 released July 2005 golly-3.3-src/Help/changes.html0000644000175000017500000015353513543255652013427 00000000000000 Golly Help: Changes

Changes in version 3.3 (September 2019)

  • Major speed improvements to 3D.lua via custom-purpose ovtable commands.
  • 3D.lua now natively supports cell history with fading.
  • Added a new gplus module called NewCA.lua which makes it easy to write scripts that implement new types of cellular automata.
  • Two new scripts show how to use NewCA.lua: 1D.lua supports one-dimensional CA rules, including all of Wolfram's 256 elementary rules, as well as totalistic rules with up to 4 states and a maximum range of 4. Margolus.lua lets you explore rules using the Margolus neighborhood.
  • Updated Lua to version 5.3.5.
  • The optimize overlay command now returns the minimum non-zero alpha bounding box of the clip.
  • The blend overlay command now has a faster blend mode ("blend 2") which should be used when the destination is opaque.
  • Some fixes and improvements to the replace overlay command.
  • Performance improvements to the drawcells overlay command.
  • The C parameter in a Larger than Life rule can now specify up to 256 states.
  • Fixed a bug where the canonical form of Generations rules in MAP format was incorrect.
  • Fixed a bug caused by simultaneous clicks of different mouse buttons.
  • Fixed flickering selection size message when extending the selection on Windows.
  • Fixed a performance bug in QuickLife where changing the rule each generation caused a significant slowdown.
  • Fixed bugs in the Mac app that caused memory leaks when running Lua or Python scripts.
  • Fixed a bug that could cause "PyRun_SimpleString failed!" warnings when running Python scripts.
  • Fixed a bug in Larger than Life that could cause a cut/copy operation to create an empty clipboard pattern.
  • Fixed a fatal "bad increment" error by limiting the size of the step exponent if necessary.
  • Fixed a crash caused by buggy NVIDIA drivers.

Changes in version 3.2 (released July 2018)

Changes in version 3.1 (released October 2017)

  • Fixed a couple of bugs in the Larger than Life algorithm that caused Golly to crash.
  • Scripts can call g.setoption("showprogress",0) to prevent the progress dialog from appearing (useful for scripts that you want to run in the background).
  • Updated the Life Lexicon to release 27.

Changes in version 3.0 (released August 2017)

  • Golly has a new algorithm that supports the Larger than Life family of rules.
  • This version introduces a new feature called the overlay. Lua scripts can call a new overlay command to create, modify and delete the overlay.
  • There are three new items at the top of the Layer menu: Save Overlay..., Show Overlay and Delete Overlay.
  • The getevent command can detect a number of new events: a mouse click in the overlay, the release of a mouse button (anywhere), zooming in/out via the mouse wheel (either in the current layer or in the overlay), and the release of a key.
  • The setoption command recognizes two new options: "showbuttons" (with a value from 0 to 4) for controlling the position of the translucent buttons, and "showoverlay" (with a value of 0 or 1) for controlling the appearance of the overlay.
  • The getview command now takes an optional parameter so scripts can get the pixel dimensions of a specified layer.
  • The dialog boxes displayed by the note and warn commands now have a Cancel button that can be used to abort the script.
  • The new os command allows scripts to detect the current operating system.
  • The new getinfo command can be used to get the comments from the current pattern.
  • The new getpath command can be used to get the pathname of the current pattern.
  • The new millisecs command allows Lua scripts to get the elapsed time since Golly started up.
  • A new version of pop-plot.lua creates an overlay to display a much nicer looking plot.
  • The new hexgrid.lua script creates an overlay to display a true hexagonal grid over a layer that uses a rule with a hexagonal neighborhood.
  • The new lifeviewer.lua script creates an overlay to display patterns like LifeViewer with history and smooth non-integer scaling and rotation.
  • The new overlay-demo.lua script demonstrates most of the overlay functions.
  • The new browse-patterns.lua script allows you to browse through patterns in a folder manually or automatically.
  • The new breakout.lua script shows how to use the overlay functions together to create a working game.
  • The new toLife.lua and toLifeHistory.lua scripts make it easy to convert LifeHistory patterns to Life and vice versa.
  • The flood-fill.lua script uses a faster scanline algorithm.
  • The move-*.lua/py scripts now wait for the mouse button to be released instead of waiting for a second click.
  • Added support for MAP rules to QuickLife, HashLife and Generations.
  • QuickLife, HashLife and Generations now support much longer rule names.
  • Non-totalistic rules containing B0 are now supported.
  • The Generations algorithm now supports Hex, Von Neumann and non-totalistic Moore neighborhoods.
  • Pattern rendering is significantly faster when zoomed in.
  • Drawing cell borders when zoomed in > 2x is now controlled by a View Preference: "Zoomed cells have borders".
  • File > Open Clipboard will center the given pattern within a bounded grid.
  • Fixed bug in Linux app that caused buttons to lose their bitmaps.
  • Fixed bug that could result in a "Bug detected in SyncUndoHistory!" warning.
  • Fixed bugs that could occur when undoing a script that called reset().
  • Fixed a crash caused by bad state value in a rule table.
  • Fixed a rare crash that could occur while rendering a generating pattern.
  • Fixed a crash that could occur if Golly was quit during pattern generation.
  • Fixed a bug that prevented Wolfram rules containing the digit 9.
  • The Life Lexicon has had a major update.
  • The Banks, Codd, Devore, and JvN folders have moved into a new top-level "Self-Rep" folder, to emphasize their common focus on self-replication.

Changes in version 2.8 (released August 2016)

  • Golly no longer supports Perl scripting. In its place we've added support for Lua using a statically linked interpreter, so no need to download an installer or set a path to a shared library. See Lua Scripting for all the details.
  • QuickLife and HashLife now support non-totalistic rules. A number of interesting examples can be found in the new Patterns/Non-Totalistic folder.
  • OpenGL is used for rendering patterns.
  • Timers are used to control pattern generation and timeline recording/playback.
  • The File menu items Show Patterns and Show Scripts have been replaced by a single Show Files item for consistency with the recommended way to organize your Golly folder.
  • The shrink command has an optional flag that can remove the selection if it has no live cells (the default is to leave the selection unchanged).
  • Two new scripting commands, setview and getview, can be used to set/get the pixel dimensions of the viewport.
  • The View menu has a new Smarter Scaling option for displaying correctly colored patterns when zoomed out at scales from 2:1 to 16:1.
  • The Buffered item has been removed from the View menu.
  • Paste patterns are covered with a translucent rectangle instead of being enclosed by thin border lines.
  • Correct colors/icons are now displayed when pasting a pattern with a rule different to the current layer's rule.
  • Better reporting of errors in a .rule file.
  • Fixed a bug that could result in a spurious error message when loading a .rule file without any TABLE or TREE section.
  • Fixed a crash on Linux when typing in the Keyboard preferences.
  • Fixed some bugs that could cause Reset/Undo to restore an incorrect pattern.
  • Fixed a timeline bug that could show incorrect population for a bounded grid.
  • bgolly now supports rules that specify bounded grids.
  • Fixed a bug in bgolly that prevented use of the RuleLoader algorithm.
  • bgolly has a new -s option (or --search) for specifying the folder in which the RuleLoader algorithm will look for .rule files before looking in the supplied Rules folder. For example, assuming SlowLife.rule is in a folder called My-rules, you could type a command like this:

    bgolly -a RuleLoader -s My-rules/ -r SlowLife My-patterns/foo.rle

Changes in version 2.7 (released May 2015)

  • The middle mouse button can now be used for panning, regardless of the current cursor mode.
  • Fixed potential crash when pasting a text pattern into any hash-based algorithm.
  • Fixed crash on Mac OS 10.9 when opening a modal dialog like Save Pattern.
  • Fixed crash on Windows 8 when opening the Set Rule dialog.
  • Fixed bug in QuickLife algorithm that could cause cells at the bottom/left edges of the viewport to disappear every odd generation.
  • Fixed bug in QuickLife algorithm that could cause the selection rectangle to appear offset by one pixel (left or right).
  • The shift.pl/py scripts save the given parameters for the next run.
  • The evolve command aborts the current script with an error message if the given number of generations is negative.
  • Fixed minor problem with the Fit Pattern/Selection menu commands not centering a pattern/selection accurately in some cases. Ditto for the fit and fitsel script commands. The visrect script command is also more accurate.
  • Fixed bug that could cause Undo to fail due to a temporary macrocell file containing comment lines not prefixed with #C.
  • Start-up message now shows if this version of Golly is 32-bit or 64-bit.

Changes in version 2.6 (released December 2013)

  • Fixed menu problems on Ubuntu when using Unity.
  • Fixed a nasty bug that could cause Golly to crash when doing a paste.
  • Fixed a bug that could cause the paste image to disappear after a flip/rotate.
  • Fixed bugs in Mac app caused by non-ASCII characters in some file paths.
  • Fixed a problem that prevented Golly starting up on Mac OS 10.9.
  • Tool bar buttons are no longer disabled when the main window is inactive.
  • The save settings in Preferences > Layer are now obeyed by scripts. For example, let's assume you've ticked the option to be asked to save changes on creating a new pattern. If the current layer has changes and you run a script that calls new() then you'll get the standard dialog asking if you want to save those changes. If you cancel the dialog then the script is aborted.
  • To avoid potential data loss, you now get a warning if you save a non-starting generation and earlier changes exist. The warning can be disabled in Preferences > Layer.
  • Created an online archive for very large patterns.

Changes in version 2.5 (released June 2013)

  • This version introduces a new rule format. A file in the new format has a .rule extension and contains all the information about the rule: its name, description, table/tree data, and any color/icon information. More details here.
  • The RuleTable and RuleTree algorithms have been replaced by a new algorithm called RuleLoader. If asked to load a rule called "Foo", RuleLoader will look for Foo.rule first, then Foo.table, then Foo.tree.
  • The Control menu has a new command called Convert Old Rules that can be used to convert all your old .table/tree/colors/icons files into new .rule files (it won't overwrite any existing .rule files). After the conversion finishes you're given the option of deleting all the old files.
  • If File > Open Clipboard or Edit > Paste sees clipboard text starting with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder and switch to that rule.
  • All Python scripts that created a .tree file (and possibly .colors/icons files) now create a .rule file containing the same tree data (and any color/icon info).
  • Two new scripts allow Golly to be used as an icon editor. First, run icon-importer.py to import any icons for the current rule and display their bitmaps in a new layer for you to edit. When you've finished, run icon-exporter.py to extract the icon images and create or update the @ICONS section in the appropriate .rule file, then display the icons in a separate test layer.
  • A script has been added: goto_expression.py. It works like goto.py, except that it also accepts expressions. An example of an "expression" is "17*(2^(3*143)+2^(2*3*27))".
  • The status bar now displays quantities larger than 10308 in scientific notation. Golly can easily exceed this in both the Generation and Population statistics. For example, open the pattern puffer-train.rle, then run the script goto_expression.py and enter "f10^2000".
  • Added a new pattern: partial-constructor.mc.gz.
  • Patterns can now be displayed at scale 1:32. If you want to use that scale when creating a new pattern then choose the appropriate pop-up menu option in Preferences > File.
  • Support for monochrome icons has been extended to allow grayscale icons, where shades of gray can be used to do anti-aliasing. See the icons in WireWorld.rule for a good example. Most of the default icons are now grayscale bitmaps.
  • The current directory is now inserted at the start of sys.path for Python scripts.
  • The "Load Icons" button in Preferences > Color has been removed (it's no longer possible to change an algorithm's default icons).
  • The RuleTableToTree program is no longer included (you can use the RuleTableToTree.py script instead).
  • Fixed bug in Linux app: the shift key wasn't toggling cursor mode.
  • Fixed bug in Linux app: the space key wouldn't stop a pattern generating.
  • Fixed bug in Mac app: resizing the window could cause the sash position to change unexpectedly.
  • Fixed bug in Mac app: the first keyboard shortcut after a Paste command might be ignored.

Changes in version 2.4 (released June 2012)

  • Fixed bug that prevented 64-bit Windows app using more than 4GB of hash memory.
  • Fixed bug that caused corrupted macrocell files if saved with timeline data.
  • Fixed bug in Langtons-Ant.tree that had ants colliding incorrectly.
  • Fixed Mac app crashing if user's language setting is non-English.
  • Clipboard data on the Mac now uses LF as the end-of-line character rather than CR.
  • A pending paste is aborted if the main window becomes inactive.
  • Error messages from each algorithm are shown if a pattern file can't be loaded.

Changes in version 2.3 (released November 2011)

  • QuickLife and HashLife support rules using the von Neumann neighborhood or the hexagonal neighborhood. More details here.
  • The default icon for most rules is now a circular dot rather than a diamond. A diamond is the default icon for rules using the von Neumann neighborhood and a slanted hexagon is the default icon for rules using the hexagonal neighborhood.
  • A number of new script commands have been added to allow mouse interaction and better keyboard interaction: getevent, doevent and getxy. The getkey and dokey commands still work but are deprecated. In particular, there is no longer any need for scripts to call dokey(getkey()). See the description of getevent for more details.
  • Some scripts have been added to take advantage of the new commands: draw-lines.py, flood-fill.py, move-object.py and move-selection.py.
  • New patterns: ComputerArt.rle, CrittersCircle.rle, CrittersOscillators.rle, HPP.rle, HPP_large.rle, Sand-Test.rle, TMGas.rle, TMGas_largeWithHole.rle, TripATron.rle, TripATron_BlockAligned.rle.
  • Scripts that create table/tree files have been moved into Scripts/Python/Rule-Generators.
  • Langtons-Ant-gen.py now accepts turns 'U' and 'N' (U-turn and no-turn) as well as 'L' and 'R'.
  • The hash() command uses a better hash function in a two-state universe.
  • Pattern rendering is faster at scales 1:16 and 1:8, especially in the Linux app.
  • The mouse wheel now zooms in/out from the current cursor location rather than the middle of the viewport.
  • Patterns can be saved as gzipped files (*.rle.gz or *.mc.gz).
  • If an algorithm can save patterns in macrocell format then the Save Pattern dialog now prefers that format over RLE; ie. the file type order is *.mc, *.mc.gz, *.rle, *.rle.gz.
  • While waiting for a paste click, the keyboard shortcuts for flipping or rotating a selection now modify the paste pattern rather than the current selection.
  • Fixed a bug in Win and Linux apps that prevented keyboard shortcuts being used while waiting for paste click.
  • Pasted patterns are no longer truncated if the RLE header info is incorrect.
  • Quitting Win app no longer clears clipboard.
  • Fixed unwanted cursor changes while running a script.
  • Fixed bug if layer was changed while recording a timeline.
  • Fixed bug in EmulateMargolus.py when using square4_* neighborhoods.
  • Removed emulate-Margolus-table.py script (use RuleTableToTree.py instead).
  • Fixed bug that could result in all buttons and menus being disabled after hitting the tool bar's Reset button.
  • Fixed cursor problems if shift key is used in a keyboard shortcut.
  • The Mac app now runs on Lion (10.7). There are two Mac apps: a 64-bit version for 10.6 and later (based on Cocoa), and a 32-bit version for 10.4 and 10.5 (based on Carbon).

Changes in version 2.2 (released November 2010)

  • Golly supports bounded grids with various topologies (plane, torus, Klein bottle, etc.). Such grids are created by adding a special suffix to the usual rule string. The details are in Help > Bounded Grids.
  • Two new script commands, getwidth and getheight, return the size of the current grid.
  • The new scripts, make-torus.py and make-torus.lua, can be used to convert the current selection into a toroidal universe.
  • Any BOARD and WRAP settings in an MCell file are now obeyed (e.g. Bloomerang.mcl).
  • Golly can record and play back a pattern's "timeline", a sequence of steps saved by the new Start Recording item in the Control menu. Use the Delete Timeline item to delete a timeline. Timelines are supported by all the hashlife-based algorithms.
  • Show Timeline in the View menu toggles the new timeline bar below the viewport window.
  • If a timeline exists when you save a .mc file then all the steps will be stored in the file. On opening such a file, Golly will load the timeline and automatically show the timeline bar.
  • Multi-color icons are supported and allow both icon and color information to be stored in the one file (more details here).
  • Rule tables now support hexagonal and oneDimensional neighborhoods and the permute symmetry.
  • Added a section on naming conventions for .table and .tree files.
  • Added a new Python script, make-ruletree.py, that allows you to write rules in Python and have them installed in the form of .tree files. See the comments at the top of the script.
  • Added RuleTableToTree.py for converting rule tables to trees. It provides emulation for several neighborhoods not natively supported by Golly: triangularVonNeumann, triangularMoore, Margolus, etc. More details here.
  • New Turmite scripts, e.g. Turmite-gen.py, for generating rule trees and icons for relative- and absolute-movement turmites on square, hexagonal and triangular grids.
  • The goto.py script is much faster (thanks to PM 2Ring).
  • Hitting escape aborts a script that has called a lengthy run() or step() command.
  • Langtons-Ant.table has been replaced with Langtons-Ant.tree. The new rule is faster, handles multiple ants correctly, and matches most other implementations of this CA.
  • Reorganized the Patterns folder: moved Conway's Life patterns into Life subfolder, moved rule subfolders out of Other-Rules to top level under Patterns, added Life-Like folder.
  • Added new Turmite patterns, e.g. WormTrails.rle.
  • Other new patterns: golly-ants.rle, Langtons-Ant.rle, JvN-loop-replicator.rle.gz, h-to-h-collection-26Aug2017.zip, Boustrophedon-replicator.rle.
  • Increased the maximum base step from 10,000 to 2,000,000,000.
  • Help > Keyboard Shortcuts lists unassigned actions at the end.
  • The drawing state can be changed by creating keyboard shortcuts for two new actions called Next Higher State and Next Lower State (see Preferences > Keyboard).
  • You can turn off the beep sound by unticking the option at the bottom of Preferences > Edit.
  • Loading a pattern won't proceed if the "save changes" dialog appears and you select Save but then decide to cancel the "save pattern" dialog.
  • Fixed bug that caused cells to be created in the wrong location when editing very large patterns.
  • Fixed bug drawing incorrect selection rectangle if very large.
  • Fixed cursor problem if the shift key is used in a keyboard shortcut to open a dialog/window.
  • Fixed weird bug on Mac that could cause the viewport to lose keyboard focus after clicking in the layer bar's "delete layer" button.
  • Fixed undo history getting out of sync if you tried to reset to a saved starting pattern that had been deleted.
  • Fixed a bug drawing incorrect icons when layers are stacked.
  • Fixed a bug not updating the paste image when colors are inverted.
  • Fixed a problem with the hash() command in a multi-state universe.
  • Fixed problems using a keyboard shortcut or menu command while a script is running.
  • Dropped support for Mac OS 10.3.9.

Changes in version 2.1 (released September 2009)

  • Golly can download patterns, rules and scripts from various online archives. You can change the location of downloaded files using the new button at the bottom of Preferences > File.
  • Zip files can be opened and processed as described here.
  • If the mouse moves over a link in the help window then the link reference is displayed at the bottom of the window. Ditto for links in the Set Rule dialog.
  • The algorithm info in the Set Rule dialog can now be accessed from the new Algorithms help item.
  • Translucent buttons for speed/scale/scroll functions now appear in a corner of the viewport whenever the mouse moves over that corner. The initial location is the top left corner, but you can use Preferences > View to specify any other corner or disable the buttons.
  • Layer bar buttons now show each layer's name rather than its numeric position.
  • New rules: Codd2, Devore, DLA, Ed-rep, LifeHistory, Perrier, Sand.
  • New patterns in Other-Rules/, Self-Rep/Codd/, Self-Rep/Devore/, Margolus/, Loops/.
  • New scripts: FredkinModN-gen.py, make-Devore-tape.py, Margolus/emulate-Margolus-table.py, Margolus/convert-MCell-string.py.
  • All Python scripts now need to explicitly import the golly module. This wasn't strictly necessary in previous versions, but only because it was an undesirable side-effect of the way Golly ran scripts.
  • The open command can now be used to run a given Python script.
  • New scripting commands: opendialog, savedialog, getclipstr, setclipstr, getdir, setdir.
  • The appdir and datadir commands are deprecated; use the new getdir command.
  • The color of dead cells (state 0) is now handled like all other states, so it's possible for each algorithm/rule to have a different background color.
  • The setcolors and getcolors commands can be used to set/get the color of state 0.
  • Golly restores a layer's default colors whenever you create a new pattern or open a pattern file (and not just if the algorithm or rule changes). If you have any scripts that use setcolors then make sure it is called after calling new/open.
  • The base step can now be changed temporarily via the new Set Base Step dialog in the Control menu. Golly will restore the default base step (set in Preferences > Control) when you create a new pattern, open a pattern file, or switch to a different algorithm.
  • The setbase command also changes the base step temporarily, so if you have any scripts that use setbase then make sure it is called after calling new/open/setrule/setalgo.
  • The setoption/getoption commands can use "drawingstate" to set/get the edit bar's current drawing state, and they can use "restoreview" to set/get the state of the "Reset/Undo will restore view" option set in Preferences > View.
  • Paste now supports "And" mode.
  • The RLE reader allows alphabetic characters other than "o" to represent live cells.
  • Menu items can show single-character keyboard shortcuts.
  • When a lexicon pattern is loaded, Golly automatically switches the current rule to B3/S23 (and changes the algorithm to QuickLife, if necessary).
  • Fixed a bug with Random Fill. Golly wasn't initializing the seed, so the internal rand() calls were returning the same sequence of "random" integers each time!
  • Fixed a bug that prevented the getkey command from returning uppercase letters.
  • Fixed oscar.pl/py to handle B0-and-not-S8 rules correctly (they no longer report some spaceships to be stable patterns).
  • Fixed a couple of bugs when duplicating a layer's undo/redo history.
  • Fixed crash in Mac app if a script saved a pattern and the progress dialog appeared.

Changes in version 2.0 (released December 2008)

  • Golly now supports multiple algorithms and multi-state universes (up to 256 states).
  • The Generations algorithm supports an entire family of new rules, including Brian's Brain (/2/3), Star Wars (345/2/4), and Transers (345/26/5).
  • The JvN algorithm implements John von Neumann's classic 29-state CA, plus a couple of 32-state variants created by Renato Nobili and Tim Hutton. See Patterns/Self-Rep/JvN for a variety of self-replicators.
  • The RuleTable and RuleTree algorithms allow you to add new rules by creating .table and .tree files and storing them in the Rules folder or your rules folder. A number of example rules are supplied, including Langtons-Loops, Evoloop, LifeOnTheEdge and WireWorld.
  • The tool bar has a new button for switching algorithms, or you can use the Set Algorithm submenu in the Control menu. The Use Hashing option has been removed.
  • The Control > Set Rule dialog also has a menu for changing the current algorithm. A help button can be used to expand the dialog and display information about the current algorithm, along with examples of the rules it supports.
  • Golly can read some MCell files (if an algorithm supports the given rule).
  • The ten layer-specific colors have been replaced by a more flexible approach to cope with multi-state universes. Each algorithm has a default color scheme that can be changed in Preferences > Color.
  • Each algorithm also has a default set of icons, small bitmaps that are only drawn at scales 1:8 and 1:16, and only if the Show Cell Icons option (in the View menu) is ticked. The default icons can be changed by using the Load Icons button in Preferences > Color.
  • Rule-specific colors and icons can be created by adding suitably named .colors and .icons files to the Rules folder or your rules folder. Golly looks for these files whenever it switches to a new rule.
  • The Layer > Set Layer Colors dialog can change one or more colors used by the current layer (and its clones). These changes are temporary and only remain in effect while the layer exists, or until the layer's algorithm or rule changes.
  • The View > Swap Cell Colors option has been changed to Invert Colors.
  • New script commands have been added to support the above changes: setalgo, getalgo, numalgos, numstates, join, setcolors and getcolors.
  • Some script commands have been modified to handle multi-state patterns. Lua users should read the section on cell arrays. Python users should read the section on cell lists.
  • The getrule command now returns a canonical rule string.
  • The setcursor/getcursor commands now accept/return strings.
  • Modified oscar.pl to use arbitrarily big integers.
  • It's now possible to open a pattern or run a script from the Help window by clicking on special links. For example, open golly-ticker.rle or run bricklayer.py.
  • Diagonal scrolling is supported. Open Preferences > Keyboard and assign keys to the new scrolling actions: Scroll NE/NW/SE/SW.
  • A new check box in Preferences > View can tell Reset/Undo not to restore the view.
  • View > Show Edit Bar toggles the new edit bar. The cursor mode buttons have been moved from the tool bar into the edit bar.
  • View > Show All States toggles the display of colors and icons for all states in the current universe. A box is drawn around the current drawing state.
  • Help > File Formats describes the various file formats used by Golly.
  • Rendering speed in the Mac and Linux apps has been improved.
  • Fixed a problem with ampersands not being displayed in the recent pattern/script menus.
  • Fixed a bug in the Linux/GTK app if a recent pattern/script path contained an underscore.
  • The Linux and Win apps require Perl 5.10 or later to run .pl scripts (older Perl versions are not binary compatible).
  • The Linux/X11 app is no longer supported due to limitations in wxX11.

Changes in version 1.4 (released May 2008)

  • Editing and other actions are now allowed while generating a pattern.
  • Golly saves files in the standard user-specific data directory on each platform rather than in the application directory. However, you can still keep the GollyPrefs file in the application directory if you prefer that option.
  • Right-click or control-click on a pattern/script file to open the file in a text editor. Use the new button in Preferences > File to select your preferred text editor.
  • Pasting a clipboard pattern can now change to the specified rule, depending on the option set in Preferences > Edit.
  • The Preferences dialog can be opened from the help window by clicking on special links like the examples above.
  • Added Reset button to tool bar and Duplicate Layer button to layer bar.
  • A duplicated layer now gets a copy of the original layer's undo/redo history.
  • Improved the automatic detection of Perl/Python code used by Run Clipboard.
  • Added help command to open given HTML file in help window.
  • A warning is displayed if a bad rule string is detected while loading a pattern.
  • Added support for reading WinLifeSearch output.
  • An error message is displayed if you try to load a JPEG file.
  • Fixed some problems if you quit Golly while running a script.
  • Fixed problem shrinking selection while generating a pattern.
  • Fixed "Rules differ" warning when undoing/redoing generating changes using hashing.
  • Fixed problems with incorrect file selections in Win app's directory pane.
  • Fixed bug in Mac app's activate event handler.
  • Fixed bug in Linux/GTK app that prevented using shift-space as a keyboard shortcut.
  • Mac app allows option-E/I/N/U/` to be used as keyboard shortcuts.
  • Golly can be built for 64-bit platforms.

Changes in version 1.3 (released November 2007)

  • Added unlimited undo/redo; see the Edit Menu help for details. For consistency with Undo, the Reset item now restores the starting selection and layer name.
  • Keyboard shortcuts are now configurable using Preferences > Keyboard. Note that you can also specify key combinations to open a pattern, run a script, or show any HTML file in the help window.
  • Golly can be scripted using Perl.
  • Added pop-plot.pl/py to the Scripts folder for creating population plots.
  • The metafier.py script now creates the metafied pattern in a separate layer.
  • Added getstring command for getting user input via a dialog box (glife's getstring function still exists but is deprecated).
  • Added hash command to speed up oscar.pl/py.
  • The parse and transform commands have optional parameters.
  • A script is aborted if a progress dialog appears and you hit Cancel.
  • The Open/Run Recent submenus show relative paths for files inside the Golly folder.
  • Added a Clear Missing Files item to the Open/Run Recent submenus.
  • The Control menu's Go and Stop items have been replaced by a single Start/Stop item for consistency with the tool bar's start/stop button.
  • The Control menu has a Set Generation item for changing the generation count, or you can click in the "Generation=..." text in the status bar. Scripts can use the new setgen command.
  • Flip operations are much faster.
  • The About box uses Brice Due's Golly ticker.
  • Reduced chances of out-of-memory error while loading a large .mc file.
  • Fixed crash if a pattern update occurred while saving a .mc file.
  • Fixed bug pasting a macrocell pattern.
  • Fixed bug reading an empty macrocell pattern.
  • Fixed bug not marking a layer as modified after clearing the entire pattern.
  • Fixed bug if apostrophe was in Python script path or file name.
  • Fixed drawing problems on Mac OS 10.3.9.

Changes in version 1.2 (released April 2007)

  • Golly supports multiple layers; see the new Layer Menu help for details.
  • Added layer-related scripting commands. See heisenburp.py and envelope.py in the Scripts folder for how these commands can be used.
  • Added other useful scripting commands: exit, check and note.
  • The putcells command has optional parameters, including a new mode parameter.
  • Clicked lexicon patterns are loaded into a separate "lexicon" layer (and the clipboard is no longer changed).
  • If a pattern has been modified then its layer name is prefixed with an asterisk and a "save changes" dialog will appear before certain actions, such as opening a pattern file or quitting Golly. The dialog can be disabled via check boxes in Preferences > Layer.
  • Scrolling is optional if the pencil/cross/hand cursor is dragged outside the view window; see Preferences > Edit.
  • The hand cursor no longer has a pointing finger.
  • A .py file selected via Open Pattern is run as a script.
  • If golly-start.py exists in the same folder as the application then it is automatically executed when Golly starts up.
  • New tool bar buttons, including a single start/stop button.
  • Reset and Use Hashing can be selected while a pattern is generating.
  • Renamed Flip Up-Down to Flip Top-Bottom.
  • GTK app no longer does unnecessary buffered drawing.
  • X11 app has a vertical tool bar which can be toggled.
  • Mac app has a creator code (GoLy) and .mc/rle files are saved with an appropriate type and creator.
  • Fixed a bug if Win app given a long-running script on command line.
  • Fixed a bug in the advance and evolve commands if using hashing with Wolfram rule.
  • Fixed a delay bug.

Changes in version 1.1 (released November 2006)

  • Added Save Extended RLE option (initially ticked) to the File menu. An extended RLE file stores the pattern position and generation count (if > 0) so they can be restored when the file is loaded.
  • Macrocell files also store the generation count if > 0.
  • Non-extended RLE files are now loaded so that 0,0 is at the top left corner of the pattern rather than in the middle of the pattern.
  • Golly can read BMP/GIF/PNG/TIFF files and paste bitmap data. All non-white pixels become live cells.
  • Golly can read pattern files using David Bell's dblife format.
  • Starting patterns are saved in a temporary file rather than in memory. This is much faster when hashing (saving a macrocell file is very quick).
  • Random Fill is much faster in typical cases.
  • Escape key can be used to stop generating.
  • Numerous additions and updates to the pattern collection.
  • Added fuse-watcher.py, metafier.py and shift.py to the Scripts folder.
  • More mouse interaction is allowed while a script is running. A script can be aborted by clicking the stop button in the tool bar or by selecting Stop in the Control menu.
  • Resizing the help window no longer changes the scroll position.
  • Fixed a bug loading huge macrocell files.
  • Fixed an obscure bug in the non-hashing algorithm.
  • Path to Scripts folder is only added to Python's sys.path once.
  • Fixed rect bug in Scripts/glife/__init__.py (thanks to Dan Hoey).
  • Golly's code can be compiled with a Unicode build of wxWidgets.

Changes in version 1.0 (released June 2006)

  • Added Python script support; see the new Python Scripting help.
  • Golly is available for Linux/GTK.
  • Mac app is a Universal Binary (4 times faster on an Intel Mac).
  • Added ability to change various colors via Preferences > Color. The Black on White option has been replaced by Swap Cell Colors.
  • Increased the base step limit from 100 to 10,000.
  • Added Show Hash Info option to the Control menu.
  • Added Show Exact Numbers option to the View menu.
  • Save Pattern preserves comments when writing to an existing file.
  • Added tool bar buttons for toggling patterns and scripts.
  • Included the latest release of the Life Lexicon.
  • Renamed Flip Horizontally/Vertically to Flip Up-Down/Left-Right.
  • Fixed disabled menu item bug after closing a modal dialog on Mac OS 10.4.
  • Fixed a couple of rule-related bugs in the non-hashing algorithm.
  • Fixed crash due to very long rule strings.
  • Fixed paste positioning bugs at scale 1:2.
  • Fixed error if Win app is closed while script is running.
  • Fixed problem if Win app is closed when window(s) minimized.

Changes in version 0.95 (released January 2006)

  • Stephen Silver's Life Lexicon has been integrated into the help. Note that clicking on a lexicon pattern loads it into the Golly window.
  • Added an Open Recent submenu to the File menu.
  • Added Show Patterns and Change Folder to the File menu.
  • Added a Preferences dialog to the File menu (app menu on Mac).
  • Added more items to the Edit menu: Clear Outside, Shrink Selection, Random Fill, Flip Vertically, Flip Horizontally, Rotate Clockwise and Rotate Anticlockwise.
  • The clipboard pattern is displayed when pasting.
  • Pasting large, sparse patterns is much faster when using Or mode.
  • Added more items to the View menu: Fit Selection, Restore Origin and Set Scale.
  • The thumb scroll range is adjustable (see Preferences > View).
  • The Reset item now restores the rule, scale, location, step size and hashing option to the values they had at generation 0.
  • Removed Max Hash Memory from Control menu (now set in Preferences > Control).
  • The Rule dialog lets you select/add/delete named rules. If a rule has a name then it's shown in the main window's title bar.
  • Hit control-space to advance the selection, or shift-space to advance everything outside the selection. The generation count will not change.
  • The delete key is a shortcut for Clear, or shift-delete for Clear Outside.
  • F5 to F9 can be used to set cursor modes.
  • Hit "s" to shrink the selection and fit it in the current view.
  • Hit "0" to change the origin to the cell under the cursor.
  • Hit "9" to restore the true origin.
  • Hit "6" to set the scale to 1:16.
  • Hit "," to open the Preferences dialog.
  • If the help window is in front, hit "+" and "-" to change the font size.
  • While dragging the mouse to make (or modify) a selection, the escape key can be used to cancel the operation and restore the original selection.
  • The escape key can no longer be used to stop generating.
  • In zoom in/out mode, right-click or control-click zooms in the opposite direction.
  • The mouse wheel can be used for zooming, regardless of cursor mode.
  • Commas are used to make large status bar numbers more readable.
  • Fixed a hashing bug that could cause advancing by the wrong step.
  • Fixed a bug in Mac app when returning from full screen mode.
  • Fixed a bug in Win app that prevented space bar being used to stop generating.
  • Fixed Win app's cross cursor (now visible on a black background).

Changes in version 0.91 (released October 2005)

  • Return key can be used to start/stop generating.
  • Space bar can be used to stop generating.
  • Win app puts CR+LF in clipboard data.
  • Fixed occasional bug when +/- pressed while hashing.

Changes in version 0.9 (released October 2005)

  • Implemented pattern saving (as RLE or macrocell format).
  • Implemented cell editing and selecting.
  • Implemented scrolling via hand cursor.
  • Edit menu has a Cursor Mode submenu (items match new tool bar buttons).
  • Hit "c" to cycle through all cursors.
  • Win app can now read gzipped pattern files.
  • Can now display comments in pattern files.
  • Added Patterns folder to distribution.
  • Toggling the hashing option doesn't change the pattern or generation count.
  • The Reset item is smarter about restoring the starting pattern.
  • Fixed colored frame after dropping pattern file onto Mac app's main window.
  • Fixed horizontal scroll bar problem in Mac app's help window.
  • The help window's cursor now gets updated while generating.
  • Fixed problem with location of help window in X11 app.
  • Added limited clipboard support to X11 app.
  • Golly has a new app icon based on Galaxy, a period-8 oscillator.

Changes in version 0.2 (released July 2005)

  • Added support for B0 rules.
  • Golly comes to the front after dropping a pattern file onto main window.
  • The help window can move behind the main window in Win/X11 apps.
  • Text in the help window can be selected and copied to the clipboard.
  • Fixed keyboard shortcuts in the help window.
  • Fixed RLE rule problem in Mac app.
  • Fixed menu and tool bar update problems in Mac/Win apps.
  • Fixed some cosmetic problems in Win app.

Initial version 0.1 released July 2005 golly-3.3-src/Help/mouse.html0000644000175000017500000000215512651666400013132 00000000000000 Golly Help: Mouse Shortcuts

Mouse shortcuts

  • Click in the status bar's "Generation=..." text to change the generation count.
  • Click in the "Scale=..." text to reset the scale to 1:1.
  • Click in the "Step/Delay=..." text to reset the base step to its default value (specified in Preferences > Control) and the step exponent to 0.
  • Double-click in the edit bar's color/icon boxes to open the Set Layer Colors dialog.
  • Shift-click with the cross cursor to expand or shrink an existing selection. Hit the escape key to cancel the operation and restore the original selection.
  • In zoom in/out mode, use right-click or control-click to zoom in the opposite direction.
  • The mouse wheel can be used for zooming, regardless of cursor mode.
  • Right-click or control-click on a pattern/script/rule file in the left panel to open the file in a text editor. Use Preferences > File to select your preferred text editor.
golly-3.3-src/Help/archives.html0000644000175000017500000000343113171233731013577 00000000000000 Golly Help: Online Archives

Golly can download patterns, rules and scripts from these online archives:

LifeWiki Pattern Archive

Gliders in Life-Like Cellular Automata

Alan Hensel's Pattern Collections

Jason Summers' Pattern Collections

Very Large Patterns

Rule Table Repository

Golly Scripts Database

Note that Golly stores downloaded files in a directory that can be changed via a button at the bottom of Preferences > File. You might like to change the download location to a directory visible in the Show Files panel (to the left of the viewport), then you can easily re-open a pattern or zip file without having to download it again. Also, downloaded patterns and zip files are remembered in the Open Recent submenu, and downloaded scripts are remembered in the Run Recent submenu. golly-3.3-src/Help/lua.html~0000644000175000017500000017140113127303176012757 00000000000000 Golly Help: Lua Scripting

Golly uses a statically embedded Lua interpreter (version 5.3.4) to execute .lua scripts. This lets you extend Golly's capabilities in lots of interesting ways.

Example scripts
Golly's scripting commands
Cell arrays
Rectangle arrays
Using the gplus package
Potential problems
Lua copyright notice

 
Example scripts

The Scripts folder supplied with Golly contains a number of example Lua scripts:

breakout.lua — shows how to use the overlay to create a game
browse-patterns.lua — lets you browse through patterns in a folder
density.lua — calculates the density of the current pattern
draw-lines.lua — lets you draw one or more straight lines
envelope.lua — uses multiple layers to show a pattern's history
flood-fill.lua — fills a clicked region with the current drawing state
giffer.lua — creates an animated GIF file using the selection
goto.lua — goes to a given generation
gun-demo.lua — constructs a few spaceship guns
heisenburp.lua — illustrates the use of cloned layers
hexgrid.lua — creates a true hexagonal grid
invert.lua — inverts all cell states in the current selection
lifeviewer.lua — displays patterns like LifeViewer
make-torus.lua — makes a toroidal universe from the selection
metafier.lua — converts the current selection into a meta pattern
move-object.lua — lets you move a connected group of live cells
move-selection.lua — lets you move the current selection
oscar.lua — detects oscillating patterns, including spaceships
overlay-demo.lua — demonstrates most of the overlay functions
pd-glider.lua — creates a set of pentadecathlon+glider collisions
pop-plot.lua — displays a plot of population versus time
shift.lua — shifts the current selection by given x y amounts
slide-show.lua — displays all patterns in the Patterns folder
tile.lua — tiles the selection with the pattern inside it
tile-with-clip.lua — tiles the selection with the clipboard pattern

To run one of these scripts, tick the Show Files item in the File menu, open the Scripts/Lua folder and then simply click on the script's name. You can also select one of the Run items in the File menu. For a frequently used script you might like to assign a keyboard shortcut to run it (see Preferences > Keyboard).

When Golly starts up it looks for a script called golly-start.lua in the same directory as the Golly application and then in a user-specific data directory (see the getdir command for the likely path on your system). If the script is found then it is automatically executed.

There are a number of ways to abort a running script. Hit the escape key, or click on the stop button in the tool bar, or select the Stop item in the Control menu.

 
Golly's scripting commands

This section describes all the g.* commands that can be used in a script after including this line:

local g = golly()

Commands are grouped by function (filing, editing, control, viewing, layers and miscellaneous) or you can search for individual commands alphabetically:

addlayer
advance
autoupdate
check
clear
clone
continue
copy
cut
dellayer
doevent
duplicate
empty
error
evolve
exit
fit
fitsel
flip
getalgo
getbase
getcell
getcells
getclip
getclipstr
getcolor
getcolors
getcursor
getdir
getevent
getfiles
getgen
getheight
getinfo
getlayer
getmag
getname
getoption
getpath
getpop
getpos
getrect
getrule
getselrect
getstep
getstring
getview
getwidth
getxy
hash
join
load
maxlayers
millisecs
movelayer
new
note
numalgos
numlayers
numstates
open
opendialog
overlay
os
parse
paste
putcells
randfill
reset
rotate
run
save
savedialog
select
setalgo
setbase
setcell
setclipstr
setcolor
setcolors
setcursor
setdir
setgen
setlayer
setmag
setname
setoption
setpos
setrule
setstep
setview
show
shrink
step
store
transform
update
visrect
warn

 
FILING COMMANDS

open(filename, remember=false)
Open the given file and process it according to its type:

  • A HTML file (.htm or .html extension) is displayed in the help window.
  • A text file (.txt or .doc extension, or a name containing "readme") is opened in your text editor.
  • A script file (.lua or .py extension) is executed.
  • A zip file (.zip extension) is processed as described here.
  • Any other type of file is assumed to be a pattern file and is loaded into the current layer.

A non-absolute path is relative to the location of the script. The 2nd parameter is optional (default = false) and specifies if the given pattern or zip file should be remembered in the Open Recent submenu, or in the Run Recent submenu if the file is a script.
Example: g.open("my-patterns/foo.rle")

save(filename, format, remember=false)
Save the current pattern in a given file using the specified format:

"rle" run length encoded (RLE)
"rle.gz" compressed RLE
"mc" macrocell
"mc.gz" compressed macrocell

A non-absolute path is relative to the location of the script. The 3rd parameter is optional (default = false) and specifies if the file should be remembered in the Open Recent submenu. If the savexrle option is true then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.save("foo.rle", "rle", true)

opendialog(title, filetypes, initialdir, initialfname, mustexist=true)
Present a standard Open dialog to the user and return the chosen path in a string. All parameters are optional; the default is an Open dialog showing the current directory, with a title of "Choose a file" and a file type of "All files (*)|*". If the 5th parameter (default = true) is set to false, the user can specify a new filename instead of choosing an existing file. If the given file type is "dir" then the dialog lets the user choose a directory rather than a file. If the user cancels the dialog, the return value will be an empty string.
Example: local fname = g.opendialog("Open MCell File", "MCell files (*.mcl)|*.mcl", "C:\\Temp", "sample.mcl")
Example: local dirname = g.opendialog("Choose a folder", "dir");

savedialog(title, filetypes, initialdir, initialfname, suppressprompt=false)
Present a standard Save dialog to the user and return the chosen path in a string. All parameters are optional; the default is a Save dialog showing the current directory, with a title of "Choose a save location and filename" and a file type of "All files (*)|*". If a file already exists at the chosen location, an Overwrite? query will be displayed unless the 5th parameter (default = false) is set to true. If the user cancels the dialog, the return value will be an empty string.
Example: local fname = g.savedialog("Save text file", "Text files (*.txt;*.csv)|*.txt;*.csv", "C:\\Temp", "Params.txt", 1)

load(filename)
Read the given pattern file and return a cell array.
Example: local blinker = g.load("blinker.rle")

store(cell_array, filename)
Write the given cell array to the specified file in RLE format. If the savexrle option is true then extended RLE format is used (see the Save Extended RLE item for details).
Example: g.store(cells, "foo.rle")

getdir(dirname)
Return the path of the specified directory:

"app" — the directory containing the Golly application.

"data" — the user-specific data directory:
On Linux: ~/.golly/
On Mac OS X: ~/Library/Application Support/Golly/
On Windows XP: C:\Documents and Settings\username\Application Data\Golly\
On Windows 7+: C:\Users\username\AppData\Roaming\Golly\

"temp" — the directory Golly uses to store various temporary files. All these files are deleted when Golly quits.

"rules" — the user-specific rules directory set in Preferences > Control.

"files" — the directory displayed by File > Show Files.

"download" — the directory Golly uses to store downloaded files.

In each case a full path is returned, terminated by the appropriate path separator for the current platform ("/" on Mac and Linux, "\" on Windows).
Example: g.open(g.getdir("app").."Patterns/Life/Breeders/breeder.lif")

setdir(dirname, dirpath)
Set the specified directory to the given path (which must be a full path to an existing directory). All the directory names listed above are allowed, except for "app", "data" and "temp".
Example: g.setdir("download", "/path/to/my-downloads/")

getfiles(dirpath)
Return the contents of the given directory as an array of strings. A non-absolute directory path is relative to the location of the script. File names are returned first, then subdirectory names. The latter names end with the platform-specific path separator ("/" on Mac and Linux, "\" on Windows). See slide-show.lua for an example.

getinfo()
Return the comments from the current pattern.
Example: local comments = g.getinfo()

getpath()
Return the pathname of the current open pattern. Returns "" if the current pattern is new and has not been saved.
Example: local path = g.getpath()

 
EDITING COMMANDS

new(title)
Create a new, empty universe and set the window title. If the given title is empty then the current title won't change.
Example: g.new("test-pattern")

cut()
Cut the current selection to the clipboard.

copy()
Copy the current selection to the clipboard.

clear(where)
Clear inside (where = 0) or outside (where = 1) the current selection.
Example: g.clear(1)

paste(x, y, mode)
Paste the clipboard pattern at x,y using the given mode ("and", "copy", "or", "xor").
Example: g.paste(0, 0, "or")

shrink(remove_if_empty=false)
Shrink the current selection to the smallest rectangle enclosing all of the selection's live cells. If the selection has no live cells then the optional parameter specifies whether the selection remains unchanged or is removed.
Example: if #g.getselrect() > 0 then g.shrink(true) end

randfill(percentage)
Randomly fill the current selection to a density specified by the given percentage (1 to 100).
Example: g.randfill(50)

flip(direction)
Flip the current selection left-right (direction = 0) or top-bottom (direction = 1).

rotate(direction)
Rotate the current selection 90 degrees clockwise (direction = 0) or anticlockwise (direction = 1).

evolve(cell_array, numgens)
Advance the pattern in the given cell array by the specified number of generations and return the resulting cell array.
Example: local newpatt = g.evolve(currpatt, 100)

join(cell_array1, cell_array2)
Join the given cell arrays and return the resulting cell array. If the given arrays are both one-state then the result is one-state. If at least one of the given arrays is multi-state then the result is multi-state, but with one exception: if both arrays have no cells then the result is {} (an empty one-state array) rather than {0}. See below for a description of one-state and multi-state cell arrays.
Example: local result = g.join(part1, part2)

transform(cell_array, x0, y0, axx=1, axy=0, ayx=0, ayy=1)
Apply an affine transformation to the given cell array and return the resulting cell array. For each x,y cell in the input array the corresponding xn,yn cell in the output array is calculated as xn = x0 + x*axx + y*axy, yn = y0 + x*ayx + y*ayy.
Example: local rot_blinker = g.transform(blinker, 0, 0, 0, -1, 1, 0)

parse(string, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1)
Parse an RLE or Life 1.05 string and return an optionally transformed cell array.
Example: local blinker = g.parse("3o!")

putcells(cell_array, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1, mode="or")
Paste the given cell array into the current universe using an optional affine transformation and optional mode ("and", "copy", "not", "or", "xor").
Example: g.putcells(currpatt, 6, -40, 1, 0, 0, 1, "xor")

getcells(rect_array)
Return any live cells in the specified rectangle as a cell array. The given array can be empty (in which case the cell array is empty) or it must represent a valid rectangle of the form {x,y,width,height}.
Example: local cells = g.getcells( g.getrect() )

getclip()
Parse the pattern data in the clipboard and return the pattern's width, height, and a cell array. The width and height are not necessarily the minimal bounding box because the pattern might have empty borders, or it might even be empty.
Example: local wd, ht, cells = g.getclip()

hash(rect_array)
Return an integer hash value for the pattern in the given rectangle. Two identical patterns will have the same hash value, regardless of their location in the universe. This command provides a fast way to detect pattern equality, but there is a tiny probability that two different patterns will have the same hash value, so you might need to use additional (slower) tests to check for true pattern equality.
Example: local h = g.hash( g.getrect() )

select(rect_array)
Create a selection if the given array represents a valid rectangle of the form {x,y,width,height} or remove the current selection if the given array is {}.
Example: g.select( {-10,-10,20,20} )

getrect()
Return the current pattern's bounding box as an array. If there is no pattern then the array is empty ({}), otherwise the array is of the form {x,y,width,height}.
Example: if #g.getrect() == 0 then g.show("No pattern.") end

getselrect()
Return the current selection rectangle as an array. If there is no selection then the array is empty ({}), otherwise the array is of the form {x,y,width,height}.
Example: if #g.getselrect() == 0 then g.show("No selection.") end

setcell(x, y, state)
Set the given cell to the specified state (0 for a dead cell, 1 for a live cell).

getcell(x, y)
Return the state of the given cell. The following example inverts the state of the cell at 0,0.
Example: g.setcell(0, 0, 1 - g.getcell(0, 0))

setcursor(string)
Set the current cursor according to the given string and return the old cursor string. The given string must match one of the names in the Cursor Mode menu.
Example: local oldcurs = g.setcursor("Draw")

getcursor()
Return the current cursor as a string (ie. the ticked name in the Cursor Mode menu).

 
CONTROL COMMANDS

run(numgens)
Run the current pattern for the specified number of generations. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is true.
Example: g.run(100)

step()
Run the current pattern for the current step. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is true.

setstep(exp)
Temporarily set the current step exponent to the given integer. A negative exponent sets the step size to 1 and also sets a delay between each step, but that delay is ignored by the run and step commands. Golly will reset the step exponent to 0 upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setstep(0)

getstep()
Return the current step exponent.
Example: g.setstep( g.getstep() + 1 )

setbase(base)
Temporarily set the current base step to an integer from 2 to 10000. Golly will restore the default base step (set in Preferences > Control) upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g.setbase(2)

getbase()
Return the current base step.

advance(where, numgens)
Advance inside (where = 0) or outside (where = 1) the current selection by the specified number of generations. The generation count does not change.
Example: g.advance(0, 3)

reset()
Restore the starting pattern and generation count. Also reset the algorithm, rule, scale, location and step exponent to the values they had at the starting generation. The starting generation is usually zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

setgen(gen)
Set the generation count using the given string. Commas and other punctuation marks can be used to make a large number more readable. Include a leading +/- sign to specify a number relative to the current generation count.
Example: g.setgen("-1,000")

getgen(sepchar='\0')
Return the current generation count as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getgen(',') would return a string like "1,234,567" but g.getgen() would return "1234567". Use the latter call if you want to do arithmetic on the generation count because then it's easy to convert the string to a number.
Example: local gen = tonumber( g.getgen() )

getpop(sepchar='\0')
Return the current population as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, g.getpop(',') would return a string like "1,234,567" but g.getpop() would return "1234567". Use the latter call if you want to do arithmetic on the population count. The following example converts the population to a number.
Example: local pop = tonumber( g.getpop() )

empty()
Return true if the universe is empty or false if there is at least one live cell. This is much more efficient than testing getpop() == "0".
Example: if g.empty() then g.show("All cells are dead.") end

numstates()
Return the number of cell states in the current universe. This will be a number from 2 to 256, depending on the current algorithm and rule.
Example: local maxstate = g.numstates() - 1

numalgos()
Return the number of algorithms (ie. the number of items in the Set Algorithm menu).
Example: local maxalgo = g.numalgos() - 1

setalgo(string)
Set the current algorithm according to the given string which must match one of the names in the Set Algorithm menu.
Example: g.setalgo("HashLife")

getalgo(index=current)
Return the algorithm name at the given index in the Set Algorithm menu, or the current algorithm's name if no index is supplied.
Example: local lastalgo = g.getalgo( g.numalgos() - 1 )

setrule(string)
Set the current rule according to the given string. If the current algorithm doesn't support the specified rule then Golly will automatically switch to the first algorithm that does support the rule. If no such algorithm can be found then you'll get an error message and the script will be aborted.
Example: g.setrule("b3/s23")

getrule()
Return the current rule as a string in canonical format.
Example: local oldrule = g.getrule()

getwidth()
Return the width (in cells) of the current universe (0 if unbounded).
Example: local wd = g.getwidth()

getheight()
Return the height (in cells) of the current universe (0 if unbounded).
Example: local ht = g.getheight()

 
VIEWING COMMANDS

setpos(x, y)
Change the position of the viewport so the given cell is in the middle. The x,y coordinates are given as strings so the viewport can be moved to any location in the unbounded universe. Commas and other punctuation marks can be used to make large numbers more readable. Apart from a leading minus sign, most non-digits are simply ignored; only alphabetic characters will cause an error message. Note that positive y values increase downwards in Golly's coordinate system.
Example: g.setpos("1,000,000,000,000", "-123456")

getpos(sepchar='\0')
Return the x,y position of the viewport's middle cell in the form of two strings. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting strings more readable. For example, g.getpos(',') might return two strings like "1,234" and "-5,678" but g.getpos() would return "1234" and "-5678". Use the latter call if you want to do arithmetic on the x,y values, or just use the getposint() function defined in the gplus package.
Example: local x, y = g.getpos()

setmag(mag)
Set the magnification, where 0 corresponds to the scale 1:1, 1 = 1:2, -1 = 2:1, etc. The maximum allowed magnification is 5 (= 1:32).
Example: g.setmag(0)

getmag()
Return the current magnification.
Example: g.setmag( g.getmag() - 1 )

fit()
Fit the entire pattern in the viewport.

fitsel()
Fit the current selection in the viewport. The script aborts with an error message if there is no selection.

visrect(rect_array)
Return true if the given rectangle is completely visible in the viewport. The rectangle must be an array of the form {x,y,width,height}.
Example: if not g.visrect({0,0,1,1}) then g.setpos("0","0") end

setview(wd, ht)
Set the pixel width and height of the viewport (the main window will be resized accordingly).
Example: g.setview(32*32, 32*30)

getview(index=-1)
Return the pixel width and height of the viewport if the given index is -1 (the default), or the pixel width and height of the specified layer if the given index is an integer from 0 to numlayers() - 1.
Example: local wd, ht = g.getview()

autoupdate(bool)
When Golly runs a script this setting is initially false. If the given parameter is true then Golly will automatically update the viewport and the status bar after each command that changes the universe or viewport in some way. Useful for debugging scripts.
Example: g.autoupdate(true)

update()
Immediately update the viewport and the status bar, regardless of the current autoupdate setting. Note that Golly always does an update when a script finishes.

 
LAYER COMMANDS

overlay(command)
Call a command to create, modify or delete the overlay, a rectangular area of pixels that can be displayed on top of the current layer.
Example: g.overlay("create 400 300")

addlayer()
Add a new, empty layer immediately after the current layer and return the new layer's index, an integer from 0 to numlayers() - 1. The new layer becomes the current layer and inherits most of the previous layer's settings, including its algorithm, rule, scale, location, cursor mode, etc. The step exponent is set to 0, there is no selection, no origin offset, and the layer's initial name is "untitled".
Example: local newindex = g.addlayer()

clone()
Like addlayer (see above) but the new layer shares the same universe as the current layer. The current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled).
Example: local cloneindex = g.clone()

duplicate()
Like addlayer (see above) but the new layer has a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized.
Example: local dupeindex = g.duplicate()

dellayer()
Delete the current layer. The current layer changes to the previous layer (unless layer 0 was deleted).

movelayer(fromindex, toindex)
Move a specified layer to a new position in the layer sequence. The chosen layer becomes the current layer.
Example: g.movelayer(1, 0)

setlayer(index)
Set the current layer to the layer with the given index, an integer from 0 to numlayers() - 1.
Example: g.setlayer(0)

getlayer()
Return the index of the current layer, an integer from 0 to numlayers() - 1.
Example: local currindex = g.getlayer()

numlayers()
Return the number of existing layers, an integer from 1 to maxlayers().
Example: if g.numlayers() > 1 then g.setoption("tilelayers",1) end

maxlayers()
Return the maximum number of layers (10 in this implementation).

setname(string, index=current)
Set the name of the given layer, or the current layer's name if no index is supplied.
Example: g.setname("temporary")

getname(index=current)
Return the given layer's name, or the current layer's name if no index is supplied.
Example: if g.getname() == "temporary" then g.dellayer() end

setcolors(color_array)
Set the color(s) of one or more states in the current layer and its clones (if any). If the given array contains a multiple of 4 integers then they are interpreted as state, red, green, blue values. A state value of -1 can be used to set all live states to the same color (state 0 is not changed). If the given array contains exactly 6 integers then they are interpreted as a color gradient from r1, g1, b1 to r2, g2, b2 for all the live states (state 0 is not changed). If the given array is empty then all states (including state 0) are reset to their default colors, depending on the current algorithm and rule. Note that the color changes made by this command are only temporary. Golly will restore the default colors if a new pattern is opened or created, or if the algorithm or rule changes, or if Preferences > Color is used to change any of the default colors for the current layer's algorithm.
Example: g.setcolors({1,0,0,0, 2,0,0,0}) # set states 1 and 2 to black
Example: g.setcolors({-1,0,255,0}) # set all live states to green
Example: g.setcolors({255,0,0, 0,0,255}) # live states vary from red to blue
Example: g.setcolors({}) # restore default colors

getcolors(state=-1)
Return the color of a given state in the current layer as an array of the form

{ state, red, green, blue }

or if the given state is -1 (or not supplied) then return all colors as

{ 0, r0, g0, b0, . . . N, rN, gN, bN }

where N equals numstates() - 1. Note that the array returned by getcolors can be passed into setcolors; this makes it easy to save and restore colors.
Example: local allcolors = g.getcolors()
Example: local deadcolor = g.getcolors(0)

 
MISCELLANEOUS COMMANDS

os()
Return the current operating system: "Windows", "Mac" or "Linux".
Example: if g.os() == "Mac" then do_mac_stuff() end

millisecs()
Return the number of milliseconds that have elapsed since Golly started up. The returned value is a floating point number.
Example: local t1 = g.millisecs()

setoption(name, value)
Set the given option to the given value. The old value is returned to make it easy to restore a setting. Here are all the valid option names and their possible values:

"autofit" 1 or 0
"boldspacing" 2 to 1000 (cells)
"drawingstate" 0 to numstates()-1
"fullscreen" 1 or 0
"hyperspeed" 1 or 0
"maxdelay" 0 to 5000 (millisecs)
"mindelay" 0 to 5000 (millisecs)
"opacity" 1 to 100 (percent)
"restoreview" 1 or 0
"savexrle" 1 or 0
"showallstates" 1 or 0
"showboldlines" 1 or 0
"showbuttons" 0 to 4
"showeditbar" 1 or 0
"showexact" 1 or 0
"showfiles" 1 or 0
"showgrid" 1 or 0
"showhashinfo" 1 or 0
"showicons" 1 or 0
"showlayerbar" 1 or 0
"showoverlay" 1 or 0
"showstatusbar" 1 or 0
"showtoolbar" 1 or 0
"smartscale" 1 or 0
"stacklayers" 1 or 0
"swapcolors" 1 or 0
"switchlayers" 1 or 0
"synccursors" 1 or 0
"syncviews" 1 or 0
"tilelayers" 1 or 0

Example: local oldgrid = g.setoption("showgrid", 1)

getoption(name)
Return the current value of the given option. See above for a list of all the valid option names.
Example: if g.getoption("autofit") == 1 then g.fit() end

setcolor(name, r, g, b)
Set the given color to the given RGB values (integers from 0 to 255). The old RGB values are returned as 3 integers to make it easy to restore the color. Here is a list of all the valid color names and how they are used:

"border" color for border around bounded grid
"paste" color for pasting patterns
"select" color for selections (will be 50% transparent)
algoname status bar background for given algorithm

Example: local oldr, oldg, oldb = g.setcolor("HashLife", 255, 255, 255)

getcolor(name)
Return the current RGB values for the given color as 3 integers. See above for a list of all the valid color names.
Example: local selr, selg, selb = g.getcolor("select")

getclipstr()
Return the current contents of the clipboard as an unmodified string.
Example: local illegalRLE = g.getclipstr()

setclipstr(string)
Copy an arbitrary string (not necessarily a cell pattern) directly to the clipboard.
Example: g.setclipstr(correctedRLE)

getstring(prompt, initial="", title="")
Display a dialog box and get a string from the user. If the initial string is supplied it will be shown and selected. If the title string is supplied it will be used in the dialog's title bar. The script will be aborted if the user hits the dialog's Cancel button.
Example: local n = tonumber( g.getstring("Enter a number:", "100") )

getevent(get=true)
When Golly runs a script it initially handles all keyboard and mouse events, but if the script calls getevent() then future events are put into a queue for retrieval via later calls. These events are returned in the form of strings (see below for the syntax). If there are no events in the queue then the returned string is empty. Note that the very first getevent() call will always return an empty string, but this isn't likely to be a problem because it normally occurs very soon after the script starts running. A script can call getevent(false) if it wants Golly to resume handling any further events. See flood-fill.lua for a good example.

Key-down events are triggered when a key is pressed or autorepeats. The returned string is of the form "key charname modifiers" where charname can be any displayable ASCII character from '!' to '~' or one of the following names: space, home, end, pageup, pagedown, help, insert, delete, tab, enter, return, left, right, up, down, or f1 to f24. If no modifier key was pressed then modifiers is none, otherwise it is some combination of alt, cmd, ctrl, meta, shift. Note that cmd will only be returned on a Mac and corresponds to the command key. The alt modifier corresponds to the option key on a Mac.

Key-up events occur when a key is released and are strings of the form "kup charname".

Mouse-down events in the current layer are strings of the form "click x y button modifiers" where x and y are integers giving the cell position of the click, button is one of left, middle or right, and modifiers is the same as above.

Mouse-down events in a non-transparent pixel in the overlay are strings of the form "oclick x y button modifiers" where x and y are integers giving the pixel position in the overlay (0,0 is the top left pixel), button is one of left, middle or right, and modifiers is the same as above.

Mouse-up events are strings of the form "mup button" where button is one of left, middle or right.

Mouse wheel events in the current layer are strings of the form "zoomin x y" or "zoomout x y" where x and y are the mouse's pixel position in the viewport.

Mouse wheel events in a non-transparent pixel in the overlay are strings of the form "ozoomin x y" or "ozoomout x y" where x and y are the mouse's pixel position in the overlay.

The following examples show the strings returned after various user events:

"key m none" user pressed M key
"key space shift" user pressed space bar and shift key
"key , altctrlshift" user pressed comma and 3 modifier keys
"kup left" user released the left arrow key
"click 100 5 left none" user clicked cell at 100,5 with left button
"click -10 9 middle alt" user clicked cell with middle button and pressed alt key
"click 0 1 right altshift" user clicked cell with right button and pressed 2 modifiers
"oclick 10 5 left none" user clicked pixel at 10,5 in overlay with left button
"mup left" user released the mouse's left button
"zoomout 10 20" mouse wheel was used to zoom out from pixel in viewport
"ozoomin 10 20" mouse wheel was used to zoom in to pixel in overlay

Example: local evt = g.getevent()

doevent(event)
Pass the given event to Golly to handle in the usual manner (but events that can change the current pattern will be ignored). The given event must be a string with the exact same format as returned by the getevent command (see above). If the string is empty then Golly does nothing. Note that the cmd modifier corresponds to the command key on a Mac or the control key on Windows/Linux (this lets you write portable scripts that work on any platform).
Example: g.doevent("key q cmd") -- quit Golly

getxy()
Return the mouse's current grid position as a string. The string is empty if the mouse is outside the viewport or outside a bounded grid or over the translucent buttons, otherwise the string contains x and y cell coordinates separated by a space; eg. "-999 12345". See draw-lines.lua for a good example of how to use this command.
Example: local mousepos = g.getxy()

show(message)
Show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.show("Hit any key to continue...")

error(message)
Beep and show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g.error("The pattern is empty.")

warn(message)
Beep and show the given string in a modal warning dialog. Useful for debugging Lua scripts or displaying error messages.
Example: g.warn("xxx = "..xxx)

note(message)
Show the given string in a modal information dialog. Useful for displaying multi-line results.
Example: g.note("Line 1\nLine 2\nLine 3")

check(bool)
When Golly runs a script this setting is initially true, which means that event checking is enabled. If the given parameter is false then event checking is disabled. Typically used to prevent mouse clicks being seen at the wrong time. This should only be done for short durations because the script cannot be aborted while the setting is false.
Example: g.check(false)

continue(message)
This function can be used to continue execution after pcall has detected some sort of error or the user has aborted the script. It's typically used to ensure some finalization code is executed. If not empty, the given message will be displayed in the status bar after the script has finished. See the end of envelope.lua for an example.

exit(message="")
Exit the script with an optional error message. If a non-empty string is supplied then it will be displayed in the status bar along with a beep, just like the error command. If no message is supplied, or if the string is empty, then there is no beep and the current status bar message will not be changed.
Example: if g.empty() then g.exit("There is no pattern.") end

 
Cell arrays

Some scripting commands manipulate patterns in the form of cell arrays. Golly supports two types of cell arrays: one-state and multi-state. A one-state cell array contains an even number of integers specifying the x,y coordinates for a set of cells, all of which are assumed to be in state 1:

{ x1, y1, . . . xN, yN }

A multi-state cell array contains an odd number of integers specifying the x,y,state values for a set of cells. If the number of cells is even then a padding integer (zero) is added at the end of the array to ensure the total number of integers is odd:

{ x1, y1, state1, . . . xN, yN, stateN }      if N is odd
{ x1, y1, state1, . . . xN, yN, stateN, 0 }  if N is even

All scripting commands that input cell arrays use the length of the array to determine its type. When writing a script to handle multi-state cell arrays you may need to allow for the padding integer, especially if accessing cells within the array. See tile.lua for example.

Note that all scripting commands return {} if the resulting cell array has no cells. They never return {0}, although this is a perfectly valid multi-state cell array and all commands can input such an array. For example, newarray = g.join(array1,{0}) can be used to convert a non-empty one-state array to multi-state.

One-state cell arrays are normally used in a two-state universe, but they can also be used in a universe with more than two states. A multi-state cell array can be used in a two-state universe, but only if the array's cell states are 0 or 1.

The ordering of cells within either type of array doesn't matter. Also note that positive y values increase downwards in Golly's coordinate system.

 
Rectangle arrays

Some commands manipulate rectangles in the form of arrays. An empty rectangle is indicated by an array with no items; ie. {}. A non-empty rectangle is indicated by an array containing four integers:

{ left, top, width, height }

The first two items specify the cell at the top left corner of the rectangle. The last two items specify the rectangle's size (in cells). The width and height must be greater than zero.

 
Using the gplus package

The gplus package supplied with Golly provides a high-level interface to many of Golly's built-in scripting commands. The package consists of a set of .lua files stored in the Scripts/Lua/gplus directory. The best way to learn how to use gplus is to look at some of the scripts supplied with Golly:

  • See bricklayer.lua for how to use the pattern function to contruct a complicated pattern by combining simpler sub-patterns.
  • See invert.lua for how to use the rect function to make it easier to manipulate rectangles.
  • See shift.lua for how to use the split and validint functions to parse user input.

Here's a summary of the functions available after a script calls local gp = require "gplus" (see init.lua for all the implementation details):

gp.int(x) — return integer part of given floating point number
gp.min(a) — return minimum value in given array
gp.max(a) — return maximum value in given array
gp.drawline(x1,y1,x2,y2,z) — draw a line of state z cells from x1,y1 to x2,y2
gp.getedges(r) — return left, top, right, bottom edges of given rectangle array
gp.getminbox(p) — return minimal bounding box of given cell array or pattern
gp.validint(s) — return true if given string is a valid integer
gp.getposint() — return viewport position as 2 integers
gp.setposint(x,y) — use given integers to set viewport position
gp.split(s,sep) — split given string into 1 or more substrings
gp.equal(a1,a2) — return true if given arrays have the same values
gp.compose(S,T) — return the composition of two transformations S and T
gp.rect(r) — return a table for manipulating a rectangle
gp.pattern(p) — return a table for manipulating a pattern
gp.trace(msg) — pass into xpcall so a runtime error will have a stack trace

Most of the supplied Lua scripts use gplus, but it isn't compulsory. You might prefer to create your own package for use in the scripts you write. If a script calls require "foo" then Golly will look for foo.lua in the same directory as the script, then it looks for foo/init.lua. If a script calls require "foo.bar" then Golly looks for foo/bar.lua. (If none of those files exist in the script's directory then Golly will look in the supplied Scripts/Lua directory, so scripts can always use the gplus package no matter where they are located.)

 
Potential problems

1. There are some important points to remember about Lua, especially when converting an existing Perl/Python script to Lua:

  • Cell arrays and rectangle arrays start with index 1, not 0. This is necessary to be able to use Lua's length operator (#) and standard library functions like table.unpack.
  • Lua's true and false are not equivalent to 1 and 0. In particular, "if 0" is true.
  • Avoid calls like local x, y, wd, ht = g.getrect(). Only x will get a non-nil value (a rectangle array). You need to do local x, y, wd, ht = table.unpack(g.getrect()).
  • When writing a complicated script it's a good idea to add the line require "gplus.strict" near the top. This will catch any undeclared global variables. When the script is working just remove or comment out that line.

More tips can be found at Lua Gotchas.

2. The escape key check to abort a running script is not done by Lua but by each g.* function. This means that very long Lua computations should call an occasional "no-op" like g.doevent("") to allow the script to be aborted in a timely manner.

3. When writing a script that creates a pattern, make sure the script starts with a g.new call (or, less useful, a g.open call that loads a pattern) otherwise the script might create lots of temporary files or use lots of memory. From Golly's point of view there are two types of scripts:

  • A script that calls g.new or g.open is assumed to be creating some sort of pattern, so when Golly sees these calls it clears any undo history and sets an internal flag that says "don't mark this layer as dirty and don't bother recording any further changes".
  • A script that doesn't call g.new or g.open is assumed to modify the current pattern. Golly must record all the script's changes so that when it finishes you can select "Undo Script Changes" from the Edit menu. Generating changes (due to g.run or g.step calls) are stored in temporary files; all other changes are stored in memory.

 
Lua copyright notice

Copyright © 1994–2015 Lua.org, PUC-Rio.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golly-3.3-src/gui-web/0000755000175000017500000000000013543257427011646 500000000000000golly-3.3-src/gui-web/zlib/0000755000175000017500000000000013543257427012606 500000000000000golly-3.3-src/gui-web/zlib/deflate.h0000644000175000017500000003074612362063145014303 00000000000000/* deflate.h -- internal compression state * Copyright (C) 1995-2012 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define Buf_size 16 /* size of bit buffer in bi_buf */ #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 #define COMMENT_STATE 91 #define HCRC_STATE 103 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ uInt pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ uInt insert; /* bytes at end of window left to insert */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ ulg high_water; /* High water mark offset in window for initialized bytes -- bytes above * this are set to zero in order to avoid memory check warnings when * longest match routines access bytes past the input. This is then * updated to the new high water mark. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ #define WIN_INIT MAX_MATCH /* Number of bytes after end of data in window to initialize in order to avoid memory checker errors from longest match routines */ /* in trees.c */ void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch ZLIB_INTERNAL _length_code[]; extern uch ZLIB_INTERNAL _dist_code[]; #else extern const uch ZLIB_INTERNAL _length_code[]; extern const uch ZLIB_INTERNAL _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ golly-3.3-src/gui-web/zlib/infback.c0000644000175000017500000005426512362063145014271 00000000000000/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) z_streamp strm; int windowBits; unsigned char FAR *window; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; state->wnext = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) z_streamp strm; in_func in; void FAR *in_desc; out_func out; void FAR *out_desc; { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.val < 16) { DROPBITS(here.bits); state->lens[state->have++] = here.val; } else { if (here.val == 16) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { NEEDBITS(here.bits + 3); DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(here.bits + 7); DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { strm->msg = (char *)"invalid code -- missing end-of-block"; state->mode = BAD; break; } /* build code tables -- note: do not change the lenbits or distbits values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(here.bits); state->length = (unsigned)here.val; /* process literal */ if (here.op == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { here = state->distcode[BITS(state->distbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if ((here.op & 0xf0) == 0) { last = here; for (;;) { here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(here.bits); if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)here.val; /* get distance extra bits, if any */ state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(strm) z_streamp strm; { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } golly-3.3-src/gui-web/zlib/README0000644000175000017500000001210112362063145013367 00000000000000ZLIB DATA COMPRESSION LIBRARY zlib 1.2.8 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file test/example.c which also tests that the library is working correctly. Another example is given in the file test/minigzip.c. The compression library itself is composed of all source files in the root directory. To compile all files and run the test program, follow the instructions given at the top of Makefile.in. In short "./configure; make test", and if that goes well, "make install" should work for most flavors of Unix. For Windows, use one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. The zlib home page is http://zlib.net/ . Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . The changes made in version 1.2.8 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . zlib is available in Java using the java.util.zip package, documented at http://java.sun.com/developer/technicalArticles/Programming/compression/ . A Perl interface to zlib written by Paul Marquess is available at CPAN (Comprehensive Perl Archive Network) sites, including http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see http://docs.python.org/library/zlib.html . zlib is built into tcl: http://wiki.tcl.tk/4610 . An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the contrib/minizip directory of zlib. Notes for some targets: - For Windows DLL versions, please see win32/DLL_FAQ.txt - For 64-bit Irix, deflate.c must be compiled without any optimization. With -O, one libpng test fails. The test works in 32 bit mode (with the -n32 compiler flag). The compiler bug has been reported to SGI. - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. - On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. - gzdopen is not supported on RISCOS or BEOS. - For PalmOs, see http://palmzlib.sourceforge.net/ Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. golly-3.3-src/gui-web/zlib/zutil.c0000644000175000017500000001636612362063145014043 00000000000000/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef Z_SOLO # include "gzguts.h" #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif z_const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int ZLIB_INTERNAL z_verbose = verbose; void ZLIB_INTERNAL z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void ZLIB_INTERNAL zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int ZLIB_INTERNAL zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void ZLIB_INTERNAL zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifndef Z_SOLO #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ #endif /* !Z_SOLO */ golly-3.3-src/gui-web/zlib/trees.c0000644000175000017500000012633712362063145014016 00000000000000/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2012 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, const ct_data *ltree, const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ #ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; #endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void ZLIB_INTERNAL _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ void ZLIB_INTERNAL _tr_flush_bits(s) deflate_state *s; { bi_flush(s); } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (s->strm->data_type == Z_UNKNOWN) s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (last) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; const ct_data *ltree; /* literal tree */ const ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); } /* =========================================================================== * Check if the data type is TEXT or BINARY, using the following algorithm: * - TEXT if the two conditions below are satisfied: * a) There are no non-portable control characters belonging to the * "black list" (0..6, 14..25, 28..31). * b) There is at least one printable character belonging to the * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). * - BINARY otherwise. * - The following partially-portable control characters form a * "gray list" that is ignored in this detection algorithm: * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ local int detect_data_type(s) deflate_state *s; { /* black_mask is the bit mask of black-listed bytes * set bits 0..6, 14..25, and 28..31 * 0xf3ffc07f = binary 11110011111111111100000001111111 */ unsigned long black_mask = 0xf3ffc07fUL; int n; /* Check for non-textual ("black-listed") bytes. */ for (n = 0; n <= 31; n++, black_mask >>= 1) if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) return Z_BINARY; /* Check for textual ("white-listed") bytes. */ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 || s->dyn_ltree[13].Freq != 0) return Z_TEXT; for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) return Z_TEXT; /* There are no "black-listed" or "white-listed" bytes: * this stream either is empty or has tolerated ("gray-listed") bytes only. */ return Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } golly-3.3-src/gui-web/zlib/zlib.h0000644000175000017500000025351312362063145013636 00000000000000/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.8, April 28th, 2013 Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.8" #define ZLIB_VERNUM 0x1280 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 #define ZLIB_VER_REVISION 8 #define ZLIB_VER_SUBREVISION 0 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough, or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total number of bytes output so far */ z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 #define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative values * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. This completes the current deflate block and follows it with an empty stored block that is three bits plus filler bits to the next byte, followed by four bytes (00 00 ff ff). If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the output buffer, but the output is not aligned to a byte boundary. All of the input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output in order for the decompressor to finish the block before the empty fixed code block. If flush is set to Z_BLOCK, a deflate block is completed and emitted, as for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to seven bits of the current block are held to be written as the next byte after the next deflate block is completed. In this case, the decompressor may not be provided enough bits at this point in order to complete decompression of the data provided so far to the compressor. It may need to wait for the next block to be emitted. This is for advanced applications that need to control the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). Then deflate is guaranteed to return Z_STREAM_END. If not enough output space is provided, deflate will not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from possibly reading the zlib header if present: actual decompression will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unused and unchanged.) The current implementation of inflateInit() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. data_type is set as noted here every time inflate() returns for all flush options, and so can be used to determine the amount of currently consumed input in bits. The Z_TREES option behaves as Z_BLOCK does, but it also returns when the end of each deflate block header is reached, before any actual data in that block is decoded. This allows the caller to determine the length of the deflate block header for later use in random access within a deflate block. 256 is added to the value of strm->data_type when inflate() returns immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all of the uncompressed data for the operation to complete. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The use of Z_FINISH is not required to perform an inflation in one step. However it may be used to inform inflate that a faster approach can be used for the single inflate() call. Z_FINISH also informs inflate to not maintain a sliding window if the stream completes, which reduces inflate's memory footprint. If the stream does not complete, either because not all of the stream is provided or not enough output space is provided, then a sliding window will be allocated and inflate() can be called again to continue the operation as if Z_NO_FLUSH had been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the effects of the flush parameter in this implementation are on the return value of inflate() as noted below, when inflate() returns early when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() can decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically, if requested when initializing with inflateInit2(). Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. When processing gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output producted so far. The CRC-32 is checked against the gzip trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this function must be called immediately after deflateInit, deflateInit2 or deflateReset, and before any call of deflate. When doing raw deflate, this function must be called either before any call of deflate, or immediately after the completion of a deflate block, i.e. after all input has been consumed and all output has been delivered when using any of the flush options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size provided in deflateInit or deflateInit2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream or if not at a block boundary for raw deflate). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). If that first deflate() call is provided the sourceLen input bytes, an output buffer allocated to the size returned by deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed to return Z_STREAM_END. Note that it is possible for the compressed size to be larger than the value returned by deflateBound() if flush options other than Z_FINISH or Z_NO_FLUSH are used. */ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, unsigned *pending, int *bits)); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not provided would be due to the available output space having being consumed. The number of bits of output not provided are between 0 and 7, where they await more bits to join them in order to fill out a full byte. If pending or bits are Z_NULL, then those values are not set. deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be zero to request that inflate use the window size in the zlib header of the compressed stream. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from possibly reading the zlib header if present: actual decompression will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unused and unchanged.) The current implementation of inflateInit2() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called at any time to set the dictionary. If the provided dictionary is smaller than the window and there is already data in the window, then the provided dictionary will amend what's there. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, Bytef *dictionary, uInt *dictLength)); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. Similary, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync searches for a 00 00 FF FF pattern in the compressed data. All full flush points have this pattern, but not all occurrences of this pattern are full flush points. inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, int windowBits)); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted the same as it is for inflateInit2. inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL), or if the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used to clear out bits leftover after feeding inflate a block description prior to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the return value down 16 bits. If the upper value is -1 and the lower value is zero, then inflate() is currently decoding information outside of a block. If the upper value is -1 and the lower value is non-zero, then inflate is in the middle of a stored block, with the lower value equaling the number of bytes from the input remaining to copy. If the upper value is not -1, then it is the number of bits back from the current bit position in the input of the code (literal or length/distance pair) currently being processed. In that case the lower value is the number of bytes already emitted for that code. A code is being processed if inflate is waiting for more input to complete decoding of the code, or if it has completed decoding but is waiting for more output space to write the literal or match data. inflateMark() is used to mark locations in the input data for random access, which may be at bit positions, and to note those cases where the output of a code may span boundaries of random access blocks. The current location in the input stream can be determined from avail_in and data_type as noted in the description for the Z_BLOCK flush parameter for inflate. inflateMark returns the value noted above or -1 << 16 if the provided source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the parameters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, z_const unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than inflate() for file i/o applications, in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. inflate() can be faster on modern CPUs when used with large buffers. inflateBack() trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ #ifndef Z_SOLO /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the uncompressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In the case where there is not enough room, uncompress() will fill the output buffer with the uncompressed data up to that point. */ /* gzip file access functions */ /* This library supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio, using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. */ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of deflateInit2 for more information about the strategy parameter.) 'T' will request transparent writing or appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since reading and writing to the same gzip file is not supported. The addition of "x" when writing will create the file exclusively, which fails if the file already exists. On systems that support it, the addition of "e" when reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip streams in a file. The append function of gzopen() can be used to create such a file. (Also see gzflush() for another way to do this.) When appending, gzopen does not test whether the file begins with a gzip stream, nor does it look for the end of the gzip streams to begin appending. gzopen will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. When reading, this will be detected automatically by looking for the magic two- byte gzip header. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the file could not be opened. */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since gzdopen does not close fd if it fails. If you are using fileno() to get the file descriptor from a FILE *, then you will have to use dup() to avoid double-close()ing the file descriptor. Both gzclose() and fclose() will close the associated file descriptor, so they need to have different file descriptors. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided), or if fd is -1. The file descriptor is not used until the next gz* read, write, seek, or close operation, so gzdopen will not detect if fd is invalid (unless fd is -1). */ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); /* Set the internal buffer size used by this library's functions. The default buffer size is 8192 bytes. This function must be called after gzopen() or gzdopen(), and before any other calls that read or write the file. The buffer memory allocation is always deferred to the first read or write. Two buffers are allocated, either both of the specified size when writing, or one of the specified size and the other twice that size when reading. A larger buffer size of, for example, 64K or 128K bytes will noticeably increase the speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). gzbuffer() returns 0 on success, or -1 on failure, such as being called too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. After reaching the end of a gzip stream in the input, gzread will continue to read, looking for another gzip stream. Any number of gzip streams may be concatenated in the input file, and will all be decompressed by gzread(). If something other than a gzip stream is encountered after a gzip stream, that remaining trailing garbage is ignored (and no error is returned). gzread can be used to read a gzip file that is being concurrently written. Upon reaching the end of the input, gzread will return with the available data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then gzclearerr can be used to clear the end of file indicator in order to permit gzread to be tried again. Z_OK indicates that a gzip stream was completed on the last gzread. Z_BUF_ERROR indicates that the input file ended in the middle of a gzip stream. Note that gzread does not return -1 in the event of an incomplete gzip stream. This error is deferred until gzclose(), which will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip stream. Alternatively, gzerror can be used before gzclose to detect this case. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or 0 in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. If any characters are read or if len == 1, the string is terminated with a null character. If no characters are read due to an end-of-file or len < 1, then the buffer is left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at buf are indeterminate. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file points to has been clobbered or not. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read as the first character on the next read. At least one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream will be started in the output. gzread() is able to read such concatented gzip streams. gzflush should be called only when strictly necessary because it will degrade compression if called too often. */ /* ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ /* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream, and is zero when starting, even if appending or reading a gzip stream from the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); Returns the current offset in the file being read or written. This offset includes the count of bytes that precede the gzip stream, for example when appending or when using gzdopen() for reading. When reading, the offset does not include as yet unused buffered input. This information can be used for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns true (1) if the end-of-file indicator has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set only if the read tried to go past the end of the input, but came up short. Therefore, just like feof(), gzeof() may return false even if there is no more data to read, in the event that the last read request was for the exact number of bytes remaining in the input file. This will happen if the input file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). When writing, gzdirect() returns true (1) if transparent writing was requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: gzdirect() is not needed when writing. Transparent writing must be explicitly requested, so the application already knows the answer. When linking statically, using gzdirect() will include all of the zlib code for gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the last read ended in the middle of a gzip stream, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to using these instead of gzclose() is that they avoid linking in zlib compression or decompression code that is not used when only reading or only writing respectively. If gzclose() is used, then both compression and decompression code will be included the application when linking to a static zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is closed, then the string previously returned by gzerror will no longer be available. gzerror() should be used to distinguish errors from end-of-file for those functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ #endif /* !Z_SOLO */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is Z_NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ /* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note that the z_off_t type (like off_t) is a signed integer. If len2 is negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ /* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ (int)sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, (int)sizeof(z_stream)) #ifndef Z_SOLO /* gzgetc() macro and its supporting function and exposed data structure. Note * that the real internal state is much larger than the exposed structure. * This abbreviated structure exposes just enough for the gzgetc() macro. The * user should not mess with these exposed elements, since their names or * behavior could change in the future, perhaps even capriciously. They can * only be used by the gzgetc() macro. You have been warned. */ struct gzFile_s { unsigned have; unsigned char *next; z_off64_t pos; }; ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) #else # define gzgetc(g) \ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) #endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if * both are true, the application gets the *64 functions, and the regular * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) # ifdef Z_PREFIX_SET # define z_gzopen z_gzopen64 # define z_gzseek z_gzseek64 # define z_gztell z_gztell64 # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 # else # define gzopen gzopen64 # define gzseek gzseek64 # define gztell gztell64 # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 # endif # ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); # endif #else ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif #else /* Z_SOLO */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif /* !Z_SOLO */ /* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; #endif /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); #if defined(_WIN32) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, const char *format, va_list va)); # endif #endif #ifdef __cplusplus } #endif #endif /* ZLIB_H */ golly-3.3-src/gui-web/zlib/gzlib.c0000644000175000017500000004003712362063145013773 00000000000000/* gzlib.c -- zlib functions common to reading and writing gzip files * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" #if defined(_WIN32) && !defined(__BORLANDC__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif #endif /* Local functions */ local void gz_reset OF((gz_statep)); local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message string and return a pointer to it. Typically, the values for ERROR come from GetLastError. The string pointed to shall not be modified by the application, but may be overwritten by a subsequent call to gz_strwinerror The gz_strwinerror function does not change the current setting of GetLastError. */ char ZLIB_INTERNAL *gz_strwinerror (error) DWORD error; { static char buf[1024]; wchar_t *msgbuf; DWORD lasterr = GetLastError(); DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error, 0, /* Default language */ (LPVOID)&msgbuf, 0, NULL); if (chars != 0) { /* If there is an \r\n appended, zap it. */ if (chars >= 2 && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { chars -= 2; msgbuf[chars] = 0; } if (chars > sizeof (buf) - 1) { chars = sizeof (buf) - 1; msgbuf[chars] = 0; } wcstombs(buf, msgbuf, chars + 1); LocalFree(msgbuf); } else { sprintf(buf, "unknown win32 error (%ld)", error); } SetLastError(lasterr); return buf; } #endif /* UNDER_CE */ /* Reset gzip file state */ local void gz_reset(state) gz_statep state; { state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ state->eof = 0; /* not at end of file */ state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) const void *path; int fd; const char *mode; { gz_statep state; size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; #endif #ifdef O_EXCL int exclusive = 0; #endif /* check input */ if (path == NULL) return NULL; /* allocate gzFile structure to return */ state = (gz_statep)malloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ state->want = GZBUFSIZE; /* requested buffer size */ state->msg = NULL; /* no error message yet */ /* interpret mode */ state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; state->direct = 0; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; else switch (*mode) { case 'r': state->mode = GZ_READ; break; #ifndef NO_GZCOMPRESS case 'w': state->mode = GZ_WRITE; break; case 'a': state->mode = GZ_APPEND; break; #endif case '+': /* can't read and write at the same time */ free(state); return NULL; case 'b': /* ignore -- will request binary anyway */ break; #ifdef O_CLOEXEC case 'e': cloexec = 1; break; #endif #ifdef O_EXCL case 'x': exclusive = 1; break; #endif case 'f': state->strategy = Z_FILTERED; break; case 'h': state->strategy = Z_HUFFMAN_ONLY; break; case 'R': state->strategy = Z_RLE; break; case 'F': state->strategy = Z_FIXED; break; case 'T': state->direct = 1; break; default: /* could consider as an error, but just ignore */ ; } mode++; } /* must provide an "r", "w", or "a" */ if (state->mode == GZ_NONE) { free(state); return NULL; } /* can't force transparent read */ if (state->mode == GZ_READ) { if (state->direct) { free(state); return NULL; } state->direct = 1; /* for empty file */ } /* save the path name for error messages */ #ifdef _WIN32 if (fd == -2) { len = wcstombs(NULL, path, 0); if (len == (size_t)-1) len = 0; } else #endif len = strlen((const char *)path); state->path = (char *)malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } #ifdef _WIN32 if (fd == -2) if (len) wcstombs(state->path, path, len + 1); else *(state->path) = 0; else #endif #if !defined(NO_snprintf) && !defined(NO_vsnprintf) snprintf(state->path, len + 1, "%s", (const char *)path); #else strcpy(state->path, path); #endif /* compute the flags for open() */ oflag = #ifdef O_LARGEFILE O_LARGEFILE | #endif #ifdef O_BINARY O_BINARY | #endif #ifdef O_CLOEXEC (cloexec ? O_CLOEXEC : 0) | #endif (state->mode == GZ_READ ? O_RDONLY : (O_WRONLY | O_CREAT | #ifdef O_EXCL (exclusive ? O_EXCL : 0) | #endif (state->mode == GZ_WRITE ? O_TRUNC : O_APPEND))); /* open the file with the appropriate flags (or just use fd) */ state->fd = fd > -1 ? fd : ( #ifdef _WIN32 fd == -2 ? _wopen(path, oflag, 0666) : #endif open((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); return NULL; } if (state->mode == GZ_APPEND) state->mode = GZ_WRITE; /* simplify later checks */ /* save the current position for rewinding (only if reading) */ if (state->mode == GZ_READ) { state->start = LSEEK(state->fd, 0, SEEK_CUR); if (state->start == -1) state->start = 0; } /* initialize stream */ gz_reset(state); /* return stream */ return (gzFile)state; } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen64(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzdopen(fd, mode) int fd; const char *mode; { char *path; /* identifier for error messages */ gzFile gz; if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; #if !defined(NO_snprintf) && !defined(NO_vsnprintf) snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ #else sprintf(path, "", fd); /* for debugging */ #endif gz = gz_open(path, fd, mode); free(path); return gz; } /* -- see zlib.h -- */ #ifdef _WIN32 gzFile ZEXPORT gzopen_w(path, mode) const wchar_t *path; const char *mode; { return gz_open(path, -2, mode); } #endif /* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; unsigned size; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* make sure we haven't already allocated memory */ if (state->size != 0) return -1; /* check and set requested size */ if (size < 2) size = 2; /* need two bytes to check magic header */ state->want = size; return 0; } /* -- see zlib.h -- */ int ZEXPORT gzrewind(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* back up and start over */ if (LSEEK(state->fd, state->start, SEEK_SET) == -1) return -1; gz_reset(state); return 0; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzseek64(file, offset, whence) gzFile file; z_off64_t offset; int whence; { unsigned n; z_off64_t ret; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* check that there's no error */ if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* can only seek from start or relative to current position */ if (whence != SEEK_SET && whence != SEEK_CUR) return -1; /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) offset -= state->x.pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; state->eof = 0; state->past = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; state->x.pos += offset; return state->x.pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; offset += state->x.pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ return -1; } /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? (unsigned)offset : state->x.have; state->x.have -= n; state->x.next += n; state->x.pos += n; offset -= n; } /* request skip (if not zero) */ if (offset) { state->seek = 1; state->skip = offset; } return state->x.pos + offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzseek(file, offset, whence) gzFile file; z_off_t offset; int whence; { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gztell64(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* return position */ return state->x.pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ z_off_t ZEXPORT gztell(file) gzFile file; { z_off64_t ret; ret = gztell64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzoffset64(file) gzFile file; { z_off64_t offset; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* compute and return effective offset in file */ offset = LSEEK(state->fd, 0, SEEK_CUR); if (offset == -1) return -1; if (state->mode == GZ_READ) /* reading */ offset -= state->strm.avail_in; /* don't count buffered input */ return offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzoffset(file) gzFile file; { z_off64_t ret; ret = gzoffset64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ int ZEXPORT gzeof(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return 0; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return 0; /* return end-of-file state */ return state->mode == GZ_READ ? state->past : 0; } /* -- see zlib.h -- */ const char * ZEXPORT gzerror(file, errnum) gzFile file; int *errnum; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return NULL; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return NULL; /* return error information */ if (errnum != NULL) *errnum = state->err; return state->err == Z_MEM_ERROR ? "out of memory" : (state->msg == NULL ? "" : state->msg); } /* -- see zlib.h -- */ void ZEXPORT gzclearerr(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return; /* clear error and end-of-file */ if (state->mode == GZ_READ) { state->eof = 0; state->past = 0; } gz_error(state, Z_OK, NULL); } /* Create an error message in allocated memory and set state->err and state->msg accordingly. Free any previous error message already there. Do not try to free or allocate space if the error is Z_MEM_ERROR (out of memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ void ZLIB_INTERNAL gz_error(state, err, msg) gz_statep state; int err; const char *msg; { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) free(state->msg); state->msg = NULL; } /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ if (err != Z_OK && err != Z_BUF_ERROR) state->x.have = 0; /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; /* for an out of memory error, return literal string when requested */ if (err == Z_MEM_ERROR) return; /* construct error message with path */ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { state->err = Z_MEM_ERROR; return; } #if !defined(NO_snprintf) && !defined(NO_vsnprintf) snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, "%s%s%s", state->path, ": ", msg); #else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); #endif return; } #ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ unsigned ZLIB_INTERNAL gz_intmax() { unsigned p, q; p = 1; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; } #endif golly-3.3-src/gui-web/zlib/zconf.h0000644000175000017500000003622412362063145014013 00000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * Even better than compiling with -DZ_PREFIX would be to use configure to set * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ # define Z_PREFIX_SET /* all linked symbols */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align # define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block # define _tr_tally z__tr_tally # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 # define deflate z_deflate # define deflateBound z_deflateBound # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams # define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset # define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO # define gz_error z_gz_error # define gz_intmax z_gz_intmax # define gz_strwinerror z_gz_strwinerror # define gzbuffer z_gzbuffer # define gzclearerr z_gzclearerr # define gzclose z_gzclose # define gzclose_r z_gzclose_r # define gzclose_w z_gzclose_w # define gzdirect z_gzdirect # define gzdopen z_gzdopen # define gzeof z_gzeof # define gzerror z_gzerror # define gzflush z_gzflush # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ # define gzgets z_gzgets # define gzoffset z_gzoffset # define gzoffset64 z_gzoffset64 # define gzopen z_gzopen # define gzopen64 z_gzopen64 # ifdef _WIN32 # define gzopen_w z_gzopen_w # endif # define gzprintf z_gzprintf # define gzvprintf z_gzvprintf # define gzputc z_gzputc # define gzputs z_gzputs # define gzread z_gzread # define gzrewind z_gzrewind # define gzseek z_gzseek # define gzseek64 z_gzseek64 # define gzsetparams z_gzsetparams # define gztell z_gztell # define gztell64 z_gztell64 # define gzungetc z_gzungetc # define gzwrite z_gzwrite # endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define inflateBackInit_ z_inflateBackInit_ # define inflateCopy z_inflateCopy # define inflateEnd z_inflateEnd # define inflateGetHeader z_inflateGetHeader # define inflateInit2_ z_inflateInit2_ # define inflateInit_ z_inflateInit_ # define inflateMark z_inflateMark # define inflatePrime z_inflatePrime # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary # define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine # define inflateResetKeep z_inflateResetKeep # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table # ifndef Z_SOLO # define uncompress z_uncompress # endif # define zError z_zError # ifndef Z_SOLO # define zcalloc z_zcalloc # define zcfree z_zcfree # endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion /* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte # define Bytef z_Bytef # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func # ifndef Z_SOLO # define gzFile z_gzFile # endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func # define intf z_intf # define out_func z_out_func # define uInt z_uInt # define uIntf z_uIntf # define uLong z_uLong # define uLongf z_uLongf # define voidp z_voidp # define voidpc z_voidpc # define voidpf z_voidpf /* all zlib structs in zlib.h and zconf.h */ # define gz_header_s z_gz_header_s # define internal_state z_internal_state #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif #if defined(ZLIB_CONST) && !defined(z_const) # define z_const const #else # define z_const #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif #ifndef Z_ARG /* function prototypes for stdarg */ # if defined(STDC) || defined(Z_HAVE_STDARG_H) # define Z_ARG(args) args # else # define Z_ARG(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) # include # if (UINT_MAX == 0xffffffffUL) # define Z_U4 unsigned # elif (ULONG_MAX == 0xffffffffUL) # define Z_U4 unsigned long # elif (USHRT_MAX == 0xffffffffUL) # define Z_U4 unsigned short # endif #endif #ifdef Z_U4 typedef Z_U4 z_crc_t; #else typedef unsigned long z_crc_t; #endif #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif #ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif #ifdef STDC # ifndef Z_SOLO # include /* for off_t */ # endif #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO # include /* for va_list */ # endif #endif #ifdef _WIN32 # ifndef Z_SOLO # include /* for wchar_t */ # endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even * though the former does not conform to the LFS document), but considering * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ #if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif #if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) # define Z_HAVE_UNISTD_H #endif #ifndef Z_SOLO # if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ # endif # ifndef z_off_t # define z_off_t off_t # endif # endif #endif #if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 # define Z_LFS64 #endif #if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) # define Z_LARGE64 #endif #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) # define Z_WANT64 #endif #if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else # if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) # define z_off64_t __int64 # else # define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) #pragma map(deflateInit_,"DEIN") #pragma map(deflateInit2_,"DEIN2") #pragma map(deflateEnd,"DEEND") #pragma map(deflateBound,"DEBND") #pragma map(inflateInit_,"ININ") #pragma map(inflateInit2_,"ININ2") #pragma map(inflateEnd,"INEND") #pragma map(inflateSync,"INSY") #pragma map(inflateSetDictionary,"INSEDI") #pragma map(compressBound,"CMBND") #pragma map(inflate_table,"INTABL") #pragma map(inflate_fast,"INFA") #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ golly-3.3-src/gui-web/zlib/inffast.h0000644000175000017500000000065312362063145014323 00000000000000/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); golly-3.3-src/gui-web/zlib/adler32.c0000644000175000017500000001155012362063145014116 00000000000000/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #define local static local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #define BASE 65521 /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* use NO_DIVIDE if your processor does not do division in hardware -- try it both ways to see which is faster */ #ifdef NO_DIVIDE /* note that this assumes BASE is 65521, where 65536 % 65521 == 15 (thank you to John Reiser for pointing this out) */ # define CHOP(a) \ do { \ unsigned long tmp = a >> 16; \ a &= 0xffffUL; \ a += (tmp << 4) - tmp; \ } while (0) # define MOD28(a) \ do { \ CHOP(a); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD(a) \ do { \ CHOP(a); \ MOD28(a); \ } while (0) # define MOD63(a) \ do { /* this assumes a is not negative */ \ z_off64_t tmp = a >> 32; \ a &= 0xffffffffL; \ a += (tmp << 8) - (tmp << 5) + tmp; \ tmp = a >> 16; \ a &= 0xffffL; \ a += (tmp << 4) - tmp; \ tmp = a >> 16; \ a &= 0xffffL; \ a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD28(a) a %= BASE # define MOD63(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; /* for negative len, return invalid adler32 as a clue for debugging */ if (len2 < 0) return 0xffffffffUL; /* the derivation of this formula is left as an exercise for the reader */ MOD63(len2); /* assumes len2 >= 0 */ rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; if (sum1 >= BASE) sum1 -= BASE; if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; uLong adler2; z_off_t len2; { return adler32_combine_(adler1, adler2, len2); } uLong ZEXPORT adler32_combine64(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { return adler32_combine_(adler1, adler2, len2); } golly-3.3-src/gui-web/zlib/compress.c0000644000175000017500000000474112362063145014521 00000000000000/* compress.c -- compress a memory buffer * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } golly-3.3-src/gui-web/zlib/uncompr.c0000644000175000017500000000372312362063145014350 00000000000000/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (z_const Bytef *)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } golly-3.3-src/gui-web/zlib/inftrees.h0000644000175000017500000000556012362063145014512 00000000000000/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program examples/enough.c found in the zlib distribtution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes returns returns 852, and "enough 30 6 15" for distance codes returns 592. The initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ #define ENOUGH_LENS 852 #define ENOUGH_DISTS 592 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) /* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); golly-3.3-src/gui-web/zlib/trees.h0000644000175000017500000002043012362063145014006 00000000000000/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; golly-3.3-src/gui-web/zlib/inflate.c0000644000175000017500000015041012362063145014303 00000000000000/* inflate.c -- zlib decompression * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, unsigned copy)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; if (state->wrap) /* to support ill-conceived Java test suite */ strm->adler = state->wrap & 1; state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; state->sane = 1; state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->wsize = 0; state->whave = 0; state->wnext = 0; return inflateResetKeep(strm); } int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; int windowBits; { int wrap; struct inflate_state FAR *state; /* get the state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { wrap = 0; windowBits = -windowBits; } else { wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } /* set number of window bits, free window if different */ if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { ZFREE(strm, state->window); state->window = Z_NULL; } /* update state and reset the rest of it */ state->wrap = wrap; state->wbits = (unsigned)windowBits; return inflateReset(strm); } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { int ret; struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->window = Z_NULL; ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); strm->state = Z_NULL; } return ret; } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; int value; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; state->bits = 0; return Z_OK; } if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; state->bits += bits; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, end, copy) z_streamp strm; const Bytef *end; unsigned copy; { struct inflate_state FAR *state; unsigned dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->wnext = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ if (copy >= state->wsize) { zmemcpy(state->window, end - state->wsize, state->wsize); state->wnext = 0; state->whave = state->wsize; } else { dist = state->wsize - state->wnext; if (dist > copy) dist = copy; zmemcpy(state->window + state->wnext, end - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, end - copy, copy); state->wnext = copy; state->whave = state->wsize; } else { state->wnext += dist; if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (state->wbits == 0) state->wbits = len; else if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN_; /* decode codes */ if (flush == Z_TREES) { DROPBITS(2); goto inf_leave; } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; case COPY_: state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (const code FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.val < 16) { DROPBITS(here.bits); state->lens[state->have++] = here.val; } else { if (here.val == 16) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { NEEDBITS(here.bits + 3); DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(here.bits + 7); DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { strm->msg = (char *)"invalid code -- missing end-of-block"; state->mode = BAD; break; } /* build code tables -- note: do not change the lenbits or distbits values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (const code FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (const code FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); if (state->mode == TYPE) state->back = -1; break; } state->back = 0; for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; state->length = (unsigned)here.val; if ((int)(here.op) == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->back = -1; state->mode = TYPE; break; } if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if ((here.op & 0xf0) == 0) { last = here; for (;;) { here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR Trace((stderr, "inflate.c too far\n")); copy -= state->whave; if (copy > state->length) copy = state->length; if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = 0; } while (--copy); if (state->length == 0) state->mode = LEN; break; #endif } if (copy > state->wnext) { copy -= state->wnext; from = state->window + (state->wsize - copy); } else from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (out != strm->avail_out && state->mode < BAD && (state->mode < CHECK || flush != Z_FINISH))) if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) z_streamp strm; Bytef *dictionary; uInt *dictLength; { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* copy dictionary */ if (state->whave && dictionary != Z_NULL) { zmemcpy(dictionary, state->window + state->wnext, state->whave - state->wnext); zmemcpy(dictionary + state->whave - state->wnext, state->window, state->wnext); } if (dictLength != Z_NULL) *dictLength = state->whave; return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long dictid; int ret; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary identifier */ if (state->mode == DICT) { dictid = adler32(0L, Z_NULL, 0); dictid = adler32(dictid, dictionary, dictLength); if (dictid != state->check) return Z_DATA_ERROR; } /* copy dictionary to window using updatewindow(), which will amend the existing dictionary if appropriate */ ret = updatewindow(strm, dictionary + dictLength, dictLength); if (ret) { state->mode = MEM; return Z_MEM_ERROR; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } int ZEXPORT inflateGetHeader(strm, head) z_streamp strm; gz_headerp head; { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; const unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } int ZEXPORT inflateUndermine(strm, subvert) z_streamp strm; int subvert; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->sane = !subvert; #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR return Z_OK; #else state->sane = 1; return Z_DATA_ERROR; #endif } long ZEXPORT inflateMark(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; state = (struct inflate_state FAR *)strm->state; return ((long)(state->back) << 16) + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } golly-3.3-src/gui-web/zlib/inflate.h0000644000175000017500000001437712362063145014323 00000000000000/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN_, /* i: same as LEN below, but only first time in */ LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) or (raw) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE (raw) -> TYPEDO Read deflate blocks: TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK STORED -> COPY_ -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN_ LEN_ -> LEN Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 10K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ int sane; /* if false, allow invalid distance too far */ int back; /* bits back of last unprocessed length/lit */ unsigned was; /* initial length of match */ }; golly-3.3-src/gui-web/zlib/gzwrite.c0000644000175000017500000003750712362063145014367 00000000000000/* gzwrite.c -- zlib functions for writing gzip files * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_init OF((gz_statep)); local int gz_comp OF((gz_statep, int)); local int gz_zero OF((gz_statep, z_off64_t)); /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on failure or 0 on success. */ local int gz_init(state) gz_statep state; { int ret; z_streamp strm = &(state->strm); /* allocate input buffer */ state->in = (unsigned char *)malloc(state->want); if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* only need output buffer and deflate state if compressing */ if (!state->direct) { /* allocate output buffer */ state->out = (unsigned char *)malloc(state->want); if (state->out == NULL) { free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* allocate deflate memory, set up for gzip compression */ strm->zalloc = Z_NULL; strm->zfree = Z_NULL; strm->opaque = Z_NULL; ret = deflateInit2(strm, state->level, Z_DEFLATED, MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); if (ret != Z_OK) { free(state->out); free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } } /* mark state as initialized */ state->size = state->want; /* initialize write buffer if compressing */ if (!state->direct) { strm->avail_out = state->size; strm->next_out = state->out; state->x.next = strm->next_out; } return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. If gz->direct is true, then simply write to the output file without compressing, and ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; { int ret, got; unsigned have; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return -1; /* write directly if requested */ if (state->direct) { got = write(state->fd, strm->next_in, strm->avail_in); if (got < 0 || (unsigned)got != strm->avail_in) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } strm->avail_in = 0; return 0; } /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { /* write out current buffer contents if full, or if flushing, but if doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { have = (unsigned)(strm->next_out - state->x.next); if (have && ((got = write(state->fd, state->x.next, have)) < 0 || (unsigned)got != have)) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } if (strm->avail_out == 0) { strm->avail_out = state->size; strm->next_out = state->out; } state->x.next = strm->next_out; } /* compress */ have = strm->avail_out; ret = deflate(strm, flush); if (ret == Z_STREAM_ERROR) { gz_error(state, Z_STREAM_ERROR, "internal error: deflate stream corrupt"); return -1; } have -= strm->avail_out; } while (have); /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) deflateReset(strm); /* all done, no errors */ return 0; } /* Compress len zeros to output. Return -1 on error, 0 on success. */ local int gz_zero(state, len) gz_statep state; z_off64_t len; { int first; unsigned n; z_streamp strm = &(state->strm); /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return -1; /* compress len zeros (len guaranteed > 0) */ first = 1; while (len) { n = GT_OFF(state->size) || (z_off64_t)state->size > len ? (unsigned)len : state->size; if (first) { memset(state->in, 0, n); first = 0; } strm->avail_in = n; strm->next_in = state->in; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; } return 0; } /* -- see zlib.h -- */ int ZEXPORT gzwrite(file, buf, len) gzFile file; voidpc buf; unsigned len; { unsigned put = len; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return 0; } /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* for small len, copy to input buffer, otherwise compress directly */ if (len < state->size) { /* copy to input buffer, compress when full */ do { unsigned have, copy; if (strm->avail_in == 0) strm->next_in = state->in; have = (unsigned)((strm->next_in + strm->avail_in) - state->in); copy = state->size - have; if (copy > len) copy = len; memcpy(state->in + have, buf, copy); strm->avail_in += copy; state->x.pos += copy; buf = (const char *)buf + copy; len -= copy; if (len && gz_comp(state, Z_NO_FLUSH) == -1) return 0; } while (len); } else { /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* directly compress user buffer to file */ strm->avail_in = len; strm->next_in = (z_const Bytef *)buf; state->x.pos += len; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; } /* input was all buffered or compressed (put will fit in int) */ return (int)put; } /* -- see zlib.h -- */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned have; unsigned char buf[1]; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return -1; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* try writing to input buffer for speed (state->size == 0 if buffer not initialized) */ if (state->size) { if (strm->avail_in == 0) strm->next_in = state->in; have = (unsigned)((strm->next_in + strm->avail_in) - state->in); if (have < state->size) { state->in[have] = c; strm->avail_in++; state->x.pos++; return c & 0xff; } } /* no room in buffer or not initialized, use gz_write() */ buf[0] = c; if (gzwrite(file, buf, 1) != 1) return -1; return c & 0xff; } /* -- see zlib.h -- */ int ZEXPORT gzputs(file, str) gzFile file; const char *str; { int ret; unsigned len; /* write string */ len = (unsigned)strlen(str); ret = gzwrite(file, str, len); return ret == 0 && len != 0 ? -1 : ret; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int size, len; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf((char *)(state->in), format, va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else len = vsprintf((char *)(state->in), format, va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf((char *)(state->in), size, format, va); len = strlen((char *)(state->in)); # else len = vsnprintf((char *)(state->in), size, format, va); # endif #endif /* check that printf() results fit in buffer */ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) return 0; /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; state->x.pos += len; return len; } int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { va_list va; int ret; va_start(va, format); ret = gzvprintf(file, format, va); va_end(va); return ret; } #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { int size, len; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that can really pass pointer in ints */ if (sizeof(int) != sizeof(void *)) return 0; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen((char *)(state->in)); # else len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif /* check that printf() results fit in buffer */ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) return 0; /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; state->x.pos += len; return len; } #endif /* -- see zlib.h -- */ int ZEXPORT gzflush(file, flush) gzFile file; int flush; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* check flush parameter */ if (flush < 0 || flush > Z_FINISH) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* compress remaining data with requested flush */ gz_comp(state, flush); return state->err; } /* -- see zlib.h -- */ int ZEXPORT gzsetparams(file, level, strategy) gzFile file; int level; int strategy; { gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ if (level == state->level && strategy == state->strategy) return Z_OK; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* change compression parameters for subsequent input */ if (state->size) { /* flush previous input with previous parameters before changing */ if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) return state->err; deflateParams(strm, level, strategy); } state->level = level; state->strategy = strategy; return Z_OK; } /* -- see zlib.h -- */ int ZEXPORT gzclose_w(file) gzFile file; { int ret = Z_OK; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing */ if (state->mode != GZ_WRITE) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) ret = state->err; } /* flush, free memory, and close file */ if (gz_comp(state, Z_FINISH) == -1) ret = state->err; if (state->size) { if (!state->direct) { (void)deflateEnd(&(state->strm)); free(state->out); } free(state->in); } gz_error(state, Z_OK, NULL); free(state->path); if (close(state->fd) == -1) ret = Z_ERRNO; free(state); return ret; } golly-3.3-src/gui-web/zlib/gzclose.c0000644000175000017500000000124612362063145014331 00000000000000/* gzclose.c -- zlib gzclose() function * Copyright (C) 2004, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ int ZEXPORT gzclose(file) gzFile file; { #ifndef NO_GZCOMPRESS gz_statep state; if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); #else return gzclose_r(file); #endif } golly-3.3-src/gui-web/zlib/crc32.h0000644000175000017500000007354212362063145013614 00000000000000/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; golly-3.3-src/gui-web/zlib/gzguts.h0000644000175000017500000001463012362063145014214 00000000000000/* gzguts.h -- zlib internal header definitions for gz* operations * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifdef _LARGEFILE64_SOURCE # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif # ifdef _FILE_OFFSET_BITS # undef _FILE_OFFSET_BITS # endif #endif #ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL #endif #include #include "zlib.h" #ifdef STDC # include # include # include #endif #include #ifdef _WIN32 # include #endif #if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) # include #endif #ifdef WINAPI_FAMILY # define open _open # define read _read # define write _write # define close _close #endif #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) # define vsnprintf _vsnprintf # endif # endif # endif # ifdef __SASC # define NO_vsnprintf # endif # ifdef VMS # define NO_vsnprintf # endif # ifdef __OS400__ # define NO_vsnprintf # endif # ifdef __MVS__ # define NO_vsnprintf # endif #endif /* unlike snprintf (which is required in C99, yet still not supported by Microsoft more than a decade later!), _snprintf does not guarantee null termination of the result -- however this is only used in gzlib.c where the result is assured to fit in the space provided */ #ifdef _MSC_VER # define snprintf _snprintf #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ /* gz* functions always use library allocation functions */ #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif /* get errno and strerror definition */ #if defined UNDER_CE # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else # ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else # define zstrerror() "stdio error (consult errno)" # endif #endif /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); #endif /* default memLevel */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default i/o buffer size -- double this for output when reading (this and twice this must be able to fit in an unsigned type) */ #define GZBUFSIZE 8192 /* gzip modes, also provide a little integrity check on the passed structure */ #define GZ_NONE 0 #define GZ_READ 7247 #define GZ_WRITE 31153 #define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ /* values for gz_state how */ #define LOOK 0 /* look for a gzip header */ #define COPY 1 /* copy input directly */ #define GZIP 2 /* decompress a gzip stream */ /* internal gzip file state data structure */ typedef struct { /* exposed contents for gzgetc() macro */ struct gzFile_s x; /* "x" for exposed */ /* x.have: number of bytes available at x.next */ /* x.next: next output data to deliver or write */ /* x.pos: current position in uncompressed data */ /* used for both reading and writing */ int mode; /* see gzip modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ unsigned char *in; /* input buffer */ unsigned char *out; /* output buffer (double-sized when reading) */ int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ int how; /* 0: get header, 1: copy, 2: decompress */ z_off64_t start; /* where the gzip data started, for rewinding */ int eof; /* true if end of input file reached */ int past; /* true if read requested past end */ /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ /* error information */ int err; /* error code */ char *msg; /* error message */ /* zlib inflate or deflate stream */ z_stream strm; /* stream structure in-place (not a pointer) */ } gz_state; typedef gz_state FAR *gz_statep; /* shared functions */ void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); #if defined UNDER_CE char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else unsigned ZLIB_INTERNAL gz_intmax OF((void)); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif golly-3.3-src/gui-web/zlib/deflate.c0000644000175000017500000021346412362063145014276 00000000000000/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local block_state deflate_rle OF((deflate_state *s, int flush)); local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ #define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->high_water = 0; /* nothing written to s->window yet */ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt str, n; int wrap; unsigned avail; z_const unsigned char *next; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) return Z_STREAM_ERROR; s = strm->state; wrap = s->wrap; if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; /* when using zlib wrappers, compute Adler-32 for provided dictionary */ if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); s->wrap = 0; /* avoid computing Adler-32 in read_buf */ /* if dictionary would fill window, just replace the history */ if (dictLength >= s->w_size) { if (wrap == 0) { /* already empty otherwise */ CLEAR_HASH(s); s->strstart = 0; s->block_start = 0L; s->insert = 0; } dictionary += dictLength - s->w_size; /* use the tail */ dictLength = s->w_size; } /* insert dictionary into window and hash */ avail = strm->avail_in; next = strm->next_in; strm->avail_in = dictLength; strm->next_in = (z_const Bytef *)dictionary; fill_window(s); while (s->lookahead >= MIN_MATCH) { str = s->strstart; n = s->lookahead - (MIN_MATCH-1); do { UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); #ifndef FASTEST s->prev[str & s->w_mask] = s->head[s->ins_h]; #endif s->head[s->ins_h] = (Pos)str; str++; } while (--n); s->strstart = str; s->lookahead = MIN_MATCH-1; fill_window(s); } s->strstart += s->lookahead; s->block_start = (long)s->strstart; s->insert = s->lookahead; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; strm->next_in = next; strm->avail_in = avail; s->wrap = wrap; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { int ret; ret = deflateResetKeep(strm); if (ret == Z_OK) lm_init(strm->state); return ret; } /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePending (strm, pending, bits) unsigned *pending; int *bits; z_streamp strm; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; if (bits != Z_NULL) *bits = strm->state->bi_valid; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { deflate_state *s; int put; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; if (put > bits) put = bits; s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); s->bi_valid += put; _tr_flush_bits(s); value >>= put; bits -= put; } while (bits); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_BLOCK); if (err == Z_BUF_ERROR && s->pending == 0) err = Z_OK; } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) z_streamp strm; int good_length; int max_lazy; int nice_length; int max_chain; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds for * every combination of windowBits and memLevel. But even the conservative * upper bound of about 14% expansion does not seem onerous for output buffer * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong complen, wraplen; Bytef *str; /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; /* if can't get parameters, return conservative bound plus zlib wrapper */ if (strm == Z_NULL || strm->state == Z_NULL) return complen + 6; /* compute wrapper length */ s = strm->state; switch (s->wrap) { case 0: /* raw deflate */ wraplen = 0; break; case 1: /* zlib wrapper */ wraplen = 6 + (s->strstart ? 4 : 0); break; case 2: /* gzip wrapper */ wraplen = 18; if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ if (s->gzhead->extra != Z_NULL) wraplen += 2 + s->gzhead->extra_len; str = s->gzhead->name; if (str != Z_NULL) do { wraplen++; } while (*str++); str = s->gzhead->comment; if (str != Z_NULL) do { wraplen++; } while (*str++); if (s->gzhead->hcrc) wraplen += 2; } break; default: /* for compiler happiness */ wraplen = 6; } /* if not default parameters, return conservative bound */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) return complen + wraplen; /* default settings: return tight bound for that case */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len; deflate_state *s = strm->state; _tr_flush_bits(s); len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; s->pending_out += len; strm->total_out += len; strm->avail_out -= len; s->pending -= len; if (s->pending == 0) { s->pending_out = s->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : (s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush)); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; s->insert = 0; } } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, buf, len); } #endif strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #endif /* FASTEST */ #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead + s->insert >= MIN_MATCH) { uInt str = s->strstart - s->insert; s->ins_h = s->window[str]; UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif while (s->insert) { UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); #ifndef FASTEST s->prev[str & s->w_mask] = s->head[s->ins_h]; #endif s->head[s->ins_h] = (Pos)str; str++; s->insert--; if (s->lookahead + s->insert < MIN_MATCH) break; } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); /* If the WIN_INIT bytes after the end of the current data have never been * written, then zero those bytes in order to avoid memory check reports of * the use of uninitialized (or uninitialised as Julian writes) bytes by * the longest match routines. Update the high water mark for the next * time through here. WIN_INIT is set to MAX_MATCH since the longest match * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. */ if (s->high_water < s->window_size) { ulg curr = s->strstart + (ulg)(s->lookahead); ulg init; if (s->high_water < curr) { /* Previous high water mark below current data -- zero WIN_INIT * bytes or up to end of window, whichever is less. */ init = s->window_size - curr; if (init > WIN_INIT) init = WIN_INIT; zmemzero(s->window + curr, (unsigned)init); s->high_water = curr + init; } else if (s->high_water < (ulg)curr + WIN_INIT) { /* High water mark at or above current data, but below current data * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up * to end of window, whichever is less. */ init = (ulg)curr + WIN_INIT - s->high_water; if (init > s->window_size - s->high_water) init = s->window_size - s->high_water; zmemzero(s->window + s->high_water, (unsigned)init); s->high_water += init; } } Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, "not enough room for search"); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, last) { \ FLUSH_BLOCK_ONLY(s, last); \ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } s->insert = 0; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if ((long)s->strstart > s->block_start) FLUSH_BLOCK(s, 0); return block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } #endif /* FASTEST */ /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest run, plus one for the unrolled loop. */ if (s->lookahead <= MAX_MATCH) { fill_window(s); if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ s->match_length = 0; if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; prev = *scan; if (prev == *++scan && prev == *++scan && prev == *++scan) { strend = s->window + s->strstart + MAX_MATCH; do { } while (prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); s->match_length = MAX_MATCH - (int)(strend - scan); if (s->match_length > s->lookahead) s->match_length = s->lookahead; } Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, s->match_length); _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; s->strstart += s->match_length; s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } s->insert = 0; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } /* =========================================================================== * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ local block_state deflate_huff(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we have a literal to write. */ if (s->lookahead == 0) { fill_window(s); if (s->lookahead == 0) { if (flush == Z_NO_FLUSH) return need_more; break; /* flush the current block */ } } /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } s->insert = 0; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } golly-3.3-src/gui-web/zlib/inftrees.c0000644000175000017500000003134412362063145014504 00000000000000/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)1; here.val = (unsigned short)0; *(*table)++ = here; /* make a table to force an error */ *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked for LENS and DIST tables against the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in the initial root table size constants. See the comments in inftrees.h for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if ((type == LENS && used > ENOUGH_LENS) || (type == DISTS && used > ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ here.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { here.op = (unsigned char)0; here.val = work[sym]; } else if ((int)(work[sym]) > end) { here.op = (unsigned char)(extra[work[sym]]); here.val = base[work[sym]]; } else { here.op = (unsigned char)(32 + 64); /* end of block */ here.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if ((type == LENS && used > ENOUGH_LENS) || (type == DISTS && used > ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* fill in remaining table entry if code is incomplete (guaranteed to have at most one remaining entry, since if the code is incomplete, the maximum code length that was allowed to get this far is one bit) */ if (huff != 0) { here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)(len - drop); here.val = (unsigned short)0; next[huff] = here; } /* set return parameters */ *table += used; *bits = root; return 0; } golly-3.3-src/gui-web/zlib/zutil.h0000644000175000017500000001515612362063145014044 00000000000000/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL #endif #include "zlib.h" #if defined(STDC) && !defined(Z_SOLO) # if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif # include # include #endif #ifdef Z_SOLO typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # ifndef Z_SOLO # if defined(__TURBOC__) || defined(__BORLANDC__) # if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 # if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # ifndef Z_SOLO # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 #pragma warn -8066 #endif /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int ZLIB_INTERNAL z_verbose; extern void ZLIB_INTERNAL z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif #ifndef Z_SOLO voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); #endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} /* Reverse the bytes in a 32-bit value */ #define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) #endif /* ZUTIL_H */ golly-3.3-src/gui-web/zlib/gzread.c0000644000175000017500000004440612362063145014144 00000000000000/* gzread.c -- zlib functions for reading gzip files * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ local int gz_load(state, buf, len, have) gz_statep state; unsigned char *buf; unsigned len; unsigned *have; { int ret; *have = 0; do { ret = read(state->fd, buf + *have, len - *have); if (ret <= 0) break; *have += ret; } while (*have < len); if (ret < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } if (ret == 0) state->eof = 1; return 0; } /* Load up input buffer and set eof flag if last data loaded -- return -1 on error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. If strm->avail_in != 0, then the current data is moved to the beginning of the input buffer, and then the remainder of the buffer is loaded with the available data from the input file. */ local int gz_avail(state) gz_statep state; { unsigned got; z_streamp strm = &(state->strm); if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { if (strm->avail_in) { /* copy what's there to the start */ unsigned char *p = state->in; unsigned const char *q = strm->next_in; unsigned n = strm->avail_in; do { *p++ = *q++; } while (--n); } if (gz_load(state, state->in + strm->avail_in, state->size - strm->avail_in, &got) == -1) return -1; strm->avail_in += got; strm->next_in = state->in; } return 0; } /* Look for gzip header, set up for inflate or copy. state->x.have must be 0. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will be set to GZIP for decompression. If direct copying, then leftover input data from the input buffer will be copied to the output buffer. In that case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state will be initialized. gz_look() will return 0 on success or -1 on failure. */ local int gz_look(state) gz_statep state; { z_streamp strm = &(state->strm); /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ state->in = (unsigned char *)malloc(state->want); state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) free(state->out); if (state->in != NULL) free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } state->size = state->want; /* allocate inflate memory */ state->strm.zalloc = Z_NULL; state->strm.zfree = Z_NULL; state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ free(state->out); free(state->in); state->size = 0; gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } } /* get at least the magic bytes in the input buffer */ if (strm->avail_in < 2) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } /* look for gzip magic bytes -- if there, do gzip decoding (note: there is a logical dilemma here when considering the case of a partially written gzip file, to wit, if a single 31 byte is written, then we cannot tell whether this is a single-byte file, or just a partially written gzip file -- for here we assume that if a gzip file is being written, then the header will be written in a single operation, so that reading a single byte is sufficient indication that it is not a gzip file) */ if (strm->avail_in > 1 && strm->next_in[0] == 31 && strm->next_in[1] == 139) { inflateReset(strm); state->how = GZIP; state->direct = 0; return 0; } /* no gzip header -- if we were decoding gzip before, then this is trailing garbage. Ignore the trailing garbage and finish. */ if (state->direct == 0) { strm->avail_in = 0; state->eof = 1; state->x.have = 0; return 0; } /* doing raw i/o, copy any leftover input to output -- this assumes that the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->x.next = state->out; if (strm->avail_in) { memcpy(state->x.next, strm->next_in, strm->avail_in); state->x.have = strm->avail_in; strm->avail_in = 0; } state->how = COPY; state->direct = 1; return 0; } /* Decompress from input to the provided next_out and avail_out in the state. On return, state->x.have and state->x.next point to the just decompressed data. If the gzip stream completes, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->x.have is depleted. Returns 0 on success, -1 on failure. */ local int gz_decomp(state) gz_statep state; { int ret = Z_OK; unsigned had; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ had = strm->avail_out; do { /* get more input for inflate() */ if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { gz_error(state, Z_BUF_ERROR, "unexpected end of file"); break; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); /* update available output */ state->x.have = had - strm->avail_out; state->x.next = strm->next_out - state->x.have; /* if the gzip stream completed successfully, look for another */ if (ret == Z_STREAM_END) state->how = LOOK; /* good decompression */ return 0; } /* Fetch data and put it in the output buffer. Assumes state->x.have is 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is looked for to determine whether to copy or decompress. Returns -1 on error, otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ local int gz_fetch(state) gz_statep state; { z_streamp strm = &(state->strm); do { switch(state->how) { case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ if (gz_look(state) == -1) return -1; if (state->how == LOOK) return 0; break; case COPY: /* -> COPY */ if (gz_load(state, state->out, state->size << 1, &(state->x.have)) == -1) return -1; state->x.next = state->out; return 0; case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ strm->avail_out = state->size << 1; strm->next_out = state->out; if (gz_decomp(state) == -1) return -1; } } while (state->x.have == 0 && (!state->eof || strm->avail_in)); return 0; } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ local int gz_skip(state, len) gz_statep state; z_off64_t len; { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ if (state->x.have) { n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? (unsigned)len : state->x.have; state->x.have -= n; state->x.next += n; state->x.pos += n; len -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && state->strm.avail_in == 0) break; /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) return -1; } return 0; } /* -- see zlib.h -- */ int ZEXPORT gzread(file, buf, len) gzFile file; voidp buf; unsigned len; { unsigned got, n; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return -1; } /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return -1; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { /* first just try copying data from the output buffer */ if (state->x.have) { n = state->x.have > len ? len : state->x.have; memcpy(buf, state->x.next, n); state->x.next += n; state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && strm->avail_in == 0) { state->past = 1; /* tried to read past end */ break; } /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) return -1; continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ if (gz_load(state, (unsigned char *)buf, len, &n) == -1) return -1; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ strm->avail_out = len; strm->next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) return -1; n = state->x.have; state->x.have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; state->x.pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ return (int)got; } /* -- see zlib.h -- */ #ifdef Z_PREFIX_SET # undef z_gzgetc #else # undef gzgetc #endif int ZEXPORT gzgetc(file) gzFile file; { int ret; unsigned char buf[1]; gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* try output buffer (no need to check for skip request) */ if (state->x.have) { state->x.have--; state->x.pos++; return *(state->x.next)++; } /* nothing there -- try gzread() */ ret = gzread(file, buf, 1); return ret < 1 ? -1 : buf[0]; } int ZEXPORT gzgetc_(file) gzFile file; { return gzgetc(file); } /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return -1; } /* can't push EOF */ if (c < 0) return -1; /* if output buffer empty, put byte at end (allows more pushing) */ if (state->x.have == 0) { state->x.have = 1; state->x.next = state->out + (state->size << 1) - 1; state->x.next[0] = c; state->x.pos--; state->past = 0; return c; } /* if no room, give up (must have already done a gzungetc()) */ if (state->x.have == (state->size << 1)) { gz_error(state, Z_DATA_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ if (state->x.next == state->out) { unsigned char *src = state->out + state->x.have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; state->x.next = dest; } state->x.have++; state->x.next--; state->x.next[0] = c; state->x.pos--; state->past = 0; return c; } /* -- see zlib.h -- */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { unsigned left, n; char *str; unsigned char *eol; gz_statep state; /* check parameters and get internal structure */ if (file == NULL || buf == NULL || len < 1) return NULL; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return NULL; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return NULL; } /* copy output bytes up to new line or len - 1, whichever comes first -- append a terminating zero to the string (we don't check for a zero in the contents, let the user worry about that) */ str = buf; left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ if (state->x.have == 0 && gz_fetch(state) == -1) return NULL; /* error */ if (state->x.have == 0) { /* end of file */ state->past = 1; /* read past end */ break; /* return what we have */ } /* look for end-of-line in current output buffer */ n = state->x.have > left ? left : state->x.have; eol = (unsigned char *)memchr(state->x.next, '\n', n); if (eol != NULL) n = (unsigned)(eol - state->x.next) + 1; /* copy through end-of-line, or remainder if not found */ memcpy(buf, state->x.next, n); state->x.have -= n; state->x.next += n; state->x.pos += n; left -= n; buf += n; } while (left && eol == NULL); /* return terminated string, or if nothing, end of file */ if (buf == str) return NULL; buf[0] = 0; return str; } /* -- see zlib.h -- */ int ZEXPORT gzdirect(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) (void)gz_look(state); /* return 1 if transparent, 0 if processing a gzip stream */ return state->direct; } /* -- see zlib.h -- */ int ZEXPORT gzclose_r(file) gzFile file; { int ret, err; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're reading */ if (state->mode != GZ_READ) return Z_STREAM_ERROR; /* free memory and close file */ if (state->size) { inflateEnd(&(state->strm)); free(state->out); free(state->in); } err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); return ret ? Z_ERRNO : err; } golly-3.3-src/gui-web/zlib/crc32.c0000644000175000017500000003156612362063145013607 00000000000000/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Definitions for doing the crc four data bytes at a time. */ #if !defined(NOBYFOUR) && defined(Z_U4) # define BYFOUR #endif #ifdef BYFOUR local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { z_crc_t c; int n, k; z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0; for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; uInt len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register z_crc_t c; register const z_crc_t FAR *buf4; c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register z_crc_t c; register const z_crc_t FAR *buf4; c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(mat, vec) unsigned long *mat; unsigned long vec; { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(square, mat) unsigned long *square; unsigned long *mat; { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case (also disallow negative lengths) */ if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } /* ========================================================================= */ uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; z_off_t len2; { return crc32_combine_(crc1, crc2, len2); } uLong ZEXPORT crc32_combine64(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { return crc32_combine_(crc1, crc2, len2); } golly-3.3-src/gui-web/zlib/inffast.c0000644000175000017500000003221712362063145014317 00000000000000/* inffast.c -- fast decoding * Copyright (C) 1995-2008, 2010, 2013 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - M68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void ZLIB_INTERNAL inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } here = lcode[hold & lmask]; dolen: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op == 0) { /* literal */ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); PUP(out) = (unsigned char)(here.val); } else if (op & 16) { /* length base */ len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } here = dcode[hold & dmask]; dodist: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op & 16) { /* distance base */ dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR if (len <= op - whave) { do { PUP(out) = 0; } while (--len); continue; } len -= op - whave; do { PUP(out) = 0; } while (--op > whave); if (op == 0) { from = out - dist; do { PUP(out) = PUP(from); } while (--len); continue; } #endif } from = window - OFF; if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (wnext < op) { /* wrap around window */ from += wsize + wnext - op; op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += wnext - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ golly-3.3-src/gui-web/zlib/inffixed.h0000644000175000017500000001427412362063145014471 00000000000000 /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of this library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; golly-3.3-src/gui-web/shell.html0000644000175000017500000022100013307733370013550 00000000000000 Golly

Abort Paste Paste Here Paste to Selection Flip Top-Bottom Flip Left-Right Rotate Clockwise Rotate Anticlockwise
Remove Selection Cut Copy Clear Clear Outside Shrink Fit Random Fill Flip Top-Bottom Flip Left-Right Rotate Clockwise Rotate Anticlockwise Advance Advance Outside
Open a file on your computer
Save current pattern
File name:   
list of valid extensions
Random fill percentage:
Maximum hash memory: MB
Ask to save changes:
Play beep sound:
contents
contents
title
percent
Clipboard data used by
Patterns
           
        
{{{ SCRIPT }}} golly-3.3-src/gui-web/Makefile0000755000175000017500000004633013543255652013235 00000000000000# Makefile for creating web app version of Golly using Emscripten. # Type "emmake make" to build golly.html and golly.js. SOURCES = main.cpp webcalls.cpp \ ../gollybase/bigint.cpp \ ../gollybase/generationsalgo.cpp \ ../gollybase/ghashbase.cpp \ ../gollybase/ghashdraw.cpp \ ../gollybase/hlifealgo.cpp \ ../gollybase/hlifedraw.cpp \ ../gollybase/jvnalgo.cpp \ ../gollybase/lifealgo.cpp \ ../gollybase/lifepoll.cpp \ ../gollybase/liferender.cpp \ ../gollybase/liferules.cpp \ ../gollybase/ltlalgo.cpp \ ../gollybase/ltldraw.cpp \ ../gollybase/qlifealgo.cpp \ ../gollybase/qlifedraw.cpp \ ../gollybase/readpattern.cpp \ ../gollybase/ruleloaderalgo.cpp \ ../gollybase/ruletable_algo.cpp \ ../gollybase/ruletreealgo.cpp \ ../gollybase/util.cpp \ ../gollybase/viewport.cpp \ ../gollybase/writepattern.cpp \ ../gui-common/algos.cpp \ ../gui-common/control.cpp \ ../gui-common/file.cpp \ ../gui-common/layer.cpp \ ../gui-common/prefs.cpp \ ../gui-common/render.cpp \ ../gui-common/select.cpp \ ../gui-common/status.cpp \ ../gui-common/undo.cpp \ ../gui-common/utils.cpp \ ../gui-common/view.cpp \ ../gui-common/MiniZip/ioapi.c \ ../gui-common/MiniZip/unzip.c \ ../gui-common/MiniZip/zip.c \ zlib/adler32.c \ zlib/compress.c \ zlib/crc32.c \ zlib/deflate.c \ zlib/gzclose.c \ zlib/gzlib.c \ zlib/gzread.c \ zlib/gzwrite.c \ zlib/infback.c \ zlib/inffast.c \ zlib/inflate.c \ zlib/inftrees.c \ zlib/trees.c \ zlib/uncompr.c \ zlib/zutil.c OBJECTS = main.o webcalls.o \ ../gollybase/bigint.o \ ../gollybase/generationsalgo.o \ ../gollybase/ghashbase.o \ ../gollybase/ghashdraw.o \ ../gollybase/hlifealgo.o \ ../gollybase/hlifedraw.o \ ../gollybase/jvnalgo.o \ ../gollybase/lifealgo.o \ ../gollybase/lifepoll.o \ ../gollybase/liferender.o \ ../gollybase/liferules.o \ ../gollybase/ltlalgo.o \ ../gollybase/ltldraw.o \ ../gollybase/qlifealgo.o \ ../gollybase/qlifedraw.o \ ../gollybase/readpattern.o \ ../gollybase/ruleloaderalgo.o \ ../gollybase/ruletable_algo.o \ ../gollybase/ruletreealgo.o \ ../gollybase/util.o \ ../gollybase/viewport.o \ ../gollybase/writepattern.o \ ../gui-common/algos.o \ ../gui-common/control.o \ ../gui-common/file.o \ ../gui-common/layer.o \ ../gui-common/prefs.o \ ../gui-common/render.o \ ../gui-common/select.o \ ../gui-common/status.o \ ../gui-common/undo.o \ ../gui-common/utils.o \ ../gui-common/view.o \ ../gui-common/MiniZip/ioapi.o \ ../gui-common/MiniZip/unzip.o \ ../gui-common/MiniZip/zip.o \ zlib/adler32.o \ zlib/compress.o \ zlib/crc32.o \ zlib/deflate.o \ zlib/gzclose.o \ zlib/gzlib.o \ zlib/gzread.o \ zlib/gzwrite.o \ zlib/infback.o \ zlib/inffast.o \ zlib/inflate.o \ zlib/inftrees.o \ zlib/trees.o \ zlib/uncompr.o \ zlib/zutil.o CFLAGS = -Izlib -Wall -Wextra -Wno-unused-parameter -Wno-implicit-function-declaration -O2 CXXFLAGS = -Izlib -I. -I../gollybase -I../gui-common -I../gui-common/MiniZip \ -DVERSION=3.3 -DZLIB -DWEB_GUI -Wall -Wextra -Wno-unused-parameter -O2 # NOTE 1: -O2 results in a much smaller golly.js and no .map file # NOTE 2: replace -O2 with the following settings to catch errors: # -s ASSERTIONS=2 -s SAFE_HEAP=1 TARGET = golly.html all: $(TARGET) $(TARGET): $(OBJECTS) jslib.js shell.html $(CXX) $(CXXFLAGS) --js-library jslib.js --shell-file shell.html \ --preload-file ../Patterns@/Patterns \ --preload-file ../Rules@/Rules \ --preload-file Help \ --preload-file ../gui-common/Help/intro.html@/Help/intro.html \ --preload-file ../gui-common/Help/tips.html@/Help/tips.html \ --preload-file ../gui-common/Help/archives.html@/Help/archives.html \ --preload-file ../gui-common/Help/refs.html@/Help/refs.html \ --preload-file ../gui-common/Help/formats.html@/Help/formats.html \ --preload-file ../gui-common/Help/bounded.html@/Help/bounded.html \ --preload-file ../gui-common/Help/credits.html@/Help/credits.html \ --preload-file ../gui-common/Help/algos.html@/Help/algos.html \ --preload-file ../gui-common/Help/Algorithms@/Help/Algorithms \ --preload-file ../gui-common/Help/Lexicon@/Help/Lexicon \ -s TOTAL_MEMORY=320*1024*1024 \ -s EXPORTED_FUNCTIONS="[ '_ClearStatus', '_NewUniverse', '_ResizeCanvas', \ '_SetViewport', '_StartStop', '_Next', '_Step', '_GoSlower', '_GoFaster', '_StepBy1', \ '_Undo', '_Redo', '_Fit', '_ZoomOut', '_ZoomIn', '_Scale1to1', '_Reset', \ '_ToggleIcons', '_ModeChanged', '_StateChanged', '_DoMenuItem', '_UpdateMenuItems', \ '_Paste', '_PasteAction', '_SelectionAction', '_OpenClickedFile', '_OpenClipboard', \ '_ToggleAutoFit', '_OverCanvas', '_OnKeyChanged', '_OnMouseWheel', '_Info', '_CloseInfo', \ '_Help', '_DoHelpClick', '_HelpBack', '_HelpNext', '_HelpContents', '_CloseHelp', \ '_FileCreated', '_CancelProgress', '_CancelOpen', '_SaveFile', '_CancelSave', \ '_StorePrefs', '_CancelPrefs', '_SaveLocalPrefs', '_FullScreen', '_ExitFullScreen', \ '_UnsavedChanges' ]" \ -o $@ $(LDFLAGS) $(OBJECTS) # better to use -s ALLOW_MEMORY_GROWTH=1 instead of setting TOTAL_MEMORY??? # (note that newer versions of Emscripten require TOTAL_MEMORY to be multiple of 16MB) clean: $(RM) $(OBJECTS) $(TARGET) golly.js golly.data depend: @$(CXX) $(CXXFLAGS) -MM $(SOURCES) # type "emmake make depend" to generate these dependencies: main.o: main.cpp ../gollybase/bigint.h ../gollybase/lifealgo.h \ ../gollybase/viewport.h ../gollybase/liferender.h \ ../gollybase/lifepoll.h ../gollybase/readpattern.h \ ../gollybase/platform.h ../gollybase/qlifealgo.h \ ../gollybase/liferules.h ../gollybase/hlifealgo.h \ ../gollybase/generationsalgo.h ../gollybase/ghashbase.h \ ../gollybase/ltlalgo.h ../gollybase/jvnalgo.h \ ../gollybase/ruleloaderalgo.h ../gollybase/ruletable_algo.h \ ../gollybase/ruletreealgo.h ../gui-common/algos.h \ ../gui-common/utils.h ../gui-common/prefs.h ../gui-common/layer.h \ ../gui-common/select.h ../gui-common/control.h ../gui-common/file.h \ ../gollybase/writepattern.h ../gui-common/view.h \ ../gui-common/status.h ../gui-common/undo.h ../gui-common/render.h \ webcalls.h webcalls.o: webcalls.cpp ../gollybase/util.h ../gui-common/utils.h \ ../gui-common/algos.h ../gollybase/lifealgo.h ../gollybase/bigint.h \ ../gollybase/viewport.h ../gollybase/liferender.h \ ../gollybase/lifepoll.h ../gollybase/readpattern.h \ ../gollybase/platform.h ../gui-common/prefs.h ../gui-common/layer.h \ ../gui-common/select.h ../gui-common/control.h ../gui-common/file.h \ ../gollybase/writepattern.h ../gui-common/view.h \ ../gui-common/status.h ../gui-common/undo.h webcalls.h bigint.o: ../gollybase/bigint.cpp ../gollybase/bigint.h \ ../gollybase/util.h generationsalgo.o: ../gollybase/generationsalgo.cpp \ ../gollybase/generationsalgo.h ../gollybase/ghashbase.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ghashbase.o: ../gollybase/ghashbase.cpp ../gollybase/ghashbase.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h ghashdraw.o: ../gollybase/ghashdraw.cpp ../gollybase/ghashbase.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h hlifealgo.o: ../gollybase/hlifealgo.cpp ../gollybase/hlifealgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h hlifedraw.o: ../gollybase/hlifedraw.cpp ../gollybase/hlifealgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h jvnalgo.o: ../gollybase/jvnalgo.cpp ../gollybase/jvnalgo.h \ ../gollybase/ghashbase.h ../gollybase/lifealgo.h ../gollybase/bigint.h \ ../gollybase/viewport.h ../gollybase/liferender.h \ ../gollybase/lifepoll.h ../gollybase/readpattern.h \ ../gollybase/platform.h ../gollybase/liferules.h lifealgo.o: ../gollybase/lifealgo.cpp ../gollybase/lifealgo.h \ ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h ../gollybase/util.h lifepoll.o: ../gollybase/lifepoll.cpp ../gollybase/lifepoll.h \ ../gollybase/util.h liferender.o: ../gollybase/liferender.cpp ../gollybase/liferender.h liferules.o: ../gollybase/liferules.cpp ../gollybase/liferules.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h ../gollybase/util.h ltlalgo.o: ../gollybase/ltlalgo.cpp ../gollybase/ltlalgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h ltldraw.o: ../gollybase/ltldraw.cpp ../gollybase/ltlalgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h qlifealgo.o: ../gollybase/qlifealgo.cpp ../gollybase/qlifealgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h qlifedraw.o: ../gollybase/qlifedraw.cpp ../gollybase/qlifealgo.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h readpattern.o: ../gollybase/readpattern.cpp ../gollybase/readpattern.h \ ../gollybase/bigint.h ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/platform.h ../gollybase/liferules.h ../gollybase/util.h \ zlib/zlib.h zlib/zconf.h ruleloaderalgo.o: ../gollybase/ruleloaderalgo.cpp \ ../gollybase/ruleloaderalgo.h ../gollybase/ghashbase.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/ruletable_algo.h \ ../gollybase/ruletreealgo.h ../gollybase/util.h ruletable_algo.o: ../gollybase/ruletable_algo.cpp \ ../gollybase/ruletable_algo.h ../gollybase/ghashbase.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/liferules.h ../gollybase/util.h ruletreealgo.o: ../gollybase/ruletreealgo.cpp ../gollybase/ruletreealgo.h \ ../gollybase/ghashbase.h ../gollybase/lifealgo.h ../gollybase/bigint.h \ ../gollybase/viewport.h ../gollybase/liferender.h \ ../gollybase/lifepoll.h ../gollybase/readpattern.h \ ../gollybase/platform.h ../gollybase/liferules.h ../gollybase/util.h util.o: ../gollybase/util.cpp ../gollybase/util.h viewport.o: ../gollybase/viewport.cpp ../gollybase/viewport.h \ ../gollybase/bigint.h ../gollybase/lifealgo.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h writepattern.o: ../gollybase/writepattern.cpp ../gollybase/writepattern.h \ ../gollybase/lifealgo.h ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h ../gollybase/util.h \ zlib/zlib.h zlib/zconf.h algos.o: ../gui-common/algos.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/qlifealgo.h ../gollybase/liferules.h \ ../gollybase/hlifealgo.h ../gollybase/generationsalgo.h \ ../gollybase/ghashbase.h ../gollybase/ltlalgo.h ../gollybase/jvnalgo.h \ ../gollybase/ruleloaderalgo.h ../gollybase/ruletable_algo.h \ ../gollybase/ruletreealgo.h ../gui-common/utils.h \ ../gui-common/prefs.h ../gui-common/layer.h ../gui-common/algos.h \ ../gui-common/select.h control.o: ../gui-common/control.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/qlifealgo.h ../gollybase/liferules.h \ ../gollybase/hlifealgo.h ../gollybase/writepattern.h \ ../gollybase/util.h ../gui-common/utils.h ../gui-common/prefs.h \ ../gui-common/status.h ../gui-common/file.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/select.h ../gui-common/view.h \ ../gui-common/undo.h ../gui-common/control.h webcalls.h file.o: ../gui-common/file.cpp webcalls.h ../gui-common/MiniZip/zip.h \ zlib/zlib.h zlib/zconf.h ../gui-common/MiniZip/ioapi.h \ ../gui-common/MiniZip/unzip.h ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/qlifealgo.h ../gollybase/liferules.h \ ../gollybase/hlifealgo.h ../gollybase/ruleloaderalgo.h \ ../gollybase/ghashbase.h ../gollybase/ruletable_algo.h \ ../gollybase/ruletreealgo.h ../gollybase/writepattern.h \ ../gui-common/utils.h ../gui-common/prefs.h ../gui-common/status.h \ ../gui-common/algos.h ../gui-common/layer.h ../gui-common/select.h \ ../gui-common/control.h ../gui-common/view.h ../gui-common/undo.h \ ../gui-common/file.h layer.o: ../gui-common/layer.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/qlifealgo.h ../gollybase/liferules.h \ ../gollybase/hlifealgo.h ../gollybase/util.h ../gui-common/utils.h \ ../gui-common/prefs.h ../gui-common/algos.h ../gui-common/control.h \ ../gui-common/select.h ../gui-common/file.h \ ../gollybase/writepattern.h ../gui-common/view.h ../gui-common/undo.h \ ../gui-common/layer.h prefs.o: ../gui-common/prefs.cpp ../gollybase/lifealgo.h \ ../gollybase/bigint.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h ../gollybase/util.h \ ../gui-common/utils.h ../gui-common/status.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/select.h ../gui-common/prefs.h \ webcalls.h render.o: ../gui-common/render.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gui-common/utils.h ../gui-common/prefs.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/select.h ../gui-common/view.h \ ../gui-common/render.h select.o: ../gui-common/select.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gui-common/utils.h ../gui-common/prefs.h ../gui-common/status.h \ ../gui-common/undo.h ../gui-common/select.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/view.h ../gui-common/control.h \ ../gui-common/file.h ../gollybase/writepattern.h webcalls.h status.o: ../gui-common/status.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gui-common/utils.h ../gui-common/prefs.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/select.h ../gui-common/view.h \ ../gui-common/status.h webcalls.h undo.o: ../gui-common/undo.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/writepattern.h ../gui-common/select.h \ ../gui-common/utils.h ../gui-common/view.h ../gui-common/algos.h \ ../gui-common/layer.h ../gui-common/prefs.h ../gui-common/control.h \ ../gui-common/file.h ../gui-common/undo.h utils.o: ../gui-common/utils.cpp ../gollybase/lifepoll.h \ ../gollybase/util.h ../gui-common/prefs.h ../gui-common/utils.h \ webcalls.h view.o: ../gui-common/view.cpp ../gollybase/bigint.h \ ../gollybase/lifealgo.h ../gollybase/viewport.h \ ../gollybase/liferender.h ../gollybase/lifepoll.h \ ../gollybase/readpattern.h ../gollybase/platform.h \ ../gollybase/qlifealgo.h ../gollybase/liferules.h \ ../gollybase/hlifealgo.h ../gui-common/utils.h ../gui-common/prefs.h \ ../gui-common/status.h ../gui-common/render.h ../gui-common/undo.h \ ../gui-common/select.h ../gui-common/algos.h ../gui-common/layer.h \ ../gui-common/control.h ../gui-common/file.h \ ../gollybase/writepattern.h ../gui-common/view.h webcalls.h ioapi.o: ../gui-common/MiniZip/ioapi.c zlib/zlib.h zlib/zconf.h \ ../gui-common/MiniZip/ioapi.h unzip.o: ../gui-common/MiniZip/unzip.c zlib/zlib.h zlib/zconf.h \ ../gui-common/MiniZip/unzip.h ../gui-common/MiniZip/ioapi.h \ ../gui-common/MiniZip/crypt.h zip.o: ../gui-common/MiniZip/zip.c zlib/zlib.h zlib/zconf.h \ ../gui-common/MiniZip/zip.h ../gui-common/MiniZip/ioapi.h \ ../gui-common/MiniZip/crypt.h adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h zlib/crc32.h deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ zlib/zconf.h gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ zlib/inftrees.h zlib/inflate.h zlib/inffast.h inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ zlib/inftrees.h trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ zlib/zconf.h zlib/trees.h uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h zlib/gzguts.h golly-3.3-src/gui-web/beep.wav0000644000175000017500000001243012362063145013206 00000000000000RIFFWAVEfmt +"Vdataë5ÿOþÄý9ýZüú2öäô‚õ˜÷¯øÅùÜúóûŽý0ÿ*”"ã kûðdyO!ô Æ è/ûÌöBôYóëð0íëòé0ë†ï³ñËôøuúùü¯Bo¯ µm[BÓ!W ì\ÛüÑøêõóPî4êMçfä‚åièPë7î‡ò}÷5úý ‡ n +ù# Õz@{r ‹ £íòý¯úà÷ÂôôîSëlè…åäJå1èë~ðæôÈ÷úvÿA(< €ë)E^w¡Ó  Ûiœý'ú@÷;ô'ï‹ëmèÌä€äæré@ï~ò.õ,ø(þ"ýµÝ ÿæÍèd}–ßÈá ú½mÿ†üÁùöŸðªíÃê`çLâóãÚæúélïó÷õÞø‰þ«’yt Ç®•zœµ€™ dËãþÍû ÷Jò¿ïáìtèeã«â¼äÅè‰îñØóq÷ýL3o ¨v;€ÔíŒK¸ Ð Óþ5ûœözñðîìäçŽâHã‡çkìRï‹ñÀõûîýÔ÷¢ ‰ p/ý&¹—É={à @az”ýCøôñ8î!éjäƒáóâç3ìïò:ö”ûªþˆV RÊÀŽî*C\uÙ ÅÀÙeÿ—ù%ö>ó-ð_ê‰æ¢ã»àÚåêüìãïõžùXü?ÿì̳ G‚è϶D{”­ > :Õþù]õ¸ò‹ðÎêÀæªädåöçÝêÿípó÷ùùàü­” { yɰ—€š³Ì}u `oQ¤úì÷õtñìßèøåÔãæ¾è¥ë–îô½÷úhýu\ C ‘y`¸Ñêל µ ÎÏýú3÷Îòåíþêè„å¸ãŸæ†éí3ò;õ=øÒû êÊ ˜sZAÔð "?Ô î5~yü’ùö6òí6êå â€ãhæëñ6óöUúÒÿ¸ŸŒ ZŸªÅ“(4ö Œ ¥Ð˜þºûùÄó;ïTìméŒäbáIä0ç­ëþðåóÌöÒúY@ ƒ ôU#G@y‘ª  9õþÐúõäñsïŒìæŸâ*âåpê³îFñ-ô(ùûýáõ„„ å™ ~¯áÉâ  ßm‡ý‚úâôPñ«îÄë9æãdã2éÀìƒïòê÷ÝûÄþª"x SÝÚ”{€íÏèQ4 ³Ìæÿýû/ö1ó€ðEíwçäÕâõãÃé‰íRðÜòOøeüLÿ2MÀ §Žk\C€î ; Òë;ý6øOõhò2îé3æLãpãƒèjëQîÂñÖöúíü'õ¡ ˆ o-=$ š&>W£ `{ýî÷õ òòíRèkå€ädåKè2ë²ïõç÷©ú½þ›‚i í €€µ]o[ ¨ ÁÚhþ ú&÷?ô/ïqêŠç£äcä,æéúëBðÄõ}øWû;ÿÞ² çuJc|ªÜÇ ú²åÿFüEùDö/ñí©êÂç1ääõæÜé½î*óöøø½ýŬ“Å áȯ–}›´0¿ 'ˆÿãûüøö¶ðÇì@érããÖäùçÇíJñòóÙö€üŒVkk r©oÓW#ö 6 Eê2þ[ûµ÷òïÿì°éáã)äžæ‰éúî™ò#õ­÷ýWɃ és{@Õ•OÅ: Ÿ^¦ý[ùlô…ñêî?ëPæiãäLèî‡ðólö¯ûìþ£v¹ . ¸CÂD)”¤t %‹Óÿýù/ô¥ñðì³è†æåçZìûïònõFúÿü–ÿïÔs ý ü´éÔ zΡ äRÈ>ÿÎú÷àôVò”î¦ê¿ç+èØêèîrñ´óÕöPû«ýøC » Êø%g€R%p pyüËù¼÷Žõ÷ñ4ïíÙêñìWï0ñ]óÒö7úeü’þâ¢¡Æ m ¡Îûž·|O Û ¬­œ üñù˜÷Tô òðfî¬í+ïXñ‰ó*÷ˆùBûAý¬f7ë Ê ÷É€Óõ u X¶ó†æýüNúWøõó„ñ€ð€ðÁñuóèôøiú ü­ýÁp´M  Õ ¦ë¸è @ Ú8–Sÿ±ý8üúQ÷Ýõ$ôTòƒð•ñó1õøÀùJûý& €ôu[ Î B Vâ o  ÈTáµ;ÿÇýTühúí÷yöJô€ò€ò€ó’õ.øDù¤ú›üKÿ½°:y¿Y ã € ò } ó4ïªKIÜþ—ýAûùø•özô•òòò:ô/öøâù'ûçü ÿõ:Éäž  Š € 8 ® 'æˆÏ=ùÿ¦þîû*úåø ÷‰õ½ó©òÀóôõí÷ùJú]ü”þÙÿg¬Ïm ÷ n  i ß’evÖ’ÿMþÏûúzøðõšôƒó¯ò9õ÷Jø2ù¢ûvýÄþ6ŠŠÍãÓë _ ) ò T ='Ž8ó® ÿÄü`ûú·øŠöéôÞóó ö­÷ÄøÚù1üþ#ÿg™¡¸ ¥ Ð C – € a îøÑ¸Ïÿƒý=üøú:ùñöÚõÄôTôkõö±÷$ù€ûýFþ“ÿî”Ù  ´ ' d ñ ~–Ä®iM–ÿ[ýü&úLø÷ïõõ¿ôÖõ;÷ðøÞú#üGýÊþ%v»&%±û  b À © “M¥‡BLþ3ýîûú1ø÷°õ2õªõÁöØ÷JùFû‹ü²ýÿxµX]E•M z k U ò–Q:§7ÿ!þ ýºú8ùFø0÷1õô•õ¬ö¥ø™ú°ûÇü”þ³Êàn¤» Ø ê ŸDæÏ²„ ÿ«ý}ûHúIù6øö:õjõ€öøîùûü#þÈÿÞõ×¢¹¢L  q • þèÑ»Iøÿáþ•ýgûúùß÷²õõUõlö„øú0ûFü9þóÿ@¶Íä¡ ò • Õ&=U ÅÝÍÿ,þ%ü=û2ú¶ø‰öÊõ¹õuötø†ù„úµûâý'ÿ4VƸÏü ó 9 ¿('Š–®¢ÿþôûÞúKù°÷šöƒõ)ö$ø ùôùKûFý\þUÿ†„¶µ»‹Ðç þ Ö½§ÈPcLŽþðüüóúnùÅ÷¯öæõöøIùDú¥û¤ýœþžÿßÞû\L4< ä ‡ €‚e8 ò#ÿêýõüÞû!úÉøÚ÷Äö÷Ù÷ÁøØùcûúüâýÊþ: e5#ïV ¼Ó×ÛãÍÿ»ýœüú‚ù¯øï÷Øö?÷9øóø°úü(ýþÖÿ`H0²Ne'°ä*M =TlHyÿuþŒýˆü¸ú”ù½øø¥÷ò÷¶øžùMû¯ü—ýþ w>‡oX ¬ ëÕ^ö&¼.ÿFþûü6ûMúeùGø¥ö*÷ý÷ ùÙúõûÝüÊýlÿ•}eò6z u ˆŸßŸèÿÿý/üGûŒúHùØ÷÷œ÷ÖøúIû$üWý(ÿ騍–dWù¾È~Aa§ »ÿÿ‘ýüûZú@ùó÷—÷2øaùû»û’ü©ýKÿ!NÚÈ–8#€!€¢èxZr‹ÿñýÕüübûéù®øøø ùzú4ûíû(ý©þ‘ÿTo ñ»¶X(NÁ0v¹ rþýãüüŸú“ù¼øøùúìú¦ûÿüþØþÀÿ O8óf ì®Æþ –¥×üÿˆþ…ý±üîûzúdù˜ø ø*ù=úû¢ûý^þJÿ¼¸q+a_Ò¹FÒ_Jìþ2þyý}ü ûKú’ù ù9ùÝù–ú`ûÓüÄý}þ7ÿ ªco‘K‡Íô æštÿºþþÍüûÓúúGù©ø¿ùú~ûÂü|ý6þÿW"ܦëɃ=öÏ[+(n´—‚ÿÈþþýÛû!ûgúÂùMùúÁú¦ûëü®ýµþâÿšTIˆAûÝ"ÇSpÈ9ô\ÿÑþ¡ý¢üïûcûMú£ùú‹ú‰û¢ü-ýàýÝþÌe0u­…Ê‹f!=“Í×ÿÿ¾ýýpü¯ûjú¢ùjùõù+û%ü×übýþŒÿCϵ¥1æÏÓ^Dÿtè/êF¼ÿÿ×ýýüüðú-úêù£ú¬ûüýËýÆþ¯ÿ9uPÛfŠ}1• SfhÜ,Mÿ;þ°ý%ýeü ûƒú(ú0úuûOü÷ü„ý›þYÿäÿotEÐ\O2¾À” ;2§¸ÿÑþFþºýÞüäûXûÍúÔú‹ûü¡üXýoþÿŽÿ2Iï{ ó5ï,uê^gˆüq«ÿÛþPþÅý ý.ü£ûûûü‹üúü„ýšþÿÇÿÎZÃaxwÊø‹m„ÞRÇåÿ1ÿ¦þþDý„üûûžû€ûœûùûü?ýþ£þ.ÿàÿÄO¼?(¼0€€œ>V¨°ÿ<ÿ¦þ½ý<ýÎüCüŠû•ûürüEýþ‰þæþ¦ÿnùXÛgÌRökxþŒ/‘ÿÿ·þÏý$ý¦üIüÂû²ûü¡ütý7þÃþ}ÿ˜ô£.‘Ê@@ã1j °'rçÿ}ÿñþþ§ýJýÚü üü+ü’üzýþ^þ»þ›ÿ4‘î»gÄ!ÜrCêCqJš=áÿHÿ¨þKþîýaý´üWüdüÇü€ýÝý:þ®þhÿÑÿ-”Nà }5·õÇüUüÍ<¡DèÿVÿ¯þRþõýoý»ü^ü€üùü³ýþ¦þPÿ­ÿ ŒC üs-“Øå+¸J¾3Åh ‡ÿÿµþYþÙý_ýýÓü1ýËýúýOþØþ…ÿ³ÿ~8lµ%ß&Ts¹_Lé¦^¦ÿ6ÿíþ¸þÿýƒý3ýý+ýrýÏý,þ¬þ%ÿ‚ÿßÿYÌúRÆEtÅÝ€QžØ“1§ÿ_ÿ ÿÃþ:þåý­ýPýŽýëýKþ×þ!ÿ^ÿ»ÿCšÑ.°D¡À²ƒ*´8 ·G¿ÿ‘ÿDÿôþÅþmþ)þþþ$þRþþ ÿ^ÿŒÿºÿ9–ÅófÐþ-@5ØûÍ~!Åÿ”ÿ0ÿ·þ‰þZþþÃýòý þkþöþ,ÿZÿ˜ÿ#d“ÅPžÍûSg9 ”-þ¡EõÿÆÿ˜ÿRÿûþÌþžþpþAþnþþÖþ3ÿhÿ­ÿ2aŸü,[“ðë¹\ñÂh&øÿÊÿvÿ-ÿþþÐþ‚þ@þ@þkþ²þÿ6ÿeÿ¦ÿ/]ŒºéFt€n@ã´†W)üÿÍÿŸÿpÿBÿÿåþÀþÀþÿ@ÿDÿsÿÂÿ+tÀÀå(€€€dæ°S@,þÿ¡ÿ€ÿtÿEÿ@ÿ@ÿ@ÿ@ÿdÿ€ÿÿ¯ÿÞÿ(V€€¢ÐÿãÀÀ˜j@@ñÿÃÿÀÿ¦ÿ€ÿ€ÿZÿ@ÿDÿrÿ€ÿÿ½ÿìÿ6e€°ÞçÀÀœm@@"éÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿËÿúÿ3@@@l€€€€€€€_@@@%íÿÀÿÀÿÀÿÀÿÀÿÀÿÙÿ@@@3Œgolly-3.3-src/gui-web/Help/0000755000175000017500000000000013543257427012536 500000000000000golly-3.3-src/gui-web/Help/keyboard.html0000644000175000017500000000545412362063145015142 00000000000000

Keyboard Commands

return start/stop generating
space advance 1 generation
- or _ go slower
+ or = go faster
0 set step exponent to 0
1 set scale to 1:1
5 randomly fill selection
[ zoom out
] zoom in
a select all
A remove selection
f fit entire pattern in view
F fit entire selection in view
h show help
i toggle icon mode
l toggle grid lines
m put cell at 0,0 in middle
o open a file on your computer
O open clipboard pattern or rule
p change preferences
r set rule
s save pattern to your computer
t toggle auto fit
v paste
V cancel paste
x flip paste image or selection left-right
y flip paste image or selection top-bottom
> rotate paste image or selection clockwise
< rotate paste image or selection anticlockwise
z undo
Z redo
arrow keys scroll up/down/left/right
shift-arrow scroll NE/SW/NW/SE
golly-3.3-src/gui-web/Help/problems.html0000644000175000017500000000141113151213347015150 00000000000000

Known Problems

This section lists all known bugs and limitations. If you come across any problems not mentioned below then please report them to Andrew Trevorrow (andrew@trevorrow.com).

  • All editing operations are restricted to cells whose coordinates are within +/- 1 billion. Not much of a limitation really!

Note that this version of Golly has a number of significant limitations when compared with the desktop version:

  • No scripting.
  • No multiple layers.
  • No timelines.
  • No hyperspeed mode.
  • You can't change the colors, base step, nor origin.
Some of these capabilities might be added in future versions. golly-3.3-src/gui-web/Help/about.html0000644000175000017500000000123613543255652014456 00000000000000
This is Golly version 3.3 for the Web

© 2005-2019 The Golly Gang:
Andrew Trevorrow, Tom Rokicki, Tim Hutton, Dave Greene,
Jason Summers, Maks Verver, Robert Munafo, Chris Rowett.



Golly is an open source, cross-platform application for
exploring the Game of Life and other cellular automata.

http://golly.sourceforge.net/
golly-3.3-src/gui-web/Help/index.html0000644000175000017500000000164512362063145014447 00000000000000

Table of Contents

golly-3.3-src/gui-web/Help/help.html0000644000175000017500000000300212362063145014255 00000000000000

Help Dialog

The Help dialog is used to display information on a variety of topics.

Special links

A number of Golly-specific links are used for various purposes:

  • edit:file
    Display the given file in a separate dialog.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the Help dialog. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is displayed in a separate dialog.
    • A zip file's contents are displayed in the Help dialog.
    • A rule file (.rule) is installed and Golly then switches to that rule.
    • A pattern file is loaded and displayed.
  • lexpatt:pattern
    Load the given Life Lexicon pattern and display it.
  • open:file
    Load the given pattern file and display it.
  • rule:rulename
    Load the given rule.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file and displays its contents in the Help dialog.
golly-3.3-src/gui-web/Help/changes.html0000644000175000017500000000015313151213347014737 00000000000000

Changes

Version 3.0 released !!! 2017

golly-3.3-src/gui-web/images/0000755000175000017500000000000013543257427013113 500000000000000golly-3.3-src/gui-web/images/cursor_zoomout.png0000644000175000017500000000034612362063145016643 00000000000000‰PNG  IHDRóÿa pHYsÄÄ•+!tEXtSoftwareGraphicConverter (Intel)w‡úkIDATxœ¼Òm À €áî*oÖ¶…{ókMó¡Ì&"M¯3º^Ì/çYÈÈ Yœ…‡¼*ÅrØ@öå{`ë ¿þ‚{ƒÊ ë_—Q&¬‘pÎ [HðG‘-@÷éÚÿÿœ2ƒf`!(«IEND®B`‚golly-3.3-src/gui-web/images/cursor_draw.png0000644000175000017500000000032712362063145016063 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡ú\IDATxœ´‘[ ½ÿ©¼Y@Œt ö+f6TTU²¬'×íxQ©ÝJ k/ |{( pŸ€Â=‚ìlHàÏö-ÈÚÑ"88\"Ÿ ïLÿÿ\ˆOß÷0>IEND®B`‚golly-3.3-src/gui-web/images/item_tick.png0000755000175000017500000000026612362063145015506 00000000000000‰PNG  IHDR Ðá.I!tEXtSoftwareGraphicConverter (Intel)w‡úPIDATxœbhhh` „ÿŒM”b’5 óI2( èb$™NP6q’LÇ«—Í’øL‡k@V€O1ÜIÿÑA Ä8«§IÖ@ ÿÿÞfN¨ É·êIEND®B`‚golly-3.3-src/gui-web/images/stop.png0000644000175000017500000000074712362063145014524 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úlIDATxœ¤=KBa†_†TÐ’°©C'ƒüÈʃڇ”C¢ AD’ÁÆN!4(–™Ð"¹Y!áoè/D4AkÐÜ7e!ugïpJÒ·Áî麸†‡úBÈõ Ñ¥íäݶ˅ʑï±’1 ¹<°¹dã@:‰‡D¢^'X…Ÿ±$JóQÜEfp?Æóª„%UsU –CçÄ¿–C,`c X\@94 §q1ê© ÔsÖ”J=Þ¤øˆ„Ààóã¬ò ]ž“,§ñ@ÁÜWID9àŋdžÒÈ0…’æ×Nã}΄§èJダӊ7ÁM¡ØDäËi|çÙ7¨Z qéþ—ÿ;μã^4¡jL#w®¼×˜f¥$€¬¦Žh5#«#ÊtÍ$€M3ÑàÒL? ‰“e.CÈŽF˜!$€nY 7¦„³§\'=3Q’ÿÿí¼zÉ(«ãIEND®B`‚golly-3.3-src/gui-web/images/next.png0000644000175000017500000000035512362063145014510 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úrIDATxœbøÿÿ?:f`hø cU‹Ë€K÷¿üßqæ ¯8ð‚t`A¸såýÁl®ÃfvŒ`ȇŽÑåáàÒ€#\E `È›dœ=å:ŠqàÓÍ @8X€‘d±Ùÿÿ<›¿t³:IEND®B`‚golly-3.3-src/gui-web/images/new.png0000644000175000017500000000036312362063145014322 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úxIDATxœbøÿÿ?304ü'„ï<ûö¦®Ù€K÷¿üßqæ ¯8ðâÿ¬mOþw®¼Öœ=å:VCP €i„ad@|l†d²!$€Ž‰2ÙdL’0C`˜,ñ¨ƒÞ˜|oR&Ãôÿÿ3•ÎÆôFXïIEND®B`‚golly-3.3-src/gui-web/images/item_blank.png0000755000175000017500000000020412362063145015633 00000000000000‰PNG  IHDR Ðá.I!tEXtSoftwareGraphicConverter (Intel)w‡úIDATxœbhhh` “¤xTè†Õÿÿ9›€~zŽIEND®B`‚golly-3.3-src/gui-web/images/triangle_right.png0000755000175000017500000000025412362063145016535 00000000000000‰PNG  IHDRëŠZ!tEXtSoftwareGraphicConverter (Intel)w‡úFIDATxœbøO`Õ<°šOœ8A¾æ0 Æœš‰1‚€füF¥—$h†úÚL¦ŸÉ m2㙢F< H3ÿÿÚTZ±•j9IEND®B`‚golly-3.3-src/gui-web/images/step.png0000644000175000017500000000033712362063145014505 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡údIDATxœbøÿÿ?1˜¡á?VLŠ—îù¿ãÌ0^qàéÀ4‚pçÊûƒÙ\F’ȆŒ‰6Y16<ˆ &À@(À@H1í € ‚³§\LjÄbÿÿè‰Ç¶óMIEND®B`‚golly-3.3-src/gui-web/images/scale1to1.png0000644000175000017500000000033412362063145015323 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úaIDATxœbøÿÿ?Ãgßþ304À1H FW è\yŒñ€M-L`Å À¦.AŒØÔâ5[¸lHœ"(rÅa0ˆôDb26µ~%Æd ÿÿ|Š,|†ÛIEND®B`‚golly-3.3-src/gui-web/images/cursor_move.png0000644000175000017500000000035112362063145016071 00000000000000‰PNG  IHDRóÿa pHYsÄÄ•+!tEXtSoftwareGraphicConverter (Intel)w‡únIDATxœ¬“‹EýÿWõg^Kîõˆ¶VÌ=!‚ˆæÙbñå&(±Y›G°Alz¬ó/€í˜Ákî °Õå!»ágßÙ°vâ~‰7U!ÀyèÇDÛ蜶‘~¦Èw@ÿÿTÕÏ;ƒÖ IEND®B`‚golly-3.3-src/gui-web/images/about.gif0000644000175000017500000013617112362063145014633 00000000000000GIF89ayað1ÿÿÿ333!ÿ NETSCAPE2.0}!þGifBuilder 1.1!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷¾xÃý†Ä¢ñØ ‘̦óù»5”ЪõŠÚ"K„´› ‹ÇÌ­JhfHÉì¶ÛØM×`úúÏë=ñ©á^¸7HXø!˜@ågÈØèøW9‡øhyé3©ò€&è‰*Ê¢éP¸4ºÊz±ª’kGÛz‹›Hq:ÇË›,ü×2Ù9Œ|kKÌœºœMXê¬Û[]-­}I½íý­–!.A~fŽÎ®žÒÝï¸._?LMo¯¿Ï‘ÏÿïÎÔ8N š€öb<ƒ gó×ÁĆ +%zÕkFŠÿm‚ôŽÏÆŽ$+¨šf!„‘%[æPB–JY.kºR„ÊÂ9®ÚüirÅ12ùÛ 4i3f‘2õ"Ž¥Ò©ã^y:ÉtM$„N­˜XN(3°{p˜}*Ê—Z¯[ŽšfUYª¸®ú²#É–™­FñJ aUÛ±:¹@Íû±¯¦¶uÎ^û Ùq¸•qaIy²e´> ]œRJÏ^òÆÜ x.]p Ð ®%ö §ÖZ(#™ókŸ“éè\xsæà±I[>µ¬ÏðE‹?'^Jú/ã³s:¿Èó6RÕ¢«OÞøWaßË5n·ñð¶‘_þ°pÅ„¥_÷:>– äŸ¹ÿþ MWØì"Uuaav {=e0 J.•`9»°uTrtÂvÞsÖçÝy<)š€¿á—ÛJ'j‡^ˆš¸SÇiNW«ÝÈ ­)'>»Y04¦è¢f­ˆ—ò}XZ“ð5÷ã{Ðip™ƒÙã;‚‘’8~)áà})^&\ob"ItÎacæz‡]Z“RªØ!vê¸ÜYA‚Dçäù–ežµ˜æ¥š`.ZL¢²mè$—iŠh }é½Éç…„]xä¥-bF"‘SFúg”lަߓ£šÉ`™ZÖW ²Í7*¤¸¨inœRGi¤x†Ze‘›ÆÙ©°¥j)N­ÿú˜‘_aáhrT­3»FHеqÅj¥svE·žúq-AŽ’pk¦½rkª\±>:(•2Ê‘]ïZÈݘ,î)ª´íykŸ–Åq™dT˜ž)ðƒVzûÝFrG&—˫‚Ǫ¢¬i(¢ à¼ô¢3løR6¯¾Kl¤ùùúfe°Îº¿Á.©ò¤¶Ì2–ìÅô²¿<>¸”?öñO·9èvç>KƒŸâæ‚óÒ…”šÕ\5#ÙÐ28Ý.Ôûj}Å^X/Õ²~òØE³#önŒù'ô‚€®}ãI÷'¯GtÓS±AÌYjïÍÓs[`?„×=3¢Pž­øâ_†œŠä–ª o×&q¹Ñ)ñ¦ùkùÞy+3*l1é¥—Þ ƒ«/šáC‰¿®”Ô±LKûäåλa½ÿŽ‚í¸ûKÄ<ð÷æ|ç±WÞüT* ­zô “.¼õe3{vÙk¿ý@‚O·DWŸJ~E›ÿ«Sõé׺Ɇ"ý¾ÑybØ~ý{‰œtúïßùýOz3ù„ûx=”¬/×8ô=^œàï2fÁ Ê !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÚø‚Íì¶«N„ÅrôûŽÏoâq%±¤'8Hè ö'ˆhÐÕWøɶ¨¤8y`w¹ÉéäHé¥ÈPÕYjªcIe¸æ5©y ;ô÷):”*«» ”™S „É;,{H’úØšKÜì|ùÁœ&ý\mJ­êq(lÝ+ ¬í=NŒaNž®Þ»ÞNžì/ŽR?g<‚œï¯w/Ø¿ÕÂ!!ˆ°DÀ1 :œc_‰+j0È.ÛD+ÿ¹Züˆ¥€¡<‰¢FJBè‡2&WSV¦œ&3gHnùñirÔ9Dúb„Œ¨Œ\Š:m©R$7žK›"}ŠU(Ò>Ê2äS5¤U¯pu3ËÎ¥ •j¸Ò¤¨Ñ‚ÚžYr…Ö–îO½G[e:Øœ´@oEØÆ(³W†¡aí㽆;.¼ pÄ„[*ö)øðHÄ›o%sÈÇܺíh™å#˜ccÙ\ .û™U(œ&G®Ìy2NÜ„w™H3¨ÑÁ1Ï9zXü_åhŽª6㉠¿úxoÑÊ}].¿Ù;h¶/‘§Fÿžùyß_K[=¬[¼ÆbÛÿãîY€½7`Z8 aÃ\ RƒÑ_á˜\_æýáE¶Ý§ƒÖQÖ™_òÙŸyÈebfãM8âräµèFtpè`%ëU²k:¦ÀÒyîÁŠéâw?Á˜}BŠB~Ffƒd|/^ô¡nö"c•ÔmÍ’;~ Q\Ú=È^^õÙR!ˆ>™Þ‹Ò1H£dzù¨¦slJÙ^wZ™dw¤¥i¥„4Ö¨dn]‚‰è s}2ØŠ“Ñ9‰…æyÛƒs~Ö‰"JzØž&¦HiŸ‚hcBeYâu†–$̨g2él.†Jé›–šišWÊ e§©ú ªˆ¢Æ©)p¶qÖ+­eÿ± `˜¤ú*„—ÏâWAŽÛáŸyF”Ÿ´¥­¬‹yê‚«†–i§Þó›\íò:í‘Ön¹m¼ôÌ›(H®éšÉºÓ”ië«öþXç™®ª§œ¹n¾J¬Šâ ¬£7‚{/ÃLnyonü/¿o„o¾­-'TøRUi°LÂE¯Ä·+'¸$Ál(Ÿ»œëÁÐ÷.=;‡;#´ßZxi8]©&²S¹èÕ˜GóÃ-–ƒ6ñ¿„ܶŸÔu0ʘ±yä²$ÀZ=Ö¨a†r†d')yñ´D³{° ¦T[oÈò¯5fL7JS÷ÛóÇÔÊEtßEM*†?e´Rƒë­à͋뫶ä}µå¸öäî$ž&8–kz¬Cü9è;»7á©Cez]IÎtì­n´X³ßïNVé¼ÿ^­ïÀ'öð®³k<îØE“üï05ýNÑO?t©»o=õY…½MæÚ§ó<äSü÷9©]¾ù#ß›­úˆî[Ùqé»¶ª|5&ýMÕ¯iúÓÞ8®îD)V-~à=:ä€ÛÊü(ò ‚" ø(˜/š`°uùÛ ŸæÁº !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªU…$Ðíõ /irÔ,N«×L´"éEãìºýî±¹å†ìâ‡(8è°7aÈçG¸È¸¶…xyØx‰9$YÈ7C)•*Z÷Hé99šªúaJAwzÖº:K˲éùŠÚWÛëË{¡Û!Iü{LhœW¨ü׌ ñl++}}IA¬íÝØlý=.ÍM~Ž~Ó œÞ.(þF²îNß–_ŸŸ:‚«ÿÿ…Ÿ žùskÁ(Þâ°AD‡Æñ‚!'ÿ;–04‘™«HKÞòjN'¥LºüHÒÙ®™Åb²ë÷ äKŠ–$¶¢£³ÒΡÓôÔìÃͨHšƒmTÑcfüA´ù4ëÆIRAùˆ‹Â•Ã,îBYÚhz.¢\Ë•iN·WY9ÕZË«8m—l¹a”}× ³Ö\°`ÞԢ԰߃5?–x9°e¹%›R†F1ÆDèÞ š¯AY~z:KzWìÔ¸*ÏfFF¦F-gãw^úB¡hjV™Tj)Ófƒ²Yž›¢õ&˜âAig‹yž2Zsdž^ú¾v'ºñý .yßã²ï–?>þÉ®pH€Ÿ½ñ“¹Ìî€PÑßþˆ:¶-‚•ûW÷À ÚŽ[ì  !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·ÜÙÕºvÇärôÛ¨ZÍì¶ÛD'nâ·ýŽ©ç89‚ž(88QWsà÷甈HèøHXg¨Ây‰I5ĸ±‡x5™):Ê"Úxöv Hú «qzˆ*Âi›«+cª×´ l2AlÀ)œ¬LaÌ@ܼ-}D-}=ÖƒŒÝí=¢ý-.´:Žþ ýÅîmÿN8ŸZŸ¯ó|oÑñOŸÀå| <˜%TÀ9x!|ø¢„…… ZŒ(g’ÂUÿv¼²jÖ>Ò ‰r7‰ž‘0™òâ¢4íî±<– f̃ž>©rv“IK :w>”´©ç1¥ …v(h4*GE¦”º¢¹æ)T©\ùl–ÓZ|&šò³9œXÚ.Së–ª¢¬”ú¹$Ë!h×q‘6ËT"»j¥e ´ØÜDp§Î2,´äá¶dYqÜ5Œk†‹9Èʼn?ÑÓCï^ˆ†.ó©¼Y. P˜gRöl`Km`&î›Ò/Ð8[~Ì08-ØÀ{ß¾ ùäî¡Tû´ö»Ô÷뢨!Û&~Z4VTΙkÄý{²Zã©“ÿ<½ùhðµÏ·ßhpÙ¹ù[ÿÕšY²Õx£áw WTÒtÞ— fâ%ZR^õ’u¿ˆ× rû±U^|ö•‡\P¹"|XÉמyÌlxÎ_`÷Ùq·ZŽÙ˜…²x÷Ot~øœc"fÖbÚØÔ{ºy8܈óÉ‚žpÒa!X•¦±çÓÿ馗§}I`}M·”SVyâŠóÕÆL€ÏÉ \iÉ9#‰ENyf”<úØc“ÅÍå–)ªf¢;ÀDŒszVç‘Ëñéœ:JœkW¦‡džoîÙbrf hYeYhšhnšÓ¨‡žéŠR†šäpqbš¢¦wJ*ªŠ•‚jdŸB:Z*iL b‘UÿQG‡iH„j¤îê& ’TÕ¥©1IæT~rø§‚8^Kì§f«›´ˆÚ´¤©èò ÃM—1;®¢)!µžFmèçw‡>« ·½bI§zU;‘¥™¾«&“ïÙ'tú¦*}ßÜpÀ A<ÒÁßùWT·öît]2B‰¡®ù‹2:骭r¦äÌÌQk§°1[̃¯–q±€ÖW2rÖ5®º#dÝ-b¼[½Z‚3(ÐÀ˜©´#o’UÊ)w9uír‘¯Õ»`-u[C-óÊ41üaÚK TX/NsÞÜz_Ëð×`LåÞs]rã\AÖ‚ËTIa*þäâ{­”‘SÀ ¹äQ} «˜þX¨¹QœjÒBr‡~µM˜ J5ê1©¾zì®Ïvà¶Ð&Ž!ãžûK¼ÿ®±š,ñ<ê+cñÊ'®Äò³Cþ¢óšÇ;ÅÒ'zù‚×ã.õéÛóåý÷Ó'_Šø‚‡½ùïü“é«o‘³/¾: :ÇQøõ_}«„5‰¼?ž ..V¡_I&’SY W— È@™¼Íl~‹ààüS; O!¶Ñ ðÇ:Ò€"ä+ôWÂJ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªÕ—\³(÷ ‹•´H™ñ«×ì& °}åyûŽÏwäóú[û§'8HÈqgg UÈØ8x¨•e·èx‰i”¨ˆ(™–* 39± eæ9ÊÚZq*™K—héz‹›:³Rç› l2Yª°*œ¬üʻ쮸NŽ.z.’´žþ^ElÌ_âîþ oßÿ‹“¿wÌ­H0!cóÞS‘T$SûR4ü1#¾/ÿ\æ™ HO£Èl°¶‰ÌEDfЬL ó„—/á8ÜC'¦NSÈhí éÔÁDUQsÈfŸŠ:u0 (@VÍù4«Ír'§bôz¬d%¨YbõPG YA[Ô>kë«”§v|ÈþìQS+9¹GYVý;\‰7~~ÁE3«l]™ídÉ[ZÃ7Ãî²8`âÊÔr†ê6.Ó»>c)º’سXô:UŠðçž!Ò†kÚçL»XËqÜç³åɸ!÷¥º‹pÍÀ'ú¦L¹0cÒ[9åÈQwÒµdoÿ†¾´%òÞF{nŒœ¸Û¤—u‘ß¾sðø¨Š‹6®¼}õûº©Ûÿú”—,´M$Í eQàU<%×”7·uú‰Wàrræ•bô}ãS’YØtw™7ßsW("ƒ¡U´a9ø½7bsÕÔÑ‹6ñÝi\¡èZ:\§\TIw‘긢c22w§=7]’ºè\y䆨…ü±H¥\5rÈb†ÈÚ€¯t˜Ÿ}.FiY›Rfib]’e~çeÉ&–U6ùÝœèµeä¨äiãž1¦HæNŽÉ¨!ÜÙv`‰¶ød‰Vòé‚t$›pZ _œˆJ^ ó‘ º¨æ Š¢ùži‚¦*ª´fº`Pëièi}µ&'ªžé1gª–p¡*¥¥ÿIÉë«(6K!^ùŒVä‹®iÔ¤xî൱Ñ’ÀJ[èˆuZ‘·$Lv&¥Åš{ƒTJ®šm£ön«^(k¤¸¶ª „±ú¥¡}á9y[h›R{d©rFÊéÁEö¹« GhÝÃvfV«¬†ÉÕ½zÍ*•™ˆ{å Zi~+Lð“07­¤æ¡ÖpÅÂÌž>—Ël´AâèåÇ´˜l²€"EWŽ‘ È8¯Ë±ºŒhl5!ÞYÜæÂ²é'5 €‚+ Öa¯±5ºd>­ÚÔG/ 7„Fv/¶¨·=s勘`Çõ‹wÞ{õmw8g-xd«xÖ‡‰?õÉ_N°¦¬ÃAŽÒJ*Ÿô { b>l8讜39¥›ÎJÖŽ×v9ëc¾þìO…½ºí:]ܹ«ºÃ-ÔçÿΨŸîåN|èkù|ó ] òÎë}BêÓÛøÓ×ç-ýövï}V•[~ø¸”T½Ëæ‹I{äâ®â¾÷-?üÖOùûT•o뱫2è §âK-’F@¦ý pßI`ñèÒú90# ÙÂ%8A ^ƒdšjØÁ{5ÐX!LáJø»ÿ p…0(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjYK UQ nÇärTì˜RÑæ¶û]þ²©^¸ýŽ'©â9Ÿ(8ØðÅ`èw–HØèøÈƸfø×õx‰G9Ãø#™ Ú³IA fêõ)ºÊ‚º!'éÙJ[û ªòúg€k뛉x»¢ËKü{ìhÌ›¢«Œü $|á¼}¶›ÍÝR]ªè=n>JŽÞÔœ›fnOæ±oß6¯Ä“ï¯× ' ÿd7¡Þ‰^.<”0œ6j+Æ`¸ÍBA‹ÿwô’3cÇ‘JDJÔ$É•!˜ì·QË™¥Ö!Ú‹ZL4{œ&íe;}:œƒQq'¾3 µÐÍIRû "²hÔ­Å*bZç–1•8 bµ¦õŽ•µO‘±•öiVX¯%Éf<é#-×ZHAF+´mW:kðdéí¡±»)ntñÜ}‘é%F Ylã«‚e¾Âʹ²KÌp?[nÂ’ã±òåÈNëQ>ᙣ°¸˜Tš*NÔ«¨£lª«iÜŽV-@×Öy¥´÷éP…,‰mÔ®£\õX®¼cŠ'+ª”è~ÜŽ—¤µ•"<s㚚隘½éÎnÓkío‰‡®~ûÖok‡å«oC8Åb§erA p³óÒjàÅ[LZÚº7l²©ŒÇôñzž–gÜ–Æ8F,²§;Òùì» –ìžH ŒmZŒMò HgˆÏú'f\ ­|ÖÞâ#¨Â¬xÝ›¯fÛ»ÝAMwÒ ÃÕ$puï­Ó¤Sµ3Ygó=c‡m]Ⱦ/‚Mëé«¡Œ3®Ô–¦Â >yÔO ¹sæžëô¨u×¹Òùç&ÔbJ‘›.Û·Ù²ÞèÒä‹9ìäØU¶Ôn{: 9Ý{ÝEæ¼ç1É®{îÅÓ´“’ª/ß“¦NéÅ;ô|åV½õÂs¡=áÙgß=ªz5(¥4˼úÁµ¬EÃÜ´Ih‰ÜŸÜÞ¢Rk‡šHEs¤ÎMÛbêWpáíí“Dî°aaj‘ò·ž35H•MFüÐÏߘ#—âDù.Ù[6ƒ¬<ú›ç?¯…^|š´:ÉÿÂj5!xpÄÖW%—ÎÝÔí-ÓxKÆy™tlÍt3w¶«¹a½ÔךKb®<³]Ö¨×>œtjMèëc¶žJøêg¸¾oÿý:ãøËŸm>xäÕé«ÿÅžÜjHa§_Káù–jaÄ‚\`4PSÞZ{œY¸9+gà…*¢ufçWOZ ÷xª‰hÔ{Ÿù køE’ qº¨â‹ó¨c„³ôô£ˆªt¡ Zº)GlÅq'[:S-Xa‹÷UãŽ2æ†"‡ÞÙ‹·ÅH¥†É)sOþ}Y¢QÝÁ„’nFI]V;™µÝx£%¦$Žx8 „4ÝU—îmé%;|Ny¡‰Ú9a~wê5Y¡ÿé™'"¾‰)Q\jÊ¢3JЦ ÅÙŸétt]P¬ÇØóò‹®¬rþ™cüw®þŽ{]ž o_Æ Â~M￲-)^ÿ æ¡×/‘Á… ½U×0b†„í.P,¥J¢F}ÿÝýÁøm£H€Ilíëi¤Êrò4¡¬÷°ÚÊ™°XíÈG3§.w-§¼Ô 4¿*&kåøt#"/¥™4ê k§¦U*é´¢Ô­–“ÔT¡Ã±$c¦²‚ÚŒiá¬õ6 UJ0ÑlW[®ËªÊ±6BQ¡FëŠõ(—¨Ó¯JVÙÄÈ­ñÙŒXÏý},ÐðbÇŠ!á|‹™¬O_¤èLšK‹\Ë>qgìå Ž5ت‚-KÖÜ4e_µ‰Aþ8Øånß…u»6ôwïàx‡cÕ 74îÃYUYMM½³öçPùw¾=çÌŒ§+nžî÷ÉÇ›|ö¼úæéC¿ƒÞ2¹RMoÓÿíî߯ÉEß ;eæš0ï)¸_9àTÙ& &(L`juXh¨5 GðVyÀq†^yCµöblUÄÜfî™WK>ý3#Œ²áWk°í¨ŽñyÇLŒ/®¡œ~-zBF |GŸ‰:ÉÛXÒ! ¥‹DþçA‡<~ÉÇ–r$YŠáQÙžˆ/šˆßN€±wYub6Yßdk–鿇BrÙ]vÃ]ù¤‘+*ø’Ž`ª‡vÆùT–X zçynþµâ†}ŽV"‹IÚ™à)Ö=–‰›Ô(%§š^ÔÅ ‰5ú\”#FZX§”ÂYå¥DfºÜ¦f®©'¨Šú©¯îJ Z^êò+ŠqÿL´ ƒBʧ~ÑŽ·Žœ¢ê)LÂò°ç¤ª1ÊÓ€Í,ùj«µšË-ç’舾«â˜Óv†Tª¦&'í“øÅy¦æÙ¯¥¬Ž†$À³‡¹¼.z¸Ö>]ÃÛ!¬W­{âÂŽlÔy¦Þ:k¾ÊíKÚ  ŸÉ`¿Ä‰6§ˆŸü)¦S2œ\¶ñ 43`ß«°'Lɲ1ÇÁ0uh`õ€ÒZÝ&ƒrÆŒôäœ^áÖ.v0ãàtÖËH,õ"T3™ôYüæ5äÐF#ê#X‹†DBE¯NÛ£ôªtï]¡kiîÌwàâ­ÆÊ*Ì-¸2Ðþj+Ä'žSÞò®+!…¸sŒÜ…Q{9æèìxç`R„¶è¦'ê˨Ÿþn³TÖ™⬫Sú!”Ï›ë¶kŽûŽÔûè*ʼF…ò^<äÇ¿îlò35Ý8óÎK™!M¯¾¡‰}ç2qA|÷ð†-þ;sƒ~ù¡d\}¸é«¿þÍ&ûD>üð\¼5磾oÿ+’«K?þõï~Û VýH“cuA€ŒM×À½Å ŒàB&2 z¯v\;<Ó€p„;(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ†^™ñ8 ËÕírû`ǯçü¾Ÿãæ¶ ¨Gøwˆ˜ˆ§‘Ö¨)é±WWó8©¹©“™9X×àôÉYjšcF)jóHv ‹²ôiG(dŠ%ËÛ»‘ú¼ê ìk|¬;KZŒÜÌKê’뚭Ѹ#‡å; S ´+©‹‰óÂL=Œæü™…1 Dáìl•*¶šE›2zó.éÑ Ijtе-1BµLÆ2«X@—\îBê)eÕ÷0Q=Ûì†Ü·Îæb i‹k^Q_wôëM)TªxÓ²ÄÅóÃÃ6yÞ¢KÌ-ßVÙÚî²Ë8r¨Çpµæ|ïí܇75h«W+S×*f Ø ½ƒYKµ…qçwa'—L)™5eU»SSÆL8O1ÒwŠÿ¬òdäw1E×:ôŽ0É#ˤýka±tÞ…ÿ. ½2z×6ïúrïôÏÑ·¯î¾yÅ싘ÉÿÝ –u|½B‚%¡]³‚ ^…ƒâ<qjFÎM:W•Je½‡K%€3^vÀ57"}l`¸Y:_ÙõÒy™H¢}Ó…æ5¢HF ´^l>ª œjkÁÖÚqË#v0º¸_Ç•F“"jšŒ¡˜Ø‰ý©…£€õåG^T¯Áöc™Yê‡Ô˜÷…‰¦Yl²HåzO*ÈU{;j)!žò½('œJž(àm¾'—/•¸æ|D’if£Pz"\œ5y¢JªŽ¡{j:)••Î×gˆÓj$X%5y—–úyè©=QǦ«3ª÷ç¥sVX§|‚Ê*\•|ÚÊjœ1æhª¨ohxãªÆÿ÷MËH 1wåN¶´+…Ö·JE*d«=+ަªd Š“—i—ù-g.*¢…KI³(9Šï€.ÝÂh!‰R«m’ªF’[ð»íW "Ç/–½Þ70´¼fsnŹޯi^ôŽÁh‘ùÆ4)§`Ú&qx¨Íz±››–êÅÌNËÞžšç°»È1³BÌ‘w½e\êÆâ·¥VýÆ:rFžÙŸ~]œòƒdá§.$/‡Ã'S=œ¹GH)=g­ÈÖÓx ð×t}\o…7íãuâÅ´ÛáÑ]¦ÝH¦– žò=V¼þ:wãà„Çv›Å@.Îx-ÏF yå*¾/…ó„YrmùB‰ŸÕ]yhwþÑèÑrNzN¨»·zêM/l•…®ó½°éh¶>;?>…œyî€á.·ïfÂ>‹ðî~ðÆŸ³RÕV/¯:ºE ½£Kó^ýOÄ3Œcöù6ŸTïy‘í‚ç¦<ù±¤Ÿ)ûêŸb>Øú¾Tëþ±K?N&× üù¿~¤Zý+SC·H;x©„l¤[ãâ×@“HEoŒà÷\, vÎÒ ðÜçÁúA0„Ç« Oˆƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇQ@Óòçú·uÝ ‡Ä¢ËÆøŒÌ¦ó9D.~€%ôŠÍjYÖj7¡ÜŠÇä«TÑ=#¨å¶û]<«§_°ŽÏë?õê¬À¶7HXØöð5fèøˆ·(ˆF险)d ÑY™Ô¸9Jº‡9è XÊÚzò‰†!Iëj{K![²¤‹û;X;!l ¨º«ê ¼LÚ©|ÈKÌ<%ˆ˜cM½Íô<œ¢Í-^&ý>³v>¾^œúÍ÷ÊNOX¾VŸ¯=™Í¸6ê„S§à±ƒ ¡xëWL!>y +ò’E1ÆC‰ÿ;ÒÆ‘ƒ”{Kòñ&ñ!:“,oôºv!ä™-k 7NF›<³){é®Xb4{7S¥<¥E:M—.Í*Œ3ŸZ!G‘(|?›^ýª!kB w"žJµ¬X6¬¸åöÖ\jq{«•ÑY;9ÿ…õáì-5„ EúñO{¡z‚º(.LgvQÍU\÷0âÄÿ"k^HYíD’™}ÕÊz™kŸ9¨õ¦NeNéÐÀ‚é­3öu®¶;; „2èáÓduzÖ Š·Ü·‘Ù:³ƒzèãÄ—¿s&?ØÄG®®+U4䉀‹ûM$ܺ'ó¸Å__ý}ePÚ^9øçÄ™ý´ÿÕßvBwÙwÐÁÝå%ˆŒb½qæ }“<‡V…mÖ`€®tá~èýány™ÕØI‚¶¡dîägYu¦¹‡âc÷ÉÈâ..®xÜá‡#yfùx ƒµ IÄY¬…x’%ÿièØ{“õh#fê(W*òS£t˜ý%$Œ Á%ØÞ’I‰& dyæˆ Ò×Þ;7·d9óÉ'Zv:ex¥}.egjÌÝéezŠå–êA$•L²¥ )AŒ©¨§˜-*:YeÊq]koÎCtº› Z)¨‹8gŸ1"(•…Žz)RÆwSžº $¨cŠšé¢˜îš'€O¢Âª¢®ÿbéÝ£•ÇTSR˜VÎF”ëyLòpš€`Vð[“¯ê`f©/zz̵Ñt™”ØË­‡è–‰¨,´EÊ^½¾Û¼fˆ!žåâÚ½Ô)ð¿Ÿî©e†•{Ê;ªëW˜ÂJô«.¾&­©1YK«’o›p±ê¹:0¸¤ Ûî¾pÞçðŒƒÇ%ÄãvI‰¦Bë|¤‚ÿu{bX÷Š,N³7«s‡kU8ô6C‡lHÎêè–VÔ‚ÆXgñ·¶h]¸Ø¬#Ëì2}a|ÅÊ%ÜpÙ(z±Õ´Ýq¯××»Úö“ßDN5£n©ª}°áµu¥™±à:Ny,±À­iYåšc%aÀ›þtãÞšó`æ ç›µÊxzë öëzìÞÊN»Ô׎»íäýaîh²UzÝKû^éðÌFüï2–¼UÌ#öuµÍ;¸•ÓØð×¼PáÛkš÷&hÿý#À Þûºå3ôâño9ùëõLÔó‹œöG¼ßßSýÎíÏ¿}ü/h%  ò‚78ÕÈÏ€)à%ÈÀÃ1KeŒ Kf± ‚ƒÔàݺf(Rq"¬]XÂ. !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íò›Ñœë÷üïl—à&¸Ögxˆ¨¢(t5xð˜(99ŨIdIéùI“9ÑÙ¸ F šªZ‚ê‘yʘ·:KY×ÀY»»Ûá‹ÅF!êÌ{¼Ú)*(\±ŒeŒ,Ûl-Q9Ímø<ªíìüÝ]®¬nήê«| Ô>O_¿¡^¯¯GŽÒ*ÖoŸ@5Ã0äÃ60¡™wBº§0â–€þ8´'1ãÄ/ÿ ÿiüØâ"Ç ð‚4`Žº¢[ºíFdJ¸„(zÅ@h~)Š·b é_†?Θ”e×PŒw\y>R7ÌT.v$Y‘jbHÞˆ$ù&c“Abù$ŽÛ•™Þ|p²)§IðUäå”f¢c&|KjueŸ¨…™%ŽNŠ™(>i®I醭'.¢Øbsw®ch{FšÚ–J¹Ü xÆ]žQ¶'[uüÑ é‹­ñ_ŠQrÙÞ§†úÖ¨–ŠÝ©žÒ*™‡ÿÖçg²öô8+§ºVJ¸ÂX•Óu™íOïi%jZ •ˆ2à¤ãœ©¥5º«îªo¢º,»6Æk![Ñš‹n¥þžŠ ¸“ñ{Û¹|’Kf«pΧ\½¿ª*ªÀÙÌvŒ2̨óbìŸÄ¤’jqÇãð£Õ&xáaøþ[Ï«õ56XÆ—F—g¸†¬ñs4k ±´97›rÄ"ßLòÎsél/ŠÆ)²d½z>ÂØ‹£’ÛÊ,w¬Ë†W0ÐÖ’T´½½ˆLð!MË,ŽmcÙµu½ÅvÙf“mõD!Ϧ¨°=ÄõÕ~<'ÚSœv y­`]Oxxã¬!è ýî8âÅÑ…ÊdˆVžØÞ¬vóMœå¦zAŽúƒŒCù¸©[ÅoI¬¼Nú_4þqî´ûÝ¡»ÿ~4îÀo»×Ä0ã#!ÿ7pƒë.9ó•bKܰÒÃnýäãyýn¡COW÷jR/ºøµ¯¼ù‡§¶ú´ËÞúyî³ä¼ëhy<D¾'¯¡˜uço6q¯]¬R¤#·:倎I [¦(áHå©{ÍÚ†* bC›×4È}Ѐ±ðÙ+Xž žsPY!ðJçBâ5á1¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ›KªôŠÍjAJHWnÇä2ô[ƒÕæ¶ûíD«Ø&ŽÏë1ì;  ·GXhx1øôàwøy¤(áXçgW©¹9“Ù¸6É9Júé5á9áÈXêúšñ•j1+È ›[Êû&j©+L Ì#Æ´<¼ YËKQ»èpÍl5[);Ý }ý .ø×ˆn~NY}RŒÞþȾ ¾êN¿Û TŸ,ϯðÊ6BD ˆ0г :ŒSμòZü·£âÅÿ5ÒâV‡£H…ž“üXEè9kŠõ6Öòh{sìÃ5·æÃ¡t36¬2Þ1ÙUfKë\²0]¸µžÎL4òU6—KíŒZõ8x‘¯½ËÛXcÒªn&7þ˜NdÍF¡V¼[»yÇÒÕ§ìþºýÍÁMÓÿï¿VèÉG;D¡tY‚ò— F4TÞ‚Ù1˜R…÷¸Û6‚ x.¿EGJçÕ·Ø€ÇñÒÓz ÎbqÓñGb9Ü%6£‰®-¶a\zùe[8éßj´5f zÙ˜š‹ûXQ{"96¾'Úˆ¨!”þµHÙ’O†Gå'µùHæG¾µ"¦‡ ‰¥pHòvã¿dÆ¡hY¢Õ&^!:)g•ú‡–oZ†Ù •¥¥¤&cYf£ü†{^¸§rЄi]ZvYbIòÅ祣1‡é~’ÝA¨v†æ©*ŠšF‰§Nzj¥×‰:'fšêæ‹R2yèž~Þ˜Ô¦½ªV㪟ÿ¶ºˆk>ˆ¦cCŒéƒâÅ’ Y ªÔ‚‹¦÷ŸÄ⊢¶ä| „MÐN sBêÀjR϶+¦£ö>[‡Â–fµ²¨gùZMœùíjg|"þ™k¦F¾ylišðŠ®2|$©ï;ÈrF΋-÷"ô]±Ñ¢/DùïÁ¥J|ḴTeļ2JçÄÇÔÄ…æüYÅò¶ã¢.é ø<·˜¥ ï r‚f~x1‰×,-lx3n›š*Â-¥Ö”'„ª”“wûùæ}«¹èN£ë¯éª¿äùê®SEÞS¾®·¿ZK{îøÂ®ûÜ¢â]zïJm%«ðÆïþ%>ÇÆrä-Ï<ñLCVó9Oý5Öm·WÝg?„† ¾>M‹üZù|ˆêNÂÛ¾Ïy쩤:Òôo„y¾ ³†½ý 7åÙãبIH YýC Lw@öè¸ÛN%ȹÁ]ƒLC9øn„á! —‚‰ª°!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍj_¶ibÜŠÇd¨WVTËì¶»ÝM×ïºý>’3Έ%þè çñÃ'ˆ˜ÈF83xp”ĨHY‰2i B×Ç„i z’ö™Ñ¡é'ºÊêèŠÚG’*ÙZ[«ÙSš¹kë{÷I 3Ź×û‹ 7qlUûš-­ôõÀL!w=½M‰û<ªÍ-.ÈŒ>®œÞ쳈ëm,ow~ÙÛŽïŸÕZ¹±Ð£°ª„rÁæ0b¨tÇ„5úÀP¢Æÿ=Z¶1äbT.u‚(2%—ƒ%1¢³¦2¦oždÚEË1=„:æ²Àò¦P„“Hvâ Ê¡Lf3ŒNO“›Z]FÊ‹*5FÅùv5ìÊ£\Fš·+¡Ow¹‚¸åö¶ÙÚ|™êÅšµ¬NkS“š+ö×™*_?¢å«FobŒ’Òž<1¦Æ-Ë’[ ­…:f[ræ‹q;·Dì´áÏŠÏz•waˆ»UòtË©ëO4—KxbðYÚÞÁE«.~¹ô÷x†u<µñá˜1S^Üü´ÝÏHyÝž#·ÅÙ×aj®J}²iô²s*‡\jÞóÍ£‘WnŸùmy°çÇÿ:Q­-·YàL†Íx²q¤TvØ]ÐÏ@ýi·YE^T† fèx©yÝ_æQÇ^…!¶ÕWzÞ 5ÂA§Þr%J6HŽX Ž'îÇÞS±yG[mB Q“Ž}E|/šãtíµ““ƒõU7b2懟)SÖó :6™"t­éV™Cžé’‡guDRŒcnYÜ“m%H –œQ¨&-ú§"•Yöhšq\šµŒYîéJ6(’‡f£9øIŸ‹¥'g”r–h_’…I߉Ò%G§¢^fŠgœ%}y(œ.*J™™ ij¥“LVJ“é÷#õÈZ¥­~Îúâ~‚ÆêªÀ"ºjŽ~ÿle ‹Dù¡/I¥…Ìm¨‹–ƒv¨KÈÆÀã¥ÅæJ ´&XŠÕޤnš­§ÑvåCæ:Ц…¸‰|&NZèÊ®¯ÿ®+­•ü¶z«=ÕÊàÀ‹F[j—«-ª•ÂWþºĆÉ2/½¶ X1€¸‘‡¤‚bú0/Õ!pÃXª ‰Ï!¼$®¦Nû‚1‹©,Å ºÛw×]#1Œz\¹[Bå×¹†¶ìKÉG-uÇxr–UQAña5„ýöFÕ`Ã!v·yªŒÓZït²»H )•0 ƒh°É<¿íè`L‡h&¬Mã}¦t+©/à†£©«në*æØ‡¯C“‘Ž/þ¸Md»B;¹¨•3Õ·‹ûú¶ySVë£jš¡ ¥–y§¯¾êö°:éwÃN{ƒ¶|{íõ­—ì]ë>$?„OüëÅ_ðäÈŸ^1¶y,7‡‚½XvÿŽÆÕ[?’ôÛ‡u¡éS?Tøy(O~%`kcYú!ɾÔLî¿o̼Í/’ïnZË×ïø#CFd-cÿ‹ƒNE¹‚wdñŸ-ç¼£ ï)72 ƒµ+a§¸vpƒ",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰6Aʶî ÇòŒöJçúÎ÷¾xÃý†Ä¢ñ販7¤ó ›*ªôŠÍjAÖ*#(ÜŠÇd¨rqf†ݲû w¦½ßvüŽÏ‡ÖµÃ<¤'8(È÷ñè`HØè¨Å¸ô`ç§ùˆ™Ùry99Aéª9JÊÕÙ™±†˜¸(Zú Û×Z™ãª‹›Ë´(+Šáj°ªK¬û+Ü;ò;\ÜLÊ,í<Ýx¼qjÝ—MÍÝÆû™ì=þȼ-$M¶MÞ.†í›zÌî^—m½®nϯ™–Þ/ @4ôì§/ÞÁ…ä î’„Œ¡ÄÙ8ütJ\‹ÿ;b´¢ ŽK^[¦Qä ’&[Ê#¨ÜH–.]J«¨PÊ4kÚdI)£²>‹úJ-„žF›R…nÎ:¦ÒrеBR¥KÙ…ŒÀ4«Ç9mʆ’ÊiZOWy*Á×[܇añÌEë¡,Ÿ¨Á¶ÂËÔªX„PY5¯k ¥ëð²‰8Iê¬UsÒÈ YÇ:²Í¬æ›g°˜‘%¼q´6lqýi,8‘¡°±›ÜkX˜-Ö‹QÒ)­4eÈ“%_ÞEY3§Î¾…Ï&îå®iÎDS«¤.)R0¹¯ ®«[ó,ZËŒS®ú¼qéÉ_‡þ~jôå·Æ.ߢÌé¤ÓÏÿ·ã—rùq :_¹‡ZNãÅ—Šø,(šeÆÔ_[KX_²uf ô%\dþ…Úc#²rÚT•íwÜgʼnVŸsû¤J‰.F÷Üh¯eV›m>N±™~ÕtËoÖ…8Ù‹&ÆèÐ[ гbvJ2‡ÚEQReb%4Ú‡"‡’öøc™ vÇÕQè@H"yUV‰>Ô±×X„q(&ƒL¶ø¦,qÖ™åPÚNŒyªwÜåž™Ž:hʺêfppv‰!Y¥(Ž0ö·ç•IúÙ% xFß–'Îw¨”«•ÚæIk—£¡´bú‘¦—qzªzŸ~*—úÕ&¡è‰¸–ª¶ÿŠêª–hQ‘fdâÑãigQm>¦"øƒ•”J Ìr«Æð–Wø½+/d*c^¦S~;l£gšË–†ûh¾×†wäFëfØ©½¤¤tþ•K$®tö° n"¬ëÂÃVµÞ¦sŠËÖcÏi1¼Ìvèo¯‹îñ¯¾%íUØa]É;ò¸“.É_ÁÀÍv®e ׫Ã#\é}0yk¼•Þkç«ü§E)Ÿ·CÉ&ôkaÂ*"ÃJÉ37I;­ÇÑ\wÍ7•7µ‡1ËûÆÖh—á5PK§«c´Ò>M7·Još[uÓm¿cz7°{‹Õò†£*(¸Žƒ?Zä—†8Ñ‹g5öÛBÂOŽù r'~Hæ„+GÏÚžÿø5ƒ%8zK%c|Ó5©{þàà¾nê`#N{îYš£{ïCù< ¶ãÞpð°GE¡ÝÆùòΛ^¡Ë =_·èŽS¯ï¾>]¡ÛÀÍ>ïúõMŸ¿G»¯ï¯|ÆÚ»‰ X0ᨃØ*|øŒƒ/‡µàA¼L8ÿÐ6büè­ß¹_srx‰Ò µ2›A h¨dÊ™_œ˜&Í™+e’¤ GçΡ>Ðñ9iÑœK¢LMg) ŸšüšZ…ƒ«R0E}ªZZñªØ^¸˜AhÖåF¯²–¸ÕöV¦Ð@qYÍ%›U2V*/Üòwl²7„å%-»Ê죿È,zA·/:»R}•k²Í¬]WÖÜÙòËÌ©îm>$ZoZŸtrŒjê˜ ¶‚1z])5ê^AGôŒgX±nÔ¡…»&Ýõ˜QSÃÑx&ùy)ÇÄ.öêÉTn?Ý < oÓ]‚_½9g¾˜K&?}Öv²ÅÏ“voÝ9üʪ§ªÿ Va±ýtŠx„†U‚ñ]5„ Nè_?ÒI¸`¹m8ÉY´)x__òÙÜW†gÔI‘¸bƒÿåÇœqôANo5^à‰š˜TcµýHÆH£UÓÍ{#n†Þgç9”‹ˆúYK’:"éà…à1×ßRê7_„&ñ%b¥a‡a–õ"˜1’(e ÁHnוùdˆ¿ ØV½áÇcŸ`åU'ŸZ’Øb”ÎhcÉhHDZÙ¡Ÿv–ˆg“K®)h¤s–'ižw^Z(}\~%g œ.Öé”’Mj¨v¤Ê#xª**’n:ÕgœBšªf}ƒÚê)•kæ¨)¯¢z£zÄÿ±ú©« y=|(­3Q0)Юîð –t¦êªÊj£ž)jÛà™!Xz`š¥Rºè¡ÚÄRb€:o£Lywïn‹R"Ü”nŽDnĶ{fïnª¦Žˆš§0dì…ÛÞ[W» ³cº1­¸^i¦º€å«ï?üÞ›-ÉSxdÇ‘,1¸Â|ª±ërÅÕõZ¥Î¦í–Ưr<´'/ew*“\ò:õv”H²§(y0@C‹ŒÇÃ2“r³€ÈÂqt —;ØÕL¡5Ö¢µ¦­ád»cÓ ¨o"¾s¶Ü Ñ­ N²e€®Þ?®V«‹ßž·àóÀ†˜“€[«xmE2œŽ£îÂD.ØÄå…Í0æžø·_'Tþù¾gCXºç‰nsê@Ý0Æ»Þ4éŸN;æ«çλej÷<»ïºíI|îcùæñÉïðÏóäÃôzKo}éáž}æþ öÝ[Ííïãûád‚-þùÂ,÷=§£™ï>>4²î-§_+m-±jÏêŽé‡^¿Žö¹:H‡ Â{ì: óO¤3 =D|ˆŠ|ÿ\ˆeü8ÂÔ! -f¨2¥!OÎã‚R¥Ì^«ÌL23ç‘’*¸ñ¥ODÁñu¬T/¡“n}ª‡K{ÜQ'šþ‰j6 räj¥j•igªV¦ZcžRšzÙx¾~¹—­ÿò×b¬Æöªª¶Fz ¥žWqª¹D„¶Þ@报¹yù(šJk­v˜k‡2r®cg†ûão欫Cº3R ¤Ä‹én†› ¥j,µØq7g»œÎç®ÃàK­¨;ùj² ^ÇÓÞI'€®êÚÀˆ½)®µ“õ&˜¶œ#.ps)òžÿ5ì-Äõú{%~ ã§ÆìÜ,±Ÿù5ö³Å…й´‚­ýŠPœ1¯¼Á)ÞFQeS+¶´Ã¸Üêµ,Io=$¢fyâÌÈšT3Ùc€ 0]pìtšàFäËUTï}\ÙøÂ‰°SqóQ&èEUîN„ür‰d†¸xä;V”6 ƒÉKn6*[\œ™˜G˜‡›ýùL÷V%–k—^¸6V 9ë„ë–Õ nËŽ{>Ãí»¿ÃyÏ!ýNuåG§N|›¸òÙNò˜_¾’ó «+ýôQ«^ýïÿ š=îâøÞ½ìà‡¿Õò‰;8>ùÓø’è¿e«?˜èž ù¤ÿ‹¶€õÇß”ˆDîÏ&ƒÀ&vKI £ªPJeÔ >8c®Ñ5Ðtô"ô&¨Jä‚Ì`¿4ØAÉuå`!ÜÉ$XÂÅ‘0…ák _èƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·\ö¡¬Z»ä²YvPã³û §}ÁsÄ*;Öãü¾_µ·W³öwˆØXEAhǤ–(9é´˜¶È†i`øÈIù gÙ ØzŠ ¥iW#¸é˜*;ûÓ´z«§tKÛëÛby{§÷[lÌŠËÛ¨|µt—{}j „]È,­-š}¢|½®hÝ-n~®2QŽÎÞ¾Yλî>O)ߨFM¯¿Ÿ‰œÎ/à™Q÷.`²'0!p¸:,v-Ÿ¿AäZ$Î?ÿ]ü¤£³†:D‚üȰ™Á &Oº 1 ßÊð^ÚD±Kb’€6Þü©îà+žBĴʈ„,ö‡ýú¥4\»Ö;×Íá,]ödÏŒ¶¢„A"ã·´±lµCе"˜ƒqõM¸qÄÒ\ Å_ò]8:]9x¦§EV'Ð ÓäºÅùÄrj¾Û™0Žï}¤ƒ^—T{[c6§£Þ‹¥sý±Ù°Ÿ¤íë·ß®;¸»_÷ïÂ<ÅðI2KaðÊõn<;[gN{ó^1¯·ôn*o½ôÔgßòì¹zÎýäoI~ãä¯^~ùÈC}ú/mOö>–µ7*ÿüÎÛn|ðëï ¡TÏn¥øÁ¾þYö È@ÍAækÏ0`c—'àäï‚KéÖbA:/2x¡ð V9JÐ]@Sá 7èÂã,†4ôA!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä" Øø!̦óÙ«%ЪõŠIÈ%BêÍŠÇä"BslËì¶V§ÑS@üÏë“Û\´(¸Whxò·à§ˆèø)·¡YiiIøuvÉÙyt’Y‘êizÚWJ±Ô(9ÕŠ+»ø š`{À kàg7û L‚K ¸Œœl7q|{ˬ,M­£è<]V[Û­ ŽíÁÌ~Þfn1þ…îÙå¢þ^_ÅnŸ¯ï›;L¿hß¾VÊÉ›ñ Â,^TýSÓn¡ÄD›ù{61£™yÿ«ú`¨¨1ä¸]¥jˆ2¤Êƒ€\™ìèq¥Ì ØZ9Lïå̶FÆKÈ!åΡhDõ»yÂ+¢LSAëÇ‹K/WO›ZBIª3›‰€^ýJëhÕˆËNª©ƒP~Á¡]«Ç­/ÃpåubtÁf» ï29%qý«é£°†óÜ’­E~r M K®<Ë™Ñ"¤uëd¨wÓ‘<(sÃvû®CìW\ÏÃFñšLõXЗ9ÇÑ,‰ÔÛпgëýfØ3@ÈóvKê÷h.ÏØÜy®]»¤‹ÁNmùdߌÇO­Ìûø©Û~mâò¦Q"µÝ}½Î õúÍñm·ý<ðµ„Ë{Ø„‹?a¶;ö ù):¯õýå•›BÓ0:¾ù—?imè‡þ«¦¯ÞÂ謿Þì²ã4»è‘ƒ];X®Ÿ†{î±iî;Ús|ñ&U¼— ‚þpòL¡þ¹äzîüD°|õà {û‰ÔkÿK£ôD7ø+!…÷^7šRò®7ûÏsˆý+ÙË/Žž¾¾R.þ9£„ûù5¹‘¾÷iå€Ô¢± o[’ áÒgAÙu+ƒ”A!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Äb ÈøÙŒÌ¦óü%•ЪõŠõÑ"Û5 ‹¶®×°œšÇì¶;–† “€u¢ë÷|QÞkwðÕGXhØ(8xØèøøð§07)y‰yI‰ $™ù ʢȱ è`šªZaæ):Ú¹*;{”QÊYçJ»Ë;¹9ñçªÛ[lÌJ’H|̼º,ù\çÛ\M(MmÍ}ˆŒöýÝMîÖš3^®.–¾îþŽ~ 3 Õ>=“Œïo¤o"}ÿd7OÛÁ…& rç‡É7³wLJÿ;b”H޼„AÊ鈅"]=´™2¦…/ï¤á(3狚іàô¡3è ž €d)4é‰5s¶5²èP“J«Vâ¤ÌiÑ‹’~Fµ ö×¢ºå­šÝ©žyZ¨¿¾ŽèjÑŽ{Ú¹ïÎ{ï³GØûÒØžxðp_…Š5„TbI¯±J™5lê–ÚÔk3 è‹%®’q'Ím¸æô½F—ä×¥ïŠ5 hJªf…i¼†R°S1yèªA¢IãÃ(ÍYv¬´2áÉ–éuÎ<s·¸Ÿ¾æRYÔàÑŸ ¯i´.¦ØTaÉý{Î×k1^{M8gëÞÃ…†¦LiÙ™ó¼œ ¹qÎÁ”Cg~\³µµ8¥oV}½ö`á«‹n»umqב˫¯.ù:ÜÐj½¾~ZvøòKÇÿgsÚsÿy6Ò€÷¦-dÐÕkÌ4ÒƒÏU0DíÙÇV†áW‡bèápç‘w[p:W {ßðgš>¢m·"~)îàŒvÇ]uÞéGŒ ÅÜ*váF¤»åØM Çb{4V6$aî86‚×d/6G¥ö] `~'Jˆ˜zŠDYdšq¶J;0YcñAd`^îeG\˜1²Æbjt¶6_lri¦>B¹Ü2áQ'Œ*n€¦š’úu&£XÆ åœ:Ý‘z:Ù#ŸrV‰è}–îô)EÃHopu—çgxˆø øå5HØÈ˜8I'Ù8ȘwYù zFøjzú´XñÈf7Š+»¥êæ9‹››qÛJÁJª,ÌÂûe ñ;¬\™üÑŒg7ö¼LXŒ¼»Z½­|]ìÍŽ:ÝíÃv-®>ù­Èë¸?—žùRG/Ÿ/„¯ÿ¯‹Ü~ ÆðwœÁ…MVAGB!É%+'C EŠÿWÑ#HOÈŽ$ÿÜ)Bâ±’,UlÄØ¢”-k^ÔéÕŒz)múÔð’Á=_<b ù³$,À‚&}:Ðѽw’œB½ºBÌRŠ\‰Ä 6È ±[kýš6ôè\Hz!5ÔÖ˜Õ™dݪ²¨'-²·_ò¬‹­qûÝt„kΓKt²*ܯñ1Ȇq"~ Shfi˜ ­Œ9¹U3ÆœÂöù+Ù7jZK• ú"ßÊ~ò¾iiçÍs}I­GºêéÅ‘1ÅmûØÓh⨅ï^ü¸èᇅV…DŽrÓ¼åÊöí$3Ç`ÁsOmݸÛéU”_‡ÞܼÑò¡åR÷êΜ«ì›!bÿFžLÔµ¶WŒWSÅ­1ÁrÙ<¸“eFÍðJ¨áÛ‚š5X`œÑo^Ñ—ÞÁ]·‘v®Ÿ&&F'_ƒÏ1¸ßIwž6…4³Õ¤=S±¦•Iµ°˜Ÿs/8z6"hJæヤAÉ^‹%R©¥2c½I&Q¸IÊ‘õ%]!Þ ¸žwXÒ“Šž¸f•QºöaNéÍy߆ôÙ)(vn:Tn Yf£ðÅçzÊç$…ÏI'§Ÿ12×€ªIöfjÈ x›ñçiSHJi(Ž ¦Ê(’2Ù¦z^§ˆšºÈe§xÚž¨ìeúªª§ê8è³ÿÖè*†<•…’¢Ä€ôžZûP{+ˆ ö’s4B é…É$ŠºFèI©:¶)¹Ûq«l¡¼¶¨€ñjèh¾z¨mn?ÊÊÜ¡¥±˜W½I‚škŸ+J¸§ÀQ†–ܺ.Ü,bß^Ì,Ÿ[%¼¤6õ¬ð&•:“®¾ØkˆŠ|¯GKaJêǼL«Ì2ÇpÊq·;Xä…­jLÞ°½>ùaÌøÌV²Éù+òjúj‚¸rÜ4D» ×gFì^V«ƒõØplµo¸YÌvg41a¶Ó5°·K,wÞîèêÚ%*F¬wành*m˜· Žxdhå7gO‰ƒõ Ø÷ãO»é¥¶Œ–o~“JídÈùOi»0uèsWžó8›Îzë®›1úëúTþê²;úÑíA®¼ö¾fê^f2¨Û¼å¼Ÿñ #ϼ—«7ïSµi}ò¶ü;ÞÕ·¤Ü´Ûcå KÊÐõ‹fN¾MÔ³]a…éƒÏ |Û¾2þû³£å^ìö3Ô¼ÂÕ¿¿q ¯pŠO­§9®ù뀸Ûp„§@B®w) &ëî‚ÓwgÁF/",á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡ÄâÊ2~H£ó êšµSŠÍj·œæAùð"ªb®ùŒŠÁ /»]MËçôVyö^Zãõ¾ÿïA•t·Çˆ˜¨’7ö³)©gðÖ8x8¹É9…GáæpÕIZZFX)ˆéh˜j ›óê–:*‹›»ñ*J[Á«+l\²Ì:¬¼,”Ìüœèü5« mí'MQOÿº®N¿µö9 ¿P¼ÂmÁ…§ìÉcñ\Â6gF¼Ø a7„ÿ1zd! •ÁÃ|<Ù¡Ú¯’ñ–Xd‰¥³œ‰ÓB†×ïê—%Oƒ<ƒn:¯Û2ëÉæø¨f¿‰AîåõçßÂk“®ÉUÒ¾>¥ÎØY³ëÈ@,þŠ9ßçb¿ûêe;\µèçÂ{Z¡ˆz³Ðç¼£o\*ÒÙŽøzw~^·pæÔ§{Öm})dæÚѯ/=Ÿnñ¯ø¯«ÿËžžB÷=¶wîE^^æýÓŸ|ñAgU„Ûd䃆¶‘bÀ€"†ŸÁWE]¡`T~Ç_€…݆S}ò5G ŠÐ±à~ìX}58Ù„;>…WW¹ÕF¤Û­uœˆøæâ‘2vG£M…ÐØÝr>>)b”75‰^•In¸ã{&r¶%xH¦$e‘jrábKš§å‰íç— jø‹’¢‘)ç˜øù3Õée Wþ¹ç¡ÿQJ›].¹f¤vÁxM\Nù真Ôi(mz—¢ŽQVÆáppÙè)žNž&*¢~‚é ~šÖ.]Úʨ–Ê© )ö4 ŸÀ’Jg–žù!p¬ÿ* l¢°bǨªçik‚V@ÚXC¤™êƒq;Ζ‘]Ø¥^0k«˜Ã®ƒÛ„è’P\¥­9I-¨=Pú¬½©²rkÖJz’™Ý.ö—Yúùj"¥¨òJì©õZk²6jk*J—ð±KKk’÷hh°ñTÌãˆ/ÌÈ»c´ž(o¿KoÆöuT³qÄuü¨ÄÑZ™ŸÅ%é\²±K-Ê$‹‰ïµ<-üòvBº²mg}–O³$LÒÿVäõ¶áͬ ¿Cš|ôBa3ó±Ê÷t\³kTmìÒ×Uë$’ºwêáÝ~;èÓã&»÷߆Ӊà¼Èšj÷áL•GÞp—êxå…ÇGU²r5nù3ˆuáÇçz§=º`Ûdzêà¸m†®K:´Ø³ßÞsè¸ÓNùî¾›ðµx¿On…­¿ŒÝ:âŠ/][zñõÓC™èå§•ðí¯-’6r¹âMv—3LzÈ ÀøõÎl Œ`‘S7 ЂïHÜ9ÈLÜ„·CàI8 ¢px#\¡ oP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ú„JGPŠÍj·! i­*‚^®ùŒ–¿ëX%NËçôV[…x/ïìxý¸ÀAxà—§'¸ÈØ8x¡8™çXiyyhȶԇéùi楙IxzŠ 3º9!Šèöš:K"+™ÙZ:YÛë;&ãªyû[l <²6J|ÜŒÉ|h í\Ý»úEÂdÍ]mòÝ-žEÍn5ž®np¹þþgø-úPŸ¶ÊÜž/à–~æ¨ðq%0¡‚7”S1GÃ'&F¼gЇÿ;ÒàÈŽR2mKz v¯P‹xLº¬ˆC È—4¹ðÛ¦cfÍtJjÃ2d+žD§»‡I€E›Ú+#s«Œþ„:½ªj´*@c2mi«Ø•PËB%5V µÈb%'Ô«·¸iwøAd—.°/|޵v·l"½7 ½pÎŒ¯äJP"×ñ a‡åTur]ºCýy=j8QfJ(/à üYYäÁ*÷µuø¯:¼Ñ’êíäÚïã{ŠGŸ~í[3dÎLºB-r™iÑ–ƒãZ 2ð§C–vήø#ì\#ÑÎÞãä=Ø75ï=ܳuãÔ1'n½k³úã8WKßÞžotååï#ÿSŽW|òèf<„ÜnÕYÐЋÖêrΣOí zéT·fz䕲àyê&}R×®Ïîí¡O»í³—3¥î’Ÿ^Ýæ¾s#OOÊ>öÅí€c’…AvÄÀèÄTÜ'WÁùh¤;è¶ât„$4@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ¦ŽË ñ8 Ëa쉛l4çü¾ßQGqhsõ‡˜(W–1ˆPó¨8IyÄ"t¸†Uéù‰tÙ±ùÖ zŠÊ#ªñVH–+ë² (*éT;»ËkŠ+tëȸ×[lŒñ5 l‘©yü -ø¡KH}}j ÈÚŒý .ÍNî©í%^®ŽX뜾–¬“ |.ŸŸ6¬ßïŸg' @€ÿ ¢º7Í B-ø \rg*â‰?.4¬p±”DŠÿé€!cÇ‘IV!$‰2)nïRºä²²”®“8D¾¼Yí!›8{î´S›™èù<*¢L² †– ÄïcQ¤Tí8C,çÀqzªz 鎛{°Úxã‰ÉÀhÿ°Í²…X¬C[lØ6îWr+•:Ýf¶¨É¶zr…ŒdËP‚‡;½ÝÖáUÅ WVFe+káFjf–˜Ÿ2†\vnaÂÝöRUe,PÁ¬Ÿ¶‚¸ðh©›Cç~©ÎÙÏÞö½¸÷ÇßÉoÜu›»Ç¸wͶ!ÜX½–ÜÛyòÁŠ{¶8:o“Ç—[wÜØ|ìàÉA«?o<<ýË`×ÿÕ8ßjµ…EÍ]ÄwW-ÍgV=¸U~¼1¡ƒ w{B è^{o”öœrÎØó^t®×ˆãÅ—X\ûM%†*ò—ŸŠ¤lBS®í˜†‘I8Êwص"yz…f(ÖHäŠà]D]ƒ€I5‡å™"+§Á&Ô4Gòf’€5ÖFÆG_/Â`‡J¢7åu¤¡Éæ ¹¡(ž›qnW•2²Xg–1^¹ç„p~©[˜ŠÊ•×2OÒY–£™GW}MÒ£‘Ì=¨Ôy•öÙ"gUŠXžœLšg{ZiU”ºiZ*§Á÷雯by*v›JÚi€µ˜h£žh®ž®)Ú£%ÿb„¨ExˆQÍø£˜=@)e…|v¹A³‚¬É+?¿vå­w¤n7£3ºúàê…—n9YuÙ¹h½«ñ ®ºÞQŠì¦íÊl¬üVki¢š¥‰lqùư| j‚~Ú­ ÿ{ê[⥺Üo¯”k‡öªc~ž5#¤—Wêp°Ï²‰ñˆ¶VÇ߯³Œ®–0/[ì‰xØNùÝl»Ó£¤•+Zv›~Žš{›ý9èÂL^zêg.¹êaâ¡Ä®Ï^ÑÓ´·¹³ÞÎ÷Ôˆó>Òï<Ï#>z Oü?°G›üQ»ÓÌ|ôÍ¿öŠGÓ_/YçØƒ2 öömèè¬~™÷૵Õg(“Ï òç÷AÔèo­'ôïë#þ¹õ[žóýýØ1§1Å|þSH†Ld—;°nìkÊðøÎ}”Ç/WA{%PÔ`‰¹–ŽL",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf樒ΪõŠý@I*BêÍŠÇdåVq>/¤å¶ûÝ OÔ‰.×&‡ë÷ü¯†ŽxðÓWh—'"hÅvø锈ö79õ€©¹ùbÉU²8EÈIZŠãé:ƒgÚꪈz©Õ•˜ùz‹«è7SÊ›\«f ¼á(¼ÌŒILuL¡ÚL]­…m½ÝfL-Í-Îù b77žþ¨íS®þ~Ë?Ï<ý´KŸŸ -¯ï_è #Láþ;Ø \*|~ë7b{ZDA±Ž•Œÿ;^ ¨ÐB@$ßÐú(qaÉ•¦5J‘’¥Ìv¼î bHPàÌ ”šä“£¬1yµùåä"ŸkØ; Õ…-¢MEŒŠU§(/A#Éó©Õ›×Öüº í%¡RÃte”-Y”¢³²’ÄܨŸs‡2`‹iU q)ùMÆJ–Ú¿žŠÖxøoÅÁrSUOz>\ºÇß‘ûæÿ?cKÛ¿+e}ü `Æj/Òn Ô\˜¸ûAp] œ eP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íòçN4çü¾ÿ›•džeG(ø‡˜ˆVÁˆ¥×t(ä¨hyIS iÈ ‰  £I*tÇt7¹d*êújÑÚª2A¦9I‰ »Ë;›áKYÃÆøÉk|\|1‹‹§Œ Í’wX'}ýèðœ¦Ç¾8è9¤{ºL±'ÎîZy®ŠOØ^ßi¯¿ïIÂÏ/ »w "ØoBƒ -¤Õ0¢1ór<”ˆñÌÅŒÿ-¢hãM³Ž$ùœÛˆ*eÉ•›½xg %Ë™Dþª¥.ŒLš,OâYFP¥KžD[\!¶FØË¢LS$FÝ·2;›ZöMU³5vª&¼ Vd :«X• ‹¶ÈسÚrµÍ:4˜¯sµýdw×–™b‚¶ÊÊénZcÔÖ¢Òµ.9¸Rsx:ÌqÖjoEEw—í6k”%+ut´kåyå~ݹޡ WçSv”ÞÔrÖdTÌ“ª³Âž !lúlëà)I…Æl—¸lÔœÈZtïÉÉO‡¨s¤y™Su~Ž9j5ù~ƒ9Þð¶Þõè×í¡«—nüréëù²7ÿ? ÞzøÕ‡|º1_)Î6œXÚÕ2ßMÚTʃ^Ha†öf™…jVY_hõLÓÃ^‡ˆ)÷ xÅ(àgí]&ÜHÜm j)’¦#1³%¨p¸ y®©'ÔcˆÑèÝ€*þÃd…ØUÇc…;ê¨AwRö÷È'òçŒYnˆ%‹¿ÜFdšXéÑ“ŠQfçÆ~µqùÆ”VI§~êDù˜˜ä‘ÍÅù…#ºwžž&Ù’š’z©p3Êyâu&W§t}ÊÈÚ¥±eJ]˜‚zZ&-^"J¥˜ƒ0ºž ŇЛ(Šª3GÚ™£M‚Êg{ŠJß©JÑÙϪÄÿ꫹6*+°æ ©` ÔöÊa7jA !¶ª5æ–±˜#e]‹ë¸fvy§vèš0j2sFçmTy¨°Ne(‚¶b8iÀºÏ2I²«ŸÌ Œ{Õ%졸/Âú"rã‘êÝØœí±8bº©Åý.ìj ÏÆ:F½*wð¯À`¡ÜÈ?*D1œkÊí{ëE›g±'WlrÆòš/Ê'Xs?Ó74»lr ¤‚U½ë2GAXQR( yoÒØÀJu]p%æmb1É5"'‡m Øi‡ õr1Ï[Ó¥øV­&W -éÏ~ã-©ÞÏüŸÑ€.Œ_}G¼ï‡ˆã–Ùo3þøU>Ëè+ÆpWnùmÐ*ÆyèÝÆõ¨áè‰Û#zêé4~ôæ­WžõŸÏŽû[[çÎ{¬»ÃÞ;â°M|ZÓV|ò§ý¥<êºE|óµ«ôÖ_?éNlÛŽ½DÏW/w‹Ý[<餻¸îøû0/ûšS¯~@ß§¿¦,ÑÇ/ÇêŽË[ßöø¯_¾ð®Zÿ³ 8àÀ–&-‹œÿØ[™Ël÷ƒ 4P¥¸ZHYÙ6Xµ­Ü „ÂSM¼Hˆ;¢pv \a ?èÂÊ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"@—̦SXkآϪõŠ)@E´› ‹ÇͭÜø‘×ìvœ„3ä$ÝÏë3Ý齇¶GXh˜¸x¦vèøX†1ˆÐø“¹É©•¢ ˆÙØIZê¡ù‘ˆ6Iagú ë5z:«J›KJ{${–¤,œV—ã7WÇ:¼üÊ«l±¥ŠÈL ú)m0ZÍíè vÝ->®õýIŽž>-¥Þ.Í%éN?_Á[¯Oô¼ïÿ0 À~ì^äˆÏAÏòI1•Ãx³Šýª1c‚ÿ/ÉÓÖê£Æ‘+:2 )¥RA’,‚šådË™ó¸À¹Î×Jš½ÚK*UpÉ^BhZR±8«‘Ö§œ/g-¥Uª­í o±’„tQC¹ZÁÁ‰V×´[–|t,1a›}­&þHx_È8“"ûê÷1±Ž“+*{1'h?Dã õQÚ…ã"† T§Ä”šáJMñYËZïTì±ö`Ç´tWvëØ÷åbœqÿ,únAxo–µógiê”Ù£'kMɹ¢cÓÑ2EÅ:¼wbë‘K¿ts:vèÊéƒlÞ~¾áàòyÓÿv­Œ`$øÝ ÙÚ©&ÓrðÙ‚Ò\êIˆào"gŸpr…B€Öax[{ß±Vg²÷•x#÷`d âÇ\q*š¢Œùù'nÑL¥ZNì¸Ö_t±òˆ,b>þÇžE6ºø’ ÎØ[“÷=yRüi`b•½u©`]>ŽY!{8rIä’s§f–’¥]†9êH¥“-Æ×Ê’pòâšž¹Ÿ”Ça$ä|K9[“¢If£0ˆé§ŸÅ±)âsvšçåi¹I™”xB($¦qž()2øMŠ"ƒµQz¨œQZºÁ¢nÝ9+¨o^™i4rzªÆj¦{Z™›©X Š¢„…ÿRªi³¯^)«’ÛEf‚iS£>ÓCLB“™ÓB*©Cú›ëgä¢V)ˆn¦ «`¥³¶µ9¬®Ü:ÊoƒùV-šçÖZ^¼þº'¼újiè­ÀI†/cå1kš…®ŠJqªÂKQ¯ªT¨} ¸n¿ý G%sÇç§ ¬¤Æ7‚Œä~ «ç±m\ è ö£{­&¬¥·{¸WÀùn4­Éõ„¢óÏ@5m­!¬R½ÇÍ+Ç ²T{•©=Ws£5Öçä•P݉;šÓn ó:f¿M÷†KcXß„tï  (_ç-5ßüòx­·… >S?Sýµˆ s#nW¤êÝîµ¾Cnz …yO…ûhç4•¬êF¢ó}Ïã—ŸžQz•W|!묇-{ítQî‰íˆµµîžç {p¾¯i>«|ÍɯFrð>,Ða«}B¥§ˆQ„IVïŽñÚ_cÏÜ‹#ýÙy?þ!¥U‘IJ§èïËÎûðG«æ˜õ~ÿH0Û¿§LÊoè  >Ç›DÌ€viÜxÇÀ1)NŒàjXA ’$MöÓ ÛäAȉ/„¢‹ OØ‚!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍjcÓÄ2¸ ‹ÇÐ.£J5“×ìöZ}Xºçô: ­„äö¾ÿ¯„¡·—4xˆ(±hˆ ÷³˜8IÉãèu÷È$YéùÉÑé!:Aêeʪºú(bê ¹iËjëWûK»K¥Kë{;Ì&ܘ#›F¼ü'¬á¬Ë,==sÕM­Í›W½ý Z‹½÷~Þç{Ùj>2Žÿd¸ô¿aŸÏßÌÞ±¯Ÿ@\1eˆpUÁ„ a,¤` bÉ7èmÊä,b,ŠÿÝ­{¸1ÈŽ$#$3­] o,KºÔçÈâ™”>þ½¼ ‘Vžk D¤7gÉ“õÀøT´TR¡ÍLùræ£J¦TwtÁ“êTÌ}ЖVExuÑ8[ š=å°Mµä²±µ"³I$n³¢Šó*ï×[N9Õ³Ù­-ZF¤~†µÒ ÎÛ:/Vì¢bÁ!aòI™Q[¶óLò,üW3⨡ f$MÖ(ѬJCÄÝÛ±ÓẉG×Õ[š—å`¿l'nü–wÏ\Ùíz<¹ŸŽä]§¥H™q! %d™î$wà(HžÈ[FÈ–hžåX—ç5ך$œ½)˜Fz¸Ò’õñè[›o®¦M%ªif£V½¢gcw>Ç`u i\¶Èfyš¸(tçÍtc“žz£çs‡bXYŒcùY§èåyÌ¥qÒ©iŽœR‰'…©j—›¨[’  ©0Љ€µÿÊ)áQUÉØ˜öçŠÓ*XdtR<ÃF®'LÚi ˜š d¥ÞJÉ䇯pl”[.;ï­s¶;¡£úV©½Wz«§GáëªÀYþËj„Æ©lz/Jª®Á¡.(~Ê6lë‹_v¹'ÃFã¯}w¼»ïPsú´‚¬i0}×¶,#®‰ºw1‹ÓÇ­ÄÿJS²†bÜñ¦Õýj¶ oE²“%Ãruª / ?'}ÈÅT÷ Û5Zï”/?S§»…Õ`».]áRjW×K¯=œ½:V@l/=¢\le…s›Iîón<öÞLô¢Z(xHoè%ã‰37êÈüøP—¾ RÞ•“tµ8™†òùæ±Þ`M¢ŸŽoà¨ î¹æ«¿~~ªÃ.dÓWºI{îPo¬{ïà6»ïˆxõîÕÂ'„»ƒ­óÎìñ ÖÒò“;Ïùî_¿»ñÔ“<¿ÀoÏôŽ#>Uâß‘fù8I~ùZÁ«ßhßð¯8È„½?¿*¶›a/ÚçžÑ ÿàठ¸pnû‹þˆT,J+„`%¨2 >Ž€Ô`â¨åÁÕu0„°ƒ Oȃ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~x³ý†Ä¢ñé‚Ȧó - AeôŠÍjASΊ¸ÀÛ²ùÜì:Ô &ú ?ÅÔù ¼Ë÷üþ‡ÝF·$èWhxÈ¥7Vµ†èø¨¥ضè噩I$Y‰!ɸ):*ÓÕ9–A‰gy©JúJzJÕhàºá «ûÉõ‰‹*»;,'Ìj¼ä…—Lì\fÜùè÷˜³3¥ =¶iù€ãKÿ§_žv¸áWÔ*Y9üYvÚjçÁ×_ÃYàW41ita/éôD ‚‘aè“@Ûí÷a~$Þg"bTwQq¯!÷ŸsÞùô]tû½èß$ôQ—Ò•ø¸ ƒ Öˆ#†ìHVÙR¼-ùÆW­ø‡d;Î7¤Ž2bãg6F¤yUbIX¹h—EjId˜YŽÛFì1 '_ª¥{bZååe:5褖›‘‰ yV.GД˜y9æ€Ïz¥~`Ö'¢qî9ç`¸åéæ^qnJR¦€ ºX¡­ø[¥<¢y#¨Ê ¢´‘©Ü2@ƈ]¤Caª(›¨&˜(qvÒ*ˆ”¢Ö™©Tî°«ÿ>ªŸ«ÍÑ*kšêÚ¦•+²¥öéQ>ö kˆ?|ûªj‘{Q˜Rx›Žó ‹§4Î~Æm#ðŽ0Y§] èÛ½Géš,„ØòHéºwZÉiÂÄYª¢¡TXµóªŠ¿úƒ*®Ž;Ú„jqw&>9©` ? pµ';Û.‹ŠšÒ› /‰Ü˜‹…Äë1€ R6”jÍ^û3ÇÇ©Éç…A‡FoÉ[½¥†×[n’¶Ò’¦3£bàb!N{ƒ«¿r¡Wjp-c|ÐØÝ”­5¾áæk2ÛBŽuo.®m)—yÿÍÙÒH¶Â÷†€+|³[ºZtä1ÎdXœÑçݘÌf×xy™ÓÅaçpú汆~§,ºR\,÷ã©Óä/å®ÿñ:WU{î-¤¦{ï–Ïþ*Þ¾ÿͺðÃo •¨ÇOBUËYé"GzðóÉF=‰@Z/D¡óŽzøÜO=…¡Ï)ö'¶ˆþè!š=¢äíÛ~v¶ó£ Ì÷/¯¿^Æï?ŒòU Eƒø‰±“}ÍQ×9 ç€±@µÐûhœWòEÁËEúË òa'ÂyPwÂéàs§ %‹à {'¿îO…2¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋uÝ ‡Äb ¸øÙŒÌ¦ó)D*K¨õŠÍ®€4F·« ‹ÇPpò`N|Éì¶ûmK«ò·ýŽU§Ë:Zš(8¨·§¦D˜¨8hшÐçG÷³Xiéô˜”i°‰x* Ói²7Ù·9Úê:3Q:"9‰úz‹ë@{&õ› ìÆª1¬Z<ç¼xÌëQå ËÉ\m'm*ÛщmíM$Íý=NmÕ]žžˆNý®/øK1ߎ_ùþî•ïÏæ,Ͱhôþ¼f—ÀX:„„ì¡Düîé‚hn¢Æÿõ>Tœ‚áãÆ‘%›F2%O|žE©2&EG«,)Sæ/[œ±ÛWgΑ #~âùÒf¿?‡:Ý ÇL=CÎzŠ5ƒ@ª´(éªú¥½¬dÃþ9m'ÚÊ<†éÓNh¸tRÍ¥»RM.È-»,*Á…4Lý›lï!»È°­© Yo±­Œ1®…|ÒÝix+ƒ,Ì4SM“˜ùjK:’Oqg/NVѰÊÕ­?¶z1ßÒ-OóÎl«³æÉz'ýmÛ7ÚàqSù¾ÝôÞTÔ‹•^PÁL‘×ÒÛ{OÏÍ ?ƾÛìR‹—%“ü’9ü/`A¯§6]¼óúí›Óÿ'O›mÒIá ‚!S1ÑÅ—`ƒbé÷Ù wR„=m\Z,PXÖ™W\lð‘ÆÞu"ò¡{&ŽfØù¹Èbj+FøXr¨"[ZP†â69šV#t&Va…åŨߟ-G!“P*Y׌7>©¢VÔ¥WÒbÝAs¤bjéå† éàŽÁx"›Ïq©Ô‰R¶(Ÿ…¼ÁåäxT–Ùe•ý™·d–î×gœ|*•§ž`ŽÉhr…H¢sô¸ékF¥YdSPž7éø¹YŸ‘ýX ¨œ‚~J¨¡[bÙÛ)B*F¤¤8Ê‚§¥…ÆÊ꜑nÖ¢q‰¾™æ¨Šjª©©Í¥KÿU5P…ù¥E‘´ŠÚ÷^†Õ2è [ i›mP?±igQκV ·ã6 j¤<ðú-·¶ÊgWÙÁdm£cxmwˆqQ³ábÚ&ªÑî g¥©l0’ÒÊWkeÓ2 ²+MÖîT$íÑo© >w÷•Ê)ܾ6Öê…½ƒyª-–©$6’ŒáÔxPÞ›ìBÅ—‘äË _B¦º ¡e½s/ÒôÜhïäÏ›QŸÃµ©™­ÝºxeؾŒ×„Û™vqη£;Ï;Ü:羫Ðb~ü†)èæØS'ý9`öѯÕ{o¼[kùÌ«oÿ®Ùuÿ§_ràhÕ_¤”"’tóa×=³puËVÔ¬#5xhxჯa6ØJY5aƒ#·}¦‘”bgÿ±Wߊ‚ `¹Á·–vßÉHÜŽ®ä&^bw9C¢nFF!›]•äEd3¶ÇÎtüm£‹|T¬9zL1ÐÇ;4u"ã¹2UOC60Î.÷GX…>EØ%† ÃÇV'òóØjœèX@‚í‡Øl7äö?¯·qÊ’y5¥~(nÏæ xÔ/™˜Þ”!~õÔh–iÓˆOZ$ÕoQÉöÛÑ߃oL–Àïå^Öb2{ãùç™u‹wéª ~Ö˜«»o©¨¿®w-ŽûDûã–Ï{TÜ4Õjë½ÿ${ê?ý!9„-e»ëÏÉɯXüJ;ܤ¹êg¬ØÜΘ–eA,iDµüUpMµaÞaW›¹ïƒR ÍHػΠ…×£ ¹7Â^.]2¬á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·Ü$ÁìŠÇä¬rVXËì¶û˜¦:Òêë÷Ïë5_ºÊ&·7HX¨rpW¸¶døiXEi'(™©©eù€‰Ø¸):Š÷Y5gGªºÊ‘˜Ñäú÷§Ëj{KÒ7W[׉û»‰å[rÇ;i œlˆ<¹#̬ý6¬ØìU-Ý]Ë «-Îõ‹4žNÎRGÁ[®.ŸŸ:Q?¯_f?£»°P8|2ú<(Æ` fÿ:Œâk` …+Z°'±Oÿ;&T!E$'"sEmDÆ#Kº¼s×)Tà-z‰ÓGJšZæüùΦ±‘>±=”箢v"} *·aÔ(Ú„Šõâ3©±Ö0Š™5¬:ŸúL­ÊÑš¦!ZÃÁ¶ÔÛ{yüŠcê\ÄDWUÆkËn_™2Ý-Të·Ø Jp“6ŽÙnèVƈÕHù2š¹0#²œ|(åcY™¹=^ŒÙgy{:ãT+àÙÅ/2ˆ).cÔ3Oò>Ýl7švÕNV>\ú3ä¹´ø*·¬×¸fäΧ÷fþÛ¬75¬£.–˜;ݶ¾SïÌW²Òå›­GM>œ}ãæ3_¯çÝ>òøsî‹cÿ7_Ýqv)ÒUC!䵟QñAWïv>õ˜ö`[k%Å`{²`›v7]‚‚pðÙçYl£ÝwÜu_XXaŠF tú±hÙŒ&¨Ù]ÝÍÆã6°•e`+ªáç_|±!÷œ‚'Ö袊$:Øß‡'c“uDÉn)Šwå1CÎ_=Ž9å1ü…¹âoŽ·ÜjõiÔ%gi•GË–¤ùGŸw Ú¦$ŽWÒ)'K•e7JN™'#>If£"µ˜¦)_¡ZYäœÊÕ‰%’ä©g™wžc§æš_Œ nY¥x0Õ }œ®E)pnÆ™¦“4Ñéš©ïáYë¥+†Öê“ì]˜£¤lÿâaz~âÅ(w7rHÜ+EDk&­RÚG„–_Qkm„¡¾Â«l%nµ¶ÄôÚ »˜¡‹)K"k£¨ïr›-œùò!¦£?yx&Ÿrê,£²rìz»j¥èaVS¯¶&œ¡¸ªÊÊæ|”fÙ`¥Û;î¶:Jû‚þf¥˜ÀŠ)ļ ·ëðŒ{êûéÇ·Y0”ï:3³T*ûéÃ4vóŸgq™°z,÷{²6·Š¼Ñv†;¡ê>òñÕf¸º¯ŸÁÑên2V3MFÖd›$°™pÁš„ˆÝ4@nDÜJ]KwÜ#{ÉQ¤Tçío99+Œ7àdzErÀzÂmxZ[Èx々--—ÊKŽùENÚB䙯¢uµŠ?úùQ‘{^:P%c”zÞœ«4zÅ­«^¡ M]&곋’ȸû®”î»kòº¯¿o üð™Pˆ{òÊÓ¶mÏM=ò²¶ƒC½ëµgÏý¡„›V÷Žch¼Ûâýñüžo8ó^ƒÏ>R‰~w—ǯ¶úñ=§óø“â-|ÍÂÿ ¸’¤(ð¾A‰É¨7ÆH”G¬UÁöAç‚÷Ë üˆ8*Ï¡áìZ¶?î.„*d_jZC#!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÊ@'¾æ¶û}fSⵎÏë5_›\Y‡°´GXhè8ñwеxøi–˜fqgð3¹ÉùxI¤Ù9JŠä%Úà‡J—êWú ë¤j©Ù{‹Káx±ÚšŠÙ›+<œ \yjL¼¬§¼öáŒÌ<½ilµ{"6HÍmˆ=gíÛM^&¡­¨{ZÞ®u®‹š>ãånòÈïßdMк…åSçÞÁ‚ ]\ ¶°XÉc”E<†Ž¢F‡ÿä常1$‰‡ãè…«R¤JŒõ”°Cw-ÞÊ™÷u™’¦Îpò¢)ìÇk§PŸ¢gs¨R0¢¾%M¸4j6iN!J½*E›mL?býŠRM’É,Q‚‘³D(Ll©­ªÚÖ@ŸŠ‚kûkdZ°¹þÔÙ “«X˜ŒÔÎû ®"WŠß¦Yux‘ã~Mg³Øv-¶^‘)Å ±QÌYmÖ ¦UÒyúöòµGµØÊ´§•&Ñd_a2³• ¹ibΠSK.þ¸téÜ.kç-üYqòãÒ)ûf¼6ÙŬ[£¦ÎyÖ[ͺƒõm¶ºqÝÈCÿm9ñ˳Љ«¯>£rññúÿgôW:§•Ýs„x’D%‡à|Ιa{ ""Ü‚¡a`Ë`Ò€öT1ŠVØ}î ×ánô¡×mùiG!ˆõDWŸ~*²'âe->Å܉ hL‡¯ý(ÄawIˆad4†çâb5nbˆöÍØ’ù˜x¡|ðÉxã‘X*ˆä9nhJ>IfP— ¶Á%Ø16Cï iejC*—"a½-éÞp¦É'“Åõ——”(nã—5Òæ% :väZ™ŽZÈètâÉØr|þÇ›–éIɘEl^ç&ìL¢h”vºé3kbÚ¤uëÉ‘šüáùª“WØÜ¨šÖ©]§”êi(u£zöä©tze°‹ÿšZë/¡Ä:–Bb˜•‡JâÚ¦|´Xdš%%É“®án&Úgcfó©’Pb›eT¦š)«#H/¸b>Š/¤å–w.-Tšío^:'ƒÀÎj«¥yŽ‹Â,åzž@«VJ^’ïòZ±²ß¶I0Þå[¦¨nÚ `£UÌÛí{xÞÙêÆ î9ÚËÆm»É»Ù7ÇÄód¼«™<»znöÔo½ KUqÁÛ%Ó(‘gÀ\´'³FEl·–¬šºò–2uÓ’tMȇsjU™51öŽìÂuÚ.Ew—6hÛUËN§÷£¥>Ìà´yÿØcE xá2q+ïÙ†/x„2¹œ-I^pä–»Sí®å4)â^{­ù-žšI¸~¡Ešéªã|ºPék U­»~8QÔήRê+³:îÝÀí¥[û®ðHôNü=˜'ï»îP1ÿšñ<Þ†<ôn­måè·[¯÷ðw7ÎýN?Mˆ·Úá‹¿Waz|¾ø¼˜mvûÅKTUpÕË?Ñ>ú¯¿Nû“º¼þ-å‚£•Q1·ì€ørßfs?Dß“`Ü‘ ž®Ô`HøçÁÈ-¡ƒ!,á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Ä¢‹ÖøÙŒÌ¦ó).”K¨õŠÍ‚IW¡ÔŠÇdë·›”–×ìöó À¶¹ûŽÏoÑòj"¬(88bçH˜¨èöåá8eا¶XiÙYhHuÙé)S%)§‘—&ú™ªŠµ‰¸ú ÛÑX‚Ú{‹KZê±{Л \ºçû+ŒÛë÷;Kqœ]ùìÀ,­ú°nŸ™±¾|Ï­/ ¼íLöï¹rø:$‘°žDϾ=¼h‚¯ÿô"büøZDMy‰RÅ»kýPhL ³K GƼ鲤1xâü9ãå >§=šâŒš—3/C u ³©Beò‹Š•Õ?Ž¡‚34HQˆ'ëÕ³$­-B”ʦ ÕÖi§Ïf½¶+6¥\'öíYêl;j¹Õq[–A-¥u2¶—¸áÈ=%rªßrçKvL²Y[C!!9Mõ+KÏv™Þ½hú¯±µ`š>švÁ̤-7¶š†ÜîG¡éü6Å»°ÚÜ&›*þ£¿è–E+'}ºÂ²'Í>f7QЛ?M¼E†"‹'ŸÜ7v£€…sn_þ=}ü×sOÿæ3[€ —\ö…t M¤4\sõÅ`edX‚¢)F’^;™¦Ù!áÕ6rbFpø±G\~Â7âLUuŒ*†¨.vÜs øÃk>fAIiÆI5Þ~#f8£€VgâFÖW’gÁ9˜]“ÁýgãUIn§ÝŠJrY"?®ýHf„ºÅ%¦þUt&bŒÑ‡!œLJwäyvuRŽ%NGe˜5¶hgŠxú‡œ 6§§thÎóa™ŽR¨ÕkVÈzv餈&wØ–’þ©çöt‡ŒñºiŒ¿Uêàså%êªÞx5_?Uöwé’W²˜*”Úê×r·’7j~UÒ åœÖÿ©J£±‚š˜W<-ê烮Î3Ę`û¥Žâ^¯×¾nÓ𿃲ñ8:e½¯|0t}õVÇž¼õ)3¿:õÝk”è—³-ø7ÉÚ;ßê››å"Èþö¯}üú¨TýöÃsx_‹Q»¿‡€~Ó_ÃÁ½æ•JxDI+LÖÀ2ñ¦€Œš$ XÁÅ탌TÓAÆõ/„®kŒIˆB!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·Ü×ê;LÃݲù ½>ÔV´û ‡_ÙâjüŽÏȈ9ÿpó§7HXÈ 81†ˆeèøiÀˆc×çÄ™©£FçQ 8·9J ƒ rÚÔXÚꊑ*ÙGâúõŠ› »§ªû ,Q Á›H\œœË[Œ¬ü º6+|ñŸÐn|Y«µ>e™É“¤»ê¼=/éer„9õèô^»éÚ?eõ¥ßO~òzêÒljþã9ÑImûy“—¶ü=íæpåöß/ÐËMÔ¿?sK?ŠË^ÛqÂu†qT^äÕÀ€¡ÈnœßWA V΀ôÐ:ºÅ0s`ààO€!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Äb‹Ö°ÕŒÌ¦ó9\&¥ÐªõŠQ§Œ0 ‹ŸÈî¡ÜE×ì¶ð ئ“q¸ûŽÏ‹ìs³Z(øð‡ V¨ 7¸ÈØxÇ÷h€8Y鈙If8¡hè©*uy–@É9…:ÊÚê°êQº°úãj{k†!{Jú‰ ¼›Z×ÛG79ÌÜ|²¬ í<·‹&ýL­=]Ò½ kJHòŽ.nœÃ'ÉK—4‹½šÉ »š<5l¼¹™•=‹rGKÉÀ˜F›Ê8t ZReúœZ`êÏ>ë.à¼úðX¨1KÊ S—"…~­V ÙV6rÆJÚIç¹`ÃÙýeêÐ)kËøåÓ¶Û¸²BR:+®ÂÆIÆÊ¸R¾€…Z.˜8¤M^ž1/F’ïlçGÝò¾Ý·/âÁŸ¦½û2ri.¨3ËuÍùé—UŽ5åâߣ‰ÝÉ<`qÚˆB'k u^.–‹¤RæuEÖçô^~ðó\äˆï¦¾ý½hìšÓßæª;°{ÊÍÛ›ÿ¦¯]Ó…¤Z}¿(‡ŸõÒ˜OŽ” iŠM8CWBGHƒÂæa¬¡µZ4†%§[aöñòSyùù6PÕ]H‹K†â~2–øßŠÑÈUn=†`lBþCÖ`åtŒÒs^†+.×"oñ™(ßHTZÆ ü½X%r¨hÜŠFˆ–#‰æ†>®9Q-M’(Øi!:&–þI×å’P‰ܘlÞ§'â}VÖXLœvr蜟½çËQiNº—™‰Y(?ßÍ h˜\ژ鞅ö™—N^2(–TZánÙ•ÊÞ£ÀiÉÝ^$Ê`srªä]Sæ*˜æ‘ªk|§úê±¢ÿF©ß¥tvê%|ÀëxLj¨Ö×vÂk­$=!·±‡S€s9úY·é’„éŽ:þ9Ÿx_öšË–Gš—Q‘° ›+¥þ¶ÊZ ¾uë¹ÙùV*¶ë¥òª® ˆ«¤†6Üã¢h®¦ÿÊÑÃ?+p¬3*â™iÈû/<Þ}XÛ½–@l«›ÛN좄 û÷ñ›Î÷லÚ|1s9{<(¿xFG•4á…`rÊýèËòËð u GÈÇ\ß3[ KDi#[£ ¶³_I[ÛlÞŠ$ÚR$Öy>]çÜz£bxÖ ¸öÞiÖrÞ÷É-¸QµÄ|µ9‰ƒõ¦´vLùã²ÂñG/´Oš–¹å ažç¢ «éyO‘;Yzêmj.ú䪿žȲkû܈‹[ûÞçÎû³÷®øï£œð±I%¼ñÊsÎüíˇå8ëÒ?ÏÓîkºã<õÂ$öN¹Œu,ÞˆƒºãÓdý—ÙŸËRÇ~õÜk^&…ñ×ÔQ«f5nÜú÷£$øÝ$}ÿ ”’â¿Ú¾PJ¨2Ê” ‚BºRdHA‹ ðÔ *0ØÁ¢€0„ä ñgµªð!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjaAeͺ ‹ÇЮcJ5“×ìv—±‡pòk!Í ÉVž{9?Lñž]n,kÉE†ª—TÉå­Êø°f*¥ý†›§ˆ*åìÌÐ)cÁòÈå’,Ø×M|l6&h‡bsç~a¬>iK}ÀÉ%;0ÝzÏïO /½wà«Î„[\ Žø#oÁEàµZ'žÕØ‚^ š€ÃCþQµ_V>NǘµîÕ:Ìý¹(|9ˆz¥¥Ó]ïã2­.5Ð/D {O¤×Ž» ·ç®ÂŠ‚Äû¿;!|¤]Ž|çÅGŽí‹Ê/Ÿí g ½™_ï^ý=f„}öÆt?øÞßâ:ðã3¿ƒôç{ã{Ï6‡¼>KÉ”ÿ>r'ÇÑñì5‰øø³¢“W±Ksÿ£‰Šªæ¿Ú%’SŠê$Y‚ÖãŸâHÁlHP}Œ 9ØÁèa0„ª! U¦–žp…(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó •Ë ôŠÍjÔ³[³nÇä²ìmV…æ¶ûýD§×l¸ýŽBÔiyþXsÁ§R¨P'¨¸•Há‡p ÉhyYæh¨I)†ù ŠÔ¹ù@Úyªº’zàjèàÉJ[ÁiÀ†»‘Ziû ühª±‹|¼:ZœË‹ül§+¼³ mí&´[}²}í}ç\ÒMù].¨=Î<nÞ^›î/Ÿ!íQ?ÏÚÍþ ŸÿÃ_«I b[GÍ BüreÓ–£á‰¨†Åÿ#”@äðÑBHŽ$VáöðÃÅ’,Ãàò8feË’³IœFh¦N‘¾¾¼ùJ%ÁD×ÕQ¦ÎË-Go}ŠáTÍ9äÉÄ5«4\ =drò§ŠWé©ÃQöZf@£MôÕ•X¥Ój Ö5L¤žL ª7£š}×Våwo_DIe5¶ºxÐa§U×J]ªXÓÊbýÞz¶¯Ô¼?Û#«­Ñ»wåd‹Œê§ìÀ `N[8´çb— .3 ÙóãX†-of¼çå XÀõ ¿=¶2ÛÍÏý‚q ·ŸHb~SMnwrǾ9§† Ø»té™b^²ü÷ðÌî¡Ó-.ú¸äÄ´µ‡ÿÅj_|F^TÄàDUt[mÃÎ>ûQ¶`&ÈSEhéçÓ~A¨v^ss\Öà|È¥gn÷aÖ™ƒÌÅW"qõÉ Cèu£Œíõg_¬í(Š2p XÛ`( d®‡QŠ'Žw‘‡8]‹¾(åv1*å¨až=ò&j´éhaƒâw]}ˆé¤dêÙFàQQ¦IךCE)æ›]VIÝ™ R˜0f×]_†‰(=†þáuºé¢&K&9$’(º™–G7ÖŠWj‡B·õ ›fU zªRd&gf©jz§‰È Zi›bª¥ŒPþ§*­Lî™'‹¹è«sÅ>¹!H7ÿõf @…Cg„ÎxRTv§ †ŠV"¤Nª£ˆœ·‰kˆ”ʪ.}AšK•­«%J/h{Á{ïªãŽsc¨g*7Þ¬™:ºž¶6ÚTðœøîúç$ýúÉžÁ–ŠŠ&©Ú°1ÉÞ»i‘­ [ï?? ©\qáœÀ:·)ÆgJâËÁQ[1yrŠÉØÃ®¾ü\“¯ö¶0Æ'Ïle¸!gå#ÑI9#ɵצ«ó3:ƒŒ ¡k´» Õj ü4Swi°N64/ÕhÙùÎfÕh‡ÙÄk>A;2Ö¿½ã†šõ"®Öé€7>W‹Ø=u"8kqo‚ÔØv'y¶9>Þà‘¯Ce²¼-×ëå$5dy…žïä6 ¡Ž¹¨¿M 8§¯.rçÃN»€â\{í`Ãózîñ4®¬ï¾÷^´ðZŽ{GÆ£¾ûòÎßþ|ôˆKtó³ÏK½NÈS«(ñÙ3¿¢~´‘¦JþLüp’«é ™™{ÿ>^1—ýõ Î7ûáퟸÑè €­á ûHÀæO ÜÈØÀzIìzô+¹/0ƒd@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡Ä¢ ȰՌ̦ó9\.~ôŠÍjYK¤âgÝŠÇä§÷{8#¨å¶ûýV†Ñj¸ýŽÍ“õ´4(è³·6ˆ˜ˆW8ÃøÕWŦ8Iä9 vYéù×Ö)jzúA:ש±Ù…  â¥ZR*‹››Y•vÂjð§;Œ ¼ö`L¬¼ì@›•Ì=¶ MRÝ+ 8ŠŒQÍ{­-®>n~®émÎÞî]îÏ /:Á‹ÏEýb¯ŸÀôô¥¨70!Ápûvù"Ø, Â‰¢º] 'ÑÅÿ” ˈi]0Ž$Õ]jØ ä”c%[6vlH•h\ÚÄäq%F0+ ¼ ÔÚZ=²4j‚fЄgÔ öÔg—ZÅ¹ËØ(IN6³ÃŠØ‘ËÆöBiêU$©OsŠâíÕqN›®zøuƒÜ”n#1k–V¶p±Y¬Õ'°_²cÁùýçèÖáˆkk~c¼Ö±à¬ýªüö‘¥sÍ":X߬C’ý˜óYžª?³Ôú:]âÜ¡ü[vU_(‹Þm8¯oà R~ݳ®ç“ÂHC]-ø¯lÉŸ'1Š;ùñÂZs.çŽ×ûʘá“_Œ­q)äÂ×wçݹøTÚõÙÿV×µ ÷˜¨ŸEä5ƒz>•#Ivy¶ß,Æe÷Ù^Ú'Ûd½½‡•{牶^{”ÉÅ\H(¦É]†DUZBTžjÁ¶gåq|"ZV`@ŠVq*~˜¢­ð¶R™-9^sõhc–qv…д¸]sô¥“d‡Êiž€«É'fpdJ9›“!šébkÌ5õ]he‚y&NJa©e üù wçÝ#†MÖ‰f¶ç„eöö‰?ú¶¥óÉ8iž´Yé©“3±h(f’©(‘Œ†˜æ£àM‰(”ºUJåŠtz¨$¬‰Êªªµj"/MõßEQØCj¬zÿZòä²Ä¶à…Wª *{ÊÒa^ùÍɤTï»÷KËŠ“ØàØH$ß2¤Ü¦%w¨ÀM•A©Í’åÿþSœíõZAV‹GZþÊ£ÐT¿ê¤)ÅFD«zÀËlsr3îÿ߈¯§ëŸB_ë@r©¢|3¢r—DC¤¦WhA|ŠKÛÉepCeöÁPWÛYPvä-¨Y,.þÀ÷ï‹èê›ôøÖi¬Ø°ÏŠðœ^ðä$¿g^£l‡îÜ(¢Tf$•Ùðùë" ÿ)»ë ÖÙ Ò¾a¾C#)Oˆ¢Û‡`fØ{šÆÝà¯Èy4nv~Âc¦k®Á–ÞiÖ`vvÙUˆ‹GX L%)’I»ëÜW3Âv_š7*ß¡f‚½V„å[¡>ëd-i[Å(øÚV"í0Âöô¶✇È84äíº‡†ÿ.Ö’Ä• Ã5ù™…¼pC¨ź2«ørÂsŸQÄò!³u L‚5Y¯á›5@•Fë /Í¿ùØ{Dv!æè8+Éiøê—)oCJ)U;û°2½«å&p”ƒÐÕy£ç]ù€Ø“ˆ¯šÂ–šO¬uSˆÐôSsa­›4F¬H{…U™¯á§0³Ý«š&¼q ¼•λ‘tiiW™ߘ‚ Ðl ‚Òî‘‘ŠnÉûà+`f§ÁÍ‚XoÇæê^m¿àÆŽksH¯ŸGqÇ<$gœˆÔòÙ[Î|`ŠPá'c r,VÛPÝ<éM ½åFòe2çQôèôsˆÚ?Üê½DnfŸ'íôpåýàüÇ õâ4R¯zPؾ€Šžl<ä4 Kì>3OÖÁçew9ƒÈ—àåÛ 0Œ!ö€ §Æ!¯ûˆÂ;nÈj' .·›„úwÿ+dW—OÈîîÊPågDžbó€Êmˆa— ˆ6Eê†ÈåÌOÿÿM:ŸØPIEND®B`‚golly-3.3-src/gui-web/images/faster.png0000644000175000017500000000035212362063145015013 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úoIDATxœb``høçÙ·ÿ@À€ –*À§ˆ°ëÚÔ‡Ö¯_[jY\çÑÓ!YñàÎÇ<¸ó2dƒ´NZ»Ü’¹ukܸ»øþÂüÚlmŽ'gSO˜ÊÍò†yÞUëD•êZóöÃE/iõêÒ»üúüøL,!'>ýæÏéëfe âêNz¯V=²åIðdãü\ÓãïšåO7¿ÜÅyaN¡‰KsËvù­zëh8A Fý /þ(qâ‰+ž$õ$3žx&b¶Q©¤-_çãIàp0AfD‰Ã{+QÅáãiMfH0›†}wòÉ /sBsœá"wÎARñ$3•ê4/ÎEd㓎IÚ~u0À9é œ+w Ÿ8¢Š'I§âZ=ÆYœß6d[Gƒ—f„4M3!w6‚Qâ‰SO¥óᕈöGÈÜ–íÞ¿µ7Î_·)2RG él6JÀ_¿s†…ˆ~oÌ¿/ÇíÍæž?ÝÄü¤¿ìÌ·³|òÕ_$iTÎ]«Å|0Ýý?ïtd¶`ÏîÝì"­H½¶]TäĪ¸Þ©.(ã÷ßöyôøE›V~ù¶qvLoFóöÃE™­Êùå$I[>vŒò¢#ç·enkg³yîœÿÞ ¯rIEND®B`‚golly-3.3-src/gui-web/images/zoomin.png0000644000175000017500000000042412362063145015042 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡ú™IDATxœ´’1 €0 EstWo¢·ptvñ®‘¿Äo”–âðiIû_Ò4¢ªbš·CÛ~Q‘æ&‹Ùî±’†qZ/ƒÉöˆ¿A’ÙYEAÙÞà³ú˜Ý}¢ìU„6²üù?€ª'T7±ä£¯Ì$TÀDúe¬Ý°? á|³|’ø‚d"H1€nûÿÿ ’Ôu„WŒ0IEND®B`‚golly-3.3-src/gui-web/images/step1.png0000644000175000017500000000032112362063145014557 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úVIDATxœbøÿÿ?±øÎ³oÿà$F²æÎ•÷Á˜d`šWxAž0C¨or `ÃDƉ6€"Œ†Á`HH¤@vf‚€>ÿÿʸ”¤V2IEND®B`‚golly-3.3-src/gui-web/images/favicon.ico0000755000175000017500000000706612362063145015156 00000000000000h& ¨Ž( @ÿÿÿÿD3ÿÿ( @€ÿÿÿÿJÿÿ“§k娿j>?ôðÿ#–ìfÐÃ*ÿÿ£™}òX(ÿ:Ÿµœ<ÿÿä]1nñäñBkÚÍòO› †§°”—»£’¯˜ÿ/ÿÿÿA5ûù>ùøåd7ž®”üOš™~÷T"óH"ÿÿBïë3ÿÿ™À§÷KŸœÿÿÿ)ÿ5”«“ñQ"<öôœ³˜£²—˜ƒ;üû˜¢‰ûH•¾§/þþ:ù÷Bòž&ÿÿ•®•3ýüòLæ[/çb5èh<¡´™ž±–‘©‘ž„œµ›ÿÿ=þüoïâiæÚiÛϘª š˜š€šœ˜ †—½¥òG-ÿÿòIöM:ûùóR!òS#<øö>õóAñ야¤šž„’¬”ÿB5ýý4ûû:÷ö@òïž³™œ°–ñH1ÿÿòAüGýNóM<ÿýøS!òP!=÷õóW'=÷óå\0æc6çi=eÑÄ™Á©—Á©¤±–š¡‡ÿI/ÿÿ1þþ3þþ4þýñL;ûú;ø÷;øõ?ù÷=õò@óðAóï@óîAòíBñíCïìnðãjæÙjÛ΃—«˜À¨–½¦—¼¤ž¶œ’¨‘”ª’”®–“¯—ÿ*ÿ4÷LÿÿöLÿÿÿÿÿÿ!ÿÿ#ÿÿ+ÿÿ,ÿÿå\1.ÿÿ0ÿÿ/ÿþçb60þþæc73þýåd83ýý4ýý;ÿÿçj==þû<üû:ø÷;ù÷:øö;øö;÷õ<øõ<÷õ<÷ô<öó=öó?ôñ@óïAòï@òîAòîBóîAñíBñìoðãjåÙŸ„fÐÄgÐá³™“¨“§Ÿµ›‘¨‘“¬”—Áª—»¢•¼¥>Ã&Å&¶~ª~¶Â&ÅŠŠŠŠŠŠŠŠŠŠŠÅ&ÄWŒ‘ D “<°ÇR e”””””””””””e (J†u$l$©=²Ÿm˜«$XqqqqqqqqqqqX$BwdŠy™ ½ºN`ššššššššššš{‹Â#-›È»œZ6,--,k2‹Â; ššoz»œºN`ššššššššššš{‹Â; ššoz»ž´E€///////////€tÂÂ; ššoz¾bvEOQ55555555555QOÐŽ¶Â; ššoz¡¨9¾Ád¿¿¿¿¿¿‡†[¸··¸‚4¯Â; ššoz‰¢T£¢%%%%%%%%¢¡žHHH+<}Â; ššozÂ%¦§¦¦¦¦¦¦¦¦TT|a·¼00p³¯Â; ššozÂ%¦'''''''''§ 9ÉÍ"P"–cÂ; ššozÂ%¦'''''''''¦¢ÏsiSiAÒÂÂ; ššozÂ%¦'''''''''¦¡ÂN`™{‹Â; ššozÂ%¦'''''''''¦%¿V-nCŠÂ; ššozÂ%¦'''''''''¦%¿5/ššq”ŠÂÎ#-)FÂ%¦'''''''''¦%¿5/ššq”ŠŠy™ Š¡¦'''''''''¦%¿5/ššq”Š¿Óg¥Ì¿¢¦'''''''''¦%¿5/ššq”Š´L_O3O• 9£h'''''''''¦%¿5/ššq”Ь4µ¸¸¸9¦¤T¦¦¦¦¦¦¦¦§¦%¿5/ššq”Šª<+HHHž ¡¢%%%%%%%%¢ T¢ˆ5/ššq”Š®4¹0»º0¾À:ÂÂÂÂÂÂÂÄ¿´8¡¿5/ššq”жŽ."^zzzzzzzzzzz^"Ê …5/ššq”Š¿]ti?ooooooooooo?i@ƒž·5/ššq”ŠŠyššššššššššš ½œ‚5/ššq”ŠŠË!,--,j*rœ·-nCŠŠyššššššššššš ½ºN`™{‹† UY YU«—IŸm­UU±MdWÑfG;;;;;;;;;;;Gf’<°K7f1fxƇ\‰Â‰\¿¶¬ª~¶¿\Ä\‡aÿÿÿÿgolly-3.3-src/gui-web/images/undo.png0000644000175000017500000000035312362063145014475 00000000000000‰PNG  IHDRóÿa!tEXtSoftwareGraphicConverter (Intel)w‡ú…IDATxœb`ƒ†ÿ$àLÐðÿÒý/ÿwœyƒãÑ 1¤hÅX1Íø B3 è\yŸ2/iÂXt‘hHZT1X‘†`K$„ Á4‹Ó0 Áež†BÀBá Š ÈžrTê@@š ¦L¸æBÙÿÿï´SE²tÏIEND®B`‚golly-3.3-src/gui-web/images/slower.png0000644000175000017500000000040312362063145015037 00000000000000‰PNG  IHDRóÿa pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úˆIDATxœ¬Ó1€ ÐÝÕ›è-<ƒ3 ›ñƵ†¤”ÿKŒ,¼æJU´Òq«È¤#‘X§¸ç x§8¯¹ @qÙÎ.€9D9D[0rAØŒük@=bÙˆ®À¼i¢-BMDÞ=c-bÏèRÁh¬ÓQFÈÿÿLo¿óÿÿ$”Ð%,¿IEND®B`‚golly-3.3-src/gui-web/images/start.png0000644000175000017500000000056312362063145014670 00000000000000‰PNG  IHDRóÿa!tEXtSoftwareGraphicConverter (Intel)w‡ú IDATxœbhÛßÿß!ÙñÛÑþÿ` 3˜%YügØ#ÿ_;Iï¿`§ødä7@®J Å ù"UˆA¼†b€v§úí™ÆÿfHa„ÃE 'ƒ>QŒeç+ ㉒pƒX°7ì,À0<Œ¢PÃÆù` 7ˆA`N‘œõ¸ aFA@ÉB±ý$—ÿrþË5©±C#È DÌÐD1@`†"Ã4laÏo˜bj1á(æ†ij’Eh¬öÆØ `ÉÄi#†`…@@6€0!1 Ù@ŽF¸ ´NŒSqaÿÿ”¢üÒX¨­IEND®B`‚golly-3.3-src/gui-web/images/menu_down.png0000755000175000017500000000024612362063145015527 00000000000000‰PNG  IHDR b û!tEXtSoftwareGraphicConverter (Intel)w‡ú@IDATxœbhhh` &¦ªaX üO Ú…ä†×ËäF0 I5Œ è†’)¸ %FÑ’‚G ÿÿBÁ€í[wêIEND®B`‚golly-3.3-src/gui-web/images/menu_right.png0000755000175000017500000000024712362063145015676 00000000000000‰PNG  IHDR Ðá.I!tEXtSoftwareGraphicConverter (Intel)w‡úAIDATxœbhhh` Ãÿ€d ÄhÂÐ@HV ø4áÔ€K^ Ø4QÏÚ…Iñ@H1Šb1í5ÿÿkg€ŠKËIEND®B`‚golly-3.3-src/gui-web/images/fit.png0000644000175000017500000000030512362063145014307 00000000000000‰PNG  IHDR‘h6 pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úJIDATxœb``h 14ÜyöH„Ѐl† „8 8LÅ­0íASŠ¢ÙHü\rC‰| Ä:‰dOˆ#-”HBÿÿTd¤ð••–IEND®B`‚golly-3.3-src/gui-web/images/full.png0000644000175000017500000000025712362063145014475 00000000000000‰PNG  IHDR‘h6 pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡ú4IDATxœb``h@Cwž}ƒ#LY25 +Â…¯b”¢h„a°’©†©ÿÿë§Ÿœ]ÅIEND®B`‚golly-3.3-src/gui-web/images/triangle_down.png0000755000175000017500000000030112362063145016360 00000000000000‰PNG  IHDRëŠZ!tEXtSoftwareGraphicConverter (Intel)w‡ú[IDATxœìÒ1 CÑÝãõV*¸Û$ƒƒv­Ÿ§ õƒ±¿»{Ã3·B&±¾6Â7¶Ž®ßŒðÌÂ8ãåG¼dYqt€Å G¬ˆN¶÷þöÿÿM¨Z±fé„;IEND®B`‚golly-3.3-src/gui-web/webcalls.cpp0000644000175000017500000005535713145740437014101 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include // for std::vector #include // for std::string #include // for std::list #include // for std::set #include // for std::count #include "util.h" // for linereader #include "utils.h" // for Warning, etc #include "algos.h" // for InitAlgorithms #include "prefs.h" // for GetPrefs, SavePrefs, userdir, etc #include "layer.h" // for AddLayer, ResizeLayers, currlayer #include "control.h" // for SetMinimumStepExponent, etc #include "file.h" // for NewPattern, OpenFile, LoadRule, etc #include "view.h" // for widescreen, fullscreen, TouchBegan, etc #include "status.h" // for UpdateStatusLines, ClearMessage, etc #include "undo.h" // for ClearUndoRedo #include "webcalls.h" #include // for EM_ASM // ----------------------------------------------------------------------------- // the following JavaScript functions are implemented in jslib.js: extern "C" { extern void jsAlert(const char* msg); extern bool jsConfirm(const char* query); extern void jsSetBackgroundColor(const char* id, const char* color); extern void jsSetStatus(const char* line1, const char* line2, const char* line3); extern void jsSetMode(int index); extern void jsSetState(int state, int numstates); extern void jsSetClipboard(const char* text); extern const char* jsGetClipboard(); extern void jsEnableButton(const char* id, bool enable); extern void jsEnableImgButton(const char* id, bool enable); extern void jsSetInnerHTML(const char* id, const char* text); extern void jsSetCheckBox(const char* id, bool flag); extern void jsMoveToAnchor(const char* anchor); extern void jsSetScrollTop(const char* id, int pos); extern int jsGetScrollTop(const char* id); extern bool jsElementIsVisible(const char* id); extern void jsDownloadFile(const char* url, const char* filepath); extern void jsBeep(); extern void jsDeleteFile(const char* filepath); extern bool jsMoveFile(const char* inpath, const char* outpath); extern void jsBeginProgress(const char* title); extern bool jsAbortProgress(int percentage); extern void jsEndProgress(); extern void jsCancelProgress(); extern void jsStoreRule(const char* rulepath); extern const char* jsGetSaveName(const char* currname); extern void jsSaveFile(const char* filename); } // ----------------------------------------------------------------------------- bool refresh_pattern = false; void UpdatePattern() { refresh_pattern = true; // DoFrame in main.cpp will call DrawPattern and reset refresh_pattern to false } // ----------------------------------------------------------------------------- static int curralgo = -1; void UpdateStatus() { if (fullscreen) return; UpdateStatusLines(); // sets status1, status2, status3 // clear text area first //!!!??? EM_ASM( document.getElementById('statusbar').value = '\0'; ); if (curralgo != currlayer->algtype) { // algo has changed so change background color of status bar curralgo = currlayer->algtype; int r = algoinfo[curralgo]->statusrgb.r; int g = algoinfo[curralgo]->statusrgb.g; int b = algoinfo[curralgo]->statusrgb.b; char rgb[32]; sprintf(rgb, "rgb(%d,%d,%d)", r, g, b); jsSetBackgroundColor("statusbar", rgb); } jsSetStatus(status1.c_str(), status2.c_str(), status3.c_str()); } // ----------------------------------------------------------------------------- static bool paused = false; // generating has been temporarily stopped? void PauseGenerating() { if (generating) { StopGenerating(); // generating is now false paused = true; } } // ----------------------------------------------------------------------------- void ResumeGenerating() { if (paused) { StartGenerating(); // generating is probably true (false if pattern is empty) paused = false; } } // ----------------------------------------------------------------------------- std::string GetRuleName(const std::string& rule) { std::string result = ""; // not yet implemented!!! // (Set Rule dialog would need to let users create/delete named rules // and save them in GollyPrefs) return result; } // ----------------------------------------------------------------------------- void UpdateButtons() { if (fullscreen) return; jsEnableImgButton("reset", currlayer->algo->getGeneration() > currlayer->startgen); jsEnableImgButton("undo", currlayer->undoredo->CanUndo()); jsEnableImgButton("redo", currlayer->undoredo->CanRedo()); jsEnableImgButton("info", currlayer->currname != "untitled"); } // ----------------------------------------------------------------------------- void UpdateEditBar() { if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { // this can happen after an algo/rule change currlayer->drawingstate = 1; } if (fullscreen) return; UpdateButtons(); // show current cursor mode jsSetMode(currlayer->touchmode); // show current drawing state and update number of options if necessary jsSetState(currlayer->drawingstate, currlayer->algo->NumCellStates()); // update check boxes jsSetCheckBox("toggle_icons", showicons); jsSetCheckBox("toggle_autofit", currlayer->autofit); } // ----------------------------------------------------------------------------- static int progresscount = 0; // if > 0 then BeginProgress has been called void BeginProgress(const char* title) { if (progresscount == 0) { jsBeginProgress(title); } progresscount++; // handles nested calls } // ----------------------------------------------------------------------------- bool AbortProgress(double fraction_done, const char* message) { if (progresscount <= 0) Fatal("Bug detected in AbortProgress!"); // don't use message (empty string) return jsAbortProgress(int(fraction_done*100)); } // ----------------------------------------------------------------------------- void EndProgress() { if (progresscount <= 0) Fatal("Bug detected in EndProgress!"); progresscount--; if (progresscount == 0) { jsEndProgress(); } } // ----------------------------------------------------------------------------- extern "C" { void CancelProgress() { // called if user hits Cancel button in progress dialog jsCancelProgress(); } } // extern "C" // ----------------------------------------------------------------------------- void ShowTextFile(const char* filepath) { // check if path ends with .gz or .zip if (EndsWith(filepath,".gz") || EndsWith(filepath,".zip")) { Warning("Compressed file cannot be displayed."); return; } // get contents of given text file and wrap in
...
std::string contents = "
";
    FILE* textfile = fopen(filepath, "r");
    if (textfile) {
        // read entire file into contents
        const int MAXLINELEN = 4095;
        char linebuf[MAXLINELEN + 1];
        linereader reader(textfile);
        while (true) {
            if (reader.fgets(linebuf, MAXLINELEN) == 0) break;
            contents += linebuf;
            contents += "\n";
        }
        reader.close();
        // fclose(textfile) has been called
    } else {
        contents += "Failed to open text file!\n";
        contents += filepath;
    }
    
    // update the contents of the info dialog
    contents += "
"; jsSetInnerHTML("info_text", contents.c_str()); // display the info dialog EM_ASM( document.getElementById('info_overlay').style.visibility = 'visible'; ); } // ----------------------------------------------------------------------------- extern "C" { void CloseInfo() { // close the info dialog EM_ASM( document.getElementById('info_overlay').style.visibility = 'hidden'; ); } } // extern "C" // ----------------------------------------------------------------------------- static const char* contents_page = "/Help/index.html"; static std::string currpage = contents_page; static std::vector page_history; static std::vector page_scroll; static unsigned int page_index = 0; static bool shifting_history = false; // in HelpBack or HelpNext? // ----------------------------------------------------------------------------- static bool CanGoBack() { return page_index > 0; } // ----------------------------------------------------------------------------- static bool CanGoNext() { return page_history.size() > 1 && page_index < (page_history.size() - 1); } // ----------------------------------------------------------------------------- static void UpdateHelpButtons() { jsEnableButton("help_back", CanGoBack()); jsEnableButton("help_next", CanGoNext()); jsEnableButton("help_contents", currpage != contents_page); } // ----------------------------------------------------------------------------- static void DisplayHelpDialog() { // display the help dialog and start listening for clicks on links EM_ASM( var helpdlg = document.getElementById('help_overlay'); if (helpdlg.style.visibility != 'visible') { helpdlg.style.visibility = 'visible'; // note that on_help_click is implemented in shell.html so CloseHelp can remove it window.addEventListener('click', on_help_click, false); } ); } // ----------------------------------------------------------------------------- void ShowHelp(const char* filepath) { if (filepath[0] == 0) { // this only happens if user hits 'h' key or clicks '?' button if (page_history.size() > 0) { // just need to show the help dialog DisplayHelpDialog(); return; } // else this is very 1st call and currpage = contents_page } else { currpage = filepath; } // if anchor present then strip it off (and call jsMoveToAnchor below) std::string anchor = ""; size_t hashpos = currpage.rfind('#'); if (hashpos != std::string::npos) { anchor = currpage.substr(hashpos+1); currpage = currpage.substr(0, hashpos); } if (!shifting_history) { // user didn't hit back/next button bool help_visible = jsElementIsVisible("help_overlay"); if (!help_visible && page_history.size() > 0 && currpage == page_history[page_index]) { // same page requested so just need to show the help dialog DisplayHelpDialog(); return; } if (help_visible) { // remember scroll position of current page page_scroll[page_index] = jsGetScrollTop("help_text"); // remove any following pages while (CanGoNext()) { page_history.pop_back(); page_scroll.pop_back(); } } page_history.push_back(currpage); page_scroll.push_back(0); page_index = page_history.size() - 1; } // get contents of currpage std::string contents; FILE* helpfile = fopen(currpage.c_str(), "r"); if (helpfile) { // read entire file into contents const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(helpfile); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); // fclose(helpfile) has been called } else { contents += "

Failed to open help file!
"; contents += currpage; } // update the contents of the help dialog jsSetInnerHTML("help_text", contents.c_str()); // if contents has 'body bgcolor="..."' then use that color, otherwise use white std::string bgcolor = "#FFF"; size_t startpos = contents.find("body bgcolor=\""); if (startpos != std::string::npos) { startpos += 14; size_t len = 0; while (contents[startpos+len] != '"' && len < 16) len++; // allow for "rgb(255,255,255)" bgcolor = contents.substr(startpos, len); } jsSetBackgroundColor("help_text", bgcolor.c_str()); UpdateHelpButtons(); DisplayHelpDialog(); if (anchor.length() > 0) { jsMoveToAnchor(anchor.c_str()); } else { jsSetScrollTop("help_text", page_scroll[page_index]); } } // ----------------------------------------------------------------------------- extern "C" { void HelpBack() { if (CanGoBack()) { // remember scroll position of current page and go to previous page page_scroll[page_index] = jsGetScrollTop("help_text"); page_index--; shifting_history = true; ShowHelp(page_history[page_index].c_str()); shifting_history = false; } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void HelpNext() { if (CanGoNext()) { // remember scroll position of current page and go to next page page_scroll[page_index] = jsGetScrollTop("help_text"); page_index++; shifting_history = true; ShowHelp(page_history[page_index].c_str()); shifting_history = false; } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void HelpContents() { // probably best to clear history page_history.clear(); page_scroll.clear(); page_index = 0; ShowHelp(contents_page); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void CloseHelp() { if (jsElementIsVisible("help_overlay")) { // remember scroll position of current page for later use page_scroll[page_index] = jsGetScrollTop("help_text"); // close the help dialog and remove the click event handler EM_ASM( document.getElementById('help_overlay').style.visibility = 'hidden'; window.removeEventListener('click', on_help_click, false); ); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { int DoHelpClick(const char* href) { // look for special prefixes used by Golly and return 1 to prevent browser handling link std::string link = href; if (link.find("open:") == 0) { // open specified file std::string path = link.substr(5); FixURLPath(path); OpenFile(path.c_str()); // OpenFile will close help dialog if necessary (might not if .zip file) return 1; } if (link.find("rule:") == 0) { // switch to specified rule std::string newrule = link.substr(5); SwitchToPatternTab(); // calls CloseHelp ChangeRule(newrule); return 1; } if (link.find("lexpatt:") == 0) { // user clicked on pattern in Life Lexicon std::string pattern = link.substr(8); std::replace(pattern.begin(), pattern.end(), '$', '\n'); LoadLexiconPattern(pattern); // SwitchToPatternTab will call CloseHelp return 1; } if (link.find("edit:") == 0) { std::string path = link.substr(5); // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { fullpath = userdir + fullpath; } ShowTextFile(fullpath.c_str()); return 1; } if (link.find("get:") == 0) { std::string geturl = link.substr(4); // download file specifed in link (possibly relative to a previous full url) GetURL(geturl, currpage); return 1; } if (link.find("unzip:") == 0) { std::string zippath = link.substr(6); FixURLPath(zippath); std::string entry = zippath.substr(zippath.rfind(':') + 1); zippath = zippath.substr(0, zippath.rfind(':')); UnzipFile(zippath, entry); return 1; } // if link doesn't contain ':' then assume it's relative to currpage if (link.find(':') == std::string::npos) { // if link starts with '#' then move to that anchor on current page if (link[0] == '#') { std::string newpage = currpage + link; ShowHelp(newpage.c_str()); return 1; } std::string newpage = currpage.substr(0, currpage.rfind('/')+1) + link; ShowHelp(newpage.c_str()); return 1; } // let browser handle this link return 0; } } // extern "C" // ----------------------------------------------------------------------------- void SwitchToPatternTab() { CloseHelp(); } // ----------------------------------------------------------------------------- void WebWarning(const char* msg) { jsAlert(msg); } // ----------------------------------------------------------------------------- void WebFatal(const char* msg) { jsAlert(msg); exit(1); // no need to do anything else??? } // ----------------------------------------------------------------------------- bool WebYesNo(const char* query) { return jsConfirm(query); } // ----------------------------------------------------------------------------- void WebBeep() { jsBeep(); } // ----------------------------------------------------------------------------- void WebRemoveFile(const std::string& filepath) { jsDeleteFile(filepath.c_str()); } // ----------------------------------------------------------------------------- bool WebMoveFile(const std::string& inpath, const std::string& outpath) { return jsMoveFile(inpath.c_str(), outpath.c_str()); } // ----------------------------------------------------------------------------- void WebFixURLPath(std::string& path) { // no need to do anything } // ----------------------------------------------------------------------------- bool WebCopyTextToClipboard(const char* text) { jsSetClipboard(text); return true; } // ----------------------------------------------------------------------------- bool WebGetTextFromClipboard(std::string& text) { text = jsGetClipboard(); if (text.length() == 0) { ErrorMessage("There is no text in the clipboard."); return false; } else { return true; } } // ----------------------------------------------------------------------------- bool PatternSaved(std::string& filename) { // append default extension if not supplied size_t dotpos = filename.find('.'); if (dotpos == std::string::npos) { if (currlayer->algo->hyperCapable()) { // macrocell format is best for hash-based algos filename += ".mc"; } else { filename += ".rle"; } } else { // check that the supplied extension is valid if (currlayer->algo->hyperCapable()) { if (!EndsWith(filename,".mc") && !EndsWith(filename,".mc.gz") && !EndsWith(filename,".rle") && !EndsWith(filename,".rle.gz")) { Warning("File extension must be .mc or .mc.gz or .rle or .rle.gz."); return false; } } else { if (!EndsWith(filename,".rle") && !EndsWith(filename,".rle.gz")) { Warning("File extension must be .rle or .rle.gz."); return false; } } } pattern_format format = XRLE_format; if (EndsWith(filename,".mc") || EndsWith(filename,".mc.gz")) format = MC_format; output_compression compression = no_compression; if (EndsWith(filename,".gz")) compression = gzip_compression; return SavePattern(filename, format, compression); } // ----------------------------------------------------------------------------- bool WebSaveChanges() { std::string query = "Save your changes?"; if (numlayers > 1) { // make it clear which layer we're asking about query = "Save your changes to this layer: \"", query += currlayer->currname; query += "\"?"; } if (jsConfirm(query.c_str())) { // prompt user for name of file in which to save pattern // (must be a blocking dialog so we can't use our custom save dialog) std::string filename = jsGetSaveName(currlayer->currname.c_str()); // filename is empty if user hit Cancel, so don't continue if (filename.length() == 0) return false; if (PatternSaved(filename)) { ClearMessage(); // filename successfully created (in virtual file system), // so download it to user's computer and continue jsSaveFile(filename.c_str()); return true; } else { return false; // don't continue } } else { // user hit Cancel so don't save changes (but continue) return true; } } // ----------------------------------------------------------------------------- bool WebDownloadFile(const std::string& url, const std::string& filepath) { // jsDownloadFile does an asynchronous file transfer and will call FileCreated() // only if filepath is successfully created jsDownloadFile(url.c_str(), filepath.c_str()); // we must return false so GetURL won't proceed beyond the DownloadFile call return false; } // ----------------------------------------------------------------------------- extern "C" { void FileCreated(const char* filepath) { // following code matches that in gui-common/file.cpp after DownloadFile // returns false in GetURL std::string filename = GetBaseName(filepath); if (IsHTMLFile(filename)) { ShowHelp(filepath); } else if (IsRuleFile(filename)) { // load corresponding rule SwitchToPatternTab(); LoadRule(filename.substr(0, filename.rfind('.'))); // ensure the .rule file persists beyond the current session CopyRuleToLocalStorage(filepath); } else if (IsTextFile(filename)) { ShowTextFile(filepath); } else if (IsScriptFile(filename)) { Warning("This version of Golly cannot run scripts."); } else { // assume it's a pattern/zip file, so open it OpenFile(filepath); } } } // extern "C" // ----------------------------------------------------------------------------- void CopyRuleToLocalStorage(const char* rulepath) { jsStoreRule(rulepath); } // ----------------------------------------------------------------------------- void WebCheckEvents() { // event_checker is > 0 in here (see gui-common/utils.cpp) // it looks like JavaScript doesn't have any access to the browser's event queue // so we can't do anything here???!!! we'll need to use a Web Worker???!!! // note that glfwPollEvents() does nothing (see emscripten/src/library_glfw.js) // glfwPollEvents(); } golly-3.3-src/gui-web/patterns.py0000644000175000017500000000110612362063145013764 00000000000000# Enumerate the Patterns folder in a format suitable to paste into shell.html. import os from os.path import join, isfile def walkdir(dir): for item in os.listdir(dir): fullpath = join(dir, item) if isfile(fullpath): if item.startswith("."): # ignore hidden files (like .DS_Store on Mac) pass else: print "addfile(\"" + fullpath[2:] + "\");" else: print "dirStart(\"" + item + "\");" walkdir(fullpath) print "dirEnd();" walkdir("../Patterns") golly-3.3-src/gui-web/webcalls.h0000644000175000017500000000606313145740437013534 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _WEBCALLS_H_ #define _WEBCALLS_H_ #include // for std::string // Web-specific routines (called mainly from gui-common code): extern bool refresh_pattern; // DoFrame in main.cpp should call DrawPattern? void UpdatePattern(); // Redraw the current pattern (actually just sets refresh_pattern to true). void UpdateStatus(); // Redraw the status bar info. void PauseGenerating(); // If pattern is generating then temporarily pause. void ResumeGenerating(); // Resume generating pattern if it was paused. std::string GetRuleName(const std::string& rule); // Return name of given rule (empty string if rule is unnamed). void UpdateButtons(); // Some buttons might need to be enabled/disabled. void UpdateEditBar(); // Update buttons, show current drawing state and cursor mode. void BeginProgress(const char* title); bool AbortProgress(double fraction_done, const char* message); void EndProgress(); // These calls display a progress bar while a lengthy task is carried out. void SwitchToPatternTab(); // Switch to main screen for displaying/editing/generating patterns. void ShowTextFile(const char* filepath); // Display contents of given text file in a modal view. void ShowHelp(const char* filepath); // Display given HTML file in Help screen. void WebWarning(const char* msg); // Beep and display message in a modal dialog. bool WebYesNo(const char* msg); // Similar to Warning, but there are 2 buttons: Yes and No. // Returns true if Yes button is hit. void WebFatal(const char* msg); // Beep, display message in a modal dialog, then exit app. void WebBeep(); // Play beep sound, depending on allowbeep setting. void WebRemoveFile(const std::string& filepath); // Delete given file. bool WebMoveFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully moved to output file. // If the output file existed it is replaced. void WebFixURLPath(std::string& path); // Replace "%..." with suitable chars for a file path (eg. %20 is changed to space). bool WebCopyTextToClipboard(const char* text); // Copy given text to the clipboard. bool WebGetTextFromClipboard(std::string& text); // Get text from the clipboard. bool PatternSaved(std::string& filename); // Return true if current pattern is saved in virtual file system using given // filename (which will have default extension appended if none supplied). bool WebSaveChanges(); // Show a modal dialog that lets user save their changes. // Return true if it's ok to continue. bool WebDownloadFile(const std::string& url, const std::string& filepath); // Download given url and create given file. void WebCheckEvents(); // Run main UI thread for a short time so app remains responsive while doing a // lengthy computation. Note that event_checker is > 0 while in this routine. void CopyRuleToLocalStorage(const char* rulepath); // Copy contents of given .rule file to HTML5's localStorage (using rulepath as // the key) so that the file can be re-created in the next webGolly session. #endif golly-3.3-src/gui-web/main.cpp0000755000175000017500000020044713543255652013226 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. // gollybase #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "generationsalgo.h" #include "ltlalgo.h" #include "jvnalgo.h" #include "ruleloaderalgo.h" // gui-common #include "algos.h" // for InitAlgorithms, NumAlgos, etc #include "prefs.h" // for GetPrefs, MAX_MAG, tempdir, etc #include "layer.h" // for ResizeLayers, currlayer #include "control.h" // for SetMinimumStepExponent, NextGeneration, etc #include "file.h" // for NewPattern #include "view.h" // for fullscreen, TouchBegan, etc #include "status.h" // for SetMessage, CheckMouseLocation, etc #include "utils.h" // for Beep, etc #include "undo.h" // for currlayer->undoredo->... #include "render.h" // for InitOGLES2, DrawPattern #include "webcalls.h" // for refresh_pattern, UpdateStatus, PatternSaved, etc #include #include #include #include // ----------------------------------------------------------------------------- // the following JavaScript functions are implemented in jslib.js: extern "C" { extern void jsSetMode(int index); extern const char* jsSetRule(const char* oldrule); extern void jsShowMenu(const char* id, int x, int y); extern int jsTextAreaIsActive(); extern int jsElementIsVisible(const char* id); extern void jsEnableImgButton(const char* id, bool enable); extern void jsTickMenuItem(const char* id, bool tick); extern void jsSetInputValue(const char* id, int num); extern int jsGetInputValue(const char* id); extern void jsSetCheckBox(const char* id, bool flag); extern bool jsGetCheckBox(const char* id); extern void jsSetInnerHTML(const char* id, const char* text); extern void jsShowSaveDialog(const char* filename, const char* extensions); extern void jsSaveFile(const char* filename); } // ----------------------------------------------------------------------------- static int currwd, currht; // current size of viewport (in pixels) static double last_time; // time when NextGeneration was last called static bool alt_down = false; // alt/option key is currently pressed? static bool ctrl_down = false; // ctrl key is currently pressed? static bool shift_down = false; // shift key is currently pressed? static bool meta_down = false; // cmd/start/menu key is currently pressed? static bool ok_to_check_mouse = false; // ok to call glfwGetMousePos? static bool mouse_down = false; // is mouse button down? static bool over_canvas = false; // is mouse over canvas? static bool over_paste = false; // is mouse over paste image? static bool paste_menu_visible = false; static bool selection_menu_visible = false; // ----------------------------------------------------------------------------- static void InitPaths() { userdir = ""; // webGolly doesn't use this // webGolly doesn't use savedir (jsSaveFile will download saved files to the user's computer // in a directory specified by the browser) savedir = ""; // webGolly doesn't need to set downloaddir (browser will cache downloaded files) downloaddir = ""; // create a directory for user's rules EM_ASM( FS.mkdir('/LocalRules'); ); userrules = "/LocalRules/"; // WARNING: GetLocalPrefs() assumes this string // !!! we'll need to provide a way for users to delete .rule files in localStorage // to avoid exceeding the localStorage disk quota (implement special "DELETE" links // in Set Rule dialog, like we do in iGolly and aGolly) // supplied patterns, rules, help are stored in golly.data via --preload-file option in Makefile supplieddir = "/"; patternsdir = supplieddir + "Patterns/"; rulesdir = supplieddir + "Rules/"; helpdir = supplieddir + "Help/"; // create a directory for all our temporary files (can't use /tmp as it already exists!) EM_ASM( FS.mkdir('/gollytmp'); ); tempdir = "/gollytmp/"; clipfile = tempdir + "golly_clipboard"; // WARNING: GetLocalPrefs() and SaveLocalPrefs() assume the user's preferences are // temporarily stored in a file with this name prefsfile = "GollyPrefs"; } // ----------------------------------------------------------------------------- static void GetLocalPrefs() { EM_ASM( // get GollyPrefs string from local storage (key name must match setItem call) var contents = localStorage.getItem('GollyPrefs'); if (contents) { // write contents to virtual file system so GetPrefs() can read it // and initialize various global settings FS.writeFile('GollyPrefs', contents, {encoding:'utf8'}); } ); GetPrefs(); // read prefsfile from virtual file system EM_ASM( // re-create any .rule files that were saved in localStorage for (var i=0; idirty && asktosave); } } // extern "C" // ----------------------------------------------------------------------------- static void InitEventHandlers() { EM_ASM( // the following code fixes bugs in emscripten/src/library_glfw.js: // - onMouseWheel fails to use wheelDelta // - the onmousewheel handler is assigned to the entire window rather than just the canvas var wheelpos = 0; function on_mouse_wheel(event) { // Firefox sets event.detail, other browsers set event.wheelDelta with opposite sign, // so set delta to a value between -1 and 1 var delta = Math.max(-1, Math.min(1, (event.detail || -event.wheelDelta))); wheelpos += delta; _OnMouseWheel(wheelpos); return false; }; // for Firefox: Module['canvas'].addEventListener('DOMMouseScroll', on_mouse_wheel, false); // for Chrome, Safari, etc: Module['canvas'].onmousewheel = on_mouse_wheel; ); EM_ASM( // we do our own keyboard event handling because glfw's onKeyChanged always calls // event.preventDefault() so browser shortcuts like ctrl-Q/X/C/V don't work and // text can't be typed into our clipboard textarea function on_key_changed(event, status) { var key = event.keyCode; // DEBUG: Module.printErr('keycode='+key+' status='+status); // DEBUG: Module.printErr('activeElement='+document.activeElement.tagName); var prevent = _OnKeyChanged(key, status); // we allow default handler in these 2 cases: // 1. if ctrl/meta key is down (allows cmd/ctrl-Q/X/C/V/A/etc to work) // 2. if a textarea is active (document.activeElement.tagName == 'TEXTAREA') // on Firefox it seems we NEED to call preventDefault to stop cursor disappearing, // but on Safari/Chrome if we call it then cursor disappears (and arrow keys ALWAYS // cause disappearance regardless of whether we call it or not)... sheesh!!! if (prevent) { event.preventDefault(); return false; } }; function on_key_down(event) { on_key_changed(event, 1); // GLFW_PRESS }; function on_key_up(event) { on_key_changed(event, 0); // GLFW_RELEASE }; window.addEventListener('keydown', on_key_down, false); window.addEventListener('keyup', on_key_up, false); ); EM_ASM( // detect exit from full screen mode document.addEventListener('fullscreenchange', function() { if (!document.fullscreenElement) _ExitFullScreen(); }, false); document.addEventListener('msfullscreenchange', function() { if (!document.msFullscreenElement) _ExitFullScreen(); }, false); document.addEventListener('mozfullscreenchange', function() { if (!document.mozFullScreen) _ExitFullScreen(); }, false); document.addEventListener('webkitfullscreenchange', function() { if (!document.webkitIsFullScreen) _ExitFullScreen(); }, false); ); EM_ASM( // give user the option to save any changes window.onbeforeunload = function() { if (_UnsavedChanges()) return 'You have unsaved changes.'; }; // save current settings when window is unloaded window.addEventListener('unload', function() { _SaveLocalPrefs(); }); ); } // ----------------------------------------------------------------------------- static int InitGL() { if (glfwInit() != GL_TRUE) { Warning("glfwInit failed!"); return GL_FALSE; } InitEventHandlers(); // initial size doesn't matter -- ResizeCanvas will soon change it if (glfwOpenWindow(100, 100, 8, 8, 8, 8, 0, 0, GLFW_WINDOW) != GL_TRUE) { Warning("glfwOpenWindow failed!"); return GL_FALSE; } glfwSetWindowTitle("Golly"); if (!InitOGLES2()) { Warning("InitOGLES2 failed!"); return GL_FALSE; } // we only do 2D drawing glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_STENCIL_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(1.0, 1.0, 1.0, 1.0); last_time = glfwGetTime(); return GL_TRUE; } // ----------------------------------------------------------------------------- // many of the following routines are declared as C functions to avoid // C++ name mangling and make it easy to call them from JavaScript code // (the routine names, along with a leading underscore, must be listed in // -s EXPORTED_FUNCTIONS in Makefile) extern "C" { void ResizeCanvas() { // resize canvas based on current window dimensions and fullscreen flag if (fullscreen) { EM_ASM( var wd = window.innerWidth; var ht = window.innerHeight; var canvas = Module['canvas']; canvas.style.top = '0px'; canvas.style.left = '0px'; canvas.style.width = wd + 'px'; canvas.style.height = ht + 'px'; canvas.width = wd; canvas.height = ht; _SetViewport(wd, ht); // call C routine (see below) ); } else { EM_ASM( var trect = document.getElementById('toolbar').getBoundingClientRect(); // place canvas immediately under toolbar var top = trect.top + trect.height; var left = trect.left; var wd = window.innerWidth - left - 10; var ht = window.innerHeight - top - 10; if (wd < 0) wd = 0; if (ht < 0) ht = 0; var canvas = Module['canvas']; canvas.style.top = top + 'px'; canvas.style.left = left + 'px'; canvas.style.width = wd + 'px'; canvas.style.height = ht + 'px'; canvas.width = wd; canvas.height = ht; _SetViewport(wd, ht); // call C routine (see below) ); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void SetViewport(int width, int height) { // do NOT call glfwSetWindowSize as it cancels full screen mode // glfwSetWindowSize(width, height); // ResizeCanvas has changed canvas size so we need to change OpenGL's viewport size glViewport(0, 0, width, height); currwd = width; currht = height; if (currwd != currlayer->view->getwidth() || currht != currlayer->view->getheight()) { // also change size of Golly's viewport ResizeLayers(currwd, currht); // to avoid seeing lots of black, draw now rather than call UpdatePattern DrawPattern(currindex); } } } // extern "C" // ----------------------------------------------------------------------------- static void InitClipboard() { // initialize clipboard data to a simple RLE pattern EM_ASM( document.getElementById('cliptext').value = '# To open the following RLE pattern,\n'+ '# select File > Open Clipboard.\n' + '# Or to paste in the pattern, click on\n'+ '# the Paste button, drag the floating\n' + '# image to the desired location, then\n' + '# right-click on the image.\n' + 'x = 9, y = 5, rule = B3/S23\n' + '$bo3b3o$b3o2bo$2bo!'; ); } // ----------------------------------------------------------------------------- static void UpdateCursorImage() { // note that the 2 numbers after the cursor url are the x and y offsets of the // cursor's hotspot relative to the top left corner if (over_paste) { // user can drag paste image so show hand cursor EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_move.png) 7 7, auto'; ); return; } if (!currlayer) return; // in case this routine is called very early if (currlayer->touchmode == drawmode) { EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_draw.png) 4 15, auto'; ); } else if (currlayer->touchmode == pickmode) { EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_pick.png) 0 15, auto'; ); } else if (currlayer->touchmode == selectmode) { EM_ASM( Module['canvas'].style.cursor = 'crosshair'; ); // all browsers support this??? } else if (currlayer->touchmode == movemode) { EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_move.png) 7 7, auto'; ); } else if (currlayer->touchmode == zoominmode) { EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_zoomin.png) 6 6, auto'; ); } else if (currlayer->touchmode == zoomoutmode) { EM_ASM( Module['canvas'].style.cursor = 'url(images/cursor_zoomout.png) 6 6, auto'; ); } else { Warning("Bug detected in UpdateCursorImage!"); } } // ----------------------------------------------------------------------------- static void CheckCursor(int x, int y) { if (mouse_down) { // don't check for cursor change if mouse button is pressed // (eg. we don't want cursor to change if user drags pencil/crosshair // cursor over the paste image) } else if (waitingforpaste && PointInPasteImage(x, y) && !over_paste) { // change cursor to hand to indicate that paste image can be dragged over_paste = true; UpdateCursorImage(); } else if (over_paste && (!waitingforpaste || !PointInPasteImage(x, y))) { // change cursor from hand to match currlayer->touchmode over_paste = false; UpdateCursorImage(); } } // ----------------------------------------------------------------------------- static void StopIfGenerating() { if (generating) { StopGenerating(); // generating flag is now false so change button image EM_ASM( document.getElementById('imgstartStop').src = 'images/start.png'; ); } } // ----------------------------------------------------------------------------- extern "C" { void NewUniverse() { // undo/redo history is about to be cleared so no point calling RememberGenFinish // if we're generating a (possibly large) pattern bool saveundo = allowundo; allowundo = false; StopIfGenerating(); allowundo = saveundo; if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_NewUniverse()', 10); ); return; } NewPattern(); UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- static void Open() { StopIfGenerating(); // display the open file dialog and start listening for change to selected file // (the on_file_change function is in shell.html) EM_ASM( document.getElementById('open_overlay').style.visibility = 'visible'; document.getElementById('upload_file').addEventListener('change', on_file_change, false); ); } // ----------------------------------------------------------------------------- extern "C" { void CancelOpen() { // close the open file dialog and remove the change event handler EM_ASM( document.getElementById('open_overlay').style.visibility = 'hidden'; document.getElementById('upload_file').removeEventListener('change', on_file_change, false); ); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void OpenClipboard() { StopIfGenerating(); if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_OpenClipboard()', 10); ); return; } // if clipboard text starts with "@RULE rulename" then install rulename.rule and switch to that rule if (ClipboardContainsRule()) return; // load and view pattern data stored in clipboard std::string data; if (GetTextFromClipboard(data)) { // copy clipboard data to tempstart so we can handle all formats supported by readpattern FILE* outfile = fopen(currlayer->tempstart.c_str(), "w"); if (outfile) { if (fputs(data.c_str(), outfile) == EOF) { ErrorMessage("Could not write clipboard text to tempstart file!"); fclose(outfile); return; } } else { ErrorMessage("Could not open tempstart file for writing!"); fclose(outfile); return; } fclose(outfile); LoadPattern(currlayer->tempstart.c_str(), "clipboard"); } } } // extern "C" // ----------------------------------------------------------------------------- static void Save() { StopIfGenerating(); // display the save pattern dialog if (currlayer->algo->hyperCapable()) { jsShowSaveDialog(currlayer->currname.c_str(), ".mc (default), .mc.gz, .rle, .rle.gz"); } else { jsShowSaveDialog(currlayer->currname.c_str(), ".rle (default), .rle.gz"); } } // ----------------------------------------------------------------------------- extern "C" { void CancelSave() { // close the save pattern dialog EM_ASM( document.getElementById('save_overlay').style.visibility = 'hidden'; ); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void SaveFile(const char* filename) { std::string fname = filename; // PatternSaved will append default extension if not supplied if (PatternSaved(fname)) { CancelSave(); // close dialog UpdateStatus(); // fname successfully created, so download it to user's computer jsSaveFile(fname.c_str()); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void StartStop() { if (generating) { StopGenerating(); // generating flag is now false so change button image EM_ASM( document.getElementById('imgstartStop').src = 'images/start.png'; ); // don't call UpdateButtons here because if event_checker is > 0 // then StopGenerating hasn't called RememberGenFinish, and so CanUndo/CanRedo // might not return correct results bool canreset = currlayer->algo->getGeneration() > currlayer->startgen; jsEnableImgButton("reset", canreset); jsEnableImgButton("undo", allowundo && (canreset || currlayer->undoredo->CanUndo())); jsEnableImgButton("redo", false); } else if (StartGenerating()) { // generating flag is now true so change button image EM_ASM( document.getElementById('imgstartStop').src = 'images/stop.png'; ); // don't call UpdateButtons here because we want user to // be able to stop generating by hitting reset/undo buttons jsEnableImgButton("reset", true); jsEnableImgButton("undo", allowundo); jsEnableImgButton("redo", false); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Next() { StopIfGenerating(); if (event_checker > 0) { // previous NextGeneration() hasn't finished so try again after a short delay EM_ASM( window.setTimeout('_Next()', 10); ); return; } NextGeneration(false); // advance by 1 UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Step() { StopIfGenerating(); if (event_checker > 0) { // previous NextGeneration() hasn't finished so try again after a short delay EM_ASM( window.setTimeout('_Step()', 10); ); return; } NextGeneration(true); // advance by current step size UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void GoSlower() { if (currlayer->currexpo > minexpo) { currlayer->currexpo--; SetGenIncrement(); UpdateStatus(); } else { Beep(); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void GoFaster() { currlayer->currexpo++; SetGenIncrement(); UpdateStatus(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void StepBy1() { // reset step exponent to 0 currlayer->currexpo = 0; SetGenIncrement(); UpdateStatus(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Reset() { if (currlayer->algo->getGeneration() == currlayer->startgen) return; StopIfGenerating(); if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_Reset()', 10); ); return; } ResetPattern(); UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Fit() { // no need to call TestAutoFit() FitInView(1); UpdatePatternAndStatus(); } } // extern "C" // ----------------------------------------------------------------------------- void Middle() { TestAutoFit(); if (currlayer->originx == bigint::zero && currlayer->originy == bigint::zero) { currlayer->view->center(); } else { // put cell saved by ChangeOrigin (not yet implemented!!!) in middle currlayer->view->setpositionmag(currlayer->originx, currlayer->originy, currlayer->view->getmag()); } UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" { void ZoomOut() { TestAutoFit(); currlayer->view->unzoom(); UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void ZoomIn() { if (currlayer->view->getmag() < MAX_MAG) { TestAutoFit(); currlayer->view->zoom(); UpdateEverything(); } else { Beep(); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Scale1to1() { if (currlayer->view->getmag() != 0) { TestAutoFit(); currlayer->view->setmag(0); UpdateEverything(); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void FullScreen() { fullscreen = true; EM_ASM( var canvas = Module['canvas']; if (canvas.requestFullscreen) { canvas.requestFullscreen(); } else if (canvas.msRequestFullscreen) { canvas.msRequestFullscreen(); } else if (canvas.mozRequestFullScreen) { canvas.mozRequestFullScreen(); } else if (canvas.webkitRequestFullScreen) { canvas.webkitRequestFullScreen(); // following only works on Chrome??? (but prevents Safari going full screen!!!) // canvas.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); } ); // no need to call ResizeCanvas here (the resize event handler calls it) } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void ExitFullScreen() { fullscreen = false; ResizeCanvas(); } } // extern "C" // ----------------------------------------------------------------------------- static void SetScale(int mag) { if (currlayer->view->getmag() != mag) { TestAutoFit(); currlayer->view->setmag(mag); UpdateEverything(); } } // ----------------------------------------------------------------------------- extern "C" { void Info() { if (currlayer->currname != "untitled") { // display comments in current pattern file char *commptr = NULL; // readcomments will allocate commptr const char *err = readcomments(currlayer->currfile.c_str(), &commptr); if (err) { if (commptr) free(commptr); ErrorMessage(err); return; } const char* commfile = "comments"; FILE* outfile = fopen(commfile, "w"); if (outfile) { int result; if (commptr[0] == 0) { result = fputs("No comments found.", outfile); } else { result = fputs(commptr, outfile); } if (result == EOF) { ErrorMessage("Could not write comments to file!"); fclose(outfile); return; } } else { ErrorMessage("Could not open file for comments!"); fclose(outfile); return; } fclose(outfile); if (commptr) free(commptr); ShowTextFile(commfile); } } } // extern "C" // ----------------------------------------------------------------------------- void StopAndHelp(const char* helpfile) { StopIfGenerating(); ShowHelp(helpfile); } // ----------------------------------------------------------------------------- extern "C" { void Help() { // show most recently loaded help file (or contents page if no such file) StopAndHelp(""); } } // extern "C" // ----------------------------------------------------------------------------- static void OpenPrefs() { // show a modal dialog that lets user change various settings EM_ASM( document.getElementById('prefs_overlay').style.visibility = 'visible'; ); // show current settings jsSetInputValue("random_fill", randomfill); jsSetInputValue("max_hash", maxhashmem); jsSetCheckBox("ask_to_save", asktosave); jsSetCheckBox("toggle_beep", allowbeep); // select random fill percentage (the most likely setting to change) EM_ASM( var randfill = document.getElementById('random_fill'); randfill.select(); randfill.focus(); ); } // ----------------------------------------------------------------------------- extern "C" { void CancelPrefs() { // ignore any changes to the current settings and close the prefs dialog EM_ASM( document.getElementById('prefs_overlay').style.visibility = 'hidden'; ); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void StorePrefs() { // get and validate settings int newrandfill = jsGetInputValue("random_fill"); if (newrandfill < 1 || newrandfill > 100) { Warning("Random fill percentage must be an integer from 1 to 100."); return; } int newmaxhash = jsGetInputValue("max_hash"); if (newmaxhash < MIN_MEM_MB || newmaxhash > MAX_MEM_MB) { char msg[128]; sprintf(msg, "Maximum hash memory must be an integer from %d to %d.", MIN_MEM_MB, MAX_MEM_MB); Warning(msg); return; } // all settings are valid randomfill = newrandfill; if (maxhashmem != newmaxhash) { // need to call setMaxMemory if maxhashmem changed maxhashmem = newmaxhash; for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); if (algoinfo[layer->algtype]->canhash) { layer->algo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting } } asktosave = jsGetCheckBox("ask_to_save"); allowbeep = jsGetCheckBox("toggle_beep"); CancelPrefs(); // close the prefs dialog SaveLocalPrefs(); // remember settings in local storage } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Paste() { StopIfGenerating(); if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_Paste()', 10); ); return; } // remove any existing paste image if (waitingforpaste) AbortPaste(); PasteClipboard(); UpdatePatternAndStatus(); } } // extern "C" // ----------------------------------------------------------------------------- static void CancelPaste() { if (waitingforpaste) { AbortPaste(); UpdatePattern(); } } // ----------------------------------------------------------------------------- extern "C" { void Undo() { StopIfGenerating(); if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_Undo()', 10); ); return; } currlayer->undoredo->UndoChange(); UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void Redo() { StopIfGenerating(); if (event_checker > 0) { // try again after a short delay EM_ASM( window.setTimeout('_Redo()', 10); ); return; } currlayer->undoredo->RedoChange(); UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void ToggleIcons() { showicons = !showicons; UpdateEditBar(); // updates check box UpdatePattern(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void ToggleAutoFit() { currlayer->autofit = !currlayer->autofit; UpdateEditBar(); // updates check box // we only use autofit when generating if (generating && currlayer->autofit) { FitInView(0); UpdateEverything(); } } } // extern "C" // ----------------------------------------------------------------------------- static void ToggleGrid() { showgridlines = !showgridlines; UpdatePattern(); } // ----------------------------------------------------------------------------- static void ToggleHashInfo() { currlayer->showhashinfo = !currlayer->showhashinfo; // only show hashing info while generating if (generating) lifealgo::setVerbose( currlayer->showhashinfo ); } // ----------------------------------------------------------------------------- static void ToggleTiming() { showtiming = !showtiming; } // ----------------------------------------------------------------------------- static void SetAlgo(int index) { if (index >= 0 && index < NumAlgos()) { if (index != currlayer->algtype) ChangeAlgorithm(index, currlayer->algo->getrule()); } else { Warning("Bug detected in SetAlgo!"); } } // ----------------------------------------------------------------------------- extern "C" { void ModeChanged(int index) { switch (index) { case 0: currlayer->touchmode = drawmode; break; case 1: currlayer->touchmode = pickmode; break; case 2: currlayer->touchmode = selectmode; break; case 3: currlayer->touchmode = movemode; break; case 4: currlayer->touchmode = zoominmode; break; case 5: currlayer->touchmode = zoomoutmode; break; default: Warning("Bug detected in ModeChanged!"); return; } UpdateCursorImage(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void StateChanged(int index) { if (index >= 0 && index < currlayer->algo->NumCellStates()) { currlayer->drawingstate = index; } else { Warning("Bug detected in StateChanged!"); } } } // extern "C" // ----------------------------------------------------------------------------- /* enable next 2 routines if we provide keyboard shortcuts for them!!! static void DecState() { if (currlayer->drawingstate > 0) { currlayer->drawingstate--; jsSetState(currlayer->drawingstate); } } // ----------------------------------------------------------------------------- static void IncState() { if (currlayer->drawingstate < currlayer->algo->NumCellStates() - 1) { currlayer->drawingstate++; jsSetState(currlayer->drawingstate); } } */ // ----------------------------------------------------------------------------- static void ToggleCursorMode() { // state of shift key has changed so may need to toggle cursor mode if (currlayer->touchmode == drawmode) { currlayer->touchmode = pickmode; jsSetMode(currlayer->touchmode); UpdateCursorImage(); } else if (currlayer->touchmode == pickmode) { currlayer->touchmode = drawmode; jsSetMode(currlayer->touchmode); UpdateCursorImage(); } else if (currlayer->touchmode == zoominmode) { currlayer->touchmode = zoomoutmode; jsSetMode(currlayer->touchmode); UpdateCursorImage(); } else if (currlayer->touchmode == zoomoutmode) { currlayer->touchmode = zoominmode; jsSetMode(currlayer->touchmode); UpdateCursorImage(); } } // ----------------------------------------------------------------------------- static void SetRule() { StopIfGenerating(); std::string newrule = jsSetRule(currlayer->algo->getrule()); // newrule is empty if user hit Cancel if (newrule.length() > 0) ChangeRule(newrule); } // ----------------------------------------------------------------------------- static void FlipPasteOrSelection(bool direction) { if (waitingforpaste) { FlipPastePattern(direction); } else if (SelectionExists()) { FlipSelection(direction); } UpdateEverything(); } // ----------------------------------------------------------------------------- static void RotatePasteOrSelection(bool direction) { if (waitingforpaste) { RotatePastePattern(direction); } else if (SelectionExists()) { RotateSelection(direction); } UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" { void PasteAction(int item) { if (item == 2 && !SelectionExists()) { // pastesel item is grayed, so ignore click return; } // remove menu EM_ASM( document.getElementById('pastemenu').style.visibility = 'hidden'; ); paste_menu_visible = false; switch (item) { case 0: AbortPaste(); break; case 1: DoPaste(false); break; case 2: DoPaste(true); break; case 3: FlipPastePattern(true); break; case 4: FlipPastePattern(false); break; case 5: RotatePastePattern(true); break; case 6: RotatePastePattern(false); break; default: Warning("Bug detected in PasteAction!"); } UpdateEverything(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void SelectionAction(int item) { // remove menu first EM_ASM( document.getElementById('selectionmenu').style.visibility = 'hidden'; ); selection_menu_visible = false; if (generating && item >= 1 && item <= 13 && item != 2 && item != 5 && item != 6) { // temporarily stop generating for all actions except Remove, Copy, Shrink, Fit PauseGenerating(); } switch (item) { case 0: RemoveSelection(); break; // WARNING: above test assumes Remove is item 0 case 1: CutSelection(); break; case 2: CopySelection(); break; // WARNING: above test assumes Copy is item 2 case 3: ClearSelection(); break; case 4: ClearOutsideSelection(); break; case 5: ShrinkSelection(false); break; // WARNING: above test assumes Shrink is item 5 case 6: FitSelection(); break; // WARNING: above test assumes Fit is item 6 case 7: RandomFill(); break; case 8: FlipSelection(true); break; case 9: FlipSelection(false); break; case 10: RotateSelection(true); break; case 11: RotateSelection(false); break; case 12: currlayer->currsel.Advance(); break; case 13: currlayer->currsel.AdvanceOutside(); break; // WARNING: above test assumes 13 is last item default: Warning("Bug detected in SelectionAction!"); } ResumeGenerating(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void ClearStatus() { ClearMessage(); } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void OpenClickedFile(const char* filepath) { ClearMessage(); StopIfGenerating(); OpenFile(filepath); } } // extern "C" // ----------------------------------------------------------------------------- static void ChangePasteMode(paste_mode newmode) { if (pmode != newmode) pmode = newmode; } // ----------------------------------------------------------------------------- static void ToggleDisableUndoRedo() { allowundo = !allowundo; if (allowundo) { if (currlayer->algo->getGeneration() > currlayer->startgen) { // undo list is empty but user can Reset, so add a generating change // to undo list so user can Undo or Reset (and then Redo if they wish) currlayer->undoredo->AddGenChange(); } } else { currlayer->undoredo->ClearUndoRedo(); } UpdateEditBar(); } // ----------------------------------------------------------------------------- extern "C" { void UpdateMenuItems(const char* id) { // this routine is called just before the given menu is made visible std::string menu = id; if (menu == "File_menu") { // items in this menu don't change } else if (menu == "Edit_menu") { if (currlayer->undoredo->CanUndo()) { EM_ASM( document.getElementById('edit_undo').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('edit_undo').className = 'item_disabled'; ); } if (currlayer->undoredo->CanRedo()) { EM_ASM( document.getElementById('edit_redo').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('edit_redo').className = 'item_disabled'; ); } if (allowundo) { EM_ASM( document.getElementById('edit_disable').innerHTML = 'Disable Undo/Redo'; ); } else { EM_ASM( document.getElementById('edit_disable').innerHTML = 'Enable Undo/Redo'; ); } if (SelectionExists()) { EM_ASM( document.getElementById('edit_cut').className = 'item_normal'; ); EM_ASM( document.getElementById('edit_copy').className = 'item_normal'; ); EM_ASM( document.getElementById('edit_clear').className = 'item_normal'; ); EM_ASM( document.getElementById('edit_clearo').className = 'item_normal'; ); EM_ASM( document.getElementById('edit_remove').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('edit_cut').className = 'item_disabled'; ); EM_ASM( document.getElementById('edit_copy').className = 'item_disabled'; ); EM_ASM( document.getElementById('edit_clear').className = 'item_disabled'; ); EM_ASM( document.getElementById('edit_clearo').className = 'item_disabled'; ); EM_ASM( document.getElementById('edit_remove').className = 'item_disabled'; ); } } else if (menu == "PasteMode_menu") { jsTickMenuItem("paste_mode_and", pmode == And); jsTickMenuItem("paste_mode_copy", pmode == Copy); jsTickMenuItem("paste_mode_or", pmode == Or); jsTickMenuItem("paste_mode_xor", pmode == Xor); } else if (menu == "Control_menu") { if (generating) { EM_ASM( document.getElementById('control_startstop').innerHTML = 'Stop Generating'; ); } else { EM_ASM( document.getElementById('control_startstop').innerHTML = 'Start Generating'; ); } if (currlayer->algo->getGeneration() > currlayer->startgen) { EM_ASM( document.getElementById('control_reset').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('control_reset').className = 'item_disabled'; ); } jsTickMenuItem("control_autofit", currlayer->autofit); jsTickMenuItem("control_hash", currlayer->showhashinfo); jsTickMenuItem("control_timing", showtiming); } else if (menu == "Algo_menu") { jsTickMenuItem("algo0", currlayer->algtype == 0); jsTickMenuItem("algo1", currlayer->algtype == 1); jsTickMenuItem("algo2", currlayer->algtype == 2); jsTickMenuItem("algo3", currlayer->algtype == 3); jsTickMenuItem("algo4", currlayer->algtype == 4); jsTickMenuItem("algo5", currlayer->algtype == 5); } else if (menu == "View_menu") { if (SelectionExists()) { EM_ASM( document.getElementById('view_fits').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('view_fits').className = 'item_disabled'; ); } jsTickMenuItem("view_grid", showgridlines); jsTickMenuItem("view_icons", showicons); if (currlayer->currname != "untitled") { EM_ASM( document.getElementById('view_info').className = 'item_normal'; ); } else { EM_ASM( document.getElementById('view_info').className = 'item_disabled'; ); } } else if (menu == "Scale_menu") { jsTickMenuItem("scale0", currlayer->view->getmag() == 0); jsTickMenuItem("scale1", currlayer->view->getmag() == 1); jsTickMenuItem("scale2", currlayer->view->getmag() == 2); jsTickMenuItem("scale3", currlayer->view->getmag() == 3); jsTickMenuItem("scale4", currlayer->view->getmag() == 4); jsTickMenuItem("scale5", currlayer->view->getmag() == 5); } else if (menu == "Help_menu") { // items in this menu don't change } else if (menu == "pastemenu") { char text[32]; sprintf(text, "Paste Here (%s)", GetPasteMode()); jsSetInnerHTML("pastehere", text); if (SelectionExists()) { EM_ASM( document.getElementById('pastesel').className = 'normal'; ); } else { EM_ASM( document.getElementById('pastesel').className = 'grayed'; ); } } else if (menu == "selectionmenu") { char text[32]; sprintf(text, "Random Fill (%d%%)", randomfill); jsSetInnerHTML("randfill", text); } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void DoMenuItem(const char* id) { std::string item = id; // items in File menu: if (item == "file_new") NewUniverse(); else if (item == "file_open") Open(); else if (item == "file_openclip") OpenClipboard(); else if (item == "file_save") Save(); else if (item == "file_prefs") OpenPrefs(); else // items in Edit menu: if (item == "edit_undo") Undo(); else if (item == "edit_redo") Redo(); else if (item == "edit_disable") ToggleDisableUndoRedo(); else if (item == "edit_cut") CutSelection(); else if (item == "edit_copy") CopySelection(); else if (item == "edit_clear") ClearSelection(); else if (item == "edit_clearo") ClearOutsideSelection(); else if (item == "edit_paste") Paste(); else if (item == "paste_mode_and") ChangePasteMode(And); else if (item == "paste_mode_copy") ChangePasteMode(Copy); else if (item == "paste_mode_or") ChangePasteMode(Or); else if (item == "paste_mode_xor") ChangePasteMode(Xor); else if (item == "edit_all") SelectAll(); else if (item == "edit_remove") RemoveSelection(); else // items in Control menu: if (item == "control_startstop") StartStop(); else if (item == "control_next") Next(); else if (item == "control_step") Step(); else if (item == "control_step1") StepBy1(); else if (item == "control_slower") GoSlower(); else if (item == "control_faster") GoFaster(); else if (item == "control_reset") Reset(); else if (item == "control_autofit") ToggleAutoFit(); else if (item == "control_hash") ToggleHashInfo(); else if (item == "control_timing") ToggleTiming(); else if (item == "algo0") SetAlgo(0); else if (item == "algo1") SetAlgo(1); else if (item == "algo2") SetAlgo(2); else if (item == "algo3") SetAlgo(3); else if (item == "algo4") SetAlgo(4); else if (item == "algo5") SetAlgo(5); else if (item == "control_setrule") SetRule(); else // items in View menu: if (item == "view_fitp") Fit(); else if (item == "view_fits") FitSelection(); else if (item == "view_middle") Middle(); else if (item == "view_zoomin") ZoomIn(); else if (item == "view_zoomout") ZoomOut(); else if (item == "scale0") SetScale(0); else if (item == "scale1") SetScale(1); else if (item == "scale2") SetScale(2); else if (item == "scale3") SetScale(3); else if (item == "scale4") SetScale(4); else if (item == "scale5") SetScale(5); else if (item == "view_grid") ToggleGrid(); else if (item == "view_icons") ToggleIcons(); else if (item == "view_info") Info(); else // items in Help menu: if (item == "help_index") StopAndHelp("/Help/index.html"); else if (item == "help_intro") StopAndHelp("/Help/intro.html"); else if (item == "help_tips") StopAndHelp("/Help/tips.html"); else if (item == "help_algos") StopAndHelp("/Help/algos.html"); else if (item == "help_lexicon") StopAndHelp("/Help/Lexicon/lex.htm"); else if (item == "help_archives") StopAndHelp("/Help/archives.html"); else if (item == "help_keyboard") StopAndHelp("/Help/keyboard.html"); else if (item == "help_refs") StopAndHelp("/Help/refs.html"); else if (item == "help_formats") StopAndHelp("/Help/formats.html"); else if (item == "help_bounded") StopAndHelp("/Help/bounded.html"); else if (item == "help_problems") StopAndHelp("/Help/problems.html"); else if (item == "help_changes") StopAndHelp("/Help/changes.html"); else if (item == "help_credits") StopAndHelp("/Help/credits.html"); else if (item == "help_about") StopAndHelp("/Help/about.html"); else Warning("Not yet implemented!!!"); } } // extern "C" // ----------------------------------------------------------------------------- static const int META_KEY = 666; // cmd key on Mac, start/menu key on Windows (latter untested!!!) static int TranslateKey(int keycode) { // this is a modified version of DOMToGLFWKeyCode in emscripten/src/library_glfw.js switch (keycode) { // my changes (based on testing and info at http://unixpapa.com/js/key.html) case 224 : return META_KEY; // cmd key on Firefox (Mac) case 91 : return META_KEY; // left cmd key on Safari, Chrome (Mac) case 93 : return META_KEY; // right cmd key on Safari, Chrome (Mac) case 92 : return META_KEY; // right start key on Firefox, IE (Windows) case 219 : return '['; // Firefox, Chrome and Safari (Mac) case 220 : return '\\'; // Firefox, Chrome and Safari (Mac) case 221 : return ']'; // Firefox, Chrome and Safari (Mac) case 173 : return '-'; // Firefox (Mac) case 189 : return '-'; // Chrome and Safari (Mac) case 187 : return '='; // Chrome and Safari (Mac) case 188 : return '<'; // Firefox, Chrome and Safari (Mac) case 190 : return '>'; // Firefox, Chrome and Safari (Mac) case 0x09: return 295 ; //DOM_VK_TAB -> GLFW_KEY_TAB // GLFW_KEY_ESC is not 255???!!! case 0x1B: return 255 ; //DOM_VK_ESCAPE -> GLFW_KEY_ESC case 0x6A: return 313 ; //DOM_VK_MULTIPLY -> GLFW_KEY_KP_MULTIPLY case 0x6B: return 315 ; //DOM_VK_ADD -> GLFW_KEY_KP_ADD case 0x6D: return 314 ; //DOM_VK_SUBTRACT -> GLFW_KEY_KP_SUBTRACT case 0x6E: return 316 ; //DOM_VK_DECIMAL -> GLFW_KEY_KP_DECIMAL case 0x6F: return 312 ; //DOM_VK_DIVIDE -> GLFW_KEY_KP_DIVIDE case 0x70: return 258 ; //DOM_VK_F1 -> GLFW_KEY_F1 case 0x71: return 259 ; //DOM_VK_F2 -> GLFW_KEY_F2 case 0x72: return 260 ; //DOM_VK_F3 -> GLFW_KEY_F3 case 0x73: return 261 ; //DOM_VK_F4 -> GLFW_KEY_F4 case 0x74: return 262 ; //DOM_VK_F5 -> GLFW_KEY_F5 case 0x75: return 263 ; //DOM_VK_F6 -> GLFW_KEY_F6 case 0x76: return 264 ; //DOM_VK_F7 -> GLFW_KEY_F7 case 0x77: return 265 ; //DOM_VK_F8 -> GLFW_KEY_F8 case 0x78: return 266 ; //DOM_VK_F9 -> GLFW_KEY_F9 case 0x79: return 267 ; //DOM_VK_F10 -> GLFW_KEY_F10 case 0x7a: return 268 ; //DOM_VK_F11 -> GLFW_KEY_F11 case 0x7b: return 269 ; //DOM_VK_F12 -> GLFW_KEY_F12 case 0x25: return 285 ; //DOM_VK_LEFT -> GLFW_KEY_LEFT case 0x26: return 283 ; //DOM_VK_UP -> GLFW_KEY_UP case 0x27: return 286 ; //DOM_VK_RIGHT -> GLFW_KEY_RIGHT case 0x28: return 284 ; //DOM_VK_DOWN -> GLFW_KEY_DOWN case 0x21: return 298 ; //DOM_VK_PAGE_UP -> GLFW_KEY_PAGEUP case 0x22: return 299 ; //DOM_VK_PAGE_DOWN -> GLFW_KEY_PAGEDOWN case 0x24: return 300 ; //DOM_VK_HOME -> GLFW_KEY_HOME case 0x23: return 301 ; //DOM_VK_END -> GLFW_KEY_END case 0x2d: return 296 ; //DOM_VK_INSERT -> GLFW_KEY_INSERT case 16 : return 287 ; //DOM_VK_SHIFT -> GLFW_KEY_LSHIFT case 0x05: return 287 ; //DOM_VK_LEFT_SHIFT -> GLFW_KEY_LSHIFT case 0x06: return 288 ; //DOM_VK_RIGHT_SHIFT -> GLFW_KEY_RSHIFT case 17 : return 289 ; //DOM_VK_CONTROL -> GLFW_KEY_LCTRL case 0x03: return 289 ; //DOM_VK_LEFT_CONTROL -> GLFW_KEY_LCTRL case 0x04: return 290 ; //DOM_VK_RIGHT_CONTROL -> GLFW_KEY_RCTRL case 18 : return 291 ; //DOM_VK_ALT -> GLFW_KEY_LALT case 0x02: return 291 ; //DOM_VK_LEFT_ALT -> GLFW_KEY_LALT case 0x01: return 292 ; //DOM_VK_RIGHT_ALT -> GLFW_KEY_RALT case 96 : return 302 ; //GLFW_KEY_KP_0 case 97 : return 303 ; //GLFW_KEY_KP_1 case 98 : return 304 ; //GLFW_KEY_KP_2 case 99 : return 305 ; //GLFW_KEY_KP_3 case 100 : return 306 ; //GLFW_KEY_KP_4 case 101 : return 307 ; //GLFW_KEY_KP_5 case 102 : return 308 ; //GLFW_KEY_KP_6 case 103 : return 309 ; //GLFW_KEY_KP_7 case 104 : return 310 ; //GLFW_KEY_KP_8 case 105 : return 311 ; //GLFW_KEY_KP_9 default : return keycode; }; } // ----------------------------------------------------------------------------- extern "C" { int OnKeyChanged(int keycode, int action) { int key = TranslateKey(keycode); // first check for modifier keys (meta/ctrl/alt/shift); // note that we need to set flags for these keys BEFORE testing // jsTextAreaIsActive so users can do things like ctrl-click in canvas while // a textarea has focus and OnMouseClick will be able to test ctrl_down flag if (key == META_KEY) { meta_down = action == GLFW_PRESS; return 0; // don't call preventDefault } else if (key == GLFW_KEY_LCTRL || key == GLFW_KEY_RCTRL) { ctrl_down = action == GLFW_PRESS; return 0; // don't call preventDefault } else if (key == GLFW_KEY_LALT || key == GLFW_KEY_RALT) { alt_down = action == GLFW_PRESS; return 1; } else if (key == GLFW_KEY_LSHIFT || key == GLFW_KEY_RSHIFT) { bool oldshift = shift_down; shift_down = action == GLFW_PRESS; if (oldshift != shift_down) ToggleCursorMode(); return 1; } if (meta_down || ctrl_down) { // could be a browser shortcut like ctrl/cmd-Q/X/C/V, // so don't handle the key here and don't call preventDefault return 0; } // check if a modal dialog is visible if (jsElementIsVisible("open_overlay") || jsElementIsVisible("save_overlay") || jsElementIsVisible("prefs_overlay") || jsElementIsVisible("info_overlay") || jsElementIsVisible("help_overlay") ) { if (action == GLFW_PRESS && (key == 13 || key == 27)) { // return key or escape key closes dialog if (jsElementIsVisible("open_overlay")) { CancelOpen(); } else if (jsElementIsVisible("save_overlay")) { if (key == 13) { EM_ASM( save_pattern(); ); // see shell.html for save_pattern() } else { CancelSave(); } } else if (jsElementIsVisible("prefs_overlay")) { if (key == 13) { StorePrefs(); } else { CancelPrefs(); } } else if (jsElementIsVisible("info_overlay")) { EM_ASM( _CloseInfo(); ); } else if (jsElementIsVisible("help_overlay")) { // some of the above dialogs can be on top of help dialog, so test this last EM_ASM( _CloseHelp(); ); } return 1; // call preventDefault } return 0; } if (jsTextAreaIsActive()) { // a textarea is active (and probably has focus), // so don't handle the key here and don't call preventDefault return 0; } if (action == GLFW_PRESS) ClearMessage(); if (action == GLFW_RELEASE) return 1; // non-modifier key was released // a non-modifer key is down (and meta/ctrl key is NOT currently down) // check for arrow keys and do panning if (key == GLFW_KEY_UP) { if (shift_down) PanNE(); else PanUp( SmallScroll(currlayer->view->getheight()) ); return 1; } else if (key == GLFW_KEY_DOWN) { if (shift_down) PanSW(); else PanDown( SmallScroll(currlayer->view->getheight()) ); return 1; } else if (key == GLFW_KEY_LEFT) { if (shift_down) PanNW(); else PanLeft( SmallScroll(currlayer->view->getwidth()) ); return 1; } else if (key == GLFW_KEY_RIGHT) { if (shift_down) PanSE(); else PanRight( SmallScroll(currlayer->view->getwidth()) ); return 1; } int ch = key; if (key >= 'A' && key <= 'Z' && !shift_down) { // convert to lowercase ch = ch + 32; } switch (ch) { case 13 : StartStop(); break; case ' ' : Next(); break; case '_' : GoSlower(); break; case '-' : GoSlower(); break; case '+' : GoFaster(); break; case '=' : GoFaster(); break; case '0' : StepBy1(); break; case '1' : Scale1to1(); break; case '5' : RandomFill(); break; case '[' : ZoomOut(); break; case ']' : ZoomIn(); break; case 'a' : SelectAll(); break; case 'A' : RemoveSelection(); break; case 'f' : Fit(); break; case 'F' : FitSelection(); break; case 'h' : Help(); break; case 'i' : ToggleIcons(); break; case 'l' : ToggleGrid(); break; case 'm' : Middle(); break; case 'o' : Open(); break; case 'O' : OpenClipboard(); break; case 'p' : OpenPrefs(); break; case 'r' : SetRule(); break; case 's' : Save(); break; case 't' : ToggleAutoFit(); break; case 'v' : Paste(); break; case 'V' : CancelPaste(); break; case 'x' : FlipPasteOrSelection(false); break; case 'y' : FlipPasteOrSelection(true); break; case '<' : RotatePasteOrSelection(false); break; case '>' : RotatePasteOrSelection(true); break; case 'z' : Undo(); break; case 'Z' : Redo(); break; } return 1; // call preventDefault } } // extern "C" // ----------------------------------------------------------------------------- static void OnMouseClick(int button, int action) { ok_to_check_mouse = true; if (action == GLFW_PRESS) { // make sure a textarea element no longer has focus (for testing in on_key_changed); // note that 'patterns' is a div with a tabindex, and an outline style that prevents // a focus ring appearing EM_ASM( document.getElementById('patterns').focus(); ); int x, y; glfwGetMousePos(&x, &y); ClearMessage(); if (paste_menu_visible) { EM_ASM( document.getElementById('pastemenu').style.visibility = 'hidden'; ); paste_menu_visible = false; return; } if (selection_menu_visible) { EM_ASM( document.getElementById('selectionmenu').style.visibility = 'hidden'; ); selection_menu_visible = false; return; } // test for ctrl/right click in paste image or selection; // button test should be for GLFW_MOUSE_BUTTON_RIGHT which is defined to be 1 in glfw.h // but I actually get 2 when right button is pressed in all my browsers (report bug!!!) if (button == 2 || ctrl_down) { if (waitingforpaste && PointInPasteImage(x, y)) { UpdateMenuItems("pastemenu"); jsShowMenu("pastemenu", x, y); paste_menu_visible = true; } else if (SelectionExists() && PointInSelection(x, y)) { UpdateMenuItems("selectionmenu"); jsShowMenu("selectionmenu", x, y); selection_menu_visible = true; } return; } // check for click outside viewport if (x < 0 || x >= currwd || y < 0 || y >= currht) { if (mouse_down) TouchEnded(); mouse_down = false; return; } bool was_auto_fit = currlayer->autofit; TouchBegan(x, y); mouse_down = true; // TouchBegan might have called TestAutoFit and turned off currlayer->autofit, // in which case we need to update the check box if (was_auto_fit && !currlayer->autofit) UpdateEditBar(); } else if (action == GLFW_RELEASE) { if (mouse_down) TouchEnded(); mouse_down = false; } } // ----------------------------------------------------------------------------- static void OnMouseMove(int x, int y) { ok_to_check_mouse = true; int mousestate = glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT); if (mousestate == GLFW_PRESS) { // play safe and ignore move outside viewport if (x < 0 || x >= currwd || y < 0 || y >= currht) return; TouchMoved(x, y); } } // ----------------------------------------------------------------------------- static int prevwheel = 0; extern "C" { void OnMouseWheel(int pos) { int x, y; glfwGetMousePos(&x, &y); // we use a threshold of 2 in below tests to reduce sensitivity if (pos + 2 < prevwheel) { ZoomInPos(x, y); prevwheel = pos; } else if (pos - 2 > prevwheel) { ZoomOutPos(x, y); prevwheel = pos; } } } // extern "C" // ----------------------------------------------------------------------------- extern "C" { void OverCanvas(int entered) { if (entered) { // mouse entered canvas so change cursor image depending on currlayer->touchmode UpdateCursorImage(); // call CheckMouseLocation in DoFrame over_canvas = true; // remove focus from select element to avoid problem if an arrow key is pressed // (doesn't quite work!!! if selection is NOT changed and arrow key is hit immediately // then it can cause the selection to change) EM_ASM( if (document.activeElement.tagName == 'SELECT') { document.getElementById('patterns').focus(); }; ); } else { // mouse exited canvas; cursor is automatically restored to standard arrow // so no need to do this: // EM_ASM( Module['canvas'].style.cursor = 'auto'; ); // force XY location to be cleared CheckMouseLocation(-1, -1); // we also need to prevent CheckMouseLocation being called in DoFrame because // it might detect a valid XY location if right/bottom cells are clipped over_canvas = false; } } } // extern "C" // ----------------------------------------------------------------------------- static void DoFrame() { if (generating && event_checker == 0) { if (currlayer->currexpo < 0) { // get current delay (in secs) float delay = GetCurrentDelay() / 1000.0; double current_time = glfwGetTime(); // check if it's time to call NextGeneration if (current_time - last_time >= delay) { NextGeneration(true); UpdatePatternAndStatus(); last_time = current_time; } } else { NextGeneration(true); UpdatePatternAndStatus(); } } if (refresh_pattern) { refresh_pattern = false; DrawPattern(currindex); } glfwSwapBuffers(); // check the current mouse location continuously, but only after the 1st mouse-click or // mouse-move event, because until then glfwGetMousePos returns 0,0 (report bug???!!!) if (ok_to_check_mouse && over_canvas) { int x, y; glfwGetMousePos(&x, &y); CheckMouseLocation(x, y); // also check if cursor image needs to be changed (this can only be done AFTER // DrawPattern has set pasterect, which is tested by PointInPasteImage) CheckCursor(x, y); } } // ----------------------------------------------------------------------------- // we need the EMSCRIPTEN_KEEPALIVE flag to avoid our main() routine disappearing // (a somewhat strange consequence of using -s EXPORTED_FUNCTIONS in Makefile) int EMSCRIPTEN_KEEPALIVE main() { SetMessage("This is Golly 3.3 for the web. Copyright 2005-2019 The Golly Gang."); InitPaths(); // init tempdir, prefsfile, etc MAX_MAG = 5; // maximum cell size = 32x32 maxhashmem = 300; // enough for caterpillar InitAlgorithms(); // must initialize algoinfo first GetLocalPrefs(); // load user's preferences from local storage SetMinimumStepExponent(); // for slowest speed AddLayer(); // create initial layer (sets currlayer) NewPattern(); // create new, empty universe UpdateStatus(); // show initial message InitClipboard(); // initialize clipboard data UpdateEditBar(); // initialize buttons, drawing state, and check boxes if (InitGL() == GL_TRUE) { ResizeCanvas(); // we do our own keyboard event handling (see InitEventHandlers) // glfwSetKeyCallback(OnKeyChanged); glfwSetMouseButtonCallback(OnMouseClick); glfwSetMousePosCallback(OnMouseMove); // we do our own mouse wheel handling (see InitEventHandlers) // glfwSetMouseWheelCallback(OnMouseWheel); emscripten_set_main_loop(DoFrame, 0, 1); } glfwTerminate(); return 0; } golly-3.3-src/gui-web/jslib.js0000755000175000017500000004070212651666400013227 00000000000000// The following JavaScript routines can be called from C++ code (eg. webcalls.cpp). // Makefile merges these routines into golly.js via the --js-library option. var LibraryGOLLY = { $GOLLY: { cancel_progress: false, // cancel progress dialog? progstart: 0.0, // time when jsBeginProgress is called statusbar: null // status bar element }, // ----------------------------------------------------------------------------- jsAlert: function(msg) { alert(Pointer_stringify(msg)); }, // ----------------------------------------------------------------------------- jsConfirm: function(query) { return confirm(Pointer_stringify(query)); }, // ----------------------------------------------------------------------------- jsSetBackgroundColor: function(id, color) { document.getElementById(Pointer_stringify(id)).style.backgroundColor = Pointer_stringify(color); }, // ----------------------------------------------------------------------------- jsSetStatus: function(line1, line2, line3) { // check if the statusbar element lookup has already been done if (!GOLLY.statusbar) { // lookup and cache the statusbar element GOLLY.statusbar = document.getElementById('statusbar'); } // set the statusbar GOLLY.statusbar.value = Pointer_stringify(line1) + '\n' + Pointer_stringify(line2) + '\n' + Pointer_stringify(line3); }, // ----------------------------------------------------------------------------- jsSetMode: function(index) { document.getElementById('mode').selectedIndex = index; }, // ----------------------------------------------------------------------------- jsSetState: function(state, numstates) { var list = document.getElementById('state'); // may need to update number of options in list while (list.length < numstates) { // append another option var option = document.createElement('option'); option.text = list.length.toString(); list.add(option); }; while (list.length > numstates) { // remove last option list.remove(list.length - 1); } list.selectedIndex = state; }, // ----------------------------------------------------------------------------- jsSetRule: function(oldrule) { var newrule = prompt('Type in a new rule:', Pointer_stringify(oldrule)); if (newrule == null) { return allocate(intArrayFromString('\0'), 'i8', ALLOC_STACK); } else { return allocate(intArrayFromString(newrule), 'i8', ALLOC_STACK); } }, // ----------------------------------------------------------------------------- jsGetSaveName: function(currname) { var newname = prompt('Save current pattern in given file:', Pointer_stringify(currname)); if (newname == null) { return allocate(intArrayFromString('\0'), 'i8', ALLOC_STACK); } else { return allocate(intArrayFromString(newname), 'i8', ALLOC_STACK); } }, // ----------------------------------------------------------------------------- jsShowMenu: function(id, x, y) { var menu = document.getElementById(Pointer_stringify(id)); var mrect = menu.getBoundingClientRect(); // x,y coords are relative to canvas, so convert to window coords var crect = Module['canvas'].getBoundingClientRect(); // note that scrolling is disabled so window.scrollX and window.scrollY are 0 x += crect.left + 1; y += crect.top + 1; // if menu would be outside right/bottom window edge then move it if (x + mrect.width > window.innerWidth) x -= mrect.width + 2; if (y + mrect.height > window.innerHeight) y -= y + mrect.height - window.innerHeight; menu.style.top = y.toString() + 'px'; menu.style.left = x.toString() + 'px'; menu.style.visibility = 'visible'; }, // ----------------------------------------------------------------------------- jsSetClipboard: function(text) { document.getElementById('cliptext').value = Pointer_stringify(text); }, // ----------------------------------------------------------------------------- jsGetClipboard: function() { var text = document.getElementById('cliptext').value; if (text == null) { return allocate(intArrayFromString('\0'), 'i8', ALLOC_STACK); } else { return allocate(intArrayFromString(text), 'i8', ALLOC_STACK); } }, // ----------------------------------------------------------------------------- jsTextAreaIsActive: function() { if (document.activeElement.tagName == 'TEXTAREA') { return 1; } else { return 0; } }, // ----------------------------------------------------------------------------- jsElementIsVisible: function(id) { if (document.getElementById(Pointer_stringify(id)).style.visibility == 'visible') { return true; } else { return false; } }, // ----------------------------------------------------------------------------- jsEnableButton: function(id, enable) { var button = document.getElementById(Pointer_stringify(id)); if (enable) { button.disabled = false; button.style.color = '#000'; } else { button.disabled = true; button.style.color = '#888'; } }, // ----------------------------------------------------------------------------- jsEnableImgButton: function(id, enable) { var button = document.getElementById(Pointer_stringify(id)); var img = document.getElementById('img' + Pointer_stringify(id)); if (enable) { button.disabled = false; img.style.opacity = 1.0; // following is needed on IE???!!! // img.style.filter = 'alpha(opacity:100)'; } else { button.disabled = true; img.style.opacity = 0.25; // following is needed on IE???!!! // img.style.filter = 'alpha(opacity:25)'; } }, // ----------------------------------------------------------------------------- jsTickMenuItem: function(id, tick) { var menuitem = document.getElementById(Pointer_stringify(id)); if (tick) { menuitem.style.backgroundImage = 'url(images/item_tick.png)'; } else { menuitem.style.backgroundImage = 'url(images/item_blank.png)'; } }, // ----------------------------------------------------------------------------- jsSetInputValue: function(id, num) { document.getElementById(Pointer_stringify(id)).value = num.toString(); }, // ----------------------------------------------------------------------------- jsGetInputValue: function(id) { var num = parseInt(document.getElementById(Pointer_stringify(id)).value, 10); if (isNaN(num)) return -1; return num; }, // ----------------------------------------------------------------------------- jsSetCheckBox: function(id, flag) { document.getElementById(Pointer_stringify(id)).checked = flag; }, // ----------------------------------------------------------------------------- jsGetCheckBox: function(id) { return document.getElementById(Pointer_stringify(id)).checked; }, // ----------------------------------------------------------------------------- jsSetInnerHTML: function(id, text) { document.getElementById(Pointer_stringify(id)).innerHTML = Pointer_stringify(text); }, // ----------------------------------------------------------------------------- jsMoveToAnchor: function(anchor) { window.location.hash = Pointer_stringify(anchor); }, // ----------------------------------------------------------------------------- jsSetScrollTop: function(id, pos) { document.getElementById(Pointer_stringify(id)).scrollTop = pos; }, // ----------------------------------------------------------------------------- jsGetScrollTop: function(id) { return document.getElementById(Pointer_stringify(id)).scrollTop; }, // ----------------------------------------------------------------------------- jsBeep: function() { var beep = new Audio("beep.wav"); beep.play(); }, // ----------------------------------------------------------------------------- jsDeleteFile: function(filepath) { FS.unlink(Pointer_stringify(filepath)); }, // ----------------------------------------------------------------------------- jsMoveFile: function(inpath, outpath) { try { FS.rename(Pointer_stringify(inpath), Pointer_stringify(outpath)); return true; } catch (e) { alert('FS.rename failed!'); return false; } }, // ----------------------------------------------------------------------------- jsShowSaveDialog: function(filename, extensions) { document.getElementById('save_overlay').style.visibility = 'visible'; document.getElementById('save_extensions').innerHTML = 'Valid extensions: ' + Pointer_stringify(extensions); var namebox = document.getElementById('save_name'); namebox.value = Pointer_stringify(filename); namebox.select(); namebox.focus(); }, // ----------------------------------------------------------------------------- jsSaveFile: function(filenameptr) { var filename = Pointer_stringify(filenameptr); var contents, blob; var gzext = '.gz'; if (filename.length >= gzext.length && filename.substr(filename.length - gzext.length) == gzext) { // treat .gz file as uninterpreted binary data contents = FS.readFile(filename, {encoding:'binary'}); blob = new Blob([contents], {type:'application/octet-stream'}); } else { // assume it's a text file (.rle or .mc) contents = FS.readFile(filename, {encoding:'utf8'}); blob = new Blob([contents], {type:'text/plain'}); } var alink = document.createElement('a'); alink.download = filename; alink.innerHTML = 'Download File'; if (window.webkitURL != null) { // Safari/Chrome allows the link to be clicked without actually adding it to the DOM alink.href = window.webkitURL.createObjectURL(blob); } else { // Firefox requires the link to be added to the DOM before it can be clicked alink.href = window.URL.createObjectURL(blob); alink.onclick = function(event) { document.body.removeChild(event.target); }; alink.style.display = 'none'; document.body.appendChild(alink); } alink.click(); }, // ----------------------------------------------------------------------------- jsStoreRule: function(rulepath) { // read contents of .rule file and save to local storage using rulepath as the key var filepath = Pointer_stringify(rulepath); try { var contents = FS.readFile(filepath, {encoding:'utf8'}); localStorage.setItem(filepath, contents); } catch(e) { alert('Failed to store rule file:\n' + filepath); } }, // ----------------------------------------------------------------------------- jsCancelProgress: function() { // user hit Cancel button in progress dialog GOLLY.cancel_progress = true; // best to hide the progress dialog immediately document.getElementById('progress_overlay').style.visibility = 'hidden'; }, // ----------------------------------------------------------------------------- jsBeginProgress: function(title) { // DEBUG: Module.printErr('jsBeginProgress'); document.getElementById('progress_title').innerHTML = Pointer_stringify(title); document.getElementById('progress_percent').innerHTML = ' '; // don't show the progress dialog immediately // document.getElementById('progress_overlay').style.visibility = 'visible'; GOLLY.cancel_progress = false; GOLLY.progstart = Date.now()/1000; }, // ----------------------------------------------------------------------------- jsAbortProgress: function(percentage) { // DEBUG: Module.printErr('jsAbortProgress: ' + percentage); var secs = Date.now()/1000 - GOLLY.progstart; if (document.getElementById('progress_overlay').style.visibility == 'visible') { if (percentage < 0) { // -ve percentage is # of bytes downloaded so far (file size is unknown) percentage *= -1; document.getElementById('progress_percent').innerHTML = 'Bytes downloaded: '+percentage; } else { document.getElementById('progress_percent').innerHTML = 'Completed: '+percentage+'%'; } return GOLLY.cancel_progress; } else { // note that percentage is not always an accurate estimator for how long // the task will take, especially when we use nextcell for cut/copy if ( (secs > 1.0 && percentage < 30) || secs > 2.0 ) { // task is probably going to take a while so show progress dialog document.getElementById('progress_overlay').style.visibility = 'visible'; } return false; } }, // ----------------------------------------------------------------------------- jsEndProgress: function() { // DEBUG: Module.printErr('jsEndProgress'); // hide the progress dialog document.getElementById('progress_overlay').style.visibility = 'hidden'; }, // ----------------------------------------------------------------------------- jsDownloadFile: function(urlptr, filepathptr) { // download file from given url and store its contents in filepath var url = Pointer_stringify(urlptr); var filepath = Pointer_stringify(filepathptr); // DEBUG: Module.printErr('URL: '+url+' FILE: '+filepath); // prefix url with http://www.corsproxy.com/ so we can get file from another domain // (note that we assume url starts with "http://") url = 'http://www.corsproxy.com/' + url.substring(7); var xhr = new XMLHttpRequest(); if (xhr) { // first send a request to get the file's size /* doesn't work!!! -- get error 400 (bad request) probably because corsproxy.com only supports GET requests xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { Module.printErr('response: '+xhr.getResponseHeader('Content-Length')); } else { // some sort of error occurred Module.printErr('status error: ' + xhr.status + ' ' + xhr.statusText); } } } xhr.open('HEAD', url, true); // get only the header info xhr.send(); */ // note that we need to prefix jsBeginProgress/jsAbortProgress/jsEndProgress calls // with an underscore because webcalls.cpp declares them as extern C routines _jsBeginProgress(allocate(intArrayFromString('Downloading file...'), 'i8', ALLOC_STACK)); xhr.onprogress = function updateProgress(evt) { var percent_complete = 0; if (evt.lengthComputable) { percent_complete = Math.floor((evt.loaded / evt.total) * 100); // DEBUG: Module.printErr('Percentage downloaded: ' + percent_complete); } else { // file size is unknown (this seems to happen for .mc/rle files) // so we pass -ve bytes loaded to indicate it's not a percentage percent_complete = -evt.loaded; // DEBUG: Module.printErr('Bytes downloaded: ' + evt.loaded); } if (_jsAbortProgress(percent_complete)) { // GOLLY.cancel_progress is true _jsEndProgress(); xhr.abort(); } } xhr.onreadystatechange = function() { // DEBUG: Module.printErr('readyState=' + xhr.readyState); if (xhr.readyState == 4) { _jsEndProgress(); // DEBUG: Module.printErr('status=' + xhr.status); if (xhr.status == 200) { // success, so save binary data to filepath var uInt8Array = new Uint8Array(xhr.response); FS.writeFile(filepath, uInt8Array, {encoding:'binary'}); filecreated = Module.cwrap('FileCreated', 'void', ['string']); filecreated(filepath); } else if (!GOLLY.cancel_progress) { // some sort of error occurred alert('XMLHttpRequest error: ' + xhr.status); } } } xhr.open('GET', url, true); // setting the following responseType will treat all files as binary // (note that this is only allowed for async requests) xhr.responseType = 'arraybuffer'; xhr.send(null); } else { alert('XMLHttpRequest failed!'); } }, // ----------------------------------------------------------------------------- }; // LibraryGOLLY autoAddDeps(LibraryGOLLY, '$GOLLY'); mergeInto(LibraryManager.library, LibraryGOLLY); golly-3.3-src/cmdline/0000755000175000017500000000000013543257426011721 500000000000000golly-3.3-src/cmdline/RuleTableToTree.cpp0000644000175000017500000001347012026730263015342 00000000000000#ifdef _MSC_VER #pragma warning(disable:4702) // disable "unreachable code" warnings from MSVC #endif #include #ifdef _MSC_VER #pragma warning(default:4702) // enable "unreachable code" warnings #endif #include #include #include #include #include #include "util.h" #include "ruletable_algo.h" using namespace std ; const int MAXPARAMS = 9 ; const int MAXSTATES = 256 ; struct ndd { int level, index ; vector vals ; bool operator<(const ndd &n) const { if (level != n.level) return level < n.level ; return vals < n.vals ; } bool operator==(const ndd &n) const { return level == n.level && vals == n.vals ; } } ; set world ; int nodeseq ; int shrinksize = 100 ; vector seq ; int n_states, neighborhood_size ; int curndd = 0 ; typedef unsigned char state ; static int getnode(ndd &n) { n.index = nodeseq ; set::iterator it = world.find(n) ; if (it != world.end()) return it->index ; seq.push_back(n) ; world.insert(n) ; return nodeseq++ ; } void initndd() { curndd = -1 ; for (int i=0; i cache ; int remap5[5] = {0, 3, 2, 4, 1} ; int remap9[9] = {0, 5, 3, 7, 1, 4, 6, 2, 8} ; int *remap ; int addndd(const vector > &inputs, const state output, int nddr, int at) { if (at == 0) return nddr < 0 ? output : nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = seq[nddr] ; const vector &inset = inputs[remap[at-1]] ; for (unsigned int i=0; i > &inputs, const state output) { if (neighborhood_size == 5) remap = remap5 ; else remap = remap9 ; cache.clear() ; curndd = addndd(inputs, output, curndd, neighborhood_size) ; if (nodeseq > shrinksize) shrink() ; } int setdefaults(int nddr, int off, int at) { if (at == 0) return nddr < 0 ? off : nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = seq[nddr] ; for (int i=0; i &oseq, int nddr, int lev) { if (lev == 0) return nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = oseq[nddr] ; for (int i=0; i oseq = seq ; seq.clear() ; cache.clear() ; nodeseq = 0 ; curndd = recreate(oseq, curndd, neighborhood_size) ; cerr << "Shrunk from " << oseq.size() << " to " << seq.size() << endl ; shrinksize = (int)(seq.size() * 2) ; } void write_ndd() { shrink() ; printf("num_states=%d\n", n_states) ; printf("num_neighbors=%d\n", neighborhood_size-1) ; printf("num_nodes=%d\n", (int)seq.size()) ; for (unsigned int i=0; in_compressed_rules;iRule++) { for (unsigned int bitno=0; bitno > in ; int ok = 1 ; for (int i=0; i nv ; for (unsigned int j=0; jRules/rule.tree" << endl ; exit(0) ; } lifeerrors::seterrorhandler(&mylifeerrors) ; my_ruletable_algo *rta = new my_ruletable_algo() ; string err = rta->loadrule(argv[1]) ; if (err.size() > 0) { cerr << "Error: " << err << endl ; exit(0) ; } rta->buildndd() ; write_ndd() ; delete rta ; } golly-3.3-src/cmdline/bgolly.cpp0000644000175000017500000005130713451370074013634 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "qlifealgo.h" #include "hlifealgo.h" #include "generationsalgo.h" #include "ltlalgo.h" #include "jvnalgo.h" #include "ruleloaderalgo.h" #include "readpattern.h" #include "util.h" #include "viewport.h" #include "liferender.h" #include "writepattern.h" #include #include #include #include #include using namespace std ; double start ; int maxtime = 0 ; double timestamp() { double now = gollySecondCount() ; double r = now - start ; if (start == 0) start = now ; else if (maxtime && r > maxtime) exit(0) ; return r ; } viewport viewport(1000, 1000) ; lifealgo *imp = 0 ; /* * This is a "renderer" that is just stubs, for performance testing. */ class nullrender : public liferender { public: nullrender() {} virtual ~nullrender() {} virtual void pixblit(int, int, int, int, unsigned char*, int) {} virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b, unsigned char* dead_alpha, unsigned char* live_alpha) { static unsigned char dummy[256]; *r = *g = *b = dummy; *dead_alpha = *live_alpha = 255; } } ; nullrender renderer ; // the RuleLoader algo looks for .rule files in the user_rules directory // then in the supplied_rules directory char* user_rules = (char *)""; // can be changed by -s or --search char* supplied_rules = (char *)"Rules/"; int benchmark ; // show timing? /* * This lifeerrors is used to check rendering during a progress dialog. */ class progerrors : public lifeerrors { public: progerrors() {} virtual void fatal(const char *s) { cout << "Fatal error: " << s << endl ; exit(10) ; } virtual void warning(const char *s) { cout << "Warning: " << s << endl ; } virtual void status(const char *s) { if (benchmark) cout << timestamp() << " " << s << endl ; else { timestamp() ; cout << s << endl ; } } virtual void beginprogress(const char *s) { abortprogress(0, s) ; } virtual bool abortprogress(double, const char *) ; virtual void endprogress() { abortprogress(1, "") ; } virtual const char* getuserrules() { return user_rules ; } virtual const char* getrulesdir() { return supplied_rules ; } } ; progerrors progerrors_instance ; bool progerrors::abortprogress(double, const char *) { imp->draw(viewport, renderer) ; return 0 ; } /* * This is our standard lifeerrors. */ class stderrors : public lifeerrors { public: stderrors() {} virtual void fatal(const char *s) { cout << "Fatal error: " << s << endl ; exit(10) ; } virtual void warning(const char *s) { cout << "Warning: " << s << endl ; } virtual void status(const char *s) { if (benchmark) cout << timestamp() << " " << s << endl ; else { timestamp() ; cout << s << endl ; } } virtual void beginprogress(const char *) {} virtual bool abortprogress(double, const char *) { return 0 ; } virtual void endprogress() {} virtual const char* getuserrules() { return user_rules ; } virtual const char* getrulesdir() { return supplied_rules ; } } ; stderrors stderrors_instance ; char *filename ; struct options { const char *shortopt ; const char *longopt ; const char *desc ; char opttype ; void *data ; } ; bigint maxgen = -1, inc = 0 ; int maxmem = 256 ; int hyperxxx ; // renamed hyper to avoid conflict with windows.h int render, autofit, quiet, popcount, progress ; int hashlife ; char *algoName = 0 ; int verbose ; int timeline ; int stepthresh, stepfactor ; char *liferule = 0 ; char *outfilename = 0 ; char *renderscale = (char *)"1" ; char *testscript = 0 ; int outputgzip, outputismc ; int numberoffset ; // where to insert file name numbers options options[] = { { "-m", "--generation", "How far to run", 'I', &maxgen }, { "-i", "--stepsize", "Step size", 'I', &inc }, { "-M", "--maxmemory", "Max memory to use in megabytes", 'i', &maxmem }, { "-T", "--maxtime", "Max duration", 'i', &maxtime }, { "-b", "--benchmark", "Show timestamps", 'b', &benchmark }, { "-2", "--exponential", "Use exponentially increasing steps", 'b', &hyperxxx }, { "-q", "--quiet", "Don't show population; twice, don't show anything", 'b', &quiet }, { "-r", "--rule", "Life rule to use", 's', &liferule }, { "-s", "--search", "Search directory for .rule files", 's', &user_rules }, { "-h", "--hashlife", "Use Hashlife algorithm", 'b', &hashlife }, { "-a", "--algorithm", "Select algorithm by name", 's', &algoName }, { "-o", "--output", "Output file (*.rle, *.mc, *.rle.gz, *.mc.gz)", 's', &outfilename }, { "-v", "--verbose", "Verbose", 'b', &verbose }, { "-t", "--timeline", "Use timeline", 'b', &timeline }, { "", "--render", "Render (benchmarking)", 'b', &render }, { "", "--progress", "Render during progress dialog (debugging)", 'b', &progress }, { "", "--popcount", "Popcount (benchmarking)", 'b', &popcount }, { "", "--scale", "Rendering scale", 's', &renderscale }, //{ "", "--stepthreshold", "Stepsize >= gencount/this (default 1)", // 'i', &stepthresh }, //{ "", "--stepfactor", "How much to scale step by (default 2)", // 'i', &stepfactor }, { "", "--autofit", "Autofit before each render", 'b', &autofit }, { "", "--exec", "Run testing script", 's', &testscript }, { 0, 0, 0, 0, 0 } } ; int endswith(const char *s, const char *suff) { int off = (int)(strlen(s) - strlen(suff)) ; if (off <= 0) return 0 ; s += off ; while (*s) if (tolower(*s++) != tolower(*suff++)) return 0 ; numberoffset = off ; return 1 ; } void usage(const char *s) { fprintf(stderr, "Usage: bgolly [options] patternfile\n") ; for (int i=0; options[i].shortopt; i++) fprintf(stderr, "%3s %-15s %s\n", options[i].shortopt, options[i].longopt, options[i].desc) ; if (s) lifefatal(s) ; exit(0) ; } #define STRINGIFY(ARG) STR2(ARG) #define STR2(ARG) #ARG #define MAXRLE 1000000000 void writepat(int fc) { char *thisfilename = outfilename ; char tmpfilename[256] ; if (fc >= 0) { strcpy(tmpfilename, outfilename) ; char *p = tmpfilename + numberoffset ; *p++ = '-' ; sprintf(p, "%d", fc) ; p += strlen(p) ; strcpy(p, outfilename + numberoffset) ; thisfilename = tmpfilename ; } cerr << "(->" << thisfilename << flush ; bigint t, l, b, r ; imp->findedges(&t, &l, &b, &r) ; if (!outputismc && (t < -MAXRLE || l < -MAXRLE || b > MAXRLE || r > MAXRLE)) lifefatal("Pattern too large to write in RLE format") ; const char *err = writepattern(thisfilename, *imp, outputismc ? MC_format : RLE_format, outputgzip ? gzip_compression : no_compression, t.toint(), l.toint(), b.toint(), r.toint()) ; if (err != 0) lifewarning(err) ; cerr << ")" << flush ; } const int MAXCMDLENGTH = 2048 ; struct cmdbase { cmdbase(const char *cmdarg, const char *argsarg) { verb = cmdarg ; args = argsarg ; next = list ; list = this ; } const char *verb ; const char *args ; int iargs[4] ; char *sarg ; bigint barg ; virtual void doit() {} // for convenience, we put the generic loop here that takes a // 4x bounding box and runs getnext on all y values until // they are done. Input is assumed to be a bounding box in the // form minx miny maxx maxy void runnextloop() { int minx = iargs[0] ; int miny = iargs[1] ; int maxx = iargs[2] ; int maxy = iargs[3] ; int v ; for (int y=miny; y<=maxy; y++) { for (int x=minx; x<=maxx; x++) { int dx = imp->nextcell(x, y, v) ; if (dx < 0) break ; if (x > 0 && (x + dx) < 0) break ; x += dx ; if (x > maxx) break ; nextloopinner(x, y) ; } } } virtual void nextloopinner(int, int) {} int parseargs(const char *cmdargs) { int iargn = 0 ; char sbuf[MAXCMDLENGTH+2] ; for (const char *rargs = args; *rargs; rargs++) { while (*cmdargs && *cmdargs <= ' ') cmdargs++ ; if (*cmdargs == 0) { lifewarning("Missing needed argument") ; return 0 ; } switch (*rargs) { case 'i': if (sscanf(cmdargs, "%d", iargs+iargn) != 1) { lifewarning("Missing needed integer argument") ; return 0 ; } iargn++ ; break ; case 'b': { int i = 0 ; for (i=0; cmdargs[i] > ' '; i++) sbuf[i] = cmdargs[i] ; sbuf[i] = 0 ; barg = bigint(sbuf) ; } break ; case 's': if (sscanf(cmdargs, "%s", sbuf) != 1) { lifewarning("Missing needed string argument") ; return 0 ; } sarg = strdup(sbuf) ; break ; default: lifefatal("Internal error in parseargs") ; } while (*cmdargs && *cmdargs > ' ') cmdargs++ ; } return 1 ; } static void docmd(const char *cmdline) { for (cmdbase *cmd=list; cmd; cmd = cmd->next) if (strncmp(cmdline, cmd->verb, strlen(cmd->verb)) == 0 && cmdline[strlen(cmd->verb)] <= ' ') { if (cmd->parseargs(cmdline+strlen(cmd->verb))) { cmd->doit() ; } return ; } lifewarning("Didn't understand command") ; } cmdbase *next ; virtual ~cmdbase() {} static cmdbase *list ; } ; cmdbase *cmdbase::list = 0 ; struct loadcmd : public cmdbase { loadcmd() : cmdbase("load", "s") {} virtual void doit() { const char *err = readpattern(sarg, *imp) ; if (err != 0) lifewarning(err) ; } } load_inst ; struct stepcmd : public cmdbase { stepcmd() : cmdbase("step", "b") {} virtual void doit() { if (imp->unbounded && (imp->gridwd > 0 || imp->gridht > 0)) { // bounded grid, so must step by 1 imp->setIncrement(1) ; if (!imp->CreateBorderCells()) exit(10) ; imp->step() ; if (!imp->DeleteBorderCells()) exit(10) ; } else { imp->setIncrement(barg) ; imp->step() ; } if (timeline) imp->extendtimeline() ; cout << imp->getGeneration().tostring() << ": " ; cout << imp->getPopulation().tostring() << endl ; } } step_inst ; struct showcmd : public cmdbase { showcmd() : cmdbase("show", "") {} virtual void doit() { cout << imp->getGeneration().tostring() << ": " ; cout << imp->getPopulation().tostring() << endl ; } } show_inst ; struct quitcmd : public cmdbase { quitcmd() : cmdbase("quit", "") {} virtual void doit() { cout << "Buh-bye!" << endl ; exit(10) ; } } quit_inst ; struct setcmd : public cmdbase { setcmd() : cmdbase("set", "ii") {} virtual void doit() { imp->setcell(iargs[0], iargs[1], 1) ; } } set_inst ; struct unsetcmd : public cmdbase { unsetcmd() : cmdbase("unset", "ii") {} virtual void doit() { imp->setcell(iargs[0], iargs[1], 0) ; } } unset_inst ; struct helpcmd : public cmdbase { helpcmd() : cmdbase("help", "") {} virtual void doit() { for (cmdbase *cmd=list; cmd; cmd = cmd->next) cout << cmd->verb << " " << cmd->args << endl ; } } help_inst ; struct getcmd : public cmdbase { getcmd() : cmdbase("get", "ii") {} virtual void doit() { cout << "At " << iargs[0] << "," << iargs[1] << " -> " << imp->getcell(iargs[0], iargs[1]) << endl ; } } get_inst ; struct getnextcmd : public cmdbase { getnextcmd() : cmdbase("getnext", "ii") {} virtual void doit() { int v ; cout << "At " << iargs[0] << "," << iargs[1] << " next is " << imp->nextcell(iargs[0], iargs[1], v) << endl ; } } getnext_inst ; vector > cutbuf ; struct copycmd : public cmdbase { copycmd() : cmdbase("copy", "iiii") {} virtual void nextloopinner(int x, int y) { cutbuf.push_back(make_pair(x-iargs[0], y-iargs[1])) ; } virtual void doit() { cutbuf.clear() ; runnextloop() ; cout << cutbuf.size() << " pixels copied." << endl ; } } copy_inst ; struct cutcmd : public cmdbase { cutcmd() : cmdbase("cut", "iiii") {} virtual void nextloopinner(int x, int y) { cutbuf.push_back(make_pair(x-iargs[0], y-iargs[1])) ; imp->setcell(x, y, 0) ; } virtual void doit() { cutbuf.clear() ; runnextloop() ; cout << cutbuf.size() << " pixels cut." << endl ; } } cut_inst ; // this paste only sets cells, never clears cells struct pastecmd : public cmdbase { pastecmd() : cmdbase("paste", "ii") {} virtual void doit() { for (unsigned int i=0; isetcell(cutbuf[i].first, cutbuf[i].second, 1) ; cout << cutbuf.size() << " pixels pasted." << endl ; } } paste_inst ; struct showcutcmd : public cmdbase { showcutcmd() : cmdbase("showcut", "") {} virtual void doit() { for (unsigned int i=0; icreator)() ; if (imp == 0) lifefatal("Could not create universe") ; imp->setMaxMemory(maxmem) ; return imp ; } struct newcmd : public cmdbase { newcmd() : cmdbase("new", "") {} virtual void doit() { if (imp != 0) delete imp ; imp = createUniverse() ; } } new_inst ; struct sethashingcmd : public cmdbase { sethashingcmd() : cmdbase("sethashing", "i") {} virtual void doit() { hashlife = iargs[0] ; } } sethashing_inst ; struct setmaxmemcmd : public cmdbase { setmaxmemcmd() : cmdbase("setmaxmem", "i") {} virtual void doit() { maxmem = iargs[0] ; } } setmaxmem_inst ; struct setalgocmd : public cmdbase { setalgocmd() : cmdbase("setalgo", "s") {} virtual void doit() { algoName = sarg ; } } setalgocmd_inst ; struct edgescmd : public cmdbase { edgescmd() : cmdbase("edges", "") {} virtual void doit() { bigint t, l, b, r ; imp->findedges(&t, &l, &b, &r) ; cout << "Bounding box " << l.tostring() ; cout << " " << t.tostring() ; cout << " .. " << r.tostring() ; cout << " " << b.tostring() << endl ; } } edges_inst ; void runtestscript(const char *testscript) { FILE *cmdfile = 0 ; if (strcmp(testscript, "-") != 0) cmdfile = fopen(testscript, "r") ; else cmdfile = stdin ; char cmdline[MAXCMDLENGTH + 10] ; if (cmdfile == 0) lifefatal("Cannot open testscript") ; for (;;) { cerr << flush ; if (cmdfile == stdin) cout << "bgolly> " << flush ; else cout << flush ; if (fgets(cmdline, MAXCMDLENGTH, cmdfile) == 0) break ; cmdbase::docmd(cmdline) ; } exit(0) ; } int main(int argc, char *argv[]) { cout << "This is bgolly " STRINGIFY(VERSION) " Copyright 2005-2019 The Golly Gang." << endl ; cout << "-" ; for (int i=0; i 1 && argv[1][0] == '-') { argc-- ; argv++ ; char *opt = argv[0] ; int hit = 0 ; for (int i=0; options[i].shortopt; i++) { if (strcmp(opt, options[i].shortopt) == 0 || strcmp(opt, options[i].longopt) == 0) { switch (options[i].opttype) { case 'i': if (argc < 2) lifefatal("Bad option argument") ; *(int *)options[i].data = atol(argv[1]) ; argc-- ; argv++ ; break ; case 'I': if (argc < 2) lifefatal("Bad option argument") ; *(bigint *)options[i].data = bigint(argv[1]) ; argc-- ; argv++ ; break ; case 'b': (*(int *)options[i].data) += 1 ; break ; case 's': if (argc < 2) lifefatal("Bad option argument") ; *(char **)options[i].data = argv[1] ; argc-- ; argv++ ; break ; } hit++ ; break ; } } if (!hit) usage("Bad option given") ; } if (argc < 2 && !testscript) usage("No pattern argument given") ; if (argc > 2) usage("Extra stuff after pattern argument") ; if (outfilename) { if (endswith(outfilename, ".rle")) { } else if (endswith(outfilename, ".mc")) { outputismc = 1 ; #ifdef ZLIB } else if (endswith(outfilename, ".rle.gz")) { outputgzip = 1 ; } else if (endswith(outfilename, ".mc.gz")) { outputismc = 1 ; outputgzip = 1 ; #endif } else { lifefatal("Output filename must end with .rle or .mc.") ; } if (strlen(outfilename) > 200) lifefatal("Output filename too long") ; } if (timeline && hyperxxx) lifefatal("Cannot use both timeline and exponentially increasing steps") ; imp = createUniverse() ; if (progress) lifeerrors::seterrorhandler(&progerrors_instance) ; else lifeerrors::seterrorhandler(&stderrors_instance) ; if (verbose) { hlifealgo::setVerbose(1) ; } imp->setMaxMemory(maxmem) ; timestamp() ; if (testscript) { if (argc > 1) { filename = argv[1] ; const char *err = readpattern(argv[1], *imp) ; if (err) lifefatal(err) ; } runtestscript(testscript) ; } filename = argv[1] ; const char *err = readpattern(argv[1], *imp) ; if (err) lifefatal(err) ; if (liferule) { err = imp->setrule(liferule) ; if (err) lifefatal(err) ; } bool boundedgrid = imp->unbounded && (imp->gridwd > 0 || imp->gridht > 0) ; if (boundedgrid) { if (hyperxxx || inc > 1) lifewarning("Step size must be 1 for a bounded grid") ; hyperxxx = 0 ; inc = 1 ; // only step by 1 } if (inc != 0) imp->setIncrement(inc) ; if (timeline) { int lowbit = inc.lowbitset() ; bigint t = 1 ; for (int i=0; istartrecording(2, lowbit) ; } int fc = 0 ; for (;;) { if (benchmark) cout << timestamp() << " " ; else timestamp() ; if (quiet < 2) { cout << imp->getGeneration().tostring() ; if (!quiet) { const char *s = imp->getPopulation().tostring() ; if (benchmark) { cout << endl ; cout << timestamp() << " pop " << s << endl ; } else { cout << ": " << s << endl ; } } else cout << endl ; } if (popcount) imp->getPopulation() ; if (autofit) imp->fit(viewport, 1) ; if (render) imp->draw(viewport, renderer) ; if (maxgen >= 0 && imp->getGeneration() >= maxgen) break ; if (!hyperxxx && maxgen > 0 && inc == 0) { bigint diff = maxgen ; diff -= imp->getGeneration() ; int bs = diff.lowbitset() ; diff = 1 ; diff <<= bs ; imp->setIncrement(diff) ; } if (boundedgrid && !imp->CreateBorderCells()) break ; imp->step() ; if (boundedgrid && !imp->DeleteBorderCells()) break ; if (timeline) imp->extendtimeline() ; if (maxgen < 0 && outfilename != 0) writepat(fc++) ; if (timeline && imp->getframecount() + 2 > MAX_FRAME_COUNT) imp->pruneframes() ; if (hyperxxx) imp->setIncrement(imp->getGeneration()) ; } if (maxgen >= 0 && outfilename != 0) writepat(-1) ; exit(0) ; } golly-3.3-src/gui-ios/0000755000175000017500000000000013543257425011661 500000000000000golly-3.3-src/gui-ios/Golly/0000755000175000017500000000000013543257427012751 500000000000000golly-3.3-src/gui-ios/Golly/Default-Portrait~ipad.png0000644000175000017500000014430212651666400017617 00000000000000‰PNG  IHDRV&> AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ@IDATxì|ÕöÇ϶„z¯¡7El€l b{ÁÞõé³—ç³ëßg{Å *‚" ‚ôzï-eËÿüf3ÙɲI6ÉîβùÏ'ÙÙ™;·|göÎ9çž{Ç‘ @… ଭd#I€H€H€H€H€ 4x# @"@ ]l6•H€H€H€H€hð     D€@ºØl* Ðà=@$@$@$@$@ˆ€»µ•M%¤&°n—Èmc<2{£S6ìñë½,ÒË…z“úº¬•s¨ûÇé©_M¤y€|78W2ÒÖÖTìz¯µô;Ã_±™°õ©E€ýU쯧ƒïˆ=TæH¥%°;W¤áÓér__Ÿ\r¨OZÔ ˆêfµT}<]ö>œsP·¡¨Ê§RÛVîyj²[>šå’Å·çH“êEµšû“‘@*öÑrN¥ßa´m¶¦«ˆíge½Ê·Í€òñãÙ$g|š&—v÷Ƀ½½1É™@´ZÔ:Ð+M«ävqA^´§2]`ß‘UHöW±CÍ9±cÉœH ÌVïtÈ}½}e>Ÿ'’@y \ÚÕo„Ÿ•7žŸXì;Ë›¥%öWå¿4ÊÏ9@¹ lÚŒÃ.wFÌ€ÊHagõ>¤\Øw\׋µ öWåçH ü ™ ”›&üì1ÿå†À l'àãÄQÛ¯Ai+À¾£´Ä˜>U°¿*ß•¤P>~<›bB @Å+&™Iùð>,?;Îæ5³ƒ:ËL¼÷Ëwl3rrrdéÒ¥Q×^W+’%K–Dž I€H€H€H€H€$ðU€º°ù¦M›dݺuâó•<éÑï÷ˆ Œ?lÇ[6îZ+K·Ì—jé5¤Cƒ.’î®ï"™œäê‚:K¶9dÓ^‡4ÉH«Zq»âTXœ³Ý™-2j¡SÖïqHcmËü’‘,4GÛùk–Sú·‰ÿï#–Í\°ÙaÔ{¿.:Ó¥A@Nlå‡ÍqP»”óÖýi©÷J,dìRgÄ×8ôná—JžX”À£‘íÛ·Ëš5k£ñ–Í{6È¿&Ÿ'Kݳġ¿¿þKŸSIέu›ÜØëa1çmyiãmÅVã¾&oË€NÉÒÍó势{JF^msÚªÎ0º¥l÷l*´¿²·ªtr%ƒZ]#Ç·(½ÎŸ£h…®Gà$y¹ÿw…òˆõ—ó>÷ÈèENyû¬<¹èÐëòïŸÝòÚŸ.Ùý`l¯Ïz}©Í}Öñ-ý’VÆ;ôå?\òü·lµÜjÍt’ã“'yåìN¡¶Ä¢¬XsÏoº>LÏü,MŽiî—Uòñl—Üó³C~¹"W:Ô ÈÖ}"ƒ>õTkî?ù«K^Ÿî–í|²/Ï¡×Ê)]úõeTy‚‡Ñn½¥Î×ûßËz„sŒæû'¹e›o›¥0}摎zjT*\z÷F¹e6ìbS¸ü‰ÀE#<2rAÑë#.Ì(“—|é‘·æHs]‚29Ë!uªˆtªRÀ‚Gb÷¿¤~$v%‰Ü;Ö#7÷ôÊ9ý2j±K¦®rʧçÅæ7U\=KêWŠ;·¸cñècKÓ×L[íS?N“m÷ÅæY‹gãd½&­óÙzOÎÝä ñÉÐ3ô‹ŠõÇæ`:vÕ7ùü§Õ< ãôùIðûlùé²s¿È“ý¼rÛQ>ùf¾ó€ßl¤s±ïfxª¿WníU¼ƒ;<]7Ò¤Gc¿¼yfQùÇrÕ«ÒUž~xü7nÜÕ‰÷Y½zµìܹ3ªô±HtçäA²%°V^îø³Öôh™¹ú7y{Þ“òéîg¥Ý’CåøV¥qµE=¿ðVñHšÜÖáù‚}t7¶?™÷²ÔÌ­/;Ò6É„%£äø¶ Ò˜í|=äšv™_eéö¹òí†7å‘åë‹x¦È3m¿Õ7ÁÕ1YŸÊßòd«/Äí¾ª³AF“‚sã½q÷OõÎæo wYÈÒJ§à‡ºìŽ©´òê4—ܧÆÉMGúär][¿²ÞåÕCþÖL—\ö•GêVɓޙA¶å-«´u+Kú~qË Gøä¡¾¡ŽaÀÇyh¼û \³}³eÿýÕ-Ó¯Ï-Px`ˆu~-]¾ÒŽöÂ.~ÉÓ¾s’^3LpL„<¡õÁ(ÊÔ•¬ËaÆR^8÷[ì’h6±dQò‚ÁúÚ€ÈÊn×~Y¾Ý!Ç`Èòô½ñ{ôÑ>éÕ¡ßx¬Y¥Z?Î'š~%ü;¾—¦¯ùApŸþã’—èHb캣Ùg´÷ÉÿN ÝoóÕ8bhšÜ}ŒOÚÔ ÈçJÚA:b^Òuý}•C–it@ëÚBý^™Cù·JÝ*~³Öãë¶¥ ŠO¶mÛfxñss#[[ÖRâ³~ýzÃPHD¸YvŽ7[VºæÊywÊ?ö÷hv¬´¨õžœ3¥­Œ]9BNj{–Ô­ÖÏK€§ ÑåØx[}<`Ÿ=9Ô¹µªí“cÕƒ~˜ZÙoÎpå(&a§îÎuÈÎìÂÕëª`,ÙÙÓ¸x‹Cîã–ëœR_G ®éá3¼^Õk{¿›&Cõ\ ÇoQEüÄ÷ÓäÅS½Fø "ìŽÓãžgtŒ_ÌuÊSêߨ!TPN^9-OêV™§ЇÔ(gäqn¹çX¯’-=ÚÂLi¤oŸ}I®á)ÿg£CàI…ô|3Mž81˜ÿÒ­¹mt°]ùxôx¯1J„tƒ5=ŒºOæ¸d¡†¢!E/œœ'‡5.Ì i#IŸ>9²‰_¾¨ ¦¡¡ñHicµ+XÜ7Ö-Ãçº4DBŒ‘‚aóŒa~»WØÏôá¿_oãžZ··ÎÈ“9¥cSÞk«¶V¤| 4 Ž0bj2hR# ?gF6Ì4ñø,©BtËn9W½öÏþæ’\ŸCþsBžäùòôd—lב±+Õ¡ò´z7!YjÈÜô½[þXã4B÷NmëÜ¿U‚>ª"›PT¿òS]RYöð¶ø·KÝV²Î`-¤¤~i÷i–ÿÒßÕ:*O/êü?í×NYÜïÑZ¶‹ë‹ÂÓ†/®¯Á(Í5ßyä }_{ ÇAHÎÝ|r²†w¢ï‹§˜iµ´`Ÿ £t°¾•¡¥àvçnùq©Kªzrßq^yåO·L»6xæjŸã³7Gr´÷Ëf}nüGûnHQ×ÜŽþ©:1ÊŒ{챂õ³rý@÷Ñ4 ¸¦§;~³fùñúŒ¬AÄ 4„í`ÒîòåË%åá>sçÎ5 €D*ÿhj®7GãtunBöÚB-¯[­ÜÛü-9¾é Bû‹ûòÓ¢¯dŸg§œÛqˆWû ù'0IvgG7’ѥцê‘îJžy5+©"¥L k­ÞÙ’CÙ'à‘†Ï¦Ë‘ª¼=¬^jx,!P0¯TÏ~=nUþÛxÌÛiòÁ,—¡ø=2!ØÑá —¦"Ì!ºÿˆ7ÅÃ.\Йˆ9«c°BÈ»¨²—¬Ë«iÒä¹t#eŠz‡MùI=2¨3¼&ç ÷H³çÓ¥ýËéFûb½–úÝG{ £å¸wTžè2<Õ´CÌ|¸ìÕþ¸ÿ‡iÒS;°Å·åÈ;¾õªvÔý@§‡·½þ¤qé©«ƒs ~Îÿ>K¯Ã–}A¯ÈÄNCÉoPž,¸%Ç8ïÂÁ';ØÀ¸xT¯Óm½¼†a^â¾#¾þ¼CürÊGÁë;tzPiïÕ,`(ÁmÕ+ó®ÖòɹyÒW{<€NÓ!ð tt`Ùí9r¯PúWî^“•ú"µ§'»å©“òd©?³ƒONÕü·«'gŽš#]¤?óÞDßOtm"x„ŠkK4Ç~^æ26xàà÷;šït^ǸËseã=9r¸ÿ>ó[ðÞÿFo?,vÊôërdåÊ¿†èˆGJ˦¼×*šö1Méà·…¾cƒ:uÆ- n¯Òû÷»…ê¸ÐýØ)©B$WžWú†Q£}ݘKóäÇKsåu ùDŒ=äFUþ›ª1³HC™æÜ˜#3×9Œ{¶¸ºׯlÖ¾}Á¢-NA9P1+._+©_A8²V¨áòëU¹2åš\A¿q¿:1 ÅýùÿŠë‹ÊÛ×À9¼I@G­ƒJx[õÄ£_Bøg¬e‘:ŠÌ> ¡Sƒ5,í>Þ‚Qw°A¸!ä¦<†#hê59òý%y2l¦[àh‚ Í'ë3笎~Y¢Ïœ;öÉãÝÆ|5/îšÛÑ?9µÚ—¨agt«¬QUmür§\¦F—U¬¿Ys? Õ!ß¹¥ÃËiRû©tÁ¨<~;ámºðóJÒAÂÓ—å{ÌMJxÀꃟhy ÷Ù±cGYê“s2*ÕÎce¼w¸¬ýq©Sg€×âiW¿‹œÖñ‚R•ñíÊ·¥™¯£4®Ù\Î=dˆ|6õY>ç ÒóßÅæãèpÜŠ3à’[Gop›iŒ"$cÄ<¿Ü®gŸÌ#V5RÖˆ“»ìk\ÚÕ'בg ±½0ÕmxdáÑpêsívUá…¾KÊÞÖ8kÜäW¨Q€ŽÞ†\ýݹNY­ ¼xÙGie*øoêƒäÔ=ríá>é«s jåÛTuò¬)'èþHeyµ'}fx¢îÒάzºê‰¨ †E?¸UË¿õ¥ùÀHZ·Û!ÿ÷»[âéòçµ9R[czc!ˆ£íÙ$G¾œTþ_žæ4¬áB˜P CàÁÞ^Áœ°À°¯1‡à8Ÿü¦û[4Lj´>à!¿hÇ7Pcò!xÐ_¯aG™ÊCÏÿVO§WÒõáìà0·b´>ài/‹¼¯£ CÔ ú^=qŸjG|·zðàû`P®Ž¼I"…“e‡kÜ&ŒÔ#G7SB½wŸÌvÊý}‚u¾åH5FZës»ŽN|9Ïeü5S%ÆA$¡Ñ*J¿µ¬ßÕÐZ²5Ä)Ý0¼ü½šú囋ü†—†ëîŸ=r*™ÏŸòÞ¥ŠÚɪLÿ¦Ê”3„žà…ïŒöN«Þ.¬FðÝà\ÃC=Dχ câ&DV–9Ïé5¨aêsÉ—ÁÞÿ~­ýrÕa>câ,ê_TYoª·a$³Õ«Ï+žçSÔ xL=?^ê Okë“׆Ú{šv~=4Žò¥?Üòx„áÅ`nÑÿGG°E= Ít²àjŒà«=7Å%—«±Õ[ 2« SÇÃÙúíTÏ/Y;‚?õÓÚéP²rðbMQårø¹¹òáìtÙ¡JÉxõLÞß;؉#`ü ·†„ºxNV«W£B•µŸ+«òNJü1z?Ó"Ès.û&Mní‘Q‡øšm[®õ™¡JSG5B¬’Ñ9¤,uÐklp\çSÚjƒm’GúFžPGãJÿ£÷”|ŒÎà¾7÷êôþyV'ë]ùÃ0ä`Ô5¯zX™iKbSžke–ÁÏè àþƨa¸ÜªÎ{Õð¶ îÑŽõ‚F9”éðãÖ´åÙŽ¶©¢&”ˆ+_ Ǫc¦˜ûðÝã ÈUß=ê 4TMIR\¿‚sT£ØÚw•”ŸõxIý ž pf´S¯º)0l ãFw÷{4Ó㳸ßÛ)ú<°³¯±Ö³¤m8جsð\Aèpuv¡Ï4e𔛜°?Ó²JúX¬°g•–j,×ýâ®yyŸ%Ö2K³¶ L£>¦€{ã#50ýqq‚ÅOÖè³pªŽ”™«[aTû¡_D^Ôg³)Ѧ3Ó›Ÿ¥ÑAÌsÊòzº—åìçdffJ•*UdíÚµQ)ö;w6V²sÍð¸ÒŒÕ~n”‡ÕºÛ%¿­øI~\5\~ÈyG–ÿGÞ>e|„ÖÞõéì×ÅëôÉê½ËÔ p‡qСVðZÏY°áo騰[Á uýÍä„:ç|ßš½AÆï.¯Î»_ÞmökÁþdÙh¢Šð3ÚÞ4Ê-çuv bü¬‚6¨‡!K(ûV©©Þ÷o¸Ô*{7¨§ÊæÕúð€"ŠÕ!LŒõ¼²nc©OÄö=¨Ã™Ó4ŽoŠ®v€¡m /Ãñ_] ñëE Bbà‰AÇ–e˜ê®ÆËË¿»Œ‘ó\õì;å³…¯:­‘;Sn8ò¡‚¿û¼&—èÈÁ"× Y¶yA¡´Éòå í$û¨r{‹*.ð[+[@îÔɧðø[ÿá1VAì8”ÿZzCaއÀŠÇ¨¼jˆ[\¨±ª¢½_'^bmê¢mÁ½µ ؆ò±®ŸÉpÁ>36½¨2¢ÝŽ ž Œ¼@)„ÀSñ¾z.ªéÏëç[åt áÁCè+²…lÓsžS/òê0åLÕ|R'÷WŠ5é{Ž9®üá< ;zC &³LÄ%CµzÍüJû‰©ùZGc1€À{÷¹N†…11ë±70žµ?×:Åœ‡{ ¡dˆ6«?™ó/†Þ—€•„àôgžkÇ'êÞµ¡.7¬^´ÃÏ`å tμrèèÏîä_þ¥. ›`®üŸéÚMܬ¡uá˜ãb—”¶)©ž˜à‰{Ó4j0™Nó-ê|;û,`€Éfˆ~sˆÿß©Ÿâ~ÁÁÿÅõEåíkJõ?}Î`E£x ú<ƒñ‡9y˜ãÅ3üyŒþÏýÿ¨Ã ×ÏëÈ0ž9pŽÔùL(Òæ6¾Çóš#ÿ² Âg1aÏȇ³Ý†BÍÈ6B¥`,… "êlJ´éÌôægitóœ²|ÝMe9³„sLÅž}¬ý_ÒDà54_ÌÀJ@ÑÌ(¡ Qöúód¢o„L_u¥ѼO¡óêUj"¢„¹$g¡ƒ–/s×Ï”õžårWÃWåì.WZŽˆ\ûcùcÿš‡O=–Á›­P‚ü/Ç꼃w4ôhÅŽEÒº^ÇHIlß÷††» Ä+)ÔQåÔs˜x¬®­ Oy¸XGL6Ã|‚ó˜rx^» Áž:g¤*üá“d¿xçÑ^¹Xcgéj-jåk[a£-"®#‘xÓK‚I³5+n/öÕË÷šD:¿´û>:'OWçðH+ @¬áNÕ„G¤†M!&\,ÆB¦Po¬àp߸`ÇŽxL¬Ôc âüÿ¥!Xwl?VϹY'ô=bYfôbCqÿXÃÞ³WNϋɋÔ0|üÅùyƪ˜,Óz5¯þ’†šAPæÑj¼µ|1]×¥Î3VUyOcc&„{É¡WvóZåáf=ßL7b‘á¡|CW$1—yë\?4’ar°ûó¦#t$J0´`ÔaÙZ¼[“á¯ÖPµ êej®íÇ»ŸûZ/þ¢e3cmÈ@²»½,ß^%ö#¥¨úG(P‡¾žnôu-´_Âh–÷=WÕ¢Äî~1ÿWêÈ3m€ƒÏüÖ Åýûµµ ïâú¢òô5Ëwh¦:¨0ÚËgH¤ëñþ_:«¦4U- 1W$\ÀíÚ‘iúBº1¢ˆçÉüÍAõÏUãf˜•Â(@FF†1)oÆ$á¢Ä©¦S£F¤N: ::³ŸÔ_Ô\ž{©Ü´çé×nZ†é2iÙùzËkÒÒÑE—mPTµýü*•½UäŒÎ—n@³Ëä™u×ÉèŸë‹ÂpÜÜѸF csÓžµæ®¤û„w±Éˆáïlñ>à e^ £›‡:Kx2.ø"͘D ‚¥#±ÃLŒ…uøoéVåÏi(yåmða‚eÀ›n oİC¬q ÆË?xêÞÒù˜UÝò'Äöaõ¬LcÊõ´ß—7}ð*a2е•àƒIÔÙG¡¦† $ËtÀ{ÎwcéΓ4~+}M­?tVÁ0®5=”dëw¤…—ù)«k½K³¶NhÆdÝåúކòÈ úàuC®±Ê6Un1©.üeYcuu«œªL—µ ¶«®z¥`XÌ_;ÝkŒ€IøqkÚ¢¶ƒ1Ø¡û·¨tÑîßóPÑœ.éæWÏ~Žá}CJBvàEúæ¢<㌄v!´Í”hÙÄâZ™eòóà&PR?‚—mÐÕ¨LÁ=Þ/üssè7ù±öƒXJý‹ùÛÅ*2ðO¸2”Î A¾Åõ+xIcy¥¤~ëÛOÖÐC(j˜ïcÚ”’~V%õEfžÅ}Fêk°Ü²µó|ôÑÛï]sY??T§Ò‡ç¶õ"”ðS½Þ`†~#0ú =ÈÐ¥CçÝ’kŒ²âøµº:Ž9g ¸knwÿ„pŸ~ï»ä]­#"hü4‚¹*ˆX¥#6æËüpÞWºP‡U¢Mg=Û¥ÑAÂÏ-Íwý‰Ç_\.—4kÖL:tè U«–<™Ö=@XP¥J ,NUMwW’—þAš9;ÈÓk‡È‰êJïqòÐò $ÓÕY^íûC±%ó?-gŒæé'n§þBÂ+ Á8ønÕ;aG EèQš/]þØ<¶ð$û†ÕazéJ8ó,K^းú§tµ abäIº$è]Ókœ›Ê8:Ž74ôÊ%<ÁÆP ƒÛtFÄ\1SW…iy%°À|ƒûõ!ô…®s±.k†:¬ÕØÅ%Z„ˆ`ÙÏã´“5߸©,¬&ƒ¡ìAÃÓËš"öý]õ”`0–µ*–¯1Û‹ºž=Üc¬lô/‹Ç½„*G}ÆHg}H[•ÿâNƪáÊqé#CgnUþ#¥)ë>p„â‹6™ D4y¡]Ök`=õŸ¢Ž[Ó&Ã6ÖL7•Ô÷¯u\0¬ŒvE#ű‰æ|¦±‡ú¡¿uTË cyÐxJiû‘âê‚°ëo7Ú¸d»ûüÎ¬Ê¿ÙÆ’~f:ó³¢üÞ^×¥¤¯Ó%a±Ãh]9kþcA SÎù\Cdu¥¹9ªà9‹%má̰J<¯¹µœÒl­z V¦£°XõÊ\-°¤<ÂŒwV` ~Ð]0¯íA}?ŽU¢Mg=Û¥ÑAÂÏ-Í÷µ-Í™eH åFÀæÍ›£š$Œ° Œ$",¨Y­Vòæ)?ëà¶ËâMÿ­kWÿ©Q¹vÄ–~vêÌ‚ýë{ꆂïá0 ƺ¹`÷÷§­(Øߘpʶð]rS¯Gå&yô€ýví€r5TÃ+Ž–Vú`¹É4]FÀýjÃ`DŠ?^`/<ÒFDÈÉ}9•)x©U]aËþ¢^_Ä#<èA)€‘0ç¦7É<§¸O¬dS[;x,AúíüЬ2tî˜øcõ4E* 1¬ºbY/ Zar/–½;ßK: îëúìh/É]/«{PGà|0ïå<×–TÑàe}PÎÖy6ïi8dx?SÑx°½ÉEàM}†#Tñ¥ßÝ:BÇô%Œf¨ @Ë–?¦ŽÁh&ÿšíá‡6^­Î34ä‚ùŒ³;ó“8Útf¾ægitóœ²|:²³Ã^1Z–\Êpæ`n&G#x_ÒcT€’ü04†!gsI9;jŒX¼5ºŒ±t¥Xª V{i¤°J@¸×ýS]±eˆÆ’fÝ•£ññbxÐ1Â#V©úxzġ߲ä•,ç¤b›L¶©Ú¶Tm—yÝRñ³"_³ŠÜvÜËl¿ýÏM„æ" Ê\!©¨>&Útá祃„§+Ë÷„ŽX+h†ùX÷·‚¨üG(¹ŽYãâìªB)P¼¤¤¬‚Qü'¡÷¹8BØ_•Ÿ+C€ÊÏ9@¹ ¼|jž´{)]—-uo†"ÆhŒrceQÀÈŒÏôE6þ»·FQ4“Ä€ûŽ@d öW±»T¶½ vM`N$öè;ðfA¼·`ã¿N ÀKȌɩÑD¶"‰`–ÊÅû:àE†"ÙDßÌL9øì¶ô›Ì¾C߃B!T!Àþ*öW’@ì™2G    HZ :NÚKÊ‘ @ì Ј=SæH$@$@$@$@IK€@Ò^VŒH€H€H€H€bO€@ì™2G    HZ4’öÒ°b$@$@$@$@${4bÏ”9’ @Òpÿþû7I[9VŒH€H€H€H€H ¶À_xÕ…H€H€H€H€H `P¸Èl" ˜h˜$øI$@$@$@$@€ € p‘ÙD    0 Ð0Ið“H€H€H€H€*à"³‰$@$@$@$@$` `’à' T4*ÀEfI€H€H€H€HÀ$@À$ÁO    ¨hT€‹Ì&’ €I€€I‚Ÿ$@$@$@$@$PШ™M$    “ “?I€H€H€H€H  P.2›H$@$@$@$@&& ~’ @ @ \d6‘H€H€H€H€L4Lü$    @€@¸Èl" ˜h˜$øI$@$@$@$@€ € p‘ÙD ’JJPÄñhÏ‹6µ˜âÎ)î˜5¢¶ÍóÃ?Íôæ~|ǶùÝüŒ”ÎÜé3ü¼Hi¢ÙgæƒOs;šó¦´é£Í—éH€Hàà#à>øªÌ“ @Y ¨¨¬.Í€ aY)¦ÞyGnðOt›B$@)N€@Š_`6H (TôŠ"Sñöó^¨xל-&ŠM€!@ûú³õ$@$@$@$@ŒG*ØgsI€Â8þ¡„%yXYW¿?¬–¯Î|¿N¢ÚcÖIL’Ö-€?K¢Ù4ó1Ï-ø~\—hÚÇ4$@$Dh$ÑÅ`UH€IŠެœ·LV¬Ù!u:t’¶MjH%LH:A]÷Ëš%+eùºö–œ9àùñïµ’­B‰bÔ{·Ìýû¹xÀ2uåfÉöï“sþÁú}Êò ²'ÖÖ3e  â°W-Ž‘ ¤6 —ñ¨—:'w³*´ê)wX=ê–¦CI…2[èÏT®-ÇâЮÕH«Ÿf2„æüYò2Ï ž™ŸÆrÜ™ŸêªÞü5’.éénIséP…YäÐ?GiÙ¬¥N2êamW>Ô[¹4f(7°_Ä|Áïyø®FŒ«àÜà9ÆUŠÄ¸P%ù…H€H (ÚSH€H â0õàHz®AE•ÝÀö2æ›qòõ/Ëe¿*¬õ›·”S/>MŽíÐXªd/×cSeÜL¿\xû)Ò½e#É^>C¾ÿq’ÌØÛNn¸äiÝ( Ó¾Ÿ –8¤g»tYøÏBù}Ör©Þéh¹öêþÒ¹©†ê RÇ©žðñ“äóoþ”¬Ùâ©Þ\μb œxhs©–Ž:¥»cLÿñG™3bŸ,Õ ô¶ÇÊ× ›ÔVûEUã<Ÿøò4¥Ž¤kÚ¿~œ(?Ï÷Êáí«Êòù dòôe’Ñ¡—\£åÚ¢Ž†Öè9Þ-Z¿qòáð¿dKFtbSÉݱYì¨/—_p”thQ3ÎÅ;{¥ÌZ²XFŒZ-»®¹YFÝÑOº¶®¥…zä¦u¤nöSòø»_ËÒ«{HÛÖu¥Š†&-š2U>úx¼,Ø’-Þ<—ô<ç¹êônÒ¨vð1„Ö¹ ¬%ƒ¼¸•¥r%¯,˜6Ef)¿-Ž—Á'*-T“ sgÊØï’EµŽ’+ôÐp§*ZÇ" ¸`vüO$@$O€o (мà{–ʇ}'o Ÿ%{¶í‘m>4[³ZF½·JÞz³ôª¶GV¯X(/½¾\z]ÑGÑp•½6È’?§Ê‹ã½ráÙ‡kîY»vüôÉt™TÇ!ë×´ÊRcùrCvMùøæc¥U‘ÉŸ’w^U¥67G¶ìòK­ºeúyó$ç«dPJâV§µÕdÊSeÛÆ=úJƒÊR}ñ'r­£º¼ݱҦqž¬]¿F†¾8NÚžÛW÷¹eÃúõòãSdRC·l\·S²ÝéRsÅ—rsN yÿæ>Ò®™W~ýú'yí…Ÿeu W¶í^-ë–T—*®ý2nMWpzWñKÍ‚)¾âp‰wÓfÙ¾nµ,ðÕ“÷.Yäè.wŸÜ^Ök$5ë×–Ìf5Ä¡¡EN3–I«àÊרƒ~Y.­ä¦ÓÚJÃúe§–[§Š(W •ýªPïÚ¼PüÞ%ÙNZ5¯'uì*Kþ™)#ßR)lh”‘†ÚäùÔſͭfÅ$ÝýÛdÕÒ©òÀËëä¸NUdí¯´=³Ô×ðŸ]›–ˆ¿ß9rÊ¡-¤aê"‡u–ž}z‰|ñ«lÙŸ+Z›Ðƒ¡nû½^©Ô ™4kÑIŽ—á2KWlê¦s¶¯œ-þ“N’¶õjK†9Š—B$@$%Q‚b2 Ô%57]z'ÔP‹"-ä,ýM¾üø{þK–d¹È=kJ]_®ž‘ÄQpªÇãO„¨¯æoƹ§W«"•ª×Y§Ùht¬@yªÅvÒ˜ùô4#ïŒÚu%£v­W».Šwg`¯¾®J·†ÍøÁ•6usQó—‘‘Wl´Š|z•Ê’^³¾–«™åjtâmZ½ \¬•Ve¾R•4I¯ª^õˆ:õ«K½Ìvõ­ÌÛ>@:éääZ5[IÿÁ÷ÈüÈèQcäîIËŒæçÔü¥YMI«T)˜cåJREëQ“’õv¿ø5¤]‹ÆÒÿ¼ö2rÒ_Ò¤N¶¬œöÜpÙMR§¡2D.¸nƵÓF™sÌ}ïDÐ4ÆPÚlÄ&r' ¤8Â.ªo,›G$@‘¤©^¸}çNõ†ï”}»vËÎâ²m‡*ž~Y¶p£,þcœLîq‘ü2ü yåÑ äÄn UÌ“<Õ!±bs;dož[½ïy²zÝYµl‡ÜP¹ ‹¹GÍ…|…U«¢ðëÌ]Oeq¾÷›¬Ø»WwúeÚ×ßÈ®g˽_-m{üâq¡Ë@o/VÂú®e9 E9˜E–Cåzâ}]CvVl’\8¼lùj™3}U¨~ÖÒ>q7h$udJ'¤ûäÓ#eòŒ’“^Kµ¨!y;·Éò9+õÜ ä×ð¨@z†8?™!+¶íÒE~Ò%wŽ¢,^¢iªë ?ú‘Ÿ¡zZÊôiëµn"-9NfŒŸ,?M™)ïþ~‚ôëXWÖF9:‚²i½Ìýãoù{ÁFÙ…å\^Ù´z•ü9u®dmÐrÕˆòïß.Y çÊ´™KeÓ6]a(rÜ‘¥dn’ @jà@j^W¶ŠH JªvKZû2ïóOäÎïÓ4,&8!uÿúµÒëÑ'¥Ï~¯Ô¨ÓLê,#?}¿G>_¶T~Ÿ¶XuÎtIs¤RýºR­fméÞ¨†|ðÂ0™ÞÀ/›Wo’µûuUÕM}u=M·1vòz«¢ªžè s©ß!Sê´?TªÕúG^|æC[3[6­Z+-È’aõ*K•Ê=/ È#OÏ1•e8²!S Fýf–Sè;Ò矓­+ÕÓr›tê¢Êð4ùôùWdÌ0·ìÛ¡áHû´þ--FŠ™;^,–ÖTŽ=¢“\råòŸseØ«åëÆÕÄ¡!JÛ×l’;0sÀ/û5ÿ&]ZJf·^Rÿ­Éò¿Ç†Ê”öjdm•y³æJ`Ð¥Ò¹N]5 àå7píȯžâÓ¶"'¿!Ôj"Í·‘³·þ&Ëtð ï‚þÒ¢fÑM•€,ÿk®¼sϳòÍI7ËÈ›O”n­så{pÍEßÊ£ãþ#g7l Þå‹dôÛ¯Ë-#»É¸/Ï•ºuZ踈Yš‘ÿ‘ @… @ B\f6’H 2Uÿròô-´kdç¶Ý’fÑ7o^,í÷äJ‡cSoõ"©ýÈoòòâiÒæ¤Ã¤jÍ*’é/oY&=÷’þ}º«B;Ož>]Æ{›Ë77‘lï6qÌ7½í~ñê„ÛMm¢ÑA4Òe÷U¹ÍÙ¤[ªPûTÁ­Ö^.8«Ÿl^»Iykª¬ní’ WÊ}½-§uk®o(Þ"9ûÕ(lfÌCÿÜš‡/ý¢[ޤј ÍžuoNŽ~ߤó Ìs´\œ£ž|Ö õdÊà+ΓšU«ÊsÏü ëv”›ª'{2öˤÑ9âUå†Ê+­¨Ó½ ¹³ª¸‡~*÷¼ºH'êV‘Êéˆ;ï•ëšï‘®yã%WÙæ¥7‘Ó,ÏnÞ)÷<ü›¬^®£›VÊúËO/]Úëò¡²I—Í‘²Z ëÃóé÷ ú= –AÐ$«*t2ð±6‘Ï_/÷ÞÓZêªÑe¼8@ÿ;Ù²céjY}´¦ÇR¥*þ¼ý²Ê?W´†`®EÞ.e¾y˜w€th…H€*]6ú/Ë#¯b5ž­%¨h´» ¨Ï85$  ´*¸ðj[ÂbŒ#êZwºt¢¯Î¨ äí“Í[wI¶O'ÐÖª*é30ò]âqâ«íÙ#;öêJ@•ªJF·¡|£suëq„¹ „¹<eÐ’UÓõjÌ¿_Sº=:#Z¦?{lÔUvvïÍ“ õŽ×®©/ôRíJ°W=ì>Ÿæ¡yºõE`¿7˜‡*÷åJã0&{#£ùytB°ìX#Óç,–yËrå°Þ‡É!mɪ cäž’§Þ ÿÜßO:·R%]_˜.`à÷î—m[vÊÎÝ9â®VCùdˆN!PE^q]È¥Çû üþÙŠt;÷‹#­šÔ©]]ªgxò'/«Â¯õÕ³p½<•$gõ_òÉ{ïÉgÒdÔ¯×J¿#Zé‹Ü0Áåá|X:¹YËĻìy"XAæeŽë¢û Q€ŽýÃø Ì& ¤6ޤöõeëH€Š% ÊwZÉÝ #­ªÔo¨!1*Öøù`ÖPóõ¥[Õu¥ÝVC"’ ‰r¬%94&Ý“n"Áœ·«r†4jRMªÒìPeÖQ0»Wë Å¿ =!Âitr1 ¢ÎÁäâÀ.Y8sª<ùÉr9düLɬã—Ý[6ʼiëä°›k‹Û˜¸‹6(X–Ô•VE=ñ•u2®Ñô>¡2õ $ (ÿ‡K—ûR‹ÅÞ‡sR«AÚšª§ Û•Ü—uå‘§&»¥áÓé²øöiãG; €ä¾þ¬ ”HÀTþ½^/€i1 |?üp1ÿzôèq@fΜ)3fÌ(ø; A‚v<4Þ“rÊ‚б8€@‹š"Cz¥iõ€Ü>Æ##.È; MyvÐ(=žK6عs§deeI›6mdáÂ…Æç²eˤeË– °ùÚ°xˆ믿^®»îºb³‚Q€?¤6l˜ :´Øôñ:øÛ*®+/¶Ì·â¸´«_>œ{u¿ÖŠ{O±å9SùoݺµT«¦Á‚*øÄ÷+VF($@'xügÍšU¢òÞ:8ç'ZÖ±ËI4r–W´¨{bßP±gÊI îî³zõjÃão*ÿf¡øŽŒ ø8ÏÄÂO8h¼ýöÛòÖ[o•«¾8ù$Rüœð›HÜ,«ðùcßX±gÊI îÜn·têÔIªV­±,ì?äCÄårE<Î$@ÉIJ{¤8ÿ²Ôù$Ú(K=y @ñ4ŠÄ£$P‘8ÅÛï%¯H¬ØV8 l'VÊ¿Ù^ägG8Y>?I€’“@ìg$g;Y+  Hjå û)ªqÈ·{÷îE¶mçiX-`”ïUçÊYµÓ!þ8x;íj䨥N ¶0XƒÖµ‚?SVnÙ‘í®BûÌcÖÏhÓYωÕö‚Íù5Ë)ûuš.zÍNl凮S_’äxÅ8¯›ä½ s7:d¾¯¢w ¿TònÚ;y¥S—ß HçúÅ_ŸÂgßbb,^¼Xrrr¤K—.[½råJÙ¼y³áÙpDs×DÌ%´Ë5kÖL4hÚí¥K—ÊŽºk˜ œ¢råÊÒ¨Q#©Q£FØÑ²}w[ÊV+žUwŽq˰é.¹¬»OÞÐ%»Â¥ÇiÒ£±_Þ<Ó+ßÌwÊ%_zdÁ­9Ò\—øŠVpŸ%‘¼{¥M_TÞðÈÈ…Gðn¢·ÿ‰-}òø ^©9 ©¨,KÜÕ©"Ò);ÜÏ}ûöÉ_ý%Û·o—:uêH·nݤJ½)’HðÌËÎÎŽÙ³«ýÄS¿]«Õ®»ñÊqªx-Ûæ0^|„ÉŽnínüÅ#ŸÎ.Üï•G²ïô™G:Ö HJ">Õ!çlpH»º60OmQ‹]2UWOúô¼â—xŒ6]¬y<ù«K^Ÿî–í|²/Ï!ÏOqJ׆~}9UžxJˆ0ݪïƒô©§Üï½Ø)Ó×:å‘ã|¾–²µe@IDAT·½ÿûÃmÜkoŸ•'ZØPùjžS®é‘Kºùdر/»¼u/ïù11Ê[‰d<á-Z´(T5<”ð@‚Ю];ÉÈÈ(tœ_*lí³?ûÇ%Mõm}#æ¹ä¹þ^©–‘ý¢J**mq†AQy¥i/ñÚ€ÐÃiÝ.‡Œ_á”f»dÞf§L¸"WJˆF**ëˆûoüÞ#}2ýòê€Ôëp#6˜; À2¶Ï>û¬ìß¿_ÒÒÒ ç&¶ßu×]Æäv$~ÿý÷¯Î=÷ÜBçFú²eË#}ÿþýåÐC”¤Ôû0 ÿå—_6&âã³¼‚ßkIK}–· äßYú€ò–]Üù#ºNSŽÕßþççÉ–}ùyIj/œ’'½3ƒä<(}éWyýO— U¥òÚ>¹ú°äœ=½y¯ÈuËôës 2ëu¥§Î¯¥ËWê̺°Ka…Ù¼†±þ„‡~¶Nñ<¿ñ< 7°ÇRURãׇ«ƒ‘ xž¬uÀëÓ€à¡B!¯Õ;¾[_ùáÙy²?Wä 5RMÒ´IƒÕ3bþÝ}¬OF_š'çâ—k2s]ü:æTcÉö”L`øðájP:åÅ_4VÂyàΗwÞy§àd¼ó†B4OýìÙ³eëÖ­Ñ$/6_cS^zé%¹ãŽ;dΜ9Ŧ-ÍÁ¢ öÒäMÚD•M]ŠJ󛆚 ›¡FÁÑAÀ­GùdÈ>ùwoŸÌ¿U;Y•3:úeæ¹²ýY¢oH½VCz·ô˘ËBΊóUAýýÚƒâè꨹0tÜ8)Áÿà5?ACh¦­ ª_#ÔËüðøôÁ,—t=Mj?•.}ßM“kì_U‘;Ôhò[`PÄKöäËÞ™*¡‘¾vô%¹: RŒ¿˜ë4êÜø¹tÁ¨ñ5"ÉÒ­9ý#4x&]úhÛ&¨#É”ù›ÒÿÔÕ·Þ¶ÿ_š ÕQuÈ S\ò„!“4§ëki§[¬åôv~50œ²Úøp48¸Nm[ØÈþSš&õ´žÇ¿—&¬2B¨êo•ƹ Úzßý£[2_L—N¯¤©ae¿®ºë¬µŽóö’%K¤víÚ†"Ð £VªTIš4iRèåEæR‡{ö쑼¼<ÃãŽ4‘kžoذÁxPàáUPš6m*éé±uÇ"ù[C™ðPX»v­`]vÔÞª† ¬ÍŽú&c["qä¾Òxo–[Nlí—#›äXÊ~÷/—\•¤ÞœÒµ¬äÔ'·ñÉð9ÚiêˆÀåŠ^[þ¹vkt_%í]Žiî—ÿSïW‹ZÁü0üý>ìþXíÄüb(üΣ¼ržã–éï·üzgi‡ü˜ùž¤|! ƒ`öFÓP“5®ô¡>Þ‡¡ƒ%óÿÁBΕÜÜ\£ÏD?Û¡C¹á†ŒÑW8_þûßÿʦM› …ÆÁ#ÉÔíà gÅ)ú}Ñ–jKÑqß\¢JðÇêYÐ>دm×øÿµÚ_BÆh{øÅ-Ÿœ›']êûå•in9çó4Yv›z™òó#®å–Õ:WâK}3lIa8æyeùl©ìÐ7ŸòQšq 02ÛWÿzéóΔ‰ªÄ?¤uÆ5@zôÑŽH“q:2l•}úõ´ÓäAí³‘ ý`5þP­níÏ?L“ÛzAGèT}>\¦÷‹ÿÊé^IƒÖŠ<Ïéä“Oæ¸ Cõþèo§œ×Ù'p€íÏŒþY•üÛF{äc½ÿz5óËpý?UÙüsSŽ­Ïº¿4¼÷ïõé¦ó9°lç»äçË‚þõ³Û˜ë1ãºãóR½kW¹¡g-8눰2¿"Œ×®½{÷3”t¤Pê±^9<:æºåø\°`ñ2£úõëá8èœÑÁ‡ <;æ~xé£áãùóçŸáéËóJ>~3ü¤E‹ ÌI@ù8ŽúìÞ½Û(*YÛR¶1ù ‚¹xx`òÜëŽt®vÖoª—ðbíp)©E OŸ>†pï½÷ÊSO=%£F2Þl}ê©§Ê=ŽÃÉ'ÒI'd,uûúë¯ËòåËeðàÁr饗ʼyóäË/¿4ÒôêÕËÔ±cÇ‚‰°~ø¡üúë¯Ò·o_8p Lœ8Q>úè##<û“&M:à¡3pþ\|ñÅÆ_­ZùVm ðÇz埢ª”¨rŠ*?ÚýûÔ[®è]© Ó„åN#ŽþL+ÿVû8²U9ƒ’VScì¡d«|’zØ!PTáIÆO&¯ŽZì·Œ úwþiÒìùtiôlºùfš4×>ó ý —·ÕtÃ^#†Î½½òÔIy{L‰9W§sÈÔ3üx…›Zëõ¾öåðøgjŸü©*Èð~cd“’!eº^G`p#ÿ>Î+ÿèÄÚpCkä"§4Õþý:œ?G«}Šz×?ѹß-t†F—k©R £î[m ƒz:Ǭ¡F[WÕçFjßÇE.íꓵ}´ÛØgŒLݨ {?u>e¨oyÈá>ÃñEõ;KG¦¾YÌoÅÆó sÙàý_ ÔGúz9.h׿tþËÛ3/ZÛ[Êš}ÑÛðècrt¨Äz"¶JsÍš5 C·XëÜœü…pœ5kÖž~3g(ÛØW½zu#.ßÜÎyîܹÆ1„í”V Ø#_SPêƒúÁ`ÁÃOŒ ´m€ ž0Ö¯_o Hcg[ŒJñ_Ì À㔡ùžœ³:úä6–}W÷ÿ¯Qêįçigýµ>lM·j¬zëñ =¬I@º«·æOê·Š¿)XÑã }@@0Ä»K‡’oêé5‡°ìàéY²-xnÇzÚ «w¬›N2»÷¸`çk þì‘ë´³}þ”PÞGéääÒä75ÂŽm¡ ¤³Î:KZµje(àèÃáÈ·¾_¿~rÙe—ÉqÇ'?üðƒ ?þøã6Ã8¨[·®dffÏ<3à`B?}ä‘GÊ7ß|#íÛ·7æ œÊ?Î9ýôÓó·mÛfä BŒÂŽ¥ƒÅƒ^÷ƒí;äU‚aŠ.ƒï;÷‹¢JÕ#}s gÁÂ0>”I(–èðöÔ1K\r¿*Ò诱âП¶˜hyQGA{j_ i¤N(‹‘$KG-w õení:ziʪDcÒô|]•#mê„Òšibù¹G ¬£ýë1-‚}/æ\öMšÜ¬žðQç¸Ç¯p˳¿…ÔI§"Fý:éägS–ëDïê ëøJᨌŒÎúüÐDðö[£ ‰”#š' OUg”×ï*ê[ÂÈÑçsCµÀõ¹ðÂFAgmcVþ½:¸‹ê£ÝòØ "ßjxðEú²RY¨ )ǽSøÂW¶Ùºb¡6&d »©ü£@xt æm„ñ˜Ê¿qPÿa4¡>¦ 3‡1Ѽyss—ñ‰%AÇC ,…aEVÁ°4ꌼÍ Œ , >þLA½QO„þØÝ³NüŒxž ¨R¥«Vxõ{eý5 Сj >u’Wªþ­Ç®ð産ދKÃ<íuÔ+sŽzúáÊ·áeÑmÁ¡NToÍN‘¿uw”>Œa@@3ZS½;wýè‘åÛ‚¡=ÝtßH}ˆ'sÕpØ ?Ŷú°ƒ²oä˱ù'ë1n|Š~ 0Ü|óÍÆh*”qxìÇŽk(ÿ-[¶< aè›ñ«uëÖJ?ÂF‹’7ùˆÀŸUpìî»ï6Ž[÷cÛìóÃ÷ó{ì ÖQÕ‰:À̳2å\ IAØÄ‰ï§ýÞuxv§PŒLþWû_x‘'i35†þÐ~ÁR”£Õ€³"ÑÏw4Êzõ oÜêãFòâT— É-8ªyÀ˜u£†B]?Ê#c/Ï›GŒ0§ žëIW‡úv̸²»WÔ^kÛníå“Ëu1š‰¿yj„{ÿQf­Â[­²V'(cô‚öíó:Œp5܇¯ Þ—ò—º]¬¡\9€ ¬iãžÂy$îL €’:FxÓ!ÖtP¢‹(ÓP¬Ã^vk>¦Ò)Öû Èãá`zçÃó+ê;–üÄèC¸`˜ËšÂ`Aý7ZŠ$0NìnK¤zq_ùŒROÌVèô¡vŽø ¬pi·|Í7üàAö½ªvX«î =`Ñace pùK½;OëÄvæê³ ½zt0Œ½"bΙrM®çÿ’.½öŸ‰bI0¢ðÀÆPo$Y®^ˆu¥k:¬AI p–<ôÐC†gÿª«®2.è‡{÷î-Ÿ}ö™Ñ׆·NÄùŸ|òÉÆ|Ì'ƒ_”˜K8_rÉ%#pö`…7ÌÃ$dôñႆk¯½6|7¿—“¼ÜéªKâWÜL=ÿ÷ë5B=.¡“Ñ4€ƒNÂO pÄ@Ð/c´Jé}cÝF,ö?:osÔXõdÌ @hãêeF|8æ”A‘ü—†Æ@ê©àPPO÷óJ÷7Òå oBHJ¼ä5¢îÑØu„ù`Ö¥Œ1*ðù\uº4>ßÎëì7ŽÐÐ,ߌ¹\©+Yå”¶>¹W¯Çuâ`Da‡ŽäôÖP¢Ou¾æsáÞ5Ï? ¬÷û`.m3BHã-0<{ M7ÂÌž8á@ÇÔj|þw’ÎËÐT,ãÐUè¿^¬œa!¸_'ÿ¶©í—Æjô@ªk¤æ >©ç>©Ï:¿ªÄÿúÉm„;YG̃©÷?&¿(×è@¡è[•s³P‚K«€#½9`æƒOì3 |7'm¡ŒpÁ>Ô§$c#ü¼â¾#ÎÃŘÇõÄ_›6m"ž†ƒdmKÄ sgTÐ1crÙ£Ö%¾w¬G‡›Ýj$ ÇŠª¶åK„sø RÂsİ0&Š!,g¢v†ò‡~1'`æºP7f˜Ï^À2B=?/ÿî2^Äòý%þ†QNc2‡ŒÕIe7 <(©AsÂàáGˆFp1Š9¼ÿUÅ1ú}LFب9’ gúe¼?a—˜§Ùÿgeea™åAX(òD¿gFð\Áœô×0"Âû)±'€%0ñ‡P¼!:‡«E>’`Å™«Õ#¾XWÿ"…WL~Uç£á„Äùé0U€À)qÖUgŒIöïzU²kHS‡—Ó Oqû:~y¶ÿýb ½=_:5Ϙ?uš†;¡_‡ _,Éz§*ôOtK}½^.MAù‹UiÆ‹Â:ihê…øvÌñ‚ag•äñžÎûBøúl2Wvóa6H÷ÖyÆ;r0÷£Š'`,ð€¹`žMýò¨–ŸñDºlºWÃÁËl‹å?(ì‡7ñõüƒpÁ¨RG K×9'㽯i[­/qƒñÒT]ÅHÛcÌ]»ê[ òBº1¿¥»†¹>Õ¯pkúDl‡žÌå( Š0:O(Æè´­‚^sÒ¬õXqÛÿÁpl¸÷«à¡€Ê6=;8Žú ­yÜzNy¶ÍQ Óà@=áBy50uÇ0tëÖ­P¦dl‹YW~–Ž–3V>Ð =X!!\fmðÉÿtØ"^“(±3>“}÷ªg“ÖLåíž·)ß-§Û?êšÞÏüæ–o/Ê5è4»ê\ ðüE'÷%xó$ ¼‘ñèæ!oÖ¨¾@'×aÒY2¿i²¨vqd·Þz«¼ûî»Æ$^3<óX ÈTÌ1±ó{ì1c©P¬â…Pð1ás&L˜`Ì@üÿøñ㕃0:€5ñ1qøÑG5ŠÀâ ·Ür‹±}Þyç™Å&ìsæÌ™Æ‹2ã] ÊI&ÁÄÞ+¿.¾F©7Õ*k4žú]F±*h›5„΄'~U£0ôø•Wÿpæy/¨#vÈž‡B£§‘Ê¿ùHŸà‚QR¼ÿäE넉¿q4ÅšûÎèà—­÷Ÿ·yny>±dé¬reƒ®i²Mp@8}S0*ð”ŽHüG_ ¹K«ƒQ_S Pï}8TÇS5DvY»Aß]WÓÁ0ÏÒó   Æ[xWZF¡ÍsbñùÖ™…•pÌk°Ê3únSàáLÛù°>û·hxŒšpA]­m67Õ—gþ¬![gÃhU¼Œ³¼h> ÿ²¢9#BxmàqÁ°)c(âP†Ÿå1¡µ|g„ìŒ]ð´C±Æ’¡èüÑñÃX½zu¡SàÝÁ’›ˆý„Wôð¡\„æà…]±ðÁ0 žh;ê‰6¢¨'ÊÏÌÌ,H“Œm1*Ç¥&€ÿLø‰$Ø£Ïê<"¥M•}ˆÕ„`^DÃjx8Œab¼'Aí Ï^;áÇ;»zŸ*툧œ¯«Yü®^º^êá11’˜?ð“ xã$<1·éZàXbK‹bÍæuú0zq*–U ®ìažËσŸúð{î¹Çp `…78Y°Ï*˜¼‹I¼˜cÏ<”w8ð¬±.1 ‡úì|Ðè³M' úm¹F_ž¿µ¬¢¶Ÿx≢•z?VJÄ =Éö°RƒÊ?A/sAvaþRE`à/YŠ:bÿ©ò_”ÀãoUþ‹J‡ýá ¾5mqǬéì܆ÑIù¦Næ€hÒÆ;MLn1(ÄP´±jŽùgVx ·â³4Eÿ¶…r ²Õ!Ìïf~76 ¬ºcN†Á€r1Ù8Ö‚¼Í'Ô Þ&ÔÓœ€Q<`Ì•‚’¹-±fSòƒÐ[ã›i `$9D=ÖõK¦=aY'RÚTÙ‡Éi˜˜‡eÒÞÑ¥ÍÐAbI´/Í,ýyš¾ü“„?ÒðÄz¥KáAð`Á’jÃ,Ã¥X±ºgëpþ{š/{PGÒœ¢¡FÀýcƒ!IXÒÃÆ(‹’z0ÏÊ\"Rë Ø[ÃrÌþiñLBlkZs<žfÞ¥ù„bï7£>©b”†-Ó’ D&àP/yÑ&]äsŠÝ ï;&½Â3EÊoyqÿÈ/ÒDßð¼áÍÁƒÁŒû ?Ïïh»é‘*ªœƒ¥-EÕŸûí!€w,B|b•OQðÆH¬æ€w˜,¬uºMϼwëÕƒ¿[ß2‰Õ0Aª4²J'Ãû¾Nxiò`Z°›ÞW`uf]ýõq5† &C‡-h6dæ» v–s£êã:|—‚)¤ã`o&®Ûuð\Åx\¯˜ûΠ|ÃŽ˜ÿX(ÿ¸<¶FùGZxyìPþQv¸G ûÂå`iKx½ù¢!€ØP,×i*ÿ8+C˜Ê?¾ÃëØP¬TZåçcõ*ÿ AI%Vå<íŠwþñ¨3ó$ˆ˜ñ«*s&  Ô%0dȸ4.^ùÆ¥²Ì”H !h$3 !  â D/Ö+õ ?ÆþÏGI Ù 8â ­Ç!ËdÇÈú‘ @r¸æškbf@ùG~‰ËJ؉*’å@… €pÆZhÄš(ó#  r€Ò^Þ°œŸHåÍm”ÿÒ¾r4§’ „X™¿ðEØîrÉ2 å®3 (‘‡ñKDÄ$2ð{ïÞ½»”vu ðÕ~ ä¸Ì€|öw\•‰lË"$#€å¯›ëÊz±±&ÊüH b±hªÅ,I€âL«÷À@€¿H/ 3ãü‘ÎNGÁãÇçÉèÅé²S—þ¥ ”ÀÊí"Ÿèû„>žå’õÿ½Q¹|¹†ÎŽù{BYs‹H€H€H ð÷DJÏ}ñxê‹·t?4Þ#¿­rʺ]"þzCo<¯ó&“&üšo>´_þwjž4‰ý;m…#&q~’ ”‹@ã ‘wÎÌ+W<™H þhÄŸ1K   À O! ;0Èê,“H€H€H€H€l"Àe@mÏbI€H€H€H€HÀ4ì Î2I€H€H€H€HÀ&4lÏbI€H€H€H€HÀ4ì Î2I€H€H€H€HÀ&Ž€ŠMe³X     ptëÖÍ6 33S²²²ÜäPq}ûö•‰'†v$xËîö³|{ï?ò'öY îuCÅñ÷Çߟ¿?ÞöÞ]ÿCOÈ Ðó€[$@$@$@$@$òh¤ü%fI€H€H€H€H D€@ˆ·H€H€H€H€H å ÐHùKÌ’ @ˆ € n‘ @Ê ò—˜ $    !Ü"    ”'@ å/1H$@$@$@$@!4B,¸E$@$@$@$@)O€@Ê_b6H€H€H€H€Bh„Xp‹H€H€H€H€Rž €”¿Äl „Ð±à ¤<)‰Ù@     bÁ-    Hy4Rþ³$@$@$@$@$"@ Ä‚[$@$@$@$@$òh¤ü%fI€H€H€H€H D€@ˆ·H€H€H€H€H å ÐHùKÌ’ @ˆ € n‘ @Ê ò—˜ $    !Ü"    ”'@ å/1H$@$@$@$@!4B,¸E$@$@$@$@)O€@Ê_b6H€H€H€H€Bh„Xp‹H€H€H€H€Rž €”¿Äl „Ð±à ¤<)‰Ù@    pœuÖYÐ׊µ•™™)YYY«Ñl- (ö¼ H€**ŠÞÿA÷uÛ©Û}X¾½ù“?ûŸ,Ûž¿üýñ÷Çßvu@ììípÝd×ÝÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.ŽÛo¿=`Wá,—H€H€H€H€H q&Nœ(ŽnݺÙfdffJVVVâZVRß¾}ì»ÛÏòí½ÿÈŸüÙÿeÙÕý üýÙùûãýgïýWÑõ?t¼ ²íñÂI€H€H€H€H ñh$ž9K$    Ûа = &    Ä xæ,‘H€H€H€H€l#@À6ô,˜H€H€H€H€O€@♳D    ° Ûг`    H<‰gÎI€H€H€H€HÀ64lCÏ‚I€H€H€H€H ñh$ž9K$    Ûа = &    Ä xæ,‘H€H€H€H€l#@À6ô,˜H€H€H€H€O€@♳D    ° Ûг`    H<‰gÎI€H€H€H€HÀ64lCÏ‚I€H€H€H€H ñh$ž9K$    Ûа = &    Ä xæ,‘H€H€H€H€l#@À6ô,˜H€H€H€H€O€@♳D    ° Ûг`    H<‰gÎI€H€H€H€HÀ64lCÏ‚I€H€H€H€H ñh$ž9K$    Ûа = &    Ä xæ,‘H€H€H€H€l#@À6ô,˜H€H€H€H€O€@♳D    °€ã¬³Î ØVºÍgffJVV–͵`ñ$@$xìÿÏœ%’ $ŠÞÿA÷uÛ©Û}X¾½ù“?ûŸ,Ûž†üýñ÷Çßvu@ììípÝd×ÝÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€H€HÀ4l€Î"I€H€H€H€HÀ.4ì"ÏrI€H€H€þ¿½;³¬¬ï„ÿTwu³#‹€ì‰¸±)ÁÄCi4Ѹfb|gKÂ8™×ÄÌd’7ëLÖÉdu2&FQã–¨(¨à÷ /ˆìˆ² ½Õûüo÷mª›ê¥šîû«îúžÏ§»º«nÝß½ßS÷ÜçwÎsN @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H LLOOϤÂÓ¹SSSm0¤†|Œ]Àöoìä X ‹}ûWcßÉä8½äg þ¶?ƒØÛ¡×Ÿ×Ÿ×Ÿ×_jdû“ÝþÔz7(õÓ/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ ˜˜žžžI…§s§¦¦Ú`0H? ù»€íߨÉ °@ûö¯Æ¾“ÉpzÈÏ þüm±·C¯?¯?¯?¯¿ÔÈö'»ý©õn Pê§_. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ %01===“ OçNMMµÁ`~ò  0vÛ¿±“ $@`,öí_}'“àô Ÿ-@üùÛþ bo‡^^^^© íOvûSëÝ ÔO¿\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J`bzzz&žÎššjƒÁ ý0ä @`ì¶c'H€ÀXìÛ¿ûN&Àé ?[€øó·ýÄÞ½þ¼þ¼þ¼þR ÛŸìö§Ö»)@©Ÿ~¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”ÀÄôôôL*<;55ÕƒAúaÈ'@€ÀØlÿÆN."°Ø·5öL€Ó+@~¶ñçoû3ˆ½zýyýyýyý¥6@¶?ÙíO­wS€R?ýr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€)‰ééé™Tx:wjjª ƒôÃO€± Øþ\  D`±oÿjì;™§W€ülâÏßög{;ôúóúóúóúKm€l²ÛŸZ殮~úå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€RÓÓÓ3©ðtîÔÔT é‡!Ÿc°ý;¹@ˆÀbßþÕØw29N¯ùÙÄŸ¿íÏ övèõçõçõçõ—ÚÙþd·?µÞMJýôË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤&¦§§gRáéÜ©©©6 ÒC>Æ.`û7vr,žý«±ïdrœ^ò³ˆ?ÛŸAìíÐëÏëÏëÏë/µ²ýÉnj½›”úé—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H Lœ{î¹3©p¹ @€ŒOࢋ.j'Ÿ|r¬LMMµÁ`0¾g¼QÒgœÑ !µ¤Ÿ¿üìÏþ¶ƒÔæ·yýyý%_~þ²?‹}üW^S€bo?‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1 F/˜ @€Àø€ñ›K$@€ Pbô‚  @€Œ_@¿¹D @€1‰ééé™Xz8xjjª ƒð£O€ñ Øþß\" C`±oÿjì;™§W€ülâÏßög{7ôúóúóúóúKm€l²ÛŸZ殮~úå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€RÓÓÓ3©ðtîÔÔT é‡!Ÿc°ý;¹@ˆÀbßþÕØw29N¯ùÙÄŸ¿íÏ övèõçõçõçõ—ÚÙþd·?µÞMJýôË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤&¦§§gRáéÜ©©©6 ÒC>Æ.`û7vr,žý«±ïdrœ^ò³ˆ?ÛŸAìíÐëÏëÏëÏë/µ²ýÉnj½›”úé—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€r\Žý>IDAT @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H LLOOϤÂÓ¹SSSm0¤†|Œ]Àöoìä X ‹}ûWcßÉä8½äg þ¶?ƒØÛ¡×Ÿ×Ÿ×Ÿ×_jdû“ÝþÔz7(õÓ/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ ˜˜žžžI…§s§¦¦Ú`0H? ù»€íߨÉ °@ûö¯Æ¾“ÉpzÈÏ þüm±·C¯?¯?¯?¯¿ÔÈö'»ý©õn Pê§_. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ %01===“ OçNMMµÁ`~ò  0vÛ¿±“ $@`,öí_}'“àô Ÿ-@üùÛþ bo‡^^^^© íOvûSëÝ ÔO¿\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J@HÉË%@€ Pè"  @€¤€”¼\ @€ €.’ @€@J`bzzz&žÎššjƒÁ ý0ä @`ì¶c'H€ÀXìÛ¿ûN&Àé ?[€øó·ýÄÞ½þ¼þ¼þ¼þR ÛŸìö§Ö»)@©Ÿ~¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”ÀÄôôôL*<;55ÕƒAúaÈ'@€ÀØlÿÆN."°Ø·5öL€Ó+@~¶ñçoû3ˆ½zýyýyýyý¥6@¶?ÙíO­wS€R?ýr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€) %/— @€@@@ ‹$@€ PRòr  @€€ºH @€)‰ééé™Tx:wjjª ƒôÃO€± Øþ\  D`±oÿjì;™§W€ülâÏßög{;ôúóúóúóúKm€l²ÛŸZ殮~úå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€R @J^. @€€€@I€ @ % ¤äå @€(t‘ @€Rçž{îL*\. @€ã¸è¢‹ÚÄÉ'Ÿ+SSSm0Œïo”tÆg´BH-éç/?ûóÇŸ¿íß µùm^^ÉןŸ¿ìÏßbÿՆנØÛ` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L@ˆÑ &@€ 0~`üæ  @€Ä€½` @€ãPÆo.‘ @€@L`bzzz&–žššjƒÁ ü(Ä @`ü¶ã7—H€ÀÂXìÛ¿ûN&Àé ?[€øó·ýÄÞ ½þ¼þ¼þ¼þR ÛŸìö§Ö»)@©Ÿ~¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”€’—K€ @  ÐE @€H ()y¹ @€ @]$ @€”ÀÄôôôL*<;55ÕƒAúaÈ'@€ÀØlÿÆN."°Ø·5öL€Ó+@~¶ñçoû3ˆ½zýyýyýyý¥6@¶?ÙíO­wS€R?ýr  @€€ºH @€)‰cŽ9fÑžB—K€ @ %0q÷Ýw+)}¹ @€Æ,` ИÁÅ @€H (I}Ù @€Æ, Œ\ @€¤€Ô—M€ @`Ì À˜ÁÅ @€H (I}Ù @€Æ, Œ\ @€¤€Ô—M€ @`Ì À˜ÁÅ @€H (I}Ù @€Æ, Œ\ @€¤€Ô—M€ @`Ì À˜ÁÅ @€H (I}Ù @€Æ,09æ±ñûÃÆÿÝçìWôr~îy“í#WÜû^Uû5^püšö‡g­l,Â")£•òK\Öžzì=íà½GŸñ‘Q`yß’üùÙ+7xè—ܸ¤ýÓ×–¶éXÖÎ{éŠö„©™ ¾î? Wà†nh«W¯n{ØÃÚ²eËî]ìÏúàÿ5œìGJZ;û¡kÚ¾»Í´O^½¤]uëD{å»Ënî] à¡{Æ*0×ûÄèœtÈÖ þG·ŸÏÇïÿ°µg½qY›ìcÿ·þÔÊvòƒÖ´+n]Ò>ðÍ%ízi»á޾Sú¥¾ÍçþwÖÛÆ ÀA}пruk¿xÞ²ö–,>øõÆã&0—@NýéûÍ[Ó~ú„Õí1½¼½ñ+K{°7.»…ø¹þð‡m¯½öþYˆo!=¦¿þ\ÿáïËŸ>kU{Å#û›Úºå%ÿ´¬½ëÒ%í·?6Ù¬}ÚG‹V`î÷‰Ïñ¡+—´k~0ÑÎ{ÙŠöÄu;¢ŽxÀšö¤©5}ð?ÑÞúÕ%íë7M´‡´¸vRÅ À~»Ï´_îS~ö]ËÚ;ûFòyß|ûûø`¢ýÖG'ÛWnX2œ[yÖ®iÿíI«Ú²¾í½µ·»ç¼yyû7Z=ü3úqªÆ·÷òÖÞÖßhù›/,mo½diû@ß#i~æHÅG;FàøCfÚî}'èèµV¯õ?ü×Évá+V´Ú4Zþð“KÛ§¯YÒÞ>ëµ:úÚèãæ¶£Ûø¸yo~ó›í€h333í¦›njwß}wÛ}÷ÝÛá‡ÞöÝwßvÇw´ï|ç;ÃϯX±¢]vÙeë¿V÷|Ûm·µë¯¿¾Õ¡%K– BMÚm·Ý6¼‹~µ3¶o÷=ýµÜ8kúOýÿ¿±ª´W?¢ÿ»vvÕ{U}üŸŸXÚÞÖ߃®î’=ûkã´#×´_ëïe':Ó>ÿ݉öš –µ}–Ï´w½he?÷¢î©µÜÝÚOüãò¶db¦½»~Ïþ¾öÉ«&Úï~|²}ñº%í€=fÚSŽYÓ~ë©«Ú¾}ê…ÀÎ(pÞ6÷|¿÷ÚÒm÷ÔÇ ù¿ù”•íô#—¶Ýf½ÝÖ_o¿úáÉöÑA/·M´c÷ŸiÿÏ©«ÛÏõ?£å)»¼{úªáóO>µ´¾ïLûËç¬j?ìÃÍ_¿p²½ÿò%í{?œh;jMûÅÓVµÇ}oî–nSù¹Éö÷Ï]Ñ^ÝgÊ|âª%Ã÷Ëg?xuû½3W _ÿ£Çq>Þ;êþÜË6~ï OXÓžÑç|ÛÜrצï¤ö¢<ëMˇ'lüEŸfðü‡¯n¯ûüÒö⾇¥–ý÷X»J«Å–šïõÑo/iïëçÜ0kÃ\ƒÿý{ù HF·÷‘í/ðÁ~ˆõî¾A<£ïi©åæ»&Ú—¯hkîÝ?ÿ>ºä†u£ág6ükKÛ€ o훨9ý7ÞxãpðÐA ÷5ÕçŠ+®Nù™œœlûí·ßðÄßÔ׿—/ï£Í¾ÜrË-íòË/þûÈ#l‡zh«#—^zéðãð ‹ì¯ ×|-¿ÑßôÏéÓÝÞôå%í»?hí!œiüÌUíúŸü×òª^Ö~§ïȺ¾ïu¬½ë{?Ð Oÿûåíæ;[;±æËúžÈ ¾µ¤ýëÕ÷¾j0ñ©þÿÝû ¥ÿïîçÜ<ãËÛ…}Ïæƒœ‰ÿÛwn=îo–·;œ:·Ûß;À¶¾?l鉞ÙÏA«×ÍÏôοóÑ¥íâëû{к}·?  öÇôA~-õ~õ„ÿ»¼ï˜^Ú^zÒêVcÎãû¹lç¾²ýQßQ5Z¾tÝDûX/unÃê~_9b¦­êýàioXÞÞóõ%íN[Ýþè+ÛŠþ¹çüÃòáë·¾wknSŸ½f¢ó–å­×?se{æ®nõÿý~®ÑöZ¶ß=mã#úÓþÄõW»µW`Y{ÃóîÝS?º»Z¿tþ²aûúƒgÜ;…àô¾×ä¬ý‰¾äñ½YóÕí·ú¡Ö;û‘Ö½úŠ®Æôð¾Òné ¬ZÜOö=jÃø™ïL [Úèþ}$@àþ ü°¿4ëäýѲ²okÏèEýµ÷«}ïæó±nk;ºÁ<>ní6`w¹¨oºreC;þøáü‚¨þ·¾õ­vûí·ü5°¿õÖ[‡Gêßµ¬éï–×\sÍð(ÁqÇ7ü\ýµÿþû·K.¹døµ?øÁë?¿˜þñú~1‹—½kyût ¨ÜëO-'ö=ú/<~uûw^=Ü{W{ßñµ%ݽµýìŠaA¨Û½ðmËÚ¿ôC7pÎÃÖ wpÕý?õÈãŽ^ûž÷ž¯¯x¼¨O©»«¿Çýç¾W°0êGÒN?jíÀå?¾w²ýí×~ã)÷¾WV†…ÀB¨1Øá¿ߣ…¿Ð÷¿æ ÷î]ßÞµ®Èõþ—¬h¿ò¡eí·{ÿíöqbO8zM;§Ÿ·S¯«QIÿ?ýµ÷­[&ÚÇ_¹¢=ê°µ¯­ÚY]ç üEß+ÿêÇÝû8ÿ²_¬æýˆÜY^ûþöýÿ5•è+ÿþžvD/µüTíèþûeí7.šlxÙÊöº~ÿ[ºM}_…* ?ß‹D-õzqŸóá^úÿû“‡ŸºßÝûŽ}¿ïjÛî Ú×ÿxúªöþe²½àKÚÙÙp pÉíúÛÚp/G ög/ûõ=ÿïºli/«ÚtßpþÆ…m8د3É?Þ7¦µ‡ev¨"P˳û×-l?Œ\¸îõU÷ZS#êÐé} óÀ½î´-‰[» Ø–û^ŒßSS}júÎhÙ{ïµWa¨#›ZjÊO‡£Ž:jƒ›Ôƒqíž¾zoûóVµ{új9¿_¹¤¦Òýx¬Ôíë=±vp՜꺟ZžØß謁¯-ø§,¢à©î4ËúûÁ¯<ñ¾åôÔ~Å·½<ºï¡¯Â|M?:WcÁšrzþ}:x½üAß³ÁËW´Cú¦°^k5o4ø=®÷¾de[µÑÃ|ò±}GôºÁÝîü^þë<‚Á÷'úŸÑw¶öÈ~Ú§ ÕL—­¹Íè;Ÿû° ·É:tÍðñ¾~?Æ @=:qêm—,i?ÿþeíñGmxüòÊuó+_Ý/ß4×ríík7~ÇõíõçC}å @?ðûO_9œƒU+·–:¤_ ÛO Žº}æUëF0ëî¶JÁϾgYûOýÐiM“¨K‚n˲µÛ€m¹ïÅø=5hŸïrÏ=k·ËsÍõ¯ÏÕ‚:g`4]h¾÷¿³Þ¾öê×`¾ç5h8éеƒ›:àO?3Ùþ¸¿÷|¾Êÿ`ÔûÒ?\¼¤ý^Ÿ·EßÃXK}_ âg/§9Ó¦úaÿAïûD?ªPó—ïéGÂkOb½Îêw Ôriß9öÄ>Uaãå›ëî{ãÏû?´Ànýgý?>fÃAí¸Sí™ñIk†ú~öö†/-mÿ¾ï€þo}Î]vúª>xŸë½ª¦oÿñ;KúFuÓ¯½;VÎz!oôÐæ³ Øè[ýw; Œ.ZG6^êsõ‹Â¶¥Xl|_;Ûÿko{]êóˆýZûÆ/Ü»óª.m]'äÖÉ|u9Ðúå`u‚ïÏõÛ>°íÏïS_ûûÙ‘ýwüTŸt^¿ŸÙK¨sê2ºw®{mÔ4…ZÞkíû`í}üý~„`ãeÓ¯¤oéÿvͽ?lÍ3xêß-žwváÏl¸“ª¾÷å}ôÿî—ò­“ék9 ?«Ôo¼Ô¹¤W÷rpJŸ4:€Z³™½Ô{UÍÙÿÇM\Ù² ÐÖÜæ“WϾ×÷ï ·:;.g‹÷\s´~³Ï[ü‡~¹ÀôC¨£å„uWùxߣ¿Gß[2úS‡KŸÝO ®9Æ£eú¡«Û•}ïÈ›.^Úêê#urpíI©óßyépNòsú¹Æ#0º¬Úè )uu“Zêéh©+£ÔM6µÌg°©ûðùû'°çž{§ }ï{ßÛàŽêjBu¾Àèë|qü§Nü«åš~¸¿öîÏ^êB£#Ôì×ÿLŸrPËÓdõðªwõÞTËhþð?ëþ]R÷Ý}î\¥á)}À_ˉýzé½oµ/_¿¤º÷ÌðDâ:™¸æ-ÿt?!ñ¯û2,vFmyØšçyJŸ:ó…>-¯Žšm¼ÔûOí™?®ŸL_ËIýµZÓƒnê'åÏ^êþ×~xÙúÁÿì¯þ]Gï>ÿÝ%ë}ƪõ±ÎøÙ^þëu»5·Ýߎþ¸ákG§máþÿm?Yê´~BÓ×f] ä}Þä/ž¾zx¹³ÿÕçPÕFîcý’ ?×§|¿~}êºbÝu‚=²‰ÿõéÉöľ÷´<ñèÕíOúçj؃ö}ÖGv´@müjÞçw×MÕ«½'µÔ%Öjžô—û<éWô+3ŒörÎõxæ³ ˜ëû}îþ ÔÞýúÀu% :¸.ZçÔÉÃõﺌèb\Ž=`¦ý‡uSjïþ¯_>œNPñë¿ÿbeßAÿ¤~yÎ*±?Òo[ËÛû^ý_¹`²Õ¥ëê?ß¼yí ä½—/½®ÛÔ^ÄÇôÁÄ-}RÓŒ^Я|7š~pTß¡õ³§¬n·öùÄOìy¿û±¥íû4»Ÿë”šþS'5ZìŒÛòþ°5Ïó?õËuÔÏE{v¿\|ýÞŽ: ÷Ú~M P¿¨²^c£K|þçÇ®=ªV—Ý­S_íãѺ¬gÜÿšÇß÷ˆÛìüŸïG¼W÷—ùsû÷Öe«k‡ôëûy9uðtŸÏ_`kn3û>wä¿Ì z’…óWÏYÙÝ7œuY¥Ñò_ûI#Ë—Ì KÀk/X;o²þÿçÇW®ß(Žn;Ý7~õ›ÝêàÑR— ¬# çô#Æ+pL/å5ý®ö´Ôy:¿Ù§FÔõ—/^å•}0óªSVµ7÷#w›Zæ³ ØÔ}øüý8ì°Ã†—½îºë†¿  î­~‡@]ý§N,^¬Ëïöër×´œÚÉô¹>ßÿs׬ý9®ùý5Pÿ§­î5|F?YðßþØêá¤N¬åÔ¾Sêµý*Y5ÝçŸû¥=æ‘ý÷Üì¿ö½ëÅ}Ðg¾³ö-z4ýgdüûýÂõ;nê·ÿV\ÔRGºÿº¿žÑ ‡…ÀÎ(°­ï[z®‡öÍÓyý*@õ¾³ñù¤'÷Ru%Ÿ'¯{ÝTÁþP?!øßý˲öôusùk'ÖéW)zZ¿œèæ–ûœýþ›ÃËý>³_¦·æë×sú¥~å ºe-[s›ÍelϯMô½7kwKlÏ{Ý÷uu?ÔZgjÏþ¥ ;0Î] °Vô)u• š=ºüÚÖÆØl­ÔŽ»]ð[WZŒóþ7¥Z·N ¬£]õ‹¹ê—ÕI»/u½ÿú%`õ‹ƒê½¬–:o­Ž‚=´Fó‹×~eó×¥/ï{ýëýpªíÑQ‚Í—¯XØ÷çýaKÏìö~ªN]¢º.Tÿ©«xmj©_ÀwK¿&ÝnrÓû§æüöº\oK°¹ûßšÛÌyçÛé“;]ØNÏÛÝ @€X” ê€E¹S€Æg-‰ @€@\@ˆ¯€ @€Àø€ñYK"@€ Pâ«À @€ 0>`|Ö’ @€Ä€ø*ð @€ŒO@Ÿµ$ @€qÉø#ð @€À<n¹å–öÅ/~±]{íµíž{îi‡vX;ôÐCÛ 'œÐ–/_>{rÓ¤ÀUW]ÕƒÁp=Þ~ûí<”}öÙg¸^;î¸áºÝà‹þC€Àýð‹Àî7¡; @€q Txï{ß;üÏÎÝm·ÝÚÙgŸÝ<ðÀÙŸöï&Pÿý×mú7õ0« œqÆŠÀ¦€|žÀ6(Û€æ[ @ +°¹ð¼ç=¯Õ Ñ²ð>úѶo|ãÛôÀêÏé§Ÿ¾Mßë›ØP@ØÐÃÿX„¯{Ýëæ|Ö¯zÕ«æü¼O. M•€‡<ä!íIOzÒÂxÅzû3ø݉u;’ð‘ÀýpðýóóÝ6)°×ÿ·[ÛøÏ&oì lR ¦Š¬X±â>_¯©>5姦þÌ^j^¹ea lÁ=£:zð…/|aa=9†ÀN(à$àp¥yÈlMíùÝû–¾>º##‰ó±æûæ÷o|’o•€: øÛßþöúð:1زpjÎÿ¦¦ýÔº;å”Sî3¿t¢÷ìõ:zFUF'~>ç#óp`~^nM€c¨#7ß|óðÄßԞ幉c~ˆâ6#P'üεsÌ1Ã#8UêÞð†7 ÿTY¨¥ŠÝ™gžÙjÊÏ\‹£s©ø­p`ë­Ü’]XÀ^ü…¿rG% ¦ýÔ qSÓJœ¼pÖe è7uµŸÓN;mø@k°_ë³nWeáè£^ÿê¤ß¹ŽÔ%`ë(A}¯…ù (ó7óìb|ððm픟Í=}Ebs:÷ÿk£PƒüMíùŸššºÿAîa»lî|ŒÙE­ÖÙW¿úÕû”…§|Í~P—_~¹«ÍñoóPæå¦æ#p篙‡<¯äm9ävå•W&‚ìÍÔT‘Ùƒý*õgSKÍ·, ÚS¿©¥¦ñÔüÿšÖµ¹¢°©ï¿îºë6õ%Ÿ'@`  À€|™Àö¨+m¼( ‹Œ÷ÿUn¸á†ñ†JÛjG=êQëëïÖ|ÓE]4üÅQ³§’lÍ÷¹ÍöØÔôŸJª°ñ\þ*{³—K.¹dö7ø÷æJà7ôî#à$àûø‹I ¦ÿ{ì±Û¥Œ¦-&¿q<ךç]sÁ7¾Ü禲ë*@üà[M±ì\Çüú\ƒÿM@¼þFþA€À6 8°Ml¾‰]E`4ýçÆo¼ßO©î˲cŽ;î¸á¥"kPXÓEF{–øÀ¶úZ•„óÏ?¿Í¾h ¨i"~)ØŽY'Ûû^ëŠ?‡zèpÝÖ Þ››>´½³ÝÅ& ,¶5îù °Àöœþ£l@»ÝÿS'Ö‘€ú3×RŸ¯Aÿ쥮 SsÌ«lî„ÒÙßãßÚû_Gm>õ©OmPä2F*][À ]{ýzvlF`{Oÿ©©D–œ@ ¨“J7^êâúebÿoçÿÛ_`ö•~¶tïug>ƒÿ:úc!@`ÛØ67ßE`›œð»ÍtÛýMÿÙî¤ñ;¬pÇwÜçÚñuÂè[Þò–á/žríøñ­¦º"Ó\×ñŸëÔô®ÙS¸æºÍìÏÕt! Û& l››ï"°^`SWõ™ïç×ß¡ŒMÀôŸ±Q5¨¦Õ/‰Úø*15¸¬#gœqÆ¿lj¬n‘…Õõý·¶Ì÷„ß:âc!@`ÛLÚ67ßE€À."°=.ÿ9šJ´‹ìôO£æú×o žëªA£+mîò’;=Àzu)Ö­™tÖYgµú%zõqk–:²àHÎÖH¹ ¹€¹]|–E PƒWÿÙ5WôæJ@=ãÚÛ\Wš±ìxÇ>ö±[ ýΆÑÇ-}Ã\çzlé{|{€{-ü‹E&°=öþ™«ÿ,ÌœÚC¼ñƒN=õÔöœç<§Õ ´¦¦ÔI§–+PƒúºÄçæ–Ñïl}ÜÜmkðoþÿæ„|À–œ°e#· @`Ø{ÿ‹ÆÕîHͯß0ú³õ[…k©d¨çÆ%aá>›÷‘~æÎ¨Ë·n| ×¹žm {ÿç’ñ9óPæçåÖî#°©«úÌ÷ó÷¹cŸØá5çØ²ë ̾2P\GF¿Hl>WÙõ¥vì3ÜR ØRú 'œ ¬m É× l¥ÀÄÝwß=³•·u3 °S Ôï¨+ÕÀ¿ @ü×åÑÀt§|b;ჾꪫ†G_F%lKO¡N"®+7™ö³%)_'°õ ÀÖ[¹%ìÄUÎ?ÿüvíµ×ŸE]IæéOºßZ§UƒÁp}l\jÐ_맦pø‡VØ]Z@Ø¥W¯'G€ @`CWÚÐÃÿ @€ìÒ À.½z=9 @€ (zø @€]Z@Ø¥W¯'G€ @`C`Cÿ#@€ °K (»ôêõä ôßyÒ¾÷½ïµÕ«W>åcPàŽ;îh7ÝtS»óÎ;ƒB4§€ß¼8×»g½ ©?Ú­Ýtǽ_Ücykg·¦½øÄÕíÌ]sï6ó¯×qiÿžÕíà½×ÞèªïO´O^=Ñ~úÄ­ûþÍܵ/mƒ@]óýŸøDûþ÷¿ß–-[ÖÖ¬YÓŽ:ê¨ö„'<¡í¾ûîÛp¾åþüà?h^xa»ùæ›Ûääd«kó×uÞŸüä'·½÷^÷¢ÙBÀe—]ÖŽ>úè¶çž{oY׿îºë†×Œ¯O¬Zµª½þõ¯o?ù“?ÙöÛo¿-Ü›/ï7½éMí‘|d{Ä#±ÁÝûÛßn\pA{å+_Ù–,Ùü>Hëq:ÿ!°]6ÿêÛ®QîŒÀ¨_‹ýÚ'­j—þü=Ã?ÿðü•íΕ­=÷-ËÚ×ošØª'pîy“­ý£åâë'Ú¯_¸lô_Ç(pÍ5×´÷½ï}íÈ#l/}éKÛ+^ñŠö¼ç=oXÞõ®w Šc|8¢º@ý"®½öÚ«½ìe/k/ùËÛ9çœÓêhÀÇ?þñ­öùä'?9ü¾£o¨ßêûùÏ~ôßáÀòQzTÛm·ÝÖÎ?Æ+033Óê……) ,ÌõâQØ£µ£÷_ûçé}¯ÿ_?ge›èãù_éå\-ÛýÅ/~q8ø?í´ÓÚ{ìÑ×ãDÛÿýÛ3žñŒöÃþ°}ó›ßܦûõMÛ&PÓ°n½õÖá^áåË—×Ç!‡Òþð‡·ï~÷»Ã£3ÛvÏ~WíY>õÔS‡ë|ïø”€)@~lA`ÿ^j:ÏÊu3x.üö’ök™l_»q¢-éÅà‰G¯i¯ûñ•í†;û4Ÿ·/ësÌ[{É;—·é‡®nÚ{¦ýÙg'Û}ZÑI¾¼ýÑ3Wµ§»¦]{[k¯¹`Y«ûÚw·™vÎC×´ß|ʪ6¹´µ¿ùÂÒvå­íÄCÖ´?þÔd{íVµÓ\ÓÎ|Ãòö'ÏZÕ^û¡ÉvùÍíáÏ´¿<{e;þ{ÙæZ…5мþúë‡{˜kà?{ÙgŸ}†ÓEj*ÉÃö°vÅW´+¯¼rX.¿üòá‘=èAí±}ìúi)5uèË_þr«¯×´•ƒ>xøõ}÷Ý·Ýu×]í½ï}o{Üã×>ó™Ï 0pÀÃiFxàìèEýïÑᚎuØa‡­·xèCÚʱŒkð^GʱJAMÛ:æ˜cÚýØ ]?ô¡ o÷‘|¤MMM §]rÉ%Ãuð¶·½m¸NjJÑ;ÞñŽaÑ«û­ÛqÄm0´šV壎Tn-•û¹Ï}®Õô”Z·•·téÒáÏCý|Ôy 5¬¾·–>ðíñüðëÃOøk›6µ®7žTëåÝï~w;ùä“ÛÅ_<<TÓ»N9å”ᔾm~¾‘À"°Ks‘®xO{ën¹«µ?ÿìÒvÃí­½àá«Û]+Zû‰\6Ü_ýê{Úe}ªPM÷©yÿ?zÀL{׋V¶¥ýUõ?Î\Ù^ýØUíå'¯n¿ÒðíÕ†_;íˆ5mŪ֞ý¦åíÁδ¯÷ï?ï¥+Ûç¯]Òþßó×öñÊüç¯/iÛïó×út¤'M­i«zùøÖ-íO?½´ýãóW sÚs¦½fÝ÷lݳY\·ªi!5ˆ«ú\K @ë¤àüÕà¢uTà¹Ï}n{þóŸ?œŸ^Ó‡F' ד>ûÙÏn/|á ‡ƒÀô××ë>jPûÕ¯~µ=íiO~½Î/øô§?=Wô¢ý\…©yá5˜~Ï{Þ3t_uÕUÃ#5è®sÊóýï{À0t<û쳇' êSŸ~®ŽÞÔàð1yL;餓ÚCòá}Öùõµ:¢PE£ÖG­—ZêàüñíÅ/~q;ñć¡Öw-ußµnëûkÝÖ¥*uÄ¢–úÞº¯úÞ—¼ä%òRÏÁ²yn¸¡]zé¥ü©iy£esëzt›ÑÇÑ:ýÊW¾2<_¤ÖC9ª)e7Þxãèf> °• ÀVB¹Ùâøå &ÛA¿·ÛðÏѸ[û§¯-mÜ÷Üþ€¾§°ïlç W¶sO_ÝöìÓúo¹kb8࿱ïýß­ßí% õ͇ï3ÓéG èç(²×L›ì¯´úÚ^ý¤â|kI»mÅDû™“Wµï÷ñÅÒ‰™öK½,üí—– FIßÔïïí?µ²=û!kÚ~ýÄhùïg¬NOª#/=iuûÖ÷6ܳ=º­ÝsÏ=Ã=½ïýÙÔ^àÔÕ‰†µÔ€½öø× µ“u’píÙ¯KÝ®÷5p¬û«ÂP{ëßµWy´Ô´“Úã\ßÜqǵ:áÕ²¡À£ýèá ûØcúÔÜÿ7¾ñÃAv ò®¾úê¶råÊáÀ¾œË¸ú_ÿúׇë¡|k©Az9×z«u»úZ1˜kyðƒ<<êP_¯c-U jZG‚ªPÔåÑÑ:J4Z*£ ÅhšRé©“–-›¸í¶ÛZ•€ÙÊq´ln]×ÏÀ\KMç«£jµ«üUq¬’a!@`~kw9Îï{ÜšÀ.-ðÚ'®Ýs_Or>–xÀ¬ ÅìÝÏ)üê íW?¼¼­ìS}ŽzÀLxÌ£¦÷Üܯ|xæß÷60k9¤OºiÝOèÓzö•;ºÙa½XŒ–å}ºÐê™y†¾y|¬Á\íá­"0×É 5©c øj©Ác1-5À¨«ÒÔ ±¦€Ô@±N>­æì¥î´Ôý–º¯Ñ”—ÑçûÇÚ£^»²>ᄆʨJT]¦¦MÕ”ZouteöR¶õùM ðgßv®Wa-u¡ÖceWÉ«‚7*£ÛÌ.UZêg¨ö>øÃ…*%U*,›(Ÿ:ê2{©#muŦZª ln]Ï~=îcã«:ÕÿGS³F·ñ‘- ([6r‹E&°oä?èÞ<ûw]º¤ýÎÇ&Û§_µ¢½ßÚÁøËß9÷Ç ¾q֎ò—ýBŸO´n©©E÷bqÔº+î½üÞþè6>ÎO ¦þÔ¾¦rÔ<áÙK øj¯aí…-5Ð¯Ïæ×€¿þ5©Ác}þÌ3ÏltÐè[†—²¬¯Õm-[¨=è5u¦®È4r®xíÅ­x1©]™¾èE/Z‡UjJ×ìAùú/nã?Få¬Öo=†ÊÝýÔÿ?üðá½×ù$u.@M_ªÇòµ¯}mx)Óšn´qqØÆ‡³(¿­¼7·®çz]Ui­§B«×í\EaQ‚zÒæ!` Ð<°Ü”@è[ÓxöÛ}íýドvÞ7—´{fÿ–õWÕwoŸhw¯;‚½¬ïT¾³ðk¯ÿª~»³ú•…V¬™hð‰¥muŸ¢\_û¥N¶×}~rÞG¬‘M ÔžâÓO?½}éK_ž¼;šÏ]{þÏ;ï¼á ½N-µ'²æz× £þÔœÿš“^—­ÁjMé©Sëv5x¬=™øÀÖdG÷ãã¦j@]¦]tÑú_Vƒío|ãÃ=ÿe]êsuÂu}¬wÍѯi:5P¯¥ÖG•³Ñô­úý»ÖM}Ï|–:RS{ª?ûÙÏ÷H×ZÏ£Ÿ—º¯úY¨ÇP?õs5:¯dö£ùdºíZ­Y×[Õzª£DµÔô¼:¿^›æ'àÀü¼Üz‘ <¿Ÿ\sõî¿0lþê9å°5íÜÓVµßýød{NŸ¯_— }^¿ÍËÞ±¬ó°5í?±²=êÐ5mÿ=fZOðæ¬lÓýóïü©í•ïYÖ~»M¨sÔšögÏž{Îë"'¿_O¿ö,?ëYÏîu®C Þj€X¿lzzzƒ_6š~òw÷wÃÌÚËxÖYg­ŸrRskïõ›ßüæá ¶NR­ójjH R-[¨¹ôÏ|æ3‡S©Ê±þ_vµ÷©O}êú£+å^%á _øÂpZV]Õ§®º3ZêÈM]Ù§Öo}_]•§¦rÕ¹uv­ßù,5§¿¦wÕ•ƒj©BPƒÓѿΠ©)Jõ³1:w¤>W{¯-Û.P¯Ç-­ëï½®æôö·¿}ý§ëÜZWæ'0Ñ÷r˜k0?3·^ä}çïð2žun@PK]æsô›×~fëþ¾µ_„d÷^ê\ËŽ¨=»5ß»î£é'£ÄÚ»\'™Ö€jÏoíᯓçZj/pœº©¯Ïõ=>w_r®=¹5 ®²5Ú»?û–u›:bPväRWƒªRe®Ö}ý|¼õ­om5÷ö4±:ÂPGê¶£r°#×bºï-­ëzý¾á oN +ÿz-׿¹~n“›çJ`[vìVu[•ï#°€jB]hö²-ƒÿúþú–ñÔà®þli©½Ò›[jàgð¿9¡­ûZ9oÉzK_ߺ¤-ߪ¦Õ´Ž2Ôú­óCªäÕÞæÙ‹õ>[cûþ{>ëºÖÑìó¶ï#qo‡€°8Ö³gI€Àfj¢_ص ]üK5ð¯)bõûê@ý,Ôï{]!jú;ÅÓ«=ý5lã£w;Ń÷ ,@S€àJñ @€ì(WÚQ²î— @€ÀPàJñ @€ì(`Gɺ_ @€ Pàÿ @…årXH`IEND®B`‚golly-3.3-src/gui-ios/Golly/iTunesArtwork0000644000175000017500000011014412026730263015423 00000000000000‰PNG  IHDR{C­!tEXtSoftwareGraphicConverter (Intel)w‡úþIDATxœìÕ1 0 À°¢<;¦ÁèK/óî hÖ XaQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQÿÿìyT”UÇwyf@dRÔÊ MSRSËÑ´c¾iêÛª˜šŠhn¹à–)äV.˜¦wÙaXfY†mAÀdSÙåUs9eõ÷Î…‚§Þ£Î\Ç{Îç̹Ï<÷¹ó9ßûÇ÷\VQ@ðŒ" @ žQžÊ¨®t {ø€ÛNïwnÿÀçдõjá#|„QÂ[>¼ù< OM”Oپ壡Î-Íf´6™%‘™NðlŒgaä&Q7Bf¶k»jÆŒÕ~>ó„ð>O5¼åÛÏãâ)(€Ã>3 X.“¦›Ñ¯:Øì~Ý)hÌÛÁ«Vh6mËÞ¶+wë÷yë¾ÉŸ4YíìÑ¥óa‹ÖÛåt•å’Ó¿(=?MøáótÁ[>¼ù<^¸.€Èˆ;/&xeÛ¯½6wö™ÀëÅE ׯ7\»þû•›woýÖpë׆úk ×o5TU7$%^_çyzäˆØîÝ}dt‰‰löô© j*çá#|ø‡·|xóypZUn®“ÜØ!ËÖrë73\§ä…DݸP÷ßÚ›·.ÖÖUÕܨ¿|§¾öN]ͯu5?ÕÕ²Ë[µÕ7ëjn_½r'«àΪµEcÞMsêÕJò´³ý<$h¾ð>‡[xˇ7Ÿ'5¾Cg3³õ}z%]üåòœlÍÝ’Ò†¢âŸ‹Ëo”0Ê~.-ý­´ô·KÙeÊËbw÷¨ž0.mÔˆâ¶mŽÊ¥%³f®>ÂGøpoùðæóDᮊy¦æS­¬6–7bdƲe%šô†üÜßssÎ=u5çÔåœSÿÉɽ–“s3'÷Gíà~rs¯ž)¸š}òZnþÝzïÝ‚ÃN÷ï%—-û¯„ðyÆ}xƒ·|xóyÒðU¡!îdm±{„ËEçœO?K‹N¸­N¹¬¾‘š~59µZV¥N«U§^Q§\S§Ö«S/?@Jj}Jb}JJ}rÚ­ÄÔ»ë7Ô uNîœíÔC%§‹^qúÿzXøcòá ÞòáÍGpT9YZ™M´¶ôvyãÒ€WŠ\œ“÷¬Š­ˆRU©¢«£T¢c.*£/(£/)UµJåe¥ªJ©ªlFõ±¨+JeuL\¥BU¥PþòÉ'ç×sÞè_Ü÷¥4‰z¼3j‚ð>Ï oð–o>ú—(/™Ò¡ã2kËoûöÉèçtv`ÿ¬)S |ý® * *kBy@Ð¥€Àª€Àê€ÀŠ€ÀKͨ ô¯ ¬ . 9ë\³uÛõ~}’ú÷*èTÞùùIš;ÁßOFøcòá ÞòáÍGoðR¯^%Ik»v‰wì–åä”Ó«wΝ*öï¿|ðÀŽ{‹µì;¯”ìÝ[¦eOÙƒæì)ß»·tß¾sûöåò)ß¾ãÇ¡C2œz:õ>÷rÏL‡¶ ¤ŒZ*|„ϳãüåÛÞà¢ü|çÊ¥¹öí|»g::žîÒ-ݱGà†M—½·”íØV²Ý»ØûAм½ u5£Ð{ûéíÞç¿ÛZ²s[áwÛ‹6o­õNViã{dté”dmáݵËâ+—ÚÃÂGø“oð–o>ú„‹pp˜gaº­S·¨öÏ'8t8ùb§Ì—zF®\qÁkMÁF¯ü¯=O{yž¹G—g¾—×)/¯\/¯¼–8å¹NóµgÞú5…ëל]çyÆÓóÒ¨Ñé/vnß%¬c§„βì"ät¡÷–÷…ðy|xƒ·|xóÑ'†/€ïwºb¼°mXÛö1ϵ?áÐ.¡½ÃqÇ.sÜË–{œYµ2ÇciîÒ¥yM8u6ÎoFÁÒ¥gÙ­%Ë3—,Ó,ò8õÅÒŠa.šöí¢ÚµKlëÐÎ}D¼…Ù;Û%ÂGø½oð–o>zÆðàè¸ÀÄt£ý1{•­]Œ]›ãövJ{Û£XàîvÒÝ=ÙÝ=}–{FKhf¹g>Ȭ¬Yn¹l0sNòÌ9IŸ¹¥»Í.ëÖ%¼M¸]›8¶¾­ÊÎîX;û0Šçûš)|„qûðoùðæ£g \q±+$ÙTsó]­Í#[Y†™™‡›·Ž°0µ±::䄉ŸdNœ˜8yrj˸¦µDú$×ÌI“Ó'}š4qJÒÇ®ÞÏ·±ñ±¶ c+›Y„˜Y·6W˜· 0•­òæá#|ŒØ‡7xˇ7ýcàXÿõ™´ØÌì0‘Be¦A2“`yˆ©<ÈÌÔ÷9û#£GkÞ{/uìØ¤±cÿ1l2{$y̸Ä1ãØkf¿q¦&%ÉßÄ$ÈÄÔWÖÊWÆR€\Ú,—»VUÌ>ÂÇX}xƒ·|xóÑ?.€>=WË¥u ò@Gù"8Ê ÈЮÎ]#†¿¥ñVâðañÃ]âß~âŸàâ’0r¤zèÐø¡.Ƀ«M[íÃø F~ü>dûŠƒ0ìK‹öü0Cøcõá ÞòáÍGÿ²êkçId†œìðE8¡#ˆ ÀŸÁò"ø•õ야Á[>¼ùC€*b¹™ÌƒÀJCAȧq$“‡J2¿Î/„÷êíôòqöÚ»gL¢[¤çKÊÞ½âºu‹mmæOÈQL E(˜€‚•0àC€ü£4@’6õè¹Nø£ôá ÞòáÍÇ ²vípŰØD›Q¢¾H{þòC,}Æ8L ð£ô[ÿç;Dth¯x¡cø=/<ÖÃ::(ìÛɤC”°2gÅ F ³Å1;ÜùbëûºÕÆv‘ð>FéüåÛA0d|»ñßVPt”à(@¡Ât(îÞ@A¡rIaj¢°¶Š²¶Š°¶VX[‡Y[‡þ…Uˆ•Uˆ¥e°¥E¨ÄÚ‡ŽÿZЉàmÕöÇ$’ÊþN¢óά>ÂÇø|xƒ·|xó1†,€o6L`@AÇ@[…€RÂJ”ˆB"! ’h vð'4”½Rm¦¡))R±Gî_„]¤`éÁäF ‚wJtAîɵÂGøŸoð–o>Á °q¼v €@ÀqÑ-‚!iï²þT¬"$ŠB" Ž!(¶Šãfƒã,eŒX¸ÚTMÖ9F ¡H–>`%Æ E´[¢ ³4_ ác|>¼Á[>¼ùƒ~ hÓ8‚Á°çW„æÊI Ž` @À‰f°7“ÔI Û§&ĶÛ§øæë H º=ÃV£8#FÞóÏÙ |„ñùðoùðæc YêdO‰~ŽÑa9I%(Pòƒh£Oi6ÇŽkF< ¤æë PHeMŽÛ9¶Ù2rŒMí;.¸Zï.|„ñùðoùðæc ü›À’4ÝDv„bPBé!õ~öþŸ¤5_£t ݤ!8É6ÀD °øå¾K„ð1VÞà-Þ|ô `À -2i7%숔‰¡ - Ñ^ji|§i²iÌa“!›EÙŒlÝã‚AC!“@Ö®ŸËÞ15Qiᇮ;…ð1VÞà-Þ|ô `óæñ€æS)£Ài@’³ãU@>‚ÓÚ4Q*»<Ù9¡…Él)m÷¢4@@§0I£t¿‰É”Ý»× ác¬>¼Á[>¼ùè@YÉTy+wBb”Çr” Ú/Ƽ·¬*3u™æ>"r°¶ä³tŸ’‡‰ãÍÓNf¯>ÂÇX}xƒ·|xóÑ?†ÿ‡0}û¯ÆØ[Âì t´œÖÆ(_GÁãAÓ˜-…leJcZùöÛ-ü–ð>ÆäüåÛž1|,’Ik$Nà<†r efUÉò*8§Ý•GåÖ®_‚ âtŒöXXÌÝ·÷á#|ŒÛ‡7xˇ7=cø`ô æ¦y¬!1\Ó‹Ÿ’¸à"Ò¦Vü@…)E ‘Ka-uvþòrMËÿ’Møcòá ÞòáÍGŸpQѪerùT€ýgÈðE × tHv"«DPŽ ì1€ÎS|šÒãolc7u×®‡þ á#|ŒÉ‡7xˇ7}ÂE0ÜfM£Ò*Sy4Eì T‹Ñ g®Àp ÃÅG]`­NeJ:mÜúºéÂGø<#>¼Á[>¼ùè ^  ®Ö½{/O‰~/¡,Šjª©¤2 •WÔH¥Žª{TÞ£¢ ì²Zw÷þ§ð%™ì, @kz¿²8Jõ7?~+|„1ùðoùðæ£7þÿÿì{TTÕÇ{ïsæÌˆ¼)ˆ¥&fT^¬ì¦hÖ²nšy{*¥¥"*¢%¦™¯J…4+5ˆ¼axÌð–ÇðVyˆ/Ää ¢\õæ]y¹{Æ[‘кÝRf3îµ>ë¬=gÎìù¬ïïï: ¬¥¬ä5+«y’¸M†5©Áä­_j¢waµê0Ôh E€VmZ4"h@P‡´wjµº=sÁD+U#T#º¦='ƒD‰|bßìM[¾å>Üçnóa Öòaͧo`¨(¥E¯š™-ñ7 ©@k€v©Ø@i7jB¨^Gö­ºó­ÝhÔè f ֽж±LÞÛØp{~ãŠûpCòa ÖòaÍçNÀtܤò»¹îîK¬¬‹‚FÛRHj™˜(àT¥‹(S NpFß|.áåfÄ?`Uiéíÿ®%îÃ} ɇ5Xˇ5ŸÛK?(€Ÿ :à±tÉ:ÇѬmÖÂD<1YŽÉ{ô(*–4™7ÌÁsâs¾^^;r³½Û/¸qîÃ}ú/¬åÚÏm¡?@wJKü4YÞ)Iž ªÅɉšLï’âuíqîÃ} ÖòaÍçÓ_ €Ãáp8^‡s—Ò/  ¾Ö-*ÊãÀ^·þoìx5pÿ;Ùš¸÷á> kù°æógè7P]1'`Ëë'l25š?P¾P$ ¼„àE/ÄÈMÜY0xÐêùó? \Ê}¸÷é×°–k>·‹~P8;¯”‰óŒ„µC,¾zÒ)|Ús«WlÞvtÛÎâ­_–®ÿôøì·4&ÄŽ~Àd`€$¬¶0õš?ェïÞá>܇ûô/Xˇ5ŸÛ Ó»jøðhe¹ý‰¿D{,:ÖQQÞÕÑÑÕÞñïÖË7:¯wuþÐÕÒÞÕÑÙUWß•™Ñ±Þ÷ijSRx P&xÉe‹æÍ]ÖP»˜ûpîÃ>¬åÚπѨ«qsíFo²,M·>ý×|×9¥‘ñ—Î5ý«ñrç÷Mu —Zšliü±©á‡¦†+Môagcý妆km­?)ûqõºòi/æ:9Æ}­-—D†{rîÃ}˜…µ|Xó¹s°XG¼Ü‡û0kù°æsGa®”Ê¥ ã¹ffŸOžT:åÙü>¨,Èë:^üïââ«Å%mE%ÍE%ŠŠÛ‹Š._Ô.~MqqÛɲ¶£ÇÚ‹ßØ»ïÊK/–M™tbì˜xI¶lúß^å>Üç.÷a ÖòaÍçNÃVDEºüº¹ÉWS\¾w™Pôö»¹ é×4Ùײ4—ròÚ²rê5¹ušÜFMN«&»]“Ó¢Éi¾…윖쌖ìì–¬ÜÎŒœ66Mœ1yÂQ§QjIxÿ§ÿ¯‡¹÷1$Ö`-Ö|ú†  èÈÌF³ÌMý]ž:ïüH¹Ë„¬]ûZâSjâÕuê„úxõ¹„¤ïU çT çUêF•ªY¥®S©k{PŸߪRÕ'¥Ö*ÕuJÕ?ß|³`“EO­xôÁ\Qðy~êLîÃ}îBÖ`-Ö|úV  ºrÎûÌM?{ôáüÇœN{dÎܲ àöCáå¡ág»Q~>4¬.4¬>4¬&4ì|jÃBZÂÂjÂ"΄Fž Žhغ­ã±‡3ÇŽ>;ΩzøÐXQôð\ö¿&Ã}¸!ù°kù°æÓg°ROŽ_-Šëî‘æ0òˆ“SÑè1±«×Ö|ûmó¾½ßïÞ]¡eÏwºEåîÝgµì:ûßEOvUïÞ]µgÏé={Žï¬Ø~qâÓùN£Ï89ýc¡í }D˜­Š÷æ>Üçîña ÖòaͧÏ`¢‚ƒ<$ÑÃfpÃ…'FŒÌs¶qs³ÿ–³Û·UøWøßJ¹¿ÿå=8ãp"Àÿ»/¶VîØvæ‹€òÏ·6M}þȨQ¹ÃÒFå–inâÿˆ­Í¿ÙÃ܇û’k°–k>} `k»ÔD±mØÈx»¡é¶CŽÝ7¬ðAǸWóû¸l“ßñO|Oøùžü‰2?ßã~~%~~Å~~¥½Q⻾àßÒ ŸÙðñ©õ¾'}}ÏO}!ï¾ûìFDÛK>쨭u¬$,÷ßò ÷á>wƒk°–k>}‰þ àË®/·²Œd—tÝaÛÁév¶É#b»Ÿ]ésrõ‡E>ÞÅÞÞ¥Ý(ù º>Þƒ2oïSô)¯•…^¼ïSòžwÍ$—»Áñƒg ²MlKß"ÍÄh—µ¥÷á>ïìåÚO£ÿppX&Wl²¶I´°Q[Z'Y[%ÛX«l,½ñZ™»Û1w÷,w÷¼…îù½Q°Ð½ðVYèVL g-Xœù®[žÛ¢³#GÄXYÄX[¥Òý-­ÕÖÖ‰ƒm¢ì¸÷á>†íìåÚO£çHMY%Êæïh7À4ÚÈ8Æx`¬‰q”…Ù¡§ŸJŸõfá¬Yo½•Ó;®¹½‘7Ûµpö[y³ßΜ5'ó ×ü™¯·°47¦;™D™D 4VUÈÖ=ý×[ÿc'÷á>†äìåÚOߣçØðÉ4™¸ÂÈè£dŠp™=ãwC/¦/Éš6#cÚ z,|Ì9U!ß'Š!ry¸\$$£ 1T?—$׺šE܇ûªk°–k>}ž àaÇ$q=B{)ÐA@AQ ´søý±“Ÿ)˜òLÆäIi“]Òž™|ø÷àâ’þ쳚‰Ó&ºd=>^£°ã}cFx=ô]Ža»$¾¿ëëù܇ûªk°–k>}>  ¥q©HæKd'@¡Dt!šÁq¿ãè¬ÇÇ¥?1.íqçTç±Éãþ’Ò¤^yâñ´q·ÇÏ}llޱIÀnLB0ŽÀNßð^ÀÁ‰!tà3ãå@îÃ} Ò‡5Xˇ5½ ÏPÇ®4’ùØ%‘€"xsa€B —IQ¢,xø½1£G%8=”Lc“º‘Ð+ŽªÆŒN92e Q!‡0 #BB”´„ï‚p´ „ŠâæQŽë¹÷1HÖ`-Ö|ô‚> `çvW +äÚŒ"‘„´÷_Áˆ¦Gk!QÁ‚ðµ¥EÈÐ!±Cì”÷ÚÇü„òޡѽ`mo«´± —‰ûBËœ{@8@4xL7Çôæ.Ý?˜[-,ßç>ÜÇ }Xƒµ|XóÑ ú,€Ï6ýÀ*"8P‚hÊŸˆ¹ @$AQ’¨TÈ•æfñæf±ææJsóhsó¨_0‹43‹4505‰i»â‚bð/[Qâ$"ÐV=àLâèMÁ_ˆÂÒ“e¸÷1<Ö`-Ö|ô‚> àÓ3é &(´õø›P‰X%âD¢I¤(„‹B˜vñ3B= ÚL£¤š¾äכЇɀ”4}À‘˜$b¤$x‡(,+>¶ŽûpÃóa ÖòaÍG/èµ6½¬„HHFÐ+R‘öYÚŸj‚Õ„ÄKHÁI¥ÜDÀ©ÓE2M#®ö…ênû$HA(ަX…q:Fñ}% ˬá>ÜÇð|Xƒµ|XóÑ zýhó ‚|tÈÈ@4 mз@cÍÄÚ n‰^“t3PÝ:õ&¦ HÓ­S°n+Ð^Ùmú,RŽD¯É¡sÒ ÀóçpîcH>¬ÁZ>¬ùè}À®¯]òH Žà€t€Ã= '³4™ ›S7RzƒÎ)­ç>Ò‰nÆ€’èn>Š‘#ÏÓ'7rîcx>¬ÁZ>¬ùè}€&ËW–`t@"9ÒʺmôÙ½@/Æi€S{(³ç>4rh“#D'G‡/#‰„l¶³_ÖÖâÎ}¸áù°kù°æ£ôü—À¢8O.;(`P>By¿Aίù­ó?“ÛsŒò(ÐÍ Á1:¹,`ÅCzqîc¨>¬ÁZ>¬ùô=ÿÿÿìÝ TMùðÿcï³;¥ÐkTÌBÄpi01cFb°Œ;Œ±†ñ©(1Ty1.ªaŠH¨<ÓChzŸ:•ÞÒû¡÷[4˜1kÜîÿãÞ†fÍÜQ§¿ã¿Ögõßûì³ÏwýÎZ}ÛuÖ9Ý\&ãö‹ø#&—HIJ!L”R٦̳=í'+ùír0H!£|IŠüá/B@Ê$ ‘ìüidXå2æ×Î3?Äò°<Êš‡6´Í‡¶<Š×ͰoßçÚsüU³’¹¼J ‚lÙ4a<dóVGRÿ@“SɺJ”˜Ž°„㎫¨,=rÄåay”5mh›my¯›  ¸ÐBPµÁÜ3È\L²?ÆÝzþªL’Ï4íAŠd%Ÿ,– „cÚ§¯¿ìVÊv–‡åQÖ<´¡m>´åQ¼îÿB˜Qc¶"äÁ#r¡”dric˜)—ÕY È ‘“ƒ\rfŽ ‡pó´i¼‹åay”)mh›my¬û ÀˆßΣ+ä#P‚@ñ³Dª’Ì«€;²WåUÝA²óBË¡ihØy{íeyXåÎCÚæC[ëþ FŒØánuqiHJ® ¢Ûg”@”M­ À\A øK:ššn©«îø+ÙX–G™òІ¶ùЖG‘¨(€°Ð ‚`Àq%ŠPª!Ì8 `rEVA Åæs(›ã®c´G[Çâðá?ü–‡åQ¦<´¡m>´åQ$* €°²^ÆñÎb!ŒƒäB©ÁRÀå® rî"Pöª`)iuN$å8Ì-›=Ç©¾v9ËÃò¼!yhCÛ|hË£0´@mÍá.<÷“9Xaà‹_ ¸ „Ê1|¦B®ò¹ŠçÊÛ!›Uò{ÿ(tW$Ê0Àí#Þ]ú'o¿eyXeÊCÚæC[…¡¥ˆ¬ôyÚÚËÞ]„b9\Žp©_ ”CH®Â*¨D  ƒjÔs ƒ&ê!¨ ‚J(»R«/Èž4@R¹°Âr“5yEKEàš€wöë¿hÏþã,Ëó¦å¡ mó¡-bPTDFêÜ^½lytT,Hy¾.å› š7¬…°J®Rv åûÛi°Àë$icŸƒq8†[úõ³Þ¶ëû{ÍV,Ëóæ¡ mó¡-ÐUDvÆGŒöªp"TÈ#2ÄåZ¼P#ÀÕWÈ :€äãnúÙ5²ýà>IW‹ùl„O¸öíþs]¿mj´dyXž76mh›myºu@”}5Él?·q @ŒS0ªƒè„äxàc€É=¸¨ ¢fˆZä·M7Ô P µ"\"` ‡Žbn¹±‰Ûþ¿ùw7–‡åQ¦<´¡m>´åéR4À3;¶íí!Øóh7D×D*éåAXáÇ>Aè)Oø‘t,?cð„¿ÈÖð¾ˆkEà _!ñ…hc/-Ëé³6]yÕé³<,2å¡ mó¡-O¡·ˆ‚;KæÏ[ʉ!Ú¡·XˆVU¹Ã£Jê0jûhÀ#<æ@‹6ˆPsÙçí‚ÐIMcÉ(“•[¶Ÿ¨©îœw\±<,2å¡ mó¡-OW ºž)Ì·°±±ÕÖ^Åsºcä'BEü5Ýäa$£eÐu x€}Z«ÙkÙøñ¶ž›22:ÿ³–X–G™òІ¶ùЖ§s½ð_~§ìVÛî6ÜMGw ÇÙBlðZ„¿&·¼xuåŒì'Nsqp8$‰sln°byX–çõEÛ|hËÓ)^§h/#Ý56ÆñF¸}XȪë×ìb£ÓÓv47¬dyX–GùÐ6Úòüm¯k0 Ã0¯ˆÃ0ÌŠÃ0T«ª°ºxÑîÔ «CóyÎõ=¹,.v+ËÓ)X0 C’‚¥žû¿œhº§§šek¯à-F+²FЊç¬0^¡×ÇÙÒrëYßÕo`žÎ €aŠœò]ab²QÄ/Wã¶õÕ<òqàÌiç7I¿qOq?œv໌]{3-Ž55 2xJ£‡§À9köt°\þuQþ²7!OçbÀ0 ®m8p=F›µµ¾ÿÞ%»•·/´äµµ´´5·ü»ñÁÓÖ'm­?·Õ7·µ´¶UVµEGµìrÉž:åÆ!¾"ÎAE´r¹ÅšêŠUÊš§+°`¦›U–[™/²â­VÏ>J4_šq!ø~ií/5ZËjj+«ï××ýZ_ókmõϵÕkkÈfkMÕƒÚêÇM¿&gýê¼#oæ§ãaÁª¼‹Ž–í…@{%ËÓuX0 ÓR’?ï;ÐIMÍmäð˜Y3 ¶lLM‘>-,jË+xTPr¿(~TTô¤¨è'¹ÇEd³’’‡äÞã'ªæÌ–LŸRÐGûŒÀ;X¯Ø¤4yº+†aºÍåË«Åê½zí›<)cÊÔÄ  ¥ m™iÿNK{”–Þ”š^—šÞšÖœšú 5ížlñ{iiM·³šRn5§e>=áóð³O³¦LÊ3"X­™õϹJ§«±`¦{\¼`ƒÑ—½5ŽL1+33M]ò•$,òqlÜã˜Øûñ M1ñU±’ÊXIMl|cl\sl|}l|Ý ââëã¢êãâêc$­QñOÝv×N4šlšb<4TàÖ½küÿýÞM[`À0L7HMž£ª¶°wO³ïš¼›gfş>øFyphehXUphiXxYHXiHØÝКºÐÊЊ—T] n © ¿Yq9´òrÈO HM?HýpLÁ¨w$<çôÉô9¯iÅ`À0Œ¢•.íÛoCïžÿ52q´qÎØ1ÉK-²üÎ6Ÿ Ìó,n§Ä?ð®@¥@•@¹ÀÝ—Tœ«(8Ÿë!çìùêî-£GF^<Ö¸dàÛAzñziË£x¬†Q·3Eüz5µS˜¿(ŠTΫÄB šØï-ÝÓ3fH?û,~Ö¬èY³¢þ2r0yHÌÌÙQ3g“Û¤Ñ&7Å*><NE%PEì'Rõ‘ï/ðûÁ¼²|%ÍyÃ0 2rØVßá Nð4€~œ!0ôððÀAA“?–Nù8jò¤ˆÉfOþá¯03‹œ:5vâĈ‰f1ãÆÇŠU½òAð,g!òØ›< ‡8(ðëŽ}oIsÅcÀ0Œ"Ô׬汥€à‘?„§!Y€sùùˆÑiŽ?9lx̸±‘ïgrÓdÌõ±ïÝh'¼Cï‹kòÃøñ’ÑcâÕ5üðBøBç$OÐ €Îrø &?|ÓìÏ}©ÍÓ-þÿÿìÝ{T”uðçy~¿wÔ¸¨uÚkÝÓV𑹶[í’uÌÓîV[î±Ë榦¢&¢å=ÍKë5¯ešnšš"ƒÀ(Ì^R@QÜA@”Ô²£±¿wX OgWxyÅçœÏ™óÎ;ïüüþó~ŸŸãœ‘cÌÎãš[ÆX&e8Ð׈«k À*D˜Å¡YBÚß¿¡ãÃ1þnR:ÄÕS§8:uÜòàƒ›[4_'ÄZ6!#× °«M7ÐJÀuH‘R†jÚ¬‡;L3mžFÁ€1f„ÅŸõ&é¡wb8Ê5¨Þ‚ªma=Q¤ND„HùE«–ëÚµÝØ¶ý~¿ WÙïoY¿H¿ûì÷´³h+¥P›wµ‘_) šÔâ´Z. Z?DÈy-[}`Ú<‚cÌŸÌü»€ñ× ŠŒ@ˆt³_µ¡@¸À«f÷ô°ûúDûúlôõµûúFúúFüÌ'ÜÇ'ÜÛ{½·W„¦vÓ´Aàúy)% !AßÚ­#E´^Чšv sº9ó4 Œ1#ÌžÑS®À± o‡oJ€C#‡EFi®‰pM†iÒ¦üDF¨G©wh„D‡D§z˵‹¨§›íªmÂIÄÚ-Òäðô=SÌ™§Qð`ŒaöÌ×ôÂ…P[6!ÄÔ‰` ꯪý²SSˆh!6 %(Nàæ’¶R›T«ª2ÕßଵN¬€ÍˆQªmDÛ£.ÑäˆÝ)Í™§Qð`Œá“Y¯ ã.ÜíÛQ¢^¬×Q5Oú5¥¬®‰«)P÷ñ–„ß([ÝǛɽèWÖZG½ŠN (@uM’êewáÿT¸fËÓ(x0ÆŒ°ì‹ÞˆAVaSE)(`À77P'\ñàîåZ6×EõòÖ×AØ&ܧV“”Jè$\àå|èÀ sæi<cFp%LÕäPÂUV‘$p  0ázzÕ&ÖA]L[¶Ü`+`üë ¸$©;¢jjUî;-"VˆYmü†——6gžFÁ€1fMëïaùZ’*Ĉ;n"éZ7;ÿ“ä!Ü!!ÅݹÉ{TázX¢F>Úy”™ócÌ ]?×¢-‘â„]ˆ)ˆ;u¢?ÕÕœ©Ý¤Éÿ½F] ©ª:oê~ûõR$ì°“ôõÓÕO»ÐF¼Þ{‘™ócÌ sæ¼,µ(ÂL d @‰€»ö!ì×Û“ÔÓ=uI»‰:.VKé{mLLÜK"YÊå}–,™næ<ÆãÀ3Èñc}­Í ¹–0Cõ `*è¾ï¹Z¸jk¼ËÝ¡é·!ôMýn÷Ÿ’AÂE4ç¾ûúíIlæ<ÆãÀ3Nç.-Ð(á(è‚Ú}ã>·Ìú‚)`?©Åá°ZYÊ8Ä{ô¨ã —fËc0Œ1ãØB?°h“5Ú à(AÁñšNR[cÕY‡ô¾U‡H_ÿÂaI;—yy}ùïÙæÏc0Œ1Cuê4qÆ]žjGLpÂ*O"‘tà$ê-™Uð°&²R¬Z$á耀‰%…uÿŒfËc$Œ1CÅ8ÇZ­}–KÚi¡“"‘ â(@BÂñz€G%í—r“ ™­ïî»xñMrÇlyŒÄ€1f´ÀAý¤6ÁÓ#ñ(Aá Afåœ"8y«ð„ÚÅKKŠ”_ ÙïÕžcJ‹ûßFy À1f´â¢ÁuœªÉÏ5Ü-±P`hÙ ™G”+°Fž[þUyWåÖ¢ž¸_½ö]tÊb9¸pr§ÇGF;áëöfËcŒ±F¹÷õÖ­û[µùrI‘Kâ´Únƒ51! Ÿ @@¡„R eÊ JŠ òQÿd&Ï} ÎœC8j‹9ˆ¹R¨cÕà',kÿò{àí™s—ߎyŒÁ€1Ö82Òzùø Õh©§5EÓrAíµ ¥T½b1b[¾þeîóeµ”Vž,QÈý.µû¶h…ˆ8ÑÏoФi_œ©¼Mó€c¬ÑìÏx«M›Ñ‚f{È­:¦‘*Íoݪϕ(‘§£ Óîz-ÿ™~A‘~Î 8¯öæžÚ~+G´{ ×„?-/p[çih<c)'ûÝçºÍÕÄ$ 6O‘*¨é ¢*Üó€.¸QŠ •#U UºËQ”UU’(¶ˆ«H–´TÈþþ]ƒ¦Ïý??g7[žÅ€1Öø¦LšÝÂ¬Ñ ¤X‹Ç^AG‹$]$¼DtáÁ·jO-à{—$ü ãY‹¬"8ç¡åY­IˆK‘Æù´ðâ+ãíŽ[m[³åi <c¦uè7_ï#-£‘¦!~éioæqH£|‚A•8k…*+\°ÂE •Xо^Kºw;Ù- íw“c¶]t%^LpMÚQžTàJÎw%¹’Ê\‰®¤RWRÉu“J·—&&–&$WmOº2}Fñ³ÛŸHõØi•<îÿ¿Ía³åa¬)1Ûýe¶<0ÑHÛݳYóøz/èöÌ©®é°ì«Òè͹ÑÎ|gLA´óDLÜIGÌ GÌ)‡³Èá(q8óμÄF—9q[òìÎ|»ã»·ÞJ x*í™.YIÖä˜?¿Øó6ÍÃXSb¶ûËlyŒa–s¬O[¿±¾ÞŸt~lçþŸì²»OßÌ5!kÃŽ„†¯%'4ìT¨-?ÔVjË µºAžm]©Í–k[84ü`ÈúÂyó+Ÿx,¾KÇãOúç´o·QÓ‚‚‡ÿò¿É˜-cM‰Ùî/³å1ÌÿÿìÝ pUðïûÞëîBBI”D"‚,«.à²ë‚¸Z®U"ºJ! ‚`§AH¸$r†;¹’’˜“+!á `Â}+µnÕVíë‰h$¡Ö˜yi_Õ¯¦zzzÞüë{õÕW=•C–ð箓4mZëV™mvw츯}‡„IS*W¯¾´vÍ™U«Ž›Â9N¬ZUaZYñãAm+O­Zu2<üHxøuN-\|£Ûs…Û—wìpäÉvÅ~¯e¼_rRpýÊ£(V"[É–Çi¤‘# m„oÓˆ€Ç‹¶jSÐvë¬9—ÂæW,^pbaØñ°; +w8ZKyØÂƒ ÃŽ-úìÄ’å‹÷ÙÅ—ÿ±»mÛü–™m [µÌöòkÝjìÕKwòåQ+‘­¿dËãLR ?¿‘ö-Û$ù7Ïò{do‹–ÅO´KüdâéЩe³CL9r趲С¡%¡¡ûCCKëR2£hzHéÌ©å3§žr($äË—_)hÑz»«Øf-³k¹ÇÏ'Áà£Ãæ¿Y_ò(Š•ÈÖ_²åq&׀ϗô'íÝ$öaÿ´‡üwú5Íò÷Kh•0,¨bÂøC“>Ù7>xppi %·‰ãµ”/›P<îã¢1ãK> ®|¾{‘Ó¤¦Mw=ì—ÕÔO|D¦‡ÛJŸ&ãêEE±ÙúK¶ÛÇ7µ±oJŸ4ït_Ÿdß&›úô. Ü”T0$¨°.EC‚Šï4d÷Àýâàƒa9 Ë~?° phE›VñÞã}¼3ÄúM|R||R›úÆrµaÝòçQ+‘­¿dËãd.;&júw÷¥ Ý4Šuswo˜àáÓØsÓsÉêûvqß¾»Þy'¯nýóëRЯq¿w ú½›Ý÷½ì>ý ßxó@ãÆ¼ÅŠ•Ý<¢Ý<¶5tso°Å®O{î¯wþÇNÙò(Š•ÈÖ_²åq>€™Ó_Õµ±nn뙣ۣtÛ6›m7¢Üìùn|å•¢×^ËëÙ3»gÏ]¿š¸X¼%çÕ^»^í%‹Ÿî”a·­Õ´Í6[”Í¡7ˆÐŶÅÐæFÿ³•CeΣ(V"[É–Çù\<þÐîSC›¸† €#6 7.}¬uBŠþþ®ÏgöèžùB¿F÷îY/¾˜Û­[f·î9]ºæÚ„­%Œ$ˆDZ ,\| §(‚ņ6fåòÁ2çQ+‘­¿dËã|®—/ŒÔØ`ƒ-ˆ@Ú‚¸ÅlD½mäÚºvísºtÎz¶sf—NžIïü§5¤ÕéÙ.™;íìÚ5ÿégòÜ="VÛL´ J|РHÎâ™Ø ßëõ ÒæQ+‘­¿dËã®) Üôñ Vr ´qCõlÜÂX”nÄhzäcÆ·o»½ã“éâ±C»´¶×©ÝÉÚg´i³£¡ÛfÆ6ÛÊx â6qb­ÜŒËùM›Ó¶Ý ió(Š•ÈÖ_²åq W€¥‹ûŒµ™5ŠFæýW$ŠêÃ6¢X‹ˆä|y“Æ››?’ðˆÜ£Íâo‹{´ylšÅ6ó‹óõŽÒµuœ‰a.û6€(€XI$'qs·P¬Éøg›Œ‘6¢X‰lý%[—påø×ì2˜Èq£$À„X‡¸Ûâ«D3Œ1´8»-ÎË3ÉË3ÁË+ÎË+ÖË+ægžÑžžÑmk䣉éJñ ãé祄D„TsÔm&–(nÊ-ÒøÈCe3åÌ£(V"[É–Ç%\9æÎzClÃH†©`ŽÇ»b¬Q²Î5§±hGi|«yð#¹YÓŽÉSÄ[~¹ˆxš'ªM,•0ŽÑ¸ï49ó(Š•ÈÖ_²åq —€Ù¯›[d¤#l¯Aš¯Šù™Â(…±$ÆKd”ÆpG5NŒÄAº¨2¡(®ùF€”ë¤2ؘ(ª”L”E˜Äp™ÆGï.š,gE±ÙúK¶<.áÒ¯€æôb8Þ±»v¡(Yè;ˆ²f“yAõ&‰kÒª ê8ΨF¸S@Ètï ÇR`^Ycñ*¦%ŠkòÄ>96`ÔO [E±ÙúK¶<.áʰryÄÛ* Ǩ `g-âd@.@68ö©†uû”Y{„,æØcÀ4±§=„)„a£Žš%gE±ÙúK¶<.áÊ›¢ñá„ë –Ç°00çNf鿨ƒ¸˜22jÉÌ®½B.ƒ<1ÉÅΉÍ.ÔY*csü›}xírœyÅJdë/Ùò¸„‹XÓÙôœD  î"ï—îvþ'ùµ!,àPäØƒ|„½blz"ÀØ'Ÿ'sE±ÙúK¶<ÎçâЩË|][Æ™¸E*F,B,4A‘ùÔT}¦feó¼F\ {D)kÙãxûŠ83($sýýâŒÝǴѽû/‘9¢X‰lý%[çsñ˜7ïuÀQ\K$,Ê–$n¯v@8hVóÄÓ½uÙwu\,–2g/æ–Ëç|µÍöÞ²e3eΣ(V"[É–Çù\<*N 01¾‰°TÔp˜_Æí½½bT;jºÿ!ì#sÈïv|J)±\¢y~~÷î™*sE±ÙúK¶<ÎçúóÔ3Ÿ…i$n”Žé0ˆiŒÊî„2I,åbeÎÓ?yé¥:~K¶<Šb%²õ—lyœÌõ`ë–1º6U£xÇNTT×HŒJQ¯ãGÌ]¹WGÈ\ÿB9§•#ÂWÍ•?¢X‰lý%['sý:t˜8ËÝ^*&$ÁiƒŸA:¬è(À4«vü>ÀrD(2´XÂà¿ýmò¥óuÿK6Ùò(Š•ÈÖ_²åq&)Àö” cÀjN…:Ñè<â1`eÀÄYÂ)„Šûq:Èy:£ÙÞ>–.½ëŸà-¢X‰lý%[g’bCrm’ÝØÎQÜ(] < ü0ðã@•_œ¹WxZLu®q¾–ñ½Þùâ z”GQ¬D¶þ’-ÓÈ2.^z¼}ˆÆ?×p7Çó Ïv´ àUD• «U9œ½­ê¶ÊÄÓsŽWù.úR×&NíðDZI)ÿçÇoeË£(V"[É–ÇidBYIooïA†¶@§\Î*‰]ãŒJDqVEp–àƒó.s¸ÊàÁe„ ç΢y§Vå8g¾F¸‚bäâ)ÄJÎıØÑÓ:¤lz³ýfÏ_]ó(Š•ÈÖ_²åq‰€Pºï-OÏá­°EšV b–jׄk ÊÏ9œ5áªãüÕ®^¼xI Ç»Ä4ֵÌ¥1œÜ¬Ù)3–߸XOó(Š•ÈÖ_²åq¹€p°ômÿ`FsmK¾µaÝÀ/r?UyÅ’dë/ÙòÜ‹ÿÿÿìÝ TÕUðß]þï=DvpÄR“L3*Gm™Ì:M3š9S3)6*`¹ jT¹5.˜¥{ˆì;ﲇóÿ»|Ͻçw¾ç¯C¦jíÝõ»™nÛ­Ì—WyIdÅo¼c/Œ<%êIȲQ#ý–.}/$håÿaAÞæ‹·*_ø†ÖÍ-~ü¸Ï-‡ïUR?[«õK—ü©îâ›ÿyANx›/ÞòÜ]\@Bü¦qãÖüŽ½Ý¾'~³bù¹¨ðk5Õ½×®õö\ûW×ooþ£÷æß{;{z¯ÝìmnéÍʼ¶Å¿òùÙ©>¤ ëUŠåK¯nmzK®yANx›/ÞòÜ œ@s£§ÇBOöegµû™_ä{,*‹J¼~©ýŸm7n^nkon½ÞÙñMgÛ7í­ooý²½½¼ÙÖr£½õëî®o +¾ñû zίs]'%“üìÞŽŠX%³<‚ '¼Íoyî  ¨ð•Ñã|ÍÍ·>29{îK5ïn,.Ò}[[×[]óUMÃõZ¦þ«ººÔÕýÍàë:ö²Ÿ††/Ùwm™?/÷ÅÙ5#íO*¥õ^Ë6É& È oóÅ[ž{Š»ˆ]if±ØÚzç¬gËf?Ÿ¿aC­.¯·¼ä_%%_•”v—v—^-.é).¾Q\ò…þâÇJJºÏUtí))ÿöè±/_þuÅìg+§NIT*VÏýÕ«2È#rÂÛ|ñ–ç^ã«¢£¼ þåÙî—ÝÝŠÿðÇܤŒ¯µg¾ÎÖ^ÏÉëÎÎiÑæ6ksÛ´9]Ú3=ÚœNmNÇmÎätžÉì$²u÷žk?’5urýt׆qcâ%iŪÕÿùïdxË#rÂÛ|ñ–Çhx)€'Ÿò“¤Ÿî2¡ÐÕµxò”x¿÷é8vôò¡C5z‡/.jª×;XÿÝÅ@ª;|øÂáÃåǃöîûbæ3ù®“«\§\xxRãÈc„.T'ú ­<‚ '¼ÍoyŒ†‹ ^¡”VŒìò`‹Kåø y.÷íèÜU¿oOíÞÀšÀÛUVTP¸·roàÅw×~²§êã½Õ;w·¿øË‰sǺ¤»LÌ?6ËÆ2ðñëº:îØÃ¼å9ám¾xËcL\€£ãJK³=c'$:Ép}öþ±MJxgÓ¥€ÍÛÊ?ô¯ ð?wKE€y@@i@@I@@Ù`Jý·è>ô/Ûº¹jëæó[üÏùû_yñ¥¼ûHrã<6cÜØ"G‡x%]¸ë·C% È oóÅ[c2}|ú‰ÆkìíbF:¥üÌé´ã¨ 'ÇS.ããßò®ßè{Îïb_ŸŸ²~Joa×åTøøœgßZ¿±`ýÝZßÒ?ù4>ë®s•8jTæHÇŒQŽìG¤[št°[?$ò‚œð6_¼å12Ó€‹Ëj•Ùv‡ɶ#4v)ö§F8¨GØüýkÞžg½½³½½ó¼¼ó£óò.¸W¡—g »XöVö²·²þè™ç¹¼~Âø8{Û8û4¶¾ƒÆÁ!yÔˆŠW_ÆAÞæ‹·~; : ò±~ýöŽ™*–Hk^óø„ç<‚ '¼ÍoyŒÏİsç+€VQ)£ À¹@²³Ç«B€r•úÝD9ìåÙÁßÁ 7³¥ôÝ‹ré•b’Ké•jÑ[yÎ#rÂÛ|ñ–ÇøL\õµ‹•ü =‰QÛ@E ÿø³·€UeaOK~"ÅX_ò…†ŸR†‰㎎ož-ÚÌsAÞæ‹·<Ægú_óØÔ÷0”0{Pºzçµ1*7¨¸[T¨Älq¨b+Sš‚Ð;/¼0È?Àâ- È oóÅ[#3}„‡­UH›%Gà"† õ}{˜U%Û¯€ úSù©.`ýúµª(ÎÃè ¥åŠÃ‡>â? È oóÅ[#3}0S¦lGh›…YkH —”ô2Â瀔®¸Œô»Vs *‰Ô!Ð)¥Œ|ÜÜÞíhüW²ñ–Gä„·ùâ-1qQIš Jåb€#ç+ðe ·"tHöDÖ„ Aý]€.R\Ié)‚·Û;,Þ¿ÿŽÿ Þò‚œð6_¼å1&. €ñôz“J~fÊ$ŠØƒRF—€žZ¸Ã —*t‰µ:Uè(=Fè›óæûv¶/ByANx›/Þò /ÐÞæýàd‰~*¡BŠZ j©¤z M7Ô§É ù–¦[ûa/[ ßýñ§ð…â< x@›§<º.Qóþù-oyANx›/Þò /ÀT”¾fo¿D)íQ`-%˜\eõ ÊF„ØSX†f -Z)tRè"СA‚VÍHÿ¤Öd¸`ïÜ@p±ÊE 5R®ى^R@²’|è|ÿÂí»Ž Å<‚ '¼ÍoyŒƒ£`ÊŠ_µ¶~[Â1Sê$©X—J=L7°íFíµ4ë¿B—áý®~ºõº ¨ƒÁ†O±6VHç I!è]gg¯÷·|öEçÍ#rÂÛ|ñ–Çø*¦²ìu''‚?RÑt®•0ÛÄ¿Üôà. ­@šôp૆íîþþ†6ýûpÀ—¬«Í¤JLŽZ3æþWý>îîZ:¤ó‚œð6_¼å¹×þ ÿÿìÝ TÔÕð»üÿ3Ⱦ¤¨•¨d˜RZ–ˆ¦󥙯UI-Q-%+…D-HÓRsAömXfØef`M‰­TE%”—–wgH#Áóz©Ìåï=çsæügæÏå{î=¿ó=ƒŠÔQWóþ$—m<þ”‘¸£fˆ~‚ÀÏ^èŠÎe€[ .BÔ Q›îñ"Äj¨ á&®c‡¾ÁÜBG'€mÿðçn´åa!¡m¾hËs_ÑX6|úy?±'6A”"’”bT a#‡®"x ¡\Cà?¤c1øƒkøM{ /‰¸v.Kø³b±Âo Zkf¹hÚL_©ìnwŸ¶< #$´Ímyîz €¨:9ïí7çs"oˆ6B¸ß@œc(9É£zš1jKbÐ.WÄà*ÚDð¼åñ)±ö÷í†ÐÇÈdÞSNK?^ ñܽùW´åa!¡m¾hËs?P]ª¿_àî¾ÜÊjÏy!¸£±\ħp(ƒ‡Y<ÌÑBiŠDð¶ŠÑ* ³÷Æ_ä[Vvï×myFHh›/ÚòÜ[} n 9ì±bù‡‘Ö6sÜrˆ=^…ðä‘7XÑÏdá{ω/ùyyíRåy·žw{Ðò0ŒÐ6_´å¹'úRtUVê¯ÈõNOõL–-KKñPäx—j6´ž_Êò0ŒðÐ6_´åùÇúj0 Ã0w‰Ã0̪O@ÃY·ØXÃÜv¾½+èàCïå)>ayFh›/ÚòÜ>SuU󃶽5Ñy³©Ñ¢~’%<^Ì¡å-Eh ‚n<ç†ñâý×-ZôIXðŠ0à móE[ž{¥ÀáàÅNNkEüB#îÓA{žsŒšñRô:_õ–Å;vk¶U¶ñóò¹ï*œ†Ú6é$æÖY˜z-ZøAÍ÷ï=yFHh›/ÚòÜ[T@b‚¯ÝjŒ>²²Üùì3qKOÄD¶UUv´µu´¶ý~áòökí¿v´´v´µwÔ7täd·mô;>uJúc‹8/‰héÂ+Ï]&Ô< #$´ÍmyîJ  þŒ›ë\7ò!ËÒtû„ \ç—Å$]ú¡é·ÆËí?66ÕŸ»ÔÒ|½¥ñzÓ¹_›ÎýÜÔHž¶76\n:wõâ…ëE××m¨œñŠÊÑ!É÷³¶\å)°< #$´Ímyî  ¸èµAv>FF£GæÎœ^õñÚ’bõꚎʪ+Uu—ª‰Ú+55×jj~ѹZCžvQW÷3y÷Û ³g©¦M©êo*æ½–,öL†Úæ‹¶<÷u •®00^`f¶uò¤²)S Ö¬©Vçw”k~×h®hJ/–”6—”ž/Ñ´–”\.Ñü¤½ø+æâ‰Š‹ÅÇZ5å7üùÕW*¦L:>fT’X´ræ¿Þ@†Úæ‹¶<÷]ãŽÑ[æ&{¦¸üèâ\2ï}UrÖUEÞÕ\Å%eþÅ\eƒBU¯P5*”y­ e‹BÙ|›³^ ¦6à móE[½ÐgÈÖ‰|0ØËq10¸óˆ0ã(‘8–…Ù=?rD²ãiäq”CjÉ=rx\6jdÆðáéýŒÂ1E8s±Fc %% Ð!Ã!Šã¸žß2Âa#µyFHh›/Úòè…> `÷NWVK´{¹¨ýüÉîƒh„â´p,a÷µ¥EøÃƒ ”>28þ&é#Çõ`pÜ`[©U”ˆ?ÄaRæ¤Ø£ˆ ƒ$DGäÃ]8€dý0Ìm·°üÚ< #$´ÍmyôBŸðÅæcàËÁPŒ’Œ… NGzS|'b0ŒóR‰ÔÜ,ÉÜ,ÁÜ\jngnû'³3³SÓhS“Xž´+ŠÇ0ý¹‘A Úª(áDò¡ £/ynʼnŠ:ó0ŒÐ6_´åÑ }Àç›f“À0 à­Ç;Â@Æ#™ˆKä±”Ç1<Ås‘Ú‹[¸XòÈi÷4–ƒ2ÊÉ—üuò4 @)Ù}€bNAPŠÑ.ž[©9¶Î< #$´ÍmyôB¯°ù5í€ 2Hƒ ¹Gd@í»¤?åÉ1NÂ8ãDŒR1LïÄ¡ ŒÈEÙeÉæj¿y—uR0H‡0‘ì>@2„²LÂpÏ­*RLg†Úæ‹¶Ôº3PApŒ€D”Àê'žò¢9à móE[žÞ§çp·MÄïá0ùˆT¡Â- Ö>Õê|¥ëΪþ¸‡Ü ŠÉVvS¬ûòÛ! æ@!H»¾†¼b ‘b~Õ›®»hÎÃ0BBÛ|Ñ–§÷é¹¶n} @OŽOD° À¹‘WE”Cp\»›P yz¬'%wÐÃÍd)m÷B€jKVqÜ·Éü={hÎÃ0BBÛ|Ñ–§÷é¹j«ˆ Ý1Š`Ù‹ö‡qÇn©ÊBÝžjî%H[òEºïR†°¡­¶¶ï+^Os†Úæ‹¶<½ï¿ÿÿìÝPT×ðSîÝËŠô5V4$jÐÄ$ˆFã‹Æøbb/QK°`[ŒÔ˜¨Ø‘^¤ˆJè jè*HSé JÔÄŒ>ÞY|¾%“"ÈaýÏüæÎÙv÷›»sîwïîÎnëÿ!L¿kq ;QºŠ.#ÖÆ8£QfsÁ(“¢,ÂVŽ²Ùš!ãU#G6ñ,Þò Lx›_¼åyÉZ¿¼½–ÊÄu" ¢è*A…<ÞFˆ°ªdÛ+¡+ŠWåE]!Šõça”-$‚÷««ÛºØÊ” oó‹·ecŸ–º¾öæ<È€òám~ñ–çk«àAÀ+ªM@i±•¿¿íÑCV{\&îqà~dV|ÜÈK›)€Âܮۿb±ECuN{k‘ÎÈJæbM°•(XQ:·cÇ9sÖxº/|óÀßÕ à¨û\só2q¶ª°¶“öwïšùŒéë¸2ùëwîMÝñmúÆ­S¦ÅYX÷è~T½½«$8jkØÍ™ýUþÕY¯Bøg¸.€“Á+»w_FÉ*]Ýï¼`;ï’Ÿw]nNC]]Cmݪï<ªÐPÿKCUmC]}CIiCLtÝF§¬ÃÏôîí.ìTdófÏ\\V<_YóÀ‹à´JЬ¦N±È¼nêŒt¿Û×*~-¿S½¼¢¤ìvUåêò‡e¿T”Ý­(gëËKïT”ݯ©~x!ó¡ãúœ1'š‡´ôtøù,R²<ðâx,€‹>íÔÝAUuS_“ر£sW¯H¹˜ü(/¿!'÷^náí<¦à^~þƒüüŸÝÏgŸRXx—ÝzðPéøq‰£†çvÐ=.‰vÖsW*MhÜ@`àB¹ÚLMÍmƦqnùò¼ä¤†ŒÔÿ¤¦ÞKM«II«LI»™’Z›’r'%õ–bð{©©5—2k.þX›šñèÐở|œ9|hÖÓI¶xì¿&(Ah.|€¿Ÿ %_h©7Üòº¥EÊô/ãîÇÅß»T›P—X—X—P_—P—PùŒø„ªøèªøøªØÄúè„G›6W ±ˆfqѬO˜$,}Ëìïwó–šGra|;ÕÉZ.–ïÝ0+ÇÒ"vÿáª3E!a%aá¥!a×Â#®‡†_ ¿VZVVüœÒS!Õ¡¡¥g‹ÃJCž4)ÙâÝ”÷äö{#Q>5¾æ€æÅKæÍèÔy¹–Æ7ýúžëovyà€ 3ffzxÖ÷Éñò)xJ¡—Ï /ï/ïR/ï"/ïÏ)ö>Qåí]äí›íåwÙÓ·lÇκþ}c˜ 4+ìÞ%Xm-þóÏ`yËÍŽ—xw°£(®ïÙ#Ò¨×3³Ó`ǵEV>týÀ\·«ƒ¼ öüoð¼ý…仹]qsË8â^èºûÖΙ™d›™^yÓø¼A‡ÃT˜bß¶ò@³ã¢<=l%ÑV¿£‡QïóFFY=z%õñÞüu¥Ëö‚Ý;ó\]r]ž•ãâ’Ý(ç9Ù.®Y®.WwíÈÛ³3{—kζ£>ºÐ§Ob7£H£>çzt‹ÑRwéÙcYuåwó–Z``°P]¾³[¯Ã.Q~ìÚíüÆ'W­¼æ¼.s‹sƧ,g§KOd:;e8;§9;§:;§7%Íicò§ôMë²7­»¼Ñé’“ÓQ£“ºö 7ìй[T÷n ô‚%a‰ËöÏÚJh ­_ßî™JÈ]€†¯þ`Ð1ÊÐà´Qàù6+.9®Jq°Oµ·OJÚlœñœL{ûËì&»çí–'/uHûʾh¨e²aÇŽ£;Du4`O©®º_OÇ®Mä€Òú`d´XE¾EOÿ”¶~˜Ž^„žîi}½P}ã?Ï´±úÑÆ&ÖÆ&ÉÚæ\S’­mÎ?Ëú‚µU*Ì;w~Ì—VIVó zõÒÕÒÓ=ËÖ¯£¦§wª£~€@¹™Ëh!­\gϬe3ÕÔö¶W;ÙN#@U-H­}°ºš¿¶æñÞ‹š<éüäÉÑÓ¦%4mjbS’¦L=?eZÒ”é1“gÄLœznügÚÚîZlͪê~ªê¾íÕÕÚyÉeë?xÿÙìä-´œV.€MÆÈÄeªªG©è/“ûÈT|U$?¹ä£*÷xMÿØèÑÉŸ|’0vlÌØ±Ñ»3{Hì˜qÑcƱåùþægå*‡Eñ„ŠŠŠÜCÖÎCÆ¢—$n“¤©%EóxÎ-§•  ¯ñI܈ñ!A FøÂg(vGxo÷žÁÃ>Lþaô°¡‘Ã,#?öÃ_ai5bDÜ!‘C,c Ž“·s#ä0ÁžybrQ7ö,ñ!h·$.Ýÿýžó@Ëiͨ*_(Ò9Ý‹&^Ãl€N0lÿHÉ1Aó@‹ú/ÿÿìÝ{TUUðßoï}î5ÔÔVùhù(5ÍÈ›©&´–¹¬©¦\cÑI E DËW¦©ÏQ²Ìw:æ€iŒr/à#… ‚¼UÞ¨¼ß¢¤–-Ùç’Š®¦àÊæú[ë³îÚçÜs6ßµÿøý6—˽ÍÙV,) .ÇC@ßß“ÆL±Wãߥ‰šÐ׉ÝòQè5t·@“@³¼åÆIäá>À@Ymíb<„a gk41-áØ"5óBˆM5kXöº^pÁŸÃ€}Á·ÄàêÏÊý²™33çAœïá|/g¡÷×ìgr°OVU†²˜ê7˜ëÍÂa?â^Ym™;Ä0ˆãZML™¯fB±©f} hùkg[ îa€Ã( ¢^Xo"ËhÓ/¨+ÊòšÐºj¨Ãð; á u¼ŸY§ýÊzóÈgÑ l/ ¼&RÖekÁõ¼^pUËC!6Õœ `ý—c=Œ<@JÎb|×€<`k]®gÿ­Èº|°á<‡¸µ¦†ÊÙ‹chfèëääyòøR5óBˆM5g°„{iÂáV#äxÐ~3½ÔFÜ‚¼˜v ƒ€a çA°pˆ”;wDY©eq6ðΗwé6­²l²šy!Ħšù?5ÍÕÁð/ÁdAŒF‚<ãèȵéoŒY£rB±fn+W¾è)´½ S€E ŒªWOŒ‡Çn%þ6nq±œJßkc` `"ãQBlrp»ví•óBˆí4sÈÉgl5™‹¯&É:ú‹ïÇ®\¹5>j­¡ „ÏôM}¬õ§$1naleçÎãÅ-T9!„ØNó!ÌÀA3櫱„ йûÆd«”¦‚Â!•ÉÉ!MÎ,D(âGÇßâ —ªå!„iþàÿA[¨±ÿpÈ`Ë §®&“[cY3NêU¸±N2}þ,„4ÁŽ0\ïää±qà õóBˆ4 X†¸ôÇ$¹#fpÊ(N#;< X:ÀiÔ«dfÀ4g#ĵoÎrq™_Ztë¯`T-!„Ø‚ Ø<Çh°I°h;­±"Ä à)À3òrršf–*Ä>Ζuì4î‹/nû‘;ªå!„[P¢Hn“Æ mž£1X`ƒb†§@œ‘ ,Á§ OÉ]¼0ı…‹ñ¯œ]VâÚ‚òBH“S¥”OîÓßKŸk+°ˆc!hÙ å€Èg,c|«‚kò¯É«GZŸ½ñ.vÆ`8¸pá€Çg™åíöªå!„&§JRßèØÑÕ¨ù˜Eð<ÆËåvŒyˆùù r(P& ‚C%ƒ2„b„"„Ô_™É·ä™óå(·Ø˜‹˜'¸Ë ~Ê!FþI·î£—­ÚÔóBHÓR¨HIñ£Úµsר:GcŒ¦åÜ;kUR%ÈòŠ%ˆ…Vú#TXÏWÔS XXX*1ë]r÷mÐNpÊq~·n“,þòl•[ ÍC!MH­ ¥&½Ý¥Ë,ÎV8ˆƒ–¥1Y4¿·ª< ¬xð|+Vn-¯•ÿ£_P¬Ÿ‡s.Ƚ¹£–ÊøW€Óì>jž÷§•ZtBi*Ê5)7ûÝç†®ÒøŽ<޳RdgeÁ½x ØE«óÀËPb•ȪU[+‘W«VÍx‰çy”`ë¸puì±dÕï|]µ<„Ò$Tlu-XÑÆè©±¥ÈB ‰œ¥# v‰áeÆ®"\fð½ÜSsø‘Ãe?écpÿ¼ >Þ±mê]˜G5ª­å¡<ö”§©´€°uÛÄÁƒ?4h®­Å‚®÷®}Êyç+ÿ™77f¹OœÏ «?OZ¼"yô?,..{zõÜêÔÆÏ(æÝÛvæ×÷³3Æß yT£ÚúPÊcOyš–Ò `ïž¹={Îà죎>ûÓ¾õ˜r|W@ufzmuumUõÏç¯Ö\®­ù±¶¬ª¶º¦¶ °6ìpõb¯Ô†íïÓg›AÌt0Lq7­(ÿ={Í£ÕÖ‡òP{Êc Š6€‚<·1£Ýä/YÚ®~öÏÑcÆ&í :wªä§âó5§‹K ŠÎ••^)+¾RRôcIÑ…’byXS\x¾¤èReŕؔ+ó¥¿òr”s¿ VšW§î»vzÚYÕ¨¶>”‡òØSÛQ±Äž޵çìÖ­—<Ö?üÕ—2çs5+»6=óbfî¹,)çbvöåìì¬.eËÃzrs/Èg7m.ùZÔˆa™÷wüڨ͜4q®ÝäQjëCy(=å±)å@`àTÇ{Ƶk·òùç’†½=gNVÌ‘Ú䄟.&$VÆ'–Æ'–Ç'TÅÇŸO8«n”Py<¥2îXUBòÕÍ[.üõå”aÏ¥d4L{õ/£ì jT[ÊCyì)­©ÕvïšÌÙ›íÖzz¨Kü;ïFºd‰¸n9y¤2<²ÐU`‰*¶DVX"ª,‘e–ÈÒ›DD–E.‹ˆ( ª9yuÉÒ’!.‡Ÿw‰sîk6Šwþm}Xµ<ªQm}(å±§vd«ÖoßÖwè3g?ž>Ô%|ý–² ýyAæspaùTpèiSð)Sð“¹Ød*5™ Læü C‚*L¦ÂÐùæ‚@Óo¿ãòTü3ƒ2>¥‰Ù/ŽÙBó¨Fµõ¡<”Çžòܪ4€Ü¬±]»ÍißöŸ‹~ÂùÄ“ƒbÇŽKÙ¾£êëéþ;sêÉõßyÆ? À? Ð? Ï?àLùÿ. È ø&Í׉ß­ö©~â±°AýsžtÎíùàMóðœöë“Q-jT[ÊCyì)Ï£Jxêéyš¶è¡^{?ëìßÀžy ò6m*ݲùô† ™ºÖAÖ† 9ºõ9¿ ZŸ»aCöÆ'7nLþj[®ßgg‡<íÜ?ÍyÀÉGûí|ÿ.F›‚fµ¬<ªQm}(å±§”‡òØSž;é¿ÿÿìypTEÇ¿_÷{o†äV@ÔÅ]u=.»¢R[Vè®,Bá  ‚œ*ç‚€"—ÈB!7 9Ée g¸åÆ™Á£d«\¶ßdÁ¡Ö’0ÓytÕ§^õ¼y¯çSßþã[=5‡ë àÓ…AD£ü|ãïo–~_³ÍM›ä4kšÑò‘¤¡!ÇÇÝ?á½cÃw…‡—Öb÷uÄxÏ-ì ? ž Wönñè±»ß /{¡Sq³&›4ɽ¿iN“¦â%²=Ý–ùû†5Ù-å£|¬äãd\_-[Ž´Ùgú¤ù¤úú§ûûeø§ø®íÙcoHðŽü-ƒC¶ÖEñà’›¼mpð.144Ðм·ƒ·9þè#‰~>‰þ~Yb~_ÿTÿ´&ñœB#V ’ßG6dËGù(+ù8@VæxMïçá±ÈÝ#¹Qãx7D÷$O8¯µÏÿ%§×›%½zåöéSX7AEu±¥wPIï>[z¿•׫o^Ï ­¯ÿcO„wãx1³›g¬›çwFëìúÔçÿzó?ôÊæ#²å£|”•|œ‹ `ú‡]umŒ›Ûj¦ÅéöݶÁfÄÚ7{ä}k^y¥øÕW »uËëÖ-÷W#.·äwížÛµ»8–<˜e·­Ô´h›-ÆfÔEêb ­3´9†tºlˆÌ>²![>ÊGùXÉÇù¸¸þØj’¡MC\Á$À5€‘k #µø}Rç‹_z1·ó Ù;e¿Øyó¯¡S§œ—_.èØ1»c§üví ì–­$Œ"ˆBZ l¹xN1ŸÚèeKÊì#²å£|”•|œ+ àÂÙh°E‘Hë× @´@äÅh ×Vµjß®mÎsm³Ûf>“ÑöÙÌZ¤×Ésí²Ûnnß¾èég =<#>#M´ F¼Ð  (ΙX Ûýµi}dC¶|”ò±’Kpe¤&sÓÇ2XÆy,ÐĈšX¸Ž±݈Óô¨%¶~|Ó“Odˆc›V鵨T'­þÒ¦uÖ£fº»E3¶–ØzÆã70H% ´ 0)žóuš6ëñVÓ¤õ‘ ÙòQ>ÊÇJ>.Á•°è“ ‚163£Xä‘hî¿¢P¤ˆâMX@çK|}¢| éf 5O¼NÂCÆ×AóøæMübtmg¢ÌE±oˆˆg°‘Ää$6wÑ€bþ(Æ?òñ-­lÈ–òQ>Vòq ®,€Íü;ƒñ×2Ú‡ï á:‰5Ä2Œ3´»-ÁÛk£·W’·w‚·w¼·wÜÏxÅzyÅ6n¼¡±gœ&Ú•&ÒÏS ’Ò̪Š&–,6eŒ>Öøˆý{§Ëé#²å£|”•|\‚+ `öŒ×Å0Œb˜f=Þ)¥è+ú3•Q*cKb,™Q:ÃÌ8e1ƒ ‘2¡×¼ µÖÊÇJ>.Á¥oÍêÎp¬crrQd}"Ö<2/¨Y$qMzM ŽqV „›ÙŽq&9¦óÊZóˆg1(P\S(Öɱ¡7@6Ù-å£|¬äã\YË–!7Øz£b€€Í· Næäcj‘Yb²o!‡9Ö0]ÌÆi;a*á|OÏЃûgÈé#²å£|”•|\‚+   ÿ}#\m°B†%€€ù7cFÿEˆ‹)(ë²ón¡€A¡hrD±rb±·ê,±YÍš¬¼"§lÈ–òQ>Vòq .þ&°¦ °ék8‰€¶"n¹ …¿ävçoPtë$„[8;Ö a‡X›ž 0执Âdö‘ ÙòQ>ÊÇJ>ÎÇÅØn®®-æLl‘J‹·š@±ùФæLíd‹þw¸¶‹(oa»ãö›!(æPÂ`+™óïg춦ê´PfÙ-å£|¬äã|\\sæ¼ʵd½@EÀòÄöjÀ„}fšX ·¡Ž‹ÅTf÷b`1ànbEœn³õ]¼xºÌ>²![>ÊGùXÉÇù¸¸Žíg4 a|-a©Èp;˜oÆí¸¾¢*K™îºCv’YòÛ¯RJ¬€hNÓ¦ýwlŸ"³lÈ–òQ>Vòq>®ÿC˜§ž™D4_#±Q: &@´1îq°·¾@ØË`‰ÉᘙótÄ÷ºt©ãX²ùȆlù(åc%'ãúX¿n´®MÑ(‘Áa‚Çk2U)ò:pÐ\•;å ™óE8Äi á2OÏáË?›-¿lÈ–òQ>Vòq2®/A›63gxØKECœ4ø)¤ýÀJ¾8…fjGê<¤±cņOÞ¡ÃÄóuÿ%›l>²![>ÊGùXÉÇ™HQ›Rß5Œ~ŸsÚªÓ)*Û LìÈÊN ¯ð0§}œg0šéçßoÑ¢Ûþ‡l>²![>ÊGùXÉÇ™HQ‚àÁý¹6Ánlâ(6Jg O?üPÁW§î<)ZëÅœ¯d¼÷×Ç^87 ùȆlù(åc%§!Kœ;òXë÷5þ©†Û8V0<Ú1ÐŽ/'*cXC¹ƒÓ×)¿NY-ÄÃ3Žgy}¥ë“§´ùÓ˜©ÿçã·²ùȆlù(åc%§!Köîîáç7ÀÐæéTÀY±‹¢~Á(C»°r‚ÓgTp¸ÀáƒJ‚ g*N£¹S+w Ä™ËQT.ž@,ãLŒÅŠžÔ!Í`6¸÷̹Ÿ7DÙ-å£|¬äã$*AéÎ7¼¼†i´ÔnkZˆ.Õª• âÆsˆgœ6pÉqþR-*«/žã.ÑÆºv€±t†›7Vòqr€`_é›Íš…3šmãÙ:ÕH„ø­ƒ+€_]V¬Ü„Î]tÄ]ù3ægÍóð ƒïDWÛµ}ÄVŽzðá7&|ðqå¥ ÚG6dËGù(+ùÜm¤+Á‰co¿Ði®Æ&sXogÛGúQ,Àw€?}ïà2° ( J¤*¤jDZÙ% +@ÕÄÎéì„ÁŠ8-e|À“çÏýï»Éæ#²å£|”•|î*2@ S'Ïv7B5š”¦Ûv3úñ,§¯ý„p•à[ѱ ~dp•ÿÍ1~£ó+—mZ¹a".Eçå;ðoÝÆ'¤Üiú²ùȆlù(åc%Ÿ»„¼ 8rð­ž=úr=iâr»‘×ÈvP£ÓçUëðW øÞ€8TëxQ§r2ÌßÛ[8ÖÍ󭧇Lœ²âlEý|âJ6Ù-å£|¬äs7ºj8z¸_HÈ0?¿¡#œÇ(Òn¤êZ§, s4Ì3¡ Në —Ì1h”Wÿöí‡Í_0¾´´þkI6Ù-å£|¬äS¿4€¸Aäêá#†MmÕzºÀD·! %6ŠØ;â¨ÙG¸{ø]ËÐŽ]Þ [XôExÕÅà{ÍG6dËGù(+ùÔ ©jSºûƒ‚üðÌôÐM)C3Ò†ä…ïÞ5µêâå#'²å£|”•|~3 µ …Bq‡¨P(Š{”Ygʃã↯^¼p~Ï… ÞˆXÕÿ‹‚IÊGZdËGù(+ùÜ ¦Né»`î?;v˜ÙØm »m°ÆqÆhÑ`Â`36¨Éýœ1âô‘ ÙòQ>ÊÇJ>õE(€ÕƒÇéÚ7>ùŸÅ~2¦k— ÆÏš·}Þ¢]}Z:möžÞ} :tHz¤ÅjO÷ŸàÓ8là€wŽî/øÈ†lù(åc%ŸúEêHNߢÅFïùù~òܳñÇì]_}äËkÕÕתªÿséòOW®^»òãµ Uת¯\;}æZ^nõ´÷÷½üRæcEè<̦ÐodEùP«úȆlù(åc%Ÿ»Áÿÿì{T•UÞÇ¿½÷sApÔR“1ÍÈ|Õ™šÍf9½“™35¥”vS*S_ÔtRÈK¬FKñ’"÷;@Anr9€\ä¦rÁë¨3ͪ™ÙçE‚kfÞòœí³öZŸõ¬ý<çyöù¬ïþã»öñÈ´ëç{ΙÏ7YŽý¶>ù«<Ϲ¥ñWζþ½åêµs-­ÍWÚÛ¾noùºµùo­Í×[[øéµ–¦«­Í7;;¾.(ûzõºÊg›ã>*¾âëìønDØ"ùˆ†hùHé£%Ÿ»‡ˆPXðü a>669㙪5+‹ ßT×ü³²êFUÝ•jNíšš¯jjþjâf ?íF]Ýuþêž½M³fæLŸVuŸÓ!UY¾à­Ušñ Ñò‘>ÒGK>wá :ú=kÛyöö›§N)ötފՆܞ(þGqñâ’΢’¶¢’ EŋЮ_2~HqqçɲÎÂã‹O|³wßõç~[6mJù¸1ñªnñŒÿ}A>¢!Z>ÒGúhÉçn#VDFxQò»Ó<ÎyL*zõõœÄ´›YÇnff]ÉÎíÌÌnÊÊiÌÊiÉÊîÈ:v1+»=+»í6Že·Ko?v¬=3çZzö76¶Nž”>uR¡ûH½Ê–>êþßõ°h>¢!Z>ÒGúhÉÇ TE³úØÌvèçïñÄùñVzLÊܵ¯=þH}¼¾QŸØ¯?›˜|.!ñlBâù}KBB[‚¾1AßЃ¦¤øŽ„„¦ä”†h}ctÂ__~Ù0é—EOŒ«ûPŽÂ|~3}Ö=ê#¢å#}¤–|̃(PW=wÐàýþ4ö‘¼ÇÜOMW0w^Y`ÐÅCa•!aµÝ¨ ;ÚÚZz¾ ¡Áí¡¡õ¡á!§‚›·n»üØ#ãF×Np¯6$VQ.ZüïÿMF4Ñ-é#}´äc6D)€_>¾ZQÖ=8<ÕmD»{Ñè1±«?¨ß³§mßÞs»wW 8cTïÞ]kdWí·ƒžìªÛ½»& àt@À‰ýê¶ziò“yî£+ÜÇœ~xT¾Ë}û(›“ï}oùˆ†hùHé£%³!D.T•…ºý<ßÍ­|øˆ\·‘¡?jóßRûé¶êíþUþ·Séï_a¢²þÛË·ûŸùdkõgÛ*>Ù^¹ykëôߌ™3Ô-ÕmdÞð¡vþ_ÖÑvÇÍG4DËGúH-ù˜! ÀÅå=;ëmCGÄ»Istü¡ùŠ{ÕY¿µe›üN|è[îç{òe~¾'üüJüüŠýüJ{£Äw½áCßÒ k+6¬=µÞ÷¤¯ïùéÏä>ð`¢ëð¨ÁCÓ† -tqŽUÙÿ-¿¿W|DC´|¤ôÑ’9±|üù3OB–89FÝçšü3×£.Ó\]» }Ç«v¥ÏÉÕïùx{{—v£ä||¢eÞÞ§øKËWæ/_aXêSòÞõS< ®ãL¿Ï%m  ‹T;›]ÎŽËï Ñ-é#}´äcf,_nn‹­¬79Hê?@ïèœììtx€sÂÇC/½Xæ5ÿ¸—W¦—WÞ0,ðÊ¿ æóÁ[ïd¾õNÆëósç¿];bxŒSÿg§>¿£³ÞÙ9ià€(FØÿ–ø>¢!Z>ÒGúhÉÇÌX¸RެRtólmwôµëÓ/ÊÆ6ƶo¬mdûCO>‘6ûåüÙ³Ó_y%»w|V§,³±ù’*‘:ë0U¸•a­†ÙXþlÀÁgž1<÷\öŒ3f¤ÿÇð›ù#™ÏÎLv&?æ?6>ÅÚjŸ¢[Y…YYêúêø@ Q•ͪêÙXÿ¶È>¢!Z>ÒGúhÉÇüX¸õGUY¸—©±€q(Ü1ìÁØ©O¦=•>uJêTÔ§¦ýOððH{úé¬É“S'{dN|<˺O!ûB²hFÂ|ª*Kw}þ¦È>¢!Z>ÒGúhÉÇüX²Ú[ÞSè›*݈$ñ òsx^”dÊþQ£3'NHûńԉãSÆ;<áŽt#¹W~11uÂø£?žóظl[»@€Ý„N Œ¿½@‚¡|1Àgæó„õ Ñò‘>ÒGK>Á’ ]i£ó¡°‹± t-@(`¥a:5RÑ »?fôÈD÷‡óã˜QÉÝHì•Q%Œ2bÄ‘¾6Á”"4”²HÄp Ѽ„ì FÅXˆ¢|4rÔza}DC´|¤ôÑ’E°dìøÔ“À2+cFÈѸÿ Bž>„e„F1ö¹cÿà!ƒb¹Fß?8æÑ÷‰ê…ÁQƒ]¢8…é”ýŒò2çÅE!žðÉ ßÜòùƒ(ÛÚßq©°>¢!Z>ÒGúhÉÇ"X²þ´éwV1ÂÞ>¢_¿ð~v‘ oWC1†|?'! ÁXõ@‚ ã›2J>QØ{'Ë6ˆé#¢å#}¤–|,‚% àã³øP ¢˜Æz¼#’ cq Vh„ÂÂj|‹äGfÌ4’aC=䇓ðÓÀÑ<} „&Œ¦ä3…-.>¾NLÑ-é#}´äc,Z›ž7.„PH8ŒØ+RÐø*ïO=%zJã)¥4Ž’dŠGº`$…>8ÌS&ÈÃ5> ï6O…#ˆq<} „¤Œ§¸SaK kÄô Ñò‘>ÒGK>Á¢}4“¢iÒÒ‘d ú6x¬ÄxC×"ñ{’»5Sº x”ƒj!¦©Àxg·yø«¨ÈïÉæëdZ€Eß-€h>¢!Z>ÒGúhÉÇ"X²v}P¥¡<8J iG{À/fdd€iºq¤7ø:¥öœ!šÖ0™ÏÆH!A=A;»E§OnÓG4DËGúH-ùXK@V¦¯ÂÞ%ø¥J³)æffÞŽ1úc½Ào&©@Rz ˜Ñs„, Ù¼ÉùÊñÅÎÓÑ$J?r¼¸³ÝKLÑ-é#}´äc,ü?å +ÝAFx@yˆ¹w û‡Üéúwäôœ„`.ƒi rŽó°ÒÅ,{xìr‘}DC´|¤ôÑ’ù±pŒŸ¸E§ìd”o‘ò ˆyFÀ`<5Òu¥{²9ßÞÃo†Be M߃| yÄ81¿bmM•%/z~&²hˆ–ô‘>Zò1?.€Í›Ÿ\Ä”8‚e@r€fáÛ«€åÆ41€Ÿï¢;ÐËÍ|*c÷b °„ÐÆöXYÍݹsƒÈ>¢!Z>ÒGúhÉÇüX¸j«ç©}¼(;D°”çXÆãŽßZ^•ù¦L‹$EÄXò¦w)%4‹Í..¯/\+²hˆ–ô‘>Zò1?–ÿA˜±ãþHˆ¿BøFé 9¼ñ„‰²Ÿ „2 å„O|fÆ’ßÿõ¯{ù–h>¢!Z>ÒGúhÉÇÌX¾BC–ꔵ ‰¡p†@Ú®Œ€ðªäyUœ6®Êå41Î_PÁH.Á]vv v,¾hˆ–ô‘>Zò13–/Θ1›7ÚZ—ò†$pVeçœZ ¤àS«ú À …Ö T%Š ÷¤IkÚš{ÿI6Ñ|DC´|¤ôÑ’9¢õ+TuÀFòtäœBšÏ-Êwd uµ?x†‘rÆS²ÉÉyÞŽwü¢ùˆ†hùHé£%s"Dpæ/x)«­ÕD†|£ÔBð,°SÀª€Ô8OàÜÏòVg:cû({mæ,ŸöÖ7î!Ñ-é#}´äc6D)€Ö¯ŸöUØŸ,`ØL± ”Pj5RO±‹·h¸E}7øi“éÕ>EÎët§c׎ytY¼þß|ýV4Ñ-é#}´äc6D)NYÉ‹NNo¨Ê6Éb´žÐ ¼~A­Gä»°š(43hgÐA¡“@;B B3B#wj ¦¿ráòÊÅ:ÄzFù˜¯èY$©ôÃÁÌÙ´eϽè#¢å#}¤–|̃@À)-zÁÞþ]…|a­¥x—*8ÀãÆVÄ&Æ#t˜®wt£ð"àÀ61=ÅÛX§œ¢4™âšÁƒ|°þóKçߣ>¢!Z>ÒGúhÉÇ ˆUœòÒ—]]½)ùØŠ¥êHµBxˆ1q ð Í@Œ6 Lqw~ñ†ãu¸Bá:ïjk¥œÐý€K†<ðÂj¿O:;Þ¼§}DC´|¤ôÑ’ÏÝF¸àÔÕ¼>Åc‹B?`jM )iCr ‘/ÀuÀ›@n˜¸ ´9¤ÉE$—MÇN¤@®¹Lh«ŽÖ©4‡‘/({Ã}ü [þŸŸ»‰æ#¢å#}¤–|î*"@ë>ø¸¯ºH!‘$é¬J(©Dlaä&Á¯ùá+áKáo¾bðwã¯èØ5W­”UÍFüÉJ{Ç7§ÏXðcÓÍG4DËGúH-ùÜ%Ä-NÕéW_zq.Óy#Y`­fô±:­Fm”\ÖÁ®©pC…› .ëð‚Ž4(´B5þ½½/}lì^;þí5k÷¶4ÿ4߸ÍG4DËGúH-ùÜ þÿÿìÜ1K•aÆaßç¼o"DH˜»‹C~·>G!„yô pÎ4¨Ð$TÐÒ¸¸WfA¨ášg ?‚àw( ¢ÙÎðžs_pñÌ7ÿå·=­À—?¯­uçæÖ›º_ªWr03ýñNsT—¯Mõ­©Nn”㺖êÝÔÔþtÙº?ûdy¹ûúÍóápô-µmOÛ´í>öØ3I{Fk ð×ÁûÍîÎÃ¥—æ_Ôu·êôJg«t¶¿ÍÌæÝ{« ‹½•G»ýþÛóïƒë«§i{Ú¦m÷±ÇžIÚ3〠/öÎN_>÷>}X?>Ú8;\üع¾zfO;µí>öØ3I{nm\À€PJB @(%¡ ”„€PJB @(%¡ ”„€PJB @(%¡ ”„€PJB @(%¡ ”„€PJBýÿÿìÕ € ÿ¯’à0%€)L `JSÿÿŸçìû—9°•IEND®B`‚golly-3.3-src/gui-ios/Golly/StatePickerController.xib0000644000175000017500000002566412132422316017654 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUISwitch IBUIView IBUILabel IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 274 {{10, 10}, {748, 944}} 3 MC42NjY2NjY2NjY3AA IBIPadFramework 268 {{94, 966}, {94, 27}} NO IBIPadFramework 0 0 YES 268 {{10, 966}, {95, 24}} NO YES 7 NO IBIPadFramework Show icons 1 MCAwIDAAA 1 10 1 17 Helvetica 17 16 {{0, 20}, {768, 1004}} NO 2 IBIPadFramework view 5 spView 7 iconsSwitch 9 toggleIcons: 13 10 0 -1 File's Owner -2 2 6 8 11 StatePickerController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin StatePickerView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 StatePickerController UIViewController toggleIcons: id toggleIcons: toggleIcons: id UISwitch StatePickerView iconsSwitch UISwitch spView StatePickerView IBProjectSource ./Classes/StatePickerController.h StatePickerView UIView IBProjectSource ./Classes/StatePickerView.h 0 IBIPadFramework YES 3 933 golly-3.3-src/gui-ios/Golly/PatternView.m0000644000175000017500000004564413171233731015321 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for event_checker #include "prefs.h" // for tilelayers, etc #include "status.h" // for ClearMessage #include "render.h" // for stacklayers, tilelayers #include "layer.h" // for currlayer, numlayers, etc #include "control.h" // for generating #include "render.h" // for DrawPattern #include "view.h" // for TouchBegan, TouchMoved, TouchEnded, etc #import #import #import #import #import #import "PatternViewController.h" // for PauseGenerating, ResumeGenerating, StopIfGenerating #import "PatternView.h" @implementation PatternView // ----------------------------------------------------------------------------- // golbals for drawing with OpenGL ES static EAGLContext *context; static GLuint viewRenderbuffer = 0; static GLuint viewFramebuffer = 0; // ----------------------------------------------------------------------------- // override the default layer class (which is [CALayer class]) so that // this view will be backed by a layer using OpenGL ES rendering + (Class)layerClass { return [CAEAGLLayer class]; } // ----------------------------------------------------------------------------- - (void)createFramebuffer { // generate IDs for a framebuffer object and a color renderbuffer glGenFramebuffersOES(1, &viewFramebuffer); glGenRenderbuffersOES(1, &viewRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); // associate the storage for the current render buffer with our CAEAGLLayer // so we can draw into a buffer that will later be rendered to screen [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id)self.layer]; glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { NSLog(@"Error creating framebuffer object: %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); Fatal("Failed to create frame buffer!"); } } // ----------------------------------------------------------------------------- - (void)destroyFramebuffer { // clean up any buffers we have allocated glDeleteFramebuffersOES(1, &viewFramebuffer); viewFramebuffer = 0; glDeleteRenderbuffersOES(1, &viewRenderbuffer); viewRenderbuffer = 0; } // ----------------------------------------------------------------------------- - (void)layoutSubviews { // this is called when view is resized (on start up or when device is rotated or when toggling full screen) // so we need to create the framebuffer to be the same size // NSLog(@"layoutSubviews: wd=%f ht=%f", self.bounds.size.width, self.bounds.size.height); [EAGLContext setCurrentContext:context]; glMatrixMode(GL_PROJECTION); glLoadIdentity(); CGRect frame = self.bounds; glOrthof(0, frame.size.width, frame.size.height, 0, -1, 1); // origin is top left and y increases down glViewport(0, 0, frame.size.width, frame.size.height); glMatrixMode(GL_MODELVIEW); if (viewFramebuffer != 0 || viewRenderbuffer != 0) { [self destroyFramebuffer]; } [self createFramebuffer]; [self refreshPattern]; } // ----------------------------------------------------------------------------- - (void)refreshPattern { // x and y are always 0 // float x = self.bounds.origin.x; // float y = self.bounds.origin.y; int wd = int(self.bounds.size.width); int ht = int(self.bounds.size.height); //!!! import from view.h if we ever support tiled layers int tileindex = -1; if ( numclones > 0 && numlayers > 1 && (stacklayers || tilelayers) ) { SyncClones(); } if ( numlayers > 1 && tilelayers ) { if ( tileindex >= 0 && ( wd != GetLayer(tileindex)->view->getwidth() || ht != GetLayer(tileindex)->view->getheight() ) ) { GetLayer(tileindex)->view->resize(wd, ht); } } else if ( wd != currlayer->view->getwidth() || ht != currlayer->view->getheight() ) { // set viewport size ResizeLayers(wd, ht); } [EAGLContext setCurrentContext:context]; DrawPattern(tileindex); // display the buffer glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; } // ----------------------------------------------------------------------------- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ // allow Restore button to work (when in fullscreen mode) return NO; } return YES; } // ----------------------------------------------------------------------------- - (void)zoomView:(UIPinchGestureRecognizer *)gestureRecognizer { static CGFloat oldscale = 1.0; static CGPoint zoompt; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) { if (state == UIGestureRecognizerStateBegan) { // less confusing if we only get zoom point at start of pinch zoompt = [gestureRecognizer locationInView:self]; } CGFloat newscale = [gestureRecognizer scale]; if (newscale - oldscale < -0.1) { // fingers moved closer, so zoom out ZoomOutPos(zoompt.x, zoompt.y); oldscale = newscale; } else if (newscale - oldscale > 0.1) { // fingers moved apart, so zoom in ZoomInPos(zoompt.x, zoompt.y); oldscale = newscale; } } else if (state == UIGestureRecognizerStateEnded) { // reset scale [gestureRecognizer setScale:1.0]; oldscale = 1.0; } } // ----------------------------------------------------------------------------- static int startx, starty; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([touches count] == 1) { // get the only touch and remember its location for use in singleDrag UITouch *t = [touches anyObject]; CGPoint currpt = [t locationInView:self]; startx = (int)currpt.x; starty = (int)currpt.y; } } // ----------------------------------------------------------------------------- - (void)singleDrag:(UIPanGestureRecognizer *)gestureRecognizer { static CGPoint prevpt, delta; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan) { prevpt = [gestureRecognizer locationInView:self]; ClearMessage(); // the current location is not where the initial touch occurred // so use the starting location saved in touchesBegan (otherwise // problems will occur when dragging a small paste image) TouchBegan(startx, starty); TouchMoved(prevpt.x, prevpt.y); } else if (state == UIGestureRecognizerStateChanged && [gestureRecognizer numberOfTouches] == 1) { CGPoint newpt = [gestureRecognizer locationInView:self]; TouchMoved(newpt.x, newpt.y); if (currlayer->touchmode == movemode) { delta.x = newpt.x - prevpt.x; delta.y = newpt.y - prevpt.y; prevpt = newpt; } } else if (state == UIGestureRecognizerStateEnded) { if (currlayer->touchmode == movemode) { // if velocity is high then move further in current direction CGPoint velocity = [gestureRecognizer velocityInView:self]; if (fabs(velocity.x) > 1000.0 || fabs(velocity.y) > 1000.0) { TouchMoved(prevpt.x + delta.x * fabs(velocity.x/100.0), prevpt.y + delta.y * fabs(velocity.y/100.0)); } } TouchEnded(); } else if (state == UIGestureRecognizerStateCancelled) { TouchEnded(); } } // ----------------------------------------------------------------------------- - (void)moveView:(UIPanGestureRecognizer *)gestureRecognizer { static TouchModes oldmode; static CGPoint prevpt, delta; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan) { prevpt = [gestureRecognizer locationInView:self]; ClearMessage(); oldmode = currlayer->touchmode; currlayer->touchmode = movemode; TouchBegan(prevpt.x, prevpt.y); } else if (state == UIGestureRecognizerStateChanged && [gestureRecognizer numberOfTouches] == 2) { CGPoint newpt = [gestureRecognizer locationInView:self]; TouchMoved(newpt.x, newpt.y); delta.x = newpt.x - prevpt.x; delta.y = newpt.y - prevpt.y; prevpt = newpt; } else if (state == UIGestureRecognizerStateEnded) { // if velocity is high then move further in current direction CGPoint velocity = [gestureRecognizer velocityInView:self]; if (fabs(velocity.x) > 1000.0 || fabs(velocity.y) > 1000.0) { TouchMoved(prevpt.x + delta.x * fabs(velocity.x/100.0), prevpt.y + delta.y * fabs(velocity.y/100.0)); } TouchEnded(); currlayer->touchmode = oldmode; } else if (state == UIGestureRecognizerStateCancelled) { TouchEnded(); currlayer->touchmode = oldmode; } } // ----------------------------------------------------------------------------- static UIActionSheet *selsheet; - (void)doSelectionAction { selsheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"Remove", @"Cut", @"Copy", @"Clear", @"Clear Outside", @"Shrink", @"Fit", [NSString stringWithFormat:@"Random Fill (%d%%)", randomfill], @"Flip Top-Bottom", @"Flip Left-Right", @"Rotate Clockwise", @"Rotate Anticlockwise", @"Advance", @"Advance Outside", nil]; [selsheet showInView:self]; } // ----------------------------------------------------------------------------- static UIActionSheet *pastesheet; - (void)doPasteAction { pastesheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"Abort", [NSString stringWithFormat:@"Paste (%@)", [NSString stringWithCString:GetPasteMode() encoding:NSUTF8StringEncoding]], @"Paste to Selection", @"Flip Top-Bottom", @"Flip Left-Right", @"Rotate Clockwise", @"Rotate Anticlockwise", nil]; [pastesheet showInView:self]; } // ----------------------------------------------------------------------------- static UIActionSheet *globalSheet; static NSInteger globalButton; - (void)doDelayedAction { if (globalSheet == selsheet) { if (generating && globalButton >= 1 && globalButton <= 13 && globalButton != 2 && globalButton != 5 && globalButton != 6) { // temporarily stop generating for all actions except Remove, Copy, Shrink, Fit PauseGenerating(); if (event_checker > 0) { // try again after a short delay that gives time for NextGeneration() to terminate [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; return; } } switch (globalButton) { case 0: RemoveSelection(); break; // WARNING: above test assumes Remove is index 0 case 1: CutSelection(); break; case 2: CopySelection(); break; // WARNING: above test assumes Copy is index 2 case 3: ClearSelection(); break; case 4: ClearOutsideSelection(); break; case 5: ShrinkSelection(false); break; // WARNING: above test assumes Shrink is index 5 case 6: FitSelection(); break; // WARNING: above test assumes Fit is index 6 case 7: RandomFill(); break; case 8: FlipSelection(true); break; case 9: FlipSelection(false); break; case 10: RotateSelection(true); break; case 11: RotateSelection(false); break; case 12: currlayer->currsel.Advance(); break; case 13: currlayer->currsel.AdvanceOutside(); break; // WARNING: above test assumes 13 is last index default: break; } ResumeGenerating(); } else if (globalSheet == pastesheet) { switch (globalButton) { case 0: AbortPaste(); break; case 1: DoPaste(false); break; case 2: DoPaste(true); break; case 3: FlipPastePattern(true); break; case 4: FlipPastePattern(false); break; case 5: RotatePastePattern(true); break; case 6: RotatePastePattern(false); break; default: break; } UpdateEverything(); } } // ----------------------------------------------------------------------------- // called when the user selects an option in a UIActionSheet - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // user interaction is disabled at this moment, which is a problem if Warning or BeginProgress // gets called (their OK/Cancel buttons won't work) so we have to call the appropriate // action code AFTER this callback has finished and user interaction restored globalSheet = sheet; globalButton = buttonIndex; [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; } // ----------------------------------------------------------------------------- static double prevtime = 0.0; // used to detect a double tap - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { CGPoint pt = [gestureRecognizer locationInView:self]; ClearMessage(); if (TimeInSeconds() - prevtime < 0.3) { // double tap if (waitingforpaste && PointInPasteImage(pt.x, pt.y) && !drawingcells) { // if generating then stop (consistent with doPaste in PatternViewController.m) StopIfGenerating(); ClearMessage(); // now display action sheet that lets user abort/paste/flip/rotate/etc [self doPasteAction]; } else if (currlayer->touchmode == selectmode && SelectionExists() && PointInSelection(pt.x, pt.y)) { // display action sheet that lets user remove/cut/copy/clear/etc [self doSelectionAction]; } else if (currlayer->touchmode == drawmode) { // do the drawing TouchBegan(pt.x, pt.y); TouchEnded(); } prevtime = 0.0; } else { // single tap TouchBegan(pt.x, pt.y); TouchEnded(); prevtime = TimeInSeconds(); } } } // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { // init the OpenGL ES stuff (based on Apple's GLPaint sample code): CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; // note that we're using OpenGL ES version 1 context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; if (!context || ![EAGLContext setCurrentContext:context]) { self = nil; return self; } // set the view's scale factor self.contentScaleFactor = 1.0; // we only do 2D drawing glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_MULTISAMPLE); glDisable(GL_STENCIL_TEST); glDisable(GL_FOG); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // add gesture recognizers to this view: [self setMultipleTouchEnabled:YES]; // pinch gestures will zoom in/out UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomView:)]; pinchGesture.delegate = self; [self addGestureRecognizer:pinchGesture]; // one-finger pan gestures will be used to draw/pick/select/etc, depending on the current touch mode UIPanGestureRecognizer *pan1Gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(singleDrag:)]; pan1Gesture.minimumNumberOfTouches = 1; pan1Gesture.maximumNumberOfTouches = 1; pan1Gesture.delegate = self; [self addGestureRecognizer:pan1Gesture]; // two-finger pan gestures will move the view UIPanGestureRecognizer *pan2Gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveView:)]; pan2Gesture.minimumNumberOfTouches = 2; pan2Gesture.maximumNumberOfTouches = 2; pan2Gesture.delegate = self; [self addGestureRecognizer:pan2Gesture]; // single-taps will do various actions depending on the current touch mode UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; /* too many problems if we have gesture recognizers for single-taps and double-taps: // double-taps will do various actions depending on the location UITapGestureRecognizer *tap2Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; tap2Gesture.numberOfTapsRequired = 2; tap2Gesture.numberOfTouchesRequired = 1; tap2Gesture.delegate = self; [self addGestureRecognizer:tap2Gesture]; // only do a single-tap if double-tap is not detected // (this works but the delay is way too long) // [tap1Gesture requireGestureRecognizerToFail:tap2Gesture]; */ } return self; } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/HelpViewController.m0000644000175000017500000002411213145740437016632 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "utils.h" // for Beep, Warning, FixURLPath #include "prefs.h" // for userdir, supplieddir, downloaddir #include "file.h" // for OpenFile, UnzipFile, GetURL, DownloadFile, LoadLexiconPattern #include "control.h" // for ChangeRule #import "GollyAppDelegate.h" // for SwitchToPatternTab, SwitchToHelpTab #import "InfoViewController.h" // for ShowTextFile #import "HelpViewController.h" @implementation HelpViewController // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Help"; self.tabBarItem.image = [UIImage imageNamed:@"help.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (void)showContentsPage { NSBundle *bundle=[NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:@"index" ofType:@"html" inDirectory:@"Help"]; if (filePath) { NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; [htmlView loadRequest:request]; } else { [htmlView loadHTMLString:@"

Failed to find index.html!
" baseURL:nil]; } } // ----------------------------------------------------------------------------- static UIWebView *globalHtmlView = nil; // for ShowHelp - (void)viewDidLoad { [super viewDidLoad]; globalHtmlView = htmlView; htmlView.delegate = self; // following line will enable zooming content using pinch gestures // htmlView.scalesPageToFit = YES; // along with a line like this in each .html file's header: // // BUT it's simpler to adjust font size using some JavaScript in webViewDidFinishLoad backButton.enabled = NO; nextButton.enabled = NO; [self showContentsPage]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release delegate and outlets htmlView.delegate = nil; htmlView = nil; backButton = nil; nextButton = nil; contentsButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } // ----------------------------------------------------------------------------- - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [htmlView stopLoading]; // in case the web view is still loading its content } // ----------------------------------------------------------------------------- - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (IBAction)doBack:(id)sender { [htmlView goBack]; } // ----------------------------------------------------------------------------- - (IBAction)doNext:(id)sender { [htmlView goForward]; } // ----------------------------------------------------------------------------- - (IBAction)doContents:(id)sender { [self showContentsPage]; } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } // ----------------------------------------------------------------------------- static std::string pageurl; - (void)webViewDidFinishLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; backButton.enabled = htmlView.canGoBack; nextButton.enabled = htmlView.canGoForward; // increase font size NSString *jsString = @"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '110%'"; [htmlView stringByEvaluatingJavaScriptFromString:jsString]; // need URL of this page for relative "get:" links NSString *str = [htmlView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; // we could use this instead: // NSString *str = htmlView.request.mainDocumentURL.absoluteString; pageurl = [str cStringUsingEncoding:NSUTF8StringEncoding]; // replace each %20 in pageurl with a space (for GetURL) for (size_t pos = pageurl.find("%20"); pos != std::string::npos; pos = pageurl.find("%20", pos)) { pageurl.replace(pos, 3, " "); } } // ----------------------------------------------------------------------------- - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors (eg. when ShowHelp is called before user switches to Help tab) if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } // ----------------------------------------------------------------------------- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // NSLog(@"url = %@", link); // look for special prefixes used by Golly (and return NO if found) if ([link hasPrefix:@"open:"]) { // open specified file std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); OpenFile(path.c_str()); // OpenFile will switch to the appropriate tab return NO; } if ([link hasPrefix:@"rule:"]) { // switch to specified rule std::string newrule = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; SwitchToPatternTab(); ChangeRule(newrule); return NO; } if ([link hasPrefix:@"lexpatt:"]) { // user tapped on pattern in Life Lexicon std::string pattern = [[link substringFromIndex:8] cStringUsingEncoding:NSUTF8StringEncoding]; std::replace(pattern.begin(), pattern.end(), '$', '\n'); LoadLexiconPattern(pattern); return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside supplieddir fullpath = supplieddir + fullpath; } else { fullpath = userdir + fullpath; } } ShowTextFile(fullpath.c_str()); return NO; } if ([link hasPrefix:@"get:"]) { std::string geturl = [[link substringFromIndex:4] cStringUsingEncoding:NSUTF8StringEncoding]; // download file specifed in link (possibly relative to a previous full url) GetURL(geturl, pageurl); return NO; } if ([link hasPrefix:@"unzip:"]) { std::string zippath = [[link substringFromIndex:6] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(zippath); std::string entry = zippath.substr(zippath.rfind(':') + 1); zippath = zippath.substr(0, zippath.rfind(':')); UnzipFile(zippath, entry); return NO; } // no special prefix, so look for file with .zip/rle/lif/mc extension std::string path = [link cStringUsingEncoding:NSUTF8StringEncoding]; path = path.substr(path.rfind('/')+1); size_t dotpos = path.rfind('.'); std::string ext = ""; if (dotpos != std::string::npos) ext = path.substr(dotpos+1); if ( (IsZipFile(path) || strcasecmp(ext.c_str(),"rle") == 0 || strcasecmp(ext.c_str(),"life") == 0 || strcasecmp(ext.c_str(),"mc") == 0) // also check for '?' to avoid opening links like ".../detail?name=foo.zip" && path.find('?') == std::string::npos) { // download file to downloaddir and open it path = downloaddir + path; std::string url = [link cStringUsingEncoding:NSUTF8StringEncoding]; if (DownloadFile(url, path)) { OpenFile(path.c_str()); } return NO; } } return YES; } @end // ============================================================================= void ShowHelp(const char* filepath) { SwitchToHelpTab(); NSURL *fileUrl = [NSURL fileURLWithPath:[NSString stringWithCString:filepath encoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; // NSLog(@"filepath = %s", filepath); // NSLog(@"fileUrl = %@", fileUrl); [globalHtmlView loadRequest:request]; } golly-3.3-src/gui-ios/Golly/StateView.m0000644000175000017500000002017713145740437014765 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "prefs.h" // for showicons #include "layer.h" // for currlayer #include "algos.h" // for gBitmapPtr #include "status.h" // for ClearMessage #import "PatternViewController.h" // for UpdateEditBar #import "StatePickerController.h" #import "StateView.h" @implementation StateView // ----------------------------------------------------------------------------- - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { ClearMessage(); int numstates = currlayer->algo->NumCellStates(); if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { // create a popover controller for picking the new drawing state StatePickerController *statePicker = [[StatePickerController alloc] initWithNibName:nil bundle:nil]; statePopover = [[UIPopoverController alloc] initWithContentViewController:statePicker]; statePopover.delegate = self; // set popover size depending on number of states int wd = numstates <= 16 ? numstates * 32 : 16 * 32; int ht = (numstates + 15) / 16 * 32; // add border of 10 pixels (must match border in xib), // and add 1 extra pixel because we draw boxes around each cell wd += 21; ht += 21; // allow for switch button and label if (wd < 196) wd = 196; ht += 40; statePopover.popoverContentSize = CGSizeMake(wd, ht); [statePopover presentPopoverFromRect:self.bounds inView:self permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; statePicker = nil; } } } // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { [self setMultipleTouchEnabled:YES]; // add gesture recognizer to this view UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; } return self; } // ----------------------------------------------------------------------------- void DrawOneIcon(CGContextRef context, int x, int y, gBitmapPtr icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb) { // allocate memory to copy icon's RGBA data int wd = icon->wd; int ht = icon->ht; int iconbytes = wd * ht * 4; unsigned char* pxldata = (unsigned char*) malloc(iconbytes); if (pxldata == NULL) return; memcpy(pxldata, icon->pxldata, iconbytes); bool multicolor = currlayer->multicoloricons; // pxldata now contains the icon bitmap in RGBA pixel format, // so convert black pixels to given dead cell color and non-black pixels // to given live cell color (but not if icon is multi-colored) int byte = 0; for (int i = 0; i < wd*ht; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; if (r || g || b) { // non-black pixel if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { pxldata[byte] = 255 - r; pxldata[byte+1] = 255 - g; pxldata[byte+2] = 255 - b; } } else { // grayscale icon if (r == 255) { // replace white pixel with live cell color pxldata[byte] = liver; pxldata[byte+1] = liveg; pxldata[byte+2] = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)r / 255.0; pxldata[byte] = (int)(deadr + frac * (liver - deadr) + 0.5); pxldata[byte+1] = (int)(deadg + frac * (liveg - deadg) + 0.5); pxldata[byte+2] = (int)(deadb + frac * (liveb - deadb) + 0.5); } } } else { // replace black pixel with dead cell color pxldata[byte] = deadr; pxldata[byte+1] = deadg; pxldata[byte+2] = deadb; } pxldata[byte+3] = 255; // ensure alpha channel is opaque byte += 4; } // create new icon image using modified pixel data and display it upside down CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextSaveGState(context); CGContextTranslateCTM(context, x, y); CGContextScaleCTM(context, 1, -1); CGContextRef ctx = CGBitmapContextCreate(pxldata, wd, ht, 8, wd * 4, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGImageRef newicon = CGBitmapContextCreateImage(ctx); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // draw the image (use 0,0 and -ve height because of above translation and scale by 1,-1) CGContextDrawImage(context, CGRectMake(0,0,wd,-ht), newicon); // clean up free(pxldata); CGImageRelease(newicon); CGContextRestoreGState(context); } // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); int state = currlayer->drawingstate; gBitmapPtr* iconmaps = currlayer->icons31x31; // leave a 1 pixel border (color is set in xib) CGRect box = CGRectMake(1, 1, self.bounds.size.width-2, self.bounds.size.height-2); if (showicons && iconmaps && iconmaps[state]) { // fill box with background color then draw icon CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[4]; components[0] = currlayer->cellr[0] / 255.0; components[1] = currlayer->cellg[0] / 255.0; components[2] = currlayer->cellb[0] / 255.0; components[3] = 1.0; // alpha CGColorRef colorref = CGColorCreate(colorspace, components); CGColorSpaceRelease(colorspace); CGContextSetFillColorWithColor(context, colorref); CGContextFillRect(context, box); CGColorRelease(colorref); DrawOneIcon(context, 1, 1, iconmaps[state], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); } else { // fill box with color of current drawing state CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[4]; components[0] = currlayer->cellr[state] / 255.0; components[1] = currlayer->cellg[state] / 255.0; components[2] = currlayer->cellb[state] / 255.0; components[3] = 1.0; // alpha CGColorRef colorref = CGColorCreate(colorspace, components); CGColorSpaceRelease(colorspace); CGContextSetFillColorWithColor(context, colorref); CGContextFillRect(context, box); CGColorRelease(colorref); } } // ----------------------------------------------------------------------------- - (void)dismissStatePopover { [statePopover dismissPopoverAnimated:NO]; statePopover = nil; } // ----------------------------------------------------------------------------- - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { statePopover = nil; } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/open.png0000644000175000017500000000036012026730263014324 00000000000000‰PNG  IHDR;0®¢·IDATH‰í–Q ƒ0ç•©_Åkô”½†ø£wÚþXHKâÓ&i]ø@vQ“D‹\šPOð!ÀWï3‹{I–nÖØRïqªéÖ¤Ììw!?OPF}X`êÁ̹Ðï¬÷@WŒ¤èŒóõ8Ï9k Ÿï5~k¾è8„ƒ.©¹ÿ˜TWÓì©®¦–U×Óì€î “¤çpG%͸D[ˆh††ŸÅ$¸vŽ÷³w‚ÿ–7Ö•/”…IEND®B`‚golly-3.3-src/gui-ios/Golly/Icon.png0000644000175000017500000000461312026730263014260 00000000000000‰PNG  IHDRHHÚ$!tEXtSoftwareGraphicConverter (Intel)w‡ú %IDATxœìZ PSW¾çTpA°V`wÛúDâ³NÇj}  *â|E*…º±¬ ‚…¡<!HxÈ;ÈVQ@ /åᣃ/DkgOr)ºæÚ{1˜„]g¾¹sóqÎÇÿÍÍùïÉ7ùõùÚÿI ¯àƒ±ÆþOõß¡ßë5ýo’Ö%¢?0yzBko3{þ”ö:ùèg“îú» â‚´àïko³>–œÉmKKk=ßÓ-V¬(µ Í˽ÐWÏ c¾d'xDG× ò;OG^ÊHu†Ìà#Ú‰Ðïrøí!Á¼×l• 4È 319åéQÇ ¼Ê ¬g0êl6ýÎ40Hc^“WéôK¡ÇÝ/lùê«bŒa^ùâ‹ÂºëC÷o´®Ææ:T?Ÿš4pß„¤ ®1’‚ÄÆzºè4AG‡;ŸšC5È™öQ¦ªê¹Èˆ(Ê™ñ’óøêji ÜwyOPM77’sçðUTR|öï›9ƒ¥ñ‡tê<þ|*ïÏÊFÑ”ïO9‘Ä5FRðá3c½Ý¦ðRbxE Ê=悈™a^©ÔX†òÛGìêéqpÖÌ80§"vG„»ÝézõîV˺£G<“ÙÛŸ>|k°ü>ðü)-ãÄôl¼fõû“%‘s( â–1DÜò1¦€ˆ[>ÆqËǘb"n9@1·¼¼É7â–+DÜò1¦€ˆ[>ÆqËǘ"nùSLÄ-ŒeÄ- Ãä‚\Fn‹›x»C­TÀ1& ¿ZëÌ9{V.·ËÞ®ðú«±­ã½|d"  l44~\oY*!Ëçð­­˜ /}tÆÚšéÒ²¿Ÿ;@xª*bRmÞÏš‰³=S*¼i ®Ké¹P` @õ Ú5«O)¼ôуÀ iö¶a´c¤¦FyE™­ÂKµ±_ñd¸ÕJOure°8r³ g7­lûˆ›d"+XW³å|| 'U{6±áêÆQ “%â&™Hã ¶5¯35ÍdžA¬]Íëé2S–ˆ›d"+èëã©­¶rE>$—//ÐÐH 9æª,7ÉDWÐé‡%“(€¤`·‹Ÿ²DÜ$i\Aø­à§‘a¹œ”è¤,7ùDZZ·Õ.²ÝjÃɃÆJq“O¤qËŠ·øûyäÙPŠˆ[ÆSܲ '6&‡C×c~,œØ˜Œ·,§¸e9þÞ#nYNqËr,ü½Gܲœâ–åX8©5&ŸC×c~,œØ†wÍú{Þ|¾½Ýæ~óÛ, ؾa~9dü‚ðÝÕÝañì±é» ïø`l¼áƒ±ñ†ÿÿÿ*³h©PާIEND®B`‚golly-3.3-src/gui-ios/Golly/PatternView.h0000644000175000017500000000050213145740437015303 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. // This is the view used to display a pattern (within the Pattern tab). @interface PatternView : UIView - (void)doPasteAction; - (void)doSelectionAction; - (void)refreshPattern; @end golly-3.3-src/gui-ios/Golly/SaveViewController.m0000644000175000017500000003103013171233731016626 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "writepattern.h" // for pattern_format, output_compression #include "utils.h" // for FileExists #include "prefs.h" // for savedir #include "layer.h" // for currlayer, etc #include "file.h" // for SavePattern, GetBaseName #import "SaveViewController.h" @implementation SaveViewController // ----------------------------------------------------------------------------- static NSString *filetypes[] = // data for typeTable { // WARNING: code below assumes this ordering @"Run Length Encoded (*.rle)", @"Compressed RLE (*.rle.gz)", @"Macrocell (*.mc)", @"Compressed MC (*.mc.gz)" }; const int NUM_TYPES = sizeof(filetypes) / sizeof(filetypes[0]); static int currtype = 0; // current index in typeTable static bool inSaveTextFile = false; // SaveTextFile was called? static const char* initpath; // path of file being edited static const char* filedata; // text to be saved static InfoViewController* callingVC; // the view controller that called SaveTextFile // ----------------------------------------------------------------------------- - (void)checkFileType { std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (!filename.empty()) { // might need to change currtype to match an explicit extension int oldtype = currtype; size_t len = filename.length(); if (len >= 4 && len - 4 == filename.rfind(".rle")) { currtype = 0; } else if (len >= 7 && len - 7 == filename.rfind(".rle.gz")) { currtype = 1; } else if (len >= 3 && len - 3 == filename.rfind(".mc")) { currtype = 2; } else if (len >= 6 && len - 6 == filename.rfind(".mc.gz")) { currtype = 3; } else { // extension is unknown or not supplied, so append appropriate extension size_t dotpos = filename.find('.'); if (currtype == 0) filename = filename.substr(0,dotpos) + ".rle"; if (currtype == 1) filename = filename.substr(0,dotpos) + ".rle.gz"; if (currtype == 2) filename = filename.substr(0,dotpos) + ".mc"; if (currtype == 3) filename = filename.substr(0,dotpos) + ".mc.gz"; [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; } if (currtype != oldtype) { [typeTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:currtype inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; } } } // ----------------------------------------------------------------------------- - (void)checkFileName { std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (!filename.empty()) { // might need to change filename to match currtype size_t dotpos = filename.find('.'); std::string ext = (dotpos == std::string::npos) ? "" : filename.substr(dotpos); if (currtype == 0 && ext != ".rle") filename = filename.substr(0,dotpos) + ".rle"; if (currtype == 1 && ext != ".rle.gz") filename = filename.substr(0,dotpos) + ".rle.gz"; if (currtype == 2 && ext != ".mc") filename = filename.substr(0,dotpos) + ".mc"; if (currtype == 3 && ext != ".mc.gz") filename = filename.substr(0,dotpos) + ".mc.gz"; [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; } } // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Save"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets nameText = nil; typeTable = nil; topLabel = nil; botLabel = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (inSaveTextFile) { // user is saving a pattern (in Documents/Saved or Documents/Downloads) // or a .rule file (in Documents/Rules) std::string filename = GetBaseName(initpath); [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; typeTable.hidden = YES; // change labels [topLabel setText:@"Save file as:"]; std::string filepath = initpath; if (filepath.find("Documents/Rules/") != std::string::npos) { [botLabel setText:@"File location: Documents/Rules/"]; } else if (filepath.find("Documents/Downloads/") != std::string::npos) { [botLabel setText:@"File location: Documents/Downloads/"]; } else { [botLabel setText:@"File location: Documents/Saved/"]; } } else { // user is saving current pattern via Pattern tab's Save button // [nameText setText:[NSString stringWithCString:currlayer->currname.c_str() encoding:NSUTF8StringEncoding]]; // probably nicer not to show current name [nameText setText:@""]; // init file type if (currlayer->algo->hyperCapable()) { // RLE is allowed but macrocell format is better if (currtype < 2) currtype = 2; } else { // algo doesn't support macrocell format if (currtype > 1) currtype = 0; } [typeTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:currtype inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; [self checkFileName]; } // show keyboard immediately [nameText becomeFirstResponder]; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; inSaveTextFile = false; } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } // ----------------------------------------------------------------------------- - (IBAction)doSave:(id)sender { // clear first responder if necessary (ie. remove keyboard) [self.view endEditing:YES]; std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (filename.empty()) { // Warning("Please enter a file name."); // better to beep and show keyboard Beep(); [nameText becomeFirstResponder]; return; } const char* replace_query = "A file with that name already exists.\nDo you want to replace that file?"; if (inSaveTextFile) { // user is saving a text file (pattern or .rule file) std::string initname = GetBaseName(initpath); std::string dir = initpath; dir = dir.substr(0,dir.rfind('/')+1); // prevent Documents/Rules/* being saved as something other than a .rule file if (EndsWith(dir,"Documents/Rules/") && !EndsWith(filename,".rule")) { Warning("Files in Documents/Rules/ must have a .rule extension."); [nameText becomeFirstResponder]; return; } std::string fullpath = dir + filename; if (initname != filename && FileExists(fullpath)) { // ask user if it's ok to replace an existing file that's not the same as the given file if (!YesNo(replace_query)) return; } FILE* f = fopen(fullpath.c_str(), "w"); if (f) { if (fputs(filedata, f) == EOF) { fclose(f); Warning("Could not write to file!"); return; } } else { Warning("Could not create file!"); return; } fclose(f); [self dismissViewControllerAnimated:YES completion:nil]; // tell caller that the save was a success [callingVC saveSucceded:fullpath.c_str()]; } else { // user is saving current pattern in Documents/Saved/ via Pattern tab's Save button std::string fullpath = savedir + filename; if (FileExists(fullpath)) { // ask user if it's ok to replace an existing file if (!YesNo(replace_query)) return; } // dismiss modal view first in case SavePattern calls BeginProgress [self dismissViewControllerAnimated:YES completion:nil]; pattern_format format = currtype < 2 ? XRLE_format : MC_format; output_compression compression = currtype % 2 == 0 ? no_compression : gzip_compression; SavePattern(fullpath, format, compression); } } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidEndEditing:(UITextField *)tf { // called when rule editing has ended (ie. keyboard disappears) if (!inSaveTextFile) [self checkFileType]; } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } - (BOOL)disablesAutomaticKeyboardDismissal { // this allows keyboard to be dismissed if modal view uses UIModalPresentationFormSheet return NO; } // ----------------------------------------------------------------------------- // UITableViewDelegate and UITableViewDataSource methods: - (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)component { if (!currlayer->algo->hyperCapable()) { // algo doesn't support macrocell format return 2; } else { return NUM_TYPES; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // check for a reusable cell first and use that if it exists UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; // if there is no reusable cell of this type, create a new one if (!cell) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; [[cell textLabel] setText:filetypes[[indexPath row]]]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // change selected file type int newtype = (int)[indexPath row]; if (newtype < 0 || newtype >= NUM_TYPES) { Warning("Bug: unexpected row!"); } else { currtype = newtype; [self checkFileName]; } } @end // ============================================================================= void SaveTextFile(const char* filepath, const char* contents, InfoViewController* currentView) { inSaveTextFile = true; initpath = filepath; filedata = contents; callingVC = currentView; SaveViewController *modalSaveController = [[SaveViewController alloc] initWithNibName:nil bundle:nil]; [modalSaveController setModalPresentationStyle:UIModalPresentationFormSheet]; [currentView presentViewController:modalSaveController animated:YES completion:nil]; modalSaveController = nil; // cannot reset inSaveTextFile here (it must be done in viewWillDisappear) // because doSave: is called AFTER SaveTextFile finishes } golly-3.3-src/gui-ios/Golly/SaveViewController.h0000644000175000017500000000152613145740437016637 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import #import "InfoViewController.h" // This view controller creates a modal dialog that appears // when the user taps the Pattern tab's Save button. // It is also used (via SaveTextFile) to save a text file // when the user is editing a pattern file or .rule file. @interface SaveViewController : UIViewController { IBOutlet UITextField *nameText; IBOutlet UITableView *typeTable; IBOutlet UILabel *topLabel; IBOutlet UILabel *botLabel; } - (IBAction)doCancel:(id)sender; - (IBAction)doSave:(id)sender; @end // Ask user to save given text file currently being edited. void SaveTextFile(const char* filepath, const char* contents, InfoViewController* currentView); golly-3.3-src/gui-ios/Golly/InfoViewController.h0000644000175000017500000000136413145740437016634 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import // This view controller is used to display comments in the currently loaded pattern. // It can also be used (via ShowTextFile) to display the contents of a text file // and edit that text if the file is located somewhere inside Documents/*. @interface InfoViewController : UIViewController { IBOutlet UITextView *fileView; IBOutlet UIBarButtonItem *saveButton; } - (IBAction)doCancel:(id)sender; - (IBAction)doSave:(id)sender; - (void)saveSucceded:(const char*)savedpath; @end // Display the given text file. void ShowTextFile(const char* filepath, UIViewController* currentView=nil); golly-3.3-src/gui-ios/Golly/SaveViewController.xib0000644000175000017500000001434512651666400017173 00000000000000 golly-3.3-src/gui-ios/Golly/Golly-Prefix.pch0000644000175000017500000000047112026730263015675 00000000000000// // Prefix header for all source files of the 'Golly' target in the 'Golly' project // #import #ifndef __IPHONE_4_0 #warning "This project uses features only available in iOS SDK 4.0 and later." #endif #ifdef __OBJC__ #import #import #endif golly-3.3-src/gui-ios/Golly/StatusView.h0000644000175000017500000000026113145740437015153 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. // This is the view for displaying Golly's status info. @interface StatusView : UIView @end golly-3.3-src/gui-ios/Golly/PatternViewController.h0000644000175000017500000000455413145740437017362 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import #import "PatternView.h" #import "StatusView.h" #import "StateView.h" // This is the view controller for the Pattern tab. @interface PatternViewController : UIViewController { IBOutlet PatternView *pattView; IBOutlet StatusView *statView; IBOutlet UIButton *startStopButton; IBOutlet UIButton *restoreButton; IBOutlet UIBarButtonItem *resetButton; IBOutlet UIBarButtonItem *undoButton; IBOutlet UIBarButtonItem *redoButton; IBOutlet UIBarButtonItem *actionButton; IBOutlet UIBarButtonItem *infoButton; IBOutlet UISegmentedControl *stepControl; IBOutlet UISegmentedControl *scaleControl; IBOutlet UISegmentedControl *modeControl; IBOutlet UILabel *stateLabel; IBOutlet StateView *stateView; IBOutlet UIToolbar *topBar; IBOutlet UIToolbar *editBar; IBOutlet UIToolbar *bottomBar; IBOutlet UIView *progressView; IBOutlet UILabel *progressTitle; IBOutlet UILabel *progressMessage; IBOutlet UIProgressView *progressBar; IBOutlet UIButton *cancelButton; NSTimer *genTimer; } - (IBAction)doReset:(id)sender; - (IBAction)doStartStop:(id)sender; - (IBAction)doNext:(id)sender; - (IBAction)doStep:(id)sender; - (IBAction)doFit:(id)sender; - (IBAction)doChangeStep:(id)sender; - (IBAction)doChangeScale:(id)sender; - (IBAction)doChangeMode:(id)sender; - (IBAction)doUndo:(id)sender; - (IBAction)doRedo:(id)sender; - (IBAction)doMiddle:(id)sender; - (IBAction)doSelectAll:(id)sender; - (IBAction)doAction:(id)sender; - (IBAction)doPaste:(id)sender; - (IBAction)doRule:(id)sender; - (IBAction)doNew:(id)sender; - (IBAction)doInfo:(id)sender; - (IBAction)doSave:(id)sender; - (IBAction)doCancel:(id)sender; - (IBAction)toggleFullScreen:(id)sender; - (void)updateDrawingState; - (void)updateButtons; - (void)toggleStartStopButton; - (void)stopIfGenerating; - (void)startGenTimer; - (void)stopGenTimer; - (void)doGeneration:(NSTimer*)theTimer; @end // other modules need these routines: void UpdatePattern(); void UpdateStatus(); void UpdateEditBar(); void CloseStatePicker(); void PauseGenTimer(); void RestartGenTimer(); void PauseGenerating(); void ResumeGenerating(); void StopIfGenerating(); void BeginProgress(const char* title); bool AbortProgress(double fraction_done, const char* message); void EndProgress(); golly-3.3-src/gui-ios/Golly/help@2x.png0000644000175000017500000000207512026730263014672 00000000000000‰PNG  IHDR<<:üÙrIDAThíšÏã6Æ¿Ç L߯¬:˜ |²ÆÀªƒu*Xuwoq:P:p:Ðu í@© ÞÛx“9„Ιdi½ûw©G~"ùøøDRJáš`—îÀ÷æ&ø­süÖ¹:Á? i¼(Š÷J©ˆˆ"¥T 8QµPQºßïÓù|þe¨>Qßû°âRjID1€IG35€@†áß=u @‚…ï¬Ä½üFÂ9_N§Ó¯};[pY–÷»Ýn‰ÿÄÅ–ˆV³Ùìs %8˲ÆXàñÜŽ¸@Déh4Zœ3Úk‡´A÷uÚ•ZJ¹èêØ:mKyžTJ¥øþb `Œ¥Y–=tyÙ{„õȦ]ë™­”2òi¯βìAOã clS–å½ÏK^‡vP]¦qED €j4UM§S–åýËËË£”rAD œPš»Ý.ð‹kGœ§´â7øo=5ųÙì3ðMØ~¿ßš¦bžç‰h ÷»Ãð/—ŠN‚uPQ;6~ âœG‡ÑÌóüw"Z•½­ÞßS¸my[Îyà²]¹®á•c½õ±XСæ1c,ÕóÓéô+ç<°uho¢ƒ+VÁºC±‹±J©UókѪ¥ê†©m¬›]º80«`¥”Ó—;æéééÏæ3Ö-Õs‰c³“ççg›-»à–©Ø™[šÑ1ùœ–c±µŽ©PG3ÞÛЩ©ED.ë±3J©È6­‚cÖ)ÒÆn·{µîtGb_[§œš¡íÈTn g¯1pºèR‚«C4¦ ìW/\D°ÉCpƒ#¥¦rÛ®ûêÈ1J© úë‚Q0ÕC4:ŸÏ¿!>`±¶|›QðÀɺ¡œSe*4 –R’°+Šâ=rRœóÔTnMñ!þÁeòÏ]¨Â0üÙTÁ%ôÖ9x. ׋ ["ŠÂ0¤0 ©‘Ô;Ûöx<¶.A«`ë&}ôHJR¶ÀÿiŸU¶¬/™µl£nKÉöä·œs§™è$Xòêœ Lìú Õù´†á'Xö8 A[ºæîî.:Ã&l\ÿ:žÇC)e ·Äø)6Ç¢…”R«3ìÕœóØç…ÛïR³Ùì³R*ö}¯g:‰®ðÊÃíR‹/Wum阫¹˜Öäj®¶q—Kt®î¾ôMð[ç&ø­su‚ÿ`øþ>6EIEND®B`‚golly-3.3-src/gui-ios/Golly/RuleViewController.xib0000644000175000017500000001747612651666400017214 00000000000000 golly-3.3-src/gui-ios/Golly/StateView.h0000644000175000017500000000111013145740437014742 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "algos.h" // for gBitmapPtr @interface StateView : UIView { UIPopoverController *statePopover; } // close statePopover when user clicks on a drawing state - (void)dismissStatePopover; @end void DrawOneIcon(CGContextRef context, int x, int y, gBitmapPtr icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb); golly-3.3-src/gui-ios/Golly/StatePickerView.m0000644000175000017500000001256013145740437016120 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "prefs.h" // for showicons #include "layer.h" // for currlayer #include "algos.h" // for gBitmapPtr #import "PatternViewController.h" // for UpdateEditBar, CloseStatePicker #import "StateView.h" // for DrawOneIcon #import "StatePickerView.h" @implementation StatePickerView // ----------------------------------------------------------------------------- - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { CGPoint pt = [gestureRecognizer locationInView:self]; int col = pt.x / 32; int row = pt.y / 32; int newstate = row * 16 + col; if (newstate >= 0 && newstate < currlayer->algo->NumCellStates()) { currlayer->drawingstate = newstate; UpdateEditBar(); CloseStatePicker(); } } } // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { [self setMultipleTouchEnabled:YES]; // add gesture recognizer to this view UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; } return self; } // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); gBitmapPtr* iconmaps = currlayer->icons31x31; // use white lines [[UIColor whiteColor] setStroke]; CGContextSetLineWidth(context, 1.0); // font for drawing state numbers UIFont *numfont = [UIFont systemFontOfSize:10]; // draw boxes showing colors or icons of all states int x = 0, y = 0; int dx, dy; for (int i = 0; i < currlayer->algo->NumCellStates(); i++) { CGRect box = CGRectMake(x+1, y+1, 31, 31); if (showicons && iconmaps && iconmaps[i]) { // fill box with background color then draw icon CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[4]; components[0] = currlayer->cellr[0] / 255.0; components[1] = currlayer->cellg[0] / 255.0; components[2] = currlayer->cellb[0] / 255.0; components[3] = 1.0; // alpha CGColorRef colorref = CGColorCreate(colorspace, components); CGColorSpaceRelease(colorspace); CGContextSetFillColorWithColor(context, colorref); CGContextFillRect(context, box); CGColorRelease(colorref); DrawOneIcon(context, x+1, y+1, iconmaps[i], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[i], currlayer->cellg[i], currlayer->cellb[i]); } else { // fill box with color of current drawing state CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[4]; components[0] = currlayer->cellr[i] / 255.0; components[1] = currlayer->cellg[i] / 255.0; components[2] = currlayer->cellb[i] / 255.0; components[3] = 1.0; // alpha CGColorRef colorref = CGColorCreate(colorspace, components); CGColorSpaceRelease(colorspace); CGContextSetFillColorWithColor(context, colorref); CGContextFillRect(context, box); CGColorRelease(colorref); } // anti-aliased text is much nicer CGContextSetShouldAntialias(context, true); // show state number in top left corner of box, as black text on white NSString *num = [NSString stringWithFormat:@"%d", i]; CGRect textrect; textrect.size = [num sizeWithAttributes:@{NSFontAttributeName:numfont}]; textrect.size = CGSizeMake(ceilf(textrect.size.width), ceilf(textrect.size.height)); textrect.origin.x = x+1; textrect.origin.y = y+1; textrect.size.height -= 2; [[UIColor whiteColor] setFill]; CGContextFillRect(context, textrect); textrect.origin.y -= 2; [[UIColor blackColor] setFill]; [num drawInRect:textrect withAttributes:@{NSFontAttributeName:numfont}]; // avoid fuzzy lines CGContextSetShouldAntialias(context, false); // draw lines around box CGContextMoveToPoint(context, x, y+1); CGContextAddLineToPoint(context, x+32, y+1); CGContextAddLineToPoint(context, x+32, y+33); CGContextAddLineToPoint(context, x, y+33); CGContextAddLineToPoint(context, x, y+1); CGContextStrokePath(context); if (i == currlayer->drawingstate) { // remember location of current drawing state dx = x; dy = y; } // move to next box if ((i+1) % 16 == 0) { x = 0; y += 32; } else { x += 32; } } } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/SettingsViewController.xib0000644000175000017500000004357012651666400020077 00000000000000 golly-3.3-src/gui-ios/Golly/Images.xcassets/0000755000175000017500000000000013543257425016010 500000000000000golly-3.3-src/gui-ios/Golly/Images.xcassets/AppIcon.appiconset/0000755000175000017500000000000013543257427021507 500000000000000golly-3.3-src/gui-ios/Golly/Images.xcassets/AppIcon.appiconset/Contents.json0000644000175000017500000000164513171233731024112 00000000000000{ "images" : [ { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-76@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "Icon-83.5@2x.png", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }golly-3.3-src/gui-ios/Golly/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png0000644000175000017500000002125413171233731023622 00000000000000‰PNG  IHDR˜˜— ·v!tEXtSoftwareGraphicConverter (Intel)w‡ú"FIDATxœì]XGžÙ£ ‚K¬AL,‰5&šˆI䀓ÞÁ*EÐXPLTQ»‚b´;88z¯ÒŽÞ‹   ]E¬)ÿóÏî"¶ï”žg˜gnx¿Ù÷föûnvfw_ðï³åÿ=W@ù«”wÞ4ì'†ýýïo: êQ@yWáM€AÃ~bè¤4| `p ?ÃÁÐú‰zä'b88Ÿˆá`hýD =ò1ôÈOÄpp ?ÃÁÐú‰öÚ#Ÿ=¦WÝTMˆÕ ÔÏL×ii`üûìõ†ÿ{†»ÉòŠËéhzÖV«<`½ÃÚçò¥,Nñ•+9ÖÛ}ímwVU¨#ŠÝÔÖª|ÉÕló¦KgO§²ý‹=<óíl#¶m9ž¢‡ŽØùì=4hÕ&ËãŽq,V!Ó·ÐÑ!Ñrã‰ßµÏ)~ªÔýƒOTßæ‘ão¨H÷pq©IIoâf´¦s›¹-11Më×en0±«¿£Üi¨P«®¡~rÏÞ¢¤ä–ôŒætn B&'7ÛÙ•©1ÎdsÕ»Ô\¯la¾ÇÄ$5* !¹ÜV„LKov½pGq¹7ËÛèßgt‰¾¿“£…ªj˜¯ocBfÜà p›Ùþ êªQ‡X>n£ó•*õäU…ÖÌtíoæ]ÑÓ˽âVévõ¦»û-7÷ ÷«•îîŽN7¿™sÃÌtçã6e„l¼»‚¡ì ¿4íÜùJ÷«7ÝÜ+Q"•ç]+~–Ïþå'§;ÕjÄi«¸}«õœ¯coº_­ÀìD¢²¡~áܯ¯%Æé“=~ÕÍx挀mÛŠÑÝÜþV'¾ÂÚºtÖŒPçÓШó‰*õÐÊ'ª¼ ­¨ÇW­Ü1fl¨"=ÉfgæÎ™66dž…r«MY²Ó"?ï¢÷ßsúÉãÆ2cÙóæÆî´Î"]HëYóçÇÃ9¸ßŒIñZ'¹MµÙª€š% ;m2•’ÇŽ ÕT·}ܦx÷6cþ|§ñã#V­LïN€D®ZÍýlBØW³ÎTW¨ð‰*uäU…Öòbµñ㎠‹xËRTŒa0bV¬ rF,ƒ·pQ˜¸˜—°È_댷>¼Çøñ‡=)5Ô{Ù²¨ Fàq䲟£¥¤¼…E<æÍ9ÐÚ´Âz›*#Û B‰¦ðf d,])vÜx_aÏ‘#Ngsµ}} Ň\ñš>=€¡ÛÙ j9V™÷Å—OQÑË]×ò‰*åTàÕž*ò&´†p D„/à‰Aæˆá¾S'ÊNå|>%¥ ã9¢¢>°ô˜;÷Ïâ|­ñcN $>’’¬É?Ÿ‚R€ìÔ€É9’’¾8xHK;ggèþ,¿O¼EE™?C­áÍ"äÔÉ#†³!dàE£¹£Hµ{×Fÿ">2ÇʰI$j!ÇÊÐh>ø ¦¶òœjaž6õÐʪí÷¼ ­,oašÁO¡,DãÑ‚h^@!p¦ÉOKÖ=Â}$! ¡H!,ƒL"ÅÅ®ÄF­ú~‘Ä?!02POD Qâ@È:qÔjëf3I$"@Ã:4,¨“@€mͽÞ<§š’´ŠºGòƒjs½o<2!VW\ ùGÂË)€8âQ‚ ¥yß®(Óš:õNâËȸ.$ Ç]ÎËÖSSAÙQù22Žüˆ4ZÀUw‡CfŒxßI ¡“@´™éöø}žS-ÌӡLyNõá}ÞxdCCNî\²ˆ<€L"eyÄk’LLv>y¨¤­µ€4¢žKþ·;’HésçimT9êdŠaq•/#I0wøð«Y\½Äx ÿλÈì$À¥ÑB.º®ç Õ&ê“~P¥ôIe ÿyF·Û»E˜– `¥”¼œ£T$5Ô#"t¬* AñË€®B‰°PøŸX¡©`E™ÆçSÝ0YÜ­Á-c0UCÝöQ›rû}%†Ò!Ì…@G‚¼ér'«+4ùD•ú@ò‰*Ï®#jU~þɉ†x‚Û¨…àJ/ÔˆÇo´Üõä!!Ÿ¶+mÙ¼CD8`5$¦ò6 ËY*¸îŽ&ù‹âveÝ0©H€UuÂj»,›2Å5åÆJ’7Mçó)A¬âe$^ÀÀ-))¿ ®äÅ?¨R­|¢Ê›ÐJæ•åjZGDE2!¬°€VZ ¬*´ÑrGSý‹­-J»vì& a-l ëDE銊 ðk8ò@ÏÓ¯\44ÍQ«lF`îAØ@£åÌš}:4d UˆDOŒÓ_0ï2VaDm6aXÙØ±ŸÌúBîú eÇKÖ·4ªõXÀD«8_cïî-‹¿»(;•9ísï¥?œF­¢\û•¥N…ú;*§OšÒ—Ÿž>Íçó)Ìù߸"—JO5øû©â Jq ùG•¡µ{}[«RI¡vZ²NU…Ö“v¥·¢Øuë¦zê ’B¶{Œî€GDžWw[%#M77K·¥MÒÞ¸ûú¨¥`ÜTºÛjÿ`Ï:z¾i£Eš•…mýå®=mW|¢Ê›ÐŠÎ ›Vã'„ª©¥í·ÏÛ·/×Þ>—ÌííslvåϘ+7Í-+Ÿ©3½ 'Ld.Z”¸Ï.ßžÈ<„´³Ëÿ~qÒ„ ì+Ñ7)ÎW1ãÜô/âví̳ïl/Øçî·ÏU×àN˜ji¾ÍlÑÜRQqÿ¤IÑf²º؇ãsÍÌs&O”ÿÁ©¹^™OT©‡V>QåMh­­V‘“sâ+7£­ «¯§‡ò=ÝD]ÝÄåô))–øëhÊ ¦ºS|kŒŒ¯ºZ‹Ç‘z8RM3~̶¸„ÏOò¶(ÿùÇzq O©¡¬åË£I$Ê d’¶n‚œ\ ¸sâ„7KÔ£#t¥‡]ÂZ¸ µÖEµ©£—¸pQ¸„s¨äe6ˈOT©{$?¨’¿/<ðÈè1QW®Óh^“&ÌžòÕ¬àÙ3ƒfÏ þò‹`))&Þ^ÿnÑÊ2IœBO¿Y3 G"üÌÁ22l z£ÿŽuº(_›¡¸Âëx Æ3¾BH#[ž4‰CÔ=„„.£©ùöæv}ó‘“ $‘8™AÓdƒÅļ ð‚ðÚ–Í[¢ÃyOµ¼Dƒ²G*ðƒ*šŽñæ:’å¥+LóÀ÷"@ aŽ˜([LÔ_L$@C•_ï÷›&{”ØR8Û… ì@ŠÓP%‡DŠ‹_Š‹^ùý·¶¯ @õB´@Q†#E„:‘l½OÛHl)°I$ ŠŠHT AÙ€~:Z»½=ôyN5-y%õäÕ–uÞ„Öð=Qa±0O®Í£<€(¢‰B $þ5k–SQ¾ÎgãÎubºÀÑ]Hô‡Jº¥§.ÿÅâ€ß MšCƒaœ çMíöZ` ¢Ùƒ@,I‚¨5«mBƒ yN5'SŸzhµÛkÎsªZÔxZoÝT?þ2©Ä"}*±cN$.‘§A¼&ISsw[«òÏ?ý@ QO"ÓX’H©ÓäNÞ½£öûoVÆwVö@’)UBÂ3>Ö0(À@T4èeÝaˆ@*†…q4çUê“~P}þ˜G¡õùEã½Ì°€" _Îñ$*¹æ¾ý,»ž3Jè¬/zµ@ƒ‰Vw Y57Uwä?ˆÿ«{³/Z† óûïî5©4Õ¯øf®3†ê{èB摹œ—­Ë'ªÔ’OTy¶ P˜§%'ë±r« ¨Æ@ ÊQx¡Š†eÒ÷·6©"ä½&†²Ò! +$‘ðe$Kd§-ÈÅo(zþXñ÷ß¶Š §¬’Ä`ÐQ®–ööñ^GÌþX>k†I…|K¡oVD$ÚÆf+jOT©‡V>QåMh%ùÅFéÍüò:+h°ÏA3€õ´ô¥òèw®¨)T–«*Ñ ¡­±35£œ‹e§¹™üû¬cñ ]uýºé7‰!(¾5à0ØD"!¼5b„÷Q'«§í Çèjò¼ó™Ñ¡Ôv#Ða­¸Xäºõ»š;g|¢JÑ#ùF•w‹æø×.Ó´Þ¶cºœ×PÉÔ!¢\©¡q³g]´³ûµö¶fÃÖF•ãG-|saø°$„”rcêd¯ lòr zÜ ÿä¡ËkÂòc2£b†ˆ¥Kˆ¥ÃQSݺ–vá‚ÙÃû*€*ä+Užxä‹]§†ÚYzñ±YúMwUÉ•Ã×*Üoaäj'Ħ%Þ®RŽ?Ññšß„D—JåÅ7 QºYªõßÁyíz ýÙ#zM¥j0!Ö  O§­µcmýCQ¥¸hÞAµºR-1neT¸QA®î;©¦§D„er ÞJõ=&;o ¾ ððžrhÑá?vï³;fk{ìÀ~»@ÿÕ÷›•_5|öX1õ†Îñ#ÛííŽØÚßgwðêÓÚj•{ÚïÈ7¹ê;}yÐð-€’BuÓõ{÷f&¥4–•=*-kKIi¶·Ï0^}¬0W£»ascï ó˜°È»Å%me峳ﹸ躅­$câKhPÿø†7KÕN¬ßXZZr'$¤–Xgfš¿\Þ¹ ·ãÞƒ-ʦë[ÁHñò¹óZR·ÿÀÍï°Ø¾|¹ÕC»õ>m§›ïšúyôæMyNNEGŽ:9¢üˆS¡Ó‘ÂÍ¿ÈN‹ÖÓÞ÷芜gN­›49HG'ÃéÈ ¤Ž,Øg_üÕ×I ¾9{릥ìsô4|- #Msì¸sÆ,ÿ%ÆØøJ&ÆÉÆk“SÖš$ÿ¢7l˜ÿèQ—âctZóç”’˜77líÚH„4NÑÒM’Í‘’òvr\ϳÝ~š Ž¡Â‰£ëi´+\—–öùfnè· Â- ÿvaè· ÃæÍ‹æ ¡ÄÜ÷ün•’¨+)á áuQQÏÙ³B€D.Z¶`Aø¸q~æ ±k¿ülû´Gñ|ôÓ\€ ·ýjN<ý㿨0[j¨¿´%)I¶ˆ?±1Âi ÷ÓË@˜vD Ñü†JHKù¡$5”-.Š~Ä> súô#÷š(,š Dï¡Í4aDû1D!¢3¡r$ÄS¸Þn_C!&#w<¢Lx7$ª‰übú±Ö&õw¤ Ä+2Tøëêja¡PnÉDJ%öXRÈÉFîÝcU˜¯1rÄ_¯Cvà!ž'-_¾ïi;…Ý8ÍȰºBuÊä«ä^Ê; ä êcøä¡’²Òar_A¾ÀÓhQN޼»ÕãcŸæ‚dˆ.áoNX9•(Ap««A% KÑÓûýÑüæ¼ÈpÃÃ9¾„„D% æÏž}´º‚ÚÍWÑ;‚eØvOÙÒ|—˜€ún©åBXÖ’%%E{ÏÓÏl1<ò„9ž0X:eŠkHðºî74¿m û=þœ@÷± Ûï+»œÞ8k¦»˜h.«i F˜V0v ÓÌì·[ZÝ ÿ~B Z³ôÇÓ’)4¬ !…°²aÒጒoýóŒNñˆ}öH:å\dÏõßþïXïiˆ<©±Ž¼êÔ‰Mއ7]sßP”¯ó”x¨ãCz[«RR¼þy—‡6¹ž·HM6xˆ?Ò›Eó^r¥7Ô1‚ŒÎ9[?ºÙýŠYfºö“‡Š¯;$NîF¼ÞeW‹cG7_8oeH¬ý¿çÞÀþó”^Y®êë½öÌ©Í'Olöö\w³DùßÛ{õÞ«æoîU^„Ö§ítÄÆÄØíÂÅ‚””†¬ìæ°°Û¿ÿó«Õ²"î†èd¼‘¨¿aýqGGn\\mVNK|ÂÝ#NÜuƧb£ŒÐt@P"dŸ [›”¶X˜ûû0Ë32š¹™M,V¥åFÿƒûw´40þ×§^åMh}öˆ~ÄÁ|ùòˆ¿<êbîÆ%4ÆÅ×Ç'4DG7îØQ¢´Ü9'³cES0Ç@þGÏc'*cãbêãâ2.®áÄÉše?ø°¼ »^LÖÿ«†h7¬Û­oÜ—POöU|CpH£‘!wíJ»Æ:åÞö*Ï<’Ã6’“céëg;;—9;—º¹K™‹sé¡Ãesç¤(+jiXeEjóçŸ_º4íÔ©r—RçN$ÊOŸ.û駬9__ÌÍÔÇêƒ! žûì6ÉÉElÛZˆ¾r×w' ¥Û·—|1=ÚzÛvò.ê½Êl¿¯¤ °wä¨à—ÄZY¦YZ¦YY‘yº¥UúZ“´‰CFò¾æ¶¹Ú.‹#ýg|Ž?™†–©]Hói3gFŒɱڸ¥W÷ G–«ÊN;=ztˆ¦FRg/á¹¥%ê4 ­äÑ2Á“'¹æekPïUJ·CRáš›©5|ø)Œæ!%åµøûˆeò‘?-‹Z&ñÓ²Hyùèé_ yÐh×4Õw5׫̳£yŠŠzÌ›ú“|ä2"!ä²eQ󿇉‰zb´¿¦É:ÔßQíÏãÑWC…ËÖ‹\¦aãÆ±–þÕÕW¨ðãÒ˜ñŸùÒh×i´+GL©÷*r_Þ„V_}a!7| ðcÉŒâŒã?V†=F†=\ÚŸ†±ˆ}ï™3PÌ3úL„f0–@ŽÃ5Â_DØGoIÉs9™zý9BöÙpç6 ¼ð€¾R’~cFtôÕhöP 6„¨¯|ôZ½j'›eH±WÛZyôÂ$?¦®0þµ0"E@†ÁCQXé%êCå¦OOÑ“éB,ᇑ ùDÂîÈ!âî©7¨?#H¹}‹9ñ^6ò›Fâï&ë諎^B t´÷ÛX”zµ¥Â+̨på¦i •ô ‰XªOê,$v–“ ¸AââÅÔÖ¨ÍøòÔ+Ȥn !oŒíZ^¢ÙÇ£ïé|z ':§G_uÔ@”`ÔÖ-¿rSµ)öê£6oBëƒå… N @‘“”r;kr Œß¹MaÍÍvBü”œnø—p—ÉlÀxË?z„ì³a~ŽÆ¨‘ÌÎþéÞW5d‹ˆø±ÖPïÕŸ)¾“*ÅëHúå ëÅEc,à&å°[NŠÆ?Ÿÿìe¤éŽã qdw@W¡T\Ü×Ým}¯žçÄ_Rln¶K˰ôì%¼€Á¬%‹67¨öªWyã‘(o ´ÑÜFT$ÀZêPx~€»TII±OœÜŒÜñÄÝòç]Ö“ŽØíNä]YÁ‘øuëö¯;ìÏŽõ>†·«Ô–-=†ÑJˆ/NöRG'`°lòä‹Q‘ÆäÃÔ{õÝIëƒVåƒû·ËÁ° ›1Ђz!Z®¬ì× fOÚ_D—þ!ûl8@\ú­c½áp韎õž†#àBMjWEÉÍÒ3JN2â‘*ŠòIkæ=&;]õÔ¥Fþ}F/-Rwu¶Üo{ÈÖ㙓¿åivÝ~"8ã!†½­Ô¥Fž¶+^t5[ièëåS“_p¿¬¼½°ð“U½ÒÈÿì)Ë'é‚!ȪGR—A?õÇš.ù>Üŵ*$¦!CBêÎ_¨ùñû¨ƒû-ÈÇôÿÓ\€ ©¾C€ºÔHR¼ö4¹¿~ø!ÅÑ¡˜T0!E‰jäåÓde½Âƒ ¢wÈRh¥.5ò7~‘»e¨4{ÊäÀU«n˜˜$"&H£57¦N –’öÓÕÚE>&ØÏã•RòHêR#µÕjÓ§FHÍCV6ðÛaŒ#¿Ey¸ì´@!š'€×>¬ºRýƒ­Á’GúúèQ”ÉHÓ=ò ‰Ä ŸÄB¾Ùâ¨ß€9dˆkFšAÿ?ÍÈÒ@rØz¥F²3ôÆŒvéÄàÈ.X§¬I„ÄwnªQÿï2¤Z‹òÕ)J47¬X0ßéedJw$©`2a‚ó`hå­!%ì•ÔÈ>»Í4˜úZí²Aš¶ÖÞ§z}ë¦ùG?õÈÿz#5RU¡6{Öyüf°¢ ÐY@5e#F¸GE¬úTo¾úhIѲ7R# qÑzr²žv‹Üíc ZZÚ×Éé×ç•¢wȰKtÔ¥FP€ÍÏÖ5ÐýcäˆH!ZBÒ`åñ¤… {yn@AUPâ•öZ÷ƒºÔÈ“vz^¶ÖÕ+¦Ž‡7:i¾ª¹^•ÔàÅÙJïœßjÈ'­ú;wrøIµ¯¡µëH”¥Fø"àÒ7UÞiÍà2èì¼î¶áÄñÍgÏl ò_SG嵿÷ü¡Ê‹ÐúÑ\ø¡ŠB*êÖŠr5ëmv»vÅ„„Vee·¤¦5\ºTdbìî~٬ǖΠ€ËO:~¨¢ô†ªBqCéäv남è¦8Ôl|#ŽŒoðôªW\õÇ>K4$ü£Ê3ü¸.|RE¡NÅ^-­ý_}•ðçŸe’hÐ…l¿ÔÐ0ºûúUü–A—·tüPEéU¶¯þh™ë> 1^›J4ˆç$ÒÒ*õÇ¥q#Gý°øÏ{Íʃ.oH~¨¢P§Zw[mñt!ÚõéÓ9ËäIR>êûÅQÒÒÞ))á’«?(àò¶èÁUêTÓ’õ\l æ;b‚!8Rf[\ÌØÿñÁ°kÎmpy›GòC…:Õ¸èUK¾³ƒø^ $Ö í<²eŸãªÛZa¡˜7 É”5~ÜÅò­A—·ÍZù¤ŠBjÓ]•ïÀ`q÷fá‹B9ge‰_T ¸¼ãR‰ª(Ô©¢–“âõ>Ÿâ±JƒZ¾Û‰¯¥a9K–©¼©Ë?ªïöHŠùßÇpá“* uªˆš¾þ²ì”˜X„h¤IU’’aÚ:v¥ÅÚä“þü£Ê›%:²þ£ ¸ðG…:U4]P æmýu¦ºƒ¦Æaëí6‘á+Þc¼ºk1(àò?TQ¨SÅŸLjfdsµ‚8FQá†7K5žáO&}8ª<ðÈ.àÂ'UêTÛZ•/¹šmÞtéìéT¶±‡g¾mĶ-Ð%)ùè ¿©¾Í#)äGpá*J/¨6×+[˜ï11IŠBÈF.·!ÓÒ›]/ÜQ\îÍò6êÚÒpycôà“* uªhl¶oµžóu¬ƒ#:tEç¡q$*êÎýúZbœ>ÿ¨ò&´~tþ¨¢ô‚jR¼ÖÄInS§Fm¶ê fÉ" ¨”I©5¬lË„…&;SliÜ`sƒÑ‹§JÂõõ+…žŽ=¥‡ëªÍÞÛWy7U~1ùû¸|j²U``ƒy+7wˆä‘SSa=2è&~~…ù#`'üŠóh¼V­Oò¤æä AåÀÀš¤xgw‡¶»[RVö@aáhXXSø…㿾PRóp¿LIë+*Šj?ãï Cz|_Å×;(!±»¨x41±ÇÛóüû*<½îÔåKN™…£ÙÙn®©­:ï¢Ê?&»Ú4¿Z—H$^srjprj44¬ùe{hw‡Æ¦M‘fêŽcffuß}ÝÕ¦¡ pÎÀ úرF‰Öõkצ4ÖíÞ·×WC½ÀcN¶v kÖd1ó ŽíØQ }îàи~=ýj¬Ù¹ â–ÍL=lù¾èÔÉ#ð4¸Y•—è­]›agÛÀa¥¡YµG׿¥Q‹›ê“Êüc2öŠ)“2O:[ni˜øìL!¡¸Óþ–x|â\ɬelp®d6—èÂJL4*ø¼yThèávDvþ%‘Œ¥Kr–ÉåÈÊP±X2ÑêØº5çfÍJ_ò9 \¸€†ÃQt´Iò;NàñiŸ/¢-“£}¾(‡€OÛºõôøsE.VòÞž6Ðì|ê²¥4èú—’Šô!YsS­¯Õå“IW`0L)CR¶• Í¢ž ´$àéSÀR6?ð ú@JàE ½<í/Jä€è›Ïk×o×GLÁvëœTU| üqkèøs%îAž:qAŠ'¯&5—|ê¤ 7ÕúÚ=ücr°_cÙÒléD.0éܼ)j Ocã†6ØÍÁ—-#ßèÖTS CÐŽIPZ*¯¹A×Âü$ж±A."RÊÌßïëíŒÅ¶L‚x|M|¬EÌ"ßÀn˱˜Æ“~<ݺ•–*ä\j¢H»†ú¹Þ.-nªO¨ðI¸mLºÉ×_åÌì%ؽqcJM•!€õµú[¿§ õzW¯ÎÎ¥™ØÛ©­¢'"ÒIÀ÷-]ˆ%Bâ¹=¬f¨>[¬€ï—_èðÛKE¸¶ ñŒ¤D3^ _JªÖÙÙãÅSå—Ï”H¤ÏæÕáñýsÄÍžztO•gâ“’hµby¡ ¡OX¨cçŽèÎöÝï¢:MTèéÔŽ¼ä}Ånø¦Æ¤„ ÝÔˆ¶‹¸èÐÓ¡= ÞÝ•œ`~Á©¥üäÍmz|_9ƒbr¼ºÂpRBž?QÊ£™…;1Œ9…b¦Qh°sÕ *ü‰„@ç-ºÜãm@·8òªüuRž™oT_0@£õðKÃR‹ƒS§2óèýyô›§ü³k*Y÷¬»]ûä‰*íFAÁ@P 3?tEadPÍÿ䥌Œn&sðBhEjKW@9Φ¤¶3 ‡"#¯]‰`é ¨Hh°W||saÑP||KðYß±ÇJ<ùú•|™xáBƒ9˜‘ÙsÒ/r¨_ý]TùÇäÍê[¶\utl"yµxy]?`V¯©~v¨׎m¬½Ø Mã¶Ÿ#ûÔvë0½Æ›7mLêlÓ"ZyîÙSÍ]][6lȬ®Ðóõ±WQ)gƒ-ž-›7çg¥GEÚ¶­ˆDb$ÒõmÛ‹/^°â“ u»7nH‡Þ8¬ôôjšùôvjpS{¢Ä?&âLpIŸ/¦®]»fuž´t–¨hLðÙC‚‚Weçg¯]¸¬,O8h1G¢tÀ$/ÐPdDR¢"1ÁpS…|;-®DË2³0?K´ (È39ùƒ½Q_RhtØ:ÀÜìl:Ùüå˜Ò{xÝ{»ë¬}0åä+3Óóö¶þ•å{A$ßE•L‚ÝQKˆ?•™‘O&Ó()ÎÏÙ»&î©$'’ÒÓsÓÒè‰W½A0grà±ý½ÚñqÁYYŒ”ä Z–í«1…wQå“O*™šŸ:ÝÛÓçàÐâåáúâ©¢½­¯§g[llà$Rûakÿ—ÏfÎ]oïÒÛÜW‰é³°¸z„›*,¯ùÇ$=ÇP\<é§Ÿª*Å`ë¿¡/Ì ì“’ŠÝ¼¹@U•BAR2®¶ræOä%³9sÈ;vªª•«rW¯ IŒ7æ¦Ú×£Á?&/‡ƒ„PqؼY‚¹`4—€§xº„db1o@,ð¬Ôd³sW7g‹€ ÅJ\<ñ¸£7ÕÊ2þîZVl0kV1‚4Lš´tVmŸ¤dÞTPX¸ †k_ìã=É䄃8HHý$/V$d¦sSíëÑäï®iàp=2 FÀ_wqv{5¦èîêA t l‡í459 vÆbòñµ]L\8 Õ‡Û¾xªÄMõ5wLòt’gT".ÚkªÇhk^‰‰¶yñŒõ³& >9¨«¥¦rþè“3š]ÁÜÙxÆy—J¼þžKéóqöþOªo»+Ïîž•-!i41Q.€£a0éää™[…€„ H¶ á +,†:G<ž-!oSå± áî® o_‚ u“&1‡JI1£Oe%o+ÒÇdt¤%S9•À’Ï“â͸©vµkñɱÇÊšêáL/‚ È ÛqÈÜ&Ç–‡Na±Ý(2 íQW {¢.î³öx`¢pÚe뙿Ëvrôžé=žZ¶‡Ooü.ç§É¡ÁGŸ³nñª[6e?…ê´tòÕ˜Ri‘…JN=[_kÄy™ riu…Yå|jJHEéAžÉú£J s‚\¿õšÚ›ÂË1ÅW¬_x7ä1Èñ ~>žAíÔœ‘ììaçãµ qV0 =êíÓD¥P©#>>ÍÁg9+º™äû5äá®Õº &ëî.71®21©RP,Y³úRe©®œ\ŒºZ©© TW/[²$®£UkÝõýòäå‹f(’&,D+I•”€¤œM $yyØà°©³³çJÒæJР€Á)©¦ŸÆ ¹Ÿ/5Ó‡ƒ©}õ¤‰‰Ñb£Í„…ó§‚x<ƒY°ïÓpWn&P?ý‡¢—!_÷cÐ.ÝÝAï«èê„ ˜” ¢HÏ?F>ºÿö ^ÿÐAòz¾ò}=Z&Æ!rKË—É•XZœæüv}{D 2øŠå¥K>/70éîàñZÐ?Ô]y¢¯_)6^ÛŸšì›šBêîØÃy=Òwûu}JªWr’OKƒ!gçï]Ëh3 è¤ÚªœŸ~!¿ƒ¦•ÚæÓ½*Ë,`ÊÁÁGÊKˆt¯²b›G÷T9?ã€VW˜çÓIÅLû»·Þòøs¥k5¦tÏB†ÓÐM-T[÷1èŒ|ç]ºo2ð‹I†ð Mù£¹¹#®.¥y4Söû{–>>5ôü[tú-_Ðkyy”B}­ž£#5›:Ì`Üïôóö}ùL©·Kë¨}rZú ƒy;&¶×åøyÞ‘]Ž—“’ûLN¾é`ukP æ1n®AÑ1=¦§ÚÛ¦vµiƒ úŸð o/`ŒR©Ã޹5•ú<©Nëí¦zíåË“MŒ«‰Ä:kb¦VÅÆ á®Ye _em]G´®30¨Zµ*–{ËèÖDBQ]Ý_A¾j‚™›×.[–™™fdqÈí‡ ¡C--ëV®Ê µðñ²]¿¾€Èásý7 7‡¨Èƒ+WæXZÖ¶uk‘‰1)‡ºwùò èH¬…NË”•ª+vsSe¿0ÁÏ]¯DÀ dñÙÙ²ói²24a¡,AÁ«~ÞD\²˜h œk‘l,69ƒbÂ=È[ƒª2Ÿ]$dÌ—aÕ”” bPŠùAçÕ+ƒñ2ŸŅ̃IÍ…ELš†ºÏöŸýqØôϤ¤Î“¦ápé›7ìñÀbÒ¤æReçSeæÑ •ÜÒðÃÖÐô ô,HÈ””Œòp=ÌMµ¶j/õRRM°Ø"©˜°JaÚŰC‚‚ùSÀ #/LjÛ]ÜQ‘[š0µ&Š”9uÞ¼éÒTAÊ ü´4Îü7X±}[ÑÊþ;\µ2Ú›d¢eSÁÏæ‘ƒÏZqSmnàz·Ž{'_¯##H‚€Šô¢H—üÎð;#j;w\AÐn¹Á{¾þê*¬ ¸ ¡ïìä‰Å¶AM”]YR‚Y]il‡Ç7³Û²@!¡ÊÌôéäƒÂBuL@ >,ôpe™¡¤DÙÄÕo`1×]œ]ºÚt/Êã°ƒví÷Pç¦ k£iIHã5}ùI‰–¹’Mj»"ºØï÷viïÖ¾,%Õ$1§eÛ¶øZö;Â<³+dÇ£'.¨k[³š–xÕò÷qEÈ='ýÜ–.)Ÿ-Ö¾|#ä¼ý¯/”~{©nÿåL/*%yºB^…¼–j¹þëñÙmóeªÛø=dgÝ"†ñ÷[Ò爷Γ¾¶oï¹áwQ–„ÀÓèlÓMˆ;ž”à8Ø?ù.—üÍ^­”D§øØãݬ¾þLBîßQ¥f޾âVS¹òÍeH›ù¹QWÜK ¼z£+¬ý1ø ü t…Ó ,qj*Œ¢£Ü²3lßW6…¦zƒØhWJªÝ ]yU~1ù—¿ðœg|àáxæÞW¢Ú ‹FÓÒúÝ]£†oªým‡_†Ô¸ ËÎ<ü’šl²þë\‡7ç\vî,;bãZZô7~©<·»Ž©~Ðá—Nï7tƒÿBeKiPZ­XzÔÎþï9ü’iÌ=È»£*røeë¡f¦¤©jÀV,q9îø÷~PçvWHxø%?×XD¤ê?ç\ÐëD+¯†º=Ûញç¿@å ÁŽ‹V@s1ÑÖÝ:¡° ú(‡_@šj*÷ÖTBŸ”g”ëk «ÊöÞcMþDBv¾ShkÙS^btó†æëñ7ƒ ÙÝ®]VlÔÓ©=©+¯_É÷÷hBÍŽVÝñçŠK*p“ò’ý-zœßÎ8¬`¢RY¶¯¡Î`ì±Êäá^T§¡“Ó,* ?™·$?¤áÿÆ ?!¯{wý„¸¾wÃÿÿ÷éŠS¬®™FIEND®B`‚golly-3.3-src/gui-ios/Golly/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png0000644000175000017500000005276213171233731023773 00000000000000‰PNG  IHDR§§ûtÛ»!tEXtSoftwareGraphicConverter (Intel)w‡úUŒIDATxœì]T{ûžÙ]B@%DLìŽk\;énDºEZ@1I“°Pºaé )énA Ì{¿ïþ¿™Ù]—î‡÷ã»xÎ{æ ³Ï¾<¿÷™~gž…þõå%þý•Ì Æü<&~š€ èWEfà©>ÇøKõ™8Fˆzéÿý!0fŒ™b<ð˜øiþ5F,~©>ÇøKõ™8Æ_ªÏÄ1þR}&Žñ—ê3qŒ¿TŸ‰cü¥úL㯻43qŒQõ??ó¿én¬“¬©ïëýúQð»x~è}-ZS)ÑT/ñv@ø__¾;Ho…Ú[$ªËÅ;ÛÄ?¾ú~Eþü,È4ÔJÖVŠ÷w‹üñIðûùòA°%Ó\/ñnDfüò ¿joFÉ´‹}z/4µB2Ýb5âÍ $2ßÍŒid*Ä_£d@mÿÕÿøÄ_Z,c{á´¹Éc‡+Ä«Nqæfö‰qÊŸ‡Ç¨Ð/*BÅÂìòË@Gç8ûËD£S.Û›U—ËŒUnþׯÄî¸ë›ݶ»áägcadxó¡—v·ØèòýñI ¤Pöâ9K “'s³€Óæ¶) Ç¿|]P²ˆPU Ó+g­‚œ\âì/ :\6©­’ëñ蕬sî7 LîØ]DÈœ=ndxýÉC­Á^Ñÿ\õá7¡Ájæ&Wm¬ƒ;{@ÆÛÑÁ¸¾FІ ¦7Ø n\343ºko ðg΄^{úXs°WäçªþyXÀÓCKT$èÑ£We•ƒuõêëßUW¿&¾VK9kyz°OˆßõJÄ蔚JfBb_uí›z_VöæîÝFAÿ@? õþãy¦¬”ämÛ‹U/ŠkëÞÕ׿ÓœÜs³bE9·ÊR j¶ŸÞ ܽ£#.âãÓQVõLdÔk9™¤ gÍÞô Rã;ÛDOœ×PÏJJéGÈ4|¨«WZúÆÝ½^DÐ74èX¡©Éd¤ÉKHÜ»|©¦ y‘É~Þol\¨¬à¶ÎÿDõö1]][m­ç)iýÕu€Ì0 óòåÐõëu"‚>‘aǩɀÍ#%IA\ÜãªCm! SO"“•Ýgx²@Eɱ¾Zt"LþŠê€Çý»[7GÛ_®&vcÛˆÄNbÌ+4:ïy¶ïÙ™uRÏâýi#ìV=qöÐÜÇ>mÄØv¾…N£ˆ–VuÛ6…û==NY¯ òdvïòPW/D“Ç’Ç;ƒB;¤%J޼Y[Eªõ×O·nhmÛsű!:†–Ì{m»·g˜œ2~Cìù+ž?r8ïɳv™˜odÌÌk·m P¢É͖ݵÃ[K»b4™€à Ñbþ#×kÅþšêàø"/{‘ÿè‹§~™Žod¢;k~Ûª@&ß•.¿sû#=½Êˆ(Z2þAbBEBÇœ[DŠêÅR«W?ذ1û’}͵kÕ#£ÊÅ¥vÿþK—†{{h¢€±›³Îâ%1‚‚ù×ÜjiðׯUÙØÔ¬Y›µiãýšJiüÍ€ˆ°_ÆÉ“e× õ¿¨K”•Ë–ñ¥¨(Û ³cù92+W=Ú´ùù•K´ÉÞÙ¹vïÞü¥KÃ|i`®Ãe½ÅKâ„E^ djhÈX[׬^“µuˆId}íâç¿ÌÇ—idT~Ó’QT,]º,ISý̧÷‚“U±»h°xI¼¸xÁ(2 y•¥eõªÕ™Û·Ýji@×WáÇ®._žijZqýMå2rr/—.KÔ×µ§S¬:Øž4œËÎÃMT>ž£«›§«—‡LuóAèèækhå/_ÏÆ½{×å¡>‘®W¢68²²7®×ÑFÁßð/tôr¥es99‰¬l¡lôÁ,2L‘ã1;;Q?CW7—:9ÀkëåîÞ“ÆÆNäæòÎÉ’d´µŒÞÄʹ£É¨kåñ-‹cc‹>°×œ<¾j]»ÆÙ´1AG‡B&ŸBFR:gÞ¼hVÖ+öº`•=‡;QX0sL2»v¥2< <Áþi²ª·6‰­\éÆÊ³us¢îXd$$12A.ŽÈöóÌG™ýQT$SW/wäH2Ûw¤2 yî—IOTuê¥ß¹Îëï]·æ2çÇùññEØŸrpòÁ¤8p uýÆ8::÷Œ…ùNVºR<µoº©ãàg(>”ž>„s^$7 ÏÍ1wvFñp 'çÍÚJÙÃl`(‚‚a8Œ…9”{>ƒ¯ øùó"g1†ÁPø×/)qöe¡4뜻<>”•– O!óäÙMgMì‹‘a ™?/ê™ùsX¾‘áæ¾Q_#³÷÷ 0š|€çFÈ02PÈ(È[ÿùYpRª_º¨ Ã~ÈH¡0úP2³YÂa„L ³p¡[cÌÎßì(df³Ð‰`d@ÁP0 £ªb‰‘™2Õ+JÅXç܇ Šƒ xJÄÁ±88ǃ€¡xt9ø, ½îvÊÕI‡Ô=[C (8ÁC 8–u®GIáñý{lÈIâ@rŽCñqääØ4†c±{‘#3‡ÅëGdâQ2Á÷n^±WÃA‘èœB†”üŽå`¿WZ¬´kÇʱÈġӎºøõ£È¤T¿`£ CQ؈ä´dâHEƒcçsÞ®(UܶÙå?’ íHiÉ |žJÕ;ÚÄòÞƒ lÊhd¡eÃP6ØèŸùhø?S!ࢩ`Ùhd¢àLl Œ.äåuom’‘•9ûˆ&y&9y ¥*)Z57HqsyR‘É&Ï#“Ȫ?~¨†ÇÅŒSÈPðÈtñ’¯Z¥ÅEÏÁd’ß#§¨©þ×—Émë÷4ð¸Ø‘LhÈdad–/wël—ä¿ø]2$< 'éêšcd¦Lup¥.*z‚ò ¨‚ŠÈÓb*A£ d9ûÃ’BÅÚ* NN*@—މ‡‘…¹‡Ù}x'zû–&—L…#9Àãñq×Üô?¾äç·‡ |6äŸÎ›çU^*_Q*ÉÎþldò¢‘`A‹ß‹\sÕÆáR¿O|ŠÇÇܹ­;ÙãzI¡+«ÿF >Í;÷yXøê=.}|<6–!ÊÛSgŠë ý4g1€=R UCÈ´vTÔààêî}¼¹^Šoé#€Á•ceF2ÀPùÂ…÷ª+äþécmFúä‘É‘–>ÿñ½ðçaA9;ü’LfŒ@É„?ðBT¬¯‘^¼ÈçGdÊ–.¹]_#7YÕÁ•§”Äe\:>¼ °Ÿ>AT¬®áåñEÉŒ‰¯Añ¥ËùÜ›ëe¦^õ÷o„/p¥®†ÚpP;zfÐhG—Ôqqy§&«bøŠR™ËÂp=·`x F·áq…]êy-‰^Tðß¿«Í2+Â5Aè§Txì¿´00í쌱Ûìï…e¤m ¸r*2í#ÈÀµ x<²2TH[X‘ì²¥O`¸‚[Ç!óâ¿]Ä¿‘ûüî7õ˜ÓÉd°‘Rð C #cäÕ«§(÷ü'®:ˆ‚|¹Å‹žÁ8 êä`ÚŠÇå ‹\ìGɸº01dŽ$ÓFE¦yÖ¬p77C€œzÕAt¶‰HI8ÐÓ½„ ^$`0íC£7rq?|ðàä×O”»ñü©‰ «V‚K @·ŸŒïGñÝ|ᎎ%Å*TÀ•K†¬sRaè5‚!%ï‡à>ê`š£¯o5Ø'IÁ··ˆŠ‰8ÑÓ•’ÉôP‘©_Àãíã£ÿ™„XÅ|~8\óh2tø»÷8”—ž $ÿøNÐö¼ñÜÙé0Ô…’é¡"óŠ™)ÚÈÈr¨_b"Õ­:X«b"/[ˆƒ[Id J%»èyû\®ªq'§:¨Ý`Ÿ¨«ÓÉ5«Íb,ÆÃMx¨•€«bÃ/`Ÿ”¨Ö}|u…¬¦ú9.®zB jÆC-ô„b^ƒ“– `÷8¢"ฮvðÀõ9³3ð¸F$9\Ïƽqã;w ß ‰„ÔÉzįœZµò #C nFðøJ¶¹D!a»´Tµ?>Hð•¥rj'.Ì猢#Ô’É-â}ldlÙÒ$K#¢¾oï PnŒ ™•¹yó5ûï߈Òà'®:JF ¬X^Yé"'g4¡%ÓÌ@W¸xÑC33‹¶êä Ãça¡àÝ»ÝYX²É•©cž•±u««··þð[‘MFÇ¿Öiåïî‰Qq¿yÊñê)/ýüœãï‡Ä(Òà¿|¨«– ôÓrq6rq2 ðׇïÇkY‚C‰Pn¶¢·§¾ãU£›7N%ĪõtJbg§£Û |Ý¢±Ñªî7#ð­yJ@@f,ð±¯k*¥|µçSZ µ™1Á É»!¡œ,E/Üý¦ab¼jo—äú¡?,à1ÊŠUU.í÷LÛÙÉÈÕùTp VS,`8Nfp\ËÎPò¼oàè`tËÝ09‘øsT³õ‡4þŠê`ÕûZ$3UáécMo/8¢rK£$õŽVõMu1QÊ<5ž>ÑÈJWèoùÚ-) P󺯤ZV"Ki±©zO§hFŠ‚Ï#Í^ñ1ÊmM™ñTo¬•ˆ‰<áí©®0Ÿg( öŠŒ·Š€$Šòe‚üQ2Áªå/e±ûT©^_-‘QÏÉTêÝ2§äªæÉú©{y¨‡…¨V–ÊP7~¢êCýÂwnh¨?¼å^ßœ˜ÒúàA¥ž^ˆÍËÖFÉQxþÚj©Óæ6FF‘O}*“SÛˆ±Í®.jª÷zê‚Ò$ëG|Ì Mu7{»Œððú”ô¶ àzkë]í+ÙéÇÁÙ Íð€`î7Njj<¾}«8>¡ñöªÐÕ ºhsº½YrT9ÀáFÚÜôœ‰qô³§UÉimÑ1ÍÎN/ÔTî>y¨ V5üç1Q*ê×/]ÊŠˆhdë,-“ôt.åf)ì„NZu@¦¢LÆÔø‚©)ÑÏ·‰"69^ÍWS½ýì‰68ÓdþüA02LMCýæ•ËÙ‘‘ ïPga‘` kŸŸ£0V?~êTïz%¢¡~áøñÜ„„ÁÂ’Þââ¡â’ÙÏÌÍkD…n–HRã3Ódó´½X—“;TTÒGÂD{¥$²M Oö~Þ§ak®ºÇŽE?}ÚUPÔ_T2XŒÄ@Aá໯Ž òy¤B]ëŽ6U[•¼¤¤Á"*2YY&ÆUâ"×ÊJ¨ûñü©IrGz_ºTŸ›ðýÅ%¾¨x "²WB,ÃÂÄœºN-õbüüºG)¸éÞ~ø@€ÿSeá'®:)!Náè‘GWsó‡¨É„…÷ˆŠ¤YŸ6y;ðm§–W.Œ è)(þFæEÁÀµëm‡ø€µð稶m-«-›3œ]ýšüAøƒ5®VO¯æƒ{KpmiÄöQUåR¿ïº-(Pôèq nñ÷oEÀÈ´ù¢mæu™æ¦ÆXç⡷ƺµá'OVûù7Hîßæë׬¬Tµq]PTøq,98ܪ«žÝ¶%ËÕ­4S“¹ïÙ¼wñÑÃNíÍ$áËJdvî¸',\üøÉdlÎ5l\›nmi®ì12÷´Ö­22ƒÌ3ßfE¹ÊMëýãˆJÔ{ã «Î_\ »ý71±’'OQ2­hÈœ9S¿amêùsXçìánÝÔY·–hfV3šÌSßf9éÊÍž%'(RÈL¥ê¡ÁJ< V¯I?cUng¢Ìή"3.Tìú=›—7ÎÒÜûjm-3ބÇŸÛÛRð”(51©X¾"eÉb¿ä@·µItÓ¦‹§ijÛ#€rêäv¶e2²E 'ïÛãÜßùüŸ)óð­]›qÖºbL2ÛwdñòÆž;s HøyX@Må4oâÑ£9ö¶£É•ó­HYºäYFªicèúõŽV‰½]ùh2’R…€Ì¡Žƒ½Â“UýÓ° ’¢ÏÂ$Ü1+chX¾ly ßÒ'¹Yà²âXm•øÚµw/IÓÓ›Œ˜xÁÂEIüG®¼éš¨êÔK¿{GVPRâô,æP¶¹¡B‚iJJYäÈ¡¨ô\R&‹‹+œ‰%dŸK{‹xm•/ïu&–ðÅ‹"ädG€•”ž+(e:’6{v(s šŠ8ùº{[•‰ù)3sØößâið9òJYk×Å2³„Ιý04Hùã{Aa!+&@†5TX(}4 é¬ùœ™Õ+:ÛÅ*J%,¸ È,])'7™‡RYX2:ZÆ|¸á¦ÎÄì˶sG¨ä9rŠY«WÇ2sçxGG(ý°z4Wn/‹¤æsÝbbç[)/?™}RXXB˜˜N€UVÀÉA“‰Å…%ì÷ßÉÈdV®$2¬s¼b¨#î¾´J,âu…`_òggݼ1~Û–øß¶"±mkü–-‰ x"ppù2Ð{EGªø?S#à€?ñ8ÿ%K¢xÛ–~KüÆ ³g#­UØwÅ ç® y+éÌú12®[‹‚)ø„+béè`ȆŸêë›ƒÓÆ\nް-›¨’2›¹2ôŒÁ3!Nùñ <þ!HŽÇû/EÉP%ß°>…%†@µk{_‹Kˆž‘άÿ¬YAëG‘Y¾<†@&cbl:YÕ=îjâñ02Ë–iȬ_ŸÀL&³i£C_·¸¿ F†‰)hýº82||1FÆÇÚÊxŠU¯x)Æ6÷.Ú´Ž€¡ºˆÙ,‘sg‡Ï™ f"é#ÁBŠFºï8¿Ûîh§5ÅGâà&ÆH€Äð,Ìôx€„ (ac»]V¢ˆvZ‘äOÀG°0EðÜÙ¾‹‡#P|8À \(È•žÃrŸL&r2Q(™gÞzWìÕqH‹šB&ê¦:<‡Ì›ç^Y¦ð;Òi%%A†…–Œ„ø9¬¹9qÕÑNk0–œŠL™LJ&$çæºQ]!÷Û;­9ÀƒOY˜iÉ `¤,/w»9eªWWˆ³³z@P %AP2¥‚)ÚN"/Á¦‰88üÖMÃ×ÔpHݱOS°/Rá“Я|2;›GYÉñCÎÁ¤$IääI#ó#ÉÁAÛ¢²sg{OŒL¨ç}§«@u"yyêXd’ÐùdÎyw+Ë”öþ~¦MNK!'Hˆ]˜¬êö¶Z0C…LÒh2Ü\·«+wüf’II&i$™@F^öÜ÷×zDÖ¬º AÏ!(‚rÑ)63"`(—!("\%.F‰>Å ¦+V¸uwJèê˜Ãp:ÿ|<<NÑÓ5ëé[Îw‡*íØ`ŒŒþq1'"ÃÓÓEM€LΚ5.`§ª¦j Ã(,o|2988ÙÈÈd²{ø €t„hròñÈ Ë7ntèWR‡›Ìññ9d2‰§OMñœ ë鞆á|zIŽÒQ–,Zt·¹A¦«CtåŠûdؘàRz ÃÏ•Ï|ý(ªÌ@O•gl<=}„¿¯ÆŸÔÕ¬aèÅwÀèòâeËnµ·H¿j]¶Ôkd²ÕÕ¬¾~ ôW¡§Kü>°œ!,,X}²ª·6‰-Zôð»d^¢d²tu,Ày®Ï5:ºäñÉä`d &FªN±ê ò¸æûáà:®… xT@PŸdjÎÉ…þüÂõŠ!=! ŒF5ëÜÇ qj ùPŸè¡ƒNx¸‚k ¨q¬äõ0\´cû¬3›“¥8#‡´qëÆ%CH°¶2…CF6¦#äŒÇ*6¶©É*èŽMtïW<\õ]2»w_êë–˜¬êà´ü¬µ)>%3^ò*¯¬ ¤Ø×%¶sûu<\=&Fñ/°ìŸzÕÁvÝMŸ…)·ÂPꀡ×0Ô “f^áq/wìtiª—Çðý=¢b—ør÷ Åw¢0Ò·pP}¢±‰õÇ÷¤çÎr²–-~ ã!¸c$¾ ùn˜?ÿqD¸ÖŒdœO2ÏJ‡ðmã)޽ǩµ‰ôÔCo—˜° _1F†¸Ó––Ÿ‡IéÌ4ÅÅ ý`|™ÌˆäH'—ûA Q‹¦36ÕAtwˆ;â„ǃU|40m›Åcccñù©û’tœwA B“L/¯Wb‚&…ÌTªâÓ°À­† ¸¢`¸‚€† h†_ÓÓe<ˆ?>óÈœ^»Æ—-‘uv ×ü𽻯_¿fÐÝ)INÿðV(,XE\ìÊâ…‘¬s’Yç$-Yä/#}1*RÛÊiîVv¶‰;;ü¾óÞ|θ¹³S8Øbׯ}Že/•þüBÛ_[|a¾¬¾žÕšÕþì¬$2û÷^sw×ïé’ݼ~# **ruÑÂ(@†mNÒÒÅþò²bˆŸÞ Ó€ÑEüê•“;·ßçäŒGÉÄlXïmanZY®8º4^õF‘~?$à«&,ä¸7!37qé?E…sñqꟆ…Ge+Êe{Ãí¿yr΋#å`'nÚàiiiR]©@Cæ‡4þú›ÌààW[%WV"×T/û~H”zÿòAðu»xòà¢|g»ÔçÂ?ªˆHKƒ4H^S)?Ð#Nyæ|L0s7‰Lsƒ,Ö\Œá? u¶KPÈ|AÉŒþ7Òßç§™*ypR‘­UÿøNÐÛKW^Ö×Ó»¾¤t ¡q¸¦ömBBçIƒÝKµ4™;ÚÄ,Ìm´µ’¢c^UU¿mh|_V>ôħAA.ðº‹Ñû¡¿e?}„ü_TýÓ°à%;ƒýû<êHÏèNÏѦÝqñ½jª¥BÇ®UWP^“FÎC¥% ‰1½é™¯Ó3{ѯ|oבƒ©æ&¦ÔÂÿR}ªÎï﫺bE˜¤dñýûž^õžž ”ðò¬;kS¿nís) [ôiªcŸÞ jiZ¯Z•faQíéY?æëä+W® ÞpÓ£ã¬:õÒ ^x|<&~š€§Ãz…wï¾ÌÉ•°oo†…y‘…E±…EÅæH¨¨ñðÆsÍ ðUøÔdYÞG $*+å“‘…è·¼™Eáá#Ùó¹ã7¬»ÙÞ,6Á1þRýïcJ¢<ËìûttAìAÇŽ¥‹Š¤‰Š‚))„E2Ö®#ÒÓÐÑûJKžgøÆ§ À<=]ÐÊ•‘"Âß DD2øÒçs…ÐÓû3Ð{?y¨öKõiªº‹£ö fc [¾Œ¸jE̪ÄU+£W.æYE !­XØ9Ÿ ¸¨Û·û" ûCP ž̳ b%ߊßeg y ´¯¯gŽÝ•ú¥ú´SýüY ´yO„¡x\ =]$=]4=‘€'¢a4àÈùœ·*JÐ7™’„§#Ix‘€ 8íÇGHKžŸâNë´òNuWg- Aéh`/$§£s,Ò@ÀÈ4}á›MõòûöÕÓGáS¨ðé0” ÃI*ÊÖ~žÒ§*¦­ÿsª§&ÉÏšF~'<ä—½ Ðx£­ô½{/½#bbl‚6ûóÐòPpþy8\¬ãÕ“ã/Õÿî1öŠü¶í U@P9UŽàS<>ñÊåSà8–¬4›%†ª xL|Š/gg\˜?ÕOKN[!ÿçTá÷L}6s<úZu3 hA›i†À \ºvKS½ì¿Ñ÷ÝUUÎp/!\=DB~ÃCP 5áñ©ÚÚ§? ÿàY®_ªÿ7Ç„¼pî3S wBP7ú²t7=Ô…ôËy¼ÂÃôþ$»í¶5‹=ì‚'Tb0j< ½&àóthjP˜øÝ›ûïŒïyïä >_¡†ûpP?ÀÁ¯Òwît‰W£î©üq0Ð=ÏÆ–€ÃµÀðÄA}8\ãܹ¡'TÎ65ÈNä-œ_wdÿûcü×°ß¿«­¬äpèà#‡¯©«_ð{ªÕÝIûd–äËÁÂ|™‹çÍÅÅ\î¿!$è|ÚÂ*-Eyy}’cü‹ªÿñ‰ W¤¦R²â¥Dw‡( ô}üçaÁׯÄÊ_JÔVIöýÐ)|F¨ŽÅ§÷‚­@Ί2YÔŠú{ýrðé»A¡úé‚<é¦zéoG? òsTG_‘³9cmaúÌÉ)ÞÅ-Éòt¨‰Ñbä‰1½Óß¿ R35v´±u½–äp5ÁèÔÓ‹çO——Èb>*3VõwƒÂþ¾&FÎçφ»]Oº|%ÞÈðñ%[³š ZÛrLï–FIg'#ÓSžW.Ǹ]O>w.ÚÐÀý§v7­mù«VÌ;·uÄDC}|:Ë*kë†ëêsîØ¸n%…ôÓfV=#^IïhÕ×?¯©žœÒ_U;T‡âËÊÞxx6 ={¢úuÔ3Cuþ–F1MM{=ݼ´ŒêÚ7uõHeÛò[ ¾¡#^“§u qŠb¢Þ.Î E%ˆmy]ÝûšÚ·ÏŸ÷›)É»ÔTLȽú¯¨¶ò[îZ[7/]iˆŠîˆŽi‹ŽîŒ&¾B£ó¾gûÞ]ÙºZ–è øþÄœûðÁ¼ÇOÛ¢cÚø:_·²®ß¶1òÉ££íøÿñªƒc¢´¤½À±‚gþíH‰h •‰Œê05ElËCÉÖ#à’]aû¶'úúUáQhÙ‰¤²£Q§p‘bþ#nubã$®Ü ó¤W®z¸ac¶½]›[5Uäi•³sÍ>Ä)<òþÌ)Üéªî¢Å±‚ùn®µ4øknUgÏ"Ná7xT•IÓûg_¹ãÚy›“‹—$ˆ‹ŒY™Ó§§ðm[n7Õ!Ïìöu 8à¸|y¦‰IÅ5˜•`‰¬ÜË¥K“´5­ÁÉÓÇ8QÕÁ†®¯wjâÓ}\1GG'WG'|Ú:ùjšy||q¬lÑ»v\ìyÝ.ºn#+qýºx-­\¯KÁ¿ÐÒÍ•’Áü°Cm¬ ¨Oîþñª·4ˆ/_q Tfó¦m-´Œ#+#&ñœƒ#Š•5ÈÑÙ~|)³²û²³G eŽ*û Mœß~Keç]p¿¤@zŠUïï[³ê Œšsƒ zÿ¾ä ö“bÿþÔuëINáÌLw3ÒŽÇEgd@œÂèý¶lI ƒù½ûRyxÃq8Îwë–KoDgŽêA~*ôô^0ìÏÈè¿m["Z™JeöìMåâE+ólßž‹ïEåQ§pØÞ¼½{hÊžòÛö$&fÔ)÷ÈÉQŠU¯.—`gŜ§PÖ9áÜó£p!ÎÜÜ\쬘9wàpO½=µo Ná˜9w=]È<öHn®HÁʼn¼oLåîÞÒ(ý³k=}T·GœÂý1§pzúPNŽ(êʰ0cNáHexy¯5ÔÊìÜf‡¾ùL²-çâeGñ\œ ôa§p•?Á)œmŽ•9wjYK¶¬N@ýªINá7HNáÙAñºFÀÔæÜXıÎõ¨®PúÙµž>ªSœÂÑH·2pÉ)y="9…ƒ²Çt ÿ‰Náíâ‹Ò8…có™Ð7k’S¸ïS?>j,sîL*³m0}¾×½£Ujæ¨îys ÏåžIíü9…¿~%%$ˆ9…SÜÐÇÆÃp’žžv†4eª§q /Ó)œãÁËb…ºj ®ùOFù[á~ôˆí‡w"3GõÒb)66?´2%ßñDÛƒ¤âî䨋:…’+Y<–Sx!õÐ[{‚cœÄ•[Hc<Ùœ{l‹kœ VŽï§p µóx¸øGæÜž÷õþ†ZOÕ? ÊÊØ“ÂëÆs ŸÅì÷ Q±¶Jfѧd§ðÑx’SøÊ7Z‚Søð[!•çÐFïh§ðW¨9wÝ‚ži¤wç«*¤W¯ôF_1mÎÝŽšs=fß×-ù7Ôzú¨¢¸PvÙâÞ6ŽSxޏą¡~’SøëãÙ–¿ÂœÂ™˜BÝožœ„Sødî[ñwuˆÈË^f /"9[3ÛaÎMÁg¦É­[ókÓœ{Ï^‡òRåï¿Ì7“ÿí{s˜mùÊå~8¸™Ê)¼Ÿìžsäˆ}]Í7 CĶü‚ñÜÙihg½¤‡zÛl–Pë3æï†Ä'>ÆIw_Þ ˆ¸_×ß°Á‹iVnÀCÍtørvÖ(QQÛô4µQï{ò×WKëëZóð„ÐÓUâ¡F t‹=45µhm–Ó¶w¨B ªLNSý7W8=¡© ÜÀ@—Ï·ÌËÚÚ¬£]š¦_þåƒPd˜ÚÁ׿ÌNÇãêñP®faNݹÓÉÇG÷ûÑo>O©ê˜–}]©IÊž÷ n\;éóX·¸@ñÃ[Ññl ¿~hª—U¿uÓìˆÂC5šdÇw ŸªcË¿~¬¯‘ Öp¿axëæÉȶ&™ñÂõ¹ O邲{zèg¦èŸøÎò?RýÏÏü]¯D’ãxjß»£¦ÒP+EýcÜ4øÏêª$#BTø—VJ¢RïkQÊ]Ø™¬úçaÁêr©° UP™G´ÒSû{¾çþ¦_87KîéÍ»·5ýÔ_É~x÷·8…ôŠÜp3ÔP÷¹wïerr[ZÆ+Ÿƒ+‹3uR£ðüUåÒ¦FLLbükÒ3;’ÚnÜ(QSõ¾ÇàÝàØv3Au°Ò¿,–;uÒÎÂ">(¨.#«#.¡Õ͵PUåþ#oZÛrlý ÔPS½ãä”Ûœ‘õ*$´ÑÊ*EGëÊó ¥ŸëÞÙ&¢rÂö„J~bÒPAqoQÑPQ1âoý|ÀÒ²V˜ÿvA®yöûèo{ûúœÜ¡Ââ>¾h€Ó'#•sRϪ¿gŒaøÇ«ŽüîK”âáÃ>NÎM¹ùƒ…ÅýEŃ 2…E½â¢æ#mË?¼gs§„„ƒ‚z Šú Q0ˆ/PÛòý´¶åS©úû!!uµ³[6g:»4úú5ùù7ùùµúù· ÑêáÕ|p_É}×Áí£*^JïÜqOP°øáchôók!á‘i³-âže|Êt´!Ì?]uþ‚<¹m[½ÅÅ^>öiAÊèߊ©2gÎ6lX›~ÆÊð3Ù)üº›Þº5±fæ5¾~ÍhÙÛHe÷kõyÖ$'S¹i½_|Ì·sþ«N½ôû×yAÇyxW¯N·¶,·½Xfk ¢–]´-=¾bç®lÞ83cSÌ)\CÝ|oâ¡CÏí.–“Á$¼íÅRccÄœ{ñ"ŠÓñiü3®×?½”—³æáMàÏE+SNS™“'Ë–ò%/]ò4;y¾ºB|õ껋—¤éê”ØÙÒ–!&ö‚wQÒ‘CC}Sý<<8®ˆ‹YÎba*ÀŸª¨¥¨ˆE6Ôœ{~8sßR×¶f‰š IžLÌa‹†ËÈPÀ(^á¹¼"Ùœ›)ðÄqsj׬¼êÅRœóo31£¶å²#ʈUfϾdÄ)œ)À@Ïl?—µ˜˜ý˜™ÃvíLPUvY…¬å+ˆ ìsg{ŧúÝ—W-’ yHNáll¡›6ÄmÝúÇoÝ¿yS77fÎíKOï¡êçCr Çáü-ŠÚ²9~ëæ~3⇚sB°ßòå.½]b3Gõû·µð8Ì)<`É’h´Œß*³nm<s V™ ®övI³¡Ø–ƒý<¥Œ @U—-%âINáO-Oÿ,§ðÌâšž.’…9rKølÄù›‘. 5ÏŽF»ï~·oÒ:…ÏbˆH ÏL2çþæ^W­ð³k=}T§r B*Ã…Vyæ€yÖˆÊpqݬ.—GßdFjð<¨^(#†UÅÁ˜'zÀËÉþ§pÄ)<•lM}3ö¦8y#K§pwÛ×1§ðd²Sx*˜„§8…×U+þìZOÕ/ÙÑ8…ÓTóP'9…×T*îDœÂSÉø4²?: >‘äþyjÂ{EÖ®¹9–9wõ ê¡ÎѧðÑþÖyäiæ¾r¥[o—øÏ®õôQ=$èÝh§ð<ªJ’œÂ7mrìSV²éN]CjÛò+«Ÿà~ÒÀu §ñ«.CƒògÉ’%wZ¥»;EW¯º7–ö7< ~~BÙšÚö¯z[³Ø’ÅF~S—s Ï4ÐGœÂ}ŸªÒs 'Uõc‰?Á)¼è…ü®g¨S8fÎÝ3®nÄ\« „ÄÓ¦€+¸vtq:É@—IåNÁSfªÙX&%¨þ µž>ªƒÓò çŒé¹TNáÔ•i@ÊWrrzäd#TýÝb»wCÂ1üˆ²ChÙqpþáöC}v ŸøŒ?> Üv×Íœá[¡æÜÔæÜ-MrØí‚Á^QäDzñ¥#͹;©Ì¹ã-N[~žèËyÿþ§Ü¥é}Ø–ð#=Ñ)~á­L³¢/Úšù€Ý¸äÏHS"Ù–£Õå^»h‘GjŠÆOù=·!/) xÜ5XÈÃ-˜97âo aæÜGùí+Ê©›§Ý¢Zv,LÙüšbÎ #NᬬÁ˜9÷Ì쯿jWVt@<Ôá.*§ð>\ÏÁáÑÖýj ^ 5Iy릇x\ •m9âNÀ­]wƒHTG÷¯?áŽ,à_^"mnj¶iÃNŽXvÖžÁ‡¸Þ¹£×Û5ºûrìã;!bäq9Y;¾¥¡lñlq|Ëž))ž‹‹U[ù.äÿ¦êxøpX°Š¤Äå¥KÂÙYAebW,÷QU9“’¬úùm÷åßÈ«‰»8éïùý.7‘}nÂ|Έ߶Þ;þT}üÏí¾Pk?Ô'R]!_\(ßÚ$;üöNá_? vuH¼,V(+Qèî”üòñNá3Au,õW’/‹ÊKz^KŽù›àÔ©Þ¿n¬“-.¯«‘3 ö÷9…õ GG(_ºpÖÚÊÅÒÊíì»'u^µˆÙ2ëGsƒÄC/sÖvVV®––.vÏÆÇ7$<ÃUåj¨•ôº§wÎú’••›¥¥ó%;ë”D%´Í:ƶûiX(;SÞÅÁüŒ•£¥•«•¥ƒûu£ŠR©Ÿî$ÌÏ•S>îvî\aVNO}ýpCãûâ¢Aw÷J©GÁþ_?Žx%ýÓ{G´å¤ŸyxÖ¿,hlúPWÿ.=½ÇÂ"[]Źü¥Ô””ïQõoïÝÕ—— xø¸©´|T¦¶î]Jr—‘QºŽ¦C]•$Mæ¶fq£ zº©q 5µï›†+*Þøù5+ʇ:;˜¼œÔ'÷´dFªìÞÝO[V'%÷¥et¦¥÷¦et#‘Ö{ízûž÷nkPV½/œt÷îŽ÷ðjOK°®´ôNOïNHìÕ׫<¼ÿnÑ Éx6÷é½àÅó†ö'?|ÜA*`©2qñ½êeüGnV”RB~ L\Ìéøñ"b (øë´ RÙÁöóÔ¯ëè¡4ã“æï's6G½ôû×yí-b{ö\߼幓Sƒ‡G‡G½‡G`¦þö톃JÖ®y–œ Œþþð+V Þ»×HÆS¾Rkk[¿a}î±£W{^‹Óûg_¯ƒÊ<}¢¶bEâŽT¦ž\ClZ{ölݺµÏÅEíÁ¥/À|'¨®vvÕªt ‹ê‘5Äðu ò+–Ǹ:éOâÉè Vpu¸¢ÍÁ¶tI¢^¡™Y¡™9ÅffE ŒLŠ7nLáœ')~îã{Á·B‡ÚrrÅïÚ‘ffZdf^„‚‹P|±©yºFïÂøùóC=îªÿ µž>ª÷÷ˆìÚu…“+aïž ó±*sB¥‡T&ÈÏù=·ä¹<¹$()æ›cH3 ¾ÈÔ¬àÐáìù\ñëÖ¸·6NµSø»Aá];/è¶mN!BaጽR˜™ ô~ì7K‹es³dçιC  dxøpªÈpºpÆú 1ˆ6ßÑÃ6ß ÿìZOÕ“âåYXîè‚ØÙ‚ŽI]™Õk£ééýéè|%őߗ;uò$ê¸|y¤P:MÙò§Íã ¡CœÂ<òVŸbÕj$çsÜ„ IJš!doä >âÊå ¢W,^º˜ÈÌ C!€'<ö}ªqÿŽ~þ„¡à9sB—-^ÁÀž/šgA4ê‡Áþ<<×;Ú$~v­§êÎWupðSÌ)|îÜ0¾¥D°¦TfwOª ß2—ö©½¿Û’œÂñ!Ü\Ë—Å`eÁ·4šs GúñzºæSüvcùKQÖ9÷QSjIJÇÒ¢é ‘ô"ˆƒcPëX´›tÃ픋£  ÅL¯1?l:B=!€Q?ì 8’uî½õ&3Ù)<uþŽE+Iª nDeF:…“ð z”²ƒï’£~ê›ê%¸8=P›ê4Ô©:“<ÿͯ <.ÜËS×ËC G£KÒPdæH?ìtÔß±¾žÏy·¹Anæ¨îæBãŽU2u¤ó7òÑ¢…7Aeöïªgñ™#ÅÓÈø4NR=a5ÅNáÃo÷쾊vs1gëüQ–Õ$×j–giÇ òdæÌ û[片‘…¹Û¶]}30ƒž JK‘cšJå>FÑÊäìßo?üFÄÌÔ˜ì>&þ›S¸³“ÁÇ8‰sxWç“\6ÙzL‹ëJ*Þþ›ó@øû!pï#=àñü°¸K±9c2£Üˆ†úDvn¿ù#§ðJ<>Áñª!ÚpSœ3;ê‡Náó8ü§ð×íâ;¶_ÇÁµ®úæoMm\ÝÀÄøÐ[µÅä‰Vf›‰úa7£—¯\y­¦Jþo¨õôQT&(@uKÙ)œ¶, ¶8øå† N-èû蟇…´4­ép%hÙG;…7#Ná„d}} €œ¨ê“º7—›-»zå#¾õ¨¦øUc–Õ¯f1Æž2:Cy¥öËÁ뮺sf'Ã¸Ž‘ø0ÅÁõÜÜõÿóŸ¹8xšÜ›û<,xÙî$ sÆXNáÝX¿<:J‡â2ØÑ&.ÈïH TŒãž{ôØå–&ùŸtGaPV"')æÈÌœC~;¼µ¬îÂãË.|pÅÁøí (5þË@_íëÐÑ•àà²v;}ÆŽ®11ê|žÄËyÿÕQá…?Ð[³ê PýäÊ´12¦ìÝ똒¬JãÞÝ!nzê,G ׄü`7C½8\[¦–uk3í›ÏS«:àÌ.5IÞÒÂZ\Ì™ÿ¨«‚ü%7—SUåò|óådþ®Ñg>êÚšv‚®‚.ÚÚçý}5»;¥Æûåä™ :ºP ³MìÑMMu{~W!Ag=]›@Þ.ÚÞ–äëGÒbi‡Ë&r2Ž ìâWÏÙX<ÏRúøîot ïíyY$—Ÿ#ÓÞ,I9¢ŒƒG~ý ½Y”ÿøi[± Eu`ÓȨŽ3gê·nˆ~à©B½·ÿ>Æ•Ûtã$T‡ð+mØ€8…»ºV»ºV¡ÍT:9ÕìÛŸ¿dIÔw]Ì)üÊ%½E‹ãò]]hñn.•gÎÔ¬^›¹~WÅK™iU‘i(äMu°¡ëhÍa çæŠRTx®­KŽ|ZÚùªy˖Ų²FíØæ0Ð#ÒÑ&ºf­Ó\¶èukâ45(à< ¯©“#!•ÃÁ=—5ÄúôÉuon:Œq¢ª÷u‰­^éãüð8¿%K"÷íIÞ·7yÿ>I öíM]³6–@ÀœÂ不‰<ÎÀà‰9…oÚ¿€÷’À`fÏžTîa˜Sø–Í—ßôÏ §ðé0Ɖª^Er FßU›;;œ‹3Š{~®ùlsG8…{yèÜpÅœÂ>ŒŽÊÁÉ5?ÃÏŸÁÂúaG@pà¼yîÍ 2Ó§"ÓPÈÿšêd§pjËjÌ)uÿæ‹8…_;åæLq Çü°É~Ø ¨vDŠç>Æ8QÕ_·‹-^xw¤Yõ¸Ná~¾êAþ*t$§ðì±ðTNá ov´Í §ðé0Ɖªþ僀”Ôy´Ë[DŽ1‹88”•(4ÔJps=F{À£ý°)Ná`a.ÿ1Û3É)|:ŒqWná¡j̳bäž#-uþã;á/´5mðpÑ÷ÂÂx!WzÓ§"ÓPÈ)ãÿÿÿì 4TïÿǛ͞d+J‘iß÷äû cìËØI![¥²„P©$Ù%T¶¬Ù÷T–,‘¤ì©hû.ýþçÿÜ{gÆÌäûÕï×9uÎs‡·Ç빟™;÷Þç>¯;ƒksßã í±˜jZSøK*Sxó¢Å¥ÅzÈäAs£²¸X ´Þý‚ìÃî¡5…?–ÆŸPü¡®[ý€—Ûf}Œ3»";Ð+««uŽ…©‚ÞŽÄ š FE¥6…——¨­_‚>Dc Gõá°åû%\´µ/ÿó1ÎxöetD6Ð×xÓFv¶rPiÌœ6æ)/O¢²ÊÙ²R½ *R­Ê'ŽY/ŠfÆÕaP- 13=Z&rËÖödÏ Õp‹ü€…üßW©åÈ li‘ÖУþ¾G££Œêk4¨Èèò}–êîPHOÑ 0 0MK5èîT¥˜´-òò‡¨úß_¤z^È¥§hø™Üô2‰6hjP™ÂþùƒtCrL¤·— ø“Ì4¾ùÙ2…ÿý‡tO—|Z’Ž¿¯ è?î¾AK#I[Îp‹|ù ó¬Få~Ä¡›ž&þÆYé:¯?ÿ!’-)Ð 6òºa|7ìÈ“‡Þá'ûºîN…ÔºÌM“øXƒÖ&ej‹Ý?ÉÔU«D‡C0AÆ9™Úƒ½rOþ‘÷fP”§r ‚¹wçpÅ#âÄeÏߥêCýw·ã‡ #ƒƒŸ½*){Õji‘zòøÙ–F• y©º§j–fçNÊŠk--ïÍ/èñõ­3Ðó¾aùnøßšÂzå._)®+G |å›´Œ!uÕG&‡íûd'Â}ã‰JW»QýÒáÕyy´0¥o¬­›ñ!m9场g7YSòÀ]·+å`˜*LJêŠR™¹‰ÝðÀøAßË8;YâñœûIåp®‚äÜ~þ¯$÷Çß4Ûš’ooQPU½blR_@ 3\\òÆÊê9AÚëi…¼þ$h8îáÑYþÀ S`’’•JŽ™[ Žï;ÁÚáÌ !7.nèIå5Œ·OÏ}1wCô¨afó|}t¯«ë¸qC‰ûÕöðˆŽˆÈŽˆˆ‘]P‹è‚Má5{v{µ>'½ãk«U·n ÄËT‡„‚L;È@ ƒ¿ê€Má¥f¦§è–6~cÕÁ~BSÃióÆÒk×aZÿÀÎ}»Ÿîß{½£•ô©ÊÇj›7OCÃÀ8žm[·ºäÄ1+ð–BªâyÝdµXÚñMF ɹ55×®ŽMŒ×E >ÔTÏmÙ\vÃé$åáÿâçß¹gGµ¤ÄÕ¤å|ʈ›6†((Ô„ÝažÉ0ö)¼ÈúÔ1ä¾4ð©á~ÅL\,ãÔ)Æ0Dµ†uâÑ©ÉÚ”WÕlV=*\G@ðþÊ•…6ÖuÎNuÎεÎÎ5ÎÎÐ7NNµŽŽõÛ¶— f·8ù×gé/¤õõN ,Ê–(u>[‡ÄàãTsìX½ˆhžPtFŠÖ?¨zXˆ®€`¬˜¤-'w>ãàP¿ek1€±>y”ðó˜´¦†-€ùM²ÌÅ©žÆ †±°€äÜK„"s³ £ms£‚˜˜PÁÃjg <ù§ZÅŠEB9{v¹÷CǰA‚ñââ…glÀØ;ÔoÜ\$(˜îpÆÀ|•QU±X”#uð¡‹SÝD3³:a‘Ü¥K‹ó¡…` uŠ+Vú -)06zêL çkåäž,Zœs`Ÿ8Ğ媃99‚- [Ü<θƒ¿ç‰Å%DÐJAS'–Ê+óñ%°²Ç /õèjWl¬WðdeKX,˜¨¢ Âãy"Èk”ìÝŸÇÁÇÊv_[sƦp°á¤žae‹0RRaä‹yy ˜åËÜ{^(ÔV+óóß0B‹UTJ 0-Ìî½¹ìì&ú>¤H¼êv˜•-‚-~ËæL"‘FòeªÄ’å+ 9÷\ŽÛ q:`÷+±ßÀpÍ‹—‘¦!Â0ùbnîx³j…8Œ­z¬ÂËç`–.y ªÊfçîvöXV¶¨£Fà%+ãzþ+{$€Ù¶•ŒŠzñ2ÑÃÉq+-Yk–«þ²Si‘Àµ9°²zWüZñŒë!³õ¦ 7d¬_—Å¿ E6…'%è‡ß9„Á„@¦pTÔâEÉÖ!ù (¿>cõêLvv’)|Ù²«ƒ½3[çÖÙª¼ÿÃ5?~ÝZ˜µY|ü$fæ[iº·ƒcÐ&ŽZ `27®Ï‡Ëdc#Á¬\éÞÿZQoȹ™YbV­L£tÚ†õ™Â©X’œ;ÜÒâ$øDãåñ;gNô|î˜õëÖfñò&@0¨æ ¼m?o’)‰^"”B#&– Þ Ìñ˃½ŠR¿9"0,,1b«haÖe.]:n ?}úÄ,WýY<'b ‡TÖLØ$v¶¤¹ì‰ìù›™ÖîíeN6…ÃyT s2HÎe‡´âl¬phr?ŸËw¦¦ðê NŽ@j*&,5LDP€éÅó‡Ð°œ^hM Ã’„%Á$^hñðŽmN(RçÉtk2èÉÃrî$ø¡Ê‰ ¯ öa± [bþ†êÉ“ÃÜ»j›ÂãÎ'À<À¢)¦ðøü^$SxÉN ÃÃŒ›ÂUfÙÞôLg>)&.䀸<L —îì=0¼dÝ.›3áJ&ƒÖÈËTZ¤ó’g$¸aP sPM“äÛШ'.ð3–—jòóFÃ0­“ä\tµ€a¤Ï»c–њ¿Çb çç÷ôœ‚|3(·wÏU ª‘a6…˜G:½–Ÿý+²}‘ð7âäÈ‚MáS5µ)¼jß>·î.5¤Š`Ûi°ØšÉLá¬,égÎXùðOžçÞaÞ^&sÙsç`ºÂ`1’¿]zÕ­Šäß T•mùD97€äÜNΧÉrîƒË‰¢"a(Lû¥O$ßG‘sçæäÜæš‡)[þä0¥¤]û^©¯jË)È]ÀbêšÂ 8Rvu=ùÉ)+UZ¬!¼ä3Þçk*˜¦¥Ký‹ }/Sø¥C‚M–.ŽE¡:æ †©Lá¯X˜óñ—ç _©–Ü öÌLœæ²‚jÜ>„BµrsG;8žx7¢@Wòo¿ÿåƒt¿™`< CÖ–ƒ¯¨æyE§–f"õ^¤ÿ•œña¶hÕ8 ÝÂËérîõìÁîáa‰æÎm°Å},çù~,¦rÍz9÷ç1i_oóE Ác'-ÌKV–leUÇöVuj˜Þ—ò‡ô/°³–¢ ‡ú[*Sx3_¸ëE˱wrÔíK µ¶mÂbhMáæÉºõ×33 ¾»)üù3¥3vÇ·l Y¸ ™;m‰P´ôÁ+Á·Œ‡•&æ?Édghéh;­\~ŸŸ'•Ÿ7eÕʰCúgòrô¿|ü·³/¦¡NÙÖÚjÓÆÐ…üL^úrhˆñÈý-:_áuz©ÚZ.+Dcø`±U¡‡ í óéåÜHx-çëm$)áµxÑ^î4ñÛ·ùžs±hk¡—sÃ0ÒõOUNŸ<¹qCØþ³tIéÃô/îÿ@ךð©I:DõsËEca˜äÕ«BŒØéýÁÈÞ×#ïåi"±ßÀ€ÎÆïÜîízÁ¼£Mý¿g ÿ†ÐòœX[­ÞóBž\ŸjqòŸŸe{êkˆ uÄ¡>Eê½ü›ª%/÷†ÐÜ`ˆ`—þiŒ0ÙÊx$ÿç'™^EΆ‡ú‘sÜÉÂÿfbd_t¨ÖT«··GGä¦^o Á šˆuO!˜ÏcŒ×SF`ú_+‚pã3âð€"ÕHŒ7€éjWÇX­ÄÑ·rÿ5S¸Ô›B|Œž³ƒ“í [/[›K·L»Ú'3…·6)úšÚÛ\²µõ²±ñ<ëà”ò@¼hf£êRÃrqÑúÎöÎv¶žÆÎæâí[&/;nkÓÒ¨ìïmÁؘNŽgÓ’uFG<ÿú+´£Âh¸¹ZÛÙx€Îm¬¯z\9U]¡6ñé0¶ôPŸ\L”“½ ÆÖ54q¨3˜kjPö½inosq>ëvE£oeÞ~Ãäj^>ocg{ †q¿ænUS©:q]ðôU§þé´Gü`«•–µ4¼\\ž>|4ØÚö±½c¬¦æ­Ÿ“ªÒ½ˆ»GuìQLÔU£CBö§Ö¶Ñ’’A[»r=íë5•*Ô{ˆi1þv¦Àhj½/\¨-2ØÃ<}úÖÛ繪RØýHÃ??Ñtûñ½ŒŸ©ºZLØÝκg#íLQñ õé2]úê[uaS³Â1 'Ó£…™9}MÍ£Ÿ¿‹ïÖÑJ9çd=2ˆ§ƒÉËÕ"ªù^ºTÿ¸b¨­‚©®ñôjPU ‰9D=úxòô¦§9Q=î^xW}ÃÛŽN’CÝʪÔPÿJc½òWšû†¥;ÛÍÍΙ›gçö5·Œut|hh|ûBK#ÉõôçÕqUyÙÄ];îØØ5åäæ¾Î/È/ìƒZþÀ ¯—»·¥Ü¼qÐ"yȹsÞtÏà—ùýPŒü53{ÐܬQbOàã‡4ë¾½ê&3]cçöp{Çæœ<:˜AkÝ»¶%ùûŒokXÎm¾oOnphO~+$Ádd š?“Üë_õD‰Ò?$ç–sÓÔ¬JN…;/$u^P0y¿_ú÷cÃ3#C#‹Tj’æÎí‘N.-¹Ô0}yyƒnî/vnM Ô§À€7ƒ½Ý1‰}ù¡w_‘˜)0™ƒG×ÿ.áS[=~媣U€¿ª£[šFÕwP²ÈÌĆºð³YuðÚß±ÃkÃÆ‡nnm-pk%·ooȾjUdVš.’Ö]/+[éç×F­ÙÙ2…K¸ÒÿꟘÂ;Z¶mõÙ´é¡»;˜›7Ûöí­[u/?GÉGÜ3M”“¯bãx¶U\ü¡ôÁËÈ<8 7þL±•Þ]mßü<·o¬úèˆìö­NXÜ}f¦è3ð2x|,ÜÀ72ø¢Ý{sÙØîcq‘Üó½ÀfY‘:'l ŸÇ-!‘O Cy™Bi|Ñjñ4S4ÈKJ8ÎÔþv˜°qÃ9fÓ¦L#K ³sO.+ÃÇsãY­jA.‘ƒÃÑ–80F¦h•X*…ÅEH<óiLöäq3.‡½/¼4QFº&/üí`!x}€<.Ä×ûÈðaíš  sæè-[had ˜»rXY¡‘.à¿Þܨ’•®Á΀ÅÞŸÏu_R²`"ÌŠU)Œ‚œ-807µÀ2A0ËDÈÈÐÁIþ^ÀËÃE2ánÎrÕ[Ÿ+ññÜ„Má1LLq‹“D…S—/ƒäÖ¢ËR–¥°±Æ¡ It4~×ÐßgÜ>wn¼ð’Qr^8E`A2 åQQž35…ƒƒn.o 3 Cé\$eÉâVL{ßÀóÚ4ê."çæ„`REEÒü2á”… ÆåÜBB×_´+Øw–"çæçK„dÞËHý‹,MášG‘sGéëY×V©rqúÂ0±°C=™Ò9€ZœÂÂ7†ÁbC’õ®\7…srÂ0ËÆað'cÈ0""ÝÊ{v¸ PÑÌ~°Uçq&PLáÆÆ§¿³)|N“‚Ã&“Íßéð¯H¦ð4¦p؇JƒÃàOÒ`69Jæš0Ó•ÌÕòœìAd˜ô 0iT0÷ý},\Ï a97&L€á™ïW[­µc«ŠFäÜ|*“†A‘:oH"àËŠT9Ø‚)a4*‹ &êö-3Øþ`ÜN‚I%ÃPLáÉü¼ÞÏjSx:Š&‰îüû˜Â;I¦ðbZeuµù‘XcЉÁAÆÁAS8C6ôCX€]¼€ß·«MmFUGO¼Ü·¾ ﮑ¯·!l°§„' rîbA›-ă¿9¡èÉ ièE°œ;WCãL}Úüy!äXCDõÅÄÆD¾îA1…M S$$äÙÕ®¾/Å> Ù®7ë¦ð÷2{÷\‚gsŸLg ¿W\¨]ùX…“3ŠÊoý˜*Lc ߺåÒûšÂGßâ·o»B SÁ†“3ìÑC­òRUŽ˜IdÛ40»v¹Ž¾%8Ø›£P…Sʼ!ý9éêjþî ~Ó&²}*.®ª ¢|u6¶¸)aH¦ðýû!SøéSÇàÉþÇӚ¯º³)ü›¯éHݸf†Å”Lg ¯õ”{‡ÿý7wØ>ixd Ïurþè?5…CÚr±•ÔÚrj˜—llI¶v6ß“æ+ÿø(}ÃÃdçdÚrh¾<9Ù„2yÕÿZNEé<W;•œ»"ç–*.T_.zî`ÓÍΞèxö4Eóûå£Ì•˦œsóaSøD˜çÂKý2Ò(0½=òò„‹XlÝ$0e2øó/»Ôgp~FWíÁðëÕˆ*®ùht7jά¬ÿøéÒ¥AW=,GßÒ›ÂboÚˆÃU¢Qýh(?ŒF½`aÎßµûJv–Á¿3…ƒ3 uÅKìhôK ê5S%"àée1öŽF¦ `b¢Œ6¬»…ÃUSð²äîÝç–Ÿ§O÷ÀÓ¡~9;ë… `Ð-ÐÌ7$óÀ ›¹¹£ŒéåÜÿ!USET$Àuè.2 ¶RTÔÏÇ×ìÃ{:™È{ÆkÅ)u¦‹•5[âÀ¥¢"]ê7ø`¯¼í)[~p^‡n¥‚iâá‰25³}ùBù»›Â?Ê”©;9X««]–#¸éé¹øÜ4oy®þ÷†‹“1!6ZßÂ쬢¼›¢üe {°¯ìSšSø§Q|qÑÑÞFM‚Ñ×wöó1kkVû›Ñë À ôÊEG˜›:)Ê_QT¸|Ìò̃øCà ú¾Iæù3¥×,ôt]åWÔÕ\Ϲœ‡‡ŸÇèåÜöÇ÷øÂ<¢½­ªÊey‚›s€ŸiG«Ú_Œ÷gÒý¯ä"ÙuV€aŽ?“œhðf€þ™ôÈØLCòµ«–ºÚ QýÂ…óVOi~ûÖ›‘þUÕ)á¿>ãÿø„‡Ï¤§Î#ƒüóä·Fæ§§ + ùWÒT0Ó`3„™2 ~+:‡Ï†¿e6ó'Ìtc¤™vƒüM35öw©úÌkó?ÿ#©êÔ?ö<ï[ ó?Hø×‘ö«ê?ãUýg㯪ÿŒcüUõŸqŒ¿ªþ3ŽñWÕÆ1þªúÏ8Æ_Wi~Æ1þªúÏ8Æ_UÿÇøÿÿÿüß‘cv•ãIEND®B`‚golly-3.3-src/gui-ios/Golly/pattern@2x.png0000644000175000017500000000031412026730263015411 00000000000000‰PNG  IHDR<<:üÙr“IDAThíØ1€0 ÅÐqÿ+‡‰™2$¿¹µÚ!¥º{%9þÞÀ× ¦3˜Î`:ƒé ¦‹ >§?PUÛ¯“î®É½¬xÂÓLg0ÁtqÁ•ö_z|–~kzöŽ»ÒÓLg0ÁtqÁÎÒOÞκÓëw×Þâ®´ÁtÓLg0]\pÜ,wÂÓLg0ÁtÓ]» o!üñIEND®B`‚golly-3.3-src/gui-ios/Golly/open@2x.png0000644000175000017500000000177312026730263014707 00000000000000‰PNG  IHDR<<:üÙrÂIDAThíšAOÛH†ß7M»•ˆƒ¶ÝUw#!`#zXäÊ17N@Ä/kNÜÐþÔpN¥ s€Kv¥¶"C¬¸Z(®ñÌ"¯ÚÝ”õd’š?’ocÏ<šùÞÇ!B<$hÜøÞ¤ÂI'N:©pÒI…“΃~¤rs¿ß×c%×uõ(ís¹\¿X,vt]ï«ô«‚’0c¬´¿¿¿ÓjµV¢´/—ËÇ[[[¯u]?VéW%a×uõV«µrppP‰zÏæææï*}ª’Öð]ü»fÛíöŠã8‘êÇÑÛív¤å…Q2ȼŸŸŸ¯|Y³Žãè¶m—.//#I …¾išÙÙÙ±„V˜ Ñ3Aùj6›•jµú€¸WµZ}Ól6+2i ¸—jTÊåòq.—“ês,¦ivvww_[–õ]÷×0´dîQxù|þýòòòÛùùù¶ÌÉK×uu×uÿ“úw¥·ª° G)í !>Ëž¼&Å]'ºq3ÇqÜ“““§„Ÿ_ý¦ø\e¾u¢‡p×¶í«z½þÀsÛ¶P|æD‹0cìc£Ñ0ü à©ú°&‡ê>|  À0à‰ê &ɨ3ð Ãè---ý¡iZ϶헌±9Ù1Žo¤q !® !·ÃŒ:ÀžeYîíímoo0Mó3§ðW»Æ°*ÂŒrÉ9÷(¥Y!D@ñ 3Î9ãœ{ÃŒº¤¿Jç  §§§¿0¿p—Â4M¿ðéü+²qoI€.çüÂ÷ý›a F]Ò÷5ot5Mëf2õ&„Ü !®ïk:‡ãZ[[{gƧa ¥„…Ÿ)¥=˲>Öjµ3ιW¯××FÜÂÿìµZílcc£S*•®†5”æœ{œsFy|Ó9ŸÏ¿_\\¼(•Jß|G–Ö4Í#„0Û¶õiKç)aß÷o8çŒ1:mé"%œÉd0 à9¦(C¤NZ¾ïgƒ ˜ðƒ—ý©IçÙÐzB)ýÀ yLQ:‡HÍpY!Dñ×nHät‘Mé,¥´ˆøkP(>Y–õ.J:‡È¾<<月¿v¦i^ïììt*•Êÿ¦sˆ”ðÌÌÌ_«««g„¸kÀà÷õõõN”t‘ú>,û'–I3ñâIàÁ}N…“N*œtRᤓ ''ü7çN PÅ:²IEND®B`‚golly-3.3-src/gui-ios/Golly/GollyAppDelegate.h0000644000175000017500000000124013145740437016215 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import @interface GollyAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end // export these routines so we can switch tabs programmatically void SwitchToPatternTab(); void SwitchToOpenTab(); void SwitchToSettingsTab(); void SwitchToHelpTab(); // return tab bar's current view controller UIViewController* CurrentViewController(); // enable/disable tab bar void EnableTabBar(bool enable); // show/hide tab bar void ShowTabBar(bool show); // get height of tab bar CGFloat TabBarHeight(); golly-3.3-src/gui-ios/Golly/help.png0000644000175000017500000000102412026730263014311 00000000000000‰PNG  IHDR;0®¢ÛIDATH‰å—ÑMÃ0†ÿ«úÐ @ê“­<„ (P&€ Èt2BÙ HÉå©RÙ L@yìC{<àVk»ŠÄIQ¤øþûî|'Ë!Á!¬sê!ÁG±ŽÌ| ` г–g "Ê•RÏ1ñh_ pä€ùlFDÃ} ·š™Œ[@ '"EUU!'oÅ:ltY®µ¾q-8+þ&( ™ùÞµ°S±ééØéLTÈìþ•eyÖét2|ŸK—ÚWÅ#Oöc¥ÔÅr¹œ3ó›y. I’­õ€Ü£Íì ° ÔóˆïÖs'v’Ýn÷Î%‘´,Ë3/ž­­õëV u+IöûýwŸžˆ†!pꮇd2™‘7Á¸Û÷ÚŒ™e±XÌ·üCX×õm@·2"Úô¸®ë[ñ æŽEŸÕË•RÏÌ|JD¹ˆ¤mÄ_®xµZªªº0m ug±Â$I^ÌVŸDJ¦!p 6ƒ …ˆ4bÛ`çQé =HÆ?÷‚µÖOˆÛîÖš8p¶ˆ sâ¹ÁƜǞ#ÁÍ;Â2ûÃØËCQÌ4oÞû ®ÛÈߺ€ä_%ŠÈÈxÙÛ ¶ø½ëíOÙÿû…ùïÞÖaæÿ6IEND®B`‚golly-3.3-src/gui-ios/Golly/PatternViewController.xib0000644000175000017500000004752112651666400017714 00000000000000 golly-3.3-src/gui-ios/Golly/HelpViewController.h0000644000175000017500000000106413145740437016626 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import // This is the view controller for the Help tab. @interface HelpViewController : UIViewController { IBOutlet UIWebView *htmlView; IBOutlet UIBarButtonItem *backButton; IBOutlet UIBarButtonItem *nextButton; IBOutlet UIBarButtonItem *contentsButton; } - (IBAction)doBack:(id)sender; - (IBAction)doNext:(id)sender; - (IBAction)doContents:(id)sender; @end // display given HTML file void ShowHelp(const char* filepath); golly-3.3-src/gui-ios/Golly/OpenViewController.m0000644000175000017500000004276413171233731016651 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include // for std::string #include // for std::list #include // for std::set #include // for std::count #include "prefs.h" // for userdir, recentpatterns, SavePrefs, etc #include "utils.h" // for Warning, RemoveFile, FixURLPath, MoveFile, etc #include "file.h" // for OpenFile #import "InfoViewController.h" // for ShowTextFile #import "OpenViewController.h" @implementation OpenViewController // ----------------------------------------------------------------------------- static NSString *options[] = // data for optionTable { @"Supplied", @"Recent", @"Saved", @"Downloaded" }; const int NUM_OPTIONS = sizeof(options) / sizeof(options[0]); static int curroption; // current index in optionTable static CGPoint curroffset[NUM_OPTIONS]; // current offset in scroll view for each option const char* HTML_HEADER = ""; const char* HTML_FOOTER = ""; const char* HTML_INDENT = "      "; static std::set opendirs; // set of open directories in Supplied patterns // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Open"; self.tabBarItem.image = [UIImage imageNamed:@"open.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- static void AppendHtmlData(std::string& htmldata, const std::string& dir, const std::string& prefix, const std::string& title, bool candelete) { NSFileManager *fm = [NSFileManager defaultManager]; NSString *pattdir = [NSString stringWithCString:dir.c_str() encoding:NSUTF8StringEncoding]; NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:pattdir]; NSString *path; int closedlevel = 0; htmldata = HTML_HEADER; htmldata += title; htmldata += "

"; while (path = [dirEnum nextObject]) { // path is relative to given dir (eg. "Life/Bounded-Grids/agar-p3.rle" if patternsdir) std::string pstr = [path cStringUsingEncoding:NSUTF8StringEncoding]; // indent level is number of separators in path int indents = (int)std::count(pstr.begin(), pstr.end(), '/'); if (indents <= closedlevel) { NSString *fullpath = [pattdir stringByAppendingPathComponent:path]; BOOL isDir; if ([fm fileExistsAtPath:fullpath isDirectory:&isDir] && isDir) { // path is to a directory std::string imgname; if (opendirs.find(pstr) == opendirs.end()) { closedlevel = indents; imgname = "triangle-right.png"; } else { closedlevel = indents+1; imgname = "triangle-down.png"; } for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; htmldata += ""; size_t lastsep = pstr.rfind('/'); if (lastsep == std::string::npos) { htmldata += pstr; } else { htmldata += pstr.substr(lastsep+1); } htmldata += "
"; } else { // path is to a file for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; if (candelete) { // allow user to delete file htmldata += "DELETE   "; // allow user to edit file htmldata += "EDIT   "; } else { // allow user to read file (a supplied pattern) htmldata += "READ   "; } htmldata += ""; size_t lastsep = pstr.rfind('/'); if (lastsep == std::string::npos) { htmldata += pstr; } else { htmldata += pstr.substr(lastsep+1); } htmldata += "
"; } } } htmldata += HTML_FOOTER; } // ----------------------------------------------------------------------------- - (void)showSuppliedPatterns { std::string htmldata; AppendHtmlData(htmldata, patternsdir, "Patterns/", "Supplied patterns:", false); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] // the following base URL is needed for img links to work baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; } // ----------------------------------------------------------------------------- - (void)showSavedPatterns { std::string htmldata; AppendHtmlData(htmldata, savedir, "Documents/Saved/", "Saved patterns:", true); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)showDownloadedPatterns { std::string htmldata; AppendHtmlData(htmldata, downloaddir, "Documents/Downloads/", "Downloaded patterns:", true); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)showRecentPatterns { std::string htmldata = HTML_HEADER; if (recentpatterns.empty()) { htmldata += "There are no recent patterns."; } else { htmldata += "Recently opened patterns:

"; std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string path = *next; if (path.find("Patterns/") == 0 || FileExists(userdir + path)) { htmldata += ""; // nicer not to show Patterns/ or Documents/ size_t firstsep = path.find('/'); if (firstsep != std::string::npos) { path.erase(0, firstsep+1); } htmldata += path; htmldata += "
"; } next++; } } htmldata += HTML_FOOTER; [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; htmlView.delegate = self; // init all offsets to top left for (int i=0; i 0) { // recent/saved/downloaded patterns might have changed switch (curroption) { case 1: [self showRecentPatterns]; break; case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug detected in viewWillAppear!"); } } } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // no need for this as we're only displaying html data in strings // [htmlView stopLoading]; if (curroption > 0) { // save current location of recent/saved/downloaded view curroffset[curroption] = htmlView.scrollView.contentOffset; } } // ----------------------------------------------------------------------------- // UITableViewDelegate and UITableViewDataSource methods: - (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView { return 1; } // ----------------------------------------------------------------------------- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)component { return NUM_OPTIONS; } // ----------------------------------------------------------------------------- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // check for a reusable cell first and use that if it exists UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; // if there is no reusable cell of this type, create a new one if (!cell) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; [[cell textLabel] setText:options[[indexPath row]]]; return cell; } // ----------------------------------------------------------------------------- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // save current location curroffset[curroption] = htmlView.scrollView.contentOffset; // display selected set of files curroption = (int)[indexPath row]; switch (curroption) { case 0: [self showSuppliedPatterns]; break; case 1: [self showRecentPatterns]; break; case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug: unexpected row!"); } } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { // show the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } // ----------------------------------------------------------------------------- - (void)webViewDidFinishLoad:(UIWebView *)webView { // hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // restore old offset here htmlView.scrollView.contentOffset = curroffset[curroption]; } // ----------------------------------------------------------------------------- - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // hide the activity indicator in the status bar and display error message [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } // ----------------------------------------------------------------------------- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // link should have special prefix if ([link hasPrefix:@"open:"]) { // open specified file std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); OpenFile(path.c_str()); SavePrefs(); return NO; } if ([link hasPrefix:@"toggledir:"]) { // open/close directory std::string path = [[link substringFromIndex:10] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); if (opendirs.find(path) == opendirs.end()) { // add directory path to opendirs opendirs.insert(path); } else { // remove directory path from opendirs opendirs.erase(path); } if (curroption == 0) { // save current location and update supplied patterns curroffset[0] = htmlView.scrollView.contentOffset; [self showSuppliedPatterns]; } else { Warning("Bug: expected supplied patterns!"); } return NO; } if ([link hasPrefix:@"delete:"]) { std::string path = [[link substringFromIndex:7] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); std::string question = "Do you really want to delete " + path + "?"; if (YesNo(question.c_str())) { // delete specified file path = userdir + path; RemoveFile(path); // save current location curroffset[curroption] = htmlView.scrollView.contentOffset; switch (curroption) { // can't delete supplied or recent patterns case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug: can't delete these files!"); } } return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside supplieddir fullpath = supplieddir + fullpath; } else { fullpath = userdir + fullpath; } } ShowTextFile(fullpath.c_str()); return NO; } } return YES; } @end // ============================================================================= void MoveSharedFiles() { // check for files in the Documents folder (created by iTunes file sharing) // and move any .rule/tree/table files into Documents/Rules/, // otherwise assume they are pattern files and move them into Documents/Saved/ std::string docdir = userdir + "Documents/"; NSFileManager *fm = [NSFileManager defaultManager]; NSString *dirpath = [NSString stringWithCString:docdir.c_str() encoding:NSUTF8StringEncoding]; NSArray* contents = [fm contentsOfDirectoryAtPath:dirpath error:nil]; for (NSString* item in contents) { NSString *fullpath = [dirpath stringByAppendingPathComponent:item]; BOOL isDir; if ([fm fileExistsAtPath:fullpath isDirectory:&isDir] && isDir) { // ignore path to subdirectory } else { // path is to a file std::string filename = [item cStringUsingEncoding:NSUTF8StringEncoding]; if (filename[0] == '.' || EndsWith(filename,".colors") || EndsWith(filename,".icons")) { // ignore hidden file or .colors/icons file } else if (IsRuleFile(filename)) { // move .rule/tree/table file into Documents/Rules/ std::string oldpath = docdir + filename; std::string newpath = userrules + filename; MoveFile(oldpath, newpath); } else { // assume this is a pattern file amd move it into Documents/Saved/ std::string oldpath = docdir + filename; std::string newpath = savedir + filename; MoveFile(oldpath, newpath); } } } } golly-3.3-src/gui-ios/Golly/Icon@2x.png0000644000175000017500000000515712026730263014636 00000000000000‰PNG  IHDRh$uï!tEXtSoftwareGraphicConverter (Intel)w‡ú IDATxœìœ L•çÇßçý8`™V\¢©íœ›·‚I×ÖÕ) Û‘‚("§Z#2ÛÂbmí0µ“‹ 6¨Ðµ\]]§€\¹‰Ê‚XÁ㥴-W¼T{ ÙwÎQ£VÈgx’÷}oòË žü}<ÿ"øËCú~˜/Â|Éc!  Y˜`ÈÂC&²0Á… †,L0da‚! ŒÇ.¬û²Wå!¿š*ß«W^`ì§Ûž'O,ª(óíh[,z FÐ7laU‡WÅGl¬ÎÊ>“¾·íí·Ž„Gµ_òÐØ­žïǽ˜¾#ùóܼöíÛšW,ÿäã” õï#\ FÐ7D(,éÃàù•ÅÅ=u _Õ×÷Ô7\ih¸’™õõì™…û²ô÷ÆŒ½<æ%nxïLm:y¥ÞLuõ7¯·¼ìÕÛã!P FÐ7D(¬¢,`„¢5kZSRΤ¤´§¤tXØ‘|ú•WNMœ¸÷t«Ÿ:öã­®®[ž}¶6)éÂýc)Éíññg§N© ðß J FÐ7Ä)ÌÝ=ÂiÌ_Ÿª°Ð†°ÐÏÌ4††6¾Vç6§RýRЪ·Ô±´=£Fç<5¾(,´É<Ópwò³ ¦1¿,52µ±n‰Aß¡0ãE_ÍGŠ’æä”áæzÐÝ­ÜÝ­ÌLù¬ÙiвÛqĶï®û,ó[G•4e³s‘yìî¤{Å„‰yŠ’ª({־ʠöÂÐ7D(¬¼d1…Ý@²r‡ËrzbŸÓè•Ñ£rìtÙ@r2)ý÷éVç©›²€äPš5ÒQËã¤Nf°WgÔÉ}2æÏ‹à?P{aè"v°Ô—’\BJU€((1=š>µwNŒ:–•¹\Z€‡î|¤…Ò’œÌUBj}CœÂj*ìtGí äüϱµÍ-+]ÙgþQÖÞWÀ@¨á“ôäsÏGs¡Aß§0•IÁÃìÔ·R·™¯ tÓ_ÚÙ–lŠyóÞØ—Æ…³f~ P+æ1 Ý ==}z|ǽ@Aß§0•c~ÞÞÑvº ZlH«­Mñ¬Y›‹ ƒS–üGbÈo³S¡M 9©~Ç7öÓ Âz¯..P#èâf¡·Ççh£C­ÿ%cÀÀ“çÏ.­¯Yzª5àö o¡µƒ¾á  SßGÙúwßÙž¾>)|Ý{eÅþóº¾ðŽßòÚúw¶ý-L z䯥ùÔú†ƒ-ÌxÑËû¥„-qgO·k8÷Áp½¥µwíÚæ•Ëcz¯>ð Óÿì ôô((.í9{îšáܳ†ë{3Œž›öÐfüj}ÃÁv£×ëOܺúµ¶¼üμ‚‹yù]yùù]¹ù]K|[–ùEÜû„ÿ t™V¾cçEó˜Q³LÆÆž™T\Z¼T”@í oˆPXtä«ãŸªXý—æÍ±'ccZcc[,›cZü—{rüÿî2ý“´ó‚דã?qq©Š‹m‹9i³LÆ´DF¶Oøuù”II7{¨ô  S¿íŽ·ÕÞ!gÆ ôú#z}¥^_e¦zÙË•“§Ú;dÏx>JŒÜ<Ü!{¤c†ß’*óØÉ}µÇÂÃö™ÃíÓví\Á öÂÐ7D(¬©~©B?’ªÓí<©À噢éÎ…&üj?¥i©ŠòQ÷åųgFì’>zt¶ó4uàÎä´©Eö2ÔÉË×ñ¨½0ô  +-ò¡$È~J uº|[]ž­n¿N) æ'ò(ìnn\>uò& …æÉB…ÚÚªc* ì·< 4ßuvÿÚ Cß¡°cM‹šKHå}!pˆÀa˧”T)t×yC€»[4ê&Mc‡Ló¦±J Õ>>ïò¨½0ô  ûñ¶çر)š€4ÒDÈQbúà˜ùQå(£O?ðÃ-¯è¨€ó3–±&Õ'VÇņð¨½0ô  SÙóº =Aà í¡Ðêè¨7Աˋ~á˜N¡À™ŸQhstÜÑyÁ_ˆ@ oˆSØíž/ÎH Êy€.JT.érÀ¨À9—í×îþÒl÷§«tJ5Q:)1RÓŒeò£Î¦$!ñ¯¢j}C„ÂT¾ºä=oîVJ[zþÐKé7 múÝsqíü°™‘èôD@'ÐoÕIªB¿p‘šðÁꟾ_ P vÐ7D(ÌBi±HðF×Ùÿœùû$½>*=uåÍkx_ôt{%nZä³íÅ’çÏÛñ÷PCÇ2A5‚¾!Na’àNÕ–ôª¶¤?xTµ%ýÁ©ª-éUmÉð¨jK€GU[2PaªÚ’àTÕ–ô§ª¶¤?øUµ%ýÁ¯ª-é®UmÉX¹ªmMX¿ªmMX¿ªmM UÛjª6óW‘!¡j3•ª6óW‘!¡j3•ª6óW‘¡¢j[ CEÕ¶&†ŠªmM !UÛjàWÕfu³š¸SµYݬæUmV7«ù‡GU›ÕÍjþáTÕfu³šxTµÞ¬æUm†7«ù‡GU›áÍjþáQÕfx³š8UµYݬæNUmV7«ù‡_U›ÕÍjþáWÕfu³š¸VµÞ¬æ©j ƒTµEBªÚ"!Um‘ª¶`HU[0¤ª-RÕ ©j †TµCªÚâ!Umñª¶xHU[òh¤ª-RÕ ©j †TµCªÚ‚!UmÁª¶`HU[0¤ª-RÕ ©j †TµCªÚ‚!†ª.Bó8ØÂªÚè"4ÿƒ-Œ¡ª.BóˆP+U]„æ?¡0†ª6ºÍ Ba Umtšÿ@„ªÚè"4ÿ…1TµÑEhþ c¨j£‹Ðü"ÖÇNÕF¡ùÄ)Œ¡ª.BóˆPXSU]„æ?¡0 ¬Tmtšÿ@œÂúØ©Úè7«ùla¬Tmô›Õü"ÆJÕF¿YÍ Ba¬Tmô›ÕüâÆJÕF¿YÍ Ba Umô›Õü"ÆPÕF¿YÍ Ba Umô›Õü"ÆPÕF¿YÍ Ba}ìTmô›ÕüâÆJÕF¿YÍ Na}ìTmô›ÕüâÖÇNÕF¿YÍ NaªÚè7«ùD(LÂY˜`ÈÂC&²0Áø?ÿÿìÑ € ÿ¯Û!>ð0Ìa˜Ã0‡aÆ ÿÿeªŒæüIEND®B`‚golly-3.3-src/gui-ios/Golly/PatternViewController.m0000644000175000017500000007300013171233731017350 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "viewport.h" // for MAX_MAG #include "utils.h" // for Warning, event_checker #include "status.h" // for SetMessage, DisplayMessage #include "algos.h" // for InitAlgorithms, algoinfo #include "prefs.h" // for GetPrefs, SavePrefs, userdir, etc #include "layer.h" // for AddLayer, currlayer #include "file.h" // for NewPattern #include "control.h" // for generating, StartGenerating, etc #include "view.h" // for nopattupdate, SmallScroll, drawingcells #include "undo.h" // for currlayer->undoredo->... #import "GollyAppDelegate.h" // for EnableTabBar #import "InfoViewController.h" #import "SaveViewController.h" #import "RuleViewController.h" #import "PatternViewController.h" @implementation PatternViewController // ----------------------------------------------------------------------------- // global stuff needed in UpdatePattern, UpdateStatus, etc static PatternViewController *globalController = nil; static PatternView *globalPatternView = nil; static StatusView *globalStatusView = nil; static StateView *globalStateView = nil; static UIView *globalProgress = nil; static UILabel *globalTitle = nil; static bool cancelProgress = false; // cancel progress dialog? static double progstart, prognext; // for progress timing static int progresscount = 0; // if > 0 then BeginProgress has been called static int pausecount = 0; // if > 0 then genTimer needs to be restarted // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Pattern"; self.tabBarItem.image = [UIImage imageNamed:@"pattern.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // free up as much memory as possible if (numlayers > 0) DeleteOtherLayers(); if (waitingforpaste) AbortPaste(); [self doNew:self]; // Warning hangs if called here, so use DisplayMessage for now!!! // (may need non-modal version via extra flag???) // Warning("Memory warning occurred, so empty universe created."); DisplayMessage("Memory warning occurred, so empty universe created."); } // ----------------------------------------------------------------------------- static void CreateDocSubdir(NSString *subdirname) { // create given subdirectory inside Documents NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:subdirname]; if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { // do nothing if subdir already exists } else { NSError *error; if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:&error]) { NSLog(@"Error creating %@ subdirectory: %@", subdirname, error); } } } // ----------------------------------------------------------------------------- static void InitPaths() { // init userdir to directory containing user's data userdir = [NSHomeDirectory() cStringUsingEncoding:NSUTF8StringEncoding]; userdir += "/"; // init savedir to userdir/Documents/Saved/ savedir = userdir + "Documents/Saved/"; CreateDocSubdir(@"Saved"); // init downloaddir to userdir/Documents/Downloads/ downloaddir = userdir + "Documents/Downloads/"; CreateDocSubdir(@"Downloads"); // init userrules to userdir/Documents/Rules/ userrules = userdir + "Documents/Rules/"; CreateDocSubdir(@"Rules"); // supplied patterns, rules, help are bundled inside Golly.app NSString *appdir = [[NSBundle mainBundle] resourcePath]; supplieddir = [appdir cStringUsingEncoding:NSUTF8StringEncoding]; supplieddir += "/"; patternsdir = supplieddir + "Patterns/"; rulesdir = supplieddir + "Rules/"; helpdir = supplieddir + "Help/"; // init tempdir to userdir/tmp/ tempdir = userdir + "tmp/"; // init path to file that stores clipboard data clipfile = tempdir + "golly_clipboard"; // init path to file that stores user preferences prefsfile = userdir + "Library/Preferences/GollyPrefs"; #if 0 NSLog(@"userdir = %s", userdir.c_str()); NSLog(@"savedir = %s", savedir.c_str()); NSLog(@"downloaddir = %s", downloaddir.c_str()); NSLog(@"userrules = %s", userrules.c_str()); NSLog(@"supplieddir = %s", supplieddir.c_str()); NSLog(@"patternsdir = %s", patternsdir.c_str()); NSLog(@"rulesdir = %s", rulesdir.c_str()); NSLog(@"helpdir = %s", helpdir.c_str()); NSLog(@"tempdir = %s", tempdir.c_str()); NSLog(@"clipfile = %s", clipfile.c_str()); NSLog(@"prefsfile = %s", prefsfile.c_str()); #endif } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // now do additional setup after loading the view from the xib file // init global pointers globalController = self; globalPatternView = pattView; globalStatusView = statView; globalStateView = stateView; globalProgress = progressView; globalTitle = progressTitle; static bool firstload = true; if (firstload) { firstload = false; // only do the following once SetMessage("This is Golly 1.2 for iOS. Copyright 2017 The Golly Gang."); MAX_MAG = 5; // maximum cell size = 32x32 InitAlgorithms(); // must initialize algoinfo first InitPaths(); // init userdir, etc (must be before GetPrefs) GetPrefs(); // load user's preferences SetMinimumStepExponent(); // for slowest speed AddLayer(); // create initial layer (sets currlayer) NewPattern(); // create new, empty universe } // ensure pattView is composited underneath toolbar, otherwise // bottom toolbar can be obscured when device is rotated left/right // (no longer needed) // [[pattView layer] setZPosition:-1]; // we draw background areas of pattView and statView so set to transparent (presumably a tad faster) [pattView setBackgroundColor:nil]; [statView setBackgroundColor:nil]; progressView.hidden = YES; genTimer = nil; // init buttons [self toggleStartStopButton]; resetButton.enabled = NO; undoButton.enabled = NO; redoButton.enabled = NO; actionButton.enabled = NO; infoButton.enabled = NO; restoreButton.hidden = YES; // deselect step/scale controls (these have Momentary attribute set) [stepControl setSelectedSegmentIndex:-1]; [scaleControl setSelectedSegmentIndex:-1]; // init touch mode [modeControl setSelectedSegmentIndex:currlayer->touchmode]; [self updateDrawingState]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; SavePrefs(); // release all outlets pattView = nil; statView = nil; startStopButton = nil; restoreButton = nil; resetButton = nil; undoButton = nil; redoButton = nil; actionButton = nil; infoButton = nil; stepControl = nil; scaleControl = nil; modeControl = nil; stateLabel = nil; stateView = nil; topBar = nil; editBar = nil; bottomBar = nil; progressView = nil; progressTitle = nil; progressMessage = nil; progressBar = nil; cancelButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; SetMessage(""); // stop generating, but only if PauseGenTimer() hasn't been called if (pausecount == 0) [self stopIfGenerating]; } // ----------------------------------------------------------------------------- - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UpdateEverything(); // calls [pattView refreshPattern] // restart genTimer if PauseGenTimer() was called earlier if (pausecount > 0) RestartGenTimer(); } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)updateDrawingState; { // reset drawing state if it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } [stateLabel setText:[NSString stringWithFormat:@"State=%d", currlayer->drawingstate]]; [stateView setNeedsDisplay]; } // ----------------------------------------------------------------------------- - (void)updateButtons { resetButton.enabled = currlayer->algo->getGeneration() > currlayer->startgen; undoButton.enabled = currlayer->undoredo->CanUndo(); redoButton.enabled = currlayer->undoredo->CanRedo(); actionButton.enabled = SelectionExists(); infoButton.enabled = currlayer->currname != "untitled"; [modeControl setSelectedSegmentIndex:currlayer->touchmode]; } // ----------------------------------------------------------------------------- - (void)toggleStartStopButton { if (generating) { [startStopButton setTitle:@"STOP" forState:UIControlStateNormal]; [startStopButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; } else { [startStopButton setTitle:@"START" forState:UIControlStateNormal]; [startStopButton setTitleColor:[UIColor colorWithRed:0.2 green:0.7 blue:0.0 alpha:1.0] forState:UIControlStateNormal]; } } // ----------------------------------------------------------------------------- - (void)stopIfGenerating { if (generating) { [self stopGenTimer]; StopGenerating(); // generating now false [self toggleStartStopButton]; } } // ----------------------------------------------------------------------------- - (IBAction)doNew:(id)sender { if (drawingcells) return; // undo/redo history is about to be cleared so no point calling RememberGenFinish // if we're generating a (possibly large) pattern bool saveundo = allowundo; allowundo = false; [self stopIfGenerating]; allowundo = saveundo; if (event_checker > 0) { // try again after a short delay that gives time for NextGeneration() to terminate [self performSelector:@selector(doNew:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NewPattern(); [modeControl setSelectedSegmentIndex:currlayer->touchmode]; [self updateDrawingState]; [self updateButtons]; [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doInfo:(id)sender { if (drawingcells) return; // if generating then just pause the timer so doGeneration won't be called; // best not to call PauseGenerating() because it calls StopGenerating() // which might result in a lengthy file save for undo/redo PauseGenTimer(); ClearMessage(); // display contents of current pattern file in a modal view InfoViewController *modalInfoController = [[InfoViewController alloc] initWithNibName:nil bundle:nil]; [modalInfoController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentViewController:modalInfoController animated:YES completion:nil]; modalInfoController = nil; // RestartGenTimer() will be called in viewDidAppear } // ----------------------------------------------------------------------------- - (IBAction)doSave:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doSave:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); // let user save current pattern in a file via a modal view SaveViewController *modalSaveController = [[SaveViewController alloc] initWithNibName:nil bundle:nil]; [modalSaveController setModalPresentationStyle:UIModalPresentationFormSheet]; [self presentViewController:modalSaveController animated:YES completion:nil]; modalSaveController = nil; } // ----------------------------------------------------------------------------- - (IBAction)doUndo:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doUndo:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); currlayer->undoredo->UndoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doRedo:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doRedo:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); currlayer->undoredo->RedoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doReset:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doReset:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); ResetPattern(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doStartStop:(id)sender { if (drawingcells) return; // this can happen on iPad if user taps Start/Stop button while another finger // is currently drawing cells ClearMessage(); if (generating) { [self stopGenTimer]; StopGenerating(); // generating is now false [self toggleStartStopButton]; // can't call [self updateButtons] here because if event_checker is > 0 // then StopGenerating hasn't called RememberGenFinish, and so CanUndo/CanRedo // might not return correct results bool canreset = currlayer->algo->getGeneration() > currlayer->startgen; resetButton.enabled = canreset; undoButton.enabled = allowundo && (canreset || currlayer->undoredo->CanUndo()); redoButton.enabled = NO; } else if (StartGenerating()) { // generating is now true [self toggleStartStopButton]; [self startGenTimer]; // don't call [self updateButtons] here because we want user to // be able to stop generating by tapping Reset/Undo buttons resetButton.enabled = YES; undoButton.enabled = allowundo; redoButton.enabled = NO; } pausecount = 0; // play safe } // ----------------------------------------------------------------------------- - (void)startGenTimer { float interval = 1.0f/60.0f; // increase interval if user wants a delay if (currlayer->currexpo < 0) { interval = GetCurrentDelay() / 1000.0f; } // create a repeating timer genTimer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(doGeneration:) userInfo:nil repeats:YES]; } // ----------------------------------------------------------------------------- - (void)stopGenTimer { [genTimer invalidate]; genTimer = nil; } // ----------------------------------------------------------------------------- // called after genTimer fires - (void)doGeneration:(NSTimer*)timer { if (event_checker > 0 || progresscount > 0) return; // advance by current step size NextGeneration(true); [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doNext:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doNext:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NextGeneration(false); [statView setNeedsDisplay]; [pattView refreshPattern]; [self updateButtons]; } // ----------------------------------------------------------------------------- - (IBAction)doStep:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doStep:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NextGeneration(true); [statView setNeedsDisplay]; [pattView refreshPattern]; [self updateButtons]; } // ----------------------------------------------------------------------------- - (IBAction)doFit:(id)sender { ClearMessage(); FitInView(1); [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doChangeStep:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: { // go slower by decrementing step exponent if (currlayer->currexpo > minexpo) { currlayer->currexpo--; SetGenIncrement(); if (generating && currlayer->currexpo < 0) { // increase timer interval [self stopGenTimer]; [self startGenTimer]; } } else { Beep(); } } break; case 1: { // reset step exponent to 0 currlayer->currexpo = 0; SetGenIncrement(); if (generating) { // reset timer interval to max speed [self stopGenTimer]; [self startGenTimer]; } } break; case 2: { // go faster by incrementing step exponent currlayer->currexpo++; SetGenIncrement(); if (generating && currlayer->currexpo <= 0) { // reduce timer interval [self stopGenTimer]; [self startGenTimer]; } } break; } // only need to update status info [statView setNeedsDisplay]; } // ----------------------------------------------------------------------------- - (IBAction)doChangeScale:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: { // zoom out currlayer->view->unzoom(); [statView setNeedsDisplay]; [pattView refreshPattern]; } break; case 1: { // set scale to 1:1 if (currlayer->view->getmag() != 0) { currlayer->view->setmag(0); [statView setNeedsDisplay]; [pattView refreshPattern]; } } break; case 2: { // zoom in if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(); [statView setNeedsDisplay]; [pattView refreshPattern]; } else { Beep(); } } break; } } // ----------------------------------------------------------------------------- - (IBAction)doChangeMode:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: currlayer->touchmode = drawmode; break; case 1: currlayer->touchmode = pickmode; break; case 2: currlayer->touchmode = selectmode; break; case 3: currlayer->touchmode = movemode; break; } } // ----------------------------------------------------------------------------- - (IBAction)doMiddle:(id)sender { ClearMessage(); if (currlayer->originx == bigint::zero && currlayer->originy == bigint::zero) { currlayer->view->center(); } else { // put cell saved by ChangeOrigin (not yet implemented!!!) in middle currlayer->view->setpositionmag(currlayer->originx, currlayer->originy, currlayer->view->getmag()); } [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doSelectAll:(id)sender { ClearMessage(); SelectAll(); } // ----------------------------------------------------------------------------- - (IBAction)doAction:(id)sender { ClearMessage(); [pattView doSelectionAction]; } // ----------------------------------------------------------------------------- - (IBAction)doPaste:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doPaste:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); if (waitingforpaste) { [pattView doPasteAction]; } else { PasteClipboard(); [pattView refreshPattern]; } } // ----------------------------------------------------------------------------- - (IBAction)doRule:(id)sender { if (drawingcells) return; [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doRule:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); // let user change current algo/rule in a modal view RuleViewController *modalRuleController = [[RuleViewController alloc] initWithNibName:nil bundle:nil]; [modalRuleController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentViewController:modalRuleController animated:YES completion:nil]; modalRuleController = nil; } // ----------------------------------------------------------------------------- - (IBAction)toggleFullScreen:(id)sender { if (fullscreen) { ShowTabBar(YES); topBar.hidden = NO; editBar.hidden = NO; bottomBar.hidden = NO; statView.hidden = NO; // recalculate pattView's frame from scratch (in case device was rotated) CGFloat barht = topBar.bounds.size.height; CGFloat topht = barht * 2 + statView.bounds.size.height; CGFloat x = pattView.superview.frame.origin.x; CGFloat y = pattView.superview.frame.origin.y + topht; CGFloat wd = pattView.superview.frame.size.width; CGFloat ht = pattView.superview.frame.size.height - (topht + barht + TabBarHeight()); pattView.frame = CGRectMake(x, y, wd, ht); [statView setNeedsDisplay]; } else { ShowTabBar(NO); topBar.hidden = YES; editBar.hidden = YES; bottomBar.hidden = YES; statView.hidden = YES; pattView.frame = pattView.superview.frame; } fullscreen = !fullscreen; restoreButton.hidden = !fullscreen; [pattView refreshPattern]; UpdateEditBar(); } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { cancelProgress = true; } // ----------------------------------------------------------------------------- - (void)enableInteraction:(BOOL)enable { topBar.userInteractionEnabled = enable; editBar.userInteractionEnabled = enable; bottomBar.userInteractionEnabled = enable; pattView.userInteractionEnabled = enable; EnableTabBar(enable); } // ----------------------------------------------------------------------------- - (void)updateProgressBar:(float)fraction { progressBar.progress = fraction; // show estimate of time remaining double elapsecs = TimeInSeconds() - progstart; double remsecs = fraction > 0.0 ? (elapsecs / fraction) - elapsecs : 999.0; [progressMessage setText:[NSString stringWithFormat:@"Estimated time remaining (in secs): %d", int(remsecs+0.5)]]; // need following to see progress view and bar update event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; event_checker--; } @end // ============================================================================= // global routines used by external code: void UpdatePattern() { [globalPatternView refreshPattern]; } // ----------------------------------------------------------------------------- void UpdateStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; if (!fullscreen) { [globalStatusView setNeedsDisplay]; } } // ----------------------------------------------------------------------------- void UpdateEditBar() { if (!fullscreen) { [globalController updateButtons]; [globalController updateDrawingState]; } } // ----------------------------------------------------------------------------- void CloseStatePicker() { [globalStateView dismissStatePopover]; } // ----------------------------------------------------------------------------- void PauseGenTimer() { if (generating) { // use pausecount to handle nested calls if (pausecount == 0) [globalController stopGenTimer]; pausecount++; } } // ----------------------------------------------------------------------------- void RestartGenTimer() { if (pausecount > 0) { pausecount--; if (pausecount == 0) [globalController startGenTimer]; } } // ----------------------------------------------------------------------------- static bool wasgenerating = false; // generating needs to be resumed? void PauseGenerating() { if (generating) { // stop generating without changing STOP button [globalController stopGenTimer]; StopGenerating(); // generating now false wasgenerating = true; } } // ----------------------------------------------------------------------------- void ResumeGenerating() { if (wasgenerating) { // generating should be false but play safe if (!generating) { if (StartGenerating()) { // generating now true [globalController startGenTimer]; } else { // this can happen if pattern is empty [globalController toggleStartStopButton]; [globalController updateButtons]; } } wasgenerating = false; } } // ----------------------------------------------------------------------------- void StopIfGenerating() { [globalController stopIfGenerating]; } // ----------------------------------------------------------------------------- void BeginProgress(const char* title) { if (progresscount == 0) { // disable interaction with all views but don't show progress view just yet [globalController enableInteraction:NO]; [globalTitle setText:[NSString stringWithCString:title encoding:NSUTF8StringEncoding]]; cancelProgress = false; progstart = TimeInSeconds(); } progresscount++; // handles nested calls } // ----------------------------------------------------------------------------- bool AbortProgress(double fraction_done, const char* message) { if (progresscount <= 0) Fatal("Bug detected in AbortProgress!"); double secs = TimeInSeconds() - progstart; if (!globalProgress.hidden) { if (secs < prognext) return false; prognext = secs + 0.1; // update progress bar about 10 times per sec if (fraction_done < 0.0) { // show indeterminate progress gauge??? } else { [globalController updateProgressBar:fraction_done]; } return cancelProgress; } else { // note that fraction_done is not always an accurate estimator for how long // the task will take, especially when we use nextcell for cut/copy if ( (secs > 1.0 && fraction_done < 0.3) || secs > 2.0 ) { // task is probably going to take a while so show progress view globalProgress.hidden = NO; [globalController updateProgressBar:fraction_done]; } prognext = secs + 0.01; // short delay until 1st progress update } return false; } // ----------------------------------------------------------------------------- void EndProgress() { if (progresscount <= 0) Fatal("Bug detected in EndProgress!"); progresscount--; if (progresscount == 0) { // hide the progress view and enable interaction with other views globalProgress.hidden = YES; [globalController enableInteraction:YES]; } } golly-3.3-src/gui-ios/Golly/RuleViewController.m0000644000175000017500000006315413171233731016653 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "prefs.h" // for allowundo, SavePrefs #include "algos.h" // for algo_type, NumAlgos, etc #include "layer.h" // for currlayer, etc #include "undo.h" // for currlayer->undoredo #include "view.h" // for SaveCurrentSelection #include "control.h" // for ChangeAlgorithm, CreateRuleFiles #include "file.h" // for OpenFile #import "InfoViewController.h" // for ShowTextFile #import "OpenViewController.h" // for MoveSharedFiles #import "RuleViewController.h" @implementation RuleViewController // ----------------------------------------------------------------------------- const char* RULE_IF_EMPTY = "B3/S23"; // use Life if ruleText is empty static algo_type algoindex; // index of currently displayed algorithm static std::string oldrule; // original rule on entering Rule screen static int oldmaxstate; // maximum cell state in original rule static CGPoint curroffset[MAX_ALGOS]; // current offset in scroll view for each algoindex static NSString *namedRules[] = // data for rulePicker { // keep names in alphabetical order, and rules must be in canonical form for findNamedRule and GetRuleName @"3-4 Life", @"B34/S34", @"AntiLife", @"B0123478/S01234678", @"Banners", @"2367/3457/5", @"Bloomerang", @"234/34678/24", @"Brian's Brain", @"/2/3", @"Caterpillars", @"124567/378/4", @"Cooties", @"23/2/8", @"Day and Night", @"B3678/S34678", @"Diamoeba", @"B35678/S5678", @"Fireworks", @"2/13/21", @"Fredkin", @"B1357/S02468", @"Frogs", @"12/34/3", @"HighLife", @"B36/S23", @"Hutton32", @"Hutton32", @"JvN29", @"JvN29", @"Lava", @"12345/45678/8", @"Life", @"B3/S23", @"LifeHistory", @"LifeHistory", @"Life without Death", @"B3/S012345678", @"Lines", @"012345/458/3", @"LongLife", @"B345/S5", @"Morley", @"B368/S245", @"Nobili32", @"Nobili32", @"Persian Rug", @"B234/S", @"Plow World", @"B378/S012345678", @"Replicator", @"B1357/S1357", @"Seeds", @"B2/S", @"Star Wars", @"345/2/4", @"Sticks", @"3456/2/6", @"Transers", @"345/26/5", @"WireWorld", @"WireWorld", @"Wolfram 22", @"W22", @"Wolfram 30", @"W30", @"Wolfram 110", @"W110", @"Xtasy", @"1456/2356/16", @"UNNAMED", @"Bug if we see this!" // UNNAMED must be last }; const int NUM_ROWS = (sizeof(namedRules) / sizeof(namedRules[0])) / 2; const int UNNAMED_ROW = NUM_ROWS - 1; // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Rule"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; htmlView.delegate = self; // init all offsets to top left for (int i=0; i deprecated, keeprules; while (path = [dirEnum nextObject]) { std::string filename = [path cStringUsingEncoding:NSUTF8StringEncoding]; if (IsRuleFile(filename)) { if (EndsWith(filename,".rule")) { // .rule file exists, so tell CreateRuleFiles not to change it keeprules.push_back(filename); } else { // this is a deprecated .table/tree/colors/icons file deprecated.push_back(filename); } } } if (deprecated.size() > 0) { // convert deprecated files into new .rule files (if not in keeprules) // and then delete all the deprecated files CreateRuleFiles(deprecated, keeprules); } } // ----------------------------------------------------------------------------- static void CreateRuleLinks(std::string& htmldata, const std::string& dir, const std::string& prefix, const std::string& title, bool candelete) { htmldata += "

"; htmldata += title; htmldata += "

"; NSFileManager *fm = [NSFileManager defaultManager]; NSString *rdir = [NSString stringWithCString:dir.c_str() encoding:NSUTF8StringEncoding]; NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:rdir]; NSString *path; while (path = [dirEnum nextObject]) { std::string pstr = [path cStringUsingEncoding:NSUTF8StringEncoding]; size_t extn = pstr.rfind(".rule"); if (extn != std::string::npos) { // path is to a .rule file std::string rulename = pstr.substr(0,extn); if (candelete) { // allow user to delete .rule file htmldata += "DELETE   "; // allow user to edit .rule file htmldata += "EDIT   "; } else { // allow user to read supplied .rule file htmldata += "READ   "; } // use "open:" link rather than "rule:" link so dialog closes immediately htmldata += ""; htmldata += rulename; htmldata += "
"; } } } // ----------------------------------------------------------------------------- - (void)showAlgoHelp { NSString *algoname = [NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding]; if ([algoname isEqualToString:@"RuleLoader"]) { // first check for any .rule/tree/table files in Documents // (created by iTunes file sharing) and move them into Documents/Rules/ MoveSharedFiles(); // now convert any .tree/table files to .rule files ConvertOldRules(); // create html data with links to the user's .rule files and Golly's supplied .rule files std::string htmldata; htmldata += ""; htmldata += "

The RuleLoader algorithm allows CA rules to be specified in .rule files."; htmldata += " Given the rule string \"Foo\", RuleLoader will search for a file called Foo.rule"; htmldata += " in your rules folder (Documents/Rules/), then in the rules folder supplied with Golly."; htmldata += "

"; CreateRuleLinks(htmldata, userrules, "Documents/Rules/", "Your .rule files:", true); CreateRuleLinks(htmldata, rulesdir, "Rules/", "Supplied .rule files:", false); htmldata += "

TOP
"; [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; // the above base URL is needed for links like to work } else { // replace any spaces with underscores algoname = [algoname stringByReplacingOccurrencesOfString:@" " withString:@"_"]; NSBundle *bundle=[NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:algoname ofType:@"html" inDirectory:@"Help/Algorithms"]; if (filePath) { NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; [htmlView loadRequest:request]; } else { [htmlView loadHTMLString:@"
Failed to find html file!
" baseURL:nil]; } } } // ----------------------------------------------------------------------------- static bool keepalgoindex = false; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (keepalgoindex) { // ShowTextFile has finished displaying a modal dialog so we don't want to change algoindex keepalgoindex = false; [self showAlgoHelp]; // user might have created a new .rule file return; } // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; // show current algo and rule algoindex = currlayer->algtype; [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [self showAlgoHelp]; oldrule = currlayer->algo->getrule(); oldmaxstate = currlayer->algo->NumCellStates() - 1; [ruleText setText:[NSString stringWithCString:currlayer->algo->getrule() encoding:NSUTF8StringEncoding]]; unknownLabel.hidden = YES; // show corresponding name for current rule (or UNNAMED if there isn't one) [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; // selection might change if grid becomes smaller, so save current selection // if RememberRuleChange/RememberAlgoChange is called later SaveCurrentSelection(); } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [htmlView stopLoading]; // in case the web view is still loading its content // save current location of htmlView curroffset[algoindex] = htmlView.scrollView.contentOffset; } // ----------------------------------------------------------------------------- - (IBAction)changeAlgorithm:(id)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; for (int i=0; i= 0 && globalButton < NumAlgos()) { // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; // save chosen algo for later use algoindex = (algo_type)globalButton; // display the chosen algo name [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; // display help for chosen algo [self showAlgoHelp]; // if current rule (in ruleText) is valid in the chosen algo then don't change rule, // otherwise switch to the algo's default rule std::string thisrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (thisrule.empty()) thisrule = RULE_IF_EMPTY; lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // switch to tempalgo's default rule std::string defrule = tempalgo->DefaultRule(); size_t thispos = thisrule.find(':'); if (thispos != std::string::npos) { // preserve valid topology so we can do things like switch from // "LifeHistory:T30,20" in RuleLoader to "B3/S23:T30,20" in QuickLife size_t defpos = defrule.find(':'); if (defpos != std::string::npos) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.substr(0, defpos); } defrule += ":"; defrule += thisrule.substr(thispos+1); } [ruleText setText:[NSString stringWithCString:defrule.c_str() encoding:NSUTF8StringEncoding]]; [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; unknownLabel.hidden = YES; } delete tempalgo; } } // ----------------------------------------------------------------------------- // called when the user selects an item from UIActionSheet created in changeAlgorithm - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // user interaction is disabled at this moment, which is a problem if Warning gets called // (the OK button won't work) so we have to call the appropriate action code AFTER this // callback has finished and user interaction restored globalButton = buttonIndex; [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; } // ----------------------------------------------------------------------------- - (void)checkRule { // check displayed rule and show message if it's not valid in any algo, // or if the rule is valid then displayed algo might need to change std::string thisrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (thisrule.empty()) { thisrule = RULE_IF_EMPTY; [ruleText setText:[NSString stringWithCString:thisrule.c_str() encoding:NSUTF8StringEncoding]]; [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; } // 1st check if rule is valid in displayed algo lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // check rule in other algos for (int newindex = 0; newindex < NumAlgos(); newindex++) { if (newindex != algoindex) { delete tempalgo; tempalgo = CreateNewUniverse(newindex); err = tempalgo->setrule(thisrule.c_str()); if (!err) { // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; algoindex = newindex; [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [self showAlgoHelp]; break; } } } } unknownLabel.hidden = (err == nil); if (err) { // unknown rule must be unnamed [rulePicker selectRow:UNNAMED_ROW inComponent:0 animated:NO]; Beep(); } else { // need canonical rule for comparison in findNamedRule and GetRuleName NSString *canonrule = [NSString stringWithCString:tempalgo->getrule() encoding:NSUTF8StringEncoding]; [rulePicker selectRow:[self findNamedRule:canonrule] inComponent:0 animated:NO]; } delete tempalgo; } // ----------------------------------------------------------------------------- - (IBAction)cancelRuleChange:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } // ----------------------------------------------------------------------------- - (IBAction)doRuleChange:(id)sender { // clear first responder if necessary (ie. remove keyboard) [self.view endEditing:YES]; if (unknownLabel.hidden == NO) { Warning("Given rule is not valid in any algorithm."); // don't dismiss modal view return; } // dismiss modal view first in case ChangeAlgorithm calls BeginProgress [self dismissViewControllerAnimated:YES completion:nil]; // get current rule in ruleText std::string newrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (newrule.empty()) newrule = RULE_IF_EMPTY; if (algoindex == currlayer->algtype) { // check if new rule is valid in current algorithm // (if not then revert to original rule saved in viewWillAppear) const char* err = currlayer->algo->setrule(newrule.c_str()); if (err) RestoreRule(oldrule.c_str()); // convert newrule to canonical form for comparison with oldrule, then // check if the rule string changed or if the number of states changed newrule = currlayer->algo->getrule(); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // if pattern exists and is at starting gen then ensure savestart is true // so that SaveStartingPattern will save pattern to suitable file // (and thus undo/reset will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } UpdateLayerColors(); UpdateEverything(); } else { // change the current algorithm and switch to the new rule // (if the new rule is invalid then the algo's default rule will be used); // this also calls UpdateLayerColors, UpdateEverything and RememberAlgoChange ChangeAlgorithm(algoindex, newrule.c_str()); } SavePrefs(); } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidBeginEditing:(UITextField *)tf { // probably best to clear any message about unknown rule unknownLabel.hidden = YES; } - (void)textFieldDidEndEditing:(UITextField *)tf { // called when rule editing has ended (ie. keyboard disappears) [self checkRule]; } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } - (BOOL)disablesAutomaticKeyboardDismissal { // this allows keyboard to be dismissed if modal view uses UIModalPresentationFormSheet return NO; } // ----------------------------------------------------------------------------- // UIPickerViewDelegate and UIPickerViewDataSource methods: - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return NUM_ROWS; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; { return namedRules[row * 2]; } - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { return 38.0; // nicer spacing } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (row < UNNAMED_ROW) { [ruleText setText:namedRules[row * 2 + 1]]; [self checkRule]; } } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { // show the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)webViewDidFinishLoad:(UIWebView *)webView { // hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // restore old offset here htmlView.scrollView.contentOffset = curroffset[algoindex]; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // hide the activity indicator in the status bar and display error message [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // look for special prefixes used by Golly (and return NO if found) if ([link hasPrefix:@"open:"]) { // open specified file, but dismiss modal view first in case OpenFile calls BeginProgress [self dismissViewControllerAnimated:YES completion:nil]; std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; OpenFile(path.c_str()); SavePrefs(); return NO; } if ([link hasPrefix:@"rule:"]) { // copy specified rule into ruleText [ruleText setText:[link substringFromIndex:5]]; [self checkRule]; return NO; } if ([link hasPrefix:@"delete:"]) { std::string path = [[link substringFromIndex:7] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); std::string question = "Do you really want to delete " + path + "?"; if (YesNo(question.c_str())) { // delete specified file path = userdir + path; RemoveFile(path); // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; [self showAlgoHelp]; } return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside supplieddir fullpath = supplieddir + fullpath; } else { fullpath = userdir + fullpath; } } // we pass self to ShowTextFile so it doesn't use current tab's view controller ShowTextFile(fullpath.c_str(), self); // tell viewWillAppear not to reset algoindex to currlayer->algtype keepalgoindex = true; return NO; } } return YES; } @end // ============================================================================= std::string GetRuleName(const std::string& rule) { std::string result = ""; NSString* nsrule = [NSString stringWithCString:rule.c_str() encoding:NSUTF8StringEncoding]; for (int row = 0; row < UNNAMED_ROW; row++) { if ([nsrule isEqualToString:namedRules[row * 2 + 1]]) { result = [namedRules[row * 2] cStringUsingEncoding:NSUTF8StringEncoding]; break; } } return result; } golly-3.3-src/gui-ios/Golly/Golly-Info.plist0000644000175000017500000000322513171233731015714 00000000000000 CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFiles Icon.png CFBundleIcons CFBundleIcons~ipad CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.2 CFBundleSignature ???? CFBundleVersion 1.2 LSRequiresIPhoneOS NSAppTransportSecurity NSAllowsArbitraryLoads UIFileSharingEnabled UILaunchStoryboardName PatternViewController UIRequiredDeviceCapabilities armv7 UIStatusBarHidden UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance golly-3.3-src/gui-ios/Golly/RuleViewController.h0000644000175000017500000000144613145740437016651 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import // This view controller is used when the Pattern tab's Rule button is tapped. @interface RuleViewController : UIViewController { IBOutlet UIButton *algoButton; IBOutlet UITextField *ruleText; IBOutlet UILabel *unknownLabel; IBOutlet UIPickerView *rulePicker; IBOutlet UIWebView *htmlView; } - (IBAction)changeAlgorithm:(id)sender; - (IBAction)cancelRuleChange:(id)sender; - (IBAction)doRuleChange:(id)sender; @end std::string GetRuleName(const std::string& rule); golly-3.3-src/gui-ios/Golly/StatePickerController.m0000644000175000017500000000355513145740437017335 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "prefs.h" // for showicons #import "PatternViewController.h" // for UpdateEditBar, UpdatePattern #import "StatePickerController.h" // ----------------------------------------------------------------------------- @implementation StatePickerController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"StatePicker"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // release any cached data, images, etc that aren't in use } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets spView = nil; iconsSwitch = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [iconsSwitch setOn:showicons animated:NO]; } // ----------------------------------------------------------------------------- - (IBAction)toggleIcons:(id)sender { showicons = !showicons; [spView setNeedsDisplay]; UpdateEditBar(); UpdatePattern(); } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/Default-Landscape~ipad.png0000644000175000017500000014321712651666400017711 00000000000000‰PNG  IHDRºº AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ@IDATxì˜SeöÆßd23t^¤ RD@,Ø{ÇÞQܵ׵¯®½¬«®»úwíØ ö‚½ ‚ ¨ˆ(½÷ÞëÔäÞîÌÉ„™”!óžçÉ$¹å+¿›¹÷;ç;ç|¾¼¼¼$" " " " " " " MÀŸÑ½SçD@D@D@D@D@D@D@2è‡ " " " " " " 5€€ 5à"«‹" " " " " " " €~" " " " " " "PÈP.²º(" " " " " " 2è7 " " " " " " 5€@ ôQ]í‚À¢uÀÕŸecüR?–¬‚¶@gˆ‹tj¡Îíâúmoô™ù×ïš×Ú5 á蟳½õBíšM`¡gì°Ô;k6õ>³h¼’øëéËËË“z‘x®*Q¶‰Àú å¹¸ù bœ³k1Ú7 Át³íZêÞ“‹wäo×}(¯ñ™Ô·¹k€ûG0d\¦]“6 Êëµ¶‹€ˆ€T'™8vˆ—o&=‡ãí³÷¸šØW¼¿€ª}–@ÕøélHã_ÏÁ ¾Å¸í€¢„”§BD ^íOW„„py ¼}Fa¼§ê84ÐØ!ðUuÊ h¼’8äÊ8–*I*M`þZn> ¸ÒçëD¨*A½ƒNøIUËÑù" " ©! ±Cj8«–êE@㕪_ªÎP%ˆ@• ,ێîrA*@*I€a'Kíw(Ø>hì°}\'µ2±4^©:OªÎP%ˆ@• 0áßöó_e* 튕8*í×@ x hì/)—i4^©Ú• jüt¶$„@HŠWB8ªªÐï°jüt¶ˆ€¤’€îÙ©¤­ºªýö«v5ÒfÈÏÏÇŒ3ân½­V€éÓ§Ç}¼(%òUB¶°ù²e˰hÑ"Wœô, bÉ’%΋Ÿ“-K×-ÄŒ“P/·!ºµè…Ü@ídW©ò“D ÀêO_åò>´©B§Bd%©²$»66ÅÅ|hm}9¾[õsÕæ[?¿ŸãÇ;%ÿÿ#‘Ýœ¼Üç´{³%ïÕ"„C;áKsÄ:ã¼r³í·’ùj†ÑJ: }µ²QƒÊŠ ÄGT|vüGü¼À‡v ChY˜»X“çCïVÑž„ñ—ï‘ÉW$cŒµ­cßûÐ'A ÿXâÃKº’mãbŽ‘»6-½FÞkè§÷Ì"RÀÆ1oÞ<ð=Y½z5,Xz $[–oX‚¿< 3ãà³ÿ ýÉý£NÝáj\Þÿ¼ýÇsxdéÕ1›qs›ç0 ÇY˜±|þúûž¨_ØŸ3o«s|Ú«³—•Ù^»¨.zdí“:]ˆƒw:|Yžòº~¡Ãðè–)#Ñ_N{3ŸNõã¹ qÖ®[·å_ðÄÏYX[b¯ÏâuÀKý8¸c9•ü…>úSþ;*€•žŸZ[KrvßaE8¹Gi_QW¢¹G–÷‹=LOx#û¶ ¢EÝ^Ÿ…¿ô᛿ [³VnNz=ïHìuˆlG"¿ß÷}žü%€]‹±©Ðg×ÊÞ-ƒøp`!ø0Zo]9Ý~ü^Ùß@eÚû¯¬2À³'$f)¼“ÞÈFw»F k•mMßV•6¤‹MÙ蛈€ˆ€—ÀYogã£Éå;Ö¾}f!¨LžóN6&_•v¶+eäšÔz4/UÀÂ{÷·¢qDâjnú*WîY„Sz1lZFÏóãõÓóLÕΊÆ±Îµ/c¬mkŒ™ïÃѯæ`Õ͉ãql<Ò®Iç-yö›œ°Ì‡3w)ÆÓÇÛï5ŒÅf{ÚwþûÙxóO?önÂ×6~Ž&üÿìø¹X»¸ïð"\½w1ÞŸäßê6Ú¹ÜV÷ž\ÜD®ê{‚;ò¸~Oå _ë ž9!Ì¿¼ò¹½’êÕ¶53ýœñ_ºti\'ÒÝþüùX»vm\Ç'â ëFž„¡…x´û—ØmÇ}0vþxnâ}x}ýƒè:}WÜé8´®×¾¤ªÿN¹ ÙÈÁÕÝþ[²­G‹¾Îç×&>ŠFͱ&g¾> w9®ä÷C×â~¸°ëíîWÌX=,ywÎ:mŒÂ¿»|€à–—Ïæ¼Žo‹ßÂ}ÞBÀ—ãœÓ¢~›’s“ýá†/²mv6Íë%»¦pù#æúÁÔ™×æ;äm­õñ1Y¸ÙŒWìUŒ¿ô-Fmû•g3äώ͹ïf£iBÐ!l¨j]ÛÚ¶Êë7\¶G1n?¨ôÆ0àÕlÜ><°]®Ù¾ÜŒ2ÿú>€_.-(ðÐÓó‰\¼k7Ú3{Qh÷Îv͘à(r¯µ‡^£çú0ЖÃK¤ãÍ(ÓÆ‘|âWDž“ŽïÛ2ÖøÄ&à^ÿ3 ŸO7OÂÄ !œn¿s1þwLéïm’öx:7ì[Œš„ðÉÙÈÙN=f+º®?Îóa¦ywn¼5Ô9•¯4­ÚêÖ»{ýì¹%§ «V­rfñ ¢[[¼µÒÅñâÅŽ¡ îþnÝùEy˜›5§Õ¿ÖQþ¹½_ÛýÐ~‡qʨ.øjîÛ8¬Ë‰hZïp÷<>µŽr±o§ÒmÜɇћ†áØÆçãÇÕŸáÝÙÏD5Ô÷ïPæÜ}q8ºÍíƒë¦ 0eu.Þó–’º~_6ʦDþíIyHB3Sú©p\ýY6ÞH·¤ÓUøðœ)ú|À>xdéÍ­Sãbìg3è»™•í™_³J U¨&e§®/ðam^ÙÕ“6À˜¾*úLô>\ûY¿.ò£¹y \درF™^{À 9xÚÎ¥;Þ SÄ})]ä¸ß3ÂfÛÿÊÉ…Îñ­ ~Üo3âK-„‚ƒ“ÇŽ)DÓºÀD{PÜnF ZFoý:€÷+rBâ²ÁúC¡;¢+­ŸžSàÌ”ÿ¹ÔΤPö|&÷.ÆJ®þ4Ü/z>Üup‘ã%ÂãÚñ4ê¼öG¦XhÁ.RðБ…Ø­uYn<6šؾ{µ â­FdZêíØDmcÛ›¿ `è„,s‘„ã)0ø¸BÇÍûn2#Ööðßl?ã=­mÏ_ˆ5ùÛÆ¦ª×*Q}U9" "PPiÅcÒí{sÿ²Ct{L2Þ+GP!úÛ'œj³öþ…‚bþyH! ƒ><02 «Í3î<›PyÀf7)sÌqÅÇü´Àï„îÝ%>¿ê„ç¨ÊíByãŠÿ…ÚöØçlû+¿gaêÕë ÞJ*WðØMVäßí¹ú‰y%p¦—mþŸkNëyì­‡ŸcE"ük¬A/ ?ÌÆ[gbgsǧKþ_ûãH ïäØ'™â¤êå„ÇL4J ÜµØ -%·ë>àóY¨›ÂÍûᱟsqøM°1÷_öä°sËmÜøO»QÊ»æéŸ´°°z™ò7v÷!áöy¹¾lÛ÷Ø1^ Wö· œtüϺõ'ë=º‘€Úè¶Ï¤}³fÍB<Ê?Ýý'L˜àR©ü³«Eù§k¹ ò–éyÓz-pS»gqðŽ'•ÙëËSßŦìµ8µûEØ¿ññø34ëóâódèÕjGõÈͪ>yÕ2EÊf0éÖöžÍÎV$te;òål´|0{™òv‡ÍRÓ€@¡‚yžÍìaû½Êc›ö}./Ër¿;¿ ßèŽ=§D —ß_Æ›ña)¼™Òˆqb÷pƒ¨d–WãÒ©€õz<mþ“븣²ÙaW¾0‹,ÛL«é)C³Ñö¿¹ØùÑ\§‰^Ký†}Š£ÅþÏ›2ü]–3SÝÊnbŒ™”v?>â•ìi7°iWçãy ßxÜnÔô~àMoÇ!|aqé”ÑóÃ9¾Üò}œ]‡›ÂVÑïfû%ÿÅ“ 1ùoùÎyg¾~²“ wÙuºº‘cX‰lG¬ïŒ¯?m— ޾¾OÿVÚû· 9Jp³Ê¾`í¦¼vj!2Åž cÌî ó˜yM>n2£•þ¹kÂ×dîZR¸ÿ°B̰ý't+ÆÑVþj³än0¯9íåþ6yƒ?ܲ;E±ÇêK<û¾œ™åç™«í±ÆËmìÁ±ÀÔ~ó ØZ1‹U.÷U4®à1œÈšm†‹ïÏ/À¨ ÀqÃ-6‰A‰õ>>§ƒÇÀ‰& û|¤9OìÄts^·O1îù.àä«âþX×<ã¿5û3lp²ˆ:‰W˜ª6|–çšÑÅ+ÞÿYw; U}@·GsÐøþ\Ð+—ÿ;‘ïq‘çU¤ƒD_™ï 7)qœ®þtùG‘§¡€îþkÖ¬©LûrNýZ Ñ3´† ÅÂÏg`ß&°û£Ðµy/ÓýŒmªãƒ¹Ï¡mqw´nÔ§îrÞý †þñ.Úó1Ë †Ìç§ÛàeáÐÎñbš tÉ~{bרÍóÀùN¬Z´¢'sî{ÙÔ»—ìQè¸Ø<4:àÌÈÒ¢é·çÚ5¦0rúz +xÎâ¬ù#ÿ«x㣵±Àþï²|~Ì7…VÏö·¿­r’)øÏ؃äèW²qñîÅ8Èr ì°Å¦rœ%ÏsåÛ­®"kÃa/ç8–èëífÖ × 6{œ$èÅø¡•¦Xþn<*¥,‡F’Eë}ø¿öÏÅÏ磱Åô%BG·g›|¼3)¬ü?:ÆïXʱ:Oòä3`]˜âØÐÚ{‡… 0¡ ·PæD º}99ö/Æö°ÿ›…I|jxÊ7vã;Îbò)|Ð_jaŒ?]ÏþaßåÚÃ9|ƒcn…OíAÀ™öÊÈKæep‘T>6Küëv#¾Á¬Ç|ð½|RyÞ D§ÂËdyC-n‹Æ ¶Ÿž û´5‚Yï_ïÇ-†Ûü·½ÌÑ>ÜžkÌ;á‰YΫ­ Rhˆ&44tJ‚Òï­ëG3´L_YÊ)7+äÌò÷ß1ˆ÷Ï :V~nhgÂJJû`2BžË~òZ¯²ßY¸FŠxØ01dU¯•·/ú," "Py4JsìÀ±N›-Ï´9«ÎXç8{¾q[2$žqÇ XÜs®=‹Ž³Y\ÇÍŒíNR\{.Sáç3Šymè*ÞÇòöpœ3߆ïÞçWyí¯h\Áó^¶±ÛQ‰5®hfÞ‹oüáǯzèŽ+9u ±žÇÞ¶|d.âåEèqX•±=9i“ ™cclN2P8²Ú&Îæ¯ +ýn‚iî£à‰~Œ¿¼­ÍSÓüœ1å™[¼49ælgãÄË÷ Ã8^á<´Å“²¢kžŽñÉ9¦£<0"ËóÒÀâ ÇÆü=µûR:fôþÏòX=öy6ÇÉ_uíÞEà“ãgN:y%Þã¼çðs<:Hä9•ù^ÚÃÊœ圹sçbÅŠQöDß4iÒ¤¸Vˆ~vâ¶>vØGxö—ðíªwðÒê»ñš»,‰ß8°Þ)¦´Þ‡Ú9v÷¨@Ön^…ɳ›†•ýæõZ¡}ñ.øzÅP\„²€?ƒ#qܧé}°É¿ÖQþÙå3ìØ¨C5¥~÷£G›;õÓ¹ææ“íÜ #[g÷¬¾ÌÆ%¦dþ÷¨RëíÞ¦¨iÊô¦ìQ9£ë90TøŽßÙ¯ÌÚÍl¤,pf¨/²ó©pÓ˜p…%‘aÙm•ÿ˜‹¨ÁæêÎ;ágÿïÄù»;‰óXfyu=c³åt#oVmμR8ó|”î6Ëæçç–Þ éRŒ'+íï1vóëgqTüÀ=Q܋¥Åÿ—7‚filkÉ‚®5c_\Ýà?£²ð3¶`¯ð¦Î‡³÷Ú£YsÖ„ÿÕéj®dfÈ¡{”)—CO-À+ãs±Æ%Ãmfâ–Â7qºŸ0WÀÒ[-§óÍ*L¯ÚvŸ«¬òÏ›"•ø}í÷°oû0;æ8÷ý\ùi6†]Ê×íÛ,kϯ6hênF¯ÔïY:Xêfר+ä@¼ÎGu±§Iî<(z€&WöOû=Qɧw÷®ð·úOûý³‚-ÌžŽÉK~G÷–}JNhl‹CšœZò}eÞ ß4O¼/´ý¾d{uùÐÆáÛ ôŠaœÖÓÆøx…D—˜G—%*û^id³ïïOÎ2@XÙ»Ì,…T6/°‡Qf‡u-²Þó*û™Ký1¶ç6sgcq<£,Û)]Ûè^Fkä¿l%Ư—'t‰§%–7¶9Ç”¾f¼xôÇ,Ç3À=—¯ÐÐÀÕ XÆ=‡x÷TîózãÓÙ2’z33É=î³Äu|yg ZÚƒøóeùóÞ¢^øÍLÃ{˜«9Ýú¸ Ì@CÌ´•æŽØ.¬|·¶Yf1eEWܺèæDKeå-›™ÉÂ=F\Pª”3Ày}‹,¬ÀF Q¤íg(ÀGãÀ² ®,4 ¯,´ßc»Ž´ð³Ñd`¯b'¯A´}ÉÞv•;è­Á‡]œxî·ð-™nc§õ¤'M±ó{ûb¸¢Àâ¿—5ø°±Øð7\•k•l*_D@2‰@¶ÝÂo6¯»HaˆWº$žqDݲ“—1›ÊYa†h2_ëUÉU£*’Xã Ž ëoC"ëªh\ÁDn”åöl¥Á‚‰ž1–ÀãœXÏãðÑ῱ž·Õu¬ámyŸ9®äÒãm‰@¯0…îñ/R¨Ô»B–_Î,ýîì_Î Áϱ®yUÇ’n*ó~®y0´³ûô¦Þ¼‘îÿÑÊfH@óöp•÷˜Kv/*cˆ÷8÷|÷=„cùªJôQqKmÞ¼9¨Ø7j´å×£¼œœì´ÓNèÒ¥ rs« UĨ£¢]#g}Ž[‡ÿµä°z¹ pT·ÓðÈïâ˜Üó1%ëg¬Ú¸¼dy¾Yõ&êÕǔͿbìúáÎ+/´ÉföýxcÊãeNkè€Ëöº½äuÛOàó˜šõ+f.Ÿ\æØêòå¯v“<Дۿ™âÂc¯0³-å:K>Çï‹ÇÒ=Þ+Œ§ò¿ƒýˆ©0'ChÅ£×­êŒ[šb±jtѺůqmÚò„}¡‹ž·üLåŸâ]?5šá‚ÛÜØôòêˆw;oL´TÒó‚J!…–Ê—ÌrYÏþ]zE¸àk.ü|½k.[”UvÎlù ³Nºr‚ÅjÝgÉýöÙWÆ5é{ΜY[î§YØÁSf0qëd\"Pï €[Þ¶¾3db’µ‘ƺRh½Ó’áÑAqÛ±q‹3-ë?/ôÃÍÃÀßCI;é Wpó/ð8~Ž·®$Àh/÷Üt¼³í½[Úr£öàeÿé~FÏ 3ÿža9h•çþäÅ(?‡+Å&\ªþŠ€ˆ€$“@® ®´ÐºÈsܤK¶uQQ;™àÏ&רÁdnœdqŸQåŸÎq3¹›ë¢Ïg.ãÿ×Ú;%Öó8|Døo¬±HUÇ ¥øŸ3¹¢A²…c ŽÁùbN.æø¢â9çøƒãþÚ„¯9Ç„^ÏPŽ99ø‘å3¢P‘v?ó{2¯9˯¬0|– ;92>à(ôñx¶2T‚Æ’H¡Ç0C]‰÷8÷x÷}[t÷œÊ¼‡§›*sf縊=göçÍ›Wa"À† -ߌÌÀ•âÉPAâÞ],ÄwÅoã—yçav–9¯Y­6€Ý Ü%ùÊìô|™°x,gÏÂõ-ÇɽÎóì.þüü´ù+£Øf,Ã?¶2lù²ŸåxÞBf¯™ŠÎͺG;$íÛž2wwº¸3“jSN]qÝľ²µ59S)^Å‘Éf˜O ŸÅ|3¦œ–WÆn%B˜Àã8KÆñ‘)ü‘Iò¿tÝ>E8Ûb—ÆY¶Òö;lѶ"*f_è"4Ô<¢ 𮕔IóÕ.Û_nk¶ÅjíümÝ6ä”BËΛNæ ÀX£µ«Åý,l‚1áðc2Áv3ƒëÍ_‡oìŒÇb¦~Wçÿw Á¸nŸpÿ™=ÿJKès§g™Á³- Œûçö´ž?vl!è]QU¡ûØ[§:Yc™,†æÅf b¼ú#jBaû˜ñ¦ãù¶.m¡“UùE‹c˜K>{×§¨L–†›ìùL®‹ÈЧ,#±»ÌKÏæ¥ž Um¢Î¿bóD±ÿZhÔᲕÿ°ÿ+&üÀBU¾5+s;ë ãÃø¼ÿ³ÐZéùŠ—Í¯ K $‰j·ÊؾT8ŽØ†îp|Dj×'s±N{—ЛŽËûžjÆêò$Ýã ÆüŸgž§LÚÌ "Žù¬¥ÄzÞ¹´OœñŽ5©ÊXcÖ ô *z;&r íz¼ô›ybÚË•m¾–a†Ì)ävñGÙØñ¡\Ç£ãÉIËÃê#ÇÕsrå© >‡ ºž‹,'™×<²Ûò/§Øo•al# ôŽG˜„›ãüHáÄÃ%\‰÷8÷x÷=Ä=¶*ïI3¸¢@ýúõ¤€Ë–-³nYeÉ=Žï~3´jÕ Mš4IiXÀ>Gó©ípÇ„A¸bÿqxדÌ2”‹3?Ã{+ž@G_/[°…·©[}:ùqÔ.ªƒã{ž³Õ¾mÏÅ¿]‚O'¿‰=nµßÝкa{çã² ÝMÕî³ÛŒMf OÏì3g¢©ŒÒ ¼O»Ò›%-™g¼•ã$‘£‚GáÒqÌÄ:Ö’±Œ°ã/û(`ÊŸßQòªÚáÝZ…ëàlj¤€e3†âs6xþÐRÿ¬å`b”¦ˆºÂØf¿gfzWÞ¶™ö›·ÄÍs­ÊL2Àbí%|à0‰"]öiQldnã Ép…7àwl1cÛÆÃ,~œ+}#k?t^¡—÷x*ÉÞï<–3ð÷[®^ëuV´7¡!“õͺ¶´>oÙñ~>ļã.+p2!¯2å–Iu¨ô{å+ËŽï•£éÌ®á~55«4^!ó'Ž-r¼È$r¿÷Øò>‡c0K¿åïö ·—Ïéœ>A›ÙÏw¬ï  pE—}Z‘ß?«ÐÙGcC;¼Æ—xÙ$âZ…[¦¿" " Û+ŠÆ=š‡°ÄV£q…Ï ÈqÁŸW–>“_µq—æøÂ}v3‹;ûKáÍä3[/—Ù}%©#pº%ÌKör~©ëj¨).´ñ•‡“-Ï΋9Ψ)ÔÏêIàÃ3Tñ‘æ¡ÂÝ—† ÐÄñ2•èæœ0U~çrÎÛƒpÙò»mb0žänhøa/° Îã-ä˜Â|f ³9áµÒIàxsËuß·Eqϩ̻////-šJAAãæÏ€ñH~~¾s<½$ÕŸ]cèræ.)“Ž3ge‚w–®3ƒ—*¡Õn[„ R˜%4rÖýuËØ~‘Œ͹>ßâãáXyc¤E¼2R÷žÜ¨®_•)«ºœ“‰}rÙfjß2µ_îuÓ»ˆ€dš|Ï®É}çoXýOÿ¸™¡¹ ƒpWH(ïÞïq‘ç—§ƒDW™ï)õð6Ðuó÷n‹õ™+HùE¨zíóÆÅ¤«et¥f;ÚYÞ‚Ê ½øŠ%ôˆÐìs,BÚ'" " " " ™C€!5|U$ñYN<:Hä9ñ~OI€x£ãD@D@D@D@D@D@D@’C@€äpU©N`_KòÂI…NÆöDtÕ§ÿÄD`TU$ ßaêtH!ݳS[UU+úíWír¤- jÍÖÙ"^\‘¯D‰ßÂXš½ID mø;”ˆ€ˆ€l4vØ>®“Z™x¯T©æ«ÆOg‹@B´¨̵µV%".s·$îLWýªWD@D`Ûhì°m¼ttfÐx¥ê×Q€ª3T "Pe»¶âÕñúw¬2HPi\¾³]ÃÄyµTº!:QD@D .;Ä…IeWª~APu†*AªLàÑ£ Ñõ‘\[¶Ð‡›(v1ùT« ˆƒ=Oh|2. Kþ‘Ç:DD@D :ÐØ¡:\µ!U4^Ii_^^ž¦|ÇS%‰@¥ l(Ž=ó×ú°t´ÿÌÿ;õZi¦:±|L Ã¥2[Ô8‹Äd›å¯=" " ÕÀzÏØa™;vV¿vªE"PY¯T–\ùçÉP>íŒ!  ãŒ¹”ꈈ€ˆ€ˆ€ˆ€ˆ€ˆ€”O@€òÙhˆ€ˆ€ˆ€ˆ€ˆ€ˆ€d 2æRª#" " " " " " "P>Êg£=" " " " " " "1dȘK©Žˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ùd(Ÿöˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ÆüøãûÓuDD@D@D@D@D@D@D :_(ô[(ú.mÈ È”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 2Ä€£]" " " " " " ")dÈ”+©~ˆ€ˆ€T’@(ÉçU¦üXçÄÚOWÜó#ßÝsÝíüÎÏîw÷=Úqî¶hï‘çE;&žmn9|w?ÇsÙÖãã-Wlj€ˆ€ˆÀöE °}5W­Ê0%0TÛ^YV€ÂÊR̼ó|€¯ ü‚}–ˆ€ˆ€ˆ@ ƒ/®º&" "P)zå‘©yÛõ[¨y×\=šK@!5÷Ú«ç" " " " " " 5ˆ€<jÐÅVWE@D@"øèþm¯ÃªyX€ÛÖ`0¢ž¯þ-výTõÇmÜùk[ˆ/O›âùè–ãž[ò};¸.ñôOLj€ˆ€ˆ@5! @5¹j†ˆ€ˆ@* PñÏÇ܉31{Á4éÖ]Ú4D-¦¨v¶nÆ‚és1kQ!:÷ê„VMêÂôjÙvŒ3fü> ã§l@Ïýzc§6; @…:Yâ`ý¢™ùÝ/˜8o @Ë®»àȃz¡Mc˵ËPQÒ&¶; ¦ÌÁ´9ѾWtnS §ÌÆÔ9ìûNhߺQrûQÒ}Ì'àšì3¿§ê¡ˆ€ˆ€¸8ÃZQ߇›Oº ¯Ž]Œµ›M¡¶ÍÕNœ¶®Ã˜‘#pîáwã‡Ù˱±8âñÍc‚ëðÛo¿âô³¯À/ Wac0Y±rýøãÓ÷pç÷âá¿ÆŽÂGý€×?‹<†Ï_ˆ<3T(N»×cÂï?áì÷bôÜåÈ nÂä?~Â@û>jÖlEôµÂBu€ˆ€ˆ€ˆ@yôT-Œ¶‹€ˆ€d6s—϶Yêü‚å¦ÐÚL¹Ï;£îé:•T*³e^®ríÙÇã(>{´:ÇÚ»{]óK^ž²ÜsÂgn9Ƴ߿¥¶Õfó ¹¹äd™«‚Û–²—¯:¶íˆ»o¾ ›ÔC.Ÿð%uºmÚRv™zí\·,·Ýîû–êÝæ9ïþlÌùn$Þ~(¾±k[tÇå7_ˆ»¯>Ý›å`ÓÊÑðä˜:se¸~žä´ÃÛ¯-lØnÛ—e1¡Í@1ñ…¿ò»1²JÎ Ÿã\¥hŒË4R_D@D@D@¢°§±DD@D@j&Wަç:DLÙ ­žÏÞÿï}3 ›MamÞ®#Ž>ûì×­5êäͲ}£ñõØ Î¼æ(ôíØ y³~ÅÇŸÀ¯»â²söEçV!Œùø[|;݇=»æbÊŸSðã¸YhÐc\|Áè¹£¹êÓSßo3áÃGàÍ÷Æœ5yÈnÐ'üõ8ºk;ÔËe ýèëÛ€_>ÿ¼½ 3,$ ·Ë~¸ö’CнMc³_˜j\XŒâB;Ò<ríØß>ÿ_N*Âî;×ŬI“1ò—™¨ß­?.´zwmßÄ\ë휢Ö¾¯ñÊÐß°¢þN8éÐQ°f9&¯iŽ¿œ±7ºµoTêÎOÅ;o.ÆMŸ†·‡ÍǺ ¯Ä°kGïÎ;X¥ÙØeÇ&hšw?îyá≠ ºtnŠ:š0uÔh yu8&¯ÈCQaö<åœl´j†°wY%Ö‡<²|µQ»V&…qÆoE·ƒ1ð°]ѱE=,™0_}ü¦î°7þ: Ÿ…;Ô±6–cÀ §¿" " " F@ý D@D@D ΂o˜W†|ˆg‡ŽÃ†U°ª8mÌǰçá…ÑW¢½ ˜?{ yrúÿõ@ìbîê—,ÁôŸGãááE8óäÝ­ä.\„/^û#šø°xáZæÔFÃYoá²¼FxõÊýЩ 0òaxþqSj ò±b];4]Š_N›ˆüwoÅIýj!`“þõÚ×èOFcÕÒ Õ®Ó^Þxé’ý°SëB,\¼O?ü5ºœzv/`ÉâÅøüåQÑ2€¥‹Ö"/‹F³ßÁ•ù ñÒ•¢kÛ"|ÿÞxâ¡/1?T€UëçcÑô¨“µ_/èÇöFJRüÁ—…¢e˱zÑ|L.n†ÏÜ :6³iûp®6û†›{€ÜÚ¹6ÈØˆ±}gîy㲊°ré&ÔÇ’‡þ‹Ùë¯ÂͧõGçf¾è9C…ùk#+o–Nüw}ÕïÚÁ >Ìœ>¯ßþ<?´‚ìhWOÛD@D@D@¢0S¾DD@D@D`k~,[Š¥¦àÿ¸®/þ¿ÿú ^ýi޾ýfŒøú\y\WLšožãcõÚû^0q üýOÆÛ_?…·<{4ÛŒŸ^Ÿ„5ù›±nætL;ƒ¯¹Ÿ}y?nØuV.Ch-]ñ­§d÷ëV®Åš…3vfth\ i™X7ß¾ý¸ïE<ýüÛxøáwñÓœ•X9{*Æÿ<Ïý¾']{-F Ÿ<~é‘…oøSæ-±‚³àF:¸µ„ß‹QXèCç®­Ñu¿ƒà;37lBÞºX½t¾Ä^л9Z5ËÕìYpú&" " å@¹h´CD@D ¦ˆê<,@N§þ8ïÒÚhÛy>}êY<³h æ-ZmZqÀq¡+«{i•µ¯‡l}:âªc»¢yÓVÈÊ­…jÀW/ ³lX¿ëVÍBñWàÄmЪmœtÁØ÷¸SáoÔ ÍëmBqQ1¦úúâ†#wFËf­Ð¨ycthÛ> -ð»± Ö„¬- ¿1 pÅ1]вyk¬µz›Ô1cë5CÅfS¨×-Ÿ‚à™×㬽º¢S»fhºWoLÿs,>z)L%²…æj_XlSü«fÖ°½LÒ·yæÍ[]„ý{ÔÁÂQEèrÂhnîÿë–MGððSpÔ®íѲa`·žØóÀþÀ[ßcÅæXkJ= ¼ís°¨µZ´EÛö=p0†bœ­ØÐÇr¬ž;ÁÃC—fQߌ†W"" " "․CD@D@2—ÕÜ\SèýTC=Š4|ÙÈŸñÞyõc ýfæZàø=¡iq‘ÄWrjv¶ÙQ¼Ò‹¬|7Î=·^ÔjÐXdÅXÌW¾BÓb{XÌ|nŽSvýÆMQ¿q‹­·v[!îþÐF„èU`¯P±/¼Òžå0,/! *2›½£"Ÿ[§6r5·z­0§^k“%ÞËiVß’ Z£M™¯U'¹umV=ª„Фy4ëÐÕÂ#>ÀÄÕÐÃ’îШŽx#&:Ÿû 7Œ˜éxDd[y~+m!§V­p‰µk¡Žµƒ^ëíA‡¢kûÖ8â´ñшßЦIæŽù—{š´4†,…×͹vÖ)7€»yø"ÇÕ`Ëwn’ˆ€ˆ€ˆ@ #PvŠ¢†u^ÝÓ W¯]k³ák±iÝz¬]c.î«Ö˜âÄÌ)K1í§¯1²ßYøfè½xì®3phŸ–¦P¢ÐHf¬÷3W@h 6lö½ó­Á¼™k På.+î3lQXm¿)ª¡ eîË® ÿ‹?`öƶ1ˆ1kzŸŒ›ÞŒU‚ÈÎâ#;D½=¦Dî/óÝêò9Šr¸ˆ-µ›¡èIsÙŸ½ –8pæ¬ùøã—y¥íóÖ*F E+4iÑ=,Iß}|„‘¿ÎF~îhÕ¾! ׮¬?æÚ¹a HÐÂ#B¹õáíWÌ^µÎ’üç¢`yQL›nÇ4° ÿö¶¥ü2íôÔYlmlÖ¹ :î»?~>_Œ‹~<‡woŠ–YyP,[Œ ?ýŽß'/Å:.çè/²ùóðóè ˜³Äê5#JpójÌ™2cÆÎÀ²U¶Â@ô¸OÍú(" " ™G@™wMÕ#8 ˜Úœûa⛯áºsÌ->œnóâ…è×}8ps6i‹&3þÀoÀ›3gàÇ1ÓLçÌEN „ZÍ›¢^£ÆèÛª!^~h0~iÄòù˰p³e¥7Ý´Ø£®çØgú”Îz›¢j3ÓùææÞ¼[4ÙyWÔÛáO<üïWðU£<,›·C&ÏÁàfµQ§v¶Ë(´s\eٙض2Í!¿Dœcì›[O™ïM0Åö}‰}™e l’©‹n– p¿3ÛàÍdžã¦;£©]ØwŠß—‡53æcþ>v<—*4 nƼàX3a®…ÂuÆ|ù380ïcï$" " "PsزÁ¿y†<5§ãꩈ€ˆ@M#`»Í‡8CM ™m .gµ=nñΛZ÷gY¢?˨*Ü„å+×!¯ØèíP¹3rò³ ÝVذk6ÚJµê¢~€£|óá°ýtsg= )Èʦ—Õlšn‘ÅüíÈ@¶e çÕÌÛ€¥–eýÆBÔ·ÙñÆê!×´w*ÁE6Ã^\leX™,[W X.Ôû’zÊãsE;ÇÊ˶„€X³¿ü1 g`·vÃ.]ZaÞ·Ÿáù‡îÇý-/ß·ŽžLIn­(“A°h3V­X‹µëó¨×ÐøÔ‡¥0EÞq[ Ë:o ;=+yÜÚÍðåÔC“Æ Ð ~ö–ä…¦ð[»KÛY¶ÝN¾ZÈŸÿ^{ñE\ôï ûþb¾G'dÓb`4#J )¶LaÀê´ÈŒ2e² ZÂÌCÆœ×Ŷ9b}ùö¢Í&È\òÈÜk«ž‰€ˆ€Ä$`ÊwNÅA_N]4oi.ñ&ÞøùpÑTóýÈ­ßÀ2õÛg3$DS!Y·&ŸÅ¤g纆ˆpI,;«v}´jS-Miö™2ë+Éîgm¥â_RˆíRFÙc,¹ åÃä‚¡u˜2v4î{mv>š±~ÅRL³»]Ù'qû¸µpY¬œ:6_Û’ñ9]/áSZ§gýògÕBÓæ¹hҌ߹ÉËÉÊ)ÓNo»í`Ëò?ýûOñú¯á‹Éó°×õ7 m‹faQj”ð›A$Ç^^‰,“É#™{×g¨ J†5¡³ê£ˆ€ˆ€T†ÀÖŠÿÖ¥ÄsÌÖgm½ÅQŽMA¦‡BR…‰›tÇ¡GU‹ßÁ oÁÈ‚¬YžKÿó$®?s/tje^nVýrno9;=›ã=ÎsJÉÇ<[&qΰQÓ~ Þ;¾º´­gí*5”¨" " " 1 ( &íȦP— Èœž±'ASˆ mÑ?s½Ï¶ÙðhžÑz²óè>ô(úŽwÍÊ—z D;3uÛ‚ÅîPdié%a}£›â„. HO•$" "P È :_µMD@D@â$à·˜öÜ ÀWóßR.—2Ì.‰‡÷V–doU|f>†œ²þœ¡Ý" " " Ñ$Ò„­|mHmTþSÕ,Õ#" " "P=ÈP=®ƒZ!" " Τ¶´äT V" " " Õ€Bªß5Q‹D@D@’BÀ¿Åzƒ/‰x Ð2$׈>‹€ˆ€d&2óºªW" " Q TŸ¸ö¨ÍÓFH"…$®ŠêB@€êr%ÔH"’WE‹€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@u! @u¹j‡ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€$‘€ I„«¢E@D@D@D@D@D@D º º\ µCD@D@D@D@D@D@’H@€$ÂUÑ" " " " " " "P]ÈP]®„Ú!" " " " " " I$ @áªh¨.d¨.WBí$ ‰pU´ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€T2T—+¡vˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ ÈD¸*ZD@D@D@D@D@D@ª ªË•P;D@D@D@D@D@D@D ‰dH"\-" " " " " " Õ…€ ÕåJ¨" " " " " " "D2$®ŠêB 0l؈êÒµCD@D@D@D@D@D@D I|yyy¡$•­bE@D@D@D@D@D@D@ª …T“ ¡fˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@2 ÈLº*[D@D@D@D@D@D@ª ªÉ…P3D@D@D@D@D@D@D ™dH&]•-" " " " " " Õ„€ ÕäB¨" " " " " " "Ld®²E@D@D@D@D@J 4¨ôKš> 2$M5«Zt ÝW@õ‹€ˆ€ˆ€ˆ€Ô(Ó§OO[»té’”º­îø6#çø°x½ÅÅI©F…Š@Æð™o¾ß4¯´k‡ P?'ñÝ• ñLU¢ˆ€ˆ€¤ŒÀºuë0kÖ,têÔ 4HY½ªHD@\Tþwœ‹µ›Ü-™ñ¾ñŽüÌ舧uïÉ…úåR ?Î]Ü?2€–äbÚ5ùh“àG» Õð¢«I" " "Wù/**’ `:F¶3»ï¾;ÜW¿~ý¶jýرcñ믿–¼¶: EnžqʊЩ؊@ûFÀÓÇaÇ!\óY6Þ>£p«cª²A€ªÐÓ¹" " "&k׮Ŝ9s°ÓN;aÊ”)ÎûÌ™3ѱcGy¤éš¨ZH$K/½—\rIÌ"ià‹Ç <O?ýtÌ㓵ó‡yÊ+ž,¶*·æÔ;ˆWÆ'^]×kÍýM©ç" " Öq+ü@IDATÛ)Wùïܹ3êÕ³`A¾óûìÙ³AωˆÀöI€3þãÆ«Pùì<ç§Zé–“j䪯hß(„¥ßQÏT%Š€ˆ€ˆ@ÒÐÝþüùÎŒ¿«ü»•ñ;=èP¬ \.½‹ÀvCà¹çžÃ³Ï>[¥öò|–“J *á_*q«®D 8˜øÎÊx¦*QD@D@’F  G¨[·nÔ:¸}—]vAVVVÔýÚ("P= Piç_™Ö²œT*ÓN#"›@H€Ø€´WD@D@j¿?¶ý¾¢ý5‘ú(Ûºí'JùwûÍòÒàÖ¯wêI ñYªg?Õ*¨–ªêö_^§Xnß¾}ËÛ¶í=[„в^È©¿Èf8ç®ñaÞZ‚I˜íLW'¿šáG¸‡átn_®Ì] ¬Éó¡w«Òmî>ï{¼ÇyÏIÔçÉË}ø~Ž›- }/»f‡v ÂgëÔW$ùEpÎ;b§ê{A',õaÑzhD­ì²=bGÎõÛò{!ôlûú”=sûø–À´iÓŸŸ^½zEíõܹs±|ùrDzé‹çWµ”Ò\î¤mÛ¶hÑ¢EéÆ~š1cÖ¬±#„k×F«V­Ð°aȽ•ûšì¾T®U:KD@D ×}Àà_²pnßbÚÙ?ñ ŸåI´Ù½m=¾¼²Ïz;M.ëiÀGx{üÚ±÷R„¦Ñ£Ê+²Âí#çøÐ¤Ð#\v^86mÚ„ß~û «W¯F“&MЧOÔ©c?Šj$óæåå%l,ÈlÿÉ–Ÿ®ÕÊë× ûaS¼f®òÁo÷&; Øíæ¶o²ñúø²÷òʨîÛOz#Ý›…аPl:äK|èÚ4„ÁÇb×–! ›–…ѶzÂë§Å^â-ÞãÍã¾ï³ðä/ èZŒM…>üw”½[ñáÀBdWa¶rpÒëÙØxG~•šõé4?~YèÇoý|­RÁvòÿ~ 8¿µçN,ÄY»–5T¼;ÑK>ÊÆ9}Š1øøÄ×]Õ¶Wõü„ªÚˆêx>Ý'Û·o_¦i|(ñDA×®]Q¿~ý2ûõED@D æȳ1Ûfadž!¼=1 ÿ9¢õr“ÓÿhŠ~y5•wl,Ã@yeåØ(ብƒÓEë|>Û!ã³0q¹ßþµD#”WtÔí—œ;ñø€ÌpEí°6–!Àe,|ðAlÞ¼999Îä[^ýõNrKüÒK/9+^œzê©eÎöeÅŠÎñGqvÝu×h‡ló6&á|ôÑGDœ|¯ªðÿµ¢¥þªZËçÿeîU­;ÖùMɨ®ìgÿûo^ˆ›²ñåôÌ0 ÃùèñXŽVÒ?V(ýÕy[äÏÓ§OGãÆEš¡t£ªU«Ú´iƒ ì×µEÜ¥Ž6lØ€ÂÂBgÆÇD®y¼dÉçAÁ‡³ ï¸ãŽÈÍMìt CX¾7”…… ‚ë2³Í´V·lÙ²dmf¶·:ö%GmˆÀ‹ã8´s{µ a?se}á·,œ_MgsâëQüG¹S1†þaƒ&óØÃ¢\9½doÚim«e£‹}Ûñ6ûÕ~‡p¹t½Ý»?Í÷ƒ1¿t…½nï"œfÆ„¯gš‹ç·'øC›g²»Íåó0ãKah‚ã—šwž¹ iq¥·XT¡j¸fýÝ^pr¥  À3qœÕ­[7\vÙeŽ÷%'_þõ¯aÙ²eŽBOãÀwÞé„l¾üòË`8*ÏéÙ³'Î;ï<ç¸gžyÆéú|€yóæá/ù‹Sö[o½…1cÆ8ûöÜsOœ~úéÈÎ.;€Æ¬Y³fàkôèÑÑvWj[ªóTÕS)ž“~[äÇ_ÌíšÒ¬nǘ‚Æ{ÇÐØ"A†œRˆ¿¼— º†dJÿ›æ1ð¢)οš›ø^;ò~ÂÜÕ>»G£ƒ}Þ­uÈ1Veß§®ØZ¡öTôÓM ~Õf–쾯­¶øÿ…v¿¤|fý¹õ›^;µ½šñؘNy33¯.u¡g~„K†0ßr%¼sFÅnøUéPGcÇ{óQCrœk@ϬƒìÕßžw®|gJüíÖf^Ï{ô™oçàkó óÊ&ûzÌ«9¸ÍîÙ<– ý@3üdš¦uì~þJ®îÞGeœ¡Ýìùp®ýÜXüÇŽ-Bn´V–yJb¼öG–chb»‡üîÇi=‹Aøæ-Îh_š’õ§ÙxÕ~ýÛ1Ô¼ÿŽ66^‘}ìY÷›…÷ý¾Ø‡>–ÏËö½ü{¾<7Ìáï_œ\¿^’ï¼²ßoãÚÀe{&Ñ‚ã½Q>—š_¢ìLÖ¦7:7f*ÿ¼‘R©çzÅ´èºëó}òäÉ bß¼ysÇŸ7gÞà#…–]w;gé£O÷±I“&9ï‘ÇWå;•|*ü®û?HS§Nu@ÌIÀú¹ŸíY¿~½SUuíKU8è\¨É8=ׇsv ?ÀÏéÄ8› o€š ŸXì*¥ýÉëmvã??dáäA¼lÿ<´?Ù,×ECIÙhã ò˜ðê±c ñ¼Å\¶©ÂyïgãÇy>'ÑÒñ;£^N8˜Ÿ™|‰ÂÜ <2yÖ“Žpª Öž±Y³mÀ%É,x c¸é¦›pÿý÷cذaèØ±#Ž>úhG¹ç~N²pé°Ãs–º|òÉ'1kÖ, 8ƒ ÂĉñÎ;ï8ÇôïßßÔ½{÷’Dx¯¼ò ¾ÿþ{tÐA8î¸ãðÝwßaÈ!ÎqœÙ1bÄV/ºÎsòçì³Ïv^;ì°Åª•ü‰Îü_^“RUOyõÇ»}“Í–F*zç™Âôí,¿G‚Å•`÷óL9£’ÖÈbì©drVù0›a§PQåL2¼Q˜¼nØÔð}ËÙ¢?§¿•ƒ¶ÿÍE«s±×39hg÷Ì Íõ?Rž3òe{9!P4tÜz@î?¬ÐbïÃG2‡ÀZ›™f ~²ÂͼízÉîåœñï`F××MAæì7=˜”ÂP†K̓ûé™ðý‹ð§%Ö‹4´|4Õí~Îû:¿û˜}”Í®¿f¹>œâw =ô.ÛÁ”bu>°þÑ0ÐÌrÌ´´hëºö\ ÁØì{I‘A½‹ñªõÂ~ð3·y…ž)—›Â~¸ŸëÛÜòE»;†*úl߉æ™òþäp?Ì 'd.Îþ¿dª;*rr\°_·üÏMýoÑÛŸ$ØR¼Å—ÿ™3ú\§˜7T c½[O¥¹Q£FŽ€®[\ëØMþBwü 83ýnÉT¶¹žŒËw…7ç &8ûè¶¿­BÅžåºÂzض >|(´DÓØÀ¾°¶“€Å‹;†“ξ8Ò„àŒS}t·e&çÄîŸÚÜ2_°íÿk•9ñë…6X{ÏÛ®p¶ê+›­ç@{·6!ôµÙ˜¾°ÙÎÖPñw…½Ÿ²"….žëÌ•ôŠ=‹œðn#;ÎôL_>·{3„ÙìXK2uÓþáÁ—ã:ùe6.±ÁÖ*-{o@ùr~0#Ì~í­’Œ pâ‰'¢S§NŽÎ1'r8[øá‡ãÜsÏÅþûïO>ùã|ðÁNŸihÚ´):tèàŒ9fäÇi{íµÞÿ}ì¼óÎN†Pùç9Ç{¬sþªU«œ2i@ Á!‘‰¥íe=²íÛÛw*ÈóÌÛ×]žß×nv1¥ê΃ cᔈ}*“T,y?ZºÁfÕ§gáS¤y¿æŠ?[ØRªåaó‚ÚÓî•”Vfô¤²Mæ˜×ÂÀ^¥÷²€Ý:zåÊ'¦D3iâ$ËÊO€š”ë“È÷ æx@e}_»¿îÛ>|ïe€sßÏÁ•6>ììB'ãðÙ<øC©:É„Žl_K~èÊ,Kôø«È»?VÖ+»~O{~ØAœí÷ ½ R){ìN@9ÚŒÑEAê˜m™ž#oN(m¯Ï™»”5 ô´>ÎÙò[ØËÆŸp÷!Àx–}§Ì5¦BbÿçË^øÚi¶_—^±Ò>¦ävWùg…´èR\*Útãw•g§ý¡7]ý]á͜ƄvíÚ¹›œ÷@ à(â|TF¨ðÓûÀ+tKc›Y¶@†PÁç˶›í¤ëºûâ¶Iï" " U'À™'*ª'™ÒϬÕEö½¶=M˜«*Ýï?¬uÊ>ë«^išJÈ·Ù‹A3íMlVæ›éçìÔ>¦^vud3¬~77Îa6§˜ÑF6»sýçÙ˜µ*ìÚßǶ}dƒÈX2Á KìQÜÅ»Tö½Âò8ã²ß–Á©wŸ>oÊq0_y啎7%•qÎØõÕWŽòOo€HáØì¹çžÃ¢E‹¥Ÿa£åÉÒ¥KriDàË+Üwà 78û½ÛùÙóEn×÷Äh^UßY.W˜gÅ•SÍ%nÓ‡¾”ãÜlq.ó:*=€žIÿ²û/g‘GXc-†~×Ap)ºOÍ@ceª…3ßñ(ëMlfxéÆÒ{ÝÈ…‹¶x ìÝ.ää_¹ÜB!.–¯þR´q2bNÎ\¸ ôÞÎçõ-Â]߆µ×ÖÖ·«úã/¶ Ž+Töé½ÅU\icç1|À{¿_fÿ¦4¼;) Ë<ýæ9T i°ñ†¸e%ëÞ|LüWh€ÈÙÖÙÂÚÃð6¯,´…ô~ °›Š|N¸ ‡ßþ]¶Ú²Ôå4 å ç…a K7”-+¼'ub¨èÆÈÙtŠ÷8*ѱ„Ê4ëHá,»·WéŽëÏmTäùppgç#Ë+ï;—ü£÷A¤ÐÍŒËÒ`Áö±l>´MhœHw_¢µKÛD@D@*G`˜ÍĬ´DG¯Øàˆ¯Ha†äA}¶h¾‘;·³ïumÀ2ïºÒ6l\ R~³Ù,c; l,¸³ÍèÐuö–ÄJ)*ñ剻„ó9çœSâAÀÉ®ðļQLBÈ1^¤ÐÃàâ‹/ŽÜ¬ïU$ÀYî\Ó%ù_ÜÖfþoÚ¯Èqõ>óí(7;†Þ40Ò(H¡û9…†X ïËô6¢RzóW'ûOËÂ\#·Y¬zuæ`hÓ6ËÌøp攡"ùws§43Ï@=pxú>•‹§,¼.éÉ’C̈r£Å®ÓÍŸXYƘ^oN0£k»ðóí´žAgÿsíçò­ÌåÂp°±¶r€WŽêRŒ›ìzŒ2#.= Ö˜'ÇJðºå;`>îûÞ 6œù§«ÁüxQ¸Œ,ë3CÈ’-4<õ{:× 3¹÷­ Óg˜ñé_#,/ƒ… q_†®q,ðýyáÆÑN[,ùßNƒh½%¥]ód® ûìÜûìY4•øï_œp¯Ç\²ûY~Bþ¨\óJEß«œ»•Q ÞVœÇ»Þn9|ç6× ÀïnÒÖ)ÜÆöTdlˆgëg8{ÐÚ\f)_YR)†D ‡’Ì ÀœPœá§‹>C)™Š9gÿéUÉ}Žû˜,a£®')'{8.ûí·ßœÐLæiâ;þ›3gŽ–IW~†…²LŽÛ8F¤÷Ç•Ì9Àñ‘Âí’Äàx|ÑÕ|¦)~tÑßÝ”0*òÑ„ç/°ñi–ýŸŠ=®˜ ðqË+rŠ…QçO£âhK6J¡QòF3,x³Î;;ªÙŸKMÉžf! ÝÍufŠwnăGl}_lh?ÏGŽ.tò§cἯ&CX.—d¼Îú{¾  ¹%d\l÷jzS°~ÊÙ¦4O¶„æÚÏv1¾9^hØñJ sò~Ñò¾0|€÷l2ÎëSä¸Ùó¸g/Ä9æiÆÜu²CN‚W&{¥ì¹cwYýõïÍŲ›lr¸‚ç‘sR%þPaß½MÐióD ½hÞcp®åœYnž°¾öö<—hDxd´­b`ýñ sלÿå‚x(×éc_ s»ÿð²ÇxOÅçÒ'sj£"Ì›'cÞ´½Â0­ºnÒ<ï¾XŸéþOw¬ÈÙ{> ¼Â‡¬Ûµìr?ÛÃcÝýÞsªòÙõJp l'-Ь^®°ítCëܹ³ÊPûâ¶Uï" " ñàò@NæcKèà ɑ2nI1þgn›u÷Ä@F—èïéŒOf²¿63ĤU®òÏþM\¶eZÎ>nkzÿû‡>8«À(rÐÔÛr%ç7–Ü«<éÕ"ä FÚ ~Ÿv¥³]\£ú K®Å¤SJ2ƒÀUW]…^xÁIâçöˆ3ó\ ÀUÌ™Øyî¾ûng©@fñ§BÏ|&ücî€o¿ýÖÉÀøÿáÇ;+Ð;à’K.Þu×]NLÞü·¿ýÍù|Úi§¹Õ¦ì}ìØ±HE‚>ÖS„‰ýÎ{/v‹n·ÙT¯,°xê]lµ¦ -7rïýÞŒB¥Ão<þS–órÏ{È ‘|¥C6Ü^ê=­þ+÷*_zI=> [®&þcˆ“+Þã¸íønA¬¼9vÙî¹Uyç’…ã.+ÀËi¾Ê¸2œŠ¾+ô ¸ß<þyHÖYsèõå êw”¶ñh ‘›Ù5¼w7µãhp…ÏÒÓv ï‹ôëi9æz¼ÐÜsñþì e•pæ5ðÊ¿(Í;Ãþ»­Ÿwس……7Ш)l«·Ïîþ_ZÈÃYè­’,#†[_<ïeÿ³â9#Ê1´Ú2Ñݦ¨S§2Ìø|.G帼åû¢çlâL;k.È›?oü4$ÌŸ?¿Ì)´îrÉ=Æ~Ñ*L7-Z‚Y/]ó½‰ËœXÉ/46ÐbLÃ…ídßÙNö‘m`;Y‡JŽ©Ž}q§?" " q`Æ_ þDn§€^ÿ9²tðíØLÙÆXM ó"´¬Ç Ïq}Ïâ8ÍiÏ™Ùëj1üc-L€±«7›ÒÎxÊI–ÍúG›¥ëo3<®0F’ù¾0ƒAo›%áLÌÕ¶8—äÒ‚\³y‘ FÍe•™½Ýsõ¾ýàîÆot&P¸Â'Y¸Í+LÞÇ$~̱ęy*ïœâXÓ»Ä4'¤8f»í¶Ûœ1›;IÃqô\åX.²|o]å}¾÷Þ{ËÛµÍÛ¹Â@* ¬'Ä.sIûÃ,|eŠÐÀWu*êŒýoeÊy¯ò_ÞqÜ©à{µÏ{\:?ÓèMù§Mn€xŽMö1 ù‰Q!¦¢Í¬ùîËm8gàénÅ÷m*Òtÿ¢Û•k •}f‡u¿»åµnÝÚ180ë¾› ÖËdƒ‰–í†<°M´6³nz ðã®Pû’h6*OD@2™ Xœb[‹Œ&»ØŒuO{qɤ{=ñ£›)Û˜œŠ‰¹¸LÒó¶´H\éóAàÒÇ Év’1÷ÆzîmKaQ8°ä’Jƒ=î’\‹±º'›;ï‹vüé63t›yäøÍEÛŒ·|Ià’^te]’Ì#Ài3tèÐsæÌIq—K«Sý5›ÿA„ï¾û®ô‘âOúýÕìߟ®¿®:Ÿºÿé÷—Îߟîúý¥ó÷§ûŸ~éüý¥ûþGuG!)VúTˆ€ˆ€ˆ€ˆ€ˆ€ˆ€¤ƒ€ é ®:E@D@D@D@D@D@D ÅdH1pU'" " " " " " é @:¨«NH1R \Õ‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@:ÈêªSD@D@D@D@D@D@RL@€Wu" " " " " " "2¤ƒºê ÅÀUˆ€ˆ€ˆ€ˆ€ˆ€ˆ€¤ƒ€ é ®:E@D@D@D@D@D@D ÅdH1pU'" " " " " " é @:¨«NH1R \Õ‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@:ÈêªSD@D@D@D@D@D@RL@€Wu" " " " " " "2¤ƒºê ÅÀUˆ€ˆ€ˆ€ˆ€ˆ€ˆ€¤ƒ€ é ®:E@D@D@D@D@D@D ÅdH1pU'" " " " " " é @:¨«NH1R \Õ‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@:ÈêªSD@D@D@D@D@D@RL@€Wu" " " " " " "2¤ƒºê ÅÀUˆ€ˆ€ˆ€ˆ€ˆ€ˆ€¤ƒ€ é ®:E@D@D@D@D@D@D ÅdH1pU'" " " " " " é @:¨«NH1R \Õ‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@:ÈêªSD@D@D@D@D@D@RLÀwâ‰'†R\§ªjA C‡˜3gNµh‹!" ©$ û_*i«.êD@÷¿êt5Ô–T îH§”î@ÕŸ^XüÅ_÷Ÿ9©¾ï—Ô§ÿ?ýÿéÿOÿ%7„ÐýG÷ÝtÿIñm§¤ºš~ÿ!…”üôAD@D@D@D@D@D@2—€ ™{mÕ3(! @ }Ì% @æ^[õLD@D@D@D@D@D@JÈP‚BD@D@D@D@D@D@D s ȹ×V=2” ÐÈ\2dîµUÏD@D@D@D@D@D@D „€ %(ôAD@D@D@D@D@D@2—€ ™{mÕ3(! @ }øÿöîÌÒª<ÿ©îê}“½ ²(«@pÜ€PâŠû$F3óOòwŒ™$&ã̘'f³ŒN2ê¨Ä—à’°(Š`PQ\EÙ d‡f_z­šóÞî[}»¨ª®jºÏÛÝ÷wž§»îòÝû~ßï»ß¹÷¼ß9ç#°ù Hl¾ûÖ– @€ @€q €q 7 @€ @€Àæ+ °ùî[[F€ @€Æ$Æ)Ü @€ @€›¯€Àæ»om @€§pƒ @€l¾›ï¾µe @€ @`\@`œÂ  @€ °ù Hl¾ûÖ– @€ @€q €q 7 @€ @€Àæ+ °ùî[[F€ @€Æ$Æ)Ü @€ @€›¯€Àæ»om @€§pƒ @€l¾›ï¾µe @€ @`\@`œÂ  @€ °ù Hl¾ûÖ– @€ @€q €q 7 @€ @€Àæ+ °ùî[[F€ @€Æ†‡‡ÇÆï¹A †††ÊÈÈHm±M%@€ÀJõŸOý* þë×=o»C Ú>ƒ™  ìPüÜ0þꟑ´o#ÇŸãÏñçøËª€Ô?êõúGý“%PŠ!yö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yÃÃÃcyáE&'044TFFFòV@d$ ¨ÿ’à…%@ ]@ý—¾ ¬@¢@´}3@Ù ø¹ `þüÕ?#i_Ž?ÇŸãÏñ—U©Ô?êõú'K CòìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò†‡‡Çò‹L O`hh¨ŒŒŒä­€ÈHPÿ%Á K€@º€ú/}XDhû f6€²@ñsÀüù«FÒ¾Ž?ÇŸã/«Rÿ¨Ô?êõO–@)†äÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä å…™@žÀÐÐPÉ[‘  $ þK‚–tõ_ú.°‰ÑöÌle€âç6€ùóWÿŒ¤}8þŽ?Ç_V¤þQÿ¨Ô?êŸ,R ȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€ÈË /2<¡¡¡222’·" @ I@ý—/,éê¿ô]`¢í3˜ÙÊ>ÅÏmóç¯þIû pü9þŽ¿¬ Hý£þQÿ¨Ô?Y¥g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ '00<<<–^dyCCCedd$oD&@€@’€ú/ ^XÒÔé»À $ DÛg0³”}ŠŸÛæÏ_ý3’öàøsü9þYúGý£þQÿ¨²J1 Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O`àï|çX^x‘  @€ @€ -pñÅ—#Ž8"-044TFFF6ôvNùþâ÷·ÿ‰'žXâ È*>ýýù³ÿíÿÌï?õŸÏ_æçOýçó—ùùSÿùüe~þ²ë¿h÷Õú— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈÈ’— @€4hˆ- @€ÈË ..L¡¡¡222’¹ b @ E@ý—Â.(€úo#Ø V!M Ú>ƒ™  ìPüÜ0þꟑ´/ÇŸãÏñçøËª€Ô?êõúGý“%PŠ!yö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yyö" @€ @€fͨ"@€ @€yÃÃÃcyáE&'044TFFFòV@d$ ¨ÿ’à…%@ ]@ý—¾ ¬@¢@´}3@Ù ø¹ `þüÕ?#i_Ž?ÇŸãÏñ—U©Ô?êõú'K CòìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò$òìE&@€ @€Í$šQ D€ @€ò†‡‡Çò‹L O`hh¨ŒŒŒä­€ÈHPÿ%Á K€@º€ú/}XDhû f6€²@ñsÀüù«FÒ¾Ž?ÇŸã/«Rÿ¨Ô?êõO–@)†äÙ‹L€ @€x<ô­;ÜIDATš H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä HäÙ‹L€ @€š H4£ˆ @€ä å…™@žÀÐÐPÉ[‘  $ þK‚–tõ_ú.°‰ÑöÌle€âç6€ùóWÿŒ¤}8þŽ?Ç_V¤þQÿ¨Ô?êŸ,R ȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€Èȳ™ @€4hF- @€ÈË /2<¡¡¡222’·" @ I@ý—/,éê¿ô]`¢í3˜ÙÊ>ÅÏmóç¯þIû pü9þŽ¿¬ Hý£þQÿ¨Ô?Y¥g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ ' g/2 @€h& ÐŒZ  @€ '00<<<–^dyCCCedd$oD&@€@’€ú/ ^XÒÔé»À $ DÛg0³”}ŠŸÛæÏ_ý3’öàøsü9þYúGý£þQÿ¨²J1 Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O@ Ï^d @€ ÐL@ µ@ @€ @ O``xxx,/¼Èò†††ÊÈÈHÞ ˆL€$õ_¼°¤ ¨ÿÒwHˆ¶Ï`f(û?·ÌŸ¿úg$í+Àñçøsü9þ²* õúGý£þQÿd ”b@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@ž€@ž½È @€ @ ™€@3j @€ @€@žÀÀðððX^x‘ ä •‘‘‘¼™Iê¿$xa HPÿ¥ï+(mŸÁÌPö(~n˜?õÏHÚW€ãÏñçøsüeU@êõúGý£þÉ(Å€<{‘  @€ @€@3 €fÔ @€ @€<Á|0-úwÜQÄçŸõ¼ñÆ}þÿY¿¢þSÿg~ÿ©ÿ|þ2?ê?Ÿ¿ÌÏŸúÏç/óó—]ÿÅßG}4mÀ26–¾ˆÏßçÏñ—•Pÿ¨Ô?êõOŽ€úWý«þUÿæÔ>µñÜþí6 kï‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d HdÉ‹K€ @€ H4ÄŠ @€d f—Øx–/_^æÎ[6Þ•ÜHÖléòR®¿o Üýè@Ù{Û±²Ïvce®S,ÉÞ±(å®G:õô‚Á²ïv+ÊŽ[ö¯JJàµ_XPÎÿÅÜò‘Ó––×R¿5'”÷|c~ùß?,üÑcžq—6&7œ½ üÛµsŸ°J[/,å;–?|βòÂýV<áùé8æÃ[”#w[QþéÔ¥Ó-æ¹µÜ|óÍåÞ{ï-GuÔZ–\óéÇ{¬ÜrË-åÑG-O}êSË{ì±æî­!ð¿/,ýÝyeQmüwËž5 ðÞ––×:»Ï~÷õþ @`s˜êwBwû>÷š%åeûϬ®œøû`âýî{öþ½¡&gßõµùå¢WÿV‰¼ö«^Qþú¤%e‡>L¤$º;å÷/˜_ž?´¼ìò”î#þ @€À¦&0¿~“ü¯—/Ycµv÷œröÕƒåôÏ.(ç¾aqyÎ>£k<ïÎÆ+p÷Ýw—+V”ƒ:¨Ì›7oã]Ñ`Í>Tÿôõùµ§D)'¸¢l³`¬|÷—sËÍ÷”·ÿ낺†K$6‚ýdÈèý½ÊÆÆÆÆWèð]7Üïƒ/åÔÏ,,ƒµGÖY¯^RŽxêh¹áþ9å«×Í)ºl^íµµ°üÛë¯K¿ÜHKì´ÕXY>:Pþó×”O¿rÍŽý‚o;  °9̯Ÿ3žp¦sE9£öð:þ£[”Oýt°&œÍßTöõã?^¶Új«Î¿Me³Öó#—¯LüÝK—–·±ºG㛿¸ |ùš¹åÏ¿=¿&ê/P…},Ðû;ab`C²\xÓÜrëƒåÜ7..Ï]u"bÏmGËóöYQÿsÊç6·\{Ï@9hçÕ ‰ ¹>Ë{§%¶ß¢”?xÎÒò¶/Ï/_ª_’¯xúô]?¾}óœòþKæ—ŸÜ5§Ž¯-/þ•åOž·¬Ì«?<ï¯ß­§µ°ü‡g.ïüëâFÆg«ycå³5ãÓ-ÿ÷ŠÁòù«ËyõŒÔàêž Ý§ý%@€õ$pÈ®ceamuÇBG]ÿKç• ß¼¸,è9±ü·õ±ïÝ:§|®§®ž¸ Ó}L\ÖýÉ®»îº²ãŽ;–ÑÑÑÎЀŋ—… –Ýwß½l³Í6å‘G)·Þzk‰Ç—.]Z®½öÚñçâzè¡rçw–HÌ™3§“ ˆá Ä™îþ+që¦z¦?Ê==Ýÿãþ?oiÙy«y%ž]VÞÄo•øû7u¨Àêo[êÒ-ë1ð¬=W”ÿZËVÏJ]~ûœò‡uäÖóÇÊÙ¯]Rç^ˆw*åÁzrêÕŸ_Ø9ŽÎ~Íâ²åüR¾{ËœòßžW~tçܲÃcµ7åŠò¾ç/-ÛÔ¡7 65ÞßÑ[ [fòû »ìdX¼²"}hɪ µg¡¨3ÝsnYÐï¡Zßþ׋æ—¿¹&(ûm?V~óÈeåmG­Nð¾èÌ…åÿ?vY§ùߟWöØf¬|èä¥åñe¥¼ï[óËù×Í-÷=>PŽßkEùÝg-+Çコ‡ÃÊeæM¹L8üÓç•3‡—”ß«=å¿sËÜúý1VN®C$ÞÿÂ¥ú¿gÖùfê5¯=dEyIÝ wÕ^‹¦îYôSjc~¿íGËk7ÓW=cEùèóÊ›j†=J$"o_ªÝã=¾uÓœr^kà®Gº–Nãû…&çY-â6ŒÀ×Ï-‹ëâ 5ÓåÞÇÊOî˜SF'$ÚYCWÕ!S•µ}Lõ:¯)cû£{Ì °óÎ;w÷ÑÕÿÆoìtù,Ûn»mgâ¿hÔÇíùókk³–ûD!Ê^{íÕ™ ×\sM'!Ðy¢Ïþ‹ú³Wý°{ßÅóÊ+êp—ÏÔÞ.·×î4VþçK––¿©ÿ¢ñå·ÎYPþüßç•;ëDT' –ƒv-_«?_ú©…åÞGK9t—Ñrí½sÊ7n˜[.ýåêã!~L~¯Þ_PFãÿ+uΗza¹¸žÙzÚ£e‹Á±ò±zrãyߢ<²ú|ÇÊ þ'@€À& °®¿Ö¶i/ªsE½ù_YPþâ’yåÊz"¹æÀ;e÷Úp†ý¾µ‘%~¯œø‰-ê‰éÁòÆÃ–wڜ׹ŒÞõÕùåïꉊnùñsÊ%5AðÆ/.,+ê{³ÇhY^æ¼ø“ Ë¿þ|nùíc–•¿yñ’²´>vÚgvêïxíL– ‡Ü6§ ×ï“¡íFë÷Hái+:u|$×WYÝb^_ï8Ë÷ùûÚmîè:áÓ»/XP>^³KìŒß¯ãëÞ^wÐ_½¸Û…tEÍØ¬(/«Ðß©Yðø>­Ž½û³ºc­‹lUwtdLž^wÚ¢š‰,ΫëDñÅxY=Ëô¡“Ÿgb\÷  @`f×ÄxLÞÚ-ËêbœýV­{ßSÏn¾²&m×µÌô;`]ß¿ß^·lÙ²rðÁwù13ú×_}çì4øwÛm·òÀtzÄí(Ñc zl½õÖå€'Û~ûíËUW]Un»í¶ò´§=müñ~ºñÑ_[RÞòååûµ~am¸Ç¿(‡Ö3ú¯=xyù­£——8›g•¾xõÜÚs¢”‹ÞúxínZO\Tÿ×ÿË‚rNýÁóüÚA+Ê+Ÿ¾¼óCïìúôø½Wþæùן¯ü©öº:¤æ±úлëY¡ø{AíIsì^+ÉþîyóË'~4Øéaðߟ_8)؈¢ ¶÷ž8ÛÞïÔ3ä¿ÿì WgÅYΩcüßsáüòþš€[ÕóÇÏÙ{EùµÚvŒzµ›¤ýhM¤^¿¨þvùõÅå™»­¬[ãdu̓ӿó¸ÕëùOõþ¿ÔžZ/®ó(ÿXïÿ¼&pô[wzÄc¯©¯=¹&kÿôßçwæBúH}ÿXæÇÿqqÙ}ë•ï?q™x]$ "ñÛÏZÙë ~Cý´&.¾Y“¾ï=qõ:IJëZÒ‘}ùó--¿sîüzfn9ù€5(^uÏœr×Ã,w4ö{ËvõÌÿ—¯¬ €¥u'./‘Æ~Ì$yI]62ì½ €x.ÊËg8Ódo,·  @`rhŒ\4²º~Ž®Ñ·=<§ž™,õ2;O®ÇÕL¿&_3Nˆ®þÑ}¿[b¬”¸äßT%zDâ`ï½÷^c‘è1C î¹çž5ï§;ñæëµ!þÓzFèìÚ[ñ⑹åǵ—Ë•õþ•wÖ!Žõ7Ê7êóÑ5ÿþUW6Ša‹WÜ>·\]Çþ°vûòȪógº2Ý@ÿú¤:…`ýIôõ:su ¥9µþXåã7Qœàˆ1µW¬zýsk/›Hœý`‘è§O m%°iÌ«¿bèw”Þ9ŽÞ}eCxCnÅÑõ }$Lo«½³¾U«|ÿ¶¹å‚š¬X1,ñ«o|¼ìZ'¤º6†cuÿÝuúÊ‹ë¼uÝ{+ÿž¸ïŠñÆ<òõú~Ö^]# tþu—>|×åƒu˜@ôtï]æ¦:a·ô.Ó}lâÐø#kB"Öo}•ô@lHLœó/u¶èß=~yö^kN–sãªñuï®—o˜¬Ü^¿£P»ÛÅ¿ +N$¾]{üÕIK;c0bçF‰‰ "㉅Ö@ôººômk΢Ißü·å÷j×¹wð.úýÏ0ôL¿føv}¿X4Úg[b>€(ÝὯǢ‡@,3Ùó½Ënn·ã¬~Œ/]P»àÇÆøWGú—»ë°ÃÿUg—þûúÛãòÚ•3~hÆï’³®¬¿K¾3¿ÜPÏ0E‰F}4â{˳ö-Cµ;êHýíóÚ« ÞI=ág‰â8‹Ù«£\SOŽœøñ'ø¿nÕ{÷¾§ÛÈXPëºÿ‰æÞ@Ëõбú¯?lEyÃᣵÖÒòÏ?,¿]O@ÿ·:æ?.;|˃s:—/ž¸NskµÿzË!~ÓÜôÀœNݽÓ'+1ô«»ÌKÿyòysb™nÙ±Îí2±ÄÉ•õUfÿK`}Ežð>1¶ÿ˜lQþ v#ݱ§¾ûÖ+·ök5s—n˜Xæ®¶êôøbí6wK;ļhì?X¿<£wAd}"9ã2ذq’ùwj}û…:Ãî÷n[SŸa~xÕÙÏÉÖh6ß“½ÞcO^ ›4˜¬—@ô ˆsÝež|´MçΫgâR{l;V®ùíÕ'/âÒÆú‚eŠq9À»ë1Áß;ê²;Ö+ yú’ränceÏmFËuÀWëûô–èsÄe4»=¢›j”]êë£ÄÙ§¿¬'9&–žŸDŸrŸ›œÀt¿f²1'ýóÂμC¾eÍ“ñÚ7×ÐúÁÊÉTã~Ì×40îwKÌ%÷Ëšˆ³ðÝtÛÕe{KüV‰1ûŸ™âÊv‘é.sÖ«–®qÄîûÄ2ßýe÷Þ†ý;!Ÿ±aƒM÷î1F㜸´œU'Ðùf¼¯[©“âD–<ÎèoQÿvÿÅ—bÌòcL»e¸ŽŸ»±Nþ÷é+ëÍÑÎ䀑I/çOþd°3&5ºÐ) °á¢;\”î é1»y”è"×-13ú¥uüóTe6ßS½‡ÇŸœÀ–[nÙ6ö–ÃótŸï}®nÇÄOQn«“XÆÙýÞw{(>³ž¼ø~(J\Á(ºvÆo“(Ý3ú;«þë6ö¿RÇþµvé¤Áókƒ?ÊaõzÙ1ùàOîš[v{ÊX °òß ÷Í©#/,©$+ØÔÖå÷ÁL¶ñ¨Úh¿¢˺úîÕ¿;º¯‹ßqÖ}ÿ:™j”Ãk]W$º§NÊÚ[b×?þæüñÆïsÝÛÇì±¢&zçv®öÒm«ÆßÿSgôÿÍšüz{&ËtßoCÿ]ÝÒÞБfðþ﨓å<«NhsuÏlÐÛÖž1AD\îæ¾·rr†Kê%ßQ»–>X/éð‚U_ŠñöÑýn¯šHˆK2ºì‰_Ìݵ›Íw@÷5þ®_8»¿ë®»–E‹u&ü‹ËƼ7ÜpCç’qÁ~,ûí0VþÓª.­qvÿŸXØéNúƳ”ã>ºEYVOÚŸ°ïh‰$Ö¯Ôe£ÄpÇ÷|£¨¿gböÿëî]ùÙ?÷º•½c™˜‘ú˜:`Qýà ^]'€êv?Ý«žÐøõ#——ûëxÒ矹EùËúÛè?×a6ï¨?P£ûÿ©LÝÓ&Þ[!@€ÀÆ(Ðûû æQ™ÉlÇ;]VvªsZ/ÿá–këÜ+wÔß$1Àéu¦ý¨c£^æ/Ê»VMò—]K­^y×@ùu~¹˜Üõ¿¬e¢Âèa¾¢V󯬯ËÇ é×yYÞ÷­yå´ƒ–wÝeNÿÜ‚)—™É6­e£ë^fé«ò§,-ÏúÈÊË*tŸû“ç-¯—¿)å/ëØ¹?¹p帹hø¸Ž×ìP7$®ðÁïv&ì¾þÄ:àY?­ÏÕÝǺÛ<ñ~÷ñVÅßx>­öyoûßþïý<´¾½>?S½×¾5)ï–ÖK£Õ™ÏßW»FÇjL¾³£ÿFmÌÄ5v?S{nõ¾GÜîÞŸÍwÀl »ï?›×¬Ïe7tü®a7Îd{—é>ÛØ}¼»½{ì±G§›ÿwÞYîºë®ÎÃqý÷ß¿s¹Àîr³ùÛo6¯[_Ë®øïѲN·ü8ÉðÃ:Þ?þE‰ž‹ÑPÿ³.«W\(/Ý´¼ãW—w~€Æ„PQŽª'%þ¨^%#ºûÿ[½´ß[˜Sö©—;Žòú: à²[WÎ}tÆ¡kþvù«“–•§Ô§>tÙ`ù³úã2Jôtü§S–•ç™Õ«ëcû;Á×ñ?ñg¶ŸÖ‘w­/ãÏ­’õ¼@ïg®÷v„Y×ßñÚx¯‰ïGÙm›RÎ{Ã’ÎóÉ^OJÄLþ/XUoî½]¨ïÍKÊ:g~y骱üqãÝÏY^^ô+Q7¯ù™é¹SO÷¢·.®'¨çwfþñú17ÝÎá²òµ3Y¦ûž+·©³ kü×}~gy'zï <úè£+ÓÒ³|qÖâq½è·`£™½ KB\lšKëIÊ[ë¼,q6³{ù™n‰ï€™Jm¸åb¿¸’@?ŽûŸJ5º’Þ\‡¶Do—êäMûÕ³ø1ißÄro=«ÿˇæt.³NG‰y‹bXãAõÇbw|éÊg¦ÿ?.õ‹zÖ?~ ÕD[·—Àô¯ò,6^'óû`m[õp½áH¬/.¿wýýWq™ª @€ô‡€@ìg[I€ @€}. Ðç›O€ @€ý! ÐûÙV @€ @€@Ÿ HôùÀæ @€ @€@HôÇ~¶• @€ Ðç}þ°ù @€ Ðý±Ÿm% @€ô¹€@Ÿl> @€ô‡€@ìg[I€ @€}. Ðç›O€ @€ý!0xî¹çöÇ–ÚJ @€ ÐÇ‹/ëãí·é @€ @ / è‹Ýl#  @€ @ ß$úý`û  @€ @ /$úb7ÛH @€èw €~ÿØ~ @€è  €¾ØÍ6’ @€ú]@ ß?¶Ÿ @€úB@ /v³$@€ @€~ìwÛO€l:‹-*W\qE¹ýöÛË’%KÊî»ï^vÛm·r衇–ùóço:ÒçkzóÍ7—‘‘‘Î~|øá‡×ÐØzë­;ûõ€èìÛ5žt‡ž”ÀÀâŋǞÔ;x1 @ ‘@$Î9çœNã¿7ä‚ Ê)§œRvÜqÇÞ‡ÝÞÈ¢áÿÝï~·LlôOµš‘ 8ñÄ%¦ò8f) 0K0‹ @€¹Ó%N?ýôFeãøÖ·¾U~þóŸ¯ÓŠEãŽ;n^ëE °Z@`µ…[ Їþð‡'Ýê·¿ýí“>îÁC`ª$ÀXN8á„c%­Å¸À“iüwßľíJøK€u0 àºÛy%¦Øê} ÊÄS.ì ¦ˆ®âK—.}ÂóÑÕ?ºüG×ÿÞãÊ•K`}4þc‹¢÷Àå—_¾qmœµ!@€À&&`ÀMl‡Y]X?Sùï¾ûÚžï.§§@WbÃüñþÝñý'ù‹$@LxÓM7‰•G ÆüOÕí?öÝQGõ„ñý݉{÷kw‹"Ðø±û˜¿ 0s=fneI @ ±@ô¸÷Þ{;ÿMì g–'k$6^Eᦈ ÿ&+ûî»o§G$uÎ<óÌοHD‰ÄÎI'T¢ËÿdE/€ÉTwX/ÓÍÇЛ¨‰}vå•W>!Y0qÈGïJýâ¿pU€^·  0C €BYŒ³xô½Æ!ÏÆ+sÙ]wݵÜx㙫 ö4ÑU¼·±I€ø7U‰ñáÊÆ!gê§*Ñ?ÆÿǰŽéS½þŽ;î˜ê) @€À4ÓàxŠë[ ® 0±HLi{?wÝuWÛ ¢ÍXàÈ#,Ñœéä~_|q9ñÄ×èJ>ã`\¯Suÿ ‘˜8–?’=½åg?ûYïÝ5nO—ZcAw @` “®Ááô“@tÿßo¿ýÖK ;” ŸüZlkŒóޱà/÷7UìH|ík_+ÑE\Ù´9äñŽÆÿTŽ/äÌZ@€Y“yl.Ýîÿwß}÷“Þ¤x/eÃpÀKÅE£0º‹wÏ,ï´ÓN%ž‹$Á\°F/è ÝÄO8á„ ³RÞu½ ÄŒÿ»í¶[g߯Ó X¯½úL@ Ïv¸Í%@€Õë³û¿Àj× q+&‹žño²G£¿·Ä ò1Æ<’ÓM(×û·sâìôÚ¸ôÒK×Hä䬨Ø| Ø|÷­-#@€iÖw÷ÿJ ä DO€˜Tnb‰ Ï9çœN"`âsîoXÞ™þ×)zq̦ñ½?˜½€³7ó ¬³€ ÿÖ™n½¿P÷ÿõNšþ†‘xä‘Gžpíø˜0Î*§œrŠkÇ7ÜKqE†è…1“Ã;f:Ñc¼_ P @`ö³7ó Œ L5«ÿlC7š èþߌºi  °hÑ¢'\*0—ÑÀÚ펡¡¡'f;á_ôøP @`ö†ÌÞÌ+ @`3X—ÿë%ØLH6ù͈±þq¦²«t¯0Ýåå6y€höÙgŸ2“a/yÉKÊÛßþögR¢gA P @`ö³7ó Ø ¢ñoöÿÍ`GN² Ó%bñ8Û3Í+^àøã_kHDéþ]Û &›ëam¯ñ<¬ðI @€¾XgÿÎìÿçÇ'ÎO¼bÀÑG]N=õÔÒ›“Î)V õq‰¿éJÌþ¥ûwºe£ñoüÿtBž#@€Àôæ˜Þdz °™ ¬³ÿAcöÿ÷ãÄ~øárùå—wVòÈ#ìüdôˆçÄ$ÁÆ»5›îšÅe£L5!`\¾qâ%'ÛÚH$8û?™ŒÇ 0s €™[Y’O˜jVÿÙ>þ„7öÀˆ1ÇÊæ/Ð{e€˜0zDR Êlfßü¥6ì®- °¶è‡z¨dÍÚèƒl  @€ @€€€Ï @€è €>ØÉ6‘ @€Hø  @€ @€>èƒl  Ðï‹/.÷Ýw_Y±bE¿SlÛÿÈ#”{î¹§<úè£ÅúX  Ð/ƒý²¡¶“kúÀ‚rÏ#«—Ú¢^ü”FË[QNzÚèê'¦¹õ±+æÖ׬(»eË-·ì,׿ãŽ;:׌–/_^>ö±•×¼æ5e»í¶[Ë»yzC|êSŸ*Ï|æ3ËÁ¼ÆÛßtÓMåë_ÿzyÛÛÞVæÌ™þ”ý¸;XoÓ×¾ë-Œ7"@€ÀÆ/0VWñ=',/WÿΒοϼjYytY)¯8k^¹öžmÀ;Ï,Ñèï–ŸÞ9PþûEóºwým(pë­·–sÏ=·ìµ×^åMozSyë[ßZN?ýôN2àK_úR§¡Øpu„ª\pAÙj«­Ê›ßüæò–·¼¥œvÚi%z\rÉ%3öùÎw¾S¢Ñß-‹-*?üá»w; Ë#<²,X°`ü17Ú Œ•ø§ @€ÀÆ' °ñíkD€@¢À[”²Ïö+ÿ½¸žõÿ?§.+µ=áªËÄݲN¡¯¸âŠNãÿØc-[l±EÝeûí·//}éKËã?^®»îºuz_/Z7†qÿý÷wÎ ÏŸ?¿³?vÝu×òŒg<£ÜvÛmÞëöÎk¾*Î,}ôÑ}¾æ3î @€†ø  @`íkB ºó/[Õƒÿ¢›æ”÷~s°\u÷@™SÏÛg´|ø×–•»­Ýü¿0¯Ž1/å_œ_†ZQžú”±òÁËËÝuXÁáš_>ð²åå…û–Û*å¾>¯Ä{m³`¬œvÐhùÓ,/ƒsKùèåsË÷”Ãv-{é`yÏs——ãö-'9¿üÝË——÷|c°üâÞòŒ]ÆÊ?ž²¬²«³l“í¾hhÞyç3ÌÑðï-[o½u§»xt%úÓŸ^n¸á†rã7v’¿øÅ/:=žúÔ§–ã?~¼[z øñ\âùè¶¾Ë.»tžßf›mÊc=VÎ9çœòìg?»|ÿûßïô0Øa‡:à vÜqÇÞÐ}}»{F8†cì¾ûîãtP Ç0ŽÆ{ôÇH İ}÷Ý·sÌ1×o|ãå¾ùÍo–¡¡¡Î0€Ÿýìg}ðùϾ³OvÛm·röÙgw=ñ¾±ìž{îYFFFJ ‰äCôˆ¸Q"î~ðƒÝÓcßF¼¹sçv>ñùˆy bI¼6ÊN;íTžóœçtžï<à¿u˜j_OûåË_þr9âˆ#ÊOúÓNÞqÔQGu†ô¬ó x!úPÀ)­>Üé6™™ ,z¬”]6·ÜU{¿ú+ÊcKKyågçu÷·¼kI¹¦ˆîþ1îÿi;Œ•/±¬Ì­µê_ž´¬¼ëøåå-G¬(Tð;oU:Ï»çhYº¼”“?5¿ì¿ãX¹¶¾þü7-+?¼}Nù/¬ÌÇF̽vNùx}Ï÷Öá' –å5ùpý¢òß›[>ûª¥¸;o9Vþ`Õkf¶5ýµTt F\4Ô'+ÑI£ñ‹hüE¯€W¼âåU¯zUg|z èN]Ì£AzòÉ'—×½îuF`4úãùxhÔ^yå•åE/zQçù˜_à{ßûÞd¡ûö±è…ã£1ý•¯|¥Óè¾ùæ›;=¢Ñs„çyçW¶ÝvÛŽã)§œÒ™,ðÒK/í<½7¢qø¬g=«~øáåÀì¼gÌÏE‚H4Äþˆý%† DÿC)oxÃÊa‡ÖY‡ØßQâ½c߯ëc߯…H*D…(ñÚx¯xíßøÆN²"¶A™^à®»î*W_}õÿbXN·L·¯»Ëtÿv÷éO~ò“óEÄ~ˆž#1¤äî»ïî.æ/Ì@@`H!@ þðëƒeç¿XÐù·Ïÿ\Pþ媹åoë™û=¶­g ëÉö/¾nYyçq+Ê–uXÿ¢Ç: þ»ëÙÿµý¾_M”z²y­ÇÊ®µ×Àu޲]·+ƒµ¦ç¶ª“ ~õú9å¡¥å?±¼1öÿ“Ÿüd§‘¼[n¹¥,[¶¬Ó°ç0ކþµ×^ÛÙá%éáû-þÆrñ\ô˜¬ì¿ÿþ^ñ|4£Db ¡Ñ$ qF¹Û; z‰tKĈ„Bw˜BôôˆF¨2½ÀC=T" Ðû/»eº}ŸÉJ ç‰^5±#ù‰£H2( 0s•§œf¾¼%  °Y ¼çy+ÏÜÇFnQÛÛöLÿ”:§Ø•w ”?¾p~YV»úï½íXmxÌŽ#º÷ß[¯|vÒ?×l@OÙµ¸gÕÑ­Ýú·é‰Û]l÷šXè–ùu¸ÀбYᄌþFc.ÎðF"`²Éà¢! ÇhðE‰Æcôè–h`ĬôÑHŒ.àÑPŒÉ碡Ù[âý»%Þ¯[⽺]Þ»õûß8£ »°>ôÐC;ÿÂ(’(13| ›ˆ.á±ß¢wEo Ûx|ª~ﲓݎ„A·D‚Ø;’<‘àé&ºËô&"iŸ¡8û|á…v‘”ˆ¤‚2µ@øD¯‹Þ=m⊠Q"A0ݾî=žºï1ñªq¿;4£»Œ¿ 0½€Àô>ž%@ Ï¶©ü§®>ù·ÆÖéê9åýÿ>X¾÷ö¥eŸíV6ÆßòÅÉÏ8®ñž;ûÔ¤A4ä¯ùÝ:ž`U‰¡?­‰…½W]±ì)óW7ô»Ëø;;èú øèÊã„{K4øâ¬aœ…î–hèÇãݱÇÑà†4B¢ñŸtÒIeçws)»x.–UÖ.gУë|\‘¡ë ñ8‹ ðè1 º0=ãŒ3Æß0’1¤£·Q>þä:Þè&gbÿÆ:DìîûÇç îï±Çwù$b.€¾ërÕUWu.eà &&Öquúòeá=ݾžì¸Š¤Aw?Z·“% úÔF @`††ÌÊbˆ‰þ¢ÿv W6Ð/(ç_7§,éiÿÍ«µêm”Å«z°Î«'•­ ü8뿼.÷’ze¥£åo¾=·¬¨C”ã¹wm°|ø‡ƒ³îM`L-gŠ;î¸ò£ý¨3y_w÷¹cÿ{‡‰DƒèiËv“r½úé½×¶¯ãø=óÌ3;CCÂ?Žåâ3Ù禟Ül+ÖE`Ã~«®Ëy 6bè…Wè-ëÒø×o?y³÷­Ý^OѸ‹k+qVzº ?ÿé„fö\8¯ÍzmÏÏ,ÒÚ—ŠáÑ^±c~ˆHòÄÙæÞb¿÷j¬ßÛ³Ù×±zçX¿kâÝ °ù HlþûØ @€À4qF1.-¦ô§@4ücˆÈyç×韅“O>yü ý©²qmuœé¡ {ïl\kim °i°iì'kI€ @€ž”€«<)>/&@€ @€›†€À¦±Ÿ¬% @€xROŠÏ‹  @€ @€À¦!ðÿçøÅE8w@NIEND®B`‚golly-3.3-src/gui-ios/Golly/pattern.png0000644000175000017500000000022012026730263015033 00000000000000‰PNG  IHDR;0®¢WIDATH‰í”1 øÿ/ÇH‡ !ÍXhÚSŽL µÁ ¾™¥68ÞI¨sòV†ë¯–­®¢Úžwã<ðVW–ªõj~ÞóÀ6«óVÝàgÙ‹[ 3ü¨"MIEND®B`‚golly-3.3-src/gui-ios/Golly/triangle-down.png0000644000175000017500000000032012146034627016135 00000000000000‰PNG  IHDRƒF(Â!tEXtSoftwareGraphicConverter (Intel)w‡újIDATxœ¬ÑK EQK·¼îª$&Uý<ôåä¢qÑZ%DDÛ<™P~5$*ÈaùF?9GÅ9¬~í9GC^Tš£!/*U èŒBr èŒB’Q`Ž É(Pq¡eáJÝnÿÿIyã•–9h‡IEND®B`‚golly-3.3-src/gui-ios/Golly/OpenViewController.xib0000644000175000017500000000751712651666400017201 00000000000000 golly-3.3-src/gui-ios/Golly/beep.aiff0000644000175000017500000003105612026730263014425 00000000000000FORM2&AIFFCOMM ~@ ¬DSSND2RR»»MMààààûû22ßß M M Ä Ä = =¶¶**••ìì..WW``GG——üü..,,õõ‡‡ÞÞþþãã‘‘  NN__ A A ö ö„„ïï;;nnýýú ú ÷¨÷¨ô¯ô¯ñºñºîÏîÏë÷ë÷é4é4æŽæŽääá³á³ßˆßˆÝÝÛÍÛÍÚHÚHÙÙ×ÿ×ÿ×A×AÖÆÖÆÖ’Ö’Ö¨Ö¨×××­×­Ø˜Ø˜ÙÆÙÆÛ8Û8ܿܿÞÊÞÊàèàèã9ã9å°å°èPèPëëíèíèðÒðÒóÄóÄö¿ö¿ùµùµü£ü£ÿ~ÿ~@@ææff » » ã ã Ó Óˆˆÿÿ77''ÑÑ77PP!!©©ììèè§§þþ & & $ $  ÂÂmm  ÿ¤ÿ¤ý:ý:úÜúÜøŠøŠöOöOô/ô/ò4ò4ðaðaî½î½íKíKììëëê[ê[éàéàé«é«é½é½êêê¶ê¶ëŸëŸìÉìÉî;î;ïïïïñáñáôôöuöuù ù ûÓûÓþÀþÀÐÐûû?? ææ@@““ÙÙ    ""$ß$ß'|'|)ã)ã,,../¬/¬112+2+2ù2ù3t3t3ž3ž3t3t2ù2ù2)2)1 1 /—/—-Ù-Ù+Ì+Ì)w)w&Ý&Ý$$ ï %%~~³³ÌÌ Ë Ë¸¸þ€þ€úgúgöXöXò[ò[îxîxê²ê²ççãšãšàSàSÝCÝCÚhÚh×Í×ÍÕtÕtÓ]Ó]ыыÐÐÎÂÎÂÍËÍËÍÍ̢̢̼̼ÌÐÌÐÍCÍCÍüÍüÎôÎôÐ'Ð'єєÓ7Ó7Õ Õ × × Ù3Ù3ÛzÛzÝßÝßà^à^âîâîå‰å‰è.è.êÖêÖí{í{ððòªòªõ,õ,÷š÷šùðùðü*ü*þEþE@@ËËYYÀÀ   Û Û ƒ ƒ s s ¼ ¼ ì ì     ñ ñ Ô Ô ª ª | | L L   ì ì È È ­ ­ ¤ ¤ ¨ ¨ Á Á ñ ñ : : œ œ   ± ±jj<<**55XX““ååLLÂÂDDÐÐbbôô‚‚! ! "†"†#ë#ë%=%=&s&s'ˆ'ˆ(v(v)8)8)Ê)Ê*****S*S*A*A)î)î)X)X(('c'c%ü%ü$M$M"R"R  ‡‡´´œœCCªª Ö ÖËË$$û•û•öåöåòòí?í?è]è]ãsãsÞÞٻٻÔýÔýÐ]Ð]ËãËãǘǘÅÅ¿±¿±¼"¼"¸â¸âµ÷µ÷³g³g±5±5¯l¯l®®­­¬£¬£¬œ¬œ­ ­ ­ñ­ñ¯Q¯Q±,±,³z³z¶<¶<¹p¹p½½Á!Á!ÅÅÊ^Ê^ττÔùÔùÚ¸Ú¸àµàµæéæéíKíKóÏóÏúpúpÍÍvv””!í!í((..3¶3¶99>#>#BÏBÏGGJ÷J÷NdNdQVQVSÑSÑUÈUÈW?W?X1X1XœXœXƒXƒWãWãVÁVÁUURúRúP_P_MMMMIÎIÎEåEåAžAž<ý<ý8 8 2Ð2Ð-Y-Y'¬'¬!Ô!ÔÝÝÐкº ¡ ¡––ýœýœ÷Å÷Åòòì”ì”çNçNâPâPݞݞÙ;Ù;Õ6Õ6ÑŽÑŽÎNÎNËwËwÉÉÇÇŌŌÄvÄvÃÖÃÖææÃêÃêĜĜŶŶÇ:Ç:É É ËbËbÍüÍüÐåÐåÔÔ××Û8Û8ßßããç9ç9ëoëoï¯ï¯óôóôø1ø1ü^ü^pp``&& ¼ ¼11ŒŒÅŧ§//]]--¡¡´´kkÄÄÂÂkk½½ÂÂ||ññ''&& ö ö$$üòüòùJùJõ¥õ¥òòîîëëçËçËä°ä°áÈáÈßßܯܯÚÚØ¸Ø¸×8×8ÖÖÕDÕDÔÖÔÖÔÈÔÈÕÕÕÔÕÔÖíÖíØjØjÚDÚDÜÜßßáþáþå9å9èÂèÂììððôãôãùXùXýõýõ´´ˆˆ l lSS99ÍÍ$m$m(å(å-*-*15154þ4þ88;±;±>†>†AACCDÐDÐFFFõFõGbGbGZGZFåFåEúEúD D B×B×@Ÿ@Ÿ=ÿ=ÿ:ú:ú7”7”3Ô3Ô/¹/¹+S+S&¦&¦!¸!¸’’;;¾¾ ! !ppµµúùúùõ?õ?ï˜ï˜ê ê äœäœßXßXÚJÚJÕtÕtÐâÐâ̕̕ȚȚÄóÄóÁ¦Á¦¾¸¾¸¼-¼-ºº¸I¸I¶ô¶ô¶ ¶ µ‹µ‹µtµtµÇµÇ¶‚¶‚·¤·¤¹$¹$»»½=½=¿Ë¿ËªªÅÑÅÑÉ:É:ÌàÌàннÔÈÔÈØýØýÝOÝOá¼á¼æ9æ9êÂêÂïIïIóÏóÏøJøJü²ü²00 ; ;  ÓÓSSœœ««}}  "a"a$m$m&8&8'Á'Á))***È*È+H+H+Ž+Ž+˜+˜+l+l++*u*u)¸)¸(Î(Î'Á'Á&‘&‘%F%F#ã#ã"m"m æ æTT½½  ……îî\\××``÷÷ŸŸ\\**      : : s s Á Á " "””¦¦BBéé””DDöö¦¦PPöö’’""¤¤vvÀÀôôÿÿþþüÒüÒû‰û‰ú'ú'ø¬ø¬÷÷õsõsó¸ó¸ñêñêð ð îîì)ì)ê+ê+è+è+æ,æ,ä2ä2â>â>àWàWÞÞܽܽÛÛÙÙØ$Ø$ÖâÖâÕÈÕÈÔÝÔÝÔÔÓ—Ó—ÓFÓFÓ-Ó-ÓOÓOÓ¯Ó¯ÔMÔMÕ)Õ)ÖHÖH×¢×¢Ù;Ù;ÛÛÝ(Ý(ßxßxââä¾ä¾ç¬ç¬êÇêÇîîñzñzõõøªøªüiüi22áá ¸ ¸ˆˆGGòò‚‚íí!6!6$Q$Q'8'8)è)è,^,^.“.“0„0„2-2-334ž4ž5b5b5Ô5Ô5ù5ù5É5É5I5I4{4{3^3^1ô1ô0C0C.I.I,,)“)“&á&á#ø#ø â ⢢==¼¼%%|| Ì ÌggÅÅý5ý5ùºùºö^ö^ó$ó$ððí9í9êŽêŽèèåëåëãõãõâCâCàØàØß³ß³ÞØÞØÞFÞFÝüÝüÝüÝüÞCÞCÞÎÞÎߟߟà±à±ââã‡ã‡åCåCç4ç4éIéIë‡ë‡íæíæð_ð_òêòêõõøøú¼ú¼ýSýSÿÜÿÜVV²²ññ   ø ø ¶ ¶AA––±±ŠŠ!!zzŒŒ\\åå,,..ññ u u ½ ½ Ï Ï««YYàà@@ý‚ý‚ú¬ú¬÷Å÷ÅôÓôÓñÛñÛîéîéììé+é+ænænãÒãÒáZáZßßÜúÜúÛÛككØ(Ø(××ÖXÖXÕèÕèÕËÕËÖÖÖ’Ö’×}×}ؽؽÚXÚXÜJÜJÞ‘Þ‘á*á*ääçIçIêÇêÇî†î†òƒòƒöµöµûûÿœÿœFF   Ø Ø±±‰‰WW!!%³%³*/*/.~.~2™2™6w6w::=]=]@V@VBøBøE:E:GGHHI™I™J2J2J[J[JJITITH"H"F|F|DeDeAáAá>ñ>ñ;š;š7Û7Û3Ä3Ä/R/R**%ƒ%ƒ 8 8°°÷÷  üâüâöÁöÁð¨ð¨êžêžä³ä³ÞîÞîÙSÙSÓòÓòÎÎÎÎÉõÉõÅhÅhÁ4Á4½_½_¹ë¹ë¶â¶â´C´C²²°`°`¯¯®Q®Q­þ­þ®%®%®Á®Á¯Õ¯Õ±Z±Z³S³Sµµµµ¸€¸€»«»«¿6¿6ÃÃÇCÇC˺˺ÐpÐpÕ]Õ]ÚzÚz߼߼ååê’ê’ððõšõšûû……àà  &&  ´´"""M"M&/&/)Å)Å--/õ/õ2‰2‰4À4À6Ÿ6Ÿ8899999ú9ú:[:[:b:b::9f9f8i8i775†5†3©3©1‰1‰/./., , )ß)ß&ø&ø#í#í È ÈBBðð  QQ Ý ÝÂÂÆÆççþ0þ0û£û£ùCùC÷÷õõóOóOñ»ñ»ðaðaï?ï?îXîXí¦í¦í-í-ìéìéìØìØìøìøíIíIíÄíÄîhîhï/ï/ððññò:ò:ólólô¬ô¬õúõú÷J÷Jøœøœùìùìû1û1ülülý™ý™þ°þ°ÿ²ÿ²——``  ’’öö44NN@@  °°00‹‹ÅÅÿÜÿÜþÕþÕý°ý°üuüuû#û#ù¾ù¾øJøJöÊöÊõCõCóºóºò1ò1ð­ð­ï2ï2íÆíÆìiìië$ë$é÷é÷èéèéç÷ç÷ç,ç,æ‡æ‡æ æ å³å³åŽåŽå™å™åÎåÎæ5æ5æÌæÌç”ç”è‰è‰é­é­êþêþì{ì{î î ïïïïñÝñÝóïóïööøgøgúÅúÅý5ý5ÿ´ÿ´;;ÆÆQQ Ø Ø V VÆÆ''qq¢¢³³¥¥rrÝÝ ù ù!è!è"¡"¡#(#(#x#x#˜#˜#ƒ#ƒ#:#:"¿"¿""!8!8 / /ýý    ~~¼¼ââððèèÕÕ¶¶ ‘ ‘ c c;;ýýííÿðÿðþþü3ü3úwúwøØøØ÷V÷Võöõöô¸ô¸óœóœò£ò£ñÍñÍññð‘ð‘ð(ð(ïâïâï¿ï¿ï¹ï¹ïÔïÔð ð ð_ð_ðÈðÈñFñFñÖñÖòtòtóóóÔóÔôŒôŒõHõHöööºöº÷j÷jøøø§ø§ù0ù0ù¨ù¨ú ú úZúZú“ú“ú®ú®úµúµúžúžújújú ú ùºùºù:ù:ø£ø£÷õ÷õ÷/÷/öXöXõoõoôzôzóxóxòoòoñ_ñ_ðOðOï?ï?î8î8í9í9ìIìIëgëgêžêžéíéíéWéWèâèâèŽèŽèbèbè^è^è‡è‡èÛèÛébébêêêþêþììíiíiîèîèðšðšò}ò}ôôöÏöÏù:ù:ûÌûÌþ…þ…^^TTdd † † º º÷÷77ww°°ÝÝ ö ö#ö#ö&Ø&Ø)•)•,),).Š.Š0¹0¹2®2®4f4f5Ù5Ù777è7è8}8}8Á8Á8´8´8R8R776’6’54543~3~1y1y/"/",~,~)Ž)Ž&U&U"Ú"Ú  ..±±66 š šààûEûEölölñ˜ñ˜ìÐìÐèèãƒãƒß ß Ú¿Ú¿Ö¢Ö¢Ò¿Ò¿ÏÏË·Ë·È È ÅÕÅÕÃ_Ã_ÁAÁA¿¿¾¾½½¼v¼v¼6¼6¼]¼]¼æ¼æ½Ñ½Ñ¿!¿!ÀËÀËÂÓÂÓÅ1Å1ÇçÇçÊêÊêÎ9Î9ÑÍÑÍՠՠ٫٫ÝèÝèâNâNæÙæÙë€ë€ð:ð:ôÿôÿùÇùÇþŒþŒDDëë v vÞÞ.. ¤ ¤$$'')ã)ã,^,^.‰.‰0^0^1Þ1Þ333Ô3Ô4M4M4i4i42423¤3¤2Ä2Ä1”1”00.R.R,I,I**'~'~$È$È!ä!䨨««bb¡¡11 à Ã[[¼¼ý“ý“úˆúˆ÷£÷£ôèôèò]ò]ððíäíäììêYêYèðèðçËçËæéæéæGæGåëåëåÐåÐåùåùæ^æ^çççäçäèþèþêKêKëÉëÉírírïDïDñ8ñ8óJóJõuõu÷®÷®ù÷ù÷üIüIþ™þ™ââ$$VVqq q q S S  ¦¦JJQQ!!¼¼AA,,ÚÚPP‡‡ˆˆSSèè L L ‹ ‹oo//ÐÐ[[ýÒýÒû9û9ø˜ø˜õóõóóQóQð´ð´î&î&ë­ë­éIéIççäâäââçâçááßxßxÞÞÜØÜØÛáÛáÛ$Û$Ú¦Ú¦ÚlÚlÚoÚoÚ´Ú´Û=Û=ÜÜÝÝÞcÞcßîßîáµáµã³ã³åëåëèTèTêëêëí­í­ð”ð”óœóœö¿ö¿ùúùúýEýE™™÷÷TT « « ö ö11WW``GG  ¦¦""$H$H&M&M(()¨)¨*ú*ú,,,à,à-r-r-¾-¾-É-É-“-“--,e,e+q+q*?*?(Õ(Õ'5'5%c%c#]#]!-!-ØØ]]  @@aaxx † †’’ŸŸ²²ÿÔÿÔýýú@ú@÷˜÷˜õõò˜ò˜ðJðJîîììê7ê7è„è„æùæùåœåœälälãjãjâ•â•áîáîáqáqá#á#àúàúàüàüá#á#ásásáãáãâsâsãããçãçäÉäÉå¾å¾æÇæÇçàçàééê4ê4ëiëiì¢ì¢íßíßïïðOðOññò«ò«óÌóÌôåôåõïõïöîöî÷Þ÷Þø¿ø¿ù•ù•úXúXûûûµûµüPüPüÜüÜý\ý\ýÒýÒþ<þ<þ þ þûþûÿPÿPÿ¤ÿ¤ÿôÿô@@åå@@žžvvîîtt¦¦TT  ÖÖ¯¯”” † † „ „ £ £ Á Áãã  88gg‘‘¹¹ÚÚòòþþüüéé„„++¶¶&&rr¢¢‚‚==ÍÍ22nn‚‚gg''»»''llŠŠ†† a a  ½½FF¹¹þpþpûºûºøþøþöAöAó†ó†ðÔðÔî-î-ë”ë”ééæ©æ©ä\ä\â0â0à(à(ÞHÞHܕܕÛÛÙ¿Ù¿Ø¢Ø¢×¸×¸× × Ö–Ö–Ö[Ö[Ö]Ö]Ö™Ö™×××Ê×ÊØºØºÙãÙãÛFÛFÜÝÜÝÞ¥Þ¥à à âÅâÅååç‹ç‹ê$ê$ìÖìÖï¤ï¤òƒòƒõsõsønønûlûlþkþk``PP11 ý ý ± ±FF¾¾33..ùù’’÷÷$$ÔÔ X X ¡ ¡ ¯ ¯ ‚ ‚ ! !††¹¹¶¶„„&&žžðð00'' Ú Ú ¡ ¡ ] ]ÛÛ  rrþWþWüPüPú`ú`øøöÜöÜõOõOóêóêò«ò«ññðºðºððï„ï„ï4ï4ïïï)ï)ïmïmïáïáð„ð„ñTñTòMòMóoóoôµôµöö÷¥÷¥ùEùEúüúüüÅüÅþžþž{{``FF&&ùù Á Á v v  ‘‘óó33HH77÷÷‡‡çç  ÊÊWW®®Ðм¼wwÿÿ Z Z ˆ ˆ kk++ÉÉNNýÂýÂû!û!øxøxõÆõÆóóðjðjíÉíÉë7ë7è·è·æUæUääáìáìßñßñÞ#Þ#܈܈ÛÛÙíÙíØøØøØAØA×È×È×’×’×××í×íØØÙXÙXÚsÚsÛÍÛÍÝlÝlßGßGá^á^ã®ã®æ2æ2èéèéëÏëÏîÝîÝò ò õ_õ_øÊøÊüJüJÿÕÿÕmm š š&&§§``ŽŽ™™!z!z$,$,&¨&¨(ï(ï*ø*ø,Å,Å.P.P/•/•0™0™1N1N1À1À1ç1ç1Ä1Ä1Y1Y0¤0¤/©/©.i.i,ã,ã+#+#)!)!&è&è$x$x!Ø!Ø  ûûÂÂqq  ˜ ˜  %%ý³ý³úPúPöüöüóÃóÃð¤ð¤í¨í¨êÐêÐè"è"åžåžãNãNá.á.ßGßGݕݕÜÜÚáÚáÙßÙßÙÙؒؒØDØDØ2Ø2Ø[Ø[ؽؽÙSÙSÚÚÛÛÜHÜHݡݡß!ß!àÇàÇâŒâŒärärænænè‚è‚ê§ê§ìØìØïïñRñRó“ó“õÏõÏøøú1ú1üPüPþ`þ`UU55««;;ªª ú ú ( ( 4 4   å 円  hh¨¨ÊÊÌ̳³33ÓÓ__ Ú Ú F F ¦ ¦ ü ü K K – – á á + +xxËË$$††òòmmôô‹‹00ææ®®‡‡rrmmyy––ÂÂýýDD––öö[[ÆÆ99­­!!––rrÚÚ 6 6 † † Ë Ë   & & ; ; ; ; ( (   Æ Æ q q  ŠŠòòHHˆˆ°°ÆÆË˽½  uuÿ@ÿ@þþü·ü·ûjûjúúøÇøÇ÷u÷uö*ö*ôæôæó¬ó¬òzòzñZñZðFðFïFïFî[î[í†í†ìÉìÉì'ì'ë ë ë4ë4êæêæê·ê·ê¦ê¦ê´ê´êâêâë-ë-ë™ë™ì ì ìÈìÈí‰í‰îfîfï[ï[ðjðjññòÆòÆôôõfõföÌöÌø<ø<ù±ù±û0û0ü®ü®þ,þ,ÿ§ÿ§  ððII’’ÉÉëë û û ô ô Ö Ö œ œ L L Ý ÝVV±±ïïáážžCC Ñ Ñ L L ´ ´ V V ‘ ‘ Á Áíí22TTxx››ÇÇýý;;……ÞÞEEÿÀÿÀÿKÿKþéþéþ›þ›þbþbþ<þ<þ0þ0þ5þ5þRþRþ€þ€þÇþÇÿÿÿ…ÿ…ÿþÿþ„„µµ]]  ÀÀvv))ÛÛ‹‹//ËËYYØØ F F ¢ ¢ ê ê   1 1 + +   Ö Ö   zzËËÿÿöö½½nn þ’þ’ý ý ûpûpùÎùÎø!ø!önönô¸ô¸óóñTñTï©ï©î î ìyìyêûêûé’é’è@è@ç ç åðåðäùäùä%ä%ãwãwâñâñâ•â•âgâgâcâcâŽâŽâéâéãsãsä,ä,ååæ+æ+çnçnèàèàêyêyì=ì=î&î&ð6ð6òdòdô±ô±÷÷ù˜ù˜ü*ü*þÎþÎyy--ää š š H HîppÀÀòòýýää ¢ ¢"2"2#“#“$¿$¿%º%º&}&}'''Z'Z'u'u'S'S&ú&ú&e&e%š%š$˜$˜#]#]!ñ!ñ R R‚‚‰‰gg··,,ŠŠ Ó Ó 66[[{{ÿ›ÿ›üÂüÂùñùñ÷3÷3ôƒôƒñíñíïrïrííêÝêÝèÉèÉæÞæÞååãŒãŒâ*â*àüàüßþßþß7ß7Þ£Þ£ÞEÞEÞÞÞ(Þ(ÞhÞhÞÜÞÜß~ß~àSàSáSáSâ€â€ãÓãÓåLåLæéæéè¤è¤êyêyìiìiîiîið{ð{òšòšôÁôÁöìöìùùû>û>ý^ý^ÿtÿtyynnOO Q Q Á Á  <<AA!!ÞÞqqÞÞ%%EE<<ÇÇUUÇÇOOmm u u l l M M $ $ïï²²pp--ëë®®wwKKÿ,ÿ,þþýýü3ü3û^û^ú ú ùúùúùpùpøÿøÿø¨ø¨øqøqøUøUøUøUøqøqøªøªøÿøÿùlùlùñùñúúû@û@üüüÜüÜýÂýÂþµþµÿ´ÿ´µµÂÂÐÐßßëëððññææÏÏ ¨ ¨ q q & & Æ Æ Q Q Á Á   V V v v | | c c - - Ý Ý q q æ æ A A ª ªºº´´››mm00ææ00þÌþÌýbýbûõûõúŠúŠù%ù%÷Ã÷Ãölölõõóßóßò±ò±ñ”ñ”ðŠðŠï™ï™î¿î¿íûíûíTíTìÉìÉìYìYì ì ëÖëÖëÀëÀëÉëÉëôëôì9ì9ìŸìŸííí¹í¹îoîoï?ï?ð&ð&ñ$ñ$ò4ò4óXóXôôõÏõÏ÷÷øuøuùÕùÕû:û:ü¢ü¢þ þ ÿpÿpÒÒ00„„ÏÏ  ==aa o o o o Z Z / / ñ ñ œ œ11¯¯ff¡¡ÅÅÓÓÌ̯¯??ì숈 ˜ ˜   z z Ü Ü 4 4 ‹ ‹ Û Û * *vvÁÁ``²²  iiÍÍ99««''««;;ÐÐnnÿÇÿÇÿ‚ÿ‚ÿBÿBÿ ÿ þÙþÙþ®þ®þ‡þ‡þeþeþGþGþ+þ+þþý÷ý÷ýÜýÜýÃýÃý©ý©ý‰ý‰ýeýeý@ý@ýýüåüåü®ü®üpüpü,ü,ûãûãû‘û‘û:û:úÜúÜúwúwú ú ùžùžù(ù(ø¯ø¯ø3ø3÷µ÷µ÷5÷5ö¶ö¶ö8ö8õºõºõAõAôÏôÏô_ô_óúóúóœóœóFóFòÿòÿòÄòÄò˜ò˜òzòzòjòjòmòmòòò¨ò¨òãòãó1ó1ó”ó”ôôô•ô•õ3õ3õæõæö®ö®÷†÷†øuøuùpùpú€ú€ûšûšüÇüÇýüýüÿ@ÿ@‰‰ÛÛ00‹‹ääAA–– æ æ / / m m ¡ ¡ÆÆØØÜÜÌÌ¡¡cc  ——  bb——²²®®ŠŠGGééiiÌÌ<<LLAA æ æ œ œ : : Ë ËMMÄÄ22™™ýý\\þÂþÂý)ý)û•û•úúøŽøŽ÷÷õ¼õ¼ôoôoó4ó4òòññððï9ï9îîíàíàíbíbìÿìÿì¿ì¿ì›ì›ì—ì—ì²ì²ìëìëíBíBí¶í¶îFîFîïîïï¯ï¯ðŠðŠñzñzò{ò{ó“ó“ôµôµõåõå÷÷øeøeù¬ù¬úùúùüGüGý’ý’þÙþÙPP~~  °°°°  {{AAïï † †   j j ¶ ¶ ê ê     ê ê ¸ ¸ q q   ¡ ¡  ÒÒTT„„©©ÉÉääûû++ÿKÿKþnþnýšýšüÎüÎüüû^û^úºúºú*ú*ùªùªù@ù@øèøèø¥ø¥øxøxøcøcøcøcøzøzø¨ø¨øìøìùEùEùµùµú5ú5úÌúÌûuûuü.ü.üõüõýÉýÉþ©þ©ÿ’ÿ’„„{{vvrrmmffYYFF++   Ï Ï ‹ ‹ 6 6 Ï Ï T T Æ Æ   a a Š Š œ œ • • s s 6 6 á á s s ì ì K K – – È ÈèèòòëëÖÖ¯¯}}>>ùùÿ°ÿ°þ`þ`ýýûÀûÀúpúpù'ù'÷å÷åö¯ö¯õõôdôdóVóVò[ò[ñsñsðŸðŸïßïßï9ï9î­î­î9î9íàíàí¤í¤í‚í‚í{í{í’í’íÄíÄîîîyîyîÿîÿï™ï™ðOðOñññúñúòïòïóøóøõõö:ö:÷o÷oø¯ø¯ù÷ù÷ûJûJüžüžýõýõÿLÿL¤¤õõFF‹‹ÈÈøø 1 1 4 4 & &   Ñ Ñ † †&&±±!!||ÁÁììÿÿææ¸¸uu¯¯11 ¡ ¡   V V œ œ Ö Ö   / /QQkk‚‚˜˜­­ÄÄÛÛùùDDÿtÿtþ«þ«ýìýìý:ý:ü’ü’ûõûõûeûeúáúáúlúlúúù¨ù¨ù^ù^ùùøèøèøÃøÃøªøªøšøšø˜ø˜øŸøŸø¯ø¯øÌøÌøîøîùùùJùJùùù¾ù¾úúúCúCú‡ú‡úÎúÎûûû\û\û£û£ûéûéü*ü*üjüjü¥ü¥üÞüÞýýý@ý@ýlýlý’ý’ý²ý²ýÐýÐýçýçýûýûþ þ þþþþþþþþþþþþþþþ þ þþýüýüýùýùýóýóýòýòýóýóýõýõýüýüþþþþþ+þ+þEþEþeþeþ‹þ‹þ³þ³þãþãÿÿÿUÿUÿ•ÿ•ÿÜÿÜ%%uuËË$$€€ÞÞ@@  ggÉÉ++‹‹ææ??’’àà))mm¦¦ÛÛ&&AAOOTTOOAA&&ÖÖYY  ¸¸[[öö‡‡——––  €€òòeeÿÙÿÙÿKÿKþ¾þ¾þ5þ5ý°ý°ý2ý2üµüµü@ü@ûÐûÐûiûiû û ú±ú±úeúeú!ú!ùçùçù¸ù¸ù•ù•ùzùzùlùlùhùhùpùpù€ù€ùšùšùÀùÀùîùîú%ú%úeúeú¬ú¬úúúúûPûPûªûªüüüjüjüÐüÐý:ý:ý¢ý¢þ þ þuþuþÜþÜÿBÿBÿ¥ÿ¥``µµPP’’ÎÎ00VVpp„„’’€€kkPP++ÔÔžžee++ëë©©ee""ÿàÿàÿœÿœÿ[ÿ[ÿÿþàþàþ©þ©þuþuþGþGþ þ ýþýþýâýâýÐýÐýÂýÂý¾ý¾ýÂýÂýÎýÎýâýâþþþ#þ#þPþPþ…þ…þÀþÀÿÿÿLÿLÿœÿœÿðÿðII¥¥  mmÒÒ77  iiËË''€€ÖÖ  ii¨¨àà22OO``ffbbPP88àत]]  °°KKßßggëëddÛÛKKµµÿ…ÿ…þëþëþPþPý³ý³ýýüƒüƒûðûðûaûaúÚúÚúXúXùÞùÞùlùlùùø¥ø¥øOøOøø÷È÷È÷•÷•÷q÷q÷X÷X÷N÷N÷N÷N÷Z÷Z÷u÷u÷Ÿ÷Ÿ÷Ó÷Óøøø^ø^øµøµùùùùù÷ù÷úuúuúúúúû‡û‡üüü°ü°ýJýJýéýéþ‰þ‰ÿ)ÿ)ÿËÿËeežž55ÇÇTTÙÙWWÐÐ==  ûûOO””ÐÐ&&AAOOQQII88ôôÄĉ‰FFýý««TTôô))»»MMÞÞkk÷÷……¤¤77ÿÌÿÌÿgÿgÿÿþ¥þ¥þNþNýûýûý®ý®ýgýgý)ý)üòüòüÀüÀü—ü—üuüuüYüYüEüEü:ü:ü5ü5ü5ü5ü@ü@üNüNübübüzüzüšüšü¾ü¾üçüçýýý@ý@ýrýrý¥ý¥ýÛýÛþþþKþKþ‚þ‚þ¹þ¹þðþðÿ%ÿ%ÿ[ÿ[ÿŒÿŒÿ¼ÿ¼ÿëÿë;;\\~~››´´ÉÉ××ååððôôõõôôîîççÛÛÍÍ»»©©••€€eePP77 ÿìÿìÿÕÿÕÿ¾ÿ¾ÿ©ÿ©ÿ”ÿ”ÿ€ÿ€ÿlÿlÿ\ÿ\ÿPÿPÿDÿDÿ<ÿ<ÿ5ÿ5ÿ2ÿ2ÿ2ÿ2ÿ3ÿ3ÿ7ÿ7ÿ@ÿ@ÿGÿGÿRÿRÿ`ÿ`ÿpÿpÿ‚ÿ‚ÿ”ÿ”ÿ©ÿ©ÿÀÿÀÿÕÿÕÿîÿî 99PPkk‚‚››²²ÉÉÞÞòò""0099BBIIKKNNNNMMEE@@77--""ôôààÎ뻥¥{{eeRR<<))ÿìÿìÿÛÿÛÿËÿËÿ¹ÿ¹ÿ©ÿ©ÿ›ÿ›ÿÿÿ‚ÿ‚ÿyÿyÿpÿpÿiÿiÿbÿbÿ`ÿ`ÿ[ÿ[ÿYÿYÿWÿWÿYÿYÿ[ÿ[ÿ\ÿ\ÿ`ÿ`ÿeÿeÿiÿiÿpÿpÿuÿuÿ~ÿ~ÿ…ÿ…ÿŽÿŽÿ•ÿ•ÿžÿžÿ¥ÿ¥ÿ°ÿ°ÿ·ÿ·ÿ¾ÿ¾ÿÇÿÇÿÎÿÎÿÕÿÕÿÛÿÛÿâÿâÿçÿçÿìÿìgolly-3.3-src/gui-ios/Golly/StatePickerController.h0000644000175000017500000000046513145740437017325 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import #import "StatePickerView.h" @interface StatePickerController : UIViewController { IBOutlet StatePickerView *spView; IBOutlet UISwitch *iconsSwitch; } - (IBAction)toggleIcons:(id)sender; @end golly-3.3-src/gui-ios/Golly/StatusView.m0000644000175000017500000000545513145740437015172 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "status.h" // for UpdateStatusLines, status1, status2, status3 #include "algos.h" // for algoinfo #include "layer.h" // for currlayer #import "StatusView.h" @implementation StatusView // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)dirtyrect { UpdateStatusLines(); // sets status1 and status2 CGContextRef context = UIGraphicsGetCurrentContext(); int wd = self.bounds.size.width; int ht = self.bounds.size.height; // background color of status area depends on current algorithm [[UIColor colorWithRed:algoinfo[currlayer->algtype]->statusrgb.r / 255.0 green:algoinfo[currlayer->algtype]->statusrgb.g / 255.0 blue:algoinfo[currlayer->algtype]->statusrgb.b / 255.0 alpha:1.0] setFill]; CGContextFillRect(context, dirtyrect); // draw thin gray line along top [[UIColor grayColor] setStroke]; CGContextSetLineWidth(context, 1.0); CGContextMoveToPoint(context, 0, 0); CGContextAddLineToPoint(context, wd, 0); CGContextStrokePath(context); // use black for drawing text [[UIColor blackColor] setFill]; // add code to limit amount of drawing if dirtyrect's height is smaller than given ht??? NSString *line1 = [NSString stringWithCString:status1.c_str() encoding:NSUTF8StringEncoding]; NSString *line2 = [NSString stringWithCString:status2.c_str() encoding:NSUTF8StringEncoding]; // get font to draw lines (do only once) static UIFont *font = nil; if (font == nil) font = [UIFont systemFontOfSize:14]; // set position of text in each line float lineht = ht / 3.0; CGRect rect1, rect2; rect1.size = [line1 sizeWithAttributes:@{NSFontAttributeName:font}]; rect2.size = [line2 sizeWithAttributes:@{NSFontAttributeName:font}]; rect1.origin.x = 5.0; rect2.origin.x = 5.0; rect1.origin.y = (lineht / 2.0) - (rect1.size.height / 2.0); rect2.origin.y = rect1.origin.y + lineht; // draw the top 2 lines [line1 drawInRect:rect1 withAttributes:@{NSFontAttributeName:font}]; [line2 drawInRect:rect2 withAttributes:@{NSFontAttributeName:font}]; if (status3.length() > 0) { // display message on bottom line NSString *line3 = [NSString stringWithCString:status3.c_str() encoding:NSUTF8StringEncoding]; CGRect rect3; rect3.size = [line3 sizeWithAttributes:@{NSFontAttributeName:font}]; rect3.origin.x = 5.0; rect3.origin.y = rect2.origin.y + lineht; [line3 drawInRect:rect3 withAttributes:@{NSFontAttributeName:font}]; } } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/InfoViewController.xib0000644000175000017500000000671012651666400017165 00000000000000 golly-3.3-src/gui-ios/Golly/settings.png0000644000175000017500000000105512026730263015225 00000000000000‰PNG  IHDR;0®¢ôIDATH‰å—Ï›P‡¿!–ÞqI›l‰“1”’Ö%8Ä[Av+ˆÓH„,xœˆ¼8ØGarÁö‚ÿ‘ùgß›ÇïÍDU¹…œ›Po œJÆq®øøE£&(€ˆD½€‹¢˜óÚ¹§´°Ö~è ‚àEUgWÀ]`™$ÉC'0Àd2ùŒTõ‰Có¬Ed&"áñÂDdQðbm™uJ’äAD5©¥1fzÉÒ `­ýL}Ë\cÂsðÖàÞt¾·EQ„e·«U§AÀ3Ö5)×qœè”ã;U eÙ]žçú¶ˆÌÆãñóq¼óèãyÞ®áæ@UŸêßËÌU9ÿU=ªê{ùL“$ùRMvÞꪪN÷}ÿM%þØú¾ÿvëuÊô}ÿX¤i:X­V÷eúÀ½·{§«ê4M¿ƒŸejñOÁžçíŒ1¡ˆ¬Ë©Ô‘¨\Ð_õú¯Ñÿ÷ óKšæáݯIEND®B`‚golly-3.3-src/gui-ios/Golly/iTunesArtwork@2x0000644000175000017500000033150512026730263016003 00000000000000‰PNG  IHDRð¼Ô!tEXtSoftwareGraphicConverter (Intel)w‡ú²ßIDATxœì×1 ÀÀW‡= 0ô’еsö"æ{ðŒ€!B „1b Ä@ˆ€!B „1b Ä@ˆ€ ÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿìÜPÓ÷Çñwò ’Š[Û³S =×êt³wZí r,XW¢XÔ–ŠÚDT@Û:©m7çæâÄóWqwk«½¶g×Ù›µ]W»‚?b $‘„„üþE¡€øYâꟻú³IÍëîq¹äûý'ß罿¼ï› €(‚ Š`ˆ"X¢€(‚ Š`ˆ"X~¶»îtØ¿'úD&ôAôAˆL˜ôùÉÁpÕן_¾üðøŸ½D4hhTIlì‹D%­âÓj¢—‰‚§–- äQ QŸ¿˜Hø\á®ÊÎÙ¿g¯!ìW>è™Ð}ÐÂóƒ>?uXî¼êǦO«HŒŽõ">­ˆ”'Å×<°%Q\-âd'ãxåēŠ7ÅÄlð*ùüÊQ\6É‚·Ç”Ÿo‘®þ ì×…>è Ð}ÐÂóƒ>÷ ,wÌî½ÿš5kÑüàÜ ©blü1mQ­ˆ¶ŽÙöȘíSÛ9ëɺÔÔ}ié{Òæþå7Yû3refIŸûNjú‘Ù© S§ÕOþÅ”äýII»8ÚNTË£?Ä v•s´f´H:cú[oÖ6…ýJÑ}Ð'Ò úÀ݃ùAŸ{€; Lú× ÉeDÙÂØ—J|h=ÑÆûx;'Ž9œöägË ÒÒfÙª³µ¯ªŽ¿ë»x‘)5¬¹“i ¬ÃÒv9t伊ÕÕ»kß4®‘6/YÒ¸ ïÌ3OŸLžðN‚x׃£ë8ÚJTɧµD’„ûJ*ÖûU£ú O$@ô»óƒ>÷*,·¥fËßù‚…<*ƾ;*8£5B®ö‰”†ù™ÿ~¡@^±æÒ[[{ŽýíŠJΓÑo1 :lÌë ­Î—ôlW½oqÉÉÒ³ÅÅ­©OŸ7öÈhÑŸùT% W8*ÊÎþ}Ø› ú úDôÛùAŸ(àæìÙ÷ŸI“¤D‹cc*chk¢¸nÆôÏ òÛs²>ÿÕëÛtÿüŠlÌèbÚnG—Ãfpš cW±³Ë¬ërMƒN;³šFÌÝÃ&ý€QßoÔûOÑk6yÌ=.‹ÙÔct›º]ÁƒV³ßfcêfñ°F9ÛX£ÊÎù¤`ÑùÂ|Í3³¾~èþCBþÛB®šH2&ñ…‡èƒ>èƒ>èƒ>p 0?èU°Ü„Òµï¯PWE´1^´oRòÉœLÝRI÷s¹ŸnZÿí‡Ç´¦7°V kiëï4ôw<—.HïÑéýº®€îòÐåï}w] ¤«ïÿºhïè62»“µw°Ã‡{–ŸÌÊü´hQ[^NûìgE‚}D›Æ$¼SV°è(ú ú ú ÜÌúD,7jêÌ N´<.á5¢ê”GOd¤·ÍËèÈ›¯ÏÊüæw¯*¿k¼ÐÄZULÝÊ:;ƒ“:¤P:5—¼×ù4Ú>6 Ñ\¸þñ‡_µZŸ¾«WÝjV(ljõ°RÅŽ}Ð/“)RýI13½ýW“O9Eüb¯ˆ…ëÓRÿ„>èƒ>èƒ>è7óƒ>Q À Iz8”¸„èÅ8ñŽ'?‘ÿ[CúœsYóäy¹çW—µ|qŠ}ûõˆê"Ó¨YKóU¹Ü/¿èR5»*û÷”N…Ò­Pz HðÍÿ>ÞÀ«RéÔ¶¹[T¶¦&SÓ9¯¶5«YÃÑá•+Õs3Ÿ_Ð5^{V†zÊc>2v/…þ'«0ùÑ—Ð}Ð}Ð}àa~Ð':ýÿÿìyTSg‡?Tö„$¬BØ7"ˆ¨ÅêÑ:Õ¶3mpETTPAE—VÐQ«Z KÂ@ ‰Y!ì!ìÈâ†KíL§=íœ27©ŽcÇ¡Á3s¦â{ÎsÞóÝ˽Üï>¼¿?Þ“Àð°Jºô WèêMÑÜ­­“äá^þÞÒöeK[Þ_![´„³qS­X:ÖÒÐ?àçm€ñÈe¶ ä‡Í”zz‡5§žöñª_´ ««>íY¼¤ì“N9wìÿgþÍkjþ.‘üPU=Êåß—Õ[[ÿ¨šß/”+‘Œ%w…’ûBñC¡ø±ªŽ*ÕC,¾/¨©=”Õ<I ÄßÜ”þ$ŽñDc_\[þ^Õ<Ÿr¿…âE ¤ó¼¸ ½ù†Ú'5Q8ŽÐRfÞ0ø?àü€Ÿ·Ðý~€q€`:}@Å >¬ªÊ“jBÌʼ«äÚ`½7+«#+[NÏi¦çȯewf3\Ëúá@Ì'­Ô‹VçéÞEsî›;sxÎŒ.¯YÍS:–a„Bôp«#£sÀø?àüLb?ôø|© /‘‘YgBXP†F‚…ÙuWW¾‡›ÌÕ¥ÞÝ­qÖì:Ï9'çœÕâ” O¿¸ò€Nðõ×·¿úª'-­ó%Ò;þå°[Eï3¾ìSòÏCuPÞ2 »±;=­==]žžÑ”–Ñœ‘Ù‘™=r%íqBÒãåK%3]žÎ]³gôÒ<Úi3Z\y¶Ós4§Å ô‰.î“ìë ð~Àø?“Òý~ _êÀKÐh» @hŸ±I¦ƒ}µ½½ÈÚJHµ•º¹6ÐfÕΠ•Ù9¤‡íj¿rõûÔóCi÷®^îÿò‹¾K—.uüº¾ ë¿‡âòÅŽË—Z/_jƸrµ-=c %uøó”ïÖ®ípq*§yÈ]œäîn-n®N޵înRW§*²é H„>vu ?àü€ð3)ýÐ?àò¥>0¼àh_}¢§©£sÊÒºÐÍMêè\GµkptjÁ¶Ô.nEv_î¸üÅ_>;ÓñüÀùÏ»/ï=ŸÒ•šªHMýUýŠ×ç|;ÆùTö  çº.¤(.¦´]Hm=ŸÚvñbOò©ž” ßmÛ6àèÀöp¯ÁúžêÀ·wP®®2G‡›v6¥–féíÀæàðð<ð~Àø?“Ìýù‚|M^@&…èhîÔÒŒ5%§[Ûc=dK­±³kquU897[ÙTÚ98»^;phð\Ê詓ݧOÞ:›ØvîLçÙSgNË™vm/Ó®^•Ÿ9Ûˆqötö Ï’;1Î%wœKn?›ÜŠ]Øyú³';w 98ç;9s©\Kj‰Û¿ƒ“ÔfºÐv:ºE–ÆñiÛ,ÌBØì!ð~Àø?“Éýù‚|Mž±ÊÿBk tŽè뜥Ú3mJ¬l*Èæ<3s™m«½½œj/™nâÍÎÚןП” ˆ‹•%Å5žJlMŒ—'œh{òç4'$4%$4<§IÉ/'»6Ä'I%‰'°%ëHŽëLÆê±¶“ñ­ Ç[ŽwÆÇlëstaPíKmÊ,ìLª3×Ú†om)¶·•Y’8†º—´4öékoðöŠ?àü€ð3iüÐ?/È×D๕x£h-t‚B̶µgÛ8”ZQ«Ì,yd3…Rca!µ¶â[Yzy—FDôÆêIŒï:-9~¤.é¸ühlóÑØ–WÑüŒ#GÔ«©j£úÄ­“b`7ÆnŽ;ÜŠqìPKÜá–qmØSâ÷ÇÝÚëìV0ʶ¶+µ²g‘­ó,m+H”–VbWçV ¾…¥§™¨¶èh¾ÎŸÅ?àü€ðóûô@ÿ@¾ _þ¹ÿßwð{àÅÇZ¥©yt J±´(£X”-KÈ7ÈU3ž¹’j sÎt«BÏYå[Bz¢ööîß×ÛvøP]ÜѦƒÑ4KãËŒñ¿#> ö}bê£Öˆ©Åê¡ØæÝQ ‘íÑ1÷¶‡Ý³£æ™›XYr(æ7(æUÏ©Æ6¯Ü¿Y9Á(¡mY0/ü€ð~ÀÏ$ð@ÿ@¾ _¯ J¤Íªß9J0aZXaSoÉ¢Œd^I6«4£(1§T˜›[™å9Úç­_«Ø½«/joGddÃý²}ûköî•íÝ[¿wO£ZõMjÕÝ-{öÜRѲgo}D”$bŸPI”xOtÃöpYXDGäþÑ€€.kK&Å4ÏœRfFá’)2VÍ*Aùf6–SÑçSQ4Ñx'ø?àü€ŸIà€þ|A¾^–트ŽÐ‡Z:Ñ%aã/‰RI$q”"©ƒdZA2-'›rÈ$–9‰I&f|¸²nWXoÄÎÖm[Eáá¢íÛy;vˆÃvHÃvÔ¨WŸ&S«†Õ‡moR‚-vH·ínÛÅ{F¸$x‹$d[[øî»~~B²i6`±˜dZI"VIªWà``¯@"qìmª Ó¦¢ƒ††f‚ð~Àøy£ýÐ?/È×ëÀ2G§­SÖië16I'‹ ŒŠðÄb¼)Û˜PŠA0áLJ‰&ÅDB!‰popÅwî°í!›B6‰CCùÁÁ•![!!¢‰ ™5!›ë”`‹ѦPÞ¦ÐjŒà­¼àPÁÚ ù–­ƒÎN…ãLc|.¶UÕžËUû/6&²1„b SB…˜ƒPŒ®vÕv3ø?àü€Ÿ7Úýù‚|½oû–Ѥ©ý'-Ý0míx9‡ËÓÇáð…8ã|#6†‘a‘‘!oXˆ7b¯c¤“}nȦ^éæM²õëyëÖU ‚‚D`£x"H7l¬U$Ý$ÚÌßÌ]¿ ƒ¿>Xä¿V²ncÛjÿvŠù5< ƒ`\¤Ú3–äB|¾ž©¬F…Ø[àô˜Æ†YÅ™œ6僌¯šÁø?àü¼¡~èÈäëµyÛ€þ˜¬¥ˆÐv}½3ººi8ýBCŽ._Ç WW?C_¯§—ÓËÅdŒ¯™‘3>\Qÿчâuëdþ|ÿÕUkoNŒáDH”ŠÖÜ XÃó_ËU-$Ÿú×øÊßyG`„ÿÒÐ0ÓÐ ×ÈÛ0¶í|]\®..çúLì] q…ÚÓÒô´>ך5mÊê+Àø?àü¼¡~èÈäëµùÿÿìûs”ÕÇŸsÎ{Û Ù DbT.’!j rI@É@;SmÑéXu´íŒ3TÔŽÖZDZbÈmw³÷ì-ÙÜ6Ù$@3¶Smÿ…þÖÿ¢Ï9›„ÉnâèèÎ>3ŸyæÝ…¼{Îw¾ß¾söMò½”o|Æf½ð›’â+\tizÀ*2m³À#§-`³‚H(°|–ÙWZì,-éÞ¹#ÒÞ>÷ÔÓ7OÿäÆÉ“©ï“™ŽŽë ¼H:=uêtçÓ§Sgn>ujîdÇ7Û¶cqï²Y}¦é¶L¿Í Øl>›Ím+pš·ióá^0Æï)´]xÓ4^(.>Cú>¤éCúä¨>ù‡òEùúÖä{8¡óWm懥%}–åpê¦O7=júLÃX†Ï2<ï+\ç*)ê)]ßÙÖöuë¡éÓ§ÿuôØd{[ª½}òûoÞ6ÓÞ6‹³­=Õvb9~"uüÄ̉§æž<ñcmߔڻ-«K׺9ïçÌe>Óô˜¦Ó´út[¯ŽSmGðÜ…©]ÕµLãu€¶Ï.}Cú>¤éCúä¢>ù‡òEùúöùÁWðrî%¯½ä€WJK¾ÐD@·iÅ„æÖ§¦“k§`ý_| ìÓŠJ÷ÆÙcǾjiM=:ýÄ‘ä‘Ç#x/>1ù]ÑÔ4zäÈôñãן|r¶µuì`ÓÈÁ¦±æ–©“§þ³§>¹ac?—¾à¼ÝÐÏÁÅÁÉXã_‚èœr;¸…Cxt¼géç‹ Ï56f:#}HÒ‡ô!}~œú™!ÿP¾(_™Éë°·î‚/¼iÓ¿@ôêf”iàÌ¥2pàrqqoUõð†¹ÃGÿÙÚ2ÝÚœlišhno:8†Á—ßMÉ–æTkKª¥yª©yª±i²¹y¦ùÐ\ýþÙmÆ ¯áz:…pbÇE—s‰‹±>Æ®I÷/€ƒÏÐz>æpAð—w<ô6éCú>¤é“sú™!ÿP¾(_™Éë`ˆ3X5øHcWTµuq=à–¾G÷`‰„tÒpæÆŠÉy?‹ñÎÂ"gõŽdë¡7ìŸ>°Ù¿o|_ýRÿø(’¾^Ž‘5q°ao^_?±o_²¡a¦ñà†Æ¿høêÞÊ`‘üãvWTz¸æá‡.çàårÁ²«` 0ÌŒM=¢q7ÀßÞxÑîxÃüéCú>¤é“[ú™!ÿP¾(_™Éßàóþ—ÁO ô …æç:ë@'yÑ%òâ¶ , €TÖu·<`b׎ð®Úë»ë&÷ìÛûØøã{&pâõîGGêI.Oî:ÑýÀݶ[`àç€5×ÏT VîŸ@@×£šð0Yâ?xMèçÞýý,éCú>¤é“Cú™!ÿP¾(_YÉßðÎ…d‘ùR‘ù. è7ôã~€>啾; ³!ãá“OÉ€S7‚†îº§¤$P½=±³&þðÎDÝÃc»´v¯wízd×ÈòÔ¯‰Ú]Cµ»×b®Ru»gkj’›î‰!×)ËÝBó -¨¶€ 8„P+wï‘00Ü‚_ˆ°`~Cï3ô¿œgüµgϺIÒ‡ô!}HŸÒ‡È ù‡òEùÊJþ€3—‹Í×¹< ú3ú^A~ù]1Ñ¿bÀ/È`@ÓC¶‚˜n b!ÆZ^æ«Ü4°ms¸f{lgÍÈΚáUÃÕFªNc"$Ÿ—GKɧO®®³])³;++|[ˆlÝÞ|øþÊ^oy`p¹9¸espõoõÀ}8C›Ê}ÅÅ.Óè弋¯zÞÅ'[/ ,,O®CTƒhúL=þÒw+ C; ënݸ¬é¼±³ö-Ò‡ô!}HÒ'‡ô!2Cþ¡|Q¾²’¿`Û–W~ðÞ:­¿ØŠÉ3#- ,4Ð5õ£Ÿ}Á™6–4™aÄt=à‘È$ ª/Ï]ø¼Àìµ—ú+Ê#‘ŠòÁòòPå&¼¬Ü4xû VV+î ¬vVï½'|Oydƒ=`³ð³ºÎÜ6+Ý¿=éÖ»ÐÑqI1…<“îç‹À-„å³>¸Av‘s€ÊûÞ }HÒ‡ô!}rH"3äÊå++ù[6–='àUjÐ¥1¿Æ"œGd•TFa·ÝzèÖÄw”ó<÷Bþá ›ústeö¸Ã-³GŽp™#ì( •9Bjeþe§ÝásØ81K¥v/Îõëƒ:÷h< ó€`~lê—57¸ìÚD$ Í/Œ9e8N¯fÄUüšðhZ'ÀÎ[ÖYŸï&éCú>¤é“+ú™!ÿP¾(_YÉßP昀€.´”Æbœ ©¢´ÖH« â…€°Î£¦µŒ¨ÍŒÆŠ #ŠpQQh@f ýȺu¾y BÄå!¢i¸¬¹‘Öc0ŠP^÷*ëc\KÔ„ÏÏÄàmËzÞíºNú>¤éCúäŠ>DfÈ?”/ÊWVò·8ìgoÀgÃ1Š® ^DSJƒ¢M à ˜zÄІ2ô€¡ûÞ|™Ñ5oYUyÛ9.O“>äZa=Kà—‡_2Xî5}Dmpï¹4=Ý“¤éCú>¤O®èCd†üCù¢|e% €½ôKÒ`˜3ôG\Y$Æ×@œ©É•5•Sc؃¼múÄJ]q¯B“©wBwƒMwñ:}È¥H×ße°Òz8ŒqÀ½¨=îQ°ÜkÚ8À`JyÈà×>fð.àê•Ò‡ô!}HÒ'Wô!2Cþ¡|Q¾²’ÇÀþó…t ù{£FÐ7 }3¤b°TãL“Xøþ¾ç<ÆyD1ÈEh¼VmûnO ‹/Õ}$w¿“q=à ˆÉgb¸OÂS¤MŒâÿÁ¤¼à€_~~)Nú>¤éCúäŠ>DfÈ?”/ÊWVò·8ÏÞ4Í$ÀÌûxhÕ3Áaa0Τ½ÐyÃ*ECiC >,D\•àK>*ظ`É;¦Æ'5>sñuç1¬æ*#‹Ÿ«>"¾ÒzŒ ¹‹8caà˜ð8°„&fÔG41xßb.~%}HÒ‡ô!}rE"3äÊå++ù[ÊÊžpŽÃ*QMZ "’¶rb¡Ñfèæ)  ™ŽP:KjñÐêþHòމ÷Q¾ŸR¾Ÿ\|>0¶ø¹Kî¿ÜzdÆåg±¨üË8þì&@ `L~QïVž_6¤éCú>¤ÏS"3äÊå++ù[6lü™`/rx_~n>³Ó |¬œ4¾º‰nK!¦Ù|‡S` ÆÕL“XÂè’½5à~|bñýù,“9ºÐ³åiÝÊëIŠù Ç•ûãê>X¯çfdæð1ƒ·,ëì¥KÒ‡ô!}HÒ'Wô!2Cþ¡|Q¾²’¿ ªú%€çθuUÏŒ£}g9ÜTè˜äêfRÕÊ”òVúbò.’·s§õ3ÎEVµ&Ý?)æ3œ6¤"‡k˜±ô¯›SÉÁÍ^øÀo7l|Ùë½Aú>¤éCúäŠ>DfÈ?”/ÊWVþÿÿìÛo”E†ß™ù»,`QBôÎ$^(/4Ñ £Fð@ÄD‹XN‚D œ Ñ &`DE@ÀAART"â–v»ÛnôDéV¨(.Œÿ„3óí¶¥Ñ=Ô vÙ7y2Ùn»ÛÙ'ï{ñË7_[¾Àý3^WòE Za¯2úJŒIßm³!þ9Üœk4“þ†aAôêõ§a“qNk–ï~„™ÈÓs|æôï+´ 4ÛK`ß |¤”.ÀÊ[o[^[ÛL?ôC?ôC?¥â‡d‡ùa¿Ø¯œ”ï°tùA߯X¼§Dí·Ašˆ´¸R Qg.‡å³b¹¨Zõ«ÄiÈSù¢ؼ$ßýÔKijš³tBœæ`_&úI ¡‡cßýVa—ë×HgÙ]ÓÖœ<ÙA?ôC?ôC?¥â‡d‡ùa¿Ø¯œ”ïðñgÝÀÓ!°ÃUÇ"^LOÀ6%qKýÈàþçZ(:©Që<‰«YîU˜«xqqi; úùÐ4鿉¨ïص²òžû6ÒýÐýÐO ù!Ùa~Ø/ö+'å;˜Ç\wmØßcþ_ˆJ“û$Òq‰Ùä¹f'~5±L ó'–ÿ~„‰~ÂABš&˜X¤Çß6»6†Ý:×9 ÔK€g}âmú¡ú¡ú)-?$;ÌûÅ~åèÈ5ßÁ5dìøùÀŠHxëNøªE¢U‰B#…И•‚Þêÿ"ѤtÍšPæTŸ&!Ð*Ðn‡àƱ¡¨R€ ÀBzfáÒOè‡~è‡~è§´üì0?ìû•²~d§T¯úÞGé‰ðxØÜþÒdïIŠ ù.@ÃÕüwÌ«’6‘yRÈfД)@RÙHƒ~¾] æÝâãÇœQj?°Þâo^°ùSôC?ôC?ôSZ~Hv˜ö‹ýÊNY›jÆŒ[ê¨×ù8â{M0Œ:tæ`Ê‘©MŽÌåUCpâ_âž~íp‚7iÏ›Ö̯Î5,ýÁ`Æß ±ñãëgPWuÛUû¿HÒýÐýÐOiù!Ùa~Ø/ö+;e=h¤÷8ð2ð†ëqT½½M¤×œ“ö¦rY¡Ä27‘œµ1ê²k[æ¨\ðÝfûÁš“¶Éç=i–朹&s6®Ùî\S¯œÇýÆí…×xîìªþîûvú¡ú¡ú)9?$;ÌûÅ~e¡Ü€;§/3_ƒnèpB‰n)ú!’P CÈFˆ`ˆìÎ œèåà"Ìɹö"AOÌö²—9ý¦'xÈ&ÈVÈ]ÚåÇ„úØ TN¨˜óÒ‚môC?ôC?ôSŠ~óÃ~±_£¦Ü€UëÂyÚ o€øâWõçÍ€«; Co¯‚ÙÉLtôÏe Ð\Õ*¾4Gßì§h5ÑfU­Ž•òs˜¿þûÔ”) ¶n=J?ôC?ôC?¥è‡0?ìû5jÊ}ÐŒ­xÎToG"§í%0“r{‘«ÃFªuX¾ƒtg PünG1¬zWÒt`pc&ýéO”ò„2þVsg<°îð×1ú¡ú¡ú)Q?„ùa¿Ø¯ÑÁ`æ½÷½ Ì6†¼o€¨‚‚û2ôÂ|ÙeA’º†ž$xæZ¯ ]Ê<è²›ïM#:•JQ+åN`Ù¸±ó^¬|—~è‡~è‡~J×a~Ø/öktp˜¹u»žzgzÞãÉÓ¯G"\~±¤lzF&>¯AºŠfÕûïUè•è“fç™ý‹¶p¸QÉCöÜÂ)SªÞzëýÐýÐý”®Âü°_ì×èà`˜:ý `%ð¾+jÇ8MÊDç× ¥©Á°ȳ¶=v²LY‚A¹HÖ ú)½m™îpŸ‹EÜSÇÝÀꊊªY³j¾>šïõ/ú¡ú¡ú)N?„ùa¿Ø¯QÀÀ°zíOJ-šP±Ø%q\¡Óæ>(À%½"Ý賃òÅLúŠcí ¢T×6¡G‰fGö5R,š<ù•U¯í£ú¡ú¡ŸR÷C˜ö‹ýÒLšôŠï¯•Ø¢Sr“®IR2Ñ¿ TDþÖñâœ]PЫ<Ñ\Ò\H ôÇÚooyéUrÀzógZÂ~Lɯ€mÀŠ›&.š=gÛÁƒõôC?ôC?ôsø!ÌûÅ~ €4ì8︕R®¶Ü2©%ÒJ*¤\ü.ð[ع›0ÈnS¥ p&^¿Ylò.ÇzA =”÷;ê¢+SöÿbÔ…¼ãŽØ-°ÁQ•·O®Z±|ýÐýÐý\~óÃ~±_…Â`ˆ»ï~˜ë{=ÀIàŒ¯zÃê2̵¤?|ù§N˜|Íl u.[‚!x HVÇÑs¹ž†S®êˆ+yÂs(Yã8‹'N|~æÃköîýŽ~è‡~è‡~®?„ùa¿Ø¯‚à0Ä/zo¨xRª݃?z²-¤~W¸â;éxA¤ º-ƒøÓ` x°'öôßå¹g}ÿŒ£ {ñ+™7uÚKÕk?¤ú¡ú¡ŸëÉa~Ø/ö« þÿÿì{pTÕÇ¿çq»›I†—¶Sý§2Ói;¶:Ó™*ˆV¨¶Ò`L €J@)„g€R$¼l´¼¡äýH%V#PÀABؼ—lBÈÛžs’¥ B"“ä7ó™;»wÏ=»û™ïïßÜ{ýÌ::Þ×»Àã¬g涸^Qhጠ:‡ŸñY‡!Aœ÷ƒå1ø9N‡ §Ìj˜À¿<ÞO<ž­À<³Æ¿G»û»Ç÷xuõšmä‡üòC~š˜‚òCõEõÕp¨¸‘=2@eE5Á>ßÊ7ØkÚÊB ˜#±SÇ ³Â¶Ô/äâ„9I÷‰ãÙm9«I@_oT÷'žò§×ïvñ;ù!?ä‡üŸðôCP~ÈÕW¡àF–¬ÚÓJÕÀ@°9Ñ;ͽ¥ %Ê ¹J¼<ë(¬Ï ³!r!ò9Ëaç9Ž›ÍìC@øF°…À(OÄ€>˜Ô=qÊÛ‹Ö“òC~ÈùiÂ~Êù¡újÔÜœ§»Lëj‰dóàèe>k¯¨yìE.—eÂ9 øu%xòôŠ]5pä…(š"‰€Ä‰ ¡Œ#È`(b(‘Â_‹ë;ÕÈr† † ~ÍN3v² [ðÇ*µÕOb%@±`³\‰}¶¸|‘%ROŒkó|×øQ¯Ï^L~Èù!?ä§Éû!(?ä‡êë¶PpKºt<5ÖkÍÞ±‘¥ãžg–½€ð<¸ùp ÌepµáÿG7ÀCÀpÆ`5•pC1ÔžªÈŒTé¯b(3ãýŒ2Tß‚·@åÞP`ÞæH±±]b¡ÀDŸÓ¿mÛîžz)õµ¹;32Èù!?ä‡ü4?å‡üP}Õ5õѱãD³ æÀõ1‘G¢|~°Ü2ð3º F¾ðV@¯‘¯&`¨iÝ W—Dh«3 Cœ©K îÛ`-ôÌ&è×'©Ž~!ô·œâ¨`%ß)õ™¯±/·iÓ÷ÉÎCÆM™—žù1ù!?ä‡üŸæã‡ üª¯z à6üü±T W¤ûGŽùÀ É>”üy>v®I^‰ã^*BœJÕN°3`Å`…àù†\ƒß¯èaõs¶VªgãÅ=­Ê})GGeuýè{ôН“åq3…ܸJÿ(‹õnÙ²×ã†üæÖîaïK~Èù!?ä'<ý”òÓè1 [¨¸=¿|fC/`ˆdi¶X%±ÈøÜu‚ŽT),Î…¨4˜J`%¡àæ›Åòæš9ßD¹¤.¥·¦¢PS}”®ŠJŽóÕI”yD¾J¿ë¤ƒ/fªß öÛV­»vxrਠ³7¥ï"?ä‡üòÓ<ý”òCÜjD|üü–-“ß“¼ÖÊhO†Ä^ '¼¢˜é3S*ôç¿R¦å%úd™Ê®q~ ÕíìõŽö–`jCÏ /Öó°ÒPœ¨(u絎Ú|;ð60ßú¾gŸèÜgÜÔ´»¶“òC~ÈùiÎ~ˆú¡üŸæ 5 eLʦvm“€D`T„³„c-°#JóèÛQÁ*Áª4øBÃjS^©å† D¢È0ùV e†`ó‘Ïͼš2Æ‚%6+8îʹ ø30x©E\¿Û÷y®[òÔ™iä‡üòC~Èq[(?ä§B À°v]Á#?Õ—Ä9|¢ƒ¹6–E¾Rœd¼ˆñã%Œ••›bP•p©v ¦t 0“{=^gZRÎTßÌ*õk½GW‚SV3›ª1µGqÚÇy@°]û=G¾Œ^ðEwûñ£ƒžaLêk³wdì ?ä‡üòC~ˆ†@ù!?Í jî˜Ä„Å ^‰´§Ó–[¥åñe3~ܬ)PM*PjË«Àè‹Õ.êìšy{¾ú×—Êé“Y¨¹ í¢Äe† fOC9綨°­ æó/÷¸¯7Ûu÷ ¾XÂØ|`0ÐñônÕ.ñÑÇ’’GÌ~wÅFòC~Èù!?䇸S(?ä§ù@ À×aéb«¸~@|´£ZÏáÀ_À7Ønºí|dÉ}Rf ž äJvVâœ`—$ÿRŠÿHñ_U—.|!õö’Ä+W®Z¸¦^ÈšO+%«°y¹‚£\ Äæ§]ë°e¥3±x f²O‹ØžßÿA¿çâÇŸ²pݦÝ.‡üòC~ÈOØú!ê‡òC~š Ô|}¾¼è5Ȳ&¨V˜¡+jçÁ?ô:YÀa (æúQvU:îüª+¾´pÑÂyGo/;&÷®Yº6ôõsUª<¼Â•g½²ÄkùDž 5Û.`©YçžÂ­dÇ××Õýþzvè4,ihÚ»K·6ºòC~Èù Èq7P~ÈO“‡€»åWÏNóEö…ì–Ìe cSY’/Þ×â`Lä±÷¤¥Ÿ¡ý¹A?;ÃFÀÑ”8:(3”«­­÷¨ýy;-ñð)°ø‡Ä6‰Õ\¯sW“' Ù;"º[\«_ÿìñ½^œ<#ío›·ímtä‡üònân üŸ& 5ß ICÖÅ|;èìºýcb&>  Ìþ ü]`‹%v»ÖGgŸÏsÐb{,ì7´ðoÃ!µuŧ®ÜçÈÚ2]ðÍŒ­V ,Ìz¶$†¯÷7ß{ ¡C§Á=GÏœ³êýÍ™þßÉù!?ä'œ!?ÄÝ@ù!?Mj¾IÞHËxø'#TÝZD¥H>Ža Ç,ËzËç]æñ,gl± ´à«[-±F°5k[k¶k„Žû"èGîMªKh´nyõ£øz´n™ðÐC½ŸþÅW†ÏZºlK£ÿYòC~ÈOXA~Èqï üŸ&5÷„ÁɾsßÐoÅµä  ¿ 1c)–“ L^Ÿ¬Ð'Ëø4Ʀ…¶Smg*¬5xè §—Õ'*.¡}ûß=ÓeØÈó¾óþ¶™þïÈù!?á ù!?ĽƒòC~šÿÿÿìÝPÔuÇñ÷îw‘]@µc©AãÝYR6§iµÄ”`ZÎ)°€¡DËòSµ²ôÌÓÁXÇŸx3Úas5^¥eVvv©)Á*¸,첿Ã.,â§]眹n.µ«ûšy ³|÷Ÿïç9ïïïÙY,·ÖŽ]¹¹ÿ!qsÜ£•“cJÆF½B´˜/ȼjÉÉ#ÊF¤GMȘôÐË¿ªxaú{yÅõk«ìÝ÷ù‘#'ü~ôAŸ@ƒ>èƒ>à/˜ô¹­aøU5ü¾NþÙú ªªëË+ä……[¥ÒÍùù[¼/JJkÞªÚ»~ÃþmïÚÿÁñÏ*ü~·èhÐ}Ð} 0a~Ðçö‚ ˆ`"X‚€ ‚ ˆ`"X~=µòïþ,ݹ`áúä¹ï‰ç¼=}ZQÌ䜘)Ë㦿öL|ùóÏWV¬nØZ{Ìï÷‰> }Ð}Ðæ}n;Xn!¹ü̲e»'=ð ÑsD/ˆÆd‡†¾L”ÍQ.ß÷óx¯yßZF´Ô{‘GÙDé|~'ð¹´ wç&§l¯Ù¦ñû)Ð}ú ú€¿`~Ðçv‡àæ+_Ù0#®(:b©ïGïhy˜ `\DÅ„È5Ñáå"NÆ£\_Æ ŠB¸"NPÂð9Ç+ ž,L¸*$¤TÀ+áóKÆpeÿfôµý~.ôAŸ@€>èƒ>à/˜ô¹c`¸i¶nûföìR¢yÞ¹RÑ=ÃiˆªETRuÿøu?´iöãµbq]|BMü³ïÿqîöÄ”]IÉ{žÝ+NØ3G\?=N>푱1ÛÇÛÂÑ:¢jý%T°‘¨€£¼(‘tæŒwß©>å÷“¢ú O Aô[óƒ>w,7Á éß&Ǭ J†¾zoô›DÅD+Çò6M¿;þñ#KS›¤9çd¹§«×*pýø#kV²sL©a:Ÿ ]¾+g¬Vî¨~G›'=—™yò…'ž~òpÌ佑á[娒¨„OùD’ȱÙE…‡ü~jôAô èƒ>pë`~ÐçN…à†T¬ù„/XÈ£ÂÐ7BÇxg´BÈUÿ.¶~^Ò·/¥6å]|·Rß°ÿ’¢‘9ldˆ 0³™ÌÖÏ\ÃÌs™ \b}?1K/3XÙàb6;;{–Õïé[]Ö˜³üË,É׉ωR¶Q$¬â¨ôÊ·è–N¼O*ËÿÈïÐ}Ð}úÀÀü Ï ÀuÚ±³ãѸÕDéáa%tåãªð°šxñ×éi’´……M;w9ÏŸgZ-s»Y¿‡ÙLo¼l4]²9F-Ž!«k¸·´w¹¼o¹™Õ1j°^¶Ø˜FÏt:Öëò=-F#û꨻vk{šäXÆ’æE‹~˜5ëãqwm"ß3 ã‘ÔûLš˜'—Ÿ÷{ ôAôAŸÀ>p#0?è °\ùó7q¼4¢ïÓ®Ò)“>zâ‰Só_TH²‹ËÎíû»Cq‘Yܬo˜{‡T:‹ªÇ¤7º­öa›uÔd1/™MÃã°Åp#0?è$°\›šºO*%Ê ) ¡ÊèðÚ™3¾L]Ôž’|r៎¿Y¥úâ8Ó˜™ÖÎÚz¬ÝV³Æ¦ÓXµÝzmg·AÕmÓê†lfÒzFtêA­z@«vk5N½¶× sôv£Áá¥×:t=vïE“Ám6³Öft²“le…"9埩‹Ï¤-R>=û_÷ÞµKÈ_/äʉ$ã£_Ú±« }Ð}Ð}Юæ}‚ €k“ÿñÒDaeD+#DuSc§$©–Hz^œÿéªâïÿqp°MÉÔÖ¢dç/ tj:4Î]å¥vªÔnU·GÕ5Üõ?]åñéîÿŸº<íƒ=Zf±±ö¶{·>3ëðܤOÓ_XÒ>gæi‘ ŽhÕøÈ·CCV¤.Þ‡>èƒ>èƒ>è×óƒ>Á À/5}V'ZùQy샇.<—ر`žznÒwo­m>x@{ökQ°ÖÖÙéÔá¦f›òbïU.e[¿²Í£l¼Âsõßÿÿ·­Í¥îîkm145™[[Gš¬áÙ¬IüÔg’TmRBûcÓNþ6ö(‘÷Æ^Ç‹ÿŠ>èƒ>èƒ>è¿æ}‚ÐÏÿÿìyTSg‡?T!aß4Š R-VGëLm;ÓŽKÇ QAEET¥€¸´‚ŽZ­`1€$ KØ“²@ da ;²¨ˆb—éLÏt¦™›TDZӡÑ3s¦Å÷œç¼ç»—{¹ß}x¼‡C€@/¬ÈïÍØˆP¨éŒ4wö{¿½üºtÅrÙª·##Zj«4bÁߕ͚Ž6M‹ê;™ì+Yó#¥j\®|ðÅC¹b\®x,—¥[|¨GU(ªÛÇ[”£õõÃõÒÏÕ]U›æúgßnÝÚö«¥’ß½Ýÿëå]+–¶y9ߢ/ íçd­vr ?àü€ð~€Ÿúü¼šÀð°J»LÍßš>#dŠánc“T_ŸŠ7—·¯X®üÍ[Ò%Ë8›ÃDR¡©}'®ûF.û®Yö¡ðP4¬P>nÞÕq_ÇhCㆆÇ:°Å˜¾HG¥’»mª/ZT_ ÅÂ?I5ü:MA‘æƒuò߬”-_*-Pòö¯U´RŠu:BSÐj¼Õð~Àø?¯²`b ÀÏ« ‘ÏT"ŒÍ”¦¦G §žôoZ²¨««ß³tYùûë8\Mÿ;þí¿Ö×ÿM,þ¦¦vŒË•6}ÙÐô¨–ß_'Ö"©ß«Ö‰Ö‰ÆuuL{¨"Ѩ v¤AøPZÿH(~$}~[ò­@¢á 5Ÿ\Õ¬|³fa`EðbÑ’E’…þÜÅ|s㓆(š€‹Fh9³`ü€ð~ÀÏ+è€þ?ÀÀ0ÓM—!ôît£¸)è$Í[üZ@÷Vÿua€,0°jÕ»œ?^-®þ’U>RÃ}Ìã}ÁãÎå=â ÆÂ<ÁHUm÷ö Ža.ÿ. .o »@[±5ÿžžðy£·¹cÕ#•ƒÚú‡Õ¼ñJùšÊjMüá%ÁœeK…o,®k…ú5ÿ_®ößæí"XÄ"´ü€ð~ÀÏ+è€þ?ÀÀð±Ä¯ÂY†MÛc€’–½Þ¹xA¿ÿœn_Ù›ËÚƒ‚J7l®©®ÓT •󆫹clöPqÉ?Ž57«¸“U¬®åp*útôs*îpÊG8å÷8œûZ´ë!½©©/+¾WÂ,ã r*‹Ëû±Ô•VÁ*ý–]¦ÙÞÀư<¸Ãͼ@=ß[ˆ7»ŒÐS“8Üÿêwaàü€ð~~ž~èðùš~¿ùû¦®E(ÄÄ(y>­.8¨oIÐÝZOP@[ÐÁËJ?Ëù[~уÝÍd·Ýdª‹‹‡KËF˜]ùŒv»·”ÓÏ.éawck»ŸÅ¾Ãb ³XwYE÷µ•5¨=£'¬á’¢‡¬‚ÑÂBí#*kFÊ«ï–tÓ™ôü¡’rÍÙ³‚.ðãù+–-^8²x~op`+B‰Ó|`iõø?àü€ŸWÄý~ _? ?›+ÓHä}E˜›¥zº•Ð|$~³[ô¾ ö£‰æÍe?ñðzö×9ùwsougçÉ=Œ‚~FA¯ŽžçéÕ~‰y‡Áb0‡Œ»Úª]ßÑ›!fþ-Œa&³ŸY f¶bäªéŒ¾\æã›ùš˜˜~7*#Яy¾Oç\ϾÀ9ó}Ûüf‹¦¦ idüÁÂE±àü€ð~&½úü@¾ô€ŸoŽÛ6uê~3Ó4w—¢@ÿ¦y4¥góßæ…òÙ¾åK–Tœ<5ž™õ87ï~ÎÍÞlz=·“žÓýŒç{é9}tú€ŽA:}XW´'õ„>˜“}OËÁzoNNGN®Šž§ ç©nävæ2ÜÈùæ`ü­ÌŸÖèçÓEóè[0gxþì.ÿ¹ ²5Ë0Bá¦fkbãòÀø?àüLb?ôø|é Ï‘•Ýh…_ƒPˆA2Åæ¦—ß×[êåÙäãÝC=è¹® éê‹é­2ZÎg´^¼Ø“vª'ýÂב‘n®l_Ÿz¬ï©®|wÕUàå%us½íìXfg“‰ÐlŽŽ.?àü€ð3ÉüÐ?/È× À3HÄpÃF† Ö¤L笇œ¨õÎÎJ//µ»‡ÂÞ±ÚÙµÐÃëÆÁÃçÒÇNì>}²ílJë¹3gOuœ9=!gÚu´>O»~Uuæl3ÆÙӭ؃>JëÄ8—Öq.­ýlZ vArJçéïÜ5äêqË݃KuåÚQKÝ9Øþ]Ý%޳êœfñgQ NL3ˆ¤Ø„³ÙCàü€ð~&“úòùz!`xÂêµúÃL“£3LÎR]˜Ž®¥öŽ•$[ž­ÔÑ©ÅÅEEuÏrdÑæÝÚ·¿?9¹?5Y˜ MMl>•Ò’’¤Jþ°õÇP=E‘œ,ON–=E®åû“?]eI©âäqʇ2ìA©Ç;Ò;Ó°z¼õdRKò eò‰Î¤¤‘íQ}nž ªK™£k9Å™AqeR=¸Ž|;‘‹“ÔŽÈ1Ÿ~ÉÈ`ÿ ãMþ1àü€ð~&úòùzQ`x*Â`Î"Î}H&ä:¹°]Ëì©56v<’L®§P$ö|{û"ÿ€²˜˜Þ„Ã=)I]‡âÄ'Ž6¦žPKPKPþŠ'm>v´I‡TW›õ'áXSB¢»1ñˆ"ñH ÆñÃÊÄ#Ê[±§$è?<±­×ûp•íà\fïÂ"9Ø9UÉUvö"/G ßžÌ25L1@[M _æcqÁø?àüü<ýÐ?/È× ÿÜÿï;ø9ðúÒã­64<6¥ÛQÊÉ”R’])‰RE¢Ômx¶Zj)¶œYöE~s+¶†÷ìÛÛ{`KbBë‘ÉÇä‡âšTLHóóL|ñ¿£Š;¨zò}â›â5ŒoÀêáÅî}²˜Øö¸øûÛ£î;S lm íí8dÛ*²mÍSj±Ík÷oS·ÈFè B[-L?àü€ð3 üÐ?/È×K€qÌþ:-ûD{âdÛ£¥Q1±ÆÖ­ër°c’­ lÉå6d.‰, aÕ¦ú{´oaSéhW9}<Å,w‚ð~Àø™~èÈäë%€`Å®˜›½cd‡P*6þÉÕ"O.%+0ˆÖ•Dë ’5‡DdÙ™$BÖ;«wEõÆìl‰Ü&ŒŽnßÎÛ±CµCµ£^¿ú”(©^5ª)j»\ ¶Ø!‰ÜY¹‹÷„hqèVqxdkôî{ÁÁu$ë\,ÀDB ѺšH¨%+u¯ÀÁÀ^Hä¸8ÖZš_›Š!ôADD6ø?àü€Ÿ_´úòùz9`Xáæ¾Í`Êc“£–V™BñL‹b¡gͶėaà­8x«2‚U _DÄßÄͼ´ *jû@x˜,|K£l. ‹à…EÔb„nã…FÖo® WmÝ6èá^„·Ì¶Äåc[Õí¹B·ÿK/Á°Æ“ yÅO7Ž¢:m?àü€ðó‹ö@ÿ@¾ _/Ç«>\Ë’ÿÎhz”±q‘”gfV0Ã¬Ø Wdfyk¦üØÂœ3/ÂY0 –7± ÒÝ%?<¬wíZÉ–0鯼 jBB!!Â`³èElÚÜ %D²)D¸)”¿)”»1 ƒ¿1T¸v½xÃæÖ5kÛɶ7p8, ¼e±nÏX’‹fânÍÄ1µÕ¢{ 3S¦¥yB‰V‡¦My;ëºü€ð~ÀÏ/Ôýù‚|½4ÿÿÿìûs”ÕÇŸsÎ{ÝìnH6‰QAä&DA®¹‚$\*-u:VEmgꌵ£UÇ:¶VA Én²ûî%{K6÷+ Õ^lû'ô·þ}ÎÙ$I6ÄÑÑ}f>óÌ» y÷œï|¿?|çì›z8pð†yàT‘ë#Û¾ä.Š{¼Ë³<Ž]CŠ\ˆÛs»œž_‰QyËþÆ¿Øí©§¾>z|ôèƒ'ŽÍcWæÃµcǾ”¿vìÄØ±#GŸVàÅ—GŽþõèñÿÔÔŒ/hòzÛ¼§Øƒ ÆeÇl·c»ƒEp/^wÜÔ.¹Œ ñ[?Ѹ÷=Ò‡ô!}HÒ'Oõ!È?”/Ê×w¦Ð @ù¶õ,Àoнç¹hÒôˆåê2íˆé ÊiGl+Џ¬ˆËr,³µÄë/)n^½*ÑØx}ÿk‡vuß¾C‡F~Hƺ¢À‹‘ƒ‡‡ÄyàðÈ¡#×ö¼¾ïÐ7K—aqo²­VÓl·Ì°mElÛ±ívÛå7%í¦íà^0ÆoqÛç^5g¼Þ#¤éCú>¤OžêC(_”¯ïL¡€½:Ñ6ß/)nµ¬€xT7Ý ªé˜F± Ç2‚ouŠ=-% .64ü³~ûèáÃÿص{¨±a¤±qè‡oÞ0ÖØ0޳¡q¤aï²gïÈž½c{÷_|ï×»¾))m¶¬&]kæ¼³€i8¦4M¿iµêöe§ÚŽà¸ S» kïšÆË Ÿžý†ô!}HÒ‡ôÉG}òå‹òõÝò£¯àGäÔs¡Òâ^()þ\Mͦ•z˜X«š~Iü‚µ|ð °O**Û·TïÞýU]ýÈ®]£íܹc`Çö~/ðå®Ç†¾/jjzwîݳçÊã××÷m«éÙVÓW[7¼ïà¿×o¼cag>çü2º C€ƒŸ±Æ¿qpÊíà: pàmKÍã>U]ëŒô!}HÒ‡ôùiêCä†üCù¢|妠 À†µ§uxàU[ÿ pY7“L‹Ì€€`• ç¼ÞËËWtoÙz}Ç®¿Õ×Ö×ÖÕ ÔV÷×lëÉàËêÁºÚ‘úº‘ºÚášÚáêš¡ÚÚ±Úí×7n_zÊ径ë¸(„;.ºœKŒµ2vIº2CphøÃiÁŸ_õÀ¤éCú>¤OÞéCä†üCù¢|妠 €!Ž`ýÕàWÕ6Àõ(@»ô=ºK$dБ…³v¬˜œ·¡±¿èöøW¬¬ßþ¯­›G·l@6oêß´±Ùøh/’½ž‰žy±mëÞ|ãÆM›·n«Þvukõ—[¶~uWeÔ#ÿ¸Ýy€®¹pÐåB\.X–`Œ†¹ƒñ¨©'4Þð€7ž-õ½Žþô!}HÒ‡ôÉ/}ˆÜ(_”¯ÜnpBÿeð„K?í6?ÓY3:)„.‘7 cZ‚ ª°®·Ë&vÉ狯©º²níÐúu}étýN¼^÷pÏÚ‡2¬í…̼ÀÛâ=×>Ü»aýðæMW7n¸ZU5²|y¿e·ryrwݼ]Ãv+" °憙*ÁÊýˆèzRA&Küû/ ýÔ[¿'}HÒ‡ô!}òH"7äÊåkN ·¼yzÐc>ç1ÿ Ãm†a< Ъ¼Òú­ÈlÈx8ò)ðëFÔ°"ÀBGV,ˬ^™~pufíƒ}ë긪¯×¬êzhMÏÌTuÏ‹ª5]Uk2Va®FÖ®_¹rpÑI»C¹N™XÞ.´°Ð¢j Ø€c˜µr?ð Ã-„…ˆ 6ôVCÿà5Æ_zòd;éCú>¤é“Gú¹!ÿP¾(_sR¸àÈ¡s^óe.O‚þ„¾×EDX~WL´ÍË2èÐô˜íJéF'b, åeN墎¥‹ã+—¥V¯ìY½²{Õòî÷'X‘y`E×LIÝþ\vbù²äÊåÝ«VôÞw_¦|aܶðs›úžwpá õ•û£j…€¸q¡[àã4Œ€iÚ;Lüº~ÇŸIÒ‡ô!}HŸ<Ò‡È ù‡òEùš“Â-ÖýN‡çN|ªAH0 @ŒðæYVDIŸ1“ÏË£¥äÓ'Šìóe¥þÊ gɽ‰ûÇß¿§2‚×Kîíœiv.Y½ý‰·º÷nœ±EåŽ×0Ëœ_Æâ«žwqdëe‘ÉåÉrHjÌž‚©Ç_Zo€ah;t½]7Îiú»¯¬®zô!}HÒ‡ôÉ#}ˆÜ(_”¯9)ܰtÉ ¿x»HkóZ)yf¤E„…º¤~cÔÔ³/Ø#³Æ’&3Œ”®§‚™„Nõå¹3Ÿ¹ÌË¥%áŠòDEE¢¢¼³¼¸Av†s€Ê»_!}HÒ‡ô!}òH"7äÊåkN ·,,û…€9¼¯A“ÆÂKpžUR…Ý v è¡ßQÎ rè_²¬4éóÅË|q_Y¬ÌS3ê+ Ï8K}ޝ4‚³TR¹`ATçAGt,ŒMá²æFg\ƒ$ƒ ƒ®‰…1¿ ÇÒŒ´ @XAM»ðÀk–uÒq®‘>¤éCú>ù¢‘òå‹ò5'…[Ê|Є–ÒXг.uB”µÑ<iµN¼×yÒÔ“–‘´Í„Çò¸ЏÇ›$’·;Œ9¸bïÄå!’Y¸¬¹‰YÖ“bЋP^)ëcÓÕ„cÈÇç?`ð†e=ݸBú>¤éCúä‹>DnÈ?”/Êלn𕞼9]œu¤@z(9/@zM) Š65D 3`ê C‹ZÌÐ#†î(B“8¹ÑµPYUyÛ9.Î’=äše=Ó–‡_2Xî5½Gm°ï9=-ÍC¤éCú>¤O¾èCä†üCù¢|ÍIá€Ò’ŸO @LƒnÎÐie‘Ÿi¦&WÖTNMaFð¶Ù+ytÅC yL¦Þ‰Ý 6Ý©ëì!—"[gÀlëáÐÇ÷¢NôxPÁr¯iý]€)å1ƒ_øÁ[€ ç{HÒ‡ô!}HŸ|Ñ‡È ù‡òEùš“.¥OM YÈßÕƒ¾é›.ƒy g–Ìä÷ÏðÍ4ç)ΊN.bàµjÛ·"x™z©î#¹õœëéž @J>à ëL‘6 Ћÿ“fð€T~ùÙÙ4éCú>¤é“/ú¹!ÿP¾(_sR¸Àç{òæ i†`ÂÇ]·=3ýLÚ ×­RÔ•5´àÝB¤I ¾ä½‚õ 6ø­©ñ!àœzGݹ«¹ @ÏÔçªH϶ýBî"ÍX8f < ,£‰1µÁ% Þ:€3Ÿ&IÒ‡ô!}HŸ|Ñ‡È ù‡òEùš“Â-ee'œâð® @R“Vˆd­œ™l´sNtó0†a0˜P6Ójq×42êþÈà·&ÞGù~Xù~hêý‰ @ßÔçN»ÿLë‘è—ŸÅ’ò/_àdø#°k#}ò‹z7ðôŒ }HÒ‡ô!}~šú¹!ÿP¾(_sR¸àŽ…Ç{–Ã;ò;påcå¤þۛ趄Ã(›èÐ} ŒA¿šY2Óèö¯7æTÔL½?уe2{'{¶<­›}=ƒb"Ãiåþ´ºÖëëc2 øÁë–uòìÙéCú>¤é“/ú¹!ÿP¾(_sòÿÿìÙoTUÇ¿çœ{çδÐE¢o†`õA¼ð  5bQ#&RIJ#aßB°,Œ¨„Ý…  [Ê&°Li§3ít¡¥­€ Ÿü'<çÜ™ÒV™™Öf˜oòÉÉtÚ™žùäû}øåžÛæïPòô,à#`eQÁ!Wž¶÷ŒëøF$böNÌåÌÖËv¬¼b³å?ÿ‹Ë}éý”kíG˜ô‡U¢Ãç!ÎÚÊé=TÝf%êlsô‡Ý|,~lÄì#G¢ôC?ôC?ô“+~Hj˜ö‹ýJKþ/[«ät`¹Â^eþô•k$âžÛhC|9Ü´k8™þê^èG¸ïz±×dœ–žšeºa&òÄŸ|ý{£ uöØ)ÝJé,zr䂊Š:ú¡ú¡úÉ?$5ÌûÅ~¥%€¹ z^©ÀJà+%* Üji"RïJ]€D¥¹–Éjˆ¤£êÞª_%.A^ÈýÃæ%™îG J"â˜Õœ¥â’0û¢0Ñ1={î)…®W.yϽ°ìüùfú¡ú¡úÉ?$5ÌûÅ~¥%€oh¦½uÀvW( DôlSµTõî}×¢“¶±Îp¯š¥_…¹Šu•¶ Ÿõ@­þhöÜÛ VB–¾8v ýÐýÐýä’æ‡ýb¿Ò’¿€ùðxÓuW„¼=æÿÕ‰°4¹#—ˆ­A†kj¢}‰$9‘Ì÷#LôcbÒ4Á Ä"1þ6Úµ&äVºÎa ˜¼÷ÆÛ›é‡~è‡~è'·üÔ0?ìû•¦#|!EÓ€……¡=®s 8ç©z‰=& ˆ „š” è­þ/µ q׬1eNõib Mv® +uX Ì”ÁwgÎýŽ~è‡~è‡~rËI óÃ~±_©Éë`Âë;¤úÔ lw”žÏ„Ìí/µöN‘¸ðk ‰T÷åþ0¯ŠÛDfÈ@6ƒÚdâÊv@ôóMÍ0ï-*¸¢Ô~`³y|ÆÆ/.ÐýÐýÐOnù!©a~Ø/ö+5y=¬+¯.:×Qå®ó=pÌ ÔÂ\0jÖ™ƒ +ú§6Þ?—}†àØÄ=ñÚÞøoÒ”1 É_)ªWúý ÀŒ¿~"EE•޳XZ6ò™²ý?Åé‡~è‡~è'·üÔ0?ìû•š¼42ðð °ÞõŽ9ªÊÞ&ÒaÎÀI{S¹¬„Ð"É›H®ÚµÚµ1yTÎÿnýMKãÉä={¨“朹&y6®Îî\S¥œjÇ=éwCËî¤W_[~ú—&ú¡ú¡úÉ9?$5ÌûÅ~¥ ߀gGÏ3MƒnðpN‰6)º!âPÕ÷5þÙ\¸.ÐæÊþE.˜“sMY‚ž˜íe/súMOðµ ͺ´õÊ‹õ3°(V<ùã[é‡~è‡~è'ýæ‡ýb¿M¾KV‡35Z ±⬫ÚëfÀÕС·WÁìƒx²:ú×’hð¯je_jý£oöS4˜è‹³ª'–òG˜¿þûNIÉŒ-[ŽÓýÐýÐO.ú!ÌûÅ~ š|4CŠ?ð —› /ÙK`&åö"W³TC¯|ûhKÀ? ÖóÝælXõ®¤é@ÏÆZLúŸ(&ä9eü-¦Œ{eåá£ú¡ú¡úÉQ?„ùa¿Ø¯ÁÁ`üKc?¦k‚“@XAÁI:`¾l5?I­÷ðŸéÁæA¯- ­ÊÏ“,&!ˆNv’ßÌgvvß<ûîæ3ßï¿yßw_¾dáâ¬øݸø :°„a³Í?vE¶@@ À‘Å*^`Ç ® h =˜3öÔÿ©míwœR,gæà—çïußýÏ u6ù!?ä‡üŸ¦ä‡ üP¿¨_· uè?pÐÉñv}óò¼MÀs¯wõLìõêÊU›Éù!?ä‡ü41?å‡úEýj84\Ϩ²¢†`¿yŒ›ì1cePÄ‘ÇØ)ˆ£YQ[õ ¹8aÒ}äx;-g%0èç‹ëùèãCþüú^üN~Èù!?ä':ý”òCýj 4\Ï¢ûÚ¨ ›³ øÐü¶TD™@W‰—'`u 2""ÈY®ˆ8ÏqÜlf2Á×ÍFx1ïàåá£ænÚ¾ƒüòC~ÈO“ôCP~Èõ«ÐpƤíŒmù’ê€doZØ#»<À« À‚9:ú +V.düFYD°u Ö¡þLë5E†‚Èâ@„¯~ZãÙ'¤Ü ¼ ÌÒÀûïž”žÉ“ß^°–üòC~ÈOöCP~Èõ«!Ðpcžè: ¬»%RÍ£—ø­=¢æ¶¹\– ç ÐMðòô'º5päEÈ—šB‰D±DØPÆæ12äGÈ‹¨Åµje9CCX?g§;Y -x¾c•Úê+± H-°Y®Ä^]¾ÀiŒ'·j÷t÷įÏ\H~Èù!?ä§Éû!(?ä‡úuKh¸)]»Žžl7ÆgÍþfcWœŽ{ž¹ì=äƒçÁ ÂÍ7§Áå׆‰.7à‘0B¬¦ ו¡ö® ÍJ•þ*†2³>ÀØ)CõOðæ«ÜòÍˉÃ6¶H̘àw´oß³ããϧ½6{[f&ù!?ä‡üŸæà‡ üêWýÐP:M0Äü˜%°6!öpœ?à¹!Ë-/ÖC0‚ÂW}|5!CíLëQ¸º‘Gi ¡¸.¡º/õÐ{6A¿¶“êè@Ê)!Žv@òmRù#ðB»výë2dìä9»>$?ä‡üòÓ|ü”òCýªnÁÏNzǺä˜ ,“ì}Éšûcçšä•8îy " Tm+++r CP/ÐËêçL ¬TïiônUîK9*8*«û££Wäøœ,ÏÝ%äFÆUúGX¬OëÖ½éH¢ÌA•~×É_ LWßì·mÚvïøØ ãg®ÏØN~Èù!?ä§yú!(?䇸!44ˆÄĹ­[§¿&ú¬åñ^¦Ä '|¢ˆé#S*ôç¾R3¿ò}°LeW‡8XCõ8{m¢½iL7ôÔÛ‹ô~Xi¤g*Jäù¬#6ß¼ Œƒ%¶ýîSvé;vJúºí[Èù!?ä‡ü4g?DýP~ÈO󄀆2jôúíS€d`DŒ³ˆc5°5NõôÏQ…Á*Áª4ø\ÃjS^©å†0D¢Ð2ùV„ e†pó'µž›7òjÊ K”Ø,_â¸+÷{r3ð`ð|‹Výïùaßn=R§LO'?ä‡üòC~ˆ[Bù!?ÍnƒÕkòü©>%Îá̶±$F¨ðm•â$ã…Œ‡/a¬ ¬Ü”A5áb ìçMt˜É½^¯3­ÞRÎÔÜÌ*õs½E7Á¬)«Ù›ê˜Ú"ò…8m‹ãŽÜ/ØvÏ~בoÃgüñ=~üÐà§Ÿ•öÚÌ­™[Éù!?ä‡ü¢!P~ÈOsƒ€Û&9i¡@’ƒWbí©ÀTEÀ&igyþlÆ›ëcòÕ ”Úò púdµ ú »j^ž«>@Æõ©rú`jNh» q‰á¼ÙRÁPÎy…-*lë¼yË9‹—{nÈçËvÝ}‚o16 r¼>m:$?ôpJê°™ï,[G~Èù!?ä‡ü· å‡ü4hø:,^hÓª?ï¨Ñs(ðWð÷l7Ãv>°ä^)³Ïr%;#qV°‹’!Å¥øƒêÀ%óŸKýxQâ²Àe‰+W,\UOdÍ_+%«°y¹‚£\ Äæ§]ëee0± x ¼Èdß-ŸýÁ}ý»%Ž7yþšõ;]ù!?ä‡üŸ¨õCÔå‡ü4høú za)ЩeÜ`˯Fa`šnÔÆ÷ßçd‡€ ˆë[ÙUé¸ó+®øÂ çýxÉ1¹wpÕÒÝÐçÏITY¨òx…+Ïød‰Ï*ô‹<joÛÅæ:÷ÑÜJuüý|q=ïºûÙŽ_Ny)ýÅ›]ù!?ä‡üD 䇸(?ä§ÉCÀò«§þäí9,•ËÑŒMfH¾´eüÎV-$ÄqOZúÚŸô½3l„M‰ƒ°ƒ2C¹z´õµ=Ïa§%ŽŸ»Kl–XÉõuîjç©Bö‰‰ïѪͯöÈ ÞÏMš–þ ›÷4ºòC~Èù‰6Èq'P~ÈO†€o†”!k¾“tqÝ ãŸŒæþ)°Ñ;]ëÏÙë÷Xl·…}†>5T®øÄ•{ù[f¾±ÕÀr`ž…iRï-…!ÉçûÍ÷ïNêØùÅ^É#§ÏZñ¯ »ý'?ä‡üŸh†üwå‡ü4Ihø&y#=óŸ S5z´ˆ-ùX†É3,ë-¿o‰ç-el¡ ´à+[)±J°U«[mW ÷зܛ TWh¤yõ­øzµmtï½}žøÅW†ÎX¼dc£ÿ³ä‡üŸ¨‚üâÛƒòC~šÿÿÿìÝLÔuÇñ÷Ý÷Ž»„4 6[¥4[šš ¥%¤–KãGàL¤ãàù¡&‚? uº Æ9Å6-mÕ쇚YY–?2R´DÁŽûý9~ŠŸîZ¶Úr­6;ô^Ûc·Û÷{Üç¹ïŸ÷Ýwûb¸+äYÃB!Á ¡ “h©ë"æñV EkˆV­‹ûÏ2~9W~ûu½h= Wº>L”F”B¢TŸ€…C’Gž?{fNAþ¶êš=éñÕ¡ú Ï@†>èw®ô¹?`¸»vìlNOÿè¹i›#ž,ž;(pÑ<¾ ñ¶ä?Iô‘$‰ýã'„>²ðégsæÄoÌÈ©]Y²o÷ž#‡ŸðøZÐ}ôAôOÁõƒ>÷4 ÿ«ýNV)?++ßWRZ[X¤ÌÎÞ*“mÎÌÜâz“›W±ºdwYùÞmoÜûîñ#Gë=þmÑg AôAô ×úÜ[0x ^€ÁàE0x ^ÀW©üîuÙÎÙsÊ¢glŒœ¸fÌãŠðiáa "Æ,U8sfqÑòý[+yü{¢üÀ¿ Tž?¿&ôáED/½,ñI‰¥p”Îw?þv1‘ëÔ|¢T×A¥Åóù œ@ÊçâIŽÙ^±MíñU 7ÃðÏ —í¡òOu?Ô–ø ²‚ý‹¬ò+”pr¥ ørN r N%ä²øœœãeOî+Î ó¼\>?ׇ+àQ>‘ܵý}âѲ¥ï{|]èã…0ÜÑÖm_O˜Gô’k_+&ÅPÿ ~´VB¥* –<²ö‰G6Mxª22²*jjEÔ o??cû´˜êéÑ»¦¾°;rꮉ‘µc"”Þ12|{pðŽÖ•òè-‘`QGÙ¸±ëוžöøJÑÇ{`øKdïŒ_B--´Š(‡hÙ Þ¦°š¨§§Æž“¥]§Ÿ)]Y`_ÇO?±ó ìÂUÖ fMZ·KÍî#gëY¥Ò^ºN“!»˜xêåÙ'&O:>bw€ß–!•åò)“H0(E‘}Ðã«Fo€à/ŠV|ÂÌáѱèM‘kZ$æJYûÒôo^‹­Sd\Y_¬Û¿÷f}sØÙ^ÖÕÅL6fr0k'ëècÝ·X×Mví:3·3½…õÜ`=½Ìjc?þÈjw][^P—¶à‹$éWÓ¦Vëï»A".á(ï·»äS‡?(“g~èñèsÃð»;›žŒXNïç›K¿ÝŽâç[ùU|\4îDvö¹ÕŽ‹™FÜNÖÙÍlv¦3Ü2oZíýf{¯¥£¯½³¿½‡u¸N9™ÅÞ¯·Ü2[™ZÇ´ZÖÞáÞ  ìË£ÎÊ­qÒc ÉççÎýaüø‚ØDî=®œG2×67tx†RyÑã5Ðç~…ÀmÖ¬M/Ž(Mྛ%/,ôÃgž9=ë•ziR]NÁ…=ïÙë¯0³“]ëc†ö^•Ö¬j3ê N‹­Ïjé7êo˜ 7MÆ>³¡Ïlê5»ÆN£þšÁà°YºM¦.½¶C«q´½k·º¿Òʶ(;RNH“Ï$%ý9éØð¡»%›ùT  78ŠŽ.÷xô¹/aoWQõý¨Q2¢‘0WHÅA~•ãÆ~;·1&úÔœW¯*Q}~œ©MLcc—Û,-“ÚªU[4-:ÍÕ½ªÅªÑöZĮ́í×·ÝжöhZ»4­NÚ¡Ó´ëµ½ÎfÐÛ]t»¶Íæ:hÔ;M&öK38Ø©:¶¬¨>:æãØygãæ6Lžðí°ªÅü21WH$ zmGõ9ôà}î9À«¥e¾K¼8‰oÑ2IÕ¨ðC1ÓUÉÒ¶Wf}šŸsòƒ=—X«šýÜÀ.^꺪îjR;šÔ6•K«CÕêTµt«šûšwý¶n·–Î;jînlêiÓ0³•56±š]bÒ¡Ó?ŸwivLãÄqg$‚*¢ü€5"á’Øy{ÐgÀö¹ý ÿÿìÝyTSWð‹ "Z’@!ì›FDÔBePÛÚvF«ÕÚŽ"¢€ŠŠˆ.€¸´‚ŽZ­¨P„„%ìI !@ÈÂ’°#‹Š .­mOÛiæ%ÕéØéiiv ¿s>çwî}¼Ç½ïû×ý4½Ü½¶°Æhò>„¢(6¬~Í Ú–¼Þ½0@#£göÖU«åê¦Fu{;výZ*R¶<|æ±Rõ¹Rõ…Rõ¥ÖϦ¿\UªÇÝ]šoK¥MMßÈäê,Æ“°0é<ßÂ÷Þí ðkî"r¢”"„m,t¢áöùóŽC>Â|þ¢ À(eJZj0ñC„ÖMLvvb-ýû-¿WÅ %KÞ¬ n¨(U ùÿ–׫•MêÅwÉg’úûrŰT~ï)ÙT6,•=J?ÓÀßOGPe²!Uópƒ| ºº¯ZüPÕªV4©/_ùfãÆ¦¿-ýã­®×[.hrµ»A&œFšïÁ\nk³òùSåó× FfA«Ñä7'L\;FÛxÃ$÷âEÍ åo¼)ö`¯Y_S%RËeêêªï„•_I%ßÕK¾î ªúdò5âÛZwµjjî×Ô<Ѓ#%‹n7)5( „C|Áç¢Z5¯R«^µRúÆbIàé\Ñ[¯+¼©d³„‚Ç å8ÓÏŸ!Ÿ¿:h0ºd1äù!´ÜÈhŸþØc>^uþóZ°ºüÝöEËV²‹9êRÞw¼›_WW+~U^1Èá ˆë×ÔݯàuUŠú4„ý•Â;•Âʪ¡ÊªamÔLG¦ªj€_Ñ_#Wßïó«Þ}é¹õ'Ô‹•Ïñ)ö›_å?O4Ç‹3ß›7yü}Ž7G(‘Ýùüùèh0ºL0 @è QcЪ›p®wÛûË¿žã-ññ)]òû_òÊ3‹úË9¸ÜG\ÞC÷>?ÈÜãòûK+:97{´ú8¼ÛØÁ—ÃÄnÐTlÌ»3B<îÀMÎ`YqIqfZ9TÆ.á|QÆS—”©£cºýýØ ¯Í¯~s¡j®W—GOóoqÃðS"Z ùüùèh0Š˜à–›¬3·] xµeþì.¯émÎ’E;¾¬)/«T—ðïqûÊ8ƒ,Vo^~/—7Œ^™y-ÌÞ,ì€è§t´æúÍVÍrà&Ch»‘ácã—õYÈg4€£…ç¬ãôßCh­¡AÂ,j¥Ÿo§¿ïmoj»¯w“ïlþkW2¾Íʤ³Ú¬¦ë U^^_Aa?#»5‹ÞÌdu°»Xùí̼6lÌdu1Y·˜Ì>&ó63÷®¦2{4WFˆÙ—Ÿ;ÄÌÈÉÑ,QRÞ_Tv+'¿Æh¡eõæ©Oœ¸ï;'g¶'Ç×K0¯Ïß§þ¬?ŸF„â'Äèé­21] ùüÎùè h0*,ZœL$íD(xò¤$Ç|ª»ÈsZÃÞ*OjÕ̬‡.§?ÉȺy£-ýš”žÝNÏî¢gwhµ?¯Có#Æ-:£—Îè£Óokªf|kÄzY÷4è} F#[EÏiÄdå¨hôÎLƃëYꈈ.G Ýdz~–{Ë —NŸéݳ<š<§ Æ&"b0~Õœy‘Ïï–.º/*:k²ñ¦±cwM2Jv²Ïõñª›I•»»ÔO÷¨Ÿã-æQäï_|äèpÚ¥™×îf\ïH§5Ñ2[hm?xnÚAËè¤Ñºµzh´>míÖ\!ZOFú«=´ŽŒ eF¦‚vMF»¦¸šÙ’I¿w5ã«=ѽžÔB/j­§{+Õ¹söô¾YÓZ½fÈHf4쌎PѤ‘Q× Ÿß! tÜ¥ôZSÜ „Öêé%ͯ»ºò<ÜÄ®.uînõ3fÖzÎâ;9_[±²*åô£OÎߣÑî]¹rëòåö‹[ž“¦üŸi›VÇSŸvjüw:šGºµ°ÛÒ.6§¥)Ò.I/^’]JW¦göŸ¿8œ4¼8P8Ý•ïé¡ôpn9­ƒêÑL&wqäÚN½¦?.¡e&-˼®‚|^j>ºè8*uB+Úebšî`_ao/°¶ª¤ØŠÜ\%Ô5Ó¨Evi¡aÍç/|™zª÷ÒÅ»Îu}úIçÙ3ª³g•?®?h}qTçÎ(Ïm8wV†9¡1íRwJjßÇ)OV¯Vº8S=.N w7¹›k½“c»›ÈÕ©œhv^O/¡¥®náÏKÍG÷@]ÏÓCËŒ # ZZ纹‰k)vG'96°¥”º¸åÙ9|º;ºûÜ'Ÿ}t¼ëÌ©îS·=Õq*¥55U•šú£ú#ªßîT3æTª [èôÉÖÓ)ª3)§SN¥6ž9Óž|´=åô“nG–‡{5v®¥8ðìø¾««ØÑá¦M¡¥yB[Zž ù¼¤|t4ÐeDB¡þVýX3bšµ]>vF´¥TÛÙÉ]]UNÎ2+›2;‡g׫{bzN¦ =ÒvìHӉį“Ç[NU?ö³Ž7k5>¯ydUqüD=æÄ±Fl¡’[0'“•'“›O$7`7$$¶ûèÁÖ°^çNΊǒR`ãÄÆöïà$²™Zi;•7•œc wpœ^Ù<ˆÅê…|^F>: è¬åïFèýW ÷O4Yü¾Ìyü>ùáøFl•C»¢cºƒ7u8»åL¥°¬í ­ì™DëlKÛ©ÔÒªÊÕ¹Á†Ì³"1ôõÐFCýßòµ÷Ïè tÓ«  ´\_?n J±$‘ÈDË"¹”H.'™s-4*Èì©V¹ž3Š7µïÜѱ{WC|lã¾˜Úø8éÞ¨ú={d?«þy?óÿSDíQ<ý=ÑuQ{k÷D×`5&V¶m§$"²9*úîæÐ»v”l ‹+K6É¢”dQþL¶yÍþÍ‹qSÒÚƒÐÆys!Ÿ˜ƒº GØ ýÐ8œ)ƒlÅ%š—ÈE‹2¢y™9IÂTbažoežíhŸýájÕ¶°Î;”‘‘’=»Å»vWïØ!Þ±£nÇöúÕHGT·É·ooÒ’oßQ±S±«RcgÕö(Éæpqh„2r÷àÊ•­Ö– ’Y¶©ÈœÄ!’øD¬š—}Oóæ%6–%cÑÇcQÞd+äóóÑaÐ@…E\GèmÃ(„’,±s-© O`ãHxB1†`VB0+&𱉦AÄ_z{ImXhGÄÖ†M‚ðpÁæÍÜ-[ªB·ˆB·T¬>*Q ­ Ý,ÕÀ[D![+C¸O… ×m…4†o»ãçWI4ËÄè|>Á¬Œ€¯ÀJ´¯ÀÆ`¯@ °ím*L&_‹ö"´*88òy!ùè6h ƒ6éù`¼á~Ó4<>ï•)yÆø|c3– ®ƒ3eãL ñ¦ùx\.wÝø•ó¾³KC7w­—­¯ æ­[W´‘$ø5„¿FuІZ l$XÌ]\Y·‰».˜¿zMåÚ ÅÆM=ÎN¹8“tã,l«Ú=k÷Ÿo‚gap¸|Œ.„¿†Pô„ñ¡Û Ï ÉG·ýÿÿìÝÙs[Õðß9çn’µØ’‰c !‹ Y½%!!v6OÒ8{LJÚ™2C ÐR–¡ -…@HŒwI–®®d-Þ÷%q\èÚéô­/}ëÑsŽlÇ!v%ð"ÿf>ó›+}uÎïé{Μ+á!„B™¦¾ñ†ªWi¶óºþÞ‚¼ ÃÉr$Ù1GNÔéNpnWÒíJd»bÙn+7'”ãª/\f>ößÕÕ?=ûí©SÃ'OÔÔŒÕÔ\KÙñtLœ>óP3qºæÚéçFN?7tê,7rê¹kÕ'®Ÿ<óÏ#ÕÿZ˜ïËÎæ7ìÍIÊ1ó¤sfGÙ–¨îŸ…Ãn帿ñ¸ßTè¾Æ¦ï°?÷ÙŸŒ‡ „Beš§éÇÎeÙ?±ÙêY1§«ËpD §iËŠrYö6Îa:ìf¶³Õ›ã[”׸¿ò/öŸ<ùmõ±‘ê#ǦçèÕtŒ=z]86~ôøèÑãÃÕ'†$~qýpõŸªý£¤dÌ]çrµ¸œ¦ÛÉ̇µ9L›#8)Ëâsq9bºRo×>ÕØ/z¤rïØŸûìOÆÃB!„2MÞ‚ã6ã€_¸]—)«ST˰wè6K·EµY6#ÂÙ Ën˜†Þœãòå¸V¯ŠWVNì?0~è'×öí믪þ1VU]•øÅðÁCC ðzàÐpÕáñý'öUÝXº<’娳ͺ0ô°Í°l6Óf Øì>]è6“Ï…Çt6:l—^×µç]®ÃØŸûìOÆÃB!„2 À^•¾lÓ?Ìq7FÀ4¢ê¦ªe5u-ÌšihA…6;²üngcNvmEÅßÊ·:ô×]»++†++,ü棕c¼VTWìäöìÞ³wtïþ‰g÷~»»âFާÁ0êT¥ÒJüºfêzP×}ºÑ¬ÚšT^åtmå³Ð•+ªò¾®½ Pñù7°?÷ÓŸŒ‡ „Be”s/†<îóçsÜ_)¬ A7’Lñi–ÕGÀ?ÅÇH Àןù,¿ °¥xl÷îoÊʇwíyfçÀÎý;¶÷qü‚¿ÜõÌ।¤gçΑ={®>ûìXyyï¶’îm%½¥eCûþ}ýÆ´öÀW”6ñt ÐBÁOÁGH#¡_«^ÅtøZ5bP 𮡾átœ+.¾Ó)ìÏû3à!„BeÃÚ *<ðºMýŠD€&UOÅš#àúñËŒ{à’ËÕ´¢°sËÖ‰»þ\^6R^:PVÒ_ZÜW²­—WŽ¿ü¡””•—— —••”— ––Ž–nŸØ¸yl鲤ÝQÏÇP˘ÑVžb©à'¤™z‘n§.SS- S¸ÀèK«{ ûsÏý™p€B¡Œ¢±ÃçøH!—åÖµŸª€€Èµ<‚OÃ)”(‰´…GBkN_áªòíßmÝ<²es?·ySߦ½ÜƧ{¸ÔõlºÓ²më ¿ùÆý›6 lÝ:Z¼íÚÖâë[¶~ó`AÄ)~¼ö² ¸T RfòK!DÅ€Å&· ¸<æò°ÞJhDWã üàm€<Þבÿbî­?ó.B!”9Ìб«ú—*iàI1ÄS ¸¸%à¶Î¸A[ݪHH½×tuÝÚÁõëz7<Õ÷ôú~^ùõº'»×>ÑõÔÚž9t¥…ß–ßsí“=ÖmÞtmã†kEEÃ+Vô¶f*NæÔòt 4 ¨e0‹B˜ÈMn™n'.€¥ª …‰Ø¤ÿঞ{ç×cØŸ{èÏ< „BeŽ·/ 8õú{*\dТ©¡a€f™›¿pEöñ×OÁ‚OÕ"šaõ35èv[…Ë»V¯l|u×ÚÇ{×=Ñ÷dQ¿^³ªã‰5ݳ+êLKÑšŽ¢5]ñÜ<¼vÝØÊ•‹&œŽVÆÄ8E"§¦„™‘S0)DyÆ•#÷mˆŸB˜±#aMmÖÔOÞ ô•§ØŸ{èÏ< „BeŽÃU—\ú«Tœôø=ϵ*‹ ‹³à¬e΀ aqZ5j³'U­ ÀP›—k,j]º8¶ryrõÊîÕ+;W­è,\–x¬°ë±ÂŽÙ*—¼ûº|Y|ÅòÄÊ« {}´+oAÌfðÏ­c<×ÒVÊLmeºÈò€S F!t[À5ÆxÕ4¿n\bÊo ûyùŽ?`î¡?ó.B!”96¬û• /\ø\#<à†@óm˜#à†¥‘# ‹ŠïÃá‘Q<]z%Ëv9×ã+È7—<tqlññ‡ ,~½ä‘¶ÙjÛ’Å‘»¯üV<ÄktQžérùu­‰Ò&€ù<«)vµ‰55<1B ©S.òñÖæ›—ðPÞªªU»¤¨ï¼¶ºèMìÏ=ôgžÀB!„2ÇÒ%ç~ðn–Òâ2’âLˆb1ƒÄzùÓ϶†Èdp!RÓ’ªÚDÒm“‡ã/|i×›<9áü¼x~~…˜x–—O\¤TÜ‚‡^ÃþÜCæ \ „B(s,È=Ãàe *P§°Bâ”ÆÅV± ‚ä¦èmxF¼Yù;2Y)´2Ò˜øa,›ü¹Ù\O»×›Èõ$¼ÞX®7æÍæz£²F¼¹áY«Çkz=¯<+çxB¼fgGTT¨¥R‹‘0#ŽŠmìȬc# ÐE cr`Ä'.å5¤hí2à†T”Z€Þ0ŒÓ¦9ŽýI·?ó.B!”9r½“—AŒ IRÒ!O€¤bb@DÉ6~Á ¦Ò„®& -aÓãNGÒéˆK1§3:ź3‡#Ìee™“ìQ…¶ñáq )TlcÇçO’@ϸ2ˆd´å×?#àFfjâëq>"ð–aÔüW±?éögžÀB!„2‡×súÖ€ÛAI'@&7‰Ó"kòÐ)(¡KòŒ««qM‰iJTS-M5¥ÐóÎT%”"¶¢©¥8Ç =%uˆeŽñÌ ¸aq¸EdÜV –¢vË ¶ñ{Î ¸ ƒØŸtû3Oà!„B™Ã“sjFÀ*ÐI Ïí2&iÚ‰¬TFO™D“*Mpü¶©)âh IâŒ|'z;…¶M_§±H©ííYî\ã¡ÐKÏEžØ¡AÉÒ¦(}ÀS8j´àcïð€{år7ö'Ýþ̸@!„PæðxNNÜ&¾²›çB¹°CÆÜ4Èå”®©óåüÍvJ“”Æ¥6Ê¢“øµÜM¿£]ÜôKyáöwî8žÎ©€›ϼRS mÀS²2ÐÃÿ†'i6|"îÙ/¿hÇþ¤ÛŸy!„Ê^ï‰[.…ƒý0™S;îºvQèçôy²ì”)¹#Xíd¬]Jü%ía¤‘ïU…*´Ÿ×éwä{)é–·{úsåG´Ï5}LÌ¢Pžq£@Ût)lTN°[!q6OÜ‹Ÿ'°?éögžÀB!„2Gnîqç(¼/nBQr„TTíšÚ±þ¿•§Õ!Ž9©ˆœŠ¹3¶½;fè’÷ç¾Wù}d®’¹vpúýÉŒ ½ÓŸ;ãþ³GÜ>ñY$!~ÙŠWÂÿ…èq€a€^qÿfÀ­™5àbîÜŸyâÿÿìÝÛoT×ðoí}Μ,'M¬æ­Š¨Û‡¤j^S)QREU[%IÓRSj ‰!¤ŠRçRAÕ\J/QZ(ä„@@{Œ=žÇÆ7ŒM1IúÒ§þÝ{Ÿ9ƒí|ÆFªuæ“~ZÏxŽ÷¬§oo­3怈ˆˆ’ãö–ŸjiWè´3î•€›úàrªKŠçâU“&Ï }R9#?똘{ÎÕЙ9>óêµZ »îíÝÕç+çÜ6y£Ûiœë¯§GW2ú)—nO¹ëd=5ôÛ¤[ ¸»;ÓéŸïÝ{‚ý©µ?u‚"""JŽÖ¯m~ìhj8ì«Ýw˜xšS(¸&öÄ«=îØø¼ËŽáƒìé™oa´½a­Šµ±é6«+ý ä©ÍúÓþ¨–A—ŒÍ‡Ýüxîö–'ͳ?µö§Np@DDDÉqÿ¿Öê  CãÚ~µå9Á€B)ð‡]H퉂é¢5¥Ûþ9wìü:÷ä{QÕw=bOÜ+çôÑÌßÍk ÝˆË Á»Z›€»õ+wnîêdjíOà€ˆˆˆ’cÓæCAÐ&ؼ¥¥«ÁïW6ùÊܤ×޻ĩVn1}תy—tCËü²}KÜõúrž­vV^¤[ìà~6Ú–€‚FOàŸÐØçÊ{úîo¾pæÌ(ûSkê7DDD”üËðx:xØãëS9Á€Ky§oa0½n­•I¢Y[cÊΉыW±S:yyå2®Xæù0ÍGKI6ð?¼ ½ªíÞû^b–П:Á % ð}ßßž ØÿG+Yesm •8˜s17f½±ü|¹(°Æ—‹¿±Ñ¶à¡ lÒµÞR9Þvu ã÷úÞ x øñ÷~ðû³´þÔnˆˆˆ(QV5­¶4føÞ1àt ‡Ê@Q )Ôbà†jºÔr)5J¾­m§ö‚ ,q‡Ü«ÒY­ßvTúG6ý‰ýYZê7DDD”(ßùî^¥Ÿ R{<}8™±··Ý % cn•€Û?ßõ®}WÉ%ΘjY ŠQÀ-i—q•ežŒÂ^-ßÔp^ë÷€‘zòÖ/¯íwgÙŸ¥õ§p@DDD‰òrgÃêMžîô½?Ç‚TÑÝ$:j2%\ÅÂTZZ˜;çrþ÷yö ^d$¶rô§ãÒsÒm¸Øãí0àæššz=ï БYÝ~ç×Ûßû[‰ýYZê7DDD”4*õ0ð+à?8æé>wè”qWîKcT/Ä<ÈE7‰^p1qÜÕáh>|uÐýBX5\£8׬TvÌÝÞí;º•}Úë÷ü‚ôþtæ…”¿öÛu||j„ýYr"""Jš»îy Þ: ÃO¿œÖ2¡ä2¤Ý€„‡ÄcÀEÁ%ÁDx±ÀNƬ‚²k±Óí“Ô‹Pe¨Qˆ åC:ȉþ;ðÐvKó£¿\¿›ýYN"""Jšm/‡÷x*³ò.ä_O—ì¶É¸&Ôº)÷ \m/F·N­¬¼€[ GÛݧ(Ûh+c¶ê²—Ê*õWØo÷ÿakëú]»Ž³?ËéOâq@DDD ´ªùgAcðFcc·q±)Ö ±ŒºÈXž“_À;Üp½úêèJ¨fUÊfÜêÂÆlº­|¢‚¨ÓÚôo{àÁG>ȱ?ËìO²q@DDD ô­û~¬^J§>²“Àtd öÇqK¤8~MøLUøÌÿ»*ŒiŒkû`Ü-~ªBÆ´.ˆt)µxzõªŸ<Ñö{ögùýI6nˆˆˆ(v½YÖÀ”ênLM*̳À?œ—t'&ÚJ|¬_1Õ¬JcJaZÙ•Gë—áLf@«ÃnÀ}Ckkû«¯f–ߟd〈ˆˆ’é÷¼lÞö¥«Á+j ?‹Ì*sçd\uÁeÜððxÆ™ŠÎ’WB £íŒY¶ªdôi{ì-ù”> ìžonnä‘ÎŽÇoaê7DDD”LÏo?§õÆ[š÷ûNjŒ¹\ÜÏME%ã.¸Óî |6ʸÓ+£N‡Ñ6Œæ.éNjôôYà Щdãš5Ïl{î ûs³ú“`ÜQbµ´<Û^7)0í—|w¤­m´½\mnü·‰"ECÂTurøÜ\Ì.¯ŒzÙÝÒ:¥ÕU_Ìâ/†2AN«£Àn`Ë—nÛ¸öÑ݇õ±?7±?IÅ %Ö;{.y~›R[×ïhjL›ŒXÒ˜ññOÁï_p jÂ\mî%Øøø…sÕ%Ë++£^Q2kVëéY_͸ÿ{Õ›Nôd¿`§§Û¾º¦}Ëæ}ìÏÍíORýÿÿìÝkp”Õðÿ¹¼·Ý\ u:Õ/Î8¶ÓAg:S‘ª-TŒD ¨­‘„[€¶"T®V„Z¹SZÊý’P Ü$„Íî&ÙìfɹcÛsÎf1xûÒaóÌüæÝ7gÏnžOÿçÌÙ³ÔB!$•uìX<áØùÀ›À`»#Š=Q½W$èð^<æGôòv"àrpËŒÄ"wI¹JY ½Ú}܇v ¾Þ¶^(åàV­rºþdÄܹk¨>ÿ÷ú¤$j!„’Ê,*Îlу‹_*ã.fØdó]Q"(wd•Š`Ç!×nÈÜ’¦ÃìÈ?|l[g»˘ÙÜâùûÜwÿ3#_žEõ¹õIIÔB!$Å 2èìøò]ß<ÏYÍ̱÷>Qn¡JYŽã'!Š!Cƒ8 28Î4§Í·]z¾7©>©‡B!„¤¾ï?0DeA ßï_–æ{Ͳq9PÉdì4Ä1Èâ&pÕ'äâ¤Ù„óãí°œÀ` /£÷#]‡ÿáµÿõpªO³B !„BRßÂåû³ÚªŒ;lffÚVà}svd¹D\ œ«D+OÂ: ë8d DDˆ³2Ñdp^ê¸%Ì>ì_ 6å¥ ¹ÿ‡/Ž=gã¶íTŸ›ZŸC !„Bš…‚Âé-_PW²7,¬O“G\`(Ó—… Ju´U¬RXe!ð¯Êš5R~£Ð ¾9³ê1•Fyrp éËo¤”zöI)÷ïó€BðAß¾7·wΤ·ÞYMõ¹õI%ÔB!¤¹øi÷‰`=-‘Lû­½¢ág­Ê¸Œ ç,ÐI× êo”êøÛ€#˜–Z…DD¢J"fÄ9b† †pR0)ÐÈõ›jd C-CL?fg;•”v¬j[}$*Õ›•Iìs°ÁåïX¢ñœÖížì™=êµ ¨>·¬>)ƒB!„4#Ý»k™Qà³f¶±;CÇÙ 9Ö&„ÁƒpCpÃf›{¸1þ9p¹ ¸<pªŒkHº_»§ª0#Uº­gˆ›ñÆN‰#öÃ*×aó´TâˆÍóÆûÁíÛ÷îÔõÙÂWgmݹ“ês+듨 „BHóÒ¹óxó…×ß3Vg¥Éð<7b¹qð*½ÈðÕBŸ“1gV½Ôˆ¼É«Î¬@,©êF‘ŸÆÑ3› {}’D´-‡~—ÓBì ä[¥ÞÙR ð\»ví6|̤ÙE»ß§úÜúú¤j!„Òìüø¡B _ºû;Ž9ÀRÉÞ“ü8á^%˨ã^j“ÎÕê&XX%X9xÈ(3FHÐþÙÙ¬ZÏÆ+5=­ÊµÕµu‰|¬Ïà¥>§Øsw ¹q•nGY¬›6ýîòRÁÄ76n¿‰kÛTŸÔF !„Bš£Ÿ=ö:C?`¸dÓm±\b+°[à׉9R¥Ìà\Ra’.‹&ƒiȆcöÄkU£7ªþzQˆr-ñ*zë8Îs\To$÷DH¥[×)_LSŸ쉶wõìôèÐQãf¬+ÚFõ¹½õ¹£Q@!„f*;{N›6yÀ¯ >kY¦·Sb¯…“>QÉôÎjÏ)æšõiÕ›aT6Õ!5Ô ±\}}Åúk®É¾zõòJ=«NÜsuÕ‚>ë¨Í7oca`Ùw}ëñGº 3yúÚm›©>M¡>w.j!„Ò|Î_ס}.ŒJsr¬¶dÈcž>n2VV¯áS5V^§‰#¨0"&¿*1#nÄ’ÌŸÔxn^ÈâŒÅ$¢6 KœpåOnþŒžmÑzнßУWÞäiÓ©>Mª>w(j!„Ò¬­\~ £ÞòîðñfÙXœ&T¸Ü"Å)Æ+0e,Vc®Jº—°ë.˜¼«3.3¹V×™U½¤†A¥ä:ýXßÑI׌‰7̦2´º#ÂBœ±Å Gl›g¿ëȹÀHà)f¯<8ìɧF¾:cËÎ-TŸ¦VŸ;5„B!]sú.èëà7éö`ŠÀB`£´‹= ã'Ì÷_Ìŀj[^®@oF¿¨°kæéùÄ®·ÂëÍ*hذ~Qâ2Ãs§–¡†óZ[ÔÚÖó’ó¯ñ܈ÏWâºûß,dl0êxýÛvÈyð¡Ü¼3Þ^º–êÓ”ësg¡€B!D[´ жõ ;Ó ¼¼ ¾Æv‹lg—%÷IY,x P&ÙY‰s‚]’ü3)þ-ÅTƽ,pAàS©¯—$®\‘¸*pÕÂ5õ@6üµN²Z›×(5Q›Ÿq­Ã–UÄÄRàÀ+ÀóLhÑòéïÞ7¨Gö˜±“æ¯Z·ã¶‡ê“J¨ „BùÜÐç–[f ³¬qÀ`ªNºP7×þžÏ)¥@%×?U[¯ã,¿êŠÏ,\´pÞÑ×ˎɵ®Y:ûêýñõê=^ëʳ>õY~t¡fÛ,2çØäs+Ïñôeô¾ûž§;uy1÷…éo/ÚxÛ BõI=ÔB!„|ÑÏÿ½?} ä`°<.ó› ¼.ù’–™;Z·8˜•~,Í=eá”ÙúòIâ·±lD-ê æ nÔ¨«­ï¨ûA‡‘8|ìþ)±Ib×çØ¨Éó„쟖٫uÛ_üèá¡ýž™8uú_×oÚ{Ûë@õIIÔB!„|µÜ᫲Zõº¹îବq‚O €ÙÀ_€¿ l°Ä×Úå9ûüÞA‹í±°ß8hác㺺â#Wîsä¿lY$øzÆVË€y¦J=[.C_Ÿï—ß¹§o§.Ï÷ÉyeÚÌåÿX¿û¶ÿïTŸö_ÿÿìÝyL“gðßû¾-mAðÚÜ q™F3Ï º©³xÍLåœÈJ¡€ÊDðbjÄ j â¦NGt™:uNçæ1EE·9o±¥7©è@ñYëbâ_‹×V¥ß䓦yÛ?ú|Ó7¿çÛ·É‹ðoò>?ܽÇtû6—(¬©W¦ˆŸÅÑ<ž–ŠÅ_x¸¯—É6pÜ:û†Uà7 Üm¸­"Ú&pÛ>nÛÙrÜRwÑ?[䎟´·Úx½eTÇŽBäI)©K¿Z¿Ûé‹E>®à‰(wúû©šùªÄ¢¢©öM*ÇeŠ%sˆf¥?×Îñg>—ãr=Îw“Ì'q¦ýÍD±DÑ$‰qóšèÕ"ªS§ñÇ&§M_^¼z×Þ}G¾:äã:PžNaѵ¸¸ï XØ%«M@JïID£yÑØG¢3ÖM)õ óná×nâ;ï& [Ÿ\’™½qíº½{öqúZ Bx.›·]©þnAîÆìœ’ô uRÒ2…bIBBžýIJjþììµ r7,_±sÃׇöî+sú§E>€àBP\ € Ap!(.À… ü Ô?¬(>r|ð¢ Þs:wP´‰ ðŸØyj¿àô¡C³2fl^VpÀéŸù<9Ì/äóÊAø©Õ'Ç_í÷æ$¢ˆFÈÜ¢%’‰DÑÅñŽÛãM&²¿4ž(Æ~£h¢0žDá¼Ú¼Eœ À ³lù½z¥ ±磻jé¹ÐƒæÊ(GFÙÞâì7šÍíØnq¯nAA+ƒûçZñþàUBŠÊ×ô´6¨ÿšÞA%Õ:¶ Xåë›'Ð\¢Ž>“ˆ% ï-Stï:^Îq§¯ù€ëÀüB> À 0Eñe›€)Dr©dr+ŸYDÉDÓšp‹ý›­î¶'fÌEì9e܉œÌ²-kNŸfg/°sWØ…rvYëðÇ5Ç‘“e¬@mÍ™§‰Wœ;ö؈áGúöÙÐf­—G^ ﲈRxJ ÷j­JÚéôU#hÜ0¿Oc…ð\2f~Ë‹Fr4E*ùTâfÿŽfH…œ·Û– xxܘRUüÅùY›7Ü/+eUVv¯ŽÕÖ2c%3V1ËmVSÏî<`µ÷Ù­¿˜©šéÌìî=v·ŽY*Ù©S¬dÍ­i¥±öG†ÐoO[ÿO÷…2i¶@©ÿEÓú5…2a»Ó@>Ðø`~!ŸÆ à]î8ƒ(ÌÃ=…^®òpÏ:Zz$)éLQqÕùóL£a6»}‡UZY…þÞpßbm0YëÌ5õÕ·ªï²ûK6f¶6èÌLV^Á´ZV]ã8[ôzöÃ>[Á²K¡á"¢ÎŽõk;|›.&Ç9 äHa? üZÇ«Õçžò€Æó ù¸€g1lØb %Š9®v¥úûmïÙóø°ËÂ#K“ÓέÛd-»ÈL6v«žé«ë®jMWo*ô6se½ÅÜ`ÐÝ3êï õ&}½ÉXg2Ü1nt·ôúªJó£±V§­ÑjlzmÙȪ-Žê|ñËS×DD :ù[PŸ­[®ñ–-á)MDŸ&—ç:=ä¯:Ì/äã"PžNþÊ_Ú·WEHÄ)bÊòñ(èÞuÿ˜Q—BäÇF~thVöÕï±r#ÓT²?oš¯›åm¹Ys½Bsåºîêu‹F[g11ƒ¶AwóžöÆ]ÍZÍ ›¦¼ªBS­ÓVé**õ:«]…ƪ½Yi?hÐÙŒFöûe¦¯bÇJÙ´Œ2yÈ®1£O†ŽºÐ·×O­šKùR!(¼™Ï¸Ââ3Èç%Ï^N˜_ÈÇ¥ü ÿÿìÝ P“gð—*èZH„p_å©+‹µÕ¶»µZm·ÛK-¢€ˆÔâÑ ¸hµ`¥%AL8ÂDŽ!„#„SE®jë1Ú5û%ÕZ­µÙ޶éøÌüæ™÷ ß—?ß7Ï<Ã`ø?|¼å4Ò[md¼¡ÈiF¶ÌåŠwßî}EqT8÷,õ†\¦êíSIeªÖökÝ}׺ú&ºúÆ˜Þ Eïw åuEÏ­ž»nÞs]Mùý¯ê¹ÞÙu£@uyTÕÙ¥ÊÌZ÷sY@ñšUí+—wúz5MÎ@(Êdúž)úßZu òÑÙ|è&è_ϳm¹{odô¾ñôE“lKýÛ—v­|¥wY@]|¬ˆš;ÐÜ ’ŠUmRUw7v¥ÞŠFeßÞsU&ÿ^&¿.“ßи~oûÛU.¿Ú«¼Ò&½ ·µÝ‰Uy´k!!ÂE~%o¿5àß9×…çDª@;±à©†á‹„|t0º úäó ‚@+³oL}¡§¦8;1ÞüGŸÿ‹üe‚•+š‚6¶VW¨¸5ÿ·¨dmªVÉà;A˘X2._¾K4* EBáwjØâÇ­U$•··Š‡øßÊ;U’6Õ×§noØÐö÷¥¼¾¦|%°sÙÒ6W»³Dܤþœ¬Õ¶6A>:•Ýý òy6ÁðèÅÆÓWMýà9ý­S “=ÜË^l_(~uIóýëy*±HÕP‡[{S(¸Ó"¸QWw¹®~P$žhä_и¤1ÜØ8ÖØ8¡-F´Åæó.´I®´J®ÖqGkê¾ç5©8µªüsªuk…¯..¾àË{퉹˜h–ŠÐÆçÐj“Yk ]È€n‚þù<Ë`xœ<š!l¦46Þ©?逯wó’EX]ýV÷Ò€ÒUk™e,Uççü­††¸Ü›UÕ#,Î0¿ùjcóX5GYËTãÕr/Ör‡këGkëÇ5uD½ÕN}ýpMõPcÝ(¿a¬Ž;VSÿíyÞ힊]§úò„jùËU }Ëü×/YÄ[èÍZìÙ>eŸ> 5ŠP -òùó › A>Ï8ÇÈ8¡7Œ ¢ŸCûÈnÜ|ºÞY}k¡À×·båÌÿœ.¬¼J/ªbM°ÙWØœoYì1NÍHMÝevÍPEuë|¿Æ ‹s»1Xìì ꊭ9µÄaŸgT– •—õ«·µ£•ìñrÖõJŽª¼Rۻğ°´î¥Å +–É_ðnôö`é©ÿm^ˆéó-‡|þÄ|è&è_Ï3€_5Ód匙L×C{^ìX¼@é=·ËÃYðr@»Ÿ_ñ¿Þ¯ª¬U•׌•²+Y# Æ@aÑ›3Ž]ÜôÂz¡¼š=Ä,ëÑP2Ëú˜¥CÌÒ‹Læ%5õz@kCUåã%…‹ý%Ì~fya©»ëŠ+¯Ð‹o3JT¯oñõa`7@ ¿ÌÑší¿@îåVg2íBáÆ†›gÌxZ¿ ƒ|üAÿ‚| æé9Yÿm„>04Hô"×úûõ,ñ»àCîöóió[PóR@ñ©œòÎP]4FÛš¼°p°¸dˆ–ß™Gm§3ÅL%£¨›^Ø…­é %ÑG§Òéèç.©+½_ýˆ–èƒEçFéùÃêC”W •VöuQh”¼¢RÕ¡Cc~ x²ü¼E‹—ø-öRøûJJ02ˆÕÓ[7s֛ϜÝý òw`x¤——§à ‘mœ>-ÙűˆìÎóœÓºÐGñ‚Ü“\?c÷žÑ¯³¯åä]È=Û•}ZHÍï¦æ+©ù î)Ô_¢õQiTÚ •zA]Õë>­ Ðò.«Qi4%-_N-bò äjO.mâLž*,LéH¢úz¶x¹wÌséñÛëåÑæ9‡k0) ¡ ƒ)ë.Š€|þ°|è&è_ø ‹ŽÉ›>ã“I“¢¦§8ÙŸóõnžO»»´ÌõhYè#œãQºdIÙ¾ýãY''rO_Ê9£È¦´Qr;(9]÷=°UPrz(”^~ ePS{Õj‰ÒŸ“}Qí›þŠ"'G–“+¡œQNK¾ÉíÈ¥^þ&çæŽ˜Or‰7¹ÉÓ½“ìܳ`î ×œNïy"‚»‡Zo±%dÀÁù¬“3‹äÀ²$Û81±ówpâÙÌ®µÍ™M,0ÐÛ3Y/ˆh¾žÁ€|žF>tô/ÈúûC`¸kõÛGzço†»¦"ÙÓlŠ­lÊñls ¾m«½½„dÏmC'Ï?¥LLT&'ÊâøÉ -û“Z“öJ?“>ŠäQb¢01QpPíÇ» ö&s“¸IŸ °%ï–¥$t¤`u·tßÞÖÄ=âÄ={÷m îqt¡’ìKlJ‰vT¢ä̲¶áX[ÖÛÛò-qÌéFG ô¢¦Nù·wäóÄó › A>Ðß €{Aè­œñ|´úŒ`škkϰq(±"U™[²ñæuB‘ȳ¶âXYóö) SÄÅv'ííü4š»gWSòI|œ(>Nü(¢»vµÄïjÖàkj‹öââ›ãxì… ;E ;[1»cÅ ;ÅŸ%H±£ìÝ£Œ‰íÝø‰ÂÙ­`6‰amWbeOÇ[ç[Ú–ã–Võ®Î­6DŽn¬Ÿ¤‡6êÿžÅ…|üAÿ‚| ¿?âçþ§Ÿ.xqén„VëëÇ?‡R-‰¥b1Þ²O¬À«æl µj¢s¶Õ9ÏyeÖwGnSljMˆ“îŒmJˆ~ݲc‡è±Zôø'ÿ’$z‡äî÷‰iŽþ´iGL#VcãD[#aíÑ1—6_²#å[XXY2 ‹ª{ª±“WŸ¿y™ÉóÙí@hâ…IÏÌ€n‚þù@$ÔLpkþF$Þdh…M½å8b)΢o^iNP³ ”[˜Y™ç;Úç¿÷®|kHOä6YD„`Çv~Ôö†mÛøÛ¶5o oѪÞ'Ôªn‡‡·iˆÃ·5‡ErâjÕ"ëã›BùÁa²ˆí#k×vZ[Òfù„Rs O¨ÁcÕ¼òGêwa^ncY> }1 E›ÎÜù<Á|è&è_ô÷G‚`YHØ„^70ŒF(q„JSÓ„PlŠ+ÃàÌÊqfex3&G·ÀÑð¦'__Ù¬ÛÒôI]hhݦMìÍ›ëƒ7ó‚77hWï ækUƒ›ƒ7 Õ°Åf^Жڠö]¡Ü7p×IC·^ô÷¯Å›åb70δgV‰3­6Å•kÞƒ½ŽioS=szæ$ô)Bë6n̆|žH>tô/Èúû¯ùÿÿìûo”eÇÏó¼×™Î} µ*÷¡*–[[ Òrk`)wJ­ ht7Yu×õ׸ë*ŠP{Ÿ¶sïÜz¿·´Ô˺¸f³¿m²ñ·ý/ö¼ï´B[¦hœdNòÉÉ;“æç99ß|óÍ3o‡ÀÎ9ç?¡¨oÚu.WÌlÙ\qÛ¼¨ÝÙ8NG‡Ëw9Ãó^›¹zS~ï…óÿ­ªü¶ªrüìÙá3gúªž­ªK†ëÉðeÕ3ßhàEÕXå١ʳÈ™sCgÎŽ?}­¢êûgÏý›vÚ›ì6.U_s·¾þ¸ÝEœÎ82Ï[àò¼jP.,Yü õçgéA‘šQÈß§#Ý@mý I)“ åíù™“)˜aŠ™la“=d¶F«%fµDm–°ÍpÙ½˜ s–ùª*ÿS^>ñLå×'O8Ñ_Q1ZQ1–§Ç“aâÔé¯4*&NUŒ:3|êÌàÉJdøä™±òã×Oœþ×áò/ÈrÛl(¿ÓÓ׌J›m!³- Ukwa2ì–€?:¬¯‰|o}ÃwÔŸûìA‘šQÈßg ÝÀþ–•£ç3Œ µ¦Œ°ÙÒ©šBªÙgÈ!Æ6Äd ™Œ>›¹Õiw/̬ßWú÷ýûÆOœøºüèpùáþcGG’ãȵd?räºÆÑñ#ÇFŽ*?>¨ƒ×•Y~ôûÂÂQ«­Æbi²˜}V3.—2˜|“g’ŒîÅb +b­QþH~/òÃ¥{Þ¥þÜg‚ ˆÔ„ü‹úCþ>é2ç3¨g~gµ\áB(Tc»b(FV ƒDŒjÀ¨úT¥ÑnqÛ­u«VFJK'öí?ø›±½{ûÊʆ~IFÊÊ®éàÅЃƒöcÝp¨ìÐø¾{Ën,]ŽÁ½Æ 6*J‹ªø jÀ`ð -£[ÑhQ >Ü ÊXæõ&À—¹Êb9Dý¹ÏþA© ùõ‡ü}Ò=ì‘øóå=»µQU½nàAIñIŠG¯>Eö#ªìSeÈMÍVs½ÝV]RòâmÃ~»s×@iÉPiéÀ/Þ¼d¤´dkIéPÉžd÷ž¡Ý{Föì›xzÏ×»JnØuªZ#‰uœ7qÖ¬È>Eñ(Š[Q%Cƒ„UߎÀ[qŠxUßQäJ>ùôõç~úCA¤&ä_Ôò÷™àW_Á¯Èùs^‡õÀ»õsQ¨¨SÔ˜ …¹5êÕÍ y ·Àš¾øØÇYÙ-› FwíújkñÐÎÃOíèß±½oû¶^/ðåΧ~. »wìÞ½ûÚÓO÷l)ìÚRØS´upï®ËïŸ7¿‰ Ÿ|ÎyN?@‡fnÆêÿ„jÀªm·Ð* ^ªÞR¥W̦ó3‚QfîA‘š‘¿“¿ÏLZ€õk.JPð²Aú AR¢L L#€f5ë¸ pÙbiX‘Ó±ióÄößo..êßZØWTÐ[¸¥+‚/. ú· oÚZ4XX4XP8PT4R´m"ãèÒe1£©×P-n̸8å\£™±FÆjµéŸŸ,8Ô|Àá¢ÀŸ[ùÈëÔŸ9÷‡ ‚HMÈ¿ÈßÉßg&­€,Âø+Âû"»¢GÛf.Z´¹ÇéÁ ´&à¬#&çM8XŒW›ÌýÅÛ¾Û¼qxÓÆ>dã†Þ ù=Hþ“ÝHâúnt%Å–Íxóüü¾ ú7o)Ø2¶¹àú¦Í_=4k?nwE@==\ðá”sðrmÁZÖ€2@1·2T¤ˆÈ[þðÀY‡ó%ðÔŸ¹õ‡ ‚HMÈ¿ÈßÉßg&}€ÏûƒÃFé¢IùLbu8I^œíâ6´Þ"èQX’Z´&Vët†Wç][»f`ÝÚžõOô>¹®+^¯}¼kÍcO¬éž†Î¤ÀÛâ=×<Þ½~ÝàÆ cùëÇòò†V¬èU \;¹«ÆéÞ"bº ü0æú™‚õéŸ@@’¢¢àaZˆàA:ÿæF©?sèA‘š‘¿“¿ÏJú€7.ö›•sfåm . Ð$KÆýú¬4þDš64yø´§dÀ-ÉAY o$ÕÈYÞ¹*7þèªÎ5ö¬}¬÷ñ¼n¼^½²ý±Õ]w'¯#)òV·ç­î|4u5´fíhnnÿÂQ³©U´ujŠå-‚èÄ ¾LÀ!Ô€¾r7ðz Ö ·à„°Àü²Ô(K¼Âø ÇOµPæÐ‚ "5!ÿ"'Ÿ•ô ‡Ê.[”¹vôœ{I‚à×¾+&4M+ðkdÐ*J!ƒ1&Émˆ1€fº|Ù [—. ç.­ÊíZ•Û±rEGβè#9ä´ß­"±{¯Ë—EV,æ®èX™Ó½dIgæü°AÅÏ­pîy+|8úúôõ¢Â"„9xï€x«,7+êeAü~[¼ý¯ÔŸ9ô‡ ‚HMÈ¿ÈßÉßg%}Àúµ¯JðÀE€ODð à¹xÝ4ðëisÆ„ö¼<Ž”öôÉÕ Ã—Ãå[üpdÉ¢ð¢‡ÂeðzñÃmw«m‹ï½â­~kha¦ÏbiVäÎ0øêÏ»ø´ÔËSËÓVÈ!*B4q ¦?þÒø£жU’Z$ù²(½ðÒª¼×¨?sèA‘š‘¿“¿ÏJú€¥‹/< ðV†ØdQcÚ™‘T Zý?FÝ|ösdb°´!“å˜$Å<šÚô/Ï]øÌ¨48ìþ¬ÌHVV$+³-33”½¯Û²¶Ý^ƒÙYÁ¬÷Z³‚,/ÈŒÌs *~V ÂY‹AMäoO"õNet\R„CLG;Ó¦Ÿßn!¬=ëƒd—8×ýàKÔŸ9ô‡ ‚HMÈ¿ÈßÉßg%}À|×ižçðž5"ó‹,ÂyD‹’ú ° ÝÎÐßÑ'ÏáUà^YÐ~8àÿËw:£.GÔé »œa§+är†ôtºüw­§Ïé`E-Ù^¬6[Pâ‘$˜“:µ˜¼ëÚDt2hŸ\skàX½¢×à(V¼ ðŠªžòùÆ©?Éö‡ ‚HMÈ¿ÈßÉßg%}€Ë9)jp¤Dã¬]?!JŒQ€6jmx!@XâQEŠªrÔ D̦˜ÙÑ ›Í¡)3c2ù‘Œ ß$ÆÈÛpyˆÑ\‹¹‘iÖcÐÐgÝ«>  ùEÁ'kÏ¿ÏàuU­hi¾FýI¶?ADjBþEþNþ>+霎S·  ³€L†È$mq(µÅ1•…j@‘"²–Å,dɧãÂ73’èM EUÀtŽËCˆ'HrM³ž[à׿4 ´b¸¥.}ƒmxÏ[P_7@ýI¶?ADjBþEþNþ>+éö“· $Bg8q}Db< âL¯\M}Rc˜ƒ¼mâÄJ;ºâ^í˜L't'˜to^'¹tñ÷.˜n=z8à^ô=îÑ `¸Å^€v@•òÌk>`ð& àê•.êO²ý!‚ Rò/òwò÷YIãà81%€:Aû¿Q]87 ÍM».ƒ$Ðg‚ΩïŸá›qÎcœGtÚ¸š¯õ´}'ïDn¾Ôï£qç;3®§cJ1í™îÓ`m€*ºñoPi2¯øP@ågŸÆ©?Éö‡ ‚HMÈ¿ÈßÉßg%}€ÓyüvàÐ ôÁä·ßsíäЇ0èeÚxáäuè*jO ´À;!®ÕÀ—¼[`½ëÿIù€Èû°Þ|G¿sFs]]7?Wÿˆøtë WÐvg, 5Ö) #ú»D‘yãM\ú$JýI¶?ADjBþEþNþ>+ÿÿÿìkoE…ÏÌìzí¤R(B€à+H @€*w¨m)é…«(´¥ ¡€ZÄEU)¥Ü´Ð‹½F¤‰ÓıçÒ$mCR(ðøÌÌî:ŽIìu‚ÔE>Ò£WŽ¯Ç¯ÎÑ«£™Mj7,^ü„ÂZ‰-Ö‡#55¾”ÛÂD[±j5wióh:} ù6(ŠÅÇŠh³××t–T}«û.«ûtáùÀh/|nÑõgZ1À óYâ°ùϺ ým°ph7õ¦ °|F°?åûC!$žp~q¾s¾W¤vÀ%KW¢Y¢Åœ ºaul•t"ZÕj;©‘èA†n·hœ°Õ§­ˆ_Š^ª3Ø·wžr°qæ/aÎ6»u³¯§S>jÕÔ^GÇë~ Ç8!0À6ÍÉä“;vbªí!„xÂùÅùÎù^‘Ú MW®ž65Ôíuåa{ϸ–oF"ghÅtF«6Vž´Úò¤ÿEçtJ¥_¶ˆ´aÔŸV‡Û ŽYËé5ô$Ý%ú­sô—Ý ¼¼|É’5ûöeÙŸjûC!$žp~q¾s¾W¤vÀÍ·¼¡är`ƒÂçÊüé+{%òž;dEÜ ·bM‡êï)ò@ ééµ8W¤`³¨ë&‘9>¼‚þܬÂ@¿Ý;$ð™RÚ/]vùó­­ýìOµý!„O8¿8ß9ß+R»`Ýó{{§H^ø6ˆB`€žéÌnó®¼UdDªY úBä•õ€4èç‡F`®–m¨;©Ô7ÀkH¬¹èÒ•[>hgæÖB!ñ„ó‹óó½<5Þlé©[¸ÎQ-®ópÀKôÁlhÍÁŠ¥ªÍ—êrZÎÍœwK5ê_d82ƒáGGE©ß_Lüõ ihèrœÝÀ†ÔÂæË¯jþæû<û3·þB‰'œ_œïœïå©é ‘‰{g€·\ºím"ãæ œ´7•Ë.ý ÞDrÊÊhÌÖ¡ð¨œÿj¿ý¿Vd¨J¢\³@¿4ÇàÌÝ0áÙ¸~»rM·rz÷g/¹3™z5á.½íö ‡³?sî!„xÂùÅùÎù^†ZW_¿Î2Ýä·Àq%NKq"Õ3…ì…ðCä(pVàWÓ~Pö7¹`NÎ Ç˜í¶—9ý¦qEkÓ§Œtþ 9/ Š< OYøárÒ2fÍ8T_ú“zÙ2ðð„‰Å"›PG€À+Í÷Ýײÿ`Ôý/ö‡BÈÿÎ/ö‡ó}F ¯l<¡ÔêEÛO%Ž(ŒZÝûøKW(1À„ ÊçCLÄ£NøÒ÷­kpF‰~Gµ»)V_qÅsë_ÞÍþüWý!„O8¿ØÎ÷aX²ä9ÏÛ(ñ®VIÒÍ»6ò*#ýß?ëÿÖòâ¬cP#ÐUž…8ü¥ø]`Rà\<ê9{Ë˸’¸B/þ”À@ÊË(¹Ø¼pñâÕKضgO7ûóö‡BH<áüb8ßÿÍ?ÿÿìÝyŒUÕðïYîòÞ›ˆ¶š&¥4MŒm4iR•Vª-DˆŽP§lX R6q€¶n•¡¢ÔÈnIU(û2FTlafÞ:óæ½fAv´=ç¼yà ®À…ù%Ÿ¼¼¹sßÉ7¿_N~¹÷¾K@£Â™{¥5˜óÑÀôNv\UCÛJ,Ê}2Saà»tÕ{¡Ë«Ü(5•wЯ9SCù~)Y¼Ä<ã×þ·dsÆK1ø‡Ýòò›Mù|·ùBñ&Z¿(Zß/DÀ9Ý»Oîsì ÀËÀ`³#Š}"}.)ìðˆ.Õે`Ó\5@ÈH Á¥y•RÍåj.±Än†÷_m[ó/rè 7äöú嘹sWP>ßy>„B¼‰Ö/ʇÖ÷óÐpÎü…ÅÙmúpñ;@õÀ"†u6ÿÈ¥A˜#«Ty•@ì2š b Ô;Ì{j‚ÿ¯mítœÍR,eæä—/0ছûä,ÊçräC!Ä›hý¢|h}? -ä › ôtü\ÿ«>g93_‹ë1 UªÐ9‚Œ€(†Ü ¹âx,Ìä(÷ŒÃæn˜ÀG>ÿ>ßZà%sÿ€®7öÏðä²­£|.S>„B¼‰Ö/ʇÖ÷æh8ßOn¦jE ÁÀÒ ·ØaÆÊPÉfì0Ä>ÈbÏ6€ú¹8`NÒ}àø¶XÎ2ài`ˆ?«ÿ½Fýõ¹o{ó;åC!äZDëåCšÐp¾o|ܶ£êá`3³36ï›ï–ŠIÔĸªxyÖ^X%¥!ˆg!᜗9n)³w[ÁW‚ÍÆù2†Ýü³ÇÇŽŸ½vÓfÊç²æC!Ä›hý¢|H.bbÁ–Ìv£UH6ÇÂê ¹ÇåA†n(Ó¥¯Xe°Bð‹Õ""ÍÄZŠ´péšÖûT±ôÎÁ´ ÿÚ¡Ìgr;ð6ð*Pž÷ýn#úçN{åõå”ÏȇBˆ7ÑúEù.îW½§‚õµD¾ypô¢€µC4>ö"ÄepŽAÝ ¾°¾ãD·G#ŽpZTjq‰*‰¤QÑäˆ3T0DÓÂiÁfš6ª=kê’ú=+gìP P*xÔ±ªmõ/±P©v°YHâCk\þº% Ïmßùþ¾9ãž+œOù\±|!„x­_”ùœ€KèÝ{2pO»¬‰~kðÛ²t¹‡Ímïq †5—ÁE›ãçèà¦xºªŒ8kì„óš¡ù¡*ÌžªújÌþAÆ©¯àªº7¢æÇ2‰=6ÖK̘p†véÒ¿G¯G ž™µqëVÊçJæC!Ä›hý¢| —Ò³çsCÌ™ËÛfîÉ }nÜrkÀ«ôŒˆð×Aß#Ÿ7š×´…S-‘~Õ5 $ÓªZŠ·ü1ÙŒ>²)ô¦ƒ¤J?ýW ±W°O$ß(õ™¯‰vî<ä®»GMšöRѶ÷)Ÿ+Ÿ!„o¢õ‹òiåhø¿¸­˜éþ™c6°D²w%ßež2•—pÜã@]Ú Zm««‹GŒ4"z½Û¥iĪõÑx¥¦«ê¾š£Ž£>Õ?ú;zE™ß)ö¹Û„\øªþqÔ¡ÃÀÛï|bâÔ9k7_ÆÙ—ò!„r-¢õ‹òiÍhør¿¾çE†À(ÉfØâ ‰À6ƒ®“t¤ªÂZàhZ½a:%Ò…17Ë›kæ´ )åDKÕ_,ÓRŸÒ]QÏqŒã„úC5>QÕï:Eà‹Ôÿ v_ÇN}{Ü5|ÜS…«Š6Q>W7B!ÞDëåÓjÑð•ääÌîÐ!ø=ð´ßZšíÛ*±Ã¿¨dúÌ”*úc´™_yBŸ,Sµ«‹8Ò(5Î6M´_ئ7ôÔÇ+õqXuºŽ Ô T;û­½6_¼LF‚åtúÞ½wÜ=xÒô+7­§|¼!„o¢õ‹òihøªÆOXÕµË —á,àxØ%÷ùô×Q%ÁêÁ4|ª±æÀë5Qk$!âFÜÔ·’4jŒdšù•ÚŸ›ò”Æ’ ›E%ö»r§O®þŒiÓ>¯Û÷é—?ý…”§ò!„âM´~Q>­ _ÛoEoé®/‰sø³l,ʪø6Hqˆñ ÆãŒ'««5Í :ád#Öä¸éÝÌÔ½Þ_×´úH-Ss3«×ïõÝ fŸšÆ£©S[DTˆr[ìwäNÁ6ùì·9 <Èî÷Ó[GÞÿÀø‚g 7lÝ@ùx-B!ÞDëåÓÚÐðµå>8_àAÈ´ŸžX¬•v±/PÊø~sLT ©@µ-ϧ¡/V;¡ß°³æÇc©d\_*§Of¡ñ‚¶§Ž›-u µœ×Ù¢Î¶Ž›³x­Ïûý¥®û±àk€ŒÍ&Ãß Ž]so½mDþ˜Â×–¬¤|¼œ!„o¢õ‹òi=hø&ÎvlŸäd;jô|x|…íÙÎ{–üPÊbÁKdG$Ž vRòϤø\Šÿ1¨8%p\àS©_OJœ8-qFàŒ…³êlüm½du6¯U8j6/w­Ý–UÄÄàoÀŸ€Ç˜ܦÝC?º)¯OΤÉÓæ½µjËU‡ò!„r¢õ‹òi%høæ†?ºèÙ.k¤e=¥FaàyÝ PWþ®ß)ve@%ײkÐåÎϸâ3 ',sôë)ÇÔ½ƒ³–î }ýœDƒ…¯så¿Lø­Š€»PGÛ,4÷¹OàV¾âÏêãêqçã#FÏxmáÚ«åC!ä:@ëåsÝ£àÛúͽ d –ÏåƦ/J¾¸]ö–öm>i›¹/Ã=dégh4ô³3lÄ-á é Æ¨U¯¶Þ¢¶‡V.Qüؼ#±Nb×÷¹«ƒç 9(#»_ûŽ¿ýùíÃ><õùÿ\½nÇUÏò!„r=¡õ‹ò¹ŽýÿÿìÝyL“gðß{” ÛÜ€ É2QŒfžè<&ž3qrHQœÀJ¡€rˆ"ˆÊ”Ð:QÀMT<£‹Gœ: Æy¡‚ËŒsš9‘Ê â@ðY‹1ñOãp í7ùä iÒç›çÉ/ß¼M^€î¡Š:ìØWI4]& st\-ð©D+‰r‰ ˆtB"œ—I.Ê¥Wmå7$Üe ]ïrCB·º”¯2á¦L¼*Klijœãí%ʓз¢é¿©8R*sRNœ¢ö_˜™½ïØñKf_;òK…ù…|, @wÊúîÂÈQËǀȷ·}’ȯâh-O›$’ïm»åò"ŽÛeÜпOàö‹tPàŠtHàu] ¦í^H¦Gîm$zq„M•×ô(>ÿ÷ú+Ý݃§yGÅÄnúq÷ ³/ù€•ÀüB>à­PGuuÖôqÒHÄ¢0ã&æ¸$‰t Ñj¢xâÓŒL7ËøtŽKy]g#]G’$㇉BˆIdc¿È¾ŸrÈ…³fDÇ-Ïݱóةӗ̾:äÖ ó ùX€·k{ÞƒÐÐ#ŸMÊô–ìâÓËa1Ñ—¼8ÿ%å+æÛÈdv¾}ý-úø“è9¾ã “Röì:uòd‰Ùׂ|^ÀüB>= Àÿªxÿ¥­ÚãëÓ÷¤¤Æ'h£¢6«T™YÆ?bb³W§¬O/ÊÝr´hïùS§ËÌþm‘ÀëÀüB>= €A°"(VÀŠ X+‚ðÿÉÑ^üJ•7kÎzï©=Ç®:Xãæâæì14l¼WüŒÉ ‰Å›sΘý{"€×‡ù…|z€·H«½¶páNç}N4[n(•." (”7=o ‘ñ­…DAÆ9 $òåyAô㟾ýB½§mËÎ}höU €Wa~!Ÿž ûÅ/+î¡q´ 2=ôŽ‚b¤“]B_û޶ñrAÍQ¨È«Q#4‚)"yA-p‘Ä©²åI¬ÈÅð|ŒÇÑr"µñx¸¸BvÀìëB>`Í0¿Å@è6›s3&–hºqßËHÓßnƒ-¥É)UN)’”÷û¤¹Ê3"ÇÓs«×„l¯)[&NÝ6iÚŽÉÞù¦xNÈëY8ÔC;xÈönÛœœ²J#Jå詸(R p¹jäðukS/›}¥È¬æò±<(Ý`©ê·¥DÞ2é’wWE-ëÅe¸öÙé5âdм›ªruè•Ô¤²ý{šnÜ`·î°ò?Ù‡ì^…ÉïL¯\+c9ÚºÔµÂUåóçÿ:{VɧãN¸¹ØÛfõsÈ(™(†§"?û^š¨£f_5òˆù…|, À’°â'^œÃÑR™t¥ÔƸGdBêG §O¾°`^©&üîºäÇÅEe¥¬¾Ž=kcOž°ªZVUÏjZXS;k}Ξt°ÆXu«4°§ÏØÓ6VSË®_g…ù‰q¥!Á?ø›4þä@×B;Ź,E Ø®_Ñ xW¥Ž8löXÌ/äcÙPÞÐö¼{Ã<‰|m1Ôu»ÊV‘íåyÎ×§Ôϧ$*êfÞŽúÛ·Ù£G¬¹™µ´²Ú:öX÷\§ï¨©ë¬®k34µ7´t6`0¿5@x3gfœQˆhºÛëê|xôèË3¿(ó (Ž+ßµ¯®ì.«nfíL×Ðv¿¢úþßúǺfCm{¡S_ù¬J×Q¥o¯ÖµWWµUë[õú}e£NW_kh­ªzRYÑTñ¨YWÑf¨b 5¦ê|÷/–¥mò,ñS^ øÍsÜ™ýóä™<ʼnôµ@¾ÞÞéfÏù@O‡ù…|¬Ä¿ÿÿìÝ TSgÚðô³*UÂ*ÂŽFYDÔâÈ tt¾Î¸·™v¦êX[E6"‚ZP\Z?´.Xi@I–°“È’@ daIH $Av\ªö«3Þ¹IµVDZ̜ÚfŽÏ9¿óœ÷½$ÜËŸ{ÏsžÃ`ø÷¤g6H!´eªq„1Ú?kZ†/¹rÃ:Yèjî[¿g'$)ÊÙXï ¦Ť}ÃÊáÁÞMï°Z©Uw+ûʵæÿG†°ÍßûûhT÷Õª»jÕuï¸V}³_3Þ¯½Ñ?†ÓªÇ4}£øÁþ;ƒƒX‡»1ŽqùXT¬huhá†õÍ×I–.®µœyÞtRŠéä„6[ÌúÃÙóÈÇÀó`˜ A>¯þ ||m43ß‹PÔt³L’#34Xñîæ¾ÿ]SιJ½/•`ª^¬]‚µuÞíî½+ï—÷Ž*pªq…êŽByOÑómÏ#ß ô/ÈçUÀDyùí™löžùŒ}Å+ƒ:CVÊ×¾©Z\Ÿ/¤æª[±vÖÑŽuwãwê·ሤëæc·%Ò¯%Ò{é}½{·?^¥ÒÛ*å­Žö~`°£ãP„åÑîîÚ%XX²yƒ:8H¶ÀëJ¬@¿°ÓL×/;ù`> ô/ÈçÀ„Ì&¬3™öG„þl>-ÕÍ•±îw½AoðV…ð×®iÞ±½­ºãÔþ]ÔŠI:°6ñC>ÿ¿uT$ˆ†Ž„cá¸@pG_|·@ G¤cm¢ÁÆFM#ï¦T†‰;°//=ض­ã×+¹¿ÿ­òÍÙª•NWmæžBº¿“µÑÑá/AåÀ0Aÿ‚|^M0üz±Ì|ƳiïO2Þ3Õô°·WÙêÎU!¢ß¬á­f¾÷—¦.&b 9ußø[ù÷ëë‡ê4BÑx¯_o@o°©i´©i\_ OoÇíïßjß®çŒÔÖÍmÆØuXþ5ìí-‚ß„òCV –pû¦ØŸ\l3' ¡í“ÐF‹Ù› CÈ€a‚þù¼Ê`x‘<š¡ |¦47ßg<ùX€_ËŠe]xݸ¡{epéú-̲¬‚ý}ýÛÆÆ¿q8ßTU×°y-·›ZF«ÙÊ:®F‡£­ãܨã Ö5ŒÔ5Œéë°n;1 ƒµÕÚ¦ú^ãh=g´¶áæuîƒZ.ƪǾ8‡…®®ZP´¼aÅ2åþìS£Ý¯ÏÜP-_ùü‚ù0Lп ŸW /bfŒÐ[f&1“в'g©¿üß.ñçT¬}‹ùç +oÓKµU5ã,Ö-ûf k”];\[?ĪÕVT÷Ô\ïÓÓÔ°ûñ£†5Œ¿@Wñ5ûƱYƒ×k†+Ë´åe}ºmÝH%k¬¼æ^%+¯ÄââU+‚˜Á+ëµ¼qÍ*éR¿&?ï#Ý¿ÍÛõúk‘…B>¿`> ô/ÈçÀ¿4ËbíÌY6™n„¿Ñµ|±ÒoÜÛ¿:¸30°øïUUÖaåµ£¥,MeÍ0ƒ¡.,R³ØcøÍM/ì¢J«YZfYž’YÖË,Õ2Ko0™:ºµz´Uåc%…7Š}%Ì>fy_a©êŠ+oÑ‹0J°¶¶ø3ð $HâbÏ Z,õõ¬·˜~¡psÓfÎ|Y? ƒ|ü7‚þùžÏÇ7jŠñf„Þ75Iö%×ö¬ì÷'wúw.®ýUpñ¥œ¿å]¦2ä4FÇš´°PS\¢¥åËò¨t†¢˜©duÓ åøšÎPÒ½tº†Nï§_ÐUzŸîÈÑ5E×FèùƒºS”WiK+{ ŠäZ%O]TŠ81¸¤`±OM Ÿ0x™fE€v¹¯"( ¡$3“x#£·gÍ^ùüÌù0Lп ð€çZšjIˆBhûŒé‡Ý]ŠÈ^\ŸùmKüKý¥>ä†E Ž|™}7'¯?÷ª<û²€šßMÍWRózÝOSè>Dë¥ÒÔTš†Jí×UݺwÂÔ´¼!ª†FSÒò¥Ô‚v\^”BíÉ¥_ÉÔ.Dj€O«¯W×B÷ž€*_ïŸù“É)í0™úö’e‘ÏÏ–Ãý òßàY1qy3fþuòäèéæ©®Î×üZ‘E^î­ ¼[—ø æ{—®XQväèXÖÅñÜË9WÙ”Jn%GþÄS[%§‡BQéõQ(}UéN¥/'û†ÎW}9ENŽ$'WL¹,¤\•Û•Kú*ç›Ø8µ¹ÄÜìã%#»õ,^ ñ/ó[($Ì¡àÏ0B[ͧoŠŒ¹ ùü ù0Lп ð=žr1»y¶Å&„Þ72J¶±ºâáÁööäy¸·xy¶.\Ôìã[ëêvyÓ–†´S·¾8;D¡ ]ºÔûå—Ý.t=%Kòƒ­\OñÈùï·¡{‹J£<ëBgV–8ë¢àÂEáÅlIv®öì…±äÃc¡!œµ>Þo7Ù¢ù ²w'y¾ÈÝ…å8ï²ñ”8„Ö›M_Ÿ{E ù¼Ô|&è_ø!žB&ïAh Bѳfg“œ«ëííꈎ\O>yaÓ|r©)kç®Î³çî§g¨/^8wFyþ‹žÓ™ÒÓ§%ÏÖ'd?é™LÉ™ÓmgN qgϵg]T¥¥k>O»ûî»w×2²·ØÝUìå)òôhuuiòòäz¸VYÎ9kd‰Ð:ÏÝÏKÍ€a‚þù€‚à‰Ä$¶ZonijzÔÖþš§'×Å­™èÄwqá Gb…»g¡éüÞ8Õ™/î|v\™™¡Êø\~:C‘‘&KO—¦§?SŸ!ýÏetâ2Ò¥ø‰N”J“f¦µŸJoËHoÏÌìN=ÚvêîŽ*ÃÛ«¿ï‰$¶³k-‘TëáÁs!]wr(±µÊBè#|Þ½;òyIù0Lп èïÏ€à ˹[M?61N˜c™eïT„ßCŽÄF''‘‡‡ÔÕMhçPéD*póø*6¾ïdÚðÑ#òcG:N¤´Ÿ<Þuâ¨äø±:Þ©×þ´Î‰Uññ­¸ÇÚñ}–Ú…;™*9™Úy"µ ArJ×±ÏÆ?Þ¥&¹]uu«!’jl‰Å®LüúI®\‡yuŽóØól LŒN1Úacµ•ÁPC>/#† úäýý0<²qó)„ÞùÓýÓLOi¤b;‡rKk–•5ÏÁ±ÍÙYLtæÌs “]ŠV&'+'K“x‡“Z¦´¥'Úþ<âÇ„ÉÉ‚ädþcïþxå:ÌINá¤|ÊÇOtø€$5©+¯ÚjK>(J>ØuèöÃ=.îT¢s‰©ÔƉjC¢ÝjìØö¶ ÎŽ<Û¹Ìf§MŒ¢§Mý“¿_äó“çÀ0Aÿ‚| ¿ÿ3a´væk1&èSÂ빎ΠR‰±ÊÊ–eiUO 4ÚØpííØvv×üüK ñÝ)‡dŸÄpîo>|Pœ˜ LL=ð‘ý­‰û[ôxúÚ:q ‰- I\þƤ}¤}m¸ñ¢¤}¢O“Úñ³:¨Œ‹Wmÿ«Âͳ`‘aïTbçL·´Ï·u,ŸK¨°µkðpks°aÛèæÆ)Fh›©ñògq!ÿ A>Ðߟó}ÿůÀ¼±òB'¡4[›R‚M±¥m±¥M…¥MÁŠe­SmcÍœgwÍgaÙ¶­ÝQнÑmI íû⛓ŸÄ´ÆÆ _¨õi/~ñ?ÇÄŠ}ž¸–˜OšcãšðŸ Üŋ쌉øpç€1ßÚºÀΖI°® XW=V_¼îú­Ê,^ËF(¡mË–¤@>?a> ô/ÈúûsÁ c1÷ýïˆ$ZÌ¦ÙØáSoù\›Ò¹Ö•–V•VkB¹µU‘U¾‹sþß•îÙÕ!‰ŒäÇîåEïmŒˆàED´D„·N¨>!˜PÝ# ïÐ…G´„Eq¢ët¢Âcøîæí “DîÞ²EfoK#ÌÉ·&”Zj, µ–xµªüŽî«°*w°-ŸŒ>ŸŒb^Ÿõ1äóæÀ0Aÿ‚| ¿?×?ÿÿìÝùOUwðs¿w}ðÞÂC)ºƒUÚjµ¸‚¨Õ ¸q(¢ ÕN2Í´µíL§ËtšÎtºY¥ìx;o;Y¤µíØé4ó[“I™Ì1ç^ÀÚQÀ§6}É;É'ß\^Èå{OÎÉÉÉ— 4ìxî‚ `¤üàO8þÚçõÛìë¼N›½ÙS{í©=i©‘4{0ÝîM³5ì)úò¹êï/œûç™ÓcçÏUUEÏž¯>;Q}öó»[§U_¿«µú«êª*¼8;qæÜè™ç¢SÎ_+;u­âÌwçŸÿO^ÞhZj°ÝÖaOí·Ûmö^í"Án,Y0h6Öñð2ÀáÊÊfŠÏ‰!„øDý‹âCý}&4ìX–yšcÇdå5³¥Þf Lá[GJjÈlíBVKÄjé²Y:lÖ€ÝêJ1ÔlÈé«®úwEù×åã••Ãeeý§F**Æbq-ŸW<û¥ /*ÆÊ+£å•ƒ¨ìt´¬räèÉÑÒŠoOþ!+3`57›SܸUmÏ=Úþ;̶²Z;Pª5<ÏæxI'W/Zø,ÅçćBH|¢þEñ¡þ>“Dênˆr±¤«–å7ìiN½Þ—¬ëSz³ß` !“1l2†RŒ“×fvᙹÄ]Qþ}IÉijå×;6PZ:RZ:ƒ“㱘8qò UéĉұeÃ'Ê†Ž—£áãec%G¯;ùÝÁ’ÍKw¤¤`x¬æ°¶g¬ä€!ÅoHñª«)€O¡Oòš­°˜^Øî†Æo(>÷B!ñ‰úŇúû,}Ø»ïÏ’| *9é=®NŸ0#ŠÞ¯ܺd?JNjGú$¿>Ébh³šóÓö~µwÏø±c×K—8røjlÆbüСkªÃ㇎\=t$ZrtHƒ×”|^røÛÜÜSJ­ÑØl4¸MÜ0nÛ¯Ó»uzç”d/>‹Q…º$é}‰ÿ­À½Eñ¹ÏøB‰OÔ¿(>Ôßg‘è@šýˆN©øÉx™ñµ‚èU’:eWNrª«Î«S|(Iñ&)nEn2fSýŠåÁ‰={Ç÷ÿzl÷îþââèÏéjqñ¨/¢ûöíÛ?€ëÞýÑâã{öMì.¾±x)îµ:¥I–[Ù£S¼:[§kÕ%9dU«¬sã³`K¬A¯» ð‚,U(>÷B!ñ‰úŇúû,}(ÙYü¶ÙÔ¤(.0Ÿ(»EÙ©­nYò Er+’S`Múä“¡ÁœRSPð÷ü­Ãû÷½cç`aA´°pðç‚7/¸ZX0‚kAa´ hí*Šî*ºZ´g♢ë; n˜-õŠR+ õŒ53®E–ܲì”e‡¬4‰ºFWíqxÖ†O! WDáMY:PðáÇ7(>÷B!ñ‰úŇúûl ð‹ïàTuÚe1UT›MŸ |-@½¬„y1œ¸&mupÐ2ÍÁsÍŸ|Üé­6ìÜùÅ–üèŽÃOoؾ­ÛÖ>„øåާ”ÜÜžíÛ‡wí}晑üüÞM¹Ý›r{ó¶ íÞ÷59©öfŽÿàSÆ1ûš´0pp\Ç>¾pU¡Mâ]<Ô¼®ˆ/ôU›7Ïv Fñ™=>„Bâõ/êïÔßg—ÐÀÚUE¨xA'~Š Ð(Ê!NðÎP-<×¢ÕÀ€KFcã²Ì® '¶íø2Ëp~ÞÀ–Üþ¼Í}¹›zqEøåƒ’»y`K^4KtKÞPnÞÐæÜÁ¼¼«y['rÖ,^NÒ×á~jxÞ3.f9Sµp\ÇÕ©Ù?] Ü’èeÐð.ƒ‹<;³üÑW(>÷B!ñ‰úõwêï³Kè@âàø+À;wYm[˜èhUó³‡H˜,€¶IŒkÅ“±fL,ŽÕè ŽÌåù[¿Ù¸~xÃú~´~]ߺœ^”óT𼾓î˜lÚ8ˆ7ÏÉé_·n`ãÆ«›7mÜ|mÃÆ/ÊðÔnwY+€&8ïÆ,gàbê†Õ!X+,,æ6Žùd1(°V€¿¼ Pi±^ðøþKñ¹·øB‰OÔ¿¨¿SŸ]ân×L/êåOD®3É…Y¢^ü¤Ún)'h£°(¶ªL\ÕX™=ºzÕàšÕ½kŸì{jM?®x½ú‰îUGž\Õ3ƒHLð¶xÏUOô¬]3´~ÝXÎÚ±ììè²e}Š®‰©'w5˜ýÀZœny/8æz8mÖ²ª¼¢x'§ñoœãŪ×~?Bñ¹‡øB‰OÔ¿¨¿SŸSâ¯^0ȧ ò"|ÄC³$z9æhÒr¥éÿ @­ µ<Üê[2à%Ÿ¤xµð¢Ódòf.¬ÈêxlEdÕc½«ï{"»¯W.ï||e÷ewÅ${egöÊÈcÙXWÑU«G²²æÏ ôm<¯îS­XÖÊ ^ði€°k@Û¹XƒŠkÁÃóžóHb“$¾ð"ÇÎ=ÑJñ¹‡øB‰OÔ¿¨¿SŸSâŠ/åóL= ú æ½Èû€÷¨¿+Æ7ÏXàQÈ Mýº¤°(µã@ŒhšÍ1¿mñ‚@ÖÒðЬîY]Ë—ue. =šy4³óN+ ßýºtIpÙÒPÖ²®å™=‹EÒì‚?·–ǼgmŒwcêkÙïÓvˆ ÀÀu[¸p•¤Y¹Ä äøçó·ý•âsñ!„Ÿ¨Q§þ>§ÄÖ®~I„3>ÀÅsX.Z€ÕÏP85Ï8Þ¯¾/)¥¾}r%YwÙfqd¤»>\´ °àW_exñzá#íwZÛ.ðÝýŠ·zäa\ýóÓÜFc‹,52Öˆƒ¯ö¾‹[z9ïôöÔ2 š<Ó^iú±8,Ú6Ql¥K‚ø&À…Ù/S|î!>„Bâõ/êïÔß甸Àâ…Õ§^OšJX=3¼¼‚ T§ýŨ›ï¾à9™Xj’IRX;œ*µÚµ_žûà“$¹Ñbö¤§ÓÓƒéiíiiþŒùxÝž1¿ý§«/#Ý—þ÷n×tßCóóÒ‚©¯NÁŸU‹תS&çoçäÔ;=£ã–‚ ÂõLÍ~v³ðê»>ø€ÜGŒ©ñðŠÏ=ćBH|¢þEýúûœw°ÛNòp–ÁÛÔ œGà‚ŒÕQRKîGþÛ`ý¸â'Zæ9´ñÌ%ñê?ÎÐiÿŽÎfé°ZC6KÈj ج«Ío³úµÕgµyî¸Z¬n«Å‹+Ö’ÙâÂ5%Å'2§À¼"óòœ'uÄÔ1×wǽqâ ÂAçÔÆ8‡Z W— uhàx§ Ô¼𢢜p»Ç)>±Æ‡BH|¢þEýúûœw°Y§ €‡ZL) 3®S;!šL£€šjíxÁC@d!Y )RH' ú°AÔ ÿ4ïìôzJNvOIò ¬·‡xMbꘜa?az°´\wi©ÐrKøÞ-©¯Ï¿ÃÁ+ŠRÚÚ2Jñ‰5>„Bâõ/êïÔß甸€Õrâ§Ðɸ.€0L ‘151)ÕÅ4•ø0Ö€,%! ~IôJ¢[ãšæž(¸&©£*óâtŽÛCªÛ?™u?]ÓV߉an×XEÂ@~VšÄÞÓ  ü“;(>±Æ‡BH|¢þEýúûœþÿÿìëoUÆŸsÎÌ^ZhêøÑRý F¿j¢Q£F¼+‰b¹y‹("£…`ЈoAÅ ¤BéEzÙÒÝî¶K[Û‚µhˆþ-žsff»]ÛÝÙÖ„1û$¿¼ÙÎvgϼyž¼y2gÚÚ —]¶j¶´hR@/|w„®]½a䥕×i]Ôá ZÉN¥Ú-mý£<¥D}%Õ‘)GöêZ8bÏÜ­£¹5À/…ïµ_Ñ>ßzz”¹Šv!ŽCj´B¶Ct9*m/ðGœˆÉÃ|¼¯ý©¶?„B¢ çç;ç{Ej7\~ùS %vY´9Fj: j<)w‰¶bÕjî׿ÑôyòlP‹;Šè²ç×ô•T}«û~«ûTá¸ït¾·èüs­Ç Ç|—h3ÿùBW¡?¢ –NÝf£ÞŒVÏiö§|!„DÎ/ÎwÎ÷ŠÔn¸bÙ“J4K´˜=p¾2À¬Ž­’zÂU­¶Ó‰ágèn‹¶A­]Eœ*zw¦Ì`?Þ[8îç`ãÌSAÎ6wëæ_OŸò=ÜnÕßnÏ£ãõ06Nð ðžÀöDâéýûO°?Õö‡BH4áüâ|ç|¯H퀦«×ÏÛꎸ²Í>3®å›‘ÈÙZ1}ájŸ•§­¶¼©Ñ7›Ré—­B­Gõ§”ïá.ˆk9½†tÂWbØ:G_ìà]à•+–møñÇ,ûSm!„DÎ/ÎwÎ÷ŠÔn¸õ¶7•\ lUøL™?}¥#ã D>îŽZ÷­XSúÓE(!5»'ãŠlv=Â$r?ÇgÐß›U¶·ÀN|ª”6ÀËW-¡µu˜ý©¶?„B¢ çç;ç{Ej7lzá»x|À6àC%ZëÜ´49ãJm€ D¿¹¦2•˜©úS¢²;,ú—ÍG®G`@"ã˜jöÒ Ñ+ÌÆ¾,Œôó@N‡ã¸{Bá7Þ"Í×ÝðZW×8ûSm!„DÎ/ÎwÎ÷ŠÔnøü«³À£‰ø[À>Wý\ËèlU’µ ” wÞZ-Z©)+뤊lV¹ s/ë +­„AÏg€!}i1‘Š»? ì…Ú¹æ¦[v°? è!„hÂùÅùÎù^‘Ú æâqŸë¾žŒ4ÿ¯N¤¤Ñ}¾\2Ö!ky²³É‚O&üz„‘~ÎAN'˜@,üø;jë`Òíw€`#ðø½îfÖB!Ñ„ó‹óó½‚G.ú ."KV/Ö'ºÎQ 3®ÎHŒè˜(4"W ƒe©êT‹EbH!ïššSfWŸ&'0"0fCðà’DJ©ÃÀv`L<¶nÓìÏÂúC!$šp~q¾s¾—§¦ÀÝ÷ì—ê¥xlŸ£t"<™4¿ Ù'Eò³A|¤g3¿̧òV‘!©f1 WÖÒ  ŒÃœ-ÛPwZ©¯7Ûpé•kw½ßÍþ,¬?„B¢ çç;ç{yj:¼Õ’®[ºÉQ-®ó%p4‚¹a4®5+V”ª6_ªËY!87wÞ-Õ¨w’±ÐŒ_U¤~o0ñ×3@¦¡¡ßq[“K›—_Óüõ·yögaý!„M8¿8ß9ßËSÓ@#c÷Ïo»ñ£Ž°‰L™=pÒ>T.û!ô‹LðɯVF“¶Ž[å¼w‡í/xµ"£U朆¥Ùgž† öÆ Û•k”“vÜãñÄDòµ˜»òŽ;·¶µ±? î!„hÂùÅùÎù^†Z×Þ¸Î*ÝÄa S‰³Rü‘‡JÏ !¼9ü&ð»ÀY/({7¹`vÎE˜ím/³ûM'xÈ!ÈÈqmÚ3*žê{`°æ’Ƈž]ûû³˜þB‰&œ_ìç{j=lyãœGcÉíŸBt¸êð» ¸ÚZôö.˜}‘  ¥ÿ[`€ï®Vô 0äm}³W1b¤/&LU#N,%å70ý÷‘¦¦µ{öcÓB!Ñ„ó‹ýá|/C­͒Ƨâõ[Ýõõ½ö˜Q¹½É5n%5R¤oÏgxÔ ïŽG¡êUIãÂÂ&Œúý+Ê Ù©Ì†¿-À÷ݾ퇟2ìÏ"ûC!$šp~±?œïóÁp×Í·¼¬v$bÇ”‚ÁÓS0?N„§¤É¼#¼#»JL(L*óbÒ.~ÊGL(•¢UÊýÀæ¥KžX½æögñý!„M8¿ØÎ÷ù`¸kÏ^zW:ŒÉÞúØ9‰óÀàOËyë„s¥Š÷åU`22U¯JaJbZš•ë£Éä ’Gì¸uMMÍ;waßB!Ñ„ó‹ýá|ŸÃõ7¾ ¼ |äŠÖ:gHéüpAy@þj=à…Ëó–© kF¡zÒ?¯—-}O›X,²1u8¼ÚØØüÀ-? {ÿ‹ý!„ò„ó‹ýá|Ÿë¯÷(µþ’Æ}À''&¬î=ü­+|”`Úå ¦£Q§=é{ÖµN8§Ä°£ºC@‹ëW¬x~Ë+‡ØŸÿª?„B¢ çûÃù>'ÿÿÿìÝyp”åðïs¼×nH!ÃU§3¥tœql§ƒþU *­ÔÎ@5Âh¤B5ÊaÀZŽr‰:kË!(J9Æñ€‚Ü)Ç(‚Š#H€%ÙÍî&›lBäFÛçyv7$€x”ãÅüf>óÎîæÝ7;ßùýæ™ß¼ï»K@ZNÎHÇÇ1]U‰kí°ÌÈ+téB‚IU^Œíeü3ˆO¡¶|/X)P¦0d(a(õǶÔÜòR,xÈbêÃïbØé9Û_Ì ~Ð鱿Ÿ±dÉÊç2æC!ÄŸhý¢|h}¿ i³fï“ÖÎGÓ»æì ºª†v”X3”{2Saà»uÕû Ë«Ü™Ê;èíAÎÔP^*Å!‹—˜ßÅøkÿ[²y ¤ò“žùOÌ¥|.o>„Bü‰Ö/ʇÖ÷ ÑpN¯^“€{{"ð2°ØìˆbOD Ï%U8<ª‡K5øê!Ø4W 1RCpÈ'[)Õ\®¦áKìax_ð÷lk¡à…R>Þ©S^ß_™?%åsÙó!„âO´~Q>´¾Ÿ‡€s..nß¡?T,aXgó] ÄY­Ê ¬b·ÑÜQÓ!ÿ0Wì© þ3ÛÚå8›¥XÆÌÉ//8èæ[þ8vÜÊçJäC!ÄŸhý¢|h}? ­ä› ôqÝÀ«ž³‚™¯Å ˆ¸…jUèaÆ@CîÜq< VÁæ(÷Ãæn˜]ÀÇ^àCÏ[ ¼hîñÔãÆ¹ƒÆ½ùÖ:Êç åC!ÄŸhý¢|h}o‰€óýìÖaªVÔ .Ër‹€f¬ŒUŒ†ØYìÛPŸ‹æ$Ý‡Ž·ÅrÞž†²ÞÑwÔßžÿo~§|!„\hý¢|H3ηhù'7tQ=0lvû¬À滥âuq®*^€µV d"å,"|ƒó2Ç 1{7°|Ø`¼—5ì–_<9vÂܵ›6S>W4B!þDëåCšÑp“ ·´ë8Zõ€dó,¼—%÷º<ÌÑ À¢eºô« V2 ~±ZD´…xkÑV.]ÓzŸ*#žÙ9œqá?R;”yö)w﯅àù?ê9b`Þ´W^_Aù\…|!„ø­_”I¡àâ~ÓïY°–(0?½$hí韽ˆpY'œ#@Xw‚W¡ï8Ñí‘ÆQ‘“Z¥DB¢Z"iÔq$9 • ±ŒŠŒp Í/ª=ë’ú1+gìP <æXµ¶úH¬¨R;Ø,"ñ‘ƒ5.Ý…Œçuîv߀ÜñÏÏZHù\µ|!„ø­_”ù’€Kè×o pOÇìIkð/Û³u¹W˜ÛÞ@ ¼nnÌ\k‰Ÿ£€›à™`¨6,Ý ç5CËCUš=Uõ71Ô™ýÃŒ6R_ÁSuoÄÌÓ2‰½6ÖK,˜tïÞ}`ï¾>7gãÖ­”ÏÕ̇Bˆ?ÑúEù.¥OŸ©æ†˜?³VÜÐnov0ì¹ Ë­¯ÖC0¢"Ð}|JÂhYÓzNµDf«kHfT·–hý4Ù‚>²)ô惤J?ý_ ±O°O%ß(õ™¯Ivë6ô®»GMžöbÑö(Ÿ«Ÿ!„¢õ‹òiãhø¿¼½ÜÎý+Ç\`©dÛ$ßm~;b*¯Æq G€Zõ"X5XX¬ªûZŽŽÆTÿèïèe§Øs· ¹†qUýã-öpNÎà_ÝùÔ¤gç­Ý|g_ʇBÈõˆÖ/ʧ-£àëýöž2 FI6ÓË%6ÛºNÒ‘ª 룆éV“)ܨ¹YÞ\3§…M)×´VûÕj âZê]º+9ŽqœPÿH¢ÎQUý®Sþð‚úœ`÷vé: ÷]ÃÇ?=kuÑ&ÊçÚæC!ÄŸhý¢|Ú,¾‘Üܹ99ÀcÀ3kY{o«ÄN ¢Šé3Sªè]Ðf~å5úd™ª]]ÄÑ´Ô8Û<Ñ~e˜ÞÐGPo¯ÒÇaµ™8*Ð(Pë "`í³ùzà` 0,·ëwÇÝC&OŸ¹jÓzÊÇùBñ'Z¿(Ÿ¶‰€ojÂÄÕ=ºò€ñYÎ"Ž· Ùr¿§¿Ž* ÖÖ¤ásµÔÞ¨‰z# ‘€¨4¦¾•¤Qg$3ÌŸÔþܼ‘§Ô1–”¨±YL¢Ô•»<¹x <Ò¡s~Ï›†ô¿¿`ú 3)_åC!ÄŸhý¢|Ú ¾…·ß‰ÝÚK_çð©æØX’%Tñmâ㕌'¯a¬¬Þ4ƒê„“i¬ÙqÓº˜©{½¿®iõ–z¦æfÖ¨ëWt'˜}êÒGS=¦^1!ÊmQêÈ]‚mòìw9 <lÿÏoyß Ÿ›µaëÊÇoùBñ'Z¿(Ÿ¶†€o-ïÁ…:øS;{0C`°VÚÅ^0Äx©¹?&¦†T Ö–g€ÓÐ«ÐØYóôXê×—Êé“YH_ÐvBâÃqóJC=ç ¶h°­ãæ-Ç,^﹉@ 亟¾XÄØ\`20ÜñîÒ#ï¶ÛGŒ™õÚÒU”Ÿó!„âO´~Q>m ßÅâ…á.óÜöŽ=Ÿ^_i»E¶ó¾%?’²Xð‘ìˆÄQÁNJþ…_Jñ_Õ§Ž |.õö¤ÄiÓgÎX8«Èô_%k°y½ÂQ/Pcór×ÚcYEL,þüx‚É!:>ôÓ›óûçNž2mÁ;«·\óp(B!×)Z¿(Ÿ6‚€ïnø£o}:f´¬§Õ( ü]wÔ‹+ßpŠ=@PÅõOÙ5érçg\ñ……Ž9z{Ê1uïଥ{C_?'Ñd¡Éã ®<5«2(*\¨£m›ûÜ'r«À  d¼ñÇõ¾óÉ£g¾¶xí5„ò!„ò=@ëåó½÷?ÿÿìÝyLTWðïm³± ‚µ¶BÀ¤©(FS¶‚{E–ÄÊ&²(V ÃÀ" Š "uCYt¬¨`+*¸E„XµŒuDMµ±±.( *¸Ôõö=Œ‰šŠ0s’_^È2™{òn¾œ 䢼¯o¦äÚØÍ"1š¸8^L縢Õ"_æäpÔ¥[£ÝE[ÍI9Cûråì ÝV+šÔÔ¬¦»îÉW•rG¾ÿ·šûK¤KDõD'‰ŽˆT-R¯üŸ»üæq‚aëàÒÓoø¨ïÃ"³W®)¯¬>eöXÌ/äcÁP:‡>~£sÑD&ÚÑq‘Àg- *"*!Ú)ÐI8ª‘ŽkÕ§m´uwR¢³ê$:סA¾j„zxZ-Ö¨ÄÃ_Éq»‰¶K´RTÞMÏQˆN7Õ£OÈèq† i« vì¯z§Ù×…|Àša~!‹Ðiò‹~:4‰h¢üÜkÈØÃv™ ek)KK™Ræ'ݳ=û¬:¨ÐÛ{ÏÈŸqkG_?fÂÆ±¾›GŽ+ñ¹y˜wi/Sß~<Ü×;9å ”M”ÅÑjqQœ@1Zýà9K²Nš}¥È¬æò±<(`Žþ'W÷9D¾õì%͵ãV¸ußä3¨*lZ½>ò¼!êTVzCŶ¶º:vî;ÿ'»t]¹¡¸xU¹s¦šZ³–\ÑŸþ}Êäšá_pw-±·Ésq((ƒ(‘§X¢@{»Pcü>³¯ù€eÃüB>– ཤÎÿ…ý8š£Q/P«äg4U#d}îQ:qì±Ój1ädÜ,/{ÑPËîµ²çOÙ£GìÎ]vçkyÈÚž±Ç¯Ø£ìÁ?¬é>»ÕÌž¾¾xã½ Øõ묽=|Ìî¶²›¯o¿hi}ÙÔú´¹íÙý‡/ï?amòKí¬¹õå­æWM-ìÚMvã»ß¦ì–ÆFvø`{aþeÿÀCA!ç¦N==dÈ^§n+HÙŽôò6èÝ+Ædº`ö4XÌ/äc þÿÿìÝ PSçðôY—VM„²¨ÅÊCiµí«ŠZÛ¾nj­­Zë‚Q\Q±>ÜQ1 $ˆ BØIdIØB „@«JÕV[ﻡÚVk-íÔšŽgæ7g¾ï’pïü¹wΜÉL€àÏX°àÀpƒ„>¡û´kÓdëLŸÊo–­ànÜ*þé A>Ï þ˜„¤ "ñ3„–4üÒí7*Ñ‹T¸dQsð|Λo±""eù,¬M‹){1I{·¼[ÛÖ£jëVÊÕʹF&ïQª¾ëéÂ:U?hÚ覆•Š›JÅ€²­_­¼¦QõkÔ½š>œZÙ§jïÅvj´Z¬AŠuôc.¶y›`~pÖ’Å5!‹Ä3g”š=e<,Úxx(BË&Œ{÷Ä)ä£çùÐOп Ÿç ÀÇŸ_@!&¦[Ú<Ú$‰hÇ”½³¬ýÙ[6²/QnKĘ¢ ‰±úÆ›-m7¥mýÒ¶^NÑ/S Èä·d­wZïûö[:òo~Së­féív%ÖÕƒ5K±Ó§Õo¯`Ì Ì^º¸qap³¯W•Ɉ$„¶L³{¤áê%‹ÏA>z›ýý òyÞÀ0TîÞ_ 7yßtÌv„B ¶ô¹As¥ _UÌ ,ßΧ¤)k+1‘ka--øz‡Çï7]{à†XòXrK,¹=èÖƒíïW‰ä†B~½A¤áñ´ wù,zsÝ:Þ,ÿœeK”ÍS]8N„„ð [;ÊxãìY!=Ì€~‚þù<‡`’ñ拌F½‡Ð‡¦£bè‹þÓðrõ¼ îÂ5kV×`ìÒu˜¸«Þãr¸u½aOÐu¿‡Çïãñûy¼|ñãv•Ïï‘4öÕ ´••ªÊêk’fLØ€=wwÕª†Ïå¼õºüÕ æys\í/YN<‚tß“bgûä£WùÐOп Ÿç ¿ƒ–Ýl:fɨ†~1Ò8ÆÃ=o~Pã¼ Ák ªç2Þÿ¨ª‚ƒ øXeÅ=vÙ·<î½:îíòò®ò _Ð_U­Ô9H[UÕ[UÕ?_tUµ¶š£i^¯Þ(g÷”–éÁXeXÆeìíå¼×‚¹Asy3}9¯¿*ô!e[¾Ðêa(dÂø¥>ä@?Aÿ‚|žg0Sššn7~À×»vά&¼†,i™˜»x9#¯+`Ýc]½SYù=›ýmQqw K[]{£ª¶·˜%/ã¨tØê2vG[[VÑSVÑ7X»uÛ¡©¨Ð–««Ê{ª+{ËÙ½¥×®rî–r0f9vü$<¿ÈÏ7/`vÅœY?ï’Ù>¬1#÷¢õ/Ž]P5Cù<Ã|è'è_Ïs€'11 DèM£ÐahÉ=ÓGº"䎟××·`ᛌÿÔfޠ媋Jú™ÌëLÖµf/«´»´¼‹Yª.(n-¹Ú>HUÂÒàF ³®âkVDZ˜Ú«%Ý…yêü¼vݶ¬§Ù—_r«…åbaáŠ9ŒÀ¹å¯Ì®\0O2Ó»ÊÛ£Ä@÷oóÖ½øÂ&„‚!Ÿg˜ýý òyÎÁð›ÆMX8v܇F#6 =/7Íž!÷ž*õpæÎlô÷Ï~÷ý¢Â2,¿´7—©*,é¦Ó•YW”LV~sÓ²šhY’b¦š‘×:HÎÈkc䪹 F§Žn­2uQ~_NVÇz{£‘ßž•+ÇŸºìÂë´ì»ôìã•u¾>tü ;Ú0fH¼ÜÊ'Œ>†ÐFSãÏÆŽ}ZŸ…A>þ‰ A>€ÇóôÚ<ÂpBEy‘Êü[çøk|H-þ> þ3J_ Ì>—ú}úån ]J¥7\¤J²²TÙ9jjFs:¥‘F—e3äô+-´,)¾¦Ñå4z¦¢Ñ4´ËºJk×"šêÊåZ†63SwŠü"una[æ)™ÚDNW^ÉÅââzýý2gx–ø{óg©æøªg{É|EEš…¼=nü"Èço΀~‚þù€{0<ÖüàX3óÍ­3:ÆÅñ Éã9¥ÞÏG6ÓGâIª˜>¾kwÏÙ”›©éš´KÒ” ù‚ð|ZS¥ë|ê·Û”ž¤oR§{3ɹuÆT•×”fïi|ó—Èø3ŒÐJÓÑK7…^€|þ†|è'è_ø 9“R3~ÂR„>00ˆ²œtÑÕ•åáVíêRëîV7mz§W©“ó…¥Ë+â\?~¢‹Lî:w®íìÙ–Ó§›’,þÅV:Hvß©VŸ¶C¡{‹bþFiòéÆädaòÞé3ü3)â”4õ‰Ó}Q1}ÁAì©®¥žbçæéSd$FÒ‹#ÓnòÃa-6½8í¢òyªùÐOп ðK0<„Dú¡åm7>…èPìàPnc]F°ã¸¹rIÓª¦rí‰Ék×5ž8y;!QyætçÉcòSÇ[&IŽ?ZÖüבK;Zì(wâ¤(ùŒ">AõuüÍwÞ»8å‘<„.NBw7›k“c•»ÇÕ©È쥛Zäê¶òyªùÐOп ðK0ülg$Ë-65Þdl¼ßÊæ²›Çѹ†`Ïutà ;B‹[–=ñÔÖ0űã‡Ê“‰_K&Êã›$ ÔGHþ¼ÄF\b‚?Ñ‘ÃÍGâ%Iñ¢# õ‰ ¢¤¤–Øý-ñGn®Y£p$Ò=Ü+ñûž@d98•ˆ¥®®ÕŽÄ«ö¶9V“’ú Ÿƒ×¯Ï€|žR>ôô/Èúû#`ø™ÙĕƆŸF¼d–lc¿‡ì•ööWW‰“3ßڶО˜éìz~[xûáøîýû¤ö5ÄE‹lŠÛ/>xà‰6=¬qhUx0®w@„ŸèPlîp¬øplc\l=þ‚¨è¦‡ú?_§$:_rr.!K¬Ù¶N üú‰NÛÉev“Y“-3 v0Xc9i%®„|žF>ôô/Èúû#`¸/dÙ„VüËxÇ(ã8‚Õ–˜mm›ofÁœdQmkWïà $8°'ÛÒHÓ/mÞ"Š’ÇDI"#ªc"ëöG×GïFí=Žð~T/*ŠûOçǃ¿_¹{bØQÑìè½\üD1»Ä±‘M±xÝ%Ú·§>j· jwÓž=êO×¶:ºP9¶Ä\K{Š%‘Jp.±±eÙXU8ØU[MdŒ19jd°eÔÈÿúxo€|þò|è'è_ô÷_ƒàA Ǿj„öš¿˜fç@·%æXŠ&Y1Í&•››WZZrl¬YÖÖ—½}r6lE„·Dïiþ*”½{GMÌnáÎþÎÁãðïÛQ·sGí êÁZ7t;k#"98ü‘Ûù‘Ûëq»Â‘Û{#EøYöì–‡…+V"svËœL ÛØçX;ÐÌl2¬ìò'šXYW¸:×ÛZ²¬Íi¦†Ñh•±áŸùZ\ÈÀ?ô/ÈúûcþîÏü ôÁËsw!bh¸sŠ·²Ì5·Ì6³Ê6³,0³,2ŸÄ´Ð)¶´`L¶¾ì9-oÕÊ–Í_ʶn©Œm¯‰ÜÉû*´nÛ6þÕ=ìÉ/þ5aè6áýßVúUͶ°*¼†Gð¿ØÌݰ©14¬óÓµö„ ‹Lk+†¹E¹EÑÅøÅë®RÞ„RچЪY~ÑÏ_˜ýý òþþXÿÿÿìÝùSU÷ðs¿w}ðÞÂ{€$qŒ’D£qQ£pa´â.*¢à‚MLLÒ¦YšfÚ¦ÙŒöíí<Þc_²ˆ1“4m:I§“_:þ=÷¢Ñ4¢fòf83ŸùÎ…ßï™sæÌ™/hPYíûµwD~mµx'=‚So»}R«=¡Óß§JˆkOˆo|$Þ—4Ý·kÇßýç©“ß>ÿüõ3/\=ý•“'¯žûó£EßùË¡ƒÇŽ †,::t¤ÿÐÑðMÇ.ï=p9ÿÐ7ÇŽÿ;=½ß[‡l·5Úc;í¶n›½];B Â#Øí-Ó'w›¥<¼ °­  ŠâóPâC!$2Qÿ¢øP «“’rl§¬¼f¶”Ùl!ƒ)ckŒ‰ š­ÍÈji±Zšm–F›5`·ºb /è(*üWþ¾ëùû z÷îíÌ?ЗŸ?0—ÇãJþþÏUø?°¯ ¼¯ í=Þ[зcO^þ×~Ÿ’°š«Ì1nܪ¶ç6mÿf[Y­(Öг9^ÒÉES§ì§ø<”øB‰LÔ¿(>ÔßG2Ñ€Òò¢œ#éŠdù »Ã©×û¢õ!}L@oöLAd2†LÆ`Œ1còÚÌ.œ “§»ó÷}—›;´ßÕ]»Â;wvååõåå ŒÃžÁñÚ½ç3UÞÐî¼Ý{{wïíÙµõîÚ;»ãòÎ=ßlÉý[\BuL €Çji{ÆJbü†¯ºšx }”×l¬øÅô²ÀÖ•W|IñyÀøB‰LÔ¿(>ÔßG1Ñ€ /ÉÛ ££þ Ó•ê£c‹¢÷+·.Ú¢£ê‘>ʯrÇê¬æêxGùú¬kÖîÜy5w[oî–®íÛ.ÏÖþñܺõ²jÛàÖí—¶nçîèÑàÃå͹Wr·}–ÖgŠ)1«Œ·É€Æmûuz·Nï¼)Ú‹g1ê²P%½'ñ§¶%+û-ŠÏƇBHd¢þEñ¡þ>Љ>8ìÛuJÀ “ñ<ãKÑ«D5É:¯åTWW§øP”âRÜŠ\i6V›Me³f6de ­ß0¸éWëÖuæä„N—rrú5øÞ¸©gã¦.\7l çl\¿qh]Îi3pp/Ñ)•²\«ÈâÕéÜ:]­.ªZVÕÊ:7žËXbåzÝy€Ó²”o4n¦ø<`|!„D&ê_êè@¶Èëä·Í¦JEqTó‰²[”Úê–%R$·"9V©®1ÊÍ133¿ÈXÑ»iÓõÕkº³2ÃYYÝ?üðÌKY™}¸ff…3³»ÑÚìðÚìKÙ뇞˾º&ó†ÙR¦(%¢PÆXãjdÉ-ËNY®–•JQW!⪇gux Y¸ oÊÒ1€Ì>ºAñyøB‰LÔ¿(>ÔßGK€_|¿ Âƒ.‹© ÈlúDàKÊd%Ä‹ફÔÖjjn©æ¹*€OÞîý„ÄÚÅËúÖ¬ùlyFxõêÞgWu­ZÙ¹rEÂürõ³ÝKZZÛªU½k×ö?÷\_FFûÒ´Ö¥iíéË{ÖmüjÞ‚®X{Çð c˜ýU jTs\9Ç>þ"àªP'ñ..¼®ˆg úÂeËF»£øŒB!‘‰úõwêÐÀü9gEÈ8­?Á¨å 'xG(€ž«ÑjàÀ9£±")¹yñ’¡•«?ÏXÞ›‘Þµ<­3}YGÚÒv\~ù°¤-ëZžÎX^žÞ“–Þ³,­;=ýRúŠ¡‹ú¦MEéKq?y¾g\Ìr¦ªá¸JŽ+U³ÿV0pK¢—A9À» ÎòìÐÌÇ_¡øÜw|!„D&ê_Ôß©¿nB¿Ç_Þ¸óÚh[ÃD@­š÷˜=8DÂpÔ c\-Ž˜ŒUabqì¢ÞP<³+cÅ—Kõ.^Ô‰-ìX¸ -x¦ ?ßMë¸,]Ò¾`AçÂ…]K–\Z¶t`ɲˋ—|6)ÑgPÿ¹Ýy­Ê™àd¼³œ‹©V‡`­° °˜ë8æ“ÅÕüàU€‹µØãûÅçþâC!$2Qÿ¢þNý}twp»¾ç`K”xV/,re˜I.ÌõáGPwG8A…E±V½`âJ­ÖÀìÔþ¹sºçÍmŸÿtÇ3ó:qÅç¹OµÎy²åé9m#hüXüÌ9OµÍŸ×³háÀ‚ù©©á¤¤EWÉÔ›»‹˜ýÀjœny/8æz8mÖ²ÿfxE1(ðNNâß8‹…¯ýºâsñ!„™¨Q§þ>¦‰;¼z¶Ë 4Èoˆð!U’è嘠RË•Êÿ+µ6Ôòp«oÉ@µ(ù$Å ¬†&“7yFˬ”Æ'fµÌy¢}î“O¥¶áóì™MOÎn½»ÔæqIÝ”:»å‰T¬«ðœ¹}))]ñqAƒ¾ŽçÕ}ªËjyÁà >í8û±´W+Wq5Àá<<à9$VJâ{g8vdÇîZŠÏ}ćBHd¢þEýúû˜&î°9çœQ>ÆÔ› ?bÞ‹¼xú»b|Õˆõ‚ êѯ‹ ‰R=Ä8€:lîÄøºi“)3B³RZg¥4ÏLjNž|<¹åñ䦻­(tïëŒé I3‚)IÍ3“Û¦NmqØ:n yÏêïÆÔײߧí @€ë'àÀU’jdå/ü–ãg¬üÅç>âC!$2Qÿ¢þNý}Lw˜?÷%œø@Ïa¸@ªV6Bx4>àÔ<ãx¿ú¾<¦”úöÉ…hÝy›¥:1Á=屆©““ <šèÅç)Õßm­Ÿ2Ùwï+~Ôcàêw¸ÆYª`¬_í}·:õrÞ[ÛSwÈ (@pøL{ý¥òvpX´u¢X+JçñM€âY©/S|î#>„B"õ/êïÔßÇ4q€iSм-T•zg$xy¨Tû‹Q?¼û‚säpb©I&I!QlpªÔJ¨×~yîC€£ä ‹Ù“àhHHhHpÔ;þÄx|®OŒ¯ÿñêKLð%LòÞëšà›ˆs4ÄZ¼:V b\­Nž¿ÃSï­·ÔÀ ¤QoÁÔìg?! ¾ëƒä>dL-€ÄGŠ)>÷B!‘‰úõwêïcš¸€Ý¶‡‡Ã Þ Dà<×ÀXƒ:Jj‰ÂÝæÿ Ì¡Û+~GË<'ƒ:ž¹$^ýÇ:íßÑÙ,VkÐf Z­›5`µùmV¿¶ú¬6Ï]W‹ÕmµxqÅZ2[\¸ÆÄøDæ˜Wd^žóऎ˜:æúîº7‚´pÐtsc\µZ W— 5jàx§ \x àŒ¢ìv»)>ã!„ÈDý‹ú;õ÷1MÜÀf½Y<”`J \ˆqMÚ Ñp¨©V<D”Å "urƒA2è4ƒÁ‹wtz½EG»oŠò ¬·‡xcê˜Û0Â~B´a h¹îÒR  æŽð ¼[R_Ÿ‡ƒW%¯¶¦Ÿâ3ÞøB‰LÔ¿¨¿SÓĬ–Ý?.€&Æ5„àæ9 æ"&¥š ˜¦ÂÅIH‚_½’èÖ¸nqN\ÃÔQ•yq:Çí!‡ _r°Ÿ; À£^~©5P‡Ã½ ¶j¬Çϼ³Ê˺)>ã!„ÈDý‹ú;õ÷1MÜÀbÞuGøhfæG£–"!6œ¶2-5µL áŒðc‡o¬Ô«+æÒ¨×dÚwü?…“îÏ×\šáñ÷.0Ò~´3À³h7zÌ©ñâp/M€UÊü+x—ƒ×°.œo¥øŒ7>„B"õ/êïÔßÇô?ÿÿìëoWÆŸsÎÌ^ìÄ ½©Q?>¢_A**ˆ"ŠÚª@¹4’L“ªPQÒ´ªŠµJ[ nn„6‰œØY{_Öñ®wííÚNê& Šÿ…÷œ™Y¯7ñî¬ý!ƒö‘~zµ;öΞyõþ2ëž©ªÀq P\ÏÆ°Ÿª:EƤÅ`62@Õ8h‹_TX‚=[¹§ë²1'€zêŽ{÷~sŒýÙ\!„$Î/ÎwÎ÷ættx¹¿Øµ}¿gú}ïoÀ™tjö†Ñ’hN¬hTmµQ—ëBpåÖy·Q£ÁIc3}u\LúƒÀÆßÀ¥žž)Ïû3p »½ï¾ÏöøG•ýÙ\!„$Î/ÎwÎ÷ætttêàgÀ+~úŒg¦Ýc"«vœv•ë)(yQŠ"ùÐÉhÅÕ…h«\ðÓ9÷ AmÉB›Ä9g9m·ÁÙ§a¢½qsnå´ñŠž>9–É>ŸòÿÚ× çÙŸM÷‡BH2áüâ|ç|oB§€ÏÝ¿ÞN‰ƒ~æ$0jÔU­þ U…)®¡g ‚¹ |¤ð±ÂÕ (7¹`wÎ-&IÌî¶—Ýý& zzz JL{ŤKÊü 8 ìþÔŽoÿtÏìÏVúC!$™p~±?œïMèôðÜ gá=‘Ê‚zjÄ7×€mÀˆèÝ]0÷¢@¤ÿQd€ùà®Vò 0l}sW1o¥¯–m5ó^ª õßaÿúïw{{÷9r–ýÙJ!„$Î/ö‡ó½ „m;žLw^ëîžp·À¬ÊÝM®%'©ù:}¸ Ø VûéRª¬J[Ô¶lÕ^QEéQc7ü=|çÁ¯|ÿt‰ýÙb!„$Î/ö‡ó}#úò¿v/fRç‚„àë«°oW,*PÒÊÁ‘Á‘Û]5– VŒ}±â¿¢–©(5¨õðôöm?صûwìÏÖûC!$™p~±?œïÁðБ·%õ>H>žÒÝ©k7€O€ÿ8n8'\kT|(¯+‰©²þUƒUëÚ®å6Àíííí{õÕSìÏÖûC!$™p~±?œïÁ`ùÂý¯ÏðÕ`—7k¬tþñ‰¶6¨ó€þÐy —7«QÖLB ¤C–­C_·±X•Sæp øõŽ}>ÚúlÜû_ì!„ÿG8¿ØÎ÷[ò?ÿÿìÝ{pTÕðïïœs» ÏB†W;ý#ý£ÓÇv:è_µb¥•Ú¨FM©Xäa°"ò*FèT[iGãTEAÞ)à(+’K²ÉnÈc’€<k{ÎÙÝDm/“ßÌgîìnîÞì|ç÷›3¿¹÷îò`<1e‹”£{t_ ¼)ñ/[÷É(×[¤z C”ØAùhºJ‚±-I–~²um'´[ÉÍÀR @Ðèììñ_Êù\­|cŒ¯_œ¯ï—Å@JVÖxÏ›"0WW‰ïìqìÈ+Mé"Ý3º¼ˆ’øòCè­8*Ê5ÂB)¡,Û2{ËK±‡ô‡ßGØòÞ–b 0ÈÿF¯ÑÃ~9oåÊœÏU̇1ÆX0ñúÅùðú~)R,<¤œQB<Ì훵7Ã×5´G¢ÔA”PRÕ°±ß4€Ô p¦¼*¬ˆ­¼#Áؤ‡ò2%:¢Ôþ.Æ?}÷ME‹ Ó”õì¼üG 9Ÿ«›cŒ±`âõ‹óáõýR<\4pà àϼl¶{²8$+aÎ%Uy"f†K=øš!Ø6€Ð Pi%‡àH@¶Jé¹\OÃ¥Ž<@xGŠ·\g¹J=Ò«WîàŸNZ²ä ÎçªçÃc,˜xýâ|x}‹–¿\Ü­ûP! èXIØäŠ÷}‘ˆJT{ªN—¨r¿ÕÚ1Û‘à°Wìé þ#×ÙçyÛ•\MöäW(cÄM7ÿfò”EœÏµÈ‡1ÆX0ñúÅùðúÞíäY òÂÓýð‹!o-ٯŠËjuºÐ¢$CC€*< U¢qÌÞ ³x?Þ mž³÷øð­á9#¦¼òMœÏ5ʇ1ÆX0ñúÅùðúÞ}ÿ–1ºVôœ‘±:Ó/öÚ±²¨¨":YUØПPÈÃö$Ýn/´Ãñ^ž w~Çà zæÿ½ùóaŒ1v#âõ‹óa­xèhÅšzôÑ=0´°[æVà]ûÝRÕ ÕBW¼: çœR¨d%dLP¥ !Ê=?Bî~`'Ä:Ð2`j(sÌÍ?üÝäi…·mç|®i>Œ1Æ‚‰×/·µâà2fìèÒó1ÝŠ;x+SôE”Pi€bå¦ô5§N%T ârµˆXÕíÅÚ¹rM›}j¬êôÎÑ´Kÿ‘Þ¡<äVjð:ð"P‘÷íìqÃsç,}i-çsòaŒ1L¼~q>,‰€ËûÙ§@Ùo8ze†³W¦~ö¢R¨F颦BUæŽÓ)UiqeW¨U¨SHX ZÂqB<­*-ÚFë‹zÏ&B3!aSÑÑ$ "EÜs\ý‘¨¨Ñ;¸T©ðž‡ ¾xÉ‘$r{÷»wXÎÔg,ç|®[>Œ1Æ‚‰×/·}ÆÀ 2 ¸»g×agðW»ºšr¯²·½×qˆ*ø1øq{\¼-q‘ia@¤€PgÕRª:4CÛC·{êê?Ih´ûG‰ŽYɯà뺷âöi¹ÂA›–IÌÎðéßøíƒ.xzÑÖ;9Ÿë™cŒ±`âõ‹óa<\É A³í 1O %Ööèr°kF4ä×:~#D‚“áf˜{ä“j­¶5mFádK¤·¦¦DZ]{µíŸ&Ú0G¶…ÞzdéWÃü—cR’ô¡[•9ó5Câ·ýú=tç]fÎy®h×»œÏõχ1ÆX0ñúÅùtr<|ÝVŒìâÿQ X¥èm%öÛßÇ®´•Wïùg€æ´@ƒ~TªUCĬJ+jÅÌf·+;‘B æh¢Æ0‡Õuß Ð,Ð’ìó½²<ì‡ü]Rm ¡«ªCfeüñO&ÎxjñÆí×pöå|cŒÝˆxýâ|:3¾ØÏïþ a$0AÑ|W®QØ ì’8â{ Oé*lN¥µX¶¨>]¸1{³¼½fΈÚR®o¯áóÕCVÉw™®h8-pVÿ#…ÆŒéê÷½"ˆ¿ÏêÏ º§Oßa·ß9vê¬/ÚÆù|½ù0Æ &^¿8ŸN‹€/%'§0++ <vVw íTØëàpXÖ93¥‹þô%m`çWQoN–éÚ5EKI޳­íç6€í sýösjH7À)‰‰Uaç+6KYÀxPNßoþ⎻FÍœ;ݶ͜OòaŒ1L¼~q>_Ö´éëôäS3½¯[ºª’ù:ª¨tÒÀǵu¢ÅMV²ò¸Ukë[KXV"ÍþIï/ìER#QB¡Þ¥¸B™¯ö…Ô&ày`ðp÷ÞyÙß5ô¾ü¹ÏÎç|•cŒ±`âõ‹óé„xø ^}-~Ë@sIœ'f{Xäbe¦ÔÅ·EÉ£$Ž“¨%QOÔj²Í ;á\ µ:cûÁôÙº7û›šÖoi"=7S‹yl^1`÷iLM÷˜~EÆ¥¬pe™§öIÚr_÷Ô`2pF·û~pëø{ïŸVðô‚-;·p>Aˇ1ÆX0ñúÅùt6<|e¹,—xÀÃã]ÜyÀ<‰ÀFå‡2"$Êìý1q=¤ ®ºœ‡¹Xí¬y@ŸÚ§§“'È„¹TΜÌBê‚¶³ ŸÎØWš MB4»²ÙuÎØ·œvDSȯ ‡#¾ÿ€D…ÀL`¬z°Ï€Ü[o—?iÁßV­ã|‚œcŒ±`âõ‹óé×½HõÞP¿?ÇS—@]ZöžÄßÑñ7tÂ5=wU"ål‰¶:~ç^Ä QŸ¢3Äø%ŒÈ6YW×mmuz È\Ö/äãòPžÕ»S*ôž)ħcaù"†)'Zų Þ^‡}û´=/xH—uíoÔ½34ô‹¨º!ÒM‘n;ÜUŽuD¿*2ßót‘èÑ ¢C<µñÔĪ¿sWNnáød¯hßþQ#ÇÌIL-[±º±¥í¤Ós@>àJ°~!†Ð3LY{>ñD%)Ýh,áXÑ¢¢z¢]í¸Ã’pL+žÒkÛæ„@gÚ:ïС%îœÄŸù£þsŽma˜=D;ˆ6 ´‚WÏfb(^§{/0(~l„9vzáʪûZŽ;}îÈ\Ö/äã’PzRåê#ÃÞÌSn¢è>†"ž]ÈÐb–V ÂGzÝ6­¶a¶(4Çîä˜&žvsÌnžöpÌÇq7§^îvR·Ü[Fôä*T+¯º_ì‹ý⃃“'Dfåä®Úºm¿Ó'‹|ÀM`ýB>.à¹0[šýXûz[>“(]¹ˆ¦H•å[¦P?,c+¦âé±\#–“P¤ü3Q*Q‰‰à ƒoü AI“'eÏ˫ٴy_ÛãNŸò÷„õ ù¸€çkÃÆËiiŸŒ _òz±_@ާW Ñû,÷Tü?Äi´Ó$h/ŸØA3Þx;;*zYF¶½¨t{ý–¶ÖÖ£NŸ òxëòéÕPþWMÇ×Õ¶,©Ø^j³çÔfe­1™VffV*ääV•”Ö/©h¨YÛܰãpÛ§¿[äðo`ýB>½ €Ap#(nÀ ¸7‚ðÿ©®=6Ë´qrÔ’ÈñËBG,<Ðà—àŸ28}TXþ¤IÅ…kª:ý}"†ðÕÖžNJÚ<à•¢wˆ¦h5 ¢8ƒ(£4VÝo&‘òRQ¢2ÈPQ4ËÆr| Ë}àã›9a}UͧÏù¸€ž—?·qHˆÕ葨nzGÉ:ÞâíQàc˜oÔçk93Ci|¦q‘u£#êCG×µ©8hC`ÀzoïJŽÊˆl }(òK‰,exiMÆ”/¶púL‘@ï…Ðf›>ö ˜M)‰3_0.$Ê&šëÉ,÷ï»9lhkâÔs¦ÔNsÚI[QGÓö®övùüE¹ó;ùâùÒª —Õ‘ÓruíÛâ2Lqq_M™|tä[ûüê úJ_¯jŽŠ‰rXÊ$Š1x&X³š>käС<“‚ùŸ²|C³%q¨QžA $ÎöZ }â¸#Ó§žµf|S^üScÃ㎳òÝ;ò£‡rw·|ý¶|ý®|ëW¹ëù·¿äîÇòýßå÷äk7åäå[·å3gd{ÝýÂygS“?›s(|Tk ¿ÝC·T+•r”ëø–|âKýMæÌ½NOùô.ÿÿìÝyP“wð_Tõõ*‚7åQ‹•EiµíVE<Úíe­µUkÕZ׋ª€¨X<±Ú€’ &CäH ¹€„„@.BB@P¬X}÷ Õíêô Zqç™ùÌ3¿ß›¼óË|ÿzžÌ; Љ“òÉ~ÛZjo÷ê{ÅÞ.iö,ÖÒH^TdÙ† ü“§:ÄbL­Æº»±[=X»Óêè[0™ï·™ï»z;oÝ#uá/ucFó}ñA› kÖb ÖÙeé†õzìê•îäDYdTñ²•‚E‹ª/qYzÜuô)Þæ:¾ôIjªø™§ù ù Ø|úË7ðóÁ¶ïÚ ßÐV¢3cnh}ø\ùÂWUóÂÊwoP3Ô7*±Z!VW‹56âh/_`’4t>Ò%‘Þ’H{$Ò;}zm»J¥]*åͺZŸo¨«»'b™´ÛëÖñg…äE-Q‡…ʦxq=ˆWÂ?ØZ{›³g‚|`> ý2jü"kûwzßÎ>ÞÓƒ±èÍ¡/WÏ ç-\p}ÍjñÕ+§ô¾°“Ôabѯ›WÓ.™ù¶‡&¾ÀÌtðùÝøâÇm?ª@`’Ö›ÅBCe¥¦²ºS*ÃDuØ·gï}ôQÝßçrßz]ùj¸lÞÜ:o׋c"Ëï`Fº8ù ¨|~=Wf7|­ý{ƒ¬>jçç[0?¼~^¸ðµÕs˜ï~PUÁÅ„¬²â§ì{>ïA ïNyy[y…F 쨪Öõiíc¨ªj¯ªêèƒ/ŒýUm¨æêêD7Å¢®rŽ©´ü÷:Æ.ò.aË—ñ_‹à…ÏåÏ æ¾þª(ˆœë0&¡ÕƒPäèQK!ŸÀ@À¯É¤  E(ÒÎn‡ÕàƒÁ7æÌjÀkä’Æ¹aù‹—1 XØööµÞÊÊ8œï‹¯YlCõ®ªíWÙÊ2®Æ‚£-ãèË8†² SY…¹¯-Ûþ©¨0”^ÕV•›ª+ÛË9í¥׸÷J¹XI9vü$1¿xFpAèìŠ9³¸3Y³ƒØÃ‡î·Bë_±¡pZ–òy†ù @0ü[»0„Þ´µÞ:í'ûpfÉWDöÎâ_Yø&óß' 9E]ô|m1«£¤äf »“UÒÎ.5––·•”j¯\mb]ké£a±uxãË*1âo°T|ÍÖ÷»Äpe,*дX¶e¦¢s!«§ˆaÛ¶«æ„2Ãæ–¿2»rÁ<éÌÀª@?Áò·¸ë^|aBÏ3Ì`‚à½pÄÈ÷­‡l$ ½a/7Ìž® œ"÷óäÍ« É}ûÝâ¢2¬°´=¿DSÄ22êœËê¶o^é9 ôéÕ-³ ©’YÐÌÌ×2óõLf«…e­î7mq¡9/G™Ñ’Çla¶ää+ñ®:·è&=÷#ûpUMpopÃC%îN%¡Ó¥>壇Ch£Í§#F<­g] €ç ?Ï?`ó«(„Þ³±Ž —…†4Í Ñ‘C‚êB¦—¾–{6ý‡ÌKF*CNcÔ] Isr4¹yZZ–,“ZOg(r™JÆåFzŽ_ÓJ:£™N×Ðé:ú¥VK¥·X®ô]sù’‰žeÈζQX¬Í/jξ,§Ð(™êËùXBB{ÈŒìéþ¬@AØ,Íœ`íìEhp-BѶÖÛ „å#G-‚|þâ|,~Æüˆøqã7#´zø°8/÷Ëd_®ÿdñŒ ÅÌ ©?¹bÚTÆ×{Lßž»ž©Ë¸(?wžOÍj¤f)©YŠ>SX^¢5Sij*MC¥ê,Õ²nî75-³Í‚ª¡Ñ”´,)5»—™-¥P›2h2± ”îDj°M€oÃT¯¦à)ª¿:ÿÉëÁ±­±º|ƬMÏ_–À@À“¶nË>âãÁƒ· ³‹÷p»xcYèëU3ůfF²_þœ9û˜ÓÎtdœoM¿ 8G©£d4PÒå?yl« ¤7Q(ª>-Ц¯ª,û‰Ò’~Noñ]K:E‘ž.IÏQÎ (çEße4dPÛ¾Kÿþ«mjr^ ùº¿¯ŒìÙ4}Š&`²,pª`ü Þ£#´ÊnØÒM[ÏC>A> 9sîú¨ÑKz@ˆq˜pÁÛ›íçSííuÃ×§fê´ëþ¥žç—.«H#8sNr.C{â´9&ÎΙâ]êï'ñó”M›¬ ûÕ“' ½ÜK\&·² ¡Å¶Ãg\B>O5€€ÇÉŸ#´ ¡-#G#¹]us+wr,#ºp}¼yä©U“Éù®¤´µëêOœ¼“”¬>sºõä1å©ãM©)ÒÔTÉ“õ'²?ôXŠäXªøXªwâdmÚUb’æ›ÄÛ+WJ¼< È~"/‘¯ÐÇ»ÆÃ½ÊׇëíQO5€€ŸìŽfÐb;›M66&:]òñáº{^'ºòÜ=„øÂ…xÅË'Ç•têËmªcÇ»R¦$«’¿‘§&+’eIIÒ¤¤'ê¤\r=.9IŠtôˆìh¢4%±öh’89©6%¥1þ@câÑÛkÖ¨ÜI ?ßJ¼¯%’Øn¥DR©·wµ;éš«sÞÄ i}ŠÐâõë³ Ÿ§”Às€ŸŒ»ÊÆê3k«cÆ¥9¹^Æ{Db¥««ÐÛ[êá)pt.r%e{z÷Õö–#‰Æûå÷×%ÄÖ9Ôp@rèà¯:Tß§öqõý«¢C 5¸„ƒµøA‡ãpGâ%GâëâÅøbbîølšäyÑÓE$±&s=˜øç'yp'•¹LbOrȶ&ìBXã0aƒ¡†|žF>ÏŠŒ:ŠÐŠ¿Ùì²·I ºÑœI¹ŽÎ…ã^*™ðRµ³‹ØÍMDtãLr¦“§]ܼE£Œ‹‘F﬎‹®9+ŽÝ+ŠÙWûsDbbø11¼Gø?^üíÊÛlj‰åÄîãáÅ}-‰nˆÇë×µû÷Šcöcö4ìÝ«ýdm“»•è–çLÊwp¥:hDO–“3Ûib…›KõıÌá¶©Ö„-öCÿ¸òùÓóx^Àð(ÂÂ/lµFûÆ¿˜áâÆp&å9‹'L,7¡|üøJ®“#ÛÑñR`PÞ† ŠÛc÷Êþµ•³g×õ¸=¢Ý;»w Žà¡]5»wÝèSÝWkúoçî;£¹8üÆè‚èbÜ×Û…Ñ;„û¢kñSöîQnÛ®Zý±ÂÓ'{‘áäšçèFç”5Ñ¥pìø++¼=ÅÎlÇñt;«XúÈÆêüì=äðÿá?ÿÿìÝùsS×ðóî[ek—,ɲ »mNba·16›‚ÙWc°YÌŽÐ$MBÓNÛ4!Žwy‘ô$Ë’÷ /˜BÒ¤Ói:üÒtúOô¾g ùAã3ó™3×Ïó½ç§ï½sŸ„Eê‚wÞäù· |×âˆk´Ç7ÚãÚíqŽØ°SÑçl=*ðjJ뮜=üÃñcß¼sæÛ·N_{çí[§NÜ,,¼ýX7ôø?þ¥;' ï =çäõ§®ž¼Bëé3·½Qpä»'ÊËÿiü8ŸÓY7*¾Ùálw8;ïꢓWæÛj1Tìš;ë,öç9ö!„B(‚à@a±íTß}Ûb–ãF…í±m¶¸›³ÃÛëP8mÎØ†Q±¾„ ¾Íÿvpÿ?þþÈ‘…ǯ;~ùð᫇_?|èæÕ{n=Q=øõ¡CU}}èðõ‚£— Žõ*Žö:q#ïÀÕü‚ïÿïºu!^vÄøœŽ–XÇ»£ÇNklÇ e±mcâÛXøˆ…VÓ>ìÏsìB!„PÁ Àâýn€‚tàwñ4×::¬¶f‹£Ñjk¥l1m¶˜V{L³ÝVï´ÉvkÙŠe×öçÿP°ï›=»ûèËË ïÝÛŸ¿w ïå'«wå_}¢š=?ï–‚öìÙ×»gxÈKÛw]ÊÙóíƒÿNKëµÇÔЀn³6Øb:lÖ.«­M]B3E—`³5OÓeÒ—°p `}nn%öç¹ô!„B(²à`qBân†l¥ß˜Ì¥VkHg­ Ƙ ÉÒDYÌÍs“ÕÜ`µl·QW4{F{~Þ¿rvÜÈÙÑŸ›Û½}{Gήžœœ¾á¸4—sv^SÐANߎÜðŽÜ.jûîðöÜž[{·åÜÙµûǤĀÅTi2zèTÕ9·ªóo0Yƒ”ÅÒ@ÅXBk-ÀI˜?nìNìÏséB!„Pd递²[¼˜%hòEñ=›½V«õEkCZc@kòë AÊ ôA£>`4ÈV“Û¤/IœàÉÙñCvöÀÎW7ooÚÔ¹m[϶m}ðµ8¶l½¢Ø6°e[ß–íÝ[¶_ؼƒêÞ¼½/{ã¥M[¿]›ýÃé2iÀõZL!uÎ4©tF¿Î(+Õ «ÐFÉ&}5À;fÃ)Ž,/+¿ýyÆþ „BEœ‘¾X¹ê÷‚¸ /:êM‰6: Ó7KZ¿¤óh¢ýTtT¥òk£@¾ÉðÇ”ŠRˆåÀ¸€©P«‹ª»\,S ðÀÇÀ|쌯ž=¯gÉ’+óÓËw¿¾¨sÑÂŽ… Ú): ?.~½ëyIMm]´¨{éÒÞ7ÞèIOo››Ú27µ-mþ…嫾ž6£3ÆVɰŸ|AH9M·•ª¸¦Œ!_[´*Ë¡K¨X7 EïJ|¡N›7oÞãn¹`ß„B¡H4¢7ÓSNópLÃA"@9/N~DÀ­b™*5ã~ pN¯/OHlš=g`áâkéó»ÓÓ:ç§v¤ÍkOÛF+E|^RçuÎO §ÏÏO»šva^jWZÚÅ´3fõŒŸŠÒ–Ðù±¬‹%54ÅEÃT0L‰’nï\— ”üÀi–ì™ôâ[ØŸ§îB!„P$Ñ]ÏÁ‡s^=º®"¼ Zɵ4‚K¥ "L5¡1‘TÒàÈ"­Î•8©3}Áí9³ºgÏê fÍlŸ9£šñZ+58~˜–a™;§‹>|ÆŒŽ™3;ç̹8onßœy—fϹïÓ)_^{^ ¸e„«%¬‡¦Xn¢LX9äV.¹4¬×0Ä'òõ©ø À€\³¥ÀëûöçéúƒB!‰FîÀãþ‘µQüi­ø9Ï”Фè¦)P<pkî ¸µ uó|µr„)±XS’{§¦tM›Ú6ýÕöצuÐJÇS_iIy¹ùÕ”ÖGhúXúÌ”WZ§O»0kfߌé}ÉÉá„„vISA”›9E4Ý©æx™°2^2/£r«év(àÈ<äØZF9¤? °åó~óvöç)úƒB!¡FîàÌéN¸['¾Çç,T ¼Ì/@…š+þ/à*ÙW‰¿å-Xpñ‚Od U,_k0ȉ›''5¼4¹9奶©/·¿’ÜJÇS&5¾<¥åá’›†%yJcò”æ—’in§LíIJêŒuuÚ–Uæ©$rRÍr^–ó©KððÓŒ«ÎܤLÁTC—àeÙËx¾Bà?(dȾ[ª±?OÑ„B¡5r7k²ÎéÅD¹éñ'škyÖ¬W¹ ÎV>2à‚W¹5ï×D…x¡   ÈnõÄÇÖŒHššœÔ29©iRBSâ„à‹‰Í/&6>¬R¡'¯'Ô'L &%4MJl7®Ùn h$ú‹YškI a=4ÚªéÖ§ÎÜî_\­‚P%JçXî· {0}៱?OÑ„B¡5r7Ó§žäaÀi€O8p³ ¸nª€”>"àzU>`”ɰ~åóphdTÞ.ý2ZsÞjvÅ;=cG×óBà…x™ŽÇŽ®{X­;Æ÷ä•>jô(Zý±v^_% å„”Tªï³z”SmF¾;=e†‚o¹¨¯·VÜ ¸ å5<_Í ç8þ}€‚Éɧ°?OÑ„B¡5r7ãÇæìx7š«ÔK!åN'³ ˆ%ê'Bþün«› ŽJˆ„Ï7Ô*”¤[§^Žÿàó(±Ülò:íõNg½Ó^g·ûãcé¸.>¶îÁê‹wúœqò“V§/ÎpØëc̲F¢ÿ«˜"LµF<_¯<Õ¾{O§TO ¤Rn¹(é–üpéÊ»¼ţ„(7~Töç)úƒB!¡FîÀfÝÊÂ^g9(æ/ÇÔR¯«A¹Çÿ 4#Þ«ô7j²¬%P÷À*_Œ¥Q¿nÖjn°X‚VsÐb X-‹ÕoµøÕê³X½­f‹Çb–i¥YÙdvÓj4úxRË™'2ËxYÆGåÛ÷й1d ™Æ¡‰1.%àZݜР\/ÇÖr\À…’´ÅãéÇþ ·?!„Bjän¬–¡€ËB1Œ"L£zd0&(Q²ŽXð$(òAIjÄz6¤ÓÖ«:ÿ.ùñ´Z/íåçHÅBpQޱë1Ÿ­4ãªYÖ­F[p«î ¸>ŽõÊÇã|ÈÀ[’´­ºªû3Üþ „BE¨‘»°˜·<p Ó‚¡Câa%kÒЩPC6D3®È× \@àü/ ¼Gå¾Ëóx<ç¤E™cêéô( ^byÄ|î¸^år‹’qk€‘9¾E]`}æý·¬´ û3Üþ „BE¨ÿÿÿìÝïo[ÕðïyνþÑ´”ÚˉLo7 Ä&˜Ø4Mlcc”mm×ZÄ6 ‘•‚ª-TLí6&uÊ6¨ t-­œ&qâ4‰ÆNì¸NHÒ`Óþ™s®¯ã¸Mb'/Ö«û•>:º¾Ž¯Ï}^}ÏÑsø.vßùÓ¦€›ñ0*Ê俬‹€ÃÒ¬r£¸èé’è°/C†¹lБb[Sä‚cÛ`Ü™ÌÍ<hM,N°½}‹€»Þ|ãs/®cGÎ;— DDDDãÀîgÀû¾¶¿ 9fr!l.q1·nG9 ûËÍɬȰȠ3 :SgŽÝnú꫊ήKwëæ3Îg4 ¸Ãö™WùØR0)Ù›®˜¿1I:!g€?»€»ÿ­þ,ëÓi}ˆˆˆˆ"*¾ €»îÚ³6àšPX&QÏ©#m9Á¤¡0¡l|4ÉrÔ¥ä‘ °jÕ:ë Yæ¥\ÑjB«|ËèIÁ“I36θ+‹sw¬ñ½î+²ëÍGcBÛ»È*ub2n’…ÊyºènpÌSƒ 9Û¸;5ÄútZ"""¢ˆŠïàÑ8$8îîg£ä¬ ªæÂëMG“V§L86òADbnÓ¶÷H“œ»¾‘oÍu\®r¹¶Ð8_ϸo|oÓõo5p'ìw©!ûŸ­Ì¨ÌGL€.WqÛˆ¿p÷Þ2à²>ׇˆˆˆ(¢â»¸çÞŸhuPÐg{Üë·LÃåT—'ÚMš¼j¦U}|Ü11wÂ\“+Mﮎ°ë>>Ù8_ßç¶ÉûJ¸n»qÖŸO^×3zÖ¥Û¬»NÁ“9 h“n=àžT8šJý¬¿õé´>DDDDß@ÏýÏ?Žtï8çËûMOK‚²;0‰0ßÞ˜wÛÆW]v  7ɯÕm7Úš²é¶ ë=5â"µ™C1å/j5ç’±¹Ù·?¿½çÞç/\˜e}:­QDÅwðÈ£¯iÙ ôj¼«íO[N(̪IÞ…Ô|L7 aº-6eÜ…µcóÎ÷¦1ºÝù(»ã^ß§¯`¾wVc^aε¸ *¼£µ ¸¿ùò}/f2s¬O§õ!"""Ѝø.¿øQ2¹OáðW­2;ü¢ØxÍpKPS¶Ý¥Ñ*mfzu4ŸR“ñv™?¶iw> Ó‚’gGÛ+¯Ô¤²û³°Ñ¶ ”5òIPã-?Ù'Þ _ùê˹Ü"ëÓi}ˆˆˆˆ"*¾ €¼x*•<œòõ@W¢¤0ãRà¬3ÝL×;e’hÁÅÖ6šbô棲]:³fÅe\e™óeàP1·–P…¤? ð&ôȾ¯=ü*ë³…úET|öæñßÿ]:yÚþ?ZU›k«¨ÇÁ’‹¹mŽ›]«Öö•ÚŸ²Ñ¶ì¡,6éÚ oUßÞžwãLÚŸò½ó@pøñ·¿÷ë³µúEQ¬;»÷¿êJŸö½‹ÀhR_Ô€Š2T¹3êèRÛ%¨hT};–µíÚ7Ê 5…·É=³3UÐú,p8 ©8üOÖgkõ!"""Š¢X/¾õD¿è_'§<}NÛÇ[+îIЪ bn;ê·¸Öú×~ªêg›:™ *aÀ­j—qÅ2ça¯6Û½ãªÖg€Wx~÷—öÿÓ8ë³µúEQ¬ÇúŠ;vötŸï½\L&*î!ÑE“)áÂ(ZSiµ5w®Ùä.ßz?»5ƒYh[-üêvé¦tLv{;¸¥îî)Ïû;ЛÞuð¾žù°Êúl­>DDDDQë€!‰ï¿~ï'/zzÚ=ºb{ÜÅýhŒLA™ƒRøè'.&.»q>l…ÞsŒ›šïP;×l˜ÛænŸv {ßçÜÌií=ÿr2õv*ýrÂò›õeXŸ-ׇˆˆˆ(râ¾xð¡Cðö½~ê,0ªÕuQÿ†ªBWÉ T°I¼|ªð™Âõ`#Û¯Q´pðø‰7+À“@/p:!“]‰‚/€ÿÿq¾pI÷Fk¢­ÇdžåÛf4ó_ÑX|.væáüÕ|:=£åœkp?ÐÓsðõ×ϱ>Û¯Q´üÿÿìÝ{pTÕðïyÜ{w7‚Å ¯vúý«3Žv:è_µb¥•ZGª£*Ö‚<¨ò#t*ŽS†V´¡T¨-•‚ò¦€£<ª±BBH›ì†l² I°@_ôœ³» No:ß™ÏÜÙ½9÷îß_ßß™sOØX·Ü¶˜,ñÄú˜Þ§l4<žS#mÌí’qe™Ë¸™Éã*§"7—†c&ÚV™Ç–ÙŒ^i§½Å»¾Ú¬¦Œ¿ÿþ’ßÿáj×·°>DDDDÿ7ØXÓgmWjBß‚e@©ÄF…¿¹\› ¸uæˆlƽ(àVº‰ðš\Æ­ DZ2m3ÑÜ%ÝÃJì×j°(‘bÂ!Sž~j%ës­êCDDDÔƒ°È*,œ³$™ñxnJ[Ùh{ ¨-ÈK›ø(D¹A}s”åÕ@!pL J :Çj÷Jk…’µž0_&p0¼£ä:`1Pü…~F~ñš5{XŸkX"""¢ž‚ @ÖÒeG´7NÊiÀ¢…ó"&#P¨ò8Õp ò ¸ÊÜ#°ññ„Së’å±pIQcžV«OV¹ÿ{õ—ˆ¿Q‹s´÷•!ã‹\Êú\Ûúõl.:tð`àÏ~lvª"ªêa׊42a'e¹ÞÎ\in½“™ä® ÉQë:ØÙî*OxWÉ·}o•’%Z?Ù¯_ÑðoÏxùå?³>×¼>DDDD=€ Vý¶¢OÁRý0wÀV_¾Qµ q…Æ@7›øQuÈ9p.àÖ†‡[‘øÈ÷Ê‚`·Vk…[ÜÍsË­?œ9k9ës=êCDDDÔ#°èfüÄeÀ° 67{%lnÛû˜jôÐl‚¬D\È£PЇ¡+¡j ã q‰¡qܽíZ¼íF·/¹=|Æ þÒèQcf½ñÇ­¬ÏuªQø±¸Øm·O4Y˜›—·6?² 8è¦&‰!ŽCUBW„6àš'”ê¨[„³?ˆîñ‚7€gÇc½Gß=|êÏ_ø_7·a}ˆˆˆˆz46[½îƒ¾ýMƱ¬Oþà=·wd£F›B£4‰V…w^t-T=TBŠzRÖ‘ZáöBn‚x˜ÍŸxë×2sNé–»YŸëZ"""¢cp óJöôºišÉ¸Z¬ððv¾.ȸ@½ ¸"Ug£­áÕÁ«‡N@^*k"ÑEcw‰n®œYí˜&§178žóÉ2ê¢þQ­o¯%ã¿…c‘ h“2Ûs:—tEK.˜&Üf8nM¼wQµ¥»ÖËkj´2WÙÔÛ)qFâœù!¶¨J˜t vAþxÑ<'ăýŒ¼ëžI³ºô­];YŸÏ·>DDDD¡ÂઌUZXX LžykûD÷jôp4¦š„]ybBí™OÄ\7?-[ìb“MmHMde¦«ÏÏX_6àºìkï`.o²÷­¹€û±B§Bk€†˜wÄ—Û€•À3ÀˆQ¾ø½»ï7Ñ’M;·±>a¨Qx°¸Zsæ¾5xÐd ˜¬–Xlï­+£v»É4D'Äi ·DW§!;-ÕRP'”˯FÚisÒ9îOf¼tÊŒ6!Ò-¾HjTGtYTo~ Ìž(¸yü¯Ž{àáâE/.a}BU"""¢`ð¬ÿSòö¡vÉ{ XîcM¾2ár»V5Bž2%d‹mí.욤û,qÞY—wmÆ.×Úñ6³šKÚLJî´Ÿí›tݘ¶ìÝL†6gTR©¾ªt™;£þ›~˜ <’×çá¯Ý1å¡Gæ”<¿tûÞí¬OØêCDDDl>³¢GW)<à©^þb`±Âj`‹ö+¢yµBV»÷_“B¤V_ÿøìbôsöƒøûz&³FÚ¥ðv± ² ÖÏiüSà¬;Ó!Ð.e‡¯:|כּäŒ'Û£‘T,V‰| äf`µ¥À|`R}¬ÿà¢;îœ\DDDDŸ¯ÿÿÿìÝyLWðïÌ{³³»\‚`mZ1hÒÄ3šÚh+Ô£TÔhmÚŠZ (¨ Ë. ˆ¨TQ© X/°ˆ·6˜*ÄhK«± 1šT£Õ6mcSµô²¥3X“þm‘]ä›|ò²y»™ìûæmòûm&óØ<ŽŠ­ßt™ŒÐgÀz¨UëQ‹~\“§¥âºÆÕŽÍϱÉV5—î“`÷ŸÚ=vXdšÃ½jKEµÇa>DDDDÞ ÀÿõÆØB¿Èd(.Uf+Ê"`¥T+ƒjC:Ôú]ðµ^Òp©ùÖ—¯žeÁºé†ŽŸtüÜì–1ZÌcþº®\•¸œNŸJÔHìVÍçØw 9Ù7 :¤ó¸ÁCgÆ%,_µë`Í)çÀ|ˆˆˆˆÚ6-Ѻ?08eµ&æ 5x(Ê€=‡4QkÕŽÛôÓ>¶:M9©á«fuÎ5«7F«8k•§uyÌ" õ ¢ìv5,—æÕ bìö·ºuéœøÞÜkv8xÂãkg>DDDDm€–T´êó/ee.ÝÁ?[ªó,T±RÓ>ô±o³Ù*e«Q° u§PvKìÊ^‰}BÙ×<îf9[óHÝ¥ÀÃy®ù—¶yÔîÄg;Åôì9ydTjzÆÊŠm‡<¾XæCDDDÔ±x"œ®ª®]܃ܚL’"UQ²5} dA-0˜7è…ŠRøh\dÑAË6> $±Ðã,þSüCbzõŠ3:mvfɦÍjŸðøê˜QÛÅàÉÚ°ñJRÒÇC‡¯èÓ7'4,Ý/ x[•“‰ùIÛ»Vßè€à‰]ºOyñ•´qÑKg¤•gçm/ÛZS]}Ìãka>DDDDO6­j×îëJ..Üž—_ž5§45uµÃ±"%¥Èx‘ž±&7¯lqaeÉڪʵ5‡ë=þm™ÑÓ‡ Q;€ˆˆˆˆ¨a@DDDDÔŽ° """"jGص#lˆˆˆˆˆÚ6­§¸ôø4ÇÆ1ãGX>hAïî°Ðİ®“ûôN~5"kôèœ9sw­.>âñïÉ|¨-âþa>̇ù0ïÄ|¼€'¨´ôL|üæ.Ï'¯cm–X]ŸÄ $©æñ·Sã­x ΘT D«êD!'¨b|pHRÔÈõkJ®y|̇¼÷óa>̇ùx'æãýØ´¼¬Y»úõqúÆ™‡Úb²]º‚|çûÏ ôɲ §‚$©:…tkÂ-¤K.U8…â‚â´[35-C*骚n³dNãçÑó…yŽä=_ó!oÀýÃ|˜óa>Þ‰ù´!lZÌê’ÏÌFûÞ w'ß%>(°!߆¼-﹎=»/Ø¿8<|]Ä5‘k‡X?|ä¦×¢¶ ‰, ²ePxyï>¥=zmè¶>(¨H ÈWð.—.6Ç€~‹æŸôøJ™µ>îæÃ|˜óñŅ-bЦ;> ›DYõ©ÏÎÒ€Y~ʲ®7Gô¯Ž{ç¬#±Á™t*?»~÷öƺº¦s›.7]¼Öté;Ó…+æÌ™ú¦âÒ›ù ¿áh˜4é˱cŽ ~ùPXh™¿OQH@±@®"˜àïëN­òøª™µîæÃ|˜óñŅíúÿÿìÝyP“wÀñ"ÈáZmm=!n4Ê!¢W¥«»ÝU«ÝÞum­Z×{{y,**­€ Ö”1 "W I¸’B¹ÈÉ% xüö ­ÛµÓZÚ­U²ÏÌw~ó¾&Ìgž÷gÂ(,ÿS;þ‘=løË6hÈGØ3ºÃÁv·éÌKá×^]Îûð=I̧êôÔ»Bn7ã;·qOÖ™°®oâ®~Ü{÷ÜÅ·°¾k ¸ïî»&|ã>“Ò¹sïí7 VE³¼˜Kšzf¤S¬£Ã.[´yà¯è^›ðüºõd>qð_0?à>à>Ogà3Ôƒàgvü„tšÿN„V8;ý |\åì”0o.{E/:ªdãFþ‰“íµµX©ÄÝÝøf/6™±Z{_Ûv×h¾§7ß6tõwܼ×ч»ˆ/ucƒùžÆp_oÄ-j¬RáŽ.ËÓ¢Õâ«Wºã£¢ W®,]ZtiìèCÈò ¬·AëˆÇ`ò„÷’“kŸ¸ø@¿l0?à>à>à3}†J°üœ/>dk…ÐÛÃ-Ÿvmž:938¸bñŸ„Ñ«x›¶Õœ½`J°¾wöcmÇm™J/kmSk» ¦~£á^›æŽN{W×Ö¯×öëu·õm½mm7Û4Zm»ÉЫÓõhT]*e·VuÛ ÃFËê,QàÏ“»Vþµ$zuåªUusgNx.åǸahÛpô¾-Z±hÑþ'n>Ð/Ìø€ø€ø EŸ!,?­„¤22yB+GØýÝ}:Æ91R°|icä"îËá|²K–ÏÁ-:¬4aq«AnеU-¥\­l’kdr£RuÛ¨Çmª{šÖ;*EŸRÑ£Tt+[ÚÕʪ]£6i5f"µÒ¬j5/¶iºu:\/ÅÚvÌåá-;„‹"³–/»µT4gVñøÑ'†ís°ÝŽPô¸1¯?ÉŸ§Üzt0?à>à>à3}†\°ü„Þþà<²‰rtچЖ‘ŽIdWVd¸lutëŸçlÝT~‘Ö'aE ®áÚ†ž¦–iK»´Å$#R´ËÝ2y¯¬¹¿ù›n=¨×’üæÖÜÛ(íkUb½7Jñ©SêWV±†ç¬XÖ°$²1$°ÒqxB[ÇÚ3ÂnÍòegÁç©õÌø€ø€ø EŸ¡,ƒÍ/èC[Ç×F}ŒÐv’ sAXCÄé’— ÃK?ûH@KSÞ¨ÀuB\_‡›šˆIíç Œ"IǃºDâ›"q¯HÜ7PïƒÛ?Åâ.…¼³¾NÃçëêëï„8Þ³~=nèåèåÊð°ÆéÞ\OÒ„ˆ_ì}g‡MóæŸ§Ðzt0?à>à>à3}†h° ª±Ï/µwþ+Bo:9Çzy2—þ¹%ìŪ…¼%‹¯¯]S{õ ./¾'¬Æ¢z\[sŸÇëæU›„5f¾PÿM#_`æ ÚùünKÄÅ×·ƒ8£¸Á\+ÔUT¨*ª:ĸ¦Ÿ9{çÝwë¿€û—?Ê_Šh\¸ ÞÇíâÄçŽ"Ë¿“åêòøÐ£ƒùððŸ¡è3tƒàGbä4:ZìèüÆ0»G8ì÷÷Ë[Ѱ0Bø‡ÅUóÃY¯¿UYÆÅB®(»_^r‹Ï»_Íë+-Õ—–©ÂöÊ*Í@mé*+M••í†ÁV¥«âjêk:kkºJËÅ¥7¹×1§g\¯¬äÿ!’±€?'„ûÇ—j‚)9ŸGhÍ05nì ðy| Gó>à>à>CÑg¨ À£J§  #vJ'§íl…ݘ?WBœQË›„ç.[ÉÊcã+œûœkýwËËo^5°9ºª]•7LW9ò®ÊR¹º¤\[R®+)3–”™Nƒåvp••銯ª+KU¦ÒrSqYÇ5îb..*Å_žÀ‘‹ g‡ä…Í+›?—;;ˆ=/˜3jÄ;´á·£7 AÏPÏô`~À|À|ÀÇú|¬ X•£S8B/;Úo†P|ËçKWEõÏæ…„\Yò2ë_'tY]Œ\u!»½¨¨³ˆÓÁ.2qРťú¢bõ•«Íìk­©Ø ñ`°‹ Ä7XN⚣dœ"Ý5¶¡ OŸ×j¹-1™óÙ½œ_€w~¤˜Æ _Pú»y‹ŠçUù³m,ÿmÞúß>³¡Hðy‚>Ìø€ø€øXŸ À6fÜ’ÑcÞ´¾Éí Q2o–à>àc}>V,ßÓ¢ÈØñÏoAhͨ‘û½=²)~Ü€iµ³ƒes‚Å”²™3˜»÷ÏœëIMפ]”ž;ϧe4Ñ2ä´ Ù@M'³|‰ÞB£+it¦±œ–ë–A§¤§ë-ÑTtºœž!¦eÖ¥gŠ©´æ4zû…t¼q£ÜƒD ¨ô“Ìðn™®ô¯˜Vno»¡µö#^™=w3øüj>Ìø€ø€øXŸ5 ÀwÛ¾3}Ôè¿ÙÚnéëé~)$èÆLŠÐÏ»zºõì`þ4ÿÜùóó4§œnO;ß–zAvŽZOM“PS¥ßöЭŒšÚL¥*j¥RU§Âòâ £¶¦žÓZúª5•*KM¥¦ÕPÏ ¨çk¾J“¤Ñô_¥ÞÚ±S@¹D¹à×Hñjž5]8­1h†àùg©Ä3ŒÐ;N#WlÞ~|~æ|À|À|¬ÏÇÊ‚à¡NŸ»>vÜ „Þ°±‰™øÂŽ¿o•÷ ?ßê3¯{z_±²,þhç—ÇõTªþìÙ–3gšN’ë €‡¢P>Dh%B[ÇŒ=Gv¿êî^:er É•ëëą̃œFÉu#§¼¿¾áø‰¾„DåéSm'ŽÉO~Ùœœ$NN}÷ü¶Æ_.ñ±$ѱäÚcÉ¢ã'êRN+âT_Ä÷¬^-òöÌ£ø×x{Öøù }}ª==*ý|¹>ž…ãŸ=nc³¡¥>¾Àç±ú@0?à>à>àc}>Ö,ßöÙ.Ž Zæä°ÙÁáà¤)—|}¹^×In<O!qáJºâí›åF>¹m§âØ—ÝŸ–'%*¿&'ÊãÄ ß9¿“øç—Ø@”˜ &Þèè‘Æ£ñâ¤øº£ µ‰ uIIM±›âö¬]«ð 3ýý*ˆ¹'‘9îžÅ$r±O•ùš›ËåI/¤ ´ŽØƒ7lÈŸÇäÁüÀó>à>àc}>V,ß6þ¹wì>°·ûäÙñ)Sܲ‰r%U¸¹ }|Äž^‚É.näL/Ÿ¯v|Ôz$Þpð€ôÐú¸}uGKâŠzd‡ª{¸†Á5‡ãª‰âÕoôy¬„èH¬èHlC\l-ñ 1û$‡>oÿ`½’ìuÑÓ‹M"³'‘r\« €oŠŠ>ŠÐªß8|êìGr§»s&»äŸPô„*×Zw÷’{ùTeæÅ-[å11òý1â]ŸTíßU}p_í¾½51ÿ¬û¾j$ˆ‰áÇÄðÄ·ôõ‹?~òöî/ÙW¾ïŸ<âöïÅî’Äçîº{kcöcöHöîU¿÷~³‡7ä~Ù…œ;Ñ6‘L'y±§¸p¦L*sw­šôk”c²½ÍVç¯mŸ_Ü‚ùç |À|ÀÇú|¬µÿÿìùSTWÇÏ»oí¦÷nz£qW0JÆDFÀ­4Aãn\Š(‰Æd¦f&“̓";½@ÓÍ"«¬îû$S©8“Ê/“©ù'澇f™¨%j~˜îSõ©S ^ßû©óýáÔë×ÀLšAŸ+À1»¥rø¨À°Ñ±#Ú®ÍÑc·_Œ‰éÛëŸüjcNν‚üïŽýö`nß{‡¯|ðÞí#7Üz7ïsøú‘ÃW.+õú“SpäjAa?…þcá¡›…‡îPÞÍ¿Uxèֱ»ôU޾÷Ïùßgn¹?®vèˆÀ‘±£êlC|®á-V{«+¶÷…ø;Ãb:cíujþ8›%þi>ý ÏöúA?èý ŸÿG?á 2‰sÞxƒçøØsÎÓ`s5ØbZm1ívGÈ)ÓãlëeBóæŒïöí¹÷Îþ;…wå_);û6nîËØzwç®%%uÛ¢+i€­–zkt›ÕÒa±¶(Gh¢Ð#X­M£†uu§Y8°*3³ý<?öæ ý ôƒ~ÂÏOxƒÀü1q[²F”Mg,– V4Xê Ñ£¹‘b65™MS½Åì·š« ÚSÓ§´fg}Ÿ±éZƦÞÌÌÎÛ26wedô †¾Áp1ãí+2t‘ѳ)3´)³ƒ²qKhcf×êõÝ2noÞòC|œßl,5Üt«Êž›•ý×-ŠÙ\O‰6í–*€*1{Äð·ÑÏsñƒ`ÿ`¾ÐúA?è'üü„7‘>œ.¾Á‹ËU¶(µÚª4_”&¨1ø5Æ­>@Ñë‚z]À óô^‹±šNq£Ü›î¥§÷¿½éòÚµ¡5kÚ7lèÚ°¡g¬ï ýëÖ_’ÙпnCϺë6ž_»‰Ò¹vcOúê¾5ëï¾™þµÝYf0ÐxÌÆ ²gšd¿ÖP£5xåª÷ÓShÔ^£® Ð¤?È‘EÅgo¢Ÿgôƒ`ÿ`¾ÐúA?è'üü„=‘>,YúA\¥þ“JuZå×êš$M¤u«¢j(QêZŠF]£Q» ÚJ³±Ìa+^œzuÉâÞ5k.§¯êL³ý­UÇÊîÁлreŸÌªÞ•o]XùV(}õyºè[‘~1}ÕíÄÄ.½¡H§+ÕiÝz-Ý0ÝvJãViªîå¥gÑiü"wZ-|$°û8òfjÚûèçý Ø?˜/ôƒ~Ðú ??aO¤6ë[*)`·^w’°Eï•Ô ¢Ê+ª«äªòª$E-yÕ’[KŒº2£þ̸±u©©ý‹—ô.£gÑ¢¶eËB¿'–-ëV ‹ÐÒåç—.o§uÉòв½‹—ö/Zvcäh:¸©¤Q¬DJòªTn•ªB¥.e*D•›ž…ÆX ÅÕI€ý¢¡Ó­@?ÏèÁþÁ|¡ôƒ~ÐOøù {"}HãÉ6•xܨ/‘¤j€2 >^tób•RÝ¢à¡H‚[ª8R¢‰*×k‹†S))דçt._~mþ‚ŽÔ”PjjÇï½xÊ…Ô”.ZSRC)i”…i¡…iÒ÷¿žvyAÊ £éŒ$ñÜBJ S. nQ¬Å2Q*áUgyZ•ã°¤’žBä¾ä¹c¢° å“Ïn Ÿgñƒ`ÿ`¾ÐúA?è'üü„==dm©6é³²ú/8¶àŒ(YÞL0%J-c üe,S ðÀÇÀ|ìtULŸÕµ`Á¥ÙÉ¡ùó;_›×>onÛÜ9­º ?έãy‘˜Ø=B¥ÀV³p à]‰ÏÓj²fÍzÜ]0ôóx?æ ó…~ÐúA?áç'ˆè`ò„|2ö«ø/hœåÅÃy€r–)W2ð%À î옸Æé3úçο’<»39©}vb[Ò¬ÖÄ™-´RèÏ‹ÄYí³“BɳC³“Î'&Ÿ•Ø‘”t!iNÿ”i]#GÕšÓt?§X¶ŒÎ¸´Ë‰L9Ô0Ìi¹û€€[ཊþH Ÿ%[Ǿpý<µó…ùB?èý Ÿðó Dô °+èøËÁ‡sRmË ï¨ûžv"a •¦‚Ž˜„”ÒÆbÈ)¶,nl{òœ›3¦uNŸÖF™6µuê”Ê”W›)ë‡qnPÌœÑA/>eJÛÔ©í3f\˜5³gƬ¾é3.Ÿ|ZùËíN*(&\aÝ´Ë TyÃò¬€Æ€†¹’!>‘¯ãHÀ_ 2Mæïßèçéü ˜/ÌúA?èý„ŸŸH rwõ ¼©æó5âç7ᥦW&4?‚¦AA/K¯9áåæÉ“ÎO›Ú3erOBBh̘VIUBä;w§h÷©àètËzð c®‡Q†`¥ûïÀËóŽ­bä!þ8Àv–Ï:|¤ ý<…ó…ùB?èý Ÿðó!DîPß®·hÅ£<|ÊB©À{â(Qz¥ä gCއ[~JÊxÁ'H^ å,_¥×{ãF7‹¯q\Ó„[&¾ÔúrB3]ÛðÒøs'¡qP$ŒoHßôbÍUhÂÄ®øøv‡= ÕT²¬¼O9±¤‚å<,çSŽ@'àšeçe@Še˜r`è<,ëgÀ—üGy Ù¾z]úy ?æ ó…~ÐúA?áç'BˆÜ`Ų:q'‘ïý™ö=Ïú€õÈïcKðÈ7È ’ãkTê /ÔÒ˜ 6‹Ûå¨9Ì?:8.þܸøÆ±cãF^ˆkz!®áa•|ò:zTÝ˜Ñø1cãšGŒh²Yý*‰¾nKûžTÖM[_é~Ÿ²C?~Õ¿ €ˆŸVA(¥,÷ÃîJžûôó~Ìæ ý ôƒ~ÂÏO„¹Àä‰xØ ð Õ,CP B93€GÁŒÜg [#?/O[J~úäË(ÕI‹©ÌåtZ7b˜Øÿ——®‡­}X­>Ì÷ä•^jh,­5›[§+…³„œ¥ƒ¯ò¼‹[žzïƒíÉ;$à 0pLyü¥äç04´•<_Á '8þ@脃èç)ü ˜/ÌúA?èý„ŸŸ!r€‘ó6¼ŕꤠ|ψó²m ÓÊ'Fýôì #Kn2Aò|=@•Œœ„ZåÍsŸ|®ÏšŒ§­Îé¬sÚjm¶—ƒ®k]ŽÚ_WŸËésÆxŸ´:}1v¿ÝVmòª$úZEÂT¨¤ù»j`ê}0£Ó-Õ*ÈwÁäî'?€Á/?ëCÈ|JˆWlúy ?æ ó…~ÐúA?áç'BˆÜÀjYÏÂ6Ç9(âÇÔR'’J£0?Sóhý\éo”Ϋ"PÉ’j•¿8C¥|ÅTo6,¦€Ùì·˜ýfKÅ\£TŸÙâyh5™Ýf“—Vš%£©šVƒÁÇ“*ŽxyâeÔ)Ds}Ýšh¸¿1¦L¡µšê•x8¶ŠãN¼'IëÜî^ô3X?æ ó…~ÐúA?áç'BˆÜÀb¾ŠhKqL0 Ê¢6 ·Z-]°àçI@ä’P‰uZMP«©Sðkµ5ð>ÆC‰ŠrßG]ÑZº= ˆ<æÖ=b?Aši”^¯VZŸ üðq¬[ŸÿC’´¡¢¼ý Ö‚ùÂ|¡ôƒ~ÐOøù‰þ ÿÿìûoWÅϽwfw'V›´?¢þø$ø¤¢‚BˆGy4P’PB“ª€¨ÒE`EE /)¸m 4Qx4N¬ul¯½Žëx×^{cÛ¡)âÏáû½³³^;±½cÿkçHGW³cïìÎÑêèÞ±Ó[|n}†­† L$¨Å”jP±iÆ I²á@&¸™ ò™°/^÷êu}k…Ao$­ª¶OÚ¹LOäPˆ-rm2ŸæÜÐÅ/ÍÀ{RîƒpÔß`¿\³9W.—È')Šùb¾È‡|ȇ|ÚOJ”ÞpðÑ4 `ÄñGÁ[dÈ&PÁøÑzkz§IÉe£+]º²½^ºLæÏäï—4ÝÆq´ÈåÕß`³ùXŒYȽø={Í«OÊ}ŒÔÚ|ƾ \08'xçÒ(ù$åC1_ÌùùOûñI‰R\~?Àe§7jT|õͰAùÆ©ï?““k‡¬ðê·._—û¶}¿œ-Š/ýuT÷ŸÙr>#q†ô™{]eú!) ¦€[ò;’´Œ½üÞàø›=òIʇb¾˜/ò!ò!Ÿöã“¥·:td}Ä4%`u·<-&DãFí%Îñ)Ž íìˆs¯A•¼´·œwfrÃØR`'dlœñW“jî0Úø\ÿ…Íæã0îô. ÆÜ„• äa 0ÅÀ•ý Žf c¯6ð狃䓔Å|1_äC>äC>íÇ'%Joxì±gNZœ÷ ÔjRE‘•‹q£Ýv7OIxD“Q„¢4Õâá&ýõE“F¹Ž÷ý”÷}©q¾žŒ5>·éúš`\?Ë ê¾ÑÈ[$`Uà60¦õÖpô Ÿ­ùPÌóE>äC>äÓ~|R¢ô€ÇŸøž3',ºu\=`ÞÇÞIã­â¶Û"‹iSïÐc^ƒq?F*6éVÓOׯFüÛ'çë=X“y+îÙºZ·ù|&]=Ãïþ‚¿ŽÔëy ¬I¨à‚ÁÙ\žòIʇb¾˜/ò!ò!Ÿöã“¥·þÈO€gºöý+´ƒþ™q±oÅ¢êÄ1“­“¾VÞöÞŠJ÷ir½6Z˱¡–æcÔý%WÏpfØGNæPÎ…ËÎÌûäÈ;üøÅãO¼ÐÛ;K>IùPÌóE>äC>äÓ~|R¢ô€Ï<ý+g§Þqú§¯¤2ÎXÔ²á¢7ñdlÜmÇRìþrS6¨´~ojÆÛª³Vçc´‘×{||ùÜY‡Eƒy¿6`ð¶s€ŸøÉ—òùyòIʇb¾˜/ò!ò!Ÿöã“¥·œzéŸÙì1ƒ3ÀŸœÉï ËV-r'´€ Ì”.‡µ2ª*Ûizm”w™ رV%¿¬oiu>Ó•@GÝKgÌ„Ñ}³Pë×€ª”ãl8àðf˜í¶Á‹ÿÄ+Åâ2ù$åC1_ÌùùOûñI‰Ò[þzù.ðL.{¸ºþÎLE°wɬ×ôFãn:&•8µämÝ¢JM1Û~4ºŠ7`Öú •œ¯w€9¹µŒ)eÃ~ƒ?Â=ö©§^#Ÿð¡˜/æ‹|ȇ|ȧýø¤Dé-zóøJþ²#{Iÿ_)Yõ} u»T| Z·ÖìzUbC·®Jëó1jýj€ªÕ$h!6õú»èÇ™Žp* ®ÝÀIà;_þÚëä³3>óÅ|‘ùù´Ÿ4(Õ`×à§—Âà0’uw,¤&‘©&ÑÌ–Jt©ÝÊbΡêXuº«OT5X0Xò%xf®äÜUà,ð¼Í}ûùS#Ÿñ¡˜/æ‹|ȇ|ȧýø¤A©._üRu?Ëf.NáP‡>þ2矩™(­¨€òzm}WÍ;²E%™ æâԜπUÉù%ƒeèÕf»öÝvî ð*2/üÐñó¿#Ÿñ¡˜/æ‹|ȇ|ȧýø¤A©.çºËûœ \w¼ ÜÈfæ  FËâ9x³b£kk}¹®W`÷ú{›]d©e-Äݪ\“û£ @ëo€JW×Tü8ÝqàÄ“=qå5òÙŠùb¾È‡|ȇ|ÚO”ê ²™¯?~fonÚ?&rO÷ÀYÿP¹‚‘ƒJüÉ¿½Vý¸o•‹~:ï!·ÕbBµr͆æ­nƒÓ§aâ½qó~æ¢i”ƒðf6÷V®ã•LøõÏ}þô`a‰|v̇b¾˜/ò!ò!ŸöãÓöJ{øØ'O"8"u0Ì]Fœ¹kÍÿ`jpå5Ù˜¨D®ï|`p7*ÊÑ"tçÜÒ‘4f¿ì¥»ß¤ÁÃÎÁ.À.ÃHhï¸lŸ÷€óÀ±GùÆŽ_ ŸÝð¡èæ‹|ȇ|Èg/ˆßöðò«}žÉtœ…yf8tÿ>Ђ+ÓûU0P‹ Ö?ÀB´ªµ÷0m}ów± Ö7+:º… S²öïпþû­Ã‡¿ñFùì†Eÿ0_äC>äC>{Aü~O¤´ÑþGžÍvž^ïìœðK`êr¿Èµì-µÐäï(wãDÔ?]Þ £ÌÊj[Q÷×ï¨jìˆÓ /ß|ú³g®]¯Ï.ùPôóE>äC>äóÐG~¿' À>ýÔo€#Àk¹ÌM ä %ø¿±îA_®ªLä¤Õ5EgŠÎ<ìÑbÅaÕéÁªŸü½ºÌŠsUcòÖö/ØÿÝ£Çþ@>»çCÑ?ÌùùÏCùýžHÿÿÿìkpTåÆŸ÷röìÙ3¶ÓÔ/Î8Úé`?µ+­Ô:RE‡¡ÅÒ JVÐbNѱå"TÐΈ…‚¶TŠÊV¹”ÆB¹6Ù]rÙVÛ}ßwwC‚aä²9>3¿y'Ù¼{öÌožg2ÿ9{v9 _ø[3õŽÌürDn/ˆ”KTµ@£Ê5¡üüÄgãÕÉ¡¼YÍùW(THTJ{æ¹óƒàJ®qo€›pË-%ó篡ŸÏï‡0?ìýÐýÐO¬üÿ~p°ÜvÇ<`°Èëcz¯²Ñ9ž£VÚté€,s(w“e•#3(çÉš‰~•9m™íp¥‹ÅûµXL/**¹ÿþÒ7þ|©×¿è‡°_ìýÐý\ï•~®µŸÃÀ2}æ6¥&ö/Z,“بðo—ûLêÍŠlÎ+@¥”ks¨Ìµ2ýLu]ʕاÕV`%P*ÅÄ!C&?ùË•ôs¥üæ‡ý¢ú¡ú¹Þ+ÿ¿_²Oöý™ LJ¢Þ~Ï&©\ÙèêŠ Ò&^BòÔ‡0«<Q ÔŽ T TçÇZíny©P²ÎæäËþ{J®ž¦|iÀÄ‘?z~õêÝôsýæ‡ý¢ú¡ú ŸŸ°Â Ëâ%Gµ7^ÊiÀ‚Å ¢&Cûª<ÄN:—0ÈöÊà(l¼N8ê\òŽåÇzL 3”WkUëÉ*÷½F6j±\`¶Vã¿6¤dÊÏ—ÑÏ•õC˜ö‹~è‡~è'|~ €s :xÐÌ^6»|U¨ØkI¾L˜„ÙÁ×Á®Ò Á‘‚ëòdÕÚÌåf®òT¹ÀûJ¾ñV)YªõcŒþ½§V¬øý\q?„ùa¿è‡~è‡~Âç'”p8Ǫ?Vô+z@ª¦«¶DäÁ¨ªSˆ+¤|ÝbâQuØÑY€„+@]þàÞ±g&øC¯Ì÷wiµV¸‹_AÁ˜Ûnÿ錙Kéçjø!ÌûE?ôC?ô>?¡„@7J&-†ù±9ÑØ+¿A¸Å©”‡t‰¸5PÐåЕPµqˆF¸Ä‰¼á¸»¦ 8ÄöÁfà%wÿ˜›¿2zÔ˜™oþe ý\%?„ùa¿è‡~è‡~Âç'|p8Ÿ;îœd²b†à‚‚µ…ÑÀ7V¦€&‰F!ŽCUBWämÌJUã.ÒíóƒÝžÿ&ð,ðh¬ï軇OýÍ Ÿ÷æwú!ÌûE?ôC?ôóEó28œÏëëþÕÿ&ÓÇ!–ô+Ü|à>[*¥Ñ®’&ñºÞQxUÐuP P )TÞ e½­‘ÃÀÈ·!^f…“nÿÆ/fÌ^¶yÇ.ú¹ª~óC?ôC?ôC?áó28\€¹¥»ûÜ0Ít@‹åÞ-ÔG¢2.Ð` Põ6ú¯^tòBYD¢ ©î$ºÑs¦íž&G*·9žãÓ/d6Ô‘­÷o¯¥%_òÄè±Ï­|mý\?„ù¡ú¡ú¡Ÿðù .Ì÷Ġé©)î‹£WxTök/¤nWþ) n›4Ú;Nl=²H4æHjËIf´£]"-Ñ,pR ™£1G¼ š§Î¤íÏℵ€:%“¾×1§$Z&³!"4þécST¾æ©R!ÇÞ8è¡‘£f½°xý\3?„ù¡ú¡ú¡Ÿðù .ʈÏ÷ÝÐwnÌ[ ü!‚½}mÜÝmïÍ@²Ñ¢I÷6¸dWä9l¤+€Ì@ ÅÑ,²M8¯ ]uÒí4é?+ÐîöÇ…8îÈ|oÒäÞ‘t¿Ök‰`«Æ« ó üÇ}×ð ¥ —nß³‡~®¥ÂüÐýÐýÐOøü„=1lØÑ_K,þ¤Å{ZvßÝà’×êG?Îä8´™!Z š R Gƒ#îHØ v[ÏœÊ"ÚìÑd“ÅÖä¾MâŒDG¦?ö3zU}̯¢{•Þ$¤Iÿ,Oü¤¸xÜw¾ûäÜùË7ﺊ³/ýæ‡~è‡~è‡~¾h~z;>›Ü÷;qÀT-EÔ:íÀ^…cQ?ík“ÂÓÀG9:® ¢5Ü„»YÞ½gÎwQníNÛÅi…JY2ϲ­èøXâ¿æ…4Ú•0éú;!×/šó„xð¦#ïºçñY¿ZüÎÎôs}ýæ‡~è‡~è‡~Âç§WÃà’5jYqñ`"ðlÌ[Û/Ø£qÀCML5 {eÊ„þãOÕÀͯ²Õ^,3Ùµ!NdÉŒ³íE àºa`žÞd#ÚrøH¡C¡ÍGcÌ;‘[•À3ÀdˆQ¿üûïÿô‚EoïØJ?ùà‡ô óC?ôC?ôC?½ÑOï…À¥2{Î;7~ Ì*ô_—Xlë«+ûqTiˆˆ³üÇ"ºr²Ã¢N;ÒPÍP'Í.߆´£Ý‘ÎáþdöK÷D™¡]ˆ´FkD$5ª£º,Ð[€ßOŠn,rëøž²àÅEô“W~HÏ0?ôC?ôC?ôÓýôR8\ëÿš¼s¨}Kœ/çùXÁêBe·M«Z!O Ù,d«í§]Lþ—Etò‰ëƒí€p¹·ûm¦ÍSN 37‹û³}Ä6ÁíiÏÍtÌ<¢’Jˆ¨j_—)±#ˆ¼åëÀ à‘‚~ý›“zdvéÂÅÛöl£Ÿ|óCz†ù¡ú¡ú¡ŸÞè§7òÿÿìÝ{L•uÇñÏïò\ÎAœ-µ©[›·f˦+ÌK–æ4[MÔEÌ@B4R!Tм–7PñnMKeNËÊ93§é\µrV®•³ dy×êyNµõW[œçŒÏöÚ³ãAÎxÞû>|wÎÙÃà?—R£b!·•Y”)¬öjó´/ꌟ…¾ó³¤?˜úpî‡Õ®¸ÄÍÐ?/ýù™t?*ç¾™…¿>ÐvEãšÀåÐ3 õR6˜ªÁ4.‡~å’!ë}öy¿ÿŒmSr°NˆåÀl`ªåKk×~\ßþ`~ùšo±—ûпãü°û°û°O$ö‰,\nÇúš¯Ú%> ŒŠµœÕ3X¹Ó´˜Ö!CÕú´’g€¯µøIã%®jyK«ß´ú]À¹®)\VøU»Ç«×®kÜP¸aà¦ó@ÿõÓŸµh0e½C¢^á‚)¿´S†q@¨Àb`%ôÄÖñ©]ïyö‰Q³çÌ[õÆÛÇ}èâü°û°û°O$ö‰ \nßÔɵÀ ø˜i†1×Y……î•çÉJ¾ï·N§€³ÀwÒ½•ÝEwÜå [Ý2pÅÀ%Ë=^³Bsoá¦á^îçç4.¸è“ ¶þɯ/øo£Ô9ΫíÖ‡¾ç^( •îݱKêÀÁÓ9K׬ßö ìCˆóÃ>ìÃ>ìÃ>‘Ø'"pø¿QÕ*:"(u¡ó%ZÖÆÇLl}<®Õ'Ñö†{íÏCÜ{g˜8o¹.XøÞÂ!õÎÑtŸqž?g‰/5>NG€w4ê4¶J÷{î΋•N‹ŽMNl7òÁSÇO*Y¸tËîºÃÞ}¨)p~؇}؇}¼‰}"€ÆÈ~#.!x̶3ãâæ*Y ¼Tkm { uÐ6ù¬£Q¾ã†8bàXÈq‡œt޶:a룖þÀÔ”Ü-Ä`°ÒÀBí¾Z@ Åï²s—”ƒ³ÆŒ›µ¨bó®Ý‡Ã~îìCMóÃ>ìÃ>ìãM졸4¦ÅKßë}¾sÉ­c µœ-0Ob‰a¼åßàóÕ Qã ´’›•ت±]‰í;”Ø:nWî¸Wýå^ðç%4Ë]yÝ[ñ¹£mJ·niC‡dçæ-Y¿aOØO–}¨™q~؇}؇}¼‰}"€&‘ÜyW‡œ6ñ9†žd:C,D¡a½Ì Kî›e²TˆÒ¿óMk>ŒBç?“€TXã͘‰1‰)Ý»O>lúŒüÊU«wÕí;ö³c /Îû°û°7±O¤àд^_y6#ã̓õ¼gNÇN¹­bÓ§¤û·”kúž¶£“cÆtè2ñ¾¦L.›2½º°hãÚšº½{?û¹°y ç‡}؇}ØÇ›ØÇã¸4«-[¿Zµ{A鯢âê‚™UÙÙåÀ¢iÓ;ró*æ­]PZ[¹|gí¦ƒuûN†ý¯eŠ,œöaöaob¯á@DDDDÔ‚p """"jA¸µ \ˆˆˆˆˆZ.DDDDD-""""¢„ @óYVuhr`åð‘ †zfBÌóqQ>•%¡e–Ò9†ÊQ:h¨ TYJ!²üv¾aäi‘+e®©fäYÎåÑíîç™ÛÂ~^ìC^Àùaöaöñ&ö‰ \Myå»}úä9so#§môËQ(ñ¡Ø‡¢X£èÎ6%ݺ¼ÒçÞeII¯öë_Ñoðò®4tÕÃCÖô¼6©ÿš¾IÕ=zVuíþzçN+âã+”Å/Yúe ¨0%ÖèÝkþ¼â#a?Sö¡æÇùaöaöñ&ö‰DÿÿìÝyP“wÀñ"h­G­¶¶* 7h”C@-VÁjëVEgÕ²ò5_–ìÚÁ£$¶–•a.—×a¾ åÆªë¯Üàá¨îȾZU¾hëýÙù“ýè¶£NìxØ«Qæè{„¾éƒV#6ð•ׯ£½ð?5ø@Ï'˜ððŸ—3ðé½Áð?µíoé}úÎ1C+¬ú}ÛÏ’˜ÑmV滜íÎÌ ¼þÑ|öú¯jv¯HJ¸Çcã&¾{··cµ«›°îníÂpû=Ürkš±R‹;ïâÎ;X§Ç7oâ3q-Û·°—-Í^ƘþN¦Ýè3l­­vš£Ý‹î“7G¬Z³:õ… €ôì‚ùððy9ŸÞ,²'…ã<¶#´ ¿Í7¨ûãªþ6‘S§0„²ÃBó×­ãœ<ÕTQe2ÜÖ†ou`½+TT÷t†ûÃmkWó­û͸•øRÖî+µ4:,U`¹7·Ÿ• _»ÚQ–³p wîÜRoïKC@Æg`ZE<o¿ùULLÅ ×èéó>à>à>½Ñ§· ÀŸiÖ¬æf¡-ëkü´kãè·S}|Šg}À [ÌÞ°¥üì¯kÚpKV5ßÉ5¢†F…ªM«ïÒiï7*ïªU÷Ô]U—F}GÓØÑØx«QÙ¢R5éµju»RÞ*—µ©äw´jܬ3®Î5|8¦uáÇùaKJ/®œâ—óæëq¯ZꃶôE_›£ÁÁ{_¸ ø@O+˜ðððé>½(XþX‘Ñ…«ZØÏâ ôýàþQ^¤ìùskC‚Ys>d~·St…‰¥j,ÓcAƒV¬UKur©V&VÈêÄJ‘X'“ßÑip£ü¾²á®\Ò)“´Ë$m2i“BÖ¬”7)z•Ò@¤ä zâÅFe›Z«„XÕ„Yl¼i/8$mþ¼¡sù“'å tʪÏ+ó­… üщSðyÉ} 'ó>à>à>½Ñ§× ÀhÙêóÈ,ÔÚf B›XG;ØÒCEKÂ>˜•±yCÑEJ§€%R\ÉÇÕíuÒv¡´I(Õ‹ˆ$M"I›HÜ!ªïªÿ¹Û¿ÔaL|ë7«ï¨v6ȰF‡k…86V±h1}F`Æ‚yÕ³Cj}½J¬ûF#´yèÀûY¬˜?ï,ø¼´>ГƒùððŸÞèÓƒ §¹{¯7·þÔfà·mµC›P4]8{¦dF`Á;¸”DÙÍb\ÉÃU•¸®Ž˜Ô.Wǯiþ¥V¾à_ÐÁtv×ñËíïŸA«DÜRU©äpÔUUw¹<œ”ܾf gŠÿå°ù²À€Úñ.,'»«¿Ø×ý­6Lr|^BèÉÁü€ø€ø€Ooôé¥ÁУ†Œ˜kÙÿc„>³éîìD›ûWiÀ;¥3‚سgÝX¹¢âÚU\”wŸW†ùU¸¢ü›ÝÆ.ÓóÊ žæç¸:×Àá6q8mƈ‹ßöàäru‚jCO]\,/.mÔâò*|æìÝ/¾¨úËtÖ‡ï‹gÕΘ^åjqäëG‘ñßÉ µó9ø¼T>ГƒùððŸÞèÓ{ƒàw¢fÔÚ œeÝi‹õý¬öz¸gUÏâ½7«tZ ýÓÏK Y˜ÇÅÅ…ŠòosØÊØš‚B9—×TRªì®±;uI‰¾¤¤©;âBÛÓJÕ¥,eUyKEykA‘.¯àëfæã”KxÑBÎ{!ì éœÉ¾¬÷g–û2F‹@hE:tÈðy| 'ó>à>à>½Ñ§· À“JJæ!@ì”66ßZ˜ðõ¾9mJ q†Î¯›˜9o!=‹¯20¯wß+*ºsMË`ªKo¶–ÜÔ_cŠóYrcEŠü"U~‘:¿P—_hè>µÆÛžUX¨Î»¦()Еë Šôy…Í×YwóX8·?‰C‚sü|³¦N›ÂòófLõaì·Ï­}mÐZ„‚’Säàó} ˜ððð1=€'emˆÐkË­}Ð>’[ÑdáâÐ.?¶¯ïÕÙsèÿ<©NËn¥f*rM¹¹-¹ÌfF®ž™§Í+Ðäæ)®^«g\oèNÎ`*‰ƒ‘«%¾Áx×LUc檯3´ÙYŠ+Y ÆÛ|]v®á £#›‰¯dãí;$ÓèÓ ÞZ¾’§ÏÌ•g3´4š,-]–Ë4ÃMM«¡¦ ®å*èYõ݉éYRz¦‚ž©¢Ó¯e=N‘sÅp9M•Nk¸Lo _iHËO]Fv 5ã.í2^¶¼ÌׇF<A|ÇQ¹“^nCChƒÕªAƒžÕgaàÁüÀó>à>àóÿæcÁðëyzmêk†ÐR+ËÝ^¤üÿúiþJR¿O•ÿ¤¼w3Î&ÜKº¤¥Ð„É´ª É‚´4yÆeErJm¥šJeÐÅ´ô:jš¸¦ÒÄTš”J•S©Jê¥FãIm0¾ÒèòôK:jŠ:5ÕøWr™ÙÒÔt!9¹†œ$KÏćéýýR'y2ü½¹SäÓ|S½D¾•í´¶Üaf¶hð¹àóœ} ˜ððð1=“ €_)8$|øˆM­8`¯‹c:Éå9®ÂÏG4ÙGàI*œ8¶ëGÝ™øö„$eâEaüy%¥Ž’"¦¤ˆº«{4‘ñKÉRJ²Œ’,§P”ÆÓx-íq²ä$1Š<9Yœœ" ¤V%¥ È”úÄä¦ IxÝ:±£Å׳Ì˽f‚K½ïx‰—G•ç¸"Kó=­´ì·ÈoÊFðyn>Ìø€ø€ø˜ž) ÀãmÝž4pÐ—ææ›Ø„;½äë}s"‰çîR6Þ£Ìχ3Î#sÚ´¬}û q§›Ï7&\Å“«È‰5äáù‘êÉdIw d²¼û”_ìa䆄x•±s dQB?!±œ|žK>_~.±&‘¢9—p{Ûv™'é²7醧{-ɹ~Òx¹×¸Zï ÜÃÈÄ3ŒÐr› 6n=>ÏÁ‚ùððÓó1±`x¤Óñ7† ]€ÐR3³Ý#߸àêÊôp+uu¹éîV6aâ O¯<'çó Fm9~BC&kΞ•ž9S[óHqüÿºv'ú¹SõÆþsÛ“Œ?"éŽøAa\lu\\yÜiNìiîéx~|¢âD¬a÷^CHPÑx×u¼>&ZÃü|XíÓKp,š,¦âX —èÄÉʸӒˆHùOíK–ð]œ²Hå.Nåîn<7×2'Çw7–«SÎða'ÌÌ6"4×Õm-øà>àcz>&Ù¿ÿÿìùSgÇŸ~»{ºæža.ä2JMŒ7ˆÉšÐhi‚÷DA#j4 ˆ¢&[»›Íæ2FEnæ€án‘Ãà×&Ù­˜lmÕÖîÖþûv#›ÍÆdEÝvæ©úÔSïLAÏû~êùþðTÓ ÷y=ã#€õjñX¨øëèwdlkDd§Åî·ÙG#£îÄÄÜŽŽžÙøììúƒ‡¾+)ùîtÉ×E…£§‹nü²ôNiñí’SwÄí n–”Œ•”\Ÿ`LbüÍÿ^¯Ÿ.).=u~Ðé_½Wô‡÷h=q÷Ýâ;%'o•œüCqñ_²s¾›îŠŽi‹ŒmŸæ uG'ôM‰ìŸâЉu˜}å§ æP¨°ù…9¹èç‰ûA°0_èý ôx~&D0é:mžNYM5Q1M‘±mÑ=6‡ßb´Z¯„‡L‰èˆðÎy¡-7÷^aÁ7¥Å<’7|òØÕÓ'o/¼y¼ðÖƒ¸yŸc7Ž»&3*×Oáñk…E#ú‹EGo½C9Qp«èè­SEwé§ŸüîpÁŸ²vÞK˜Ñ05ºiÊ´¶ˆ˜FË#ªÓlírD =•p'2¼?ÂÚ—2°Cäåßâ¢äqÀþA?èý ôóÿè'PÁ@"ié €×yþ8áíÖðV‹£ÕÞe ï±Úüv‰Þp»oj„÷¹Y;2¿9xàÞ;‡îÞ=ZpµèøØ‘¼ùù7–?äçøÇÜÎË¿}ÿ:‡¯å¹šø Z oî;x=÷í/óÿ-;çoÓ¢=v{C„ÃgµwYí=ôÒÍKû·uµù;Í/E?OЂýƒùB?èý ŸÀóÀà a4¿)?#rÜhp‡GЩ·ÓÞn¶w[lÝ6«„ÝÚi·µDØ =‚Ù싉ìÕkγp`]VVúy"~ìÌúA?èýžŸÀ€eqñ;²Qé L¦fµ¶YgjÑ…5ém£Ág4´™ -&£×l¬Ó©Ï.˜Û•“ý§Ìí×3·eeõoÛÖ¹c 3sp2 O†+™o^• ‹ÌÁíYþíY½”m;ýÛ²6l¹¼5óöŽNˆ÷õz“nUÞs‡¼ÿ½©‰b4¶PÂŒÍVS-Àa¥õ&úy"~ìÌúA?èýžŸÀ&Ø€óec¼°J¡Ì„b³¥V¥ò„ªšU:¯J_¯Ö6Q´šf­¦I§ñê´n“¾ŽNñ1ÎÌí÷22FÞÜ>ºi“ãÆž­[¶nœ[†&ÃÈæ-_HlÙ¼upó¶þÍÛú6m§ôoÚ6˜±axã–»od|iµWêt4.£¾YÞ3M²W­«WëÜRÕzé)T!n½¦ È =‘åeo¢ŸÇôƒ`ÿ`¾ÐúA?è'ðü<Á>¼¶ò=…° ;4äWJåyU¨W­ñ‰ªzQíT†ÖSBC(ªzUˆS§®1ê+m–²i×^[1´qãhƺþŒ7zÖ¯»49Ö^ž Ck×K¬Z»þÒÚõþŒ }2t1¼&ãJƺÛIIZÝ9¦B£vjÕtÃtÛõJ•S©ª½O¨›žE£ò ÜùÅû ö GÞHK/A?éÁþÁ|¡ôƒ~ÐOàù x‚}°˜×+Å,€ýZÍžãx·Ò*(ÝBH­T•n¥è¡„ˆîÑ) åzM¥^{aÆôÆ´´‘¯ ­~}pùòîU«üÿK.­ZuY†.ü+W÷­\ÝCëk«ý«Ö ­X9²|ÕØ´X:¸ŸSŠå‚P- .¥èV*Jeµ2¤R¨”Nzc)S)Ï™Íôó˜~ìÌúA?èýžŸ€'Ø€tžìV ¥zm¹(ÖTñð‚“jåê.ЍpŠŠZŽ”«B«´ê2½îljꔥý«W__öroZª?-­÷½xꥴÔZSÓü©é½”WÓý¯¦_J_1òJúèË©czÃQ<Çs© L• p B­ T b9¯¼ÈÓ*‡%5ô÷Ï{R÷Ñúy?öæ ý ôƒ~ÏOÀÔ@öÎ:ƒ6 G¯ý”cÏ\Äf–÷S L¹\+¨š ’e*>ø˜ìŽê‹^~ù‹%)þeËúñRÏK/v¿¸´‹Bôå²_ô>)’’:^z©ÿÕW/¿òÊ@JJ碤öEIÉKú–¯¼õüÜž0sÃ~ð)!i÷T¨"PÉ0e ùس@«tz„[ÇÂY€"Ÿ¯Ve/^üswÁÐÏÏûA0_˜/ôƒ~Ðú øD£¹ß¶`áȋˮ¦,éOIîY’Ô¼¸+iQ'­úòI‘´¸gI²?e‰Ir_Rrßâ¤ÞääKÉKGæÎ˜Ó¢:O÷p–e+éŒK»œHT1L9Ü—º"œ ÞM  à— X²kúSGÑÏ#ûA0_˜/ôƒ~Ðú €~Á‚ùÂ|¡ôƒ~ÐOàù ‚w(,èQ ;ÕB1²P¡àÝ q”˽Rþ²!ÅÃ)=%•¼Â£Ý@ªX¾V«uÇÇúf$´<=Ã7ëéÎÙÏt=›ØA×3§·>3³ýÁ$¶MŠÄ™­‰3}O'Ò\ùgÍHHè±Y›Ôª–•ö)%–T³œ‹å<òè\O3 ï¼H™S =‚‹e½,ãRðå þ}€|†ìÙ°¹ý<‚ó…ùB?èý ŸÀó$ï°fÕ'a/‘îýšö=Ïz€uI+ÆVüdÀ%Ý ƒޝW†4óŠ:ÓÔbr:l5Ó"½ ±Í3Úg$´Mk‹iz*Þ÷T|ëƒ*¥ùáklLc\lSB\ÛôøŽèhŸÅìUŠôsϱ´ïI a´õåî÷È;¤ðrà%P÷£8xiU(ªñ–;ɰûR^ü úy?æ ó…~ÐúA?ç'HÞ`ÎìÃ<ì(øu,CPŠ* ~".0RŸ1l½ô¼$D €#"ý<‚ó…ùB?èý ŸÀó$ï`6maa7RÎqŒ‹c i”FI¹Q˜ï©ÿ´‡¾¯ô¹ój Ô°¤NÁJ_œ¡”¿ŽÎdh1›L†&£Ñk2z¦z“±^®£ÉõÀj0:7­4KzC­:‡'µqóÄÍ2.:©Sˆ4æz¸7šð1ÐzcL¥Bk§h‘àâØZŽ; P/Š›Î!ô3Y?æ ó…~ÐúA?ç'Hø'ÿÿìßoWÅϽw~¬ªMÒŠGÔ‡ÀHðʨ „!Ä‚h $¡„&¨€¨ÒPEÈŠ ¤¶)´‰i㬽¿¼þ¹Žwíµ7¶q¥ß{gg³vb{ÇyÀÚ9ÒÑÕxvwöÎGçÈ:ºwìô€#‡›0xG,å©‚V%·BÙ(`­6.¾Î‡~>ä{ÂÜ@a ?ç4105¶»úûGE}}#Mõf==.Óä#i[ss;̧ 0-p^vÖ—Ül À?<3ØÇç§ðj&sü½›Kä“”Å|1_äC>äC>ÝÇ'%Jo8|è¹­(i5 `=”O$X/Š)­AŦ)HB?x— ü±ÀqŽ5²»|o8’­ªzLÚ¹LOdPŒ-rí0ŸöŒÚÅ/›÷¥Ü{þ”»Áq¹f{®_«OR>óÅ|‘ùùtŸ”(½àÐã?h @ÖäV⢳HA'PQ¹Q;k:§¤‹ä²ÑŠ•]ºÒÃNv™ÌÉ>(iº­ãh‘Ë)ª¿ ÀNóјÑ{q+zú–Ó˜”{Ï›J”êl ß.)\¼}uŠ|’ò¡˜/æ‹|ȇ|ȧûø¤D).‡¾àš±7jJ|ë›’‹A¹Æ©ï?““E­ ZçœÆµÉ6%Ç®m?(£Ë¢Öî:VžÙu>“q ö™=b¥Æ!)ò€iy$-Ð×?¸œ|ãJ‘|’ò¡˜/æ‹|ȇ|ȧûø¤Dé-‡Û1M˜CÓÇ¥ŽÇ²ÆœHaVY{‰ó&]ŠJ‘¡ž4¦è”·’õ´Q³FÍo=]ñôœŒ­3îÊ3RÍ]¦Zßë¾¢¸Ó| f½‹¢RÐ’,tªì™ª»Á)Oå}£€?_ΓOR>óÅ|‘ùùtŸ”(½àÈ‘g Nk\tÈ{ÖjRE‘•Ëq£Ýs7/HxD óQ„¢´ÕâR›Êîú¢ùm£\Çù~Áù¾Ò:ßÌfZßÛvý‡ÍÇ`Ö~—ÊÛÿ|!£’HÀêÀm`ÆnÔ»€ã ùì·b¾˜/ò!ò!Ÿîã“¥·<ñä÷Œ:¥1d÷À5Pá|ìœ4ÛÙ(n»-ÒXTÍ=ã$1˜uc¤r›¦Û^½?¶Âà>>×:ßìÁ6™Óq϶«u;ÏgÞ43\tî/ºëH½^ª6 Í\R8ŸÉœ5xÛØ?}%•qI£úëÎÄó±q÷+±û«mئÊÖq¶­ï©VÌ:²¼Ùãã+È÷.¬+¬º%°œÂ[ÆH~ñѧ^ÌfWÉ')Šùb¾È‡|ȇ|ºOJ”ÞpæÅ›axBáð'£²½~U[‹Üñµ µ`—Ã:­j{iñþ(ŸRsÐ3JÞl?Òé|5jží^:¥æ”ÝØ· kýP—rú9ƒ7üpH{?ýä§^.—7É')Šùb¾È‡|ȇ|ºOJ”Þð×k÷€g2áà²oÆû‚š4`ç’e§ÅíÆÝqL*qjÅÙºCUÚb¶÷¨ì*Þ²‡eí2 ¬ä|¸¬È­ªúã „9}â3Ÿý5ùìƒÅ|1_äC>äC>ÝÇ'%Jo°7¯úþ¯z«öÿթж¾o i—š‹A‡ãîZÞªZlèÎUë|>ÊZ¿î¡®ml!VÍú»îÆ¥Á÷nCÀià»_ùúkä³?>óÅ|‘ùùtŸ4(Õ ð𳾞«¾7 L†æŽÆšÔD%Rõ$ZÚU‰.õ¨ÒX1høv¬»«OTWXSØp%x©?S1æpx^g¾óü™wÈg|(æ‹ù"ò!òé>>iPª À—¾|E›Ÿ‡ÁeÏH#,ôØÇ_VÜ“" Å 5Pݪ`?ÕpŽìPI&ƒ•8 ã2 ­äü†Â&ìÕ–{osxÁ ‡>ròâïgÈg|(æ‹ù"ò!òé>>iPª À…¡jïÀÏ ùÞ»Àh¬À.mŠçàÌŠí®ml÷å–\ˆÝ›ŸmWt‘޵u§2mî&[£Ô<ï/ÀÙžSO}üÔõ¿7Èg|(æ‹ù"ò!òé>>iPª €H_~ üÆG=³èùݧÝCåzJjñC$ÿt6ú—×ã­rÑ««î Ѹ§Öª“k¶´ªí68û4L¼7nÕÍ\´h¼ªçO„™73=/þ7¾ðųùâùì›Å|1_äC>äC>Ýǧë•öð‰OŸ†wLê Ÿ¹LuO«ÿB5`ª÷¥— ¢yø@áC…{QQ޹`wÎmIcvË^v÷›4xèè5èM( íÖ”y¸œxü±oþèä%òy>ýÃ|‘ùùñ÷{"¥½¼ôʼg‚žóPoA•|óoàC[p%bz· æqÄúÄX‹Vµ^V¢­oî.Ö¬õÕ];š5/¨hý7Ø¿þûí£GO¾þúù< Šþa¾È‡|ȇ|‚øû=‘Ò^Dý=ö^ëë›sK`Öån‘kÓYj­ÍßQîň6¨µ^Ý<£ÌJÛ ´&v׺¿yGu¥'Ýð÷ð­§?îÖH|‘Eÿ0_äC>äC>ÿ÷‘¿ßéÿÿìkpTåÆŸ÷röìn‹Ûéê—Î8:Ó±:c+Ö´RëH•ÂŒ 5–hEa ZÒ©:´Ü«hgÄ‚P[FŠÊEH+—”"!„„\›l–\6‚µýÚ÷}w7$Ã%›ã3ó›w²›³gÏüæyfç?gÏYß¹wð80/z(S0Cpu†*؇‘JRÅyRÏôz¦¿W‰Ã ÊþQá¾*8¬Ô^!6J¹˜6(wÂ…‹éçÚýæ‡ý¢ú¡úé÷•ŸïW€‚—~o¦Þ±€‚_ É9¡J‰ ¨uÔ¸&T^˜øt¼z¨ÈšÕ•B•Dµ´Gž9~q0ù§’ëÜà&ßqGÑÂ…ëèçÚýæ‡ý¢ú¡úÉ‚•ŸïWËwÏfK<±1ª÷)ꥭA¯ÈC®•n²¬q¤å,YSѯ1‡-Ó®¶c±ø8¤6«€YyyE?\ú—¿^éù/ú!ìûE?ôC?ý½ÒÏÍö`8XfÍþP©)Có–+%6+v¹O Ñ¬Hwà‚T»A¹>ÓêìX«SÑOU×5¡R‰ýZmV¥RL5jú3¿^M?×Ëa~Ø/ú¡ú¡Ÿþ^ùù~pH“Ÿ?Ý÷gK,2) {<›¤Je£_4äå$M¼„8*dÔ'0«< qh4Ô ÔÏŽõ¸»ä¥JÉO˜ƒ?$Pñ?Rrð2Pü•aSÆþäåµkwÓÏuôC˜ö‹~è‡~è'x~‚ €4K—Ó^¡”3EÃóËsÂ&Cj<ÄNFt.aGl”)À1Øxt4¸äÕeÇZ'…ÊkUïÉ÷»ÿ‡6k±J`®V…ßUTüË•ôs}ýæ‡ý¢ú¡ú žŸ Âà<÷ÜS<ê‡æ¯[€]¾ªŠ¨&ØsI;Œ›„ÙÁ×Á®Ò É‘‚²dÕÚÌåf®ñT¥ÀÇJ~òÖ(YªõSÆM,øÁ³¯½öwú¹î~óÃ~ÑýÐýÏO ápž5®’÷ˆT?LÖ l ɃaÕ SHøºÝÄ ¢ꈣ§qW€†ìÁ}cÏLð!ïïïÒj½p'¿"9î¼ëçÏÍ^N?7Âa~Ø/ú¡ú¡Ÿàù $úP4u0ÚÎ G_ø›„»-nT%<´› KÄ„¬…ª‚®„®†ª‡ŒA4 Ä$Nf 'ÜÕ0‡€ƒ‘èþHd+°Â]ã?áö¯7aö;ÛF?7Èa~Ø/ú¡ú¡Ÿàù .äîoO5Y1CpNÎúÜpPîÆÊÐ*Ñ,Ä ¨j説-€9B©jÝIºý~d·ç¿,žŒÁŒß½r­¿Óa~Ø/ú¡ú¡Ÿ/›Ÿ€ÁàBÞÚðï¡·™< ±lHî`¯»·TB£K!!Mâu-¼cðj  š âR4©¬AÊF?Ü BG€=ïA¼̉äN½ë[¿znîÊ­;wÑÏ õC˜ú¡ú¡ú žŸ€Áà"””îtËLÓ-Vyø W ˘@“-€ˆC5Úè¼FxMÐqÈ‹eñ^$úïÃå3m·iu$2Ç2|þÌ‘P­Ö€w×RÈ¢¯š6~â‹«ßÜD?7Áa~è‡~è‡~è'x~‚€‹óÃ1 !ÆzªØýpôÚ¯\¥ö¢Iê.åŸb¶ ‘f{ʼn­G‰æ -ÚrJ£M£]#éè’HJ´ œhÉМ!Ö‹ž'Í–gÎ $íßâ¤õ)€%[|¯3dIt­fƒhÒø—-aù¦§J…œxëˆÇÆŽ›óÊÒ5ôsÓüæ‡~è‡~è‡~‚ç'0p¸$cƼÑr‡¶g¾J~1bÄ“<8ãùW”íÛK?7ßa~è‡~è‡~è'x~€/àÞï–“…+±x[‹´<â~»É%¯Ãÿ8›á4Ðiž„h‡h…H@ÆMŽ˜#n7°›]žÓiD§Ý›lµØÝšÜwJœ•èNõÇÞ£W5FýªHxŸÒ[„4éŸã‰'òó'}ïûÏ”,\µu× œ}é‡0?ôC?ôC?ôóeó3ÐáðÅüè¡?Lfh±$¤6hìö)Ô…ý¤¯M ÏŸfèv¸&ˆŽLpãîby÷9KÌE¹£/—¦*aI½Ê¶¢[â3‰ÿ™7Ò芨¸IØ/ƒ\,6Ç ñèmÃÇÞ÷ÀÓs~³ôý²ôÓ¿~óC?ôC?ôC?Áó3 ápEŒ·2?¿˜,ˆzë‡Döh”{¨ªVaÏL™Ðö¹¸ùUvØ“e&»6Äñ4©q¶g¢½d\7ìÌË[í~Dg¦Ÿ*t+túhŽzÇBr;°x˜1nøW|ÿƒ…Ï/ZòÞÎíô“ ~Èåa~è‡~è‡~èg ú¸p¸RæÎ{ÿö‘Ó€‰Àœ\ÿ-‰À‡ƒuuÄÞŽ* Ñ q΂ÿXDoÎAv[ÔGª ꔣÍåÛtt9’Ü¿ÌöÒ½P¦è"©Ñ-ÇÃúPDoþ< LλµhÔ7 ùiñ¢ÅKè'«üËÃüÐýÐýÐÏ@ô3@ù?ÿÿìÝYlTUÇñßYî23]h¥ÁhŸ„ȃ+ѸDŨT`Y" ---Ä -kcÃ.ˆ,¥´,RHÑÒ¦S„$Bˆ! „ ©Â”²Ô{.ÅøDÂRf&óK>¹™ÞN'oÎyøgîär¸ U›N=÷¬¹$ΑÅ>µ±&Iy‹¯^«£BžòŒBœ…ˆø›ÁÛ —[‰ÿ4ûûÁìá¯{ó|³¦½?‰onçÍcsÆìÿ9g[_ÍÛcÞuJ©¶:âèï•Ø°7;z 0èJÍz²[Î;ý?šúÉüúõìk}èÖ¸~؇}؇}Ø'ûÄ#·m@¸L!ì  Ù.JVµÚ>òˆÿý˜SÞ üaëà*ÌÅj—ÌqÍÿñâȤ¹TÎ|˜…Ö Ú.i\höÏ4 D¤l²U“m5ûrÑ’‘€{&<æºû”Ü ¬b0 åwxx@·³sÇÍ_QùûÄrº5®öaöaö‰Ç>ñ…À(/û¥CÆp OªãžcÏ!«mw»íì²ô^­+y øU‹s*qYËëZý­Õ?Þ¸¢Ð¬ð—6ÇËW®j´(´X¸æ=Э¿=¯E“-#‰ˆB£-O¸Ö!ËÚ.T%0˜ŒzH»ôwþfŸI“§/ßôuCÔã°Ý%®öaöaö‰Ç>q„Àõ~Ð3=%Ç²Š¼Q˜ev¼“ÕJ~t‡€ãÀoÒÜÊî‚Yî²ÅU×-\²pÑ1Ç+Ž¿î\³ÌÞ0×Ïi\°p! ›\}.¨ƒÖé:éÂ{µm@¹ÿ=÷Biå:¡¡Á”w;eìÑ+?{̼åµQÂ>tqý°û°û°O<ö‰ îÖ¯—„’‡B„È•ºPˆÀ\-+ÒS2ÚíOKþ1É=j™{hÿì3÷ΰqÆ1üîà¬/âmsÆ;Ò'4~{€o4ê46Hó=wïÅs•œ”š•Ñ¡÷ ÝG 6mÖ¼õ5ußE½ûP[àúaöaö‰Mì×8ÜÙy›ÒÚ‡W\wdZZ‘’S€…ÀJàK…­–jp­]go(°ß{,ìóí·ðƒï wtÕWïuôN[oW²Fˆ*`-°ÌÂ,m^-[  ¾õXf¸G¯Ñ}Lœ½`Ý–šÝQïìCmë‡}؇}Ø'6±Oœâp/Í™·ãégÆyÛÈj—R¨å$és-kI(¸&¨¢Ì[ÐJ®SbƒÆF%6jT)Qå7*³ÜWÁÜr¯¸±…&š‘×ÜŠ¯ïC†;wüòKycç–¯Ùõ7Ë>tŸqý°û°ûÄ&ö‰;ÚÄèÜêG:Žy }Œ¥s€‘Þ"¢Ðr¦EÀÈióa™,¢äæq†íÌ€Uè= „3ÈN’’îÒå½×^Í?náò/¶ÔÕïŽú»cŠ.®öaöaŸØÄ>ñ‚@ÛZºìøˆ›»÷œýD×É-HN ¼-u¿›ÂÿÓÏôw“²RÛ÷í˜9ä©çó{g•~¿ª°¸reY]míΨ¿ö¡XÃõÃ>ìÃ>ì›Ø'Æq¸¯ÖoØýÙâš™%•ÅSVMøpq^ÞüììÙ99s¼c¯œYR±pQuÅÚ†ºúƒQÿoÙ‡â ×û°û°OlbŸXÀˆˆˆˆ(p """"J ˆˆˆˆˆ""""¢Â€ˆˆˆˆ(p """"J ˆˆˆˆˆ""""¢Â€ˆˆˆˆ(ü ÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFÿÿÆ”›³#ÇIEND®B`‚golly-3.3-src/gui-ios/Golly/OpenViewController.h0000644000175000017500000000115113145740437016634 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import // This is the view controller for the Open tab. @interface OpenViewController : UIViewController { IBOutlet UITableView *optionTable; IBOutlet UIWebView *htmlView; } @end // if any files exist in the Documents folder (created by iTunes file sharing) // then move them into Documents/Rules/ if their names end with // .rule/tree/table, otherwise assume they are patterns // and move them into Documents/Saved/ void MoveSharedFiles(); golly-3.3-src/gui-ios/Golly/SettingsViewController.m0000644000175000017500000002141413171233731017535 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "utils.h" // for Beep #include "status.h" // for ClearMessage #include "prefs.h" // for SavePrefs, showgridlines, etc #include "layer.h" // for currlayer, etc #include "undo.h" // for currlayer->undoredo->... #include "view.h" // for ToggleCellColors #include "control.h" // for generating #import "SettingsViewController.h" @implementation SettingsViewController // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Settings"; self.tabBarItem.image = [UIImage imageNamed:@"settings.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release outlets modeButton = nil; percentageText = nil; memoryText = nil; percentageSlider = nil; memorySlider = nil; gridSwitch = nil; timingSwitch = nil; beepSwitch = nil; colorsSwitch = nil; iconsSwitch = nil; undoSwitch = nil; hashingSwitch = nil; } // ----------------------------------------------------------------------------- static bool oldcolors; // detect if user changed swapcolors static bool oldundo; // detect if user changed allowundo static bool oldhashinfo; // detect if user changed currlayer->showhashinfo static int oldhashmem; // detect if user changed maxhashmem - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // make sure various controls agree with current settings: [modeButton setTitle:[NSString stringWithCString:GetPasteMode() encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; percentageSlider.minimumValue = 1; percentageSlider.maximumValue = 100; percentageSlider.value = randomfill; [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; memorySlider.minimumValue = MIN_MEM_MB; memorySlider.maximumValue = MAX_MEM_MB; memorySlider.value = maxhashmem; [gridSwitch setOn:showgridlines animated:NO]; [timingSwitch setOn:showtiming animated:NO]; [beepSwitch setOn:allowbeep animated:NO]; [colorsSwitch setOn:swapcolors animated:NO]; [iconsSwitch setOn:showicons animated:NO]; [undoSwitch setOn:allowundo animated:NO]; [hashingSwitch setOn:currlayer->showhashinfo animated:NO]; oldcolors = swapcolors; oldundo = allowundo; oldhashmem = maxhashmem; oldhashinfo = currlayer->showhashinfo; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (swapcolors != oldcolors) ToggleCellColors(); if (allowundo != oldundo) { if (allowundo) { if (currlayer->algo->getGeneration() > currlayer->startgen) { // undo list is empty but user can Reset, so add a generating change // to undo list so user can Undo or Reset (and then Redo if they wish) currlayer->undoredo->AddGenChange(); } } else { currlayer->undoredo->ClearUndoRedo(); } } if (currlayer->showhashinfo != oldhashinfo) { // we only show hashing info while generating if (generating) lifealgo::setVerbose(currlayer->showhashinfo); } // need to call setMaxMemory if maxhashmem changed if (maxhashmem != oldhashmem) { for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); if (algoinfo[layer->algtype]->canhash) { layer->algo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting } } // this is a good place to save the current settings SavePrefs(); } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (IBAction)changePasteMode:(id)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"AND", @"COPY", @"OR", @"XOR", nil]; [sheet showFromRect:modeButton.frame inView:modeButton.superview animated:NO]; } // ----------------------------------------------------------------------------- - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // called when the user selects an option from UIActionSheet created in changePasteMode switch (buttonIndex) { case 0: [modeButton setTitle:@"AND" forState:UIControlStateNormal]; pmode = And; break; case 1: [modeButton setTitle:@"COPY" forState:UIControlStateNormal]; pmode = Copy; break; case 2: [modeButton setTitle:@"OR" forState:UIControlStateNormal]; pmode = Or; break; case 3: [modeButton setTitle:@"XOR" forState:UIControlStateNormal]; pmode = Xor; break; default: break; } } // ----------------------------------------------------------------------------- - (IBAction)changePercentage:(id)sender { randomfill = (int)percentageSlider.value; [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; } // ----------------------------------------------------------------------------- - (IBAction)changeMemory:(id)sender { maxhashmem = (int)memorySlider.value; [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; } // ----------------------------------------------------------------------------- - (IBAction)toggleGrid:(id)sender { showgridlines = !showgridlines; } // ----------------------------------------------------------------------------- - (IBAction)toggleTiming:(id)sender { showtiming = !showtiming; } // ----------------------------------------------------------------------------- - (IBAction)toggleBeep:(id)sender { allowbeep = !allowbeep; } // ----------------------------------------------------------------------------- - (IBAction)toggleColors:(id)sender { swapcolors = !swapcolors; } // ----------------------------------------------------------------------------- - (IBAction)toggleIcons:(id)sender { showicons = !showicons; } // ----------------------------------------------------------------------------- - (IBAction)toggleUndo:(id)sender { allowundo = !allowundo; } // ----------------------------------------------------------------------------- - (IBAction)toggleHashing:(id)sender { currlayer->showhashinfo = !currlayer->showhashinfo; } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidEndEditing:(UITextField *)tf { // called when editing has ended (ie. keyboard disappears) if (tf == percentageText) { if (tf.text.length > 0) { randomfill = (int)[tf.text integerValue]; if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; percentageSlider.value = randomfill; } else if (tf == memoryText) { if (tf.text.length > 0) { maxhashmem = (int)[tf.text integerValue]; if (maxhashmem < MIN_MEM_MB) maxhashmem = MIN_MEM_MB; if (maxhashmem > MAX_MEM_MB) maxhashmem = MAX_MEM_MB; } [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; memorySlider.value = maxhashmem; } } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } // ----------------------------------------------------------------------------- @end golly-3.3-src/gui-ios/Golly/triangle-right.png0000644000175000017500000000027112146034627016310 00000000000000‰PNG  IHDRHûg!tEXtSoftwareGraphicConverter (Intel)w‡úSIDATxœbøO%À¡Nœ8AƒÀ€ãP ¢Ä8,‘gNƒH5Ž€AÄG”A@5ƒð›E_Q!Œ¨kTHGTHÙTÈkTËý”ÿÿŸ§+\]^KËIEND®B`‚golly-3.3-src/gui-ios/Golly/HelpViewController.xib0000644000175000017500000000610612651666400017161 00000000000000 golly-3.3-src/gui-ios/Golly/SettingsViewController.h0000644000175000017500000000210013145740437017526 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import // This is the view controller for the Settings tab. @interface SettingsViewController : UIViewController { IBOutlet UIButton *modeButton; IBOutlet UITextField *percentageText; IBOutlet UITextField *memoryText; IBOutlet UISlider *percentageSlider; IBOutlet UISlider *memorySlider; IBOutlet UISwitch *gridSwitch; IBOutlet UISwitch *timingSwitch; IBOutlet UISwitch *beepSwitch; IBOutlet UISwitch *colorsSwitch; IBOutlet UISwitch *iconsSwitch; IBOutlet UISwitch *undoSwitch; IBOutlet UISwitch *hashingSwitch; } - (IBAction)changePasteMode:(id)sender; - (IBAction)changePercentage:(id)sender; - (IBAction)changeMemory:(id)sender; - (IBAction)toggleGrid:(id)sender; - (IBAction)toggleTiming:(id)sender; - (IBAction)toggleBeep:(id)sender; - (IBAction)toggleColors:(id)sender; - (IBAction)toggleIcons:(id)sender; - (IBAction)toggleUndo:(id)sender; - (IBAction)toggleHashing:(id)sender; @end golly-3.3-src/gui-ios/Golly/en.lproj/0000755000175000017500000000000013543257427014500 500000000000000golly-3.3-src/gui-ios/Golly/en.lproj/InfoPlist.strings0000644000175000017500000000005512026730263017727 00000000000000/* Localized versions of Info.plist keys */ golly-3.3-src/gui-ios/Golly/InfoViewController.m0000644000175000017500000001605013171233731016630 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include "readpattern.h" // for readcomments #include "layer.h" // for currlayer, etc #include "prefs.h" // for userdir #import "GollyAppDelegate.h" // for CurrentViewController #import "SaveViewController.h" // for SaveTextFile #import "InfoViewController.h" @implementation InfoViewController // ----------------------------------------------------------------------------- static std::string textfile = ""; // set in ShowTextFile static bool textchanged = false; // true if user changed text // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Info"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)scaleText:(UIPinchGestureRecognizer *)pinchGesture { // very slow for large files; better to use A- and A+ buttons to dec/inc font size??? UIGestureRecognizerState state = pinchGesture.state; if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) { CGFloat ptsize = fileView.font.pointSize * pinchGesture.scale; if (ptsize < 5.0) ptsize = 5.0; if (ptsize > 50.0) ptsize = 50.0; fileView.font = [UIFont fontWithName:fileView.font.fontName size:ptsize]; } else if (state == UIGestureRecognizerStateEnded) { // do nothing } } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // pinch gestures will change text size UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleText:)]; pinchGesture.delegate = self; [fileView addGestureRecognizer:pinchGesture]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets fileView = nil; saveButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; textchanged = false; if (textfile.find(userdir + "Documents/") == 0) { // allow user to edit this file fileView.editable = YES; // show Save button saveButton.style = UIBarButtonItemStylePlain; saveButton.enabled = YES; saveButton.title = @"Save"; } else { // textfile is empty (ie. not in ShowTextFile) or file is read-only fileView.editable = NO; // hide Save button saveButton.style = UIBarButtonItemStylePlain; saveButton.enabled = NO; saveButton.title = nil; } // best to use a fixed-width font // fileView.font = [UIFont fontWithName:@"CourierNewPSMT" size:14]; // bold is a bit nicer fileView.font = [UIFont fontWithName:@"CourierNewPS-BoldMT" size:14]; if (!textfile.empty()) { // display contents of textfile NSError *err = nil; NSString *filePath = [NSString stringWithCString:textfile.c_str() encoding:NSUTF8StringEncoding]; NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&err]; if (fileContents == nil) { fileView.text = [NSString stringWithFormat:@"Error reading text file:\n%@", err]; fileView.textColor = [UIColor redColor]; } else { fileView.text = fileContents; } } else if (currlayer->currfile.empty()) { // should never happen fileView.text = @"There is no current pattern file!"; fileView.textColor = [UIColor redColor]; } else { // display comments in current pattern file char *commptr = NULL; // readcomments will allocate commptr const char *err = readcomments(currlayer->currfile.c_str(), &commptr); if (err) { fileView.text = [NSString stringWithCString:err encoding:NSUTF8StringEncoding]; fileView.textColor = [UIColor redColor]; } else if (commptr[0] == 0) { fileView.text = @"No comments found."; } else { fileView.text = [NSString stringWithCString:commptr encoding:NSUTF8StringEncoding]; } if (commptr) free(commptr); } } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; textfile.clear(); // viewWillAppear will display comments in currlayer->currfile } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { if (textchanged && YesNo("Do you want to save your changes?")) { [self doSave:sender]; return; } [self dismissViewControllerAnimated:YES completion:nil]; } // ----------------------------------------------------------------------------- static std::string contents; - (IBAction)doSave:(id)sender { contents = [fileView.text cStringUsingEncoding:NSUTF8StringEncoding]; SaveTextFile(textfile.c_str(), contents.c_str(), self); } // ----------------------------------------------------------------------------- - (void)saveSucceded:(const char*)savedpath { textfile = savedpath; textchanged = false; } // ----------------------------------------------------------------------------- // UITextViewDelegate method: - (void)textViewDidChange:(UITextView *)textView { textchanged = true; } @end // ============================================================================= void ShowTextFile(const char* filepath, UIViewController* currentView) { // check if path ends with .gz or .zip if (EndsWith(filepath,".gz") || EndsWith(filepath,".zip")) { Warning("Editing a compressed file is not supported."); return; } textfile = filepath; // viewWillAppear will display this file InfoViewController *modalInfoController = [[InfoViewController alloc] initWithNibName:nil bundle:nil]; [modalInfoController setModalPresentationStyle:UIModalPresentationFullScreen]; if (currentView == nil) currentView = CurrentViewController(); [currentView presentViewController:modalInfoController animated:YES completion:nil]; modalInfoController = nil; // only reset textfile in viewWillDisappear } golly-3.3-src/gui-ios/Golly/settings@2x.png0000644000175000017500000000170712026730263015603 00000000000000‰PNG  IHDR<<:üÙrŽIDAThíšßq›@Æ¿ÅNoÖ¤O°gôb&¤‚ÐII*ˆ:°;°\AÔAäq<‘àœ”73–Ù<e%‚;8þó{ÓÜêö>í²·wˆ˜Ï «ëì›ÁOÁOg'ø•‰Iâ8þ `æ!€K"J™ù†™çƒÁ`6~™ðÕj²'Ir˜eÙ"ËX8Bœw-¼QJ‹OL‡&Y–¥‹Å⸉Ϧ4Šðš8Ž?2ó¹¢ù2Ïsßó¼ëÆŽk`D0DQtJDSEó!ÄIém¬JÇãKfͲ,SÍ£‹ðÍH¹®ûÓè*0¾ëDš™?™ö_E+‡ªh"òÛð_F¥`)å(ŠNu'Ç—¦fUû·qJK)¿8!¢iÑ}¤TðfÊéŠ.lÃÚ+k‰RÁÌìo~V­Y©÷ŠvѪ­)v©ë¿)µªô.Ѻ‘%"•>Ü(U‚wF`[´”ò¢FÏ4íSz.δ~ÉøTJ¹uÛ¶=ÕýNSª.fü ›°¦ïiï]D m*QQ[=ïLî3Ò•Uz0L v«Q‡ ˲y’$‡-Íÿ•‚G£Ñ¯<ÏC´·gždYv³¯«¥}Øó¼ë<Ï}´é¡eYs)åû–æÿƒrãáyÞµÂ0z´—&EO^õ!€YÛ‡”Z7I’ÞÞÞDàáˆw´1œH·ï£ã8~ËÌsES×u?h/LãW´,+Õ)f½ÜäTVܯ)Ùö%¥×höÜÛTöཉðÇq®4Þ3oV¥wïJ/âf«ÕêÍjµzƒ­çžˆ&es÷.¥7ÙU¹ó<íyÞúØyÌÌß7Ç]×¥]sö2ÂkT*÷ÝÝV‘ëu„`±X[–5ÇC? ¢ËûûûÏppppÆÌ=·eî½`@¯rÑÜqœw»Æ{Òk4+÷¤lðQÔþBÁÌ¡ã8We6F0MÅÿ YJD~ñ£”ò(ža“<ª›àEðSçEðSçÙ þ åß±$§ŠëXIEND®B`‚golly-3.3-src/gui-ios/Golly/StatePickerView.h0000644000175000017500000000023313145740437016105 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. @interface StatePickerView : UIView @end golly-3.3-src/gui-ios/Golly/GollyAppDelegate.m0000644000175000017500000001000113145740437016215 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import "prefs.h" // for SavePrefs #import "PatternViewController.h" #import "OpenViewController.h" #import "SettingsViewController.h" #import "HelpViewController.h" #import "GollyAppDelegate.h" @implementation GollyAppDelegate @synthesize window = _window; // ----------------------------------------------------------------------------- static UITabBarController *tabBarController = nil; // for SwitchToPatternTab, etc - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // set variable seed for later rand() calls srand((unsigned int)time(0)); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController *vc0 = [[PatternViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc1 = [[OpenViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc2 = [[SettingsViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc3 = [[HelpViewController alloc] initWithNibName:nil bundle:nil]; tabBarController = [[UITabBarController alloc] init]; tabBarController.viewControllers = [NSArray arrayWithObjects:vc0, vc1, vc2, vc3, nil]; self.window.rootViewController = tabBarController; [self.window makeKeyAndVisible]; return YES; } // ----------------------------------------------------------------------------- - (void)applicationWillResignActive:(UIApplication *)application { // this is called for certain types of temporary interruptions (such as an incoming phone call or SMS message) // or when the user quits the application and it begins the transition to the background state PauseGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationDidEnterBackground:(UIApplication *)application { // called when user hits home button PauseGenTimer(); SavePrefs(); } // ----------------------------------------------------------------------------- - (void)applicationWillEnterForeground:(UIApplication *)application { // undo any changes made in applicationDidEnterBackground RestartGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationDidBecomeActive:(UIApplication *)application { // restart any tasks that were paused in applicationWillResignActive RestartGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationWillTerminate:(UIApplication *)application { // application is about to terminate // (never called in iOS 5, so use applicationDidEnterBackground) } @end // ============================================================================= void SwitchToPatternTab() { tabBarController.selectedIndex = 0; } // ----------------------------------------------------------------------------- void SwitchToOpenTab() { tabBarController.selectedIndex = 1; } // ----------------------------------------------------------------------------- void SwitchToSettingsTab() { tabBarController.selectedIndex = 2; } // ----------------------------------------------------------------------------- void SwitchToHelpTab() { tabBarController.selectedIndex = 3; } // ----------------------------------------------------------------------------- UIViewController* CurrentViewController() { return tabBarController.selectedViewController; } // ----------------------------------------------------------------------------- void EnableTabBar(bool enable) { tabBarController.tabBar.userInteractionEnabled = enable; } // ----------------------------------------------------------------------------- void ShowTabBar(bool show) { tabBarController.tabBar.hidden = !show; } // ----------------------------------------------------------------------------- CGFloat TabBarHeight() { return tabBarController.tabBar.frame.size.height; } golly-3.3-src/gui-ios/Golly/main.m0000644000175000017500000000045413145740437013772 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #import #import "GollyAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([GollyAppDelegate class])); } } golly-3.3-src/gui-ios/Golly.xcodeproj/0000755000175000017500000000000013543257427014745 500000000000000golly-3.3-src/gui-ios/Golly.xcodeproj/project.pbxproj0000644000175000017500000017035613171233731017742 00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 0D02E13E1568A14800581DCC /* PatternView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D02E13D1568A14800581DCC /* PatternView.m */; }; 0D068EB815D93F4300A4EAB3 /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */; }; 0D068EB915D93F4300A4EAB3 /* iTunesArtwork@2x in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */; }; 0D068EC115D9DD3A00A4EAB3 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */; }; 0D068EC215D9DD3A00A4EAB3 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */; }; 0D078728156881080051973C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D078727156881080051973C /* UIKit.framework */; }; 0D07872A156881080051973C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D078729156881080051973C /* Foundation.framework */; }; 0D07872C156881080051973C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D07872B156881080051973C /* CoreGraphics.framework */; }; 0D078732156881080051973C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D078730156881080051973C /* InfoPlist.strings */; }; 0D078734156881080051973C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078733156881080051973C /* main.m */; }; 0D078738156881080051973C /* GollyAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078737156881080051973C /* GollyAppDelegate.m */; }; 0D07873B156881080051973C /* PatternViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D07873A156881080051973C /* PatternViewController.m */; }; 0D07873D156881080051973C /* pattern.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D07873C156881080051973C /* pattern.png */; }; 0D07873F156881080051973C /* pattern@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D07873E156881080051973C /* pattern@2x.png */; }; 0D078742156881080051973C /* HelpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078741156881080051973C /* HelpViewController.m */; }; 0D105F0F159EABDF006350CA /* InfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D105F0D159EABDF006350CA /* InfoViewController.m */; }; 0D105F10159EABDF006350CA /* InfoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D105F0E159EABDF006350CA /* InfoViewController.xib */; }; 0D1E9E6D17420EE2002C1270 /* triangle-right.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D1E9E6B17420EE2002C1270 /* triangle-right.png */; }; 0D1E9E6E17420EE2002C1270 /* triangle-down.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D1E9E6C17420EE2002C1270 /* triangle-down.png */; }; 0D2AA2F21C1C4B0B00484BB6 /* Patterns in Resources */ = {isa = PBXBuildFile; fileRef = 0D2AA2F11C1C4B0B00484BB6 /* Patterns */; }; 0D2AA2F41C1C4B2400484BB6 /* Rules in Resources */ = {isa = PBXBuildFile; fileRef = 0D2AA2F31C1C4B2400484BB6 /* Rules */; }; 0D2D9AAF156A00F3005B8D19 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D2D9AAE156A00F3005B8D19 /* libz.dylib */; }; 0D2DB6E31F874DB300F56DC3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D2DB6E21F874DB300F56DC3 /* Images.xcassets */; }; 0D41CD35157C225F0032B05A /* StateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D41CD34157C225F0032B05A /* StateView.m */; }; 0D602F38157320D200F51C02 /* beep.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 0D602F37157320D200F51C02 /* beep.aiff */; }; 0D602F3A1573210000F51C02 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D602F391573210000F51C02 /* AudioToolbox.framework */; }; 0D62F87115B8343B002E3EF8 /* StatePickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62F87015B8343A002E3EF8 /* StatePickerView.m */; }; 0D62F87615B8355B002E3EF8 /* StatePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62F87415B8355B002E3EF8 /* StatePickerController.m */; }; 0D62F87715B8355B002E3EF8 /* StatePickerController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */; }; 0D62FCF3159BCDCC005506CA /* SaveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62FCF1159BCDCC005506CA /* SaveViewController.m */; }; 0D62FCF4159BCDCC005506CA /* SaveViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */; }; 0D64693E1599D04A00433025 /* OpenViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D64693C1599D04A00433025 /* OpenViewController.m */; }; 0D64693F1599D04A00433025 /* OpenViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D64693D1599D04A00433025 /* OpenViewController.xib */; }; 0D8A223F1798EA17006044E7 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A22371798EA17006044E7 /* ioapi.c */; }; 0D8A22411798EA17006044E7 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A223B1798EA17006044E7 /* unzip.c */; }; 0D8A22421798EA17006044E7 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A223D1798EA17006044E7 /* zip.c */; }; 0D8F770715D097CD00EF43AF /* HelpViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D8F770615D097CD00EF43AF /* HelpViewController.xib */; }; 0D96C6411575C652006C8EBC /* settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C63F1575C651006C8EBC /* settings.png */; }; 0D96C6421575C652006C8EBC /* settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C6401575C651006C8EBC /* settings@2x.png */; }; 0D96C6461575C824006C8EBC /* RuleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D96C6441575C824006C8EBC /* RuleViewController.m */; }; 0D96C6471575C824006C8EBC /* RuleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C6451575C824006C8EBC /* RuleViewController.xib */; }; 0D96C64B1575CBF8006C8EBC /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */; }; 0D96C64C1575CBF8006C8EBC /* SettingsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */; }; 0D9AA82815D099D8003BEBD5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */; }; 0D9AA82B15D099F2003BEBD5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */; }; 0D9D15B915B67E340081C8AB /* help.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D9D15B715B67E340081C8AB /* help.png */; }; 0D9D15BA15B67E340081C8AB /* help@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D9D15B815B67E340081C8AB /* help@2x.png */; }; 0D9D4DC4156E1F97005DD91D /* StatusView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D4DC3156E1F97005DD91D /* StatusView.m */; }; 0DA5B34715F03654005EBBE8 /* bigint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32315F03654005EBBE8 /* bigint.cpp */; }; 0DA5B34815F03654005EBBE8 /* generationsalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */; }; 0DA5B34915F03654005EBBE8 /* ghashbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */; }; 0DA5B34A15F03654005EBBE8 /* ghashdraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */; }; 0DA5B34B15F03654005EBBE8 /* hlifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */; }; 0DA5B34C15F03654005EBBE8 /* hlifedraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */; }; 0DA5B34D15F03654005EBBE8 /* jvnalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */; }; 0DA5B34E15F03654005EBBE8 /* lifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */; }; 0DA5B34F15F03654005EBBE8 /* lifepoll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */; }; 0DA5B35015F03654005EBBE8 /* liferender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33315F03654005EBBE8 /* liferender.cpp */; }; 0DA5B35115F03654005EBBE8 /* liferules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33515F03654005EBBE8 /* liferules.cpp */; }; 0DA5B35215F03654005EBBE8 /* qlifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */; }; 0DA5B35315F03654005EBBE8 /* qlifedraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */; }; 0DA5B35415F03654005EBBE8 /* readpattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */; settings = {COMPILER_FLAGS = "-DZLIB"; }; }; 0DA5B35515F03654005EBBE8 /* ruletable_algo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */; }; 0DA5B35615F03654005EBBE8 /* ruletreealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */; }; 0DA5B35715F03654005EBBE8 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34115F03654005EBBE8 /* util.cpp */; }; 0DA5B35815F03654005EBBE8 /* viewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34315F03654005EBBE8 /* viewport.cpp */; }; 0DA5B35915F03654005EBBE8 /* writepattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34515F03654005EBBE8 /* writepattern.cpp */; settings = {COMPILER_FLAGS = "-DZLIB"; }; }; 0DB7062E1C1C163D008A57C8 /* Help in Resources */ = {isa = PBXBuildFile; fileRef = 0DB7062D1C1C163D008A57C8 /* Help */; }; 0DBD205B1C131D9E007A70EF /* PatternViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0DBD205A1C131D9E007A70EF /* PatternViewController.xib */; }; 0DBFA9121F8754E40004D7E3 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DBFA9101F8754E40004D7E3 /* Icon.png */; }; 0DBFA9131F8754E40004D7E3 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DBFA9111F8754E40004D7E3 /* Icon@2x.png */; }; 0DCABC1D1F77319200C91FE0 /* ltlalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DCABC1A1F77319200C91FE0 /* ltlalgo.cpp */; }; 0DCABC1E1F77319200C91FE0 /* ltldraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DCABC1C1F77319200C91FE0 /* ltldraw.cpp */; }; 0DD0EF97178017020061E9A1 /* algos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF81178017020061E9A1 /* algos.cpp */; }; 0DD0EF98178017020061E9A1 /* control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF83178017020061E9A1 /* control.cpp */; }; 0DD0EF99178017020061E9A1 /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF85178017020061E9A1 /* file.cpp */; }; 0DD0EF9A178017020061E9A1 /* layer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF87178017020061E9A1 /* layer.cpp */; }; 0DD0EF9B178017020061E9A1 /* prefs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF89178017020061E9A1 /* prefs.cpp */; }; 0DD0EF9C178017020061E9A1 /* render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF8B178017020061E9A1 /* render.cpp */; }; 0DD0EF9D178017020061E9A1 /* select.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF8D178017020061E9A1 /* select.cpp */; }; 0DD0EF9E178017020061E9A1 /* status.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF8F178017020061E9A1 /* status.cpp */; }; 0DD0EF9F178017020061E9A1 /* undo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF91178017020061E9A1 /* undo.cpp */; }; 0DD0EFA0178017020061E9A1 /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF93178017020061E9A1 /* utils.cpp */; }; 0DD0EFA1178017020061E9A1 /* view.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD0EF95178017020061E9A1 /* view.cpp */; }; 0DD5D56715A3083700CF2627 /* open.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DD5D56515A3083700CF2627 /* open.png */; }; 0DD5D56815A3083700CF2627 /* open@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DD5D56615A3083700CF2627 /* open@2x.png */; }; 0DD820DA1632A321008DF0FD /* ruleloaderalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 0D02E13C1568A14800581DCC /* PatternView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PatternView.h; sourceTree = ""; }; 0D02E13D1568A14800581DCC /* PatternView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PatternView.m; sourceTree = ""; }; 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait~ipad.png"; sourceTree = ""; }; 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape~ipad.png"; sourceTree = ""; }; 0D078723156881080051973C /* Golly.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Golly.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0D078727156881080051973C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 0D078729156881080051973C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 0D07872B156881080051973C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 0D07872F156881080051973C /* Golly-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Golly-Info.plist"; sourceTree = ""; }; 0D078731156881080051973C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 0D078733156881080051973C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 0D078735156881080051973C /* Golly-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Golly-Prefix.pch"; sourceTree = ""; }; 0D078736156881080051973C /* GollyAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GollyAppDelegate.h; sourceTree = ""; }; 0D078737156881080051973C /* GollyAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GollyAppDelegate.m; sourceTree = ""; }; 0D078739156881080051973C /* PatternViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PatternViewController.h; sourceTree = ""; }; 0D07873A156881080051973C /* PatternViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PatternViewController.m; sourceTree = ""; }; 0D07873C156881080051973C /* pattern.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pattern.png; sourceTree = ""; }; 0D07873E156881080051973C /* pattern@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pattern@2x.png"; sourceTree = ""; }; 0D078740156881080051973C /* HelpViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HelpViewController.h; sourceTree = ""; }; 0D078741156881080051973C /* HelpViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HelpViewController.m; sourceTree = ""; }; 0D105F0C159EABDF006350CA /* InfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfoViewController.h; sourceTree = ""; }; 0D105F0D159EABDF006350CA /* InfoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InfoViewController.m; sourceTree = ""; }; 0D105F0E159EABDF006350CA /* InfoViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InfoViewController.xib; sourceTree = ""; }; 0D1E9E6B17420EE2002C1270 /* triangle-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "triangle-right.png"; sourceTree = ""; }; 0D1E9E6C17420EE2002C1270 /* triangle-down.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "triangle-down.png"; sourceTree = ""; }; 0D2AA2F11C1C4B0B00484BB6 /* Patterns */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Patterns; path = ../Patterns; sourceTree = ""; }; 0D2AA2F31C1C4B2400484BB6 /* Rules */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Rules; path = ../Rules; sourceTree = ""; }; 0D2D9AAE156A00F3005B8D19 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 0D2DB6E21F874DB300F56DC3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 0D41CD33157C225F0032B05A /* StateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StateView.h; sourceTree = ""; }; 0D41CD34157C225F0032B05A /* StateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StateView.m; sourceTree = ""; }; 0D602F37157320D200F51C02 /* beep.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = beep.aiff; sourceTree = ""; }; 0D602F391573210000F51C02 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 0D62F86F15B8343A002E3EF8 /* StatePickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatePickerView.h; sourceTree = ""; }; 0D62F87015B8343A002E3EF8 /* StatePickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatePickerView.m; sourceTree = ""; }; 0D62F87315B8355B002E3EF8 /* StatePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatePickerController.h; sourceTree = ""; }; 0D62F87415B8355B002E3EF8 /* StatePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatePickerController.m; sourceTree = ""; }; 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = StatePickerController.xib; sourceTree = ""; }; 0D62FCF0159BCDCC005506CA /* SaveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SaveViewController.h; sourceTree = ""; }; 0D62FCF1159BCDCC005506CA /* SaveViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SaveViewController.m; sourceTree = ""; }; 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SaveViewController.xib; sourceTree = ""; }; 0D64693B1599D04A00433025 /* OpenViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenViewController.h; sourceTree = ""; }; 0D64693C1599D04A00433025 /* OpenViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenViewController.m; sourceTree = ""; }; 0D64693D1599D04A00433025 /* OpenViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OpenViewController.xib; sourceTree = ""; }; 0D8A22361798EA17006044E7 /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = ""; }; 0D8A22371798EA17006044E7 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = ""; }; 0D8A22381798EA17006044E7 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = ""; }; 0D8A223B1798EA17006044E7 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = ""; }; 0D8A223C1798EA17006044E7 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = ""; }; 0D8A223D1798EA17006044E7 /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = ""; }; 0D8A223E1798EA17006044E7 /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = ""; }; 0D8F770615D097CD00EF43AF /* HelpViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HelpViewController.xib; sourceTree = ""; }; 0D96C63F1575C651006C8EBC /* settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = settings.png; sourceTree = ""; }; 0D96C6401575C651006C8EBC /* settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@2x.png"; sourceTree = ""; }; 0D96C6431575C823006C8EBC /* RuleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleViewController.h; sourceTree = ""; }; 0D96C6441575C824006C8EBC /* RuleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleViewController.m; sourceTree = ""; }; 0D96C6451575C824006C8EBC /* RuleViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RuleViewController.xib; sourceTree = ""; }; 0D96C6481575CBF8006C8EBC /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SettingsViewController.xib; sourceTree = ""; }; 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 0D9D15B715B67E340081C8AB /* help.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = help.png; sourceTree = ""; }; 0D9D15B815B67E340081C8AB /* help@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "help@2x.png"; sourceTree = ""; }; 0D9D4DC2156E1F97005DD91D /* StatusView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatusView.h; sourceTree = ""; }; 0D9D4DC3156E1F97005DD91D /* StatusView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatusView.m; sourceTree = ""; }; 0DA5B32315F03654005EBBE8 /* bigint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bigint.cpp; sourceTree = ""; }; 0DA5B32415F03654005EBBE8 /* bigint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bigint.h; sourceTree = ""; }; 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generationsalgo.cpp; sourceTree = ""; }; 0DA5B32615F03654005EBBE8 /* generationsalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generationsalgo.h; sourceTree = ""; }; 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ghashbase.cpp; sourceTree = ""; }; 0DA5B32815F03654005EBBE8 /* ghashbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ghashbase.h; sourceTree = ""; }; 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ghashdraw.cpp; sourceTree = ""; }; 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hlifealgo.cpp; sourceTree = ""; }; 0DA5B32B15F03654005EBBE8 /* hlifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hlifealgo.h; sourceTree = ""; }; 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hlifedraw.cpp; sourceTree = ""; }; 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jvnalgo.cpp; sourceTree = ""; }; 0DA5B32E15F03654005EBBE8 /* jvnalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jvnalgo.h; sourceTree = ""; }; 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lifealgo.cpp; sourceTree = ""; }; 0DA5B33015F03654005EBBE8 /* lifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lifealgo.h; sourceTree = ""; }; 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lifepoll.cpp; sourceTree = ""; }; 0DA5B33215F03654005EBBE8 /* lifepoll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lifepoll.h; sourceTree = ""; }; 0DA5B33315F03654005EBBE8 /* liferender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = liferender.cpp; sourceTree = ""; }; 0DA5B33415F03654005EBBE8 /* liferender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liferender.h; sourceTree = ""; }; 0DA5B33515F03654005EBBE8 /* liferules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = liferules.cpp; sourceTree = ""; }; 0DA5B33615F03654005EBBE8 /* liferules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liferules.h; sourceTree = ""; }; 0DA5B33715F03654005EBBE8 /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qlifealgo.cpp; sourceTree = ""; }; 0DA5B33915F03654005EBBE8 /* qlifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qlifealgo.h; sourceTree = ""; }; 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qlifedraw.cpp; sourceTree = ""; }; 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = readpattern.cpp; sourceTree = ""; }; 0DA5B33C15F03654005EBBE8 /* readpattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readpattern.h; sourceTree = ""; }; 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruletable_algo.cpp; sourceTree = ""; }; 0DA5B33E15F03654005EBBE8 /* ruletable_algo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruletable_algo.h; sourceTree = ""; }; 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruletreealgo.cpp; sourceTree = ""; }; 0DA5B34015F03654005EBBE8 /* ruletreealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruletreealgo.h; sourceTree = ""; }; 0DA5B34115F03654005EBBE8 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = ""; }; 0DA5B34215F03654005EBBE8 /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; 0DA5B34315F03654005EBBE8 /* viewport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = viewport.cpp; sourceTree = ""; }; 0DA5B34415F03654005EBBE8 /* viewport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = viewport.h; sourceTree = ""; }; 0DA5B34515F03654005EBBE8 /* writepattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = writepattern.cpp; sourceTree = ""; }; 0DA5B34615F03654005EBBE8 /* writepattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = writepattern.h; sourceTree = ""; }; 0DB7062D1C1C163D008A57C8 /* Help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Help; path = "../gui-common/Help"; sourceTree = ""; }; 0DBD205A1C131D9E007A70EF /* PatternViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PatternViewController.xib; sourceTree = ""; }; 0DBFA9101F8754E40004D7E3 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; 0DBFA9111F8754E40004D7E3 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 0DCABC1A1F77319200C91FE0 /* ltlalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ltlalgo.cpp; sourceTree = ""; }; 0DCABC1B1F77319200C91FE0 /* ltlalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ltlalgo.h; sourceTree = ""; }; 0DCABC1C1F77319200C91FE0 /* ltldraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ltldraw.cpp; sourceTree = ""; }; 0DD0EF81178017020061E9A1 /* algos.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = algos.cpp; sourceTree = ""; }; 0DD0EF82178017020061E9A1 /* algos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = algos.h; sourceTree = ""; }; 0DD0EF83178017020061E9A1 /* control.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = control.cpp; sourceTree = ""; }; 0DD0EF84178017020061E9A1 /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = control.h; sourceTree = ""; }; 0DD0EF85178017020061E9A1 /* file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file.cpp; sourceTree = ""; }; 0DD0EF86178017020061E9A1 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; 0DD0EF87178017020061E9A1 /* layer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = layer.cpp; sourceTree = ""; }; 0DD0EF88178017020061E9A1 /* layer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layer.h; sourceTree = ""; }; 0DD0EF89178017020061E9A1 /* prefs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prefs.cpp; sourceTree = ""; }; 0DD0EF8A178017020061E9A1 /* prefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefs.h; sourceTree = ""; }; 0DD0EF8B178017020061E9A1 /* render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render.cpp; sourceTree = ""; }; 0DD0EF8C178017020061E9A1 /* render.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render.h; sourceTree = ""; }; 0DD0EF8D178017020061E9A1 /* select.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = select.cpp; sourceTree = ""; }; 0DD0EF8E178017020061E9A1 /* select.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = select.h; sourceTree = ""; }; 0DD0EF8F178017020061E9A1 /* status.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = status.cpp; sourceTree = ""; }; 0DD0EF90178017020061E9A1 /* status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = status.h; sourceTree = ""; }; 0DD0EF91178017020061E9A1 /* undo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = undo.cpp; sourceTree = ""; }; 0DD0EF92178017020061E9A1 /* undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = undo.h; sourceTree = ""; }; 0DD0EF93178017020061E9A1 /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utils.cpp; sourceTree = ""; }; 0DD0EF94178017020061E9A1 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; 0DD0EF95178017020061E9A1 /* view.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = view.cpp; sourceTree = ""; }; 0DD0EF96178017020061E9A1 /* view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = view.h; sourceTree = ""; }; 0DD5D56515A3083700CF2627 /* open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = open.png; sourceTree = ""; }; 0DD5D56615A3083700CF2627 /* open@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "open@2x.png"; sourceTree = ""; }; 0DD820D71632A307008DF0FD /* ruleloaderalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruleloaderalgo.h; sourceTree = ""; }; 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruleloaderalgo.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 0D078720156881080051973C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 0D9AA82B15D099F2003BEBD5 /* OpenGLES.framework in Frameworks */, 0D9AA82815D099D8003BEBD5 /* QuartzCore.framework in Frameworks */, 0D2D9AAF156A00F3005B8D19 /* libz.dylib in Frameworks */, 0D602F3A1573210000F51C02 /* AudioToolbox.framework in Frameworks */, 0D078728156881080051973C /* UIKit.framework in Frameworks */, 0D07872A156881080051973C /* Foundation.framework in Frameworks */, 0D07872C156881080051973C /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 0D078718156881080051973C = { isa = PBXGroup; children = ( 0D2AA2F31C1C4B2400484BB6 /* Rules */, 0D2AA2F11C1C4B0B00484BB6 /* Patterns */, 0DB7062D1C1C163D008A57C8 /* Help */, 0D07872D156881080051973C /* Golly */, 0D078726156881080051973C /* Frameworks */, 0D078724156881080051973C /* Products */, ); sourceTree = ""; }; 0D078724156881080051973C /* Products */ = { isa = PBXGroup; children = ( 0D078723156881080051973C /* Golly.app */, ); name = Products; sourceTree = ""; }; 0D078726156881080051973C /* Frameworks */ = { isa = PBXGroup; children = ( 0D2D9AAE156A00F3005B8D19 /* libz.dylib */, 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */, 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */, 0D602F391573210000F51C02 /* AudioToolbox.framework */, 0D078727156881080051973C /* UIKit.framework */, 0D078729156881080051973C /* Foundation.framework */, 0D07872B156881080051973C /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; 0D07872D156881080051973C /* Golly */ = { isa = PBXGroup; children = ( 0DD0EF80178017020061E9A1 /* gui-common */, 0DA5B32215F03654005EBBE8 /* gollybase */, 0D078736156881080051973C /* GollyAppDelegate.h */, 0D078737156881080051973C /* GollyAppDelegate.m */, 0D078739156881080051973C /* PatternViewController.h */, 0D07873A156881080051973C /* PatternViewController.m */, 0DBD205A1C131D9E007A70EF /* PatternViewController.xib */, 0D02E13C1568A14800581DCC /* PatternView.h */, 0D02E13D1568A14800581DCC /* PatternView.m */, 0D9D4DC2156E1F97005DD91D /* StatusView.h */, 0D9D4DC3156E1F97005DD91D /* StatusView.m */, 0D41CD33157C225F0032B05A /* StateView.h */, 0D41CD34157C225F0032B05A /* StateView.m */, 0D62F87315B8355B002E3EF8 /* StatePickerController.h */, 0D62F87415B8355B002E3EF8 /* StatePickerController.m */, 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */, 0D62F86F15B8343A002E3EF8 /* StatePickerView.h */, 0D62F87015B8343A002E3EF8 /* StatePickerView.m */, 0D96C6431575C823006C8EBC /* RuleViewController.h */, 0D96C6441575C824006C8EBC /* RuleViewController.m */, 0D96C6451575C824006C8EBC /* RuleViewController.xib */, 0D105F0C159EABDF006350CA /* InfoViewController.h */, 0D105F0D159EABDF006350CA /* InfoViewController.m */, 0D105F0E159EABDF006350CA /* InfoViewController.xib */, 0D62FCF0159BCDCC005506CA /* SaveViewController.h */, 0D62FCF1159BCDCC005506CA /* SaveViewController.m */, 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */, 0D64693B1599D04A00433025 /* OpenViewController.h */, 0D64693C1599D04A00433025 /* OpenViewController.m */, 0D64693D1599D04A00433025 /* OpenViewController.xib */, 0D96C6481575CBF8006C8EBC /* SettingsViewController.h */, 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */, 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */, 0D078740156881080051973C /* HelpViewController.h */, 0D078741156881080051973C /* HelpViewController.m */, 0D8F770615D097CD00EF43AF /* HelpViewController.xib */, 0D2DB6E21F874DB300F56DC3 /* Images.xcassets */, 0D07872E156881080051973C /* Supporting Files */, ); path = Golly; sourceTree = ""; }; 0D07872E156881080051973C /* Supporting Files */ = { isa = PBXGroup; children = ( 0DBFA9101F8754E40004D7E3 /* Icon.png */, 0DBFA9111F8754E40004D7E3 /* Icon@2x.png */, 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */, 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */, 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */, 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */, 0D07872F156881080051973C /* Golly-Info.plist */, 0D078730156881080051973C /* InfoPlist.strings */, 0D078733156881080051973C /* main.m */, 0D078735156881080051973C /* Golly-Prefix.pch */, 0D602F37157320D200F51C02 /* beep.aiff */, 0D9D15B715B67E340081C8AB /* help.png */, 0D9D15B815B67E340081C8AB /* help@2x.png */, 0D07873C156881080051973C /* pattern.png */, 0D07873E156881080051973C /* pattern@2x.png */, 0DD5D56515A3083700CF2627 /* open.png */, 0DD5D56615A3083700CF2627 /* open@2x.png */, 0D96C63F1575C651006C8EBC /* settings.png */, 0D96C6401575C651006C8EBC /* settings@2x.png */, 0D1E9E6B17420EE2002C1270 /* triangle-right.png */, 0D1E9E6C17420EE2002C1270 /* triangle-down.png */, ); name = "Supporting Files"; sourceTree = ""; }; 0D8A22351798EA17006044E7 /* MiniZip */ = { isa = PBXGroup; children = ( 0D8A22361798EA17006044E7 /* crypt.h */, 0D8A22371798EA17006044E7 /* ioapi.c */, 0D8A22381798EA17006044E7 /* ioapi.h */, 0D8A223B1798EA17006044E7 /* unzip.c */, 0D8A223C1798EA17006044E7 /* unzip.h */, 0D8A223D1798EA17006044E7 /* zip.c */, 0D8A223E1798EA17006044E7 /* zip.h */, ); path = MiniZip; sourceTree = ""; }; 0DA5B32215F03654005EBBE8 /* gollybase */ = { isa = PBXGroup; children = ( 0DCABC1A1F77319200C91FE0 /* ltlalgo.cpp */, 0DCABC1B1F77319200C91FE0 /* ltlalgo.h */, 0DCABC1C1F77319200C91FE0 /* ltldraw.cpp */, 0DA5B32315F03654005EBBE8 /* bigint.cpp */, 0DA5B32415F03654005EBBE8 /* bigint.h */, 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */, 0DA5B32615F03654005EBBE8 /* generationsalgo.h */, 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */, 0DA5B32815F03654005EBBE8 /* ghashbase.h */, 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */, 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */, 0DA5B32B15F03654005EBBE8 /* hlifealgo.h */, 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */, 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */, 0DA5B32E15F03654005EBBE8 /* jvnalgo.h */, 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */, 0DA5B33015F03654005EBBE8 /* lifealgo.h */, 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */, 0DA5B33215F03654005EBBE8 /* lifepoll.h */, 0DA5B33315F03654005EBBE8 /* liferender.cpp */, 0DA5B33415F03654005EBBE8 /* liferender.h */, 0DA5B33515F03654005EBBE8 /* liferules.cpp */, 0DA5B33615F03654005EBBE8 /* liferules.h */, 0DA5B33715F03654005EBBE8 /* platform.h */, 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */, 0DA5B33915F03654005EBBE8 /* qlifealgo.h */, 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */, 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */, 0DA5B33C15F03654005EBBE8 /* readpattern.h */, 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */, 0DD820D71632A307008DF0FD /* ruleloaderalgo.h */, 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */, 0DA5B33E15F03654005EBBE8 /* ruletable_algo.h */, 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */, 0DA5B34015F03654005EBBE8 /* ruletreealgo.h */, 0DA5B34115F03654005EBBE8 /* util.cpp */, 0DA5B34215F03654005EBBE8 /* util.h */, 0DA5B34315F03654005EBBE8 /* viewport.cpp */, 0DA5B34415F03654005EBBE8 /* viewport.h */, 0DA5B34515F03654005EBBE8 /* writepattern.cpp */, 0DA5B34615F03654005EBBE8 /* writepattern.h */, ); name = gollybase; path = ../../gollybase; sourceTree = ""; }; 0DD0EF80178017020061E9A1 /* gui-common */ = { isa = PBXGroup; children = ( 0D8A22351798EA17006044E7 /* MiniZip */, 0DD0EF81178017020061E9A1 /* algos.cpp */, 0DD0EF82178017020061E9A1 /* algos.h */, 0DD0EF83178017020061E9A1 /* control.cpp */, 0DD0EF84178017020061E9A1 /* control.h */, 0DD0EF85178017020061E9A1 /* file.cpp */, 0DD0EF86178017020061E9A1 /* file.h */, 0DD0EF87178017020061E9A1 /* layer.cpp */, 0DD0EF88178017020061E9A1 /* layer.h */, 0DD0EF89178017020061E9A1 /* prefs.cpp */, 0DD0EF8A178017020061E9A1 /* prefs.h */, 0DD0EF8B178017020061E9A1 /* render.cpp */, 0DD0EF8C178017020061E9A1 /* render.h */, 0DD0EF8D178017020061E9A1 /* select.cpp */, 0DD0EF8E178017020061E9A1 /* select.h */, 0DD0EF8F178017020061E9A1 /* status.cpp */, 0DD0EF90178017020061E9A1 /* status.h */, 0DD0EF91178017020061E9A1 /* undo.cpp */, 0DD0EF92178017020061E9A1 /* undo.h */, 0DD0EF93178017020061E9A1 /* utils.cpp */, 0DD0EF94178017020061E9A1 /* utils.h */, 0DD0EF95178017020061E9A1 /* view.cpp */, 0DD0EF96178017020061E9A1 /* view.h */, ); name = "gui-common"; path = "../../gui-common"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 0D078722156881080051973C /* Golly */ = { isa = PBXNativeTarget; buildConfigurationList = 0D07874F156881080051973C /* Build configuration list for PBXNativeTarget "Golly" */; buildPhases = ( 0D07871F156881080051973C /* Sources */, 0D078720156881080051973C /* Frameworks */, 0DC9D3EE15984E05008937DC /* ShellScript */, 0D078721156881080051973C /* Resources */, ); buildRules = ( ); dependencies = ( ); name = Golly; productName = Golly; productReference = 0D078723156881080051973C /* Golly.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0D07871A156881080051973C /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0810; TargetAttributes = { 0D078722156881080051973C = { DevelopmentTeam = UQZQF2G54F; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 0D07871D156881080051973C /* Build configuration list for PBXProject "Golly" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 0D078718156881080051973C; productRefGroup = 0D078724156881080051973C /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0D078722156881080051973C /* Golly */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 0D078721156881080051973C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 0D2AA2F41C1C4B2400484BB6 /* Rules in Resources */, 0D2AA2F21C1C4B0B00484BB6 /* Patterns in Resources */, 0DB7062E1C1C163D008A57C8 /* Help in Resources */, 0D078732156881080051973C /* InfoPlist.strings in Resources */, 0D07873D156881080051973C /* pattern.png in Resources */, 0D07873F156881080051973C /* pattern@2x.png in Resources */, 0D602F38157320D200F51C02 /* beep.aiff in Resources */, 0D96C6411575C652006C8EBC /* settings.png in Resources */, 0D96C6421575C652006C8EBC /* settings@2x.png in Resources */, 0D96C6471575C824006C8EBC /* RuleViewController.xib in Resources */, 0D96C64C1575CBF8006C8EBC /* SettingsViewController.xib in Resources */, 0D64693F1599D04A00433025 /* OpenViewController.xib in Resources */, 0D62FCF4159BCDCC005506CA /* SaveViewController.xib in Resources */, 0D2DB6E31F874DB300F56DC3 /* Images.xcassets in Resources */, 0D105F10159EABDF006350CA /* InfoViewController.xib in Resources */, 0DD5D56715A3083700CF2627 /* open.png in Resources */, 0DD5D56815A3083700CF2627 /* open@2x.png in Resources */, 0D9D15B915B67E340081C8AB /* help.png in Resources */, 0D9D15BA15B67E340081C8AB /* help@2x.png in Resources */, 0DBFA9131F8754E40004D7E3 /* Icon@2x.png in Resources */, 0D62F87715B8355B002E3EF8 /* StatePickerController.xib in Resources */, 0D8F770715D097CD00EF43AF /* HelpViewController.xib in Resources */, 0D068EB815D93F4300A4EAB3 /* iTunesArtwork in Resources */, 0D068EB915D93F4300A4EAB3 /* iTunesArtwork@2x in Resources */, 0D068EC115D9DD3A00A4EAB3 /* Default-Portrait~ipad.png in Resources */, 0D068EC215D9DD3A00A4EAB3 /* Default-Landscape~ipad.png in Resources */, 0D1E9E6D17420EE2002C1270 /* triangle-right.png in Resources */, 0D1E9E6E17420EE2002C1270 /* triangle-down.png in Resources */, 0DBFA9121F8754E40004D7E3 /* Icon.png in Resources */, 0DBD205B1C131D9E007A70EF /* PatternViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 0DC9D3EE15984E05008937DC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/tcsh; shellScript = "touch -cm ${SRCROOT}/../gui-common/Help\ntouch -cm ${SRCROOT}/../Patterns\ntouch -cm ${SRCROOT}/../Rules\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 0D07871F156881080051973C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 0DCABC1E1F77319200C91FE0 /* ltldraw.cpp in Sources */, 0D078734156881080051973C /* main.m in Sources */, 0D078738156881080051973C /* GollyAppDelegate.m in Sources */, 0D07873B156881080051973C /* PatternViewController.m in Sources */, 0D078742156881080051973C /* HelpViewController.m in Sources */, 0D02E13E1568A14800581DCC /* PatternView.m in Sources */, 0D9D4DC4156E1F97005DD91D /* StatusView.m in Sources */, 0D96C6461575C824006C8EBC /* RuleViewController.m in Sources */, 0D96C64B1575CBF8006C8EBC /* SettingsViewController.m in Sources */, 0D41CD35157C225F0032B05A /* StateView.m in Sources */, 0D64693E1599D04A00433025 /* OpenViewController.m in Sources */, 0D62FCF3159BCDCC005506CA /* SaveViewController.m in Sources */, 0D105F0F159EABDF006350CA /* InfoViewController.m in Sources */, 0D62F87115B8343B002E3EF8 /* StatePickerView.m in Sources */, 0D62F87615B8355B002E3EF8 /* StatePickerController.m in Sources */, 0DA5B34715F03654005EBBE8 /* bigint.cpp in Sources */, 0DA5B34815F03654005EBBE8 /* generationsalgo.cpp in Sources */, 0DA5B34915F03654005EBBE8 /* ghashbase.cpp in Sources */, 0DA5B34A15F03654005EBBE8 /* ghashdraw.cpp in Sources */, 0DA5B34B15F03654005EBBE8 /* hlifealgo.cpp in Sources */, 0DA5B34C15F03654005EBBE8 /* hlifedraw.cpp in Sources */, 0DA5B34D15F03654005EBBE8 /* jvnalgo.cpp in Sources */, 0DA5B34E15F03654005EBBE8 /* lifealgo.cpp in Sources */, 0DA5B34F15F03654005EBBE8 /* lifepoll.cpp in Sources */, 0DA5B35015F03654005EBBE8 /* liferender.cpp in Sources */, 0DA5B35115F03654005EBBE8 /* liferules.cpp in Sources */, 0DA5B35215F03654005EBBE8 /* qlifealgo.cpp in Sources */, 0DCABC1D1F77319200C91FE0 /* ltlalgo.cpp in Sources */, 0DA5B35315F03654005EBBE8 /* qlifedraw.cpp in Sources */, 0DA5B35415F03654005EBBE8 /* readpattern.cpp in Sources */, 0DA5B35515F03654005EBBE8 /* ruletable_algo.cpp in Sources */, 0DA5B35615F03654005EBBE8 /* ruletreealgo.cpp in Sources */, 0DA5B35715F03654005EBBE8 /* util.cpp in Sources */, 0DA5B35815F03654005EBBE8 /* viewport.cpp in Sources */, 0DA5B35915F03654005EBBE8 /* writepattern.cpp in Sources */, 0DD820DA1632A321008DF0FD /* ruleloaderalgo.cpp in Sources */, 0DD0EF97178017020061E9A1 /* algos.cpp in Sources */, 0DD0EF98178017020061E9A1 /* control.cpp in Sources */, 0DD0EF99178017020061E9A1 /* file.cpp in Sources */, 0DD0EF9A178017020061E9A1 /* layer.cpp in Sources */, 0DD0EF9B178017020061E9A1 /* prefs.cpp in Sources */, 0DD0EF9C178017020061E9A1 /* render.cpp in Sources */, 0DD0EF9D178017020061E9A1 /* select.cpp in Sources */, 0DD0EF9E178017020061E9A1 /* status.cpp in Sources */, 0DD0EF9F178017020061E9A1 /* undo.cpp in Sources */, 0DD0EFA0178017020061E9A1 /* utils.cpp in Sources */, 0DD0EFA1178017020061E9A1 /* view.cpp in Sources */, 0D8A223F1798EA17006044E7 /* ioapi.c in Sources */, 0D8A22411798EA17006044E7 /* unzip.c in Sources */, 0D8A22421798EA17006044E7 /* zip.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 0D078730156881080051973C /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 0D078731156881080051973C /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 0D07874D156881080051973C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; }; name = Debug; }; 0D07874E156881080051973C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = YES; }; name = Release; }; 0D078750156881080051973C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = UQZQF2G54F; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = IOS_GUI; "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ( IOS_GUI, "DEBUG=1", ); GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.trevorrow.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; name = Debug; }; 0D078751156881080051973C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = UQZQF2G54F; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = IOS_GUI; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.trevorrow.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = NO; WRAPPER_EXTENSION = app; }; name = Release; }; 0DBF0CFD15DA801A004A5509 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = YES; }; name = AppStore; }; 0DBF0CFE15DA801A004A5509 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = UQZQF2G54F; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = IOS_GUI; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.trevorrow.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; name = AppStore; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 0D07871D156881080051973C /* Build configuration list for PBXProject "Golly" */ = { isa = XCConfigurationList; buildConfigurations = ( 0D07874D156881080051973C /* Debug */, 0D07874E156881080051973C /* Release */, 0DBF0CFD15DA801A004A5509 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 0D07874F156881080051973C /* Build configuration list for PBXNativeTarget "Golly" */ = { isa = XCConfigurationList; buildConfigurations = ( 0D078750156881080051973C /* Debug */, 0D078751156881080051973C /* Release */, 0DBF0CFE15DA801A004A5509 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0D07871A156881080051973C /* Project object */; } golly-3.3-src/gui-ios/Golly.xcodeproj/project.xcworkspace/0000755000175000017500000000000013543257427020743 500000000000000golly-3.3-src/gui-ios/Golly.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000022612026730263025612 00000000000000 golly-3.3-src/gui-android/0000755000175000017500000000000013543257425012507 500000000000000golly-3.3-src/gui-android/Golly/0000755000175000017500000000000013543257427013577 500000000000000golly-3.3-src/gui-android/Golly/app/0000755000175000017500000000000013543257427014357 500000000000000golly-3.3-src/gui-android/Golly/app/src/0000755000175000017500000000000013543257425015144 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/0000755000175000017500000000000013543257427016072 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/jni/0000755000175000017500000000000013543257427016652 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/jni/jnicalls.cpp0000644000175000017500000024332213451370074021073 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #include // for calling Java from C++ and vice versa #include // for OpenGL ES 1.x calls #include // for usleep #include // for std::string #include // for std::list #include // for std::set #include // for std::count #include "utils.h" // for Warning, etc #include "algos.h" // for InitAlgorithms #include "prefs.h" // for GetPrefs, SavePrefs, userdir, etc #include "layer.h" // for AddLayer, ResizeLayers, currlayer #include "control.h" // for SetMinimumStepExponent #include "file.h" // for NewPattern, GetURL, ProcessDownload #include "render.h" // for DrawPattern #include "view.h" // for widescreen, fullscreen, TouchBegan, etc #include "status.h" // for UpdateStatusLines, ClearMessage, etc #include "undo.h" // for ClearUndoRedo #include "jnicalls.h" // ----------------------------------------------------------------------------- // these globals cache info for calling methods in .java files static JavaVM* javavm; static jobject baseapp = NULL; // instance of BaseApp static jmethodID baseapp_Warning; static jmethodID baseapp_Fatal; static jmethodID baseapp_YesNo; static jobject mainobj = NULL; // current instance of MainActivity static jmethodID main_StartMainActivity; static jmethodID main_RefreshPattern; static jmethodID main_ShowStatusLines; static jmethodID main_UpdateEditBar; static jmethodID main_CheckMessageQueue; static jmethodID main_PlayBeepSound; static jmethodID main_RemoveFile; static jmethodID main_MoveFile; static jmethodID main_CopyTextToClipboard; static jmethodID main_GetTextFromClipboard; static jmethodID main_ShowHelp; static jmethodID main_ShowTextFile; static jmethodID main_BeginProgress; static jmethodID main_AbortProgress; static jmethodID main_EndProgress; static jobject helpobj = NULL; // current instance of HelpActivity static jmethodID help_DownloadFile; static bool rendering = false; // in DrawPattern? static bool paused = false; // generating has been paused? static bool touching_pattern = false; // is pattern being touched? static bool highdensity = false; // screen density is > 300dpi? static bool temporary_mode = false; // is user doing a multi-finger pan/zoom? static TouchModes oldmode; // touch mode at start of multi-finger pan/zoom // ----------------------------------------------------------------------------- // XPM data for digits 0 to 9 where each digit is a 10x10 icon // so we can use CreateIconBitmaps static const char* digits[] = { /* width height ncolors chars_per_pixel */ "10 100 16 1", /* colors */ "A c #FFFFFF", "B c #EEEEEE", "C c #DDDDDD", "D c #CCCCCC", "E c #BBBBBB", "F c #AAAAAA", "G c #999999", "H c #888888", "I c #777777", "J c #666666", "K c #555555", "L c #444444", "M c #333333", "N c #222222", "O c #111111", ". c #000000", // black will be transparent /* pixels */ "AAAAAA....", "AGMMBA....", "CMBFKA....", "HIAAOA....", "JFAANB....", "IFAANA....", "FJACLA....", "ALLODA....", "AACAAA....", "AAAAAA....", "AAAAAA....", "AAFIAA....", "AIOIAA....", "AGKIAA....", "AAGIAA....", "AAGIAA....", "AAGIAA....", "AAGIAA....", "AAAAAA....", "AAAAAA....", "AAAAAA....", "AINLFA....", "EMADNA....", "FGAAOB....", "AABIJA....", "AEMGAA....", "ELAAAA....", "IONMNB....", "AAAAAA....", "AAAAAA....", "AAAAAA....", "AKNLDA....", "FKAGJA....", "FDAELA....", "AAJOFA....", "BAAEOA....", "IFABNA....", "CMLLFA....", "AABBAA....", "AAAAAA....", "AAAAAA....", "AABNDA....", "AAJODA....", "AEKLDA....", "BMBKDA....", "KIFMHB....", "EFGMHB....", "AAAKDA....", "AAAAAA....", "AAAAAA....", "AAAAAA....", "ANNNKA....", "BLBBBA....", "DJCBAA....", "FNJLHA....", "ABABNB....", "FFABMA....", "CMKLFA....", "AABAAA....", "AAAAAA....", "AAAAAA....", "AFLMFA....", "BMBCMA....", "GICBCA....", "IMKMHA....", "IJAANB....", "GJAANA....", "AJLLFA....", "AABAAA....", "AAAAAA....", "AAAAAA....", "JNNNND....", "BCCEMB....", "AAAKEA....", "AAEKAA....", "AAMCAA....", "ADLAAA....", "AHHAAA....", "AAAAAA....", "AAAAAA....", "AAAAAA....", "AINLDA....", "DMAGKA....", "EKADLA....", "BMNOFA....", "HJADNA....", "HHAANB....", "BMLLGA....", "AACAAA....", "AAAAAA....", "AAAAAA....", "AINLBA....", "FKBGKA....", "IGABNA....", "FJBFOB....", "AGKIMA....", "EFADKA....", "CLKMCA....", "AABAAA....", "AAAAAA...."}; static gBitmapPtr* digits10x10; // digit bitmaps for displaying state numbers // ----------------------------------------------------------------------------- jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; javavm = vm; // save in global if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) { LOGE("GetEnv failed!"); return -1; } return JNI_VERSION_1_6; } // ----------------------------------------------------------------------------- static JNIEnv* getJNIenv(bool* attached) { // get the JNI environment for the current thread JNIEnv* env; *attached = false; int result = javavm->GetEnv((void **) &env, JNI_VERSION_1_6); if (result == JNI_EDETACHED) { if (javavm->AttachCurrentThread(&env, NULL) != 0) { LOGE("AttachCurrentThread failed!"); return NULL; } *attached = true; } else if (result == JNI_EVERSION) { LOGE("GetEnv: JNI_VERSION_1_6 is not supported!"); return NULL; } return env; } // ----------------------------------------------------------------------------- static std::string ConvertJString(JNIEnv* env, jstring str) { const jsize len = env->GetStringUTFLength(str); const char* strChars = env->GetStringUTFChars(str, 0); std::string result(strChars, len); env->ReleaseStringUTFChars(str, strChars); return result; } // ----------------------------------------------------------------------------- static void CheckIfRendering() { int msecs = 0; while (rendering) { // wait for DrawPattern to finish usleep(1000); // 1 millisec msecs++; } // if (msecs > 0) LOGI("waited for rendering: %d msecs", msecs); } // ----------------------------------------------------------------------------- void UpdatePattern() { // call a Java method that calls GLSurfaceView.requestRender() which calls nativeRender bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_RefreshPattern); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void UpdateStatus() { if (fullscreen) return; UpdateStatusLines(); // sets status1, status2, status3 // call Java method in MainActivity class to update the status bar info bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_ShowStatusLines); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void PauseGenerating() { if (generating) { StopGenerating(); // generating is now false paused = true; } } // ----------------------------------------------------------------------------- void ResumeGenerating() { if (paused) { StartGenerating(); // generating is probably true (false if pattern is empty) paused = false; } } // ============================================================================= // these native routines are used in BaseApp.java: extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeClassInit(JNIEnv* env, jclass klass) { // get IDs for Java methods in BaseApp baseapp_Warning = env->GetMethodID(klass, "Warning", "(Ljava/lang/String;)V"); baseapp_Fatal = env->GetMethodID(klass, "Fatal", "(Ljava/lang/String;)V"); baseapp_YesNo = env->GetMethodID(klass, "YesNo", "(Ljava/lang/String;)Ljava/lang/String;"); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeCreate(JNIEnv* env, jobject obj) { // save obj for calling Java methods in instance of BaseApp if (baseapp != NULL) env->DeleteGlobalRef(baseapp); baseapp = env->NewGlobalRef(obj); SetMessage("This is Golly 1.2 for Android. Copyright 2005-2019 The Golly Gang."); if (highdensity) { MAX_MAG = 6; // maximum cell size = 64x64 } else { MAX_MAG = 5; // maximum cell size = 32x32 } InitAlgorithms(); // must initialize algoinfo first GetPrefs(); // load user's preferences SetMinimumStepExponent(); // for slowest speed AddLayer(); // create initial layer (sets currlayer) NewPattern(); // create new, empty universe digits10x10 = CreateIconBitmaps(digits,11); // 1st "digit" is not used } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeSetUserDirs(JNIEnv* env, jobject obj, jstring path) { userdir = ConvertJString(env, path) + "/"; // userdir = /mnt/sdcard/Android/data/net.sf.golly/files if external storage // is available, otherwise /data/data/net.sf.golly/files/ on internal storage // set paths to various subdirs (created by caller) userrules = userdir + "Rules/"; savedir = userdir + "Saved/"; downloaddir = userdir + "Downloads/"; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeSetSuppliedDirs(JNIEnv* env, jobject obj, jstring path) { supplieddir = ConvertJString(env, path) + "/"; // supplieddir = /data/data/net.sf.golly/files/Supplied/ // set paths to various subdirs (created by caller) helpdir = supplieddir + "Help/"; rulesdir = supplieddir + "Rules/"; patternsdir = supplieddir + "Patterns/"; // also set prefsfile here by replacing "Supplied/" with "GollyPrefs" prefsfile = supplieddir.substr(0, supplieddir.length() - 9) + "GollyPrefs"; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeSetTempDir(JNIEnv* env, jobject obj, jstring path) { tempdir = ConvertJString(env, path) + "/"; // tempdir = /data/data/net.sf.golly/cache/ clipfile = tempdir + "golly_clipboard"; /* assume nativeSetTempDir is called last LOGI("userdir = %s", userdir.c_str()); LOGI("savedir = %s", savedir.c_str()); LOGI("downloaddir = %s", downloaddir.c_str()); LOGI("userrules = %s", userrules.c_str()); LOGI("supplieddir = %s", supplieddir.c_str()); LOGI("patternsdir = %s", patternsdir.c_str()); LOGI("rulesdir = %s", rulesdir.c_str()); LOGI("helpdir = %s", helpdir.c_str()); LOGI("tempdir = %s", tempdir.c_str()); LOGI("clipfile = %s", clipfile.c_str()); LOGI("prefsfile = %s", prefsfile.c_str()); */ } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeSetScreenDensity(JNIEnv* env, jobject obj, jint dpi) { highdensity = dpi > 300; // my Nexus 7 has a density of 320dpi } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_BaseApp_nativeSetWideScreen(JNIEnv* env, jobject obj, jboolean iswide) { widescreen = iswide; } // ============================================================================= // these native routines are used in MainActivity.java: extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeClassInit(JNIEnv* env, jclass klass) { // get IDs for Java methods in MainActivity main_StartMainActivity = env->GetMethodID(klass, "StartMainActivity", "()V"); main_RefreshPattern = env->GetMethodID(klass, "RefreshPattern", "()V"); main_ShowStatusLines = env->GetMethodID(klass, "ShowStatusLines", "()V"); main_UpdateEditBar = env->GetMethodID(klass, "UpdateEditBar", "()V"); main_CheckMessageQueue = env->GetMethodID(klass, "CheckMessageQueue", "()V"); main_PlayBeepSound = env->GetMethodID(klass, "PlayBeepSound", "()V"); main_RemoveFile = env->GetMethodID(klass, "RemoveFile", "(Ljava/lang/String;)V"); main_MoveFile = env->GetMethodID(klass, "MoveFile", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); main_CopyTextToClipboard = env->GetMethodID(klass, "CopyTextToClipboard", "(Ljava/lang/String;)V"); main_GetTextFromClipboard = env->GetMethodID(klass, "GetTextFromClipboard", "()Ljava/lang/String;"); main_ShowHelp = env->GetMethodID(klass, "ShowHelp", "(Ljava/lang/String;)V"); main_ShowTextFile = env->GetMethodID(klass, "ShowTextFile", "(Ljava/lang/String;)V"); main_BeginProgress = env->GetMethodID(klass, "BeginProgress", "(Ljava/lang/String;)V"); main_AbortProgress = env->GetMethodID(klass, "AbortProgress", "(ILjava/lang/String;)Z"); main_EndProgress = env->GetMethodID(klass, "EndProgress", "()V"); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeCreate(JNIEnv* env, jobject obj) { // save obj for calling Java methods in this instance of MainActivity if (mainobj != NULL) env->DeleteGlobalRef(mainobj); mainobj = env->NewGlobalRef(obj); UpdateStatus(); // show initial message } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeDestroy(JNIEnv* env) { // the current instance of MainActivity is being destroyed if (mainobj != NULL) { env->DeleteGlobalRef(mainobj); mainobj = NULL; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_MainActivity_nativeGetStatusLine(JNIEnv* env, jobject obj, jint line) { switch (line) { case 1: return env->NewStringUTF(status1.c_str()); case 2: return env->NewStringUTF(status2.c_str()); case 3: return env->NewStringUTF(status3.c_str()); } return env->NewStringUTF("Fix bug in nativeGetStatusLine!"); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_MainActivity_nativeGetStatusColor(JNIEnv* env) { unsigned char r = algoinfo[currlayer->algtype]->statusrgb.r; unsigned char g = algoinfo[currlayer->algtype]->statusrgb.g; unsigned char b = algoinfo[currlayer->algtype]->statusrgb.b; // return status bar color as int in format 0xAARRGGBB return (0xFF000000 | (r << 16) | (g << 8) | b); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_MainActivity_nativeGetPasteMode(JNIEnv* env) { return env->NewStringUTF(GetPasteMode()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_MainActivity_nativeGetRandomFill(JNIEnv* env) { char s[4]; // room for 0..100 sprintf(s, "%d", randomfill); return env->NewStringUTF(s); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeAllowUndo(JNIEnv* env) { return allowundo; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeCanUndo(JNIEnv* env) { return currlayer->undoredo->CanUndo(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeCanRedo(JNIEnv* env) { return currlayer->undoredo->CanRedo(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeInfoAvailable(JNIEnv* env) { return currlayer->currname != "untitled"; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeUndo(JNIEnv* env) { if (generating) Warning("Bug: generating is true in nativeUndo!"); CheckIfRendering(); currlayer->undoredo->UndoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeRedo(JNIEnv* env) { if (generating) Warning("Bug: generating is true in nativeRedo!"); CheckIfRendering(); currlayer->undoredo->RedoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeCanReset(JNIEnv* env) { return currlayer->algo->getGeneration() > currlayer->startgen; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeResetPattern(JNIEnv* env) { CheckIfRendering(); ResetPattern(); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativePauseGenerating(JNIEnv* env) { PauseGenerating(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeResumeGenerating(JNIEnv* env) { ResumeGenerating(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeStartGenerating(JNIEnv* env) { if (!generating) { StartGenerating(); // generating might still be false (eg. if pattern is empty) // best to reset paused flag in case a PauseGenerating call // wasn't followed by a matching ResumeGenerating call paused = false; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeStopGenerating(JNIEnv* env) { if (generating) { StopGenerating(); // generating is now false } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeIsGenerating(JNIEnv* env) { return generating; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeGenerate(JNIEnv* env) { if (paused) return; // PauseGenerating has been called if (touching_pattern) return; // avoid jerky pattern updates // play safe and avoid re-entering currlayer->algo->step() if (event_checker > 0) return; // avoid calling NextGeneration while DrawPattern is executing on different thread if (rendering) return; NextGeneration(true); // calls currlayer->algo->step() using current gen increment UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeStep(JNIEnv* env) { NextGeneration(true); UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_MainActivity_nativeCalculateSpeed(JNIEnv* env) { // calculate the interval (in millisecs) between nativeGenerate calls int interval = 1000/60; // max speed is 60 fps // increase interval if user wants a delay if (currlayer->currexpo < 0) { interval = GetCurrentDelay(); } return interval; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeStep1(JNIEnv* env) { // reset step exponent to 0 currlayer->currexpo = 0; SetGenIncrement(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeFaster(JNIEnv* env) { // go faster by incrementing step exponent currlayer->currexpo++; SetGenIncrement(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSlower(JNIEnv* env) { // go slower by decrementing step exponent if (currlayer->currexpo > minexpo) { currlayer->currexpo--; SetGenIncrement(); } else { Beep(); } UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeStopBeforeNew(JNIEnv* env) { // NewPattern is about to clear all undo/redo history so there's no point // saving the current pattern (which might be very large) bool saveundo = allowundo; allowundo = false; // avoid calling RememberGenFinish if (generating) StopGenerating(); allowundo = saveundo; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeNewPattern(JNIEnv* env) { CheckIfRendering(); NewPattern(); UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeFitPattern(JNIEnv* env) { CheckIfRendering(); FitInView(1); UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeScale1to1(JNIEnv* env) { CheckIfRendering(); // set scale to 1:1 if (currlayer->view->getmag() != 0) { currlayer->view->setmag(0); UpdatePattern(); UpdateStatus(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeBigger(JNIEnv* env) { CheckIfRendering(); // zoom in if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(); UpdatePattern(); UpdateStatus(); } else { Beep(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSmaller(JNIEnv* env) { CheckIfRendering(); // zoom out currlayer->view->unzoom(); UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeMiddle(JNIEnv* env) { if (currlayer->originx == bigint::zero && currlayer->originy == bigint::zero) { currlayer->view->center(); } else { // put cell saved by ChangeOrigin (not yet implemented) in middle currlayer->view->setpositionmag(currlayer->originx, currlayer->originy, currlayer->view->getmag()); } UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_MainActivity_nativeGetMode(JNIEnv* env) { // avoid mode button changing to Move during a multi-finger pan/zoom if (temporary_mode) return oldmode; switch (currlayer->touchmode) { case drawmode: return 0; case pickmode: return 1; case selectmode: return 2; case movemode: return 3; default: Warning("Bug detected in nativeGetMode!"); return 0; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSetMode(JNIEnv* env, jobject obj, jint mode) { switch (mode) { case 0: currlayer->touchmode = drawmode; return; case 1: currlayer->touchmode = pickmode; return; case 2: currlayer->touchmode = selectmode; return; case 3: currlayer->touchmode = movemode; return; default: Warning("Bug detected in nativeSetMode!"); return; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_MainActivity_nativeNumLayers(JNIEnv* env) { return numlayers; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativePasteExists(JNIEnv* env) { return waitingforpaste; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeSelectionExists(JNIEnv* env) { return currlayer->currsel.Exists(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativePaste(JNIEnv* env) { CheckIfRendering(); PasteClipboard(); UpdatePattern(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSelectAll(JNIEnv* env) { SelectAll(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeRemoveSelection(JNIEnv* env) { RemoveSelection(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeCutSelection(JNIEnv* env) { CheckIfRendering(); CutSelection(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeCopySelection(JNIEnv* env) { CopySelection(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeClearSelection(JNIEnv* env, jobject obj, jint inside) { CheckIfRendering(); if (inside) { ClearSelection(); } else { ClearOutsideSelection(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeShrinkSelection(JNIEnv* env) { ShrinkSelection(false); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeFitSelection(JNIEnv* env) { FitSelection(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeRandomFill(JNIEnv* env) { CheckIfRendering(); RandomFill(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeFlipSelection(JNIEnv* env, jobject obj, jint y) { CheckIfRendering(); FlipSelection(y); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeRotateSelection(JNIEnv* env, jobject obj, jint clockwise) { CheckIfRendering(); RotateSelection(clockwise); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeAdvanceSelection(JNIEnv* env, jobject obj, jint inside) { CheckIfRendering(); if (inside) { currlayer->currsel.Advance(); } else { currlayer->currsel.AdvanceOutside(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeAbortPaste(JNIEnv* env) { AbortPaste(); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeDoPaste(JNIEnv* env, jobject obj, jint toselection) { // assume caller has stopped generating CheckIfRendering(); DoPaste(toselection); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeFlipPaste(JNIEnv* env, jobject obj, jint y) { FlipPastePattern(y); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeRotatePaste(JNIEnv* env, jobject obj, jint clockwise) { RotatePastePattern(clockwise); UpdateEverything(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeClearMessage(JNIEnv* env) { ClearMessage(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_MainActivity_nativeGetValidExtensions(JNIEnv* env) { if (currlayer->algo->hyperCapable()) { // .rle format is allowed but .mc format is better return env->NewStringUTF(".mc (the default) or .mc.gz or .rle or .rle.gz"); } else { // only .rle format is allowed return env->NewStringUTF(".rle (the default) or .rle.gz"); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeValidExtension(JNIEnv* env, jobject obj, jstring filename) { std::string fname = ConvertJString(env, filename); size_t dotpos = fname.find('.'); if (dotpos == std::string::npos) return true; // no extension given (default will be added later) if (EndsWith(fname,".rle")) return true; if (EndsWith(fname,".rle.gz")) return true; if (currlayer->algo->hyperCapable()) { if (EndsWith(fname,".mc")) return true; if (EndsWith(fname,".mc.gz")) return true; } return false; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_MainActivity_nativeFileExists(JNIEnv* env, jobject obj, jstring filename) { std::string fname = ConvertJString(env, filename); // append default extension if not supplied size_t dotpos = fname.find('.'); if (dotpos == std::string::npos) { if (currlayer->algo->hyperCapable()) { fname += ".mc"; } else { fname += ".rle"; } } std::string fullpath = savedir + fname; return FileExists(fullpath); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSavePattern(JNIEnv* env, jobject obj, jstring filename) { std::string fname = ConvertJString(env, filename); // append default extension if not supplied size_t dotpos = fname.find('.'); if (dotpos == std::string::npos) { if (currlayer->algo->hyperCapable()) { fname += ".mc"; } else { fname += ".rle"; } } pattern_format format = XRLE_format; if (EndsWith(fname,".mc") || EndsWith(fname,".mc.gz")) format = MC_format; output_compression compression = no_compression; if (EndsWith(fname,".gz")) compression = gzip_compression; std::string fullpath = savedir + fname; SavePattern(fullpath, format, compression); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeOpenFile(JNIEnv* env, jobject obj, jstring filepath) { std::string fpath = ConvertJString(env, filepath); FixURLPath(fpath); OpenFile(fpath.c_str()); SavePrefs(); // save recentpatterns } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeSetFullScreen(JNIEnv* env, jobject obj, jboolean isfull) { fullscreen = isfull; if (!fullscreen) { // user might have changed scale or position while in fullscreen mode UpdateStatus(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeChangeRule(JNIEnv* env, jobject obj, jstring rule) { std::string newrule = ConvertJString(env, rule); ChangeRule(newrule); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_MainActivity_nativeLexiconPattern(JNIEnv* env, jobject obj, jstring jpattern) { std::string pattern = ConvertJString(env, jpattern); std::replace(pattern.begin(), pattern.end(), '$', '\n'); LoadLexiconPattern(pattern); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_MainActivity_nativeDrawingState(JNIEnv* env) { return currlayer->drawingstate; } // ============================================================================= // these native routines are used in PatternGLSurfaceView.java: extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativePause(JNIEnv* env) { PauseGenerating(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeResume(JNIEnv* env) { ResumeGenerating(); UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeTouchBegan(JNIEnv* env, jobject obj, jint x, jint y) { // LOGI("touch began: x=%d y=%d", x, y); ClearMessage(); TouchBegan(x, y); // set flag so we can avoid jerky updates if pattern is generating touching_pattern = true; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeTouchMoved(JNIEnv* env, jobject obj, jint x, jint y) { // LOGI("touch moved: x=%d y=%d", x, y); TouchMoved(x, y); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeTouchEnded(JNIEnv* env) { // LOGI("touch ended"); TouchEnded(); touching_pattern = false; // allow pattern generation } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeMoveMode(JNIEnv* env) { // temporarily switch touch mode to movemode oldmode = currlayer->touchmode; currlayer->touchmode = movemode; temporary_mode = true; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeRestoreMode(JNIEnv* env) { // restore touch mode saved in nativeMoveMode currlayer->touchmode = oldmode; temporary_mode = false; // ensure correct touch mode is displayed (might not be if user tapped a mode button // with another finger while doing a two-finger pan/zoom) UpdateEditBar(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeZoomIn(JNIEnv* env, jobject obj, jint x, jint y) { ZoomInPos(x, y); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternGLSurfaceView_nativeZoomOut(JNIEnv* env, jobject obj, jint x, jint y) { ZoomOutPos(x, y); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternRenderer_nativeInit(JNIEnv* env) { // we only do 2D drawing glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_MULTISAMPLE); glDisable(GL_STENCIL_TEST); glDisable(GL_FOG); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(1.0, 1.0, 1.0, 1.0); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternRenderer_nativeResize(JNIEnv* env, jobject obj, jint w, jint h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(0, w, h, 0, -1, 1); // origin is top left and y increases down glViewport(0, 0, w, h); glMatrixMode(GL_MODELVIEW); if (w != currlayer->view->getwidth() || h != currlayer->view->getheight()) { // update size of viewport ResizeLayers(w, h); UpdatePattern(); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_PatternRenderer_nativeRender(JNIEnv* env) { // if NextGeneration is executing (on different thread) then don't call DrawPattern if (event_checker > 0) return; // render the current pattern; note that this occurs on a different thread // so we use rendering flag to prevent calls like NewPattern being called // before DrawPattern has finished rendering = true; DrawPattern(currindex); rendering = false; } // ============================================================================= // these native routines are used in OpenActivity.java: const char* HTML_HEADER = ""; const char* HTML_FOOTER = ""; const char* HTML_INDENT = "      "; static std::set opendirs; // set of open directories in Supplied patterns extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_OpenActivity_nativeGetRecentPatterns(JNIEnv* env) { std::string htmldata = HTML_HEADER; if (recentpatterns.empty()) { htmldata += "There are no recent patterns."; } else { htmldata += "Recently opened/saved patterns:

"; std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string path = *next; if (path.find("Patterns/") == 0 || FileExists(userdir + path)) { htmldata += ""; if (path.find("Patterns/") == 0) { // nicer not to show Patterns/ prefix size_t firstsep = path.find('/'); if (firstsep != std::string::npos) { path.erase(0, firstsep+1); } } htmldata += path; htmldata += "
"; } next++; } } htmldata += HTML_FOOTER; return env->NewStringUTF(htmldata.c_str()); } // ----------------------------------------------------------------------------- static void AppendHtmlData(std::string& htmldata, const std::string& paths, const std::string& dir, const std::string& prefix, bool candelete) { int closedlevel = 0; size_t pathstart = 0; size_t pathend = paths.find('\n'); while (pathend != std::string::npos) { std::string path = paths.substr(pathstart, pathend - pathstart); // path is relative to given dir (eg. "Life/Bounded-Grids/agar-p3.rle" if patternsdir) bool isdir = (paths[pathend-1] == '/'); if (isdir) { // strip off terminating '/' path = paths.substr(pathstart, pathend - pathstart - 1); } // set indent level to number of separators in path int indents = std::count(path.begin(), path.end(), '/'); if (indents <= closedlevel) { if (isdir) { // path is to a directory std::string imgname; if (opendirs.find(path) == opendirs.end()) { closedlevel = indents; imgname = "triangle-right.png"; } else { closedlevel = indents+1; imgname = "triangle-down.png"; } for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; htmldata += ""; size_t lastsep = path.rfind('/'); if (lastsep == std::string::npos) { htmldata += path; } else { htmldata += path.substr(lastsep+1); } htmldata += "
"; } else { // path is to a file for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; if (candelete) { // allow user to delete file htmldata += "DELETE   "; // allow user to edit file htmldata += "EDIT   "; } else { // allow user to read file (a supplied pattern) htmldata += "READ   "; } htmldata += ""; size_t lastsep = path.rfind('/'); if (lastsep == std::string::npos) { htmldata += path; } else { htmldata += path.substr(lastsep+1); } htmldata += "
"; } } pathstart = pathend + 1; pathend = paths.find('\n', pathstart); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_OpenActivity_nativeGetSavedPatterns(JNIEnv* env, jobject obj, jstring jpaths) { std::string paths = ConvertJString(env, jpaths); std::string htmldata = HTML_HEADER; if (paths.length() == 0) { htmldata += "There are no saved patterns."; } else { htmldata += "Saved patterns:

"; AppendHtmlData(htmldata, paths, savedir, "Saved/", true); // can delete files } htmldata += HTML_FOOTER; return env->NewStringUTF(htmldata.c_str()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_OpenActivity_nativeGetDownloadedPatterns(JNIEnv* env, jobject obj, jstring jpaths) { std::string paths = ConvertJString(env, jpaths); std::string htmldata = HTML_HEADER; if (paths.length() == 0) { htmldata += "There are no downloaded patterns."; } else { htmldata += "Downloaded patterns:

"; AppendHtmlData(htmldata, paths, downloaddir, "Downloads/", true); // can delete files } htmldata += HTML_FOOTER; return env->NewStringUTF(htmldata.c_str()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_OpenActivity_nativeGetSuppliedPatterns(JNIEnv* env, jobject obj, jstring jpaths) { std::string paths = ConvertJString(env, jpaths); std::string htmldata = HTML_HEADER; if (paths.length() == 0) { htmldata += "There are no supplied patterns."; } else { htmldata += "Supplied patterns:

"; AppendHtmlData(htmldata, paths, patternsdir, "Patterns/", false); // can't delete files } htmldata += HTML_FOOTER; return env->NewStringUTF(htmldata.c_str()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_OpenActivity_nativeToggleDir(JNIEnv* env, jobject obj, jstring jpath) { std::string path = ConvertJString(env, jpath); if (opendirs.find(path) == opendirs.end()) { // add directory path to opendirs opendirs.insert(path); } else { // remove directory path from opendirs opendirs.erase(path); } } // ============================================================================= // these native routines are used in SettingsActivity.java: static bool oldcolors; // detect if user changed swapcolors static bool oldundo; // detect if user changed allowundo static bool oldhashinfo; // detect if user changed currlayer->showhashinfo static int oldhashmem; // detect if user changed maxhashmem extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_SettingsActivity_nativeOpenSettings(JNIEnv* env) { // SettingsActivity is about to appear oldcolors = swapcolors; oldundo = allowundo; oldhashmem = maxhashmem; oldhashinfo = currlayer->showhashinfo; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_SettingsActivity_nativeCloseSettings(JNIEnv* env) { // SettingsActivity is about to disappear if (swapcolors != oldcolors) ToggleCellColors(); if (allowundo != oldundo) { if (allowundo) { if (currlayer->algo->getGeneration() > currlayer->startgen) { // undo list is empty but user can Reset, so add a generating change // to undo list so user can Undo or Reset (and then Redo if they wish) currlayer->undoredo->AddGenChange(); } } else { currlayer->undoredo->ClearUndoRedo(); } } if (currlayer->showhashinfo != oldhashinfo) { // we only show hashing info while generating if (generating) lifealgo::setVerbose(currlayer->showhashinfo); } // need to call setMaxMemory if maxhashmem changed if (maxhashmem != oldhashmem) { for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); if (algoinfo[layer->algtype]->canhash) { layer->algo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting } } // this is a good place to save the current settings SavePrefs(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_SettingsActivity_nativeGetPref(JNIEnv* env, jobject obj, jstring pref) { std::string name = ConvertJString(env, pref); if (name == "hash") return currlayer->showhashinfo ? 1 : 0; if (name == "time") return showtiming ? 1 : 0; if (name == "beep") return allowbeep ? 1 : 0; if (name == "swap") return swapcolors ? 1 : 0; if (name == "icon") return showicons ? 1 : 0; if (name == "undo") return allowundo ? 1 : 0; if (name == "grid") return showgridlines ? 1 : 0; if (name == "rand") return randomfill; if (name == "maxm") return maxhashmem; LOGE("Fix bug in nativeGetPref! name = %s", name.c_str()); return 0; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_SettingsActivity_nativeSetPref(JNIEnv* env, jobject obj, jstring pref, int val) { std::string name = ConvertJString(env, pref); if (name == "hash") currlayer->showhashinfo = val == 1; else if (name == "time") showtiming = val == 1; else if (name == "beep") allowbeep = val == 1; else if (name == "swap") swapcolors = val == 1; else if (name == "icon") showicons = val == 1; else if (name == "undo") allowundo = val == 1; else if (name == "grid") showgridlines = val == 1; else if (name == "rand") { randomfill = val; if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } else if (name == "maxm") { maxhashmem = val; if (maxhashmem < MIN_MEM_MB) maxhashmem = MIN_MEM_MB; if (maxhashmem > MAX_MEM_MB) maxhashmem = MAX_MEM_MB; } else if (name == "pmode") { if (val == 0) SetPasteMode("AND"); if (val == 1) SetPasteMode("COPY"); if (val == 2) SetPasteMode("OR"); if (val == 3) SetPasteMode("XOR"); } else LOGE("Fix bug in nativeSetPref! name = %s", name.c_str()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_SettingsActivity_nativeGetPasteMode(JNIEnv* env) { return env->NewStringUTF(GetPasteMode()); } // ============================================================================= // these native routines are used in HelpActivity.java: extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeClassInit(JNIEnv* env, jclass klass) { // get IDs for Java methods in HelpActivity help_DownloadFile = env->GetMethodID(klass, "DownloadFile", "(Ljava/lang/String;Ljava/lang/String;)V"); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeCreate(JNIEnv* env, jobject obj) { // save obj for calling Java methods in this instance of HelpActivity if (helpobj != NULL) env->DeleteGlobalRef(helpobj); helpobj = env->NewGlobalRef(obj); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeDestroy(JNIEnv* env) { // the current instance of HelpActivity is being destroyed if (helpobj != NULL) { env->DeleteGlobalRef(helpobj); helpobj = NULL; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeGetURL(JNIEnv* env, jobject obj, jstring jurl, jstring jpageurl) { std::string url = ConvertJString(env, jurl); std::string pageurl = ConvertJString(env, jpageurl); // for GetURL to work we need to convert any "%20" in pageurl to " " size_t start_pos = 0; while ((start_pos = pageurl.find("%20", start_pos)) != std::string::npos) { pageurl.replace(start_pos, 3, " "); start_pos += 1; // skip inserted space } GetURL(url, pageurl); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeUnzipFile(JNIEnv* env, jobject obj, jstring jzippath) { std::string zippath = ConvertJString(env, jzippath); FixURLPath(zippath); std::string entry = zippath.substr(zippath.rfind(':') + 1); zippath = zippath.substr(0, zippath.rfind(':')); UnzipFile(zippath, entry); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT bool JNICALL Java_net_sf_golly_HelpActivity_nativeDownloadedFile(JNIEnv* env, jobject obj, jstring jurl) { std::string path = ConvertJString(env, jurl); path = path.substr(path.rfind('/')+1); size_t dotpos = path.rfind('.'); std::string ext = ""; if (dotpos != std::string::npos) ext = path.substr(dotpos+1); if ( (IsZipFile(path) || strcasecmp(ext.c_str(),"rle") == 0 || strcasecmp(ext.c_str(),"life") == 0 || strcasecmp(ext.c_str(),"mc") == 0) // also check for '?' to avoid opening links like ".../detail?name=foo.zip" && path.find('?') == std::string::npos) { // download file to downloaddir and open it path = downloaddir + path; std::string url = ConvertJString(env, jurl); AndroidDownloadFile(url, path); // if the async download succeeds then nativeProcessDownload will call // ProcessDownload which calls OpenFile return true; } else { return false; } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_HelpActivity_nativeProcessDownload(JNIEnv* env, jobject obj, jstring jfilepath) { std::string filepath = ConvertJString(env, jfilepath); // AndroidDownloadFile has successfully downloaded and created a file ProcessDownload(filepath); } // ============================================================================= // these native routines are used in StateActivity.java: extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_StateActivity_nativeNumStates(JNIEnv* env) { return currlayer->algo->NumCellStates(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jboolean JNICALL Java_net_sf_golly_StateActivity_nativeShowIcons() { return showicons; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_StateActivity_nativeToggleIcons() { showicons = !showicons; UpdatePattern(); UpdateEditBar(); SavePrefs(); } // ============================================================================= // these native routines are used in StateGLSurfaceView.java: static int statewd, stateht; static int state_offset = 0; static int max_offset; static int lastx, lasty; static bool touch_moved; // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_StateGLSurfaceView_nativeTouchBegan(JNIEnv* env, jobject obj, jint x, jint y) { // LOGI("TouchBegan x=%d y=%d", x, y); lastx = x; lasty = y; touch_moved = false; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jboolean JNICALL Java_net_sf_golly_StateGLSurfaceView_nativeTouchMoved(JNIEnv* env, jobject obj, jint x, jint y) { // LOGI("TouchMoved x=%d y=%d", x, y); int boxsize = highdensity ? 64 : 32; int oldcol = lastx / boxsize; int oldrow = lasty / boxsize; int col = x / boxsize; int row = y / boxsize; lastx = x; lasty = y; if (col != oldcol || row != oldrow) { // user moved finger to a different state box touch_moved = true; } if (max_offset > 0 && row != oldrow) { // may need to scroll states by changing state_offset int new_offset = state_offset + 10 * (oldrow - row); if (new_offset < 0) new_offset = 0; if (new_offset > max_offset) new_offset = max_offset; if (new_offset != state_offset) { // scroll up/down state_offset = new_offset; return true; } } return false; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jboolean JNICALL Java_net_sf_golly_StateGLSurfaceView_nativeTouchEnded(JNIEnv* env) { if (touch_moved) return false; if (lastx >= 0 && lastx < statewd && lasty >= 0 && lasty < stateht) { // return true if user touched a valid state box int boxsize = highdensity ? 64 : 32; int col = lastx / boxsize; int row = lasty / boxsize; int newstate = row * 10 + col + state_offset; if (newstate >= 0 && newstate < currlayer->algo->NumCellStates()) { currlayer->drawingstate = newstate; return true; } } return false; } // ----------------------------------------------------------------------------- static void SetColor(int r, int g, int b, int a) { glColor4ub(r, g, b, a); } // ----------------------------------------------------------------------------- static void FillRect(int x, int y, int wd, int ht) { GLfloat rect[] = { x, y+ht, // left, bottom x+wd, y+ht, // right, bottom x+wd, y, // right, top x, y, // left, top }; glVertexPointer(2, GL_FLOAT, 0, rect); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_StateRenderer_nativeInit(JNIEnv* env) { // we only do 2D drawing glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_MULTISAMPLE); glDisable(GL_STENCIL_TEST); glDisable(GL_FOG); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(1.0, 1.0, 1.0, 1.0); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_StateRenderer_nativeResize(JNIEnv* env, jobject obj, jint w, jint h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(0, w, h, 0, -1, 1); // origin is top left and y increases down glViewport(0, 0, w, h); glMatrixMode(GL_MODELVIEW); statewd = w; stateht = h; max_offset = 0; int numstates = currlayer->algo->NumCellStates(); if (numstates > 100) { max_offset = (((numstates - 100) + 9) / 10) * 10; // 10 if 101 states, 160 if 256 states } if (state_offset > max_offset) state_offset = 0; } // ----------------------------------------------------------------------------- static void DrawGrid(int wd, int ht) { int cellsize = highdensity ? 64 : 32; int h, v; if (glIsEnabled(GL_TEXTURE_2D)) glDisable(GL_TEXTURE_2D); // set the stroke color to white SetColor(255, 255, 255, 255); glLineWidth(highdensity ? 2.0 : 1.0); v = 1; while (v <= ht) { GLfloat points[] = {-0.5, v-0.5, wd-0.5, v-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); v += cellsize; } h = 1; while (h <= wd) { GLfloat points[] = {h-0.5, -0.5, h-0.5, ht-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); h += cellsize; } } // ----------------------------------------------------------------------------- static void DrawRect(int state, int x, int y, int wd, int ht) { if (glIsEnabled(GL_TEXTURE_2D)) glDisable(GL_TEXTURE_2D); SetColor(currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state], 255); FillRect(x, y, wd, ht); } // ----------------------------------------------------------------------------- // texture name for drawing RGBA bitmaps static GLuint rgbatexture = 0; // fixed texture coordinates used by glTexCoordPointer static const GLshort texture_coordinates[] = { 0,0, 1,0, 0,1, 1,1 }; static void DrawRGBAData(unsigned char* rgbadata, int x, int y, int w, int h) { // only need to create texture name once if (rgbatexture == 0) glGenTextures(1, &rgbatexture); if (!glIsEnabled(GL_TEXTURE_2D)) { // restore texture color and enable textures SetColor(255, 255, 255, 255); glEnable(GL_TEXTURE_2D); // bind our texture glBindTexture(GL_TEXTURE_2D, rgbatexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexCoordPointer(2, GL_SHORT, 0, texture_coordinates); } // update the texture with the new RGBA data glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbadata); if (highdensity) { w = w*2; h = h*2; } GLfloat vertices[] = { x, y, x+w, y, x, y+h, x+w, y+h, }; glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } // ----------------------------------------------------------------------------- static void DrawIcon(int state, int x, int y) { gBitmapPtr* icons = currlayer->icons31x31; if (icons == NULL || icons[state] == NULL) return; unsigned char* pxldata = icons[state]->pxldata; if (pxldata == NULL) return; int cellsize = 31; int rowbytes = 32*4; unsigned char rgbadata[32*4*32] = {0}; // all pixels are initially transparent bool multicolor = currlayer->multicoloricons; unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; if (swapcolors) { deadr = 255 - deadr; deadg = 255 - deadg; deadb = 255 - deadb; } unsigned char liver = currlayer->cellr[state]; unsigned char liveg = currlayer->cellg[state]; unsigned char liveb = currlayer->cellb[state]; if (swapcolors) { liver = 255 - liver; liveg = 255 - liveg; liveb = 255 - liveb; } int byte = 0; int rpos = 0; for (int i = 0; i < cellsize; i++) { int rowstart = rpos; for (int j = 0; j < cellsize; j++) { unsigned char r = pxldata[byte++]; unsigned char g = pxldata[byte++]; unsigned char b = pxldata[byte++]; byte++; // skip alpha if (r || g || b) { // non-black pixel if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { rgbadata[rpos] = 255 - r; rgbadata[rpos+1] = 255 - g; rgbadata[rpos+2] = 255 - b; } else { rgbadata[rpos] = r; rgbadata[rpos+1] = g; rgbadata[rpos+2] = b; } } else { // grayscale icon (r = g = b) if (r == 255) { // replace white pixel with live cell color rgbadata[rpos] = liver; rgbadata[rpos+1] = liveg; rgbadata[rpos+2] = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)r / 255.0; rgbadata[rpos] = (int)(deadr + frac * (liver - deadr) + 0.5); rgbadata[rpos+1] = (int)(deadg + frac * (liveg - deadg) + 0.5); rgbadata[rpos+2] = (int)(deadb + frac * (liveb - deadb) + 0.5); } } rgbadata[rpos+3] = 255; // pixel is opaque } // move to next pixel in rgbadata rpos += 4; } // move to next row in rgbadata rpos = rowstart + rowbytes; } // draw the icon data DrawRGBAData(rgbadata, x, y, 32, 32); } // ----------------------------------------------------------------------------- static void DrawDigit(int digit, int x, int y) { unsigned char* pxldata = digits10x10[digit+1]->pxldata; int cellsize = 10; int rowbytes = 16*4; unsigned char rgbadata[16*4*16] = {0}; // all pixels are initially transparent int byte = 0; int rpos = 0; for (int i = 0; i < cellsize; i++) { int rowstart = rpos; for (int j = 0; j < cellsize; j++) { unsigned char r = pxldata[byte++]; unsigned char g = pxldata[byte++]; unsigned char b = pxldata[byte++]; byte++; // skip alpha if (r || g || b) { // non-black pixel rgbadata[rpos] = r; rgbadata[rpos+1] = g; rgbadata[rpos+2] = b; rgbadata[rpos+3] = 255; // pixel is opaque } // move to next pixel in rgbadata rpos += 4; } // move to next row in rgbadata rpos = rowstart + rowbytes; } // draw the digit data DrawRGBAData(rgbadata, x, y, 16, 16); } // ----------------------------------------------------------------------------- static void DrawStateNumber(int state, int x, int y) { // draw state number in top left corner of each cell int digitwd = highdensity ? 12 : 6; if (state < 10) { // state = 0..9 DrawDigit(state, x, y); } else if (state < 100) { // state = 10..99 DrawDigit(state / 10, x, y); DrawDigit(state % 10, x + digitwd, y); } else { // state = 100..255 DrawDigit(state / 100, x, y); DrawDigit((state % 100) / 10, x + digitwd, y); DrawDigit((state % 100) % 10, x + digitwd*2, y); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_StateRenderer_nativeRender(JNIEnv* env) { // fill the background with state 0 color glClearColor(currlayer->cellr[0]/255.0, currlayer->cellg[0]/255.0, currlayer->cellb[0]/255.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); DrawGrid(statewd, stateht); // display state colors or icons int numstates = currlayer->algo->NumCellStates(); int x = 1; int y = 1; int first = state_offset; // might be > 0 if numstates > 100 if (state_offset == 0) { DrawStateNumber(0, 1, 1); // start from state 1 first = 1; x = highdensity ? 65 : 33; } for (int state = first; state < numstates; state++) { if (showicons) { DrawIcon(state, x, y); } else { DrawRect(state, x, y, highdensity ? 63 : 31, highdensity ? 63 : 31); } DrawStateNumber(state, x, y); x += highdensity ? 64 : 32; if (x > (highdensity ? 640 : 320)) { x = 1; y += highdensity ? 64 : 32; if (y > (highdensity ? 640 : 320)) break; } } } // ============================================================================= // these native routines are used in RuleActivity.java: extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_RuleActivity_nativeSaveCurrentSelection(JNIEnv* env) { SaveCurrentSelection(); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_RuleActivity_nativeGetAlgoIndex(JNIEnv* env) { return currlayer->algtype; } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_RuleActivity_nativeGetAlgoName(JNIEnv* env, jobject obj, int algoindex) { if (algoindex < 0 || algoindex >= NumAlgos()) { // caller will check for empty string return env->NewStringUTF(""); } else { return env->NewStringUTF(GetAlgoName(algoindex)); } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_RuleActivity_nativeGetRule(JNIEnv* env) { return env->NewStringUTF(currlayer->algo->getrule()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_RuleActivity_nativeCheckRule(JNIEnv* env, jobject obj, jstring rule, int algoindex) { // if given rule is valid in the given algo then return same rule, // otherwise return the algo's default rule std::string thisrule = ConvertJString(env, rule); if (thisrule.empty()) thisrule = "B3/S23"; lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // switch to tempalgo's default rule std::string defrule = tempalgo->DefaultRule(); size_t thispos = thisrule.find(':'); if (thispos != std::string::npos) { // preserve valid topology so we can do things like switch from // "LifeHistory:T30,20" in RuleLoader to "B3/S23:T30,20" in QuickLife size_t defpos = defrule.find(':'); if (defpos != std::string::npos) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.substr(0, defpos); } defrule += ":"; defrule += thisrule.substr(thispos+1); } thisrule = defrule; } delete tempalgo; return env->NewStringUTF(thisrule.c_str()); } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT int JNICALL Java_net_sf_golly_RuleActivity_nativeCheckAlgo(JNIEnv* env, jobject obj, jstring rule, int algoindex) { std::string thisrule = ConvertJString(env, rule); if (thisrule.empty()) thisrule = "B3/S23"; // 1st check if rule is valid in displayed algo lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // check rule in other algos for (int newindex = 0; newindex < NumAlgos(); newindex++) { if (newindex != algoindex) { delete tempalgo; tempalgo = CreateNewUniverse(newindex); err = tempalgo->setrule(thisrule.c_str()); if (!err) { delete tempalgo; return newindex; // tell caller to change algorithm } } } } delete tempalgo; if (err) { return -1; // rule is not valid in any algo } else { return algoindex; // no need to change algo } } // ----------------------------------------------------------------------------- extern "C" JNIEXPORT void JNICALL Java_net_sf_golly_RuleActivity_nativeSetRule(JNIEnv* env, jobject obj, jstring rule, int algoindex) { std::string oldrule = currlayer->algo->getrule(); int oldmaxstate = currlayer->algo->NumCellStates() - 1; std::string newrule = ConvertJString(env, rule); if (newrule.empty()) newrule = "B3/S23"; if (algoindex == currlayer->algtype) { // check if new rule is valid in current algorithm (if not then revert to oldrule) const char* err = currlayer->algo->setrule(newrule.c_str()); if (err) RestoreRule(oldrule.c_str()); // convert newrule to canonical form for comparison with oldrule, then // check if the rule string changed or if the number of states changed newrule = currlayer->algo->getrule(); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // if pattern exists and is at starting gen then ensure savestart is true // so that SaveStartingPattern will save pattern to suitable file // (and thus undo/reset will work correctly) if (currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty()) { currlayer->savestart = true; } // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } UpdateLayerColors(); UpdateEverything(); } else { // change the current algorithm and switch to the new rule // (if the new rule is invalid then the algo's default rule will be used); // this also calls UpdateLayerColors, UpdateEverything and RememberAlgoChange ChangeAlgorithm(algoindex, newrule.c_str()); } SavePrefs(); } // ----------------------------------------------------------------------------- // these native routines are used in InfoApp.java: extern "C" JNIEXPORT jstring JNICALL Java_net_sf_golly_InfoActivity_nativeGetInfo(JNIEnv* env) { std::string info; if (currlayer->currfile.empty()) { // should never happen info = "There is no current pattern file!"; } else { // get comments in current pattern file char *commptr = NULL; // readcomments will allocate commptr const char *err = readcomments(currlayer->currfile.c_str(), &commptr); if (err) { info = err; } else if (commptr[0] == 0) { info = "No comments found."; } else { info = commptr; } if (commptr) free(commptr); } return env->NewStringUTF(info.c_str()); } // ============================================================================= std::string GetRuleName(const std::string& rule) { std::string result = ""; // not implemented return result; } // ----------------------------------------------------------------------------- void UpdateEditBar() { if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { // this can happen after an algo/rule change currlayer->drawingstate = 1; } // call Java method in MainActivity class to update the buttons in the edit bar bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_UpdateEditBar); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void BeginProgress(const char* title) { bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jtitle = env->NewStringUTF(title); env->CallVoidMethod(mainobj, main_BeginProgress, jtitle); env->DeleteLocalRef(jtitle); } if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- bool AbortProgress(double fraction_done, const char* message) { bool result = true; // abort if getJNIenv fails bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jint percentage = int(fraction_done * 100); jstring jmsg = env->NewStringUTF(message); result = env->CallBooleanMethod(mainobj, main_AbortProgress, percentage, jmsg); env->DeleteLocalRef(jmsg); } if (attached) javavm->DetachCurrentThread(); return result; } // ----------------------------------------------------------------------------- void EndProgress() { bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_EndProgress); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void SwitchToPatternTab() { // switch to MainActivity bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_StartMainActivity); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void ShowTextFile(const char* filepath) { // switch to InfoActivity and display contents of text file bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jpath = env->NewStringUTF(filepath); env->CallVoidMethod(mainobj, main_ShowTextFile, jpath); env->DeleteLocalRef(jpath); } if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void ShowHelp(const char* filepath) { // switch to HelpActivity and display html file // LOGI("ShowHelp: filepath=%s", filepath); bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jpath = env->NewStringUTF(filepath); env->CallVoidMethod(mainobj, main_ShowHelp, jpath); env->DeleteLocalRef(jpath); } if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void AndroidWarning(const char* msg) { if (generating) paused = true; bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jmsg = env->NewStringUTF(msg); env->CallVoidMethod(baseapp, baseapp_Warning, jmsg); env->DeleteLocalRef(jmsg); } if (attached) javavm->DetachCurrentThread(); if (generating) paused = false; } // ----------------------------------------------------------------------------- void AndroidFatal(const char* msg) { paused = true; bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jmsg = env->NewStringUTF(msg); env->CallVoidMethod(baseapp, baseapp_Fatal, jmsg); env->DeleteLocalRef(jmsg); } if (attached) javavm->DetachCurrentThread(); // main_Fatal calls System.exit(1) // exit(1); } // ----------------------------------------------------------------------------- bool AndroidYesNo(const char* query) { std::string answer; if (generating) paused = true; bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jquery = env->NewStringUTF(query); jstring jresult = (jstring) env->CallObjectMethod(baseapp, baseapp_YesNo, jquery); answer = ConvertJString(env, jresult); env->DeleteLocalRef(jquery); env->DeleteLocalRef(jresult); } if (attached) javavm->DetachCurrentThread(); if (generating) paused = false; return answer == "yes"; } // ----------------------------------------------------------------------------- void AndroidBeep() { bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_PlayBeepSound); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void AndroidRemoveFile(const std::string& filepath) { // LOGI("AndroidRemoveFile: %s", filepath.c_str()); bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jpath = env->NewStringUTF(filepath.c_str()); env->CallVoidMethod(mainobj, main_RemoveFile, jpath); env->DeleteLocalRef(jpath); } if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- bool AndroidMoveFile(const std::string& inpath, const std::string& outpath) { // LOGE("AndroidMoveFile: %s to %s", inpath.c_str(), outpath.c_str()); std::string error = "env is null"; bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring joldpath = env->NewStringUTF(inpath.c_str()); jstring jnewpath = env->NewStringUTF(outpath.c_str()); jstring jresult = (jstring) env->CallObjectMethod(mainobj, main_MoveFile, joldpath, jnewpath); error = ConvertJString(env, jresult); env->DeleteLocalRef(joldpath); env->DeleteLocalRef(jnewpath); env->DeleteLocalRef(jresult); } if (attached) javavm->DetachCurrentThread(); return error.length() == 0; } // ----------------------------------------------------------------------------- void AndroidFixURLPath(std::string& path) { // replace "%..." with suitable chars for a file path (eg. %20 is changed to space) // LOGI("AndroidFixURLPath: %s", path.c_str()); // no need to do anything } // ----------------------------------------------------------------------------- bool AndroidCopyTextToClipboard(const char* text) { bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jtext = env->NewStringUTF(text); env->CallVoidMethod(mainobj, main_CopyTextToClipboard, jtext); env->DeleteLocalRef(jtext); } if (attached) javavm->DetachCurrentThread(); return env != NULL; } // ----------------------------------------------------------------------------- bool AndroidGetTextFromClipboard(std::string& text) { text = ""; bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jtext = (jstring) env->CallObjectMethod(mainobj, main_GetTextFromClipboard); text = ConvertJString(env, jtext); env->DeleteLocalRef(jtext); } if (attached) javavm->DetachCurrentThread(); if (text.length() == 0) { ErrorMessage("No text in clipboard."); return false; } else { return true; } } // ----------------------------------------------------------------------------- void AndroidCheckEvents() { // event_checker is > 0 in here (see gui-common/utils.cpp) if (rendering) { // best not to call CheckMessageQueue while DrawPattern is executing // (speeds up generating loop and might help avoid fatal SIGSEGV error) return; } bool attached; JNIEnv* env = getJNIenv(&attached); if (env) env->CallVoidMethod(mainobj, main_CheckMessageQueue); if (attached) javavm->DetachCurrentThread(); } // ----------------------------------------------------------------------------- void AndroidDownloadFile(const std::string& url, const std::string& filepath) { // LOGI("AndroidDownloadFile: url=%s file=%s", url.c_str(), filepath.c_str()); // call DownloadFile method in HelpActivity bool attached; JNIEnv* env = getJNIenv(&attached); if (env) { jstring jurl = env->NewStringUTF(url.c_str()); jstring jfilepath = env->NewStringUTF(filepath.c_str()); env->CallVoidMethod(helpobj, help_DownloadFile, jurl, jfilepath); env->DeleteLocalRef(jurl); env->DeleteLocalRef(jfilepath); } if (attached) javavm->DetachCurrentThread(); } golly-3.3-src/gui-android/Golly/app/src/main/jni/jnicalls.h0000644000175000017500000000521113230774246020535 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. #ifndef _JNICALLS_H_ #define _JNICALLS_H_ #include // for std::string // for displaying info/error messages in LogCat #include #define LOG_TAG "Golly" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // Routines for calling C++ from Java and vice versa: void UpdatePattern(); // Redraw the current pattern. void UpdateStatus(); // Redraw the status bar info. void PauseGenerating(); // If pattern is generating then temporarily pause. void ResumeGenerating(); // Resume generating pattern if it was paused. std::string GetRuleName(const std::string& rule); // Return name of given rule (empty string if rule is unnamed). void UpdateEditBar(); // Update Undo and Redo buttons, show current drawing state and touch mode. void BeginProgress(const char* title); bool AbortProgress(double fraction_done, const char* message); void EndProgress(); // These calls display a progress bar while a lengthy task is carried out. void SwitchToPatternTab(); // Switch to main screen for displaying/editing/generating patterns. void ShowTextFile(const char* filepath); // Display contents of given text file in a modal view. void ShowHelp(const char* filepath); // Display given HTML file in Help screen. void AndroidWarning(const char* msg); // Beep and display message in a modal dialog. bool AndroidYesNo(const char* msg); // Similar to Warning, but there are 2 buttons: Yes and No. // Returns true if Yes button is hit. void AndroidFatal(const char* msg); // Beep, display message in a modal dialog, then exit app. void AndroidBeep(); // Play beep sound, depending on user setting. void AndroidRemoveFile(const std::string& filepath); // Delete given file. bool AndroidMoveFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully moved to output file. // If the output file existed it is replaced. void AndroidFixURLPath(std::string& path); // Replace "%..." with suitable chars for a file path (eg. %20 is changed to space). void AndroidCheckEvents(); // Run main UI thread for a short time so app remains responsive while doing a // lengthy computation. Note that event_checker is > 0 while in this routine. bool AndroidCopyTextToClipboard(const char* text); // Copy given text to the clipboard. bool AndroidGetTextFromClipboard(std::string& text); // Get text from the clipboard. void AndroidDownloadFile(const std::string& url, const std::string& filepath); // Download given url and create given file. #endif golly-3.3-src/gui-android/Golly/app/src/main/java/0000755000175000017500000000000013543257425017011 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/java/net/0000755000175000017500000000000013543257425017577 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/0000755000175000017500000000000013543257425020207 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/0000755000175000017500000000000013543257427021337 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/EditActivity.java0000644000175000017500000002247113230774246024526 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.util.DisplayMetrics; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class EditActivity extends Activity { public final static String EDITFILE_MESSAGE = "net.sf.golly.EDITFILE"; private EditText etext; // the text to be edited private boolean textchanged; // true if user changed text private String filename; // name of file being edited private String fileextn; // filename's extension private String dirpath; // location of filename // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.edit_layout); etext = (EditText) findViewById(R.id.edit_text); // next call prevents long lines wrapping and enables horizontal scrolling etext.setHorizontallyScrolling(true); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; if (dpWidth >= 600) { // use bigger font size for wide screens (layout size is 10sp) etext.setTextSize(12); } textchanged = false; getActionBar().hide(); // get full file path sent by other activity Intent intent = getIntent(); String filepath = intent.getStringExtra(EDITFILE_MESSAGE); if (filepath != null) { editTextFile(filepath); } } // ----------------------------------------------------------------------------- private boolean error = false; private void editTextFile(String filepath) { File file = new File(filepath); dirpath = filepath.substring(0, filepath.lastIndexOf('/') + 1); filename = file.getName(); fileextn = ""; int i = filename.lastIndexOf('.'); if (i > 0) fileextn = filename.substring(i); // read contents of supplied file into a string String filecontents; try { FileInputStream instream = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(instream)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n"); } filecontents = sb.toString(); instream.close(); } catch (Exception e) { filecontents = "Error reading file:\n" + e.toString(); // best to hide Save button if error occurred Button savebutton = (Button) findViewById(R.id.save); savebutton.setVisibility(View.INVISIBLE); error = true; } // display file contents (or error message) etext.setText(filecontents); // following stuff will detect any changes to text etext.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { if (!error) textchanged = true; } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // ignore } public void afterTextChanged(Editable s) { // ignore } }); } // ----------------------------------------------------------------------------- private boolean writeFile(File file, final String contents) { try { FileWriter out = new FileWriter(file); out.write(contents); out.close(); } catch (Exception e) { Toast.makeText(this, "Error writing file: " + e.toString(), Toast.LENGTH_LONG).show(); return false; } return true; } // ----------------------------------------------------------------------------- private int answer; static class LooperInterrupter extends Handler { public void handleMessage(Message msg) { throw new RuntimeException(); } } private boolean ask(String title, String msg) { // use a handler to get a modal dialog final Handler handler = new LooperInterrupter(); AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle(title); alert.setMessage(msg); alert.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { answer = 1; dialog.cancel(); handler.sendMessage(handler.obtainMessage()); } }); alert.setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { answer = 0; dialog.cancel(); handler.sendMessage(handler.obtainMessage()); } }); alert.show(); // loop until runtime exception is triggered try { Looper.loop(); } catch(RuntimeException re) {} return answer == 1; } // ----------------------------------------------------------------------------- // called when the Save button is tapped public void doSave(View view) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Save file as:"); if (fileextn.length() > 0) alert.setMessage("Extension must be " + fileextn); // use an EditText view to get (possibly new) file name final EditText input = new EditText(this); input.setSingleLine(true); input.setText(filename); input.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); alert.setView(input); alert.setPositiveButton("SAVE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // do nothing here (see below) } }); alert.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); // don't call alert.show() here -- instead we use the following stuff // which allows us to prevent the alert dialog from closing if the // given file name is invalid final AlertDialog dialog = alert.create(); dialog.show(); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener( new View.OnClickListener() { public void onClick(View v) { String newname = input.getText().toString(); if (newname.length() == 0) { Toast.makeText(EditActivity.this, "Enter a file name.", Toast.LENGTH_SHORT).show(); input.setText(filename); return; } // check for valid extension if (fileextn.length() > 0 && !newname.endsWith(fileextn)) { Toast.makeText(EditActivity.this, "File extension must be " + fileextn, Toast.LENGTH_SHORT).show(); return; } // check if given file already exists File newfile = new File(dirpath + newname); if (newfile.exists()) { boolean replace = ask("Replace " + newname + "?", "A file with that name already exists. Do you want to replace that file?"); if (!replace) return; } if (!writeFile(newfile, etext.getText().toString())) { return; } // save succeeded textchanged = false; filename = newname; dialog.dismiss(); } }); } // ----------------------------------------------------------------------------- // called when the Cancel button is tapped public void doCancel(View view) { if (textchanged && ask("Save changes?", "Do you want to save the changes you made?")) { doSave(view); } else { // return to previous activity finish(); } } } // EditActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/HelpActivity.java0000644000175000017500000004360613230774246024534 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.NavUtils; import android.util.DisplayMetrics; // import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.Toast; public class HelpActivity extends Activity { // see jnicalls.cpp for these native routines: private static native void nativeClassInit(); // this MUST be static private native void nativeCreate(); // the rest must NOT be static private native void nativeDestroy(); private native void nativeGetURL(String url, String pageurl); private native void nativeProcessDownload(String filepath); private native void nativeUnzipFile(String zippath); private native boolean nativeDownloadedFile(String url); // local fields: private static boolean firstcall = true; private static Bundle webbundle = null; // for saving/restoring scroll position and page history private boolean restarted = false; // onRestart was called before OnResume? private boolean clearhistory = false; // tell onPageFinished to clear page history? private WebView gwebview; // for displaying html pages private Button backbutton; // go to previous page private Button nextbutton; // go to next page private static String pageurl; // URL for last displayed page private ProgressBar progbar; // progress bar for downloads private LinearLayout proglayout; // view containing progress bar private boolean cancelled; // download was cancelled? public final static String SHOWHELP_MESSAGE = "net.sf.golly.SHOWHELP"; // ----------------------------------------------------------------------------- static { nativeClassInit(); // caches Java method IDs } // ----------------------------------------------------------------------------- // this class lets us intercept link taps private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView webview, String url) { // look for special prefixes used by Golly and return true if found if (url.startsWith("open:")) { openFile(url.substring(5)); return true; } if (url.startsWith("edit:")) { editFile(url.substring(5)); return true; } if (url.startsWith("rule:")) { changeRule(url.substring(5)); return true; } if (url.startsWith("lexpatt:")) { // user tapped on pattern in Life Lexicon loadLexiconPattern(url.substring(8)); return true; } if (url.startsWith("get:")) { // download file specifed in link (possibly relative to a previous full url) nativeGetURL(url.substring(4), pageurl); return true; } if (url.startsWith("unzip:")) { nativeUnzipFile(url.substring(6)); return true; } // no special prefix, so look for file with .zip/rle/lif/mc extension and download it if (nativeDownloadedFile(url)) { return true; } return false; } @Override public void onReceivedError(WebView webview, int errorCode, String description, String failingUrl) { Toast.makeText(HelpActivity.this, "Web error! " + description, Toast.LENGTH_SHORT).show(); } @Override public void onPageFinished(WebView webview, String url) { super.onPageFinished(webview, url); if (clearhistory) { // this only works after page is loaded gwebview.clearHistory(); clearhistory = false; } backbutton.setEnabled(gwebview.canGoBack()); nextbutton.setEnabled(gwebview.canGoForward()); // need URL of this page for relative "get:" links pageurl = gwebview.getUrl(); // Log.i("onPageFinished URL", pageurl); } } // ----------------------------------------------------------------------------- private void openFile(String filepath) { // switch to main screen and open given file Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.OPENFILE_MESSAGE, filepath); startActivity(intent); } // ----------------------------------------------------------------------------- private void editFile(String filepath) { BaseApp baseapp = (BaseApp)getApplicationContext(); // let user read/edit given file if (filepath.startsWith("Supplied/")) { // read contents of supplied .rule file into a string String prefix = baseapp.supplieddir.getAbsolutePath(); prefix = prefix.substring(0, prefix.length() - 8); // strip off "Supplied" String fullpath = prefix + filepath; // display filecontents Intent intent = new Intent(this, InfoActivity.class); intent.putExtra(InfoActivity.INFO_MESSAGE, fullpath); startActivity(intent); } else { // let user read or edit user's .rule file String fullpath = baseapp.userdir.getAbsolutePath() + "/" + filepath; Intent intent = new Intent(this, EditActivity.class); intent.putExtra(EditActivity.EDITFILE_MESSAGE, fullpath); startActivity(intent); } } // ----------------------------------------------------------------------------- private void changeRule(String rule) { // switch to main screen and change rule Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.RULE_MESSAGE, rule); startActivity(intent); } // ----------------------------------------------------------------------------- private void loadLexiconPattern(String pattern) { // switch to main screen and load given lexicon pattern Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.LEXICON_MESSAGE, pattern); startActivity(intent); } // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.help_layout); backbutton = (Button) findViewById(R.id.back); nextbutton = (Button) findViewById(R.id.forwards); progbar = (ProgressBar) findViewById(R.id.progress_bar); proglayout = (LinearLayout) findViewById(R.id.progress_layout); proglayout.setVisibility(LinearLayout.INVISIBLE); // show the Up button in the action bar getActionBar().setDisplayHomeAsUpEnabled(true); nativeCreate(); // cache this instance gwebview = (WebView) findViewById(R.id.webview); gwebview.setWebViewClient(new MyWebViewClient()); // JavaScript is used to detect device type gwebview.getSettings().setJavaScriptEnabled(true); // no need??? // gwebview.getSettings().setDomStorageEnabled(true); DisplayMetrics metrics = getResources().getDisplayMetrics(); // my Nexus 7 has a density of 320 if (metrics.densityDpi > 300) { // use bigger font size for high density screens (default size is 16) gwebview.getSettings().setDefaultFontSize(24); } if (firstcall) { firstcall = false; backbutton.setEnabled(false); nextbutton.setEnabled(false); showContentsPage(); // pageurl has now been initialized } } // ----------------------------------------------------------------------------- @Override protected void onNewIntent(Intent intent) { setIntent(intent); restarted = true; } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); gwebview.onPause(); // save scroll position and back/forward history if (webbundle == null) webbundle = new Bundle(); gwebview.saveState(webbundle); } // ----------------------------------------------------------------------------- @Override protected void onResume() { super.onResume(); gwebview.onResume(); // restore scroll position and back/forward history if (webbundle != null && !restarted) { gwebview.restoreState(webbundle); } restarted = false; // check for messages sent by other activities Intent intent = getIntent(); String filepath = intent.getStringExtra(SHOWHELP_MESSAGE); if (filepath != null) { // replace any spaces with %20 filepath = filepath.replaceAll(" ", "%20"); // Log.i("onResume filepath", filepath); gwebview.loadUrl("file://" + filepath); } else { // no need: gwebview.reload(); } } // ----------------------------------------------------------------------------- @Override protected void onRestart() { super.onRestart(); // set flag to prevent onResume calling gwebview.restoreState // causing app to crash for some unknown reason restarted = true; } // ----------------------------------------------------------------------------- @Override protected void onDestroy() { nativeDestroy(); super.onDestroy(); } // ----------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // add main.xml items to the action bar getMenuInflater().inflate(R.menu.main, menu); // disable the item for this activity MenuItem item = menu.findItem(R.id.help); item.setEnabled(false); return true; } // ----------------------------------------------------------------------------- @Override public boolean onOptionsItemSelected(MenuItem item) { // action bar item has been tapped Intent intent; switch (item.getItemId()) { case android.R.id.home: // the Home or Up button will go back to MainActivity NavUtils.navigateUpFromSameTask(this); return true; case R.id.open: finish(); intent = new Intent(this, OpenActivity.class); startActivity(intent); return true; case R.id.settings: finish(); intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; case R.id.help: // do nothing break; } return super.onOptionsItemSelected(item); } // ----------------------------------------------------------------------------- private void showContentsPage() { BaseApp baseapp = (BaseApp)getApplicationContext(); // display html data in supplieddir/Help/index.html String fullpath = baseapp.supplieddir.getAbsolutePath() + "/Help/index.html"; File htmlfile = new File(fullpath); if (htmlfile.exists()) { gwebview.loadUrl("file://" + fullpath); // fullpath starts with "/" } else { // should never happen String htmldata = "
Failed to find index.html!
"; gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } } // ----------------------------------------------------------------------------- // called when the Contents button is tapped public void doContents(View view) { clearhistory = true; // tell onPageFinished to clear page history showContentsPage(); if (webbundle != null) { webbundle.clear(); webbundle = null; } } // ----------------------------------------------------------------------------- // called when backbutton is tapped public void doBack(View view) { gwebview.goBack(); } // ----------------------------------------------------------------------------- // called when nextbutton is tapped public void doForwards(View view) { gwebview.goForward(); } // ----------------------------------------------------------------------------- // called when Cancel is tapped public void doCancel(View view) { cancelled = true; } // ----------------------------------------------------------------------------- private String downloadURL(String urlstring, String filepath) { // download given url and save data in given file try { File outfile = new File(filepath); final int BUFFSIZE = 8192; FileOutputStream outstream = null; try { outstream = new FileOutputStream(outfile); } catch (FileNotFoundException e) { return "File not found: " + filepath; } long starttime = System.nanoTime(); // Log.i("downloadURL", urlstring); URL url = new URL(urlstring); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setAllowUserInteraction(false); connection.setInstanceFollowRedirects(true); connection.setRequestMethod("GET"); connection.connect(); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { outstream.close(); return "No HTTP_OK response."; } // init info for progress bar int filesize = connection.getContentLength(); int downloaded = 0; int percent; int lastpercent = 0; // stream the data to given file InputStream instream = connection.getInputStream(); byte[] buffer = new byte[BUFFSIZE]; int bufflen = 0; while ((bufflen = instream.read(buffer, 0, BUFFSIZE)) > 0) { outstream.write(buffer, 0, bufflen); downloaded += bufflen; percent = (int) ((downloaded / (float)filesize) * 100); if (percent > lastpercent) { progbar.setProgress(percent); lastpercent = percent; } // show proglayout only if download takes more than 1 second if (System.nanoTime() - starttime > 1000000000L) { runOnUiThread(new Runnable() { @Override public void run() { proglayout.setVisibility(LinearLayout.VISIBLE); } }); starttime = Long.MAX_VALUE; // only show it once } if (cancelled) break; } outstream.close(); connection.disconnect(); if (cancelled) return "Cancelled."; } catch (MalformedURLException e) { return "Bad URL string: " + urlstring; } catch (IOException e) { return "Could not connect to URL: " + urlstring; } return ""; // success } // ----------------------------------------------------------------------------- private String dresult; // this method is called from C++ code (see jnicalls.cpp) private void DownloadFile(String urlstring, String filepath) { cancelled = false; progbar.setProgress(0); // don't show proglayout immediately // proglayout.setVisibility(LinearLayout.VISIBLE); // we cannot do network connections on main thread final Handler handler = new Handler(); final String durl = urlstring; final String dfile = filepath; Thread download_thread = new Thread(new Runnable() { @Override public void run() { dresult = downloadURL(durl, dfile); handler.post(new Runnable() { @Override public void run() { proglayout.setVisibility(LinearLayout.INVISIBLE); if (dresult.length() == 0) { // download succeeded nativeProcessDownload(dfile); } else if (!cancelled) { Toast.makeText(HelpActivity.this, "Download failed! " + dresult, Toast.LENGTH_SHORT).show(); } } }); } }); download_thread.setPriority(Thread.MAX_PRIORITY); download_thread.start(); } } // HelpActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/SettingsActivity.java0000644000175000017500000001514713230774246025443 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.PopupMenu; public class SettingsActivity extends Activity { // see jnicalls.cpp for these native routines: private native void nativeOpenSettings(); private native void nativeCloseSettings(); private native int nativeGetPref(String pref); private native void nativeSetPref(String pref, int val); private native String nativeGetPasteMode(); // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings_layout); // show the Up button in the action bar getActionBar().setDisplayHomeAsUpEnabled(true); // initialize check boxes, etc initSettings(); nativeOpenSettings(); } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); int rval; try { rval = Integer.parseInt(((EditText) findViewById(R.id.randperc)).getText().toString()); } catch (NumberFormatException e) { rval = 50; // 50% is default value for random fill percentage } int mval; try { mval = Integer.parseInt(((EditText) findViewById(R.id.maxmem)).getText().toString()); } catch (NumberFormatException e) { mval = 100; // 100MB is default value for max hash memory } nativeSetPref("rand", rval); nativeSetPref("maxm", mval); nativeCloseSettings(); } // ----------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // add main.xml items to the action bar getMenuInflater().inflate(R.menu.main, menu); // disable the item for this activity MenuItem item = menu.findItem(R.id.settings); item.setEnabled(false); return true; } // ----------------------------------------------------------------------------- @Override public boolean onOptionsItemSelected(MenuItem item) { // action bar item has been tapped Intent intent; switch (item.getItemId()) { case android.R.id.home: // the Home or Up button will go back to MainActivity NavUtils.navigateUpFromSameTask(this); return true; case R.id.open: finish(); intent = new Intent(this, OpenActivity.class); startActivity(intent); return true; case R.id.settings: // do nothing break; case R.id.help: finish(); intent = new Intent(this, HelpActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } // ----------------------------------------------------------------------------- private void initSettings() { ((EditText) findViewById(R.id.randperc)).setText(Integer.toString(nativeGetPref("rand"))); ((EditText) findViewById(R.id.maxmem)).setText(Integer.toString(nativeGetPref("maxm"))); ((CheckBox) findViewById(R.id.checkbox_hash)).setChecked( nativeGetPref("hash") == 1 ); ((CheckBox) findViewById(R.id.checkbox_time)).setChecked( nativeGetPref("time") == 1 ); ((CheckBox) findViewById(R.id.checkbox_beep)).setChecked( nativeGetPref("beep") == 1 ); ((CheckBox) findViewById(R.id.checkbox_swap)).setChecked( nativeGetPref("swap") == 1 ); ((CheckBox) findViewById(R.id.checkbox_icon)).setChecked( nativeGetPref("icon") == 1 ); ((CheckBox) findViewById(R.id.checkbox_undo)).setChecked( nativeGetPref("undo") == 1 ); ((CheckBox) findViewById(R.id.checkbox_grid)).setChecked( nativeGetPref("grid") == 1 ); showPasteMode(); } // ----------------------------------------------------------------------------- public void onCheckboxClicked(View view) { boolean checked = ((CheckBox) view).isChecked(); switch(view.getId()) { case R.id.checkbox_hash: nativeSetPref("hash", checked ? 1 : 0); break; case R.id.checkbox_time: nativeSetPref("time", checked ? 1 : 0); break; case R.id.checkbox_beep: nativeSetPref("beep", checked ? 1 : 0); break; case R.id.checkbox_swap: nativeSetPref("swap", checked ? 1 : 0); break; case R.id.checkbox_icon: nativeSetPref("icon", checked ? 1 : 0); break; case R.id.checkbox_undo: nativeSetPref("undo", checked ? 1 : 0); break; case R.id.checkbox_grid: nativeSetPref("grid", checked ? 1 : 0); break; } } // ----------------------------------------------------------------------------- // called when the pmode button is tapped public void doPasteMode(View view) { // display pop-up menu with these items: AND, COPY, OR, XOR PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.pastemode_menu, popup.getMenu()); popup.show(); } // ----------------------------------------------------------------------------- // called when item from pastemode_menu is selected public void doPasteModeItem(MenuItem item) { switch (item.getItemId()) { case R.id.AND: nativeSetPref("pmode", 0); break; case R.id.COPY: nativeSetPref("pmode", 1); break; case R.id.OR: nativeSetPref("pmode", 2); break; case R.id.XOR: nativeSetPref("pmode", 3); break; default: Log.e("Golly","Fix bug in doPasteModeItem!"); return; } showPasteMode(); } // ----------------------------------------------------------------------------- private void showPasteMode() { // show current paste mode in button ((Button) findViewById(R.id.pmode)).setText("Paste mode: " + nativeGetPasteMode()); } } // SettingsActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/StateActivity.java0000644000175000017500000000562313230774246024721 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.CheckBox; public class StateActivity extends Activity { // see jnicalls.cpp for these native routines: private native int nativeNumStates(); private native boolean nativeShowIcons(); private native void nativeToggleIcons(); private StateGLSurfaceView stateView; // OpenGL ES is used to draw states // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.state_layout); ((CheckBox) findViewById(R.id.icons)).setChecked( nativeShowIcons() ); // this will call the PatternGLSurfaceView constructor stateView = (StateGLSurfaceView) findViewById(R.id.stateview); stateView.setCallerActivity(this); // avoid this GL surface being darkened like PatternGLSurfaceView (underneath dialog box) stateView.setZOrderOnTop(true); // change dimensions of stateView (initially 321x321) depending on screen density // and number of states in current rule int numstates = nativeNumStates(); DisplayMetrics metrics = getResources().getDisplayMetrics(); if (metrics.densityDpi > 300) { ViewGroup.LayoutParams params = stateView.getLayoutParams(); params.width = 642; if (numstates <= 90) { params.height = ((numstates + 9) / 10) * 64 + 2; } else { params.height = 642; } stateView.setLayoutParams(params); } else if (numstates <= 90) { ViewGroup.LayoutParams params = stateView.getLayoutParams(); params.height = ((numstates + 9) / 10) * 32 + 1; stateView.setLayoutParams(params); } stateView.requestRender(); // display states } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); stateView.onPause(); } // ----------------------------------------------------------------------------- @Override protected void onResume() { super.onResume(); stateView.onResume(); } // ----------------------------------------------------------------------------- // called when the "Show icons" check box is tapped public void doToggleIcons(View view) { nativeToggleIcons(); stateView.requestRender(); } } // StateActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/StateGLSurfaceView.java0000644000175000017500000001162613145740437025573 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.opengl.GLSurfaceView; import android.util.AttributeSet; import android.view.MotionEvent; //this class must be public so it can be used in state_layout.xml public class StateGLSurfaceView extends GLSurfaceView { // see jnicalls.cpp for these native routines: private native void nativeTouchBegan(int x, int y); private native boolean nativeTouchMoved(int x, int y); private native boolean nativeTouchEnded(); private static final int INVALID_POINTER_ID = -1; private int mActivePointerId = INVALID_POINTER_ID; private Activity caller; // ----------------------------------------------------------------------------- public StateGLSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); super.setEGLConfigChooser(8, 8, 8, 8, 0/*no depth*/, 0); getHolder().setFormat(PixelFormat.RGBA_8888); // avoid crash on some devices setRenderer(new StateRenderer()); setRenderMode(RENDERMODE_WHEN_DIRTY); } // ----------------------------------------------------------------------------- public void setCallerActivity(Activity activity) { // set caller so we can finish StateActivity caller = activity; } // ----------------------------------------------------------------------------- public boolean onTouchEvent(final MotionEvent ev) { final int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { mActivePointerId = ev.getPointerId(0); final float x = ev.getX(); final float y = ev.getY(); nativeTouchBegan((int)x, (int)y); break; } case MotionEvent.ACTION_MOVE: { if (mActivePointerId != INVALID_POINTER_ID) { final int pointerIndex = ev.findPointerIndex(mActivePointerId); final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); if (nativeTouchMoved((int)x, (int)y)) { // states have scrolled requestRender(); } } break; } case MotionEvent.ACTION_UP: { mActivePointerId = INVALID_POINTER_ID; if (nativeTouchEnded()) { // user touched a state box so close dialog caller.finish(); } break; } case MotionEvent.ACTION_CANCEL: { mActivePointerId = INVALID_POINTER_ID; nativeTouchEnded(); break; } case MotionEvent.ACTION_POINTER_UP: { // secondary pointer has gone up final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final int pointerId = ev.getPointerId(pointerIndex); if (pointerId == mActivePointerId) { // this was our active pointer going up so choose a new active pointer final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mActivePointerId = ev.getPointerId(newPointerIndex); final float x = ev.getX(newPointerIndex); final float y = ev.getY(newPointerIndex); if (nativeTouchMoved((int)x, (int)y)) { // states have scrolled requestRender(); } } break; } } return true; } } // StateGLSurfaceView class //================================================================================= class StateRenderer implements GLSurfaceView.Renderer { // see jnicalls.cpp for these native routines: private native void nativeInit(); private native void nativeResize(int w, int h); private native void nativeRender(); // ----------------------------------------------------------------------------- public void onSurfaceCreated(GL10 unused, EGLConfig config) { nativeInit(); } // ----------------------------------------------------------------------------- public void onSurfaceChanged(GL10 unused, int w, int h) { nativeResize(w, h); } // ----------------------------------------------------------------------------- public void onDrawFrame(GL10 unused) { nativeRender(); } } // StateRenderer class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/OpenActivity.java0000644000175000017500000003702213230774246024540 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.File; import java.util.Arrays; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.NavUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; public class OpenActivity extends Activity { // see jnicalls.cpp for these native routines: private native String nativeGetRecentPatterns(); private native String nativeGetSavedPatterns(String paths); private native String nativeGetDownloadedPatterns(String paths); private native String nativeGetSuppliedPatterns(String paths); private native void nativeToggleDir(String path); private enum PATTERNS { SUPPLIED, RECENT, SAVED, DOWNLOADED; } private static PATTERNS currpatterns = PATTERNS.SUPPLIED; // remember scroll positions for each type of patterns private static int supplied_pos = 0; private static int recent_pos = 0; private static int saved_pos = 0; private static int downloaded_pos = 0; private WebView gwebview; // for displaying html data // ----------------------------------------------------------------------------- // this class lets us intercept link taps and restore the scroll position private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView webview, String url) { if (url.startsWith("open:")) { openFile(url.substring(5)); return true; } if (url.startsWith("toggledir:")) { nativeToggleDir(url.substring(10)); saveScrollPosition(); showSuppliedPatterns(); return true; } if (url.startsWith("delete:")) { removeFile(url.substring(7)); return true; } if (url.startsWith("edit:")) { editFile(url.substring(5)); return true; } return false; } @Override public void onPageFinished(WebView webview, String url) { super.onPageFinished(webview, url); // webview.scrollTo doesn't always work here; // we need to delay until webview.getContentHeight() > 0 final int scrollpos = restoreScrollPosition(); if (scrollpos > 0) { final Handler handler = new Handler(); Runnable runnable = new Runnable() { public void run() { if (gwebview.getContentHeight() > 0) { gwebview.scrollTo(0, scrollpos); } else { // try again a bit later handler.postDelayed(this, 100); } } }; handler.postDelayed(runnable, 100); } /* following also works if we setJavaScriptEnabled(true), but is not quite as nice when a folder is closed because the scroll position can change to force the last line to appear at the bottom of the webview int scrollpos = restoreScrollPosition(); if (scrollpos > 0) { final StringBuilder sb = new StringBuilder("javascript:window.scrollTo(0, "); sb.append(scrollpos); sb.append("/ window.devicePixelRatio);"); webview.loadUrl(sb.toString()); } super.onPageFinished(webview, url); */ } } // ----------------------------------------------------------------------------- private void saveScrollPosition() { switch (currpatterns) { case SUPPLIED: supplied_pos = gwebview.getScrollY(); break; case RECENT: recent_pos = gwebview.getScrollY(); break; case SAVED: saved_pos = gwebview.getScrollY(); break; case DOWNLOADED: downloaded_pos = gwebview.getScrollY(); break; } } // ----------------------------------------------------------------------------- private int restoreScrollPosition() { switch (currpatterns) { case SUPPLIED: return supplied_pos; case RECENT: return recent_pos; case SAVED: return saved_pos; case DOWNLOADED: return downloaded_pos; } return 0; // should never get here } // ----------------------------------------------------------------------------- private void openFile(String filepath) { // switch to main screen and open given file Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.OPENFILE_MESSAGE, filepath); startActivity(intent); } // ----------------------------------------------------------------------------- private void removeFile(String filepath) { BaseApp baseapp = (BaseApp)getApplicationContext(); final String fullpath = baseapp.userdir.getAbsolutePath() + "/" + filepath; final File file = new File(fullpath); // ask user if it's okay to delete given file AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Delete file?"); alert.setMessage("Do you really want to delete " + file.getName() + "?"); alert.setPositiveButton("DELETE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (file.delete()) { // file has been deleted so refresh gwebview saveScrollPosition(); switch (currpatterns) { case SUPPLIED: break; // should never happen case RECENT: break; // should never happen case SAVED: showSavedPatterns(); break; case DOWNLOADED: showDownloadedPatterns(); break; } } else { // should never happen Log.e("removeFile", "Failed to delete file: " + fullpath); } } }); alert.setNegativeButton("CANCEL", null); alert.show(); } // ----------------------------------------------------------------------------- private void editFile(String filepath) { // check if filepath is compressed if (filepath.endsWith(".gz") || filepath.endsWith(".zip")) { if (currpatterns == PATTERNS.SUPPLIED) { Toast.makeText(this, "Reading a compressed file is not supported.", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Editing a compressed file is not supported.", Toast.LENGTH_SHORT).show(); } return; } BaseApp baseapp = (BaseApp)getApplicationContext(); // let user read/edit given file if (currpatterns == PATTERNS.SUPPLIED) { // read contents of supplied file into a string String fullpath = baseapp.supplieddir.getAbsolutePath() + "/" + filepath; // display filecontents Intent intent = new Intent(this, InfoActivity.class); intent.putExtra(InfoActivity.INFO_MESSAGE, fullpath); startActivity(intent); } else { // let user read or edit a saved or downloaded file String fullpath = baseapp.userdir.getAbsolutePath() + "/" + filepath; Intent intent = new Intent(this, EditActivity.class); intent.putExtra(EditActivity.EDITFILE_MESSAGE, fullpath); startActivity(intent); } } // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.open_layout); gwebview = (WebView) findViewById(R.id.webview); gwebview.setWebViewClient(new MyWebViewClient()); // avoid wrapping long lines -- this doesn't work: // gwebview.getSettings().setUseWideViewPort(true); // this is better: gwebview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); DisplayMetrics metrics = getResources().getDisplayMetrics(); if (metrics.densityDpi > 300) { // use bigger font size for high density screens (default size is 16) gwebview.getSettings().setDefaultFontSize(32); } // no need for JavaScript??? // gwebview.getSettings().setJavaScriptEnabled(true); // allow zooming??? // gwebview.getSettings().setBuiltInZoomControls(true); // show the Up button in the action bar getActionBar().setDisplayHomeAsUpEnabled(true); // note that onResume will do the initial display } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); saveScrollPosition(); } // ----------------------------------------------------------------------------- @Override protected void onResume() { super.onResume(); // update gwebview restoreScrollPosition(); switch (currpatterns) { case SUPPLIED: showSuppliedPatterns(); break; case RECENT: showRecentPatterns(); break; case SAVED: showSavedPatterns(); break; case DOWNLOADED: showDownloadedPatterns(); break; } } // ----------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // add main.xml items to the action bar getMenuInflater().inflate(R.menu.main, menu); // disable the item for this activity MenuItem item = menu.findItem(R.id.open); item.setEnabled(false); return true; } // ----------------------------------------------------------------------------- @Override public boolean onOptionsItemSelected(MenuItem item) { // action bar item has been tapped Intent intent; switch (item.getItemId()) { case android.R.id.home: // the Home or Up button will go back to MainActivity NavUtils.navigateUpFromSameTask(this); return true; case R.id.open: // do nothing break; case R.id.settings: finish(); intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; case R.id.help: finish(); intent = new Intent(this, HelpActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } // ----------------------------------------------------------------------------- // called when the Supplied button is tapped public void doSupplied(View view) { if (currpatterns != PATTERNS.SUPPLIED) { saveScrollPosition(); currpatterns = PATTERNS.SUPPLIED; showSuppliedPatterns(); } } // ----------------------------------------------------------------------------- // called when the Recent button is tapped public void doRecent(View view) { if (currpatterns != PATTERNS.RECENT) { saveScrollPosition(); currpatterns = PATTERNS.RECENT; showRecentPatterns(); } } // ----------------------------------------------------------------------------- // called when the Saved button is tapped public void doSaved(View view) { if (currpatterns != PATTERNS.SAVED) { saveScrollPosition(); currpatterns = PATTERNS.SAVED; showSavedPatterns(); } } // ----------------------------------------------------------------------------- // called when the Downloaded button is tapped public void doDownloaded(View view) { if (currpatterns != PATTERNS.DOWNLOADED) { saveScrollPosition(); currpatterns = PATTERNS.DOWNLOADED; showDownloadedPatterns(); } } // ----------------------------------------------------------------------------- private String enumerateDirectory(File dir, String prefix) { // return the files and/or sub-directories in the given directory // as a string of paths where: // - paths are relative to to the initial directory // - directory paths end with '/' // - each path is terminated by \n String result = ""; File[] files = dir.listFiles(); if (files != null) { Arrays.sort(files); // sort into alphabetical order for (File file : files) { if (file.isDirectory()) { String dirname = prefix + file.getName() + "/"; result += dirname + "\n"; result += enumerateDirectory(file, dirname); } else { result += prefix + file.getName() + "\n"; } } } return result; } // ----------------------------------------------------------------------------- private void showSuppliedPatterns() { BaseApp baseapp = (BaseApp)getApplicationContext(); String paths = enumerateDirectory(new File(baseapp.supplieddir, "Patterns"), ""); String htmldata = nativeGetSuppliedPatterns(paths); // use a special base URL so that will extract foo.png from the assets folder gwebview.loadDataWithBaseURL("file:///android_asset/", htmldata, "text/html", "utf-8", null); } // ----------------------------------------------------------------------------- private void showRecentPatterns() { String htmldata = nativeGetRecentPatterns(); gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } // ----------------------------------------------------------------------------- private void showSavedPatterns() { BaseApp baseapp = (BaseApp)getApplicationContext(); String paths = enumerateDirectory(new File(baseapp.userdir, "Saved"), ""); String htmldata = nativeGetSavedPatterns(paths); gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } // ----------------------------------------------------------------------------- private void showDownloadedPatterns() { BaseApp baseapp = (BaseApp)getApplicationContext(); String paths = enumerateDirectory(new File(baseapp.userdir, "Downloads"), ""); String htmldata = nativeGetDownloadedPatterns(paths); gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } } // OpenActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/RuleActivity.java0000644000175000017500000004307113230774246024547 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.File; import java.util.Arrays; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; public class RuleActivity extends Activity { // see jnicalls.cpp for these native routines: private native void nativeSaveCurrentSelection(); private native int nativeGetAlgoIndex(); private native String nativeGetAlgoName(int algoindex); private native String nativeGetRule(); private native String nativeCheckRule(String rule, int algoindex); private native int nativeCheckAlgo(String rule, int algoindex); private native void nativeSetRule(String rule, int algoindex); // local fields: private static boolean firstcall = true; private static int algoindex = 0; // index of currently displayed algorithm private static int numalgos; // number of algorithms private static int[] scroll_pos; // remember scroll position for each algo private Button algobutton; // for changing current algorithm private EditText ruletext; // for changing current rule private WebView gwebview; // for displaying html data private String bad_rule = "Given rule is not valid in any algorithm."; // ----------------------------------------------------------------------------- // this class lets us intercept link taps and restore the scroll position private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView webview, String url) { if (url.startsWith("open:")) { openFile(url.substring(5)); return true; } if (url.startsWith("delete:")) { removeFile(url.substring(7)); return true; } if (url.startsWith("edit:")) { editFile(url.substring(5)); return true; } if (url.startsWith("rule:")) { // copy specified rule into ruletext ruletext.setText(url.substring(5)); ruletext.setSelection(ruletext.getText().length()); checkAlgo(); return true; } return false; } @Override public void onPageFinished(WebView webview, String url) { super.onPageFinished(webview, url); // webview.scrollTo doesn't always work here; // we need to delay until webview.getContentHeight() > 0 final int scrollpos = restoreScrollPosition(); if (scrollpos > 0) { final Handler handler = new Handler(); Runnable runnable = new Runnable() { public void run() { if (gwebview.getContentHeight() > 0) { gwebview.scrollTo(0, scrollpos); } else { // try again a bit later handler.postDelayed(this, 100); } } }; handler.postDelayed(runnable, 100); } } } // ----------------------------------------------------------------------------- private void saveScrollPosition() { scroll_pos[algoindex] = gwebview.getScrollY(); } // ----------------------------------------------------------------------------- private int restoreScrollPosition() { return scroll_pos[algoindex]; } // ----------------------------------------------------------------------------- private void openFile(String filepath) { // switch to main screen and open given file Intent intent = new Intent(this, MainActivity.class); intent.putExtra(MainActivity.OPENFILE_MESSAGE, filepath); startActivity(intent); } // ----------------------------------------------------------------------------- private void removeFile(String filepath) { BaseApp baseapp = (BaseApp)getApplicationContext(); final String fullpath = baseapp.userdir.getAbsolutePath() + "/" + filepath; final File file = new File(fullpath); // ask user if it's okay to delete given file AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Delete file?"); alert.setMessage("Do you really want to delete " + file.getName() + "?"); alert.setPositiveButton("DELETE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (file.delete()) { // file has been deleted so refresh gwebview saveScrollPosition(); showAlgoHelp(); } else { // should never happen Log.e("removeFile", "Failed to delete file: " + fullpath); } } }); alert.setNegativeButton("CANCEL", null); alert.show(); } // ----------------------------------------------------------------------------- private void editFile(String filepath) { BaseApp baseapp = (BaseApp)getApplicationContext(); // let user read/edit given file if (filepath.startsWith("Supplied/")) { // read contents of supplied .rule file into a string String prefix = baseapp.supplieddir.getAbsolutePath(); prefix = prefix.substring(0, prefix.length() - 8); // strip off "Supplied" String fullpath = prefix + filepath; // display filecontents Intent intent = new Intent(this, InfoActivity.class); intent.putExtra(InfoActivity.INFO_MESSAGE, fullpath); startActivity(intent); } else { // let user read or edit user's .rule file String fullpath = baseapp.userdir.getAbsolutePath() + "/" + filepath; Intent intent = new Intent(this, EditActivity.class); intent.putExtra(EditActivity.EDITFILE_MESSAGE, fullpath); startActivity(intent); } } // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rule_layout); algobutton = (Button) findViewById(R.id.algo); ruletext = (EditText) findViewById(R.id.rule); gwebview = (WebView) findViewById(R.id.webview); gwebview.setWebViewClient(new MyWebViewClient()); // no need for JavaScript??? // gwebview.getSettings().setJavaScriptEnabled(true); DisplayMetrics metrics = getResources().getDisplayMetrics(); // my Nexus 7 has a density of 320 if (metrics.densityDpi > 300) { // use bigger font size for high density screens (default size is 16) gwebview.getSettings().setDefaultFontSize(24); } getActionBar().hide(); if (firstcall) { firstcall = false; initAlgoInfo(); } algoindex = nativeGetAlgoIndex(); algobutton.setText(nativeGetAlgoName(algoindex)); // onResume will call showAlgoHelp ruletext.setText(nativeGetRule()); ruletext.setSelection(ruletext.getText().length()); // put cursor at end of rule // following listener allows us to detect when user is closing the soft keyboard // (it assumes rule_layout.xml sets android:imeOptions="actionDone") ruletext.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { checkAlgo(); } return false; } }); // selection might change if grid becomes smaller, so save current selection // in case RememberRuleChange/RememberAlgoChange is called later nativeSaveCurrentSelection(); } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); saveScrollPosition(); } // ----------------------------------------------------------------------------- @Override protected void onResume() { super.onResume(); restoreScrollPosition(); showAlgoHelp(); } // ----------------------------------------------------------------------------- private void initAlgoInfo() { // initialize number of algorithms and scroll positions numalgos = 0; while (true) { String algoname = nativeGetAlgoName(numalgos); if (algoname.length() == 0) break; numalgos++; } scroll_pos = new int[numalgos]; for (int i = 0; i < numalgos; i++) { scroll_pos[i] = 0; } } // ----------------------------------------------------------------------------- private String createRuleLinks(File dir, String prefix, String title, boolean candelete) { String htmldata = "

" + title + "

The RuleLoader algorithm allows CA rules to be specified in .rule files."; htmldata += " Given the rule string \"Foo\", RuleLoader will search for a file called Foo.rule"; htmldata += " in your rules folder, then in the rules folder supplied with Golly."; htmldata += "

"; htmldata += createRuleLinks(userrules, "Rules/", "Your .rule files:", true); htmldata += createRuleLinks(rulesdir, "Supplied/Rules/", "Supplied .rule files:", false); // note that we use a prefix starting with "Supplied/" so editFile can distinguish // between a user rule and a supplied rule htmldata += ""; gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } else { // replace any spaces with underscores algoname = algoname.replaceAll(" ", "_"); // display html data in supplieddir/Help/Algorithms/algoname.html String fullpath = baseapp.supplieddir.getAbsolutePath() + "/Help/Algorithms/" + algoname + ".html"; File htmlfile = new File(fullpath); if (htmlfile.exists()) { gwebview.loadUrl("file://" + fullpath); // fullpath starts with "/" } else { // should never happen String htmldata = "
Failed to find html file!
"; gwebview.loadDataWithBaseURL(null, htmldata, "text/html", "utf-8", null); } } } // ----------------------------------------------------------------------------- // called when algobutton is tapped public void doAlgo(View view) { // display pop-up menu with algorithm names PopupMenu popup = new PopupMenu(this, view); for (int id = 0; id < numalgos; id++) { String algoname = nativeGetAlgoName(id); popup.getMenu().add(Menu.NONE, id, Menu.NONE, algoname); } popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); String algoname = nativeGetAlgoName(id); if (id != algoindex && algoname.length() > 0) { // change algorithm saveScrollPosition(); algoindex = id; algobutton.setText(algoname); showAlgoHelp(); // rule needs to change if it isn't valid in new algo String currentrule = ruletext.getText().toString(); String newrule = nativeCheckRule(currentrule, algoindex); if (!newrule.equals(currentrule)) { ruletext.setText(newrule); ruletext.setSelection(ruletext.getText().length()); } } return true; } }); popup.show(); } // ----------------------------------------------------------------------------- private void checkAlgo() { // check displayed rule and show message if it's not valid in any algo, // or if the rule is valid then displayed algo might need to change String rule = ruletext.getText().toString(); if (rule.length() == 0) { // change empty rule to Life rule = "B3/S23"; ruletext.setText(rule); ruletext.setSelection(ruletext.getText().length()); } int newalgo = nativeCheckAlgo(rule, algoindex); if (newalgo == -1) { Toast.makeText(this, bad_rule, Toast.LENGTH_LONG).show(); } else if (newalgo != algoindex) { // change algorithm saveScrollPosition(); algoindex = newalgo; algobutton.setText(nativeGetAlgoName(algoindex)); showAlgoHelp(); } } // ----------------------------------------------------------------------------- // called when the Done button is tapped (not the soft keyboard's Done button) public void doDone(View view) { String rule = ruletext.getText().toString(); // no need to check for empty rule here int newalgo = nativeCheckAlgo(rule, algoindex); if (newalgo == -1) { Toast.makeText(this, bad_rule, Toast.LENGTH_LONG).show(); } else { // dismiss dialog first in case ChangeAlgorithm calls BeginProgress finish(); nativeSetRule(rule, newalgo); } } // ----------------------------------------------------------------------------- // called when the Cancel button is tapped public void doCancel(View view) { finish(); } } // RuleActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/InfoActivity.java0000644000175000017500000000607013230774246024531 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.DisplayMetrics; import android.view.View; import android.widget.TextView; public class InfoActivity extends Activity { private native String nativeGetInfo(); // the rest must NOT be static public final static String INFO_MESSAGE = "net.sf.golly.INFO"; // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.info_layout); getActionBar().hide(); String text = null; // get info sent by other activity Intent intent = getIntent(); String infoMsg = intent.getStringExtra(INFO_MESSAGE); if (infoMsg != null) { if (infoMsg.equals("native")) { text = nativeGetInfo(); } else { // read contents of supplied file into a string File file = new File(infoMsg); try { FileInputStream instream = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(instream)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n"); } text = sb.toString(); instream.close(); } catch (Exception e) { text = "Error reading file:\n" + e.toString(); } } } if (text != null) { TextView tv = (TextView) findViewById(R.id.info_text); tv.setMovementMethod(new ScrollingMovementMethod()); // above call enables vertical scrolling; // next call prevents long lines wrapping and enables horizontal scrolling tv.setHorizontallyScrolling(true); tv.setTextIsSelectable(true); tv.setText(text); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; if (dpWidth >= 600) { // use bigger font size for wide screens (layout size is 10sp) tv.setTextSize(12); } } } // ----------------------------------------------------------------------------- // called when the Cancel button is tapped public void doCancel(View view) { // return to previous activity finish(); } } // InfoActivity class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/BaseApp.java0000644000175000017500000002541013230774246023433 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayDeque; import java.util.Deque; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.res.AssetManager; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.DisplayMetrics; import android.util.Log; public class BaseApp extends Application { // see jnicalls.cpp for these native routines: private static native void nativeClassInit(); // this MUST be static private native void nativeCreate(); // the rest must NOT be static private native void nativeSetUserDirs(String path); private native void nativeSetSuppliedDirs(String prefix); private native void nativeSetTempDir(String path); private native void nativeSetScreenDensity(int dpi); private native void nativeSetWideScreen(boolean widescreen); public File userdir; // directory for user-created data public File supplieddir; // directory for supplied data // keep track of the current foreground activity private Deque activityStack = new ArrayDeque(); // ----------------------------------------------------------------------------- static { System.loadLibrary("stlport_shared"); // must agree with build.gradle System.loadLibrary("golly"); // loads libgolly.so nativeClassInit(); // caches Java method IDs } // ----------------------------------------------------------------------------- @Override public void onCreate() { super.onCreate(); DisplayMetrics metrics = getResources().getDisplayMetrics(); nativeSetScreenDensity(metrics.densityDpi); // Log.i("Golly","screen density in dpi = " + Integer.toString(metrics.densityDpi)); // eg. densityDpi = 320 on Nexus 7 DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; // Log.i("Golly","screen width in dp = " + Integer.toString(config.screenWidthDp)); // eg. on Nexus 7 screenWidthDp = 600 in portrait, 960 in landscape boolean widescreen = dpWidth >= 600; nativeSetWideScreen(widescreen); initPaths(); // sets userdir, supplieddir, etc (must be BEFORE nativeCreate) nativeCreate(); // cache this instance and initialize lots of Golly stuff this.registerActivityLifecycleCallbacks(new MyActivityLifecycleCallbacks()); } // ----------------------------------------------------------------------------- private class MyActivityLifecycleCallbacks implements ActivityLifecycleCallbacks { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityDestroyed(Activity activity) {} @Override public void onActivityPaused(Activity activity) { // MainActivity is special (singleTask) and can be called into with NewIntent if (activity instanceof MainActivity) { return; } activityStack.removeFirst(); } @Override public void onActivityResumed(Activity activity) { activityStack.addFirst(activity); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityStopped(Activity activity) {} } public Activity getCurrentActivity() { return activityStack.peekFirst(); } // ----------------------------------------------------------------------------- private void initPaths() { // check if external storage is available String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // use external storage for user's files userdir = getExternalFilesDir(null); // /mnt/sdcard/Android/data/net.sf.golly/files } else { // use internal storage for user's files userdir = getFilesDir(); // /data/data/net.sf.golly/files Log.i("Golly", "External storage is not available, so internal storage will be used."); } // create subdirs in userdir (if they don't exist) File subdir; subdir = new File(userdir, "Rules"); // for user's .rule files subdir.mkdir(); subdir = new File(userdir, "Saved"); // for saved pattern files subdir.mkdir(); subdir = new File(userdir, "Downloads"); // for downloaded files subdir.mkdir(); // set appropriate paths used by C++ code nativeSetUserDirs(userdir.getAbsolutePath()); // create a directory in internal storage for supplied Patterns/Rules/Help then // create sub-directories for each by unzipping .zip files stored in assets supplieddir = new File(getFilesDir(), "Supplied"); supplieddir.mkdir(); unzipAsset("Patterns.zip", supplieddir); unzipAsset("Rules.zip", supplieddir); unzipAsset("Help.zip", supplieddir); // supplieddir = /data/data/net.sf.golly/files/Supplied nativeSetSuppliedDirs(supplieddir.getAbsolutePath()); // set directory path for temporary files File tempdir = getCacheDir(); nativeSetTempDir(tempdir.getAbsolutePath()); // /data/data/net.sf.golly/cache } // ----------------------------------------------------------------------------- private void unzipAsset(String zipname, File destdir) { AssetManager am = getAssets(); try { ZipInputStream zipstream = new ZipInputStream(am.open(zipname)); for (ZipEntry entry = zipstream.getNextEntry(); entry != null; entry = zipstream.getNextEntry()) { File destfile = new File(destdir, entry.getName()); if (entry.isDirectory()) { // create any missing sub-directories destfile.mkdirs(); } else { // create a file final int BUFFSIZE = 8192; BufferedOutputStream buffstream = new BufferedOutputStream(new FileOutputStream(destfile), BUFFSIZE); int count = 0; byte[] data = new byte[BUFFSIZE]; while ((count = zipstream.read(data, 0, BUFFSIZE)) != -1) { buffstream.write(data, 0, count); } buffstream.flush(); buffstream.close(); } zipstream.closeEntry(); } zipstream.close(); } catch (Exception e) { Log.e("Golly", "Failed to unzip asset: " + zipname + "\nException: ", e); Warning("You probably forgot to put " + zipname + " in the assets folder!"); } } // ----------------------------------------------------------------------------- // handler for implementing modal dialogs static class LooperInterrupter extends Handler { public void handleMessage(Message msg) { throw new RuntimeException(); } } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) void Warning(String msg) { Activity currentActivity = getCurrentActivity(); if (currentActivity == null) { Log.i("Warning", "currentActivity is null!"); } // note that MainActivity might not be the current foreground activity AlertDialog.Builder alert = new AlertDialog.Builder(currentActivity); alert.setTitle("Warning"); alert.setMessage(msg); alert.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); alert.show(); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) void Fatal(String msg) { Activity currentActivity = getCurrentActivity(); // note that MainActivity might not be the current foreground activity AlertDialog.Builder alert = new AlertDialog.Builder(currentActivity); alert.setTitle("Fatal error!"); alert.setMessage(msg); alert.setNegativeButton("QUIT", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); alert.show(); System.exit(1); } // ----------------------------------------------------------------------------- private String answer; // this method is called from C++ code (see jnicalls.cpp) String YesNo(String query) { // use a handler to get a modal dialog // (this must be modal because it is used in an if test) final Handler handler = new LooperInterrupter(); Activity currentActivity = getCurrentActivity(); // note that MainActivity might not be the current foreground activity AlertDialog.Builder alert = new AlertDialog.Builder(currentActivity); alert.setTitle("A question..."); alert.setMessage(query); alert.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { answer = "yes"; dialog.cancel(); handler.sendMessage(handler.obtainMessage()); } }); alert.setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { answer = "no"; dialog.cancel(); handler.sendMessage(handler.obtainMessage()); } }); alert.show(); // loop until runtime exception is triggered try { Looper.loop(); } catch(RuntimeException re) {} return answer; } } // BaseApp class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/PatternGLSurfaceView.java0000644000175000017500000002231013145740437026120 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.graphics.PixelFormat; import android.opengl.GLSurfaceView; import android.util.AttributeSet; // import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; // this class must be public so it can be used in main_layout.xml public class PatternGLSurfaceView extends GLSurfaceView { // see jnicalls.cpp for these native routines: private native void nativeTouchBegan(int x, int y); private native void nativeTouchMoved(int x, int y); private native void nativeTouchEnded(); private native void nativeMoveMode(); private native void nativeRestoreMode(); private native void nativeZoomIn(int x, int y); private native void nativeZoomOut(int x, int y); private native void nativePause(); private native void nativeResume(); private static final int INVALID_POINTER_ID = -1; private int mActivePointerId = INVALID_POINTER_ID; private int beginx, beginy; private boolean callTouchBegan = false; // nativeTouchBegan needs to be called? private boolean multifinger = false; // are we doing multi-finger panning or zooming? private boolean zooming = false; // are we zooming? private int pancount = 0; // prevents panning changing to zooming // ----------------------------------------------------------------------------- // this stuff handles zooming in/out via two-finger pinch gestures private ScaleGestureDetector zoomDetector; private class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener { private float oldscale, newscale; private int zoomx, zoomy; @Override public boolean onScaleBegin(ScaleGestureDetector detector) { zooming = true; oldscale = 1.0f; newscale = 1.0f; // set zoom point at start of pinch zoomx = (int)detector.getFocusX(); zoomy = (int)detector.getFocusY(); // Log.i("onScaleBegin", "zoomx=" + Integer.toString(zoomx) + " zoomy=" + Integer.toString(zoomy)); return true; } @Override public boolean onScale(ScaleGestureDetector detector) { newscale *= detector.getScaleFactor(); // Log.i("onScale", "newscale=" + Float.toString(newscale) + " oldscale=" + Float.toString(oldscale)); if (newscale - oldscale < -0.1f) { // fingers moved closer, so zoom out nativeZoomOut(zoomx, zoomy); oldscale = newscale; } else if (newscale - oldscale > 0.1f) { // fingers moved apart, so zoom in nativeZoomIn(zoomx, zoomy); oldscale = newscale; } return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { // Log.i("onScaleEnd", "---"); oldscale = 1.0f; newscale = 1.0f; // don't reset zooming flag here } } // ----------------------------------------------------------------------------- public PatternGLSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); super.setEGLConfigChooser(8, 8, 8, 8, 0/*no depth*/, 0); getHolder().setFormat(PixelFormat.RGBA_8888); // avoid crash on some devices setRenderer(new PatternRenderer()); setRenderMode(RENDERMODE_WHEN_DIRTY); zoomDetector = new ScaleGestureDetector(context, new ScaleListener()); } // ----------------------------------------------------------------------------- public boolean onTouchEvent(final MotionEvent ev) { if (pancount < 4) { // check for zooming zoomDetector.onTouchEvent(ev); if (zoomDetector.isInProgress()) return true; } final int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { // Log.i("onTouchEvent", "ACTION_DOWN"); mActivePointerId = ev.getPointerId(0); beginx = (int)ev.getX(); beginy = (int)ev.getY(); callTouchBegan = true; break; } case MotionEvent.ACTION_MOVE: { // we need to test zooming flag because it's possible to get // ACTION_MOVE after ACTION_POINTER_UP (and after onScaleEnd) if (mActivePointerId != INVALID_POINTER_ID && !zooming) { int pointerIndex = ev.findPointerIndex(mActivePointerId); int x = (int)ev.getX(pointerIndex); int y = (int)ev.getY(pointerIndex); if (callTouchBegan) { nativeTouchBegan(beginx, beginy); callTouchBegan = false; } if (multifinger && ev.getPointerCount() == 1) { // there is only one pointer down so best not to move } else { nativeTouchMoved(x, y); } if (multifinger) { pancount++; } // Log.i("onTouchEvent", "ACTION_MOVE" + " deltax=" + Integer.toString(x - beginx) + // " deltay=" + Integer.toString(y - beginy)); } break; } case MotionEvent.ACTION_UP: { // Log.i("onTouchEvent", "ACTION_UP"); mActivePointerId = INVALID_POINTER_ID; if (callTouchBegan) { nativeTouchBegan(beginx, beginy); callTouchBegan = false; } nativeTouchEnded(); if (multifinger) { nativeRestoreMode(); multifinger = false; } pancount = 0; zooming = false; break; } case MotionEvent.ACTION_CANCEL: { // Log.i("onTouchEvent", "ACTION_CANCEL"); mActivePointerId = INVALID_POINTER_ID; if (callTouchBegan) { nativeTouchBegan(beginx, beginy); callTouchBegan = false; } nativeTouchEnded(); if (multifinger) { nativeRestoreMode(); multifinger = false; } pancount = 0; zooming = false; break; } case MotionEvent.ACTION_POINTER_DOWN: { // Log.i("onTouchEvent", "ACTION_POINTER_DOWN"); // another pointer has gone down if (callTouchBegan) { // ACTION_DOWN has been seen but no ACTION_MOVE as yet, // so switch to panning mode (which might become zooming) nativeMoveMode(); multifinger = true; } break; } case MotionEvent.ACTION_POINTER_UP: { // Log.i("onTouchEvent", "ACTION_POINTER_UP"); // a pointer has gone up (but another pointer is still down) final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final int pointerId = ev.getPointerId(pointerIndex); if (pointerId == mActivePointerId) { // this was our active pointer going up so choose a new active pointer final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mActivePointerId = ev.getPointerId(newPointerIndex); } break; } } return true; } // ----------------------------------------------------------------------------- @Override public void onPause() { super.onPause(); nativePause(); } // ----------------------------------------------------------------------------- @Override public void onResume() { super.onResume(); nativeResume(); } } // PatternGLSurfaceView class // ================================================================================= class PatternRenderer implements GLSurfaceView.Renderer { // see jnicalls.cpp for these native routines: private native void nativeInit(); private native void nativeResize(int w, int h); private native void nativeRender(); // ----------------------------------------------------------------------------- public void onSurfaceCreated(GL10 unused, EGLConfig config) { nativeInit(); } // ----------------------------------------------------------------------------- public void onSurfaceChanged(GL10 unused, int w, int h) { nativeResize(w, h); } // ----------------------------------------------------------------------------- public void onDrawFrame(GL10 unused) { nativeRender(); } } // PatternRenderer class golly-3.3-src/gui-android/Golly/app/src/main/java/net/sf/golly/MainActivity.java0000644000175000017500000015060313230774246024524 00000000000000// This file is part of Golly. // See docs/License.html for the copyright notice. package net.sf.golly; import java.io.File; import android.app.Activity; import android.app.AlertDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.graphics.Typeface; import android.media.AudioManager; import android.media.ToneGenerator; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.MessageQueue; import android.text.InputType; import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends Activity { // see jnicalls.cpp for these native routines: private static native void nativeClassInit(); // this MUST be static private native void nativeCreate(); // the rest must NOT be static private native void nativeDestroy(); private native void nativeStartGenerating(); private native void nativeStopGenerating(); private native void nativeStopBeforeNew(); private native void nativePauseGenerating(); private native void nativeResumeGenerating(); private native void nativeResetPattern(); private native void nativeUndo(); private native void nativeRedo(); private native boolean nativeCanReset(); private native boolean nativeAllowUndo(); private native boolean nativeCanUndo(); private native boolean nativeCanRedo(); private native boolean nativeInfoAvailable(); private native boolean nativeIsGenerating(); private native int nativeGetStatusColor(); private native String nativeGetStatusLine(int line); private native String nativeGetPasteMode(); private native String nativeGetRandomFill(); private native void nativeNewPattern(); private native void nativeFitPattern(); private native void nativeGenerate(); private native void nativeStep(); private native void nativeStep1(); private native void nativeFaster(); private native void nativeSlower(); private native void nativeScale1to1(); private native void nativeBigger(); private native void nativeSmaller(); private native void nativeMiddle(); private native void nativeSetMode(int mode); private native int nativeGetMode(); private native int nativeCalculateSpeed(); private native int nativeNumLayers(); private native boolean nativePasteExists(); private native boolean nativeSelectionExists(); private native void nativePaste(); private native void nativeSelectAll(); private native void nativeRemoveSelection(); private native void nativeCutSelection(); private native void nativeCopySelection(); private native void nativeClearSelection(int inside); private native void nativeShrinkSelection(); private native void nativeFitSelection(); private native void nativeRandomFill(); private native void nativeFlipSelection(int y); private native void nativeRotateSelection(int clockwise); private native void nativeAdvanceSelection(int inside); private native void nativeAbortPaste(); private native void nativeDoPaste(int toselection); private native void nativeFlipPaste(int y); private native void nativeRotatePaste(int clockwise); private native void nativeClearMessage(); private native String nativeGetValidExtensions(); private native boolean nativeValidExtension(String filename); private native boolean nativeFileExists(String filename); private native void nativeSavePattern(String filename); private native void nativeOpenFile(String filepath); private native void nativeSetFullScreen(boolean fullscreen); private native void nativeChangeRule(String rule); private native void nativeLexiconPattern(String pattern); private native int nativeDrawingState(); // local fields: private static boolean fullscreen = false; // in full screen mode? private boolean widescreen; // use different layout for wide screens? private Button ssbutton; // Start/Stop button private Button resetbutton; // Reset button (used if wide screen) private Button undobutton; // Undo button private Button redobutton; // Redo button private Button editbutton; // Edit/Paste button private Button statebutton; // button to change drawing state private Button modebutton; // Draw/Pick/Select/Move button private Button drawbutton; // Draw button (used if wide screen) private Button pickbutton; // Pick button (used if wide screen) private Button selectbutton; // Select button (used if wide screen) private Button movebutton; // Move button (used if wide screen) private Button infobutton; // Info button private Button restorebutton; // Restore button private TextView status1, status2, status3; // status bar has 3 lines private int statuscolor = 0xFF000000; // background color of status bar private PatternGLSurfaceView pattView; // OpenGL ES is used to draw patterns private Handler genhandler; // for generating patterns private Runnable generate; // code started/stopped by genhandler private int geninterval; // interval between nativeGenerate calls (in millisecs) private Handler callhandler; // for calling a method again private Runnable callagain; // code that calls method private String methodname; // name of method to call private View currview; // current view parameter private MenuItem curritem; // current menu item parameter private PopupMenu popup; // used for all pop-up menus private boolean stopped = true; // generating is stopped? // ----------------------------------------------------------------------------- // this stuff is used to display a progress bar: private static boolean cancelProgress = false; // cancel progress dialog? private static long progstart, prognext; // for progress timing private static int progresscount = 0; // if > 0 then BeginProgress has been called private TextView progtitle; // title above progress bar private ProgressBar progbar; // progress bar private LinearLayout proglayout; // view containing progress bar // ----------------------------------------------------------------------------- // this stuff is used in other activities: public final static String OPENFILE_MESSAGE = "net.sf.golly.OPENFILE"; public final static String RULE_MESSAGE = "net.sf.golly.RULE"; public final static String LEXICON_MESSAGE = "net.sf.golly.LEXICON"; // ----------------------------------------------------------------------------- // the following stuff allows time consuming code (like nativeGenerate) to periodically // check if any user events need to be processed, but without blocking the UI thread // (thanks to http://stackoverflow.com/questions/4994263/how-can-i-do-non-blocking-events-processing-on-android) private boolean processingevents = false; private Handler evthandler = null; private Runnable doevents = new Runnable() { public void run() { Looper looper = Looper.myLooper(); looper.quit(); evthandler.removeCallbacks(this); evthandler = null; } }; private class IdleHandler implements MessageQueue.IdleHandler { private Looper idlelooper; protected IdleHandler(Looper looper) { idlelooper = looper; } public boolean queueIdle() { evthandler = new Handler(idlelooper); evthandler.post(doevents); return(false); } }; // this method is called from C++ code (see jnicalls.cpp) private void CheckMessageQueue() { // process any pending UI events in message queue if (!processingevents) { Looper looper = Looper.myLooper(); looper.myQueue().addIdleHandler(new IdleHandler(looper)); processingevents = true; try { looper.loop(); } catch (RuntimeException re) { // looper.quit() in doevents causes an exception } processingevents = false; } } // ----------------------------------------------------------------------------- static { nativeClassInit(); // caches Java method IDs } // ----------------------------------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Log.i("Golly","screen density in dpi = " + Integer.toString(metrics.densityDpi)); // eg. densityDpi = 320 on Nexus 7 DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float dpWidth = displayMetrics.widthPixels / displayMetrics.density; // Log.i("Golly","screen width in dp = " + Integer.toString(config.screenWidthDp)); // eg. on Nexus 7 screenWidthDp = 600 in portrait, 960 in landscape widescreen = dpWidth >= 600; if (widescreen) { // use a layout that has more buttons setContentView(R.layout.main_layout_wide); resetbutton = (Button) findViewById(R.id.reset); drawbutton = (Button) findViewById(R.id.drawmode); pickbutton = (Button) findViewById(R.id.pickmode); selectbutton = (Button) findViewById(R.id.selectmode); movebutton = (Button) findViewById(R.id.movemode); if (dpWidth >= 800) { // show nicer text in some buttons ((Button) findViewById(R.id.slower)).setText("Slower"); ((Button) findViewById(R.id.faster)).setText("Faster"); ((Button) findViewById(R.id.smaller)).setText("Smaller"); ((Button) findViewById(R.id.scale1to1)).setText("Scale=1:1"); ((Button) findViewById(R.id.bigger)).setText("Bigger"); ((Button) findViewById(R.id.middle)).setText("Middle"); } } else { // screen isn't wide enough to have all the buttons we'd like setContentView(R.layout.main_layout); modebutton = (Button) findViewById(R.id.touchmode); } // following stuff is used in both layouts ssbutton = (Button) findViewById(R.id.startstop); undobutton = (Button) findViewById(R.id.undo); redobutton = (Button) findViewById(R.id.redo); editbutton = (Button) findViewById(R.id.edit); statebutton = (Button) findViewById(R.id.state); infobutton = (Button) findViewById(R.id.info); restorebutton = (Button) findViewById(R.id.restore); status1 = (TextView) findViewById(R.id.status1); status2 = (TextView) findViewById(R.id.status2); status3 = (TextView) findViewById(R.id.status3); progbar = (ProgressBar) findViewById(R.id.progress_bar); proglayout = (LinearLayout) findViewById(R.id.progress_layout); progtitle = (TextView) findViewById(R.id.progress_title); nativeCreate(); // must be called every time (to cache this instance) // this will call the PatternGLSurfaceView constructor pattView = (PatternGLSurfaceView) findViewById(R.id.patternview); restorebutton.setVisibility(View.INVISIBLE); proglayout.setVisibility(LinearLayout.INVISIBLE); // create handler and runnable for generating patterns geninterval = nativeCalculateSpeed(); genhandler = new Handler(); generate = new Runnable() { public void run() { if (!stopped) { nativeGenerate(); genhandler.postDelayed(this, geninterval); // nativeGenerate will be called again after given interval } } }; // create handler and runnable for calling a method again when the user // invokes certain events while the next generation is being calculated callhandler = new Handler(); callagain = new Runnable() { public void run() { if (methodname.equals("doStartStop")) doStartStop(currview); else if (methodname.equals("doStep")) doStep(currview); else if (methodname.equals("doNew")) doNewPattern(currview); else if (methodname.equals("doUndo")) doUndo(currview); else if (methodname.equals("doRedo")) doRedo(currview); else if (methodname.equals("doRule")) doRule(currview); else if (methodname.equals("doInfo")) doInfo(currview); else if (methodname.equals("doSave")) doSave(currview); else if (methodname.equals("doReset")) doReset(currview); else if (methodname.equals("doPaste")) doPaste(currview); else if (methodname.equals("doSelItem")) doSelectionItem(curritem); else // string mismatch Log.e("Fix callagain", methodname); } }; } // ----------------------------------------------------------------------------- @Override protected void onNewIntent(Intent intent) { // check for messages sent by other activities String filepath = intent.getStringExtra(OPENFILE_MESSAGE); if (filepath != null) { nativeOpenFile(filepath); } String rule = intent.getStringExtra(RULE_MESSAGE); if (rule != null) { nativeChangeRule(rule); } String pattern = intent.getStringExtra(LEXICON_MESSAGE); if (pattern != null) { nativeLexiconPattern(pattern); } } // ----------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // add main.xml items to the action bar getMenuInflater().inflate(R.menu.main, menu); return true; } // ----------------------------------------------------------------------------- @Override public boolean onOptionsItemSelected(MenuItem item) { // action bar item has been tapped nativeClearMessage(); Intent intent; switch (item.getItemId()) { case R.id.open: intent = new Intent(this, OpenActivity.class); startActivity(intent); return true; case R.id.settings: intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; case R.id.help: intent = new Intent(this, HelpActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } // ----------------------------------------------------------------------------- @Override protected void onPause() { super.onPause(); pattView.onPause(); stopped = true; } // ----------------------------------------------------------------------------- @Override protected void onResume() { super.onResume(); pattView.onResume(); if (fullscreen) { fullscreen = false; // following will set it true toggleFullScreen(null); } else { updateButtons(); UpdateEditBar(); } if (nativeIsGenerating()) { stopped = false; genhandler.post(generate); } } // ----------------------------------------------------------------------------- @Override protected void onDestroy() { stopped = true; // should have been done in OnPause, but play safe nativeDestroy(); super.onDestroy(); } // ----------------------------------------------------------------------------- private void deleteTempFiles() { File dir = getCacheDir(); File[] files = dir.listFiles(); if (files != null) { for (File file : files) { if (file.getName().startsWith("GET-") || file.getName().endsWith(".html")) { // don't delete files created via "get:" links in HelpActivity } else { file.delete(); } } } } // ----------------------------------------------------------------------------- private void updateButtons() { if (fullscreen) return; if (nativeIsGenerating()) { ssbutton.setText("Stop"); ssbutton.setTextColor(Color.rgb(255,0,0)); if (widescreen) resetbutton.setEnabled(true); undobutton.setEnabled(nativeAllowUndo()); redobutton.setEnabled(false); } else { ssbutton.setText("Start"); ssbutton.setTextColor(Color.rgb(0,255,0)); if (widescreen) resetbutton.setEnabled(nativeCanReset()); undobutton.setEnabled(nativeAllowUndo() && (nativeCanReset() || nativeCanUndo())); redobutton.setEnabled(nativeCanRedo()); } infobutton.setEnabled(nativeInfoAvailable()); } // ----------------------------------------------------------------------------- private void updateGeneratingSpeed() { geninterval = nativeCalculateSpeed(); genhandler.removeCallbacks(generate); stopped = false; if (nativeIsGenerating()) genhandler.post(generate); } // ----------------------------------------------------------------------------- private boolean callAgainAfterDelay(String callname, View view, MenuItem item) { if (processingevents) { // CheckMessageQueue has been called inside a (possibly) lengthy task // so call the given method again after a short delay methodname = callname; if (view != null) currview = view; if (item != null) curritem = item; callhandler.postDelayed(callagain, 5); // call after 5 millisecs return true; } else { return false; } } // ----------------------------------------------------------------------------- // called when the Start/Stop button is tapped public void doStartStop(View view) { nativeClearMessage(); if (callAgainAfterDelay("doStartStop", view, null)) return; if (nativeIsGenerating()) { // stop calling nativeGenerate stopped = true; nativeStopGenerating(); } else { nativeStartGenerating(); // nativeIsGenerating() might still be false (eg. if pattern is empty) if (nativeIsGenerating()) { // start calling nativeGenerate geninterval = nativeCalculateSpeed(); genhandler.removeCallbacks(generate); // probably unnecessary here but play safe stopped = false; genhandler.post(generate); } } updateButtons(); } // ----------------------------------------------------------------------------- private void stopIfGenerating() { if (nativeIsGenerating()) { // note that genhandler.removeCallbacks(generate) doesn't always work if // processingevents is true, so we use a global flag to start/stop // making calls to nativeGenerate stopped = true; nativeStopGenerating(); } } // ----------------------------------------------------------------------------- // called when the Step button is tapped public void doStep(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doStep", view, null)) return; nativeStep(); updateButtons(); } // ----------------------------------------------------------------------------- // called when the Slower button is tapped public void doSlower(View view) { nativeClearMessage(); nativeSlower(); updateGeneratingSpeed(); } // ----------------------------------------------------------------------------- // called when the Step=1 button is tapped public void doStep1(View view) { nativeClearMessage(); nativeStep1(); updateGeneratingSpeed(); } // ----------------------------------------------------------------------------- // called when the Faster button is tapped public void doFaster(View view) { nativeClearMessage(); nativeFaster(); updateGeneratingSpeed(); } // ----------------------------------------------------------------------------- // called when the Reset button is tapped public void doReset(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doReset", view, null)) return; nativeResetPattern(); updateButtons(); } // ----------------------------------------------------------------------------- // called when the Control button is tapped public void doControl(View view) { nativeClearMessage(); // display pop-up menu with these items: Step=1, Faster, Slower, Reset popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.control_menu, popup.getMenu()); popup.show(); } // ----------------------------------------------------------------------------- // called when item from control_menu is selected public void doControlItem(MenuItem item) { if (item.getItemId() == R.id.reset) { stopIfGenerating(); if (callAgainAfterDelay("doReset", null, item)) return; } popup.dismiss(); switch (item.getItemId()) { case R.id.step1: nativeStep1(); break; case R.id.faster: nativeFaster(); break; case R.id.slower: nativeSlower(); break; case R.id.reset: nativeResetPattern(); break; default: Log.e("Golly","Fix bug in doControlItem!"); } if (item.getItemId() == R.id.reset) { updateButtons(); } else { updateGeneratingSpeed(); } } // ----------------------------------------------------------------------------- // called when the Fit button is tapped public void doFitPattern(View view) { nativeClearMessage(); nativeFitPattern(); } // ----------------------------------------------------------------------------- // called when the Smaller button is tapped public void doSmaller(View view) { nativeClearMessage(); nativeSmaller(); } // ----------------------------------------------------------------------------- // called when the Scale=1:1 button is tapped public void doScale1to1(View view) { nativeClearMessage(); nativeScale1to1(); } // ----------------------------------------------------------------------------- // called when the Bigger button is tapped public void doBigger(View view) { nativeClearMessage(); nativeBigger(); } // ----------------------------------------------------------------------------- // called when the Middle button is tapped public void doMiddle(View view) { nativeClearMessage(); nativeMiddle(); } // ----------------------------------------------------------------------------- // called when the View button is tapped public void doView(View view) { nativeClearMessage(); // display pop-up menu with these items: Scale=1:1, Bigger, Smaller, Middle popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.view_menu, popup.getMenu()); popup.show(); } // ----------------------------------------------------------------------------- // called when item from view_menu is selected public void doViewItem(MenuItem item) { popup.dismiss(); switch (item.getItemId()) { case R.id.scale1to1: nativeScale1to1(); break; case R.id.bigger: nativeBigger(); break; case R.id.smaller: nativeSmaller(); break; case R.id.middle: nativeMiddle(); break; default: Log.e("Golly","Fix bug in doViewItem!"); } } // ----------------------------------------------------------------------------- // called when the Undo button is tapped public void doUndo(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doUndo", view, null)) return; nativeUndo(); updateButtons(); } // ----------------------------------------------------------------------------- // called when the Redo button is tapped public void doRedo(View view) { nativeClearMessage(); // nativeIsGenerating() should never be true here if (callAgainAfterDelay("doRedo", view, null)) return; nativeRedo(); updateButtons(); } // ----------------------------------------------------------------------------- // called when the All button is tapped public void doSelectAll(View view) { nativeClearMessage(); nativeSelectAll(); UpdateEditBar(); } // ----------------------------------------------------------------------------- private void createSelectionMenu(MenuInflater inflater) { Menu menu = popup.getMenu(); inflater.inflate(R.menu.selection_menu, menu); MenuItem item = menu.findItem(R.id.random); item.setTitle("Random Fill (" + nativeGetRandomFill() + "%)"); if (widescreen) { // delete the top 2 items menu.removeItem(R.id.paste); menu.removeItem(R.id.all); } } // ----------------------------------------------------------------------------- // called when the Edit button is tapped (widescreen is true) public void doEdit(View view) { nativeClearMessage(); if (nativeSelectionExists()) { popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); createSelectionMenu(inflater); popup.show(); } else { // editbutton should be disabled if there's no selection Log.e("Golly","Bug detected in doEdit!"); } } // ----------------------------------------------------------------------------- private void createPasteMenu(MenuInflater inflater) { Menu menu = popup.getMenu(); inflater.inflate(R.menu.paste_menu, menu); MenuItem item = menu.findItem(R.id.pastesel); item.setEnabled(nativeSelectionExists()); item = menu.findItem(R.id.pastemode); item.setTitle("Paste (" + nativeGetPasteMode() + ")"); if (nativeIsGenerating()) { // probably best to stop generating when Paste button is tapped // (consistent with iOS Golly) stopped = true; nativeStopGenerating(); updateButtons(); } } // ----------------------------------------------------------------------------- // called when the Paste button is tapped (widescreen is true) public void doPaste(View view) { nativeClearMessage(); if (nativePasteExists()) { // show pop-up menu with various paste options popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); createPasteMenu(inflater); popup.show(); } else { // create the paste image stopIfGenerating(); if (callAgainAfterDelay("doPaste", view, null)) return; nativePaste(); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // called when the Edit/Paste button is tapped (widescreen is false) public void doEditPaste(View view) { nativeClearMessage(); // display pop-up menu with items that depend on whether a selection or paste image exists popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); if (nativePasteExists()) { createPasteMenu(inflater); } else if (nativeSelectionExists()) { createSelectionMenu(inflater); } else { inflater.inflate(R.menu.edit_menu, popup.getMenu()); } popup.show(); } // ----------------------------------------------------------------------------- // called when item from edit_menu is selected public void doEditItem(MenuItem item) { if (item.getItemId() == R.id.paste) { stopIfGenerating(); if (callAgainAfterDelay("doPaste", null, item)) return; } popup.dismiss(); switch (item.getItemId()) { case R.id.paste: nativePaste(); break; case R.id.all: nativeSelectAll(); break; default: Log.e("Golly","Fix bug in doEditItem!"); } UpdateEditBar(); } // ----------------------------------------------------------------------------- // called when item from selection_menu is selected public void doSelectionItem(MenuItem item) { if (item.getItemId() != R.id.remove && item.getItemId() != R.id.copy && item.getItemId() != R.id.shrink && item.getItemId() != R.id.fitsel) { // item can modify the current pattern so we must stop generating, // but nicer if we only stop temporarily and resume when done if (nativeIsGenerating()) { // no need to set stopped = true nativePauseGenerating(); } if (callAgainAfterDelay("doSelItem", null, item)) return; } popup.dismiss(); switch (item.getItemId()) { // doEditItem handles the top 2 items (if widescreen is false) // case R.id.paste: nativePaste(); break; // case R.id.all: nativeSelectAll(); break; case R.id.remove: nativeRemoveSelection(); break; case R.id.cut: nativeCutSelection(); break; case R.id.copy: nativeCopySelection(); break; case R.id.clear: nativeClearSelection(1); break; case R.id.clearo: nativeClearSelection(0); break; case R.id.shrink: nativeShrinkSelection(); break; case R.id.fitsel: nativeFitSelection(); break; case R.id.random: nativeRandomFill(); break; case R.id.flipy: nativeFlipSelection(1); break; case R.id.flipx: nativeFlipSelection(0); break; case R.id.rotatec: nativeRotateSelection(1); break; case R.id.rotatea: nativeRotateSelection(0); break; case R.id.advance: nativeAdvanceSelection(1); break; case R.id.advanceo: nativeAdvanceSelection(0); break; default: Log.e("Golly","Fix bug in doSelectionItem!"); } // resume generating (only if nativePauseGenerating was called) nativeResumeGenerating(); } // ----------------------------------------------------------------------------- // called when item from paste_menu is selected public void doPasteItem(MenuItem item) { popup.dismiss(); switch (item.getItemId()) { case R.id.abort: nativeAbortPaste(); break; case R.id.pastemode: nativeDoPaste(0); break; case R.id.pastesel: nativeDoPaste(1); break; case R.id.pflipy: nativeFlipPaste(1); break; case R.id.pflipx: nativeFlipPaste(0); break; case R.id.protatec: nativeRotatePaste(1); break; case R.id.protatea: nativeRotatePaste(0); break; default: Log.e("Golly","Fix bug in doPasteItem!"); } UpdateEditBar(); } // ----------------------------------------------------------------------------- // called when the Draw/Pick/Select/Move button is tapped public void doSetTouchMode(View view) { nativeClearMessage(); // display pop-up menu with these items: Draw, Pick, Select, Move popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.mode_menu, popup.getMenu()); popup.show(); } // ----------------------------------------------------------------------------- // called when item from mode_menu is selected public void doModeItem(MenuItem item) { popup.dismiss(); switch (item.getItemId()) { case R.id.draw: nativeSetMode(0); break; case R.id.pick: nativeSetMode(1); break; case R.id.select: nativeSetMode(2); break; case R.id.move: nativeSetMode(3); break; default: Log.e("Golly","Fix bug in doModeItem!"); } UpdateEditBar(); // update modebutton text } // ----------------------------------------------------------------------------- // called when the Draw button is tapped public void doDrawMode(View view) { nativeClearMessage(); if (nativeGetMode() != 0) { nativeSetMode(0); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // called when the Pick button is tapped public void doPickMode(View view) { nativeClearMessage(); if (nativeGetMode() != 1) { nativeSetMode(1); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // called when the Select button is tapped public void doSelectMode(View view) { nativeClearMessage(); if (nativeGetMode() != 2) { nativeSetMode(2); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // called when the Move button is tapped public void doMoveMode(View view) { nativeClearMessage(); if (nativeGetMode() != 3) { nativeSetMode(3); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // called when the state button is tapped public void doChangeState(View view) { nativeClearMessage(); // let user change the current drawing state Intent intent = new Intent(this, StateActivity.class); startActivity(intent); } // ----------------------------------------------------------------------------- // called when the New button is tapped public void doNewPattern(View view) { nativeClearMessage(); // stopIfGenerating() would work here but we use smarter code that // avoids trying to save the current pattern (potentially very large) if (nativeIsGenerating()) { stopped = true; nativeStopBeforeNew(); } if (callAgainAfterDelay("doNew", view, null)) return; nativeNewPattern(); updateButtons(); UpdateEditBar(); if (nativeNumLayers() == 1) { // delete all files in tempdir deleteTempFiles(); } } // ----------------------------------------------------------------------------- // called when the Rule button is tapped public void doRule(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doRule", view, null)) return; // let user change the current rule and/or algorithm Intent intent = new Intent(this, RuleActivity.class); startActivity(intent); } // ----------------------------------------------------------------------------- // called when the Info button is tapped public void doInfo(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doInfo", view, null)) return; // display any comments in current pattern file Intent intent = new Intent(this, InfoActivity.class); intent.putExtra(InfoActivity.INFO_MESSAGE, "native"); startActivity(intent); } // ----------------------------------------------------------------------------- // called when the Save button is tapped public void doSave(View view) { nativeClearMessage(); stopIfGenerating(); if (callAgainAfterDelay("doSave", view, null)) return; AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Save current pattern"); alert.setMessage("Valid file name extensions are\n" + nativeGetValidExtensions()); // or use radio buttons as in iPad Golly??? // might be better to create a new SaveActivity and make it appear in a dialog // by setting its theme to Theme.Holo.Dialog in the manifest element // use an EditText view to get filename final EditText input = new EditText(this); input.setSingleLine(true); input.setHint("enter a file name"); input.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); alert.setView(input); alert.setPositiveButton("SAVE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // do nothing here (see below) } }); alert.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); // don't call alert.show() here -- instead we use the following stuff // which allows us to prevent the alert dialog from closing if the // given file name is invalid final AlertDialog dialog = alert.create(); dialog.show(); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener( new View.OnClickListener() { public void onClick(View v) { String filename = input.getText().toString(); if (filename.length() == 0) { PlayBeepSound(); return; } BaseApp baseapp = (BaseApp)getApplicationContext(); // check for valid extension if (!nativeValidExtension(filename)) { baseapp.Warning("Invalid file extension."); return; } // check if given file already exists if (nativeFileExists(filename)) { String answer = baseapp.YesNo("A file with that name already exists. Do you want to replace that file?"); if (answer.equals("no")) return; } // dismiss dialog first in case SavePattern calls BeginProgress dialog.dismiss(); nativeSavePattern(filename); } }); } // ----------------------------------------------------------------------------- // called when the Full/Restore button is tapped public void toggleFullScreen(View view) { // no need to call nativeClearMessage() LinearLayout topbar = (LinearLayout) findViewById(R.id.top_bar); LinearLayout editbar = (LinearLayout) findViewById(R.id.edit_bar); RelativeLayout bottombar = (RelativeLayout) findViewById(R.id.bottom_bar); if (fullscreen) { fullscreen = false; restorebutton.setVisibility(View.INVISIBLE); status1.setVisibility(View.VISIBLE); status2.setVisibility(View.VISIBLE); status3.setVisibility(View.VISIBLE); topbar.setVisibility(LinearLayout.VISIBLE); editbar.setVisibility(LinearLayout.VISIBLE); bottombar.setVisibility(RelativeLayout.VISIBLE); getActionBar().show(); } else { fullscreen = true; restorebutton.setVisibility(View.VISIBLE); status1.setVisibility(View.GONE); status2.setVisibility(View.GONE); status3.setVisibility(View.GONE); topbar.setVisibility(LinearLayout.GONE); editbar.setVisibility(LinearLayout.GONE); bottombar.setVisibility(RelativeLayout.GONE); getActionBar().hide(); } // need to let native code know (this will update status bar if not fullscreen) nativeSetFullScreen(fullscreen); if (!fullscreen) { updateButtons(); UpdateEditBar(); } } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void StartMainActivity() { Intent intent = new Intent(this, MainActivity.class); startActivity(intent); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void RefreshPattern() { // this can be called from any thread pattView.requestRender(); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void ShowStatusLines() { // no need to check fullscreen flag here (caller checks it) // this might be called from a non-UI thread runOnUiThread(new Runnable() { public void run() { int bgcolor = nativeGetStatusColor(); if (statuscolor != bgcolor) { // change background color of status lines statuscolor = bgcolor; status1.setBackgroundColor(statuscolor); status2.setBackgroundColor(statuscolor); status3.setBackgroundColor(statuscolor); } status1.setText(nativeGetStatusLine(1)); status2.setText(nativeGetStatusLine(2)); status3.setText(nativeGetStatusLine(3)); } }); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void UpdateEditBar() { if (fullscreen) return; // this might be called from a non-UI thread runOnUiThread(new Runnable() { public void run() { undobutton.setEnabled(nativeCanUndo()); redobutton.setEnabled(nativeCanRedo()); // update Edit button if (widescreen) { editbutton.setEnabled(nativeSelectionExists()); } else { if (nativePasteExists()) { editbutton.setText("Paste"); } else { editbutton.setText("Edit"); } } // show current drawing state statebutton.setText("State=" + Integer.toString(nativeDrawingState())); // show current touch mode if (widescreen) { drawbutton.setTypeface(Typeface.DEFAULT); pickbutton.setTypeface(Typeface.DEFAULT); selectbutton.setTypeface(Typeface.DEFAULT); movebutton.setTypeface(Typeface.DEFAULT); drawbutton.setTextColor(Color.rgb(0,0,0)); pickbutton.setTextColor(Color.rgb(0,0,0)); selectbutton.setTextColor(Color.rgb(0,0,0)); movebutton.setTextColor(Color.rgb(0,0,0)); switch (nativeGetMode()) { case 0: drawbutton.setTypeface(Typeface.DEFAULT_BOLD); drawbutton.setTextColor(Color.rgb(0,0,255)); break; case 1: pickbutton.setTypeface(Typeface.DEFAULT_BOLD); pickbutton.setTextColor(Color.rgb(0,0,255)); break; case 2: selectbutton.setTypeface(Typeface.DEFAULT_BOLD); selectbutton.setTextColor(Color.rgb(0,0,255)); break; case 3: movebutton.setTypeface(Typeface.DEFAULT_BOLD); movebutton.setTextColor(Color.rgb(0,0,255)); break; default: Log.e("Golly","Fix bug in UpdateEditBar!"); } } else { switch (nativeGetMode()) { case 0: modebutton.setText("Draw"); break; case 1: modebutton.setText("Pick"); break; case 2: modebutton.setText("Select"); break; case 3: modebutton.setText("Move"); break; default: Log.e("Golly","Fix bug in UpdateEditBar!"); } } } }); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void PlayBeepSound() { ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); if (tg != null) { tg.startTone(ToneGenerator.TONE_PROP_BEEP); tg.release(); } } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void RemoveFile(String filepath) { File file = new File(filepath); if (!file.delete()) { Log.e("RemoveFile failed", filepath); } } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private String MoveFile(String oldpath, String newpath) { String result = ""; File oldfile = new File(oldpath); File newfile = new File(newpath); if (!oldfile.renameTo(newfile)) { Log.e("MoveFile failed: old", oldpath); Log.e("MoveFile failed: new", newpath); result = "MoveFile failed"; } return result; } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void CopyTextToClipboard(String text) { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("RLE data", text); clipboard.setPrimaryClip(clip); // Log.i("CopyTextToClipboard", text); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private String GetTextFromClipboard() { BaseApp baseapp = (BaseApp)getApplicationContext(); ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); String text = ""; if (clipboard.hasPrimaryClip()) { ClipData clipData = clipboard.getPrimaryClip(); text = clipData.getItemAt(0).coerceToText(this).toString(); if (text.length() == 0) { baseapp.Warning("Failed to get text from clipboard!"); } } // Log.i("GetTextFromClipboard", text); return text; } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void ShowTextFile(String filepath) { BaseApp baseapp = (BaseApp)getApplicationContext(); // display file contents Intent intent = new Intent(baseapp.getCurrentActivity(), InfoActivity.class); intent.putExtra(InfoActivity.INFO_MESSAGE, filepath); startActivity(intent); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void ShowHelp(String filepath) { Intent intent = new Intent(this, HelpActivity.class); intent.putExtra(HelpActivity.SHOWHELP_MESSAGE, filepath); startActivity(intent); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void BeginProgress(String title) { if (progresscount == 0) { // can we disable interaction with all views outside proglayout??? progtitle.setText(title); progbar.setProgress(0); // proglayout.setVisibility(LinearLayout.VISIBLE); cancelProgress = false; progstart = System.nanoTime(); } progresscount++; // handles nested calls } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private boolean AbortProgress(int percentage, String message) { if (progresscount <= 0) { Log.e("Golly","Bug detected in AbortProgress!"); return true; } long nanosecs = System.nanoTime() - progstart; if (proglayout.getVisibility() == LinearLayout.VISIBLE) { if (nanosecs < prognext) return false; prognext = nanosecs + 100000000L; // update progress bar about 10 times per sec updateProgressBar(percentage); return cancelProgress; } else { // note that percentage is not always an accurate estimator for how long // the task will take, especially when we use nextcell for cut/copy if ( (nanosecs > 1000000000L && percentage < 30) || nanosecs > 2000000000L ) { // task is probably going to take a while so show progress bar proglayout.setVisibility(LinearLayout.VISIBLE); updateProgressBar(percentage); } prognext = nanosecs + 10000000L; // 0.01 sec delay until 1st progress update } return false; } // ----------------------------------------------------------------------------- private void updateProgressBar(int percentage) { if (percentage < 0 || percentage > 100) return; progbar.setProgress(percentage); CheckMessageQueue(); } // ----------------------------------------------------------------------------- // this method is called from C++ code (see jnicalls.cpp) private void EndProgress() { if (progresscount <= 0) { Log.e("Golly","Bug detected in EndProgress!"); return; } progresscount--; if (progresscount == 0) { proglayout.setVisibility(LinearLayout.INVISIBLE); } } // ----------------------------------------------------------------------------- // called when the Cancel button is tapped public void doCancel(View view) { cancelProgress = true; } } // MainActivity class golly-3.3-src/gui-android/Golly/app/src/main/res/0000755000175000017500000000000013543257425016661 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/res/values/0000755000175000017500000000000013543257427020162 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/res/values/strings.xml0000644000175000017500000000015512651666400022310 00000000000000 Golly golly-3.3-src/gui-android/Golly/app/src/main/res/values/dimens.xml0000644000175000017500000000032512651666400022075 00000000000000 16dp 16dp golly-3.3-src/gui-android/Golly/app/src/main/res/values/styles.xml0000644000175000017500000000125012651666400022137 00000000000000 golly-3.3-src/gui-android/Golly/app/src/main/res/drawable-xhdpi/0000755000175000017500000000000013543257427021556 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/res/drawable-xhdpi/ic_launcher.png0000644000175000017500000001524012651666400024454 00000000000000‰PNG  IHDR``â˜w8gIDATx^í]XTWþgèEPö[T¬AEÅ öšˆ-š1ÉfM²kM1qÓMÛ˜ØcD£FÅ*h¬AEKTD* ½Ìþ÷Í 00f¢&ó¾o¾ÿy÷½sλ÷žþd0”²GzuãÅaÀ#~ŒxŒ`Ž~…£Ð6œ6&‹ÿ“óc¢ú6 ¢f‚Œ/á§Xõ­!mÌŒ7¿y}vއG-ÈdFþׄÿ …qqYhØd•5Ç)P ¢tÈŠÜ›ñcsóšWZýúV5¹¶ñ\bcsѰé1þ™ÍO!?¥³@›,ø{ Ñ(ý¦¦ ¤¦šÂkØÚy£–ñD Ÿ29Bº¯˜›Öؽg0ê>Õ–H¼ƒFõwbèÐ ¿]‡BFÀŵ=¯!GB|4ºtމݓ$ü|¸Ž&áÅÅ $%žÅ {вe–„‡¸!úŠ/\]›¡  H‡ ÝMA %¤ê£¤D†µ:K´98:!=-¹0yÒIÔªU‚êh×6ºÞðáÛâÊÕIxÖË®ôzAAéèÛ{fϺмÒÖ6#кµP¨”‡Àýžÿ ={$cÊ ÃàÙÕõ\M%L̆Ûã0ïk%ü…écÑ·Ÿ¬…æÌ#¿@†í?_ÄgŸlD-ÛBÌš3#Fv*ÅSRKrð6¬ÛÆYc‹eïNÃè±M f‡8~îL0ñݸæLªÈ0ÿ­õt`®mgÎä ¶Ý6|¸<UÑ>çÅ«Z¥«W¤¤˜£c—¡d„š·°•¼y%d`ÔÅLN÷|½ò†ŠÍàá¡´#ÔøÓ­.`Ò„«˜>{:wt€££¹„‘'aa÷øQ>{îPtïîÄeIÉÁ<š/¡¡©xaJ(ÏÉÅGŸôF·n®àÜË,ÄÙÓéøðý`„wľýÑų6g£¬ MÆÏ[0h`ŠV&I÷Y"‡·O_¤$·.¥MŒýF6îÄ' `gÆOâ¬ÖA{èÉ@ØXW^Šõ*€sç¬Ñ¥ûÞ®-¬È¹¼DZ§ó¨\ÉäéX¼ð–½3´‰„Ëdex£Æw0uÒ,{Ï&&2i}–É(ä›_ @ãÆ ¥¸™g.p²0Ÿšsa‘|®ÀÕ%ë7táž —pN /â=¼4÷7\¯ƒ'›ÃÜœ¸¹BÀ*\Ï>Â+ó´?¥B™™¦hÙz’’]Ji+áÑ›+ÍC,Y|€´yë¤=êÂ/|ðîW°^šf†vÏø!!±¾ÒžS€ßâËÍýÖ­Ù!Ïù¡ Ð¾Þ«÷YÌ}1 'Oç)4¸+œ_†Ï Äå©>cz6ÌÀ¢%㔦dyœ‚þà}\¾âLõ'ãU7¥ú\–‡­[VcÔÈ3@,…½ûŽÆñ“ÊÆ$r(s‹dì ØÈåsŒNÚ#ÎÿˆÚöÂÛ yèUbè÷–wÄÒwž‡¢¤ÌU!—ßÇÛooÂÒEç1c¦6þ4‚¸r‡ÀWÿð5|GÆbè°q8qÊ 2Nyµîbf–ŒUß­‘ðþ¦âlXW.žåagƒÝ;W£¾G6úœŽ1mÊá xÔç>°wïZa؈9H¿çQÎàW }‡“8ì»Z•Tž]þ[‘Éó5h“É 0~ü.l\‚åvÐIû;KÎi®ÞŸ/Ãç_tÆÿ¾÷Áí¸ºxÊ9Óýâ­á\ ‘žn†wßï…M›½–jWŠ/]tŽKO1nݲæSìCM¨ ²ï[¢a£x¼6?/κ"áB Zðæs8r´—'9Ú<}‹îƒïˆXé±ZÐÂEC$¼„êj·nxÿ½@ôè–,1àÀAwnÄC¹¯4—–@üÑ^tzFØAUbâü÷#OmN°³ÏÄèQ¿âÝe'áüT—³ªi×6ºÞ ."ÔµS§êàÜ…ºèÐ> ÏöH•ÖsõQP §:è„«×j£ã3©•ðû÷M°?ЉIVè핌vmïiÜ{r²7S7ääš`ð DÚš*¤/â}ŒxîêÖ.–²ãæM+ ¢Lh?h냚¶°p'4n”E7‘z™öTíÇÖ»„žÿýj¸y BÓfŽˆ¾˜„ô”¼8ûWIW¾c‰Öm¼¸/Ø!:ꮄ¿:ÿ0 —j*cÑÙ³3ìk[à\X,,M·ÁÏ$ÿzÔ'~›Œ®ÝžæŒ#ôÔ4kâQ¾7$Úƒ<(øñ^ÄÍ9ôT8¼{m—×]iÓÝ´¹’SÇsüÆÈÉ)’ðÁ~‚§§n HÍ´<é $ÑÖ¬y]ÄÜHÇõ߃1}Ú^e’SíÊ xý_]‘’2;©÷ŽËAû¶?ãÍ0yê`¸ÖëCÃG©fŠeCà#žûÄcô¸1èã݉O­jà°[¨™%|â”É4䘛)gT1÷Šm[obÅ`o—Ù/MÅè1-T¸ŒÚK öDâ§ý}Ùú|}]U×VâÇ~ ¥-ñ3÷M‹»"ÃV~ÝgÏú•£ ˆŠÊ‡¢8ßwo¼ÙE'틆kXzññèÐé9ØØ8£iS.;BÏ.]¾O†ÜÁ—ŸÄ¸IÑ Amx¸«í%ÞªåeLžð;^šçÃÛQ’IˆŒÊàRö»„Ï{uÚµ« [ròˆ¸p6B8ÏÉÅç+»·Wá2¤Ý+ä,ÌÄ;KŽâ칺\zÚH¸¹™ÐÍÔx:6mØÏYtWçêST$G·ž>dp“RÚ„p#&IwS°uóA¼à×G'íÂöÑåRÙm¡W„ÑèÚ}§º uqä&ÔóÉÀ¢"ñït,ú÷I¼óÞ`²•z85M}4j¼Q£º#.sƒî+©­BO:^ïYØ%*ñ÷úRkbdHšÂNQÈ øô¿‚zÂØØ•¸¬/ ¥,~9÷EÚjãä©–’a*üG”¸Ÿ|ˆW_Ñmdd˜ åÓc”äRJ›° ¹ŸÉdùTyoýtÒþ Z¶PºCÊz€Ñ0ÚF;@hÛw4Æwß{ãÚµzôù$`úô#t#ÜàÔ/á”—ã‡Õm$; >Þõë+ñiS¯KKJF†¾XÙ;ºÑÛhC/f æÍ;‚!ïHxb¢%>Xñ,ÕØŽtq˜¢cÇËø×GàÙI©Çß¾mMP KŸ—×ynþ'д±RUºX}Ü¿…¶æÒQ,á ÿ}œnóëy`Ûö2ÚêÖMÇØ±GñòKÑô=IZVU´k»€^— ŠÈË7‡…y‘dðT<„i/pK‹B­¸p~˜ÂÒR#N]:LQ± ÷9=˜•76ñ#+h˜™Uv€ ¼°P©eéÂuI#+Ë”š;²óÜ`f’Lõ5uÊî¡ût=-ñËÆ=à!x­ó§O„ Ö…‹N05ID×.w4tá¤$sDD6„BfO]º2®FjŒÇÞˆŒ²Çº càÕ»;\\¬{ë>}îG1wÎ&Qåàðì?0ýú·§wмûMz3µM†bæÃŽo‰O¿˜\J[jJBÅø±[Ð¥K*½¶UÓ®ízzÝ„é?rôj]i˜”ÅÎÏ…sÝcÌÝ9þƒ|Fl wu^ïÚy7Þ{çÂÃòäOýý˯z2d:¸mÀï×òp71ûvïÅäçûé¤}ãú_5¢‚ê׫.]²Â3ž#è~°§%h)¥Š4¸۹ô¥bÅòÓ˜7¿#]–Œ¡ZH7¤Æ›5‹EXè)•åqž'å°hz@d¤:zN£n̬82Wéi§¢F¿©Y ƒ×‡ñïÿøRM£¦Þ´Ù-+Ûi´h÷ínϲіhßÞl¸"ir ‰yˆŒHeð^ ¬ÛV†…±]Mñd¢ ×?9ã¢VV´v$)ò{lWsŠ–°h[)—p¹ˆ¨ð†lWs)2€k²îÆyï/oÅË|¤^?ªxN~¾‚]EÛÊ«pqÎÀ†žR[J5.®-µ­œsááölWÓœíDÛJåC®ÄX²(ß~Û†m)Ÿb¼Â„Y{ʶ–9Ä‹¹”©ñdÆÔ´‰:áì1J[r$m}tÒ¾“Æ©ÓÓï$˜3wÆkd=UkG¥«AèùŽÌŒþv/ÆOœÊµWi%K¹A*ܳK$S;vhí¡žëÖ7ÀŒÙÓÈUÛÛrçOœx„½ã2ØÈƒÕ'5ÎX¼p;.]rÆÖí"eF\[Œª¼¾\VÈ®°ò«îT‘[kÁ ˆoÔŠ‹î"شŵ»Q:i¿± O9¸@Cô2[»j4w$u[J>ý$pæÌmXÉŽYÃ}Gá`0Ÿ8—jÄ?üpÞx-ºÊ%()Ù‚õ³Ø“¡%OUŸÏRPó$ÖüÀæ®YLŸƒÔ4Ñ–²lüÚun øÀjVêØbü„9Œ`1qLÊ[RJªAC ÿø:löoŠ7øI†biOLþ£iÓ0=ò“„ÿsÁì ´‰œ§`ìÝÀ´ûguÒþ¿¯k¥Mï›°è¾à-¦Ÿ÷§–àÀ%%…©!´‚PÉ•šsÏu87³œ µJñÕ«qjWŸœr¸þ1oB( ‘bOLûzÁDñʸۖì˜RGM=\àbÃN¼kNõN;^• „:x‹º|^žŒù–ùÔç5ËšÔ¸°75Ìãz®æïˆa {/І‹z°›·,ae­àK!ò¸iV¶¨isp(Våi&ÝVG{yÚônT÷qMðˆŸ£žTxxX_è\Cá)_èœ'Þ'üPï’¬sêx—xW—² —ÞÇßúô„Ä|fž~à×ÙJ/t^¼°q¢©©*(ò·f_͉/â«ßyïÆ¿ÐYz¥¹?¶üˆ¿ËWd×üŽþ>#ÝUø¹…/]¼M»ÚWš Öˆ·ˆª ‘Y+¾ÅßFü±‡F@(Âù% %ñ­a°hc¬ø?±öÆ‹o#óÿóÕg !+O0^|kXtU1×Èøš1¾âÙ•ëWO·~9üGF3>å„kz<çÿy&£o-#IEND®B`‚golly-3.3-src/gui-android/Golly/app/src/main/res/layout/0000755000175000017500000000000013543257427020200 500000000000000golly-3.3-src/gui-android/Golly/app/src/main/res/layout/state_layout.xml0000644000175000017500000000202112651666400023344 00000000000000 golly-3.3-src/gui-android/Golly/app/src/main/res/layout/settings_layout.xml0000644000175000017500000000777212651666400024106 00000000000000

"; int rulecount = 0; File[] files = dir.listFiles(); if (files != null) { Arrays.sort(files); // sort into alphabetical order for (File file : files) { if (file.isDirectory()) { // ignore directory } else { String filename = file.getName(); if (filename.endsWith(".rule")) { if (candelete) { // allow user to delete .rule file htmldata += "DELETE   "; // allow user to edit .rule file htmldata += "EDIT   "; } else { // allow user to read supplied .rule file htmldata += "READ   "; } // use "open:" link rather than "rule:" link htmldata += ""; htmldata += filename.substring(0, filename.length() - 5); // strip off .rule htmldata += "
"; rulecount++; } } } } if (rulecount == 0) htmldata += "
None."; return htmldata; } // ----------------------------------------------------------------------------- private void showAlgoHelp() { BaseApp baseapp = (BaseApp)getApplicationContext(); String algoname = nativeGetAlgoName(algoindex); if (algoname.equals("RuleLoader")) { // create html data with links to the user's .rule files and the supplied .rule files File userrules = new File(baseapp.userdir, "Rules"); File rulesdir = new File(baseapp.supplieddir, "Rules"); String htmldata = ""; htmldata += ""; htmldata += "